summaryrefslogtreecommitdiffstats
path: root/inc/database.inc.php
blob: d59927954a9cd6311be1d20575832976cf154a0f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
<?php

/**
 * Handle communication with the database
 * This is a very thin layer between you and PDO.
 */
class Database
{

	/**
	 * @var \PDO Database handle
	 */
	private static $dbh = false;
	/*
	 * @var \PDOStatement[]
	 */
	private static $statements = array();
	private static $returnErrors;
	private static $lastError = false;
	private static $explainList = array();
	private static $queryCount = 0;
	private static $queryTime = 0;

	/**
	 * Connect to the DB if not already connected.
	 */
	public static function init($returnErrors = false)
	{
		if (self::$dbh !== false)
			return true;
		self::$returnErrors = $returnErrors;
		try {
			if (CONFIG_SQL_FORCE_UTF8) {
				self::$dbh = new PDO(CONFIG_SQL_DSN, CONFIG_SQL_USER, CONFIG_SQL_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
			} else {
				self::$dbh = new PDO(CONFIG_SQL_DSN, CONFIG_SQL_USER, CONFIG_SQL_PASS);
			}
		} catch (PDOException $e) {
			if (self::$returnErrors)
				return false;
			Util::traceError('Connecting to the local database failed: ' . $e->getMessage());
		}
		if (CONFIG_DEBUG) {
			register_shutdown_function(function() {
				self::examineLoggedQueries();
			});
		}
		return true;
	}

	/**
	 * If you just need the first row of a query you can use this.
	 *
	 * @return array|boolean Associative array representing row, or false if no row matches the query
	 */
	public static function queryFirst($query, $args = array(), $ignoreError = null)
	{
		$res = self::simpleQuery($query, $args, $ignoreError);
		if ($res === false)
			return false;
		return $res->fetch(PDO::FETCH_ASSOC);
	}

	/**
	 * If you need all rows for a query as plain array you can use this.
	 * Don't use this if you want to do further processing of the data, to save some
	 * memory.
	 *
	 * @return array|bool List of associative arrays representing rows, or false on error
	 */
	public static function queryAll($query, $args = array(), $ignoreError = null)
	{
		$res = self::simpleQuery($query, $args, $ignoreError);
		if ($res === false)
			return false;
		return $res->fetchAll(PDO::FETCH_ASSOC);
	}

	/**
	 * Execute the given query and return the number of rows affected.
	 * Mostly useful for UPDATEs or INSERTs
	 *
	 * @param string $query Query to run
	 * @param array $args Arguments to query
	 * @param boolean $ignoreError Ignore query errors and just return false
	 * @return int|boolean Number of rows affected, or false on error
	 */
	public static function exec($query, $args = array(), $ignoreError = null)
	{
		$res = self::simpleQuery($query, $args, $ignoreError);
		if ($res === false)
			return false;
		return $res->rowCount();
	}

	/**
	 * Get id (promary key) of last row inserted.
	 *
	 * @return int the id
	 */
	public static function lastInsertId()
	{
		return self::$dbh->lastInsertId();
	}

	/**
	 * @return string|bool return last error returned by query
	 */
	public static function lastError()
	{
		return self::$lastError;
	}

	/**
	 * Execute the given query and return the corresponding PDOStatement object
	 * Note that this will re-use PDOStatements, so if you run the same
	 * query again with different params, do not rely on the first PDOStatement
	 * still being valid. If you need to do something fancy, use Database::prepare
	 *
	 * @return \PDOStatement|false The query result object
	 */
	public static function simpleQuery($query, $args = array(), $ignoreError = null)
	{
		self::init();
		if (CONFIG_DEBUG && !isset(self::$explainList[$query]) && preg_match('/^\s*SELECT/is', $query)) {
			self::$explainList[$query] = [$args];
		}
		// Support passing nested arrays for IN statements, automagically refactor
		$oquery = $query;
		self::handleArrayArgument($query, $args);
		try {
			if (!isset(self::$statements[$query])) {
				self::$statements[$query] = self::$dbh->prepare($query);
			} else {
				//self::$statements[$query]->closeCursor();
			}
			$start = microtime(true);
			if (self::$statements[$query]->execute($args) === false) {
				self::$lastError = implode("\n", self::$statements[$query]->errorInfo());
				if ($ignoreError === true || ($ignoreError === null && self::$returnErrors))
					return false;
				Util::traceError("Database Error: \n" . self::$lastError);
			}
			if (CONFIG_DEBUG) {
				$duration = microtime(true) - $start;
				self::$queryTime += $duration;
				$duration = round($duration, 3);
				if (isset(self::$explainList[$oquery])) {
					self::$explainList[$oquery][] = $duration;
				} elseif ($duration > 0.1) {
					error_log('SLOW ****** ' . $duration . "s *********\n" . $query);
				}
				self::$queryCount += 1;
			}
			return self::$statements[$query];
		} catch (Exception $e) {
			self::$lastError = '(' . $e->getCode() . ') ' . $e->getMessage();
			if ($ignoreError === true || ($ignoreError === null && self::$returnErrors))
				return false;
			Util::traceError("Database Error: \n" . self::$lastError);
		}
		return false;
	}

	public static function examineLoggedQueries()
	{
		foreach (self::$explainList as $q => $a) {
			self::explainQuery($q, $a);
		}
	}

	private static function explainQuery($query, $data)
	{
		$args = array_shift($data);
		$slow = false;
		$veryslow = false;
		foreach ($data as &$ts) {
			if ($ts > 0.004) {
				$slow = true;
				if ($ts > 0.015) {
					$ts = "[$ts]";
					$veryslow = true;
				}
			}
		}
		if (!$slow)
			return;
		unset($ts);
		$res = self::simpleQuery('EXPLAIN ' . $query, $args, true);
		if ($res === false)
			return;
		$rows = $res->fetchAll(PDO::FETCH_ASSOC);
		if (empty($rows))
			return;
		$log = $veryslow;
		$lens = array();
		foreach (array_keys($rows[0]) as $key) {
			$lens[$key] = strlen($key);
		}
		foreach ($rows as $row) {
			if (!$log && $row['rows'] > 20 && preg_match('/filesort|temporary/i', $row['Extra'])) {
				$log = true;
			}
			foreach ($row as $key => $col) {
				$l = strlen($col);
				if ($l > $lens[$key]) {
					$lens[$key] = $l;
				}
			}
		}
		if (!$log)
			return;
		error_log('Possible slow query: ' . $query);
		error_log('Times: ' . implode(', ', $data));
		$border = $head = '';
		foreach ($lens as $key => $len) {
			$border .= '+' . str_repeat('-', $len + 2);
			$head .= '| ' . str_pad($key, $len) . ' ';
		}
		$border .= '+';
		$head .= '|';
		error_log("\n" . $border . "\n" . $head . "\n" . $border);
		foreach ($rows as $row) {
			$line = '';
			foreach ($lens as $key => $len) {
				$line .= '| '. str_pad($row[$key], $len) . ' ';
			}
			error_log($line . "|");
		}
		error_log($border);
	}

	/**
	 * Convert nested array argument to multiple arguments.
	 * If you have:
	 * $query = 'SELECT * FROM tbl WHERE bcol = :bool AND col IN (:list)
	 * $args = ( 'bool' => 1, 'list' => ('foo', 'bar') )
	 * it results in:
	 * $query = '...WHERE bcol = :bool AND col IN (:list_0, :list_1)
	 * $args = ( 'bool' => 1, 'list_0' => 'foo', 'list_1' => 'bar' )
	 *
	 * @param string $query sql query string
	 * @param array $args query arguments
	 */
	private static function handleArrayArgument(&$query, &$args)
	{
		$again = false;
		foreach (array_keys($args) as $key) {
			if (is_numeric($key) || $key === '?')
				continue;
			if (is_array($args[$key])) {
				if (empty($args[$key])) {
					// Empty list - what to do? We try to generate a query string that will not yield any result
					$args[$key] = 'asdf' . mt_rand(0,PHP_INT_MAX) . mt_rand(0,PHP_INT_MAX)
							. mt_rand(0,PHP_INT_MAX) . '@' . microtime(true);
					continue;
				}
				$newkey = $key;
				if ($newkey{0} !== ':') {
					$newkey = ":$newkey";
				}
				$new = array();
				foreach ($args[$key] as $subIndex => $sub) {
					if (is_array($sub)) {
						$new[] = '(' . $newkey . '_' . $subIndex . ')';
						$again = true;
					} else {
						$new[] = $newkey . '_' . $subIndex;
					}
					$args[$newkey . '_' . $subIndex] = $sub;
				}
				unset($args[$key]);
				$new = implode(',', $new);
				$query = preg_replace('/' . $newkey . '\b/', $new, $query);
			}
		}
		if ($again) {
			self::handleArrayArgument($query, $args);
		}
	}

	/**
	 * Simply calls PDO::prepare and returns the PDOStatement.
	 * You must call PDOStatement::execute manually on it.
	 */
	public static function prepare($query)
	{
		self::init();
		self::$queryCount += 1; // Cannot know actual count
		return self::$dbh->prepare($query);
	}

	/**
	 * Insert row into table, returning the generated key.
	 * This requires the table to have an AUTO_INCREMENT column and
	 * usually requires the given $uniqueValues to span across a UNIQUE index.
	 * The code first tries to SELECT the key for the given values without
	 * inserting first. This means this function is best used for cases
	 * where you expect that the entry already exists in the table, so
	 * only one SELECT will run. For all the entries that do not exist,
	 * an INSERT or INSERT IGNORE is run, depending on whether $additionalValues
	 * is empty or not. Another reason we don't run the INSERT (IGNORE) first
	 * is that it will increase the AUTO_INCREMENT value on InnoDB, even when
	 * no INSERT took place. So if you expect a lot of collisions you might
	 * use this function to prevent your A_I value from counting up too
	 * quickly.
	 * Other than that, this is just a dumb version of running INSERT and then
	 * getting the LAST_INSERT_ID(), or doing a query for the existing ID in
	 * case of a key collision.
	 *
	 * @param string $table table to insert into
	 * @param string $aiKey name of the AUTO_INCREMENT column
	 * @param array $uniqueValues assoc array containing columnName => value mapping
	 * @param array $additionalValues assoc array containing columnName => value mapping
	 * @return int[] list of AUTO_INCREMENT values matching the list of $values
	 */
	public static function insertIgnore($table, $aiKey, $uniqueValues, $additionalValues = false)
	{
		// Sanity checks
		if (array_key_exists($aiKey, $uniqueValues)) {
			Util::traceError("$aiKey must not be in \$uniqueValues");
		}
		if (is_array($additionalValues) && array_key_exists($aiKey, $additionalValues)) {
			Util::traceError("$aiKey must not be in \$additionalValues");
		}
		// Simple SELECT first
		$selectSql = 'SELECT ' . $aiKey . ' FROM ' . $table . ' WHERE 1';
		foreach ($uniqueValues as $key => $value) {
			$selectSql .= ' AND ' . $key . ' = :' . $key;
		}
		$selectSql .= ' LIMIT 1';
		$res = self::queryFirst($selectSql, $uniqueValues);
		if ($res !== false) {
			// Exists
			if (!empty($additionalValues)) {
				// Simulate ON DUPLICATE KEY UPDATE ...
				$updateSql = 'UPDATE ' . $table . ' SET ';
				$first = true;
				foreach ($additionalValues as $key => $value) {
					if ($first) {
						$first = false;
					} else {
						$updateSql .= ', ';
					}
					$updateSql .= $key . ' = :' . $key;
				}
				$updateSql .= ' WHERE ' . $aiKey . ' = :' . $aiKey;
				$additionalValues[$aiKey] = $res[$aiKey];
				Database::exec($updateSql, $additionalValues);
			}
			return $res[$aiKey];
		}
		// Does not exist:
		if (empty($additionalValues)) {
			$combined =& $uniqueValues;
		} else {
			$combined = $uniqueValues + $additionalValues;
		}
		// Aight, try INSERT or INSERT IGNORE
		$insertSql = 'INTO ' . $table . ' (' . implode(', ', array_keys($combined))
			. ') VALUES (:' . implode(', :', array_keys($combined)) . ')';
		if (empty($additionalValues)) {
			// Simple INSERT IGNORE
			$insertSql = 'INSERT IGNORE ' . $insertSql;
		} else {
			// INSERT ... ON DUPLICATE (in case we have a race)
			$insertSql = 'INSERT ' . $insertSql . ' ON DUPLICATE KEY UPDATE ';
			$first = true;
			foreach ($additionalValues as $key => $value) {
				if ($first) {
					$first = false;
				} else {
					$insertSql .= ', ';
				}
				$insertSql .= $key . ' =  VALUES(' . $key . ')';
			}
		}
		self::exec($insertSql, $combined);
		// Insert done, retrieve key again
		$res = self::queryFirst($selectSql, $uniqueValues);
		if ($res === false) {
			Util::traceError('Could not find value in table ' . $table . ' that was just inserted');
		}
		return $res[$aiKey];
	}

	public static function getQueryCount()
	{
		return self::$queryCount;
	}

	public static function getQueryTime()
	{
		return self::$queryTime;
	}

}
r>-rw-r--r--OSX/Sparkle.framework/Versions/A/Resources/tr.lproj/Sparkle.stringsbin0 -> 9284 bytes-rw-r--r--OSX/Sparkle.framework/Versions/A/Resources/uk.lproj/SUAutomaticUpdateAlert.nibbin0 -> 7233 bytes-rw-r--r--OSX/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdateAlert.nibbin0 -> 10624 bytes-rw-r--r--OSX/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdatePermissionPrompt.nibbin0 -> 12774 bytes-rw-r--r--OSX/Sparkle.framework/Versions/A/Resources/uk.lproj/Sparkle.stringsbin0 -> 8644 bytes-rw-r--r--OSX/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUAutomaticUpdateAlert.nibbin0 -> 6938 bytes-rw-r--r--OSX/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdateAlert.nibbin0 -> 10244 bytes-rw-r--r--OSX/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdatePermissionPrompt.nibbin0 -> 12334 bytes-rw-r--r--OSX/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/Sparkle.stringsbin0 -> 6908 bytes-rw-r--r--OSX/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUAutomaticUpdateAlert.nibbin0 -> 6891 bytes-rw-r--r--OSX/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdateAlert.nibbin0 -> 10040 bytes-rw-r--r--OSX/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdatePermissionPrompt.nibbin0 -> 12315 bytes-rw-r--r--OSX/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/Sparkle.stringsbin0 -> 6642 bytes-rwxr-xr-xOSX/Sparkle.framework/Versions/A/Sparklebin0 -> 403600 bytesl---------OSX/Sparkle.framework/Versions/Current1
-rw-r--r--OSX/Updater.h39
-rw-r--r--OSX/Updater.m176
-rw-r--r--OSX/Updater.plist50
-rw-r--r--OSX/Updater.xib344
-rw-r--r--OSX/XScreenSaver.icnsbin0 -> 77001 bytes-rw-r--r--OSX/XScreenSaver.plist30
-rw-r--r--OSX/XScreenSaverAndroidWebloc.icnsbin0 -> 87465 bytes-rw-r--r--OSX/XScreenSaverConfigSheet.h79
-rw-r--r--OSX/XScreenSaverConfigSheet.m3710
-rw-r--r--OSX/XScreenSaverDMG.icnsbin0 -> 110173 bytes-rw-r--r--OSX/XScreenSaverFolder.icnsbin0 -> 327214 bytes-rw-r--r--OSX/XScreenSaverGLView.h39
-rw-r--r--OSX/XScreenSaverGLView.m433
-rw-r--r--OSX/XScreenSaverPkg.icnsbin0 -> 256741 bytes-rw-r--r--OSX/XScreenSaverSubclass.m33
-rw-r--r--OSX/XScreenSaverView.h182
-rw-r--r--OSX/XScreenSaverView.m3059
-rw-r--r--OSX/XScreenSaverWebloc.icnsbin0 -> 88285 bytes-rw-r--r--OSX/YearlReg.ttfbin0 -> 44984 bytes-rw-r--r--OSX/apple2-app.xml35
-rw-r--r--OSX/bindist-DS_Storebin0 -> 12292 bytes-rw-r--r--OSX/bindist.rtf78
-rw-r--r--OSX/bindist.webloc8
-rw-r--r--OSX/bindist2.webloc8
-rwxr-xr-xOSX/build-fntable.pl189
-rw-r--r--OSX/enable_gc.c368
-rwxr-xr-xOSX/fuzztest.sh54
-rw-r--r--OSX/grabclient-ios.m95
-rw-r--r--OSX/grabclient-osx.m464
-rw-r--r--OSX/iSaverRunner.ai3593
-rw-r--r--OSX/iSaverRunner.plist71
-rw-r--r--OSX/iSaverRunner.xib36
-rw-r--r--OSX/iSaverRunner1024.pngbin0 -> 46983 bytes-rw-r--r--OSX/iSaverRunner57t.pngbin0 -> 1763 bytes-rwxr-xr-xOSX/icmp-warning.pl69
-rw-r--r--OSX/installer.pngbin0 -> 26216 bytes-rw-r--r--OSX/installer.rtf27
-rwxr-xr-xOSX/installer.sh141
-rw-r--r--OSX/installer.xml29
-rw-r--r--OSX/ios-function-table.m478
-rw-r--r--OSX/luximr.ttfbin0 -> 71784 bytes-rw-r--r--OSX/main.m29
-rw-r--r--OSX/phosphor-app.xml37
-rwxr-xr-xOSX/seticon.pl110
-rw-r--r--OSX/settings.pngbin0 -> 3680 bytes-rw-r--r--OSX/settings@2x.pngbin0 -> 4181 bytes-rw-r--r--OSX/settings@3x.pngbin0 -> 5617 bytes-rwxr-xr-xOSX/sign_update.rb7
-rw-r--r--OSX/sparkle_dsa_pub.pem20
-rw-r--r--OSX/stop.pngbin0 -> 470 bytes-rw-r--r--OSX/stop@2x.pngbin0 -> 859 bytes-rw-r--r--OSX/stop@3x.pngbin0 -> 1701 bytes-rw-r--r--OSX/textclient-ios.m129
-rwxr-xr-xOSX/update-info-plist.pl508
-rwxr-xr-xOSX/updates.pl219
-rw-r--r--OSX/updates.xml66
-rw-r--r--OSX/xscreensaver.xcconfig11
-rw-r--r--OSX/xscreensaver.xcodeproj/project.pbxproj40713
-rw-r--r--OSX/xscreensaver_Prefix.pch33
-rw-r--r--README1615
-rw-r--r--README.VMS57
-rw-r--r--README.hacking198
-rw-r--r--aclocal.m4717
-rw-r--r--android/Makefile418
-rw-r--r--android/README189
-rw-r--r--android/android.iml19
-rw-r--r--android/build.gradle30
-rw-r--r--android/gradle/wrapper/gradle-wrapper.jarbin0 -> 53636 bytes-rw-r--r--android/gradle/wrapper/gradle-wrapper.properties6
-rwxr-xr-xandroid/gradlew160
-rw-r--r--android/gradlew.bat90
-rw-r--r--android/local.properties11
-rw-r--r--android/screenhack-android.c209
-rw-r--r--android/settings.gradle1
-rw-r--r--android/xscreensaver/.idea/caches/build_file_checksums.serbin0 -> 521 bytes-rw-r--r--android/xscreensaver/.idea/codeStyles/Project.xml29
-rw-r--r--android/xscreensaver/.idea/compiler.xml22
-rw-r--r--android/xscreensaver/.idea/gradle.xml19
-rw-r--r--android/xscreensaver/.idea/libraries/Gradle__android_arch_core_common_1_1_0_jar.xml11
-rw-r--r--android/xscreensaver/.idea/libraries/Gradle__android_arch_core_runtime_1_1_0.xml12
-rw-r--r--android/xscreensaver/.idea/libraries/Gradle__android_arch_lifecycle_common_1_1_0_jar.xml11
-rw-r--r--android/xscreensaver/.idea/libraries/Gradle__android_arch_lifecycle_livedata_core_1_1_0.xml12
-rw-r--r--android/xscreensaver/.idea/libraries/Gradle__android_arch_lifecycle_runtime_1_1_0.xml12
-rw-r--r--android/xscreensaver/.idea/libraries/Gradle__android_arch_lifecycle_viewmodel_1_1_0.xml12
-rw-r--r--android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_annotations_27_1_1_jar.xml11
-rw-r--r--android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_compat_27_1_1.xml12
-rw-r--r--android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_core_ui_27_1_1.xml12
-rw-r--r--android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_core_utils_27_1_1.xml12
-rw-r--r--android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_fragment_27_1_1.xml12
-rw-r--r--android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_media_compat_27_1_1.xml12
-rw-r--r--android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_v4_27_1_1.xml12
-rw-r--r--android/xscreensaver/.idea/misc.xml34
-rw-r--r--android/xscreensaver/.idea/modules.xml9
-rw-r--r--android/xscreensaver/.idea/runConfigurations.xml12
-rw-r--r--android/xscreensaver/.idea/workspace.xml2227
l---------android/xscreensaver/assets/fonts/OCRAStd.otf1
l---------android/xscreensaver/assets/fonts/PxPlus_IBM_VGA8.ttf1
l---------android/xscreensaver/assets/fonts/YearlReg.ttf1
-rw-r--r--android/xscreensaver/build.gradle109
-rw-r--r--android/xscreensaver/build.xml92
-rw-r--r--android/xscreensaver/gradle/wrapper/gradle-wrapper.jarbin0 -> 53636 bytes-rw-r--r--android/xscreensaver/gradle/wrapper/gradle-wrapper.properties6
-rw-r--r--android/xscreensaver/gradlew160
-rw-r--r--android/xscreensaver/gradlew.bat90
-rw-r--r--android/xscreensaver/jni/Android.mk199
-rw-r--r--android/xscreensaver/jni/Application.mk7
-rw-r--r--android/xscreensaver/local.properties11
-rw-r--r--android/xscreensaver/project.properties15
-rw-r--r--android/xscreensaver/res/drawable-ldpi/icon.pngbin0 -> 2134 bytes-rw-r--r--android/xscreensaver/res/drawable-mdpi/icon.pngbin0 -> 3039 bytes-rw-r--r--android/xscreensaver/res/drawable/thumbnail.pngbin0 -> 69607 bytes-rw-r--r--android/xscreensaver/res/layout-land/activity_xscreensaver.xml59
-rw-r--r--android/xscreensaver/res/layout/activity_tv_xscreensaver.xml41
-rw-r--r--android/xscreensaver/res/layout/activity_xscreensaver.xml44
-rw-r--r--android/xscreensaver/res/layout/main.xml7
-rw-r--r--android/xscreensaver/res/layout/preference_blurb.xml45
-rw-r--r--android/xscreensaver/res/layout/slider_preference.xml60
-rw-r--r--android/xscreensaver/src/org/jwz/xscreensaver/Activity.java169
-rw-r--r--android/xscreensaver/src/org/jwz/xscreensaver/App.java22
-rw-r--r--android/xscreensaver/src/org/jwz/xscreensaver/Daydream.java269
-rw-r--r--android/xscreensaver/src/org/jwz/xscreensaver/Settings.java179
-rw-r--r--android/xscreensaver/src/org/jwz/xscreensaver/SliderPreference.java160
-rw-r--r--android/xscreensaver/src/org/jwz/xscreensaver/TTFAnalyzer.java153
-rw-r--r--android/xscreensaver/src/org/jwz/xscreensaver/TVActivity.java50
-rw-r--r--android/xscreensaver/src/org/jwz/xscreensaver/Wallpaper.java128
-rw-r--r--android/xscreensaver/src/org/jwz/xscreensaver/jwxyz.java1115
-rw-r--r--android/xscreensaver/xscreensaver.iml101
-rw-r--r--ax_pthread.m4332
-rwxr-xr-xconfig.guess1476
-rw-r--r--config.h-vms284
-rw-r--r--config.h.in475
-rw-r--r--config.sub1801
-rwxr-xr-xconfigure18009
-rw-r--r--configure.in4709
-rw-r--r--driver/.gdbinit27
-rw-r--r--driver/Makefile.in1023
-rw-r--r--driver/README6
-rw-r--r--driver/XScreenSaver-Xm.ad126
-rw-r--r--driver/XScreenSaver.ad.in556
-rw-r--r--driver/XScreenSaver_Xm_ad.h108
-rw-r--r--driver/XScreenSaver_ad.h416
-rw-r--r--driver/auth.h54
-rw-r--r--driver/compile_axp.com15
-rw-r--r--driver/compile_decc.com15
-rw-r--r--driver/demo-Gtk-conf.c1998
-rw-r--r--driver/demo-Gtk-conf.h31
-rw-r--r--driver/demo-Gtk.c5337
-rw-r--r--driver/demo-Xm-widgets.c907
-rw-r--r--driver/demo-Xm.c1875
-rw-r--r--driver/dpms.c304
-rw-r--r--driver/exec.c300
-rw-r--r--driver/exec.h21
-rw-r--r--driver/link_axp.com15
-rw-r--r--driver/link_decc.com15
-rw-r--r--driver/lock.c2259
-rw-r--r--driver/mlstring.c229
-rw-r--r--driver/mlstring.h57
-rw-r--r--driver/passwd-helper.c162
-rw-r--r--driver/passwd-kerberos.c251
-rw-r--r--driver/passwd-pam.c526
-rw-r--r--driver/passwd-pwent.c312
-rw-r--r--driver/passwd.c339
-rw-r--r--driver/pdf2jpeg.m152
-rw-r--r--driver/pdf2jpeg.man43
-rw-r--r--driver/prefs.c1770
-rw-r--r--driver/prefs.h37
-rw-r--r--driver/remote.c595
-rw-r--r--driver/remote.h24
-rw-r--r--driver/screens.c1094
-rw-r--r--driver/screensaver-properties.desktop.in8
-rw-r--r--driver/setuid.c361
-rw-r--r--driver/splash.c917
-rw-r--r--driver/stderr.c560
-rw-r--r--driver/subprocs.c1423
-rw-r--r--driver/test-apm.c101
-rw-r--r--driver/test-fade.c123
-rw-r--r--driver/test-grab.c89
-rw-r--r--driver/test-mlstring.c312
-rw-r--r--driver/test-passwd.c306
-rw-r--r--driver/test-randr.c339
-rw-r--r--driver/test-screens.c208
-rw-r--r--driver/test-uid.c209
-rw-r--r--driver/test-vp.c213
-rw-r--r--driver/test-xdpms.c179
-rw-r--r--driver/test-xinerama.c112
-rw-r--r--driver/timers.c1788
-rw-r--r--driver/types.h442
-rw-r--r--driver/vms-getpwnam.c129
-rw-r--r--driver/vms-hpwd.c75
-rw-r--r--driver/vms-pwd.h48
-rw-r--r--driver/vms-validate.c75
-rw-r--r--driver/vms_axp.opt5
-rw-r--r--driver/vms_axp_12.opt5
-rw-r--r--driver/vms_decc.opt5
-rw-r--r--driver/vms_decc_12.opt5
-rw-r--r--driver/windows.c2003
-rw-r--r--driver/xdpyinfo.c1098
-rw-r--r--driver/xscreensaver-command.c450
-rw-r--r--driver/xscreensaver-command.man263
-rw-r--r--driver/xscreensaver-demo.glade2.in3136
-rw-r--r--driver/xscreensaver-demo.glade2p19
-rw-r--r--driver/xscreensaver-demo.man402
-rwxr-xr-xdriver/xscreensaver-getimage-desktop174
-rw-r--r--driver/xscreensaver-getimage-desktop.man55
-rwxr-xr-xdriver/xscreensaver-getimage-file1316
-rw-r--r--driver/xscreensaver-getimage-file.man66
-rwxr-xr-xdriver/xscreensaver-getimage-video144
-rw-r--r--driver/xscreensaver-getimage-video.man51
-rw-r--r--driver/xscreensaver-getimage.c2000
-rw-r--r--driver/xscreensaver-getimage.man73
-rwxr-xr-xdriver/xscreensaver-text884
-rw-r--r--driver/xscreensaver-text.man85
-rw-r--r--driver/xscreensaver.c2463
-rw-r--r--driver/xscreensaver.h210
-rw-r--r--driver/xscreensaver.man1035
-rw-r--r--driver/xscreensaver.pam.in13
-rw-r--r--driver/xset.c389
-rw-r--r--hacks/.gdbinit12
-rw-r--r--hacks/Makefile.in3263
-rw-r--r--hacks/README6
-rw-r--r--hacks/abstractile.c1605
-rw-r--r--hacks/abstractile.man52
-rw-r--r--hacks/analogtv.c2431
-rw-r--r--hacks/analogtv.h338
-rw-r--r--hacks/anemone.c448
-rw-r--r--hacks/anemone.man74
-rw-r--r--hacks/anemotaxis.c755
-rw-r--r--hacks/anemotaxis.man78
-rw-r--r--hacks/ant.c1350
-rw-r--r--hacks/ant.man96
-rw-r--r--hacks/apollonian.c810
-rw-r--r--hacks/apollonian.man70
-rw-r--r--hacks/apple2-main.c1913
-rw-r--r--hacks/apple2.c885
-rw-r--r--hacks/apple2.h121
-rw-r--r--hacks/apple2.man206
-rw-r--r--hacks/asm6502.c2275
-rw-r--r--hacks/asm6502.h181
-rw-r--r--hacks/attraction.c1109
-rw-r--r--hacks/attraction.man214
-rw-r--r--hacks/automata.h64
-rw-r--r--hacks/barcode.c1995
-rw-r--r--hacks/barcode.man61
-rw-r--r--hacks/binaryring.c587
-rw-r--r--hacks/binaryring.man88
-rw-r--r--hacks/blaster.c1191
-rw-r--r--hacks/blaster.man65
-rw-r--r--hacks/blitspin.c451
-rw-r--r--hacks/blitspin.man96
-rw-r--r--hacks/bouboule.c858
-rw-r--r--hacks/bouboule.man80
-rw-r--r--hacks/boxfit.c561
-rw-r--r--hacks/boxfit.man102
-rw-r--r--hacks/braid.c443
-rw-r--r--hacks/braid.man69
-rw-r--r--hacks/bsod.c6008
-rw-r--r--hacks/bsod.man149
-rw-r--r--hacks/bubbles-default.c154
-rw-r--r--hacks/bubbles.c1437
-rw-r--r--hacks/bubbles.h208
-rw-r--r--hacks/bubbles.man140
-rw-r--r--hacks/bumps.c700
-rw-r--r--hacks/bumps.man80
-rw-r--r--hacks/ccurve.c866
-rw-r--r--hacks/ccurve.man60
-rw-r--r--hacks/celtic.c1131
-rw-r--r--hacks/celtic.man64
-rwxr-xr-xhacks/check-configs.pl1243
-rw-r--r--hacks/cloudlife.c428
-rw-r--r--hacks/cloudlife.man87
-rw-r--r--hacks/compass.c986
-rw-r--r--hacks/compass.man57
-rw-r--r--hacks/compile_axp.com156
-rw-r--r--hacks/compile_decc.com156
-rw-r--r--hacks/config/README262
-rw-r--r--hacks/config/abstractile.xml36
-rw-r--r--hacks/config/anemone.xml61
-rw-r--r--hacks/config/anemotaxis.xml39
-rw-r--r--hacks/config/ant.xml74
-rw-r--r--hacks/config/antinspect.xml25
-rw-r--r--hacks/config/antmaze.xml23
-rw-r--r--hacks/config/antspotlight.xml25
-rw-r--r--hacks/config/apollonian.xml42
-rw-r--r--hacks/config/apple2.xml65
-rw-r--r--hacks/config/atlantis.xml50
-rw-r--r--hacks/config/attraction.xml87
-rw-r--r--hacks/config/atunnel.xml26
-rw-r--r--hacks/config/barcode.xml35
-rw-r--r--hacks/config/binaryring.xml31
-rw-r--r--hacks/config/blaster.xml63
-rw-r--r--hacks/config/blinkbox.xml35
-rw-r--r--hacks/config/blitspin.xml46
-rw-r--r--hacks/config/blocktube.xml33
-rw-r--r--hacks/config/boing.xml51
-rw-r--r--hacks/config/bouboule.xml33
-rw-r--r--hacks/config/bouncingcow.xml32
-rw-r--r--hacks/config/boxed.xml58
-rw-r--r--hacks/config/boxfit.xml65
-rw-r--r--hacks/config/braid.xml39
-rw-r--r--hacks/config/bsod.xml105
-rw-r--r--hacks/config/bubble3d.xml30
-rw-r--r--hacks/config/bubbles.xml42
-rw-r--r--hacks/config/bumps.xml36
-rw-r--r--hacks/config/cage.xml27
-rw-r--r--hacks/config/carousel.xml57
-rw-r--r--hacks/config/ccurve.xml32
-rw-r--r--hacks/config/celtic.xml32
-rw-r--r--hacks/config/circuit.xml37
-rw-r--r--hacks/config/cityflow.xml55
-rw-r--r--hacks/config/cloudlife.xml41
-rw-r--r--hacks/config/companioncube.xml56
-rw-r--r--hacks/config/compass.xml24
-rw-r--r--hacks/config/coral.xml36
-rw-r--r--hacks/config/crackberg.xml52
-rw-r--r--hacks/config/critical.xml31
-rw-r--r--hacks/config/crumbler.xml49
-rw-r--r--hacks/config/crystal.xml48
-rw-r--r--hacks/config/cube21.xml77
-rw-r--r--hacks/config/cubenetic.xml67
-rw-r--r--hacks/config/cubestack.xml44
-rw-r--r--hacks/config/cubestorm.xml53
-rw-r--r--hacks/config/cubetwist.xml46
-rw-r--r--hacks/config/cubicgrid.xml31
-rw-r--r--hacks/config/cwaves.xml31
-rw-r--r--hacks/config/cynosure.xml32
-rw-r--r--hacks/config/dangerball.xml37
-rw-r--r--hacks/config/decayscreen.xml48
-rw-r--r--hacks/config/deco.xml45
-rw-r--r--hacks/config/deluxe.xml39
-rw-r--r--hacks/config/demon.xml41
-rw-r--r--hacks/config/discoball.xml37
-rw-r--r--hacks/config/discrete.xml32
-rw-r--r--hacks/config/distort.xml53
-rw-r--r--hacks/config/dnalogo.xml50
-rw-r--r--hacks/config/drift.xml31
-rw-r--r--hacks/config/dymaxionmap.xml79
-rw-r--r--hacks/config/endgame.xml29
-rw-r--r--hacks/config/energystream.xml26
-rw-r--r--hacks/config/engine.xml44
-rw-r--r--hacks/config/epicycle.xml57
-rw-r--r--hacks/config/eruption.xml53
-rw-r--r--hacks/config/esper.xml46
-rw-r--r--hacks/config/euler2d.xml53
-rw-r--r--hacks/config/extrusion.xml44
-rw-r--r--hacks/config/fadeplot.xml35
-rw-r--r--hacks/config/fiberlamp.xml31
-rw-r--r--hacks/config/filmleader.xml42
-rw-r--r--hacks/config/fireworkx.xml30
-rw-r--r--hacks/config/flag.xml41
-rw-r--r--hacks/config/flame.xml39
-rw-r--r--hacks/config/flipflop.xml52
-rw-r--r--hacks/config/flipscreen3d.xml27
-rw-r--r--hacks/config/fliptext.xml55
-rw-r--r--hacks/config/flow.xml60
-rw-r--r--hacks/config/fluidballs.xml55
-rw-r--r--hacks/config/flurry.xml29
-rw-r--r--hacks/config/flyingtoasters.xml42
-rw-r--r--hacks/config/fontglide.xml54
-rw-r--r--hacks/config/forest.xml30
-rw-r--r--hacks/config/fuzzyflakes.xml66
-rw-r--r--hacks/config/galaxy.xml36
-rw-r--r--hacks/config/gears.xml39
-rw-r--r--hacks/config/geodesic.xml61
-rw-r--r--hacks/config/geodesicgears.xml41
-rw-r--r--hacks/config/gflux.xml61
-rw-r--r--hacks/config/glblur.xml46
-rw-r--r--hacks/config/glcells.xml64
-rw-r--r--hacks/config/gleidescope.xml41
-rw-r--r--hacks/config/glforestfire.xml46
-rw-r--r--hacks/config/glhanoi.xml54
-rw-r--r--hacks/config/glitchpeg.xml38
-rw-r--r--hacks/config/glknots.xml63
-rw-r--r--hacks/config/glmatrix.xml53
-rw-r--r--hacks/config/glplanet.xml43
-rw-r--r--hacks/config/glschool.xml45
-rw-r--r--hacks/config/glslideshow.xml55
-rw-r--r--hacks/config/glsnake.xml56
-rw-r--r--hacks/config/gltext.xml51
-rw-r--r--hacks/config/goop.xml65
-rw-r--r--hacks/config/grav.xml36
-rw-r--r--hacks/config/greynetic.xml25
-rw-r--r--hacks/config/halftone.xml61
-rw-r--r--hacks/config/halo.xml42
-rw-r--r--hacks/config/helix.xml27
-rw-r--r--hacks/config/hexadrop.xml60
-rw-r--r--hacks/config/hexstrut.xml48
-rw-r--r--hacks/config/hilbert.xml77
-rw-r--r--hacks/config/hopalong.xml64
-rw-r--r--hacks/config/hydrostat.xml76
-rw-r--r--hacks/config/hyperball.xml66
-rw-r--r--hacks/config/hypercube.xml77
-rw-r--r--hacks/config/hypertorus.xml116
-rw-r--r--hacks/config/hypnowheel.xml54
-rw-r--r--hacks/config/ifs.xml65
-rw-r--r--hacks/config/imsmap.xml46
-rw-r--r--hacks/config/interaggregate.xml33
-rw-r--r--hacks/config/interference.xml57
-rw-r--r--hacks/config/intermomentary.xml37
-rw-r--r--hacks/config/jigglypuff.xml95
-rw-r--r--hacks/config/jigsaw.xml51
-rw-r--r--hacks/config/juggle.xml60
-rw-r--r--hacks/config/juggler3d.xml55
-rw-r--r--hacks/config/julia.xml39
-rw-r--r--hacks/config/kaleidescope.xml42
-rw-r--r--hacks/config/kaleidocycle.xml57
-rw-r--r--hacks/config/klein.xml131
-rw-r--r--hacks/config/kumppa.xml32
-rw-r--r--hacks/config/lament.xml29
-rw-r--r--hacks/config/laser.xml38
-rw-r--r--hacks/config/lavalite.xml90
-rw-r--r--hacks/config/lcdscrub.xml58
-rw-r--r--hacks/config/lightning.xml30
-rw-r--r--hacks/config/lisa.xml50
-rw-r--r--hacks/config/lissie.xml52
-rw-r--r--hacks/config/lmorph.xml51
-rw-r--r--hacks/config/lockward.xml67
-rw-r--r--hacks/config/loop.xml37
-rw-r--r--hacks/config/m6502.xml55
-rw-r--r--hacks/config/maze.xml71
-rwxr-xr-xhacks/config/maze3d.xml122
-rw-r--r--hacks/config/memscroller.xml35
-rw-r--r--hacks/config/menger.xml51
-rw-r--r--hacks/config/metaballs.xml53
-rw-r--r--hacks/config/mirrorblob.xml75
-rw-r--r--hacks/config/mismunch.xml44
-rw-r--r--hacks/config/moebius.xml29
-rw-r--r--hacks/config/moebiusgears.xml47
-rw-r--r--hacks/config/moire.xml38
-rw-r--r--hacks/config/moire2.xml34
-rw-r--r--hacks/config/molecule.xml60
-rw-r--r--hacks/config/morph3d.xml34
-rw-r--r--hacks/config/mountain.xml31
-rw-r--r--hacks/config/munch.xml63
-rw-r--r--hacks/config/nerverot.xml62
-rw-r--r--hacks/config/noof.xml23
-rw-r--r--hacks/config/noseguy.xml19
-rw-r--r--hacks/config/pacman.xml28
-rw-r--r--hacks/config/pedal.xml33
-rw-r--r--hacks/config/peepers.xml47
-rw-r--r--hacks/config/penetrate.xml34
-rw-r--r--hacks/config/penrose.xml55
-rw-r--r--hacks/config/petri.xml83
-rw-r--r--hacks/config/phosphor.xml49
-rw-r--r--hacks/config/photopile.xml65
-rw-r--r--hacks/config/piecewise.xml45
-rw-r--r--hacks/config/pinion.xml49
-rw-r--r--hacks/config/pipes.xml49
-rw-r--r--hacks/config/polyhedra.xml201
-rw-r--r--hacks/config/polyominoes.xml36
-rw-r--r--hacks/config/polytopes.xml112
-rw-r--r--hacks/config/pong.xml46
-rw-r--r--hacks/config/popsquares.xml56
-rw-r--r--hacks/config/projectiveplane.xml153
-rw-r--r--hacks/config/providence.xml29
-rw-r--r--hacks/config/pulsar.xml42
-rw-r--r--hacks/config/pyro.xml37
-rw-r--r--hacks/config/qix.xml74
-rw-r--r--hacks/config/quasicrystal.xml56
-rw-r--r--hacks/config/queens.xml31
-rw-r--r--hacks/config/raverhoop.xml54
-rw-r--r--hacks/config/razzledazzle.xml66
-rw-r--r--hacks/config/rd-bomb.xml67
l---------hacks/config/rdbomb.xml1
-rw-r--r--hacks/config/ripples.xml55
-rw-r--r--hacks/config/rocks.xml45
-rw-r--r--hacks/config/romanboy.xml128
-rw-r--r--hacks/config/rorschach.xml36
-rw-r--r--hacks/config/rotor.xml40
-rw-r--r--hacks/config/rotzoomer.xml43
-rw-r--r--hacks/config/rubik.xml39
-rw-r--r--hacks/config/rubikblocks.xml67
-rw-r--r--hacks/config/sballs.xml37
-rw-r--r--hacks/config/shadebobs.xml38
-rw-r--r--hacks/config/sierpinski.xml37
-rw-r--r--hacks/config/sierpinski3d.xml34
-rw-r--r--hacks/config/skytentacles.xml71
-rw-r--r--hacks/config/slidescreen.xml54
-rw-r--r--hacks/config/slip.xml43
-rw-r--r--hacks/config/sonar.xml85
-rw-r--r--hacks/config/speedmine.xml62
-rw-r--r--hacks/config/sphere.xml30
-rw-r--r--hacks/config/spheremonics.xml60
-rw-r--r--hacks/config/spiral.xml38
-rw-r--r--hacks/config/splitflap.xml72
-rw-r--r--hacks/config/splodesic.xml32
-rw-r--r--hacks/config/spotlight.xml34
-rw-r--r--hacks/config/sproingies.xml36
-rw-r--r--hacks/config/squiral.xml51
-rw-r--r--hacks/config/stairs.xml25
-rw-r--r--hacks/config/starfish.xml43
-rw-r--r--hacks/config/starwars.xml63
-rw-r--r--hacks/config/stonerview.xml27
-rw-r--r--hacks/config/strange.xml58
-rw-r--r--hacks/config/substrate.xml47
-rw-r--r--hacks/config/superquadrics.xml36
-rw-r--r--hacks/config/surfaces.xml75
-rw-r--r--hacks/config/swirl.xml33
-rw-r--r--hacks/config/t3d.xml60
-rw-r--r--hacks/config/tangram.xml45
-rw-r--r--hacks/config/tessellimage.xml66
-rw-r--r--hacks/config/testx11.xml17
-rw-r--r--hacks/config/thornbird.xml37
-rw-r--r--hacks/config/timetunnel.xml42
-rw-r--r--hacks/config/topblock.xml64
-rw-r--r--hacks/config/triangle.xml28
-rw-r--r--hacks/config/tronbit.xml41
-rw-r--r--hacks/config/truchet.xml41
-rw-r--r--hacks/config/twang.xml61
-rw-r--r--hacks/config/unicrud.xml44
-rw-r--r--hacks/config/unknownpleasures.xml57
-rw-r--r--hacks/config/vermiculate.xml22
-rw-r--r--hacks/config/vfeedback.xml39
-rw-r--r--hacks/config/vidwhacker.xml32
-rw-r--r--hacks/config/vigilance.xml30
-rw-r--r--hacks/config/vines.xml30
-rw-r--r--hacks/config/voronoi.xml63
-rw-r--r--hacks/config/wander.xml55
-rw-r--r--hacks/config/webcollage.xml56
-rw-r--r--hacks/config/whirlwindwarp.xml28
-rw-r--r--hacks/config/whirlygig.xml90
-rw-r--r--hacks/config/winduprobot.xml62
-rw-r--r--hacks/config/worm.xml39
-rw-r--r--hacks/config/wormhole.xml31
-rw-r--r--hacks/config/xanalogtv.xml48
-rw-r--r--hacks/config/xflame.xml34
-rw-r--r--hacks/config/xjack.xml25
-rw-r--r--hacks/config/xlyap.xml52
-rw-r--r--hacks/config/xmatrix.xml68
-rw-r--r--hacks/config/xrayswarm.xml23
-rw-r--r--hacks/config/xspirograph.xml32
-rw-r--r--hacks/config/xss.dtd109
-rw-r--r--hacks/config/xss.xsd375
-rw-r--r--hacks/config/zoom.xml54
-rw-r--r--hacks/coral.c314
-rw-r--r--hacks/coral.man64
-rw-r--r--hacks/critical.c454
-rw-r--r--hacks/critical.man94
-rw-r--r--hacks/crystal.c1284
-rw-r--r--hacks/crystal.man81
-rw-r--r--hacks/cwaves.c212
-rw-r--r--hacks/cwaves.man76
-rw-r--r--hacks/cynosure.c443
-rw-r--r--hacks/cynosure.man64
-rw-r--r--hacks/decayscreen.c397
-rw-r--r--hacks/decayscreen.man92
-rw-r--r--hacks/deco.c339
-rw-r--r--hacks/deco.man105
-rw-r--r--hacks/delaunay.c301
-rw-r--r--hacks/delaunay.h52
-rw-r--r--hacks/deluxe.c465
-rw-r--r--hacks/deluxe.man72
-rw-r--r--hacks/demon.c952
-rw-r--r--hacks/demon.man69
-rw-r--r--hacks/discrete.c440
-rw-r--r--hacks/discrete.man61
-rw-r--r--hacks/distort.c864
-rw-r--r--hacks/distort.man137
-rw-r--r--hacks/drift.c672
-rw-r--r--hacks/drift.man79
-rw-r--r--hacks/epicycle.c794
-rw-r--r--hacks/epicycle.man204
-rw-r--r--hacks/eruption.c526
-rw-r--r--hacks/eruption.man77
-rw-r--r--hacks/euler2d.c887
-rw-r--r--hacks/euler2d.man69
-rw-r--r--hacks/euler2d.tex337
-rw-r--r--hacks/fadeplot.c233
-rw-r--r--hacks/fadeplot.man65
-rw-r--r--hacks/fiberlamp.c474
-rw-r--r--hacks/fiberlamp.man65
-rw-r--r--hacks/filmleader.c571
-rw-r--r--hacks/filmleader.man69
-rw-r--r--hacks/fireworkx.c868
-rw-r--r--hacks/fireworkx.man88
-rw-r--r--hacks/flag.c565
-rw-r--r--hacks/flag.man92
-rw-r--r--hacks/flame.c466
-rw-r--r--hacks/flame.man74
-rw-r--r--hacks/flow.c1211
-rw-r--r--hacks/flow.man137
-rw-r--r--hacks/fluidballs.c852
-rw-r--r--hacks/fluidballs.man90
-rw-r--r--hacks/fontglide.c2489
-rw-r--r--hacks/fontglide.man124
-rw-r--r--hacks/forest.c244
-rw-r--r--hacks/forest.man62
-rw-r--r--hacks/fps.c268
-rw-r--r--hacks/fps.h35
-rw-r--r--hacks/fpsI.h40
-rw-r--r--hacks/fuzzyflakes.c646
-rw-r--r--hacks/fuzzyflakes.man112
-rw-r--r--hacks/galaxy.c451
-rw-r--r--hacks/galaxy.man87
-rw-r--r--hacks/glitchpeg.c440
-rw-r--r--hacks/glitchpeg.man79
-rw-r--r--hacks/glx/Makefile.in3473
-rw-r--r--hacks/glx/README10
-rw-r--r--hacks/glx/antinspect.c704
-rw-r--r--hacks/glx/antinspect.man56
-rw-r--r--hacks/glx/antmaze.c1613
-rw-r--r--hacks/glx/antmaze.man52
-rw-r--r--hacks/glx/ants.h45
-rw-r--r--hacks/glx/antspotlight.c799
-rw-r--r--hacks/glx/antspotlight.man56
-rw-r--r--hacks/glx/atlantis.c577
-rw-r--r--hacks/glx/atlantis.h133
-rw-r--r--hacks/glx/atlantis.man78
-rw-r--r--hacks/glx/atunnel.c317
-rw-r--r--hacks/glx/atunnel.man83
-rw-r--r--hacks/glx/b_draw.c239
-rw-r--r--hacks/glx/b_lockglue.c240
-rw-r--r--hacks/glx/b_sphere.c219
-rw-r--r--hacks/glx/blinkbox.c608
-rw-r--r--hacks/glx/blinkbox.man73
-rw-r--r--hacks/glx/blocktube.c457
-rw-r--r--hacks/glx/blocktube.man73
-rw-r--r--hacks/glx/boing.c658
-rw-r--r--hacks/glx/boing.man105
-rw-r--r--hacks/glx/bouncingcow.c519
-rw-r--r--hacks/glx/bouncingcow.man73
-rw-r--r--hacks/glx/boxed.c1370
-rw-r--r--hacks/glx/boxed.h4116
-rw-r--r--hacks/glx/boxed.man56
-rw-r--r--hacks/glx/bubble3d.c281
-rw-r--r--hacks/glx/bubble3d.h100
-rw-r--r--hacks/glx/bubble3d.man62
-rw-r--r--hacks/glx/buildlwo.c96
-rw-r--r--hacks/glx/buildlwo.h43
-rw-r--r--hacks/glx/cage.c480
-rw-r--r--hacks/glx/cage.man61
-rw-r--r--hacks/glx/carousel.c941
-rw-r--r--hacks/glx/carousel.man109
-rw-r--r--hacks/glx/chessgames.h343
-rw-r--r--hacks/glx/chessmodels.c1738
-rw-r--r--hacks/glx/chessmodels.h44
-rw-r--r--hacks/glx/circuit.c2094
-rw-r--r--hacks/glx/circuit.man72
-rw-r--r--hacks/glx/cityflow.c545
-rw-r--r--hacks/glx/cityflow.man77
-rw-r--r--hacks/glx/companion.c592
-rw-r--r--hacks/glx/companion_disc.c9593
-rw-r--r--hacks/glx/companion_heart.c653
-rw-r--r--hacks/glx/companion_quad.c389
-rw-r--r--hacks/glx/companioncube.man85
-rw-r--r--hacks/glx/cow_face.c341
-rw-r--r--hacks/glx/cow_hide.c13055
-rw-r--r--hacks/glx/cow_hoofs.c1037
-rw-r--r--hacks/glx/cow_horns.c1025
-rw-r--r--hacks/glx/cow_tail.c464
-rw-r--r--hacks/glx/cow_udder.c1520
-rw-r--r--hacks/glx/crackberg.c1468
-rw-r--r--hacks/glx/crackberg.man123
-rw-r--r--hacks/glx/crumbler.c875
-rw-r--r--hacks/glx/crumbler.man77
-rw-r--r--hacks/glx/cube21.c941
-rw-r--r--hacks/glx/cube21.man147
-rw-r--r--hacks/glx/cubenetic.c598
-rw-r--r--hacks/glx/cubenetic.man89
-rw-r--r--hacks/glx/cubestack.c462
-rw-r--r--hacks/glx/cubestack.man72
-rw-r--r--hacks/glx/cubestorm.c469
-rw-r--r--hacks/glx/cubestorm.man77
-rw-r--r--hacks/glx/cubetwist.c595
-rw-r--r--hacks/glx/cubetwist.man80
-rw-r--r--hacks/glx/cubicgrid.c269
-rw-r--r--hacks/glx/cubicgrid.man83
-rw-r--r--hacks/glx/curlicue.h261
-rw-r--r--hacks/glx/dangerball.c364
-rw-r--r--hacks/glx/dangerball.man72
-rw-r--r--hacks/glx/discoball.c707
-rw-r--r--hacks/glx/discoball.man72
-rw-r--r--hacks/glx/dnalogo.c3639
-rw-r--r--hacks/glx/dnapizza.h122
-rw-r--r--hacks/glx/dolphin.c2061
-rw-r--r--hacks/glx/dropshadow.c181
-rw-r--r--hacks/glx/dropshadow.h40
-rwxr-xr-xhacks/glx/dxf2gl.pl729
-rw-r--r--hacks/glx/dymaxionmap-coords.c685
-rw-r--r--hacks/glx/dymaxionmap-coords.h6
-rw-r--r--hacks/glx/dymaxionmap.c1654
-rw-r--r--hacks/glx/dymaxionmap.man117
-rw-r--r--hacks/glx/e_textures.h1478
-rw-r--r--hacks/glx/endgame.c971
-rw-r--r--hacks/glx/endgame.man72
-rw-r--r--hacks/glx/energystream.c534
-rw-r--r--hacks/glx/energystream.man56
-rw-r--r--hacks/glx/engine.c1006
-rw-r--r--hacks/glx/engine.man80
-rw-r--r--hacks/glx/erase-gl.c38
-rw-r--r--hacks/glx/esper.c2412
-rw-r--r--hacks/glx/esper.man68
-rw-r--r--hacks/glx/extrusion-helix2.c47
-rw-r--r--hacks/glx/extrusion-helix3.c46
-rw-r--r--hacks/glx/extrusion-helix4.c63
-rw-r--r--hacks/glx/extrusion-joinoffset.c148
-rw-r--r--hacks/glx/extrusion-screw.c114
-rw-r--r--hacks/glx/extrusion-taper.c218
-rw-r--r--hacks/glx/extrusion-twistoid.c215
-rw-r--r--hacks/glx/extrusion.c556
-rw-r--r--hacks/glx/extrusion.h55
-rw-r--r--hacks/glx/extrusion.man71
-rw-r--r--hacks/glx/flipflop.c859
-rw-r--r--hacks/glx/flipflop.man95
-rw-r--r--hacks/glx/flipscreen3d.c518
-rw-r--r--hacks/glx/flipscreen3d.man61
-rw-r--r--hacks/glx/fliptext.c1001
-rw-r--r--hacks/glx/fliptext.man114
-rw-r--r--hacks/glx/flurry-smoke.c1441
-rw-r--r--hacks/glx/flurry-spark.c285
-rw-r--r--hacks/glx/flurry-star.c106
-rw-r--r--hacks/glx/flurry-texture.c224
-rw-r--r--hacks/glx/flurry.c549
-rw-r--r--hacks/glx/flurry.h299
-rw-r--r--hacks/glx/flurry.man73
-rw-r--r--hacks/glx/flyingtoasters.c868
-rw-r--r--hacks/glx/flyingtoasters.man86
-rw-r--r--hacks/glx/fps-gl.c98
-rw-r--r--hacks/glx/gears.c938
-rw-r--r--hacks/glx/gears.man79
-rw-r--r--hacks/glx/geodesic.c816
-rw-r--r--hacks/glx/geodesic.man79
-rw-r--r--hacks/glx/geodesicgears.c1803
-rw-r--r--hacks/glx/geodesicgears.man78
-rw-r--r--hacks/glx/gflux.c803
-rw-r--r--hacks/glx/gflux.man111
-rw-r--r--hacks/glx/glblur.c610
-rw-r--r--hacks/glx/glblur.man76
-rw-r--r--hacks/glx/glcells.c1388
-rw-r--r--hacks/glx/glcells.man97
-rw-r--r--hacks/glx/gleidescope.c1624
-rw-r--r--hacks/glx/gleidescope.man77
-rw-r--r--hacks/glx/glforestfire.c1097
-rw-r--r--hacks/glx/glforestfire.man130
-rw-r--r--hacks/glx/glhanoi.c2086
-rw-r--r--hacks/glx/glhanoi.man83
-rw-r--r--hacks/glx/glknots.c445
-rw-r--r--hacks/glx/glknots.man81
-rw-r--r--hacks/glx/gllist.c127
-rw-r--r--hacks/glx/gllist.h44
-rw-r--r--hacks/glx/glmatrix.c1068
-rw-r--r--hacks/glx/glmatrix.man116
-rw-r--r--hacks/glx/glplanet.c847
-rw-r--r--hacks/glx/glplanet.man75
-rw-r--r--hacks/glx/glschool.c216
-rw-r--r--hacks/glx/glschool.h17
-rw-r--r--hacks/glx/glschool.man126
-rw-r--r--hacks/glx/glschool_alg.c364
-rw-r--r--hacks/glx/glschool_alg.h126
-rw-r--r--hacks/glx/glschool_gl.c274
-rw-r--r--hacks/glx/glschool_gl.h51
-rw-r--r--hacks/glx/glslideshow.c1222
-rw-r--r--hacks/glx/glslideshow.man131
-rw-r--r--hacks/glx/glsnake.c2694
-rw-r--r--hacks/glx/glsnake.man98
-rw-r--r--hacks/glx/gltext.c660
-rw-r--r--hacks/glx/gltext.man152
-rw-r--r--hacks/glx/gltrackball.c337
-rw-r--r--hacks/glx/gltrackball.h72
-rw-r--r--hacks/glx/glut_mroman.h2456
-rw-r--r--hacks/glx/glut_roman.h2455
-rw-r--r--hacks/glx/glut_stroke.c66
-rw-r--r--hacks/glx/glut_swidth.c77
-rw-r--r--hacks/glx/glutstroke.h47
-rw-r--r--hacks/glx/grab-ximage.c813
-rw-r--r--hacks/glx/grab-ximage.h76
-rw-r--r--hacks/glx/hexstrut.c509
-rw-r--r--hacks/glx/hexstrut.man77
-rw-r--r--hacks/glx/hilbert.c1144
-rw-r--r--hacks/glx/hilbert.man103
-rw-r--r--hacks/glx/hydrostat.c809
-rw-r--r--hacks/glx/hydrostat.man103
-rw-r--r--hacks/glx/hypertorus.c1016
-rw-r--r--hacks/glx/hypertorus.man188
-rw-r--r--hacks/glx/hypnowheel.c322
-rw-r--r--hacks/glx/hypnowheel.man80
-rw-r--r--hacks/glx/involute.c998
-rw-r--r--hacks/glx/involute.h78
-rw-r--r--hacks/glx/jigglypuff.c1076
-rw-r--r--hacks/glx/jigglypuff.man121
-rw-r--r--hacks/glx/jigsaw.c1509
-rw-r--r--hacks/glx/jigsaw.man90
-rw-r--r--hacks/glx/juggler3d.c3022
-rw-r--r--hacks/glx/juggler3d.man183
-rw-r--r--hacks/glx/kaleidocycle.c574
-rw-r--r--hacks/glx/kaleidocycle.man96
-rw-r--r--hacks/glx/klein.c2099
-rw-r--r--hacks/glx/klein.man308
-rw-r--r--hacks/glx/lament.c1786
-rw-r--r--hacks/glx/lament.dxf163404
-rw-r--r--hacks/glx/lament.man68
-rw-r--r--hacks/glx/lament_model.c16258
-rw-r--r--hacks/glx/lavalite.c1539
-rw-r--r--hacks/glx/lavalite.man160
-rw-r--r--hacks/glx/lockward.c970
-rw-r--r--hacks/glx/lockward.man79
-rw-r--r--hacks/glx/marching.c645
-rw-r--r--hacks/glx/marching.h48
-rwxr-xr-xhacks/glx/maze3d.c1955
-rwxr-xr-xhacks/glx/maze3d.man116
-rw-r--r--hacks/glx/menger.c562
-rw-r--r--hacks/glx/menger.man78
-rw-r--r--hacks/glx/mirrorblob.c1841
-rw-r--r--hacks/glx/mirrorblob.man107
-rw-r--r--hacks/glx/moebius.c788
-rw-r--r--hacks/glx/moebius.man65
-rw-r--r--hacks/glx/moebiusgears.c437
-rw-r--r--hacks/glx/moebiusgears.man86
-rw-r--r--hacks/glx/molecule.c1682
-rw-r--r--hacks/glx/molecule.man160
-rwxr-xr-xhacks/glx/molecules.sh23
-rw-r--r--hacks/glx/morph3d.c837
-rw-r--r--hacks/glx/morph3d.man57
-rw-r--r--hacks/glx/noof.c519
-rw-r--r--hacks/glx/noof.man52
-rw-r--r--hacks/glx/normals.c52
-rw-r--r--hacks/glx/normals.h48
-rw-r--r--hacks/glx/peepers.c1455
-rw-r--r--hacks/glx/peepers.man80
-rw-r--r--hacks/glx/photopile.c833
-rw-r--r--hacks/glx/photopile.man113
-rw-r--r--hacks/glx/pinion.c1470
-rw-r--r--hacks/glx/pinion.man82
-rw-r--r--hacks/glx/pipeobjs.c3262
-rw-r--r--hacks/glx/pipes.c1220
-rw-r--r--hacks/glx/pipes.man85
-rw-r--r--hacks/glx/polyhedra-gl.c683
-rw-r--r--hacks/glx/polyhedra.c2457
-rw-r--r--hacks/glx/polyhedra.h52
-rw-r--r--hacks/glx/polyhedra.man124
-rw-r--r--hacks/glx/polytopes.c3189
-rw-r--r--hacks/glx/polytopes.man207
-rw-r--r--hacks/glx/projectiveplane.c1550
-rw-r--r--hacks/glx/projectiveplane.man400
-rw-r--r--hacks/glx/providence.c799
-rw-r--r--hacks/glx/providence.man66
-rw-r--r--hacks/glx/pulsar.c515
-rw-r--r--hacks/glx/pulsar.man102
-rw-r--r--hacks/glx/quasicrystal.c478
-rw-r--r--hacks/glx/quasicrystal.man83
-rw-r--r--hacks/glx/queens.c610
-rw-r--r--hacks/glx/queens.man66
-rw-r--r--hacks/glx/quickhull.c1368
-rw-r--r--hacks/glx/quickhull.h56
-rw-r--r--hacks/glx/raverhoop.c767
-rw-r--r--hacks/glx/raverhoop.man83
-rw-r--r--hacks/glx/razzledazzle.c725
-rw-r--r--hacks/glx/razzledazzle.man76
-rw-r--r--hacks/glx/robot-wireframe.c154
-rw-r--r--hacks/glx/robot-wireframe.dxf1160
-rw-r--r--hacks/glx/robot.c18539
-rw-r--r--hacks/glx/robot.dxf185616
-rw-r--r--hacks/glx/romanboy.c1552
-rw-r--r--hacks/glx/romanboy.man390
-rw-r--r--hacks/glx/rotator.c274
-rw-r--r--hacks/glx/rotator.h60
-rw-r--r--hacks/glx/rubik.c2140
-rw-r--r--hacks/glx/rubik.man69
-rw-r--r--hacks/glx/rubikblocks.c633
-rw-r--r--hacks/glx/rubikblocks.man117
-rw-r--r--hacks/glx/s1_1.c1733
-rw-r--r--hacks/glx/s1_2.c1733
-rw-r--r--hacks/glx/s1_3.c1733
-rw-r--r--hacks/glx/s1_4.c1733
-rw-r--r--hacks/glx/s1_5.c1733
-rw-r--r--hacks/glx/s1_6.c1733
-rw-r--r--hacks/glx/s1_b.c505
-rw-r--r--hacks/glx/sballs.c823
-rw-r--r--hacks/glx/sballs.man125
-rw-r--r--hacks/glx/seccam.c1388
-rw-r--r--hacks/glx/seccam.dxf13606
-rw-r--r--hacks/glx/shark.c1395
-rw-r--r--hacks/glx/ships.c4976
-rw-r--r--hacks/glx/ships.dxf49148
-rw-r--r--hacks/glx/sierpinski3d.c581
-rw-r--r--hacks/glx/sierpinski3d.man67
-rw-r--r--hacks/glx/skytentacles.c1103
-rw-r--r--hacks/glx/skytentacles.man102
-rw-r--r--hacks/glx/sonar-icmp.c1703
-rw-r--r--hacks/glx/sonar-sim.c112
-rw-r--r--hacks/glx/sonar.c1258
-rw-r--r--hacks/glx/sonar.h71
-rw-r--r--hacks/glx/sonar.man169
-rw-r--r--hacks/glx/sphere.c155
-rw-r--r--hacks/glx/sphere.h24
-rw-r--r--hacks/glx/spheremonics.c882
-rw-r--r--hacks/glx/spheremonics.man92
-rw-r--r--hacks/glx/splitflap.c1408
-rw-r--r--hacks/glx/splitflap.dxf1658
-rw-r--r--hacks/glx/splitflap.man98
-rw-r--r--hacks/glx/splitflap_obj.c200
-rw-r--r--hacks/glx/splodesic.c640
-rw-r--r--hacks/glx/splodesic.man69
-rw-r--r--hacks/glx/sproingies.c906
-rw-r--r--hacks/glx/sproingies.h43
-rw-r--r--hacks/glx/sproingies.man68
-rw-r--r--hacks/glx/sproingiewrap.c231
-rw-r--r--hacks/glx/stairs.c589
-rw-r--r--hacks/glx/stairs.man56
-rw-r--r--hacks/glx/starwars.c1075
-rw-r--r--hacks/glx/starwars.h363
-rw-r--r--hacks/glx/starwars.man181
-rw-r--r--hacks/glx/starwars.txt415
-rw-r--r--hacks/glx/stonerview-move.c147
-rw-r--r--hacks/glx/stonerview-move.h32
-rw-r--r--hacks/glx/stonerview-osc.c341
-rw-r--r--hacks/glx/stonerview-osc.h175
-rw-r--r--hacks/glx/stonerview-view.c134
-rw-r--r--hacks/glx/stonerview.c154
-rw-r--r--hacks/glx/stonerview.h59
-rw-r--r--hacks/glx/stonerview.man53
-rw-r--r--hacks/glx/superquadrics.c807
-rw-r--r--hacks/glx/superquadrics.man70
-rw-r--r--hacks/glx/surfaces.c648
-rw-r--r--hacks/glx/surfaces.man127
-rw-r--r--hacks/glx/swim.c232
-rw-r--r--hacks/glx/tangram.c1067
-rw-r--r--hacks/glx/tangram.man67
-rw-r--r--hacks/glx/tangram_shapes.c240
-rw-r--r--hacks/glx/tangram_shapes.h15
-rw-r--r--hacks/glx/teapot.c285
-rw-r--r--hacks/glx/teapot.h7
-rw-r--r--hacks/glx/teapot2.h6330
-rw-r--r--hacks/glx/texfont.c961
-rw-r--r--hacks/glx/texfont.h72
-rw-r--r--hacks/glx/timetunnel.c1240
-rw-r--r--hacks/glx/timetunnel.man105
-rw-r--r--hacks/glx/toast.c190
-rw-r--r--hacks/glx/toast.dxf1814
-rw-r--r--hacks/glx/toast2.c214
-rw-r--r--hacks/glx/toast2.dxf2054
-rw-r--r--hacks/glx/toaster.c376
-rw-r--r--hacks/glx/toaster.dxf3674
-rw-r--r--hacks/glx/toaster_base.c130
-rw-r--r--hacks/glx/toaster_base.dxf1214
-rw-r--r--hacks/glx/toaster_handle.c64
-rw-r--r--hacks/glx/toaster_handle.dxf554
-rw-r--r--hacks/glx/toaster_handle2.c40
-rw-r--r--hacks/glx/toaster_handle2.dxf314
-rw-r--r--hacks/glx/toaster_jet.c178
-rw-r--r--hacks/glx/toaster_jet.dxf1694
-rw-r--r--hacks/glx/toaster_knob.c76
-rw-r--r--hacks/glx/toaster_knob.dxf674
-rw-r--r--hacks/glx/toaster_slots.c106
-rw-r--r--hacks/glx/toaster_slots.dxf974
-rw-r--r--hacks/glx/toaster_wing.c43
-rw-r--r--hacks/glx/toaster_wing.dxf344
-rw-r--r--hacks/glx/topblock.c883
-rw-r--r--hacks/glx/topblock.h45
-rw-r--r--hacks/glx/topblock.man170
-rw-r--r--hacks/glx/trackball.c331
-rw-r--r--hacks/glx/trackball.h82
-rw-r--r--hacks/glx/tronbit.c536
-rw-r--r--hacks/glx/tronbit.man79
-rw-r--r--hacks/glx/tronbit_idle1.c247
-rw-r--r--hacks/glx/tronbit_idle2.c175
-rw-r--r--hacks/glx/tronbit_no.c1087
-rw-r--r--hacks/glx/tronbit_yes.c31
-rw-r--r--hacks/glx/tube.c403
-rw-r--r--hacks/glx/tube.h32
-rw-r--r--hacks/glx/tunnel_draw.c512
-rw-r--r--hacks/glx/tunnel_draw.h11
-rw-r--r--hacks/glx/unicrud.c961
-rw-r--r--hacks/glx/unicrud.man74
-rw-r--r--hacks/glx/unknownpleasures.c486
-rw-r--r--hacks/glx/unknownpleasures.man74
-rw-r--r--hacks/glx/vigilance.c1150
-rw-r--r--hacks/glx/vigilance.man57
-rw-r--r--hacks/glx/voronoi.c543
-rw-r--r--hacks/glx/voronoi.man88
-rwxr-xr-xhacks/glx/vrml2gl.pl361
-rwxr-xr-xhacks/glx/wfront2gl.pl361
-rw-r--r--hacks/glx/whale.c1887
-rw-r--r--hacks/glx/winduprobot.c2483
-rw-r--r--hacks/glx/winduprobot.man85
-rw-r--r--hacks/glx/xlock-gl-utils.c230
-rw-r--r--hacks/glx/xscreensaver-gl-helper.c74
-rw-r--r--hacks/glx/xscreensaver-gl-helper.man33
-rw-r--r--hacks/glx/zalgo.txt30
-rw-r--r--hacks/goop.c650
-rw-r--r--hacks/goop.man84
-rw-r--r--hacks/grav.c356
-rw-r--r--hacks/grav.man78
-rw-r--r--hacks/greynetic.c296
-rw-r--r--hacks/greynetic.man56
-rw-r--r--hacks/halftone.c397
-rw-r--r--hacks/halftone.man83
-rw-r--r--hacks/halo.c440
-rw-r--r--hacks/halo.man75
-rw-r--r--hacks/helix.c356
-rw-r--r--hacks/helix.man62
-rw-r--r--hacks/hexadrop.c414
-rw-r--r--hacks/hexadrop.man74
-rw-r--r--hacks/hopalong.c555
-rw-r--r--hacks/hopalong.man82
-rw-r--r--hacks/hyperball.c2458
-rw-r--r--hacks/hyperball.man88
-rw-r--r--hacks/hypercube.c569
-rw-r--r--hacks/hypercube.man97
-rw-r--r--hacks/ifs.c551
-rw-r--r--hacks/ifs.man111
-rw-r--r--hacks/images/6x10font.pngbin0 -> 1968 bytes-rw-r--r--hacks/images/Makefile54
-rw-r--r--hacks/images/Makefile.in54
-rw-r--r--hacks/images/amiga.pngbin0 -> 1136 bytes-rw-r--r--hacks/images/android.pngbin0 -> 1091 bytes-rw-r--r--hacks/images/apple.pngbin0 -> 1562 bytes-rw-r--r--hacks/images/apple2font.pngbin0 -> 651 bytes-rw-r--r--hacks/images/atari.pngbin0 -> 148 bytes-rw-r--r--hacks/images/atm.pngbin0 -> 982 bytes-rw-r--r--hacks/images/blocktube.pngbin0 -> 23571 bytes-rw-r--r--hacks/images/bob.pngbin0 -> 1491 bytes-rw-r--r--hacks/images/brick1.pngbin0 -> 8544 bytes-rw-r--r--hacks/images/brick2.pngbin0 -> 688 bytes-rw-r--r--hacks/images/bubbles/blood.pov24
-rw-r--r--hacks/images/bubbles/blood1.pngbin0 -> 583 bytes-rw-r--r--hacks/images/bubbles/blood10.pngbin0 -> 8605 bytes-rw-r--r--hacks/images/bubbles/blood11.pngbin0 -> 11682 bytes-rw-r--r--hacks/images/bubbles/blood2.pngbin0 -> 781 bytes-rw-r--r--hacks/images/bubbles/blood3.pngbin0 -> 1020 bytes-rw-r--r--hacks/images/bubbles/blood4.pngbin0 -> 1276 bytes-rw-r--r--hacks/images/bubbles/blood5.pngbin0 -> 1768 bytes-rw-r--r--hacks/images/bubbles/blood6.pngbin0 -> 2612 bytes-rw-r--r--hacks/images/bubbles/blood7.pngbin0 -> 3571 bytes-rw-r--r--hacks/images/bubbles/blood8.pngbin0 -> 5076 bytes-rw-r--r--hacks/images/bubbles/blood9.pngbin0 -> 6324 bytes-rw-r--r--hacks/images/bubbles/blue.pov22
-rw-r--r--hacks/images/bubbles/blue1.pngbin0 -> 583 bytes-rw-r--r--hacks/images/bubbles/blue10.pngbin0 -> 7064 bytes-rw-r--r--hacks/images/bubbles/blue11.pngbin0 -> 9455 bytes-rw-r--r--hacks/images/bubbles/blue2.pngbin0 -> 781 bytes-rw-r--r--hacks/images/bubbles/blue3.pngbin0 -> 1018 bytes-rw-r--r--hacks/images/bubbles/blue4.pngbin0 -> 1184 bytes-rw-r--r--hacks/images/bubbles/blue5.pngbin0 -> 1626 bytes-rw-r--r--hacks/images/bubbles/blue6.pngbin0 -> 2354 bytes-rw-r--r--hacks/images/bubbles/blue7.pngbin0 -> 3133 bytes-rw-r--r--hacks/images/bubbles/blue8.pngbin0 -> 4300 bytes-rw-r--r--hacks/images/bubbles/blue9.pngbin0 -> 5286 bytes-rw-r--r--hacks/images/bubbles/glass.pov27
-rw-r--r--hacks/images/bubbles/glass1.pngbin0 -> 583 bytes-rw-r--r--hacks/images/bubbles/glass10.pngbin0 -> 6805 bytes-rw-r--r--hacks/images/bubbles/glass11.pngbin0 -> 9200 bytes-rw-r--r--hacks/images/bubbles/glass2.pngbin0 -> 781 bytes-rw-r--r--hacks/images/bubbles/glass3.pngbin0 -> 1018 bytes-rw-r--r--hacks/images/bubbles/glass4.pngbin0 -> 1045 bytes-rw-r--r--hacks/images/bubbles/glass5.pngbin0 -> 1425 bytes-rw-r--r--hacks/images/bubbles/glass6.pngbin0 -> 2110 bytes-rw-r--r--hacks/images/bubbles/glass7.pngbin0 -> 2856 bytes-rw-r--r--hacks/images/bubbles/glass8.pngbin0 -> 4014 bytes-rw-r--r--hacks/images/bubbles/glass9.pngbin0 -> 4996 bytes-rw-r--r--hacks/images/bubbles/jade.pov24
-rw-r--r--hacks/images/bubbles/jade1.pngbin0 -> 583 bytes-rw-r--r--hacks/images/bubbles/jade10.pngbin0 -> 7853 bytes-rw-r--r--hacks/images/bubbles/jade11.pngbin0 -> 10816 bytes-rw-r--r--hacks/images/bubbles/jade2.pngbin0 -> 781 bytes-rw-r--r--hacks/images/bubbles/jade3.pngbin0 -> 1018 bytes-rw-r--r--hacks/images/bubbles/jade4.pngbin0 -> 1202 bytes-rw-r--r--hacks/images/bubbles/jade5.pngbin0 -> 1670 bytes-rw-r--r--hacks/images/bubbles/jade6.pngbin0 -> 2416 bytes-rw-r--r--hacks/images/bubbles/jade7.pngbin0 -> 3255 bytes-rw-r--r--hacks/images/bubbles/jade8.pngbin0 -> 4670 bytes-rw-r--r--hacks/images/bubbles/jade9.pngbin0 -> 5758 bytes-rw-r--r--hacks/images/chromesphere.pngbin0 -> 33091 bytes-rw-r--r--hacks/images/earth.pngbin0 -> 433159 bytes-rw-r--r--hacks/images/earth_flat.pngbin0 -> 16698 bytes-rw-r--r--hacks/images/earth_night.pngbin0 -> 390020 bytes-rw-r--r--hacks/images/ground.pngbin0 -> 13299 bytes-rw-r--r--hacks/images/hmac.pngbin0 -> 439 bytes-rw-r--r--hacks/images/iris.pngbin0 -> 143843 bytes-rw-r--r--hacks/images/jigglymap.pngbin0 -> 29863 bytes-rw-r--r--hacks/images/lament512.pngbin0 -> 566651 bytes-rw-r--r--hacks/images/logo-180.pngbin0 -> 8734 bytes-rw-r--r--hacks/images/logo-32.pngbin0 -> 1614 bytes-rw-r--r--hacks/images/logo-50.pngbin0 -> 2030 bytes-rw-r--r--hacks/images/m6502/amiga.asm120
-rw-r--r--hacks/images/m6502/breakout.asm195
-rw-r--r--hacks/images/m6502/byterun.asm100
-rw-r--r--hacks/images/m6502/cellular-30.asm67
-rw-r--r--hacks/images/m6502/cellular-600.asm209
-rw-r--r--hacks/images/m6502/colors.asm46
-rw-r--r--hacks/images/m6502/crunch6502.asm292
-rw-r--r--hacks/images/m6502/demoscene.asm457
-rw-r--r--hacks/images/m6502/disco.asm23
-rw-r--r--hacks/images/m6502/dmsc.asm130
-rw-r--r--hacks/images/m6502/dmsc.txt768
-rw-r--r--hacks/images/m6502/dragon-fractal.asm49
-rw-r--r--hacks/images/m6502/fullscreenlogo.asm107
-rw-r--r--hacks/images/m6502/greynetic.asm96
-rw-r--r--hacks/images/m6502/keftal.asm82
-rw-r--r--hacks/images/m6502/life.asm127
-rw-r--r--hacks/images/m6502/lines.asm313
-rw-r--r--hacks/images/m6502/matrix.asm67
-rw-r--r--hacks/images/m6502/noise.asm16
-rw-r--r--hacks/images/m6502/random-walk.asm82
-rw-r--r--hacks/images/m6502/random.asm11
-rw-r--r--hacks/images/m6502/random2.asm11
-rw-r--r--hacks/images/m6502/rorschach.asm124
-rw-r--r--hacks/images/m6502/santa.asm142
-rw-r--r--hacks/images/m6502/selfmodify.asm12
-rw-r--r--hacks/images/m6502/sflake.asm320
-rw-r--r--hacks/images/m6502/sierpinski.asm24
-rw-r--r--hacks/images/m6502/sierpinsky.asm131
-rw-r--r--hacks/images/m6502/softsprite.asm132
-rw-r--r--hacks/images/m6502/spacer.asm235
-rw-r--r--hacks/images/m6502/starfield2d.asm50
-rw-r--r--hacks/images/m6502/texture.asm393
-rw-r--r--hacks/images/m6502/wave6502.asm164
-rw-r--r--hacks/images/m6502/zookeeper.asm109
-rw-r--r--hacks/images/mac.pngbin0 -> 211 bytes-rw-r--r--hacks/images/macbomb.pngbin0 -> 697 bytes-rw-r--r--hacks/images/matrix1.pngbin0 -> 29412 bytes-rw-r--r--hacks/images/matrix1b.pngbin0 -> 11525 bytes-rw-r--r--hacks/images/matrix2.pngbin0 -> 27982 bytes-rw-r--r--hacks/images/matrix2b.pngbin0 -> 11468 bytes-rw-r--r--hacks/images/matrix3.pngbin0 -> 125539 bytes-rw-r--r--hacks/images/molecules/adenine.pdb37
-rw-r--r--hacks/images/molecules/adrenochrome.pdb55
-rw-r--r--hacks/images/molecules/bucky.pdb156
-rw-r--r--hacks/images/molecules/caffeine.pdb54
-rw-r--r--hacks/images/molecules/capsaicin.pdb49
-rw-r--r--hacks/images/molecules/chlordecone.pdb49
-rw-r--r--hacks/images/molecules/cocaine.pdb93
-rw-r--r--hacks/images/molecules/codeine.pdb93
-rw-r--r--hacks/images/molecules/cyclohexane.pdb151
-rw-r--r--hacks/images/molecules/cytosine.pdb33
-rw-r--r--hacks/images/molecules/dna.pdb972
-rw-r--r--hacks/images/molecules/dodecahedrane.pdb87
-rw-r--r--hacks/images/molecules/dthc.pdb107
-rw-r--r--hacks/images/molecules/dynamite.pdb47
-rw-r--r--hacks/images/molecules/glycol.pdb27
-rw-r--r--hacks/images/molecules/guanine.pdb39
-rw-r--r--hacks/images/molecules/heroin.pdb107
-rw-r--r--hacks/images/molecules/hexahelicene.pdb90
-rw-r--r--hacks/images/molecules/ibuprofen.pdb72
-rw-r--r--hacks/images/molecules/lsd.pdb104
-rw-r--r--hacks/images/molecules/menthol.pdb69
-rw-r--r--hacks/images/molecules/mescaline.pdb71
-rw-r--r--hacks/images/molecules/methamphetamine.pdb88
-rw-r--r--hacks/images/molecules/morphine.pdb87
-rw-r--r--hacks/images/molecules/nicotine.pdb59
-rw-r--r--hacks/images/molecules/novocaine.pdb81
-rw-r--r--hacks/images/molecules/olestra.pdb913
-rw-r--r--hacks/images/molecules/penicillin.pdb89
-rw-r--r--hacks/images/molecules/salvinorin.pdb92
-rw-r--r--hacks/images/molecules/sarin.pdb43
-rw-r--r--hacks/images/molecules/strychnine.pdb101
-rw-r--r--hacks/images/molecules/sucrose.pdb97
-rw-r--r--hacks/images/molecules/thalidomide.pdb65
-rw-r--r--hacks/images/molecules/thymine.pdb37
-rw-r--r--hacks/images/molecules/viagra.pdb133
-rw-r--r--hacks/images/molecules/vitaminb6.pdb56
-rw-r--r--hacks/images/molecules/vitaminc.pdb47
-rw-r--r--hacks/images/molecules/vx.pdb92
-rw-r--r--hacks/images/noseguy/nose-f1.pngbin0 -> 454 bytes-rw-r--r--hacks/images/noseguy/nose-f2.pngbin0 -> 397 bytes-rw-r--r--hacks/images/noseguy/nose-f3.pngbin0 -> 396 bytes-rw-r--r--hacks/images/noseguy/nose-f4.pngbin0 -> 448 bytes-rw-r--r--hacks/images/noseguy/nose-l1.pngbin0 -> 388 bytes-rw-r--r--hacks/images/noseguy/nose-l2.pngbin0 -> 470 bytes-rw-r--r--hacks/images/noseguy/nose-r1.pngbin0 -> 386 bytes-rw-r--r--hacks/images/noseguy/nose-r2.pngbin0 -> 467 bytes-rw-r--r--hacks/images/osx_10_2.pngbin0 -> 53621 bytes-rw-r--r--hacks/images/osx_10_3.pngbin0 -> 28292 bytes-rw-r--r--hacks/images/pacman.pngbin0 -> 2695 bytes-rw-r--r--hacks/images/ransomware.pngbin0 -> 976 bytes-rw-r--r--hacks/images/sball-bg.pngbin0 -> 31249 bytes-rw-r--r--hacks/images/sball.pngbin0 -> 2334 bytes-rw-r--r--hacks/images/scales.pngbin0 -> 8573 bytes-rw-r--r--hacks/images/sclera.pngbin0 -> 230321 bytes-rw-r--r--hacks/images/sea-texture.pngbin0 -> 6933 bytes-rw-r--r--hacks/images/som.pngbin0 -> 7593 bytes-rw-r--r--hacks/images/start.pngbin0 -> 1153 bytes-rw-r--r--hacks/images/testcard_bbcf.pngbin0 -> 67094 bytes-rw-r--r--hacks/images/testcard_pm5544.pngbin0 -> 20774 bytes-rw-r--r--hacks/images/testcard_rca.pngbin0 -> 96263 bytes-rw-r--r--hacks/images/timetunnel0.pngbin0 -> 35798 bytes-rw-r--r--hacks/images/timetunnel1.pngbin0 -> 131957 bytes-rw-r--r--hacks/images/timetunnel2.pngbin0 -> 50547 bytes-rw-r--r--hacks/images/toast.pngbin0 -> 11667 bytes-rw-r--r--hacks/images/tree.pngbin0 -> 5944 bytes-rw-r--r--hacks/images/tunnel0.pngbin0 -> 6996 bytes-rw-r--r--hacks/images/tunnel1.pngbin0 -> 3449 bytes-rw-r--r--hacks/images/tunnel2.pngbin0 -> 11424 bytes-rw-r--r--hacks/images/tunnel3.pngbin0 -> 6725 bytes-rw-r--r--hacks/images/tunnel4.pngbin0 -> 3297 bytes-rw-r--r--hacks/images/tunnel5.pngbin0 -> 3340 bytes-rw-r--r--hacks/images/tunnelstar.pngbin0 -> 23414 bytes-rw-r--r--hacks/images/win10_spinner.gifbin0 -> 64501 bytes-rw-r--r--hacks/images/wood.pngbin0 -> 2130 bytes-rw-r--r--hacks/images/wood2.pngbin0 -> 3274 bytes-rw-r--r--hacks/imsmap.c420
-rw-r--r--hacks/imsmap.man64
-rw-r--r--hacks/interaggregate.c981
-rw-r--r--hacks/interaggregate.man72
-rw-r--r--hacks/interference.c1001
-rw-r--r--hacks/interference.man86
-rw-r--r--hacks/intermomentary.c577
-rw-r--r--hacks/intermomentary.man82
-rw-r--r--hacks/juggle.c2796
-rw-r--r--hacks/juggle.man181
-rw-r--r--hacks/julia.c442
-rw-r--r--hacks/julia.man81
-rw-r--r--hacks/kaleidescope.c490
-rw-r--r--hacks/kaleidescope.man89
-rw-r--r--hacks/kumppa.c537
-rw-r--r--hacks/kumppa.man65
-rw-r--r--hacks/laser.c355
-rw-r--r--hacks/laser.man68
-rw-r--r--hacks/lcdscrub.c401
-rw-r--r--hacks/lcdscrub.man73
-rw-r--r--hacks/lightning.c601
-rw-r--r--hacks/lightning.man62
-rw-r--r--hacks/link_axp.com107
-rw-r--r--hacks/link_decc.com107
-rw-r--r--hacks/lisa.c739
-rw-r--r--hacks/lisa.man71
-rw-r--r--hacks/lissie.c322
-rw-r--r--hacks/lissie.man69
-rwxr-xr-xhacks/ljlatest1
-rw-r--r--hacks/ljlatest.man61
-rw-r--r--hacks/lmorph.c568
-rw-r--r--hacks/lmorph.man65
-rw-r--r--hacks/loop.c1694
-rw-r--r--hacks/loop.man65
-rw-r--r--hacks/m6502.c307
-rwxr-xr-xhacks/m6502.sh26
-rw-r--r--hacks/maze.c1661
-rw-r--r--hacks/maze.man148
-rw-r--r--hacks/memscroller.c636
-rw-r--r--hacks/memscroller.man78
-rw-r--r--hacks/metaballs.c436
-rw-r--r--hacks/metaballs.man73
-rw-r--r--hacks/moire.c245
-rw-r--r--hacks/moire.man68
-rw-r--r--hacks/moire2.c356
-rw-r--r--hacks/moire2.man63
-rw-r--r--hacks/mountain.c282
-rw-r--r--hacks/mountain.man60
-rw-r--r--hacks/munch.c476
-rw-r--r--hacks/munch.man153
-rwxr-xr-xhacks/munge-ad.pl237
-rw-r--r--hacks/nerverot.c1354
-rw-r--r--hacks/nerverot.man132
-rw-r--r--hacks/noseguy.c689
-rw-r--r--hacks/noseguy.man84
-rw-r--r--hacks/pacman.c1467
-rw-r--r--hacks/pacman.h220
-rw-r--r--hacks/pacman.man67
-rw-r--r--hacks/pacman_ai.c876
-rw-r--r--hacks/pacman_ai.h32
-rw-r--r--hacks/pacman_level.c772
-rw-r--r--hacks/pacman_level.h33
-rw-r--r--hacks/pedal.c335
-rw-r--r--hacks/pedal.man60
-rw-r--r--hacks/penetrate.c977
-rw-r--r--hacks/penetrate.man98
-rw-r--r--hacks/penrose.c1352
-rw-r--r--hacks/penrose.man106
-rw-r--r--hacks/petri.c761
-rw-r--r--hacks/petri.man129
-rw-r--r--hacks/phosphor.c1451
-rw-r--r--hacks/phosphor.man173
-rw-r--r--hacks/piecewise.c1006
-rw-r--r--hacks/piecewise.man77
-rw-r--r--hacks/polyominoes.c2368
-rw-r--r--hacks/polyominoes.man65
-rw-r--r--hacks/pong.c1118
-rw-r--r--hacks/pong.man86
-rw-r--r--hacks/popsquares.c306
-rw-r--r--hacks/pyro.c368
-rw-r--r--hacks/pyro.man64
-rw-r--r--hacks/qix.c624
-rw-r--r--hacks/qix.man132
-rw-r--r--hacks/rd-bomb.c549
-rw-r--r--hacks/rd-bomb.man100
-rw-r--r--hacks/recanim.c413
-rw-r--r--hacks/recanim.h36
-rw-r--r--hacks/ripples.c1118
-rw-r--r--hacks/ripples.man96
-rw-r--r--hacks/rocks.c550
-rw-r--r--hacks/rocks.man90
-rw-r--r--hacks/rorschach.c214
-rw-r--r--hacks/rorschach.man75
-rw-r--r--hacks/rotor.c389
-rw-r--r--hacks/rotor.man68
-rw-r--r--hacks/rotzoomer.c585
-rw-r--r--hacks/rotzoomer.man88
-rw-r--r--hacks/screenhack.c984
-rw-r--r--hacks/screenhack.h67
-rw-r--r--hacks/screenhackI.h162
-rw-r--r--hacks/shadebobs.c471
-rw-r--r--hacks/shadebobs.man65
-rw-r--r--hacks/sierpinski.c213
-rw-r--r--hacks/sierpinski.man69
-rw-r--r--hacks/slidescreen.c510
-rw-r--r--hacks/slidescreen.man97
-rw-r--r--hacks/slip.c375
-rw-r--r--hacks/slip.man86
-rw-r--r--hacks/speedmine.c1647
-rw-r--r--hacks/speedmine.man246
-rw-r--r--hacks/sphere.c303
-rw-r--r--hacks/sphere.man62
-rw-r--r--hacks/spiral.c330
-rw-r--r--hacks/spiral.man71
-rw-r--r--hacks/spotlight.c353
-rw-r--r--hacks/spotlight.man80
-rw-r--r--hacks/squiral.c290
-rw-r--r--hacks/squiral.man80
-rw-r--r--hacks/starfish.c559
-rw-r--r--hacks/starfish.man84
-rw-r--r--hacks/strange.c1341
-rw-r--r--hacks/strange.man79
-rw-r--r--hacks/substrate.c773
-rw-r--r--hacks/substrate.man73
-rw-r--r--hacks/swirl.c1445
-rw-r--r--hacks/swirl.man70
-rw-r--r--hacks/t3d.c980
-rw-r--r--hacks/t3d.man131
-rw-r--r--hacks/tessellimage.c1013
-rw-r--r--hacks/tessellimage.man86
-rw-r--r--hacks/testx11.c968
-rw-r--r--hacks/thornbird.c264
-rw-r--r--hacks/thornbird.man64
-rw-r--r--hacks/triangle.c354
-rw-r--r--hacks/triangle.man56
-rw-r--r--hacks/truchet.c536
-rw-r--r--hacks/truchet.man139
-rw-r--r--hacks/twang.c775
-rw-r--r--hacks/twang.man132
-rw-r--r--hacks/vermiculate.c1221
-rw-r--r--hacks/vermiculate.man48
-rw-r--r--hacks/vfeedback.c628
-rw-r--r--hacks/vfeedback.man71
-rwxr-xr-xhacks/vidwhacker506
-rw-r--r--hacks/vidwhacker.man89
-rw-r--r--hacks/vines.c179
-rw-r--r--hacks/vines.man66
-rw-r--r--hacks/vms_axp.opt4
-rw-r--r--hacks/vms_axp_12.opt4
-rw-r--r--hacks/vms_decc.opt4
-rw-r--r--hacks/vms_decc_12.opt4
-rw-r--r--hacks/wander.c280
-rw-r--r--hacks/wander.man76
-rwxr-xr-xhacks/webcollage4048
-rw-r--r--hacks/webcollage-cocoa.m428
-rw-r--r--hacks/webcollage-helper-cocoa.m510
-rw-r--r--hacks/webcollage-helper.c592
-rw-r--r--hacks/webcollage.man247
-rw-r--r--hacks/whirlwindwarp.c506
-rw-r--r--hacks/whirlwindwarp.man64
-rw-r--r--hacks/whirlygig.c733
-rw-r--r--hacks/whirlygig.man137
-rw-r--r--hacks/worm.c433
-rw-r--r--hacks/worm.man65
-rw-r--r--hacks/wormhole.c725
-rw-r--r--hacks/wormhole.man69
-rw-r--r--hacks/xanalogtv.c654
-rw-r--r--hacks/xanalogtv.man84
-rw-r--r--hacks/xflame.c819
-rw-r--r--hacks/xflame.man72
-rw-r--r--hacks/ximage-loader.c686
-rw-r--r--hacks/ximage-loader.h37
-rw-r--r--hacks/xjack.c487
-rw-r--r--hacks/xjack.man52
-rw-r--r--hacks/xlockmore.c773
-rw-r--r--hacks/xlockmore.h255
-rw-r--r--hacks/xlockmoreI.h177
-rw-r--r--hacks/xlyap.c1932
-rw-r--r--hacks/xlyap.man223
-rw-r--r--hacks/xmatrix.c1856
-rw-r--r--hacks/xmatrix.man146
-rwxr-xr-xhacks/xml2man.pl266
-rw-r--r--hacks/xrayswarm.c1224
-rw-r--r--hacks/xrayswarm.man50
-rw-r--r--hacks/xscreensaver-sgigl.c266
-rw-r--r--hacks/xspirograph.c333
-rw-r--r--hacks/xspirograph.man71
-rw-r--r--hacks/xsublim.c799
-rw-r--r--hacks/xsublim.man91
-rw-r--r--hacks/zoom.c291
-rw-r--r--hacks/zoom.man111
-rw-r--r--install-sh250
-rw-r--r--intltool-extract.in309
-rw-r--r--intltool-merge.in567
-rw-r--r--intltool-update.in613
-rw-r--r--jwxyz/Makefile.in141
-rw-r--r--jwxyz/README30
-rw-r--r--jwxyz/jwxyz-android.c1724
-rw-r--r--jwxyz/jwxyz-android.h121
-rw-r--r--jwxyz/jwxyz-cocoa.h98
-rw-r--r--jwxyz/jwxyz-cocoa.m1043
-rw-r--r--jwxyz/jwxyz-common.c1828
-rw-r--r--jwxyz/jwxyz-gl.c2125
-rw-r--r--jwxyz/jwxyz-image.c527
-rw-r--r--jwxyz/jwxyz-timers.c357
-rw-r--r--jwxyz/jwxyz-timers.h25
-rw-r--r--jwxyz/jwxyz.h906
-rw-r--r--jwxyz/jwxyz.m1812
-rw-r--r--jwxyz/jwxyzI.h208
-rw-r--r--jwxyz/jwzgles.c4331
-rw-r--r--jwxyz/jwzgles.h520
-rw-r--r--jwxyz/jwzglesI.h355
-rw-r--r--makevms.com57
-rw-r--r--po/ChangeLog300
-rw-r--r--po/Makefile.in.in389
-rw-r--r--po/POTFILES.in261
-rw-r--r--po/da.po9938
-rw-r--r--po/de.po9219
-rw-r--r--po/es.po10021
-rw-r--r--po/et.po8995
-rw-r--r--po/fi.po8939
-rw-r--r--po/fr.po9248
-rw-r--r--po/hu.po9760
-rw-r--r--po/it.po8967
-rw-r--r--po/ja.po9994
-rw-r--r--po/ko.po9340
-rw-r--r--po/nb.po9071
-rw-r--r--po/nl.po10290
-rw-r--r--po/pl.po9387
-rw-r--r--po/pt.po9995
-rw-r--r--po/pt_BR.po9563
-rw-r--r--po/ru.po10067
-rw-r--r--po/sk.po9242
-rw-r--r--po/sv.po11236
-rwxr-xr-xpo/update.sh24
-rw-r--r--po/vi.po9347
-rw-r--r--po/wa.po9138
-rw-r--r--po/zh_CN.po9513
-rw-r--r--po/zh_TW.po9358
-rw-r--r--setup.com130
-rw-r--r--utils/Makefile.in341
-rw-r--r--utils/README6
-rwxr-xr-xutils/ad2c42
-rw-r--r--utils/aligned_malloc.c48
-rw-r--r--utils/aligned_malloc.h26
-rw-r--r--utils/alpha.c215
-rw-r--r--utils/alpha.h22
-rw-r--r--utils/async_netdb.c449
-rw-r--r--utils/async_netdb.h223
-rwxr-xr-xutils/bin2c46
-rw-r--r--utils/colorbars.c130
-rw-r--r--utils/colorbars.h25
-rw-r--r--utils/colors.c732
-rw-r--r--utils/colors.h147
-rw-r--r--utils/compile_axp.com34
-rw-r--r--utils/compile_decc.com34
-rw-r--r--utils/erase.c811
-rw-r--r--utils/erase.h21
-rw-r--r--utils/fade.c962
-rw-r--r--utils/fade.h21
-rw-r--r--utils/font-retry.c189
-rw-r--r--utils/font-retry.h24
-rw-r--r--utils/grabclient.c1037
-rw-r--r--utils/grabscreen.c937
-rw-r--r--utils/grabscreen.h109
-rw-r--r--utils/hsv.c81
-rw-r--r--utils/hsv.h27
-rw-r--r--utils/images/logo-180.gifbin0 -> 3328 bytes-rw-r--r--utils/images/logo-180.xpm207
-rw-r--r--utils/images/logo-50.gifbin0 -> 857 bytes-rw-r--r--utils/images/logo-50.xpm77
-rw-r--r--utils/images/logo-big.gifbin0 -> 17019 bytes-rw-r--r--utils/images/logo.eps8058
-rw-r--r--utils/images/screensaver-cmndln.pngbin0 -> 1040 bytes-rw-r--r--utils/images/screensaver-colorselector.pngbin0 -> 1104 bytes-rw-r--r--utils/images/screensaver-diagnostic.pngbin0 -> 1307 bytes-rw-r--r--utils/images/screensaver-locking.pngbin0 -> 944 bytes-rw-r--r--utils/images/screensaver-power.pngbin0 -> 973 bytes-rw-r--r--utils/images/screensaver-snap.pngbin0 -> 1272 bytes-rw-r--r--utils/logo.c75
-rw-r--r--utils/minixpm.c251
-rw-r--r--utils/minixpm.h28
-rw-r--r--utils/overlay.c158
-rw-r--r--utils/pow2.c51
-rw-r--r--utils/pow2.h20
-rw-r--r--utils/resources.c296
-rw-r--r--utils/resources.h41
-rw-r--r--utils/spline.c319
-rw-r--r--utils/spline.h51
-rw-r--r--utils/textclient-mobile.c813
-rw-r--r--utils/textclient.c673
-rw-r--r--utils/textclient.h37
-rw-r--r--utils/thread_util.c1043
-rw-r--r--utils/thread_util.h446
-rw-r--r--utils/usleep.c64
-rw-r--r--utils/usleep.h28
-rw-r--r--utils/utf8wc.c928
-rw-r--r--utils/utf8wc.h47
-rw-r--r--utils/utils.h27
-rw-r--r--utils/version.h2
-rw-r--r--utils/visual-gl.c309
-rw-r--r--utils/visual.c555
-rw-r--r--utils/visual.h36
-rw-r--r--utils/vms-gtod.c31
-rw-r--r--utils/vms-gtod.h85
-rw-r--r--utils/vms-strdup.c25
-rw-r--r--utils/vroot.h156
-rw-r--r--utils/xdbe.c75
-rw-r--r--utils/xdbe.h27
-rw-r--r--utils/xft.c364
-rw-r--r--utils/xft.h167
-rw-r--r--utils/xmu.c173
-rw-r--r--utils/xmu.h14
-rw-r--r--utils/xscreensaver-intl.h36
-rw-r--r--utils/xshm.c340
-rw-r--r--utils/xshm.h54
-rw-r--r--utils/yarandom.c139
-rw-r--r--utils/yarandom.h103
-rw-r--r--xscreensaver.spec204
1703 files changed, 1277324 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..5761abc
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+*.o
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..50dbe43
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,183 @@
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+ The file `configure.in' is used to create `configure' by a program
+called `autoconf'. You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes awhile. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. You can give `configure'
+initial values for variables by setting them in the environment. Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+ CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+ env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory. After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on. Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+ CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+ If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+ Use and save the results of the tests in FILE instead of
+ `./config.cache'. Set FILE to `/dev/null' to disable caching, for
+ debugging `configure'.
+
+`--help'
+ Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to `/dev/null' (any error
+ messages will still be shown).
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--version'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
+
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..a948681
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,357 @@
+# Makefile.in --- xscreensaver, Copyright (c) 1999-2014 Jamie Zawinski.
+# the `../configure' script generates `Makefile' from this file.
+
+@SET_MAKE@
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+SHELL = /bin/sh
+SUBDIRS = utils jwxyz hacks/images hacks hacks/glx driver po
+SUBDIRS2 = $(SUBDIRS) OSX android
+TARFILES = README README.hacking README.VMS INSTALL \
+ configure configure.in Makefile.in config.h.in \
+ config.h-vms install-sh setup.com config.guess aclocal.m4 \
+ ax_pthread.m4 config.sub makevms.com \
+ intltool-merge.in intltool-extract.in intltool-update.in \
+ xscreensaver.spec \
+ OSX/xscreensaver.xcodeproj/project.pbxproj
+
+TAR = tar
+
+MAKE_SUBDIR = for dir in $(SUBDIRS); do (cd $$dir; $(MAKE) $@) || exit 5; done
+MAKE_SUBDIR2 = for dir in $(SUBDIRS2); do (cd $$dir; $(MAKE) $@) || exit 5; done
+
+default::
+ @+$(MAKE_SUBDIR)
+all::
+ @+$(MAKE_SUBDIR)
+install::
+ @+$(MAKE_SUBDIR)
+install-program::
+ @+$(MAKE_SUBDIR)
+install-man::
+ @+$(MAKE_SUBDIR)
+install-strip::
+ @+$(MAKE_SUBDIR)
+uninstall::
+ @$(MAKE_SUBDIR)
+uninstall-program::
+ @$(MAKE_SUBDIR)
+uninstall-man::
+ @$(MAKE_SUBDIR)
+depend::
+ @$(MAKE_SUBDIR)
+distdepend::
+ @$(MAKE) update_spec_version
+ @$(MAKE_SUBDIR2)
+ @cd po ; $(MAKE) update-po
+
+TAGS:: tags
+tags::
+ @$(MAKE_SUBDIR)
+
+clean::
+ @$(MAKE_SUBDIR2)
+
+distclean:: clean
+ -rm -f config.h Makefile config.status config.cache config.log TAGS *~ "#"* intltool-extract intltool-merge intltool-update
+ @$(MAKE_SUBDIR2)
+
+dist:: tar
+
+# This really makes me sick...
+tar::
+ @ \
+ sh config.status ; \
+ rm -f configure ; \
+ $(MAKE) configure ; \
+ $(MAKE) version-date distdepend ; \
+ VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' utils/version.h` ; \
+ NAME="xscreensaver-$$VERS" ; \
+ rm -rf $$NAME ; ln -s . $$NAME ; \
+ FILES= ; \
+ ADIR=archive/ ; \
+ for subdir in $(SUBDIRS2) ; do \
+ d=`pwd` ; \
+ cd $$subdir ; \
+ FILES="$$FILES `$(MAKE) echo_tarfiles \
+ | grep -v '^.*make\[' \
+ | sed \"s|^|$$subdir/|g;s| | $$subdir/|g\" \
+ ` "; \
+ cd $$d ; done ; \
+ echo creating tar file $$ADIR$$NAME.tar.gz... ; \
+ export COPYFILE_DISABLE=true ; \
+ GZIP="-9v" $(TAR) -vczf $$ADIR$$NAME.tar.gz \
+ `echo $(TARFILES) $$FILES | sed "s|^|$$NAME/|g; s| | $$NAME/|g" ` ; \
+ rm $$NAME
+
+
+# This also makes me sick...
+# autoconf generates a configure script that begins with a very hard to read,
+# nearly impossible to customize --help blurb. This horrid set of regexps
+# go through and clean up the help text, by inserting whitespace and ripping
+# out options we don't use. Odds are good that this will fail with any version
+# of autoconf other than the ones I've tried (2.12 and 2.13.)
+#
+configure::
+ aclocal
+ autoconf
+ autoheader
+ @TMP=configure.$$$$ ; \
+ echo "munging configure's --help message..." ; \
+ ( perl -e ' \
+ my $$file=""; \
+ while (<>) { $$file .= $$_; } \
+ $$_ = $$file; \
+ \
+ s/^(Configuration:)$$/\n$$1\n/m; \
+ s/^(Directory and file names:)$$/\n$$1\n/m; \
+ s/^ --sbindir=.*\n//m; \
+ s/^ --sysconfdir.*\n//m; \
+ s/^ --sharedstatedir.*\n.*\n//m; \
+ s/^ --localstatedir.*\n//m; \
+ s/^ --infodir.*\n//m; \
+ s/^(Host type:)$$/\n$$1\n/m; \
+ s/\nFeatures and packages:\n.*library files are in DIR\n/\n/s;\
+ s/--enable and --with options recognized://m; \
+ s/\n --with-x .*?(["\n])/$$1/s; \
+ s/\n(Installation options:\n)/$$1/s; \
+ \
+ s/^ --oldincludedir=.*$$/ \
+ --x-includes=DIR X include files are in DIR\n \
+ --x-libraries=DIR X library files are in DIR/m; \
+ \
+ s@mandir=.\$$\{prefix}/man.@mandir=\\\$${datadir}/man@; \
+ \
+ s@rm -f conftest@rm -rf conftest@g; \
+ \
+ print;' \
+ < configure \
+ > $$TMP && \
+ cat $$TMP > configure ) ; \
+ rm -f $$TMP
+
+bump-version::
+ @ \
+ SRC=utils/version.h ; \
+ VERS=`sed -n 's/[^0-9]*\([0-9]\)\.\([0-9][^. ]*\).*/\1 \2/p' $$SRC` ; \
+ set - $$VERS ; \
+ MAJOR="$$1"; MINOR="$$2"; \
+ NEW=`echo $$MINOR + 1 | bc` ; \
+ NEW=`echo $$NEW | sed 's/^\([0-9]\)$$/0\1/'` ; \
+ D=`date '+%d-%b-%Y'`; \
+ ADIR=archive/ ; \
+ if [ ! -f $${ADIR}xscreensaver-$$MAJOR.$$MINOR.tar.gz ]; then \
+ echo "WARNING: $${ADIR}xscreensaver-$$MAJOR.$$MINOR.tar.gz does not exist.";\
+ fi ; \
+ if [ -f $${ADIR}xscreensaver-$$MAJOR.$$NEW.tar.gz ]; then \
+ echo "WARNING: $${ADIR}xscreensaver-$$MAJOR.$$NEW.tar.gz already exists.";\
+ fi ; \
+ /bin/echo -n "Bumping $$MAJOR.$$MINOR to $$MAJOR.$$NEW ($$D), ok? "; \
+ read line; \
+ if [ "x$$line" != "xyes" -a "x$$line" != "xy" ]; then \
+ exit 1 ; \
+ fi ; \
+ TMP=/tmp/bv.$$ ; \
+ sed -e "s/\([0-9]\.[0-9][0-9]*\)/$$MAJOR.$$NEW/" \
+ -e "s/\(([0-9][0-9]*-[A-Za-z][a-z][a-z]-[0-9][0-9][0-9]*\))/($$D)/" \
+ $$SRC > $$TMP ; \
+ /bin/echo -n "New version and date are "; \
+ sed -n "s/[^0-9]*\([0-9]\.[0-9][0-9]*\) (\([-A-Za-z0-9]*\)).*/\1, \2./p" \
+ $$TMP; \
+ cat $$TMP > $$SRC ; \
+ rm -f $$TMP; \
+ echo "overwrote $$SRC"; \
+ ls -lFd $$SRC
+
+bump_version:: bump-version
+tick-version:: bump-version
+tick_version:: bump-version
+
+version-date::
+ @ \
+ SRC=utils/version.h ; \
+ D=`date '+%d-%b-%Y'`; \
+ TMP=/tmp/bv.$$ ; \
+ sed -e "s/([0-9][^()]*)/($$D)/" < $$SRC > $$TMP ; \
+ /bin/echo -n "Updating date in $$SRC to \"$$D\"... " ; \
+ if cmp -s $$SRC $$TMP ; then \
+ echo "unchanged." ; \
+ else \
+ cat $$TMP > $$SRC ; \
+ echo "done." ; \
+ fi ; \
+ rm -f $$TMP
+
+
+update_spec_version::
+ @S=$(srcdir)/xscreensaver.spec ; \
+ U=$(srcdir)/utils/version.h ; \
+ VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' < $$U` ; \
+ /bin/echo -n "Updating $$S to \"$$VERS\"... " ; \
+ T=/tmp/xs.$$$$ ; \
+ sed "s/^\(%define.version[^0-9]*\)\(.*\)/\1$$VERS/" \
+ < $$S > $$T ; \
+ if cmp -s $$S $$T ; then \
+ echo "unchanged." ; \
+ else \
+ cat $$T > $$S ; \
+ echo "done." ; \
+ fi ; \
+ rm $$T
+
+rpm::
+ @ \
+ VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' utils/version.h` ; \
+ DIR=`pwd`/rpm_build ; \
+ ARCH=`rpm --showrc | sed -n 's/^build arch *: //p'` ; \
+ ADIR=archive/ ; \
+ TGZ=xscreensaver-$$VERS.tar.gz ; \
+ if [ ! -f $${ADIR}$$TGZ ]; then \
+ echo "$${ADIR}$$TGZ does not exist! Did you forget to \`make tar'?" ; \
+ exit 1 ; \
+ fi ; \
+ rm -rf /var/tmp/xscreensaver-$$VERS-root ; \
+ rm -rf $$DIR ; \
+ mkdir $$DIR ; \
+ ( cd $$DIR; mkdir BUILD RPMS RPMS/$$ARCH SOURCES SPECS SRPMS ) ; \
+ cp -p $${ADIR}$$TGZ $$DIR/SOURCES/ ; \
+ rpmbuild --define "_topdir $$DIR" \
+ --define "USE_GL yes" \
+ -v -ba xscreensaver.spec ; \
+ echo '' ; \
+ echo 'RPM build complete' ; \
+ echo '' ; \
+ rm -f $$DIR/$$TGZ ; \
+ rm -rf $$DIR/BUILD/xscreensaver-$$VERS ; \
+ mv $$DIR/SRPMS/xscreensaver*-$$VERS-*.rpm . ; \
+ mv $$DIR/RPMS/$$ARCH/xscreensaver*-$$VERS-*.rpm . ; \
+ rm -rf $$DIR ; \
+ echo '' ; \
+ ls -lFG xscreensaver*-$$VERS-*.rpm
+
+dmg::
+ $(MAKE) -C OSX release dmg
+apk::
+ $(MAKE) -C android apk
+
+www::
+ @ \
+ DEST=$$HOME/www/xscreensaver ; \
+ VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' utils/version.h` ; \
+ HEAD="xscreensaver-$$VERS" ; \
+ ADIR=archive/ ; \
+ BNAME="$$HEAD.tar.gz" ; \
+ NAME="$$ADIR$$BNAME" ; \
+ DNAME="$$DEST/$$HEAD.tar.gz" ; \
+ BNAME2="$$HEAD.dmg" ; \
+ NAME2="$$ADIR$$BNAME2" ; \
+ DNAME2="$$DEST/$$HEAD.dmg" ; \
+ BNAME3="$$HEAD.apk" ; \
+ NAME3="$$ADIR$$BNAME3" ; \
+ DNAME3="$$DEST/$$HEAD.apk" ; \
+ \
+ if ! git diff --quiet ; then \
+ echo "uncommitted changes exist!" ; \
+ exit 1 ; \
+ fi ; \
+ \
+ $(MAKE) -C OSX updates.xml ; \
+ \
+ if [ ! -f $$NAME ]; then \
+ echo "$$NAME does not exist! Did you forget to \`make tar'?" ; \
+ exit 1 ; \
+ fi ; \
+ if [ ! -f $$NAME2 ]; then \
+ echo "$$NAME2 does not exist! Did you forget to \`make dmg'?" ; \
+ exit 1 ; \
+ fi ; \
+ if [ ! -f $$NAME3 ]; then \
+ echo "$$NAME3 does not exist! Did you forget to \`make apk'?" ; \
+ exit 1 ; \
+ fi ; \
+ chmod a-w $$NAME ; \
+ if [ -f $$DNAME ]; then \
+ /bin/echo -n "WARNING: $$DNAME already exists! Overwrite? "; \
+ read line; \
+ if [ "x$$line" != "xyes" -a "x$$line" != "xy" ]; then \
+ exit 1 ; \
+ fi ; \
+ fi ; \
+ if [ -f $$DNAME2 ]; then \
+ /bin/echo -n "WARNING: $$DNAME2 already exists! Overwrite? "; \
+ read line; \
+ if [ "x$$line" != "xyes" -a "x$$line" != "xy" ]; then \
+ exit 1 ; \
+ fi ; \
+ fi ; \
+ if [ -f $$DNAME3 ]; then \
+ /bin/echo -n "WARNING: $$DNAME3 already exists! Overwrite? "; \
+ read line; \
+ if [ "x$$line" != "xyes" -a "x$$line" != "xy" ]; then \
+ exit 1 ; \
+ fi ; \
+ fi ; \
+ \
+ git tag -a "v$$VERS" -m "$$VERS" ; \
+ git commit -m "$$VERS" . ; \
+ \
+ ( cd $$DEST ; git pull ) ; \
+ \
+ cp -p $$NAME $$DNAME ; \
+ cp -p $$NAME2 $$DNAME2 ; \
+ cp -p $$NAME3 $$DNAME3 ; \
+ chmod u+w $$DNAME $$DNAME2 $$DNAME3 ; \
+ cp -p OSX/updates.xml $$DEST ; \
+ cd $$DEST ; \
+ \
+ TMP=/tmp/xd.$$$$ ; \
+ sed "s/xscreensaver-5\.[0-9][0-9ab]*/$$HEAD/g" download.html > $$TMP ; \
+ echo '' ; \
+ diff -U0 download.html $$TMP ; \
+ echo '' ; \
+ \
+ for EXT in tar.gz dmg ; do \
+ OLDEST=`ls xscreensaver*.$$EXT | \
+ fgrep -v 5.14 | \
+ fgrep -v 5.34 | \
+ head -n 1` ; \
+ /bin/echo -n "Delete $$DEST/$$OLDEST? "; \
+ read line; \
+ if [ "x$$line" = "xyes" -o "x$$line" = "xy" ]; then \
+ set -x ; \
+ rm $$OLDEST ; \
+ git rm $$OLDEST ; \
+ set +x ; \
+ fi ; \
+ done ; \
+ set -x ; \
+ cat $$TMP > download.html ; \
+ rm -f $$TMP ; \
+ \
+ git add $$BNAME $$BNAME2 $$BNAME3 ; \
+ \
+ $(MAKE) -C ../ xscreensaver/changelog.html xscreensaver/screenshots/index.html; \
+ git diff changelog.html ; \
+ set +x ; \
+ \
+ /bin/echo -n "Ok? "; \
+ read line; \
+ if [ "x$$line" != "xyes" -a "x$$line" != "xy" ]; then \
+ exit 1 ; \
+ fi ; \
+ \
+ git tag -a "v$$VERS" -m "$$VERS" ; \
+ git commit -m "$$VERS" . ; \
+ git push ; \
+
+
+count::
+ @ \
+ /bin/echo -n "Current hack count: " ; \
+ ( ( cd hacks; make -s INSTALL=true install-program install-scripts ) ; \
+ ( cd hacks/glx; make -s INSTALL=true install-program ) ) | \
+ grep true | \
+ grep -v helper | \
+ grep -v ljlatest | \
+ wc -l
diff --git a/OSX/English.lproj/InfoPlist.strings b/OSX/English.lproj/InfoPlist.strings
new file mode 100644
index 0000000..dea12de
--- /dev/null
+++ b/OSX/English.lproj/InfoPlist.strings
Binary files differ
diff --git a/OSX/English.lproj/SaverRunner.nib/designable.nib b/OSX/English.lproj/SaverRunner.nib/designable.nib
new file mode 100644
index 0000000..1facee5
--- /dev/null
+++ b/OSX/English.lproj/SaverRunner.nib/designable.nib
@@ -0,0 +1,1790 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
+ <data>
+ <int key="IBDocument.SystemTarget">1050</int>
+ <string key="IBDocument.SystemVersion">10K549</string>
+ <string key="IBDocument.InterfaceBuilderVersion">851</string>
+ <string key="IBDocument.AppKitVersion">1038.36</string>
+ <string key="IBDocument.HIToolboxVersion">461.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="NS.object.0">851</string>
+ </object>
+ <array class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+ <integer value="57"/>
+ </array>
+ <array key="IBDocument.PluginDependencies">
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </array>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <string key="NS.key.0">PluginDependencyRecalculationVersion</string>
+ <integer value="1" key="NS.object.0"/>
+ </object>
+ <array class="NSMutableArray" key="IBDocument.RootObjects" id="837227664">
+ <object class="NSCustomObject" id="838516170">
+ <object class="NSMutableString" key="NSClassName">
+ <characters key="NS.bytes">NSApplication</characters>
+ </object>
+ </object>
+ <object class="NSCustomObject" id="998231172">
+ <string key="NSClassName">FirstResponder</string>
+ </object>
+ <object class="NSCustomObject" id="996827039">
+ <string key="NSClassName">NSApplication</string>
+ </object>
+ <object class="NSMenu" id="45111635">
+ <string key="NSTitle">MainMenu</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="690370694">
+ <reference key="NSMenu" ref="45111635"/>
+ <string key="NSTitle">XScreenSaver</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <object class="NSCustomResource" key="NSOnImage" id="301225830">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSMenuCheckmark</string>
+ </object>
+ <object class="NSCustomResource" key="NSMixedImage" id="862154113">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSMenuMixedState</string>
+ </object>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="648337178">
+ <string key="NSTitle">XScreenSaver</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="8914611">
+ <reference key="NSMenu" ref="648337178"/>
+ <string key="NSTitle">About XScreenSaver</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="627255583">
+ <reference key="NSMenu" ref="648337178"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="381880730">
+ <reference key="NSMenu" ref="648337178"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <string key="NSTitle">Preferences…</string>
+ <string key="NSKeyEquiv">,</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="862592074">
+ <reference key="NSMenu" ref="648337178"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="923603386">
+ <reference key="NSMenu" ref="648337178"/>
+ <string key="NSTitle">Services</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="1035646574">
+ <object class="NSMutableString" key="NSTitle">
+ <characters key="NS.bytes">Services</characters>
+ </object>
+ <array class="NSMutableArray" key="NSMenuItems"/>
+ <string key="NSName">_NSServicesMenu</string>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="819131537">
+ <reference key="NSMenu" ref="648337178"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="632798708">
+ <reference key="NSMenu" ref="648337178"/>
+ <string key="NSTitle">Hide XScreenSaver</string>
+ <string key="NSKeyEquiv">h</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="468461345">
+ <reference key="NSMenu" ref="648337178"/>
+ <string key="NSTitle">Hide Others</string>
+ <string key="NSKeyEquiv">h</string>
+ <int key="NSKeyEquivModMask">1572864</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="437251807">
+ <reference key="NSMenu" ref="648337178"/>
+ <string key="NSTitle">Show All</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="583949930">
+ <reference key="NSMenu" ref="648337178"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="504373960">
+ <reference key="NSMenu" ref="648337178"/>
+ <string key="NSTitle">Quit XScreenSaver</string>
+ <string key="NSKeyEquiv">q</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ </array>
+ <string key="NSName">_NSAppleMenu</string>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="799166226">
+ <reference key="NSMenu" ref="45111635"/>
+ <string key="NSTitle">File</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="811240304">
+ <object class="NSMutableString" key="NSTitle">
+ <characters key="NS.bytes">File</characters>
+ </object>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="222387297">
+ <reference key="NSMenu" ref="811240304"/>
+ <string key="NSTitle">Close</string>
+ <string key="NSKeyEquiv">w</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="608174085">
+ <reference key="NSMenu" ref="811240304"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="876081012">
+ <reference key="NSMenu" ref="811240304"/>
+ <string key="NSTitle">Page Setup…</string>
+ <string key="NSKeyEquiv">P</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="926886853">
+ <reference key="NSMenu" ref="811240304"/>
+ <string key="NSTitle">Print…</string>
+ <string key="NSKeyEquiv">p</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ </array>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="455143041">
+ <reference key="NSMenu" ref="45111635"/>
+ <string key="NSTitle">Edit</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="750267634">
+ <object class="NSMutableString" key="NSTitle">
+ <characters key="NS.bytes">Edit</characters>
+ </object>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="497437714">
+ <reference key="NSMenu" ref="750267634"/>
+ <string key="NSTitle">Undo</string>
+ <string key="NSKeyEquiv">z</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="216516037">
+ <reference key="NSMenu" ref="750267634"/>
+ <string key="NSTitle">Redo</string>
+ <string key="NSKeyEquiv">Z</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="50949474">
+ <reference key="NSMenu" ref="750267634"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="734088368">
+ <reference key="NSMenu" ref="750267634"/>
+ <string key="NSTitle">Cut</string>
+ <string key="NSKeyEquiv">x</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="56237994">
+ <reference key="NSMenu" ref="750267634"/>
+ <string key="NSTitle">Copy</string>
+ <string key="NSKeyEquiv">c</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="838407332">
+ <reference key="NSMenu" ref="750267634"/>
+ <string key="NSTitle">Paste</string>
+ <string key="NSKeyEquiv">v</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="285560595">
+ <reference key="NSMenu" ref="750267634"/>
+ <string key="NSTitle">Paste and Match Style</string>
+ <string key="NSKeyEquiv">V</string>
+ <int key="NSKeyEquivModMask">1572864</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="406944349">
+ <reference key="NSMenu" ref="750267634"/>
+ <string key="NSTitle">Delete</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="24225155">
+ <reference key="NSMenu" ref="750267634"/>
+ <string key="NSTitle">Select All</string>
+ <string key="NSKeyEquiv">a</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="785449747">
+ <reference key="NSMenu" ref="750267634"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="18140746">
+ <reference key="NSMenu" ref="750267634"/>
+ <string key="NSTitle">Find</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="830368365">
+ <object class="NSMutableString" key="NSTitle">
+ <characters key="NS.bytes">Find</characters>
+ </object>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="10797587">
+ <reference key="NSMenu" ref="830368365"/>
+ <string key="NSTitle">Find…</string>
+ <string key="NSKeyEquiv">f</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ <int key="NSTag">1</int>
+ </object>
+ <object class="NSMenuItem" id="144442828">
+ <reference key="NSMenu" ref="830368365"/>
+ <string key="NSTitle">Find Next</string>
+ <string key="NSKeyEquiv">g</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ <int key="NSTag">2</int>
+ </object>
+ <object class="NSMenuItem" id="208214618">
+ <reference key="NSMenu" ref="830368365"/>
+ <string key="NSTitle">Find Previous</string>
+ <string key="NSKeyEquiv">G</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ <int key="NSTag">3</int>
+ </object>
+ <object class="NSMenuItem" id="841162955">
+ <reference key="NSMenu" ref="830368365"/>
+ <string key="NSTitle">Use Selection for Find</string>
+ <string key="NSKeyEquiv">e</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ <int key="NSTag">7</int>
+ </object>
+ <object class="NSMenuItem" id="912738317">
+ <reference key="NSMenu" ref="830368365"/>
+ <string key="NSTitle">Jump to Selection</string>
+ <string key="NSKeyEquiv">j</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ </array>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="883299468">
+ <reference key="NSMenu" ref="750267634"/>
+ <string key="NSTitle">Spelling</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="768298486">
+ <string key="NSTitle">Spelling</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="177276662">
+ <reference key="NSMenu" ref="768298486"/>
+ <string key="NSTitle">Spelling…</string>
+ <string key="NSKeyEquiv">:</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="832350994">
+ <reference key="NSMenu" ref="768298486"/>
+ <string key="NSTitle">Check Spelling</string>
+ <string key="NSKeyEquiv">;</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="230465977">
+ <reference key="NSMenu" ref="768298486"/>
+ <string key="NSTitle">Check Spelling as You Type</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ </array>
+ </object>
+ </object>
+ </array>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="224272834">
+ <reference key="NSMenu" ref="45111635"/>
+ <string key="NSTitle">Window</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="77346976">
+ <object class="NSMutableString" key="NSTitle">
+ <characters key="NS.bytes">Window</characters>
+ </object>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="711269442">
+ <reference key="NSMenu" ref="77346976"/>
+ <string key="NSTitle">Minimize</string>
+ <string key="NSKeyEquiv">m</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="531690807">
+ <reference key="NSMenu" ref="77346976"/>
+ <string key="NSTitle">Zoom</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="229796363">
+ <reference key="NSMenu" ref="77346976"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ <object class="NSMenuItem" id="691026595">
+ <reference key="NSMenu" ref="77346976"/>
+ <string key="NSTitle">Bring All to Front</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ </array>
+ <string key="NSName">_NSWindowsMenu</string>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="372969117">
+ <reference key="NSMenu" ref="45111635"/>
+ <string key="NSTitle">Help</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="839568932">
+ <string key="NSTitle">Help</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="148697282">
+ <reference key="NSMenu" ref="839568932"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <string key="NSTitle">XScreenSaver Help</string>
+ <string key="NSKeyEquiv">?</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="301225830"/>
+ <reference key="NSMixedImage" ref="862154113"/>
+ </object>
+ </array>
+ </object>
+ </object>
+ </array>
+ <string key="NSName">_NSMainMenu</string>
+ </object>
+ <object class="NSCustomObject" id="606990062">
+ <string key="NSClassName">SaverRunner</string>
+ </object>
+ </array>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <array class="NSMutableArray" key="connectionRecords">
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">performMiniaturize:</string>
+ <reference key="source" ref="998231172"/>
+ <reference key="destination" ref="711269442"/>
+ </object>
+ <int key="connectionID">37</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">arrangeInFront:</string>
+ <reference key="source" ref="998231172"/>
+ <reference key="destination" ref="691026595"/>
+ </object>
+ <int key="connectionID">39</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">print:</string>
+ <reference key="source" ref="998231172"/>
+ <reference key="destination" ref="926886853"/>
+ </object>
+ <int key="connectionID">86</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">runPageLayout:</string>
+ <reference key="source" ref="998231172"/>
+ <reference key="destination" ref="876081012"/>
+ </object>
+ <int key="connectionID">87</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">showHelp:</string>
+ <reference key="source" ref="998231172"/>
+ <reference key="destination" ref="148697282"/>
+ </object>
+ <int key="connectionID">122</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">terminate:</string>
+ <reference key="source" ref="838516170"/>
+ <reference key="destination" ref="504373960"/>
+ </object>
+ <int key="connectionID">139</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">hideOtherApplications:</string>
+ <reference key="source" ref="838516170"/>
+ <reference key="destination" ref="468461345"/>
+ </object>
+ <int key="connectionID">146</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">hide:</string>
+ <reference key="source" ref="838516170"/>
+ <reference key="destination" ref="632798708"/>
+ </object>
+ <int key="connectionID">152</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">unhideAllApplications:</string>
+ <reference key="source" ref="838516170"/>
+ <reference key="destination" ref="437251807"/>
+ </object>
+ <int key="connectionID">153</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">cut:</string>
+ <reference key="source" ref="998231172"/>
+ <reference key="destination" ref="734088368"/>
+ </object>
+ <int key="connectionID">175</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">paste:</string>
+ <reference key="source" ref="998231172"/>
+ <reference key="destination" ref="838407332"/>
+ </object>
+ <int key="connectionID">176</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">redo:</string>
+ <reference key="source" ref="998231172"/>
+ <reference key="destination" ref="216516037"/>
+ </object>
+ <int key="connectionID">178</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">selectAll:</string>
+ <reference key="source" ref="998231172"/>
+ <reference key="destination" ref="24225155"/>
+ </object>
+ <int key="connectionID">179</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">undo:</string>
+ <reference key="source" ref="998231172"/>
+ <reference key="destination" ref="497437714"/>
+ </object>
+ <int key="connectionID">180</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">copy:</string>
+ <reference key="source" ref="998231172"/>
+ <reference key="destination" ref="56237994"/>
+ </object>
+ <int key="connectionID">181</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">showGuessPanel:</string>
+ <reference key="source" ref="998231172"/>
+ <reference key="destination" ref="177276662"/>
+ </object>
+ <int key="connectionID">188</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">checkSpelling:</string>
+ <reference key="source" ref="998231172"/>
+ <reference key="destination" ref="832350994"/>
+ </object>
+ <int key="connectionID">190</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">toggleContinuousSpellChecking:</string>
+ <reference key="source" ref="998231172"/>
+ <reference key="destination" ref="230465977"/>
+ </object>
+ <int key="connectionID">192</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">performClose:</string>
+ <reference key="source" ref="998231172"/>
+ <reference key="destination" ref="222387297"/>
+ </object>
+ <int key="connectionID">193</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">delete:</string>
+ <reference key="source" ref="998231172"/>
+ <reference key="destination" ref="406944349"/>
+ </object>
+ <int key="connectionID">195</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">performZoom:</string>
+ <reference key="source" ref="998231172"/>
+ <reference key="destination" ref="531690807"/>
+ </object>
+ <int key="connectionID">198</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">performFindPanelAction:</string>
+ <reference key="source" ref="998231172"/>
+ <reference key="destination" ref="10797587"/>
+ </object>
+ <int key="connectionID">199</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">performFindPanelAction:</string>
+ <reference key="source" ref="998231172"/>
+ <reference key="destination" ref="144442828"/>
+ </object>
+ <int key="connectionID">200</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">performFindPanelAction:</string>
+ <reference key="source" ref="998231172"/>
+ <reference key="destination" ref="208214618"/>
+ </object>
+ <int key="connectionID">201</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">performFindPanelAction:</string>
+ <reference key="source" ref="998231172"/>
+ <reference key="destination" ref="841162955"/>
+ </object>
+ <int key="connectionID">202</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">centerSelectionInVisibleArea:</string>
+ <reference key="source" ref="998231172"/>
+ <reference key="destination" ref="912738317"/>
+ </object>
+ <int key="connectionID">203</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">pasteAsPlainText:</string>
+ <reference key="source" ref="998231172"/>
+ <reference key="destination" ref="285560595"/>
+ </object>
+ <int key="connectionID">205</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="838516170"/>
+ <reference key="destination" ref="606990062"/>
+ </object>
+ <int key="connectionID">207</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">menubar</string>
+ <reference key="source" ref="606990062"/>
+ <reference key="destination" ref="45111635"/>
+ </object>
+ <int key="connectionID">209</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">openPreferences:</string>
+ <reference key="source" ref="606990062"/>
+ <reference key="destination" ref="381880730"/>
+ </object>
+ <int key="connectionID">212</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">aboutPanel:</string>
+ <reference key="source" ref="606990062"/>
+ <reference key="destination" ref="8914611"/>
+ </object>
+ <int key="connectionID">213</int>
+ </object>
+ </array>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <array key="orderedObjects">
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <array key="object" id="0"/>
+ <reference key="children" ref="837227664"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="838516170"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">File's Owner</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="998231172"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">First Responder</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-3</int>
+ <reference key="object" ref="996827039"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">Application</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">29</int>
+ <reference key="object" ref="45111635"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="224272834"/>
+ <reference ref="690370694"/>
+ <reference ref="799166226"/>
+ <reference ref="372969117"/>
+ <reference ref="455143041"/>
+ </array>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">MainMenu</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">19</int>
+ <reference key="object" ref="224272834"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="77346976"/>
+ </array>
+ <reference key="parent" ref="45111635"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">24</int>
+ <reference key="object" ref="77346976"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="691026595"/>
+ <reference ref="711269442"/>
+ <reference ref="229796363"/>
+ <reference ref="531690807"/>
+ </array>
+ <reference key="parent" ref="224272834"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">5</int>
+ <reference key="object" ref="691026595"/>
+ <reference key="parent" ref="77346976"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">23</int>
+ <reference key="object" ref="711269442"/>
+ <reference key="parent" ref="77346976"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">92</int>
+ <reference key="object" ref="229796363"/>
+ <reference key="parent" ref="77346976"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">197</int>
+ <reference key="object" ref="531690807"/>
+ <reference key="parent" ref="77346976"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">56</int>
+ <reference key="object" ref="690370694"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="648337178"/>
+ </array>
+ <reference key="parent" ref="45111635"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">57</int>
+ <reference key="object" ref="648337178"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="8914611"/>
+ <reference ref="381880730"/>
+ <reference ref="923603386"/>
+ <reference ref="632798708"/>
+ <reference ref="504373960"/>
+ <reference ref="862592074"/>
+ <reference ref="819131537"/>
+ <reference ref="468461345"/>
+ <reference ref="583949930"/>
+ <reference ref="437251807"/>
+ <reference ref="627255583"/>
+ </array>
+ <reference key="parent" ref="690370694"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">58</int>
+ <reference key="object" ref="8914611"/>
+ <reference key="parent" ref="648337178"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">129</int>
+ <reference key="object" ref="381880730"/>
+ <reference key="parent" ref="648337178"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">131</int>
+ <reference key="object" ref="923603386"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="1035646574"/>
+ </array>
+ <reference key="parent" ref="648337178"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">130</int>
+ <reference key="object" ref="1035646574"/>
+ <reference key="parent" ref="923603386"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">134</int>
+ <reference key="object" ref="632798708"/>
+ <reference key="parent" ref="648337178"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">136</int>
+ <reference key="object" ref="504373960"/>
+ <reference key="parent" ref="648337178"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">143</int>
+ <reference key="object" ref="862592074"/>
+ <reference key="parent" ref="648337178"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">144</int>
+ <reference key="object" ref="819131537"/>
+ <reference key="parent" ref="648337178"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">145</int>
+ <reference key="object" ref="468461345"/>
+ <reference key="parent" ref="648337178"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">149</int>
+ <reference key="object" ref="583949930"/>
+ <reference key="parent" ref="648337178"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">150</int>
+ <reference key="object" ref="437251807"/>
+ <reference key="parent" ref="648337178"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">196</int>
+ <reference key="object" ref="627255583"/>
+ <reference key="parent" ref="648337178"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">83</int>
+ <reference key="object" ref="799166226"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="811240304"/>
+ </array>
+ <reference key="parent" ref="45111635"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">81</int>
+ <reference key="object" ref="811240304"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="222387297"/>
+ <reference ref="608174085"/>
+ <reference ref="876081012"/>
+ <reference ref="926886853"/>
+ </array>
+ <reference key="parent" ref="799166226"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">73</int>
+ <reference key="object" ref="222387297"/>
+ <reference key="parent" ref="811240304"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">74</int>
+ <reference key="object" ref="608174085"/>
+ <reference key="parent" ref="811240304"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">77</int>
+ <reference key="object" ref="876081012"/>
+ <reference key="parent" ref="811240304"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">78</int>
+ <reference key="object" ref="926886853"/>
+ <reference key="parent" ref="811240304"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">103</int>
+ <reference key="object" ref="372969117"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="839568932"/>
+ </array>
+ <reference key="parent" ref="45111635"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">106</int>
+ <reference key="object" ref="839568932"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="148697282"/>
+ </array>
+ <reference key="parent" ref="372969117"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">111</int>
+ <reference key="object" ref="148697282"/>
+ <reference key="parent" ref="839568932"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">163</int>
+ <reference key="object" ref="455143041"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="750267634"/>
+ </array>
+ <reference key="parent" ref="45111635"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">169</int>
+ <reference key="object" ref="750267634"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="50949474"/>
+ <reference ref="56237994"/>
+ <reference ref="497437714"/>
+ <reference ref="734088368"/>
+ <reference ref="406944349"/>
+ <reference ref="18140746"/>
+ <reference ref="838407332"/>
+ <reference ref="24225155"/>
+ <reference ref="216516037"/>
+ <reference ref="785449747"/>
+ <reference ref="883299468"/>
+ <reference ref="285560595"/>
+ </array>
+ <reference key="parent" ref="455143041"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">156</int>
+ <reference key="object" ref="50949474"/>
+ <reference key="parent" ref="750267634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">157</int>
+ <reference key="object" ref="56237994"/>
+ <reference key="parent" ref="750267634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">158</int>
+ <reference key="object" ref="497437714"/>
+ <reference key="parent" ref="750267634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">160</int>
+ <reference key="object" ref="734088368"/>
+ <reference key="parent" ref="750267634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">164</int>
+ <reference key="object" ref="406944349"/>
+ <reference key="parent" ref="750267634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">168</int>
+ <reference key="object" ref="18140746"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="830368365"/>
+ </array>
+ <reference key="parent" ref="750267634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">159</int>
+ <reference key="object" ref="830368365"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="10797587"/>
+ <reference ref="912738317"/>
+ <reference ref="841162955"/>
+ <reference ref="208214618"/>
+ <reference ref="144442828"/>
+ </array>
+ <reference key="parent" ref="18140746"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">154</int>
+ <reference key="object" ref="10797587"/>
+ <reference key="parent" ref="830368365"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">155</int>
+ <reference key="object" ref="912738317"/>
+ <reference key="parent" ref="830368365"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">161</int>
+ <reference key="object" ref="841162955"/>
+ <reference key="parent" ref="830368365"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">162</int>
+ <reference key="object" ref="208214618"/>
+ <reference key="parent" ref="830368365"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">167</int>
+ <reference key="object" ref="144442828"/>
+ <reference key="parent" ref="830368365"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">171</int>
+ <reference key="object" ref="838407332"/>
+ <reference key="parent" ref="750267634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">172</int>
+ <reference key="object" ref="24225155"/>
+ <reference key="parent" ref="750267634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">173</int>
+ <reference key="object" ref="216516037"/>
+ <reference key="parent" ref="750267634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">174</int>
+ <reference key="object" ref="785449747"/>
+ <reference key="parent" ref="750267634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">184</int>
+ <reference key="object" ref="883299468"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="768298486"/>
+ </array>
+ <reference key="parent" ref="750267634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">185</int>
+ <reference key="object" ref="768298486"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="177276662"/>
+ <reference ref="832350994"/>
+ <reference ref="230465977"/>
+ </array>
+ <reference key="parent" ref="883299468"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">187</int>
+ <reference key="object" ref="177276662"/>
+ <reference key="parent" ref="768298486"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">189</int>
+ <reference key="object" ref="832350994"/>
+ <reference key="parent" ref="768298486"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">191</int>
+ <reference key="object" ref="230465977"/>
+ <reference key="parent" ref="768298486"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">204</int>
+ <reference key="object" ref="285560595"/>
+ <reference key="parent" ref="750267634"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">206</int>
+ <reference key="object" ref="606990062"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">SaverRunner</string>
+ </object>
+ </array>
+ </object>
+ <dictionary class="NSMutableDictionary" key="flattenedProperties">
+ <string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="-3.ImportedFromIB2"/>
+ <string key="103.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="103.ImportedFromIB2"/>
+ <string key="106.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="106.ImportedFromIB2"/>
+ <string key="111.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="111.ImportedFromIB2"/>
+ <string key="129.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="129.ImportedFromIB2"/>
+ <string key="130.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="130.ImportedFromIB2"/>
+ <string key="131.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="131.ImportedFromIB2"/>
+ <string key="134.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="134.ImportedFromIB2"/>
+ <string key="136.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="136.ImportedFromIB2"/>
+ <string key="143.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="143.ImportedFromIB2"/>
+ <string key="144.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="144.ImportedFromIB2"/>
+ <string key="145.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="145.ImportedFromIB2"/>
+ <string key="149.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="149.ImportedFromIB2"/>
+ <string key="150.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="150.ImportedFromIB2"/>
+ <string key="154.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="154.ImportedFromIB2"/>
+ <string key="155.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="155.ImportedFromIB2"/>
+ <string key="156.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="156.ImportedFromIB2"/>
+ <string key="157.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="157.ImportedFromIB2"/>
+ <string key="158.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="158.ImportedFromIB2"/>
+ <string key="159.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="159.ImportedFromIB2"/>
+ <string key="160.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="160.ImportedFromIB2"/>
+ <string key="161.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="161.ImportedFromIB2"/>
+ <string key="162.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="162.ImportedFromIB2"/>
+ <string key="163.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="163.ImportedFromIB2"/>
+ <string key="164.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="164.ImportedFromIB2"/>
+ <string key="167.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="167.ImportedFromIB2"/>
+ <string key="168.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="168.ImportedFromIB2"/>
+ <string key="169.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="169.ImportedFromIB2"/>
+ <string key="171.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="171.ImportedFromIB2"/>
+ <string key="172.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="172.ImportedFromIB2"/>
+ <string key="173.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="173.ImportedFromIB2"/>
+ <string key="174.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="174.ImportedFromIB2"/>
+ <string key="184.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="184.ImportedFromIB2"/>
+ <string key="185.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="185.ImportedFromIB2"/>
+ <string key="187.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="187.ImportedFromIB2"/>
+ <string key="189.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="189.ImportedFromIB2"/>
+ <string key="19.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="19.ImportedFromIB2"/>
+ <string key="191.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="191.ImportedFromIB2"/>
+ <string key="196.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="196.ImportedFromIB2"/>
+ <string key="197.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="197.ImportedFromIB2"/>
+ <string key="204.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="204.ImportedFromIB2"/>
+ <boolean value="YES" key="206.ImportedFromIB2"/>
+ <string key="23.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="23.ImportedFromIB2"/>
+ <string key="24.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="24.ImportedFromIB2"/>
+ <string key="29.IBEditorWindowLastContentRect">{{72, 1365}, {344, 20}}</string>
+ <string key="29.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="29.ImportedFromIB2"/>
+ <string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="5.ImportedFromIB2"/>
+ <string key="56.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="56.ImportedFromIB2"/>
+ <string key="57.IBEditorWindowLastContentRect">{{84, 1182}, {225, 183}}</string>
+ <string key="57.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="57.ImportedFromIB2"/>
+ <string key="58.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="58.ImportedFromIB2"/>
+ <string key="73.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="73.ImportedFromIB2"/>
+ <string key="74.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="74.ImportedFromIB2"/>
+ <string key="77.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="77.ImportedFromIB2"/>
+ <string key="78.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="78.ImportedFromIB2"/>
+ <string key="81.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="81.ImportedFromIB2"/>
+ <string key="83.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="83.ImportedFromIB2"/>
+ <string key="92.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="92.ImportedFromIB2"/>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
+ <nil key="activeLocalization"/>
+ <dictionary class="NSMutableDictionary" key="localizations"/>
+ <nil key="sourceID"/>
+ <int key="maxID">213</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <array class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <object class="IBPartialClassDescription">
+ <string key="className">SaverRunner</string>
+ <string key="superclassName">NSObject</string>
+ <dictionary class="NSMutableDictionary" key="actions">
+ <string key="aboutPanel:">id</string>
+ <string key="openPreferences:">id</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="actionInfosByName">
+ <object class="IBActionInfo" key="aboutPanel:">
+ <string key="name">aboutPanel:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="openPreferences:">
+ <string key="name">openPreferences:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </dictionary>
+ <object class="NSMutableDictionary" key="outlets">
+ <string key="NS.key.0">menubar</string>
+ <string key="NS.object.0">NSMenu</string>
+ </object>
+ <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <string key="NS.key.0">menubar</string>
+ <object class="IBToOneOutletInfo" key="NS.object.0">
+ <string key="name">menubar</string>
+ <string key="candidateClassName">NSMenu</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">OSX/SaverRunner.h</string>
+ </object>
+ </object>
+ </array>
+ <array class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
+ <object class="IBPartialClassDescription">
+ <string key="className">NSApplication</string>
+ <string key="superclassName">NSResponder</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="559430808">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSApplication.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSApplication</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="632847653">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSApplicationScripting.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSApplication</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="391792136">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSColorPanel.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSApplication</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSHelpManager.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSApplication</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSPageLayout.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSBrowser</string>
+ <string key="superclassName">NSControl</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="988770048">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSBrowser.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSControl</string>
+ <string key="superclassName">NSView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="339469989">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSControl.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSDocument</string>
+ <string key="superclassName">NSObject</string>
+ <dictionary class="NSMutableDictionary" key="actions">
+ <string key="printDocument:">id</string>
+ <string key="revertDocumentToSaved:">id</string>
+ <string key="runPageLayout:">id</string>
+ <string key="saveDocument:">id</string>
+ <string key="saveDocumentAs:">id</string>
+ <string key="saveDocumentTo:">id</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="actionInfosByName">
+ <object class="IBActionInfo" key="printDocument:">
+ <string key="name">printDocument:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="revertDocumentToSaved:">
+ <string key="name">revertDocumentToSaved:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="runPageLayout:">
+ <string key="name">runPageLayout:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="saveDocument:">
+ <string key="name">saveDocument:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="saveDocumentAs:">
+ <string key="name">saveDocumentAs:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="saveDocumentTo:">
+ <string key="name">saveDocumentTo:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </dictionary>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSDocument.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSDocument</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSDocumentScripting.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSMatrix</string>
+ <string key="superclassName">NSControl</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSMatrix.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSMenu</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="1054084886">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSMenu.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSMenuItem</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSMenuItem.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSMovieView</string>
+ <string key="superclassName">NSView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSMovieView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSAccessibility.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSAlert.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSAnimation.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <reference key="sourceIdentifier" ref="559430808"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <reference key="sourceIdentifier" ref="632847653"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <reference key="sourceIdentifier" ref="988770048"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <reference key="sourceIdentifier" ref="391792136"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSComboBox.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSComboBoxCell.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <reference key="sourceIdentifier" ref="339469989"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSDatePickerCell.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSDragging.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="813110203">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSDrawer.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSFontManager.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSFontPanel.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSImage.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSKeyValueBinding.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <reference key="sourceIdentifier" ref="1054084886"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSNibLoading.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSOutlineView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSPasteboard.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSSavePanel.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSSound.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSSpeechRecognizer.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSSpeechSynthesizer.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSSplitView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSTabView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="618451181">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSTableView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="639735868">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSText.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSTextStorage.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSTextView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSTokenField.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSTokenFieldCell.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSToolbar.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSToolbarItem.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="1040394720">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="197276517">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSWindow.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSResponder</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSInterfaceStyle.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSResponder</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSResponder.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSTableView</string>
+ <string key="superclassName">NSControl</string>
+ <reference key="sourceIdentifier" ref="618451181"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSText</string>
+ <string key="superclassName">NSView</string>
+ <reference key="sourceIdentifier" ref="639735868"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSClipView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSRulerView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSView</string>
+ <string key="superclassName">NSResponder</string>
+ <reference key="sourceIdentifier" ref="1040394720"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSWindow</string>
+ <reference key="sourceIdentifier" ref="813110203"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSWindow</string>
+ <string key="superclassName">NSResponder</string>
+ <reference key="sourceIdentifier" ref="197276517"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSWindow</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSWindowScripting.h</string>
+ </object>
+ </object>
+ </array>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+ <integer value="1050" key="NS.object.0"/>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+ <integer value="1040" key="NS.object.0"/>
+ </object>
+ <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+ <string key="IBDocument.LastKnownRelativeProjectPath">../../xscreensaver.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ <dictionary class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
+ <string key="NSMenuCheckmark">{9, 8}</string>
+ <string key="NSMenuMixedState">{7, 2}</string>
+ </dictionary>
+ </data>
+</archive>
diff --git a/OSX/English.lproj/SaverRunner.nib/keyedobjects.nib b/OSX/English.lproj/SaverRunner.nib/keyedobjects.nib
new file mode 100644
index 0000000..96d6891
--- /dev/null
+++ b/OSX/English.lproj/SaverRunner.nib/keyedobjects.nib
Binary files differ
diff --git a/OSX/Gallant19.bdf b/OSX/Gallant19.bdf
new file mode 100644
index 0000000..75b4fa6
--- /dev/null
+++ b/OSX/Gallant19.bdf
@@ -0,0 +1,13691 @@
+STARTFONT 2.1
+COMMENT Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+COMMENT Use is subject to license terms.
+COMMENT This is a derivation of a BDF font from the X consolidation
+COMMENT Originally a BSD vfont.
+COMMENT Re-built BDF and ISO10646-1 from hex code originally in
+COMMENT illumos usr/src/uts/common/font/12x22.c
+FONT -Sun-Gallant-Demi-R-Normal--19-190-72-72-C-120-ISO10646-1
+SIZE 19 72 72
+FONTBOUNDINGBOX 12 22 0 -5
+STARTPROPERTIES 18
+FONTNAME_REGISTRY ""
+FOUNDRY "Sun"
+FAMILY_NAME "Gallant"
+WEIGHT_NAME "Demi"
+SLANT "R"
+SETWIDTH_NAME "Normal"
+ADD_STYLE_NAME ""
+PIXEL_SIZE 19
+POINT_SIZE 190
+RESOLUTION_X 72
+RESOLUTION_Y 72
+SPACING "C"
+AVERAGE_WIDTH 120
+CHARSET_REGISTRY "ISO10646"
+CHARSET_ENCODING "1"
+FONT_ASCENT 17
+FONT_DESCENT 5
+DEFAULT_CHAR 65533
+ENDPROPERTIES
+CHARS 471
+STARTCHAR char0
+ENCODING 0
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+76E0
+76E0
+6060
+6060
+0000
+0000
+6060
+6060
+6060
+0000
+0000
+6060
+6060
+76E0
+76E0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR space
+ENCODING 32
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR exclam
+ENCODING 33
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0000
+0000
+0600
+0600
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR quotedbl
+ENCODING 34
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1980
+1980
+1980
+1980
+1980
+1980
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR numbersign
+ENCODING 35
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0330
+0330
+0330
+0660
+1FF0
+1FF0
+0CC0
+0CC0
+1980
+1980
+7FC0
+7FC0
+3300
+6600
+6600
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR dollar
+ENCODING 36
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0600
+1F80
+3FC0
+66E0
+6660
+6600
+3E00
+1F80
+07C0
+0660
+0660
+6660
+7FC0
+3F80
+0600
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR percent
+ENCODING 37
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+38C0
+4CC0
+4580
+6580
+3B00
+0300
+0600
+0600
+0C00
+0DC0
+1A60
+1A20
+3320
+31C0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ampersand
+ENCODING 38
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0700
+0F80
+18C0
+18C0
+18C0
+0F80
+1E00
+3E00
+7700
+6360
+61E0
+61C0
+6180
+3FE0
+1E60
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR quotesingle
+ENCODING 39
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0C00
+1E00
+1E00
+0600
+0600
+0C00
+1800
+1000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR parenleft
+ENCODING 40
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0180
+0300
+0600
+0600
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0600
+0600
+0300
+0180
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR parenright
+ENCODING 41
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1800
+0C00
+0600
+0600
+0300
+0300
+0300
+0300
+0300
+0300
+0300
+0600
+0600
+0C00
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR asterisk
+ENCODING 42
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0F00
+0600
+6660
+76E0
+1980
+0000
+1980
+76E0
+6660
+0600
+0F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR plus
+ENCODING 43
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0600
+0600
+0600
+0600
+7FE0
+7FE0
+0600
+0600
+0600
+0600
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR comma
+ENCODING 44
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0C00
+1E00
+1E00
+0600
+0600
+0C00
+1800
+1000
+ENDCHAR
+STARTCHAR hyphen
+ENCODING 45
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7FE0
+7FE0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR period
+ENCODING 46
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0C00
+1E00
+1E00
+0C00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR slash
+ENCODING 47
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0060
+00C0
+00C0
+0180
+0180
+0300
+0300
+0600
+0600
+0C00
+0C00
+1800
+1800
+3000
+3000
+6000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR zero
+ENCODING 48
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0700
+0F80
+1180
+10C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+3080
+1880
+1F00
+0E00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR one
+ENCODING 49
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0200
+0600
+0E00
+1E00
+3600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+3FC0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR two
+ENCODING 50
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1F00
+3F80
+61C0
+40C0
+00C0
+00C0
+00C0
+0180
+0300
+0600
+0C00
+1800
+3020
+7FE0
+7FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR three
+ENCODING 51
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0F80
+1FC0
+20E0
+4060
+0060
+00E0
+07C0
+0FC0
+00E0
+0060
+0060
+4060
+6040
+3F80
+1F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR four
+ENCODING 52
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0180
+0380
+0380
+0580
+0580
+0980
+0980
+1180
+1180
+2180
+3FE0
+7FE0
+0180
+0180
+0180
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR five
+ENCODING 53
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0FC0
+0FC0
+1000
+1000
+2000
+3F80
+31C0
+00E0
+0060
+0060
+0060
+4060
+6060
+30C0
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR six
+ENCODING 54
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0700
+0C00
+1800
+3000
+3000
+6000
+6780
+6FC0
+70E0
+6060
+6060
+6060
+7040
+3F80
+1F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR seven
+ENCODING 55
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1FE0
+3FE0
+6040
+0040
+00C0
+0080
+0080
+0180
+0100
+0100
+0300
+0200
+0200
+0600
+0400
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR eight
+ENCODING 56
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0F00
+1180
+30C0
+30C0
+30C0
+1880
+0D00
+0600
+0B00
+1180
+30C0
+30C0
+30C0
+1880
+0F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR nine
+ENCODING 57
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0F80
+11C0
+20E0
+6060
+6060
+6060
+70E0
+3F60
+1E60
+0060
+00C0
+00C0
+0180
+0700
+3C00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR colon
+ENCODING 58
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0C00
+1E00
+1E00
+0C00
+0000
+0000
+0C00
+1E00
+1E00
+0C00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR semicolon
+ENCODING 59
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0C00
+1E00
+1E00
+0C00
+0000
+0000
+0C00
+1E00
+1E00
+0600
+0600
+0C00
+1800
+1000
+ENDCHAR
+STARTCHAR less
+ENCODING 60
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0060
+01C0
+0700
+1C00
+7000
+7000
+1C00
+0700
+01C0
+0060
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR equal
+ENCODING 61
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7FE0
+7FE0
+0000
+0000
+7FE0
+7FE0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR greater
+ENCODING 62
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+6000
+3800
+0E00
+0380
+00E0
+00E0
+0380
+0E00
+3800
+6000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR question
+ENCODING 63
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0F00
+1F80
+39C0
+20C0
+00C0
+00C0
+0180
+0300
+0600
+0C00
+0C00
+0000
+0000
+0C00
+0C00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR at
+ENCODING 64
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+3FC0
+3060
+6060
+6720
+6FA0
+6CA0
+6CA0
+67E0
+6000
+3000
+3FE0
+0FE0
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR A
+ENCODING 65
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0600
+0600
+0B00
+0B00
+0900
+1180
+1180
+1080
+3FC0
+20C0
+2040
+4060
+4060
+E0F0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR B
+ENCODING 66
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+FF00
+6080
+60C0
+60C0
+60C0
+6180
+7F80
+60C0
+6060
+6060
+6060
+6060
+60C0
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR C
+ENCODING 67
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0FC0
+1060
+2020
+2000
+6000
+6000
+6000
+6000
+6000
+6000
+2000
+3020
+1840
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR D
+ENCODING 68
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+FF00
+61C0
+60C0
+6060
+6060
+6060
+6060
+6060
+6060
+6060
+6060
+6040
+6180
+FE00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR E
+ENCODING 69
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+7FC0
+3040
+3040
+3000
+3000
+3080
+3F80
+3080
+3000
+3000
+3000
+3020
+3020
+7FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR F
+ENCODING 70
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+7FC0
+3040
+3040
+3000
+3000
+3080
+3F80
+3080
+3000
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR G
+ENCODING 71
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0FC0
+1060
+2020
+2000
+6000
+6000
+6000
+6000
+61F0
+6060
+2060
+3060
+1860
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR H
+ENCODING 72
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+F0F0
+6060
+6060
+6060
+6060
+6060
+7FE0
+6060
+6060
+6060
+6060
+6060
+6060
+F0F0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR I
+ENCODING 73
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1F80
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR J
+ENCODING 74
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1F80
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0400
+3800
+3000
+ENDCHAR
+STARTCHAR K
+ENCODING 75
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+F0E0
+6180
+6300
+6600
+6C00
+7800
+7800
+7C00
+6E00
+6700
+6380
+61C0
+60E0
+F070
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR L
+ENCODING 76
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+7800
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3020
+3020
+7FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR M
+ENCODING 77
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+E070
+60E0
+70E0
+70E0
+70E0
+5960
+5960
+5960
+4D60
+4E60
+4E60
+4460
+4460
+E4F0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR N
+ENCODING 78
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+C070
+6020
+7020
+7820
+5820
+4C20
+4620
+4720
+4320
+41A0
+40E0
+40E0
+4060
+E030
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR O
+ENCODING 79
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0F00
+11C0
+20C0
+2060
+6060
+6060
+6060
+6060
+6060
+6060
+2040
+3040
+1880
+0F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR P
+ENCODING 80
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+7F80
+30C0
+3060
+3060
+3060
+30C0
+3780
+3000
+3000
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Q
+ENCODING 81
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0F00
+11C0
+20C0
+2060
+6060
+6060
+6060
+6060
+6060
+6060
+3040
+3840
+1F80
+0E00
+1F00
+2390
+01E0
+0000
+0000
+ENDCHAR
+STARTCHAR R
+ENCODING 82
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+FF00
+6180
+60C0
+60C0
+60C0
+6080
+7F00
+7C00
+6E00
+6700
+6380
+61C0
+60E0
+F070
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR S
+ENCODING 83
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1FE0
+3060
+6020
+6020
+7000
+3C00
+1E00
+0780
+01C0
+00E0
+4060
+4060
+60C0
+7F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR T
+ENCODING 84
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+7FE0
+4620
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U
+ENCODING 85
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+F070
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+7040
+3FC0
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR V
+ENCODING 86
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+E0E0
+6040
+3080
+3080
+3080
+1900
+1900
+1900
+0A00
+0E00
+0E00
+0400
+0400
+0400
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR W
+ENCODING 87
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+FEF0
+6620
+6620
+6620
+7620
+7740
+3340
+3740
+3BC0
+3B80
+1980
+1980
+1980
+1980
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR X
+ENCODING 88
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+F070
+6020
+3040
+3880
+1880
+0D00
+0600
+0600
+0B00
+1180
+11C0
+20C0
+4060
+E0F0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Y
+ENCODING 89
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+F070
+6020
+3040
+1880
+1880
+0D00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Z
+ENCODING 90
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+3FE0
+20C0
+00C0
+0180
+0180
+0300
+0300
+0600
+0600
+0C00
+0C00
+1800
+1820
+3FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR bracketleft
+ENCODING 91
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0F80
+0F80
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR backslash
+ENCODING 92
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+6000
+3000
+3000
+1800
+1800
+0C00
+0C00
+0600
+0600
+0300
+0300
+0180
+0180
+00C0
+00C0
+0060
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR bracketright
+ENCODING 93
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1F00
+1F00
+0300
+0300
+0300
+0300
+0300
+0300
+0300
+0300
+0300
+0300
+0300
+1F00
+1F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR asciicircum
+ENCODING 94
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0400
+0E00
+1B00
+3180
+60C0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR underscore
+ENCODING 95
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FFF0
+FFF0
+0000
+0000
+ENDCHAR
+STARTCHAR grave
+ENCODING 96
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0100
+0300
+0600
+0600
+0780
+0780
+0300
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR a
+ENCODING 97
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+18C0
+10C0
+03C0
+1CC0
+30C0
+30C0
+30C0
+39C0
+1EE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR b
+ENCODING 98
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+2000
+6000
+E000
+6000
+6000
+6780
+6FC0
+70E0
+6060
+6060
+6060
+6060
+7060
+78C0
+4F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR c
+ENCODING 99
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1F80
+31C0
+20C0
+6000
+6000
+6000
+6000
+7040
+30C0
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR d
+ENCODING 100
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0060
+00E0
+0060
+0060
+0060
+0F60
+31E0
+20E0
+6060
+6060
+6060
+6060
+70E0
+3960
+1E70
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR e
+ENCODING 101
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0F00
+30C0
+6060
+6060
+7FE0
+6000
+6000
+3000
+1860
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR f
+ENCODING 102
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0380
+04C0
+04C0
+0C00
+0C00
+0C00
+0C00
+3F80
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+1E00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR g
+ENCODING 103
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1F20
+31E0
+60C0
+60C0
+60C0
+3180
+3F00
+6000
+7FC0
+3FE0
+2060
+4020
+4020
+7FC0
+3F80
+ENDCHAR
+STARTCHAR h
+ENCODING 104
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1000
+3000
+7000
+3000
+3000
+3780
+39C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+79E0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR i
+ENCODING 105
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0600
+0600
+0000
+0000
+1E00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR j
+ENCODING 106
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+00C0
+00C0
+0000
+0000
+03C0
+00C0
+00C0
+00C0
+00C0
+00C0
+00C0
+00C0
+00C0
+00C0
+20C0
+30C0
+3880
+1F00
+0E00
+ENDCHAR
+STARTCHAR k
+ENCODING 107
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+6000
+E000
+6000
+6000
+6000
+61C0
+6300
+6600
+7C00
+7800
+7C00
+6E00
+6700
+6380
+F1E0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR l
+ENCODING 108
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1E00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR m
+ENCODING 109
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+DDC0
+6EE0
+6660
+6660
+6660
+6660
+6660
+6660
+6660
+EF70
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR n
+ENCODING 110
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+2780
+79C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+79E0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR o
+ENCODING 111
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+11C0
+20E0
+6060
+6060
+6060
+6060
+7040
+3880
+1F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR p
+ENCODING 112
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+EF80
+71C0
+60E0
+6060
+6060
+6060
+6060
+6040
+7080
+7F00
+6000
+6000
+6000
+6000
+F000
+ENDCHAR
+STARTCHAR q
+ENCODING 113
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0F20
+11E0
+20E0
+6060
+6060
+6060
+6060
+7060
+38E0
+1FE0
+0060
+0060
+0060
+0060
+00F0
+ENDCHAR
+STARTCHAR r
+ENCODING 114
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7380
+34C0
+38C0
+3000
+3000
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR s
+ENCODING 115
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1FC0
+30C0
+3040
+3800
+1E00
+0780
+01C0
+20C0
+30C0
+3F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR t
+ENCODING 116
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0400
+0400
+0C00
+7FC0
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C20
+0E40
+0780
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR u
+ENCODING 117
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+79E0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+39C0
+1E60
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR v
+ENCODING 118
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+F070
+6020
+3040
+3040
+1880
+1880
+0D00
+0D00
+0600
+0600
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR w
+ENCODING 119
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF70
+6620
+6620
+6620
+3740
+3B40
+3B40
+1980
+1980
+1980
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR x
+ENCODING 120
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+F8F0
+7040
+3880
+1D00
+0E00
+0700
+0B80
+11C0
+20E0
+F1F0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR y
+ENCODING 121
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+F0F0
+6020
+3040
+3040
+1880
+1880
+0D00
+0D00
+0600
+0600
+0400
+0C00
+0800
+7800
+7000
+ENDCHAR
+STARTCHAR z
+ENCODING 122
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7FE0
+60E0
+41C0
+0380
+0700
+0E00
+1C00
+3820
+7060
+7FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR braceleft
+ENCODING 123
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0380
+0600
+0600
+0600
+0600
+0600
+0C00
+3800
+0C00
+0600
+0600
+0600
+0600
+0600
+0380
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR bar
+ENCODING 124
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR braceright
+ENCODING 125
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1C00
+0600
+0600
+0600
+0600
+0600
+0300
+01C0
+0300
+0600
+0600
+0600
+0600
+0600
+1C00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR asciitilde
+ENCODING 126
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+1C20
+3E60
+67C0
+4380
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR nbspace
+ENCODING 160
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR exclamdown
+ENCODING 161
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0600
+0600
+0000
+0000
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR cent
+ENCODING 162
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0600
+0600
+1F80
+36C0
+26C0
+6600
+6600
+6600
+6600
+7640
+36C0
+1F80
+0600
+0600
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR sterling
+ENCODING 163
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0F80
+1CC0
+18C0
+1800
+1800
+1800
+7E00
+7E00
+1800
+1800
+1800
+1800
+3E20
+7FE0
+61C0
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR currency
+ENCODING 164
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+6060
+2F40
+1F80
+30C0
+30C0
+30C0
+30C0
+1F80
+2F40
+6060
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR yen
+ENCODING 165
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+6060
+6060
+30C0
+1980
+1980
+0F00
+0600
+0600
+1F80
+1F80
+0600
+0600
+0600
+0600
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR brokenbar
+ENCODING 166
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0000
+0000
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR section
+ENCODING 167
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1F00
+3180
+3180
+3000
+3000
+1F00
+3180
+3180
+1F00
+0180
+0180
+3180
+3180
+1F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR dieresis
+ENCODING 168
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+1980
+1980
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR copyright
+ENCODING 169
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1F80
+2040
+4F20
+59A0
+5820
+5820
+59A0
+4F20
+2040
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ordfeminine
+ENCODING 170
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1F00
+3180
+0180
+0780
+1980
+3180
+3180
+3380
+1DC0
+0000
+3FC0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR guillemotleft
+ENCODING 171
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0660
+0CC0
+1980
+3300
+6600
+3300
+1980
+0CC0
+0660
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR logicalnot
+ENCODING 172
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3FC0
+3FC0
+00C0
+00C0
+00C0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR softhyphen
+ENCODING 173
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7FE0
+7FE0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR registered
+ENCODING 174
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1F80
+2040
+5F20
+59A0
+59A0
+5F20
+59A0
+59A0
+2040
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR macron
+ENCODING 175
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+1F80
+1F80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR degree
+ENCODING 176
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0F00
+1980
+1980
+1980
+0F00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR plusminus
+ENCODING 177
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0600
+0600
+0600
+0600
+7FE0
+7FE0
+0600
+0600
+0600
+0600
+0000
+7FE0
+7FE0
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR twosuperior
+ENCODING 178
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0F00
+1F80
+3180
+2180
+0300
+0600
+0C00
+1840
+3FC0
+3FC0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR threesuperior
+ENCODING 179
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0F00
+1B80
+2180
+0180
+0F00
+0380
+0180
+3180
+3F80
+1F00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR acute
+ENCODING 180
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0300
+0600
+0C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR mu
+ENCODING 181
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+39C0
+36E0
+3000
+3000
+6000
+0000
+0000
+ENDCHAR
+STARTCHAR paragraph
+ENCODING 182
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1FF0
+3CC0
+7CC0
+7CC0
+7CC0
+3CC0
+1CC0
+0CC0
+0CC0
+0CC0
+0CC0
+0CC0
+0CC0
+1CE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR periodcentered
+ENCODING 183
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0600
+0F00
+0F00
+0600
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR cedilla
+ENCODING 184
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0600
+0300
+0180
+0F00
+0000
+ENDCHAR
+STARTCHAR onesuperior
+ENCODING 185
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0200
+0600
+0E00
+1600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ordmasculine
+ENCODING 186
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0700
+1980
+10C0
+30C0
+30C0
+30C0
+3080
+1980
+0E00
+0000
+3FC0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR guillemotright
+ENCODING 187
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+6600
+3300
+1980
+0CC0
+0660
+0CC0
+1980
+3300
+6600
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR onequarter
+ENCODING 188
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1000
+3000
+1000
+1040
+1080
+1100
+3A40
+04C0
+0940
+1240
+2440
+47E0
+0040
+0040
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR onehalf
+ENCODING 189
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1000
+3000
+1000
+1040
+1080
+1100
+3A00
+05C0
+0A20
+1020
+20C0
+4100
+0200
+03E0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR threequarters
+ENCODING 190
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+3800
+4400
+0400
+1840
+0480
+4500
+3A40
+04C0
+0940
+1240
+2440
+47E0
+0040
+0040
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR questiondown
+ENCODING 191
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0300
+0300
+0000
+0000
+0300
+0300
+0600
+0C00
+1800
+3000
+3000
+3040
+39C0
+1F80
+0F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Agrave
+ENCODING 192
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0C00
+0600
+0300
+0000
+0600
+0600
+0B00
+0B00
+1980
+1180
+3FC0
+20C0
+6060
+4060
+E0F0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Aacute
+ENCODING 193
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0300
+0600
+0C00
+0000
+0600
+0600
+0B00
+0B00
+1980
+1180
+3FC0
+20C0
+6060
+4060
+E0F0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Acircumflex
+ENCODING 194
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0600
+0F00
+1980
+0000
+0600
+0600
+0B00
+0B00
+1980
+1180
+3FC0
+20C0
+6060
+4060
+E0F0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Atilde
+ENCODING 195
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1C40
+3FC0
+2380
+0000
+0600
+0600
+0B00
+0B00
+1980
+1180
+3FC0
+20C0
+6060
+4060
+E0F0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Adieresis
+ENCODING 196
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1980
+1980
+0000
+0400
+0600
+0600
+0B00
+0B00
+1980
+1180
+3FC0
+20C0
+6060
+4060
+E0F0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Aring
+ENCODING 197
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0F00
+1980
+0F00
+0400
+0600
+0600
+0B00
+0B00
+1980
+1180
+3FC0
+20C0
+6060
+4060
+E0F0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR AE
+ENCODING 198
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+03F0
+0710
+0710
+0B00
+0B00
+0B20
+13E0
+1320
+3F00
+2300
+2300
+4310
+4310
+E7F0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Ccedilla
+ENCODING 199
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0FC0
+1060
+2020
+2000
+6000
+6000
+6000
+6000
+6000
+6000
+2000
+3020
+1840
+0F80
+0600
+0300
+0180
+0F00
+0000
+ENDCHAR
+STARTCHAR Egrave
+ENCODING 200
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0C00
+0600
+0100
+7FE0
+3020
+3000
+3000
+3080
+3F80
+3080
+3000
+3000
+3020
+3020
+7FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Eacute
+ENCODING 201
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0300
+0600
+0800
+7FE0
+3020
+3000
+3000
+3080
+3F80
+3080
+3000
+3000
+3020
+3020
+7FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Ecircumflex
+ENCODING 202
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0700
+0D80
+0000
+7FE0
+3020
+3000
+3000
+3080
+3F80
+3080
+3000
+3000
+3020
+3020
+7FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Edieresis
+ENCODING 203
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1980
+1980
+0000
+7FE0
+3020
+3000
+3000
+3080
+3F80
+3080
+3000
+3000
+3020
+3020
+7FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Igrave
+ENCODING 204
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1800
+0C00
+0200
+1F80
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Iacute
+ENCODING 205
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0180
+0300
+0400
+1F80
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Icircumflex
+ENCODING 206
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0600
+0F00
+1980
+0000
+1F80
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Idieresis
+ENCODING 207
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1980
+1980
+0000
+1F80
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Eth
+ENCODING 208
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+7F00
+31C0
+30C0
+3060
+3060
+3060
+FC60
+FC60
+3060
+3060
+3060
+3040
+3180
+7E00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Ntilde
+ENCODING 209
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1C40
+3FC0
+2380
+C070
+6020
+7020
+7820
+5C20
+4E20
+4720
+43A0
+41E0
+40E0
+4060
+E030
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Ograve
+ENCODING 210
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0C00
+0600
+0100
+0F80
+11C0
+20C0
+2060
+6060
+6060
+6060
+6060
+2040
+3040
+1880
+0F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Oacute
+ENCODING 211
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0180
+0300
+0400
+0F80
+11C0
+20C0
+2060
+6060
+6060
+6060
+6060
+2040
+3040
+1880
+0F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Ocircumflex
+ENCODING 212
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0600
+0900
+1080
+0F00
+11C0
+20C0
+2060
+6060
+6060
+6060
+6060
+2040
+3040
+1880
+0F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Otilde
+ENCODING 213
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1C60
+3FC0
+2280
+0F80
+11C0
+20C0
+2060
+6060
+6060
+6060
+6060
+2040
+3040
+1880
+0F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Odieresis
+ENCODING 214
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1980
+1980
+0000
+0F80
+11C0
+20C0
+2060
+6060
+6060
+6060
+6060
+2040
+3040
+1880
+0F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR multiply
+ENCODING 215
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+6060
+30C0
+1980
+0F00
+0600
+0F00
+1980
+30C0
+6060
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Oslash
+ENCODING 216
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0080
+0F80
+11C0
+21C0
+2260
+6260
+6260
+6460
+6460
+6460
+2840
+3840
+1880
+1F00
+1000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Ugrave
+ENCODING 217
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0C00
+0600
+E330
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+7040
+3FC0
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Uacute
+ENCODING 218
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0180
+0300
+E630
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+7040
+3FC0
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Ucircumflex
+ENCODING 219
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0700
+0D80
+E8B0
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+7040
+3FC0
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Udieresis
+ENCODING 220
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1980
+1980
+E030
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+7040
+3FC0
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Yacute
+ENCODING 221
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0180
+0300
+E670
+6020
+3040
+1880
+0D00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Thorn
+ENCODING 222
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+7800
+3000
+3F80
+30C0
+3060
+3060
+3060
+30C0
+3F80
+3000
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR germandbls
+ENCODING 223
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0F00
+1980
+30C0
+30C0
+30C0
+3180
+3780
+3180
+30C0
+30C0
+30C0
+30C0
+3180
+7700
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR agrave
+ENCODING 224
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0C00
+0600
+0300
+0000
+0F80
+18C0
+10C0
+03C0
+1CC0
+30C0
+30C0
+30C0
+39C0
+1EE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR aacute
+ENCODING 225
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0180
+0300
+0600
+0000
+0F80
+18C0
+10C0
+03C0
+1CC0
+30C0
+30C0
+30C0
+39C0
+1EE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR acircumflex
+ENCODING 226
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0200
+0700
+0D80
+18C0
+0000
+0F80
+18C0
+10C0
+03C0
+1CC0
+30C0
+30C0
+30C0
+39C0
+1EE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR atilde
+ENCODING 227
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0E40
+1FC0
+1380
+0000
+0000
+0F80
+18C0
+10C0
+03C0
+1CC0
+30C0
+30C0
+30C0
+39C0
+1EE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR adieresis
+ENCODING 228
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1980
+1980
+0000
+0000
+0F80
+18C0
+10C0
+03C0
+1CC0
+30C0
+30C0
+30C0
+39C0
+1EE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR aring
+ENCODING 229
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0700
+0D80
+0D80
+0700
+0000
+0F80
+18C0
+10C0
+03C0
+1CC0
+30C0
+30C0
+30C0
+39C0
+1EE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ae
+ENCODING 230
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+3DE0
+6630
+4630
+0630
+3FF0
+6600
+C600
+C600
+E730
+7DE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ccedilla
+ENCODING 231
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1F80
+31C0
+20C0
+6000
+6000
+6000
+6000
+7040
+30C0
+1F80
+0600
+0300
+0180
+0F00
+0000
+ENDCHAR
+STARTCHAR egrave
+ENCODING 232
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0C00
+0600
+0300
+0000
+0F00
+30C0
+6060
+6060
+7FE0
+6000
+6000
+3000
+1860
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR eacute
+ENCODING 233
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0180
+0300
+0600
+0000
+0F00
+30C0
+6060
+6060
+7FE0
+6000
+6000
+3000
+1860
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ecircumflex
+ENCODING 234
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0200
+0700
+0D80
+18C0
+0000
+0F00
+30C0
+6060
+6060
+7FE0
+6000
+6000
+3000
+1860
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR edieresis
+ENCODING 235
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1980
+1980
+0000
+0000
+0F00
+30C0
+6060
+6060
+7FE0
+6000
+6000
+3000
+1860
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR igrave
+ENCODING 236
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1800
+0C00
+0600
+0000
+1E00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR iacute
+ENCODING 237
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0180
+0300
+0600
+0000
+1E00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR icircumflex
+ENCODING 238
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0400
+0E00
+1B00
+3180
+0000
+1E00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR idieresis
+ENCODING 239
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1980
+1980
+0000
+0000
+1E00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR eth
+ENCODING 240
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1C00
+06C0
+0300
+0D80
+00C0
+00C0
+0060
+0F60
+18E0
+3060
+3060
+3060
+3060
+18C0
+0F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ntilde
+ENCODING 241
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1C40
+3FC0
+2380
+0000
+0000
+2780
+79C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+79E0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ograve
+ENCODING 242
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0C00
+0600
+0300
+0000
+0F80
+11C0
+20E0
+6060
+6060
+6060
+6060
+7040
+3880
+1F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR oacute
+ENCODING 243
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0180
+0300
+0600
+0000
+0F80
+11C0
+20E0
+6060
+6060
+6060
+6060
+7040
+3880
+1F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ocircumflex
+ENCODING 244
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0200
+0700
+0D80
+18C0
+0000
+0F80
+11C0
+20E0
+6060
+6060
+6060
+6060
+7040
+3880
+1F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR otilde
+ENCODING 245
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1C40
+3FC0
+2380
+0000
+0000
+0F80
+11C0
+20E0
+6060
+6060
+6060
+6060
+7040
+3880
+1F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR odieresis
+ENCODING 246
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1980
+1980
+0000
+0000
+0F80
+11C0
+20E0
+6060
+6060
+6060
+6060
+7040
+3880
+1F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR divide
+ENCODING 247
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0600
+0600
+0000
+0000
+7FE0
+7FE0
+0000
+0000
+0600
+0600
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR oslash
+ENCODING 248
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0010
+0FA0
+11C0
+20E0
+6160
+6260
+6460
+6860
+7040
+3880
+5F00
+8000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ugrave
+ENCODING 249
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1800
+0C00
+0600
+0000
+79E0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+39C0
+1E60
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR uacute
+ENCODING 250
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0180
+0300
+0600
+0000
+79E0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+39C0
+1E60
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ucircumflex
+ENCODING 251
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0200
+0700
+0D80
+18C0
+0000
+79E0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+39C0
+1E60
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR udieresis
+ENCODING 252
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1980
+1980
+0000
+0000
+79E0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+39C0
+1E60
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR yacute
+ENCODING 253
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0180
+0300
+0600
+0000
+F0F0
+6020
+3040
+3040
+1880
+1880
+0D00
+0D00
+0600
+0600
+0400
+0C00
+0800
+7800
+7000
+ENDCHAR
+STARTCHAR thorn
+ENCODING 254
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7800
+3000
+3000
+3F80
+30C0
+3060
+3060
+30C0
+3F80
+3000
+3000
+3000
+3000
+3000
+7800
+ENDCHAR
+STARTCHAR ydieresis
+ENCODING 255
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1980
+1980
+0000
+0000
+F0F0
+6020
+3040
+3040
+1880
+1880
+0D00
+0D00
+0600
+0600
+0400
+0C00
+0800
+7800
+7000
+ENDCHAR
+STARTCHAR Amacron
+ENCODING 256
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+1F80
+1F80
+0000
+0600
+0600
+0B00
+0B00
+0900
+1180
+1180
+1080
+3FC0
+20C0
+2040
+4060
+4060
+E0F0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR amacron
+ENCODING 257
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0FC0
+0FC0
+0000
+0000
+0F80
+18C0
+10C0
+03C0
+1CC0
+30C0
+30C0
+30C0
+39C0
+1EE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Abreve
+ENCODING 258
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+1B00
+1B00
+0E00
+0600
+0600
+0B00
+0B00
+0900
+1180
+1180
+1080
+3FC0
+20C0
+2040
+4060
+4060
+E0F0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR abreve
+ENCODING 259
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0D80
+0D80
+0700
+0000
+0000
+0F80
+18C0
+10C0
+03C0
+1CC0
+30C0
+30C0
+30C0
+39C0
+1EE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Aogonek
+ENCODING 260
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0600
+0600
+0B00
+0B00
+0900
+1180
+1180
+1080
+3FC0
+20C0
+2040
+4060
+4060
+E0F0
+00C0
+0180
+0300
+01E0
+0000
+ENDCHAR
+STARTCHAR aogonek
+ENCODING 261
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+18C0
+10C0
+03C0
+1CC0
+30C0
+30C0
+30C0
+39C0
+1EE0
+00C0
+0180
+0300
+01E0
+0000
+ENDCHAR
+STARTCHAR Cacute
+ENCODING 262
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0300
+0600
+0C00
+0FC0
+1060
+2020
+2000
+6000
+6000
+6000
+6000
+6000
+6000
+2000
+3020
+1840
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR cacute
+ENCODING 263
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0300
+0600
+0C00
+0000
+1F80
+31C0
+20C0
+6000
+6000
+6000
+6000
+7040
+30C0
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Ccircumflex
+ENCODING 264
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0700
+0D80
+0000
+0FC0
+1060
+2020
+2000
+6000
+6000
+6000
+6000
+6000
+6000
+2000
+3020
+1840
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ccircumflex
+ENCODING 265
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0400
+0E00
+1B00
+3180
+0000
+1F80
+31C0
+20C0
+6000
+6000
+6000
+6000
+7040
+30C0
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Cdotaccent
+ENCODING 266
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0000
+0FC0
+1060
+2020
+2000
+6000
+6000
+6000
+6000
+6000
+6000
+2000
+3020
+1840
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR cdotaccent
+ENCODING 267
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0600
+0600
+0000
+1F80
+31C0
+20C0
+6000
+6000
+6000
+6000
+7040
+30C0
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Ccaron
+ENCODING 268
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+18C0
+0D80
+0700
+0FC0
+1060
+2020
+2000
+6000
+6000
+6000
+6000
+6000
+6000
+2000
+3020
+1840
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ccaron
+ENCODING 269
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+3180
+1B00
+0E00
+0400
+0000
+1F80
+31C0
+20C0
+6000
+6000
+6000
+6000
+7040
+30C0
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Dcaron
+ENCODING 270
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+3180
+1B00
+0E00
+FF00
+61C0
+60C0
+6060
+6060
+6060
+6060
+6060
+6060
+6060
+6060
+6040
+6180
+FE00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR dcaron
+ENCODING 271
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+3180
+1B00
+0E60
+04E0
+0060
+0060
+0060
+0F60
+31E0
+20E0
+6060
+6060
+6060
+6060
+70E0
+3960
+1E70
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Dstroke
+ENCODING 272
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+FF00
+61C0
+60C0
+6060
+6060
+6060
+FC60
+6060
+6060
+6060
+6060
+6040
+6180
+FE00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR dstroke
+ENCODING 273
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0060
+00E0
+0060
+07F0
+0060
+0F60
+31E0
+20E0
+6060
+6060
+6060
+6060
+70E0
+3960
+1E70
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Emacron
+ENCODING 274
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+1F80
+1F80
+0000
+7FC0
+3040
+3040
+3000
+3000
+3080
+3F80
+3080
+3000
+3000
+3000
+3020
+3020
+7FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR emacron
+ENCODING 275
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1F80
+1F80
+0000
+0000
+0F00
+30C0
+6060
+6060
+7FE0
+6000
+6000
+3000
+1860
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Ebreve
+ENCODING 276
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0D80
+0D80
+0700
+7FC0
+3040
+3040
+3000
+3000
+3080
+3F80
+3080
+3000
+3000
+3000
+3020
+3020
+7FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ebreve
+ENCODING 277
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0D80
+0D80
+0700
+0000
+0000
+0F00
+30C0
+6060
+6060
+7FE0
+6000
+6000
+3000
+1860
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Edotaccent
+ENCODING 278
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0000
+7FC0
+3040
+3040
+3000
+3000
+3080
+3F80
+3080
+3000
+3000
+3000
+3020
+3020
+7FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR edotaccent
+ENCODING 279
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0600
+0600
+0000
+0F00
+30C0
+6060
+6060
+7FE0
+6000
+6000
+3000
+1860
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Eogonek
+ENCODING 280
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+7FC0
+3040
+3040
+3000
+3000
+3080
+3F80
+3080
+3000
+3000
+3000
+3020
+3020
+7FE0
+00C0
+0180
+0300
+01E0
+0000
+ENDCHAR
+STARTCHAR eogonek
+ENCODING 281
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0F00
+30C0
+6060
+6060
+7FE0
+6000
+6000
+3000
+1860
+0F80
+0600
+0C00
+1800
+0F00
+0000
+ENDCHAR
+STARTCHAR Ecaron
+ENCODING 282
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+18C0
+0D80
+0700
+7FC0
+3040
+3040
+3000
+3000
+3080
+3F80
+3080
+3000
+3000
+3000
+3020
+3020
+7FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ecaron
+ENCODING 283
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+18C0
+0D80
+0700
+0200
+0000
+0F00
+30C0
+6060
+6060
+7FE0
+6000
+6000
+3000
+1860
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Gcircumflex
+ENCODING 284
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0700
+0D80
+0000
+0FC0
+1060
+2020
+2000
+6000
+6000
+6000
+6000
+61F0
+6060
+2060
+3060
+1860
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR gcircumflex
+ENCODING 285
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0200
+0700
+0D80
+18C0
+0000
+1F20
+31E0
+60C0
+60C0
+60C0
+3180
+3F00
+6000
+7FC0
+3FE0
+2060
+4020
+4020
+7FC0
+3F80
+ENDCHAR
+STARTCHAR Gbreve
+ENCODING 286
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0D80
+0D80
+0700
+0FC0
+1060
+2020
+2000
+6000
+6000
+6000
+6000
+61F0
+6060
+2060
+3060
+1860
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR gbreve
+ENCODING 287
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1B00
+1B00
+0E00
+0000
+0000
+1F20
+31E0
+60C0
+60C0
+60C0
+3180
+3F00
+6000
+7FC0
+3FE0
+2060
+4020
+4020
+7FC0
+3F80
+ENDCHAR
+STARTCHAR Gdotaccent
+ENCODING 288
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0300
+0300
+0000
+0FC0
+1060
+2020
+2000
+6000
+6000
+6000
+6000
+61F0
+6060
+2060
+3060
+1860
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR gdotaccent
+ENCODING 289
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0600
+0600
+0000
+1F20
+31E0
+60C0
+60C0
+60C0
+3180
+3F00
+6000
+7FC0
+3FE0
+2060
+4020
+4020
+7FC0
+3F80
+ENDCHAR
+STARTCHAR Gcommaaccent
+ENCODING 290
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0FC0
+1060
+2020
+2000
+6000
+6000
+6000
+6000
+61F0
+6060
+2060
+3060
+1860
+0F80
+0600
+0300
+0180
+0F00
+0000
+ENDCHAR
+STARTCHAR gcommaaccent
+ENCODING 291
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0600
+0C00
+0E00
+0E00
+0000
+1F20
+31E0
+60C0
+60C0
+60C0
+3180
+3F00
+6000
+7FC0
+3FE0
+2060
+4020
+4020
+7FC0
+3F80
+ENDCHAR
+STARTCHAR Hcircumflex
+ENCODING 292
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0700
+0D80
+0000
+F0F0
+6060
+6060
+6060
+6060
+6060
+7FE0
+6060
+6060
+6060
+6060
+6060
+6060
+F0F0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR hcircumflex
+ENCODING 293
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0380
+16C0
+3000
+7000
+3000
+3000
+3780
+39C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+79E0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Hstroke
+ENCODING 294
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+F0F0
+6060
+6060
+FFF0
+6060
+6060
+7FE0
+6060
+6060
+6060
+6060
+6060
+6060
+F0F0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR hstroke
+ENCODING 295
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1000
+3000
+7000
+7E00
+3000
+3780
+39C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+79E0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Itilde
+ENCODING 296
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0E40
+1FC0
+1380
+0000
+1F80
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR itilde
+ENCODING 297
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1C80
+3F80
+2700
+0000
+0000
+1E00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Imacron
+ENCODING 298
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+1F80
+1F80
+0000
+1F80
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR imacron
+ENCODING 299
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1F80
+1F80
+0000
+0000
+1E00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Ibreve
+ENCODING 300
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+1980
+1980
+0F00
+1F80
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ibreve
+ENCODING 301
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1B00
+1B00
+0E00
+0000
+0000
+1E00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Iogonek
+ENCODING 302
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1F80
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0600
+0C00
+1800
+0F00
+0000
+ENDCHAR
+STARTCHAR iogonek
+ENCODING 303
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0600
+0600
+0000
+0000
+1E00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0600
+0C00
+1800
+0F00
+0000
+ENDCHAR
+STARTCHAR Idotaccent
+ENCODING 304
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0000
+1F80
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR dotlessi
+ENCODING 305
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1E00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR IJ
+ENCODING 306
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+78F0
+3060
+3060
+3060
+3060
+3060
+3060
+3060
+3060
+3060
+3060
+3060
+3360
+79C0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ij
+ENCODING 307
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+3060
+3060
+0000
+0000
+70E0
+3060
+3060
+3060
+3060
+3060
+3060
+3060
+3060
+7860
+0060
+0C60
+0E40
+07C0
+0380
+ENDCHAR
+STARTCHAR Jcircumflex
+ENCODING 308
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0E00
+1B00
+0000
+1F80
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0400
+3800
+3000
+ENDCHAR
+STARTCHAR jcircumflex
+ENCODING 309
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0200
+0700
+0D80
+18C0
+0000
+03C0
+00C0
+00C0
+00C0
+00C0
+00C0
+00C0
+00C0
+00C0
+00C0
+20C0
+30C0
+3880
+1F00
+0E00
+ENDCHAR
+STARTCHAR Kcommaaccent
+ENCODING 310
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+F0E0
+6180
+6300
+6600
+6C00
+7800
+7800
+7C00
+6E00
+6700
+6380
+61C0
+60E0
+F070
+0600
+0300
+0180
+0F00
+0000
+ENDCHAR
+STARTCHAR kcommaaccent
+ENCODING 311
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+6000
+E000
+6000
+6000
+6000
+61C0
+6300
+6600
+7C00
+7800
+7C00
+6E00
+6700
+6380
+F1E0
+0600
+0300
+0180
+0F00
+0000
+ENDCHAR
+STARTCHAR kra
+ENCODING 312
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+6000
+E1C0
+6300
+6600
+7C00
+7800
+7C00
+6E00
+6700
+6380
+F1E0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Lacute
+ENCODING 313
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0C00
+1800
+3000
+7800
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3020
+3020
+7FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR lacute
+ENCODING 314
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0300
+0600
+0C00
+0000
+1E00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Lcommaaccent
+ENCODING 315
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+7800
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3020
+3020
+7FE0
+0600
+0300
+0180
+0F00
+0000
+ENDCHAR
+STARTCHAR lcommaaccent
+ENCODING 316
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1E00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0600
+0300
+0180
+0F00
+0000
+ENDCHAR
+STARTCHAR Lcaron
+ENCODING 317
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0C60
+06C0
+0380
+7900
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3020
+3020
+7FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR lcaron
+ENCODING 318
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+18C0
+0D80
+0700
+0000
+1E00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Ldot
+ENCODING 319
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+7800
+3000
+3000
+3000
+3000
+3180
+3180
+3000
+3000
+3000
+3000
+3020
+3020
+7FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ldot
+ENCODING 320
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1E00
+0600
+0600
+0600
+0600
+0600
+0660
+0660
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Lslash
+ENCODING 321
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+7800
+3000
+3000
+3400
+3800
+3000
+3000
+7000
+B000
+3000
+3000
+3020
+3020
+7FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR lslash
+ENCODING 322
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1E00
+0600
+0600
+0680
+0700
+0600
+0600
+0E00
+1600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Nacute
+ENCODING 323
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0180
+0300
+0600
+C070
+6020
+7020
+7820
+5820
+4C20
+4620
+4720
+4320
+41A0
+40E0
+40E0
+4060
+E030
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR nacute
+ENCODING 324
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0180
+0300
+0600
+0000
+2780
+79C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+79E0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Ncommaaccent
+ENCODING 325
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+C070
+6020
+7020
+7820
+5820
+4C20
+4620
+4720
+4320
+41A0
+40E0
+40E0
+4060
+E030
+0600
+0300
+0180
+0F00
+0000
+ENDCHAR
+STARTCHAR ncommaaccent
+ENCODING 326
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+2780
+79C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+79E0
+0600
+0300
+0180
+0F00
+0000
+ENDCHAR
+STARTCHAR Ncaron
+ENCODING 327
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+18C0
+0D80
+0700
+C270
+6020
+7020
+7820
+5820
+4C20
+4620
+4720
+4320
+41A0
+40E0
+40E0
+4060
+E030
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ncaron
+ENCODING 328
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+18C0
+0D80
+0700
+0200
+0000
+2780
+79C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+79E0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR napostrophe
+ENCODING 329
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+E000
+E000
+6000
+6000
+4000
+8000
+2780
+79C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+79E0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Eng
+ENCODING 330
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+C070
+6020
+7020
+7820
+5820
+4C20
+4620
+4720
+4320
+41A0
+40E0
+40E0
+4060
+E060
+0060
+0060
+0040
+0380
+0300
+ENDCHAR
+STARTCHAR eng
+ENCODING 331
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+2780
+79C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+78C0
+00C0
+00C0
+0080
+0700
+0600
+ENDCHAR
+STARTCHAR Omacron
+ENCODING 332
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+1F80
+1F80
+0000
+0F00
+11C0
+20C0
+2060
+6060
+6060
+6060
+6060
+6060
+6060
+2040
+3040
+1880
+0F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR omacron
+ENCODING 333
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1F80
+1F80
+0000
+0000
+0F80
+11C0
+20E0
+6060
+6060
+6060
+6060
+7040
+3880
+1F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Obreve
+ENCODING 334
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0D80
+0D80
+0700
+0F00
+11C0
+20C0
+2060
+6060
+6060
+6060
+6060
+6060
+6060
+2040
+3040
+1880
+0F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR obreve
+ENCODING 335
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0D80
+0D80
+0700
+0000
+0F80
+11C0
+20E0
+6060
+6060
+6060
+6060
+7040
+3880
+1F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Ohungarumlaut
+ENCODING 336
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0360
+06C0
+0D80
+0F00
+11C0
+20C0
+2060
+6060
+6060
+6060
+6060
+6060
+6060
+2040
+3040
+1880
+0F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ohungarumlaut
+ENCODING 337
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+06C0
+0D80
+1B00
+0000
+0F80
+11C0
+20E0
+6060
+6060
+6060
+6060
+7040
+3880
+1F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR OE
+ENCODING 338
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1FE0
+2620
+4620
+4600
+C600
+C610
+C7F0
+C610
+C600
+C600
+4600
+6610
+3610
+1FF0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR oe
+ENCODING 339
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1DE0
+2230
+4230
+C230
+C3F0
+C200
+C200
+E200
+7330
+3DE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Racute
+ENCODING 340
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0180
+0300
+0600
+FF00
+6180
+60C0
+60C0
+60C0
+6080
+7F00
+7C00
+6E00
+6700
+6380
+61C0
+60E0
+F070
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR racute
+ENCODING 341
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0300
+0600
+0C00
+0000
+7380
+34C0
+38C0
+3000
+3000
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Rcommaaccent
+ENCODING 342
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+FF00
+6180
+60C0
+60C0
+60C0
+6080
+7F00
+7C00
+6E00
+6700
+6380
+61C0
+60E0
+F070
+0600
+0300
+0180
+0F00
+0000
+ENDCHAR
+STARTCHAR rcommaaccent
+ENCODING 343
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7380
+34C0
+38C0
+3000
+3000
+3000
+3000
+3000
+3000
+7800
+1800
+0C00
+0600
+3C00
+0000
+ENDCHAR
+STARTCHAR Rcaron
+ENCODING 344
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+3180
+1B00
+0E00
+FF00
+6180
+60C0
+60C0
+60C0
+6080
+7F00
+7C00
+6E00
+6700
+6380
+61C0
+60E0
+F070
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR rcaron
+ENCODING 345
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+3180
+1B00
+0E00
+0400
+0000
+7380
+34C0
+38C0
+3000
+3000
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Sacute
+ENCODING 346
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0180
+0300
+0600
+1FE0
+3060
+6020
+6020
+7000
+3C00
+1E00
+0780
+01C0
+00E0
+4060
+4060
+60C0
+7F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR sacute
+ENCODING 347
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0180
+0300
+0600
+0000
+1FC0
+30C0
+3040
+3800
+1E00
+0780
+01C0
+20C0
+30C0
+3F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Scircumflex
+ENCODING 348
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0700
+0D80
+0000
+1FE0
+3060
+6020
+6020
+7000
+3C00
+1E00
+0780
+01C0
+00E0
+4060
+4060
+60C0
+7F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR scircumflex
+ENCODING 349
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0200
+0700
+0D80
+18C0
+0000
+1FC0
+30C0
+3040
+3800
+1E00
+0780
+01C0
+20C0
+30C0
+3F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Scedilla
+ENCODING 350
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1FE0
+3060
+6020
+6020
+7000
+3C00
+1E00
+0780
+01C0
+00E0
+4060
+4060
+60C0
+7F80
+0600
+0300
+0180
+0F00
+0000
+ENDCHAR
+STARTCHAR scedilla
+ENCODING 351
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1FC0
+30C0
+3040
+3800
+1E00
+0780
+01C0
+20C0
+30C0
+3F80
+0600
+0300
+0180
+0F00
+0000
+ENDCHAR
+STARTCHAR Scaron
+ENCODING 352
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+18C0
+0D80
+0700
+1FE0
+3060
+6020
+6020
+7000
+3C00
+1E00
+0780
+01C0
+00E0
+4060
+4060
+60C0
+7F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR scaron
+ENCODING 353
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+18C0
+0D80
+0700
+0200
+0000
+1FC0
+30C0
+3040
+3800
+1E00
+0780
+01C0
+20C0
+30C0
+3F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Tcedilla
+ENCODING 354
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+7FE0
+4620
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0600
+0300
+0180
+0F00
+0000
+ENDCHAR
+STARTCHAR tcedilla
+ENCODING 355
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0400
+0400
+0C00
+7FC0
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C20
+0E40
+0780
+0600
+0300
+0180
+0F00
+0000
+ENDCHAR
+STARTCHAR Tcaron
+ENCODING 356
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+18C0
+0D80
+0700
+7FE0
+4620
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR tcaron
+ENCODING 357
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+3180
+1B00
+0E00
+0000
+0400
+0400
+0C00
+7FC0
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C20
+0E40
+0780
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Tstroke
+ENCODING 358
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+7FE0
+4620
+0600
+0600
+0600
+0600
+3FC0
+0600
+0600
+0600
+0600
+0600
+0600
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR tstroke
+ENCODING 359
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0400
+0400
+0C00
+7FC0
+0C00
+0C00
+3F80
+0C00
+0C00
+0C00
+0C20
+0E40
+0780
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Utilde
+ENCODING 360
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0E40
+1FC0
+1380
+F070
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+7040
+3FC0
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR utilde
+ENCODING 361
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0E40
+1FC0
+1380
+0000
+79E0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+39C0
+1E60
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Umacron
+ENCODING 362
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+1F80
+1F80
+0000
+F070
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+7040
+3FC0
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR umacron
+ENCODING 363
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1F80
+1F80
+0000
+0000
+79E0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+39C0
+1E60
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Ubreve
+ENCODING 364
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0D80
+0D80
+0700
+F070
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+7040
+3FC0
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ubreve
+ENCODING 365
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0D80
+0D80
+0700
+0000
+79E0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+39C0
+1E60
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Uring
+ENCODING 366
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0700
+0D80
+0D80
+F770
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+7040
+3FC0
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR uring
+ENCODING 367
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0700
+0D80
+0D80
+0700
+0000
+79E0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+39C0
+1E60
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Uhungarumlaut
+ENCODING 368
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+06C0
+0D80
+1B00
+F070
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+7040
+3FC0
+1F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR uhungarumlaut
+ENCODING 369
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+06C0
+0D80
+1B00
+0000
+79E0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+39C0
+1E60
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Uogonek
+ENCODING 370
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+F070
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+6020
+7040
+3FC0
+1F80
+0180
+0300
+0600
+03C0
+0000
+ENDCHAR
+STARTCHAR uogonek
+ENCODING 371
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+79E0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+39C0
+1E60
+00C0
+0180
+0300
+01E0
+0000
+ENDCHAR
+STARTCHAR Wcircumflex
+ENCODING 372
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0700
+0D80
+0000
+FEF0
+6620
+6620
+6620
+7620
+7740
+3340
+3740
+3BC0
+3B80
+1980
+1980
+1980
+1980
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR wcircumflex
+ENCODING 373
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0200
+0700
+0D80
+18C0
+0000
+FF70
+6620
+6620
+6620
+3740
+3B40
+3B40
+1980
+1980
+1980
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Ycircumflex
+ENCODING 374
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0700
+0D80
+0000
+F070
+6020
+3040
+1880
+1880
+0D00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ycircumflex
+ENCODING 375
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0200
+0700
+0D80
+18C0
+0000
+F0F0
+6020
+3040
+3040
+1880
+1880
+0D00
+0D00
+0600
+0600
+0400
+0C00
+0800
+7800
+7000
+ENDCHAR
+STARTCHAR Ydieresis
+ENCODING 376
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+1980
+1980
+0000
+F070
+6020
+3040
+1880
+1880
+0D00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Zacute
+ENCODING 377
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0180
+0300
+0600
+3FE0
+20C0
+00C0
+0180
+0180
+0300
+0300
+0600
+0600
+0C00
+0C00
+1800
+1820
+3FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR zacute
+ENCODING 378
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0300
+0600
+0C00
+0000
+7FE0
+60E0
+41C0
+0380
+0700
+0E00
+1C00
+3820
+7060
+7FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Zdotaccent
+ENCODING 379
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0300
+0300
+0000
+3FE0
+20C0
+00C0
+0180
+0180
+0300
+0300
+0600
+0600
+0C00
+0C00
+1800
+1820
+3FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR zdotaccent
+ENCODING 380
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0600
+0600
+0000
+7FE0
+60E0
+41C0
+0380
+0700
+0E00
+1C00
+3820
+7060
+7FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Zcaron
+ENCODING 381
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+18C0
+0D80
+0700
+3FE0
+20C0
+00C0
+0180
+0180
+0300
+0300
+0600
+0600
+0C00
+0C00
+1800
+1820
+3FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR zcaron
+ENCODING 382
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+18C0
+0D80
+0700
+0200
+0000
+7FE0
+60E0
+41C0
+0380
+0700
+0E00
+1C00
+3820
+7060
+7FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR longs
+ENCODING 383
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0380
+04C0
+04C0
+0C00
+0C00
+0C00
+0C00
+3C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+1E00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR gravecomb
+ENCODING 768
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0C00
+0600
+0300
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR acutecomb
+ENCODING 769
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0300
+0600
+0C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR circumflexcomb
+ENCODING 770
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0400
+0E00
+1B00
+3180
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR tildecomb
+ENCODING 771
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+1C80
+3F80
+2700
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR macroncomb
+ENCODING 772
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+1F80
+1F80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR brevecomb
+ENCODING 774
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+1B00
+1B00
+0E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR diaresiscomb
+ENCODING 776
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+1980
+1980
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ringcomb
+ENCODING 778
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0E00
+1B00
+1B00
+0E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR caroncomb
+ENCODING 780
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+3180
+1B00
+0E00
+0400
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR cedillacomb
+ENCODING 807
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0600
+0300
+0180
+0F00
+0000
+ENDCHAR
+STARTCHAR ogonekcomb
+ENCODING 808
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0600
+0C00
+1800
+0F00
+0000
+ENDCHAR
+STARTCHAR Combining Low Line
+ENCODING 818
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FFF0
+FFF0
+ENDCHAR
+STARTCHAR hyphen
+ENCODING 8208
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+3FC0
+3FC0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char8209
+ENCODING 8209
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+3FC0
+3FC0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR figuredash
+ENCODING 8210
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+3FC0
+3FC0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR endash
+ENCODING 8211
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+3FC0
+3FC0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR emdash
+ENCODING 8212
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7FE0
+7FE0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR afii00208
+ENCODING 8213
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7FE0
+7FE0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR dblverticalbar
+ENCODING 8214
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+1980
+1980
+1980
+1980
+1980
+1980
+1980
+1980
+1980
+1980
+1980
+1980
+1980
+1980
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR dbllowline
+ENCODING 8215
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+3FC0
+0000
+0000
+3FC0
+ENDCHAR
+STARTCHAR quoteleft
+ENCODING 8216
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0100
+0300
+0600
+0C00
+0C00
+0F00
+0F00
+0600
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR quoteright
+ENCODING 8217
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0600
+0F00
+0F00
+0300
+0300
+0600
+0C00
+0800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR quotesinglebase
+ENCODING 8218
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0600
+0F00
+0F00
+0300
+0300
+0600
+0C00
+0800
+0000
+0000
+ENDCHAR
+STARTCHAR quotereversed
+ENCODING 8219
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0600
+0F00
+0F00
+0C00
+0C00
+0600
+0300
+0100
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR quotedblleft
+ENCODING 8220
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0CC0
+1980
+1980
+1980
+1980
+1980
+1980
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR quotedblright
+ENCODING 8221
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+1980
+1980
+1980
+1980
+1980
+1980
+3300
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR quotedblbase
+ENCODING 8222
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1980
+1980
+1980
+1980
+1980
+3300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char8223
+ENCODING 8223
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+1980
+1980
+1980
+1980
+1980
+1980
+0CC0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR dagger
+ENCODING 8224
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0600
+0600
+0600
+3FC0
+3FC0
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR daggerdbl
+ENCODING 8225
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0600
+0600
+0600
+3FC0
+3FC0
+0600
+0600
+0600
+0600
+3FC0
+3FC0
+0600
+0600
+0600
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR bullet
+ENCODING 8226
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0700
+0F80
+0F80
+0F80
+0700
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ellipsis
+ENCODING 8230
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+2220
+7770
+7770
+2220
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR perthousand
+ENCODING 8240
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+3180
+4980
+4B00
+3300
+0600
+0600
+0C00
+0C00
+1800
+1800
+36C0
+3920
+6920
+66C0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR minute
+ENCODING 8242
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0600
+0600
+0600
+0600
+0600
+0600
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR second
+ENCODING 8243
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+1980
+1980
+1980
+1980
+1980
+1980
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR guilsinglleft
+ENCODING 8249
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0180
+0300
+0600
+0C00
+1800
+0C00
+0600
+0300
+0180
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR guilsinglright
+ENCODING 8250
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+0C00
+0600
+0300
+0180
+0300
+0600
+0C00
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR exclamdbl
+ENCODING 8252
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+1980
+1980
+1980
+1980
+1980
+1980
+1980
+1980
+1980
+1980
+1980
+0000
+0000
+1980
+1980
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR overline
+ENCODING 8254
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+3FC0
+3FC0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR Euro
+ENCODING 8364
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0F80
+1040
+2020
+2000
+6000
+FF80
+6000
+6000
+FF00
+6000
+2000
+3000
+1840
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR minus
+ENCODING 8722
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+3FC0
+3FC0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char9146
+ENCODING 9146
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+FFF0
+FFF0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char9147
+ENCODING 9147
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+FFF0
+FFF0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char9148
+ENCODING 9148
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FFF0
+FFF0
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char9149
+ENCODING 9149
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FFF0
+FFF0
+ENDCHAR
+STARTCHAR char18
+ENCODING 9472
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FFF0
+FFF0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char18
+ENCODING 9473
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FFF0
+FFF0
+FFF0
+FFF0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char9474
+ENCODING 9474
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char9474
+ENCODING 9475
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char13
+ENCODING 9484
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+07F0
+07F0
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char13
+ENCODING 9485
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+07F0
+07F0
+07F0
+07F0
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char13
+ENCODING 9486
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0FF0
+0FF0
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char13
+ENCODING 9487
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0FF0
+0FF0
+0FF0
+0FF0
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char12
+ENCODING 9488
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FE00
+FE00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char12
+ENCODING 9489
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FE00
+FE00
+FE00
+FE00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char12
+ENCODING 9490
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF00
+FF00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char12
+ENCODING 9491
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF00
+FF00
+FF00
+FF00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char14
+ENCODING 9492
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+07F0
+07F0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char14
+ENCODING 9493
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+07F0
+07F0
+07F0
+07F0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char14
+ENCODING 9494
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0FF0
+0FF0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char14
+ENCODING 9495
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0FF0
+0FF0
+0FF0
+0FF0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char11
+ENCODING 9496
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+FE00
+FE00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char11
+ENCODING 9497
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+FE00
+FE00
+FE00
+FE00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char11
+ENCODING 9498
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+FF00
+FF00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char11
+ENCODING 9499
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+FF00
+FF00
+FF00
+FF00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char21
+ENCODING 9500
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+07F0
+07F0
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char21
+ENCODING 9501
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+07F0
+07F0
+07F0
+07F0
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char21
+ENCODING 9502
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0FF0
+0FF0
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char21
+ENCODING 9503
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0FF0
+0FF0
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char21
+ENCODING 9504
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0FF0
+0FF0
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char21
+ENCODING 9505
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0FF0
+0FF0
+0FF0
+0FF0
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char21
+ENCODING 9506
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0FF0
+0FF0
+0FF0
+0FF0
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char21
+ENCODING 9507
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0FF0
+0FF0
+0FF0
+0FF0
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char22
+ENCODING 9508
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+FE00
+FE00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char22
+ENCODING 9509
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+FE00
+FE00
+FE00
+FE00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char22
+ENCODING 9510
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+FF00
+FF00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char22
+ENCODING 9511
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+FF00
+FF00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char22
+ENCODING 9512
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+FF00
+FF00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char22
+ENCODING 9513
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+FF00
+FF00
+FF00
+FF00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char22
+ENCODING 9514
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+FF00
+FF00
+FF00
+FF00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char22
+ENCODING 9515
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+FF00
+FF00
+FF00
+FF00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char24
+ENCODING 9516
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FFF0
+FFF0
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char24
+ENCODING 9517
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FE00
+FFF0
+FFF0
+FE00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char24
+ENCODING 9518
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+07F0
+FFF0
+FFF0
+07F0
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char24
+ENCODING 9519
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FFF0
+FFF0
+FFF0
+FFF0
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char24
+ENCODING 9520
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FFF0
+FFF0
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char24
+ENCODING 9521
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF00
+FFF0
+FFF0
+FF00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char24
+ENCODING 9522
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0FF0
+FFF0
+FFF0
+0FF0
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char24
+ENCODING 9523
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FFF0
+FFF0
+FFF0
+FFF0
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char23
+ENCODING 9524
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+FFF0
+FFF0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char23
+ENCODING 9525
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+FE00
+FFF0
+FFF0
+FE00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char23
+ENCODING 9526
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+07F0
+FFF0
+FFF0
+07F0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char23
+ENCODING 9527
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+FFF0
+FFF0
+FFF0
+FFF0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char23
+ENCODING 9528
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+FFF0
+FFF0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char23
+ENCODING 9529
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+FF00
+FFF0
+FFF0
+FF00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char23
+ENCODING 9530
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0FF0
+FFF0
+FFF0
+0FF0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char23
+ENCODING 9531
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+FFF0
+FFF0
+FFF0
+FFF0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char9532
+ENCODING 9532
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+FFF0
+FFF0
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char9532
+ENCODING 9533
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+FE00
+FFF0
+FFF0
+FE00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char9532
+ENCODING 9534
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+07F0
+FFF0
+FFF0
+07F0
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char9532
+ENCODING 9535
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+FFF0
+FFF0
+FFF0
+FFF0
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char9532
+ENCODING 9536
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+FFF0
+FFF0
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char9532
+ENCODING 9537
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+FFF0
+FFF0
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char9532
+ENCODING 9538
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+FFF0
+FFF0
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char9532
+ENCODING 9539
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+FF00
+FFF0
+FFF0
+FE00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char9532
+ENCODING 9540
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0FF0
+FFF0
+FFF0
+07F0
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char9532
+ENCODING 9541
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+FE00
+FFF0
+FFF0
+FF00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char9532
+ENCODING 9542
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+07F0
+FFF0
+FFF0
+0FF0
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char9532
+ENCODING 9543
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+FFF0
+FFF0
+FFF0
+FFF0
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char9532
+ENCODING 9544
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+FFF0
+FFF0
+FFF0
+FFF0
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char9532
+ENCODING 9545
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+FF00
+FFF0
+FFF0
+FF00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char9532
+ENCODING 9546
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0FF0
+FFF0
+FFF0
+0FF0
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char9532
+ENCODING 9547
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+FFF0
+FFF0
+FFF0
+FFF0
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+0F00
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9552
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FFF0
+0000
+0000
+FFF0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9553
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9554
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+07F0
+0600
+0600
+07F0
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9555
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0FF0
+0FF0
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9556
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0FF0
+0800
+0800
+09F0
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9557
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FE00
+0600
+0600
+FE00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9558
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF00
+FF00
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9559
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF00
+0100
+0100
+F900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9560
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+07F0
+0600
+0600
+07F0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9561
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0FF0
+0FF0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9562
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+09F0
+0800
+0800
+0FF0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9563
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+FE00
+0600
+0600
+FE00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9564
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+FF00
+FF00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9565
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+F900
+0100
+0100
+FF00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9566
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+07F0
+0600
+0600
+07F0
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9567
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0FF0
+0FF0
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9568
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+09F0
+0800
+0800
+09F0
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9569
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+FE00
+0600
+0600
+FE00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9570
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+FF00
+FF00
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9571
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+F900
+0100
+0100
+F900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9572
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FFF0
+0000
+0000
+FFF0
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9573
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FFF0
+FFF0
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9574
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FFF0
+0000
+0000
+F9F0
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9575
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+FFF0
+0000
+0000
+FFF0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9576
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+FFF0
+FFF0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9577
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+F9F0
+0000
+0000
+FFF0
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9578
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+FFF0
+0600
+0600
+FFF0
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9579
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+FFF0
+FFF0
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+ENDCHAR
+STARTCHAR char9552
+ENCODING 9580
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+F9F0
+0000
+0000
+F9F0
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+0900
+ENDCHAR
+STARTCHAR char13
+ENCODING 9581
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0070
+01F0
+0380
+0300
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char13
+ENCODING 9582
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+E000
+F800
+1C00
+0C00
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR char13
+ENCODING 9583
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0C00
+1C00
+F800
+E000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char13
+ENCODING 9584
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0600
+0300
+0380
+01F0
+0070
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR ltshade
+ENCODING 9617
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+AAA0
+0000
+AAA0
+0000
+AAA0
+0000
+AAA0
+0000
+AAA0
+0000
+AAA0
+0000
+AAA0
+0000
+AAA0
+0000
+AAA0
+0000
+AAA0
+0000
+AAA0
+0000
+ENDCHAR
+STARTCHAR shade
+ENCODING 9618
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+3330
+CCC0
+3330
+CCC0
+3330
+CCC0
+3330
+CCC0
+3330
+CCC0
+3330
+CCC0
+3330
+CCC0
+3330
+CCC0
+3330
+CCC0
+3330
+CCC0
+3330
+CCC0
+ENDCHAR
+STARTCHAR dkshade
+ENCODING 9619
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+FFF0
+AAA0
+FFF0
+AAA0
+FFF0
+AAA0
+FFF0
+AAA0
+FFF0
+AAA0
+FFF0
+AAA0
+FFF0
+AAA0
+FFF0
+AAA0
+FFF0
+AAA0
+FFF0
+AAA0
+FFF0
+AAA0
+ENDCHAR
+STARTCHAR blackdiamond
+ENCODING 9670
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0600
+0F00
+1F80
+3FC0
+7FE0
+FFF0
+FFF0
+7FE0
+3FC0
+1F80
+0F00
+0600
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char65534
+ENCODING 65533
+SWIDTH 631 0
+DWIDTH 12 0
+BBX 12 22 0 -5
+BITMAP
+0000
+0000
+7FE0
+7FE0
+6060
+6060
+6060
+6060
+6060
+6060
+6060
+6060
+6060
+6060
+6060
+7FE0
+7FE0
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+ENDFONT
diff --git a/OSX/InvertedSlider.h b/OSX/InvertedSlider.h
new file mode 100644
index 0000000..2220902
--- /dev/null
+++ b/OSX/InvertedSlider.h
@@ -0,0 +1,38 @@
+/* xscreensaver, Copyright (c) 2006-2013 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * This is a subclass of NSSlider that is flipped horizontally:
+ * the high value is on the left and the low value is on the right.
+ */
+
+#ifdef USE_IPHONE
+# import <UIKit/UIKit.h>
+# define NSSlider UISlider
+# define NSRect CGRect
+# define minValue minimumValue
+# define maxValue maximumValue
+#else
+# import <Cocoa/Cocoa.h>
+#endif
+
+@interface InvertedSlider : NSSlider
+{
+ BOOL inverted;
+ BOOL integers;
+}
+
+- (id) initWithFrame:(NSRect)r inverted:(BOOL)_inv integers:(BOOL)_int;
+
+# ifdef USE_IPHONE
+- (double) transformedValue;
+- (void) setTransformedValue:(double)v;
+# endif
+
+@end
diff --git a/OSX/InvertedSlider.m b/OSX/InvertedSlider.m
new file mode 100644
index 0000000..6ac0b41
--- /dev/null
+++ b/OSX/InvertedSlider.m
@@ -0,0 +1,151 @@
+/* xscreensaver, Copyright (c) 2006-2015 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * This is a subclass of NSSlider that is flipped horizontally:
+ * the high value is on the left and the low value is on the right.
+ */
+
+#import "InvertedSlider.h"
+
+@implementation InvertedSlider
+
+- (id) initWithFrame:(NSRect)r
+{
+ self = [super initWithFrame:r];
+ if (! self) return 0;
+ inverted = YES;
+ integers = NO;
+ return self;
+}
+
+- (id) initWithFrame:(NSRect)r inverted:(BOOL)_inv integers:(BOOL)_int
+{
+ self = [self initWithFrame:r];
+ inverted = _inv;
+ integers = _int;
+ return self;
+}
+
+
+-(double) transformValue:(double) value
+{
+ double v2 = (integers
+ ? (int) (value + (value < 0 ? -0.5 : 0.5))
+ : value);
+ double low = [self minValue];
+ double high = [self maxValue];
+ double range = high - low;
+ double off = v2 - low;
+ if (inverted)
+ v2 = low + (range - off);
+ // NSLog (@" ... %.1f -> %.1f [%.1f - %.1f]", value, v2, low, high);
+ return v2;
+}
+
+#ifndef USE_IPHONE
+
+/* On MacOS, we have to transform the value on every entry and exit point
+ to this class. So, we implement doubleValue and setDoubleValue to
+ transform the value; and we then have to re-implement every getter and
+ setter in terms of those. There's no way to simply change how the
+ slider is displayed without mucking with the value inside of it.
+ */
+
+-(double) doubleValue
+{
+ return [self transformValue:[super doubleValue]];
+}
+
+-(void) setDoubleValue:(double)v
+{
+ return [super setDoubleValue:[self transformValue:v]];
+}
+
+-(float)floatValue { return (float) [self doubleValue]; }
+-(int)intValue { return (int) [self doubleValue]; }
+-(NSInteger)integerValue { return (NSInteger) [self doubleValue]; }
+-(id)objectValue { return [NSNumber numberWithDouble:[self doubleValue]]; }
+
+-(NSString *)stringValue
+{
+ if (integers)
+ return [NSString stringWithFormat:@"%d", [self intValue]];
+ else
+ return [NSString stringWithFormat:@"%f", [self doubleValue]];
+}
+
+- (NSAttributedString *)attributedStringValue;
+{
+ return [[[NSAttributedString alloc] initWithString:[self stringValue]]
+ autorelease];
+}
+
+-(void)setFloatValue:(float)v { [self setDoubleValue: (double) v]; }
+-(void)setIntValue: (int)v { [self setDoubleValue: (double) v]; }
+-(void)setIntegerValue:(NSInteger)v { [self setDoubleValue: (double) v]; }
+-(void)setStringValue:(NSString *)v { [self setDoubleValue: [v doubleValue]]; }
+-(void)takeIntValueFrom:(id)f { [self setIntValue: [f intValue]]; }
+-(void)takeFloatValueFrom:(id)f { [self setFloatValue: [f floatValue]]; }
+-(void)takeDoubleValueFrom:(id)f { [self setDoubleValue: [f doubleValue]]; }
+-(void)takeStringValueFrom:(id)f { [self setStringValue: [f stringValue]]; }
+-(void)takeObjectValueFrom:(id)f { [self setObjectValue: [f objectValue]]; }
+-(void)takeIntegerValueFrom:(id)f { [self setIntegerValue:[f integerValue]];}
+-(void) setAttributedStringValue:(NSAttributedString *)v {
+ [self setStringValue:[v string]];
+}
+
+-(void) setObjectValue:(id <NSCopying>)v
+{
+ NSAssert2((v == nil) ||
+ [(NSObject *) v respondsToSelector:@selector(doubleValue)],
+ @"argument %@ to %s does not respond to doubleValue",
+ v, __PRETTY_FUNCTION__);
+ [self setDoubleValue:[((NSNumber *) v) doubleValue]];
+}
+
+#else // USE_IPHONE
+
+/* On iOS, we have control over how the value is displayed, but there's no
+ way to transform the value on input and output: if we wrap 'value' and
+ 'setValue' analagously to what we do on MacOS, things fail in weird
+ ways. Presumably some parts of the system are accessing the value
+ instance variable directly instead of going through the methods.
+
+ So the only way around this is to enforce that all of our calls into
+ this object use a new API: 'transformedValue' and 'setTransformedValue'.
+ The code in XScreenSaverConfigSheet uses that instead.
+ */
+
+- (CGRect)thumbRectForBounds:(CGRect)bounds
+ trackRect:(CGRect)rect
+ value:(float)value
+{
+ CGRect thumb = [super thumbRectForBounds: bounds
+ trackRect: rect
+ value: [self transformValue:value]];
+ if (inverted)
+ thumb.origin.x = rect.size.width - thumb.origin.x - thumb.size.width;
+ return thumb;
+}
+
+-(double) transformedValue
+{
+ return [self transformValue: [self value]];
+}
+
+-(void) setTransformedValue:(double)v
+{
+ [self setValue: [self transformValue: v]];
+}
+
+#endif // USE_IPHONE
+
+
+@end
diff --git a/OSX/LaunchScreen.xib b/OSX/LaunchScreen.xib
new file mode 100644
index 0000000..731d86e
--- /dev/null
+++ b/OSX/LaunchScreen.xib
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="10116" systemVersion="15D21" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <view contentMode="scaleToFill" id="iN0-l3-epB">
+ <rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
+ <nil key="simulatedStatusBarMetrics"/>
+ <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+ <point key="canvasLocation" x="404" y="445"/>
+ </view>
+ </objects>
+</document>
diff --git a/OSX/Makefile b/OSX/Makefile
new file mode 100644
index 0000000..373df6b
--- /dev/null
+++ b/OSX/Makefile
@@ -0,0 +1,436 @@
+# XScreenSaver for MacOS X, Copyright (c) 2006-2015 by Jamie Zawinski.
+
+XCODE_APP = /Applications/Xcode.app
+
+# To build savers that will run on MacOS 10.6 and 10.7, Xcode 5.0.2 must
+# be used (as that's the latest version of Xcode that ships with a version
+# of clang that implements "-fobjc-gc"). However, Xcode 5.0.2 will not
+# launch on MacOS 10.11 or later.
+#
+# XCODE_APP = /Applications/Xcode-5.0.2.app
+
+TARGETS = All Savers
+#ARCH = -arch i386 -arch x86_64 ONLY_ACTIVE_ARCH=NO
+CERT = 'Developer ID Installer: Jamie Zawinski (4627ATJELP)'
+PKGID = org.jwz.xscreensaver
+THUMBDIR = build/screenshots
+XCODEBUILD = $(XCODE_APP)/Contents/Developer/usr/bin/xcodebuild
+SETFILE = $(XCODE_APP)/Contents/Developer/Tools/SetFile
+SETICON = ./seticon.pl
+
+default: release
+all: debug release
+
+clean:
+ -rm -rf build
+# $(XCODEBUILD) -target "$(TARGETS)" clean
+
+distclean:
+ -rm -f config.status config.cache config.log \
+ *.bak *.rej TAGS *~ "#"*
+ -rm -rf autom4te*.cache
+ -rm -rf build Sparkle.framework
+
+distdepend:: Sparkle.framework
+distdepend:: update_plist_version
+
+debug: distdepend
+ $(XCODEBUILD) $(ARCH) -target "$(TARGETS)" -configuration Debug build
+
+release:: distdepend
+ $(XCODEBUILD) $(ARCH) -target "$(TARGETS)" -configuration Release build
+
+release:: check_versions
+
+Sparkle.framework:
+ unzip ../archive/Sparkle.framework-2013-12-04.zip
+
+# Download and resize images from jwz.org.
+# This saves us having to include 4MB of images in the tar file
+# that will only be used by a vast minority of people building
+# from source.
+# update-info-plist.pl runs this as needed.
+# Might be better to do this with curl, since that is installed by default.
+
+BASE = xscreensaver/screenshots/
+URL = https://www.jwz.org/$(BASE)
+WGET = wget -q -U xscreensaver-build-osx
+CVT = -thumbnail '200x150^' -gravity center -extent 200x150 \
+ \( +clone -alpha extract \
+ -draw 'fill black polygon 0,0 0,6 6,0 fill white circle 6,6 6,0' \
+ \( +clone -flip \) -compose Multiply -composite \
+ \( +clone -flop \) -compose Multiply -composite \
+ \) -alpha off -compose CopyOpacity -composite \
+ -colorspace sRGB \
+ -strip \
+ -quality 95 \
+ +dither -colors 128
+
+$(THUMBDIR)/%.png:
+ @\
+ FILE1=`echo "$@" | sed 's!^.*/\([^/]*\)\.png$$!\1.jpg!'` ; \
+ FILE2="$@" ; \
+ TMP="$$FILE2".tmp ; \
+ URL="$(URL)$$FILE1" ; \
+ URL2="$(URL)retired/$$FILE1" ; \
+ if [ ! -d $(THUMBDIR) ]; then mkdir -p $(THUMBDIR) ; fi ; \
+ rm -f "$$FILE2" "$$TMP" ; \
+ set +e ; \
+ if [ -f "$$HOME/www/$(BASE)/$$FILE1" ]; then \
+ cp -p "$$HOME/www/$(BASE)/$$FILE1" "$$TMP" ; \
+ else \
+ echo "downloading $$URL..." ; \
+ $(WGET) -O"$$TMP" "$$URL" ; \
+ if [ ! -s "$$TMP" ]; then \
+ echo "downloading $$URL2..." ; \
+ $(WGET) -O"$$TMP" "$$URL2" ; \
+ fi ; \
+ if [ ! -s "$$TMP" ]; then \
+ rm -f "$$TMP" ; \
+ echo "failed: $$URL" ; \
+ exit 1 ; \
+ fi ; \
+ fi ; \
+ rm -f "$$FILE2" ; \
+ convert jpg:- $(CVT) "$$FILE2" < "$$TMP" ; \
+ if [ ! -s "$$FILE2" ]; then \
+ echo "$$FILE2 failed" >&2 ; \
+ rm -f "$$FILE2" "$$TMP" ; \
+ exit 1 ; \
+ else \
+ rm -f "$$TMP" ; \
+ fi
+
+
+check_versions:
+ @\
+ SRC=../utils/version.h ; \
+ V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' $$SRC` ; \
+ DIR=build/Release ; \
+ RESULT=0 ; \
+ for S in $$DIR/*.{saver,app} ; do \
+ for P in $$S/Contents/Info.plist ; do \
+ V2=`plutil -convert xml1 -o - "$$P" | \
+ perl -0000 -n -e \
+ 'm@<key>CFBundleVersion</key>\s*<string>(.*?)</string>@si \
+ && print $$1'` ; \
+ if [ "$$V2" != "$$V" ] ; then \
+ echo "Wrong version: $$S ($$V2)" ; \
+ RESULT=1 ; \
+ fi ; \
+ done ; \
+ done ; \
+ if [ "$$RESULT" = 0 ]; then echo "Versions match ($$V2)" ; fi ; \
+ exit $$RESULT
+
+
+check_gc:
+ @\
+ DIR="build/Release" ; \
+ RESULT=0 ; \
+ for S in "$$DIR/"*.saver ; do \
+ SS=`echo "$$S" | sed -e 's@^.*/@@' -e 's/.saver$$//'` ; \
+ D="$$S/Contents/MacOS/$$SS" ; \
+ V=`otool -s __DATA __objc_imageinfo "$$D" \
+ | grep ' 00 02 00 '` ; \
+ if [ -z "$$V" ]; then \
+ echo "$$S does not have GC enabled" ; \
+ RESULT=1 ; \
+ fi ; \
+ done ; \
+ \
+ for D in "$$DIR"/webcollage-helper \
+ "$$DIR"/*.saver/Contents/*/webcollage-helper \
+ "$$DIR"/*.app/Contents/*/XScreenSaverUpdater \
+ ; do \
+ V=`otool -s __DATA __objc_imageinfo "$$D" \
+ | grep ' 00 02 00 '` ; \
+ if [ ! -z "$$V" ]; then \
+ echo "$$D has GC enabled" ; \
+ RESULT=1 ; \
+ fi ; \
+ done ; \
+ \
+ if [ "$$RESULT" = 0 ]; then echo "GC enabled" ; fi ; \
+ exit $$RESULT
+
+
+check_coretext:
+ @\
+ DIR="build/Release" ; \
+ RESULT=0 ; \
+ for S in "$$DIR/"*.{saver,app} ; do \
+ SS=`echo "$$S" | sed -e 's@^.*/@@' -e 's/[.][a-z]*$$//'` ; \
+ D="$$S/Contents/MacOS/$$SS" ; \
+ FF=`otool -l "$$D" \
+ | fgrep '/CoreText.framework/' \
+ | sed -n 's/^ *name \([^ ]*\).*$$/\1/p'` ; \
+ if [ -z "$$FF" ] ; then \
+ echo "$$S not linked with CoreText" >/dev/null ; \
+ else \
+ OK=`echo "$$FF" | fgrep -v '/ApplicationServices.framework/'` ; \
+ if [ ! -z "$$OK" ]; then \
+ echo "$$S is linked with the wrong CoreText: $$FF" ; \
+ RESULT=1 ; \
+ else \
+ echo "$$S linked right: $$FF" >/dev/null ; \
+ fi ; \
+ fi ; \
+ done ; \
+ if [ "$$RESULT" = 0 ]; then echo "CoreText linked correctly" ; fi ; \
+ exit $$RESULT
+
+
+# Arrrrgh
+ios-function-table.m::
+ @./build-fntable.pl build/Debug-iphonesimulator/XScreenSaver.app $@
+
+
+echo_tarfiles:
+ @echo `( find . \
+ \( \( -name '.??*' -o -name build -o -name CVS -o -name '*~*' \
+ -o -name 'jwz.*' -o -name 'Screen Savers' \
+ -o -name xscreensaver.xcodeproj \) \
+ -prune \) \
+ -o \( -type f -o -type l \) -print ; \
+ echo xscreensaver.xcodeproj/project.pbxproj ) \
+ | sed 's@^\./@@' \
+ | sort`
+
+update_plist_version:
+ @ \
+ SRC=../utils/version.h ; \
+ V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' $$SRC` ; \
+ T=/tmp/xs.$$$$ ; \
+ for S in *.plist ; do \
+ /bin/echo -n "Updating version number in $$S to \"$$V\"... " ; \
+ KEYS="CFBundleVersion|CFBundleShortVersionString|CFBundleLongVersionString|CFBundleGetInfoString|NSHumanReadableCopyright" ; \
+ perl -0777 -pne \
+ "s@(<key>($$KEYS)</key>\s*<string>)[^<>]+(</string>)@\$${1}$$V\$${3}@g" \
+ < $$S > $$T ; \
+ if cmp -s $$S $$T ; then \
+ echo "unchanged." ; \
+ else \
+ cat $$T > $$S ; \
+ echo "done." ; \
+ fi ; \
+ done ; \
+ rm $$T
+
+
+updates.xml::
+ ./updates.pl xscreensaver ../README ../archive ~/www/xscreensaver
+ @$(MAKE) test_sig
+
+test_sig::
+ @ \
+ U=../utils/version.h ; \
+ V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ;]*\).*/\1/p' < $$U` ; \
+ BASE="xscreensaver-$$V" ; \
+ OUTDIR="../archive" ; \
+ DMG="$$OUTDIR/$$BASE.dmg" ; \
+ SIG=`sed -n 's/^.*dsaSignature="\(.*\)".*/\1/p' updates.xml` ; \
+ PUB="sparkle_dsa_pub.pem" ; \
+ NN="t.$$$$" ; \
+ SIGB=/tmp/$$NN.sig ; \
+ HASH=/tmp/$$NN.hash ; \
+ rm -f "$$SIGB" "$$HASH" ; \
+ echo "$$SIG " | base64 -D > "$$SIGB" ; \
+ set -e ; \
+ for OPENSSL in /usr/bin/openssl /opt/local/bin/openssl ; do \
+ $$OPENSSL dgst -sha1 -binary < "$$DMG" > "$$HASH" ; \
+ /bin/echo -n "$$OPENSSL `$$OPENSSL version`: " ; \
+ $$OPENSSL dgst -dss1 -verify "$$PUB" -signature "$$SIGB" "$$HASH" ; \
+ done ; \
+ rm -f "$$SIGB" "$$HASH" ; \
+
+
+build/Release/installer.pkg: installer.rtf installer.xml installer.sh installer.png ../utils/version.h
+ @\
+ set -e ; \
+ SRC=../utils/version.h ; \
+ V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' $$SRC` ; \
+ \
+ DIST="installer.xml" ; \
+ STAGE="build/Release/pkg_stage" ; \
+ FINAL="$@" ; \
+ UNSIGNED="$$STAGE/contents.pkg" ; \
+ PRODUCT="$$STAGE/product_unsigned.pkg" ; \
+ SCRIPTS="$$STAGE/scripts" ; \
+ RES="$$STAGE/resources" ; \
+ \
+ set -x ; \
+ rm -rf "$$STAGE" ; \
+ mkdir -p "$$SCRIPTS" "$$RES" ; \
+ \
+ cp -p installer.sh "$$SCRIPTS/preinstall" ; \
+ cp -p installer.png "$$RES/background.png" ; \
+ cp -p installer.rtf "$$RES/welcome.rtf" ; \
+ \
+ pkgbuild --identifier "$(PKGID)" --version "$$V" \
+ --scripts "$$SCRIPTS" --nopayload "$$UNSIGNED" ; \
+ \
+ productbuild --distribution "$$DIST" --resources "$$RES" \
+ --package-path "$$STAGE" --version "$$V" "$$PRODUCT" ; \
+ \
+ productsign --sign $(CERT) "$$PRODUCT" "$$FINAL" ; \
+ spctl --assess --verbose=4 --type install "$$FINAL" ; \
+ \
+ rm -rf "$$STAGE" ; \
+
+
+# -format UDBZ saves 4% (~1.2 MB) over UDZO.
+dmg:: distdepend
+dmg:: check_versions check_coretext
+#dmg:: check_gc
+dmg:: build/Release/installer.pkg
+dmg::
+ @ \
+ set -e ; \
+ SRC=../utils/version.h ; \
+ V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' $$SRC` ; \
+ TMPDIR="build" ; \
+ SRC="build/Release" ; \
+ EXTRAS=../../xdaliclock/OSX/build/Release/*.saver ; \
+ BASE="xscreensaver-$$V" ; \
+ OUTDIR="../archive" ; \
+ DMG="$$OUTDIR/$$BASE.dmg" ; \
+ TMPDMG="$$TMPDIR/tmp.dmg" ; \
+ VOLNAME="XScreenSaver $$V" ; \
+ STAGE="$$TMPDIR/dmg_stage" ; \
+ DST="$$STAGE/Screen Savers" ; \
+ PKG="$$STAGE/Install Everything.pkg" ; \
+ rm -f "$$DMG" ; \
+ rm -rf "$$STAGE" ; \
+ echo + mkdir -p "$$DST" ; \
+ mkdir -p "$$DST" ; \
+ \
+ retired=`perl -0 -ne \
+ 's/\\\\\\n//g; m/^RETIRED_EXES\s*=\s*(.*)$$/m && print "$$1\n"' \
+ ../hacks/Makefile.in ; \
+ perl -0 -ne \
+ 's/\\\\\\n//g; m/^RETIRED_GL_EXES\s*=\s*(.*)$$/m && print "$$1\n"' \
+ ../hacks/glx/Makefile.in ; \
+ echo xscreensaver ; \
+ echo savertester` ; \
+ \
+ for f in $$SRC/*.{saver,app} $$EXTRAS ; do \
+ f2=`basename "$$f"` ; \
+ ok=yes ; \
+ ff=`echo $$f | perl -e '$$_=<>; s@^.*/(.*)\..*$$@\L$$1@; print'`; \
+ for r in $$retired ; do \
+ if [ "$$ff" = "$$r" ]; then ok=no ; fi ; \
+ done ; \
+ if [ "$$ff" = testx11 ]; then ok=no ; fi ; \
+ if [ "$$f2" = "XScreenSaverUpdater.app" ]; then \
+ DST_HACK="XScreenSaver.updater" ; \
+ echo + tar ... "$$DST/$$DST_HACK" ; \
+ ( cd $$SRC ; tar -czf - "$$f2" ) > "$$DST/$$DST_HACK" ; \
+ elif [ "$$ok" = yes ]; then \
+ echo + cp -pR "$$f" "$$DST/" ; \
+ cp -pR "$$f" "$$DST/" ; \
+ else \
+ echo skipping "$$f" ; \
+ fi ; \
+ done ; \
+ \
+ set -x ; \
+ cp -p bindist.rtf "$$STAGE/Read Me.rtf" ; \
+ cp -p build/Release/installer.pkg "$$PKG" ; \
+ cp -p bindist-DS_Store "$$STAGE/.DS_Store" ; \
+ cp -p bindist*.webloc "$$STAGE/" ; \
+ cp -p XScreenSaverDMG.icns "$$STAGE/.VolumeIcon.icns" ; \
+ ${SETFILE} -a C "$$STAGE" ; \
+ ${SETFILE} -a E "$$STAGE"/*.{rtf,pkg,webloc} ; \
+ $(SETICON) -d ../../xdaliclock/OSX/daliclockSaver.icns \
+ "$$DST/DaliClock.saver" ; \
+ $(SETICON) -d XScreenSaverFolder.icns "$$DST" ; \
+ $(SETICON) -d XScreenSaver.icns "$$DST"/*.saver ; \
+ $(SETICON) -d SaverRunner.icns "$$DST"/*.app ; \
+ $(SETICON) -d XScreenSaverWebloc.icns "$$STAGE"/bindist.webloc ; \
+ $(SETICON) -d XScreenSaverAndroidWebloc.icns "$$STAGE"/bindist2.webloc ; \
+ $(SETICON) -d XScreenSaverPkg.icns "$$STAGE"/*.pkg ; \
+ mv "$$STAGE/bindist.webloc" "$$STAGE/Get the iPhone:iPad Version.webloc" ; \
+ mv "$$STAGE/bindist2.webloc" "$$STAGE/Get the Android Version.webloc" ; \
+ \
+ set +x ; \
+ echo "Checking signatures..." ; \
+ spctl --assess --type install "$$PKG" ; \
+ spctl --assess --type execute "$$SRC/XScreenSaverUpdater.app" ; \
+ spctl --assess --type execute "$$DST/"*.app ; \
+ spctl --assess --type install "$$DST/"*.saver ; \
+ set -x ; \
+ \
+ hdiutil makehybrid -quiet -ov -hfs -hfs-volume-name "$$VOLNAME" \
+ -hfs-openfolder "$$STAGE" "$$STAGE" -o "$$TMPDMG" ; \
+ rm -rf "$$STAGE" ; \
+ \
+ hdiutil convert -quiet -ov -format UDBZ -imagekey zlib-level=9 \
+ "$$TMPDMG" -o "$$DMG" ; \
+ xattr -w com.apple.quarantine "0000;00000000;;" "$$DMG" ; \
+ rm -f "$$TMPDMG" ; \
+ ls -ldhgF "$$DMG"
+
+
+# When debugging, sometimes I have to reset the preferences for all
+# the savers. Also I like FPS to be turned on, and them all to be
+# pointed at the same image directory.
+#
+show_prefs::
+ @cd build/Debug ; \
+ for f in *.saver ; do \
+ f=`echo "$$f" | sed 's/\..*//'` ; \
+ echo "########################## $$f" ; \
+ defaults -currentHost read org.jwz.xscreensaver."$$f" 2>&- ; \
+ done ; \
+ for f in Apple2 Phosphor updater ; do \
+ echo "########################## $$f" ; \
+ defaults read org.jwz.xscreensaver."$$f" 2>&- ; \
+ done
+
+reset_prefs::
+ @cd build/Debug ; \
+ W1='defaults' ; \
+ W2="$$W1 -currentHost write" ; \
+ img='~/Pictures/Screensaver' ; \
+ for f in *.saver ; do \
+ name=`echo "$$f" | sed 's/\..*//'` ; \
+ echo "########################## $$name" ; \
+ domain="org.jwz.xscreensaver" ; \
+ dd="$$domain.$$name" ; \
+ $$W1 -currentHost delete "$$dd" 2>&- ; \
+ $$W2 "$$dd" doFPS -bool true ; \
+ if [ -f $$f/Contents/Resources/xscreensaver-text ] ; then \
+ $$W2 "$$dd" textMode url ; \
+ fi ; \
+ if [ -f $$f/Contents/Resources/xscreensaver-getimage-file ] ; then \
+ $$W2 "$$dd" chooseRandomImages -bool true ; \
+ $$W2 "$$dd" grabDesktopImages -bool false ; \
+ $$W2 "$$dd" imageDirectory "$$img" ; \
+ fi ; \
+ if ( strings "$$f/Contents/MacOS/$$name" | \
+ grep NSOpenGLContext >/dev/null ) ; then \
+ $$W2 "$$dd" multiSample -bool true ; \
+ fi ; \
+ done ; \
+ \
+ $$W1 delete "$$domain.Apple2" 2>&- ; \
+ $$W1 delete "$$domain.Phosphor" 2>&- ; \
+ $$W1 delete "$$domain.updater" 2>&- ; \
+ $$W1 write "$$domain.updater" SUScheduledCheckIntervalKey 86400; \
+ \
+ $$W2 "$$domain.BoxFit" grab -bool true ; \
+ $$W2 "$$domain.FlipFlop" textured -bool true ; \
+ $$W2 "$$domain.GLSlideshow" titles -bool true ; \
+ $$W2 "$$domain.Photopile" titles -bool true ; \
+ $$W2 "$$domain.SkyTentacles" mode cel ; \
+ $$W2 "$$domain.Sonar" ping \
+ '/etc/hosts,$$HOME/.ssh/known_hosts,$$HOME/.ssh/known_hosts2' ; \
+ $$W2 "$$domain.XMatrix" matrixFont small ; \
+ $$W2 "$$domain.XMatrix" textMode literal ; \
+ $$W2 "$$domain.XMatrix" textLiteral "MONKEY BUTTER" ; \
+
+# defaults -currentHost write org.jwz.xscreensaver.FontGlide debugMetrics -bool true
+# defaults -currentHost write org.jwz.xscreensaver.StarWars debug -bool true
+# defaults -currentHost write org.jwz.xscreensaver.StarWars textMode file
+# defaults -currentHost write org.jwz.xscreensaver.StarWars textFile ~/src/xscreensaver/hacks/glx/zalgo.txt
diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/Contents.json b/OSX/Media-iOS.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..f7aa929
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,154 @@
+{
+ "images" : [
+ {
+ "idiom" : "iphone",
+ "size" : "20x20",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "iphone",
+ "size" : "20x20",
+ "scale" : "3x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "iSaverRunner29.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "iSaverRunner58.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "iSaverRunner87.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "iSaverRunner80.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "iSaverRunner120.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "57x57",
+ "idiom" : "iphone",
+ "filename" : "iSaverRunner57.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "57x57",
+ "idiom" : "iphone",
+ "filename" : "iSaverRunner114.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "iSaverRunner120.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "iSaverRunner180.png",
+ "scale" : "3x"
+ },
+ {
+ "idiom" : "ipad",
+ "size" : "20x20",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "ipad",
+ "size" : "20x20",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "iSaverRunner29.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "iSaverRunner58.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "iSaverRunner40.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "iSaverRunner80.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "50x50",
+ "idiom" : "ipad",
+ "filename" : "iSaverRunner50.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "50x50",
+ "idiom" : "ipad",
+ "filename" : "iSaverRunner100.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "72x72",
+ "idiom" : "ipad",
+ "filename" : "iSaverRunner72.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "72x72",
+ "idiom" : "ipad",
+ "filename" : "iSaverRunner144.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "iSaverRunner76.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "iSaverRunner152.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "83.5x83.5",
+ "idiom" : "ipad",
+ "filename" : "iSaverRunner167.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "1024x1024",
+ "idiom" : "ios-marketing",
+ "filename" : "iSaverRunner1024.png",
+ "scale" : "1x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner100.png b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner100.png
new file mode 100644
index 0000000..4a71d44
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner100.png
Binary files differ
diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner1024.png b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner1024.png
new file mode 100644
index 0000000..a548d1c
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner1024.png
Binary files differ
diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner114.png b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner114.png
new file mode 100644
index 0000000..97da0c7
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner114.png
Binary files differ
diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner120.png b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner120.png
new file mode 100644
index 0000000..3e8472a
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner120.png
Binary files differ
diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner144.png b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner144.png
new file mode 100644
index 0000000..b0f3771
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner144.png
Binary files differ
diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner152.png b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner152.png
new file mode 100644
index 0000000..b50697a
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner152.png
Binary files differ
diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner167.png b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner167.png
new file mode 100644
index 0000000..85824f0
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner167.png
Binary files differ
diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner180.png b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner180.png
new file mode 100644
index 0000000..1e7d0ba
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner180.png
Binary files differ
diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner29.png b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner29.png
new file mode 100644
index 0000000..77738a9
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner29.png
Binary files differ
diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner40.png b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner40.png
new file mode 100644
index 0000000..20db74e
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner40.png
Binary files differ
diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner50.png b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner50.png
new file mode 100644
index 0000000..f2fada1
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner50.png
Binary files differ
diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner57.png b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner57.png
new file mode 100644
index 0000000..deec825
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner57.png
Binary files differ
diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner58.png b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner58.png
new file mode 100644
index 0000000..e62c324
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner58.png
Binary files differ
diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner72.png b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner72.png
new file mode 100644
index 0000000..7d12845
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner72.png
Binary files differ
diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner76.png b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner76.png
new file mode 100644
index 0000000..4aebac5
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner76.png
Binary files differ
diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner80.png b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner80.png
new file mode 100644
index 0000000..adc5ad7
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner80.png
Binary files differ
diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner87.png b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner87.png
new file mode 100644
index 0000000..0335f60
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner87.png
Binary files differ
diff --git a/OSX/Media-iOS.xcassets/Contents.json b/OSX/Media-iOS.xcassets/Contents.json
new file mode 100644
index 0000000..da4a164
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/OSX/Media-iOS.xcassets/Image.imageset/Contents.json b/OSX/Media-iOS.xcassets/Image.imageset/Contents.json
new file mode 100644
index 0000000..f8f827e
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/Image.imageset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/OSX/Media-iOS.xcassets/LaunchImage.launchimage/1242x2208.png b/OSX/Media-iOS.xcassets/LaunchImage.launchimage/1242x2208.png
new file mode 100644
index 0000000..2f3cd23
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/LaunchImage.launchimage/1242x2208.png
Binary files differ
diff --git a/OSX/Media-iOS.xcassets/LaunchImage.launchimage/640x1136.png b/OSX/Media-iOS.xcassets/LaunchImage.launchimage/640x1136.png
new file mode 100644
index 0000000..6763abe
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/LaunchImage.launchimage/640x1136.png
Binary files differ
diff --git a/OSX/Media-iOS.xcassets/LaunchImage.launchimage/640x960.png b/OSX/Media-iOS.xcassets/LaunchImage.launchimage/640x960.png
new file mode 100644
index 0000000..0bfc1a9
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/LaunchImage.launchimage/640x960.png
Binary files differ
diff --git a/OSX/Media-iOS.xcassets/LaunchImage.launchimage/750x1334.png b/OSX/Media-iOS.xcassets/LaunchImage.launchimage/750x1334.png
new file mode 100644
index 0000000..4ec452d
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/LaunchImage.launchimage/750x1334.png
Binary files differ
diff --git a/OSX/Media-iOS.xcassets/LaunchImage.launchimage/Contents.json b/OSX/Media-iOS.xcassets/LaunchImage.launchimage/Contents.json
new file mode 100644
index 0000000..5dd89e0
--- /dev/null
+++ b/OSX/Media-iOS.xcassets/LaunchImage.launchimage/Contents.json
@@ -0,0 +1,51 @@
+{
+ "images" : [
+ {
+ "orientation" : "portrait",
+ "idiom" : "iphone",
+ "filename" : "640x960.png",
+ "extent" : "full-screen",
+ "minimum-system-version" : "7.0",
+ "scale" : "2x"
+ },
+ {
+ "extent" : "full-screen",
+ "idiom" : "iphone",
+ "subtype" : "retina4",
+ "filename" : "640x1136.png",
+ "minimum-system-version" : "7.0",
+ "orientation" : "portrait",
+ "scale" : "2x"
+ },
+ {
+ "orientation" : "portrait",
+ "idiom" : "iphone",
+ "filename" : "640x1136.png",
+ "extent" : "full-screen",
+ "subtype" : "retina4",
+ "scale" : "2x"
+ },
+ {
+ "extent" : "full-screen",
+ "idiom" : "iphone",
+ "subtype" : "667h",
+ "filename" : "750x1334.png",
+ "minimum-system-version" : "8.0",
+ "orientation" : "portrait",
+ "scale" : "2x"
+ },
+ {
+ "extent" : "full-screen",
+ "idiom" : "iphone",
+ "subtype" : "736h",
+ "filename" : "1242x2208.png",
+ "minimum-system-version" : "8.0",
+ "orientation" : "portrait",
+ "scale" : "3x"
+ },
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/OSX/OCRAStd.otf b/OSX/OCRAStd.otf
new file mode 100644
index 0000000..aee7c35
--- /dev/null
+++ b/OSX/OCRAStd.otf
Binary files differ
diff --git a/OSX/PrefsReader.h b/OSX/PrefsReader.h
new file mode 100644
index 0000000..492d4ea
--- /dev/null
+++ b/OSX/PrefsReader.h
@@ -0,0 +1,56 @@
+/* xscreensaver, Copyright (c) 2006-2013 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* This implements the substrate of the xscreensaver preferences code:
+ It does this by writing defaults to, and reading values from, the
+ NSUserDefaultsController (and ScreenSaverDefaults/NSUserDefaults)
+ and thereby reading the preferences that may have been edited by
+ the UI (XScreenSaverConfigSheet).
+ */
+
+#ifdef USE_IPHONE
+# import <Foundation/Foundation.h>
+# import <UIKit/UIKit.h>
+# define NSUserDefaultsController NSUserDefaults
+#else
+# import <Cocoa/Cocoa.h>
+#endif
+
+
+#import "jwxyz.h"
+
+@interface PrefsReader : NSObject
+{
+ NSString *saver_name;
+
+ NSUserDefaults *userDefaults; // this is actually a 'ScreenSaverDefaults'
+ NSUserDefaultsController *userDefaultsController;
+
+ NSUserDefaults *globalDefaults; // for prefs shared by all xscreensavers.
+ NSUserDefaultsController *globalDefaultsController;
+
+ NSDictionary *defaultOptions; // Hardcoded defaults before any changes.
+}
+
+- (id) initWithName: (NSString *) name
+ xrmKeys: (const XrmOptionDescRec *) opts
+ defaults: (const char * const *) defs;
+
+- (NSUserDefaultsController *) userDefaultsController;
+- (NSUserDefaultsController *) globalDefaultsController;
+- (NSDictionary *) defaultOptions;
+
+- (char *) getStringResource: (const char *) name;
+- (double) getFloatResource: (const char *) name;
+- (int) getIntegerResource: (const char *) name;
+- (BOOL) getBooleanResource: (const char *) name;
+
+@end
diff --git a/OSX/PrefsReader.m b/OSX/PrefsReader.m
new file mode 100644
index 0000000..a1c4ed4
--- /dev/null
+++ b/OSX/PrefsReader.m
@@ -0,0 +1,608 @@
+/* xscreensaver, Copyright (c) 2006-2015 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* This implements the substrate of the xscreensaver preferences code:
+ It does this by writing defaults to, and reading values from, the
+ NSUserDefaultsController (and ScreenSaverDefaults/NSUserDefaults)
+ and thereby reading the preferences that may have been edited by
+ the UI (XScreenSaverConfigSheet).
+ */
+
+#ifndef USE_IPHONE
+# import <ScreenSaver/ScreenSaverDefaults.h>
+#endif
+
+#import "PrefsReader.h"
+#import "Updater.h"
+#import "screenhackI.h"
+
+#ifndef USE_IPHONE
+
+#include <objc/runtime.h>
+
+/* GlobalDefaults is an NSUserDefaults implementation that writes into
+ the preferences key we provide, instead of whatever the default would
+ be for this app. We do this by invoking the Core Foundation preferences
+ routines directly, while presenting the same API as NSUserDefaults.
+
+ We need this so that global prefs will go into the file
+ Library/Preferences/org.jwz.xscreensaver.updater.plist instead of into
+ Library/Preferences/ByHost/org.jwz.xscreensaver.Maze.XXXXX.plist
+ with the per-saver prefs.
+
+ The ScreenSaverDefaults class *almost* does this, but it always writes
+ into the ByHost subdirectory, which means it's not readable by an app
+ that tries to access it with a plain old +standardUserDefaults.
+ */
+@interface GlobalDefaults : NSUserDefaults
+{
+ NSString *domain;
+ NSDictionary *defaults;
+}
+@end
+
+@implementation GlobalDefaults
+- (id) initWithDomain:(NSString *)_domain module:(NSString *)_module
+{
+ // Key-Value Observing tries to create an Objective-C class named
+ // NSKVONotifying_GlobalDefaults when the configuration page is shown. But if
+ // this is the second XScreenSaver .saver running in the same process, class
+ // creation fails because that class name was already used by the first
+ // .saver, and it refers to the GlobalDefaults from the other .saver.
+
+ // This gives the class a unique name, sidestepping the above issue.
+
+ // It really just needs to be unique for this .saver and this instance.
+ // Using the pointer to the .saver's mach_header and the full path to the
+ // .saver would be preferable, but this should be good enough.
+ char class_name[128];
+ sprintf(class_name, "GlobalDefaults_%s_%p_%u",
+ strrchr(_module.UTF8String, '.') + 1, self, random());
+ Class c = objc_allocateClassPair([GlobalDefaults class], class_name, 0);
+ if (!c)
+ return nil;
+ objc_registerClassPair(c);
+
+ self = [super init];
+ object_setClass(self, c);
+ domain = [_domain retain];
+ return self;
+}
+
+- (void) dealloc
+{
+ Class c = object_getClass(self);
+
+ [domain release];
+ [defaults release];
+ [super dealloc];
+
+ objc_disposeClassPair(c);
+}
+
+- (void)registerDefaults:(NSDictionary *)dict
+{
+ defaults = [dict retain];
+}
+
+- (id)objectForKey:(NSString *)key
+{
+ NSObject *obj = (NSObject *)
+ CFPreferencesCopyAppValue ((CFStringRef) key, (CFStringRef) domain);
+ if (obj)
+ [obj autorelease];
+ else if (defaults)
+ obj = [defaults objectForKey:key];
+ return obj;
+}
+
+- (void)setObject:(id)value forKey:(NSString *)key
+{
+ if (value && defaults) {
+ // If the value is the default, then remove it instead.
+ NSObject *def = [defaults objectForKey:key];
+ if (def && [def isEqual:value])
+ value = NULL;
+ }
+ CFPreferencesSetAppValue ((CFStringRef) key,
+ (CFPropertyListRef) value,
+ (CFStringRef) domain);
+}
+
+
+- (BOOL)synchronize
+{
+ return CFPreferencesAppSynchronize ((CFStringRef) domain);
+}
+
+
+// Make sure these all call our objectForKey.
+// Might not be necessary, but safe.
+
+- (NSString *)stringForKey:(NSString *)key
+{
+ return [[self objectForKey:key] stringValue];
+}
+
+- (NSArray *)arrayForKey:(NSString *)key
+{
+ return (NSArray *) [self objectForKey:key];
+}
+
+- (NSDictionary *)dictionaryForKey:(NSString *)key
+{
+ return (NSDictionary *) [self objectForKey:key];
+}
+
+- (NSData *)dataForKey:(NSString *)key
+{
+ return (NSData *) [self objectForKey:key];
+}
+
+- (NSArray *)stringArrayForKey:(NSString *)key
+{
+ return (NSArray *) [self objectForKey:key];
+}
+
+- (NSInteger)integerForKey:(NSString *)key
+{
+ return [[self objectForKey:key] integerValue];
+}
+
+- (float)floatForKey:(NSString *)key
+{
+ return [[self objectForKey:key] floatValue];
+}
+
+- (double)doubleForKey:(NSString *)key
+{
+ return [[self objectForKey:key] doubleValue];
+}
+
+- (BOOL)boolForKey:(NSString *)key
+{
+ return [[self objectForKey:key] integerValue];
+}
+
+// Make sure these all call our setObject.
+// Might not be necessary, but safe.
+
+- (void)removeObjectForKey:(NSString *)key
+{
+ [self setObject:NULL forKey:key];
+}
+
+- (void)setInteger:(NSInteger)value forKey:(NSString *)key
+{
+ [self setObject:[NSNumber numberWithInteger:value] forKey:key];
+}
+
+- (void)setFloat:(float)value forKey:(NSString *)key
+{
+ [self setObject:[NSNumber numberWithFloat:value] forKey:key];
+}
+
+- (void)setDouble:(double)value forKey:(NSString *)key
+{
+ [self setObject:[NSNumber numberWithDouble:value] forKey:key];
+}
+
+- (void)setBool:(BOOL)value forKey:(NSString *)key
+{
+ [self setObject:[NSNumber numberWithBool:value] forKey:key];
+}
+@end
+
+
+#endif // !USE_IPHONE
+
+
+@implementation PrefsReader
+
+/* Normally we read resources by looking up "KEY" in the database
+ "org.jwz.xscreensaver.SAVERNAME". But in the all-in-one iPhone
+ app, everything is stored in the database "org.jwz.xscreensaver"
+ instead, so transform keys to "SAVERNAME.KEY".
+
+ NOTE: This is duplicated in XScreenSaverConfigSheet.m, cause I suck.
+ */
+- (NSString *) makeKey:(NSString *)key
+{
+# ifdef USE_IPHONE
+ NSString *prefix = [saver_name stringByAppendingString:@"."];
+ if (! [key hasPrefix:prefix]) // Don't double up!
+ key = [prefix stringByAppendingString:key];
+# endif
+ return key;
+}
+
+- (NSString *) makeCKey:(const char *)key
+{
+ return [self makeKey:[NSString stringWithCString:key
+ encoding:NSUTF8StringEncoding]];
+}
+
+
+/* Converts an array of "key:value" strings to an NSDictionary.
+ */
+- (NSDictionary *) defaultsToDict: (const char * const *) defs
+{
+ NSDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:20];
+ while (*defs) {
+ char *line = strdup (*defs);
+ char *key, *val;
+ key = line;
+ while (*key == '.' || *key == '*' || *key == ' ' || *key == '\t')
+ key++;
+ val = key;
+ while (*val && *val != ':')
+ val++;
+ if (*val != ':') abort();
+ *val++ = 0;
+ while (*val == ' ' || *val == '\t')
+ val++;
+
+ unsigned long L = strlen(val);
+ while (L > 0 && (val[L-1] == ' ' || val[L-1] == '\t'))
+ val[--L] = 0;
+
+ // When storing into preferences, look at the default string and
+ // decide whether it's a boolean, int, float, or string, and store
+ // an object of the appropriate type in the prefs.
+ //
+ NSString *nskey = [self makeCKey:key];
+ NSObject *nsval;
+ int dd;
+ double ff;
+ char cc;
+ if (!strcasecmp (val, "true") || !strcasecmp (val, "yes"))
+ nsval = [NSNumber numberWithBool:YES];
+ else if (!strcasecmp (val, "false") || !strcasecmp (val, "no"))
+ nsval = [NSNumber numberWithBool:NO];
+ else if (1 == sscanf (val, " %d %c", &dd, &cc))
+ nsval = [NSNumber numberWithInt:dd];
+ else if (1 == sscanf (val, " %lf %c", &ff, &cc))
+ nsval = [NSNumber numberWithDouble:ff];
+ else
+ nsval = [NSString stringWithCString:val encoding:NSUTF8StringEncoding];
+
+// NSLog (@"default: \"%@\" = \"%@\" [%@]", nskey, nsval, [nsval class]);
+ [dict setValue:nsval forKey:nskey];
+ free (line);
+ defs++;
+ }
+ return dict;
+}
+
+
+/* Initialize the Cocoa preferences database:
+ - sets the default preferences values from the 'defaults' array;
+ - binds 'self' to each preference as an observer;
+ - ensures that nothing is mentioned in 'options' and not in 'defaults';
+ - ensures that nothing is mentioned in 'defaults' and not in 'options'.
+ */
+- (void) registerXrmKeys: (const XrmOptionDescRec *) opts
+ defaults: (const char * const *) defs
+{
+ // Store the contents of 'defaults' into the real preferences database.
+ NSDictionary *defsdict = [self defaultsToDict:defs];
+ [userDefaults registerDefaults:defsdict];
+ [globalDefaults registerDefaults:UPDATER_DEFAULTS];
+
+ // Save a copy of the default options, since iOS doesn't have
+ // [userDefaultsController initialValues].
+ //
+ if (defaultOptions)
+ [defaultOptions release];
+ defaultOptions = [[NSMutableDictionary dictionaryWithCapacity:20]
+ retain];
+ for (NSString *key in defsdict) {
+ [defaultOptions setValue:[defsdict objectForKey:key] forKey:key];
+ }
+
+# ifndef USE_IPHONE
+ userDefaultsController =
+ [[NSUserDefaultsController alloc] initWithDefaults:userDefaults
+ initialValues:defsdict];
+ globalDefaultsController =
+ [[NSUserDefaultsController alloc] initWithDefaults:globalDefaults
+ initialValues:UPDATER_DEFAULTS];
+# else // USE_IPHONE
+ userDefaultsController = [userDefaults retain];
+ globalDefaultsController = [userDefaults retain];
+# endif // USE_IPHONE
+
+ NSDictionary *optsdict = [NSMutableDictionary dictionaryWithCapacity:20];
+
+ while (opts[0].option) {
+ //const char *option = opts->option;
+ const char *resource = opts->specifier;
+
+ while (*resource == '.' || *resource == '*')
+ resource++;
+ NSString *nsresource = [self makeCKey:resource];
+
+ // make sure there's no resource mentioned in options and not defaults.
+ if (![defsdict objectForKey:nsresource]) {
+ if (! (!strcmp(resource, "font") || // don't warn about these
+ !strcmp(resource, "foreground") ||
+ !strcmp(resource, "textLiteral") ||
+ !strcmp(resource, "textFile") ||
+ !strcmp(resource, "textURL") ||
+ !strcmp(resource, "textProgram") ||
+ !strcmp(resource, "imageDirectory")))
+ NSLog (@"warning: \"%s\" is in options but not defaults", resource);
+ }
+ [optsdict setValue:nsresource forKey:nsresource];
+
+ opts++;
+ }
+
+#if 0
+ // make sure there's no resource mentioned in defaults and not options.
+ for (NSString *key in defsdict) {
+ if (! [optsdict objectForKey:key])
+ if (! ([key isEqualToString:@"foreground"] || // don't warn about these
+ [key isEqualToString:@"background"] ||
+ [key isEqualToString:@"Background"] ||
+ [key isEqualToString:@"geometry"] ||
+ [key isEqualToString:@"font"] ||
+ [key isEqualToString:@"dontClearRoot"] ||
+
+ // fps.c settings
+ [key isEqualToString:@"fpsSolid"] ||
+ [key isEqualToString:@"fpsTop"] ||
+ [key isEqualToString:@"titleFont"] ||
+
+ // analogtv.c settings
+ [key isEqualToString:@"TVBrightness"] ||
+ [key isEqualToString:@"TVColor"] ||
+ [key isEqualToString:@"TVContrast"] ||
+ [key isEqualToString:@"TVTint"]
+ ))
+ NSLog (@"warning: \"%@\" is in defaults but not options", key);
+ }
+#endif /* 0 */
+
+#if 0
+ // Dump the entire resource database.
+ NSLog(@"userDefaults:");
+ NSDictionary *d = [userDefaults dictionaryRepresentation];
+ for (NSObject *key in [[d allKeys]
+ sortedArrayUsingSelector:@selector(compare:)]) {
+ NSObject *val = [d objectForKey:key];
+ NSLog (@"%@ = %@", key, val);
+ }
+ NSLog(@"globalDefaults:");
+ d = [globalDefaults dictionaryRepresentation];
+ for (NSObject *key in [[d allKeys]
+ sortedArrayUsingSelector:@selector(compare:)]) {
+ NSObject *val = [d objectForKey:key];
+ NSLog (@"%@ = %@", key, val);
+ }
+#endif
+
+}
+
+- (NSUserDefaultsController *) userDefaultsController
+{
+ NSAssert(userDefaultsController, @"userDefaultsController uninitialized");
+ return userDefaultsController;
+}
+
+- (NSUserDefaultsController *) globalDefaultsController
+{
+ NSAssert(globalDefaultsController, @"globalDefaultsController uninitialized");
+ return globalDefaultsController;
+}
+
+- (NSDictionary *) defaultOptions
+{
+ NSAssert(defaultOptions, @"defaultOptions uninitialized");
+ return defaultOptions;
+}
+
+
+- (NSObject *) getObjectResource: (const char *) name
+{
+ // Only look in globalDefaults for updater preferences.
+
+ static NSDictionary *updaterDefaults;
+ if (!updaterDefaults) {
+ updaterDefaults = UPDATER_DEFAULTS;
+ [updaterDefaults retain];
+ }
+
+ NSUserDefaults *defaults =
+ [updaterDefaults objectForKey:[NSString stringWithUTF8String:name]] ?
+ globalDefaults :
+ userDefaults;
+
+ const char *name2 = name;
+ while (1) {
+ NSString *key = [self makeCKey:name2];
+ NSObject *obj = [defaults objectForKey:key];
+ if (obj)
+ return obj;
+
+ // If key is "foo.bar.baz", check "foo.bar.baz", "bar.baz", and "baz".
+ //
+ const char *dot = strchr (name2, '.');
+ if (dot && dot[1])
+ name2 = dot + 1;
+ else
+ break;
+ }
+ return NULL;
+}
+
+
+- (char *) getStringResource: (const char *) name
+{
+ NSObject *o = [self getObjectResource:name];
+ //NSLog(@"%s = %@",name,o);
+ if (o == nil) {
+ if (! (!strcmp(name, "eraseMode") || // erase.c
+ // xlockmore.c reads all of these whether used or not...
+ !strcmp(name, "right3d") ||
+ !strcmp(name, "left3d") ||
+ !strcmp(name, "both3d") ||
+ !strcmp(name, "none3d") ||
+ !strcmp(name, "font") ||
+ !strcmp(name, "labelFont") || // grabclient.c
+ !strcmp(name, "titleFont") ||
+ !strcmp(name, "fpsFont") || // fps.c
+ !strcmp(name, "foreground") || // fps.c
+ !strcmp(name, "background") ||
+ !strcmp(name, "textLiteral")
+ ))
+ NSLog(@"warning: no preference \"%s\" [string]", name);
+ return NULL;
+ }
+ if (! [o isKindOfClass:[NSString class]]) {
+ NSLog(@"asked for %s as a string, but it is a %@", name, [o class]);
+ o = [(NSNumber *) o stringValue];
+ }
+
+ NSString *os = (NSString *) o;
+ char *result = strdup ([os cStringUsingEncoding:NSUTF8StringEncoding]);
+
+ // Kludge: if the string is surrounded with single-quotes, remove them.
+ // This happens when the .xml file says things like arg="-foo 'bar baz'"
+ if (result[0] == '\'' && result[strlen(result)-1] == '\'') {
+ result[strlen(result)-1] = 0;
+ strcpy (result, result+1);
+ }
+
+ // Kludge: assume that any string that begins with "~" and has a "/"
+ // anywhere in it should be expanded as if it is a pathname.
+ if (result[0] == '~' && strchr (result, '/')) {
+ os = [NSString stringWithCString:result encoding:NSUTF8StringEncoding];
+ free (result);
+ result = strdup ([[os stringByExpandingTildeInPath]
+ cStringUsingEncoding:NSUTF8StringEncoding]);
+ }
+
+ return result;
+}
+
+
+- (double) getFloatResource: (const char *) name
+{
+ NSObject *o = [self getObjectResource:name];
+ if (o == nil) {
+ // xlockmore.c reads all of these whether used or not...
+ if (! (!strcmp(name, "cycles") ||
+ !strcmp(name, "size") ||
+ !strcmp(name, "use3d") ||
+ !strcmp(name, "delta3d") ||
+ !strcmp(name, "wireframe") ||
+ !strcmp(name, "showFPS") ||
+ !strcmp(name, "fpsSolid") ||
+ !strcmp(name, "fpsTop") ||
+ !strcmp(name, "mono") ||
+ !strcmp(name, "count") ||
+ !strcmp(name, "ncolors") ||
+ !strcmp(name, "doFPS") || // fps.c
+ !strcmp(name, "eraseSeconds") // erase.c
+ ))
+ NSLog(@"warning: no preference \"%s\" [float]", name);
+ return 0.0;
+ }
+ if ([o isKindOfClass:[NSString class]]) {
+ return [(NSString *) o doubleValue];
+ } else if ([o isKindOfClass:[NSNumber class]]) {
+ return [(NSNumber *) o doubleValue];
+ } else {
+ NSAssert2(0, @"%s = \"%@\" but should have been an NSNumber", name, o);
+ abort();
+ }
+}
+
+
+- (int) getIntegerResource: (const char *) name
+{
+ // Sliders might store float values for integral resources; round them.
+ float v = [self getFloatResource:name];
+ int i = (int) (v + (v < 0 ? -0.5 : 0.5)); // ignore sign or -1 rounds to 0
+ // if (i != v) NSLog(@"%s: rounded %.3f to %d", name, v, i);
+ return i;
+}
+
+
+- (BOOL) getBooleanResource: (const char *) name
+{
+ NSObject *o = [self getObjectResource:name];
+ if (! o) {
+ return NO;
+ } else if ([o isKindOfClass:[NSNumber class]]) {
+ double n = [(NSNumber *) o doubleValue];
+ if (n == 0) return NO;
+ else if (n == 1) return YES;
+ else goto FAIL;
+ } else if ([o isKindOfClass:[NSString class]]) {
+ NSString *s = [((NSString *) o) lowercaseString];
+ if ([s isEqualToString:@"true"] ||
+ [s isEqualToString:@"yes"] ||
+ [s isEqualToString:@"1"])
+ return YES;
+ else if ([s isEqualToString:@"false"] ||
+ [s isEqualToString:@"no"] ||
+ [s isEqualToString:@"0"] ||
+ [s isEqualToString:@""])
+ return NO;
+ else
+ goto FAIL;
+ } else {
+ FAIL:
+ NSAssert2(0, @"%s = \"%@\" but should have been a boolean", name, o);
+ abort();
+ }
+}
+
+
+- (id) initWithName: (NSString *) name
+ xrmKeys: (const XrmOptionDescRec *) opts
+ defaults: (const char * const *) defs
+{
+ self = [self init];
+ if (!self) return nil;
+
+# ifndef USE_IPHONE
+ userDefaults = [ScreenSaverDefaults defaultsForModuleWithName:name];
+ globalDefaults = [[GlobalDefaults alloc] initWithDomain:@UPDATER_DOMAIN
+ module:name];
+# else // USE_IPHONE
+ userDefaults = [NSUserDefaults standardUserDefaults];
+ globalDefaults = [userDefaults retain];
+# endif // USE_IPHONE
+
+ // Convert "org.jwz.xscreensaver.NAME" to just "NAME".
+ NSRange r = [name rangeOfString:@"." options:NSBackwardsSearch];
+ if (r.length)
+ name = [name substringFromIndex:r.location+1];
+ name = [name stringByReplacingOccurrencesOfString:@" " withString:@""];
+ saver_name = [name retain];
+
+ [self registerXrmKeys:opts defaults:defs];
+ return self;
+}
+
+- (void) dealloc
+{
+ [saver_name release];
+ [userDefaultsController release];
+ [globalDefaultsController release];
+ [globalDefaults release];
+ [super dealloc];
+}
+
+@end
diff --git a/OSX/PxPlus_IBM_VGA8.ttf b/OSX/PxPlus_IBM_VGA8.ttf
new file mode 100644
index 0000000..0368d2b
--- /dev/null
+++ b/OSX/PxPlus_IBM_VGA8.ttf
Binary files differ
diff --git a/OSX/README b/OSX/README
new file mode 100644
index 0000000..0799995
--- /dev/null
+++ b/OSX/README
@@ -0,0 +1,42 @@
+
+This directory contains the MacOS-specific code for building a Cocoa
+version of xscreensaver without using X11.
+
+To build it, just type "make", or use the included XCode project. The
+executables will show up in the "build/Release/" and/or "build/Debug/"
+directories.
+
+If you build using anything later than Xcode 5.0.2, the resultant savers
+will require MacOS 10.7 or later. To support 10.4 through 10.6, you must
+use Xcode 5.0.2 or earlier.
+
+This is how you add a new screen saver to the Xcode project. It's a
+ridiculously long list of steps!
+
+ 1: Duplicate a target (Dangerball for GL, or Attraction for X11).
+ 2: Rename it, and drag it to the right spot in the list.
+ 3: Delete the dangerball.c and dangerball.xml files from Build Phases.
+ 4: Delete the "DangerBall copy-Info.plist" file that got created.
+ 5: Delete the "DangerBall copy-Info.plist" from the Build Settings too.
+ 6: Manage Schemes, rename "DangerBall Copy".
+ 7: Move to the right place in the list.
+ 8: Scheme / Run / Info: Executable: SaverTester.app.
+ 9: Scheme / Run / Arguments: set SELECTED_SAVER environment variable.
+ 10: File / Add Files / the new .c and .xml.
+ 11: Re-order them in the file list. This will bring up an Options dialog.
+ Add To Targets: the new target, and "XScreenSaver-iOS".
+ 12: The files might not have moved. This means Xcode is gonna crash soon.
+ It will repair itself after.
+ 13: In target "All Savers (OpenGL)" add the new target as Build Phases /
+ Target Dependency.
+ 14: In target "XScreenSaver-iOS", reorder new files in Build Phases /
+ "Copy" and "Compile", since they showed up in a random place.
+ 15: In target "XScreenSaver-iOS", add "-DUSE_GL" to the new file's options.
+ 16: Put a 200x150 screen shot in ~/www/xscreensaver/screenshots/
+ 17: ln -s ../../src/xscreensaver/OSX/build/Debug/NEW.saver \
+ ~/Library/Screen\ Savers/
+ 18: git add xscreensaver.xcodeproj/xcuserdata/*/xcschemes/*.xcscheme
+ 19: Don't forget to create a man page from the XML with xml2man.pl,
+ and update Makefile.in.
+ 20: Make a video: -record-animation 3600 -delay 1 -geom 1920x1080+128+64
+ ./upload-video.pl NAME
diff --git a/OSX/SaverListController.h b/OSX/SaverListController.h
new file mode 100644
index 0000000..9b46133
--- /dev/null
+++ b/OSX/SaverListController.h
@@ -0,0 +1,36 @@
+/* xscreensaver, Copyright (c) 2012-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * This implements the top-level screen-saver selection list in the iOS app.
+ */
+
+#ifdef USE_IPHONE
+
+#import <UIKit/UIKit.h>
+
+@interface SaverListController : UITableViewController <UISearchBarDelegate> {
+
+ int active_section_count;
+ NSMutableArray *list_by_letter[26]; // 27 to get "#" after "Z".
+ NSMutableArray *letter_sections;
+ NSMutableArray *section_titles;
+ NSArray *names;
+ NSDictionary *descriptions;
+
+ int tap_count;
+ NSTimer *tap_timer;
+ NSIndexPath *last_tap;
+}
+
+- (id)initWithNames:(NSArray *)names descriptions:(NSDictionary *)descs;
+- (void) scrollTo:(NSString *)name;
+@end
+
+#endif // USE_IPHONE
diff --git a/OSX/SaverListController.m b/OSX/SaverListController.m
new file mode 100644
index 0000000..9377275
--- /dev/null
+++ b/OSX/SaverListController.m
@@ -0,0 +1,402 @@
+/* xscreensaver, Copyright (c) 2012-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * This implements the top-level screen-saver selection list in the iOS app.
+ */
+
+#ifdef USE_IPHONE // whole file
+
+
+#import "SaverListController.h"
+#import "SaverRunner.h"
+#import "yarandom.h"
+#import "version.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+
+@implementation SaverListController
+
+- (void) titleTapped:(id) sender
+{
+ [[UIApplication sharedApplication]
+ openURL:[NSURL URLWithString:@"https://www.jwz.org/xscreensaver/"]];
+}
+
+
+- (void)makeTitleBar
+{
+ // Extract the version number and release date from the version string.
+ // Here's an area where I kind of wish I had "Two Problems".
+ // I guess I could add custom key to the Info.plist for this.
+
+ NSArray *a = [[NSString stringWithCString: screensaver_id
+ encoding:NSASCIIStringEncoding]
+ componentsSeparatedByCharactersInSet:
+ [NSCharacterSet
+ characterSetWithCharactersInString:@" ()-"]];
+ NSString *vers = [a objectAtIndex: 3];
+ NSString *year = [a objectAtIndex: 7];
+
+ NSString *line1 = [@"XScreenSaver " stringByAppendingString: vers];
+ NSString *line2 = [@"\u00A9 " stringByAppendingString:
+ [year stringByAppendingString:
+ @" Jamie Zawinski <jwz@jwz.org>"]];
+
+ UIView *v = [[UIView alloc] initWithFrame:CGRectZero];
+
+ // The "go to web page" button on the right
+
+ UIImage *img = [UIImage imageWithContentsOfFile:
+ [[[NSBundle mainBundle] bundlePath]
+ stringByAppendingPathComponent:
+ @"iSaverRunner57t.png"]];
+ UIButton *button = [[UIButton alloc] init];
+ [button setFrame: CGRectMake(0, 0, img.size.width/2, img.size.height/2)];
+ [button setBackgroundImage:img forState:UIControlStateNormal];
+ [button addTarget:self
+ action:@selector(titleTapped:)
+ forControlEvents:UIControlEventTouchUpInside];
+ UIBarButtonItem *bi = [[UIBarButtonItem alloc] initWithCustomView: button];
+ self.navigationItem.rightBarButtonItem = bi;
+ [bi release];
+ [button release];
+
+ // The title bar
+
+ UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectZero];
+ UILabel *label2 = [[UILabel alloc] initWithFrame:CGRectZero];
+ [label1 setText: line1];
+ [label2 setText: line2];
+ [label1 setBackgroundColor:[UIColor clearColor]];
+ [label2 setBackgroundColor:[UIColor clearColor]];
+
+ [label1 setFont: [UIFont boldSystemFontOfSize: 17]];
+ [label2 setFont: [UIFont systemFontOfSize: 12]];
+ [label1 sizeToFit];
+ [label2 sizeToFit];
+
+ CGRect r1 = [label1 frame];
+ CGRect r2 = [label2 frame];
+ CGRect r3 = r2;
+
+ CGRect win = [self view].frame;
+ if (win.size.width > 414 && win.size.height > 414) { // iPad
+ [label1 setTextAlignment: NSTextAlignmentLeft];
+ [label2 setTextAlignment: NSTextAlignmentRight];
+ label2.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;
+ r3.size.width = win.size.width;
+ r1 = r3;
+ r1.origin.x += 6;
+ r1.size.width -= 12;
+ r2 = r1;
+
+ } else { // iPhone
+ r3.size.width = win.size.width; // force it to be flush-left
+ [label1 setTextAlignment: NSTextAlignmentLeft];
+ [label2 setTextAlignment: NSTextAlignmentLeft];
+ r1.origin.y = -1; // make it fit in landscape
+ r2.origin.y = r1.origin.y + r1.size.height - 2;
+ r3.size.height = r1.size.height + r2.size.height;
+ }
+ v.autoresizingMask = UIViewAutoresizingFlexibleWidth;
+ [label1 setFrame:r1];
+ [label2 setFrame:r2];
+ [v setFrame:r3];
+
+ [v addSubview:label1];
+ [v addSubview:label2];
+
+ // Default opacity looks bad.
+ [v setBackgroundColor:[[v backgroundColor] colorWithAlphaComponent:1]];
+
+ self.navigationItem.titleView = v;
+
+ win.origin.x = 0;
+ win.origin.y = 0;
+ win.size.height = 44; // #### This cannot possibly be right.
+ UISearchBar *search = [[UISearchBar alloc] initWithFrame:win];
+ search.delegate = self;
+ search.placeholder = @"Search...";
+ self.tableView.tableHeaderView = search;
+
+ // Dismiss the search field's keyboard as soon as we scroll.
+# ifdef __IPHONE_7_0
+ if ([self.tableView respondsToSelector:@selector(keyboardDismissMode)])
+ [self.tableView setKeyboardDismissMode:
+ UIScrollViewKeyboardDismissModeOnDrag];
+# endif
+}
+
+
+- (id)initWithNames:(NSArray *)_names descriptions:(NSDictionary *)_descs;
+{
+ self = [self init];
+ if (! self) return 0;
+ [self reload:_names descriptions:_descs search:nil];
+ [self makeTitleBar];
+ return self;
+}
+
+
+- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tv
+{
+ int n = countof(list_by_letter);
+ NSMutableArray *a = [NSMutableArray arrayWithCapacity: n];
+ for (int i = 0; i < n; i++) {
+ if ([list_by_letter[i] count] == 0) // Omit empty letter sections.
+ continue;
+ char s[2];
+ s[0] = (i == 'Z'-'A'+1 ? '#' : i+'A');
+ s[1] = 0;
+ [a addObject: [NSString stringWithCString:s
+ encoding:NSASCIIStringEncoding]];
+ }
+ return a;
+}
+
+
+/* Called when text is typed into the top search bar.
+ */
+- (void)searchBar:(UISearchBar *)bar textDidChange:(NSString *)txt
+{
+ [self reload:names descriptions:descriptions search:txt];
+}
+
+
+- (void) reload:(NSArray *)_names descriptions:(NSDictionary *)_descs
+ search:search
+{
+ if (names != _names) {
+ if (names) [names release];
+ names = [_names retain];
+ }
+ if (_descs != descriptions) {
+ if (descriptions) [descriptions release];
+ descriptions = [_descs retain];
+ }
+
+ int n = countof(list_by_letter);
+ for (int i = 0; i < n; i++) {
+ list_by_letter[i] = [[NSMutableArray alloc] init];
+ }
+
+ for (NSString *name in names) {
+
+ // If we're searching, omit any items that don't have a match in the
+ // title or description.
+ //
+ BOOL matchp = (!search || [search length] == 0);
+ if (! matchp) {
+ matchp = ([name rangeOfString:search
+ options:NSCaseInsensitiveSearch].location
+ != NSNotFound);
+ }
+ if (! matchp) {
+ NSString *desc = [descriptions objectForKey:name];
+ matchp = ([desc rangeOfString:search
+ options:NSCaseInsensitiveSearch].location
+ != NSNotFound);
+ }
+ if (! matchp)
+ continue;
+
+ int index = ([name cStringUsingEncoding: NSASCIIStringEncoding])[0];
+ if (index >= 'a' && index <= 'z')
+ index -= 'a'-'A';
+ if (index >= 'A' && index <= 'Z')
+ index -= 'A';
+ else
+ index = n-1;
+ [list_by_letter[index] addObject: name];
+ }
+
+ active_section_count = 0;
+ letter_sections = [[[NSMutableArray alloc] init] retain];
+ section_titles = [[[NSMutableArray alloc] init] retain];
+ for (int i = 0; i < n; i++) {
+ if ([list_by_letter[i] count] > 0) {
+ active_section_count++;
+ [letter_sections addObject: list_by_letter[i]];
+ if (i <= 'Z'-'A')
+ [section_titles addObject: [NSString stringWithFormat: @"%c", i+'A']];
+ else
+ [section_titles addObject: @"#"];
+ }
+ }
+ [self.tableView reloadData];
+}
+
+
+- (NSString *)tableView:(UITableView *)tv
+ titleForHeaderInSection:(NSInteger)section
+{
+ return [section_titles objectAtIndex: section];
+}
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tv
+{
+ return active_section_count;
+}
+
+
+- (NSInteger)tableView:(UITableView *)tv
+ numberOfRowsInSection:(NSInteger)section
+{
+ return [[letter_sections objectAtIndex: section] count];
+}
+
+- (NSInteger)tableView:(UITableView *)tv
+ sectionForSectionIndexTitle:(NSString *)title
+ atIndex:(NSInteger) index
+{
+ int i = 0;
+ for (NSString *sectionTitle in section_titles) {
+ if ([sectionTitle isEqualToString: title])
+ return i;
+ i++;
+ }
+ return -1;
+}
+
+
+- (UITableViewCell *)tableView:(UITableView *)tv
+ cellForRowAtIndexPath:(NSIndexPath *)ip
+{
+ NSString *title =
+ [[letter_sections objectAtIndex: [ip indexAtPosition: 0]]
+ objectAtIndex: [ip indexAtPosition: 1]];
+ NSString *desc = [descriptions objectForKey:title];
+
+ NSString *id = @"Cell";
+ UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:id];
+ if (!cell)
+ cell = [[[UITableViewCell alloc]
+ initWithStyle: UITableViewCellStyleSubtitle
+ reuseIdentifier: id]
+ autorelease];
+
+ cell.textLabel.text = title;
+ cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
+ cell.detailTextLabel.text = desc;
+
+ return cell;
+}
+
+
+/* Selecting a row launches the saver.
+ */
+- (void)tableView:(UITableView *)tv
+ didSelectRowAtIndexPath:(NSIndexPath *)ip
+{
+ UITableViewCell *cell = [tv cellForRowAtIndexPath: ip];
+ SaverRunner *s =
+ (SaverRunner *) [[UIApplication sharedApplication] delegate];
+ if (! s) return;
+
+ // Dismiss the search field's keyboard before launching a saver.
+ [self.tableView.tableHeaderView resignFirstResponder];
+
+ NSAssert ([s isKindOfClass:[SaverRunner class]], @"not a SaverRunner");
+ [s loadSaver: cell.textLabel.text];
+}
+
+/* Selecting a row's Disclosure Button opens the preferences.
+ */
+- (void)tableView:(UITableView *)tv
+ accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)ip
+{
+ UITableViewCell *cell = [tv cellForRowAtIndexPath: ip];
+ SaverRunner *s =
+ (SaverRunner *) [[UIApplication sharedApplication] delegate];
+ if (! s) return;
+ NSAssert ([s isKindOfClass:[SaverRunner class]], @"not a SaverRunner");
+ [s openPreferences: cell.textLabel.text];
+}
+
+
+- (void) scrollTo: (NSString *) name
+{
+ int i = 0;
+ int j = 0;
+ Bool ok = NO;
+ for (NSArray *a in letter_sections) {
+ j = 0;
+ for (NSString *n in a) {
+ ok = [n isEqualToString: name];
+ if (ok) goto DONE;
+ j++;
+ }
+ i++;
+ }
+ DONE:
+ if (ok) {
+ NSIndexPath *ip = [NSIndexPath indexPathForRow: j inSection: i];
+ [self.tableView selectRowAtIndexPath:ip
+ animated:NO
+ scrollPosition: UITableViewScrollPositionMiddle];
+ }
+}
+
+
+/* We need this to respond to "shake" gestures
+ */
+- (BOOL)canBecomeFirstResponder
+{
+ return YES;
+}
+
+- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
+{
+}
+
+- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event
+{
+}
+
+
+/* Shake means load a random screen saver.
+ */
+- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
+{
+ if (motion != UIEventSubtypeMotionShake)
+ return;
+ NSMutableArray *a = [NSMutableArray arrayWithCapacity: 200];
+ for (NSArray *sec in letter_sections)
+ for (NSString *s in sec)
+ [a addObject: s];
+ int n = [a count];
+ if (! n) return;
+ NSString *which = [a objectAtIndex: (random() % n)];
+
+ SaverRunner *s =
+ (SaverRunner *) [[UIApplication sharedApplication] delegate];
+ if (! s) return;
+ NSAssert ([s isKindOfClass:[SaverRunner class]], @"not a SaverRunner");
+ [self scrollTo: which];
+ [s loadSaver: which];
+}
+
+
+- (void)dealloc
+{
+ for (int i = 0; i < countof(list_by_letter); i++)
+ [list_by_letter[i] release];
+ [letter_sections release];
+ [section_titles release];
+ [descriptions release];
+ [super dealloc];
+}
+
+@end
+
+
+#endif // USE_IPHONE -- whole file
diff --git a/OSX/SaverRunner.h b/OSX/SaverRunner.h
new file mode 100644
index 0000000..073a87e
--- /dev/null
+++ b/OSX/SaverRunner.h
@@ -0,0 +1,111 @@
+/* xscreensaver, Copyright (c) 2006-2016 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef USE_IPHONE
+# import <Foundation/Foundation.h>
+# import <UIKit/UIKit.h>
+# import <OpenGLES/EAGL.h>
+# import <OpenGLES/ES1/gl.h>
+# import <OpenGLES/ES1/glext.h>
+# import <QuartzCore/QuartzCore.h>
+# define NSView UIView
+# define NSRect CGRect
+# define NSSize CGSize
+# define NSColor UIColor
+# define NSImage UIImage
+# define NSEvent UIEvent
+# define NSWindow UIWindow
+# define NSButton UIButton
+# define NSApplication UIApplication
+# define NSScreen UIScreen
+#else
+# import <Cocoa/Cocoa.h>
+# import <ScreenSaver/ScreenSaver.h>
+#endif
+
+#import <XScreenSaverView.h>
+
+#ifdef USE_IPHONE
+
+@class SaverRunner;
+
+@interface SaverViewController : UIViewController
+{
+ SaverRunner *_parent;
+ NSString *_saverName;
+ XScreenSaverView *_saverView;
+
+ /* When a the SaverViewController is presented, iOS automatically changes
+ the status bar orientation. (And, by extension, the notification center
+ orientation.) But there's no willPresentAsModal: event for a
+ UIViewController so that it knows when this is going to happen, and the
+ other event handlers occur after the status bar is changed. So save the
+ orientation just before the view controller is modal-presented, and
+ restore the proper status bar orientation just before the saverView is
+ created so it can pick it up in didRotate:. */
+ // UIInterfaceOrientation _storedOrientation;
+
+ BOOL _showAboutBox;
+ UIView *aboutBox;
+ NSTimer *splashTimer;
+}
+
+@property(nonatomic, retain) NSString *saverName;
+
+@end
+
+#endif
+
+@interface SaverRunner : NSObject
+# ifdef USE_IPHONE
+ <XScreenSaverViewDelegate>
+# else
+ <NSWindowDelegate>
+# endif
+{
+ NSString *saverName; // the one currently loaded
+ NSArray *saverNames; // Names of available savers
+ NSString *saverDir; // Where we find saver bundles
+
+# ifndef USE_IPHONE
+
+ NSBundle *saverBundle;
+ NSArray *windows;
+ IBOutlet NSMenu *menubar;
+ NSTimer *anim_timer;
+
+# else // USE_IPHONE
+
+ UINavigationController *rotating_nav; // Hierarchy 1 (UI)
+ IBOutlet UIWindow *window;
+ IBOutlet UIView *view;
+
+ SaverViewController *nonrotating_controller; // Hierarchy 2 (savers)
+
+ UIImage *saved_screenshot;
+
+# endif // USE_IPHONE
+}
+
+- (XScreenSaverView *) newSaverView: (NSString *) module
+ withSize: (NSSize) size;
+- (void) loadSaver: (NSString *)name;
+- (void) selectedSaverDidChange:(NSDictionary *)change;
+
+#ifndef USE_IPHONE
+- (void) openPreferences: (id)sender;
+#else // USE_IPHONE
+- (UIImage *) screenshot;
+- (NSString *) makeDesc:(NSString *)saver
+ yearOnly:(BOOL) yearp;
+#endif // USE_IPHONE
+
+@end
diff --git a/OSX/SaverRunner.icns b/OSX/SaverRunner.icns
new file mode 100644
index 0000000..0f052ae
--- /dev/null
+++ b/OSX/SaverRunner.icns
Binary files differ
diff --git a/OSX/SaverRunner.m b/OSX/SaverRunner.m
new file mode 100644
index 0000000..f358fb7
--- /dev/null
+++ b/OSX/SaverRunner.m
@@ -0,0 +1,1645 @@
+/* xscreensaver, Copyright (c) 2006-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* This program serves three purposes:
+
+ First, It is a test harness for screen savers. When it launches, it
+ looks around for .saver bundles (in the current directory, and then in
+ the standard directories) and puts up a pair of windows that allow you
+ to select the saver to run. This is less clicking than running them
+ through System Preferences. This is the "SaverTester.app" program.
+
+ Second, it can be used to transform any screen saver into a standalone
+ program. Just put one (and only one) .saver bundle into the app
+ bundle's Contents/Resources/ directory, and it will load and run that
+ saver at start-up (without the saver-selection menu or other chrome).
+ This is how the "Phosphor.app" and "Apple2.app" programs work.
+
+ Third, it is the scaffolding which turns a set of screen savers into
+ a single iPhone / iPad program. In that case, all of the savers are
+ linked in to this executable, since iOS does not allow dynamic loading
+ of bundles that have executable code in them. Bleh.
+ */
+
+#import <TargetConditionals.h>
+#import "SaverRunner.h"
+#import "SaverListController.h"
+#import "XScreenSaverGLView.h"
+#import "yarandom.h"
+
+#ifdef USE_IPHONE
+
+# ifndef __IPHONE_8_0
+# define UIInterfaceOrientationUnknown UIDeviceOrientationUnknown
+# endif
+# ifndef NSFoundationVersionNumber_iOS_7_1
+# define NSFoundationVersionNumber_iOS_7_1 1047.25
+# endif
+# ifndef NSFoundationVersionNumber_iOS_8_0
+# define NSFoundationVersionNumber_iOS_8_0 1134.10
+# endif
+
+@interface RotateyViewController : UINavigationController
+{
+ BOOL allowRotation;
+}
+@end
+
+@implementation RotateyViewController
+
+/* This subclass exists so that we can ask that the SaverListController and
+ preferences panels be auto-rotated by the system. Note that the
+ XScreenSaverView is not auto-rotated because it is on a different UIWindow.
+ */
+
+- (id)initWithRotation:(BOOL)rotatep
+{
+ self = [super init];
+ allowRotation = rotatep;
+ return self;
+}
+
+- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)o
+{
+ return allowRotation; /* Deprecated in iOS 6 */
+}
+
+- (BOOL)shouldAutorotate /* Added in iOS 6 */
+{
+ return allowRotation;
+}
+
+- (UIInterfaceOrientationMask)supportedInterfaceOrientations /* Added in iOS 6 */
+{
+ return UIInterfaceOrientationMaskAll;
+}
+
+@end
+
+
+@implementation SaverViewController
+
+@synthesize saverName;
+
+- (id)initWithSaverRunner:(SaverRunner *)parent
+ showAboutBox:(BOOL)showAboutBox
+{
+ self = [super init];
+ if (self) {
+ _parent = parent;
+ // _storedOrientation = UIInterfaceOrientationUnknown;
+ _showAboutBox = showAboutBox;
+
+ self.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
+
+# ifndef __IPHONE_7_0
+ self.wantsFullScreenLayout = YES; // Deprecated as of iOS 7
+# endif
+ }
+ return self;
+}
+
+- (BOOL) prefersStatusBarHidden
+{
+ // Requires UIViewControllerBasedStatusBarAppearance = true in plist
+ return YES;
+}
+
+- (void)dealloc
+{
+ [_saverName release];
+ // iOS: When a UIView deallocs, it doesn't do [UIView removeFromSuperView]
+ // for its subviews, so the subviews end up with a dangling pointer in their
+ // superview properties.
+ [aboutBox removeFromSuperview];
+ [aboutBox release];
+ [_saverView removeFromSuperview];
+ [_saverView release];
+ [super dealloc];
+}
+
+
+- (void)loadView
+{
+ // The UIViewController's view must never change, so it gets set here to
+ // a plain black background.
+
+ // This background view doesn't block the status bar, but that's probably
+ // OK, because it's never on screen for more than a fraction of a second.
+ UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectNull];
+ backgroundView.backgroundColor = [UIColor blackColor];
+ self.view = backgroundView;
+ [backgroundView release];
+}
+
+
+- (void)aboutPanel:(UIView *)saverView
+ orientation:(UIInterfaceOrientation)orient
+{
+ if (!_showAboutBox)
+ return;
+
+ NSString *name = _saverName;
+ NSString *year = [_parent makeDesc:_saverName yearOnly:YES];
+
+
+ CGRect frame = [saverView frame];
+ CGFloat rot;
+ CGFloat pt1 = 24;
+ CGFloat pt2 = 14;
+ UIFont *font1 = [UIFont boldSystemFontOfSize: pt1];
+ UIFont *font2 = [UIFont italicSystemFontOfSize:pt2];
+
+# ifdef __IPHONE_7_0
+ CGSize s = CGSizeMake(frame.size.width, frame.size.height);
+ CGSize tsize1 = [[[NSAttributedString alloc]
+ initWithString: name
+ attributes:@{ NSFontAttributeName: font1 }]
+ boundingRectWithSize: s
+ options: NSStringDrawingUsesLineFragmentOrigin
+ context: nil].size;
+ CGSize tsize2 = [[[NSAttributedString alloc]
+ initWithString: name
+ attributes:@{ NSFontAttributeName: font2 }]
+ boundingRectWithSize: s
+ options: NSStringDrawingUsesLineFragmentOrigin
+ context: nil].size;
+# else // iOS 6 or Cocoa
+ CGSize tsize1 = [name sizeWithFont:font1
+ constrainedToSize:CGSizeMake(frame.size.width,
+ frame.size.height)];
+ CGSize tsize2 = [year sizeWithFont:font2
+ constrainedToSize:CGSizeMake(frame.size.width,
+ frame.size.height)];
+# endif
+
+ CGSize tsize = CGSizeMake (tsize1.width > tsize2.width ?
+ tsize1.width : tsize2.width,
+ tsize1.height + tsize2.height);
+
+ tsize.width = ceilf(tsize.width);
+ tsize.height = ceilf(tsize.height);
+
+ // Don't know how to find inner margin of UITextView.
+ CGFloat margin = 10;
+ tsize.width += margin * 4;
+ tsize.height += margin * 2;
+
+ if ([saverView frame].size.width >= 768)
+ tsize.height += pt1 * 3; // extra bottom margin on iPad
+
+ frame = CGRectMake (0, 0, tsize.width, tsize.height);
+
+ /* Get the text oriented properly, and move it to the bottom of the
+ screen, since many savers have action in the middle.
+ */
+ switch (orient) {
+ case UIInterfaceOrientationLandscapeLeft:
+ rot = -M_PI/2;
+ frame.origin.x = ([saverView frame].size.width
+ - (tsize.width - tsize.height) / 2
+ - tsize.height);
+ frame.origin.y = ([saverView frame].size.height - tsize.height) / 2;
+ break;
+ case UIInterfaceOrientationLandscapeRight:
+ rot = M_PI/2;
+ frame.origin.x = -(tsize.width - tsize.height) / 2;
+ frame.origin.y = ([saverView frame].size.height - tsize.height) / 2;
+ break;
+ case UIInterfaceOrientationPortraitUpsideDown:
+ rot = M_PI;
+ frame.origin.x = ([saverView frame].size.width - tsize.width) / 2;
+ frame.origin.y = 0;
+ break;
+ default:
+ rot = 0;
+ frame.origin.x = ([saverView frame].size.width - tsize.width) / 2;
+ frame.origin.y = [saverView frame].size.height - tsize.height;
+ break;
+ }
+
+ if (aboutBox) {
+ [aboutBox removeFromSuperview];
+ [aboutBox release];
+ }
+
+ aboutBox = [[UIView alloc] initWithFrame:frame];
+
+ aboutBox.transform = CGAffineTransformMakeRotation (rot);
+ aboutBox.backgroundColor = [UIColor clearColor];
+
+ /* There seems to be no easy way to stroke the font, so instead draw
+ it 5 times, 4 in black and 1 in yellow, offset by 1 pixel, and add
+ a black shadow to each. (You'd think the shadow alone would be
+ enough, but there's no way to make it dark enough to be legible.)
+ */
+ for (int i = 0; i < 5; i++) {
+ UITextView *textview;
+ int off = 1;
+ frame.origin.x = frame.origin.y = 0;
+ switch (i) {
+ case 0: frame.origin.x = -off; break;
+ case 1: frame.origin.x = off; break;
+ case 2: frame.origin.y = -off; break;
+ case 3: frame.origin.y = off; break;
+ }
+
+ for (int j = 0; j < 2; j++) {
+
+ frame.origin.y = (j == 0 ? 0 : pt1);
+ textview = [[UITextView alloc] initWithFrame:frame];
+ textview.font = (j == 0 ? font1 : font2);
+ textview.text = (j == 0 ? name : year);
+ textview.textAlignment = NSTextAlignmentCenter;
+ textview.showsHorizontalScrollIndicator = NO;
+ textview.showsVerticalScrollIndicator = NO;
+ textview.scrollEnabled = NO;
+ textview.editable = NO;
+ textview.userInteractionEnabled = NO;
+ textview.backgroundColor = [UIColor clearColor];
+ textview.textColor = (i == 4
+ ? [UIColor yellowColor]
+ : [UIColor blackColor]);
+
+ CALayer *textLayer = (CALayer *)
+ [textview.layer.sublayers objectAtIndex:0];
+ textLayer.shadowColor = [UIColor blackColor].CGColor;
+ textLayer.shadowOffset = CGSizeMake(0, 0);
+ textLayer.shadowOpacity = 1;
+ textLayer.shadowRadius = 2;
+
+ [aboutBox addSubview:textview];
+ }
+ }
+
+ CABasicAnimation *anim =
+ [CABasicAnimation animationWithKeyPath:@"opacity"];
+ anim.duration = 0.3;
+ anim.repeatCount = 1;
+ anim.autoreverses = NO;
+ anim.fromValue = [NSNumber numberWithFloat:0.0];
+ anim.toValue = [NSNumber numberWithFloat:1.0];
+ [aboutBox.layer addAnimation:anim forKey:@"animateOpacity"];
+
+ [saverView addSubview:aboutBox];
+
+ if (splashTimer)
+ [splashTimer invalidate];
+
+ splashTimer =
+ [NSTimer scheduledTimerWithTimeInterval: anim.duration + 2
+ target:self
+ selector:@selector(aboutOff)
+ userInfo:nil
+ repeats:NO];
+}
+
+
+- (void)aboutOff
+{
+ [self aboutOff:FALSE];
+}
+
+- (void)aboutOff:(BOOL)fast
+{
+ if (aboutBox) {
+ if (splashTimer) {
+ [splashTimer invalidate];
+ splashTimer = 0;
+ }
+ if (fast) {
+ aboutBox.layer.opacity = 0;
+ return;
+ }
+
+ CABasicAnimation *anim =
+ [CABasicAnimation animationWithKeyPath:@"opacity"];
+ anim.duration = 0.3;
+ anim.repeatCount = 1;
+ anim.autoreverses = NO;
+ anim.fromValue = [NSNumber numberWithFloat: 1];
+ anim.toValue = [NSNumber numberWithFloat: 0];
+ // anim.delegate = self;
+ aboutBox.layer.opacity = 0;
+ [aboutBox.layer addAnimation:anim forKey:@"animateOpacity"];
+ }
+}
+
+
+- (void)createSaverView
+{
+ UIView *parentView = self.view;
+
+ if (_saverView) {
+ [_saverView removeFromSuperview];
+ [_saverView release];
+ }
+
+# if 0
+ if (_storedOrientation != UIInterfaceOrientationUnknown) {
+ [[UIApplication sharedApplication]
+ setStatusBarOrientation:_storedOrientation
+ animated:NO];
+ }
+# endif
+
+ _saverView = [_parent newSaverView:_saverName
+ withSize:parentView.bounds.size];
+
+ if (! _saverView) {
+ UIAlertController *c = [UIAlertController
+ alertControllerWithTitle:@"Unable to load!"
+ message:@""
+ preferredStyle:UIAlertControllerStyleAlert];
+ [c addAction: [UIAlertAction actionWithTitle: @"Bummer"
+ style: UIAlertActionStyleDefault
+ handler: ^(UIAlertAction *a) {
+ // #### Should expose the SaverListController...
+ }]];
+ [self presentViewController:c animated:YES completion:nil];
+
+ return;
+ }
+
+ _saverView.delegate = _parent;
+ _saverView.autoresizingMask =
+ UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
+
+ [self.view addSubview:_saverView];
+
+ // The first responder must be set only after the view was placed in the view
+ // heirarchy.
+ [_saverView becomeFirstResponder]; // For shakes on iOS 6.
+ [_saverView startAnimation];
+ [self aboutPanel:_saverView
+ orientation:/* _storedOrientation */ UIInterfaceOrientationPortrait];
+}
+
+
+- (void)viewDidAppear:(BOOL)animated
+{
+ [super viewDidAppear:animated];
+ [self createSaverView];
+}
+
+
+- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)o
+{
+ return NO; /* Deprecated in iOS 6 */
+}
+
+
+- (BOOL)shouldAutorotate /* Added in iOS 6 */
+{
+ return
+ NSFoundationVersionNumber < NSFoundationVersionNumber_iOS_8_0 ?
+ ![_saverView suppressRotationAnimation] :
+ YES;
+}
+
+
+- (UIInterfaceOrientationMask)supportedInterfaceOrientations /* Added in iOS 6 */
+{
+ // Lies from the iOS docs:
+ // "This method is only called if the view controller's shouldAutorotate
+ // method returns YES."
+ return UIInterfaceOrientationMaskAll;
+}
+
+
+/*
+- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
+{
+ return UIInterfaceOrientationPortrait;
+}
+*/
+
+
+- (void)setSaverName:(NSString *)name
+{
+ [name retain];
+ [_saverName release];
+ _saverName = name;
+ // _storedOrientation =
+ // [UIApplication sharedApplication].statusBarOrientation;
+
+ if (_saverView)
+ [self createSaverView];
+}
+
+
+- (void)viewWillTransitionToSize: (CGSize)size
+ withTransitionCoordinator:
+ (id<UIViewControllerTransitionCoordinator>) coordinator
+{
+ [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
+
+ if (!_saverView)
+ return;
+
+ [CATransaction begin];
+
+ // Completely suppress the rotation animation, since we
+ // will not (visually) be rotating at all.
+ if ([_saverView suppressRotationAnimation])
+ [CATransaction setDisableActions:YES];
+
+ [self aboutOff:TRUE]; // It does goofy things if we rotate while it's up
+
+ [coordinator animateAlongsideTransition:^
+ (id <UIViewControllerTransitionCoordinatorContext> context) {
+ // This executes repeatedly during the rotation.
+ } completion:^(id <UIViewControllerTransitionCoordinatorContext> context) {
+ // This executes once when the rotation has finished.
+ [CATransaction commit];
+ [_saverView orientationChanged];
+ }];
+ // No code goes here, as it would execute before the above completes.
+}
+
+@end
+
+#endif // USE_IPHONE
+
+
+@implementation SaverRunner
+
+
+- (XScreenSaverView *) newSaverView: (NSString *) module
+ withSize: (NSSize) size
+{
+ Class new_class = 0;
+
+# ifndef USE_IPHONE
+
+ // Load the XScreenSaverView subclass and code from a ".saver" bundle.
+
+ NSString *name = [module stringByAppendingPathExtension:@"saver"];
+ NSString *path = [saverDir stringByAppendingPathComponent:name];
+
+ if (! [[NSFileManager defaultManager] fileExistsAtPath:path]) {
+ NSLog(@"bundle \"%@\" does not exist", path);
+ return 0;
+ }
+
+ NSLog(@"Loading %@", path);
+
+ // NSBundle *obundle = saverBundle;
+
+ saverBundle = [NSBundle bundleWithPath:path];
+ if (saverBundle)
+ new_class = [saverBundle principalClass];
+
+ // Not entirely unsurprisingly, this tends to break the world.
+ // if (obundle && obundle != saverBundle)
+ // [obundle unload];
+
+# else // USE_IPHONE
+
+ // Determine whether to create an X11 view or an OpenGL view by
+ // looking for the "gl" tag in the xml file. This is kind of awful.
+
+ NSString *path = [saverDir
+ stringByAppendingPathComponent:
+ [[[module lowercaseString]
+ stringByReplacingOccurrencesOfString:@" "
+ withString:@""]
+ stringByAppendingPathExtension:@"xml"]];
+ NSData *xmld = [NSData dataWithContentsOfFile:path];
+ NSAssert (xmld, @"no XML: %@", path);
+ NSString *xml = [XScreenSaverView decompressXML:xmld];
+ Bool gl_p = (xml && [xml rangeOfString:@"gl=\"yes\""].length > 0);
+
+ new_class = (gl_p
+ ? [XScreenSaverGLView class]
+ : [XScreenSaverView class]);
+
+# endif // USE_IPHONE
+
+ if (! new_class)
+ return 0;
+
+ NSRect rect;
+ rect.origin.x = rect.origin.y = 0;
+ rect.size.width = size.width;
+ rect.size.height = size.height;
+
+ XScreenSaverView *instance =
+ [(XScreenSaverView *) [new_class alloc]
+ initWithFrame:rect
+ saverName:module
+ isPreview:YES];
+ if (! instance) {
+ NSLog(@"Failed to instantiate %@ for \"%@\"", new_class, module);
+ return 0;
+ }
+
+
+ /* KLUGE: Inform the underlying program that we're in "standalone"
+ mode, e.g. running as "Phosphor.app" rather than "Phosphor.saver".
+ This is kind of horrible but I haven't thought of a more sensible
+ way to make this work.
+ */
+# ifndef USE_IPHONE
+ if ([saverNames count] == 1) {
+ setenv ("XSCREENSAVER_STANDALONE", "1", 1);
+ }
+# endif
+
+ return (XScreenSaverView *) instance;
+}
+
+
+#ifndef USE_IPHONE
+
+static ScreenSaverView *
+find_saverView_child (NSView *v)
+{
+ NSArray *kids = [v subviews];
+ NSUInteger nkids = [kids count];
+ NSUInteger i;
+ for (i = 0; i < nkids; i++) {
+ NSObject *kid = [kids objectAtIndex:i];
+ if ([kid isKindOfClass:[ScreenSaverView class]]) {
+ return (ScreenSaverView *) kid;
+ } else {
+ ScreenSaverView *sv = find_saverView_child ((NSView *) kid);
+ if (sv) return sv;
+ }
+ }
+ return 0;
+}
+
+
+static ScreenSaverView *
+find_saverView (NSView *v)
+{
+ while (1) {
+ NSView *p = [v superview];
+ if (p) v = p;
+ else break;
+ }
+ return find_saverView_child (v);
+}
+
+
+/* Changes the contents of the menubar menus to correspond to
+ the running saver. Desktop only.
+ */
+static void
+relabel_menus (NSObject *v, NSString *old_str, NSString *new_str)
+{
+ if ([v isKindOfClass:[NSMenu class]]) {
+ NSMenu *m = (NSMenu *)v;
+ [m setTitle: [[m title] stringByReplacingOccurrencesOfString:old_str
+ withString:new_str]];
+ NSArray *kids = [m itemArray];
+ NSUInteger nkids = [kids count];
+ NSUInteger i;
+ for (i = 0; i < nkids; i++) {
+ relabel_menus ([kids objectAtIndex:i], old_str, new_str);
+ }
+ } else if ([v isKindOfClass:[NSMenuItem class]]) {
+ NSMenuItem *mi = (NSMenuItem *)v;
+ [mi setTitle: [[mi title] stringByReplacingOccurrencesOfString:old_str
+ withString:new_str]];
+ NSMenu *m = [mi submenu];
+ if (m) relabel_menus (m, old_str, new_str);
+ }
+}
+
+
+- (void) openPreferences: (id) sender
+{
+ ScreenSaverView *sv;
+ if ([sender isKindOfClass:[NSView class]]) { // Sent from button
+ sv = find_saverView ((NSView *) sender);
+ } else {
+ long i;
+ NSWindow *w = 0;
+ for (i = [windows count]-1; i >= 0; i--) { // Sent from menubar
+ w = [windows objectAtIndex:i];
+ if ([w isKeyWindow]) break;
+ }
+ sv = find_saverView ([w contentView]);
+ }
+
+ NSAssert (sv, @"no saver view");
+ if (!sv) return;
+ NSWindow *prefs = [sv configureSheet];
+
+ [NSApp beginSheet:prefs
+ modalForWindow:[sv window]
+ modalDelegate:self
+ didEndSelector:@selector(preferencesClosed:returnCode:contextInfo:)
+ contextInfo:nil];
+ NSUInteger code = [NSApp runModalForWindow:prefs];
+
+ /* Restart the animation if the "OK" button was hit, but not if "Cancel".
+ We have to restart *both* animations, because the xlockmore-style
+ ones will blow up if one re-inits but the other doesn't.
+ */
+ if (code != NSCancelButton) {
+ if ([sv isAnimating])
+ [sv stopAnimation];
+ [sv startAnimation];
+ }
+}
+
+
+- (void) preferencesClosed: (NSWindow *) sheet
+ returnCode: (int) returnCode
+ contextInfo: (void *) contextInfo
+{
+ [NSApp stopModalWithCode:returnCode];
+}
+
+#else // USE_IPHONE
+
+
+- (UIImage *) screenshot
+{
+ return saved_screenshot;
+}
+
+- (void) saveScreenshot
+{
+ // Most of this is from:
+ // http://developer.apple.com/library/ios/#qa/qa1703/_index.html
+ // The rotation stuff is by me.
+
+ CGSize size = [[UIScreen mainScreen] bounds].size;
+
+ // iOS 7: Needs to be [[window rootViewController] interfaceOrientation].
+ // iOS 8: Needs to be UIInterfaceOrientationPortrait.
+ // (interfaceOrientation deprecated in iOS 8)
+
+ UIInterfaceOrientation orient = UIInterfaceOrientationPortrait;
+ /* iOS 8 broke -[UIScreen bounds]. */
+
+ if (orient == UIInterfaceOrientationLandscapeLeft ||
+ orient == UIInterfaceOrientationLandscapeRight) {
+ // Rotate the shape of the canvas 90 degrees.
+ double s = size.width;
+ size.width = size.height;
+ size.height = s;
+ }
+
+
+ // Create a graphics context with the target size
+ // On iOS 4 and later, use UIGraphicsBeginImageContextWithOptions to
+ // take the scale into consideration
+ // On iOS prior to 4, fall back to use UIGraphicsBeginImageContext
+
+ UIGraphicsBeginImageContextWithOptions (size, NO, 0);
+
+ CGContextRef ctx = UIGraphicsGetCurrentContext();
+
+
+ // Rotate the graphics context to match current hardware rotation.
+ //
+ switch (orient) {
+ case UIInterfaceOrientationPortraitUpsideDown:
+ CGContextTranslateCTM (ctx, [window center].x, [window center].y);
+ CGContextRotateCTM (ctx, M_PI);
+ CGContextTranslateCTM (ctx, -[window center].x, -[window center].y);
+ break;
+ case UIInterfaceOrientationLandscapeLeft:
+ case UIInterfaceOrientationLandscapeRight:
+ CGContextTranslateCTM (ctx,
+ ([window frame].size.height -
+ [window frame].size.width) / 2,
+ ([window frame].size.width -
+ [window frame].size.height) / 2);
+ CGContextTranslateCTM (ctx, [window center].x, [window center].y);
+ CGContextRotateCTM (ctx,
+ (orient == UIInterfaceOrientationLandscapeLeft
+ ? M_PI/2
+ : -M_PI/2));
+ CGContextTranslateCTM (ctx, -[window center].x, -[window center].y);
+ break;
+ default:
+ break;
+ }
+
+ // Iterate over every window from back to front
+ //
+ for (UIWindow *win in [[UIApplication sharedApplication] windows]) {
+ if (![win respondsToSelector:@selector(screen)] ||
+ [win screen] == [UIScreen mainScreen]) {
+
+ // -renderInContext: renders in the coordinate space of the layer,
+ // so we must first apply the layer's geometry to the graphics context
+ CGContextSaveGState (ctx);
+
+ // Center the context around the window's anchor point
+ CGContextTranslateCTM (ctx, [win center].x, [win center].y);
+
+ // Apply the window's transform about the anchor point
+ CGContextConcatCTM (ctx, [win transform]);
+
+ // Offset by the portion of the bounds left of and above anchor point
+ CGContextTranslateCTM (ctx,
+ -[win bounds].size.width * [[win layer] anchorPoint].x,
+ -[win bounds].size.height * [[win layer] anchorPoint].y);
+
+ // Render the layer hierarchy to the current context
+ [[win layer] renderInContext:ctx];
+
+ // Restore the context
+ CGContextRestoreGState (ctx);
+ }
+ }
+
+ if (saved_screenshot)
+ [saved_screenshot release];
+ saved_screenshot = [UIGraphicsGetImageFromCurrentImageContext() retain];
+
+ UIGraphicsEndImageContext();
+}
+
+
+- (void) openPreferences: (NSString *) saver
+{
+ XScreenSaverView *saverView = [self newSaverView:saver
+ withSize:CGSizeMake(0, 0)];
+ if (! saverView) return;
+
+ NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
+ [prefs setObject:saver forKey:@"selectedSaverName"];
+ [prefs synchronize];
+
+ [rotating_nav pushViewController: [saverView configureView]
+ animated:YES];
+}
+
+
+#endif // USE_IPHONE
+
+
+
+- (void)loadSaver:(NSString *)name
+{
+# ifndef USE_IPHONE
+
+ if (saverName && [saverName isEqualToString: name]) {
+ for (NSWindow *win in windows) {
+ ScreenSaverView *sv = find_saverView ([win contentView]);
+ if (![sv isAnimating])
+ [sv startAnimation];
+ }
+ return;
+ }
+
+ saverName = name;
+
+ for (NSWindow *win in windows) {
+ NSView *cv = [win contentView];
+ NSString *old_title = [win title];
+ if (!old_title) old_title = @"XScreenSaver";
+ [win setTitle: name];
+ relabel_menus (menubar, old_title, name);
+
+ ScreenSaverView *old_view = find_saverView (cv);
+ NSView *sup = old_view ? [old_view superview] : cv;
+
+ if (old_view) {
+ if ([old_view isAnimating])
+ [old_view stopAnimation];
+ [old_view removeFromSuperview];
+ }
+
+ NSSize size = [cv frame].size;
+ ScreenSaverView *new_view = [self newSaverView:name withSize: size];
+ NSAssert (new_view, @"unable to make a saver view");
+
+ [new_view setFrame: (old_view ? [old_view frame] : [cv frame])];
+ [sup addSubview: new_view];
+ [win makeFirstResponder:new_view];
+ [new_view setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable];
+ [new_view startAnimation];
+ [new_view release];
+ }
+
+ NSUserDefaultsController *ctl =
+ [NSUserDefaultsController sharedUserDefaultsController];
+ [ctl save:self];
+
+# else // USE_IPHONE
+
+# if !defined __OPTIMIZE__ || TARGET_IPHONE_SIMULATOR
+ NSLog (@"selecting saver \"%@\"", name);
+# endif
+
+ NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
+ [prefs setObject:name forKey:@"selectedSaverName"];
+ [prefs synchronize];
+
+/* Cacheing this screws up rotation when starting a saver twice in a row.
+ if (saverName && [saverName isEqualToString: name]) {
+ if ([saverView isAnimating])
+ return;
+ else
+ goto LAUNCH;
+ }
+*/
+
+ saverName = name;
+
+ if (nonrotating_controller) {
+ nonrotating_controller.saverName = name;
+ return;
+ }
+
+# if !defined __OPTIMIZE__ || TARGET_IPHONE_SIMULATOR
+ UIScreen *screen = [UIScreen mainScreen];
+
+ /* 'nativeScale' is very confusing.
+
+ iPhone 4s:
+ bounds: 320x480 scale: 2
+ nativeBounds: 640x960 nativeScale: 2
+ iPhone 5s:
+ bounds: 320x568 scale: 2
+ nativeBounds: 640x1136 nativeScale: 2
+ iPad 2:
+ bounds: 768x1024 scale: 1
+ nativeBounds: 768x1024 nativeScale: 1
+ iPad Retina/Air:
+ bounds: 768x1024 scale: 2
+ nativeBounds: 1536x2048 nativeScale: 2
+ iPhone 6:
+ bounds: 320x568 scale: 2
+ nativeBounds: 640x1136 nativeScale: 2
+ iPhone 6+:
+ bounds: 320x568 scale: 2
+ nativeBounds: 960x1704 nativeScale: 3
+
+ According to a StackOverflow comment:
+
+ The iPhone 6+ renders internally using @3x assets at a virtual
+ resolution of 2208x1242 (with 736x414 points), then samples that down
+ for display. The same as using a scaled resolution on a Retina MacBook
+ -- it lets them hit an integral multiple for pixel assets while still
+ having e.g. 12pt text look the same size on the screen.
+
+ The 6, the 5s, the 5, the 4s and the 4 are all 326 pixels per inch,
+ and use @2x assets to stick to the approximately 160 points per inch
+ of all previous devices.
+
+ The 6+ is 401 pixels per inch. So it'd hypothetically need roughly
+ @2.46x assets. Instead Apple uses @3x assets and scales the complete
+ output down to about 84% of its natural size.
+
+ In practice Apple has decided to go with more like 87%, turning the
+ 1080 into 1242. No doubt that was to find something as close as
+ possible to 84% that still produced integral sizes in both directions
+ -- 1242/1080 = 2208/1920 exactly, whereas if you'd turned the 1080
+ into, say, 1286, you'd somehow need to render 2286.22 pixels
+ vertically to scale well.
+ */
+
+ NSLog(@"screen: %.0fx%0.f",
+ [[screen currentMode] size].width,
+ [[screen currentMode] size].height);
+ NSLog(@"bounds: %.0fx%0.f x %.1f = %.0fx%0.f",
+ [screen bounds].size.width,
+ [screen bounds].size.height,
+ [screen scale],
+ [screen scale] * [screen bounds].size.width,
+ [screen scale] * [screen bounds].size.height);
+
+# ifdef __IPHONE_8_0
+ if ([screen respondsToSelector:@selector(nativeBounds)])
+ NSLog(@"native: %.0fx%0.f / %.1f = %.0fx%0.f",
+ [screen nativeBounds].size.width,
+ [screen nativeBounds].size.height,
+ [screen nativeScale],
+ [screen nativeBounds].size.width / [screen nativeScale],
+ [screen nativeBounds].size.height / [screen nativeScale]);
+# endif
+# endif // TARGET_IPHONE_SIMULATOR
+
+ // Take the screen shot before creating the screen saver view, because this
+ // can screw with the layout.
+ [self saveScreenshot];
+
+ // iOS 3.2. Before this were iPhones (and iPods) only, which always did modal
+ // presentation full screen.
+ rotating_nav.modalPresentationStyle = UIModalPresentationFullScreen;
+
+ nonrotating_controller = [[SaverViewController alloc]
+ initWithSaverRunner:self
+ showAboutBox:[saverNames count] != 1];
+ nonrotating_controller.saverName = name;
+
+ /* LAUNCH: */
+
+ [rotating_nav presentViewController:nonrotating_controller animated:NO completion:nil];
+
+ // Doing this makes savers cut back to the list instead of fading,
+ // even though [XScreenSaverView stopAndClose] does setHidden:NO first.
+ // [window setHidden:YES];
+
+# endif // USE_IPHONE
+}
+
+
+#ifndef USE_IPHONE
+
+- (void)aboutPanel:(id)sender
+{
+ NSDictionary *bd = [saverBundle infoDictionary];
+ NSMutableDictionary *d = [NSMutableDictionary dictionaryWithCapacity:20];
+
+ [d setValue:[bd objectForKey:@"CFBundleName"] forKey:@"ApplicationName"];
+ [d setValue:[bd objectForKey:@"CFBundleVersion"] forKey:@"Version"];
+ [d setValue:[bd objectForKey:@"CFBundleShortVersionString"]
+ forKey:@"ApplicationVersion"];
+ [d setValue:[bd objectForKey:@"NSHumanReadableCopyright"] forKey:@"Copy"];
+ NSAttributedString *s = [[NSAttributedString alloc]
+ initWithString: (NSString *)
+ [bd objectForKey:@"CFBundleGetInfoString"]];
+ [d setValue:s forKey:@"Credits"];
+ [s release];
+
+ [[NSApplication sharedApplication]
+ orderFrontStandardAboutPanelWithOptions:d];
+}
+
+#endif // !USE_IPHONE
+
+
+
+- (void)selectedSaverDidChange:(NSDictionary *)change
+{
+ NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
+ NSString *name = [prefs stringForKey:@"selectedSaverName"];
+
+ if (! name) return;
+
+ if (! [saverNames containsObject:name]) {
+ NSLog (@"saver \"%@\" does not exist", name);
+ return;
+ }
+
+ [self loadSaver: name];
+}
+
+
+- (NSArray *) listSaverBundleNamesInDir:(NSString *)dir
+{
+# ifndef USE_IPHONE
+ NSString *ext = @"saver";
+# else
+ NSString *ext = @"xml";
+# endif
+
+ NSArray *files = [[NSFileManager defaultManager]
+ contentsOfDirectoryAtPath:dir error:nil];
+ if (! files) return 0;
+ NSMutableArray *result = [NSMutableArray arrayWithCapacity: [files count]+1];
+
+ for (NSString *p in files) {
+ if ([[p pathExtension] caseInsensitiveCompare: ext])
+ continue;
+
+ NSString *name = [[p lastPathComponent] stringByDeletingPathExtension];
+
+# ifdef USE_IPHONE
+ // Get the saver name's capitalization right by reading the XML file.
+
+ p = [dir stringByAppendingPathComponent: p];
+ NSData *xmld = [NSData dataWithContentsOfFile:p];
+ NSAssert (xmld, @"no XML: %@", p);
+ NSString *xml = [XScreenSaverView decompressXML:xmld];
+ NSRange r = [xml rangeOfString:@"_label=\"" options:0];
+ NSAssert1 (r.length, @"no name in %@", p);
+ if (r.length) {
+ xml = [xml substringFromIndex: r.location + r.length];
+ r = [xml rangeOfString:@"\"" options:0];
+ if (r.length) name = [xml substringToIndex: r.location];
+ }
+
+# endif // USE_IPHONE
+
+ NSAssert1 (name, @"no name in %@", p);
+ if (name) [result addObject: name];
+ }
+
+ if (! [result count])
+ result = 0;
+
+ return result;
+}
+
+
+
+- (NSArray *) listSaverBundleNames
+{
+ NSMutableArray *dirs = [NSMutableArray arrayWithCapacity: 10];
+
+# ifndef USE_IPHONE
+ // On MacOS, look in the "Contents/Resources/" and "Contents/PlugIns/"
+ // directories in the bundle.
+ [dirs addObject: [[[[NSBundle mainBundle] bundlePath]
+ stringByAppendingPathComponent:@"Contents"]
+ stringByAppendingPathComponent:@"Resources"]];
+ [dirs addObject: [[NSBundle mainBundle] builtInPlugInsPath]];
+
+ // Also look in the same directory as the executable.
+ [dirs addObject: [[[NSBundle mainBundle] bundlePath]
+ stringByDeletingLastPathComponent]];
+
+ // Finally, look in standard MacOS screensaver directories.
+// [dirs addObject: @"~/Library/Screen Savers"];
+// [dirs addObject: @"/Library/Screen Savers"];
+// [dirs addObject: @"/System/Library/Screen Savers"];
+
+# else // USE_IPHONE
+
+ // On iOS, only look in the bundle's root directory.
+ [dirs addObject: [[NSBundle mainBundle] bundlePath]];
+
+# endif // USE_IPHONE
+
+ int i;
+ for (i = 0; i < [dirs count]; i++) {
+ NSString *dir = [dirs objectAtIndex:i];
+ NSArray *names = [self listSaverBundleNamesInDir:dir];
+ if (! names) continue;
+ saverDir = [dir retain];
+ saverNames = [names retain];
+ return names;
+ }
+
+ NSString *err = @"no .saver bundles found in: ";
+ for (i = 0; i < [dirs count]; i++) {
+ if (i) err = [err stringByAppendingString:@", "];
+ err = [err stringByAppendingString:[[dirs objectAtIndex:i]
+ stringByAbbreviatingWithTildeInPath]];
+ err = [err stringByAppendingString:@"/"];
+ }
+ NSLog (@"%@", err);
+ return [NSArray array];
+}
+
+
+/* Create the popup menu of available saver names.
+ */
+#ifndef USE_IPHONE
+
+- (NSPopUpButton *) makeMenu
+{
+ NSRect rect;
+ rect.origin.x = rect.origin.y = 0;
+ rect.size.width = 10;
+ rect.size.height = 10;
+ NSPopUpButton *popup = [[NSPopUpButton alloc] initWithFrame:rect
+ pullsDown:NO];
+ int i;
+ float max_width = 0;
+ for (i = 0; i < [saverNames count]; i++) {
+ NSString *name = [saverNames objectAtIndex:i];
+ [popup addItemWithTitle:name];
+ [[popup itemWithTitle:name] setRepresentedObject:name];
+ [popup sizeToFit];
+ NSRect r = [popup frame];
+ if (r.size.width > max_width) max_width = r.size.width;
+ }
+
+ // Bind the menu to preferences, and trigger a callback when an item
+ // is selected.
+ //
+ NSString *key = @"values.selectedSaverName";
+ NSUserDefaultsController *prefs =
+ [NSUserDefaultsController sharedUserDefaultsController];
+ [prefs addObserver:self
+ forKeyPath:key
+ options:0
+ context:@selector(selectedSaverDidChange:)];
+ [popup bind:@"selectedObject"
+ toObject:prefs
+ withKeyPath:key
+ options:nil];
+ [prefs setAppliesImmediately:YES];
+
+ NSRect r = [popup frame];
+ r.size.width = max_width;
+ [popup setFrame:r];
+ [popup autorelease];
+ return popup;
+}
+
+#else // USE_IPHONE
+
+- (NSString *) makeDesc:(NSString *)saver
+ yearOnly:(BOOL) yearp
+{
+ NSString *desc = 0;
+ NSString *path = [saverDir stringByAppendingPathComponent:
+ [[saver lowercaseString]
+ stringByReplacingOccurrencesOfString:@" "
+ withString:@""]];
+ NSRange r;
+
+ path = [path stringByAppendingPathExtension:@"xml"];
+ NSData *xmld = [NSData dataWithContentsOfFile:path];
+ if (! xmld) goto FAIL;
+ desc = [XScreenSaverView decompressXML:xmld];
+ if (! desc) goto FAIL;
+
+ r = [desc rangeOfString:@"<_description>"
+ options:NSCaseInsensitiveSearch];
+ if (r.length == 0) {
+ desc = 0;
+ goto FAIL;
+ }
+ desc = [desc substringFromIndex: r.location + r.length];
+ r = [desc rangeOfString:@"</_description>"
+ options:NSCaseInsensitiveSearch];
+ if (r.length > 0)
+ desc = [desc substringToIndex: r.location];
+
+ // Leading and trailing whitespace.
+ desc = [desc stringByTrimmingCharactersInSet:
+ [NSCharacterSet whitespaceAndNewlineCharacterSet]];
+
+ // Let's see if we can find a year on the last line.
+ r = [desc rangeOfString:@"\n" options:NSBackwardsSearch];
+ NSString *year = 0;
+ for (NSString *word in
+ [[desc substringFromIndex:r.location + r.length]
+ componentsSeparatedByCharactersInSet:
+ [NSCharacterSet characterSetWithCharactersInString:
+ @" \t\n-."]]) {
+ int n = [word doubleValue];
+ if (n > 1970 && n < 2100)
+ year = word;
+ }
+
+ // Delete everything after the first blank line.
+ //
+ r = [desc rangeOfString:@"\n\n" options:0];
+ if (r.length > 0)
+ desc = [desc substringToIndex: r.location];
+
+ // Unwrap lines and compress whitespace.
+ {
+ NSString *result = @"";
+ for (NSString *s in [desc componentsSeparatedByCharactersInSet:
+ [NSCharacterSet whitespaceAndNewlineCharacterSet]]) {
+ if ([result length] == 0)
+ result = s;
+ else if ([s length] > 0)
+ result = [NSString stringWithFormat: @"%@ %@", result, s];
+ desc = result;
+ }
+ }
+
+ if (year)
+ desc = [year stringByAppendingString:
+ [@": " stringByAppendingString: desc]];
+
+ if (yearp)
+ desc = year ? year : @"";
+
+FAIL:
+ if (! desc) {
+ if ([saverNames count] > 1)
+ desc = @"Oops, this module appears to be incomplete.";
+ else
+ desc = @"";
+ }
+
+ return desc;
+}
+
+- (NSString *) makeDesc:(NSString *)saver
+{
+ return [self makeDesc:saver yearOnly:NO];
+}
+
+
+
+/* Create a dictionary of one-line descriptions of every saver,
+ for display on the UITableView.
+ */
+- (NSDictionary *)makeDescTable
+{
+ NSMutableDictionary *dict =
+ [NSMutableDictionary dictionaryWithCapacity:[saverNames count]];
+ for (NSString *saver in saverNames) {
+ [dict setObject:[self makeDesc:saver] forKey:saver];
+ }
+ return dict;
+}
+
+
+- (void) wantsFadeOut:(XScreenSaverView *)sender
+{
+ rotating_nav.view.hidden = NO; // In case it was hidden during startup.
+
+ /* The XScreenSaverView screws with the status bar orientation, mostly to
+ keep the simulator oriented properly. But on iOS 8.1 (and maybe 8.0
+ and/or 8.2), this confuses the UINavigationController, so put the
+ orientation back to portrait before dismissing the SaverViewController.
+ */
+# if 0
+ [[UIApplication sharedApplication]
+ setStatusBarOrientation:UIInterfaceOrientationPortrait
+ animated:NO];
+# endif
+
+ /* Make sure the most-recently-run saver is visible. Sometimes it ends
+ up scrolled half a line off the bottom of the screen.
+ */
+ if (saverName) {
+ for (UIViewController *v in [rotating_nav viewControllers]) {
+ if ([v isKindOfClass:[SaverListController class]]) {
+ [(SaverListController *)v scrollTo: saverName];
+ break;
+ }
+ }
+ }
+
+ [rotating_nav dismissViewControllerAnimated:YES completion:^() {
+ [nonrotating_controller release];
+ nonrotating_controller = nil;
+ [[rotating_nav view] becomeFirstResponder];
+ }];
+}
+
+
+- (void) didShake:(XScreenSaverView *)sender
+{
+# if TARGET_IPHONE_SIMULATOR
+ NSLog (@"simulating shake on saver list");
+# endif
+ [[rotating_nav topViewController] motionEnded: UIEventSubtypeMotionShake
+ withEvent: nil];
+}
+
+
+#endif // USE_IPHONE
+
+
+
+/* This is called when the "selectedSaverName" pref changes, e.g.,
+ when a menu selection is made.
+ */
+- (void)observeValueForKeyPath:(NSString *)keyPath
+ ofObject:(id)object
+ change:(NSDictionary *)change
+ context:(void *)context
+{
+ SEL dispatchSelector = (SEL)context;
+ if (dispatchSelector != NULL) {
+ [self performSelector:dispatchSelector withObject:change];
+ } else {
+ [super observeValueForKeyPath:keyPath
+ ofObject:object
+ change:change
+ context:context];
+ }
+}
+
+
+# ifndef USE_IPHONE
+
+/* Create the desktop window shell, possibly including a preferences button.
+ */
+- (NSWindow *) makeWindow
+{
+ NSRect rect;
+ static int count = 0;
+ Bool simple_p = ([saverNames count] == 1);
+ NSButton *pb = 0;
+ NSPopUpButton *menu = 0;
+ NSBox *gbox = 0;
+ NSBox *pbox = 0;
+
+ NSRect sv_rect;
+ sv_rect.origin.x = sv_rect.origin.y = 0;
+ sv_rect.size.width = 320;
+ sv_rect.size.height = 240;
+ ScreenSaverView *sv = [[ScreenSaverView alloc] // dummy placeholder
+ initWithFrame:sv_rect
+ isPreview:YES];
+
+ // make a "Preferences" button
+ //
+ if (! simple_p) {
+ rect.origin.x = 0;
+ rect.origin.y = 0;
+ rect.size.width = rect.size.height = 10;
+ pb = [[NSButton alloc] initWithFrame:rect];
+ [pb setTitle:@"Preferences"];
+ [pb setBezelStyle:NSRoundedBezelStyle];
+ [pb sizeToFit];
+
+ rect.origin.x = ([sv frame].size.width -
+ [pb frame].size.width) / 2;
+ [pb setFrameOrigin:rect.origin];
+
+ // grab the click
+ //
+ [pb setTarget:self];
+ [pb setAction:@selector(openPreferences:)];
+
+ // Make a saver selection menu
+ //
+ menu = [self makeMenu];
+ rect.origin.x = 2;
+ rect.origin.y = 2;
+ [menu setFrameOrigin:rect.origin];
+
+ // make a box to wrap the saverView
+ //
+ rect = [sv frame];
+ rect.origin.x = 0;
+ rect.origin.y = [pb frame].origin.y + [pb frame].size.height;
+ gbox = [[NSBox alloc] initWithFrame:rect];
+ rect.size.width = rect.size.height = 10;
+ [gbox setContentViewMargins:rect.size];
+ [gbox setTitlePosition:NSNoTitle];
+ [gbox addSubview:sv];
+ [gbox sizeToFit];
+
+ // make a box to wrap the other two boxes
+ //
+ rect.origin.x = rect.origin.y = 0;
+ rect.size.width = [gbox frame].size.width;
+ rect.size.height = [gbox frame].size.height + [gbox frame].origin.y;
+ pbox = [[NSBox alloc] initWithFrame:rect];
+ [pbox setTitlePosition:NSNoTitle];
+ [pbox setBorderType:NSNoBorder];
+ [pbox addSubview:gbox];
+ [gbox release];
+ if (menu) [pbox addSubview:menu];
+ if (pb) [pbox addSubview:pb];
+ [pb release];
+ [pbox sizeToFit];
+
+ [pb setAutoresizingMask:NSViewMinXMargin|NSViewMaxXMargin];
+ [menu setAutoresizingMask:NSViewMinXMargin|NSViewMaxXMargin];
+ [gbox setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable];
+ [pbox setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable];
+ }
+
+ [sv setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable];
+
+
+ // and make a window to hold that.
+ //
+ NSScreen *screen = [NSScreen mainScreen];
+ rect = pbox ? [pbox frame] : [sv frame];
+ rect.origin.x = ([screen frame].size.width - rect.size.width) / 2;
+ rect.origin.y = ([screen frame].size.height - rect.size.height) / 2;
+
+ rect.origin.x += rect.size.width * (count ? 0.55 : -0.55);
+
+ NSWindow *win = [[NSWindow alloc]
+ initWithContentRect:rect
+ styleMask:(NSTitledWindowMask |
+ NSClosableWindowMask |
+ NSMiniaturizableWindowMask |
+ NSResizableWindowMask)
+ backing:NSBackingStoreBuffered
+ defer:YES
+ screen:screen];
+// [win setMinSize:[win frameRectForContentRect:rect].size];
+ [[win contentView] addSubview: (pbox ? (NSView *) pbox : (NSView *) sv)];
+ [pbox release];
+
+ [win makeKeyAndOrderFront:win];
+
+ [sv startAnimation]; // this is the dummy saver
+ [sv autorelease];
+
+ count++;
+
+ return win;
+}
+
+
+- (void) animTimer
+{
+ for (NSWindow *win in windows) {
+ ScreenSaverView *sv = find_saverView ([win contentView]);
+ if ([sv isAnimating])
+ [sv animateOneFrame];
+ }
+}
+
+# endif // !USE_IPHONE
+
+
+- (void)applicationDidFinishLaunching:
+# ifndef USE_IPHONE
+ (NSNotification *) notif
+# else // USE_IPHONE
+ (UIApplication *) application
+# endif // USE_IPHONE
+{
+ [self listSaverBundleNames];
+
+ NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
+
+# ifndef USE_IPHONE
+ int window_count = ([saverNames count] <= 1 ? 1 : 2);
+ NSMutableArray *a = [[NSMutableArray arrayWithCapacity: window_count+1]
+ retain];
+ windows = a;
+
+ int i;
+ // Create either one window (for standalone, e.g. Phosphor.app)
+ // or two windows for SaverTester.app.
+ for (i = 0; i < window_count; i++) {
+ NSWindow *win = [self makeWindow];
+ [win setDelegate:self];
+ // Get the last-saved window position out of preferences.
+ [win setFrameAutosaveName:
+ [NSString stringWithFormat:@"XScreenSaverWindow%d", i]];
+ [win setFrameUsingName:[win frameAutosaveName]];
+ [a addObject: win];
+ // This prevents clicks from being seen by savers.
+ // [win setMovableByWindowBackground:YES];
+ win.releasedWhenClosed = NO;
+ [win release];
+ }
+# else // USE_IPHONE
+
+# undef ya_rand_init
+ ya_rand_init (0); // Now's a good time.
+
+
+ /* iOS docs say:
+ "You must call this method before attempting to get orientation data from
+ the receiver. This method enables the device's accelerometer hardware
+ and begins the delivery of acceleration events to the receiver."
+
+ Adding or removing this doesn't seem to make any difference. It's
+ probably getting called by the UINavigationController. Still... */
+ [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
+
+ rotating_nav = [[[RotateyViewController alloc] initWithRotation:YES]
+ retain];
+
+ if ([prefs boolForKey:@"wasRunning"]) // Prevents menu flicker on startup.
+ rotating_nav.view.hidden = YES;
+
+ [window setRootViewController: rotating_nav];
+ [window setAutoresizesSubviews:YES];
+ [window setAutoresizingMask:
+ (UIViewAutoresizingFlexibleWidth |
+ UIViewAutoresizingFlexibleHeight)];
+
+ SaverListController *menu = [[SaverListController alloc]
+ initWithNames:saverNames
+ descriptions:[self makeDescTable]];
+ [rotating_nav pushViewController:menu animated:YES];
+ [menu becomeFirstResponder];
+ [menu autorelease];
+
+ application.applicationSupportsShakeToEdit = YES;
+
+
+# endif // USE_IPHONE
+
+ NSString *forced = 0;
+ /* In the XCode project, each .saver scheme sets this env var when
+ launching SaverTester.app so that it knows which one we are
+ currently debugging. If this is set, it overrides the default
+ selection in the popup menu. If unset, that menu persists to
+ whatever it was last time.
+ */
+ const char *f = getenv ("SELECTED_SAVER");
+ if (f && *f)
+ forced = [NSString stringWithCString:(char *)f
+ encoding:NSUTF8StringEncoding];
+
+ if (forced && ![saverNames containsObject:forced]) {
+ NSLog(@"forced saver \"%@\" does not exist", forced);
+ forced = 0;
+ }
+
+ // If there's only one saver, run that.
+ if (!forced && [saverNames count] == 1)
+ forced = [saverNames objectAtIndex:0];
+
+# ifdef USE_IPHONE
+ NSString *prev = [prefs stringForKey:@"selectedSaverName"];
+
+ if (forced)
+ prev = forced;
+
+ // If nothing was selected (e.g., this is the first launch)
+ // then scroll randomly instead of starting up at "A".
+ //
+ if (!prev)
+ prev = [saverNames objectAtIndex: (random() % [saverNames count])];
+
+ if (prev)
+ [menu scrollTo: prev];
+# endif // USE_IPHONE
+
+ if (forced)
+ [prefs setObject:forced forKey:@"selectedSaverName"];
+
+# ifdef USE_IPHONE
+ /* Don't auto-launch the saver unless it was running last time.
+ XScreenSaverView manages this, on crash_timer.
+ Unless forced.
+ */
+ if (!forced && ![prefs boolForKey:@"wasRunning"])
+ return;
+# endif
+
+ [self selectedSaverDidChange:nil];
+// [NSTimer scheduledTimerWithTimeInterval: 0
+// target:self
+// selector:@selector(selectedSaverDidChange:)
+// userInfo:nil
+// repeats:NO];
+
+
+
+# ifndef USE_IPHONE
+ /* On 10.8 and earlier, [ScreenSaverView startAnimation] causes the
+ ScreenSaverView to run its own timer calling animateOneFrame.
+ On 10.9, that fails because the private class ScreenSaverModule
+ is only initialized properly by ScreenSaverEngine, and in the
+ context of SaverRunner, the null ScreenSaverEngine instance
+ behaves as if [ScreenSaverEngine needsAnimationTimer] returned false.
+ So, if it looks like this is the 10.9 version of ScreenSaverModule
+ instead of the 10.8 version, we run our own timer here. This sucks.
+ */
+ if (!anim_timer) {
+ Class ssm = NSClassFromString (@"ScreenSaverModule");
+ if (ssm && [ssm instancesRespondToSelector:
+ NSSelectorFromString(@"needsAnimationTimer")]) {
+ NSWindow *win = [windows objectAtIndex:0];
+ ScreenSaverView *sv = find_saverView ([win contentView]);
+ anim_timer = [NSTimer scheduledTimerWithTimeInterval:
+ [sv animationTimeInterval]
+ target:self
+ selector:@selector(animTimer)
+ userInfo:nil
+ repeats:YES];
+ }
+ }
+# endif // !USE_IPHONE
+}
+
+
+#ifndef USE_IPHONE
+
+/* When the window closes, exit (even if prefs still open.)
+ */
+- (BOOL) applicationShouldTerminateAfterLastWindowClosed: (NSApplication *) n
+{
+ return YES;
+}
+
+/* When the window is about to close, stop its animation.
+ Without this, timers might fire after the window is dead.
+ */
+- (void)windowWillClose:(NSNotification *)notification
+{
+ NSWindow *win = [notification object];
+ NSView *cv = win ? [win contentView] : 0;
+ ScreenSaverView *sv = cv ? find_saverView (cv) : 0;
+ if (sv && [sv isAnimating])
+ [sv stopAnimation];
+}
+
+# else // USE_IPHONE
+
+- (void)applicationWillResignActive:(UIApplication *)app
+{
+ [(XScreenSaverView *)view setScreenLocked:YES];
+}
+
+- (void)applicationDidBecomeActive:(UIApplication *)app
+{
+ [(XScreenSaverView *)view setScreenLocked:NO];
+}
+
+- (void)applicationDidEnterBackground:(UIApplication *)application
+{
+ [(XScreenSaverView *)view setScreenLocked:YES];
+}
+
+#endif // USE_IPHONE
+
+
+@end
diff --git a/OSX/SaverRunner.plist b/OSX/SaverRunner.plist
new file mode 100644
index 0000000..3ad0ce7
--- /dev/null
+++ b/OSX/SaverRunner.plist
@@ -0,0 +1,38 @@
+<?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>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleGetInfoString</key>
+ <string>5.40</string>
+ <key>CFBundleIconFile</key>
+ <string>SaverRunner</string>
+ <key>CFBundleIdentifier</key>
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleLongVersionString</key>
+ <string>5.40</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>5.40</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>5.40</string>
+ <key>LSMinimumSystemVersion</key>
+ <string>${MACOSX_DEPLOYMENT_TARGET}</string>
+ <key>NSHumanReadableCopyright</key>
+ <string>5.40</string>
+ <key>NSMainNibFile</key>
+ <string>SaverRunner</string>
+ <key>NSPrincipalClass</key>
+ <string>NSApplication</string>
+</dict>
+</plist>
diff --git a/OSX/Sparkle.framework/Headers b/OSX/Sparkle.framework/Headers
new file mode 120000
index 0000000..a177d2a
--- /dev/null
+++ b/OSX/Sparkle.framework/Headers
@@ -0,0 +1 @@
+Versions/Current/Headers \ No newline at end of file
diff --git a/OSX/Sparkle.framework/Resources b/OSX/Sparkle.framework/Resources
new file mode 120000
index 0000000..953ee36
--- /dev/null
+++ b/OSX/Sparkle.framework/Resources
@@ -0,0 +1 @@
+Versions/Current/Resources \ No newline at end of file
diff --git a/OSX/Sparkle.framework/Sparkle b/OSX/Sparkle.framework/Sparkle
new file mode 120000
index 0000000..b2c5273
--- /dev/null
+++ b/OSX/Sparkle.framework/Sparkle
@@ -0,0 +1 @@
+Versions/Current/Sparkle \ No newline at end of file
diff --git a/OSX/Sparkle.framework/Versions/A/Headers/SUAppcast.h b/OSX/Sparkle.framework/Versions/A/Headers/SUAppcast.h
new file mode 100755
index 0000000..5a60d2f
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Headers/SUAppcast.h
@@ -0,0 +1,36 @@
+//
+// SUAppcast.h
+// Sparkle
+//
+// Created by Andy Matuschak on 3/12/06.
+// Copyright 2006 Andy Matuschak. All rights reserved.
+//
+
+#ifndef SUAPPCAST_H
+#define SUAPPCAST_H
+
+@class SUAppcastItem;
+@interface SUAppcast : NSObject
+{
+@private
+ NSArray *items;
+ NSString *userAgentString;
+ id delegate;
+ NSString *downloadFilename;
+ NSURLDownload *download;
+}
+
+- (void)fetchAppcastFromURL:(NSURL *)url;
+- (void)setDelegate:delegate;
+- (void)setUserAgentString:(NSString *)userAgentString;
+
+- (NSArray *)items;
+
+@end
+
+@interface NSObject (SUAppcastDelegate)
+- (void)appcastDidFinishLoading:(SUAppcast *)appcast;
+- (void)appcast:(SUAppcast *)appcast failedToLoadWithError:(NSError *)error;
+@end
+
+#endif
diff --git a/OSX/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h b/OSX/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h
new file mode 100755
index 0000000..d6f9c64
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h
@@ -0,0 +1,60 @@
+//
+// SUAppcastItem.h
+// Sparkle
+//
+// Created by Andy Matuschak on 3/12/06.
+// Copyright 2006 Andy Matuschak. All rights reserved.
+//
+
+#ifndef SUAPPCASTITEM_H
+#define SUAPPCASTITEM_H
+
+@interface SUAppcastItem : NSObject
+{
+@private
+ NSString *title;
+ NSDate *date;
+ NSString *itemDescription;
+
+ NSURL *releaseNotesURL;
+
+ NSString *DSASignature;
+ NSString *minimumSystemVersion;
+ NSString *maximumSystemVersion;
+
+ NSURL *fileURL;
+ NSString *versionString;
+ NSString *displayVersionString;
+
+ NSDictionary *deltaUpdates;
+
+ NSDictionary *propertiesDictionary;
+
+ NSURL *infoURL; // UK 2007-08-31
+}
+
+// Initializes with data from a dictionary provided by the RSS class.
+- initWithDictionary:(NSDictionary *)dict;
+- initWithDictionary:(NSDictionary *)dict failureReason:(NSString**)error;
+
+- (NSString *)title;
+- (NSString *)versionString;
+- (NSString *)displayVersionString;
+- (NSDate *)date;
+- (NSString *)itemDescription;
+- (NSURL *)releaseNotesURL;
+- (NSURL *)fileURL;
+- (NSString *)DSASignature;
+- (NSString *)minimumSystemVersion;
+- (NSString *)maximumSystemVersion;
+- (NSDictionary *)deltaUpdates;
+- (BOOL)isDeltaUpdate;
+
+// Returns the dictionary provided in initWithDictionary; this might be useful later for extensions.
+- (NSDictionary *)propertiesDictionary;
+
+- (NSURL *)infoURL; // UK 2007-08-31
+
+@end
+
+#endif
diff --git a/OSX/Sparkle.framework/Versions/A/Headers/SUUpdater.h b/OSX/Sparkle.framework/Versions/A/Headers/SUUpdater.h
new file mode 100755
index 0000000..cd79566
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Headers/SUUpdater.h
@@ -0,0 +1,161 @@
+//
+// SUUpdater.h
+// Sparkle
+//
+// Created by Andy Matuschak on 1/4/06.
+// Copyright 2006 Andy Matuschak. All rights reserved.
+//
+
+#ifndef SUUPDATER_H
+#define SUUPDATER_H
+
+#import "SUVersionComparisonProtocol.h"
+#import "SUVersionDisplayProtocol.h"
+
+@class SUUpdateDriver, SUAppcastItem, SUHost, SUAppcast;
+
+@interface SUUpdater : NSObject
+{
+@private
+ NSTimer *checkTimer;
+ SUUpdateDriver *driver;
+
+ NSString *customUserAgentString;
+ SUHost *host;
+ IBOutlet id delegate;
+}
+
++ (SUUpdater *)sharedUpdater;
++ (SUUpdater *)updaterForBundle:(NSBundle *)bundle;
+- (id)initForBundle:(NSBundle *)bundle;
+
+- (NSBundle *)hostBundle;
+
+- (void)setDelegate:(id)delegate;
+- (id)delegate;
+
+- (void)setAutomaticallyChecksForUpdates:(BOOL)automaticallyChecks;
+- (BOOL)automaticallyChecksForUpdates;
+
+- (void)setUpdateCheckInterval:(NSTimeInterval)interval;
+- (NSTimeInterval)updateCheckInterval;
+
+- (void)setFeedURL:(NSURL *)feedURL;
+- (NSURL *)feedURL; // *** MUST BE CALLED ON MAIN THREAD ***
+
+- (void)setUserAgentString:(NSString *)userAgent;
+- (NSString *)userAgentString;
+
+- (void)setSendsSystemProfile:(BOOL)sendsSystemProfile;
+- (BOOL)sendsSystemProfile;
+
+- (void)setAutomaticallyDownloadsUpdates:(BOOL)automaticallyDownloadsUpdates;
+- (BOOL)automaticallyDownloadsUpdates;
+
+// This IBAction is meant for a main menu item. Hook up any menu item to this action,
+// and Sparkle will check for updates and report back its findings verbosely.
+- (IBAction)checkForUpdates:(id)sender;
+
+// This kicks off an update meant to be programmatically initiated. That is, it will display no UI unless it actually finds an update,
+// in which case it proceeds as usual. If the fully automated updating is turned on, however, this will invoke that behavior, and if an
+// update is found, it will be downloaded and prepped for installation.
+- (void)checkForUpdatesInBackground;
+
+// Date of last update check. Returns nil if no check has been performed.
+- (NSDate*)lastUpdateCheckDate;
+
+// This begins a "probing" check for updates which will not actually offer to update to that version. The delegate methods, though,
+// (up to updater:didFindValidUpdate: and updaterDidNotFindUpdate:), are called, so you can use that information in your UI.
+- (void)checkForUpdateInformation;
+
+// Call this to appropriately schedule or cancel the update checking timer according to the preferences for time interval and automatic checks. This call does not change the date of the next check, but only the internal NSTimer.
+- (void)resetUpdateCycle;
+
+- (BOOL)updateInProgress;
+
+@end
+
+
+// -----------------------------------------------------------------------------
+// SUUpdater Delegate:
+// -----------------------------------------------------------------------------
+
+@interface NSObject (SUUpdaterDelegateInformalProtocol)
+
+// Use this to keep Sparkle from popping up e.g. while your setup assistant is showing:
+- (BOOL)updaterMayCheckForUpdates:(SUUpdater *)bundle;
+
+// This method allows you to add extra parameters to the appcast URL, potentially based on whether or not Sparkle will also be sending along the system profile. This method should return an array of dictionaries with keys: "key", "value", "displayKey", "displayValue", the latter two being specifically for display to the user.
+- (NSArray *)feedParametersForUpdater:(SUUpdater *)updater sendingSystemProfile:(BOOL)sendingProfile;
+
+// Override this to dynamically specify the entire URL.
+- (NSString*)feedURLStringForUpdater:(SUUpdater*)updater;
+
+// Use this to override the default behavior for Sparkle prompting the user about automatic update checks.
+- (BOOL)updaterShouldPromptForPermissionToCheckForUpdates:(SUUpdater *)bundle;
+
+// Implement this if you want to do some special handling with the appcast once it finishes loading.
+- (void)updater:(SUUpdater *)updater didFinishLoadingAppcast:(SUAppcast *)appcast;
+
+// If you're using special logic or extensions in your appcast, implement this to use your own logic for finding
+// a valid update, if any, in the given appcast.
+- (SUAppcastItem *)bestValidUpdateInAppcast:(SUAppcast *)appcast forUpdater:(SUUpdater *)bundle;
+
+// Sent when a valid update is found by the update driver.
+- (void)updater:(SUUpdater *)updater didFindValidUpdate:(SUAppcastItem *)update;
+
+// Sent when a valid update is not found.
+- (void)updaterDidNotFindUpdate:(SUUpdater *)update;
+
+// Sent immediately before installing the specified update.
+- (void)updater:(SUUpdater *)updater willInstallUpdate:(SUAppcastItem *)update;
+
+// Return YES to delay the relaunch until you do some processing; invoke the given NSInvocation to continue.
+// This is not called if the user didn't relaunch on the previous update, in that case it will immediately
+// restart.
+- (BOOL)updater:(SUUpdater *)updater shouldPostponeRelaunchForUpdate:(SUAppcastItem *)update untilInvoking:(NSInvocation *)invocation;
+
+// Some apps *can not* be relaunched in certain circumstances. They can use this method
+// to prevent a relaunch "hard":
+- (BOOL)updaterShouldRelaunchApplication:(SUUpdater *)updater;
+
+// Called immediately before relaunching.
+- (void)updaterWillRelaunchApplication:(SUUpdater *)updater;
+
+// This method allows you to provide a custom version comparator.
+// If you don't implement this method or return nil, the standard version comparator will be used.
+- (id <SUVersionComparison>)versionComparatorForUpdater:(SUUpdater *)updater;
+
+// This method allows you to provide a custom version comparator.
+// If you don't implement this method or return nil, the standard version displayer will be used.
+- (id <SUVersionDisplay>)versionDisplayerForUpdater:(SUUpdater *)updater;
+
+// Returns the path which is used to relaunch the client after the update is installed. By default, the path of the host bundle.
+- (NSString *)pathToRelaunchForUpdater:(SUUpdater *)updater;
+
+// Called before and after, respectively, an updater shows a modal alert window, to give the host
+// the opportunity to hide attached windows etc. that may get in the way:
+-(void) updaterWillShowModalAlert:(SUUpdater *)updater;
+-(void) updaterDidShowModalAlert:(SUUpdater *)updater;
+
+@end
+
+
+// -----------------------------------------------------------------------------
+// Constants:
+// -----------------------------------------------------------------------------
+
+// Define some minimum intervals to avoid DOS-like checking attacks. These are in seconds.
+#if defined(DEBUG) && DEBUG && 0
+#define SU_MIN_CHECK_INTERVAL 60
+#else
+#define SU_MIN_CHECK_INTERVAL 60*60
+#endif
+
+#if defined(DEBUG) && DEBUG && 0
+#define SU_DEFAULT_CHECK_INTERVAL 60
+#else
+#define SU_DEFAULT_CHECK_INTERVAL 60*60*24
+#endif
+
+#endif
diff --git a/OSX/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h b/OSX/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h
new file mode 100755
index 0000000..6c65ea4
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h
@@ -0,0 +1,29 @@
+//
+// SUVersionComparisonProtocol.h
+// Sparkle
+//
+// Created by Andy Matuschak on 12/21/07.
+// Copyright 2007 Andy Matuschak. All rights reserved.
+//
+
+#ifndef SUVERSIONCOMPARISONPROTOCOL_H
+#define SUVERSIONCOMPARISONPROTOCOL_H
+
+#import <Cocoa/Cocoa.h>
+
+/*!
+ @protocol
+ @abstract Implement this protocol to provide version comparison facilities for Sparkle.
+*/
+@protocol SUVersionComparison
+
+/*!
+ @method
+ @abstract An abstract method to compare two version strings.
+ @discussion Should return NSOrderedAscending if b > a, NSOrderedDescending if b < a, and NSOrderedSame if they are equivalent.
+*/
+- (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB; // *** MAY BE CALLED ON NON-MAIN THREAD!
+
+@end
+
+#endif
diff --git a/OSX/Sparkle.framework/Versions/A/Headers/SUVersionDisplayProtocol.h b/OSX/Sparkle.framework/Versions/A/Headers/SUVersionDisplayProtocol.h
new file mode 100755
index 0000000..368b9c9
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Headers/SUVersionDisplayProtocol.h
@@ -0,0 +1,27 @@
+//
+// SUVersionDisplayProtocol.h
+// EyeTV
+//
+// Created by Uli Kusterer on 08.12.09.
+// Copyright 2009 Elgato Systems GmbH. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+
+/*!
+ @protocol
+ @abstract Implement this protocol to apply special formatting to the two
+ version numbers.
+*/
+@protocol SUVersionDisplay
+
+/*!
+ @method
+ @abstract An abstract method to format two version strings.
+ @discussion You get both so you can display important distinguishing
+ information, but leave out unnecessary/confusing parts.
+*/
+-(void) formatVersion: (NSString**)inOutVersionA andVersion: (NSString**)inOutVersionB;
+
+@end
diff --git a/OSX/Sparkle.framework/Versions/A/Headers/Sparkle.h b/OSX/Sparkle.framework/Versions/A/Headers/Sparkle.h
new file mode 100755
index 0000000..08dd577
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Headers/Sparkle.h
@@ -0,0 +1,21 @@
+//
+// Sparkle.h
+// Sparkle
+//
+// Created by Andy Matuschak on 3/16/06. (Modified by CDHW on 23/12/07)
+// Copyright 2006 Andy Matuschak. All rights reserved.
+//
+
+#ifndef SPARKLE_H
+#define SPARKLE_H
+
+// This list should include the shared headers. It doesn't matter if some of them aren't shared (unless
+// there are name-space collisions) so we can list all of them to start with:
+
+#import <Sparkle/SUUpdater.h>
+
+#import <Sparkle/SUAppcast.h>
+#import <Sparkle/SUAppcastItem.h>
+#import <Sparkle/SUVersionComparisonProtocol.h>
+
+#endif
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/Info.plist b/OSX/Sparkle.framework/Versions/A/Resources/Info.plist
new file mode 100644
index 0000000..1e79abe
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/Info.plist
@@ -0,0 +1,40 @@
+<?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>BuildMachineOSBuild</key>
+ <string>13A603</string>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleExecutable</key>
+ <string>Sparkle</string>
+ <key>CFBundleIdentifier</key>
+ <string>org.andymatuschak.Sparkle</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>Sparkle</string>
+ <key>CFBundlePackageType</key>
+ <string>FMWK</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.5 Beta (git)</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.5</string>
+ <key>DTCompiler</key>
+ <string>com.apple.compilers.llvm.clang.1_0</string>
+ <key>DTPlatformBuild</key>
+ <string>5A3005</string>
+ <key>DTPlatformVersion</key>
+ <string>GM</string>
+ <key>DTSDKBuild</key>
+ <string>13A595</string>
+ <key>DTSDKName</key>
+ <string>macosx10.9</string>
+ <key>DTXcode</key>
+ <string>0502</string>
+ <key>DTXcodeBuild</key>
+ <string>5A3005</string>
+</dict>
+</plist>
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/License.txt b/OSX/Sparkle.framework/Versions/A/Resources/License.txt
new file mode 100755
index 0000000..08364c6
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/License.txt
@@ -0,0 +1,38 @@
+Copyright (c) 2006 Andy Matuschak
+
+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.
+
+=================
+EXTERNAL LICENSES
+=================
+
+License for bspatch.c and bsdiff.c, from bsdiff 4.3 (<http://www.daemonology.net/bsdiff/>:
+/*-
+ * Copyright 2003-2005 Colin Percival
+ * All rights reserved
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted providing that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist b/OSX/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist
new file mode 100755
index 0000000..63644f0
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist
@@ -0,0 +1,182 @@
+<?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>ADP2,1</key>
+ <string>Developer Transition Kit</string>
+ <key>iMac1,1</key>
+ <string>iMac G3 (Rev A-D)</string>
+ <key>iMac4,1</key>
+ <string>iMac (Core Duo)</string>
+ <key>iMac4,2</key>
+ <string>iMac for Education (17-inch, Core Duo)</string>
+ <key>iMac5,1</key>
+ <string>iMac (Core 2 Duo, 17 or 20 inch, SuperDrive)</string>
+ <key>iMac5,2</key>
+ <string>iMac (Core 2 Duo, 17 inch, Combo Drive)</string>
+ <key>iMac6,1</key>
+ <string>iMac (Core 2 Duo, 24 inch, SuperDrive)</string>
+ <key>iMac8,1</key>
+ <string>iMac (April 2008)</string>
+ <key>MacBook1,1</key>
+ <string>MacBook (Core Duo)</string>
+ <key>MacBook2,1</key>
+ <string>MacBook (Core 2 Duo)</string>
+ <key>MacBook4,1</key>
+ <string>MacBook (Core 2 Duo Feb 2008)</string>
+ <key>MacBookAir1,1</key>
+ <string>MacBook Air (January 2008)</string>
+ <key>MacBookAir2,1</key>
+ <string>MacBook Air (June 2009)</string>
+ <key>MacBookAir3,1</key>
+ <string>MacBook Air (October 2010)</string>
+ <key>MacBookPro1,1</key>
+ <string>MacBook Pro Core Duo (15-inch)</string>
+ <key>MacBookPro1,2</key>
+ <string>MacBook Pro Core Duo (17-inch)</string>
+ <key>MacBookPro2,1</key>
+ <string>MacBook Pro Core 2 Duo (17-inch)</string>
+ <key>MacBookPro2,2</key>
+ <string>MacBook Pro Core 2 Duo (15-inch)</string>
+ <key>MacBookPro3,1</key>
+ <string>MacBook Pro Core 2 Duo (15-inch LED, Core 2 Duo)</string>
+ <key>MacBookPro3,2</key>
+ <string>MacBook Pro Core 2 Duo (17-inch HD, Core 2 Duo)</string>
+ <key>MacBookPro4,1</key>
+ <string>MacBook Pro (Core 2 Duo Feb 2008)</string>
+ <key>Macmini1,1</key>
+ <string>Mac Mini (Core Solo/Duo)</string>
+ <key>MacPro1,1</key>
+ <string>Mac Pro (four-core)</string>
+ <key>MacPro2,1</key>
+ <string>Mac Pro (eight-core)</string>
+ <key>MacPro3,1</key>
+ <string>Mac Pro (January 2008 4- or 8- core &quot;Harpertown&quot;)</string>
+ <key>MacPro4,1</key>
+ <string>Mac Pro (March 2009)</string>
+ <key>MacPro5,1</key>
+ <string>Mac Pro (August 2010)</string>
+ <key>PowerBook1,1</key>
+ <string>PowerBook G3</string>
+ <key>PowerBook2,1</key>
+ <string>iBook G3</string>
+ <key>PowerBook2,2</key>
+ <string>iBook G3 (FireWire)</string>
+ <key>PowerBook2,3</key>
+ <string>iBook G3</string>
+ <key>PowerBook2,4</key>
+ <string>iBook G3</string>
+ <key>PowerBook3,1</key>
+ <string>PowerBook G3 (FireWire)</string>
+ <key>PowerBook3,2</key>
+ <string>PowerBook G4</string>
+ <key>PowerBook3,3</key>
+ <string>PowerBook G4 (Gigabit Ethernet)</string>
+ <key>PowerBook3,4</key>
+ <string>PowerBook G4 (DVI)</string>
+ <key>PowerBook3,5</key>
+ <string>PowerBook G4 (1GHz / 867MHz)</string>
+ <key>PowerBook4,1</key>
+ <string>iBook G3 (Dual USB, Late 2001)</string>
+ <key>PowerBook4,2</key>
+ <string>iBook G3 (16MB VRAM)</string>
+ <key>PowerBook4,3</key>
+ <string>iBook G3 Opaque 16MB VRAM, 32MB VRAM, Early 2003)</string>
+ <key>PowerBook5,1</key>
+ <string>PowerBook G4 (17 inch)</string>
+ <key>PowerBook5,2</key>
+ <string>PowerBook G4 (15 inch FW 800)</string>
+ <key>PowerBook5,3</key>
+ <string>PowerBook G4 (17-inch 1.33GHz)</string>
+ <key>PowerBook5,4</key>
+ <string>PowerBook G4 (15 inch 1.5/1.33GHz)</string>
+ <key>PowerBook5,5</key>
+ <string>PowerBook G4 (17-inch 1.5GHz)</string>
+ <key>PowerBook5,6</key>
+ <string>PowerBook G4 (15 inch 1.67GHz/1.5GHz)</string>
+ <key>PowerBook5,7</key>
+ <string>PowerBook G4 (17-inch 1.67GHz)</string>
+ <key>PowerBook5,8</key>
+ <string>PowerBook G4 (Double layer SD, 15 inch)</string>
+ <key>PowerBook5,9</key>
+ <string>PowerBook G4 (Double layer SD, 17 inch)</string>
+ <key>PowerBook6,1</key>
+ <string>PowerBook G4 (12 inch)</string>
+ <key>PowerBook6,2</key>
+ <string>PowerBook G4 (12 inch, DVI)</string>
+ <key>PowerBook6,3</key>
+ <string>iBook G4</string>
+ <key>PowerBook6,4</key>
+ <string>PowerBook G4 (12 inch 1.33GHz)</string>
+ <key>PowerBook6,5</key>
+ <string>iBook G4 (Early-Late 2004)</string>
+ <key>PowerBook6,7</key>
+ <string>iBook G4 (Mid 2005)</string>
+ <key>PowerBook6,8</key>
+ <string>PowerBook G4 (12 inch 1.5GHz)</string>
+ <key>PowerMac1,1</key>
+ <string>Power Macintosh G3 (Blue &amp; White)</string>
+ <key>PowerMac1,2</key>
+ <string>Power Macintosh G4 (PCI Graphics)</string>
+ <key>PowerMac10,1</key>
+ <string>Mac Mini G4</string>
+ <key>PowerMac10,2</key>
+ <string>Mac Mini (Late 2005)</string>
+ <key>PowerMac11,2</key>
+ <string>Power Macintosh G5 (Late 2005)</string>
+ <key>PowerMac12,1</key>
+ <string>iMac G5 (iSight)</string>
+ <key>PowerMac2,1</key>
+ <string>iMac G3 (Slot-loading CD-ROM)</string>
+ <key>PowerMac2,2</key>
+ <string>iMac G3 (Summer 2000)</string>
+ <key>PowerMac3,1</key>
+ <string>Power Macintosh G4 (AGP Graphics)</string>
+ <key>PowerMac3,2</key>
+ <string>Power Macintosh G4 (AGP Graphics)</string>
+ <key>PowerMac3,3</key>
+ <string>Power Macintosh G4 (Gigabit Ethernet)</string>
+ <key>PowerMac3,4</key>
+ <string>Power Macintosh G4 (Digital Audio)</string>
+ <key>PowerMac3,5</key>
+ <string>Power Macintosh G4 (Quick Silver)</string>
+ <key>PowerMac3,6</key>
+ <string>Power Macintosh G4 (Mirrored Drive Door)</string>
+ <key>PowerMac4,1</key>
+ <string>iMac G3 (Early/Summer 2001)</string>
+ <key>PowerMac4,2</key>
+ <string>iMac G4 (Flat Panel)</string>
+ <key>PowerMac4,4</key>
+ <string>eMac</string>
+ <key>PowerMac4,5</key>
+ <string>iMac G4 (17-inch Flat Panel)</string>
+ <key>PowerMac5,1</key>
+ <string>Power Macintosh G4 Cube</string>
+ <key>PowerMac6,1</key>
+ <string>iMac G4 (USB 2.0)</string>
+ <key>PowerMac6,3</key>
+ <string>iMac G4 (20-inch Flat Panel)</string>
+ <key>PowerMac6,4</key>
+ <string>eMac (USB 2.0, 2005)</string>
+ <key>PowerMac7,2</key>
+ <string>Power Macintosh G5</string>
+ <key>PowerMac7,3</key>
+ <string>Power Macintosh G5</string>
+ <key>PowerMac8,1</key>
+ <string>iMac G5</string>
+ <key>PowerMac8,2</key>
+ <string>iMac G5 (Ambient Light Sensor)</string>
+ <key>PowerMac9,1</key>
+ <string>Power Macintosh G5 (Late 2005)</string>
+ <key>RackMac1,1</key>
+ <string>Xserve G4</string>
+ <key>RackMac1,2</key>
+ <string>Xserve G4 (slot-loading, cluster node)</string>
+ <key>RackMac3,1</key>
+ <string>Xserve G5</string>
+ <key>Xserve1,1</key>
+ <string>Xserve (Intel Xeon)</string>
+ <key>Xserve2,1</key>
+ <string>Xserve (January 2008 quad-core)</string>
+</dict>
+</plist>
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/SUStatus.nib b/OSX/Sparkle.framework/Versions/A/Resources/SUStatus.nib
new file mode 100644
index 0000000..356987e
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/SUStatus.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/ar.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/ar.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..2d1b77b
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/ar.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/ar.lproj/SUPasswordPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/ar.lproj/SUPasswordPrompt.nib
new file mode 100644
index 0000000..09c833c
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/ar.lproj/SUPasswordPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..b8925e7
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..006d6aa
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/ar.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/ar.lproj/Sparkle.strings
new file mode 100644
index 0000000..858a71f
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/ar.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/cs.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/cs.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..335264f
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/cs.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..fe70bf2
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..9dcd944
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/cs.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/cs.lproj/Sparkle.strings
new file mode 100644
index 0000000..9bbb996
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/cs.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..211e718
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/da.lproj/SUPasswordPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/da.lproj/SUPasswordPrompt.nib
new file mode 100644
index 0000000..1873d43
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/da.lproj/SUPasswordPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..42395b2
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..58af832
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/da.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/da.lproj/Sparkle.strings
new file mode 100644
index 0000000..bcf691d
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/da.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..19970aa
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..69fccfc
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..c59bf3c
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings
new file mode 100644
index 0000000..664946d
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..512c1c5
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/en.lproj/SUPasswordPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/en.lproj/SUPasswordPrompt.nib
new file mode 100644
index 0000000..6cd02b2
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/en.lproj/SUPasswordPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..e856f9d
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..4f0c0a3
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings
new file mode 100644
index 0000000..f9c15d8
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..8d657a7
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..d28a4f8
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..f927ba6
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings
new file mode 100644
index 0000000..8e4ab94
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Info.plist b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Info.plist
new file mode 100644
index 0000000..692e02e
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Info.plist
@@ -0,0 +1,50 @@
+<?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>BuildMachineOSBuild</key>
+ <string>13A603</string>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>finish_installation</string>
+ <key>CFBundleIconFile</key>
+ <string>Sparkle</string>
+ <key>CFBundleIdentifier</key>
+ <string>org.andymatuschak.sparkle.finish-installation</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1</string>
+ <key>DTCompiler</key>
+ <string>com.apple.compilers.llvm.clang.1_0</string>
+ <key>DTPlatformBuild</key>
+ <string>5A3005</string>
+ <key>DTPlatformVersion</key>
+ <string>GM</string>
+ <key>DTSDKBuild</key>
+ <string>13A595</string>
+ <key>DTSDKName</key>
+ <string>macosx10.9</string>
+ <key>DTXcode</key>
+ <string>0502</string>
+ <key>DTXcodeBuild</key>
+ <string>5A3005</string>
+ <key>LSBackgroundOnly</key>
+ <string>1</string>
+ <key>LSMinimumSystemVersion</key>
+ <string>10.4</string>
+ <key>LSUIElement</key>
+ <string>1</string>
+ <key>NSMainNibFile</key>
+ <string>MainMenu</string>
+ <key>NSPrincipalClass</key>
+ <string>NSApplication</string>
+</dict>
+</plist>
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/MacOS/finish_installation b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/MacOS/finish_installation
new file mode 100755
index 0000000..5e032fa
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/MacOS/finish_installation
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/PkgInfo b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/PkgInfo
new file mode 100644
index 0000000..bd04210
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/PkgInfo
@@ -0,0 +1 @@
+APPL???? \ No newline at end of file
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/SUStatus.nib b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/SUStatus.nib
new file mode 100644
index 0000000..356987e
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/SUStatus.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/Sparkle.icns b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/Sparkle.icns
new file mode 100755
index 0000000..8e56d45
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/Sparkle.icns
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/ar.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/ar.lproj/Sparkle.strings
new file mode 100644
index 0000000..858a71f
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/ar.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/cs.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/cs.lproj/Sparkle.strings
new file mode 100644
index 0000000..9bbb996
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/cs.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/da.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/da.lproj/Sparkle.strings
new file mode 100644
index 0000000..bcf691d
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/da.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/de.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/de.lproj/Sparkle.strings
new file mode 100644
index 0000000..664946d
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/de.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/en.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/en.lproj/Sparkle.strings
new file mode 100644
index 0000000..f9c15d8
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/en.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/es.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/es.lproj/Sparkle.strings
new file mode 100644
index 0000000..8e4ab94
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/es.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/fr.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/fr.lproj/Sparkle.strings
new file mode 100644
index 0000000..236f807
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/fr.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/is.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/is.lproj/Sparkle.strings
new file mode 100644
index 0000000..665e273
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/is.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/it.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/it.lproj/Sparkle.strings
new file mode 100644
index 0000000..4ccd7af
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/it.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/ja.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/ja.lproj/Sparkle.strings
new file mode 100644
index 0000000..b21ea04
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/ja.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/nl.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/nl.lproj/Sparkle.strings
new file mode 100644
index 0000000..023c473
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/nl.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/pl.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/pl.lproj/Sparkle.strings
new file mode 100644
index 0000000..9a0bc8b
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/pl.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/pt_BR.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/pt_BR.lproj/Sparkle.strings
new file mode 100644
index 0000000..7a11a9e
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/pt_BR.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/pt_PT.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/pt_PT.lproj/Sparkle.strings
new file mode 100644
index 0000000..497cd83
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/pt_PT.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/ro.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/ro.lproj/Sparkle.strings
new file mode 100644
index 0000000..e90bdf5
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/ro.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/ru.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/ru.lproj/Sparkle.strings
new file mode 100644
index 0000000..7afef95
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/ru.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/sl.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/sl.lproj/Sparkle.strings
new file mode 100644
index 0000000..7ec0bc2
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/sl.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/sv.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/sv.lproj/Sparkle.strings
new file mode 100644
index 0000000..16c3fb8
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/sv.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/th.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/th.lproj/Sparkle.strings
new file mode 100644
index 0000000..0468c97
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/th.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/tr.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/tr.lproj/Sparkle.strings
new file mode 100644
index 0000000..cabc211
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/tr.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/uk.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/uk.lproj/Sparkle.strings
new file mode 100644
index 0000000..6f0e4db
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/uk.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/zh_CN.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/zh_CN.lproj/Sparkle.strings
new file mode 100644
index 0000000..b741758
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/zh_CN.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/zh_TW.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/zh_TW.lproj/Sparkle.strings
new file mode 100644
index 0000000..c1f7e85
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/zh_TW.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..59b199b
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..a084b19
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..808db82
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings
new file mode 100644
index 0000000..236f807
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/fr_CA.lproj b/OSX/Sparkle.framework/Versions/A/Resources/fr_CA.lproj
new file mode 120000
index 0000000..f9834a3
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/fr_CA.lproj
@@ -0,0 +1 @@
+fr.lproj \ No newline at end of file
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/is.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/is.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..89825fb
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/is.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..2172c0d
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..9a4cca0
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/is.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/is.lproj/Sparkle.strings
new file mode 100644
index 0000000..665e273
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/is.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..c3d7a42
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..7cc884b
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..285596b
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings
new file mode 100644
index 0000000..4ccd7af
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/ja.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/ja.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..61d2a29
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/ja.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..ee41cad
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..ebd5759
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/ja.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/ja.lproj/Sparkle.strings
new file mode 100644
index 0000000..b21ea04
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/ja.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/ko.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/ko.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..e7a8d46
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/ko.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..89f887e
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..5da11e0
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..35a8de2
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..eec88ff
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..ab2c86f
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings
new file mode 100644
index 0000000..023c473
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/pl.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/pl.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..0646f3f
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/pl.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..1b4d495
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..8ea95e8
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/pl.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/pl.lproj/Sparkle.strings
new file mode 100644
index 0000000..9a0bc8b
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/pl.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/pt.lproj b/OSX/Sparkle.framework/Versions/A/Resources/pt.lproj
new file mode 120000
index 0000000..3c1c9f6
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/pt.lproj
@@ -0,0 +1 @@
+pt_BR.lproj \ No newline at end of file
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..e8a824a
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUPasswordPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUPasswordPrompt.nib
new file mode 100644
index 0000000..22f50aa
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUPasswordPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..03500fa
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..dc92de6
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/Sparkle.strings
new file mode 100644
index 0000000..7a11a9e
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..c3603d5
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..2d371c4
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..7b6d719
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/Sparkle.strings
new file mode 100644
index 0000000..497cd83
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/ro.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/ro.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..d669654
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/ro.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..6a75e5e
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..2e5802c
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/ro.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/ro.lproj/Sparkle.strings
new file mode 100644
index 0000000..e90bdf5
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/ro.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..8022f52
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..9466dc3
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..3b26a5b
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings
new file mode 100644
index 0000000..7afef95
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/sk.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/sk.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..3afea8d
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/sk.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..15e760d
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..e7d67a2
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/sl.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/sl.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..60cfe74
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/sl.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..c3bd698
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..1ff5bc3
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/sl.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/sl.lproj/Sparkle.strings
new file mode 100644
index 0000000..7ec0bc2
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/sl.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..8df1ba0
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..9ab3288
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..0337c2a
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings
new file mode 100644
index 0000000..16c3fb8
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/th.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/th.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..e1377a4
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/th.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/th.lproj/SUPasswordPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/th.lproj/SUPasswordPrompt.nib
new file mode 100644
index 0000000..646d64e
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/th.lproj/SUPasswordPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..239b8f7
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..143ff91
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/th.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/th.lproj/Sparkle.strings
new file mode 100644
index 0000000..0468c97
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/th.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/tr.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/tr.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..263e74a
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/tr.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..ca40c57
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..22a8f46
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/tr.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/tr.lproj/Sparkle.strings
new file mode 100644
index 0000000..cabc211
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/tr.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/uk.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/uk.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..83dbcbf
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/uk.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..939e0cb
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..8e2bf73
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/uk.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/uk.lproj/Sparkle.strings
new file mode 100644
index 0000000..6f0e4db
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/uk.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..65cc3d2
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..a453dfc
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..9f85d65
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/Sparkle.strings
new file mode 100644
index 0000000..b741758
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUAutomaticUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUAutomaticUpdateAlert.nib
new file mode 100644
index 0000000..c4b9e9b
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUAutomaticUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdateAlert.nib b/OSX/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdateAlert.nib
new file mode 100644
index 0000000..6e98d7e
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdateAlert.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdatePermissionPrompt.nib b/OSX/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdatePermissionPrompt.nib
new file mode 100644
index 0000000..935b007
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdatePermissionPrompt.nib
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/Sparkle.strings b/OSX/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/Sparkle.strings
new file mode 100644
index 0000000..c1f7e85
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/Sparkle.strings
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/A/Sparkle b/OSX/Sparkle.framework/Versions/A/Sparkle
new file mode 100755
index 0000000..64eefd0
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/A/Sparkle
Binary files differ
diff --git a/OSX/Sparkle.framework/Versions/Current b/OSX/Sparkle.framework/Versions/Current
new file mode 120000
index 0000000..8c7e5a6
--- /dev/null
+++ b/OSX/Sparkle.framework/Versions/Current
@@ -0,0 +1 @@
+A \ No newline at end of file
diff --git a/OSX/Updater.h b/OSX/Updater.h
new file mode 100644
index 0000000..53abbe4
--- /dev/null
+++ b/OSX/Updater.h
@@ -0,0 +1,39 @@
+/* xscreensaver, Copyright (c) 2013 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef USE_IPHONE
+#import <Cocoa/Cocoa.h>
+@interface XScreenSaverUpdater : NSObject <NSApplicationDelegate>
+{
+ NSTimer *timer;
+}
+@end
+#endif // !USE_IPHONE
+
+#define UPDATER_DOMAIN "org.jwz.xscreensaver.updater"
+
+// Strings must match Sparkle/SUConstants.m
+#define SUSUEnableAutomaticChecksKey "SUEnableAutomaticChecks"
+#define SUSUEnableAutomaticChecksDef YES
+#define SUAutomaticallyUpdateKey "SUAutomaticallyUpdate"
+#define SUAutomaticallyUpdateDef NO
+#define SUSendProfileInfoKey "SUSendProfileInfo"
+#define SUSendProfileInfoDef YES
+#define SUScheduledCheckIntervalKey "SUScheduledCheckInterval"
+#define SUScheduledCheckIntervalDef 604800
+#define SULastCheckTimeKey "SULastCheckTime"
+
+#define UPDATER_DEFAULTS @{ \
+ @SUSUEnableAutomaticChecksKey: @SUSUEnableAutomaticChecksDef, \
+ @SUAutomaticallyUpdateKey: @SUAutomaticallyUpdateDef, \
+ @SUSendProfileInfoKey: @SUSendProfileInfoDef, \
+ @SUScheduledCheckIntervalKey: @SUScheduledCheckIntervalDef \
+}
diff --git a/OSX/Updater.m b/OSX/Updater.m
new file mode 100644
index 0000000..1bf29fa
--- /dev/null
+++ b/OSX/Updater.m
@@ -0,0 +1,176 @@
+/* xscreensaver, Copyright (c) 2013 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * XScreenSaverUpdater.app -- downloads and installs XScreenSaver updates
+ * via Sparkle.framework.
+ *
+ * Created: 7-Dec-2013
+ *
+ * NOTE: This does not work with Sparkle 1.5b6 -- it requires the "HEAD"
+ * version 4-Dec-2013 or later.
+ */
+
+#import "Updater.h"
+#import "Sparkle/SUUpdater.h"
+
+@implementation XScreenSaverUpdater : NSObject
+
+- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
+{
+ NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
+ [defs registerDefaults:UPDATER_DEFAULTS];
+
+ // If it's not time to run the updater, then bail immediately.
+ // I'm not sure why this is necessary, but Sparkle seems to be
+ // checking too often.
+ //
+ if (! [self timeToCheck])
+ [[NSApplication sharedApplication] terminate:self];
+
+ // If the screen saver is not running, then launch the updater now.
+ // Otherwise, wait until the screen saver deactivates, and then do
+ // it. This is because if the updater tries to pop up a dialog box
+ // while the screen saver is active, everything goes to hell and it
+ // never shows up. You'd expect the dialog to just map below the
+ // screen saver window, but no.
+
+ if (! [self screenSaverActive]) {
+ [self runUpdater];
+ } else {
+ // Run the updater when the "screensaver.didstop" notification arrives.
+ [[NSDistributedNotificationCenter defaultCenter]
+ addObserver:self
+ selector:@selector(saverStoppedNotification:)
+ name:@"com.apple.screensaver.didstop"
+ object:nil];
+
+ // But I'm not sure I trust that, so also poll every couple minutes.
+ timer = [NSTimer scheduledTimerWithTimeInterval: 60 * 2
+ target:self
+ selector:@selector(pollSaverTermination:)
+ userInfo:nil
+ repeats:YES];
+ }
+}
+
+
+- (BOOL) timeToCheck
+{
+ NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
+ NSTimeInterval interval = [defs doubleForKey:@SUScheduledCheckIntervalKey];
+ NSDate *last = [defs objectForKey:@SULastCheckTimeKey];
+ if (!interval || !last)
+ return YES;
+ NSTimeInterval since = [[NSDate date] timeIntervalSinceDate:last];
+ return (since > interval);
+}
+
+
+// Whether ScreenSaverEngine is currently running, meaning screen is blanked.
+// There's no easy way to determine this other than scanning the process table.
+//
+- (BOOL) screenSaverActive
+{
+ BOOL found = NO;
+ NSString *target = @"/ScreenSaverEngine.app";
+ ProcessSerialNumber psn = { kNoProcess, kNoProcess };
+ while (GetNextProcess(&psn) == noErr) {
+ CFDictionaryRef cfdict =
+ ProcessInformationCopyDictionary (&psn,
+ kProcessDictionaryIncludeAllInformationMask);
+ if (cfdict) {
+ NSDictionary *dict = (NSDictionary *) cfdict;
+ NSString *path = [dict objectForKey:@"BundlePath"];
+ if (path && [path hasSuffix:target])
+ found = YES;
+ CFRelease (cfdict);
+ }
+ if (found)
+ break;
+ }
+ return found;
+}
+
+
+- (void) saverStoppedNotification:(NSNotification *)note
+{
+ [self runUpdater];
+}
+
+
+- (void) pollSaverTermination:(NSTimer *)t
+{
+ if (! [self screenSaverActive])
+ [self runUpdater];
+}
+
+
+- (void) runUpdater
+{
+ if (timer) {
+ [timer invalidate];
+ timer = nil;
+ }
+
+ SUUpdater *updater = [SUUpdater updaterForBundle:
+ [NSBundle bundleForClass:[self class]]];
+ [updater setDelegate:self];
+
+ // Launch the updater thread.
+ [updater checkForUpdatesInBackground];
+
+ // Now we need to wait for the Sparkle thread to finish before we can
+ // exit, so just poll waiting for it.
+ //
+ [NSTimer scheduledTimerWithTimeInterval:1
+ target:self
+ selector:@selector(pollUpdaterTermination:)
+ userInfo:updater
+ repeats:YES];
+}
+
+
+// Delegate method that lets us append extra info to the system-info URL.
+//
+- (NSArray *) feedParametersForUpdater:(SUUpdater *)updater
+ sendingSystemProfile:(BOOL)sending
+{
+ // Get the name of the saver that invoked us, and include that in the
+ // system info.
+ NSString *saver = [[[NSProcessInfo processInfo] environment]
+ objectForKey:@"XSCREENSAVER_CLASSPATH"];
+ if (! saver) return @[];
+ NSString *head = @"org.jwz.xscreensaver.";
+ if ([saver hasPrefix:head])
+ saver = [saver substringFromIndex:[head length]];
+
+ return @[ @{ @"key": @"saver",
+ @"value": saver,
+ @"displayKey": @"Current Saver",
+ @"displayValue": saver
+ }
+ ];
+}
+
+
+- (void) pollUpdaterTermination:(NSTimer *)t
+{
+ SUUpdater *updater = [t userInfo];
+ if (![updater updateInProgress])
+ [[NSApplication sharedApplication] terminate:self];
+}
+
+
+- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)app
+{
+ return YES;
+}
+
+@end
diff --git a/OSX/Updater.plist b/OSX/Updater.plist
new file mode 100644
index 0000000..fd3b176
--- /dev/null
+++ b/OSX/Updater.plist
@@ -0,0 +1,50 @@
+<?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>CFBundleDisplayName</key>
+ <string>XScreenSaver</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleGetInfoString</key>
+ <string>5.40</string>
+ <key>CFBundleIconFile</key>
+ <string>SaverRunner</string>
+ <key>CFBundleIdentifier</key>
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleLongVersionString</key>
+ <string>5.40</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>5.40</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>5.40</string>
+ <key>LSMinimumSystemVersion</key>
+ <string>${MACOSX_DEPLOYMENT_TARGET}</string>
+ <key>LSUIElement</key>
+ <true/>
+ <key>NSHumanReadableCopyright</key>
+ <string>5.40</string>
+ <key>NSMainNibFile</key>
+ <string>Updater</string>
+ <key>NSPrincipalClass</key>
+ <string>NSApplication</string>
+ <key>SUEnableSystemProfiling</key>
+ <true/>
+ <key>SUFeedURL</key>
+ <string>https://www.jwz.org/xscreensaver/updates.xml</string>
+ <key>SUPublicDSAKeyFile</key>
+ <string>sparkle_dsa_pub.pem</string>
+ <key>SUScheduledCheckInterval</key>
+ <integer>604800</integer>
+</dict>
+</plist>
diff --git a/OSX/Updater.xib b/OSX/Updater.xib
new file mode 100644
index 0000000..03ebff7
--- /dev/null
+++ b/OSX/Updater.xib
@@ -0,0 +1,344 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="4514" systemVersion="13A603" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
+ <dependencies>
+ <deployment defaultVersion="1040" identifier="macosx"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="4514"/>
+ </dependencies>
+ <objects>
+ <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
+ <connections>
+ <outlet property="delegate" destination="NZ9-IB-jdd" id="HJq-Vi-gfH"/>
+ </connections>
+ </customObject>
+ <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+ <customObject id="-3" userLabel="Application"/>
+ <customObject id="373" customClass="NSFontManager"/>
+ <menu title="Main Menu" systemMenu="main" id="29" userLabel="Main Menu">
+ <items>
+ <menuItem title="XScreenSaver Updater" id="56">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <menu key="submenu" title="XScreenSaver Updater" systemMenu="apple" id="57">
+ <items>
+ <menuItem title="About XScreenSaver Updater" enabled="NO" id="58">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="orderFrontStandardAboutPanel:" target="-2" id="142"/>
+ </connections>
+ </menuItem>
+ <menuItem isSeparatorItem="YES" id="236"/>
+ <menuItem title="Services" id="131">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <menu key="submenu" title="Services" systemMenu="services" id="130"/>
+ </menuItem>
+ <menuItem isSeparatorItem="YES" id="144"/>
+ <menuItem title="Hide XScreenSaver Updater" keyEquivalent="h" id="134">
+ <connections>
+ <action selector="hide:" target="-1" id="369"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Hide Others" keyEquivalent="h" id="145">
+ <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
+ <connections>
+ <action selector="hideOtherApplications:" target="-1" id="370"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Show All" id="150">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="unhideAllApplications:" target="-1" id="372"/>
+ </connections>
+ </menuItem>
+ <menuItem isSeparatorItem="YES" id="149"/>
+ <menuItem title="Quit XScreenSaver Updater" keyEquivalent="q" id="136">
+ <connections>
+ <action selector="terminate:" target="-2" id="448"/>
+ </connections>
+ </menuItem>
+ </items>
+ </menu>
+ </menuItem>
+ <menuItem title="File" id="83">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <menu key="submenu" title="File" id="81">
+ <items>
+ <menuItem title="Close" keyEquivalent="w" id="73">
+ <connections>
+ <action selector="terminate:" target="-2" id="heG-jI-yGZ"/>
+ </connections>
+ </menuItem>
+ <menuItem isSeparatorItem="YES" id="74"/>
+ <menuItem title="Page Setup..." keyEquivalent="P" id="77">
+ <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
+ <connections>
+ <action selector="runPageLayout:" target="-1" id="87"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Print…" keyEquivalent="p" id="78">
+ <connections>
+ <action selector="print:" target="-1" id="86"/>
+ </connections>
+ </menuItem>
+ </items>
+ </menu>
+ </menuItem>
+ <menuItem title="Edit" id="711">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <menu key="submenu" title="Edit" id="712">
+ <items>
+ <menuItem title="Undo" keyEquivalent="z" id="713">
+ <connections>
+ <action selector="undo:" target="-1" id="776"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Redo" keyEquivalent="Z" id="714">
+ <connections>
+ <action selector="redo:" target="-1" id="772"/>
+ </connections>
+ </menuItem>
+ <menuItem isSeparatorItem="YES" id="715"/>
+ <menuItem title="Cut" keyEquivalent="x" id="716">
+ <connections>
+ <action selector="cut:" target="-1" id="768"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Copy" keyEquivalent="c" id="717">
+ <connections>
+ <action selector="copy:" target="-1" id="782"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Paste" keyEquivalent="v" id="718">
+ <connections>
+ <action selector="paste:" target="-1" id="769"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Paste and Match Style" keyEquivalent="V" id="719">
+ <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
+ <connections>
+ <action selector="pasteAsPlainText:" target="-1" id="781"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Delete" id="720">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="delete:" target="-1" id="783"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Select All" keyEquivalent="a" id="721">
+ <connections>
+ <action selector="selectAll:" target="-1" id="785"/>
+ </connections>
+ </menuItem>
+ <menuItem isSeparatorItem="YES" id="722"/>
+ <menuItem title="Find" id="723">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <menu key="submenu" title="Find" id="761">
+ <items>
+ <menuItem title="Find…" tag="1" keyEquivalent="f" id="762">
+ <connections>
+ <action selector="performFindPanelAction:" target="-1" id="799"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="821">
+ <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
+ <connections>
+ <action selector="performFindPanelAction:" target="-1" id="822"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Find Next" tag="2" keyEquivalent="g" id="763">
+ <connections>
+ <action selector="performFindPanelAction:" target="-1" id="802"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Find Previous" tag="3" keyEquivalent="G" id="764">
+ <connections>
+ <action selector="performFindPanelAction:" target="-1" id="798"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="765">
+ <connections>
+ <action selector="performFindPanelAction:" target="-1" id="800"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Jump to Selection" keyEquivalent="j" id="766">
+ <connections>
+ <action selector="centerSelectionInVisibleArea:" target="-1" id="801"/>
+ </connections>
+ </menuItem>
+ </items>
+ </menu>
+ </menuItem>
+ <menuItem title="Spelling and Grammar" id="724">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <menu key="submenu" title="Spelling" id="754">
+ <items>
+ <menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="755">
+ <connections>
+ <action selector="showGuessPanel:" target="-1" id="779"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Check Document Now" keyEquivalent=";" id="756">
+ <connections>
+ <action selector="checkSpelling:" target="-1" id="780"/>
+ </connections>
+ </menuItem>
+ <menuItem isSeparatorItem="YES" id="757"/>
+ <menuItem title="Check Spelling While Typing" id="758">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="toggleContinuousSpellChecking:" target="-1" id="774"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Check Grammar With Spelling" id="759">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="toggleGrammarChecking:" target="-1" id="777"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Correct Spelling Automatically" id="760">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="toggleAutomaticSpellingCorrection:" target="-1" id="790"/>
+ </connections>
+ </menuItem>
+ </items>
+ </menu>
+ </menuItem>
+ <menuItem title="Substitutions" id="725">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <menu key="submenu" title="Substitutions" id="745">
+ <items>
+ <menuItem title="Show Substitutions" id="746">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="orderFrontSubstitutionsPanel:" target="-1" id="787"/>
+ </connections>
+ </menuItem>
+ <menuItem isSeparatorItem="YES" id="747"/>
+ <menuItem title="Smart Copy/Paste" id="748">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="toggleSmartInsertDelete:" target="-1" id="770"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Smart Quotes" id="749">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="771"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Smart Dashes" id="750">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="toggleAutomaticDashSubstitution:" target="-1" id="773"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Smart Links" id="751">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="toggleAutomaticLinkDetection:" target="-1" id="789"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Data Detectors" id="752">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="toggleAutomaticDataDetection:" target="-1" id="775"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Text Replacement" id="753">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="toggleAutomaticTextReplacement:" target="-1" id="788"/>
+ </connections>
+ </menuItem>
+ </items>
+ </menu>
+ </menuItem>
+ <menuItem title="Transformations" id="726">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <menu key="submenu" title="Transformations" id="741">
+ <items>
+ <menuItem title="Make Upper Case" id="742">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="uppercaseWord:" target="-1" id="791"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Make Lower Case" id="743">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="lowercaseWord:" target="-1" id="784"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Capitalize" id="744">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="capitalizeWord:" target="-1" id="767"/>
+ </connections>
+ </menuItem>
+ </items>
+ </menu>
+ </menuItem>
+ <menuItem title="Speech" id="727">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <menu key="submenu" title="Speech" id="738">
+ <items>
+ <menuItem title="Start Speaking" id="739">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="startSpeaking:" target="-1" id="778"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Stop Speaking" id="740">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="stopSpeaking:" target="-1" id="786"/>
+ </connections>
+ </menuItem>
+ </items>
+ </menu>
+ </menuItem>
+ </items>
+ </menu>
+ </menuItem>
+ <menuItem title="Window" id="19">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <menu key="submenu" title="Window" systemMenu="window" id="24">
+ <items>
+ <menuItem title="Minimize" keyEquivalent="m" id="23">
+ <connections>
+ <action selector="performMiniaturize:" target="-1" id="37"/>
+ </connections>
+ </menuItem>
+ <menuItem title="Zoom" id="239">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="performZoom:" target="-1" id="240"/>
+ </connections>
+ </menuItem>
+ <menuItem isSeparatorItem="YES" id="92"/>
+ <menuItem title="Bring All to Front" id="5">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <connections>
+ <action selector="arrangeInFront:" target="-1" id="39"/>
+ </connections>
+ </menuItem>
+ </items>
+ </menu>
+ </menuItem>
+ <menuItem title="Help" id="103">
+ <modifierMask key="keyEquivalentModifierMask"/>
+ <menu key="submenu" title="Help" systemMenu="help" id="106">
+ <items>
+ <menuItem title="XScreenSaver Updater Help" enabled="NO" keyEquivalent="?" id="111">
+ <connections>
+ <action selector="showHelp:" target="-1" id="360"/>
+ </connections>
+ </menuItem>
+ </items>
+ </menu>
+ </menuItem>
+ </items>
+ </menu>
+ <customObject id="NZ9-IB-jdd" customClass="XScreenSaverUpdater"/>
+ </objects>
+</document> \ No newline at end of file
diff --git a/OSX/XScreenSaver.icns b/OSX/XScreenSaver.icns
new file mode 100644
index 0000000..5357921
--- /dev/null
+++ b/OSX/XScreenSaver.icns
Binary files differ
diff --git a/OSX/XScreenSaver.plist b/OSX/XScreenSaver.plist
new file mode 100644
index 0000000..3417295
--- /dev/null
+++ b/OSX/XScreenSaver.plist
@@ -0,0 +1,30 @@
+<?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>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIdentifier</key>
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>BNDL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>5.40</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>5.40</string>
+ <key>LSMinimumSystemVersion</key>
+ <string>10.8</string>
+ <key>NSMainNibFile</key>
+ <string>SaverRunner</string>
+ <key>NSPrincipalClass</key>
+ <string>XScreenSaver${EXECUTABLE_NAME}View</string>
+</dict>
+</plist>
diff --git a/OSX/XScreenSaverAndroidWebloc.icns b/OSX/XScreenSaverAndroidWebloc.icns
new file mode 100644
index 0000000..4cff95f
--- /dev/null
+++ b/OSX/XScreenSaverAndroidWebloc.icns
Binary files differ
diff --git a/OSX/XScreenSaverConfigSheet.h b/OSX/XScreenSaverConfigSheet.h
new file mode 100644
index 0000000..b2fd489
--- /dev/null
+++ b/OSX/XScreenSaverConfigSheet.h
@@ -0,0 +1,79 @@
+/* xscreensaver, Copyright (c) 2006-2013 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* XScreenSaver uses XML files to describe the user interface for configuring
+ the various screen savers. These files live in .../hacks/config/ and
+ say relatively high level things like: "there should be a checkbox
+ labelled "Leave Trails", and when it is checked, add the option '-trails'
+ to the command line when launching the program."
+
+ This code reads that XML and constructs a Cocoa interface from it.
+ The Cocoa controls are hooked up to NSUserDefaultsController to save
+ those settings into the MacOS preferences system. The Cocoa preferences
+ names are the same as the resource names specified in the screenhack's
+ 'options' array (we use that array to map the command line switches
+ specified in the XML to the resource names to use).
+ */
+
+#ifdef USE_IPHONE
+# import <Foundation/Foundation.h>
+# import <UIKit/UIKit.h>
+# define NSView UIView
+# define NSUserDefaultsController NSUserDefaults
+#else
+# import <Cocoa/Cocoa.h>
+#endif
+
+#import "jwxyz.h"
+
+#import <Foundation/NSXMLParser.h>
+
+#undef USE_PICKER_VIEW
+
+@interface XScreenSaverConfigSheet :
+# ifdef USE_IPHONE
+ UITableViewController <NSXMLParserDelegate,
+ UITextFieldDelegate
+# ifdef USE_PICKER_VIEW
+ , UIPickerViewDelegate
+ , UIPickerViewDataSource
+# endif
+ >
+# else
+ NSWindow <NSXMLParserDelegate>
+# endif
+{
+ NSString *saver_name;
+ NSUserDefaultsController *userDefaultsController;
+ NSUserDefaultsController *globalDefaultsController;
+ NSDictionary *defaultOptions;
+ const XrmOptionDescRec *opts;
+ id xml_root, xml_parsing;
+
+# ifdef USE_IPHONE
+ UITextField *active_text_field;
+ NSMutableArray *controls;
+ NSMutableArray *pref_ctls; // UIControl objects, with index = c.tag
+ NSMutableArray *pref_keys; // ...and their corresponding resources
+# ifdef USE_PICKER_VIEW
+ NSMutableArray *picker_values;
+# endif
+# endif
+
+}
+
+- (id)initWithXML: (NSData *) xml_data
+ options: (const XrmOptionDescRec *) opts
+ controller: (NSUserDefaultsController *) prefs
+ globalController: (NSUserDefaultsController *) globalPrefs
+ defaults: (NSDictionary *) defs;
+
+@end
diff --git a/OSX/XScreenSaverConfigSheet.m b/OSX/XScreenSaverConfigSheet.m
new file mode 100644
index 0000000..eaa5add
--- /dev/null
+++ b/OSX/XScreenSaverConfigSheet.m
@@ -0,0 +1,3710 @@
+/* xscreensaver, Copyright (c) 2006-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* XScreenSaver uses XML files to describe the user interface for configuring
+ the various screen savers. These files live in .../hacks/config/ and
+ say relatively high level things like: "there should be a checkbox
+ labelled "Leave Trails", and when it is checked, add the option '-trails'
+ to the command line when launching the program."
+
+ This code reads that XML and constructs a Cocoa interface from it.
+ The Cocoa controls are hooked up to NSUserDefaultsController to save
+ those settings into the MacOS preferences system. The Cocoa preferences
+ names are the same as the resource names specified in the screenhack's
+ 'options' array (we use that array to map the command line switches
+ specified in the XML to the resource names to use).
+ */
+
+#import "XScreenSaverConfigSheet.h"
+#import "Updater.h"
+
+#import "jwxyz.h"
+#import "InvertedSlider.h"
+
+#ifdef USE_IPHONE
+# define NSView UIView
+# define NSRect CGRect
+# define NSSize CGSize
+# define NSTextField UITextField
+# define NSButton UIButton
+# define NSFont UIFont
+# define NSStepper UIStepper
+# define NSMenuItem UIMenuItem
+# define NSText UILabel
+# define minValue minimumValue
+# define maxValue maximumValue
+# define setMinValue setMinimumValue
+# define setMaxValue setMaximumValue
+# define LABEL UILabel
+#else
+# define LABEL NSTextField
+#endif // USE_IPHONE
+
+#undef LABEL_ABOVE_SLIDER
+#define USE_HTML_LABELS
+
+
+#pragma mark XML Parser
+
+/* I used to use the "NSXMLDocument" XML parser, but that doesn't exist
+ on iOS. The "NSXMLParser" parser exists on both OSX and iOS, so I
+ converted to use that. However, to avoid having to re-write all of
+ the old code, I faked out a halfassed implementation of the
+ "NSXMLNode" class that "NSXMLDocument" used to return.
+ */
+
+#define NSXMLNode SimpleXMLNode
+#define NSXMLElement SimpleXMLNode
+#define NSXMLCommentKind SimpleXMLCommentKind
+#define NSXMLElementKind SimpleXMLElementKind
+#define NSXMLAttributeKind SimpleXMLAttributeKind
+#define NSXMLTextKind SimpleXMLTextKind
+
+typedef enum { SimpleXMLCommentKind,
+ SimpleXMLElementKind,
+ SimpleXMLAttributeKind,
+ SimpleXMLTextKind,
+} SimpleXMLKind;
+
+@interface SimpleXMLNode : NSObject
+{
+ SimpleXMLKind kind;
+ NSString *name;
+ SimpleXMLNode *parent;
+ NSMutableArray *children;
+ NSMutableArray *attributes;
+ id object;
+}
+
+@property(nonatomic) SimpleXMLKind kind;
+@property(nonatomic, retain) NSString *name;
+@property(nonatomic, retain) SimpleXMLNode *parent;
+@property(nonatomic, retain) NSMutableArray *children;
+@property(nonatomic, retain) NSMutableArray *attributes;
+@property(nonatomic, retain, getter=objectValue, setter=setObjectValue:)
+ id object;
+
+@end
+
+@implementation SimpleXMLNode
+
+@synthesize kind;
+@synthesize name;
+//@synthesize parent;
+@synthesize children;
+@synthesize attributes;
+@synthesize object;
+
+- (id) init
+{
+ self = [super init];
+ attributes = [NSMutableArray arrayWithCapacity:10];
+ return self;
+}
+
+
+- (id) initWithName:(NSString *)n
+{
+ self = [self init];
+ [self setKind:NSXMLElementKind];
+ [self setName:n];
+ return self;
+}
+
+
+- (void) setAttributesAsDictionary:(NSDictionary *)dict
+{
+ for (NSString *key in dict) {
+ NSObject *val = [dict objectForKey:key];
+ SimpleXMLNode *n = [[SimpleXMLNode alloc] init];
+ [n setKind:SimpleXMLAttributeKind];
+ [n setName:key];
+ [n setObjectValue:val];
+ [attributes addObject:n];
+ [n release];
+ }
+}
+
+- (SimpleXMLNode *) parent { return parent; }
+
+- (void) setParent:(SimpleXMLNode *)p
+{
+ NSAssert (!parent, @"parent already set");
+ if (!p) return;
+ parent = p;
+ NSMutableArray *kids = [p children];
+ if (!kids) {
+ kids = [NSMutableArray arrayWithCapacity:10];
+ [p setChildren:kids];
+ }
+ [kids addObject:self];
+}
+@end
+
+
+#pragma mark textMode value transformer
+
+// A value transformer for mapping "url" to "3" and vice versa in the
+// "textMode" preference, since NSMatrix uses NSInteger selectedIndex.
+
+#ifndef USE_IPHONE
+@interface TextModeTransformer: NSValueTransformer {}
+@end
+@implementation TextModeTransformer
++ (Class)transformedValueClass { return [NSString class]; }
++ (BOOL)allowsReverseTransformation { return YES; }
+
+- (id)transformedValue:(id)value {
+ if ([value isKindOfClass:[NSString class]]) {
+ int i = -1;
+ if ([value isEqualToString:@"date"]) { i = 0; }
+ else if ([value isEqualToString:@"literal"]) { i = 1; }
+ else if ([value isEqualToString:@"file"]) { i = 2; }
+ else if ([value isEqualToString:@"url"]) { i = 3; }
+ else if ([value isEqualToString:@"program"]) { i = 4; }
+ if (i != -1)
+ value = [NSNumber numberWithInt: i];
+ }
+ return value;
+}
+
+- (id)reverseTransformedValue:(id)value {
+ if ([value isKindOfClass:[NSNumber class]]) {
+ switch ((int) [value doubleValue]) {
+ case 0: value = @"date"; break;
+ case 1: value = @"literal"; break;
+ case 2: value = @"file"; break;
+ case 3: value = @"url"; break;
+ case 4: value = @"program"; break;
+ }
+ }
+ return value;
+}
+@end
+#endif // USE_IPHONE
+
+
+#pragma mark Implementing radio buttons
+
+/* The UIPickerView is a hideous and uncustomizable piece of shit.
+ I can't believe Apple actually released that thing on the world.
+ Let's fake up some radio buttons instead.
+ */
+
+#if defined(USE_IPHONE) && !defined(USE_PICKER_VIEW)
+
+@interface RadioButton : UILabel
+{
+ int index;
+ NSArray *items;
+}
+
+@property(nonatomic) int index;
+@property(nonatomic, retain) NSArray *items;
+
+@end
+
+@implementation RadioButton
+
+@synthesize index;
+@synthesize items;
+
+- (id) initWithIndex:(int)_index items:_items
+{
+ self = [super initWithFrame:CGRectZero];
+ index = _index;
+ items = [_items retain];
+
+ [self setText: [[items objectAtIndex:index] objectAtIndex:0]];
+ [self setBackgroundColor:[UIColor clearColor]];
+ [self sizeToFit];
+
+ return self;
+}
+
+@end
+
+
+# endif // !USE_PICKER_VIEW
+
+
+# pragma mark Implementing labels with clickable links
+
+#if defined(USE_IPHONE) && defined(USE_HTML_LABELS)
+
+@interface HTMLLabel : UIView <UIWebViewDelegate>
+{
+ NSString *html;
+ UIFont *font;
+ UIWebView *webView;
+}
+
+@property(nonatomic, retain) NSString *html;
+@property(nonatomic, retain) UIWebView *webView;
+
+- (id) initWithHTML:(NSString *)h font:(UIFont *)f;
+- (id) initWithText:(NSString *)t font:(UIFont *)f;
+- (void) setHTML:(NSString *)h;
+- (void) setText:(NSString *)t;
+- (void) sizeToFit;
+
+@end
+
+@implementation HTMLLabel
+
+@synthesize html;
+@synthesize webView;
+
+- (id) initWithHTML:(NSString *)h font:(UIFont *)f
+{
+ self = [super init];
+ if (! self) return 0;
+ font = [f retain];
+ webView = [[UIWebView alloc] init];
+ webView.delegate = self;
+ webView.dataDetectorTypes = UIDataDetectorTypeNone;
+ self. autoresizingMask = UIViewAutoresizingNone; // we do it manually
+ webView.autoresizingMask = UIViewAutoresizingNone;
+ webView.scrollView.scrollEnabled = NO;
+ webView.scrollView.bounces = NO;
+ webView.opaque = NO;
+ [webView setBackgroundColor:[UIColor clearColor]];
+
+ [self addSubview: webView];
+ [self setHTML: h];
+ return self;
+}
+
+- (id) initWithText:(NSString *)t font:(UIFont *)f
+{
+ self = [self initWithHTML:@"" font:f];
+ if (! self) return 0;
+ [self setText: t];
+ return self;
+}
+
+
+- (void) setHTML: (NSString *)h
+{
+ if (! h) return;
+ [h retain];
+ if (html) [html release];
+ html = h;
+ NSString *h2 =
+ [NSString stringWithFormat:
+ @"<!DOCTYPE HTML PUBLIC "
+ "\"-//W3C//DTD HTML 4.01 Transitional//EN\""
+ " \"http://www.w3.org/TR/html4/loose.dtd\">"
+ "<HTML>"
+ "<HEAD>"
+// "<META NAME=\"viewport\" CONTENT=\""
+// "width=device-width"
+// "initial-scale=1.0;"
+// "maximum-scale=1.0;\">"
+ "<STYLE>"
+ "<!--\n"
+ "body {"
+ " margin: 0; padding: 0; border: 0;"
+ " font-family: \"%@\";"
+ " font-size: %.4fpx;" // Must be "px", not "pt"!
+ " line-height: %.4fpx;" // And no spaces before it.
+ " -webkit-text-size-adjust: none;"
+ "}"
+ "\n//-->\n"
+ "</STYLE>"
+ "</HEAD>"
+ "<BODY>"
+ "%@"
+ "</BODY>"
+ "</HTML>",
+ [font fontName],
+ [font pointSize],
+ [font lineHeight],
+ h];
+ [webView stopLoading];
+ [webView loadHTMLString:h2 baseURL:[NSURL URLWithString:@""]];
+}
+
+
+static char *anchorize (const char *url);
+
+- (void) setText: (NSString *)t
+{
+ t = [t stringByTrimmingCharactersInSet:[NSCharacterSet
+ whitespaceCharacterSet]];
+ t = [t stringByReplacingOccurrencesOfString:@"&" withString:@"&amp;"];
+ t = [t stringByReplacingOccurrencesOfString:@"<" withString:@"&lt;"];
+ t = [t stringByReplacingOccurrencesOfString:@">" withString:@"&gt;"];
+ t = [t stringByReplacingOccurrencesOfString:@"\n\n" withString:@" <P> "];
+ t = [t stringByReplacingOccurrencesOfString:@"<P> "
+ withString:@"<P> &nbsp; &nbsp; &nbsp; &nbsp; "];
+ t = [t stringByReplacingOccurrencesOfString:@"\n "
+ withString:@"<BR> &nbsp; &nbsp; &nbsp; &nbsp; "];
+
+ NSString *h = @"";
+ for (NSString *s in
+ [t componentsSeparatedByCharactersInSet:
+ [NSCharacterSet whitespaceAndNewlineCharacterSet]]) {
+ if ([s hasPrefix:@"http://"] ||
+ [s hasPrefix:@"https://"]) {
+ char *anchor = anchorize ([s cStringUsingEncoding:NSUTF8StringEncoding]);
+ NSString *a2 = [NSString stringWithCString: anchor
+ encoding: NSUTF8StringEncoding];
+ s = [NSString stringWithFormat: @"<A HREF=\"%@\">%@</A><BR>", s, a2];
+ free (anchor);
+ }
+ h = [NSString stringWithFormat: @"%@ %@", h, s];
+ }
+
+ h = [h stringByReplacingOccurrencesOfString:@" <P> " withString:@"<P>"];
+ h = [h stringByReplacingOccurrencesOfString:@"<BR><P>" withString:@"<P>"];
+ h = [h stringByTrimmingCharactersInSet:[NSCharacterSet
+ whitespaceAndNewlineCharacterSet]];
+
+ [self setHTML: h];
+}
+
+
+-(BOOL) webView:(UIWebView *)wv
+ shouldStartLoadWithRequest:(NSURLRequest *)req
+ navigationType:(UIWebViewNavigationType)type
+{
+ // Force clicked links to open in Safari, not in this window.
+ if (type == UIWebViewNavigationTypeLinkClicked) {
+ [[UIApplication sharedApplication] openURL:[req URL]];
+ return NO;
+ }
+ return YES;
+}
+
+
+- (void) setFrame: (CGRect)r
+{
+ [super setFrame: r];
+ r.origin.x = 0;
+ r.origin.y = 0;
+ [webView setFrame: r];
+}
+
+
+- (NSString *) stripTags:(NSString *)str
+{
+ NSString *result = @"";
+
+ // Add newlines.
+ str = [str stringByReplacingOccurrencesOfString:@"<P>"
+ withString:@"<BR><BR>"
+ options:NSCaseInsensitiveSearch
+ range:NSMakeRange(0, [str length])];
+ str = [str stringByReplacingOccurrencesOfString:@"<BR>"
+ withString:@"\n"
+ options:NSCaseInsensitiveSearch
+ range:NSMakeRange(0, [str length])];
+
+ // Remove HREFs.
+ for (NSString *s in [str componentsSeparatedByString: @"<"]) {
+ NSRange r = [s rangeOfString:@">"];
+ if (r.length > 0)
+ s = [s substringFromIndex: r.location + r.length];
+ result = [result stringByAppendingString: s];
+ }
+
+ // Compress internal horizontal whitespace.
+ str = result;
+ result = @"";
+ for (NSString *s in [str componentsSeparatedByCharactersInSet:
+ [NSCharacterSet whitespaceCharacterSet]]) {
+ if ([result length] == 0)
+ result = s;
+ else if ([s length] > 0)
+ result = [NSString stringWithFormat: @"%@ %@", result, s];
+ }
+
+ return result;
+}
+
+
+- (void) sizeToFit
+{
+ CGRect r = [self frame];
+
+ /* It would be sensible to just ask the UIWebView how tall the page is,
+ instead of hoping that NSString and UIWebView measure fonts and do
+ wrapping in exactly the same way, but since UIWebView is asynchronous,
+ we'd have to wait for the document to load first, e.g.:
+
+ - Start the document loading;
+ - return a default height to use for the UITableViewCell;
+ - wait for the webViewDidFinishLoad delegate method to fire;
+ - then force the UITableView to reload, to pick up the new height.
+
+ But I couldn't make that work.
+ */
+# if 0
+ r.size.height = [[webView
+ stringByEvaluatingJavaScriptFromString:
+ @"document.body.offsetHeight"]
+ doubleValue];
+# else
+ NSString *text = [self stripTags: html];
+ CGSize s = r.size;
+ s.height = 999999;
+ s = [text boundingRectWithSize:s
+ options:NSStringDrawingUsesLineFragmentOrigin
+ attributes:@{NSFontAttributeName: font}
+ context:nil].size;
+ r.size.height = s.height;
+# endif
+
+ [self setFrame: r];
+}
+
+
+- (void) dealloc
+{
+ [html release];
+ [font release];
+ [webView release];
+ [super dealloc];
+}
+
+@end
+
+#endif // USE_IPHONE && USE_HTML_LABELS
+
+
+@interface XScreenSaverConfigSheet (Private)
+
+- (void)traverseChildren:(NSXMLNode *)node on:(NSView *)parent;
+
+# ifndef USE_IPHONE
+- (void) placeChild: (NSView *)c on:(NSView *)p right:(BOOL)r;
+- (void) placeChild: (NSView *)c on:(NSView *)p;
+static NSView *last_child (NSView *parent);
+static void layout_group (NSView *group, BOOL horiz_p);
+# else // USE_IPHONE
+- (void) placeChild: (NSObject *)c on:(NSView *)p right:(BOOL)r;
+- (void) placeChild: (NSObject *)c on:(NSView *)p;
+- (void) placeSeparator;
+- (void) bindResource:(NSObject *)ctl key:(NSString *)k reload:(BOOL)r;
+- (void) refreshTableView;
+# endif // USE_IPHONE
+
+@end
+
+
+@implementation XScreenSaverConfigSheet
+
+# define LEFT_MARGIN 20 // left edge of window
+# define COLUMN_SPACING 10 // gap between e.g. labels and text fields
+# define LEFT_LABEL_WIDTH 70 // width of all left labels
+# define LINE_SPACING 10 // leading between each line
+
+# define FONT_SIZE 17 // Magic hardcoded UITableView font size.
+
+#pragma mark Talking to the resource database
+
+
+/* Normally we read resources by looking up "KEY" in the database
+ "org.jwz.xscreensaver.SAVERNAME". But in the all-in-one iPhone
+ app, everything is stored in the database "org.jwz.xscreensaver"
+ instead, so transform keys to "SAVERNAME.KEY".
+
+ NOTE: This is duplicated in PrefsReader.m, cause I suck.
+ */
+- (NSString *) makeKey:(NSString *)key
+{
+# ifdef USE_IPHONE
+ NSString *prefix = [saver_name stringByAppendingString:@"."];
+ if (! [key hasPrefix:prefix]) // Don't double up!
+ key = [prefix stringByAppendingString:key];
+# endif
+ return key;
+}
+
+
+- (NSString *) makeCKey:(const char *)key
+{
+ return [self makeKey:[NSString stringWithCString:key
+ encoding:NSUTF8StringEncoding]];
+}
+
+
+/* Given a command-line option, returns the corresponding resource name.
+ Any arguments in the switch string are ignored (e.g., "-foo x").
+ */
+- (NSString *) switchToResource:(NSString *)cmdline_switch
+ opts:(const XrmOptionDescRec *)opts_array
+ valRet:(NSString **)val_ret
+{
+ char buf[1280];
+ char *tail = 0;
+ NSAssert(cmdline_switch, @"cmdline switch is null");
+ if (! [cmdline_switch getCString:buf maxLength:sizeof(buf)
+ encoding:NSUTF8StringEncoding]) {
+ NSAssert1(0, @"unable to convert %@", cmdline_switch);
+ return 0;
+ }
+ char *s = strpbrk(buf, " \t\r\n");
+ if (s && *s) {
+ *s = 0;
+ tail = s+1;
+ while (*tail && (*tail == ' ' || *tail == '\t'))
+ tail++;
+ }
+
+ while (opts_array[0].option) {
+ if (!strcmp (opts_array[0].option, buf)) {
+ const char *ret = 0;
+
+ if (opts_array[0].argKind == XrmoptionNoArg) {
+ if (tail && *tail)
+ NSAssert1 (0, @"expected no args to switch: \"%@\"",
+ cmdline_switch);
+ ret = opts_array[0].value;
+ } else {
+ if (!tail || !*tail)
+ NSAssert1 (0, @"expected args to switch: \"%@\"",
+ cmdline_switch);
+ ret = tail;
+ }
+
+ if (val_ret)
+ *val_ret = (ret
+ ? [NSString stringWithCString:ret
+ encoding:NSUTF8StringEncoding]
+ : 0);
+
+ const char *res = opts_array[0].specifier;
+ while (*res && (*res == '.' || *res == '*'))
+ res++;
+ return [self makeCKey:res];
+ }
+ opts_array++;
+ }
+
+ NSAssert1 (0, @"\"%@\" not present in options", cmdline_switch);
+ return 0;
+}
+
+
+- (NSUserDefaultsController *)controllerForKey:(NSString *)key
+{
+ static NSDictionary *a = 0;
+ if (! a) {
+ a = UPDATER_DEFAULTS;
+ [a retain];
+ }
+ if ([a objectForKey:key])
+ // These preferences are global to all xscreensavers.
+ return globalDefaultsController;
+ else
+ // All other preferences are per-saver.
+ return userDefaultsController;
+}
+
+
+#ifdef USE_IPHONE
+
+// Called when a slider is bonked.
+//
+- (void)sliderAction:(UISlider*)sender
+{
+ if ([active_text_field canResignFirstResponder])
+ [active_text_field resignFirstResponder];
+ NSString *pref_key = [pref_keys objectAtIndex: [sender tag]];
+
+ // Hacky API. See comment in InvertedSlider.m.
+ double v = ([sender isKindOfClass: [InvertedSlider class]]
+ ? [(InvertedSlider *) sender transformedValue]
+ : [sender value]);
+
+ [[self controllerForKey:pref_key]
+ setObject:((v == (int) v)
+ ? [NSNumber numberWithInt:(int) v]
+ : [NSNumber numberWithDouble: v])
+ forKey:pref_key];
+}
+
+// Called when a checkbox/switch is bonked.
+//
+- (void)switchAction:(UISwitch*)sender
+{
+ if ([active_text_field canResignFirstResponder])
+ [active_text_field resignFirstResponder];
+ NSString *pref_key = [pref_keys objectAtIndex: [sender tag]];
+ NSString *v = ([sender isOn] ? @"true" : @"false");
+ [[self controllerForKey:pref_key] setObject:v forKey:pref_key];
+}
+
+# ifdef USE_PICKER_VIEW
+// Called when a picker is bonked.
+//
+- (void)pickerView:(UIPickerView *)pv
+ didSelectRow:(NSInteger)row
+ inComponent:(NSInteger)column
+{
+ if ([active_text_field canResignFirstResponder])
+ [active_text_field resignFirstResponder];
+
+ NSAssert (column == 0, @"internal error");
+ NSArray *a = [picker_values objectAtIndex: [pv tag]];
+ if (! a) return; // Too early?
+ a = [a objectAtIndex:row];
+ NSAssert (a, @"missing row");
+
+//NSString *label = [a objectAtIndex:0];
+ NSString *pref_key = [a objectAtIndex:1];
+ NSObject *pref_val = [a objectAtIndex:2];
+ [[self controllerForKey:pref_key] setObject:pref_val forKey:pref_key];
+}
+# else // !USE_PICKER_VIEW
+
+// Called when a RadioButton is bonked.
+//
+- (void)radioAction:(RadioButton*)sender
+{
+ if ([active_text_field canResignFirstResponder])
+ [active_text_field resignFirstResponder];
+
+ NSArray *item = [[sender items] objectAtIndex: [sender index]];
+ NSString *pref_key = [item objectAtIndex:1];
+ NSObject *pref_val = [item objectAtIndex:2];
+ [[self controllerForKey:pref_key] setObject:pref_val forKey:pref_key];
+}
+
+- (BOOL)textFieldShouldBeginEditing:(UITextField *)tf
+{
+ active_text_field = tf;
+ return YES;
+}
+
+- (void)textFieldDidEndEditing:(UITextField *)tf
+{
+ NSString *pref_key = [pref_keys objectAtIndex: [tf tag]];
+ NSString *txt = [tf text];
+ [[self controllerForKey:pref_key] setObject:txt forKey:pref_key];
+}
+
+- (BOOL)textFieldShouldReturn:(UITextField *)tf
+{
+ active_text_field = nil;
+ [tf resignFirstResponder];
+ return YES;
+}
+
+# endif // !USE_PICKER_VIEW
+
+#endif // USE_IPHONE
+
+
+# ifndef USE_IPHONE
+
+- (void) okAction:(NSObject *)arg
+{
+ // Without the setAppliesImmediately:, when the saver restarts, it's still
+ // got the old settings. -[XScreenSaverConfigSheet traverseTree] sets this
+ // to NO; default is YES.
+
+ // #### However: I'm told that when these are set to YES, then changes to
+ // 'textLiteral', 'textURL' and 'textProgram' are ignored, but 'textFile'
+ // works. In StarWars, at least...
+
+ [userDefaultsController setAppliesImmediately:YES];
+ [globalDefaultsController setAppliesImmediately:YES];
+ [userDefaultsController commitEditing];
+ [globalDefaultsController commitEditing];
+ [userDefaultsController save:self];
+ [globalDefaultsController save:self];
+ [NSApp endSheet:self returnCode:NSOKButton];
+ [self close];
+}
+
+- (void) cancelAction:(NSObject *)arg
+{
+ [userDefaultsController revert:self];
+ [globalDefaultsController revert:self];
+ [NSApp endSheet:self returnCode:NSCancelButton];
+ [self close];
+}
+# endif // !USE_IPHONE
+
+
+- (void) resetAction:(NSObject *)arg
+{
+# ifndef USE_IPHONE
+ [userDefaultsController revertToInitialValues:self];
+ [globalDefaultsController revertToInitialValues:self];
+# else // USE_IPHONE
+
+ for (NSString *key in defaultOptions) {
+ NSObject *val = [defaultOptions objectForKey:key];
+ [[self controllerForKey:key] setObject:val forKey:key];
+ }
+
+ for (UIControl *ctl in pref_ctls) {
+ NSString *pref_key = [pref_keys objectAtIndex: ctl.tag];
+ [self bindResource:ctl key:pref_key reload:YES];
+ }
+
+ [self refreshTableView];
+# endif // USE_IPHONE
+}
+
+
+/* Connects a control (checkbox, etc) to the corresponding preferences key.
+ */
+- (void) bindResource:(NSObject *)control key:(NSString *)pref_key
+ reload:(BOOL)reload_p
+{
+ NSUserDefaultsController *prefs = [self controllerForKey:pref_key];
+# ifndef USE_IPHONE
+ NSDictionary *opts_dict = nil;
+ NSString *bindto = ([control isKindOfClass:[NSPopUpButton class]]
+ ? @"selectedObject"
+ : ([control isKindOfClass:[NSMatrix class]]
+ ? @"selectedIndex"
+ : @"value"));
+
+ if ([control isKindOfClass:[NSMatrix class]]) {
+ opts_dict = @{ NSValueTransformerNameBindingOption:
+ @"TextModeTransformer" };
+ }
+
+ [control bind:bindto
+ toObject:prefs
+ withKeyPath:[@"values." stringByAppendingString: pref_key]
+ options:opts_dict];
+
+# else // USE_IPHONE
+ SEL sel;
+ NSObject *val = [prefs objectForKey:pref_key];
+ NSString *sval = 0;
+ double dval = 0;
+
+ if ([val isKindOfClass:[NSString class]]) {
+ sval = (NSString *) val;
+ if (NSOrderedSame == [sval caseInsensitiveCompare:@"true"] ||
+ NSOrderedSame == [sval caseInsensitiveCompare:@"yes"] ||
+ NSOrderedSame == [sval caseInsensitiveCompare:@"1"])
+ dval = 1;
+ else
+ dval = [sval doubleValue];
+ } else if ([val isKindOfClass:[NSNumber class]]) {
+ // NSBoolean (__NSCFBoolean) is really NSNumber.
+ dval = [(NSNumber *) val doubleValue];
+ sval = [(NSNumber *) val stringValue];
+ }
+
+ if ([control isKindOfClass:[UISlider class]]) {
+ sel = @selector(sliderAction:);
+ // Hacky API. See comment in InvertedSlider.m.
+ if ([control isKindOfClass:[InvertedSlider class]])
+ [(InvertedSlider *) control setTransformedValue: dval];
+ else
+ [(UISlider *) control setValue: dval];
+ } else if ([control isKindOfClass:[UISwitch class]]) {
+ sel = @selector(switchAction:);
+ [(UISwitch *) control setOn: ((int) dval != 0)];
+# ifdef USE_PICKER_VIEW
+ } else if ([control isKindOfClass:[UIPickerView class]]) {
+ sel = 0;
+ [(UIPickerView *) control selectRow:((int)dval) inComponent:0
+ animated:NO];
+# else // !USE_PICKER_VIEW
+ } else if ([control isKindOfClass:[RadioButton class]]) {
+ sel = 0; // radioAction: sent from didSelectRowAtIndexPath.
+ } else if ([control isKindOfClass:[UITextField class]]) {
+ sel = 0; // ####
+ [(UITextField *) control setText: sval];
+# endif // !USE_PICKER_VIEW
+ } else {
+ NSAssert (0, @"unknown class");
+ }
+
+ // NSLog(@"\"%@\" = \"%@\" [%@, %.1f]", pref_key, val, [val class], dval);
+
+ if (!reload_p) {
+ if (! pref_keys) {
+ pref_keys = [[NSMutableArray arrayWithCapacity:10] retain];
+ pref_ctls = [[NSMutableArray arrayWithCapacity:10] retain];
+ }
+
+ [pref_keys addObject: [self makeKey:pref_key]];
+ [pref_ctls addObject: control];
+ ((UIControl *) control).tag = [pref_keys count] - 1;
+
+ if (sel) {
+ [(UIControl *) control addTarget:self action:sel
+ forControlEvents:UIControlEventValueChanged];
+ }
+ }
+
+# endif // USE_IPHONE
+
+# if 0
+ NSObject *def = [[prefs defaults] objectForKey:pref_key];
+ NSString *s = [NSString stringWithFormat:@"bind: \"%@\"", pref_key];
+ s = [s stringByPaddingToLength:18 withString:@" " startingAtIndex:0];
+ s = [NSString stringWithFormat:@"%@ = %@", s,
+ ([def isKindOfClass:[NSString class]]
+ ? [NSString stringWithFormat:@"\"%@\"", def]
+ : def)];
+ s = [s stringByPaddingToLength:30 withString:@" " startingAtIndex:0];
+ s = [NSString stringWithFormat:@"%@ %@ / %@", s,
+ [def class], [control class]];
+# ifndef USE_IPHONE
+ s = [NSString stringWithFormat:@"%@ / %@", s, bindto];
+# endif
+ NSLog (@"%@", s);
+# endif
+}
+
+
+- (void) bindResource:(NSObject *)control key:(NSString *)pref_key
+{
+ [self bindResource:(NSObject *)control key:(NSString *)pref_key reload:NO];
+}
+
+
+
+- (void) bindSwitch:(NSObject *)control
+ cmdline:(NSString *)cmd
+{
+ [self bindResource:control
+ key:[self switchToResource:cmd opts:opts valRet:0]];
+}
+
+
+#pragma mark Text-manipulating utilities
+
+
+static NSString *
+unwrap (NSString *text)
+{
+ // Unwrap lines: delete \n but do not delete \n\n.
+ //
+ NSArray *lines = [text componentsSeparatedByString:@"\n"];
+ NSUInteger i, nlines = [lines count];
+ BOOL eolp = YES;
+
+ text = @"\n"; // start with one blank line
+
+ // skip trailing blank lines in file
+ for (i = nlines-1; i > 0; i--) {
+ NSString *s = (NSString *) [lines objectAtIndex:i];
+ if ([s length] > 0)
+ break;
+ nlines--;
+ }
+
+ // skip leading blank lines in file
+ for (i = 0; i < nlines; i++) {
+ NSString *s = (NSString *) [lines objectAtIndex:i];
+ if ([s length] > 0)
+ break;
+ }
+
+ // unwrap
+ Bool any = NO;
+ for (; i < nlines; i++) {
+ NSString *s = (NSString *) [lines objectAtIndex:i];
+ if ([s length] == 0) {
+ text = [text stringByAppendingString:@"\n\n"];
+ eolp = YES;
+ } else if ([s characterAtIndex:0] == ' ' ||
+ [s hasPrefix:@"Copyright "] ||
+ [s hasPrefix:@"https://"] ||
+ [s hasPrefix:@"http://"]) {
+ // don't unwrap if the following line begins with whitespace,
+ // or with the word "Copyright", or if it begins with a URL.
+ if (any && !eolp)
+ text = [text stringByAppendingString:@"\n"];
+ text = [text stringByAppendingString:s];
+ any = YES;
+ eolp = NO;
+ } else {
+ if (!eolp)
+ text = [text stringByAppendingString:@" "];
+ text = [text stringByAppendingString:s];
+ eolp = NO;
+ any = YES;
+ }
+ }
+
+ return text;
+}
+
+
+# ifndef USE_IPHONE
+/* Makes the text up to the first comma be bold.
+ */
+static void
+boldify (NSText *nstext)
+{
+ NSString *text = [nstext string];
+ NSRange r = [text rangeOfString:@"," options:0];
+ r.length = r.location+1;
+
+ r.location = 0;
+
+ NSFont *font = [nstext font];
+ font = [NSFont boldSystemFontOfSize:[font pointSize]];
+ [nstext setFont:font range:r];
+}
+# endif // !USE_IPHONE
+
+
+/* Creates a human-readable anchor to put on a URL.
+ */
+static char *
+anchorize (const char *url)
+{
+ const char *wiki1 = "http://en.wikipedia.org/wiki/";
+ const char *wiki2 = "https://en.wikipedia.org/wiki/";
+ const char *math1 = "http://mathworld.wolfram.com/";
+ const char *math2 = "https://mathworld.wolfram.com/";
+ if (!strncmp (wiki1, url, strlen(wiki1)) ||
+ !strncmp (wiki2, url, strlen(wiki2))) {
+ char *anchor = (char *) malloc (strlen(url) * 3 + 10);
+ strcpy (anchor, "Wikipedia: \"");
+ const char *in = url + strlen(!strncmp (wiki1, url, strlen(wiki1))
+ ? wiki1 : wiki2);
+ char *out = anchor + strlen(anchor);
+ while (*in) {
+ if (*in == '_') {
+ *out++ = ' ';
+ } else if (*in == '#') {
+ *out++ = ':';
+ *out++ = ' ';
+ } else if (*in == '%') {
+ char hex[3];
+ hex[0] = in[1];
+ hex[1] = in[2];
+ hex[2] = 0;
+ int n = 0;
+ sscanf (hex, "%x", &n);
+ *out++ = (char) n;
+ in += 2;
+ } else {
+ *out++ = *in;
+ }
+ in++;
+ }
+ *out++ = '"';
+ *out = 0;
+ return anchor;
+
+ } else if (!strncmp (math1, url, strlen(math1)) ||
+ !strncmp (math2, url, strlen(math2))) {
+ char *anchor = (char *) malloc (strlen(url) * 3 + 10);
+ strcpy (anchor, "MathWorld: \"");
+ const char *start = url + strlen(!strncmp (math1, url, strlen(math1))
+ ? math1 : math2);
+ const char *in = start;
+ char *out = anchor + strlen(anchor);
+ while (*in) {
+ if (*in == '_') {
+ *out++ = ' ';
+ } else if (in != start && *in >= 'A' && *in <= 'Z') {
+ *out++ = ' ';
+ *out++ = *in;
+ } else if (!strncmp (in, ".htm", 4)) {
+ break;
+ } else {
+ *out++ = *in;
+ }
+ in++;
+ }
+ *out++ = '"';
+ *out = 0;
+ return anchor;
+
+ } else {
+ return strdup (url);
+ }
+}
+
+
+#if !defined(USE_IPHONE) || !defined(USE_HTML_LABELS)
+
+/* Converts any http: URLs in the given text field to clickable links.
+ */
+static void
+hreffify (NSText *nstext)
+{
+# ifndef USE_IPHONE
+ NSString *text = [nstext string];
+ [nstext setRichText:YES];
+# else
+ NSString *text = [nstext text];
+# endif
+
+ NSUInteger L = [text length];
+ NSRange start; // range is start-of-search to end-of-string
+ start.location = 0;
+ start.length = L;
+ while (start.location < L) {
+
+ // Find the beginning of a URL...
+ //
+ NSRange r2 = [text rangeOfString: @"http://" options:0 range:start];
+ NSRange r3 = [text rangeOfString:@"https://" options:0 range:start];
+ if ((r2.location == NSNotFound &&
+ r3.location != NSNotFound) ||
+ (r2.location != NSNotFound &&
+ r3.location != NSNotFound &&
+ r3.location < r2.location))
+ r2 = r3;
+ if (r2.location == NSNotFound)
+ break;
+
+ // Next time around, start searching after this.
+ start.location = r2.location + r2.length;
+ start.length = L - start.location;
+
+ // Find the end of a URL (whitespace or EOF)...
+ //
+ r3 = [text rangeOfCharacterFromSet:
+ [NSCharacterSet whitespaceAndNewlineCharacterSet]
+ options:0 range:start];
+ if (r3.location == NSNotFound) // EOF
+ r3.location = L, r3.length = 0;
+
+ // Next time around, start searching after this.
+ start.location = r3.location;
+ start.length = L - start.location;
+
+ // Set r2 to the start/length of this URL.
+ r2.length = start.location - r2.location;
+
+ // Extract the URL.
+ NSString *nsurl = [text substringWithRange:r2];
+ const char *url = [nsurl UTF8String];
+
+ // If this is a Wikipedia URL, make the linked text be prettier.
+ //
+ char *anchor = anchorize(url);
+
+# ifndef USE_IPHONE
+
+ // Construct the RTF corresponding to <A HREF="url">anchor</A>
+ //
+ const char *fmt = "{\\field{\\*\\fldinst{HYPERLINK \"%s\"}}%s}";
+ char *rtf = malloc (strlen (fmt) + strlen(url) + strlen(anchor) + 10);
+ sprintf (rtf, fmt, url, anchor);
+
+ NSData *rtfdata = [NSData dataWithBytesNoCopy:rtf length:strlen(rtf)];
+ [nstext replaceCharactersInRange:r2 withRTF:rtfdata];
+
+# else // !USE_IPHONE
+ // *anchor = 0; // Omit Wikipedia anchor
+ text = [text stringByReplacingCharactersInRange:r2
+ withString:[NSString stringWithCString:anchor
+ encoding:NSUTF8StringEncoding]];
+ // text = [text stringByReplacingOccurrencesOfString:@"\n\n\n"
+ // withString:@"\n\n"];
+# endif // !USE_IPHONE
+
+ free (anchor);
+
+ NSUInteger L2 = [text length]; // might have changed
+ start.location -= (L - L2);
+ L = L2;
+ }
+
+# ifdef USE_IPHONE
+ [nstext setText:text];
+ [nstext sizeToFit];
+# endif
+}
+
+#endif /* !USE_IPHONE || !USE_HTML_LABELS */
+
+
+
+#pragma mark Creating controls from XML
+
+
+/* Parse the attributes of an XML tag into a dictionary.
+ For input, the dictionary should have as attributes the keys, each
+ with @"" as their value.
+ On output, the dictionary will set the keys to the values specified,
+ and keys that were not specified will not be present in the dictionary.
+ Warnings are printed if there are duplicate or unknown attributes.
+ */
+- (void) parseAttrs:(NSMutableDictionary *)dict node:(NSXMLNode *)node
+{
+ NSArray *attrs = [(NSXMLElement *) node attributes];
+ NSUInteger n = [attrs count];
+ int i;
+
+ // For each key in the dictionary, fill in the dict with the corresponding
+ // value. The value @"" is assumed to mean "un-set". Issue a warning if
+ // an attribute is specified twice.
+ //
+ for (i = 0; i < n; i++) {
+ NSXMLNode *attr = [attrs objectAtIndex:i];
+ NSString *key = [attr name];
+ NSString *val = [attr objectValue];
+ NSString *old = [dict objectForKey:key];
+
+ if (! old) {
+ NSAssert2 (0, @"unknown attribute \"%@\" in \"%@\"", key, [node name]);
+ } else if ([old length] != 0) {
+ NSAssert3 (0, @"duplicate %@: \"%@\", \"%@\"", key, old, val);
+ } else {
+ [dict setValue:val forKey:key];
+ }
+ }
+
+ // Remove from the dictionary any keys whose value is still @"",
+ // meaning there was no such attribute specified.
+ //
+ NSArray *keys = [dict allKeys];
+ n = [keys count];
+ for (i = 0; i < n; i++) {
+ NSString *key = [keys objectAtIndex:i];
+ NSString *val = [dict objectForKey:key];
+ if ([val length] == 0)
+ [dict removeObjectForKey:key];
+ }
+
+# ifdef USE_IPHONE
+ // Kludge for starwars.xml:
+ // If there is a "_low-label" and no "_label", but "_low-label" contains
+ // spaces, divide them.
+ NSString *lab = [dict objectForKey:@"_label"];
+ NSString *low = [dict objectForKey:@"_low-label"];
+ if (low && !lab) {
+ NSArray *split =
+ [[[low stringByTrimmingCharactersInSet:
+ [NSCharacterSet whitespaceAndNewlineCharacterSet]]
+ componentsSeparatedByString: @" "]
+ filteredArrayUsingPredicate:
+ [NSPredicate predicateWithFormat:@"length > 0"]];
+ if (split && [split count] == 2) {
+ [dict setValue:[split objectAtIndex:0] forKey:@"_label"];
+ [dict setValue:[split objectAtIndex:1] forKey:@"_low-label"];
+ }
+ }
+# endif // USE_IPHONE
+}
+
+
+/* Handle the options on the top level <xscreensaver> tag.
+ */
+- (NSString *) parseXScreenSaverTag:(NSXMLNode *)node
+{
+ NSMutableDictionary *dict = [@{ @"name": @"",
+ @"_label": @"",
+ @"gl": @"" }
+ mutableCopy];
+ [self parseAttrs:dict node:node];
+ NSString *name = [dict objectForKey:@"name"];
+ NSString *label = [dict objectForKey:@"_label"];
+ [dict release];
+ dict = 0;
+
+ NSAssert1 (label, @"no _label in %@", [node name]);
+ NSAssert1 (name, @"no name in \"%@\"", label);
+ return label;
+}
+
+
+/* Creates a label: an un-editable NSTextField displaying the given text.
+ */
+- (LABEL *) makeLabel:(NSString *)text
+{
+ NSRect rect;
+ rect.origin.x = rect.origin.y = 0;
+ rect.size.width = rect.size.height = 10;
+# ifndef USE_IPHONE
+ NSTextField *lab = [[NSTextField alloc] initWithFrame:rect];
+ [lab setSelectable:NO];
+ [lab setEditable:NO];
+ [lab setBezeled:NO];
+ [lab setDrawsBackground:NO];
+ [lab setStringValue:text];
+ [lab sizeToFit];
+# else // USE_IPHONE
+ UILabel *lab = [[UILabel alloc] initWithFrame:rect];
+ [lab setText: [text stringByTrimmingCharactersInSet:
+ [NSCharacterSet whitespaceAndNewlineCharacterSet]]];
+ [lab setBackgroundColor:[UIColor clearColor]];
+ [lab setNumberOfLines:0]; // unlimited
+ // [lab setLineBreakMode:UILineBreakModeWordWrap];
+ [lab setLineBreakMode:NSLineBreakByTruncatingHead];
+ [lab setAutoresizingMask: (UIViewAutoresizingFlexibleWidth |
+ UIViewAutoresizingFlexibleHeight)];
+# endif // USE_IPHONE
+ [lab autorelease];
+ return lab;
+}
+
+
+/* Creates the checkbox (NSButton) described by the given XML node.
+ */
+- (void) makeCheckbox:(NSXMLNode *)node on:(NSView *)parent
+{
+ NSMutableDictionary *dict = [@{ @"id": @"",
+ @"_label": @"",
+ @"arg-set": @"",
+ @"arg-unset": @"" }
+ mutableCopy];
+ [self parseAttrs:dict node:node];
+ NSString *label = [dict objectForKey:@"_label"];
+ NSString *arg_set = [dict objectForKey:@"arg-set"];
+ NSString *arg_unset = [dict objectForKey:@"arg-unset"];
+ [dict release];
+ dict = 0;
+
+ if (!label) {
+ NSAssert1 (0, @"no _label in %@", [node name]);
+ return;
+ }
+ if (!arg_set && !arg_unset) {
+ NSAssert1 (0, @"neither arg-set nor arg-unset provided in \"%@\"",
+ label);
+ }
+ if (arg_set && arg_unset) {
+ NSAssert1 (0, @"only one of arg-set and arg-unset may be used in \"%@\"",
+ label);
+ }
+
+ // sanity-check the choice of argument names.
+ //
+ if (arg_set && ([arg_set hasPrefix:@"-no-"] ||
+ [arg_set hasPrefix:@"--no-"]))
+ NSLog (@"arg-set should not be a \"no\" option in \"%@\": %@",
+ label, arg_set);
+ if (arg_unset && (![arg_unset hasPrefix:@"-no-"] &&
+ ![arg_unset hasPrefix:@"--no-"]))
+ NSLog(@"arg-unset should be a \"no\" option in \"%@\": %@",
+ label, arg_unset);
+
+ NSRect rect;
+ rect.origin.x = rect.origin.y = 0;
+ rect.size.width = rect.size.height = 10;
+
+# ifndef USE_IPHONE
+
+ NSButton *button = [[NSButton alloc] initWithFrame:rect];
+ [button setButtonType:NSSwitchButton];
+ [button setTitle:label];
+ [button sizeToFit];
+ [self placeChild:button on:parent];
+
+# else // USE_IPHONE
+
+ LABEL *lab = [self makeLabel:label];
+ [self placeChild:lab on:parent];
+ UISwitch *button = [[UISwitch alloc] initWithFrame:rect];
+ [self placeChild:button on:parent right:YES];
+
+# endif // USE_IPHONE
+
+ [self bindSwitch:button cmdline:(arg_set ? arg_set : arg_unset)];
+ [button release];
+}
+
+
+/* Creates the number selection control described by the given XML node.
+ If "type=slider", it's an NSSlider.
+ If "type=spinbutton", it's a text field with up/down arrows next to it.
+ */
+- (void) makeNumberSelector:(NSXMLNode *)node on:(NSView *)parent
+{
+ NSMutableDictionary *dict = [@{ @"id": @"",
+ @"_label": @"",
+ @"_low-label": @"",
+ @"_high-label": @"",
+ @"type": @"",
+ @"arg": @"",
+ @"low": @"",
+ @"high": @"",
+ @"default": @"",
+ @"convert": @"" }
+ mutableCopy];
+ [self parseAttrs:dict node:node];
+ NSString *label = [dict objectForKey:@"_label"];
+ NSString *low_label = [dict objectForKey:@"_low-label"];
+ NSString *high_label = [dict objectForKey:@"_high-label"];
+ NSString *type = [dict objectForKey:@"type"];
+ NSString *arg = [dict objectForKey:@"arg"];
+ NSString *low = [dict objectForKey:@"low"];
+ NSString *high = [dict objectForKey:@"high"];
+ NSString *def = [dict objectForKey:@"default"];
+ NSString *cvt = [dict objectForKey:@"convert"];
+ [dict release];
+ dict = 0;
+
+ NSAssert1 (arg, @"no arg in %@", label);
+ NSAssert1 (type, @"no type in %@", label);
+
+ if (! low) {
+ NSAssert1 (0, @"no low in %@", [node name]);
+ return;
+ }
+ if (! high) {
+ NSAssert1 (0, @"no high in %@", [node name]);
+ return;
+ }
+ if (! def) {
+ NSAssert1 (0, @"no default in %@", [node name]);
+ return;
+ }
+ if (cvt && ![cvt isEqualToString:@"invert"]) {
+ NSAssert1 (0, @"if provided, \"convert\" must be \"invert\" in %@",
+ label);
+ }
+
+ // If either the min or max field contains a decimal point, then this
+ // option may have a floating point value; otherwise, it is constrained
+ // to be an integer.
+ //
+ NSCharacterSet *dot =
+ [NSCharacterSet characterSetWithCharactersInString:@"."];
+ BOOL float_p = ([low rangeOfCharacterFromSet:dot].location != NSNotFound ||
+ [high rangeOfCharacterFromSet:dot].location != NSNotFound);
+
+ if ([type isEqualToString:@"slider"]
+# ifdef USE_IPHONE // On iPhone, we use sliders for all numeric values.
+ || [type isEqualToString:@"spinbutton"]
+# endif
+ ) {
+
+ NSRect rect;
+ rect.origin.x = rect.origin.y = 0;
+ rect.size.width = 150;
+ rect.size.height = 23; // apparent min height for slider with ticks...
+ NSSlider *slider;
+ slider = [[InvertedSlider alloc] initWithFrame:rect
+ inverted: !!cvt
+ integers: !float_p];
+ [slider setMaxValue:[high doubleValue]];
+ [slider setMinValue:[low doubleValue]];
+
+ int range = [slider maxValue] - [slider minValue] + 1;
+ int range2 = range;
+ int max_ticks = 21;
+ while (range2 > max_ticks)
+ range2 /= 10;
+
+# ifndef USE_IPHONE
+ // If we have elided ticks, leave it at the max number of ticks.
+ if (range != range2 && range2 < max_ticks)
+ range2 = max_ticks;
+
+ // If it's a float, always display the max number of ticks.
+ if (float_p && range2 < max_ticks)
+ range2 = max_ticks;
+
+ [slider setNumberOfTickMarks:range2];
+
+ [slider setAllowsTickMarkValuesOnly:
+ (range == range2 && // we are showing the actual number of ticks
+ !float_p)]; // and we want integer results
+# endif // !USE_IPHONE
+
+ // #### Note: when the slider's range is large enough that we aren't
+ // showing all possible ticks, the slider's value is not constrained
+ // to be an integer, even though it should be...
+ // Maybe we need to use a value converter or something?
+
+ LABEL *lab;
+ if (label) {
+ lab = [self makeLabel:label];
+ [self placeChild:lab on:parent];
+# ifdef USE_IPHONE
+ if (low_label) {
+ CGFloat s = [NSFont systemFontSize] + 4;
+ [lab setFont:[NSFont boldSystemFontOfSize:s]];
+ }
+# endif
+ }
+
+ if (low_label) {
+ lab = [self makeLabel:low_label];
+ [lab setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
+# ifndef USE_IPHONE
+ [lab setAlignment:1]; // right aligned
+ rect = [lab frame];
+ if (rect.size.width < LEFT_LABEL_WIDTH)
+ rect.size.width = LEFT_LABEL_WIDTH; // make all left labels same size
+ rect.size.height = [slider frame].size.height;
+ [lab setFrame:rect];
+ [self placeChild:lab on:parent];
+# else // USE_IPHONE
+ [lab setTextAlignment: NSTextAlignmentRight];
+ // Sometimes rotation screws up truncation.
+ [lab setLineBreakMode:NSLineBreakByClipping];
+ [self placeChild:lab on:parent right:(label ? YES : NO)];
+# endif // USE_IPHONE
+ }
+
+# ifndef USE_IPHONE
+ [self placeChild:slider on:parent right:(low_label ? YES : NO)];
+# else // USE_IPHONE
+ [self placeChild:slider on:parent right:(label || low_label ? YES : NO)];
+# endif // USE_IPHONE
+
+ if (low_label) {
+ // Make left label be same height as slider.
+ rect = [lab frame];
+ rect.size.height = [slider frame].size.height;
+ [lab setFrame:rect];
+ }
+
+ if (! low_label) {
+ rect = [slider frame];
+ if (rect.origin.x < LEFT_LABEL_WIDTH)
+ rect.origin.x = LEFT_LABEL_WIDTH; // make unlabelled sliders line up too
+ [slider setFrame:rect];
+ }
+
+ if (high_label) {
+ lab = [self makeLabel:high_label];
+ [lab setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
+ rect = [lab frame];
+
+ // Make right label be same height as slider.
+ rect.size.height = [slider frame].size.height;
+ [lab setFrame:rect];
+# ifdef USE_IPHONE
+ // Sometimes rotation screws up truncation.
+ [lab setLineBreakMode:NSLineBreakByClipping];
+# endif
+ [self placeChild:lab on:parent right:YES];
+ }
+
+ [self bindSwitch:slider cmdline:arg];
+ [slider release];
+
+#ifndef USE_IPHONE // On iPhone, we use sliders for all numeric values.
+
+ } else if ([type isEqualToString:@"spinbutton"]) {
+
+ if (! label) {
+ NSAssert1 (0, @"no _label in spinbutton %@", [node name]);
+ return;
+ }
+ NSAssert1 (!low_label,
+ @"low-label not allowed in spinbutton \"%@\"", [node name]);
+ NSAssert1 (!high_label,
+ @"high-label not allowed in spinbutton \"%@\"", [node name]);
+ NSAssert1 (!cvt, @"convert not allowed in spinbutton \"%@\"",
+ [node name]);
+
+ NSRect rect;
+ rect.origin.x = rect.origin.y = 0;
+ rect.size.width = rect.size.height = 10;
+
+ NSTextField *txt = [[NSTextField alloc] initWithFrame:rect];
+ [txt setStringValue:@"0000.0"];
+ [txt sizeToFit];
+ [txt setStringValue:@""];
+
+ if (label) {
+ LABEL *lab = [self makeLabel:label];
+ //[lab setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
+ [lab setAlignment:1]; // right aligned
+ rect = [lab frame];
+ if (rect.size.width < LEFT_LABEL_WIDTH)
+ rect.size.width = LEFT_LABEL_WIDTH; // make all left labels same size
+ rect.size.height = [txt frame].size.height;
+ [lab setFrame:rect];
+ [self placeChild:lab on:parent];
+ }
+
+ [self placeChild:txt on:parent right:(label ? YES : NO)];
+
+ if (! label) {
+ rect = [txt frame];
+ if (rect.origin.x < LEFT_LABEL_WIDTH)
+ rect.origin.x = LEFT_LABEL_WIDTH; // make unlabelled spinbtns line up
+ [txt setFrame:rect];
+ }
+
+ rect.size.width = rect.size.height = 10;
+ NSStepper *step = [[NSStepper alloc] initWithFrame:rect];
+ [step sizeToFit];
+ [self placeChild:step on:parent right:YES];
+ rect = [step frame];
+ rect.origin.x -= COLUMN_SPACING; // this one goes close
+ rect.origin.y += ([txt frame].size.height - rect.size.height) / 2;
+ [step setFrame:rect];
+
+ [step setMinValue:[low doubleValue]];
+ [step setMaxValue:[high doubleValue]];
+ [step setAutorepeat:YES];
+ [step setValueWraps:NO];
+
+ double range = [high doubleValue] - [low doubleValue];
+ if (range < 1.0)
+ [step setIncrement:range / 10.0];
+ else if (range >= 500)
+ [step setIncrement:range / 100.0];
+ else
+ [step setIncrement:1.0];
+
+ NSNumberFormatter *fmt = [[[NSNumberFormatter alloc] init] autorelease];
+ [fmt setFormatterBehavior:NSNumberFormatterBehavior10_4];
+ [fmt setNumberStyle:NSNumberFormatterDecimalStyle];
+ [fmt setMinimum:[NSNumber numberWithDouble:[low doubleValue]]];
+ [fmt setMaximum:[NSNumber numberWithDouble:[high doubleValue]]];
+ [fmt setMinimumFractionDigits: (float_p ? 1 : 0)];
+ [fmt setMaximumFractionDigits: (float_p ? 2 : 0)];
+
+ [fmt setGeneratesDecimalNumbers:float_p];
+ [[txt cell] setFormatter:fmt];
+
+ [self bindSwitch:step cmdline:arg];
+ [self bindSwitch:txt cmdline:arg];
+
+ [step release];
+ [txt release];
+
+# endif // USE_IPHONE
+
+ } else {
+ NSAssert2 (0, @"unknown type \"%@\" in \"%@\"", type, label);
+ }
+}
+
+
+# ifndef USE_IPHONE
+static void
+set_menu_item_object (NSMenuItem *item, NSObject *obj)
+{
+ /* If the object associated with this menu item looks like a boolean,
+ store an NSNumber instead of an NSString, since that's what
+ will be in the preferences (due to similar logic in PrefsReader).
+ */
+ if ([obj isKindOfClass:[NSString class]]) {
+ NSString *string = (NSString *) obj;
+ if (NSOrderedSame == [string caseInsensitiveCompare:@"true"] ||
+ NSOrderedSame == [string caseInsensitiveCompare:@"yes"])
+ obj = [NSNumber numberWithBool:YES];
+ else if (NSOrderedSame == [string caseInsensitiveCompare:@"false"] ||
+ NSOrderedSame == [string caseInsensitiveCompare:@"no"])
+ obj = [NSNumber numberWithBool:NO];
+ else
+ obj = string;
+ }
+
+ [item setRepresentedObject:obj];
+ //NSLog (@"menu item \"%@\" = \"%@\" %@", [item title], obj, [obj class]);
+}
+# endif // !USE_IPHONE
+
+
+/* Creates the popup menu described by the given XML node (and its children).
+ */
+- (void) makeOptionMenu:(NSXMLNode *)node on:(NSView *)parent
+{
+ NSArray *children = [node children];
+ NSUInteger i, count = [children count];
+
+ if (count <= 0) {
+ NSAssert1 (0, @"no menu items in \"%@\"", [node name]);
+ return;
+ }
+
+ // get the "id" attribute off the <select> tag.
+ //
+ NSMutableDictionary *dict = [@{ @"id": @"", } mutableCopy];
+ [self parseAttrs:dict node:node];
+ [dict release];
+ dict = 0;
+
+ NSRect rect;
+ rect.origin.x = rect.origin.y = 0;
+ rect.size.width = 10;
+ rect.size.height = 10;
+
+ NSString *menu_key = nil; // the resource key used by items in this menu
+
+# ifndef USE_IPHONE
+ // #### "Build and Analyze" says that all of our widgets leak, because it
+ // seems to not realize that placeChild -> addSubview retains them.
+ // Not sure what to do to make these warnings go away.
+
+ NSPopUpButton *popup = [[NSPopUpButton alloc] initWithFrame:rect
+ pullsDown:NO];
+ NSMenuItem *def_item = nil;
+ float max_width = 0;
+
+# else // USE_IPHONE
+
+ NSString *def_item = nil;
+
+ rect.size.width = 0;
+ rect.size.height = 0;
+# ifdef USE_PICKER_VIEW
+ UIPickerView *popup = [[[UIPickerView alloc] initWithFrame:rect] retain];
+ popup.delegate = self;
+ popup.dataSource = self;
+# endif // !USE_PICKER_VIEW
+ NSMutableArray *items = [NSMutableArray arrayWithCapacity:10];
+
+# endif // USE_IPHONE
+
+ for (i = 0; i < count; i++) {
+ NSXMLNode *child = [children objectAtIndex:i];
+
+ if ([child kind] == NSXMLCommentKind)
+ continue;
+ if ([child kind] != NSXMLElementKind) {
+// NSAssert2 (0, @"weird XML node kind: %d: %@", (int)[child kind], node);
+ continue;
+ }
+
+ // get the "id", "_label", and "arg-set" attrs off of the <option> tags.
+ //
+ NSMutableDictionary *dict2 = [@{ @"id": @"",
+ @"_label": @"",
+ @"arg-set": @"" }
+ mutableCopy];
+ [self parseAttrs:dict2 node:child];
+ NSString *label = [dict2 objectForKey:@"_label"];
+ NSString *arg_set = [dict2 objectForKey:@"arg-set"];
+ [dict2 release];
+ dict2 = 0;
+
+ if (!label) {
+ NSAssert1 (0, @"no _label in %@", [child name]);
+ continue;
+ }
+
+# ifndef USE_IPHONE
+ // create the menu item (and then get a pointer to it)
+ [popup addItemWithTitle:label];
+ NSMenuItem *item = [popup itemWithTitle:label];
+# endif // USE_IPHONE
+
+ if (arg_set) {
+ NSString *this_val = NULL;
+ NSString *this_key = [self switchToResource: arg_set
+ opts: opts
+ valRet: &this_val];
+ NSAssert1 (this_val, @"this_val null for %@", arg_set);
+ if (menu_key && ![menu_key isEqualToString:this_key])
+ NSAssert3 (0,
+ @"multiple resources in menu: \"%@\" vs \"%@\" = \"%@\"",
+ menu_key, this_key, this_val);
+ if (this_key)
+ menu_key = this_key;
+
+ /* If this menu has the cmd line "-mode foo" then set this item's
+ value to "foo" (the menu itself will be bound to e.g. "modeString")
+ */
+# ifndef USE_IPHONE
+ set_menu_item_object (item, this_val);
+# else
+ // Array holds ["Label", "resource-key", "resource-val"].
+ [items addObject:[NSMutableArray arrayWithObjects:
+ label, @"", this_val, nil]];
+# endif
+
+ } else {
+ // no arg-set -- only one menu item can be missing that.
+ NSAssert1 (!def_item, @"no arg-set in \"%@\"", label);
+# ifndef USE_IPHONE
+ def_item = item;
+# else
+ def_item = label;
+ // Array holds ["Label", "resource-key", "resource-val"].
+ [items addObject:[NSMutableArray arrayWithObjects:
+ label, @"", @"", nil]];
+# endif
+ }
+
+ /* make sure the menu button has room for the text of this item,
+ and remember the greatest width it has reached.
+ */
+# ifndef USE_IPHONE
+ [popup setTitle:label];
+ [popup sizeToFit];
+ NSRect r = [popup frame];
+ if (r.size.width > max_width) max_width = r.size.width;
+# endif // USE_IPHONE
+ }
+
+ if (!menu_key) {
+ NSAssert1 (0, @"no switches in menu \"%@\"", [dict objectForKey:@"id"]);
+ return;
+ }
+
+ /* We've added all of the menu items. If there was an item with no
+ command-line switch, then it's the item that represents the default
+ value. Now we must bind to that item as well... (We have to bind
+ this one late, because if it was the first item, then we didn't
+ yet know what resource was associated with this menu.)
+ */
+ if (def_item) {
+ NSObject *def_obj = [defaultOptions objectForKey:menu_key];
+ NSAssert2 (def_obj,
+ @"no default value for resource \"%@\" in menu item \"%@\"",
+ menu_key,
+# ifndef USE_IPHONE
+ [def_item title]
+# else
+ def_item
+# endif
+ );
+
+# ifndef USE_IPHONE
+ set_menu_item_object (def_item, def_obj);
+# else // !USE_IPHONE
+ for (NSMutableArray *a in items) {
+ // Make sure each array contains the resource key.
+ [a replaceObjectAtIndex:1 withObject:menu_key];
+ // Make sure the default item contains the default resource value.
+ if (def_obj && def_item &&
+ [def_item isEqualToString:[a objectAtIndex:0]])
+ [a replaceObjectAtIndex:2 withObject:def_obj];
+ }
+# endif // !USE_IPHONE
+ }
+
+# ifndef USE_IPHONE
+# ifdef USE_PICKER_VIEW
+ /* Finish tweaking the menu button itself.
+ */
+ if (def_item)
+ [popup setTitle:[def_item title]];
+ NSRect r = [popup frame];
+ r.size.width = max_width;
+ [popup setFrame:r];
+# endif // USE_PICKER_VIEW
+# endif
+
+# if !defined(USE_IPHONE) || defined(USE_PICKER_VIEW)
+ [self placeChild:popup on:parent];
+ [self bindResource:popup key:menu_key];
+ [popup release];
+# endif
+
+# ifdef USE_IPHONE
+# ifdef USE_PICKER_VIEW
+ // Store the items for this picker in the picker_values array.
+ // This is so fucking stupid.
+
+ unsigned long menu_number = [pref_keys count] - 1;
+ if (! picker_values)
+ picker_values = [[NSMutableArray arrayWithCapacity:menu_number] retain];
+ while ([picker_values count] <= menu_number)
+ [picker_values addObject:[NSArray arrayWithObjects: nil]];
+ [picker_values replaceObjectAtIndex:menu_number withObject:items];
+ [popup reloadAllComponents];
+
+# else // !USE_PICKER_VIEW
+
+ [self placeSeparator];
+
+ i = 0;
+ for (__attribute__((unused)) NSArray *item in items) {
+ RadioButton *b = [[RadioButton alloc] initWithIndex: (int)i
+ items:items];
+ [b setLineBreakMode:NSLineBreakByTruncatingHead];
+ [b setFont:[NSFont boldSystemFontOfSize: FONT_SIZE]];
+ [self placeChild:b on:parent];
+ [b release];
+ i++;
+ }
+
+ [self placeSeparator];
+
+# endif // !USE_PICKER_VIEW
+# endif // !USE_IPHONE
+
+}
+
+
+/* Creates an uneditable, wrapping NSTextField to display the given
+ text enclosed by <description> ... </description> in the XML.
+ */
+- (void) makeDescLabel:(NSXMLNode *)node on:(NSView *)parent
+{
+ NSString *text = nil;
+ NSArray *children = [node children];
+ NSUInteger i, count = [children count];
+
+ for (i = 0; i < count; i++) {
+ NSXMLNode *child = [children objectAtIndex:i];
+ NSString *s = [child objectValue];
+ if (text)
+ text = [text stringByAppendingString:s];
+ else
+ text = s;
+ }
+
+ text = unwrap (text);
+
+ NSRect rect = [parent frame];
+ rect.origin.x = rect.origin.y = 0;
+ rect.size.width = 200;
+ rect.size.height = 50; // sized later
+# ifndef USE_IPHONE
+ NSText *lab = [[NSText alloc] initWithFrame:rect];
+ [lab autorelease];
+ [lab setEditable:NO];
+ [lab setDrawsBackground:NO];
+ [lab setHorizontallyResizable:YES];
+ [lab setVerticallyResizable:YES];
+ [lab setString:text];
+ hreffify (lab);
+ boldify (lab);
+ [lab sizeToFit];
+
+# else // USE_IPHONE
+
+# ifndef USE_HTML_LABELS
+
+ UILabel *lab = [self makeLabel:text];
+ [lab setFont:[NSFont systemFontOfSize: [NSFont systemFontSize]]];
+ hreffify (lab);
+
+# else // USE_HTML_LABELS
+ HTMLLabel *lab = [[HTMLLabel alloc]
+ initWithText:text
+ font:[NSFont systemFontOfSize: [NSFont systemFontSize]]];
+ [lab autorelease];
+ [lab setFrame:rect];
+ [lab sizeToFit];
+# endif // USE_HTML_LABELS
+
+ [self placeSeparator];
+
+# endif // USE_IPHONE
+
+ [self placeChild:lab on:parent];
+}
+
+
+/* Creates the NSTextField described by the given XML node.
+ */
+- (void) makeTextField: (NSXMLNode *)node
+ on: (NSView *)parent
+ withLabel: (BOOL) label_p
+ horizontal: (BOOL) horiz_p
+{
+ NSMutableDictionary *dict = [@{ @"id": @"",
+ @"_label": @"",
+ @"arg": @"" }
+ mutableCopy];
+ [self parseAttrs:dict node:node];
+ NSString *label = [dict objectForKey:@"_label"];
+ NSString *arg = [dict objectForKey:@"arg"];
+ [dict release];
+ dict = 0;
+
+ if (!label && label_p) {
+ NSAssert1 (0, @"no _label in %@", [node name]);
+ return;
+ }
+
+ NSAssert1 (arg, @"no arg in %@", label);
+
+ NSRect rect;
+ rect.origin.x = rect.origin.y = 0;
+ rect.size.width = rect.size.height = 10;
+
+ NSTextField *txt = [[NSTextField alloc] initWithFrame:rect];
+
+# ifndef USE_IPHONE
+
+ // make the default size be around 30 columns; a typical value for
+ // these text fields is "xscreensaver-text --cols 40".
+ //
+ [txt setStringValue:@"123456789 123456789 123456789 "];
+ [txt sizeToFit];
+ [[txt cell] setWraps:NO];
+ [[txt cell] setScrollable:YES];
+ [txt setStringValue:@""];
+
+# else // USE_IPHONE
+
+ txt.adjustsFontSizeToFitWidth = YES;
+ txt.textColor = [UIColor blackColor];
+ txt.font = [UIFont systemFontOfSize: FONT_SIZE];
+ txt.placeholder = @"";
+ txt.borderStyle = UITextBorderStyleRoundedRect;
+ txt.textAlignment = NSTextAlignmentRight;
+ txt.keyboardType = UIKeyboardTypeDefault; // Full kbd
+ txt.autocorrectionType = UITextAutocorrectionTypeNo;
+ txt.autocapitalizationType = UITextAutocapitalizationTypeNone;
+ txt.clearButtonMode = UITextFieldViewModeAlways;
+ txt.returnKeyType = UIReturnKeyDone;
+ txt.delegate = self;
+ txt.text = @"";
+ [txt setEnabled: YES];
+
+ rect.size.height = [txt.font lineHeight] * 1.2;
+ [txt setFrame:rect];
+
+# endif // USE_IPHONE
+
+ if (label) {
+ LABEL *lab = [self makeLabel:label];
+ [self placeChild:lab on:parent];
+ }
+
+ [self placeChild:txt on:parent right:(label ? YES : NO)];
+
+ [self bindSwitch:txt cmdline:arg];
+ [txt release];
+}
+
+
+/* Creates the NSTextField described by the given XML node,
+ and hooks it up to a Choose button and a file selector widget.
+ */
+- (void) makeFileSelector: (NSXMLNode *)node
+ on: (NSView *)parent
+ dirsOnly: (BOOL) dirsOnly
+ withLabel: (BOOL) label_p
+ editable: (BOOL) editable_p
+{
+# ifndef USE_IPHONE // No files. No selectors.
+ NSMutableDictionary *dict = [@{ @"id": @"",
+ @"_label": @"",
+ @"arg": @"" }
+ mutableCopy];
+ [self parseAttrs:dict node:node];
+ NSString *label = [dict objectForKey:@"_label"];
+ NSString *arg = [dict objectForKey:@"arg"];
+ [dict release];
+ dict = 0;
+
+ if (!label && label_p) {
+ NSAssert1 (0, @"no _label in %@", [node name]);
+ return;
+ }
+
+ NSAssert1 (arg, @"no arg in %@", label);
+
+ NSRect rect;
+ rect.origin.x = rect.origin.y = 0;
+ rect.size.width = rect.size.height = 10;
+
+ NSTextField *txt = [[NSTextField alloc] initWithFrame:rect];
+
+ // make the default size be around 20 columns.
+ //
+ [txt setStringValue:@"123456789 123456789 "];
+ [txt sizeToFit];
+ [txt setSelectable:YES];
+ [txt setEditable:editable_p];
+ [txt setBezeled:editable_p];
+ [txt setDrawsBackground:editable_p];
+ [[txt cell] setWraps:NO];
+ [[txt cell] setScrollable:YES];
+ [[txt cell] setLineBreakMode:NSLineBreakByTruncatingHead];
+ [txt setStringValue:@""];
+
+ LABEL *lab = 0;
+ if (label) {
+ lab = [self makeLabel:label];
+ [self placeChild:lab on:parent];
+ }
+
+ [self placeChild:txt on:parent right:(label ? YES : NO)];
+
+ [self bindSwitch:txt cmdline:arg];
+ [txt release];
+
+ // Make the text field and label be the same height, whichever is taller.
+ if (lab) {
+ rect = [txt frame];
+ rect.size.height = ([lab frame].size.height > [txt frame].size.height
+ ? [lab frame].size.height
+ : [txt frame].size.height);
+ [txt setFrame:rect];
+ }
+
+ // Now put a "Choose" button next to it.
+ //
+ rect.origin.x = rect.origin.y = 0;
+ rect.size.width = rect.size.height = 10;
+ NSButton *choose = [[NSButton alloc] initWithFrame:rect];
+ [choose setTitle:@"Choose..."];
+ [choose setBezelStyle:NSRoundedBezelStyle];
+ [choose sizeToFit];
+
+ [self placeChild:choose on:parent right:YES];
+
+ // center the Choose button around the midpoint of the text field.
+ rect = [choose frame];
+ rect.origin.y = ([txt frame].origin.y +
+ (([txt frame].size.height - rect.size.height) / 2));
+ [choose setFrameOrigin:rect.origin];
+
+ [choose setTarget:[parent window]];
+ if (dirsOnly)
+ [choose setAction:@selector(fileSelectorChooseDirsAction:)];
+ else
+ [choose setAction:@selector(fileSelectorChooseAction:)];
+
+ [choose release];
+# endif // !USE_IPHONE
+}
+
+
+# ifndef USE_IPHONE
+
+/* Runs a modal file selector and sets the text field's value to the
+ selected file or directory.
+ */
+static void
+do_file_selector (NSTextField *txt, BOOL dirs_p)
+{
+ NSOpenPanel *panel = [NSOpenPanel openPanel];
+ [panel setAllowsMultipleSelection:NO];
+ [panel setCanChooseFiles:!dirs_p];
+ [panel setCanChooseDirectories:dirs_p];
+
+ NSInteger result = [panel runModal];
+ if (result == NSOKButton) {
+ NSArray *files = [panel URLs];
+ NSString *file = ([files count] > 0 ? [[files objectAtIndex:0] path] : @"");
+ file = [file stringByAbbreviatingWithTildeInPath];
+ [txt setStringValue:file];
+
+ // Fuck me! Just setting the value of the NSTextField does not cause
+ // that to end up in the preferences!
+ //
+ NSDictionary *dict = [txt infoForBinding:@"value"];
+ NSUserDefaultsController *prefs = [dict objectForKey:@"NSObservedObject"];
+ NSString *path = [dict objectForKey:@"NSObservedKeyPath"];
+ if ([path hasPrefix:@"values."]) // WTF.
+ path = [path substringFromIndex:7];
+ [[prefs values] setValue:file forKey:path];
+ }
+}
+
+
+/* Returns the NSTextField that is to the left of or above the NSButton.
+ */
+static NSTextField *
+find_text_field_of_button (NSButton *button)
+{
+ NSView *parent = [button superview];
+ NSArray *kids = [parent subviews];
+ NSUInteger nkids = [kids count];
+ int i;
+ NSTextField *f = 0;
+ for (i = 0; i < nkids; i++) {
+ NSObject *kid = [kids objectAtIndex:i];
+ if ([kid isKindOfClass:[NSTextField class]]) {
+ f = (NSTextField *) kid;
+ } else if (kid == button) {
+ if (! f) abort();
+ return f;
+ }
+ }
+ abort();
+}
+
+
+- (void) fileSelectorChooseAction:(NSObject *)arg
+{
+ NSButton *choose = (NSButton *) arg;
+ NSTextField *txt = find_text_field_of_button (choose);
+ do_file_selector (txt, NO);
+}
+
+- (void) fileSelectorChooseDirsAction:(NSObject *)arg
+{
+ NSButton *choose = (NSButton *) arg;
+ NSTextField *txt = find_text_field_of_button (choose);
+ do_file_selector (txt, YES);
+}
+
+#endif // !USE_IPHONE
+
+
+- (void) makeTextLoaderControlBox:(NSXMLNode *)node on:(NSView *)parent
+{
+# ifndef USE_IPHONE
+ /*
+ Display Text:
+ (x) Computer name and time
+ ( ) Text [__________________________]
+ ( ) Text file [_________________] [Choose]
+ ( ) URL [__________________________]
+ ( ) Shell Cmd [__________________________]
+
+ textMode -text-mode date
+ textMode -text-mode literal textLiteral -text-literal %
+ textMode -text-mode file textFile -text-file %
+ textMode -text-mode url textURL -text-url %
+ textMode -text-mode program textProgram -text-program %
+ */
+ NSRect rect;
+ rect.size.width = rect.size.height = 1;
+ rect.origin.x = rect.origin.y = 0;
+ NSView *group = [[NSView alloc] initWithFrame:rect];
+ NSView *rgroup = [[NSView alloc] initWithFrame:rect];
+
+ Bool program_p = TRUE;
+
+
+ NSView *control;
+
+ // This is how you link radio buttons together.
+ //
+ NSButtonCell *proto = [[NSButtonCell alloc] init];
+ [proto setButtonType:NSRadioButton];
+
+ rect.origin.x = rect.origin.y = 0;
+ rect.size.width = rect.size.height = 10;
+ NSMatrix *matrix = [[NSMatrix alloc]
+ initWithFrame:rect
+ mode:NSRadioModeMatrix
+ prototype:proto
+ numberOfRows: 4 + (program_p ? 1 : 0)
+ numberOfColumns:1];
+ [matrix setAllowsEmptySelection:NO];
+
+ NSArrayController *cnames = [[NSArrayController alloc] initWithContent:nil];
+ [cnames addObject:@"Computer name and time"];
+ [cnames addObject:@"Text"];
+ [cnames addObject:@"File"];
+ [cnames addObject:@"URL"];
+ if (program_p) [cnames addObject:@"Shell Cmd"];
+ [matrix bind:@"content"
+ toObject:cnames
+ withKeyPath:@"arrangedObjects"
+ options:nil];
+ [cnames release];
+
+ [self bindSwitch:matrix cmdline:@"-text-mode %"];
+
+ [self placeChild:matrix on:group];
+ [self placeChild:rgroup on:group right:YES];
+ [proto release];
+ [matrix release];
+ [rgroup release];
+
+ NSXMLNode *node2;
+
+# else // USE_IPHONE
+
+ NSView *rgroup = parent;
+ NSXMLNode *node2;
+
+ // <select id="textMode">
+ // <option id="date" _label="Display date" arg-set="-text-mode date"/>
+ // <option id="text" _label="Display text" arg-set="-text-mode literal"/>
+ // <option id="url" _label="Display URL"/>
+ // </select>
+
+ node2 = [[NSXMLElement alloc] initWithName:@"select"];
+ [node2 setAttributesAsDictionary:@{ @"id": @"textMode" }];
+
+ NSXMLNode *node3 = [[NSXMLElement alloc] initWithName:@"option"];
+ [node3 setAttributesAsDictionary:
+ @{ @"id": @"date",
+ @"arg-set": @"-text-mode date",
+ @"_label": @"Display the date and time" }];
+ [node3 setParent: node2];
+ [node3 autorelease];
+
+ node3 = [[NSXMLElement alloc] initWithName:@"option"];
+ [node3 setAttributesAsDictionary:
+ @{ @"id": @"text",
+ @"arg-set": @"-text-mode literal",
+ @"_label": @"Display static text" }];
+ [node3 setParent: node2];
+ [node3 autorelease];
+
+ node3 = [[NSXMLElement alloc] initWithName:@"option"];
+ [node3 setAttributesAsDictionary:
+ @{ @"id": @"url",
+ @"_label": @"Display the contents of a URL" }];
+ [node3 setParent: node2];
+ [node3 autorelease];
+
+ [self makeOptionMenu:node2 on:rgroup];
+ [node2 release];
+
+# endif // USE_IPHONE
+
+
+ // <string id="textLiteral" _label="" arg-set="-text-literal %"/>
+ node2 = [[NSXMLElement alloc] initWithName:@"string"];
+ [node2 setAttributesAsDictionary:
+ @{ @"id": @"textLiteral",
+ @"arg": @"-text-literal %",
+# ifdef USE_IPHONE
+ @"_label": @"Text to display"
+# endif
+ }];
+ [self makeTextField:node2 on:rgroup
+# ifndef USE_IPHONE
+ withLabel:NO
+# else
+ withLabel:YES
+# endif
+ horizontal:NO];
+ [node2 release];
+
+// rect = [last_child(rgroup) frame];
+
+/* // trying to make the text fields be enabled only when the checkbox is on..
+ control = last_child (rgroup);
+ [control bind:@"enabled"
+ toObject:[matrix cellAtRow:1 column:0]
+ withKeyPath:@"value"
+ options:nil];
+ */
+
+
+# ifndef USE_IPHONE
+ // <file id="textFile" _label="" arg-set="-text-file %"/>
+ node2 = [[NSXMLElement alloc] initWithName:@"string"];
+ [node2 setAttributesAsDictionary:
+ @{ @"id": @"textFile",
+ @"arg": @"-text-file %" }];
+ [self makeFileSelector:node2 on:rgroup
+ dirsOnly:NO withLabel:NO editable:NO];
+ [node2 release];
+# endif // !USE_IPHONE
+
+// rect = [last_child(rgroup) frame];
+
+ // <string id="textURL" _label="" arg-set="text-url %"/>
+ node2 = [[NSXMLElement alloc] initWithName:@"string"];
+ [node2 setAttributesAsDictionary:
+ @{ @"id": @"textURL",
+ @"arg": @"-text-url %",
+# ifdef USE_IPHONE
+ @"_label": @"URL to display",
+# endif
+ }];
+ [self makeTextField:node2 on:rgroup
+# ifndef USE_IPHONE
+ withLabel:NO
+# else
+ withLabel:YES
+# endif
+ horizontal:NO];
+ [node2 release];
+
+// rect = [last_child(rgroup) frame];
+
+# ifndef USE_IPHONE
+ if (program_p) {
+ // <string id="textProgram" _label="" arg-set="text-program %"/>
+ node2 = [[NSXMLElement alloc] initWithName:@"string"];
+ [node2 setAttributesAsDictionary:
+ @{ @"id": @"textProgram",
+ @"arg": @"-text-program %",
+ }];
+ [self makeTextField:node2 on:rgroup withLabel:NO horizontal:NO];
+ [node2 release];
+ }
+
+// rect = [last_child(rgroup) frame];
+
+ layout_group (rgroup, NO);
+
+ rect = [rgroup frame];
+ rect.size.width += 35; // WTF? Why is rgroup too narrow?
+ [rgroup setFrame:rect];
+
+
+ // Set the height of the cells in the radio-box matrix to the height of
+ // the (last of the) text fields.
+ control = last_child (rgroup);
+ rect = [control frame];
+ rect.size.width = 30; // width of the string "Text", plus a bit...
+ if (program_p)
+ rect.size.width += 25;
+ rect.size.height += LINE_SPACING;
+ [matrix setCellSize:rect.size];
+ [matrix sizeToCells];
+
+ layout_group (group, YES);
+ rect = [matrix frame];
+ rect.origin.x += rect.size.width + COLUMN_SPACING;
+ rect.origin.y -= [control frame].size.height - LINE_SPACING;
+ [rgroup setFrameOrigin:rect.origin];
+
+ // now cheat on the size of the matrix: allow it to overlap (underlap)
+ // the text fields.
+ //
+ rect.size = [matrix cellSize];
+ rect.size.width = 300;
+ [matrix setCellSize:rect.size];
+ [matrix sizeToCells];
+
+ // Cheat on the position of the stuff on the right (the rgroup).
+ // GAAAH, this code is such crap!
+ rect = [rgroup frame];
+ rect.origin.y -= 5;
+ [rgroup setFrame:rect];
+
+
+ rect.size.width = rect.size.height = 0;
+ NSBox *box = [[NSBox alloc] initWithFrame:rect];
+ [box setTitlePosition:NSAtTop];
+ [box setBorderType:NSBezelBorder];
+ [box setTitle:@"Display Text"];
+
+ rect.size.width = rect.size.height = 12;
+ [box setContentViewMargins:rect.size];
+ [box setContentView:group];
+ [box sizeToFit];
+
+ [self placeChild:box on:parent];
+ [group release];
+ [box release];
+
+# endif // !USE_IPHONE
+}
+
+
+- (void) makeImageLoaderControlBox:(NSXMLNode *)node on:(NSView *)parent
+{
+ /*
+ [x] Grab desktop images
+ [ ] Choose random image:
+ [__________________________] [Choose]
+
+ <boolean id="grabDesktopImages" _label="Grab desktop images"
+ arg-unset="-no-grab-desktop"/>
+ <boolean id="chooseRandomImages" _label="Grab desktop images"
+ arg-unset="-choose-random-images"/>
+ <file id="imageDirectory" _label="" arg-set="-image-directory %"/>
+ */
+
+ NSXMLElement *node2;
+
+# ifndef USE_IPHONE
+# define SCREENS "Grab desktop images"
+# define PHOTOS "Choose random images"
+# else
+# define SCREENS "Grab screenshots"
+# define PHOTOS "Use photo library"
+# endif
+
+ node2 = [[NSXMLElement alloc] initWithName:@"boolean"];
+ [node2 setAttributesAsDictionary:
+ @{ @"id": @"grabDesktopImages",
+ @"_label": @ SCREENS,
+ @"arg-unset": @"-no-grab-desktop",
+ }];
+ [self makeCheckbox:node2 on:parent];
+ [node2 release];
+
+ node2 = [[NSXMLElement alloc] initWithName:@"boolean"];
+ [node2 setAttributesAsDictionary:
+ @{ @"id": @"chooseRandomImages",
+ @"_label": @ PHOTOS,
+ @"arg-set": @"-choose-random-images",
+ }];
+ [self makeCheckbox:node2 on:parent];
+ [node2 release];
+
+ node2 = [[NSXMLElement alloc] initWithName:@"string"];
+ [node2 setAttributesAsDictionary:
+ @{ @"id": @"imageDirectory",
+ @"_label": @"Images from:",
+ @"arg": @"-image-directory %",
+ }];
+ [self makeFileSelector:node2 on:parent
+ dirsOnly:YES withLabel:YES editable:YES];
+ [node2 release];
+
+# undef SCREENS
+# undef PHOTOS
+
+# ifndef USE_IPHONE
+ // Add a second, explanatory label below the file/URL selector.
+
+ LABEL *lab2 = 0;
+ lab2 = [self makeLabel:@"(Local folder, or URL of RSS or Atom feed)"];
+ [self placeChild:lab2 on:parent];
+
+ // Pack it in a little tighter vertically.
+ NSRect r2 = [lab2 frame];
+ r2.origin.x += 20;
+ r2.origin.y += 14;
+ [lab2 setFrameOrigin:r2.origin];
+# endif // USE_IPHONE
+}
+
+
+- (void) makeUpdaterControlBox:(NSXMLNode *)node on:(NSView *)parent
+{
+# ifndef USE_IPHONE
+ /*
+ [x] Check for Updates [ Monthly ]
+
+ <hgroup>
+ <boolean id="automaticallyChecksForUpdates"
+ _label="Automatically check for updates"
+ arg-unset="-no-automaticallyChecksForUpdates" />
+ <select id="updateCheckInterval">
+ <option="hourly" _label="Hourly" arg-set="-updateCheckInterval 3600"/>
+ <option="daily" _label="Daily" arg-set="-updateCheckInterval 86400"/>
+ <option="weekly" _label="Weekly" arg-set="-updateCheckInterval 604800"/>
+ <option="monthly" _label="Monthly" arg-set="-updateCheckInterval 2629800"/>
+ </select>
+ </hgroup>
+ */
+
+ // <hgroup>
+
+ NSRect rect;
+ rect.size.width = rect.size.height = 1;
+ rect.origin.x = rect.origin.y = 0;
+ NSView *group = [[NSView alloc] initWithFrame:rect];
+
+ NSXMLElement *node2;
+
+ // <boolean ...>
+
+ node2 = [[NSXMLElement alloc] initWithName:@"boolean"];
+ [node2 setAttributesAsDictionary:
+ @{ @"id": @SUSUEnableAutomaticChecksKey,
+ @"_label": @"Automatically check for updates",
+ @"arg-unset": @"-no-" SUSUEnableAutomaticChecksKey,
+ }];
+ [self makeCheckbox:node2 on:group];
+ [node2 release];
+
+ // <select ...>
+
+ node2 = [[NSXMLElement alloc] initWithName:@"select"];
+ [node2 setAttributesAsDictionary:
+ @{ @"id": @SUScheduledCheckIntervalKey }];
+
+ // <option ...>
+
+ NSXMLNode *node3 = [[NSXMLElement alloc] initWithName:@"option"];
+ [node3 setAttributesAsDictionary:
+ @{ @"id": @"hourly",
+ @"arg-set": @"-" SUScheduledCheckIntervalKey " 3600",
+ @"_label": @"Hourly" }];
+ [node3 setParent: node2];
+ [node3 autorelease];
+
+ node3 = [[NSXMLElement alloc] initWithName:@"option"];
+ [node3 setAttributesAsDictionary:
+ @{ @"id": @"daily",
+ @"arg-set": @"-" SUScheduledCheckIntervalKey " 86400",
+ @"_label": @"Daily" }];
+ [node3 setParent: node2];
+ [node3 autorelease];
+
+ node3 = [[NSXMLElement alloc] initWithName:@"option"];
+ [node3 setAttributesAsDictionary:
+ @{ @"id": @"weekly",
+ // @"arg-set": @"-" SUScheduledCheckIntervalKey " 604800",
+ @"_label": @"Weekly",
+ }];
+ [node3 setParent: node2];
+ [node3 autorelease];
+
+ node3 = [[NSXMLElement alloc] initWithName:@"option"];
+ [node3 setAttributesAsDictionary:
+ @{ @"id": @"monthly",
+ @"arg-set": @"-" SUScheduledCheckIntervalKey " 2629800",
+ @"_label": @"Monthly",
+ }];
+ [node3 setParent: node2];
+ [node3 autorelease];
+
+ // </option>
+ [self makeOptionMenu:node2 on:group];
+ [node2 release];
+
+ // </hgroup>
+ layout_group (group, TRUE);
+
+ rect.size.width = rect.size.height = 0;
+ NSBox *box = [[NSBox alloc] initWithFrame:rect];
+ [box setTitlePosition:NSNoTitle];
+ [box setBorderType:NSNoBorder];
+ [box setContentViewMargins:rect.size];
+ [box setContentView:group];
+ [box sizeToFit];
+
+ [self placeChild:box on:parent];
+
+ [group release];
+ [box release];
+
+# endif // !USE_IPHONE
+}
+
+
+#pragma mark Layout for controls
+
+
+# ifndef USE_IPHONE
+static NSView *
+last_child (NSView *parent)
+{
+ NSArray *kids = [parent subviews];
+ NSUInteger nkids = [kids count];
+ if (nkids == 0)
+ return 0;
+ else
+ return [kids objectAtIndex:nkids-1];
+}
+#endif // USE_IPHONE
+
+
+/* Add the child as a subview of the parent, positioning it immediately
+ below or to the right of the previously-added child of that view.
+ */
+- (void) placeChild:
+# ifdef USE_IPHONE
+ (NSObject *)child
+# else
+ (NSView *)child
+# endif
+ on:(NSView *)parent right:(BOOL)right_p
+{
+# ifndef USE_IPHONE
+ NSRect rect = [child frame];
+ NSView *last = last_child (parent);
+ if (!last) {
+ rect.origin.x = LEFT_MARGIN;
+ rect.origin.y = ([parent frame].size.height - rect.size.height
+ - LINE_SPACING);
+ } else if (right_p) {
+ rect = [last frame];
+ rect.origin.x += rect.size.width + COLUMN_SPACING;
+ } else {
+ rect = [last frame];
+ rect.origin.x = LEFT_MARGIN;
+ rect.origin.y -= [child frame].size.height + LINE_SPACING;
+ }
+ NSRect r = [child frame];
+ r.origin = rect.origin;
+ [child setFrame:r];
+ [parent addSubview:child];
+
+# else // USE_IPHONE
+
+ /* Controls is an array of arrays of the controls, divided into sections.
+ Each hgroup / vgroup gets a nested array, too, e.g.:
+
+ [ [ [ <label>, <checkbox> ],
+ [ <label>, <checkbox> ],
+ [ <label>, <checkbox> ] ],
+ [ <label>, <text-field> ],
+ [ <label>, <low-label>, <slider>, <high-label> ],
+ [ <low-label>, <slider>, <high-label> ],
+ <HTML-label>
+ ];
+
+ If an element begins with a label, it is terminal, otherwise it is a
+ group. There are (currently) never more than 4 elements in a single
+ terminal element.
+
+ A blank vertical spacer is placed between each hgroup / vgroup,
+ by making each of those a new section in the TableView.
+ */
+ if (! controls)
+ controls = [[NSMutableArray arrayWithCapacity:10] retain];
+ if ([controls count] == 0)
+ [controls addObject: [NSMutableArray arrayWithCapacity:10]];
+ NSMutableArray *current = [controls objectAtIndex:[controls count]-1];
+
+ if (!right_p || [current count] == 0) {
+ // Nothing on the current line. Add this object.
+ [current addObject: child];
+ } else {
+ // Something's on the current line already.
+ NSObject *old = [current objectAtIndex:[current count]-1];
+ if ([old isKindOfClass:[NSMutableArray class]]) {
+ // Already an array in this cell. Append.
+ NSAssert ([(NSArray *) old count] < 4, @"internal error");
+ [(NSMutableArray *) old addObject: child];
+ } else {
+ // Replace the control in this cell with an array, then append
+ NSMutableArray *a = [NSMutableArray arrayWithObjects: old, child, nil];
+ [current replaceObjectAtIndex:[current count]-1 withObject:a];
+ }
+ }
+# endif // USE_IPHONE
+}
+
+
+- (void) placeChild:(NSView *)child on:(NSView *)parent
+{
+ [self placeChild:child on:parent right:NO];
+}
+
+
+#ifdef USE_IPHONE
+
+// Start putting subsequent children in a new group, to create a new
+// section on the UITableView.
+//
+- (void) placeSeparator
+{
+ if (! controls) return;
+ if ([controls count] == 0) return;
+ if ([[controls objectAtIndex:[controls count]-1]
+ count] > 0)
+ [controls addObject: [NSMutableArray arrayWithCapacity:10]];
+}
+#endif // USE_IPHONE
+
+
+
+/* Creates an invisible NSBox (for layout purposes) to enclose the widgets
+ wrapped in <hgroup> or <vgroup> in the XML.
+ */
+- (void) makeGroup:(NSXMLNode *)node
+ on:(NSView *)parent
+ horizontal:(BOOL) horiz_p
+{
+# ifdef USE_IPHONE
+ if (!horiz_p) [self placeSeparator];
+ [self traverseChildren:node on:parent];
+ if (!horiz_p) [self placeSeparator];
+# else // !USE_IPHONE
+ NSRect rect;
+ rect.size.width = rect.size.height = 1;
+ rect.origin.x = rect.origin.y = 0;
+ NSView *group = [[NSView alloc] initWithFrame:rect];
+ [self traverseChildren:node on:group];
+
+ layout_group (group, horiz_p);
+
+ rect.size.width = rect.size.height = 0;
+ NSBox *box = [[NSBox alloc] initWithFrame:rect];
+ [box setTitlePosition:NSNoTitle];
+ [box setBorderType:NSNoBorder];
+ [box setContentViewMargins:rect.size];
+ [box setContentView:group];
+ [box sizeToFit];
+
+ [self placeChild:box on:parent];
+ [group release];
+ [box release];
+# endif // !USE_IPHONE
+}
+
+
+#ifndef USE_IPHONE
+static void
+layout_group (NSView *group, BOOL horiz_p)
+{
+ NSArray *kids = [group subviews];
+ NSUInteger nkids = [kids count];
+ NSUInteger i;
+ double maxx = 0, miny = 0;
+ for (i = 0; i < nkids; i++) {
+ NSView *kid = [kids objectAtIndex:i];
+ NSRect r = [kid frame];
+
+ if (horiz_p) {
+ maxx += r.size.width + COLUMN_SPACING;
+ if (r.size.height > -miny) miny = -r.size.height;
+ } else {
+ if (r.size.width > maxx) maxx = r.size.width;
+ miny = r.origin.y - r.size.height;
+ }
+ }
+
+ NSRect rect;
+ rect.origin.x = 0;
+ rect.origin.y = 0;
+ rect.size.width = maxx;
+ rect.size.height = -miny;
+ [group setFrame:rect];
+
+ double x = 0;
+ for (i = 0; i < nkids; i++) {
+ NSView *kid = [kids objectAtIndex:i];
+ NSRect r = [kid frame];
+ if (horiz_p) {
+ r.origin.y = rect.size.height - r.size.height;
+ r.origin.x = x;
+ x += r.size.width + COLUMN_SPACING;
+ } else {
+ r.origin.y -= miny;
+ }
+ [kid setFrame:r];
+ }
+}
+#endif // !USE_IPHONE
+
+
+/* Create some kind of control corresponding to the given XML node.
+ */
+-(void)makeControl:(NSXMLNode *)node on:(NSView *)parent
+{
+ NSString *name = [node name];
+
+ if ([node kind] == NSXMLCommentKind)
+ return;
+
+ if ([node kind] == NSXMLTextKind) {
+ NSString *s = [(NSString *) [node objectValue]
+ stringByTrimmingCharactersInSet:
+ [NSCharacterSet whitespaceAndNewlineCharacterSet]];
+ if (! [s isEqualToString:@""]) {
+ NSAssert1 (0, @"unexpected text: %@", s);
+ }
+ return;
+ }
+
+ if ([node kind] != NSXMLElementKind) {
+ NSAssert2 (0, @"weird XML node kind: %d: %@", (int)[node kind], node);
+ return;
+ }
+
+ if ([name isEqualToString:@"hgroup"] ||
+ [name isEqualToString:@"vgroup"]) {
+
+ [self makeGroup:node on:parent
+ horizontal:[name isEqualToString:@"hgroup"]];
+
+ } else if ([name isEqualToString:@"command"]) {
+ // do nothing: this is the "-root" business
+
+ } else if ([name isEqualToString:@"video"]) {
+ // ignored
+
+ } else if ([name isEqualToString:@"boolean"]) {
+ [self makeCheckbox:node on:parent];
+
+ } else if ([name isEqualToString:@"string"]) {
+ [self makeTextField:node on:parent withLabel:NO horizontal:NO];
+
+ } else if ([name isEqualToString:@"file"]) {
+ [self makeFileSelector:node on:parent
+ dirsOnly:NO withLabel:YES editable:NO];
+
+ } else if ([name isEqualToString:@"number"]) {
+ [self makeNumberSelector:node on:parent];
+
+ } else if ([name isEqualToString:@"select"]) {
+ [self makeOptionMenu:node on:parent];
+
+ } else if ([name isEqualToString:@"_description"]) {
+ [self makeDescLabel:node on:parent];
+
+ } else if ([name isEqualToString:@"xscreensaver-text"]) {
+ [self makeTextLoaderControlBox:node on:parent];
+
+ } else if ([name isEqualToString:@"xscreensaver-image"]) {
+ [self makeImageLoaderControlBox:node on:parent];
+
+ } else if ([name isEqualToString:@"xscreensaver-updater"]) {
+ [self makeUpdaterControlBox:node on:parent];
+
+ } else {
+ NSAssert1 (0, @"unknown tag: %@", name);
+ }
+}
+
+
+/* Iterate over and process the children of this XML node.
+ */
+- (void)traverseChildren:(NSXMLNode *)node on:(NSView *)parent
+{
+ NSArray *children = [node children];
+ NSUInteger i, count = [children count];
+ for (i = 0; i < count; i++) {
+ NSXMLNode *child = [children objectAtIndex:i];
+ [self makeControl:child on:parent];
+ }
+}
+
+
+# ifndef USE_IPHONE
+
+/* Kludgey magic to make the window enclose the controls we created.
+ */
+static void
+fix_contentview_size (NSView *parent)
+{
+ NSRect f;
+ NSArray *kids = [parent subviews];
+ NSUInteger nkids = [kids count];
+ NSView *text = 0; // the NSText at the bottom of the window
+ double maxx = 0, miny = 0;
+ NSUInteger i;
+
+ /* Find the size of the rectangle taken up by each of the children
+ except the final "NSText" child.
+ */
+ for (i = 0; i < nkids; i++) {
+ NSView *kid = [kids objectAtIndex:i];
+ if ([kid isKindOfClass:[NSText class]]) {
+ text = kid;
+ continue;
+ }
+ f = [kid frame];
+ if (f.origin.x + f.size.width > maxx) maxx = f.origin.x + f.size.width;
+ if (f.origin.y - f.size.height < miny) miny = f.origin.y;
+// NSLog(@"start: %3.0f x %3.0f @ %3.0f %3.0f %3.0f %@",
+// f.size.width, f.size.height, f.origin.x, f.origin.y,
+// f.origin.y + f.size.height, [kid class]);
+ }
+
+ if (maxx < 400) maxx = 400; // leave room for the NSText paragraph...
+
+ /* Now that we know the width of the window, set the width of the NSText to
+ that, so that it can decide what its height needs to be.
+ */
+ if (! text) abort();
+ f = [text frame];
+// NSLog(@"text old: %3.0f x %3.0f @ %3.0f %3.0f %3.0f %@",
+// f.size.width, f.size.height, f.origin.x, f.origin.y,
+// f.origin.y + f.size.height, [text class]);
+
+ // set the NSText's width (this changes its height).
+ f.size.width = maxx - LEFT_MARGIN;
+ [text setFrame:f];
+
+ // position the NSText below the last child (this gives us a new miny).
+ f = [text frame];
+ f.origin.y = miny - f.size.height - LINE_SPACING;
+ miny = f.origin.y - LINE_SPACING;
+ [text setFrame:f];
+
+ // Lock the width of the field and unlock the height, and let it resize
+ // once more, to compute the proper height of the text for that width.
+ //
+ [(NSText *) text setHorizontallyResizable:NO];
+ [(NSText *) text setVerticallyResizable:YES];
+ [(NSText *) text sizeToFit];
+
+ // Now lock the height too: no more resizing this text field.
+ //
+ [(NSText *) text setVerticallyResizable:NO];
+
+ // Now reposition the top edge of the text field to be back where it
+ // was before we changed the height.
+ //
+ float oh = f.size.height;
+ f = [text frame];
+ float dh = f.size.height - oh;
+ f.origin.y += dh;
+
+ // #### This is needed in OSX 10.5, but is wrong in OSX 10.6. WTF??
+ // If we do this in 10.6, the text field moves down, off the window.
+ // So instead we repair it at the end, at the "WTF2" comment.
+ [text setFrame:f];
+
+ // Also adjust the parent height by the change in height of the text field.
+ miny -= dh;
+
+// NSLog(@"text new: %3.0f x %3.0f @ %3.0f %3.0f %3.0f %@",
+// f.size.width, f.size.height, f.origin.x, f.origin.y,
+// f.origin.y + f.size.height, [text class]);
+
+
+ /* Set the contentView to the size of the children.
+ */
+ f = [parent frame];
+// float yoff = f.size.height;
+ f.size.width = maxx + LEFT_MARGIN;
+ f.size.height = -(miny - LEFT_MARGIN*2);
+// yoff = f.size.height - yoff;
+ [parent setFrame:f];
+
+// NSLog(@"max: %3.0f x %3.0f @ %3.0f %3.0f",
+// f.size.width, f.size.height, f.origin.x, f.origin.y);
+
+ /* Now move all of the kids up into the window.
+ */
+ f = [parent frame];
+ float shift = f.size.height;
+// NSLog(@"shift: %3.0f", shift);
+ for (i = 0; i < nkids; i++) {
+ NSView *kid = [kids objectAtIndex:i];
+ f = [kid frame];
+ f.origin.y += shift;
+ [kid setFrame:f];
+// NSLog(@"move: %3.0f x %3.0f @ %3.0f %3.0f %3.0f %@",
+// f.size.width, f.size.height, f.origin.x, f.origin.y,
+// f.origin.y + f.size.height, [kid class]);
+ }
+
+/*
+ Bad:
+ parent: 420 x 541 @ 0 0
+ text: 380 x 100 @ 20 22 miny=-501
+
+ Good:
+ parent: 420 x 541 @ 0 0
+ text: 380 x 100 @ 20 50 miny=-501
+ */
+
+ // #### WTF2: See "WTF" above. If the text field is off the screen,
+ // move it up. We need this on 10.6 but not on 10.5. Auugh.
+ //
+ f = [text frame];
+ if (f.origin.y < 50) { // magic numbers, yay
+ f.origin.y = 50;
+ [text setFrame:f];
+ }
+
+ /* Set the kids to track the top left corner of the window when resized.
+ Set the NSText to track the bottom right corner as well.
+ */
+ for (i = 0; i < nkids; i++) {
+ NSView *kid = [kids objectAtIndex:i];
+ unsigned long mask = NSViewMaxXMargin | NSViewMinYMargin;
+ if ([kid isKindOfClass:[NSText class]])
+ mask |= NSViewWidthSizable|NSViewHeightSizable;
+ [kid setAutoresizingMask:mask];
+ }
+}
+# endif // !USE_IPHONE
+
+
+
+#ifndef USE_IPHONE
+static NSView *
+wrap_with_buttons (NSWindow *window, NSView *panel)
+{
+ NSRect rect;
+
+ // Make a box to hold the buttons at the bottom of the window.
+ //
+ rect = [panel frame];
+ rect.origin.x = rect.origin.y = 0;
+ rect.size.height = 10;
+ NSBox *bbox = [[NSBox alloc] initWithFrame:rect];
+ [bbox setTitlePosition:NSNoTitle];
+ [bbox setBorderType:NSNoBorder];
+
+ // Make some buttons: Default, Cancel, OK
+ //
+ rect.origin.x = rect.origin.y = 0;
+ rect.size.width = rect.size.height = 10;
+ NSButton *reset = [[NSButton alloc] initWithFrame:rect];
+ [reset setTitle:@"Reset to Defaults"];
+ [reset setBezelStyle:NSRoundedBezelStyle];
+ [reset sizeToFit];
+
+ rect = [reset frame];
+ NSButton *ok = [[NSButton alloc] initWithFrame:rect];
+ [ok setTitle:@"OK"];
+ [ok setBezelStyle:NSRoundedBezelStyle];
+ [ok sizeToFit];
+ rect = [bbox frame];
+ rect.origin.x = rect.size.width - [ok frame].size.width;
+ [ok setFrameOrigin:rect.origin];
+
+ rect = [ok frame];
+ NSButton *cancel = [[NSButton alloc] initWithFrame:rect];
+ [cancel setTitle:@"Cancel"];
+ [cancel setBezelStyle:NSRoundedBezelStyle];
+ [cancel sizeToFit];
+ rect.origin.x -= [cancel frame].size.width + 10;
+ [cancel setFrameOrigin:rect.origin];
+
+ // Bind OK to RET and Cancel to ESC.
+ [ok setKeyEquivalent:@"\r"];
+ [cancel setKeyEquivalent:@"\e"];
+
+ // The correct width for OK and Cancel buttons is 68 pixels
+ // ("Human Interface Guidelines: Controls: Buttons:
+ // Push Button Specifications").
+ //
+ rect = [ok frame];
+ rect.size.width = 68;
+ [ok setFrame:rect];
+
+ rect = [cancel frame];
+ rect.size.width = 68;
+ [cancel setFrame:rect];
+
+ // It puts the buttons in the box or else it gets the hose again
+ //
+ [bbox addSubview:ok];
+ [bbox addSubview:cancel];
+ [bbox addSubview:reset];
+ [bbox sizeToFit];
+
+ // make a box to hold the button-box, and the preferences view
+ //
+ rect = [bbox frame];
+ rect.origin.y += rect.size.height;
+ NSBox *pbox = [[NSBox alloc] initWithFrame:rect];
+ [pbox setTitlePosition:NSNoTitle];
+ [pbox setBorderType:NSBezelBorder];
+
+ // Enforce a max height on the dialog, so that it's obvious to me
+ // (on a big screen) when the dialog will fall off the bottom of
+ // a small screen (e.g., 1024x768 laptop with a huge bottom dock).
+ {
+ NSRect f = [panel frame];
+ int screen_height = (768 // shortest "modern" Mac display
+ - 22 // menu bar
+ - 56 // System Preferences toolbar
+ - 140 // default magnified bottom dock icon
+ );
+ if (f.size.height > screen_height) {
+ NSLog(@"%@ height was %.0f; clipping to %d",
+ [panel class], f.size.height, screen_height);
+ f.size.height = screen_height;
+ [panel setFrame:f];
+ }
+ }
+
+ [pbox addSubview:panel];
+ [pbox addSubview:bbox];
+ [pbox sizeToFit];
+
+ [reset setAutoresizingMask:NSViewMaxXMargin];
+ [cancel setAutoresizingMask:NSViewMinXMargin];
+ [ok setAutoresizingMask:NSViewMinXMargin];
+ [bbox setAutoresizingMask:NSViewWidthSizable];
+
+ // grab the clicks
+ //
+ [ok setTarget:window];
+ [cancel setTarget:window];
+ [reset setTarget:window];
+ [ok setAction:@selector(okAction:)];
+ [cancel setAction:@selector(cancelAction:)];
+ [reset setAction:@selector(resetAction:)];
+
+ [bbox release];
+
+ return pbox;
+}
+#endif // !USE_IPHONE
+
+
+/* Iterate over and process the children of the root node of the XML document.
+ */
+- (void)traverseTree
+{
+# ifdef USE_IPHONE
+ NSView *parent = [self view];
+# else
+ NSWindow *parent = self;
+#endif
+ NSXMLNode *node = xml_root;
+
+ if (![[node name] isEqualToString:@"screensaver"]) {
+ NSAssert (0, @"top level node is not <xscreensaver>");
+ }
+
+ saver_name = [self parseXScreenSaverTag: node];
+ saver_name = [saver_name stringByReplacingOccurrencesOfString:@" "
+ withString:@""];
+ [saver_name retain];
+
+# ifndef USE_IPHONE
+
+ NSRect rect;
+ rect.origin.x = rect.origin.y = 0;
+ rect.size.width = rect.size.height = 1;
+
+ NSView *panel = [[NSView alloc] initWithFrame:rect];
+ [self traverseChildren:node on:panel];
+ fix_contentview_size (panel);
+
+ NSView *root = wrap_with_buttons (parent, panel);
+ [userDefaultsController setAppliesImmediately:NO];
+ [globalDefaultsController setAppliesImmediately:NO];
+
+ [panel setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable];
+
+ rect = [parent frameRectForContentRect:[root frame]];
+ [parent setFrame:rect display:NO];
+ [parent setMinSize:rect.size];
+
+ [parent setContentView:root];
+
+ [panel release];
+ [root release];
+
+# else // USE_IPHONE
+
+ CGRect r = [parent frame];
+ r.size = [[UIScreen mainScreen] bounds].size;
+ [parent setFrame:r];
+ [self traverseChildren:node on:parent];
+
+# endif // USE_IPHONE
+}
+
+
+- (void)parser:(NSXMLParser *)parser
+ didStartElement:(NSString *)elt
+ namespaceURI:(NSString *)ns
+ qualifiedName:(NSString *)qn
+ attributes:(NSDictionary *)attrs
+{
+ NSXMLElement *e = [[NSXMLElement alloc] initWithName:elt];
+ [e autorelease];
+ [e setKind:SimpleXMLElementKind];
+ [e setAttributesAsDictionary:attrs];
+ NSXMLElement *p = xml_parsing;
+ [e setParent:p];
+ xml_parsing = e;
+ if (! xml_root)
+ xml_root = xml_parsing;
+}
+
+- (void)parser:(NSXMLParser *)parser
+ didEndElement:(NSString *)elt
+ namespaceURI:(NSString *)ns
+ qualifiedName:(NSString *)qn
+{
+ NSXMLElement *p = xml_parsing;
+ if (! p) {
+ NSLog(@"extra close: %@", elt);
+ } else if (![[p name] isEqualToString:elt]) {
+ NSLog(@"%@ closed by %@", [p name], elt);
+ } else {
+ NSXMLElement *n = xml_parsing;
+ xml_parsing = [n parent];
+ }
+}
+
+
+- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
+{
+ NSXMLElement *e = [[NSXMLElement alloc] initWithName:@"text"];
+ [e setKind:SimpleXMLTextKind];
+ NSXMLElement *p = xml_parsing;
+ [e setParent:p];
+ [e setObjectValue: string];
+ [e autorelease];
+}
+
+
+# ifdef USE_IPHONE
+# ifdef USE_PICKER_VIEW
+
+#pragma mark UIPickerView delegate methods
+
+- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pv
+{
+ return 1; // Columns
+}
+
+- (NSInteger)pickerView:(UIPickerView *)pv
+ numberOfRowsInComponent:(NSInteger)column
+{
+ NSAssert (column == 0, @"weird column");
+ NSArray *a = [picker_values objectAtIndex: [pv tag]];
+ if (! a) return 0; // Too early?
+ return [a count];
+}
+
+- (CGFloat)pickerView:(UIPickerView *)pv
+ rowHeightForComponent:(NSInteger)column
+{
+ return FONT_SIZE;
+}
+
+- (CGFloat)pickerView:(UIPickerView *)pv
+ widthForComponent:(NSInteger)column
+{
+ NSAssert (column == 0, @"weird column");
+ NSArray *a = [picker_values objectAtIndex: [pv tag]];
+ if (! a) return 0; // Too early?
+
+ UIFont *f = [UIFont systemFontOfSize:[NSFont systemFontSize]];
+ CGFloat max = 0;
+ for (NSArray *a2 in a) {
+ NSString *s = [a2 objectAtIndex:0];
+ // #### sizeWithFont deprecated as of iOS 7; use boundingRectWithSize.
+ CGSize r = [s sizeWithFont:f];
+ if (r.width > max) max = r.width;
+ }
+
+ max *= 1.7; // WTF!!
+
+ if (max > 320)
+ max = 320;
+ else if (max < 120)
+ max = 120;
+
+ return max;
+
+}
+
+
+- (NSString *)pickerView:(UIPickerView *)pv
+ titleForRow:(NSInteger)row
+ forComponent:(NSInteger)column
+{
+ NSAssert (column == 0, @"weird column");
+ NSArray *a = [picker_values objectAtIndex: [pv tag]];
+ if (! a) return 0; // Too early?
+ a = [a objectAtIndex:row];
+ NSAssert (a, @"internal error");
+ return [a objectAtIndex:0];
+}
+
+# endif // USE_PICKER_VIEW
+
+
+#pragma mark UITableView delegate methods
+
+- (void) addResetButton
+{
+ [[self navigationItem]
+ setRightBarButtonItem: [[UIBarButtonItem alloc]
+ initWithTitle: @"Reset to Defaults"
+ style: UIBarButtonItemStylePlain
+ target:self
+ action:@selector(resetAction:)]];
+ NSString *s = saver_name;
+ if ([self view].frame.size.width > 320)
+ s = [s stringByAppendingString: @" Settings"];
+ [self navigationItem].title = s;
+}
+
+
+- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)o
+{
+ return YES;
+}
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tv {
+ // Number of vertically-stacked white boxes.
+ return [controls count];
+}
+
+- (NSInteger)tableView:(UITableView *)tableView
+ numberOfRowsInSection:(NSInteger)section
+{
+ // Number of lines in each vertically-stacked white box.
+ NSAssert (controls, @"internal error");
+ return [[controls objectAtIndex:section] count];
+}
+
+- (NSString *)tableView:(UITableView *)tv
+ titleForHeaderInSection:(NSInteger)section
+{
+ // Titles above each vertically-stacked white box.
+// if (section == 0)
+// return [saver_name stringByAppendingString:@" Settings"];
+ return nil;
+}
+
+
+- (CGFloat)tableView:(UITableView *)tv
+ heightForRowAtIndexPath:(NSIndexPath *)ip
+{
+ CGFloat h = 0;
+
+ NSView *ctl = [[controls objectAtIndex:[ip indexAtPosition:0]]
+ objectAtIndex:[ip indexAtPosition:1]];
+
+ if ([ctl isKindOfClass:[NSArray class]]) {
+ NSArray *set = (NSArray *) ctl;
+ switch ([set count]) {
+ case 4: // label + left/slider/right.
+ case 3: // left/slider/right.
+ h = FONT_SIZE * 3.0;
+ break;
+ case 2: // Checkboxes, or text fields.
+ h = FONT_SIZE * 2.4;
+ break;
+ }
+ } else if ([ctl isKindOfClass:[UILabel class]]) {
+ // Radio buttons in a multi-select list.
+ h = FONT_SIZE * 1.9;
+
+# ifdef USE_HTML_LABELS
+ } else if ([ctl isKindOfClass:[HTMLLabel class]]) {
+
+ HTMLLabel *t = (HTMLLabel *) ctl;
+ CGRect r = t.frame;
+ r.size.width = [tv frame].size.width;
+ r.size.width -= LEFT_MARGIN * 2;
+ [t setFrame:r];
+ [t sizeToFit];
+ r = t.frame;
+ h = r.size.height;
+# endif // USE_HTML_LABELS
+
+ } else { // Does this ever happen?
+ h = FONT_SIZE + LINE_SPACING * 2;
+ }
+
+ if (h <= 0) abort();
+ return h;
+}
+
+
+- (void)refreshTableView
+{
+ UITableView *tv = (UITableView *) [self view];
+ NSMutableArray *a = [NSMutableArray arrayWithCapacity:20];
+ NSInteger rows = [self numberOfSectionsInTableView:tv];
+ for (int i = 0; i < rows; i++) {
+ NSInteger cols = [self tableView:tv numberOfRowsInSection:i];
+ for (int j = 0; j < cols; j++) {
+ NSUInteger ip[2];
+ ip[0] = i;
+ ip[1] = j;
+ [a addObject: [NSIndexPath indexPathWithIndexes:ip length:2]];
+ }
+ }
+
+ [tv beginUpdates];
+ [tv reloadRowsAtIndexPaths:a withRowAnimation:UITableViewRowAnimationNone];
+ [tv endUpdates];
+
+ // Default opacity looks bad.
+ // #### Oh great, this only works *sometimes*.
+ UIView *v = [[self navigationItem] titleView];
+ [v setBackgroundColor:[[v backgroundColor] colorWithAlphaComponent:1]];
+}
+
+
+- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)o
+{
+ [NSTimer scheduledTimerWithTimeInterval: 0
+ target:self
+ selector:@selector(refreshTableView)
+ userInfo:nil
+ repeats:NO];
+}
+
+
+#ifndef USE_PICKER_VIEW
+
+- (void)updateRadioGroupCell:(UITableViewCell *)cell
+ button:(RadioButton *)b
+{
+ NSArray *item = [[b items] objectAtIndex: [b index]];
+ NSString *pref_key = [item objectAtIndex:1];
+ NSObject *pref_val = [item objectAtIndex:2];
+
+ NSObject *current = [[self controllerForKey:pref_key] objectForKey:pref_key];
+
+ // Convert them both to strings and compare those, so that
+ // we don't get screwed by int 1 versus string "1".
+ // Will boolean true/1 screw us here too?
+ //
+ NSString *pref_str = ([pref_val isKindOfClass:[NSString class]]
+ ? (NSString *) pref_val
+ : [(NSNumber *) pref_val stringValue]);
+ NSString *current_str = ([current isKindOfClass:[NSString class]]
+ ? (NSString *) current
+ : [(NSNumber *) current stringValue]);
+ BOOL match_p = [current_str isEqualToString:pref_str];
+
+ // NSLog(@"\"%@\" = \"%@\" | \"%@\" ", pref_key, pref_val, current_str);
+
+ if (match_p)
+ [cell setAccessoryType:UITableViewCellAccessoryCheckmark];
+ else
+ [cell setAccessoryType:UITableViewCellAccessoryNone];
+}
+
+
+- (void)tableView:(UITableView *)tv
+ didSelectRowAtIndexPath:(NSIndexPath *)ip
+{
+ RadioButton *ctl = [[controls objectAtIndex:[ip indexAtPosition:0]]
+ objectAtIndex:[ip indexAtPosition:1]];
+ if (! [ctl isKindOfClass:[RadioButton class]])
+ return;
+
+ [self radioAction:ctl];
+ [self refreshTableView];
+}
+
+
+#endif // !USE_PICKER_VIEW
+
+
+
+- (UITableViewCell *)tableView:(UITableView *)tv
+ cellForRowAtIndexPath:(NSIndexPath *)ip
+{
+ CGFloat ww = [tv frame].size.width;
+ CGFloat hh = [self tableView:tv heightForRowAtIndexPath:ip];
+
+ float os_version = [[[UIDevice currentDevice] systemVersion] floatValue];
+
+ // Width of the column of labels on the left.
+ CGFloat left_width = ww * 0.4;
+ CGFloat right_edge = ww - LEFT_MARGIN;
+
+ if (os_version < 7) // margins were wider on iOS 6.1
+ right_edge -= 10;
+
+ CGFloat max = FONT_SIZE * 12;
+ if (left_width > max) left_width = max;
+
+ NSView *ctl = [[controls objectAtIndex:[ip indexAtPosition:0]]
+ objectAtIndex:[ip indexAtPosition:1]];
+
+ if ([ctl isKindOfClass:[NSArray class]]) {
+ // This cell has a set of objects in it.
+ NSArray *set = (NSArray *) ctl;
+ switch ([set count]) {
+ case 2:
+ {
+ // With 2 elements, the first of the pair must be a label.
+ UILabel *label = (UILabel *) [set objectAtIndex: 0];
+ NSAssert ([label isKindOfClass:[UILabel class]], @"unhandled type");
+ ctl = [set objectAtIndex: 1];
+
+ CGRect r = [ctl frame];
+
+ if ([ctl isKindOfClass:[UISwitch class]]) { // Checkboxes.
+ r.size.width = 80; // Magic.
+ r.origin.x = right_edge - r.size.width + 30; // beats me
+
+ if (os_version < 7) // checkboxes were wider on iOS 6.1
+ r.origin.x -= 25;
+
+ } else {
+ r.origin.x = left_width; // Text fields, etc.
+ r.size.width = right_edge - r.origin.x;
+ }
+
+ r.origin.y = (hh - r.size.height) / 2; // Center vertically.
+ [ctl setFrame:r];
+
+ // Make a box and put the label and checkbox/slider into it.
+ r.origin.x = 0;
+ r.origin.y = 0;
+ r.size.width = ww;
+ r.size.height = hh;
+ NSView *box = [[UIView alloc] initWithFrame:r];
+ [box addSubview: ctl];
+
+ // Let the label make use of any space not taken up by the control.
+ r = [label frame];
+ r.origin.x = LEFT_MARGIN;
+ r.origin.y = 0;
+ r.size.width = [ctl frame].origin.x - r.origin.x;
+ r.size.height = hh;
+ [label setFrame:r];
+ [label setFont:[NSFont boldSystemFontOfSize: FONT_SIZE]];
+ [box addSubview: label];
+ [box autorelease];
+
+ ctl = box;
+ }
+ break;
+ case 3:
+ case 4:
+ {
+ // With 3 elements, 1 and 3 are labels.
+ // With 4 elements, 1, 2 and 4 are labels.
+ int i = 0;
+ UILabel *top = ([set count] == 4
+ ? [set objectAtIndex: i++]
+ : 0);
+ UILabel *left = [set objectAtIndex: i++];
+ NSView *mid = [set objectAtIndex: i++];
+ UILabel *right = [set objectAtIndex: i++];
+ NSAssert (!top || [top isKindOfClass:[UILabel class]], @"WTF");
+ NSAssert ( [left isKindOfClass:[UILabel class]], @"WTF");
+ NSAssert ( ![mid isKindOfClass:[UILabel class]], @"WTF");
+ NSAssert ( [right isKindOfClass:[UILabel class]], @"WTF");
+
+ // 3 elements: control at top of cell.
+ // 4 elements: center the control vertically.
+ CGRect r = [mid frame];
+ r.size.height = 32; // Unchangable height of the slider thumb.
+
+ // Center the slider between left_width and right_edge.
+# ifdef LABEL_ABOVE_SLIDER
+ r.origin.x = LEFT_MARGIN;
+# else
+ r.origin.x = left_width;
+# endif
+ r.origin.y = (hh - r.size.height) / 2;
+ r.size.width = right_edge - r.origin.x;
+ [mid setFrame:r];
+
+ if (top) {
+# ifdef LABEL_ABOVE_SLIDER
+ // Top label goes above, flush center/top.
+ r.origin.x = (ww - r.size.width) / 2;
+ r.origin.y = 4;
+ // #### sizeWithFont deprecated as of iOS 7; use boundingRectWithSize.
+ r.size = [[top text] sizeWithFont:[top font]
+ constrainedToSize:
+ CGSizeMake (ww - LEFT_MARGIN*2, 100000)
+ lineBreakMode:[top lineBreakMode]];
+# else // !LABEL_ABOVE_SLIDER
+ // Label goes on the left.
+ r.origin.x = LEFT_MARGIN;
+ r.origin.y = 0;
+ r.size.width = left_width - LEFT_MARGIN;
+ r.size.height = hh;
+# endif // !LABEL_ABOVE_SLIDER
+ [top setFrame:r];
+ }
+
+ // Left label goes under control, flush left/bottom.
+ left.frame = CGRectMake([mid frame].origin.x, hh - 4,
+ ww - LEFT_MARGIN*2, 100000);
+ [left sizeToFit];
+ r = left.frame;
+ r.origin.y -= r.size.height;
+ left.frame = r;
+
+ // Right label goes under control, flush right/bottom.
+ right.frame =
+ CGRectMake([mid frame].origin.x + [mid frame].size.width,
+ [left frame].origin.y, ww - LEFT_MARGIN*2, 1000000);
+ [right sizeToFit];
+ r = right.frame;
+ r.origin.x -= r.size.width;
+ right.frame = r;
+
+ // Make a box and put the labels and slider into it.
+ r.origin.x = 0;
+ r.origin.y = 0;
+ r.size.width = ww;
+ r.size.height = hh;
+ NSView *box = [[UIView alloc] initWithFrame:r];
+ if (top)
+ [box addSubview: top];
+ [box addSubview: left];
+ [box addSubview: right];
+ [box addSubview: mid];
+ [box autorelease];
+
+ ctl = box;
+ }
+ break;
+ default:
+ NSAssert (0, @"unhandled size");
+ }
+ } else { // A single view, not a pair.
+ CGRect r = [ctl frame];
+ r.origin.x = LEFT_MARGIN;
+ r.origin.y = 0;
+ r.size.width = right_edge - r.origin.x;
+ r.size.height = hh;
+ [ctl setFrame:r];
+ }
+
+ NSString *id = @"Cell";
+ UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:id];
+ if (!cell)
+ cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault
+ reuseIdentifier: id]
+ autorelease];
+
+ for (UIView *subview in [cell.contentView subviews])
+ [subview removeFromSuperview];
+ [cell.contentView addSubview: ctl];
+ CGRect r = [ctl frame];
+ r.origin.x = 0;
+ r.origin.y = 0;
+ [cell setFrame:r];
+ cell.selectionStyle = UITableViewCellSelectionStyleNone;
+ [cell setAccessoryType:UITableViewCellAccessoryNone];
+
+# ifndef USE_PICKER_VIEW
+ if ([ctl isKindOfClass:[RadioButton class]])
+ [self updateRadioGroupCell:cell button:(RadioButton *)ctl];
+# endif // USE_PICKER_VIEW
+
+ return cell;
+}
+# endif // USE_IPHONE
+
+
+/* When this object is instantiated, it parses the XML file and creates
+ controls on itself that are hooked up to the appropriate preferences.
+ The default size of the view is just big enough to hold them all.
+ */
+- (id)initWithXML: (NSData *) xml_data
+ options: (const XrmOptionDescRec *) _opts
+ controller: (NSUserDefaultsController *) _prefs
+ globalController: (NSUserDefaultsController *) _globalPrefs
+ defaults: (NSDictionary *) _defs
+{
+# ifndef USE_IPHONE
+ self = [super init];
+# else // !USE_IPHONE
+ self = [super initWithStyle:UITableViewStyleGrouped];
+ self.title = [saver_name stringByAppendingString:@" Settings"];
+# endif // !USE_IPHONE
+ if (! self) return 0;
+
+ // instance variables
+ opts = _opts;
+ defaultOptions = _defs;
+ userDefaultsController = [_prefs retain];
+ globalDefaultsController = [_globalPrefs retain];
+
+ NSXMLParser *xmlDoc = [[NSXMLParser alloc] initWithData:xml_data];
+
+ if (!xmlDoc) {
+ NSAssert1 (0, @"XML Error: %@",
+ [[NSString alloc] initWithData:xml_data
+ encoding:NSUTF8StringEncoding]);
+ return nil;
+ }
+ [xmlDoc setDelegate:self];
+ if (! [xmlDoc parse]) {
+ NSError *err = [xmlDoc parserError];
+ NSAssert2 (0, @"XML Error: %@: %@",
+ [[NSString alloc] initWithData:xml_data
+ encoding:NSUTF8StringEncoding],
+ err);
+ return nil;
+ }
+
+# ifndef USE_IPHONE
+ TextModeTransformer *t = [[TextModeTransformer alloc] init];
+ [NSValueTransformer setValueTransformer:t
+ forName:@"TextModeTransformer"];
+ [t release];
+# endif // USE_IPHONE
+
+ [self traverseTree];
+ xml_root = 0;
+
+# ifdef USE_IPHONE
+ [self addResetButton];
+# endif
+
+ return self;
+}
+
+
+- (void) dealloc
+{
+ [saver_name release];
+ [userDefaultsController release];
+ [globalDefaultsController release];
+# ifdef USE_IPHONE
+ [controls release];
+ [pref_keys release];
+ [pref_ctls release];
+# ifdef USE_PICKER_VIEW
+ [picker_values release];
+# endif
+# endif
+ [super dealloc];
+}
+
+@end
diff --git a/OSX/XScreenSaverDMG.icns b/OSX/XScreenSaverDMG.icns
new file mode 100644
index 0000000..2a38ebd
--- /dev/null
+++ b/OSX/XScreenSaverDMG.icns
Binary files differ
diff --git a/OSX/XScreenSaverFolder.icns b/OSX/XScreenSaverFolder.icns
new file mode 100644
index 0000000..66177f4
--- /dev/null
+++ b/OSX/XScreenSaverFolder.icns
Binary files differ
diff --git a/OSX/XScreenSaverGLView.h b/OSX/XScreenSaverGLView.h
new file mode 100644
index 0000000..a4d1ebf
--- /dev/null
+++ b/OSX/XScreenSaverGLView.h
@@ -0,0 +1,39 @@
+/* xscreensaver, Copyright (c) 2006-2016 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* This is a subclass of Apple's ScreenSaverView that knows how to run
+ xscreensaver programs without X11 via the dark magic of the "jwxyz"
+ library. In xscreensaver terminology, this is the replacement for
+ the "screenhack.c" module.
+ */
+
+#import "XScreenSaverView.h"
+
+#ifdef USE_IPHONE
+# import <OpenGLES/EAGL.h>
+# import <OpenGLES/ES1/gl.h>
+# import <OpenGLES/ES1/glext.h>
+# import <QuartzCore/QuartzCore.h>
+# import "jwzglesI.h"
+#else
+# import <AppKit/NSOpenGL.h>
+#endif
+
+@interface XScreenSaverGLView : XScreenSaverView
+{
+# ifdef USE_IPHONE
+ GLuint gl_depthbuffer;
+ BOOL _suppressRotationAnimation;
+ jwzgles_state *_glesState;
+# endif /* USE_IPHONE */
+}
+
+@end
diff --git a/OSX/XScreenSaverGLView.m b/OSX/XScreenSaverGLView.m
new file mode 100644
index 0000000..57b0c7c
--- /dev/null
+++ b/OSX/XScreenSaverGLView.m
@@ -0,0 +1,433 @@
+/* xscreensaver, Copyright (c) 2006-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* This is a subclass of Apple's ScreenSaverView that knows how to run
+ xscreensaver programs without X11 via the dark magic of the "jwxyz"
+ library. In xscreensaver terminology, this is the replacement for
+ the "screenhack.c" module.
+ */
+
+#import "XScreenSaverGLView.h"
+#import "XScreenSaverConfigSheet.h"
+#import "jwxyz-cocoa.h"
+#import "jwxyzI.h"
+#import "screenhackI.h"
+#import "xlockmoreI.h"
+
+#ifdef USE_IPHONE
+# include "jwzgles.h"
+# import <OpenGLES/ES1/glext.h>
+#else
+# import <OpenGL/OpenGL.h>
+#endif
+
+/* used by the OpenGL screen savers
+ */
+extern GLXContext *init_GL (ModeInfo *);
+extern void glXSwapBuffers (Display *, Window);
+extern void glXMakeCurrent (Display *, Window, GLXContext);
+extern void clear_gl_error (void);
+extern void check_gl_error (const char *type);
+
+
+@implementation XScreenSaverGLView
+
+
+/* With GL programs, drawing at full resolution isn't a problem.
+ */
+- (CGFloat) hackedContentScaleFactor
+{
+# ifdef USE_IPHONE
+ return [self contentScaleFactor];
+# else
+ return self.window.backingScaleFactor;
+# endif
+}
+
+# ifdef USE_IPHONE
+
+- (BOOL)ignoreRotation
+{
+ return FALSE; // Allow xwindow and the glViewport to change shape
+}
+
+- (BOOL) suppressRotationAnimation
+{
+ return _suppressRotationAnimation; // per-hack setting, default FALSE
+}
+
+- (BOOL) rotateTouches
+{
+ return TRUE; // We need the XY axes swapped in our events
+}
+
+
+- (void) swapBuffers
+{
+# ifdef JWXYZ_GL
+ GLint gl_renderbuffer = xwindow->gl_renderbuffer;
+# endif // JWXYZ_GL
+ glBindRenderbufferOES (GL_RENDERBUFFER_OES, gl_renderbuffer);
+ [ogl_ctx presentRenderbuffer:GL_RENDERBUFFER_OES];
+}
+#endif // USE_IPHONE
+
+
+- (void) animateOneFrame
+{
+# if defined USE_IPHONE && defined JWXYZ_QUARTZ
+ UIGraphicsPushContext (backbuffer);
+# endif
+
+ [self render_x11];
+
+# if defined USE_IPHONE && defined JWXYZ_QUARTZ
+ UIGraphicsPopContext();
+# endif
+}
+
+
+/* GL screenhacks don't display a backbuffer, so this is a stub. */
+- (void) enableBackbuffer:(CGSize)new_backbuffer_size
+{
+}
+
+
+/* GL screenhacks set their own viewport and matrices. */
+- (void) setViewport
+{
+}
+
+
+#ifdef USE_IPHONE
+
+/* Keep the GL scene oriented into a portrait-mode View, regardless of
+ what the physical device orientation is.
+ */
+- (void) reshape_x11
+{
+ [super reshape_x11];
+
+ glMatrixMode(GL_PROJECTION);
+ glRotatef (-current_device_rotation(), 0, 0, 1);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+- (void) render_x11
+{
+ BOOL was_initted_p = initted_p;
+ [super render_x11];
+
+ if (! was_initted_p && xdpy)
+ _suppressRotationAnimation =
+ get_boolean_resource (xdpy,
+ "suppressRotationAnimation",
+ "SuppressRotationAnimation");
+}
+
+#endif // USE_IPHONE
+
+
+
+/* The backbuffer isn't actually used for GL programs, but it needs to
+ be there for X11 calls to not error out. However, nothing done with
+ X11 calls will ever show up! It all gets written into the backbuffer
+ and discarded. That's ok, though, because mostly it's just calls to
+ XClearWindow and housekeeping stuff like that. So we make a tiny one.
+ */
+- (void) createBackbuffer:(CGSize)new_size
+{
+#ifdef JWXYZ_QUARTZ
+ NSAssert (! backbuffer_texture,
+ @"backbuffer_texture shouldn't be used for GL hacks");
+
+ if (! backbuffer) {
+ CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB();
+ int w = 8;
+ int h = 8;
+ backbuffer = CGBitmapContextCreate (NULL, w, h, // yup, only 8px x 8px.
+ 8, w*4, cs,
+ (kCGBitmapByteOrder32Little |
+ kCGImageAlphaNoneSkipLast));
+ CGColorSpaceRelease (cs);
+ }
+#endif // JWXYZ_QUARTZ
+}
+
+
+/* Another stub for GL screenhacks. */
+- (void) drawBackbuffer
+{
+}
+
+
+/* Likewise. GL screenhacks control display with glXSwapBuffers(). */
+- (void) flushBackbuffer
+{
+}
+
+
+#ifndef USE_IPHONE
+
+- (NSOpenGLPixelFormat *) getGLPixelFormat
+{
+ NSOpenGLPixelFormatAttribute attrs[40];
+ int i = 0;
+ attrs[i++] = NSOpenGLPFAColorSize; attrs[i++] = 24;
+ attrs[i++] = NSOpenGLPFAAlphaSize; attrs[i++] = 8;
+ attrs[i++] = NSOpenGLPFADepthSize; attrs[i++] = 24;
+
+ if ([prefsReader getBooleanResource:"doubleBuffer"])
+ attrs[i++] = NSOpenGLPFADoubleBuffer;
+
+ Bool ms_p = [prefsReader getBooleanResource:"multiSample"];
+
+ /* Sometimes, turning on multisampling kills performance. At one point,
+ I thought the answer was, "only run multisampling on one screen, and
+ leave it turned off on other screens". That's what this code does,
+ but it turns out, that solution is insufficient. I can't really tell
+ what causes poor performance with multisampling, but it's not
+ predictable. Without changing the code, some times a given saver will
+ perform fine with multisampling on, and other times it will perform
+ very badly. Without multisampling, they always perform fine.
+ */
+ // if (ms_p && [[view window] screen] != [[NSScreen screens] objectAtIndex:0])
+ // ms_p = 0;
+
+ if (ms_p) {
+ attrs[i++] = NSOpenGLPFASampleBuffers; attrs[i++] = 1;
+ attrs[i++] = NSOpenGLPFASamples; attrs[i++] = 6;
+ // Don't really understand what this means:
+ // attrs[i++] = NSOpenGLPFANoRecovery;
+ }
+
+ attrs[i++] = NSOpenGLPFAWindow;
+# ifdef JWXYZ_GL
+ attrs[i++] = NSOpenGLPFAPixelBuffer;
+# endif
+
+ attrs[i] = 0;
+
+ NSOpenGLPixelFormat *result = [[NSOpenGLPixelFormat alloc]
+ initWithAttributes:attrs];
+
+ if (ms_p && !result) { // Retry without multisampling.
+ i -= 2;
+ attrs[i] = 0;
+ result = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
+ }
+
+ return [result autorelease];
+}
+
+#else // !USE_IPHONE
+
+- (NSDictionary *)getGLProperties
+{
+ Bool dbuf_p = [prefsReader getBooleanResource:"doubleBuffer"];
+
+ /* There seems to be no way to actually turn off double-buffering in
+ EAGLContext (e.g., no way to draw to the front buffer directly)
+ but if we turn on "retained backing" for non-buffering apps like
+ "pipes", at least the back buffer isn't auto-cleared on them.
+ */
+
+ return [NSDictionary dictionaryWithObjectsAndKeys:
+ kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat,
+ [NSNumber numberWithBool:!dbuf_p], kEAGLDrawablePropertyRetainedBacking,
+ nil];
+}
+
+- (void)addExtraRenderbuffers:(CGSize)size
+{
+ int w = size.width;
+ int h = size.height;
+
+ if (gl_depthbuffer) glDeleteRenderbuffersOES (1, &gl_depthbuffer);
+
+ glGenRenderbuffersOES (1, &gl_depthbuffer);
+ // [EAGLContext renderbufferStorage:fromDrawable:] must be called before this.
+ glBindRenderbufferOES (GL_RENDERBUFFER_OES, gl_depthbuffer);
+ glRenderbufferStorageOES (GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES,
+ w, h);
+ glFramebufferRenderbufferOES (GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES,
+ GL_RENDERBUFFER_OES, gl_depthbuffer);
+}
+
+- (NSString *)getCAGravity
+{
+ return kCAGravityCenter;
+}
+
+- (void) startAnimation
+{
+ [super startAnimation];
+ if (ogl_ctx) /* Almost always true. */
+ _glesState = jwzgles_make_state ();
+}
+
+- (void) stopAnimation
+{
+ [super stopAnimation];
+#ifdef USE_IPHONE
+ if (_glesState) {
+ [EAGLContext setCurrentContext:ogl_ctx];
+ jwzgles_make_current (_glesState);
+ jwzgles_free_state ();
+ }
+#endif
+}
+
+- (void) prepareContext
+{
+ [super prepareContext];
+ jwzgles_make_current (_glesState);
+}
+
+#endif // !USE_IPHONE
+
+
+- (void)dealloc {
+ // ogl_ctx
+ // gl_framebuffer
+ // gl_renderbuffer
+ // gl_depthbuffer
+ [super dealloc];
+}
+
+@end
+
+
+/* Utility functions...
+ */
+
+
+// redefine NSAssert, etc. here since they don't work when not inside
+// an ObjC method.
+
+#undef NSAssert
+#undef NSAssert1
+#undef NSAssert2
+#define NSASS(S) \
+ jwxyz_abort ("%s", [(S) cStringUsingEncoding:NSUTF8StringEncoding])
+#define NSAssert(CC,S) do { if (!(CC)) { NSASS((S)); }} while(0)
+#define NSAssert1(CC,S,A) do { if (!(CC)) { \
+ NSASS(([NSString stringWithFormat: S, A])); }} while(0)
+#define NSAssert2(CC,S,A,B) do { if (!(CC)) { \
+ NSASS(([NSString stringWithFormat: S, A, B])); }} while(0)
+
+
+/* Called by OpenGL savers using the XLockmore API.
+ */
+GLXContext *
+init_GL (ModeInfo *mi)
+{
+ Window win = mi->window;
+ XScreenSaverGLView *view = (XScreenSaverGLView *) jwxyz_window_view (win);
+ NSAssert1 ([view isKindOfClass:[XScreenSaverGLView class]],
+ @"wrong view class: %@", view);
+
+ // OpenGL initialization is in [XScreenSaverView startAnimation].
+
+ // I don't know why this is necessary, but it beats randomly having some
+ // textures be upside down.
+ //
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ // Caller expects a pointer to an opaque struct... which it dereferences.
+ // Don't ask me, it's historical...
+ static int blort = -1;
+ return (void *) &blort;
+}
+
+
+/* Copy the back buffer to the front buffer.
+ */
+void
+glXSwapBuffers (Display *dpy, Window window)
+{
+ // This all is very much like what's in -[XScreenSaverView flushBackbuffer].
+#ifdef JWXYZ_GL
+ jwxyz_bind_drawable (window, window);
+#endif // JWXYZ_GL
+
+ XScreenSaverGLView *view = (XScreenSaverGLView *) jwxyz_window_view (window);
+ NSAssert1 ([view isKindOfClass:[XScreenSaverGLView class]],
+ @"wrong view class: %@", view);
+#ifndef USE_IPHONE
+ NSOpenGLContext *ctx = [view oglContext];
+ if (ctx) [ctx flushBuffer]; // despite name, this actually swaps
+#else /* USE_IPHONE */
+ [view swapBuffers];
+#endif /* USE_IPHONE */
+}
+
+/* Does nothing - prepareContext already did the work.
+ */
+void
+glXMakeCurrent (Display *dpy, Window window, GLXContext context)
+{
+}
+
+
+/* clear away any lingering error codes */
+void
+clear_gl_error (void)
+{
+ while (glGetError() != GL_NO_ERROR)
+ ;
+}
+
+
+#if defined GL_INVALID_FRAMEBUFFER_OPERATION_OES && \
+ !defined GL_INVALID_FRAMEBUFFER_OPERATION
+# define GL_INVALID_FRAMEBUFFER_OPERATION GL_INVALID_FRAMEBUFFER_OPERATION_OES
+#endif
+
+
+/* report a GL error. */
+void
+check_gl_error (const char *type)
+{
+ char buf[100];
+ GLenum i;
+ const char *e;
+ switch ((i = glGetError())) {
+ case GL_NO_ERROR: return;
+ case GL_INVALID_ENUM: e = "invalid enum"; break;
+ case GL_INVALID_VALUE: e = "invalid value"; break;
+ case GL_INVALID_OPERATION: e = "invalid operation"; break;
+ case GL_STACK_OVERFLOW: e = "stack overflow"; break;
+ case GL_STACK_UNDERFLOW: e = "stack underflow"; break;
+ case GL_OUT_OF_MEMORY: e = "out of memory"; break;
+#ifdef GL_INVALID_FRAMEBUFFER_OPERATION
+ case GL_INVALID_FRAMEBUFFER_OPERATION:
+ e = "invalid framebuffer operation";
+ break;
+#endif
+#ifdef GL_TABLE_TOO_LARGE_EXT
+ case GL_TABLE_TOO_LARGE_EXT: e = "table too large"; break;
+#endif
+#ifdef GL_TEXTURE_TOO_LARGE_EXT
+ case GL_TEXTURE_TOO_LARGE_EXT: e = "texture too large"; break;
+#endif
+ default:
+ e = buf; sprintf (buf, "unknown GL error %d", (int) i); break;
+ }
+ NSAssert2 (0, @"%s GL error: %s", type, e);
+}
diff --git a/OSX/XScreenSaverPkg.icns b/OSX/XScreenSaverPkg.icns
new file mode 100644
index 0000000..3dc0aa1
--- /dev/null
+++ b/OSX/XScreenSaverPkg.icns
Binary files differ
diff --git a/OSX/XScreenSaverSubclass.m b/OSX/XScreenSaverSubclass.m
new file mode 100644
index 0000000..aabfc83
--- /dev/null
+++ b/OSX/XScreenSaverSubclass.m
@@ -0,0 +1,33 @@
+/* xscreensaver, Copyright (c) 2006 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* This stub is compiled differently for each saver, just to ensure that
+ each one has a different class name. If multiple savers use the
+ XScreenSaver class directly, System Preferences gets really confused.
+ */
+
+#ifndef CLASS
+ ERROR! -DCLASS missing
+#endif
+
+#ifdef USE_GL
+# import "XScreenSaverGLView.h"
+# define SUPERCLASS XScreenSaverGLView
+#else
+# import "XScreenSaverView.h"
+# define SUPERCLASS XScreenSaverView
+#endif
+
+@interface CLASS : SUPERCLASS { }
+@end
+
+@implementation CLASS
+@end
diff --git a/OSX/XScreenSaverView.h b/OSX/XScreenSaverView.h
new file mode 100644
index 0000000..1965ef8
--- /dev/null
+++ b/OSX/XScreenSaverView.h
@@ -0,0 +1,182 @@
+/* xscreensaver, Copyright (c) 2006-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* This is a subclass of Apple's ScreenSaverView that knows how to run
+ xscreensaver programs without X11 via the dark magic of the "jwxyz"
+ library. In xscreensaver terminology, this is the replacement for
+ the "screenhack.c" module.
+ */
+
+#ifdef USE_IPHONE
+# import <Foundation/Foundation.h>
+# import <UIKit/UIKit.h>
+# define NSView UIView
+# define NSRect CGRect
+# define NSSize CGSize
+# define NSColor UIColor
+# define NSImage UIImage
+# define NSEvent UIEvent
+# define NSWindow UIWindow
+# define NSOpenGLContext EAGLContext
+#else
+# import <Cocoa/Cocoa.h>
+# import <ScreenSaver/ScreenSaver.h>
+//# define USE_TOUCHBAR
+#endif
+
+
+#import "screenhackI.h"
+#import "PrefsReader.h"
+
+#ifdef USE_IPHONE
+
+@class XScreenSaverView;
+
+@protocol XScreenSaverViewDelegate
+- (void) wantsFadeOut:(XScreenSaverView *)saverView;
+- (void) didShake:(XScreenSaverView *)saverView;
+- (void) openPreferences: (NSString *)which;
+@end
+
+@interface ScreenSaverView : NSView
+- (id)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview;
+- (NSTimeInterval)animationTimeInterval;
+- (void)setAnimationTimeInterval:(NSTimeInterval)timeInterval;
+- (void)startAnimation;
+- (void)stopAnimation;
+- (BOOL)isAnimating;
+- (void)animateOneFrame;
+- (BOOL)hasConfigureSheet;
+//- (NSWindow*)configureSheet;
+- (UIViewController*)configureView;
+- (BOOL)isPreview;
+@end
+
+#endif // USE_IPHONE
+
+
+// Currently only OpenGL backbuffers are supported (OSX and iOS).
+# define BACKBUFFER_OPENGL
+
+@interface XScreenSaverView : ScreenSaverView
+# ifdef USE_IPHONE
+ <UIAlertViewDelegate>
+# elif defined(USE_TOUCHBAR)
+ <NSTouchBarDelegate>
+# endif
+{
+ struct xscreensaver_function_table *xsft;
+ PrefsReader *prefsReader;
+
+ BOOL setup_p; // whether xsft->setup_cb() has been run
+ BOOL initted_p; // whether xsft->init_cb() has been run
+ BOOL resized_p; // whether to run the xsft->reshape_cb() soon
+ double next_frame_time; // time_t in milliseconds of when to tick the frame
+
+ // Data used by the Xlib-flavored screensaver
+ Display *xdpy;
+ Window xwindow;
+ void *xdata;
+ fps_state *fpst;
+ void (*fps_cb) (Display *, Window, fps_state *, void *);
+
+ BOOL _lowrez_p; // Whether the saver prefers 1990s pixels.
+
+# ifdef USE_IPHONE
+ BOOL screenLocked;
+ BOOL _ignoreRotation; // whether hack requested "always portrait".
+ // some want this, some do not.
+ NSTimer *crash_timer;
+
+ NSDictionary *function_tables;
+
+ id<XScreenSaverViewDelegate> _delegate;
+
+ UIView *closeBox;
+ NSTimer *closeBoxTimer;
+
+ CGAffineTransform pinch_transform;
+
+# else // !USE_PHONE
+
+ NSOpenGLPixelFormat *pixfmt;
+
+# endif // !USE_IPHONE
+
+# ifdef USE_TOUCHBAR
+ XScreenSaverView *touchbar_view;
+ BOOL touchbar_p;
+# endif
+
+ NSOpenGLContext *ogl_ctx; // OpenGL rendering context
+
+# ifdef JWXYZ_QUARTZ
+ CGContextRef backbuffer;
+ CGColorSpaceRef colorspace;
+
+# ifdef BACKBUFFER_OPENGL
+ void *backbuffer_data;
+ GLsizei backbuffer_len;
+
+ GLsizei gl_texture_w, gl_texture_h;
+
+ GLuint backbuffer_texture;
+ GLenum gl_texture_target;
+ GLenum gl_pixel_format, gl_pixel_type;
+# ifndef USE_IPHONE
+ BOOL double_buffered_p, gl_apple_client_storage_p;
+# else // USE_IPHONE
+ BOOL gl_limited_npot_p;
+ GLuint gl_framebuffer, gl_renderbuffer;
+# endif // USE_IPHONE
+# endif
+
+# endif // JWXYZ_QUARTZ
+
+# if defined JWXYZ_GL && defined USE_IPHONE
+ NSOpenGLContext *ogl_ctx_pixmap;
+# endif // JWXYZ_GL && USE_IPHONE
+}
+
+- (id)initWithFrame:(NSRect)frame saverName:(NSString*)n isPreview:(BOOL)p;
+
+- (void) render_x11;
+- (NSOpenGLContext *) oglContext;
+- (void) prepareContext;
+- (NSUserDefaultsController *) userDefaultsController;
++ (NSString *) decompressXML:(NSData *)xml;
+
+- (CGFloat) hackedContentScaleFactor;
+
+#ifdef USE_IPHONE
+- (void)setScreenLocked:(BOOL)locked;
+- (NSDictionary *)getGLProperties;
+- (void)addExtraRenderbuffers:(CGSize)size;
+- (NSString *)getCAGravity;
+- (void)orientationChanged;
+@property (nonatomic, assign) id<XScreenSaverViewDelegate> delegate;
+@property (nonatomic) BOOL ignoreRotation;
+- (BOOL)suppressRotationAnimation;
+- (BOOL)rotateTouches;
+#else // !USE_IPHONE
+- (NSOpenGLPixelFormat *)getGLPixelFormat;
+#endif // !USE_IPHONE
+
+- (void)enableBackbuffer:(CGSize)new_backbuffer_size;
+- (void)setViewport;
+- (void)createBackbuffer:(CGSize)s;
+- (void)reshape_x11;
+#ifdef JWXYZ_QUARTZ
+- (void)drawBackbuffer;
+#endif // JWXYZ_QUARTZ
+- (void)flushBackbuffer;
+
+@end
diff --git a/OSX/XScreenSaverView.m b/OSX/XScreenSaverView.m
new file mode 100644
index 0000000..cb7d45b
--- /dev/null
+++ b/OSX/XScreenSaverView.m
@@ -0,0 +1,3059 @@
+/* xscreensaver, Copyright (c) 2006-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* This is a subclass of Apple's ScreenSaverView that knows how to run
+ xscreensaver programs without X11 via the dark magic of the "jwxyz"
+ library. In xscreensaver terminology, this is the replacement for
+ the "screenhack.c" module.
+ */
+
+#import <QuartzCore/QuartzCore.h>
+#import <sys/mman.h>
+#import <zlib.h>
+#import "XScreenSaverView.h"
+#import "XScreenSaverConfigSheet.h"
+#import "Updater.h"
+#import "screenhackI.h"
+#import "pow2.h"
+#import "jwxyzI.h"
+#import "jwxyz-cocoa.h"
+#import "jwxyz-timers.h"
+
+#ifdef USE_IPHONE
+// XScreenSaverView.m speaks OpenGL ES just fine, but enableBackbuffer does
+// need (jwzgles_)gluCheckExtension.
+# import "jwzglesI.h"
+#else
+# import <OpenGL/glu.h>
+#endif
+
+/* Garbage collection only exists if we are being compiled against the
+ 10.6 SDK or newer, not if we are building against the 10.4 SDK.
+ */
+#ifndef MAC_OS_X_VERSION_10_6
+# define MAC_OS_X_VERSION_10_6 1060 /* undefined in 10.4 SDK, grr */
+#endif
+#ifndef MAC_OS_X_VERSION_10_12
+# define MAC_OS_X_VERSION_10_12 101200
+#endif
+#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 && \
+ MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_12)
+ /* 10.6 SDK or later, and earlier than 10.12 SDK */
+# import <objc/objc-auto.h>
+# define DO_GC_HACKERY
+#endif
+
+/* Duplicated in xlockmoreI.h and XScreenSaverGLView.m. */
+extern void clear_gl_error (void);
+extern void check_gl_error (const char *type);
+
+extern struct xscreensaver_function_table *xscreensaver_function_table;
+
+/* Global variables used by the screen savers
+ */
+const char *progname;
+const char *progclass;
+int mono_p = 0;
+
+
+# ifdef USE_IPHONE
+
+# define NSSizeToCGSize(x) (x)
+
+extern NSDictionary *make_function_table_dict(void); // ios-function-table.m
+
+/* Stub definition of the superclass, for iPhone.
+ */
+@implementation ScreenSaverView
+{
+ NSTimeInterval anim_interval;
+ Bool animating_p;
+ NSTimer *anim_timer;
+}
+
+- (id)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview {
+ self = [super initWithFrame:frame];
+ if (! self) return 0;
+ anim_interval = 1.0/30;
+ return self;
+}
+- (NSTimeInterval)animationTimeInterval { return anim_interval; }
+- (void)setAnimationTimeInterval:(NSTimeInterval)i { anim_interval = i; }
+- (BOOL)hasConfigureSheet { return NO; }
+- (NSWindow *)configureSheet { return nil; }
+- (NSView *)configureView { return nil; }
+- (BOOL)isPreview { return NO; }
+- (BOOL)isAnimating { return animating_p; }
+- (void)animateOneFrame { }
+
+- (void)startAnimation {
+ if (animating_p) return;
+ animating_p = YES;
+ anim_timer = [NSTimer scheduledTimerWithTimeInterval: anim_interval
+ target:self
+ selector:@selector(animateOneFrame)
+ userInfo:nil
+ repeats:YES];
+}
+
+- (void)stopAnimation {
+ if (anim_timer) {
+ [anim_timer invalidate];
+ anim_timer = 0;
+ }
+ animating_p = NO;
+}
+@end
+
+# endif // !USE_IPHONE
+
+
+
+@interface XScreenSaverView (Private)
+- (void) stopAndClose;
+- (void) stopAndClose:(Bool)relaunch;
+@end
+
+@implementation XScreenSaverView
+
+// Given a lower-cased saver name, returns the function table for it.
+// If no name, guess the name from the class's bundle name.
+//
+- (struct xscreensaver_function_table *) findFunctionTable:(NSString *)name
+{
+ NSBundle *nsb = [NSBundle bundleForClass:[self class]];
+ NSAssert1 (nsb, @"no bundle for class %@", [self class]);
+
+ NSString *path = [nsb bundlePath];
+ CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
+ (CFStringRef) path,
+ kCFURLPOSIXPathStyle,
+ true);
+ CFBundleRef cfb = CFBundleCreate (kCFAllocatorDefault, url);
+ CFRelease (url);
+ NSAssert1 (cfb, @"no CFBundle for \"%@\"", path);
+ // #### Analyze says "Potential leak of an object stored into cfb"
+
+ if (! name)
+ name = [[path lastPathComponent] stringByDeletingPathExtension];
+
+ name = [[name lowercaseString]
+ stringByReplacingOccurrencesOfString:@" "
+ withString:@""];
+
+# ifndef USE_IPHONE
+ // CFBundleGetDataPointerForName doesn't work in "Archive" builds.
+ // I'm guessing that symbol-stripping is mandatory. Fuck.
+ NSString *table_name = [name stringByAppendingString:
+ @"_xscreensaver_function_table"];
+ void *addr = CFBundleGetDataPointerForName (cfb, (CFStringRef) table_name);
+ CFRelease (cfb);
+
+ if (! addr)
+ NSLog (@"no symbol \"%@\" for \"%@\"", table_name, path);
+
+# else // USE_IPHONE
+ // Depends on the auto-generated "ios-function-table.m" being up to date.
+ if (! function_tables)
+ function_tables = [make_function_table_dict() retain];
+ NSValue *v = [function_tables objectForKey: name];
+ void *addr = v ? [v pointerValue] : 0;
+# endif // USE_IPHONE
+
+ return (struct xscreensaver_function_table *) addr;
+}
+
+
+// Add the "Contents/Resources/" subdirectory of this screen saver's .bundle
+// to $PATH for the benefit of savers that include helper shell scripts.
+//
+- (void) setShellPath
+{
+ NSBundle *nsb = [NSBundle bundleForClass:[self class]];
+ NSAssert1 (nsb, @"no bundle for class %@", [self class]);
+
+ NSString *nsdir = [nsb resourcePath];
+ NSAssert1 (nsdir, @"no resourcePath for class %@", [self class]);
+ const char *dir = [nsdir cStringUsingEncoding:NSUTF8StringEncoding];
+ const char *opath = getenv ("PATH");
+ if (!opath) opath = "/bin"; // $PATH is unset when running under Shark!
+ char *npath = (char *) malloc (strlen (opath) + strlen (dir) + 2);
+ strcpy (npath, dir);
+ strcat (npath, ":");
+ strcat (npath, opath);
+ if (setenv ("PATH", npath, 1)) {
+ perror ("setenv");
+ NSAssert1 (0, @"setenv \"PATH=%s\" failed", npath);
+ }
+
+ free (npath);
+}
+
+
+// set an $XSCREENSAVER_CLASSPATH variable so that included shell scripts
+// (e.g., "xscreensaver-text") know how to look up resources.
+//
+- (void) setResourcesEnv:(NSString *) name
+{
+ NSBundle *nsb = [NSBundle bundleForClass:[self class]];
+ NSAssert1 (nsb, @"no bundle for class %@", [self class]);
+
+ const char *s = [name cStringUsingEncoding:NSUTF8StringEncoding];
+ if (setenv ("XSCREENSAVER_CLASSPATH", s, 1)) {
+ perror ("setenv");
+ NSAssert1 (0, @"setenv \"XSCREENSAVER_CLASSPATH=%s\" failed", s);
+ }
+}
+
+
+- (void) loadCustomFonts
+{
+# ifndef USE_IPHONE
+ NSBundle *nsb = [NSBundle bundleForClass:[self class]];
+ NSMutableArray *fonts = [NSMutableArray arrayWithCapacity:20];
+ for (NSString *ext in @[@"ttf", @"otf"]) {
+ [fonts addObjectsFromArray: [nsb pathsForResourcesOfType:ext
+ inDirectory:NULL]];
+ }
+ for (NSString *font in fonts) {
+ CFURLRef url = (CFURLRef) [NSURL fileURLWithPath: font];
+ CFErrorRef err = 0;
+ if (! CTFontManagerRegisterFontsForURL (url, kCTFontManagerScopeProcess,
+ &err)) {
+ // Just ignore errors:
+ // "The file has already been registered in the specified scope."
+ // NSLog (@"loading font: %@ %@", url, err);
+ }
+ }
+# endif // !USE_IPHONE
+}
+
+
+static void
+add_default_options (const XrmOptionDescRec *opts,
+ const char * const *defs,
+ XrmOptionDescRec **opts_ret,
+ const char ***defs_ret)
+{
+ /* These aren't "real" command-line options (there are no actual command-line
+ options in the Cocoa version); but this is the somewhat kludgey way that
+ the <xscreensaver-text /> and <xscreensaver-image /> tags in the
+ ../hacks/config/\*.xml files communicate with the preferences database.
+ */
+ static const XrmOptionDescRec default_options [] = {
+ { "-text-mode", ".textMode", XrmoptionSepArg, 0 },
+ { "-text-literal", ".textLiteral", XrmoptionSepArg, 0 },
+ { "-text-file", ".textFile", XrmoptionSepArg, 0 },
+ { "-text-url", ".textURL", XrmoptionSepArg, 0 },
+ { "-text-program", ".textProgram", XrmoptionSepArg, 0 },
+ { "-grab-desktop", ".grabDesktopImages", XrmoptionNoArg, "True" },
+ { "-no-grab-desktop", ".grabDesktopImages", XrmoptionNoArg, "False"},
+ { "-choose-random-images", ".chooseRandomImages",XrmoptionNoArg, "True" },
+ { "-no-choose-random-images",".chooseRandomImages",XrmoptionNoArg, "False"},
+ { "-image-directory", ".imageDirectory", XrmoptionSepArg, 0 },
+ { "-fps", ".doFPS", XrmoptionNoArg, "True" },
+ { "-no-fps", ".doFPS", XrmoptionNoArg, "False"},
+ { "-foreground", ".foreground", XrmoptionSepArg, 0 },
+ { "-fg", ".foreground", XrmoptionSepArg, 0 },
+ { "-background", ".background", XrmoptionSepArg, 0 },
+ { "-bg", ".background", XrmoptionSepArg, 0 },
+
+# ifndef USE_IPHONE
+ // <xscreensaver-updater />
+ { "-" SUSUEnableAutomaticChecksKey,
+ "." SUSUEnableAutomaticChecksKey, XrmoptionNoArg, "True" },
+ { "-no-" SUSUEnableAutomaticChecksKey,
+ "." SUSUEnableAutomaticChecksKey, XrmoptionNoArg, "False" },
+ { "-" SUAutomaticallyUpdateKey,
+ "." SUAutomaticallyUpdateKey, XrmoptionNoArg, "True" },
+ { "-no-" SUAutomaticallyUpdateKey,
+ "." SUAutomaticallyUpdateKey, XrmoptionNoArg, "False" },
+ { "-" SUSendProfileInfoKey,
+ "." SUSendProfileInfoKey, XrmoptionNoArg,"True" },
+ { "-no-" SUSendProfileInfoKey,
+ "." SUSendProfileInfoKey, XrmoptionNoArg,"False"},
+ { "-" SUScheduledCheckIntervalKey,
+ "." SUScheduledCheckIntervalKey, XrmoptionSepArg, 0 },
+# endif // !USE_IPHONE
+
+ { 0, 0, 0, 0 }
+ };
+ static const char *default_defaults [] = {
+
+# if defined(USE_IPHONE) && !defined(__OPTIMIZE__)
+ ".doFPS: True",
+# else
+ ".doFPS: False",
+# endif
+ ".doubleBuffer: True",
+ ".multiSample: False",
+# ifndef USE_IPHONE
+ ".textMode: date",
+# else
+ ".textMode: url",
+# endif
+ // ".textLiteral: ",
+ // ".textFile: ",
+ ".textURL: https://en.wikipedia.org/w/index.php?title=Special:NewPages&feed=rss",
+ // ".textProgram: ",
+ ".grabDesktopImages: yes",
+# ifndef USE_IPHONE
+ ".chooseRandomImages: no",
+# else
+ ".chooseRandomImages: yes",
+# endif
+ ".imageDirectory: ~/Pictures",
+ ".relaunchDelay: 2",
+ ".texFontCacheSize: 30",
+
+# ifndef USE_IPHONE
+# define STR1(S) #S
+# define STR(S) STR1(S)
+# define __objc_yes Yes
+# define __objc_no No
+ "." SUSUEnableAutomaticChecksKey ": " STR(SUSUEnableAutomaticChecksDef),
+ "." SUAutomaticallyUpdateKey ": " STR(SUAutomaticallyUpdateDef),
+ "." SUSendProfileInfoKey ": " STR(SUSendProfileInfoDef),
+ "." SUScheduledCheckIntervalKey ": " STR(SUScheduledCheckIntervalDef),
+# undef __objc_yes
+# undef __objc_no
+# undef STR1
+# undef STR
+# endif // USE_IPHONE
+ 0
+ };
+
+ int count = 0, i, j;
+ for (i = 0; default_options[i].option; i++)
+ count++;
+ for (i = 0; opts[i].option; i++)
+ count++;
+
+ XrmOptionDescRec *opts2 = (XrmOptionDescRec *)
+ calloc (count + 1, sizeof (*opts2));
+
+ i = 0;
+ j = 0;
+ while (default_options[j].option) {
+ opts2[i] = default_options[j];
+ i++, j++;
+ }
+ j = 0;
+ while (opts[j].option) {
+ opts2[i] = opts[j];
+ i++, j++;
+ }
+
+ *opts_ret = opts2;
+
+
+ /* now the defaults
+ */
+ count = 0;
+ for (i = 0; default_defaults[i]; i++)
+ count++;
+ for (i = 0; defs[i]; i++)
+ count++;
+
+ const char **defs2 = (const char **) calloc (count + 1, sizeof (*defs2));
+
+ i = 0;
+ j = 0;
+ while (default_defaults[j]) {
+ defs2[i] = default_defaults[j];
+ i++, j++;
+ }
+ j = 0;
+ while (defs[j]) {
+ defs2[i] = defs[j];
+ i++, j++;
+ }
+
+ *defs_ret = defs2;
+}
+
+
+- (id) initWithFrame:(NSRect)frame
+ saverName:(NSString *)saverName
+ isPreview:(BOOL)isPreview
+{
+ if (! (self = [super initWithFrame:frame isPreview:isPreview]))
+ return 0;
+
+ xsft = [self findFunctionTable: saverName];
+ if (! xsft) {
+ [self release];
+ return 0;
+ }
+
+ [self setShellPath];
+
+ setup_p = YES;
+ if (xsft->setup_cb)
+ xsft->setup_cb (xsft, xsft->setup_arg);
+
+ /* The plist files for these preferences show up in
+ $HOME/Library/Preferences/ByHost/ in a file named like
+ "org.jwz.xscreensaver.<SAVERNAME>.<NUMBERS>.plist"
+ */
+ NSString *name = [NSString stringWithCString:xsft->progclass
+ encoding:NSISOLatin1StringEncoding];
+ name = [@"org.jwz.xscreensaver." stringByAppendingString:name];
+ [self setResourcesEnv:name];
+ [self loadCustomFonts];
+
+ XrmOptionDescRec *opts = 0;
+ const char **defs = 0;
+ add_default_options (xsft->options, xsft->defaults, &opts, &defs);
+ prefsReader = [[PrefsReader alloc]
+ initWithName:name xrmKeys:opts defaults:defs];
+ free (defs);
+ // free (opts); // bah, we need these! #### leak!
+ xsft->options = opts;
+
+ progname = progclass = xsft->progclass;
+
+ next_frame_time = 0;
+
+# if !defined USE_IPHONE && defined JWXYZ_QUARTZ
+ // When the view fills the screen and double buffering is enabled, OS X will
+ // use page flipping for a minor CPU/FPS boost. In windowed mode, double
+ // buffering reduces the frame rate to 1/2 the screen's refresh rate.
+ double_buffered_p = !isPreview;
+# endif
+
+# ifdef USE_IPHONE
+ [self initGestures];
+
+ // So we can tell when we're docked.
+ [UIDevice currentDevice].batteryMonitoringEnabled = YES;
+
+ [self setBackgroundColor:[NSColor blackColor]];
+# endif // USE_IPHONE
+
+# ifdef JWXYZ_QUARTZ
+ // Colorspaces and CGContexts only happen with non-GL hacks.
+ colorspace = CGColorSpaceCreateDeviceRGB ();
+# endif
+
+ return self;
+}
+
+
+#ifdef USE_TOUCHBAR
+- (id) initWithFrame:(NSRect)frame
+ saverName:(NSString *)saverName
+ isPreview:(BOOL)isPreview
+ isTouchbar:(BOOL)isTouchbar
+{
+ if (! (self = [self initWithFrame:frame saverName:saverName
+ isPreview:isPreview]))
+ return 0;
+ touchbar_p = isTouchbar;
+ return self;
+}
+#endif // USE_TOUCHBAR
+
+
+#ifdef USE_IPHONE
++ (Class) layerClass
+{
+ return [CAEAGLLayer class];
+}
+#endif
+
+
+- (id) initWithFrame:(NSRect)frame isPreview:(BOOL)p
+{
+ return [self initWithFrame:frame saverName:0 isPreview:p];
+}
+
+
+- (void) dealloc
+{
+ if ([self isAnimating])
+ [self stopAnimation];
+ NSAssert(!xdata, @"xdata not yet freed");
+ NSAssert(!xdpy, @"xdpy not yet freed");
+
+# ifdef USE_IPHONE
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+# endif
+
+# ifdef BACKBUFFER_OPENGL
+# ifndef USE_IPHONE
+ [pixfmt release];
+# endif // !USE_IPHONE
+ [ogl_ctx release];
+ // Releasing the OpenGL context should also free any OpenGL objects,
+ // including the backbuffer texture and frame/render/depthbuffers.
+# endif // BACKBUFFER_OPENGL
+
+# if defined JWXYZ_GL && defined USE_IPHONE
+ [ogl_ctx_pixmap release];
+# endif // JWXYZ_GL
+
+# ifdef JWXYZ_QUARTZ
+ if (colorspace)
+ CGColorSpaceRelease (colorspace);
+# endif // JWXYZ_QUARTZ
+
+ [prefsReader release];
+
+ // xsft
+ // fpst
+
+ [super dealloc];
+}
+
+- (PrefsReader *) prefsReader
+{
+ return prefsReader;
+}
+
+
+#ifdef USE_IPHONE
+- (void) lockFocus { }
+- (void) unlockFocus { }
+#endif // USE_IPHONE
+
+
+
+# ifdef USE_IPHONE
+/* A few seconds after the saver launches, we store the "wasRunning"
+ preference. This is so that if the saver is crashing at startup,
+ we don't launch it again next time, getting stuck in a crash loop.
+ */
+- (void) allSystemsGo: (NSTimer *) timer
+{
+ NSAssert (timer == crash_timer, @"crash timer screwed up");
+ crash_timer = 0;
+
+ NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
+ [prefs setBool:YES forKey:@"wasRunning"];
+ [prefs synchronize];
+}
+
+
+- (void) resizeGL
+{
+ if (!ogl_ctx)
+ return;
+
+ CGSize screen_size = self.bounds.size;
+ double s = self.contentScaleFactor;
+ screen_size.width *= s;
+ screen_size.height *= s;
+
+#if defined JWXYZ_GL
+ GLuint *framebuffer = &xwindow->gl_framebuffer;
+ GLuint *renderbuffer = &xwindow->gl_renderbuffer;
+ xwindow->window.current_drawable = xwindow;
+#elif defined JWXYZ_QUARTZ
+ GLuint *framebuffer = &gl_framebuffer;
+ GLuint *renderbuffer = &gl_renderbuffer;
+#endif // JWXYZ_QUARTZ
+
+ if (*framebuffer) glDeleteFramebuffersOES (1, framebuffer);
+ if (*renderbuffer) glDeleteRenderbuffersOES (1, renderbuffer);
+
+ create_framebuffer (framebuffer, renderbuffer);
+
+ // redundant?
+ // glRenderbufferStorageOES (GL_RENDERBUFFER_OES, GL_RGBA8_OES,
+ // (int)size.width, (int)size.height);
+ [ogl_ctx renderbufferStorage:GL_RENDERBUFFER_OES
+ fromDrawable:(CAEAGLLayer*)self.layer];
+
+ glFramebufferRenderbufferOES (GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES,
+ GL_RENDERBUFFER_OES, *renderbuffer);
+
+ [self addExtraRenderbuffers:screen_size];
+
+ check_framebuffer_status();
+}
+#endif // USE_IPHONE
+
+
+- (void) startAnimation
+{
+ NSAssert(![self isAnimating], @"already animating");
+ NSAssert(!initted_p && !xdata, @"already initialized");
+
+ // See comment in render_x11() for why this value is important:
+ [self setAnimationTimeInterval: 1.0 / 240.0];
+
+ [super startAnimation];
+ /* We can't draw on the window from this method, so we actually do the
+ initialization of the screen saver (xsft->init_cb) in the first call
+ to animateOneFrame() instead.
+ */
+
+# ifdef USE_IPHONE
+ if (crash_timer)
+ [crash_timer invalidate];
+
+ NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
+ [prefs removeObjectForKey:@"wasRunning"];
+ [prefs synchronize];
+
+ crash_timer = [NSTimer scheduledTimerWithTimeInterval: 5
+ target:self
+ selector:@selector(allSystemsGo:)
+ userInfo:nil
+ repeats:NO];
+
+# endif // USE_IPHONE
+
+ // Never automatically turn the screen off if we are docked,
+ // and an animation is running.
+ //
+# ifdef USE_IPHONE
+ [UIApplication sharedApplication].idleTimerDisabled =
+ ([UIDevice currentDevice].batteryState != UIDeviceBatteryStateUnplugged);
+# endif
+
+ xwindow = (Window) calloc (1, sizeof(*xwindow));
+ xwindow->type = WINDOW;
+ xwindow->window.view = self;
+ CFRetain (xwindow->window.view); // needed for garbage collection?
+
+#ifdef BACKBUFFER_OPENGL
+ CGSize new_backbuffer_size;
+
+ {
+# ifndef USE_IPHONE
+ if (!ogl_ctx) {
+
+ pixfmt = [self getGLPixelFormat];
+ [pixfmt retain];
+
+ NSAssert (pixfmt, @"unable to create NSOpenGLPixelFormat");
+
+ // Fun: On OS X 10.7, the second time an OpenGL context is created, after
+ // the preferences dialog is launched in SaverTester, the context only
+ // lasts until the first full GC. Then it turns black. Solution is to
+ // reuse the OpenGL context after this point.
+ // "Analyze" says that both pixfmt and ogl_ctx are leaked.
+ ogl_ctx = [[NSOpenGLContext alloc] initWithFormat:pixfmt
+ shareContext:nil];
+
+ // Sync refreshes to the vertical blanking interval
+ GLint r = 1;
+ [ogl_ctx setValues:&r forParameter:NSOpenGLCPSwapInterval];
+// check_gl_error ("NSOpenGLCPSwapInterval"); // SEGV sometimes. Too early?
+ }
+
+ [ogl_ctx makeCurrentContext];
+ check_gl_error ("makeCurrentContext");
+
+ // NSOpenGLContext logs an 'invalid drawable' when this is called
+ // from initWithFrame.
+ [ogl_ctx setView:self];
+
+ // Get device pixels instead of points.
+ self.wantsBestResolutionOpenGLSurface = YES;
+
+ // This may not be necessary if there's FBO support.
+# ifdef JWXYZ_GL
+ xwindow->window.pixfmt = pixfmt;
+ CFRetain (xwindow->window.pixfmt);
+ xwindow->window.virtual_screen = [ogl_ctx currentVirtualScreen];
+ xwindow->window.current_drawable = xwindow;
+ NSAssert (ogl_ctx, @"no CGContext");
+# endif
+
+ // Clear frame buffer ASAP, else there are bits left over from other apps.
+ glClearColor (0, 0, 0, 1);
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+// glFinish ();
+// glXSwapBuffers (mi->dpy, mi->window);
+
+
+ // Enable multi-threading, if possible. This runs most OpenGL commands
+ // and GPU management on a second CPU.
+ {
+# ifndef kCGLCEMPEngine
+# define kCGLCEMPEngine 313 // Added in MacOS 10.4.8 + XCode 2.4.
+# endif
+ CGLContextObj cctx = CGLGetCurrentContext();
+ CGLError err = CGLEnable (cctx, kCGLCEMPEngine);
+ if (err != kCGLNoError) {
+ NSLog (@"enabling multi-threaded OpenGL failed: %d", err);
+ }
+ }
+
+ new_backbuffer_size = NSSizeToCGSize ([self bounds].size);
+
+ // Scale factor for desktop retina displays
+ double s = [self hackedContentScaleFactor];
+ new_backbuffer_size.width *= s;
+ new_backbuffer_size.height *= s;
+
+# else // USE_IPHONE
+ if (!ogl_ctx) {
+ CAEAGLLayer *eagl_layer = (CAEAGLLayer *) self.layer;
+ eagl_layer.opaque = TRUE;
+ eagl_layer.drawableProperties = [self getGLProperties];
+
+ // Without this, the GL frame buffer is half the screen resolution!
+ eagl_layer.contentsScale = [UIScreen mainScreen].scale;
+
+ ogl_ctx = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
+# ifdef JWXYZ_GL
+ ogl_ctx_pixmap = [[EAGLContext alloc]
+ initWithAPI:kEAGLRenderingAPIOpenGLES1
+ sharegroup:ogl_ctx.sharegroup];
+# endif // JWXYZ_GL
+
+ eagl_layer.contentsGravity = [self getCAGravity];
+ }
+
+# ifdef JWXYZ_GL
+ xwindow->window.ogl_ctx_pixmap = ogl_ctx_pixmap;
+# endif // JWXYZ_GL
+
+ [EAGLContext setCurrentContext: ogl_ctx];
+
+ [self resizeGL];
+
+ double s = [self hackedContentScaleFactor];
+ new_backbuffer_size = self.bounds.size;
+ new_backbuffer_size.width *= s;
+ new_backbuffer_size.height *= s;
+
+# endif // USE_IPHONE
+
+# ifdef JWXYZ_GL
+ xwindow->ogl_ctx = ogl_ctx;
+# ifndef USE_IPHONE
+ CFRetain (xwindow->ogl_ctx);
+# endif // USE_IPHONE
+# endif // JWXYZ_GL
+
+ check_gl_error ("startAnimation");
+
+// NSLog (@"%s / %s / %s\n", glGetString (GL_VENDOR),
+// glGetString (GL_RENDERER), glGetString (GL_VERSION));
+
+ [self enableBackbuffer:new_backbuffer_size];
+ }
+#endif // BACKBUFFER_OPENGL
+
+ [self setViewport];
+ [self createBackbuffer:new_backbuffer_size];
+
+# ifdef USE_TOUCHBAR
+ if (touchbar_view) [touchbar_view startAnimation];
+# endif // USE_TOUCHBAR
+}
+
+- (void)stopAnimation
+{
+ NSAssert([self isAnimating], @"not animating");
+
+ if (initted_p) {
+
+ [self lockFocus]; // in case something tries to draw from here
+ [self prepareContext];
+
+ /* All of the xlockmore hacks need to have their release functions
+ called, or launching the same saver twice does not work. Also
+ webcollage-cocoa needs it in order to kill the inferior webcollage
+ processes (since the screen saver framework never generates a
+ SIGPIPE for them).
+ */
+ if (xdata)
+ xsft->free_cb (xdpy, xwindow, xdata);
+ [self unlockFocus];
+
+ jwxyz_quartz_free_display (xdpy);
+ xdpy = NULL;
+# if defined JWXYZ_GL && !defined USE_IPHONE
+ CFRelease (xwindow->ogl_ctx);
+# endif
+ CFRelease (xwindow->window.view);
+ free (xwindow);
+ xwindow = NULL;
+
+// setup_p = NO; // #### wait, do we need this?
+ initted_p = NO;
+ xdata = 0;
+ }
+
+# ifdef USE_IPHONE
+ if (crash_timer)
+ [crash_timer invalidate];
+ crash_timer = 0;
+ NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
+ [prefs removeObjectForKey:@"wasRunning"];
+ [prefs synchronize];
+# endif // USE_IPHONE
+
+ [super stopAnimation];
+
+ // When an animation is no longer running (e.g., looking at the list)
+ // then it's ok to power off the screen when docked.
+ //
+# ifdef USE_IPHONE
+ [UIApplication sharedApplication].idleTimerDisabled = NO;
+# endif
+
+ // Without this, the GL frame stays on screen when switching tabs
+ // in System Preferences.
+ // (Or perhaps it used to. It doesn't seem to matter on 10.9.)
+ //
+# ifndef USE_IPHONE
+ [NSOpenGLContext clearCurrentContext];
+# endif // !USE_IPHONE
+
+ clear_gl_error(); // This hack is defunct, don't let this linger.
+
+# ifdef JWXYZ_QUARTZ
+ CGContextRelease (backbuffer);
+ backbuffer = nil;
+
+ if (backbuffer_len)
+ munmap (backbuffer_data, backbuffer_len);
+ backbuffer_data = NULL;
+ backbuffer_len = 0;
+# endif
+
+# ifdef USE_TOUCHBAR
+ if (touchbar_view) {
+ [touchbar_view stopAnimation];
+ [touchbar_view release];
+ touchbar_view = nil;
+ }
+# endif
+}
+
+
+- (NSOpenGLContext *) oglContext
+{
+ return ogl_ctx;
+}
+
+
+// #### maybe this could/should just be on 'lockFocus' instead?
+- (void) prepareContext
+{
+ if (xwindow) {
+#ifdef USE_IPHONE
+ [EAGLContext setCurrentContext:ogl_ctx];
+#else // !USE_IPHONE
+ [ogl_ctx makeCurrentContext];
+// check_gl_error ("makeCurrentContext");
+#endif // !USE_IPHONE
+
+#ifdef JWXYZ_GL
+ xwindow->window.current_drawable = xwindow;
+#endif
+ }
+}
+
+
+#ifdef USE_TOUCHBAR
+
+static NSString *touchbar_cid = @"org.jwz.xscreensaver.touchbar";
+static NSString *touchbar_iid = @"org.jwz.xscreensaver.touchbar";
+
+- (NSTouchBar *) makeTouchBar
+{
+ NSTouchBar *t = [[NSTouchBar alloc] init];
+ t.delegate = self;
+ t.customizationIdentifier = touchbar_cid;
+ t.defaultItemIdentifiers = @[touchbar_iid,
+ NSTouchBarItemIdentifierOtherItemsProxy];
+ t.customizationAllowedItemIdentifiers = @[touchbar_iid];
+ t.principalItemIdentifier = touchbar_iid;
+ return t;
+}
+
+- (NSTouchBarItem *)touchBar:(NSTouchBar *)touchBar
+ makeItemForIdentifier:(NSTouchBarItemIdentifier)id
+{
+ if ([id isEqualToString:touchbar_iid])
+ {
+ NSRect rect = [self frame];
+ // #### debugging
+ rect.origin.x = 0;
+ rect.origin.y = 0;
+ rect.size.width = 200;
+ rect.size.height = 40;
+ touchbar_view = [[[self class] alloc]
+ initWithFrame:rect
+ saverName:[NSString stringWithCString:xsft->progclass
+ encoding:NSISOLatin1StringEncoding]
+ isPreview:self.isPreview
+ isTouchbar:True];
+ [touchbar_view setAutoresizingMask:
+ NSViewWidthSizable|NSViewHeightSizable];
+ NSCustomTouchBarItem *item =
+ [[NSCustomTouchBarItem alloc] initWithIdentifier:id];
+ item.view = touchbar_view;
+ item.customizationLabel = touchbar_cid;
+
+ if ([self isAnimating])
+ // TouchBar was created after animation begun.
+ [touchbar_view startAnimation];
+ }
+ return nil;
+}
+
+#endif // USE_TOUCHBAR
+
+
+static void
+screenhack_do_fps (Display *dpy, Window w, fps_state *fpst, void *closure)
+{
+ fps_compute (fpst, 0, -1);
+ fps_draw (fpst);
+}
+
+
+/* Some of the older X11 savers look bad if a "pixel" is not a thing you can
+ see. They expect big, chunky, luxurious 1990s pixels, and if they use
+ "device" pixels on a Retina screen, everything just disappears.
+
+ Retina iPads have 768x1024 point screens which are 1536x2048 pixels,
+ 2017 iMac screens are 5120x2880 in device pixels.
+
+ This method is overridden in XScreenSaverGLView, since this kludge
+ isn't necessary for GL programs, being resolution independent by
+ nature.
+ */
+- (CGFloat) hackedContentScaleFactor
+{
+# ifdef USE_IPHONE
+ CGFloat s = self.contentScaleFactor;
+# else
+ CGFloat s = self.window.backingScaleFactor;
+# endif
+
+ if (_lowrez_p) {
+ NSSize b = [self bounds].size;
+ CGFloat wh = b.width > b.height ? b.width : b.height;
+
+ // Scale down to as close to 1024 as we can get without going under,
+ // while keeping an integral scale factor so that we don't get banding
+ // artifacts and moire patterns.
+ //
+ // Retina sizes: 2208 => 1104, 2224 => 1112, 2732 => 1366, 2880 => 1440.
+ //
+ int s2 = wh / 1024;
+ if (s2) s /= s2;
+ }
+
+ return s;
+}
+
+
+#ifdef USE_IPHONE
+
+double
+current_device_rotation (void)
+{
+ UIDeviceOrientation o = [[UIDevice currentDevice] orientation];
+
+ /* Sometimes UIDevice doesn't know the proper orientation, or the device is
+ face up/face down, so in those cases fall back to the status bar
+ orientation. The SaverViewController tries to set the status bar to the
+ proper orientation before it creates the XScreenSaverView; see
+ _storedOrientation in SaverViewController.
+ */
+ if (o == UIDeviceOrientationUnknown ||
+ o == UIDeviceOrientationFaceUp ||
+ o == UIDeviceOrientationFaceDown) {
+ /* Mind the differences between UIInterfaceOrientation and
+ UIDeviceOrientation:
+ 1. UIInterfaceOrientation does not include FaceUp and FaceDown.
+ 2. LandscapeLeft and LandscapeRight are swapped between the two. But
+ converting between device and interface orientation doesn't need to
+ take this into account, because (from the UIInterfaceOrientation
+ description): "rotating the device requires rotating the content in
+ the opposite direction."
+ */
+ /* statusBarOrientation deprecated in iOS 9 */
+ o = (UIDeviceOrientation) // from UIInterfaceOrientation
+ [UIApplication sharedApplication].statusBarOrientation;
+ }
+
+ switch (o) {
+ case UIDeviceOrientationLandscapeLeft: return -90; break;
+ case UIDeviceOrientationLandscapeRight: return 90; break;
+ case UIDeviceOrientationPortraitUpsideDown: return 180; break;
+ default: return 0; break;
+ }
+}
+
+
+- (void) handleException: (NSException *)e
+{
+ NSLog (@"Caught exception: %@", e);
+ UIAlertController *c = [UIAlertController
+ alertControllerWithTitle:
+ [NSString stringWithFormat: @"%s crashed!",
+ xsft->progclass]
+ message: [NSString stringWithFormat:
+ @"The error message was:"
+ "\n\n%@\n\n"
+ "If it keeps crashing, try "
+ "resetting its options.",
+ e]
+ preferredStyle:UIAlertControllerStyleAlert];
+
+ [c addAction: [UIAlertAction actionWithTitle: @"Exit"
+ style: UIAlertActionStyleDefault
+ handler: ^(UIAlertAction *a) {
+ exit (-1);
+ }]];
+ [c addAction: [UIAlertAction actionWithTitle: @"Keep going"
+ style: UIAlertActionStyleDefault
+ handler: ^(UIAlertAction *a) {
+ [self stopAndClose:NO];
+ }]];
+
+ UIViewController *vc =
+ [UIApplication sharedApplication].keyWindow.rootViewController;
+ while (vc.presentedViewController)
+ vc = vc.presentedViewController;
+ [vc presentViewController:c animated:YES completion:nil];
+ [self stopAnimation];
+}
+
+#endif // USE_IPHONE
+
+
+#ifdef JWXYZ_QUARTZ
+
+# ifndef USE_IPHONE
+
+struct gl_version
+{
+ // iOS always uses OpenGL ES 1.1.
+ unsigned major;
+ unsigned minor;
+};
+
+static GLboolean
+gl_check_ver (const struct gl_version *caps,
+ unsigned gl_major,
+ unsigned gl_minor)
+{
+ return caps->major > gl_major ||
+ (caps->major == gl_major && caps->minor >= gl_minor);
+}
+
+# endif
+
+/* Called during startAnimation before the first call to createBackbuffer. */
+- (void) enableBackbuffer:(CGSize)new_backbuffer_size
+{
+# ifndef USE_IPHONE
+ struct gl_version version;
+
+ {
+ const char *version_str = (const char *)glGetString (GL_VERSION);
+
+ /* iPhone is always OpenGL ES 1.1. */
+ if (sscanf ((const char *)version_str, "%u.%u",
+ &version.major, &version.minor) < 2)
+ {
+ version.major = 1;
+ version.minor = 1;
+ }
+ }
+# endif
+
+ // The OpenGL extensions in use in here are pretty are pretty much ubiquitous
+ // on OS X, but it's still good form to check.
+ const GLubyte *extensions = glGetString (GL_EXTENSIONS);
+
+ glGenTextures (1, &backbuffer_texture);
+
+ // On really old systems, it would make sense to split the texture
+ // into subsections
+# ifndef USE_IPHONE
+ gl_texture_target = (gluCheckExtension ((const GLubyte *)
+ "GL_ARB_texture_rectangle",
+ extensions)
+ ? GL_TEXTURE_RECTANGLE_EXT : GL_TEXTURE_2D);
+# else
+ // OES_texture_npot also provides this, but iOS never provides it.
+ gl_limited_npot_p = jwzgles_gluCheckExtension
+ ((const GLubyte *) "GL_APPLE_texture_2D_limited_npot", extensions);
+ gl_texture_target = GL_TEXTURE_2D;
+# endif
+
+ glBindTexture (gl_texture_target, backbuffer_texture);
+ glTexParameteri (gl_texture_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ // GL_LINEAR might make sense on Retina iPads.
+ glTexParameteri (gl_texture_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri (gl_texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri (gl_texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+# ifndef USE_IPHONE
+ // There isn't much sense in supporting one of these if the other
+ // isn't present.
+ gl_apple_client_storage_p =
+ gluCheckExtension ((const GLubyte *)"GL_APPLE_client_storage",
+ extensions) &&
+ gluCheckExtension ((const GLubyte *)"GL_APPLE_texture_range", extensions);
+
+ if (gl_apple_client_storage_p) {
+ glTexParameteri (gl_texture_target, GL_TEXTURE_STORAGE_HINT_APPLE,
+ GL_STORAGE_SHARED_APPLE);
+ glPixelStorei (GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE);
+ }
+# endif
+
+ // If a video adapter suports BGRA textures, then that's probably as fast as
+ // you're gonna get for getting a texture onto the screen.
+# ifdef USE_IPHONE
+ gl_pixel_format =
+ jwzgles_gluCheckExtension
+ ((const GLubyte *)"GL_APPLE_texture_format_BGRA8888", extensions) ?
+ GL_BGRA :
+ GL_RGBA;
+
+ gl_pixel_type = GL_UNSIGNED_BYTE;
+ // See also OES_read_format.
+# else
+ if (gl_check_ver (&version, 1, 2) ||
+ (gluCheckExtension ((const GLubyte *)"GL_EXT_bgra", extensions) &&
+ gluCheckExtension ((const GLubyte *)"GL_APPLE_packed_pixels",
+ extensions))) {
+ gl_pixel_format = GL_BGRA;
+ // Both Intel and PowerPC-era docs say to use GL_UNSIGNED_INT_8_8_8_8_REV.
+ gl_pixel_type = GL_UNSIGNED_INT_8_8_8_8_REV;
+ } else {
+ gl_pixel_format = GL_RGBA;
+ gl_pixel_type = GL_UNSIGNED_BYTE;
+ }
+ // GL_ABGR_EXT/GL_UNSIGNED_BYTE is another possibilty that may have made more
+ // sense on PowerPC.
+# endif
+
+ glEnable (gl_texture_target);
+ glEnableClientState (GL_VERTEX_ARRAY);
+ glEnableClientState (GL_TEXTURE_COORD_ARRAY);
+
+ check_gl_error ("enableBackbuffer");
+}
+
+
+#ifdef USE_IPHONE
+- (BOOL) suppressRotationAnimation
+{
+ return [self ignoreRotation]; // Don't animate if we aren't rotating
+}
+
+- (BOOL) rotateTouches
+{
+ return FALSE; // Adjust event coordinates only if rotating
+}
+#endif
+
+
+- (void) setViewport
+{
+# ifdef BACKBUFFER_OPENGL
+ NSAssert ([NSOpenGLContext currentContext] ==
+ ogl_ctx, @"invalid GL context");
+
+ NSSize new_size = self.bounds.size;
+
+# ifdef USE_IPHONE
+ GLfloat s = self.contentScaleFactor;
+# else // !USE_IPHONE
+ const GLfloat s = self.window.backingScaleFactor;
+# endif
+ GLfloat hs = self.hackedContentScaleFactor;
+
+ // On OS X this almost isn't necessary, except for the ugly aliasing
+ // artifacts.
+ glViewport (0, 0, new_size.width * s, new_size.height * s);
+
+ glMatrixMode (GL_PROJECTION);
+ glLoadIdentity();
+# ifdef USE_IPHONE
+ glOrthof
+# else
+ glOrtho
+# endif
+ (-new_size.width * hs, new_size.width * hs,
+ -new_size.height * hs, new_size.height * hs,
+ -1, 1);
+
+# ifdef USE_IPHONE
+ if ([self ignoreRotation]) {
+ int o = (int) -current_device_rotation();
+ glRotatef (o, 0, 0, 1);
+ }
+# endif // USE_IPHONE
+# endif // BACKBUFFER_OPENGL
+}
+
+
+/* Create a bitmap context into which we render everything.
+ If the desired size has changed, re-created it.
+ new_size is in rotated pixels, not points: the same size
+ and shape as the X11 window as seen by the hacks.
+ */
+- (void) createBackbuffer:(CGSize)new_size
+{
+ CGSize osize = CGSizeZero;
+ if (backbuffer) {
+ osize.width = CGBitmapContextGetWidth(backbuffer);
+ osize.height = CGBitmapContextGetHeight(backbuffer);
+ }
+
+ if (backbuffer &&
+ (int)osize.width == (int)new_size.width &&
+ (int)osize.height == (int)new_size.height)
+ return;
+
+ CGContextRef ob = backbuffer;
+ void *odata = backbuffer_data;
+ GLsizei olen = backbuffer_len;
+
+# if !defined __OPTIMIZE__ || TARGET_IPHONE_SIMULATOR
+ NSLog(@"backbuffer %.0fx%.0f",
+ new_size.width, new_size.height);
+# endif
+
+ /* OS X uses APPLE_client_storage and APPLE_texture_range, as described in
+ <https://developer.apple.com/library/mac/documentation/GraphicsImaging/Conceptual/OpenGL-MacProgGuide/opengl_texturedata/opengl_texturedata.html>.
+
+ iOS uses bog-standard glTexImage2D (for now).
+
+ glMapBuffer is the standard way to get data from system RAM to video
+ memory asynchronously and without a memcpy, but support for
+ APPLE_client_storage is ubiquitous on OS X (not so for glMapBuffer),
+ and on iOS GL_PIXEL_UNPACK_BUFFER is only available on OpenGL ES 3
+ (iPhone 5S or newer). Plus, glMapBuffer doesn't work well with
+ CGBitmapContext: glMapBuffer can return a different pointer on each
+ call, but a CGBitmapContext doesn't allow its data pointer to be
+ changed -- and recreating the context for a new pointer can be
+ expensive (glyph caches get dumped, for instance).
+
+ glMapBufferRange has MAP_FLUSH_EXPLICIT_BIT and MAP_UNSYNCHRONIZED_BIT,
+ and these seem to allow mapping the buffer and leaving it where it is
+ in client address space while OpenGL works with the buffer, but it
+ requires OpenGL 3 Core profile on OS X (and ES 3 on iOS for
+ GL_PIXEL_UNPACK_BUFFER), so point goes to APPLE_client_storage.
+
+ AMD_pinned_buffer provides the same advantage as glMapBufferRange, but
+ Apple never implemented that one for OS X.
+ */
+
+ backbuffer_data = NULL;
+ gl_texture_w = (int)new_size.width;
+ gl_texture_h = (int)new_size.height;
+
+ NSAssert (gl_texture_target == GL_TEXTURE_2D
+# ifndef USE_IPHONE
+ || gl_texture_target == GL_TEXTURE_RECTANGLE_EXT
+# endif
+ , @"unexpected GL texture target");
+
+# ifndef USE_IPHONE
+ if (gl_texture_target != GL_TEXTURE_RECTANGLE_EXT)
+# else
+ if (!gl_limited_npot_p)
+# endif
+ {
+ gl_texture_w = (GLsizei) to_pow2 (gl_texture_w);
+ gl_texture_h = (GLsizei) to_pow2 (gl_texture_h);
+ }
+
+ GLsizei bytes_per_row = gl_texture_w * 4;
+
+# if defined(BACKBUFFER_OPENGL) && !defined(USE_IPHONE)
+ // APPLE_client_storage requires texture width to be aligned to 32 bytes, or
+ // it will fall back to a memcpy.
+ // https://developer.apple.com/library/mac/documentation/GraphicsImaging/Conceptual/OpenGL-MacProgGuide/opengl_texturedata/opengl_texturedata.html#//apple_ref/doc/uid/TP40001987-CH407-SW24
+ bytes_per_row = (bytes_per_row + 31) & ~31;
+# endif // BACKBUFFER_OPENGL && !USE_IPHONE
+
+ backbuffer_len = bytes_per_row * gl_texture_h;
+ if (backbuffer_len) // mmap requires this to be non-zero.
+ backbuffer_data = mmap (NULL, backbuffer_len,
+ PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED,
+ -1, 0);
+
+ BOOL alpha_first_p, order_little_p;
+
+ if (gl_pixel_format == GL_BGRA) {
+ alpha_first_p = YES;
+ order_little_p = YES;
+/*
+ } else if (gl_pixel_format == GL_ABGR_EXT) {
+ alpha_first_p = NO;
+ order_little_p = YES; */
+ } else {
+ NSAssert (gl_pixel_format == GL_RGBA, @"unknown GL pixel format");
+ alpha_first_p = NO;
+ order_little_p = NO;
+ }
+
+#ifdef USE_IPHONE
+ NSAssert (gl_pixel_type == GL_UNSIGNED_BYTE, @"unknown GL pixel type");
+#else
+ NSAssert (gl_pixel_type == GL_UNSIGNED_INT_8_8_8_8 ||
+ gl_pixel_type == GL_UNSIGNED_INT_8_8_8_8_REV ||
+ gl_pixel_type == GL_UNSIGNED_BYTE,
+ @"unknown GL pixel type");
+
+#if defined __LITTLE_ENDIAN__
+ const GLenum backwards_pixel_type = GL_UNSIGNED_INT_8_8_8_8;
+#elif defined __BIG_ENDIAN__
+ const GLenum backwards_pixel_type = GL_UNSIGNED_INT_8_8_8_8_REV;
+#else
+# error Unknown byte order.
+#endif
+
+ if (gl_pixel_type == backwards_pixel_type)
+ order_little_p ^= YES;
+#endif
+
+ CGBitmapInfo bitmap_info =
+ (alpha_first_p ? kCGImageAlphaNoneSkipFirst : kCGImageAlphaNoneSkipLast) |
+ (order_little_p ? kCGBitmapByteOrder32Little : kCGBitmapByteOrder32Big);
+
+ backbuffer = CGBitmapContextCreate (backbuffer_data,
+ (int)new_size.width,
+ (int)new_size.height,
+ 8,
+ bytes_per_row,
+ colorspace,
+ bitmap_info);
+ NSAssert (backbuffer, @"unable to allocate back buffer");
+
+ // Clear it.
+ CGRect r;
+ r.origin.x = r.origin.y = 0;
+ r.size = new_size;
+ CGContextSetGrayFillColor (backbuffer, 0, 1);
+ CGContextFillRect (backbuffer, r);
+
+# if defined(BACKBUFFER_OPENGL) && !defined(USE_IPHONE)
+ if (gl_apple_client_storage_p)
+ glTextureRangeAPPLE (gl_texture_target, backbuffer_len, backbuffer_data);
+# endif // BACKBUFFER_OPENGL && !USE_IPHONE
+
+ if (ob) {
+ // Restore old bits, as much as possible, to the X11 upper left origin.
+
+ CGRect rect; // pixels, not points
+ rect.origin.x = 0;
+ rect.origin.y = (new_size.height - osize.height);
+ rect.size = osize;
+
+ CGImageRef img = CGBitmapContextCreateImage (ob);
+ CGContextDrawImage (backbuffer, rect, img);
+ CGImageRelease (img);
+ CGContextRelease (ob);
+
+ if (olen)
+ // munmap should round len up to the nearest page.
+ munmap (odata, olen);
+ }
+
+ check_gl_error ("createBackbuffer");
+}
+
+
+- (void) drawBackbuffer
+{
+# ifdef BACKBUFFER_OPENGL
+
+ NSAssert ([ogl_ctx isKindOfClass:[NSOpenGLContext class]],
+ @"ogl_ctx is not an NSOpenGLContext");
+
+ NSAssert (! (CGBitmapContextGetBytesPerRow (backbuffer) % 4),
+ @"improperly-aligned backbuffer");
+
+ // This gets width and height from the backbuffer in case
+ // APPLE_client_storage is in use. See the note in createBackbuffer.
+ // This still has to happen every frame even when APPLE_client_storage has
+ // the video adapter pulling texture data straight from
+ // XScreenSaverView-owned memory.
+ glTexImage2D (gl_texture_target, 0, GL_RGBA,
+ (GLsizei)(CGBitmapContextGetBytesPerRow (backbuffer) / 4),
+ gl_texture_h, 0, gl_pixel_format, gl_pixel_type,
+ backbuffer_data);
+
+ GLfloat w = xwindow->frame.width, h = xwindow->frame.height;
+
+ GLfloat vertices[4][2] = {{-w, h}, {w, h}, {w, -h}, {-w, -h}};
+
+ GLfloat tex_coords[4][2];
+
+# ifndef USE_IPHONE
+ if (gl_texture_target != GL_TEXTURE_RECTANGLE_EXT)
+# endif // USE_IPHONE
+ {
+ w /= gl_texture_w;
+ h /= gl_texture_h;
+ }
+
+ tex_coords[0][0] = 0;
+ tex_coords[0][1] = 0;
+ tex_coords[1][0] = w;
+ tex_coords[1][1] = 0;
+ tex_coords[2][0] = w;
+ tex_coords[2][1] = h;
+ tex_coords[3][0] = 0;
+ tex_coords[3][1] = h;
+
+ glVertexPointer (2, GL_FLOAT, 0, vertices);
+ glTexCoordPointer (2, GL_FLOAT, 0, tex_coords);
+ glDrawArrays (GL_TRIANGLE_FAN, 0, 4);
+
+# if !defined __OPTIMIZE__ || TARGET_IPHONE_SIMULATOR
+ check_gl_error ("drawBackbuffer");
+# endif
+# endif // BACKBUFFER_OPENGL
+}
+
+#endif // JWXYZ_QUARTZ
+
+#ifdef JWXYZ_GL
+
+- (void)enableBackbuffer:(CGSize)new_backbuffer_size;
+{
+ jwxyz_set_matrices (new_backbuffer_size.width, new_backbuffer_size.height);
+ check_gl_error ("enableBackbuffer");
+}
+
+- (void)createBackbuffer:(CGSize)new_size
+{
+ NSAssert ([NSOpenGLContext currentContext] ==
+ ogl_ctx, @"invalid GL context");
+ NSAssert (xwindow->window.current_drawable == xwindow,
+ @"current_drawable not set properly");
+
+# ifndef USE_IPHONE
+ /* On iOS, Retina means glViewport gets called with the screen size instead
+ of the backbuffer/xwindow size. This happens in startAnimation.
+
+ The GL screenhacks call glViewport themselves.
+ */
+ glViewport (0, 0, new_size.width, new_size.height);
+# endif
+
+ // TODO: Preserve contents on resize.
+ glClear (GL_COLOR_BUFFER_BIT);
+ check_gl_error ("createBackbuffer");
+}
+
+#endif // JWXYZ_GL
+
+
+- (void)flushBackbuffer
+{
+# ifdef JWXYZ_GL
+ // Make sure the right context is active: there's two under JWXYZ_GL.
+ jwxyz_bind_drawable (xwindow, xwindow);
+# endif // JWXYZ_GL
+
+# ifndef USE_IPHONE
+
+# ifdef JWXYZ_QUARTZ
+ // The OpenGL pipeline is not automatically synchronized with the contents
+ // of the backbuffer, so without glFinish, OpenGL can start rendering from
+ // the backbuffer texture at the same time that JWXYZ is clearing and
+ // drawing the next frame in the backing store for the backbuffer texture.
+ // This is only a concern under JWXYZ_QUARTZ because of
+ // APPLE_client_storage; JWXYZ_GL doesn't use that.
+ glFinish();
+# endif // JWXYZ_QUARTZ
+
+ // If JWXYZ_GL was single-buffered, there would need to be a glFinish (or
+ // maybe just glFlush?) here, because single-buffered contexts don't always
+ // update what's on the screen after drawing finishes. (i.e., in safe mode)
+
+# ifdef JWXYZ_QUARTZ
+ // JWXYZ_GL is always double-buffered.
+ if (double_buffered_p)
+# endif // JWXYZ_QUARTZ
+ [ogl_ctx flushBuffer]; // despite name, this actually swaps
+# else // USE_IPHONE
+
+ // jwxyz_bind_drawable() only binds the framebuffer, not the renderbuffer.
+# ifdef JWXYZ_GL
+ GLint gl_renderbuffer = xwindow->gl_renderbuffer;
+# endif
+
+ glBindRenderbufferOES (GL_RENDERBUFFER_OES, gl_renderbuffer);
+ [ogl_ctx presentRenderbuffer:GL_RENDERBUFFER_OES];
+# endif // USE_IPHONE
+
+# if !defined __OPTIMIZE__ || TARGET_IPHONE_SIMULATOR
+ // glGetError waits for the OpenGL command pipe to flush, so skip it in
+ // release builds.
+ // OpenGL Programming Guide for Mac -> OpenGL Application Design
+ // Strategies -> Allow OpenGL to Manage Your Resources
+ // https://developer.apple.com/library/mac/documentation/GraphicsImaging/Conceptual/OpenGL-MacProgGuide/opengl_designstrategies/opengl_designstrategies.html#//apple_ref/doc/uid/TP40001987-CH2-SW7
+ check_gl_error ("flushBackbuffer");
+# endif
+}
+
+
+/* Inform X11 that the size of our window has changed.
+ */
+- (void) resize_x11
+{
+ if (!xdpy) return; // early
+
+ NSSize new_size; // pixels, not points
+
+ new_size = self.bounds.size;
+
+# ifdef USE_IPHONE
+
+ // If this hack ignores rotation, then that means that it pretends to
+ // always be in portrait mode. If the View has been resized to a
+ // landscape shape, swap width and height to keep the backbuffer
+ // in portrait.
+ //
+ double rot = current_device_rotation();
+ if ([self ignoreRotation] && (rot == 90 || rot == -90)) {
+ CGFloat swap = new_size.width;
+ new_size.width = new_size.height;
+ new_size.height = swap;
+ }
+# endif // USE_IPHONE
+
+ double s = self.hackedContentScaleFactor;
+ new_size.width *= s;
+ new_size.height *= s;
+
+ [self prepareContext];
+ [self setViewport];
+
+ // On first resize, xwindow->frame is 0x0.
+ if (xwindow->frame.width == new_size.width &&
+ xwindow->frame.height == new_size.height)
+ return;
+
+# if defined(BACKBUFFER_OPENGL) && !defined(USE_IPHONE)
+ [ogl_ctx update];
+# endif // BACKBUFFER_OPENGL && !USE_IPHONE
+
+ NSAssert (xwindow && xwindow->type == WINDOW, @"not a window");
+ xwindow->frame.x = 0;
+ xwindow->frame.y = 0;
+ xwindow->frame.width = new_size.width;
+ xwindow->frame.height = new_size.height;
+
+ [self createBackbuffer:CGSizeMake(xwindow->frame.width,
+ xwindow->frame.height)];
+
+# if defined JWXYZ_QUARTZ
+ xwindow->cgc = backbuffer;
+ NSAssert (xwindow->cgc, @"no CGContext");
+# elif defined JWXYZ_GL && !defined USE_IPHONE
+ [ogl_ctx update];
+ [ogl_ctx setView:xwindow->window.view]; // (Is this necessary?)
+# endif // JWXYZ_GL && USE_IPHONE
+
+ jwxyz_window_resized (xdpy);
+
+# if !defined __OPTIMIZE__ || TARGET_IPHONE_SIMULATOR
+ NSLog(@"reshape %.0fx%.0f", new_size.width, new_size.height);
+# endif
+
+ // Next time render_x11 is called, run the saver's reshape_cb.
+ resized_p = YES;
+}
+
+
+#ifdef USE_IPHONE
+
+/* Called by SaverRunner when the device has changed orientation.
+ That means we need to generate a resize event, even if the size
+ has not changed (e.g., from LandscapeLeft to LandscapeRight).
+ */
+- (void) orientationChanged
+{
+ [self setViewport];
+ resized_p = YES;
+ next_frame_time = 0; // Get a new frame on screen quickly
+}
+
+/* A hook run after the 'reshape_' method has been called. Used by
+ XScreenSaverGLView to adjust the in-scene GL viewport.
+ */
+- (void) postReshape
+{
+}
+#endif // USE_IPHONE
+
+
+// Only render_x11 should call this. XScreenSaverGLView specializes it.
+- (void) reshape_x11
+{
+ xsft->reshape_cb (xdpy, xwindow, xdata,
+ xwindow->frame.width, xwindow->frame.height);
+}
+
+- (void) render_x11
+{
+# ifdef USE_IPHONE
+ @try {
+# endif
+
+ // jwxyz_make_display needs this.
+ [self prepareContext]; // resize_x11 also calls this.
+
+ if (!initted_p) {
+
+ resized_p = NO;
+
+ if (! xdpy) {
+# ifdef JWXYZ_QUARTZ
+ xwindow->cgc = backbuffer;
+# endif // JWXYZ_QUARTZ
+ xdpy = jwxyz_quartz_make_display (xwindow);
+
+# if defined USE_IPHONE
+ /* Some X11 hacks (fluidballs) want to ignore all rotation events. */
+ _ignoreRotation =
+# ifdef JWXYZ_GL
+ TRUE; // Rotation doesn't work yet. TODO: Make rotation work.
+# else // !JWXYZ_GL
+ get_boolean_resource (xdpy, "ignoreRotation", "IgnoreRotation");
+# endif // !JWXYZ_GL
+# endif // USE_IPHONE
+
+ _lowrez_p = get_boolean_resource (xdpy, "lowrez", "Lowrez");
+ if (_lowrez_p) {
+ resized_p = YES;
+
+# if !defined __OPTIMIZE__ || TARGET_IPHONE_SIMULATOR
+ NSSize b = [self bounds].size;
+ CGFloat s = self.hackedContentScaleFactor;
+# ifdef USE_IPHONE
+ CGFloat o = self.contentScaleFactor;
+# else
+ CGFloat o = self.window.backingScaleFactor;
+# endif
+ if (o != s)
+ NSLog(@"lowrez: scaling %.0fx%.0f -> %.0fx%.0f (%.02f)",
+ b.width * o, b.height * o,
+ b.width * s, b.height * s, s);
+# endif
+ }
+
+ [self resize_x11];
+ }
+
+ if (!setup_p) {
+ setup_p = YES;
+ if (xsft->setup_cb)
+ xsft->setup_cb (xsft, xsft->setup_arg);
+ }
+ initted_p = YES;
+ NSAssert(!xdata, @"xdata already initialized");
+
+
+# undef ya_rand_init
+ ya_rand_init (0);
+
+ XSetWindowBackground (xdpy, xwindow,
+ get_pixel_resource (xdpy, 0,
+ "background", "Background"));
+ XClearWindow (xdpy, xwindow);
+
+# ifndef USE_IPHONE
+ [[self window] setAcceptsMouseMovedEvents:YES];
+# endif
+
+ /* In MacOS 10.5, this enables "QuartzGL", meaning that the Quartz
+ drawing primitives will run on the GPU instead of the CPU.
+ It seems like it might make things worse rather than better,
+ though... Plus it makes us binary-incompatible with 10.4.
+
+# if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+ [[self window] setPreferredBackingLocation:
+ NSWindowBackingLocationVideoMemory];
+# endif
+ */
+
+ /* Kludge: even though the init_cb functions are declared to take 2 args,
+ actually call them with 3, for the benefit of xlockmore_init() and
+ xlockmore_setup().
+ */
+ void *(*init_cb) (Display *, Window, void *) =
+ (void *(*) (Display *, Window, void *)) xsft->init_cb;
+
+ xdata = init_cb (xdpy, xwindow, xsft->setup_arg);
+ // NSAssert(xdata, @"no xdata from init");
+ if (! xdata) abort();
+
+ if (get_boolean_resource (xdpy, "doFPS", "DoFPS")) {
+ fpst = fps_init (xdpy, xwindow);
+ fps_cb = xsft->fps_cb;
+ if (! fps_cb) fps_cb = screenhack_do_fps;
+ } else {
+ fpst = NULL;
+ fps_cb = 0;
+ }
+
+# ifdef USE_IPHONE
+ if (current_device_rotation() != 0) // launched while rotated
+ resized_p = YES;
+# endif
+
+ [self checkForUpdates];
+ }
+
+
+ /* I don't understand why we have to do this *every frame*, but we do,
+ or else the cursor comes back on.
+ */
+# ifndef USE_IPHONE
+ if (![self isPreview])
+ [NSCursor setHiddenUntilMouseMoves:YES];
+# endif
+
+
+ if (fpst)
+ {
+ /* This is just a guess, but the -fps code wants to know how long
+ we were sleeping between frames.
+ */
+ long usecs = 1000000 * [self animationTimeInterval];
+ usecs -= 200; // caller apparently sleeps for slightly less sometimes...
+ if (usecs < 0) usecs = 0;
+ fps_slept (fpst, usecs);
+ }
+
+
+ /* Run any XtAppAddInput and XtAppAddTimeOut callbacks now.
+ Do this before delaying for next_frame_time to avoid throttling
+ timers to the hack's frame rate.
+ */
+ XtAppProcessEvent (XtDisplayToApplicationContext (xdpy),
+ XtIMTimer | XtIMAlternateInput);
+
+
+ /* It turns out that on some systems (possibly only 10.5 and older?)
+ [ScreenSaverView setAnimationTimeInterval] does nothing. This means
+ that we cannot rely on it.
+
+ Some of the screen hacks want to delay for long periods, and letting the
+ framework run the update function at 30 FPS when it really wanted half a
+ minute between frames would be bad. So instead, we assume that the
+ framework's animation timer might fire whenever, but we only invoke the
+ screen hack's "draw frame" method when enough time has expired.
+
+ This means two extra calls to gettimeofday() per frame. For fast-cycling
+ screen savers, that might actually slow them down. Oh well.
+
+ A side-effect of this is that it's not possible for a saver to request
+ an animation interval that is faster than animationTimeInterval.
+
+ HOWEVER! On modern systems where setAnimationTimeInterval is *not*
+ ignored, it's important that it be faster than 30 FPS. 240 FPS is good.
+
+ An NSTimer won't fire if the timer is already running the invocation
+ function from a previous firing. So, if we use a 30 FPS
+ animationTimeInterval (33333 s) and a screenhack takes 40000 s for a
+ frame, there will be a 26666 s delay until the next frame, 66666 s
+ after the beginning of the current frame. In other words, 25 FPS
+ becomes 15 FPS.
+
+ Frame rates tend to snap to values of 30/N, where N is a positive
+ integer, i.e. 30 FPS, 15 FPS, 10, 7.5, 6. And the 'snapped' frame rate
+ is rounded down from what it would normally be.
+
+ So if we set animationTimeInterval to 1/240 instead of 1/30, frame rates
+ become values of 60/N, 120/N, or 240/N, with coarser or finer frame rate
+ steps for higher or lower animation time intervals respectively.
+ */
+ struct timeval tv;
+ gettimeofday (&tv, 0);
+ double now = tv.tv_sec + (tv.tv_usec / 1000000.0);
+ if (now < next_frame_time) return;
+
+ // [self flushBackbuffer];
+
+ if (resized_p) {
+ // We do this here instead of in setFrame so that all the
+ // Xlib drawing takes place under the animation timer.
+
+# ifndef USE_IPHONE
+ if (ogl_ctx)
+ [ogl_ctx setView:self];
+# endif // !USE_IPHONE
+
+ [self reshape_x11];
+ resized_p = NO;
+ }
+
+
+ // And finally:
+ //
+ // NSAssert(xdata, @"no xdata when drawing");
+ if (! xdata) abort();
+ unsigned long delay = xsft->draw_cb (xdpy, xwindow, xdata);
+ if (fpst && fps_cb)
+ fps_cb (xdpy, xwindow, fpst, xdata);
+
+ gettimeofday (&tv, 0);
+ now = tv.tv_sec + (tv.tv_usec / 1000000.0);
+ next_frame_time = now + (delay / 1000000.0);
+
+# ifdef JWXYZ_QUARTZ
+ [self drawBackbuffer];
+# endif
+ // This can also happen near the beginning of render_x11.
+ [self flushBackbuffer];
+
+# ifdef USE_IPHONE // Allow savers on the iPhone to run full-tilt.
+ if (delay < [self animationTimeInterval])
+ [self setAnimationTimeInterval:(delay / 1000000.0)];
+# endif
+
+# ifdef DO_GC_HACKERY
+ /* Current theory is that the 10.6 garbage collector sucks in the
+ following way:
+
+ It only does a collection when a threshold of outstanding
+ collectable allocations has been surpassed. However, CoreGraphics
+ creates lots of small collectable allocations that contain pointers
+ to very large non-collectable allocations: a small CG object that's
+ collectable referencing large malloc'd allocations (non-collectable)
+ containing bitmap data. So the large allocation doesn't get freed
+ until GC collects the small allocation, which triggers its finalizer
+ to run which frees the large allocation. So GC is deciding that it
+ doesn't really need to run, even though the process has gotten
+ enormous. GC eventually runs once pageouts have happened, but by
+ then it's too late, and the machine's resident set has been
+ sodomized.
+
+ So, we force an exhaustive garbage collection in this process
+ approximately every 5 seconds whether the system thinks it needs
+ one or not.
+ */
+ {
+ static int tick = 0;
+ if (++tick > 5*30) {
+ tick = 0;
+ objc_collect (OBJC_EXHAUSTIVE_COLLECTION);
+ }
+ }
+# endif // DO_GC_HACKERY
+
+# ifdef USE_IPHONE
+ }
+ @catch (NSException *e) {
+ [self handleException: e];
+ }
+# endif // USE_IPHONE
+}
+
+
+- (void) animateOneFrame
+{
+ // Render X11 into the backing store bitmap...
+
+# ifdef USE_TOUCHBAR
+ if (touchbar_p) return;
+# endif
+
+# ifdef JWXYZ_QUARTZ
+ NSAssert (backbuffer, @"no back buffer");
+
+# ifdef USE_IPHONE
+ UIGraphicsPushContext (backbuffer);
+# endif
+# endif // JWXYZ_QUARTZ
+
+ [self render_x11];
+
+# if defined USE_IPHONE && defined JWXYZ_QUARTZ
+ UIGraphicsPopContext();
+# endif
+
+# ifdef USE_TOUCHBAR
+ if (touchbar_view) [touchbar_view animateOneFrame];
+# endif
+}
+
+
+# ifndef USE_IPHONE // Doesn't exist on iOS
+
+- (void) setFrame:(NSRect) newRect
+{
+ [super setFrame:newRect];
+
+ if (xwindow) // inform Xlib that the window has changed now.
+ [self resize_x11];
+}
+
+- (void) setFrameSize:(NSSize) newSize
+{
+ [super setFrameSize:newSize];
+ if (xwindow)
+ [self resize_x11];
+}
+
+# else // USE_IPHONE
+
+- (void) layoutSubviews
+{
+ [super layoutSubviews];
+ [self resizeGL];
+ if (xwindow)
+ [self resize_x11];
+}
+
+# endif
+
+
++(BOOL) performGammaFade
+{
+ return YES;
+}
+
+- (BOOL) hasConfigureSheet
+{
+ return YES;
+}
+
++ (NSString *) decompressXML: (NSData *)data
+{
+ if (! data) return 0;
+ BOOL compressed_p = !!strncmp ((const char *) data.bytes, "<?xml", 5);
+
+ // If it's not already XML, decompress it.
+ NSAssert (compressed_p, @"xml isn't compressed");
+ if (compressed_p) {
+ NSMutableData *data2 = 0;
+ int ret = -1;
+ z_stream zs;
+ memset (&zs, 0, sizeof(zs));
+ ret = inflateInit2 (&zs, 16 + MAX_WBITS);
+ if (ret == Z_OK) {
+ UInt32 usize = * (UInt32 *) (data.bytes + data.length - 4);
+ data2 = [NSMutableData dataWithLength: usize];
+ zs.next_in = (Bytef *) data.bytes;
+ zs.avail_in = (uint) data.length;
+ zs.next_out = (Bytef *) data2.bytes;
+ zs.avail_out = (uint) data2.length;
+ ret = inflate (&zs, Z_FINISH);
+ inflateEnd (&zs);
+ }
+ if (ret == Z_OK || ret == Z_STREAM_END)
+ data = data2;
+ else
+ NSAssert2 (0, @"gunzip error: %d: %s",
+ ret, (zs.msg ? zs.msg : "<null>"));
+ }
+
+ NSString *s = [[NSString alloc]
+ initWithData:data encoding:NSUTF8StringEncoding];
+ [s autorelease];
+ return s;
+}
+
+
+#ifndef USE_IPHONE
+- (NSWindow *) configureSheet
+#else
+- (UIViewController *) configureView
+#endif
+{
+ NSBundle *bundle = [NSBundle bundleForClass:[self class]];
+ NSString *file = [NSString stringWithCString:xsft->progclass
+ encoding:NSISOLatin1StringEncoding];
+ file = [file lowercaseString];
+ NSString *path = [bundle pathForResource:file ofType:@"xml"];
+ if (!path) {
+ NSLog (@"%@.xml does not exist in the application bundle: %@/",
+ file, [bundle resourcePath]);
+ return nil;
+ }
+
+# ifdef USE_IPHONE
+ UIViewController *sheet;
+# else // !USE_IPHONE
+ NSWindow *sheet;
+# endif // !USE_IPHONE
+
+ NSData *xmld = [NSData dataWithContentsOfFile:path];
+ NSString *xml = [[self class] decompressXML: xmld];
+ sheet = [[XScreenSaverConfigSheet alloc]
+ initWithXML:[xml dataUsingEncoding:NSUTF8StringEncoding]
+ options:xsft->options
+ controller:[prefsReader userDefaultsController]
+ globalController:[prefsReader globalDefaultsController]
+ defaults:[prefsReader defaultOptions]];
+
+ // #### am I expected to retain this, or not? wtf.
+ // I thought not, but if I don't do this, we (sometimes) crash.
+ // #### Analyze says "potential leak of an object stored into sheet"
+ // [sheet retain];
+
+ return sheet;
+}
+
+
+- (NSUserDefaultsController *) userDefaultsController
+{
+ return [prefsReader userDefaultsController];
+}
+
+
+/* Announce our willingness to accept keyboard input.
+ */
+- (BOOL)acceptsFirstResponder
+{
+ return YES;
+}
+
+
+- (void) beep
+{
+# ifndef USE_IPHONE
+ NSBeep();
+# else // USE_IPHONE
+
+ // There's no way to play a standard system alert sound!
+ // We'd have to include our own WAV for that.
+ //
+ // Or we could vibrate:
+ // #import <AudioToolbox/AudioToolbox.h>
+ // AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
+ //
+ // Instead, just flash the screen white, then fade.
+ //
+ UIView *v = [[UIView alloc] initWithFrame: [self frame]];
+ [v setBackgroundColor: [UIColor whiteColor]];
+ [[self window] addSubview:v];
+ [UIView animateWithDuration: 0.1
+ animations:^{ [v setAlpha: 0.0]; }
+ completion:^(BOOL finished) { [v removeFromSuperview]; } ];
+
+# endif // USE_IPHONE
+}
+
+
+/* Send an XEvent to the hack. Returns YES if it was handled.
+ */
+- (BOOL) sendEvent: (XEvent *) e
+{
+ if (!initted_p || ![self isAnimating]) // no event handling unless running.
+ return NO;
+
+ [self lockFocus];
+ [self prepareContext];
+ BOOL result = xsft->event_cb (xdpy, xwindow, xdata, e);
+ [self unlockFocus];
+ return result;
+}
+
+
+#ifndef USE_IPHONE
+
+/* Convert an NSEvent into an XEvent, and pass it along.
+ Returns YES if it was handled.
+ */
+- (BOOL) convertEvent: (NSEvent *) e
+ type: (int) type
+{
+ XEvent xe;
+ memset (&xe, 0, sizeof(xe));
+
+ int state = 0;
+
+ int flags = [e modifierFlags];
+ if (flags & NSAlphaShiftKeyMask) state |= LockMask;
+ if (flags & NSShiftKeyMask) state |= ShiftMask;
+ if (flags & NSControlKeyMask) state |= ControlMask;
+ if (flags & NSAlternateKeyMask) state |= Mod1Mask;
+ if (flags & NSCommandKeyMask) state |= Mod2Mask;
+
+ NSPoint p = [[[e window] contentView] convertPoint:[e locationInWindow]
+ toView:self];
+ double s = [self hackedContentScaleFactor];
+ int x = s * p.x;
+ int y = s * ([self bounds].size.height - p.y);
+
+ xe.xany.type = type;
+ switch (type) {
+ case ButtonPress:
+ case ButtonRelease:
+ xe.xbutton.x = x;
+ xe.xbutton.y = y;
+ xe.xbutton.state = state;
+ if ([e type] == NSScrollWheel)
+ xe.xbutton.button = ([e deltaY] > 0 ? Button4 :
+ [e deltaY] < 0 ? Button5 :
+ [e deltaX] > 0 ? Button6 :
+ [e deltaX] < 0 ? Button7 :
+ 0);
+ else
+ xe.xbutton.button = (unsigned int) [e buttonNumber] + 1;
+ break;
+ case MotionNotify:
+ xe.xmotion.x = x;
+ xe.xmotion.y = y;
+ xe.xmotion.state = state;
+ break;
+ case KeyPress:
+ case KeyRelease:
+ {
+ NSString *ns = (([e type] == NSFlagsChanged) ? 0 :
+ [e charactersIgnoringModifiers]);
+ KeySym k = 0;
+
+ if (!ns || [ns length] == 0) // dead key
+ {
+ // Cocoa hides the difference between left and right keys.
+ // Also we only get KeyPress events for these, no KeyRelease
+ // (unless we hack the mod state manually. Bleh.)
+ //
+ if (flags & NSAlphaShiftKeyMask) k = XK_Caps_Lock;
+ else if (flags & NSShiftKeyMask) k = XK_Shift_L;
+ else if (flags & NSControlKeyMask) k = XK_Control_L;
+ else if (flags & NSAlternateKeyMask) k = XK_Alt_L;
+ else if (flags & NSCommandKeyMask) k = XK_Meta_L;
+ }
+ else if ([ns length] == 1) // real key
+ {
+ switch ([ns characterAtIndex:0]) {
+ case NSLeftArrowFunctionKey: k = XK_Left; break;
+ case NSRightArrowFunctionKey: k = XK_Right; break;
+ case NSUpArrowFunctionKey: k = XK_Up; break;
+ case NSDownArrowFunctionKey: k = XK_Down; break;
+ case NSPageUpFunctionKey: k = XK_Page_Up; break;
+ case NSPageDownFunctionKey: k = XK_Page_Down; break;
+ case NSHomeFunctionKey: k = XK_Home; break;
+ case NSPrevFunctionKey: k = XK_Prior; break;
+ case NSNextFunctionKey: k = XK_Next; break;
+ case NSBeginFunctionKey: k = XK_Begin; break;
+ case NSEndFunctionKey: k = XK_End; break;
+ case NSF1FunctionKey: k = XK_F1; break;
+ case NSF2FunctionKey: k = XK_F2; break;
+ case NSF3FunctionKey: k = XK_F3; break;
+ case NSF4FunctionKey: k = XK_F4; break;
+ case NSF5FunctionKey: k = XK_F5; break;
+ case NSF6FunctionKey: k = XK_F6; break;
+ case NSF7FunctionKey: k = XK_F7; break;
+ case NSF8FunctionKey: k = XK_F8; break;
+ case NSF9FunctionKey: k = XK_F9; break;
+ case NSF10FunctionKey: k = XK_F10; break;
+ case NSF11FunctionKey: k = XK_F11; break;
+ case NSF12FunctionKey: k = XK_F12; break;
+ default:
+ {
+ const char *ss =
+ [ns cStringUsingEncoding:NSISOLatin1StringEncoding];
+ k = (ss && *ss ? *ss : 0);
+ }
+ break;
+ }
+ }
+
+ if (! k) return YES; // E.g., "KeyRelease XK_Shift_L"
+
+ xe.xkey.keycode = k;
+ xe.xkey.state = state;
+ break;
+ }
+ default:
+ NSAssert1 (0, @"unknown X11 event type: %d", type);
+ break;
+ }
+
+ return [self sendEvent: &xe];
+}
+
+
+- (void) mouseDown: (NSEvent *) e
+{
+ if (! [self convertEvent:e type:ButtonPress])
+ [super mouseDown:e];
+}
+
+- (void) mouseUp: (NSEvent *) e
+{
+ if (! [self convertEvent:e type:ButtonRelease])
+ [super mouseUp:e];
+}
+
+- (void) otherMouseDown: (NSEvent *) e
+{
+ if (! [self convertEvent:e type:ButtonPress])
+ [super otherMouseDown:e];
+}
+
+- (void) otherMouseUp: (NSEvent *) e
+{
+ if (! [self convertEvent:e type:ButtonRelease])
+ [super otherMouseUp:e];
+}
+
+- (void) mouseMoved: (NSEvent *) e
+{
+ if (! [self convertEvent:e type:MotionNotify])
+ [super mouseMoved:e];
+}
+
+- (void) mouseDragged: (NSEvent *) e
+{
+ if (! [self convertEvent:e type:MotionNotify])
+ [super mouseDragged:e];
+}
+
+- (void) otherMouseDragged: (NSEvent *) e
+{
+ if (! [self convertEvent:e type:MotionNotify])
+ [super otherMouseDragged:e];
+}
+
+- (void) scrollWheel: (NSEvent *) e
+{
+ if (! [self convertEvent:e type:ButtonPress])
+ [super scrollWheel:e];
+}
+
+- (void) keyDown: (NSEvent *) e
+{
+ if (! [self convertEvent:e type:KeyPress])
+ [super keyDown:e];
+}
+
+- (void) keyUp: (NSEvent *) e
+{
+ if (! [self convertEvent:e type:KeyRelease])
+ [super keyUp:e];
+}
+
+- (void) flagsChanged: (NSEvent *) e
+{
+ if (! [self convertEvent:e type:KeyPress])
+ [super flagsChanged:e];
+}
+
+
+- (NSOpenGLPixelFormat *) getGLPixelFormat
+{
+ NSAssert (prefsReader, @"no prefsReader for getGLPixelFormat");
+
+ NSOpenGLPixelFormatAttribute attrs[40];
+ int i = 0;
+ attrs[i++] = NSOpenGLPFAColorSize; attrs[i++] = 24;
+
+/* OpenGL's core profile removes a lot of the same stuff that was removed in
+ OpenGL ES (e.g. glBegin, glDrawPixels), so it might be a possibility.
+
+ opengl_core_p = True;
+ if (opengl_core_p) {
+ attrs[i++] = NSOpenGLPFAOpenGLProfile;
+ attrs[i++] = NSOpenGLProfileVersion3_2Core;
+ }
+ */
+
+/* Eventually: multisampled pixmaps. May not be supported everywhere.
+ if (multi_sample_p) {
+ attrs[i++] = NSOpenGLPFASampleBuffers; attrs[i++] = 1;
+ attrs[i++] = NSOpenGLPFASamples; attrs[i++] = 6;
+ }
+ */
+
+# ifdef JWXYZ_QUARTZ
+ // Under Quartz, we're just blitting a texture.
+ if (double_buffered_p)
+ attrs[i++] = NSOpenGLPFADoubleBuffer;
+# endif
+
+# ifdef JWXYZ_GL
+ /* Under OpenGL, all sorts of drawing commands are being issued, and it might
+ be a performance problem if this activity occurs on the front buffer.
+ Also, some screenhacks expect OS X/iOS to always double-buffer.
+ NSOpenGLPFABackingStore prevents flickering with screenhacks that
+ don't redraw the entire screen every frame.
+ */
+ attrs[i++] = NSOpenGLPFADoubleBuffer;
+ attrs[i++] = NSOpenGLPFABackingStore;
+# endif
+
+ attrs[i++] = NSOpenGLPFAWindow;
+# ifdef JWXYZ_GL
+ attrs[i++] = NSOpenGLPFAPixelBuffer;
+ /* ...But not NSOpenGLPFAFullScreen, because that would be for
+ [NSOpenGLContext setFullScreen].
+ */
+# endif
+
+ /* NSOpenGLPFAFullScreen would go here if initWithFrame's isPreview == NO.
+ */
+
+ attrs[i] = 0;
+
+ NSOpenGLPixelFormat *p = [[NSOpenGLPixelFormat alloc]
+ initWithAttributes:attrs];
+ [p autorelease];
+ return p;
+}
+
+#else // USE_IPHONE
+
+
+- (void) stopAndClose
+{
+ [self stopAndClose:NO];
+}
+
+
+- (void) stopAndClose:(Bool)relaunch_p
+{
+ if ([self isAnimating])
+ [self stopAnimation];
+
+ /* Need to make the SaverListController be the firstResponder again
+ so that it can continue to receive its own shake events. I
+ suppose that this abstraction-breakage means that I'm adding
+ XScreenSaverView to the UINavigationController wrong...
+ */
+// UIViewController *v = [[self window] rootViewController];
+// if ([v isKindOfClass: [UINavigationController class]]) {
+// UINavigationController *n = (UINavigationController *) v;
+// [[n topViewController] becomeFirstResponder];
+// }
+ [self resignFirstResponder];
+
+ if (relaunch_p) { // Fake a shake on the SaverListController.
+ [_delegate didShake:self];
+ } else { // Not launching another, animate our return to the list.
+# if !defined __OPTIMIZE__ || TARGET_IPHONE_SIMULATOR
+ NSLog (@"fading back to saver list");
+# endif
+ [_delegate wantsFadeOut:self];
+ }
+}
+
+
+/* We distinguish between taps and drags.
+
+ - Drags/pans (down, motion, up) are sent to the saver to handle.
+ - Single-taps are sent to the saver to handle.
+ - Double-taps are sent to the saver as a "Space" keypress.
+ - Swipes (really, two-finger drags/pans) send Up/Down/Left/RightArrow keys.
+ - All taps expose the momentary "Close" button.
+ */
+
+- (void)initGestures
+{
+ UITapGestureRecognizer *dtap = [[UITapGestureRecognizer alloc]
+ initWithTarget:self
+ action:@selector(handleDoubleTap)];
+ dtap.numberOfTapsRequired = 2;
+ dtap.numberOfTouchesRequired = 1;
+
+ UITapGestureRecognizer *stap = [[UITapGestureRecognizer alloc]
+ initWithTarget:self
+ action:@selector(handleTap:)];
+ stap.numberOfTapsRequired = 1;
+ stap.numberOfTouchesRequired = 1;
+
+ UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]
+ initWithTarget:self
+ action:@selector(handlePan:)];
+ pan.maximumNumberOfTouches = 1;
+ pan.minimumNumberOfTouches = 1;
+
+ // I couldn't get Swipe to work, but using a second Pan recognizer works.
+ UIPanGestureRecognizer *pan2 = [[UIPanGestureRecognizer alloc]
+ initWithTarget:self
+ action:@selector(handlePan2:)];
+ pan2.maximumNumberOfTouches = 2;
+ pan2.minimumNumberOfTouches = 2;
+
+ // Also handle long-touch, and treat that the same as Pan.
+ // Without this, panning doesn't start until there's motion, so the trick
+ // of holding down your finger to freeze the scene doesn't work.
+ //
+ UILongPressGestureRecognizer *hold = [[UILongPressGestureRecognizer alloc]
+ initWithTarget:self
+ action:@selector(handleLongPress:)];
+ hold.numberOfTapsRequired = 0;
+ hold.numberOfTouchesRequired = 1;
+ hold.minimumPressDuration = 0.25; /* 1/4th second */
+
+ // Two finger pinch to zoom in on the view.
+ UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc]
+ initWithTarget:self
+ action:@selector(handlePinch:)];
+
+ [stap requireGestureRecognizerToFail: dtap];
+ [stap requireGestureRecognizerToFail: hold];
+ [dtap requireGestureRecognizerToFail: hold];
+ [pan requireGestureRecognizerToFail: hold];
+ [pan2 requireGestureRecognizerToFail: pinch];
+
+ [self setMultipleTouchEnabled:YES];
+
+ [self addGestureRecognizer: dtap];
+ [self addGestureRecognizer: stap];
+ [self addGestureRecognizer: pan];
+ [self addGestureRecognizer: pan2];
+ [self addGestureRecognizer: hold];
+ [self addGestureRecognizer: pinch];
+
+ [dtap release];
+ [stap release];
+ [pan release];
+ [pan2 release];
+ [hold release];
+ [pinch release];
+}
+
+
+/* Given a mouse (touch) coordinate in unrotated, unscaled view coordinates,
+ convert it to what X11 and OpenGL expect.
+
+ Getting this crap right is tricky, given the confusion of the various
+ scale factors, so here's a checklist that I think covers all of the X11
+ and OpenGL cases. For each of these: rotate to all 4 orientations;
+ ensure the mouse tracks properly to all 4 corners.
+
+ Test it in Xcode 6, because Xcode 5.0.2 can't run the iPhone6+ simulator.
+
+ Test hacks must cover:
+ X11 ignoreRotation = true
+ X11 ignoreRotation = false
+ OpenGL (rotation is handled manually, so they never ignoreRotation)
+
+ Test devices must cover:
+ contentScaleFactor = 1, hackedContentScaleFactor = 1 (iPad 2)
+ contentScaleFactor = 2, hackedContentScaleFactor = 1 (iPad Retina Air)
+ contentScaleFactor = 2, hackedContentScaleFactor = 2 (iPhone 5 5s 6 6+)
+
+ iPad 2: 768x1024 / 1 = 768x1024
+ iPad Air: 1536x2048 / 2 = 768x1024 (iPad Retina is identical)
+ iPhone 4s: 640x960 / 2 = 320x480
+ iPhone 5: 640x1136 / 2 = 320x568 (iPhone 5s and iPhone 6 are identical)
+ iPhone 6+: 640x1136 / 2 = 320x568 (nativeBounds 960x1704 nativeScale 3)
+
+ Tests:
+ iPad2 iPadAir iPhone4s iPhone5 iPhone6+
+ Attraction X yes - - - - Y
+ Fireworkx X no - - - - Y
+ Carousel GL yes - - - - Y
+ Voronoi GL no - - - - -
+ */
+- (void) convertMouse:(CGPoint *)p
+{
+ CGFloat xx = p->x, yy = p->y;
+
+# if 0 // TARGET_IPHONE_SIMULATOR
+ {
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (xdpy, xwindow, &xgwa);
+ NSLog (@"TOUCH %4g, %-4g in %4d x %-4d cs=%.0f hcs=%.0f r=%d ig=%d\n",
+ p->x, p->y,
+ xgwa.width, xgwa.height,
+ [self contentScaleFactor],
+ [self hackedContentScaleFactor],
+ [self rotateTouches], [self ignoreRotation]);
+ }
+# endif // TARGET_IPHONE_SIMULATOR
+
+ if ([self rotateTouches]) {
+
+ // The XScreenSaverGLView case:
+ // The X11 window is rotated, as is the framebuffer.
+ // The device coordinates match the framebuffer dimensions,
+ // but might have axes swapped... and we need to swap them
+ // by ratios.
+ //
+ int w = [self frame].size.width;
+ int h = [self frame].size.height;
+ GLfloat xr = (GLfloat) xx / w;
+ GLfloat yr = (GLfloat) yy / h;
+ GLfloat swap;
+ int o = (int) current_device_rotation();
+ switch (o) {
+ case -90: case 270: swap = xr; xr = 1-yr; yr = swap; break;
+ case 90: case -270: swap = xr; xr = yr; yr = 1-swap; break;
+ case 180: case -180: xr = 1-xr; yr = 1-yr; break;
+ default: break;
+ }
+ xx = xr * w;
+ yy = yr * h;
+
+ } else if ([self ignoreRotation]) {
+
+ // The X11 case, where the hack has opted not to rotate:
+ // The X11 window is unrotated, but the framebuffer is rotated.
+ // The device coordinates match the framebuffer, so they need to
+ // be de-rotated to match the X11 window.
+ //
+ int w = [self frame].size.width;
+ int h = [self frame].size.height;
+ int swap;
+ int o = (int) current_device_rotation();
+ switch (o) {
+ case -90: case 270: swap = xx; xx = h-yy; yy = swap; break;
+ case 90: case -270: swap = xx; xx = yy; yy = w-swap; break;
+ case 180: case -180: xx = w-xx; yy = h-yy; break;
+ default: break;
+ }
+ }
+
+ double s = [self hackedContentScaleFactor];
+ p->x = xx * s;
+ p->y = yy * s;
+
+# if 0 // TARGET_IPHONE_SIMULATOR || !defined __OPTIMIZE__
+ {
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (xdpy, xwindow, &xgwa);
+ NSLog (@"touch %4g, %-4g in %4d x %-4d cs=%.0f hcs=%.0f r=%d ig=%d\n",
+ p->x, p->y,
+ xgwa.width, xgwa.height,
+ [self contentScaleFactor],
+ [self hackedContentScaleFactor],
+ [self rotateTouches], [self ignoreRotation]);
+ if (p->x < 0 || p->y < 0 || p->x > xgwa.width || p->y > xgwa.height)
+ abort();
+ }
+# endif // TARGET_IPHONE_SIMULATOR
+}
+
+
+/* Single click exits saver.
+ */
+- (void) handleTap:(UIGestureRecognizer *)sender
+{
+ if (!xwindow)
+ return;
+
+ XEvent xe;
+ memset (&xe, 0, sizeof(xe));
+
+ [self showCloseButton];
+
+ CGPoint p = [sender locationInView:self]; // this is in points, not pixels
+ [self convertMouse:&p];
+ NSAssert (xwindow->type == WINDOW, @"not a window");
+ xwindow->window.last_mouse_x = p.x;
+ xwindow->window.last_mouse_y = p.y;
+
+ xe.xany.type = ButtonPress;
+ xe.xbutton.button = 1;
+ xe.xbutton.x = p.x;
+ xe.xbutton.y = p.y;
+
+ if (! [self sendEvent: &xe])
+ ; //[self beep];
+
+ xe.xany.type = ButtonRelease;
+ xe.xbutton.button = 1;
+ xe.xbutton.x = p.x;
+ xe.xbutton.y = p.y;
+
+ [self sendEvent: &xe];
+}
+
+
+/* Double click sends Space KeyPress.
+ */
+- (void) handleDoubleTap
+{
+ if (!xsft->event_cb || !xwindow) return;
+
+ [self showCloseButton];
+
+ XEvent xe;
+ memset (&xe, 0, sizeof(xe));
+ xe.xkey.keycode = ' ';
+ xe.xany.type = KeyPress;
+ BOOL ok1 = [self sendEvent: &xe];
+ xe.xany.type = KeyRelease;
+ BOOL ok2 = [self sendEvent: &xe];
+ if (!(ok1 || ok2))
+ [self beep];
+}
+
+
+/* Drag with one finger down: send MotionNotify.
+ */
+- (void) handlePan:(UIGestureRecognizer *)sender
+{
+ if (!xsft->event_cb || !xwindow) return;
+
+ [self showCloseButton];
+
+ XEvent xe;
+ memset (&xe, 0, sizeof(xe));
+
+ CGPoint p = [sender locationInView:self]; // this is in points, not pixels
+ [self convertMouse:&p];
+ NSAssert (xwindow && xwindow->type == WINDOW, @"not a window");
+ xwindow->window.last_mouse_x = p.x;
+ xwindow->window.last_mouse_y = p.y;
+
+ switch (sender.state) {
+ case UIGestureRecognizerStateBegan:
+ xe.xany.type = ButtonPress;
+ xe.xbutton.button = 1;
+ xe.xbutton.x = p.x;
+ xe.xbutton.y = p.y;
+ break;
+
+ case UIGestureRecognizerStateEnded:
+ xe.xany.type = ButtonRelease;
+ xe.xbutton.button = 1;
+ xe.xbutton.x = p.x;
+ xe.xbutton.y = p.y;
+ break;
+
+ case UIGestureRecognizerStateChanged:
+ xe.xany.type = MotionNotify;
+ xe.xmotion.x = p.x;
+ xe.xmotion.y = p.y;
+ break;
+
+ default:
+ break;
+ }
+
+ BOOL ok = [self sendEvent: &xe];
+ if (!ok && xe.xany.type == ButtonRelease)
+ [self beep];
+}
+
+
+/* Hold one finger down: assume we're about to start dragging.
+ Treat the same as Pan.
+ */
+- (void) handleLongPress:(UIGestureRecognizer *)sender
+{
+ [self handlePan:sender];
+}
+
+
+
+/* Drag with 2 fingers down: send arrow keys.
+ */
+- (void) handlePan2:(UIPanGestureRecognizer *)sender
+{
+ if (!xsft->event_cb || !xwindow) return;
+
+ [self showCloseButton];
+
+ if (sender.state != UIGestureRecognizerStateEnded)
+ return;
+
+ XEvent xe;
+ memset (&xe, 0, sizeof(xe));
+
+ CGPoint p = [sender locationInView:self]; // this is in points, not pixels
+ [self convertMouse:&p];
+
+ if (fabs(p.x) > fabs(p.y))
+ xe.xkey.keycode = (p.x > 0 ? XK_Right : XK_Left);
+ else
+ xe.xkey.keycode = (p.y > 0 ? XK_Down : XK_Up);
+
+ BOOL ok1 = [self sendEvent: &xe];
+ xe.xany.type = KeyRelease;
+ BOOL ok2 = [self sendEvent: &xe];
+ if (!(ok1 || ok2))
+ [self beep];
+}
+
+
+/* Pinch with 2 fingers: zoom in around the center of the fingers.
+ */
+- (void) handlePinch:(UIPinchGestureRecognizer *)sender
+{
+ if (!xsft->event_cb || !xwindow) return;
+
+ [self showCloseButton];
+
+ if (sender.state == UIGestureRecognizerStateBegan)
+ pinch_transform = self.transform; // Save the base transform
+
+ switch (sender.state) {
+ case UIGestureRecognizerStateBegan:
+ case UIGestureRecognizerStateChanged:
+ {
+ double scale = sender.scale;
+
+ if (scale < 1)
+ return;
+
+ self.transform = CGAffineTransformScale (pinch_transform, scale, scale);
+
+ CGPoint p = [sender locationInView: self];
+ p.x /= self.layer.bounds.size.width;
+ p.y /= self.layer.bounds.size.height;
+
+ CGPoint np = CGPointMake (self.bounds.size.width * p.x,
+ self.bounds.size.height * p.y);
+ CGPoint op = CGPointMake (self.bounds.size.width *
+ self.layer.anchorPoint.x,
+ self.bounds.size.height *
+ self.layer.anchorPoint.y);
+ np = CGPointApplyAffineTransform (np, self.transform);
+ op = CGPointApplyAffineTransform (op, self.transform);
+
+ CGPoint pos = self.layer.position;
+ pos.x -= op.x;
+ pos.x += np.x;
+ pos.y -= op.y;
+ pos.y += np.y;
+ self.layer.position = pos;
+ self.layer.anchorPoint = p;
+ }
+ break;
+
+ case UIGestureRecognizerStateEnded:
+ {
+ // When released, snap back to the default zoom (but animate it).
+
+ CABasicAnimation *a1 = [CABasicAnimation
+ animationWithKeyPath:@"position.x"];
+ a1.fromValue = [NSNumber numberWithFloat: self.layer.position.x];
+ a1.toValue = [NSNumber numberWithFloat: self.bounds.size.width / 2];
+
+ CABasicAnimation *a2 = [CABasicAnimation
+ animationWithKeyPath:@"position.y"];
+ a2.fromValue = [NSNumber numberWithFloat: self.layer.position.y];
+ a2.toValue = [NSNumber numberWithFloat: self.bounds.size.height / 2];
+
+ CABasicAnimation *a3 = [CABasicAnimation
+ animationWithKeyPath:@"anchorPoint.x"];
+ a3.fromValue = [NSNumber numberWithFloat: self.layer.anchorPoint.x];
+ a3.toValue = [NSNumber numberWithFloat: 0.5];
+
+ CABasicAnimation *a4 = [CABasicAnimation
+ animationWithKeyPath:@"anchorPoint.y"];
+ a4.fromValue = [NSNumber numberWithFloat: self.layer.anchorPoint.y];
+ a4.toValue = [NSNumber numberWithFloat: 0.5];
+
+ CABasicAnimation *a5 = [CABasicAnimation
+ animationWithKeyPath:@"transform.scale"];
+ a5.fromValue = [NSNumber numberWithFloat: sender.scale];
+ a5.toValue = [NSNumber numberWithFloat: 1.0];
+
+ CAAnimationGroup *group = [CAAnimationGroup animation];
+ group.duration = 0.3;
+ group.repeatCount = 1;
+ group.autoreverses = NO;
+ group.animations = @[ a1, a2, a3, a4, a5 ];
+ group.timingFunction = [CAMediaTimingFunction
+ functionWithName:
+ kCAMediaTimingFunctionEaseIn];
+ [self.layer addAnimation:group forKey:@"unpinch"];
+
+ self.transform = pinch_transform;
+ self.layer.anchorPoint = CGPointMake (0.5, 0.5);
+ self.layer.position = CGPointMake (self.bounds.size.width / 2,
+ self.bounds.size.height / 2);
+ }
+ break;
+ default:
+ abort();
+ }
+}
+
+
+/* We need this to respond to "shake" gestures
+ */
+- (BOOL)canBecomeFirstResponder
+{
+ return YES;
+}
+
+- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
+{
+}
+
+
+- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event
+{
+}
+
+/* Shake means exit and launch a new saver.
+ */
+- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
+{
+ [self stopAndClose:YES];
+}
+
+
+- (void) showCloseButton
+{
+ double iw = 24;
+ double ih = iw;
+ double off = 4;
+
+ if (!closeBox) {
+ int width = self.bounds.size.width;
+ closeBox = [[UIView alloc]
+ initWithFrame:CGRectMake(0, 0, width, ih + off)];
+ closeBox.backgroundColor = [UIColor clearColor];
+ closeBox.autoresizingMask =
+ UIViewAutoresizingFlexibleBottomMargin |
+ UIViewAutoresizingFlexibleWidth;
+
+ // Add the buttons to the bar
+ UIImage *img1 = [UIImage imageNamed:@"stop"];
+ UIImage *img2 = [UIImage imageNamed:@"settings"];
+
+ UIButton *button = [[UIButton alloc] init];
+ [button setFrame: CGRectMake(off, off, iw, ih)];
+ [button setBackgroundImage:img1 forState:UIControlStateNormal];
+ [button addTarget:self
+ action:@selector(stopAndClose)
+ forControlEvents:UIControlEventTouchUpInside];
+ [closeBox addSubview:button];
+ [button release];
+
+ button = [[UIButton alloc] init];
+ [button setFrame: CGRectMake(width - iw - off, off, iw, ih)];
+ [button setBackgroundImage:img2 forState:UIControlStateNormal];
+ [button addTarget:self
+ action:@selector(stopAndOpenSettings)
+ forControlEvents:UIControlEventTouchUpInside];
+ button.autoresizingMask =
+ UIViewAutoresizingFlexibleBottomMargin |
+ UIViewAutoresizingFlexibleLeftMargin;
+ [closeBox addSubview:button];
+ [button release];
+
+ [self addSubview:closeBox];
+ }
+
+ // Don't hide the buttons under the iPhone X bezel.
+ UIEdgeInsets is = { 0, };
+ if ([self respondsToSelector:@selector(safeAreaInsets)]) {
+# pragma clang diagnostic push // "only available on iOS 11.0 or newer"
+# pragma clang diagnostic ignored "-Wunguarded-availability-new"
+ is = [self safeAreaInsets];
+# pragma clang diagnostic pop
+ [closeBox setFrame:CGRectMake(is.left, is.top,
+ self.bounds.size.width - is.right - is.left,
+ ih + off)];
+ }
+
+ if (closeBox.layer.opacity <= 0) { // Fade in
+
+ CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"opacity"];
+ anim.duration = 0.2;
+ anim.repeatCount = 1;
+ anim.autoreverses = NO;
+ anim.fromValue = [NSNumber numberWithFloat:0.0];
+ anim.toValue = [NSNumber numberWithFloat:1.0];
+ [closeBox.layer addAnimation:anim forKey:@"animateOpacity"];
+ closeBox.layer.opacity = 1;
+ }
+
+ // Fade out N seconds from now.
+ if (closeBoxTimer)
+ [closeBoxTimer invalidate];
+ closeBoxTimer = [NSTimer scheduledTimerWithTimeInterval: 3
+ target:self
+ selector:@selector(closeBoxOff)
+ userInfo:nil
+ repeats:NO];
+}
+
+
+- (void)closeBoxOff
+{
+ if (closeBoxTimer) {
+ [closeBoxTimer invalidate];
+ closeBoxTimer = 0;
+ }
+ if (!closeBox)
+ return;
+
+ CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"opacity"];
+ anim.duration = 0.2;
+ anim.repeatCount = 1;
+ anim.autoreverses = NO;
+ anim.fromValue = [NSNumber numberWithFloat: 1];
+ anim.toValue = [NSNumber numberWithFloat: 0];
+ [closeBox.layer addAnimation:anim forKey:@"animateOpacity"];
+ closeBox.layer.opacity = 0;
+}
+
+
+- (void) stopAndOpenSettings
+{
+ NSString *s = [NSString stringWithCString:xsft->progclass
+ encoding:NSISOLatin1StringEncoding];
+ if ([self isAnimating])
+ [self stopAnimation];
+ [self resignFirstResponder];
+ [_delegate wantsFadeOut:self];
+ [_delegate openPreferences: s];
+
+}
+
+
+- (void)setScreenLocked:(BOOL)locked
+{
+ if (screenLocked == locked) return;
+ screenLocked = locked;
+ if (locked) {
+ if ([self isAnimating])
+ [self stopAnimation];
+ } else {
+ if (! [self isAnimating])
+ [self startAnimation];
+ }
+}
+
+- (NSDictionary *)getGLProperties
+{
+ return [NSDictionary dictionaryWithObjectsAndKeys:
+ kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat,
+# ifdef JWXYZ_GL
+ /* This could be disabled if we knew the screen would be redrawn
+ entirely for every frame.
+ */
+ [NSNumber numberWithBool:YES], kEAGLDrawablePropertyRetainedBacking,
+# endif // JWXYZ_GL
+ nil];
+}
+
+- (void)addExtraRenderbuffers:(CGSize)size
+{
+ // No extra renderbuffers are needed for 2D screenhacks.
+}
+
+
+- (NSString *)getCAGravity
+{
+ return kCAGravityCenter; // Looks better in e.g. Compass.
+// return kCAGravityBottomLeft;
+}
+
+#endif // USE_IPHONE
+
+
+- (void) checkForUpdates
+{
+# ifndef USE_IPHONE
+ // We only check once at startup, even if there are multiple screens,
+ // and even if this saver is running for many days.
+ // (Uh, except this doesn't work because this static isn't shared,
+ // even if we make it an exported global. Not sure why. Oh well.)
+ static BOOL checked_p = NO;
+ if (checked_p) return;
+ checked_p = YES;
+
+ // If it's off, don't bother running the updater. Otherwise, the
+ // updater will decide if it's time to hit the network.
+ if (! get_boolean_resource (xdpy,
+ SUSUEnableAutomaticChecksKey,
+ SUSUEnableAutomaticChecksKey))
+ return;
+
+ NSString *updater = @"XScreenSaverUpdater.app";
+
+ // There may be multiple copies of the updater: e.g., one in /Applications
+ // and one in the mounted installer DMG! It's important that we run the
+ // one from the disk and not the DMG, so search for the right one.
+ //
+ NSWorkspace *workspace = [NSWorkspace sharedWorkspace];
+ NSBundle *bundle = [NSBundle bundleForClass:[self class]];
+ NSArray *search =
+ @[[[bundle bundlePath] stringByDeletingLastPathComponent],
+ [@"~/Library/Screen Savers" stringByExpandingTildeInPath],
+ @"/Library/Screen Savers",
+ @"/System/Library/Screen Savers",
+ @"/Applications",
+ @"/Applications/Utilities"];
+ NSString *app_path = nil;
+ for (NSString *dir in search) {
+ NSString *p = [dir stringByAppendingPathComponent:updater];
+ if ([[NSFileManager defaultManager] fileExistsAtPath:p]) {
+ app_path = p;
+ break;
+ }
+ }
+
+ if (! app_path)
+ app_path = [workspace fullPathForApplication:updater];
+
+ if (app_path && [app_path hasPrefix:@"/Volumes/XScreenSaver "])
+ app_path = 0; // The DMG version will not do.
+
+ if (!app_path) {
+ NSLog(@"Unable to find %@", updater);
+ return;
+ }
+
+ NSError *err = nil;
+ if (! [workspace launchApplicationAtURL:[NSURL fileURLWithPath:app_path]
+ options:(NSWorkspaceLaunchWithoutAddingToRecents |
+ NSWorkspaceLaunchWithoutActivation |
+ NSWorkspaceLaunchAndHide)
+ configuration:[NSMutableDictionary dictionary]
+ error:&err]) {
+ NSLog(@"Unable to launch %@: %@", app_path, err);
+ }
+
+# endif // !USE_IPHONE
+}
+
+
+@end
+
+/* Utility functions...
+ */
+
+static PrefsReader *
+get_prefsReader (Display *dpy)
+{
+ XScreenSaverView *view = jwxyz_window_view (XRootWindow (dpy, 0));
+ if (!view) return 0;
+ return [view prefsReader];
+}
+
+
+char *
+get_string_resource (Display *dpy, char *name, char *class)
+{
+ return [get_prefsReader(dpy) getStringResource:name];
+}
+
+Bool
+get_boolean_resource (Display *dpy, char *name, char *class)
+{
+ return [get_prefsReader(dpy) getBooleanResource:name];
+}
+
+int
+get_integer_resource (Display *dpy, char *name, char *class)
+{
+ return [get_prefsReader(dpy) getIntegerResource:name];
+}
+
+double
+get_float_resource (Display *dpy, char *name, char *class)
+{
+ return [get_prefsReader(dpy) getFloatResource:name];
+}
diff --git a/OSX/XScreenSaverWebloc.icns b/OSX/XScreenSaverWebloc.icns
new file mode 100644
index 0000000..a69b9bb
--- /dev/null
+++ b/OSX/XScreenSaverWebloc.icns
Binary files differ
diff --git a/OSX/YearlReg.ttf b/OSX/YearlReg.ttf
new file mode 100644
index 0000000..454fef0
--- /dev/null
+++ b/OSX/YearlReg.ttf
Binary files differ
diff --git a/OSX/apple2-app.xml b/OSX/apple2-app.xml
new file mode 100644
index 0000000..30b0481
--- /dev/null
+++ b/OSX/apple2-app.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="apple2" _label="Apple2">
+
+ <command arg="-root"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="tvcolor" type="slider" arg="-tv-color %"
+ _label="Color Knob" _low-label="Low" _high-label="High"
+ low="0" high="1000" default="70"/>
+ <number id="tvtint" type="slider" arg="-tv-tint %"
+ _label="Tint Knob" _low-label="Low" _high-label="High"
+ low="0" high="100" default="5"/>
+ </vgroup>
+ <vgroup>
+ <number id="tvbrightness" type="slider" arg="-tv-brightness %"
+ _label="Brightness Knob" _low-label="Low" _high-label="High"
+ low="0" high="200" default="150"/>
+ <number id="tvcontrast" type="slider" arg="-tv-contrast %"
+ _label="Contrast Knob" _low-label="Low" _high-label="High"
+ low="0" high="1500" default="1000"/>
+ </vgroup>
+ </hgroup>
+
+ <_description>
+A fully-functional VT100 terminal emulator simulating an original
+Apple ][ Plus computer in all its 1979 glory. It also reproduces the
+appearance of display on a color television set of the period.
+
+https://en.wikipedia.org/wiki/Apple_II_series
+
+Written by Trevor Blackwell; 2003.
+ </_description>
+</screensaver>
diff --git a/OSX/bindist-DS_Store b/OSX/bindist-DS_Store
new file mode 100644
index 0000000..be82d32
--- /dev/null
+++ b/OSX/bindist-DS_Store
Binary files differ
diff --git a/OSX/bindist.rtf b/OSX/bindist.rtf
new file mode 100644
index 0000000..9d82431
--- /dev/null
+++ b/OSX/bindist.rtf
@@ -0,0 +1,78 @@
+{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf370
+\readonlydoc1\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fswiss\fcharset0 LucidaConsole;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue240;}
+{\info
+{\title XScreenSaver Installation Instructions}}\vieww10380\viewh16740\viewkind0
+\deftab720
+\pard\pardeftab720\qc
+
+\f0\fs24 \cf0 \
+
+\b\fs36 XScreenSaver\
+
+\fs28 A collection of free screen savers for MacOS X\
+\
+
+\b0 by Jamie Zawinski\
+and many others\
+\
+version 5.40\
+12-Aug-2018\
+\
+{\field{\*\fldinst{HYPERLINK "https://www.jwz.org/xscreensaver/"}}{\fldrslt \cf2 \ul \ulc2 https://www.jwz.org/xscreensaver/}}\
+\pard\pardeftab720
+\cf0 \
+
+\b To install all 200+ screen savers:\
+\pard\pardeftab720\li360
+
+\b0 \cf0 \
+Just double-click on \i Install Everything\i0.\
+\
+If it won't open because of your security settings, just control-click and
+select \i Open \i0 from the context menu.\
+\
+\pard\pardeftab720
+
+\b \cf0 To install only some of them:\
+\pard\pardeftab720\li360
+
+\b0 \cf0 \
+Open the \i "Screen Savers" \i0 folder in this disk image and double-click
+each saver that you want to install. (But that might not work unless you
+tweak \i"System Preferences / Security & Privacy"\i0 first. Just
+do \i"Install Everything"\i0, that's easier.)\
+\
+\pard\pardeftab720
+
+\b \cf0 To uninstall:\
+\pard\pardeftab720\li360
+
+\b0 \cf0 \
+Open the \i "/Library/Screen Savers" \i0 folder and drag any
+unwanted savers to Trash.\
+\
+\pard\pardeftab720
+
+\b \cf0 For more information:\
+\pard\pardeftab720\li360
+
+\b0 \cf0 \
+Please visit the
+{\field{\*\fldinst{HYPERLINK "https://www.jwz.org/xscreensaver/"}}
+{\fldrslt \cf2 \ul \ulc2 XScreenSaver web site}}.
+The XScreenSaver collection is free software, and all source code is
+available there.\
+\
+\pard\pardeftab720
+
+\b \cf0 iPhone, iPad & Android:\
+\pard\pardeftab720\li360
+
+\b0 \cf0 \
+XScreenSaver also runs on iOS and Android. The iOS version is available in the
+{\field{\*\fldinst{HYPERLINK "https://itunes.apple.com/app/xscreensaver/id539014593?mt=8"}}
+{\fldrslt \cf2 \ul \ulc2 iTunes App Store}} and the Android version can be downloaded from the
+{\field{\*\fldinst{HYPERLINK "https://www.jwz.org/xscreensaver/download/"}}
+{\fldrslt \cf2 \ul \ulc2 XScreenSaver web site}}, and they're both free!
+}
diff --git a/OSX/bindist.webloc b/OSX/bindist.webloc
new file mode 100644
index 0000000..bb77709
--- /dev/null
+++ b/OSX/bindist.webloc
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>URL</key>
+ <string>https://itunes.apple.com/app/xscreensaver/id539014593</string>
+</dict>
+</plist>
diff --git a/OSX/bindist2.webloc b/OSX/bindist2.webloc
new file mode 100644
index 0000000..0ebfa91
--- /dev/null
+++ b/OSX/bindist2.webloc
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>URL</key>
+ <string>https://www.jwz.org/xscreensaver/download.html</string>
+</dict>
+</plist>
diff --git a/OSX/build-fntable.pl b/OSX/build-fntable.pl
new file mode 100755
index 0000000..c93343c
--- /dev/null
+++ b/OSX/build-fntable.pl
@@ -0,0 +1,189 @@
+#!/usr/bin/perl -w
+# Copyright © 2012-2018 Jamie Zawinski <jwz@jwz.org>
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+#
+# Generates a .c file that lists all the function tables we use, because
+# CFBundleGetDataPointerForName doesn't work in "Archive" builds.
+# What a crock of shit.
+#
+# There's no real way to integrate this into the Xcode build system, so
+# run this manually each time a new saver is added to the iOS app.
+#
+# Created: 14-Jul-2012.
+
+require 5;
+#use diagnostics; # Fails on some MacOS 10.5 systems
+use strict;
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my ($version) = ('$Revision: 1.6 $' =~ m/\s(\d[.\d]+)\s/s);
+
+my $verbose = 1;
+
+# List of savers not included in the iOS build.
+#
+my %disable = (
+ 'extrusion' => 1,
+ 'glitchpeg' => 1,
+ 'lcdscrub' => 1,
+ 'lockward' => 1,
+ 'webcollage' => 1,
+ 'testx11' => 1,
+ );
+
+# Parse the RETIRED_EXES variable from the Makefiles to populate %disable.
+# Duplicated in ../hacks/munge-ad.pl.
+#
+sub parse_makefiles() {
+ foreach my $mf ( "../hacks/Makefile.in", "../hacks/glx/Makefile.in" ) {
+ open (my $in, '<', $mf) || error ("$mf: $!");
+ print STDERR "$progname: reading $mf\n" if ($verbose > 1);
+ local $/ = undef; # read entire file
+ my $body = <$in>;
+ close $in;
+
+ $body =~ s/\\\n//gs;
+ my ($var) = ($body =~ m/^RETIRED_EXES\s*=\s*(.*)$/mi);
+ my ($var2) = ($body =~ m/^RETIRED_GL_EXES\s*=\s*(.*)$/mi);
+ error ("no RETIRED_EXES in $mf") unless $var;
+ $var .= " $var2" if $var2;
+ foreach my $hack (split (/\s+/, $var)) {
+ $disable{$hack} = 2;
+ }
+ }
+}
+
+
+sub build_h($) {
+ my ($outfile) = @_;
+
+ parse_makefiles();
+
+ my @schemes = glob('xscreensaver.xcodeproj/xcuserdata/' .
+ '*.xcuserdatad/xcschemes/*.xcscheme');
+ error ("no scheme files") unless (@schemes);
+
+ my %names = ();
+
+ foreach my $s (@schemes) {
+ open (my $in, '<', $s) || error ("$s: $!");
+ local $/ = undef; # read entire file
+ my $body = <$in>;
+ close $in;
+ my ($name) = ($body =~ m@BuildableName *= *"([^\"<>]+?)\.saver"@s);
+ next unless $name;
+ $name = lc($name);
+ if ($disable{$name}) {
+ print STDERR "$progname: skipping $name\n" if ($verbose > 1);
+ next;
+ }
+ print STDERR "$progname: found $name\n" if ($verbose > 1);
+ $names{$name} = 1;
+ }
+
+ my @names = sort (keys %names);
+ error ("too few names") if (@names < 100);
+
+ my $suf = 'xscreensaver_function_table';
+
+ my $body = ("/* Generated file, do not edit.\n" .
+ " Created: " . localtime() . " by $progname $version.\n" .
+ " */\n" .
+ "\n" .
+ "#import <Foundation/Foundation.h>\n" .
+ "#import <UIKit/UIKit.h>\n" .
+ "\n" .
+ "extern NSDictionary *make_function_table_dict(void);\n" .
+ "\n");
+
+ $body .= "extern struct $suf";
+ foreach my $s (@names, 'testx11') {
+ $body .= "\n ${s}_${suf},";
+ }
+ $body =~ s/,\s*$/;/s;
+
+ sub line($$) {
+ my ($s, $suf) = @_;
+ return "\t[NSValue valueWithPointer:&${s}_${suf}], @\"${s}\",\n";
+ }
+
+ $body .= ("\n\n" .
+ "NSDictionary *make_function_table_dict(void)\n{\n" .
+ " return\n [NSDictionary dictionaryWithObjectsAndKeys:\n" .
+ "\n" .
+ "#if defined(APPLE2_ONLY)\n" .
+ " " . line('apple2', $suf) .
+ "#elif defined(PHOSPHOR_ONLY)\n" .
+ " " . line('phosphor', $suf) .
+ "#elif defined(TESTX11_ONLY)\n" .
+ " " . line('testx11', $suf) .
+ "#else\n");
+ foreach my $s (@names) { $body .= line($s, $suf); }
+ $body .= ("#endif\n" .
+ "\tnil];\n" .
+ "}\n\n");
+
+ my $obody = '';
+ if (open (my $in, '<', $outfile)) {
+ local $/ = undef; # read entire file
+ $obody = <$in>;
+ close $in;
+ }
+
+ # strip comments/date for diff.
+ my ($body2, $obody2) = ($body, $obody);
+ foreach ($body2, $obody2) { s@/\*.*?\*/@@gs; }
+
+ if ($body2 eq $obody2) {
+ print STDERR "$progname: $outfile: unchanged\n" if ($verbose > 1);
+ } else {
+ my $file_tmp = "$outfile.tmp";
+ open (my $out, '>', $file_tmp) || error ("$file_tmp: $!");
+ print $out $body || error ("$file_tmp: $!");
+ close $out || error ("$file_tmp: $!");
+
+ if (!rename ("$file_tmp", "$outfile")) {
+ unlink "$file_tmp";
+ error ("mv \"$file_tmp\" \"$outfile\": $!");
+ }
+ print STDERR "$progname: wrote $outfile\n" if ($verbose);
+ }
+}
+
+
+sub error($) {
+ my ($err) = @_;
+ print STDERR "$progname: $err\n";
+ exit 1;
+}
+
+sub usage() {
+ print STDERR "usage: $progname [--verbose] output.c\n";
+ exit 1;
+}
+
+sub main() {
+
+ my ($out);
+ while ($_ = $ARGV[0]) {
+ shift @ARGV;
+ if (m/^--?verbose$/s) { $verbose++; }
+ elsif (m/^-v+$/) { $verbose += length($_)-1; }
+ elsif (m/^--?q(uiet)?$/s) { $verbose = 0; }
+ elsif (m/^-/s) { usage(); }
+ elsif (! $out) { $out = $_; }
+ else { usage(); }
+ }
+ usage() unless ($out);
+ build_h ($out);
+}
+
+main();
+exit 0;
diff --git a/OSX/enable_gc.c b/OSX/enable_gc.c
new file mode 100644
index 0000000..699c9a6
--- /dev/null
+++ b/OSX/enable_gc.c
@@ -0,0 +1,368 @@
+/* enable_gc.c, Copyright (c) 2014 Dave Odell <dmo2118@gmail.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * The problem:
+ *
+ * - OSX 10.5 and earlier require .saver bundles to not use GC.
+ * - OSX 10.6 and 10.7 require .saver bundles to use GC.
+ * - OSX 10.8 and later require .saver bundles to not use GC.
+ *
+ * So the way to build a portable .saver is to build it with "GC optional",
+ * via "-fobjc-gc" on the x86-64 architecture.
+ *
+ * But XCode 5.0.2 was the last version of XCode to support building
+ * executables that support GC, even optionally. So there's no way to make
+ * the XCode that ships with OSX 10.9 create a .saver bundle that will work
+ * on OSX 10.6 and 10.7. Though it will work on 10.5!
+ *
+ * The fix: after compiling, hand-hack the generated binary to tag the
+ * x86-64 arch with the OBJC_IMAGE_SUPPORTS_GC flag.
+ *
+ * Specifically, OR the __DATA,__objc_imageinfo section with
+ * "00 00 00 00 02 00 00 00"; normally this section is all zeros.
+ * The __objc_imageinfo section corresponds to struct objc_image_info in:
+ * http://www.opensource.apple.com/source/objc4/objc4-551.1/runtime/objc-private.h
+ * You can use "otool -o Interference.saver/Contents/MacOS/Interference"
+ * or "otool -s __DATA __objc_imageinfo Interference" to look at the
+ * section.
+ *
+ * This means that the binary is marked as supporting GC, but there
+ * are no actual GC-supporting write barriers compiled in! So does it
+ * actually ever GC? Yes, apparently it does. Apparently what's
+ * going on is that incremental-GCs are doing nothing, but full-GCs
+ * still collect ObjC objects properly.
+ *
+ * Mad Science!
+ *
+ * In the xscreensaver build process, the "enable_gc" target is a
+ * dependency of "libjwxyz" (so that it gets built first) and is
+ * invoked by "update-info-plist.pl" (so that it gets run on every
+ * saver).
+ *
+ *
+ * UPDATE, 2-Jun-2014:
+ *
+ * Actually, this seems not to be working. We're seeing intermittent
+ * crashes in malloc/calloc/free on 10.6 64 bit. When compiled with
+ * legit -fobjc-gc, those crashes don't occur.
+ */
+
+#include <assert.h>
+#include <CoreFoundation/CFByteOrder.h>
+#include <fcntl.h>
+#include <mach-o/fat.h>
+#include <mach-o/loader.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#define BOUNDS_CHECK(ptr, end) \
+ ((const void *)((ptr) + 1) <= (const void *)(end))
+
+#define BOUNDS_CHECK_PRINT(ptr, end) \
+ (BOUNDS_CHECK(ptr, end) ? 1 : (_got_eof(), 0))
+
+/*
+ This part is lifted from objc-private.h, because it's not present on
+ most OS X systems.
+ http://www.opensource.apple.com/source/objc4/objc4-551.1/runtime/objc-private.h
+ */
+
+typedef struct {
+ uint32_t version; // currently 0
+ uint32_t flags;
+} objc_image_info;
+
+// masks for objc_image_info.flags
+#define OBJC_IMAGE_IS_REPLACEMENT (1<<0)
+#define OBJC_IMAGE_SUPPORTS_GC (1<<1)
+#define OBJC_IMAGE_REQUIRES_GC (1<<2)
+#define OBJC_IMAGE_OPTIMIZED_BY_DYLD (1<<3)
+#define OBJC_IMAGE_SUPPORTS_COMPACTION (1<<4) // might be re-assignable
+
+/* End objc-private.h excerpt. */
+
+static void
+_got_eof()
+{
+ fputs("Error: Unexpected EOF\n", stderr);
+}
+
+/* This will probably only ever run on OS X, so CoreFoundation is used here. */
+
+static inline uint32_t
+_be_u32(uint32_t x) /* Big Endian _ Unsigned int 32-bit */
+{
+ return (uint32_t)CFSwapInt32BigToHost(x);
+}
+
+static inline uint32_t
+_le_u32(uint32_t x) /* Little Endian _ Unsigned int 32-bit */
+{
+ return (uint32_t)CFSwapInt32LittleToHost(x);
+}
+
+static inline uint32_t
+_le_u64(uint64_t x) /* Little Endian _ Unsigned int 64-bit */
+{
+ return (uint32_t)CFSwapInt64LittleToHost(x);
+}
+
+static int
+_handle_x86_64(void *exec, void *exec_end)
+{
+ const uint32_t *magic = exec;
+
+ if(!BOUNDS_CHECK_PRINT(magic, exec_end))
+ return EXIT_FAILURE;
+
+ if(*magic != _le_u32(MH_MAGIC_64))
+ {
+ fputs("Error: Unknown magic number on Mach header.\n", stderr);
+ return EXIT_FAILURE;
+ }
+
+ /* Mach headers can be little-endian or big-endian. */
+
+ const struct mach_header_64 *hdr = (const struct mach_header_64 *)magic;
+ if(!BOUNDS_CHECK_PRINT(hdr, exec_end))
+ return EXIT_FAILURE;
+
+ if(hdr->cputype != _le_u32(CPU_TYPE_X86_64))
+ {
+ fputs("Error: Unexpected CPU type on Mach header.\n", stderr);
+ return EXIT_FAILURE;
+ }
+
+ /* I may have missed a few _le_u32 calls, so watch out on PowerPC (heh). */
+
+ if((const uint8_t *)hdr + _le_u32(hdr->sizeofcmds) >
+ (const uint8_t *)exec_end)
+ {
+ _got_eof();
+ return EXIT_FAILURE;
+ }
+
+ const struct load_command *load_cmd = (const struct load_command *)(hdr + 1);
+ const void *cmds_end = (const uint8_t *)load_cmd + hdr->sizeofcmds;
+
+ for(unsigned i = 0; i != _le_u32(hdr->ncmds); ++i)
+ {
+ if(!BOUNDS_CHECK_PRINT(load_cmd, cmds_end))
+ return EXIT_FAILURE;
+
+ const struct load_command *next_load_cmd =
+ (const struct load_command *)((const uint8_t *)load_cmd +
+ _le_u32(load_cmd->cmdsize));
+
+ if(load_cmd->cmd == _le_u32(LC_SEGMENT_64))
+ {
+ const struct segment_command_64 *seg_cmd =
+ (const struct segment_command_64 *)load_cmd;
+ if(!BOUNDS_CHECK_PRINT(seg_cmd, cmds_end))
+ return EXIT_FAILURE;
+
+ if(!strcmp(seg_cmd->segname, "__DATA"))
+ {
+ const struct section_64 *sect =
+ (const struct section_64 *)(seg_cmd + 1);
+ for(unsigned j = 0; j != _le_u32(seg_cmd->nsects); ++j)
+ {
+ if(!BOUNDS_CHECK_PRINT(&sect[j], next_load_cmd))
+ return EXIT_FAILURE;
+
+ if(strcmp(sect[j].segname, "__DATA"))
+ fprintf(stderr,
+ "Warning: segment name mismatch in __DATA,%.16s\n",
+ sect[j].sectname);
+
+ if(!memcmp(sect[j].sectname, "__objc_imageinfo", 16))
+ { /* No null-terminator here. */
+ if(_le_u64(sect[j].size) < sizeof(objc_image_info))
+ {
+ fputs("__DATA,__objc_imageinfo too small.\n",
+ stderr);
+ return EXIT_FAILURE;
+ }
+
+ /*
+ Not checked:
+ - Overlapping segments.
+ - Segments overlapping the load commands.
+ */
+
+ objc_image_info *img_info = (objc_image_info *)
+ ((uint8_t *)exec + _le_u64(sect[j].offset));
+
+ if(!BOUNDS_CHECK_PRINT(img_info, exec_end))
+ return EXIT_FAILURE;
+
+ if(img_info->version != 0)
+ {
+ fprintf(
+ stderr,
+ "Error: Unexpected version for "
+ "__DATA,__objc_imageinfo section. "
+ "Expected 0, got %d\n",
+ _le_u32(img_info->version));
+ return EXIT_FAILURE;
+ }
+
+ if(img_info->flags &
+ _le_u32(OBJC_IMAGE_REQUIRES_GC |
+ OBJC_IMAGE_SUPPORTS_GC))
+ {
+ fputs("Warning: Image already supports GC.\n",
+ stderr);
+ return EXIT_SUCCESS;
+ }
+
+ /* Finally, do the work. */
+ img_info->flags |= _le_u32(OBJC_IMAGE_SUPPORTS_GC);
+ return EXIT_SUCCESS;
+ }
+ }
+ }
+ }
+
+ load_cmd = next_load_cmd;
+ }
+
+ if((const void *)load_cmd > cmds_end)
+ {
+ _got_eof();
+ return EXIT_FAILURE;
+ }
+
+ assert(load_cmd == cmds_end);
+
+ fputs("Error: __DATA,__objc_imageinfo not found.\n", stderr);
+ return EXIT_FAILURE;
+}
+
+int
+main(int argc, const char **argv)
+{
+ if(argc != 2)
+ {
+ fprintf(stderr, "Usage: %s executable\n", argv[0]);
+ return EXIT_FAILURE;
+ }
+
+ const char *exec_path = argv[1];
+
+ int fd = open(exec_path, O_RDWR | O_EXLOCK);
+
+ if(fd < 0)
+ {
+ perror(exec_path);
+ return EXIT_FAILURE;
+ }
+
+ int result = EXIT_FAILURE;
+
+ struct stat exec_stat;
+ if(fstat(fd, &exec_stat) < 0)
+ {
+ perror("fstat");
+ exit (1);
+ }
+ else
+ {
+ if(!(exec_stat.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
+ {
+ fprintf(stderr, "Warning: %s is not executable.\n", exec_path);
+ exit (1);
+ }
+
+ assert(exec_stat.st_size >= 0);
+
+ /*
+ TODO (technically): mmap(2) can throw signals if somebody unplugs
+ the file system. In such situations, a signal handler
+ should be used to ensure sensible recovery.
+ */
+
+ void *exec = NULL;
+
+ if(exec_stat.st_size)
+ {
+ exec = mmap(NULL, exec_stat.st_size, PROT_READ | PROT_WRITE,
+ MAP_SHARED, fd, 0);
+ if(!exec)
+ perror("mmap");
+ }
+
+ if(exec || !exec_stat.st_size)
+ {
+ const void *exec_end = (const char *)exec + exec_stat.st_size;
+
+ const uint32_t *magic = exec;
+
+ if(BOUNDS_CHECK_PRINT(magic, exec_end))
+ {
+ if(*magic == _be_u32(FAT_MAGIC))
+ {
+ struct fat_header *hdr = (struct fat_header *)magic;
+ if(BOUNDS_CHECK_PRINT(hdr, exec_end))
+ {
+ uint32_t nfat_arch = _be_u32(hdr->nfat_arch);
+ const struct fat_arch *arch =
+ (const struct fat_arch *)(hdr + 1);
+
+ unsigned i = 0;
+ for(;;)
+ {
+ if(i == nfat_arch)
+ {
+ /* This could be done for other architectures. */
+ fputs("Error: x86_64 architecture not found.\n",
+ stderr);
+ exit (1);
+ break;
+ }
+
+ if(!BOUNDS_CHECK_PRINT(&arch[i], exec_end))
+ break;
+
+ if(arch[i].cputype == _be_u32(CPU_TYPE_X86_64))
+ {
+ uint8_t *obj_begin =
+ (uint8_t *)exec + _be_u32(arch[i].offset);
+ result = _handle_x86_64(obj_begin,
+ obj_begin +
+ _be_u32(arch[i].size));
+ break;
+ }
+
+ ++i;
+ }
+ }
+ }
+ else
+ {
+ fprintf(stderr,
+ "Error: %s is not a recognized Mach binary format.\n",
+ exec_path);
+ exit (1);
+ }
+ }
+
+ munmap(exec, exec_stat.st_size);
+ }
+ }
+
+ close(fd);
+
+ return result;
+}
diff --git a/OSX/fuzztest.sh b/OSX/fuzztest.sh
new file mode 100755
index 0000000..20d596a
--- /dev/null
+++ b/OSX/fuzztest.sh
@@ -0,0 +1,54 @@
+#!/bin/sh
+# Copyright © 2016 Jamie Zawinski <jwz@jwz.org>
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+#
+# Deliver random rotate and shake gestures to the iOS Simulator window.
+#
+# To make this work, you probably need to go to "System Preferences /
+# Security & Privacy / Privacy / Accessibility" and add "Terminal.app"
+# to the list of allowed programs.
+#
+# Created: 18-Apr-2016.
+
+function menu() {
+ which="$1"
+ sim="Simulator"
+ #proc="SystemUIServer"
+ proc="System Events"
+
+ osascript -e "
+ tell application \"$sim\" to activate
+ tell application \"$proc\"
+ tell process \"$sim\"
+ tell menu bar item \"Hardware\" of menu bar 1
+ click menu item \"$which\" of menu \"Hardware\"
+ \"$which\"
+ end tell
+ end tell
+ end tell"
+}
+
+menu 'Shake Gesture'
+
+while true; do
+ i=$[ 2 + $[ RANDOM % 5 ]]
+ echo "sleep $i" ; sleep $i
+ i=$[ RANDOM % 5]
+ if [ $i == 0 ]; then menu 'Shake Gesture'
+ else
+ i=$[ RANDOM % 3]
+ if [ $i == 0 ]; then menu 'Rotate Left'
+ elif [ $i == 1 ]; then menu 'Rotate Right'
+ else menu 'Rotate Right' ; menu 'Rotate Right'
+ fi
+ fi
+done
+
+exit 0
diff --git a/OSX/grabclient-ios.m b/OSX/grabclient-ios.m
new file mode 100644
index 0000000..b016eb1
--- /dev/null
+++ b/OSX/grabclient-ios.m
@@ -0,0 +1,95 @@
+/* xscreensaver, Copyright (c) 1992-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* iOS 8+ code to choose and return a random image from the photo library.
+ */
+
+#ifdef USE_IPHONE // whole file
+
+#import <Photos/Photos.h>
+#import "grabscreen.h"
+#import "yarandom.h"
+
+void
+ios_load_random_image (void (*callback) (void *uiimage, const char *fn,
+ int width, int height,
+ void *closure),
+ void *closure,
+ int width, int height)
+{
+ // If the user has not yet been asked for authoriziation, pop up the
+ // auth dialog now and re-invoke this function once it has been
+ // answered. The callback will run once there has been a Yes or No.
+ // Otherwise, we'd return right away with colorbars even if the user
+ // then went on to answer Yes.
+ //
+ PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
+ if (status == PHAuthorizationStatusNotDetermined) {
+ [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
+ ios_load_random_image (callback, closure, width, height);
+ }];
+ return;
+ }
+
+ // The rest of this is synchronous.
+
+ PHFetchOptions *opt = [PHFetchOptions new];
+ opt.includeAssetSourceTypes = (PHAssetSourceTypeUserLibrary |
+ PHAssetSourceTypeCloudShared |
+ PHAssetSourceTypeiTunesSynced);
+ PHFetchResult *r = [PHAsset
+ fetchAssetsWithMediaType: PHAssetMediaTypeImage
+ options: opt];
+ NSUInteger n = [r count];
+ PHAsset *asset = n ? [r objectAtIndex: random() % n] : NULL;
+
+ __block UIImage *img = 0;
+ __block const char *fn = 0;
+
+ if (asset) {
+ PHImageRequestOptions *opt = [[PHImageRequestOptions alloc] init];
+ opt.synchronous = YES;
+
+ // Get the image bits.
+ //
+ int size = width > height ? width : height;
+ [[PHImageManager defaultManager]
+ requestImageForAsset: asset
+ targetSize: CGSizeMake (size, size)
+ contentMode: PHImageContentModeDefault
+ options: opt
+ resultHandler:^void (UIImage *image, NSDictionary *info) {
+ img = image;
+ }];
+
+ // Get the image name.
+ //
+ [[PHImageManager defaultManager]
+ requestImageDataForAsset: asset
+ options: opt
+ resultHandler:^(NSData *imageData, NSString *dataUTI,
+ UIImageOrientation orientation,
+ NSDictionary *info) {
+ // Looks like UIImage is pre-rotated to compensate for 'orientation'.
+ NSString *path = [info objectForKey:@"PHImageFileURLKey"];
+ if (path)
+ fn = [[[path lastPathComponent] stringByDeletingPathExtension]
+ cStringUsingEncoding:NSUTF8StringEncoding];
+ }];
+ }
+
+ if (img)
+ callback (img, fn, [img size].width, [img size].height, closure);
+ else
+ callback (0, 0, 0, 0, closure);
+}
+
+#endif // USE_IPHONE - whole file
diff --git a/OSX/grabclient-osx.m b/OSX/grabclient-osx.m
new file mode 100644
index 0000000..7bfdcb4
--- /dev/null
+++ b/OSX/grabclient-osx.m
@@ -0,0 +1,464 @@
+/* xscreensaver, Copyright (c) 1992-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* This is the OSX implementation of desktop-grabbing and image-loading.
+ This code is invoked by "utils/grabclient.c", which is linked directly
+ in to each screen saver bundle.
+
+ X11-based builds of the savers do not use this code (even on MacOS).
+ This is used only by the Cocoa build of the savers.
+ */
+
+#import <stdlib.h>
+#import <stdint.h>
+#ifndef USE_IPHONE
+# import <Cocoa/Cocoa.h>
+#else
+# import "SaverRunner.h"
+#endif
+#import "jwxyz-cocoa.h"
+#import "grabscreen.h"
+#import "colorbars.h"
+#import "resources.h"
+#import "usleep.h"
+
+
+#ifdef USE_IPHONE
+# define NSImage UIImage
+#endif
+
+
+#ifndef MAC_OS_X_VERSION_10_6
+# define MAC_OS_X_VERSION_10_6 1060 /* undefined in 10.4 SDK, grr */
+#endif
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5
+
+ /* 10.4 code.
+
+ This version of the code works on 10.4, but is flaky. There is
+ a better way to do it on 10.5 and newer, but taking this path,
+ then we are being compiled against the 10.4 SDK instead of the
+ 10.5 SDK, and the newer API is not available to us.
+ */
+
+static void
+copy_framebuffer_to_ximage (CGDirectDisplayID cgdpy, XImage *xim,
+ int window_x, int window_y)
+{
+ unsigned char *data = (unsigned char *)
+ CGDisplayAddressForPosition (cgdpy, window_x, window_y);
+ int bpp = CGDisplayBitsPerPixel (cgdpy);
+ int spp = CGDisplaySamplesPerPixel (cgdpy);
+ int bps = CGDisplayBitsPerSample (cgdpy);
+ int bpr = CGDisplayBytesPerRow (cgdpy);
+
+ int y;
+ int ximw = xim->width;
+ int ximh = xim->height;
+
+ uint32_t *odata = (uint32_t *) xim->data;
+
+ switch (bpp) {
+ case 32:
+ if (spp != 3) abort();
+ if (bps != 8) abort();
+ int xwpl = xim->bytes_per_line/4;
+ for (y = 0; y < ximh; y++) {
+ // We can do this because the frame buffer and XImage are both ARGB 32.
+ // Both PPC and Intel use ARGB, viewed in word order (not byte-order).
+ memcpy (odata, data, ximw * 4);
+ odata += xwpl;
+ data += bpr;
+ }
+ break;
+
+ case 16:
+ if (spp != 3) abort();
+ if (bps != 5) abort();
+ for (y = 0; y < ximh; y++) {
+ uint16_t *ip = (uint16_t *) data;
+ int x;
+ for (x = 0; x < ximw; x++) {
+ uint16_t p = *ip++;
+ // This should be ok on both PPC and Intel (ARGB, word order)
+ unsigned char r = (p >> 10) & 0x1F;
+ unsigned char g = (p >> 5) & 0x1F;
+ unsigned char b = (p ) & 0x1F;
+ r = (r << 3) | (r >> 2);
+ g = (g << 3) | (g >> 2);
+ b = (b << 3) | (b >> 2);
+ uint32_t pixel = 0xFF000000 | (r << 16) | (g << 8) | b;
+ // XPutPixel (xim, x, y, pixel);
+ *odata++ = pixel;
+ }
+ data += bpr;
+ }
+ break;
+
+ case 8:
+ {
+ /* Get the current palette of the display. */
+ CGDirectPaletteRef pal = CGPaletteCreateWithDisplay (cgdpy);
+
+ /* Map it to 32bpp pixels */
+ uint32_t map[256];
+ for (y = 0; y < 256; y++) {
+ CGDeviceColor c = CGPaletteGetColorAtIndex (pal, y);
+ unsigned char r = c.red * 255.0;
+ unsigned char g = c.green * 255.0;
+ unsigned char b = c.blue * 255.0;
+ uint32_t pixel = 0xFF000000 | (r << 16) | (g << 8) | b;
+ map[y] = pixel;
+ }
+
+ for (y = 0; y < ximh; y++) {
+ unsigned char *ip = data;
+ int x;
+ for (x = 0; x < ximw; x++) {
+ *odata++ = map[*ip++];
+ }
+ data += bpr;
+ }
+ CGPaletteRelease (pal);
+ }
+ break;
+
+ default:
+ abort();
+ break;
+ }
+}
+
+
+/* Loads an image into the Drawable, returning once the image is loaded.
+ */
+Bool
+osx_grab_desktop_image (Screen *screen, Window xwindow, Drawable drawable,
+ XRectangle *geom_ret)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ NSView *nsview = jwxyz_window_view (xwindow);
+ NSWindow *nswindow = [nsview window];
+ XWindowAttributes xgwa;
+ int window_x, window_y;
+ Window unused;
+
+ // Figure out where this window is on the screen.
+ //
+ XGetWindowAttributes (dpy, xwindow, &xgwa);
+ XTranslateCoordinates (dpy, xwindow, RootWindowOfScreen (screen), 0, 0,
+ &window_x, &window_y, &unused);
+
+ // Use the size of the Drawable, not the Window.
+ {
+ Window r;
+ int x, y;
+ unsigned int w, h, bbw, d;
+ XGetGeometry (dpy, drawable, &r, &x, &y, &w, &h, &bbw, &d);
+ xgwa.width = w;
+ xgwa.height = h;
+ }
+
+ // Create a tmp ximage to hold the screen data.
+ //
+ XImage *xim = XCreateImage (dpy, xgwa.visual, 32, ZPixmap, 0, 0,
+ xgwa.width, xgwa.height, 8, 0);
+ xim->data = (char *) malloc (xim->height * xim->bytes_per_line);
+
+
+ // Find the address in the frame buffer of the top left of this window.
+ //
+ CGDirectDisplayID cgdpy = 0;
+ {
+ CGPoint p;
+ // #### this isn't quite right for screen 2: it's offset slightly.
+ p.x = window_x;
+ p.y = window_y;
+ CGDisplayCount n;
+ CGGetDisplaysWithPoint (p, 1, &cgdpy, &n);
+ if (!cgdpy) abort();
+ }
+
+ // Paint a transparent "hole" in this window.
+ //
+ BOOL oopaque = [nswindow isOpaque];
+ [nswindow setOpaque:NO];
+
+ [[NSColor clearColor] set];
+ NSRectFill ([nsview frame]);
+ [[nswindow graphicsContext] flushGraphics];
+
+
+ // Without this, we get a dozen black scanlines at the top.
+ // #### But with this, the screen saver loops, because calling this
+ // seems to implicitly mark the display as non-idle!
+ // CGDisplayCaptureWithOptions (cgdpy, kCGCaptureNoFill);
+
+ // #### So let's try waiting for the vertical blank instead...
+ // Nope, that doesn't work.
+ //
+ // CGDisplayWaitForBeamPositionOutsideLines (cgdpy, 0,
+ // window_y + [nswindow frame].size.height);
+
+ // #### Ok, try a busy-wait?
+ // Nope.
+ //
+
+ // #### Ok, just fuckin' sleep!
+ //
+ usleep (100000);
+
+
+ // Pull the bits out of the frame buffer.
+ //
+ copy_framebuffer_to_ximage (cgdpy, xim, window_x, window_y);
+
+ // CGDisplayRelease (cgdpy);
+
+ // Make the window visible again.
+ //
+ [nswindow setOpaque:oopaque];
+
+ // Splat the XImage onto the target drawable (probably the window)
+ // and free the bits.
+ //
+ XGCValues gcv;
+ GC gc = XCreateGC (dpy, drawable, 0, &gcv);
+ XPutImage (dpy, drawable, gc, xim, 0, 0, 0, 0, xim->width, xim->height);
+ XFreeGC (dpy, gc);
+
+ if (geom_ret) {
+ geom_ret->x = 0;
+ geom_ret->y = 0;
+ geom_ret->width = xim->width;
+ geom_ret->height = xim->height;
+ }
+
+ XDestroyImage (xim);
+ return True;
+}
+
+
+#elif defined(USE_IPHONE)
+
+ /* What a hack!
+
+ On iOS, our application delegate, SaverRunner, grabs an image
+ of itself as a UIImage before mapping the XScreenSaverView.
+ In this code, we ask SaverRunner for that UIImage, then copy
+ it to the root window.
+ */
+
+Bool
+osx_grab_desktop_image (Screen *screen, Window xwindow, Drawable drawable,
+ XRectangle *geom_ret)
+{
+ SaverRunner *s =
+ (SaverRunner *) [[UIApplication sharedApplication] delegate];
+ if (! s)
+ return False;
+ if (! [s isKindOfClass:[SaverRunner class]])
+ return False;
+ UIImage *img = [s screenshot];
+ if (! img)
+ return False;
+ jwxyz_draw_NSImage_or_CGImage (DisplayOfScreen (screen), drawable,
+ True, img, geom_ret, 0);
+ return True;
+}
+
+
+#else /* MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+
+ 10.5+ code.
+
+ This version of the code is simpler and more reliable, but
+ uses an API that only exist on 10.5 and newer, so we can only
+ use it if when being compiled against the 10.5 SDK or later.
+ */
+
+extern float jwxyz_scale (Window); /* jwxyzI.h */
+
+/* Loads an image into the Drawable, returning once the image is loaded.
+ */
+Bool
+osx_grab_desktop_image (Screen *screen, Window xwindow, Drawable drawable,
+ XRectangle *geom_ret)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ NSView *nsview = jwxyz_window_view (xwindow);
+ XWindowAttributes xgwa;
+ int window_x, window_y;
+ Window unused;
+
+ // Figure out where this window is on the screen.
+ //
+ XGetWindowAttributes (dpy, xwindow, &xgwa);
+ XTranslateCoordinates (dpy, xwindow, RootWindowOfScreen (screen), 0, 0,
+ &window_x, &window_y, &unused);
+
+ // Grab only the rectangle of the screen underlying this window.
+ //
+ CGRect cgrect;
+ double s = jwxyz_scale (xwindow);
+ cgrect.origin.x = window_x;
+ cgrect.origin.y = window_y;
+ cgrect.size.width = xgwa.width / s;
+ cgrect.size.height = xgwa.height / s;
+
+ /* If a password is required to unlock the screen, a large black
+ window will be on top of all of the desktop windows by the time
+ we reach here, making the screen-grab rather uninteresting. If
+ we move ourselves temporarily below the login-window windows
+ before capturing the image, we capture the real desktop as
+ intended.
+
+ Oct 2016: Surprise, this trick no longer works on MacOS 10.12. Sigh.
+ */
+
+ CGWindowID windowNumber = (CGWindowID) nsview.window.windowNumber;
+
+ {
+ CFArrayRef L = CGWindowListCopyWindowInfo (kCGWindowListOptionOnScreenOnly,
+ kCGNullWindowID);
+
+ CFIndex n = CFArrayGetCount(L);
+ for (int i = 0; i < n; i++) {
+ NSDictionary *dict = (NSDictionary *) CFArrayGetValueAtIndex(L, i);
+
+ // loginwindow creates multiple toplevel windows. Grab the lowest one.
+ if(![([dict objectForKey:(NSString *)kCGWindowOwnerName])
+ compare:@"loginwindow"]) {
+ windowNumber = ((NSNumber *)[dict objectForKey:
+ (NSString *)kCGWindowNumber]).intValue;
+ }
+ }
+ CFRelease (L);
+ }
+
+ // Grab a screen shot of those windows below this one
+ // (hey, X11 can't do that!)
+ //
+ CGImageRef img =
+ CGWindowListCreateImage (cgrect,
+ kCGWindowListOptionOnScreenBelowWindow,
+ windowNumber,
+ kCGWindowImageDefault);
+
+ if (! img) return False;
+
+ // Render the grabbed CGImage into the Drawable.
+ jwxyz_draw_NSImage_or_CGImage (DisplayOfScreen (screen), drawable,
+ False, img, geom_ret, 0);
+ CGImageRelease (img);
+ return True;
+}
+
+#endif /* 10.5+ code */
+
+
+# ifndef USE_IPHONE
+
+/* Returns the EXIF rotation property of the image, if any.
+ */
+static int
+exif_rotation (const char *filename)
+{
+ /* As of 10.6, NSImage rotates according to EXIF by default:
+ http://developer.apple.com/mac/library/releasenotes/cocoa/appkit.html
+ So this function should return -1 when *running* on 10.6 systems.
+ But when running against older systems, we need to examine the image
+ to figure out its rotation.
+ */
+
+# if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 /* 10.6 SDK */
+
+ /* When we have compiled against the 10.6 SDK, we know that we are
+ running on a 10.6 or later system.
+ */
+ return -1;
+
+# else /* Compiled against 10.5 SDK or earlier */
+
+ /* If this selector exists, then we are running against a 10.6 runtime
+ that does automatic EXIF rotation (despite the fact that we were
+ compiled against the 10.5 or earlier SDK). So in that case, this
+ function should no-op.
+ */
+ if ([NSImage instancesRespondToSelector:
+ @selector(initWithDataIgnoringOrientation:)])
+ return -1;
+
+ /* Otherwise, go ahead and figure out what the rotational characteristics
+ of this image are. */
+
+
+
+ /* This is a ridiculous amount of rigamarole to go through, but for some
+ reason the "Orientation" tag does not exist in the "NSImageEXIFData"
+ dictionary inside the NSBitmapImageRep of the NSImage. Several other
+ EXIF tags are there (e.g., shutter speed) but not orientation. WTF?
+ */
+ CFStringRef s = CFStringCreateWithCString (NULL, filename,
+ kCFStringEncodingUTF8);
+ CFURLRef url = CFURLCreateWithFileSystemPath (NULL, s,
+ kCFURLPOSIXPathStyle, 0);
+ CGImageSourceRef cgimg = CGImageSourceCreateWithURL (url, NULL);
+ if (! cgimg) return -1;
+
+ NSDictionary *props = (NSDictionary *)
+ CGImageSourceCopyPropertiesAtIndex (cgimg, 0, NULL);
+ int rot = [[props objectForKey:@"Orientation"] intValue];
+ CFRelease (cgimg);
+ CFRelease (url);
+ CFRelease (s);
+ return rot;
+
+# endif /* 10.5 */
+}
+
+# endif /* USE_IPHONE */
+
+
+
+/* Loads an image file and splats it onto the drawable.
+ The image is drawn as large as possible while preserving its aspect ratio.
+ If geom_ret is provided, the actual rectangle the rendered image takes
+ up will be returned there.
+ */
+Bool
+osx_load_image_file (Screen *screen, Window xwindow, Drawable drawable,
+ const char *filename, XRectangle *geom_ret)
+{
+# ifndef USE_IPHONE
+
+ if (!filename || !*filename) return False;
+
+ NSImage *img = [[NSImage alloc] initWithContentsOfFile:
+ [NSString stringWithCString:filename
+ encoding:NSUTF8StringEncoding]];
+ if (!img)
+ return False;
+
+ jwxyz_draw_NSImage_or_CGImage (DisplayOfScreen (screen), drawable,
+ True, img, geom_ret,
+ exif_rotation (filename));
+ [img release];
+ return True;
+
+# else /* USE_IPHONE */
+
+ /* This is handled differently: see grabclient.c and grabclient-ios.m. */
+ return False;
+
+# endif /* USE_IPHONE */
+}
diff --git a/OSX/iSaverRunner.ai b/OSX/iSaverRunner.ai
new file mode 100644
index 0000000..a91e23c
--- /dev/null
+++ b/OSX/iSaverRunner.ai
@@ -0,0 +1,3593 @@
+%PDF-1.5 %
+1 0 obj <</Metadata 108 0 R/Pages 2 0 R/OCProperties<</D<</RBGroups[]/ON[18 0 R 93 0 R]/Order 92 0 R>>/OCGs[18 0 R 93 0 R]>>/Type/Catalog>> endobj 108 0 obj <</Subtype/XML/Length 50776/Type/Metadata>>stream
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.1-c036 46.277092, Fri Feb 23 2007 14:16:18 ">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about=""
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <dc:format>application/pdf</dc:format>
+ <dc:title>
+ <rdf:Alt>
+ <rdf:li xml:lang="x-default">iSaverRunner</rdf:li>
+ </rdf:Alt>
+ </dc:title>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xap="http://ns.adobe.com/xap/1.0/"
+ xmlns:xapGImg="http://ns.adobe.com/xap/1.0/g/img/">
+ <xap:CreatorTool>Adobe Illustrator CS3</xap:CreatorTool>
+ <xap:CreateDate>2012-06-04T14:04:08-07:00</xap:CreateDate>
+ <xap:ModifyDate>2012-06-04T14:30:53-07:00</xap:ModifyDate>
+ <xap:MetadataDate>2012-06-04T14:30:53-07:00</xap:MetadataDate>
+ <xap:Thumbnails>
+ <rdf:Alt>
+ <rdf:li rdf:parseType="Resource">
+ <xapGImg:width>244</xapGImg:width>
+ <xapGImg:height>256</xapGImg:height>
+ <xapGImg:format>JPEG</xapGImg:format>
+ <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAD0AwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8AG56I+cOxV2KuxV2KuxV2&#xA;KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvRfyZ/46eo/8YE/4nmh7&#xA;d+iPvd/2B9cvc9XzmXqHzHnoj5w7FXYq7FXYq7FXYq7FXYq7FUNd6jZ2s1vDcSiKS7cxW3IHi0gU&#xA;tw5UoCQNgTv2yueSMSATz5NkMUpAkC+Hmlfk7zE+uaSZblUh1K1lkttQtkrSOWNiNgSTQjfKNHqP&#xA;FhZ2kDRHm363TeFOhvEiwfJPcy3EdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVei/kz/x0&#xA;9R/4wJ/xPND279Efe7/sD65e56vnMvUPmPPRHzh2KuxV2KuxV2KuxV2KuxV2KpN5w0Ma15eurJV5&#xA;XAAmtd6Umi+JN+1SOJPgcxNbp/FxGPXp73N7P1Pg5ozP03v7uryfQ9d1bQfNX6XIa50zUYRNekfa&#xA;kiUDnLxHWWIfG/8AsjsDtyWj7VOPLxS6mpfr/HX3vedt+zvDjAx74yOLGfL+afd1+b263uIbiCO4&#xA;gcSQzKHikU1DKwqCD7jO2jISFjkXziUTE0eYX5Ji7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7&#xA;FXov5M/8dPUf+MCf8TzQ9u/RH3u/7A+uXuer5zL1D5jz0R84dirsVdirsVdirsVdirsVdirsVeZ6&#xA;ppixapqOngmIwzi7spQASguP3gYA7UEhkXidiBTpnnfben8PUSFemW/zfevYvLHtDsvwZ/VjNeY/&#xA;mn7/AIbLvI3mFtIvxol7+60+4lKWe5K21y3xegCd/Sl3aEn3Xcg023YPadHwZn+qfx+L94fPPars&#xA;KWGZmBRH1frHl3eXmC9KzrniHYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq9F/Jn/AI6eo/8A&#xA;GBP+J5oe3foj73f9gfXL3PV85l6h8x56I+cOxV2KuxV2KuxV2KuxV2KuxV2KsM85QiLX7C5HS6t5&#xA;YJPnCyyR/hJJnJe0+L6J/B9U/wCBfqzHPkxdJRv4/wBjG9ZsYZoWlkjaSMIUuY0+20NeVU/4siYc&#xA;4/cU6Mc5ME9NiOXv/UeRfS/aDswajFxAXKI+ceo945j5dWY+TNenuo5NI1GVZdVsFRvrC/ZuraQA&#xA;w3UfiHUjl4HPQOxe0xqsW/1x5/j73557a7MOly7fRLl+PuZNm5dM7FUgk876HGurysz/AFXReKXN&#xA;zQem0rVrFGa/E6kAH3OYZ12McZ6Q5nz7g5o0GT0DrPkPLvKbaXfG/wBOtr0wvb/WI1kEMtA6hhUB&#xA;qE5kYp8cRKqtxssOCRjd0icsa3Yq7FXYq7FXYq7FXYq7FXYq7FXov5M/8dPUf+MCf8TzQ9u/RH3u&#xA;/wCwPrl7nq+cy9Q+Y89EfOHYq7FXYq7FXYq7FXYq7FXYq7FWL+fVpBpMg6rfcfoe3mBH30OaD2jF&#xA;6f8Azh+l7j/geT4e1I/1ZfckWcG/Q6jHHPb6TJq9kK3/AJRn9QoOsuk3dXkhPj6b+oUr9kDLNFrj&#xA;pNZGX8OTn7xt9or4vlntR2PGccmMfw+qP9WW/wBkr+D0i3niuII54W5xSqrxuOhVhUH7s9VjIEWH&#xA;xSUSDR5hjfnzzC+maY1tbOUvblHYuv2ooIxWWUe9PhT/ACiPDNX2vrvAx0PrlsP1vQeznZH5zPcv&#xA;7rGOKfuG7z3TrEanrmieU4UppNhI1zqrDdJruNQ86nxWMsIRmrwxE8kNOPphvLzPX9Tm6nIYwnqT&#xA;tKe0PKPSv909pzqnkXYq7FXYq7FXYq7FXYq7FXYq7FXYq9F/Jn/jp6j/AMYE/wCJ5oe3foj73f8A&#xA;YH1y9z1fOZeofMeeiPnDsVdirsVdirsVdirsVdirsVdirFvPkgKaTAPtPeGQj/Jjt5an/gmXOf8A&#xA;aSYGnA75Pdf8DvEZdpxPQRl9yR5wj9CrFe7TQJobZuN/52lTT7BSK8NPtw/rXJHgyyvT2IODTaU6&#xA;vWQxjlj3P9Y/qr7C+Y+0na0YwyZukhwx/qxvf/OJNe8PQYIrXT7COJSIrW0iCAsdljiWm59lGesx&#xA;AhGugH3PiJMpyvnKR+95Zrj6hrMN1ewr/puqywW1hG+3CF51jgQ16V58292Oed9odoeLnOQ/TG69&#xA;wfdezOwzoexpCv3uXhv/ADpAAfayjy7oFppXnW6sLYlk0XS7W0aQ9XluZHuJJG/ynYVzP9jpHKJ5&#xA;pc5H8f7l8+9sAMXBiHID8fezLO4eIdirsVdirsVdirsVdirsVdirsVdir0X8mf8Ajp6j/wAYE/4n&#xA;mh7d+iPvd/2B9cvc9XzmXqHzHnoj5w7FXYq7FXYq7FXYq7FXYq7FXYqwHXr9dR8xyNGeVtpiG1Rh&#xA;uGnkIaen+rxRfnyzh/aLVieQQHKH3vtX/Az7Jljxz1Mh9fpj7lCDTZtY1G20aElfrhJupF2MdrHQ&#xA;zMCOhIIRT/Mwzl8+cYoGZ6cvf0/W9521qTHGMcT6sm3uj/Ef0e8p3oHpaz5m1DXo1VdMsB+idCjU&#xA;URYYNppEA2o77KfAUzr/AGQ7OOLD4svrn+Px8Xwr2u7R8XL4Ufpj+P2/Jd58vSbO30dD8epMfrFO&#xA;1rFQy/8ABkrH8mObXt7V+Fg4R9U9vh1R7E9j/nddHiF48fqkx8sqXOnudljv7F2/1Uu4mP4DPPco&#xA;uEv6svuL7z20P8GP9aH+7iyiwr/ysXzdy3JXTSp8F+rsAP8AggxzqPYevyx/HWT4X7bX+Yj+OkWQ&#xA;Z2zxTsVdirsVdirsVdirsVdirsVdirsVei/kz/x09R/4wJ/xPND279Efe7/sD65e56vnMvUPmPPR&#xA;Hzh2KuxV2KuxV2KuxV2KuxV2KsY81+YponOkaY/G/dQ1zcjcW0TdD4GRx9gdvtHtXR9sdqjTx4Y/&#xA;3h+x7D2S9l59pZrlthjzPf5BjtvbxW8CQRLxjQUUdT8yT1J7nOClIk2X6J0+CGGAxwFRiKCNtrif&#xA;SvJmp6/BX9K69Iul6GBUEKzGJGXwLN6kte4C5gSxnU6uGEco7n3/AIofN4LtntEAZM97fTH3Dr8d&#xA;5e6mXaHpMGkaRaabB/d2sSx16ciB8TH3Zqk57HgxDHARHQPhGfMckzM9SwrUbo33mLUbvrHAwsbf&#xA;/Vgr6h+mZmH0DOF7f1PiagjpHZ92/wCBx2Z4OiOYj1ZT9g/H2IPVVlbTbn0v75Y2eL/XQcl/4YZp&#xA;Y1e723aWMz0+SI58Jr39GVw3UbfmNdSxH9xrOj2l/ER0Ijdox8zRxm69h51CeM8wT9n9r4X7bY7l&#xA;CY6/p/sZJnfvBOxV2KuxV2KuxV2KuxV2KuxV2KuxV6L+TP8Ax09R/wCMCf8AE80Pbv0R97v+wPrl&#xA;7nq+cy9Q+Y89EfOHYq7FXYq7FXYq7FXYqkUfnPRGu9Thd2ih0pOdxdsP3RoSrhCCWPBhxO252Fcw&#xA;o6/EZTjf93zLsMnZmaOPHMjbL9KprPmS3s9BTU7Wk73ioNNQ1HqvMOUfWhA4/E3goOOr1scWHxel&#xA;bed8mfZvZeXVamOniPUTR8u9htrA0SMZHMtxKxluZ2+1JI27Mf4DsNs83z5pZZmUuZfpvsrs3Fos&#xA;EcOMbR+0962+E7W5htzS5uWS2tz4STuIkP0M4yniA3PIb/Jl2pnOLTykPqqh75ekfeyrXLW3k86e&#xA;XtAt142Hl+xa99LtyNLa3B90ClhmX7FaY5c0s0uf4/X9j477Z6nw8McUfx+K+1PNQvI7KwubyT+7&#xA;tonmf/VjUsf1Z6bkmIRMj0FvmmLGZyER1NPONMikisIFlNZioeZvGR/ic/SxOeV5ZmUjI9S/VvZe&#xA;lGDTY8YFcMR8+v2onK3PX2d4YE8o6gx2066ufLt5/qSqGswfYIEP05nez2bwdfKPTJR+ex/2T4v7&#xA;X6E/lzHrikR8BvH/AGL0LPTXyh2KuxV2KuxV2KuxV2KuxV2KuxV2KvRfyZ/46eo/8YE/4nmh7d+i&#xA;Pvd/2B9cvc9XzmXqHzHnoj5w7FXYq7FUi86+YW0Dy7c6kih5UosSnpyc8R+JzXdp6o4cVx+omnY9&#xA;l6UZstS+kC3gF351803U7TS6lMHbsjcB9wpnHyyykbJJL2UcUYigAAo/4r8y/wDVzuP+RjYOI97L&#xA;hHcidN1zzVf30NnFqVxzmYLX1G2Hc9ew3yMshAu3K0WjOfLHHEbyP4+S/wA33jR6jJp1tIy2kEUd&#xA;uyBtn9P4/i8SHY9e+VYL4b73a+0RgNT4cPpxREB8Of2ksg8hDUL1Hvb24knitv3NmjsSqGg5FQel&#xA;FoMq1WQ7Rd57G6AEyzkcvSP0/jzLMcwnv19nw/Tejc/sfX7evhXl8P8Aw1Mp1P8AdTr+aXTdt/3I&#xA;/rxYl+cmr6nZfmNfm0uZID6NulYzxPH0g1NvdjmR2JtpxXefvfMu2N85vuH3MRtNe169uobOfUJ5&#xA;Ibh1jkRnJDKxoQR75tZzNFxNHhjPNCNc5Afa9YzUPuLsVUfqLX8Oq6EhIk1i2E2nkbEahYfvYwD2&#xA;MsYpXwXKM8vDlDL/ADDR/qy/V+l432j0XFIkf5SP+yjuPmP9y8oPmrzKCQdSuQR1HqNm/wCI975v&#xA;wDud/ivzL/1c7j/kY2HiPevCO53+K/Mv/VzuP+RjY8R714R3O/xX5l/6udx/yMbHiPevCO53+K/M&#xA;v/VzuP8AkY2PEe9eEdzv8V+Zf+rncf8AIxseI968I7nf4r8y/wDVzuP+RjY8R714R3Mp8gfmLrlr&#xA;rVtZX1w91ZXUgiKvuys5oCD7nbfMvR66eGYN+nqHD1mhhmgRQ4uhe8527wzsVdirsVei/kz/AMdP&#xA;Uf8AjAn/ABPND279Efe7/sD65e56vnMvUPmPPRHzh2KuxV2KsH/OT/lCp/8AjLF/xMZpO3P7of1n&#xA;edg/3p/q/pfP+cs9W7FWa/lzpy87nU5R8EQ9KM+5FXP0LT78xdTLkHt/Y/Ri555co7D7z8h96Qa9&#xA;YzwraX1xtPqySXoQ9o2meNf+CMbH5UyeHIJEgco7fZf6Xk9YTKfiS55Ll8yXonk+2Fv5ds1/adTI&#xA;x8ebEj8KZiZjci+p+z2Hw9FjHeL+Z/UnOVO6UbyOd4OVuwW5iZJrZz0E0LCSMn/ZqMaB2PI7OH2h&#xA;pvHwygOfT3jcfaGN/nRFFqF5pXmu0Ui01e2EcoPWO5tyVkjfwZQQv+xOR7HJgJYZc4H7C+V9rwuQ&#xA;yfzhR8iOYYHorhNYsXPRJ42/4Fwc20/pLidmy4dTjPdOJ+17Nmrfa3YqpXIuVVJ7Rgl7ayLcWjHo&#xA;JYzyUH/Jb7LexOJiJAxPI7OD2jpTnwmI+rnH+sOXz5HyLAvzK0aGHVYddsIymk6+pu4Af91T1pcw&#xA;N/lRyV2y7s7KTE45fXj2+HQ/EPkvaODhnxAVGe/uPUfAsOzYuvdirsVdirsVdiqY+XP+Uh0v/mLg&#xA;/wCTq4q+p89EfOHYq7FXYq9F/Jn/AI6eo/8AGBP+J5oe3foj73f9gfXL3PV85l6h8x56I+cOxV2K&#xA;uxVg/wCcn/KFT/8AGWL/AImM0nbn90P6zvOwf70/1f0vn/OWerbAqaYq9V06xOneUTDTjKLaSR69&#xA;eboW3+XTNdKXFP4vrOk0p03Zpj/F4cifeQT9nJEfmN5C8xa95o0bSPK+my6jLaaDAwt4aFxDDM8Z&#xA;c1I2BkQfTmP2LPihMnmZk/c+edrw4ZwA5cA/Sr6LDPb6XBbXMbQ3NsDBPEwoySRMY3UjxDKRl2Ue&#xA;ovpvYmQS0eMj+b92yOyt2rsVQGoW1pJY3enX546NqBEksoFTZ3aikd2o/kP2ZgP2d+xyEokSGSH1&#xA;x/2Q/m/q83kfaDsoGJyD6JfV/RP8/wDRL597BtJ/LDz5qmrXmm6RpMt/facVNzFblGZVb7Ei1ILI&#xA;3VWGxzbYssckRKPIvnU4Sxzo8w9DtJZJbaN5EMUxFJomBVkkXZ0YHoVYEHNdKNGn2nRakZ8Mcg/i&#xA;F/r+1VyLlOxVCy6dZ6jbXHl2/cRWWqyCXTrtulrqVKKT4R3A+Fv8r3bKcplCQzR5x+od8f1j8cni&#xA;/aDswWZfwZD/AKWff7pff72AaT+V3n7WNRvtO0vRpry+01gl7bxFC8dfssVLA8W/Zboc3OLLHJES&#xA;ibBfPsmOUJGMhRCbf8qB/OT/AKlO+/4Ff+assYO/5UD+cn/Up33/AAK/81Yq035B/nIqlj5Tv6AV&#xA;NEUnbwAauKsEuLe4triW2uYnhuIXaOaGRSjo6GjKymhBBFCDiqniqY+XP+Uh0v8A5i4P+Tq4q+p8&#xA;9EfOHYq7FXYq9F/Jn/jp6j/xgT/ieaHt36I+93/YH1y9z1fOZeofMeeiPnDsVdirsVYP+cn/AChU&#xA;/wDxli/4mM0nbn90P6zvOwf70/1f0vn/ADlnq0w0Cx+vazaWxAZXkBdT3Rfib/hQchklUSXYdlaX&#xA;x9TDH0Mt/cNz9j166h9a2mh/34jJ/wAEKZrAaL7Hnx8eOUf5wI+b0f8ALzWFt/zB/LnWnNItZ0+f&#xA;S7qQnpJLbpPEu/czRFcxuxzw5cuPul+v9j5R2sOLHjn5fj9KT/mz5fbQPzK1q2C8bbU3Gr2Z8Vuy&#xA;TP8ASLlZD8iM2OpjRt6z2P1nHgliPOBse4/t+9iuYz2DsVcQCKHcHqMUKOlajrHl3WbDUdHuRaah&#xA;Ytw0i7f+6Cufi0+83HK1m6ISf3beAoVMZnGTMcv4h/vh59/f73ge3+wxD1Q+jp/RPcf6J6fzTtyT&#xA;fzNqGmapqbeZNNgayg1mZ11jSn+3p+tKOVzbtsKpOAZo2/aPPpSgycwEgJx3BZeyfaJhI6We3WPv&#xA;6j9Pz70uzFe9diqyeCGeF4ZkDxSAq6HoQcINNeXFHJExkLieaY6FqGurfLe6VePb+eNFhMul3tdt&#xA;SskIL2d2vSUrsu++6t1qcxRlOlmJD+5kdx/NPePL8dz572x2SYyMDvKrgf5w/mnzH6j3vrXyH5w0&#xA;/wA4+UdM8yWAKQahFzaI/ajlUlJYj7pIrL9GdA8an2KuxV+en/ORyIn52eagqhQbiI0Apu1vESfp&#xA;JxV5tiqY+XP+Uh0v/mLg/wCTq4q+p89EfOHYq7FXYq9F/Jn/AI6eo/8AGBP+J5oe3foj73f9gfXL&#xA;3PV85l6h8x56I+cOxV2KuxVg/wCcn/KFT/8AGWL/AImM0nbn90P6zvOwf70/1f0vn/OWerZZ+XNr&#xA;6msSzkVWCI0PgzED9VcxtSfTT1vsfg4tTKf82P2nb7rej5gvpaP0+a9k8lXcWnmms+UL+PV9MG5N&#xA;I5DdRmny9WMD2zAlLwdXGf8ADkFH7v1F887X0m2TH/NlxR9x3/XH4PZfzqsLLzj+WmkfmDo49Q6b&#xA;Ct/RfiZtOu1X60hp3hosp8ODDvnRZYcUadB2Jr/yupjM/Sdpe4/q5/B4WCCAQag9DmsfYQbdil2K&#xA;rZYo5onilUPG4Kuh3BB6g4QaYZMcZxMZC4nmgLyG6ksbySJ2fUbCBTej7TXenRMDFcUqOVxYyBd6&#xA;jkmzEhiDHFkGKfCf7vJ/sZfql975x2t2fPTZeKB9UPVE98R+mPI94oq+mX8d9ZR3KEfEKOF3AYbG&#xA;nt4HuMsnHhNPe9na2Opwxyx68/I9UVkHNdiqlM91BJDf2VPr9jIJ7WuwZlBDRn/JkUlG9jgnATiY&#xA;y5Sdd2ppDmxHh+uPqj7+748ntf8Azjr5jtoPMuveW4GP6M1iGPzPoanbitxSK8jp24y8TwHTfMjs&#xA;3ITi4ZfVA8J+H7HybtHGI5bH0z9Q+P7XvebBwXYq/Pb/AJyR/wDJ2+af+M8P/UNFirzTFUx8uf8A&#xA;KQ6X/wAxcH/J1cVfU+eiPnDsVdirsVei/kz/AMdPUf8AjAn/ABPND279Efe7/sD65e56vnMvUPmP&#xA;PRHzh2KuxV2KsH/OT/lCp/8AjLF/xMZpO3P7of1nedg/3p/q/pfP+cs9Wz78s4aW99L3do1HyUN/&#xA;XMPVHcPoHsVjqGSXeY/ZbNcxHuFbSdWXRNct9Uk2s3H1TUvAQSMCspH/ABU+5/yS2Y2s0/i4zEfU&#xA;Nx+r4/fToO29PQGYfw7S/qnr/mn7CXs/5D6xFpWo61+WGp8Xsh6mo+W0kAKSWFyx+sWwB2PoyMdu&#xA;4Ynpmx7N1XjYgf4hsff+18z1+m8HKR0O4eS+a/LEvlPzVqXlpw3o2Lh9OkfcyWM1Wt2qftcQDEx7&#xA;shwZ4cMve+j+zHaP5jTCJ+vHt8Oh/R8Esyh6R2KuxVTe8bTrm21dByOnyepKgFeduw43EdO/KMmg&#xA;8QMhlxeJAw7/AL+n2un7a0/Hh4x9WP1fD+IfL7QEsOnxeXPN99okTV0+7pd6W1RxaGVS6cN6tQK6&#xA;E/5AyeDN42ETP1DaXv8Ax97z3s7n8DUy0/8ABP1R/Hu/3Kb4vcuxV2Kpj+XmuN5f8+eWrwtwisdV&#xA;FlJ2X6jritGeX+TFdIX9qjLNOeHN/Xj9sf2H7HzH2l0nhZDXK+Ie6fP5SB+YfaGbN5V2Kvz2/wCc&#xA;kf8Aydvmn/jPD/1DRYq80xVMfLn/ACkOl/8AMXB/ydXFX1Pnoj5w7FXYq7FXov5M/wDHT1H/AIwJ&#xA;/wATzQ9u/RH3u/7A+uXuer5zL1D5jz0R84dirsVdirB/zk/5Qqf/AIyxf8TGaTtz+6H9Z3nYP96f&#xA;6v6Xz/nLPVvQ/wAtpFOm3UY+0soJ/wBkv9mYWq5h9G9jJDwJjul+j9jMMxXsmnRXUo4DKwIZTuCD&#xA;1BwsZRBFHkUdo+o6t6VlHp0nHzb5Vf695anav+lWqbS2b/zfu/3bD9peJ/mzE4vy2bxB/dz2l5Hv&#xA;/Hn5PnvbHZZjeLu3ge8fzfeP1HvepfmqdM8//lvo/wCZ+gpWbTUI1ODrIlpIwW6ikA/atZgJN+ih&#xA;yPtZvMsOKLpewu0PyupEj9B9Mvcf1c3kGa19edirsVcQCCCKg9Rigi0n1O01a4fSIQFki0uQLbXn&#xA;LjKtmWBa2kB+2q8f3bA1HQjvhxQjEyI/j5jz7/1vIZOws0NTjnjo44SB8xG94+fl9venGB7B2Kux&#xA;VKPMMcn1eR4m4PJBLEHGxDxgXcJH+V61sqj/AFskDRB7iP1H7C8n7V6bixCfdY/3w+2NfF9x+VNb&#xA;j17yvpGtx04anZW92AO3rxLJT6OWbV8zTXFX57f85I/+Tt80/wDGeH/qGixV5piqY+XP+Uh0v/mL&#xA;g/5Orir6nz0R84dirsVdir0X8mf+OnqP/GBP+J5oe3foj73f9gfXL3PV85l6h8x56I+cOxV2KuxV&#xA;g/5yf8oVP/xli/4mM0nbn90P6zvOwf70/wBX9L5/zlnq2W/l1qKwanLZuaC6Sqf68dSB/wACTmNq&#xA;Y2L7nr/Y/WCGeWI/5QfbH9lvRswX0l2KqU0UrGOWCU293buJbW5X7Uci9G9x2YdxtiQCCCLBcPXa&#xA;OOox8J2PMHuPf+vvDOPyk89WekeZ5bLUYkj8secZPqGvacx/c2eryoVWUBj/AHF6m1fHqfhpluhm&#xA;YfupG6+k98f1jkXyvtbRyx5CSKN1Idx7x5S5hieo6NNoOsaloEzMz6PdS2au/wBp4kNYHPu8DI30&#xA;45o1J9F9ntZ4+kiT9UfSfh+ylDKnduxV2KuxV2KuxV2KoPViEsJJynP6sVueH83oMJafTwphAvbv&#xA;2+brO2MXHpZ+Q4v9L6v0Pp7/AJxt1Frn8pNMs5X53GjzXemTH/mGuHEY/wCRRTNnjlxRB7w+OTjw&#xA;yI7np+TYvz2/5yR/8nb5p/4zw/8AUNFirzTFUx8uf8pDpf8AzFwf8nVxV9T56I+cOxV2KuxV6L+T&#xA;P/HT1H/jAn/E80Pbv0R97v8AsD65e56vnMvUPmPPRHzh2KuxV2KsH/OT/lCp/wDjLF/xMZpO3P7o&#xA;f1nedg/3p/q/pfP+cs9WrWl1La3UVzEaSQsHU+6muCQsU3afPLFkjOP1RNvZdPvYb6yhu4T+7mUM&#xA;B4HuD7g7Zq5Ro0+06TUxz4o5I8pC/wBnw5IjIuS7FUv1WCH0pXm2tbmI218f5Y2PKKf5283GT5ch&#xA;3xIOxH1RNj9I+I2ea9o9AMmLxAPpFS/q9/8Amnf3WmmpeZ4/MmrrqUhb9MSadYr5gRwQ66jbiS0l&#xA;5e7paxvtXZhmTqCDUh1dd7GTkI5YH+Ex+2/1KeYz2zsVdirsVdirsVdiqyaNZYnjb7LqVPyIphBY&#xA;ZICUTE9RT2b/AJxG1B/0N5k0lz8UNxZamwoPtalZIXp/s4GzP08rj7iR8iQ+I6mJE9/I/MPfsvaH&#xA;57f85I/+Tt80/wDGeH/qGixV5piqY+XP+Uh0v/mLg/5Orir6nz0R84dirsVdir0X8mf+OnqP/GBP&#xA;+J5oe3foj73f9gfXL3PV85l6h8x56I+cOxV2KuxVg/5yf8oVP/xli/4mM0nbn90P6zvOwf70/wBX&#xA;9L5/zlnq3Yqzr8utUmCTWMoJt+Y9GTssjhjwr/lLGxHyOYmpx/xPceyHafDI6eR57x9/Ufp+fezn&#xA;MN9AdirTKrKVYAqRQg7gg4UEAiihbLTLazklkiLFpQiEueVEiBEaA9aKDQV7bdAMJLgaLs3FpjI4&#xA;79dfZyHwtF5F2DsVdirsVdirsVdirsVejf8AOM1x9T89NaV4x6v5cjuR4NJZXrQgD3EcwzI0M7Mx&#xA;3T/QHxrtSFZAR1H6S+m8z3WPz2/5yR/8nb5p/wCM8P8A1DRYq80xVMfLn/KQ6X/zFwf8nVxV9T56&#xA;I+cOxV2KuxV6L+TP/HT1H/jAn/E80Pbv0R97v+wPrl7nq+cy9Q+Y89EfOHYq7FXYqwf85P8AlCp/&#xA;+MsX/Exmk7c/uh/Wd52D/en+r+l8/wCcs9W7FXvP/OK/lHTfN0nnPQb+qRXWnQ+jcKKvBMk3KKZP&#xA;8qNwG9+h2OAi2ePJKEhKJojdq907U9K1K80bVohBqunSGC7jFeJNKpLHXcxyoQ6HwPjmtyQ4TT7B&#xA;2P2lHWYBMfUNpDz/AFHopZW7V2KuxV2KuxV2KuxV2KuxV2KqF7cG3tJZgpd0UlEG5ZzsqgeLNQYQ&#xA;N3G1eoGHFLIf4R/YPiXpn5XWc1t+bfk/S9ORrqXQtIubfzHPGKxwRy26+h6jdmknTZPA16ZV2OZS&#xA;OTIR6Zy2+18o7W4RwQv1RG/2PpzN26d+e3/OSP8A5O3zT/xnh/6hosVeaYqmPlz/AJSHS/8AmLg/&#xA;5Orir6nz0R84dirsVdir0X8mf+OnqP8AxgT/AInmh7d+iPvd/wBgfXL3PV85l6h8x56I+cOxV2Ku&#xA;xVg/5yf8oVP/AMZYv+JjNJ25/dD+s7zsH+9P9X9L5/zlnq3Yq+kP+cJLq2Tzl5htnkVZ5tPRoYia&#xA;MwjmHMqO/HkK4q9w/PH8rZfM1gnmDQ4gfM2lxlfQFB9dtQSzWxP+/FJLQk/tVU7MSK8mPiFO17I7&#xA;Uno8wmN4n6h3j9fc+b4ZkmjDpUA1BVgVZWBoysp3DKRQg9M1xBBovrun1EM0BOBuMl+RbnYq7FXY&#xA;q7FXYq7FXYq7FUHbNqep+aNP0XQ7f69rDSqbO2/YNyByjeU9orcfvnPsvicn4ByDh6Hn7uvz5fN4&#xA;r2n7WECMUeY3Pv8A4R8Pq/0r6/8Ayy/LvTvI3lxdOhf61qdy31nWNUcfvbq6fd5GPXiOiL2HvU5s&#xA;oxEQAOQfPpSMjZ5ll2SYvzx/5yJube4/OnzVJBIssYukjLoQRzjgjR1qO6upB98Vec4qmPlz/lId&#xA;L/5i4P8Ak6uKvqfPRHzh2KuxV2KvRfyZ/wCOnqP/ABgT/ieaHt36I+93/YH1y9z1fOZeofMeeiPn&#xA;DsVdirsVYP8AnJ/yhU//ABli/wCJjNJ25/dD+s7zsH+9P9X9L5/zlnq3Yqr2V9e2N1Hd2NxJa3UR&#xA;rFcQu0ciGlKq6kMNj2xVOf8AlYXn7/qZdV/6Trn/AJrxVU0Dzlf2eoyzahPLeRXb87p5WMkhc9ZO&#xA;TEkt4165TlxcQ83oOwu25aOdS3xS5ju8x+N3pdvcQ3EKTwOJIpByR16EZryKfVMOaOSInA3E8iqY&#xA;Gx2KuxV2KuxV2KuxVJvMvmKDR7StQ13KCII+tP8AKYeA/HLcWMyLpO2+2I6PH35JfSP0ny+95tae&#xA;Yddsr176x1C5s7uQFXuLeZ4pCrHkVLIVNC25HjmxEQHybLllkkZSNko//lYXn7/qZdV/6Trn/mvC&#xA;1tH8wfPrAg+ZdVIOxBvbihH/AAeKpCSSSSak7knrXFWsVTHy5/ykOl/8xcH/ACdXFX1Pnoj5w7FX&#xA;Yq7FXov5M/8AHT1H/jAn/E80Pbv0R97v+wPrl7nq+cy9Q+Y89EfOHYq7FXYqwf8AOME+SbggbCWK&#xA;p/56DNJ25/dD+s7zsH+9P9X9L5/zlnq3Yq7FXYq7FU98tearrR5PTYGayc1eGu4/yk8D+vKcuES9&#xA;7vuxu3cmjPCfViPMfpH43el6bqthqUAms5RIv7S9GU+DDtmDKBjzfTtFr8OphxY5X9494ReQcx2K&#xA;uxV2KuxVjvmHzjZ6dG0dsRcXfQU3RT03PcjwH00y/HhMubzPa/tJi0wMcfryfYPf+ofGnm17e3N7&#xA;cvcXLmSVzVmOZ0YgCg+aanUzzTM5m5FD5JodirsVdirsVTLy2CfMWl0/5a4P+Ti4q+ps9EfOHYq7&#xA;FXYq9F/Jn/jp6j/xgT/ieaHt36I+93/YH1y9z1fOZeofMeeiPnDsVdirsVQGu6NZ6zpc+nXYrDOt&#xA;CR1B7Ee4zF1emGbGYFytHqjgyCY/AeR3P5G6yszC3vY5If2WYUNPffObl2NnB2o/F6aPbWAjex8F&#xA;L/lR/mH/AJaYf8/pyP8AI+fuHzZfyzp+8/J3/Kj/ADD/AMtMP+f04/yPn7h81/lnT95+Tv8AlR/m&#xA;H/lph/z+nH+R8/cPmv8ALOn7z8nf8qP8w/8ALTD/AJ/Tj/I+fuHzX+WdP3n5O/5Uf5h/5aYf8/px&#xA;/kfP3D5r/LOn7z8lW2/JvzXaSia3v0hkX9tCVNPobBLsbORuB827B7Q48UuLHKUZeVpTN531TSr+&#xA;ewuvS1AWzGNplBiZmH2htUbHb7OaSWmHR73Se2GogKyRE/8AYn7NvsR0X5k6UVBmtp0bwTi/6ymU&#xA;nSy73c4/bPTkeqEx7qP6Qj7DznpV/MIbZW9Q9BNJb24/4OeWJPxyvJiMBZ+wE/cC5Mfa3Sy2An/s&#xA;R98gySbStbhsfr94LLS7E7i6vruPie/wCATBz7BswPzuMy4Y8U5dwH66ZZvaAiNiAA75SH6Lv5vP&#xA;/MvnCxo1tp9zJqLdGuGQ21sP9SGrSyfOV+P+RmxwYZneQ4fLmfny+XzeR7S9oc2a4iW3l6Y/rPxN&#xA;eSQ+XdDufMmq/UluViuWTlGZOjcSBxHSmx2zZ4cRlIRjzLzGbMIRM5cgy7/lR/mH/lph/wA/pzY/&#xA;yPn7h83W/wAs6fvPyd/yo/zD/wAtMP8An9OP8j5+4fNf5Z0/efk7/lR/mH/lph/z+nH+R8/cPmv8&#xA;s6fvPyd/yo/zD/y0w/5/Tj/I+fuHzX+WdP3n5O/5Uf5h/wCWmH/P6cf5Hz9w+a/yzp+8/J3/ACo/&#xA;zD/y0w/5/Tj/ACPn7h81/lnT95+TI/Jf5QnStSj1HVLhZ5ITWGBR8IPSpNTX/P6MvSdjTExLJVDo&#xA;4es7agYGOO7PXuem50rzLsVdirsVei/kz/x09R/4wJ/xPND279Efe7/sD65e56vnMvUPmPPRHzh2&#xA;KuxV2KuxV2KuxV2KuxV2KuxVhX5k+ebfQdMe1t3DancqViTY8Qdizew/z9tH2trxGJxx+o8/J3vZ&#xA;HZ5lIZJfSOXmXz8zM7F2JZmJLMdySe+cu9UtxV2Kt8jQCuw3A+eKtYqidN1C506/gvbZuM8Dh0Py&#xA;6g07EbHCDW4QQCKL6S8oebNP8x6XHc27gTqAJ4SfiVgN87Ls/XDPGj9Y5/reL7R0BwSsfQeX6k9z&#xA;YutdirsVdirsVdirsVdirsVdir0X8mf+OnqP/GBP+J5oe3foj73f9gfXL3PV85l6h8x56I+cOxV2&#xA;KuxV2KuxV2KuxV2KoLV9a03SLQ3eoTCGEftHufAZi6nV48AuZ5uVpdHkzmoDk8x80fnZGUe30CEl&#xA;jUfW5QQB7quzffTNBqu2Zz2gOEd/X9j0Ok7EhDfIeI93T9rym9vbu9uXuruVpp5DV5G6n/PwzSEu&#xA;8AUMVdirsVdirsVdiqYaLrup6LereafMYpR9ofssPBh3yUJmJsGixnASFSFgvXPLn51aVcosWsxm&#xA;0nAoZVBaMn6Nx9Ob7TduEbZBfmP1PP6nsIHfEa8j+t6PbXMF1Ak8DiSKQVRx0Izf4c0ckRKJsF5/&#xA;NhlikYyFEKuWtTsVdirsVdirsVdirsVei/kz/wAdPUf+MCf8TzQ9u/RH3u/7A+uXuer5zL1D5jz0&#xA;R84dirsVdirsVdirsVdirsVQWq6NpmrQCDUbdLmFTyCOKivjmNqNJjzVxi6cnTavJhJ4DVpV/wAq&#xA;78l/9WmD/gRmL/JGn7vtLl/yxqP532B3/Ku/Jf8A1aYP+BGP8kafu+0r/LGo/nfYHf8AKu/Jf/Vp&#xA;g/4EY/yRp+77Sv8ALGo/nfYHf8q78l/9WmD/AIEY/wAkafu+0r/LGo/nfYHf8q78l/8AVpg/4EY/&#xA;yRp+77Sv8saj+d9gd/yrvyX/ANWmD/gRj/JGn7vtK/yxqP532B3/ACrvyX/1aYP+BGP8kafu+0r/&#xA;ACxqP532B3/Ku/Jf/Vpg/wCBGP8AJGn7vtK/yxqP532B3/Ku/Jf/AFaYP+BGP8kafu+0r/LGo/nf&#xA;YHf8q78l/wDVpg/4EY/yRp+77Sv8saj+d9gT21tLe0t0t7aMRQxjiiLsAB2GZ2HDHHHhiKDgZs0s&#xA;suKRsquWtTsVdirsVdirsVdirsVei/kz/wAdPUf+MCf8TzQ9u/RH3u/7A+uXuer5zL1D5jz0R84d&#xA;irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVei/kz/x&#xA;09R/4wJ/xPND279Efe7/ALA+uXuer5zL1Dyj/lTOp/8AVxg/4B86b+XYfzS8v/IE/wCcHf8AKmdT&#xA;/wCrjB/wD4/y7D+aV/kCf84O/wCVM6n/ANXGD/gHx/l2H80r/IE/5wd/ypnU/wDq4wf8A+P8uw/m&#xA;lf5An/ODv+VM6n/1cYP+AfH+XYfzSv8AIE/5wd/ypnU/+rjB/wAA+P8ALsP5pX+QJ/zg7/lTOp/9&#xA;XGD/AIB8f5dh/NK/yBP+cHf8qZ1P/q4wf8A+P8uw/mlf5An/ADg7/lTOp/8AVxg/4B8f5dh/NK/y&#xA;BP8AnB3/ACpnU/8Aq4wf8A+P8uw/mlf5An/ODv8AlTOp/wDVxg/4B8f5dh/NK/yBP+cHf8qZ1P8A&#xA;6uMH/APj/LsP5pX+QJ/zg7/lTOp/9XGD/gHx/l2H80r/ACBP+cHf8qZ1P/q4wf8AAPj/AC7D+aV/&#xA;kCf84O/5Uzqf/Vxg/wCAfH+XYfzSv8gT/nB3/KmdT/6uMH/APj/LsP5pX+QJ/wA4O/5Uzqf/AFcY&#xA;P+AfH+XYfzSv8gT/AJwd/wAqZ1P/AKuMH/APj/LsP5pX+QJ/zg7/AJUzqf8A1cYP+AfH+XYfzSv8&#xA;gT/nB3/KmdT/AOrjB/wD4/y7D+aV/kCf84O/5Uzqf/Vxg/4B8f5dh/NK/wAgT/nB3/KmdT/6uMH/&#xA;AAD4/wAuw/mlf5An/ODv+VM6n/1cYP8AgHx/l2H80r/IE/5wd/ypnU/+rjB/wD4/y7D+aV/kCf8A&#xA;ODv+VM6n/wBXGD/gHx/l2H80r/IE/wCcHf8AKmdT/wCrjB/wD4/y7D+aV/kCf84O/wCVM6n/ANXG&#xA;D/gHx/l2H80r/IE/5wd/ypnU/wDq4wf8A+P8uw/mlf5An/ODv+VM6n/1cYP+AfH+XYfzSv8AIE/5&#xA;wZN5G8jXflu7up57qOcTxqgCKRShr3zXdo9oxzxAAqnZdndnS08iSbtmOap2zsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs&#xA;VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir/9k=</xapGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xap:Thumbnails>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xapMM="http://ns.adobe.com/xap/1.0/mm/"
+ xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#">
+ <xapMM:DocumentID>uuid:82D8E573DAAFE111BF0B8F740ADF4EE3</xapMM:DocumentID>
+ <xapMM:InstanceID>uuid:8ccac4a0-f819-bd4b-9966-e33d3f17e366</xapMM:InstanceID>
+ <xapMM:DerivedFrom rdf:parseType="Resource">
+ <stRef:instanceID>uuid:b1ac9fe8-11a3-4422-b8f3-ae4b8085b7a8</stRef:instanceID>
+ <stRef:documentID>uuid:5D20892493BFDB11914A8590D31508C8</stRef:documentID>
+ </xapMM:DerivedFrom>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/">
+ <illustrator:Type>Document</illustrator:Type>
+ <illustrator:StartupProfile>Print</illustrator:StartupProfile>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xapTPg="http://ns.adobe.com/xap/1.0/t/pg/"
+ xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
+ xmlns:xapG="http://ns.adobe.com/xap/1.0/g/">
+ <xapTPg:NPages>1</xapTPg:NPages>
+ <xapTPg:HasVisibleTransparency>False</xapTPg:HasVisibleTransparency>
+ <xapTPg:HasVisibleOverprint>False</xapTPg:HasVisibleOverprint>
+ <xapTPg:MaxPageSize rdf:parseType="Resource">
+ <stDim:w>114.000000</stDim:w>
+ <stDim:h>114.000000</stDim:h>
+ <stDim:unit>Pixels</stDim:unit>
+ </xapTPg:MaxPageSize>
+ <xapTPg:PlateNames>
+ <rdf:Seq>
+ <rdf:li>Cyan</rdf:li>
+ <rdf:li>Magenta</rdf:li>
+ <rdf:li>Yellow</rdf:li>
+ <rdf:li>Black</rdf:li>
+ <rdf:li>PANTONE 485 CVC</rdf:li>
+ <rdf:li>PANTONE 152 CVC</rdf:li>
+ </rdf:Seq>
+ </xapTPg:PlateNames>
+ <xapTPg:SwatchGroups>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:groupName>Default Swatch Group</xapG:groupName>
+ <xapG:groupType>0</xapG:groupType>
+ <xapG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>White</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>255</xapG:red>
+ <xapG:green>255</xapG:green>
+ <xapG:blue>255</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>Black</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>35</xapG:red>
+ <xapG:green>31</xapG:green>
+ <xapG:blue>32</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>CMYK Red</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>236</xapG:red>
+ <xapG:green>28</xapG:green>
+ <xapG:blue>36</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>CMYK Yellow</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>255</xapG:red>
+ <xapG:green>241</xapG:green>
+ <xapG:blue>0</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>CMYK Green</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>0</xapG:red>
+ <xapG:green>165</xapG:green>
+ <xapG:blue>81</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>CMYK Cyan</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>0</xapG:red>
+ <xapG:green>173</xapG:green>
+ <xapG:blue>238</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>CMYK Blue</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>46</xapG:red>
+ <xapG:green>49</xapG:green>
+ <xapG:blue>145</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>CMYK Magenta</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>235</xapG:red>
+ <xapG:green>0</xapG:green>
+ <xapG:blue>139</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=15 M=100 Y=90 K=10</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>190</xapG:red>
+ <xapG:green>30</xapG:green>
+ <xapG:blue>45</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=0 M=90 Y=85 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>238</xapG:red>
+ <xapG:green>64</xapG:green>
+ <xapG:blue>54</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=0 M=80 Y=95 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>240</xapG:red>
+ <xapG:green>90</xapG:green>
+ <xapG:blue>40</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=0 M=50 Y=100 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>246</xapG:red>
+ <xapG:green>146</xapG:green>
+ <xapG:blue>30</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=0 M=35 Y=85 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>250</xapG:red>
+ <xapG:green>175</xapG:green>
+ <xapG:blue>64</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=5 M=0 Y=90 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>249</xapG:red>
+ <xapG:green>236</xapG:green>
+ <xapG:blue>49</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=20 M=0 Y=100 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>214</xapG:red>
+ <xapG:green>222</xapG:green>
+ <xapG:blue>35</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=50 M=0 Y=100 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>139</xapG:red>
+ <xapG:green>197</xapG:green>
+ <xapG:blue>63</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=75 M=0 Y=100 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>55</xapG:red>
+ <xapG:green>179</xapG:green>
+ <xapG:blue>74</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=85 M=10 Y=100 K=10</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>0</xapG:red>
+ <xapG:green>147</xapG:green>
+ <xapG:blue>69</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=90 M=30 Y=95 K=30</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>0</xapG:red>
+ <xapG:green>104</xapG:green>
+ <xapG:blue>56</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=75 M=0 Y=75 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>41</xapG:red>
+ <xapG:green>180</xapG:green>
+ <xapG:blue>115</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=80 M=10 Y=45 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>0</xapG:red>
+ <xapG:green>166</xapG:green>
+ <xapG:blue>156</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=70 M=15 Y=0 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>38</xapG:red>
+ <xapG:green>169</xapG:green>
+ <xapG:blue>224</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=85 M=50 Y=0 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>27</xapG:red>
+ <xapG:green>117</xapG:green>
+ <xapG:blue>187</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=100 M=95 Y=5 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>43</xapG:red>
+ <xapG:green>56</xapG:green>
+ <xapG:blue>143</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=100 M=100 Y=25 K=25</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>38</xapG:red>
+ <xapG:green>34</xapG:green>
+ <xapG:blue>97</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=75 M=100 Y=0 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>101</xapG:red>
+ <xapG:green>45</xapG:green>
+ <xapG:blue>144</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=50 M=100 Y=0 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>144</xapG:red>
+ <xapG:green>39</xapG:green>
+ <xapG:blue>142</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=35 M=100 Y=35 K=10</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>158</xapG:red>
+ <xapG:green>31</xapG:green>
+ <xapG:blue>99</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=10 M=100 Y=50 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>217</xapG:red>
+ <xapG:green>28</xapG:green>
+ <xapG:blue>92</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=0 M=95 Y=20 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>236</xapG:red>
+ <xapG:green>41</xapG:green>
+ <xapG:blue>123</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=25 M=25 Y=40 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>193</xapG:red>
+ <xapG:green>180</xapG:green>
+ <xapG:blue>154</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=40 M=45 Y=50 K=5</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>154</xapG:red>
+ <xapG:green>132</xapG:green>
+ <xapG:blue>121</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=50 M=50 Y=60 K=25</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>113</xapG:red>
+ <xapG:green>101</xapG:green>
+ <xapG:blue>88</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=55 M=60 Y=65 K=40</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>90</xapG:red>
+ <xapG:green>74</xapG:green>
+ <xapG:blue>66</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=25 M=40 Y=65 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>195</xapG:red>
+ <xapG:green>153</xapG:green>
+ <xapG:blue>107</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=30 M=50 Y=75 K=10</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>168</xapG:red>
+ <xapG:green>124</xapG:green>
+ <xapG:blue>79</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=35 M=60 Y=80 K=25</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>138</xapG:red>
+ <xapG:green>93</xapG:green>
+ <xapG:blue>59</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=40 M=65 Y=90 K=35</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>117</xapG:red>
+ <xapG:green>76</xapG:green>
+ <xapG:blue>40</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=40 M=70 Y=100 K=50</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>96</xapG:red>
+ <xapG:green>56</xapG:green>
+ <xapG:blue>19</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=50 M=70 Y=80 K=70</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>59</xapG:red>
+ <xapG:green>35</xapG:green>
+ <xapG:blue>20</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>PANTONE 485 CVC</xapG:swatchName>
+ <xapG:type>SPOT</xapG:type>
+ <xapG:tint>100.000000</xapG:tint>
+ <xapG:mode>CMYK</xapG:mode>
+ <xapG:cyan>0.000000</xapG:cyan>
+ <xapG:magenta>100.000000</xapG:magenta>
+ <xapG:yellow>91.000000</xapG:yellow>
+ <xapG:black>0.000000</xapG:black>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>PANTONE 152 CVC</xapG:swatchName>
+ <xapG:type>SPOT</xapG:type>
+ <xapG:tint>100.000000</xapG:tint>
+ <xapG:mode>CMYK</xapG:mode>
+ <xapG:cyan>0.000000</xapG:cyan>
+ <xapG:magenta>51.000000</xapG:magenta>
+ <xapG:yellow>100.000000</xapG:yellow>
+ <xapG:black>0.000000</xapG:black>
+ </rdf:li>
+ </rdf:Seq>
+ </xapG:Colorants>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:groupName>Print Color Group</xapG:groupName>
+ <xapG:groupType>1</xapG:groupType>
+ <xapG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=0 M=30 Y=70 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>252</xapG:red>
+ <xapG:green>186</xapG:green>
+ <xapG:blue>99</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=5 M=70 Y=90 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>231</xapG:red>
+ <xapG:green>110</xapG:green>
+ <xapG:blue>52</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=5 M=90 Y=75 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>228</xapG:red>
+ <xapG:green>64</xapG:green>
+ <xapG:blue>68</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=30 M=0 Y=95 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>190</xapG:red>
+ <xapG:green>214</xapG:green>
+ <xapG:blue>58</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=60 M=5 Y=95 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>116</xapG:red>
+ <xapG:green>182</xapG:green>
+ <xapG:blue>74</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=30 M=0 Y=10 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>174</xapG:red>
+ <xapG:green>222</xapG:green>
+ <xapG:blue>228</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=60 M=10 Y=5 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>87</xapG:red>
+ <xapG:green>182</xapG:green>
+ <xapG:blue>221</xapG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>C=80 M=5 Y=10 K=0</xapG:swatchName>
+ <xapG:mode>RGB</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:red>0</xapG:red>
+ <xapG:green>176</xapG:green>
+ <xapG:blue>216</xapG:blue>
+ </rdf:li>
+ </rdf:Seq>
+ </xapG:Colorants>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:groupName>Grayscale</xapG:groupName>
+ <xapG:groupType>1</xapG:groupType>
+ <xapG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>K=100</xapG:swatchName>
+ <xapG:mode>GRAY</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:gray>255</xapG:gray>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>K=90</xapG:swatchName>
+ <xapG:mode>GRAY</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:gray>229</xapG:gray>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>K=80</xapG:swatchName>
+ <xapG:mode>GRAY</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:gray>203</xapG:gray>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>K=70</xapG:swatchName>
+ <xapG:mode>GRAY</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:gray>178</xapG:gray>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>K=60</xapG:swatchName>
+ <xapG:mode>GRAY</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:gray>152</xapG:gray>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>K=50</xapG:swatchName>
+ <xapG:mode>GRAY</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:gray>127</xapG:gray>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>K=40</xapG:swatchName>
+ <xapG:mode>GRAY</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:gray>101</xapG:gray>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>K=30</xapG:swatchName>
+ <xapG:mode>GRAY</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:gray>76</xapG:gray>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>K=20</xapG:swatchName>
+ <xapG:mode>GRAY</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:gray>50</xapG:gray>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>K=10</xapG:swatchName>
+ <xapG:mode>GRAY</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:gray>25</xapG:gray>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xapG:swatchName>K=5</xapG:swatchName>
+ <xapG:mode>GRAY</xapG:mode>
+ <xapG:type>PROCESS</xapG:type>
+ <xapG:gray>12</xapG:gray>
+ </rdf:li>
+ </rdf:Seq>
+ </xapG:Colorants>
+ </rdf:li>
+ </rdf:Seq>
+ </xapTPg:SwatchGroups>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
+ <pdf:Producer>Adobe PDF library 8.00</pdf:Producer>
+ </rdf:Description>
+ </rdf:RDF>
+</x:xmpmeta>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<?xpacket end="w"?> endstream endobj 2 0 obj <</Count 1/Type/Pages/Kids[5 0 R]>> endobj 18 0 obj <</Intent 19 0 R/Usage 20 0 R/Name(Layer 1)/Type/OCG>> endobj 93 0 obj <</Intent 94 0 R/Usage 95 0 R/Name(Layer 1)/Type/OCG>> endobj 94 0 obj [/View/Design] endobj 95 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 19 0 obj [/View/Design] endobj 20 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 92 0 obj [93 0 R] endobj 5 0 obj <</Parent 2 0 R/Contents 103 0 R/BleedBox[0.0 0.0 114.0 114.0]/PieceInfo<</Illustrator 81 0 R>>/ArtBox[0.0 0.0 114.0 114.0]/Group 73 0 R/MediaBox[0.0 0.0 114.0 114.0]/Thumb 107 0 R/TrimBox[0.0 0.0 114.0 114.0]/Resources<</ColorSpace<</CS0 97 0 R/CS1 99 0 R/CS2 102 0 R>>/Properties<</MC0 93 0 R>>/ExtGState<</GS0 96 0 R>>>>/Type/Page/LastModified(D:20120604143053-07'00')>> endobj 103 0 obj <</Length 1202/Filter/FlateDecode>>stream
+HK$5y
+_@#!5x4vVV F jѕi/o_t~ 悷l֘՜{|؞-v8߻saX{?:s#̵C]eS3SKkZlv&o%vL;^f vYR}]\ȼz #7ffx |÷}ÊR|-a9V`&~̼Ιn嘑p[qqzr7QKw7Xbaŷt[:g|1b!Wwح:V*Ob{OyS{>.[c#se+cY]@-[.g@? 27SAx$i"waivT:o4;0y,D)`KR"q}e>V8\ńA8rfK4&a61$u, k#"T\]]Q}xk>w 5YسkXBQ汰^~fme4%™1)–'7IeqzaA4u ZJZކaq8u1B֣S]<E>bؐp"vq
+=נ4ObrW2 :Vق c"`8G01)3ў͐.lѱO jF! faD|Y<QNE2 DFd#U<Z`#צ(2DJ658H&UЁ}g$2?Ls e0&(FGHAMwZs{?ћf
+b<=9Gtp]E
+ޓڀCNx9'PG$ Dp&˯P43|鄉l #hlhE/ySA?8&l" {RLW
+Tbh&I0TE[Dudy(#O0<`\JUʲJ7CB%pc,;i\5߹%lOV4w] Q`t
+8;T`p_%?Z%#Qh!kGhIauV3no3/gB<q4;9^l%0co#qi_%^Z6r%5FW&DTM,@mM?`/gN
+Cj+NiAqc(R2."iEY8P;SHeH/CY#En0hjG^3DZG&K.d@~> endstream endobj 96 0 obj <</OPM 1/BM/Normal/CA 1.0/OP false/SMask/None/ca 1.0/AIS false/op false/Type/ExtGState/SA true>> endobj 97 0 obj [/ICCBased 98 0 R] endobj 99 0 obj [/Separation/PANTONE#20152#20CVC 100 0 R<</C0[0.0 0.0 0.0 0.0]/C1[0.0 0.509995 1.0 0.0]/FunctionType 2/N 1.0/Domain[0 1]/Range[0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]>>] endobj 102 0 obj [/Separation/PANTONE#20485#20CVC 100 0 R<</C0[0.0 0.0 0.0 0.0]/C1[0.0 1.0 0.910004 0.0]/FunctionType 2/N 1.0/Domain[0 1]/Range[0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]>>] endobj 100 0 obj [/ICCBased 101 0 R] endobj 101 0 obj <</Length 389756/Filter/FlateDecode/N 4>>stream
+HuTKtKKJI,t(݋4K%ҹH4J#Ғ(H
+wqyy~3̙g<3
+
+
+ShHht^ '0߅™kYXY9Yqqpl'WzEE$%D>,^|t*K)%/`\ҫ:&D [7dplDa5|mb4,yy{e5 3⚅,t+whlA   m k
+xYUH&%Ȥ
+qO'Mz3KT@v[NUnn^\o]abTrtlmE]e~U+jאZ:zaqi5};CS[\_ۆwCaQ1;>L$Lz}4:%8M7l̎Χ/}XT^]X>\Ym[n!ycskkƶʷ;v{pIs0Xݯ3s󝋒&$WWW*)!$$%!e$cHNOAKIMEq ƕ;KLw@YX;ؚ8^+DspfKOTCPpJ%D=++O%$*8IZ\Z^UK_wL"dx]}
+W3gLC#u!MMMEvAms˔FVNA̝GLwA̬,llؿsݛnͽ+!B²"<b4$݇kRғedk*JY*/TS'<SV҈ԌЊЎԉЍЋЏ042?M4I~fs-,󡅰"+uMm]}CcSQ\RZsvGiH3GFFaGDƬč&$V''g$FLG˰4͂djikhCf%VNeAqYUڪG^/Ճ[Z{Vڱ:;`=c}nK  Fv(ރ> 'R&k?3?4+:6oT\ұڿ6VʝoF?LT;:>::>:;eqvx^sawݥʕ'_
+*'[j o5[uR1uh`fm$1xJgBdrltlyyEe$feg-g#`dGbwj0TOC9; ܨݿxz6zx8IP=A!.aAxۑ
+\lGNػځNāa5tNzlߴS<H6*<a|kz|CV|Ǎ||Ik|Ru}26'~2F-B*ojQ^@5zI`ٳ
+~2gK>-N}o2ن N%է
+0e6M _1 ? 1ӣǾI^I|B̯dܪwLe1$: rW] 1S{z|diL g0\ U{[G{!{ ޔ`{&yE{xbie{Jr|/c5}~
+~:f#MKx+Ca|uI~.yW ώәߎ%¡唘[w!^T`^H*- 5GȨ瘎=Π4rv_ҍRGf,ދ̋|,ƕ{ Ҙtٕ^1Fő,;'<!_Yl~JJtS#]'FA4+;ۊLPf&ɔޝըs@夏]0E+:ևSS 𧠨jVPp,<XQ)XVl(Js&J!K{@BE. eWqQ䆓~37FHI^\ӡ+j&YbdML{#)FA;qT0_ ^9IݤxֺƢYFh9ՅhX;Jln+jġ(m,ּJ(VaV/aؑ@Q~.8_]7]g|F) -/MH|P8%oFxC<Rl A^QlzrJAUUd*N$i܏ #v b7F*4ނ
+ pvix֖IoJ۱#
+Whԉl"kx wVjGDz*ߜxW:ƩdP$j4WM[,]ʫ$W$I&N}7¨ s1@9TɎ.EzNDf*uwr *#,h؅"8=N %=(pQu9sLӓ(&wھ?ER AHi.R~ Ԅ6:*tД3*۱x#m?r~32+wp6yXaTO#
+U¼<_)I(}W2SX Uw Mf_T)?kYYFK8u;J$þ*1T
+.Jl6mHju,bU6+s hܸd-ʥ}wi
+{;Sm`vؿ`~?ga.
+3Ì{L^WYe4]L<pq޴k!G] l
+%ӂBsWď[~}F.+}Wt=
+Ke&,^-va(0 ttzSw0D6jtl.\lVդ)-g [ѭ'x||DDߵvwi8ư=݋bY
+TC7jKIX7
+_L
+uR_,^VS&aR~PfLL_Dw*`\-9]q  TI6)>u6 D`e͢/xqY%9ʜ;åOd\˾P&eRz;].R<oΡ]P{?: r̨\ʻb Ҥ3|m s؟W9oZt]RnÅ\cW#+nI&gyAjsN06HiD'@J+a5V~cRI̫vwtUc[3+?F|l(iU^+O?Rs
+1BvџnF/ BsGMY9>ܖ3ȗqI ڣ5V_1ȣβiJiX0WVH[8g
+n3 ` 38A.|f|ј0I6bv%& ;Y㿜҄#
+Q<
+;/ԱJB"7t͚,mXdھ^;촞&s`Y"Y{>Ɗ.z^48e!R6}vcMiozo0'=~i,3:?-?oS,9w#ROa; ?pB
+֞IO ݟe#}ԯN$\l?], y,>&Рq]yh0AqK)ĝBFҍcH:-h-ǟcf)K9T127]qEjL<>h;|U
+dpG
+ƫ`&!8al`83>.qɂnA9
+; `HByg KB*k㰗2fF=#OM eT?
+mTm_OBۊV
+wnKܑQVB"Խp *+تED* (o B'{pwH؆ʴ*JѪmA-nWjGEޯy~~?rI^WO@l)ƶWgiX"C#knA ˻r)b!UڲIb=>0ߴy}ĸB)H[Fs V+̯+Y(I(x&9JAI'tXmyG=X[8TK)2<TSRvxlȓGO|g/{>4/gRFȶ&A52 uЯ*B<i
+ar>>Ƶrn[ɭF
+p-1z(=f)
+vě92 w u煼ת#{P6+Dq3HIi%BCb!kc5&U ):X$܎[b2*@PkcӘdoTB_L1Uwi")=2#pI9,RO>T@>;bnDPuCfk^^\G~ oLRcHqܮ=-8^5Ońy*9:-\g8:T<?*C;[yX+I;lRL߭$DvYTQ6DyVmfy%/sIsmXP1Lռȭvow)QBb_
+ِ[Ak]J͆VBM"{NrQih
+ET9ٲFWcm$="G
+}Ke6~֔G_MDԿs` g]vp-9\Nd{::gvH_3fC;}Ɠ 
+-"{⠇TZG R,ɇjࣶZw8j ICF:b [ \+?
+oA n'a
+
+Oj0`%|^/si_XǣLqiw]IέD"J!y!Զn0R zWCcchūK_R [*)! OSouOշ܌WzeWCaϝL/QBo_k/cg&MV?֫5z !g"?wP͚IQ"PAdtE)q4jGsn{" }eUMrkzvi89C}XLB1W".ꕝ^M t?WKLwDP]tU揊1rJոKVGM;phշm v>-wgFN cIP#qWI ;NٶA)H~7i thl~~dzY Cx2>*c&mb{9f1X*L #>
+ V@g蒼]7n249=MK% ;,F\j 1klZi؊ΐ.|Q9а$_.!;̿lE,ɥDi}D3^a`Y5g{J=mɳy3CM'jM-iЦm n5? SJE+U~ ;q.tXd~~p*QeS%.Ћ"ưBsZ6-6[\d;^z4`;64藸ͱw;|+&AfLU3XTm)lF'l VɺgcGObbɜ9;v \CL, >B?KGCe"z -@EH</s=/ᑍY{Pw\L1A |U{_
+\wJuY/|ϕd<wΤc~ώx¡#dg3~g‡ xT2ȵ6s3i75ƻZE\1\ɺWA' ײ M }?;ʂ8|R0S#❣
+5 El[",0 e[Oz0~lUO+&xkPc|u$k.?{Qp""kr6isVa=~@W_
+.<7
+2#h?c~m'rE_xs6aG+K 14L^kUp^^_
+ K*/@hUv$j!@ vyבm,W|-͢ ^ ~D_􆭍"ĉ#c禘*X/Ϝe>|XH;:)d9gƖ4aBQ4
+ۯBU#>SV$L-5gV ϯ*B#} npþtdU$Db&$^\^&Z"/˺+-}%Z:}9AYu rTlP0"~! ͚*@5K?߫Z-P=j>܈[O?)a5
+?WUsy5^(ge${Cm> "Gգ+$踿ϫ& Xw8?g,'ō="/xNM)'EFqrf CįQ9ZY$r!6m<YZС.<V^z{US=P
+kX%3xfjn%^i𴵻s30qh$`kܯD&
+2#sL4j&Dib&,AMSUD9y
+v98jc7MI~(sL#}3(M^
+OajX_84V(N-{D)F0$!oJdv/_(ǀUH8B
+lz&,f^_!?l2x2Xyń3D)\
+EVD<O0Vbj&mLB2Z܈b9U;n6L0 +oˇCrE.~>TSؓ7X?MM!ԼuOtP Cbt;iްa@gW#@4c9.Do z2>M5i~u0 qswQ9ǸLt삟Mz)>kɝI;io"U
+\Y&kVx녣391ٵqQ=beMq\`/nņ|2͌JkzDmͫIR4\~5NlօKɁZ]TC3l̅D3jSS)tWw$IX[wV
+WTUw^PeUhWE^ؓ~Wchs sIg`wgs (5
+x}ЁM0S,rV+ KO&ƈ`;E{irf0
+-c8CjL=L1TDJ7>)BH*cHY}~xI,{7WjWާʇhg_YovMKiN> QRǧ}AQj^G syJG"?txt,L>֍p_>Po$^<%}KDS4
+*S<ܖyd;éIJ~JMn>ȸcI6uɖژ䩊i77_5W2' 9t^}/8%wd
+A hm45
+lك=3_2~OgPs
+Ccd[aے{<ХjA {! ߲ۓ;O'9+wEHE&JV?fiӺ j05瀶bhWZxo=ƺ 0zhK5mov (YOut;e=R*yMVn,$v:QڳE.yVl;svn,Wi.[@34SD_!MF>J柣ND @$Y~-CMu (+lBpБ^#$~2è /@̣6 3nh
+;۪.3Fq3\َvZnZ"/vNFNJ2V{#ΚVse_쑮Ta8C¢!Η>FL\M{5eH~7;F AB?VY=۩Q i9J.sӿc%FVbdեiL`a)kD=W \ne>NX7Ƒ†2IYf-to7/~Uas[`W*v3_`~:k
+*
+e)DDIss,f_n6":hmh+]AqñQqSa9{~8|~bh6GZĠםN\h+(E30~kTMGβ1:zka'LG2>,
+=@Ihs)HUOeX^m7R7~,, \jJԌfͬ8!*]JR:WR]Mɚ PZ;JN.8ɦ,[r*Α]MM"waX)Lbjd`>:?|:?u>^G$fa.
+ʥ_S%ED8 J=ĕK{6r zGG Ui<Kg"^ q
+I6vPWy^,uc/
+pt +;Br\ܕ'> -vCNeʔL-ʌqKHr 7I d<BgNelB^փRγF2AqCR&t7߄{" D9u)Cw1t}?"'[7o̩~1{>Ru* ʖdClutqf2[l~{S4>J$.nQnlP#
+DQdVd24KGMvU35KJ~4
+;^j㛑Q`exH;J\*`l˴Khk
+&tF|(8VǡܷR:ϳoG*UjSKknRgl ޅ-6&Nŗ7O4rGmO[du_TvY{ ̏Iy\aRKy&P7ݪJ)l"W5{K S_j
+W>/wͺh4Ek5˖<1U[tD>Q!.kR涧7u
+l/i^3;iڐ0sĀZnS
+qW7Np:([568ViAFޜ~h9Pldüj2dO
++61--1Ewv =JCHW34܏&x8,&#Rc3Dvz6RSyu_N/nmكvT֥Y˼?RFװKzn9Q4gC^5l`P\ܲG&ޫ` 9PҞٲXr6
+V4,{a؄\tcY`]lǿԾar鴯؏=b!&Yb ^[\aYt$w
+[R)i[{$7f"o Xp
+zBz'hO|Ō4ǐ|-j
+:}̴a
+U6DUe"udPO:]x+GB]q:ʥ':-ML3\F$7K3
+Ü3N|/'O-R_1Vh&׺ NPz8de 勊ZTH;XQ6}+'h_
+[Ym ~u8p`6*I ߕ`S88sn9O3nXOE /7f^lbN[PBFO.9Z_.5>F S̉R'}ΪѬ`_dX|{dHXԾ3QlZe7PRqشO5OkZrx5u`a
+DPQʮdߓJRk=H+
+*#u)h) )B6s9߹瞏HZGzGT"93hDͺ sr|b4y $TK "$I~$v(B#].qi?CN ~ޱ|ܷLcOnT~vxj̦5<.f\K<2p:CpSy,66>|zC
+
+T
+!z@#(T 6 ^!R S#>E/Sq9z_ /G%ӈ0C9[ۼ@(٩P ,}XTOkpQȫUG6 x2e,>
+gS'"b'zL=N)cs*bR)W<#S 癛)K
+&L\9WtW!Y17i*%wJ_ 閥nWJ!p-0T`:K6B+SzlL,~J#ZLHBEe߈Eq1
+ڸTD}bB;*OTCnՍl$OYQ0mz7o9NŻ|hDV[Ve֩b7YZÖHl~I)ܻJ5oOݑ%(,hZGҼmRd!/NEWutV57z;jjs^^lDǾ0-a_aL؁w44簍b^ppi&nX uƻ-݂ -cY4_g ?jGIfH %J҂[%ϩC6Oz
+#Q`K|ͨ%cj/&\: [Ft^Z
+w"~>< 8i}XT8dzQVY<<J=Eۏ7G8v6Z:%hBò94^ԥm!1OD>p%HG/Û`rq;Nm~Ms\/Zh:(MXа^F.꜋.Ys}5`a
+|i-0Ws
+Q_GpRjy0׿tjT̎ԍD1څڍ›N:ka? 7ek_%]a;זF=9-b= &Mm0-vD'^j+/5(er^+EL F1$1KWE|fOFMKm::1`ڥfXЩM*i9
+l?+Lw?-Nx͈wɳ\C0瑃f sM;iđ`$O0z*RٹB9@"k5v~.lB?u
+^DMk,2.#ɲ\!{^I4Ԉ.~çlDcBU\b"c jvJG|H`_2rHѥ tHHBaG :Bf{'9
+[jaЧe
+&hz6Fdy?>gۑx&l$^:^nx-'-]O 5@S Uڏy]Tu _,zWPT|BJ,ɕ}`8ߴy?p7gˢu\JO(_vOUue4+Qbi?A.jCxyRJ駥Pt㸲rTfdd$ֺFR>PaL'v2M*׵T]`W*cD*hAe#"ɆKO9JKL2J( KgK3jԉfZnL5oM(_>FOӹGi}<@w#Ndhoo4Y ̾Fٸ2YAz$W֜5Copli\ 32l;a<;S?
+oe*
+p}%
+K"G* yE%S\#V9 ۦ24=ZHW}dUU$U>*;$;d'=NY ,|ܶ34qT=ka%hs䬺UX7Fl[ o1apuxf9QGk4;e
+˸7荇5xB:yZdͫ,`2?_a[0~9iY Fs3g Ë9u<,yx87 1Ja,O@/gO㔛94 |.]16'^
+.2}"!<4tH~(-r25DH@l"K濣,/S}"+~wF}V dRz,:w&?C~FqJ}JݢJirjzEgU#p]ZF%+[Pj
+DRNXA\0JSH307͛73 CWc+U#r# aQOL4Eљ?s~{sIy?y>ҒLָKd-ޣJ1v
+%sdR۔e[$z,Z2H5[&Ht L UO 췯<uɎrEᾀ{i,8+ןwM2O\7I8il2ewkv"9kr6±U\R*qoGCxxy;:jYE)aΰ!Xidj q(8S=l(P9Iue&k)W1=kZb;8zBC4ڕav?suUuP\Vf>+52j&P6uRɮ!
+a+rk!o4 `ܗP)f%VQTF(Z]s,TR|O)O?ho# ]6yл)OU,F٠E})gsٴGyҘp/kw~˖I'Y;TdgYU'I8@F* 8 $I+A2((+y8OϋWȗE {բbW"@}@C׌teYgvֈHofE`ea<oV F Ck2* ]v%녦Ly|KJ3PnW(<
+2G2ћBjx$Z-aV#s/h"K6WZ,ɳL90~G"~45"[K4hqɕFa1U_KĪ)P ?Q΢9ޒ"zܮi$5I0]xoܬUJ&]:QS{%Kz< ~m댋/7ƣi_y
+ I<Gdk~xkے1e'w7۲Uyʪ\PxVnL" N6tĦ>gbN_4!/e%O;mhtWv6[iyFy4ʔat V] au #QYm3rM/q{~tjD 7fiɷ  . =[n`4qShBrx_5wԐ %nQ~x'G[ `+qb]Q2Ըi=UGn~ڋJ(Aݪd E7Kz +M]!} jnh-Cզ_魺a٭Dfrj6$-4nUZF)Zpux'@]U/ٳۿ3Ug`iU}ڰULWu+SU[;uXJPvOŀ{$KF,qQruH.}imfZh~atMBb0*iWC䶧jZmn[nKfi c+.&oV.
+Z>\oMkCZ8)*b
+~~7<NzQT!wB,C)kE+ +#6-)p*㪝A Aocc~\_xb5ӼzgQu}޵zGeX~ >TSsV6i1=2J眆Jh@ Uu;7!0
+߽\醮%-;=.e/T7D$v{.ʫ|ZѮmcDֲ+-Cu_{>1H1]"D^nR ٺ:E3[h9 7TJOW+3 vœLimc @6'[c`Ǧ8v!bR{1_ӵuoPE2\@;4"mO m{ ߺE1dA}C=WB}[3']\PJG5VmnYG Xyahd'J[U~ vWۅWo]WnGnR9H7ѨAu 1vZm]lUrTVA
+sj6lhm,My4A*0vJR? Ĵ>2C!*#q0MJ!:ŏCR|dFa?2݂ch3dBzSIt?%LmF[AxYGҏ0m;GY1űh%[sጒ@9 q_8G>r Wn)jodEzC.qJviN&If8bg
+ v|sd%:uTf&L0~p.(RU
+; _)w%$/ t#
+~#u`u[w.qsY_-*'̳ɩk/)2* i9$7fUzflc9}]
+</BིY%V(q/ܦ,Ǘ 9(B0jtI4 S:qԙ1Kh^ChhCF( ||y0%o:TA BQyPI\;hVʓ2J
+ĥ[Qr_k`9h "?7<18~Щ t]Z*7֡^%Anj#7L{Lu77]ČY LL;
+i\WkISy!KC:31hZPf:߄0C>C{޶$tR:(ϭuOR4$=jluq1?פ9Si|cqF!_z^SK}`d%DT wV>;
+5'\GB ćd^ux+[^%e ֪pxE
+ 6%!Itި@Ҿ
+n#(aFq&mq3%\g?%ӆM5XD3b$ʁW ƿ5&͔D4®KcᏊ .
+1Zo
+^`~¿`6z q aXǰ)Ӽ܄'84 n"Db.
+ڸh>wMv^ c8Iƻ(~j?
+eoyl/Dl5Żרpy1ܣܵ^004{ .%CA22dWuQ>okL<5.ſȠiffh7S-|^TjX[wCY*sG^1Ve֗+˃L3 /2y{+.;CtJ } ->٫y6q< <bs
+bk*ĉ_VTm }D51oU
+0Cl];Sk)=RZ@[ɷ5JBeǐ$Ni"0 -úR4H~9.☫|Dϸah
+QD~0T.>"x*O>酧.Ey+HVy55RWsEk*PxEGB;(J X(8hiqmh^ 0`}_APWDLZ‹]<4zG֦`oyZR|u^gCF#nr)Va5ƪw9njyIt
+xI1bIy>}-AگOShKFx6xqqQ
+3SU\ka椚̩Di~ ?{>J3mtߐZt]YNju]ɒQYlZZsNѴѷW>Sݥ0Bj+7q҄fU7m :8^;#eտ+*,_CY3MSU*LX.jQȖg_IWJ5a"9R'C\y׳qH)VU-Z.\+Ѥ/aen/|F[?SPk
+^Y>VH9 &yaIxQ<zU1\
+ٽl*7}hu;Twfa^cnYS q;)oZuG!uTUOrlk;HF-x/,u sm>fd}+]
+U.o.=q-y][viRgk*`/pLBu+A@[)&PYQ?im/K,Y
+&wa7WAƫXUr8+}E)oVӃIÌ}qZlh<gw
+A?=$6-ޡ|,)!<*ǘ*z!8߀ϸuPp
+E ֻqd{q׉;
+NYHdfttc #&vPtQjd1o ­R)ʽ@}<7 &8wyybH04͂@>
+EJ7T|4'r41 ns#?Cśhk6/ϻ7n HITc6߱=zz!?z_)c)ueT}nS3&iq4rEUYX\K88IX`}7yIi
+SiGr38Eiօ$f l+n.*d}0Qe:FSS퍆֯SȺ8~%;
+$ m:@l(蕉9 Ea,_܎iǀ/O I4aS8!%UJ8C(&2J:;{Mጫ~JdmrFW jgY?;s8ҀZ6\FqD,H Y'{$a@Qk^жrh"j}+mjysәMD]_CJQw)/ʹ5״2s7v}7 TVS6~GoLF YHKmkv~U.+jpo8Ɖ$5)\R(gHm}w5jN)
++pvO[nHj͌%=h 4^"lq:i%S,P=ƋGT BULR8LW$GxLcLS},?E;8QE$?\.e!&KKJG7|_ Ҟl8!>8(YBIY`[}.Bb T$=U8Oŧ yP-x$]0_
+j(sOH|/=wKR` ptl>f*ӡuU<=Ts(&zpKA?sLo`N0Mq+~*m-~F7^5惬H]${|-Ҷ9Y&=X'Vu+^ϖEm
+Y/0X cAdPc_X VRx6b|C6^FeC]o-F?f7Q3V>͝yFsy]ݯMF͊k^NնI#FZ.7ƆQfeϫCJn;AjB JFw
+mԗ6t(I5beElXQ͌ i,)6QS 1zJezVBf ۹ʹ/ HQ89SnE%o-4NJ``,)~utyQN]vح
+ YM N| _Td'wa}0Z<9|3閗3~o=Y>l0Wb=P1jmE XR[louv:.C=;.a.BřS[nWJ3ǟN1='\Xr8۲:KXj6e g΀ap
+SЧ|NWP !o-t_ nyV|ؤ賐e`HʏE=>\
+@?^fEkoo\fyJ8zΰXmi  -Nw}OYpz&@>gݪHc. ]7Mz#fe"g\a@\qyºJc\3ܔ r'WQVE D|PLs\h_h#9Z-TdL>˼!WS/bniA3.1Fx@Ǡ3UNN^nPOZdt<jGLys=>vWO&-8ךshveSȉ`wPU_cař=շ}m`<<$+UV66do88{ηzkG}ڻ<<7\jvg!5M!w&GmpfSgO3x?
+wZsLRq/~lK]QV:om<Q' R]AMXyu ^ȩ $}! 9LHaH8hʡrTtD-*fY]]wuu[bgg޼ߛ"ȹ I7HR7HBHudt *Ჲ=eJtj| #TI/W?{ΝO^'`v'$^E=7ITF2˵7-^'Z"[x ;[U7,QyWrr9E6cy'I gIRm2
+{0K,^H/>>G@l`T=FZnZH ѳ$m¯鵩KA3D;w7ŏw^J<`i$M_x8wU-,/h!pbP1|*k _U;
+A>ʡ <*g!r)J;ȁ&xK0N\B&Գ$bԍ7fpt(0H23ӲG1d?ź
+bVֆ|\[w+tjj?b7hwJCmm#b.^VBDRb8E]4J 7LGc.Xd/a&ڎ @顢zQuֈ4Tqi˽èb˕ 43~,ymoθ[0
+l} TCuLBt 2ZW>Eh@+[Řy0=
+sU"r];û](̏{e E=ma^2'FKv~.Оm0Oj(esߺ Pk*!3IBЦs4{^|{6k\* }XYǠD=A %$hǹWǂORV UBꯪr+Ca6 Kԣe :Zڿu6&?W&k).]%],lb7MX][H"}WL)RIrfr?AƁY&I~_IB${XlZXE&|w#؆`_vߢfu3fm89?9
+̟NՎ`jz1*.@爎܋`oْJ_+-
+QA%$[H~}{1fKٲ:HmWS
+ëd}2w7 j< O7i2G;SWݒ!@YsZ~*PƐ6xQܡ/9i7cGHVf3R>K2jZxH"Z")vHD} @} YJ64T(P_(*C]miSJqOZgA(ny8}wν37;?߇*x"D6HaeZ
+5K e
+tE=H\ƒW8 72ym]Ly 1N<8͍@:> >6pӹ<AМ*쵮5M
+N5gܿ]7cD!\O6N(bHֲrt1guN'wߢeGrubJ1a#gi|Gc" 'x&YH;4T1}Ϯ;cV*ܲwf|H2;Rl{K*GZPg׸z *ۿ?ʗ
+ד:N9uL7o|jBjEVQR!Ū;~;ZZxٲ
+(񆜦qE蠟V7:bg3h\yg.:O07Ңb4=NHdto{<WZgHNRRZ\sW*Zx ƻQͮl<ITs|X)c?p\B Kue|0|/ahB|樕sEGMsMd?*G,HRg[)|3CQ{0bIט%9*XRMU)+^ P,py*~uRHw,r~L;_vN"ۿ]//S{̑Ͷ^0X 74㊈#ޒ{Y<mg$5`Vs-*lۻgri˕[ LX#DEhgq!N-_c YPa !w|Em"PDOUHSr5a+[ m
+Wh*¥{I/1YwûJy׸jk@p[z3*ReRXwq30u%BAŒ%\NC)W'5꡵
+&F+U,d5gR "JrVDBSDO]V[EסdyVӃ1,+Iev"`WrwKaG|`%+TVRCF{Ys*Z5
+jQA4Ӌ<>$.7$C$pA)hJewT*FmKg-lm*{{v\ܲsJa>3_*ݑہ>V5|WG_>RR_YL!RFjz S5fځO2< `}I\:XiZkRH*4[(xX$u|I9̺TkVzl_׼gC%*wXR nY)
+SU.nk.mcŮ)Rxb
+ΆBL.?\DCqߢ7nO(M&JOiݖw0
+     !"#$%&'()*+,-./0123456789:;~<|=|>|?}@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ac
+ٖɗmZH6%ؤʥwog`ZTOLIFEDEFHJNRW]cjr{ĄŊƐǖȝɥʭ˶̿*7DQ^kyކߔ ,8CNYcjnoldVD/
+R e r xzzzyuph^RE7)4=@?:4 ,!#"#$$%&'()*+,-./|0p1d2Y3M4A566+7!89 :
+ p_L7! }tfUA,
+bʀ}SW?CN<-Y4 BYpzS)j"{%>64;>FVWm
+S^Di*bPkpة?%"1#!ϼK`L<n-e2*+) X䥂C@v2l Q?(=0q MzǃIz7MEY; Y@K (-
+XJ4^Ƭw/I!5
+bn#FO
+)ݥq AßOkV^Bf8KĈza>p-FOJ*Yr(".O'qäfrCRJ'dc~h!€?`}WzBd;hѲGϲmT SAij9<
+ߨ%@`8xLTqė=,Mk $hJdx_r̰gʱhtG,KytomVK0X?R<J%mq<UG]IX't9E
+$Vt
+Fgml0L1, y+Hu2f;[T0BE{:qntoT]okI,
+ LgV_R:Kϋ0dP?= vE̷փ(M4m\Tk׉o,H=Zw/EI-LQ[ 8F/g֖'$?[u~fghXjݚ- VImKՀ,%ibQ*e97WKMYiHtXTBUDw-49#iԗ/r]hGވ/
+
+lD2 h‘%TTT*Fdw">GY?"[f r5ʊ4`TAo4H5rWS8Xy;$Yr'q vUPV&4m/5LJE:S7Hvy..
+,e: E$@BKr.!{A$A,CY[EA;| TJkU>41aƜdcT.Us R&BchR)
+ Pd;ʟHbl?1;_:i^mMh9Ӝ+,x+(‡j3=P6u>a}&b (0=.À<2&m%u9_~zL!S`(6͟>թVlW䨸m5ypg!2< PR%wC>ubvbF.0UK$K;؂P,!rA5%\v"
+[2gwdxJ:_'Eښ_+^Cژ I! v,V72UJLNITUKɎIy/R+=+(֨v6!M @PB%R--3|4-)#ͯ w.ܘ<;b#;*>$eG
+>3"و~AZ$xOUx f𜓜x;٥Q h X(Zx=`dš 8b†id, ϐ!enZ
+b /޲І2P0~ +1baktT
+$Iⷱd`U+z3 8"}Y\E^\Qܵ)<&uZ!FM)V"ڟ}&à/ ď 5 O546PW눤0 fGlEbdc 'ƪrӬ[{K("M/y%0=zFBx}{w6{Y50%,40R}ԓvTp>K@fR$7HU( /10f<,1BS>٨RI3#&&pa5j19#yTH9cI[էjU̟~? +7NzM`k|-kqJ}(Ҙ2SaӼGi ; b:`uǤayU}T 2Ftm̔%OpuDU0m~L-_:qWg0~huw-] NVrP =<]x;Y1iw@8,n\(zqb !$zB&5dn61Q& & CuЎy#c%$7]w'z\0Lk{8<Oz o%4P˗
+9hz͊$LmxEFGO$Dcn:0td#*vT2.q06vgAԡn3l'H:<@I˞8!mRSs^Ugf
+~t-"Xnv&?VAG+7WhKDYZ%4YFg[ C_M6ЅLJ!)9!6-l?@W ?t`k;p}
+P>f{i8DbMp/ŲF_<`w[Uq. Y!'i7L' Rz$v]c-ީ%HY~ٕ 鞀ws{)Wa˹ԑ`{[z ϡZ& z
+- U@uBP.8jz B{GtϤ1ޕq# ^o2N*`DZm錞c@QY@Oy`ŕ^ )H??s %J@f-H%{#}řPK
+'£ +vO@%7_*Z-r*~z Ց4!wBpG-q.a+c"wmqk=WfB +k^0>npu5
+19~(VZQjsfb5~Nl, $LAE \Yv3k"*Ie.gj4uDk"*T~~g^ ~<|1cPx7kF84K(/AI\
+ZJAFqKq$5GT#.a<C]szO9@yQђ-DRPGD{no^7PvUvT_F"Te ^9^9(Zi*J|1"].g:ETIFzN%T|k&JlI3ʌ+r^qfSNMXe $v{ꢫ?IB--Oi0iXo 葚T\.%kR&-?(m=?~3Jncu /mS<Ð,LeH:i_+MSVa k@
+49"(hd}+ɗ7)T bǪԪhm`Yջ s<-,@͋SCgZwN CUcW-JGm\QA]Q]h&D0Zvnw%0zMTXI:l<7a` 5P`ݰDhk?(b ?`Fgűy=4EJ0 GvQO4Wd SAnMC
+ұ|`7ø_vYIoRyYqE,D;&Q\BxWrv t [\"]Uˋ w髐< |Mc+ Z9(WZʳͰft~X)Ui?m<P ;G-_k&ڞI&ML<::͹7KƒKXѪW[5P7WttbE6ռz ~0iWűہi4 [$kil$VRc4ӫGk~ʿYQ:ٮHbFGX ~Nu.kfc`m f4걳qVP~:U#/bE7K*W0]q=$ܭ XQM52ymBS<lU
+ZҸLeD׊= BkLBRY^#zA%ڥ`r^'UIoFg>;1 p't.t-SSUn;QY(sў*M8=
+BHZ# GcDS{d',Utl=,}*vcr+](_1rØ@?A[KDlv'”o>=ԏ[?Q ô
+]7E9!7;au*8Y?Ң#
+"8ۺ?pGZ:Oȿ7ÝTԐI JAx߹rxn?(؁
+>~o\Ƙa3Ƹ2@eU*Tlmcӱ
+Fvz|"ƞҩn2=3["st }N8`1`Xi]x(U2\o[v1d%JOO&rؗ0ܵ9Yxݨ \Dm]=Hjovfd):tbdH9\ϛY?8 <%}dVەhnuӻkV3+(+$-#ՋQҰЖX@h-Nd$a>M3q"y$[Y@SgÓ=ݎP1)L<d"drՕsW DJ
+tb cj*!Aq
+hG|3j zO
+*π%2#ǓH7! ;v
+Ar3v*>>Ʉx\+0lkOԼ`
+kH>*ڲ1 wp5Q݌$;LvvJ1f3n*Tg@oO#9|}?V0M5.ۀz{" NK?C_$ P&B̆e>(qIu`|ob|_0l2WꂝsCܴLTIa?f(/+PIwB WhgšH
+" 
+"(H2̙dfr $xZEP>ţC~EF:}< \{
+% rH6N$(߫Nᷘ_%1]2:$o-8ȥ I-qt;'kTjJW^}kfQUr\ulNkHn᫂H*Wd6M2 *{`V%VRoJJ`+"yO|s86Vy8 :+;9ɨ=.qqѝ=ɥ^ӏwldG;<bSh 
+($p\)9D$ZYr|(4D܁OHʳ ;ܫv۱jxLr_r ;Wi nV|Rudܦ
+M]4ǽAߗnװQԈXtGdƇD\wQyR>l-QnJȲc/14C:'K&̕BOJ{ߴzfsW|F-q2 ?}Y[pXdY<\v+M{ir8~LJޯ vlL: ?@o[g`}>?UrǛI2Lk.}GpI8QRV%܂L0/PUE ?ɹTcۼfHs^QMC!)$ ; ej uIy W6#LMi9ĦͱP*HʘFg]mߝn+|X$Z6K'OQJq m(B~ljSuZ ťbhWP"z@UVJ΂\,<\HA 5
+ES!.?Ӕ#C:[6$ߴR2G[DUcbDx(M<}|y%}ђHmzyEy)9Didh(CpKoY9_\niQsƚӮkX36R7U&"cT4Eʈ0X,t :T/>Uݮx7F>QL~:ʥ#][eTS2%c Æ~EWg9i%3W4ފ:}޼0_X|-ƣµVu8H{YF"qĔ-F95E!L/3zLw@"FRmOQ&[#ZO/xˤr~9T00bܬ 4Pߋb>_nMFY%<ip
+;Rx@|qj#lj?Ape
+sHt-bM#t8f5}sc0f0 CcBKRmcEkץJH[ۢŚ<!)NoOCI}52 09tMب7B0؋0zD KYeRUJѐ:N::,#D~6ž4o1l`q5XU5G"Z4tX  cVu{_<9SN}h%{nԾ"V}V"Cw}t)b3zFjoKj2'Q9
+]\Bȫr1.8C|.x8~pGm<ϰ"iS˨ڠ u[)Ek+WE8x5 qg<k~[0n& ˊڮcAa Júg":"].ff5 RuBTu6u|;4R 'hNp\@I!Bq":*pX'%O$K#(}vW&$nxTeحkU^IkKlY+H;"^\#G_KmR2yfbI-ب:ݐ$;8$N(Ӊxa
+ 1"*.d8>MOaN$ʡ˖~ &($~>tBM%^i3ϐEf8UB
+ӯ_wCՄYK/Ԩ 佨/Y0y̸7.]*ѳa !d[m9#{-;W[ U$mb?ci3ؘsq6ĂT t
+`, g6$cN!Lp<b<Nz;0y% )" DB@ ;.a$G=W+vFv-|d%ݿǁgOŨ;$KFlbu#^$(b ,jdM[skxv͆c?sBflSkMe͈Lyi3TZugv#V'{F,8+5%\Y`kY oC,VQ"Bk5Wjؚ axhk" Aƛ/dX!xJ(}~&| h?.XS
+jkujVJE)swm^ VQe^*7cSu5.:5!{3A/u@v?aDUNCkH2) 1z%9U鱛v򹰗!k0>][#?wsb,4U_ f)Eď* uä6Go76ɵ{'CGa+RUA=@5_rgs1OUG*ʚO&Q͡4%nlc=%Z vY Zeਝ4? eC` _wvĦ10KB/*Brv4όwM 0r `$CܝGa6;g-N_&ɰ.` `0M/s\PMf`p3
+TYRJ3O)*+
+8"ӽ΃ǐL"Hڝk:^֖Tm
+KX_t+ =#ثL
+uuWK̹ u)F@jR_$YuBśGbQl+$,o8qlg!) n2QήU>Ytw(^'Y! %GU9
+qAN?!9NxlbO{eiYQ̶>SZ .&sbj?1_ǡPkٟx`дY!n6fVJ?ffon06l)7BuyMAѢ&m>>Nj#4J%&|E]ۊ:i2g0io*6zXh +҂3;1"2ҍ+O?Kja
+w%5,x+ z!Ί}|%wpȩxeXx|Yy$M}yAz5{+=}5"6~{άq~p^Q~Md~*XŸ~,LU~S@~5 ~+f2T"P{pUIp
+z WW} q(vsfv[wLP̨OxE뢳y
+;Nz11c{v(_| ׊b~mqC|fLo|[y[|P|Eҡt};O}1~/(~!Ep޵f&Bp[Q/PtہgES;P1ƀ(Ā!ހp,RfO6[B5PcE`;U1*)^!Hpy`f [>f P[AE;Z1ٓ0U)Fj"0΂op~7f ![BPY_EE;T\1撠C)k"djpmfr=[M,1P\ǑES;`Ћ1')}"Ρmfni=pkqr^mtolVurX wtDyw'0|Yz>̾jqźjlr`ntpu0rnvgkbtgwWIv~yCtxz0b{x|bh|~j|l|^n|~pp|j\s}AVtu[}Bw}0z~l;fׇ i
+9kDmh5})oviNqꂿUtXBEv=/yVǧeP{qgi卞|l{nohLp(TsuSAv@Z/ryX_dִ2f}}hƖMk/zmtLgdojT3rxAKuI/8xσ[c&5e[}gܞrQj.xylfoDSr d@u/x\ębp vdܫg%iwy3kyenbSq@to.wUad`RfWh-xkkemn)Rq\@?t@.wZtf4uhvjxxm0xyosekz.qR|{itP?|w-~zK'rp{sqԜu#svFtgwwtudxw*Qz%x?E{zb-}|Xpzr'zssj{@(t{vxv|cwy|Qy
+}>z}-R|~H(oYpq݃^s=uPt;bvSPPx <>Ay-|0m{opzr
+o_%{"bHk&9q\W:r&G%2.i6D1%~F+~ZC?8V
+2#⮪ ui^#v
+NL؏SEZLnÖ`=lva;(>̽p ʠ~[@QdF!7H$ #dLt!BOK*G-iCrB.UlmO> ,B2W<+367ߛ@ )۠&KO 0ޏ
+/hw{V\lsTjg?қ۟u 깮D}û.5ʺ(wM ұ=Ljeo(u\ yPXƢ8p2232"uh0
+P7Dg3I33D_)JQNdOm2ta':=J.۱
+s`d+uu- ǵiȵ\L
+kw/i&G1|91:H^gW@-
+}~s<xi'y?^WLySVzOH-{=:{2|)p}!g ~s@|hg]ORr:GA=^2)$!Urhn]RyGƒZ<23 )h!r7h/ۋu]jRRhGv:<ِA2v)҈ƃ*"-=rYg<"]2$R1GDT<2䆡)?"Yׂr+0gȖ]/&R`G; <42^u*څ"|/j cj_eU᪹h K$jA+mX7pM.=tsk%v\z`ij@_׭kU֩imKoxAq7ts.vp&(y(60{i[p_`qUrK5t7A<u7˙wz.yQ&c{V+}di$w_OwU_vxKkxAvy7͗z.ݒ|&̍\}[ 'K~hꭢ}9_}AU-)}TK4}wAd}7Ζ~..~' v6 hc_
+v|@Uvx.z={9)bv"evhwlEjx6wm0ydoyRrz?u|.ye}Si`Yjcf6̈hvRkycngQNqY?KtS.JxL^يaɉYqd%vgfu/jObmfPp>t(o.w]^`cCcHlVf+;t)i0aldOȯ>tsw[-wnw\-_AMb0ke#SsShA!a7kO|o>#r -v0[Dn^aaShdL%rg{`j哟On-=rfv-vm3Zp]­ `܄cr f؝C` jRNnb=q-vBw~o`^q&ccrfBti quk_wInN1yq<{u8,-}pymjynlpptnRrp/qsr_;utMwv2<Tyx,|~{6jtnlufntvTpEwFor+xF^Jt8yZLvkz;x{+{}6 h~4lj~F(l~LFn~Qnp~e]er~L:uM~;sw~+zf i k<~m*Rmo_n\qǃKtU;w&+z@ɮoe~giю}k:lnH[[pʈ~Ks:vw+yQdXfh•}j Շ_S
+
+x+OpOT+gxjZ@c}9`k`cTnw?+^5j䤢T&o
+ lEx9 {XfPg@C_[G=/5g4ʥ^E*z 5#p&XsY>>@?nC)HKс#Eu$%`^>[
+(?`~^x
+52[{F;Onݦ *C{2H<N-S2UruUKm5ųBu
+}3!JH$#h^Qv0qUY:ʫaZ=V.}VZfsy ֧MP8:x-kն(+rީGSIЭO wiι9јy&z8,k.$x=rmRMRuMb;dw0y 2֤T{WƊ6m|+8EC` Gd]Mm"WrS禜D~AS +G6W#jnA>p
+
+sh]T4I DGãTD(2BNlz9eB_ ݫ.#JUbGɰ Pc36߅!3?o
+0\C"dhK>مٸ:IFq\BVhF'$[I&3BtK\ D'`;I ["%#N\I
+|?a8+ş3"-Aש_ZZKO%u6`X{cͯw1 $+OM{'E],jz6+~ Qk a=_/E qbVk&S7<R5|m[NS< T['c֝"16`fi+mԂEh6=2%w \Ww3/VWxGk (+K6\Gk6ygfp86,W C ~8 yq' Sk3vIժ*/kffԛ]_M5Ɵ$Ϲv3\2e*^\?|_cj1xڶ+em[8@Ńr1 346=v׶+f5RjWuM!\7c
+ }s-j5+ڲkEZ5׺ֵޛc[GSJoŤ
+9y<i;MB]
+Y5SA*bPW#X~$u2ξ/1a+` cv&L/0̰;t)H܄|E91ݎjɆ'u/qvC|\lWjaCm^~nc==7Em+O^ |vd,<8LOj%= Y0o}ďvCBW[K&I>fg\"&]KOÑ: %ijeB>%j:l=T1e~/ߪg I0^YV)<^ϑ%
+զՏQS-WGpaθD8ߠ9D֑ՃXM'
+UJ]I"mteuuE)-3`Ҍ SoO
+Լ{!`D}K_4
+!Q\HҽzȔHN>uA-^Ჰbg%+k58W #wi+q0khcuTT[`5Z[`J &-v**cs0
+Rr_T'UtKyγzaL= zs#k)|OĀ܇:axim&&^cŽoIѓ`
+W82K/ױϬ˽^ipuO:JD:WtG<Z2]uyy+0H5W?16א ~u[4')BrjXG><8YJ]
+ ՄyiZP-|xm4rQe`dZH ;4SX1̚`wpu>7<dE,]5J!T%"7%: -+6\wO1=zs[ITNX)bOIUq~JY鮦t ͆/?wU[j+ϖQzUR'd(_XqByg5mVeq}Jsg[\[> H2
+%;8;2/+BMqvs$`ىY4/\ssi iUcdUafh6uaP&>%Cd>zES?+&e{\Q>+) ^T9ZPF
+r3L2$$x *,^-ڷ[]<**RI<E|N
+!f睥# Aɧo(u
+gįVg攷E)?n/ؠbdSu3QQIB`\C!d
+P,2QC[Pһn`RXYU^',|Y5G4-}<kCfގoۆ3
+wo߿D[D$<H׽kU*I#;He6i*80C
+P&h_2nnmMsC?w
+/8*;,a8sk ~!!@)֧&Ñs<-sZ•2EbTb~AA}Dʺ0S{{GaoqB͝$F8z*d:ٟЕLza:Jeaq T*1"}!@k˳߬B/lEy~eK\5$O=hZ͓ނ9 `_ݎ[9Ĥu2B\s u5=@Όp@z t;*+.Za]1lRSo
+КrHYKg<`7/|+4A*K֨81% -1w?Ɩ)r~K0;h+fg:"&6)rpcyB6 b#&l:w>fިÕyL/\Zj@
+$f»~ ^̈́:)]}pA(+RX
+*XcZ3}EٓDsjd9FK䛉J I1{V!xnK-e>7nׅ _Qg1R2Ǽĸ:@n\KX)'WIC0hݤ!XL}4l5 Vh2,?bLb#(sÀytk]:ibP_"2S&F ߆*:/~5l6fݻ Ӡv<NE"AMBI܆=ӰD!5oG]Ml[UZ~$g"HU(>(l1u;8qi7mL[@Wxl<Rs\]1^>g Y<#nMDyYZOEX;/C<_IfGuROM++c7S
+4ƊaZԃu Mߊ]>]o/m^&=Nh̕.g*>d_$
+]koj-]wz`g`@XRSZ^6uV^og~XQ 濮a%{s Tp4{HLydW)YU&R?
+S0᪄g :po)-.XF:e
+t&83B-(;^SedSy7yG^H@Es7<AQ|h[\jeZҎy1|i-<C^ow5pc P_<.&n;ˌpa[yy$۫j! ѫ$E42˚v?ݴ^wnYg?G9cK+%<qWŔz^}NV]QvS{q8ڷu)? WV1l%Wyjp0#>M']|k!3h{&m5&[KiK%}UEk̀u hT[*Fk
+
+?;A34VfO 5*DvUe_Rqr_pMv]{қ[;f4( c5ڑGdxEjO-n
+| g8 KٶŲ]{r3J(?ұqlu;S7qWA}ǰ=o
+nxg|GCTpTaH͗O0U`llڤClt0jh~pڱY_,x',IUjn\[M zDBb<Ô]T7S0Co}2%sF͘MQ ś!7fSѕ&.!mFk(+O Oȏ@ W1fG 0JZ-#=qb>@@gIxFz|޴\E=Yg6atҺ*SY5T9vh  %2{}n}I90v zRf8kOʼjVo:*xH3_ 6WWx4\;5juK::i7rʶYAd~X:J1<;e
+(;MsrlڪU[y5vw(k
+-OlHWeG㐣݆L9sŠFp6i&xИp0C2}TxmCH#ѽZyڇm{+EAaWdVSy%ې8bש"SLL14$B
+
+]@V99'3ի P?#0eDaS#[%LYƉUU_nFη4F/V[&+;k+4e[D7\~YCm[D4Mn/90:/[o`K(
+Tor M8FECwLhTl ;=Lt^r%|TXNdR3O>^G) yۂ2b+PgDWB;T+4Qv{9輵;!f6~/ė|@r~EM$,<`2+oMҿ$ȵk뤆)<$\nnu|LX
+$EVDĶt o \~6-s//E 2<뤪t :mbpVn(Q7:ziZNl*3miИ` snX
+U\Пbi0^Kc=!!{pwpyKH&Ș/UDg#M@1&yf_sIrŔ\ Bc7HexXltbu!hI
+&) ֩ršbps;Cu GFq~~c6RbO'l"<͖z [T0}5y
+AK]מ q\kPU"Jѻ?W{j#'rG^$U)~VHDTup7eÊ⚊R"I^w0^+mOXiMi-T5ȝ'N]~{e
+Cl]Eko%ݼ脦
+C_">h0[[tVۃw,U^|}X?4:a<X s%هU)<@ZQ/[6 . 0A=fxIҗQl3\PBoJ]Դ\>[3?,ЛMOyIOi> '|2kxo6<Jc^|5ܲZz;*,1M;]U DQ$6*ړXz#UfZ,ku)jFR6:*hyYpI~KSpMnQjm-+yɽM4q,t0L$th!f _yb qX𖠕@Fb/rhfZ`;k4<a% KEb}9v_Փ Ukw3H/usk`Ǚ;3$B4\+;jKD Z FFvEu{qcʰSTKk
+rS4,FSQ?D "u%Zi^,[U6Pw ԰S7ž$ !E.H7^üum[E^)@YMSP)'b^Eqc?'Fxmuym.͇$|OKb1cwWln~B XfOyDz2MӅBQWci2 [b},1Ew^kb)k,]wHߦ4UmϪKc`C!Zʎ5ICW fQ9Q|Uά2=-Id 2_M4 /ڨB>oy
+aG-?J1pm"2Vz|Raw~l8 4EZKݸUG|B1&T6;wWٝ]8XyWG-%r9PvX7ix*L(u==ϲ͓m qqZe&߰n=jcio@x/{Y/rpՓ-kb(nJ;7N]Ğ |ט 9^R,qi-j5I~Wfǒ;*~xFMuò~7S.0.rm4PMX
+d6͵N|b*4uvv#3֬ަqV`i2d%507Ӝ jx9x!KhF bLb4EzclX>eҢ(j =~n$ Y9PKC‰/q䢘&lrS
+-bY@X?(e92"կ)fm6@>_|Xȼ L N+VJ2v&ǂga:y*=>C,꽅zqwΣaVbP$Ԇ3H*
+|tc^7CvfCUʆN\A X)MȊQrK{Fۏe"j%hCi24.$ҲɹDӮ?2]HMtaPZ+C9J*_r%QNH4r{W) |em}^e ٻ
+.v_.e'T)V4(FoUgzf0=rƣ[(hGjKҢy}%]ʟ%(y쭬0L1sR1w^NJO7 نyoxõO`i0)¿6T@JJL#״C
+5\1(<U~
+B2iNğ':da9<o=:O8
+cENOri@Du{A6.ѱ>1_:, Jf?/LCNN*E]٭!mq=p)ݍ
+cFMH?b;t% 7r~L&3>ﰞ~6slD'9?6T­ϙ^ 5;
+k[}gX0^hq$WKJm3qV/f̔&|}31sO[9"6ε6 9K+|dj8a&kɐ=9wUͩ?|0,lugz
+CB'LH? 6ǍZWzjxA|+cshi#a43 KZr?'H:m2AĽ eЭdcM^k^Cj#,@DL2
+"pp߄CH I&d2L)xʪ*jXEtJJ]EZ_=@XY#>(UT#tgE UO4E]cDix`Ffw0b(U
+Y]sAvjfhw@A,bx#iu+E_Xx˼U-EW'_@
+`V[@-kbn_Pe:60lu-'\j|Dme;tHGD˪&աD!ߪ@M?B=rΕt<GH8Jd lMilv>Swo2Y!;DLž]򮆁˶Rf;˷-r0ۏ첸R}"?5#mk+3((.RxP{K$ ~?uX m(U$C[KIl9vL"F]C2q.OI61Qx 1iQZxle_)O&uZCj7$6} A~8zXmb|n^i>]fQBchJDj^ k]rou#Ih
+8ЂTc1)üW+-*kxueI~PE:LR] &t-¬^*$M4-bB c鎳A9ZuKDۄT}pp;dzx0w
+ 7 ? rlJU/3BK3hf@jm1RזD*p֓2O(Vv
+ndmMAO;1S`M-a6)N˛,_
+l[c.Hі%Ŗش+#]lcٶ$ s~&b~In^Y6-쪸ʟ/FRa` Ei|o$Գh:)=kZv6g|V'E;R^t\"ZW
+YnN'⢒LiK[!6bjnf$=+ *.ӃKvIchP*%zډ,1-pGsD8DC7x&X8e!j5kL4Y &Xq
+7pL=#.[CjϨ^wUOlTvCe]j20uuFfձʪ:AƆ"E*S'_
+
+BPT;} *~>22
+EOL_~[ g ,v,cy]zFl(}FVύPq㫪J6A$*H$Ρ`v0;f×9zL2ٞQC|QM5xzAR+Ԕ k*xGjsH%Ť^Vaݼr~Lȡ3h5$؋#2'$
+,FP].V!foDc&2`* _'ǹ{# ݰw%{2>aQ*X SV*5r1V/\2dL9x~dE ]0
+^z[AKm<L! |t䳁,&p#Ae* aʁ'pBr }1zwAj$
+,9Kͅ|-7\cL Sy rRꈼ_bl؞ҰUKTU|YB[3@S
+ zOh'7@nOPJ-yV;Lg]fΓ'Rj^[(Ā
+yCB I@l3o? qMzۨ{6Tև*?]FW^V|.G2 T!YHl" Iͦ
+~]tˑն:6^m5 +)U
+&G͒ҥU >ILŤSK``;m\ojc{.]w{]}A][UT5䄚T9"#֑$-QJ֙
+(R;7n^윆a:VVTST@e&
+PkLlvw6ԷU8{`>5#8-Eʦhc5Ij ɱUx(EUu=XU=ux}{tjG
+4a(=Gr(nËqZTivU肝 F7 :&|ؾĮȬ8CLNlG\nt{Bvx~T2?]ъ?:B': nAS+w."nG%PBRBz^MLpz&*T@ mHh؇Dc΢&ZT_
+ һE/`v0;fˡp;ϙ־A}UlK8SQC#kדtYFUVErAF̾!b7E|{e wY쓌E8T@V4U4<7IIiA(R@: j:8vug*tE@EQ*r 럄B; !rIC@V@]_ӇQ5<n.>UW/)aY/-Ry%F2"  InK/i"tY{p8d|Q\Đx
+`'yM>aATm#GђZVZ˪ݐETD_l }mϒdo8zPc)VdjGT *:YϪ z*M
+yOCŻReb &l[Ghmb9M%>]8!p~{gkl’B42?ȩVnI6
+e%2G-8o
+Naa␽Zfk@ 0,"IBLtrAlĐ  N9Vr:#Q1ha x!coDjԀE_dLqi&]8NLSNIS/)WKlƜ5==\[jTv]٨@(WKsm!fwO)iiLڤ?鑓#tɕOL=?ٯ9,o9̳t2UAP@C6-!d!@ BB6BĂQDkop94Mre9*ӍRMd0W:rB5*G1GRBd; ib"P'dh8^`B5yϕJ\ L΄*nW2b߭L)3t*E&' sdr* i@s?/=:Vh,~ߗ;{u15k}6EnA;xobhS$u,N%ɕ8j 'q/qO=`S)г ,Tרs=@o5-z$^˚Fk3(lUA?5(!4v(_uw1ff:w-}hXKvzqAOQ NϜ@:&z$B/ $Gc*8?z0;ߗ]/ZZV#sY]X&qzlKNCd P<dՋc1ƶ
+[oyDs?{how1,8 fL?CVAyE%
+K.?)-amU [5[ڜȺMtM0o
+y0wA6kloz=vVtbd.RC{,DŽ4
+)ۚ+Ou`;\ mqׂZ4++'8bqu2ǬN Gt$ F7 G,)O '6bgSo/+WuQ.mlc`rj($oQM
+0rIF?i#@I_S>8Z7gW-[ܫ J?&[1Ck\B"mф;[
+ 7qD
+$fØt;Sj͖%qzfg,;-^Q`-}"ҘGHv- 35Sl.J7oÉ@ 5pNgmwٱٙmu*ꊸ/#7H NH  @HB\$77!Px
+Źmzw,Fp h9voZͯwxpo=3b
+$ʨ!Gl03DhvYv s)Fh)-
+`Fm5{kï 5!>s^sUXt9UJ厓7YΆ-P7 $*gz0W]yl`\:XA>s97<5'&cE=ffӕDdyix M8ZH<WaT6TچhAgEt L1 ACc#VEvr}fNt 1I#7ܤ Gۆ
+r;at)ChH^0 uΆcp.] ~x ^Lޓ(qUv&ro(JeP <_ׇ{Q
+c7Rg4tFZgaCCQx!)(04e)
+T12Υf8E‘6G V^؃R(E֘Yՙ >6."4Fm Iz9)d1 ź F+)mju@a7gDfFiUcԝRڊXxi>6|XG/@@+$kaQbќ0/nMҋ]%:c!רZTxY jq4Fּ]Xyw?=5a'
+oPEiԑ9qͩ[ q)Q<\Uh.gY}WS(35QEJYj)zS h/Pk<^~'?aS| A :8}F/R+|cha
+ 4Y^HjZU7
+[C1 ?w<}Aw{_Kyē]Pmp\+ؐ- TźˠRVYĐ[t
+ݽ#]w̋Usri07mN wˌ|!WQRQIc fWlerU:Gg&{ q?
+n. |f0rg$u͚B869A$Vˊ:bVoi L,EUJ@!Og)Л@v4>4=A[+g $fy4"nv,9r1gJc:5J-AYL
+:J匞Y*ϗȭy5Zg!W6@@6,GDOMBӆF`+٘^-+*uj/iuUcnC9K)7hsz 5]Nٰ;T
+g9yNnZϮ^sws9qq.54̨&Jld2zY.dؓj0t=#ۀ{:y?ڈ-w~B=wB(z?1GEAR#Rƙ6TPfkG5^C s#?9z %g^t!̛a2Rxc,ip?T ЛVN W#E~j7 sZo_;wf .U/`
+c( N`+GD+:%Z}E2u>TJ4& *ow} u?zXcΑggS+~P2u.3MV&*1Z,_e%I#\iPpYRg/PphmsY}~'kGs4Tj`ޅX~>3en؈24"y 'ʸq~tZh/5kofصOa8s߸F_$@3q˰<R d%'nQq4fM+Ҩ|׆n|qjpCh#/ⳟ_cbQG0l
+%=+>>'n9;7^^^=1.5?jD'_X,D,Qn?t/J\p &w!ב0؋gTStZ*j| D„=bCB3WYx{ot}5[,w$ 4LBA#oaQQ\xąʈ}IHNK ȇߠ Ke's}*_};v$p;$p\,1~ ?$
+
+
+9~|?}SRwp^@YH{VDrqQ"Ş'VpoTU$VdDױJtzt
+*BM"{i1a=~oضR[ Q!q/eUV.yVH[(`IʪYL<SJ0MuV~٫@(C[=着0#?/0S.2sC -3)bg$395t2C!6+ӵkhC5Iu?F;;
+DF$L@ ;/d:!Zu]{wT *
+hc^3~13JEi颸r!:Aj$U^NMr
+Am-[[ꍏm@Ch[kd+>~r`vS!CkBD+Y]d=a&JD;Dlw؛7
+ y툈z6tk4 6֗7Z *-Kآ&%ת#qfB׆cʡ2 GMTC?.X [ZH5:Wt6譥dUEFIҬŋ(ZǗkxZ,z0= >=P~?Y9=1y~4tV$aix%A!jLsLdEԶrV!tZQ<s`
+gSDFd{W5d˸:n8 
+oմĶ^Ƿî:fԌ& 6-LzH| b?ӑu[}U
+^^_b6QYU82Tݘi-434o'iͩZRn
+ZoH
+b#1en ?#s"*aQ{u5k ixtJK}
+LjH
+0}0:[gAM vtv3tљvZuծ]uC;rCDD @ !`BBHHBr;\BZPXnŋu ؇}f~/76ذQ @Bbh\Yuun^R! lQwLs6H-M{#RpRʒKʓ7k׌MrM'?gİkS!" q8@& xw3KsޖG!禼:􊑟 %
+(Dh>F,AC~I)o|J"&
+8- QMxFeU>iHR|
+ N H]iD/X"IYEMo(
+g]Ytd_6]8|pR~ =)L}Uz{@ yf4HsRA:VPRX[CYqDu*ܹr. Y%3XlsZ~=*UN^i\U^,t{gP5y - AEr
+II0k&K;tWp}Qh 켡Ep  0'#@%'U<Ft]]"JQIeVƟ5 L:cmvҘRUo=HB?Mh>
+RMLp'ʸ~<xNPm zc\c]Ofylş]]HG$;zO'DM {BYLy \QFє{V%ܰIe'_eP[OÏs,r1F
++&woF|,earq^Twgt\w@~``S6%#䀣mI눁`(@z;@F
+;("a)^STS 7
+Ә>ɟAdL bc!3쨠bUom`kRS2i@
+1+d)VasYV.o*X0N?'Tg<'TZs{ZI=yw)=?S4О\ p
+Q#eMeXqiJѳRSFz9XFRwOMnUzwOqKqOV<mC!v9~(>gKx}E5qcu(:ʢ2 R^P)R @JHC"BE0 A\ gnև}99? ^!HyYz@-F*#1KcH9}b_Rh2/s/gf 97y7 HPa 
+r|h%x\N/bz|VViè-
+5(n@
+^$k
+$ub
+wk<sS߉MAn#6kHfǸHTAtVUհ b@)ŶeK D b.n\ Pbjun@if?Z_xw))J_zUB];ŔF2]KDHHhR~DVMIDIԋq9@>d߁zf0]1>F)\d7KheRUr:[Dx%2Q5I%euaYI+tJ^%(G-
+qJhMIlm"Y+q &WQ%+ŕm
+Tbs@@ӞEoܭ-~b0䤶2'rą >UepKyBBc^3XVVIqUz1 >7
+?lu?ov9цwD%HS2{31|
+n)c!5*!/Q)Hj&I A |s
+v02`Ry=0^G/z*TN k㷩a#3
+s
+Ve ˴?si1ߓAԇaqIw3SY*v5(Y51讆to40xQ9rl|Wӆus^Y~mKw|NQ^#Bqsғi1s̈9Zn0/GϷ`{|{cn[:6-2vk-oVZm-FC q4Fcqƴ(c j&Rߕ}L{#}9,Wϼ3 , S!VCfi}ؼþMGNK?z8O.{—`bc?[BD/b>bSPo93){J<#}Yw:W@F4 WAZY
+]
+zHMQ xzAԾDkW pN8t8@`s$@fka;PYln "b HQƺ<vR# 9;PN@<G{w>oc.᮳cً9 ܹ11?` v뀍5}w
++5wqY.棇xcy/q14o(v7kHx AAn8x|A
+<A$5yKiFb\ g]nyyʟM Sḗi9Xd^ gAF /SB3QSJ*bBgx7ۖ)
+_ឋ&QKQO”`}vAl !Oہ*2| v$S ؙd}һ"Rb%{Tϛȟk%S1(q7a2`c ,A (= =H'PAI#DB§ 6i^\suYbMׄ^ aT8.}"4!OnQe]f|i`Yi'lm` w= ADx"S޲L7R+jp$yt23mx#>e=1ı.${5pנq
+&+0ȋ9 55l eԄJtJ{UK?Mj>"k>G>EOsE7ڙ+2<b )׃א{A1(rhH<=fDϠH:XNKS2jdК2SBQw)봑6HV+c$i:F-P,SYr g2mGkq#(BC8zB]NEz7ܒIN/3au#kX]y2xV:ȶyΛk?T9>k1`0)쉑KxP{
+]D#؄t
+J2:xՙ&V"_8Cj71RuӲ
+6YPsMҹ>jY,BOz;[Rd:MRhg75V]={__Зsbc kAENBv?k|?0j78H89PE
+-aoPoꤜYB#k 5*a\pP&k,
+E|>O<3KbXC㟡m+y~oߛ`b<&Uȥ\59颦lY€VɋTg*uũ 6cdJ3Ft@6cv`^GKq;}^]
+h;c;H N]/eS  VUfRe $7eMZYWF0W-3|@oΗ l1a ؜um%]V;B=vB\pW-%\gKERSy*ʐU(E_0}&79 @͟
+S߮\tncuO:>hp{+!Z#9RM2Ǫ* KH)T*mN6M2յ4\DgB9_2?B p%MumwuL@#pBA^ ST::8iQimlY"YY9}^Pd9(R6 D)LI3 %8)|'r2$E9)yW ro?(}Sӑ) ֩ COǥ]%c7M5Y,iY!iFy-_RM-ϻR?{9,Rl|RRF$5tYqE7 )ɏ<ޑ)  Y4PSF5;/xWg-^f72.ԊU!AyW2*R/}8Bfzc%9gʥAgjĥ:NwJCrgECzu6Wzsmsw~a5eJmN qȈԪkRbWH:&*_V/+w_rDgfIkU[4Pe1vGO}MO@ٛK_omϕY' YwFHNM?x=G_sb:Uݔɬyɮ|ɭRAb/+զtU|J
+WmR}mNW)6'|cDŽ6%ňw3\Heܩ%w_J{1 GV(d2*uTnVyxիE5.vmyN5ҏ.b< >oDrZc}[-U$rD$j {.TB2/^#.SjПS3gi{ݒ>'Oqb_B]\~gݑ&ft{w t\ ꨎltz9)z68D WoZ?u#ꇗT ,iCzҏNF<,iQL?ЛO`S,W}ueyUL+vS;3$~S' j#*eߩ]o^T,7Y+O;'=#e4@ӑ/rdbO,B&xȏYhuX#wvݗ
+C3깢L<F{FxA\T:۴|O'w7Sx [ׁ>!rL:{NFN&&%ST˴}P<4Mt
+/fVwWkS%*4ҩǡ; Ra:6p`F~ 0cFnuF##G!
+E$Ks@9]0D Te8v,`X` N70I>
+WS $x9[LkpXBA{c7$;C#@!MO/ X/AbAh)c
+E0"Z+l<Wz/kL^u!Xw"u ~R6lE8
+'jp1Ƙ0oEר*F< ~L!f(#QQP/i1sk99= nmqb5_ 4!ۀ?P(}cyJ MKB$gsf2dLeNEFc~cDϲ1 vK}
+Qo\JhKٍU}_6HϵIӹ{
+lLjwxѬw݂{"YMв֞\;Tw}˄ nʦD֤ctB5YN7)S92 C'NEEC,PGI1YR PJ[rY¹}'}K5Uv Y/Ηg1c|I'SCR(NYd*R!Z2_ɞ*!hTAc2px3H]}=@]_Y0^}gwt# cOU EttAVJNSrY&U+UJJE1HaU@5ikwxN|ҹk5zC'KԘ<^-j3$/K5u&-Qp5 J暒Qr4rn,Am@7dK[>Tluٰ}së otxՕ`ߦ*P'B2p5 (\<af(+et}VR Q9#uL {
+OU+ڼGr꽳ݳҚ7y(n)(A=Ǯ52:ZVf$+̂J]#EOP)=@/q֯/qxpoӡrΟ}=K+3FNȺ :VMi ӒLC5vDS7<
+*d/FI
+ Œb#ngT-.uGܷ0n
+B
+eqqu1S
+crY3aaH @FVҖECm<$ 1n&x k&i}V3 #~
+䛙āh'#NwY<L[ȧ򍤏염̒v"k[6A>3a)X<,a&Fc42Q)mkD,Bg_ ܒZTO.P&6+%_e-
+ қR ɗ Ih
+8LAȲ5,2_*\7{|Ž%a?<ˏ=? JI EޢĨȥۅow:f0E4(7*Hw #jc\ [YX-Tylf"n(<=ŷ?|#jd7+'TJ5krZCK&<K:Z%IO78+69(8.?b\̺:M/꼷, Ք]r`\sH3A]iȶ+&vAB,IF"Irj%^N(P)5TLх4=M@[~̦#3+}Xlp\J~Z#ʈ꒸sB<+Ԛ)SMJ)WŤ2f=P
+0"Ĺ1eYaf>?VM63rz\?Y Brs9z!p2;ik#|r[a[!g=,Ʈlׂw1XWef ƫVD)tL^Nn?Γ8rFJF7qxg3Pr|UO3& S5`їƽ}/0~_5t<᳷9h[C䙆xO$_TN r0<AvRZt%OLc4@Pv'fQr9Z-K :: I=mB(j;jykNmxgSzl8h8]Q. ȡbrN<K..$2ʩTAT3Z@4Ra09 +\!ۊznzycY ɪVua yLɭ˖d$+22^$% LY/C'i"=+4 6?^r߳F ݵ[٧>󖻍\g'9YߎAZ-՘MOd%LM59U}v!5J@XĖ1fGyPdв<SV#AӞ!u̓neK8/NWE5JIh$dc⚋QMR|PBF/EbD-BfYk'j0ua3pG4L~źrg`0h:‰{;<CIǫ! 91=K¸nIBRtGaZ 3
+M@ϘhZ i$:d^ici&C)Q'q㘳?ܢ~"ƮC4<
+cK_ࠝ>p.O80v9f< smOvcb8fZp(%-$T,,5K34HDuQP"KٗdZN<9\vupdi}{>Q `>7ZNHM$RCÆGda+2ZB'pĂp2SHr]
+j yhC_K^hyb5b=lО# pQ,[8XG*cE_
+b u: Z34b(@,
+{*D̿D[!އ-L쑾h hśH 1%:K谺8|H!rP6 ca=,(^%~wBx/[bE܋=!9a
+;ڢ0xǡ<T[({*#7UMkO UG:n=uS] -yM5YGqI98R6k'4C
+k %D+t@1rwƺwVt {z?u7iC̯? WmӊK˪ [V곚fnPs8aPݤr LdSo _+XɜzkglA
+RڳVR6^Jwc\~qusBd '#Cݾ^nf {&c𦐑=N_lN{Z!Fxv f)`_)\גYz*eyExŰxh21v& uA3lQfJo`MEo"=ƚ*zU5ŗҩ+,e'sG*e35hS$N>ؐ|Ѹ#i{KcmJqkjobMZ:Oo tgw%;y}w,p>zݭB/M6小\!8D߲^7ZՐUPq̸%5:=iszGRUgcefobEf
+b,g":z_Jמ 獡#NvF:unrsԱLvSQpxWZy}&6K&w*簩2yCgu9Irr{A"rYLtފ#oserɁ`{&^ɛu6LfJSdSy:qMP\Tee`KBE~Cb2isjrqؤϷ&,
+"gf(`*`Tݍ=.ne4.
+3)fhH1E3ZQN|:렻6о@&1FB $T0tE,+`HcHdHA'S*z|,hgK
+|5;Gk :{nq
+,
+(wĬMқ\?'?z u:Lw~v{ S?xJ;oe;5CB"/oSlKlYk3)Nd;9ut3{ܟ1N|ʸI/WIs >@e@>AngkJXO]%i2Bӟ֯eǤ鎣2Մ!n 1!ktkk:K7J?(}\[
+he-/#{(ܺɞq 5~4&A~]ɭ ;˯
+& h'ey^|[-ӃH7P\lқ(ݢJ]wr>ע/Kj{FܕXRgkܴ?ZWLdUE7pQ=’_DőEQoQ3C:~AW= 1%ޙhFIiV V\-[SOxgWVS{zTg*|$1ZpqXqU_-khbOc/scs^r⦅sx!!n꽫QZM}y6Tvnj
+Ҁ' ;#=T>)2U>(I*ي.Q$]qWVS4)u߀`_vP@cMjM給`:IkOk[
+lZ
+ϗΉ#j3I%iCibVvr/]$8)NI</Q%JTIcH4+T%  CJ 2D 6Ҹ{вlepimZuCԡ(U!%49,zfF!+M]MNk$'(Ro""Y2uN$~A t6td)yv hfpyFOcVsTHvUDk
+9d Zj& )07!N.Dg\Dg YaL vG cZcq^f)vBqɉ&ʏuum5"*Np.J/MM)V'1RNl~T~PwF7 #EyByΜ
+UQPȠ(
+n P #Z*KMyONz;պTxl6yoqBi~W5+y;)-4,^h[E|fI)xҜ9?[bؔQ4u,̱,%4xPɄ۵LRτ6p{zS{aam_{swfUn\茝S/Tޓݧұ06Q Aޞ 8H&+hhqh2N8r(jr+lקVPt5smLa0UW&m0=g{6 v1nX ϶ܫ{@4h:AVl{x(&njM]ds}[$^ؘ-װ24h*~6LgsPfuG Q QР?8Pm
+T^e@ PtˍRxˇzō΋%LC7j R˹~ 훂#۷KuU2M{\~x%W]W(/`<*U
+8|Z ֲa Ϟqڙ29בōXΏKQ(vl h Tt Pt
+$3,cܮ
+ aPBzV
+<Q=0i` 4LOt=.a.ʰ"aDCE4TQDU8 cPf([ .Rn(ASxX9xG r09ACڗZ1Jj ֨IGբ8hJ*\'8(>M\'o<GQ`GB't>t b`8dLT;YR6*q~uF.J=QrNި?(KGyR$%zQQţGC1 0Vg်Qf@e;b/CxbQި$D*,,  ]彂w9zЧ[0OE-z c LZ`
+c16\0j
+#ڭaMzo0|?@uDЧj*[>*/x}P~|ݣ|ݥBY0< }c% \*fS1wM\H tdrtqƽ7jCd n]7{G}^kNtiD/5D/4Dj=|f~Rc5uԙqIDQ⊈ȾCHrsH 
+
+#xZʴiZԱuZ>sx9||񐊵n.<o
+il8;2-
+^S3R2Y db`<)2kjcp~#߇7]N֢ ]_B?TUo-8(x.r"''GZ-EY @܉C4h.35]."Kl :|2 \07=F;:m
+ڮȃZu(9O!͗d)2eA:r.RS4>5YMAJ"KA 5 *#pL6#-pͶz7Ӧ
+n
+\+k{'B
+נZV7n7ˁp;8]~QBi8 c>H7'""zBJ*'T"}kC]dR!EBXd/48pܑ~p֑ ͎,xx5quoC('u"4c )d $L.9t?$\0Q ‚̷C|n Pݠ}f>g#Ѕf
+
+W(
+WR`HR~E$bP
+ev0CKq'@7' - r\>&@~ aأ+
+<<rU`E)zLi ,a>c)̓*u96Ϝ e^*3WuZM?YP2r}mob ZfkVPa~RM|%Qz|Ǹ$~(ŵO%n
+%ZnUSOPj8=G`ߡ_ҥhܟ)<fA%z)U#%ܫefeE䶉ò3. ҼMBZ P+ڰ¦9$P%+2-%&Dq
+BV&*)LU*CqP|Ce¬Aȿ!mp
+os+ k cLV-&۞˲?f`;Dx; ejgA'зhv 7|fkg/] z ٿկ{x`)
+AvdqڣcRBQ,r V+]Zƥ֭+&g.gA8;~p+Y',YUGG;}-mhCc3X $r+ϓ~
+l¥zb'&jA'^R
+4TxPQ HG</chm6F&Vjr
+l&e
+#n#D
+eSNCCC@:*"=S,kP%;LQRBlt$js_%nsFΐـ޻9sG^x<RH?1YL)ބ/A}uWW赍ElkUGɷԛΘ]2k/69h72!KXߙB51UHC'OcqJ:2STeoG?}?(s!E oPq7hW4^#^5π Z>WSo<UuxOP@aY%3H}$31pŬfS6pO//XQUU]SN9+U !ÿXoզB~hwS8eoKFuhrQ 0=92~ ZҬvN+ a|j12ua:vYA]+vգ8
+lg齍bvE f?$t5=+~[V?>-Tj}'润 MuyVMg/hF5DӠDdEa0$
+ʩg[at5#}!UgєPp6i 6-)>$VG7yTE_UF?UcP=LxI ds0<Z@{-ΑR.¸j8]ECF.-D
+ǣ_:N N&!Ƚ2~"RVws܏^ZqO%(ߓok"!dc@13E4wкXD]c[lظ ]lq|,úՙ3
+\+ֹM.}7מEIRN+g^3?*I1ބS8Ä́!9&1<&_b7r2Wi1_ì͍dIUTfgT6k^QIɷ<^3{{j϶:-畅w_u+7nJG騘=C<R}ZVry^).jpdI*/Wy`vs-q-[ 5gdBV.YMY2O(g6yK.omZ>a"^.#NzK\ g8@U+beV%y:Ewn_Bu.Ϩ<PD H)#LQA,"tІFpF RD *1XQp]f%'nf=G}s=WR*x-^nAIܐ84wQSQQ;aQP_B61xCTT0^,p̕_-]Qךnܔm^`UfWH+v)OmRIޒ)ܤ޹oEDBLH$ oA26.98]pfnt.*[;hQ]&8+e6lDzBY[Q+HouSEg|2R>H{-H#BK&E20\ߖpQ )qXt)*+4W֕V"ҭ &ۖg:J $\IN^vNWFv -h[i Q^R"<Lny3:dpR 讶gګ<9;ΩWҩ.1P7b,e%6EyRsN-PVP_wH \DM/!BKH,SC!pYW#4{ ԲѻKuL.wvCzMu2X_`,۱٢"Z=>K0T꺭bQ#U+,-}).$)"
+&{d1pq5k7٨&+46r5 j:^q:(X̝),dEK9wkE5/snAph}OQQQF_,Õ2ڃJwfm4Յlț5{V5d7DbRd+>6)uSu墈&ކ.uCq~hН)
+Sxgz7.^܃ZZi>5Pt:2e^iRuI*Knm7rKs=M2 JnHC{p OpCpC:=zW?
+-4 ]@e*{磤ϖ)sg.VY97[pp֮(f):v!;ikw۪n{B.^R=lRMPzA]H-u̕IrbVύ>u4BcuGLBd.XPWvﰢqy7N}7{;s& 9:t}C@
+d.W)6ncmm,m
+<x
+gZZ|hC+?r'J8?3NO3Og,grFlLP͞d={?6u@GS&=`\^Ws8j\`֯?,^ٛPb&2rMއּ#,߯PSb PNP}$}-o 8>ib191 qBG|KV@E1aɂ:3jQ!9N,vP>'Sߨ־
+(
Pϱ+
+8b¯37*535.ClU4-B 8۰::paQpڱX'v1e| 2F9#a[ lA{̷S
+"_ h@ |9 fрW2:pb5 a|'&Gq b{̽D|^'Fa
+oqy- p1qևo3go7jq|\|T©Ig΀S93~V3^i;N0 ~.܍,+w{>u[c}[k k*tΫf=btS|lùdߟ{#׻-~C<fx] Fb0Y &]Sc:O82x!o#%0<ӵ{=tf_aon=nֿ4.]: \7ٵר%O`vagz9 CC˅yK}4z~a%3*uo׽Km44èӳ<Nǯ<l1u
+½X.P\GH 41=wNvcY$ϺD_mر_|kO6Xli:suO!N/pm>;P,IF/ Pݓ- ;j13":wjY<㶠UǗ3k]RaXmu8`~Vg xk;`bƮ@jƹ7GhPXCt3bR/IF?mo )M̚C-oڷfopm}P]];Nrk~-*x5x[w@;M4V;A ݓLu%١ I2Z{| * =~stQtU]xΰmwUo ͭ
+im io)CC?€1 fNKh(h?/2*I[tԝF6\DiKulI#eY=FuRimbGtUd5g v*gTD#" G'F"K#k"?JA0M@iBSpUhtdXLҒ>_YؗڝW(5ܞdZnQcU!-[j!.z5{%-dp_jI:Pw1 d_hwWеL*D:臕fJ>Y)hץ(Sc +e&Ir2j}S_l_W- TC|)<i(WD; dnP=wp3+)#NX1:ǣ4؝NߡgVe70(WęfZ'qՉ[y:AvBPpR%Lx$ʔ ;fʾ3e@b gxqR"tg3V@GU;{TriU17eO+SFN_%5.H4+JOT(vZ2#ecZrH9K,y[<eB(ORɾD!DsgW|*7Ukh*[sZvmRho,X6/\8'ƨ0;L[e)m3UvYk|Ez 519(Qqy,F6.LLaRûW2CBW߮8{\MA lm+R7ϧ-"VC*Q~AiN^27:#'V]M]Y>3I]':&ͺ(f^zLd/.<s?=| ƸĽ3bf0FQPI.]))B[(%]ەnvDmvT[UJ:꼴5|{y
+%!9kųx)-vbE8{`u,=
+*̃/ŖŔ fL7=[+"|WhW+BwK' ,:}mDss^R(shRX\)wPCTffU*'EL;mV1$bل-mWC_^!S~\[~ uI}q-v P߻`G)@N9@ΡK
+km N3<:fjm0ormڹ55K֤Uk|YxWWENѨQ?<D:{P__a~~C88,~
+n7Ldcubu} F#5v`o7֜~av "Df/
+=@ fG|rG<a5Spoܮk@}\[u"AC9XD9XE9EC/gPm{1mi%P_9z `w!?
+d@pt`u/r)Qw ey2;e2N4_r`y̿|`
+B_  |ozr3^AkDC+_C(b9&41[Ba
+Bh;ڍJTFѷt ~
+`TRiyFxs.q|r۵yyo띭}w8>9|nrolʖҵ-ˤe=UΧ䋜o)`"&#3<#“QZ2\b$D+ mk ݾKvxr~Kqf(/]p6Q43` (; e
+W})j&-Z)=gGN% <4IK:4t!x&i5XÐ䧡GH\ȑ5)XKX7`\wr>x> ].K< ^9e>gx:,fٌ M`tWDL+p`_+ǐ5|U"wxP w`EĄ+͸EQ"\!dAל8#P ܆Vk=!㼽ay4gTh֩ȑtG] ;z6&
+,}sQD%IV%~pYJFii~Nu?V,'ZBsS` 9}yt{\T_b޼1zDw5Q]_Z|#x~sKn)$U9 48U*婄\C"⁒RX?"ZB =zOᨮFgyfG*˒V{3f{OBlMz 4eεFO >pZ`JUD/y:Ľr y̿_ # C{-4k-C<LƣDYV,me*ƘcA @p/Uޫ8[ Z*LnƍW&*2<jπJL+SzrCpgiC&lDIV4NcS+}U+Ř`*ʿG
+S
+tA*chsY3ͤlPأ1F( ?_ߏɿRR`,?>F(^ԽfjppQ0f|7\^a3d{wUҕiM դ 0ь]}QNbWT.ŪUV^+1\"h:еg=Փp>j
+-b oЫ*CH׵Gh(M<Rifc
+;JͿJ ZS/}tZE3rϠ7.g&) 7x9nz67ME:
+ԅijZ#ʫe!BUc%g{
+cɪ0zO
+m1hfZ<f 4K8jeɖ)Be82WkIN*Zd]\YN^EZzBAjr.x}5A~J(?wj6
+]ʞQK @ ?IoUWp㠻6DC{=7ff:47BsP u~ڪ`v? lo>mnV
+kSRsӚEs@a=2`8Ȩl3q}JCHb >$L$)^>8qZt^wK-uD'3Ÿ2q'vABpaRNH^ɛB~ CXHPCnnDOZu T 52^HF"$W셺=W3uЯGn<PWYgkJH܉gswq2m`/t_glHj؀6km1{`5F
+uu݁\?mp/#8{QciMƘ&3Փ >j6{ΆF.f#W'~#{;֫e=֥?:CןdNvå_…VW.D.rah+i 8Jc=a} Xa2bak7lcwݿfwܳm<vnJ5Cpj(Z<N{r)O.iQICفмyɄGQ9o:kYn,g׌keBKqp޸[Oc謱@l<,:m5čfI߇:W_nsg|DAJPx8ሡ 1#8mAqwعBipƴRdZ+j L|2`DN{$ {EڀRiM1FYjz(3qeώ Ãm)_
+%#mE9= #BdZ"SىBCBQ}ĵaT (.tې]6!Y|yy!EiH$AYrIy0۶(0NPW{I'Ij\脳1h 66M8I+'.G^V'MCmʃ [9WUh.RDk-v{?j7$ <Q>ЗH=_2p5YIr4'jqbjQ<UL*%''9@fȦ0n n2?ۼ/T{cvdjb3c{b1taG,wlx0
+K<׭EhJ3y5YxS}k]|tDP%VHEfuIcQؘo1}c%殺9Us0clƐfӧveٷ͙.J[}FG]z%WPt!A|BT*˗$
+~VA `T;!V.J亻r'?$
+K߱!u="!<J йd&7|#*ʷ1Pn9^oJt,0ɜ*WmYGv+SK/iO ER=K>{KsH_[p"$bP[*( b ݜB~xmuSv%2MYY^aS̃$0(8qKQ[Q&']%3ZZ:WtCY?֠ȺYwrpnvC}V}^8vw֕z&Vk}j15,(-aW¨/U V]uTz>+C4-(lA~*h7#};jdEqmim2Gi9%5\y볿_x,?:_/aa ճ`>GSʹ -]=m]]@^7^/dٿA0Xnb>/!W[cv 幷%ޮB:B:㦉fz~t.tV.=Q7![@$oGx(3͉OF"Ʋ9u5ctmim##?r>o<Y, Q}hPv ec@¤b=%F:ފ] gBgb=3) ΙmU?nqxkzq 7/ޜS'Xc@
+v>ʵ sH:D&u9_[sc>oχ`|mq2oTh3q6٬܍~Ivl?ᮝn9~Wc2 N
+ﮃ^ł_9}PV )x=χ_u1>FH}oM+@ lzx> չle D((`W% 1`A,H@Dņ(< C-O1D!ODQDĂg0;=;{9F 9PY0s C Yҿ#DHNb:D X
+ACFr<(g3J,Z=X=OZ8 `] h%+"6!j&;@:5ͣ1
+}k7jGK(]48Zw }0`W.
+:U3PŸ@7QMVen)wr{q]yMWՌCkp^øZsƝ{=fKm`f9/c
+[u_epKؐ**2,m7֛l1l5)0.7TJ6 W\:dk\^V2Yg`(vF#9. % }#cwJFscS[ŋ6-X f%YZ=_ڽXU9 ֥t'+mZ#PM88>(cEV
+$Y'MN'-P J7Jܠ<>jf<.iSGCp"
+80(ٯ[u^ȉ̘AȈҢ}QXqR9Ӥ'S E ]|j)ǻMk"-&1sT?pjPEq췍Ҽ3NZ,ҿqBj;(v<.@0wlpvL8!f)xy\ԨLȵ" uyGEuqwgfd`.誈i*e60 URUZb2XYK(nQ@M\)GO-hknQ999s{}b<31=uO\u]D1D[~:s[<ס='ˍykP0e P0I(HҜy2s&3.N#56CiuXShvNޠGGp>36o_kE QY|7jdYc?4bIQ4I\tl-4 6)1D")!ΐc/T+b۵ \z/NFŋ~>\3T`'ٔuy%&G,5E^rR!+ea򗤚a6IѶE
+$}LR¤r'Vaܦ 7w 3wY`%Rf5Q|'&`_ԥ<JҀtf9c(23=9Y0eJ2J e(۸xyLZri+ubQӆ| NNl 1ԄDuh;Zle鵚.fI?9YJ,6k=QX%rfْitvMTvm٨7ʵ*U/^x=̣9ߐ{_: ]t~Y]%9@!yF%Hw #v]/I#
+da6KRAKrP5+w/onw/~9;N1\,k
+]c'ŜaU灙uW9uu:ɴɔT\6kkl=k4=j"k)<V
+UxAJ
+GRRНLwL {MV{تVOLL$,h [bO"bIFYVIGZ,&̭mS6nطӻmXk2-\>;I 2ۭ^8cGbt8Nşi kܭz a5_b[7 W`=.Z
+׆]4T[]Mo:`+@.
+L p? f' iA̓0 8 ׃S
+{t{Ȁ>-fn)Eϖ:4@ro9tXr0y TO&`R3`Q19*hZ]nusp2Nm U{0C{2OAy
+vP7A%PJ^uqW}@w&cN7sG80u
+p>-*ka{l(H/xArA$upup}DwPA;6yDt3=S-iw8O.ձ]#Zr_`HD)PY^K:_KFn )kp9}5O= G; pKŦ@ ؋+p By:xy<KId;B$gcM|
+O4~%<JLRj|%cI=r ׂ&|\]8p%'.W.+\E0TI
+8K!N>C<O}'iǠd[[k;ϯEf\ wNrgũ!p/394L`""}*/@%Spk6\KÍ8†NQp:
+jp2`9Nű yy9t>`:G}vm(/cH?5'Ip?P;2z4.c: 'i8ڍVW0.bfzWt[=h/
+ n{h˸_E zyɓTb5 O7?OEOHhq`t Dg)`Cʘ!]Zv{*vkphsѦŭ!CΉׇ7OZ4gI{Y*w}? A/zPg&2S:Qh MP3}:5<@SnT6hZ4uuqUҠ%YVkNq+5WSHOQZ*HyYITꩤމ&8biޡ'H}1
+"'b{d86Gji`6D3-vv]m / %^^%^DR[- & +[v\^'_H {BWG7&3ҿ| )-F{
+[jfKS\q7K]*Ӵ'Ԥ1n},)F??2 J/W<hH]S۳5i禋P13߃'# e1LIF"[nd 3DӒ/ɵIs,sevKOAaMgu-K\'Q n4A۴؁&W)6s`VۘҬPeE1Y f`lÖ-\l[)gΑeZ[(ҬxsUddʔ3)Bu̙KP\K|gv9~(uDc<
+r5pF2y-pvY尉9ybΒS!3,F{`ۏR엉*'^-(_ar<?E>袙h!kS.s(N9]Q;yIq#IlĦ3Ein8U(1<RZ\ܠHt)uΣ|Q\A8/H4Kis>}
+$pGn?cUk(b,% J,v-I.. Eu݊#ʘOʘA'GHotE,9g0@X<ah`D2O
+1IHqK%q\LRi.(+لafaQA׺<T5ڨEA EEqA&.TD0j]S4VmXZc4DM'>3}9ݓT84ɬOOZqIP/y_,*ʷ8o{PzN-gߑn1>c ӧ#% iJ-,KRĦwIp^4;D!:gk{Re܋$$ӻ0
+Lg6)C8cl7FgaTV?x B\,Il|ଥҨղYeY&rM"<'"*WB[+XIYIoR٢M^s=\wD\C5`0D"83ƹBqfL7JHCvKCviH#iȆe!Ԧ.e.I
+^ ̦{~F`8[֘B99c@"u(AxI$ %_2JF_Tf!ش
+PrQ?
+_H
+\ la d5i!݉tOR r+ZJWޕeE9X 0e,sòb 3КB[m(xuQ!b#IY}X
+0^-z~I8m|E&w͜<P]Gc;==>>ɤDtح;DM"P2$ydIOK exJ<Eߢ'xxx7w3Q Q Q;@b C2ӹtqL<z<LtmB.z8Sv'n79FBtqvp(\GBHI{-cG">Vғ;؀DW!-tUU񭸆2Gq?"G@ο\!/"o™89iͦ=zГQ3pkMrpqUFjFgъSm$3‘O"%Cpb.đh8!x ܒNuY"o$[ TY:Sf*/G|6Eр&E :=؝~@JDd j|<\5x]7\uK18 Ψ)<Gzi8^&͇8و#"َ֔F8|\ڱln/`uQ.b>ؐ<޷=||E>86pc<yLaٰ{ P =q@ ا{&ؼ*`n:T{7aET܁ŧPEy"r]Yt.:ଗ+Z|pG{(M^Dޅ=/F2vlTb{@,e ByaP;+~# APD
+@ d!XjY?e=)P ƞ>QgvǡJ?
+`>e TNXI(ћ`Pl67HCNI6ܒCHrCEIίx̲\fimc?p}a2lEa$&4lLY(6COBao/}\)A55J .{]8..]n r[ۊ(%*XԱmSӦi3δv!mӴt2M3Mil/2f9ߞ>f&mJ`OfO-'_Ʌɍˍ "ܱj}6p/{Vp\qz܊5)hF+" ӚjLjIMs"fÙ!v43gNsCܠ"\4wYSe}~@DPC
+xJpsjqYeoğTsTM
+ܧ9:ި@WYL1Q[`KR,eQʃO2^*br%ZuJ͜C
+QE4!ҬB*#Io"IQeyCUQjy9FzK" hQ~^Y |n0je lcek9Y+E<.g( ތ)#ʟʨrʨϨHXt<SO?M@Su<՛˞G69J!3cm\aE`د
+?&#>UVG5U~B$Zʜ5!M^Z{&Mpݵ6W&dw*&]g] ]
++"\F5uWep2CiJi
+zE{RpqbS#uEuSnCw}jwςb_c٘B5Y3xwZ.
+וywy_sjJ`&FOy]7Gif-PO՟
+f"1j=d\?_T䴼n"[n~i~-J#0GLQ;;Z
+d!st#2ƶc8ia=R|+,a_؉pH0ç] M&)|II74eָLZqhcq=dL
+ПfIH^6]p) D"\ށX"vŌu+XEJ
+}@R;Nl_lL:X;:8 u'F7yۀ܋o
+*_6XAEl<sDw' L7;
+<'bg$<c뙈TaW'dy^k Jqq):2wNo 
+ѡIBTh0=4W -mSL
+'-kzaRYA#[]dK3f H0$h\FFhM04ᘮiBdx0%|09<G/>_#M273(Bj+7&
+"
+0=}6Oּ@uRʤJΏԸ(%Xg85ڙQNF:YFsi\oq2u1G;ϙ4<tH|yZƀ2X
+kdAFF(ޕ8Wr뚬Wo q]U(N !8cTp4hw3EM}~Z-謄%P3 2OEQ)aF R\a)b4=L qn'i{K~5F_v~ψ,nDgj 7UOl3CW(% LmxI .骨y=5p^ 7D=IT_OxLSoExYj#ܳN% Fx @!'=o4hk)z/Žs@Q
+&+kSwoے겤Rz_PwB'BJ+tO
+}g4 g怋p"h'23YR)̬gXyKyTh TĪshuL#XRyj_Y
+ܣ7X񱂞i̧i>E,%e
+j[5Vm8պʭVU_Z-mߺC[[7䷦A-Vsy\۾HJ1eRl4^kЯBnfs nԢ:D~aj^)K`eổf+]M"ˁ샓4(-wZ^;ir) 㞓nwF[Zi&sMk.:⽏B8jijpkxju-HN~spRb]05g9#э܆AV
+xE{M\0pvƎ4Gh 1.::6zIù:bQG, r/ֱ>[#>AVG%h8ٜh[mӝihml҉GccPϡ_ONIt=.9_9%tzuR glf13] &;Jw>%}iBPWf2PWIU̫8rf`Db405nt;xZj~yl ҧp>HKo[ȝkrf>7vߐ@a5쇃L  B,$B&'fѿHi5\Buz}M=żtC:~5V)@
+b4o񉖑
+R
+*ߨ9z˓x6*&|ޚXoC1Hw*>M@'_\h(Ac{)ezO<z߬M7tT~ ka
+~(zBEtI2St,RCہ5ΏǤ 9UPQ #J ChB7> }=]8c,Pxub'k&j~GIF(}Ls1.è( Qv 0 .E!qbz]BgNtW2)ZXKM於C~ʚ%X$|@5敏)pS=e勔Ǡd#$Jr#K*C@Z
+ WzPW [
+`5\@mj#5uiBuc:NVefZq1^Tr*L#NKT֬`o+&&uh<͔zS<l-0`͇VZ
+VTYZڠaj~,r%(? (-I)QVNZ/#dDHSfZse58mQmˀƇ: 4u*TPQ_ u*.(C'̾~IOLZeҺ(+#h!sd7$]CA]m4  jH!< rܩҩiU k
+X6# D(ЯvB / ?02xmY/sd?q
+e* {a
+#Z~/c`˹hfɱL52}'2|#ÜLyV-J! wdbR,)r'?WXXb''-&%PKG[̲ZZF%Y6 5'Rvv̒+4ĻxBMJ̐&l.@藢cl+eS0w/qƪxhU4j:qj>灼i06@0{]1K%5edX+aXo/m` ƣP;612@:Xvp {KO"ޣbrϯ.˥*4q~d%dԳճ|$$;G؍=g~Iރs{Ecpnk*>'͓|]%5!qw4V BB%}lN:PBp$aIvg9s~DD$<Ɂ' =Q%_BfjDd{
+4ci3TBl)Ɩ
+ 6oRQ1ѧ kPVb
+UPs Qlz4>D(9IQ&1S9DqpŚjdt/ a44ztc-Mh`yн\g̣:0+*"EPEaeXT7(
+.ǚb&Zq_c5֥1xXҨZMD? \{0t^>|߂3s1TG9y%41W1~PŌV1V$ٍ6es[2͔-WJ3-WAMJ`?fr1 6 k`T78bEqgO9+h`U9Kq&(%a,pFIJHc0'+ ?:cx#%S3=|K!1'tTN쉽/[P%5)J)Iq$[d-`.s\ŧ<+SJM2ZbSI Qg[)#Si)ZdQ5DJH5ʜ4LiK+Rm9-QtzƦoԘТKj0;1Ue
+v~ۘ7m]Č~2g V|F2-cY1YVEg56@cehKoPxve
+G
+r+^eti)̇ ߶L<G3L^魘Eilnr4:/NyEe*ܑ0GF9HGB+FoCN#w4"'V3uJEHg$Oɕإv;SQ}9"
+V0\
+50F4NHaFjxDkX -QP
+,ڬ!E,V`
+,`rȡ0 &2F75C1A
+
+)%
+. ҰP -RPiKS4ԮB .AeUzl~ej@~~75 ,v)̃r4!Rr :W^A<5dӠz<Xad3A~N;,U_g8^|[~]=^ܭԡK8"E; ms=&(UtV9^7TwezUoE>UvyWMP*սj4ʳrUS99~nբ
+.ϕ.|\`
+Q7We+_]5W\ 0P}Anw)a9Ssl)
+}tF?\I]j<ձGk] 5|krRKS?`L5`?u] <τ2G3ND;z4j4t1].<Jɣ3
+G f:GMhI ކ* ]{.CvyH8ZZg8 U|J}'|/Fk~Eo#v{n;tk`3?M—Nñ=]|m--M< W8/t?úB9sIm|y=C魇
+ЏF{ok:KkOB<u:=K[Dp\џDlAOЕp@F=+1ɤI *!q|@#q8մNjB)od
+$&!IsM4I&kf]zd=Uuӎv6դQҺN:mkUv޷dz{>I}R/xW%^սŋ7Zʥc:\G&dQqX<pz}^ݐs:Dv)^VY =HӨ5KH:ҩ .fƨ4&$^KcEi;:p\'zL}L5iTx{Y<򔞯+='$eKDY5ί g850wk8vǢ}'GuW9IXc~ξ[c_,oS)z(]Qx!˷'&sy[Ʃ ՜- p8nCqS7ρEl8yn7<R_ga4~c+Th)_43 17r|S+"-4:8bB ~&;aYLfWN#(ۓ2tיItLǶOJ|kzJA.=yJ-爼J6p 9\vXJb1RYH#-si#̦M2>tS gb"㙏5;e2|+
+O =.V%?{ewV,Y ,de#l33a*pN79nek4y g((FsP;."7)R.JŎ].%Yˏg m K(dXѢV 2X4Lq턶GIPݦ2=Ke6ҿ7Q׾H_Ny5K/Ib$SCrM6MNJ)&X:@w8]eos[<7C_kҝ6GYyҾLh_Fͱ 3k6Tmqeioi⧣"D{(Uh:D,xlO}fۯ_\DVyFWf/k\2,'XL5v IM[aS4,d +48/QxKEDd'{VwQi> f<aQS@M5xK+q4;\49pvX;HC$u;p:S<Emq^?pFLWuJ뗏_ڜF<T49P_C}}Ά6hǮƵL$M5} kwůğĿ"\FŢKyzKq䊧ѕL}SΦBjp4[7Q݁݋=FgJ*ZciO<[~/,*JR:M%Ҩ>ѩ6n5zqmIޚNuk>VֶJTzx#f(-Q[仗G~C(7_eJ"(YRZ X;TvPљN3eՔ1[(80EQ`#.x O~S
+U..HgI*1'k*j;ʃ(`KO>=&z(쭥z MIv Y =DFۤ~&~OF'dDwK렴ĔDPKINA? L!w("d U9@pA҆GI#ydGΈ$ ?KŻ$ }*wJkYEHM%ZcUVQ[cȘ06HD:)y$OyZ'$bcxMćOb_O7xG?#~<Ši1"ѡ5UIJQ٘U!}z I$m8Ms`/68e|/Hu^dD~@cL<0""2
+* 5"(Ȧ(( (8*
++˩₩1n&DQc%i[5ǦMjԨI44>99=Ǚg}T:++Hϖs<r0K5}ŀyoԣMYj%H.rDCf\ 2`]x
+"҄9a 9Hx<:W0\ht6|6҈)m4yx8l0fa[o=oUfdI;}ȚM Q'fRgxmvh?vpM᳇BC,1̬nsZsItJk9r9k_/7K4v' >''- <hiHi?:^m䤍k#m
+yd_AzNyerr^_j`}sà_2|W܀N'r1| G|`
+㱟LV<Hf؅;I+o[m${
+_v' lS#8ia
+3l4?6ᇍl>UG$oV*V[rcգ_Ks4g [{/^g A'
+hEc)hdc)E
+ZV,""[.v._iswr# kG>>wpelwUSVw JhYG%Vu.ZꚢZL-q"|Y܊TVjZ֤y-*s?RwTcx<Q9;đz㽅WMظn
+Vziew/wRZ1HCF$LUUxjg<KT5_^K5ǫAE^Tc
+_,w5}yJ'm|^-,]dtBoxۤy8Z%x'jO|T蓧"PbJ{nUNSMe
+~{''y0
+@Cm S/]TK%~4ׯ*5XNPg(?GPMcUfM%ئJ AsmױĀ6lE泊r)Ɨ92;C(?feTV8M JԔTeRz<+e@lФJ2J4]Qbȗ\Ն.ڍiTCs_/2#r{hZSfp2LQJ7 Si&+4I!8RBjQ杊 ;4. zn]Ff*`nˣ5!.Yfez*=W>J1lD%G(1,V aAي /иrF,؈lCuR#~=;iAo m
+1
+ǽl09C"J (EӸъQ)5UkTtFF[4b0dǼa1|`!vS\7ya&po
+K#.M ̣>0dQvMvD}}GEepcĠ`Ԉ\
+`ҧ)1ݮEXgޭX`>x7e8نV7m\30*ǔ.SR3(<NI(%'*!3U񙙚IePXM,TS+:k+2,=E[l"*3k65C!X!Y7%ey)jP5PqpZ'hBvb5>;[9%ʩVdLE(<wrWhpH!yBsC8hEchTB *'cW|_/WTA" QB
+-
+-,THQ5(YAE
+,zN;uE_
+Q`CEĪB9<\*1U2R
++3(,H"\dP'
+1M]&C3xQ*IV|QwW@2zhKUPy0 "_:FbUB*]4Sվ[=VcC4:Zx1ȣj)Z4ʻvjY~ <kC,d
+(bjP*%;&KQS)N2L!z/ @޶0yqyڒ!S۪46Cn:b땳m\%ܕjGqـ^5Bkvj%{]+amly=4r)gD dj v~dVjĨ6b3|9wZV#5YoXh'QXэ7I]N PJ[)^lX =m|!3] rȣzf`>}t jK4l)w)We 7v2l {Emg6k|m~sn0(z8E BװH~Rr_&,K8p.+*.]tqíAaa= Gw1]_5 ͩPFs([\!k\>ZiJɩm*si-䱎<S Q zt!aGO>jb`;6{[ Vf6SDEVFr{ 6xh$2.c}cc}ǹ}
+
+\eN>aFї2gl MVżuؠu <=w'-]U'mu}r uvxa}k}Ӹ_C<ω <74}tWE/JD3|t*Ш-6KANw}eE|y\Y"qyW(29?9<{=;BDzQDJ^Gt<ΐ))y|<NBi~NCُ<8$ S%^
+^8=t2a$J*"yI_k[Xk z *CoBݺ](Dux8}hșyk!~2f]ʶ$vmĞ=j".f kVj;ًd*[j37ѥ^}':<ZGH|?ÉG|#-t9إĮV棏9ݬYĞK]B'bBY zZ7DfV-7м8=vj=EE⛈ja_BJRz"~1[R:ҩr|.t}lc+78vce+ڼQ蹡MEǠF JB!_I4&QKј<vTC "RiOǛf8͑vu>X5<\i0w|G'X4HG# |4J=ͫ O[;i$Nb''sqbױsqiRM6Z:umU]K+T(L\Mh B6&B Ć m0ډ3??~:w}~{cc/V0]b -|Q_75O op}$1s4WG
+ :kѡ\i5ϫ~j%?L FX0i*\ъvif/hGɋ*ɒ5Q&>d
+eEi׸?-Ye,-5jԪJ-ЬyC =ij׌!ƔiM5a<NjĮ1]ר鞒ה0F,Yڬ^FzЧ}c~,lZsLf1;5mnДEami21˘F-Jn\U c>nzRqU Zju~?>./8l>Xz{f,3qږ)Q)&iU֦-,xwnm~LъksxUa
+WާyEit-<3M2s36{f 5dw*nנݧG=9bVr\Ym(TO5wU:koÇgZI"r=I8ce^FːH_mUPY^g8[R&Au׎*X;EuTo͉[=?kh=Rioޡyd,}<E]E\]VU.W:p^ߧ@}BI5RgZOxQ͍o;|BVW94c@
+Fjg{xr)QcRǦvCO<jmlS7oT!57<'o}']P["ww\
+ZUVnTTeOLCS-isCO,| $[[&[=>Vy54ИVA:R#Շ}…rn1*bQe\HnUCe٢CFS]C;'Ḵ{Mb?9WY73hzϣ3N Aۄ%n໣RU_*KT>`RـUA6 j`#e )>s2/]_SIǴ0
+Em$Pf>ϳ?ݿ}" JH%:bv̠RѰ$H@phĈ`ּ>5&ym xyX{g(b5 s/w)
+On1.̓ي
+U2E|$E/"|,||\q7˺LOgTT2CeO8[S6[.R^/i8:4D# <4(GJ31yJ}P\M曓Tp$:`v [6 jV^?!=8-:qHCh(fSwԫMԡAS4>. Y2a ݩЃj
+=!vA@{ql5[=0fO53\6;ܠICtgUaɚR{Xi Tkh79|uq 5D,P}JEn<jI\hn8z`fB7]<K^:Cn0j!Fx58lP!G1X:cjmUeTiڨ
+I߇4k#[c#;zy\s,k4GFI 8ՙ5j9KfUQUլE3G%1Tl,T{
+Fʳ'+מle'I.;FY)LTc|Pr:#x>3zhL9eHc_#yVR!: qq)ˑLS,yJO-QZZRL#}R\ z@IGeǕ6|W<h5 ћ<XuPu9~
+*KQ2.T ^pQC@KПDڑP P>ȅL|}^d+
+W\QhŔX]tȑ_$4(c,J*t=TO\K%7MEF4 gR]AQg]wEЪ(*
+-,
+BmăD3iFUi;1&ͤNkNc̴L56i֣c,d?Y罾}FL+`WJQdv|dȕQ Jv\*C ~;+ιOcqX^8V±`>( *id_+;IFYIJdT'[y*u)ڋ'/ыp| <<_h&q;(@1τ;~$J ~dʼnJ**@0
+PH9ĜE̓}O?/Q_µEgKO F+k+:w%KF.(\/Qu`;ϰ-DMT\~vPBsy&1O _?f4`9VAZM.?Ppxs{Ez3r [d!m\@̳p}jΫ)$C7XlaX?X6N`LM6s6U|RMySpw+TQ"͡|ի^3uK a·A? XWY<e0":1%7 p;q|'qL~xԹ|Ӊ9c5=mp>
+q/O=r, w}qK
+~O
+y.!MwAQj@|ν:+OQ8|H❧I~E?"sphBp;C->Un3o>$}|QX5=:7j ~{=Hj=k?
+Ux3z]W]Rt+pk>\P\fFi3[GP'^uz|:z:~CE0-{/J'i : A ƸE+Zd$,%ض㷋\DKè!A6]Tyxscu9/pޏ#N[f|a
+Gb]m;V]a;l/nvS<7v#dr EA+|2;17bۊtf.v#ʎ^
+rzSL9q,Ǭ`#vpFHo~:b&'2B".
+8p@wtұkuԣj .3HxU3
+De=G(\jycm+U5qr ?'L84^zJKXk'/SIF-6X3k,!K.l-HWMbHQuOzU&.UUfRqJL/tBEp |'6\p-^~w[62UcJӔjTM3Te|S**7WUV㖫hjͳUk}Eso*!=pm`cmzk
+MI*NS5[ֹ*ZS;IyW)7urR٩O+fL9p{HC
+U |w*_ԖTRST:A575Kslʳ*VDEʞT5#}2.5-cD55,! ¿4`$|e}oJx  b I5AI*;œVYKfnVbUQyUۺuն]ﶹ]n9 d'y^z|*|̍W%Yety-Y*R OGrjU(Ek
+&-V_vl4~PVg~<mYmj8! :h0 LܫJ)JA (ͤB[6pUJkRAsR~Y;|Vf)e;ו%?
+zX]p U[(p9&HQ#]vGlNN(V^OSkr\m2{^,&ezvyF=V2hoh*ցSJ|wIcTnI"re.r+\Yŵ, TҪ)ݻQio'}ܔ RSp @)>”߬8Ki̥*PfYI(/TzT) jhQjE'Uo@ɾA%;Ċs2T\*>W?a;Rԃ|ǤJ pϊ|THپx&')ʨLiԪP*JnRbuDŚXFwlU|^U կ+|DUݬmo W
+<wLFjVJe۔wiL@أ+,X#,~o?c-bf6WBQ9(.ÝW -RZ N)S 24`⢇X$H)ZBhB6 )B
+<|.HF3ńٴF4P(NiO;JN3X3.kᡖ&lAĵ)0(41
+a:tPuVr4%-|4.F
+4G5t̻jL?~ʹy -J<Cs?DP@LÜ: t k#DwQ};1?R1<eد%Sue2~ƏS(X'P84F~6fs0>CxЙOEh47jvP}hũ߄3,ji0)('
+L5{ #u̼M`pEWhT՟W<~`;۹v0Ŵi%mx} %rǘ as9jj=7{L`e R5:%.Z;}Q`O#6Zm/u؞{݌VlEݥ Te е/iVқbX1\G.t욱k.l{]Z쇰V+#]Lb
+Y<H0g?>:1~6ktv 5bׄE g?RX a2)snM?ӳٮ:e05&9(Fd}{\,XH.&=Fڍc~t
+ۧ:\G8N
+6
+CC7]'caVDY]-vJ~%uJأjw)UԱ@ 1E(llVG!~*h<G
+W^k[KBzN<Y޵K3JV% K1çF##Ѥ3zgC
+(ZpV>Uy9-粼u7 ;\MZL3v@gi%r1O5m
+ ջ+rW]'OWT]HU+ީJ.Uq}\Kryr{oj'荓@.pm4$x#FE[תסץjWU DJ[զ~UT㟐ۿA |EFpJ偋rPOtk#Z!kR]'D~vy*婩&.W0#gGڅ2j<4)Gh/òRYcm݆]h44O#"YePP\u9rWɨUy}4t'[d"kdlUidJ%#DN *\d ԿEسA,$!=P <wGr6.G){RhʢaY T%Hű*oRa^d?**vt# ihY#ԣY ~}<`1%%m& $=$USQ2&sET
+R^Ҽ{7;IƔ|fR(
+l3A4lQiM
+ h6xVLk+yt+^oJf%b2
+3oce}~z.hE75L\=5-Ch,I5$so%{sIFMı817v0&;XTVfH3׆A
+kyR{꣯s"!Rt{^sk^nh
+Ƃz8K!Lt?I!q8feep#TxplCN.a0UXR|e>oH])a0K$SgX'0ٟq%=y2ղ1@ۏk#VR+{ @^y3xޔT'Y{.o?$ %KE&<{ŋsgW ml}y`}ò{ސ͚:Lm`VKs%O,~ccl:W {ś4썓dŧpO/yC/s /d"oGG,~~ͤyIKLWW^/}_%Կ,jg'ހ Ufyw?6sZ)
+:2qӺ{Esxq~&̳gcۼ8m~v|;׉8iM鑶뵵)F=Cݠ$@cL ILHCC􏩈C$PP}~{<$%<t~n+k|> ݜ73 0(_fѯ=MgP^ <?QR$gHGHXx< r/0{ >O߰y ކ!$=~7V!Rd cse e:#h$>+xyK+Dgt*sB?Lm* у_u]S25t,v#Wȑq?>2S{R#aCdC/6k*< 3ϋJ\;-[Cw6Н@wY4:0 Gt7)T 2d V9-hm[=c0g!X=GG xl'[p<Sx<:Gϟ#~)|{6o 'hVtaE.UF &1KT0{l9O.:H:7Ŏv9V ]7&Dn,n_Gqɐ9ߏG5,N 2ix11v1vq|Xc3g9򎳥-s]yl.G;QgYlQ
+6`oRc% A=R] _L:M~O9_@Y_X_\i#WQVWZ1c)l^Q|NA#__ Kq{sQrrP後/EuK!ARGdTŒ(n&3;5Kkj (l*ZT0tDfhEfgᦌk2Boz?u
+7K3A)<}Pᾄ/ Z+r**5R8W(Q0ܥ`k֭
+D=$#zZcƮ%Uyߓ;&ܒ'rW{;i`Rʵ |.Zz2cAbQc2eu&o;K~yNʕ g9_;\ğdO1פ5j@*P<dy—6-ĭ
+%2.>|ayjiȓ*ʝʕ3ݔ=$[愬epf(Hicc{SP2(:x$!(*n?/UK/w6$gGL*)r F%O9s* r
+AhߌM-]N9K-uma*$MG+],ljj@iCePPo)CН$PnNS!6J@e4U6]?MS'hu>[w4qu:@zJʱ{-hAz<2Lrr®Y~ΚE~A!ah66@A<0ǀfq&m&А ឦ ]` ta/)q ĮQ<Hr2ā?B;ꐶq3dhM5I<4ɉI w&VB{ƛ!]a6)h8w76b, xesnYݙw]w4Ս*a75I{Su5@Q4L)te?~,abra0sqq8S$'}jNk)eA>aE{HYaNaV6 3]Qg6{9d7l[ Pb F
+*e(P*SS
+J/Pʥj-2 ʴ:ڱj 3Hm-ɞt;oel?V~YpYKbr5 c̉ջc,NY{&Μ&38]p~ᣴX,k:gHL6}?ѯ' v ?mI[-~x;gr!q68wsΕΒmQQ]·˨#rs[ 7c?}&{vdVĻH"8sIKi&xA;.Gd##h^e~WN0?HH3(qe3~VpNEj'[ٜ;nG<$H9X< WU~H<^W^ef\. euqDINۿ^p᳹ϏU6K<`,D$+5>>ɿJKb&>f- |
+Ol.>IQAaM2z 2zQ{u΢k~8 p ޿z]uq-l$.%~u9Gem~<GHOQ0'Hqoqtx=;xyWVw3v/!^D-<8~89:ΰzA4
+)w&>~|?D~bz":'~BiUh
+^VXe]SNڟ&hq48Zj%v؝lj~>^n.NC)u}v!~D_v<mv\pǝ;vd`IЈ"v;;eZu&v;#bl/"Vc(p< 4z"%kЙcp_/;muiG:ў؊
+]9x
+Lf]e\suu2U`Үt<x}FuaVB/|)n5|j
+jE5&(̓N}J|T 7+T,Y˲<e{X|xgqɠxW
+* +*TH**((lW,8EVp<%Lc"ƣ¡3UZE 5xn}d#QΣ_H@pH1#,ˈL##3ܤ(B1T82,Q7P&뾭@ݓj#U#7/74IhE̻e@ҬQ*ˊdpE@ht)d4oW\Zn Yߒ:(uRnpE5 -|9H.
+<7%aLf@ufPa3$Ê(d
+Z b X>y$;B5ur%X| EΊ}ṗs&o/E̻,HK}ܥx#+iժDb񠂉jO˓˝lSMG;lqf܆i I|HbxSGdQh- ϻ|Iy"QX+3SD~
+& y24Xr5 9gϢ)K{caq+X³Yφ$/"\Cedj(fsI>'ݲ=&=
+r73D V:HJW xmǶAlcoC%K"K+>|pN+=`hiy׀)ޅ~F5}faX5 ZZ"
+nUƱ3h:Z+neJ;=HYB6BIH@P !Ѻ/NT;նK2x:ɇ0p=!?}f^LRpφ`@Vr@G Aw"0<A!
+Y;y80_w97=Ecg@Ҁ= бQR$Ή {P1j` <z
+Fس٨ )S"̌tNTf`#H800;Iw>B΃Vݕ Yk`Õ(,7U
+U+'F|`
+ ^EMB@n/+iQ'B/ paT/D;C!XB"0cr>Q88/l0݊M?xy~n07|cǎ0q)SMs^(d^^2l/WYn_zWl۾ܵ{"ވ־o|#G?>3L6ğ=w>1)BY"D-U5ڂ¢CiTSźƦffpvv]|nܼu}ŗ_o~OD%}y1<\'_ gK<b}ˉ_+
+z޻}_>xo=z;xɓOkMuDT__ba~CٖsJ:CR Z G#e&\WfHKi h0a@À 4 w|kfdKeUh_ݯAųs94HASe *g)AxӀ n_ToO*HSoTb.W]ޠZA Р%4(ײ3n膆>nE$YL!`*_mԝ/QsР 4y"ySIfuaƹgc,i0,5pCu~S9Ѡriȇ۝+]xWY"Z:ӸdM3^Dv 97V0N6CC4N۝#>1tdBG*@C'ie$5hͥotРUrS!\ʖrz$N:Ҡ#{脆ƒn#Hi КʷkJ
+A˱)sNy6K"cwgI=q:E+6 Zg
+Uo-/4CTРa;rV(ՕБu9'_4qbf՚ *ʶ̅ڸ|5ǢT۳,8Ȅ#Eƾt^鎗{<6XjwУ-VZzQQYkF}QLVנ<VDɲ ̎#Er&ٝg9]|ak۝%m[ - jtgpZנ԰e*5+ٖd2
+VGp\9iϷ9[2CeXְRUt6 Ne54̖t5Ӓb&I.ps6v.iXmq-NzXS^JYVwQcghY͉VKm x*2G6A?^TRaX*+5j$!Anh9|N'hG]ǰ.چr'=Uti.4'$l'Nb;niP
+˱lpWDL|rV\`ƉмVmӰi4l6 m{Pdžg0|ǐ0aV]ց灡F!ʺ[Kn۹l{`?)`oh@lǧ"sf\޼-RtɌ)Nm-në=
+5e'#1=0htHh#EAg"F Vh•Ibm0;;6 7`2>A :SvIQĢU]1W B% OXoL[n` `Q/c×hޫF'Jcs_+!DtU3(˗vjYy`xN
+ǪhC˵};޼kaOF#}TYإA {\,|41eW؈XÎRϾ*m;BRq }Z鳌ٝ9bIlVȵB%0 2qȌO[uaDӵ7&(-k~iRNPF
+vhT@Ac<
+ʓ6;B?["ۊTa[ddcW(i  i}EUq%ݝ pPsvdcA>Gz(6lj;^i<)7m}Uɰw>&t%4aS&Hsĉe!e;l[԰0ݸ/Wi<kQ %ߤCX <pC#IF̍2c`7bTL8uxp{lh=W- rɓw͉;0@"l?:ǢH./#3>oƮOW}/>{cI_ᜲks,p!m,g9@Ov.Rgu6A$Ⱥ[5X=ښWǖͯslwrl$&";$
+e;5+jK״4Œ^S5x{z~q_=a8 ie/ŴxXj(Q@ӨʨVf =[rSPԤtuEhx{~ {/ͩ0/!=k[8P&ڪY V $7yMRULMogn`##4n%ubD@tPf*haTIȚ^ʸ,oe>OUq x -"8g3h.PԗMЬ] U,*WPW2M~K(d+\+x{ڍ^o_=NioYz!pg'ئb
+Z(e^ik{dEDUۆa}B{_k_ӜB3sޔJ(6y<d#d؞I .h5`UJUPW
+
+]_ft--} l?mhtƛ]k1m(@SV#8SZʂDC" Bj]*QTv?r?mcoG#'=c3# F-DQL u@YBPQ4
+-^uֽ/[|<7Ƒsp%'Zf#,՚Dɳ\S82C:vDos/{롽Kmx8dGR!kLBE )3T}@Zd`&7+ܞ}}}}TUK8=1% vBFcrQpXL"l*"D&[K76ٲm~~y5Lu?=Z 8 0 kcwybd+@"LCӝ]g^)5Ah]@Q284N`Ye)68GQs$#⯜mh\ltrB3lHaO$+aFT&.JRL, N(;1 Q1v iҷ4ްin|b-dY~FN좃a/ai.(I
+JM(-9"IJOE|3٦J/i=#)}ȧl1S#8N
+&dp$&#|$b32A:39>
+%<$iCPMAcqd<k[cݍG ۤYѧۗ 9J6"Y?1ᣱ&=3.tET]J0L )<up} '/% hT'bj&HCg0gdsX]sFaFG2MP`3nc8޿ ?)J._JȱNp/\ڔIAi9_Sb$kdlSݳax3`<_V夗]i5_Jov+À 5R!ڃBҦnu\#.@33lp1%YKִ_[l6$4 _1}Eo}O(E"9_72NƘɞx%+,CT堶 #y{hX`{a4'ĝ7PeK("*$}x-B
+NhJ&.F%9*J`mA G*Z]i;8EU͡kt@ {dKم) 9k~aə(k B~gxl؂kN(?d'ii/i
+ŴxX jxW:epC1u3Dr~ϜK6-(',eS$̻챡lo~lPu՝xXOu`.8YNJdb=5P:)'4c]|kˆE+؋1SK<l}FdХ 5<S 3rrETvp%9T:VL1O;ZI5xǛ;ƭ=iNse<T0nkĴ tPJ%4%V@3\
+Kƾ”w0)Fz.* -ה k0&Ģ]ig|78O섌ШF K@Nq4]iD%DqX-Tc굘wCw Iq#xqA+@[ q5@&}T'jUjM05o} z wҤ[{4p vKXL@ QLBcjM8Y+#UJVak0wVC*yCMhmgpjL줌
+,:5#,QPv?v =J‚KЊ5X5Uܟzx?7cM RځJ[~`A &dH&Y#$c0$U"W;[e7uC+fspO뭍(rW;*q
+юd,A#$9Z6mtoJZmio=aqS5ݾ|OӂSacO0.v8hx'#TQ*LIHLʆt ޜYޖ~0˪a
+аm=ć“!A)# xB1B 3QFg2R!@ R`, }owYr6[iì+auc71'R 9#lD}qNܱqZӝNUzuuk@zWEAAP I\Bx $F$@BȅpAEVԺ9;m-ʶ?*9M8bɢv:jh"(VV@ߠTei4EJtLpavwk}n䅜4~1+=n*(NU
+<L;sYINiBx6
+_sZfFGܰZ)HB':!TUr_JDot$ H\$\VQ"Fa]|VaG ^j2#(Q6"*r*&!i"$]0 k A]0ݺ4!>DZр/rz[IV-9~`qL45z]ECmdULDD](ՀOICVt^DA$"C V[+{$SL:Q 1hG 5M|CF^kʇZx3UAPi/  n҄di=ۊ~i+zd%C6@>k\OX["d>Еq]iB6gx;iذ%
+gd9 $*MM//uxUakfR2ȕ\o`*X( 0,OƤAq.<1*; O[T{j8lQƒ .3&Ba:A8/ W=hS g
+Zr-s.j)kjTAAdGO۸7`pHGܤM$Հ!o
+ju~X G(ZFixX ZEui2`y/7eZ{~dUbk"UWYse]-5 ?H 0 M((#DDYa< c0EPۯez`]Q`%y$4)l Vnb:36z&O3#dd
+dw6Mf_=8=M4<d3 Ypn j\ [ebۯ8
+'?nulֻh?‹Do.̴.V{df]%{j â'^@-Uquj' /
+mBS )`Bmh!1RcӒeYu߷dIֹz%!v]iu pd0!L̐$̯ۚ>? ӷmHozޯ'|%:WS 8#^87Ѐ`SӏT]=r{L&u~C*gN{i%8 dp?3 x \aheeh jOy`~RMOU!KrUh>Du38lj,J0pzT~ޡ{&`jmյk˦t˸("R(HɼX&QoAqq˓2,ah6EeX=7eNަ ;63e0uOɧ4]jnH"QRĀvߌ帶la,/1 G#Œaܔ>ehi3~1k<ʞ1tȧiPQ'5D^LRMl)l8q(˛G| 0#xeX
+%h>鵐ifqfb5\Éߊys&``1k{ڦ4vTᢁ/AɩYL"2B5=+ v:̂*;\q`r!=\= ycʚqOZO:ᢉ/),duPbM97Fz\Wjz{Be7&H΋ ( un̬uyP>8Z?]'[E(fjY1)QUoh"^jN^l^$oGs4o-Ҁ28>u9Ƚyhlu^sKO3;(jzIyD. As\5KT1E
+]QI%d@ [[ߎA;.}߆w[|pRB\G;A-٤}SKUT*K0)!D=
+Ӽgwo2oM{ ireӇŢ#3PS
+ }fj;8wym>3tE`uÅzA
+1*S]SwB?6o?>Oo~~ZJ^]rrj[Eۛb.A\Ԓwͽ xYbN8ww`{-CplInF'LǬ/F>-/,zTB^O>{.V~1vtnYHI׽{Bc{C: >gώP:}$%_z^US~nˢeϪq%kҔIe?R˒6^L|,Oxri' ޥ^y/ >9
+R7
+EUne2^dQDLr9I[M#D%@P؆~?VN8 o @A$o @ (pM@/6,qkًxդfu㍼*d %vk\Cn\ӂ9Xgh ?)lń(9
+R7DkPPqKf9T$Y?. c(w 5A3xی{6gsv` ;llHklԪa *,ђY.I38aOr
+6q[ͷOG$$_py"!hgT6! !E f_+Rl.[buũ@36.}"~'>]W6SL
+ 1f񌒢Su<*qOhfuqi6gAm8%h?w=
+?N٭<T3TTNؔfWZi[y噡rx ((xJ !x$)ef55M>s׏oPʝ~w8 JW14Gu'C0VЮ#ԫ%JFWV]
+& 7Ym((C U5XB~dgr[7h~ }hč87w*A?:Lڞ64^or]҆Xѝ&jL/RiYvCA)Tu6Ae}
+{48=?pkbPVg(3]BGiK{hnzicgXeTCP T!١} փNt[>59w#;vމ)/)+F $ev+Ӥ(󻒔.RPtSj]Τ
+eGrJc(D 5f&P}j-~&swl&n.Yh)YQtвE~Nkbr[iWra;=VCjRic.TڄjP E &P)46_.K{OkVW<>D:Ewa>r:lHd(qm6r[uKT[|ks+AutpP.0Vhaf' ,լR:!]: sep1"@L)FK%tەYݑ@ 29!kZb.zۖ7.nޭY["B>ߝ1cEGC z)?"WWc{5: DUՄ/
+jDA?iW7lZ7ʷ;[%NJd&Dr'IY\hR60r-ʺ6WC`}UI$P,1oDAÖ/V:eņ-`,oY/ݱ)|! 1iTܽشDιt^73h0!-/]6(֣5~c#턉ӗR05nl:CLy! a1Q_sOq!)%5#03g!0̃T2^6:ע4C_XW L: ip=<U_Aޝ[TX+jJrK&x?<pjxrY
+F֠uF51xn]!L03cy8Z,vcApB^GubϜ>'>sCa@Ci4kP z#T=
+|GF1<SJ^R0!Y@*'Ve.a
+f»3aC6b@ F Lrp`EeR+)1h"0Alq<T;K?CLESTZ8q]41( n oo>dl2.b" >c @gaЫ\BXK&=ה%?}*_Ŗ͐iŢIbhX<" JFA0(&~> C e Cfpc/شLVbJ-?k.A7_"NDˊǣ%cƒ1;;AͲ^bYgT2Cb!,OK= yЫ7DvZC&3O&L%Hq1|4JYqZy->i':OJ|C> 1d#LĐ3ѫorٔTÛcM'M$cؚr]0IU=uf# ȮZT!΢<0ZOsjӞqkuQj-"eA` @XB$d%!@VI %$lj@AA VG;ߙuzݼ</W-D 4P Ƒ- aXkSҞdh[djZ "Ox ɤ+3 -:]VlW1UV[TPQ-h%B
+o𘷢ϛNb
+ eRYD^Z?D^).uZB5yh5K/X 6CcuwC-j`]A@=HwKYL#IbdSjOl?9-;r6M֜o ,Bf!::o X {7$pȃpZQOZIwd4Oc
+,մs{.`p4b+6#1K=ĮԠZD =ˠiE~P? OyN9WzJLJ{+m:%:'lJVf\[j32JmF) `j/zhٽ :p(XҔxD;lN/UgRX'72vusUUU&[bXMU6cUb@{ųw@44r +,vRLS}b>٦$DbRfw9WiQ^cUT-U3f5URmJ*0P 5ṗƝK@ޱ C?
+ ;61|3$-!xUF1x&(bJfX,tf(FނOg
+sjlV^h3ksZo 5p wl\ٰ٥\빽{Ǖ;nEGu?&S>|Sv/%V})$;͚F.MeםuEmvC'hQCݢYаsh],^trx77n97Lw@,Ddu,B %k{=eե:uS.uܥʐt*ڿB۷/7&V,tOmx} o*<^DAxbyލ0>P,8OkĸDT6.HO:{9F#OV{xAW~%=3ϭ/?ulmWۂ%/=J=:U|?HdeP2<ELpY?h1} ־Fo/>дpy7g3w{j<Umv?6TXq*6;ϸAJS+$<u #j6r`D 3,opHOm\ekİ~' gg=`O?H'O޽P{\3A+E%,a\^~l\f/Zvllk sip9*XU,_Æ۩#߇EcDǧM'%HNIx+\̣$l/ptl%17~K^} 1dN<<yk g:ӧwG3/?_͂UVVY
+Q:j8@ϙΔZtV[p
+
+J,ʒ,$@DL$ QU"{A(" "Z3ynt;b7i\B+11쥂txNE%!fZs=ycȑvi@~Zj^֬̆M$k ەA>d8⇃ȀX <&(Gdl1?Ƞʨ13?3vjjqBn8J:j`G'`21| ;7`&oPh1G a}C )ȁedD#O/6 P{]䈪F (䠀Kc.#K<xz0C |s
+ B 9t ;{p?*NN& n
+nlw p?8_QC<
+Lq;FVk)+>eRƜ%Y8ωgz4Q0kMa?M47q1콌!} Xu;1pC:b`!7Ey!%x„LiRK33oT-"֋2$+Ill2_
+N*1hb d| Q&O%xΗL(Ɠ+jU) QS4w75}M{Ҁ6D6%h'h ĈADA pm|("F-lTže 'Z88kaVmFwII7
+i~~~}FY;A2 Πq@PB ^WfΔT! sF.JsѯzJrИk8W\+e^_4 1b ,oB! APw}A"NUqSJxBrR9aC۴s%Ime]+nnYfSV)) !cHɽ_oCP% I/ ֔J zP*5aniԚ>Z*|a98fkz.7q{ʹ=O@dA (F0aDY0H R'uJP
+ ;-ִWSXmzNf+2~D]nt1k%~fo2 0~Py]܊?K
+ՉLMeQkj\rU[kתKmVHaыLzqWb1CO@s0
+&߷uasQOԑLe-ZyUqR+
+Ygԕ[j2ZkkU6NQt.bA&b#VgL{BPz7CF7}V3GvHwVeU+mŲ.5[4my6kR-4UN<Weqhwwϝ}򯈀+N
+R9(1BN7׆K/vouQ{87#Ng&eTd֦T7&t6%e6$gեdפf RyC4%ІT!KOJѿ5h:.qƳ#^؉a`o t=\Eˢ IW㊅ 1ŷc &WJU HGІ7XjMv@o\ԙsy(`;0Q\~S\~r]Ji(*J( V!諍.9U0 4\Q,x\6\MPi PSϯF,~î)Ӂ o[#d^ΙKii7Oĵ%Gd ˪m"Vàp*lHU2\](+;_"n.P- ТKWX_izhV_FZ+ǨbV o ,)7&D.~ Ҳ唎{kbF,WZv,Ոɀ6d W6@ݾMЮ)a`cmYms͸;<'z<'InjL Esĥ~$BђfX G8V̩+2HA:hk{dv̍+I?U\4P|eۺ`o.z+'?C'~|*l*c215`#Mef&>#rH|jx>A2 91PRo<݂x.NW@Ʋ5΅ʃvz!0$lŜ KHH"N_Ԥy=Hzg04Ay,Ey٬,G} "}bg}OXeeK'!vD _0Yǩo"ȋąs^kJ86׍z99`t2~@2ȓCByvK߿靐E?)ԯ&X׺5\L^sv:F"ed? ƿK \⇻)t{]ue5yn4nq2ueI 1@&d tGeɍRR؞Z`nvb, S!O"
+Hu rK}*e:.װ~vxcOѥ$Z"oieLMoʲ@[ F{^ ؙΜ.zD{@,D۵rZ ?8rD݁A bfL6lL0V;f`Kdp3%
+,=j] bOrT!H4dT2-pSbj
+LDFr$j@#H$C!ױAU&46Aw'(vGUNkp+o5SB!JbD}ӃP*CD}qIE3 aQ*qGt7Z#`&gV[VpV0wEJz@٦ }}/DІ.ݐr%`U 0j(6
+pUa/S 1f-u%o/&|E@j R|iA
+~9_y" -c>CzϐBT0Bh2@EjpB e(;`uzP/R e@SWI-A+vw>o/e<{g@|˚]b={ǖ lMi2
+݀xr 9{"=qH{\v[laSBzYF
+Hz1|`D>e1̦X 5Q5P7y
+G,`Ow& iנ8 `ڹ} 3 ѻkJ&DD0 GMIT: wc;rjޑnct3:S ])lG en G `2w, oo~g1Ag[$KiPyRT'5kkCWlǷiY<V*ݙ,m
+ ^S uẀ- wR۽CWa#A&RXoH0HeNNZ-D[CWӌxPnrln6ۮ$ti.B S@޽ w',_V)޷aB<V33N"&iB<0]nMfS.kA,|w6-"hW; P{+$w
+h Vo 7m؉=O;~1#+ 4R)i$D},1pTPj:«dZLf"gԋ Q^'r财g}6pPq2 r=Y`<MVggv8< ܁?
+ȸZ+Q'5
+EaNsDfELƪ4eiwjisZڂvJХK4z[pQC 8me.[Zuxˍ2ߏ2Y|A!,֪5H(,_[VEh6)-FnPZ3mZgo+ȿ S{ڻ3gV4wnKW޹p}J زc4ZqmːTJoD|D]ni[Ū;IzIbLJɊ6@PCɐūSk<+nװuaNJƋ[qR(X<c(YuDY2 \3x:ej w-f@ӂv(ݑ֦ug5Y2l+T/.zએ{O;ۗ_߷.lwi .",d>jl|(9Uѱrfr% 503o':M,s&[W8nR)UK]^6a֖ 6X~%dgEl|AWIg)E
+ b K1F|q B̳(V=1mxCY0;̂c&εk\,č `rlLjxcWʴ|Yu6NQaK:|a6.ݮX:ҝbMf*7CIC<\:W{}w/<ص
+á.r=3'CM*${yC
+8HA6 MPnK|
+g#/ HB5]…eE*Lo@C^Ti<N?"1,Va;V>&f|U7h
+cP2A J$7?OCj!L0lSAG~DuAYgV\7?QtR6?I:?K 94d0 \`Qr$TOCl6Vh%<XȪV´a=}NUm3|ۣm׾mY~2h;ٗwX&94,5+bu֦MZI(VQ0qQj塰D>o eLpq__ӫڣI7?k
+ezvA;{ೀMyKPa,`Bхߠ>  b'iݑ/f F}KF-%:v22vfAi:Oǡs=_H`0Z:*J?,m: 20% qqChmݨ6foT?'j݆49u NU<*А^ _b`406YAP24]f2e\w|D x~j&TxXp%=6s@4j rѐǓ
+) [`bc1` i,p<f;/_
+|A;sT!5஘I 7X- eI$->CX?\Ij(cO3 4#76N0 Zd{߽\ml׷m#šC.9 !ƶ˜LV]Q[j6,KeDŽ =<Àd0 x9h@ZjKf{p?pjw˓S?+<ڕߡcSX8Z-PKj~!Bl0{R2Y:=,VGr=/mDP\s`z[k sBfjv,t^<{ j]7wZu@E מVET$xb%Rν)S $"B˸D5ŕhڷxHGz,߾ோ;^5YovYcS%]7+Îj~jrXUPPl,S.)Du2qrgH\&餢aH8, DO7"@@*,XSiy}-z.h umǟѨ1yHJ%e+f% b~jږʑ!K餈tXHFy1_d 9i9%FWa`FN֏oU6>\w1ҧ"6TU"Oe!<32%Q*f<%Ii#b|TȖ 8)GjD́dtm-,_tmkŃ]_t_w]|`eDAmLpfV"tnKR%q)yI㲇%dՈznLHK
+B@
+6X
+T#$Jđ%"\hrLǟ7J#rn<[%
+tYk24cGfMcݬ?Q }#ف!'Gz6⼆pq^o 7}:Y0y!`XNKg j,eUL9or^!p]/?4$BQ.X=㴞0&+Am;2]>0GzbL;Z hk
+.,* l!!!{ I 7kKGwKU#-X+:uA=zL[8
+B|潚|w]=hil*5{.]0wp3GN RqU"֘[>
+@qH*tA<ֆE<"\q+: }ѡ@9FQ_^$W)jmHQ`Reg |2 2$S cA3-qΈ&"Q5 uven .EW\AG%wA}(hi0u^BӸf#B#lX fF@>> a@TNq Gq2͓$ߡ(2)*%`8z dE!; qL.}6D
+Ru t:3ALd> 1y
+J ' JCʀÄF KTaP-!DXK/ldAV'ɺ.g Ivg|[xbd=xM4d'ѡ`1IgB'^
+tNf@x&v.Ywg!>Y
+A1(Iy -|v{8TgP^RWhʟk4Owyw:?.<C>)4½a#*}P23L}*QhAd$?ҵj}jzoW ˦QӅQ9g0"7x&XśU@|e渱jGʰs)wtuV+neEc88ᑾx_~aKyrpf.l=tГ|{]Ċ:&N'ؐ=ա#1+mWU]GF&K_
+n[nZd(0[mmECSC-_zl/yAo"ؔ-Y#zY[|%+p2\+9TcqK?gK:-;,J/Y_8Z4h 8NJ),9yL~#d+ȷ.ͱLlK2ȟ9( vmpo]_JSMk{As_%Q{k7%γfGpYeM>'( dȾWOz4̣a[4;Yp؛=n[m .ѕ++ۗn)ztAGd9׉+eU|Yy+׾ʾݮ~.'0FfQC5&2%?1Ad袻[~mC?h9|{ɉǪ]]mK:j\]Etm_Wly8yƟ8H%CESf_˖889v!5dl!ҴeFiK4L^XYA@3AZ6]MDj+.;fw9&G7%ƞgTF.8M<m^?7Ogg99v:>$,
+%tIIlb樒I^֥N{:+vxof:4 kRe i"anH^lYXVt/#\Ԉ 5=/%z*"9z&,9j649j>$)j%=֓0{"_B4{YS.uEp@
+k%Y5_qOfKf|Pw .F
+&BWLxYN\;.v%
+#<{+UͤHߴzrLNM~jK
+ODdg%222YI„)x䇑 ~d7*a:<:~7ǎ.DDaDrxY~nSћjᮽ&ʷmZ_s2P"wZ~ܙ *d 8ᇧOq#Rgy)~[&<pH, ' +2Ui! {Tanޮ#;ڭ5]T8<.)Je
+sC9ᬼ&3#/8g:"$s&,4c66K]`)KW[
+(ݾ=oZmbܦӖ u151$<,+)W[.ܿx&, ̙ce͇/b3]^6H<}_v.WgA7;=4iq^b7&g2J؞uC=ٞ5sSe!~ LQ !^0ZE&<AtA6J#ʯM7޳ɼ?)[ K ~Zmm=Lko]'./1=^ˁJT*-xVGmTEbTm&W=Փ*6VL~^t{!V~g_[oSoCo}۞~M'.!0 2v MiPR
+*GUIEWSc~Gm3tpPPPPqW'æOO?Z?
+*2~Z'Dw 
+ V渶(.@ B
+Qb؁ʹ'8 3VCX|#⌀.`]OW+N~n5|w<> `A O_B'=q
+QvGlYMtBt"s+]*W5Fh+ !:i__#;?=G+b `>7ҁO=3@$fAb"h%[WWGmtp:f}6
+S g8@> JdHJ[Q+<: D3q,]bk,d;2{!8?Ds3듀UHXAPAK
+},N&-*unH2 _x+lƴEwÆ؃Q7Q9/9}pŀw3Wq>&!?{ԯZ{d>@V#֊ArArUU=,7J$6^Z^%s^[%*7!q+C;Q 8/DN&A-d_Ɠ|Ň-֑{@w. …lٲt[R["WQT;KRgIO{[7c! qe#C1$WLhb-
+#G4g _4egy?YH_κs[+▲%kҞ+o.J{IEeW@ܩj$>đ|)֑6UTN-g7G8/yZ\ИNn}%7,ܫQ=V!Jy27ңv[V-@g_Bidg'=6M%sz_e_- ~6K]nt^7
+r 9戞;O?O9$w&8|[ٮ]ٖ2h[ͩ㲦ԷƴwI dgQ@zlZhRjwZOkCf>VEuv$ٳ!}*$\KlWv#Ir8}`ZjMk귚}#ꆵVE}Ƹ|{[)!yDmH@6o<l&} ԭmݣFyN$,P}U.+*wWdS6g4e6d\Kٙ٫NQdsqYUDH$[G dΥ‘2VrG6O]m5n6;^.{vW6g?h䷙6
+[
++eyU; jks?լ}0RiN0-1VU0.{$mJ l޲T͡ p<߽Vԫ{58xthWflYWf6nIY\#-lTWO0vZn|Z^03 iMqTU?(˷y{)L|28k݃(7x_h {YGՌF6Z
+Ě*yeNfSkʦԒ4Sb:ST41L a&.&{S͠|>rǔmݭ%"J};uʍbBf\.1M),,ոLZ^ُĀ>ӐX:)(UƔLV&Bٜ3(CU沧iFuh:'ʿ۝j[W[Ģx=rzSS
+nW&./fkIiViqUX٬5X9SY׺-CuyTe4\ѪuMBXEA
+REAPAܵEܗ#n=3v
+cNUԞ,gg|~zy}?ѐf͂1=ŧoA4ӵV+ok2?mW{$QRYk+;.b}˶S"{qIyy%w,>{I@m˶\6E~у*!ݮ3FtmuM原Tյh'ly}OqOj# Ǭ;&a)*>K_X?+w᜜}md}=@V^`O2w  Y٧DN6 u1ֳ.3&sՒ"/jT6慮;TnuÛf=,=sӪo2/ UYeCswFRևD"_IUǧ M%S,\RU\,=㰽CQ>wݩy'G,iY5-yc\vSѬc{SkRNo / Æ/?R>*FGRGCo#zTFtb=tG_]ҡkT%^ 1MmDd+/d/>08g6;>'^:1U>>f6#9(TѰ臝Dw]۽j/qTyÈM{\]ۑފ_q3m,k |VS\1s6zڌ1יӣ vyŴ#>3D]!h`?Utr뮈ӖO}[8:>˼&<ت};hVFByCx]DFvAu:yDgD7#jnfʯӖ"kNkzżr =ZkCO]JOxVcz>Fȵ=U͊t2T8w(C@u752ω.4>/N͈V/y/eTFWfɯfOxdחa3/N׷!oc.܂M |{FD7$/!5Z!Dul+Xvv'_=7-)_3{p~jZxY4C
+UClw~d5IJAlbY?hGXaD|K#Q;#JÎ7n:Z(3
+BHc?d`l.ATVK\_0l_Lj*P5˿C)<?gD(5E@SÝ 
+X."[$X
+Ϙ LGb3Prh-Orzż#Q(L(?&|X2$B9A9@A˷A,
+I|Kdckf.0EBc<M|=HU`J'W›'
+Rx,Q[9B6'2qc =/JGp  P'D@~&P,6:KȋYfσe
+
+;A2BY !"8@"nd3DL@IlEv{uDP3\jv KS_! X
+@H +5<B69XC'
++ab2,1m k rỜVКKiN'Խ#מC~ <WCV7>EpVCԿ.4YEjE( "A% #@#r A("HM׫XVG+VWZ]gߝ/g|g]ך$i VcjD0!D
+hzG[Cq n@=_\r}As}F}
+ns[
+ϫAy9*Φ9|f9DY@DB(KD*׌F!.mz<vli'k?~1KwZlDi&xb6S a [nb<$^@`1— x!JsC)W<GnznO1y5euz믬+[oz|} >?2a4;Na1vk
+ZC狰oR # ~H{/px*ٽ_
+LJjٰb׻ͷ=o:~y_#!|\qw| $|ÃQ>P@)wusW`Qn2#5hyR/ף5n3Q-߇/5uM 
+N :!x\$hB6&P(APo8.S3)mOEHd`\iXf6iK'Ed Rtv阽';' :>|$l*@zg!U 4S
+\g [ͨ.Ǭ="w99)xOHKU|%i t D0^y(ewE&:bh F 0$@@)=Į%Ωs?A şS~+[ovlLqɥgr"2.GR<G>IZYEࡄc|;+#vl6Knsc$SA
+j)0@7b-ǮȳCcSSfz3%쥓a㹱.#->J ;,3*o&e=d}06ߐp]PW%n 8r r`d0q-=-@Ѝ}M>*g./.q<JάjkFQQI>L'꒮O+IX") ]E7!=*nFgfONTF*=ERώ\>fP陕}z;D/*'Dˡ9a~5i(akRe
+-D}/
+=˷Duz|o.5-Bg7߿f6x@ wqo]GSI:mu~<YSѪ[xU0'k,Tu!THR}Rlu:@BL tOKA7*,Еy8>nG߶a6޲z1hQoge!̩R^[.*KחkUM/+(L U~P^^Z6j`0pXWwT hu:yMt52-&bEKh}]m[UM6]e_Q*P+K+njQ@ɵgCe"y;B
+Ht@ĖZYpـp{C |i/CC._-+aNn݉[S;mŴݭՌV"0G<E
+osM8"XQ4=Ej9Ba7jO3>)js23^;B|3$toL>,u'{RFj+E^O?dr7 N07]X!@*Bw]Ad Bc _ݤt{+<sA!(sX亄#qΒѤQaN:8?&l
+C DaI)TeZ=zSm:g\jj=.Z7w:V2ֱ. VD ױ ·߹?>k/7ZT_ks76mDna-r[;~cx|D_|J>KˎEћԂEG->v8T)Nв@]n|;)T{s%35q0Ͷm@yW5;dd&GyS-<D6z<m5򩊐ꈲWζ7V%}0֨jfe|CqH߱H'DjdV&ZrR@𢙝~4Ej~"tK\/v.dwf7DǤkr{<sHLISPԺh`S={lV"ZvЗ;x~&u+*.;ˣ]>vc_֍Yco,dYbjmt"\8\ۅHMkD Ds;^ ,4㹼~ocd 8= TxV{ .\;vhH5mL¯.CwC׏ma3>^gsX~G[BQ(e>*  MCraxayFc xGaw$xKp' l`3vog&_$*BM# |Ʉ@CBZ(( *.\,\ xH` X&c ࠇW!fpU3+l?D"
+C =q?/8T 籎簝'c??g5|M˾Erb(xS(b
+DZDhĒT /j!8K"f5SdZm$=m2]
+{
+-HEbfy"z} ];ҏ|!iү 9ꏨbD2wa1xd]
+B,#dX,T<Ii b@oi^;oTo"q P#F¶
+n e@t 1W͈<Y0*Y-CSph( {r!{Y<q6GOgYI-Gdn[/<a˂;g3&YHeϖrȗpp2.VO)RlOshpVWCKrޑGbf蟳b_{=SWdVH<U6@ud eD*%d*=' Uxx^h_IcpM+c/]khoR'/%vR?T١iC{$hBgX8$^LUp60,yߜ멚xmF^,]}*\{ʳ?J<S%鴳Nح98mus:04:a]CxvC_7rX lי@x10S=J>1Ҵʀ﫧4OmbEۄ?+[+M:VHiPv}>dj3q]3r57`g0o/iK9<r]QMgy%D
+*22XPHTAD @(Jޔ
+
+|&t3I l}#fr+Ȧ0k4f,9nD$s& J{j<b1=V7j=`~fYGj>UwQ1k n$o<.x:rVȖQF"vIv$5
+Jst0k울 NeNEOU{JX( Z
+
+
+/
+Es
+!Bh`/ {o.
+c2{WTKEV}9{[I rU:]M/6 %}_7[͖7[|ĒC_dD[ :U7JHu!ܪ5*5L
+Xp;O눠kXMaщԭq-5ǷUWFRW%TVzeRkYE;')O'̝{/!s[Y)(J"j& pk0hkZ1i8f .ZU*+{H˔Ԥj<|/_|b +.1]$[=gp{W#vVvYB{>bc'ٸQ9jU#'!@jYR.:S%񫚙'+|*'88|"*;R%S"h5[KLqf`34&w3T1Lz-#6-.Y(l5+ȼ&WdC#- n
+Va#FpV#ZX+*_ͿE{Wp ``
+fjvg:`Kږ:duȎ1{\E+WwA'@?@ίXΟH m
+!;O}}'~$~0Ofh#v^R+uBW e{; F;m_ x(6Q}اD֍"j)]5GPps`|(|H?-"")bϏ߈5X/v~nH>6J-߳* .C4'DD8?(
+
+ А:H>0ZArCOY
+yJLX R`Ev%,M4/q-T{cDAD 38Ӆ<Ajt"@4э$H%ΊB+gljٛ?-Q
+=9ߧȓkpg.\3D\ $71# g1,e|/Ab|}~
+,*l!$Fbf/oIl ErhWvngGОc73G:([tph‘W!s-FQ^wM'b3͓ x 2ao2_MJv(X#0bWaxbhpl6wh2w# P1F o / ^"uCe#|=s0/ri#LlSʹts_&} w/p3 !*s}t$Kzxg[w1˗!v]ktC:szk[mmkWjkzV]gIV [Mt:\BO$ 5JbL+oJ,ICC)/VvY"ay:g [ܟvai ?zMx}->㡽.Cw&]mqm{w'♯E^d֬QSzɫly]jyh'P=9]}GK4wV{Ju#qg|&xBSFӉПHD1v( Cjxm<oeRkQx)*~/] {n0k'{\NbNSKНI:JsWǪm
+S;B!󳔄^|j,Qm~xpd鏟W^)T?L ^3Gw4s&seJA}"Cv󓛁ݐL^; Бn=*ő•Ie)O4\S3p\Cus[Н7mϮ2oScec/a}a^Y)},QCPӑNtċ.2 gKJO譬z`HpOU_w-oV߄m]aސSiY#bg<-i.A\D.EĢ\/+Tϳƃ1#[cty;- ;K|Gn)4K!k 6_lY9hM-%y;0^̂76o0`D K{~y1ϝw
+tTJѹ t(.S˶yF,_3bBЪaSC_2da䢢 w-87fܬW_!zfl:Ӌ2QPux9//etrL]췖e6լ--]Y~σdeyQs/<kXeoZ\?jˢ EM)Fd{#@p>#TFtfNLPɮ+( }߆}fDTDDYaVePYM*X&FM0.59Ѵ1ihKs޼[ą3r { ʏ2hnڒ۪1Sb_ǯ*Ҫ=RDna_Y9sMF"",MB0R߯iPQt &VX) wj+\ټwIl徼Tʜl~Yv<sQq;Gr/+}_~?#_ IQ(MC0
+`~'4T?PL)<
+2d<gnn(3[=蛚u?%k?9_r>)(NBQj&
+S(Xlaᮔ^;4>#80Pk
+w`1JD}P:}
+Q
+bJs
+kpooȱ>^AwP~1?O
+ro }bL x`B/Hb
+DPAd230 ",BK5ZWcM=hbY-b'su߻}9(zy'V&q_ Nq%]ev^Hihde-r8hQA:'hE
+g'\e
+/p@w$@/#@oZP/^z~>+]}A&ݙ;U'Eb;w>3_q)0JƧ(:@38]z~@Iw}҆<4
+ÍxAe
+AO)tX6ei<q}nYuN"[c])gd48楯erҺ䚴O2Ӿ[F yF2)3 3SQFFa텑
+p:z@QV́tڱJq
+UbM˖&YgZmڜzGMv+,OvK|<wUk%YY蘒m:ȣPR9HG$hi9eJK'-K0_Zn-̝eR87vgrU2\tE-rtd/$Q8P>ʟPj=VٵuZaIBC]U(ReS*,˶I+-K5;w01E]#.BdSc
+PFF 9Pg?\N
+(8g6NZ`jNmzN
+)JYYػہΞ;0}'MZB׋ǽ2-c$)nJjG%W?ō'=vpUB`J56<ցYki3d^S`gꪉ~E+߷bz + |NXc.tsȥձK,i)X,1$f=baoy-~KU^)5cFi(ޔmJצJGxiqoMnx$p̆; .X$lhIix^IUDnIcDܵZ"sVIdގ5^u+7r~v'l3`Jy
+ޝ,}`k~ I_Zȭusf털\;')Yh?P[xJ$  |s×jߢ7 A R7
+`LRʢܺKeM
+ "]`Ȭ3VVs͆v~YQaIH?+)/n(|+)1"4
+(2UXEj/-唞ה^dޗd3MD1AJ^W%fA=X4By#45Zѫ ޥ~E@C]S_kͭif!azSz;\Yu:\YHUITf"P _]Ax<K  sЊ3hA}`oڎ(2k{5ų-'Uk) i.gi,q@0)Li8/Jn-J&JGl!:O%<9<338߈g
+0ЏXF
+ځ <h#it|^w|1Γd d:f}dž,
+`Cz'f,@w
+;kW j0\Ž-nؾ$mˉuY [uMeW/ة)ZxM* u]xpNA{&q38;p;@57h~D@t[
+"* D(Į ŵ`Y#Q QcC ֛"9sp~;̼~߽3Hu1~}|8sȼ{¾gO
+ wN֟5'sv/3kcߦT"-mK@MCn*)\DZD؂I{OY2pmfl_
+Ohk+-^#o#n4¥fK`[7CwPOOg~<}>-,U)Q٬jifM~/-߿-4˩ŸS۟*p-lQ犓|P:
+l0Ԭ7m\keYb׭Vh %? Z+jslgXgzj~:J[EJ,6PnLW . )lڜk\]n^bԼfy\d\h,7W9
+eu-??;w
+WtX1QcJejtȴ*
+OY4KTh;7h.?~vP}^P}n#~zБ]N-:3.mKvʺ
+SvfU6zY_L.4W:~Frǜ !{vziBЏdO%⹷7ubM7gjHwP,,ΏL떢u͌lsdvq);|a\NwYo _G=97Y#Y.{{3~,K`E=^&W{^VocvJ4yRp }ب<Bcfdm.#"]EtɈzëғHP)`e8pv$p(xJO2'>R=9$A_ٍCf =s c;eH~kZLtNr"}zpppc-<wLxhI1kI91:oO˱ ڬd9ϗv#tȈF?4n!=yp
+Anɱ^.c ɱBOu;yfd8X2y?܁nI6`qY5kG/gK4!=i>4CJbe6%%ppj\&#}YI %)֘ꌉ!;_3T#R4b JIOde7 1P,,.V:,UHA@*`-k1Xb]QQD#UѱrԊ:k+ڙs@wŤ,F/(GFWύ8;jSxTQWc(a>_# }xk+$|dm8IZ%BN(If4-yYrR"!1ba\eLBUt|M,9"V6:p kv
+<rX`A'uH^4?Ut[df8#=U1Fc(}Z`h՜눔ŚBmHIFI']p> A>0^舶Kgųf] ޹>-)9;r=$eѹ~Ȝ9aّʰ4<MW32O//M触 TOv=~les۲sr)y@|
+qXP8QE$󊼤& g( X(Srmj&/Y]RYrH{:\v>$Khz: w=}lIV|(fYb.sFx <%!e3˦˂KQ~-'-Vy[M(Yc^IWؒSڎ]*lH!)6=g;ؖm^!I.I}*$BP# `hKWjlҪP3yU UeXxUYRzVnQyTWW+>j
+a^c{s2|s@鎭
+M
+mv0o E2
+N?!k
+n:-ZUC@(4nOyi<s P+p%<!_OEl s"6,qq U/`ŷVo!,!d| EƑiCRɇ5H6I#89C"?aC5{\UoE_f
+G#֌CcŚ(CXxB3 <=i,)A?p]Vk*Wpl'.}VwL.t??h8|kD_X2=/#q_=ݪ eU.T+qVUFtz;:qR݂6NlE#Ь% Z8; ?i;z&
+*U-])[kkݵMp={aj1drrr_w~ko7CfC $r"CkKGmoWkqKp/4 nRZ.GRZpP9E;}VC)g~֬(b}Bq}Lq==WΑHH둄CHW ׇG1
+} T{TDгD
+&tRݱp@Gt>ի/`wg[]6^g@ێ֬@wV?Ӓt3Fݼ^wKZVw#ơ#"$9p7
+ci`@J0C1)Q0󊸞<+ߝ[ВrE 9{NÈaޒWޕ m'2H1D>O1w
+A) iN3X&{m.,5V4
+ZE5=!8)Ae_HSGD瘃[xqz~\__
+rW6tBW;dB]aX0#ImX4ܗj(IqqJaR(w1} io{ 7,dP*=P艁|v*ϓAx,}k!;Z+Ըif<$1-%6QnFw1s?FߋVq#:(0v2۵rnխ2utHyK6qwuU]&ۺ cc;0cۈ`7γqGv#M
+(q]ՠƂADET,NPXh{,G$1qu]{Xۏ{@xgygΑڛ%_>`Q2l]f(2C/)멷4y赌A.| b38~Z9P rxë;<+"Q1ír\\p4éUp,2!9V3yLYǻH?RO VF*gS݀cju#`WDak261ZCcIڲ*K%\@]+!=bԝC݉Eݸr6ԯ_ȠAV
+.2i.'WG ƙ5H?2|B>N"u9RkC:k%2SVo>~CG7A8RWm!
+GzjXjMf|tX@Tjds"@# ~I p'4q7F \hK_hZG9&ۇGx}Lԙ0&He%rM8O_ŠS 8tZ%#R9SThgG8A'5qU˲h%|:bN+qJ'98̃UYê
+4jpHՀ&|W2cjAxQeNW^/'7~}6}pV7lGX3`?`8nsWu2:AC=84aT9F@YBz7ˈn.yJ\C;N;tQwðԹGT{$aL敃*|Tx{JHfKi
+IA3!!Z=k, `;孁Pg} lʎcPR(bdl HVJ
+{Kھ>XX?
+#e&5E\F3+Pydvf>6#hE ()Tm(O|ǧJx bca@OdFwƒ0XiQGdcNR̎LNNγ]mMV71.!Fh*a`+"}ccbuX2qH &̏(͍͎)K#"q4!SR4VhuGEyafav .D&葨((("0 ̌ (qh]\Q0.cMh4rZ=&Ic\kmm&A;8}}yIirjIjI4j{'JxU?3~F[6a>(ѠԦ*CPnH t$=WV^PVOW5MߡYgMYHc֋*^TZRES.qaQؑlZVudD9TfCi*LiPlJN]Y(_Yeƕjq&˸KΘqZqC&#CT ҏ}mf`69x%RuԘTfbK0ʬcQbBA<!?;Ek͔:92)϶-5Jeh^1۵ifNoPjM5g*ԛDeITr,ځVq#SüTpM9:ۆ
+cӱ1W;$9J͎\yaVUz:uUM66vUP-Ee ^zo!c.*ZzR,U#/o4Xs`rI,鐥9 ʄ<j~vu|M\IrY@PT<xʟ1.'`!<NQ@X#$ &]0 id!e$rقry|I"d2xjvYߨfS*1 >>dbJxyhI%){rs
+ ~u@7hYGo ڥŠ$;Fc@G8;#\<өG]
+ <M hw=n];G;65+P`0^ہN``~ jCp(C!EAeaqC1}C"? 6je6րv1.Ao8]@8B{|a#hB>n~psynu󘈿+27ԝXg&Qs459=@{?0# pZM3lF{p3,?gyٟ!a{(pm>/д.d/`=fC70ԧ'J"H5K\~¿ƍ b^?EnD|B]k4RCIX=
+(z%-BR&kOm?rw޸p0>&?<a;QWw}I~%(Ӌ\C 9YMFM^"ċ XdOeD$H$'NJH#I3YOZ+'qpwS! "A$!%$X,"KIYIp mw`7 pwp:=L QC@E8& x:pS8Vg'y},qgp*q3|˙z:t̅o d,J͹"ZQUx.ik9W vn|S8<F8YvEyq^ ] [Q@PNAc9V؅v9vZe9 'xbzV,xhĚX4Sg:i$f:}Emdg}?<=?5T-u'@DOk%k)"d>62j4hGLAIþxq1GxPR*Ǎ+GsMԝPS20l<@?F-5Aո޸5ZxWXwq+0"<⢤MT8UK<yX>Ʊs qW\ %uW7hZpYӉQ\ňv ¸C8? ΍3n&<ĉIdGoN~
+^?`ST!|:lG<vq2k p>0V#ӝ84ߛш3۱j웹 Cv`p>ݳ10v%%U'8V? _LHjȹ{<3&̬)8>'$r&cp{T`: 5cgP'vö~ak?|^ .l
+>/څCք|/@܎FcyG9
+Xn}+Ra%=W.H Ƅ'NQ?RjjWr^\ Ekp4riӊ 2)I~<'yNGWJVRn0͐/BBl4ԉC6 rUe8T.j* w4eߓ(N*;ST<Uڍfրg_&k t3m6:2BСŘ&r4sHpbF66IUN¸Q.3TJ3jJ2qo؍5vߕ U~J*ٟD2j^
+sXnHNs\bZ8Lەb~MO馏[Kդ*,U&5Sl#5/Gi763+w.֧< 9SG%չMEe^P/8bInuKŹmranbݪX-4y3>u˯lU' j^,^h71nFȘyP"\ֹ-B-΂d,NJ`/(
+bAAdHyղ֯dۆ4fi,5L}2dZU%3_S11׫=W̽H;Xx:O#c㳪EpFIB81(rБ-6!Q"ګ{dwY>ey&& MCMZMZr4;ej\A+XEq 挄2r˲S/dSYlN)ݹINuVR55I4)I%)RCm|GiJ%i"ߋ
+U+Wg`/*!mMVXE] k#ݳFz}IEDŽdAyZ8Z1~SIOrYSZU!ϸ\R㻤Ž@H55 IFJd$LEb<[ðu ⽉f`ׂX.omBw{P ޻bh'bh*6FU {'Za'|/^@,%#k& jU8"W-EĪdĢn+ºKuG|qXYĖ,$&niTUk_p
+"$DԒPJ2UcLUjj:Jϕ:Gr#y<꒕Ȭ g*]FhI#tM#44B3`i M7-a *tfpY Sa*gC~mw@^dQbOE*<7Ps#)7Fay
+믐
+
+̟j_v;\y)`jcmAv3yf.fN5`={e!/b򥈥Rpq/R?- T@iڔʿ4A~kS>jmVҾU^#_WOjYQx?Vv&gR\)
+SM4PIYhx>]B IϕR)51JjIb۶21 oc
+ ĚzrjE oTK;$]++>v۽ c~ǏZZ}-ͥbb
+)O</~vVW%qmwڡkڧ:G6|"gֿl"\N:u[זjD+D1x4bj6plVcwvR+4gSX> ίu/`@hȉ+f7r
+N!Mhon6\[b6R\wϑc*=Vc=?jCZyF+n{>@<iGK iO)rN϶
+זѻZ.GZzִrZ3]+}fk}Ϯb?jԿVr(E h!¤ϣxzήA{ցgկ6h*kux/{*0LFkYljZ1IZ+'B[0xԼk }P~+OQ
+B_Hg3s9|/>X$E ҐcU8E5IsT@U-wdґ
+G@2#Xa:Ŏ;BGYn;[ycq9.YK$_mqg.j]L,kc acSUU
+TE<',ݩӣgFsQ3Lw[,q+'+yN+fNj?g8IK+MuJ,Ty]̈Qif3ȝ;KnEFk\mǽvo[Vr_\GF9ƱlMԀxꉧ,'r`fE8;J9SU3GK= qɔϛ\o@^o1Mfg<`9={4cVy+󱕒c}fCV?8+/n-xBRgT7\c_-or}'w*Q?_n0#b&w[I^+Z\xm&}$=o%PF</ot ]̂eR
+d)=WZX)#H
+̈́.sAx>0 7f|>xhA,BeVVQ2#*RzTVj|&)ԥ`-
+V(!x lc 4o2cؒbی-͸"ۈ+c/bO~o&j`<HiX1JEӕP ZJU|([C
+Jņn3ڍ١Y3l1tzJٓЂR}eeWJ>C5o(]k(FӜUʥWj֪"ͬFnԴnM=ɵ(zۚ\16&gJm<h|Pu
+ߋ^TB:^ZVŲNoAȎΉXX. Ӱ
+ lPX&]ݹC;誎3~AWo5nlol$ϵYPFu+kYkf`WѿX5L"5k̮I288
+K2vWC3d//`N' @~:s5PBwK)wDҨipЂvq8'&#aˁeaR#$pKȵ*5o3s@;\'EQ?* E7p ~ۇ)=I=ӈ?5Jzz,0቙ٳK''x5Wh+-"lMgx4#JÞ̧<'9=?Wь 19 e2q8ρ
+U&. רk[mH}+iޯp# ;9<K2Mf]j>s!&E:TKXܗ.S p8.jkaR3нAWe4ހRbc‡/L>e~>g|A`fNmh5@8
+q P
+Fe;{v0-[nrt#Lqjh8Чm>GulꖀiEP0'oeX׈<qL/YY=-s\yLǿoΆ$@Ä!\0` cm 6laCH %9HPҜm%Ҵ94R4G֩iVȦ-4e/ Қ')'tpgSxx ƬZQN0]s?u] W4#={ԌOJ5*:t0#4qVN|H5*}\.I\\΋xN.y^s\٧'y
++9qJxpBq|N^3sqL͛yphyLο ` _ao'L1u4trX>?L0?gpjJU^lbPx;w@x#F7b;&"awQ\r㑗#G~-QXM7gQ;O-SQp2"G#q$*q`i9-2 v/kΘV#cak6X.#/a86`Cj~c>11_Cqy,$Ȱ31;VcJlYi$+6%90HAOPKL=PISA&ze?Z#tI %UoW9R2yWP~XaJy;RU496*pz9֧1ڌv d?}ѓݙCM7!Y'KG=2%|'>KL!rl/碗͙s1  ec [Do=9 V8PxWtS9ڕ{QNUy^ g#?¡3m>K,;&Ygɸl`\*cїyŸ_΂j
+([
+OaZ p6¥jJ4 ꚰ>ªzB$a-@Sf4(cCO# 1.aV-EWQ|řh/΃D*.m^4aS$E0 u3J$a"?JE>Nśi^t!:Q%,r\pVhЬEv6VZk`n&AaԾ& EQH5咸Oͫz4KI='=駛qfܚ%piQ)CSU6UhԕêӣAgF&}
+M05Ƭ\ U'*-XQnEeBZb;PY~%TIL({:ۢ&`aۊ^q5, Q[x2TYQX
+[P&C~[6
+A#c^dza0Vy#{2 6 i-aU-8YOiɞm@o>r:#w#K V5HA 5Їf$&"p|wHdꓰb | .&7P[M`븪oR#$32R$uHYjA\, iD"*cDAtH8MENLm]'{
+S3`VjeSˌ[ۑCh(u:.:.Xn0g<̙+[F_sa
+SyH1g`^.@Us$z 4fp'Eg 
+m=E'{xK4bX94s퉮j#MCd;srÎ]ر;ر;h(|Ful]pwr߇ {)5՜ ݌>4Ap&B4hΏ{Hc_N`G#I#ůKuX4`;1'-cٮqux-tɞ%CR[1Y~ւ}8694.HbU(Mm™&>v ~fتnc8!;ݪu.4@W 9| -Mywt{>Sӆ#I? {YrU
+n
+ۧ*oC{S1ڝ<A <8~ZgնZfV ղZnjMRuj?Sf9/Qb9j&-p-Q;]T-Ԉɏ>eo{g)Q~hAN^Z0UiEUUnE&herU|w+Wrm]w?<5nk0I!vßWÕ_n/*}cJ;U *4X;<1*J,{T\,POfӌov?)E]C)!*mU2a.mTAE5k)7Vy~7L9ɚ?^3kz7P
+ج%E҈ CE#\ 06C9,{rhaVᮚɑJ쭉}5 5D㢒46jR'ktQ@#bjxFOCcNjH, Q-נ\ZZ#mPGjRRc<5>_b5&.R)qo%jd%ŧix|4,ޤ5^JأNh`'P-?<*?we1 $
+boeȜ6RpeE+#=ItsjLJ26(\MG'qA;Nw(4bS:F @QU<Cql6)c22PzfLJ5MT%eU ř4lWy4ɼK`nkBC&0#Oa4Â`0eIFsf{Ȑ㣤@%VBnrc59/YyɛMDK&XZaYpY) _+4ϡ\qh\CR,r()J<zn?e&{)_* ӤIXtEXs4:M
+Yjm5ں]#
+~B:wh^0JVE7Q)ٓ1jZM(TD‹5dJ"Z%),-SHiJTjPFCCڞ
+)iluO
+M y"ujM穀5Zzaqiȥg7`xa naw4'?P_\c
+z  a:̂`&h65z=}oÔx$}L_6op9o@ ` DA
+dca~P:۱߄V_?4z"J"<}t K=|YxC?KWL|Y[0Ϛ2cAدj~|ʴ SټT?QJ z9">uqN ?%wŗ̺75f/NLN>V 1,vb{%Ө;[|;xR><Z7tHCu8
+#>prWJU}s_DщTMNΨ@Ə7𣋼:~ŏZu[8}D|E Bm'|.85go-/(t"шZ:s_lخ|l6bsll29=قldsۮ"G'#$:D b]Pr\l.`w,$
+ϓTVWUD̮r]9 ];A1B9 (hr4*Ѩf,Ry ZDd+G#r"pvrԾѿ+`ܵ^ Gk4:ıT-TiL\Yn0˰/
+ŪIW=f8%K(-޲Z<.z*<tU bee6Z,l:M񔊧#|
+ğbFkգ(ǠYgI[LwU]V tTvniNb[a[ѶA6vר ꬟RmvBCYcbAL7c~اz<(m;pפQgm%muvZZhG}F~'&=US]g<][Q49ܠy ; ߫ZUS=8RhmȢ
+`騥N:)C{B*su 9 enpS?uBX!'Dk;4(>ֺ"tQޓDY3%R=V
+=xz1{GN]a92k=c`~53tRLrH[(m $`H#Ϸ\_!9
+}ue1ӿH4)$(~I$ =5XE_Z#_t ^}Wt,RT$k$S @:;I Th$9")Obp/ yvOL\Mb&&+#rrC|ǥĠp!ҮZjBVCq$Y!6BLaCSl aTdo1'"lgqHLݢէ9(Ji+"J_1uBp:ع DSbsMa}aܰnBywx fkf?T#VJ٭aH=Aa+\89JI_4)ҟMDZYXI׃(ORS_US[Ƕ\[U\=%=@vP5,O8"Y=%]6mzI0H_)K0l>.wR )ZL-vj5!/Cp'V54Xք,(z۩g C|D' z "9&5xZpT% -vz'57` BcㆎS}&Tyi0(:5 : HtRwKc)j<)^xrS긭Mz[95YiGcݲ9S OkI7e.5ӍB 2{2ceey(Kk]XXXv]`9DPEEE-}3Ѫ68ƨǚ&5UcըʹMG϶&iLL9l?qg~e}yG㣍 Y&FaV[O?r&4ݑ Cƹߢԩ~?p
+x6Otk?Sn)qG>H^WBԟqsϨسu8Mhl6uF*ާ<k1N161){:&2lQ|#&x!MgM:c w/wEcj/vwzYΗ:Irq\.+ v*
+aڃI$bNgkbw%[z\h3n6i#7PP]I4ou.w:h?K.vi
+4jИTmnq<Me>_x y-5+8{wn}W0zh%KdhVWfvWc!޽LӺR8MI~Tc&X[Us<1=/gjjb(Gˋla5øph
+B48)J^K<YMv)'9_eT(3VΔiHgf&SJ^@%wM.rdžP2(b 4@nQ.[lL͔3#Gj2R˕Nc [\Y(9yY(1iWS}Jjnts\N-کr>@);҃i Vgd(͑TG9du(9YgdrF wAF2:)SB}ځγ$:P^ ,g3_Yٲ5(ۢt%ggWk̮*\Jp5fuoQeEຬ(]EgS WgђL1P%P
+-ZE'̃>8dY]p9dj FEvǮ"!fRzD1j56$HӚ1ZsL5Gڴ4uSv~LLJ=}}}J,}Zҗe-=/kMي\!iZP[OhgJ(<E{,#K!ʨ4+iS3EL8#+W]EJrdsZW,͊wXfQ\g.s%k=~FG!":P ePidzUF38dw $ٌ4Y!J0FbW1U5劫Ƨؚve<HyEg
+_+TtuPX\~ ZpA xA{ ]36:<RJ 3HYLZe5Pw*ʛHoy $ R^Ɔp`}t
+V@L8GTKC3N1ϊPX1}\~u?Mg3g!0C1Ü`v.tޗTgYb3g`6Ffc!"
+2A]ؕKpS9 (b ljP!ݟ+ap:+5 pH>?ct$`]9sMxB@w~DŽ q`
+a2B5X
+?>Ǐ?Y>c2D|oI9d 88>//w@<)3̤NL ?>ď0՝
+D:\fkmt*t3zs<l`ۉmgbI
+R K9Һ`6o֓ultj 3I{nYа1f;L5bJqaxE:d'ӁⲾu#zoБFBWAth !#ZхG'~,#O&ZDX\@m.6ns;wޯ]{dXN}v&Qhdk&Q,E*xШh!##|B,֣r/!4GZ-
+uT&bV&ֳndt
+)C
+Z2ш%TJ TO e?<q[Ƞ}ǸXƑ` "mּ6͍LC4+5F7:G1SUS112b}r.RulLTi*M0Wn/G$3[kK
+-Ɵ&XdWy͈Q2c$@Ֆ2UYԩ2a*,aJ4Kګʷ~|!{N`8NZu\>7]/Rk3ɰZ嶥jm\Lʤ"iʒUTZM8K[T`T}wj9ME$QnrvJˤ3i ƗR-gE)v8T:Lũ#5-u&0PiєA^MԬI_ ەO_ kx
+G҂Ҋ. `+ܔ9"T0k#Qi*7eyG(AuY`w]`e]]6xM0xD⠉hhԦ:M4=$ΤvI۴;^37{y{wiJ>SMM,)O"t]-)n~]6pDo}=׿%؃
+M|!.oNP9M1#U3&_,UVSSE嶶i] u.XwzHb=xpgيlAS!|(^UEUY\QYM29m^a,-<ٗоY.e|9)-0pvӍ*-M0 &]*pĪ̑,Wi*-5,TRŮ:&5UW27j{/h*u]9rFc3e.KFB|P e;GYli*.RQyVe(S^&OF{f)ӡQ]FV>L+y>FG
+}/P06Fk[yoHCY2uLRz` XmJ<q%(YI{J*6-h
+q]C&9x1~cI27e8c~!|D^ KKX}4Y+]$>#I̯e'{
+n2.SY4yy]C4b9eh'{̻Ja,#tZ\S Z!}5}L>U3 xG;h^ms{V3]8
+Je|INS4hTO[}?#ĞIybZg)W*7eƻjArz}}Fwㄧ ShGV4\ԭ~b&Tb n_}ث ѫmM-v,ϵ'`| />g,ƒ8B-^T*G_L|7{٢mӉ9:w [iɨ Fܤ`< W;k,ExNT2yg?fۈ_FtA7
+Z9#9NZ֓I:Y'
+\9yv2È?#KBh&t0U
+ 
+!:'}<_+Qˌ7ъFQ4$M,c]OxaYEVW^eN{{J;Q>!ctM:^FݏNtf6R;Iha:fmMEQڣ^C")RQXs<
+uM!}*FjT tj"W5=dƲ7k 7,jpV7PE,+s_ܴb%4J{JCvJ.Ym\)Weʘ&+W*ߩd~
+Z4ZHAD˜*@#S4hтk"6P:MAZ]ƴwRIJfa X<1ٔ0974dnҀ9~sb}kIieF˜, WrFAeY*]
+7(hߡ}
+Skj.7-}G\ܓ<:B %CYXc)O/;Qb-SOYrʫYVI6+^UrD~ǤZ[ث&xFNjr;^Ɋphƒ8$:j0.kQmRD5jq*P mZjj9Ffy|Bu|A5WU|
+deTTaԥOѠrcʉVV 0ˀo
+UNڟ` +/hנ]VG%KL*ʐ(SvM`&$&0 F)~0C0^eoC#Y;]#U bƒ g)4O$I-Y@Oqئ)X`]x)k
+Ә$yҫo3h$a
+<߅o79|NFb-COoc\#Wp9/|^u¹|<~KhM^#80lO1|e.c_ރw&2؉_3/^P'=C%i/pZO~|1!}
+"zARBLy,|>Osyx4c$csyy0;G{ W=hϳ<*wnY6e6NY]adZyN8K΋eT/·df }?edNaA{)tg"֣=Sqy9 ܯ3
+OTnawj~ m+'`6@;vahO0y$>f{;{n2ŵSϰހa<_֜B~c7EE]TK2/{]B?J5hgI8Zrs̜y)u&x"<参 ǃ-hQt1"Eo2KnB>@6X=GRff}6C<o'Gq։JekC}7Ƕa111-4+f:Ol# <+xr d8rD.w-
+2k9s9Y޵XENf';VR+ 8WY\Nco5RT
+>Kc@ ZbKI~hyYE6VhF~ , )Y}E SQiT]ILkiS;,>Dj+>V%%9ib"6N&!ˀXf2ez˪cU99Ty:;QޣeJZV2V˼jQAE-\RrU!u9Eqs mohn0*]7t ԵTiU)CjꔴXSҤZnicƄYEyj0*h|JTgX>E:'?'n݅=XK۳|ý49u_;-s)(WaQV+TѦhEJgάkpnr*[yZsrW^Ru pSngN5pwoc-u@[>C )VB.1WljtU(r+RW:긂
+ܫuonkUsJ5_#9ϫ}*s:Ļv|OA?tbqo&FxL
+y,j+P[ZޠMyu7)6U>(g9|'e="|Ruޜp
+9?ހڣس^V>7CPǵIrag+Z
+eʖʚpȒp1xiE%ɔL%I$1ILY( IpB'Po+h{$qh~\r߅uc H^"sʢ!Sʩ%)
+S jV `V4NaRRRl֝Iّ]hϠņd6h3
+ G@e"
+JGC))RZСPflikRATej~Nξ>e`.ɐц?:񣛜M'
+>=w$) t9Ïa|$љY;6f_)b 5خǶ&b{gbx O)5dt;mG/Q'*;)p XUf{&wѺИPn.NVjd ~E=Kx:\?דDtO`X >-`U2K@ +\gQQH/5?z ORz^Nl߰Ǩc~g;h$i= lYnl WP:l7`{'!n-n_%sŃtAzDwm_P|ت]>`tdJa7#u:IDQR-4,MGZYm
+*ϗ'';<wrݵrLRg 9<el2<?Q| lυk1 C@"S |^PP,wMy^C\*7Tof3eUYɾ7;*{Gޘ W!A yA-@A-TPC-J ӆ)1B&aa0LbZN0uȣj~@$_@uϝŃdSdʌ*#Uz$HRÔmTbt("I݉À)a%ى>A׃AA?L pew^g;n ,$$\ T
+D8V^Bq2ZN6#2Ң >q;9oyn'[鐫%g+{ ]Il%
+e VP!d"Z "8<<]LpUq-@ԉh
+c> ) $Uc֥ &Sa
+(Hw#)<as29C>q-JFP .~1͵~L{ MHi 4 -JG ll+@5c`*o >40E70cۭ +W/pdK,1!a7fF3bll m B&xjG؄
+ɷe
+ׁ)Vޒ)Vp˻K4w(_ BS4n;6Yas_"xPz^dt
+u|L/ANAù#$^{Yz<SU) [x30IPJ_e:F=3S?)(G, J.y_
+t0Pq5;@H1q(N{Q@S tOxZV1jTWSUE_m^\[Ɯ$- zlu 5O}8! d W!\TFlU"[yOdn8(GF>Ɵ9D!Mǧ);Lr+jOU,U*.V_ZUbRmP*Q!y7^'q~&>@^gUcS;Y))*wzT0TjĞb{*tT(Ѭ<grq+˹ZxJ~!ȗ| qm2˻[ U2O%${*vTS+Ky<Mu(]wX&ez:WgX>j-JsHOU/Zl( "Tr O%*HV^SSSI++5W0*7BMJ3:eK1VmlxRS4Na\ɑJb1ǐ' A9J@!%7=A9$e(ϗP&#}cr?8ʫ
+o6$,fwI6l~vIHBH&@J$
+$AkJJJRZjŢXZdZQt:0VvږaV;0/۽=s}o
+|ӷCyd}Ke+{y3݌slP⼫`M2|ey*(!Uh+ت`>9ò7RN-F 6`|KZi
+|A|lr :)wr(4KP
+Q~RpBpNˆ/B׏܆hDѲ!|PNc%|a#hpJF0ߕK<GrrG*TPV+*X瓀- c
+-[ 1!ʜޅJ
+qŴyּ# 36\/5Q%,iD e $~l6[)l&`,4o!$>2ꄯMS~w9Xeqrđ&fNjn q/X6,ao=puV?&kyGC&g3dL(9!Qj
+!#6ko,c\ɊA(fC~yCv&ړ{OK߹F*JyW=烀% qe#3pH\΀j<9y{@&/|N:gT "bc|'ku4Jg-_-__߃?[mrrz{ҿrGQ
+-@t%"}v̨N|StLF8$P3\PEM
+3l3ԑ)eX%x?<>j*
+
+-tL4&qXsh^x_xONjqJtR{L(P&˽v+p^Z!3Ne8qY Squ sa(C2M~]
+{mf{Lm5:'`6?)=|w|_APŎL籟.Li$_y=Bz?"kzDZ}p_!B<DKM`2:~b9^_#nrGL_Y^.=4.rى;vo'3xlly`<gu͑v*499T ?n#/[ne tLhl
+Fn$'Dh R-며U`Vf&&L{s(!lǰ]v[a`^LS7
+U;Mܧ,~x? ,<fﲸU`s%vX SjjcX~l?mnQpJU=ŵ[}mtڿ
+6Z0jTqlA!vݠg?#o^vP}TʠNAVQQf^\N\Z]guJËꘑ*F:tJ3Қpc?RlBMfbfsR0$<7Af5e%"H'#ݸ
+ԁ8cҕhC|E\
+;{Tn6ٻ4wX܍*ɝyyrgEo/(3?do%3$$`BH@ Ud(Q"EED
+TPM(Ȗ-Z""Kw;=4s3_sg}ߖ6(M@rAk&Ь%vJ^ ; KgM@ úZ|u9I<9v,}l+팸 O8:C_ mk<b$J.!)A-A&.~OHtOHZsѴѪŭ$NVi%M["VxsRܢx:{u>4 gqYBzt}N}.ѽzDEģgq%+ġ~ŢNy}d8/aKbrg*bNE}
+A3A "M~K[4[<~M [[%VA[rNj?]༆ey
+4JC96g! -dSCI23!rm3A{Z"%
+ESjhrٓ\gRGB %xPEWjI],-VI^T0 GFZќ^IRkA#VN,c.'ZϕW:g/\hL1$iRUkkuRG[bNڱEAΚh˺نTIn}Rɻ@S3$( 4[f\" h /\4DSGwΆ݊+yލCF3gDv6gTT a[>u 4UFhF4B@?hI| baX_MbHДt%0>BS .z$f*|ըj@8:FF0'YPyH`pΪ4M LH9:KFf T{|jHh#O
+6izEqe-Z^Yqխ暶U_WݱSv7٫w8vC 1r17~¤Snco5{gκos~?.x?.|EO<䩥˖xz3ϮZ k^Z~Ɨ7ymn߱s[{o{>Og𑯎~}Ϝ=ϟ.\JJ]IYWQdg+/RKrR+kAݔ7) nƃe-ʅpa2b"NLUV܉w+3~ܘP~< y G+K<Ô+/b:&e+8fMy[sP>| T}<:I?().^J>\ͻ%~__b2lvǣaO G8#1<\|LҚ7?3' t뮶;f[mq&O6}ƽfϝ7 [xe+.j[ȤƟILiLT*Nhj~o'G~83gϞ;w?]pƶehbm֮-;zW_5a3Жj꩛sӲZdOG. 54PCC 54PCC w +u%^]/9 _ԏ-~kwe ܝVOѢ'~HPG VFծ=Ͽ1}C&|ww>/n{y /Mٵzo.Ѳ{_d'װ6Rk]/޳̾{tt
+)Uka"a>W~ՓĢ ?J!&vezzc-̣>$CkSFkCe\ )j3J-)|ʉ鱶d(;nZs>w'C71}fDm<W,QduYկb Oi6 | :n\h[S<Fǯ%wE:!D|%KXu# ?װ
+}~ϴv|ʵM4Yg`&_`3Ȓ;
+TEr-ZFbJ_6P@
+J!Cճ'׏:ڴ^tSM_CƼDz1$$7M0-,6PXPjw摳Z_8l|rE:Nxc~T* v2pFB6Ŵ6 ޲ veF`5mgw8ȀŒ9[yވXDBGG<3))若[زl^ў=ǏSϞ)v{7wo82
+bpO8">X4 >J6 3O;F.^hW}F]υ
+{E"f(/c`4Ѭ7h^!}w>85KhʙHAΡ 5.-F\ |{Gq{im=/ZtUppdK*8+#KD0
+3
+םj^A\ˎ*$,!2.KGv[=ZP
+$A=]+#zw^ XaF*bZ*SRD &^\4h`C͏@v~'x<\վAGi]8^@(WI<}IXA-edYÍDVa( e Zg:8QCHz,I^PQ%xI-02,탡
+8g:
+ElA,DBHHB@¾- @%1, { E"
+ZD|>^‹w>LpP8:H"Ol@H4@D E> Eߧh x 3{ =p~@bIb)y`o%65~)
+}OztGr( yĆ_ x {L|@mT+5s7*Nȁ3GR]xڅ)|9x^d\ \dyb.pPdmkkm_
+b} \hXL35j1|%/h`?b!4У( ^@9 Sa6r%'Pb 5A(=)|FIS|F!'AcIn#V4jBkn    {C.bE aԞ=ag*"tVP*GhHLf)sUQ͚H%PY~5[y6V!zgkhpwK
+Ly}\DM3 3]WdkijJ$#d=U$yA
+7B-P%P_6`ׅ3$}N+5AIL62U<CTE.3Q*{Y37@9b*
+Cű-NV>ߊ=jVy& ޠe=<S%tX+gJyR3!鱿AbhvW<Z,2<_)*46%SK3J2x&a`8?A8ͮbK
+zE\ N^禗p$Fs %AAhSϷ zO}G-rc).&xũœBW>ή0ۯk@G
+*h\̰O^LA m(U42fwO'pxa0|YPa47(t%1 Ο;\0^vwvgԟg oB l;e^cdUd ~Pb07(PfG?^;87rzĸ~_|)8Wх5SSrITdC!b@ As/<qvqXMCARFӯTbkt-#sUV%U}8Y@@yd;fј/ Oy`Q\GgCٝ8 P&*)&bWl M@fv#b\MG6lO?w3.}CU(&:҇+au*mDYD+6ZQ(~ʌ&sPcP|M 3[ǿ3E͋KAIT` 9IK0s ^RE`J2_mM67nՁ/t]wI}YSԽtNxh*w ǼIHNd r0 #oH,BS}ĈA7ar>=s߼tD[gnyQAA$LN'3 c8FBm}.)u#=g4b4~noUc[Q8
+ |H{ȠLdT}ūoݸ\7gMӫ[e`Gp=ϡnO"@EdYs@\4yjlflV/o.=ٴBj:*n%}lNmg[SeJKn/T^P@QQQ@@PA/],YinmyRؽ
+e[
+C>yE@)H;a#ssEfKϖ?,?_V3|~lEfAx8䌃XH?B
+P+6/
+f^ Gp1~)$T1|RB.玦TMI千.YoA777SCkCɦC ?#4wPO?Nfo0qZbNYLn~(VbOKmkZeu8MB ̵Օ??#Ȏ,kNDs:#:'>V\9Oe t̚R2'L掞8Nhmנ镡1!?mb#~GPqEfV 7UO$K.R+ \f9\cLu%uMXyߪoNhkGWF 5Ak(9ԁZ$)93Ε4RfiNb]6*MZInAӉW2v -&Ġڷ6
+ cSΙ# ͺvUD֜Zא )F/
+(F;Lj!
+14!
+rfס^w Y]1|6QHUU5gvŹ=utsԚSͳe׈2xRKFEMP81H|
+$^y9h:жrL~`v@ (
+CA"f?O /8עгV:sMx #L]dƨӯӌy.Zrp_OF6ߙ a^ cP4#@94p`X(^<|ͳº<ضJsmxoƒkBi팄Á}C3ȞP'{$N}s]
+݅Tf V;pd}l Im t?n;$TǠC? E}e {,k |7(^^B|Xλ_+'QTyZs'1]%~"0]_,p / PX 
+T7P1!O I=;scPcƪQm%WY.(IM7ـ Ad|LgGX"nJVx+9J%rS}Zd5LV%THdHm/6%^AfdP] ={}-*[[|SJј*9(#6a"[R)|Υt9Xe*\of{{8 o@eЅ փos{Ȑ選 WtEi2ȕMe*icAfa<&ZOki*QCP:gZd`"<A72`/FL]8|ÖT4dHc`JBFF%%*Rmd`lʨkJFLa4g!MP }ޝnI#\IH(tSM@ ZE< Y_'lkWOn:JTKIIlP ,d.92h0u/}ݾ tZXiڐsMJLGk6WJX}"Pby Ѥw6[ ܺ:y{G=~bxHkQIqFډsB+GC+KUb9#2 SڲuAd; ޺ܗ<ruzDXbbuȳd53MĎJ}X[SLP-i. ^7:gzdCz_-?Zs-wyޘ
+ 0oC츚P%R_;!Ȋ]D YKlCɔh$-q6ଜ@e>/zn߽ʯ'mytSqф̚t^s4{g%wQ5g,lmEڬJgd୛ m?gz݋NP*|3I;! RʼnC䖸 5mkey_goMi#֊NǺ_ъbZԊ"( D K! ـ
+z*)ShSes s
+)[+,vU%8Zyps T z;v6ُ.3 -#0l&. . x D ꞏ|ces`"5^Y{JOD'"E5 2p!8 ;B
+.I-
+vA@Dl 8p}!:.uXb,15(`ռbYȅK2Uw ׇ _ yC7^R@qX;
+BdIR&ԉqMYϢhc.ƓޜG{a87Nso5dX݋`J#o;A ccx⇿LNHV<OxF62GF_#yCaC[yh}!D?١u ( Kd&̒=KU'UQjx#$~Yx/h0_|%|@t)
+cuvu&ѤHom9v(8_-ͼB"ΆyPa)!fZ=p㭡є:
+2E)˖*kXF%Tƨo3M"ZWMM,S(C UKis໦z2*hgʌ0O֗e
+]k[F[ TNMAAg6W鮣//w ER $zGuY.-*\]YD i,Wy:3?i5z[&1T oeмg]l^um;8h=Co?P"ՖgWK$BQq#Pn f[~MxAb3Ԉnm#Ǯ F4i
+_(J'uq<,2ZVP\QJUd}=5@ !a ;DHDȎ VX Et>󞞹's1{.bXܛ|mz^y3-9D^鮒d L4T ~m8d{嘳@_h[;V'(PJIki)%F'\WTonuwWIeU'z+fjol/c}I6K m+ΨU\f\VnFeoÅwE*I> fh:֥ݰ˧֚.n&(袔[1Z(>D$h $k+{*%KGuS[o{d<5mq|셽qj??gpzB9(RF/oeV[׃ZE-M]5rI@.i' 7crk]:_Szp؜q봋sd 2hD Ӌ>n_ҧʫW\[1(\Ax*P& e~Qaўw5rr,` )||dh2e"1!>LpW1CBzmM><\( WyPzѿdf--hxomP1^R#g¦iIIVD6)/D~R:.rЬ,N/TV ֭],[y
+)u߃'/RBHoƒHgyQ0
+L=ED]
+DI(>݂]+Q[W_M[f1-cC\ÿDa)5:6`5\,+E$Eq$rV7z߂jZ'W ۄpN%4X`E3@D߅P Y &( Nv /Wm FI,ˣF9"/*J~ ?*\8 'C| X d}51RL܁i k|s'Z8B$1"۳ uod8:;r8 8DC+D8CN@;)/S~l ZCDݑA5"*{&#Ud8p@>3Nl ]80 {`ma CVsX@s`5Qd3c&?.n)TC*בֿ$\)/]N`,w[V6/SW1F@g JUTC4$"1 Bg $*AHP ' `jAj9H7Z $d;A, Q^jC>Ak6*8$l(|g<59jCo_j@nEDioK 0W, `{kX3_*yBJZJEZ n $/F.D>y;5?5HoCIH>,1Sd{jC<, 5ujS h5<:y)!j@Ky4@ݿ4$ig>3MM$" q:y;*CaӇ,.1ҽ?'qL.\|Q&$NzEseP ONM%O_P@<Ґ
+ FI%>aOЀ~9x,&i<4А͛lG68<d2K^QMk
+dV¾[6 ʺL:֐a)V+fęL{jGJ6;o TX
+ڣƹo.yMG`bF)B+DoS9&j+3%*MF̹gE [W>`H7K
+ANmtaLs)JM
+
+
+.QY2%Y")u"bb]
+q@$8@50Eڿp0̿bv9YCu7DrV,8dI6Rr<ĵH i(ߴ
+齒B  dW'`#g! ƽßo=UǹC;|{Z#"[o]MIjRE6') oTWV(VX5֝U[++h(\Aj|l>m/^7K>fs,ؐ'NYJdXʮK2_f dzh F<ߪ!zA=P4;A%r@Esw]kЙM? _p8#,-:Ym+jQYņ<YK G*hez}I$jp^ixo\GJ9t[ivO=W{y{7QUmqYd
+݄/4s
+b)R$Ī8V}pKsةU
+v|yl@jGr j`bCo+ o=]ޜ3a93WgC3"㧉1ԸkxI!/)uJTm sE7Cj?EXzf?l^s_);xًٳa'fKf`cfKʂCgy!$a~W}g{e(]P;# Q7la
+8
+` xd( yBr&gp>;~`}juBR*G!lu))6<קix A;/CԞPH i =H1= bPz\
+!: .񑈾7შQluXk@q
+,.`f@
+|W(mj$2_+ϒj= 7ewbʯt[bs{3ilE q`B3@{Cag0Iy&K<^RKe<"ywqEΤ*y{bVeumus]E.Iv 9Tҋt[@@\m5@; g5,zy C^p..蕒\Jy%`ܡ+8э|U|%ۤ;ԞޓU&?zY'qϙ@ZelyeHNι`^:V|`~yIϴn)0o$t9ͤh$j )Wr+qe)]bBȚړ]˲P2AzS
+<@%e׽+r*볢CR*Uq+RHs*riN9$XDe:5}km4dO[iAKFJyHu6(̌WˑJXUä+N/2XL<3fڡϡݕhZ-9А"Zy
+=VCM]j|bCڬ؄#ب3kel^P$-*U֬\9j40sf-EhU1
+g HG+@_7 Y@Y{Uz֧u>w[1,b]YHLelQuҬ`ZdY-IVQ¾guDY@< ␋
+_x:[9pˣ!5Q-e'&
+㤞-Pq$FDk
+(ܚ|9ǻenkxn1P` #|"Ȝ̍j]w{MEP[[L('1F:רgKjJPER+.4ŧ3M7XN-Kt_>kDP"ga^c'qqK>˞^=SgsוGŜ*OJ)*JS9ZSXW
+tr]:ǐ,ȣ+*,4EC>UuӜХKe"[
+IgMk@76޺|tŦڳ1ѥ|~y
+M_La˭LQM-àͥXL$}9UBȹn&;t$=)Y-0epD`anj{9vZkgoaGQudC g Kv1[F?!RS
+zdH4%Y0aN8u)H d9s8g[lIJŴ\u]I㚚G1hhjsP+]ռ\}xn~sDr^G{TAPI =uz:ڬ5>tk7ͤ﾿Mw/uk zDs7u#)y)6YAO9e;푷T֦P{@!AsSwZCRs?U O>Rj&;ߨ}M[Z
+W}^w76MUK,Ց=8RAbyڰsԁ ֫ uTqZV"D '(`A^Iyݿ20duQ琯UPi5w["I^OjfƵ<ɕawY9*y;zZ]k^wiT4لݔxwg 10dBVI۰ՙ!NG|=xa~iw\p7?W^)m,m*m+w4XƋk/ TA!GRpn .q.qst [q3c>VFn=RRL{ e"Ibw:C/8hΎCBh$3b\PpJx֮CyK2c~q_vdrT]ptInp<!IȍN0Y{،\1~dsRd }0b(|(ltT%44_+gY)FirM2!s:ω}
+ai&ܖImUlDZ1XKuZO;rpl@}v;nS0q)
+8NaZVha Ep6b)f1D̊pV qURV@f+_}냊5^Y z4[{།.N!nQ=A)Z64X=&cຄ
+/"˼6pͶBhrwr,"mگ78T:M Qm_aΆ& :Tqe_!l 8tC`d G-
+mPjbjRJTF\G
+/im>MKH{
+D6XkBA2]d (["O@~bN{@i 9Z F?x9 ϙac<M cy*K"ِ^r۬"/ccWȬ>iǩF9ݬۜ{1HH@?!i&Ri#g.Qi@sTnBz!<y1v> eJ ?Vެ#Cbhw/e=(}z,~L:%|HŞcdA@6}GnRŨj=˱j*n_J2}rcf32gҎ$MIٔqQ~7לG᜻ vfOJsE]Y*HPkPNaZnZweCI~T~%c"7*kHNT$Kc͢ܧEw/ sGxvt'g@B6$7ϰ&5oT#G:
+k0x QbF-&*E jQQDkbaĠ8?R9Q_3kỵ@` ܦO_,Z_t86]aɿe?'#a <RN`V0epIt&+٤FI7)DFP^2)$9enUH4 q!uL(n_َ+;WcT]vgGjx@c5FȢLGŦ 1RI
+.IN迈< Ed ^mdF1Pa]{f펎_.h"&% JL8YVE1F*dޑ YbS,A u-3АGrkuAK[~0zd{dڅ
+U{}.ο2HP%Gs%F( 1/SUJp `) FV"Ѐ̥ɑ+O湖vNYzrG}úMdGҩX\ʇ@.KX
+C, c L3EGDs#9hh>dëcV[L:<W޺^^r M&31\_.s)"$WBI) 2_F 0U8M_ "X =SvXkΛnky^ٖF+ukQEov1J̥
+)
+118)<^JH'HF'阵(|x'ȑ,Р+=t'nL}eYK^mwZ%.DR/XJVltKI*q$X- b3'a\tZ
+5@; A_m@%kPkj~CfeK0Jjn@A((g4:I?|kXyI*x $%Rtfffjj3Q*jS$bZ\uab'q(\} Tp0zSs( 2A hBmT‰c4탱!]~^qD:M"!#M)Xag
+'d&n,D#fa$ȋO0K!G>(B'j m6s+.\I9MD*9N` (7Fx!$fツ^
+'c-uh&W؁/1("B`p7Yke9⬐˶ETxATGLroc?KO~K RSS?{i_c#:u6ᐼJUOjoSp
+'r"Rqΐ1QcM#)'XkF/%mG{~B?d%KD.vX5u3Qi`slBE|q볢0H+z/}+K~?Hcd`v1n O ?dh=L-6kq=NƙLR
+=d,GJfb *`[%ƶh>U^ذl`=>ԧٝG0odg>$nޤ__I\2s)
+$Z-2dAC.q {'i:&C D,{ږ^;2(+r9gJ'
+*GUYs[eu-FvAdOse}N6V i(&A;}_;c䰛p­s}Vt*YIVe˯W6嵨~[TsdJiujejekq@H[2YD,%!iAGF>s:jh[i~W#J:Q#gW *J-eٍŻuMj*UgirYB?uz@Q5B];sk:
+*HDP]@?8*~Yѳ}ssv: {:,{~'ŠBzjZƲԨ3Y i%9ՙp0W(D/D)췉y@4!M?a{g6-—KR.~4qj4h^\:Y]_^+(.*N/gd)ŒԌ 񟱒@:mCySn~c+ǯx`q_8ΩZAd
+ёTaiEfFajŜ¾#E%/KiG $I;8-88 w>\/~e*=3rpAO^?۶[cK8!)LjFU^Y\Q/?//[>_LRZbٛ$8I rԫ⾶oý؁{q{nvh䘽a^k]gOhV0qјĴdL^M0TWõO5Ki1oxU+q@6\ET)I}QFˣ{*޴!ݖ17ݶa LjiO$3#>$Mr,ȅ#q)MU2Cu6d7m\N ;~8I j<z<!>TDfl\o,jo: {FeDzS{“zbb#; WקjHjNgv̦_ -8$t%diF4;$ݑFSh䑎T^Ŗ86_p& ׄ!q쁊D$߁!c`V761=/{5JqP)^^ >;JBf6gdtmB᱃F՜ACƾ,ǴPOhޝ6wBš(whñԉ9mb%~cPI _}8-ۤН <F=Q+߬O8)4miuy(<4' +d1*9s\\gh'ع_l{$2ZhBhFI+D>/οQKrk{5.T@%uR=w1щXE_R^K>KC  />/iE%FoZgaAլ HkU-ɫV"WCW9FHՔ}B[Z~Z/9})gOrveNfB82GuRbE| |#5lYwT [`wi} ӣ}x={ɏPcMeC0cy^a[I2ކP_B-7:=P&\hΆ80dWPh' bpN't<Pmu༮-t0y'I7V:VyD8t p|PG."IL0a<7y+Д_*bTmҷZAV (fMQ4L_nHt  #Dd\(YNm" In`! 2Q䬁"od `n2M&` Pԇͻ!+iC4+kBDud- _F(
+ TnR7X57Fp.0d!PF8;!\vj@ndʩXNNȫIC
+*Ȱw;9]笇ظm@X  o#D
+4/qN6KLM()|1L҃"_ǽ'=zC|KxEN
+i~ h/ykJ=@+H p }F@-afG^ANE;VG43%<9jS]CkwS΀ȟ
+4p1:?,y7s_pyP]yW~1GyFԦЎ'XGE6&Z,L( %;Hi{I 2+F,,jB&)
+nE>rSiT՟՟y z ߾C7u27ۉZ5/[|ٲ[WjʙN[QM*jmU-M-4cR<7U>42_%di>
+35LA,ty ]lrxOgwۂ_;CO=aCAֶ2fS<֨ThX%B}0/D=$קUR:U)?RHӎ1thk
+1P= f<^g̍Kv;φڻp;iSe #ݓ &ZJMr`:/2O_^*yNi7.*a^\W<ƴH=;af~.al̽s0W0}Wu8/l_t.ҳWl:j
+,0Et
+/usYq[[ 7sbMFuaӶ9Y k
+U E┆u9&NMit tIn3 .3^9w^SǰVՑ|פЭ37\X%XQ"L{~:ܮԶʬymdmC9TeZl7$chI-if+ qA3$MScCV{n Э _}#/zq|εIJŕJ*-A#HOr{kJxBrA7좑ܭt~NZn2I##rߒwYQ۞7<{<L Yȴ{x)}"I_DW%5&u}zR"Xp"]~$ҤGHsaF%z_ _r|2U^~AɃB%h`U,숋};&.v`o?O]GHO#'oLR9<|5bOrܬ W 7/򬳵b;6ItSh <eڵމ-N?#?Gk 9:"ݻv.: B!B^=)TLmMz0'r'LӧSHRmEӹbGtozK^șܹ35M᳝찹 v .5BAEB"DŽl Po B+Mg&<JhK=@±aI۬
+.BY
+^3C \?bY>.Ԉd#hݐky˰qooLlqd)jMlp-:2{-O)zIH8!J"HX>--t?x9g#0 ee:@i5 !e96̰p\C8hՇ" `Bʂ,R)!*Bk ;[s@\#/x7){4<ǃ.fqq!cBE1"ST,B%W"=U^jo3v+w)n࿡)
+>HmW] f{!և‡ T\cMPCj1de6C!>Q DHhu«)5QʤL 
+.HpAFڕLw8(XahS-^dltf',rw6&`FQ4%oL::!Az;׈Qɛo%Cҹ7I{-GK+ D4ȝP*yLa5%B )mP1oL6Ɍ=~iޫԆ&7rGQo1IyCWW/dclLg)BCBt!ő,:飔c}!"LPƷ:̚ bϱMr6s_`kcN8MEqkKXܪ {H @ b B-@"D@D
+A^VPֶ^u9ߞ3)1 ŌyD>$ < {>p}n0 1[ n32+$lw} b:XۯQ)GrU`0kq&LxO1 Q f#@O[ a#O}kTm=0}ډ}Bs"oףX}i$6hWѰV0+
+s~1e<c^{w;‡޶@2|)ҷld9\:زsW? mUwNxLyZe)~W#31ϫpݜvf'eaOγf_f<U-",@*2̏Azoh ;|g%ϋNo5z%EOHs ]:E\j1[&~77n6~kG@|m$D
+㐾^t hXݫ=)p~\i)m讱 H^eWB
+]Il. cd5Nĩ[x _/WJ~ eT!r 2=H@F:+C
+7gUTu|L)fxJ.ǽ']yAoV)D K1 ѕJi=,?',
+uҧXKStrGÐHS"2(Zl#76u{]v2ξַre~j>9XET2K^Q9A~E6fLH@S@V@((C^
+d!o5n3aNKǪ]/wt9Q~uqXN-Q1J8yj^NB03S?*?g$z$ {
+:G.5yionm>KWg(Kɔ4m#%']ƍϬfeiƴ$:7<-3.#%. lb$ zob0[=\&:7;/j;E W_v_U*є(ɧB-K^P•Djω^H;)ʋ*|˔|J d!"5.
+0idҌ,M6ɍOhoht#$1a-0 pF;0r]m3`fouw)^lw+{/J#E] J ˒B'Q:*(v#-3>xJ÷!a m
+
+|:a9z
+'\y0.+\2lZb憘gMOsN=ɪHӞK{*+y&O\0TAtLi/vNuĂ 7ucżsJ>?.\0s}Իym9,?-wnog\?]}oD|$u0R.`ḁS.͇=/4[/[$ɿ(*n)1wƎKNw=Rv<[
+b}_`߻FܽR|~vLU k,WTy|zߜ_);qc2i@Vs%dM}Q ỐOsڷYVp3? c> tF}i1\Ci`mrkU{*7iw<狹_(o3~n9h2m:oHXնf>L0
+NZ 4D#/C
++2TVkrRtLgve뢰%1Gz ;ryr)R~1)ܿ>YƪLa&KEļus->TC"{٘p#W7 ưnA:hO6zIw VzE':J <ZY$K_ɗ0!Nvq`Xan~na?C3/F4\U(|ɺrpz*у_Zo2}NfFxDkhS! Uu]"Lv/⓫ rA*fIvSHAy%<?\fg=0_#B'-͙:xwj6XԅG]; ÚcZ;z-/I"l[+cʼnnyd0VZTWTX7p^Mnz<';_"Q1* P E&|Iс˦nkaa_ Syk^icMCc 4o8D[*,cةEaIĢ9nb2'Efz)bJ?RDUp|M$TW<mՀ0ק&0wPjAbhqÙ%)^5>9U*%IeQ'Nt=h/L@
+TP![
+M1e?0Y~rD#CdUV&z 0_@]=hxVr⸁pD0`ƿޟ:esZdjJh*dAC1b)VO(P T{kn~x{oeFgC5='ݼios~)wC,D쏹k5t$9ǐ27zO17ml36E|blՋ6<ȕ~WNP0- 7HP5 #(^C}lgIqLO΅sd?8{ &`V`ǘ9f32g̠촋#:JR%n+Wq gC5(~/r!Z Ɯ% Ygf~,"/|&x6dtmGUnߣCnO6p`sY9P@ -HUY.B )RyLR7*71[hP),SOeNwen6sew,~^p\O;Cde.|-{
+5C^pZ>}w <H[_
+ְD{P9Jڍrw2Iu|u &9+m8)@ g)k
+ZH2E1ʴ J
+RV$4ePͦ24/-!E: >&ϵ|3So"j9O=w60G=/xߑI;vM +3 " D[1`@*&D3>+ߤL_$~YT|?V.z}nFs#b{=bwUywTyߥ7 Q> v&c a$7d;3,!7#ўL {g c NrPչ_Khȹ&v߅s1D <}Ip"Xˀ|ăs8Ép'4!ιtl2K %dsobɬ&?$3K/w)|*Ι=G :Pui㟈&LUw( dx CIb̀B R2
+{ƛ*WI5GneЌeJѢDNgN˽^w05@rp_Rhhɠj_Ȁ꘴?lww}Kop[b RH~6[EFVQlƯuNV+.Y*Ns:v(@Vo?,r=K%};;RC ˷W$VCؓ/M7&wУ(#Qo̩G06NX'3<Yc}"۾|sk}ٍE6d~ޯZz s)e/B;EÝ_g.`H"{dd:}e!uŌΑm3uQb0ReUqhE/ry 5u6rڥY=̾V>ZȖgaks&%C>_GT䷫I+&gRVRZfQ6Qmv>-"{9צU[^RZ*^Q$ސA.o9wGxS#VD5\j}\?!m,DPSO;!oQzR[3~:7SohUڻR]\Qo+/]%n.Y'k*ڤXUMYW0Y?U)aDm{gՕAP_&(TLf ֦CnAlMU``|wBmMIs2<;?n-_[])XSY/^],+oWԖ~*鏬(9]VrUQ.rՕT iiQohjl5M]_M:4:-p|澮
+f?pfތ=!)B3&w7- :íT~!3߷1 ײ~\btqjZVWdx,ҬdX]~at,^}w:}.();x{Br%FeTA:']Hx uE:L8˄M|j2$Z%&EŹ;itK+L)(I:Z㟘75Qp|o~ ^BD&}8jh]π4\nAG byэWYoP|&lmM95qU;U.pu<c{iG~[b.n..zS7dAWm(WI
+
+kmb>E !T*<M:P Pq` RGذst9$QF1_iF}  ٴ,hd~j*_վ5^\#UZ7WU\g&L匩_ߘ:Yl,y
+p@U/ɿ.?y !6>ք!>8^LI dlT,q*+N׶>~LW4Ӡg3s'|:Dx ꩻDa5`
+Ә+{XY2kY|uS}.?@O
+5ZJTP+Л^4#h=up,08XKt0Ļ75LU$;x #0%uj}4d/K P@領F)AWJ) (
+qz:O|I~`V=.h` t "7N qQTM ֆAH$2Ī3l5c ~[>`-c5Sfe~ #Ɯ}Ƃٽ
+
+ nOY xb - ;jp:DUʎ0\2ckY,ͦ&k\wUEbʊ:NFQ _r*(VP~[|(B0l5g>BU t]*щvutc%߱0Nkc,l 3R5n^Ԑb]P+uH<D5ZoaU0y,h*(Kt#+~U}ͫ
+_@&B/ncV}4I@Оn+@fwm!mѦ-IVҦ *ES\^R_ڋ/SPyҾ
+Nًo.3G\5RuZ;6'XTmڲ%ܦ*
+އӠ;dqf3Y7(lЃrfnEv8wu 9zkWHw{bJS:;s ݳ UWj7IKKPcʫX Z/%x& = p6&zaG5PjW:jL8r
+V.`j->d|&3e#30x=KvHU=ki;m_<e*դ-OزEme8i0,)<ۀC @-?+mZI`u'6@pqu|'QU޾Y'W. ȭX޳.$ܠN+ O)?/o Km
+M-2Tn
+>H[4@oƤ`GLspf=1Ze
+
+尢O\\DE
+u6~3p:7?M$!q6OFƒ5(n?`L<h;$g/坳'9}r羜)XLxs*}H3-)䩠Qa# {d_O4{`{95(g}/go
+[#|Yx
+CJdCJ,K!).R.>H_RT
+DQ!5({AW ie$J/wwT_ZIq<xuاB/Wk(%R"WKY{O#o T?1e(Q0dkP6 ;`͈"v&'3{@x1Z}&ej*BtB/SPTZ}.+m hDzW?䫿)*E2D
+Pcԃ
+:ȟ@=eOR
+G<zY([
+ҵПƃL##Z3p'S2'2h,ď,Q ;mu\ݾU{w+igaˣlnsۧ.eqhWD>F
+iՅg$Y(2my
+qAn$/I.ovɒkҳ{=Rd)=uMaNDJTĆj@ك`g>:kQ;kiZ2E]\PUnZV=CU`QJV$YNM.)g')v'(ds8]ٚ&3&I*`Fga4g˨}=@W:Eh[+WV(DVerی"ԒJiRqì5Mh'*o{DZŜb'z
+㬖u1D mRUjNaug}Pw5n|5s U3b7%zCt}v=7[*J5PjfqoEz S:BL6ψiO3ڐk6V*Y%]ֺ)s`7΁-Zòf&^l'~L !߽PvK'^e.=ӑ#Af'OЏl=R-4+Y֕mYdbkuf
+ǛCp+WC|;wTY,,33nNA _z |J>e|5r B<x GhfL{'0yZLA8 c<
+0~2$o򏁜a?O@ ([@z0F=7 30z ׋z9cQ- 7ö́1j5򄌑+)?W $ïK(ۍ(0`
+2=1 |f L<B_!3z3:B$ՔD(+;`.e 3eэ)߀z]" &DD,=q!^d1 !5.BCNMĴ[:8e1 OM[1
+,IK`btV`Y.u˻w52U&߽6]n|ѳMF<My~ozIfC޿Ʀ76# uAmaG-Ƽ\%9Zy%FjM0=favo}OOՀ)c>׬>~?l\Ȃ ah<N;: -4 ˘'כ [ 0X4[>a߿~}'l_o0'([wb+`50@hlFcYqeF9 3Й
+nn
++ogY^G-=w[k [?0^c_t-ě:aqFbe=-V؝՜vkNo o ;(61'ǖg;͑ض9
+|/=7SЅt>LCO!l/5ѓc;)մ31bGں=[n[cm\L_&X'\=* 1X
+ Fsr-PZvs-9!Ek)rkCFg\ktqC-sL_',IwK]uҿIoqɰ@p'؋iqꞀٳ
+*08LzпdcE0`
+;ej׻ȵe=nRq4ew8],X\iP%28Z2 XNvQSK髂X& Z:\Q-Qg9(J+FuiWIcn(YS
+X+
+8"8KlUk+.D:Zu}_Z?y}r?h<Ozwpf&p{|ΠeISaNJ >L1+'Ǫ$;LZ_3~Pec^:A?iÖ8g~&h;+Wƒ&^I>7AR9{u{d*`}¬4=f15x/j\jѫ;|v G X{EwϔLmn5l%$ ݓWoy?8lJeҁ529ega:__qڋQq=C89NwnXۚ]2xuj8QgCls4و<+al܃?/ b, q=0DGcr504/"~}Ts{re.r,EvܜGD7H}zQI;q-ri9Ѩ }>mmV ⭱5^tWtSYNq̟Xbߢm_6*m管;k莿+gs'
+d ;H΢l@@ѺEA0[TV%=вdKƠE4++JDuIU>%Kſ+
+T Oﳿ&3{_3[_ wE .R.uCKɗ"ۡrAWY E ] ombj/e?fSXhf? rh^U?mwfpػ>
+j'hjXU5@¨#񥤆5kxk ^]zB/Hf,d~Љٖ@ˀO&|P:t^;5o
+@] a\:$dwX<scϺW
+RJ<QI hB~l!u?B3LH{B̤) !mYp>:RpUu~ߜ%Hx]/dϦ{̽
+@!nӀ\!Cu~a/ZlEY`<7"{n\$n q͸Ah?J ŀ2EyuŹf)4S6b*B:Ul| 2ۚ0#Zŭ i4UT$wT9Si̴MuڴWUb*PԅJc~ 2W :b\Qq}nE%󖱢2YQjPYl:e^Ɯ>iNs8ar8.hvO820|aj|tmGF8BF"xY;ը&(n1PO|3Bq"zQt8/ǃKGhE2 jĪ}Eb'{c\jl!B!$K@$6Ibر@ 8X$vl'Y&vL=i&I:Mm433{y9^+b?uUL$L(8/~?b.JϤTJ> FI l
+|,Ki #ޖ_LAYB e"dDG_ŞvQe sIZOKB/yȝK3kFJ0}n3уL̽{T
+rr\9fW 9eAEEr5 z!֜l=+;ŝ\2S cr0GY)kXP!JEBl
+ӏJ!@xU&K>zpu6͘79o=Flc 61]ASF4[˩
+ʪnX;恸Jqʟp|&]ՇȗIz"CG/_p3u8mx 8لǚyRHG"^mQlFY]gTֵL}qq:46ZGHX#*qe_k%xa>}
+-Zeijg[nAYè>_b9Qe5^Rs|^b;Gxa}x&ּ+?1s [ܮhhw~{I6W*֕IvFVvǘ:˩
+zy{-ns[
+[gD<G(AxsB<!@x!=0
+A;=g% pd)^g/=vE' } /}J z:` ?78^`f
+T,||(I*r/+PNi#*&b3&[iRoCyة5A[Sxl8:80wp7zwa
+IV䔕J;eߊ+bop$rOT२]Q;v.z2,c)!+}s
+ wu콚/$'!
+aGJj#m yH[CC/lA޲ y_!"[{e_D}d{ 
+ͦIٴ66*TL';<wxPß-l ٦-/!9MJ%rhSa޷ q%Rճdo6z'D+7l9/6BBIhZ,=eB32X'(ar9!^H3DGzpts<l9a4 3F=@:^\'WmB
+鈛݄p#?(Iёe=>1E;w<;A&W E8>UQ1=H?y,NxdJ<2uQ-R.iOeEBvWjz/+/ x=K{+~rK NX2Z*L-!Kel%]ϒ%#/X
+|*
+})v\UlSl}Mbc#?4esZ 4tU\q/Q]}IEcdOΔﰦ)[+ZW(7[sUͪ #s5oPtU]*60>kt&T
+]dLk$d>=H(aAha^S}ZO#=vn4ݛjfWpj/s'Ϡ?FJ׀7GbCdr#H91Pf蛤^'Ygi3lz2 h8;8R}J_#6{܎
+|`BV `)-,5!Z>ʔULM7]?1nݗbWq\>r{c ;ғm|/#Y.h=?goÌX<5/e GAkТ!#@ Az@TBt]OZa]-3umn~L _|?~i扫t$))2k89ǹ0ՒJT2k7gk[=LڃYSL^&3iH$%QS{ Krٻ>5`:d1UKkR$iAzc~97⚣[XVu'4i^ԛ4#uNpK J?sYIjeC?14LӱظP\!?kԜsr2\ VAZwmꔌ5I^Z Iz-Y/(bkی8(bq1;¬Ay</,Ź9$9 RSv,3_nvI_^,י*) nZc:Ѹ#M&x`D1̧LڿbIcHQbQ` ,--),QLR}~,=?15/99UWH]k=OyƘT/6 *5 apݝ' 恥.8VrVbk}9%`* BfIH_PfZIWɖ09%[\KEuʘ-nE{# ;E<]UGQ(" ed\gSVkzer9*aGF4*CD)⤊EĊxLūr*q*/,ۤ_[^v-,-*TP[
+m t3
+sk]C[WQTYR3YsWZא眧'J#onX
+PBEE(z<(O=޷z]ɸ-w "N
+z%qx:)$D-"d% d+APg?u1q
+xk%w~AE?4tN"|G҉Xy8&>y;uvQ ?
+~ZC j]FҊ6\lU~\_qQBYOU"1J F* !zR}/&4
+O?$[FM|@380J]b^q!ވ,fM\2]WʶUqKiB}YHҤ_%o5OW̸񢔐O%RkL!jy{Io$('ClH&$%IfQmNpM<Cc6̔6$4f&,'OK!O83\P($>$2BZ
+P )Ҟs=n#ڌ2tŪh1hNMaf3sRNaC1,36
+K5e0j*`
+G11E٫`
+rٲWZPėX}5 + .ka][׫m]NVM_jUTXE gܤ:![G-^]4:u&rDiי; ^Q%k}j_ooUwj,\ub3^wY Gr`C3}Qye1LȸfnowKlE~F/zGn)\)\*ܮ6,x2Js KtNRS*4~$'j+텒x|Q䋃7q2 t7畖Kr!Yw]Q{;TiޣTďQV"_ <3:S P4vNO~%npUFQ9FXҘlRir* J$?IRF*ErVe*IXPT!*E9!{:;)`Tҝui />aB0H1șldBLf(5\ZO N$I2Cp0]<^PU T$
+QSo&7h"i4L#UOs: {\?a0G!=p:c 066)a ~nL>\yTƟ3,
+ʦ0 '-Dk$F5O465"eE 8Hpj%&*.TӨ(1>
+&y{E
+9^٬IθI&9]hBm^]u KY+ǢVwdX'!-'Y00g#YT:Gaf)r
+/lV&TƜҘXe\*T%R=PC_7f1&yeVr dia=H>}BR8Ο,$}oɽX{c?&ؾc~RĬvywR@Դ`5GQk׋WI%0PCi4K+MA/@t Cc4b嘆HG;rX/usRغv)XHk}/q ;z8x@Mi3_pz"©G3*ViDhe
+B*"r8*Ǣk$T͆U[U}V<B@_.S}YԞqp
+5Qod%00o6 r'Է%\:+2Avk<]SʄeUe]#9K@U{!my`<5X:xk7
+fRg>u p6Q)\s;SU[whWp}+\D ZBӅ9 H^!M?Ө3m&SǎXC56sjnݸX|8%:Uj- @oX ^zXHo2L77Z3X Ȧ
+󸮥F5*phf,Nc<Gia& UnOG;<#pW
+ .+mWs)hQ窏pJ'T98QuKpHnu5uد9:P#"uO
+v"©A;*<h?p{
+p-/ XbEw(Ke*\y>'Y@*o1zuAS;hvcGbl ^;CQ T6`sQl
+n?Jp!! "',Y<8}hHBmcj"G:r<QQʣ>Ħ lZDB4zT픊51n(T{GUHOic{WT^o}kd4hg7Pih2X8 PbxņiuBT#'Ib9/a2a"axFq-ENcEv:Y=k=ן@|U߶^pĦXcBIXcզQ74QZek!0}$-3-rPe*S,1mU,65*N*$Pf)盅"JCơqs5>}{`%v,iȵ2j/e[&IK-Ŗ兖 y%[a)-%yjťeyޙ{D K] qDpFf`fD
+5.Kq-5zXTkĜ4mz5m<96ij4Iۓd
+qJ4u4]R՟+ ozWryjH"> |zemA6G#ulI1kLslJFɄU&3-X,VUZMI[a(wcm<+1Vl y+6"SH"?7wg:xuH?6#<MXmE%4X2EZ
+S,7{2
+ۼZ[b~^*6o]BeKa?LK^Ze}%s4kahEI٦*t۲mPj+KlbͫqֵRul:lsm/ԬkCzu]˸9Dq-빮l-#QW
+eʔ$#JLHY"8Xr]+~)W$/U~Q)ʅpEy'<[!܃Yż1t7|ۊQBRu&T@j:\L5IRԀXݭRYVxO^YՐLܢߗuJ@o/K} J#Pdc:9pHG#KPX&.q5َ,Gjo2;uq.,q3l>P/^0GO4l^\NGV G3
+w><\$丌X]9bCJLWcqҦ6H&gltҥ^եOuo4gH꣰+y|'{X[rzTB^i$1qO➉ŞdyRaX,|!S$.TFO&ͽNkpoRrFIII>KB^ޠgS@-H zdW BVHX+' ; <)XTeʆUVU(ebNL,n{OKqޫ)ڸʐ6'.S8\>84ʕ] \n
+Dh9YВSG|kwqlCyeÆo$O^17x Ұ,\p9bu,ǙU85|z6S 9G#qGF^Qߠ1] sh!ȓx吻|!+ȍpy~.)DpM1lt-C[ :jtmD6toO$xm}qoc<6WL7OfRߛ
+]&s6L*gsf2ϴaR4{bW*UY[Q?kP7S+}]s_\uS^})ZO.;v{{bs%}4h1' >VlDoj|P[*BoηUX3P>G\=X6rޏb|Y,yP<\{-]~tS\ `<Wl?Mza?Tӡψ*? *ұ/~jR̯B(oJwE}bA]iYb~<@}6/Gd&8o;蛦
+1YV%nPGQo(D1 rq)jwgeg#߫v,vFqXLl
+G5]SD2X{sI,βoWLj9.]Þ7$L%a#!1p%`4kNl<!\*jbYҘKj EsE>y!E_H^X<j#5Y% `Jc/bS`H D[ZӅ(RAc-"UbuBǤ+RpR9_Pp| l6
+ iG}dc͝>
+1cx@k[Hb[fB+:q#1&.헥{Rh2q<3I+s#kvxa>Y=DlvBP&-~,"d%ĞXVjI 5bԴc1ZiCvZ3\o1\r{y{lb>Kz 4&Vq.]#4"!RhX0&>'dӀ~M}̽5G%]3G%>4G%VhdeT>`
+ 38E<gTJ&;iHbR48%LSh@jT6Q}Ҧ+:mҲ+3m),)tUShShdArCc#˰
+ώS
+˙МSPE9kS+c͹,2L/RXݲ|އB}0 f8*]A
+, V@a Zƨe|,3mIU7"ue<-\Ga<X|"i z˗ЗQbjP"M1+X aFJԵC]J}U"ϲ(y {Hkr)Osy)/Sf9Cy9~#ǒr*az.nc[5(Xhda V>cFgWA+%r:!-;klql}Q3dcMW2UP
+#[yL@^RE7_W?7Hq؃R)`+5okTg/S |!adg,@PՑXuw\ xº2s/)kS
+܍>iޖloaHa1~R=Ci}_CP o,^Ç<OXI-A GhFoz<^ÒsdwT2GvNI8Eag0?:Ǚg
+hrM@-H| -/:'֣?<!9׉sE %o*q|` N3 sѼ&'gSy\1)OIԾUCl'F h§pĨ}j0,]o9-4^W B-I |rvw뇮;y:\XJgp _۪p{f遭=5b0 )T@638=/0qLY0rC9+ln׿(O=ҏwvWrnǥ= #`<L7 2a!/c'Dc=Pڦ[uPts3?vVFk "`<g::Ih;eEEh*֯`MbFݤur[׈><ŕldllj֟%hMFg&9GEq\#dG(+t|+e`؛=vEHrsh@:st4CjQNFi-9c<uj5Y#
+ Էcbz;#w!`sqQDʪo1G'8N!#ZkuX9zZ{KBASy[x݈:5ud]hA>֋]DNg:ЙCGaoA:N:K(gJm5b>i-mP՝ U|ǴUl';cWC(<DlvvڽZndm ѡPVbU;U&wܭuZ;rrG*u6PS<B+
+Z皠nZ6_+T[JU^bZ-8UקtykşVۓVɵ׈`z-wV6zkuFXvQ%ݧh -NT-Β'_>NzM=~WO2|u{7W
+h- ZE%Hy!@$
+6g-=Xaڌ
+pŸQ ?|mX
+o^:"YDX\f!U<ຒX`d?|lΞH)EkӰ:;9:rLh)GCN9u]Q-\ʰQjIY̡TP/*IT80Tf?گ>8b팣E5yhV-O j Q`e<y [v&*w _4#2]Y&H4cO79rZM;렂Ʊ _39j&c6.N:tpQæ_/'EYQZ' ̆wd%["G+ ?Xu ;i& }60(Ӱ9lT4
+a+,ƕ(5`1h(.z^ɊLC2iTVh#HEc[LyB~'Z$[s8ܦIpf
+bLa5eXX0QRBq*[`4(0zOd:yc/"ɴfIJG=L+s3Y&Pa0JR si:K0PTf̊ʽЗ?]yX}"z\loTBe(me-rA/{"z`-]c,Mb{,KQhO|+UA[YJ*WC][:l1pYUD+~g9 ۀ}M.G}\fN*KqC0TGB_]"hj!&y5*P9P:+ZlW3 tu WH=*gDjUO!wIBFs/QwZǀ'Ɇ5y0(Ȑ_{8CAGL V;V߈
+bc'..v7u7Rj<xdL{}h?o?pl  3`!3npHB\}C~F
+daC88M/#<hFXHL0oM /s+<^f 9ZF!00g~?lJ2Ǜфm(/QpaAF{|gn8N_Ifs g&EMN8/%6Ifs _eKY`9ϓɗ[3M?j8bNS,돚Ԝq-.#²bGw2) &8oM-^|x~wͺI3sGԍM}c_3IB>#%L-[Jpmcr60%&^JI$"|HL8x˥^ȩI @@
+WțO!S\Qs2s fNKƟ/~lQ@RfV_ǻe}ǛN؃>%qαRgrragaoj^ԓ24jZ}\ q>)tvpgp//^_ğYopjG708=]O͙xԓ3I<87+]Jjbf@FRcn)C\vV{k4Wy? C~9wyD)B8%3/ DQU^jM]c:ut='ye&I-`S<m^i:?_ |px\LމR윤B=Vt8ǃN2tT9%h]g}w6vc>Gch"x^Qy1H}^Y:9?"
+5f4`Up>V.X6!QҌ%!X50<_EugxG|Lw
+d*g> Iǚl)X>#"BTGP\,SEsajTϭCFTmCyTG@Y̋ Qo
+O}؂ձ!|u iKd煕Q~X=u1cQl2jPkDe qN̏,Q⟠Hn (D
+•>.SL >{Hh%kS'F$ $Ơ\*C4 z$d(OB܉(L\|2dp:F87`O9Ia0x'29gIigk譞>'B>e`H![BIFlp&9H*F^r%K))w"KyUȢ(S`n:ظv``볎>VG-}+Ǣ$t(#R#O
+J٪\Rݰ#+F¤QsDyUd _Ad
+:X5)hĄLm6KaLAn6tۑ? HcNAF?V'.w/Zd=F.
+}Bk\q=LH5|Q4@A4 " F'Aj?xK1#MQ2gLdL3a Yt
+ZL ԙyH!RU2d"9k^>d{|~y0Bc{?wp$(^ J5ři h!Pۢf"Ֆ UlRHqCSyRHoԾsGBl$va3#{/u+9Tq/𹼜<\z1:EPyCYH΋D#
+rGd $:m:!qAEk-b]g|A#% 9i?wQ{">9*VK!G%=B$A ;y @TQ `NQ#"7#xŠO!m9B!H@+9Κ~/;9_
+4s]QQXWeu
+dά<Ȇ3D$ͭlJabWS2mzAWڄf_0'xni]' )vba'luPC!d|R[Yp156v)40wIwv
+eJ]*TNuA2_T=z6k\FXᷔaw͆SUnZ=̣U9R%3EiI *4,\JhX|~C9>5fSvVfspN_FъpuQ7N :s<y]Fin*KUtei_f,e
+Xm2WzJ:w4#^ocZן཭R$x(0@s]}5'df Ӭ MVFTCӕ6[3
+5=|WFjJQF~Q596>h@ h;3bʹvK| ]9ʎ UVd21fF ֌=Vi)=MSf)kRb5)\c7+9Zh|qݚy};`sآ#;EXojz\kj|MV*%~&unS5Qr5.at_7W=hTbF&6jdѳm/uT@T@S2 0 ]`H䲨1 `y ^K$Zf*hY)=Zֶɶv:k%ִܓ?>y}}˚ƎL}%q4bb\9\0 -_EUG$+7ª\eGڔYQ5ʌ5EJTjl,5?NܛEra #NJ + q-z
+)?zrX͎1*#&U,*-ήԸjYR)JNإ2%Șx~)S
+nWfZVh<))}#`/ߎ2z32G))NVb5Y]`Ru͘(Eg$(*3EYe9FY5#kBQp
+><o)8O(^`yR̳1μgyĘJ #oELQxNr437N3r4=Ϫ|SP~55UK+8)s>yS~NC@SKoޖt/*zXlȤ,bI&XP,cR4QE
+*(M+NTV)
+M-Ճ%4CJɧ䔼K>yC6&35‹JzYQ΅Zz-X҉oya+>J+)5I0=hD{&3SV$_VqOjlyʳ<˳:8e ,\~Zʹ4\SHl2y1!P&JOոJ? HyU%ʳ*UcQe{"n[FVKիUF.wZVmhȠF΅ǩzr@LI1Z(7T:B(GFe遺 : ;лX_mQg?ߎI~%g#=Rb|J cʥUÛйM\\<lF
+H-49xp!̖bhpj+ވVJxmH25?F5 m [m m%E%fnWS,b5:._B冴O;o-We976q&mOI0|3.O ov 0na` .6t#|NAs45{|w9>k1>$mIgiໝSQ;vMG'$]0P`C@uQN w+
+}|7[ًO
+FwJ]#y‘PRa#> eԥ8 t4v71qzjiW|?<g>-/҃
+܏WO1xNA^SIAN$'gR,Yhmy׵u/`ͅ35b%Ұ>Z ҅\Opn!p8>c"5ec,ýKKf+ų`ߐoO!|z-Kp\uCѫ 7RnWosܦHv;; PeP hfh(MEyEևb7:󺮢gKp>5HCax$q`\,<u}[rlwq8%̾F^F)^Bg~I AgX>?Yu !yaMZ`{!`{9)E h̏Qh;:.iofp^'Ѻ7/}J3G~1`9U~ YKm@k6Ӣ?ڵzGOѺѩlS$8AQn<r_ w_pYX;|r"𓈏4-"el
+ֱc X:V;؎t^*ׅ5h 9$ V,a߆};plՐZ| -]ɳ|kyF;lݘ؀m@an_L b 
+ۻ3>wiJ>EOOUE79𓣛}!\+q~F6e;K 0"WҽMyޑ`HRsxx/Yڱ8]c~9Xze TtOҢQB|c29wxz8-RLSγhqyi'Ooi=lff1s c`4!F?јop4Vc:Wy,=|`oŔ>1 D`1*u`6ƎjLza"ΏnhF0pC LÒ{_CI"%M{MlbdK II%LTc,QcI%:0,APڀ!i H;0 EldcdsI^EwUtmDG{+3wLYfV 37C;1"##) /ՆCГք6tw`z?:GϘ2іyYwz ^ω?9B x6`uKlfiq'L) (R‚@v9NgѦUGޜ!4LE4?-xo s@Ïy<m66(dᜡgmGJ**%V@n rјۊ.> uQD\, Nݿ{xmtMc[:oCxhdj2q@FV Z'
+ܨ-ZKg1TΡRav+(7~@N<_&-7p%~X R
+c;E즣(3@y6uX-/>K%"Y=r`wps:T:&9&*Mp a7Qn.CŅRKlm$iXga]GQ"}opKcm*q-$ RG7u2V<U5 Yfj-B͆b[,nK}0ul ۯ@gǏuW9D($^#/cH0uG'}c1fI(خٞ݀"G  W42
+&ZBw|j',r<G^qqij诲H908wQA2Umu5򫛐WGnMԵǡ= P}uW>P֊&E&.wm  li&IX9㡭BS5uv۠T!ӆ^(Fp
+Ho"!R䳈=%.p$[;xuwIE덂99r(ݬ«CׂL:|Hu!7 yI$lBr ҖHlI-_Y̷۴?77s, ijڥZ Qn Y8H!ůܟd2pAф
+ B
+
+D !L`0!J{e7#bɽ6ɼ0Xa,L|qzJ] PSSm$;8D'!b8
+-,FI> d0 1y7ȹf{5"Iq[\9 N98<j%"j:Ùn}HWdBLl!p!Cm8݉]^|vcwGxKzb%\D ~" '$D߱ ,[L"8[. [d_d]d]- tBFd {,J&Dla,.sIJZeNHڶΜAl\D
+!{\ T/ " ; &
+
+AWF&%IAbq\ZkԘU$KxHjcbXNԦ9{,޷|{ +#
+0rC}eHn NsB:@<@A_Ơ}G{||>|_%~ / .) ._\Z!,8 ]u'0B
+]x: k %^i optDoq>!;p(cv;i w|-88,~>^rlWaد@Z=ZAXf8Z_m&:-D`kwp~ >szK?"'f)X~vcN^F[4Eт&tl2!'*,42"^q6Q{rר_\1a#bP Gcᨆc2pӜ.E(>;Fvf|¤n 3a#<H#8
+-F"t<C},\=;:':4:SpWhϾ8ֲm;Vʛjg?&xlx\G\t<QTSY ^MӈT5M!m*Sպ|.GH;=_:)DZH>)rkKwմZ)eZTmjKU}*{lVEσF]W=x2undy>уnOun5W&h{j3T힫qCU1Bc=U9^= y.RJxh~Km**qt<O3~6+W<Xma`Z̕7/LZ/o*ozjwʽw|ԧP%>S>TgYB*ݨ|V {Sy+0w^s6|;:rT
+?Oj_J#5ߤb*ꛪa}sTw+?\Co50hv++2*3䞲B#u jv}L$7TA* 2 (F588CB)7P9!_) t21RJq%ڕP
+xwۜC^_
+DNRRl٣Zw}L֘Kp(щCp`<9k6d>FBr<̨~J2(-*F)QJ+):C ׀r%j"ǭٴ]&gzWq2}61dZʧyo":*1CБTCd3F*'k\T%b.TLje<XKb*:ᨢ::P+֣yéԠE rf.S_%Xel)!Aq Ɋfh-Plb)j@۶`?P-^;m&-¸z8Z2>΁kJJ%<d( -T1(E͊<'PXXR*4eBRW(8uR)0ং׉ˣ苌XCK:J78eS#vbbJwSt"Sv
+ˢsho]!l0=r-,Re"wE9͊t&d]p(2dp➮`w"?AIp]~/ON)78OZ5,E`l"$\Fy^3$2Od5T'FDzz(=, gB5=:to9tq9so\Y{\Wm!TWje( U@!Crx9l^E^^ǛMC75"kCOMw%U-axԀg#+ޝH&r Qex2DR*
+WQ%+@3T.¤Vބ;@_Kڕ|VKH F7D`aLr_hvȣ<ȣ<iFF6wh es-**12eXI3b3
+x Nw 8 ^o7h:9ϚQL3xm\
+
+%8b&qO, 7G;[s}F7}#8
+y 7{//x8xB/?xxd!]ʥ?8
+Jqq`2ϓ9cʚv鷈uXi<^^G~_['228}@-1/i z]@"b#v91::f)d̲%8 )=`A}`7x#vL*%x[fEA>Nlb=Ӊe2į~xVav];aA-63ڧamFnf:iyZG1cW6!~>gbE,C %F3QVXn8ױwl=>t 3mIB6wh=X)p1b8{V e5YЕ(އq#%Y/>`ݍ.F($ p<
+G
+ 68jȣZӴ<G UJ\ #J7á{6h^b{?v[!{8v
+!J$D @2-Dʂ xPW`k,@9GY?[ԟ0G^m8rК.5~a_\0A O:YT W*N.gd m$VM{Mn+rޓ+}GXo|/DA]U9fy;kfTW5-hr,lSNCݚ;d\%X mh#aǕ~Iww[~8:ZڲE7*HFyb=41\ T3f(8NYɲGNWfd2"+Y&YMj:.,/>R+цhkknтҖQ|k9T(ƛm,S/My2̣d3[n\F)%fĬШW#^wh 8ӂ%mhY y>̠NSikTF.+_l# 0 3
+(0.D4Dwq;hc9&٬i&VLlkXSi&=iZcܲUt=}kPqQE! 0ԩ,+7lFSNx1WUJ3nUK)rF7r+%.^nrn-d<Ffx<BjB'e1Ri
+A7)M٦$eҔiQJ,SjK)~Tr%7+))%Dvi%X_J"uww&|m #2,EfJ JQ`U9@a0f(՜1YrX
+4R؉Jڨ26f#k+;+˳[6~v#RGy84R^s+6T)`9aJF+jS-Yv[_dK5^%o9IE'ȤeE%}$7èl
+l`|nK-<&FehekVhxIqX&(6)G"$WȜT$N;_T;peNrn{
+*հI2dPp<(0C9?(8/<39AM֪lTi&Sy?;pMgq$*rkPHnȐP`~˿̖qHA>+#C *B ܼg9G0s%\*(EYX'btTP%b_qq-OI,WWҍ1 %gحNՠ:iV4x i|U<}/!㤀A+ Р2|ˌ)h`yr\rYX
+0嘵rCƠSW.jB豉4/Ɩd%ӛ BM
+0wE=\.BD."c'1!Mdb61;-s8KpG`O+yɇK*a@ȡ3$x \ \5\t5\@5
+XX
+nm 5ʡ]ֱ@!H]/Y@ &
+VxҏVx£%RZq.|j&UL+q4+ZOX9HfF$|6K[
+^?ni 53|5ezqA#_L
+^.{8 3w𗿂8#=C=:n$2y?t,Y?8VrEr?أ8G:rXD^]M2m~A馲.= ݠ&救GZq+YȑLLV8DDRKX%_"6cvv'iP6Դ
+8K)gYBDim` $]v>NK<n'2LY%u )tY='e*\v/<e'O7sKZꄧK{lYs[Ȩv2oVRZ ˥_^mOah4 rx܎\jKmqj֦iE㏪9ႚ!Ր
+b:m:r"8+GS IږVQQU6`(VBZ7֫޸Qu6Mݪ5Ri3)yNU
+VUX>T3S
+)1<GCF%-Ÿ*.E8O#wr'EXw3ny~ijlq0:RިF()RH#k/
+:;_ U:G
+2X&8ҫ>_{Ŵna"r܄*_a |n]M>gVcB~PW
+Iʊt9c/ggTW6\ۏ_ݛ¸
+{mf5*c?,ks51#ꋚ b԰>
+91%cيP9`- ђoc-^,p9=R BN<Q?[92tdn=L<Aȑ]Xe\hEx8z'mH2G>ek=:Bt5JR=pt±nѽ(\Sݰt*O.r?b̘C"f'Q~mmIG<4vPAo ɠy#ynsmEo
+ 8,
+)c:h_P
+~/k$?fOyF>OqmrѺ!.sSc>;\䱧"p᪇pMdptvZf^w@d
+-a4uAL&cjHָA9ʂ͞*P}LHuª4Z59_'`K0\RE-U$Fp+mw_ղqlI&&cqjHNQ8:CjU`b+4$JUI
+$5ȗ4VH%oUqOxBwU`BSDE
+*HW5r[)\ʱ\zD $#F#ϯw泥8!7#kȍߚ
+YJ-*RBK
+UX):Jn[rm3/T}RcxGi3-»[1nŌsJnFS'R*U`cO۞<{r%r9|I );AY㕙>MNgҝ+*{^2^5MlkH=Sl-~@ Fy24+iSө̌\P
+93*=+4L={l]< K7#L_O̔
+ke,K)EmJ.+x U\Qy|;rȻ
+n-qSM8z{Sx8Nk{M)(3H4z~=1pp;T_+}Xኁ' ,?u
+q@>zS'u/ >z:=E;N*ңn<7U#` :._ORܠԍp/h=k!G!^7YJgz\hDt*bn 6^ 489x,؋h2
+n1 BxS(fYjC(i>'{ogG;k}+l$n9C5rxxK<sGΉx*j]r~"}nwUL%o NqO*c}e;W&YC%/P8ffc_1) k.\p
+idgqedY1@3zMaL$?r2C&X5>ȡ1A.%jTPFgiD a!w+'tCV:7)5C)O( 1|!OwDt.Xm)1PANO!ǁ紆*dT^Ur .eGxGRZySbdS<J07*/)|Q1{Z|zx-k~k撧f2KmF•i1)Ts8%dɐ2\ (Z(L%rF5(.춗e]_[}vƭIm3l4Lb R ͢(b%e*֖[m%TvGlFòD(S/tN𳛱A486S42dSwF8r:v,3木Hf\RW~M>d{< =ZQ1]!2YQ,jLN\r,rNi 9~LSeLȄ*W*,qB=9 
+NUHO]pwL,Xߕ|VLl)f9#'CNPEyLxl2{2yeLJUD0(<eBSf+ĻPA^ 2z6$;݊%k
+ͥB+tr)D]᥊y
+ݸ~0)\*ָɽû{Xfmհ2V|ߵ=růĔTMT۩jEZWj^vqq*B˄ΆKZ[µo5c[_U`8,G bK^2ٓ:hh5i|1/jZV<jiV
+ሕKk4U@{.J1P╢4 ŗqE`
+1T<ȸѹm a-߉MKvǀz(j-|BL9~3p.Q3 xԭGn߶dN;|ܛ}6'Ѷ$3'qR<%&4S|qJ~DzR>ދx/9f |ʸ'yj= kâٱ ]0!,ڣp~ӳq0rN<Qٗc;ޥ`|<\^\e>PF<?WOcq|xiorM_a{ u| =&RK忚6W$dv}*1?X߶i{#_\Y3Nmc} 6>|d)];__/9Գ
+3%OlOI' <!=19Gc&}/>3d,mB=E;bW8{;
+,g_^U*IltBtl x( $/g :{'iv6l`gv;8hûCQO)͠s'I=. \x)9)#+yJ9ۉxs'5ۆ Tx>)3tSI/ WB)t~-vk~ƻFvNZMsEp]z>Dk;ddI8,ybi|ENbWVf{crVրco5(Xe1/sSG j+GYvꎣ7b%8pTȊ*J3L<s,rXy<3/.:jMo& 8c$|(KUVu#%n4xzȂ8(eYOLfd'gt*jmLc*Ro ];
+7i]ƖqQ,.n/WO<} S2c;:q&yb" 'D5}Vd%Վ=c(BUrբΞ F5T2g{̞@% W9*\p5'"-e]wHeϡ5NkZ>JY–ٲ_h9
+uk<q쨔+cv0 jk*z/jWPY2@8~R53~ަn0^i5Ə%F9F|2fƥeƙW~5UbS
+ 7gaV^ha,ӽ)C"G`CAN yb*c4Z̲IhWGV LgMbgXޅ8|DIQNh<)OzDDF(73@tiiNi63OLf1;CuIمQ|{b _?Zj`&ޱ.v?._Ə ς(38яWҗ>Tz.?.7i<%oD,!`R8\)`. .jȥHB@H1%폎@TXb/&f:.cK4#1wsb=8|LfҖxxCCxt $2N(mt 5&j0T?CpmG2aEh9K(U/0q&{@Ak
+D&x#8j$,byb!p,dLY]ّ!1CHlp\q .U%NLH-Rdch
+^@D3Hvgxq|Dp*жhcH
+?R#3I3< PS,> ؞Eq\=-R'6;9IAzɆٜI6|XdA,@W־+Y?[ړC iBF-(ӊ -A[(oq@
+
+$Y&y(ꕫ$uҽyܽ{!y?zߟUQEUTQEUTQEUTQ!`y bQEUonb}SV\+e:<=co*oWgֈ WG&;D›&N8:<͂[ߝ9qtO *Ʈ*Gr~\13Ǧ̏.K?ja`[ᖰ=7%¶
+stP"M8<[^R6+;k kkeU lYj9eKsb"<.RE?<wxcce0e;Q_/jn+;P|VlLu`]:kfp]V"C]Cb wÊQr[+ ,|jw:eUn3c+:|a톣<5aUE"WvMqФ>l)%dtUY#Wq€rFtGz](9dj_8`]భKJ7HKwsؗ1TT..(rۮѵ}4f>z{ϟࣵLAϻsƌzfzkfL(քC ~h?j}CJ3E%/c_TVJ*pT_xEy\_^Hڨ;Wi YA"ҭ[l!Iv^يR9$Vd2nqy>=/<y;s+Nw $ ӟmWy0\*c<0gלuN@B! +G[Yu?R|^rrH/坑,~$K]Kn`l=Z5[7q|gUnr"~F8ߛ-cY đ\ೖ-K1Es
++
+s=t##URuMT?|zq+[:sMnִ䂹33o\P7.B <L 0
+
+Ȇ DGr <6
+83|6 ~!]{=i5$>*OEtO1o,N4GO\ٞ~pc݌)GR0XQAl(f4 M<Aoc0
+ ݆/U)|JnPW
+x kFEQ`0|=t[ 1x}
+RWvH
+p`+gQ(^1ױ>9ږ騬*^x#qb ,Y2aHwcVMOb/f=-ȁ/} - `=瀾}k)
+4`" C
+^Sp|v:Q h Z1
+VKȘ
+=Vy!pLYzY*K;x2}{"w7er"Iw:GSy\V[<6'Rչn%:溬'5mDtbZL\&$
+ܾ~vן{}߻<%E&gINDHJ"NƄdD] Q!c@
+d *>7 8PW% \ h`3^l:93c<xWo67!ʺ[ЈZI4z{z?cvTgC |ޮX.qDh\1yXC>M|;
+ݡP
+`(dBG $8&{j?Sp䴥W5zNK6Vi|QAh 4ݪ(d*isZdD(k}P`
+Ȯ|BpW$ %IHO޿y:~0?_(gD,rE}KcШ+)J_*=I,?!4l=Å[Pծ=Ğ [ }g OZO$o!xL=5dbBC) Oմ>RIr\r"#;@V2[kclzi5a#*Xm?;62.#:ĉ֙Li_
+HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽
+ 
+V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'K
+x-
+ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9
+N')].uJr
+ wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4
+n3ܣkGݯz=[==<=G</z^^j^ ޡZQB0FX'+t<u-{__ߘ-G,}/Hh 8mW2p[AiAN#8$X?AKHI{!7<qWy(!46-aaaW @@`lYĎH,$((Yh7ъb<b*b<~L&Y&9%uMssNpJP%MI JlN<DHJIڐtCj'KwKgC%Nd |ꙪO=%mLuvx:HoL!ȨC&13#s$/Y=OsbsrnsO1v=ˏϟ\h٢#¼oZ<]TUt}`IÒsKV-Y,+>TB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O
+zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km
+8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0
+b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup`
+E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn
+6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1
+VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<
+PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(
+l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 74 0 obj [/ICCBased 98 0 R] endobj 81 0 obj <</Private 82 0 R/LastModified(D:20120604143053-07'00')>> endobj 82 0 obj <</RoundtripVersion 13/ContainerVersion 11/CreatorVersion 13/AIMetaData 83 0 R/AIPrivateData1 84 0 R/AIPrivateData2 85 0 R/AIPrivateData3 86 0 R/AIPrivateData4 87 0 R/AIPrivateData5 88 0 R/AIPrivateData6 89 0 R/AIPrivateData7 90 0 R/NumBlock 7/RoundtripStreamType 1>> endobj 83 0 obj <</Length 1020>>stream
+%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 13.0 %%AI8_CreatorVersion: 13.0.0 %%For: (Jamie Zawinski) () %%Title: (iSaverRunner.ai) %%CreationDate: 6/4/12 2:30 PM %%BoundingBox: 0 -10 117 114 %%HiResBoundingBox: 0 -9.4248 116.3867 114 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 9.0 %AI12_BuildNumber: 406 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%DocumentCustomColors: (PANTONE 152 CVC) %%+ (PANTONE 485 CVC) %%CMYKCustomColor: 0 0.51 1 0 (PANTONE 152 CVC) %%+ 0 1 0.91 0 (PANTONE 485 CVC) %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_TemplateBox: 57.5 56.5 57.5 56.5 %AI3_TileBox: -231 -299 345 435 %AI3_DocumentPreview: None %AI5_ArtSize: 114 114 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -12 117 8 1190 1089 18 1 0 339 90 1 0 1 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 100 10 100 10 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 84 0 obj <</Length 28725>>stream
+%%BoundingBox: 0 -10 117 114 %%HiResBoundingBox: 0 -9.4248 116.3867 114 %AI7_Thumbnail: 124 128 8 %%BeginData: 28588 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C453D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373737FD04FF363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637A9FFFFFF37373D3737373D3737373D3737373D3737373D37 %37373D3737373D3737373D3737373D3737373D3737373D3737373D373737 %3D3737373D3737373D3737373D3737373D3737373D3737373D3737373D37 %37373D3737373D3737373D3737373D3737373D3737373D3737373D373737 %3D3737373D3737373D37AFFFFFFF36373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %3637363736373637363736371437A9FFFFFF3D373D373D373D373D373D37 %3D373D373D373D373D373D373D373D373D373D373D373D373D373D373D37 %3D373D373D373D373D373D373D373D373D373D373D373D373D373D373D37 %3D373D373D373D373D373D373D373D373D373D373D373D373D373D373D37 %3D373D373D373D373D373D373D373D373D37AFFFFFFF3637363736373637 %363736373637363736373637363736373637363736373637363736373637 %36373637363D2F3037373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %36373637363736373637363736373637363736373637A9FFFFFF3D373737 %3D3737373D3737373D3737373D3737373D3737373D3737373D3737373D37 %37373D3737373D3737372F003D373D3737373D3737373D3737373D373737 %3D3737373D3737373D3737373D3737373D3737373D3737373D3737373D37 %37373D3737373D3737373D3737373D3737373D3737373D373737AFFFFFFF %363736373637363736373637363736373637363736373637363736373637 %36373637363736373637363730280E050D37363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %A8FFFFFF3D373D373D373D373D373D373D373D373D373D373D373D373D37 %3D373D373D373D373D373D373D373D373D05280600363D373D373D373D37 %3D373D373D373D373D373D373D373D373D373D373D373D373D373D373D37 %3D373D373D373D373D373D373D373D373D373D373D373D373D373D373D37 %3D373737FD04FF3637363736373637363736373637363736373637363736 %3736373637363736373637363736373637363737362027F8063737363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %37363736373637A9FFFFFF37373D3737373D3737373D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D374C6820F82F %373D3737373D3737373D3737373D3737373D3737373D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D3737373D3737 %373D3737373D3737373D37AFFFFFFF363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363D0D %8C6826F83637373637363736373637363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637363736371437A9FFFFFF3D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373745B5694A053D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D37AFFFFFFF36373637363736 %373637363736373637363736373637363736373637363736373637363736 %3736373637363737288CB04426053D373736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %3736373637363736373637363736373637363736373637A9FFFFFF3D3737 %373D3737373D3737373D3737373D3737373D3737373D3737373D3737373D %3737373D3737373D3737373D0D69B0B54A26073D3737373D3737373D3737 %373D3737373D3737373D3737373D3737373D3737373D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D373737AFFFFF %FF3637363736373637363736373637363736373637363736373637363736 %373637363736373637363736373637363721B08D8D26200D3D3637363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %37A8FFFFFF3D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D374C8CB5B06F4A27373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373737FD04FF36373637363736373637363736373637363736373637 %36373637363736373637363736373637363736373637363D0C8D8DB58D4B %26063737363736373637363736FD04373D36373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %37363736373637A9FFFFFF37373D3737373D3737373D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D3737373668B5 %8DB58D6F202F3737373D3737373D3737372F3636063D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D3737373D3737 %373D3737373D3737373D37AFFFFFFF363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %370E6F8DB08DB04474F8363737363736373637372FF837F8063737363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637363736371437A9FFFFFF3D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D4BB58DB5B0B04A75053D373D373D373D3736F8360CF8373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D37AFFFFFFF36373637363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637154C8CB08DB5B069744A0D3736373637363721270E %F8063D363736373637363736373637363736373637363736373637363736 %3736373637363736373637363736373637363736373637A9FFFFFF3D3737 %373D3737373D3737373D3737373D3737373D3737373D3737373D3737373D %3737373D3737373D3737373D373D27B5B0B58DB58D7598273737373D373D %28682F06F8363737373D3737373D3737373D3737373D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D373737AFFFFF %FF3637363736373637363736373637363736373637363736373637363736 %373637363736373637363736373637363715288CB58DB08DB044C1203037 %3736370E454406F827143736373637363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %37A8FFFFFF3D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D28B5B0B58DB5B04B %C14A0D3D373D372E8C4B044A0661373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373737FD04FF36373637363736373637363736373637363736373637 %36373637363736373637363736373637363736373637363737288CB58DB0 %8D8D4A9FF8FD04373644B0F8754A0D373736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %37363736373637A9FFFFFF37373D3737373D3737373D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D3737373D27B0 %8DB58DB5449F4A0D373D373D27B08D269F4B0E3D373D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D3737373D3737 %373D3737373D3737373D37AFFFFFFF363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %370E4B8DB08DB5684A98F80E37363D0D68B08D4AC1203637373637363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637363736371437A9FFFFFF3D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373668B58DB5B04B9F75063D373D37288CB68D75C127363D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D37AFFFFFFF36373637363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637068D8DB08D8D4AC1F8FD04373644B08D8D4AC1F837 %373736373637363736373637363736373637363736373637363736373637 %36373637363736373637363736373637363736373637A9FFFFFF3D373737 %3D3737373D3737373D3737373D3737373D3737373D3737373D3737373D37 %37373D3737373D3737373D144BB0B5B0B544C16E06373D373D27B0B0B58D %75C127143D3737373D3737373D3737373D3737373D3737373D3737373D37 %37373D3737373D3737373D3737373D3737373D3737373D373737AFFFFFFF %363736373637363736373637363736373637363736373637363736373637 %3637363736373637363736373637152868B08DB56875BA260E3736370E45 %8DB58D8D4AC1203636373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %A8FFFFFF3D373D373D373D373D373D373D373D373D373D373D373D373D37 %3D373D373D373D373D373D373D373D373D372F68B58DB5B04B9F99063D37 %3D372F8CB6B0B58D6FC14B0E3D373D373D373D373D373D373D373D373D37 %3D373D373D373D373D373D373D373D373D373D373D373D373D373D373D37 %3D373737FD04FF3637363736373637363736373637363736373637363736 %37363736373637363736373637363736373637370E44B58DB08D8D4AC120 %303737363721B08DB58DB044C14A0D373736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %37363736373637A9FFFFFF37373D3737373D3737373D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373644B08DB58DB5 %44C19805373D373D0D6FB0B58DB5B06F9875073D373D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D3737373D3737 %373D3737373D3737373D37AFFFFFFF363736373637363736373637363736 %37363736373637363736373637363736373637363736373637373620B08D %B08DB5694AC14A06373637372E68B58DB08DB568756E0637373637363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637363736371437A9FFFFFF3D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %27B5B0B58DB5B06974C12036373D373D27B5B0B58DB5B08D6EC1053D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D37AFFFFFFF36373637363736 %3736373637363736373637363736373637363736373637363736FD053736 %3D068CB0B58DB08DB044C174063737363D1469B0B58DB08DB58D4B982714 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637363736373637363736373637A9FFFFFF3D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D3737373D2F2F %3737373D0E69B0B58DB58DB56975C16E073D3737373668B58DB58DB58DB5 %689F26303737373D3737373D3737373D3737373D3737373D3737373D3737 %373D3737373D3737373D3737373D3737373D3737373D373737AFFFFFFF36 %373637363736373637363736373637363736371537363736373637363736 %3714212736F83737278CB58DB08DB5B0696EC120303737363D068D8DB08D %B58DB08D8D6E74053D373736373637363736373637363736373637363736 %3736373637363737373637363736373637363736373637363736373637A8 %FFFFFF3D373D373D373D373D373D373D373D373D373D375A2E2E272E272E %272E272E2727684BF820272768B6B0B58DB5B0B5689FC1272752272E274B %B0B58DB5B0B58DB58D6F9827272E272E272E272E272E272E272E272E272E %272E272E272E272E272E272E2F61373D373D373D373D373D373D373D373D %373737FD04FF3637363736373637363736373637363736373759FD0CF844 %93FD04F820B08DB58DB08DB58D69989FFD06F820B58DB08DB58DB08DB544 %9926FD1FF82E37373736373637363736373637363736373637A9FFFFFF37 %373D3737373D3737373D3737373D3737376127FD0CF8B568FD04F86FB0B5 %8DB58DB58DB5689F9926FD05F845B0B58DB58DB58DB5B08D6E99FD1FF826 %2F3D3737373D3737373D3737373D3737373D37AFFFFFFF36373637363736 %37363736373637363736373027FD0BF845B044FD04F88CB58DB08DB58DB0 %8D69989FFD06F844B08DB58DB08DB58DB08D4B9820FD1FF82F3737363736 %37363736373637363736371437A9FFFFFF3D373D373D373D373D373D373D %373D373D375AFD0CF88DB5FD04F820B5B0B58DB5B0B58DB669999F27FD05 %F86FB0B5B0B58DB5B0B58DB669756EFD1FF82F3D373D373D373D373D373D %373D373D373D37AFFFFFFF3637363736373637363736373637363736372F %27FD0AF820B568FD04F845B0B58DB08DB58DB08D8D4AC120FD05F844B08D %B58DB08DB58DB08DB0449FFD1FF82F373736373637363736373637363736 %373637A9FFFFFF3D3737373D3737373D3737373D3737373D375AFD0BF869 %B0692626F8F869B58DB58DB58DB58DB5B06F9975FD05F86FB0B58DB58DB5 %8DB58DB5B0697475FD1EF82F3D373D3737373D3737373D3737373D373737 %AFFFFFFF3637363736373637363736373637363736373020FD0AF88DB020 %7520F8F88D8DB08DB58DB08DB58DB08C4B98FD05F820B58DB08DB58DB08D %B58DB08D4B9820FD1DF82F373736373637363736373637363736373637A8 %FFFFFF3D373D373D373D373D373D373D373D373D375AFD0AF844B58D4B99 %26F8218DB58DB5B0B58DB5B0B58DB669756EFD04F827B0B58DB5B0B58DB5 %B0B58DB6697574FD1CF8202F3D373D373D373D373D373D373D373D373737 %FD04FF3637363736373637363736373637363736373626FD09F869B08D4A %C1F8F8F893B0B08DB58DB08DB58DB08DB5449920FD04F8938DB08DB58DB0 %8DB58DB08DB5449F4AFD1CF8533737363736373637363736373637363736 %37A9FFFFFF37373D3737373D3737373D3737373D3737375AFD09F8208DB5 %8D75C126F8F868B58DB58DB58DB58DB58DB5B0B54A99FD04F868B58DB58D %B58DB58DB58DB5B0B54AC1FD1CF82F3D3737373D3737373D3737373D3737 %373D37AFFFFFFF3637363736373637363736373637363736372F27FD08F8 %20B08D8D4AC1207E7D698DB58DB08DB58DB08DB58DB08D8D4A74F87E7D4B %8CB58DB08DB58DB08DB58DB08D694A9FF87DA8A87DA87DA87DA87DA87DA8 %7D52FD0BF82F373736373637363736373637363736371437A9FFFFFF3D37 %3D373D373D373D373D373D373D373D375AFD09F86FB0B58D6FC14BA8FF4B %B5B0B58DB5B0B58DB5B0B58DB5B08D4A7527FF7D8DB0B58DB5B0B58DB5B0 %B58DB5B069749F27AFFD0DFF52FD0AF82F3D373D373D373D373D373D373D %373D373D37AFFFFFFF3637363736373637363736373637363736372F27FD %07F8208DB08DB044C14A7DFF7668B58DB08DB58DB08DB58DB08DB5B0694A %4A27FF4BB08DB08DB58DB08DB58DB08DB5B0457499F8A8FD0CFF27FD0AF8 %2F373736373637363736373637363736373637A9FFFFFF3D3737373D3737 %373D3737373D3737373D375AFD08F820B5B0B5B06FC17452FF8469B0B58D %B58DB58DB58DB58DB58DB5B0694A4A52A868B58DB58DB58DB58DB58DB58D %B5B04B9F7527FD0CFF52FD0AF82F3D373D3737373D3737373D3737373D37 %3737AFFFFFFF3637363736373637363736373637363736373020FD07F845 %8DB58DB0449F7427FFFF4B8D8DB58DB08DB58DB08DB58DB08DB5B0694A4A %2E528CB58DB08DB58DB08DB58DB08DB58D4A98207DFD0BFF27FD0AF82F37 %3736373637363736373637363736373637A8FFFFFF3D373D373D373D373D %373D373D373D373D375AFD08F869B6B0B5B09374C120FFFF7D68B6B0B58D %B5B0B58DB5B0B58DB5B0B5B06F744B2E6FB0B58DB5B0B58DB5B0B58DB5B0 %B5689F7452FD0BFF52FD09F8202F3D373D373D373D373D373D373D373D37 %3737FD04FF3637363736373637363736373637363736373626FD07F88D8D %B58DB08D6FC14A52FFA84B8CB58DB08DB58DB08DB58DB08DB58DB08D4B74 %27278DB0B08DB58DB08DB58DB08DB58DB0449F20A8FD0AFF27FD0AF85337 %3736373637363736373637363736373637A9FFFFFF37373D3737373D3737 %373D3737373D3737375AFD07F821B0B58DB5B0B544C19827FFFF7D8DB0B5 %8DB58DB58DB58DB58DB58DB58DB58D75740545B5B0B58DB58DB58DB58DB5 %8DB5B069747452FD0AFF52FD0AF82F3D3737373D3737373D3737373D3737 %373D37AFFFFFFF3637363736373637363736373637363736372F27FD06F8 %20B58DB08DB58D694AC120A8FFAF44B08DB58DB08DB58DB08DB58DB08DB5 %8DB044994AF868B58DB08DB58DB08DB58DB08DB58D4B6E27FD0AFF27FD0A %F82F373736373637363736373637363736371437A9FFFFFF3D373D373D37 %3D373D373D373D373D373D375AFD07F86FB0B58DB5B0B58D4BC17527FFFF %7D68B6B0B58DB5B0B58DB5B0B58DB5B0B5B0B54A9FF84BB0B58DB5B0B58D %B5B0B58DB5B0B5687526A9FD09FF52FD0AF82F3D373D373D373D373D373D %373D373D373D37AFFFFFFF3637363736373637363736373637363736372F %27FD06F868B58DB08DB58DB06875C12084FFA84B8DB58DB08DB58DB08DB5 %8DB08DB58DB0B0697475F893B0B08DB58DB08DB58DB08DB58D8D4A4A59FD %09FF27FD0AF82F373736373637363736373637363736373637A9FFFFFF3D %3737373D3737373D3737373D3737373D375AFD07F893B0B58DB58DB5B0B0 %44C14A52FFFF528DB0B58DB58DB58DB58DB58DB58DB58DB58D6F9F0444B5 %B0B58DB58DB58DB58DB58DB5B06F4A52FD09FF52FD0AF82F3D373D373737 %3D3737373D3737373D373737AFFFFFFF3637363736373637363736373637 %363736373020FD06F868B08DB58DB08DB5B0694AC1F884FFAF44B08DB58D %B08DB58DB08DB58DB08DB58DB0449F4AF88CB58DB08DB58DB08DB58DB08D %B5684A26FD09FF27FD0AF82F373736373637363736373637363736373637 %A8FFFFFF3D373D373D373D373D373D373D373D373D375AFD07F893B0B5B0 %B58DB5B0B5B06F9F9927FFFF7D68B6B0B58DB5B0B58DB5B0B58DB5B0B5B0 %934A9FF893B0B58DB5B0B58DB5B0B58DB5B0B54A4B84FD08FF52FD09F820 %2F3D373D373D373D373D373D373D373D373737FD04FF3637363736373637 %363736373637363736373626FD05F8208DB08DB58DB08DB58DB08C4BC126 %52FFA8458DB58DB08DB58DB08DB58DB08DB58DB08D694A2620B58DB08DB5 %8DB08DB58DB08DB58D6F207DFD08FF27FD0AF85337373637363736373637 %3637363736373637A9FFFFFF37373D3737373D3737373D3737373D373737 %5AFD07F893B0B58DB58DB58DB58DB568759F27A8FF528DB0B58DB58DB58D %B58DB58DB58DB58DB5B06F206FB0B58DB58DB58DB58DB58DB58DB5694A52 %FD08FF52FD0AF82F3D3737373D3737373D3737373D3737373D37AFFFFFFF %3637363736373637363736373637363736372F27FD06F868B58DB08DB58D %B08DB58DB0449F4A27FFAF44B08DB58DB08DB58DB08DB58DB08DB58DB08D %B08DB08DB58DB08DB58DB08DB58DB08D8D2027FD08FF27FD0AF82F373736 %373637363736373637363736371437A9FFFFFF3D373D373D373D373D373D %373D373D373D375AFD07F86FB0B58DB5B0B58DB5B0B5B0B544C1207EFF7D %68B6B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5 %B0B58DB5B04B26FD08FF52FD0AF82F3D373D373D373D373D373D373D373D %373D37AFFFFFFF3637363736373637363736373637363736372F27FD06F8 %20B58DB08DB58DB08DB58DB08D8D4A99F8FFA8458DB58DB08DB58DB08DB5 %8DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB568207DFD07FF %27FD0AF82F373736373637363736373637363736373637A9FFFFFF3D3737 %373D3737373D3737373D3737373D375AFD07F8208DB58DB58DB58DB58DB5 %8DB5B0696E7427FF4BB08DB58DB58DB58DB58DB58DB58DB58DB58DB58DB5 %8DB58DB58DB58DB58DB58DB5B093F87DFD07FF52FD0AF82F3D373D373737 %3D3737373D3737373D373737AFFFFFFF3637363736373637363736373637 %363736373020FD07F8698DB58DB08DB58DB08DB58DB08D696E267E7D68B0 %8DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB5 %8DB0682652FD07FF27FD0AF82F3737363736373637363736373637363736 %37A8FFFFFF3D373D373D373D373D373D373D373D373D375AFD08F820B5B0 %B58DB5B0B58DB5B0B58DB5B06F4A52A869B0B5B0B58DB5B0B58DB5B0B58D %B5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B5B0B5442DFD07FF52FD09F8 %202F3D373D373D373D373D373D373D373D373737FD04FF36373637363736 %37363736373637363736373626FD08F868B58DB08DB58DB08DB58DB08DB5 %694A26846FB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB0 %8DB58DB08DB58DB08D4A26FD07FF27FD0AF8533737363736373637363736 %37363736373637A9FFFFFF37373D3737373D3737373D3737373D3737375A %FD09F845B0B58DB58DB58DB58DB58DB58DB5684A52768DB58DB58DB58DB5 %8DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB54427A8FD %06FF52FD0AF82F3D3737373D3737373D3737373D3737373D37AFFFFFFF36 %37363736373637363736373637363736372F27FD09F8698DB58DB08DB58D %B08DB58DB08D8D202620B08DB08DB58DB08DB58DB08DB58DB08DB58DB08D %B58DB08DB58DB08DB58DB08DB58D6FF87DFD06FF27FD0AF82F3737363736 %37363736373637363736371437A9FFFFFF3D373D373D373D373D373D373D %373D373D375AFD0AF820B5B0B58DB5B0B58DB5B0B58DB5B06F264BB0B58D %B5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0 %B5684A7DFD06FF52FD0AF82F3D373D373D373D373D373D373D373D373D37 %AFFFFFFF3637363736373637363736373637363736372F27FD0AF868B58D %B08DB58DB08DB58DB08DB58D6968B58DB08DB58DB08DB58DB08DB58DB08D %B58DB08DB58DB08DB58DB08DB58DB08DB58D6F4A52FD06FF27FD0AF82F37 %3736373637363736373637363736373637A9FFFFFF3D3737373D3737373D %3737373D3737373D375AFD0BF8208DB58DB58DB58DB58DB58DB58DB5B0B5 %8DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB5 %8DB58DB5697427FD06FF52FD0AF82F3D373D3737373D3737373D3737373D %373737AFFFFFFF3637363736373637363736373637363736373020FD0BF8 %698DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08D %B58DB08DB58DB08DB58DB08DB58DB08DB58DB08D6F7427A8FD05FF27FD0A %F82F373736373637363736373637363736373637A8FFFFFF3D373D373D37 %3D373D373D373D373D373D375AFD0BF852528DB0B58DB5B0B58DB5B0B58D %B5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0 %B58DB5B0B58DB56E9F26FD06FF52FD09F8202F3D373D373D373D373D373D %373D373D373737FD04FF3637363736373637363736373637363736373626 %FD0AF827FF45B08DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08D %B58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08D4BC14A7DFD05 %FF27FD0AF853373736373637363736373637363736373637A9FFFFFF3737 %3D3737373D3737373D3737373D3737375AFD0BF852FFA844B5B0B58DB58D %B58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58D %B58DB58DB58DB58DB5B08D4AC7207DFD05FF52FD0AF82F3D3737373D3737 %373D3737373D3737373D37AFFFFFFF363736373637363736373637363736 %3736372F27FD0AF827FFFF5268B58DB08DB58DB08DB58DB08DB58DB08DB5 %8DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB0449F %4A27A8FD05FF27FD0AF82F373736373637363736373637363736371437A9 %FFFFFF3D373D373D373D373D373D373D373D373D375AFD0BF852FFFFFF4C %8DB58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B5 %8DB5B0B58DB5B0B58DB5B0B58DB58D757427FD07FF52FD0AF82F3D373D37 %3D373D373D373D373D373D373D37AFFFFFFF363736373637363736373637 %3637363736372F27FD0AF827FFFFFFA84B8DB08DB58DB08DB58DB08DB58D %B08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB0B0 %6F4A26A8FD07FF27FD0AF82F373736373637363736373637363736373637 %A9FFFFFF3D3737373D3737373D3737373D3737373D375AFD0BF852FD04FF %7D69B0B58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB5 %8DB58DB58DB58DB58DB58DB5B09320267DFD08FF52FD0AF82F3D373D3737 %373D3737373D3737373D373737AFFFFFFF36373637363736373637363736 %37363736373020FD0BF8FD05FF7D69B0B08DB58DB08DB58DB08DB58DB08D %B58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB044F87DFD09 %FFFD0BF82F373736373637363736373637363736373637A8FFFFFF3D373D %373D373D373D373D373D373D373D375AFD0CF8277D52525259F869B0B5B0 %B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58D %B5B0B58DB669F8F87DFD07527D27FD0AF8202F3D373D373D373D373D373D %373D373D373737FD04FF3637363736373637363736373637363736373626 %FD13F88DB0B58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB5 %8DB08DB58DB08DB58DB06820FD17F8533737363736373637363736373637 %36373637A9FFFFFF37373D3737373D3737373D3737373D3737375AFD15F8 %93B0B58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58D %B58DB58DB58D20FD18F82F3D3737373D3737373D3737373D3737373D37AF %FFFFFF3637363736373637363736373637363736372F27FD15F869B0B58D %B08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08DB58DB08C %20FD19F82F373736373637363736373637363736371437A9FFFFFF3D373D %373D373D373D373D373D373D373D375AFD17F893B0B58DB5B0B58DB5B0B5 %8DB5B0B58DB5B0B58DB5B0B58DB5B0B58DB5B0B58D27FD1AF82F3D373D37 %3D373D373D373D373D373D373D37AFFFFFFF363736373637363736373637 %3637363736372F27FD17F869B0B08DB58DB08DB58DB08DB58DB08DB58DB0 %8DB58DB08DB58DB08DB56820FD1BF82F3737363736373637363736373637 %36373637A9FFFFFF3D3737373D3737373D3737373D3737373D375AFD19F8 %4B8DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB58DB5B0B544FD1D %F82F3D373D3737373D3737373D3737373D373737AFFFFFFF363736373637 %3637363736373637363736373620FD19F82068B08DB58DB08DB58DB08DB5 %8DB08DB58DB08DB58DB08D8D20FD1EF85337373637363736373637363736 %3736373637A8FFFFFF3D373D373D373D373D373D373D373D373D375B27FD %1BF820938DB5B0B5B0B58DB5B0B58DB5B0B5B0B6B0B5696F20FD1EF82736 %3D373D373D373D373D373D373D373D373737FD04FF363736373637363736 %3736373637363736373736FD1DF82044698DB5B0B0B0B5B0B0B0B58D8D68 %6F4A4AFD1FF8202E3D373736373637363736373637363736373637A9FFFF %FF37373D3737373D3737373D3737373D3737373D375A2E2E282E282E282E %282E282E282E282E282E282E282E282E282E282E27F8F820204B4469446F %696F446F6E997451FD04F82752282E282E282E282E282E282E282E282E28 %2E282E282E282E28522F37373D3737373D3737373D3737373D3737373D37 %AFFFFFFF3637363736373637363736373637363736373637373736373737 %3637373736373737363737373637373736373737363D3627FD09F8262675 %989F4AFD06F8262F37363737373637373736373737363737373637373736 %37373736373637363736373637363736373637363736371437A9FFFFFF3D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D3753FD0DF827FD09F852373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D37AFFFFFFF36373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %373637375AFD19F853373736373637363736373637363736373637363736 %37363736373637363736373637363736373637363736373637A9FFFFFF3D %3737373D3737373D3737373D3737373D3737373D3737373D3737373D3737 %373D3737373D3737373D3737373D375B27FD19F8265A373D3737373D3737 %373D3737373D3737373D3737373D3737373D3737373D3737373D3737373D %3737373D373737AFFFFFFF36373637363736373637363736373637363736 %37363736373637363736373637363736373637363736373637155A27FD1C %F85A37373637363736373637363736373637363736373637363736373637 %36373637363736373637363736373637A8FFFFFF3D373D373D373D373D37 %3D373D373D373D373D373D373D373D373D373D373D373D373D373D373D37 %3D373D375A27FD1DF82059373D373D373D373D373D373D373D373D373D37 %3D373D373D373D373D373D373D373D373D373D373D373737FD04FF363736 %373637363736373637363736373637363736373637363736373637363736 %37363736373637373D362EFD21F82E2F3737373637363736373637363736 %373637363736373637363736373637363736373637363736373637A9FFFF %FF37373D3737373D3737373D3737373D3737373D3737373D3737373D3737 %373D3737373D3737373D365A2827FD23F8272859363D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D3737373D37AF %FFFFFF363736373637363736373637363736373637363736373637363736 %37363736373637363736373027FD29F8272F373637363736373637363736 %37363736373637363736373637363736373637363736371437A9FFFFFF3D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D375AFD2B275A373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D37AFFFFFFF36373637363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %3736373637363736373637363736373637363736373637A9FFFFFF3D3737 %373D3737373D3737373D3737373D3737373D3737373D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D3737373D3737 %373D3737373D3737373D3737373D3737373D3737373D3737373D3737373D %3737373D3737373D3737373D3737373D3737373D3737373D373737AFFFFF %FF3637363736373637363736373637363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %373637363736373637363736373637363736373637363736373637363736 %37A8FFFFFF3D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373D373D373D373D373D373D373D373D373D373D373D373D373D373D %373D373737FD04FF36373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %3637363736373637A9FFFFFF37373D3737373D3737373D3737373D373737 %3D3737373D3737373D3737373D3737373D3737373D3737373D3737373D37 %37373D3737373D3737373D3737373D3737373D3737373D3737373D373737 %3D3737373D3737373D3737373D3737373D3737373D3737373D3737373D37 %37373D3737373D3737373D37AFFFFFFF3637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %36373637363736373637363736371437A9FFFFFF37373D3737373D373737 %3D3737373D3737373D3737373D3737373D3737373D3737373D3737373D37 %37373D3737373D3737373D3737373D3737373D3737373D3737373D373737 %3D3737373D3737373D3737373D3737373D3737373D3737373D3737373D37 %37373D3737373D3737373D3737373D3737373D37AFFFFFFF363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736373637363736373637 %363736373637363736373637363736373637363736371437A9FFFFFFAFA9 %AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9 %AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9 %AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9 %AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9AFA9FDFC %FFFDFCFFFDFCFFFDFCFFFD6FFFFF %%EndData endstream endobj 85 0 obj <</Length 65536>>stream
+%AI12_CompressedDataxqgv ]srFhV6uCFh <<ꠛM\;DlDS_{WwGܿû?ޛy[XUt3=^??/|zo~/?'GzͫןW۷޿x޷lp󋟖߽Gp3{g/i93ԇw嫷~篾ݛwo^_o޼yo7wo^~/YϞ^yU>֗/?ܜo2N}?|U>2l=[ۯ˦Vֽ/Kϧ>|(ay!*e䇿ٯ~Ǜqnzcڇ^X g_]-A{?կ_$(?WM+bY7?g4f^֛epׯ7?{U?|){ \<7o^۷?]{{x<7^h~_}(ݛo>=߼+ϿzWYi&Y69x9뻌7ulw/;e>_~cVgmm?{'oY>.i /~iyǷ_ܿvPq}[ͻ_ןſ'|U??+6/?7G7_?r/?s9^r׾ڼ(__վ€>ǫ?o^x7綛ܽջwoמۺpN{o?߿|߿_7~7+WcZ|_٘z~ןyo߾WTΈiy}W闌o/]ao(Gm7+;|/z~g~=o_ؤ³I/6~V}כ ml~s3~rH_ts.eaa؆}8<n~xaie\mǣ<va|iiL˴N۴Ot[w8=<\61w0?OPyYuٖ}9n_i/벮Vzw>m6n6o˶mvlvm=mO~wqڟ|(QBc;s8cy<8s:s),vgyy^;<|-" .XˣW-c/{ǣ?q7cGɗƲ#ʘƘ> >12c n26t[wc>Fy0oeϲ;a8>ζX?vhȯ#^F]^F[װ>C }|;c$cYGRcYGRjX>c#Lci#Dz>ڡ]tØQcʡ̨qYۋ ˁ]zcFqAnc}I݆<~c1XgD 򣧎:)Y\3a;_xw2}>INe-~f-fXZ&Y&C>c8k0e< 29_ʨe2{޻ڥG9
+eǻnˠ=X>===>=<?
+e:4?MOxxWX})9>q.LJRf=0OwQV~v{{{/m͎m\:ݍ ˯o03Y>^>Z>\>x; X}зele/eOHqX;ڞ:ݶj*Prݗ#Gٽeݼ=]>?_ Q~aYRq֧2Zeȝe2k˹Si*we2{0g.¸ ScA̙̜̒̕Pl\z(3g_{!ZfGGaGnHц{bd2?,6N?X^{{4/c2Fu4X.7?}INTRח.?+&"~iisG`dNxGd}zp̩Lq lhC,>#B}vqngK,n+g͋oK@ ,@փ9 }OQ\n~g-5=6GQgvwgymm>Vkǽ8(R>W)I?Ԝ-}|1+2|>5u}B,>5qM<q?u[s<Ń1=|:VbI @6{;N SoZ `|WT_ęp4܋3O;6F>w! > hGwe-mgcf˥_=+NTc';,~L~mIN3Dc;OO?)N:v! tYd( ; yDv.rE;)iNLvj'ѧ̓.~sս<<e]vZ18YlDlg4;=\f;? sNumvڛN: RQjsǃv Ä.dk<6=x8E~Kx]S<X.>ǖ{8y<ܶT4Y?V$Yͩl$TJ
+c6R+bQ=!^bۋ<jmY6]2}2lbejj<iC?iWiۋ졎F|ugkޏ7;(ar)ꏲZtRX N@@̦اF>΢x n/%2 7`/]-$-Y[QC;)5uYa'Y<`{:loT?6,p>\Eͷv]`hokɏsDc(1#|C[vՠ:#_/qW>Cj9Og }$,t0}=`EtբCEh'/~Ufr_FVO|>JxԘnc:'p@ɓGOTjrg}/^ۼ@*=<l*s4dyq녿&95͙XG 5@f>5Ϝ⒚=q_r*-JWjfxbS'σNF{%)c
+v[
+yTke.Dk-{6ҕǴY-ˮ }U=Feө
+ZL{P5ǜ
+~tewZ~3itD}Qˋ9sI̅;[3#iG٭yq8֓4x\t3`GJŏ!*V.ދ'2N
+Lsq
+WrRC-Vm ckJ'G=".Y`4<pnu
+PǼ.2f_e?=cT>ojׇO9s1ͥL|`Ẏ6_ 1oҐ7dYMyU,YU,YU,Y*b*?ەYnwRm+\i3g*wܷ?3\Rɉ2ungw+[k]Xsv!'Cn!&f6zƻFpr@I
+kh!הUXo*?Y+{UrX 9dvsvk{|gJ]S(+B3%UC69ڮ^xuu}nw=7]] oqj==1izݣ[+EڣPEm8G~\|Jy O w {>.']Ny\Y"Ź]QӖ6K\Og⣮(Œï+NOe#vpE/\VCDDѤj4rzcEqIua)8suq?HIYQ~q<j}1Zn'بveZ7`a+sXodee{1lז
+;F!^s e6m)?NI܆픹,sڔ>V4>sgMI NdCT;Kl0y۔>s i x=]_Gz{/#V>b9sKK+{2E
+tJFʭ#ݺ,}h+e:{ҕm8JFD_ؑtMӴJ#8{ҕ /w[#]ioړ[CߐΚؓefY
+ԕ] Y{zkΡ.mPgyQg}P꼽󾹡PglGGCPg3{ԕtNJҴKأ>6ԕv;J_Qgs^-{Cuw6q379uƚlPg|g,ّκm YuC]雷a Y{@]iO5\tg<#Hg2A:koّnـt=Dr5.9kP9k rugͽF8d||o-G07ˡ2J1>g\iD[h,S;1tͧorU:Jsj+}g݃qQvJ{͐+},\irMAbC˹}-;G7MG\iP4i(g}SScN9k͔&J{]k唳<oqS.m(gM[\)g)W_wz8mA攳=r[G9ۓ=PFv+#l&YeA[9x6&\m ل^b'uA09og9\s [ê!i Y{ 7Wk?#%־N\K_Z;'}ZWN\KK\׉|t$'>qZ;'޾J\/'Ήf׉}NKki?K\O\KK\YZRZZ] %'}.Cvuĵu'/'Wk^'֗Wku'K\Wk_'֗״ <q]>qW&%cN\m8sj:qyWv׉O͔Z;'6W?RRj휸zO\+'N?Rj͜r:}j̜Z;'־N\K\)9qvVS:}rj휸6W9qy|cvurZZ]Z%%,q-]]Z]j?N\K_vĵu^՚׉)q牫ĵ׉&'i:k^''z*qZ;'Wۑ9qL͐uuUjs3'',q9WgKJ\}z_J\IO\59qvJ\u%֕Wk׉kWkĵ%ΉirӜzO\+%ΉiW{NJ\y'ˉﭔĵukiw<K\KWN\K3',q-}]:}Z%%,q-}]Z]:mii|Z_N\i{Z_N\KK\}Z_N\6rּN\Sj휸&%GWۓ9q͉kfRJ\O\}]%>9Sj휸ڄN\O\ HWKkLK\C}JSj%<q3RjĵusZ׉uĵ~~kKrWJsrj휸ovΉﴔunq{Vĵukiwki_'K\KK\KY:}Z]Zҗ̉5WˉS:%ΉWˉkچqΚ׉x?'%޾J\/%6)qm^'sjÙW ׉ͣ[ڴN\}j9q|k!Wo_%ޗWk}j]9qvJ\u;-;  u%١ĵF>wK\3P[v-q@iힸ.q-orힷtQ# ۍJdtֱ}A:;Чz@9v[+ ts𼵑uHg5FNavA]S;=quV?+u%;=q]gk22Wu:}:}:3q2q2Wk^g֗3Woug֗32Wk_gm88?'e޾\/eΙ8>\mG>:;'#V;筇ţr9ґmS ٜtSxZ9ΎyjYAwx"ó9@wxֺ<UxtK+ ,s>,u=Z:XG,w*Vcƻ
+@`g3L1h7x;w7G
+O뼌YaP8)@/P/{
+K\'
+i"uQأ]A|j!4˜C}̉-ǦJaˬsk"sZySz9eY-E&B/ymל=Ek
+> -*͑c㘎Fa[*6slT7[[@mM6-ڨpڥƖ6Lq` kߤҤQg[p,MU˵*p]}#6ώP[T϶\;G@m_/fn-5hԭO^jj#kQjbڷ/uՀ"ٖkD=-!T1$V{DS56hS Ǻ&c YC@]0G 9ruiu</["ͣ[Dm5Q[{[m"--1R \5Q[FkB͖p~L~ m. GQZGԛ_Y?#rxD]ND]夿QomrDm}[6R&zTxHm-!
+NDԥL`]-po>z gO#43o#YM C܇g !?fhR[=*D슦!'A wyZz]I=eKQ;PqN8jjqsi05}l,fQKoK(oSRӷ1^Yj,YSӷXej0- Yki Sӷ3`u0u{;DJۃdxhjâKRv^+͗ẃRR1 ~AR?#$u{e@yH;uH͉9@jYisQP:Fc ¨[aynbk`_S%m
+۬{`uU߂nosQw+@6閵ǨM%(ZZ~A_EZ- ZnBԦ3T_5 vڂQguCU{!
+ܓpWp&1Ghi:\zǛxs1olxsh|ͻ- ެw>mcXGtݵf=ǎm& mͮh3_ mLL>j`h[+m]#s t3e۾ڦ͌l?BE733fg+ [nflw%omu2JW9A7xs{f]yN7Sz
+Y6A73 YJ0onq8!apg{5krלo޵]tYonY|rnS7~Kg2w|Y3G4?L؞׳Mq$l ]$N8oo8gtt_ 1D8wED8"5κ<<ᬽ\u3={i983z YX#5GmL!boW-er+ꢜ Qz
+e֞>[5e{=Zt tޞtշ[3'k \[Z%HytnO-]ҙѺ}&lsҙ=;:wm>[u'fN:Ӷe-$l"
+TIgϩM%2Hg]kKYms}hfes&ȮD:זg]/|}sf6gy.-e;2>e)>ׂruR :U)@(9[yrFsc҅9<v
+]a.k`jkqX9aήnvÜ,Z17T#0gq1gۭW+*l۶T}r~3ȽQޏ] PjQkk]^[9;ptܳ+ SΔMG(7O~9L0g\+'¯ٝ=07kL2f0|L,JWf698gĹ$qn"ͤ1✻usQ9sשU=*^ms֮30oW.-5SλRjcr.K9ۑCs>Fi_߰4W&U[0g9`ΦB*Yk0gK!굊9˱7Y s ̍ʝܨ sl3+F%=&_eM|8gm+\blg*5@gJ^&2W2ת|:o}mKܵsKntۥ\cK\0:@gr3-dҙ;I7 _Hzt3qh3<Zj> tfmrάmlYۊCtfmoK\^9@g1'
+&ssӬs}q5[b]
+sT~*tgY\Gpwҗ r֬u`9.AX{ZJk/kRlQG ߵЯV 87e#g Y߾*U?q^kpO(v:F}'38*`ykYM=~83+qU]tĕ>B/g\i9g68.qc{K3{>rMHk9ڇb7C\i|W!F+emu#n$Hq# gTӀG[2Zn5n9kLoj؆ geW{/S@ΟhK[]s[V378CΌhU|<) gSr}ҖV7UlzuO+ s=s\fZ/"8,{[,Hsf9~oghU 9oϖwO]8y *P4ΙEy}jJvy*S:nPgZ/:Zں٥CET6{jЮC|gԹ8~N:󳧽孻-{^~c ]6n:g\տrn++upڅN[ KϳNM uXca>>|m'gu8}[v"X7:`jAnT15薷z{ly8YgV3qm+uX{ٷf -om:_Yܣ޺fAuWtyw-ouu|ny먯Hg9Zj9 >g_8=L}t}l JlGZu|84VLOte>Z5;R\}ȲQt]cY E2K@W9w5vr͹ABt"{Q`O:Hf k,@v#y $ey2 $/dgkyn_CzA2je&@>tL}M:q:q:HAj=Y !!-B*B*SY d ArV-JvAd|b*Q; !]NBHT;!]ΌaDNFHIIjvB"Q.ʓQdda~!@B2B. n>HPGm
+"@B2
+a@B0G4"2 (k#6l[64޲KpVlcݸ{#lݶ0G}on hM
+tnzmEkj_o-a|^Y<S/qsN-GɅ^R-<;qLY%%/K)}vNDcjuiOMj.X5
+#q;[lՂ[Gz#TlC7]I{^W[{#6}_6aXV>|\
+17GlY9+xWl.Jmx9b)n=S#6]xIa,g#v\a9bǦ]kS#2j#7K#}#D8s{KR7Gle'ߟ{c*7Glբ2Gbu[=z4vK#Y#&Q0z.sf+ں#JJJt(;(=(>ұTHTHTHf
+nG&{nG2L7t,ݪ=Qi 5=QJ7#t<QPU{$t="nG &y$t<J7J%t(HTHTHGjHeent =H%H<qTHpTHpT5GG2Gɔr q($qRH@
+ C!I q$0NIF q$q$  Ʉ p2H8 $oH xC xC o$ $ !@8L8BPH2PH sI!ɄC!0H@ L8 A0H2?  Ɍ qi8 8 1!d q$ $3DC q$q$0!d!
+H('!d!@9(@rM9 L9(BpH2pH C#ɜC#th$$a
+쒨m
+쒮'䒨I.jxK'$jxKZ%I.=%I.hOrI r
+"@K2C.!@KQglز[KlevX{hrV[Z{.^co &5..&`]ynI`^.ՒҮ_R/ՒZRWyg\ZRڻTwKlAw}ͤ  .e9o\P2Kg{n!@%slwۥ5[^
+EϱVP 2K|U(,%-ۉ^!n~K,sow!g˟ NJv?k~#nR˟r
+{XUS-Afa6/fIQ%`TbI`TbIQ%Q%Q%JJJ:J,+ +,V,V,VұTZITZITZISi%Si%Sy%LL
+ C!ɠC!t($$
+@AA'a9$s`ada]ǰ+ t$t$ada
+mĆ\7qmdv{"^S~v.k|97b~^jxWĵXxNMvٴ;0IFF[>7mq9XKsj#v}{NhEy#c|Lŷ.I뒹FBٴQ6\Hhu!`h#cƴ6mF9ڼkH(FF2FFQ0394GF(H(05KF2KKKt,6,6Let050505THT00Ex#o$o7JFJF@)(E(EF )H")$5HF2HF
+FFBBBI mDCBI oD oD o#܂5 p H%܂4 T-8#b܂3 r ҈ $-H#܂5"-X#r(HrLEzrE[dEH"k-F "k$n[qP .J -{\,epo-I[E[d-F"mΡ$a
+pF9ĸFĸFĸFFFFF`CɌCqh#bHfqX#qX#0kadơ8y# o$#o886F2㤍865F@HFCqh#r(@mȡdȅ6"ȅ6"ȅ7 ވ ވ H\h#\h#\h# rrr$ȍ 'rፈr$ʅ7R)ڈ0H\h#\h#\h# sss$΅7"΅7"΅7q.ƹFĹF*BI i..FFFFFFF@CɨCuh#BHFuX#uX#kadԡ:y#o$odI :i#ꤍ뤍vb556ұNHNHNH:):i#:i#F`7Q7@+g0F H&ڈHڈHH"ڈ@ވ@H]x#tt$Ѕ6"Ѕ6"Ѕ6@ڈ@ڈ@Hވ8ވ8Hǹf45iDkHE]F4RaלѮ9# wM4"5i$I#b^Ff$ꡍ@F^h#{
+qĎQ__tY)M DFۂވ]aLſU8bm9]Y\Kh]bIFo}ވ5-`=WƼ? hwct(:(:(;ҡTHTHTHR#R#R#rG x;OqG)H)<##
+ !ɔ!rH$p$s!
+[1n [r?cĊGeċLv.8~iv,.1/%^ru )Zj.ێ]bŴm$K&[VAe[uX{k].)uik].*M%^9K/A\.j vIK7_k| %S/LWbeQs^RV'Ľ/d!+^W-+x-wA^}2!sL{@,zǤ3vzWbxm/q\(}X{oQ^B+ֽF\+ٰxoZdmۄTbsnݖxfE J8טUb3JxګXVK^*<졕LHKk%dNvǴ\|3RiGVɔLUbeQJ_/]lkpu 3Z=fZ<IJZ dAV=eIllIPY%PY%PY%BeBeBedJ* J* J**V$8*㨤ਤਤJJJ:J* J* *@*$@*bLP"@R|LR|H> ''$`$cJ(%%PTB O!ODI(>I(2NCdдzI2BI@(6 &&$ T6I&(6 E'$$B(6I T6IjAeAet6I
+~4_ዀ8|8|/E2E`CɌCq#bHfq"q0]ơdơ -dqE Ʉp"[$3[I I']%nt---!NH NH NH8"8"8"qEqEqc&"ql7r1b@n-&"@n- 7Ird 7Iɐdrd 7Iɐ,&"@n,!7rd 7Iɐ$
+*p!tR:ACA p!xH8 t
+R:ACA q!HtH84<)Aq!R5:ACAr!tH9d82':D2TAC9*s!p2Re8ACA s!tC$sB9*sp!\Hʜ̉ IRCądN\HԹ-% IΉ y霸9q!sB H:',sBRV*52TH\[T9Q!rBRDTNT*ʁT#D*T"AT
+AB9*rP!X"RDNTA|j\R!U
+A
+A
+:TBTJTHBкBB%"K(K(*PPPHռBBP=z { {IT
+\߉
+a}' ]Q5_y-ă6xܿy_gxܾym_ݫt yN@.: /xti;N<H Hp yy脃n%@yN4HD|tAG'$}tA^>: }; ՝pVwAru'
+4—4ʗ4HA>h/i*~I~ _ EA
+{@AWYٌ gXڇ7{t0Ͷ gzT<~^xޖ lAlL$Y& v1BgʫCaK6^O,N!fCI!@A_O|Frı'>J"=o %{K Y&bO3ؾ̪_ؿmbbd zδ B|~Dن;Ѷc{wؚbVGBl<߸lFuqO(Ylxg|J7e.?1&ľ&>3[g8,h⟤- &ͨ$&6ELoc8bMގC! I۹j3!->6gB̯rZC΄z 1##7$h濁 &zb6[-ؿ(QTg&
+R!!AH
+y)TR!"B^J*"$4TS!!/5j*$$THKM
+ ANETDHʩS!/9r*"9r
+…p!UOBSBS"`!)Xb
+R,1T- AK p!UJBR.J)XR*0%R0!$!UHACR4)dB
+ :
+B!UH!CRАR!/! 4:*2䥣A IQ!)"CRF yАTQ!BC>T2h`" " ,
+'. AB p!(*p!`R0  AąTu np!U܀C7 :tA}A߀C7or pCo!萪o!tR }ACpن@*
+  p!UCP8>*|
+ T q!UC84>j|'> q
+tBATAC:萪uBD:FJR#ԉ)J"ҁt "U@DP:DJR"T# u0"U
+@ЉI)B'R%t"ER脊 y P@ER焊tNHPtNKDΉIk p9")tAtNHܞŋTAE:x"t"B.R\AEҁt"(HU:x^Jt
+td):1As#U FP:#)t"F^B'b$E脌NB'b$NKDЉI1:#)t"FRDNH*Tt#E
+]=5#(]=R A]GJ=RxTցu#U`G;vxb< v#UG;H;vb; v#U
+#ymh#0t #yNIđ\wHu ;q$/ϝ $Iϝ@N IzhϝPN(IN(I݉$IߝH݉$yDV$IDVz"Ir'$WzBIH$A$$
+I&IR%0I4 L`$`$`$B2I?BI8M(,fyFK5a[0q$`<)#a[pB_bҀ$9$I;2\V$s'd$ϝ˃$y}|$ӃvH; >UV6NO%!$I<ޮ$IG3IE_bbe@fO HbӤb
+LR%LJ*d)H IRMET$IHTS$/5Ij*$T(KN "IRNET9Hr*9$r
+H$UOISIS@*$)$ b
+IR1IBT-$AKE $UJ!IRHJ)R*%IR!]-BT!$AH!IRH"IHH$BM$t4Ah$EH$&HT!HB$UGE $($IQH( 2*d{d$( ɇ&IR4.Qi\$ҸdI%K"L"K(0&I$A IP8$U I8H
+$ I %J"}I$)&q$A
+I­6B IAp$($IQ8H \$$I%I
+ .Ap H$%HR.AI\$$I%I"KD$IѸ$IB
+($)RHu$U u$H I:@HR$A IAt$($I:H$Z'$A IA u$H$I:HnRIR$A I%I"KDZ$IѺ$IB$%HR.Ai]$ҺI%H"$%IR.II]$$I%IR .AH"KDZ ɇ%IR.Qi]$ҺdI%K"KDZ0IѺIu$h0Ij$ ZIAT$A I:Hu$h$ ZJRDZIA$A u$U
+`%t"IRDЉ$y H IRDtN$IH9$/JΉ$IIRuN I@
+H~Yu d37Zbӌ }]o-y0l\URK,XνJ%=?Qjf5Η1&^3&[w*m6{gw(<}+y
+8`f2nlb%\CJ_1+(h"QkӃZ%[;q=
+EyPT_(BQ^+%%ΌmSؤJ0M`
+ 6La$&h0MS 4X<[E,  `-qax*()C$%&%((0LJ*`
+'߬pR7HpKYD'E}RP)/TJU_,R,KA|R¥p)R^\
++,%WXK|KI+,好RR{ť^q))RRzť Rwp)\J;]`)XJU;a)X
+bR2 2LIѺq"'ҺqR.kHƉ"'KƉNdJ*Д NINIOy|ʖdJhJ9Д9ؔ:AԁOIOI:,v"I,v"b',vR. HIh]:)bN$vuRBEbTAu*U T;D
+b؁TQAv*U T;B
+r'DQr܁ w *rRDQA@T܁H T<*x*(
+RHs(v;)N$yYDNeI^;eyYDR=8=@=H URIՃR'N%z*)z*)z*E UR@UR`U^uOzYuOzYDuOe^= ˲'ETo5eOH`UP=Xz*
+ReXكVAUA {*J=hɞ`TX
+TVAU=h*{*
+){*UU=hdZdXV {*UU=S%d/+'|"'Ed/+Hɒ|"كWIXyJʞT=Alɫ,򒽍5R=!+odoKRUOR=Q+KUOR=Jz@G d(%PQ٣d
+(Ue=*T [Ikli[IKĭ \A
+RUnՃ[AVz+*z+
+ \y
+'n%5OKĭ[I<+yv iEPQS$"(U(Qɣ
+J< yBW]yK%yW<,[+)y+U`WRWRW^RD~%E%E%z ,)zY EPe5^VCe5"zYDPBJ,"[MQ hI R%aA@X聰 zbXRİ4O Kj75O KİyBXR󄰼4OKj<!,/’'%5O KİaIkߢREуaA`XH@XP=z , RUsjrCJQ=HT/z(R"˂(KT%Uz,z,z,/كeْbIc'%U%Uz,z,z,E@YR`YRY^͒QzYQ$zYEGayYDQB.JѼ"[Me]"z,R=`T4 ͂ATՃfAY=p*{,ȞpT8TO4 REуfAYfAY<py,h8 y,UY<p4/px,R<hO4K<hf' eiwYEQ$xY^Fei ^FYQ$x
+R>ʥ |KGr)>TZ
+—MHT-t/ƎȞ=1.){b\^'rA\ rA\P= z@.R=Tƥ TՃqA\P= z\= DSr G9K=g\]q]s(*} KKĥ_R.Q.:j\Rf)ગ" \RDpK
+f^d0)\^B"]P{(eȱZ
+sY[޸z6B]ֆWKb]O'%CYx,R|N''SO5V(R}|MgU||oϋ
+ºO'%|]'].Zv՟h\v:"L!Lإ*a.H.qZKgh.
+!Lҥ*a.ha.a.'?7l?Oǿ_e__ǿΓ%ZgcxEmj߶_oŦvSҗo?hl)g< x{TO{ܰ}ǴCB;,>dYA[m"yS6o w6mQ՗ψ/'D[7%sZVc߾*?=]+<`H5OqzF;t?g<[yQcyHΕ3OHy/XL#|z3>NClUi:_lN{>ܯȅbCSi[8!mWoz!^y6ou d?̃W>ccuCuڼ<ɧCvYww<uqv&1Z`qJ.\{?tmѢErx韾׾~0-BL}Hva^y×}?luᠻZPj4XͤT#%yE9?aeD}݈;#g
+>-^}ۢ"Jg}-gS7VlaG9->ӐU3o>sK.31gƕ}rӞ[@ lXfQ=^f#1GeN@[vi1ӷ?3Ɛ}s8Q?Gd3;љWf;|sM<kҳ٭~\2!iwT?,UrܶE?}:v{|AO蜂"6UqJry5{-wN"jt24:ͣ쭔NhF㖝f9_vH8Ncv-fq g:i}gu "ӎAtqk N V=:"UI>wf'z}wb^;vy ۼw$!)/d~Jhܷ@F"nhE*{F'E<߮{xZ}->TN.>l}d"DszTqmZ}#ttU]?
+VtljV}.sK$OK^kI"oF^gǺ?/f?>/_[~_v?oo~OO?^{|Z!YʋG.S/Ϛ}Pea>kwsmwʮ֞ݕMiiw}=|}ڳfl3Ggfa?x"kOG~~lԯwF˸[D/x C͑=,u=#ъ&9~xW޾D` -Hqo=Bpg4`Ԇm;mj{savzȒń˾,d;2㦾4tk^)W'u[[MNfr@/[D[zagSa=`xy]z{</ѓ{dVv^Ǽn;uJQ.n|TxDf>O=e Y pjij_9xY(@atMzh=j1=4Db-l<k0[>Vna>m>[ƍq/ $cu |4OF0y،n;0l0ƉmD[6~߭ffwwZ2.FyqmU!l`t\ H
+9y-ۓij$[~t8=>i6랫Mfk}j.8m^"#ֹa^s³ 9x0Z.<L߉닝Xٖ+?kl㈸5]FTi4U3lV=/GȋRhJSh6/nva}new̴]_nKXۥ쾍$.:< Ͷsy3Κ|%hQd y671˼u\P ,iH=&\K%r GmsrnZJ <Wm0Д(_9OxE[Cڍ{<Y]c
+R%~e<eS_sż cSU峌ҫ5Y_Z2ے??bwp巐o1&`IM)c?T2q mfNpx\Q9O3kd_|ϵ|O=!VDSem_Ggl]?STq <8̜Ao 6{]j5\ݳ/)c̽a\ؼyG:WojFsea~;Z>{ֹp1r+ӉvhgV8hs|G]}q|p_g}3uxn[>F
+
+c}hEhw/a+k([EslHsffZkإVv6QܹsMT-\-7?Ÿan,f n-n͖^aΩ 2N[(葛XfvX" z߼jǿ0kO<[*^fz{wo)?]Ǎc駋9i޲54+4kɆ -I6/oRB[}3
+Qt;%#Ϩg9EkTܼ'p ŃF{{a91|z0ljzU]5'͝>\'l4㓰!Tx_83s@?gLUOVċFT;e=ΈQ9̷.6f&2-t/ffn
+av <G3_ 9n?Бl׭|%7J9*esԯdCM'F,.B?8<T8HMNj=v=wv[#Y׏':Bxо0ngyF^#CZ~_?}3K#о!YnvqNpEцP~xkݎZS4hm=U.ҵI~-vܗ8y_#Gg(Ue{#?}ZDÒ}H۶^kvy q7-
+iq3npS,=^b0ܬ}HW=".m:{]G 7ƭ +=^9یu}9\_uP]0<BmC^1ڞe!]k2yꞲzRvvg]I_z}`Cn+x0n`/9mFTsvRw#k5b>BxҶ]ׅ6^ T+eY3
+Svн3^V0 ]WF[ uMM|?Q.jlqf.3p<=IO~qOg-_ރx*瀟 WVYhpF`Ld\{6GHʧ~oN"_]NA}8o/x3>F}dO|Ucu!evO2k%F/HIXOeGf[d/Ytdd3j4nAO>_?nuv|bLY^kYj
+OF]F&}iCUxf?×t- ƭro9y;e[וgX [aa߿*<#䆳G z_n3-QF[><KDȥKwAV茗G/oong>=C$ӽJ?r`r0͢++i*7KEd/yP͐Mlm9H덧MOrJBVpn")eoD#^ɺN2,3x,Bme9[wmGYXyzWֵr<w2?'u[2үXh{xx?wn^f6˾s4 x~74,w<"?. 49=
+q`j!O#uzzv룱d&'kz5J+F>_EQWt#b"t`l=[OY4"s0^`eA7]Hw=UT>-ebSGj_/ENp'/׊Hczrc,sS&mYn< %KK31:{݁7 DXw{9F.lSCaXڬpm{12zbB$]W$e|ΊXpM&ixхςY;b1xC/-+y+8b=5ϐˠ}Ճ}Ӳ7]͝\[2cq-h?lnm7ë)h1^龵pc?Lf1[Cӳ\տ7F^OVۤ=ɏUcE;k[am_{y9+;:@1_JR?xk~#7c-f6w<W>Fxr-XKE&Z vKhHB69<֛ 8<Nd叝W0k7E1l;ٍy3n|wk#Zyh[zViFn=ISpq1Ea4JG(3/I)x(F\x} 9"^Z0.fY2 ^P[+#EޑX) F±j0㝮*99u \xD)Oa:n9iƁ
+Fno\l'SQŽ2KlC1DY:zMpH rd8ir>kڞD3ۻ"8F},u6"L:q[qcQ+>6*e&aC䱎C 58 Z;>2up|28nm+F>gm׎Ȟ7\^v|v8$Vmmڤ;×Ĉq#z)b z[ׅT7k9oXrq[~#LwϺ6[ƍÌ]Iܼ/PW;\
+ %^',.݁Eb=VBè36=YF[|GI2Gɶq:xyoyU܏Z>a:1Q3r-=rBx='[BG;<}Լ{ėGԮa1䗸l!^빼ub8g!̑Ѝ3[;3zjX捗pF>8˾rysL=ÄP1s)\^Kݛ۞WbLwᶏk-yc`liUݜ\(;=e3SSP=v̌5S_3BB lx2"2#̳$ÉX\~/=jdDӺ{3Nb0Uk=Y2He"tn)_\mMY}g>x:BcfțOWL|x{ƘQ+ơ|+,5HWLwN_:x3ؙ{sbd:m~\{ǧ:–/qn^&? 5|ܿ3s^{/oy47<~cی#tD"h~lG?ϊZDqѩ<|D8ǷF~ǜ'ٽcql'`C"]p1ʍ]A8(0|n*j
+FOFs{GrKufk!: fQ-_A1NyvQ>Ùi9W@MvCVʹFo&S6F]ϔ1 in|?ע=zN -cHRbg.n3/ ]}&/)xŧ{5y-Vdyw8vn#ߌX qt1̬vm$qrsRЎ9Ab_FgpL~qg; 6öގ<./LO>+g];p D.^ӱit6 `b%Q>Ÿ)Q4cGShnkkcpw/.dWYuk4L?N'T, zږvϾ~}LbvtjƹieIj)hQ@Xz {q7bPƶ9`lrم18,W{\ 40o8t>b=Q!Y ٓJgZq)eCp|{mG5
+F}Z#Ė_Q4R|(mY<rY.Ka碼WFY/y+sN- A"0Sn&¸k%:ɱ0zc֨hNqu7sr<_]T,a>;7w^_oG~S!1v |pn]F8h|_<爐.V;-%_\'k)“q3Cs =W\YF'SJd#t^$p;mRc:v=l7qWn<14@BDn]˱GA/ҫY"~"6ơ躘Qn%/[_j{}4
+(#4[H_*MfO*X{('ѬB4!\빶h/mv{䌋^7` 娲!vMS$wv蹆Q
+@Wi@#<.xy"
+ Zt{N*P.ՑB<ota[ x `IP3
+72yD(8 Q~0Wđoz=Z""N<Y3~NI60^gg8 g6IE'hTg*wfX?ӵVNxN2ZK "2;7a8JorMֵJ4ʧo塌!jnWlc5 EQ5[CR{z[C&&Ky歱?u2HM&|A(5{;oLM~LΞ0mMxl:fspw /VyG4Nkeb<8|ҡghd<lC1HjZYY=X2t:,A֌~IQ(R3d
+++{]>?vm SPe \h`/TDFy$Mp5
+,sZގFNwJ#MEjIɨ1Ə\7pZ L'`Ⅴ
+; 2gylcu7j R:C:lMq ˵i-E=*kq4k5H3}U`sej}?$s13L@T$Ŧ'le)o^jx1|+j=-oRhe;gfnkg~yy<7oUmسQ+˘ y =smy0.n+*@a"OovZe7B۳[Nl+CȰگh8IQ;k&g_HT3N9:2MO1|qf -OCf'rS..+]b`HʯUVIzS͌Y3v//
+㎥i8w+u
+*țI;Fy<sgN6؆_@۠j7<hvN2f̩%~%{ag/W1ťdG#gG-Y'7WٱRlo;߷{VK"Щf>ܟM5q Idqf RS0h-Ay 2D?Κa)n#Sp\O.N5zM4R_ڣtc~JVc3;ЩЕe(. UXc债¹,9& d;}[_5n'&ܽP8Ť|a.l1cQcx)ŒeW)zJv!23O>L#,FFR!|qĹDeܺ l{
+֞]NܨFOQrrZZF;3~<U|aeаҳsÕg*YDN"T>S.Y ]C5K,ܠq
+x.Գz 
+p5g[~Y#yup߬0晓LhQw*m$ۙڹ83{q=V3w2pν =ɀɸh*gz Y
+y7991byjʼEz,v
+(@͸&3.>(Q.>.'$<$rFl7O
+xay,,sq6kI392dIQ%P=00QH1e!$`V3+Gc.We<oִaAm)Q<ZXZe8:
+fq<;cs:pn~ 4&337m!R@+ҹrܡ _F,SfYu-kGW$X2^Ϳ3S>v+ w^Zh0_I ,+ "o !Z 釷u۳vLeƾxQ?Graw 0wc&Au;؉9_7t{&g8J;/B`H3:U Vp|E75MR3V1.K(Kz`c1sc^anX|ɉim'If&M۳JtULs7!;q?ddE"n-{Ta f׸df
+&3Ҿ8NC1hL鶬(5{sbm E%y{|a晹#UysϷ7K
+ʁƒ,TZYv,C_{* iQ+7θUs}s-ѱ^BP O9ۺRA@4k_ti[α?`wUy%X:D]ck19al/Ӵ0Cnw;QM,|#hɍQu-)zt
+1^؃SU@Tv9uT|UUh[_zi
+0y_kbTDͣG1}Vq[Aq
+g֔x)櫆9q/m⛕W^EjwuveZgXnֵ)ZU=g[}%n5NJy=@L;(qP1ȉ(l
+&}9 ~p]TTŘjaFGDsx. E}AJ7"GϚ WX-K@<u^o88\0gU~ x*uY5Jejw^d~(UVzK_0.q{U}hYnY|]UTZRTSƬt%%WYN{RqmQ=ˑNҴzܑZcmA.Vwf1yoN{>3/PcUy]<qWi˯NaV٢-Ǫ8LkN- #vm*D3hys
+}0z^{pfg:E.3|375JHM7V$jϜwz)>9u )b
+h@$G:C qrf|׆;wjV}MLw{ð̹3I?lx~|w{H+Bԩtop:Jw(-0S>kvc
+QxD>@KRw/xfv[ΖM_%;PIs#reUH>j~ՈUì^kހRrߜw\x~- [33\NG]Iֿ3z+_Be;틜֛k8qX}~<&WXz3֝:$2RGy9].׵JF鮆=N
+ LJD(O GxYtnG
+rp`g,׻!?vmH"6.ן>
+QhЍ
+}bUO{?j=κ?7oo.փg*?+ }c3,s>h*L/c4yHM&3lyx=̹sjtGX׏avDH#HXL@tjy ޳D EN#?P07
+;f( >jokunUI=2^GhcST~Ǫhp녛Km L@k-{,K2P [7堏,s ͭ׶V;J(q+ ݀ ##.}FM7BXt@>^WJa/LF'o\5F$\sH}׋8~-~~R\>|EJhT'G;_CArWQ`{Lζk\N$h3QRѹ6!Q|N<ů ]ykc[V0ˍwR}@Lw]E?#6UfD>>A_ %l
+ < nU"g:NvRZvcĿn %JTCDɻڭ3 خ NDV/,#J)h>N;;TZ}W؈(f DH]K;  PLkB[j>Yb",!w&vk *q;`6apDɂT1'3 Oɮ*_}BcҨ|+dB&vip`q0&Z`8k^%~;D.ci'g$mVB@)68ډD';H#kdjn/p>v{}ӪhTj GPЪɻd)+`DD(dADYYJJpl=J͓Ls/BCB'+
+ Mnd+E2{<lզR⅚Βә-Ia ղi""5 RiM1U-BϪ!)mފ_RҭُIeĵnfQ-0rT⚢_^ۈ.s@De;59alCjRG.60Vaf j in'Wb
+nG"h@y(wLFٰuPjaNMڝVrkM)q$S3?U4Ϟ kc;YfaF ȷ
+ȷ4?q8e
+q,N+3Fz;,!%BwM5.62jɳ!9j beJ]w!z)B@'ߢ4i1| ' U;}W8VY
+.cQ ?(2I;&r<ZưF Qqcu(4rc(ĥזD.m!t±4XzqK+[٢OF+NiCy9ߢq@|vvWNm]$lUkUkmv 5JL$«1
+ (]gX޴"EizxI9s$b's2b@ri0c!vwhPDD)TS ASxg+/YA>r):z`%>B8R=֒\)SX 5"q-DmMm'E'{5f̵NiQc]5QW\ t2׆iUY!ri뀒
+Ʋ1"{DB:껥 6A&brdpco'{{:FW('fHāF#fQr従(2' 2蓙!]_3JTضnLPiFUÓD Bkq4Ԙ ُR4@Z"*]; i"QBAGrD:ī \ !?ؠ,*-j6bV2^a<"džy3
+يN.Lf7 1%5yN RwfMﭰZX+N
+AAT.:83NE#E t2&^Tv Bq2%&SP= DCaʡj
+]0F1Jv 0D.ljg.O`^黔T*M@3GCgڻN.i"o4 ;ڤH
+q2)1ی`Dû\ {p ()r)sT3U?)2v
+[K_]D A㫦v DEm51-:Y8J:Y5 :% 5o9}ĚN xB2GJy)2 E"U;kᄰ4`"G)Ed1Hsuq(ȃ`"ɻvՂ
+;q2)y 1"؝!KD0T.fnH-&jtOMw1^bDFAE
+*d"U$nfVp[&W|2L]+D)Ŀ$JA&$D@^҉Yj@hT3-uB$) =p1 m-݊RU=`fJL#
+b!;WT۵NۼqXƒK{=}J$iē@N"%z'o.jFu\+R)[8q@j,QG )LQN|>%겷nFm8U,ۥ3="(W1dJ/̕|nrrGŌ(2'D1Nv &x2ŵ] F]9.;]b
+-TedUT0ǯ'=X!tȴU|7(C~.%`\f6"UCBph}SP YTQ+?ɰm }wRG%gT7^=DćM0%v o|݇87=tltAKTC)(qH (PB9sgfD~_ΧD7 dfx*(жr딈Jn7$c,O5V4!q}n@tF`Y'ilA%$L6%+;Up^'qfaa'>O
+DىUl=0/UB|gȱEιi1:K R/Owd}C!8l'D lv8u1[ɚdTJ  mrz {Bt˓J8 6ap:`LMWk D|ۛ]_|z*d.1}Owﮮ[3O~cۓt{ɯ=:mݺ_'|W/.oy8n3^_ҳ_/~}ho[7߯~E4BQ'W:6O`mo<^hWpGw۷7/Z}|翽zfQ|чu~1^hogLڠ&}rYO7\bGW!}Lo]]_n{W# ?_ܟsM?]6wo.wwo}GHGn]y{7@?&ߦ;3f}}yw~{>6_put7{~vn$W>yz훫M/ۿɗGmo?qwDGmQ>gmyt{=<}ocQݛ սwT>;u4<oʗʷňEkzח?~޾e7/9uh }a'X},wo#$o\|-c<Yz#bŧ6ċO!PlsH߾|G|#<󻧷7oo6_?8
+MzE6gflyϐyd^}:r~>g~wxw_Lzku2ؠ#1m4C1y%<6vE<ȨW;cʈqqo]~87ȋbrh*o^p{}OG6`sfh>-RoNG}Y?cξz.g0X<̜-_I_Ik8v%d6A<ˋm?.\=Zx4OYn]#9{蛫7/._]]F[S;&A;r'ڟ~MGm`=>_{Ͽ5<o{J8~yV.; ` `_N˭^^]_ot ws6e?'} Bo.7o*o_l>'l'/.޾z`M>cddxqu-g쯓vsSh,-&> oor˻W3x~\x ..qy㟞}A(wL%9zuJjz 3l>C~aa6/;wx0p Vң |$v)a\c8ƚa|{a.M8#9{K8\aοM8#94w ynIa86
+]m9
+Q;*|G+|˗Q;ƥʷq͊S6Q 5wk||یdϵi}[=0O7ʷt}5" V {qxwϱ XbG u :[6ﳭxk}lguOyh?<m 7B۟0y@gqZDq.9?o?
+E Vz}{s` GoGy(/흼t>|Up,`~|0_#u9l|=b&áWx qOz 3|
+~b9d#z_ίg8ޝǻ3ݹo+w+w\y߯E|Wء((
+Y.P0P6
+n@.4b)xǪ< ōYٻ&Dtgm=-UUb)Cdzy9^ʿ6D(Ƭ?߶B4OC(kڄe%bi[&&&<(R6GDn/껵dnʼvMBz=˶vcv74dƵH۸6l<gjs8kz%wT˲)wƻt Y\tBS&(;o6)$MC1Ru]G+5WdR>+̣LI{.cnū4*" 5g9D{>D-#rE/z829>uc cAҦw t֎:K2C<)Ķ8VYͲV,r]6m6[@k@:;fym??υ !备8GD)12U9@%DYM!@1 i?of/Yo[R7F [h;3XU"4#:2O~wq'=+ٕ\ Cc>3CMV{_<A"1Wym&ldD1 sY֮%[Mw*0='efD;v 76h ھN8]=5qBmVH#abF1HUkq!s0xYkV Ҁ֬4]r1uC[\q82ʌ:@g+0s =ݍ!b6,֤#Z]Hr['Kr]9Eϡ38[v<jQ1ԮL0AJd&ՈymWf=m+56^u1u\z6?T$=mPю6YLķo'SIj)ó|lv>4eòQ|Ld+[-"zu J{4$c'A<'Wb1\vyVDPȧj0j1[֋ɤzP{TMAqAnJM]u!w5PTl?=D{]k"NUәkDdi^[ 4m.W^/mHff+EtƪP#4qi^u M*J"BzE Nrceh; ϔz60 q=n8n]{UTkbós 4og Otm>USnKSFtEk* !jQf&!l|ը[7U(ME{/,T Y5hmnkU/~T[Fmm}v e/imINT[=&Ac)ӣE1e#}*b!-_t
+S-^;˥uMSFpځ
+[@ɤ2NvSsSpVC. 4?^m. J3]ơA 6O̶&Cz16"UfgQg:K7>HV@@GbPbjʨ66LQD,>F&dVI. &g' rDfLJǬ0:ᎄ'ٲ#Qڍ*~m6LŵPbϝ/*ĉ(B^Mcwm9F1&{4 ʵb"1t?S+AЩVQgΉ^m@Nz
+Z]4,(jjCѯv
+b&f8Q'f<Dh3?lQ%cYy
+!dEzDpUV6KjFf.t# ,vLVOUuk4@ ᙒۮ*4u.1R8J"bjTUp6$hNdBMd&\A4b*l8MmTUͤT.6wQM:=pJ0@3n*MRЛ% 12I ^c,w)QU۶'s uĕYU:!aA>O):( i?_xٙYNbC
+b%
+YMG+}iE,ߕ5!E܁AqUB0„F;:/#,r`(9IieC{v(q7I="R1?vB
+,Z;2K|$f5 jQe)<Xb~k@ cP+Q9 Ka"(D]vDŃ$b(Ķ#Y'p+ОUI^il8~ ,םٓ y~5l&Sae91$MѾF<t5Gl!-ց3F67D4hw3Pq<*v5AVeMj}fމ${QʼnrGBnSNI$x";3$xX&`2a8inD'nVRZR}x~?D3-;t"K%6Qd:q"O
+0,N֋v؈*1D5%0I[Ҥ9NSV{11x^UF%H\:^my>`exP8oy译\dag,wEӜAf
+h6F rca
+l&zp[!4U1/UX:)M:1V zkCEx%uX ANUlFn6 LɥV՞[ a c$RuaZ;u/;fʮ[&iɴş)U/22-Xa8τD7DV1fTNޔP"iZvq<&j{I<Ai]
+Z!{LɥD\6vf=\LN{NU&+i"R=Sr
+BC?=3ոOVDv5 CNrY%f!&l6]
+Y`z8վ
+XYyf³&̿?W/n<79뻷o~8ٟyK.|cݮ;/O_o&11? .|ܐ|ܓ/J,{X$w9wsF~Ϥc$#~IТ^߱DWJU['iT.[&:3qoWBF 3XFrMg43[ "m^ylW%s& JT 5r PF tE:oVF bDɝ3+-1c[@^3|oFE<aтUHw6|؍ I|
+FHNTCk?;,DLzb* hLX8TDxֶʵЫWM-J^S٢ŵ>h+,v_ظ;tk'_{NNpdFԯM].I-S|:dL I5JvjA6?fm"{1oj?jUhPbn
+FD;ltqx_CF[\MK0oHlĘ7$ơ0 iTSq2@Jc9 zpC]oSGtLDpdMS>@1</Q! f5R0Y
+,
+fxH;Ѯzar28QMVDHlB!W-ځ0Z@(DF5b."Qc w MӨwW4Q&+̝:4F?ǎ!j(ru
+{֮x,0UAj 9B1bnx R6~B 0DŽb"x` N+1t\6v<>m;,;?ocvX;bl.f(/I.U v1'!bq~k7Ej9ڵ5xB#U2Z޶cN]R$x8d_zC׃Hަ+wR c2pi"9^D|rX̾Q8j-܈Dv(q40<x6pw#WӸ%}v qtYo UqY"YD.Zݮ f
+chb67*``n0dg5nΈXsn&|~q3S&"eٮRIdzgH!PXIQm6/dw(\
+'TQw.RL'7vc/nꬷZJZ)Uu,#lv9[5sxk6W *V|7tٿ^Udxe݊,?7w؇2E^$oPrEdxGý@m)%"FCWcigѷ{HzbedjКIEɣI0!
+Uu'Unh&%cC»i5gݺ9Qn-ϊ:!F(:ԘJ%WFBs۳ y\(DF_bg kr= ȂBl()u^l
+=4s8uy [5k|u@Y"V^š\*/wsct>:LLN|gL7D樊쿉; 4L,<A*~qr+8hLh֋{ N6'2#vw6ᠯMP-mOiޚ4gc4Vh1qb$WUʠ2AT k_uTMnZڷ@qpaԊΦmƄu?*1n,lg]myD9DP*]^Ec9@4w.J-Np1oI v&TgK-㒚uY+ÙPӿ pSB<&Ʌ~MlR (n-@ƊA0&:]=me
+Ss2kqе 2H3 AsYoE˜zJF'5L)7i2#i -mj;R/.fphNۿvd#f̙Йo{wݶT2Z;m9X"GjK Yd 7}?CWK돕}H΂rw2Nȵ7-1j\;t0bl.L<.Uoj&73;4wƆKEjՙD# 0 R΃mb?>T,NsbIb@lcn DA **\u* ->0`xjڌ'DTr/*?KB`J8Y9'1tQDŽu}pMa6n1:Bw-i!s9hBh0!Qԕ yIZ aǦfQ:ZC=jEV%c#pvVvh~6Nv,-M#o_e^.4kh=GULb[x
+;ܻy02) SwcL$`V)Ga6!n;[ 'Aɗ.xxr?Q+X3 l;k<B2CL (qsKV Z5JeТ,9MLk|͞ud"nv= '7 RB\UZnSdHe=X˱+&!2PP ެ!pX\0
+33#ێ<&h!a ԏk*
+eQoDPm&& OQm+¤)t /某Ļh;fȟwLgBW;bJsѠh'5nF(=pRpdbRPS݃?!c
+:Dtzoc5
+h>U)o~vn*89OUU^)y@=wfU 'U2g zT(dvXD)ssɩfý"Ƹ'9dE*IΕ&,;(u<MfZt709帛{'RF5{@.WF
++Z6jX모6tُ$PEvwCM:I*>Z7 Y~ AFzȳ^-Ĉ`a{1`QBƊ5_L@ĄpR؆^' N⺐sMT\mձg=A0q YnDTqEthl1."[406TJf3$dC4<^j
+>#/ϬVgldͻmT(Z/IC2F V9MvQfT+}%ɕb[:U<$JN8jJr}6v 1l8Guv$ĶP:!ل:FQ-vDtO4ayq‚`^*%(Rr\fa%TrCdn-9+LF`2y
+ Ġ0ˉRu!RVЬ03:j%5Z 'P㈬;Ϊr!Y i8a@qp`u*7gASΨ
+V6)Y5!c=z]b.djLט"ݐ RH`qz&)_d/ڝ\W+ `0{="c&8-#!e]p8̪lɜ]kQiRݙ{Va^^w=Մ126RF"!< *}lU`%bB. / v'Eg>.M\DT0;f}
+'!MbII*1XL&Yn%kQ~ա`/I҃ wh,,mY2.w0 \`ew=XB}g\5 !pt԰"F&x_x!no0drW~ujC# ݥx;M&ʓ\x ,x%]dNG3YDz;b?8˝ Qd1^WCjUDGKbcE G`!U1M榓GREqB6mu&":9#b(|
+*n^8bmoEG'vȫq̢wԧȍFㄊpvr !#kNb"fN
+_j W"FVȆ˪3"k9;q^,j%&%qq+EfAR)1,ZitE;t< LC Kd[Z{n L^[ݳ(}HSf}-ĕaծJ"'hA OيNGd&lWPkĹ\$~.ۨa~BxV%{EVX `92r;l4&>m34%ٚn{s"=)vB&vȚNؚ2tM56 ;albQ6߱Ϟ/ŧk`kh`M?삸 rMuS.yS {}X71; pY [aG8Gέq8}Z?њ8_r=aӟޥl)d5N<X|%ȚzL(`H/g v@4x9u!\O<XC|x>Jʧ<X)?˱>!).FD>E)M)M)GaOiaOF5O;.;b*M*o,Пᠧ 
+>TZ TīpA!-FE˱AAa3YŃ9BwEk(J ;!bRw
+ʮ /"rP#k`(;’n(.ȡB;J/v&@Ń0Da.XC={9
+#p9*w.Ÿ0ٮ!b˱G]GN;b-G yr v!)Xha1)Hׯ!&=XJ
+iu9. v|MstRO
+}R4cJ;vTZF5RUv@+5s9^iw1KNj)[*M<\
+L]]
+{^
+f/Z`
+ SۑsS<Tx
+Ÿs;S*]Cf8Ѷ]uFFkXhѦXA!Fۃ9QM F)p9rq9vGFGOe
+WNTRkׇ'gd;8Id$qoJa51# Z/$e0qd;DGmDoF(R$DR34GL2}TKU-"4==RH-(tP\$w"l,ؤ0*#R~ l ~
+Ĝ0Hjʟt;ew8Wn PT¾ ܃~,)DS3&]Ey5*ARǸ)Xm ^Ğ#c']F)qmfd]h/UjU*.qZocͪRh6<Z`K ɠte-.ZP+|& ngYN^Ȫ~L])/SV
+ܱv w(LL铗s:w?ܷ$'^߾yqח'n_\N'?O?i]cֽ1xyKb Gv
+I6".l\6nԣKI;:Y[m U։Q#K }
+)J: z_5
+G64VF[%]Ht)JbdH!Q^j18A+%!TN ^~@dN0\<K0bOqOT0u6=c%^Iq1w bt(3eiQsc~h7S ;YeaV£ n"2
+ơ>WvI%X (\
+䈰Bd-'ϓlG3ߟ"bKP̶ORL8v^+?$>o+қWi  7f,8*͛Ǩ46)Oo?kzm,@ &8+87<T&I{o c02oPQC dێqd O*Ơ0|)M1R"N#x !$)qTrW A '働N7f#j $HW:݃HN*o|HQʇwlTI|dI&bל$pݘd9N%C B܌kjj%"C;_|#3
+Axq]=J[9
+HcZ‚J Y"5UE\]ޭIPRhFX@Yduݑ)rsIRT)4VL񅝬i&r_E0nUuR+PUjDQL`BiO9 | J BIBCzo#5:}L_\5͠Vd>eL ,8xKJ1u#XRuMz<U.+:Zݐ Ĭ*Edw[ɛIe))t 0ْYg᪖9 B"G'X.j:rL.ZqTAGTd>[,w3񃍟5֑EadQ!"snV/IAl]ɣa!Y9';|!)K<F
+B1`{`nIv/ɳfˣbU~B?OB"!4wNL6E[kD30QeS'
+y9hYWtU9]33bTI cW5> b'"'6\U!\-hCZ28OD<xjpP~@~bTc:!}UK-W_ݬ9i`IϧLI)$B{0PJjcF6aȚj0X<6$+z
+`7vzG\)c$M(V(72
+(T.]!b=f;w@s}6q&*+&HANt)K;sL^ۅ՛p&#
+
+r%e4JwҲr5ښdP Vh)#%}
++(b:0';8$Tݐ-jܢGjibWYG6c%s(2<x
+Ot0F릘,AEjWqsHTda*f'o(HtVpū6؝͖@1
+LS0^#ai->Wzqŗ<aTT0·*{H(qO8\PZrR/TmxpKUW;MHp0 v]Pl>!B=]#8hjr}+=ذ7^ȝ7{s^|#o~׷wm#^߾}((WH"B!œD<S$1]DQu@(h칂vlj ]3G{LQkۃK4ZiFgEn"LG$9kBYbM{Q}@ 9Nѣ&]GF
+/s! }cD.2P6)~4"ޣ=>*CRoH>'Vw
+~!]nT^Y:a 3rMBgE94 da;m NP 9P8wErƬ4AʥrΈ SA](A$;bg.mq` ) ;ۘbNĩI> 傎U遁a;<j7@zdYɫUKWķ$C5RN"7һ
+8Wx+-]kb-]Qm7"s=^E'rYtws#zLobA:rP5 gp& (B
+tAjܦVJk<_C/x Eu‘4xfZ]:o:1~G! 4RP/q%I:SQKP̐8h
+qqllUVA8Ep+r$X
+7J6xďb4͏P ҽ\İS!o`1G*lj!t6A/^褤a6^,#V˒ 1-!G>p0)\Kf(ɶߗ$yy*!Re ~a
+2ƋmBFvψNRѲG^'e
+PD'2$G:0GqeDֹȇt,q<@R
+6 煋Hv
+t'DՉB++U#x E3qWlf&ZD-G <V%~Lfe<^0;FV.^1f8D̜NE!Zs[`_$< 9ͩn&f1k&k.4Z^h)Őq!FQHDee)WFus @↉+T}"ѺBb8޶fQm?{$9/VyHrf 
+GĊV؅x44Qg|JP P4; 0aP#R<8o˹l^u:,c`mfAƪʙ65[dJK%ڴ/G,i@TlD_5"E&-W4늈!cohL9;-iI~6߽^EZZAX>  r7s!$W ꬬÈǎ*!H\@hQJg0N@#S#2I$3΀9}%j`遣2zd:P SPD0ypg1p8T dы\g*ӻV^ -Z8" 86=SqIjlH/kF"@5ZM|#Kus$ h&haa
+K@E|/ú@'u*uo
+9<@n,Q%DY2^,!'P$ #H-zXWbJ8Z,5l1K~3o X&eZ2dnՑ"+QL'dv΁Nٔ6< I)/A;בb#8_j^a0/Y?V_$7HԮS6
+mtGxmv˻P%J(#sNq-Syrx;|TK= rF P*TDoYEvH~6TԯΒ):%Pq@k%#PkM y 2Y׸(J$5@ X"A
++=+G9.2 tHay2t@2f%r>1ڶb #kFR$f*EFl\"D*R$,s{²{ r,-R(KYu-䥈ՅN9@r|IG$& /9"Jd"<>r,*A!Xd< )GvZј:@y#v-g/s(g.=F+
+ $%dդN9I,GW FfQ*HzDNi
+#\O2%* b1i /BCK"(8XyZS(%$f e)e5]<6'b,U7-rEZ},N `C0RTAO4EX*E>)XkU4 :GtD.e%hi"M#K\
+-lHP~Кvȭ(:>H̔4D|Qjv
+!הO(Tar-Ϻ
+^E)${^cb-R)jȯ`﫬S!۷8IZM 9")?z"z2HnQ v߀TBfZMRTA
+ $V2k` # so)fR@UI=%$sŚԟ(&W6uHdC.xdИIqE @-.%G`\ċTaON*BFuV,RՉLAc)=R@P
+syѤY`]'@בU(ű aLF^,#&~v#v]Ydy:#K .aREQMt4A^!$r_̸!04*CkXEH(j_FP#QL㙬`P\sV1MVTJNHg &eNu"nV%H@#ɨ)@+ôYS!_uKOg<[">nm%%[srVkiQЛh'A~:RZmd#
+9JA- l0b"Aݔ,nSLer!Jb*QT$sRZS=5WBTKWJ὜,e rHIF4&J݂1@ezS{wBdrECk%QRA%i
+^ pa4JZÁD!*fA"oR+2>5<D̡t30bDB9aϑhpȃ
+D\V$9HN 08h Zcy F<*YSk3J9і 0j u{)Z)4IkjޑVORi8撍namg[XXP A$' ?h% E;>qd{Ee1Yt
+@nws(R#'qaP?~\69N2JzbB"ѮЮ΢΂6bB"66bϮB"6ήήήb6B6"ή΢ͮ6bB"͟V| >9H 蕒QGʗw+
+8Ύ^GSf?EF6Ugz,=P A(MRucDR"(87r\"
+p,(P܏/^jbU5}bŵL@G `!BdY$'7|5> &!7\ԧNu V@#< 7s*)8WGC0c:0|hht7P:; |Ą # * =8%VǷt%.:tu]
+"NzlnEIB߽੅|Ndx<u5m#CFEtEĽ
+5MlVĺ<=I")H~E~h AdW?bJIvݔ(z
+94δz1]QDX.S,.*ڐ &xs9`ؾ$eUG]vhg%lʰU˭[ۆ2fQ46B
+.huĤҜ*qFsN*UZDY8}:Ymr/#=< ђQHa䫗PR@IS9LzZ4VDaEЅ0,au"ȜXMuPHƾ=Mר1?uN,Y9¾r
+Qr#/zVB5hmY3!eVC 0`,>ֻr ~vVv8cT5J1[(J#HxdA팗u(MWG=fDzA RKh> \!ƙp񮳯nbT 
+n<5rǤJB-0d:l(dUBKLI(&l11]Bj45JYVХ7ޠ6:Yc+%]S# "> lڃi-|,|=' m^C,!@1*W`*ZG<hfeW aY+ޛ
+$;7j*W)9L0 6*
+u˨CUmc:Ros$sجnmM-By5|
+8]+8'?<(WOT>"C9ֻp,:kn$njT"t*~8` n D l;xOejML4XsK+/P衶R v^
+'roy`/Yogk`H0_2*GHVќDFYyΏϑW| 1kڕxEϐ62[mR`ESK.^j#8e90eJ*,DʖW` wovfdTKB"Uxj+dbjJ$hu;L@[ ݥ7U I
++[c%ڢٝfkh̵} (J}_05:J-Twnq~n,:ɫ
+*z8*
+d dsEx ǥJr3*`$+:Q<4'nr["-_l_ȹ ۀg$!źq$n(mk4:zA]-\'P"<ڼ`^kUQ'<vDkvU;n>1P6&@</0Tb|Յ^L'dʦ9<A=#[RE2ąb(VWLYu5qWs%6eA޵cO%T&GBp
+m(}I&ՂӰM_BLa;AxX.yH@Gj W2a-j`ekCW$jdSp]mytftU-48Y9S Fp*КJR텋Gr/Nm\<Y;Be0j( 87
+<= YZ4PCT9pkEiL(}1e5 T[ݟ'lٴ45I%V7 I5C{a -#lxQ,!rGNZ DQ܄&*[*d.r"UIU+hڥ}N/Uq.UJ­hnt#u4#(;cx#MjBRAM쬡#fKj:^fGs&AyA/mt!6<Fb <b.dh 8RimڹH[*~Sǒ#ڮCr'
+h3L+ ڙ
+:nR^:I †uE !x@C-#AgԔ0!&-^ip҆QtLkJl\EpTDSX괤1gDA!!4h;"$c3[q_HzI1FDjLJ*rBYk{_50iAI
+5na[-O|U= 4ð+].=s&cjqd[V x!rI:YsL*~ehn4fG':Mu`n1X\EK ORltvTr$Zܲt4v GGRDhK5J '\U.s (O.@CϷOBzG3.xvJfd
+:-+BQtXdžI<O}<8?T$XVsr*}Φz.nRzVNjD*\.W%Tb0þ3,C+3X jL"=M?ƛF]8ݸbmFJ,drõPsB}V.>q~k-Ai(FZON ݜI)SXt7J
+1yKv}WSO*Rkť67G$_#[^2io4bsLoQB= V4+f܌"<Rќp 66mST48#͙JA({JLF<iN
+:aʊE7FKQy1f-o(Ԇ`&t ڑ~:#,+%{2?:6D߮}pmX9I2)E;Bp P;Ykݑ'ri@e<Vs.8Mn^!Q#Dq-n! Z>wٓ.5XdbÆ)=ZjU R$ iʘ< "cEl U2%(u&
+O$y|{̘JݜؤlYH26ͤ9?`򂘪獐0oB 刪v;
+AA6r@ m1*pF97\6*,{>FJ.dmUHuqC (r/a/*dAm
+CNZ6PuRr-A-'`k1ji]]cDZͭ5=zU3FpXb>o]><gڕçG>=8}PbΙ $ϐOI;nL:צ;9sZM0s0_sxAp
+&7 ߀ 7 ߀ 3դ쯵]l Yw= Ѿ+zE}Qĸ͙Mn/s+2+hUӛ%E^ۢ YIC~^K6:퓱ZohL
+-=d^!<b}PTNd"Jܷ\gƶ4gʥ(ˋ>3?p}8+FTelNAc,>0kJkL%GB:odtX,Ȯgs.uY-{=$HwE !wjqm-kBō"tn_FGBh)H*#CuvX/E am9T!FTD6iBH 6_Au5*o`NJj;4X:?C/U 1ӭv[݊PctP,FQ2'%d;:5Xz#SJ1{rogiϬ-J\KGeoyD:XJe._n
+Za S6%/!HֵȎ|ʵ!LvNzuZMԩ[+&SGzeTı_;4'$
+T0y䪇ڰ1mܩ":#јT1B ugdYG"%@.tp+][" (?
+`蝜q(OC}+PҢenD`pNjYe[D9 ZUhdCR;ֵ.ők\d?'䟒1ccgg‚ܥ}QG4rp"
+TTm'rS,Sb+NEc&.u1}]TPэ$Ju;,v
+-U 3jh兇-*NfRvXpk~.
+K5& gAZwP)0=aqq Z}&ZgYmlFBt }mR߯=k
+h)<
+_oT
+CN
+*ZB뜴캥\B)vO a!N
+lhv T&QNt"EF5HrT|HOs
+fi](s(QLHàgj S`Ȏ匆o" z5p
+6dƭG1-y J[Prڈ㹝xGhI4v51Hf>[]fQaI-y,]}w%t76j L
+@mz}x];[ݨIr
+pJǮ}'*&꣭Q&90Qr%޵L ZP
+"#!ڼyv0ޫVEfc7y\iSΧC$R)Cj؂ƅ
+|ҁ30
+/أe^>߶qP6CNkwq1)nt^oQeͧ/eL
+
+LzX@8Fx8ns+K.ۖ4_cDq6ζzdeUc,9J{3Y:pM" x{**gn+?oWI3Ϯ%ER{ h󆅭`ojyxPp0y
+jSi" |Jzd
+E ,G}xq%Q7r应6«K7MB-\*$|UR^F%dǐFLwWb*Ѕ5eܡx%:a:![GAnU
+Q%uy(uvMap7C K*~%
+)2b.NKgqydQgը5HQ ]d"JU
+źT,0O*U+u|ag>
+1j,=q@A⫍4䜄☵ZU:#]N
+JMT#-08Ҧ.dh–0%jbXe$nP(RT{U(O 㼃g
+
+FҾ?G^8VtP5hke@)EA]՟~/
+-F \w73tS
+> 91Kb}ǯ<.gY\Ŵ
+)n ڌo AjQ0#S8V#u^]!ƒ.Zch
+Nq̌mh~b_jmL'Z 8lA}ߋmIsfu^.[﵍% [UC!~Z7TU`(=y}tpdcQVq.Oque X1ZZbk .>,-6Wtn lDs?ގFA8~7WB5cT>BnQ̈́ <zy9Og?0e r7ae>.S";ǫ_3'Q:8hA$͠tR]da4?l,L|_\_t5J "$~F*$Tټ& )b8B8=^Pz'xʹo#/DQ+@ڠ MMo0طoU*
+]o;Ŵ 2&@(^k^ K#-rϝXvNQ5
+̻zm8NэiIQl`3W!+:!_ ʶG.7OC9)"u$ Ԯ-BCgК6B7!bb( 4_`dD6nlnhkQ:N8#(0Xb@4a+ ;4(Zx:j4UhZSzA!pN%43 M"
+tV9uYYNg8Qm#
+ n53ӟ;a.
+3!dq
+c? GU))[x4*4ֆMh!<G%)BxE-!z3*߂uy!.U9-m
+z
+R$
+ 0<[F+naM5<bH+=IHQGU%и^T W{n 04lB* &1=l r"aLm Q~V \I0f&e.E`8."2Xѿ*f_C BV '@T. 0Zg@ H|" }QB4'hopԄi_v$l a\<~4q`L\mM TX2@ uK}8vO~Ou
+}&\@1w$%@i#I*"k~{~7\
+9;dW8&
+2 t_LOMQ-E-¤ddk{CaG"P#@)m\phCsb%Uװ`PB4k"ptʾx}A.?|ZnA3KQFjUB/U:
+Xv&EnZ+Y 79iuqKd 9/E^mX]#i0p5F3{@OMyH|Yva ݎ-˜LZx
+w(F'גFO7r5+Yy!G ,vi %Lռ
+ ҃ᣤC_0"&X'qfz*"L~kg=Pd[!j,.V &5ISS9^޴MЖw¼ Nk}?H!q/`cF45J2Us~($'#
+%;)튎ܖv9,Autz$EO m!p,JJ}7Y wXFP
+#빖:s[.UYBzƀ`+`ʑ2<<!x=g,[Adb&}Rx/-&gOg0hmVhqǐS *#CCxj =}6h \\tv*zu@ 3kiN>!r7zAe*&IL3 k$Z1ɘB7/ײ{:#A.7Ӏ:fUAI~jK* I bd[ O\W#Y˃
+AaL "ڏJ=w|P qB0Рͬ#Q2ž,eW
+d?Ri]䐂S@box]ai`͂>Ժj>),^lo32vѼAT%oRE ‚ 6 ǝ(edɨ V2aETVc(!$&BiEF5+(vJ
+;PDGΐ-åti9Tzmi*ۧne.-LO
+54ɩVB#^Ӯ`ΆR~M*S] a
+L C:6c:W {a 6B_ ?`@@mوKv\C&zM0^` .F-#e"' ߙ-mFxbS9>W
+̪*cPϬCk 4oũDisURpv,aM(:ͧVz爪bXtﬢҧ0hZ)83/˳2#W&ʠ&ԫ䋨Z@aCꙣ]DFLLNGB8l]4 ΆMo&s:xg4ZlLm=Ā7`AWuV4bKu:e)4m+c Edg g Mԭ{֖^­`d(ZvTAW㯉;w3:a{ЁWBջTUsNj\ӱGֆ%HuV79=7LNס0rNxDR~y e<x!Lf#ƮqTFFHؙ3^q(JX=VEiY$5B1:@a)!~nFfXU*D)VCW gr"bA+M a*Ī.Ջ1u۳.pJ&̂AEVQc3NqBDrDkLa1
+#8߉ @I:۠; ۆ=ՙA^E0R=Cx;O!@4?y(#M5"@aHlUSm@ñ=XfP<\1" =4H#d@uƒ,~
+'6˙2j쏂 ؓUYK:mꉺ.&Тm 9
+l{SD)BVVeO#N1$VQhJgDպXIAcxڰpM&Ht>Õy
+.[*~Ch0[H BYO:BV0E\r&D%Wʾ hlb)6z
+Q eP\0ag=D%%LTtL@g{'vşf!n>\<4H\uN+@a!AqF\ڄJgcR:Ґ*qLPpDZ^TPN.d6hUh7\DI_iኴ羪 28u/(&PUdߧrLpǝeRەW+ѳzd$@">
+U/ngg2=^)q\
+h7z8#nju~`X.zsA\#kE`%$І’Y E/ e'6Pt%] &(z A1^IMUN RQА.]xGVAg_(GDp5M>4?ϗYg/iwaA u%ܛ4ݻV0;zMqޖ0hG"-dW n
+-O{:x
+RЙm^ CN
+n6("<5e꽉3&@<H++4ҟ;As4V, Ԅ`b΅қࡪdc 1W6 7ʕ
+JsG!I;Yb8&M%6ĺF:o4a/
++Cn#3UL&=mȑ< Jld)7=`Rg+dF&"kB#fcYUɞsETYu]f\%,p`AΚf" Uf`\y@SBB
+Mռ.0S:uN9s6$G,QwˆP4
+w܉"1wp!nb}}C Ka$;1`%h#P 7ZDm;URVoDH A`J
+RTF"vn` Α,\;cRqΥS0ǕXOG.8XQ _A:}
+EnA[ 8CF"vJfׂGdc\^xգ84x
+1EMz}sɴ;u
+O/|ҧ;ǻ?&ssxF.ݞNſnenpߣa-`Wdsﹿ ͭg3Iঀi+ ~t@
+#˴,xne͎v_p^oK&tH?w{tb?,6B0=Ŀ=Ccq~,[޴Msj_p_9zwʳ,mR#I=/FG6pVSmmpߛֻX;?Dm=Epk`ۿm/ٓצWvw/"YL붻<=:MD)//roRrC@]J0DݸC#)ݿI$a&~afEVIA\QXWsmDB
+Vp&퟼A o22q5~ b~Eֺ_8^<z5H}o?كדPПSQ?pWϿߤuꭃ 
+9a8>8qk<
+rb)'ˇ'<ߵ?iE/5/F;;+]ѽh+~ѷVs[ڦ==I^usѤ?c`޲scP#vt8 *y669ft-\Y8#/&l.+핖mߞt'<ܙ=qPiQ>:?pXa9z1~Q6m݅0JBMEç[w~*~ޫ?Ij±r\zp}xtJϕ'>¾U D`b 'tH~F"XqES=_5@CK݅;m 6m1ZĽ7x Hoc?NsC"埦ͧ_-{;{OvBrJ$o-}|sKN/CZv_©gNuz.~xx['ɴV
+3;D*ta^X!p wrZL@XKm>|{x╩"b[U[@1}8J\vsMIJSW#zک#6?
+ Ij~kdp<PcFJ
+\]]Zn"fէta1.h[u1r ش_ZH\rʮB4qfm2o2ʮͱyT Eۢq
+ݞ~Cu{yt{Ϳn8++?-zjO;n];8I4t^{xzk S׷w T־H[yn<}֝G+
+yذkXOjEgW.g?x:pb(Op<=$)C
+K\B+ZyGzz4؅ZPqUĸ~j6EwEߍT!i|:,m!p1i;NG[pmi=:sK|:ڦMa^韬>4j슌Efwhf~b gkgjڹs87S o/}x4 g,Yu@DO9?X%Iut{!
+Whr-x\
+>b-[)oha>:Z+xCǞV\lf[x8J9-wz
+L{'W+lҿݻ\Oxa*9 EqMq0Do5Oy斍J=Jb'c|bk)׷ɩz|'s?*OxOz
+;q;l|_}_HsOP*K͹y~h9*RGk"<z|߾^//'W 3Bs^,_/\N/tnXH~PZIUŭz~{N/6+_ZK{.}R__WӇMnvYO:+srN5D޸)ߦ'ZVk-u['_oѭfzmK/W{T!yܙ3r\:9}<YdK[f>^ȅgbU&;w\o^
+_OLbt:X]vWNS\c\K'k{kĺk봹prq[.A_>X_ $msٓ?<}pÍC2xL7ѻHt(<<mdT`tuz%Sqn۫gۗ֎u'l]cqb1{/>oS{9nib]߷yc۳ms}8q<]=8[9hU }bv*xNlۃcqGVu{5-J@^|=/ON3)}.No.J3µ,x89;+sߔq>9[:?˟bdb~r{\2.:zy}|rV_RUruqں.NΊKGœNinw{txs]jxJױ֡qפOkś5ոy><uCkTp,?vo+/׷[Gǯۥ]0\ڛ4kNu~|xTi4BgӇfcdzqX[]ħn*hX/>gvbOW<~x^{~dתNWY8굟ZMG}Jv_JD}{^lU"rZo؃rcw~ظDsM6VX݀@iM%vKYCYËҬӍZv}ߨ=K=M+k䈪/K"`,}t\m"^Ņ>˥o-3(*9=" U_nQkTxJd4mUlY7ۯɬo+f ` YC-ʭޯZə6R/ї%$YFU~j܂
+:gLE@׍dRY5/0nN]){"ڠg5__ U#NXƆ1R*7OI)rhNGB-UV-R]g_D-mkZMM:9U
+tE犯ɝN Wt޹np,"V['I(|-qRxMߓX5_͗
+!o᥄8-\64mUkl03@Bo tY ­*0A墣P)ZCt)@%mGh/D[tz6$@WmP4ןV^Km]Q -Sn*X޸U.FXp@I$\(;CwFBRjI*
+ps+bI(IK^Qo"|.߻.޷@h~g6?悋d6L.ӷT!? xv#vwpe>wvo2owog٧7j#@
+.}؞r.] -n]%X09<\ekѣ u#<V.)H,kKf"2NB > ״g9Zes NxS3]/Q.S!_0k{)l4*1J֌e[Zeq[Bs9i^}
+WK7cPe>ׅ4ӳَrExv§fe+dyX93MPt> f=B6m91iUt2ʙgrMdz!cW+M/d6 *.析)Em>?E]+f[ 6o$3Y,e}z|ȣl*Oh7dRJn;L˺ LJKH4;I+fzx1t͝)u~ޜ/*gr'^&JzfB/RQ,,m)g*lTt<{}l)ejsPJ]#Ju#iM_*geW39 ܚ^d3-̸d Z`7sVJ2=eejs4Wʵnq&
+O4?ʯ)\i$F_OXۨTǏ3Jq{uLi,ٽRz_p-|90ur4.ԟn焧Ll_VT~[Z?h2Oo/qo8gZ젴WUzhP}z(Oҳ \)<r\D'U>+O+Ş+ąگH;saէkPX^^S3Ft-8Nز=0Uy^2 γ9SNs}GUγ,<5CӻXqXsxBOr4{fTOd@k0SxVwYtz7^7FGwk 3>u%&N3h#X WPS<߄a4i^f$1ns╎J 9U4T8Q&GZu+Lєw8E6{Lo&L13 ʚ'I^4B@5SU2 !S窙B7C"́r]>LNL12Ec_-^-ǹ_lGS'7F޻x}Ǿʛ{{VXm:-ڲm^Q 4kU.S{KXgH'1D=_St$G\D<wU̠jbOd,ި`ecK(Tnμ$>Kivňm/Q.9quY`BõYu,yZ ;!<
+U
+%.Dwc:\Dv4979h^#Y+iW!3oo\&yXS!ejX>H$Iٌ;Xs3I WK-
+Q&^"Tʭ]<F Iq]gsAXk =/CXtg!)F{Hlj\0* %&P:-&V^tRI1.}l1F\u*h[.ѱdʳTt y|oc"<*[}~l[O-6h%yƧ.>xl)oDupENj~7%K<YAXIn/0TMt ٫2Eݭ ikrfSRdΛ%Ƞ "tQ]( ;lN
+5ѥjK4[i٨Xzf%XAߞ!GqmC-:s A QY'cXƇ:8Ep2^Kt+K ,$Z5IV^-B&E*b},TM4L67U(ki K
+3" N$)(3w{f;鮨-HHLުdmeVjVXOyyg3t!Yi=q&^G
+Rtr't>}$;MA'F.)La7վ0͡? L7(=>|9=R?g_$\5+6֬7 h4E I
+fWv h4n 'lwPbk4~Tk}hkJtlL:k4J{8ݠ餋Jh@2 ִVCeޕ[š6u_n/j 2K8j) fߙ)YCUv ̇x--YwPdNMjF?c^5ltzw,e;H7 vpbU3s!ϋЅt6ogz"!-6{^flQG^ߟ(ͅb:7ib(^(~.~({TիJ:FgCkgC\x)'ƹ}qGBG+%S*lht) b!^G\
+c[Z ]'Q.j+"Kq{<kX Ɋ*طGwx'omZJ֕&@F=OsMe% kJ쟷-$w[{:Cbɹ|?,$b "K!,`/h:2a
+eP";#3CW፪ʂ-׼Tw.]re"蘓[zbtc#NC j8N5Z::q`/1ttC v$Z::hb#p`bcc{k:~ec vc1tdmgV mGɜ] Iқw];æW8`{uh/-w躝<qƊsH0X|gDi%e~֧9g~2Ux1΋c*RKGAstMF
+"t@Stlf4'l*LhWf0M ٩aK2yc&MmFJ vS_jo8eFD4[dd HacI]RE/ј*f;ZQ-](;
+1űoXJ{<k7+L=Ptb*
+TDHI wWҋCԃ`ts~BPKJ!o؋&'`*8XC/&FK(E6ȔNӗx-&5ba+)hZLj $ 3RGcB$1,fm_fC}Wn/'KB%ʸtFVH*pA#v9W ,bnbO-bI̟a,T( odiQT"Mbl:a<q<-4pl͕ߕnhrΈ$?vfQX*1HI'@MGDg.ت/wU<ڙyG=NAu;XlthI
+tb(t0b2Z$mt8"LHR?,2k"ӣ IvO'<gr7ՋEF_" 4;:C"-ػE,2jzy,2v59ƂsP 8}I6澇ꠤ`y]
+'qu'~w<Q&"p%Nceղx8ZLm[EY&DBRRH5li'f'Ro7+^a@
+;Hә}#QMc8>Dry2hk4\nkwe|y<;_t:B6U=LJ C!HdUuBb(1aXhwgEEAi8ΆJ<2ӗ@ȴ,*iY {*-;=nBg;.Tz[Q*"8~i `DjqddחԳDtzHE#"chْXɯCS;v2rϰ/=CY(w(G(b={Ŵ+{A>J(U#)
+ZP
+'k>ݫ9^R>eQG/TؐEр%~]N7D[8Z*W\qug':0=7}xydKvfr/F I_K%}שTҿ.!ثsӑIZd$R:C$6FT=,3-/iֆ,4|qkjv±Vۍ_5S*Ԋsl=l247e*Ś6EV8y[>L( wi>Y""/3`SgjSZev3lTwTtGa{,[k+ߛSz*H ro3Sg>
+w6" τO9M>sj}ӻlh0zR8%WVHtږn麳tM_4azS KtJtF>G)={4 ;f)N))BrF0Ni+MK'^'N)ΠoOtJvE).5N ܈}GMKr|tEPGJF)StJ c4<);SÖ3bDɒ)8N3ƪotʱSJ
+ .'ݘHŠP]U$eG
+U N.L4IWDZS"
+N:k[۲.;9W!y7ܩ.n(V5wj\ 9Hh' WB-3V*CZQ|a/;&M;cG>s\<;xz\:6*<:]C=Dathi7Hgģ٦aa8rp; O*n؂'x"thjΆRm?w%7 IČytk;6cח޷BЍǁo0Cw*"ĩE+F
+Dz ֪!ݫUw* J/cQfK)RW-jO.k\PD'w$ړʿCxElxttQxg8A:}8%I۪TAtag:u{ᡁ@Co+b*8Wt{oug7iE>0 9AcoMyDn5)aqÝ4.H|H77i;k^z5X M]`<1ܫn(CwvN vFJ/n:거 &1NەĻHAL YNGkq c2\DE0&i%ulBR|1ͺ Ek.Q922*19r &5"twL0<fcx{8_ K<.0w@#5S?U _:qSB*ݷ>ŸTÔ]sSW0 D=ǸB G=kŸ r~Co+
+J׎=#_]y#WnGeϲ7gb<L<ش+I6wřJlaa[l6:-ùՃWT'(Z_db2>W ;S2UJ&NT3u|wjLH.Qд3:%#E9]OJwI?qodp6W Vwin2ingD)S|[lEZ)tWCL3ij Dϧ Wς_*S{J3l ElIs!$f kN) ;1?tF n3}Is3 lҵ$V IzRFBtunf1jIJkVv],^'.hZQw'{JdZfLd^֏ZoYT)R|n􎼴lBۉ;+hKu?-<m2u9Kxי;S[J@ګֱ^duxcanCHe<^Nbێ*My˺s/2]Zh(^U:+N5^Lo~VH>&uQb-f;@]dF.f]o&Nm+$%Mv>>UJ́ktGT~r.ovHvEײiG2ucQd/79-۱.IVFmIs4B4?a&cXd+2Abz8ѵfZL7x%;=}:X>tX[:d[(@1!Q 3n
+h `=(@1;4]GJDEc),
+h j
+Q-Dz~6Z?Ά2xzOT> v_g~J}_WgC)mR^w~i Ž~܏{=CxUErɠyёAW^?l]')Hۭ~]
+o?P4O r-Fl19hCD1QpVqak 'b "~g3$Byӎ׬keuv_r]w[EW カ9G3G2/~POhу\ElzJeGw.Mߐ^\Д0Id VWwqڥ;/jٝi,/WYK~L_/fa9ɢ ^[ɀ{&Yť9&9Ὓ|yoU @JpuHɀ{%;Hr)d9w~[{|ȜlSV4^FK '^!QӋkÎfp;)49?Kn##]A/'Ü {~Tj {<a?{UsekISGVʷ>: , n5ΦӖEW}dEQ._3s]y>8JΜ-^Ӽ.9_Rx0,A#>s>P^DV(^@D .BOS+~8N9JxL׺O<Ey
+
+]+Ok/7Zv++ctsp+f̄BCE
+sBlCRKH_34Un%)dŌћ0=B=^KX ,^FQqC ʋEqQG{/ w qq>qbjߊ+.J$$@ˢ G\+.HN pX\#`!HUF@@[/K  ^@@\ZX
+7o=L8<@A38Q8QҠH6V\єvW8̏wS/hxGVʭYw@|;6U
+Y?wJE+
+ 'urͲpљy%<Ѯ |x]s5-UO,2!Ϳt Ӷbx&;`h,OV:6mWizS6?[s/VWctvS[s᫨&wvQllG2*+ -UH6+R\Y6ez>}>fpȘj-WХDHf#وkS) 02gtɫ^t}iq>^แIl"P){~3qJ
+=Eϱv ˲t~ v.Bkuk~pq=_qD_g]38a,`6 z-nJ $<kX'S ܃,;D yr=Z sw٘@9 ;qιԴȨy!;CJ̋0
+_.?q{IH5vlgX
+&~)$1W&^"\Wyl S'6BᙷCmq0\2 0{L ^:dI ։wi7]~W `Fbd#Ff arA6$Tqθ$h n6_3[Npd)9ScO5Mm&K(j7o2b
+b$5;B 6NB|$6zɜ'-s$z)Is rdpj0(4%n1C
+缂K!`gg[0 ;~LH/m?*$NjG"!9sJ#Cr/*\a>$?$G2I˘ʂ`X3?\ˌ^f />SD~DO3"Xfw,14zF >
+o
+[v2[Ѳȍ*7H>1xfr7y{PY},-y\pp *M_f7bSoʭ:z!|,=T =GGct 6C}/\1=F+pzUfW%;7P6<r#%F-̗ue|h,B@0e|t#_G<BcEŖR>?Bcc hF!xlAyzr\;ԯCq}P
+RX T~?l񠏢hGA(Xhs(R
+c7tGACE i_,Kٸ/DQ7/Ĺ$x,2>l/N _m0/'tT/
+V p(!eH+)\$Ʉ/e+iH=͎N~) DAi
+E|T$ s@8jZ/0Ea\CQ0Fb/@pDx$jOCC
+CH<D\M, SJc\t"6S#J-J-<#v|g6T[mMM͏#۸֍Lá G@ Fa$@Z{\4+:qm2Q,7 |g6Ӕ" ߄|X<<%ɤ)9e
+}qEƥfsM[#)ל& 3k{ysk3R;LG$06l .6Ph$&(9u Bp(k~
+l| *9BcXp8N: @3`
+ahgrGBHށL PX8F!(G43`8ǒMgq謱H xX :!}#I@)!T(miADX!Yƿ`rYGB(+ Q$cRq⨮4!7͡T,;
+x D^ł $2,hJ N<B +Hh,Ft\e bF€A\2
+ΧѠG&
+=>œswM0  $z&ݡ
+
+ę W&09Иc.;5WXpq a0ʀW~D+,ub<+Z2-X3Bb͟.p]%ǎ7m>ImF\/6./YXKX Eu -Kx 0n|QFGϸpCKR^E5ntU@X1;!B"h``@Yf6M&b2YVihhd6FGGMw`_L_}׿dLo&?l27M)L333&M&@)L&ҒɔNM\.g2L&ɴg2L&ɉtvvf2L&ՕT,MRd2]__L777,+bv{{K"D!BP"3B"DJqF!B}:"@7"DOG(!B"
+<dR40 @%BoP"3B>3$H؄m AF}a/
+hi%B1"@7ΰ$1 Aң^1kG26 F @S: ,a Wfxy?Ղ A& L1g@&-8-UGOF(Bzc1,E So%P=8c_1IGc$dBBIG'Ncr9n[`;^Mv VL?[LC{ dh
+%Dx%}R"@7ΰ ?tRwy
+xźv8ϤoMؘ$l06!!G}>FQԴ3Sb nϦ2Yd"dBF?[-9dQEKRoZRp f%BP"3,u .!gN%Cv8$ p;HlG0kgG3f>s "cgWf
+
+^LVv+20!-YҗjhIZ"Q
+@L$=^#MQ(͠H$YF1 X#m[37aBzN+ L4fEq-dƢ%-EK6)ZQCK.K-#DgXni#(md
+GfC!s, [@S-̬ [A
+1n !deD]C4r& 1f;9/ h
+h"N@]ދВQK,R@(3A@U
+ !4=8
+B@ 0= LC
+@ 
+ 'qndLr `c(d`(
+ FQ#5a%J-Z@?/Y3̒52 [!xea^ÐiY!0$J C3Ð-9NZo/RGK
+h< 7 [J(} a0δї'U$LJV& -i%-u
+0h - Z%?rc`Ą!"uVCK<ZPGK'
+jxztt;xwP(0 [
+DU466%ө` P @Op,
+h
+`4 #4XjkCݵPYd`JO%7mj7> %u̢%=@Dhf7,h9x[Z dGK&i1I (a&
+Pz~~~<z0za`axvsTVnt{
+E-"4
+k-9Z@qAha7 BK_ !o첄ђCKeI-, aG"].֘Xb*J^ (0 PFׄ1D3%fx4
+L%'m$LJV&UvgdntJ&~ܠ bF$3(m = Hr VжVPgChχ@ǞcFr</vG!QHj}͍ԶFhhiВkdzzzr$vlda¿!0C
+
+R1Y54Z^H^/J/`^ |w1zLQP{Ba{ˏBʹw-}xh)x<N!4=JQsvb#
+zhw-R-R%P(a!F@d0Ta4\6Zf2+YCK4!W|M7(#^K%V2հ
+x<|7TVkfw#vG
+@BKw
+hI ǣ%bV"dĘ
+S(a,
+
+ijU^__kÿf<*(|~Vz \Nރ□̇0!Ahz29J|ex;
+ GP
+(]nOOOgk
+e<пf?pSݿ{VOd}
+/F-}Az02+!dEhb],Y3ԁd&Ia$ 7mcy܂{^Pѓ5o3èn–1<0SV'7 &2aޥI׳ҟ-1=#
+#,v6n7Zf{@8(ܩEZ&3ACҩaCሖJcv+iI"Mfb&g?3aenI\P?nyBob0Ϣ(-엉'/&<M<S ~٣;b%.yib-{ii8n7=$ Jam6_
+[$bzҴ
+DP~x¼Lx@Ń'7q&!drx19!Ӵq3I~ h7>gF=Ri((Sy vE` G)Jݻw $\9(V?~N:5N:ըjkkkTCk ZwTOkuخZpPF+ -&<73b^eu.5az&\ 'n*((a\^cI9&d ZؐNѨ)G$ZR(CA8Y(Eih镰Wgx+#qt&EŐC7J(#$GD8x⦈9 JKϙkW@14(<A #.%IP*<xJ~ʼn'*ZZZ+C'TOnRutt4Ϝ9ӬxQޠkmm7771@K&/8v3xԯlݺ] ugakYfXX 3#Lm&%lZm`9*5TVRp
+[KY02  }3MKD4Ӆ$T&L-ƞ
+#\hY9@yoƵ$pY#f!m3z\Q-i4,QRʒhI BP4xGsHn\[tgoq7&3z-zzXO6.Q/'<y` Љ`%/M+CK2K(Q3%zHР@-`ޒ%TPNjLR}Ο?߮nׄMNi7O<Ym-U@Kef.KEE7Ϭ;w؊`+m87m0V\f,>3.(Ks`M# j :`Z-FTqA8´$D"
+nQfASM<drbp0qBK^Ol|A*} . ^4FKiޖ`@ߗ`7A Z($P!Pj:uY~̙Sw(#TCCC/vk.;7uN̠ h
+Z:h;~>[mm.Cv۷SONXN`r'h}W쀙:v\F&h5y0$s 1pN`4j-ERynD" '|w9Q<[&$DBs7?QtFfH7^[tg iQ)$D$(7MB^&^L1'kܵxi)֌nLxoOȧ?io)=W0NLJ$e kkkk={]9
+{CCC{geeβm;wntɿօZ.u`kNXX&qU 6
+[`>5ȭdq[:؋JKn% h)Le$F"EKd }-,{f"8k"lH\?/iZ1ƭ}˕ 9"pO?&k!lEI!StP8.bSF5敾EG0MzH[+yc`C_Jv5=ZKt\9)Vx)@^_}ʕիW~hiŋfR=a^_yر=o\KJJ0 } s\-vc&)rr]<ùh"֔h!ylH\hrfXF{ҙf%ђhI -Bkʤ!K9 xhP$
+}M#TҜ٢"Ed$.g;:# %%Eܢ;buӓ^[a,lItr:ŀL</ xzG/gRČJp#K(Lb Jz>F {[~@ 8H*v){.]W׮]Ҍ iLJt=^M=N3htZ:n?{lV檯C~gϞqx:WaX(wnL;.X Cw\v݊kX00ri J:^,zRBDKAGFSG%G&C&AZ
+-=p/+!9FJJ
+q=ܞә$F^G@XYMё)Ip@Ze&-*_A)DK19o\3%:I#F҇ 6 , Ν;۷o(I(>}UuFw^UT@jѰƍ7o޼\Qfl|:<<n-5ۻ:Ϝ9Sjmm-w766s<eee[q.bWߊ-`N)s`Wŋ'pU^'l(qa9V+2Jf؋Έ9OcSJB$RH)23N9x``2u;)D%v/!SZE7٦H )z6kHBۼ$^_ILEgJp ,$VxLL\SpLRgF@ߌb~֪ozp͔3{Lߣ@C٠tJvJ
+Oʕ+CKj@eͭ[Foݹs6A,V| ^_`\KKKϑ#GؖPRR15 0̕ 7p׮],]4% y\H\hhVr+Y`/:̭tN\$.[N!'D) IgqTSH슉VH!A
+C7)Ȥ w"z.ZzAU
+Eg$Db&|$xBIIB9v&7",HPI(CqTo>Bq"4gs앾 `͔у{9 ϻ@UA=Rd
+(J=
+)GGG/*AAU+U{ zȈݻL@A X
+Z겏v z{{;;;=MMM{I?߿#ݻyaxa˼0^. @x\F䋛7o^vr\Nn%+EOn%)Vz*ǣ%9n
+SP01bQ6nL В4- -WFFf"qaRӇc$lH<?H\
+7!FMt&3k*3Fib%^w qW- -ES6r
+FKPi,LKZ xhf"q)GյM"Dg?O^>Q3dk89iW
+(f#`.aTIT; zzz(ɯ\rQعsΘ7ԏ?Ϸ-#YLWla:766vjNNప$hegcǾ>|xCݻ:Waubq9>
+lv kO$Yy1<ltVbV  ` 45p4jXVVdBs0O&"XMlb%( )LB&v -)EA%%GKOħ$|ZzYn =g?ąxH#g c$љ$(3AKLbR-E_'.rVz&(=<.JG@Į!PG7#ۈ$ R|tttXUx=ztKO?/t{?r߲q;hi v=x/۝mޑIJ?7ԣG~ZUUQץڵ4XTڂxWH 0e1{a/x=J&r+&Xn D4$jb9zˇ 
+kV(rqrD#Cؕئ׬JB&%gVb&%aT-)qU)BzȧJuJ|ۚ9fl=-1gkH&n$(.GqbHcZ˛%[I/
+()E%no4<'RIIg%9@޽{7T?ӀG׿{fݰל
+;+
+{6p f{hI%>
+W>iI&@K<߶Ŭ0PWRbhk[ΖKEl\*RtFbuXHbMQ^̢)AK,o^wJu⢗ý:nuR=7o7JAq7J/^l.Ɂ8߿|/r_?Ё?4B!w@[v|:-]qC$ܾ}LI˗?~_j{{δ/e>(--}/<V(3NQ)'sTO^t7 y [J[H f`!x.nAL1ha%F |<D-% 6+B"Ơ((N({2999()ƧLjlRk5v`Wc65lQ@f5iTc7AJ ^7J$@I*JsU,Fm&H1s#z9TB9"#"+%`To63%^wdUu4J9v+ͤ=7% uLASg0(]SMAP?
+Ś=J/ (l%Σ%0 JJuc3/:M6Ɨćݹs?66v"˵i]]]{3ھjll4fs
+T+ 625ɜ%%%,VF$ Ӓd-oB4x4%m3kc ELEJמFn2dqE8;%o-ELV>( 3P߾}{LιLҟXx-6\~y ѣG}w=~zSH]@eKN>mVSSg8uҷ0̥Y3>@:OKe&87GXa1c6` V&W(aID,ūXH &bx
+ԛiӴL0 z&x/ŀM 8H4b^#x#F'Έr89X8gy%WW dJr+)n%ydV;F5]{kfX1)zH򷔹K^1--VeḔ%^.b%[)bܹ^1Pj"P:T >(H#G6}nҸ?I_?~ܝ|޽)7nhJrJ]8ϲq.e:th]vYY;0eX؂,RA&,'kIKԖt &*r],0ih\ .pCB`7%y((>gj!<JQ12LSc̺YG1g!HI M0V ܔhƮةnj!rp4 e6q׃O[ W1P
+(Mq+MXL@iKڢ3skbc9Z/2(ziWNɭ-*^a QJ---
+r+ɭ$
+J̄"ߢs2 K׎5XE٢"um7@KBu؃,b/ѭvGw+M+{߄(Mj8u殓2P:{,n٥K&@V/@:L%#
+yh#PgR"&.\(&P|Çٿ@ $D@<Qrct:A#.ݰpbxϫ$iGɔBiGGsm
+ḆȈ0I,+$ϊrm$ێm0;cg^%+K;g ̀=[
+$߄l7""+RT$^cfT$DU9i#C%FKܪAXJlX{+]7q=WIM,q
+ ܸqE <䱀/ա"Oj:Ϧ,=p!aZ#v?_۷
+Zh4ȴf͚EfX" s u[s"+pn|7ۍdv`~74ɍC&pq.°Y^g+ՙa#Xe PSJrr+JA(EMf>r&%mӵg'eDFEFftI(q哈 p1xEpB DғBX: 2S|WKO >}fcT$9(9vX}Ν;7J/_T()6J;3@/xlrՋ~^ǏϥNg^rH9O:y{n}}\\*7s`C=)F]' |L` JX 8pm,Hg>#>X%?ˠv H3-0.14&.5:Z
+ ^+7VoMjtZ.gp.$fEzpڵkp疙0.7[j+l0vN[.R7[Oyx|(gy:'
+2z임qnӓˉ`O?ԝÎ۷o7gUp򇜶/rlȭ|/dElI6y^
+u
+J*x:pd4cwєO@).R!M* %kKO]v ٿ>iuuuuF>00У PR^~}DZJ@dt6{=\-Jyn:qڵڬޒs}y.NcK#G>=p{]kZy8 6>JJ(%%2 hQ # ~F&0uɀs#a] iV
+o&%,@&$ JT1)ڱ" b]V "(ϭ$VJBo1$*IGoj|40PʦTJ߶o܁C n6 FKݻwJK%dmmm''ҕ+W&?|G3̀=;3LǧW\-LO=:Ϝ9M.>v< S{'',03XQl#7;0PJNbJ0D7x( !~+$?fP3,#1L0t00`J}ۈt =3Lt  g6y//W{$l‡&k~s')gq+W&I\_<{< 4
+QҴ
+ބzMu,d1΍ H0_IٳKrriMMMĉ ϟU ( T
+#ER{ǀ=#ZfuXVX;,{8< 5I5XɯJ-^_
+Z*Nݼys~*>SeA5z'Bk 0[FX
+RdPzq6# -bKמq*ҋh)2(3%VZr+ Һo&\oX^(M+=)zg[(MZDBHpK0_Kݻ[ZYYy@Z[[{DL9.ʻ*.(GGG(i
+e:dR0KC[hQ25+STn{fXIԇJXcLkML9?0b?”7ـBw­WRR)A[|ڵku
+N|e*44o^:\c2Rq )h]d; b
+
+êKsk0tQ;7g Hz@
+y|s"ŅANd
+Zl1#>Rb-itm1&(̕ZM(Q)zFPIҷX{i:pOպnBݓm&%O'}&Š|+---+;tf#EGGIewwwjppK322ҫ3Pzӓ'OF-?U@d4ꆌx ^0@>z&撔=ٝK)y'O4᣼#Gc)ܬ$׊;T떓NQP-nuK# ̲r, ܌p3n+uwu0u:Lu0-zvF hR]]
+455Ljii6/L}=()*pEy8Zq.l</J {I8t\+kO1ë@k\r%3R0pFwHdaZHJ,4;H<FⵏiNJf'?mEEQ@'zt ` Ai$WCg0Lnm1AB)=.=ICNO>|RQ
+:
+}-٢a~߳gkceewf0N+i
+*qJ[[[KNkkkە_d>ͦ+N%|cʖږr1gR(_L9>gJ=J^%l7JJ7YMJJT -9fːH8][LEEQ^L+Q)zF7Q)ҷ0z9&pnv~[ۛL6$I{'R
+;}O
+T
+7պ%Qԍ9iIx9L&Ep[v&
+wuZX&-n+={eTjnhhg#"+\@8Qex"</Rەd6e0=qK.pCAuuB تҥ8<Xvz/9MA)֘~J (Q
+70I<{Z7 Y xQd+*G=ޠߢn ӎn4߻w4l(]r C/γmZTwؙ344?… șOΤ|r&3"S!&I0l֙upX"5!uL{|ʜIm݆ b]O>ֶhajСC 8R# F:ps\*0*PROOOr /2Ο?' 򱃭BtmevZX/,Usa@[o&Lٝ+vYz@ "l'@JJ2 (Haa$!F,Fb;HW mFzSQD59%^
+[úpS?r%S'z)Ew&qi1î6k`uh_h.jj%U ة{5.PwWCg
+p.93ralس7 p[aDzh`3%J:JVJ$r4,#I^FzH"#"(gXA=7SJ\J11w%X/3i3iR
+p6l@e76X&+--#gQ7݇
+
+jkk?(Ki+@-Kra sș.ܙLJ'g[qΤ2agL5Hjp7>ݻ (mV/7`S9pY5~4W Ua3g|YK^[Qk}1n1 uy1 Ņsqy8I-1 
+ID/SI25m_FKDECJ\3%؃1zIB[dv|{H1doIgd&1g[dJB)R)ۤaR{dR9պ);vDIQ7&fuӂ
+pm8FJY[
+pHd=TF1#E_Vd$QD- JfJ%:&/ȳ5L
+qI\?哜I8Ij4]YYR)딧NjTcR?=ʕ+^[p
+ 8
+ lWn7lW%5D"'1F"<rD.yNFGFIk'((IA DIJ
+ 5NLL+s e&- g&M9D߿I
+PAMjL꧴g`.իW{L7nܹs~'@i 2ꏇz!ܰɩ۷o"gR6vp8Iy^b
+
+[ZZ;vBr&3
+XJcr y8@X/##LJZO$?[n.ɜIAgfbLZt&r>Pcݢ"gI*
+vP |
+
+ILZpnEJ J &5IS27̤g8l̙t~'p#gR>CΤ lלŜI5W\)3R)__\UU3
+&9t\f9I&eoLBc68.ڵkU/_./S3 \6sMM͚b@۪P
+ik֬IIŵ$\jCR]IQ~
+`[uzovI,geo,a۴eoWTT܇ JP\$L]D=<*:X6KJd\* !Lb$U]. *ddIE.\ٳ|<|Pi|(GQ>\o בEΤt̰T\`r2p!I #uKuBXԍuG݂
+vݥ'gRXGxByJM6jS`~:ד<jӉ;#HhgEA*+U]D]u0CnkFWBjD{IB%jϝB]' L^:.*}sVJT2pdr+ȭI$*<H225TF1*2("S@I)BmOuJnsII8Ϥ,3ϧ5
+7k^vRm;){TFjnNn *z&B=$@ކtΦӶLAs
+3 VҁZD Hd`r#,edjҩ$HW$2("lkJr M%dF˧)TNIPKɉ$> .k%Un
+_gڦ6S{4
+p
+Oޥp„ 9S0
+R|Ped㮦БJL&$љ
+=vƈǏkcJhi-4iCLJ߼yh%Xo)֙2Ry`[Q! Jt\#U']DVtF@,kD[ILLT
+B/
+n33׼f͚-4x2СCEt $a2#+Ofcsay7n;핏ݿQTC>]?Vx'ԱV^,l79KܑC#8Sq/Lr^;LD#
+&{I$&mb$rz$7/F?'>]fPܠED/F26eoyn[LJIIl'YR9 M[M۷СC)cƌN<y\`f{eKluuu@+`WݻwM(PhuhUX2dOYiXoZmGb/Ca}WZս
+)nݺӧOOg0@mh*@nJg~ʕ FP_iΝ-:.z-
+1+@K(HGtjTHS<${I"#I!&mklH:uj#isjH'>&-2ҿ{ h6(N
+X`
+LLgl# f {@YY
+-[Zт /9sSLyxر6RZ =i "e-! 1Q8Fu9[n)e+q[pw4pQ7Y=SU4Nw&0eҤI4u…sTb=q~ hM&\V3pF2x=Ν[AKqXqرNc&*Mv'*aph7rpr9].N\ܷ{rzUvSdt5-5RX#ֈL:ˌ [c
+Џ~%FZ@d3D2R X H*\ ID:$ F*1($1x4FzGNNO3|a#(r@I0@I`4DVH-`Xw J J
+'kQ7Vf
+ "[۷o/)ƙ
+T ZZ8qĪD4bHc3BC9Gnl0[93/L<ѣGwAty+|ff Jq$wq[".?QXX En,
+nάΝ;'1˨[,nq9X8>[lNjIQ7Q8 Q:zȷTPdEx&L0VMUϟ?G@.VkjjVuuu`#wس
+x ȁP .-mKmָoDԭ[OGB u˞={9SLy:ќ!Cܗ ƒS z`4
+0u3q[# '`գ;_A pS$ohѢʪU)h*.Vvf
+8.ȕ
+
++"$9mڴ2Zh]V*6mZ 7߿SKg29st
+:nrqW  
+w".^3-6D%&8tmPeze͛7ӧ?=~.Ç0(1C2q
+Nc@I!Iy…s+V,Upk
+,8 '=I}顰p((%O2en)իWȵ\fe߾};U\~=.]s
+:e#}ᇧ>SAx,n8hi_ԥKv
+@K>O|{ -2Rs$ޱM@I"8H J2AI&(nP5%I=(1"Tjd}A {TҒJ
+ғ #D1sظBCCHaDHX,Vjeee<qjV$n^yCƎ;Z$zIܹk׮]5@uf +0`|?X`GPpPV-[+Rtl17 N^&F`p%88e ,xƿsɓ+t(Ùqم|UW;D'3=)6R E(w8>H3)BpWp=,0S/}
+I*.W~
+w1S8}LIOы_rG ԇ72}yrLnyÆ 52N޻wN_Vq'.\8erY} O?=o~9ș@||/ aw#^7ŋ74jw}N޾}TܙQihK,1gΜ2N\&Lftg&Wgt޽$7}*kt
+2"L;Hva*;&#œ<n
+3yBy&YԴ4@zۼo꘸(1q[$dY%pl4
+8.hjJ]]ݘT|p:Nwnh2ѝ1|2ѝޣG4NeR22JSNr9U"B/>ⱅKY@A
+lHQsK듒pV`w'%$Eފuzcⶎd:Uݟl=}˖-=ŀ@7`=V}vVM 2:@{8`k u I
+<HS;pCLIϳpk
+ۋh2GJI˗/_"HhMݻwȸ}
+鰂>q^
+2 ~}M? l #鱅$7E0n2nnnRӷ5Lj1bRVnE#7'>i*~3B-G-2p&yEj%x@I%(Q'(O'd`@1xd#iD2 \1R0 ##EbaEOVQ-ISyj%<*x'R#)gϞ=t$nK
+4y LTrmݺub
+vD*[ vOG>iҤ3pKgR.( pq6<'̑
+pae: ,\p
+=e@K`P9(n #)zF2#I*IĀԙ$8W=
+w0.IAh4mVU)SMh8 '=˨۫,ԓp(66Kb7 Iڳg)2򨌶:W.O>
+yA& Ʊ6/FҜIxI+PR J*AIOP{@@1x@HP2%`&fV3&̌9fd!-YB6B;şpH$(2R,wݻKqsgтRVsNμlx^[$%1)Imt,֬Y]Z`wMG,.\8f
+
+FK
+IOV
+9D9O#OڙxOVIIo2)m&% bR(t")JLfh-$ʢLvG9z҇ O{VSv){A'x|,-N (^1}u@iI@iN;pE{Z}>6mz楪˗?U`fΜy_ }UNЮ_~Y@btG'9X;62JR*pđ\qhR$>AXU2XәTeBGY8iNzQgmnuɨ"6*FjV;*;w;/(h/͛ύM~fgVȧvG~Xv+c3A%/jSq꼵'qkƍW^=(+RYQ)D*XTP_u
+گ4v{/ˉKI/xbc#Bh@*XJ Z2!;Dofbb-V#LT:Z%-GI$s7Vjη!&w
+\xtx9: D[3✖@TZ d*^$5 JLȭђ[j\M^՜/I[ EjZGL>Zɟs!#xwhFk"23kdX%%3AQeVAF Cvcc~t+qV'}$
+$
+(!P~ΥAEs3H ܕ{N*Q화TJI{y `?
++%u 0/+% q[+%`>gV1f= %#"O>M~FsnXt
+1X$(Oxʬs-̃yPTt%wXu֞W@uXdΝ`neU
+[)H $-B(ap~#%RaIJ<RNȳiޣ~Ǝ;J7uI:VJ-^xII҆ 1jT'F
+ԮD)iKIp x<QgC !'``w&6e(-h{(8z /y_e˖ׯ
+gLcs̹\ҡ
+׾bYe{N-Av2,6'* 7L/@#c@). j~6tB Unѩaԭ+n/2&n}Xar(˖ct-`:oQ#"&1& h7n\Wn߾
+
+2
+V df
+ZY1%Ռd7(a I$sAIs+i$
+Ap!MS;',ͽw[X ԺGK>OүdqyAQގ͉4-$T$Gw2$LP0el ;AɏGP'(0Q)[ &n rN3=Ry(Fw\`]pp['+c<R[=&~wF^s<@7zo-\phJLJb
+vYmB
+#>n(t(}!/<9'p0jVfuLҲt^{~z#G߿hΝ;V4ު T5NsY:UO2{Q{^ŀ2`SJw9qI<p[d&A) 74EPJ$(mMk
+I ‚
+8֭nu̮~_۸qjݶmjuۡcRӕĨĨVD3IꫯT[*x+=+_ׯLfM+†
+%͹.]Mܾ}Tgmm혤5k vP@ܹs_O>})`.)@· 1̅Kw⢳q43]\,'2g!8ѱNhdMAHP2ђyhIjJK!M^%M>i"V-&^9i~3-'K0W:EwQdC-oBeقHDi+k71_1]H6,d$+iFP$?3f@BLS4t+qBV
+!}BIKaD0BQ8EQ8L0R2NU6=^銀Cl'x+m|nVÀwmٲeu$qJ2IIb<4SgϾlrb n<t}=~(L; JbG2ݔbsS ><4gve]]U555/vX| ,x\wo5ढØ1c
+[ѯ_={q qsЯ"3iS=(HL8$>KǍϴYKuQ=zxF^n=8
+qW $;g8ќX(B,;4 `~*H2o}pR D&s¼X4Nt4H4X0/yvҭ1 VO8Fƿ+*yIjL9r& Dc)]~UzNH[؆iZ h'QP{FjNF^(=Nޘ-TdDm1NEaΨ#]
+'E" EQh~qzF¶Kwcri;}7)ޭp{^ dm$np{p[z
+AI۶m̀N:GdfhUK+&fP, }&
+=!L$9=]Naq)E
+V2O?}k|cZ%Jv
+x<*6S'6uywUܺ3֏#܆16ib8m+j6Iǎ;,f+WWa/5i<  FbXwAPJ¶S
+0E
+.4MrM;&ƿP
+2A{#[3BMҺ?Nq#bN=߶EѣGW06߱suuu555C-[57]]] rooI%2=[ (z"c2|
+;6vݯr˖-ݪ֯_+W>۹#NSǩSVV7/Q޻wRqw E73;˜-@q7AI%ǝKP*bzR%Kqw2 T4_ԍՓhj"'dEDM: N'-cKXIIh$F$4W2I2({<
+2QG#{J7?u>oy< 8:sLm tut ;3 ;1,ԝB.\s1[oNs0[7/o,)`rOZmU ug49JQD'ceHضk,ĨfEPO~Wz Zw0|A83BҼGNFGR{jw׻AfD@)7Q kݩHHX*)Q¹HRA)8CP(GZ#-œ @FJ"\\<$@")>&~moϳ/s8[6D7q1mnu˗/_Y|Zl׉I6p`OrYQ]U_JF$rfuwh߀|ܠ-@͛@ikZ(1?uԌ£G/9prKJxo+Vv==/
+Pq1،\<('=IzRVOI#Y=i'f%;wֱ9wX=I'EzI:VdzZ薄Z3Ib`wyJ7V܏iݍo-p"ϝ;9ɓ5"w9 Dv2[ us1b- =coNsxooLT
+cRAJ4Y0,-D"Q :#h,(|֥EfB+Z& 4/SsfZ|Rsyټ\HH#/2Ҡ =˒oѦ"5-5 #wog S("v! <D p}OZ'-9;bOi)Hq$y(x1HII%lJO6O񾽨ѣm۰`볷kkkXRa:Q;77$N$ND&&`Y3w~1 Xp)ʍ@)ga+rq
+8[<T&*9NJJQs7`< @~F: ?3FSvDI\IdHC>O QwHU( Is5i^&-09%H6&Vɿޙ\RVF\HH#H<Ԟ_$''GjFd.PTn+Dga,<M@
+# 3BaFrP(\Dqqe7KpW)i*w/$GKhx$#xI$nkII74($z7Y+ؙ4s̩]_
+`ki7m:>0Bt4K.DdWd'"u_%׸5nAFX&]7ݧAb7(`N/P$K(Ճ{W־
+N\<ng1qw%*=1"Rus1j J o
+/ZnV|FPj1ꦕj13ݢ˅$ܳWx4FF <Tjϯ"5#
+r[=bܳǰv>kqB!<0>Ӣhd{&a [#*X(/);!YlCdKɣ\/8q$D
+J(zUnذ-ZDR)STsRwQU[9g23mIf:(
+ zTTz{S:;;AWQP@zz}g̜Ln{}|>{Yk[6.ew&ӫL]4dFݼɤt\. + ǟ\e@Um v`JJJm J] J=J JXBi2Ai6Aێ;6
+}.8mɌ0+[u0]d
+"yQE#lGe<TS*'"xm AydZ>!\Y}s3(3I=6iҤbe&8LgG{aك쾞ǔ_Ul|f}G?&(]'(]J_qv/@)<
+p5|N2Fq&EI%LEV~ǔ_)y2/l{v]'rt#N}W0QA"AʱcǦWǷ'@6A1R˗/XԒlɓ'7LSR^Fc
+Prgr. 'e33ɍR@)ό*ر WU@ g(1J/zAiAiJ
+0ye*y!oo&eYfgɒ%1c 9rds/ggR-&*UeR7.Ӓ9ؼ83Q*T:vM +`ׂը3a]ꌼ1`zi=״"D$''HDkc "ѰؤC!ۋ%a!Լ%a?Ԕ%R(Bu4Q<Rz#E4I3I *2DTZH"H# u))Bd<=_ak|w3"i~nA,K<ĉ~)J3*UK
+p`!SLV:>efcW ׊C%A>A3'I |#p%opN%rJo(-'('( (/
+(dG(u#(~4㼜) (J
+;wi1$ UI<%I]5XQ[oM?7f++HxޝhX[k ,DPt,?,@ieJ
+^P$6iˤq0]^-yK.Aniao?%QoK?JTzMĘ:Ud6TRF\~Q='2¥k;G3h~n,A)%2nEPʑ;ʬ-IUEVG:{$RW,^?zBl 7=%X
+@Gg5t:1/0=dG1T0aiSsΒ,Y$nvرcbRo0X`$C#!X!(=p+:)]M.\XSӋA+T(e˖
+`{Zbŋa׆nQڰOԂŮ]Z F~5\yU՞p=tRA)5SPb+>.NeF`4޴ A˥,@i(  J"|'H"ʭX- ([UsNQZk׎_xq_'NlL:tLNXOJ_jȌE ̙3'o/0֞5 
+jNT b&+0aR``b
+4ܤzTJKj$N
+JG姀RPgԨ-$ՙ$ܮ<pŊ8kS)"2⎩֪ yךj-|?䂍ႍMM`Jl2%leش\PPPAƂDgR:4TG/Hp]H)=O1٤DOg+JtQ~ Pc8[gm:[e/%n/3 &l7Hƨ-X1ꦖQ:wJC Q;#wZW6DR?[9P:KPzts֭Y؛s
+AJAiJ7LP:Aw<GBKJiݘnLuUuc ދ|Av%<yrSѣG2$8=׍0-}ڵc3.]:33g[gZ3֔X(. :ߗKðgy95 ')[Y,6//œَeoћ:7aXw@z.v=vZieZq!ͦH>Z 4&LI%5'{ ᄅd+7a]BoaJAT~fP
+ǭIO
+uMuSu&$Vϣ^G1)_t=5FDZ2|H͏'k$KXj%(e3=)OZ-/Tdԭe!u0:fe}T8} FA/O
+F274`?m?k`[=Izѳ3UǨQ7Q7yر#(n<LbMںuf)(vu䏺nͨ$CX'{!A;[ O>\ʽ{NݹsH@io&@ik<p'N_42@i|U|ax
+J+{!=W] ЀK17d2B#rLߒ4n%aԒjM9V|ңo#qMORϺu&$nGB1IB=bM|k;;ViR2A)6ٖ<IedϔW33tl/€[
+PӃYhJPjmJQ@I/T%AɗL$@I%/ʭT.(Ӻ/GEZW\9`ô-Iǎ[<i6o<ӽnݺ ˗/`_ZWQڱds֟|`˨[.o.
+ka-[͕BәTQ[t&`%
+"FpbY|K1sjf½P SƈhĄv5X[?lذAcǎbx… +VX"_~e˖MҞ={vJ: ¤0YdEU_âѢV LTbFwrΤN#ew{/_9ٳksO<ѣGVؿ;v[1ʚ5kT]d͛ש3ZU0aBj#Fx*^^zTƥ\"Bmdffd<LRx㩷
+*RdP2 P<yx-(zU*( 4-A2wP0~PGKEn%JVn{PZt+x~u`ZɸJV3{Qmf3{
+ӺG3{gٽ=SNƴLnoMX)֟o5q=WblVJK)5RV@.a(VGJJَi%t~P
+3o7uA~x:U
+Mg-QRJ™OgR~Qu:jY#x3ikyҺu  vS3&k׮mMN=z`۷kǏҳ1  |m$EDztȑCh.)0yƍg>לQ(} [; v(QI($(]I
+
+J˂R%44,9wjMzzM 2 HXB()>%K0(9By+[D s
+nn'yu˖8L@gR%:1{@X7 # R`G!k۶m4bgBHcx2ƹ#c‚he̴7c:`^2qȐ! 0C 0Y3f̘g)nKqxN]~Kfz$%'ILO^z%֭[JI%ƳnEnW1@HP=A;%*ݍo?믯.$>HKy;.\x;ӫr<xpVݻwO߼yׯTy*/X*oF* *G~v[#TPp۷|́le{1oY lgOvf5'bAP~P٤Iz6jC &%( 7ԀPJžEG }E?H~PRh)[I| Hɴ"f_ ؟/iVZڳgϢԭ[bZ+W|iݽwرCmɴ&L~iu]iEn% lKaSHMJJ*goE1QV`c+n%d!V3J&w
+J>ZPi?ޭO NZJMaiIVd+7a oD%.jGF@bJ^~$(iJ(_ ԁPyܡғF4Τ FTJ (d#(QX~Z{'KXe0)67G o9:*pSΤz 580p!eҮ6Q`ƺ DHO4dg`yVy
+ ̆5]h}Ok 樃{ϛ4paÆ7z_,֭[Jf\ pefzQ $I$~WJӱMӱ?+n -D>SzN;})vd<@M~2'NX ;=,c7l0"tJ/W\yԩ+N?W vQE~\ǎ+屫FEgXxZN(NIn#(UVu>5D^k^g`POPZNPzK$VqCRP0`Ń?*-pn"njt+?{nV (r+Z<ŭna0aB#JK@VJp+p+@:RJJőhVJ+֯VJƭkM?¢#IIiIVԴnaB%*ua)R.R
+(V.H.N93w1RZZZ
+ӓ܌:*W\AWFt&Ub1l HFdè=u/MxTȳ<HH#1-m6V6ϰٳ7/a{`ƍ76i ѯXbnu[ly[f 9&1$1YFR=ƟZˇYu+57v4Qoo߿\d
+>Ht|3gμ9rȂ},}A#*^z@ŋ{T3g O޾[T>|x|0Buc
+ڭIXŢyq:͡#m[s-R>& J՜x^-;^Qφ6@
+J
+v^lB,IQT?RHc%+sAAiAi0z d2
+&֜ U2_HR%@GB&*ug%aJATJJ^;l %MqyBxSA$#IDJP[9Q7LJSIwɖ˗//It&Ua)6cM$%|@F <jQka1i҂<
+,
+4S4+SB樕3)_~/ uذa},<iҤ&0# ,<իa`6`wG=(ANȠ3󸥛7o~$y"= M+%QiĐ
+ơԫWNGl>}z}Ǘe<xp~ݻgmٲeB/bŊ.\ؽk)ShQl9Гe0صr`eiӦr&,߃+
+}ʺ0e  qm+
+c@ Jx3s1xES<'4
+0y={lӧOg^<x𫶑#G75 l(3Dӂ f-[6߰veM6ܹsw#Xaޗ}yܗ[nݐBq3=)QM8$#NӒ߭{?)2
+JoŃZLIJ
+R@IS;(iJ( P2P
+Lب[Q
+7>ŨLb
+wK8$*7_RRch*Ɋjièc$80m
+m֭T! Jmy n%JVjY[{IΒXVe4h/vc!ƳI i)
+,'δ4`VFs
++ԣobJaAISJ_
+JxPVA)l % (q?T@0Q7u$5ꆍ6)iL.r&+W.%e3@q&5jHT~Ȥ$ZXҊQ)iӧOqv 6 xU"2y"^,F]ٜ"k7h !^{>
+sԨQ=Ǐ >bm?d LիW/4nܸqa ާ;"={|72V,g<"P
+#kjo0uxN|0ba/ݹst"Ld/Jޔ6~c^&~ьl e+GYd bs&L1&Use0Ogod^gpWKÄVuܴi* x1'|#[ln ^4Y{AiOAPz/u>%(Ν;waϋ,_uA =&({?RD0#)˹! Ң
+JRI@)(VLQ7LbSMFD=
+Vqb|#^4iRӇD<DO,_|yڵop҈; o=ztɓGuӧ+Wa 2t޽җ_~@[q8$mC5C[On%-ooE$s'F.~ggm'oGM-6;vlUƻᄏȻsٙ6mnݺ1C,Xз 02j_>&0Z2q?dRU\ U\-y1!1-[պu'FvEdVN73Ҙ1cF$FPzPPZIP@P. 1LDk JwJ*$ž%Gw+zr+}VRk+D,=!}ٲe#X{ Kv|:x\Npz\dɀ2WAri 6,Z~}O¥nw2i)EZGc˰9=Łk6,gȤ`љ)&sH1$_t}U$L׈rX]H&D; U"PTd#B}AImV
+J/%M?\q9WPKBõ&%ѩbdTpg@s&UMUgczL 7#n&,5Q&[h)NQь9s"cC2]
+M
+j+
+]-(S.BZ$$<*On7>|xѣGw?~|(PAPܹs-Z4źbŊY׿iڼyJ]68]دΟ?Jzy֭[טD;-
+JWӓJE||O )ƭE~_}+
+v-v!v:xk&_paӛ{uC-سg|c 21sժU#/^<( c;]'L9]503ҡPdgࢮСC4LhMP PTI.HԊßub@(<,4+% Yu`^0\{
+sDQH7*ܬ*BSƘ!ǤxPHJnRR~?(p&O;D
+
+xr:LYU@l&-$aHH⌍Ϗ-_#&///2
+duvdS5MKFF љe#
+7K.T`*,]93e˖Ϛ˛jV S;Td$e(0 10/bȑ#_LӼ4z)]Ωivn<ʍWt3LF!KZ_c]'L-G̙3G}c…c˖-b[f,oy۶m+M0n8q~~xTwtׯ_ dJ<+}Wo6t\2D%:hJ
+p+ڑIָۖZqiWJ
+4_@IXRP*_?(։KM%]IILNpZ
+SLjuHbɓ'w>}zXܳ=$XbJ$ngYqeǎ+Mh<rvL~3g.]> ߾}gSd)2~ZRpaJfZgVV r; ;;? l#ɓ︎=&uKv9ύ:#?zB} :=.{ݳgiT\ \ǓqO$K^?x,lА?s۷o{ޯJӦMb={X#@i4XPZMPzGPIP: c}i;HPNPlx ̦AY J
+0nMA%VDNЭt(ܹs{O:5رco8p`k׮] 6o ӍA^9kŘgR J=I76\R&i)=]uIJYf\*U8cL|
+8[ :3D)2!vp
+Q'Db;TE3)D,A&5X
+\t?-ܥT*idn`P
+}[\[Dp
+7L,aWoذLjBgR 36U{lg; nWLK<r p8ϫ g^I4i.Kiݐ.Ȳ|h:lP+&ZR
+=$B7U*,q[^сo|"Kz9s ZtnDPͲmٲM Jᄏn
+`_i0JRI4Ȥ6Wh4hJ@I
+J=I
+'%[H}-Tuk4hPOY8әԩSVfK;k;`fap_r:QF;#b=: 5uWSa>_vl2 /< FLxr,pS,e& na&BgHa:OiWtH$͘1YfelG;a& o`Zw޽| Ǐo3~ +WҁA0EW/Jڠ΁ݢp+:h[ɂJR7|yQw={ l?jȸvܹ0OvXbC24?tߋn>lFZJ%-`Mx:ˠaVS'!OφXDc4ѣG38}$f oǂz͌e‡O2^'(-$(`!J[Yj/ Yaϓ2~YM>_z_ү zEJ%*iAOK!J!::}f׸mȁv)
+z&t~,.W% )d
+VfbPZb4$Mjq: 2& -J@K%h[
+J_-(nxPE
+wȨ[/VFpWb
+wu3IߤIF:& D[ 1[{%w/9˿5r1`q0
+ -HP-hS
+=xU:҆!}>/%͝;{… .]tp4 h'I;7"o߾кwX {o .\8z
+JW{R@ RJ0Eˎ)QЇ"?l[I΁Ĵt+=[HZg>r.:ڑ_HI\bWԷ~{f*`qbڲeF-X`<ٗC= ,":1m8qد_f)&0$eJhĚOѦ,ޜ[ѕ>1cƼlD`f1)#M/h\jLVϊJXs_|tttbRSo>gJ9#(N]C"aP̭K|n[t+]s޹s炿q 87.  H$\//%z1Xuxw#R}R-RUF*Uw,YX.B8>LL<V3 bvctXblbƣ:D6ɲ/ =E7Yb~b,H"y'Q) MŶQU+Q*A\&@&$E.`Ҕ` EKa+R/_3(~P)c$Jx40SuN)YYY
+wOcM:'ml3(IX:M^uYʨW wHO"l@d@QHwٳ{Cz0M/,xs<cpS;Il׶*{^Xfԩ-)YBfw6xr4b20{lr߸˗Yfͨ(IڨHZ+WX9juku>vIݭ[`ʰη7wJ%PWu?%u%m
+K7aiXK&&w9nܸm^VL@˼yF4xFNPKPZb
+ osOŭd~w+%.; !Jv>|xk߾}Kn>A cX/^L ;d^&Yo߾}$-%-*gtС|:bNZaa7;ۅ&%ȔԨQ81t8cXĶ(>d#!+[ :33Zb"7$n
+bAIO)%<:nXy| 'E
+'e3VVp}j#=hǮ I]ti+ZZ`*_J,9G+7}y_<`"3SCSy هzz!ݳِs
+u)2cz@}U#$>Lcǎ7S6m4+eS]qE | J Nl\̥k*S" Ԍu>&XiCt,ޜ%
+XˉupRo vo?4 @g(M5f1J
+ZҀ)
+w=1zg Ȅ3 C6mȐ!#Gdn4=g&`b]b}dz 3!=!\<%ھ,xxm<@Vax E02y4 .WVX;a͚5z뭑р Nvݻw~$L2+:3f n#MF}=Ye7eɧ{@OłHAʭ`EY[''n:$N^9unܸq2ʕ+Gcϟ??>)СCk%/H1v))˗/K t;{HK< 7tJfw2u+WzzdAf<ubT 9q ttR}ĉ"Mӆ2CCfy7J
+,
+)2>묜)26Ν;F]~D =cgϞ=رco;Ί2UusηsNGTD$$A@&$猈*FGg6λ۷n_n72q>\O9:<=>H27 v֭s@
+ ǓFHsAKIKq'O7~.l1yϊm},m<ͮel DV~Iu6` h=Pjx.B=ogC p=%(˜&+5xc'nI
+-L,ᐟiӦLY?0i;i#i-i w޵R@-U`Ќ$(D(xꋁpV ar`6[hV˦P p{uxe-Td աBŨPE*TTcqE4]\-y4"л"Iu0 AKj$N-YjST(&A\<Q%8()AIKPn3䨛T,VC_~])
+ιYfM~kÇ z܈>}tc^f6 ø:M<}?2rd<Z%2W@2C2`eN}*n*aiXkO*ج}XVZWHQv\/ [tb㗓֬YӓN[lݻw 69ߎ/֓'O?~ʕ+ ejGuHPޢn
+ dܡeܫCŭV2@[B8`n7v{En,c.]+(:СCK`cTct$-!8:0*i޷2 ۷F*tXlV MOJNa,o BXfX`~LgӚ ~)zCᵗ8ׯIʀ$A! RXEV$Y1$Mqh%P*< EN$s"<Ui)"oỈS-=[߉%fҲDݤbQZ2N'<ğѴly-^
+
+
+abD`p^Xv1483"ׯ2VS \ ԩ:6PBu-uUVU(~j]6m6W/a]8DXq;vgϞ^أq#GLs
+@/iM8(mK%~@ ]%"#}&28{"0a%\u0)݉:wƍKaʒ|cwhN%aӓbL~blwRxg'=};a{98,e3pD3MbdjgϳF=uG,ģxFKG?w{n9(J/t+n?ʿܭoJQJD$_Qp ܉@׶7W5ɓp˓p&nL}x4i)7CJr(,<|ژe
+~VwB`gB4x-[ʆI^"POU,Yukڹ6PB X`k[UUE69X]Wf)UwVA~-g@ ` ύON9s-^|y뛍nm{!{N 뚯m{ (}CP=A'ҟ ҿ@!PA8zD/C_A pߑ22gb( y<VfWsN իW/\scǎm|*EZǽNN!ưVg '76b0LWX+iy`_vci7:_qr6l7жb
+J 43gvŀYodzֵuoI-5"ÞczP|
+I# B  g_$E$Yh%0J'$N"v'IuYf-BV#q"oIs"TgBR9(GU<$ \ʕuG䢨[cFݚiڷoV}IMWPLТ-PmPi?s-^xILdU$m۶q1ٰ#*B ?Vł`!z ԀRTvŚK[rS0tjY*`X=S*v-yΝXl,,PÇx?>Re"+ Ͱ[M`; JjuoJW JJDPk?Hs4LK/!PhFK©
+}k`H\ -}hf
+<V\ 3YǛoyjQ.\SyMZ*$--%?LtQc@A<-{[Ӈ1;uu0|=] ,xAClx"F8 LfP,3g Hf`-[Ϲ:&p*Ylۛȼϑn/EZ7A)VV Rs}уpw9roqmcq;uf#&] ZCZʎyᤥ
+S߫[J*-RxţJxA BGa%b-UԨ?ސvdE&t8ե3s9_aBo#@P (gzmEYqJ 8 flJ
+xhR:eB& A^Ĩ*C XZRK-؊jvX {i[u t:JQ ZU*mrجcv5yϞ==Y
+oX obDי3g/^\`z
+ b 0OP:JP:t\9I]J_@
+3e{)領cǎ:uj0݁y6e&F}z#K750| JJ$(}KPsFϴ%*E(:4 %ŢTF&dLܱqvΝ[nvp=i`AK<%$+vX@>Zg;>؛_rG2 n3֭ac1ֆQdHO
+沥L ctU@8Dp :jYڑ7V)VRBl%VVL+s ,AY*s Wtz rwwK<|m"2҂ܗ|D(RnKjۑEZfkdjL/ 5`wmNf?k:]R11&`L?sX &&U=3uVֲl2 ƈ3P P}d^vY 58II 5<HKF?\߄m%JN%<9A%Ipp: @&eMyyyAHViIyK"[̉Y,A8u&VVVRADZR
+*r(_7(a7T%搜BOa ىVP-VϥluGdFݔ-[6gԭn#Fh0h 4xhin|BǰeA䬞PS80D^%Uېjnz2-^3ѱا}PP[rSZЬ-ojQ*~k]
+Xm66kuJŞ'
+b>%ϟJRc3,[
+wTϸ.V2\[ISܭb%VSJQp%IZ
+>K43{i,^re'iiSI%ɠiMqFp Zx-- wCnvk"Y
+F)-cⱞ7[ 8NMN$0: FPks1q.8:.kHmΒG*(0!E. n!q[{ P "IxD'V2 Hc%х嗄JZ ‰ZޥIpeM.r苿+Po"fznDD_742&5uSDԭcǎ/jp]}8%#gdfJtaώa>lEt8x,`UFWV *}k8٭4fdИmLkCmy jE,mY뵡Lc2M/ ?sd,,;"+pFx Fx'Aq\P:t\%("(KP4߳nJJT* e^-%"eIG^,:FKl%\M+m`󤥓N#-w={vg-h Pō˂38`烝c=" r
+P®(3džʹ-@%f*(Sndx@73xcKwBnO4J+'s+VRp,Gfu.SrAKHK|#1x7$
+IK)xgy;/o԰ ܿX # /]{"S+"sYFY WfGT,HJ*` <.TP;5@FF'` 5c4F~#: řZy*)x%#G$RҀ J!RanN'L"X'L"I8D"x-H[]̉)Kj.­$rDm_SnT.k%|ŔJ _0vm|ES<Borf VFו1'ܼy\GF^t5ݰaƘY:;g8g)<5ςz<'ZoVl) &TS 1&VWWlѭ.nAPL@=75NQK[0׺htH #}=bwŋ9 , l
+`9n"P@)-?ȏBFK,R%v`'FG3}&-ݰr:-AKIKf.6puӆ=s9d)t0M 2%2$2 g./,v.`/#vZ.< &q6m!- Vq.D3[dWLp+i#JJ?p,ͭU3Q53A8 %<a7\<ugIKcAKp[HKkX$ޞtNL da(g@;zklf gMOk,PLT! "#KS^ &`[obfj6ō`eoކYi8! /ƀS
+[gc2iPPTX7`
++ |+@i&kAifuqhoKP9 J̧HTgZ??Di a)KJ -,uZkt8u%AK6܈㤥C% H3yi.q^ Tf0M$21i4iE)R CFs@EPr@i ,;qچG` ;Z` כa4zu#JVbY=J[X!Aan%֟HKan%9[lARfKYx6<RwIKnE
+J" ^ +++FxBO?Srf͚ʌ3Klxٝzk 6H7B?u<9s&
+
+
+fX:-UO%^V}F_ͺ$ *mq*p^gUVbb56ZXeP>u4mև~B}2 ݬ6(<3WlfҰ.8F(>lO:=c' J J+J J JeGujgo J7 Jw$o_2A_
+)쟒$`W8Ø[Y5g``VԴ&x Y
+(:<M2lk,kpY $ G/ $![@p=[H6HP$- " S-H[YbN‰zK[It>_ D%J5&P֪U+8-Z#( oT9(_Jb~E@ &
+Ai6ATh7K 8}JW9A]҇ϊ~$(?AHZo8-ߓՃ-ÅhJK"Z:]hu ],T 07YNi2iq
+ ғX(
+3m*iӦܱcǗ\t7_~5C&#i~Μ9XwpyÆ Yiyz =`5~z!8lu"Ya
+Xey:l,h fWƟӪALkcuaVJ{iERR z#Ձx9UҦU^J9ضM&> ;휌c
+ Z
+Lӄҗi-$-]%-]L0Zhi #ƍ[#h,%b3LS|xG䦱BxDyJMvci.ߜ99cqla3c/2 ,YֿIJ7{Awu!%pߒ~/r[t+rҿ4,HZ>~LYĊtׁEZf?f/Cii?iiG[$Wu7eZq 4] rv|1
+Ya:,EY:2_ &
+O~[io!Z?Qh5E ނDt
+=|
+ (sf̮3OIJ2.:RH\\/
++C̪Sj
+^$*3Eqؽ;rpH>]F~aCe
+i~2GAf22 ^Ilf,$\*q=IL/ђĉ%-pp+J'ҺEmD%PO<=oVJQ
+(i> |u]||JIObQ
+~7_'(?OPFPۻ`Zw[4çugHBK'xGЄh8>pwMA{pttOڋh@-cHZZ)NK>>DZ/&oBTtzf"\2k| |ztVV3`[fLw޽d9_gwSb!-^SܭKZz[,)K8FԔ% v<fwIK\k .iii_<b{" xW,Jg491& 蛍#i~9xIڒQ<C~&bSt`9΄dN7?oÝyqaqMMю :Ѳ(=n##ѥ'Te=2_!YIV*a$L*-H[Y"'J"[d+ZjMT X|yp($ , |DFPBSSߢR9(GK@)''G
+JxSA "on0=)99Y'%QgDz혞Y=)82rĉ4S ,YYnغuj  /nlvCoK"۔, UK+B,CO@5Ǚ `_{ :{CNIK[j,IFuH!YXil< ;h$SpB9}8P#LPȌ|ft/d
+tz&*mO[{gLU&miRDZ7TZZw@):-a/L.x@>'-}LZ[Di鈃$-X2,%\IDZFZR)(B5<g<@qbUN zt.~-^M MF6pӵpbE p+TtŭR))KE h9ich}m'gtt"Cq(C'5 ZT< `( {uDMoz,,U39>dqEjvhۏ9񺘝x]Lv.n4ձƀP"EGFm 2 QPI..$.J
+Ωs7&hi|l6hip}c=ri=i i9i)iz%_zEu,mRM*b糡6[f
+MDF#$iѧݥ(T.}聒>J
+/1E44$IORAUա{Dmcǎ攻 ,UՁQeǀѭdt҂S;obb`#x6n%][ 'ҟD
+Nc"@DqȤgt&*',cm-V:%)qnS`{ JjZW ((`hMQ$J- ,JK-YpK18y:IKܿNvuavqxإ[DK-IK1LҎ)lghF,IR>iiiiTKUurىp
+ Rr"7>#ap'kxS,"P2JbY$}VXB&kp2
+[&.DZq1vnKPRJj0?JKԒJKiAKl)iCdžn\%-] -fcCZb[
+4lS[ Z~bؼ3 >-ߣ!xgR{RkRssT
+U3``fK4*蔀ctgEo`&*dmo3[@r#}7;Mҥn JjЭTZ”K`OhN%ܰ
+Z)?0k&-YpK$J^a;xʁ>%un'-m򲰶ĉG.!-r,[ƑC`.Yj>#vbRFDF6xV⼻N8>'s[1n%\QTJ!P*-E,R~&-E }L /FS3e80\fV%-M#-呖z]LZj%! ጇR'($(UN(e'JlGs{q\g`u\!P2X(UP@IQAA`9
+sQ7/嶉LOJczR6w_qZ?HOjڴs
+ۚbEz+HOqӧOSϟ?WY|ͺuVis6ja``_7B1Clm1+ꤓ='T̑Ճ̭HGp&lUVUKAϭ]76e|]ҭJVHPjGPjIPz1&n[)oc0[l؀fԊ6E+am4񷉌sBV®g 팿0v&Ӻo#J"έT
+-J-EJ-w”]3 SZp_n.X<RKN7\,Lf=,ŐmbZCZœ8GZg=xR<H%~h$S|t+1kq s+53n%V¥~Lڭגi)KLZ/Q"p7Ĕ ½ ~v0eip+9obSf2{R:ޣLJZMj7Nq@ъ92R#&5$(KRTns)w5?/t6'N lx@ <*z3wWpAIMTݢ:MۃŔ-[v_IDyP}LTP}LA7_7(iB%/JXzjzRߣt4IUTۖs=:z{r
+:t]~-eb`pEJЭ$o/ZDR("(ѭԈ+aƌ5h[[F^be^em
+[mW2i S60u\(8Cn%JFvł.VX
+҇[I?V
+)E.2Q ™ub*p; ܡX0n #-MgMq7ԟ =.t&###5x[R}RMRe~RduJ3cqOc J>.@(Y Jfъ`3x4z]w7
+1iQ]'
+@-3/ Uę I&Mg͚5S.((XZjiӦ]vmZAX0@0:NP>~s.ҳПfmqPo$S3`[64л+`Pkb/S@5%( "[Rss 8͍nkT>)@{&94c5o/2֙e-0nLYDWJo`mJZQ߄[p+En`"ҷRjح$)BNKQER”⥖Lgf
+
+ii~<VYD3'DȈƁ2\do4Nj"[;JR-(Dᾦ[L96po2wn3 wA dn#r&\,JݘLZMZ%(nH(#(5⬷:|I*0Q)gJ&*9dcŎ$@7=t%'(pmJ
+(aI~'+TYdhe&^o\SL,ϙ3g$e͚5ʖ-[6jv޽C OzhcSFY:O t1\`<jyb!'@Nf :vgXjS26[Z fv^ (鵡Kᓱi%ii(4J{F=۳5qhACЎ^bo16i#y㙁3yt+- `0{0;c[BȭvȭQȭV -[)(2ZRj)P<@[TjGM LYz)Kto.uiᎹqO^/n6x=q긣G)H`$AKD'%2FPb>1j!iI822n%Ln%7JL:[Ɏs s+q,a1CJJtK4Z*KR4CႹ k ]L~\aҭA -KO[ǧ^I2,*g09 A鷬ZT/IDlEPJeR"bSzpO].JV&*d @I ֯_JӦM;㖃RxůA
+K(@)Ǎe~<n>&H3fL,X0_^b2Jfﲭ
+  _?OOE@/` Xǝ+WPWp qN qD)X/:vG6tƊu@.[iNMo*ӺVFRzѭTۓۓ5bi֟|񷦴-܎񷎬?ٍ7V[ЭSnL^FZuo[i/o}*Vr+6r+JO+-RHKF_ngw8.2)K>z'0e))KqeLYJ8tD,DZJ"4tDL'$D3Vb5+9RP*DRA8V \ȭuwwnt+r[VJ[)ndFw|*JGI2Lю+s?ֈe#zlS/I%^ⰫTN`EVT'팿YmE7#7o <*Jr4PŔ~%$rP5r
+EXA@
+FQhc6)^7kP6,sCuZaU)ֳu5oMDVn3ݪoelOc~ Pz
+D'&+;(-[%?%pЦ En+FzʯIŲN ,eke)W}RX
+,bY*n1bq¤:J P4`rwC+**FٲR-+eزR*|RjQA$\P9ʿDm HetdL[VbtjrGV*DV*b\1R` =Hrn@fK5\pq_B{ܖM4fC\4G;-s3MgKboIv-ޛod(E@)2_7(E(3%7'2j=Әݷ }>v W}d}z#F7nXiӦ4)vAJF),a8E̍BDH f5Pj SH.(EVwL>Yغn!z [sغ պAV Y;Mஆ..?IԀɿC\o.򹄹3UL#+ݚ{7^xLb4 YD1JVoRadh=j6x3}²e)QgcgUJ.*KIlp9 # bLՆ v)ƲTe$R/-<,5d vC
+ϟ?<++cݤlfd%j+gdPʍɿY7{ ۖlY)ٖҐ2lY)Y 4JEJ:Ow q܎<бDCb=v6tz^wrь$u@<G\RәGlz#7oIMI\<p7?PҒP}LBy%@"%RI\zn_;?~wGqw@h
+)W`[bxs fS-/OBMKyWSlP&C+[غMYGYd+~Zt{6FV"֮WVĄq5غoJaK)Tuދ1M4!+=Y' +Rr8?ۦ(,AK_0A+
+R#&`dtLBk?1Qoot `bqe%'&Pr(R" (EqIP@ICC2Q\=%ς6mڜ83NwmֳMYYrP6bD~9q NL3\4-q+VrWG)XV@t!FALX5Uss YTc+ u YgU@}LcEaM[{~UTc리UBV
+P (](?͛;ʿid%o;!E(CJLزRAd>&&:ҁغd9!dM?
+BђrP%We)0 }tPNIbF܇+N_J pXd% G$\!N8ÊI•P7*KX -AKf0`D$RXQQ1@ylJtc"#+Q#+3TӖRd-Yɛ3R c0ZJ,3RhpNn;Y͡k.%S~oQg%'RO6u®`HY>NNۚjIRα
+yMbk:ĔdFc<jcɿ P@)PVrd PU[ JP q$ةAI󀒮2{[SF-͂X$ ^p[o:{6ɓ'9sf:u_ԭʭ`6Jh-1v$8#Yd^aS&9z|=H3\diJ㑕F61nSw{ tl݀R7KV tnkJV Yit!itb¸5L7!+݁J +EVzSJ5RH+e)ʗx^& s%aS&L! G.$\!+H+! WJRT%k
+"V/YDNjӀҍ00e X[@lyغsus7Q-Ԟ~2SSJHbM-& fJnGKBRPe(E@)2@YPr[y@If<"v`5`[om9 s ^r:t軎1cƌvN2eSSl&.še.EܚErSBX|Y'^sKTӳ+ :#+Uز$dJC0jVnd%-שwfd
+Yi|hx
+Eff3Yi11~O}7Y,mT':*UZwPfP$+<dRN%+RYiY%ff #ӁdKߤ*ҋ{À=GG2t)Z
+۶{k7Xٵ-$K5+Z#
+e%/(yd%pb(E@)2G;b@IK@<o[C.,xk~&GMGo:W z9hs ;vԩS85qj[R\RDZVlV=ZqWYqp'ޘV45SV8Kѳ~R)RdոF
+#Q-ud瑕lCn[VYӑN[^YFvزFV۲R#z@B_2nDV6PV?4$2'+U-"+Rp+pI(_Y+:T|NOs$X [SGjeCXM9JNli )GYL$\)(ˠ2pXʡrCK^n7@iغ>0:4=K_j:-L%U|ki91Z@ƒRme%OVRYP%U9E}mgϥT*i<}Ok G=n
+݊R[wF vv {c\ 7{pL[U&=<U
+KK4Ӗ +܊j'>ֆjAJeAt JuS[w@Y)PZic1e%51Rpn@`H<I8*2!a֋or:F}"easyZ1y|Qt-n)(H•hLLI E6; Iє @馩jgʒ4֝l߰=̿
+}GFsڇR4?k<_/_#PO@6z+]pruiFVz[@>7eHRd47U3+[!R(| (pNꢢl[%W
+ J4 (q$XrfJ(JS%ȴ
+W;G
+ Xp%܁I8[V%>d%}荺?nAVZϴmdV3ccƞBg|1ݥe$I%As)>eirɿeoȿmio!4.+}6FUgt3;Ig|+g|=g|+=>N%`u 5$g1i?
+% Ac.R.z ZQ t %} pp d!x<Gy=:oOLz'-pjYTЩޥ%\V@ (
+ҩFVu;͖NEV:++fsɿmᕕ6CV۾.錬:Vhd0<쓕toYIfFcvJ&+i@K.+Sn3wn?Y$v#rO¦aJ֐ ZɴJ$|:fIFV*]hxI8hi0EK&E& ʼ4bX^1Do
+̿xHYɠWV3Et|&bFۈ3>l I{΂O'Q%r&!>d ۋdӞ"pnZ.y4}^w
+U[f齍9uJ:p:3qɧ%CK>XΩ?(,FR"ïkuFPuY(k%P뮻|%J(
+1DcԨQd&nfx:;V;,]bD
+
+{鼳PU0'kJ4DnKVMhꓕDV:~U.a[`J:,H\S{4é0W+T}:WGьnGp%å<֎YiYUBkʙ@Ww'әE:3.. h_ Z@!,(97<(E8PrRyyy(PJ濩<KryR.t%<&;tp!%:QBj>M]PzЯ@*=z(dmENM6+,xs*,mt*@mw)vq[ Bޢ}X]4iN`"MP܆1W4T/PVj
+(u
+AҧJ_JbJd )+UO yݤ,Y)J<IڲK$#+ԭd$W紂ei7 Yibq@n Z2`$j :wK,X
+&C
+TrU$tfJitɨt&Q5qJ((E(
+J ,P}25yު5i@IfjMm՚(Z/ڵ&RkrJݳuh1ҩPåPPP-*4;?ڧ
+xҨp{0nUiz ſmYKVWd5j?z [j{$Գx6J,_@J@2@b@=tt^KJ MX׈'KV*SWS^*
+\O#+iJ:^N,Y]dQ1bjzhi+J՝ƞK>#OV}$Jϯw~S#+](3j3)=RPBTdpƲі˛2ކX7YdR~(0noѭڞ`ƨ%Q[4Fra5RMh_
+7\ (um (]
+(u
+Mp^˒L&nA&-aaĤb=~1.ÂJIޥoғlP"lIWM'kJaNvշt1WdYAj;鴶kkXE)sSH:5CvDȦz# 
+]ЅL=v~7@@%8[.R.t֜Do ɿQ?2*&˿Jz1ҬY"%JzG5Pv/9غ 8p(JNX?PrPR%*!Bߗtt*c&M/-I BKeJز҂R4RCݯmm@SEW+?RO+OV֚WohY[kR'@@}+v`^j(!+]XWqrRXRZ݄t}]GV4) 瑕璄d~!+}tvd4mDVZe{s['vj[,ZyK-`0x4'#6PUoS|,oJmP-}%k[Yݏ'~TJ7+(>cnozH%=FSh:uam\ٯJϐW{ ~G&2tvɿ꧐K&ƝCBȿœ d"hmP27] n72<De
+()}(}1~Mp0B4I~ -$hJlYЖ4HdMhb E-'iEߪ<Y@:ŀR{dvіBK5R=z..4ۉ)
+wd%۸)Ǚd%\G(dٲ҆ee?JEe%WM"mdlY#p{St6v~ L۝vpf%ܔ`ZW;”Y>=PFS&Q h*߭UorJJf%}Z(X*><s}C`n;K
+٫ Rtg"}pt72ȿ=(=Ѝs oi
+,pii*K'@|3h;a\zH^1iFמTi
+Nj~X+myRo?(VV
+οEJ;6|JVgmtV#;"ЫdӞA.z PugN PjgNK%(5M&KBnr3EWĴ8JRb 7bA}⠤9JP ]PJ⡟n @iJ{|KS46!;zMoMB&&zDJ¥h2n_
+!+p-@K#+%mo/ WmVy-K~DiВ7PD?k(0h2T#&yn XTN N& Uo>3 ?(8!e%mo܄o<Dڽ>&>j>rj-,,|QCb7ȿnbpYk(MՉ:EA3@aD]\y,qfCzFXqqJ7MK(_fpUNi.!C~%PRdO(=(@IaȜb|$/IJZ2AZId`juo\ +U 5*fOP?݆
++HT折}Z(?RaV=Zsnj%Po])t9PP
+o6T_sPDR`swK!m1nҕRg@csh PZj
+3\/MptV
+dVɺ_hS\P*
+rL@)cTO|hL{Qd"c@D<J'xAQ("&`u3b$\ۭim2n[.T]P,U#\Gz:a 4H&
+7U|9-k
+3d܃=>LdM;ϒ}x5AS@dabro6BpmYiHAVȒt>e%_yOSǓ|nK4ϵ-Kk %nq\ SN̶9736#- t}3>1ʺYZ.8yHγ{J~oML.A3ZMe8Z@ȟBK9u@T (F1oÅ)z@wɀR$AW=oaTk:b7Kף7vy()
+Ji""8:JCQ
+͘AseX./([?op%o7%vj"]ow&e: uD#A i9#MДPLUUUX|y,7\G÷XP PP1dT/S^܉RJ^C huUfP/|臩Do2W\pIGVmdu [lYi-+AV2Whﵖ+v"U2 sSxMvI8k%<ZJTnH2LĪ,M˲M/]0GsEfڙ-
+b$JS@5!16o>{q6ŵzE0 *8yLt@j7`&qhV;
+kYVbE,KhuJ"@=
+5K-Zz[P 6(A# f3
+K ,+gX&ut]ٰ
+F
+7Ƹfbnj.ιZ\(u
+g/l 2Vve #
+8Ťon7OS\}c<.
+Ț4צk_nIt ê4=A^ku-27LKyƏ$_ړXG
+J}-bulRē0"s6ћ؎^
+`fN %K;ow:LpيϚ$B+Q؜Z<B
+҃+ِzÍ5VXIUUՃM/_~oӥKh*Po
+YiIx+"+}z"+L@V28_FV l!+z
+ lk,K'-%ޝ,-m6"0OK& nJo2hXc:mHIp^Sv&1TT=j.t̠%#+d˿3zao_,F[`T~ ֆ%g;
+ne I
+
+Pޮz5RXƊ4Ds;MqoÞt5t%.R.Px*#EG+DKW !#=b4E-G1{#"oh0Hn!+MCVE[;d*dv"+CV:(+XɿKzpe)-%@K^Zړ{gN) SM ndؐzߐad=[xhc$QĤy<ה% ^NI4F%@iQq?^5Y9OxE#
+(]Q)R
+PjQ)T
+;Di}4YAM,_͂ u&%RPzPz<+Bэ*N<q!t6t:tRF%@~<F8JgOJQ>WVA,xӷtw: (Z%PAF@)J7 J`Py@IdT tz@It%c[n:{qSN:ꪮ|k#x<x]c6{9fjs
+8 F KAɷ}]:J8H
+(]Qo޼y]
+
+{M.$\l~rI哄+*ܘ2EuJեU=X__+W>P`åKldɒ;^r n
+dYoBVڎY %d~:[wAI8em[BbH%}#'> SA&}uX~ aMF{}xD؏|~$cho;_=
+[T^^iĞ[X}L:3ϣ<V}:>裡<wbJ,}PΡ%3>P Jwy'MO!g/-%ᬞp
+$܁jI85يU$E* (VhXP:LzhuY\OA}b^ 86AQ[@KJWJ]e %z"|Mde٣AVod'M*
+kT5*}Jك^@i;57RC\CKY`PAm PH{3c@Q.
+(.S(]?P8XtlyD\q:/U>6WVV__n- uҵne 5<V\tcjTT
+RtQf Jyp1hOF{6BcFVڈYiGJ +[
+sszJVͿ}嶍Jm[dOF{Pz E@Id1tR[@x]`fqK8JRhT%c@PrG@)J!JRÆ C.X)% PAerB2O6mڜ7O_uc/}CmAg!8ҷZ8YQO0F0GKQ$\Iiχ4}dp
+;T7e
+DK7!D!+@V'*]{~rs{@ef5cGRdU둕"+BV:1gJPYc2B 4x%&.(L_L_ň
+U
+o[mĤ7$(F%g`
+%+Z W3-i'0@% |&< PdQO=G?R͌MbRXF (ܶQҎ{mRmTW9Txf#P&* (Pt_g.?
+%] I( Z(%$bTj[>GϷW;=vqqsۨqtcT"WG@30X]>}kh)lD endstream endobj 89 0 obj <</Length 65536>>stream
+$ᠥ]i#d,}.9p<ܜ|N+T_D5jPj>+V[gҥ<XGӳ.@vIH7jdΜ9݋/tS>@ Z
+K=n!F%nc8/fǽy6ohfdTRdQ Yo0B%%$\怽)$҄u2YWe+.-D0;_;Pul=@)VB+ehϕ)>U.y\A:,U&
+ꁏV@f@&@"Uc<UWJ=3atףiⰧh<ҫ,)4YiDfmW +-eXŬYi+.dcͿ+0 Ӓ h)MKA{kPxdvF&'D-tb'8J˨2*gT6F%aZƨZ OF( x$$< dtt2z9~_gJRzlP z2R"xd%P.=Q{P["3@ ECbf@IP/mEʹpu7èqtm22T3'4*ғAFғ&fJa**J!A%}ڲdw% ghHKGIAzItʚLEYsQh:3_<@"ŊK,UT8lٲe˞,<R&E㒞]Bm-̀ͅ7_OܚKr@lޖIcgi
+Rd!i<4dym/aF{-fPDVPՐBj[G㤥AK~KKAd X;CF!񐹶@L:NJ߹QUnZwJ[.aTZQi no0D/J}{`[a:smG7RX8ғ`TJJbAMe
+AF%ov:7*ғjs1Bc㭨&w`P
+%w
+h)(E
+J%aD! %%UZZa&Б~
+GVzohh@VżIdw +GVJVMtx80vZ>vbd^Z
+L'`^ģ0?fjT{H,@6F%{5db $FJ
+ë2hf 91r%S+,l0Pj@@+VPt~ł>t]\QQѫX
+}'fdo__(*AuHI}d,KµGٔ&Cve&%aO~r| )G_XUUjE-ZԇV Ec۽݀] ݹѳeŽ2y[vxڒ%KSdWieZj AVzZIPLc&[i5x\7aAmtۧJ_ +}1*q8YcTL/U#X##?<
+/!TBAXzEQ@ƨd9-Fќuts5nxP@Gw4[-[R2R"-y@Ir1( ]N-JP P򂒛K2
+(AIC2OL^T\kjEToo:K8pS(ʿ7#+oDK,yp&.IvhJؖ)aCtNJL,e+pUȝ)atb|
+oXBqsE N… 7ddz2 (ݛ
+yTݥOS0]yy& =7'GwrwGiJvh}җ *+++s
+
+$h)ޭ+JW JP䤦["S@I?(}\)P҅xJ)<Υɿyo52fvw9VGcʿZQn[w(h)ȲDZ
+~&Fjtt;9ݶPdx?4n"ut
+
+Ȥ*C1"Sp2+='e'G\!y+W|E7//^|%}(3(kzJJJJJ
+L5#?)PNkG?'#ʿ ttj^c;aqʗ]vt?FwW_05َnJ93PMS (jg."%(A)8J\9J[6Ovo5ן|3a„ġBU;0W I8-}-}
+-J@IdXɫdX4pHcO]v'4&Gˆ\wr㾖dɒ/$ex##Y<)ZzPzPz:M}>U{y%Y{3I{DaL=|`:Ǽl-vGFOYo,Y
+Lոt~MxݎnFˮm98m莱ktێQqvny( FoqtwbZt$]vt"8Ǔ@IC,C4bR5P|<6PB2R"ÿ;( v(<% I<KyqUUtEyo:7?YX?[f%{Ql5Jgصi)PSe)N&0<k⋝I:-R9h+/P`>=kӦMxh"bŊK.}-w/.\Ypғ#=8D^7]/~&Mo{7AteFKQ1әq߽Eّ56٠P:HSF_jۏLX_]j>FƹoMׂY"nfn V3kfoh/ lGwy{@IG-(9#%JyyynPuϐcFVJř\Ĺ\΅JmR%Dshb ߮[-*u\[q<HVo&Z,I(e1bzV|-MH 9"PtEs2e*OBFSYYZ΢E^s9I}Y$DwxPz
+P(= (*zPz Ҡ$M1h1hstsNsjoJJזfVF_|t\9"O '?G<tiX~À
+”YS3g)迟94q,Yo_~&™ 0R
+"ww^[>INIgXfyw}ڇ JF>AC*݀莀
+dl*Gtѭݕ-Z(n373
+͓ *P:*G*u PʍR{-ŃvJ% J&(H%uWJcfAIN29/IO΄r
+H]^1;)[wsIufPX^֝ԭ;[x|OJtYIu \&J4]pXΖPSdXa4<4 -˙ Ȩ<#(|aJ`a\C2*̔O =N=K珳&LЙo?`~en塚 JBT΀ǀRw@_1}$_ $W]P:ofJf8T.ҷLv%nfPf5rLA#& -^}
+(uk{(v
+KPK
+.X`hH+eRUX>ah)4-uҀcKvQ! #&udlP7}8`RP(&(7s
+QPZg3@I.dA#'ҷ0*OZ(wz
+nzs>^6 !.p)S#
+4oyb@iJ%P (mW7@i_ܪ7pH=TAI`V;.=@iN䖟[~[d44Ps8_=絀ܱCAFn%\K.)g)Pe 9@}J2(=r܉DiW$O6&(d@I(($9'"</+ Y)/&+@V*'Sw h)?q"<&/BR.4TR?d4{{Dd%"|o e"ʲREpIopVGB|k +rPsp GVZ[$Y8!tQ~\@F Z:4:ujЗAHKBot~H򊁈I'}G˙41˶Xiŷ|@i V{Jr Pڝ~R0A %mM
+z ͔%\*P
+ȝ}Z@~\]G
+(U
+Pd8B=ҁ#
+ w@@龐քWEA)&I+P)E*d #o ( P".8
+6JrdLP2 JI$e%/m$JN<<EJJr" M(ON$Ϥ[@ 5\ӊPkB$M(_َ'"+Ɉ6&tYIFm/+pd@N%+J?'JTIK A)J%1Z -@Vܽ{F ʠne!ay^gycx?4+ _{; 4F pĤQI㨺Mž4o3'20YIF@i+}vJ{
+PJ[(|J(P䦙J)'C}'Q@D
+t JN
+T)+BVWe+Ac,J=أ4|M^;Y{ҰaÒdd%*hB/+ L!+ +#˒XƊp:-QGpH4NS[p̍ڃWK1̻|&CK((aYH?nWLC@&MچDKI<Ec3lvy_(b ula@uqFAfɣ!<AG@
+P (mAlÍ}Gni6ě)޼|3$7,|2,7a;7o9<t^((7YQ(q\)ӣ@Ir+d( J&(%K"(i1P&#FKnyRV6<.քRJFxYI˝zAPFd7|3"+`d P}uYIxYI9mdeJdd_-+%̬p,mN+ȠN<@jf̶`Ӓ'JK3)^'BK㠥1,,N?a*G #$Wh
+btw$6l>
+|kXA7{
+V{.ag( P}Wӥ((=)xt'FU4Ϡ=%^váj/GA)K%JtPBXu8)G@?6A%3 (YAI<hS!+4}o9${Dd~8"+KϳI;6yM"7"+ 2drGx6QldmM" қuYIe7M(#?JY)II P25~OUEpD} ZZ)wwb4a}.4N/(2MT0> G2OH3`Y4
+JQ
+ه| (S@C}'&Y<p.I7'8@ep-XLB0
+Fi Jf0AIR25(IE@IG+JrLe 6 ec}o;9{\g{W6Ɨ{ieogP&ЄS6M4MFIDV!2"+ e@VZCʍ4$+/Ydᢳ-Qı.%hi#dZr --v{&ԹQi4 dR4"Ms+ I}2#A#1i.&eRbn;
+
+%9PP%ڂiƓgΝ; A:l3]x=P^@d@$D@IbMJJ2d.($%pTJʠCPS!"6QRto&'i4<q6&7q 4|M m{|&=ۤ/{|C4Gʩm2& ~@VZIu$Hd]J{8,di"=ɴD%T@Kˠ%36ͦاa&{=P}יlHs;σ$ɡ
+nk6bQGUݬFխj{#3
+$b%$dUq7yMʙBLuK=#$TJQ
+PHSR@@}bPɑ!Of,YL@) Py%P`y8P-xY6+ں,P
+AeQ K%98PdLP(i:(IbNP䪎TRR/+5hxDpM(ϧ[@K>o+.M\;iB
+n &mGLڕ,&!bRn I$wڿ' $On~7@) (e
+=tPBVAKnɠHSj[&(dLJdPiIJ[TVVVJrBp9t hǺnW
+Jb~nO-%lY'غ{bOo0nuO=n[jmJd-j2%+r)W)+YJZB|oqy]琯5:291dZ
+kauʏH(Ei/bbRU7Ӟtdj-(9%6@I~@) AƉa@)P.]Y+v?gΜ
+T2ES2Jt(Y@IB%Y)"\2"+թSzdlݍu7e9[Eغ/B\˥[غ-:uz[/c?g~غc{<iغgS[HmUغSی{;]^o
+Չ!RmTǃ:H Fs&i(T!&t?6$7J_%g
+
+%A>$U#S (e@ YI%E@I PrJT4b
+s*}*J
+b!J
+K UP(S'Pr
+<
+ɕ@iʔ)@_~%5dNP$R*ZBV
+2
+H-6@)S@i|dpJyRT( (/J}
+zTW.!4R'JER(yA Y)@IY7@I(ɛG@IMP2A &((iQIV";Ib{Iq?-q.J9ڬ϶&')lkҌ{.Е6ơ{Xۚ<MɗMֿud'zr'SFm6ߖQ[Em̀6o +Ep E8Jեؚ8-o)I`)Qeگ8'Mx*ՋkIx$$ux-#UUp3Ť1Łi
+ (JcsV^=4b`E*]l:J¾QCX2a'kJ_SxZ.$\ 2AԨP*
+xxrs2@I;@I&
+(}/)U
+Pڒ՞1c"hl I5!Do*M%
+d
+P!$Y CmfyC
+ >.]p{eJה}cn+pm YiN'EA6"!9yI1@%JPdLP:4PDKJVRJ:uP<>-(f<bdȵԯ_J%tT.Qd:*NGVQ26ʽJ7Q.$>FQ:QnwJ1* QPJc0*M=yߖP[Am o[
+uVwܹ4$Y6?cgeRڵkGI"~[bŊ~E*=J>!inMjIֶ-h=0ҭuB P ->ZR 9@R0\(( daP2QxRPREx/n?ѝ eLpt]>|Sgp} +}{qtM:*OG9F~aTQiREm'R@VZKm#Vd@i?ҏRRGӒQe,ezUT>oؓ<Zg$,4/S@iF҄\IJ
+K^~V*ҹ^5s^-L9M{Iv/!\J8Z:Z:D@^filJ fYNJdLP2 J (xZR-TPrrP
+PzF@M -AK
+lΡ1PrJ~ (epjY,}
+YVҷ,}ҷY֘)9K.mroX>ûi='~֓ptg4iG8?bTC4
+<oKVP[Yi R'Y@E$ZJGtT
+sQnOuxLP:CuArI 'ƞ4{XIC' ĞURGno֢3@9 +{dtCӧ_UW%Pj
+F (
+J(y%7%v/AIP- ,{ς
+Ja@)R!T€R['p]NJNp!=.G5>&K׮]d,}{=r9UooW`TQi" +- Yi:dMJpSnTT]nO)0*U"#pU7[b$wdĞ%GT&n˗+~=#nRu{ w:J"&
+]Kp!,8 P: P:P]S42c? P<y J&(%K"(i1PƁx\PJ~@)If
+нpi
+6UkK>0(t7Pts=\Cp>;YTo'JXV EP*
+(=ҷqtG'8?Ǩ oé6YiJK* +EВaYJ7 j&>&A&ULF:BJ1ɒ(& P椛y*L8e0,Y2v1VbŊ
+P(ZCc͛B/=mPn$\MhA8ЌGJ (jJŘ1sg'/J(%!JT P,2fd1P$N5켑PrJn (9 0g+d)TK
+ׯo Jf8AIP%Prq.@I2BR&H6-P*J\hP:P:uǽfJJZd4+=b[0*}Q3o dwF#+MBV[i."d%U[asu,KV'EK:WTLF:BJqbR f{\Iz/uHBtJjlu˔bgk|2X߶mdԜ etd|6+(rWXM_Bδ~گg-<Z.tO[J)S.'\ȯgN#ttJ5h8YH\:sgҙ;Dg
+ݴgwۗj
+<U[rrALhUw- CKg@P (ȓJC
+d40daP$%k([܀PsA>LJ6CKqIJjǤt"Ԙ%M1C{ ,{fJ7=
+y2]
+R\ %y%MPːa,bV<( cѺwJjjPRCx(z璒xPR Jf8 J@[i\ P
+ϖ-[${u:zIኊѬ4.[i@d^<,FzTM IӇj
+UKfB2iI8z&tj-
+n xΙ3'3޼y\y7P7SW
+Z?_3CUd1ɒ(&irF$Xki.06d&0:J$R|dL:&e1&$44CXe`9F _BIɗx.0aå%1v[k/e.'\XSe@2yJCUU HhyWVN8wΜ9lyK_乇3p v܆n=XZ(M?c I,,*ׂ҂A 2/2zh"Jjnܸ#%54dұ!P2h)Q PXá@ɚJv@(
+ AKAK˒_BK_Qoi. F9n6帅~iI:BKBK;vCKBK|=LP2!3Ru noD1IGiU=6 #m|aCraSi[dgڵs=Ho `)yL\y'OnW )|`E=X*#GlI8zF yTRyryYb9@i`ԩBKpX(Gh)%aA!WP`Iy#ɣVΤ81ɨo35}-t.#rUWEl5\t 'D粲Мw8d &( 8(\U$3@IAI
+(8(:] 2A_AlnJ0vf:W Xv21*f&PFnDVҽt xEp@K˒R*q=>4CF#0MB`4i2:M:-tZڃdZZդ%32R\;(# FUXVky.L Hru̡)%I2߳jժ^ɞɬ%FF2S[LI&;a„Wx)Gd=E2xוHpQsMKѓ
+eѢE-}szR 0LG`i*u &mN&EKuZ%?MZ2QpܸnQD FYFF#M&i]n9,wJV,rIqXbWgOh$H28( /$y0Ǚ nȑl|!OMȃÆ P&57}wK8pf<pZ<"FY^(T@p(_'#Ζ7
+dJv2}<!9WPP(r$ؽlnb$S1Ҵi"$CLRMTIUuŢ}'>qoFg
+k`JDPbd2oT[.f^n/OǶ H\,,
+0Rd|0L0dc|HC H_$պd>7nY8f y,O!C.IPńf@ByJByr=|Ui
+sȑ3%C;~q \A!O`7ZFr43IMIjꞤnj:ۓ;i[J%j7
+ Ge _f0A%RY=4jvEPdlvN|>&.>AZ?%UѝƝQ\)/PJ'Ru[|w,ɘW*q[R]^@`z]3S7|2 -5 xi*,LKV 0F`ڀrvhi--GK*HKeҒ҆ꙒRܸ fQ7aaܱr
+oM&&w*02Bdl046OAkWhO&!H%>Iuy#S,!6" 4\ܜ__?pH8Ф@h/;>_2N SYsQ*/Gr:;[+#S#! O4v~IqO#ges˿.yd>~xͮIb$!&
+5L 0mG`2h
+
+ݕէO}([ &4ɑSϑ$#R--ddȐÂL7 ˛;}`sKNy@sUi#GjfS}%#޶'JLəiZ)Ꞥxc7n=qfg
+}5lEr6[v>".7s邬,`\ƫBdJ5"xe4h *qҷ|KW.}c8;
+i痤{> dP0]a֭5B#eL gegSdʓ23$Y9!9^Fo߾`i_`4h+7ݒ6)ꀌflkV~$+6HLTM-sS$8II­x5Mǝ֞t>nc5A G`0A)ҷxP4fTF%+kfsب٩9.>=qJ!JW9x*AK˒ nĝrlwEڳ1/]
+se8QBM{yLS[E9.BK>)hDZݤ%3$-nK]p^Eg$LIP"ީرcIvF*wBL f䖟fFϲM %9.-3`>}y/H@-n J^^ҥ˕!KlomƿNɐpb<P?,O'e!ܐpSVPH:B7>'9:=P%msJ.l
+ObU~$Uk1U7M릜Iq!&Z75H'U݌~Uۓ% j5A GB8AI1RJ"YDv5"+jʍA"SO=h
+LyLq0-r:Ko&;*JK?57i ?a$u#%0Ou܉(o׶nݺFZ ^#-
+#͵=>&4>FwX}:t4\[k={><z'_NPMN:
+vҠ:EhBhD8>$ SB⠼,?(nB~IgOnr{%]i[x9%U:vfG5<O)<bU$ٟD-nKf$rojÙle6,Qk݌
+jr#ɍG`4 |-jhi=oxZaҒR?b#͝mӦM`50
+Mn%0|0LSlHcmHXQ VWp4SK Njɲ<G{?'xw߽/ rq@&5۷oF8pbPVj$K€,/O' z%}^IgGq.IlS:v ]Q&ϳXY#"MRcm#)SjjWԘIIbjŭ,Qr!Nb$paTiR7d%Í% ) pC:-=T"]^xRb>NF i<ܹp%HMWMM7MwM-R,k22u>/@ԩS 0B`4 ,q)-jKfJEK֚d?*iϞ=6w['7jrwV^]#-H`Va0:3ۅz9$?|ի[.aW\Vm݂y$~2+}ڵk</3i@_R7}SW29=M^q4ws$Na3C
+#}NJl. ѝVgdʻI].O?t ~#dޗ^z"9OBcs=׀P_k$ yrW^~ {$9-3 [xr:NiC
+s M SদMMӥpp pSk"5=dz5m
+s2u/78`C9n4yi!楥X#q ,—AK{Բp̐:QpKb$øn$uKKfr3REE
+%P|Mؙڌ3hH4 Yp'GHoer]rCR1N;j7ڶm%sK?~[G9@KJ<%'g%ü6Q|.dSv
+8BP.9mZUIvk*XH@3Ҩi,0 iG#IIHj]I-nKb$WR Ȫz&T$1ɰpW]uKHI[GU=䚠d?e0ARJ[).Z%EK$GIyG6ku22),IMbpSCSp55=9..ZM7n5 AjzMOL/LLeDM+5Lp0 4r|LDZpi~ `d ! ەi Uk`
+i)~4M{w<4RFF
+wr\ZPtP?R#Uj
+#ax&nKf!YvCC<$NIӜ2xiBP9Lr(pk}^=r%vIgMB6UiЌ4j"#5f#CBRXH0Hdr&UWLzGrpdc֭Q * R-5m'wp .Kd]V>ZBef[n<.vZ?tKtt.t1t9uP >QT9"Sg2u{8楱&cŋ_T+K}y1+0ΤP +!kBGJh
+2*kF5fQYcT֌Yð!$$_ʳHU3Qp3z&Ĥ2A G`8@jF!Jx˒AK5%gԷѕ
+yV~ 2…
+fr9sMELk0&zP4 әpyMP:_n0g57ݙL~4y-͛7o.(FK+Ӓ2&ђ|5FhI}_VñzaF:D+H֭[i~멛P{i245t?F#z M?[0ҫ0ҳ~J~<`Ɲ97drp"u25Kbll萼)wH 
+C/k<+M%[2 yQ&b+a1WtZXـњ0ni[iL{۟r+ruN$}Oiڕ7Q!;,2,i~Ғ1Z7.YO^k:>sRc5lCϵ-HH?pFzII>)I
+M00ҥ0ҹ0i?#}-;lb^Z3{V<hf`g@lZ)@sL ֏ HR_ H.OH)_+9sk9& E([(!,̼Ȃkfc#xd\HvεYv}Fru%n^7jcԔM̠T Ej+5JKdYv&;1)
+##-nCz .΃Nl0LN7|wkǩŴe5 v@+Z+Zc ZHWێ_49&y'=i9e2PLAe#ٗrmgck~kRS0FppqִUv)"dI0d
+@-O򞗤#ص ߔ1}-SԉM'txL$ii5M3X͠lcbgN.a;sr ǝI! H^Z )ג}K-- BKB/z/`j"ӈhlNۚ7H/PF|
+IT^DdnaS7CH'JK˴d*\&2-լ@*R徶?2Gr"4XHHבsw9t!t&'Fp``=ٵ=Ɏu]vq-omm홅h _ lUf23k5Z=Heچ|YW i~%$=AL,{(xCD821Ȭg[py̨,\!I3Z.)HJjxqE&(5~>-mezCxz/t0Uɯ"S]<)]KoJ<F<`ہN:@w&9~s~u~&.ȴ1 M˴5+S`o H K9w.dYғ iPMJiCp\*-:-,#@R\-&2-32RTdN%kH2ҷ0z&0E0Y00ұl=w1i{H_'Yz;O/[yϟilc;kzZQ@)DOn,(4k5BN_iVHzH!I`;x@|ʴCQU[,f<"923l\sޣE\HKHq JMrgJv J5piɭnw&nL/ie
+tttl*l
+ZFG6І&l2`Z t\>+G+3A
+z7Xdђ+#P3ջF8NS\E7%"l w!Y(Ti R$I44][нhTՐ~Lv}FFF:i{*ጴ/j@mƪؓmZԡV#J
+x4 <in`nO Ӓl8KHZ!$$@,SNxءaRpb143g!#{ȕt.$wF%ky}P} JMY@>sa?cPZ>TIfLW ie
+ȴ*5eELn=N9vdTwc 7b,|qgi//-r3ES>JTiY w(0b^Hѥa5꜎kL#%s!-a;V?BʝZcJ WCFzJ?CrK.YG2Yew Ifib=LV'=dG1VY?tz6OӺ,xZ9$DH0DW|̣"e1qFK6@Yp-=2<"ai*^>dGdQljRSRbGJqTs7JK4 &ni] pP$/Y cYltXp5 Lc2MOk0
+rb<E\3{(f[W\gJG5A)-(> j^7@)2FAi
+q6A)+.(٭ R-6m۹xCȗx
+z_ZV-1< p9>䓟V/E̩8HLQdw5%w-BF>dCFFH=⑯>'<EW_ >==N?z=d~;tCywio
+J/ae(ٵvle%6A,r%oہM~Jv
+q+;kcLK4LqLڪMS$UKAeZPT*xȿ<RO}iϿq!ٟڟGP}}yG{_p*z=s4|;n#|{ChѢKaa3!ڌ$#HS a$YcʌUceXyib
+I.CV["KL$_}d_"5Hy=׍ `A0%S(͝;w@9E@i=(mv(3dikttdmʻ@ѷ.HqGKq4PqA 'B#GKfh6GK27#3b-R(}jXRۊ.]C&)Y<Bx%yq{Db6O_.&jLΊ|GztN<T\S}3b:I #@M@-߁/uƟ(PS
+2o_NG (SB (!<x0<R'H@@i \$~?
+pdIL\9s5Yx nrq%e:tFEQ
+ŋU'_KLaωa(U(!H!}J}J]JmJMJx)J~R4>%?ww7o֫^{K/\s=<䓏=C>x z7`O=AptpHz#}1=a]02H[WﴝrH3f̘AY2)d$c0(^. JHڢ rm$H %%uAi-\+ #EE\zR
+\_J+'_xᅧO?V@|5k5WK}M <M<MS=pT9bkҜ27LVv0Vl|HcP ik-Y[2-u<6^ޮj!ְlIaHJT
+JkOTt+j.hE"wf׼ 
+0i[\n%s&[~d2ј4$& z#A$}2ئ= T݁b
+0S`"Y*I'-"?>I~3'<|oPTWWz^INIxfQR+_+ ^. ^,
++s.OG{ O=Է{r<Y -Y£qB髯EO]|gHDKjTOJj|MhL}ч̓}}͈=|r|͒}`=ٍ-<͡v =yz4|:bdXY;LVw^&*dXiC$b ǖ-&[Vf6
+G7# 0ZcJث)ثU0Uk:b#f<f̦̿)3ev'{o#ML`: 22icLڱ/2]j\Mׇ9[;7Ej=ZZpli" g !AF FJ5XuX 7~-.;|"{]u RV$ۈXmN㿝AY]7I$y(y+-zUBEgO1jף=Ѯ}]HP /@>{_[£m£Mnhm^YR.*O/./,Z_|zN0{rNX{BSO=:C~ԡoRe6')퐐Z )/kk''x4Hx c f&i!b 1w[EsczgÉnS&-[Hl‰,&[`*o{#fd17q&5u[&(}d9"Һ#J \"%s&[`/F[reEħeQHJaI$Ş3i{ tve 8q";*t|MLy6jlӦL-p_ۅp{KswPdK-0w&-\MMpq7y
+%-y%#y9+y9W I$yyJm5'> C_HN=շ;wݩ-TSoPoPGخ~]tuz6u⥭7pE-JiK.9x,,a fijuQf?}Ӳ*{44;%5&4['d64#%/k9kdHz WVf͚5F# H}L&f'S=zQ3sL8mk'YphUUYB*/Z"6#B2#n)p3Ԕ*(5VIKzl9-0{pFt`TRi#>/$EݔÒt]*dbrsH--B+t1F=VkXNrMrZ_3bm&z>sR3׶`ܶv$uL{A&2Y`Xn;ڕm'Ά΃.tiX馛n SnS1m. ^bwQ0XQO<x R&O aqN $I1O_1I Y399AySɓEaϓ%-[߾&y4tI<=`PԥoKO.=]]z;u=ctY7vuWw
+T\q뭷^.ڼk=Mxtf+Tڢ>$\=Q8p'Q;#DFckZav) ^Hj
+Kh2lдX?h5iM5V&H3g4
+L kh1nRC &m,&m<&m%fTtf̗L1d22L\&qpTxx:`]ru$u4u,uN'AP: :: ::
+
+Pq% QեIM]uUR4ISեY+ E%-ZY# :>w:[rN^s2_8o;q@_~=z#ՄլCD7ѣڻ[Ge:ջ;wwh:߶Uu-JT^/GmT,xQ
+<JGI'4&&4d Hd!!]Q҆ %6GrHNϊ#4ƜB+YQj:l9BFf#xq!n`G0R\-f2;ԔZ[)R$e)BK.oeyGLdMxrb3"jj{1MeQ;HOF!x`<SdJصVa`@
+#HV#}Eɪ#4"<687e)⌯922;GfݱBW).13)
+Pq!IIQ¤jaJ0-ZᮏeaNT0/9 9$:k\Z8'!ɱ>KrlQ}#oG}sP_t࠾wA=7h I >گܧF؋oGMzm.uM;4kx6nՐmТa\]<xY5 e4SI$LziӦu#iCZ<2,挑 ($D}67m7 ]%bh
+9rPd6;BF{ȹ\!H- 5IM,@iDn8ZrY.LpAE0ʱT}q" ?ub0DԻ $I'f(2 J!yFl]ڎt2݌t/Vd
+y$+LZa:̦u `Mf"3dGܞ9#sgי1w`|އ/}?,
+bg4cBi@J
+S&<xӌN6mtF3Lғ<yrWRҙ4iR;p#[mRӟe @]BHG2*I#覾,yO"vd3j9<s!Er#5IM+ВMh>2E#('nIF)K:ǫ%QUIT%
+£1y1`Nӟe>=iPWjVLN8iKHZI )rRZx4RRPJAl"x$("oŹ6q/Nl 'H;GF+$(#<,+--%-9S}nrGPNܒ/ndj?\@UI!d,AVҘZ1m_;,ˆև ɍf7f{$d
+NUUZLd.!1oۄc66{z--}ʇ|ͺĭM̭[s&&fVHVZ$[Ilך٢!znf=M{Ic3'v}A@
+2GnM @1))$$y$~//Ҿh)Rh)鉹RP
+<rJRVIY>IX5#$>N>I5bA#8QŹFHMgRS>3PZJZ8#SMn5Z5/0B,KMd2Z֤1i*g~k?ϰer0R=W요V66XtdbvzIdc_fGsd2w2LF+# SUi|t>t5duc $3YӗUkq /Mf3=LnBihfF{,:3/AaE5FI[Z9kG:CktUպIѿN#|j>`*MMԣgأЭTvEc:|]x&<m%QZQ^Ӟe>QPK+$$gdI&Яrן$ Oxvk|0P0gR9I;R9HF< |դݍggtǣ ~v҈L5)"!8j@p+5 &ďE&% i{JLڲl^)\Z@}&,d,9|mvo <jalelZHN9{]An8A" Dd%dl2'BTҍW4jLOi\1=0MOఢ4d5*UVV29#^L/Ji-TnU&ڎcJdertK&>m<M
+刦S
+ɜ\BZZ6J$tH&S4IxH< tqmHSۡ3wԢV5\رcJ""!drQVS鮮\3dHBFR5"oRZ
+<W|J>n%c@(PZvywEęHqI#ZVJM(8QٞԔjj"SOHdI~դj*kTeIKZoRb-a5M)`9w$~5)Sli dBR`X=4nZ
+FJHi)^3FQ<*@FEHQӌvcT___gU+UoM~6P@+ADJ́ \W23 U;)G4C8~?X fX LI)jv9v=EȨ2jZ[!zDv4"FQ!!`'2Q$jmmM%+LT$_C%s>iI_V7aP-Я|[ݺ% ռg>R!Q3XPT"xa&#5󤥥DTQ|2"VC=
+X5&m^>ۘ ('0RFJ#}^+& ,4HHi kD<ʁG9(@Sݹ4JI(a@kUFioJG(Ϊtg&ݡ{<*7ї‰P83JJ|Л3H7k4=y@hIH i$"tΪtN*QϨU
+@F-QET42*CE#_ ٨Q2BFY(#
+
+of5$Q@ɕ$s7
+J5(fۍX0qP(ģ&#5eE4rdM5᩾4V,2rC
+BI
+SBIq&z֌5L8nJbECĜD&HQȨ@uJF9( e! d%ӆGB!D2wPQe:3c9G9aBEQ ("`BŜEŌ939љqNU>O4HW]omٻ]{ڙ3NԲX[bm Z疬CDZn r+*+!-+
+J
+ѦBȩJRV7*+}PI9m*ⵉᛕOF{"=KʐX}Sf%^dQR|*]i1Ozb^1]իW RHxjL1}D=RHi#\nZ,!EQ:GGO-N4@RA'(2{&Cl( X,$Vh,XH )z'o%_Id d&$F,Kf D*ɢot(3$2$=JQztF(i(ML2Nc ֩ubM"%+tKVVyVVoQ*t
+1Bp5VYTe%SzJar36 ߎ$d{;u{?AJ-)7&2Oqx%4:W.<-iOK}Hte)<Ar59666V :86DSjjL#F=R,!AQZGiE{M:t<$SA>{Cɨ!PIf+4TzQfkE/ϜW$iHeNK_7s:[eB2Лf2HLE
+ɒ>"3tFigQz4EhRC?D(mƌS:XXQ%+-QY A*tT*D
+-S3>m`dd3ڊ. MMlX}1)o2f+͓QdQ2ZL2( e5zm<uV0W-qz_D䑬S#YcM 75RGJ) z4hҠ3"I&-:I S z? F
+!Ě^!IE KƴwΘN% bK%O$S'sF=JgX3J!C! ZtKV$薬[*,+BO**~eO+JZeTF)^) Ʒ#_9ߛN?[el,E㠌V16ܤlEy22j(Q#D y$j>HA Qj$]x0ZcƄk5zԘSGJ(5#4hҠ2;IZ!UN-)gHU m %5I-E52=IGB5$,iբ!8*gGi Gӧ'"VDgHd
+(²R*D!=Z6L(+`LGI-Eʄ|À6ʨ[2jTgTUnF=-H(Q~LG9AʈIzPwCFKR^98EsL䑬1[^5z$kGhR ACFH$i6@%iRzN!`Z%]紊czV~LHؒ&bN)HGiI{霑G zTB$ѹ% %*+QY Vo$ۄz3(?BfsoVhL5Jqu(<jMH(Q.F2<~irc%|#RGJEǃ0&a+LVUF=5#I RjtA&R,+`ՊZ,gV]$i EwdIMNKT~iIgGi  m=JeQ;U*(QYIk̈́=TVRv6a :R<R
+ߎ$baI1en)nULGR%}prCI 7)Q<H\(KRw*1P0JֹHxdXg0EK'f%IpwICLuP茗`ZKΕZCeo+VkL
+J%{dhTH8R*FɄ7UV'JFvk %RJF 6E,,/?S[2j.&p3mա$e䑌lI$ʍr1IʜC)R^=*J($2J}+=$%+⒠!#F)bྌ%Cd'/kIJ-dDgf:#M{G2(iPV2a葥x6u΄ F)>,,,)VL5JCI*u(AʈbQRlKI1%XnI2'-USHQR#Y%H4<,iտK=֛Ani]]Y2 *+jo*6JFIF7~<R)3)Ip#pSIU$*,%*Jc$ n9k[}SܢQ:R B!֦
+Z?ERh#?J- DѴGG*&d(aVJM8U;JS,-}eY)F)&#_i.&6r
+bb:#U I呔:jM呌T 'Qb’bTFIkMX[RՖsKq[&oR'R(KiWYRX!)HU32ꌔ^Tn#ܪb֮օoG%%!RVڄ-iTI围̓T6JRZPoNRUW!T%$#)HZūĝYXXXE⠒d%8[R-mTɨyRDQRZ-JeI--ܪ'BSWrFѽ6Gp*& KJTLLZI<bTdD[,)ZL
+)~H=JIXXXX"f,+-j&yR9(2T_)ɒb$h#!-S8#UȨ=Gb KҊnILZI<)$*RZ}hOPUy0QԽ63z$6J,,,,x-o2<i(ZE%YR$D)Ϥ32#q1%Q$eݒSުe2TI場Q2Y,ńFYS!-S匴j-<%sKq[&ɨy2jvU %ňJI5m#1(-`&-rPqV.ca1QLx´N<G_($-2i&y2jD+y$@~ഞS)R9#H,,,,)DT)nߤe:(  Kb SzU@e#t[2e2jQ re&W:#S{$&I7XXWj=F8=b’do<x-|:~MuFXXXXR=+'2jL`,,f1;& != K )^) Kڞx#H,,,,)ILK$$g{b)/dbq!c%^򕖉mFs [I’[,,,,,)X?Q$$baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1]88888888888888888(t߄a8ZD7
+Bk9"ߐ#&B5$GBijU0o3H1A2o*tL%iBT
+
+*51ǿ4cLQ+S&BʧS@D3gǸVTc
+,Y#K'aL[5SB}֬?Ï?5G+SVBPuL))~5e9nb>Oٲȑ#'Dٳ*TyЛ|)SD
+<sΝ"w\9+bTP4N
+)Z h"5_9C,4zR H-^dRJ,QXG<4.Zdeʖ-WlҥJ
+UN);T8Pa͖#W+QL*VTbʔ*QHy&#VHP)@){< )Vt
++TZjʕ*
+T̨?fˑ;_J)WrjkԄQjʕ.Y
+UVShR*;8Pa+TQvխSVj6ʗw,"`Ō
+Hiu7hبQ խUj
+eKrTSt;p͙'b":6mڴYӦ֯SME*Wuf')U̾8PW 6kήeM4Wz$Yⴚ"CS? l*5oܴ}6m۶imo׼iujTTT f'5R*ξq֪רiVmڵС][͚4S*R-T9POʙ@e*@mh L;8vܥsgGmZmXfeK-/0KVSdP Rjђe+UUq36;vڽGݻuξeSj|` endstream endobj 90 0 obj <</Length 61001>>stream
+(r0!,Z\jضhݾcnN!z9uؾ RQBEYⴚ2#BJٷ][{:۷__>N:uhcTm* ,U.ЀZmܾcW'gW7ww׾}zu֩nS4%JZM,iԬפESO<=:"QFoҲCW>^}}x{ԥcۖ jWfjJ Zm[uo ߵSW6-ԯU"%N)4+JN͕Wjαs?֧g6-ԫYR<ZM_CAp0N=zz 
+7ũCWUB
+Ԣq4bdpAC|8u`߬%N)64Y#O"%Ԩׄ8b1!cF; oմ!%As\Nao#w"%V-"ToAcBǎ76d@A@Gvv ,QZi5ŅjM;e+U۸E[G0bT 'N?vLp /۶D5]ZՔzN oBTVQ6a#nj6iILJ
+ܭc`*+%,VSVvJ+TݰY{ԐaçN 2iBC}=
+QApZM甾M9 §M1cǎٷg6-՜VSZh%UpJ:t:N<mƬٳg͘6% ש3X,_I/%J6nٮs~^uYsΝ;gqxAfMҪH0\bM jm;9Pg̞7̜6nTo;Z]?l(sMPTER
+0&h
+<k!BݵÇܷ{+ϛiճXMTg;n9sʝ;w\roR~RAI8S6cA$@ݽG9F-3u¨
+>ثS-&`܂e[ C0yТ5t" !V@5wC51N.VĮCw!#MdB=r3gN_d޴]L ;ei;C+{Uo9,#WoZJF-w4|9WGO>{3޷ssa]l8H'(6dU}+QT MK(VpԘTYCIbZD9 1(0dE+m}3.\pclɡ4֕ .X ˖PbJ3t%w~͆{XF*8Lp9B=v셋/ =7^:K5|gX*| ^rch]gƝ&`>oЭTEW*?wt=t ݂P]thznH焏 WvX/8B{*;oz}WZZJU~ߜT(?4sw
+L`ŶUkԪSB7j԰~:5W}=" UՔz d
+- K7+$ՔJWF'`YVn Wߺs޽o\>{О/59$E+U(S:/d V]msmwp}֭Z4mTvu
+4]e
+UMIz&lC7nߍT\<sMkΛ6AoYS|iZ`A!ERvZڷбS.]t]vf
+Uk7 43._M@sb޺~{_C5T)^XhqH54hҼɩG;oc׬qZDw lJk!#O_lݶG
+w˻bzkVVZuU(]z1`Cu{^֯UU;zͯY`*ձYp^>stvJ3' m֫SfZ6Lz4;
+ 2Ȼ?RJ|*_=H-RpͻPTIXٹ}& ׭SnMٵ}<}<jTi+g_TbT'8lًe1>իϟ<[`J؍ҮYF 4hضy+kCBCCƌ4t 5PMbRR2Tuꋗ_z飘W/>we fй۷lf۸qcf-dCG7~„BF6اߞ>A,Z0olIQ^U%UzCV-7kڬyKvS1줰BbJݫ/$s #G
+SyQP:;u֭{`7ld؅t+/?[ծZW4rJ57q?~}G 'US<P=ég>tP t׬YrsQ6oXJ|Ts{oɇxaݶ}^qFOܺzvTW,=e\0Buuqի300h1̘hQ֭[fed\HNm
+Jy` &f_ R*1?ycz=J6),td}g[rݖ;yٳO;w;A-W?`*Y_q1ctae'!'@Mk"M
+w@]f=sgO?oǦK%]j*r闗 +@͉|<t6g_XkU16>sMw2P\u#'ΜpsgNOd-ղazL偊 mbס[OCT̾R* ԫg'Eznڱ.F_M=vnfIVɗne$+ 6zz5a:x-{P5rQ/lc'@]uʕKϝKg
+S%kB&ϊXa<Rk1@âUF.]zKO'*r#jbSi5j
+b[iQ_ƒ'^>zH#{0CzIdnׯ^x!X.CCj⅜P͗;!2i,Ra
+;4P?K&`W,cǾ#'E_vׯ^ZT/Z0D)&Ti-^b:j@mҙh1>*Vif8F
+!٤is"VgD3suL
+:@_z
+ \!JU)+T480v; Z™S@7R$D=/J kEo.6jwf1MP69qz<Pa=s-
+ᴰ4P=
++l9(er4%x= ƒtl7 T<IdDw`ҟM;75iLSG{ۺ,|JTbƗLR%06lֺc>i򝧣cX!D#+N<?7f߅&p{=b<thצՋgO3l[OG<"*<3J_Vab*VP7mա38_|#VLdbzz{x;m.^"F
+yB{û7Y2gJH[Nsyr~S5)b;
+Y~& VP[up3..NO+$`(Tnnf_
+P42|LIO޳%jРA:iF'Շ꿅NifLRrBmܢc~c¦#F{!8E*Sg!a|EC\7up?.m7͙-4L0cR'򔯀OO%TNP=|FM
+ؼNO<&vKQ3' _pW-JՑ|Tnmi]zKܑX/RDTaJMP!cB2{oޢAGw0t.x 6g_XMJMc$pl O%
+oWLFL+_kd
+ u%ԨtK??z!& 
+vc5i"٤4#Ci=sWo޾{~ܿ}C7B5Uc>j06Qʡi&MC&̈7K'MT}H:lLo\&+fQh<`F?E}OQkJo߽ \Wi pVAk/`ՀSV}j~ ΌNW:76lfЭȱSf-\VE/50RC
+NwxYҍttZ`|$y:i&Դsx%uAC
+R a"^N~.M *Zty`ڠi]z,I"bGj".Z)*}]]]0DTVH_?շ=&4fS)g) C5WvA5Sƌz?Lz]lc5@*>V'E&%= NA3[66g܀o7-Sru`jƷ@2I+os$jԶ&u)4nn4PEa;`3P}ᔰ?gJ(&.Z6Sbf̙33~2dA6i'#UCPԊ2 ȒEs \sݦŭe+@>\MAahoN]7<P=i<v2LQ 6?޼xu">Ln[MRt/nl?d!6d"+qMf2SR$".w18 '̛7_ ,TH% {uiCMHgd޿esV7y1Y@g&Mqܠxaϟ>û7.9Ϟ͘8jukDrdφg5g| 3\eCUhKLJ~$rD+N
+bJ,U\JtsWV3`|'뙤?@V|R̰ug:lcs@_>P}ʈYCy;59gϖ'@ l :DU7Levl(9)rI3m^16apK,Yt_/c۠IsD&1̠_% &/B}-t4Wp}WO|q$]N߶EcLbE
+׹s墯ü?N6|\
+aơ 3-cīUQvz 7ma߮cמ})Z+Ih|_}%P# 4?pd68E* __? +UFadžUuNj
+TT*_TŊ)\xA0xqJ5YfHv]'{(A-Ҕ&j 5mҾCLm Iz[d
+Ng:Pq]0sʄA24pĘ1!$} UJߨ廉ݸTPLR%K^̬?L|\
+T
+ W*;.=5lC4rh%α"?#SXc+hخUԬ^ŦR
+˕o^Ɯ?
+6%Kg(yV3)8uU:I/~Dy(T(Xi,? HQƦJ:
+f[keoҽg޸PdhE07{Z1w!F
+
+<flhMI%˗*ο6Y:zؘܜ} FUwd=.8_=Yn* 铜!S]H-VT夙j5[av Q Y}[صjeߺMv];9z"jL$BN;,
+aCG
+2.,|&M,86 _~ͿWk̥^{tЦUM6WNZ0gR *6a*(W4y2XAU,7V5SI6.Zd鲰,ZMIZի
+& TeWTFl٣fV=޽{#&=Pf4|QDŽ6y*+6l%1Wa*O+1ؽmU˖,Z0޼yF,]=4=' Ux,|z<bތ)B=n_\ыgO''x^vԱC6xe/bR L; T5
+-YMZ6oզ}N`b{9Ax 'Ve}LÐe0c3va&ü9k+V۴}#'d|LfOhJIߞ8{][7]bŋ#/\*j{J@OA QU]MaԊ'hx!~>677WW|^{9uɻ]s[wT._P% T@ɗ^y)HLnФ]]{킧I@AA <d?Ls 6},)1bɲkmܺs L$/,j.?}о]6ZrŊ+V}¥ks
+/1T~M ?g+.;s cz70`!wd_d@|^{s6k\vu
+D5Wvq-@ .RL*54mٺcW'n^yb8Ĉ#F I#s 3圹s_koںcρOtMT3)'<{Rݾeӆuk!mشe}SAꢔO$P=lļiS&M76d̨Q#{7WQϋN ztulo¶A
+3p)ɮD7I6(M nХs_w/A$ Banb)LBX.Y ت5Qc<{[)mS$"bKlIwh۷n eێ]{ᩐGq-U x"Cvny93O '_}X !!cF%hPHޞ}{tvhӲiCZ4 8s&i&6TÁ{sjحCG*dX_0N6} 10eX^k;p3磯ܸ}O0qd՘D޵b|ġ'ΜF:}Tp3߽}󆵫G.^`ٳfΘ>TE8Ɣ)y?.tL~>n.=vlkT++UP$:@ V㜭u½!&LH`f; )Ă .BҸDrӦ[n۶}ػU~<:+x(Wϟ9yȡC8tS0үKb GP^ pzу8o\j%#-\
+>s+ĺo\%an޺P޽g}<tȱ'O=} S< J0w}$) 44\pǎbg\r`*ā?Gs6{h>wF;anZz˗/oic =/aM==<l|HpswǶ-,M妡J&k0JM[m
+0'!y>{Ƶ+/^pŋ!cA|G1
+,g#D+Llݾc F{aPa,Ұqyܹ!:z޺}t<a
+S/m0HZU{wn߼q+W\v]<HdO0|;O8~Cό?=ؾuQXڜ=- <ήIbHkѭ+MZ:c7Fڀ7cLraT<%%$7
+^DjCx ~<9}^^d."3g)ARD;w޽8?+O=~{mzL,H{{9ߏ#_۱Kb޾u+/ED~<| 10<q^KkEkݜZ pa多4P=% /_Xq}H* rE5*%<x[G>+fmЛLxAT}!$޽}
+_A~~|kC] @x6ևc€y51_6go sx/Α{wnݰf9vٷcf }&S}|OtW]{fEtG:{܊#ƭ[8(iTJ,cS/( RDIBb?h+b}S<|ϪƦGy>4޽sm7k\~ Hާޱm#>.xոN5]$H:{jĦ{H6/ C
+!vI"[p$U6䓤 4nپkoz:p\E's/Ę JA@"J3
+:Rݿ+^]|"[NP$_klŋn9<#4$
+H|3x^O/61X @\!!?ŘAA+1?*V42sN~.N oμxYWzM[;:I:EV#ZhP02G
+:!ND!" ?(@S穞Xay@+D.$.ti`׃9a/SUć|\A6xް1fꮋ/^ B
+w"_FW?承u>}xb]<uXp^@/V jn!S,Yeϑ>ӯ_Ώx4 9>ü!aSo0bףO޳E\Pz%%ԴzP+UP{N TTLZqsI'$^ Uw#
+Tq|;YA͠ulHPLA'Աx;Y2ASν<ȵflC &A]9/6TP= PCe@zPԳGP={**A|37Կj KP<srʄ:nwkhA=O7TPt/jaC` Z`0T jP-0C` Z`0T jP-0C` Z`0T jP-0C` Z`0T jP-0C` Z`0T jP-0C` Z`0T jP-0C` Z`0T jP-0C` Z`0T jP-0C` Z`0T jP-0C` Z`0T jP-0C` Z`0T jP-0C` Z`0T jP-0C` Z`0T jP-0C` Z`0T jP-0C` Z`0T jP-0C` Z`0T jP-0C` Z`0T jP-0C` Z`0T jP-0C` Z`0T jP-0C` Z`0T jP-0C` Z`|P38u+C5!nMaP{y
+NP
+0Z@=JP ^yOC/꽛RNe{2UU S}
+ҕPCYf˞#}@b~|C1P+@}ѧٲf)jJ+P$ @cO!S,Yya ۏ~B/RM<H6q.OJPټfɜ)!z:"Ԋ@*PփZ#a!g/^ySy P5 f_>}x;.:{ų' CTkDcZ][N>Lxզ]N^z,~_lambU0Oן4P?cW/<kӪų'޶n䁚=w*
+j_Tuuw ۶w<yC~la
+˕ fH2$emj6l޶o iVmؙܱkc=}ͻϿ%~!1uz,LO1S.(J!?޽y飘עۿc*\z8wnۼaMLI5@͚-gBV/,TF\Iu/߸s~?$ Z4Z@UAf߈$ "޿{޿sBJ]83lt
+Rgwacf,ڴs@1=~ٳgEH`| O<"8\OeR}q
+~O?zs `z"3ݹ $025q7i +kS$U'WoD\uׁ']|;b?xOg%Nbr`jB<.?cX"O[$߁?Çܻsϝ<z`u+#意)AM0Iz>A-T*^Rzx͘tm9q|o޺}`U]u2$6,)ґ *( ҥb{kILf2-ss{)Qq;sc<gwֻ
+W?~O޼vPz`[7o:ִ^-tp8V,_޼lIS†ꊹ%yY Q D}@+)U22H6h5$2.9='xNYEUMm] -jll\)K,Y~+ZV^mӖ;A뱓g/3>՟cnө;'qO/{[.?}vl ɲu`cRHgėXh u5Ues sғ"CЩ $ *LI#ǨjA1 )3f.30Suu h\dUXmߵQz7AfB˿ʝeû NO?wMmkW\liS"Q__W_ysJfΜOh
+e־] UPXyZ7hvqIIiig.˼y(._ٺ~vzҵ[w>PϢ1RIe]Avm߼a˖@_S]YQQ^V`<JJgLKN Nt*c+
+Tg_u_Lԉ).~!ѱ IiY93ff~8mz>`+V݈V:On=}]Hk<F3'ߵ}֖E 5!f}7b"/oƌܜ쬌Ԥ舐@?ow)ĩ8eL8ˤ.ʅj~+
+V M&Y:N 
+OLJNIIMMKKK0282337sfJav֝8s*&R#xyz}t UsK
+f0NA3>x$'%DEy{LudbNaBU<_oq_Db xHc0bTwi~C""cbb$?Դ̬PU.X }_qɿ?kv#={]<s-m+,*hK/0hDGEEFN>nDt:r&_RvQJ*I}4'Lb=z@`PPppCG/#:&6.!195#+7d^MWҾ߾BGJeB;7@ݵmnU͚3`JRB|,8';AA}y{:;Mdb?ASmqڿ(vTQ kUL}屪ںƦ6vN.n^>>?}z
+TP;kUiujdb6jԩS]71',|E'e((WUؼmN<̥Bt?g5+,_^ZNR4Tkˆ8;;9:LdfbJU(PbɷGgh<|dK+k)666v=2C?0$<*V_tzS6RW,Bܿ}cwoڼl%GCY L7שċ#|RS痄qbmme9yDcC=mMuձG:(M> <jXV-ohd<|ҤI KʊM;:LuVsfU/XҲvӎ}Oԇ2
+uұZ
+gd$Dx8cLA3VyE})Dc#C}0Q:v(H#r&.ʄU1Xq5&DSSEz3ӃãRV7
+
+3ZyÔ}!La-ËS d 3+D@u4<z1cƌ}Ʊ
+H > )(ڠr<RU}w~ae9b81:fSӯN;XeB^4lp |F񗀿q i]}f,mݼ1R3fϫYt8~o<~i1!ÜY?wo]9,SariJX*Xtd\6LIih?D)_NT* VF++v!C%Æ
+V{VzijOfd ۑݹ}U|k[ӲxZ,
+UrEtW˟p+ R90B[BߘĴ9K[Zo־4WboؾYZ{1#Mn޸v҅sEr"[n`%`;+$T_
+"5c9eULآe-۶h߹k={٦jVM܏ ;ۻwݻv؆v֯m]bYScCmu₼촤HH5WJTIHR!v/9s&Һf 2k+iTjvlǞd۶nٲy mH%Iףy%E3s3Sc"H%RGRGTkR1M`K:TVcK5hYju뚵k׭[OZuڛZaS>XZV,^; jʱG ?<!R*L5#XAOKUT׀ׅ71 /_A:u;d˖.iZ܈WW+-G)K춱4#SżUb8yFĀ̜3 JL,짆 :R=H[2Kv~MuUE9e5+/4!&28OLREQy:lÚqZKLam.)3w^YyEEeeUUu5P-ܓ%(/7wNiIqQ45)>&"4߇!TJQ(aZEȘy3g1KH7NS{dؘx6&53?oi7USzڢ}%7I5Pc2SPcؕwz`HXdtl|B6T%ԸnjkmHg3VX}R  M.5Z_Mgo]HaKҰp { ĆJ IɤRfjBMɒb"Hw_O7G;k<%_M%1T#f
+2=0($4tˊa[u6&#bbI{А
+TUUr7;>`l]HL% \I+,=bD# Uѩ_-IX
+BP(
+BP(
+BP(
+BP(
+BP(
+BP(
+BP(
+B**v)QY{X;+<3+:[/=e^ʱ>>)ڌScSJ}s:9y6u'*1`ollg0A_D9XTHOOY_?}yq&?Ce/襢B>"~13e}Scc^N
+BP(
+BP(
+$OBJoDdzyRR VJ~jS}RZT9V?>)|SjUSjUTjUSjURGRGHVqJ*(T
+J*2J*T
+TPB:"ԩ
+*UPBJ ԩRu*DTB
+TPJ ԩ
+*UPBJ T
+*UPJ T
+*UPJ T
+*UPJ T
+*UPJ T
+*UPJ T
+*UPJ T
+*UPJ T
+*UPJ T
+*UPJ T
+*UPJ T
+*UPJ T
+*UPJ T
+*UPJ T
+*UPJ T
+*UPJ T
+*UPJ T
+*UPJ T
+*UPJ T
+*UPJ T
+*UPJ T
+*UPJ T
+*UPJ T
+*UPJ T
+*UPJ T
+*UG*'rrJ *@TB
+*UPJ T
+*UPD^RUS*?TB
+*UO*rtJ*@T"O*?)T
+ b:#m3=f|; O
+e|'
+BP(
+BP(
+BP(
+BP(
+BP(
+BP(
+BP(
+BP((
+BP(
+BP(H7|,LMFO?pP6 },ߟt4W?$僐TYORG)D^O
+S^O )DI+Zd)Q
+"x%Z`Rލd//b^Q8XĔw!r*VWݑDH+IΧSPF{ԲZO 5G^+L@GD׽{ӧo߾{ Z1ZOф*r
+Jg hIU?8孈Sp(/*JCUHC  <V Vj@lQ
+F* 66Li@~݋IԪ4l#G ZcrHJro?ӡÆ<zX`u!ӻ^Œ–܄JQnjSQUUSSUU7vÆBJb"$O*>^CCSCc8*JUņ
+/*$+ 5zxM- ::&hkiWS;zp7YP^JfT~>rXUuM zz:ڠuܘQ#0VNX*Ψ}2lXt 'Fښc^N
+hJ%/8՚ghlbjf>ixj{2M
+Tu&8hj>b8:x`?jUȾ1:\y:5limckkgkkcm9l*WEMd_ T-]pjaec`o;rM*[,iU!I)O?Ⱦ0jL76lm2ud3c}MÇ%+T̾0PM&Y:8{xzyyy8M0hVGU:*.bN4bxmTKp`ci>QQÆ0VN*)~)u$k;'Wo_~Ӽ]m9#ADU]HK0x1j6S=!A~>hX_{hXӪbQcմ :yGFFEFMVաfU A:H5w
+  rfFzZP,iVF,U[)S=}i\BbRRbB\LdhkUK`,贪E)^Aqɩii) QaA~n6:X,iUQ|j2gzHDlBrZFfVffzjR|tx&XӪ"JT'wШ`?/W)&c4|(]*&{0_H uZ`XtBJFvn^1A~^S0R
+[% +5<&1-+7VAaaܬ _O;+,贪p4z8thUM=ISؤYEKgΜV=m-X=Axn+o  RPjrFN~aq霹s.Nܝl,X"j:*4C+h[;J疕͛S\كM٪"!Q)a;lԸ ͬ]}@j挂9eUUJsC{:@N贪X^)kZM#RKUT̟_S]YVZ43'-!*J`+3܃ӪB"Q)d+%(-l]ƀҲʚںUsfNK t0eAtZU44BdR˫j,\GB4 ޸ P.iH_2[;G%u 566.ZPWS1wv~VJ\x )>lZG R=%TܦE&Ԛ,iZa~ܢذ
+Oͤa#`o13
+iN0=/{D+Uf~pJ)*_jvzk׮]iuyC|q8k_7Q lo=Cc1XM'Ua~o]ʶm{8{ʵ7n\zl۰MS,MؾXw85 m}C㉤/4Z_[DReJizxB欹g^~֭7ꩣvA^ 856Ӊ;1ln*$H# b[hcI-Ifv߃_pX)=0,kWۺ^zonߺqҹGoZ$Xbd[P%9Ύ67NI+%fO746=4n޾sΝgOڳmՒtn &SN5u [{''PO[C5+nAʎ*%,mja-{=z1L+C`MnBF4tPaTBk 4Vl͔TWJ잒CRFή\lf";<xpWΟ:oTg$DJUkpW20Nw6j6IҭfTYaO-qMSѰu(}^|ġ[׷,-XjQ#G=$(M'[9yzOcBKwRTK6
+ L<5M՛|ѣܺvZ!TKP0Ŕ/s=f),;=}=\'2 ܥS2]$f̫[jcc {=~~sl
+UX@T4tDqpq4z Z(F!6]Bu^mӪ ;PoӧO=w3P-O'Ok,q>^^sKlZOhrÕJo\ػW3DꓧϞ={[WP8&Zr1pj8sظ wg{kޕFt:rx]cPK݇<{' ՍZ5-؇@WG[[{ 7 $<:.!)9%%9)1.:"$s*ӐTp)*k_~%Ps_*zϿ{gP={˺jL jaja MS/؄􌌌RJȱ:FlԼE+oH}߿x#U(m߰cI &MWxE%fde`Ȑ>nN6M DR{U)R UfǤ敠mb߿|w7;~`'J %yظrĉ&Ӡ,<3?/7+=9>*4m\ ܃*k$Ň'\n#/@*X}W/znzOlnff>r8 IHɛYPXTT8+?735t#u<YRi9'}U sR>y?ų0ٻ a9vtbeaaaimc8MLʝY8 ?'=964f>_<o)FV_/ۿcê%\KD4G;kkk;iZVެ%s畕͛[R4kFfJ|d0JGnjTԟhkR**ɿ$&UrݛqWX<;VV-)NŮ#b_Z'ɚT(>|H_x,jNܵyMªҙYIѡ}<\Ϋ?~ iE f9X*[:Tԟg߾FVkqZ2^tZTZV5r^IAn:id_TFB$9% TX(0R|O{#J*%ʕx;5>"x4/777/p
+NW6,\ظpA]u9Æ=x
+OC 5/_޼ia]٤>R73+WHRRz1zO$S_FjFRLDH@0:~LҖ+W,_PSV#
+>= %g((-i.[״ninZ sjVڸa_:ʞyϡgD*Ne77_NsgӖk֭_nKU^-MT◭hʒ7{N>ɇNz>#J}e АPp3x^u}㲖um7nܰ~FH4WT"n= wLszDbVaY՛vI E{oXtA.U##unU:]q-[6mXzyS}q+Z' ]GD#r}s1+U\X Rc""""S
+T.Z
+N7mٶ}ZW,iNlhh$:eN-\мvç.^ip?T֭X\WQ2+'=9!6:*2*:61%3f⾆HW-FTƸLUD$ZI<Įh:8|HR"GNL"5&::&.!&HJlkgm֭\H vd3T|؞;|C‚©{ayӒbbbiZv^ќJPW۷oϮׯŠHr17½ ;2DȎq~Ȉjx@O"^y
+|eԾgcmiSRciR*|¥-k7nk߳nҶy!^}L rbn8AůySu#s*My=^ֽo<b޿/ٷdVnfjRB|:`oӊ [?xCd;jf{tE#D*#ey: D <KH?I;3''$g3U7سБcǎ9%鄻jTZ6_X
+UGz]xGںRM_L-: T-}y4xr{`=Oc])0&uŚ;<v܅K/_pԱ
+k;7fRRI-,[<?u{~~M (;)T`:lXu|- NKZIZrK*iu6T3R2|̶2)Me E9ɑ^ћ&rI섊'Lsk-53\zw$vk+J
+HƁԤԌY%Lڱ) T(
+ēɩԏ[n8jAJ#F|I-W[.N"ٓP7KO@ţI}T2 )P-kTDyؘw8BO>tnDJYX"i
+NvSI],#C,s⡢`j<9ofߥL՛w<zlMGl]|aUԘ`<"<g:E7))B u(T|lH)[&q'j@MKL!ٷ_"F+3L]:}t+UOj˜:(ju3N{a$X„oqX%4 }2;f_ft1)9Ozm-5!v~xNN=w?R$j
+'02!#H$gR w,?.&aexL9{+L˥ϙfo1( [. *Mǘ|Nɽ bR"'ԸܢE-25)'}qmrh7^j[W-b}ײOu>/_<Z.o_D۟D/:5|kP:DD))|H*L8V/\FoCF<ݟILɜQ{ȉ&l%=ަ;7ՒʼO.Z?ŝ?2>?^kt:t)&N*LȄڶ_%><zqԬ"}az4wCGˊ=?vmn]n)y9*{;>*w콆dt/`_-Au-H
+J':|vvw ;ܹyysJLH@NjnŢeO?1ί_م$#;3XwǢ^n7 ?1>QW7 NII3f5 BCnR9)cQj,h
+JIgK?_aӏo޸tmP-4:Gʚ[%GGo"u26Wf•)\[8l=6CHd", FŐE{@}/?\/&jk~N>vHZ%v'ΰb$t~$ż_o:s]0z}%^3~ 6mԔ&P%ﮃ'>.?/W?~},_rEi oeSoHY*TSҟ4_ur6{[ݛYz8pjhj /IY3K+Sfz[ҴGk;7+k R./I_N_~wORRr&wəy eX,bP陒K ݧO߾䅵vƨkS [gLHI)iöca^0yȆ76::wV6}`=%>YPR0۟EBu
+۶ܖMdACyX!}gp+X}gL[KqRsw230}u޽zѣ,8Ɍ?*mJ+eR+(ѫkSCM3oMԘ)8[I"4_+SS7<ǒRbcc"pN$6.B/?wVC2dc=-5^׽z5ذY+Z9"I?Bow&8NbSIiذG<z8 {i`D\jNDE_~e #C}停yȀ2<4o"׿w߾z<{V_^B:Y-KCԓ(iǪ8LM[wН)cIf%$r9l9J|6^S[b
+*"Wgz?!ݺ#1! ?=@Aœ04/*K Ď5׃п?ŽKsa2KV”S"e,7Q@AlUbbl>߯/c3bNSgVKIO!b`9~,伯u̾?`/?3na=^g, /ws73W;z$z-88r,Wi)OȺhD%a$ю9M6A]=}CcpGWOp:Dt$_?HŃaqd$'1ȟ&hnˤ
+9JB5;%6,zD#}= ZUU!9^ j2pw&ֵGi@eO3Ra#F)*E ȦX+e/ 8<:> ))̉gW7{h[XW5`f~~9LۤvI*) P_7U̿cٺ8?3)&8XM6sgב%8,炩
+jV%b̧d^y8Uu X2$I&#5dmg`|{l^!"}+sN?>;׭\X_S1oNiII露ʚe؍\+ۿo$B{}Ӷ
+9'ńx89L?YS- uqWV~:eƌS MX@0XDbooimbdLC΂аl=cl|sLVb99¤11yc{a}MUEYYYyEu-8]<0ʖIɿx{,tɫBSS]){T`jbl 5ѣ+ jH&u5a:VBs|7u+{xx\d˘ظx|{*Dr)[e)[翊'i(yġ=;6[iQCmMuuuMmt62!_'J$p$T”JlﻍICìȰ
+;t޺D(PI%W^FFS\=}"4 {v@;*{s$j=ŎŊ "" {AAA)"
+({/I7|;pٻO~*+g}gfw鮮3f`db`Cx#K|=mUMngoԌ)3L+_Ԝ:~HB\̾];wƝL3r&
+~ J03-}wn۸vr_E06ut,ԈImm>v7QH**TuиE]g^c5~0qA3+h6hΜ9s΃$+eڵoHBlc%&:S)3O$Lp ?j_Ğݠ=%9
+<WI}PeB^8 $wa*{"/ͅr.+"pwމ# ӬS;
+:y]ߓmRzk<| Mw1vo!VȮ%Kx&`u[v0G8u6eJnRHGΡ%ݑÇ쏎EC`#1P߾PgiGD yU+ ˽,/^Tf
+\
+ U*߰e[\gP|2s<޾dֵp@
+ڰaMȒKd(틌 4'%gsp+?txwm(sYGS$%%IN=7wz
+/cTO&a߻',$xG-7mܸ ձ6p ~>yϛ2u!zw뤑m *L7}cG&Sw2 L+y-_*4n÷mD,hC $MK?~"+l)}@.~C%4|i*9ux(rSr/Q 0Pr
+.^=Hg<ўp06]!;w؁%*;A}l%e=̩W,1jԐZMԭMBl-}Vdw!t9K|㻡lL&={#ظ$,29%Ѵca9@_p{x_}"Oz1\Ǐg?y" \LtIAr F9gNHK=@lLt侽{e']^vkzJt93Miѯi{HMi2["F/Vv]|H+`>_#v㖠$A1qp%df8,ΜECH@J6WZ,0{$qKrΝ>}ԩSO\͂K=F;>
+SfªAcKE#p-FfZ[o5%zM[IM]_!` ޠ ?61>E:; KdJɓY!; 8^& L!3zL):We޺qJrΟ?w\,nb3t֞A浂<z:ci)GN(CAe?:rox\lлk% *մ4:ioisqE٠ax))ATbXfа$ͽ
+ͫ'NhXRH0p^+ܽHgm:LuLBݹ^W
+
+4=WoaJV#
+/_{3ِȳ'RPK;%kZSPU
+?!IZDʼ|Bk׮uM||Gd'.s(T7^$Ϟ<~
+";KI|/NJR0~}gyqZ]]Bk6Ә)i'`
+%D'I߿|!-T9ϟ=}\vO`T5
+iO\/s9ӿ
+L
+y3:.enC0u
+V 2|DR!gl$ˑ,ł`ga .E(ʛ9_vQk󀖉gOXOh.$]fig:h}7_ L ^?T[AbUzб
+#,J#ezC akGWvs`EJ'_ӾY0}FU> z^VO Tqp+杦5'/r%(@.CR#@G2dKA\n`x90mF\䗩^Ѿ > pސ-k-d͜T:<*owM=QVRM'Y;@|ݶ0v{/ٞW?1ȡȡdpՎICBWln:Ҹ3jY {_4eҸzƵ_ hZ4}M8n{azE'K=HY",]l)e-wmKN^jt-T:MMރG2cҕnl{yn,
+c޸g` CVnzXpo 3g~f̣ :]țTUԛT(TNSɌfT7|Έ4jmی Q? X}BXYkCȰ53%ѾINJyJ0M5k1q!{ҳ_mfmQX"]=AxOYBL;/nf/lP7TTD/LSaFl͖]⎤"[Aq4Yk[h
+"#QTbE<yO~V|brNg$WqPɭ_KPw u(xvnuR4d9V V /:fO>E_P8&W$OtUt=i*T
+cDK\JRP_=@Mz8O<j<w+ *ߢc~uB}!ƝOKoEw1UQPœwn_LgyDvd^dUi oNFFǧfp݇O_@JF|R û7\8ZEV*gmVvUV!}"|;Y%AeR,'"uA ԋEVvEV)z@(Tr&
+L @ PO&P'dmrً7>b.@-*wꣻ7 .Pg1 GջM`^T?jLUzOC'@<
+
+B=s[jQoP\<SBO7t
+T BP3SY,V
+OWEF^(
+U՟E^ Pö-
+/ieAuP ԅ+ju
+UѱjT|Jfw>y_
+7֮װYkY;ރF2c ;$ff]uC̤ZvTF3bX
+9DչGaV=pN77n{3իD?S1NU'X˄t͔Rחz>{7
+.dg=7g4Y%i@~]: 0QgFTӳ^ȻT>~_Z/zEe2ZTa PߐL !̖e.j'"ӫyf'Cqς0M%~-4}ͯ!MyC@!7;Du-aM<y7n?~i_9)}
+*yLNTa #V=}Vn
+wpJ:Pp9ڍn߹s.սR}h!D0\7e@OY R'
+@Id]˻|Kr4sYGDn߸o\7G{zi΍Μ˯jumy,^ FOL>z,#d֩g@gKsΝ?{?q6b}B[1TK\%)00}LF@J>Daq<ׁU5rŤcGDM˽xLsma޽ZҺ)tU8HV]Qm0:uOMwHJjڱ3A'J,h @^DFa0g[XeՒB@}Ks&L7_Ώ`q*+ KSk8~<#XZjʑq1ھimlשah۲n-vT_t44!TGYOtr' p㶝a1q$'BiiiǎC<q:]B3pB T=)=wBD q
+S !5|$)1P\lLdxm|ush=
+FF/R{TSvƭ]{ 6fô@uv{ CR0(11 HJcO<}.LWC?KO6PqL߽}ڕK09 @3%0<%Cܻ'tgәƏ6WJq+jWA]*~
+LDf@rex4b@%ZQQFc +d[v@m@NZPɿ5J-Ŋ]z[<m>+׬۸e[Ў]aaaK=D{}DE'I=9`=sY;xP_や)K`֑t8 V҈*%Am
+ mukV,^0md;=W[0k[$S% U
+pj1k_5koشy˖@Ak;;v #lO8$ظ#8e:sPu<-Mٗ 9gO
+
+?eK,Z0o G{1#Smc0 Ǿ
+ T3Oͽ\pB3.*ɾ4PX62=;dM [X+\03gLw`oc9j sdnXC_.P=_ կc5iNvwі6v89p1h;4>~qu{r>v.]XJk\FLVѤبm
+]dBdܹX9^
+wn3\]8L=b@] MD|G**_VV\ݡK^-ceck?q)S&VӧOwumc޾0yp}%:zW6R@}MV?{yz},9
+Ο L 4Hmڎg5vC0ݽk*Y[dZ.&_2@ UI6iDPwܵ{> :lQnj;֒ CY[[@˰0aT'יy-]z{c&=~܅k lF6ފe qqä dxkkRL.cnj=jaC- קW;RV͚5o@0W\(jܴeLiԬ{}0p` !CD#F9r4V֐'Mv6cb߀5P=ANP/n_r %b=yܦ.p8˱cFPDZ_!C,,8{v73^۴lX#2N/Q+(PBu~52nXv:ujֽG^ܼ_1_A2tXo?i\%Vݼ#l~\jCqRs&EٹuKΛ5c[k2 T 8 -v.jo>}z٣Y.:S+isF0L[QPE7lܴy6m%rJӾC]LMu֭{ՃQOP^{k!?xȰ-m'Uy }+"TsZ"¹"wo^r7u kٿ9ҫ-u1/jꥫi;רrI67mܰ~jUS$`75Rp!Z[W\T5ڵoߡCS'VA]6ѭ{^d1lq@ulOoGJJCe 
+㤔}a7ჱy-G 2x@}0ʺuE2]\sP'۷kQ
+(mܰ■ ǔIUcM6oѪI[D*rHY<j[4N]LvѫGspr5ԃjEme ݾqro9nӦL{գY
+̖8׉U"dRD֤u͛6!H1Laܫ˴ UH_}]֫/͚hٲUmژ-Č$ )i
+;tljgJF1P1ŁR~0_(]<G#{{Ξ`7n! ; Д,{ŸX6mZnղe͌~=@
+aZ믾L[AP Q kv?o j7m֬YsPb%UVZCc
+MSc٨A֩ HkV0L0ա/J/ghp#5lذQF&AMbS LiR}
+wՆmvݾsGܺևSw0I-G ) 6j^G/jG<G~Q
+)[L QeB֨\kNu\PbH-As
+͛2 DRBN>xP7PCO
+AJ2cZPYLX@֨Yݏ{*`~MjϾ33b Tr!*%q#O1ĮչD>ӧN3|pMmkdڸP9-']5VQ oF,R6L+i!+$Ͽ `"h.U&mHs7bto16Zf^y0Tjn9n#GdISiej+p~E~9$^2Re"WɢbGD[
+\,eEXZ)&M[y]kCVFo'ef>c#p嶥2 n*,_j zUm͚4!TfBB2 IVH-}JQ-JePe"Wd)[N}X;f}}:cL'-
+C_ sbBcPB5jZ{)[s TS9y+|swaGD!ƍ{L: HX)W
+A꓏A 2” l`oy@&gr bnzS25jzŚV0TP=C.SՖT^F<wM/aj:D+)WAfc |[ಧvX3#i]\@}z_%1
+1 &<R8+й
+mp'iG TCwl!M\R/n0*_S>xKJ~6/ :t֛nBЭa{$9T/Iuƃ:g\!gEv:P*st<-m"KEf"{.oC⋍U0."GIM[Y~x&y[Y/&.OEKyW
+ϭ:jq"^dh;4S'2ҒŒuS&ЛݺLCYk2svkpE/3A%VnغcWx~zSgy[ujVro
+ XۭBBJT*#}Q!Pww|';Ϙ5ڍۂC#cЦ)fAoqV+0ӤgO̤ TP3KݻWP-j946U7Pqwu
+-:u&~Y!6j23(FXhNM|<cQ}W#rT5=F[Mp'yDF A]{V\2~cԤ$b6Z43<K+*
+md3#D+Okj ԈZq=H
+Q&H%hԆؔS:YyTvVCU>AFN:Bl˸`F;5@TU;
+!UvUYUVl~wʮjz*qX%H]gU;+oʆU UvU
+8ds<"Q9#2Z*SRQck*x#JUȞ@#W*DW?T&RB1#*DQA]Rڟoe0bO
+o+Ev@bkO˴4mkФRFi"QeCg294sd[Rgfdcdlŵۤ񮓜]<DP{DLjDZT ]"#V&bF&Bin)HM*bTbDpiLJo@ˆ@Ej?ccNJfNQKMbR{N KLCx܇N|Y17cTIF6)SE2h*L#"DIRh-pCn"VK$b(8\{H
+!?J;'3fFԄTD(D)2Rg3#`s#sr?3jV6?خ1cƫ|i!wh 3kܡu }LZH@zQҋjIQR*ER(f9\>~Hj0WhLr%dH
+blۘJ >Z!Q5$KD
+HvR^xJXˠ7PJ|TgDmD6Qk +&:4b
+L!*eRT%QЮH1j$PV* U*HE
+08|tPb`HLT*- `bH RRY"r+mh^+rDɪjso ʡRHhH˕CWݙ`2# xh/j5T2@
+\S+BF{ZH(J<.W!3|^ڂF)/dr?@Va7LP j  ^CH%?r99 Jl2HXR yˀZ-2P p54GB!]
+
+EL
+uB UڠePr|ƔZ&EPZI`_+NDE72(M
+J4|3l
+0LP)UIt-H,@8CJRZ\h
+
+DNM=ؘɸ > n +ΌlX` CQHLF5~)W2 d48*0©
+)#BVTIFd"*7l8\Fg5
+[ 6%d%A*0C.Vj%A(jZ( dOP OP*1K%Y.c7 Y{@ @a C؊ތfcY w!dLaNbNc#E&2:NJ=1*2COgNh1æ4'5VE5䘁S58fk& g
+Ortwcl!,dcHos|)!Ti2x_^xsH4xTDiL M HiB'+2%f>RdZs#"S#8fH4hAc$ %"S%HN 8]" ϰ S&A&N <q"S'LLO4hEڑaS((((()S)NaNhД
+.IiMH81pj0|r2tzE°  X5di?:O S-(-)NH p~#S.N>В@ڎg>w7Q;Qn.N'Z:l!j/jn["vpuѧOfٵpu8*~ʴjt;7;[vV32四::9bwk[{عicdl<zIS\&LvY;::Z9ÿ&MwurM4G_76>T endstream endobj 104 0 obj <</CreationDate(D:20120604140408-07'00')/Creator(Adobe Illustrator CS3)/Producer(Adobe PDF library 8.00)/ModDate(D:20120604143053-07'00')/Title(iSaverRunner)>> endobj xref 0 109 0000000003 65535 f
+0000000016 00000 n
+0000051018 00000 n
+0000000004 00000 f
+0000000006 00000 f
+0000051468 00000 n
+0000000007 00000 f
+0000000008 00000 f
+0000000009 00000 f
+0000000010 00000 f
+0000000011 00000 f
+0000000012 00000 f
+0000000013 00000 f
+0000000014 00000 f
+0000000015 00000 f
+0000000016 00000 f
+0000000017 00000 f
+0000000021 00001 f
+0000051069 00000 n
+0000051327 00000 n
+0000051358 00000 n
+0000000022 00000 f
+0000000023 00000 f
+0000000024 00000 f
+0000000025 00000 f
+0000000026 00000 f
+0000000027 00000 f
+0000000028 00000 f
+0000000029 00000 f
+0000000030 00000 f
+0000000031 00000 f
+0000000032 00000 f
+0000000033 00000 f
+0000000034 00001 f
+0000000035 00000 f
+0000000036 00000 f
+0000000037 00000 f
+0000000038 00000 f
+0000000039 00000 f
+0000000040 00000 f
+0000000041 00000 f
+0000000042 00000 f
+0000000043 00000 f
+0000000044 00000 f
+0000000045 00000 f
+0000000046 00000 f
+0000000047 00000 f
+0000000048 00000 f
+0000000049 00000 f
+0000000050 00000 f
+0000000051 00000 f
+0000000052 00000 f
+0000000053 00000 f
+0000000054 00000 f
+0000000055 00000 f
+0000000056 00000 f
+0000000057 00000 f
+0000000058 00000 f
+0000000059 00000 f
+0000000060 00000 f
+0000000061 00000 f
+0000000062 00000 f
+0000000063 00000 f
+0000000064 00000 f
+0000000065 00000 f
+0000000066 00000 f
+0000000067 00000 f
+0000000068 00000 f
+0000000069 00000 f
+0000000070 00000 f
+0000000071 00000 f
+0000000072 00000 f
+0000000075 00000 f
+0000053130 00000 n
+0000447035 00000 n
+0000000076 00000 f
+0000000077 00001 f
+0000000078 00000 f
+0000000079 00000 f
+0000000080 00000 f
+0000000091 00000 f
+0000447070 00000 n
+0000447144 00000 n
+0000447428 00000 n
+0000448499 00000 n
+0000477276 00000 n
+0000542864 00000 n
+0000608452 00000 n
+0000674040 00000 n
+0000739628 00000 n
+0000805216 00000 n
+0000000000 00001 f
+0000051443 00000 n
+0000051140 00000 n
+0000051211 00000 n
+0000051242 00000 n
+0000053446 00000 n
+0000053559 00000 n
+0000443823 00000 n
+0000053594 00000 n
+0000053953 00000 n
+0000053990 00000 n
+0000053773 00000 n
+0000051857 00000 n
+0000866269 00000 n
+0000446471 00000 n
+0000446521 00000 n
+0000053192 00000 n
+0000000163 00000 n
+trailer <</Size 109/Root 1 0 R/Info 104 0 R/ID[<92202E142B2943938996230749909C02><1913AC01336D494EA4250E05957BB203>]>> startxref 866446 %%EOF \ No newline at end of file
diff --git a/OSX/iSaverRunner.plist b/OSX/iSaverRunner.plist
new file mode 100644
index 0000000..4604e9d
--- /dev/null
+++ b/OSX/iSaverRunner.plist
@@ -0,0 +1,71 @@
+<?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>CFBundleDisplayName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleGetInfoString</key>
+ <string>5.40</string>
+ <key>CFBundleIcons</key>
+ <dict/>
+ <key>CFBundleIcons~ipad</key>
+ <dict/>
+ <key>CFBundleIdentifier</key>
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleLongVersionString</key>
+ <string>5.40</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>5.40</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>5.40</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>NSHumanReadableCopyright</key>
+ <string>5.40</string>
+ <key>NSMainNibFile</key>
+ <string>iSaverRunner</string>
+ <key>UIAppFonts</key>
+ <array>
+ <string>OCRAStd.otf</string>
+ <string>YearlReg.ttf</string>
+ <string>PxPlus_IBM_VGA8.ttf</string>
+ <string>luximr.ttf</string>
+ </array>
+ <key>UILaunchStoryboardName</key>
+ <string>LaunchScreen</string>
+ <key>UIRequiredDeviceCapabilities</key>
+ <dict>
+ <key>opengles-1</key>
+ <true/>
+ </dict>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ <string>UIInterfaceOrientationPortraitUpsideDown</string>
+ </array>
+ <key>UISupportedInterfaceOrientations~ipad</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationPortraitUpsideDown</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+ <key>UIViewControllerBasedStatusBarAppearance</key>
+ <true/>
+ <key>NSPhotoLibraryUsageDescription</key>
+ <string>XScreenSaver displays manipulated versions of your photos.</string></dict>
+</plist>
diff --git a/OSX/iSaverRunner.xib b/OSX/iSaverRunner.xib
new file mode 100644
index 0000000..99bce15
--- /dev/null
+++ b/OSX/iSaverRunner.xib
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="11762" systemVersion="16E195" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" colorMatched="YES">
+ <device id="retina4_7" orientation="portrait">
+ <adaptation id="fullscreen"/>
+ </device>
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11757"/>
+ <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="UIApplication">
+ <connections>
+ <outlet property="delegate" destination="3" id="9"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <customObject id="3" userLabel="SaverRunner" customClass="SaverRunner">
+ <connections>
+ <outlet property="window" destination="2" id="5"/>
+ </connections>
+ </customObject>
+ <window opaque="NO" clearsContextBeforeDrawing="NO" multipleTouchEnabled="YES" contentMode="scaleToFill" visibleAtLaunch="YES" id="2">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="480"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+ <nil key="simulatedStatusBarMetrics"/>
+ <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+ </window>
+ </objects>
+ <simulatedMetricsContainer key="defaultSimulatedMetrics">
+ <simulatedStatusBarMetrics key="statusBar"/>
+ <simulatedOrientationMetrics key="orientation"/>
+ <simulatedScreenMetrics key="destination" type="retina4_7.fullscreen"/>
+ </simulatedMetricsContainer>
+</document>
diff --git a/OSX/iSaverRunner1024.png b/OSX/iSaverRunner1024.png
new file mode 100644
index 0000000..a548d1c
--- /dev/null
+++ b/OSX/iSaverRunner1024.png
Binary files differ
diff --git a/OSX/iSaverRunner57t.png b/OSX/iSaverRunner57t.png
new file mode 100644
index 0000000..d4e15e3
--- /dev/null
+++ b/OSX/iSaverRunner57t.png
Binary files differ
diff --git a/OSX/icmp-warning.pl b/OSX/icmp-warning.pl
new file mode 100755
index 0000000..b022563
--- /dev/null
+++ b/OSX/icmp-warning.pl
@@ -0,0 +1,69 @@
+#!/usr/bin/perl -w
+# Copyright © 2012-2018 Jamie Zawinski <jwz@jwz.org>
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+#
+# Created: 20-Jun-2012.
+
+require 5;
+#use diagnostics; # Fails on some MacOS 10.5 - 10.7 systems
+use strict;
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my ($version) = ('$Revision: 1.4 $' =~ m/\s(\d[.\d]+)\s/s);
+
+my $verbose = 0;
+
+sub sanity_check() {
+
+ my $fail = '';
+ my $d1 = $ENV{SDK_DIR} || '';
+ my $d2 = '/usr/include/netinet/';
+ my $d3 = $d2;
+
+ if (! $d1) {
+ print STDERR "ERROR: SDK_DIR unset\n";
+ exit 1;
+ }
+
+ if (! -d $d3) {
+ my @dirs = glob ("/Applications/Xcode.app/Contents/Developer/" .
+ "Platforms/MacOSX.platform/Developer/SDKs/" .
+ "MacOSX*sdk/usr/include/netinet");
+ @dirs = sort @dirs;
+ $d3 = $dirs[$#dirs] . "/" if @dirs;
+ }
+
+ if (! -d $d3) {
+ print STDERR "ERROR: There is no $d3 on this system!\n";
+ exit 1;
+ }
+
+ foreach my $f ('ip.h', 'in_systm.h', 'ip_icmp.h', 'ip_var.h', 'udp.h') {
+ $fail .= "\tsudo ln -sf $d3$f $d1$d2\n"
+ unless (-f "$d1$d2$f");
+ }
+
+ exit (0) unless $fail;
+
+ print STDERR "ERROR:\t" . join(' ', # "\n\t",
+ 'The "Sonar" module won\'t build properly unless you repair your',
+ 'SDK first. With some versions of Xcode, the ICMP header files',
+ 'are present in the iPhone Simulator SDK but are missing from',
+ 'the "real device" SDK. You can fix it by doing this:') .
+ "\n\n$fail\n";
+ exit (1);
+}
+
+if ($#ARGV >= 0) {
+ print STDERR "usage: $progname\n";
+ exit 1;
+}
+
+sanity_check();
diff --git a/OSX/installer.png b/OSX/installer.png
new file mode 100644
index 0000000..b4e165d
--- /dev/null
+++ b/OSX/installer.png
Binary files differ
diff --git a/OSX/installer.rtf b/OSX/installer.rtf
new file mode 100644
index 0000000..87eb506
--- /dev/null
+++ b/OSX/installer.rtf
@@ -0,0 +1,27 @@
+{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf370
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue240;}
+{\info
+{\title XScreenSaver Installer}}\vieww10380\viewh16740\viewkind0
+\deftab720
+\pard\pardeftab720
+
+\f0\fs24 \cf0 \
+\pard\pardeftab720
+
+\fs28 \cf0
+This will install all of the screen savers system-wide.
+If you prefer, you can instead install them one at a time by opening
+the \i "Screen Savers" \i0 folder in this disk image and double-clicking
+on only the ones that you want.\
+\
+The full installation will take around 160 MB.\
+\
+Please visit the
+{\field{\*\fldinst{HYPERLINK "https://www.jwz.org/xscreensaver/"}}{\fldrslt \cf2 \ul \ulc2 XScreenSaver web site}}.
+The XScreenSaver collection is free software, and all source code
+is available there.\
+\
+XScreenSaver also runs on iPhones and iPads. It is available in the
+{\field{\*\fldinst{HYPERLINK "https://itunes.apple.com/app/xscreensaver/id539014593?mt=8"}}{\fldrslt \cf2 \ul \ulc2 iTunes App Store}},
+and it's free!}
diff --git a/OSX/installer.sh b/OSX/installer.sh
new file mode 100755
index 0000000..fa92beb
--- /dev/null
+++ b/OSX/installer.sh
@@ -0,0 +1,141 @@
+#!/bin/sh
+# XScreenSaver, Copyright © 2013-2016 Jamie Zawinski <jwz@jwz.org>
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+#
+# The guts of the installer. Copies the screen savers out of the adjacent
+# "Screen Savers" directory and into "/Library/Screen Savers/". We do it
+# this way instead of just including the screen savers in the package
+# because that would double the size of the DMG.
+#
+# Created: 27-Jul-2013.
+
+#exec >/tmp/xscreensaver.log 2>&1
+#set -x
+
+DEBUG=0
+REQUIRED_SPACE=160 # MB. Highly approximate.
+
+export PATH="/bin:/sbin:/usr/bin:/usr/sbin:$PATH"
+
+function error() {
+ echo "XScreenSaver Installer: Error: $@" >&2
+
+ # Using "System Events" says "No user interaction allowed" on 10.9.
+ # But using "SystemUIServer" or "Automator Runner" still seems to work.
+ #
+ runner="System Events"
+ if [ -d "/System/Library/CoreServices/SystemUIServer.app" ]; then
+ runner="SystemUIServer"
+ elif [ -d "/System/Library/CoreServices/Automator Runner.app" ]; then
+ runner="Automator Runner"
+ fi
+
+ (
+ osascript <<__EOF__
+ tell app "$runner" to \
+ display dialog "$@" \
+ buttons "Bummer" \
+ default button 1 \
+ with icon 0 \
+ with title "Installation Error"
+__EOF__
+ ) </dev/null >/dev/null 2>&1 &
+ exit 1
+}
+
+
+#if[ x"$DSTVOLUME" = x ]; then error "DSTVOLUME unset"; fi
+if [ x"$PACKAGE_PATH" = x ]; then error "PACKAGE_PATH unset"; fi
+if [ x"$HOME" = x ]; then error "HOME unset"; fi
+
+
+echo "Destination: $DSTVOLUME" >&2
+
+if [ x"$USER" = xjwz ]; then DEBUG=1; fi
+
+if [ "$DEBUG" != 0 ]; then DSTVOLUME=/tmp; fi
+
+SRC=`dirname "$PACKAGE_PATH"`/"Screen Savers"
+DST1="$DSTVOLUME/Library/Screen Savers"
+DST2="$DSTVOLUME/Applications"
+PU="$DSTVOLUME/$HOME/Library/Screen Savers"
+
+# Because of Sparkle.framework weirdness, "XScreenSaverUpdater.app" is
+# in the DMG as a compressed tar file instead of an app, and we unpack
+# it when installing. Without this, auto-updates won't work: If there's
+# an .app there, Sparkle thinks that "XScreenSaverUpdater.app" is the
+# thing it should be updating instead of "Install Everything.pkg".
+#
+UPDATER_SRC="XScreenSaver.updater"
+UPDATER_DST="XScreenSaverUpdater.app"
+
+
+cd "$SRC" || error "The 'Screen Savers' folder does not exist.
+
+You can't copy the installer out of the Disk Image!"
+
+
+free=`df -k "$DSTVOLUME" |
+ tail -1 | head -1 | awk '{print $4}'`
+need=`echo $REQUIRED_SPACE \* 1024 | bc`
+if [ "$free" -lt "$need" ]; then
+ free=`echo $free / 1024 | bc`
+ error "Not enough disk space: $free MB available, $REQUIRED_SPACE MB required."
+fi
+
+
+mkdir -p "$DST1" || error "Unable to create directory $DST1/"
+mkdir -p "$DST2" || error "Unable to create directory $DST2/"
+
+# Install the savers and the updater in /System/Library/Screen Savers/
+# Install the other apps in /Applications/
+#
+for f in *.{saver,app} "$UPDATER_SRC" ; do
+ EXT=`echo "$f" | sed 's/^.*\.//'`
+ if [ "$f" = "$UPDATER_SRC" ]; then
+ DST="$DST1"
+ elif [ "$EXT" = "app" ]; then
+ DST="$DST2"
+ else
+ DST="$DST1"
+ fi
+
+ DD="$DST/$f"
+
+ echo "Installing $DD" >&2
+ rm -rf "$DD" || error "Unable to delete $DD"
+
+ if [ "$f" = "$UPDATER_SRC" ]; then
+ ( cd "$DST/" && tar -xzf - ) < "$f" || error "Unable to unpack $f in $DST/"
+ else
+ cp -pR "$f" "$DD" || error "Unable to install $f in $DST/"
+ fi
+
+ # Eliminate the "this was downloaded from the interweb" warning.
+ xattr -r -d com.apple.quarantine "$DD"
+
+ if [ "$EXT" = "app" ]; then
+ # Eliminate the "this is from an unknown developer" warning.
+ spctl --add "$DD"
+ fi
+
+ # If this saver or app is also installed in the per-user directory,
+ # delete that copy so that we don't have conflicts.
+ #
+ if [ "$DEBUG" = 0 ]; then
+ rm -rf "$PU/$f"
+ fi
+done
+
+# Launch System Preferences with the Screen Saver pane selected.
+#
+open /System/Library/PreferencePanes/DesktopScreenEffectsPref.prefPane &
+
+exit 0
diff --git a/OSX/installer.xml b/OSX/installer.xml
new file mode 100644
index 0000000..061bef2
--- /dev/null
+++ b/OSX/installer.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<installer-gui-script minSpecVersion="1">
+ <title>XScreenSaver</title>
+ <organization>org.jwz</organization>
+ <!-- <domains enable_localSystem="true"/> -->
+ <options customize="never" require-scripts="true" rootVolumeOnly="true" />
+
+ <welcome file="welcome.rtf" mime-type="text/rtf" />
+ <background file="background.png" mime-type="image/png"
+ alignment="left" scaling="proportional"/>
+
+ <volume-check>
+ <allowed-os-versions>
+ <os-version min="10.4.0"/>
+ </allowed-os-versions>
+ </volume-check>
+
+ <pkg-ref id="org.jwz.xscreensaver" auth="root">contents.pkg</pkg-ref>
+
+ <choices-outline>
+ <line choice="org.jwz.xscreensaver"/>
+ </choices-outline>
+
+ <choice id="org.jwz.xscreensaver" visible="false" title="Screen Savers"
+ start_selected="true">
+ <pkg-ref id="org.jwz.xscreensaver"/>
+ </choice>
+
+</installer-gui-script>
diff --git a/OSX/ios-function-table.m b/OSX/ios-function-table.m
new file mode 100644
index 0000000..fcb2808
--- /dev/null
+++ b/OSX/ios-function-table.m
@@ -0,0 +1,478 @@
+/* Generated file, do not edit.
+ Created: Sat Aug 4 21:35:23 2018 by build-fntable.pl 1.6.
+ */
+
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+
+extern NSDictionary *make_function_table_dict(void);
+
+extern struct xscreensaver_function_table
+ abstractile_xscreensaver_function_table,
+ anemone_xscreensaver_function_table,
+ anemotaxis_xscreensaver_function_table,
+ antinspect_xscreensaver_function_table,
+ antmaze_xscreensaver_function_table,
+ antspotlight_xscreensaver_function_table,
+ apollonian_xscreensaver_function_table,
+ apple2_xscreensaver_function_table,
+ atlantis_xscreensaver_function_table,
+ attraction_xscreensaver_function_table,
+ atunnel_xscreensaver_function_table,
+ barcode_xscreensaver_function_table,
+ binaryring_xscreensaver_function_table,
+ blaster_xscreensaver_function_table,
+ blinkbox_xscreensaver_function_table,
+ blitspin_xscreensaver_function_table,
+ blocktube_xscreensaver_function_table,
+ boing_xscreensaver_function_table,
+ bouboule_xscreensaver_function_table,
+ bouncingcow_xscreensaver_function_table,
+ boxed_xscreensaver_function_table,
+ boxfit_xscreensaver_function_table,
+ braid_xscreensaver_function_table,
+ bsod_xscreensaver_function_table,
+ bubble3d_xscreensaver_function_table,
+ bumps_xscreensaver_function_table,
+ cage_xscreensaver_function_table,
+ carousel_xscreensaver_function_table,
+ ccurve_xscreensaver_function_table,
+ celtic_xscreensaver_function_table,
+ circuit_xscreensaver_function_table,
+ cityflow_xscreensaver_function_table,
+ cloudlife_xscreensaver_function_table,
+ companioncube_xscreensaver_function_table,
+ compass_xscreensaver_function_table,
+ coral_xscreensaver_function_table,
+ crackberg_xscreensaver_function_table,
+ crumbler_xscreensaver_function_table,
+ crystal_xscreensaver_function_table,
+ cube21_xscreensaver_function_table,
+ cubenetic_xscreensaver_function_table,
+ cubestack_xscreensaver_function_table,
+ cubestorm_xscreensaver_function_table,
+ cubetwist_xscreensaver_function_table,
+ cubicgrid_xscreensaver_function_table,
+ cwaves_xscreensaver_function_table,
+ cynosure_xscreensaver_function_table,
+ dangerball_xscreensaver_function_table,
+ decayscreen_xscreensaver_function_table,
+ deco_xscreensaver_function_table,
+ deluxe_xscreensaver_function_table,
+ demon_xscreensaver_function_table,
+ discoball_xscreensaver_function_table,
+ discrete_xscreensaver_function_table,
+ distort_xscreensaver_function_table,
+ dnalogo_xscreensaver_function_table,
+ drift_xscreensaver_function_table,
+ dymaxionmap_xscreensaver_function_table,
+ endgame_xscreensaver_function_table,
+ energystream_xscreensaver_function_table,
+ engine_xscreensaver_function_table,
+ epicycle_xscreensaver_function_table,
+ eruption_xscreensaver_function_table,
+ esper_xscreensaver_function_table,
+ euler2d_xscreensaver_function_table,
+ fadeplot_xscreensaver_function_table,
+ fiberlamp_xscreensaver_function_table,
+ filmleader_xscreensaver_function_table,
+ fireworkx_xscreensaver_function_table,
+ flame_xscreensaver_function_table,
+ flipflop_xscreensaver_function_table,
+ flipscreen3d_xscreensaver_function_table,
+ fliptext_xscreensaver_function_table,
+ flow_xscreensaver_function_table,
+ fluidballs_xscreensaver_function_table,
+ flyingtoasters_xscreensaver_function_table,
+ fontglide_xscreensaver_function_table,
+ fuzzyflakes_xscreensaver_function_table,
+ galaxy_xscreensaver_function_table,
+ gears_xscreensaver_function_table,
+ geodesic_xscreensaver_function_table,
+ geodesicgears_xscreensaver_function_table,
+ gflux_xscreensaver_function_table,
+ glblur_xscreensaver_function_table,
+ glcells_xscreensaver_function_table,
+ gleidescope_xscreensaver_function_table,
+ glhanoi_xscreensaver_function_table,
+ glknots_xscreensaver_function_table,
+ glmatrix_xscreensaver_function_table,
+ glplanet_xscreensaver_function_table,
+ glschool_xscreensaver_function_table,
+ glslideshow_xscreensaver_function_table,
+ glsnake_xscreensaver_function_table,
+ gltext_xscreensaver_function_table,
+ goop_xscreensaver_function_table,
+ grav_xscreensaver_function_table,
+ greynetic_xscreensaver_function_table,
+ halftone_xscreensaver_function_table,
+ halo_xscreensaver_function_table,
+ helix_xscreensaver_function_table,
+ hexadrop_xscreensaver_function_table,
+ hexstrut_xscreensaver_function_table,
+ hilbert_xscreensaver_function_table,
+ hopalong_xscreensaver_function_table,
+ hydrostat_xscreensaver_function_table,
+ hypertorus_xscreensaver_function_table,
+ hypnowheel_xscreensaver_function_table,
+ ifs_xscreensaver_function_table,
+ imsmap_xscreensaver_function_table,
+ interaggregate_xscreensaver_function_table,
+ interference_xscreensaver_function_table,
+ intermomentary_xscreensaver_function_table,
+ jigglypuff_xscreensaver_function_table,
+ jigsaw_xscreensaver_function_table,
+ juggler3d_xscreensaver_function_table,
+ julia_xscreensaver_function_table,
+ kaleidescope_xscreensaver_function_table,
+ kaleidocycle_xscreensaver_function_table,
+ klein_xscreensaver_function_table,
+ kumppa_xscreensaver_function_table,
+ lament_xscreensaver_function_table,
+ lavalite_xscreensaver_function_table,
+ loop_xscreensaver_function_table,
+ m6502_xscreensaver_function_table,
+ maze_xscreensaver_function_table,
+ maze3d_xscreensaver_function_table,
+ memscroller_xscreensaver_function_table,
+ menger_xscreensaver_function_table,
+ metaballs_xscreensaver_function_table,
+ mirrorblob_xscreensaver_function_table,
+ moebius_xscreensaver_function_table,
+ moebiusgears_xscreensaver_function_table,
+ moire_xscreensaver_function_table,
+ moire2_xscreensaver_function_table,
+ molecule_xscreensaver_function_table,
+ morph3d_xscreensaver_function_table,
+ mountain_xscreensaver_function_table,
+ munch_xscreensaver_function_table,
+ nerverot_xscreensaver_function_table,
+ noof_xscreensaver_function_table,
+ noseguy_xscreensaver_function_table,
+ pacman_xscreensaver_function_table,
+ pedal_xscreensaver_function_table,
+ peepers_xscreensaver_function_table,
+ penetrate_xscreensaver_function_table,
+ penrose_xscreensaver_function_table,
+ petri_xscreensaver_function_table,
+ phosphor_xscreensaver_function_table,
+ photopile_xscreensaver_function_table,
+ piecewise_xscreensaver_function_table,
+ pinion_xscreensaver_function_table,
+ pipes_xscreensaver_function_table,
+ polyhedra_xscreensaver_function_table,
+ polyominoes_xscreensaver_function_table,
+ polytopes_xscreensaver_function_table,
+ pong_xscreensaver_function_table,
+ popsquares_xscreensaver_function_table,
+ projectiveplane_xscreensaver_function_table,
+ providence_xscreensaver_function_table,
+ pulsar_xscreensaver_function_table,
+ pyro_xscreensaver_function_table,
+ qix_xscreensaver_function_table,
+ quasicrystal_xscreensaver_function_table,
+ queens_xscreensaver_function_table,
+ raverhoop_xscreensaver_function_table,
+ razzledazzle_xscreensaver_function_table,
+ rdbomb_xscreensaver_function_table,
+ ripples_xscreensaver_function_table,
+ rocks_xscreensaver_function_table,
+ romanboy_xscreensaver_function_table,
+ rorschach_xscreensaver_function_table,
+ rotzoomer_xscreensaver_function_table,
+ rubik_xscreensaver_function_table,
+ rubikblocks_xscreensaver_function_table,
+ sballs_xscreensaver_function_table,
+ shadebobs_xscreensaver_function_table,
+ sierpinski_xscreensaver_function_table,
+ sierpinski3d_xscreensaver_function_table,
+ skytentacles_xscreensaver_function_table,
+ slidescreen_xscreensaver_function_table,
+ slip_xscreensaver_function_table,
+ sonar_xscreensaver_function_table,
+ speedmine_xscreensaver_function_table,
+ spheremonics_xscreensaver_function_table,
+ splitflap_xscreensaver_function_table,
+ splodesic_xscreensaver_function_table,
+ spotlight_xscreensaver_function_table,
+ sproingies_xscreensaver_function_table,
+ squiral_xscreensaver_function_table,
+ stairs_xscreensaver_function_table,
+ starfish_xscreensaver_function_table,
+ starwars_xscreensaver_function_table,
+ stonerview_xscreensaver_function_table,
+ strange_xscreensaver_function_table,
+ substrate_xscreensaver_function_table,
+ superquadrics_xscreensaver_function_table,
+ surfaces_xscreensaver_function_table,
+ swirl_xscreensaver_function_table,
+ tangram_xscreensaver_function_table,
+ tessellimage_xscreensaver_function_table,
+ thornbird_xscreensaver_function_table,
+ timetunnel_xscreensaver_function_table,
+ topblock_xscreensaver_function_table,
+ triangle_xscreensaver_function_table,
+ tronbit_xscreensaver_function_table,
+ truchet_xscreensaver_function_table,
+ twang_xscreensaver_function_table,
+ unicrud_xscreensaver_function_table,
+ unknownpleasures_xscreensaver_function_table,
+ vermiculate_xscreensaver_function_table,
+ vfeedback_xscreensaver_function_table,
+ vigilance_xscreensaver_function_table,
+ voronoi_xscreensaver_function_table,
+ wander_xscreensaver_function_table,
+ whirlwindwarp_xscreensaver_function_table,
+ winduprobot_xscreensaver_function_table,
+ wormhole_xscreensaver_function_table,
+ xanalogtv_xscreensaver_function_table,
+ xflame_xscreensaver_function_table,
+ xjack_xscreensaver_function_table,
+ xlyap_xscreensaver_function_table,
+ xmatrix_xscreensaver_function_table,
+ xrayswarm_xscreensaver_function_table,
+ xspirograph_xscreensaver_function_table,
+ zoom_xscreensaver_function_table,
+ testx11_xscreensaver_function_table;
+
+NSDictionary *make_function_table_dict(void)
+{
+ return
+ [NSDictionary dictionaryWithObjectsAndKeys:
+
+#if defined(APPLE2_ONLY)
+ [NSValue valueWithPointer:&apple2_xscreensaver_function_table], @"apple2",
+#elif defined(PHOSPHOR_ONLY)
+ [NSValue valueWithPointer:&phosphor_xscreensaver_function_table], @"phosphor",
+#elif defined(TESTX11_ONLY)
+ [NSValue valueWithPointer:&testx11_xscreensaver_function_table], @"testx11",
+#else
+ [NSValue valueWithPointer:&abstractile_xscreensaver_function_table], @"abstractile",
+ [NSValue valueWithPointer:&anemone_xscreensaver_function_table], @"anemone",
+ [NSValue valueWithPointer:&anemotaxis_xscreensaver_function_table], @"anemotaxis",
+ [NSValue valueWithPointer:&antinspect_xscreensaver_function_table], @"antinspect",
+ [NSValue valueWithPointer:&antmaze_xscreensaver_function_table], @"antmaze",
+ [NSValue valueWithPointer:&antspotlight_xscreensaver_function_table], @"antspotlight",
+ [NSValue valueWithPointer:&apollonian_xscreensaver_function_table], @"apollonian",
+ [NSValue valueWithPointer:&apple2_xscreensaver_function_table], @"apple2",
+ [NSValue valueWithPointer:&atlantis_xscreensaver_function_table], @"atlantis",
+ [NSValue valueWithPointer:&attraction_xscreensaver_function_table], @"attraction",
+ [NSValue valueWithPointer:&atunnel_xscreensaver_function_table], @"atunnel",
+ [NSValue valueWithPointer:&barcode_xscreensaver_function_table], @"barcode",
+ [NSValue valueWithPointer:&binaryring_xscreensaver_function_table], @"binaryring",
+ [NSValue valueWithPointer:&blaster_xscreensaver_function_table], @"blaster",
+ [NSValue valueWithPointer:&blinkbox_xscreensaver_function_table], @"blinkbox",
+ [NSValue valueWithPointer:&blitspin_xscreensaver_function_table], @"blitspin",
+ [NSValue valueWithPointer:&blocktube_xscreensaver_function_table], @"blocktube",
+ [NSValue valueWithPointer:&boing_xscreensaver_function_table], @"boing",
+ [NSValue valueWithPointer:&bouboule_xscreensaver_function_table], @"bouboule",
+ [NSValue valueWithPointer:&bouncingcow_xscreensaver_function_table], @"bouncingcow",
+ [NSValue valueWithPointer:&boxed_xscreensaver_function_table], @"boxed",
+ [NSValue valueWithPointer:&boxfit_xscreensaver_function_table], @"boxfit",
+ [NSValue valueWithPointer:&braid_xscreensaver_function_table], @"braid",
+ [NSValue valueWithPointer:&bsod_xscreensaver_function_table], @"bsod",
+ [NSValue valueWithPointer:&bubble3d_xscreensaver_function_table], @"bubble3d",
+ [NSValue valueWithPointer:&bumps_xscreensaver_function_table], @"bumps",
+ [NSValue valueWithPointer:&cage_xscreensaver_function_table], @"cage",
+ [NSValue valueWithPointer:&carousel_xscreensaver_function_table], @"carousel",
+ [NSValue valueWithPointer:&ccurve_xscreensaver_function_table], @"ccurve",
+ [NSValue valueWithPointer:&celtic_xscreensaver_function_table], @"celtic",
+ [NSValue valueWithPointer:&circuit_xscreensaver_function_table], @"circuit",
+ [NSValue valueWithPointer:&cityflow_xscreensaver_function_table], @"cityflow",
+ [NSValue valueWithPointer:&cloudlife_xscreensaver_function_table], @"cloudlife",
+ [NSValue valueWithPointer:&companioncube_xscreensaver_function_table], @"companioncube",
+ [NSValue valueWithPointer:&compass_xscreensaver_function_table], @"compass",
+ [NSValue valueWithPointer:&coral_xscreensaver_function_table], @"coral",
+ [NSValue valueWithPointer:&crackberg_xscreensaver_function_table], @"crackberg",
+ [NSValue valueWithPointer:&crumbler_xscreensaver_function_table], @"crumbler",
+ [NSValue valueWithPointer:&crystal_xscreensaver_function_table], @"crystal",
+ [NSValue valueWithPointer:&cube21_xscreensaver_function_table], @"cube21",
+ [NSValue valueWithPointer:&cubenetic_xscreensaver_function_table], @"cubenetic",
+ [NSValue valueWithPointer:&cubestack_xscreensaver_function_table], @"cubestack",
+ [NSValue valueWithPointer:&cubestorm_xscreensaver_function_table], @"cubestorm",
+ [NSValue valueWithPointer:&cubetwist_xscreensaver_function_table], @"cubetwist",
+ [NSValue valueWithPointer:&cubicgrid_xscreensaver_function_table], @"cubicgrid",
+ [NSValue valueWithPointer:&cwaves_xscreensaver_function_table], @"cwaves",
+ [NSValue valueWithPointer:&cynosure_xscreensaver_function_table], @"cynosure",
+ [NSValue valueWithPointer:&dangerball_xscreensaver_function_table], @"dangerball",
+ [NSValue valueWithPointer:&decayscreen_xscreensaver_function_table], @"decayscreen",
+ [NSValue valueWithPointer:&deco_xscreensaver_function_table], @"deco",
+ [NSValue valueWithPointer:&deluxe_xscreensaver_function_table], @"deluxe",
+ [NSValue valueWithPointer:&demon_xscreensaver_function_table], @"demon",
+ [NSValue valueWithPointer:&discoball_xscreensaver_function_table], @"discoball",
+ [NSValue valueWithPointer:&discrete_xscreensaver_function_table], @"discrete",
+ [NSValue valueWithPointer:&distort_xscreensaver_function_table], @"distort",
+ [NSValue valueWithPointer:&dnalogo_xscreensaver_function_table], @"dnalogo",
+ [NSValue valueWithPointer:&drift_xscreensaver_function_table], @"drift",
+ [NSValue valueWithPointer:&dymaxionmap_xscreensaver_function_table], @"dymaxionmap",
+ [NSValue valueWithPointer:&endgame_xscreensaver_function_table], @"endgame",
+ [NSValue valueWithPointer:&energystream_xscreensaver_function_table], @"energystream",
+ [NSValue valueWithPointer:&engine_xscreensaver_function_table], @"engine",
+ [NSValue valueWithPointer:&epicycle_xscreensaver_function_table], @"epicycle",
+ [NSValue valueWithPointer:&eruption_xscreensaver_function_table], @"eruption",
+ [NSValue valueWithPointer:&esper_xscreensaver_function_table], @"esper",
+ [NSValue valueWithPointer:&euler2d_xscreensaver_function_table], @"euler2d",
+ [NSValue valueWithPointer:&fadeplot_xscreensaver_function_table], @"fadeplot",
+ [NSValue valueWithPointer:&fiberlamp_xscreensaver_function_table], @"fiberlamp",
+ [NSValue valueWithPointer:&filmleader_xscreensaver_function_table], @"filmleader",
+ [NSValue valueWithPointer:&fireworkx_xscreensaver_function_table], @"fireworkx",
+ [NSValue valueWithPointer:&flame_xscreensaver_function_table], @"flame",
+ [NSValue valueWithPointer:&flipflop_xscreensaver_function_table], @"flipflop",
+ [NSValue valueWithPointer:&flipscreen3d_xscreensaver_function_table], @"flipscreen3d",
+ [NSValue valueWithPointer:&fliptext_xscreensaver_function_table], @"fliptext",
+ [NSValue valueWithPointer:&flow_xscreensaver_function_table], @"flow",
+ [NSValue valueWithPointer:&fluidballs_xscreensaver_function_table], @"fluidballs",
+ [NSValue valueWithPointer:&flyingtoasters_xscreensaver_function_table], @"flyingtoasters",
+ [NSValue valueWithPointer:&fontglide_xscreensaver_function_table], @"fontglide",
+ [NSValue valueWithPointer:&fuzzyflakes_xscreensaver_function_table], @"fuzzyflakes",
+ [NSValue valueWithPointer:&galaxy_xscreensaver_function_table], @"galaxy",
+ [NSValue valueWithPointer:&gears_xscreensaver_function_table], @"gears",
+ [NSValue valueWithPointer:&geodesic_xscreensaver_function_table], @"geodesic",
+ [NSValue valueWithPointer:&geodesicgears_xscreensaver_function_table], @"geodesicgears",
+ [NSValue valueWithPointer:&gflux_xscreensaver_function_table], @"gflux",
+ [NSValue valueWithPointer:&glblur_xscreensaver_function_table], @"glblur",
+ [NSValue valueWithPointer:&glcells_xscreensaver_function_table], @"glcells",
+ [NSValue valueWithPointer:&gleidescope_xscreensaver_function_table], @"gleidescope",
+ [NSValue valueWithPointer:&glhanoi_xscreensaver_function_table], @"glhanoi",
+ [NSValue valueWithPointer:&glknots_xscreensaver_function_table], @"glknots",
+ [NSValue valueWithPointer:&glmatrix_xscreensaver_function_table], @"glmatrix",
+ [NSValue valueWithPointer:&glplanet_xscreensaver_function_table], @"glplanet",
+ [NSValue valueWithPointer:&glschool_xscreensaver_function_table], @"glschool",
+ [NSValue valueWithPointer:&glslideshow_xscreensaver_function_table], @"glslideshow",
+ [NSValue valueWithPointer:&glsnake_xscreensaver_function_table], @"glsnake",
+ [NSValue valueWithPointer:&gltext_xscreensaver_function_table], @"gltext",
+ [NSValue valueWithPointer:&goop_xscreensaver_function_table], @"goop",
+ [NSValue valueWithPointer:&grav_xscreensaver_function_table], @"grav",
+ [NSValue valueWithPointer:&greynetic_xscreensaver_function_table], @"greynetic",
+ [NSValue valueWithPointer:&halftone_xscreensaver_function_table], @"halftone",
+ [NSValue valueWithPointer:&halo_xscreensaver_function_table], @"halo",
+ [NSValue valueWithPointer:&helix_xscreensaver_function_table], @"helix",
+ [NSValue valueWithPointer:&hexadrop_xscreensaver_function_table], @"hexadrop",
+ [NSValue valueWithPointer:&hexstrut_xscreensaver_function_table], @"hexstrut",
+ [NSValue valueWithPointer:&hilbert_xscreensaver_function_table], @"hilbert",
+ [NSValue valueWithPointer:&hopalong_xscreensaver_function_table], @"hopalong",
+ [NSValue valueWithPointer:&hydrostat_xscreensaver_function_table], @"hydrostat",
+ [NSValue valueWithPointer:&hypertorus_xscreensaver_function_table], @"hypertorus",
+ [NSValue valueWithPointer:&hypnowheel_xscreensaver_function_table], @"hypnowheel",
+ [NSValue valueWithPointer:&ifs_xscreensaver_function_table], @"ifs",
+ [NSValue valueWithPointer:&imsmap_xscreensaver_function_table], @"imsmap",
+ [NSValue valueWithPointer:&interaggregate_xscreensaver_function_table], @"interaggregate",
+ [NSValue valueWithPointer:&interference_xscreensaver_function_table], @"interference",
+ [NSValue valueWithPointer:&intermomentary_xscreensaver_function_table], @"intermomentary",
+ [NSValue valueWithPointer:&jigglypuff_xscreensaver_function_table], @"jigglypuff",
+ [NSValue valueWithPointer:&jigsaw_xscreensaver_function_table], @"jigsaw",
+ [NSValue valueWithPointer:&juggler3d_xscreensaver_function_table], @"juggler3d",
+ [NSValue valueWithPointer:&julia_xscreensaver_function_table], @"julia",
+ [NSValue valueWithPointer:&kaleidescope_xscreensaver_function_table], @"kaleidescope",
+ [NSValue valueWithPointer:&kaleidocycle_xscreensaver_function_table], @"kaleidocycle",
+ [NSValue valueWithPointer:&klein_xscreensaver_function_table], @"klein",
+ [NSValue valueWithPointer:&kumppa_xscreensaver_function_table], @"kumppa",
+ [NSValue valueWithPointer:&lament_xscreensaver_function_table], @"lament",
+ [NSValue valueWithPointer:&lavalite_xscreensaver_function_table], @"lavalite",
+ [NSValue valueWithPointer:&loop_xscreensaver_function_table], @"loop",
+ [NSValue valueWithPointer:&m6502_xscreensaver_function_table], @"m6502",
+ [NSValue valueWithPointer:&maze_xscreensaver_function_table], @"maze",
+ [NSValue valueWithPointer:&maze3d_xscreensaver_function_table], @"maze3d",
+ [NSValue valueWithPointer:&memscroller_xscreensaver_function_table], @"memscroller",
+ [NSValue valueWithPointer:&menger_xscreensaver_function_table], @"menger",
+ [NSValue valueWithPointer:&metaballs_xscreensaver_function_table], @"metaballs",
+ [NSValue valueWithPointer:&mirrorblob_xscreensaver_function_table], @"mirrorblob",
+ [NSValue valueWithPointer:&moebius_xscreensaver_function_table], @"moebius",
+ [NSValue valueWithPointer:&moebiusgears_xscreensaver_function_table], @"moebiusgears",
+ [NSValue valueWithPointer:&moire_xscreensaver_function_table], @"moire",
+ [NSValue valueWithPointer:&moire2_xscreensaver_function_table], @"moire2",
+ [NSValue valueWithPointer:&molecule_xscreensaver_function_table], @"molecule",
+ [NSValue valueWithPointer:&morph3d_xscreensaver_function_table], @"morph3d",
+ [NSValue valueWithPointer:&mountain_xscreensaver_function_table], @"mountain",
+ [NSValue valueWithPointer:&munch_xscreensaver_function_table], @"munch",
+ [NSValue valueWithPointer:&nerverot_xscreensaver_function_table], @"nerverot",
+ [NSValue valueWithPointer:&noof_xscreensaver_function_table], @"noof",
+ [NSValue valueWithPointer:&noseguy_xscreensaver_function_table], @"noseguy",
+ [NSValue valueWithPointer:&pacman_xscreensaver_function_table], @"pacman",
+ [NSValue valueWithPointer:&pedal_xscreensaver_function_table], @"pedal",
+ [NSValue valueWithPointer:&peepers_xscreensaver_function_table], @"peepers",
+ [NSValue valueWithPointer:&penetrate_xscreensaver_function_table], @"penetrate",
+ [NSValue valueWithPointer:&penrose_xscreensaver_function_table], @"penrose",
+ [NSValue valueWithPointer:&petri_xscreensaver_function_table], @"petri",
+ [NSValue valueWithPointer:&phosphor_xscreensaver_function_table], @"phosphor",
+ [NSValue valueWithPointer:&photopile_xscreensaver_function_table], @"photopile",
+ [NSValue valueWithPointer:&piecewise_xscreensaver_function_table], @"piecewise",
+ [NSValue valueWithPointer:&pinion_xscreensaver_function_table], @"pinion",
+ [NSValue valueWithPointer:&pipes_xscreensaver_function_table], @"pipes",
+ [NSValue valueWithPointer:&polyhedra_xscreensaver_function_table], @"polyhedra",
+ [NSValue valueWithPointer:&polyominoes_xscreensaver_function_table], @"polyominoes",
+ [NSValue valueWithPointer:&polytopes_xscreensaver_function_table], @"polytopes",
+ [NSValue valueWithPointer:&pong_xscreensaver_function_table], @"pong",
+ [NSValue valueWithPointer:&popsquares_xscreensaver_function_table], @"popsquares",
+ [NSValue valueWithPointer:&projectiveplane_xscreensaver_function_table], @"projectiveplane",
+ [NSValue valueWithPointer:&providence_xscreensaver_function_table], @"providence",
+ [NSValue valueWithPointer:&pulsar_xscreensaver_function_table], @"pulsar",
+ [NSValue valueWithPointer:&pyro_xscreensaver_function_table], @"pyro",
+ [NSValue valueWithPointer:&qix_xscreensaver_function_table], @"qix",
+ [NSValue valueWithPointer:&quasicrystal_xscreensaver_function_table], @"quasicrystal",
+ [NSValue valueWithPointer:&queens_xscreensaver_function_table], @"queens",
+ [NSValue valueWithPointer:&raverhoop_xscreensaver_function_table], @"raverhoop",
+ [NSValue valueWithPointer:&razzledazzle_xscreensaver_function_table], @"razzledazzle",
+ [NSValue valueWithPointer:&rdbomb_xscreensaver_function_table], @"rdbomb",
+ [NSValue valueWithPointer:&ripples_xscreensaver_function_table], @"ripples",
+ [NSValue valueWithPointer:&rocks_xscreensaver_function_table], @"rocks",
+ [NSValue valueWithPointer:&romanboy_xscreensaver_function_table], @"romanboy",
+ [NSValue valueWithPointer:&rorschach_xscreensaver_function_table], @"rorschach",
+ [NSValue valueWithPointer:&rotzoomer_xscreensaver_function_table], @"rotzoomer",
+ [NSValue valueWithPointer:&rubik_xscreensaver_function_table], @"rubik",
+ [NSValue valueWithPointer:&rubikblocks_xscreensaver_function_table], @"rubikblocks",
+ [NSValue valueWithPointer:&sballs_xscreensaver_function_table], @"sballs",
+ [NSValue valueWithPointer:&shadebobs_xscreensaver_function_table], @"shadebobs",
+ [NSValue valueWithPointer:&sierpinski_xscreensaver_function_table], @"sierpinski",
+ [NSValue valueWithPointer:&sierpinski3d_xscreensaver_function_table], @"sierpinski3d",
+ [NSValue valueWithPointer:&skytentacles_xscreensaver_function_table], @"skytentacles",
+ [NSValue valueWithPointer:&slidescreen_xscreensaver_function_table], @"slidescreen",
+ [NSValue valueWithPointer:&slip_xscreensaver_function_table], @"slip",
+ [NSValue valueWithPointer:&sonar_xscreensaver_function_table], @"sonar",
+ [NSValue valueWithPointer:&speedmine_xscreensaver_function_table], @"speedmine",
+ [NSValue valueWithPointer:&spheremonics_xscreensaver_function_table], @"spheremonics",
+ [NSValue valueWithPointer:&splitflap_xscreensaver_function_table], @"splitflap",
+ [NSValue valueWithPointer:&splodesic_xscreensaver_function_table], @"splodesic",
+ [NSValue valueWithPointer:&spotlight_xscreensaver_function_table], @"spotlight",
+ [NSValue valueWithPointer:&sproingies_xscreensaver_function_table], @"sproingies",
+ [NSValue valueWithPointer:&squiral_xscreensaver_function_table], @"squiral",
+ [NSValue valueWithPointer:&stairs_xscreensaver_function_table], @"stairs",
+ [NSValue valueWithPointer:&starfish_xscreensaver_function_table], @"starfish",
+ [NSValue valueWithPointer:&starwars_xscreensaver_function_table], @"starwars",
+ [NSValue valueWithPointer:&stonerview_xscreensaver_function_table], @"stonerview",
+ [NSValue valueWithPointer:&strange_xscreensaver_function_table], @"strange",
+ [NSValue valueWithPointer:&substrate_xscreensaver_function_table], @"substrate",
+ [NSValue valueWithPointer:&superquadrics_xscreensaver_function_table], @"superquadrics",
+ [NSValue valueWithPointer:&surfaces_xscreensaver_function_table], @"surfaces",
+ [NSValue valueWithPointer:&swirl_xscreensaver_function_table], @"swirl",
+ [NSValue valueWithPointer:&tangram_xscreensaver_function_table], @"tangram",
+ [NSValue valueWithPointer:&tessellimage_xscreensaver_function_table], @"tessellimage",
+ [NSValue valueWithPointer:&thornbird_xscreensaver_function_table], @"thornbird",
+ [NSValue valueWithPointer:&timetunnel_xscreensaver_function_table], @"timetunnel",
+ [NSValue valueWithPointer:&topblock_xscreensaver_function_table], @"topblock",
+ [NSValue valueWithPointer:&triangle_xscreensaver_function_table], @"triangle",
+ [NSValue valueWithPointer:&tronbit_xscreensaver_function_table], @"tronbit",
+ [NSValue valueWithPointer:&truchet_xscreensaver_function_table], @"truchet",
+ [NSValue valueWithPointer:&twang_xscreensaver_function_table], @"twang",
+ [NSValue valueWithPointer:&unicrud_xscreensaver_function_table], @"unicrud",
+ [NSValue valueWithPointer:&unknownpleasures_xscreensaver_function_table], @"unknownpleasures",
+ [NSValue valueWithPointer:&vermiculate_xscreensaver_function_table], @"vermiculate",
+ [NSValue valueWithPointer:&vfeedback_xscreensaver_function_table], @"vfeedback",
+ [NSValue valueWithPointer:&vigilance_xscreensaver_function_table], @"vigilance",
+ [NSValue valueWithPointer:&voronoi_xscreensaver_function_table], @"voronoi",
+ [NSValue valueWithPointer:&wander_xscreensaver_function_table], @"wander",
+ [NSValue valueWithPointer:&whirlwindwarp_xscreensaver_function_table], @"whirlwindwarp",
+ [NSValue valueWithPointer:&winduprobot_xscreensaver_function_table], @"winduprobot",
+ [NSValue valueWithPointer:&wormhole_xscreensaver_function_table], @"wormhole",
+ [NSValue valueWithPointer:&xanalogtv_xscreensaver_function_table], @"xanalogtv",
+ [NSValue valueWithPointer:&xflame_xscreensaver_function_table], @"xflame",
+ [NSValue valueWithPointer:&xjack_xscreensaver_function_table], @"xjack",
+ [NSValue valueWithPointer:&xlyap_xscreensaver_function_table], @"xlyap",
+ [NSValue valueWithPointer:&xmatrix_xscreensaver_function_table], @"xmatrix",
+ [NSValue valueWithPointer:&xrayswarm_xscreensaver_function_table], @"xrayswarm",
+ [NSValue valueWithPointer:&xspirograph_xscreensaver_function_table], @"xspirograph",
+ [NSValue valueWithPointer:&zoom_xscreensaver_function_table], @"zoom",
+#endif
+ nil];
+}
+
diff --git a/OSX/luximr.ttf b/OSX/luximr.ttf
new file mode 100644
index 0000000..6ad6e12
--- /dev/null
+++ b/OSX/luximr.ttf
Binary files differ
diff --git a/OSX/main.m b/OSX/main.m
new file mode 100644
index 0000000..0dfb038
--- /dev/null
+++ b/OSX/main.m
@@ -0,0 +1,29 @@
+/* xscreensaver, Copyright (c) 2006-2012 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef USE_IPHONE
+# import <UIKit/UIKit.h>
+#else
+# import <Cocoa/Cocoa.h>
+#endif
+
+int
+main (int argc, char *argv[])
+{
+# ifdef USE_IPHONE
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ int ret = UIApplicationMain (argc, argv, nil, nil);
+ [pool release];
+ return ret;
+# else
+ return NSApplicationMain(argc, (const char **) argv);
+# endif
+}
diff --git a/OSX/phosphor-app.xml b/OSX/phosphor-app.xml
new file mode 100644
index 0000000..46e6cd9
--- /dev/null
+++ b/OSX/phosphor-app.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="phosphor" _label="Phosphor">
+
+ <command arg="-root"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="50000"
+ convert="invert"/>
+
+ <number id="scale" type="spinbutton" arg="-scale %"
+ _label="Font scale" low="1" high="20" default="6"/>
+
+ <number id="fade" type="slider" arg="-ticks %"
+ _label="Fade" _low-label="Slow" _high-label="Fast"
+ low="1" high="100" default="20"
+ convert="invert"/>
+
+ <select id="fg">
+ <option id="green" _label="Green" />
+ <!-- DarkOrange is probably the closest named color. -->
+ <option id="DarkOrange" _label="Amber" arg-set="-fg #ff7900" />
+ <option id="white" _label="White" arg-set="-fg white" />
+ </select>
+ </vgroup>
+ </hgroup>
+
+ <_description>
+A fully-functional VT100 terminal emulator simulating an old terminal,
+with large pixels and long-sustain phosphor.
+
+Written by Jamie Zawinski; 1999.
+ </_description>
+</screensaver>
diff --git a/OSX/seticon.pl b/OSX/seticon.pl
new file mode 100755
index 0000000..fb5dc71
--- /dev/null
+++ b/OSX/seticon.pl
@@ -0,0 +1,110 @@
+#!/usr/bin/perl -w
+# Copyright © 2015-2016 Dave Odell <dmo2118@gmail.com>
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+
+# This is a replacement for seticon from http://osxutils.sourceforge.net/.
+
+require 5;
+use diagnostics;
+use strict;
+#use IPC::Open2;
+use File::Temp;
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my ($version) = ('$Revision: 1.6 $' =~ m/\s(\d[.\d]+)\s/s);
+
+my $verbose = 0;
+
+sub set_icon ($$) {
+ my ($icon, $target) = @_;
+ my $target_res = $target;
+
+ if (-d $target) {
+ $target_res = $target_res . "/Icon\r";
+ }
+
+ # Rez hates absolute paths, apparently.
+ if ($icon =~ m@^/@s) {
+ my $cwd = `pwd`;
+ chomp $cwd;
+ $icon =~ s@^\Q$cwd/@@s;
+ }
+
+ # The Rez language is documented in "Building and Managing Programs in MPW,
+ # Second Edition". No longer available on Apple's servers, it can now be
+ # found at:
+ # http://www.powerpc.hu/manila/static/home/Apple/developer/Tool_Chest/Core_Mac_OS_Tools/MPW_etc./Documentation/MPW_Reference/Building_Progs_In_MPW.sit.hqx
+
+ my $pgm = "Read 'icns' (kCustomIconResource) \"$icon\";\n";
+
+ # Rez can read from stdin, but only if it is a file handle, not if it
+ # is a pipe (OS X 10.9, Xcode 5; OSX 10.11, Xcode 6).
+
+ my ($rez_fh, $rez_filename) = File::Temp::tempfile(DIR => '.', UNLINK => 1);
+ print $rez_fh $pgm;
+ close $rez_fh;
+
+ my @cmd = ('Rez',
+ 'CoreServices.r',
+ $rez_filename,
+ '-o', $target_res);
+
+ print STDERR "$progname: exec: " . join(' ', @cmd) . "\n$pgm\n"
+ if ($verbose);
+
+# my ($in, $out);
+# my $pid = open2 ($out, $in, @cmd);
+# print $in $pgm;
+# close ($in);
+# waitpid ($pid, 0);
+
+ system (@cmd);
+
+ my $exit = $? >> 8;
+ exit ($exit) if $exit;
+
+ # Have to also inform Finder that the icon is there, with the
+ # com.apple.FinderInfo xattr (a FolderInfo struct).
+ @cmd = ('SetFile', '-a', 'C', $target);
+ system (@cmd);
+ $exit = $? >> 8;
+ exit ($exit) if $exit;
+}
+
+sub error($) {
+ my ($err) = @_;
+ print STDERR "$progname: $err\n";
+ exit 1;
+}
+
+sub usage() {
+ print "Usage: $progname -d source [file...]\n";
+ exit 1;
+}
+
+sub main() {
+ my ($src, @dst);
+ while ($#ARGV >= 0) {
+ $_ = shift @ARGV;
+ if (m/^--?verbose$/s) { $verbose++; }
+ elsif (m/^-v+$/s) { $verbose += length($_)-1; }
+ elsif (m/^-d$/s) { $src = shift @ARGV; }
+ elsif (m/^-/s) { usage(); }
+ else { push @dst, $_; }
+ }
+ error ("no source") unless defined($src);
+ error ("no files") unless @dst;
+ foreach my $f (@dst) {
+ set_icon ($src, $f);
+ }
+}
+
+main();
+exit 0;
diff --git a/OSX/settings.png b/OSX/settings.png
new file mode 100644
index 0000000..66066ef
--- /dev/null
+++ b/OSX/settings.png
Binary files differ
diff --git a/OSX/settings@2x.png b/OSX/settings@2x.png
new file mode 100644
index 0000000..edce371
--- /dev/null
+++ b/OSX/settings@2x.png
Binary files differ
diff --git a/OSX/settings@3x.png b/OSX/settings@3x.png
new file mode 100644
index 0000000..cdbc568
--- /dev/null
+++ b/OSX/settings@3x.png
Binary files differ
diff --git a/OSX/sign_update.rb b/OSX/sign_update.rb
new file mode 100755
index 0000000..6d03e2e
--- /dev/null
+++ b/OSX/sign_update.rb
@@ -0,0 +1,7 @@
+#!/usr/bin/ruby
+if ARGV.length < 2
+ puts "Usage: ruby sign_update.rb update_archive private_key"
+ exit
+end
+
+puts `openssl dgst -sha1 -binary < "#{ARGV[0]}" | openssl dgst -dss1 -sign "#{ARGV[1]}" | openssl enc -base64` \ No newline at end of file
diff --git a/OSX/sparkle_dsa_pub.pem b/OSX/sparkle_dsa_pub.pem
new file mode 100644
index 0000000..f8a9229
--- /dev/null
+++ b/OSX/sparkle_dsa_pub.pem
@@ -0,0 +1,20 @@
+-----BEGIN PUBLIC KEY-----
+MIIDOzCCAi4GByqGSM44BAEwggIhAoIBAQDekjUm7Fk/mm887ldKk4qfLq1lb3Wg
+Num4oLRJBJlGcKzKKA0jP4J9BgXZvuOs3FEzpwPK+P6LajWkBhG2kaxNSwwOlQjp
+dAqeMeV8EZxKiu5+msudl6QHOuIk+fwpDlB007KPI+JAxnrrmkI7nlLDv2EBVAJw
+78rSlcI6co3AiXHEe5H2J0LsZe6pi3U4FeCJXu7vr1+yNn5Gw8MX9hXl1EjOkN9e
+gCbDEZrX2UPSUWpiIfZwpjAXnit2MV045niww6/jz5nz58Y/ZMbuLQW205B2gzPB
+XUVH50tMhbKPnU51aRyWcDWVIYMeqryjKqsy/IjDZC5zwdUbDA66ZwuXAhUAywjB
+FIUjBpzyPldDNeVwq/uG9eECggEBAMMDXX0R6Hib2MR3icbJVsIEPZ9EUli6e8F6
+htypUNNTwaNbkz0v74ruyrJ9cPtWGFgU5gCS5uTKmeIA15i+clxGFy6kqWyAxrAT
+h0ehuo572Htdayh9Z7N3UGVpNG+ryYfaxWhYl0sgd/vvsptZpBbmQe+F1/BR9/C0
+J3J4CsAv3Ut0dzWjap4dGefSMYXUX+BikfsLaSeqSR07r5jvNsT2L4av1RnZagSl
+zzq3Tx6fepfgPHdf1A5/cnbzNz+Uf98YxlYXylqpbGBL1wmhseiHNxJCKSsCrHz1
+UWJqj31WHD6trQoGN9/1y74w0Y9sveHK8RApEoKitTTcL3Dn/ZYDggEFAAKCAQAU
+ofRd/dLgvCmA9gzyagc1TSYGoIjuNOpagqs6KpzhPAH+dA6/zlWy+iA/5rA6tm5Y
+JOOrmTudXcBu9Y2NJDJIzD0WphkigUs0YTml257X7+74DSuIWH1d70hhPwhkuMeM
+6AjnEHGcmlXRPbeMT0+ALlBW8GEmJBagazSXUXRXkyj+902zeliwdOBPAZWUwEdj
+QEqlYCJWwPhQe2cHWwVPnNHtp+66pEJs+lVeqM/IMxcJZhHevoF8T0M02WtIOgAc
+5/oGrdV092cN0aRGlI1bCmEqm6yrP+KIpQHSNhmugkkZzpJ/Ei50446AxuE0VHL1
+5UZ8A9+VkPn0AsbuMPU5
+-----END PUBLIC KEY-----
diff --git a/OSX/stop.png b/OSX/stop.png
new file mode 100644
index 0000000..e22c5f0
--- /dev/null
+++ b/OSX/stop.png
Binary files differ
diff --git a/OSX/stop@2x.png b/OSX/stop@2x.png
new file mode 100644
index 0000000..6896164
--- /dev/null
+++ b/OSX/stop@2x.png
Binary files differ
diff --git a/OSX/stop@3x.png b/OSX/stop@3x.png
new file mode 100644
index 0000000..b2ca2aa
--- /dev/null
+++ b/OSX/stop@3x.png
Binary files differ
diff --git a/OSX/textclient-ios.m b/OSX/textclient-ios.m
new file mode 100644
index 0000000..5db5311
--- /dev/null
+++ b/OSX/textclient-ios.m
@@ -0,0 +1,129 @@
+/* xscreensaver, Copyright (c) 2012-2016 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Loading URLs and returning the underlying text.
+ *
+ * This is necessary because iOS doesn't have Perl installed, so we can't
+ * run "xscreensaver-text" to do this.
+ */
+
+#include "utils.h"
+
+#ifdef USE_IPHONE // whole file
+
+#include "textclient.h"
+
+char *
+textclient_mobile_date_string (void)
+{
+ UIDevice *dd = [UIDevice currentDevice];
+ NSString *name = [dd name]; // My iPhone
+ NSString *model = [dd model]; // iPad
+ // NSString *system = [dd systemName]; // iPhone OS
+ NSString *vers = [dd systemVersion]; // 5.0
+ NSString *date =
+ [NSDateFormatter
+ localizedStringFromDate:[NSDate date]
+ dateStyle: NSDateFormatterMediumStyle
+ timeStyle: NSDateFormatterMediumStyle];
+ NSString *nl = @"\n";
+
+ NSString *result = name;
+ result = [result stringByAppendingString: nl];
+ result = [result stringByAppendingString: model];
+ // result = [result stringByAppendingString: nl];
+ // result = [result stringByAppendingString: system];
+ result = [result stringByAppendingString: @" "];
+ result = [result stringByAppendingString: vers];
+ result = [result stringByAppendingString: nl];
+ result = [result stringByAppendingString: nl];
+ result = [result stringByAppendingString: date];
+ result = [result stringByAppendingString: nl];
+ result = [result stringByAppendingString: nl];
+ return strdup ([result cStringUsingEncoding:NSISOLatin1StringEncoding]);
+}
+
+
+@interface TextLoader : NSObject
+@property (nonatomic, retain) NSURL *url;
+@property (nonatomic, retain) NSString *result;
+@end
+
+@implementation TextLoader
+{
+ NSURL *_url;
+ NSString *_result;
+}
+
++ (TextLoader *) sharedLoader
+{
+ static TextLoader *singleton = nil;
+ @synchronized(self) {
+ if (!singleton)
+ singleton = [[self alloc] init];
+ }
+ return singleton;
+}
+
+- (void) startLoading
+{
+ // NSLog(@"textclient thread loading %@", self.url);
+ self.result = [NSString stringWithContentsOfURL: self.url
+ encoding: NSUTF8StringEncoding
+ error: nil];
+ // NSLog(@"textclient thread finished %@ (length %d)", self.url,
+ // (unsigned int) [self.result length]);
+}
+
+@end
+
+
+
+/* Returns the contents of the URL.
+ Loads the URL in a background thread: if the URL has not yet loaded,
+ this will return NULL. Once the URL has completely loaded, the full
+ contents will be returned. Calling this again after that starts the
+ URL loading again.
+ */
+char *
+textclient_mobile_url_string (Display *dpy, const char *url)
+{
+ TextLoader *loader = [TextLoader sharedLoader];
+ NSString *result = [loader result];
+
+ // Since this is a singleton, it's possible that if hack #1 starts
+ // URL #1 loading and then quickly exits, and then hack #2 asks for
+ // URL #2, it might get URL #1 instead. Oh well, who cares.
+
+ if (result) { // Thread finished
+ // NSLog(@"textclient finished %s (length %d)", url,
+ // (unsigned int) [result length]);
+ char *s = strdup ([result cStringUsingEncoding:NSUTF8StringEncoding]);
+ loader.url = nil;
+ loader.result = nil;
+ return s;
+
+ } else if ([loader url]) { // Waiting on thread
+ // NSLog(@"textclient waiting...");
+ return 0;
+
+ } else { // Launch thread
+ // NSLog(@"textclient launching %s...", url);
+ loader.url =
+ [NSURL URLWithString:
+ [NSString stringWithCString: url
+ encoding:NSISOLatin1StringEncoding]];
+ [NSThread detachNewThreadSelector: @selector(startLoading)
+ toTarget: loader withObject: nil];
+ return 0;
+ }
+}
+
+#endif // USE_IPHONE -- whole file
diff --git a/OSX/update-info-plist.pl b/OSX/update-info-plist.pl
new file mode 100755
index 0000000..3e0fb8f
--- /dev/null
+++ b/OSX/update-info-plist.pl
@@ -0,0 +1,508 @@
+#!/usr/bin/perl -w
+# Copyright © 2006-2017 Jamie Zawinski <jwz@jwz.org>
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+#
+# Updates the NAME.xml file of a .saver bundle to include the current year,
+# version number, etc. Also updates the Info.plist file to include the
+# short documentation, authors, etc. in the Finder "Get Info" properties.
+#
+# This is invoked by a final "Shell Script" build action on each of the
+# .saver targets in the XCode project.
+#
+# Created: 8-Mar-2006.
+
+require 5;
+#use diagnostics; # Fails on some MacOS 10.5 systems
+use strict;
+use IPC::Open3;
+use IO::Uncompress::Gunzip qw(gunzip $GunzipError);
+use IO::Compress::Gzip qw(gzip $GzipError);
+
+my ($exec_dir, $progname) = ($0 =~ m@^(.*?)/([^/]+)$@);
+
+my ($version) = ('$Revision: 1.47 $' =~ m/\s(\d[.\d]+)\s/s);
+
+$ENV{PATH} = "/usr/local/bin:$ENV{PATH}"; # for seticon
+$ENV{PATH} = "/opt/local/bin:$ENV{PATH}"; # for macports wget
+
+my $thumbdir = 'build/screenshots';
+
+
+
+my $verbose = 1;
+
+sub convert_plist($$) {
+ my ($data, $to_binary_p) = @_;
+ my $is_binary_p = ($data =~ m/^bplist/s);
+ if ($data && (!$is_binary_p) != (!$to_binary_p)) {
+ print STDERR "$progname: converting plist\n" if ($verbose > 2);
+ my $which = ($to_binary_p ? 'binary1' : 'xml1');
+ my @cmd = ('plutil', '-convert', $which, '-s', '-o', '-', '-');
+ my $pid = open3 (my $in, my $out, undef, @cmd) ||
+ error ("pipe: $cmd[0]: $!");
+ error ("$cmd[0]: $!") unless $pid;
+ print $in $data;
+ close $in;
+ local $/ = undef; # read entire file
+ $data = <$out>;
+ close $out;
+ waitpid ($pid, 0);
+ if ($?) {
+ my $exit_value = $? >> 8;
+ my $signal_num = $? & 127;
+ my $dumped_core = $? & 128;
+ error ("$cmd[0]: core dumped!") if ($dumped_core);
+ error ("$cmd[0]: signal $signal_num!") if ($signal_num);
+ error ("$cmd[0]: exited with $exit_value!") if ($exit_value);
+ }
+ }
+ return $data;
+}
+
+
+sub read_info_plist($) {
+ my ($app_dir) = @_;
+ my $file = "$app_dir/Contents/Info.plist";
+ my $file2 = "$app_dir/Info.plist";
+ $file =~ s@/+@/@g;
+ my $in;
+ if (open ($in, '<', $file)) {
+ } elsif (open ($in, '<', $file2)) {
+ $file = $file2;
+ } else {
+ error ("$file: $!");
+ }
+ print STDERR "$progname: read $file\n" if ($verbose > 2);
+ local $/ = undef; # read entire file
+ my $body = <$in>;
+ close $in;
+
+ $body = convert_plist ($body, 0); # convert to xml plist
+ return ($file, $body);
+}
+
+
+sub read_saver_xml($) {
+ my ($app_dir) = @_;
+ error ("$app_dir: no name")
+ unless ($app_dir =~ m@/([^/.]+).(app|saver)/?$@x);
+ my $name = $1;
+
+ return () if ($name eq 'XScreenSaver');
+ return () if ($name eq 'SaverTester');
+ return () if ($name eq 'XScreenSaverUpdater');
+
+ my $file = "$app_dir/Contents/Resources/" . lc($name) . ".xml";
+ my $file2 = "$app_dir/" . lc($name) . ".xml";
+ my $file3 = "$app_dir/Contents/PlugIns/$name.saver/Contents/Resources/" .
+ lc($name) . ".xml";
+ $file =~ s@/+@/@g;
+ my $in;
+ if (open ($in, '<', $file)) {
+ } elsif (open ($in, '<', $file2)) { $file = $file2;
+ } elsif (open ($in, '<', $file3)) { $file = $file3;
+ } else {
+ error ("$file: $!");
+ }
+ print STDERR "$progname: read $file\n" if ($verbose > 2);
+ local $/ = undef; # read entire file
+ my $body = <$in>;
+ close $in;
+
+ # Uncompress the XML if it is compressed.
+ my $body2 = '';
+ gunzip (\$body, \$body2) || error ("$app_dir: xml gunzip: $GunzipError");
+ my $was_compressed_p = ($body ne $body2);
+ return ($file, $body2, $was_compressed_p);
+}
+
+
+# This is duplicated in hacks/check-configs.pl for Android
+#
+sub munge_blurb($$$$) {
+ my ($filename, $name, $vers, $desc) = @_;
+
+ $desc =~ s/^([ \t]*\n)+//s;
+ $desc =~ s/\s*$//s;
+
+ # in case it's done already...
+ $desc =~ s@<!--.*?-->@@gs;
+ $desc =~ s/^.* version \d[^\n]*\n//s;
+ $desc =~ s/^From the XScreenSaver.*\n//m;
+ $desc =~ s@^https://www\.jwz\.org/xscreensaver.*\n@@m;
+ $desc =~
+ s/\nCopyright [^ \r\n\t]+ (\d{4})(-\d{4})? (.*)\.$/\nWritten $3; $1./s;
+ $desc =~ s/^\n+//s;
+
+ error ("$filename: description contains markup: $1")
+ if ($desc =~ m/([<>&][^<>&\s]*)/s);
+ error ("$filename: description contains ctl chars: $1")
+ if ($desc =~ m/([\000-\010\013-\037])/s);
+
+ error ("$filename: can't extract authors")
+ unless ($desc =~ m@^(.*)\nWritten by[ \t]+(.+)$@s);
+ $desc = $1;
+ my $authors = $2;
+ $desc =~ s/\s*$//s;
+
+ my $year = undef;
+ if ($authors =~ m@^(.*?)\s*[,;]\s+(\d\d\d\d)([-\s,;]+\d\d\d\d)*[.]?$@s) {
+ $authors = $1;
+ $year = $2;
+ }
+
+ error ("$filename: can't extract year") unless $year;
+ my $cyear = 1900 + ((localtime())[5]);
+ $year = "$cyear" unless $year;
+ if ($year && ! ($year =~ m/$cyear/)) {
+ $year = "$year-$cyear";
+ }
+
+ $authors =~ s/[.,;\s]+$//s;
+
+ # List me as a co-author on all of them, since I'm the one who
+ # did the OSX port, packaged it up, and built the executables.
+ #
+ my $curator = "Jamie Zawinski";
+ if (! ($authors =~ m/$curator/si)) {
+ if ($authors =~ m@^(.*?),? and (.*)$@s) {
+ $authors = "$1, $2, and $curator";
+ } else {
+ $authors .= " and $curator";
+ }
+ }
+
+ my $desc1 = ("$name, version $vers.\n\n" . # savername.xml
+ $desc . "\n" .
+ "\n" .
+ "From the XScreenSaver collection: " .
+ "https://www.jwz.org/xscreensaver/\n" .
+ "Copyright \302\251 $year by $authors.\n");
+
+ my $desc2 = ("$name $vers,\n" . # Info.plist
+ "\302\251 $year $authors.\n" .
+ "From the XScreenSaver collection:\n" .
+ "https://www.jwz.org/xscreensaver/\n" .
+ "\n" .
+ $desc .
+ "\n");
+
+ # unwrap lines, but only when it's obviously ok: leave blank lines,
+ # and don't unwrap if that would compress leading whitespace on a line.
+ #
+ $desc2 =~ s/^(From |https?:)/\n$1/gm;
+ 1 while ($desc2 =~ s/([^\s])[ \t]*\n([^\s])/$1 $2/gs);
+ $desc2 =~ s/\n\n(From |https?:)/\n$1/gs;
+
+ return ($desc1, $desc2);
+}
+
+
+sub update_saver_xml($$) {
+ my ($app_dir, $vers) = @_;
+ my ($filename, $body, $was_compressed_p) = read_saver_xml ($app_dir);
+ my $obody = $body;
+
+ return () unless defined ($filename);
+
+ $body =~ m@<screensaver[^<>]*?[ \t]_label=\"([^\"]+)\"@m ||
+ error ("$filename: no name label");
+ my $name = $1;
+
+ $body =~ m@<_description>(.*?)</_description>@s ||
+ error ("$filename: no description tag");
+ my $desc = $1;
+
+ error ("$filename: description contains non-ASCII and is not UTF-8: $1")
+ if ($body !~ m/\Q<?xml version="1.0" encoding="UTF-8"/s &&
+ $desc =~ m/([^\000-\176])/s);
+
+ my ($desc1, $desc2) = munge_blurb ($filename, $name, $vers, $desc);
+
+ $body =~ s@(<_description>)(.*?)(</_description>)@$1$desc1$3@s;
+
+ # NSXMLParser doesn't seem to work properly on Latin1 XML documents,
+ # so we convert these to UTF8 when embedding them in the .saver bundle.
+ $body =~ s@encoding="ISO-8859-1"@encoding="UTF-8"@gsi;
+
+ if ($obody eq $body && $was_compressed_p) {
+ print STDERR "$progname: $filename: unchanged\n" if ($verbose > 1);
+ } else {
+
+ # Gzip the XML.
+ my $body2 = '';
+ gzip (\$body, \$body2) || error ("$app_dir: xml gzip: $GzipError");
+ $body = $body2;
+
+ my $file_tmp = "$filename.tmp";
+ open (my $out, '>:raw', $file_tmp) || error ("$file_tmp: $!");
+ print $out $body || error ("$file_tmp: $!");
+ close $out || error ("$file_tmp: $!");
+
+ if (!rename ("$file_tmp", "$filename")) {
+ unlink "$file_tmp";
+ error ("mv \"$file_tmp\" \"$filename\": $!");
+ }
+ print STDERR "$progname: wrote $filename\n" if ($verbose);
+ }
+
+ return ($desc1, $desc2);
+}
+
+
+sub compress_all_xml_files($) {
+ my ($dir) = @_;
+ opendir (my $dirp, $dir) || error ("$dir: $!");
+ my @files = readdir ($dirp);
+ closedir $dirp;
+ foreach my $f (sort @files) {
+ next unless ($f =~ m/\.xml$/si);
+ my $filename = "$dir/$f";
+ open (my $in, '<', $filename) || error ("$filename: $!");
+ print STDERR "$progname: read $filename\n" if ($verbose > 2);
+ local $/ = undef; # read entire file
+ my $body = <$in>;
+ close $in;
+
+ if ($body =~ m/^<\?xml/s) {
+ my $body2 = '';
+ gzip (\$body, \$body2) || error ("$filename: xml gzip: $GzipError");
+ $body = $body2;
+ my $file_tmp = "$filename.tmp";
+ open (my $out, '>:raw', $file_tmp) || error ("$file_tmp: $!");
+ print $out $body || error ("$file_tmp: $!");
+ close $out || error ("$file_tmp: $!");
+
+ if (!rename ("$file_tmp", "$filename")) {
+ unlink "$file_tmp";
+ error ("mv \"$file_tmp\" \"$filename\": $!");
+ }
+ print STDERR "$progname: compressed $filename\n" if ($verbose);
+ } elsif ($verbose > 2) {
+ print STDERR "$filename: already compressed\n";
+ }
+ }
+}
+
+
+sub set_plist_key($$$$) {
+ my ($filename, $body, $key, $val) = @_;
+
+ if ($body =~ m@^(.*
+ \n\t<key>$key</key>
+ \n\t<string>)([^<>]*)(</string>
+ .*)$@xs) {
+# print STDERR "$progname: $filename: $key was: $2\n" if ($verbose);
+ $body = $1 . $val . $3;
+ } else {
+ error ("$filename: unparsable")
+ unless ($body =~ m@^(.*)(\n</dict>\n</plist>\n)$@s);
+ $body = ($1 .
+ "\n\t<key>$key</key>" .
+ "\n\t<string>$val</string>" .
+ $2);
+ }
+
+ return $body;
+}
+
+
+sub set_icon($) {
+ my ($app_dir) = @_;
+ $app_dir =~ s@/+$@@s;
+
+ my $icon = ($app_dir =~ m/\.saver$/ ? 'XScreenSaver' : 'SaverRunner');
+ $icon = "$app_dir/../../../$icon.icns";
+ my @cmd = ("$app_dir/../../../seticon.pl", "-d", $icon, $app_dir);
+ print STDERR "$progname: exec: " . join(' ', @cmd) . "\n"
+ if ($verbose > 1);
+ system (@cmd);
+}
+
+
+sub set_thumb($) {
+ my ($app_dir) = @_;
+
+ return unless ($app_dir =~ m@\.saver/?$@s);
+
+ my $name = $app_dir;
+ $name =~ s@^.*/@@s;
+ $name =~ s@\..*?$@@s;
+ $name = lc($name);
+
+ $name = 'rd-bomb' if ($name eq 'rdbomb'); # sigh
+
+ if (! -f "$thumbdir/$name.png") {
+ system ("make", "$thumbdir/$name.png");
+ my $exit = $? >> 8;
+ exit ($exit) if $exit;
+ error ("unable to download $name.png")
+ unless (-f "$thumbdir/$name.png");
+ }
+
+ $app_dir =~ s@/+$@@s;
+ $app_dir .= "/Contents/Resources";
+ error ("$app_dir does not exist") unless (-d $app_dir);
+
+ system ("cp", "-p", "$thumbdir/$name.png", "$app_dir/thumbnail.png");
+ my $exit = $? >> 8;
+ exit ($exit) if $exit;
+}
+
+
+sub enable_gc($) {
+ my ($app_dir) = @_;
+
+ return unless ($app_dir =~ m@\.saver/?$@s);
+ my ($dir, $name) = ($app_dir =~ m@^(.*)/([^/]+)\.saver$@s);
+ error ("unparsable: $app_dir") unless $name;
+ my $exe = "$app_dir/Contents/MacOS/$name";
+ my @cmd = ("$dir/enable_gc", $exe);
+ print STDERR "$progname: exec: " . join(' ', @cmd) . "\n"
+ if ($verbose > 1);
+ system (@cmd);
+ my $exit = $? >> 8;
+ exit ($exit) if $exit;
+}
+
+
+sub fix_coretext($) {
+ my ($app_dir) = @_;
+
+ # In MacOS 10.8, they moved CoreText.framework from
+ # /System/Library/Frameworks/ApplicationServices.framework/Frameworks/
+ # to /System/Library/Frameworks/ which means that executables compiled
+ # on 10.8 and newer won't run on 10.7 and older because they can't find
+ # the library. Fortunately, 10.8 and later leave a symlink behind, so
+ # the old location still works. So we need our executables to contain
+ # an LC_LOAD_DYLIB pointing at the old directory instead of the new
+ # one.
+ #
+ return if ($app_dir =~ m@-iphone@s);
+ my ($dir, $name) = ($app_dir =~ m@^(.*)/([^/]+)\.(app|saver)$@s);
+ error ("unparsable: $app_dir") unless $name;
+ my $exe = "$app_dir/Contents/MacOS/$name";
+
+ my $new = ("/System/Library/Frameworks/CoreText.framework/" .
+ "Versions/A/CoreText");
+ my $old = ("/System/Library/Frameworks/ApplicationServices.framework/" .
+ "Frameworks/CoreText.framework/Versions/A/CoreText");
+ my @cmd = ("install_name_tool", "-change", $new, $old, $exe);
+
+ print STDERR "$progname: exec: " . join(' ', @cmd) . "\n"
+ if ($verbose > 1);
+ system (@cmd);
+ my $exit = $? >> 8;
+ exit ($exit) if $exit;
+}
+
+
+sub update($) {
+ my ($app_dir) = @_;
+
+ error ("$app_dir: no name")
+ unless ($app_dir =~ m@/([^/.]+).(app|saver)/?$@x);
+ my $app_name = $1;
+
+ my ($filename, $plist) = read_info_plist ($app_dir);
+ my $oplist = $plist;
+
+ error ("$filename: no version number")
+ unless ($plist =~ m@<key>CFBundleShortVersionString</key>\s*
+ <string>([^<>]+)</string>@sx);
+ my $vers = $1;
+ my ($ignore, $info_str) = update_saver_xml ($app_dir, $vers);
+
+ # No, don't do this -- the iOS version reads the XML file in a few
+ # different places, and most of those places don't understand gzip.
+
+ if ($app_name eq 'XScreenSaver') {
+ compress_all_xml_files ($app_dir);
+ } elsif (! defined($info_str)) {
+ print STDERR "$progname: $filename: no XML file\n" if ($verbose > 1);
+ } else {
+
+ $info_str =~ m@^([^\n]+)\n@s ||
+ error ("$filename: unparsable copyright");
+ my $copyright = "$1";
+ $copyright =~ s/\b\d{4}-(\d{4})\b/$1/;
+
+ # Lose the Wikipedia URLs.
+ $info_str =~ s@https?:.*?\b(wikipedia|mathworld)\b[^\s]+[ \t]*\n?@@gm;
+
+ $info_str =~ s/(\n\n)\n+/$1/gs;
+ $info_str =~ s/(^\s+|\s+$)//gs;
+ $plist = set_plist_key ($filename, $plist,
+ "NSHumanReadableCopyright", $copyright);
+ $plist = set_plist_key ($filename, $plist,
+ "CFBundleLongVersionString",$copyright);
+ $plist = set_plist_key ($filename, $plist,
+ "CFBundleGetInfoString", $info_str);
+ $plist = set_plist_key ($filename, $plist,
+ "CFBundleIdentifier",
+ "org.jwz.xscreensaver." . $app_name);
+
+ if ($oplist eq $plist) {
+ print STDERR "$progname: $filename: unchanged\n" if ($verbose > 1);
+ } else {
+ $plist = convert_plist ($plist, 1); # convert to binary plist
+ my $file_tmp = "$filename.tmp";
+ open (my $out, '>:raw', $file_tmp) || error ("$file_tmp: $!");
+ print $out $plist || error ("$file_tmp: $!");
+ close $out || error ("$file_tmp: $!");
+
+ if (!rename ("$file_tmp", "$filename")) {
+ unlink "$file_tmp";
+ error ("mv \"$file_tmp\" \"$filename\": $!");
+ }
+ print STDERR "$progname: wrote $filename\n" if ($verbose);
+ }
+ }
+
+ # MacOS 10.12: codesign says "resource fork, Finder information, or
+ # similar detritus not allowed" if any bundle has an Icon\r file.
+ # set_icon ($app_dir);
+
+ set_thumb ($app_dir);
+# enable_gc ($app_dir);
+ fix_coretext ($app_dir)
+}
+
+
+sub error($) {
+ my ($err) = @_;
+ print STDERR "$progname: $err\n";
+ exit 1;
+}
+
+sub usage() {
+ print STDERR "usage: $progname [--verbose] program.app ...\n";
+ exit 1;
+}
+
+sub main() {
+
+ my @files = ();
+ while ($_ = $ARGV[0]) {
+ shift @ARGV;
+ if (m/^--?verbose$/s) { $verbose++; }
+ elsif (m/^-v+$/) { $verbose += length($_)-1; }
+ elsif (m/^--?q(uiet)?$/s) { $verbose = 0; }
+ elsif (m/^-/s) { usage(); }
+ else { push @files, $_; }
+ }
+ usage() unless ($#files >= 0);
+ foreach (@files) {
+ update ($_);
+ }
+}
+
+main();
+exit 0;
diff --git a/OSX/updates.pl b/OSX/updates.pl
new file mode 100755
index 0000000..5938a4a
--- /dev/null
+++ b/OSX/updates.pl
@@ -0,0 +1,219 @@
+#!/usr/bin/perl -w
+# Copyright © 2013 Jamie Zawinski <jwz@jwz.org>
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+#
+# Generates updates.xml from README, archive/, and www/.
+#
+# Created: 27-Nov-2013.
+
+require 5;
+use diagnostics;
+use strict;
+
+use open ":encoding(utf8)";
+use POSIX;
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my ($version) = ('$Revision: 1.2 $' =~ m/\s(\d[.\d]+)\s/s);
+
+my $verbose = 0;
+my $debug_p = 0;
+
+my $base_url = "https://www.jwz.org/";
+my $priv_key_file = "$ENV{HOME}/.ssh/sparkle_dsa_priv.pem";
+my $sign_update = "./sign_update.rb";
+
+
+sub generate_xml($$$$) {
+ my ($app_name, $changelog, $archive_dir, $www_dir) = @_;
+
+ my $outfile = "updates.xml";
+
+ my $obody = '';
+ my %sigs;
+ my %dates;
+ if (open (my $in, '<', $outfile)) {
+ print STDERR "$progname: reading $outfile\n" if $verbose;
+ local $/ = undef; # read entire file
+ $obody = <$in>;
+ close $in;
+ foreach my $item (split (/<item/i, $obody)) {
+ my ($v) = ($item =~ m/version="(.*?)"/si);
+ my ($sig) = ($item =~ m/dsaSignature="(.*?)"/si);
+ my ($date) = ($item =~ m/<pubDate>(.*?)</si);
+ next unless $v;
+ $sigs{$v} = $sig if $sig;
+ $dates{$v} = $date if $date;
+ print STDERR "$progname: $v: " . ($date || '?') . "\n"
+ if ($verbose > 1);
+ }
+ }
+
+ open (my $in, '<', $changelog) || error ("$changelog: $!");
+ print STDERR "$progname: reading $changelog\n" if $verbose;
+ local $/ = undef; # read entire file
+ my $body = <$in>;
+ close $in;
+
+ my $rss = "";
+
+ $body =~ s/^(\d+\.\d+[ \t])/\001$1/gm;
+ my @log = split (/\001/, $body);
+ shift @log;
+ my $count = 0;
+ foreach my $log (@log) {
+ my ($v1, $entry) = ($log =~ m/^(\d+\.\d+)\s+(.*)$/s);
+
+ $entry =~ s/^\s*\d\d?[- ][A-Z][a-z][a-z][- ]\d{4}:?\s+//s; # lose date
+
+ $entry =~ s/^\s+|\s+$//gs;
+ $entry =~ s/^\s+|\s+$//gm;
+ $entry =~ s/^[-*] /<BR>&bull; /gm;
+ $entry =~ s/^<BR>//si;
+ $entry =~ s/\s+/ /gs;
+
+ my $v2 = $v1; $v2 =~ s/\.//gs;
+ my $zip = undef;
+ DONE:
+ foreach my $ext ('zip', 'dmg', 'tar.gz', 'tar.Z') {
+ foreach my $v ($v1, $v2) {
+ foreach my $name ($app_name, "x" . lc($app_name)) {
+ my $f = "$name-$v.$ext";
+ if (-f "$archive_dir/$f") {
+ $zip = $f;
+ last DONE;
+ }
+ }
+ }
+ }
+
+ my $publishedp = ($zip && -f "$www_dir/$zip");
+ $publishedp = 1 if ($count == 0);
+
+ my $url = ("${base_url}$app_name/" . ($publishedp ? $zip : ""));
+
+ $url =~ s@DaliClock/@xdaliclock/@gs if $url; # Kludge
+
+ my @st = stat("$archive_dir/$zip") if $zip;
+ my $size = $st[7];
+ my $date = $st[9];
+ $date = ($zip ?
+ strftime ("%a, %d %b %Y %T %z", localtime($date))
+ : "");
+
+ my $odate = $dates{$v1};
+ my $sig = $sigs{$v1};
+ # Re-generate the sig if the file date changed.
+ $sig = undef if ($odate && $odate ne $date);
+
+ print STDERR "$progname: $v1: $date " . ($sig ? "Y" : "N") . "\n"
+ if ($verbose > 1);
+
+ if (!$sig && $zip) {
+ local %ENV = %ENV;
+ $ENV{PATH} = "/usr/bin:$ENV{PATH}";
+ $sig = `$sign_update "$archive_dir/$zip" "$priv_key_file"`;
+ $sig =~ s/\s+//gs;
+ }
+
+ my $enc = ($publishedp
+ ? ("<enclosure url=\"$url\"\n" .
+ " sparkle:version=\"$v1\"\n" .
+ " sparkle:dsaSignature=\"$sig\"\n" .
+ " length=\"$size\"\n" .
+ " type=\"application/octet-stream\" />\n")
+ : "<sparkle:version>$v1</sparkle:version>\n");
+
+ $enc =~ s/^/ /gm if $enc;
+ my $item = ("<item>\n" .
+ " <title>Version $v1</title>\n" .
+ " <link>$url</link>\n" .
+ " <description><![CDATA[$entry]]></description>\n" .
+ " <pubDate>$date</pubDate>\n" .
+ $enc .
+ "</item>\n");
+ $item =~ s/^/ /gm;
+
+ # I guess Sparkle doesn't like info-only items.
+ $item = '' unless $publishedp;
+
+ $rss .= $item;
+ $count++;
+ }
+
+ $rss = ("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" .
+ "<rss version=\"2.0\"\n" .
+ " xmlns:sparkle=\"http://www.andymatuschak.org/" .
+ "xml-namespaces/sparkle\"\n" .
+ " xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n" .
+ " <channel>\n" .
+ " <title>$app_name updater</title>\n" .
+ " <link>${base_url}$app_name/updates.xml</link>\n" .
+ " <description>Updates to $app_name.</description>\n" .
+ " <language>en</language>\n" .
+ $rss .
+ " </channel>\n" .
+ "</rss>\n");
+
+ if ($rss eq $obody) {
+ print STDERR "$progname: $outfile: unchanged\n";
+ } else {
+ my $tmp = "$outfile.tmp";
+ open (my $out, '>', $tmp) || error ("$tmp: $!");
+ print $out $rss;
+ close $out;
+ if ($debug_p) {
+ system ("diff", "-wNU2", "$outfile", "$tmp");
+ unlink $tmp;
+ } else {
+ if (!rename ("$tmp", "$outfile")) {
+ unlink "$tmp";
+ error ("mv $tmp $outfile: $!");
+ } else {
+ print STDERR "$progname: wrote $outfile\n";
+ }
+ }
+ }
+}
+
+
+sub error($) {
+ my ($err) = @_;
+ print STDERR "$progname: $err\n";
+ exit 1;
+}
+
+sub usage() {
+ print STDERR "usage: $progname [--verbose] app-name changelog archive www\n";
+ exit 1;
+}
+
+sub main() {
+ my ($app_name, $changelog, $archive_dir, $www_dir);
+ while ($#ARGV >= 0) {
+ $_ = shift @ARGV;
+ if (m/^--?verbose$/) { $verbose++; }
+ elsif (m/^-v+$/) { $verbose += length($_)-1; }
+ elsif (m/^--?debug$/) { $debug_p++; }
+ elsif (m/^-./) { usage; }
+ elsif (!$app_name) { $app_name = $_; }
+ elsif (!$changelog) { $changelog = $_; }
+ elsif (!$archive_dir) { $archive_dir = $_; }
+ elsif (!$www_dir) { $www_dir = $_; }
+ else { usage; }
+ }
+
+ usage unless $www_dir;
+ generate_xml ($app_name, $changelog, $archive_dir, $www_dir);
+
+}
+
+main();
+exit 0;
diff --git a/OSX/updates.xml b/OSX/updates.xml
new file mode 100644
index 0000000..a4733a6
--- /dev/null
+++ b/OSX/updates.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<rss version="2.0"
+ xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle"
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <channel>
+ <title>xscreensaver updater</title>
+ <link>https://www.jwz.org/xscreensaver/updates.xml</link>
+ <description>Updates to xscreensaver.</description>
+ <language>en</language>
+ <item>
+ <title>Version 5.39</title>
+ <link>https://www.jwz.org/xscreensaver/xscreensaver-5.39.dmg</link>
+ <description><![CDATA[&bull; New hacks, 'razzledazzle', 'peepers', 'crumbler' and `maze3d'. <BR>&bull; More heuristics for using RSS feeds as image sources. <BR>&bull; Android: Image loading works. <BR>&bull; Built-in image assets are now PNG instead of XPM or XBM. <BR>&bull; X11: Better font-loading fallback heuristics on systems with a terrible selection of installed fonts. <BR>&bull; macOS: Retina display-related bug fixes.]]></description>
+ <pubDate>Thu, 12 Apr 2018 13:00:37 -0700</pubDate>
+ <enclosure url="https://www.jwz.org/xscreensaver/xscreensaver-5.39.dmg"
+ sparkle:version="5.39"
+ sparkle:dsaSignature="MC0CFCNqDWYNT+EDQXEpi0SAxySC77A+AhUArqhfa7sp5J8cXq42u5uFmBOQiFA="
+ length="32888133"
+ type="application/octet-stream" />
+ </item>
+ <item>
+ <title>Version 5.38</title>
+ <link>https://www.jwz.org/xscreensaver/xscreensaver-5.38.dmg</link>
+ <description><![CDATA[&bull; New hack, 'esper'. <BR>&bull; macOS: Support for Retina displays. <BR>&bull; X11: `webcollage' now works with ImageMagick instead of with pbmtools if `webcollage-helper' is not installed. <BR>&bull; 'bsod' now accepts Dunning-Krugerrands. <BR>&bull; Android: These hacks work now: 'anemone', 'anemotaxis', 'atlantis', 'bouboule', 'celtic', 'compass', 'crackberg', 'epicycle', 'fuzzyflakes', 'goop', 'kumppa' 'munch', 'pacman', 'polyominoes', 'slip'. <BR>&bull; Android: Thick lines work better for: 'anemone', 'anemotaxis', 'celtic', 'compass', 'deluxe', 'epicycle', 'fuzzyflakes', 'pacman' <BR>&bull; Android: Assorted performance improvements, especially for 'kumppa' and 'slip'. <BR>&bull; Android TV: Daydreams work. <BR>&bull; iOS: Tweaks for iPhone X. <BR>&bull; Lots of xlockmore-derived hacks now have animated erase routines. <BR>&bull; 'crystal' works properly on non-X11 systems. <BR>&bull; 'm6502' now includes 'texture.asm'. <BR>&bull; X11: Try harder to find sensible fonts for the password dialog.]]></description>
+ <pubDate>Wed, 20 Dec 2017 11:16:13 -0800</pubDate>
+ <enclosure url="https://www.jwz.org/xscreensaver/xscreensaver-5.38.dmg"
+ sparkle:version="5.38"
+ sparkle:dsaSignature="MCwCFB2O5ykEfT4xCkb/CraguQZPTFJHAhQZde4jxrb5+zc2Haazg10uYLqNRw=="
+ length="54125574"
+ type="application/octet-stream" />
+ </item>
+ <item>
+ <title>Version 5.37</title>
+ <link>https://www.jwz.org/xscreensaver/xscreensaver-5.37.dmg</link>
+ <description><![CDATA[&bull; New hack, `vigilance'. <BR>&bull; Added Mac Software Update and VMware to `bsod'. <BR>&bull; macOS: Grabbing the desktop works again. <BR>&bull; macOS: Pinch to zoom. <BR>&bull; Android: Both Daydreams and Live Wallpapers are implemented. <BR>&bull; Updated `webcollage' for recent changes. <BR>&bull; Various bug fixes.]]></description>
+ <pubDate>Wed, 05 Jul 2017 10:55:51 -0700</pubDate>
+ <enclosure url="https://www.jwz.org/xscreensaver/xscreensaver-5.37.dmg"
+ sparkle:version="5.37"
+ sparkle:dsaSignature="MCwCFFsEWCDZbAY8Owz7k4lcs+uGM+LUAhQlLSsjg0Eqkd2TX2UfxiFdPrciTA=="
+ length="52481386"
+ type="application/octet-stream" />
+ </item>
+ <item>
+ <title>Version 5.34</title>
+ <link>https://www.jwz.org/xscreensaver/xscreensaver-5.34.dmg</link>
+ <description><![CDATA[&bull; Fixed a crash when hot-swapping monitors while locked. <BR>&bull; Fixed some incorrect output from `xscreensaver-command -watch'. <BR>&bull; Various macOS and iOS performance improvements.]]></description>
+ <pubDate>Sat, 24 Oct 2015 12:16:41 -0700</pubDate>
+ <enclosure url="https://www.jwz.org/xscreensaver/xscreensaver-5.34.dmg"
+ sparkle:version="5.34"
+ sparkle:dsaSignature="MCwCFAoZpMknlOVF0zFXlzFruzFvRXufAhQVKY0qlzelKcArrlC6k7EbHLTcyg=="
+ length="58850776"
+ type="application/octet-stream" />
+ </item>
+ <item>
+ <title>Version 5.14</title>
+ <link>https://www.jwz.org/xscreensaver/xscreensaver-5.14.dmg</link>
+ <description><![CDATA[&bull; Fixed crash in Blank Only Mode when DPMS disabled. <BR>&bull; Added "Quick Power-off in Blank Only Mode" option. <BR>&bull; BSOD GLaDOS.]]></description>
+ <pubDate>Fri, 20 May 2011 11:42:36 -0700</pubDate>
+ <enclosure url="https://www.jwz.org/xscreensaver/xscreensaver-5.14.dmg"
+ sparkle:version="5.14"
+ sparkle:dsaSignature="MCwCFHrKuttf1gN27mVG3YL8+ueMJmNaAhR6aSkKQefuNFNp6MinLq2o1nocaA=="
+ length="54485615"
+ type="application/octet-stream" />
+ </item>
+ </channel>
+</rss>
diff --git a/OSX/xscreensaver.xcconfig b/OSX/xscreensaver.xcconfig
new file mode 100644
index 0000000..c1a9cc2
--- /dev/null
+++ b/OSX/xscreensaver.xcconfig
@@ -0,0 +1,11 @@
+// To create builds that work properly on MacOS 10.6, Xcode 5.0.2 must
+// be used, since that is the latest version that supports garbage collection.
+// If the Xcode version is 5.02 or earlier, use these settings:
+// "10.4", "-fobjc-gc", "-no-fobjc-gc"
+// If the Xcode version is later than that, use these settings:
+// "10.6", "", ""
+// and the generate builds will only work on 10.6 or later.
+//
+MACOSX_DEPLOYMENT_TARGET=10.7
+OBJC_GC_CFLAGS=
+OBJC_NO_GC_CFLAGS=
diff --git a/OSX/xscreensaver.xcodeproj/project.pbxproj b/OSX/xscreensaver.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..f5e98b8
--- /dev/null
+++ b/OSX/xscreensaver.xcodeproj/project.pbxproj
@@ -0,0 +1,40713 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXAggregateTarget section */
+ AF137D410F075C9B004DE3B2 /* Obsolete */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = AF137D450F075CA4004DE3B2 /* Build configuration list for PBXAggregateTarget "Obsolete" */;
+ buildPhases = (
+ );
+ dependencies = (
+ AF714E51105613580046AB1D /* PBXTargetDependency */,
+ AF137D690F075E5C004DE3B2 /* PBXTargetDependency */,
+ AF137D670F075E5C004DE3B2 /* PBXTargetDependency */,
+ AF137D650F075E5C004DE3B2 /* PBXTargetDependency */,
+ AF137D630F075E5C004DE3B2 /* PBXTargetDependency */,
+ AF137D610F075E5C004DE3B2 /* PBXTargetDependency */,
+ AFA160941052FF87009B93AA /* PBXTargetDependency */,
+ AFA160921052FF87009B93AA /* PBXTargetDependency */,
+ AFB581B0102F363300342B11 /* PBXTargetDependency */,
+ AF137D5D0F075E5C004DE3B2 /* PBXTargetDependency */,
+ AF137D5B0F075E5C004DE3B2 /* PBXTargetDependency */,
+ AF137D590F075E5C004DE3B2 /* PBXTargetDependency */,
+ AF137D570F075E5C004DE3B2 /* PBXTargetDependency */,
+ AF714E4F105613410046AB1D /* PBXTargetDependency */,
+ AF137D550F075E5C004DE3B2 /* PBXTargetDependency */,
+ AF137D530F075E5C004DE3B2 /* PBXTargetDependency */,
+ AF137D510F075E5C004DE3B2 /* PBXTargetDependency */,
+ AF137D4F0F075E5C004DE3B2 /* PBXTargetDependency */,
+ AF137D4D0F075E5C004DE3B2 /* PBXTargetDependency */,
+ AF137D4B0F075E5C004DE3B2 /* PBXTargetDependency */,
+ AF137D490F075E5C004DE3B2 /* PBXTargetDependency */,
+ );
+ name = Obsolete;
+ productName = Obsolete;
+ };
+ AF480AAF098C669800FB32B8 /* All Savers (XScreenSaver) */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = AF480ABA098C66E300FB32B8 /* Build configuration list for PBXAggregateTarget "All Savers (XScreenSaver)" */;
+ buildPhases = (
+ );
+ dependencies = (
+ AFE6A4300CDD7FEE002805BF /* PBXTargetDependency */,
+ AF77798F09B6604C00EA3033 /* PBXTargetDependency */,
+ AF77798D09B6604C00EA3033 /* PBXTargetDependency */,
+ AF77798B09B6604C00EA3033 /* PBXTargetDependency */,
+ AFBFE785178648E600432B21 /* PBXTargetDependency */,
+ AF77798909B6604C00EA3033 /* PBXTargetDependency */,
+ AF77798709B6604B00EA3033 /* PBXTargetDependency */,
+ AF77798509B6604B00EA3033 /* PBXTargetDependency */,
+ AF73FF3F1A0988F000E485E9 /* PBXTargetDependency */,
+ AF77798309B6604B00EA3033 /* PBXTargetDependency */,
+ AF77798109B6604B00EA3033 /* PBXTargetDependency */,
+ AF77797F09B6604B00EA3033 /* PBXTargetDependency */,
+ AF77797B09B6604B00EA3033 /* PBXTargetDependency */,
+ AF77797909B6604B00EA3033 /* PBXTargetDependency */,
+ AF77797709B6604B00EA3033 /* PBXTargetDependency */,
+ AF77797509B6604B00EA3033 /* PBXTargetDependency */,
+ AF77797309B6604B00EA3033 /* PBXTargetDependency */,
+ AF77797109B6604B00EA3033 /* PBXTargetDependency */,
+ AFF463530C44062500EE6509 /* PBXTargetDependency */,
+ AF77796D09B6604A00EA3033 /* PBXTargetDependency */,
+ AF77796B09B6604A00EA3033 /* PBXTargetDependency */,
+ AF77796909B6604A00EA3033 /* PBXTargetDependency */,
+ AF77796709B6604A00EA3033 /* PBXTargetDependency */,
+ AF77796509B6604A00EA3033 /* PBXTargetDependency */,
+ AF77796309B6604A00EA3033 /* PBXTargetDependency */,
+ AF77796109B6604A00EA3033 /* PBXTargetDependency */,
+ AFD77E7A20C241BE00A3638D /* PBXTargetDependency */,
+ AF77795F09B6604A00EA3033 /* PBXTargetDependency */,
+ AF77795D09B6604A00EA3033 /* PBXTargetDependency */,
+ AF77795B09B6604A00EA3033 /* PBXTargetDependency */,
+ AF77795909B6604A00EA3033 /* PBXTargetDependency */,
+ AF77795709B6604A00EA3033 /* PBXTargetDependency */,
+ AFA6AB1120999A9A006D2685 /* PBXTargetDependency */,
+ AF77795509B6604A00EA3033 /* PBXTargetDependency */,
+ AF77795309B6604900EA3033 /* PBXTargetDependency */,
+ AF77795109B6604900EA3033 /* PBXTargetDependency */,
+ AF77794F09B6604900EA3033 /* PBXTargetDependency */,
+ AF77794D09B6604900EA3033 /* PBXTargetDependency */,
+ AFB591C3178B821E00EA4005 /* PBXTargetDependency */,
+ AF77794709B6604900EA3033 /* PBXTargetDependency */,
+ AF77794509B6604900EA3033 /* PBXTargetDependency */,
+ AF77794309B6604900EA3033 /* PBXTargetDependency */,
+ AF77794109B6604900EA3033 /* PBXTargetDependency */,
+ AF77793F09B6604900EA3033 /* PBXTargetDependency */,
+ AF77793B09B6604900EA3033 /* PBXTargetDependency */,
+ AF77793909B6604800EA3033 /* PBXTargetDependency */,
+ AF1A17840D6D6FA7008AF328 /* PBXTargetDependency */,
+ AF0DCA310C4C744D00D76972 /* PBXTargetDependency */,
+ AF77793509B6604800EA3033 /* PBXTargetDependency */,
+ AF77793309B6604800EA3033 /* PBXTargetDependency */,
+ AF77793109B6604800EA3033 /* PBXTargetDependency */,
+ AF77792D09B6604800EA3033 /* PBXTargetDependency */,
+ AF77792B09B6604800EA3033 /* PBXTargetDependency */,
+ AF77792909B6604800EA3033 /* PBXTargetDependency */,
+ AF77792709B6604800EA3033 /* PBXTargetDependency */,
+ AF77792509B6604800EA3033 /* PBXTargetDependency */,
+ AF77792309B6604800EA3033 /* PBXTargetDependency */,
+ AF77792109B6604800EA3033 /* PBXTargetDependency */,
+ AF77791F09B6604800EA3033 /* PBXTargetDependency */,
+ AF77791D09B6604800EA3033 /* PBXTargetDependency */,
+ AFBFE787178648F500432B21 /* PBXTargetDependency */,
+ AF77791B09B6604700EA3033 /* PBXTargetDependency */,
+ AF77791909B6604700EA3033 /* PBXTargetDependency */,
+ AF77791709B6604700EA3033 /* PBXTargetDependency */,
+ AF77791509B6604700EA3033 /* PBXTargetDependency */,
+ AF77791309B6604700EA3033 /* PBXTargetDependency */,
+ AF77791109B6604700EA3033 /* PBXTargetDependency */,
+ AF77790F09B6604700EA3033 /* PBXTargetDependency */,
+ AF77790D09B6604700EA3033 /* PBXTargetDependency */,
+ AF77790B09B6604700EA3033 /* PBXTargetDependency */,
+ AF77790909B6604700EA3033 /* PBXTargetDependency */,
+ AF77790709B6604700EA3033 /* PBXTargetDependency */,
+ AF77790509B6604700EA3033 /* PBXTargetDependency */,
+ AF77790309B6604700EA3033 /* PBXTargetDependency */,
+ AF7778FF09B6604700EA3033 /* PBXTargetDependency */,
+ AF7778FD09B6604600EA3033 /* PBXTargetDependency */,
+ AF7778FB09B6604600EA3033 /* PBXTargetDependency */,
+ AF7778F909B6604600EA3033 /* PBXTargetDependency */,
+ AF7778F709B6604600EA3033 /* PBXTargetDependency */,
+ AF68A49E19196EA000D41CD1 /* PBXTargetDependency */,
+ CE04E8CB1B9B61D00085910B /* PBXTargetDependency */,
+ AF7778F309B6604600EA3033 /* PBXTargetDependency */,
+ AF7778F109B6604600EA3033 /* PBXTargetDependency */,
+ AF7778EF09B6604600EA3033 /* PBXTargetDependency */,
+ AF5ECEC92116B31F00069433 /* PBXTargetDependency */,
+ AF7778ED09B6604600EA3033 /* PBXTargetDependency */,
+ AFA33B8F0B0585A4002B0E7D /* PBXTargetDependency */,
+ AFA33BCF0B0587B2002B0E7D /* PBXTargetDependency */,
+ AF7778EB09B6604600EA3033 /* PBXTargetDependency */,
+ AF7778E709B6604600EA3033 /* PBXTargetDependency */,
+ AF7778E509B6604600EA3033 /* PBXTargetDependency */,
+ AF7778E309B6604600EA3033 /* PBXTargetDependency */,
+ AF7778E109B6604600EA3033 /* PBXTargetDependency */,
+ AF7778DF09B6604600EA3033 /* PBXTargetDependency */,
+ AF7778DD09B6604600EA3033 /* PBXTargetDependency */,
+ AF7778DB09B6604500EA3033 /* PBXTargetDependency */,
+ AF7778D909B6604500EA3033 /* PBXTargetDependency */,
+ AF7778D709B6604500EA3033 /* PBXTargetDependency */,
+ );
+ name = "All Savers (XScreenSaver)";
+ productName = "All Savers (XScreenSaver)";
+ };
+ AF480D58098EED3D00FB32B8 /* All Savers (XLockmore) */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = AF480D64098EED6E00FB32B8 /* Build configuration list for PBXAggregateTarget "All Savers (XLockmore)" */;
+ buildPhases = (
+ );
+ dependencies = (
+ AF7779D909B6608200EA3033 /* PBXTargetDependency */,
+ AF7779D709B6608200EA3033 /* PBXTargetDependency */,
+ AF7779D509B6608200EA3033 /* PBXTargetDependency */,
+ AF7779D309B6608200EA3033 /* PBXTargetDependency */,
+ AF7779D109B6608200EA3033 /* PBXTargetDependency */,
+ AF7779CF09B6608200EA3033 /* PBXTargetDependency */,
+ AF7779CD09B6608200EA3033 /* PBXTargetDependency */,
+ AF7779CB09B6608200EA3033 /* PBXTargetDependency */,
+ AF7779C909B6608200EA3033 /* PBXTargetDependency */,
+ AF7779C709B6608200EA3033 /* PBXTargetDependency */,
+ AF7779C309B6608100EA3033 /* PBXTargetDependency */,
+ AF7779BF09B6608100EA3033 /* PBXTargetDependency */,
+ AF7779BD09B6608100EA3033 /* PBXTargetDependency */,
+ AF7779BB09B6608100EA3033 /* PBXTargetDependency */,
+ AF7779B709B6608100EA3033 /* PBXTargetDependency */,
+ AF7779AD09B6608100EA3033 /* PBXTargetDependency */,
+ AF7779AB09B6608100EA3033 /* PBXTargetDependency */,
+ AF7779A909B6608100EA3033 /* PBXTargetDependency */,
+ AF7779A709B6608100EA3033 /* PBXTargetDependency */,
+ AF7779A509B6608100EA3033 /* PBXTargetDependency */,
+ AF7779A109B6608100EA3033 /* PBXTargetDependency */,
+ AF77799B09B6608100EA3033 /* PBXTargetDependency */,
+ AF77799909B6608100EA3033 /* PBXTargetDependency */,
+ AF77799709B6608100EA3033 /* PBXTargetDependency */,
+ AF77799509B6608000EA3033 /* PBXTargetDependency */,
+ );
+ name = "All Savers (XLockmore)";
+ productName = "All Savers (XLockmore)";
+ };
+ AF480D59098EED5100FB32B8 /* All Savers (OpenGL) */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = AF480D67098EED6E00FB32B8 /* Build configuration list for PBXAggregateTarget "All Savers (OpenGL)" */;
+ buildPhases = (
+ );
+ dependencies = (
+ AF777A6509B660B700EA3033 /* PBXTargetDependency */,
+ AF777A6309B660B700EA3033 /* PBXTargetDependency */,
+ AF777A6109B660B700EA3033 /* PBXTargetDependency */,
+ AF777A5F09B660B600EA3033 /* PBXTargetDependency */,
+ AF777A5D09B660B600EA3033 /* PBXTargetDependency */,
+ AF777A5B09B660B600EA3033 /* PBXTargetDependency */,
+ AF777A5909B660B600EA3033 /* PBXTargetDependency */,
+ AF777A5709B660B600EA3033 /* PBXTargetDependency */,
+ AF777A5509B660B600EA3033 /* PBXTargetDependency */,
+ AF777A5309B660B600EA3033 /* PBXTargetDependency */,
+ AF777A5109B660B600EA3033 /* PBXTargetDependency */,
+ AF777A4F09B660B600EA3033 /* PBXTargetDependency */,
+ AF777A4D09B660B600EA3033 /* PBXTargetDependency */,
+ AF777A4B09B660B600EA3033 /* PBXTargetDependency */,
+ AF5C9B161A0CCF8000B0147A /* PBXTargetDependency */,
+ AF4F10EE143450C300E34F3F /* PBXTargetDependency */,
+ AF777A4909B660B500EA3033 /* PBXTargetDependency */,
+ AFC5CFF72044AB46004CEB5E /* PBXTargetDependency */,
+ AF777A4709B660B500EA3033 /* PBXTargetDependency */,
+ AF777A4509B660B500EA3033 /* PBXTargetDependency */,
+ AFEE108A1D15EBF900AAC8F7 /* PBXTargetDependency */,
+ AF777A4309B660B500EA3033 /* PBXTargetDependency */,
+ AFEE106B1D13424C00AAC8F7 /* PBXTargetDependency */,
+ AF4FF4D70D52CD0D00666F98 /* PBXTargetDependency */,
+ AF777A4109B660B500EA3033 /* PBXTargetDependency */,
+ AF3938381D0FBF5300205406 /* PBXTargetDependency */,
+ AF777A3F09B660B500EA3033 /* PBXTargetDependency */,
+ AFEC23EB1CB6ED0800DE138F /* PBXTargetDependency */,
+ AF777A3D09B660B500EA3033 /* PBXTargetDependency */,
+ AFACE8911CC8365F008B24CD /* PBXTargetDependency */,
+ AF777A3B09B660B500EA3033 /* PBXTargetDependency */,
+ AF21078F1FD23D9800B61EA9 /* PBXTargetDependency */,
+ AF777A3909B660B400EA3033 /* PBXTargetDependency */,
+ AF777A3709B660B400EA3033 /* PBXTargetDependency */,
+ AF777A3509B660B400EA3033 /* PBXTargetDependency */,
+ AF777A3309B660B400EA3033 /* PBXTargetDependency */,
+ AF777A3109B660B400EA3033 /* PBXTargetDependency */,
+ AF777A2F09B660B400EA3033 /* PBXTargetDependency */,
+ AFF3CA0117CCAE210028F240 /* PBXTargetDependency */,
+ AF7ACFDC19FF0BDB00BD752B /* PBXTargetDependency */,
+ AF777A2D09B660B400EA3033 /* PBXTargetDependency */,
+ AF777A2B09B660B400EA3033 /* PBXTargetDependency */,
+ AF777A2909B660B400EA3033 /* PBXTargetDependency */,
+ AFF4636F0C440B3B00EE6509 /* PBXTargetDependency */,
+ AF777A2509B660B400EA3033 /* PBXTargetDependency */,
+ AF777A2309B660B400EA3033 /* PBXTargetDependency */,
+ AF777A2109B660B300EA3033 /* PBXTargetDependency */,
+ AF777A1F09B660B300EA3033 /* PBXTargetDependency */,
+ AF48DF060A0C261100F94CF9 /* PBXTargetDependency */,
+ AF777A1D09B660B300EA3033 /* PBXTargetDependency */,
+ AF777A1B09B660B300EA3033 /* PBXTargetDependency */,
+ AF777A1909B660B300EA3033 /* PBXTargetDependency */,
+ AF1B0FC51D7AB5740011DBE4 /* PBXTargetDependency */,
+ AF4F10F0143450C300E34F3F /* PBXTargetDependency */,
+ AFC0E8C91CDC6125008CAFAC /* PBXTargetDependency */,
+ AF777A1709B660B300EA3033 /* PBXTargetDependency */,
+ AF42C5160D624E9200B27FF6 /* PBXTargetDependency */,
+ AF777A1509B660B300EA3033 /* PBXTargetDependency */,
+ AF35E8A30E63825600691F2F /* PBXTargetDependency */,
+ AF777A1309B660B300EA3033 /* PBXTargetDependency */,
+ AFBFE7421786407000432B21 /* PBXTargetDependency */,
+ AF777A1109B660B300EA3033 /* PBXTargetDependency */,
+ AF777A0F09B660B200EA3033 /* PBXTargetDependency */,
+ AF777A0D09B660B200EA3033 /* PBXTargetDependency */,
+ AF4FD6FF0CE7A4F9005EE58E /* PBXTargetDependency */,
+ AFAAE3A5207D6470007A515C /* PBXTargetDependency */,
+ AF777A0B09B660B200EA3033 /* PBXTargetDependency */,
+ AF777A0909B660B200EA3033 /* PBXTargetDependency */,
+ AF777A0709B660B200EA3033 /* PBXTargetDependency */,
+ AFE6A19C0CDD7B7F002805BF /* PBXTargetDependency */,
+ AF777A0509B660B200EA3033 /* PBXTargetDependency */,
+ AF777A0309B660B200EA3033 /* PBXTargetDependency */,
+ AF777A0109B660B200EA3033 /* PBXTargetDependency */,
+ AF3EC996203517EE00180A35 /* PBXTargetDependency */,
+ AFD51B350F063B7800471C02 /* PBXTargetDependency */,
+ AF7779FF09B660B200EA3033 /* PBXTargetDependency */,
+ AF7779FD09B660B100EA3033 /* PBXTargetDependency */,
+ AF7779FB09B660B100EA3033 /* PBXTargetDependency */,
+ AF7779F909B660B100EA3033 /* PBXTargetDependency */,
+ AFFAB33519158F1E0020F021 /* PBXTargetDependency */,
+ AF7779F709B660B100EA3033 /* PBXTargetDependency */,
+ AF7779F509B660B100EA3033 /* PBXTargetDependency */,
+ AFBFE7401786405E00432B21 /* PBXTargetDependency */,
+ AF7779F309B660B000EA3033 /* PBXTargetDependency */,
+ AFA211AA1CD5A08000C0D2A1 /* PBXTargetDependency */,
+ AF41E971201D4C380098E253 /* PBXTargetDependency */,
+ AF63A80F1AB4EFD300593C75 /* PBXTargetDependency */,
+ AF7779F109B660B000EA3033 /* PBXTargetDependency */,
+ AF32D9F90F3AD0D90080F535 /* PBXTargetDependency */,
+ AF4540D20E52BE8800AE87B5 /* PBXTargetDependency */,
+ AF7779EF09B660B000EA3033 /* PBXTargetDependency */,
+ AF7779ED09B660B000EA3033 /* PBXTargetDependency */,
+ AFE2A46F0E2E908E00ADB298 /* PBXTargetDependency */,
+ AF7779EB09B660B000EA3033 /* PBXTargetDependency */,
+ AFCF835C1AF5B683008BB7E1 /* PBXTargetDependency */,
+ AFEE10A91D17E32100AAC8F7 /* PBXTargetDependency */,
+ AF7779E909B660B000EA3033 /* PBXTargetDependency */,
+ AF7779E709B660B000EA3033 /* PBXTargetDependency */,
+ AF7779E509B660B000EA3033 /* PBXTargetDependency */,
+ AF7779E309B660B000EA3033 /* PBXTargetDependency */,
+ AF7779E109B660AF00EA3033 /* PBXTargetDependency */,
+ AF4A3460102A59A400A81B2A /* PBXTargetDependency */,
+ AF7779DF09B660AF00EA3033 /* PBXTargetDependency */,
+ AF7779DD09B660AF00EA3033 /* PBXTargetDependency */,
+ AF998EF70A083E1D0051049D /* PBXTargetDependency */,
+ AF4F10F2143450C300E34F3F /* PBXTargetDependency */,
+ AF46E9ED1CBBA49A00240FBC /* PBXTargetDependency */,
+ AFDA65AA178A54690070D24B /* PBXTargetDependency */,
+ AF633C1F1EE0BCD300AB33BD /* PBXTargetDependency */,
+ AF0DCA5C0C4CBB4300D76972 /* PBXTargetDependency */,
+ AF39E2BA198A16920064A58D /* PBXTargetDependency */,
+ );
+ name = "All Savers (OpenGL)";
+ productName = "All Savers (OpenGL)";
+ };
+ AF480D5A098EED5E00FB32B8 /* All Savers */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = AF480D6A098EED6E00FB32B8 /* Build configuration list for PBXAggregateTarget "All Savers" */;
+ buildPhases = (
+ );
+ dependencies = (
+ AFCAD5F90992DFE00009617A /* PBXTargetDependency */,
+ AF36340118540D050086A439 /* PBXTargetDependency */,
+ AF480D60098EED6900FB32B8 /* PBXTargetDependency */,
+ AF480D5E098EED6900FB32B8 /* PBXTargetDependency */,
+ AF480D5C098EED6900FB32B8 /* PBXTargetDependency */,
+ AF137D470F075CC8004DE3B2 /* PBXTargetDependency */,
+ );
+ name = "All Savers";
+ productName = "All Savers";
+ };
+ AFA33C020B058E17002B0E7D /* webcollage-perl */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = AFA33C070B058E67002B0E7D /* Build configuration list for PBXAggregateTarget "webcollage-perl" */;
+ buildPhases = (
+ );
+ dependencies = (
+ );
+ name = "webcollage-perl";
+ productName = webcollage;
+ };
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+ 5501D1961DBDCC3D00624BE9 /* xshm.c in Sources */ = {isa = PBXBuildFile; fileRef = 5501D1941DBDCC0200624BE9 /* xshm.c */; };
+ 550FB6001AD64424001A4FA5 /* Media-iOS.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 550FB5FD1AD64424001A4FA5 /* Media-iOS.xcassets */; };
+ 55374E321E1582C6005E2362 /* pow2.c in Sources */ = {isa = PBXBuildFile; fileRef = 55374E301E1582AA005E2362 /* pow2.c */; };
+ 55374E331E1582D2005E2362 /* pow2.h in Headers */ = {isa = PBXBuildFile; fileRef = 55374E311E1582AA005E2362 /* pow2.h */; };
+ 557BF07E1EE90D3B00846DCE /* settings@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 557BF07A1EE90C8B00846DCE /* settings@2x.png */; };
+ 557BF07F1EE90D3B00846DCE /* settings@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 557BF07B1EE90C8B00846DCE /* settings@3x.png */; };
+ 557BF0801EE90D3B00846DCE /* stop@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 557BF07C1EE90C8B00846DCE /* stop@2x.png */; };
+ 557BF0811EE90D3B00846DCE /* stop@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 557BF07D1EE90C8B00846DCE /* stop@3x.png */; };
+ 55EDCB3D1AD498A800251909 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 55EDCB3C1AD498A800251909 /* LaunchScreen.xib */; };
+ AF012918157C1E4C00C396E1 /* chessmodels.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55E2309935F2B00F3E977 /* chessmodels.c */; };
+ AF01590A2077F56000F624F5 /* OCRAStd.otf in Resources */ = {isa = PBXBuildFile; fileRef = AFEC68361BD6CA85004C1B64 /* OCRAStd.otf */; };
+ AF0839A609930BAC00277BE9 /* atlantis.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258700988A468000655EE /* atlantis.xml */; };
+ AF0839B009930C4900277BE9 /* atlantis.c in Sources */ = {isa = PBXBuildFile; fileRef = AF0839A909930C4900277BE9 /* atlantis.c */; };
+ AF0839B109930C4900277BE9 /* dolphin.c in Sources */ = {isa = PBXBuildFile; fileRef = AF0839AA09930C4900277BE9 /* dolphin.c */; };
+ AF0839B209930C4900277BE9 /* shark.c in Sources */ = {isa = PBXBuildFile; fileRef = AF0839AB09930C4900277BE9 /* shark.c */; };
+ AF0839B309930C4900277BE9 /* swim.c in Sources */ = {isa = PBXBuildFile; fileRef = AF0839AC09930C4900277BE9 /* swim.c */; };
+ AF0839B409930C4900277BE9 /* whale.c in Sources */ = {isa = PBXBuildFile; fileRef = AF0839AD09930C4900277BE9 /* whale.c */; };
+ AF083A21099310CF00277BE9 /* xlockmore.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480CBB098E37D600FB32B8 /* xlockmore.c */; };
+ AF083A4A099311FF00277BE9 /* atunnel.c in Sources */ = {isa = PBXBuildFile; fileRef = AF083A31099311CE00277BE9 /* atunnel.c */; };
+ AF083A4B0993120900277BE9 /* atunnel.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258720988A468000655EE /* atunnel.xml */; };
+ AF083A59099312B000277BE9 /* tunnel_draw.c in Sources */ = {isa = PBXBuildFile; fileRef = AF083A58099312B000277BE9 /* tunnel_draw.c */; };
+ AF0D117D0E41566300BB14A4 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF0DC7B10C4C73F600D76972 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF0DC7B20C4C73F600D76972 /* analogtv.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4CFA09B5AC94006E59CF /* analogtv.c */; };
+ AF0DCA350C4C74A200D76972 /* asm6502.c in Sources */ = {isa = PBXBuildFile; fileRef = AF0DCA320C4C74A200D76972 /* asm6502.c */; };
+ AF0DCA360C4C74A200D76972 /* m6502.c in Sources */ = {isa = PBXBuildFile; fileRef = AF0DCA340C4C74A200D76972 /* m6502.c */; };
+ AF0DCA380C4C74B700D76972 /* m6502.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF0DCA370C4C74B700D76972 /* m6502.xml */; };
+ AF0DCA480C4CBB0D00D76972 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF0DCA600C4CBB7300D76972 /* voronoi.c in Sources */ = {isa = PBXBuildFile; fileRef = AF0DCA5F0C4CBB7300D76972 /* voronoi.c */; };
+ AF0DCA620C4CBB8E00D76972 /* voronoi.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF0DCA610C4CBB8E00D76972 /* voronoi.xml */; };
+ AF0FAF0C09CA6FF900EE1051 /* xscreensaver-text in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF0B09CA6FF900EE1051 /* xscreensaver-text */; };
+ AF0FAF0D09CA6FF900EE1051 /* xscreensaver-text in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF0B09CA6FF900EE1051 /* xscreensaver-text */; };
+ AF0FAF0E09CA6FF900EE1051 /* xscreensaver-text in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF0B09CA6FF900EE1051 /* xscreensaver-text */; };
+ AF0FAF0F09CA6FF900EE1051 /* xscreensaver-text in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF0B09CA6FF900EE1051 /* xscreensaver-text */; };
+ AF0FAF1009CA6FF900EE1051 /* xscreensaver-text in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF0B09CA6FF900EE1051 /* xscreensaver-text */; };
+ AF0FAF1109CA6FF900EE1051 /* xscreensaver-text in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF0B09CA6FF900EE1051 /* xscreensaver-text */; };
+ AF0FAF1309CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF0FAF1409CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF0FAF1509CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF0FAF1609CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF0FAF1709CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF0FAF1809CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF0FAF1909CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF0FAF1A09CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF0FAF1B09CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF0FAF1C09CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF0FAF1D09CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF0FAF1E09CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF0FAF1F09CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF0FAF2109CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF0FAF2209CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF0FAF2309CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF0FAF2409CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF0FAF2509CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF0FAF2609CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF0FAF2709CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF0FAF2809CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF0FAF2909CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF0FAF3C159BAC7C00BCE2F7 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF0FAF3B159BAC7B00BCE2F7 /* CoreText.framework */; };
+ AF142BAE1EE75DBF0005C0A8 /* settings.png in Resources */ = {isa = PBXBuildFile; fileRef = AF142BAC1EE75DBF0005C0A8 /* settings.png */; };
+ AF142BAF1EE75DBF0005C0A8 /* stop.png in Resources */ = {isa = PBXBuildFile; fileRef = AF142BAD1EE75DBF0005C0A8 /* stop.png */; };
+ AF142BB11EFEFBA20005C0A8 /* Photos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF142BB01EFEFBA20005C0A8 /* Photos.framework */; };
+ AF1A17680D6D6EE3008AF328 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF1A177F0D6D6F3E008AF328 /* lcdscrub.c in Sources */ = {isa = PBXBuildFile; fileRef = AF1A177E0D6D6F3E008AF328 /* lcdscrub.c */; };
+ AF1A17810D6D6F62008AF328 /* lcdscrub.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF1A17800D6D6F62008AF328 /* lcdscrub.xml */; };
+ AF1AD9E318500F9F00932759 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1ADA141850132600932759 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
+ AF1ADA161850157400932759 /* Updater.xib in Resources */ = {isa = PBXBuildFile; fileRef = AF1ADA151850157400932759 /* Updater.xib */; };
+ AF1ADA181850180E00932759 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF1ADA171850180E00932759 /* Sparkle.framework */; };
+ AF1ADA1A1850186B00932759 /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = AF1ADA171850180E00932759 /* Sparkle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
+ AF1ADA1B18501B3D00932759 /* SaverRunner.icns in Resources */ = {isa = PBXBuildFile; fileRef = AF2D522513E954A0002AA818 /* SaverRunner.icns */; };
+ AF1ADA1F18504A4F00932759 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1B0FAE1D7AB4740011DBE4 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF1B0FB01D7AB4740011DBE4 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1B0FB11D7AB4740011DBE4 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1B0FB21D7AB4740011DBE4 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF1B0FB31D7AB4740011DBE4 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1B0FB41D7AB4740011DBE4 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1B0FB51D7AB4740011DBE4 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ AF1B0FB61D7AB4740011DBE4 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF1B0FC01D7AB5330011DBE4 /* hexstrut.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF1B0FBF1D7AB5210011DBE4 /* hexstrut.xml */; };
+ AF1B0FC11D7AB53A0011DBE4 /* hexstrut.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF1B0FBF1D7AB5210011DBE4 /* hexstrut.xml */; };
+ AF1B0FC21D7AB54D0011DBE4 /* hexstrut.c in Sources */ = {isa = PBXBuildFile; fileRef = AF1B0FBE1D7AB5210011DBE4 /* hexstrut.c */; };
+ AF1B0FC31D7AB5500011DBE4 /* hexstrut.c in Sources */ = {isa = PBXBuildFile; fileRef = AF1B0FBE1D7AB5210011DBE4 /* hexstrut.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF1FD713158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD714158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD715158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD716158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD717158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD718158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD719158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD71A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD71B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD71C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD71D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD71E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD71F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD720158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD721158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD722158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD727158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD728158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD729158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD72A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD72B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD72C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD72D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD72E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD72F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD730158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD731158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD732158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD733158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD734158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD735158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD736158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD737158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD738158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD739158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD73A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD73B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD73C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD73D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD73E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD73F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD740158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD741158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD742158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD743158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD744158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD745158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD746158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD747158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD748158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD749158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD74A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD74B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD74C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD74D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD74E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD74F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD750158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD751158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD752158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD753158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD754158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD755158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD756158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD757158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD758158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD759158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD75A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD75B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD75C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD75D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD75E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD75F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD760158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD761158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD762158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD763158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD764158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD765158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD766158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD767158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD768158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD769158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD76A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD76B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD76C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD76D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD76E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD76F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD770158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD771158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD772158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD773158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD774158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD775158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD776158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD777158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD778158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD779158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD77A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD77B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD77C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD77D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD77E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD77F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD780158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD781158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD782158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD783158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD784158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD785158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD786158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD787158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD788158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD789158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD78A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD78B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD78C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD78D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD78E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD78F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD790158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD791158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD792158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD793158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD794158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD795158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD796158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD797158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD798158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD799158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD79A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD79B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD79C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD79D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD79E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD79F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD7A0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD7A1158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD7A2158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD7A3158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD7A4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD7A5158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD7A6158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD7A7158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD7A8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD7A9158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD7AA158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD7AB158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD7AC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD7AD158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD7AE158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD7AF158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD7B0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD7B1158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD7B2158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD7B3158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD7B4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD7B5158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD7B6158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD7B7158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD7B8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD7B9158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD7BA158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD7BB158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD7BC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD7BD158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD7BE158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD7BF158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD7C0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD7C1158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD7C2158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD7C3158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD7C4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD7C5158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD7C6158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD7C7158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD7C8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD7C9158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD7CA158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD7CB158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD7CC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD7CD158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD7CE158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD7CF158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD7D0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD7D1158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD7D2158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD7D3158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD7D4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD7D5158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD7D6158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD7D7158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD7D8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD7D9158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD7DA158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD7DB158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD7DC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD7DD158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD7DE158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD7DF158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD7E0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD7E1158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD7E2158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD7E3158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD7E4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD7E5158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD7E6158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD7E7158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD7E8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD7E9158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD7EA158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD7EB158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD7EC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD7ED158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD7EE158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD7EF158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD7F0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD7F1158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD7F2158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD7F7158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD7F8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD7F9158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD7FA158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD7FB158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD7FC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD7FD158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD7FE158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD7FF158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD800158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD801158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD802158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD803158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD804158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD805158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD806158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD807158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD808158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD809158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD80A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD80B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD80C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD80D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD80E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD80F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD810158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD811158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD812158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD813158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD814158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD815158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD816158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD817158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD818158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD819158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD81A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD81B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD81C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD81D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD81E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD81F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD820158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD821158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD822158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD823158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD824158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD825158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD826158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD827158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD828158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD829158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD82A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD82B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD82C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD82D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD82E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD82F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD830158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD831158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD832158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD833158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD834158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD835158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD836158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD837158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD838158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD839158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD83A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD83B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD83C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD83D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD83E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD83F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD840158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD841158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD842158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD843158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD844158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD845158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD846158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD847158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD848158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD849158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD84A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD84B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD84C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD84D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD84E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD84F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD850158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD851158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD852158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD853158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD854158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD855158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD856158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD857158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD858158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD859158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD85A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD85B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD85C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD85D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD85E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD85F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD860158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD861158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD862158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD863158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD864158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD865158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD866158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD867158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD868158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD869158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD86A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD86B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD86C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD86D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD86E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD86F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD870158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD871158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD872158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD873158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD874158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD875158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD876158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD877158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD878158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD879158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD87A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD87B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD87C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD87D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD87E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD87F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD880158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD881158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD882158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD883158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD884158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD885158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD886158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD887158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD888158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD889158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD88A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD88B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD88C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD88D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD88E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD88F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD890158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD891158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD892158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD893158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD894158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD895158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD896158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD897158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD898158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD899158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD89A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD89B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD89C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD89D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD89E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD89F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8A0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8A1158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8A2158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8A3158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8A4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8A5158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8A6158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8A7158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8A8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8A9158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8AA158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8AB158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8AC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8AD158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8AE158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8AF158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8B0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8B1158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8B2158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8B3158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8B4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8B5158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8B6158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8B7158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8B8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8B9158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8BA158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8BB158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8BC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8BD158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8BE158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8BF158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8C0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8C1158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8C2158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8C3158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8C4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8C5158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8C6158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8C7158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8C8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8C9158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8CA158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8CB158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8CC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8CD158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8CE158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8CF158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8D0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8D1158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8D2158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8D3158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8D4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8D5158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8D6158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8D7158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8D8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8D9158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8DA158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8DB158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8DC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8DD158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8DE158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8DF158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8E0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8E1158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8E2158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8E3158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8E4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8E5158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8E6158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8E7158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8E8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8E9158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8EA158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8EB158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8EC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8ED158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8EE158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8EF158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8F0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8F1158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8F2158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8F3158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8F4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8F5158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8F6158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8F7158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8F8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8F9158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8FA158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8FB158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD8FC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD8FD158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD8FE158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD8FF158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD900158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD901158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD902158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD903158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD904158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD905158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD906158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD907158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD908158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD909158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD90A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD90B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD90C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD90D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD90E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD90F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD910158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD911158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD912158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD913158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD914158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD915158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD916158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD917158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD918158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD919158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD91A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD91B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD91C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD91D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD91E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD91F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD920158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD921158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD922158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD923158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD924158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD925158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD926158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD927158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD928158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD929158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD92A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD92B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD92C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD92D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD92E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD92F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD930158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD931158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD932158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD933158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD934158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD935158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD936158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD937158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD938158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD939158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD93A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD93B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD93C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD93D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD93E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD93F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD940158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD941158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD942158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD943158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD944158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD945158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD946158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD947158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD948158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD949158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD94A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD94B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD94C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD94D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD94E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD94F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD950158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD951158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD952158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD953158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD954158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD955158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD956158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD957158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD958158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD959158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD95A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD95B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD95C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD95D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD95E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD95F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD960158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD961158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD962158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD963158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD964158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD965158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD966158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD967158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD968158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD969158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD96A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD96B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD96C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD96D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD96E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD96F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD970158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD971158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD972158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD973158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD974158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD975158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD976158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD977158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD978158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD979158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD97A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD97B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD97C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD97D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD97E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD97F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD980158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD981158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD982158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD983158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD984158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD985158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD986158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD987158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD988158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD989158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD98A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD98B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD98C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD98D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD98E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD98F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD990158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD991158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD992158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD993158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD994158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD995158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD996158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD997158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD998158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD999158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD99A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD99B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD99C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD99D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD99E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD99F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9A0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9A1158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9A2158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9A3158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9A4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9A5158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9A6158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9A7158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9A8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9A9158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9AA158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9AB158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9AC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9AD158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9AE158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9AF158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9B0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9B1158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9B2158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9B3158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9B4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9B5158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9B6158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9B7158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9B8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9B9158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9BA158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9BB158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9BC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9BD158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9BE158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9BF158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9C0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9C1158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9C2158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9C3158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9C4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9C5158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9C6158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9C7158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9C8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9C9158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9CA158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9CB158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9CC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9CD158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9CE158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9CF158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9D0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9D1158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9D2158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9D3158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9D4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9D5158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9D6158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9D7158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9D8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9D9158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9DA158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9DB158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9DC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9DD158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9DE158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9DF158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9E0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9E1158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9E2158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9E3158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9E4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9E5158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9E6158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9E7158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9E8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9E9158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9EA158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9EB158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9EC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9ED158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9EE158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9EF158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9F0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9F1158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9F2158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9F3158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9F4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9F5158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9F6158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9F7158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9F8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9F9158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9FA158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9FB158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FD9FC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FD9FD158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FD9FE158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FD9FF158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA00158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA01158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA02158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA03158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA04158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA05158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA06158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA07158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA08158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA09158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA0A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA0B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA0C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA0D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA0E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA0F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA10158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA11158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA12158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA13158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA14158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA15158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA16158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA17158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA18158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA19158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA1A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA1B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA1C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA1D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA1E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA1F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA20158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA21158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA22158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA23158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA24158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA25158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA26158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA27158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA28158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA29158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA2A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA2B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA2C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA2D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA2E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA2F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA30158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA31158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA32158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA33158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA34158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA35158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA36158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA37158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA38158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA39158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA3A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA3B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA3C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA3D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA3E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA3F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA40158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA41158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA42158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA43158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA44158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA45158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA46158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA47158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA48158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA49158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA4A158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA4B158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA4C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA4D158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA4E158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA4F158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA50158FF96500C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA51158FF96500C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA52158FF96500C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA53158FF96600C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA54158FF96600C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA55158FF96600C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA56158FF96600C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA57158FF96600C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA58158FF96600C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA59158FF96600C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA5A158FF96600C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA5B158FF96600C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA5C158FF96600C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA5D158FF96600C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA5E158FF96600C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA5F158FF96600C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA60158FF96600C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA61158FF96600C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA62158FF96600C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA63158FF96600C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA64158FF96600C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA65158FF96600C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA66158FF96600C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA67158FF96600C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA68158FF96600C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA69158FF96600C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA6A158FF96600C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA6B158FF96600C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA6C158FF96600C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA6D158FF96600C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA6E158FF96600C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA6F158FF96600C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA70158FF96600C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA71158FF96600C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA72158FF96600C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA73158FF96600C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA74158FF96600C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA75158FF96600C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA76158FF96600C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA77158FF96600C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA78158FF96600C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA79158FF96600C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA7A158FF96600C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA7B158FF96600C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA7C158FF96600C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA7D158FF96600C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA7E158FF96600C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA7F158FF96600C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA80158FF96600C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA81158FF96600C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA82158FF96600C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA83158FF96600C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA84158FF96600C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA85158FF96600C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA86158FF96600C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF1FDA87158FF96600C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF1FDA88158FF96600C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF1FDA89158FF96600C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF1FDA8A158FF96600C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF2107781FD23BDD00B61EA9 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF21077A1FD23BDD00B61EA9 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF21077B1FD23BDD00B61EA9 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF21077C1FD23BDD00B61EA9 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF21077D1FD23BDD00B61EA9 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF21077E1FD23BDD00B61EA9 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF21077F1FD23BDD00B61EA9 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ AF2107801FD23BDD00B61EA9 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF2107891FD23D2800B61EA9 /* esper.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF2107881FD23D2800B61EA9 /* esper.xml */; };
+ AF21078A1FD23D2800B61EA9 /* esper.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF2107881FD23D2800B61EA9 /* esper.xml */; };
+ AF21078C1FD23D5000B61EA9 /* esper.c in Sources */ = {isa = PBXBuildFile; fileRef = AF21078B1FD23D5000B61EA9 /* esper.c */; };
+ AF21078D1FD23D5000B61EA9 /* esper.c in Sources */ = {isa = PBXBuildFile; fileRef = AF21078B1FD23D5000B61EA9 /* esper.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF2107901FD23FEC00B61EA9 /* OCRAStd.otf in Resources */ = {isa = PBXBuildFile; fileRef = AFEC68361BD6CA85004C1B64 /* OCRAStd.otf */; };
+ AF241F83107C38DF00046A84 /* dropshadow.c in Sources */ = {isa = PBXBuildFile; fileRef = AF241F81107C38DF00046A84 /* dropshadow.c */; };
+ AF2C31E615C0F7FE007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C31EA15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C31EB15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C31EC15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C31ED15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C31EF15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C31F015C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C31F115C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C31F215C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C31F315C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C31F415C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C31F515C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C31F615C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C31F715C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C31F815C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C31F915C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C31FA15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C31FB15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C31FC15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C31FD15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C31FE15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C31FF15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C320015C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C320115C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C320215C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C320315C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C320415C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C320515C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C320615C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C320715C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C320815C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C320915C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C320A15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C320B15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C320C15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C320D15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C320E15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C320F15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C321015C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C321115C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C321215C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C321315C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C321415C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C321515C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C321615C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C321715C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C321815C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C321915C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C321A15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C321B15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C321C15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C321D15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C321E15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C321F15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C322015C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C322115C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C322315C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C322415C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C322515C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C322615C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C322715C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C322815C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C322915C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C322A15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C322B15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C322C15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C322D15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C322E15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C322F15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C323015C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C323115C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C323215C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C323315C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C323415C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C323515C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C323615C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C323715C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C323815C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C323915C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C323A15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C323B15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C323C15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C323D15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C323E15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C323F15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C324015C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C324115C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C324215C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C324315C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C324415C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C324515C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C324615C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C324715C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C324815C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C324915C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C324A15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C324B15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C324C15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C324D15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C324E15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C324F15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C325015C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C325115C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C325215C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C325315C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C325515C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C325615C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C325715C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C325815C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C325915C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C325A15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C325B15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C325C15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C325D15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C325E15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C325F15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C326015C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C326115C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C326215C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C326315C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C326415C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C326515C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C326615C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C326715C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C326815C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C326915C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C326A15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C326B15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C326C15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C326D15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C326E15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C326F15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C327015C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C327115C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C327215C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C327315C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C327415C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C327515C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C327615C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C327715C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C327815C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C327915C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C327A15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C327B15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C327C15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C327D15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C327E15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C327F15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C328015C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C328115C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C328215C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C328315C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C328415C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C328515C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C328615C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C328715C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C328815C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C328915C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C328A15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C328B15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C328C15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C328D15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C328E15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C328F15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C329015C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C329115C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C329215C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C329315C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C329415C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C329515C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C329615C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C329715C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C329815C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C329915C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C329A15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C329B15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C329C15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C329D15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C329E15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C329F15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32A015C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32A115C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32A215C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32A315C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32A415C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32A515C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32A615C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32A715C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32A815C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32A915C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32AA15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32AB15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32AC15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32AD15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32AE15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32AF15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32B015C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32B115C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32B215C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32B315C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32B415C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32B515C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32B615C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32B715C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32B815C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32B915C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32BA15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32BB15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32BC15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32BD15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32BE15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32BF15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32C015C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32C115C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32C215C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32C315C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32C415C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32C515C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32C615C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32C715C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2C32C815C0FC9D007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF2D8F321CEBA10300198014 /* jwxyz-timers.c in Sources */ = {isa = PBXBuildFile; fileRef = AF2D8F301CEBA10300198014 /* jwxyz-timers.c */; };
+ AF2D8F331CEBA10300198014 /* jwxyz-timers.h in Headers */ = {isa = PBXBuildFile; fileRef = AF2D8F311CEBA10300198014 /* jwxyz-timers.h */; };
+ AF32D9E70F3AD0B40080F535 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF32D9FB0F3AD1200080F535 /* rubikblocks.c in Sources */ = {isa = PBXBuildFile; fileRef = AF32D9FA0F3AD1200080F535 /* rubikblocks.c */; };
+ AF32D9FD0F3AD1330080F535 /* rubikblocks.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF32D9FC0F3AD1330080F535 /* rubikblocks.xml */; };
+ AF3581C31431D47B00E09C51 /* voronoi.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF0DCA610C4CBB8E00D76972 /* voronoi.xml */; };
+ AF3581C61431D47B00E09C51 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF3581DC1431D5FC00E09C51 /* companion_disc.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3581D61431D5FC00E09C51 /* companion_disc.c */; };
+ AF3581DF1431D5FC00E09C51 /* companion_heart.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3581D71431D5FC00E09C51 /* companion_heart.c */; };
+ AF3581E21431D5FC00E09C51 /* companion_quad.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3581D81431D5FC00E09C51 /* companion_quad.c */; };
+ AF3581E51431D5FC00E09C51 /* companion.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3581D91431D5FC00E09C51 /* companion.c */; };
+ AF3581E81431D61D00E09C51 /* companioncube.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF3581E61431D61D00E09C51 /* companioncube.xml */; };
+ AF3581FF143330F900E09C51 /* voronoi.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF0DCA610C4CBB8E00D76972 /* voronoi.xml */; };
+ AF358203143330F900E09C51 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF35821C1433314C00E09C51 /* tronbit_idle1.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3582171433314C00E09C51 /* tronbit_idle1.c */; };
+ AF35821D1433314C00E09C51 /* tronbit_idle2.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3582181433314C00E09C51 /* tronbit_idle2.c */; };
+ AF35821E1433314C00E09C51 /* tronbit_no.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3582191433314C00E09C51 /* tronbit_no.c */; };
+ AF35821F1433314C00E09C51 /* tronbit_yes.c in Sources */ = {isa = PBXBuildFile; fileRef = AF35821A1433314C00E09C51 /* tronbit_yes.c */; };
+ AF3582201433314C00E09C51 /* tronbit.c in Sources */ = {isa = PBXBuildFile; fileRef = AF35821B1433314C00E09C51 /* tronbit.c */; };
+ AF3582221433318500E09C51 /* tronbit.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF3582211433318500E09C51 /* tronbit.xml */; };
+ AF35E8900E63823600691F2F /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF35EB240E63829600691F2F /* jigsaw.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258CF0988A468000655EE /* jigsaw.xml */; };
+ AF35EB260E6382BA00691F2F /* jigsaw.c in Sources */ = {isa = PBXBuildFile; fileRef = AF35EB250E6382BA00691F2F /* jigsaw.c */; };
+ AF3633FC18530DD90086A439 /* sparkle_dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = AF3633F918530DD90086A439 /* sparkle_dsa_pub.pem */; };
+ AF3633FD18530DD90086A439 /* Updater.m in Sources */ = {isa = PBXBuildFile; fileRef = AF3633FB18530DD90086A439 /* Updater.m */; };
+ AF3938211D0FBD6A00205406 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF3938231D0FBD6A00205406 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF3938241D0FBD6A00205406 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF3938251D0FBD6A00205406 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF3938261D0FBD6A00205406 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF3938271D0FBD6A00205406 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF3938281D0FBD6A00205406 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ AF3938291D0FBD6A00205406 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF3938331D0FBF0100205406 /* discoball.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF3938321D0FBEC800205406 /* discoball.xml */; };
+ AF3938341D0FBF1900205406 /* discoball.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3938311D0FBEC800205406 /* discoball.c */; };
+ AF3938351D0FBF1D00205406 /* discoball.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3938311D0FBEC800205406 /* discoball.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF3938361D0FBF2700205406 /* discoball.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF3938321D0FBEC800205406 /* discoball.xml */; };
+ AF39483E15A164680000FFCD /* jigsaw.c in Sources */ = {isa = PBXBuildFile; fileRef = AF35EB250E6382BA00691F2F /* jigsaw.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF39483F15A1647A0000FFCD /* jigsaw.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258CF0988A468000655EE /* jigsaw.xml */; };
+ AF39E289198A11F60064A58D /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF39E28B198A11F60064A58D /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF39E28C198A11F60064A58D /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF39E28D198A11F60064A58D /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF39E28E198A11F60064A58D /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF39E28F198A11F60064A58D /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF39E290198A11F60064A58D /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF39E2AA198A13F50064A58D /* robot-wireframe.c in Sources */ = {isa = PBXBuildFile; fileRef = AF39E2A0198A13F50064A58D /* robot-wireframe.c */; };
+ AF39E2AB198A13F50064A58D /* winduprobot.c in Sources */ = {isa = PBXBuildFile; fileRef = AF39E2A1198A13F50064A58D /* winduprobot.c */; };
+ AF39E2AD198A15820064A58D /* winduprobot.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF39E2AC198A15820064A58D /* winduprobot.xml */; };
+ AF39E2AE198A15820064A58D /* winduprobot.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF39E2AC198A15820064A58D /* winduprobot.xml */; };
+ AF39E2B7198A15EE0064A58D /* robot-wireframe.c in Sources */ = {isa = PBXBuildFile; fileRef = AF39E2A0198A13F50064A58D /* robot-wireframe.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF39E2B8198A15EE0064A58D /* winduprobot.c in Sources */ = {isa = PBXBuildFile; fileRef = AF39E2A1198A13F50064A58D /* winduprobot.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF3C714B0D624BF50030CC0D /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF3C715E0D624C600030CC0D /* hypnowheel.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3C715D0D624C600030CC0D /* hypnowheel.c */; };
+ AF3C71600D624C7C0030CC0D /* hypnowheel.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF3C715F0D624C7C0030CC0D /* hypnowheel.xml */; };
+ AF3EC97F2035154C00180A35 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF3EC9812035154C00180A35 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF3EC9822035154C00180A35 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF3EC9832035154C00180A35 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF3EC9842035154C00180A35 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF3EC9852035154C00180A35 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF3EC9862035154C00180A35 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ AF3EC9872035154C00180A35 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF3EC990203517AE00180A35 /* peepers.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF3EC98F203517AD00180A35 /* peepers.xml */; };
+ AF3EC991203517AE00180A35 /* peepers.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF3EC98F203517AD00180A35 /* peepers.xml */; };
+ AF3EC993203517CC00180A35 /* peepers.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3EC992203517CC00180A35 /* peepers.c */; };
+ AF3EC994203517CC00180A35 /* peepers.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3EC992203517CC00180A35 /* peepers.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF3FAD8F20C242DA00680000 /* analogtv.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4CFA09B5AC94006E59CF /* analogtv.c */; };
+ AF41E959201D49DB0098E253 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF41E95B201D49DB0098E253 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF41E95C201D49DB0098E253 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF41E95D201D49DB0098E253 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF41E95E201D49DB0098E253 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF41E95F201D49DB0098E253 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF41E960201D49DB0098E253 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ AF41E961201D49DB0098E253 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF41E96A201D4B6B0098E253 /* razzledazzle.c in Sources */ = {isa = PBXBuildFile; fileRef = AF41E969201D4B6B0098E253 /* razzledazzle.c */; };
+ AF41E96B201D4B6B0098E253 /* razzledazzle.c in Sources */ = {isa = PBXBuildFile; fileRef = AF41E969201D4B6B0098E253 /* razzledazzle.c */; };
+ AF41E96C201D4B6B0098E253 /* razzledazzle.c in Sources */ = {isa = PBXBuildFile; fileRef = AF41E969201D4B6B0098E253 /* razzledazzle.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF41E96E201D4B940098E253 /* razzledazzle.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF41E96D201D4B940098E253 /* razzledazzle.xml */; };
+ AF41E96F201D4B940098E253 /* razzledazzle.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF41E96D201D4B940098E253 /* razzledazzle.xml */; };
+ AF46E9D61CBBA2B300240FBC /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF46E9D81CBBA2B300240FBC /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF46E9D91CBBA2B300240FBC /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF46E9DA1CBBA2B300240FBC /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF46E9DB1CBBA2B300240FBC /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF46E9DC1CBBA2B300240FBC /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF46E9DD1CBBA2B300240FBC /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ AF46E9DE1CBBA2B300240FBC /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF46E9E81CBBA41600240FBC /* unicrud.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF46E9E61CBBA3F900240FBC /* unicrud.xml */; };
+ AF46E9E91CBBA41B00240FBC /* unicrud.c in Sources */ = {isa = PBXBuildFile; fileRef = AF46E9E71CBBA3F900240FBC /* unicrud.c */; };
+ AF46E9EA1CBBA42F00240FBC /* unicrud.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF46E9E61CBBA3F900240FBC /* unicrud.xml */; };
+ AF46E9EB1CBBA43B00240FBC /* unicrud.c in Sources */ = {isa = PBXBuildFile; fileRef = AF46E9E71CBBA3F900240FBC /* unicrud.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF476FBC099D154F001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF476FCF099D1587001F091E /* interference.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258CC0988A468000655EE /* interference.xml */; };
+ AF476FD1099D15AA001F091E /* interference.c in Sources */ = {isa = PBXBuildFile; fileRef = AF476FD0099D15AA001F091E /* interference.c */; };
+ AF476FE1099D1686001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF476FEF099D16E4001F091E /* truchet.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259260988A469000655EE /* truchet.xml */; };
+ AF476FF1099D1713001F091E /* truchet.c in Sources */ = {isa = PBXBuildFile; fileRef = AF476FF0099D1713001F091E /* truchet.c */; };
+ AF477052099D4385001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF47705E099D43B7001F091E /* deluxe.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258950988A468000655EE /* deluxe.xml */; };
+ AF477146099D43E2001F091E /* deluxe.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477145099D43E2001F091E /* deluxe.c */; };
+ AF47716F099D4786001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF47717B099D47B7001F091E /* compass.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258880988A468000655EE /* compass.xml */; };
+ AF47717D099D47D3001F091E /* compass.c in Sources */ = {isa = PBXBuildFile; fileRef = AF47717C099D47D3001F091E /* compass.c */; };
+ AF477185099D4803001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF477191099D4846001F091E /* wander.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2592B0988A469000655EE /* wander.xml */; };
+ AF477193099D4864001F091E /* wander.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477192099D4864001F091E /* wander.c */; };
+ AF4771AD099D4949001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF4771B9099D4981001F091E /* t3d.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259210988A469000655EE /* t3d.xml */; };
+ AF4771BB099D4997001F091E /* t3d.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4771BA099D4997001F091E /* t3d.c */; };
+ AF4771E1099D4D9A001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF4771EE099D4DE5001F091E /* ccurve.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258840988A468000655EE /* ccurve.xml */; };
+ AF4771F0099D4DFE001F091E /* ccurve.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4771EF099D4DFE001F091E /* ccurve.c */; };
+ AF4771F8099D4E63001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF477204099D4EA2001F091E /* nerverot.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258EB0988A469000655EE /* nerverot.xml */; };
+ AF477206099D4EB6001F091E /* nerverot.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477205099D4EB6001F091E /* nerverot.c */; };
+ AF47720E099D4EE8001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF47721A099D4F27001F091E /* whirlygig.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2592F0988A469000655EE /* whirlygig.xml */; };
+ AF47721C099D4F47001F091E /* whirlygig.c in Sources */ = {isa = PBXBuildFile; fileRef = AF47721B099D4F47001F091E /* whirlygig.c */; };
+ AF477224099D4F67001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF477230099D4FBD001F091E /* anemone.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258680988A468000655EE /* anemone.xml */; };
+ AF477232099D4FD5001F091E /* anemone.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477231099D4FD5001F091E /* anemone.c */; };
+ AF477259099D5717001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF477265099D5752001F091E /* halftone.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258C20988A468000655EE /* halftone.xml */; };
+ AF477267099D5768001F091E /* halftone.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477266099D5768001F091E /* halftone.c */; };
+ AF477271099D57B9001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF47727D099D57F5001F091E /* popsquares.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258FB0988A469000655EE /* popsquares.xml */; };
+ AF47727F099D5808001F091E /* popsquares.c in Sources */ = {isa = PBXBuildFile; fileRef = AF47727E099D5808001F091E /* popsquares.c */; };
+ AF477289099D5926001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF477296099D596A001F091E /* piecewise.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258F40988A469000655EE /* piecewise.xml */; };
+ AF477298099D5980001F091E /* piecewise.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477297099D5980001F091E /* piecewise.c */; };
+ AF477388099D65A1001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF477394099D65EB001F091E /* wormhole.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259310988A469000655EE /* wormhole.xml */; };
+ AF477396099D65FE001F091E /* wormhole.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477395099D65FE001F091E /* wormhole.c */; };
+ AF4773A0099D6648001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF4773AC099D6762001F091E /* fuzzyflakes.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258B00988A468000655EE /* fuzzyflakes.xml */; };
+ AF4773B5099D6778001F091E /* fuzzyflakes.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4773B4099D6778001F091E /* fuzzyflakes.c */; };
+ AF4773C7099D67B9001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF4773D3099D6804001F091E /* anemotaxis.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258690988A468000655EE /* anemotaxis.xml */; };
+ AF4773D5099D6817001F091E /* anemotaxis.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4773D4099D6817001F091E /* anemotaxis.c */; };
+ AF477408099D69E7001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF47741B099D6A58001F091E /* intermomentary.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258CD0988A468000655EE /* intermomentary.xml */; };
+ AF47741D099D6A6D001F091E /* intermomentary.c in Sources */ = {isa = PBXBuildFile; fileRef = AF47741C099D6A6C001F091E /* intermomentary.c */; };
+ AF47742D099D7C70001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF477439099D7CD0001F091E /* ifs.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258C90988A468000655EE /* ifs.xml */; };
+ AF47743B099D7CEA001F091E /* ifs.c in Sources */ = {isa = PBXBuildFile; fileRef = AF47743A099D7CEA001F091E /* ifs.c */; };
+ AF477448099D7D33001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF477454099D7D75001F091E /* xmatrix.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2593A0988A469000655EE /* xmatrix.xml */; };
+ AF477456099D7D8A001F091E /* xmatrix.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477455099D7D8A001F091E /* xmatrix.c */; };
+ AF477489099D89E4001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF477495099D8A3A001F091E /* flame.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258A60988A468000655EE /* flame.xml */; };
+ AF477497099D8A53001F091E /* flame.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477496099D8A53001F091E /* flame.c */; };
+ AF47749F099D8A74001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF4774AB099D8AF3001F091E /* kaleidescope.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258D30988A468000655EE /* kaleidescope.xml */; };
+ AF4774AD099D8B08001F091E /* kaleidescope.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4774AC099D8B08001F091E /* kaleidescope.c */; };
+ AF4774BA099D8B5F001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF4774CA099D8BAE001F091E /* lmorph.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258DC0988A468000655EE /* lmorph.xml */; };
+ AF4774CC099D8BC2001F091E /* lmorph.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4774CB099D8BC2001F091E /* lmorph.c */; };
+ AF4774D4099D8BFF001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF4774E0099D8C74001F091E /* maze.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258DE0988A468000655EE /* maze.xml */; };
+ AF4774E2099D8C8B001F091E /* maze.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4774E1099D8C8B001F091E /* maze.c */; };
+ AF4774E8099D8D8C001F091E /* logo.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4774E7099D8D8C001F091E /* logo.c */; };
+ AF477563099D9A1A001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF47756F099D9A70001F091E /* pedal.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258EF0988A469000655EE /* pedal.xml */; };
+ AF477571099D9A8A001F091E /* pedal.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477570099D9A8A001F091E /* pedal.c */; };
+ AF477589099D9C28001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF47759B099D9C8D001F091E /* pyro.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258FE0988A469000655EE /* pyro.xml */; };
+ AF47759D099D9CA3001F091E /* pyro.c in Sources */ = {isa = PBXBuildFile; fileRef = AF47759C099D9CA3001F091E /* pyro.c */; };
+ AF4775A5099D9CF7001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF4775B1099D9D51001F091E /* starfish.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2591A0988A469000655EE /* starfish.xml */; };
+ AF4775B4099D9D67001F091E /* starfish.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4775B3099D9D67001F091E /* starfish.c */; };
+ AF4775C0099D9E79001F091E /* resources.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4775BE099D9E79001F091E /* resources.c */; };
+ AF4775C1099D9E79001F091E /* resources.h in Headers */ = {isa = PBXBuildFile; fileRef = AF4775BF099D9E79001F091E /* resources.h */; };
+ AF4775DE099D9F69001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF4775EC099D9FDB001F091E /* coral.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258890988A468000655EE /* coral.xml */; };
+ AF4775F0099D9FFF001F091E /* coral.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4775EF099D9FFF001F091E /* coral.c */; };
+ AF4775F8099DA030001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF477604099DA083001F091E /* epicycle.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2589D0988A468000655EE /* epicycle.xml */; };
+ AF477606099DA097001F091E /* epicycle.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477605099DA097001F091E /* epicycle.c */; };
+ AF477619099DA26C001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF477629099DA2D2001F091E /* kumppa.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258D50988A468000655EE /* kumppa.xml */; };
+ AF47762B099DA2E9001F091E /* kumppa.c in Sources */ = {isa = PBXBuildFile; fileRef = AF47762A099DA2E9001F091E /* kumppa.c */; };
+ AF47764A099DA6D0001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF477656099DA738001F091E /* squiral.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259170988A469000655EE /* squiral.xml */; };
+ AF477658099DA75D001F091E /* squiral.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477657099DA75D001F091E /* squiral.c */; };
+ AF477660099DA78E001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF47766C099DA7F3001F091E /* critical.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2588C0988A468000655EE /* critical.xml */; };
+ AF47766E099DA80D001F091E /* critical.c in Sources */ = {isa = PBXBuildFile; fileRef = AF47766D099DA80D001F091E /* critical.c */; };
+ AF477676099DA849001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF477682099DA8AC001F091E /* petri.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258F20988A469000655EE /* petri.xml */; };
+ AF477684099DA8C7001F091E /* petri.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477683099DA8C7001F091E /* petri.c */; };
+ AF477695099DAA6F001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF4776A1099DAAC9001F091E /* blaster.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258740988A468000655EE /* blaster.xml */; };
+ AF4776A3099DAADE001F091E /* blaster.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4776A2099DAADE001F091E /* blaster.c */; };
+ AF4776B0099DABDD001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF4776BC099DAC29001F091E /* xspirograph.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2593F0988A469000655EE /* xspirograph.xml */; };
+ AF4776BE099DAC46001F091E /* xspirograph.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4776BD099DAC46001F091E /* xspirograph.c */; };
+ AF4776C6099DAC8A001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF4776D2099DACD6001F091E /* xrayswarm.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2593D0988A469000655EE /* xrayswarm.xml */; };
+ AF4776D4099DACEB001F091E /* xrayswarm.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4776D3099DACEB001F091E /* xrayswarm.c */; };
+ AF4776E1099DADDF001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF4776ED099DAE38001F091E /* whirlwindwarp.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2592D0988A469000655EE /* whirlwindwarp.xml */; };
+ AF4776EF099DAE58001F091E /* whirlwindwarp.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4776EE099DAE58001F091E /* whirlwindwarp.c */; };
+ AF4776F7099DAE7A001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF477703099DAF24001F091E /* vermiculate.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259280988A469000655EE /* vermiculate.xml */; };
+ AF477705099DAF3F001F091E /* vermiculate.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477704099DAF3F001F091E /* vermiculate.c */; };
+ AF477713099DAF9F001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF47771F099DB000001F091E /* cloudlife.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258870988A468000655EE /* cloudlife.xml */; };
+ AF477721099DB01C001F091E /* cloudlife.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477720099DB01C001F091E /* cloudlife.c */; };
+ AF477729099DB044001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF477735099DB0ED001F091E /* substrate.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2591E0988A469000655EE /* substrate.xml */; };
+ AF477737099DB104001F091E /* substrate.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477736099DB104001F091E /* substrate.c */; };
+ AF477758099DB61E001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF477768099DB6FD001F091E /* interaggregate.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258CB0988A468000655EE /* interaggregate.xml */; };
+ AF47776A099DB710001F091E /* interaggregate.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477769099DB710001F091E /* interaggregate.c */; };
+ AF47777A099DB965001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF477786099DBA11001F091E /* celtic.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258850988A468000655EE /* celtic.xml */; };
+ AF477788099DBA29001F091E /* celtic.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477787099DBA29001F091E /* celtic.c */; };
+ AF477796099DBA90001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF4777A3099DBAF8001F091E /* fluidballs.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258AB0988A468000655EE /* fluidballs.xml */; };
+ AF4777A5099DBB12001F091E /* fluidballs.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4777A4099DBB11001F091E /* fluidballs.c */; };
+ AF4777D7099DC183001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF4778A2099DDA76001F091E /* boxfit.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2587C0988A468000655EE /* boxfit.xml */; };
+ AF4778A4099DDA91001F091E /* boxfit.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4778A3099DDA91001F091E /* boxfit.c */; };
+ AF4778B1099DDB79001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF4778BD099DDC1B001F091E /* penetrate.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258F00988A469000655EE /* penetrate.xml */; };
+ AF4778BF099DDC33001F091E /* penetrate.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4778BE099DDC32001F091E /* penetrate.c */; };
+ AF4778CD099DDCAE001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF4778D9099DDD14001F091E /* xjack.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259380988A469000655EE /* xjack.xml */; };
+ AF4778DB099DDD2B001F091E /* xjack.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4778DA099DDD2B001F091E /* xjack.c */; };
+ AF4778EE099DDDC8001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF4778FA099DDE5F001F091E /* cynosure.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258910988A468000655EE /* cynosure.xml */; };
+ AF4778FC099DDE79001F091E /* cynosure.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4778FB099DDE79001F091E /* cynosure.c */; };
+ AF47790F099DE379001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF47791B099DE3D9001F091E /* flag.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258A50988A468000655EE /* flag.xml */; };
+ AF47791D099DE3F1001F091E /* flag.c in Sources */ = {isa = PBXBuildFile; fileRef = AF47791C099DE3F1001F091E /* flag.c */; };
+ AF477930099DE4C7001F091E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF47793C099DE535001F091E /* slip.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2590E0988A469000655EE /* slip.xml */; };
+ AF47793E099DE56A001F091E /* slip.c in Sources */ = {isa = PBXBuildFile; fileRef = AF47793D099DE56A001F091E /* slip.c */; };
+ AF4808C5098C3BDC00FB32B8 /* colors.c in Sources */ = {isa = PBXBuildFile; fileRef = AFC25B990988BC08000655EE /* colors.c */; };
+ AF4808C6098C3BDF00FB32B8 /* erase.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD530981E3CB00F7970E /* erase.c */; };
+ AF4808C7098C3BE600FB32B8 /* hsv.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD550981E3CB00F7970E /* hsv.c */; };
+ AF4808C8098C3BE800FB32B8 /* InvertedSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD420981E32E00F7970E /* InvertedSlider.m */; };
+ AF4808C9098C3BEC00FB32B8 /* jwxyz.m in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD440981E32E00F7970E /* jwxyz.m */; };
+ AF4808CA098C3BEE00FB32B8 /* PrefsReader.m in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD480981E32E00F7970E /* PrefsReader.m */; };
+ AF4808CC098C3BF200FB32B8 /* spline.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD570981E3CB00F7970E /* spline.c */; };
+ AF4808CD098C3BF400FB32B8 /* usleep.c in Sources */ = {isa = PBXBuildFile; fileRef = AFB5A0ED0981FF8B00871B16 /* usleep.c */; };
+ AF4808CE098C3BF800FB32B8 /* XScreenSaverConfigSheet.m in Sources */ = {isa = PBXBuildFile; fileRef = AFC2578009888F5A000655EE /* XScreenSaverConfigSheet.m */; };
+ AF4808CF098C3BFB00FB32B8 /* XScreenSaverView.m in Sources */ = {isa = PBXBuildFile; fileRef = AFC254C509882C97000655EE /* XScreenSaverView.m */; };
+ AF4808D0098C3BFD00FB32B8 /* yarandom.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD5B0981E3CB00F7970E /* yarandom.c */; };
+ AF480C5C098E305900FB32B8 /* helix.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480C2F098E2A6700FB32B8 /* helix.c */; };
+ AF480C69098E309E00FB32B8 /* helix.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258C40988A468000655EE /* helix.xml */; };
+ AF480D85098EEE3100FB32B8 /* drift.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258990988A468000655EE /* drift.xml */; };
+ AF480D88098EEE5B00FB32B8 /* drift.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480C82098E336D00FB32B8 /* drift.c */; };
+ AF480FCC09901DF900FB32B8 /* gltrackball.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480EB0098F63D600FB32B8 /* gltrackball.c */; };
+ AF480FCD09901E0000FB32B8 /* rotator.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480EB7098F646400FB32B8 /* rotator.c */; };
+ AF480FCE09901E0400FB32B8 /* sphere.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480EBB098F649600FB32B8 /* sphere.c */; };
+ AF480FCF09901E0700FB32B8 /* trackball.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480EAD098F63BE00FB32B8 /* trackball.c */; };
+ AF480FD009901E0A00FB32B8 /* tube.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480ED2098F652A00FB32B8 /* tube.c */; };
+ AF4811030990A02700FB32B8 /* dangerball.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480DD1098F4F6200FB32B8 /* dangerball.c */; };
+ AF4811440990A35B00FB32B8 /* dangerball.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258920988A468000655EE /* dangerball.xml */; };
+ AF4812580990CE2700FB32B8 /* gears.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4812250990CB8C00FB32B8 /* gears.c */; };
+ AF48126D0990CE8600FB32B8 /* gears.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258B20988A468000655EE /* gears.xml */; };
+ AF4812C80990D41700FB32B8 /* pipes.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258F60988A469000655EE /* pipes.xml */; };
+ AF4812C90990D41E00FB32B8 /* buildlwo.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4812760990CF5D00FB32B8 /* buildlwo.c */; };
+ AF4812CA0990D42000FB32B8 /* pipeobjs.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4812780990CF5D00FB32B8 /* pipeobjs.c */; };
+ AF4812CB0990D42100FB32B8 /* pipes.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4812790990CF5D00FB32B8 /* pipes.c */; };
+ AF4812FA0990D9AE00FB32B8 /* XScreenSaverGLView.m in Sources */ = {isa = PBXBuildFile; fileRef = AF4812F80990D9AE00FB32B8 /* XScreenSaverGLView.m */; };
+ AF48DEF60A0C25E000F94CF9 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF48E1680A0C268500F94CF9 /* glschool_alg.c in Sources */ = {isa = PBXBuildFile; fileRef = AF48E1620A0C268400F94CF9 /* glschool_alg.c */; };
+ AF48E1690A0C268500F94CF9 /* glschool_gl.c in Sources */ = {isa = PBXBuildFile; fileRef = AF48E1640A0C268500F94CF9 /* glschool_gl.c */; };
+ AF48E16A0A0C268500F94CF9 /* glschool.c in Sources */ = {isa = PBXBuildFile; fileRef = AF48E1660A0C268500F94CF9 /* glschool.c */; };
+ AF48E16C0A0C26A400F94CF9 /* glschool.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF48E16B0A0C26A400F94CF9 /* glschool.xml */; };
+ AF4A3450102A593600A81B2A /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF4A3462102A59EB00A81B2A /* surfaces.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF4A3461102A59EB00A81B2A /* surfaces.xml */; };
+ AF4A3464102A5A0E00A81B2A /* surfaces.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4A3463102A5A0E00A81B2A /* surfaces.c */; };
+ AF4A6692191F7CAE00C74753 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF4A8CA010B609B50074B062 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF4C300E208569AA00BE1DEF /* dymaxionmap-coords.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4C300D208569A900BE1DEF /* dymaxionmap-coords.c */; };
+ AF4C300F208569AA00BE1DEF /* dymaxionmap-coords.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4C300D208569A900BE1DEF /* dymaxionmap-coords.c */; };
+ AF4FD6EC0CE7A486005EE58E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF4FD7010CE7A577005EE58E /* lockward.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4FD7000CE7A577005EE58E /* lockward.c */; };
+ AF4FD7030CE7A5BC005EE58E /* lockward.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF4FD7020CE7A5BC005EE58E /* lockward.xml */; };
+ AF4FF4C10D52CBDE00666F98 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF4FF4D10D52CC8400666F98 /* cubicgrid.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4FF4D00D52CC8400666F98 /* cubicgrid.c */; };
+ AF4FF4D40D52CCAA00666F98 /* cubicgrid.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF4FF4D30D52CCAA00666F98 /* cubicgrid.xml */; };
+ AF51FD3915845FCB00E5741F /* SaverRunner.icns in Resources */ = {isa = PBXBuildFile; fileRef = AF2D522513E954A0002AA818 /* SaverRunner.icns */; };
+ AF561DF615969BC3007CA5ED /* grabclient-ios.m in Sources */ = {isa = PBXBuildFile; fileRef = AF561DF515969BC3007CA5ED /* grabclient-ios.m */; };
+ AF561DF815969C5B007CA5ED /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF561DF715969C5B007CA5ED /* AssetsLibrary.framework */; };
+ AF5BEEFD1D2AFE21002E6D51 /* OCRAStd.otf in Resources */ = {isa = PBXBuildFile; fileRef = AFEC68361BD6CA85004C1B64 /* OCRAStd.otf */; };
+ AF5C9AFD1A0CCE6E00B0147A /* dangerball.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258920988A468000655EE /* dangerball.xml */; };
+ AF5C9B001A0CCE6E00B0147A /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF5C9B021A0CCE6E00B0147A /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF5C9B031A0CCE6E00B0147A /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF5C9B041A0CCE6E00B0147A /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF5C9B051A0CCE6E00B0147A /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF5C9B061A0CCE6E00B0147A /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF5C9B071A0CCE6E00B0147A /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF5C9B111A0CCF4E00B0147A /* cityflow.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF5C9B0F1A0CCF4E00B0147A /* cityflow.xml */; };
+ AF5C9B121A0CCF4E00B0147A /* cityflow.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF5C9B0F1A0CCF4E00B0147A /* cityflow.xml */; };
+ AF5C9B131A0CCF4E00B0147A /* cityflow.c in Sources */ = {isa = PBXBuildFile; fileRef = AF5C9B101A0CCF4E00B0147A /* cityflow.c */; };
+ AF5C9B141A0CCF4E00B0147A /* cityflow.c in Sources */ = {isa = PBXBuildFile; fileRef = AF5C9B101A0CCF4E00B0147A /* cityflow.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF5ECEB02116B1A400069433 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF5ECEB12116B1A400069433 /* analogtv.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4CFA09B5AC94006E59CF /* analogtv.c */; };
+ AF5ECEB42116B1A400069433 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF5ECEB52116B1A400069433 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF5ECEB62116B1A400069433 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF5ECEB72116B1A400069433 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF5ECEB82116B1A400069433 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF5ECEB92116B1A400069433 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ AF5ECEBA2116B1A400069433 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF5ECEC32116B2CC00069433 /* vfeedback.c in Sources */ = {isa = PBXBuildFile; fileRef = AF5ECEC22116B2CC00069433 /* vfeedback.c */; };
+ AF5ECEC42116B2CC00069433 /* vfeedback.c in Sources */ = {isa = PBXBuildFile; fileRef = AF5ECEC22116B2CC00069433 /* vfeedback.c */; };
+ AF5ECEC62116B2FE00069433 /* vfeedback.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF5ECEC52116B2FE00069433 /* vfeedback.xml */; };
+ AF5ECEC72116B2FE00069433 /* vfeedback.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF5ECEC52116B2FE00069433 /* vfeedback.xml */; };
+ AF6048FB157C07C600CA21E4 /* jwzgles.c in Sources */ = {isa = PBXBuildFile; fileRef = AF6048F8157C07C600CA21E4 /* jwzgles.c */; };
+ AF6048FC157C07C600CA21E4 /* jwzgles.h in Headers */ = {isa = PBXBuildFile; fileRef = AF6048F9157C07C600CA21E4 /* jwzgles.h */; };
+ AF6048FD157C07C600CA21E4 /* jwzglesI.h in Headers */ = {isa = PBXBuildFile; fileRef = AF6048FA157C07C600CA21E4 /* jwzglesI.h */; };
+ AF633C081EE0BA6F00AB33BD /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF633C0A1EE0BA6F00AB33BD /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF633C0B1EE0BA6F00AB33BD /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF633C0C1EE0BA6F00AB33BD /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF633C0D1EE0BA6F00AB33BD /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF633C0E1EE0BA6F00AB33BD /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF633C0F1EE0BA6F00AB33BD /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ AF633C101EE0BA6F00AB33BD /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF633C1A1EE0BC5500AB33BD /* vigilance.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF633C181EE0BC4900AB33BD /* vigilance.xml */; };
+ AF633C1B1EE0BC5A00AB33BD /* vigilance.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF633C181EE0BC4900AB33BD /* vigilance.xml */; };
+ AF633C1C1EE0BCA100AB33BD /* vigilance.c in Sources */ = {isa = PBXBuildFile; fileRef = AF633C191EE0BC4A00AB33BD /* vigilance.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF633C1D1EE0BCA700AB33BD /* vigilance.c in Sources */ = {isa = PBXBuildFile; fileRef = AF633C191EE0BC4A00AB33BD /* vigilance.c */; };
+ AF633C211EE0BDCD00AB33BD /* seccam.c in Sources */ = {isa = PBXBuildFile; fileRef = AF633C201EE0BDCD00AB33BD /* seccam.c */; };
+ AF633C221EE0BDCD00AB33BD /* seccam.c in Sources */ = {isa = PBXBuildFile; fileRef = AF633C201EE0BDCD00AB33BD /* seccam.c */; };
+ AF633C231EE0BDCD00AB33BD /* seccam.c in Sources */ = {isa = PBXBuildFile; fileRef = AF633C201EE0BDCD00AB33BD /* seccam.c */; };
+ AF63A7F81AB4EDDB00593C75 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF63A7FA1AB4EDDB00593C75 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF63A7FB1AB4EDDB00593C75 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF63A7FC1AB4EDDB00593C75 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF63A7FD1AB4EDDB00593C75 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF63A7FE1AB4EDDB00593C75 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF63A7FF1AB4EDDB00593C75 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ AF63A8001AB4EDDB00593C75 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF63A80A1AB4EF5D00593C75 /* romanboy.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF63A8081AB4EF5D00593C75 /* romanboy.xml */; };
+ AF63A80B1AB4EF5D00593C75 /* romanboy.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF63A8081AB4EF5D00593C75 /* romanboy.xml */; };
+ AF63A80C1AB4EF5D00593C75 /* romanboy.c in Sources */ = {isa = PBXBuildFile; fileRef = AF63A8091AB4EF5D00593C75 /* romanboy.c */; };
+ AF63A80D1AB4EF5D00593C75 /* romanboy.c in Sources */ = {isa = PBXBuildFile; fileRef = AF63A8091AB4EF5D00593C75 /* romanboy.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF63F2511C3465BE0033E133 /* iSaverRunner.xib in Resources */ = {isa = PBXBuildFile; fileRef = AF56019B157DAA3D00DB2055 /* iSaverRunner.xib */; };
+ AF63F2521C3465BE0033E133 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 55EDCB3C1AD498A800251909 /* LaunchScreen.xib */; };
+ AF63F2531C3465BE0033E133 /* iSaverRunner57t.png in Resources */ = {isa = PBXBuildFile; fileRef = AF73FF201A08AB9400E485E9 /* iSaverRunner57t.png */; };
+ AF63F25D1C3465BE0033E133 /* apple2.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2586F0988A468000655EE /* apple2.xml */; };
+ AF63F2B71C3465BE0033E133 /* Media-iOS.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 550FB5FD1AD64424001A4FA5 /* Media-iOS.xcassets */; };
+ AF63F3281C3465BE0033E133 /* SaverRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD400981E32E00F7970E /* SaverRunner.m */; };
+ AF63F3291C3465BE0033E133 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
+ AF63F32A1C3465BE0033E133 /* SaverListController.m in Sources */ = {isa = PBXBuildFile; fileRef = AF84AF1E15829AF000607E4C /* SaverListController.m */; };
+ AF63F32D1C3465BE0033E133 /* analogtv.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4CFA09B5AC94006E59CF /* analogtv.c */; };
+ AF63F32F1C3465BE0033E133 /* apple2-main.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4E0509B5BC9D006E59CF /* apple2-main.c */; };
+ AF63F3301C3465BE0033E133 /* apple2.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4DD309B5B990006E59CF /* apple2.c */; };
+ AF63F43F1C3465BE0033E133 /* ios-function-table.m in Sources */ = {isa = PBXBuildFile; fileRef = AFAA6B441773F07700DE720C /* ios-function-table.m */; };
+ AF63F4411C3465BE0033E133 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF63F4421C3465BE0033E133 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3A1590054B003974F3 /* OpenGLES.framework */; };
+ AF63F4431C3465BE0033E133 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3815900514003974F3 /* UIKit.framework */; };
+ AF63F4441C3465BE0033E133 /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF561DF715969C5B007CA5ED /* AssetsLibrary.framework */; };
+ AF63F4451C3465BE0033E133 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3C15900558003974F3 /* Foundation.framework */; };
+ AF63F4461C3465BE0033E133 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3E1590056A003974F3 /* CoreGraphics.framework */; };
+ AF63F4471C3465BE0033E133 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF0FAF3B159BAC7B00BCE2F7 /* CoreText.framework */; };
+ AF63F4481C3465BE0033E133 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3F1590056A003974F3 /* QuartzCore.framework */; };
+ AF63F4491C3465BE0033E133 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78377C17DBA85D003B9FC0 /* libz.dylib */; };
+ AF63F4591C34682A0033E133 /* iSaverRunner.xib in Resources */ = {isa = PBXBuildFile; fileRef = AF56019B157DAA3D00DB2055 /* iSaverRunner.xib */; };
+ AF63F45A1C34682A0033E133 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 55EDCB3C1AD498A800251909 /* LaunchScreen.xib */; };
+ AF63F45B1C34682A0033E133 /* iSaverRunner57t.png in Resources */ = {isa = PBXBuildFile; fileRef = AF73FF201A08AB9400E485E9 /* iSaverRunner57t.png */; };
+ AF63F45D1C34682A0033E133 /* Media-iOS.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 550FB5FD1AD64424001A4FA5 /* Media-iOS.xcassets */; };
+ AF63F45F1C34682A0033E133 /* SaverRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD400981E32E00F7970E /* SaverRunner.m */; };
+ AF63F4601C34682A0033E133 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
+ AF63F4611C34682A0033E133 /* SaverListController.m in Sources */ = {isa = PBXBuildFile; fileRef = AF84AF1E15829AF000607E4C /* SaverListController.m */; };
+ AF63F4651C34682A0033E133 /* ios-function-table.m in Sources */ = {isa = PBXBuildFile; fileRef = AFAA6B441773F07700DE720C /* ios-function-table.m */; };
+ AF63F4671C34682A0033E133 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF63F4681C34682A0033E133 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3A1590054B003974F3 /* OpenGLES.framework */; };
+ AF63F4691C34682A0033E133 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3815900514003974F3 /* UIKit.framework */; };
+ AF63F46A1C34682A0033E133 /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF561DF715969C5B007CA5ED /* AssetsLibrary.framework */; };
+ AF63F46B1C34682A0033E133 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3C15900558003974F3 /* Foundation.framework */; };
+ AF63F46C1C34682A0033E133 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3E1590056A003974F3 /* CoreGraphics.framework */; };
+ AF63F46D1C34682A0033E133 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF0FAF3B159BAC7B00BCE2F7 /* CoreText.framework */; };
+ AF63F46E1C34682A0033E133 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3F1590056A003974F3 /* QuartzCore.framework */; };
+ AF63F46F1C34682A0033E133 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78377C17DBA85D003B9FC0 /* libz.dylib */; };
+ AF63F4761C3469410033E133 /* phosphor.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258F30988A469000655EE /* phosphor.xml */; };
+ AF63F4771C3469570033E133 /* phosphor.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77770309B63B5F00EA3033 /* phosphor.c */; };
+ AF63F4811C3469FC0033E133 /* iSaverRunner.xib in Resources */ = {isa = PBXBuildFile; fileRef = AF56019B157DAA3D00DB2055 /* iSaverRunner.xib */; };
+ AF63F4821C3469FC0033E133 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 55EDCB3C1AD498A800251909 /* LaunchScreen.xib */; };
+ AF63F4831C3469FC0033E133 /* iSaverRunner57t.png in Resources */ = {isa = PBXBuildFile; fileRef = AF73FF201A08AB9400E485E9 /* iSaverRunner57t.png */; };
+ AF63F4851C3469FC0033E133 /* Media-iOS.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 550FB5FD1AD64424001A4FA5 /* Media-iOS.xcassets */; };
+ AF63F4871C3469FC0033E133 /* SaverRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD400981E32E00F7970E /* SaverRunner.m */; };
+ AF63F4881C3469FC0033E133 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
+ AF63F4891C3469FC0033E133 /* SaverListController.m in Sources */ = {isa = PBXBuildFile; fileRef = AF84AF1E15829AF000607E4C /* SaverListController.m */; };
+ AF63F48B1C3469FC0033E133 /* ios-function-table.m in Sources */ = {isa = PBXBuildFile; fileRef = AFAA6B441773F07700DE720C /* ios-function-table.m */; };
+ AF63F48D1C3469FC0033E133 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF63F48E1C3469FC0033E133 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3A1590054B003974F3 /* OpenGLES.framework */; };
+ AF63F48F1C3469FC0033E133 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3815900514003974F3 /* UIKit.framework */; };
+ AF63F4901C3469FC0033E133 /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF561DF715969C5B007CA5ED /* AssetsLibrary.framework */; };
+ AF63F4911C3469FC0033E133 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3C15900558003974F3 /* Foundation.framework */; };
+ AF63F4921C3469FC0033E133 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3E1590056A003974F3 /* CoreGraphics.framework */; };
+ AF63F4931C3469FC0033E133 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF0FAF3B159BAC7B00BCE2F7 /* CoreText.framework */; };
+ AF63F4941C3469FC0033E133 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3F1590056A003974F3 /* QuartzCore.framework */; };
+ AF63F4951C3469FC0033E133 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78377C17DBA85D003B9FC0 /* libz.dylib */; };
+ AF63F49C1C346B0A0033E133 /* testx11.xml in Resources */ = {isa = PBXBuildFile; fileRef = CE3D01681B76F83E00993C75 /* testx11.xml */; };
+ AF63F49D1C346B1A0033E133 /* testx11.c in Sources */ = {isa = PBXBuildFile; fileRef = CE3D016A1B76F8E200993C75 /* testx11.c */; };
+ AF64232F099F45C3000F4CD4 /* braid.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD56EC10996A76F00BA26F7 /* braid.c */; };
+ AF642330099F45CA000F4CD4 /* braid.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2587D0988A468000655EE /* braid.xml */; };
+ AF6423F9099FF9C2000F4CD4 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF642408099FFAB0000F4CD4 /* extrusion.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258A00988A468000655EE /* extrusion.xml */; };
+ AF642412099FFAF1000F4CD4 /* extrusion-helix2.c in Sources */ = {isa = PBXBuildFile; fileRef = AF642409099FFAF0000F4CD4 /* extrusion-helix2.c */; };
+ AF642413099FFAF1000F4CD4 /* extrusion-helix3.c in Sources */ = {isa = PBXBuildFile; fileRef = AF64240A099FFAF0000F4CD4 /* extrusion-helix3.c */; };
+ AF642414099FFAF1000F4CD4 /* extrusion-helix4.c in Sources */ = {isa = PBXBuildFile; fileRef = AF64240B099FFAF0000F4CD4 /* extrusion-helix4.c */; };
+ AF642415099FFAF1000F4CD4 /* extrusion-joinoffset.c in Sources */ = {isa = PBXBuildFile; fileRef = AF64240C099FFAF0000F4CD4 /* extrusion-joinoffset.c */; };
+ AF642416099FFAF1000F4CD4 /* extrusion-screw.c in Sources */ = {isa = PBXBuildFile; fileRef = AF64240D099FFAF0000F4CD4 /* extrusion-screw.c */; };
+ AF642417099FFAF1000F4CD4 /* extrusion-taper.c in Sources */ = {isa = PBXBuildFile; fileRef = AF64240E099FFAF0000F4CD4 /* extrusion-taper.c */; };
+ AF642418099FFAF1000F4CD4 /* extrusion-twistoid.c in Sources */ = {isa = PBXBuildFile; fileRef = AF64240F099FFAF1000F4CD4 /* extrusion-twistoid.c */; };
+ AF642419099FFAF1000F4CD4 /* extrusion.c in Sources */ = {isa = PBXBuildFile; fileRef = AF642410099FFAF1000F4CD4 /* extrusion.c */; };
+ AF6425D209A18855000F4CD4 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF6425DE09A188D7000F4CD4 /* hypercube.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258C70988A468000655EE /* hypercube.xml */; };
+ AF6425E009A188FB000F4CD4 /* hypercube.c in Sources */ = {isa = PBXBuildFile; fileRef = AF6425DF09A188FB000F4CD4 /* hypercube.c */; };
+ AF6425F209A189EC000F4CD4 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF6425FE09A18A77000F4CD4 /* qix.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258FF0988A469000655EE /* qix.xml */; };
+ AF64260009A18A94000F4CD4 /* qix.c in Sources */ = {isa = PBXBuildFile; fileRef = AF6425FF09A18A94000F4CD4 /* qix.c */; };
+ AF64261509A18D6C000F4CD4 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF64262109A18DFF000F4CD4 /* hyperball.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258C60988A468000655EE /* hyperball.xml */; };
+ AF64262309A18E1E000F4CD4 /* hyperball.c in Sources */ = {isa = PBXBuildFile; fileRef = AF64262209A18E1E000F4CD4 /* hyperball.c */; };
+ AF64263209A18F54000F4CD4 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF64263E09A18FCE000F4CD4 /* moire2.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258E60988A469000655EE /* moire2.xml */; };
+ AF64264009A18FEB000F4CD4 /* moire2.c in Sources */ = {isa = PBXBuildFile; fileRef = AF64263F09A18FEB000F4CD4 /* moire2.c */; };
+ AF64265509A19229000F4CD4 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF64266109A1929A000F4CD4 /* munch.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258EA0988A469000655EE /* munch.xml */; };
+ AF64266309A192C5000F4CD4 /* munch.c in Sources */ = {isa = PBXBuildFile; fileRef = AF64266209A192C5000F4CD4 /* munch.c */; };
+ AF64268109A194B0000F4CD4 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF64268D09A19525000F4CD4 /* goop.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258BF0988A468000655EE /* goop.xml */; };
+ AF64268F09A19542000F4CD4 /* goop.c in Sources */ = {isa = PBXBuildFile; fileRef = AF64268E09A19542000F4CD4 /* goop.c */; };
+ AF64277709A1D37A000F4CD4 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF64278309A1D418000F4CD4 /* speedmine.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259100988A469000655EE /* speedmine.xml */; };
+ AF64278809A1D433000F4CD4 /* speedmine.c in Sources */ = {isa = PBXBuildFile; fileRef = AF64278709A1D433000F4CD4 /* speedmine.c */; };
+ AF6427AE09A2DE36000F4CD4 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF6427BA09A2DF09000F4CD4 /* bubbles.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258800988A468000655EE /* bubbles.xml */; };
+ AF6427BE09A2DF47000F4CD4 /* bubbles-default.c in Sources */ = {isa = PBXBuildFile; fileRef = AF6427BB09A2DF47000F4CD4 /* bubbles-default.c */; };
+ AF6427BF09A2DF47000F4CD4 /* bubbles.c in Sources */ = {isa = PBXBuildFile; fileRef = AF6427BC09A2DF47000F4CD4 /* bubbles.c */; };
+ AF68A48519196CF800D41CD1 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF68A48719196CF800D41CD1 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF68A48819196CF800D41CD1 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF68A48919196CF800D41CD1 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF68A48A19196CF800D41CD1 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF68A48B19196CF800D41CD1 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF68A48C19196CF800D41CD1 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF68A49719196E3E00D41CD1 /* tessellimage.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF68A49419196E3E00D41CD1 /* tessellimage.xml */; };
+ AF68A49819196E3E00D41CD1 /* tessellimage.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF68A49419196E3E00D41CD1 /* tessellimage.xml */; };
+ AF68A49919196E3E00D41CD1 /* tessellimage.c in Sources */ = {isa = PBXBuildFile; fileRef = AF68A49519196E3E00D41CD1 /* tessellimage.c */; };
+ AF68A49A19196E3E00D41CD1 /* tessellimage.c in Sources */ = {isa = PBXBuildFile; fileRef = AF68A49519196E3E00D41CD1 /* tessellimage.c */; };
+ AF68A49B19196E3E00D41CD1 /* delaunay.c in Sources */ = {isa = PBXBuildFile; fileRef = AF68A49619196E3E00D41CD1 /* delaunay.c */; };
+ AF68A49C19196E3E00D41CD1 /* delaunay.c in Sources */ = {isa = PBXBuildFile; fileRef = AF68A49619196E3E00D41CD1 /* delaunay.c */; };
+ AF69640B0E4FE3470085DBCE /* teapot.c in Sources */ = {isa = PBXBuildFile; fileRef = AFC211930E4E30C800D87B6E /* teapot.c */; };
+ AF73FF211A08AB9400E485E9 /* iSaverRunner57t.png in Resources */ = {isa = PBXBuildFile; fileRef = AF73FF201A08AB9400E485E9 /* iSaverRunner57t.png */; };
+ AF73FF291A09877F00E485E9 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF73FF2B1A09877F00E485E9 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF73FF2C1A09877F00E485E9 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF73FF2D1A09877F00E485E9 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF73FF2E1A09877F00E485E9 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF73FF2F1A09877F00E485E9 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF73FF301A09877F00E485E9 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF73FF391A09889700E485E9 /* binaryring.c in Sources */ = {isa = PBXBuildFile; fileRef = AF73FF381A09889700E485E9 /* binaryring.c */; };
+ AF73FF3A1A09889700E485E9 /* binaryring.c in Sources */ = {isa = PBXBuildFile; fileRef = AF73FF381A09889700E485E9 /* binaryring.c */; };
+ AF73FF3C1A0988C500E485E9 /* binaryring.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF73FF3B1A0988C500E485E9 /* binaryring.xml */; };
+ AF73FF3D1A0988C500E485E9 /* binaryring.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF73FF3B1A0988C500E485E9 /* binaryring.xml */; };
+ AF7511051782B5B900380EA1 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF7511081782B5B900380EA1 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF7511091782B5B900380EA1 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF75110A1782B5B900380EA1 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF75110B1782B5B900380EA1 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF75110C1782B5B900380EA1 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF7511151782B64300380EA1 /* kaleidocycle.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7511141782B64300380EA1 /* kaleidocycle.c */; };
+ AF7776EA09B63ABF00EA3033 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF77770209B63B3900EA3033 /* phosphor.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258F30988A469000655EE /* phosphor.xml */; };
+ AF77770409B63B5F00EA3033 /* phosphor.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77770309B63B5F00EA3033 /* phosphor.c */; };
+ AF77772009B6416100EA3033 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF77772C09B641C800EA3033 /* pacman.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258EE0988A469000655EE /* pacman.xml */; };
+ AF77772D09B641D300EA3033 /* pacman.c in Sources */ = {isa = PBXBuildFile; fileRef = AF795015099751940059A8B0 /* pacman.c */; };
+ AF77772E09B641D400EA3033 /* pacman_ai.c in Sources */ = {isa = PBXBuildFile; fileRef = AF795011099751940059A8B0 /* pacman_ai.c */; };
+ AF77772F09B641D600EA3033 /* pacman_level.c in Sources */ = {isa = PBXBuildFile; fileRef = AF795013099751940059A8B0 /* pacman_level.c */; };
+ AF77774509B6446500EA3033 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF77775309B644E300EA3033 /* flipscreen3d.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258A80988A468000655EE /* flipscreen3d.xml */; };
+ AF77775509B644FF00EA3033 /* flipscreen3d.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77775409B644FF00EA3033 /* flipscreen3d.c */; };
+ AF77777A09B6497800EA3033 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF77778A09B64A0D00EA3033 /* gleidescope.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258B50988A468000655EE /* gleidescope.xml */; };
+ AF77778C09B64A2A00EA3033 /* gleidescope.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77778B09B64A2A00EA3033 /* gleidescope.c */; };
+ AF77779409B64A5200EA3033 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF7777A409B64AE200EA3033 /* mirrorblob.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258E20988A469000655EE /* mirrorblob.xml */; };
+ AF7777A609B64AFC00EA3033 /* mirrorblob.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7777A509B64AFC00EA3033 /* mirrorblob.c */; };
+ AF7777AE09B64B2600EA3033 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF7777BE09B64BAC00EA3033 /* stonerview.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2591C0988A469000655EE /* stonerview.xml */; };
+ AF7777C609B64BD400EA3033 /* stonerview-move.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7777BF09B64BD400EA3033 /* stonerview-move.c */; };
+ AF7777C709B64BD400EA3033 /* stonerview-osc.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7777C109B64BD400EA3033 /* stonerview-osc.c */; };
+ AF7777C809B64BD400EA3033 /* stonerview-view.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7777C309B64BD400EA3033 /* stonerview-view.c */; };
+ AF7777C909B64BD400EA3033 /* stonerview.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7777C409B64BD400EA3033 /* stonerview.c */; };
+ AF7777D609B64C6B00EA3033 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF7777E609B64CD800EA3033 /* glslideshow.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258BB0988A468000655EE /* glslideshow.xml */; };
+ AF7777E809B64CF700EA3033 /* glslideshow.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7777E709B64CF700EA3033 /* glslideshow.c */; };
+ AF7777F009B64E3100EA3033 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF77780009B64EA800EA3033 /* fliptext.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258A90988A468000655EE /* fliptext.xml */; };
+ AF77780209B64EC000EA3033 /* fliptext.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77780109B64EC000EA3033 /* fliptext.c */; };
+ AF77781609B6504400EA3033 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF77782709B650D200EA3033 /* starwars.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2591B0988A469000655EE /* starwars.xml */; };
+ AF77782A09B650FF00EA3033 /* starwars.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77782809B650FF00EA3033 /* starwars.c */; };
+ AF77783409B6516900EA3033 /* grab-ximage.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5607909936FDD00F3E977 /* grab-ximage.c */; };
+ AF77783709B6518400EA3033 /* texfont.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77780809B64F4900EA3033 /* texfont.c */; };
+ AF77783A09B651AF00EA3033 /* glut_stroke.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD56E0B0996A0ED00BA26F7 /* glut_stroke.c */; };
+ AF77783D09B651C700EA3033 /* glut_swidth.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD56E0C0996A0ED00BA26F7 /* glut_swidth.c */; };
+ AF77784B09B6528100EA3033 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF77786709B6536000EA3033 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF77787709B653DC00EA3033 /* dnalogo.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77787609B653DC00EA3033 /* dnalogo.c */; };
+ AF77787A09B6545E00EA3033 /* dnalogo.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF77787909B6545E00EA3033 /* dnalogo.xml */; };
+ AF77787C09B654F800EA3033 /* carousel.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77785E09B6530E00EA3033 /* carousel.c */; };
+ AF77787D09B654FE00EA3033 /* carousel.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258830988A468000655EE /* carousel.xml */; };
+ AF77788509B6563500EA3033 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF77789109B656A900EA3033 /* fontglide.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258AE0988A468000655EE /* fontglide.xml */; };
+ AF77789309B656C300EA3033 /* fontglide.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77789209B656C300EA3033 /* fontglide.c */; };
+ AF7778AB09B659C800EA3033 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF7778B909B65A6E00EA3033 /* blitspin.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258760988A468000655EE /* blitspin.xml */; };
+ AF7778BB09B65A8A00EA3033 /* blitspin.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7778BA09B65A8A00EA3033 /* blitspin.c */; };
+ AF78369717DB9F25003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78369817DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78369917DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78369A17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78369B17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78369C17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78369D17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78369E17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78369F17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836A017DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836A117DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836A217DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836A317DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836A417DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836A517DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836A617DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836A717DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836A817DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836A917DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836AA17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836AB17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836AC17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836AD17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836AE17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836AF17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836B017DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836B117DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836B217DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836B317DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836B417DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836B517DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836B617DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836B717DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836B817DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836B917DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836BA17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836BB17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836BC17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836BD17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836BE17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836BF17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836C017DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836C117DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836C217DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836C317DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836C417DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836C517DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836C617DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836C717DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836C817DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836C917DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836CA17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836CB17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836CC17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836CD17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836CE17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836CF17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836D117DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836D217DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836D317DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836D417DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836D517DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836D617DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836D717DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836D817DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836D917DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836DA17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836DB17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836DC17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836DD17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836DE17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836DF17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836E017DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836E117DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836E217DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836E317DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836E417DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836E517DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836E617DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836E717DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836E817DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836E917DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836EA17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836EB17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836EC17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836ED17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836EE17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836EF17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836F017DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836F117DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836F217DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836F317DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836F417DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836F517DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836F617DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836F717DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836F817DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836F917DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836FA17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836FB17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836FC17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836FD17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836FE17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7836FF17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78370017DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78370117DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78370217DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78370317DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78370417DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78370517DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78370617DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78370717DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78370817DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78370917DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78370A17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78370B17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78370C17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78370D17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78370E17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78370F17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78371017DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78371117DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78371217DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78371317DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78371417DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78371517DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78371617DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78371717DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78371817DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78371917DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78371A17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78371B17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78371C17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78371D17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78371E17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78371F17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78372017DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78372117DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78372217DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78372317DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78372417DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78372517DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78372617DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78372717DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78372817DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78372917DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78372A17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78372B17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78372C17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78372D17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78372E17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78372F17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78373017DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78373117DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78373217DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78373317DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78373417DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78373517DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78373617DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78373717DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78373817DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78373917DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78373A17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78373B17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78373C17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78373D17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78373E17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78373F17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78374017DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78374117DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78374217DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78374317DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78374417DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78374517DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78374617DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78374717DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78374817DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78374917DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78374A17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78374B17DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78374C17DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78374D17DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78374E17DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78374F17DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78375017DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78375117DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78375217DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78375317DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78375417DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78375517DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78375617DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78375717DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78375817DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78375917DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78375A17DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78375B17DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78375C17DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78375D17DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78375E17DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78375F17DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78376017DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78376117DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78376217DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78376317DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78376417DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78376517DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78376617DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78376717DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78376817DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78376917DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78376A17DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78376B17DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78376C17DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78376D17DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78376E17DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78376F17DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78377017DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78377117DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78377217DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78377317DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78377417DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78377517DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78377617DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78377717DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78377817DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78377917DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78377A17DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78377B17DBA581003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF78D179142DD8F3002AAF77 /* voronoi.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF0DCA610C4CBB8E00D76972 /* voronoi.xml */; };
+ AF78D17B142DD8F3002AAF77 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF78D18D142DD96E002AAF77 /* hilbert.c in Sources */ = {isa = PBXBuildFile; fileRef = AF78D18A142DD96E002AAF77 /* hilbert.c */; };
+ AF78D191142DD99B002AAF77 /* hilbert.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF78D18E142DD99A002AAF77 /* hilbert.xml */; };
+ AF794F6A099748450059A8B0 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF794F7D0997486C0059A8B0 /* demon.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258960988A468000655EE /* demon.xml */; };
+ AF794F7F099748860059A8B0 /* demon.c in Sources */ = {isa = PBXBuildFile; fileRef = AF794F7E099748860059A8B0 /* demon.c */; };
+ AF794F9409974A320059A8B0 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF794FA809974AC60059A8B0 /* fiberlamp.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258A20988A468000655EE /* fiberlamp.xml */; };
+ AF794FAA09974AE30059A8B0 /* fiberlamp.c in Sources */ = {isa = PBXBuildFile; fileRef = AF794FA909974AE30059A8B0 /* fiberlamp.c */; };
+ AF794FD309974FA60059A8B0 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF794FDF09974FD10059A8B0 /* loop.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258DD0988A468000655EE /* loop.xml */; };
+ AF794FE109974FEC0059A8B0 /* loop.c in Sources */ = {isa = PBXBuildFile; fileRef = AF794FE009974FEC0059A8B0 /* loop.c */; };
+ AF7ACFC719FF0A9200BD752B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF7ACFC919FF0A9200BD752B /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF7ACFCA19FF0A9200BD752B /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AF7ACFCB19FF0A9200BD752B /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AF7ACFCC19FF0A9200BD752B /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF7ACFCD19FF0A9200BD752B /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF7ACFCE19FF0A9200BD752B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AF7ACFD719FF0B7A00BD752B /* geodesicgears.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7ACFD619FF0B7A00BD752B /* geodesicgears.c */; };
+ AF7ACFD919FF0BA600BD752B /* geodesicgears.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF7ACFD819FF0BA600BD752B /* geodesicgears.xml */; };
+ AF7ACFDA19FF0BA600BD752B /* geodesicgears.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF7ACFD819FF0BA600BD752B /* geodesicgears.xml */; };
+ AF7F54A417DC249500CE1158 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78377C17DBA85D003B9FC0 /* libz.dylib */; };
+ AF84AF2015829AF000607E4C /* SaverListController.m in Sources */ = {isa = PBXBuildFile; fileRef = AF84AF1E15829AF000607E4C /* SaverListController.m */; };
+ AF84FD4209B1209E00F3AB06 /* GLUT.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF84FD4109B1209E00F3AB06 /* GLUT.framework */; };
+ AF918983158FC00A002B5D1E /* iSaverRunner.xib in Resources */ = {isa = PBXBuildFile; fileRef = AF56019B157DAA3D00DB2055 /* iSaverRunner.xib */; };
+ AF918986158FC00A002B5D1E /* SaverRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD400981E32E00F7970E /* SaverRunner.m */; };
+ AF918987158FC00A002B5D1E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
+ AF918988158FC00A002B5D1E /* SaverListController.m in Sources */ = {isa = PBXBuildFile; fileRef = AF84AF1E15829AF000607E4C /* SaverListController.m */; };
+ AF918993158FC2BE002B5D1E /* abstractile.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE6A4340CDD800F002805BF /* abstractile.c */; };
+ AF918994158FC2BE002B5D1E /* anemone.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477231099D4FD5001F091E /* anemone.c */; };
+ AF918995158FC2E0002B5D1E /* analogtv.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4CFA09B5AC94006E59CF /* analogtv.c */; };
+ AF918996158FC310002B5D1E /* anemotaxis.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4773D4099D6817001F091E /* anemotaxis.c */; };
+ AF918997158FC310002B5D1E /* apple2-main.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4E0509B5BC9D006E59CF /* apple2-main.c */; };
+ AF918998158FC310002B5D1E /* apple2.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4DD309B5B990006E59CF /* apple2.c */; };
+ AF918999158FC310002B5D1E /* asm6502.c in Sources */ = {isa = PBXBuildFile; fileRef = AF0DCA320C4C74A200D76972 /* asm6502.c */; };
+ AF91899A158FC310002B5D1E /* attraction.c in Sources */ = {isa = PBXBuildFile; fileRef = AF976DFA09896BEB001F8B92 /* attraction.c */; };
+ AF91899B158FC310002B5D1E /* barcode.c in Sources */ = {isa = PBXBuildFile; fileRef = AF975A99099C6C3500B05160 /* barcode.c */; };
+ AF91899C158FC310002B5D1E /* blaster.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4776A2099DAADE001F091E /* blaster.c */; };
+ AF91899D158FC310002B5D1E /* blitspin.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7778BA09B65A8A00EA3033 /* blitspin.c */; };
+ AF91899E158FC310002B5D1E /* boxfit.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4778A3099DDA91001F091E /* boxfit.c */; };
+ AF91899F158FC310002B5D1E /* bsod.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4DC309B5B87D006E59CF /* bsod.c */; };
+ AF9189A0158FC310002B5D1E /* bubbles-default.c in Sources */ = {isa = PBXBuildFile; fileRef = AF6427BB09A2DF47000F4CD4 /* bubbles-default.c */; };
+ AF9189A2158FC310002B5D1E /* bumps.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D48EE09B533AE006E59CF /* bumps.c */; };
+ AF9189A3158FC310002B5D1E /* ccurve.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4771EF099D4DFE001F091E /* ccurve.c */; };
+ AF9189A4158FC310002B5D1E /* celtic.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477787099DBA29001F091E /* celtic.c */; };
+ AF9189A5158FC310002B5D1E /* cloudlife.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477720099DB01C001F091E /* cloudlife.c */; };
+ AF9189A6158FC310002B5D1E /* companion.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3581D91431D5FC00E09C51 /* companion.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF9189A7158FC311002B5D1E /* companion_disc.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3581D61431D5FC00E09C51 /* companion_disc.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF9189A8158FC311002B5D1E /* companion_heart.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3581D71431D5FC00E09C51 /* companion_heart.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF9189A9158FC311002B5D1E /* companion_quad.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3581D81431D5FC00E09C51 /* companion_quad.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF9189AA158FC311002B5D1E /* compass.c in Sources */ = {isa = PBXBuildFile; fileRef = AF47717C099D47D3001F091E /* compass.c */; };
+ AF9189AB158FC311002B5D1E /* coral.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4775EF099D9FFF001F091E /* coral.c */; };
+ AF9189AD158FC311002B5D1E /* cwaves.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF463490C44044E00EE6509 /* cwaves.c */; };
+ AF9189AE158FC311002B5D1E /* cynosure.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4778FB099DDE79001F091E /* cynosure.c */; };
+ AF9189AF158FC311002B5D1E /* decayscreen.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D467809B5110B006E59CF /* decayscreen.c */; };
+ AF9189B0158FC311002B5D1E /* deco.c in Sources */ = {isa = PBXBuildFile; fileRef = AFC25B5E0988BA63000655EE /* deco.c */; };
+ AF9189B1158FC311002B5D1E /* deluxe.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477145099D43E2001F091E /* deluxe.c */; };
+ AF9189B2158FC311002B5D1E /* distort.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D490709B536F7006E59CF /* distort.c */; };
+ AF9189B3158FC311002B5D1E /* epicycle.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477605099DA097001F091E /* epicycle.c */; };
+ AF9189B4158FC311002B5D1E /* eruption.c in Sources */ = {isa = PBXBuildFile; fileRef = AF975A83099C6B4900B05160 /* eruption.c */; };
+ AF9189B5158FC311002B5D1E /* fireworkx.c in Sources */ = {isa = PBXBuildFile; fileRef = AF975AEE099C6F1700B05160 /* fireworkx.c */; };
+ AF9189B6158FC334002B5D1E /* flame.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477496099D8A53001F091E /* flame.c */; };
+ AF9189B7158FC334002B5D1E /* fluidballs.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4777A4099DBB11001F091E /* fluidballs.c */; };
+ AF9189B8158FC334002B5D1E /* fontglide.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77789209B656C300EA3033 /* fontglide.c */; };
+ AF9189B9158FC334002B5D1E /* fps.c in Sources */ = {isa = PBXBuildFile; fileRef = AFBF893C0E41D930006A2D66 /* fps.c */; };
+ AF9189BA158FC334002B5D1E /* fuzzyflakes.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4773B4099D6778001F091E /* fuzzyflakes.c */; };
+ AF9189BB158FC334002B5D1E /* goop.c in Sources */ = {isa = PBXBuildFile; fileRef = AF64268E09A19542000F4CD4 /* goop.c */; };
+ AF9189BC158FC334002B5D1E /* greynetic.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480C21098E28EF00FB32B8 /* greynetic.c */; };
+ AF9189BD158FC334002B5D1E /* halftone.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477266099D5768001F091E /* halftone.c */; };
+ AF9189BE158FC334002B5D1E /* halo.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480C29098E295D00FB32B8 /* halo.c */; };
+ AF9189BF158FC334002B5D1E /* helix.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480C2F098E2A6700FB32B8 /* helix.c */; };
+ AF9189C2158FC334002B5D1E /* ifs.c in Sources */ = {isa = PBXBuildFile; fileRef = AF47743A099D7CEA001F091E /* ifs.c */; };
+ AF9189C3158FC334002B5D1E /* imsmap.c in Sources */ = {isa = PBXBuildFile; fileRef = AF975740099C31DD00B05160 /* imsmap.c */; };
+ AF9189C4158FC334002B5D1E /* interaggregate.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477769099DB710001F091E /* interaggregate.c */; };
+ AF9189C5158FC334002B5D1E /* interference.c in Sources */ = {isa = PBXBuildFile; fileRef = AF476FD0099D15AA001F091E /* interference.c */; };
+ AF9189C6158FC334002B5D1E /* intermomentary.c in Sources */ = {isa = PBXBuildFile; fileRef = AF47741C099D6A6C001F091E /* intermomentary.c */; };
+ AF9189C7158FC334002B5D1E /* kaleidescope.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4774AC099D8B08001F091E /* kaleidescope.c */; };
+ AF9189C8158FC334002B5D1E /* kumppa.c in Sources */ = {isa = PBXBuildFile; fileRef = AF47762A099DA2E9001F091E /* kumppa.c */; };
+ AF9189CB158FC334002B5D1E /* m6502.c in Sources */ = {isa = PBXBuildFile; fileRef = AF0DCA340C4C74A200D76972 /* m6502.c */; };
+ AF9189CC158FC334002B5D1E /* maze.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4774E1099D8C8B001F091E /* maze.c */; };
+ AF9189CD158FC334002B5D1E /* memscroller.c in Sources */ = {isa = PBXBuildFile; fileRef = AF975B14099C709E00B05160 /* memscroller.c */; };
+ AF9189CE158FC334002B5D1E /* metaballs.c in Sources */ = {isa = PBXBuildFile; fileRef = AF975A49099C689F00B05160 /* metaballs.c */; };
+ AF9189CF158FC334002B5D1E /* moire.c in Sources */ = {isa = PBXBuildFile; fileRef = AF975789099C37A500B05160 /* moire.c */; };
+ AF9189D0158FC334002B5D1E /* moire2.c in Sources */ = {isa = PBXBuildFile; fileRef = AF64263F09A18FEB000F4CD4 /* moire2.c */; };
+ AF9189D1158FC334002B5D1E /* munch.c in Sources */ = {isa = PBXBuildFile; fileRef = AF64266209A192C5000F4CD4 /* munch.c */; };
+ AF9189D2158FC334002B5D1E /* nerverot.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477205099D4EB6001F091E /* nerverot.c */; };
+ AF9189D3158FC334002B5D1E /* noseguy.c in Sources */ = {isa = PBXBuildFile; fileRef = AF975C76099C8FC700B05160 /* noseguy.c */; };
+ AF9189D4158FC334002B5D1E /* pedal.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477570099D9A8A001F091E /* pedal.c */; };
+ AF9189D5158FC334002B5D1E /* penetrate.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4778BE099DDC32001F091E /* penetrate.c */; };
+ AF9189D6158FC334002B5D1E /* petri.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477683099DA8C7001F091E /* petri.c */; };
+ AF9189D7158FC334002B5D1E /* phosphor.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77770309B63B5F00EA3033 /* phosphor.c */; };
+ AF9189D8158FC334002B5D1E /* piecewise.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477297099D5980001F091E /* piecewise.c */; };
+ AF9189D9158FC334002B5D1E /* pong.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4CFC09B5AC94006E59CF /* pong.c */; };
+ AF9189DA158FC334002B5D1E /* popsquares.c in Sources */ = {isa = PBXBuildFile; fileRef = AF47727E099D5808001F091E /* popsquares.c */; };
+ AF9189DB158FC334002B5D1E /* pyro.c in Sources */ = {isa = PBXBuildFile; fileRef = AF47759C099D9CA3001F091E /* pyro.c */; };
+ AF9189DC158FC334002B5D1E /* qix.c in Sources */ = {isa = PBXBuildFile; fileRef = AF6425FF09A18A94000F4CD4 /* qix.c */; };
+ AF9189DD158FC334002B5D1E /* rd-bomb.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9757D5099C3EB800B05160 /* rd-bomb.c */; };
+ AF9189DE158FC334002B5D1E /* ripples.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D493E09B53D55006E59CF /* ripples.c */; };
+ AF9189DF158FC35D002B5D1E /* rocks.c in Sources */ = {isa = PBXBuildFile; fileRef = AF975D66099CA16A00B05160 /* rocks.c */; };
+ AF9189E0158FC35D002B5D1E /* rorschach.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD620981E40800F7970E /* rorschach.c */; };
+ AF9189E1158FC35D002B5D1E /* rotzoomer.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D496709B540A4006E59CF /* rotzoomer.c */; };
+ AF9189E2158FC35D002B5D1E /* shadebobs.c in Sources */ = {isa = PBXBuildFile; fileRef = AF97587A099C492000B05160 /* shadebobs.c */; };
+ AF9189E3158FC35D002B5D1E /* slidescreen.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D475809B53091006E59CF /* slidescreen.c */; };
+ AF9189E4158FC35D002B5D1E /* speedmine.c in Sources */ = {isa = PBXBuildFile; fileRef = AF64278709A1D433000F4CD4 /* speedmine.c */; };
+ AF9189E5158FC35D002B5D1E /* spotlight.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D49AA09B54596006E59CF /* spotlight.c */; };
+ AF9189E6158FC35D002B5D1E /* squiral.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477657099DA75D001F091E /* squiral.c */; };
+ AF9189E7158FC35D002B5D1E /* starfish.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4775B3099D9D67001F091E /* starfish.c */; };
+ AF9189E8158FC35D002B5D1E /* substrate.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477736099DB104001F091E /* substrate.c */; };
+ AF9189EA158FC35D002B5D1E /* tronbit.c in Sources */ = {isa = PBXBuildFile; fileRef = AF35821B1433314C00E09C51 /* tronbit.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF9189EB158FC35D002B5D1E /* tronbit_idle1.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3582171433314C00E09C51 /* tronbit_idle1.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF9189EC158FC35D002B5D1E /* tronbit_idle2.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3582181433314C00E09C51 /* tronbit_idle2.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF9189ED158FC35D002B5D1E /* tronbit_no.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3582191433314C00E09C51 /* tronbit_no.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF9189EE158FC35D002B5D1E /* tronbit_yes.c in Sources */ = {isa = PBXBuildFile; fileRef = AF35821A1433314C00E09C51 /* tronbit_yes.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF9189EF158FC35D002B5D1E /* truchet.c in Sources */ = {isa = PBXBuildFile; fileRef = AF476FF0099D1713001F091E /* truchet.c */; };
+ AF9189F0158FC35D002B5D1E /* twang.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D497F09B541E5006E59CF /* twang.c */; };
+ AF9189F1158FC35D002B5D1E /* vermiculate.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477704099DAF3F001F091E /* vermiculate.c */; };
+ AF9189F2158FC35D002B5D1E /* wander.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477192099D4864001F091E /* wander.c */; };
+ AF9189F3158FC35E002B5D1E /* whirlwindwarp.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4776EE099DAE58001F091E /* whirlwindwarp.c */; };
+ AF9189F5158FC35E002B5D1E /* wormhole.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477395099D65FE001F091E /* wormhole.c */; };
+ AF9189F6158FC35E002B5D1E /* xanalogtv.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4D9209B5B444006E59CF /* xanalogtv.c */; };
+ AF9189F7158FC35E002B5D1E /* xflame.c in Sources */ = {isa = PBXBuildFile; fileRef = AF97582F099C427500B05160 /* xflame.c */; };
+ AF9189F8158FC35E002B5D1E /* xjack.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4778DA099DDD2B001F091E /* xjack.c */; };
+ AF9189F9158FC35E002B5D1E /* xlyap.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4C7C09B5A044006E59CF /* xlyap.c */; };
+ AF9189FA158FC35E002B5D1E /* xmatrix.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477455099D7D8A001F091E /* xmatrix.c */; };
+ AF9189FB158FC35E002B5D1E /* xrayswarm.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4776D3099DACEB001F091E /* xrayswarm.c */; };
+ AF9189FC158FC35E002B5D1E /* xspirograph.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4776BD099DAC46001F091E /* xspirograph.c */; };
+ AF9189FD158FC35E002B5D1E /* zoom.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D48D409B53229006E59CF /* zoom.c */; };
+ AF9189FF158FC38A002B5D1E /* apollonian.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD5713F0996BFBE00BA26F7 /* apollonian.c */; };
+ AF918A00158FC38A002B5D1E /* bouboule.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD572B90996FB3D00BA26F7 /* bouboule.c */; };
+ AF918A01158FC38A002B5D1E /* braid.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD56EC10996A76F00BA26F7 /* braid.c */; };
+ AF918A02158FC38A002B5D1E /* crystal.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD572ED0997006E00BA26F7 /* crystal.c */; };
+ AF918A03158FC38A002B5D1E /* demon.c in Sources */ = {isa = PBXBuildFile; fileRef = AF794F7E099748860059A8B0 /* demon.c */; };
+ AF918A04158FC38A002B5D1E /* discrete.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD571280996BEF700BA26F7 /* discrete.c */; };
+ AF918A05158FC38A002B5D1E /* drift.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480C82098E336D00FB32B8 /* drift.c */; };
+ AF918A06158FC38A002B5D1E /* euler2d.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD571560996C07F00BA26F7 /* euler2d.c */; };
+ AF918A07158FC38A002B5D1E /* fadeplot.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD5706C0996B70000BA26F7 /* fadeplot.c */; };
+ AF918A08158FC38A002B5D1E /* fiberlamp.c in Sources */ = {isa = PBXBuildFile; fileRef = AF794FA909974AE30059A8B0 /* fiberlamp.c */; };
+ AF918A0A158FC38A002B5D1E /* flow.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD571010996BC3800BA26F7 /* flow.c */; };
+ AF918A0C158FC38A002B5D1E /* galaxy.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD56F360996ABD200BA26F7 /* galaxy.c */; };
+ AF918A0D158FC38A002B5D1E /* grav.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD56F620996AF2D00BA26F7 /* grav.c */; };
+ AF918A0E158FC38A002B5D1E /* hopalong.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD56F880996B06600BA26F7 /* hopalong.c */; };
+ AF918A11158FC38A002B5D1E /* julia.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD5730C099702C800BA26F7 /* julia.c */; };
+ AF918A16158FC38A002B5D1E /* loop.c in Sources */ = {isa = PBXBuildFile; fileRef = AF794FE009974FEC0059A8B0 /* loop.c */; };
+ AF918A17158FC38A002B5D1E /* mountain.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD570820996B79300BA26F7 /* mountain.c */; };
+ AF918A18158FC38A002B5D1E /* pacman.c in Sources */ = {isa = PBXBuildFile; fileRef = AF795015099751940059A8B0 /* pacman.c */; };
+ AF918A19158FC38A002B5D1E /* pacman_ai.c in Sources */ = {isa = PBXBuildFile; fileRef = AF795011099751940059A8B0 /* pacman_ai.c */; };
+ AF918A1A158FC38A002B5D1E /* pacman_level.c in Sources */ = {isa = PBXBuildFile; fileRef = AF795013099751940059A8B0 /* pacman_level.c */; };
+ AF918A1B158FC38A002B5D1E /* penrose.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD5700C0996B49D00BA26F7 /* penrose.c */; };
+ AF918A1C158FC38A002B5D1E /* polyominoes.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD572800996EF2B00BA26F7 /* polyominoes.c */; };
+ AF918A1E158FC38A002B5D1E /* sierpinski.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD570220996B52700BA26F7 /* sierpinski.c */; };
+ AF918A1F158FC38A002B5D1E /* slip.c in Sources */ = {isa = PBXBuildFile; fileRef = AF47793D099DE56A001F091E /* slip.c */; };
+ AF918A22158FC38A002B5D1E /* strange.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD57371099741A200BA26F7 /* strange.c */; };
+ AF918A23158FC38A002B5D1E /* swirl.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD572350996E53E00BA26F7 /* swirl.c */; };
+ AF918A24158FC38A002B5D1E /* thornbird.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD5716B0996C16700BA26F7 /* thornbird.c */; };
+ AF918A25158FC38A002B5D1E /* triangle.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD570980996B86200BA26F7 /* triangle.c */; };
+ AF918A28158FC3BB002B5D1E /* antinspect.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5605F09936E9C00F3E977 /* antinspect.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A29158FC3BB002B5D1E /* antmaze.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA562EF0993941600F3E977 /* antmaze.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A2A158FC3BB002B5D1E /* antspotlight.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5607809936FDD00F3E977 /* antspotlight.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A2B158FC3BB002B5D1E /* atlantis.c in Sources */ = {isa = PBXBuildFile; fileRef = AF0839A909930C4900277BE9 /* atlantis.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A2C158FC3BB002B5D1E /* atunnel.c in Sources */ = {isa = PBXBuildFile; fileRef = AF083A31099311CE00277BE9 /* atunnel.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A2D158FC3BB002B5D1E /* b_draw.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55AF409933DBF00F3E977 /* b_draw.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A2E158FC3BB002B5D1E /* b_lockglue.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55AF509933DBF00F3E977 /* b_lockglue.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A2F158FC3BB002B5D1E /* b_sphere.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55AF609933DBF00F3E977 /* b_sphere.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A30158FC3BB002B5D1E /* blinkbox.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5616D09937C9A00F3E977 /* blinkbox.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A31158FC3BB002B5D1E /* blocktube.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5602909936D0700F3E977 /* blocktube.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A32158FC3BB002B5D1E /* boing.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA562D40993930C00F3E977 /* boing.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A33158FC3BB002B5D1E /* bouncingcow.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EE70993613E00F3E977 /* bouncingcow.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A34158FC3BB002B5D1E /* boxed.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55CBE09934C0900F3E977 /* boxed.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A35158FC3BB002B5D1E /* bubble3d.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55AE409933D3800F3E977 /* bubble3d.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A36158FC3BB002B5D1E /* buildlwo.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4812760990CF5D00FB32B8 /* buildlwo.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A37158FC3BB002B5D1E /* cage.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5595D0993310500F3E977 /* cage.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A38158FC3BB002B5D1E /* carousel.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77785E09B6530E00EA3033 /* carousel.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A39158FC3BB002B5D1E /* chessmodels.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55E2309935F2B00F3E977 /* chessmodels.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A3A158FC3BB002B5D1E /* circuit.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55BC00993416E00F3E977 /* circuit.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A3B158FC3BB002B5D1E /* cow_face.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EE80993613E00F3E977 /* cow_face.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A3C158FC3BB002B5D1E /* cow_hide.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EE90993613E00F3E977 /* cow_hide.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A3D158FC3BB002B5D1E /* cow_hoofs.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EEA0993613E00F3E977 /* cow_hoofs.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A3E158FC3BB002B5D1E /* cow_horns.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EEB0993613E00F3E977 /* cow_horns.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A3F158FC3BB002B5D1E /* cow_tail.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EEC0993613E00F3E977 /* cow_tail.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A40158FC3BB002B5D1E /* cow_udder.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EED0993613E00F3E977 /* cow_udder.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A41158FC3BB002B5D1E /* crackberg.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA563290993957100F3E977 /* crackberg.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A42158FC3BB002B5D1E /* cube21.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA563660993970F00F3E977 /* cube21.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A43158FC3BB002B5D1E /* cubenetic.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55D770993589300F3E977 /* cubenetic.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A44158FC3BB002B5D1E /* cubestorm.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55FF309936C4500F3E977 /* cubestorm.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A45158FC3BB002B5D1E /* cubicgrid.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4FF4D00D52CC8400666F98 /* cubicgrid.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A46158FC3BB002B5D1E /* dangerball.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480DD1098F4F6200FB32B8 /* dangerball.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A48158FC3BB002B5D1E /* dolphin.c in Sources */ = {isa = PBXBuildFile; fileRef = AF0839AA09930C4900277BE9 /* dolphin.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A49158FC3BB002B5D1E /* dropshadow.c in Sources */ = {isa = PBXBuildFile; fileRef = AF241F81107C38DF00046A84 /* dropshadow.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A4A158FC3E5002B5D1E /* endgame.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55E2509935F2B00F3E977 /* endgame.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A4B158FC3E5002B5D1E /* engine.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55C230993435300F3E977 /* engine.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A54158FC3E5002B5D1E /* flipflop.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5604709936DCC00F3E977 /* flipflop.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A55158FC3E5002B5D1E /* flipscreen3d.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77775409B644FF00EA3033 /* flipscreen3d.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A56158FC3E5002B5D1E /* fliptext.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77780109B64EC000EA3033 /* fliptext.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A57158FC3E5002B5D1E /* flyingtoasters.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55E980993608800F3E977 /* flyingtoasters.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A59158FC3E5002B5D1E /* fps-gl.c in Sources */ = {isa = PBXBuildFile; fileRef = AFBF89AE0E423FC3006A2D66 /* fps-gl.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A5A158FC3E5002B5D1E /* gears.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4812250990CB8C00FB32B8 /* gears.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A5B158FC3E5002B5D1E /* gflux.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55BA60993401A00F3E977 /* gflux.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A5C158FC3E5002B5D1E /* glblur.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55E4509935FD300F3E977 /* glblur.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A5D158FC3E5002B5D1E /* glcells.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF463710C440B9200EE6509 /* glcells.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A5E158FC3E5002B5D1E /* gleidescope.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77778B09B64A2A00EA3033 /* gleidescope.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A60158FC3E5002B5D1E /* glhanoi.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA563460993963400F3E977 /* glhanoi.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A61158FC3E5002B5D1E /* glknots.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5600E09936CB300F3E977 /* glknots.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A62158FC3E5002B5D1E /* glmatrix.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55F870993648500F3E977 /* glmatrix.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A63158FC3E5002B5D1E /* glplanet.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55B2109933E4A00F3E977 /* glplanet.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A64158FC3E5002B5D1E /* glschool.c in Sources */ = {isa = PBXBuildFile; fileRef = AF48E1660A0C268500F94CF9 /* glschool.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A65158FC3E5002B5D1E /* glschool_alg.c in Sources */ = {isa = PBXBuildFile; fileRef = AF48E1620A0C268400F94CF9 /* glschool_alg.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A66158FC3E5002B5D1E /* glschool_gl.c in Sources */ = {isa = PBXBuildFile; fileRef = AF48E1640A0C268500F94CF9 /* glschool_gl.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A67158FC3E5002B5D1E /* glslideshow.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7777E709B64CF700EA3033 /* glslideshow.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A68158FC3E5002B5D1E /* glsnake.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55C8C099349EE00F3E977 /* glsnake.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A69158FC3E5002B5D1E /* gltext.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD56E080996A07A00BA26F7 /* gltext.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A6A158FC3E5002B5D1E /* hilbert.c in Sources */ = {isa = PBXBuildFile; fileRef = AF78D18A142DD96E002AAF77 /* hilbert.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A6B158FC3E5002B5D1E /* hypertorus.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55F59099362DF00F3E977 /* hypertorus.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A6C158FC3E5002B5D1E /* hypnowheel.c in Sources */ = {isa = PBXBuildFile; fileRef = AF3C715D0D624C600030CC0D /* hypnowheel.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A6D158FC3E5002B5D1E /* involute.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE6A16A0CDD78EA002805BF /* involute.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A6E158FC417002B5D1E /* jigglypuff.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55F210993620200F3E977 /* jigglypuff.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A6F158FC417002B5D1E /* juggler3d.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA563B90993991300F3E977 /* juggler3d.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A70158FC417002B5D1E /* klein.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55F3F0993626E00F3E977 /* klein.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A71158FC417002B5D1E /* lament.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A8E0993369100F3E977 /* lament.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A72158FC417002B5D1E /* lavalite.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55DDD09935DB600F3E977 /* lavalite.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A74158FC417002B5D1E /* marching.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55DE109935DFB00F3E977 /* marching.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A75158FC417002B5D1E /* menger.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55BF9099342D500F3E977 /* menger.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A76158FC417002B5D1E /* mirrorblob.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7777A509B64AFC00EA3033 /* mirrorblob.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A77158FC417002B5D1E /* moebius.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55982099331C300F3E977 /* moebius.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A78158FC417002B5D1E /* moebiusgears.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE6A40B0CDD7BC3002805BF /* moebiusgears.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A79158FC417002B5D1E /* molecule.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA561120993786800F3E977 /* molecule.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A7A158FC417002B5D1E /* morph3d.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA559CC099332E800F3E977 /* morph3d.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A7B158FC417002B5D1E /* noof.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5619009937D3600F3E977 /* noof.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A7C158FC417002B5D1E /* photopile.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD51DB60F063BCE00471C02 /* photopile.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A7D158FC417002B5D1E /* pinion.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA562340993856A00F3E977 /* pinion.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A7E158FC417002B5D1E /* pipeobjs.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4812780990CF5D00FB32B8 /* pipeobjs.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A7F158FC417002B5D1E /* pipes.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4812790990CF5D00FB32B8 /* pipes.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A82158FC417002B5D1E /* polytopes.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA560C3099371D500F3E977 /* polytopes.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A83158FC417002B5D1E /* providence.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5621C099384F600F3E977 /* providence.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A84158FC417002B5D1E /* pulsar.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55B3F09933EC600F3E977 /* pulsar.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A85158FC417002B5D1E /* queens.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55E0609935EB800F3E977 /* queens.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A86158FC417002B5D1E /* rubik.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA559EA0993335C00F3E977 /* rubik.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A87158FC417002B5D1E /* rubikblocks.c in Sources */ = {isa = PBXBuildFile; fileRef = AF32D9FA0F3AD1200080F535 /* rubikblocks.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A88158FC417002B5D1E /* s1_1.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A400993351F00F3E977 /* s1_1.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A89158FC417002B5D1E /* s1_2.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A410993351F00F3E977 /* s1_2.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A8A158FC417002B5D1E /* s1_3.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A420993351F00F3E977 /* s1_3.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A8B158FC417002B5D1E /* s1_4.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A430993351F00F3E977 /* s1_4.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A8C158FC417002B5D1E /* s1_5.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A440993351F00F3E977 /* s1_5.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A8D158FC417002B5D1E /* s1_6.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A450993351F00F3E977 /* s1_6.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A8E158FC417002B5D1E /* s1_b.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A460993351F00F3E977 /* s1_b.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A8F158FC417002B5D1E /* sballs.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55D510993569C00F3E977 /* sballs.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A90158FC417002B5D1E /* shark.c in Sources */ = {isa = PBXBuildFile; fileRef = AF0839AB09930C4900277BE9 /* shark.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A91158FC417002B5D1E /* sierpinski3d.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55B8E09933FBF00F3E977 /* sierpinski3d.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A92158FC417002B5D1E /* skytentacles.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE2A4720E2E90E300ADB298 /* skytentacles.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A93158FC417002B5D1E /* sonar-icmp.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE30BFF0E52B1DC00CCF4A5 /* sonar-icmp.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A94158FC417002B5D1E /* sonar-sim.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE30C000E52B1DC00CCF4A5 /* sonar-sim.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A95158FC417002B5D1E /* sonar.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE30C010E52B1DC00CCF4A5 /* sonar.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A96158FC417002B5D1E /* spheremonics.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55D940993590F00F3E977 /* spheremonics.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A97158FC473002B5D1E /* sproingies.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A470993351F00F3E977 /* sproingies.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A98158FC473002B5D1E /* sproingiewrap.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A480993351F00F3E977 /* sproingiewrap.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A99158FC473002B5D1E /* stairs.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A1A0993345900F3E977 /* stairs.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A9A158FC473002B5D1E /* starwars.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77782809B650FF00EA3033 /* starwars.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A9B158FC473002B5D1E /* stonerview-move.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7777BF09B64BD400EA3033 /* stonerview-move.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A9C158FC473002B5D1E /* stonerview-osc.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7777C109B64BD400EA3033 /* stonerview-osc.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A9D158FC473002B5D1E /* stonerview-view.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7777C309B64BD400EA3033 /* stonerview-view.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A9E158FC473002B5D1E /* stonerview.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7777C409B64BD400EA3033 /* stonerview.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918A9F158FC473002B5D1E /* superquadrics.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA559A80993326300F3E977 /* superquadrics.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918AA0158FC473002B5D1E /* surfaces.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4A3463102A5A0E00A81B2A /* surfaces.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918AA1158FC473002B5D1E /* swim.c in Sources */ = {isa = PBXBuildFile; fileRef = AF0839AC09930C4900277BE9 /* swim.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918AA2158FC473002B5D1E /* tangram.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA563090993948F00F3E977 /* tangram.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918AA3158FC473002B5D1E /* tangram_shapes.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA563070993948F00F3E977 /* tangram_shapes.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918AA4158FC473002B5D1E /* teapot.c in Sources */ = {isa = PBXBuildFile; fileRef = AFC211930E4E30C800D87B6E /* teapot.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918AA5158FC473002B5D1E /* timetunnel.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5638E0993980D00F3E977 /* timetunnel.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918AA6158FC473002B5D1E /* toast.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55E990993608800F3E977 /* toast.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918AA7158FC473002B5D1E /* toast2.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55E9B0993608800F3E977 /* toast2.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918AA8158FC473002B5D1E /* toaster.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EAB0993608800F3E977 /* toaster.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918AA9158FC473002B5D1E /* toaster_base.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55E9D0993608800F3E977 /* toaster_base.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918AAA158FC473002B5D1E /* toaster_handle.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55E9F0993608800F3E977 /* toaster_handle.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918AAB158FC473002B5D1E /* toaster_handle2.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EA10993608800F3E977 /* toaster_handle2.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918AAC158FC473002B5D1E /* toaster_jet.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EA30993608800F3E977 /* toaster_jet.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918AAD158FC473002B5D1E /* toaster_knob.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EA50993608800F3E977 /* toaster_knob.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918AAE158FC473002B5D1E /* toaster_slots.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EA70993608800F3E977 /* toaster_slots.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918AAF158FC473002B5D1E /* toaster_wing.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EA90993608800F3E977 /* toaster_wing.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918AB0158FC473002B5D1E /* topblock.c in Sources */ = {isa = PBXBuildFile; fileRef = AF998EF80A083E750051049D /* topblock.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918AB1158FC47B002B5D1E /* tunnel_draw.c in Sources */ = {isa = PBXBuildFile; fileRef = AF083A58099312B000277BE9 /* tunnel_draw.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918AB2158FC47B002B5D1E /* voronoi.c in Sources */ = {isa = PBXBuildFile; fileRef = AF0DCA5F0C4CBB7300D76972 /* voronoi.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918AB3158FC47B002B5D1E /* whale.c in Sources */ = {isa = PBXBuildFile; fileRef = AF0839AD09930C4900277BE9 /* whale.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AF918AB4158FC53D002B5D1E /* abstractile.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFE6A4360CDD8026002805BF /* abstractile.xml */; };
+ AF918AB5158FC53D002B5D1E /* anemone.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258680988A468000655EE /* anemone.xml */; };
+ AF918AB6158FC53D002B5D1E /* anemotaxis.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258690988A468000655EE /* anemotaxis.xml */; };
+ AF918AB8158FC53D002B5D1E /* antinspect.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2586B0988A468000655EE /* antinspect.xml */; };
+ AF918AB9158FC53D002B5D1E /* antmaze.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2586C0988A468000655EE /* antmaze.xml */; };
+ AF918ABA158FC53D002B5D1E /* antspotlight.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2586D0988A468000655EE /* antspotlight.xml */; };
+ AF918ABB158FC53D002B5D1E /* apollonian.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2586E0988A468000655EE /* apollonian.xml */; };
+ AF918ABC158FC53D002B5D1E /* apple2.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2586F0988A468000655EE /* apple2.xml */; };
+ AF918ABD158FC53D002B5D1E /* atlantis.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258700988A468000655EE /* atlantis.xml */; };
+ AF918ABE158FC53D002B5D1E /* attraction.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258710988A468000655EE /* attraction.xml */; };
+ AF918ABF158FC53D002B5D1E /* atunnel.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258720988A468000655EE /* atunnel.xml */; };
+ AF918AC0158FC53D002B5D1E /* barcode.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258730988A468000655EE /* barcode.xml */; };
+ AF918AC1158FC53D002B5D1E /* blaster.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258740988A468000655EE /* blaster.xml */; };
+ AF918AC2158FC53D002B5D1E /* blinkbox.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258750988A468000655EE /* blinkbox.xml */; };
+ AF918AC3158FC53D002B5D1E /* blitspin.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258760988A468000655EE /* blitspin.xml */; };
+ AF918AC4158FC53D002B5D1E /* blocktube.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258770988A468000655EE /* blocktube.xml */; };
+ AF918AC5158FC53D002B5D1E /* boing.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258780988A468000655EE /* boing.xml */; };
+ AF918AC6158FC53D002B5D1E /* bouboule.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258790988A468000655EE /* bouboule.xml */; };
+ AF918AC7158FC53D002B5D1E /* bouncingcow.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2587A0988A468000655EE /* bouncingcow.xml */; };
+ AF918AC8158FC53D002B5D1E /* boxed.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2587B0988A468000655EE /* boxed.xml */; };
+ AF918AC9158FC53D002B5D1E /* boxfit.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2587C0988A468000655EE /* boxfit.xml */; };
+ AF918ACA158FC53D002B5D1E /* braid.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2587D0988A468000655EE /* braid.xml */; };
+ AF918ACB158FC53D002B5D1E /* bsod.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2587E0988A468000655EE /* bsod.xml */; };
+ AF918ACC158FC53D002B5D1E /* bubble3d.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2587F0988A468000655EE /* bubble3d.xml */; };
+ AF918ACE158FC53D002B5D1E /* bumps.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258810988A468000655EE /* bumps.xml */; };
+ AF918ACF158FC53D002B5D1E /* cage.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258820988A468000655EE /* cage.xml */; };
+ AF918AD0158FC53D002B5D1E /* carousel.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258830988A468000655EE /* carousel.xml */; };
+ AF918AD1158FC53D002B5D1E /* ccurve.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258840988A468000655EE /* ccurve.xml */; };
+ AF918AD2158FC53D002B5D1E /* celtic.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258850988A468000655EE /* celtic.xml */; };
+ AF918AD3158FC53D002B5D1E /* circuit.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258860988A468000655EE /* circuit.xml */; };
+ AF918AD4158FC53D002B5D1E /* cloudlife.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258870988A468000655EE /* cloudlife.xml */; };
+ AF918AD5158FC53D002B5D1E /* companioncube.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF3581E61431D61D00E09C51 /* companioncube.xml */; };
+ AF918AD6158FC53D002B5D1E /* compass.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258880988A468000655EE /* compass.xml */; };
+ AF918AD7158FC53D002B5D1E /* coral.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258890988A468000655EE /* coral.xml */; };
+ AF918AD8158FC53D002B5D1E /* crackberg.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2588B0988A468000655EE /* crackberg.xml */; };
+ AF918ADA158FC53D002B5D1E /* crystal.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2588D0988A468000655EE /* crystal.xml */; };
+ AF918ADB158FC53D002B5D1E /* cube21.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2588E0988A468000655EE /* cube21.xml */; };
+ AF918ADC158FC53D002B5D1E /* cubenetic.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2588F0988A468000655EE /* cubenetic.xml */; };
+ AF918ADD158FC53D002B5D1E /* cubestorm.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258900988A468000655EE /* cubestorm.xml */; };
+ AF918ADE158FC53D002B5D1E /* cubicgrid.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF4FF4D30D52CCAA00666F98 /* cubicgrid.xml */; };
+ AF918ADF158FC53D002B5D1E /* cwaves.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFF4634B0C44046500EE6509 /* cwaves.xml */; };
+ AF918AE0158FC53D002B5D1E /* cynosure.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258910988A468000655EE /* cynosure.xml */; };
+ AF918AE1158FC53D002B5D1E /* dangerball.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258920988A468000655EE /* dangerball.xml */; };
+ AF918AE2158FC53D002B5D1E /* decayscreen.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258930988A468000655EE /* decayscreen.xml */; };
+ AF918AE3158FC53D002B5D1E /* deco.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258940988A468000655EE /* deco.xml */; };
+ AF918AE4158FC53D002B5D1E /* deluxe.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258950988A468000655EE /* deluxe.xml */; };
+ AF918AE5158FC53D002B5D1E /* demon.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258960988A468000655EE /* demon.xml */; };
+ AF918AE6158FC53D002B5D1E /* discrete.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258970988A468000655EE /* discrete.xml */; };
+ AF918AE7158FC53D002B5D1E /* distort.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258980988A468000655EE /* distort.xml */; };
+ AF918AE9158FC53D002B5D1E /* drift.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258990988A468000655EE /* drift.xml */; };
+ AF918AEA158FC53D002B5D1E /* endgame.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2589B0988A468000655EE /* endgame.xml */; };
+ AF918AEB158FC53D002B5D1E /* engine.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2589C0988A468000655EE /* engine.xml */; };
+ AF918AEC158FC53D002B5D1E /* epicycle.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2589D0988A468000655EE /* epicycle.xml */; };
+ AF918AED158FC53D002B5D1E /* eruption.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2589E0988A468000655EE /* eruption.xml */; };
+ AF918AEE158FC53D002B5D1E /* euler2d.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2589F0988A468000655EE /* euler2d.xml */; };
+ AF918AF0158FC53D002B5D1E /* fadeplot.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258A10988A468000655EE /* fadeplot.xml */; };
+ AF918AF1158FC53D002B5D1E /* fiberlamp.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258A20988A468000655EE /* fiberlamp.xml */; };
+ AF918AF2158FC53D002B5D1E /* fireworkx.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258A40988A468000655EE /* fireworkx.xml */; };
+ AF918AF4158FC53D002B5D1E /* flame.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258A60988A468000655EE /* flame.xml */; };
+ AF918AF5158FC53D002B5D1E /* flipflop.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258A70988A468000655EE /* flipflop.xml */; };
+ AF918AF6158FC53D002B5D1E /* flipscreen3d.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258A80988A468000655EE /* flipscreen3d.xml */; };
+ AF918AF7158FC53D002B5D1E /* fliptext.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258A90988A468000655EE /* fliptext.xml */; };
+ AF918AF8158FC53D002B5D1E /* flow.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258AA0988A468000655EE /* flow.xml */; };
+ AF918AF9158FC53D002B5D1E /* fluidballs.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258AB0988A468000655EE /* fluidballs.xml */; };
+ AF918AFB158FC53D002B5D1E /* flyingtoasters.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258AD0988A468000655EE /* flyingtoasters.xml */; };
+ AF918AFC158FC53D002B5D1E /* fontglide.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258AE0988A468000655EE /* fontglide.xml */; };
+ AF918AFE158FC53D002B5D1E /* fuzzyflakes.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258B00988A468000655EE /* fuzzyflakes.xml */; };
+ AF918AFF158FC53D002B5D1E /* galaxy.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258B10988A468000655EE /* galaxy.xml */; };
+ AF918B00158FC53D002B5D1E /* gears.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258B20988A468000655EE /* gears.xml */; };
+ AF918B01158FC53D002B5D1E /* gflux.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258B30988A468000655EE /* gflux.xml */; };
+ AF918B02158FC53D002B5D1E /* glblur.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258B40988A468000655EE /* glblur.xml */; };
+ AF918B03158FC53D002B5D1E /* glcells.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFF463730C440BAC00EE6509 /* glcells.xml */; };
+ AF918B04158FC53D002B5D1E /* gleidescope.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258B50988A468000655EE /* gleidescope.xml */; };
+ AF918B06158FC53D002B5D1E /* glhanoi.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258B70988A468000655EE /* glhanoi.xml */; };
+ AF918B07158FC53D002B5D1E /* glknots.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258B80988A468000655EE /* glknots.xml */; };
+ AF918B08158FC53D002B5D1E /* glmatrix.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258B90988A468000655EE /* glmatrix.xml */; };
+ AF918B09158FC53D002B5D1E /* glplanet.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258BA0988A468000655EE /* glplanet.xml */; };
+ AF918B0A158FC53D002B5D1E /* glschool.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF48E16B0A0C26A400F94CF9 /* glschool.xml */; };
+ AF918B0B158FC53D002B5D1E /* glslideshow.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258BB0988A468000655EE /* glslideshow.xml */; };
+ AF918B0C158FC53D002B5D1E /* glsnake.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258BC0988A468000655EE /* glsnake.xml */; };
+ AF918B0D158FC53D002B5D1E /* gltext.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258BD0988A468000655EE /* gltext.xml */; };
+ AF918B0E158FC53D002B5D1E /* goop.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258BF0988A468000655EE /* goop.xml */; };
+ AF918B0F158FC53D002B5D1E /* grav.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258C00988A468000655EE /* grav.xml */; };
+ AF918B10158FC53D002B5D1E /* greynetic.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258C10988A468000655EE /* greynetic.xml */; };
+ AF918B11158FC53D002B5D1E /* halftone.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258C20988A468000655EE /* halftone.xml */; };
+ AF918B12158FC53D002B5D1E /* halo.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258C30988A468000655EE /* halo.xml */; };
+ AF918B13158FC53D002B5D1E /* helix.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258C40988A468000655EE /* helix.xml */; };
+ AF918B14158FC53D002B5D1E /* hilbert.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF78D18E142DD99A002AAF77 /* hilbert.xml */; };
+ AF918B15158FC53D002B5D1E /* hopalong.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258C50988A468000655EE /* hopalong.xml */; };
+ AF918B18158FC53D002B5D1E /* hypertorus.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258C80988A468000655EE /* hypertorus.xml */; };
+ AF918B19158FC53D002B5D1E /* hypnowheel.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF3C715F0D624C7C0030CC0D /* hypnowheel.xml */; };
+ AF918B1A158FC53D002B5D1E /* ifs.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258C90988A468000655EE /* ifs.xml */; };
+ AF918B1B158FC53D002B5D1E /* imsmap.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258CA0988A468000655EE /* imsmap.xml */; };
+ AF918B1C158FC53D002B5D1E /* interaggregate.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258CB0988A468000655EE /* interaggregate.xml */; };
+ AF918B1D158FC53D002B5D1E /* interference.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258CC0988A468000655EE /* interference.xml */; };
+ AF918B1E158FC53D002B5D1E /* intermomentary.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258CD0988A468000655EE /* intermomentary.xml */; };
+ AF918B1F158FC53D002B5D1E /* jigglypuff.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258CE0988A468000655EE /* jigglypuff.xml */; };
+ AF918B22158FC53D002B5D1E /* juggler3d.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258D10988A468000655EE /* juggler3d.xml */; };
+ AF918B23158FC53D002B5D1E /* julia.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258D20988A468000655EE /* julia.xml */; };
+ AF918B24158FC53D002B5D1E /* kaleidescope.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258D30988A468000655EE /* kaleidescope.xml */; };
+ AF918B25158FC53D002B5D1E /* klein.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258D40988A468000655EE /* klein.xml */; };
+ AF918B26158FC53D002B5D1E /* kumppa.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258D50988A468000655EE /* kumppa.xml */; };
+ AF918B27158FC53D002B5D1E /* lament.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258D60988A468000655EE /* lament.xml */; };
+ AF918B29158FC53D002B5D1E /* lavalite.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258D80988A468000655EE /* lavalite.xml */; };
+ AF918B30158FC53D002B5D1E /* loop.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258DD0988A468000655EE /* loop.xml */; };
+ AF918B31158FC53D002B5D1E /* m6502.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF0DCA370C4C74B700D76972 /* m6502.xml */; };
+ AF918B32158FC53D002B5D1E /* maze.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258DE0988A468000655EE /* maze.xml */; };
+ AF918B33158FC53D002B5D1E /* memscroller.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258DF0988A469000655EE /* memscroller.xml */; };
+ AF918B34158FC53D002B5D1E /* menger.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258E00988A469000655EE /* menger.xml */; };
+ AF918B35158FC53D002B5D1E /* metaballs.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258E10988A469000655EE /* metaballs.xml */; };
+ AF918B36158FC53D002B5D1E /* mirrorblob.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258E20988A469000655EE /* mirrorblob.xml */; };
+ AF918B38158FC53D002B5D1E /* moebius.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258E40988A469000655EE /* moebius.xml */; };
+ AF918B39158FC53D002B5D1E /* moebiusgears.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFE6A40D0CDD7BDC002805BF /* moebiusgears.xml */; };
+ AF918B3A158FC53D002B5D1E /* moire.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258E50988A469000655EE /* moire.xml */; };
+ AF918B3B158FC53D002B5D1E /* moire2.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258E60988A469000655EE /* moire2.xml */; };
+ AF918B3C158FC53D002B5D1E /* molecule.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258E70988A469000655EE /* molecule.xml */; };
+ AF918B3D158FC53D002B5D1E /* morph3d.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258E80988A469000655EE /* morph3d.xml */; };
+ AF918B3E158FC53D002B5D1E /* mountain.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258E90988A469000655EE /* mountain.xml */; };
+ AF918B3F158FC53D002B5D1E /* munch.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258EA0988A469000655EE /* munch.xml */; };
+ AF918B40158FC53D002B5D1E /* nerverot.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258EB0988A469000655EE /* nerverot.xml */; };
+ AF918B41158FC53D002B5D1E /* noof.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258EC0988A469000655EE /* noof.xml */; };
+ AF918B42158FC53D002B5D1E /* noseguy.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258ED0988A469000655EE /* noseguy.xml */; };
+ AF918B43158FC53D002B5D1E /* pacman.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258EE0988A469000655EE /* pacman.xml */; };
+ AF918B44158FC53D002B5D1E /* pedal.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258EF0988A469000655EE /* pedal.xml */; };
+ AF918B45158FC53D002B5D1E /* penetrate.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258F00988A469000655EE /* penetrate.xml */; };
+ AF918B46158FC53D002B5D1E /* penrose.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258F10988A469000655EE /* penrose.xml */; };
+ AF918B47158FC53D002B5D1E /* petri.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258F20988A469000655EE /* petri.xml */; };
+ AF918B48158FC53E002B5D1E /* phosphor.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258F30988A469000655EE /* phosphor.xml */; };
+ AF918B49158FC53E002B5D1E /* photopile.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFD51DB80F063BE700471C02 /* photopile.xml */; };
+ AF918B4A158FC53E002B5D1E /* piecewise.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258F40988A469000655EE /* piecewise.xml */; };
+ AF918B4B158FC53E002B5D1E /* pinion.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258F50988A469000655EE /* pinion.xml */; };
+ AF918B4C158FC53E002B5D1E /* pipes.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258F60988A469000655EE /* pipes.xml */; };
+ AF918B4E158FC53E002B5D1E /* polyominoes.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258F80988A469000655EE /* polyominoes.xml */; };
+ AF918B4F158FC53E002B5D1E /* polytopes.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258F90988A469000655EE /* polytopes.xml */; };
+ AF918B50158FC53E002B5D1E /* pong.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258FA0988A469000655EE /* pong.xml */; };
+ AF918B51158FC53E002B5D1E /* popsquares.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258FB0988A469000655EE /* popsquares.xml */; };
+ AF918B52158FC53E002B5D1E /* providence.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258FC0988A469000655EE /* providence.xml */; };
+ AF918B53158FC53E002B5D1E /* pulsar.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258FD0988A469000655EE /* pulsar.xml */; };
+ AF918B54158FC53E002B5D1E /* pyro.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258FE0988A469000655EE /* pyro.xml */; };
+ AF918B55158FC53E002B5D1E /* qix.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258FF0988A469000655EE /* qix.xml */; };
+ AF918B56158FC53E002B5D1E /* queens.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259000988A469000655EE /* queens.xml */; };
+ AF918B57158FC53E002B5D1E /* rdbomb.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFCCCBAD09BFE4B000353F4D /* rdbomb.xml */; };
+ AF918B58158FC53E002B5D1E /* ripples.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259030988A469000655EE /* ripples.xml */; };
+ AF918B59158FC53E002B5D1E /* rocks.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259040988A469000655EE /* rocks.xml */; };
+ AF918B5A158FC53E002B5D1E /* rorschach.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259050988A469000655EE /* rorschach.xml */; };
+ AF918B5C158FC53E002B5D1E /* rotzoomer.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259070988A469000655EE /* rotzoomer.xml */; };
+ AF918B5D158FC53E002B5D1E /* rubik.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259080988A469000655EE /* rubik.xml */; };
+ AF918B5E158FC53E002B5D1E /* rubikblocks.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF32D9FC0F3AD1330080F535 /* rubikblocks.xml */; };
+ AF918B5F158FC53E002B5D1E /* sballs.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259090988A469000655EE /* sballs.xml */; };
+ AF918B60158FC53E002B5D1E /* shadebobs.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2590A0988A469000655EE /* shadebobs.xml */; };
+ AF918B61158FC53E002B5D1E /* sierpinski.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2590B0988A469000655EE /* sierpinski.xml */; };
+ AF918B62158FC53E002B5D1E /* sierpinski3d.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2590C0988A469000655EE /* sierpinski3d.xml */; };
+ AF918B63158FC53E002B5D1E /* skytentacles.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFE2A4740E2E911200ADB298 /* skytentacles.xml */; };
+ AF918B64158FC53E002B5D1E /* slidescreen.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2590D0988A469000655EE /* slidescreen.xml */; };
+ AF918B65158FC53E002B5D1E /* slip.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2590E0988A469000655EE /* slip.xml */; };
+ AF918B66158FC53E002B5D1E /* sonar.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2590F0988A469000655EE /* sonar.xml */; };
+ AF918B67158FC53E002B5D1E /* speedmine.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259100988A469000655EE /* speedmine.xml */; };
+ AF918B69158FC53E002B5D1E /* spheremonics.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259130988A469000655EE /* spheremonics.xml */; };
+ AF918B6B158FC53E002B5D1E /* spotlight.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259150988A469000655EE /* spotlight.xml */; };
+ AF918B6C158FC53E002B5D1E /* sproingies.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259160988A469000655EE /* sproingies.xml */; };
+ AF918B6D158FC53E002B5D1E /* squiral.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259170988A469000655EE /* squiral.xml */; };
+ AF918B6E158FC53E002B5D1E /* stairs.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259190988A469000655EE /* stairs.xml */; };
+ AF918B6F158FC53E002B5D1E /* starfish.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2591A0988A469000655EE /* starfish.xml */; };
+ AF918B70158FC53E002B5D1E /* starwars.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2591B0988A469000655EE /* starwars.xml */; };
+ AF918B71158FC53E002B5D1E /* stonerview.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2591C0988A469000655EE /* stonerview.xml */; };
+ AF918B72158FC53E002B5D1E /* strange.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2591D0988A469000655EE /* strange.xml */; };
+ AF918B73158FC53E002B5D1E /* substrate.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2591E0988A469000655EE /* substrate.xml */; };
+ AF918B74158FC53E002B5D1E /* superquadrics.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2591F0988A469000655EE /* superquadrics.xml */; };
+ AF918B75158FC53E002B5D1E /* surfaces.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF4A3461102A59EB00A81B2A /* surfaces.xml */; };
+ AF918B76158FC53E002B5D1E /* swirl.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259200988A469000655EE /* swirl.xml */; };
+ AF918B78158FC53E002B5D1E /* tangram.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259220988A469000655EE /* tangram.xml */; };
+ AF918B79158FC53E002B5D1E /* thornbird.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259230988A469000655EE /* thornbird.xml */; };
+ AF918B7A158FC53E002B5D1E /* timetunnel.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259240988A469000655EE /* timetunnel.xml */; };
+ AF918B7B158FC53E002B5D1E /* topblock.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF998EFA0A083E8C0051049D /* topblock.xml */; };
+ AF918B7C158FC53E002B5D1E /* triangle.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259250988A469000655EE /* triangle.xml */; };
+ AF918B7D158FC53E002B5D1E /* tronbit.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF3582211433318500E09C51 /* tronbit.xml */; };
+ AF918B7E158FC53E002B5D1E /* truchet.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259260988A469000655EE /* truchet.xml */; };
+ AF918B7F158FC53E002B5D1E /* twang.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259270988A469000655EE /* twang.xml */; };
+ AF918B80158FC53E002B5D1E /* vermiculate.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259280988A469000655EE /* vermiculate.xml */; };
+ AF918B83158FC53E002B5D1E /* voronoi.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF0DCA610C4CBB8E00D76972 /* voronoi.xml */; };
+ AF918B84158FC53E002B5D1E /* wander.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2592B0988A469000655EE /* wander.xml */; };
+ AF918B86158FC53E002B5D1E /* whirlwindwarp.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2592D0988A469000655EE /* whirlwindwarp.xml */; };
+ AF918B89158FC53E002B5D1E /* wormhole.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259310988A469000655EE /* wormhole.xml */; };
+ AF918B8A158FC53E002B5D1E /* xanalogtv.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259320988A469000655EE /* xanalogtv.xml */; };
+ AF918B8B158FC53E002B5D1E /* xflame.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259370988A469000655EE /* xflame.xml */; };
+ AF918B8C158FC53E002B5D1E /* xjack.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259380988A469000655EE /* xjack.xml */; };
+ AF918B8D158FC53E002B5D1E /* xlyap.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259390988A469000655EE /* xlyap.xml */; };
+ AF918B8E158FC53E002B5D1E /* xmatrix.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2593A0988A469000655EE /* xmatrix.xml */; };
+ AF918B8F158FC53E002B5D1E /* xrayswarm.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2593D0988A469000655EE /* xrayswarm.xml */; };
+ AF918B90158FC53E002B5D1E /* xspirograph.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2593F0988A469000655EE /* xspirograph.xml */; };
+ AF918B91158FC554002B5D1E /* zoom.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259430988A469000655EE /* zoom.xml */; };
+ AF918B96158FD0EA002B5D1E /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AF918B99158FF045002B5D1E /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AF918B9A158FF04C002B5D1E /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AF939AD320351BFD0032DD23 /* font-retry.c in Sources */ = {isa = PBXBuildFile; fileRef = AF939AD220351BFC0032DD23 /* font-retry.c */; };
+ AF939AD52038C0050032DD23 /* luximr.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AF939AD42038C0040032DD23 /* luximr.ttf */; };
+ AF939AD72038C5F00032DD23 /* luximr.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AF939AD42038C0040032DD23 /* luximr.ttf */; };
+ AF95C30420999B3E001924BE /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AF975734099C317000B05160 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF97573F099C31BB00B05160 /* imsmap.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258CA0988A468000655EE /* imsmap.xml */; };
+ AF975741099C31DD00B05160 /* imsmap.c in Sources */ = {isa = PBXBuildFile; fileRef = AF975740099C31DD00B05160 /* imsmap.c */; };
+ AF97577B099C374A00B05160 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF975788099C378B00B05160 /* moire.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258E50988A469000655EE /* moire.xml */; };
+ AF97578A099C37A500B05160 /* moire.c in Sources */ = {isa = PBXBuildFile; fileRef = AF975789099C37A500B05160 /* moire.c */; };
+ AF9757C8099C3E6300B05160 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9757D6099C3EB800B05160 /* rd-bomb.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9757D5099C3EB800B05160 /* rd-bomb.c */; };
+ AF97580E099C41D500B05160 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF97581B099C423600B05160 /* xflame.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259370988A469000655EE /* xflame.xml */; };
+ AF975830099C427500B05160 /* xflame.c in Sources */ = {isa = PBXBuildFile; fileRef = AF97582F099C427500B05160 /* xflame.c */; };
+ AF97586B099C475900B05160 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF975879099C490500B05160 /* shadebobs.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2590A0988A469000655EE /* shadebobs.xml */; };
+ AF97587B099C492000B05160 /* shadebobs.c in Sources */ = {isa = PBXBuildFile; fileRef = AF97587A099C492000B05160 /* shadebobs.c */; };
+ AF975A3C099C681F00B05160 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF975A48099C688B00B05160 /* metaballs.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258E10988A469000655EE /* metaballs.xml */; };
+ AF975A4A099C689F00B05160 /* metaballs.c in Sources */ = {isa = PBXBuildFile; fileRef = AF975A49099C689F00B05160 /* metaballs.c */; };
+ AF975A72099C6AB200B05160 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF975A82099C6B2700B05160 /* eruption.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2589E0988A468000655EE /* eruption.xml */; };
+ AF975A84099C6B4900B05160 /* eruption.c in Sources */ = {isa = PBXBuildFile; fileRef = AF975A83099C6B4900B05160 /* eruption.c */; };
+ AF975A8C099C6BC300B05160 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF975A98099C6C2000B05160 /* barcode.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258730988A468000655EE /* barcode.xml */; };
+ AF975A9A099C6C3600B05160 /* barcode.c in Sources */ = {isa = PBXBuildFile; fileRef = AF975A99099C6C3500B05160 /* barcode.c */; };
+ AF975ADD099C6EB100B05160 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF975AED099C6EFE00B05160 /* fireworkx.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258A40988A468000655EE /* fireworkx.xml */; };
+ AF975AEF099C6F1700B05160 /* fireworkx.c in Sources */ = {isa = PBXBuildFile; fileRef = AF975AEE099C6F1700B05160 /* fireworkx.c */; };
+ AF975B02099C6FE400B05160 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF975B15099C709E00B05160 /* memscroller.c in Sources */ = {isa = PBXBuildFile; fileRef = AF975B14099C709E00B05160 /* memscroller.c */; };
+ AF975B16099C70B200B05160 /* memscroller.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258DF0988A469000655EE /* memscroller.xml */; };
+ AF975C18099C8C1500B05160 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF975C28099C8C6A00B05160 /* halo.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258C30988A468000655EE /* halo.xml */; };
+ AF975C29099C8C7600B05160 /* halo.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480C29098E295D00FB32B8 /* halo.c */; };
+ AF975C44099C8DCF00B05160 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF975C55099C8E2800B05160 /* greynetic.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258C10988A468000655EE /* greynetic.xml */; };
+ AF975C56099C8E3000B05160 /* greynetic.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480C21098E28EF00FB32B8 /* greynetic.c */; };
+ AF975C64099C8F3F00B05160 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF975C75099C8FAC00B05160 /* noseguy.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258ED0988A469000655EE /* noseguy.xml */; };
+ AF975C77099C8FC700B05160 /* noseguy.c in Sources */ = {isa = PBXBuildFile; fileRef = AF975C76099C8FC700B05160 /* noseguy.c */; };
+ AF975C93099C929800B05160 /* ximage-loader.c in Sources */ = {isa = PBXBuildFile; fileRef = AF975C91099C929800B05160 /* ximage-loader.c */; };
+ AF975C94099C929800B05160 /* ximage-loader.h in Headers */ = {isa = PBXBuildFile; fileRef = AF975C92099C929800B05160 /* ximage-loader.h */; };
+ AF975D59099CA0F000B05160 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF975D65099CA14B00B05160 /* rocks.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259040988A469000655EE /* rocks.xml */; };
+ AF975D67099CA16A00B05160 /* rocks.c in Sources */ = {isa = PBXBuildFile; fileRef = AF975D66099CA16A00B05160 /* rocks.c */; };
+ AF976FCC0989CAD7001F8B92 /* deco.c in Sources */ = {isa = PBXBuildFile; fileRef = AFC25B5E0988BA63000655EE /* deco.c */; };
+ AF976FCD0989CAEA001F8B92 /* deco.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258940988A468000655EE /* deco.xml */; };
+ AF9770420989D21A001F8B92 /* rorschach.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD620981E40800F7970E /* rorschach.c */; };
+ AF9770430989D226001F8B92 /* rorschach.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259050988A469000655EE /* rorschach.xml */; };
+ AF97707F0989D327001F8B92 /* attraction.c in Sources */ = {isa = PBXBuildFile; fileRef = AF976DFA09896BEB001F8B92 /* attraction.c */; };
+ AF9770800989D32E001F8B92 /* attraction.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258710988A468000655EE /* attraction.xml */; };
+ AF9771DF0989DC88001F8B92 /* SaverRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD400981E32E00F7970E /* SaverRunner.m */; };
+ AF9772C80989DCD5001F8B92 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
+ AF9772E30989DFC6001F8B92 /* SaverRunner.nib in Resources */ = {isa = PBXBuildFile; fileRef = AF9772E10989DFC6001F8B92 /* SaverRunner.nib */; };
+ AF998ED60A083A280051049D /* xscreensaver-text in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF0B09CA6FF900EE1051 /* xscreensaver-text */; };
+ AF998EE10A083DB30051049D /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF998EF90A083E750051049D /* topblock.c in Sources */ = {isa = PBXBuildFile; fileRef = AF998EF80A083E750051049D /* topblock.c */; };
+ AF998EFB0A083E8C0051049D /* topblock.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF998EFA0A083E8C0051049D /* topblock.xml */; };
+ AF9CC7A1099580E70075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CC8EE09958D920075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAB509959CEF0075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAB609959CF70075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAB709959D000075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAB809959D0D0075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAB909959D100075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCABA09959D170075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCABB09959D1C0075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCABC09959D200075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCABD09959D250075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCABE09959D290075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCABF09959D2E0075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAC009959D310075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAC109959D380075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAC209959D3C0075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAC309959D420075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAC409959D450075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAC509959D4B0075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAC609959D500075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAC709959D550075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAC809959D5A0075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAC909959D5D0075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCACA09959D630075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCACB09959D680075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCACC09959D6B0075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCACD09959D720075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCACE09959D750075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCACF09959D7C0075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAD009959D800075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAD109959D850075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAD209959D8A0075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAD309959D8F0075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAD409959D980075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAD509959D9C0075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAD609959DA30075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAD709959DA70075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAD809959DAE0075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAD909959DB20075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCADA09959DB60075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCADB09959DBB0075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCADC09959DC10075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCADD09959DC60075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCADE09959DCB0075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCADF09959DCE0075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAE009959DD50075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAE109959DDA0075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAE209959DDF0075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAE309959DE20075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAE409959DE60075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAE509959DEB0075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAE609959DF00075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAE709959DF50075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAE809959DF90075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAE909959E000075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAEA09959E050075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAEB09959E090075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAEC09959E0D0075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAED09959E140075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAEE09959E170075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAEF09959E1E0075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAF009959E230075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9CCAF109959E270075E99B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9D466D09B5109C006E59CF /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9D467909B5110B006E59CF /* decayscreen.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D467809B5110B006E59CF /* decayscreen.c */; };
+ AF9D467A09B51126006E59CF /* decayscreen.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258930988A468000655EE /* decayscreen.xml */; };
+ AF9D468F09B51567006E59CF /* grabclient-osx.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9D468E09B51567006E59CF /* grabclient-osx.m */; };
+ AF9D473809B52EE0006E59CF /* colorbars.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D473609B52EE0006E59CF /* colorbars.c */; };
+ AF9D473909B52EE0006E59CF /* colorbars.h in Headers */ = {isa = PBXBuildFile; fileRef = AF9D473709B52EE0006E59CF /* colorbars.h */; };
+ AF9D474A09B5300A006E59CF /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9D475609B5306A006E59CF /* slidescreen.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2590D0988A469000655EE /* slidescreen.xml */; };
+ AF9D475909B53091006E59CF /* slidescreen.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D475809B53091006E59CF /* slidescreen.c */; };
+ AF9D476509B53166006E59CF /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9D48D309B53214006E59CF /* zoom.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259430988A469000655EE /* zoom.xml */; };
+ AF9D48D509B53229006E59CF /* zoom.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D48D409B53229006E59CF /* zoom.c */; };
+ AF9D48E109B53322006E59CF /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9D48ED09B5338A006E59CF /* bumps.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258810988A468000655EE /* bumps.xml */; };
+ AF9D48F009B533AE006E59CF /* bumps.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D48EE09B533AE006E59CF /* bumps.c */; };
+ AF9D48FA09B535DA006E59CF /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9D490609B536DE006E59CF /* distort.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258980988A468000655EE /* distort.xml */; };
+ AF9D490809B536F7006E59CF /* distort.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D490709B536F7006E59CF /* distort.c */; };
+ AF9D493109B53CBA006E59CF /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9D493D09B53D3B006E59CF /* ripples.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259030988A469000655EE /* ripples.xml */; };
+ AF9D493F09B53D55006E59CF /* ripples.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D493E09B53D55006E59CF /* ripples.c */; };
+ AF9D495A09B53FC9006E59CF /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9D496609B54087006E59CF /* rotzoomer.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259070988A469000655EE /* rotzoomer.xml */; };
+ AF9D496809B540A4006E59CF /* rotzoomer.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D496709B540A4006E59CF /* rotzoomer.c */; };
+ AF9D497209B5411D006E59CF /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9D497E09B541CE006E59CF /* twang.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259270988A469000655EE /* twang.xml */; };
+ AF9D498009B541E6006E59CF /* twang.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D497F09B541E5006E59CF /* twang.c */; };
+ AF9D499D09B544C2006E59CF /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9D49A909B5457B006E59CF /* spotlight.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259150988A469000655EE /* spotlight.xml */; };
+ AF9D49AB09B54596006E59CF /* spotlight.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D49AA09B54596006E59CF /* spotlight.c */; };
+ AF9D4C6F09B59F27006E59CF /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9D4C7B09B5A02D006E59CF /* xlyap.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259390988A469000655EE /* xlyap.xml */; };
+ AF9D4C7D09B5A044006E59CF /* xlyap.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4C7C09B5A044006E59CF /* xlyap.c */; };
+ AF9D4CED09B5AA8E006E59CF /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9D4CF909B5AC73006E59CF /* pong.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258FA0988A469000655EE /* pong.xml */; };
+ AF9D4CFD09B5AC94006E59CF /* analogtv.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4CFA09B5AC94006E59CF /* analogtv.c */; };
+ AF9D4CFE09B5AC94006E59CF /* pong.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4CFC09B5AC94006E59CF /* pong.c */; };
+ AF9D4D8409B5B2DC006E59CF /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9D4D8509B5B2DC006E59CF /* analogtv.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4CFA09B5AC94006E59CF /* analogtv.c */; };
+ AF9D4D9109B5B42B006E59CF /* xanalogtv.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259320988A469000655EE /* xanalogtv.xml */; };
+ AF9D4D9309B5B444006E59CF /* xanalogtv.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4D9209B5B444006E59CF /* xanalogtv.c */; };
+ AF9D4DB509B5B71E006E59CF /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9D4DB609B5B71E006E59CF /* analogtv.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4CFA09B5AC94006E59CF /* analogtv.c */; };
+ AF9D4DC209B5B862006E59CF /* bsod.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2587E0988A468000655EE /* bsod.xml */; };
+ AF9D4DC409B5B87D006E59CF /* bsod.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4DC309B5B87D006E59CF /* bsod.c */; };
+ AF9D4DD409B5B990006E59CF /* apple2.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4DD309B5B990006E59CF /* apple2.c */; };
+ AF9D4DF209B5BB19006E59CF /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AF9D4DF309B5BB19006E59CF /* analogtv.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4CFA09B5AC94006E59CF /* analogtv.c */; };
+ AF9D4DF509B5BB19006E59CF /* apple2.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4DD309B5B990006E59CF /* apple2.c */; };
+ AF9D4E0409B5BC85006E59CF /* apple2.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2586F0988A468000655EE /* apple2.xml */; };
+ AF9D4E0609B5BC9D006E59CF /* apple2-main.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4E0509B5BC9D006E59CF /* apple2-main.c */; };
+ AF9E7EC9190F4C4000A8B01F /* enable_gc.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9E7EC8190F4C4000A8B01F /* enable_gc.c */; };
+ AFA211891CD1AA2E00C0D2A1 /* textclient-mobile.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA211881CD1AA1800C0D2A1 /* textclient-mobile.c */; };
+ AFA2118A1CD1AA3A00C0D2A1 /* textclient-mobile.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA211881CD1AA1800C0D2A1 /* textclient-mobile.c */; };
+ AFA2118B1CD1AA3F00C0D2A1 /* textclient-mobile.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA211881CD1AA1800C0D2A1 /* textclient-mobile.c */; };
+ AFA211931CD59DAF00C0D2A1 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFA211951CD59DAF00C0D2A1 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AFA211961CD59DAF00C0D2A1 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AFA211971CD59DAF00C0D2A1 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AFA211981CD59DAF00C0D2A1 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AFA211991CD59DAF00C0D2A1 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AFA2119A1CD59DAF00C0D2A1 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ AFA2119B1CD59DAF00C0D2A1 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AFA211A51CD5A00F00C0D2A1 /* raverhoop.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFA211A41CD59FD800C0D2A1 /* raverhoop.xml */; };
+ AFA211A61CD5A02600C0D2A1 /* raverhoop.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFA211A41CD59FD800C0D2A1 /* raverhoop.xml */; };
+ AFA211A71CD5A03F00C0D2A1 /* raverhoop.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA211A31CD59FD800C0D2A1 /* raverhoop.c */; };
+ AFA211A81CD5A04300C0D2A1 /* raverhoop.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA211A31CD59FD800C0D2A1 /* raverhoop.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AFA339350B058505002B0E7D /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFA33BAF0B0585F7002B0E7D /* webcollage-cocoa.m in Sources */ = {isa = PBXBuildFile; fileRef = AFA33BAE0B0585F7002B0E7D /* webcollage-cocoa.m */; };
+ AFA33BB00B05860F002B0E7D /* webcollage.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2592C0988A469000655EE /* webcollage.xml */; };
+ AFA33BD10B0587EE002B0E7D /* webcollage-helper-cocoa.m in Sources */ = {isa = PBXBuildFile; fileRef = AFA33BD00B0587EE002B0E7D /* webcollage-helper-cocoa.m */; };
+ AFA33BDD0B058A30002B0E7D /* webcollage-helper in Resources */ = {isa = PBXBuildFile; fileRef = AFA33BC70B058740002B0E7D /* webcollage-helper */; };
+ AFA33C0C0B058ED2002B0E7D /* webcollage in Resources */ = {isa = PBXBuildFile; fileRef = AFA33C0A0B058E6B002B0E7D /* webcollage */; };
+ AFA55866099324D800F3E977 /* minixpm.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55864099324D800F3E977 /* minixpm.c */; };
+ AFA55867099324D800F3E977 /* minixpm.h in Headers */ = {isa = PBXBuildFile; fileRef = AFA55865099324D800F3E977 /* minixpm.h */; };
+ AFA5595C099330E500F3E977 /* cage.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258820988A468000655EE /* cage.xml */; };
+ AFA5595E0993310500F3E977 /* cage.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5595D0993310500F3E977 /* cage.c */; };
+ AFA55981099331AC00F3E977 /* moebius.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258E40988A469000655EE /* moebius.xml */; };
+ AFA55983099331C300F3E977 /* moebius.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55982099331C300F3E977 /* moebius.c */; };
+ AFA559A70993325200F3E977 /* superquadrics.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2591F0988A469000655EE /* superquadrics.xml */; };
+ AFA559A90993326300F3E977 /* superquadrics.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA559A80993326300F3E977 /* superquadrics.c */; };
+ AFA559CB099332CF00F3E977 /* morph3d.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258E80988A469000655EE /* morph3d.xml */; };
+ AFA559CD099332E800F3E977 /* morph3d.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA559CC099332E800F3E977 /* morph3d.c */; };
+ AFA559E90993333D00F3E977 /* rubik.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259080988A469000655EE /* rubik.xml */; };
+ AFA559EB0993335C00F3E977 /* rubik.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA559EA0993335C00F3E977 /* rubik.c */; };
+ AFA55A190993344100F3E977 /* stairs.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259190988A469000655EE /* stairs.xml */; };
+ AFA55A1B0993345900F3E977 /* stairs.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A1A0993345900F3E977 /* stairs.c */; };
+ AFA55A34099334CB00F3E977 /* sproingies.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259160988A469000655EE /* sproingies.xml */; };
+ AFA55A4A0993351F00F3E977 /* s1_1.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A400993351F00F3E977 /* s1_1.c */; };
+ AFA55A4B0993351F00F3E977 /* s1_2.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A410993351F00F3E977 /* s1_2.c */; };
+ AFA55A4C0993351F00F3E977 /* s1_3.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A420993351F00F3E977 /* s1_3.c */; };
+ AFA55A4D0993351F00F3E977 /* s1_4.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A430993351F00F3E977 /* s1_4.c */; };
+ AFA55A4E0993351F00F3E977 /* s1_5.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A440993351F00F3E977 /* s1_5.c */; };
+ AFA55A4F0993351F00F3E977 /* s1_6.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A450993351F00F3E977 /* s1_6.c */; };
+ AFA55A500993351F00F3E977 /* s1_b.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A460993351F00F3E977 /* s1_b.c */; };
+ AFA55A510993351F00F3E977 /* sproingies.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A470993351F00F3E977 /* sproingies.c */; };
+ AFA55A520993351F00F3E977 /* sproingiewrap.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A480993351F00F3E977 /* sproingiewrap.c */; };
+ AFA55A530993353500F3E977 /* gllist.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A3E0993351F00F3E977 /* gllist.c */; };
+ AFA55A540993353500F3E977 /* gllist.h in Headers */ = {isa = PBXBuildFile; fileRef = AFA55A3F0993351F00F3E977 /* gllist.h */; };
+ AFA55A8D0993366F00F3E977 /* lament.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258D60988A468000655EE /* lament.xml */; };
+ AFA55A8F0993369100F3E977 /* lament.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A8E0993369100F3E977 /* lament.c */; };
+ AFA55A95099336D800F3E977 /* normals.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A93099336D800F3E977 /* normals.c */; };
+ AFA55A96099336D800F3E977 /* normals.h in Headers */ = {isa = PBXBuildFile; fileRef = AFA55A94099336D800F3E977 /* normals.h */; };
+ AFA55AE309933D1C00F3E977 /* bubble3d.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2587F0988A468000655EE /* bubble3d.xml */; };
+ AFA55AE509933D3800F3E977 /* bubble3d.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55AE409933D3800F3E977 /* bubble3d.c */; };
+ AFA55AF709933DBF00F3E977 /* b_draw.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55AF409933DBF00F3E977 /* b_draw.c */; };
+ AFA55AF809933DBF00F3E977 /* b_lockglue.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55AF509933DBF00F3E977 /* b_lockglue.c */; };
+ AFA55AF909933DBF00F3E977 /* b_sphere.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55AF609933DBF00F3E977 /* b_sphere.c */; };
+ AFA55B2009933E3100F3E977 /* glplanet.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258BA0988A468000655EE /* glplanet.xml */; };
+ AFA55B2209933E4A00F3E977 /* glplanet.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55B2109933E4A00F3E977 /* glplanet.c */; };
+ AFA55B3909933EB400F3E977 /* pulsar.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258FD0988A469000655EE /* pulsar.xml */; };
+ AFA55B4509933EF800F3E977 /* pulsar.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55B3F09933EC600F3E977 /* pulsar.c */; };
+ AFA55B8D09933FAA00F3E977 /* sierpinski3d.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2590C0988A469000655EE /* sierpinski3d.xml */; };
+ AFA55B8F09933FBF00F3E977 /* sierpinski3d.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55B8E09933FBF00F3E977 /* sierpinski3d.c */; };
+ AFA55BA50993400200F3E977 /* gflux.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258B30988A468000655EE /* gflux.xml */; };
+ AFA55BA70993401A00F3E977 /* gflux.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55BA60993401A00F3E977 /* gflux.c */; };
+ AFA55BBF0993410100F3E977 /* circuit.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258860988A468000655EE /* circuit.xml */; };
+ AFA55BC10993416E00F3E977 /* circuit.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55BC00993416E00F3E977 /* circuit.c */; };
+ AFA55BF8099342BF00F3E977 /* menger.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258E00988A469000655EE /* menger.xml */; };
+ AFA55BFA099342D500F3E977 /* menger.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55BF9099342D500F3E977 /* menger.c */; };
+ AFA55C220993433D00F3E977 /* engine.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2589C0988A468000655EE /* engine.xml */; };
+ AFA55C240993435300F3E977 /* engine.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55C230993435300F3E977 /* engine.c */; };
+ AFA55C8B099349CC00F3E977 /* glsnake.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258BC0988A468000655EE /* glsnake.xml */; };
+ AFA55C8D099349EE00F3E977 /* glsnake.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55C8C099349EE00F3E977 /* glsnake.c */; };
+ AFA55CBD09934BDD00F3E977 /* boxed.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2587B0988A468000655EE /* boxed.xml */; };
+ AFA55CC009934C0900F3E977 /* boxed.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55CBE09934C0900F3E977 /* boxed.c */; };
+ AFA55CE009934D1500F3E977 /* glforestfire.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258B60988A468000655EE /* glforestfire.xml */; };
+ AFA55CE209934D2E00F3E977 /* glforestfire.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55CE109934D2E00F3E977 /* glforestfire.c */; };
+ AFA55D500993568200F3E977 /* sballs.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259090988A469000655EE /* sballs.xml */; };
+ AFA55D520993569C00F3E977 /* sballs.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55D510993569C00F3E977 /* sballs.c */; };
+ AFA55D760993587600F3E977 /* cubenetic.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2588F0988A468000655EE /* cubenetic.xml */; };
+ AFA55D780993589300F3E977 /* cubenetic.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55D770993589300F3E977 /* cubenetic.c */; };
+ AFA55D93099358FB00F3E977 /* spheremonics.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259130988A469000655EE /* spheremonics.xml */; };
+ AFA55D950993590F00F3E977 /* spheremonics.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55D940993590F00F3E977 /* spheremonics.c */; };
+ AFA55DDC09935D9D00F3E977 /* lavalite.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258D80988A468000655EE /* lavalite.xml */; };
+ AFA55DDE09935DB600F3E977 /* lavalite.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55DDD09935DB600F3E977 /* lavalite.c */; };
+ AFA55DE309935DFB00F3E977 /* marching.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55DE109935DFB00F3E977 /* marching.c */; };
+ AFA55E0509935E7E00F3E977 /* queens.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259000988A469000655EE /* queens.xml */; };
+ AFA55E0709935EB800F3E977 /* queens.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55E0609935EB800F3E977 /* queens.c */; };
+ AFA55E2109935F0B00F3E977 /* endgame.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2589B0988A468000655EE /* endgame.xml */; };
+ AFA55E2609935F2B00F3E977 /* chessmodels.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55E2309935F2B00F3E977 /* chessmodels.c */; };
+ AFA55E2709935F2B00F3E977 /* endgame.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55E2509935F2B00F3E977 /* endgame.c */; };
+ AFA55E4409935FBA00F3E977 /* glblur.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258B40988A468000655EE /* glblur.xml */; };
+ AFA55E4609935FD300F3E977 /* glblur.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55E4509935FD300F3E977 /* glblur.c */; };
+ AFA55E970993602F00F3E977 /* flyingtoasters.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258AD0988A468000655EE /* flyingtoasters.xml */; };
+ AFA55EAD0993608800F3E977 /* flyingtoasters.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55E980993608800F3E977 /* flyingtoasters.c */; };
+ AFA55EAE0993608800F3E977 /* toast.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55E990993608800F3E977 /* toast.c */; };
+ AFA55EB00993608800F3E977 /* toast2.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55E9B0993608800F3E977 /* toast2.c */; };
+ AFA55EB20993608800F3E977 /* toaster_base.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55E9D0993608800F3E977 /* toaster_base.c */; };
+ AFA55EB40993608800F3E977 /* toaster_handle.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55E9F0993608800F3E977 /* toaster_handle.c */; };
+ AFA55EB60993608800F3E977 /* toaster_handle2.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EA10993608800F3E977 /* toaster_handle2.c */; };
+ AFA55EB80993608800F3E977 /* toaster_jet.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EA30993608800F3E977 /* toaster_jet.c */; };
+ AFA55EBA0993608800F3E977 /* toaster_knob.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EA50993608800F3E977 /* toaster_knob.c */; };
+ AFA55EBC0993608800F3E977 /* toaster_slots.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EA70993608800F3E977 /* toaster_slots.c */; };
+ AFA55EBE0993608800F3E977 /* toaster_wing.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EA90993608800F3E977 /* toaster_wing.c */; };
+ AFA55EC00993608800F3E977 /* toaster.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EAB0993608800F3E977 /* toaster.c */; };
+ AFA55EE50993610F00F3E977 /* bouncingcow.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2587A0988A468000655EE /* bouncingcow.xml */; };
+ AFA55EEE0993613E00F3E977 /* bouncingcow.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EE70993613E00F3E977 /* bouncingcow.c */; };
+ AFA55EEF0993613E00F3E977 /* cow_face.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EE80993613E00F3E977 /* cow_face.c */; };
+ AFA55EF00993613E00F3E977 /* cow_hide.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EE90993613E00F3E977 /* cow_hide.c */; };
+ AFA55EF10993613E00F3E977 /* cow_hoofs.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EEA0993613E00F3E977 /* cow_hoofs.c */; };
+ AFA55EF20993613E00F3E977 /* cow_horns.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EEB0993613E00F3E977 /* cow_horns.c */; };
+ AFA55EF30993613E00F3E977 /* cow_tail.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EEC0993613E00F3E977 /* cow_tail.c */; };
+ AFA55EF40993613E00F3E977 /* cow_udder.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55EED0993613E00F3E977 /* cow_udder.c */; };
+ AFA55F20099361E800F3E977 /* jigglypuff.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258CE0988A468000655EE /* jigglypuff.xml */; };
+ AFA55F220993620200F3E977 /* jigglypuff.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55F210993620200F3E977 /* jigglypuff.c */; };
+ AFA55F3E0993625B00F3E977 /* klein.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258D40988A468000655EE /* klein.xml */; };
+ AFA55F400993626E00F3E977 /* klein.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55F3F0993626E00F3E977 /* klein.c */; };
+ AFA55F57099362C500F3E977 /* hypertorus.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258C80988A468000655EE /* hypertorus.xml */; };
+ AFA55F5A099362DF00F3E977 /* hypertorus.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55F59099362DF00F3E977 /* hypertorus.c */; };
+ AFA55F860993646900F3E977 /* glmatrix.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258B90988A468000655EE /* glmatrix.xml */; };
+ AFA55F880993648500F3E977 /* glmatrix.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55F870993648500F3E977 /* glmatrix.c */; };
+ AFA55FF209936C2F00F3E977 /* cubestorm.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258900988A468000655EE /* cubestorm.xml */; };
+ AFA55FF409936C4500F3E977 /* cubestorm.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55FF309936C4500F3E977 /* cubestorm.c */; };
+ AFA5600D09936C9D00F3E977 /* glknots.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258B80988A468000655EE /* glknots.xml */; };
+ AFA5600F09936CB300F3E977 /* glknots.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5600E09936CB300F3E977 /* glknots.c */; };
+ AFA5602809936CF700F3E977 /* blocktube.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258770988A468000655EE /* blocktube.xml */; };
+ AFA5602A09936D0700F3E977 /* blocktube.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5602909936D0700F3E977 /* blocktube.c */; };
+ AFA5604609936DAB00F3E977 /* flipflop.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258A70988A468000655EE /* flipflop.xml */; };
+ AFA5604809936DCC00F3E977 /* flipflop.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5604709936DCC00F3E977 /* flipflop.c */; };
+ AFA5607B09936FDD00F3E977 /* antspotlight.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5607809936FDD00F3E977 /* antspotlight.c */; };
+ AFA5608109936FFA00F3E977 /* antinspect.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5605F09936E9C00F3E977 /* antinspect.c */; };
+ AFA560820993700500F3E977 /* antinspect.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2586B0988A468000655EE /* antinspect.xml */; };
+ AFA560830993700900F3E977 /* antspotlight.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2586D0988A468000655EE /* antspotlight.xml */; };
+ AFA560C2099371BE00F3E977 /* polytopes.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258F90988A469000655EE /* polytopes.xml */; };
+ AFA560C4099371D500F3E977 /* polytopes.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA560C3099371D500F3E977 /* polytopes.c */; };
+ AFA561110993784D00F3E977 /* molecule.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258E70988A469000655EE /* molecule.xml */; };
+ AFA561130993786800F3E977 /* molecule.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA561120993786800F3E977 /* molecule.c */; };
+ AFA5616C09937C6800F3E977 /* blinkbox.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258750988A468000655EE /* blinkbox.xml */; };
+ AFA5616E09937C9A00F3E977 /* blinkbox.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5616D09937C9A00F3E977 /* blinkbox.c */; };
+ AFA5618F09937D2100F3E977 /* noof.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258EC0988A469000655EE /* noof.xml */; };
+ AFA5619109937D3600F3E977 /* noof.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5619009937D3600F3E977 /* noof.c */; };
+ AFA561B109937DB400F3E977 /* polyhedra.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258F70988A469000655EE /* polyhedra.xml */; };
+ AFA561B509937DCC00F3E977 /* polyhedra-gl.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA561B209937DCB00F3E977 /* polyhedra-gl.c */; };
+ AFA561B609937DCC00F3E977 /* polyhedra.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA561B309937DCC00F3E977 /* polyhedra.c */; };
+ AFA5621B099384DA00F3E977 /* providence.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258FC0988A469000655EE /* providence.xml */; };
+ AFA5621D099384F600F3E977 /* providence.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5621C099384F600F3E977 /* providence.c */; };
+ AFA562330993855500F3E977 /* pinion.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258F50988A469000655EE /* pinion.xml */; };
+ AFA562350993856A00F3E977 /* pinion.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA562340993856A00F3E977 /* pinion.c */; };
+ AFA562D3099392F900F3E977 /* boing.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258780988A468000655EE /* boing.xml */; };
+ AFA562D50993930C00F3E977 /* boing.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA562D40993930C00F3E977 /* boing.c */; };
+ AFA562EE0993940400F3E977 /* antmaze.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2586C0988A468000655EE /* antmaze.xml */; };
+ AFA562F00993941600F3E977 /* antmaze.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA562EF0993941600F3E977 /* antmaze.c */; };
+ AFA563060993947300F3E977 /* tangram.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259220988A469000655EE /* tangram.xml */; };
+ AFA5630A0993948F00F3E977 /* tangram_shapes.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA563070993948F00F3E977 /* tangram_shapes.c */; };
+ AFA5630B0993948F00F3E977 /* tangram.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA563090993948F00F3E977 /* tangram.c */; };
+ AFA563280993955000F3E977 /* crackberg.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2588B0988A468000655EE /* crackberg.xml */; };
+ AFA5632A0993957100F3E977 /* crackberg.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA563290993957100F3E977 /* crackberg.c */; };
+ AFA563740993977100F3E977 /* glhanoi.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258B70988A468000655EE /* glhanoi.xml */; };
+ AFA563750993977D00F3E977 /* glhanoi.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA563460993963400F3E977 /* glhanoi.c */; };
+ AFA563760993978D00F3E977 /* cube21.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA563660993970F00F3E977 /* cube21.c */; };
+ AFA563770993979A00F3E977 /* cube21.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2588E0988A468000655EE /* cube21.xml */; };
+ AFA5638D099397ED00F3E977 /* timetunnel.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259240988A469000655EE /* timetunnel.xml */; };
+ AFA5638F0993980D00F3E977 /* timetunnel.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5638E0993980D00F3E977 /* timetunnel.c */; };
+ AFA563B8099398F700F3E977 /* juggler3d.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258D10988A468000655EE /* juggler3d.xml */; };
+ AFA563BA0993991300F3E977 /* juggler3d.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA563B90993991300F3E977 /* juggler3d.c */; };
+ AFA6AAF720999950006D2685 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFA6AAF920999950006D2685 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AFA6AAFA20999950006D2685 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AFA6AAFB20999950006D2685 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AFA6AAFC20999950006D2685 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AFA6AAFD20999950006D2685 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AFA6AAFE20999950006D2685 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ AFA6AAFF20999950006D2685 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AFA6AB0D20999A60006D2685 /* glitchpeg.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFA6AB0C20999A60006D2685 /* glitchpeg.xml */; };
+ AFA6AB0F20999A7B006D2685 /* glitchpeg.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA6AB0E20999A7B006D2685 /* glitchpeg.c */; };
+ AFAA6B451773F07800DE720C /* ios-function-table.m in Sources */ = {isa = PBXBuildFile; fileRef = AFAA6B441773F07700DE720C /* ios-function-table.m */; };
+ AFAAE38E207D6343007A515C /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFAAE390207D6343007A515C /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AFAAE391207D6343007A515C /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AFAAE392207D6343007A515C /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AFAAE393207D6343007A515C /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AFAAE394207D6343007A515C /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AFAAE395207D6343007A515C /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ AFAAE396207D6343007A515C /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AFAAE39F207D6420007A515C /* maze3d.c in Sources */ = {isa = PBXBuildFile; fileRef = AFAAE39E207D6420007A515C /* maze3d.c */; };
+ AFAAE3A0207D6420007A515C /* maze3d.c in Sources */ = {isa = PBXBuildFile; fileRef = AFAAE39E207D6420007A515C /* maze3d.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AFAAE3A2207D6439007A515C /* maze3d.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFAAE3A1207D6438007A515C /* maze3d.xml */; };
+ AFAAE3A3207D6439007A515C /* maze3d.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFAAE3A1207D6438007A515C /* maze3d.xml */; };
+ AFACE87A1CC83458008B24CD /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFACE87C1CC83458008B24CD /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AFACE87D1CC83458008B24CD /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AFACE87E1CC83458008B24CD /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AFACE87F1CC83458008B24CD /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AFACE8801CC83458008B24CD /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AFACE8811CC83458008B24CD /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ AFACE8821CC83458008B24CD /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AFACE88C1CC835F7008B24CD /* energystream.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFACE88B1CC83578008B24CD /* energystream.xml */; };
+ AFACE88D1CC83608008B24CD /* energystream.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFACE88B1CC83578008B24CD /* energystream.xml */; };
+ AFACE88E1CC83613008B24CD /* energystream.c in Sources */ = {isa = PBXBuildFile; fileRef = AFACE88A1CC83578008B24CD /* energystream.c */; };
+ AFACE88F1CC83617008B24CD /* energystream.c in Sources */ = {isa = PBXBuildFile; fileRef = AFACE88A1CC83578008B24CD /* energystream.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AFAD462309D5F4DA00AB5F95 /* grabclient.c in Sources */ = {isa = PBXBuildFile; fileRef = AFAD462209D5F4DA00AB5F95 /* grabclient.c */; };
+ AFB591AE178B812C00EA4005 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFB591B0178B812C00EA4005 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AFB591B1178B812C00EA4005 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AFB591B2178B812C00EA4005 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AFB591B3178B812C00EA4005 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AFB591B4178B812C00EA4005 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AFB591BE178B81E600EA4005 /* hexadrop.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFB591BC178B81E600EA4005 /* hexadrop.xml */; };
+ AFB591BF178B81E600EA4005 /* hexadrop.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFB591BC178B81E600EA4005 /* hexadrop.xml */; };
+ AFB591C0178B81E600EA4005 /* hexadrop.c in Sources */ = {isa = PBXBuildFile; fileRef = AFB591BD178B81E600EA4005 /* hexadrop.c */; };
+ AFB591C1178B81E600EA4005 /* hexadrop.c in Sources */ = {isa = PBXBuildFile; fileRef = AFB591BD178B81E600EA4005 /* hexadrop.c */; };
+ AFB8A69B1782BA34004EDB85 /* kaleidocycle.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFB8A69A1782BA34004EDB85 /* kaleidocycle.xml */; };
+ AFB8A69C1782BF6C004EDB85 /* kaleidocycle.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFB8A69A1782BA34004EDB85 /* kaleidocycle.xml */; };
+ AFB8A69D1782BFA6004EDB85 /* kaleidocycle.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7511141782B64300380EA1 /* kaleidocycle.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AFBE744019A7C6930018AA35 /* robot.c in Sources */ = {isa = PBXBuildFile; fileRef = AFBE743F19A7C6930018AA35 /* robot.c */; };
+ AFBE744119A7C6EF0018AA35 /* robot.c in Sources */ = {isa = PBXBuildFile; fileRef = AFBE743F19A7C6930018AA35 /* robot.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AFBF893E0E41D930006A2D66 /* fps.c in Sources */ = {isa = PBXBuildFile; fileRef = AFBF893C0E41D930006A2D66 /* fps.c */; };
+ AFBF893F0E41D930006A2D66 /* fps.h in Headers */ = {isa = PBXBuildFile; fileRef = AFBF893D0E41D930006A2D66 /* fps.h */; };
+ AFBF89AF0E423FC3006A2D66 /* fps-gl.c in Sources */ = {isa = PBXBuildFile; fileRef = AFBF89AE0E423FC3006A2D66 /* fps-gl.c */; };
+ AFBF89B20E424036006A2D66 /* fpsI.h in Headers */ = {isa = PBXBuildFile; fileRef = AFBF89B10E424036006A2D66 /* fpsI.h */; };
+ AFBFE74F178642DC00432B21 /* SaverRunner.nib in Resources */ = {isa = PBXBuildFile; fileRef = AF9772E10989DFC6001F8B92 /* SaverRunner.nib */; };
+ AFBFE750178642DC00432B21 /* SaverRunner.icns in Resources */ = {isa = PBXBuildFile; fileRef = AF2D522513E954A0002AA818 /* SaverRunner.icns */; };
+ AFBFE752178642DC00432B21 /* SaverRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD400981E32E00F7970E /* SaverRunner.m */; };
+ AFBFE753178642DC00432B21 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
+ AFBFE754178642DC00432B21 /* SaverListController.m in Sources */ = {isa = PBXBuildFile; fileRef = AF84AF1E15829AF000607E4C /* SaverListController.m */; };
+ AFBFE756178642DC00432B21 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AFBFE757178642DC00432B21 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AFBFE758178642DC00432B21 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AFBFE759178642DC00432B21 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AFBFE765178643B200432B21 /* Apple2.saver in Resources */ = {isa = PBXBuildFile; fileRef = AF9D4DFE09B5BB19006E59CF /* Apple2.saver */; };
+ AFBFE76F178647FE00432B21 /* SaverRunner.nib in Resources */ = {isa = PBXBuildFile; fileRef = AF9772E10989DFC6001F8B92 /* SaverRunner.nib */; };
+ AFBFE770178647FE00432B21 /* SaverRunner.icns in Resources */ = {isa = PBXBuildFile; fileRef = AF2D522513E954A0002AA818 /* SaverRunner.icns */; };
+ AFBFE772178647FE00432B21 /* SaverRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = AFE1FD400981E32E00F7970E /* SaverRunner.m */; };
+ AFBFE773178647FE00432B21 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
+ AFBFE774178647FE00432B21 /* SaverListController.m in Sources */ = {isa = PBXBuildFile; fileRef = AF84AF1E15829AF000607E4C /* SaverListController.m */; };
+ AFBFE776178647FE00432B21 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AFBFE777178647FE00432B21 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AFBFE778178647FE00432B21 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AFBFE779178647FE00432B21 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AFBFE7831786483B00432B21 /* Phosphor.saver in Resources */ = {isa = PBXBuildFile; fileRef = AF7776F609B63ABF00EA3033 /* Phosphor.saver */; };
+ AFC0E8B21CDC601A008CAFAC /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFC0E8B41CDC601A008CAFAC /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AFC0E8B51CDC601A008CAFAC /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AFC0E8B61CDC601A008CAFAC /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AFC0E8B71CDC601A008CAFAC /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AFC0E8B81CDC601A008CAFAC /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AFC0E8B91CDC601A008CAFAC /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ AFC0E8BA1CDC601A008CAFAC /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AFC0E8C41CDC60B0008CAFAC /* hydrostat.c in Sources */ = {isa = PBXBuildFile; fileRef = AFC0E8C21CDC60A9008CAFAC /* hydrostat.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AFC0E8C51CDC60D6008CAFAC /* hydrostat.c in Sources */ = {isa = PBXBuildFile; fileRef = AFC0E8C21CDC60A9008CAFAC /* hydrostat.c */; };
+ AFC0E8C61CDC60DB008CAFAC /* hydrostat.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC0E8C31CDC60A9008CAFAC /* hydrostat.xml */; };
+ AFC0E8C71CDC60DE008CAFAC /* hydrostat.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC0E8C31CDC60A9008CAFAC /* hydrostat.xml */; };
+ AFC211950E4E30C800D87B6E /* teapot.c in Sources */ = {isa = PBXBuildFile; fileRef = AFC211930E4E30C800D87B6E /* teapot.c */; };
+ AFC43E741C68364B00C89999 /* PxPlus_IBM_VGA8.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AFC43E731C68364B00C89999 /* PxPlus_IBM_VGA8.ttf */; };
+ AFC43E771C684BE400C89999 /* PxPlus_IBM_VGA8.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AFC43E731C68364B00C89999 /* PxPlus_IBM_VGA8.ttf */; };
+ AFC43E7B1C6AA77900C89999 /* YearlReg.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AFEC68381BD6CDF9004C1B64 /* YearlReg.ttf */; };
+ AFC43E7C1C6AA78800C89999 /* OCRAStd.otf in Resources */ = {isa = PBXBuildFile; fileRef = AFEC68361BD6CA85004C1B64 /* OCRAStd.otf */; };
+ AFC523C31FED9420001C300A /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AFC5CFDD2044AA23004CEB5E /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFC5CFDF2044AA23004CEB5E /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AFC5CFE02044AA23004CEB5E /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AFC5CFE12044AA23004CEB5E /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AFC5CFE22044AA23004CEB5E /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AFC5CFE32044AA23004CEB5E /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AFC5CFE42044AA23004CEB5E /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ AFC5CFE52044AA23004CEB5E /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AFC5CFEF2044AB04004CEB5E /* quickhull.c in Sources */ = {isa = PBXBuildFile; fileRef = AFC5CFED2044AB03004CEB5E /* quickhull.c */; };
+ AFC5CFF02044AB04004CEB5E /* quickhull.c in Sources */ = {isa = PBXBuildFile; fileRef = AFC5CFED2044AB03004CEB5E /* quickhull.c */; };
+ AFC5CFF12044AB04004CEB5E /* crumbler.c in Sources */ = {isa = PBXBuildFile; fileRef = AFC5CFEE2044AB03004CEB5E /* crumbler.c */; };
+ AFC5CFF22044AB04004CEB5E /* crumbler.c in Sources */ = {isa = PBXBuildFile; fileRef = AFC5CFEE2044AB03004CEB5E /* crumbler.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AFC5CFF42044AB28004CEB5E /* crumbler.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC5CFF32044AB27004CEB5E /* crumbler.xml */; };
+ AFC5CFF52044AB28004CEB5E /* crumbler.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC5CFF32044AB27004CEB5E /* crumbler.xml */; };
+ AFC7592D158D8E8B00C5458E /* textclient.c in Sources */ = {isa = PBXBuildFile; fileRef = AFC7592B158D8E8B00C5458E /* textclient.c */; };
+ AFC7592E158D8E8B00C5458E /* textclient.h in Headers */ = {isa = PBXBuildFile; fileRef = AFC7592C158D8E8B00C5458E /* textclient.h */; };
+ AFC75930158D9A7A00C5458E /* textclient-ios.m in Sources */ = {isa = PBXBuildFile; fileRef = AFC7592F158D9A7A00C5458E /* textclient-ios.m */; };
+ AFCCCBB009BFE4B000353F4D /* rdbomb.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFCCCBAD09BFE4B000353F4D /* rdbomb.xml */; };
+ AFCCCBB309BFE51900353F4D /* thornbird.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259230988A469000655EE /* thornbird.xml */; };
+ AFCF453715986A2100E6E8CC /* dnalogo.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77787609B653DC00EA3033 /* dnalogo.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AFCF453815986A3000E6E8CC /* dnalogo.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF77787909B6545E00EA3033 /* dnalogo.xml */; };
+ AFCF4545159878C300E6E8CC /* polyhedra-gl.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA561B209937DCB00F3E977 /* polyhedra-gl.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AFCF4546159878C300E6E8CC /* polyhedra.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA561B309937DCC00F3E977 /* polyhedra.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AFCF4547159878D500E6E8CC /* polyhedra.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258F70988A469000655EE /* polyhedra.xml */; };
+ AFCF509C198A1861005B0DB1 /* involute.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE6A16A0CDD78EA002805BF /* involute.c */; };
+ AFCF509D198C3612005B0DB1 /* xscreensaver-text in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF0B09CA6FF900EE1051 /* xscreensaver-text */; };
+ AFCF83421AF5B515008BB7E1 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFCF83441AF5B515008BB7E1 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AFCF83451AF5B515008BB7E1 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AFCF83461AF5B515008BB7E1 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AFCF83471AF5B515008BB7E1 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AFCF83481AF5B515008BB7E1 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AFCF83491AF5B515008BB7E1 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ AFCF834A1AF5B515008BB7E1 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AFCF83551AF5B5FD008BB7E1 /* splitflap.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFCF83521AF5B5FD008BB7E1 /* splitflap.xml */; };
+ AFCF83561AF5B5FD008BB7E1 /* splitflap.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFCF83521AF5B5FD008BB7E1 /* splitflap.xml */; };
+ AFCF83571AF5B5FD008BB7E1 /* splitflap_obj.c in Sources */ = {isa = PBXBuildFile; fileRef = AFCF83531AF5B5FD008BB7E1 /* splitflap_obj.c */; };
+ AFCF83581AF5B5FD008BB7E1 /* splitflap_obj.c in Sources */ = {isa = PBXBuildFile; fileRef = AFCF83531AF5B5FD008BB7E1 /* splitflap_obj.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AFCF83591AF5B5FD008BB7E1 /* splitflap.c in Sources */ = {isa = PBXBuildFile; fileRef = AFCF83541AF5B5FD008BB7E1 /* splitflap.c */; };
+ AFCF835A1AF5B5FD008BB7E1 /* splitflap.c in Sources */ = {isa = PBXBuildFile; fileRef = AFCF83541AF5B5FD008BB7E1 /* splitflap.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AFCFF1D90CE4517C00C7D111 /* involute.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE6A16A0CDD78EA002805BF /* involute.c */; };
+ AFCFF1DA0CE4518B00C7D111 /* tube.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480ED2098F652A00FB32B8 /* tube.c */; };
+ AFCFF1DB0CE451A300C7D111 /* normals.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55A93099336D800F3E977 /* normals.c */; };
+ AFD51B200F063B4A00471C02 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; };
+ AFD51B220F063B4A00471C02 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD51DB70F063BCE00471C02 /* photopile.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD51DB60F063BCE00471C02 /* photopile.c */; };
+ AFD51DB90F063BE700471C02 /* photopile.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFD51DB80F063BE700471C02 /* photopile.xml */; };
+ AFD56DF80996A03800BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD56E090996A07A00BA26F7 /* gltext.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD56E080996A07A00BA26F7 /* gltext.c */; };
+ AFD56E9F0996A23800BA26F7 /* gltext.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258BD0988A468000655EE /* gltext.xml */; };
+ AFD56EB50996A72600BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD56EE00996A95700BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD56EEE0996A99E00BA26F7 /* forest.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD56EED0996A99E00BA26F7 /* forest.c */; };
+ AFD56F110996AAFA00BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD56F1D0996AB1D00BA26F7 /* forest.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258AF0988A468000655EE /* forest.xml */; };
+ AFD56F1E0996AB4000BA26F7 /* vines.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2592A0988A469000655EE /* vines.xml */; };
+ AFD56F200996AB5A00BA26F7 /* vines.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD56F1F0996AB5A00BA26F7 /* vines.c */; };
+ AFD56F290996AB8A00BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD56F350996ABB300BA26F7 /* galaxy.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258B10988A468000655EE /* galaxy.xml */; };
+ AFD56F370996ABD200BA26F7 /* galaxy.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD56F360996ABD200BA26F7 /* galaxy.c */; };
+ AFD56F550996AEEE00BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD56F610996AF1500BA26F7 /* grav.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258C00988A468000655EE /* grav.xml */; };
+ AFD56F630996AF2D00BA26F7 /* grav.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD56F620996AF2D00BA26F7 /* grav.c */; };
+ AFD56F710996B01600BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD56F870996B04D00BA26F7 /* hopalong.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258C50988A468000655EE /* hopalong.xml */; };
+ AFD56F890996B06600BA26F7 /* hopalong.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD56F880996B06600BA26F7 /* hopalong.c */; };
+ AFD56F920996B09400BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD56F9F0996B0D000BA26F7 /* laser.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258D70988A468000655EE /* laser.xml */; };
+ AFD56FA10996B0E500BA26F7 /* laser.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD56FA00996B0E500BA26F7 /* laser.c */; };
+ AFD56FA90996B10F00BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD56FB50996B15000BA26F7 /* lightning.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258D90988A468000655EE /* lightning.xml */; };
+ AFD56FB70996B16300BA26F7 /* lightning.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD56FB60996B16300BA26F7 /* lightning.c */; };
+ AFD56FBF0996B18F00BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD56FCB0996B1BE00BA26F7 /* lisa.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258DA0988A468000655EE /* lisa.xml */; };
+ AFD56FCD0996B1D600BA26F7 /* lisa.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD56FCC0996B1D600BA26F7 /* lisa.c */; };
+ AFD56FD50996B20900BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD56FE10996B24B00BA26F7 /* lissie.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258DB0988A468000655EE /* lissie.xml */; };
+ AFD56FE30996B26200BA26F7 /* lissie.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD56FE20996B26200BA26F7 /* lissie.c */; };
+ AFD56FFE0996B43800BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD5700B0996B47E00BA26F7 /* penrose.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258F10988A469000655EE /* penrose.xml */; };
+ AFD5700D0996B49D00BA26F7 /* penrose.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD5700C0996B49D00BA26F7 /* penrose.c */; };
+ AFD570150996B4CC00BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD570210996B51100BA26F7 /* sierpinski.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2590B0988A469000655EE /* sierpinski.xml */; };
+ AFD570230996B52700BA26F7 /* sierpinski.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD570220996B52700BA26F7 /* sierpinski.c */; };
+ AFD5702C0996B56D00BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD5703A0996B5D000BA26F7 /* sphere.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259110988A469000655EE /* sphere.xml */; };
+ AFD5703C0996B5E300BA26F7 /* sphere.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD5703B0996B5E300BA26F7 /* sphere.c */; };
+ AFD570490996B61600BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD570550996B65A00BA26F7 /* spiral.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259140988A469000655EE /* spiral.xml */; };
+ AFD570570996B67600BA26F7 /* spiral.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD570560996B67600BA26F7 /* spiral.c */; };
+ AFD5705F0996B6A300BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD5706B0996B6E700BA26F7 /* fadeplot.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258A10988A468000655EE /* fadeplot.xml */; };
+ AFD5706D0996B70000BA26F7 /* fadeplot.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD5706C0996B70000BA26F7 /* fadeplot.c */; };
+ AFD570750996B72700BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD570810996B77F00BA26F7 /* mountain.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258E90988A469000655EE /* mountain.xml */; };
+ AFD570830996B79300BA26F7 /* mountain.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD570820996B79300BA26F7 /* mountain.c */; };
+ AFD5708B0996B80300BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD570970996B84E00BA26F7 /* triangle.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259250988A469000655EE /* triangle.xml */; };
+ AFD570990996B86200BA26F7 /* triangle.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD570980996B86200BA26F7 /* triangle.c */; };
+ AFD570A10996B88E00BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD570AD0996B8DC00BA26F7 /* worm.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259300988A469000655EE /* worm.xml */; };
+ AFD570AF0996B8EF00BA26F7 /* worm.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD570AE0996B8EF00BA26F7 /* worm.c */; };
+ AFD570B70996B93000BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD570C30996B96F00BA26F7 /* rotor.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259060988A469000655EE /* rotor.xml */; };
+ AFD570C50996B98500BA26F7 /* rotor.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD570C40996B98500BA26F7 /* rotor.c */; };
+ AFD570CF0996B9F800BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD570DD0996BA4600BA26F7 /* ant.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2586A0988A468000655EE /* ant.xml */; };
+ AFD570DF0996BA5D00BA26F7 /* ant.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD570DE0996BA5C00BA26F7 /* ant.c */; };
+ AFD570F00996BBBF00BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD570FE0996BC2000BA26F7 /* flow.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258AA0988A468000655EE /* flow.xml */; };
+ AFD571020996BC3800BA26F7 /* flow.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD571010996BC3800BA26F7 /* flow.c */; };
+ AFD571190996BE9300BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD571270996BEE100BA26F7 /* discrete.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258970988A468000655EE /* discrete.xml */; };
+ AFD571290996BEF700BA26F7 /* discrete.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD571280996BEF700BA26F7 /* discrete.c */; };
+ AFD571320996BF2E00BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD5713E0996BFA500BA26F7 /* apollonian.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2586E0988A468000655EE /* apollonian.xml */; };
+ AFD571400996BFBE00BA26F7 /* apollonian.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD5713F0996BFBE00BA26F7 /* apollonian.c */; };
+ AFD571490996C01700BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD571550996C05F00BA26F7 /* euler2d.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2589F0988A468000655EE /* euler2d.xml */; };
+ AFD571570996C07F00BA26F7 /* euler2d.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD571560996C07F00BA26F7 /* euler2d.c */; };
+ AFD5715F0996C0CE00BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD5716C0996C16700BA26F7 /* thornbird.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD5716B0996C16700BA26F7 /* thornbird.c */; };
+ AFD571BB0996D9DC00BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD571C70996DA3300BA26F7 /* juggle.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258D00988A468000655EE /* juggle.xml */; };
+ AFD571C90996DA4600BA26F7 /* juggle.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD571C80996DA4600BA26F7 /* juggle.c */; };
+ AFD572280996E4A300BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD572340996E52B00BA26F7 /* swirl.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259200988A469000655EE /* swirl.xml */; };
+ AFD572360996E53E00BA26F7 /* swirl.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD572350996E53E00BA26F7 /* swirl.c */; };
+ AFD572730996EE8500BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD5727F0996EF1900BA26F7 /* polyominoes.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258F80988A469000655EE /* polyominoes.xml */; };
+ AFD572810996EF2B00BA26F7 /* polyominoes.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD572800996EF2B00BA26F7 /* polyominoes.c */; };
+ AFD572AB0996F99600BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD572B80996FAF900BA26F7 /* bouboule.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258790988A468000655EE /* bouboule.xml */; };
+ AFD572BA0996FB3D00BA26F7 /* bouboule.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD572B90996FB3D00BA26F7 /* bouboule.c */; };
+ AFD572C80996FC0F00BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD572EC0997005900BA26F7 /* crystal.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2588D0988A468000655EE /* crystal.xml */; };
+ AFD572EE0997006E00BA26F7 /* crystal.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD572ED0997006E00BA26F7 /* crystal.c */; };
+ AFD572FF099701C000BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD5730B099702AF00BA26F7 /* julia.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258D20988A468000655EE /* julia.xml */; };
+ AFD5730D099702C800BA26F7 /* julia.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD5730C099702C800BA26F7 /* julia.c */; };
+ AFD573630997411200BA26F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD573700997418D00BA26F7 /* strange.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2591D0988A469000655EE /* strange.xml */; };
+ AFD57372099741A200BA26F7 /* strange.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD57371099741A200BA26F7 /* strange.c */; };
+ AFD77E6220C23F8600A3638D /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFD77E6420C23F8600A3638D /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AFD77E6520C23F8600A3638D /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AFD77E6620C23F8600A3638D /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AFD77E6720C23F8600A3638D /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AFD77E6820C23F8600A3638D /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AFD77E6920C23F8600A3638D /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ AFD77E6A20C23F8600A3638D /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AFD77E7320C2418000A3638D /* filmleader.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD77E7220C2417F00A3638D /* filmleader.c */; };
+ AFD77E7420C2418000A3638D /* filmleader.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD77E7220C2417F00A3638D /* filmleader.c */; };
+ AFD77E7520C2418000A3638D /* filmleader.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD77E7220C2417F00A3638D /* filmleader.c */; };
+ AFD77E7720C2419600A3638D /* filmleader.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFD77E7620C2419600A3638D /* filmleader.xml */; };
+ AFD77E7820C2419600A3638D /* filmleader.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFD77E7620C2419600A3638D /* filmleader.xml */; };
+ AFD9D5BE201E686B0070E99D /* ships.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD9D5BD201E686A0070E99D /* ships.c */; };
+ AFD9D5BF201E686B0070E99D /* ships.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD9D5BD201E686A0070E99D /* ships.c */; };
+ AFD9D5C0201E686B0070E99D /* ships.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD9D5BD201E686A0070E99D /* ships.c */; };
+ AFDA11251934424D003D397F /* aligned_malloc.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDA11211934424D003D397F /* aligned_malloc.c */; };
+ AFDA11261934424D003D397F /* aligned_malloc.h in Headers */ = {isa = PBXBuildFile; fileRef = AFDA11221934424D003D397F /* aligned_malloc.h */; };
+ AFDA11271934424D003D397F /* thread_util.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDA11231934424D003D397F /* thread_util.c */; };
+ AFDA11281934424D003D397F /* thread_util.h in Headers */ = {isa = PBXBuildFile; fileRef = AFDA11241934424D003D397F /* thread_util.h */; };
+ AFDA6595178A52B70070D24B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFDA6597178A52B70070D24B /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AFDA6598178A52B70070D24B /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AFDA6599178A52B70070D24B /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AFDA659A178A52B70070D24B /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AFDA659B178A52B70070D24B /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AFDA65A5178A541A0070D24B /* unknownpleasures.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFDA65A3178A541A0070D24B /* unknownpleasures.xml */; };
+ AFDA65A6178A541A0070D24B /* unknownpleasures.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFDA65A3178A541A0070D24B /* unknownpleasures.xml */; };
+ AFDA65A7178A541A0070D24B /* unknownpleasures.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDA65A4178A541A0070D24B /* unknownpleasures.c */; };
+ AFDA65A8178A541A0070D24B /* unknownpleasures.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDA65A4178A541A0070D24B /* unknownpleasures.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AFDDCCEC19FF0D170072365B /* involute.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE6A16A0CDD78EA002805BF /* involute.c */; };
+ AFDDCCED19FF0EBD0072365B /* geodesicgears.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7ACFD619FF0B7A00BD752B /* geodesicgears.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AFE2A45C0E2E904600ADB298 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFE2A4730E2E90E300ADB298 /* skytentacles.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE2A4720E2E90E300ADB298 /* skytentacles.c */; };
+ AFE2A4750E2E911200ADB298 /* skytentacles.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFE2A4740E2E911200ADB298 /* skytentacles.xml */; };
+ AFE30BEE0E52B14700CCF4A5 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFE30BFE0E52B18300CCF4A5 /* sonar.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2590F0988A469000655EE /* sonar.xml */; };
+ AFE30C020E52B1DC00CCF4A5 /* sonar-icmp.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE30BFF0E52B1DC00CCF4A5 /* sonar-icmp.c */; };
+ AFE30C030E52B1DC00CCF4A5 /* sonar-sim.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE30C000E52B1DC00CCF4A5 /* sonar-sim.c */; };
+ AFE30C040E52B1DC00CCF4A5 /* sonar.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE30C010E52B1DC00CCF4A5 /* sonar.c */; };
+ AFE349291B033A8200AF3D73 /* xscreensaver-text in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF0B09CA6FF900EE1051 /* xscreensaver-text */; };
+ AFE6A16C0CDD78EA002805BF /* involute.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE6A16A0CDD78EA002805BF /* involute.c */; };
+ AFE6A1890CDD7B2E002805BF /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFE6A18A0CDD7B2E002805BF /* involute.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE6A16A0CDD78EA002805BF /* involute.c */; };
+ AFE6A40C0CDD7BC3002805BF /* moebiusgears.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE6A40B0CDD7BC3002805BF /* moebiusgears.c */; };
+ AFE6A40E0CDD7BDC002805BF /* moebiusgears.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFE6A40D0CDD7BDC002805BF /* moebiusgears.xml */; };
+ AFE6A4220CDD7FAA002805BF /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFE6A4350CDD800F002805BF /* abstractile.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE6A4340CDD800F002805BF /* abstractile.c */; };
+ AFE6A4370CDD8027002805BF /* abstractile.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFE6A4360CDD8026002805BF /* abstractile.xml */; };
+ AFE943B119DD54C1000A5E6D /* xft.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE943AF19DD54C1000A5E6D /* xft.c */; };
+ AFE943B219DD54C1000A5E6D /* xft.h in Headers */ = {isa = PBXBuildFile; fileRef = AFE943B019DD54C1000A5E6D /* xft.h */; };
+ AFE943B519DDF97F000A5E6D /* utf8wc.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE943B319DDF97F000A5E6D /* utf8wc.c */; };
+ AFE943B619DDF97F000A5E6D /* utf8wc.h in Headers */ = {isa = PBXBuildFile; fileRef = AFE943B419DDF97F000A5E6D /* utf8wc.h */; };
+ AFEB9C37158FFF88003974F3 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AFEB9C3915900514003974F3 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3815900514003974F3 /* UIKit.framework */; };
+ AFEB9C3B1590054B003974F3 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3A1590054B003974F3 /* OpenGLES.framework */; };
+ AFEB9C3D15900558003974F3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3C15900558003974F3 /* Foundation.framework */; };
+ AFEB9C401590056A003974F3 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3E1590056A003974F3 /* CoreGraphics.framework */; };
+ AFEB9C411590056A003974F3 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3F1590056A003974F3 /* QuartzCore.framework */; };
+ AFEC23D41CB6EAE100DE138F /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFEC23D61CB6EAE100DE138F /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AFEC23D71CB6EAE100DE138F /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AFEC23D81CB6EAE100DE138F /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AFEC23D91CB6EAE100DE138F /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AFEC23DA1CB6EAE100DE138F /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AFEC23DB1CB6EAE100DE138F /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ AFEC23DC1CB6EAE100DE138F /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AFEC23E61CB6EC0400DE138F /* dymaxionmap.c in Sources */ = {isa = PBXBuildFile; fileRef = AFEC23E41CB6EBC400DE138F /* dymaxionmap.c */; };
+ AFEC23E71CB6EC0B00DE138F /* dymaxionmap.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFEC23E51CB6EBDA00DE138F /* dymaxionmap.xml */; };
+ AFEC23E81CB6EC6800DE138F /* dymaxionmap.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFEC23E51CB6EBDA00DE138F /* dymaxionmap.xml */; };
+ AFEC23E91CB6EC7F00DE138F /* dymaxionmap.c in Sources */ = {isa = PBXBuildFile; fileRef = AFEC23E41CB6EBC400DE138F /* dymaxionmap.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AFEC68371BD6CA85004C1B64 /* OCRAStd.otf in Resources */ = {isa = PBXBuildFile; fileRef = AFEC68361BD6CA85004C1B64 /* OCRAStd.otf */; };
+ AFEC68391BD6CDF9004C1B64 /* YearlReg.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AFEC68381BD6CDF9004C1B64 /* YearlReg.ttf */; };
+ AFEE10541D13406000AAC8F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFEE10561D13406000AAC8F7 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AFEE10571D13406000AAC8F7 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AFEE10581D13406000AAC8F7 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AFEE10591D13406000AAC8F7 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AFEE105A1D13406000AAC8F7 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AFEE105B1D13406000AAC8F7 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ AFEE105C1D13406000AAC8F7 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AFEE10661D1341F600AAC8F7 /* cubetwist.c in Sources */ = {isa = PBXBuildFile; fileRef = AFEE10641D1341E300AAC8F7 /* cubetwist.c */; };
+ AFEE10671D1341FA00AAC8F7 /* cubetwist.c in Sources */ = {isa = PBXBuildFile; fileRef = AFEE10641D1341E300AAC8F7 /* cubetwist.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AFEE10681D1341FE00AAC8F7 /* cubetwist.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFEE10651D1341E300AAC8F7 /* cubetwist.xml */; };
+ AFEE10691D13420700AAC8F7 /* cubetwist.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFEE10651D1341E300AAC8F7 /* cubetwist.xml */; };
+ AFEE10731D15EB0800AAC8F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFEE10751D15EB0800AAC8F7 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AFEE10761D15EB0800AAC8F7 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AFEE10771D15EB0800AAC8F7 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AFEE10781D15EB0800AAC8F7 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AFEE10791D15EB0800AAC8F7 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AFEE107A1D15EB0800AAC8F7 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ AFEE107B1D15EB0800AAC8F7 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AFEE10851D15EBB900AAC8F7 /* cubestack.c in Sources */ = {isa = PBXBuildFile; fileRef = AFEE10831D15EBA600AAC8F7 /* cubestack.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AFEE10861D15EBC800AAC8F7 /* cubestack.c in Sources */ = {isa = PBXBuildFile; fileRef = AFEE10831D15EBA600AAC8F7 /* cubestack.c */; };
+ AFEE10871D15EBD900AAC8F7 /* cubestack.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFEE10841D15EBA600AAC8F7 /* cubestack.xml */; };
+ AFEE10881D15EBDC00AAC8F7 /* cubestack.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFEE10841D15EBA600AAC8F7 /* cubestack.xml */; };
+ AFEE10921D17E20B00AAC8F7 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFEE10941D17E20B00AAC8F7 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AFEE10951D17E20B00AAC8F7 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AFEE10961D17E20B00AAC8F7 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AFEE10971D17E20B00AAC8F7 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AFEE10981D17E20B00AAC8F7 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AFEE10991D17E20B00AAC8F7 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ AFEE109A1D17E20B00AAC8F7 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AFEE10A41D17E2BA00AAC8F7 /* splodesic.c in Sources */ = {isa = PBXBuildFile; fileRef = AFEE10A21D17E2B300AAC8F7 /* splodesic.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AFEE10A51D17E2C500AAC8F7 /* splodesic.c in Sources */ = {isa = PBXBuildFile; fileRef = AFEE10A21D17E2B300AAC8F7 /* splodesic.c */; };
+ AFEE10A61D17E2C900AAC8F7 /* splodesic.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFEE10A31D17E2B300AAC8F7 /* splodesic.xml */; };
+ AFEE10A71D17E2CD00AAC8F7 /* splodesic.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFEE10A31D17E2B300AAC8F7 /* splodesic.xml */; };
+ AFF1BA0F19A96D8B0016A88D /* lament_model.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF1BA0E19A96D8B0016A88D /* lament_model.c */; };
+ AFF1BA1019A96D8B0016A88D /* lament_model.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF1BA0E19A96D8B0016A88D /* lament_model.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AFF2868617860E830050A578 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFF2868817860E830050A578 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AFF2868917860E830050A578 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AFF2868A17860E830050A578 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AFF2868B17860E830050A578 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AFF2868C17860E830050A578 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AFF28696178611720050A578 /* quasicrystal.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFF28694178611720050A578 /* quasicrystal.xml */; };
+ AFF28697178611720050A578 /* quasicrystal.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFF28694178611720050A578 /* quasicrystal.xml */; };
+ AFF28698178611720050A578 /* quasicrystal.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF28695178611720050A578 /* quasicrystal.c */; };
+ AFF28699178611720050A578 /* quasicrystal.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF28695178611720050A578 /* quasicrystal.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AFF3C9EF17CCAC440028F240 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFF3C9F117CCAC440028F240 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AFF3C9F217CCAC440028F240 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AFF3C9F317CCAC440028F240 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AFF3C9F417CCAC440028F240 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AFF3C9F517CCAC440028F240 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AFF3C9FE17CCAD9A0028F240 /* geodesic.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFF3C9FD17CCAD9A0028F240 /* geodesic.xml */; };
+ AFF3C9FF17CCAD9A0028F240 /* geodesic.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFF3C9FD17CCAD9A0028F240 /* geodesic.xml */; };
+ AFF3CA0317CCAEB70028F240 /* geodesic.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF3CA0217CCAEB70028F240 /* geodesic.c */; };
+ AFF3CA0417CCAEB70028F240 /* geodesic.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF3CA0217CCAEB70028F240 /* geodesic.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ AFF4633C0C4403E400EE6509 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFF4634A0C44044F00EE6509 /* cwaves.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF463490C44044E00EE6509 /* cwaves.c */; };
+ AFF4634C0C44046500EE6509 /* cwaves.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFF4634B0C44046500EE6509 /* cwaves.xml */; };
+ AFF4635F0C440AEF00EE6509 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFF463720C440B9200EE6509 /* glcells.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF463710C440B9200EE6509 /* glcells.c */; };
+ AFF463740C440BAC00EE6509 /* glcells.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFF463730C440BAC00EE6509 /* glcells.xml */; };
+ AFFAB31C19158CE40020F021 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ AFFAB31E19158CE40020F021 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ AFFAB31F19158CE40020F021 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ AFFAB32019158CE40020F021 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ AFFAB32119158CE40020F021 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ AFFAB32219158CE40020F021 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ AFFAB32319158CE40020F021 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ AFFAB32F19158E2A0020F021 /* projectiveplane.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFFAB32C19158E2A0020F021 /* projectiveplane.xml */; };
+ AFFAB33019158E2A0020F021 /* projectiveplane.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFFAB32C19158E2A0020F021 /* projectiveplane.xml */; };
+ AFFAB33219158EA80020F021 /* projectiveplane.c in Sources */ = {isa = PBXBuildFile; fileRef = AFFAB33119158EA80020F021 /* projectiveplane.c */; };
+ AFFAB33319158EA80020F021 /* projectiveplane.c in Sources */ = {isa = PBXBuildFile; fileRef = AFFAB33119158EA80020F021 /* projectiveplane.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+ CE3D01581B76F4C100993C75 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+ CE3D015A1B76F4C100993C75 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+ CE3D015B1B76F4C100993C75 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+ CE3D015C1B76F4C100993C75 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+ CE3D015D1B76F4C100993C75 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ CE3D015E1B76F4C100993C75 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+ CE3D015F1B76F4C100993C75 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CE3D01601B76F4C100993C75 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+ CE3D01691B76F88A00993C75 /* testx11.xml in Resources */ = {isa = PBXBuildFile; fileRef = CE3D01681B76F83E00993C75 /* testx11.xml */; };
+ CE3D016B1B76F93700993C75 /* testx11.c in Sources */ = {isa = PBXBuildFile; fileRef = CE3D016A1B76F8E200993C75 /* testx11.c */; };
+ CE43C2BF1C055157004C2BC6 /* jwxyz-cocoa.m in Sources */ = {isa = PBXBuildFile; fileRef = CE43C2BE1C055157004C2BC6 /* jwxyz-cocoa.m */; };
+ CE55645A1C25141000645458 /* jwxyz-gl.c in Sources */ = {isa = PBXBuildFile; fileRef = CE5564591C25141000645458 /* jwxyz-gl.c */; };
+ CE8EA1C21C35CF10002D1020 /* jwxyz-common.c in Sources */ = {isa = PBXBuildFile; fileRef = CE8EA1C11C35CF10002D1020 /* jwxyz-common.c */; };
+ CE9289D319BD00E300961F22 /* async_netdb.c in Sources */ = {isa = PBXBuildFile; fileRef = CE9289D119BD00E200961F22 /* async_netdb.c */; };
+ CE9289D419BD00E300961F22 /* async_netdb.h in Headers */ = {isa = PBXBuildFile; fileRef = CE9289D219BD00E300961F22 /* async_netdb.h */; };
+ CEE0BC621A6B0D6200C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC631A6B0D8100C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC641A6B0DA100C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC661A6B0DBF00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC671A6B0E0600C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC681A6B0E1800C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC691A6B0E2D00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC6A1A6B0E3800C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC6B1A6B0E4200C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC6C1A6B0E4B00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC6D1A6B0E5400C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC6E1A6B0E5E00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC6F1A6B0E6700C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC701A6B0E7200C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC711A6B0E7D00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC721A6B0E8800C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC731A6B0E9200C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC741A6B0E9B00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC751A6B0EA500C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC761A6B0EAE00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC771A6B0ED300C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC781A6B0EDD00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC791A6B0EE700C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC7A1A6B0EF100C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC7B1A6B0EFB00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC7C1A6B0F0400C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC7D1A6B0F0D00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC7E1A6B0F1600C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC7F1A6B0F1F00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC801A6B0F2900C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC811A6B0F3200C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC821A6B0F3C00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC831A6B0F4500C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC841A6B0F5400C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC851A6B0F5D00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC861A6B0F6700C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC871A6B0F7000C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC881A6B0F7C00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC891A6B0FB300C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC8A1A6B0FBE00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC8B1A6B0FC900C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC8C1A6B0FD400C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC8D1A6B0FDE00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC8E1A6B0FEA00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC8F1A6B0FF600C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC901A6B100000C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC911A6B100900C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC921A6B101900C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC931A6B102600C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC941A6B103100C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC951A6B103B00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC961A6B104500C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC971A6B104F00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC981A6B105800C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC991A6B106300C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC9A1A6B106C00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC9B1A6B107600C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC9C1A6B108000C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC9D1A6B108B00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC9E1A6B109600C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BC9F1A6B10A000C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCA01A6B10A900C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCA11A6B10B400C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCA21A6B10BF00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCA31A6B10CB00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCA41A6B10D400C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCA51A6B10DE00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCA61A6B10E900C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCA71A6B10F300C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCA81A6B10FD00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCA91A6B110700C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCAA1A6B111200C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCAB1A6B111E00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCAC1A6B112A00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCAD1A6B113500C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCAE1A6B114000C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCAF1A6B114D00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCB01A6B115700C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCB11A6B116100C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCB21A6B116B00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCB31A6B117500C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCB41A6B117F00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCB51A6B118C00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCB61A6B119C00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCB71A6B11DC00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCB81A6B11E700C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCB91A6B11F100C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCBA1A6B11FB00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCBB1A6B120600C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCBC1A6B121000C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCBD1A6B121B00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCBE1A6B122600C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCBF1A6B123500C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCC01A6B124400C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCC11A6B124D00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCC21A6B125800C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCC31A6B126200C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCC41A6B126D00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCC51A6B127700C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCC61A6B12F700C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCC71A6B130000C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCC81A6B130A00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCC91A6B131300C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCCA1A6B131E00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCCB1A6B132800C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCCC1A6B133300C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCCD1A6B133D00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCCE1A6B134600C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCCF1A6B135000C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCD01A6B135900C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCD11A6B136300C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCD21A6B136C00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCD31A6B137600C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCD41A6B137F00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCD51A6B138800C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCD61A6B13A100C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCD71A6B13AA00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCD81A6B13B500C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCD91A6B13C000C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCDA1A6B13C900C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCDB1A6B13D300C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCDC1A6B13DD00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCDD1A6B13E700C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCDE1A6B13F100C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCDF1A6B13FC00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCE01A6B140500C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCE11A6B140F00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCE21A6B141900C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCE31A6B142200C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCE41A6B142C00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCE51A6B143500C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCE61A6B143E00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCE71A6B144800C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCE81A6B146F00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCE91A6B147900C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCEA1A6B150F00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCEB1A6B151A00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCEC1A6B152300C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCED1A6B152E00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCEE1A6B153800C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCEF1A6B154200C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCF01A6B154E00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCF11A6B155700C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCF21A6B156200C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCF31A6B156C00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCF41A6B157600C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCF51A6B158000C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCF61A6B158C00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCF71A6B159600C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCF81A6B15A300C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCF91A6B15AD00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCFA1A6B15B600C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCFB1A6B15BF00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCFC1A6B15C800C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCFD1A6B15D200C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCFE1A6B15E300C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BCFF1A6B15EE00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD001A6B15F800C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD011A6B160200C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD021A6B160D00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD031A6B161700C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD041A6B162400C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD051A6B162E00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD061A6B163700C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD071A6B164000C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD081A6B164A00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD091A6B165300C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD0A1A6B165D00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD0B1A6B166700C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD0C1A6B167000C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD0D1A6B167900C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD0E1A6B168200C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD0F1A6B168D00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD101A6B169600C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD111A6B169F00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD121A6B16A800C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD131A6B16B200C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD141A6B16BB00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD151A6B16C500C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD161A6B16D000C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD171A6B16DA00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD181A6B16E300C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD191A6B16EE00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD1A1A6B16F800C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD1B1A6B170100C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD1C1A6B170A00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD1D1A6B171400C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD1E1A6B171E00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD1F1A6B172800C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD201A6B173100C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD211A6B173A00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD221A6B174400C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD231A6B174D00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD241A6B175700C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD251A6B176000C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD261A6B176900C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD271A6B177200C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD281A6B177C00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD291A6B178600C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD2A1A6B178F00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD2B1A6B179900C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD2C1A6B17A200C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD2D1A6B17AD00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD2E1A6B17B600C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD2F1A6B17BF00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD301A6B17C900C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD311A6B17D300C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD321A6B17DD00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD331A6B17E600C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD341A6B17EF00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD351A6B17F700C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD361A6B180D00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD371A6B181700C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD381A6B182100C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD391A6B182B00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD3A1A6B183600C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD3B1A6B184100C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD3C1A6B184C00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD3D1A6B185600C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD3E1A6B186200C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD3F1A6B186C00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD401A6B187500C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD411A6B188100C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD421A6B188B00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD431A6B189500C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD441A6B189F00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD451A6B18A900C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD461A6B18B200C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD471A6B18BB00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD481A6B18C400C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD491A6B18CE00C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+ CEE0BD4A1A6B18D700C098BF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ AF08399109930B6B00277BE9 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF083A34099311D700277BE9 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF0DC7AD0C4C73F600D76972 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF0DCA300C4C744D00D76972 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF0DC7AB0C4C73F600D76972;
+ remoteInfo = m6502;
+ };
+ AF0DCA440C4CBB0D00D76972 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF0DCA5B0C4CBB4300D76972 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF0DCA420C4CBB0D00D76972;
+ remoteInfo = Voronoi;
+ };
+ AF137D460F075CC8004DE3B2 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF137D410F075C9B004DE3B2;
+ remoteInfo = Obsolete;
+ };
+ AF137D480F075E5C004DE3B2 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD5709B0996B88E00BA26F7;
+ remoteInfo = Worm;
+ };
+ AF137D4A0F075E5C004DE3B2 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF477208099D4EE8001F091E;
+ remoteInfo = Whirlygig;
+ };
+ AF137D4C0F075E5C004DE3B2 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD56F0B0996AAFA00BA26F7;
+ remoteInfo = Vines;
+ };
+ AF137D4E0F075E5C004DE3B2 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4771A7099D4949001F091E;
+ remoteInfo = T3D;
+ };
+ AF137D500F075E5C004DE3B2 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD570430996B61600BA26F7;
+ remoteInfo = Spiral;
+ };
+ AF137D520F075E5C004DE3B2 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD570260996B56D00BA26F7;
+ remoteInfo = Sphere;
+ };
+ AF137D540F075E5C004DE3B2 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD570B10996B93000BA26F7;
+ remoteInfo = Rotor;
+ };
+ AF137D560F075E5C004DE3B2 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD56FCF0996B20900BA26F7;
+ remoteInfo = Lissie;
+ };
+ AF137D580F075E5C004DE3B2 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD56FB90996B18F00BA26F7;
+ remoteInfo = Lisa;
+ };
+ AF137D5A0F075E5C004DE3B2 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD56FA30996B10F00BA26F7;
+ remoteInfo = Lightning;
+ };
+ AF137D5C0F075E5C004DE3B2 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD56F8C0996B09400BA26F7;
+ remoteInfo = Laser;
+ };
+ AF137D600F075E5C004DE3B2 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55CCC09934CE400F3E977;
+ remoteInfo = GLForestFire;
+ };
+ AF137D620F075E5C004DE3B2 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD56EDA0996A95700BA26F7;
+ remoteInfo = Forest;
+ };
+ AF137D640F075E5C004DE3B2 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF477909099DE379001F091E;
+ remoteInfo = Flag;
+ };
+ AF137D660F075E5C004DE3B2 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF47765A099DA78E001F091E;
+ remoteInfo = Critical;
+ };
+ AF137D680F075E5C004DE3B2 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF6427A809A2DE36000F4CD4;
+ remoteInfo = Bubbles;
+ };
+ AF1A17630D6D6EE3008AF328 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF1A17830D6D6FA7008AF328 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF1A17610D6D6EE3008AF328;
+ remoteInfo = LCDscrub;
+ };
+ AF1B0FA91D7AB4740011DBE4 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF1B0FC41D7AB5740011DBE4 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF1B0FA71D7AB4740011DBE4;
+ remoteInfo = Hexstrut;
+ };
+ AF2107731FD23BDD00B61EA9 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF21078E1FD23D9800B61EA9 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF2107711FD23BDD00B61EA9;
+ remoteInfo = Esper;
+ };
+ AF32D9E20F3AD0B40080F535 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF32D9F80F3AD0D90080F535 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF32D9E00F3AD0B40080F535;
+ remoteInfo = RubikBlocks;
+ };
+ AF3581C11431D47B00E09C51 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF3581FD143330F900E09C51 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF35E88C0E63823600691F2F /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF35E8A20E63825600691F2F /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF35E88A0E63823600691F2F;
+ remoteInfo = Jigsaw;
+ };
+ AF36340018540D050086A439 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF1AD9E118500F9F00932759;
+ remoteInfo = XScreenSaverUpdater;
+ };
+ AF39381C1D0FBD6A00205406 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF3938371D0FBF5300205406 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF39381A1D0FBD6A00205406;
+ remoteInfo = Discoball;
+ };
+ AF39E284198A11F60064A58D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF39E2B9198A16920064A58D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF39E282198A11F60064A58D;
+ remoteInfo = WindupRobot;
+ };
+ AF3C71470D624BF50030CC0D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF3EC97A2035154C00180A35 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF3EC995203517EE00180A35 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF3EC9782035154C00180A35;
+ remoteInfo = Peepers;
+ };
+ AF41E954201D49DB0098E253 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF41E970201D4C380098E253 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF41E952201D49DB0098E253;
+ remoteInfo = RazzleDazzle;
+ };
+ AF42C5150D624E9200B27FF6 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF3C71450D624BF50030CC0D;
+ remoteInfo = Hypnowheel;
+ };
+ AF4540D10E52BE8800AE87B5 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFE30BE80E52B14700CCF4A5;
+ remoteInfo = Sonar;
+ };
+ AF46E9D11CBBA2B300240FBC /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF46E9EC1CBBA49A00240FBC /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF46E9CF1CBBA2B300240FBC;
+ remoteInfo = Unicrud;
+ };
+ AF476FB7099D154F001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF476FDC099D1686001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF47704E099D4385001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF47716B099D4786001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF477181099D4803001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF4771A9099D4949001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF4771DD099D4D9A001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF4771F4099D4E63001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF47720A099D4EE8001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF477220099D4F67001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF477255099D5717001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF47726D099D57B9001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF477285099D5926001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF477384099D65A1001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF47739C099D6648001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF4773C3099D67B9001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF477403099D69E7001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF477428099D7C70001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF477444099D7D33001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF477485099D89E4001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF47749B099D8A74001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF4774B6099D8B5F001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF4774D0099D8BFF001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF47755F099D9A1A001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF477585099D9C28001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF4775A1099D9CF7001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF4775DA099D9F69001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF4775F4099DA030001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF477615099DA26C001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF477646099DA6D0001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF47765C099DA78E001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF477672099DA849001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF477691099DAA6F001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF4776AC099DABDD001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF4776C2099DAC8A001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF4776DD099DADDF001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF4776F3099DAE7A001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF47770F099DAF9F001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF477725099DB044001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF477754099DB61E001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF477776099DB965001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF477792099DBA90001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF4777D3099DC183001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF4778AD099DDB79001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF4778C9099DDCAE001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF4778EA099DDDC8001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF47790B099DE379001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF47792C099DE4C7001F091E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF480921098C412F00FB32B8 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF480929098C419000FB32B8 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF48092C098C41AE00FB32B8 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF480935098C421200FB32B8 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF480C4B098E301400FB32B8 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF480D5B098EED6900FB32B8 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF480D59098EED5100FB32B8;
+ remoteInfo = "All Savers (OpenGL)";
+ };
+ AF480D5D098EED6900FB32B8 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF480D58098EED3D00FB32B8;
+ remoteInfo = "All Savers (XLockmore)";
+ };
+ AF480D5F098EED6900FB32B8 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF480AAF098C669800FB32B8;
+ remoteInfo = "All Savers (XScreenSaver)";
+ };
+ AF480D74098EEDDE00FB32B8 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF4810ED09909FBA00FB32B8 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF4812520990CE2700FB32B8 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF4812B50990D3D900FB32B8 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF48DEF10A0C25E000F94CF9 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF48DF050A0C261100F94CF9 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF48DEEF0A0C25E000F94CF9;
+ remoteInfo = GLSchool;
+ };
+ AF4A344B102A593600A81B2A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF4A345F102A59A400A81B2A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4A3449102A593600A81B2A;
+ remoteInfo = Surfaces;
+ };
+ AF4F10ED143450C300E34F3F /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF3581BF1431D47B00E09C51;
+ remoteInfo = CompanionCube;
+ };
+ AF4F10EF143450C300E34F3F /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF78D175142DD8F3002AAF77;
+ remoteInfo = Hilbert;
+ };
+ AF4F10F1143450C300E34F3F /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF3581FB143330F900E09C51;
+ remoteInfo = TronBit;
+ };
+ AF4FD6E80CE7A486005EE58E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF4FD6FE0CE7A4F9005EE58E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4FD6E60CE7A486005EE58E;
+ remoteInfo = Lockward;
+ };
+ AF4FF4970D52CA5000666F98 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4FF4930D52CA0800666F98;
+ remoteInfo = m6502.h;
+ };
+ AF4FF4BC0D52CBDE00666F98 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF4FF4D60D52CD0D00666F98 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4FF4BA0D52CBDE00666F98;
+ remoteInfo = CubicGrid;
+ };
+ AF5C9AFB1A0CCE6E00B0147A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF5C9B151A0CCF8000B0147A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF5C9AF91A0CCE6E00B0147A;
+ remoteInfo = Cityflow;
+ };
+ AF5ECEAB2116B1A400069433 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF5ECEC82116B31F00069433 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF5ECEA92116B1A400069433;
+ remoteInfo = VFeedback;
+ };
+ AF633C031EE0BA6F00AB33BD /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF633C1E1EE0BCD300AB33BD /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF633C011EE0BA6F00AB33BD;
+ remoteInfo = Vigilance;
+ };
+ AF63A7F31AB4EDDB00593C75 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF63A80E1AB4EFD300593C75 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF63A7F11AB4EDDB00593C75;
+ remoteInfo = RomanBoy;
+ };
+ AF63F2491C3465BE0033E133 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF63F24B1C3465BE0033E133 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4FF4930D52CA0800666F98;
+ remoteInfo = m6502.h;
+ };
+ AF63F24D1C3465BE0033E133 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA56119099378CB00F3E977;
+ remoteInfo = molecules.h;
+ };
+ AF63F4521C34682A0033E133 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF63F4541C34682A0033E133 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4FF4930D52CA0800666F98;
+ remoteInfo = m6502.h;
+ };
+ AF63F4561C34682A0033E133 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA56119099378CB00F3E977;
+ remoteInfo = molecules.h;
+ };
+ AF63F47A1C3469FC0033E133 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF63F47C1C3469FC0033E133 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4FF4930D52CA0800666F98;
+ remoteInfo = m6502.h;
+ };
+ AF63F47E1C3469FC0033E133 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA56119099378CB00F3E977;
+ remoteInfo = molecules.h;
+ };
+ AF6423F4099FF9C2000F4CD4 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF6425CE09A18855000F4CD4 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF6425EE09A189EC000F4CD4 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF64261109A18D6C000F4CD4 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF64262E09A18F54000F4CD4 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF64265109A19229000F4CD4 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF64267D09A194B0000F4CD4 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF64277309A1D37A000F4CD4 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF6427AA09A2DE36000F4CD4 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF68A48019196CF800D41CD1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF68A49D19196EA000D41CD1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF68A47E19196CF800D41CD1;
+ remoteInfo = Tessellimage;
+ };
+ AF714E4E105613410046AB1D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4774B4099D8B5F001F091E;
+ remoteInfo = LMorph;
+ };
+ AF714E50105613580046AB1D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD570C90996B9F800BA26F7;
+ remoteInfo = Ant;
+ };
+ AF73FF241A09877F00E485E9 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF73FF3E1A0988F000E485E9 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF73FF221A09877F00E485E9;
+ remoteInfo = BinaryRing;
+ };
+ AF7511011782B5B900380EA1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF7776E609B63ABF00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF77771C09B6416100EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF77774009B6446500EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF77777609B6497800EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF77779009B64A5200EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF7777AA09B64B2600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF7777D209B64C6B00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF7777EC09B64E3100EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF77781209B6504400EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF77784609B6528100EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF77786309B6536000EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF77788109B6563500EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF7778A709B659C800EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF7778D609B6604500EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF9D475F09B53166006E59CF;
+ remoteInfo = Zoom;
+ };
+ AF7778D809B6604500EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4776AA099DABDD001F091E;
+ remoteInfo = XSpirograph;
+ };
+ AF7778DA09B6604500EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4776C0099DAC8A001F091E;
+ remoteInfo = XRaySwarm;
+ };
+ AF7778DC09B6604600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF477442099D7D33001F091E;
+ remoteInfo = XMatrix;
+ };
+ AF7778DE09B6604600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF9D4C6909B59F27006E59CF;
+ remoteInfo = XLyap;
+ };
+ AF7778E009B6604600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4778C7099DDCAE001F091E;
+ remoteInfo = XJack;
+ };
+ AF7778E209B6604600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF9D4D7E09B5B2DC006E59CF;
+ remoteInfo = XAnalogTV;
+ };
+ AF7778E409B6604600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF975808099C41D500B05160;
+ remoteInfo = XFlame;
+ };
+ AF7778E609B6604600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF477382099D65A1001F091E;
+ remoteInfo = Wormhole;
+ };
+ AF7778EA09B6604600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4776DB099DADDF001F091E;
+ remoteInfo = WhirlWindWarp;
+ };
+ AF7778EC09B6604600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF47717F099D4803001F091E;
+ remoteInfo = Wander;
+ };
+ AF7778EE09B6604600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4776F1099DAE7A001F091E;
+ remoteInfo = Vermiculate;
+ };
+ AF7778F009B6604600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF9D496C09B5411D006E59CF;
+ remoteInfo = Twang;
+ };
+ AF7778F209B6604600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF476FDA099D1686001F091E;
+ remoteInfo = Truchet;
+ };
+ AF7778F609B6604600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF477723099DB044001F091E;
+ remoteInfo = Substrate;
+ };
+ AF7778F809B6604600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF47759F099D9CF7001F091E;
+ remoteInfo = Starfish;
+ };
+ AF7778FA09B6604600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF477644099DA6D0001F091E;
+ remoteInfo = Squiral;
+ };
+ AF7778FC09B6604600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF9D499709B544C2006E59CF;
+ remoteInfo = Spotlight;
+ };
+ AF7778FE09B6604700EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF64277109A1D37A000F4CD4;
+ remoteInfo = SpeedMine;
+ };
+ AF77790209B6604700EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF47792A099DE4C7001F091E;
+ remoteInfo = Slip;
+ };
+ AF77790409B6604700EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF9D474409B5300A006E59CF;
+ remoteInfo = SlideScreen;
+ };
+ AF77790609B6604700EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF975865099C475900B05160;
+ remoteInfo = ShadeBobs;
+ };
+ AF77790809B6604700EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF9D495409B53FC9006E59CF;
+ remoteInfo = RotZoomer;
+ };
+ AF77790A09B6604700EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF9770290989D1E6001F8B92;
+ remoteInfo = Rorschach;
+ };
+ AF77790C09B6604700EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF975D52099CA0F000B05160;
+ remoteInfo = Rocks;
+ };
+ AF77790E09B6604700EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF9D492B09B53CBA006E59CF;
+ remoteInfo = Ripples;
+ };
+ AF77791009B6604700EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF9757C2099C3E6300B05160;
+ remoteInfo = RD;
+ };
+ AF77791209B6604700EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF6425EC09A189EC000F4CD4;
+ remoteInfo = Qix;
+ };
+ AF77791409B6604700EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF477583099D9C28001F091E;
+ remoteInfo = Pyro;
+ };
+ AF77791609B6604700EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF47726B099D57B9001F091E;
+ remoteInfo = PopSquares;
+ };
+ AF77791809B6604700EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF9D4CE709B5AA8E006E59CF;
+ remoteInfo = Pong;
+ };
+ AF77791A09B6604700EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF477283099D5926001F091E;
+ remoteInfo = Piecewise;
+ };
+ AF77791C09B6604800EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF7776E409B63ABF00EA3033;
+ remoteInfo = Phosphor;
+ };
+ AF77791E09B6604800EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF477670099DA849001F091E;
+ remoteInfo = Petri;
+ };
+ AF77792009B6604800EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4778AB099DDB79001F091E;
+ remoteInfo = Penetrate;
+ };
+ AF77792209B6604800EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF47755D099D9A1A001F091E;
+ remoteInfo = Pedal;
+ };
+ AF77792409B6604800EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF975C5D099C8F3F00B05160;
+ remoteInfo = NoseGuy;
+ };
+ AF77792609B6604800EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4771F2099D4E63001F091E;
+ remoteInfo = NerveRot;
+ };
+ AF77792809B6604800EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF64264F09A19229000F4CD4;
+ remoteInfo = Munch;
+ };
+ AF77792A09B6604800EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF64262C09A18F54000F4CD4;
+ remoteInfo = Moire2;
+ };
+ AF77792C09B6604800EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF975775099C374A00B05160;
+ remoteInfo = Moire;
+ };
+ AF77793009B6604800EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF975A36099C681F00B05160;
+ remoteInfo = MetaBalls;
+ };
+ AF77793209B6604800EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF975AFC099C6FE400B05160;
+ remoteInfo = MemScroller;
+ };
+ AF77793409B6604800EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4774CE099D8BFF001F091E;
+ remoteInfo = Maze;
+ };
+ AF77793809B6604800EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF477613099DA26C001F091E;
+ remoteInfo = Kumppa;
+ };
+ AF77793A09B6604900EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF477499099D8A74001F091E;
+ remoteInfo = Kaleidescope;
+ };
+ AF77793E09B6604900EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF477401099D69E7001F091E;
+ remoteInfo = Intermomentary;
+ };
+ AF77794009B6604900EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF476FB5099D154F001F091E;
+ remoteInfo = Interference;
+ };
+ AF77794209B6604900EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF477752099DB61E001F091E;
+ remoteInfo = Interaggregate;
+ };
+ AF77794409B6604900EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF97572D099C317000B05160;
+ remoteInfo = IMSMap;
+ };
+ AF77794609B6604900EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF477426099D7C70001F091E;
+ remoteInfo = IFS;
+ };
+ AF77794C09B6604900EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF480C49098E301400FB32B8;
+ remoteInfo = Helix;
+ };
+ AF77794E09B6604900EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF975C12099C8C1500B05160;
+ remoteInfo = Halo;
+ };
+ AF77795009B6604900EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF477253099D5717001F091E;
+ remoteInfo = Halftone;
+ };
+ AF77795209B6604900EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF975C3D099C8DCF00B05160;
+ remoteInfo = Greynetic;
+ };
+ AF77795409B6604A00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF64267B09A194B0000F4CD4;
+ remoteInfo = Goop;
+ };
+ AF77795609B6604A00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF47739A099D6648001F091E;
+ remoteInfo = FuzzyFlakes;
+ };
+ AF77795809B6604A00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF77787F09B6563500EA3033;
+ remoteInfo = FontGlide;
+ };
+ AF77795A09B6604A00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF477790099DBA90001F091E;
+ remoteInfo = FluidBalls;
+ };
+ AF77795C09B6604A00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF477483099D89E4001F091E;
+ remoteInfo = Flame;
+ };
+ AF77795E09B6604A00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF975AD7099C6EB100B05160;
+ remoteInfo = Fireworkx;
+ };
+ AF77796009B6604A00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF975A6C099C6AB200B05160;
+ remoteInfo = Eruption;
+ };
+ AF77796209B6604A00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4775F2099DA030001F091E;
+ remoteInfo = Epicycle;
+ };
+ AF77796409B6604A00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF9D48F409B535DA006E59CF;
+ remoteInfo = Distort;
+ };
+ AF77796609B6604A00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF47704C099D4385001F091E;
+ remoteInfo = Deluxe;
+ };
+ AF77796809B6604A00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF976FBB0989CAA2001F8B92;
+ remoteInfo = Deco;
+ };
+ AF77796A09B6604A00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF9D466609B5109C006E59CF;
+ remoteInfo = DecayScreen;
+ };
+ AF77796C09B6604A00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4778E8099DDDC8001F091E;
+ remoteInfo = Cynosure;
+ };
+ AF77797009B6604B00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4775D8099D9F69001F091E;
+ remoteInfo = Coral;
+ };
+ AF77797209B6604B00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF477169099D4786001F091E;
+ remoteInfo = Compass;
+ };
+ AF77797409B6604B00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF47770D099DAF9F001F091E;
+ remoteInfo = CloudLife;
+ };
+ AF77797609B6604B00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF477774099DB965001F091E;
+ remoteInfo = Celtic;
+ };
+ AF77797809B6604B00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4771DB099D4D9A001F091E;
+ remoteInfo = CCurve;
+ };
+ AF77797A09B6604B00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF9D48DB09B53322006E59CF;
+ remoteInfo = Bumps;
+ };
+ AF77797E09B6604B00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF9D4DAF09B5B71E006E59CF;
+ remoteInfo = BSOD;
+ };
+ AF77798009B6604B00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4777D1099DC183001F091E;
+ remoteInfo = BoxFit;
+ };
+ AF77798209B6604B00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF7778A509B659C800EA3033;
+ remoteInfo = BlitSpin;
+ };
+ AF77798409B6604B00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF47768F099DAA6F001F091E;
+ remoteInfo = Blaster;
+ };
+ AF77798609B6604B00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF975A86099C6BC300B05160;
+ remoteInfo = Barcode;
+ };
+ AF77798809B6604C00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF9770660989D2F6001F8B92;
+ remoteInfo = Attraction;
+ };
+ AF77798A09B6604C00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF9D4DEC09B5BB19006E59CF;
+ remoteInfo = Apple2;
+ };
+ AF77798C09B6604C00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4773C1099D67B9001F091E;
+ remoteInfo = Anemotaxis;
+ };
+ AF77798E09B6604C00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF47721E099D4F67001F091E;
+ remoteInfo = Anemone;
+ };
+ AF77799409B6608000EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD570850996B80300BA26F7;
+ remoteInfo = Triangle;
+ };
+ AF77799609B6608100EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD571590996C0CE00BA26F7;
+ remoteInfo = Thornbird;
+ };
+ AF77799809B6608100EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD572220996E4A300BA26F7;
+ remoteInfo = Swirl;
+ };
+ AF77799A09B6608100EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD5735D0997411200BA26F7;
+ remoteInfo = Strange;
+ };
+ AF7779A009B6608100EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD5700F0996B4CC00BA26F7;
+ remoteInfo = Sierpinski;
+ };
+ AF7779A409B6608100EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD5726D0996EE8500BA26F7;
+ remoteInfo = Polyominoes;
+ };
+ AF7779A609B6608100EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD56FF80996B43800BA26F7;
+ remoteInfo = Penrose;
+ };
+ AF7779A809B6608100EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF77771A09B6416100EA3033;
+ remoteInfo = Pacman;
+ };
+ AF7779AA09B6608100EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD5706F0996B72700BA26F7;
+ remoteInfo = Mountain;
+ };
+ AF7779AC09B6608100EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF794FCD09974FA60059A8B0;
+ remoteInfo = Loop;
+ };
+ AF7779B609B6608100EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD572F9099701C000BA26F7;
+ remoteInfo = Julia;
+ };
+ AF7779BA09B6608100EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD56F6B0996B01600BA26F7;
+ remoteInfo = Hopalong;
+ };
+ AF7779BC09B6608100EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD56F4F0996AEEE00BA26F7;
+ remoteInfo = Grav;
+ };
+ AF7779BE09B6608100EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD56F230996AB8A00BA26F7;
+ remoteInfo = Galaxy;
+ };
+ AF7779C209B6608100EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD570EA0996BBBF00BA26F7;
+ remoteInfo = Flow;
+ };
+ AF7779C609B6608200EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF794F8E09974A320059A8B0;
+ remoteInfo = Fiberlamp;
+ };
+ AF7779C809B6608200EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD570590996B6A300BA26F7;
+ remoteInfo = FadePlot;
+ };
+ AF7779CA09B6608200EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD571430996C01700BA26F7;
+ remoteInfo = Euler2D;
+ };
+ AF7779CC09B6608200EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF480D72098EEDDE00FB32B8;
+ remoteInfo = Drift;
+ };
+ AF7779CE09B6608200EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD571130996BE9300BA26F7;
+ remoteInfo = Discrete;
+ };
+ AF7779D009B6608200EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF794F64099748450059A8B0;
+ remoteInfo = Demon;
+ };
+ AF7779D209B6608200EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD572C20996FC0F00BA26F7;
+ remoteInfo = Crystal;
+ };
+ AF7779D409B6608200EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD56EAE0996A72600BA26F7;
+ remoteInfo = Braid;
+ };
+ AF7779D609B6608200EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD572A50996F99600BA26F7;
+ remoteInfo = Bouboule;
+ };
+ AF7779D809B6608200EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD5712C0996BF2E00BA26F7;
+ remoteInfo = Apollonian;
+ };
+ AF7779DC09B660AF00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA56379099397B300F3E977;
+ remoteInfo = TimeTunnel;
+ };
+ AF7779DE09B660AF00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA562F20993943B00F3E977;
+ remoteInfo = Tangram;
+ };
+ AF7779E009B660AF00EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA559920993322100F3E977;
+ remoteInfo = Superquadrics;
+ };
+ AF7779E209B660B000EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF7777A809B64B2600EA3033;
+ remoteInfo = StonerView;
+ };
+ AF7779E409B660B000EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF77781009B6504400EA3033;
+ remoteInfo = StarWars;
+ };
+ AF7779E609B660B000EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55A030993340300F3E977;
+ remoteInfo = Stairs;
+ };
+ AF7779E809B660B000EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55A20099334A000F3E977;
+ remoteInfo = Sproingies;
+ };
+ AF7779EA09B660B000EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55D7F099358C400F3E977;
+ remoteInfo = Spheremonics;
+ };
+ AF7779EC09B660B000EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55B7909933F7200F3E977;
+ remoteInfo = Sierpinski3D;
+ };
+ AF7779EE09B660B000EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55D3C0993565300F3E977;
+ remoteInfo = SBalls;
+ };
+ AF7779F009B660B000EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA559CF0993330600F3E977;
+ remoteInfo = Rubik;
+ };
+ AF7779F209B660B000EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55DF009935E4900F3E977;
+ remoteInfo = Queens;
+ };
+ AF7779F409B660B100EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55B2509933E8D00F3E977;
+ remoteInfo = Pulsar;
+ };
+ AF7779F609B660B100EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA562060993849F00F3E977;
+ remoteInfo = Providence;
+ };
+ AF7779F809B660B100EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA560AE0993718D00F3E977;
+ remoteInfo = Polytopes;
+ };
+ AF7779FA09B660B100EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA5619D09937D7E00F3E977;
+ remoteInfo = Polyhedra;
+ };
+ AF7779FC09B660B100EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4812B30990D3D900FB32B8;
+ remoteInfo = Pipes;
+ };
+ AF7779FE09B660B200EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA5621F0993852500F3E977;
+ remoteInfo = Pinion;
+ };
+ AF777A0009B660B200EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA5617B09937CF100F3E977;
+ remoteInfo = Noof;
+ };
+ AF777A0209B660B200EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA559B50993328000F3E977;
+ remoteInfo = Morph3D;
+ };
+ AF777A0409B660B200EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA560FD0993781600F3E977;
+ remoteInfo = Molecule;
+ };
+ AF777A0609B660B200EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA5596D0993317900F3E977;
+ remoteInfo = Moebius;
+ };
+ AF777A0809B660B200EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF77778E09B64A5200EA3033;
+ remoteInfo = MirrorBlob;
+ };
+ AF777A0A09B660B200EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55BE40993429100F3E977;
+ remoteInfo = Menger;
+ };
+ AF777A0C09B660B200EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55DC809935D7000F3E977;
+ remoteInfo = Lavalite;
+ };
+ AF777A0E09B660B200EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55A790993364300F3E977;
+ remoteInfo = Lament;
+ };
+ AF777A1009B660B300EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55F2A0993622F00F3E977;
+ remoteInfo = Klein;
+ };
+ AF777A1209B660B300EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA563A4099398BB00F3E977;
+ remoteInfo = Juggler3D;
+ };
+ AF777A1409B660B300EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55F06099361B700F3E977;
+ remoteInfo = JigglyPuff;
+ };
+ AF777A1609B660B300EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55F420993629000F3E977;
+ remoteInfo = HyperTorus;
+ };
+ AF777A1809B660B300EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD56DF10996A03800BA26F7;
+ remoteInfo = GLText;
+ };
+ AF777A1A09B660B300EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55C77099349A600F3E977;
+ remoteInfo = GLSnake;
+ };
+ AF777A1C09B660B300EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF7777D009B64C6B00EA3033;
+ remoteInfo = GLSlideshow;
+ };
+ AF777A1E09B660B300EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55B0909933E0500F3E977;
+ remoteInfo = GLPlanet;
+ };
+ AF777A2009B660B300EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55F720993643600F3E977;
+ remoteInfo = GLMatrix;
+ };
+ AF777A2209B660B400EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55FF909936C6D00F3E977;
+ remoteInfo = GLKnots;
+ };
+ AF777A2409B660B400EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA56331099395ED00F3E977;
+ remoteInfo = GLHanoi;
+ };
+ AF777A2809B660B400EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55E2F09935F8E00F3E977;
+ remoteInfo = GLBlur;
+ };
+ AF777A2A09B660B400EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55B9109933FDA00F3E977;
+ remoteInfo = GFlux;
+ };
+ AF777A2C09B660B400EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF77777409B6497800EA3033;
+ remoteInfo = Gleidescope;
+ };
+ AF777A2E09B660B400EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4812500990CE2700FB32B8;
+ remoteInfo = Gears;
+ };
+ AF777A3009B660B400EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55E4E09935FF900F3E977;
+ remoteInfo = FlyingToasters;
+ };
+ AF777A3209B660B400EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF7777EA09B64E3100EA3033;
+ remoteInfo = FlipText;
+ };
+ AF777A3409B660B400EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF77773E09B6446500EA3033;
+ remoteInfo = FlipScreen3D;
+ };
+ AF777A3609B660B400EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA5603209936D5100F3E977;
+ remoteInfo = FlipFlop;
+ };
+ AF777A3809B660B400EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF6423F2099FF9C2000F4CD4;
+ remoteInfo = Extrusion;
+ };
+ AF777A3A09B660B500EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55C0E0993431300F3E977;
+ remoteInfo = Engine;
+ };
+ AF777A3C09B660B500EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55E0D09935EDC00F3E977;
+ remoteInfo = Endgame;
+ };
+ AF777A3E09B660B500EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF77786109B6536000EA3033;
+ remoteInfo = DNAlogo;
+ };
+ AF777A4009B660B500EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4810EB09909FBA00FB32B8;
+ remoteInfo = DangerBall;
+ };
+ AF777A4209B660B500EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55FD309936BFA00F3E977;
+ remoteInfo = CubeStorm;
+ };
+ AF777A4409B660B500EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55D620993584B00F3E977;
+ remoteInfo = Cubenetic;
+ };
+ AF777A4609B660B500EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA56351099396C000F3E977;
+ remoteInfo = Cube21;
+ };
+ AF777A4809B660B500EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA563130993951000F3E977;
+ remoteInfo = Crackberg;
+ };
+ AF777A4A09B660B600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55BAB099340CE00F3E977;
+ remoteInfo = Circuit;
+ };
+ AF777A4C09B660B600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF77784409B6528100EA3033;
+ remoteInfo = Carousel;
+ };
+ AF777A4E09B660B600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55946099330B000F3E977;
+ remoteInfo = Cage;
+ };
+ AF777A5009B660B600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55ACF09933CEF00F3E977;
+ remoteInfo = Bubble3D;
+ };
+ AF777A5209B660B600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55CA909934BB200F3E977;
+ remoteInfo = Boxed;
+ };
+ AF777A5409B660B600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA55EC7099360E300F3E977;
+ remoteInfo = BouncingCow;
+ };
+ AF777A5609B660B600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA562BF099392C600F3E977;
+ remoteInfo = Boing;
+ };
+ AF777A5809B660B600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA5601409936CC800F3E977;
+ remoteInfo = BlockTube;
+ };
+ AF777A5A09B660B600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA5615609937C0D00F3E977;
+ remoteInfo = BlinkBox;
+ };
+ AF777A5C09B660B600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF083A32099311D700277BE9;
+ remoteInfo = Atunnel;
+ };
+ AF777A5E09B660B600EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF08398F09930B6B00277BE9;
+ remoteInfo = Atlantis;
+ };
+ AF777A6009B660B700EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA5606209936F3800F3E977;
+ remoteInfo = AntSpotlight;
+ };
+ AF777A6209B660B700EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA562DA099393C900F3E977;
+ remoteInfo = AntMaze;
+ };
+ AF777A6409B660B700EA3033 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA5604A09936E2100F3E977;
+ remoteInfo = AntInspect;
+ };
+ AF78D177142DD8F3002AAF77 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF794F66099748450059A8B0 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF794F9009974A320059A8B0 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF794FCF09974FA60059A8B0 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF7ACFC219FF0A9200BD752B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF7ACFDB19FF0BDB00BD752B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF7ACFC019FF0A9200BD752B;
+ remoteInfo = GeodesicGears;
+ };
+ AF7E07FD15925DF200D81407 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4FF4930D52CA0800666F98;
+ remoteInfo = m6502.h;
+ };
+ AF7E07FF15925DFE00D81407 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA56119099378CB00F3E977;
+ remoteInfo = molecules.h;
+ };
+ AF918979158FC00A002B5D1E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF97572F099C317000B05160 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF975777099C374A00B05160 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF9757C4099C3E6300B05160 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF97580A099C41D500B05160 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF975867099C475900B05160 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF975A38099C681F00B05160 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF975A6E099C6AB200B05160 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF975A88099C6BC300B05160 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF975AD9099C6EB100B05160 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF975AFE099C6FE400B05160 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF975C14099C8C1500B05160 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF975C3F099C8DCF00B05160 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF975C5F099C8F3F00B05160 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF975D54099CA0F000B05160 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF998EDC0A083DB30051049D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF998EF60A083E1D0051049D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF998EDA0A083DB30051049D;
+ remoteInfo = TopBlock;
+ };
+ AF9D466809B5109C006E59CF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF9D474609B5300A006E59CF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF9D476109B53166006E59CF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF9D48DD09B53322006E59CF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF9D48F609B535DA006E59CF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF9D492D09B53CBA006E59CF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF9D495609B53FC9006E59CF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF9D496E09B5411D006E59CF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF9D499909B544C2006E59CF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF9D4C6B09B59F27006E59CF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF9D4CE909B5AA8E006E59CF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF9D4D8009B5B2DC006E59CF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF9D4DB109B5B71E006E59CF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AF9D4DEE09B5BB19006E59CF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA160911052FF87009B93AA /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF6425CC09A18855000F4CD4;
+ remoteInfo = HyperCube;
+ };
+ AFA160931052FF87009B93AA /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF64260F09A18D6C000F4CD4;
+ remoteInfo = HyperBall;
+ };
+ AFA2118E1CD59DAF00C0D2A1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA211A91CD5A08000C0D2A1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA2118C1CD59DAF00C0D2A1;
+ remoteInfo = RaverHoop;
+ };
+ AFA339300B058505002B0E7D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA33B8E0B0585A4002B0E7D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA3392E0B058505002B0E7D;
+ remoteInfo = WebCollage;
+ };
+ AFA33BCE0B0587B2002B0E7D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA33BC60B058740002B0E7D;
+ remoteInfo = "webcollage-helper";
+ };
+ AFA33BDB0B058952002B0E7D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA33BC60B058740002B0E7D;
+ remoteInfo = "webcollage-helper";
+ };
+ AFA33C030B058E3C002B0E7D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA33C020B058E17002B0E7D;
+ remoteInfo = webcollage;
+ };
+ AFA55948099330B000F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA5596F0993317900F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA559940993322100F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA559B70993328000F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA559D10993330600F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55A050993340300F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55A22099334A000F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55A7B0993364300F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55AD109933CEF00F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55B0B09933E0500F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55B2709933E8D00F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55B7B09933F7200F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55B9309933FDA00F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55BAD099340CE00F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55BE60993429100F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55C100993431300F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55C79099349A600F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55CAB09934BB200F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55CCE09934CE400F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55D3E0993565300F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55D640993584B00F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55D81099358C400F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55DCA09935D7000F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55DF209935E4900F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55E0F09935EDC00F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55E3109935F8E00F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55E5009935FF900F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55EC9099360E300F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55F08099361B700F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55F2C0993622F00F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55F440993629000F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55F740993643600F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55FD509936BFA00F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA55FFB09936C6D00F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA5601609936CC800F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA5603409936D5100F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA5604C09936E2100F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA5606409936F3800F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA560B00993718D00F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA560FF0993781600F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA5611D0993791D00F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA56119099378CB00F3E977;
+ remoteInfo = molecules.h;
+ };
+ AFA5615809937C0D00F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA5617D09937CF100F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA5619F09937D7E00F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA562080993849F00F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA562210993852500F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA562C1099392C600F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA562DC099393C900F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA562F40993943B00F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA563150993951000F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA56333099395ED00F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA56353099396C000F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA5637B099397B300F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA563A6099398BB00F3E977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA6AAF220999950006D2685 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFA6AB1020999A9A006D2685 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFA6AAF020999950006D2685;
+ remoteInfo = GlitchPEG;
+ };
+ AFAAE389207D6343007A515C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFAAE3A4207D6470007A515C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFAAE387207D6343007A515C;
+ remoteInfo = Maze3D;
+ };
+ AFAC36BA202E7FBA001A684C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFAC36B6202E7F79001A684C;
+ remoteInfo = images_png_h;
+ };
+ AFAC36BC202E80E5001A684C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFAC36B6202E7F79001A684C;
+ remoteInfo = images_png_h;
+ };
+ AFACE8751CC83458008B24CD /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFACE8901CC8365F008B24CD /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFACE8731CC83458008B24CD;
+ remoteInfo = EnergyStream;
+ };
+ AFB581AF102F363300342B11 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD571B50996D9DC00BA26F7;
+ remoteInfo = Juggle;
+ };
+ AFB591A9178B812C00EA4005 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFB591C2178B821E00EA4005 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFB591A7178B812C00EA4005;
+ remoteInfo = Hexadrop;
+ };
+ AFBFE73F1786405E00432B21 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFF2867F17860E830050A578;
+ remoteInfo = QuasiCrystal;
+ };
+ AFBFE7411786407000432B21 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF7510FF1782B5B900380EA1;
+ remoteInfo = Kaleidocycle;
+ };
+ AFBFE74D178642DC00432B21 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFBFE7631786438900432B21 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF9D4DEC09B5BB19006E59CF;
+ remoteInfo = Apple2;
+ };
+ AFBFE76B178647FE00432B21 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFBFE7801786482B00432B21 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF7776E409B63ABF00EA3033;
+ remoteInfo = Phosphor;
+ };
+ AFBFE784178648E600432B21 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFBFE74B178642DC00432B21;
+ remoteInfo = "Apple2-OSX";
+ };
+ AFBFE786178648F500432B21 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFBFE767178647FE00432B21;
+ remoteInfo = "Phosphor-OSX";
+ };
+ AFC0E8AD1CDC601A008CAFAC /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFC0E8C81CDC6125008CAFAC /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFC0E8AB1CDC601A008CAFAC;
+ remoteInfo = Hydrostat;
+ };
+ AFC5CFD82044AA23004CEB5E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFC5CFF62044AB46004CEB5E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFC5CFD62044AA23004CEB5E;
+ remoteInfo = Crumbler;
+ };
+ AFCAD5F80992DFE00009617A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF9771D60989DC4A001F8B92;
+ remoteInfo = SaverTester;
+ };
+ AFCF833D1AF5B515008BB7E1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFCF835B1AF5B683008BB7E1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFCF833B1AF5B515008BB7E1;
+ remoteInfo = SplitFlap;
+ };
+ AFD51B1D0F063B4A00471C02 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD51B340F063B7800471C02 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD51B1B0F063B4A00471C02;
+ remoteInfo = Photopile;
+ };
+ AFD56DF30996A03800BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD56EB00996A72600BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD56EDC0996A95700BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD56F0D0996AAFA00BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD56F250996AB8A00BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD56F510996AEEE00BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD56F6D0996B01600BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD56F8E0996B09400BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD56FA50996B10F00BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD56FBB0996B18F00BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD56FD10996B20900BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD56FFA0996B43800BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD570110996B4CC00BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD570280996B56D00BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD570450996B61600BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD5705B0996B6A300BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD570710996B72700BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD570870996B80300BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD5709D0996B88E00BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD570B30996B93000BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD570CB0996B9F800BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD570EC0996BBBF00BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD571150996BE9300BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD5712E0996BF2E00BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD571450996C01700BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD5715B0996C0CE00BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD571B70996D9DC00BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD572240996E4A300BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD5726F0996EE8500BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD572A70996F99600BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD572C40996FC0F00BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD572FB099701C000BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD5735F0997411200BA26F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD77E5D20C23F8600A3638D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFD77E7920C241BE00A3638D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFD77E5B20C23F8600A3638D;
+ remoteInfo = FilmLeader;
+ };
+ AFDA6590178A52B70070D24B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFDA65A9178A54690070D24B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFDA658E178A52B70070D24B;
+ remoteInfo = "Unknown Pleasures";
+ };
+ AFE2A4580E2E904600ADB298 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFE2A46E0E2E908E00ADB298 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFE2A4560E2E904600ADB298;
+ remoteInfo = SkyTentacles;
+ };
+ AFE30BEA0E52B14700CCF4A5 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFE6A1840CDD7B2E002805BF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFE6A19B0CDD7B7F002805BF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFE6A1820CDD7B2E002805BF;
+ remoteInfo = MoebiusGears;
+ };
+ AFE6A41D0CDD7FAA002805BF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFE6A42F0CDD7FEE002805BF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFE6A41B0CDD7FAA002805BF;
+ remoteInfo = Abstractile;
+ };
+ AFEC23CF1CB6EAE100DE138F /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFEC23EA1CB6ED0800DE138F /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFEC23CD1CB6EAE100DE138F;
+ remoteInfo = DymaxionMap;
+ };
+ AFEE104F1D13406000AAC8F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFEE106A1D13424C00AAC8F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFEE104D1D13406000AAC8F7;
+ remoteInfo = CubeTwist;
+ };
+ AFEE106E1D15EB0700AAC8F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFEE10891D15EBF900AAC8F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFEE106C1D15EB0700AAC8F7;
+ remoteInfo = CubeStack;
+ };
+ AFEE108D1D17E20B00AAC8F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFEE10A81D17E32100AAC8F7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFEE108B1D17E20B00AAC8F7;
+ remoteInfo = Splodesic;
+ };
+ AFF2868117860E830050A578 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFF3C9EA17CCAC440028F240 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFF3CA0017CCAE210028F240 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFF3C9E817CCAC440028F240;
+ remoteInfo = Geodesic;
+ };
+ AFF463380C4403E400EE6509 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFF463520C44062500EE6509 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFF463360C4403E400EE6509;
+ remoteInfo = CWaves;
+ };
+ AFF4635A0C440AEF00EE6509 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFF4636E0C440B3B00EE6509 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFF463580C440AEF00EE6509;
+ remoteInfo = GLCells;
+ };
+ AFFAB31719158CE40020F021 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+ AFFAB33419158F1E0020F021 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AFFAB31519158CE40020F021;
+ remoteInfo = ProjectivePlane;
+ };
+ CE04E8CA1B9B61D00085910B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CE3D01511B76F4C100993C75;
+ remoteInfo = TestX11;
+ };
+ CE3D01531B76F4C100993C75 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+ remoteInfo = jwxyz;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ AF1ADA191850185F00932759 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ AF1ADA1A1850186B00932759 /* Sparkle.framework in CopyFiles */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9E7EBD190F4C1B00A8B01F /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 089C165DFE840E0CC02AAC07 /* InfoPlist.strings */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = InfoPlist.strings; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
+ 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ 32CA4F630368D1EE00C91783 /* xscreensaver_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xscreensaver_Prefix.pch; sourceTree = "<group>"; };
+ 5501D1941DBDCC0200624BE9 /* xshm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xshm.c; path = utils/xshm.c; sourceTree = "<group>"; };
+ 5501D1951DBDCC0200624BE9 /* xshm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = xshm.h; path = utils/xshm.h; sourceTree = "<group>"; };
+ 550FB5FD1AD64424001A4FA5 /* Media-iOS.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Media-iOS.xcassets"; sourceTree = "<group>"; };
+ 55374E301E1582AA005E2362 /* pow2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pow2.c; path = utils/pow2.c; sourceTree = "<group>"; };
+ 55374E311E1582AA005E2362 /* pow2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pow2.h; path = utils/pow2.h; sourceTree = "<group>"; };
+ 557BF07A1EE90C8B00846DCE /* settings@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "settings@2x.png"; sourceTree = "<group>"; };
+ 557BF07B1EE90C8B00846DCE /* settings@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "settings@3x.png"; sourceTree = "<group>"; };
+ 557BF07C1EE90C8B00846DCE /* stop@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "stop@2x.png"; sourceTree = "<group>"; };
+ 557BF07D1EE90C8B00846DCE /* stop@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "stop@3x.png"; sourceTree = "<group>"; };
+ 55EDCB3C1AD498A800251909 /* LaunchScreen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LaunchScreen.xib; sourceTree = "<group>"; };
+ 8D1107310486CEB800E47090 /* XScreenSaver.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = XScreenSaver.plist; sourceTree = "<group>"; };
+ AF01294C157D31DD00C396E1 /* iSaverRunner.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = iSaverRunner.plist; sourceTree = SOURCE_ROOT; };
+ AF0839A209930B6B00277BE9 /* Atlantis.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Atlantis.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF0839A909930C4900277BE9 /* atlantis.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = atlantis.c; path = hacks/glx/atlantis.c; sourceTree = "<group>"; };
+ AF0839AA09930C4900277BE9 /* dolphin.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = dolphin.c; path = hacks/glx/dolphin.c; sourceTree = "<group>"; };
+ AF0839AB09930C4900277BE9 /* shark.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = shark.c; path = hacks/glx/shark.c; sourceTree = "<group>"; };
+ AF0839AC09930C4900277BE9 /* swim.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = swim.c; path = hacks/glx/swim.c; sourceTree = "<group>"; };
+ AF0839AD09930C4900277BE9 /* whale.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = whale.c; path = hacks/glx/whale.c; sourceTree = "<group>"; };
+ AF083A31099311CE00277BE9 /* atunnel.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = atunnel.c; path = hacks/glx/atunnel.c; sourceTree = "<group>"; };
+ AF083A48099311D700277BE9 /* Atunnel.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Atunnel.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF083A58099312B000277BE9 /* tunnel_draw.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = tunnel_draw.c; path = hacks/glx/tunnel_draw.c; sourceTree = "<group>"; };
+ AF083A5D099312DB00277BE9 /* tunnel_draw.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = tunnel_draw.h; path = hacks/glx/tunnel_draw.h; sourceTree = "<group>"; };
+ AF0DC7BD0C4C73F600D76972 /* m6502.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = m6502.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF0DCA320C4C74A200D76972 /* asm6502.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = asm6502.c; path = hacks/asm6502.c; sourceTree = "<group>"; };
+ AF0DCA330C4C74A200D76972 /* asm6502.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = asm6502.h; path = hacks/asm6502.h; sourceTree = "<group>"; };
+ AF0DCA340C4C74A200D76972 /* m6502.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = m6502.c; path = hacks/m6502.c; sourceTree = "<group>"; };
+ AF0DCA370C4C74B700D76972 /* m6502.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = m6502.xml; sourceTree = "<group>"; };
+ AF0DCA560C4CBB0D00D76972 /* Voronoi.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Voronoi.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF0DCA5F0C4CBB7300D76972 /* voronoi.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = voronoi.c; path = hacks/glx/voronoi.c; sourceTree = "<group>"; };
+ AF0DCA610C4CBB8E00D76972 /* voronoi.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = voronoi.xml; sourceTree = "<group>"; };
+ AF0F46DC104E1809000A929C /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
+ AF0FAF0B09CA6FF900EE1051 /* xscreensaver-text */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.perl; name = "xscreensaver-text"; path = "../driver/xscreensaver-text"; sourceTree = "<group>"; };
+ AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.perl; name = "xscreensaver-getimage-file"; path = "../driver/xscreensaver-getimage-file"; sourceTree = "<group>"; };
+ AF0FAF3B159BAC7B00BCE2F7 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/CoreText.framework; sourceTree = DEVELOPER_DIR; };
+ AF142BAC1EE75DBF0005C0A8 /* settings.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = settings.png; sourceTree = "<group>"; };
+ AF142BAD1EE75DBF0005C0A8 /* stop.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = stop.png; sourceTree = "<group>"; };
+ AF142BB01EFEFBA20005C0A8 /* Photos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Photos.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Photos.framework; sourceTree = DEVELOPER_DIR; };
+ AF14EE300E3CEF1A004CBBD2 /* XScreenSaver.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = XScreenSaver.icns; sourceTree = "<group>"; };
+ AF1A17730D6D6EE3008AF328 /* LCDscrub.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LCDscrub.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF1A177E0D6D6F3E008AF328 /* lcdscrub.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = lcdscrub.c; path = hacks/lcdscrub.c; sourceTree = "<group>"; };
+ AF1A17800D6D6F62008AF328 /* lcdscrub.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = lcdscrub.xml; sourceTree = "<group>"; };
+ AF1AD9E218500F9F00932759 /* XScreenSaverUpdater.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = XScreenSaverUpdater.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF1AD9E518500F9F00932759 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
+ AF1AD9E618500FA000932759 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };
+ AF1AD9E718500FA000932759 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ AF1ADA0118500FA100932759 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
+ AF1ADA151850157400932759 /* Updater.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = Updater.xib; sourceTree = SOURCE_ROOT; };
+ AF1ADA171850180E00932759 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sparkle.framework; sourceTree = "<group>"; };
+ AF1B0FBC1D7AB4740011DBE4 /* Hexstrut.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Hexstrut.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF1B0FBE1D7AB5210011DBE4 /* hexstrut.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hexstrut.c; path = hacks/glx/hexstrut.c; sourceTree = "<group>"; };
+ AF1B0FBF1D7AB5210011DBE4 /* hexstrut.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = hexstrut.xml; sourceTree = "<group>"; };
+ AF2107861FD23BDE00B61EA9 /* Esper.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Esper.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF2107881FD23D2800B61EA9 /* esper.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = esper.xml; sourceTree = "<group>"; };
+ AF21078B1FD23D5000B61EA9 /* esper.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = esper.c; path = hacks/glx/esper.c; sourceTree = "<group>"; };
+ AF241F81107C38DF00046A84 /* dropshadow.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = dropshadow.c; path = hacks/glx/dropshadow.c; sourceTree = "<group>"; };
+ AF241F82107C38DF00046A84 /* dropshadow.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = dropshadow.h; path = hacks/glx/dropshadow.h; sourceTree = "<group>"; };
+ AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+ AF2D522513E954A0002AA818 /* SaverRunner.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = SaverRunner.icns; sourceTree = "<group>"; };
+ AF2D8F301CEBA10300198014 /* jwxyz-timers.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "jwxyz-timers.c"; path = "../jwxyz/jwxyz-timers.c"; sourceTree = "<group>"; };
+ AF2D8F311CEBA10300198014 /* jwxyz-timers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "jwxyz-timers.h"; path = "../jwxyz/jwxyz-timers.h"; sourceTree = "<group>"; };
+ AF32D9F40F3AD0B40080F535 /* RubikBlocks.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RubikBlocks.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF32D9FA0F3AD1200080F535 /* rubikblocks.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = rubikblocks.c; path = hacks/glx/rubikblocks.c; sourceTree = "<group>"; };
+ AF32D9FC0F3AD1330080F535 /* rubikblocks.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = rubikblocks.xml; sourceTree = "<group>"; };
+ AF34085409B80AAF00F2CEC1 /* StarWars.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StarWars.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF34085509B80AB000F2CEC1 /* StonerView.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StonerView.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF34085609B80AB000F2CEC1 /* Gleidescope.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Gleidescope.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF34085709B80AB000F2CEC1 /* FontGlide.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FontGlide.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF3581D51431D47B00E09C51 /* CompanionCube.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CompanionCube.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF3581D61431D5FC00E09C51 /* companion_disc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = companion_disc.c; path = hacks/glx/companion_disc.c; sourceTree = "<group>"; };
+ AF3581D71431D5FC00E09C51 /* companion_heart.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = companion_heart.c; path = hacks/glx/companion_heart.c; sourceTree = "<group>"; };
+ AF3581D81431D5FC00E09C51 /* companion_quad.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = companion_quad.c; path = hacks/glx/companion_quad.c; sourceTree = "<group>"; };
+ AF3581D91431D5FC00E09C51 /* companion.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = companion.c; path = hacks/glx/companion.c; sourceTree = "<group>"; };
+ AF3581E61431D61D00E09C51 /* companioncube.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = companioncube.xml; sourceTree = "<group>"; };
+ AF358216143330F900E09C51 /* TronBit.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TronBit.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF3582171433314C00E09C51 /* tronbit_idle1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tronbit_idle1.c; path = hacks/glx/tronbit_idle1.c; sourceTree = "<group>"; };
+ AF3582181433314C00E09C51 /* tronbit_idle2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tronbit_idle2.c; path = hacks/glx/tronbit_idle2.c; sourceTree = "<group>"; };
+ AF3582191433314C00E09C51 /* tronbit_no.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tronbit_no.c; path = hacks/glx/tronbit_no.c; sourceTree = "<group>"; };
+ AF35821A1433314C00E09C51 /* tronbit_yes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tronbit_yes.c; path = hacks/glx/tronbit_yes.c; sourceTree = "<group>"; };
+ AF35821B1433314C00E09C51 /* tronbit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tronbit.c; path = hacks/glx/tronbit.c; sourceTree = "<group>"; };
+ AF3582211433318500E09C51 /* tronbit.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = tronbit.xml; sourceTree = "<group>"; };
+ AF35E8A00E63823600691F2F /* Jigsaw.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Jigsaw.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF35EB250E6382BA00691F2F /* jigsaw.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = jigsaw.c; path = hacks/glx/jigsaw.c; sourceTree = "<group>"; };
+ AF3633F918530DD90086A439 /* sparkle_dsa_pub.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = sparkle_dsa_pub.pem; sourceTree = "<group>"; };
+ AF3633FA18530DD90086A439 /* Updater.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Updater.h; sourceTree = "<group>"; };
+ AF3633FB18530DD90086A439 /* Updater.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Updater.m; sourceTree = "<group>"; };
+ AF3633FE18530DFF0086A439 /* Updater.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Updater.plist; sourceTree = "<group>"; };
+ AF39382F1D0FBD6A00205406 /* Discoball.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Discoball.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF3938311D0FBEC800205406 /* discoball.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = discoball.c; path = hacks/glx/discoball.c; sourceTree = "<group>"; };
+ AF3938321D0FBEC800205406 /* discoball.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = discoball.xml; sourceTree = "<group>"; };
+ AF39E296198A11F60064A58D /* WindupRobot.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WindupRobot.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF39E2A0198A13F50064A58D /* robot-wireframe.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "robot-wireframe.c"; path = "hacks/glx/robot-wireframe.c"; sourceTree = "<group>"; };
+ AF39E2A1198A13F50064A58D /* winduprobot.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = winduprobot.c; path = hacks/glx/winduprobot.c; sourceTree = "<group>"; };
+ AF39E2AC198A15820064A58D /* winduprobot.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = winduprobot.xml; sourceTree = "<group>"; };
+ AF3C71590D624BF50030CC0D /* Hypnowheel.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Hypnowheel.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF3C715D0D624C600030CC0D /* hypnowheel.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = hypnowheel.c; path = hacks/glx/hypnowheel.c; sourceTree = "<group>"; };
+ AF3C715F0D624C7C0030CC0D /* hypnowheel.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = hypnowheel.xml; sourceTree = "<group>"; };
+ AF3EC98D2035154C00180A35 /* Peepers.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Peepers.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF3EC98F203517AD00180A35 /* peepers.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = peepers.xml; sourceTree = "<group>"; };
+ AF3EC992203517CC00180A35 /* peepers.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = peepers.c; path = hacks/glx/peepers.c; sourceTree = "<group>"; };
+ AF41E967201D49DD0098E253 /* RazzleDazzle.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RazzleDazzle.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF41E969201D4B6B0098E253 /* razzledazzle.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = razzledazzle.c; path = hacks/glx/razzledazzle.c; sourceTree = "<group>"; };
+ AF41E96D201D4B940098E253 /* razzledazzle.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = razzledazzle.xml; sourceTree = "<group>"; };
+ AF46E9E41CBBA2B300240FBC /* Unicrud.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Unicrud.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF46E9E61CBBA3F900240FBC /* unicrud.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = unicrud.xml; sourceTree = "<group>"; };
+ AF46E9E71CBBA3F900240FBC /* unicrud.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = unicrud.c; path = hacks/glx/unicrud.c; sourceTree = "<group>"; };
+ AF476FC6099D154F001F091E /* Interference.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Interference.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF476FD0099D15AA001F091E /* interference.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = interference.c; path = hacks/interference.c; sourceTree = "<group>"; };
+ AF476FEB099D1686001F091E /* Truchet.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Truchet.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF476FF0099D1713001F091E /* truchet.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = truchet.c; path = hacks/truchet.c; sourceTree = "<group>"; };
+ AF47705C099D4385001F091E /* Deluxe.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Deluxe.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF477145099D43E2001F091E /* deluxe.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = deluxe.c; path = hacks/deluxe.c; sourceTree = "<group>"; };
+ AF477179099D4786001F091E /* Compass.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Compass.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF47717C099D47D3001F091E /* compass.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = compass.c; path = hacks/compass.c; sourceTree = "<group>"; };
+ AF47718F099D4803001F091E /* Wander.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Wander.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF477192099D4864001F091E /* wander.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = wander.c; path = hacks/wander.c; sourceTree = "<group>"; };
+ AF4771B7099D4949001F091E /* T3D.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = T3D.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF4771BA099D4997001F091E /* t3d.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = t3d.c; path = hacks/t3d.c; sourceTree = "<group>"; };
+ AF4771EB099D4D9A001F091E /* CCurve.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CCurve.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF4771EF099D4DFE001F091E /* ccurve.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = ccurve.c; path = hacks/ccurve.c; sourceTree = "<group>"; };
+ AF477202099D4E64001F091E /* NerveRot.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NerveRot.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF477205099D4EB6001F091E /* nerverot.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = nerverot.c; path = hacks/nerverot.c; sourceTree = "<group>"; };
+ AF477218099D4EE8001F091E /* Whirlygig.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Whirlygig.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF47721B099D4F47001F091E /* whirlygig.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = whirlygig.c; path = hacks/whirlygig.c; sourceTree = "<group>"; };
+ AF47722E099D4F67001F091E /* Anemone.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Anemone.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF477231099D4FD5001F091E /* anemone.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = anemone.c; path = hacks/anemone.c; sourceTree = "<group>"; };
+ AF477263099D5717001F091E /* Halftone.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Halftone.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF477266099D5768001F091E /* halftone.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = halftone.c; path = hacks/halftone.c; sourceTree = "<group>"; };
+ AF47727B099D57B9001F091E /* PopSquares.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PopSquares.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF47727E099D5808001F091E /* popsquares.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = popsquares.c; path = hacks/popsquares.c; sourceTree = "<group>"; };
+ AF477293099D5926001F091E /* Piecewise.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Piecewise.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF477297099D5980001F091E /* piecewise.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = piecewise.c; path = hacks/piecewise.c; sourceTree = "<group>"; };
+ AF477392099D65A1001F091E /* Wormhole.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Wormhole.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF477395099D65FE001F091E /* wormhole.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = wormhole.c; path = hacks/wormhole.c; sourceTree = "<group>"; };
+ AF4773AA099D6648001F091E /* FuzzyFlakes.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FuzzyFlakes.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF4773B4099D6778001F091E /* fuzzyflakes.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = fuzzyflakes.c; path = hacks/fuzzyflakes.c; sourceTree = "<group>"; };
+ AF4773D1099D67B9001F091E /* Anemotaxis.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Anemotaxis.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF4773D4099D6817001F091E /* anemotaxis.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = anemotaxis.c; path = hacks/anemotaxis.c; sourceTree = "<group>"; };
+ AF477412099D69E7001F091E /* Intermomentary.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Intermomentary.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF47741C099D6A6C001F091E /* intermomentary.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = intermomentary.c; path = hacks/intermomentary.c; sourceTree = "<group>"; };
+ AF477437099D7C70001F091E /* IFS.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = IFS.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF47743A099D7CEA001F091E /* ifs.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = ifs.c; path = hacks/ifs.c; sourceTree = "<group>"; };
+ AF477452099D7D33001F091E /* XMatrix.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XMatrix.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF477455099D7D8A001F091E /* xmatrix.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = xmatrix.c; path = hacks/xmatrix.c; sourceTree = "<group>"; };
+ AF477493099D89E4001F091E /* Flame.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Flame.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF477496099D8A53001F091E /* flame.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = flame.c; path = hacks/flame.c; sourceTree = "<group>"; };
+ AF4774A9099D8A74001F091E /* Kaleidescope.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Kaleidescope.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF4774AC099D8B08001F091E /* kaleidescope.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = kaleidescope.c; path = hacks/kaleidescope.c; sourceTree = "<group>"; };
+ AF4774C4099D8B5F001F091E /* LMorph.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LMorph.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF4774CB099D8BC2001F091E /* lmorph.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = lmorph.c; path = hacks/lmorph.c; sourceTree = "<group>"; };
+ AF4774DE099D8BFF001F091E /* Maze.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Maze.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF4774E1099D8C8B001F091E /* maze.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = maze.c; path = hacks/maze.c; sourceTree = "<group>"; };
+ AF4774E7099D8D8C001F091E /* logo.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = logo.c; path = utils/logo.c; sourceTree = "<group>"; };
+ AF47756D099D9A1A001F091E /* Pedal.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Pedal.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF477570099D9A8A001F091E /* pedal.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = pedal.c; path = hacks/pedal.c; sourceTree = "<group>"; };
+ AF477593099D9C28001F091E /* Pyro.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Pyro.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF47759C099D9CA3001F091E /* pyro.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = pyro.c; path = hacks/pyro.c; sourceTree = "<group>"; };
+ AF4775AF099D9CF7001F091E /* Starfish.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Starfish.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF4775B3099D9D67001F091E /* starfish.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = starfish.c; path = hacks/starfish.c; sourceTree = "<group>"; };
+ AF4775BE099D9E79001F091E /* resources.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = resources.c; path = utils/resources.c; sourceTree = "<group>"; };
+ AF4775BF099D9E79001F091E /* resources.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = resources.h; path = utils/resources.h; sourceTree = "<group>"; };
+ AF4775E8099D9F69001F091E /* Coral.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Coral.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF4775EF099D9FFF001F091E /* coral.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = coral.c; path = hacks/coral.c; sourceTree = "<group>"; };
+ AF477602099DA030001F091E /* Epicycle.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Epicycle.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF477605099DA097001F091E /* epicycle.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = epicycle.c; path = hacks/epicycle.c; sourceTree = "<group>"; };
+ AF477623099DA26C001F091E /* Kumppa.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Kumppa.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF47762A099DA2E9001F091E /* kumppa.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = kumppa.c; path = hacks/kumppa.c; sourceTree = "<group>"; };
+ AF477654099DA6D0001F091E /* Squiral.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Squiral.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF477657099DA75D001F091E /* squiral.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = squiral.c; path = hacks/squiral.c; sourceTree = "<group>"; };
+ AF47766A099DA78F001F091E /* Critical.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Critical.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF47766D099DA80D001F091E /* critical.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = critical.c; path = hacks/critical.c; sourceTree = "<group>"; };
+ AF477680099DA849001F091E /* Petri.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Petri.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF477683099DA8C7001F091E /* petri.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = petri.c; path = hacks/petri.c; sourceTree = "<group>"; };
+ AF47769F099DAA6F001F091E /* Blaster.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Blaster.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF4776A2099DAADE001F091E /* blaster.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = blaster.c; path = hacks/blaster.c; sourceTree = "<group>"; };
+ AF4776BA099DABDD001F091E /* XSpirograph.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XSpirograph.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF4776BD099DAC46001F091E /* xspirograph.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = xspirograph.c; path = hacks/xspirograph.c; sourceTree = "<group>"; };
+ AF4776D0099DAC8A001F091E /* XRaySwarm.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XRaySwarm.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF4776D3099DACEB001F091E /* xrayswarm.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = xrayswarm.c; path = hacks/xrayswarm.c; sourceTree = "<group>"; };
+ AF4776EB099DADDF001F091E /* WhirlWindWarp.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WhirlWindWarp.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF4776EE099DAE58001F091E /* whirlwindwarp.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = whirlwindwarp.c; path = hacks/whirlwindwarp.c; sourceTree = "<group>"; };
+ AF477701099DAE7A001F091E /* Vermiculate.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Vermiculate.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF477704099DAF3F001F091E /* vermiculate.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = vermiculate.c; path = hacks/vermiculate.c; sourceTree = "<group>"; };
+ AF47771D099DAF9F001F091E /* CloudLife.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CloudLife.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF477720099DB01C001F091E /* cloudlife.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = cloudlife.c; path = hacks/cloudlife.c; sourceTree = "<group>"; };
+ AF477733099DB044001F091E /* Substrate.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Substrate.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF477736099DB104001F091E /* substrate.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = substrate.c; path = hacks/substrate.c; sourceTree = "<group>"; };
+ AF477762099DB61E001F091E /* Interaggregate.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Interaggregate.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF477769099DB710001F091E /* interaggregate.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = interaggregate.c; path = hacks/interaggregate.c; sourceTree = "<group>"; };
+ AF477784099DB965001F091E /* Celtic.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Celtic.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF477787099DBA29001F091E /* celtic.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = celtic.c; path = hacks/celtic.c; sourceTree = "<group>"; };
+ AF4777A0099DBA90001F091E /* FluidBalls.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FluidBalls.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF4777A4099DBB11001F091E /* fluidballs.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = fluidballs.c; path = hacks/fluidballs.c; sourceTree = "<group>"; };
+ AF4777E1099DC183001F091E /* BoxFit.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BoxFit.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF4778A3099DDA91001F091E /* boxfit.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = boxfit.c; path = hacks/boxfit.c; sourceTree = "<group>"; };
+ AF4778BB099DDB79001F091E /* Penetrate.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Penetrate.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF4778BE099DDC32001F091E /* penetrate.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = penetrate.c; path = hacks/penetrate.c; sourceTree = "<group>"; };
+ AF4778D7099DDCAE001F091E /* XJack.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XJack.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF4778DA099DDD2B001F091E /* xjack.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = xjack.c; path = hacks/xjack.c; sourceTree = "<group>"; };
+ AF4778F8099DDDC8001F091E /* Cynosure.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Cynosure.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF4778FB099DDE79001F091E /* cynosure.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = cynosure.c; path = hacks/cynosure.c; sourceTree = "<group>"; };
+ AF477919099DE379001F091E /* Flag.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Flag.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF47791C099DE3F1001F091E /* flag.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = flag.c; path = hacks/flag.c; sourceTree = "<group>"; };
+ AF47793A099DE4C7001F091E /* Slip.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Slip.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF47793D099DE56A001F091E /* slip.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = slip.c; path = hacks/slip.c; sourceTree = "<group>"; };
+ AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libjwxyz.a; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF480C21098E28EF00FB32B8 /* greynetic.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = greynetic.c; path = hacks/greynetic.c; sourceTree = "<group>"; };
+ AF480C29098E295D00FB32B8 /* halo.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = halo.c; path = hacks/halo.c; sourceTree = "<group>"; };
+ AF480C2F098E2A6700FB32B8 /* helix.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = helix.c; path = hacks/helix.c; sourceTree = "<group>"; };
+ AF480C58098E301400FB32B8 /* Helix.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Helix.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF480C82098E336D00FB32B8 /* drift.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = drift.c; path = hacks/drift.c; sourceTree = "<group>"; };
+ AF480C89098E346700FB32B8 /* xlockmore.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = xlockmore.h; path = hacks/xlockmore.h; sourceTree = "<group>"; };
+ AF480C8A098E34AB00FB32B8 /* xlockmoreI.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = xlockmoreI.h; path = hacks/xlockmoreI.h; sourceTree = "<group>"; };
+ AF480CBB098E37D600FB32B8 /* xlockmore.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = xlockmore.c; path = hacks/xlockmore.c; sourceTree = "<group>"; };
+ AF480D81098EEDDE00FB32B8 /* Drift.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Drift.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF480DD1098F4F6200FB32B8 /* dangerball.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = dangerball.c; path = hacks/glx/dangerball.c; sourceTree = "<group>"; };
+ AF480DF1098F528500FB32B8 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = "<absolute>"; };
+ AF480EAC098F63B000FB32B8 /* rotator.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = rotator.h; path = hacks/glx/rotator.h; sourceTree = "<group>"; };
+ AF480EAD098F63BE00FB32B8 /* trackball.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = trackball.c; path = hacks/glx/trackball.c; sourceTree = "<group>"; };
+ AF480EAF098F63CD00FB32B8 /* trackball.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = trackball.h; path = hacks/glx/trackball.h; sourceTree = "<group>"; };
+ AF480EB0098F63D600FB32B8 /* gltrackball.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = gltrackball.c; path = hacks/glx/gltrackball.c; sourceTree = "<group>"; };
+ AF480EB2098F63DF00FB32B8 /* gltrackball.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = gltrackball.h; path = hacks/glx/gltrackball.h; sourceTree = "<group>"; };
+ AF480EB7098F646400FB32B8 /* rotator.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = rotator.c; path = hacks/glx/rotator.c; sourceTree = "<group>"; };
+ AF480EBA098F648700FB32B8 /* sphere.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = sphere.h; path = hacks/glx/sphere.h; sourceTree = "<group>"; };
+ AF480EBB098F649600FB32B8 /* sphere.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = sphere.c; path = hacks/glx/sphere.c; sourceTree = "<group>"; };
+ AF480ED1098F651C00FB32B8 /* tube.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = tube.h; path = hacks/glx/tube.h; sourceTree = "<group>"; };
+ AF480ED2098F652A00FB32B8 /* tube.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = tube.c; path = hacks/glx/tube.c; sourceTree = "<group>"; };
+ AF480FE70990375900FB32B8 /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = "<absolute>"; };
+ AF4810FB09909FBA00FB32B8 /* DangerBall.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DangerBall.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF48112B0990A2C700FB32B8 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = "<absolute>"; };
+ AF4812250990CB8C00FB32B8 /* gears.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = gears.c; path = hacks/glx/gears.c; sourceTree = "<group>"; };
+ AF4812640990CE2700FB32B8 /* Gears.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Gears.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF4812760990CF5D00FB32B8 /* buildlwo.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = buildlwo.c; path = hacks/glx/buildlwo.c; sourceTree = "<group>"; };
+ AF4812770990CF5D00FB32B8 /* buildlwo.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = buildlwo.h; path = hacks/glx/buildlwo.h; sourceTree = "<group>"; };
+ AF4812780990CF5D00FB32B8 /* pipeobjs.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = pipeobjs.c; path = hacks/glx/pipeobjs.c; sourceTree = "<group>"; };
+ AF4812790990CF5D00FB32B8 /* pipes.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = pipes.c; path = hacks/glx/pipes.c; sourceTree = "<group>"; };
+ AF4812C60990D3D900FB32B8 /* Pipes.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Pipes.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF4812F70990D9AE00FB32B8 /* XScreenSaverGLView.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = XScreenSaverGLView.h; sourceTree = "<group>"; };
+ AF4812F80990D9AE00FB32B8 /* XScreenSaverGLView.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = XScreenSaverGLView.m; sourceTree = "<group>"; };
+ AF48DF030A0C25E000F94CF9 /* GLSchool.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GLSchool.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF48E1620A0C268400F94CF9 /* glschool_alg.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = glschool_alg.c; path = hacks/glx/glschool_alg.c; sourceTree = "<group>"; };
+ AF48E1630A0C268500F94CF9 /* glschool_alg.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = glschool_alg.h; path = hacks/glx/glschool_alg.h; sourceTree = "<group>"; };
+ AF48E1640A0C268500F94CF9 /* glschool_gl.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = glschool_gl.c; path = hacks/glx/glschool_gl.c; sourceTree = "<group>"; };
+ AF48E1650A0C268500F94CF9 /* glschool_gl.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = glschool_gl.h; path = hacks/glx/glschool_gl.h; sourceTree = "<group>"; };
+ AF48E1660A0C268500F94CF9 /* glschool.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = glschool.c; path = hacks/glx/glschool.c; sourceTree = "<group>"; };
+ AF48E1670A0C268500F94CF9 /* glschool.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = glschool.h; path = hacks/glx/glschool.h; sourceTree = "<group>"; };
+ AF48E16B0A0C26A400F94CF9 /* glschool.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = glschool.xml; sourceTree = "<group>"; };
+ AF4A345D102A593600A81B2A /* Surfaces.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Surfaces.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF4A3461102A59EB00A81B2A /* surfaces.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = surfaces.xml; sourceTree = "<group>"; };
+ AF4A3463102A5A0E00A81B2A /* surfaces.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = surfaces.c; path = hacks/glx/surfaces.c; sourceTree = "<group>"; };
+ AF4C300D208569A900BE1DEF /* dymaxionmap-coords.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "dymaxionmap-coords.c"; path = "hacks/glx/dymaxionmap-coords.c"; sourceTree = "<group>"; };
+ AF4FD6FA0CE7A486005EE58E /* Lockward.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Lockward.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF4FD7000CE7A577005EE58E /* lockward.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = lockward.c; path = hacks/glx/lockward.c; sourceTree = "<group>"; };
+ AF4FD7020CE7A5BC005EE58E /* lockward.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = lockward.xml; sourceTree = "<group>"; };
+ AF4FF4CE0D52CBDE00666F98 /* CubicGrid.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CubicGrid.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF4FF4D00D52CC8400666F98 /* cubicgrid.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = cubicgrid.c; path = hacks/glx/cubicgrid.c; sourceTree = "<group>"; };
+ AF4FF4D30D52CCAA00666F98 /* cubicgrid.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = cubicgrid.xml; sourceTree = "<group>"; };
+ AF56019B157DAA3D00DB2055 /* iSaverRunner.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = iSaverRunner.xib; sourceTree = "<group>"; };
+ AF561DF3159651A7007CA5ED /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/AudioToolbox.framework; sourceTree = DEVELOPER_DIR; };
+ AF561DF515969BC3007CA5ED /* grabclient-ios.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "grabclient-ios.m"; sourceTree = "<group>"; };
+ AF561DF715969C5B007CA5ED /* AssetsLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AssetsLibrary.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/AssetsLibrary.framework; sourceTree = DEVELOPER_DIR; };
+ AF5C9B0D1A0CCE6E00B0147A /* Cityflow.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Cityflow.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF5C9B0F1A0CCF4E00B0147A /* cityflow.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = cityflow.xml; sourceTree = "<group>"; };
+ AF5C9B101A0CCF4E00B0147A /* cityflow.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cityflow.c; path = hacks/glx/cityflow.c; sourceTree = "<group>"; };
+ AF5ECEC02116B1A400069433 /* VFeedback.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = VFeedback.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF5ECEC22116B2CC00069433 /* vfeedback.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vfeedback.c; path = hacks/vfeedback.c; sourceTree = "<group>"; };
+ AF5ECEC52116B2FE00069433 /* vfeedback.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = vfeedback.xml; sourceTree = "<group>"; };
+ AF6048F8157C07C600CA21E4 /* jwzgles.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jwzgles.c; path = ../jwxyz/jwzgles.c; sourceTree = "<group>"; };
+ AF6048F9157C07C600CA21E4 /* jwzgles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = jwzgles.h; path = ../jwxyz/jwzgles.h; sourceTree = "<group>"; };
+ AF6048FA157C07C600CA21E4 /* jwzglesI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = jwzglesI.h; path = ../jwxyz/jwzglesI.h; sourceTree = "<group>"; };
+ AF633C161EE0BA6F00AB33BD /* Vigilance.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Vigilance.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF633C181EE0BC4900AB33BD /* vigilance.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = vigilance.xml; sourceTree = "<group>"; };
+ AF633C191EE0BC4A00AB33BD /* vigilance.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vigilance.c; path = hacks/glx/vigilance.c; sourceTree = "<group>"; };
+ AF633C201EE0BDCD00AB33BD /* seccam.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = seccam.c; path = hacks/glx/seccam.c; sourceTree = "<group>"; };
+ AF63A8061AB4EDDB00593C75 /* RomanBoy.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RomanBoy.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF63A8081AB4EF5D00593C75 /* romanboy.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = romanboy.xml; sourceTree = "<group>"; };
+ AF63A8091AB4EF5D00593C75 /* romanboy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = romanboy.c; path = hacks/glx/romanboy.c; sourceTree = "<group>"; };
+ AF63F44E1C3465BE0033E133 /* Apple2.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Apple2.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF63F4741C34682A0033E133 /* Phosphor.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Phosphor.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF63F49A1C3469FC0033E133 /* TestX11.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TestX11.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF642405099FF9C2000F4CD4 /* Extrusion.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Extrusion.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF642409099FFAF0000F4CD4 /* extrusion-helix2.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "extrusion-helix2.c"; path = "hacks/glx/extrusion-helix2.c"; sourceTree = "<group>"; };
+ AF64240A099FFAF0000F4CD4 /* extrusion-helix3.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "extrusion-helix3.c"; path = "hacks/glx/extrusion-helix3.c"; sourceTree = "<group>"; };
+ AF64240B099FFAF0000F4CD4 /* extrusion-helix4.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "extrusion-helix4.c"; path = "hacks/glx/extrusion-helix4.c"; sourceTree = "<group>"; };
+ AF64240C099FFAF0000F4CD4 /* extrusion-joinoffset.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "extrusion-joinoffset.c"; path = "hacks/glx/extrusion-joinoffset.c"; sourceTree = "<group>"; };
+ AF64240D099FFAF0000F4CD4 /* extrusion-screw.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "extrusion-screw.c"; path = "hacks/glx/extrusion-screw.c"; sourceTree = "<group>"; };
+ AF64240E099FFAF0000F4CD4 /* extrusion-taper.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "extrusion-taper.c"; path = "hacks/glx/extrusion-taper.c"; sourceTree = "<group>"; };
+ AF64240F099FFAF1000F4CD4 /* extrusion-twistoid.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "extrusion-twistoid.c"; path = "hacks/glx/extrusion-twistoid.c"; sourceTree = "<group>"; };
+ AF642410099FFAF1000F4CD4 /* extrusion.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = extrusion.c; path = hacks/glx/extrusion.c; sourceTree = "<group>"; };
+ AF642411099FFAF1000F4CD4 /* extrusion.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = extrusion.h; path = hacks/glx/extrusion.h; sourceTree = "<group>"; };
+ AF6425DC09A18856000F4CD4 /* HyperCube.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HyperCube.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF6425DF09A188FB000F4CD4 /* hypercube.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = hypercube.c; path = hacks/hypercube.c; sourceTree = "<group>"; };
+ AF6425FC09A189EC000F4CD4 /* Qix.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Qix.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF6425FF09A18A94000F4CD4 /* qix.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = qix.c; path = hacks/qix.c; sourceTree = "<group>"; };
+ AF64261F09A18D6C000F4CD4 /* HyperBall.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HyperBall.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF64262209A18E1E000F4CD4 /* hyperball.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = hyperball.c; path = hacks/hyperball.c; sourceTree = "<group>"; };
+ AF64263C09A18F54000F4CD4 /* Moire2.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Moire2.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF64263F09A18FEB000F4CD4 /* moire2.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = moire2.c; path = hacks/moire2.c; sourceTree = "<group>"; };
+ AF64265F09A19229000F4CD4 /* Munch.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Munch.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF64266209A192C5000F4CD4 /* munch.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = munch.c; path = hacks/munch.c; sourceTree = "<group>"; };
+ AF64268B09A194B0000F4CD4 /* Goop.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Goop.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF64268E09A19542000F4CD4 /* goop.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = goop.c; path = hacks/goop.c; sourceTree = "<group>"; };
+ AF64278109A1D37A000F4CD4 /* SpeedMine.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SpeedMine.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF64278709A1D433000F4CD4 /* speedmine.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = speedmine.c; path = hacks/speedmine.c; sourceTree = "<group>"; };
+ AF6427B809A2DE36000F4CD4 /* Bubbles.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Bubbles.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF6427BB09A2DF47000F4CD4 /* bubbles-default.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "bubbles-default.c"; path = "hacks/bubbles-default.c"; sourceTree = "<group>"; };
+ AF6427BC09A2DF47000F4CD4 /* bubbles.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = bubbles.c; path = hacks/bubbles.c; sourceTree = "<group>"; };
+ AF6427BD09A2DF47000F4CD4 /* bubbles.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = bubbles.h; path = hacks/bubbles.h; sourceTree = "<group>"; };
+ AF68A49219196CF800D41CD1 /* Tessellimage.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tessellimage.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF68A49419196E3E00D41CD1 /* tessellimage.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = tessellimage.xml; sourceTree = "<group>"; };
+ AF68A49519196E3E00D41CD1 /* tessellimage.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tessellimage.c; path = hacks/tessellimage.c; sourceTree = "<group>"; };
+ AF68A49619196E3E00D41CD1 /* delaunay.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = delaunay.c; path = hacks/delaunay.c; sourceTree = "<group>"; };
+ AF73FF201A08AB9400E485E9 /* iSaverRunner57t.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = iSaverRunner57t.png; sourceTree = "<group>"; };
+ AF73FF361A09877F00E485E9 /* BinaryRing.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BinaryRing.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF73FF381A09889700E485E9 /* binaryring.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = binaryring.c; path = hacks/binaryring.c; sourceTree = "<group>"; };
+ AF73FF3B1A0988C500E485E9 /* binaryring.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = binaryring.xml; sourceTree = "<group>"; };
+ AF7511121782B5B900380EA1 /* Kaleidocycle.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Kaleidocycle.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF7511141782B64300380EA1 /* kaleidocycle.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = kaleidocycle.c; path = hacks/glx/kaleidocycle.c; sourceTree = "<group>"; };
+ AF7511161782B66400380EA1 /* kaleidescope.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = kaleidescope.xml; sourceTree = "<group>"; };
+ AF7776F609B63ABF00EA3033 /* Phosphor.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Phosphor.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF77770309B63B5F00EA3033 /* phosphor.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = phosphor.c; path = hacks/phosphor.c; sourceTree = "<group>"; };
+ AF77772A09B6416100EA3033 /* Pacman.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Pacman.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF77775109B6446500EA3033 /* FlipScreen3D.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FlipScreen3D.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF77775409B644FF00EA3033 /* flipscreen3d.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = flipscreen3d.c; path = hacks/glx/flipscreen3d.c; sourceTree = "<group>"; };
+ AF77778B09B64A2A00EA3033 /* gleidescope.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = gleidescope.c; path = hacks/glx/gleidescope.c; sourceTree = "<group>"; };
+ AF7777A209B64A5200EA3033 /* MirrorBlob.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MirrorBlob.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF7777A509B64AFC00EA3033 /* mirrorblob.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = mirrorblob.c; path = hacks/glx/mirrorblob.c; sourceTree = "<group>"; };
+ AF7777BF09B64BD400EA3033 /* stonerview-move.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "stonerview-move.c"; path = "hacks/glx/stonerview-move.c"; sourceTree = "<group>"; };
+ AF7777C009B64BD400EA3033 /* stonerview-move.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = "stonerview-move.h"; path = "hacks/glx/stonerview-move.h"; sourceTree = "<group>"; };
+ AF7777C109B64BD400EA3033 /* stonerview-osc.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "stonerview-osc.c"; path = "hacks/glx/stonerview-osc.c"; sourceTree = "<group>"; };
+ AF7777C209B64BD400EA3033 /* stonerview-osc.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = "stonerview-osc.h"; path = "hacks/glx/stonerview-osc.h"; sourceTree = "<group>"; };
+ AF7777C309B64BD400EA3033 /* stonerview-view.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "stonerview-view.c"; path = "hacks/glx/stonerview-view.c"; sourceTree = "<group>"; };
+ AF7777C409B64BD400EA3033 /* stonerview.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = stonerview.c; path = hacks/glx/stonerview.c; sourceTree = "<group>"; };
+ AF7777C509B64BD400EA3033 /* stonerview.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = stonerview.h; path = hacks/glx/stonerview.h; sourceTree = "<group>"; };
+ AF7777E409B64C6B00EA3033 /* GLSlideshow.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GLSlideshow.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF7777E709B64CF700EA3033 /* glslideshow.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = glslideshow.c; path = hacks/glx/glslideshow.c; sourceTree = "<group>"; };
+ AF7777FE09B64E3100EA3033 /* FlipText.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FlipText.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF77780109B64EC000EA3033 /* fliptext.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = fliptext.c; path = hacks/glx/fliptext.c; sourceTree = "<group>"; };
+ AF77780809B64F4900EA3033 /* texfont.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = texfont.c; path = hacks/glx/texfont.c; sourceTree = "<group>"; };
+ AF77780909B64F4900EA3033 /* texfont.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = texfont.h; path = hacks/glx/texfont.h; sourceTree = "<group>"; };
+ AF77782809B650FF00EA3033 /* starwars.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = starwars.c; path = hacks/glx/starwars.c; sourceTree = "<group>"; };
+ AF77782909B650FF00EA3033 /* starwars.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = starwars.txt; path = hacks/glx/starwars.txt; sourceTree = "<group>"; };
+ AF77785809B6528100EA3033 /* Carousel.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Carousel.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF77785E09B6530E00EA3033 /* carousel.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = carousel.c; path = hacks/glx/carousel.c; sourceTree = "<group>"; };
+ AF77787409B6536000EA3033 /* DNAlogo.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DNAlogo.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF77787609B653DC00EA3033 /* dnalogo.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = dnalogo.c; path = hacks/glx/dnalogo.c; sourceTree = "<group>"; };
+ AF77787909B6545E00EA3033 /* dnalogo.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = dnalogo.xml; sourceTree = "<group>"; };
+ AF77789209B656C300EA3033 /* fontglide.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = fontglide.c; path = hacks/fontglide.c; sourceTree = "<group>"; };
+ AF7778B509B659C800EA3033 /* BlitSpin.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BlitSpin.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF7778BA09B65A8A00EA3033 /* blitspin.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = blitspin.c; path = hacks/blitspin.c; sourceTree = "<group>"; };
+ AF7778BC09B65B1800EA3033 /* automata.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = automata.h; path = hacks/automata.h; sourceTree = "<group>"; };
+ AF7778BD09B65B3F00EA3033 /* atlantis.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = atlantis.h; path = hacks/glx/atlantis.h; sourceTree = "<group>"; };
+ AF7778BE09B65BA300EA3033 /* molecules.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; name = molecules.sh; path = hacks/glx/molecules.sh; sourceTree = "<group>"; };
+ AF7778C009B65C0F00EA3033 /* sproingies.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = sproingies.h; path = hacks/glx/sproingies.h; sourceTree = "<group>"; };
+ AF7778C109B65C6A00EA3033 /* e_textures.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = e_textures.h; path = hacks/glx/e_textures.h; sourceTree = "<group>"; };
+ AF78369617DB9F25003B9FC0 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
+ AF78377C17DBA85D003B9FC0 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/lib/libz.dylib; sourceTree = DEVELOPER_DIR; };
+ AF78D189142DD8F3002AAF77 /* Hilbert.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Hilbert.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF78D18A142DD96E002AAF77 /* hilbert.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hilbert.c; path = hacks/glx/hilbert.c; sourceTree = "<group>"; };
+ AF78D18E142DD99A002AAF77 /* hilbert.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = hilbert.xml; sourceTree = "<group>"; };
+ AF794F74099748450059A8B0 /* Demon.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Demon.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF794F7E099748860059A8B0 /* demon.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = demon.c; path = hacks/demon.c; sourceTree = "<group>"; };
+ AF794F9E09974A320059A8B0 /* Fiberlamp.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Fiberlamp.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF794FA909974AE30059A8B0 /* fiberlamp.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = fiberlamp.c; path = hacks/fiberlamp.c; sourceTree = "<group>"; };
+ AF794FDD09974FA60059A8B0 /* Loop.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Loop.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF794FE009974FEC0059A8B0 /* loop.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = loop.c; path = hacks/loop.c; sourceTree = "<group>"; };
+ AF795011099751940059A8B0 /* pacman_ai.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = pacman_ai.c; path = hacks/pacman_ai.c; sourceTree = "<group>"; };
+ AF795012099751940059A8B0 /* pacman_ai.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = pacman_ai.h; path = hacks/pacman_ai.h; sourceTree = "<group>"; };
+ AF795013099751940059A8B0 /* pacman_level.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = pacman_level.c; path = hacks/pacman_level.c; sourceTree = "<group>"; };
+ AF795014099751940059A8B0 /* pacman_level.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = pacman_level.h; path = hacks/pacman_level.h; sourceTree = "<group>"; };
+ AF795015099751940059A8B0 /* pacman.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = pacman.c; path = hacks/pacman.c; sourceTree = "<group>"; };
+ AF795016099751940059A8B0 /* pacman.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = pacman.h; path = hacks/pacman.h; sourceTree = "<group>"; };
+ AF7ACFD419FF0A9200BD752B /* GeodesicGears.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GeodesicGears.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF7ACFD619FF0B7A00BD752B /* geodesicgears.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = geodesicgears.c; path = hacks/glx/geodesicgears.c; sourceTree = "<group>"; };
+ AF7ACFD819FF0BA600BD752B /* geodesicgears.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = geodesicgears.xml; sourceTree = "<group>"; };
+ AF84AF1E15829AF000607E4C /* SaverListController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SaverListController.m; sourceTree = "<group>"; };
+ AF84FD4109B1209E00F3AB06 /* GLUT.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLUT.framework; path = /System/Library/Frameworks/GLUT.framework; sourceTree = "<absolute>"; };
+ AF91898F158FC00A002B5D1E /* XScreenSaver.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = XScreenSaver.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF939AD220351BFC0032DD23 /* font-retry.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "font-retry.c"; path = "utils/font-retry.c"; sourceTree = "<group>"; };
+ AF939AD42038C0040032DD23 /* luximr.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = luximr.ttf; sourceTree = "<group>"; };
+ AF94E7411A16E93600289B93 /* xscreensaver.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = xscreensaver.xcconfig; sourceTree = "<group>"; };
+ AF97573D099C317000B05160 /* IMSMap.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = IMSMap.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF975740099C31DD00B05160 /* imsmap.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = imsmap.c; path = hacks/imsmap.c; sourceTree = "<group>"; };
+ AF975785099C374A00B05160 /* Moire.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Moire.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF975789099C37A500B05160 /* moire.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = moire.c; path = hacks/moire.c; sourceTree = "<group>"; };
+ AF9757D2099C3E6300B05160 /* RDbomb.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RDbomb.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF9757D5099C3EB800B05160 /* rd-bomb.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "rd-bomb.c"; path = "hacks/rd-bomb.c"; sourceTree = "<group>"; };
+ AF975818099C41D500B05160 /* XFlame.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XFlame.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF97582F099C427500B05160 /* xflame.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = xflame.c; path = hacks/xflame.c; sourceTree = "<group>"; };
+ AF975875099C475900B05160 /* ShadeBobs.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ShadeBobs.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF97587A099C492000B05160 /* shadebobs.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = shadebobs.c; path = hacks/shadebobs.c; sourceTree = "<group>"; };
+ AF975A46099C681F00B05160 /* MetaBalls.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MetaBalls.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF975A49099C689F00B05160 /* metaballs.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = metaballs.c; path = hacks/metaballs.c; sourceTree = "<group>"; };
+ AF975A7C099C6AB200B05160 /* Eruption.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Eruption.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF975A83099C6B4900B05160 /* eruption.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = eruption.c; path = hacks/eruption.c; sourceTree = "<group>"; };
+ AF975A96099C6BC300B05160 /* Barcode.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Barcode.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF975A99099C6C3500B05160 /* barcode.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = barcode.c; path = hacks/barcode.c; sourceTree = "<group>"; };
+ AF975AE7099C6EB100B05160 /* Fireworkx.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Fireworkx.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF975AEE099C6F1700B05160 /* fireworkx.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = fireworkx.c; path = hacks/fireworkx.c; sourceTree = "<group>"; };
+ AF975B0C099C6FE400B05160 /* MemScroller.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MemScroller.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF975B14099C709E00B05160 /* memscroller.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = memscroller.c; path = hacks/memscroller.c; sourceTree = "<group>"; };
+ AF975C22099C8C1500B05160 /* Halo.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Halo.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF975C4E099C8DCF00B05160 /* Greynetic.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Greynetic.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF975C6E099C8F3F00B05160 /* NoseGuy.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NoseGuy.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF975C76099C8FC700B05160 /* noseguy.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = noseguy.c; path = hacks/noseguy.c; sourceTree = "<group>"; };
+ AF975C91099C929800B05160 /* ximage-loader.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "ximage-loader.c"; path = "hacks/ximage-loader.c"; sourceTree = "<group>"; };
+ AF975C92099C929800B05160 /* ximage-loader.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = "ximage-loader.h"; path = "hacks/ximage-loader.h"; sourceTree = "<group>"; };
+ AF975D63099CA0F000B05160 /* Rocks.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Rocks.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF975D66099CA16A00B05160 /* rocks.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = rocks.c; path = hacks/rocks.c; sourceTree = "<group>"; };
+ AF976DFA09896BEB001F8B92 /* attraction.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = attraction.c; path = hacks/attraction.c; sourceTree = "<group>"; };
+ AF976ED30989BF59001F8B92 /* ScreenSaver.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ScreenSaver.framework; path = /System/Library/Frameworks/ScreenSaver.framework; sourceTree = "<absolute>"; };
+ AF976FBC0989CAA2001F8B92 /* Deco.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Deco.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF9770400989D1E6001F8B92 /* Rorschach.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Rorschach.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF97707D0989D2F6001F8B92 /* Attraction.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Attraction.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF9771D70989DC4A001F8B92 /* SaverTester.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SaverTester.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF9771D90989DC4A001F8B92 /* SaverRunner.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = SaverRunner.plist; sourceTree = "<group>"; };
+ AF9772E20989DFC6001F8B92 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/SaverRunner.nib; sourceTree = "<group>"; };
+ AF998EEE0A083DB30051049D /* TopBlock.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TopBlock.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF998EF80A083E750051049D /* topblock.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = topblock.c; path = hacks/glx/topblock.c; sourceTree = "<group>"; };
+ AF998EFA0A083E8C0051049D /* topblock.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = topblock.xml; sourceTree = "<group>"; };
+ AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */ = {isa = PBXFileReference; fileEncoding = 5; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = XScreenSaverSubclass.m; sourceTree = "<group>"; };
+ AF9D467609B5109C006E59CF /* DecayScreen.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DecayScreen.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF9D467809B5110B006E59CF /* decayscreen.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = decayscreen.c; path = hacks/decayscreen.c; sourceTree = "<group>"; };
+ AF9D468E09B51567006E59CF /* grabclient-osx.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = "grabclient-osx.m"; sourceTree = "<group>"; };
+ AF9D473609B52EE0006E59CF /* colorbars.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = colorbars.c; path = utils/colorbars.c; sourceTree = "<group>"; };
+ AF9D473709B52EE0006E59CF /* colorbars.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = colorbars.h; path = utils/colorbars.h; sourceTree = "<group>"; };
+ AF9D475409B5300A006E59CF /* SlideScreen.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SlideScreen.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF9D475809B53091006E59CF /* slidescreen.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = slidescreen.c; path = hacks/slidescreen.c; sourceTree = "<group>"; };
+ AF9D476F09B53166006E59CF /* Zoom.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Zoom.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF9D48D409B53229006E59CF /* zoom.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = zoom.c; path = hacks/zoom.c; sourceTree = "<group>"; };
+ AF9D48EB09B53322006E59CF /* Bumps.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Bumps.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF9D48EE09B533AE006E59CF /* bumps.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = bumps.c; path = hacks/bumps.c; sourceTree = "<group>"; };
+ AF9D490409B535DA006E59CF /* Distort.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Distort.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF9D490709B536F7006E59CF /* distort.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = distort.c; path = hacks/distort.c; sourceTree = "<group>"; };
+ AF9D493B09B53CBA006E59CF /* Ripples.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Ripples.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF9D493E09B53D55006E59CF /* ripples.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = ripples.c; path = hacks/ripples.c; sourceTree = "<group>"; };
+ AF9D496409B53FC9006E59CF /* RotZoomer.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RotZoomer.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF9D496709B540A4006E59CF /* rotzoomer.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = rotzoomer.c; path = hacks/rotzoomer.c; sourceTree = "<group>"; };
+ AF9D497C09B5411D006E59CF /* Twang.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Twang.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF9D497F09B541E5006E59CF /* twang.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = twang.c; path = hacks/twang.c; sourceTree = "<group>"; };
+ AF9D49A709B544C3006E59CF /* Spotlight.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Spotlight.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF9D49AA09B54596006E59CF /* spotlight.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = spotlight.c; path = hacks/spotlight.c; sourceTree = "<group>"; };
+ AF9D4C7909B59F27006E59CF /* XLyap.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XLyap.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF9D4C7C09B5A044006E59CF /* xlyap.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = xlyap.c; path = hacks/xlyap.c; sourceTree = "<group>"; };
+ AF9D4CF709B5AA8E006E59CF /* Pong.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Pong.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF9D4CFA09B5AC94006E59CF /* analogtv.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = analogtv.c; path = hacks/analogtv.c; sourceTree = "<group>"; };
+ AF9D4CFB09B5AC94006E59CF /* analogtv.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = analogtv.h; path = hacks/analogtv.h; sourceTree = "<group>"; };
+ AF9D4CFC09B5AC94006E59CF /* pong.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = pong.c; path = hacks/pong.c; sourceTree = "<group>"; };
+ AF9D4D8F09B5B2DC006E59CF /* XAnalogTV.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XAnalogTV.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF9D4D9209B5B444006E59CF /* xanalogtv.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = xanalogtv.c; path = hacks/xanalogtv.c; sourceTree = "<group>"; };
+ AF9D4DC009B5B71E006E59CF /* BSOD.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BSOD.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF9D4DC309B5B87D006E59CF /* bsod.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = bsod.c; path = hacks/bsod.c; sourceTree = "<group>"; };
+ AF9D4DD309B5B990006E59CF /* apple2.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = apple2.c; path = hacks/apple2.c; sourceTree = "<group>"; };
+ AF9D4DFE09B5BB19006E59CF /* Apple2.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Apple2.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF9D4E0509B5BC9D006E59CF /* apple2-main.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "apple2-main.c"; path = "hacks/apple2-main.c"; sourceTree = "<group>"; };
+ AF9E7EBF190F4C1B00A8B01F /* enable_gc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = enable_gc; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF9E7EC8190F4C4000A8B01F /* enable_gc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = enable_gc.c; sourceTree = "<group>"; };
+ AFA211881CD1AA1800C0D2A1 /* textclient-mobile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "textclient-mobile.c"; path = "utils/textclient-mobile.c"; sourceTree = "<group>"; };
+ AFA211A11CD59DAF00C0D2A1 /* RaverHoop.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RaverHoop.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA211A31CD59FD800C0D2A1 /* raverhoop.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = raverhoop.c; path = hacks/glx/raverhoop.c; sourceTree = "<group>"; };
+ AFA211A41CD59FD800C0D2A1 /* raverhoop.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = raverhoop.xml; sourceTree = "<group>"; };
+ AFA339400B058505002B0E7D /* WebCollage.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WebCollage.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA33BAE0B0585F7002B0E7D /* webcollage-cocoa.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; name = "webcollage-cocoa.m"; path = "hacks/webcollage-cocoa.m"; sourceTree = "<group>"; };
+ AFA33BC70B058740002B0E7D /* webcollage-helper */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "webcollage-helper"; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA33BD00B0587EE002B0E7D /* webcollage-helper-cocoa.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; name = "webcollage-helper-cocoa.m"; path = "hacks/webcollage-helper-cocoa.m"; sourceTree = "<group>"; };
+ AFA33C0A0B058E6B002B0E7D /* webcollage */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.perl; name = webcollage; path = hacks/webcollage; sourceTree = "<group>"; };
+ AFA55864099324D800F3E977 /* minixpm.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = minixpm.c; path = utils/minixpm.c; sourceTree = "<group>"; };
+ AFA55865099324D800F3E977 /* minixpm.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = minixpm.h; path = utils/minixpm.h; sourceTree = "<group>"; };
+ AFA5595A099330B000F3E977 /* Cage.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Cage.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA5595D0993310500F3E977 /* cage.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = cage.c; path = hacks/glx/cage.c; sourceTree = "<group>"; };
+ AFA5597F0993317900F3E977 /* Moebius.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Moebius.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55982099331C300F3E977 /* moebius.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = moebius.c; path = hacks/glx/moebius.c; sourceTree = "<group>"; };
+ AFA559A40993322100F3E977 /* Superquadrics.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Superquadrics.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA559A80993326300F3E977 /* superquadrics.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = superquadrics.c; path = hacks/glx/superquadrics.c; sourceTree = "<group>"; };
+ AFA559C70993328000F3E977 /* Morph3D.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Morph3D.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA559CC099332E800F3E977 /* morph3d.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = morph3d.c; path = hacks/glx/morph3d.c; sourceTree = "<group>"; };
+ AFA559E10993330600F3E977 /* Rubik.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Rubik.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA559EA0993335C00F3E977 /* rubik.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = rubik.c; path = hacks/glx/rubik.c; sourceTree = "<group>"; };
+ AFA55A150993340300F3E977 /* Stairs.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Stairs.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55A1A0993345900F3E977 /* stairs.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = stairs.c; path = hacks/glx/stairs.c; sourceTree = "<group>"; };
+ AFA55A32099334A000F3E977 /* Sproingies.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Sproingies.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55A3E0993351F00F3E977 /* gllist.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = gllist.c; path = hacks/glx/gllist.c; sourceTree = "<group>"; };
+ AFA55A3F0993351F00F3E977 /* gllist.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = gllist.h; path = hacks/glx/gllist.h; sourceTree = "<group>"; };
+ AFA55A400993351F00F3E977 /* s1_1.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = s1_1.c; path = hacks/glx/s1_1.c; sourceTree = "<group>"; };
+ AFA55A410993351F00F3E977 /* s1_2.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = s1_2.c; path = hacks/glx/s1_2.c; sourceTree = "<group>"; };
+ AFA55A420993351F00F3E977 /* s1_3.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = s1_3.c; path = hacks/glx/s1_3.c; sourceTree = "<group>"; };
+ AFA55A430993351F00F3E977 /* s1_4.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = s1_4.c; path = hacks/glx/s1_4.c; sourceTree = "<group>"; };
+ AFA55A440993351F00F3E977 /* s1_5.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = s1_5.c; path = hacks/glx/s1_5.c; sourceTree = "<group>"; };
+ AFA55A450993351F00F3E977 /* s1_6.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = s1_6.c; path = hacks/glx/s1_6.c; sourceTree = "<group>"; };
+ AFA55A460993351F00F3E977 /* s1_b.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = s1_b.c; path = hacks/glx/s1_b.c; sourceTree = "<group>"; };
+ AFA55A470993351F00F3E977 /* sproingies.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = sproingies.c; path = hacks/glx/sproingies.c; sourceTree = "<group>"; };
+ AFA55A480993351F00F3E977 /* sproingiewrap.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = sproingiewrap.c; path = hacks/glx/sproingiewrap.c; sourceTree = "<group>"; };
+ AFA55A8B0993364300F3E977 /* Lament.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Lament.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55A8E0993369100F3E977 /* lament.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = lament.c; path = hacks/glx/lament.c; sourceTree = "<group>"; };
+ AFA55A93099336D800F3E977 /* normals.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = normals.c; path = hacks/glx/normals.c; sourceTree = "<group>"; };
+ AFA55A94099336D800F3E977 /* normals.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = normals.h; path = hacks/glx/normals.h; sourceTree = "<group>"; };
+ AFA55AE109933CEF00F3E977 /* Bubble3D.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Bubble3D.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55AE409933D3800F3E977 /* bubble3d.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = bubble3d.c; path = hacks/glx/bubble3d.c; sourceTree = "<group>"; };
+ AFA55AE809933D5900F3E977 /* bubble3d.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = bubble3d.h; path = hacks/glx/bubble3d.h; sourceTree = "<group>"; };
+ AFA55AF409933DBF00F3E977 /* b_draw.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = b_draw.c; path = hacks/glx/b_draw.c; sourceTree = "<group>"; };
+ AFA55AF509933DBF00F3E977 /* b_lockglue.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = b_lockglue.c; path = hacks/glx/b_lockglue.c; sourceTree = "<group>"; };
+ AFA55AF609933DBF00F3E977 /* b_sphere.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = b_sphere.c; path = hacks/glx/b_sphere.c; sourceTree = "<group>"; };
+ AFA55B1E09933E0500F3E977 /* GLPlanet.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GLPlanet.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55B2109933E4A00F3E977 /* glplanet.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = glplanet.c; path = hacks/glx/glplanet.c; sourceTree = "<group>"; };
+ AFA55B3709933E8D00F3E977 /* Pulsar.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Pulsar.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55B3F09933EC600F3E977 /* pulsar.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = pulsar.c; path = hacks/glx/pulsar.c; sourceTree = "<group>"; };
+ AFA55B8B09933F7200F3E977 /* Sierpinski3D.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Sierpinski3D.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55B8E09933FBF00F3E977 /* sierpinski3d.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = sierpinski3d.c; path = hacks/glx/sierpinski3d.c; sourceTree = "<group>"; };
+ AFA55BA309933FDA00F3E977 /* GFlux.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GFlux.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55BA60993401A00F3E977 /* gflux.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = gflux.c; path = hacks/glx/gflux.c; sourceTree = "<group>"; };
+ AFA55BBD099340CE00F3E977 /* Circuit.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Circuit.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55BC00993416E00F3E977 /* circuit.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = circuit.c; path = hacks/glx/circuit.c; sourceTree = "<group>"; };
+ AFA55BF60993429100F3E977 /* Menger.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Menger.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55BF9099342D500F3E977 /* menger.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = menger.c; path = hacks/glx/menger.c; sourceTree = "<group>"; };
+ AFA55C200993431300F3E977 /* Engine.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Engine.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55C230993435300F3E977 /* engine.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = engine.c; path = hacks/glx/engine.c; sourceTree = "<group>"; };
+ AFA55C89099349A600F3E977 /* GLSnake.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GLSnake.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55C8C099349EE00F3E977 /* glsnake.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = glsnake.c; path = hacks/glx/glsnake.c; sourceTree = "<group>"; };
+ AFA55CBB09934BB200F3E977 /* Boxed.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Boxed.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55CBE09934C0900F3E977 /* boxed.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = boxed.c; path = hacks/glx/boxed.c; sourceTree = "<group>"; };
+ AFA55CBF09934C0900F3E977 /* boxed.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = boxed.h; path = hacks/glx/boxed.h; sourceTree = "<group>"; };
+ AFA55CDE09934CE400F3E977 /* GLForestFire.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GLForestFire.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55CE109934D2E00F3E977 /* glforestfire.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = glforestfire.c; path = hacks/glx/glforestfire.c; sourceTree = "<group>"; };
+ AFA55D4E0993565300F3E977 /* SBalls.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SBalls.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55D510993569C00F3E977 /* sballs.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = sballs.c; path = hacks/glx/sballs.c; sourceTree = "<group>"; };
+ AFA55D740993584B00F3E977 /* Cubenetic.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Cubenetic.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55D770993589300F3E977 /* cubenetic.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = cubenetic.c; path = hacks/glx/cubenetic.c; sourceTree = "<group>"; };
+ AFA55D91099358C400F3E977 /* Spheremonics.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Spheremonics.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55D940993590F00F3E977 /* spheremonics.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = spheremonics.c; path = hacks/glx/spheremonics.c; sourceTree = "<group>"; };
+ AFA55DDA09935D7000F3E977 /* Lavalite.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Lavalite.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55DDD09935DB600F3E977 /* lavalite.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = lavalite.c; path = hacks/glx/lavalite.c; sourceTree = "<group>"; };
+ AFA55DE109935DFB00F3E977 /* marching.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = marching.c; path = hacks/glx/marching.c; sourceTree = "<group>"; };
+ AFA55DE209935DFB00F3E977 /* marching.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = marching.h; path = hacks/glx/marching.h; sourceTree = "<group>"; };
+ AFA55E0309935E4900F3E977 /* Queens.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Queens.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55E0609935EB800F3E977 /* queens.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = queens.c; path = hacks/glx/queens.c; sourceTree = "<group>"; };
+ AFA55E1F09935EDC00F3E977 /* Endgame.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Endgame.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55E2209935F2B00F3E977 /* chessgames.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = chessgames.h; path = hacks/glx/chessgames.h; sourceTree = "<group>"; };
+ AFA55E2309935F2B00F3E977 /* chessmodels.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = chessmodels.c; path = hacks/glx/chessmodels.c; sourceTree = "<group>"; };
+ AFA55E2409935F2B00F3E977 /* chessmodels.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = chessmodels.h; path = hacks/glx/chessmodels.h; sourceTree = "<group>"; };
+ AFA55E2509935F2B00F3E977 /* endgame.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = endgame.c; path = hacks/glx/endgame.c; sourceTree = "<group>"; };
+ AFA55E4209935F8E00F3E977 /* GLBlur.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GLBlur.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55E4509935FD300F3E977 /* glblur.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = glblur.c; path = hacks/glx/glblur.c; sourceTree = "<group>"; };
+ AFA55E6009935FF900F3E977 /* FlyingToasters.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FlyingToasters.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55E980993608800F3E977 /* flyingtoasters.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = flyingtoasters.c; path = hacks/glx/flyingtoasters.c; sourceTree = "<group>"; };
+ AFA55E990993608800F3E977 /* toast.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = toast.c; path = hacks/glx/toast.c; sourceTree = "<group>"; };
+ AFA55E9A0993608800F3E977 /* toast.dxf */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = toast.dxf; path = hacks/glx/toast.dxf; sourceTree = "<group>"; };
+ AFA55E9B0993608800F3E977 /* toast2.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = toast2.c; path = hacks/glx/toast2.c; sourceTree = "<group>"; };
+ AFA55E9C0993608800F3E977 /* toast2.dxf */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = toast2.dxf; path = hacks/glx/toast2.dxf; sourceTree = "<group>"; };
+ AFA55E9D0993608800F3E977 /* toaster_base.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = toaster_base.c; path = hacks/glx/toaster_base.c; sourceTree = "<group>"; };
+ AFA55E9F0993608800F3E977 /* toaster_handle.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = toaster_handle.c; path = hacks/glx/toaster_handle.c; sourceTree = "<group>"; };
+ AFA55EA10993608800F3E977 /* toaster_handle2.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = toaster_handle2.c; path = hacks/glx/toaster_handle2.c; sourceTree = "<group>"; };
+ AFA55EA30993608800F3E977 /* toaster_jet.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = toaster_jet.c; path = hacks/glx/toaster_jet.c; sourceTree = "<group>"; };
+ AFA55EA50993608800F3E977 /* toaster_knob.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = toaster_knob.c; path = hacks/glx/toaster_knob.c; sourceTree = "<group>"; };
+ AFA55EA70993608800F3E977 /* toaster_slots.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = toaster_slots.c; path = hacks/glx/toaster_slots.c; sourceTree = "<group>"; };
+ AFA55EA90993608800F3E977 /* toaster_wing.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = toaster_wing.c; path = hacks/glx/toaster_wing.c; sourceTree = "<group>"; };
+ AFA55EAB0993608800F3E977 /* toaster.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = toaster.c; path = hacks/glx/toaster.c; sourceTree = "<group>"; };
+ AFA55EAC0993608800F3E977 /* toaster.dxf */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; name = toaster.dxf; path = hacks/glx/toaster.dxf; sourceTree = "<group>"; };
+ AFA55EE3099360E300F3E977 /* BouncingCow.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BouncingCow.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55EE70993613E00F3E977 /* bouncingcow.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = bouncingcow.c; path = hacks/glx/bouncingcow.c; sourceTree = "<group>"; };
+ AFA55EE80993613E00F3E977 /* cow_face.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = cow_face.c; path = hacks/glx/cow_face.c; sourceTree = "<group>"; };
+ AFA55EE90993613E00F3E977 /* cow_hide.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = cow_hide.c; path = hacks/glx/cow_hide.c; sourceTree = "<group>"; };
+ AFA55EEA0993613E00F3E977 /* cow_hoofs.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = cow_hoofs.c; path = hacks/glx/cow_hoofs.c; sourceTree = "<group>"; };
+ AFA55EEB0993613E00F3E977 /* cow_horns.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = cow_horns.c; path = hacks/glx/cow_horns.c; sourceTree = "<group>"; };
+ AFA55EEC0993613E00F3E977 /* cow_tail.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = cow_tail.c; path = hacks/glx/cow_tail.c; sourceTree = "<group>"; };
+ AFA55EED0993613E00F3E977 /* cow_udder.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = cow_udder.c; path = hacks/glx/cow_udder.c; sourceTree = "<group>"; };
+ AFA55F1E099361B700F3E977 /* JigglyPuff.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = JigglyPuff.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55F210993620200F3E977 /* jigglypuff.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = jigglypuff.c; path = hacks/glx/jigglypuff.c; sourceTree = "<group>"; };
+ AFA55F3C0993622F00F3E977 /* Klein.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Klein.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55F3F0993626E00F3E977 /* klein.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = klein.c; path = hacks/glx/klein.c; sourceTree = "<group>"; };
+ AFA55F540993629000F3E977 /* Hypertorus.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Hypertorus.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55F59099362DF00F3E977 /* hypertorus.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = hypertorus.c; path = hacks/glx/hypertorus.c; sourceTree = "<group>"; };
+ AFA55F840993643600F3E977 /* GLMatrix.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GLMatrix.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55F870993648500F3E977 /* glmatrix.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = glmatrix.c; path = hacks/glx/glmatrix.c; sourceTree = "<group>"; };
+ AFA55FE509936BFA00F3E977 /* CubeStorm.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CubeStorm.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA55FF309936C4500F3E977 /* cubestorm.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = cubestorm.c; path = hacks/glx/cubestorm.c; sourceTree = "<group>"; };
+ AFA5600B09936C6D00F3E977 /* GLKnots.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GLKnots.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA5600E09936CB300F3E977 /* glknots.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = glknots.c; path = hacks/glx/glknots.c; sourceTree = "<group>"; };
+ AFA5602609936CC800F3E977 /* BlockTube.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BlockTube.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA5602909936D0700F3E977 /* blocktube.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = blocktube.c; path = hacks/glx/blocktube.c; sourceTree = "<group>"; };
+ AFA5604409936D5100F3E977 /* FlipFlop.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FlipFlop.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA5604709936DCC00F3E977 /* flipflop.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = flipflop.c; path = hacks/glx/flipflop.c; sourceTree = "<group>"; };
+ AFA5605C09936E2100F3E977 /* AntInspect.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AntInspect.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA5605F09936E9C00F3E977 /* antinspect.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = antinspect.c; path = hacks/glx/antinspect.c; sourceTree = "<group>"; };
+ AFA5607409936F3800F3E977 /* AntSpotlight.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AntSpotlight.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA5607709936FDD00F3E977 /* ants.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = ants.h; path = hacks/glx/ants.h; sourceTree = "<group>"; };
+ AFA5607809936FDD00F3E977 /* antspotlight.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = antspotlight.c; path = hacks/glx/antspotlight.c; sourceTree = "<group>"; };
+ AFA5607909936FDD00F3E977 /* grab-ximage.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "grab-ximage.c"; path = "hacks/glx/grab-ximage.c"; sourceTree = "<group>"; };
+ AFA5607A09936FDD00F3E977 /* grab-ximage.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = "grab-ximage.h"; path = "hacks/glx/grab-ximage.h"; sourceTree = "<group>"; };
+ AFA560C00993718D00F3E977 /* Polytopes.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Polytopes.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA560C3099371D500F3E977 /* polytopes.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = polytopes.c; path = hacks/glx/polytopes.c; sourceTree = "<group>"; };
+ AFA5610F0993781600F3E977 /* Molecule.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Molecule.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA561120993786800F3E977 /* molecule.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = molecule.c; path = hacks/glx/molecule.c; sourceTree = "<group>"; };
+ AFA5616A09937C0D00F3E977 /* BlinkBox.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BlinkBox.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA5616D09937C9A00F3E977 /* blinkbox.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = blinkbox.c; path = hacks/glx/blinkbox.c; sourceTree = "<group>"; };
+ AFA5618D09937CF100F3E977 /* Noof.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Noof.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA5619009937D3600F3E977 /* noof.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = noof.c; path = hacks/glx/noof.c; sourceTree = "<group>"; };
+ AFA561AF09937D7E00F3E977 /* Polyhedra.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Polyhedra.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA561B209937DCB00F3E977 /* polyhedra-gl.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "polyhedra-gl.c"; path = "hacks/glx/polyhedra-gl.c"; sourceTree = "<group>"; };
+ AFA561B309937DCC00F3E977 /* polyhedra.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = polyhedra.c; path = hacks/glx/polyhedra.c; sourceTree = "<group>"; };
+ AFA561B409937DCC00F3E977 /* polyhedra.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = polyhedra.h; path = hacks/glx/polyhedra.h; sourceTree = "<group>"; };
+ AFA562190993849F00F3E977 /* Providence.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Providence.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA5621C099384F600F3E977 /* providence.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = providence.c; path = hacks/glx/providence.c; sourceTree = "<group>"; };
+ AFA562310993852500F3E977 /* Pinion.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Pinion.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA562340993856A00F3E977 /* pinion.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = pinion.c; path = hacks/glx/pinion.c; sourceTree = "<group>"; };
+ AFA562D1099392C600F3E977 /* Boing.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Boing.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA562D40993930C00F3E977 /* boing.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = boing.c; path = hacks/glx/boing.c; sourceTree = "<group>"; };
+ AFA562EC099393C900F3E977 /* AntMaze.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AntMaze.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA562EF0993941600F3E977 /* antmaze.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = antmaze.c; path = hacks/glx/antmaze.c; sourceTree = "<group>"; };
+ AFA563040993943B00F3E977 /* Tangram.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tangram.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA563070993948F00F3E977 /* tangram_shapes.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = tangram_shapes.c; path = hacks/glx/tangram_shapes.c; sourceTree = "<group>"; };
+ AFA563080993948F00F3E977 /* tangram_shapes.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = tangram_shapes.h; path = hacks/glx/tangram_shapes.h; sourceTree = "<group>"; };
+ AFA563090993948F00F3E977 /* tangram.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = tangram.c; path = hacks/glx/tangram.c; sourceTree = "<group>"; };
+ AFA563260993951000F3E977 /* Crackberg.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Crackberg.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA563290993957100F3E977 /* crackberg.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = crackberg.c; path = hacks/glx/crackberg.c; sourceTree = "<group>"; };
+ AFA56343099395ED00F3E977 /* GLHanoi.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GLHanoi.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA563460993963400F3E977 /* glhanoi.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = glhanoi.c; path = hacks/glx/glhanoi.c; sourceTree = "<group>"; };
+ AFA56363099396C000F3E977 /* Cube21.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Cube21.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA563660993970F00F3E977 /* cube21.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = cube21.c; path = hacks/glx/cube21.c; sourceTree = "<group>"; };
+ AFA5638B099397B300F3E977 /* TimeTunnel.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TimeTunnel.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA5638E0993980D00F3E977 /* timetunnel.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = timetunnel.c; path = hacks/glx/timetunnel.c; sourceTree = "<group>"; };
+ AFA563B6099398BB00F3E977 /* Juggler3D.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Juggler3D.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA563B90993991300F3E977 /* juggler3d.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = juggler3d.c; path = hacks/glx/juggler3d.c; sourceTree = "<group>"; };
+ AFA6AB0520999950006D2685 /* GlitchPEG.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GlitchPEG.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFA6AB0C20999A60006D2685 /* glitchpeg.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = glitchpeg.xml; sourceTree = "<group>"; };
+ AFA6AB0E20999A7B006D2685 /* glitchpeg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = glitchpeg.c; path = hacks/glitchpeg.c; sourceTree = "<group>"; };
+ AFAA6B441773F07700DE720C /* ios-function-table.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "ios-function-table.m"; sourceTree = "<group>"; };
+ AFAAE39C207D6343007A515C /* Maze3D.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Maze3D.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFAAE39E207D6420007A515C /* maze3d.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = maze3d.c; path = hacks/glx/maze3d.c; sourceTree = "<group>"; };
+ AFAAE3A1207D6438007A515C /* maze3d.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = maze3d.xml; sourceTree = "<group>"; };
+ AFACE8881CC83458008B24CD /* EnergyStream.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = EnergyStream.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFACE88A1CC83578008B24CD /* energystream.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = energystream.c; path = hacks/glx/energystream.c; sourceTree = "<group>"; };
+ AFACE88B1CC83578008B24CD /* energystream.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = energystream.xml; sourceTree = "<group>"; };
+ AFAD462209D5F4DA00AB5F95 /* grabclient.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = grabclient.c; path = utils/grabclient.c; sourceTree = "<group>"; };
+ AFB591BA178B812C00EA4005 /* Hexadrop.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Hexadrop.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFB591BC178B81E600EA4005 /* hexadrop.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = hexadrop.xml; sourceTree = "<group>"; };
+ AFB591BD178B81E600EA4005 /* hexadrop.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hexadrop.c; path = hacks/hexadrop.c; sourceTree = "<group>"; };
+ AFB5A06B0981F4C600871B16 /* screenhack.h */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.h; name = screenhack.h; path = hacks/screenhack.h; sourceTree = "<group>"; };
+ AFB5A0ED0981FF8B00871B16 /* usleep.c */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.c; name = usleep.c; path = utils/usleep.c; sourceTree = "<group>"; };
+ AFB5A0EE0981FF8B00871B16 /* usleep.h */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.h; name = usleep.h; path = utils/usleep.h; sourceTree = "<group>"; };
+ AFB8A69A1782BA34004EDB85 /* kaleidocycle.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = kaleidocycle.xml; sourceTree = "<group>"; };
+ AFBE743F19A7C6930018AA35 /* robot.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = robot.c; path = hacks/glx/robot.c; sourceTree = "<group>"; };
+ AFBF893C0E41D930006A2D66 /* fps.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = fps.c; path = hacks/fps.c; sourceTree = "<group>"; };
+ AFBF893D0E41D930006A2D66 /* fps.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = fps.h; path = hacks/fps.h; sourceTree = "<group>"; };
+ AFBF89AE0E423FC3006A2D66 /* fps-gl.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "fps-gl.c"; path = "hacks/glx/fps-gl.c"; sourceTree = "<group>"; };
+ AFBF89B10E424036006A2D66 /* fpsI.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = fpsI.h; path = hacks/fpsI.h; sourceTree = "<group>"; };
+ AFBFE75E178642DC00432B21 /* Apple2.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Apple2.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFBFE77E178647FE00432B21 /* Phosphor.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Phosphor.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFC0E8C01CDC601A008CAFAC /* Hydrostat.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Hydrostat.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFC0E8C21CDC60A9008CAFAC /* hydrostat.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hydrostat.c; path = hacks/glx/hydrostat.c; sourceTree = "<group>"; };
+ AFC0E8C31CDC60A9008CAFAC /* hydrostat.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = hydrostat.xml; sourceTree = "<group>"; };
+ AFC211930E4E30C800D87B6E /* teapot.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = teapot.c; path = hacks/glx/teapot.c; sourceTree = "<group>"; };
+ AFC211940E4E30C800D87B6E /* teapot.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = teapot.h; path = hacks/glx/teapot.h; sourceTree = "<group>"; };
+ AFC254B909873AF9000655EE /* screenhackI.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = screenhackI.h; path = hacks/screenhackI.h; sourceTree = "<group>"; };
+ AFC254C409882C97000655EE /* XScreenSaverView.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = XScreenSaverView.h; sourceTree = "<group>"; };
+ AFC254C509882C97000655EE /* XScreenSaverView.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = XScreenSaverView.m; sourceTree = "<group>"; };
+ AFC2577F09888F5A000655EE /* XScreenSaverConfigSheet.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = XScreenSaverConfigSheet.h; sourceTree = "<group>"; };
+ AFC2578009888F5A000655EE /* XScreenSaverConfigSheet.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = XScreenSaverConfigSheet.m; sourceTree = "<group>"; };
+ AFC258680988A468000655EE /* anemone.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = anemone.xml; sourceTree = "<group>"; };
+ AFC258690988A468000655EE /* anemotaxis.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = anemotaxis.xml; sourceTree = "<group>"; };
+ AFC2586A0988A468000655EE /* ant.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = ant.xml; sourceTree = "<group>"; };
+ AFC2586B0988A468000655EE /* antinspect.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = antinspect.xml; sourceTree = "<group>"; };
+ AFC2586C0988A468000655EE /* antmaze.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = antmaze.xml; sourceTree = "<group>"; };
+ AFC2586D0988A468000655EE /* antspotlight.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = antspotlight.xml; sourceTree = "<group>"; };
+ AFC2586E0988A468000655EE /* apollonian.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = apollonian.xml; sourceTree = "<group>"; };
+ AFC2586F0988A468000655EE /* apple2.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = apple2.xml; sourceTree = "<group>"; };
+ AFC258700988A468000655EE /* atlantis.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = atlantis.xml; sourceTree = "<group>"; };
+ AFC258710988A468000655EE /* attraction.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = attraction.xml; sourceTree = "<group>"; };
+ AFC258720988A468000655EE /* atunnel.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = atunnel.xml; sourceTree = "<group>"; };
+ AFC258730988A468000655EE /* barcode.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = barcode.xml; sourceTree = "<group>"; };
+ AFC258740988A468000655EE /* blaster.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = blaster.xml; sourceTree = "<group>"; };
+ AFC258750988A468000655EE /* blinkbox.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = blinkbox.xml; sourceTree = "<group>"; };
+ AFC258760988A468000655EE /* blitspin.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = blitspin.xml; sourceTree = "<group>"; };
+ AFC258770988A468000655EE /* blocktube.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = blocktube.xml; sourceTree = "<group>"; };
+ AFC258780988A468000655EE /* boing.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = boing.xml; sourceTree = "<group>"; };
+ AFC258790988A468000655EE /* bouboule.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = bouboule.xml; sourceTree = "<group>"; };
+ AFC2587A0988A468000655EE /* bouncingcow.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = bouncingcow.xml; sourceTree = "<group>"; };
+ AFC2587B0988A468000655EE /* boxed.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = boxed.xml; sourceTree = "<group>"; };
+ AFC2587C0988A468000655EE /* boxfit.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = boxfit.xml; sourceTree = "<group>"; };
+ AFC2587D0988A468000655EE /* braid.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = braid.xml; sourceTree = "<group>"; };
+ AFC2587E0988A468000655EE /* bsod.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = bsod.xml; sourceTree = "<group>"; };
+ AFC2587F0988A468000655EE /* bubble3d.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = bubble3d.xml; sourceTree = "<group>"; };
+ AFC258800988A468000655EE /* bubbles.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = bubbles.xml; sourceTree = "<group>"; };
+ AFC258810988A468000655EE /* bumps.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = bumps.xml; sourceTree = "<group>"; };
+ AFC258820988A468000655EE /* cage.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = cage.xml; sourceTree = "<group>"; };
+ AFC258830988A468000655EE /* carousel.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = carousel.xml; sourceTree = "<group>"; };
+ AFC258840988A468000655EE /* ccurve.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = ccurve.xml; sourceTree = "<group>"; };
+ AFC258850988A468000655EE /* celtic.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = celtic.xml; sourceTree = "<group>"; };
+ AFC258860988A468000655EE /* circuit.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = circuit.xml; sourceTree = "<group>"; };
+ AFC258870988A468000655EE /* cloudlife.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = cloudlife.xml; sourceTree = "<group>"; };
+ AFC258880988A468000655EE /* compass.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = compass.xml; sourceTree = "<group>"; };
+ AFC258890988A468000655EE /* coral.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = coral.xml; sourceTree = "<group>"; };
+ AFC2588B0988A468000655EE /* crackberg.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = crackberg.xml; sourceTree = "<group>"; };
+ AFC2588C0988A468000655EE /* critical.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = critical.xml; sourceTree = "<group>"; };
+ AFC2588D0988A468000655EE /* crystal.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = crystal.xml; sourceTree = "<group>"; };
+ AFC2588E0988A468000655EE /* cube21.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = cube21.xml; sourceTree = "<group>"; };
+ AFC2588F0988A468000655EE /* cubenetic.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = cubenetic.xml; sourceTree = "<group>"; };
+ AFC258900988A468000655EE /* cubestorm.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = cubestorm.xml; sourceTree = "<group>"; };
+ AFC258910988A468000655EE /* cynosure.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = cynosure.xml; sourceTree = "<group>"; };
+ AFC258920988A468000655EE /* dangerball.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = dangerball.xml; sourceTree = "<group>"; };
+ AFC258930988A468000655EE /* decayscreen.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = decayscreen.xml; sourceTree = "<group>"; };
+ AFC258940988A468000655EE /* deco.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = deco.xml; sourceTree = "<group>"; };
+ AFC258950988A468000655EE /* deluxe.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = deluxe.xml; sourceTree = "<group>"; };
+ AFC258960988A468000655EE /* demon.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = demon.xml; sourceTree = "<group>"; };
+ AFC258970988A468000655EE /* discrete.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = discrete.xml; sourceTree = "<group>"; };
+ AFC258980988A468000655EE /* distort.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = distort.xml; sourceTree = "<group>"; };
+ AFC258990988A468000655EE /* drift.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = drift.xml; sourceTree = "<group>"; };
+ AFC2589B0988A468000655EE /* endgame.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = endgame.xml; sourceTree = "<group>"; };
+ AFC2589C0988A468000655EE /* engine.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = engine.xml; sourceTree = "<group>"; };
+ AFC2589D0988A468000655EE /* epicycle.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = epicycle.xml; sourceTree = "<group>"; };
+ AFC2589E0988A468000655EE /* eruption.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = eruption.xml; sourceTree = "<group>"; };
+ AFC2589F0988A468000655EE /* euler2d.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = euler2d.xml; sourceTree = "<group>"; };
+ AFC258A00988A468000655EE /* extrusion.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = extrusion.xml; sourceTree = "<group>"; };
+ AFC258A10988A468000655EE /* fadeplot.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = fadeplot.xml; sourceTree = "<group>"; };
+ AFC258A20988A468000655EE /* fiberlamp.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = fiberlamp.xml; sourceTree = "<group>"; };
+ AFC258A40988A468000655EE /* fireworkx.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = fireworkx.xml; sourceTree = "<group>"; };
+ AFC258A50988A468000655EE /* flag.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = flag.xml; sourceTree = "<group>"; };
+ AFC258A60988A468000655EE /* flame.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = flame.xml; sourceTree = "<group>"; };
+ AFC258A70988A468000655EE /* flipflop.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = flipflop.xml; sourceTree = "<group>"; };
+ AFC258A80988A468000655EE /* flipscreen3d.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = flipscreen3d.xml; sourceTree = "<group>"; };
+ AFC258A90988A468000655EE /* fliptext.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = fliptext.xml; sourceTree = "<group>"; };
+ AFC258AA0988A468000655EE /* flow.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = flow.xml; sourceTree = "<group>"; };
+ AFC258AB0988A468000655EE /* fluidballs.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = fluidballs.xml; sourceTree = "<group>"; };
+ AFC258AC0988A468000655EE /* flurry.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = flurry.xml; sourceTree = "<group>"; };
+ AFC258AD0988A468000655EE /* flyingtoasters.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = flyingtoasters.xml; sourceTree = "<group>"; };
+ AFC258AE0988A468000655EE /* fontglide.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = fontglide.xml; sourceTree = "<group>"; };
+ AFC258AF0988A468000655EE /* forest.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = forest.xml; sourceTree = "<group>"; };
+ AFC258B00988A468000655EE /* fuzzyflakes.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = fuzzyflakes.xml; sourceTree = "<group>"; };
+ AFC258B10988A468000655EE /* galaxy.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = galaxy.xml; sourceTree = "<group>"; };
+ AFC258B20988A468000655EE /* gears.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = gears.xml; sourceTree = "<group>"; };
+ AFC258B30988A468000655EE /* gflux.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = gflux.xml; sourceTree = "<group>"; };
+ AFC258B40988A468000655EE /* glblur.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = glblur.xml; sourceTree = "<group>"; };
+ AFC258B50988A468000655EE /* gleidescope.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = gleidescope.xml; sourceTree = "<group>"; };
+ AFC258B60988A468000655EE /* glforestfire.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = glforestfire.xml; sourceTree = "<group>"; };
+ AFC258B70988A468000655EE /* glhanoi.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = glhanoi.xml; sourceTree = "<group>"; };
+ AFC258B80988A468000655EE /* glknots.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = glknots.xml; sourceTree = "<group>"; };
+ AFC258B90988A468000655EE /* glmatrix.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = glmatrix.xml; sourceTree = "<group>"; };
+ AFC258BA0988A468000655EE /* glplanet.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = glplanet.xml; sourceTree = "<group>"; };
+ AFC258BB0988A468000655EE /* glslideshow.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = glslideshow.xml; sourceTree = "<group>"; };
+ AFC258BC0988A468000655EE /* glsnake.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = glsnake.xml; sourceTree = "<group>"; };
+ AFC258BD0988A468000655EE /* gltext.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = gltext.xml; sourceTree = "<group>"; };
+ AFC258BF0988A468000655EE /* goop.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = goop.xml; sourceTree = "<group>"; };
+ AFC258C00988A468000655EE /* grav.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = grav.xml; sourceTree = "<group>"; };
+ AFC258C10988A468000655EE /* greynetic.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = greynetic.xml; sourceTree = "<group>"; };
+ AFC258C20988A468000655EE /* halftone.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = halftone.xml; sourceTree = "<group>"; };
+ AFC258C30988A468000655EE /* halo.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = halo.xml; sourceTree = "<group>"; };
+ AFC258C40988A468000655EE /* helix.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = helix.xml; sourceTree = "<group>"; };
+ AFC258C50988A468000655EE /* hopalong.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = hopalong.xml; sourceTree = "<group>"; };
+ AFC258C60988A468000655EE /* hyperball.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = hyperball.xml; sourceTree = "<group>"; };
+ AFC258C70988A468000655EE /* hypercube.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = hypercube.xml; sourceTree = "<group>"; };
+ AFC258C80988A468000655EE /* hypertorus.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = hypertorus.xml; sourceTree = "<group>"; };
+ AFC258C90988A468000655EE /* ifs.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = ifs.xml; sourceTree = "<group>"; };
+ AFC258CA0988A468000655EE /* imsmap.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = imsmap.xml; sourceTree = "<group>"; };
+ AFC258CB0988A468000655EE /* interaggregate.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = interaggregate.xml; sourceTree = "<group>"; };
+ AFC258CC0988A468000655EE /* interference.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = interference.xml; sourceTree = "<group>"; };
+ AFC258CD0988A468000655EE /* intermomentary.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = intermomentary.xml; sourceTree = "<group>"; };
+ AFC258CE0988A468000655EE /* jigglypuff.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = jigglypuff.xml; sourceTree = "<group>"; };
+ AFC258CF0988A468000655EE /* jigsaw.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = jigsaw.xml; sourceTree = "<group>"; };
+ AFC258D00988A468000655EE /* juggle.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = juggle.xml; sourceTree = "<group>"; };
+ AFC258D10988A468000655EE /* juggler3d.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = juggler3d.xml; sourceTree = "<group>"; };
+ AFC258D20988A468000655EE /* julia.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = julia.xml; sourceTree = "<group>"; };
+ AFC258D30988A468000655EE /* kaleidescope.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = kaleidescope.xml; sourceTree = "<group>"; };
+ AFC258D40988A468000655EE /* klein.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = klein.xml; sourceTree = "<group>"; };
+ AFC258D50988A468000655EE /* kumppa.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = kumppa.xml; sourceTree = "<group>"; };
+ AFC258D60988A468000655EE /* lament.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = lament.xml; sourceTree = "<group>"; };
+ AFC258D70988A468000655EE /* laser.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = laser.xml; sourceTree = "<group>"; };
+ AFC258D80988A468000655EE /* lavalite.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = lavalite.xml; sourceTree = "<group>"; };
+ AFC258D90988A468000655EE /* lightning.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = lightning.xml; sourceTree = "<group>"; };
+ AFC258DA0988A468000655EE /* lisa.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = lisa.xml; sourceTree = "<group>"; };
+ AFC258DB0988A468000655EE /* lissie.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = lissie.xml; sourceTree = "<group>"; };
+ AFC258DC0988A468000655EE /* lmorph.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = lmorph.xml; sourceTree = "<group>"; };
+ AFC258DD0988A468000655EE /* loop.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = loop.xml; sourceTree = "<group>"; };
+ AFC258DE0988A468000655EE /* maze.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = maze.xml; sourceTree = "<group>"; };
+ AFC258DF0988A469000655EE /* memscroller.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = memscroller.xml; sourceTree = "<group>"; };
+ AFC258E00988A469000655EE /* menger.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = menger.xml; sourceTree = "<group>"; };
+ AFC258E10988A469000655EE /* metaballs.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = metaballs.xml; sourceTree = "<group>"; };
+ AFC258E20988A469000655EE /* mirrorblob.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = mirrorblob.xml; sourceTree = "<group>"; };
+ AFC258E30988A469000655EE /* mismunch.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = mismunch.xml; sourceTree = "<group>"; };
+ AFC258E40988A469000655EE /* moebius.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = moebius.xml; sourceTree = "<group>"; };
+ AFC258E50988A469000655EE /* moire.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = moire.xml; sourceTree = "<group>"; };
+ AFC258E60988A469000655EE /* moire2.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = moire2.xml; sourceTree = "<group>"; };
+ AFC258E70988A469000655EE /* molecule.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = molecule.xml; sourceTree = "<group>"; };
+ AFC258E80988A469000655EE /* morph3d.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = morph3d.xml; sourceTree = "<group>"; };
+ AFC258E90988A469000655EE /* mountain.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = mountain.xml; sourceTree = "<group>"; };
+ AFC258EA0988A469000655EE /* munch.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = munch.xml; sourceTree = "<group>"; };
+ AFC258EB0988A469000655EE /* nerverot.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = nerverot.xml; sourceTree = "<group>"; };
+ AFC258EC0988A469000655EE /* noof.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = noof.xml; sourceTree = "<group>"; };
+ AFC258ED0988A469000655EE /* noseguy.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = noseguy.xml; sourceTree = "<group>"; };
+ AFC258EE0988A469000655EE /* pacman.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = pacman.xml; sourceTree = "<group>"; };
+ AFC258EF0988A469000655EE /* pedal.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = pedal.xml; sourceTree = "<group>"; };
+ AFC258F00988A469000655EE /* penetrate.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = penetrate.xml; sourceTree = "<group>"; };
+ AFC258F10988A469000655EE /* penrose.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = penrose.xml; sourceTree = "<group>"; };
+ AFC258F20988A469000655EE /* petri.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = petri.xml; sourceTree = "<group>"; };
+ AFC258F30988A469000655EE /* phosphor.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = phosphor.xml; sourceTree = "<group>"; };
+ AFC258F40988A469000655EE /* piecewise.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = piecewise.xml; sourceTree = "<group>"; };
+ AFC258F50988A469000655EE /* pinion.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = pinion.xml; sourceTree = "<group>"; };
+ AFC258F60988A469000655EE /* pipes.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = pipes.xml; sourceTree = "<group>"; };
+ AFC258F70988A469000655EE /* polyhedra.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = polyhedra.xml; sourceTree = "<group>"; };
+ AFC258F80988A469000655EE /* polyominoes.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = polyominoes.xml; sourceTree = "<group>"; };
+ AFC258F90988A469000655EE /* polytopes.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = polytopes.xml; sourceTree = "<group>"; };
+ AFC258FA0988A469000655EE /* pong.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = pong.xml; sourceTree = "<group>"; };
+ AFC258FB0988A469000655EE /* popsquares.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = popsquares.xml; sourceTree = "<group>"; };
+ AFC258FC0988A469000655EE /* providence.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = providence.xml; sourceTree = "<group>"; };
+ AFC258FD0988A469000655EE /* pulsar.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = pulsar.xml; sourceTree = "<group>"; };
+ AFC258FE0988A469000655EE /* pyro.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = pyro.xml; sourceTree = "<group>"; };
+ AFC258FF0988A469000655EE /* qix.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = qix.xml; sourceTree = "<group>"; };
+ AFC259000988A469000655EE /* queens.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = queens.xml; sourceTree = "<group>"; };
+ AFC259030988A469000655EE /* ripples.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = ripples.xml; sourceTree = "<group>"; };
+ AFC259040988A469000655EE /* rocks.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = rocks.xml; sourceTree = "<group>"; };
+ AFC259050988A469000655EE /* rorschach.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = rorschach.xml; sourceTree = "<group>"; };
+ AFC259060988A469000655EE /* rotor.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = rotor.xml; sourceTree = "<group>"; };
+ AFC259070988A469000655EE /* rotzoomer.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = rotzoomer.xml; sourceTree = "<group>"; };
+ AFC259080988A469000655EE /* rubik.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = rubik.xml; sourceTree = "<group>"; };
+ AFC259090988A469000655EE /* sballs.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = sballs.xml; sourceTree = "<group>"; };
+ AFC2590A0988A469000655EE /* shadebobs.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = shadebobs.xml; sourceTree = "<group>"; };
+ AFC2590B0988A469000655EE /* sierpinski.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = sierpinski.xml; sourceTree = "<group>"; };
+ AFC2590C0988A469000655EE /* sierpinski3d.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = sierpinski3d.xml; sourceTree = "<group>"; };
+ AFC2590D0988A469000655EE /* slidescreen.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = slidescreen.xml; sourceTree = "<group>"; };
+ AFC2590E0988A469000655EE /* slip.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = slip.xml; sourceTree = "<group>"; };
+ AFC2590F0988A469000655EE /* sonar.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = sonar.xml; sourceTree = "<group>"; };
+ AFC259100988A469000655EE /* speedmine.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = speedmine.xml; sourceTree = "<group>"; };
+ AFC259110988A469000655EE /* sphere.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = sphere.xml; sourceTree = "<group>"; };
+ AFC259130988A469000655EE /* spheremonics.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = spheremonics.xml; sourceTree = "<group>"; };
+ AFC259140988A469000655EE /* spiral.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = spiral.xml; sourceTree = "<group>"; };
+ AFC259150988A469000655EE /* spotlight.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = spotlight.xml; sourceTree = "<group>"; };
+ AFC259160988A469000655EE /* sproingies.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = sproingies.xml; sourceTree = "<group>"; };
+ AFC259170988A469000655EE /* squiral.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = squiral.xml; sourceTree = "<group>"; };
+ AFC259190988A469000655EE /* stairs.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = stairs.xml; sourceTree = "<group>"; };
+ AFC2591A0988A469000655EE /* starfish.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = starfish.xml; sourceTree = "<group>"; };
+ AFC2591B0988A469000655EE /* starwars.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = starwars.xml; sourceTree = "<group>"; };
+ AFC2591C0988A469000655EE /* stonerview.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = stonerview.xml; sourceTree = "<group>"; };
+ AFC2591D0988A469000655EE /* strange.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = strange.xml; sourceTree = "<group>"; };
+ AFC2591E0988A469000655EE /* substrate.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = substrate.xml; sourceTree = "<group>"; };
+ AFC2591F0988A469000655EE /* superquadrics.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = superquadrics.xml; sourceTree = "<group>"; };
+ AFC259200988A469000655EE /* swirl.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = swirl.xml; sourceTree = "<group>"; };
+ AFC259210988A469000655EE /* t3d.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = t3d.xml; sourceTree = "<group>"; };
+ AFC259220988A469000655EE /* tangram.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = tangram.xml; sourceTree = "<group>"; };
+ AFC259230988A469000655EE /* thornbird.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = thornbird.xml; sourceTree = "<group>"; };
+ AFC259240988A469000655EE /* timetunnel.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = timetunnel.xml; sourceTree = "<group>"; };
+ AFC259250988A469000655EE /* triangle.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = triangle.xml; sourceTree = "<group>"; };
+ AFC259260988A469000655EE /* truchet.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = truchet.xml; sourceTree = "<group>"; };
+ AFC259270988A469000655EE /* twang.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = twang.xml; sourceTree = "<group>"; };
+ AFC259280988A469000655EE /* vermiculate.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = vermiculate.xml; sourceTree = "<group>"; };
+ AFC259290988A469000655EE /* vidwhacker.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = vidwhacker.xml; sourceTree = "<group>"; };
+ AFC2592A0988A469000655EE /* vines.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = vines.xml; sourceTree = "<group>"; };
+ AFC2592B0988A469000655EE /* wander.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = wander.xml; sourceTree = "<group>"; };
+ AFC2592C0988A469000655EE /* webcollage.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = webcollage.xml; sourceTree = "<group>"; };
+ AFC2592D0988A469000655EE /* whirlwindwarp.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = whirlwindwarp.xml; sourceTree = "<group>"; };
+ AFC2592F0988A469000655EE /* whirlygig.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = whirlygig.xml; sourceTree = "<group>"; };
+ AFC259300988A469000655EE /* worm.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = worm.xml; sourceTree = "<group>"; };
+ AFC259310988A469000655EE /* wormhole.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = wormhole.xml; sourceTree = "<group>"; };
+ AFC259320988A469000655EE /* xanalogtv.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = xanalogtv.xml; sourceTree = "<group>"; };
+ AFC259370988A469000655EE /* xflame.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = xflame.xml; sourceTree = "<group>"; };
+ AFC259380988A469000655EE /* xjack.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = xjack.xml; sourceTree = "<group>"; };
+ AFC259390988A469000655EE /* xlyap.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = xlyap.xml; sourceTree = "<group>"; };
+ AFC2593A0988A469000655EE /* xmatrix.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = xmatrix.xml; sourceTree = "<group>"; };
+ AFC2593D0988A469000655EE /* xrayswarm.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = xrayswarm.xml; sourceTree = "<group>"; };
+ AFC2593F0988A469000655EE /* xspirograph.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = xspirograph.xml; sourceTree = "<group>"; };
+ AFC259430988A469000655EE /* zoom.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = zoom.xml; sourceTree = "<group>"; };
+ AFC25B5E0988BA63000655EE /* deco.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = deco.c; path = hacks/deco.c; sourceTree = "<group>"; };
+ AFC25B990988BC08000655EE /* colors.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = colors.c; path = utils/colors.c; sourceTree = "<group>"; };
+ AFC25B9A0988BC08000655EE /* colors.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = colors.h; path = utils/colors.h; sourceTree = "<group>"; };
+ AFC43E731C68364B00C89999 /* PxPlus_IBM_VGA8.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = PxPlus_IBM_VGA8.ttf; sourceTree = "<group>"; };
+ AFC5CFEB2044AA23004CEB5E /* Crumbler.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Crumbler.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFC5CFED2044AB03004CEB5E /* quickhull.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = quickhull.c; path = hacks/glx/quickhull.c; sourceTree = "<group>"; };
+ AFC5CFEE2044AB03004CEB5E /* crumbler.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = crumbler.c; path = hacks/glx/crumbler.c; sourceTree = "<group>"; };
+ AFC5CFF32044AB27004CEB5E /* crumbler.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = crumbler.xml; sourceTree = "<group>"; };
+ AFC7592B158D8E8B00C5458E /* textclient.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = textclient.c; path = utils/textclient.c; sourceTree = "<group>"; };
+ AFC7592C158D8E8B00C5458E /* textclient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = textclient.h; path = utils/textclient.h; sourceTree = "<group>"; };
+ AFC7592F158D9A7A00C5458E /* textclient-ios.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "textclient-ios.m"; path = "OSX/textclient-ios.m"; sourceTree = "<group>"; };
+ AFCCCBAD09BFE4B000353F4D /* rdbomb.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = rdbomb.xml; sourceTree = "<group>"; };
+ AFCF83501AF5B515008BB7E1 /* SplitFlap.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SplitFlap.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFCF83521AF5B5FD008BB7E1 /* splitflap.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = splitflap.xml; sourceTree = "<group>"; };
+ AFCF83531AF5B5FD008BB7E1 /* splitflap_obj.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = splitflap_obj.c; path = hacks/glx/splitflap_obj.c; sourceTree = "<group>"; };
+ AFCF83541AF5B5FD008BB7E1 /* splitflap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = splitflap.c; path = hacks/glx/splitflap.c; sourceTree = "<group>"; };
+ AFD51B300F063B4A00471C02 /* Photopile.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Photopile.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD51DB60F063BCE00471C02 /* photopile.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = photopile.c; path = hacks/glx/photopile.c; sourceTree = "<group>"; };
+ AFD51DB80F063BE700471C02 /* photopile.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = photopile.xml; sourceTree = "<group>"; };
+ AFD56E040996A03800BA26F7 /* GLText.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GLText.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD56E080996A07A00BA26F7 /* gltext.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = gltext.c; path = hacks/glx/gltext.c; sourceTree = "<group>"; };
+ AFD56E0A0996A0ED00BA26F7 /* glut_roman.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = glut_roman.h; path = hacks/glx/glut_roman.h; sourceTree = "<group>"; };
+ AFD56E0B0996A0ED00BA26F7 /* glut_stroke.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = glut_stroke.c; path = hacks/glx/glut_stroke.c; sourceTree = "<group>"; };
+ AFD56E0C0996A0ED00BA26F7 /* glut_swidth.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = glut_swidth.c; path = hacks/glx/glut_swidth.c; sourceTree = "<group>"; };
+ AFD56E0D0996A0ED00BA26F7 /* glutstroke.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = glutstroke.h; path = hacks/glx/glutstroke.h; sourceTree = "<group>"; };
+ AFD56EBE0996A72600BA26F7 /* Braid.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Braid.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD56EC10996A76F00BA26F7 /* braid.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = braid.c; path = hacks/braid.c; sourceTree = "<group>"; };
+ AFD56EEA0996A95700BA26F7 /* Forest.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Forest.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD56EED0996A99E00BA26F7 /* forest.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = forest.c; path = hacks/forest.c; sourceTree = "<group>"; };
+ AFD56F1B0996AAFA00BA26F7 /* Vines.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Vines.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD56F1F0996AB5A00BA26F7 /* vines.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = vines.c; path = hacks/vines.c; sourceTree = "<group>"; };
+ AFD56F330996AB8A00BA26F7 /* Galaxy.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Galaxy.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD56F360996ABD200BA26F7 /* galaxy.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = galaxy.c; path = hacks/galaxy.c; sourceTree = "<group>"; };
+ AFD56F5F0996AEEE00BA26F7 /* Grav.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Grav.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD56F620996AF2D00BA26F7 /* grav.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = grav.c; path = hacks/grav.c; sourceTree = "<group>"; };
+ AFD56F7B0996B01600BA26F7 /* Hopalong.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Hopalong.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD56F880996B06600BA26F7 /* hopalong.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hopalong.c; path = hacks/hopalong.c; sourceTree = "<group>"; };
+ AFD56F9C0996B09400BA26F7 /* Laser.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Laser.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD56FA00996B0E500BA26F7 /* laser.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = laser.c; path = hacks/laser.c; sourceTree = "<group>"; };
+ AFD56FB30996B10F00BA26F7 /* Lightning.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Lightning.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD56FB60996B16300BA26F7 /* lightning.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = lightning.c; path = hacks/lightning.c; sourceTree = "<group>"; };
+ AFD56FC90996B18F00BA26F7 /* Lisa.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Lisa.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD56FCC0996B1D600BA26F7 /* lisa.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = lisa.c; path = hacks/lisa.c; sourceTree = "<group>"; };
+ AFD56FDF0996B20900BA26F7 /* Lissie.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Lissie.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD56FE20996B26200BA26F7 /* lissie.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = lissie.c; path = hacks/lissie.c; sourceTree = "<group>"; };
+ AFD570080996B43800BA26F7 /* Penrose.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Penrose.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD5700C0996B49D00BA26F7 /* penrose.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = penrose.c; path = hacks/penrose.c; sourceTree = "<group>"; };
+ AFD5701F0996B4CC00BA26F7 /* Sierpinski.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Sierpinski.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD570220996B52700BA26F7 /* sierpinski.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = sierpinski.c; path = hacks/sierpinski.c; sourceTree = "<group>"; };
+ AFD570360996B56D00BA26F7 /* Sphere.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Sphere.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD5703B0996B5E300BA26F7 /* sphere.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = sphere.c; path = hacks/sphere.c; sourceTree = "<group>"; };
+ AFD570530996B61600BA26F7 /* Spiral.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Spiral.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD570560996B67600BA26F7 /* spiral.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = spiral.c; path = hacks/spiral.c; sourceTree = "<group>"; };
+ AFD570690996B6A300BA26F7 /* FadePlot.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FadePlot.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD5706C0996B70000BA26F7 /* fadeplot.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = fadeplot.c; path = hacks/fadeplot.c; sourceTree = "<group>"; };
+ AFD5707F0996B72800BA26F7 /* Mountain.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Mountain.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD570820996B79300BA26F7 /* mountain.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = mountain.c; path = hacks/mountain.c; sourceTree = "<group>"; };
+ AFD570950996B80300BA26F7 /* Triangle.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Triangle.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD570980996B86200BA26F7 /* triangle.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = triangle.c; path = hacks/triangle.c; sourceTree = "<group>"; };
+ AFD570AB0996B88E00BA26F7 /* Worm.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Worm.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD570AE0996B8EF00BA26F7 /* worm.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = worm.c; path = hacks/worm.c; sourceTree = "<group>"; };
+ AFD570C10996B93000BA26F7 /* Rotor.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Rotor.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD570C40996B98500BA26F7 /* rotor.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = rotor.c; path = hacks/rotor.c; sourceTree = "<group>"; };
+ AFD570D90996B9F800BA26F7 /* Ant.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Ant.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD570DE0996BA5C00BA26F7 /* ant.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = ant.c; path = hacks/ant.c; sourceTree = "<group>"; };
+ AFD570FA0996BBBF00BA26F7 /* Flow.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Flow.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD571010996BC3800BA26F7 /* flow.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = flow.c; path = hacks/flow.c; sourceTree = "<group>"; };
+ AFD571230996BE9300BA26F7 /* Discrete.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Discrete.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD571280996BEF700BA26F7 /* discrete.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = discrete.c; path = hacks/discrete.c; sourceTree = "<group>"; };
+ AFD5713C0996BF2E00BA26F7 /* Apollonian.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Apollonian.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD5713F0996BFBE00BA26F7 /* apollonian.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = apollonian.c; path = hacks/apollonian.c; sourceTree = "<group>"; };
+ AFD571530996C01700BA26F7 /* Euler2D.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Euler2D.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD571560996C07F00BA26F7 /* euler2d.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = euler2d.c; path = hacks/euler2d.c; sourceTree = "<group>"; };
+ AFD571690996C0CE00BA26F7 /* Thornbird.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Thornbird.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD5716B0996C16700BA26F7 /* thornbird.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = thornbird.c; path = hacks/thornbird.c; sourceTree = "<group>"; };
+ AFD571C50996D9DC00BA26F7 /* Juggle.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Juggle.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD571C80996DA4600BA26F7 /* juggle.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = juggle.c; path = hacks/juggle.c; sourceTree = "<group>"; };
+ AFD572320996E4A300BA26F7 /* Swirl.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Swirl.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD572350996E53E00BA26F7 /* swirl.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = swirl.c; path = hacks/swirl.c; sourceTree = "<group>"; };
+ AFD5727D0996EE8500BA26F7 /* Polyominoes.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Polyominoes.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD572800996EF2B00BA26F7 /* polyominoes.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = polyominoes.c; path = hacks/polyominoes.c; sourceTree = "<group>"; };
+ AFD572B50996F99600BA26F7 /* Bouboule.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Bouboule.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD572B90996FB3D00BA26F7 /* bouboule.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = bouboule.c; path = hacks/bouboule.c; sourceTree = "<group>"; };
+ AFD572D20996FC0F00BA26F7 /* Crystal.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Crystal.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD572ED0997006E00BA26F7 /* crystal.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = crystal.c; path = hacks/crystal.c; sourceTree = "<group>"; };
+ AFD57309099701C000BA26F7 /* Julia.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Julia.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD5730C099702C800BA26F7 /* julia.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = julia.c; path = hacks/julia.c; sourceTree = "<group>"; };
+ AFD5736D0997411200BA26F7 /* Strange.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Strange.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD57371099741A200BA26F7 /* strange.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = strange.c; path = hacks/strange.c; sourceTree = "<group>"; };
+ AFD77E7020C23F8600A3638D /* FilmLeader.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FilmLeader.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFD77E7220C2417F00A3638D /* filmleader.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = filmleader.c; path = hacks/filmleader.c; sourceTree = "<group>"; };
+ AFD77E7620C2419600A3638D /* filmleader.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = filmleader.xml; sourceTree = "<group>"; };
+ AFD9D5BD201E686A0070E99D /* ships.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ships.c; path = hacks/glx/ships.c; sourceTree = "<group>"; };
+ AFDA11211934424D003D397F /* aligned_malloc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = aligned_malloc.c; path = utils/aligned_malloc.c; sourceTree = "<group>"; };
+ AFDA11221934424D003D397F /* aligned_malloc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = aligned_malloc.h; path = utils/aligned_malloc.h; sourceTree = "<group>"; };
+ AFDA11231934424D003D397F /* thread_util.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = thread_util.c; path = utils/thread_util.c; sourceTree = "<group>"; };
+ AFDA11241934424D003D397F /* thread_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = thread_util.h; path = utils/thread_util.h; sourceTree = "<group>"; };
+ AFDA65A1178A52B70070D24B /* UnknownPleasures.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UnknownPleasures.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFDA65A3178A541A0070D24B /* unknownpleasures.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = unknownpleasures.xml; sourceTree = "<group>"; };
+ AFDA65A4178A541A0070D24B /* unknownpleasures.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = unknownpleasures.c; path = hacks/glx/unknownpleasures.c; sourceTree = "<group>"; };
+ AFE1FD3F0981E32E00F7970E /* SaverRunner.h */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.h; path = SaverRunner.h; sourceTree = "<group>"; };
+ AFE1FD400981E32E00F7970E /* SaverRunner.m */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.objc; path = SaverRunner.m; sourceTree = "<group>"; };
+ AFE1FD410981E32E00F7970E /* InvertedSlider.h */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.h; path = InvertedSlider.h; sourceTree = "<group>"; };
+ AFE1FD420981E32E00F7970E /* InvertedSlider.m */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.objc; path = InvertedSlider.m; sourceTree = "<group>"; };
+ AFE1FD430981E32E00F7970E /* jwxyz.h */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.h; name = jwxyz.h; path = ../jwxyz/jwxyz.h; sourceTree = "<group>"; };
+ AFE1FD440981E32E00F7970E /* jwxyz.m */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.objc; name = jwxyz.m; path = ../jwxyz/jwxyz.m; sourceTree = "<group>"; };
+ AFE1FD470981E32E00F7970E /* PrefsReader.h */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.h; path = PrefsReader.h; sourceTree = "<group>"; };
+ AFE1FD480981E32E00F7970E /* PrefsReader.m */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.objc; path = PrefsReader.m; sourceTree = "<group>"; };
+ AFE1FD530981E3CB00F7970E /* erase.c */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.c; name = erase.c; path = utils/erase.c; sourceTree = "<group>"; };
+ AFE1FD540981E3CB00F7970E /* erase.h */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.h; name = erase.h; path = utils/erase.h; sourceTree = "<group>"; };
+ AFE1FD550981E3CB00F7970E /* hsv.c */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.c; name = hsv.c; path = utils/hsv.c; sourceTree = "<group>"; };
+ AFE1FD560981E3CB00F7970E /* hsv.h */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.h; name = hsv.h; path = utils/hsv.h; sourceTree = "<group>"; };
+ AFE1FD570981E3CB00F7970E /* spline.c */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.c; name = spline.c; path = utils/spline.c; sourceTree = "<group>"; };
+ AFE1FD580981E3CB00F7970E /* spline.h */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.h; name = spline.h; path = utils/spline.h; sourceTree = "<group>"; };
+ AFE1FD590981E3CB00F7970E /* utils.h */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.h; name = utils.h; path = utils/utils.h; sourceTree = "<group>"; };
+ AFE1FD5A0981E3CB00F7970E /* version.h */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.h; name = version.h; path = utils/version.h; sourceTree = "<group>"; };
+ AFE1FD5B0981E3CB00F7970E /* yarandom.c */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.c; name = yarandom.c; path = utils/yarandom.c; sourceTree = "<group>"; };
+ AFE1FD5C0981E3CB00F7970E /* yarandom.h */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.h; name = yarandom.h; path = utils/yarandom.h; sourceTree = "<group>"; };
+ AFE1FD620981E40800F7970E /* rorschach.c */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.c; name = rorschach.c; path = hacks/rorschach.c; sourceTree = "<group>"; };
+ AFE2A46A0E2E904600ADB298 /* SkyTentacles.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SkyTentacles.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFE2A4720E2E90E300ADB298 /* skytentacles.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = skytentacles.c; path = hacks/glx/skytentacles.c; sourceTree = "<group>"; };
+ AFE2A4740E2E911200ADB298 /* skytentacles.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = skytentacles.xml; sourceTree = "<group>"; };
+ AFE30BFC0E52B14700CCF4A5 /* Sonar.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Sonar.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFE30BFF0E52B1DC00CCF4A5 /* sonar-icmp.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "sonar-icmp.c"; path = "hacks/glx/sonar-icmp.c"; sourceTree = "<group>"; };
+ AFE30C000E52B1DC00CCF4A5 /* sonar-sim.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "sonar-sim.c"; path = "hacks/glx/sonar-sim.c"; sourceTree = "<group>"; };
+ AFE30C010E52B1DC00CCF4A5 /* sonar.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = sonar.c; path = hacks/glx/sonar.c; sourceTree = "<group>"; };
+ AFE6A16A0CDD78EA002805BF /* involute.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = involute.c; path = hacks/glx/involute.c; sourceTree = "<group>"; };
+ AFE6A16B0CDD78EA002805BF /* involute.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = involute.h; path = hacks/glx/involute.h; sourceTree = "<group>"; };
+ AFE6A1970CDD7B2E002805BF /* MoebiusGears.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MoebiusGears.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFE6A40B0CDD7BC3002805BF /* moebiusgears.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = moebiusgears.c; path = hacks/glx/moebiusgears.c; sourceTree = "<group>"; };
+ AFE6A40D0CDD7BDC002805BF /* moebiusgears.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = moebiusgears.xml; sourceTree = "<group>"; };
+ AFE6A42D0CDD7FAA002805BF /* Abstractile.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Abstractile.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFE6A4340CDD800F002805BF /* abstractile.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = abstractile.c; path = hacks/abstractile.c; sourceTree = "<group>"; };
+ AFE6A4360CDD8026002805BF /* abstractile.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = abstractile.xml; sourceTree = "<group>"; };
+ AFE943AF19DD54C1000A5E6D /* xft.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xft.c; path = utils/xft.c; sourceTree = "<group>"; };
+ AFE943B019DD54C1000A5E6D /* xft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = xft.h; path = utils/xft.h; sourceTree = "<group>"; };
+ AFE943B319DDF97F000A5E6D /* utf8wc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = utf8wc.c; path = utils/utf8wc.c; sourceTree = "<group>"; };
+ AFE943B419DDF97F000A5E6D /* utf8wc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utf8wc.h; path = utils/utf8wc.h; sourceTree = "<group>"; };
+ AFEB9C3815900514003974F3 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
+ AFEB9C3A1590054B003974F3 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks/OpenGLES.framework; sourceTree = DEVELOPER_DIR; };
+ AFEB9C3C15900558003974F3 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
+ AFEB9C3E1590056A003974F3 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; };
+ AFEB9C3F1590056A003974F3 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; };
+ AFEC23E21CB6EAE100DE138F /* DymaxionMap.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DymaxionMap.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFEC23E41CB6EBC400DE138F /* dymaxionmap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dymaxionmap.c; path = hacks/glx/dymaxionmap.c; sourceTree = "<group>"; };
+ AFEC23E51CB6EBDA00DE138F /* dymaxionmap.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = dymaxionmap.xml; sourceTree = "<group>"; };
+ AFEC68361BD6CA85004C1B64 /* OCRAStd.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = OCRAStd.otf; sourceTree = "<group>"; };
+ AFEC68381BD6CDF9004C1B64 /* YearlReg.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = YearlReg.ttf; sourceTree = "<group>"; };
+ AFEE10621D13406000AAC8F7 /* CubeTwist.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CubeTwist.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFEE10641D1341E300AAC8F7 /* cubetwist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cubetwist.c; path = hacks/glx/cubetwist.c; sourceTree = "<group>"; };
+ AFEE10651D1341E300AAC8F7 /* cubetwist.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = cubetwist.xml; sourceTree = "<group>"; };
+ AFEE10811D15EB0800AAC8F7 /* CubeStack.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CubeStack.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFEE10831D15EBA600AAC8F7 /* cubestack.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cubestack.c; path = hacks/glx/cubestack.c; sourceTree = "<group>"; };
+ AFEE10841D15EBA600AAC8F7 /* cubestack.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = cubestack.xml; sourceTree = "<group>"; };
+ AFEE10A01D17E20B00AAC8F7 /* Splodesic.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Splodesic.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFEE10A21D17E2B300AAC8F7 /* splodesic.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = splodesic.c; path = hacks/glx/splodesic.c; sourceTree = "<group>"; };
+ AFEE10A31D17E2B300AAC8F7 /* splodesic.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = splodesic.xml; sourceTree = "<group>"; };
+ AFF1BA0E19A96D8B0016A88D /* lament_model.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lament_model.c; path = hacks/glx/lament_model.c; sourceTree = "<group>"; };
+ AFF2869217860E830050A578 /* QuasiCrystal.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = QuasiCrystal.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFF28694178611720050A578 /* quasicrystal.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = quasicrystal.xml; sourceTree = "<group>"; };
+ AFF28695178611720050A578 /* quasicrystal.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = quasicrystal.c; path = hacks/glx/quasicrystal.c; sourceTree = "<group>"; };
+ AFF3C9FB17CCAC440028F240 /* Geodesic.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Geodesic.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFF3C9FD17CCAD9A0028F240 /* geodesic.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = geodesic.xml; sourceTree = "<group>"; };
+ AFF3CA0217CCAEB70028F240 /* geodesic.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = geodesic.c; path = hacks/glx/geodesic.c; sourceTree = "<group>"; };
+ AFF463470C4403E400EE6509 /* CWaves.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CWaves.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFF463490C44044E00EE6509 /* cwaves.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = cwaves.c; path = hacks/cwaves.c; sourceTree = "<group>"; };
+ AFF4634B0C44046500EE6509 /* cwaves.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = cwaves.xml; sourceTree = "<group>"; };
+ AFF4636C0C440AEF00EE6509 /* GLCells.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GLCells.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFF463710C440B9200EE6509 /* glcells.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = glcells.c; path = hacks/glx/glcells.c; sourceTree = "<group>"; };
+ AFF463730C440BAC00EE6509 /* glcells.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = glcells.xml; sourceTree = "<group>"; };
+ AFFAB32919158CE40020F021 /* ProjectivePlane.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ProjectivePlane.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ AFFAB32C19158E2A0020F021 /* projectiveplane.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = projectiveplane.xml; sourceTree = "<group>"; };
+ AFFAB33119158EA80020F021 /* projectiveplane.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = projectiveplane.c; path = hacks/glx/projectiveplane.c; sourceTree = "<group>"; };
+ CE3D01661B76F4C100993C75 /* TestX11.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TestX11.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+ CE3D01681B76F83E00993C75 /* testx11.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = testx11.xml; sourceTree = "<group>"; };
+ CE3D016A1B76F8E200993C75 /* testx11.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testx11.c; path = hacks/testx11.c; sourceTree = "<group>"; };
+ CE43C2BE1C055157004C2BC6 /* jwxyz-cocoa.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "jwxyz-cocoa.m"; path = "../jwxyz/jwxyz-cocoa.m"; sourceTree = "<group>"; };
+ CE5564591C25141000645458 /* jwxyz-gl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "jwxyz-gl.c"; path = "../jwxyz/jwxyz-gl.c"; sourceTree = "<group>"; };
+ CE8206741B89048800E35532 /* jwxyz-cocoa.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jwxyz-cocoa.h"; path = "../jwxyz/jwxyz-cocoa.h"; sourceTree = "<group>"; };
+ CE8C49CC1C011CC400BA2DCF /* jwxyzI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jwxyzI.h; path = ../jwxyz/jwxyzI.h; sourceTree = "<group>"; };
+ CE8EA1C11C35CF10002D1020 /* jwxyz-common.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "jwxyz-common.c"; path = "../jwxyz/jwxyz-common.c"; sourceTree = "<group>"; };
+ CE9289D119BD00E200961F22 /* async_netdb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = async_netdb.c; path = utils/async_netdb.c; sourceTree = "<group>"; };
+ CE9289D219BD00E300961F22 /* async_netdb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = async_netdb.h; path = utils/async_netdb.h; sourceTree = "<group>"; };
+ CEAF85661ABE4A70008F104C /* SaverListController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SaverListController.h; sourceTree = "<group>"; };
+ CEE0BC611A6B0D6200C098BF /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ AF08399709930B6B00277BE9 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8EF158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8F0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C326215C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8F1158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8F2158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCDC1A6B13DD00C098BF /* OpenGL.framework in Frameworks */,
+ AF78371217DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF083A3D099311D700277BE9 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8F3158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8F4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C326315C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8F5158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8F6158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCDD1A6B13E700C098BF /* OpenGL.framework in Frameworks */,
+ AF78371317DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF0DC7B40C4C73F600D76972 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD7BF158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD7C0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C321515C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD7C1158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD7C2158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC901A6B100000C098BF /* OpenGL.framework in Frameworks */,
+ AF7836C417DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF0DCA4A0C4CBB0D00D76972 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA33158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA34158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32B315C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA35158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA36158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD341A6B17EF00C098BF /* OpenGL.framework in Frameworks */,
+ AF78376617DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF1A176A0D6D6EE3008AF328 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD7BB158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD7BC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C321415C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD7BD158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD7BE158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC8F1A6B0FF600C098BF /* OpenGL.framework in Frameworks */,
+ AF7836C317DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF1AD9DF18500F9F00932759 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1ADA181850180E00932759 /* Sparkle.framework in Frameworks */,
+ AF1ADA1F18504A4F00932759 /* ScreenSaver.framework in Frameworks */,
+ AF1AD9E318500F9F00932759 /* Cocoa.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF1B0FAF1D7AB4740011DBE4 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1B0FB01D7AB4740011DBE4 /* libjwxyz.a in Frameworks */,
+ AF1B0FB11D7AB4740011DBE4 /* ScreenSaver.framework in Frameworks */,
+ AF1B0FB21D7AB4740011DBE4 /* QuartzCore.framework in Frameworks */,
+ AF1B0FB31D7AB4740011DBE4 /* Cocoa.framework in Frameworks */,
+ AF1B0FB41D7AB4740011DBE4 /* Carbon.framework in Frameworks */,
+ AF1B0FB51D7AB4740011DBE4 /* OpenGL.framework in Frameworks */,
+ AF1B0FB61D7AB4740011DBE4 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF2107791FD23BDD00B61EA9 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF21077A1FD23BDD00B61EA9 /* libjwxyz.a in Frameworks */,
+ AF21077B1FD23BDD00B61EA9 /* ScreenSaver.framework in Frameworks */,
+ AF21077C1FD23BDD00B61EA9 /* QuartzCore.framework in Frameworks */,
+ AF21077D1FD23BDD00B61EA9 /* Cocoa.framework in Frameworks */,
+ AF21077E1FD23BDD00B61EA9 /* Carbon.framework in Frameworks */,
+ AF21077F1FD23BDD00B61EA9 /* OpenGL.framework in Frameworks */,
+ AF2107801FD23BDD00B61EA9 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF32D9E80F3AD0B40080F535 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9F3158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9F4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32A315C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9F5158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9F6158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD231A6B174D00C098BF /* OpenGL.framework in Frameworks */,
+ AF78375517DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF3581C91431D47B00E09C51 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD91B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD91C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C326D15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD91D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD91E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCE81A6B146F00C098BF /* OpenGL.framework in Frameworks */,
+ AF78371D17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF35820A143330F900E09C51 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA2F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA30158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32B215C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA31158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA32158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD321A6B17DD00C098BF /* OpenGL.framework in Frameworks */,
+ AF78376417DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF35E8940E63823600691F2F /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD99B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD99C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C328D15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD99D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD99E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD0A1A6B165D00C098BF /* OpenGL.framework in Frameworks */,
+ AF78373D17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF3938221D0FBD6A00205406 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF3938231D0FBD6A00205406 /* libjwxyz.a in Frameworks */,
+ AF3938241D0FBD6A00205406 /* ScreenSaver.framework in Frameworks */,
+ AF3938251D0FBD6A00205406 /* QuartzCore.framework in Frameworks */,
+ AF3938261D0FBD6A00205406 /* Cocoa.framework in Frameworks */,
+ AF3938271D0FBD6A00205406 /* Carbon.framework in Frameworks */,
+ AF3938281D0FBD6A00205406 /* OpenGL.framework in Frameworks */,
+ AF3938291D0FBD6A00205406 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF39E28A198A11F60064A58D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF39E28B198A11F60064A58D /* libjwxyz.a in Frameworks */,
+ AF39E28C198A11F60064A58D /* ScreenSaver.framework in Frameworks */,
+ AF39E28D198A11F60064A58D /* QuartzCore.framework in Frameworks */,
+ AF39E28E198A11F60064A58D /* Cocoa.framework in Frameworks */,
+ AF39E28F198A11F60064A58D /* Carbon.framework in Frameworks */,
+ CEE0BD351A6B17F700C098BF /* OpenGL.framework in Frameworks */,
+ AF39E290198A11F60064A58D /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF3C714D0D624BF50030CC0D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD993158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD994158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C328B15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD995158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD996158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD081A6B164A00C098BF /* OpenGL.framework in Frameworks */,
+ AF78373B17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF3EC9802035154C00180A35 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF3EC9812035154C00180A35 /* libjwxyz.a in Frameworks */,
+ AF3EC9822035154C00180A35 /* ScreenSaver.framework in Frameworks */,
+ AF3EC9832035154C00180A35 /* QuartzCore.framework in Frameworks */,
+ AF3EC9842035154C00180A35 /* Cocoa.framework in Frameworks */,
+ AF3EC9852035154C00180A35 /* Carbon.framework in Frameworks */,
+ AF3EC9862035154C00180A35 /* OpenGL.framework in Frameworks */,
+ AF3EC9872035154C00180A35 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF41E95A201D49DB0098E253 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF41E95B201D49DB0098E253 /* libjwxyz.a in Frameworks */,
+ AF41E95C201D49DB0098E253 /* ScreenSaver.framework in Frameworks */,
+ AF41E95D201D49DB0098E253 /* QuartzCore.framework in Frameworks */,
+ AF41E95E201D49DB0098E253 /* Cocoa.framework in Frameworks */,
+ AF41E95F201D49DB0098E253 /* Carbon.framework in Frameworks */,
+ AF41E960201D49DB0098E253 /* OpenGL.framework in Frameworks */,
+ AF41E961201D49DB0098E253 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF46E9D71CBBA2B300240FBC /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF46E9D81CBBA2B300240FBC /* libjwxyz.a in Frameworks */,
+ AF46E9D91CBBA2B300240FBC /* ScreenSaver.framework in Frameworks */,
+ AF46E9DA1CBBA2B300240FBC /* QuartzCore.framework in Frameworks */,
+ AF46E9DB1CBBA2B300240FBC /* Cocoa.framework in Frameworks */,
+ AF46E9DC1CBBA2B300240FBC /* Carbon.framework in Frameworks */,
+ AF46E9DD1CBBA2B300240FBC /* OpenGL.framework in Frameworks */,
+ AF46E9DE1CBBA2B300240FBC /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF476FBE099D154F001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD7AB158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD7AC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C321015C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD7AD158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD7AE158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC8B1A6B0FC900C098BF /* OpenGL.framework in Frameworks */,
+ AF7836BF17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF476FE3099D1686001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD83F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD840158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C323515C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD841158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD842158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCB11A6B116100C098BF /* OpenGL.framework in Frameworks */,
+ AF7836E517DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477054099D4385001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD767158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD768158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C31FF15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD769158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD76A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC791A6B0EE700C098BF /* OpenGL.framework in Frameworks */,
+ AF7836AD17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477171099D4786001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD74F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD750158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C31F915C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD751158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD752158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC731A6B0E9200C098BF /* OpenGL.framework in Frameworks */,
+ AF7836A717DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477187099D4803001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD84B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD84C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C323815C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD84D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD84E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCB41A6B117F00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836E817DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4771AF099D4949001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA7B158FF96600C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA7C158FF96600C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32C515C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA7D158FF96600C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA7E158FF96600C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD471A6B18BB00C098BF /* OpenGL.framework in Frameworks */,
+ AF78377817DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4771E3099D4D9A001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD743158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD744158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C31F615C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD745158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD746158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC701A6B0E7200C098BF /* OpenGL.framework in Frameworks */,
+ AF7836A417DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4771FA099D4E63001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD7DB158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD7DC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C321C15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD7DD158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD7DE158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC971A6B104F00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836CB17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477210099D4EE8001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA83158FF96600C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA84158FF96600C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32C715C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA85158FF96600C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA86158FF96600C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD491A6B18CE00C098BF /* OpenGL.framework in Frameworks */,
+ AF78377A17DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477226099D4F67001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD717158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD718158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C31EB15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD719158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD71A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC631A6B0D8100C098BF /* OpenGL.framework in Frameworks */,
+ AF78369917DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47725B099D5717001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD793158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD794158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C320A15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD795158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD796158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC841A6B0F5400C098BF /* OpenGL.framework in Frameworks */,
+ AF7836B817DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477273099D57B9001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD7FF158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD800158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C322515C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD801158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD802158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCA01A6B10A900C098BF /* OpenGL.framework in Frameworks */,
+ AF7836D517DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47728B099D5926001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD7F7158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD7F8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C322315C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD7F9158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD7FA158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC9E1A6B109600C098BF /* OpenGL.framework in Frameworks */,
+ AF7836D317DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47738A099D65A1001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD85B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD85C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C323C15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD85D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD85E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCB71A6B11DC00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836EC17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4773A2099D6648001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD787158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD788158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C320715C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD789158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD78A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC811A6B0F3200C098BF /* OpenGL.framework in Frameworks */,
+ AF7836B517DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4773C9099D67B9001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD71B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD71C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C31EC15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD71D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD71E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC621A6B0D6200C098BF /* OpenGL.framework in Frameworks */,
+ AF78369A17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47740A099D69E7001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD7AF158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD7B0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C321115C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD7B1158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD7B2158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC8C1A6B0FD400C098BF /* OpenGL.framework in Frameworks */,
+ AF7836C017DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47742F099D7C70001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD79F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD7A0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C320D15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD7A1158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD7A2158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC881A6B0F7C00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836BC17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47744A099D7D33001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD86F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD870158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C324115C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD871158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD872158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCBC1A6B121000C098BF /* OpenGL.framework in Frameworks */,
+ AF7836F117DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47748B099D89E4001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD77B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD77C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C320415C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD77D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD77E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC7E1A6B0F1600C098BF /* OpenGL.framework in Frameworks */,
+ AF7836B217DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4774A1099D8A74001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD7B3158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD7B4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C321215C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD7B5158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD7B6158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC8D1A6B0FDE00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836C117DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4774BC099D8B5F001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA6B158FF96600C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA6C158FF96600C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32C115C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA6D158FF96600C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA6E158FF96600C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD431A6B189500C098BF /* OpenGL.framework in Frameworks */,
+ AF78377417DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4774D6099D8BFF001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD7C3158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD7C4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C321615C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD7C5158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD7C6158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC911A6B100900C098BF /* OpenGL.framework in Frameworks */,
+ AF7836C517DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477565099D9A1A001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD7E3158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD7E4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C321E15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD7E5158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD7E6158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC991A6B106300C098BF /* OpenGL.framework in Frameworks */,
+ AF7836CD17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47758B099D9C28001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD803158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD804158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C322615C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD805158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD806158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCA11A6B10B400C098BF /* OpenGL.framework in Frameworks */,
+ AF7836D617DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4775A7099D9CF7001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD837158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD838158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C323315C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD839158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD83A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCAE1A6B114000C098BF /* OpenGL.framework in Frameworks */,
+ AF7836E317DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4775E0099D9F69001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD753158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD754158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C31FA15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD755158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD756158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC741A6B0E9B00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836A817DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4775FA099DA030001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD76F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD770158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C320115C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD771158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD772158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC7B1A6B0EFB00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836AF17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47761B099DA26C001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD7B7158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD7B8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C321315C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD7B9158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD7BA158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC8E1A6B0FEA00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836C217DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47764C099DA6D0001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD833158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD834158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C323215C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD835158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD836158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCAD1A6B113500C098BF /* OpenGL.framework in Frameworks */,
+ AF7836E217DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477662099DA78E001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA3F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA40158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32B615C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA41158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA42158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD391A6B182B00C098BF /* OpenGL.framework in Frameworks */,
+ AF78376917DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477678099DA849001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD7EB158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD7EC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C322015C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD7ED158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD7EE158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC9B1A6B107600C098BF /* OpenGL.framework in Frameworks */,
+ AF7836CF17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477697099DAA6F001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD72F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD730158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C31F115C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD731158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD732158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC6B1A6B0E4200C098BF /* OpenGL.framework in Frameworks */,
+ AF78369F17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4776B2099DABDD001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD877158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD878158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C324315C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD879158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD87A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCBE1A6B122600C098BF /* OpenGL.framework in Frameworks */,
+ AF7836F317DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4776C8099DAC8A001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD873158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD874158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C324215C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD875158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD876158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCBD1A6B121B00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836F217DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4776E3099DADDF001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD857158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD858158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C323B15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD859158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD85A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCB61A6B119C00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836EB17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4776F9099DAE7A001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD847158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD848158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C323715C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD849158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD84A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCB31A6B117500C098BF /* OpenGL.framework in Frameworks */,
+ AF7836E717DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477715099DAF9F001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD74B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD74C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C31F815C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD74D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD74E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC721A6B0E8800C098BF /* OpenGL.framework in Frameworks */,
+ AF7836A617DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47772B099DB044001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD83B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD83C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C323415C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD83D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD83E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCAF1A6B114D00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836E417DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47775A099DB61E001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD7A7158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD7A8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C320F15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD7A9158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD7AA158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC8A1A6B0FBE00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836BE17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47777C099DB965001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD747158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD748158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C31F715C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD749158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD74A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC711A6B0E7D00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836A517DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477798099DBA90001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD77F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD780158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C320515C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD781158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD782158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC7F1A6B0F1F00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836B317DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4777D9099DC183001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD737158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD738158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C31F315C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD739158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD73A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC6D1A6B0E5400C098BF /* OpenGL.framework in Frameworks */,
+ AF7836A117DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4778B3099DDB79001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD7E7158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD7E8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C321F15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD7E9158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD7EA158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC9A1A6B106C00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836CE17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4778CF099DDCAE001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD867158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD868158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C323F15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD869158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD86A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCBA1A6B11FB00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836EF17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4778F0099DDDC8001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD75B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD75C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C31FC15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD75D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD75E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC761A6B0EAE00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836AA17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477911099DE379001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA43158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA44158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32B715C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA45158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA46158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD3A1A6B183600C098BF /* OpenGL.framework in Frameworks */,
+ AF78376A17DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477932099DE4C7001F091E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD827158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD828158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C322F15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD829158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD82A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCAA1A6B111200C098BF /* OpenGL.framework in Frameworks */,
+ AF7836DF17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4808BF098C3B6C00FB32B8 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF480C50098E301400FB32B8 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD79B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD79C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C320C15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD79D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD79E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC861A6B0F6700C098BF /* OpenGL.framework in Frameworks */,
+ AF7836BA17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF480D79098EEDDE00FB32B8 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD897158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD898158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C324B15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD899158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD89A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCC61A6B12F700C098BF /* OpenGL.framework in Frameworks */,
+ AF7836FB17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4810F309909FBA00FB32B8 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD933158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD934158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C327315C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD935158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD936158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCEE1A6B153800C098BF /* OpenGL.framework in Frameworks */,
+ AF78372317DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4812590990CE2700FB32B8 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD957158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD958158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C327C15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD959158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD95A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCF71A6B159600C098BF /* OpenGL.framework in Frameworks */,
+ AF78372C17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4812BB0990D3D900FB32B8 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9D7158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9D8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C329C15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9D9158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9DA158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD1A1A6B16F800C098BF /* OpenGL.framework in Frameworks */,
+ AF78374D17DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF48DEF70A0C25E000F94CF9 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD97B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD97C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C328515C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD97D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD97E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD021A6B160D00C098BF /* OpenGL.framework in Frameworks */,
+ AF78373517DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4A3451102A593600A81B2A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA1F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA20158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32AE15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA21158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA22158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD2E1A6B17B600C098BF /* OpenGL.framework in Frameworks */,
+ AF78376017DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4FD6EE0CE7A486005EE58E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9AF158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9B0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C329215C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9B1158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9B2158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD101A6B169600C098BF /* OpenGL.framework in Frameworks */,
+ AF78374317DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4FF4C20D52CBDE00666F98 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD92F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD930158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C327215C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD931158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD932158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCED1A6B152E00C098BF /* OpenGL.framework in Frameworks */,
+ AF78372217DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF5C9B011A0CCE6E00B0147A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF5C9B021A0CCE6E00B0147A /* libjwxyz.a in Frameworks */,
+ AF5C9B031A0CCE6E00B0147A /* ScreenSaver.framework in Frameworks */,
+ AF5C9B041A0CCE6E00B0147A /* QuartzCore.framework in Frameworks */,
+ AF5C9B051A0CCE6E00B0147A /* Cocoa.framework in Frameworks */,
+ AF5C9B061A0CCE6E00B0147A /* Carbon.framework in Frameworks */,
+ CEE0BCE71A6B144800C098BF /* OpenGL.framework in Frameworks */,
+ AF5C9B071A0CCE6E00B0147A /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF5ECEB32116B1A400069433 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF5ECEB42116B1A400069433 /* libjwxyz.a in Frameworks */,
+ AF5ECEB52116B1A400069433 /* ScreenSaver.framework in Frameworks */,
+ AF5ECEB62116B1A400069433 /* QuartzCore.framework in Frameworks */,
+ AF5ECEB72116B1A400069433 /* Cocoa.framework in Frameworks */,
+ AF5ECEB82116B1A400069433 /* Carbon.framework in Frameworks */,
+ AF5ECEB92116B1A400069433 /* OpenGL.framework in Frameworks */,
+ AF5ECEBA2116B1A400069433 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF633C091EE0BA6F00AB33BD /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF633C0A1EE0BA6F00AB33BD /* libjwxyz.a in Frameworks */,
+ AF633C0B1EE0BA6F00AB33BD /* ScreenSaver.framework in Frameworks */,
+ AF633C0C1EE0BA6F00AB33BD /* QuartzCore.framework in Frameworks */,
+ AF633C0D1EE0BA6F00AB33BD /* Cocoa.framework in Frameworks */,
+ AF633C0E1EE0BA6F00AB33BD /* Carbon.framework in Frameworks */,
+ AF633C0F1EE0BA6F00AB33BD /* OpenGL.framework in Frameworks */,
+ AF633C101EE0BA6F00AB33BD /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF63A7F91AB4EDDB00593C75 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF63A7FA1AB4EDDB00593C75 /* libjwxyz.a in Frameworks */,
+ AF63A7FB1AB4EDDB00593C75 /* ScreenSaver.framework in Frameworks */,
+ AF63A7FC1AB4EDDB00593C75 /* QuartzCore.framework in Frameworks */,
+ AF63A7FD1AB4EDDB00593C75 /* Cocoa.framework in Frameworks */,
+ AF63A7FE1AB4EDDB00593C75 /* Carbon.framework in Frameworks */,
+ AF63A7FF1AB4EDDB00593C75 /* OpenGL.framework in Frameworks */,
+ AF63A8001AB4EDDB00593C75 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF63F4401C3465BE0033E133 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF63F4411C3465BE0033E133 /* libjwxyz.a in Frameworks */,
+ AF63F4421C3465BE0033E133 /* OpenGLES.framework in Frameworks */,
+ AF63F4431C3465BE0033E133 /* UIKit.framework in Frameworks */,
+ AF63F4441C3465BE0033E133 /* AssetsLibrary.framework in Frameworks */,
+ AF63F4451C3465BE0033E133 /* Foundation.framework in Frameworks */,
+ AF63F4461C3465BE0033E133 /* CoreGraphics.framework in Frameworks */,
+ AF63F4471C3465BE0033E133 /* CoreText.framework in Frameworks */,
+ AF63F4481C3465BE0033E133 /* QuartzCore.framework in Frameworks */,
+ AF63F4491C3465BE0033E133 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF63F4661C34682A0033E133 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF63F4671C34682A0033E133 /* libjwxyz.a in Frameworks */,
+ AF63F4681C34682A0033E133 /* OpenGLES.framework in Frameworks */,
+ AF63F4691C34682A0033E133 /* UIKit.framework in Frameworks */,
+ AF63F46A1C34682A0033E133 /* AssetsLibrary.framework in Frameworks */,
+ AF63F46B1C34682A0033E133 /* Foundation.framework in Frameworks */,
+ AF63F46C1C34682A0033E133 /* CoreGraphics.framework in Frameworks */,
+ AF63F46D1C34682A0033E133 /* CoreText.framework in Frameworks */,
+ AF63F46E1C34682A0033E133 /* QuartzCore.framework in Frameworks */,
+ AF63F46F1C34682A0033E133 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF63F48C1C3469FC0033E133 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF63F48D1C3469FC0033E133 /* libjwxyz.a in Frameworks */,
+ AF63F48E1C3469FC0033E133 /* OpenGLES.framework in Frameworks */,
+ AF63F48F1C3469FC0033E133 /* UIKit.framework in Frameworks */,
+ AF63F4901C3469FC0033E133 /* AssetsLibrary.framework in Frameworks */,
+ AF63F4911C3469FC0033E133 /* Foundation.framework in Frameworks */,
+ AF63F4921C3469FC0033E133 /* CoreGraphics.framework in Frameworks */,
+ AF63F4931C3469FC0033E133 /* CoreText.framework in Frameworks */,
+ AF63F4941C3469FC0033E133 /* QuartzCore.framework in Frameworks */,
+ AF63F4951C3469FC0033E133 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF6423FA099FF9C2000F4CD4 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD943158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD944158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C327715C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD945158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD946158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCF21A6B156200C098BF /* OpenGL.framework in Frameworks */,
+ AF78372717DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ AF84FD4209B1209E00F3AB06 /* GLUT.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF6425D409A18855000F4CD4 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA53158FF96600C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA54158FF96600C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32BB15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA55158FF96600C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA56158FF96600C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD3D1A6B185600C098BF /* OpenGL.framework in Frameworks */,
+ AF78376E17DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF6425F409A189EC000F4CD4 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD807158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD808158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C322715C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD809158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD80A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCA21A6B10BF00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836D717DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF64261709A18D6C000F4CD4 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA4F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA50158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32BA15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA51158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA52158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD3C1A6B184C00C098BF /* OpenGL.framework in Frameworks */,
+ AF78376D17DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF64263409A18F54000F4CD4 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD7D3158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD7D4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C321A15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD7D5158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD7D6158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC951A6B103B00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836C917DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF64265709A19229000F4CD4 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD7D7158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD7D8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C321B15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD7D9158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD7DA158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC961A6B104500C098BF /* OpenGL.framework in Frameworks */,
+ AF7836CA17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF64268309A194B0000F4CD4 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD78B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD78C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C320815C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD78D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD78E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC821A6B0F3C00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836B617DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF64277909A1D37A000F4CD4 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD82B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD82C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C323015C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD82D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD82E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCAB1A6B111E00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836E017DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF6427B009A2DE36000F4CD4 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA3B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA3C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32B515C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA3D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA3E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD381A6B182100C098BF /* OpenGL.framework in Frameworks */,
+ AF78376817DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF68A48619196CF800D41CD1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF68A48719196CF800D41CD1 /* libjwxyz.a in Frameworks */,
+ AF68A48819196CF800D41CD1 /* ScreenSaver.framework in Frameworks */,
+ AF68A48919196CF800D41CD1 /* QuartzCore.framework in Frameworks */,
+ AF68A48A19196CF800D41CD1 /* Cocoa.framework in Frameworks */,
+ AF68A48B19196CF800D41CD1 /* Carbon.framework in Frameworks */,
+ CEE0BCB01A6B115700C098BF /* OpenGL.framework in Frameworks */,
+ AF68A48C19196CF800D41CD1 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF73FF2A1A09877F00E485E9 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF73FF2B1A09877F00E485E9 /* libjwxyz.a in Frameworks */,
+ AF73FF2C1A09877F00E485E9 /* ScreenSaver.framework in Frameworks */,
+ AF73FF2D1A09877F00E485E9 /* QuartzCore.framework in Frameworks */,
+ AF73FF2E1A09877F00E485E9 /* Cocoa.framework in Frameworks */,
+ AF73FF2F1A09877F00E485E9 /* Carbon.framework in Frameworks */,
+ CEE0BC6A1A6B0E3800C098BF /* OpenGL.framework in Frameworks */,
+ AF73FF301A09877F00E485E9 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7511071782B5B900380EA1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF7511081782B5B900380EA1 /* libjwxyz.a in Frameworks */,
+ AF7511091782B5B900380EA1 /* ScreenSaver.framework in Frameworks */,
+ AF75110A1782B5B900380EA1 /* QuartzCore.framework in Frameworks */,
+ AF75110B1782B5B900380EA1 /* Cocoa.framework in Frameworks */,
+ AF75110C1782B5B900380EA1 /* Carbon.framework in Frameworks */,
+ CEE0BD0C1A6B167000C098BF /* OpenGL.framework in Frameworks */,
+ AF78373F17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7776EE09B63ABF00EA3033 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD7EF158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD7F0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C322115C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD7F1158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD7F2158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC9C1A6B108000C098BF /* OpenGL.framework in Frameworks */,
+ AF7836D117DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77772209B6416100EA3033 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8C3158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8C4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C325715C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8C5158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8C6158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCD11A6B136300C098BF /* OpenGL.framework in Frameworks */,
+ AF78370617DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77774609B6446500EA3033 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD94B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD94C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C327915C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD94D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD94E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCF41A6B157600C098BF /* OpenGL.framework in Frameworks */,
+ AF78372917DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77777D09B6497800EA3033 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD95B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD95C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C327D15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD95D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD95E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCFD1A6B15D200C098BF /* OpenGL.framework in Frameworks */,
+ AF78372D17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77779709B64A5200EA3033 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9B7158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9B8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C329415C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9B9158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9BA158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD121A6B16A800C098BF /* OpenGL.framework in Frameworks */,
+ AF78374517DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7777B109B64B2600EA3033 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA17158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA18158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32AC15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA19158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA1A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD2C1A6B17A200C098BF /* OpenGL.framework in Frameworks */,
+ AF78375E17DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7777D909B64C6B00EA3033 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD97F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD980158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C328615C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD981158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD982158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD031A6B161700C098BF /* OpenGL.framework in Frameworks */,
+ AF78373617DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7777F309B64E3100EA3033 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD94F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD950158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C327A15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD951158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD952158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCF51A6B158000C098BF /* OpenGL.framework in Frameworks */,
+ AF78372A17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77781A09B6504400EA3033 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA13158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA14158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32AB15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA15158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA16158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD2B1A6B179900C098BF /* OpenGL.framework in Frameworks */,
+ AF78375D17DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77784D09B6528100EA3033 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD913158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD914158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C326B15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD915158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD916158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCE51A6B143500C098BF /* OpenGL.framework in Frameworks */,
+ AF78371B17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77786909B6536000EA3033 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD937158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD938158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C327415C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD939158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD93A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCEF1A6B154200C098BF /* OpenGL.framework in Frameworks */,
+ AF78372417DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77788709B6563500EA3033 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD783158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD784158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C320615C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD785158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD786158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC801A6B0F2900C098BF /* OpenGL.framework in Frameworks */,
+ AF7836B417DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7778AD09B659C800EA3033 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD733158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD734158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C31F215C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD735158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD736158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC6C1A6B0E4B00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836A017DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF78D17D142DD8F3002AAF77 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD98B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD98C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C328915C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD98D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD98E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD061A6B163700C098BF /* OpenGL.framework in Frameworks */,
+ AF78373917DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF794F6C099748450059A8B0 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD88F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD890158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C324915C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD891158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD892158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCC41A6B126D00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836F917DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF794F9609974A320059A8B0 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8A3158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8A4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C324E15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8A5158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8A6158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCC91A6B131300C098BF /* OpenGL.framework in Frameworks */,
+ AF7836FE17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF794FD509974FA60059A8B0 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8BB158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8BC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C325515C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8BD158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8BE158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCCF1A6B135000C098BF /* OpenGL.framework in Frameworks */,
+ AF78370417DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7ACFC819FF0A9200BD752B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF7ACFC919FF0A9200BD752B /* libjwxyz.a in Frameworks */,
+ AF7ACFCA19FF0A9200BD752B /* ScreenSaver.framework in Frameworks */,
+ AF7ACFCB19FF0A9200BD752B /* QuartzCore.framework in Frameworks */,
+ AF7ACFCC19FF0A9200BD752B /* Cocoa.framework in Frameworks */,
+ AF7ACFCD19FF0A9200BD752B /* Carbon.framework in Frameworks */,
+ CEE0BCF91A6B15AD00C098BF /* OpenGL.framework in Frameworks */,
+ AF7ACFCE19FF0A9200BD752B /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF918989158FC00A002B5D1E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF918B96158FD0EA002B5D1E /* libjwxyz.a in Frameworks */,
+ AFEB9C3B1590054B003974F3 /* OpenGLES.framework in Frameworks */,
+ AFEB9C3915900514003974F3 /* UIKit.framework in Frameworks */,
+ AF561DF815969C5B007CA5ED /* AssetsLibrary.framework in Frameworks */,
+ AF142BB11EFEFBA20005C0A8 /* Photos.framework in Frameworks */,
+ AFEB9C3D15900558003974F3 /* Foundation.framework in Frameworks */,
+ AFEB9C401590056A003974F3 /* CoreGraphics.framework in Frameworks */,
+ AF0FAF3C159BAC7C00BCE2F7 /* CoreText.framework in Frameworks */,
+ AFEB9C411590056A003974F3 /* QuartzCore.framework in Frameworks */,
+ AF7F54A417DC249500CE1158 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975735099C317000B05160 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD7A3158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD7A4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C320E15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD7A5158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD7A6158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC891A6B0FB300C098BF /* OpenGL.framework in Frameworks */,
+ AF7836BD17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF97577D099C374A00B05160 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD7CF158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD7D0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C321915C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD7D1158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD7D2158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC941A6B103100C098BF /* OpenGL.framework in Frameworks */,
+ AF7836C817DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9757CA099C3E6300B05160 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD80B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD80C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C322815C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD80D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD80E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCA31A6B10CB00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836D817DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975810099C41D500B05160 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD85F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD860158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C323D15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD861158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD862158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCB81A6B11E700C098BF /* OpenGL.framework in Frameworks */,
+ AF7836ED17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF97586D099C475900B05160 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD81F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD820158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C322D15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD821158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD822158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCA81A6B10FD00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836DD17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975A3E099C681F00B05160 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD7CB158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD7CC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C321815C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD7CD158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD7CE158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC931A6B102600C098BF /* OpenGL.framework in Frameworks */,
+ AF7836C717DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975A74099C6AB200B05160 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD773158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD774158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C320215C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD775158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD776158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC7C1A6B0F0400C098BF /* OpenGL.framework in Frameworks */,
+ AF7836B017DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975A8E099C6BC300B05160 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD72B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD72C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C31F015C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD72D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD72E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC691A6B0E2D00C098BF /* OpenGL.framework in Frameworks */,
+ AF78369E17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975ADF099C6EB100B05160 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD777158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD778158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C320315C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD779158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD77A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC7D1A6B0F0D00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836B117DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975B04099C6FE400B05160 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD7C7158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD7C8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C321715C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD7C9158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD7CA158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC921A6B101900C098BF /* OpenGL.framework in Frameworks */,
+ AF7836C617DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975C1A099C8C1500B05160 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD797158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD798158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C320B15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD799158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD79A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC851A6B0F5D00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836B917DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975C46099C8DCF00B05160 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD78F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD790158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C320915C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD791158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD792158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC831A6B0F4500C098BF /* OpenGL.framework in Frameworks */,
+ AF7836B717DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975C66099C8F3F00B05160 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD7DF158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD7E0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C321D15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD7E1158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD7E2158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC981A6B105800C098BF /* OpenGL.framework in Frameworks */,
+ AF7836CC17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975D5B099CA0F000B05160 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD813158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD814158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C322A15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD815158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD816158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCA51A6B10DE00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836DA17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF976FBA0989CAA2001F8B92 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD763158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD764158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C31FE15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD765158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD766158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC781A6B0EDD00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836AC17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9770390989D1E6001F8B92 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD817158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD818158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C322B15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD819158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD81A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCA61A6B10E900C098BF /* OpenGL.framework in Frameworks */,
+ AF7836DB17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9770760989D2F6001F8B92 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD727158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD728158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C31EF15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD729158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD72A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC681A6B0E1800C098BF /* OpenGL.framework in Frameworks */,
+ AF78369D17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9771D50989DC4A001F8B92 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFEB9C37158FFF88003974F3 /* ScreenSaver.framework in Frameworks */,
+ AF2C31E615C0F7FE007A6896 /* QuartzCore.framework in Frameworks */,
+ AF918B99158FF045002B5D1E /* Cocoa.framework in Frameworks */,
+ AF918B9A158FF04C002B5D1E /* Carbon.framework in Frameworks */,
+ AF78369717DB9F25003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF998EE20A083DB30051049D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA2B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA2C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32B115C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA2D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA2E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD311A6B17D300C098BF /* OpenGL.framework in Frameworks */,
+ AF78376317DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D466E09B5109C006E59CF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD75F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD760158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C31FD15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD761158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD762158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC771A6B0ED300C098BF /* OpenGL.framework in Frameworks */,
+ AF7836AB17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D474C09B5300A006E59CF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD823158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD824158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C322E15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD825158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD826158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCA91A6B110700C098BF /* OpenGL.framework in Frameworks */,
+ AF7836DE17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D476709B53166006E59CF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD87B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD87C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C324415C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD87D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD87E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCBF1A6B123500C098BF /* OpenGL.framework in Frameworks */,
+ AF7836F417DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D48E309B53322006E59CF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD73F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD740158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C31F515C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD741158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD742158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC6F1A6B0E6700C098BF /* OpenGL.framework in Frameworks */,
+ AF7836A317DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D48FC09B535DA006E59CF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD76B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD76C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C320015C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD76D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD76E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC7A1A6B0EF100C098BF /* OpenGL.framework in Frameworks */,
+ AF7836AE17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D493309B53CBA006E59CF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD80F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD810158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C322915C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD811158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD812158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCA41A6B10D400C098BF /* OpenGL.framework in Frameworks */,
+ AF7836D917DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D495C09B53FC9006E59CF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD81B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD81C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C322C15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD81D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD81E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCA71A6B10F300C098BF /* OpenGL.framework in Frameworks */,
+ AF7836DC17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D497409B5411D006E59CF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD843158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD844158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C323615C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD845158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD846158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCB21A6B116B00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836E617DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D499F09B544C2006E59CF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD82F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD830158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C323115C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD831158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD832158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCAC1A6B112A00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836E117DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D4C7109B59F27006E59CF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD86B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD86C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C324015C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD86D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD86E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCBB1A6B120600C098BF /* OpenGL.framework in Frameworks */,
+ AF7836F017DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D4CEF09B5AA8E006E59CF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD7FB158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD7FC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C322415C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD7FD158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD7FE158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC9F1A6B10A000C098BF /* OpenGL.framework in Frameworks */,
+ AF7836D417DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D4D8709B5B2DC006E59CF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD863158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD864158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C323E15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD865158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD866158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCB91A6B11F100C098BF /* OpenGL.framework in Frameworks */,
+ AF7836EE17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D4DB809B5B71E006E59CF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD73B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD73C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C31F415C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD73D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD73E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC6E1A6B0E5E00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836A217DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D4DF609B5BB19006E59CF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD71F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD720158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C31ED15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD721158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD722158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC671A6B0E0600C098BF /* OpenGL.framework in Frameworks */,
+ AF78369B17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9E7EBC190F4C1B00A8B01F /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA211941CD59DAF00C0D2A1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA211951CD59DAF00C0D2A1 /* libjwxyz.a in Frameworks */,
+ AFA211961CD59DAF00C0D2A1 /* ScreenSaver.framework in Frameworks */,
+ AFA211971CD59DAF00C0D2A1 /* QuartzCore.framework in Frameworks */,
+ AFA211981CD59DAF00C0D2A1 /* Cocoa.framework in Frameworks */,
+ AFA211991CD59DAF00C0D2A1 /* Carbon.framework in Frameworks */,
+ AFA2119A1CD59DAF00C0D2A1 /* OpenGL.framework in Frameworks */,
+ AFA2119B1CD59DAF00C0D2A1 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA339370B058505002B0E7D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD84F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD850158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C323915C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD851158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD852158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCB51A6B118C00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836E917DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA33BC50B058740002B0E7D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD853158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD854158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C323A15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD855158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD856158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ AF7836EA17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5594F099330B000F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD90F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD910158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C326A15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD911158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD912158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCE41A6B142C00C098BF /* OpenGL.framework in Frameworks */,
+ AF78371A17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA559740993317900F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9BB158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9BC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C329515C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9BD158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9BE158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD131A6B16B200C098BF /* OpenGL.framework in Frameworks */,
+ AF78374617DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA559990993322100F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA1B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA1C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32AD15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA1D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA1E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD2D1A6B17AD00C098BF /* OpenGL.framework in Frameworks */,
+ AF78375F17DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA559BC0993328000F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9C7158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9C8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C329815C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9C9158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9CA158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD161A6B16D000C098BF /* OpenGL.framework in Frameworks */,
+ AF78374917DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA559D60993330600F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9EF158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9F0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32A215C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9F1158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9F2158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD221A6B174400C098BF /* OpenGL.framework in Frameworks */,
+ AF78375417DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55A0A0993340300F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA0F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA10158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32AA15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA11158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA12158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD2A1A6B178F00C098BF /* OpenGL.framework in Frameworks */,
+ AF78375C17DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55A27099334A000F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA0B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA0C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32A915C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA0D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA0E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD291A6B178600C098BF /* OpenGL.framework in Frameworks */,
+ AF78375B17DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55A800993364300F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9A7158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9A8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C329015C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9A9158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9AA158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD0E1A6B168200C098BF /* OpenGL.framework in Frameworks */,
+ AF78374117DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55AD609933CEF00F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD90B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD90C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C326915C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD90D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD90E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCE31A6B142200C098BF /* OpenGL.framework in Frameworks */,
+ AF78371917DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55B1309933E0500F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD977158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD978158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C328415C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD979158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD97A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD011A6B160200C098BF /* OpenGL.framework in Frameworks */,
+ AF78373417DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55B2C09933E8D00F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9E7158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9E8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32A015C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9E9158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9EA158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD1F1A6B172800C098BF /* OpenGL.framework in Frameworks */,
+ AF78375117DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55B8009933F7200F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9FF158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA00158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32A615C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA01158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA02158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD251A6B176000C098BF /* OpenGL.framework in Frameworks */,
+ AF78375817DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55B9809933FDA00F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD95F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD960158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C327E15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD961158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD962158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCFA1A6B15B600C098BF /* OpenGL.framework in Frameworks */,
+ AF78372E17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55BB2099340CE00F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD917158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD918158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C326C15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD919158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD91A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCE61A6B143E00C098BF /* OpenGL.framework in Frameworks */,
+ AF78371C17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55BEB0993429100F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9B3158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9B4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C329315C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9B5158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9B6158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD111A6B169F00C098BF /* OpenGL.framework in Frameworks */,
+ AF78374417DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55C150993431300F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD93F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD940158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C327615C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD941158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD942158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCF11A6B155700C098BF /* OpenGL.framework in Frameworks */,
+ AF78372617DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55C7E099349A600F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD983158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD984158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C328715C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD985158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD986158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD041A6B162400C098BF /* OpenGL.framework in Frameworks */,
+ AF78373717DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55CB009934BB200F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD907158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD908158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C326815C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD909158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD90A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCE21A6B141900C098BF /* OpenGL.framework in Frameworks */,
+ AF78371817DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55CD309934CE400F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA4B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA4C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32B915C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA4D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA4E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD361A6B180D00C098BF /* OpenGL.framework in Frameworks */,
+ AF78376C17DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55D430993565300F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9FB158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9FC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32A515C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9FD158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9FE158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD241A6B175700C098BF /* OpenGL.framework in Frameworks */,
+ AF78375717DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55D690993584B00F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD927158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD928158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C327015C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD929158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD92A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCEB1A6B151A00C098BF /* OpenGL.framework in Frameworks */,
+ AF78372017DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55D86099358C400F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA07158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA08158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32A815C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA09158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA0A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD281A6B177C00C098BF /* OpenGL.framework in Frameworks */,
+ AF78375A17DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55DCF09935D7000F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9AB158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9AC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C329115C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9AD158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9AE158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD0F1A6B168D00C098BF /* OpenGL.framework in Frameworks */,
+ AF78374217DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55DF809935E4900F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9EB158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9EC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32A115C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9ED158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9EE158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD211A6B173A00C098BF /* OpenGL.framework in Frameworks */,
+ AF78375317DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55E1409935EDC00F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD93B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD93C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C327515C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD93D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD93E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCF01A6B154E00C098BF /* OpenGL.framework in Frameworks */,
+ AF78372517DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55E3709935F8E00F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD963158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD964158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C327F15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD965158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD966158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCFB1A6B15BF00C098BF /* OpenGL.framework in Frameworks */,
+ AF78372F17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55E5509935FF900F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD953158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD954158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C327B15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD955158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD956158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCF61A6B158C00C098BF /* OpenGL.framework in Frameworks */,
+ AF78372B17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55ED8099360E300F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD903158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD904158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C326715C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD905158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD906158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCE11A6B140F00C098BF /* OpenGL.framework in Frameworks */,
+ AF78371717DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55F13099361B700F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD997158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD998158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C328C15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD999158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD99A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD091A6B165300C098BF /* OpenGL.framework in Frameworks */,
+ AF78373C17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55F310993622F00F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9A3158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9A4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C328F15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9A5158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9A6158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD0D1A6B167900C098BF /* OpenGL.framework in Frameworks */,
+ AF78374017DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55F490993629000F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD98F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD990158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C328A15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD991158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD992158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD071A6B164000C098BF /* OpenGL.framework in Frameworks */,
+ AF78373A17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55F790993643600F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD973158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD974158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C328315C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD975158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD976158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD001A6B15F800C098BF /* OpenGL.framework in Frameworks */,
+ AF78373317DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55FDA09936BFA00F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD92B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD92C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C327115C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD92D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD92E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCEC1A6B152300C098BF /* OpenGL.framework in Frameworks */,
+ AF78372117DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5600009936C6D00F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD96F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD970158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C328215C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD971158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD972158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCFF1A6B15EE00C098BF /* OpenGL.framework in Frameworks */,
+ AF78373217DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5601B09936CC800F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8FB158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8FC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C326515C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8FD158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8FE158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCDF1A6B13FC00C098BF /* OpenGL.framework in Frameworks */,
+ AF78371517DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5603909936D5100F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD947158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD948158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C327815C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD949158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD94A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCF31A6B156C00C098BF /* OpenGL.framework in Frameworks */,
+ AF78372817DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5605109936E2100F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8E3158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8E4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C325F15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8E5158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8E6158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCD91A6B13C000C098BF /* OpenGL.framework in Frameworks */,
+ AF78370F17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5606909936F3800F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8EB158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8EC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C326115C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8ED158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8EE158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCDB1A6B13D300C098BF /* OpenGL.framework in Frameworks */,
+ AF78371117DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA560B50993718D00F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9DF158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9E0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C329E15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9E1158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9E2158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD1C1A6B170A00C098BF /* OpenGL.framework in Frameworks */,
+ AF78374F17DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA561040993781600F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9C3158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9C4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C329715C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9C5158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9C6158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD151A6B16C500C098BF /* OpenGL.framework in Frameworks */,
+ AF78374817DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5615F09937C0D00F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8F7158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8F8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C326415C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8F9158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8FA158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCDE1A6B13F100C098BF /* OpenGL.framework in Frameworks */,
+ AF78371417DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5618209937CF100F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9CB158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9CC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C329915C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9CD158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9CE158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD171A6B16DA00C098BF /* OpenGL.framework in Frameworks */,
+ AF78374A17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA561A409937D7E00F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9DB158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9DC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C329D15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9DD158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9DE158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD1B1A6B170100C098BF /* OpenGL.framework in Frameworks */,
+ AF78374E17DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5620E0993849F00F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9E3158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9E4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C329F15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9E5158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9E6158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD1E1A6B171E00C098BF /* OpenGL.framework in Frameworks */,
+ AF78375017DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA562260993852500F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9D3158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9D4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C329B15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9D5158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9D6158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD191A6B16EE00C098BF /* OpenGL.framework in Frameworks */,
+ AF78374C17DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA562C6099392C600F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8FF158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD900158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C326615C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD901158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD902158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCE01A6B140500C098BF /* OpenGL.framework in Frameworks */,
+ AF78371617DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA562E1099393C900F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8E7158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8E8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C326015C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8E9158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8EA158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCDA1A6B13C900C098BF /* OpenGL.framework in Frameworks */,
+ AF78371017DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA562F90993943B00F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA23158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA24158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32AF15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA25158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA26158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD2F1A6B17BF00C098BF /* OpenGL.framework in Frameworks */,
+ AF78376117DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5631B0993951000F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD91F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD920158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C326E15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD921158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD922158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCE91A6B147900C098BF /* OpenGL.framework in Frameworks */,
+ AF78371E17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA56338099395ED00F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD96B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD96C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C328115C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD96D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD96E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCFE1A6B15E300C098BF /* OpenGL.framework in Frameworks */,
+ AF78373117DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA56358099396C000F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD923158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD924158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C326F15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD925158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD926158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCEA1A6B150F00C098BF /* OpenGL.framework in Frameworks */,
+ AF78371F17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA56380099397B300F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA27158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA28158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32B015C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA29158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA2A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD301A6B17C900C098BF /* OpenGL.framework in Frameworks */,
+ AF78376217DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA563AB099398BB00F3E977 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD99F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9A0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C328E15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9A1158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9A2158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD0B1A6B166700C098BF /* OpenGL.framework in Frameworks */,
+ AF78373E17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA6AAF820999950006D2685 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA6AAF920999950006D2685 /* libjwxyz.a in Frameworks */,
+ AFA6AAFA20999950006D2685 /* ScreenSaver.framework in Frameworks */,
+ AFA6AAFB20999950006D2685 /* QuartzCore.framework in Frameworks */,
+ AFA6AAFC20999950006D2685 /* Cocoa.framework in Frameworks */,
+ AFA6AAFD20999950006D2685 /* Carbon.framework in Frameworks */,
+ AFA6AAFE20999950006D2685 /* OpenGL.framework in Frameworks */,
+ AFA6AAFF20999950006D2685 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFAAE38F207D6343007A515C /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFAAE390207D6343007A515C /* libjwxyz.a in Frameworks */,
+ AFAAE391207D6343007A515C /* ScreenSaver.framework in Frameworks */,
+ AFAAE392207D6343007A515C /* QuartzCore.framework in Frameworks */,
+ AFAAE393207D6343007A515C /* Cocoa.framework in Frameworks */,
+ AFAAE394207D6343007A515C /* Carbon.framework in Frameworks */,
+ AFAAE395207D6343007A515C /* OpenGL.framework in Frameworks */,
+ AFAAE396207D6343007A515C /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFACE87B1CC83458008B24CD /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFACE87C1CC83458008B24CD /* libjwxyz.a in Frameworks */,
+ AFACE87D1CC83458008B24CD /* ScreenSaver.framework in Frameworks */,
+ AFACE87E1CC83458008B24CD /* QuartzCore.framework in Frameworks */,
+ AFACE87F1CC83458008B24CD /* Cocoa.framework in Frameworks */,
+ AFACE8801CC83458008B24CD /* Carbon.framework in Frameworks */,
+ AFACE8811CC83458008B24CD /* OpenGL.framework in Frameworks */,
+ AFACE8821CC83458008B24CD /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFB591AF178B812C00EA4005 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFB591B0178B812C00EA4005 /* libjwxyz.a in Frameworks */,
+ AFB591B1178B812C00EA4005 /* ScreenSaver.framework in Frameworks */,
+ AFB591B2178B812C00EA4005 /* QuartzCore.framework in Frameworks */,
+ AFB591B3178B812C00EA4005 /* Cocoa.framework in Frameworks */,
+ AFB591B4178B812C00EA4005 /* Carbon.framework in Frameworks */,
+ CEE0BC871A6B0F7000C098BF /* OpenGL.framework in Frameworks */,
+ AF7836BB17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFBFE755178642DC00432B21 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFBFE756178642DC00432B21 /* ScreenSaver.framework in Frameworks */,
+ AFBFE757178642DC00432B21 /* QuartzCore.framework in Frameworks */,
+ AFBFE758178642DC00432B21 /* Cocoa.framework in Frameworks */,
+ AFBFE759178642DC00432B21 /* Carbon.framework in Frameworks */,
+ CEE0BC661A6B0DBF00C098BF /* OpenGL.framework in Frameworks */,
+ AF78369C17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFBFE775178647FE00432B21 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFBFE776178647FE00432B21 /* ScreenSaver.framework in Frameworks */,
+ AFBFE777178647FE00432B21 /* QuartzCore.framework in Frameworks */,
+ AFBFE778178647FE00432B21 /* Cocoa.framework in Frameworks */,
+ AFBFE779178647FE00432B21 /* Carbon.framework in Frameworks */,
+ CEE0BC9D1A6B108B00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836D217DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFC0E8B31CDC601A008CAFAC /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFC0E8B41CDC601A008CAFAC /* libjwxyz.a in Frameworks */,
+ AFC0E8B51CDC601A008CAFAC /* ScreenSaver.framework in Frameworks */,
+ AFC0E8B61CDC601A008CAFAC /* QuartzCore.framework in Frameworks */,
+ AFC0E8B71CDC601A008CAFAC /* Cocoa.framework in Frameworks */,
+ AFC0E8B81CDC601A008CAFAC /* Carbon.framework in Frameworks */,
+ AFC0E8B91CDC601A008CAFAC /* OpenGL.framework in Frameworks */,
+ AFC0E8BA1CDC601A008CAFAC /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFC5CFDE2044AA23004CEB5E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFC5CFDF2044AA23004CEB5E /* libjwxyz.a in Frameworks */,
+ AFC5CFE02044AA23004CEB5E /* ScreenSaver.framework in Frameworks */,
+ AFC5CFE12044AA23004CEB5E /* QuartzCore.framework in Frameworks */,
+ AFC5CFE22044AA23004CEB5E /* Cocoa.framework in Frameworks */,
+ AFC5CFE32044AA23004CEB5E /* Carbon.framework in Frameworks */,
+ AFC5CFE42044AA23004CEB5E /* OpenGL.framework in Frameworks */,
+ AFC5CFE52044AA23004CEB5E /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFCF83431AF5B515008BB7E1 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFCF83441AF5B515008BB7E1 /* libjwxyz.a in Frameworks */,
+ AFCF83451AF5B515008BB7E1 /* ScreenSaver.framework in Frameworks */,
+ AFCF83461AF5B515008BB7E1 /* QuartzCore.framework in Frameworks */,
+ AFCF83471AF5B515008BB7E1 /* Cocoa.framework in Frameworks */,
+ AFCF83481AF5B515008BB7E1 /* Carbon.framework in Frameworks */,
+ AFCF83491AF5B515008BB7E1 /* OpenGL.framework in Frameworks */,
+ AFCF834A1AF5B515008BB7E1 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD51B240F063B4A00471C02 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9CF158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9D0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C329A15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9D1158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9D2158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD181A6B16E300C098BF /* OpenGL.framework in Frameworks */,
+ AF78374B17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56DF90996A03800BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD987158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD988158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C328815C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD989158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD98A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD051A6B162E00C098BF /* OpenGL.framework in Frameworks */,
+ AF78373817DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56EB60996A72600BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD887158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD888158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C324715C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD889158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD88A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCC21A6B125800C098BF /* OpenGL.framework in Frameworks */,
+ AF7836F717DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56EE20996A95700BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA47158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA48158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32B815C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA49158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA4A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD3B1A6B184100C098BF /* OpenGL.framework in Frameworks */,
+ AF78376B17DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56F130996AAFA00BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA7F158FF96600C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA80158FF96600C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32C615C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA81158FF96600C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA82158FF96600C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD481A6B18C400C098BF /* OpenGL.framework in Frameworks */,
+ AF78377917DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56F2B0996AB8A00BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8AB158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8AC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C325015C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8AD158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8AE158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCCB1A6B132800C098BF /* OpenGL.framework in Frameworks */,
+ AF78370017DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56F570996AEEE00BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8AF158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8B0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C325115C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8B1158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8B2158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCCC1A6B133300C098BF /* OpenGL.framework in Frameworks */,
+ AF78370117DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56F730996B01600BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8B3158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8B4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C325215C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8B5158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8B6158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCCD1A6B133D00C098BF /* OpenGL.framework in Frameworks */,
+ AF78370217DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56F940996B09400BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA5B158FF96600C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA5C158FF96600C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32BD15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA5D158FF96600C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA5E158FF96600C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD3F1A6B186C00C098BF /* OpenGL.framework in Frameworks */,
+ AF78377017DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56FAB0996B10F00BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA5F158FF96600C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA60158FF96600C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32BE15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA61158FF96600C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA62158FF96600C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD401A6B187500C098BF /* OpenGL.framework in Frameworks */,
+ AF78377117DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56FC10996B18F00BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA63158FF96600C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA64158FF96600C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32BF15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA65158FF96600C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA66158FF96600C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD411A6B188100C098BF /* OpenGL.framework in Frameworks */,
+ AF78377217DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56FD70996B20900BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA67158FF96600C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA68158FF96600C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32C015C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA69158FF96600C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA6A158FF96600C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD421A6B188B00C098BF /* OpenGL.framework in Frameworks */,
+ AF78377317DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570000996B43800BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8C7158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8C8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C325815C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8C9158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8CA158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCD21A6B136C00C098BF /* OpenGL.framework in Frameworks */,
+ AF78370717DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570170996B4CC00BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8CF158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8D0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C325A15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8D1158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8D2158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCD41A6B137F00C098BF /* OpenGL.framework in Frameworks */,
+ AF78370917DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD5702E0996B56D00BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA73158FF96600C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA74158FF96600C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32C315C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA75158FF96600C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA76158FF96600C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD451A6B18A900C098BF /* OpenGL.framework in Frameworks */,
+ AF78377617DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD5704B0996B61600BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA77158FF96600C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA78158FF96600C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32C415C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA79158FF96600C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA7A158FF96600C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD461A6B18B200C098BF /* OpenGL.framework in Frameworks */,
+ AF78377717DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570610996B6A300BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD89F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8A0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C324D15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8A1158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8A2158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCC81A6B130A00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836FD17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570770996B72700BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8BF158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8C0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C325615C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8C1158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8C2158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCD01A6B135900C098BF /* OpenGL.framework in Frameworks */,
+ AF78370517DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD5708D0996B80300BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8DF158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8E0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C325E15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8E1158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8E2158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCD81A6B13B500C098BF /* OpenGL.framework in Frameworks */,
+ AF78370D17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570A30996B88E00BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA87158FF96600C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA88158FF96600C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32C815C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA89158FF96600C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA8A158FF96600C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD4A1A6B18D700C098BF /* OpenGL.framework in Frameworks */,
+ AF78377B17DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570B90996B93000BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA6F158FF96600C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA70158FF96600C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32C215C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA71158FF96600C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA72158FF96600C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD441A6B189F00C098BF /* OpenGL.framework in Frameworks */,
+ AF78377517DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570D10996B9F800BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA37158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA38158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32B415C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA39158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA3A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD371A6B181700C098BF /* OpenGL.framework in Frameworks */,
+ AF78376717DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570F20996BBBF00BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8A7158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8A8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C324F15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8A9158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8AA158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCCA1A6B131E00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836FF17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD5711B0996BE9300BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD893158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD894158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C324A15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD895158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD896158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCC51A6B127700C098BF /* OpenGL.framework in Frameworks */,
+ AF7836FA17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD571340996BF2E00BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD87F158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD880158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C324515C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD881158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD882158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCC01A6B124400C098BF /* OpenGL.framework in Frameworks */,
+ AF7836F517DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD5714B0996C01700BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD89B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD89C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C324C15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD89D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD89E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCC71A6B130000C098BF /* OpenGL.framework in Frameworks */,
+ AF7836FC17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD571610996C0CE00BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8DB158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8DC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C325D15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8DD158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8DE158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCD71A6B13AA00C098BF /* OpenGL.framework in Frameworks */,
+ AF78370C17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD571BD0996D9DC00BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA57158FF96600C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA58158FF96600C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32BC15C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA59158FF96600C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA5A158FF96600C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD3E1A6B186200C098BF /* OpenGL.framework in Frameworks */,
+ AF78376F17DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD5722A0996E4A300BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8D7158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8D8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C325C15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8D9158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8DA158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCD61A6B13A100C098BF /* OpenGL.framework in Frameworks */,
+ AF78370B17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD572750996EE8500BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8CB158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8CC158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C325915C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8CD158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8CE158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCD31A6B137600C098BF /* OpenGL.framework in Frameworks */,
+ AF78370817DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD572AD0996F99600BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD883158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD884158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C324615C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD885158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD886158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCC11A6B124D00C098BF /* OpenGL.framework in Frameworks */,
+ AF7836F617DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD572CA0996FC0F00BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD88B158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD88C158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C324815C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD88D158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD88E158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCC31A6B126200C098BF /* OpenGL.framework in Frameworks */,
+ AF7836F817DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD57301099701C000BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8B7158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8B8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C325315C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8B9158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8BA158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCCE1A6B134600C098BF /* OpenGL.framework in Frameworks */,
+ AF78370317DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD573650997411200BA26F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD8D3158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD8D4158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C325B15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD8D5158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD8D6158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCD51A6B138800C098BF /* OpenGL.framework in Frameworks */,
+ AF78370A17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD77E6320C23F8600A3638D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD77E6420C23F8600A3638D /* libjwxyz.a in Frameworks */,
+ AFD77E6520C23F8600A3638D /* ScreenSaver.framework in Frameworks */,
+ AFD77E6620C23F8600A3638D /* QuartzCore.framework in Frameworks */,
+ AFD77E6720C23F8600A3638D /* Cocoa.framework in Frameworks */,
+ AFD77E6820C23F8600A3638D /* Carbon.framework in Frameworks */,
+ AFD77E6920C23F8600A3638D /* OpenGL.framework in Frameworks */,
+ AFD77E6A20C23F8600A3638D /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFDA6596178A52B70070D24B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFDA6597178A52B70070D24B /* libjwxyz.a in Frameworks */,
+ AFDA6598178A52B70070D24B /* ScreenSaver.framework in Frameworks */,
+ AFDA6599178A52B70070D24B /* QuartzCore.framework in Frameworks */,
+ AFDA659A178A52B70070D24B /* Cocoa.framework in Frameworks */,
+ AFDA659B178A52B70070D24B /* Carbon.framework in Frameworks */,
+ CEE0BD331A6B17E600C098BF /* OpenGL.framework in Frameworks */,
+ AF78376517DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFE2A45E0E2E904600ADB298 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FDA03158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FDA04158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32A715C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FDA05158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FDA06158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD261A6B176900C098BF /* OpenGL.framework in Frameworks */,
+ AF78375917DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFE30BF00E52B14700CCF4A5 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9F7158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9F8158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C32A415C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9F9158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9FA158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD271A6B177200C098BF /* OpenGL.framework in Frameworks */,
+ AF78375617DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFE6A18B0CDD7B2E002805BF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD9BF158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD9C0158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C329615C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD9C1158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD9C2158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BD141A6B16BB00C098BF /* OpenGL.framework in Frameworks */,
+ AF78374717DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFE6A4240CDD7FAA002805BF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD713158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD714158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C31EA15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD715158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD716158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC641A6B0DA100C098BF /* OpenGL.framework in Frameworks */,
+ AF78369817DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFEC23D51CB6EAE100DE138F /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFEC23D61CB6EAE100DE138F /* libjwxyz.a in Frameworks */,
+ AFEC23D71CB6EAE100DE138F /* ScreenSaver.framework in Frameworks */,
+ AFEC23D81CB6EAE100DE138F /* QuartzCore.framework in Frameworks */,
+ AFEC23D91CB6EAE100DE138F /* Cocoa.framework in Frameworks */,
+ AFEC23DA1CB6EAE100DE138F /* Carbon.framework in Frameworks */,
+ AFEC23DB1CB6EAE100DE138F /* OpenGL.framework in Frameworks */,
+ AFEC23DC1CB6EAE100DE138F /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFEE10551D13406000AAC8F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFEE10561D13406000AAC8F7 /* libjwxyz.a in Frameworks */,
+ AFEE10571D13406000AAC8F7 /* ScreenSaver.framework in Frameworks */,
+ AFEE10581D13406000AAC8F7 /* QuartzCore.framework in Frameworks */,
+ AFEE10591D13406000AAC8F7 /* Cocoa.framework in Frameworks */,
+ AFEE105A1D13406000AAC8F7 /* Carbon.framework in Frameworks */,
+ AFEE105B1D13406000AAC8F7 /* OpenGL.framework in Frameworks */,
+ AFEE105C1D13406000AAC8F7 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFEE10741D15EB0800AAC8F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFEE10751D15EB0800AAC8F7 /* libjwxyz.a in Frameworks */,
+ AFEE10761D15EB0800AAC8F7 /* ScreenSaver.framework in Frameworks */,
+ AFEE10771D15EB0800AAC8F7 /* QuartzCore.framework in Frameworks */,
+ AFEE10781D15EB0800AAC8F7 /* Cocoa.framework in Frameworks */,
+ AFEE10791D15EB0800AAC8F7 /* Carbon.framework in Frameworks */,
+ AFEE107A1D15EB0800AAC8F7 /* OpenGL.framework in Frameworks */,
+ AFEE107B1D15EB0800AAC8F7 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFEE10931D17E20B00AAC8F7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFEE10941D17E20B00AAC8F7 /* libjwxyz.a in Frameworks */,
+ AFEE10951D17E20B00AAC8F7 /* ScreenSaver.framework in Frameworks */,
+ AFEE10961D17E20B00AAC8F7 /* QuartzCore.framework in Frameworks */,
+ AFEE10971D17E20B00AAC8F7 /* Cocoa.framework in Frameworks */,
+ AFEE10981D17E20B00AAC8F7 /* Carbon.framework in Frameworks */,
+ AFEE10991D17E20B00AAC8F7 /* OpenGL.framework in Frameworks */,
+ AFEE109A1D17E20B00AAC8F7 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFF2868717860E830050A578 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFF2868817860E830050A578 /* libjwxyz.a in Frameworks */,
+ AFF2868917860E830050A578 /* ScreenSaver.framework in Frameworks */,
+ AFF2868A17860E830050A578 /* QuartzCore.framework in Frameworks */,
+ AFF2868B17860E830050A578 /* Cocoa.framework in Frameworks */,
+ AFF2868C17860E830050A578 /* Carbon.framework in Frameworks */,
+ CEE0BD201A6B173100C098BF /* OpenGL.framework in Frameworks */,
+ AF78375217DBA581003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFF3C9F017CCAC440028F240 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFF3C9F117CCAC440028F240 /* libjwxyz.a in Frameworks */,
+ AFF3C9F217CCAC440028F240 /* ScreenSaver.framework in Frameworks */,
+ AFF3C9F317CCAC440028F240 /* QuartzCore.framework in Frameworks */,
+ AFF3C9F417CCAC440028F240 /* Cocoa.framework in Frameworks */,
+ AFF3C9F517CCAC440028F240 /* Carbon.framework in Frameworks */,
+ CEE0BCF81A6B15A300C098BF /* OpenGL.framework in Frameworks */,
+ AF78370E17DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFF4633E0C4403E400EE6509 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD757158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD758158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C31FB15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD759158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD75A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BC751A6B0EA500C098BF /* OpenGL.framework in Frameworks */,
+ AF7836A917DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFF463600C440AEF00EE6509 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1FD967158FF96500C40F17 /* libjwxyz.a in Frameworks */,
+ AF1FD968158FF96500C40F17 /* ScreenSaver.framework in Frameworks */,
+ AF2C328015C0FC9D007A6896 /* QuartzCore.framework in Frameworks */,
+ AF1FD969158FF96500C40F17 /* Cocoa.framework in Frameworks */,
+ AF1FD96A158FF96500C40F17 /* Carbon.framework in Frameworks */,
+ CEE0BCFC1A6B15C800C098BF /* OpenGL.framework in Frameworks */,
+ AF78373017DBA580003B9FC0 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFFAB31D19158CE40020F021 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFFAB31E19158CE40020F021 /* libjwxyz.a in Frameworks */,
+ AFFAB31F19158CE40020F021 /* ScreenSaver.framework in Frameworks */,
+ AFFAB32019158CE40020F021 /* QuartzCore.framework in Frameworks */,
+ AFFAB32119158CE40020F021 /* Cocoa.framework in Frameworks */,
+ AFFAB32219158CE40020F021 /* Carbon.framework in Frameworks */,
+ CEE0BD1D1A6B171400C098BF /* OpenGL.framework in Frameworks */,
+ AFFAB32319158CE40020F021 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CE3D01591B76F4C100993C75 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CE3D015A1B76F4C100993C75 /* libjwxyz.a in Frameworks */,
+ CE3D015B1B76F4C100993C75 /* ScreenSaver.framework in Frameworks */,
+ CE3D015C1B76F4C100993C75 /* QuartzCore.framework in Frameworks */,
+ CE3D015D1B76F4C100993C75 /* Cocoa.framework in Frameworks */,
+ CE3D015E1B76F4C100993C75 /* Carbon.framework in Frameworks */,
+ CE3D015F1B76F4C100993C75 /* OpenGL.framework in Frameworks */,
+ CE3D01601B76F4C100993C75 /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 080E96DDFE201D6D7F000001 /* libjwxyz */ = {
+ isa = PBXGroup;
+ children = (
+ AFE1FD410981E32E00F7970E /* InvertedSlider.h */,
+ AFE1FD420981E32E00F7970E /* InvertedSlider.m */,
+ AF2D8F301CEBA10300198014 /* jwxyz-timers.c */,
+ AF2D8F311CEBA10300198014 /* jwxyz-timers.h */,
+ AFE1FD430981E32E00F7970E /* jwxyz.h */,
+ AFE1FD440981E32E00F7970E /* jwxyz.m */,
+ CE8C49CC1C011CC400BA2DCF /* jwxyzI.h */,
+ CE8206741B89048800E35532 /* jwxyz-cocoa.h */,
+ CE43C2BE1C055157004C2BC6 /* jwxyz-cocoa.m */,
+ CE8EA1C11C35CF10002D1020 /* jwxyz-common.c */,
+ CE5564591C25141000645458 /* jwxyz-gl.c */,
+ AF6048F8157C07C600CA21E4 /* jwzgles.c */,
+ AF6048F9157C07C600CA21E4 /* jwzgles.h */,
+ AF6048FA157C07C600CA21E4 /* jwzglesI.h */,
+ AF561DF515969BC3007CA5ED /* grabclient-ios.m */,
+ AF9D468E09B51567006E59CF /* grabclient-osx.m */,
+ AFE1FD470981E32E00F7970E /* PrefsReader.h */,
+ AFE1FD480981E32E00F7970E /* PrefsReader.m */,
+ 32CA4F630368D1EE00C91783 /* xscreensaver_Prefix.pch */,
+ AFC2577F09888F5A000655EE /* XScreenSaverConfigSheet.h */,
+ AFC2578009888F5A000655EE /* XScreenSaverConfigSheet.m */,
+ AF4812F70990D9AE00FB32B8 /* XScreenSaverGLView.h */,
+ AF4812F80990D9AE00FB32B8 /* XScreenSaverGLView.m */,
+ AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */,
+ AFC254C409882C97000655EE /* XScreenSaverView.h */,
+ AFC254C509882C97000655EE /* XScreenSaverView.m */,
+ AF9E7EC8190F4C4000A8B01F /* enable_gc.c */,
+ );
+ name = libjwxyz;
+ sourceTree = "<group>";
+ };
+ 19C28FACFE9D520D11CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */,
+ AF97707D0989D2F6001F8B92 /* Attraction.saver */,
+ AF4810FB09909FBA00FB32B8 /* DangerBall.saver */,
+ AF976FBC0989CAA2001F8B92 /* Deco.saver */,
+ AF480D81098EEDDE00FB32B8 /* Drift.saver */,
+ AF480C58098E301400FB32B8 /* Helix.saver */,
+ AF9770400989D1E6001F8B92 /* Rorschach.saver */,
+ AF9771D70989DC4A001F8B92 /* SaverTester.app */,
+ AF4812640990CE2700FB32B8 /* Gears.saver */,
+ AF4812C60990D3D900FB32B8 /* Pipes.saver */,
+ AF0839A209930B6B00277BE9 /* Atlantis.saver */,
+ AF083A48099311D700277BE9 /* Atunnel.saver */,
+ AFA5595A099330B000F3E977 /* Cage.saver */,
+ AFA5597F0993317900F3E977 /* Moebius.saver */,
+ AFA559A40993322100F3E977 /* Superquadrics.saver */,
+ AFA559C70993328000F3E977 /* Morph3D.saver */,
+ AFA559E10993330600F3E977 /* Rubik.saver */,
+ AFA55A150993340300F3E977 /* Stairs.saver */,
+ AFA55A32099334A000F3E977 /* Sproingies.saver */,
+ AFA55A8B0993364300F3E977 /* Lament.saver */,
+ AFA55AE109933CEF00F3E977 /* Bubble3D.saver */,
+ AFA55B1E09933E0500F3E977 /* GLPlanet.saver */,
+ AFA55B3709933E8D00F3E977 /* Pulsar.saver */,
+ AFA55B8B09933F7200F3E977 /* Sierpinski3D.saver */,
+ AFA55BA309933FDA00F3E977 /* GFlux.saver */,
+ AFA55BBD099340CE00F3E977 /* Circuit.saver */,
+ AFA55BF60993429100F3E977 /* Menger.saver */,
+ AFA55C200993431300F3E977 /* Engine.saver */,
+ AFA55C89099349A600F3E977 /* GLSnake.saver */,
+ AFA55CBB09934BB200F3E977 /* Boxed.saver */,
+ AFA55CDE09934CE400F3E977 /* GLForestFire.saver */,
+ AFA55D4E0993565300F3E977 /* SBalls.saver */,
+ AFA55D740993584B00F3E977 /* Cubenetic.saver */,
+ AFA55D91099358C400F3E977 /* Spheremonics.saver */,
+ AFA55DDA09935D7000F3E977 /* Lavalite.saver */,
+ AFA55E0309935E4900F3E977 /* Queens.saver */,
+ AFA55E1F09935EDC00F3E977 /* Endgame.saver */,
+ AFA55E4209935F8E00F3E977 /* GLBlur.saver */,
+ AFA55E6009935FF900F3E977 /* FlyingToasters.saver */,
+ AFA55EE3099360E300F3E977 /* BouncingCow.saver */,
+ AFA55F1E099361B700F3E977 /* JigglyPuff.saver */,
+ AFA55F3C0993622F00F3E977 /* Klein.saver */,
+ AFA55F540993629000F3E977 /* Hypertorus.saver */,
+ AFA55F840993643600F3E977 /* GLMatrix.saver */,
+ AFA55FE509936BFA00F3E977 /* CubeStorm.saver */,
+ AFA5600B09936C6D00F3E977 /* GLKnots.saver */,
+ AFA5602609936CC800F3E977 /* BlockTube.saver */,
+ AFA5604409936D5100F3E977 /* FlipFlop.saver */,
+ AFA5605C09936E2100F3E977 /* AntInspect.saver */,
+ AFA5607409936F3800F3E977 /* AntSpotlight.saver */,
+ AFA560C00993718D00F3E977 /* Polytopes.saver */,
+ AFA5610F0993781600F3E977 /* Molecule.saver */,
+ AFA5616A09937C0D00F3E977 /* BlinkBox.saver */,
+ AFA5618D09937CF100F3E977 /* Noof.saver */,
+ AFA561AF09937D7E00F3E977 /* Polyhedra.saver */,
+ AFA562190993849F00F3E977 /* Providence.saver */,
+ AFA562310993852500F3E977 /* Pinion.saver */,
+ AFA562D1099392C600F3E977 /* Boing.saver */,
+ AFA562EC099393C900F3E977 /* AntMaze.saver */,
+ AFA563040993943B00F3E977 /* Tangram.saver */,
+ AFA563260993951000F3E977 /* Crackberg.saver */,
+ AFA56343099395ED00F3E977 /* GLHanoi.saver */,
+ AFA56363099396C000F3E977 /* Cube21.saver */,
+ AFA5638B099397B300F3E977 /* TimeTunnel.saver */,
+ AFA563B6099398BB00F3E977 /* Juggler3D.saver */,
+ AFD56E040996A03800BA26F7 /* GLText.saver */,
+ AFD56EBE0996A72600BA26F7 /* Braid.saver */,
+ AFD56EEA0996A95700BA26F7 /* Forest.saver */,
+ AFD56F1B0996AAFA00BA26F7 /* Vines.saver */,
+ AFD56F330996AB8A00BA26F7 /* Galaxy.saver */,
+ AFD56F5F0996AEEE00BA26F7 /* Grav.saver */,
+ AFD56F7B0996B01600BA26F7 /* Hopalong.saver */,
+ AFD56F9C0996B09400BA26F7 /* Laser.saver */,
+ AFD56FB30996B10F00BA26F7 /* Lightning.saver */,
+ AFD56FC90996B18F00BA26F7 /* Lisa.saver */,
+ AFD56FDF0996B20900BA26F7 /* Lissie.saver */,
+ AFD570080996B43800BA26F7 /* Penrose.saver */,
+ AFD5701F0996B4CC00BA26F7 /* Sierpinski.saver */,
+ AFD570360996B56D00BA26F7 /* Sphere.saver */,
+ AFD570530996B61600BA26F7 /* Spiral.saver */,
+ AFD570690996B6A300BA26F7 /* FadePlot.saver */,
+ AFD5707F0996B72800BA26F7 /* Mountain.saver */,
+ AFD570950996B80300BA26F7 /* Triangle.saver */,
+ AFD570AB0996B88E00BA26F7 /* Worm.saver */,
+ AFD570C10996B93000BA26F7 /* Rotor.saver */,
+ AFD570D90996B9F800BA26F7 /* Ant.saver */,
+ AFD570FA0996BBBF00BA26F7 /* Flow.saver */,
+ AFD571230996BE9300BA26F7 /* Discrete.saver */,
+ AFD5713C0996BF2E00BA26F7 /* Apollonian.saver */,
+ AFD571530996C01700BA26F7 /* Euler2D.saver */,
+ AFD571690996C0CE00BA26F7 /* Thornbird.saver */,
+ AFD571C50996D9DC00BA26F7 /* Juggle.saver */,
+ AFD572320996E4A300BA26F7 /* Swirl.saver */,
+ AFD5727D0996EE8500BA26F7 /* Polyominoes.saver */,
+ AFD572B50996F99600BA26F7 /* Bouboule.saver */,
+ AFD572D20996FC0F00BA26F7 /* Crystal.saver */,
+ AFD57309099701C000BA26F7 /* Julia.saver */,
+ AFD5736D0997411200BA26F7 /* Strange.saver */,
+ AF794F74099748450059A8B0 /* Demon.saver */,
+ AF794F9E09974A320059A8B0 /* Fiberlamp.saver */,
+ AF794FDD09974FA60059A8B0 /* Loop.saver */,
+ AF97573D099C317000B05160 /* IMSMap.saver */,
+ AF975785099C374A00B05160 /* Moire.saver */,
+ AF9757D2099C3E6300B05160 /* RDbomb.saver */,
+ AF975818099C41D500B05160 /* XFlame.saver */,
+ AF975875099C475900B05160 /* ShadeBobs.saver */,
+ AF975A46099C681F00B05160 /* MetaBalls.saver */,
+ AF975A7C099C6AB200B05160 /* Eruption.saver */,
+ AF975A96099C6BC300B05160 /* Barcode.saver */,
+ AF975AE7099C6EB100B05160 /* Fireworkx.saver */,
+ AF975B0C099C6FE400B05160 /* MemScroller.saver */,
+ AF975C22099C8C1500B05160 /* Halo.saver */,
+ AF975C4E099C8DCF00B05160 /* Greynetic.saver */,
+ AF975C6E099C8F3F00B05160 /* NoseGuy.saver */,
+ AF975D63099CA0F000B05160 /* Rocks.saver */,
+ AF476FC6099D154F001F091E /* Interference.saver */,
+ AF476FEB099D1686001F091E /* Truchet.saver */,
+ AF47705C099D4385001F091E /* Deluxe.saver */,
+ AF477179099D4786001F091E /* Compass.saver */,
+ AF47718F099D4803001F091E /* Wander.saver */,
+ AF4771B7099D4949001F091E /* T3D.saver */,
+ AF4771EB099D4D9A001F091E /* CCurve.saver */,
+ AF477202099D4E64001F091E /* NerveRot.saver */,
+ AF477218099D4EE8001F091E /* Whirlygig.saver */,
+ AF47722E099D4F67001F091E /* Anemone.saver */,
+ AF477263099D5717001F091E /* Halftone.saver */,
+ AF47727B099D57B9001F091E /* PopSquares.saver */,
+ AF477293099D5926001F091E /* Piecewise.saver */,
+ AF477392099D65A1001F091E /* Wormhole.saver */,
+ AF4773AA099D6648001F091E /* FuzzyFlakes.saver */,
+ AF4773D1099D67B9001F091E /* Anemotaxis.saver */,
+ AF477412099D69E7001F091E /* Intermomentary.saver */,
+ AF477437099D7C70001F091E /* IFS.saver */,
+ AF477452099D7D33001F091E /* XMatrix.saver */,
+ AF477493099D89E4001F091E /* Flame.saver */,
+ AF4774A9099D8A74001F091E /* Kaleidescope.saver */,
+ AF4774C4099D8B5F001F091E /* LMorph.saver */,
+ AF4774DE099D8BFF001F091E /* Maze.saver */,
+ AF47756D099D9A1A001F091E /* Pedal.saver */,
+ AF477593099D9C28001F091E /* Pyro.saver */,
+ AF4775AF099D9CF7001F091E /* Starfish.saver */,
+ AF4775E8099D9F69001F091E /* Coral.saver */,
+ AF477602099DA030001F091E /* Epicycle.saver */,
+ AF477623099DA26C001F091E /* Kumppa.saver */,
+ AF477654099DA6D0001F091E /* Squiral.saver */,
+ AF47766A099DA78F001F091E /* Critical.saver */,
+ AF477680099DA849001F091E /* Petri.saver */,
+ AF47769F099DAA6F001F091E /* Blaster.saver */,
+ AF4776BA099DABDD001F091E /* XSpirograph.saver */,
+ AF4776D0099DAC8A001F091E /* XRaySwarm.saver */,
+ AF4776EB099DADDF001F091E /* WhirlWindWarp.saver */,
+ AF477701099DAE7A001F091E /* Vermiculate.saver */,
+ AF47771D099DAF9F001F091E /* CloudLife.saver */,
+ AF477733099DB044001F091E /* Substrate.saver */,
+ AF477762099DB61E001F091E /* Interaggregate.saver */,
+ AF477784099DB965001F091E /* Celtic.saver */,
+ AF4777A0099DBA90001F091E /* FluidBalls.saver */,
+ AF4777E1099DC183001F091E /* BoxFit.saver */,
+ AF4778BB099DDB79001F091E /* Penetrate.saver */,
+ AF4778D7099DDCAE001F091E /* XJack.saver */,
+ AF4778F8099DDDC8001F091E /* Cynosure.saver */,
+ AF477919099DE379001F091E /* Flag.saver */,
+ AF47793A099DE4C7001F091E /* Slip.saver */,
+ AF642405099FF9C2000F4CD4 /* Extrusion.saver */,
+ AF6425DC09A18856000F4CD4 /* HyperCube.saver */,
+ AF6425FC09A189EC000F4CD4 /* Qix.saver */,
+ AF64261F09A18D6C000F4CD4 /* HyperBall.saver */,
+ AF64263C09A18F54000F4CD4 /* Moire2.saver */,
+ AF64265F09A19229000F4CD4 /* Munch.saver */,
+ AF64268B09A194B0000F4CD4 /* Goop.saver */,
+ AF64278109A1D37A000F4CD4 /* SpeedMine.saver */,
+ AF6427B809A2DE36000F4CD4 /* Bubbles.saver */,
+ AF9D467609B5109C006E59CF /* DecayScreen.saver */,
+ AF9D475409B5300A006E59CF /* SlideScreen.saver */,
+ AF9D476F09B53166006E59CF /* Zoom.saver */,
+ AF9D48EB09B53322006E59CF /* Bumps.saver */,
+ AF9D490409B535DA006E59CF /* Distort.saver */,
+ AF9D493B09B53CBA006E59CF /* Ripples.saver */,
+ AF9D496409B53FC9006E59CF /* RotZoomer.saver */,
+ AF9D497C09B5411D006E59CF /* Twang.saver */,
+ AF9D49A709B544C3006E59CF /* Spotlight.saver */,
+ AF9D4C7909B59F27006E59CF /* XLyap.saver */,
+ AF9D4CF709B5AA8E006E59CF /* Pong.saver */,
+ AF9D4D8F09B5B2DC006E59CF /* XAnalogTV.saver */,
+ AF9D4DC009B5B71E006E59CF /* BSOD.saver */,
+ AF9D4DFE09B5BB19006E59CF /* Apple2.saver */,
+ AF7776F609B63ABF00EA3033 /* Phosphor.saver */,
+ AF77772A09B6416100EA3033 /* Pacman.saver */,
+ AF77775109B6446500EA3033 /* FlipScreen3D.saver */,
+ AF7777A209B64A5200EA3033 /* MirrorBlob.saver */,
+ AF7777E409B64C6B00EA3033 /* GLSlideshow.saver */,
+ AF7777FE09B64E3100EA3033 /* FlipText.saver */,
+ AF77785809B6528100EA3033 /* Carousel.saver */,
+ AF77787409B6536000EA3033 /* DNAlogo.saver */,
+ AF7778B509B659C800EA3033 /* BlitSpin.saver */,
+ AF34085409B80AAF00F2CEC1 /* StarWars.saver */,
+ AF34085509B80AB000F2CEC1 /* StonerView.saver */,
+ AF34085609B80AB000F2CEC1 /* Gleidescope.saver */,
+ AF34085709B80AB000F2CEC1 /* FontGlide.saver */,
+ AF998EEE0A083DB30051049D /* TopBlock.saver */,
+ AF48DF030A0C25E000F94CF9 /* GLSchool.saver */,
+ AFA339400B058505002B0E7D /* WebCollage.saver */,
+ AFA33BC70B058740002B0E7D /* webcollage-helper */,
+ AFF463470C4403E400EE6509 /* CWaves.saver */,
+ AFF4636C0C440AEF00EE6509 /* GLCells.saver */,
+ AF0DC7BD0C4C73F600D76972 /* m6502.saver */,
+ AF0DCA560C4CBB0D00D76972 /* Voronoi.saver */,
+ AFE6A1970CDD7B2E002805BF /* MoebiusGears.saver */,
+ AFE6A42D0CDD7FAA002805BF /* Abstractile.saver */,
+ AF4FD6FA0CE7A486005EE58E /* Lockward.saver */,
+ AF4FF4CE0D52CBDE00666F98 /* CubicGrid.saver */,
+ AF3C71590D624BF50030CC0D /* Hypnowheel.saver */,
+ AF1A17730D6D6EE3008AF328 /* LCDscrub.saver */,
+ AFE2A46A0E2E904600ADB298 /* SkyTentacles.saver */,
+ AFE30BFC0E52B14700CCF4A5 /* Sonar.saver */,
+ AF35E8A00E63823600691F2F /* Jigsaw.saver */,
+ AFD51B300F063B4A00471C02 /* Photopile.saver */,
+ AF32D9F40F3AD0B40080F535 /* RubikBlocks.saver */,
+ AF4A345D102A593600A81B2A /* Surfaces.saver */,
+ AF78D189142DD8F3002AAF77 /* Hilbert.saver */,
+ AF3581D51431D47B00E09C51 /* CompanionCube.saver */,
+ AF358216143330F900E09C51 /* TronBit.saver */,
+ AF91898F158FC00A002B5D1E /* XScreenSaver.app */,
+ AF7511121782B5B900380EA1 /* Kaleidocycle.saver */,
+ AFF2869217860E830050A578 /* QuasiCrystal.saver */,
+ AFBFE75E178642DC00432B21 /* Apple2.app */,
+ AFBFE77E178647FE00432B21 /* Phosphor.app */,
+ AFDA65A1178A52B70070D24B /* UnknownPleasures.saver */,
+ AFB591BA178B812C00EA4005 /* Hexadrop.saver */,
+ AFF3C9FB17CCAC440028F240 /* Geodesic.saver */,
+ AF1AD9E218500F9F00932759 /* XScreenSaverUpdater.app */,
+ AF9E7EBF190F4C1B00A8B01F /* enable_gc */,
+ AFFAB32919158CE40020F021 /* ProjectivePlane.saver */,
+ AF68A49219196CF800D41CD1 /* Tessellimage.saver */,
+ AF39E296198A11F60064A58D /* WindupRobot.saver */,
+ AF7ACFD419FF0A9200BD752B /* GeodesicGears.saver */,
+ AF73FF361A09877F00E485E9 /* BinaryRing.saver */,
+ AF5C9B0D1A0CCE6E00B0147A /* Cityflow.saver */,
+ AF63A8061AB4EDDB00593C75 /* RomanBoy.saver */,
+ AFCF83501AF5B515008BB7E1 /* SplitFlap.saver */,
+ CE3D01661B76F4C100993C75 /* TestX11.saver */,
+ AF63F44E1C3465BE0033E133 /* Apple2.app */,
+ AF63F4741C34682A0033E133 /* Phosphor.app */,
+ AF63F49A1C3469FC0033E133 /* TestX11.app */,
+ AFEC23E21CB6EAE100DE138F /* DymaxionMap.saver */,
+ AF46E9E41CBBA2B300240FBC /* Unicrud.saver */,
+ AFACE8881CC83458008B24CD /* EnergyStream.saver */,
+ AFA211A11CD59DAF00C0D2A1 /* RaverHoop.saver */,
+ AFC0E8C01CDC601A008CAFAC /* Hydrostat.saver */,
+ AF39382F1D0FBD6A00205406 /* Discoball.saver */,
+ AFEE10621D13406000AAC8F7 /* CubeTwist.saver */,
+ AFEE10811D15EB0800AAC8F7 /* CubeStack.saver */,
+ AFEE10A01D17E20B00AAC8F7 /* Splodesic.saver */,
+ AF1B0FBC1D7AB4740011DBE4 /* Hexstrut.saver */,
+ AF633C161EE0BA6F00AB33BD /* Vigilance.saver */,
+ AF2107861FD23BDE00B61EA9 /* Esper.saver */,
+ AF41E967201D49DD0098E253 /* RazzleDazzle.saver */,
+ AF3EC98D2035154C00180A35 /* Peepers.saver */,
+ AFC5CFEB2044AA23004CEB5E /* Crumbler.saver */,
+ AFAAE39C207D6343007A515C /* Maze3D.saver */,
+ AFA6AB0520999950006D2685 /* GlitchPEG.saver */,
+ AFD77E7020C23F8600A3638D /* FilmLeader.saver */,
+ AF5ECEC02116B1A400069433 /* VFeedback.saver */,
+ );
+ name = Products;
+ path = ..;
+ sourceTree = "<group>";
+ };
+ 29B97314FDCFA39411CA2CEA /* xscreensaver */ = {
+ isa = PBXGroup;
+ children = (
+ AF480AB9098C66E200FB32B8 /* SaverRunner */,
+ 080E96DDFE201D6D7F000001 /* libjwxyz */,
+ AF1AD9E818500FA000932759 /* Updater */,
+ AFE1FD520981E35400F7970E /* Utils */,
+ AFE1FD610981E3E700F7970E /* Hacks */,
+ AFC258670988A468000655EE /* config */,
+ 29B97317FDCFA39411CA2CEA /* Resources */,
+ 29B97323FDCFA39411CA2CEA /* Frameworks */,
+ 19C28FACFE9D520D11CA2CBB /* Products */,
+ );
+ name = xscreensaver;
+ sourceTree = "<group>";
+ };
+ 29B97317FDCFA39411CA2CEA /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */,
+ AF14EE300E3CEF1A004CBBD2 /* XScreenSaver.icns */,
+ AF9772E10989DFC6001F8B92 /* SaverRunner.nib */,
+ AF56019B157DAA3D00DB2055 /* iSaverRunner.xib */,
+ 55EDCB3C1AD498A800251909 /* LaunchScreen.xib */,
+ 550FB5FD1AD64424001A4FA5 /* Media-iOS.xcassets */,
+ AF2D522513E954A0002AA818 /* SaverRunner.icns */,
+ AF73FF201A08AB9400E485E9 /* iSaverRunner57t.png */,
+ AF9771D90989DC4A001F8B92 /* SaverRunner.plist */,
+ AF01294C157D31DD00C396E1 /* iSaverRunner.plist */,
+ AF94E7411A16E93600289B93 /* xscreensaver.xcconfig */,
+ 8D1107310486CEB800E47090 /* XScreenSaver.plist */,
+ AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */,
+ AF0FAF0B09CA6FF900EE1051 /* xscreensaver-text */,
+ AFEC68361BD6CA85004C1B64 /* OCRAStd.otf */,
+ AFEC68381BD6CDF9004C1B64 /* YearlReg.ttf */,
+ AFC43E731C68364B00C89999 /* PxPlus_IBM_VGA8.ttf */,
+ AF939AD42038C0040032DD23 /* luximr.ttf */,
+ AF142BAC1EE75DBF0005C0A8 /* settings.png */,
+ 557BF07A1EE90C8B00846DCE /* settings@2x.png */,
+ 557BF07B1EE90C8B00846DCE /* settings@3x.png */,
+ AF142BAD1EE75DBF0005C0A8 /* stop.png */,
+ 557BF07C1EE90C8B00846DCE /* stop@2x.png */,
+ 557BF07D1EE90C8B00846DCE /* stop@3x.png */,
+ );
+ name = Resources;
+ sourceTree = "<group>";
+ };
+ 29B97323FDCFA39411CA2CEA /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ AF142BB01EFEFBA20005C0A8 /* Photos.framework */,
+ AF1ADA171850180E00932759 /* Sparkle.framework */,
+ AF78377C17DBA85D003B9FC0 /* libz.dylib */,
+ AF78369617DB9F25003B9FC0 /* libz.dylib */,
+ AFEB9C3E1590056A003974F3 /* CoreGraphics.framework */,
+ AFEB9C3F1590056A003974F3 /* QuartzCore.framework */,
+ AF1AD9E718500FA000932759 /* Foundation.framework */,
+ AFEB9C3C15900558003974F3 /* Foundation.framework */,
+ AFEB9C3A1590054B003974F3 /* OpenGLES.framework */,
+ AFEB9C3815900514003974F3 /* UIKit.framework */,
+ AF1AD9E618500FA000932759 /* CoreData.framework */,
+ AF1AD9E518500F9F00932759 /* AppKit.framework */,
+ AF0F46DC104E1809000A929C /* AppKit.framework */,
+ AF976ED30989BF59001F8B92 /* ScreenSaver.framework */,
+ AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */,
+ AF561DF715969C5B007CA5ED /* AssetsLibrary.framework */,
+ AF561DF3159651A7007CA5ED /* AudioToolbox.framework */,
+ AF0FAF3B159BAC7B00BCE2F7 /* CoreText.framework */,
+ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,
+ AF480DF1098F528500FB32B8 /* OpenGL.framework */,
+ CEE0BC611A6B0D6200C098BF /* OpenGL.framework */,
+ AF480FE70990375900FB32B8 /* AGL.framework */,
+ AF84FD4109B1209E00F3AB06 /* GLUT.framework */,
+ AF48112B0990A2C700FB32B8 /* Carbon.framework */,
+ AF1ADA0118500FA100932759 /* XCTest.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ AF1AD9E818500FA000932759 /* Updater */ = {
+ isa = PBXGroup;
+ children = (
+ AF3633F918530DD90086A439 /* sparkle_dsa_pub.pem */,
+ AF3633FA18530DD90086A439 /* Updater.h */,
+ AF3633FB18530DD90086A439 /* Updater.m */,
+ AF3633FE18530DFF0086A439 /* Updater.plist */,
+ AF1ADA151850157400932759 /* Updater.xib */,
+ );
+ name = Updater;
+ sourceTree = "<group>";
+ };
+ AF480AB9098C66E200FB32B8 /* SaverRunner */ = {
+ isa = PBXGroup;
+ children = (
+ 29B97316FDCFA39411CA2CEA /* main.m */,
+ CEAF85661ABE4A70008F104C /* SaverListController.h */,
+ AF84AF1E15829AF000607E4C /* SaverListController.m */,
+ AFE1FD3F0981E32E00F7970E /* SaverRunner.h */,
+ AFE1FD400981E32E00F7970E /* SaverRunner.m */,
+ AFAA6B441773F07700DE720C /* ios-function-table.m */,
+ );
+ name = SaverRunner;
+ sourceTree = "<group>";
+ };
+ AF480DC7098F4EB500FB32B8 /* XScreenSaver */ = {
+ isa = PBXGroup;
+ children = (
+ AFE6A4340CDD800F002805BF /* abstractile.c */,
+ AF9D4CFA09B5AC94006E59CF /* analogtv.c */,
+ AF9D4CFB09B5AC94006E59CF /* analogtv.h */,
+ AF477231099D4FD5001F091E /* anemone.c */,
+ AF4773D4099D6817001F091E /* anemotaxis.c */,
+ AF9D4E0509B5BC9D006E59CF /* apple2-main.c */,
+ AF9D4DD309B5B990006E59CF /* apple2.c */,
+ AF0DCA320C4C74A200D76972 /* asm6502.c */,
+ AF0DCA330C4C74A200D76972 /* asm6502.h */,
+ AF976DFA09896BEB001F8B92 /* attraction.c */,
+ AF975A99099C6C3500B05160 /* barcode.c */,
+ AF73FF381A09889700E485E9 /* binaryring.c */,
+ AF4776A2099DAADE001F091E /* blaster.c */,
+ AF7778BA09B65A8A00EA3033 /* blitspin.c */,
+ AF4778A3099DDA91001F091E /* boxfit.c */,
+ AF9D4DC309B5B87D006E59CF /* bsod.c */,
+ AF6427BB09A2DF47000F4CD4 /* bubbles-default.c */,
+ AF6427BC09A2DF47000F4CD4 /* bubbles.c */,
+ AF6427BD09A2DF47000F4CD4 /* bubbles.h */,
+ AF9D48EE09B533AE006E59CF /* bumps.c */,
+ AF4771EF099D4DFE001F091E /* ccurve.c */,
+ AF477787099DBA29001F091E /* celtic.c */,
+ AF477720099DB01C001F091E /* cloudlife.c */,
+ AF47717C099D47D3001F091E /* compass.c */,
+ AF4775EF099D9FFF001F091E /* coral.c */,
+ AF47766D099DA80D001F091E /* critical.c */,
+ AFF463490C44044E00EE6509 /* cwaves.c */,
+ AF4778FB099DDE79001F091E /* cynosure.c */,
+ AF9D467809B5110B006E59CF /* decayscreen.c */,
+ AFC25B5E0988BA63000655EE /* deco.c */,
+ AF68A49619196E3E00D41CD1 /* delaunay.c */,
+ AF477145099D43E2001F091E /* deluxe.c */,
+ AF9D490709B536F7006E59CF /* distort.c */,
+ AF477605099DA097001F091E /* epicycle.c */,
+ AF975A83099C6B4900B05160 /* eruption.c */,
+ AFD77E7220C2417F00A3638D /* filmleader.c */,
+ AF975AEE099C6F1700B05160 /* fireworkx.c */,
+ AF477496099D8A53001F091E /* flame.c */,
+ AF4777A4099DBB11001F091E /* fluidballs.c */,
+ AF77789209B656C300EA3033 /* fontglide.c */,
+ AFBF893C0E41D930006A2D66 /* fps.c */,
+ AFBF893D0E41D930006A2D66 /* fps.h */,
+ AFBF89B10E424036006A2D66 /* fpsI.h */,
+ AF4773B4099D6778001F091E /* fuzzyflakes.c */,
+ AFA6AB0E20999A7B006D2685 /* glitchpeg.c */,
+ AF64268E09A19542000F4CD4 /* goop.c */,
+ AF480C21098E28EF00FB32B8 /* greynetic.c */,
+ AF477266099D5768001F091E /* halftone.c */,
+ AF480C29098E295D00FB32B8 /* halo.c */,
+ AF480C2F098E2A6700FB32B8 /* helix.c */,
+ AFB591BD178B81E600EA4005 /* hexadrop.c */,
+ AF64262209A18E1E000F4CD4 /* hyperball.c */,
+ AF6425DF09A188FB000F4CD4 /* hypercube.c */,
+ AF47743A099D7CEA001F091E /* ifs.c */,
+ AF975740099C31DD00B05160 /* imsmap.c */,
+ AF477769099DB710001F091E /* interaggregate.c */,
+ AF476FD0099D15AA001F091E /* interference.c */,
+ AF47741C099D6A6C001F091E /* intermomentary.c */,
+ AF4774AC099D8B08001F091E /* kaleidescope.c */,
+ AF47762A099DA2E9001F091E /* kumppa.c */,
+ AF1A177E0D6D6F3E008AF328 /* lcdscrub.c */,
+ AF4774CB099D8BC2001F091E /* lmorph.c */,
+ AF0DCA340C4C74A200D76972 /* m6502.c */,
+ AF4774E1099D8C8B001F091E /* maze.c */,
+ AF975B14099C709E00B05160 /* memscroller.c */,
+ AF975A49099C689F00B05160 /* metaballs.c */,
+ AF975789099C37A500B05160 /* moire.c */,
+ AF64263F09A18FEB000F4CD4 /* moire2.c */,
+ AF64266209A192C5000F4CD4 /* munch.c */,
+ AF477205099D4EB6001F091E /* nerverot.c */,
+ AF975C76099C8FC700B05160 /* noseguy.c */,
+ AF477570099D9A8A001F091E /* pedal.c */,
+ AF4778BE099DDC32001F091E /* penetrate.c */,
+ AF477683099DA8C7001F091E /* petri.c */,
+ AF77770309B63B5F00EA3033 /* phosphor.c */,
+ AF477297099D5980001F091E /* piecewise.c */,
+ AF9D4CFC09B5AC94006E59CF /* pong.c */,
+ AF47727E099D5808001F091E /* popsquares.c */,
+ AF47759C099D9CA3001F091E /* pyro.c */,
+ AF6425FF09A18A94000F4CD4 /* qix.c */,
+ AF9757D5099C3EB800B05160 /* rd-bomb.c */,
+ AF9D493E09B53D55006E59CF /* ripples.c */,
+ AF975D66099CA16A00B05160 /* rocks.c */,
+ AFE1FD620981E40800F7970E /* rorschach.c */,
+ AF9D496709B540A4006E59CF /* rotzoomer.c */,
+ AF97587A099C492000B05160 /* shadebobs.c */,
+ AF9D475809B53091006E59CF /* slidescreen.c */,
+ AF64278709A1D433000F4CD4 /* speedmine.c */,
+ AF9D49AA09B54596006E59CF /* spotlight.c */,
+ AF477657099DA75D001F091E /* squiral.c */,
+ AF4775B3099D9D67001F091E /* starfish.c */,
+ AF477736099DB104001F091E /* substrate.c */,
+ AF4771BA099D4997001F091E /* t3d.c */,
+ AF68A49519196E3E00D41CD1 /* tessellimage.c */,
+ CE3D016A1B76F8E200993C75 /* testx11.c */,
+ AF35821B1433314C00E09C51 /* tronbit.c */,
+ AF3582171433314C00E09C51 /* tronbit_idle1.c */,
+ AF3582181433314C00E09C51 /* tronbit_idle2.c */,
+ AF3582191433314C00E09C51 /* tronbit_no.c */,
+ AF35821A1433314C00E09C51 /* tronbit_yes.c */,
+ AF476FF0099D1713001F091E /* truchet.c */,
+ AF9D497F09B541E5006E59CF /* twang.c */,
+ AF477704099DAF3F001F091E /* vermiculate.c */,
+ AF5ECEC22116B2CC00069433 /* vfeedback.c */,
+ AF477192099D4864001F091E /* wander.c */,
+ AFA33C0A0B058E6B002B0E7D /* webcollage */,
+ AFA33BAE0B0585F7002B0E7D /* webcollage-cocoa.m */,
+ AF4776EE099DAE58001F091E /* whirlwindwarp.c */,
+ AF47721B099D4F47001F091E /* whirlygig.c */,
+ AF477395099D65FE001F091E /* wormhole.c */,
+ AF9D4D9209B5B444006E59CF /* xanalogtv.c */,
+ AF97582F099C427500B05160 /* xflame.c */,
+ AF4778DA099DDD2B001F091E /* xjack.c */,
+ AF9D4C7C09B5A044006E59CF /* xlyap.c */,
+ AF477455099D7D8A001F091E /* xmatrix.c */,
+ AF4776D3099DACEB001F091E /* xrayswarm.c */,
+ AF4776BD099DAC46001F091E /* xspirograph.c */,
+ AF9D48D409B53229006E59CF /* zoom.c */,
+ );
+ name = XScreenSaver;
+ sourceTree = "<group>";
+ };
+ AF480DCF098F4F0600FB32B8 /* Xlockmore */ = {
+ isa = PBXGroup;
+ children = (
+ AFD570DE0996BA5C00BA26F7 /* ant.c */,
+ AFD5713F0996BFBE00BA26F7 /* apollonian.c */,
+ AF7778BC09B65B1800EA3033 /* automata.h */,
+ AFD572B90996FB3D00BA26F7 /* bouboule.c */,
+ AFD56EC10996A76F00BA26F7 /* braid.c */,
+ AFD572ED0997006E00BA26F7 /* crystal.c */,
+ AF794F7E099748860059A8B0 /* demon.c */,
+ AFD571280996BEF700BA26F7 /* discrete.c */,
+ AF480C82098E336D00FB32B8 /* drift.c */,
+ AFD571560996C07F00BA26F7 /* euler2d.c */,
+ AFD5706C0996B70000BA26F7 /* fadeplot.c */,
+ AF794FA909974AE30059A8B0 /* fiberlamp.c */,
+ AF47791C099DE3F1001F091E /* flag.c */,
+ AFD571010996BC3800BA26F7 /* flow.c */,
+ AFD56EED0996A99E00BA26F7 /* forest.c */,
+ AFD56F360996ABD200BA26F7 /* galaxy.c */,
+ AFD56F620996AF2D00BA26F7 /* grav.c */,
+ AFD56F880996B06600BA26F7 /* hopalong.c */,
+ AFD571C80996DA4600BA26F7 /* juggle.c */,
+ AFD5730C099702C800BA26F7 /* julia.c */,
+ AFD56FA00996B0E500BA26F7 /* laser.c */,
+ AFD56FB60996B16300BA26F7 /* lightning.c */,
+ AFD56FCC0996B1D600BA26F7 /* lisa.c */,
+ AFD56FE20996B26200BA26F7 /* lissie.c */,
+ AF794FE009974FEC0059A8B0 /* loop.c */,
+ AFD570820996B79300BA26F7 /* mountain.c */,
+ AF795015099751940059A8B0 /* pacman.c */,
+ AF795016099751940059A8B0 /* pacman.h */,
+ AF795011099751940059A8B0 /* pacman_ai.c */,
+ AF795012099751940059A8B0 /* pacman_ai.h */,
+ AF795013099751940059A8B0 /* pacman_level.c */,
+ AF795014099751940059A8B0 /* pacman_level.h */,
+ AFD5700C0996B49D00BA26F7 /* penrose.c */,
+ AFD572800996EF2B00BA26F7 /* polyominoes.c */,
+ AFD570C40996B98500BA26F7 /* rotor.c */,
+ AFD570220996B52700BA26F7 /* sierpinski.c */,
+ AF47793D099DE56A001F091E /* slip.c */,
+ AFD5703B0996B5E300BA26F7 /* sphere.c */,
+ AFD570560996B67600BA26F7 /* spiral.c */,
+ AFD57371099741A200BA26F7 /* strange.c */,
+ AFD572350996E53E00BA26F7 /* swirl.c */,
+ AFD5716B0996C16700BA26F7 /* thornbird.c */,
+ AFD570980996B86200BA26F7 /* triangle.c */,
+ AFD56F1F0996AB5A00BA26F7 /* vines.c */,
+ AFD570AE0996B8EF00BA26F7 /* worm.c */,
+ );
+ name = Xlockmore;
+ sourceTree = "<group>";
+ };
+ AF480DD0098F4F2000FB32B8 /* OpenGL */ = {
+ isa = PBXGroup;
+ children = (
+ AFA5605F09936E9C00F3E977 /* antinspect.c */,
+ AFA562EF0993941600F3E977 /* antmaze.c */,
+ AFA5607709936FDD00F3E977 /* ants.h */,
+ AFA5607809936FDD00F3E977 /* antspotlight.c */,
+ AF0839A909930C4900277BE9 /* atlantis.c */,
+ AF7778BD09B65B3F00EA3033 /* atlantis.h */,
+ AF083A31099311CE00277BE9 /* atunnel.c */,
+ AFA55AF409933DBF00F3E977 /* b_draw.c */,
+ AFA55AF509933DBF00F3E977 /* b_lockglue.c */,
+ AFA55AF609933DBF00F3E977 /* b_sphere.c */,
+ AFA5616D09937C9A00F3E977 /* blinkbox.c */,
+ AFA5602909936D0700F3E977 /* blocktube.c */,
+ AFA562D40993930C00F3E977 /* boing.c */,
+ AFA55EE70993613E00F3E977 /* bouncingcow.c */,
+ AFA55CBE09934C0900F3E977 /* boxed.c */,
+ AFA55CBF09934C0900F3E977 /* boxed.h */,
+ AFA55AE409933D3800F3E977 /* bubble3d.c */,
+ AFA55AE809933D5900F3E977 /* bubble3d.h */,
+ AF4812760990CF5D00FB32B8 /* buildlwo.c */,
+ AF4812770990CF5D00FB32B8 /* buildlwo.h */,
+ AFA5595D0993310500F3E977 /* cage.c */,
+ AF77785E09B6530E00EA3033 /* carousel.c */,
+ AFA55E2209935F2B00F3E977 /* chessgames.h */,
+ AFA55E2309935F2B00F3E977 /* chessmodels.c */,
+ AFA55E2409935F2B00F3E977 /* chessmodels.h */,
+ AFA55BC00993416E00F3E977 /* circuit.c */,
+ AF5C9B101A0CCF4E00B0147A /* cityflow.c */,
+ AF3581D91431D5FC00E09C51 /* companion.c */,
+ AF3581D61431D5FC00E09C51 /* companion_disc.c */,
+ AF3581D71431D5FC00E09C51 /* companion_heart.c */,
+ AF3581D81431D5FC00E09C51 /* companion_quad.c */,
+ AFA55EE80993613E00F3E977 /* cow_face.c */,
+ AFA55EE90993613E00F3E977 /* cow_hide.c */,
+ AFA55EEA0993613E00F3E977 /* cow_hoofs.c */,
+ AFA55EEB0993613E00F3E977 /* cow_horns.c */,
+ AFA55EEC0993613E00F3E977 /* cow_tail.c */,
+ AFA55EED0993613E00F3E977 /* cow_udder.c */,
+ AFA563290993957100F3E977 /* crackberg.c */,
+ AFC5CFEE2044AB03004CEB5E /* crumbler.c */,
+ AFA563660993970F00F3E977 /* cube21.c */,
+ AFA55D770993589300F3E977 /* cubenetic.c */,
+ AFEE10831D15EBA600AAC8F7 /* cubestack.c */,
+ AFA55FF309936C4500F3E977 /* cubestorm.c */,
+ AFEE10641D1341E300AAC8F7 /* cubetwist.c */,
+ AF4FF4D00D52CC8400666F98 /* cubicgrid.c */,
+ AF480DD1098F4F6200FB32B8 /* dangerball.c */,
+ AF3938311D0FBEC800205406 /* discoball.c */,
+ AF77787609B653DC00EA3033 /* dnalogo.c */,
+ AF0839AA09930C4900277BE9 /* dolphin.c */,
+ AF241F81107C38DF00046A84 /* dropshadow.c */,
+ AF241F82107C38DF00046A84 /* dropshadow.h */,
+ AFEC23E41CB6EBC400DE138F /* dymaxionmap.c */,
+ AF4C300D208569A900BE1DEF /* dymaxionmap-coords.c */,
+ AF7778C109B65C6A00EA3033 /* e_textures.h */,
+ AFA55E2509935F2B00F3E977 /* endgame.c */,
+ AFACE88A1CC83578008B24CD /* energystream.c */,
+ AFA55C230993435300F3E977 /* engine.c */,
+ AF21078B1FD23D5000B61EA9 /* esper.c */,
+ AF642409099FFAF0000F4CD4 /* extrusion-helix2.c */,
+ AF64240A099FFAF0000F4CD4 /* extrusion-helix3.c */,
+ AF64240B099FFAF0000F4CD4 /* extrusion-helix4.c */,
+ AF64240C099FFAF0000F4CD4 /* extrusion-joinoffset.c */,
+ AF64240D099FFAF0000F4CD4 /* extrusion-screw.c */,
+ AF64240E099FFAF0000F4CD4 /* extrusion-taper.c */,
+ AF64240F099FFAF1000F4CD4 /* extrusion-twistoid.c */,
+ AF642410099FFAF1000F4CD4 /* extrusion.c */,
+ AF642411099FFAF1000F4CD4 /* extrusion.h */,
+ AFA5604709936DCC00F3E977 /* flipflop.c */,
+ AF77775409B644FF00EA3033 /* flipscreen3d.c */,
+ AF77780109B64EC000EA3033 /* fliptext.c */,
+ AFA55E980993608800F3E977 /* flyingtoasters.c */,
+ AFBF89AE0E423FC3006A2D66 /* fps-gl.c */,
+ AF4812250990CB8C00FB32B8 /* gears.c */,
+ AFF3CA0217CCAEB70028F240 /* geodesic.c */,
+ AF7ACFD619FF0B7A00BD752B /* geodesicgears.c */,
+ AFA55BA60993401A00F3E977 /* gflux.c */,
+ AFA55E4509935FD300F3E977 /* glblur.c */,
+ AFF463710C440B9200EE6509 /* glcells.c */,
+ AF77778B09B64A2A00EA3033 /* gleidescope.c */,
+ AFA55CE109934D2E00F3E977 /* glforestfire.c */,
+ AFA563460993963400F3E977 /* glhanoi.c */,
+ AFA5600E09936CB300F3E977 /* glknots.c */,
+ AFA55F870993648500F3E977 /* glmatrix.c */,
+ AFA55B2109933E4A00F3E977 /* glplanet.c */,
+ AF48E1660A0C268500F94CF9 /* glschool.c */,
+ AF48E1670A0C268500F94CF9 /* glschool.h */,
+ AF48E1620A0C268400F94CF9 /* glschool_alg.c */,
+ AF48E1630A0C268500F94CF9 /* glschool_alg.h */,
+ AF48E1640A0C268500F94CF9 /* glschool_gl.c */,
+ AF48E1650A0C268500F94CF9 /* glschool_gl.h */,
+ AF7777E709B64CF700EA3033 /* glslideshow.c */,
+ AFA55C8C099349EE00F3E977 /* glsnake.c */,
+ AFD56E080996A07A00BA26F7 /* gltext.c */,
+ AF1B0FBE1D7AB5210011DBE4 /* hexstrut.c */,
+ AF78D18A142DD96E002AAF77 /* hilbert.c */,
+ AFC0E8C21CDC60A9008CAFAC /* hydrostat.c */,
+ AFA55F59099362DF00F3E977 /* hypertorus.c */,
+ AF3C715D0D624C600030CC0D /* hypnowheel.c */,
+ AFE6A16A0CDD78EA002805BF /* involute.c */,
+ AFE6A16B0CDD78EA002805BF /* involute.h */,
+ AF35EB250E6382BA00691F2F /* jigsaw.c */,
+ AFA55F210993620200F3E977 /* jigglypuff.c */,
+ AFA563B90993991300F3E977 /* juggler3d.c */,
+ AF7511141782B64300380EA1 /* kaleidocycle.c */,
+ AFA55F3F0993626E00F3E977 /* klein.c */,
+ AFA55A8E0993369100F3E977 /* lament.c */,
+ AFF1BA0E19A96D8B0016A88D /* lament_model.c */,
+ AFA55DDD09935DB600F3E977 /* lavalite.c */,
+ AF4FD7000CE7A577005EE58E /* lockward.c */,
+ AFA55DE109935DFB00F3E977 /* marching.c */,
+ AFA55DE209935DFB00F3E977 /* marching.h */,
+ AFAAE39E207D6420007A515C /* maze3d.c */,
+ AFA55BF9099342D500F3E977 /* menger.c */,
+ AF7777A509B64AFC00EA3033 /* mirrorblob.c */,
+ AFA55982099331C300F3E977 /* moebius.c */,
+ AFE6A40B0CDD7BC3002805BF /* moebiusgears.c */,
+ AFA561120993786800F3E977 /* molecule.c */,
+ AF7778BE09B65BA300EA3033 /* molecules.sh */,
+ AFA559CC099332E800F3E977 /* morph3d.c */,
+ AFA5619009937D3600F3E977 /* noof.c */,
+ AF3EC992203517CC00180A35 /* peepers.c */,
+ AFD51DB60F063BCE00471C02 /* photopile.c */,
+ AFA562340993856A00F3E977 /* pinion.c */,
+ AF4812780990CF5D00FB32B8 /* pipeobjs.c */,
+ AF4812790990CF5D00FB32B8 /* pipes.c */,
+ AFA561B209937DCB00F3E977 /* polyhedra-gl.c */,
+ AFA561B309937DCC00F3E977 /* polyhedra.c */,
+ AFA561B409937DCC00F3E977 /* polyhedra.h */,
+ AFA560C3099371D500F3E977 /* polytopes.c */,
+ AFFAB33119158EA80020F021 /* projectiveplane.c */,
+ AFA5621C099384F600F3E977 /* providence.c */,
+ AFA55B3F09933EC600F3E977 /* pulsar.c */,
+ AFF28695178611720050A578 /* quasicrystal.c */,
+ AFA55E0609935EB800F3E977 /* queens.c */,
+ AFC5CFED2044AB03004CEB5E /* quickhull.c */,
+ AF41E969201D4B6B0098E253 /* razzledazzle.c */,
+ AFA211A31CD59FD800C0D2A1 /* raverhoop.c */,
+ AFBE743F19A7C6930018AA35 /* robot.c */,
+ AF39E2A0198A13F50064A58D /* robot-wireframe.c */,
+ AF63A8091AB4EF5D00593C75 /* romanboy.c */,
+ AFA559EA0993335C00F3E977 /* rubik.c */,
+ AF32D9FA0F3AD1200080F535 /* rubikblocks.c */,
+ AFA55A400993351F00F3E977 /* s1_1.c */,
+ AFA55A410993351F00F3E977 /* s1_2.c */,
+ AFA55A420993351F00F3E977 /* s1_3.c */,
+ AFA55A430993351F00F3E977 /* s1_4.c */,
+ AFA55A440993351F00F3E977 /* s1_5.c */,
+ AFA55A450993351F00F3E977 /* s1_6.c */,
+ AFA55A460993351F00F3E977 /* s1_b.c */,
+ AFA55D510993569C00F3E977 /* sballs.c */,
+ AF0839AB09930C4900277BE9 /* shark.c */,
+ AFD9D5BD201E686A0070E99D /* ships.c */,
+ AFA55B8E09933FBF00F3E977 /* sierpinski3d.c */,
+ AFE2A4720E2E90E300ADB298 /* skytentacles.c */,
+ AFE30BFF0E52B1DC00CCF4A5 /* sonar-icmp.c */,
+ AFE30C000E52B1DC00CCF4A5 /* sonar-sim.c */,
+ AFE30C010E52B1DC00CCF4A5 /* sonar.c */,
+ AFA55D940993590F00F3E977 /* spheremonics.c */,
+ AFCF83541AF5B5FD008BB7E1 /* splitflap.c */,
+ AFCF83531AF5B5FD008BB7E1 /* splitflap_obj.c */,
+ AFEE10A21D17E2B300AAC8F7 /* splodesic.c */,
+ AFA55A470993351F00F3E977 /* sproingies.c */,
+ AF7778C009B65C0F00EA3033 /* sproingies.h */,
+ AFA55A480993351F00F3E977 /* sproingiewrap.c */,
+ AFA55A1A0993345900F3E977 /* stairs.c */,
+ AF77782809B650FF00EA3033 /* starwars.c */,
+ AF77782909B650FF00EA3033 /* starwars.txt */,
+ AF7777BF09B64BD400EA3033 /* stonerview-move.c */,
+ AF7777C009B64BD400EA3033 /* stonerview-move.h */,
+ AF7777C109B64BD400EA3033 /* stonerview-osc.c */,
+ AF7777C209B64BD400EA3033 /* stonerview-osc.h */,
+ AF7777C309B64BD400EA3033 /* stonerview-view.c */,
+ AF7777C409B64BD400EA3033 /* stonerview.c */,
+ AF7777C509B64BD400EA3033 /* stonerview.h */,
+ AFA559A80993326300F3E977 /* superquadrics.c */,
+ AF4A3463102A5A0E00A81B2A /* surfaces.c */,
+ AF0839AC09930C4900277BE9 /* swim.c */,
+ AFA563090993948F00F3E977 /* tangram.c */,
+ AFA563070993948F00F3E977 /* tangram_shapes.c */,
+ AFA563080993948F00F3E977 /* tangram_shapes.h */,
+ AFC211930E4E30C800D87B6E /* teapot.c */,
+ AFC211940E4E30C800D87B6E /* teapot.h */,
+ AFA5638E0993980D00F3E977 /* timetunnel.c */,
+ AFA55E990993608800F3E977 /* toast.c */,
+ AFA55E9A0993608800F3E977 /* toast.dxf */,
+ AFA55E9B0993608800F3E977 /* toast2.c */,
+ AFA55E9C0993608800F3E977 /* toast2.dxf */,
+ AFA55EAB0993608800F3E977 /* toaster.c */,
+ AFA55EAC0993608800F3E977 /* toaster.dxf */,
+ AFA55E9D0993608800F3E977 /* toaster_base.c */,
+ AFA55E9F0993608800F3E977 /* toaster_handle.c */,
+ AFA55EA10993608800F3E977 /* toaster_handle2.c */,
+ AFA55EA30993608800F3E977 /* toaster_jet.c */,
+ AFA55EA50993608800F3E977 /* toaster_knob.c */,
+ AFA55EA70993608800F3E977 /* toaster_slots.c */,
+ AFA55EA90993608800F3E977 /* toaster_wing.c */,
+ AF998EF80A083E750051049D /* topblock.c */,
+ AF083A58099312B000277BE9 /* tunnel_draw.c */,
+ AF083A5D099312DB00277BE9 /* tunnel_draw.h */,
+ AF46E9E71CBBA3F900240FBC /* unicrud.c */,
+ AFDA65A4178A541A0070D24B /* unknownpleasures.c */,
+ AF633C191EE0BC4A00AB33BD /* vigilance.c */,
+ AF633C201EE0BDCD00AB33BD /* seccam.c */,
+ AF0DCA5F0C4CBB7300D76972 /* voronoi.c */,
+ AF0839AD09930C4900277BE9 /* whale.c */,
+ AF39E2A1198A13F50064A58D /* winduprobot.c */,
+ );
+ name = OpenGL;
+ sourceTree = "<group>";
+ };
+ AFC258670988A468000655EE /* config */ = {
+ isa = PBXGroup;
+ children = (
+ AFE6A4360CDD8026002805BF /* abstractile.xml */,
+ AFC258680988A468000655EE /* anemone.xml */,
+ AFC258690988A468000655EE /* anemotaxis.xml */,
+ AFC2586A0988A468000655EE /* ant.xml */,
+ AFC2586B0988A468000655EE /* antinspect.xml */,
+ AFC2586C0988A468000655EE /* antmaze.xml */,
+ AFC2586D0988A468000655EE /* antspotlight.xml */,
+ AFC2586E0988A468000655EE /* apollonian.xml */,
+ AFC2586F0988A468000655EE /* apple2.xml */,
+ AFC258700988A468000655EE /* atlantis.xml */,
+ AFC258710988A468000655EE /* attraction.xml */,
+ AFC258720988A468000655EE /* atunnel.xml */,
+ AFC258730988A468000655EE /* barcode.xml */,
+ AF73FF3B1A0988C500E485E9 /* binaryring.xml */,
+ AFC258740988A468000655EE /* blaster.xml */,
+ AFC258750988A468000655EE /* blinkbox.xml */,
+ AFC258760988A468000655EE /* blitspin.xml */,
+ AFC258770988A468000655EE /* blocktube.xml */,
+ AFC258780988A468000655EE /* boing.xml */,
+ AFC258790988A468000655EE /* bouboule.xml */,
+ AFC2587A0988A468000655EE /* bouncingcow.xml */,
+ AFC2587B0988A468000655EE /* boxed.xml */,
+ AFC2587C0988A468000655EE /* boxfit.xml */,
+ AFC2587D0988A468000655EE /* braid.xml */,
+ AFC2587E0988A468000655EE /* bsod.xml */,
+ AFC2587F0988A468000655EE /* bubble3d.xml */,
+ AFC258800988A468000655EE /* bubbles.xml */,
+ AFC258810988A468000655EE /* bumps.xml */,
+ AFC258820988A468000655EE /* cage.xml */,
+ AFC258830988A468000655EE /* carousel.xml */,
+ AFC258840988A468000655EE /* ccurve.xml */,
+ AFC258850988A468000655EE /* celtic.xml */,
+ AFC258860988A468000655EE /* circuit.xml */,
+ AF5C9B0F1A0CCF4E00B0147A /* cityflow.xml */,
+ AFC258870988A468000655EE /* cloudlife.xml */,
+ AF3581E61431D61D00E09C51 /* companioncube.xml */,
+ AFC258880988A468000655EE /* compass.xml */,
+ AFC258890988A468000655EE /* coral.xml */,
+ AFC2588B0988A468000655EE /* crackberg.xml */,
+ AFC5CFF32044AB27004CEB5E /* crumbler.xml */,
+ AFC2588C0988A468000655EE /* critical.xml */,
+ AFC2588D0988A468000655EE /* crystal.xml */,
+ AFC2588E0988A468000655EE /* cube21.xml */,
+ AFC2588F0988A468000655EE /* cubenetic.xml */,
+ AFEE10841D15EBA600AAC8F7 /* cubestack.xml */,
+ AFC258900988A468000655EE /* cubestorm.xml */,
+ AFEE10651D1341E300AAC8F7 /* cubetwist.xml */,
+ AF4FF4D30D52CCAA00666F98 /* cubicgrid.xml */,
+ AFF4634B0C44046500EE6509 /* cwaves.xml */,
+ AFC258910988A468000655EE /* cynosure.xml */,
+ AFC258920988A468000655EE /* dangerball.xml */,
+ AFC258930988A468000655EE /* decayscreen.xml */,
+ AFC258940988A468000655EE /* deco.xml */,
+ AFC258950988A468000655EE /* deluxe.xml */,
+ AFC258960988A468000655EE /* demon.xml */,
+ AF3938321D0FBEC800205406 /* discoball.xml */,
+ AFC258970988A468000655EE /* discrete.xml */,
+ AFC258980988A468000655EE /* distort.xml */,
+ AF77787909B6545E00EA3033 /* dnalogo.xml */,
+ AFC258990988A468000655EE /* drift.xml */,
+ AFEC23E51CB6EBDA00DE138F /* dymaxionmap.xml */,
+ AFC2589B0988A468000655EE /* endgame.xml */,
+ AFACE88B1CC83578008B24CD /* energystream.xml */,
+ AFC2589C0988A468000655EE /* engine.xml */,
+ AFC2589D0988A468000655EE /* epicycle.xml */,
+ AFC2589E0988A468000655EE /* eruption.xml */,
+ AF2107881FD23D2800B61EA9 /* esper.xml */,
+ AFC2589F0988A468000655EE /* euler2d.xml */,
+ AFC258A00988A468000655EE /* extrusion.xml */,
+ AFC258A10988A468000655EE /* fadeplot.xml */,
+ AFC258A20988A468000655EE /* fiberlamp.xml */,
+ AFD77E7620C2419600A3638D /* filmleader.xml */,
+ AFC258A40988A468000655EE /* fireworkx.xml */,
+ AFC258A50988A468000655EE /* flag.xml */,
+ AFC258A60988A468000655EE /* flame.xml */,
+ AFC258A70988A468000655EE /* flipflop.xml */,
+ AFC258A80988A468000655EE /* flipscreen3d.xml */,
+ AFC258A90988A468000655EE /* fliptext.xml */,
+ AFC258AA0988A468000655EE /* flow.xml */,
+ AFC258AB0988A468000655EE /* fluidballs.xml */,
+ AFC258AC0988A468000655EE /* flurry.xml */,
+ AFC258AD0988A468000655EE /* flyingtoasters.xml */,
+ AFC258AE0988A468000655EE /* fontglide.xml */,
+ AFC258AF0988A468000655EE /* forest.xml */,
+ AFC258B00988A468000655EE /* fuzzyflakes.xml */,
+ AFC258B10988A468000655EE /* galaxy.xml */,
+ AFC258B20988A468000655EE /* gears.xml */,
+ AFF3C9FD17CCAD9A0028F240 /* geodesic.xml */,
+ AF7ACFD819FF0BA600BD752B /* geodesicgears.xml */,
+ AFC258B30988A468000655EE /* gflux.xml */,
+ AFC258B40988A468000655EE /* glblur.xml */,
+ AFF463730C440BAC00EE6509 /* glcells.xml */,
+ AFC258B50988A468000655EE /* gleidescope.xml */,
+ AFC258B60988A468000655EE /* glforestfire.xml */,
+ AFC258B70988A468000655EE /* glhanoi.xml */,
+ AFA6AB0C20999A60006D2685 /* glitchpeg.xml */,
+ AFC258B80988A468000655EE /* glknots.xml */,
+ AFC258B90988A468000655EE /* glmatrix.xml */,
+ AFC258BA0988A468000655EE /* glplanet.xml */,
+ AF48E16B0A0C26A400F94CF9 /* glschool.xml */,
+ AFC258BB0988A468000655EE /* glslideshow.xml */,
+ AFC258BC0988A468000655EE /* glsnake.xml */,
+ AFC258BD0988A468000655EE /* gltext.xml */,
+ AFC258BF0988A468000655EE /* goop.xml */,
+ AFC258C00988A468000655EE /* grav.xml */,
+ AFC258C10988A468000655EE /* greynetic.xml */,
+ AFC258C20988A468000655EE /* halftone.xml */,
+ AFC258C30988A468000655EE /* halo.xml */,
+ AFC258C40988A468000655EE /* helix.xml */,
+ AFB591BC178B81E600EA4005 /* hexadrop.xml */,
+ AF1B0FBF1D7AB5210011DBE4 /* hexstrut.xml */,
+ AF78D18E142DD99A002AAF77 /* hilbert.xml */,
+ AFC258C50988A468000655EE /* hopalong.xml */,
+ AFC258C60988A468000655EE /* hyperball.xml */,
+ AFC0E8C31CDC60A9008CAFAC /* hydrostat.xml */,
+ AFC258C70988A468000655EE /* hypercube.xml */,
+ AFC258C80988A468000655EE /* hypertorus.xml */,
+ AF3C715F0D624C7C0030CC0D /* hypnowheel.xml */,
+ AFC258C90988A468000655EE /* ifs.xml */,
+ AFC258CA0988A468000655EE /* imsmap.xml */,
+ AFC258CB0988A468000655EE /* interaggregate.xml */,
+ AFC258CC0988A468000655EE /* interference.xml */,
+ AFC258CD0988A468000655EE /* intermomentary.xml */,
+ AFC258CE0988A468000655EE /* jigglypuff.xml */,
+ AFC258CF0988A468000655EE /* jigsaw.xml */,
+ AFC258D00988A468000655EE /* juggle.xml */,
+ AFC258D10988A468000655EE /* juggler3d.xml */,
+ AFC258D20988A468000655EE /* julia.xml */,
+ AFC258D30988A468000655EE /* kaleidescope.xml */,
+ AF7511161782B66400380EA1 /* kaleidescope.xml */,
+ AFB8A69A1782BA34004EDB85 /* kaleidocycle.xml */,
+ AFC258D40988A468000655EE /* klein.xml */,
+ AFC258D50988A468000655EE /* kumppa.xml */,
+ AFC258D60988A468000655EE /* lament.xml */,
+ AFC258D70988A468000655EE /* laser.xml */,
+ AFC258D80988A468000655EE /* lavalite.xml */,
+ AF1A17800D6D6F62008AF328 /* lcdscrub.xml */,
+ AFC258D90988A468000655EE /* lightning.xml */,
+ AFC258DA0988A468000655EE /* lisa.xml */,
+ AFC258DB0988A468000655EE /* lissie.xml */,
+ AFC258DC0988A468000655EE /* lmorph.xml */,
+ AF4FD7020CE7A5BC005EE58E /* lockward.xml */,
+ AFC258DD0988A468000655EE /* loop.xml */,
+ AF0DCA370C4C74B700D76972 /* m6502.xml */,
+ AFC258DE0988A468000655EE /* maze.xml */,
+ AFAAE3A1207D6438007A515C /* maze3d.xml */,
+ AFC258DF0988A469000655EE /* memscroller.xml */,
+ AFC258E00988A469000655EE /* menger.xml */,
+ AFC258E10988A469000655EE /* metaballs.xml */,
+ AFC258E20988A469000655EE /* mirrorblob.xml */,
+ AFC258E30988A469000655EE /* mismunch.xml */,
+ AFC258E40988A469000655EE /* moebius.xml */,
+ AFE6A40D0CDD7BDC002805BF /* moebiusgears.xml */,
+ AFC258E50988A469000655EE /* moire.xml */,
+ AFC258E60988A469000655EE /* moire2.xml */,
+ AFC258E70988A469000655EE /* molecule.xml */,
+ AFC258E80988A469000655EE /* morph3d.xml */,
+ AFC258E90988A469000655EE /* mountain.xml */,
+ AFC258EA0988A469000655EE /* munch.xml */,
+ AFC258EB0988A469000655EE /* nerverot.xml */,
+ AFC258EC0988A469000655EE /* noof.xml */,
+ AFC258ED0988A469000655EE /* noseguy.xml */,
+ AFC258EE0988A469000655EE /* pacman.xml */,
+ AFC258EF0988A469000655EE /* pedal.xml */,
+ AF3EC98F203517AD00180A35 /* peepers.xml */,
+ AFC258F00988A469000655EE /* penetrate.xml */,
+ AFC258F10988A469000655EE /* penrose.xml */,
+ AFC258F20988A469000655EE /* petri.xml */,
+ AFC258F30988A469000655EE /* phosphor.xml */,
+ AFD51DB80F063BE700471C02 /* photopile.xml */,
+ AFC258F40988A469000655EE /* piecewise.xml */,
+ AFC258F50988A469000655EE /* pinion.xml */,
+ AFC258F60988A469000655EE /* pipes.xml */,
+ AFC258F70988A469000655EE /* polyhedra.xml */,
+ AFC258F80988A469000655EE /* polyominoes.xml */,
+ AFC258F90988A469000655EE /* polytopes.xml */,
+ AFC258FA0988A469000655EE /* pong.xml */,
+ AFC258FB0988A469000655EE /* popsquares.xml */,
+ AFFAB32C19158E2A0020F021 /* projectiveplane.xml */,
+ AFC258FC0988A469000655EE /* providence.xml */,
+ AFC258FD0988A469000655EE /* pulsar.xml */,
+ AFC258FE0988A469000655EE /* pyro.xml */,
+ AFC258FF0988A469000655EE /* qix.xml */,
+ AFF28694178611720050A578 /* quasicrystal.xml */,
+ AFC259000988A469000655EE /* queens.xml */,
+ AF41E96D201D4B940098E253 /* razzledazzle.xml */,
+ AFA211A41CD59FD800C0D2A1 /* raverhoop.xml */,
+ AFCCCBAD09BFE4B000353F4D /* rdbomb.xml */,
+ AFC259030988A469000655EE /* ripples.xml */,
+ AFC259040988A469000655EE /* rocks.xml */,
+ AF63A8081AB4EF5D00593C75 /* romanboy.xml */,
+ AFC259050988A469000655EE /* rorschach.xml */,
+ AFC259060988A469000655EE /* rotor.xml */,
+ AFC259070988A469000655EE /* rotzoomer.xml */,
+ AFC259080988A469000655EE /* rubik.xml */,
+ AF32D9FC0F3AD1330080F535 /* rubikblocks.xml */,
+ AFC259090988A469000655EE /* sballs.xml */,
+ AFC2590A0988A469000655EE /* shadebobs.xml */,
+ AFC2590B0988A469000655EE /* sierpinski.xml */,
+ AFC2590C0988A469000655EE /* sierpinski3d.xml */,
+ AFE2A4740E2E911200ADB298 /* skytentacles.xml */,
+ AFC2590D0988A469000655EE /* slidescreen.xml */,
+ AFC2590E0988A469000655EE /* slip.xml */,
+ AFC2590F0988A469000655EE /* sonar.xml */,
+ AFC259100988A469000655EE /* speedmine.xml */,
+ AFC259110988A469000655EE /* sphere.xml */,
+ AFC259130988A469000655EE /* spheremonics.xml */,
+ AFC259140988A469000655EE /* spiral.xml */,
+ AFCF83521AF5B5FD008BB7E1 /* splitflap.xml */,
+ AFEE10A31D17E2B300AAC8F7 /* splodesic.xml */,
+ AFC259150988A469000655EE /* spotlight.xml */,
+ AFC259160988A469000655EE /* sproingies.xml */,
+ AFC259170988A469000655EE /* squiral.xml */,
+ AFC259190988A469000655EE /* stairs.xml */,
+ AFC2591A0988A469000655EE /* starfish.xml */,
+ AFC2591B0988A469000655EE /* starwars.xml */,
+ AFC2591C0988A469000655EE /* stonerview.xml */,
+ AFC2591D0988A469000655EE /* strange.xml */,
+ AFC2591E0988A469000655EE /* substrate.xml */,
+ AFC2591F0988A469000655EE /* superquadrics.xml */,
+ AF4A3461102A59EB00A81B2A /* surfaces.xml */,
+ AFC259200988A469000655EE /* swirl.xml */,
+ AFC259210988A469000655EE /* t3d.xml */,
+ AFC259220988A469000655EE /* tangram.xml */,
+ AF68A49419196E3E00D41CD1 /* tessellimage.xml */,
+ CE3D01681B76F83E00993C75 /* testx11.xml */,
+ AFC259230988A469000655EE /* thornbird.xml */,
+ AFC259240988A469000655EE /* timetunnel.xml */,
+ AF998EFA0A083E8C0051049D /* topblock.xml */,
+ AFC259250988A469000655EE /* triangle.xml */,
+ AF3582211433318500E09C51 /* tronbit.xml */,
+ AFC259260988A469000655EE /* truchet.xml */,
+ AFC259270988A469000655EE /* twang.xml */,
+ AFC259280988A469000655EE /* vermiculate.xml */,
+ AFC259290988A469000655EE /* vidwhacker.xml */,
+ AFC2592A0988A469000655EE /* vines.xml */,
+ AF46E9E61CBBA3F900240FBC /* unicrud.xml */,
+ AFDA65A3178A541A0070D24B /* unknownpleasures.xml */,
+ AF5ECEC52116B2FE00069433 /* vfeedback.xml */,
+ AF633C181EE0BC4900AB33BD /* vigilance.xml */,
+ AF0DCA610C4CBB8E00D76972 /* voronoi.xml */,
+ AFC2592B0988A469000655EE /* wander.xml */,
+ AFC2592C0988A469000655EE /* webcollage.xml */,
+ AFC2592D0988A469000655EE /* whirlwindwarp.xml */,
+ AFC2592F0988A469000655EE /* whirlygig.xml */,
+ AF39E2AC198A15820064A58D /* winduprobot.xml */,
+ AFC259300988A469000655EE /* worm.xml */,
+ AFC259310988A469000655EE /* wormhole.xml */,
+ AFC259320988A469000655EE /* xanalogtv.xml */,
+ AFC259370988A469000655EE /* xflame.xml */,
+ AFC259380988A469000655EE /* xjack.xml */,
+ AFC259390988A469000655EE /* xlyap.xml */,
+ AFC2593A0988A469000655EE /* xmatrix.xml */,
+ AFC2593D0988A469000655EE /* xrayswarm.xml */,
+ AFC2593F0988A469000655EE /* xspirograph.xml */,
+ AFC259430988A469000655EE /* zoom.xml */,
+ );
+ name = config;
+ path = ../hacks/config;
+ sourceTree = "<group>";
+ };
+ AFE1FD520981E35400F7970E /* Utils */ = {
+ isa = PBXGroup;
+ children = (
+ AFDA11211934424D003D397F /* aligned_malloc.c */,
+ AFDA11221934424D003D397F /* aligned_malloc.h */,
+ CE9289D119BD00E200961F22 /* async_netdb.c */,
+ CE9289D219BD00E300961F22 /* async_netdb.h */,
+ AF9D473609B52EE0006E59CF /* colorbars.c */,
+ AF9D473709B52EE0006E59CF /* colorbars.h */,
+ AFC25B990988BC08000655EE /* colors.c */,
+ AFC25B9A0988BC08000655EE /* colors.h */,
+ AFE1FD530981E3CB00F7970E /* erase.c */,
+ AFE1FD540981E3CB00F7970E /* erase.h */,
+ AF939AD220351BFC0032DD23 /* font-retry.c */,
+ AFA55A3E0993351F00F3E977 /* gllist.c */,
+ AFA55A3F0993351F00F3E977 /* gllist.h */,
+ AF480EB0098F63D600FB32B8 /* gltrackball.c */,
+ AF480EB2098F63DF00FB32B8 /* gltrackball.h */,
+ AFD56E0A0996A0ED00BA26F7 /* glut_roman.h */,
+ AFD56E0B0996A0ED00BA26F7 /* glut_stroke.c */,
+ AFD56E0C0996A0ED00BA26F7 /* glut_swidth.c */,
+ AFD56E0D0996A0ED00BA26F7 /* glutstroke.h */,
+ AFA5607909936FDD00F3E977 /* grab-ximage.c */,
+ AFA5607A09936FDD00F3E977 /* grab-ximage.h */,
+ AFAD462209D5F4DA00AB5F95 /* grabclient.c */,
+ AFE1FD550981E3CB00F7970E /* hsv.c */,
+ AFE1FD560981E3CB00F7970E /* hsv.h */,
+ AF4774E7099D8D8C001F091E /* logo.c */,
+ AFA55864099324D800F3E977 /* minixpm.c */,
+ AFA55865099324D800F3E977 /* minixpm.h */,
+ AFA55A93099336D800F3E977 /* normals.c */,
+ AFA55A94099336D800F3E977 /* normals.h */,
+ 55374E301E1582AA005E2362 /* pow2.c */,
+ 55374E311E1582AA005E2362 /* pow2.h */,
+ AF4775BE099D9E79001F091E /* resources.c */,
+ AF4775BF099D9E79001F091E /* resources.h */,
+ AF480EB7098F646400FB32B8 /* rotator.c */,
+ AF480EAC098F63B000FB32B8 /* rotator.h */,
+ AFB5A06B0981F4C600871B16 /* screenhack.h */,
+ AFC254B909873AF9000655EE /* screenhackI.h */,
+ AF480EBB098F649600FB32B8 /* sphere.c */,
+ AF480EBA098F648700FB32B8 /* sphere.h */,
+ AFE1FD570981E3CB00F7970E /* spline.c */,
+ AFE1FD580981E3CB00F7970E /* spline.h */,
+ AF77780809B64F4900EA3033 /* texfont.c */,
+ AF77780909B64F4900EA3033 /* texfont.h */,
+ AFC7592B158D8E8B00C5458E /* textclient.c */,
+ AFC7592C158D8E8B00C5458E /* textclient.h */,
+ AFC7592F158D9A7A00C5458E /* textclient-ios.m */,
+ AFA211881CD1AA1800C0D2A1 /* textclient-mobile.c */,
+ AFDA11231934424D003D397F /* thread_util.c */,
+ AFDA11241934424D003D397F /* thread_util.h */,
+ AF480EAD098F63BE00FB32B8 /* trackball.c */,
+ AF480EAF098F63CD00FB32B8 /* trackball.h */,
+ AF480ED2098F652A00FB32B8 /* tube.c */,
+ AF480ED1098F651C00FB32B8 /* tube.h */,
+ AFB5A0ED0981FF8B00871B16 /* usleep.c */,
+ AFB5A0EE0981FF8B00871B16 /* usleep.h */,
+ AFE943B319DDF97F000A5E6D /* utf8wc.c */,
+ AFE943B419DDF97F000A5E6D /* utf8wc.h */,
+ AFE1FD590981E3CB00F7970E /* utils.h */,
+ AFE1FD5A0981E3CB00F7970E /* version.h */,
+ AFA33BD00B0587EE002B0E7D /* webcollage-helper-cocoa.m */,
+ AFE943AF19DD54C1000A5E6D /* xft.c */,
+ AFE943B019DD54C1000A5E6D /* xft.h */,
+ AF480CBB098E37D600FB32B8 /* xlockmore.c */,
+ AF480C89098E346700FB32B8 /* xlockmore.h */,
+ AF480C8A098E34AB00FB32B8 /* xlockmoreI.h */,
+ AF975C91099C929800B05160 /* ximage-loader.c */,
+ AF975C92099C929800B05160 /* ximage-loader.h */,
+ 5501D1941DBDCC0200624BE9 /* xshm.c */,
+ 5501D1951DBDCC0200624BE9 /* xshm.h */,
+ AFE1FD5B0981E3CB00F7970E /* yarandom.c */,
+ AFE1FD5C0981E3CB00F7970E /* yarandom.h */,
+ );
+ name = Utils;
+ path = ..;
+ sourceTree = "<group>";
+ };
+ AFE1FD610981E3E700F7970E /* Hacks */ = {
+ isa = PBXGroup;
+ children = (
+ AF480DC7098F4EB500FB32B8 /* XScreenSaver */,
+ AF480DCF098F4F0600FB32B8 /* Xlockmore */,
+ AF480DD0098F4F2000FB32B8 /* OpenGL */,
+ );
+ name = Hacks;
+ path = ..;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ AF4808BD098C3B6C00FB32B8 /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 55374E331E1582D2005E2362 /* pow2.h in Headers */,
+ AFA55867099324D800F3E977 /* minixpm.h in Headers */,
+ AFA55A540993353500F3E977 /* gllist.h in Headers */,
+ AFA55A96099336D800F3E977 /* normals.h in Headers */,
+ AFE943B219DD54C1000A5E6D /* xft.h in Headers */,
+ AF975C94099C929800B05160 /* ximage-loader.h in Headers */,
+ AF4775C1099D9E79001F091E /* resources.h in Headers */,
+ AF9D473909B52EE0006E59CF /* colorbars.h in Headers */,
+ AF2D8F331CEBA10300198014 /* jwxyz-timers.h in Headers */,
+ AFDA11261934424D003D397F /* aligned_malloc.h in Headers */,
+ AFDA11281934424D003D397F /* thread_util.h in Headers */,
+ AFBF893F0E41D930006A2D66 /* fps.h in Headers */,
+ AFBF89B20E424036006A2D66 /* fpsI.h in Headers */,
+ AF6048FC157C07C600CA21E4 /* jwzgles.h in Headers */,
+ AF6048FD157C07C600CA21E4 /* jwzglesI.h in Headers */,
+ AFC7592E158D8E8B00C5458E /* textclient.h in Headers */,
+ CE9289D419BD00E300961F22 /* async_netdb.h in Headers */,
+ AFE943B619DDF97F000A5E6D /* utf8wc.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXLegacyTarget section */
+ AF4FF4930D52CA0800666F98 /* m6502.h */ = {
+ isa = PBXLegacyTarget;
+ buildArgumentsString = "m6502.sh $(PRODUCT_NAME) images/m6502/*.asm";
+ buildConfigurationList = AF4FF4940D52CA0800666F98 /* Build configuration list for PBXLegacyTarget "m6502.h" */;
+ buildPhases = (
+ );
+ buildToolPath = /bin/sh;
+ buildWorkingDirectory = ../hacks/;
+ dependencies = (
+ );
+ name = m6502.h;
+ passBuildSettingsInEnvironment = 1;
+ productName = molecules.h;
+ };
+ AFA56119099378CB00F3E977 /* molecules.h */ = {
+ isa = PBXLegacyTarget;
+ buildArgumentsString = "molecules.sh $(PRODUCT_NAME) ../images/molecules/*.pdb";
+ buildConfigurationList = AFA5611A099378EA00F3E977 /* Build configuration list for PBXLegacyTarget "molecules.h" */;
+ buildPhases = (
+ );
+ buildToolPath = /bin/sh;
+ buildWorkingDirectory = ../hacks/glx/;
+ dependencies = (
+ );
+ name = molecules.h;
+ passBuildSettingsInEnvironment = 1;
+ productName = molecules.h;
+ };
+ AFAC36B6202E7F79001A684C /* images_png_h */ = {
+ isa = PBXLegacyTarget;
+ buildArgumentsString = "";
+ buildConfigurationList = AFAC36B7202E7F79001A684C /* Build configuration list for PBXLegacyTarget "images_png_h" */;
+ buildPhases = (
+ );
+ buildToolPath = make;
+ buildWorkingDirectory = ../hacks/images/;
+ dependencies = (
+ );
+ name = images_png_h;
+ passBuildSettingsInEnvironment = 1;
+ productName = molecules.h;
+ };
+/* End PBXLegacyTarget section */
+
+/* Begin PBXNativeTarget section */
+ AF08398F09930B6B00277BE9 /* Atlantis */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF08399F09930B6B00277BE9 /* Build configuration list for PBXNativeTarget "Atlantis" */;
+ buildPhases = (
+ AF08399209930B6B00277BE9 /* Resources */,
+ AF08399409930B6B00277BE9 /* Sources */,
+ AF08399709930B6B00277BE9 /* Frameworks */,
+ AF08399E09930B6B00277BE9 /* Rez */,
+ AFA3D95309C03D9800E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF08399009930B6B00277BE9 /* PBXTargetDependency */,
+ );
+ name = Atlantis;
+ productName = Atlantis;
+ productReference = AF0839A209930B6B00277BE9 /* Atlantis.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF083A32099311D700277BE9 /* Atunnel */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF083A45099311D700277BE9 /* Build configuration list for PBXNativeTarget "Atunnel" */;
+ buildPhases = (
+ AF083A35099311D700277BE9 /* Resources */,
+ AF083A37099311D700277BE9 /* Sources */,
+ AF083A3D099311D700277BE9 /* Frameworks */,
+ AF083A44099311D700277BE9 /* Rez */,
+ AFA3D95509C03D9C00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF083A33099311D700277BE9 /* PBXTargetDependency */,
+ );
+ name = Atunnel;
+ productName = Atunnel;
+ productReference = AF083A48099311D700277BE9 /* Atunnel.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF0DC7AB0C4C73F600D76972 /* m6502 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF0DC7BA0C4C73F600D76972 /* Build configuration list for PBXNativeTarget "m6502" */;
+ buildPhases = (
+ AF0DC7AE0C4C73F600D76972 /* Resources */,
+ AF0DC7B00C4C73F600D76972 /* Sources */,
+ AF0DC7B40C4C73F600D76972 /* Frameworks */,
+ AF0DC7B80C4C73F600D76972 /* Rez */,
+ AF0DC7B90C4C73F600D76972 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4FF4980D52CA5000666F98 /* PBXTargetDependency */,
+ AF0DC7AC0C4C73F600D76972 /* PBXTargetDependency */,
+ );
+ name = m6502;
+ productName = Pong;
+ productReference = AF0DC7BD0C4C73F600D76972 /* m6502.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF0DCA420C4CBB0D00D76972 /* Voronoi */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF0DCA530C4CBB0D00D76972 /* Build configuration list for PBXNativeTarget "Voronoi" */;
+ buildPhases = (
+ AF0DCA450C4CBB0D00D76972 /* Resources */,
+ AF0DCA470C4CBB0D00D76972 /* Sources */,
+ AF0DCA4A0C4CBB0D00D76972 /* Frameworks */,
+ AF0DCA510C4CBB0D00D76972 /* Rez */,
+ AF0DCA520C4CBB0D00D76972 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF0DCA430C4CBB0D00D76972 /* PBXTargetDependency */,
+ );
+ name = Voronoi;
+ productName = Voronoi;
+ productReference = AF0DCA560C4CBB0D00D76972 /* Voronoi.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF1A17610D6D6EE3008AF328 /* LCDscrub */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF1A17700D6D6EE3008AF328 /* Build configuration list for PBXNativeTarget "LCDscrub" */;
+ buildPhases = (
+ AF1A17640D6D6EE3008AF328 /* Resources */,
+ AF1A17670D6D6EE3008AF328 /* Sources */,
+ AF1A176A0D6D6EE3008AF328 /* Frameworks */,
+ AF1A176E0D6D6EE3008AF328 /* Rez */,
+ AF1A176F0D6D6EE3008AF328 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF1A17620D6D6EE3008AF328 /* PBXTargetDependency */,
+ );
+ name = LCDscrub;
+ productName = LCDscrub;
+ productReference = AF1A17730D6D6EE3008AF328 /* LCDscrub.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF1AD9E118500F9F00932759 /* XScreenSaverUpdater */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF1ADA0E18500FA200932759 /* Build configuration list for PBXNativeTarget "XScreenSaverUpdater" */;
+ buildPhases = (
+ AF1AD9DE18500F9F00932759 /* Sources */,
+ AF1AD9DF18500F9F00932759 /* Frameworks */,
+ AF1AD9E018500F9F00932759 /* Resources */,
+ AF1ADA191850185F00932759 /* CopyFiles */,
+ AF1ADA1E18501DC200932759 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = XScreenSaverUpdater;
+ productName = XScreenSaverUpdater;
+ productReference = AF1AD9E218500F9F00932759 /* XScreenSaverUpdater.app */;
+ productType = "com.apple.product-type.application";
+ };
+ AF1B0FA71D7AB4740011DBE4 /* Hexstrut */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF1B0FB91D7AB4740011DBE4 /* Build configuration list for PBXNativeTarget "Hexstrut" */;
+ buildPhases = (
+ AF1B0FAA1D7AB4740011DBE4 /* Resources */,
+ AF1B0FAC1D7AB4740011DBE4 /* Sources */,
+ AF1B0FAF1D7AB4740011DBE4 /* Frameworks */,
+ AF1B0FB71D7AB4740011DBE4 /* Rez */,
+ AF1B0FB81D7AB4740011DBE4 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF1B0FA81D7AB4740011DBE4 /* PBXTargetDependency */,
+ );
+ name = Hexstrut;
+ productName = DangerBall;
+ productReference = AF1B0FBC1D7AB4740011DBE4 /* Hexstrut.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF2107711FD23BDD00B61EA9 /* Esper */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF2107831FD23BDD00B61EA9 /* Build configuration list for PBXNativeTarget "Esper" */;
+ buildPhases = (
+ AF2107741FD23BDD00B61EA9 /* Resources */,
+ AF2107761FD23BDD00B61EA9 /* Sources */,
+ AF2107791FD23BDD00B61EA9 /* Frameworks */,
+ AF2107811FD23BDD00B61EA9 /* Rez */,
+ AF2107821FD23BDD00B61EA9 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF2107721FD23BDD00B61EA9 /* PBXTargetDependency */,
+ );
+ name = Esper;
+ productName = DangerBall;
+ productReference = AF2107861FD23BDE00B61EA9 /* Esper.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF32D9E00F3AD0B40080F535 /* RubikBlocks */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF32D9F10F3AD0B40080F535 /* Build configuration list for PBXNativeTarget "RubikBlocks" */;
+ buildPhases = (
+ AF32D9E30F3AD0B40080F535 /* Resources */,
+ AF32D9E50F3AD0B40080F535 /* Sources */,
+ AF32D9E80F3AD0B40080F535 /* Frameworks */,
+ AF32D9EF0F3AD0B40080F535 /* Rez */,
+ AF32D9F00F3AD0B40080F535 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF32D9E10F3AD0B40080F535 /* PBXTargetDependency */,
+ );
+ name = RubikBlocks;
+ productName = RubikBlocks;
+ productReference = AF32D9F40F3AD0B40080F535 /* RubikBlocks.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF3581BF1431D47B00E09C51 /* CompanionCube */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF3581D21431D47B00E09C51 /* Build configuration list for PBXNativeTarget "CompanionCube" */;
+ buildPhases = (
+ AF3581C21431D47B00E09C51 /* Resources */,
+ AF3581C51431D47B00E09C51 /* Sources */,
+ AF3581C91431D47B00E09C51 /* Frameworks */,
+ AF3581D01431D47B00E09C51 /* Rez */,
+ AF3581D11431D47B00E09C51 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF3581C01431D47B00E09C51 /* PBXTargetDependency */,
+ );
+ name = CompanionCube;
+ productName = CompanionCube;
+ productReference = AF3581D51431D47B00E09C51 /* CompanionCube.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF3581FB143330F900E09C51 /* TronBit */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF358213143330F900E09C51 /* Build configuration list for PBXNativeTarget "TronBit" */;
+ buildPhases = (
+ AF3581FE143330F900E09C51 /* Resources */,
+ AF358202143330F900E09C51 /* Sources */,
+ AF35820A143330F900E09C51 /* Frameworks */,
+ AF358211143330F900E09C51 /* Rez */,
+ AF358212143330F900E09C51 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF3581FC143330F900E09C51 /* PBXTargetDependency */,
+ );
+ name = TronBit;
+ productName = CompanionCube;
+ productReference = AF358216143330F900E09C51 /* TronBit.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF35E88A0E63823600691F2F /* Jigsaw */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF35E89D0E63823600691F2F /* Build configuration list for PBXNativeTarget "Jigsaw" */;
+ buildPhases = (
+ AF35E88D0E63823600691F2F /* Resources */,
+ AF35E88F0E63823600691F2F /* Sources */,
+ AF35E8940E63823600691F2F /* Frameworks */,
+ AF35E89B0E63823600691F2F /* Rez */,
+ AF35E89C0E63823600691F2F /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF35E88B0E63823600691F2F /* PBXTargetDependency */,
+ );
+ name = Jigsaw;
+ productName = Jigsaw;
+ productReference = AF35E8A00E63823600691F2F /* Jigsaw.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF39381A1D0FBD6A00205406 /* Discoball */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF39382C1D0FBD6A00205406 /* Build configuration list for PBXNativeTarget "Discoball" */;
+ buildPhases = (
+ AF39381D1D0FBD6A00205406 /* Resources */,
+ AF39381F1D0FBD6A00205406 /* Sources */,
+ AF3938221D0FBD6A00205406 /* Frameworks */,
+ AF39382A1D0FBD6A00205406 /* Rez */,
+ AF39382B1D0FBD6A00205406 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF39381B1D0FBD6A00205406 /* PBXTargetDependency */,
+ );
+ name = Discoball;
+ productName = DangerBall;
+ productReference = AF39382F1D0FBD6A00205406 /* Discoball.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF39E282198A11F60064A58D /* WindupRobot */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF39E293198A11F60064A58D /* Build configuration list for PBXNativeTarget "WindupRobot" */;
+ buildPhases = (
+ AF39E285198A11F60064A58D /* Resources */,
+ AF39E287198A11F60064A58D /* Sources */,
+ AF39E28A198A11F60064A58D /* Frameworks */,
+ AF39E291198A11F60064A58D /* Rez */,
+ AF39E292198A11F60064A58D /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF39E283198A11F60064A58D /* PBXTargetDependency */,
+ );
+ name = WindupRobot;
+ productName = DangerBall;
+ productReference = AF39E296198A11F60064A58D /* WindupRobot.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF3C71450D624BF50030CC0D /* Hypnowheel */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF3C71560D624BF50030CC0D /* Build configuration list for PBXNativeTarget "Hypnowheel" */;
+ buildPhases = (
+ AF3C71480D624BF50030CC0D /* Resources */,
+ AF3C714A0D624BF50030CC0D /* Sources */,
+ AF3C714D0D624BF50030CC0D /* Frameworks */,
+ AF3C71540D624BF50030CC0D /* Rez */,
+ AF3C71550D624BF50030CC0D /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF3C71460D624BF50030CC0D /* PBXTargetDependency */,
+ );
+ name = Hypnowheel;
+ productName = Hypnowheel;
+ productReference = AF3C71590D624BF50030CC0D /* Hypnowheel.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF3EC9782035154C00180A35 /* Peepers */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF3EC98A2035154C00180A35 /* Build configuration list for PBXNativeTarget "Peepers" */;
+ buildPhases = (
+ AF3EC97B2035154C00180A35 /* Resources */,
+ AF3EC97D2035154C00180A35 /* Sources */,
+ AF3EC9802035154C00180A35 /* Frameworks */,
+ AF3EC9882035154C00180A35 /* Rez */,
+ AF3EC9892035154C00180A35 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF3EC9792035154C00180A35 /* PBXTargetDependency */,
+ );
+ name = Peepers;
+ productName = DangerBall;
+ productReference = AF3EC98D2035154C00180A35 /* Peepers.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF41E952201D49DB0098E253 /* RazzleDazzle */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF41E964201D49DB0098E253 /* Build configuration list for PBXNativeTarget "RazzleDazzle" */;
+ buildPhases = (
+ AF41E955201D49DB0098E253 /* Resources */,
+ AF41E957201D49DB0098E253 /* Sources */,
+ AF41E95A201D49DB0098E253 /* Frameworks */,
+ AF41E962201D49DB0098E253 /* Rez */,
+ AF41E963201D49DB0098E253 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF41E953201D49DB0098E253 /* PBXTargetDependency */,
+ );
+ name = RazzleDazzle;
+ productName = DangerBall;
+ productReference = AF41E967201D49DD0098E253 /* RazzleDazzle.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF46E9CF1CBBA2B300240FBC /* Unicrud */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF46E9E11CBBA2B300240FBC /* Build configuration list for PBXNativeTarget "Unicrud" */;
+ buildPhases = (
+ AF46E9D21CBBA2B300240FBC /* Resources */,
+ AF46E9D41CBBA2B300240FBC /* Sources */,
+ AF46E9D71CBBA2B300240FBC /* Frameworks */,
+ AF46E9DF1CBBA2B300240FBC /* Rez */,
+ AF46E9E01CBBA2B300240FBC /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF46E9D01CBBA2B300240FBC /* PBXTargetDependency */,
+ );
+ name = Unicrud;
+ productName = DangerBall;
+ productReference = AF46E9E41CBBA2B300240FBC /* Unicrud.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF476FB5099D154F001F091E /* Interference */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF476FC3099D154F001F091E /* Build configuration list for PBXNativeTarget "Interference" */;
+ buildPhases = (
+ AF476FB8099D154F001F091E /* Resources */,
+ AF476FBB099D154F001F091E /* Sources */,
+ AF476FBE099D154F001F091E /* Frameworks */,
+ AF476FC2099D154F001F091E /* Rez */,
+ AFA3D89509C03C4400E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF476FB6099D154F001F091E /* PBXTargetDependency */,
+ );
+ name = Interference;
+ productName = Interference;
+ productReference = AF476FC6099D154F001F091E /* Interference.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF476FDA099D1686001F091E /* Truchet */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF476FE8099D1686001F091E /* Build configuration list for PBXNativeTarget "Truchet" */;
+ buildPhases = (
+ AF476FDD099D1686001F091E /* Resources */,
+ AF476FE0099D1686001F091E /* Sources */,
+ AF476FE3099D1686001F091E /* Frameworks */,
+ AF476FE7099D1686001F091E /* Rez */,
+ AFA3D8E309C03CCA00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF476FDB099D1686001F091E /* PBXTargetDependency */,
+ );
+ name = Truchet;
+ productName = Truchet;
+ productReference = AF476FEB099D1686001F091E /* Truchet.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF47704C099D4385001F091E /* Deluxe */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF477059099D4385001F091E /* Build configuration list for PBXNativeTarget "Deluxe" */;
+ buildPhases = (
+ AF47704F099D4385001F091E /* Resources */,
+ AF477051099D4385001F091E /* Sources */,
+ AF477054099D4385001F091E /* Frameworks */,
+ AF477058099D4385001F091E /* Rez */,
+ AFA3D86F09C03BF700E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF47704D099D4385001F091E /* PBXTargetDependency */,
+ );
+ name = Deluxe;
+ productName = Deluxe;
+ productReference = AF47705C099D4385001F091E /* Deluxe.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF477169099D4786001F091E /* Compass */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF477176099D4786001F091E /* Build configuration list for PBXNativeTarget "Compass" */;
+ buildPhases = (
+ AF47716C099D4786001F091E /* Resources */,
+ AF47716E099D4786001F091E /* Sources */,
+ AF477171099D4786001F091E /* Frameworks */,
+ AF477175099D4786001F091E /* Rez */,
+ AFA3D86309C03BE200E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF47716A099D4786001F091E /* PBXTargetDependency */,
+ );
+ name = Compass;
+ productName = Compass;
+ productReference = AF477179099D4786001F091E /* Compass.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF47717F099D4803001F091E /* Wander */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF47718C099D4803001F091E /* Build configuration list for PBXNativeTarget "Wander" */;
+ buildPhases = (
+ AF477182099D4803001F091E /* Resources */,
+ AF477184099D4803001F091E /* Sources */,
+ AF477187099D4803001F091E /* Frameworks */,
+ AF47718B099D4803001F091E /* Rez */,
+ AFA3D8E909C03CD500E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF477180099D4803001F091E /* PBXTargetDependency */,
+ );
+ name = Wander;
+ productName = Wander;
+ productReference = AF47718F099D4803001F091E /* Wander.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF4771A7099D4949001F091E /* T3D */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4771B4099D4949001F091E /* Build configuration list for PBXNativeTarget "T3D" */;
+ buildPhases = (
+ AF4771AA099D4949001F091E /* Resources */,
+ AF4771AC099D4949001F091E /* Sources */,
+ AF4771AF099D4949001F091E /* Frameworks */,
+ AF4771B3099D4949001F091E /* Rez */,
+ AFA3D8E109C03CC400E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4771A8099D4949001F091E /* PBXTargetDependency */,
+ );
+ name = T3D;
+ productName = T3D;
+ productReference = AF4771B7099D4949001F091E /* T3D.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF4771DB099D4D9A001F091E /* CCurve */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4771E8099D4D9A001F091E /* Build configuration list for PBXNativeTarget "CCurve" */;
+ buildPhases = (
+ AF4771DE099D4D9A001F091E /* Resources */,
+ AF4771E0099D4D9A001F091E /* Sources */,
+ AF4771E3099D4D9A001F091E /* Frameworks */,
+ AF4771E7099D4D9A001F091E /* Rez */,
+ AFA3D85D09C03BD700E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4771DC099D4D9A001F091E /* PBXTargetDependency */,
+ );
+ name = CCurve;
+ productName = CCurve;
+ productReference = AF4771EB099D4D9A001F091E /* CCurve.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF4771F2099D4E63001F091E /* NerveRot */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4771FF099D4E63001F091E /* Build configuration list for PBXNativeTarget "NerveRot" */;
+ buildPhases = (
+ AF4771F5099D4E63001F091E /* Resources */,
+ AF4771F7099D4E63001F091E /* Sources */,
+ AF4771FA099D4E63001F091E /* Frameworks */,
+ AF4771FE099D4E63001F091E /* Rez */,
+ AFA3D8AF09C03C7300E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4771F3099D4E63001F091E /* PBXTargetDependency */,
+ );
+ name = NerveRot;
+ productName = NerveRot;
+ productReference = AF477202099D4E64001F091E /* NerveRot.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF477208099D4EE8001F091E /* Whirlygig */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF477215099D4EE8001F091E /* Build configuration list for PBXNativeTarget "Whirlygig" */;
+ buildPhases = (
+ AF47720B099D4EE8001F091E /* Resources */,
+ AF47720D099D4EE8001F091E /* Sources */,
+ AF477210099D4EE8001F091E /* Frameworks */,
+ AF477214099D4EE8001F091E /* Rez */,
+ AFA3D8ED09C03CDB00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF477209099D4EE8001F091E /* PBXTargetDependency */,
+ );
+ name = Whirlygig;
+ productName = Whirlygig;
+ productReference = AF477218099D4EE8001F091E /* Whirlygig.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF47721E099D4F67001F091E /* Anemone */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF47722B099D4F67001F091E /* Build configuration list for PBXNativeTarget "Anemone" */;
+ buildPhases = (
+ AF477221099D4F67001F091E /* Resources */,
+ AF477223099D4F67001F091E /* Sources */,
+ AF477226099D4F67001F091E /* Frameworks */,
+ AF47722A099D4F67001F091E /* Rez */,
+ AFCCCBB509C033DF00353F4D /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF47721F099D4F67001F091E /* PBXTargetDependency */,
+ );
+ name = Anemone;
+ productName = Anemone;
+ productReference = AF47722E099D4F67001F091E /* Anemone.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF477253099D5717001F091E /* Halftone */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF477260099D5717001F091E /* Build configuration list for PBXNativeTarget "Halftone" */;
+ buildPhases = (
+ AF477256099D5717001F091E /* Resources */,
+ AF477258099D5717001F091E /* Sources */,
+ AF47725B099D5717001F091E /* Frameworks */,
+ AF47725F099D5717001F091E /* Rez */,
+ AFA3D88509C03C2700E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF477254099D5717001F091E /* PBXTargetDependency */,
+ );
+ name = Halftone;
+ productName = Halftone;
+ productReference = AF477263099D5717001F091E /* Halftone.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF47726B099D57B9001F091E /* PopSquares */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF477278099D57B9001F091E /* Build configuration list for PBXNativeTarget "PopSquares" */;
+ buildPhases = (
+ AF47726E099D57B9001F091E /* Resources */,
+ AF477270099D57B9001F091E /* Sources */,
+ AF477273099D57B9001F091E /* Frameworks */,
+ AF477277099D57B9001F091E /* Rez */,
+ AFA3D8BF09C03C8D00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF47726C099D57B9001F091E /* PBXTargetDependency */,
+ );
+ name = PopSquares;
+ productName = PopSquares;
+ productReference = AF47727B099D57B9001F091E /* PopSquares.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF477283099D5926001F091E /* Piecewise */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF477290099D5926001F091E /* Build configuration list for PBXNativeTarget "Piecewise" */;
+ buildPhases = (
+ AF477286099D5926001F091E /* Resources */,
+ AF477288099D5926001F091E /* Sources */,
+ AF47728B099D5926001F091E /* Frameworks */,
+ AF47728F099D5926001F091E /* Rez */,
+ AFA3D8BB09C03C8600E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF477284099D5926001F091E /* PBXTargetDependency */,
+ );
+ name = Piecewise;
+ productName = Piecewise;
+ productReference = AF477293099D5926001F091E /* Piecewise.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF477382099D65A1001F091E /* Wormhole */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF47738F099D65A1001F091E /* Build configuration list for PBXNativeTarget "Wormhole" */;
+ buildPhases = (
+ AF477385099D65A1001F091E /* Resources */,
+ AF477387099D65A1001F091E /* Sources */,
+ AF47738A099D65A1001F091E /* Frameworks */,
+ AF47738E099D65A1001F091E /* Rez */,
+ AFA3D8EF09C03CDE00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF477383099D65A1001F091E /* PBXTargetDependency */,
+ );
+ name = Wormhole;
+ productName = Wormhole;
+ productReference = AF477392099D65A1001F091E /* Wormhole.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF47739A099D6648001F091E /* FuzzyFlakes */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4773A7099D6648001F091E /* Build configuration list for PBXNativeTarget "FuzzyFlakes" */;
+ buildPhases = (
+ AF47739D099D6648001F091E /* Resources */,
+ AF47739F099D6648001F091E /* Sources */,
+ AF4773A2099D6648001F091E /* Frameworks */,
+ AF4773A6099D6648001F091E /* Rez */,
+ AFA3D87F09C03C1E00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF47739B099D6648001F091E /* PBXTargetDependency */,
+ );
+ name = FuzzyFlakes;
+ productName = FuzzyFlakes;
+ productReference = AF4773AA099D6648001F091E /* FuzzyFlakes.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF4773C1099D67B9001F091E /* Anemotaxis */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4773CE099D67B9001F091E /* Build configuration list for PBXNativeTarget "Anemotaxis" */;
+ buildPhases = (
+ AF4773C4099D67B9001F091E /* Resources */,
+ AF4773C6099D67B9001F091E /* Sources */,
+ AF4773C9099D67B9001F091E /* Frameworks */,
+ AF4773CD099D67B9001F091E /* Rez */,
+ AFCCCBC709C03AAF00353F4D /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4773C2099D67B9001F091E /* PBXTargetDependency */,
+ );
+ name = Anemotaxis;
+ productName = Anemotaxis;
+ productReference = AF4773D1099D67B9001F091E /* Anemotaxis.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF477401099D69E7001F091E /* Intermomentary */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF47740F099D69E7001F091E /* Build configuration list for PBXNativeTarget "Intermomentary" */;
+ buildPhases = (
+ AF477404099D69E7001F091E /* Resources */,
+ AF477407099D69E7001F091E /* Sources */,
+ AF47740A099D69E7001F091E /* Frameworks */,
+ AF47740E099D69E7001F091E /* Rez */,
+ AFA3D89709C03C4700E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF477402099D69E7001F091E /* PBXTargetDependency */,
+ );
+ name = Intermomentary;
+ productName = Intermomentary;
+ productReference = AF477412099D69E7001F091E /* Intermomentary.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF477426099D7C70001F091E /* IFS */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF477434099D7C70001F091E /* Build configuration list for PBXNativeTarget "IFS" */;
+ buildPhases = (
+ AF477429099D7C70001F091E /* Resources */,
+ AF47742C099D7C70001F091E /* Sources */,
+ AF47742F099D7C70001F091E /* Frameworks */,
+ AF477433099D7C70001F091E /* Rez */,
+ AFA3D88F09C03C3900E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF477427099D7C70001F091E /* PBXTargetDependency */,
+ );
+ name = IFS;
+ productName = IFS;
+ productReference = AF477437099D7C70001F091E /* IFS.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF477442099D7D33001F091E /* XMatrix */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF47744F099D7D33001F091E /* Build configuration list for PBXNativeTarget "XMatrix" */;
+ buildPhases = (
+ AF477445099D7D33001F091E /* Resources */,
+ AF477447099D7D33001F091E /* Sources */,
+ AF47744A099D7D33001F091E /* Frameworks */,
+ AF47744E099D7D33001F091E /* Rez */,
+ AFA3D8F909C03CED00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF477443099D7D33001F091E /* PBXTargetDependency */,
+ );
+ name = XMatrix;
+ productName = XMatrix;
+ productReference = AF477452099D7D33001F091E /* XMatrix.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF477483099D89E4001F091E /* Flame */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF477490099D89E4001F091E /* Build configuration list for PBXNativeTarget "Flame" */;
+ buildPhases = (
+ AF477486099D89E4001F091E /* Resources */,
+ AF477488099D89E4001F091E /* Sources */,
+ AF47748B099D89E4001F091E /* Frameworks */,
+ AF47748F099D89E4001F091E /* Rez */,
+ AFA3D87909C03C1200E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF477484099D89E4001F091E /* PBXTargetDependency */,
+ );
+ name = Flame;
+ productName = Flame;
+ productReference = AF477493099D89E4001F091E /* Flame.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF477499099D8A74001F091E /* Kaleidescope */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4774A6099D8A74001F091E /* Build configuration list for PBXNativeTarget "Kaleidescope" */;
+ buildPhases = (
+ AF47749C099D8A74001F091E /* Resources */,
+ AF47749E099D8A74001F091E /* Sources */,
+ AF4774A1099D8A74001F091E /* Frameworks */,
+ AF4774A5099D8A74001F091E /* Rez */,
+ AFA3D89B09C03C4D00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF47749A099D8A74001F091E /* PBXTargetDependency */,
+ );
+ name = Kaleidescope;
+ productName = Kaleidescope;
+ productReference = AF4774A9099D8A74001F091E /* Kaleidescope.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF4774B4099D8B5F001F091E /* LMorph */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4774C1099D8B5F001F091E /* Build configuration list for PBXNativeTarget "LMorph" */;
+ buildPhases = (
+ AF4774B7099D8B5F001F091E /* Resources */,
+ AF4774B9099D8B5F001F091E /* Sources */,
+ AF4774BC099D8B5F001F091E /* Frameworks */,
+ AF4774C0099D8B5F001F091E /* Rez */,
+ AFA3D89F09C03C5300E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4774B5099D8B5F001F091E /* PBXTargetDependency */,
+ );
+ name = LMorph;
+ productName = LMorph;
+ productReference = AF4774C4099D8B5F001F091E /* LMorph.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF4774CE099D8BFF001F091E /* Maze */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4774DB099D8BFF001F091E /* Build configuration list for PBXNativeTarget "Maze" */;
+ buildPhases = (
+ AF4774D1099D8BFF001F091E /* Resources */,
+ AF4774D3099D8BFF001F091E /* Sources */,
+ AF4774D6099D8BFF001F091E /* Frameworks */,
+ AF4774DA099D8BFF001F091E /* Rez */,
+ AFA3D8A109C03C5600E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4774CF099D8BFF001F091E /* PBXTargetDependency */,
+ );
+ name = Maze;
+ productName = Maze;
+ productReference = AF4774DE099D8BFF001F091E /* Maze.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF47755D099D9A1A001F091E /* Pedal */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF47756A099D9A1A001F091E /* Build configuration list for PBXNativeTarget "Pedal" */;
+ buildPhases = (
+ AF477560099D9A1A001F091E /* Resources */,
+ AF477562099D9A1A001F091E /* Sources */,
+ AF477565099D9A1A001F091E /* Frameworks */,
+ AF477569099D9A1A001F091E /* Rez */,
+ AFA3D8B309C03C7900E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF47755E099D9A1A001F091E /* PBXTargetDependency */,
+ );
+ name = Pedal;
+ productName = Pedal;
+ productReference = AF47756D099D9A1A001F091E /* Pedal.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF477583099D9C28001F091E /* Pyro */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF477590099D9C28001F091E /* Build configuration list for PBXNativeTarget "Pyro" */;
+ buildPhases = (
+ AF477586099D9C28001F091E /* Resources */,
+ AF477588099D9C28001F091E /* Sources */,
+ AF47758B099D9C28001F091E /* Frameworks */,
+ AF47758F099D9C28001F091E /* Rez */,
+ AFA3D8C109C03C9000E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF477584099D9C28001F091E /* PBXTargetDependency */,
+ );
+ name = Pyro;
+ productName = Pyro;
+ productReference = AF477593099D9C28001F091E /* Pyro.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF47759F099D9CF7001F091E /* Starfish */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4775AC099D9CF7001F091E /* Build configuration list for PBXNativeTarget "Starfish" */;
+ buildPhases = (
+ AF4775A2099D9CF7001F091E /* Resources */,
+ AF4775A4099D9CF7001F091E /* Sources */,
+ AF4775A7099D9CF7001F091E /* Frameworks */,
+ AF4775AB099D9CF7001F091E /* Rez */,
+ AFA3D8DD09C03CBD00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4775A0099D9CF7001F091E /* PBXTargetDependency */,
+ );
+ name = Starfish;
+ productName = Starfish;
+ productReference = AF4775AF099D9CF7001F091E /* Starfish.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF4775D8099D9F69001F091E /* Coral */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4775E5099D9F69001F091E /* Build configuration list for PBXNativeTarget "Coral" */;
+ buildPhases = (
+ AF4775DB099D9F69001F091E /* Resources */,
+ AF4775DD099D9F69001F091E /* Sources */,
+ AF4775E0099D9F69001F091E /* Frameworks */,
+ AF4775E4099D9F69001F091E /* Rez */,
+ AFA3D86509C03BE500E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4775D9099D9F69001F091E /* PBXTargetDependency */,
+ );
+ name = Coral;
+ productName = Coral;
+ productReference = AF4775E8099D9F69001F091E /* Coral.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF4775F2099DA030001F091E /* Epicycle */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4775FF099DA030001F091E /* Build configuration list for PBXNativeTarget "Epicycle" */;
+ buildPhases = (
+ AF4775F5099DA030001F091E /* Resources */,
+ AF4775F7099DA030001F091E /* Sources */,
+ AF4775FA099DA030001F091E /* Frameworks */,
+ AF4775FE099DA030001F091E /* Rez */,
+ AFA3D87309C03C0000E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4775F3099DA030001F091E /* PBXTargetDependency */,
+ );
+ name = Epicycle;
+ productName = Epicycle;
+ productReference = AF477602099DA030001F091E /* Epicycle.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF477613099DA26C001F091E /* Kumppa */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF477620099DA26C001F091E /* Build configuration list for PBXNativeTarget "Kumppa" */;
+ buildPhases = (
+ AF477616099DA26C001F091E /* Resources */,
+ AF477618099DA26C001F091E /* Sources */,
+ AF47761B099DA26C001F091E /* Frameworks */,
+ AF47761F099DA26C001F091E /* Rez */,
+ AFA3D89D09C03C5000E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF477614099DA26C001F091E /* PBXTargetDependency */,
+ );
+ name = Kumppa;
+ productName = Kumppa;
+ productReference = AF477623099DA26C001F091E /* Kumppa.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF477644099DA6D0001F091E /* Squiral */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF477651099DA6D0001F091E /* Build configuration list for PBXNativeTarget "Squiral" */;
+ buildPhases = (
+ AF477647099DA6D0001F091E /* Resources */,
+ AF477649099DA6D0001F091E /* Sources */,
+ AF47764C099DA6D0001F091E /* Frameworks */,
+ AF477650099DA6D0001F091E /* Rez */,
+ AFA3D8DB09C03CBA00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF477645099DA6D0001F091E /* PBXTargetDependency */,
+ );
+ name = Squiral;
+ productName = Squiral;
+ productReference = AF477654099DA6D0001F091E /* Squiral.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF47765A099DA78E001F091E /* Critical */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF477667099DA78E001F091E /* Build configuration list for PBXNativeTarget "Critical" */;
+ buildPhases = (
+ AF47765D099DA78E001F091E /* Resources */,
+ AF47765F099DA78E001F091E /* Sources */,
+ AF477662099DA78E001F091E /* Frameworks */,
+ AF477666099DA78E001F091E /* Rez */,
+ AFA3D86709C03BE800E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF47765B099DA78E001F091E /* PBXTargetDependency */,
+ );
+ name = Critical;
+ productName = Critical;
+ productReference = AF47766A099DA78F001F091E /* Critical.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF477670099DA849001F091E /* Petri */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF47767D099DA849001F091E /* Build configuration list for PBXNativeTarget "Petri" */;
+ buildPhases = (
+ AF477673099DA849001F091E /* Resources */,
+ AF477675099DA849001F091E /* Sources */,
+ AF477678099DA849001F091E /* Frameworks */,
+ AF47767C099DA849001F091E /* Rez */,
+ AFA3D8B709C03C7F00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF477671099DA849001F091E /* PBXTargetDependency */,
+ );
+ name = Petri;
+ productName = Petri;
+ productReference = AF477680099DA849001F091E /* Petri.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF47768F099DAA6F001F091E /* Blaster */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF47769C099DAA6F001F091E /* Build configuration list for PBXNativeTarget "Blaster" */;
+ buildPhases = (
+ AF477692099DAA6F001F091E /* Resources */,
+ AF477694099DAA6F001F091E /* Sources */,
+ AF477697099DAA6F001F091E /* Frameworks */,
+ AF47769B099DAA6F001F091E /* Rez */,
+ AFCCCBD109C03AFC00353F4D /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF477690099DAA6F001F091E /* PBXTargetDependency */,
+ );
+ name = Blaster;
+ productName = Blaster;
+ productReference = AF47769F099DAA6F001F091E /* Blaster.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF4776AA099DABDD001F091E /* XSpirograph */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4776B7099DABDD001F091E /* Build configuration list for PBXNativeTarget "XSpirograph" */;
+ buildPhases = (
+ AF4776AD099DABDD001F091E /* Resources */,
+ AF4776AF099DABDD001F091E /* Sources */,
+ AF4776B2099DABDD001F091E /* Frameworks */,
+ AF4776B6099DABDD001F091E /* Rez */,
+ AFA3D8FD09C03CF400E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4776AB099DABDD001F091E /* PBXTargetDependency */,
+ );
+ name = XSpirograph;
+ productName = XSpirograph;
+ productReference = AF4776BA099DABDD001F091E /* XSpirograph.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF4776C0099DAC8A001F091E /* XRaySwarm */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4776CD099DAC8A001F091E /* Build configuration list for PBXNativeTarget "XRaySwarm" */;
+ buildPhases = (
+ AF4776C3099DAC8A001F091E /* Resources */,
+ AF4776C5099DAC8A001F091E /* Sources */,
+ AF4776C8099DAC8A001F091E /* Frameworks */,
+ AF4776CC099DAC8A001F091E /* Rez */,
+ AFA3D8FB09C03CF100E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4776C1099DAC8A001F091E /* PBXTargetDependency */,
+ );
+ name = XRaySwarm;
+ productName = XRaySwarm;
+ productReference = AF4776D0099DAC8A001F091E /* XRaySwarm.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF4776DB099DADDF001F091E /* WhirlWindWarp */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4776E8099DADDF001F091E /* Build configuration list for PBXNativeTarget "WhirlWindWarp" */;
+ buildPhases = (
+ AF4776DE099DADDF001F091E /* Resources */,
+ AF4776E0099DADDF001F091E /* Sources */,
+ AF4776E3099DADDF001F091E /* Frameworks */,
+ AF4776E7099DADDF001F091E /* Rez */,
+ AFA3D8EB09C03CD800E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4776DC099DADDF001F091E /* PBXTargetDependency */,
+ );
+ name = WhirlWindWarp;
+ productName = WhirlWindWarp;
+ productReference = AF4776EB099DADDF001F091E /* WhirlWindWarp.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF4776F1099DAE7A001F091E /* Vermiculate */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4776FE099DAE7A001F091E /* Build configuration list for PBXNativeTarget "Vermiculate" */;
+ buildPhases = (
+ AF4776F4099DAE7A001F091E /* Resources */,
+ AF4776F6099DAE7A001F091E /* Sources */,
+ AF4776F9099DAE7A001F091E /* Frameworks */,
+ AF4776FD099DAE7A001F091E /* Rez */,
+ AFA3D8E709C03CD100E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4776F2099DAE7A001F091E /* PBXTargetDependency */,
+ );
+ name = Vermiculate;
+ productName = Vermiculate;
+ productReference = AF477701099DAE7A001F091E /* Vermiculate.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF47770D099DAF9F001F091E /* CloudLife */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF47771A099DAF9F001F091E /* Build configuration list for PBXNativeTarget "CloudLife" */;
+ buildPhases = (
+ AF477710099DAF9F001F091E /* Resources */,
+ AF477712099DAF9F001F091E /* Sources */,
+ AF477715099DAF9F001F091E /* Frameworks */,
+ AF477719099DAF9F001F091E /* Rez */,
+ AFA3D86109C03BDE00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF47770E099DAF9F001F091E /* PBXTargetDependency */,
+ );
+ name = CloudLife;
+ productName = CloudLife;
+ productReference = AF47771D099DAF9F001F091E /* CloudLife.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF477723099DB044001F091E /* Substrate */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF477730099DB044001F091E /* Build configuration list for PBXNativeTarget "Substrate" */;
+ buildPhases = (
+ AF477726099DB044001F091E /* Resources */,
+ AF477728099DB044001F091E /* Sources */,
+ AF47772B099DB044001F091E /* Frameworks */,
+ AF47772F099DB044001F091E /* Rez */,
+ AFA3D8DF09C03CC000E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF477724099DB044001F091E /* PBXTargetDependency */,
+ );
+ name = Substrate;
+ productName = Substrate;
+ productReference = AF477733099DB044001F091E /* Substrate.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF477752099DB61E001F091E /* Interaggregate */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF47775F099DB61E001F091E /* Build configuration list for PBXNativeTarget "Interaggregate" */;
+ buildPhases = (
+ AF477755099DB61E001F091E /* Resources */,
+ AF477757099DB61E001F091E /* Sources */,
+ AF47775A099DB61E001F091E /* Frameworks */,
+ AF47775E099DB61E001F091E /* Rez */,
+ AFA3D89309C03C4000E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF477753099DB61E001F091E /* PBXTargetDependency */,
+ );
+ name = Interaggregate;
+ productName = Interaggregate;
+ productReference = AF477762099DB61E001F091E /* Interaggregate.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF477774099DB965001F091E /* Celtic */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF477781099DB965001F091E /* Build configuration list for PBXNativeTarget "Celtic" */;
+ buildPhases = (
+ AF477777099DB965001F091E /* Resources */,
+ AF477779099DB965001F091E /* Sources */,
+ AF47777C099DB965001F091E /* Frameworks */,
+ AF477780099DB965001F091E /* Rez */,
+ AFA3D85F09C03BDA00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF477775099DB965001F091E /* PBXTargetDependency */,
+ );
+ name = Celtic;
+ productName = Celtic;
+ productReference = AF477784099DB965001F091E /* Celtic.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF477790099DBA90001F091E /* FluidBalls */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF47779D099DBA90001F091E /* Build configuration list for PBXNativeTarget "FluidBalls" */;
+ buildPhases = (
+ AF477793099DBA90001F091E /* Resources */,
+ AF477795099DBA90001F091E /* Sources */,
+ AF477798099DBA90001F091E /* Frameworks */,
+ AF47779C099DBA90001F091E /* Rez */,
+ AFA3D87B09C03C1700E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF477791099DBA90001F091E /* PBXTargetDependency */,
+ );
+ name = FluidBalls;
+ productName = FluidBalls;
+ productReference = AF4777A0099DBA90001F091E /* FluidBalls.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF4777D1099DC183001F091E /* BoxFit */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4777DE099DC183001F091E /* Build configuration list for PBXNativeTarget "BoxFit" */;
+ buildPhases = (
+ AF4777D4099DC183001F091E /* Resources */,
+ AF4777D6099DC183001F091E /* Sources */,
+ AF4777D9099DC183001F091E /* Frameworks */,
+ AF4777DD099DC183001F091E /* Rez */,
+ AFCCCBD509C03B0500353F4D /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4777D2099DC183001F091E /* PBXTargetDependency */,
+ );
+ name = BoxFit;
+ productName = BoxFit;
+ productReference = AF4777E1099DC183001F091E /* BoxFit.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF4778AB099DDB79001F091E /* Penetrate */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4778B8099DDB79001F091E /* Build configuration list for PBXNativeTarget "Penetrate" */;
+ buildPhases = (
+ AF4778AE099DDB79001F091E /* Resources */,
+ AF4778B0099DDB79001F091E /* Sources */,
+ AF4778B3099DDB79001F091E /* Frameworks */,
+ AF4778B7099DDB79001F091E /* Rez */,
+ AFA3D8B509C03C7C00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4778AC099DDB79001F091E /* PBXTargetDependency */,
+ );
+ name = Penetrate;
+ productName = Penetrate;
+ productReference = AF4778BB099DDB79001F091E /* Penetrate.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF4778C7099DDCAE001F091E /* XJack */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4778D4099DDCAE001F091E /* Build configuration list for PBXNativeTarget "XJack" */;
+ buildPhases = (
+ AF4778CA099DDCAE001F091E /* Resources */,
+ AF4778CC099DDCAE001F091E /* Sources */,
+ AF4778CF099DDCAE001F091E /* Frameworks */,
+ AF4778D3099DDCAE001F091E /* Rez */,
+ AFA3D8F509C03CE800E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4778C8099DDCAE001F091E /* PBXTargetDependency */,
+ );
+ name = XJack;
+ productName = XJack;
+ productReference = AF4778D7099DDCAE001F091E /* XJack.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF4778E8099DDDC8001F091E /* Cynosure */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4778F5099DDDC8001F091E /* Build configuration list for PBXNativeTarget "Cynosure" */;
+ buildPhases = (
+ AF4778EB099DDDC8001F091E /* Resources */,
+ AF4778ED099DDDC8001F091E /* Sources */,
+ AF4778F0099DDDC8001F091E /* Frameworks */,
+ AF4778F4099DDDC8001F091E /* Rez */,
+ AFA3D86909C03BEC00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4778E9099DDDC8001F091E /* PBXTargetDependency */,
+ );
+ name = Cynosure;
+ productName = Cynosure;
+ productReference = AF4778F8099DDDC8001F091E /* Cynosure.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF477909099DE379001F091E /* Flag */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF477916099DE379001F091E /* Build configuration list for PBXNativeTarget "Flag" */;
+ buildPhases = (
+ AF47790C099DE379001F091E /* Resources */,
+ AF47790E099DE379001F091E /* Sources */,
+ AF477911099DE379001F091E /* Frameworks */,
+ AF477915099DE379001F091E /* Rez */,
+ AFA3D91709C03D2400E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF47790A099DE379001F091E /* PBXTargetDependency */,
+ );
+ name = Flag;
+ productName = Flag;
+ productReference = AF477919099DE379001F091E /* Flag.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF47792A099DE4C7001F091E /* Slip */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF477937099DE4C7001F091E /* Build configuration list for PBXNativeTarget "Slip" */;
+ buildPhases = (
+ AF47792D099DE4C7001F091E /* Resources */,
+ AF47792F099DE4C7001F091E /* Sources */,
+ AF477932099DE4C7001F091E /* Frameworks */,
+ AF477936099DE4C7001F091E /* Rez */,
+ AFA3D8D309C03CAE00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF47792B099DE4C7001F091E /* PBXTargetDependency */,
+ );
+ name = Slip;
+ productName = Slip;
+ productReference = AF47793A099DE4C7001F091E /* Slip.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF4808C0098C3B6C00FB32B8 /* jwxyz */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4808C2098C3B8B00FB32B8 /* Build configuration list for PBXNativeTarget "jwxyz" */;
+ buildPhases = (
+ AF4E1D1819CE7013002B6190 /* Update GC build settings */,
+ AF4808BD098C3B6C00FB32B8 /* Headers */,
+ AF4808BE098C3B6C00FB32B8 /* Sources */,
+ AF4808BF098C3B6C00FB32B8 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFAC36BB202E7FBA001A684C /* PBXTargetDependency */,
+ );
+ name = jwxyz;
+ productName = jwxyz;
+ productReference = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */;
+ productType = "com.apple.product-type.library.static";
+ };
+ AF480C49098E301400FB32B8 /* Helix */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF480C55098E301400FB32B8 /* Build configuration list for PBXNativeTarget "Helix" */;
+ buildPhases = (
+ AF480C4C098E301400FB32B8 /* Resources */,
+ AF480C4E098E301400FB32B8 /* Sources */,
+ AF480C50098E301400FB32B8 /* Frameworks */,
+ AF480C54098E301400FB32B8 /* Rez */,
+ AFA3D88909C03C2E00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF480C4A098E301400FB32B8 /* PBXTargetDependency */,
+ );
+ name = Helix;
+ productName = Helix;
+ productReference = AF480C58098E301400FB32B8 /* Helix.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF480D72098EEDDE00FB32B8 /* Drift */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF480D7E098EEDDE00FB32B8 /* Build configuration list for PBXNativeTarget "Drift" */;
+ buildPhases = (
+ AF480D75098EEDDE00FB32B8 /* Resources */,
+ AF480D77098EEDDE00FB32B8 /* Sources */,
+ AF480D79098EEDDE00FB32B8 /* Frameworks */,
+ AF480D7D098EEDDE00FB32B8 /* Rez */,
+ AFA3D90F09C03D1800E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF480D73098EEDDE00FB32B8 /* PBXTargetDependency */,
+ );
+ name = Drift;
+ productName = Drift;
+ productReference = AF480D81098EEDDE00FB32B8 /* Drift.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF4810EB09909FBA00FB32B8 /* DangerBall */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4810F809909FBA00FB32B8 /* Build configuration list for PBXNativeTarget "DangerBall" */;
+ buildPhases = (
+ AF4810EE09909FBA00FB32B8 /* Resources */,
+ AF4810F009909FBA00FB32B8 /* Sources */,
+ AF4810F309909FBA00FB32B8 /* Frameworks */,
+ AF4810F709909FBA00FB32B8 /* Rez */,
+ AFA3D97109C03DD000E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4810EC09909FBA00FB32B8 /* PBXTargetDependency */,
+ );
+ name = DangerBall;
+ productName = DangerBall;
+ productReference = AF4810FB09909FBA00FB32B8 /* DangerBall.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF4812500990CE2700FB32B8 /* Gears */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4812610990CE2700FB32B8 /* Build configuration list for PBXNativeTarget "Gears" */;
+ buildPhases = (
+ AF4812530990CE2700FB32B8 /* Resources */,
+ AF4812550990CE2700FB32B8 /* Sources */,
+ AF4812590990CE2700FB32B8 /* Frameworks */,
+ AF4812600990CE2700FB32B8 /* Rez */,
+ AFA3D98309C03DEE00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4812510990CE2700FB32B8 /* PBXTargetDependency */,
+ );
+ name = Gears;
+ productName = Gears;
+ productReference = AF4812640990CE2700FB32B8 /* Gears.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF4812B30990D3D900FB32B8 /* Pipes */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4812C30990D3D900FB32B8 /* Build configuration list for PBXNativeTarget "Pipes" */;
+ buildPhases = (
+ AF4812B60990D3D900FB32B8 /* Resources */,
+ AF4812B80990D3D900FB32B8 /* Sources */,
+ AF4812BB0990D3D900FB32B8 /* Frameworks */,
+ AF4812C20990D3D900FB32B8 /* Rez */,
+ AFA3D9B509C03E5700E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4812B40990D3D900FB32B8 /* PBXTargetDependency */,
+ );
+ name = Pipes;
+ productName = Pipes;
+ productReference = AF4812C60990D3D900FB32B8 /* Pipes.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF48DEEF0A0C25E000F94CF9 /* GLSchool */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF48DF000A0C25E000F94CF9 /* Build configuration list for PBXNativeTarget "GLSchool" */;
+ buildPhases = (
+ AF48DEF20A0C25E000F94CF9 /* Resources */,
+ AF48DEF40A0C25E000F94CF9 /* Sources */,
+ AF48DEF70A0C25E000F94CF9 /* Frameworks */,
+ AF48DEFE0A0C25E000F94CF9 /* Rez */,
+ AF48DEFF0A0C25E000F94CF9 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF48DEF00A0C25E000F94CF9 /* PBXTargetDependency */,
+ );
+ name = GLSchool;
+ productName = GLSchool;
+ productReference = AF48DF030A0C25E000F94CF9 /* GLSchool.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF4A3449102A593600A81B2A /* Surfaces */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4A345A102A593600A81B2A /* Build configuration list for PBXNativeTarget "Surfaces" */;
+ buildPhases = (
+ AF4A344C102A593600A81B2A /* Resources */,
+ AF4A344E102A593600A81B2A /* Sources */,
+ AF4A3451102A593600A81B2A /* Frameworks */,
+ AF4A3458102A593600A81B2A /* Rez */,
+ AF4A3459102A593600A81B2A /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4A344A102A593600A81B2A /* PBXTargetDependency */,
+ );
+ name = Surfaces;
+ productName = Surfaces;
+ productReference = AF4A345D102A593600A81B2A /* Surfaces.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF4FD6E60CE7A486005EE58E /* Lockward */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4FD6F70CE7A486005EE58E /* Build configuration list for PBXNativeTarget "Lockward" */;
+ buildPhases = (
+ AF4FD6E90CE7A486005EE58E /* Resources */,
+ AF4FD6EB0CE7A486005EE58E /* Sources */,
+ AF4FD6EE0CE7A486005EE58E /* Frameworks */,
+ AF4FD6F50CE7A486005EE58E /* Rez */,
+ AF4FD6F60CE7A486005EE58E /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4FD6E70CE7A486005EE58E /* PBXTargetDependency */,
+ );
+ name = Lockward;
+ productName = Lockward;
+ productReference = AF4FD6FA0CE7A486005EE58E /* Lockward.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF4FF4BA0D52CBDE00666F98 /* CubicGrid */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF4FF4CB0D52CBDE00666F98 /* Build configuration list for PBXNativeTarget "CubicGrid" */;
+ buildPhases = (
+ AF4FF4BD0D52CBDE00666F98 /* Resources */,
+ AF4FF4BF0D52CBDE00666F98 /* Sources */,
+ AF4FF4C20D52CBDE00666F98 /* Frameworks */,
+ AF4FF4C90D52CBDE00666F98 /* Rez */,
+ AF4FF4CA0D52CBDE00666F98 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF4FF4BB0D52CBDE00666F98 /* PBXTargetDependency */,
+ );
+ name = CubicGrid;
+ productName = CubicGrid;
+ productReference = AF4FF4CE0D52CBDE00666F98 /* CubicGrid.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF5C9AF91A0CCE6E00B0147A /* Cityflow */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF5C9B0A1A0CCE6E00B0147A /* Build configuration list for PBXNativeTarget "Cityflow" */;
+ buildPhases = (
+ AF5C9AFC1A0CCE6E00B0147A /* Resources */,
+ AF5C9AFE1A0CCE6E00B0147A /* Sources */,
+ AF5C9B011A0CCE6E00B0147A /* Frameworks */,
+ AF5C9B081A0CCE6E00B0147A /* Rez */,
+ AF5C9B091A0CCE6E00B0147A /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF5C9AFA1A0CCE6E00B0147A /* PBXTargetDependency */,
+ );
+ name = Cityflow;
+ productName = DangerBall;
+ productReference = AF5C9B0D1A0CCE6E00B0147A /* Cityflow.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF5ECEA92116B1A400069433 /* VFeedback */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF5ECEBD2116B1A400069433 /* Build configuration list for PBXNativeTarget "VFeedback" */;
+ buildPhases = (
+ AF5ECEAC2116B1A400069433 /* Resources */,
+ AF5ECEAF2116B1A400069433 /* Sources */,
+ AF5ECEB32116B1A400069433 /* Frameworks */,
+ AF5ECEBB2116B1A400069433 /* Rez */,
+ AF5ECEBC2116B1A400069433 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF5ECEAA2116B1A400069433 /* PBXTargetDependency */,
+ );
+ name = VFeedback;
+ productName = XAnalogTV;
+ productReference = AF5ECEC02116B1A400069433 /* VFeedback.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF633C011EE0BA6F00AB33BD /* Vigilance */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF633C131EE0BA6F00AB33BD /* Build configuration list for PBXNativeTarget "Vigilance" */;
+ buildPhases = (
+ AF633C041EE0BA6F00AB33BD /* Resources */,
+ AF633C061EE0BA6F00AB33BD /* Sources */,
+ AF633C091EE0BA6F00AB33BD /* Frameworks */,
+ AF633C111EE0BA6F00AB33BD /* Rez */,
+ AF633C121EE0BA6F00AB33BD /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF633C021EE0BA6F00AB33BD /* PBXTargetDependency */,
+ );
+ name = Vigilance;
+ productName = DangerBall;
+ productReference = AF633C161EE0BA6F00AB33BD /* Vigilance.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF63A7F11AB4EDDB00593C75 /* RomanBoy */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF63A8031AB4EDDB00593C75 /* Build configuration list for PBXNativeTarget "RomanBoy" */;
+ buildPhases = (
+ AF63A7F41AB4EDDB00593C75 /* Resources */,
+ AF63A7F61AB4EDDB00593C75 /* Sources */,
+ AF63A7F91AB4EDDB00593C75 /* Frameworks */,
+ AF63A8011AB4EDDB00593C75 /* Rez */,
+ AF63A8021AB4EDDB00593C75 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF63A7F21AB4EDDB00593C75 /* PBXTargetDependency */,
+ );
+ name = RomanBoy;
+ productName = Klein;
+ productReference = AF63A8061AB4EDDB00593C75 /* RomanBoy.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF63F2471C3465BE0033E133 /* Apple2-iOS */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF63F44B1C3465BE0033E133 /* Build configuration list for PBXNativeTarget "Apple2-iOS" */;
+ buildPhases = (
+ AF63F24F1C3465BE0033E133 /* Update Function Table */,
+ AF63F2501C3465BE0033E133 /* Resources */,
+ AF63F3271C3465BE0033E133 /* Sources */,
+ AF63F4401C3465BE0033E133 /* Frameworks */,
+ AF63F44A1C3465BE0033E133 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF63F2481C3465BE0033E133 /* PBXTargetDependency */,
+ AF63F24A1C3465BE0033E133 /* PBXTargetDependency */,
+ AF63F24C1C3465BE0033E133 /* PBXTargetDependency */,
+ );
+ name = "Apple2-iOS";
+ productName = SaverTester;
+ productReference = AF63F44E1C3465BE0033E133 /* Apple2.app */;
+ productType = "com.apple.product-type.application";
+ };
+ AF63F4501C34682A0033E133 /* Phosphor-iOS */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF63F4711C34682A0033E133 /* Build configuration list for PBXNativeTarget "Phosphor-iOS" */;
+ buildPhases = (
+ AF63F4571C34682A0033E133 /* Update Function Table */,
+ AF63F4581C34682A0033E133 /* Resources */,
+ AF63F45E1C34682A0033E133 /* Sources */,
+ AF63F4661C34682A0033E133 /* Frameworks */,
+ AF63F4701C34682A0033E133 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF63F4511C34682A0033E133 /* PBXTargetDependency */,
+ AF63F4531C34682A0033E133 /* PBXTargetDependency */,
+ AF63F4551C34682A0033E133 /* PBXTargetDependency */,
+ );
+ name = "Phosphor-iOS";
+ productName = SaverTester;
+ productReference = AF63F4741C34682A0033E133 /* Phosphor.app */;
+ productType = "com.apple.product-type.application";
+ };
+ AF63F4781C3469FC0033E133 /* TestX11-iOS */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF63F4971C3469FC0033E133 /* Build configuration list for PBXNativeTarget "TestX11-iOS" */;
+ buildPhases = (
+ AF63F47F1C3469FC0033E133 /* Update Function Table */,
+ AF63F4801C3469FC0033E133 /* Resources */,
+ AF63F4861C3469FC0033E133 /* Sources */,
+ AF63F48C1C3469FC0033E133 /* Frameworks */,
+ AF63F4961C3469FC0033E133 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF63F4791C3469FC0033E133 /* PBXTargetDependency */,
+ AF63F47B1C3469FC0033E133 /* PBXTargetDependency */,
+ AF63F47D1C3469FC0033E133 /* PBXTargetDependency */,
+ );
+ name = "TestX11-iOS";
+ productName = SaverTester;
+ productReference = AF63F49A1C3469FC0033E133 /* TestX11.app */;
+ productType = "com.apple.product-type.application";
+ };
+ AF6423F2099FF9C2000F4CD4 /* Extrusion */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF642402099FF9C2000F4CD4 /* Build configuration list for PBXNativeTarget "Extrusion" */;
+ buildPhases = (
+ AF6423F5099FF9C2000F4CD4 /* Resources */,
+ AF6423F7099FF9C2000F4CD4 /* Sources */,
+ AF6423FA099FF9C2000F4CD4 /* Frameworks */,
+ AF642401099FF9C2000F4CD4 /* Rez */,
+ AFA3D97909C03DDD00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF6423F3099FF9C2000F4CD4 /* PBXTargetDependency */,
+ );
+ name = Extrusion;
+ productName = Extrusion;
+ productReference = AF642405099FF9C2000F4CD4 /* Extrusion.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF6425CC09A18855000F4CD4 /* HyperCube */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF6425D909A18855000F4CD4 /* Build configuration list for PBXNativeTarget "HyperCube" */;
+ buildPhases = (
+ AF6425CF09A18855000F4CD4 /* Resources */,
+ AF6425D109A18855000F4CD4 /* Sources */,
+ AF6425D409A18855000F4CD4 /* Frameworks */,
+ AF6425D809A18855000F4CD4 /* Rez */,
+ AFA3D88D09C03C3600E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF6425CD09A18855000F4CD4 /* PBXTargetDependency */,
+ );
+ name = HyperCube;
+ productName = HyperCube;
+ productReference = AF6425DC09A18856000F4CD4 /* HyperCube.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF6425EC09A189EC000F4CD4 /* Qix */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF6425F909A189EC000F4CD4 /* Build configuration list for PBXNativeTarget "Qix" */;
+ buildPhases = (
+ AF6425EF09A189EC000F4CD4 /* Resources */,
+ AF6425F109A189EC000F4CD4 /* Sources */,
+ AF6425F409A189EC000F4CD4 /* Frameworks */,
+ AF6425F809A189EC000F4CD4 /* Rez */,
+ AFA3D8C309C03C9300E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF6425ED09A189EC000F4CD4 /* PBXTargetDependency */,
+ );
+ name = Qix;
+ productName = Qix;
+ productReference = AF6425FC09A189EC000F4CD4 /* Qix.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF64260F09A18D6C000F4CD4 /* HyperBall */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF64261C09A18D6C000F4CD4 /* Build configuration list for PBXNativeTarget "HyperBall" */;
+ buildPhases = (
+ AF64261209A18D6C000F4CD4 /* Resources */,
+ AF64261409A18D6C000F4CD4 /* Sources */,
+ AF64261709A18D6C000F4CD4 /* Frameworks */,
+ AF64261B09A18D6C000F4CD4 /* Rez */,
+ AFA3D88B09C03C3200E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF64261009A18D6C000F4CD4 /* PBXTargetDependency */,
+ );
+ name = HyperBall;
+ productName = HyperBall;
+ productReference = AF64261F09A18D6C000F4CD4 /* HyperBall.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF64262C09A18F54000F4CD4 /* Moire2 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF64263909A18F54000F4CD4 /* Build configuration list for PBXNativeTarget "Moire2" */;
+ buildPhases = (
+ AF64262F09A18F54000F4CD4 /* Resources */,
+ AF64263109A18F54000F4CD4 /* Sources */,
+ AF64263409A18F54000F4CD4 /* Frameworks */,
+ AF64263809A18F54000F4CD4 /* Rez */,
+ AFA3D8AB09C03C6D00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF64262D09A18F54000F4CD4 /* PBXTargetDependency */,
+ );
+ name = Moire2;
+ productName = Moire2;
+ productReference = AF64263C09A18F54000F4CD4 /* Moire2.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF64264F09A19229000F4CD4 /* Munch */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF64265C09A19229000F4CD4 /* Build configuration list for PBXNativeTarget "Munch" */;
+ buildPhases = (
+ AF64265209A19229000F4CD4 /* Resources */,
+ AF64265409A19229000F4CD4 /* Sources */,
+ AF64265709A19229000F4CD4 /* Frameworks */,
+ AF64265B09A19229000F4CD4 /* Rez */,
+ AFA3D8AD09C03C7000E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF64265009A19229000F4CD4 /* PBXTargetDependency */,
+ );
+ name = Munch;
+ productName = Munch;
+ productReference = AF64265F09A19229000F4CD4 /* Munch.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF64267B09A194B0000F4CD4 /* Goop */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF64268809A194B0000F4CD4 /* Build configuration list for PBXNativeTarget "Goop" */;
+ buildPhases = (
+ AF64267E09A194B0000F4CD4 /* Resources */,
+ AF64268009A194B0000F4CD4 /* Sources */,
+ AF64268309A194B0000F4CD4 /* Frameworks */,
+ AF64268709A194B0000F4CD4 /* Rez */,
+ AFA3D88109C03C2100E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF64267C09A194B0000F4CD4 /* PBXTargetDependency */,
+ );
+ name = Goop;
+ productName = Goop;
+ productReference = AF64268B09A194B0000F4CD4 /* Goop.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF64277109A1D37A000F4CD4 /* SpeedMine */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF64277E09A1D37A000F4CD4 /* Build configuration list for PBXNativeTarget "SpeedMine" */;
+ buildPhases = (
+ AF64277409A1D37A000F4CD4 /* Resources */,
+ AF64277609A1D37A000F4CD4 /* Sources */,
+ AF64277909A1D37A000F4CD4 /* Frameworks */,
+ AF64277D09A1D37A000F4CD4 /* Rez */,
+ AFA3D8D709C03CB400E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF64277209A1D37A000F4CD4 /* PBXTargetDependency */,
+ );
+ name = SpeedMine;
+ productName = SpeedMine;
+ productReference = AF64278109A1D37A000F4CD4 /* SpeedMine.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF6427A809A2DE36000F4CD4 /* Bubbles */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF6427B509A2DE36000F4CD4 /* Build configuration list for PBXNativeTarget "Bubbles" */;
+ buildPhases = (
+ AF6427AB09A2DE36000F4CD4 /* Resources */,
+ AF6427AD09A2DE36000F4CD4 /* Sources */,
+ AF6427B009A2DE36000F4CD4 /* Frameworks */,
+ AF6427B409A2DE36000F4CD4 /* Rez */,
+ AFA3D69409C03B6200E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF6427A909A2DE36000F4CD4 /* PBXTargetDependency */,
+ );
+ name = Bubbles;
+ productName = Bubbles;
+ productReference = AF6427B809A2DE36000F4CD4 /* Bubbles.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF68A47E19196CF800D41CD1 /* Tessellimage */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF68A48F19196CF800D41CD1 /* Build configuration list for PBXNativeTarget "Tessellimage" */;
+ buildPhases = (
+ AF68A48119196CF800D41CD1 /* Resources */,
+ AF68A48319196CF800D41CD1 /* Sources */,
+ AF68A48619196CF800D41CD1 /* Frameworks */,
+ AF68A48D19196CF800D41CD1 /* Rez */,
+ AF68A48E19196CF800D41CD1 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF68A47F19196CF800D41CD1 /* PBXTargetDependency */,
+ );
+ name = Tessellimage;
+ productName = Attraction;
+ productReference = AF68A49219196CF800D41CD1 /* Tessellimage.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF73FF221A09877F00E485E9 /* BinaryRing */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF73FF331A09877F00E485E9 /* Build configuration list for PBXNativeTarget "BinaryRing" */;
+ buildPhases = (
+ AF73FF251A09877F00E485E9 /* Resources */,
+ AF73FF271A09877F00E485E9 /* Sources */,
+ AF73FF2A1A09877F00E485E9 /* Frameworks */,
+ AF73FF311A09877F00E485E9 /* Rez */,
+ AF73FF321A09877F00E485E9 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF73FF231A09877F00E485E9 /* PBXTargetDependency */,
+ );
+ name = BinaryRing;
+ productName = Attraction;
+ productReference = AF73FF361A09877F00E485E9 /* BinaryRing.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF7510FF1782B5B900380EA1 /* Kaleidocycle */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF75110F1782B5B900380EA1 /* Build configuration list for PBXNativeTarget "Kaleidocycle" */;
+ buildPhases = (
+ AF7511021782B5B900380EA1 /* Resources */,
+ AF7511041782B5B900380EA1 /* Sources */,
+ AF7511071782B5B900380EA1 /* Frameworks */,
+ AF75110D1782B5B900380EA1 /* Rez */,
+ AF75110E1782B5B900380EA1 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF7511001782B5B900380EA1 /* PBXTargetDependency */,
+ );
+ name = Kaleidocycle;
+ productName = Voronoi;
+ productReference = AF7511121782B5B900380EA1 /* Kaleidocycle.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF7776E409B63ABF00EA3033 /* Phosphor */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF7776F309B63ABF00EA3033 /* Build configuration list for PBXNativeTarget "Phosphor" */;
+ buildPhases = (
+ AF7776E709B63ABF00EA3033 /* Resources */,
+ AF7776E909B63ABF00EA3033 /* Sources */,
+ AF7776EE09B63ABF00EA3033 /* Frameworks */,
+ AF7776F209B63ABF00EA3033 /* Rez */,
+ AFA3D8B909C03C8200E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF7776E509B63ABF00EA3033 /* PBXTargetDependency */,
+ );
+ name = Phosphor;
+ productName = Phosphor;
+ productReference = AF7776F609B63ABF00EA3033 /* Phosphor.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF77771A09B6416100EA3033 /* Pacman */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF77772709B6416100EA3033 /* Build configuration list for PBXNativeTarget "Pacman" */;
+ buildPhases = (
+ AF77771D09B6416100EA3033 /* Resources */,
+ AF77771F09B6416100EA3033 /* Sources */,
+ AF77772209B6416100EA3033 /* Frameworks */,
+ AF77772609B6416100EA3033 /* Rez */,
+ AFA3D93509C03D5700E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF77771B09B6416100EA3033 /* PBXTargetDependency */,
+ );
+ name = Pacman;
+ productName = Pacman;
+ productReference = AF77772A09B6416100EA3033 /* Pacman.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF77773E09B6446500EA3033 /* FlipScreen3D */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF77774E09B6446500EA3033 /* Build configuration list for PBXNativeTarget "FlipScreen3D" */;
+ buildPhases = (
+ AF77774109B6446500EA3033 /* Resources */,
+ AF77774309B6446500EA3033 /* Sources */,
+ AF77774609B6446500EA3033 /* Frameworks */,
+ AF77774D09B6446500EA3033 /* Rez */,
+ AFA3D97D09C03DE400E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF77773F09B6446500EA3033 /* PBXTargetDependency */,
+ );
+ name = FlipScreen3D;
+ productName = FlipScreen3D;
+ productReference = AF77775109B6446500EA3033 /* FlipScreen3D.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF77777409B6497800EA3033 /* Gleidescope */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF77778509B6497800EA3033 /* Build configuration list for PBXNativeTarget "Gleidescope" */;
+ buildPhases = (
+ AF77777709B6497800EA3033 /* Resources */,
+ AF77777909B6497800EA3033 /* Sources */,
+ AF77777D09B6497800EA3033 /* Frameworks */,
+ AF77778409B6497800EA3033 /* Rez */,
+ AFA3D98509C03DF100E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF77777509B6497800EA3033 /* PBXTargetDependency */,
+ );
+ name = Gleidescope;
+ productName = Gleidescope;
+ productReference = AF34085609B80AB000F2CEC1 /* Gleidescope.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF77778E09B64A5200EA3033 /* MirrorBlob */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF77779F09B64A5200EA3033 /* Build configuration list for PBXNativeTarget "MirrorBlob" */;
+ buildPhases = (
+ AF77779109B64A5200EA3033 /* Resources */,
+ AF77779309B64A5200EA3033 /* Sources */,
+ AF77779709B64A5200EA3033 /* Frameworks */,
+ AF77779E09B64A5200EA3033 /* Rez */,
+ AFA3D9A909C03E3D00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF77778F09B64A5200EA3033 /* PBXTargetDependency */,
+ );
+ name = MirrorBlob;
+ productName = MirrorBlob;
+ productReference = AF7777A209B64A5200EA3033 /* MirrorBlob.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF7777A809B64B2600EA3033 /* StonerView */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF7777B909B64B2600EA3033 /* Build configuration list for PBXNativeTarget "StonerView" */;
+ buildPhases = (
+ AF7777AB09B64B2600EA3033 /* Resources */,
+ AF7777AD09B64B2600EA3033 /* Sources */,
+ AF7777B109B64B2600EA3033 /* Frameworks */,
+ AF7777B809B64B2600EA3033 /* Rez */,
+ AFA3D9CF09C03E8700E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF7777A909B64B2600EA3033 /* PBXTargetDependency */,
+ );
+ name = StonerView;
+ productName = StonerView;
+ productReference = AF34085509B80AB000F2CEC1 /* StonerView.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF7777D009B64C6B00EA3033 /* GLSlideshow */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF7777E109B64C6B00EA3033 /* Build configuration list for PBXNativeTarget "GLSlideshow" */;
+ buildPhases = (
+ AF7777D309B64C6B00EA3033 /* Resources */,
+ AF7777D509B64C6B00EA3033 /* Sources */,
+ AF7777D909B64C6B00EA3033 /* Frameworks */,
+ AF7777E009B64C6B00EA3033 /* Rez */,
+ AFA3D99509C03E1900E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF7777D109B64C6B00EA3033 /* PBXTargetDependency */,
+ );
+ name = GLSlideshow;
+ productName = GLSlideshow;
+ productReference = AF7777E409B64C6B00EA3033 /* GLSlideshow.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF7777EA09B64E3100EA3033 /* FlipText */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF7777FB09B64E3100EA3033 /* Build configuration list for PBXNativeTarget "FlipText" */;
+ buildPhases = (
+ AF7777ED09B64E3100EA3033 /* Resources */,
+ AF7777EF09B64E3100EA3033 /* Sources */,
+ AF7777F309B64E3100EA3033 /* Frameworks */,
+ AF7777FA09B64E3100EA3033 /* Rez */,
+ AFA3D97F09C03DE700E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF7777EB09B64E3100EA3033 /* PBXTargetDependency */,
+ );
+ name = FlipText;
+ productName = FlipText;
+ productReference = AF7777FE09B64E3100EA3033 /* FlipText.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF77781009B6504400EA3033 /* StarWars */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF77782209B6504400EA3033 /* Build configuration list for PBXNativeTarget "StarWars" */;
+ buildPhases = (
+ AF77781309B6504400EA3033 /* Resources */,
+ AF77781509B6504400EA3033 /* Sources */,
+ AF77781A09B6504400EA3033 /* Frameworks */,
+ AF77782109B6504400EA3033 /* Rez */,
+ AFA3D9CD09C03E8400E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF77781109B6504400EA3033 /* PBXTargetDependency */,
+ );
+ name = StarWars;
+ productName = StarWars;
+ productReference = AF34085409B80AAF00F2CEC1 /* StarWars.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF77784409B6528100EA3033 /* Carousel */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF77785509B6528100EA3033 /* Build configuration list for PBXNativeTarget "Carousel" */;
+ buildPhases = (
+ AF77784709B6528100EA3033 /* Resources */,
+ AF77784A09B6528100EA3033 /* Sources */,
+ AF77784D09B6528100EA3033 /* Frameworks */,
+ AF77785409B6528100EA3033 /* Rez */,
+ AFA3D96509C03DB900E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF77784509B6528100EA3033 /* PBXTargetDependency */,
+ );
+ name = Carousel;
+ productName = Carousel;
+ productReference = AF77785809B6528100EA3033 /* Carousel.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF77786109B6536000EA3033 /* DNAlogo */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF77787109B6536000EA3033 /* Build configuration list for PBXNativeTarget "DNAlogo" */;
+ buildPhases = (
+ AF77786409B6536000EA3033 /* Resources */,
+ AF77786609B6536000EA3033 /* Sources */,
+ AF77786909B6536000EA3033 /* Frameworks */,
+ AF77787009B6536000EA3033 /* Rez */,
+ AFA3D97309C03DD300E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF77786209B6536000EA3033 /* PBXTargetDependency */,
+ );
+ name = DNAlogo;
+ productName = DNAlogo;
+ productReference = AF77787409B6536000EA3033 /* DNAlogo.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF77787F09B6563500EA3033 /* FontGlide */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF77788C09B6563500EA3033 /* Build configuration list for PBXNativeTarget "FontGlide" */;
+ buildPhases = (
+ AF77788209B6563500EA3033 /* Resources */,
+ AF77788409B6563500EA3033 /* Sources */,
+ AF77788709B6563500EA3033 /* Frameworks */,
+ AF77788B09B6563500EA3033 /* Rez */,
+ AFA3D87D09C03C1B00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF77788009B6563500EA3033 /* PBXTargetDependency */,
+ );
+ name = FontGlide;
+ productName = FontGlide;
+ productReference = AF34085709B80AB000F2CEC1 /* FontGlide.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF7778A509B659C800EA3033 /* BlitSpin */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF7778B209B659C800EA3033 /* Build configuration list for PBXNativeTarget "BlitSpin" */;
+ buildPhases = (
+ AF7778A809B659C800EA3033 /* Resources */,
+ AF7778AA09B659C800EA3033 /* Sources */,
+ AF7778AD09B659C800EA3033 /* Frameworks */,
+ AF7778B109B659C800EA3033 /* Rez */,
+ AFCCCBD309C03B0000353F4D /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF7778A609B659C800EA3033 /* PBXTargetDependency */,
+ );
+ name = BlitSpin;
+ productName = BlitSpin;
+ productReference = AF7778B509B659C800EA3033 /* BlitSpin.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF78D175142DD8F3002AAF77 /* Hilbert */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF78D186142DD8F3002AAF77 /* Build configuration list for PBXNativeTarget "Hilbert" */;
+ buildPhases = (
+ AF78D178142DD8F3002AAF77 /* Resources */,
+ AF78D17A142DD8F3002AAF77 /* Sources */,
+ AF78D17D142DD8F3002AAF77 /* Frameworks */,
+ AF78D184142DD8F3002AAF77 /* Rez */,
+ AF78D185142DD8F3002AAF77 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF78D176142DD8F3002AAF77 /* PBXTargetDependency */,
+ );
+ name = Hilbert;
+ productName = Hilbert;
+ productReference = AF78D189142DD8F3002AAF77 /* Hilbert.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF794F64099748450059A8B0 /* Demon */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF794F71099748450059A8B0 /* Build configuration list for PBXNativeTarget "Demon" */;
+ buildPhases = (
+ AF794F67099748450059A8B0 /* Resources */,
+ AF794F69099748450059A8B0 /* Sources */,
+ AF794F6C099748450059A8B0 /* Frameworks */,
+ AF794F70099748450059A8B0 /* Rez */,
+ AFA3D90B09C03D1100E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF794F65099748450059A8B0 /* PBXTargetDependency */,
+ );
+ name = Demon;
+ productName = Demon;
+ productReference = AF794F74099748450059A8B0 /* Demon.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF794F8E09974A320059A8B0 /* Fiberlamp */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF794F9B09974A320059A8B0 /* Build configuration list for PBXNativeTarget "Fiberlamp" */;
+ buildPhases = (
+ AF794F9109974A320059A8B0 /* Resources */,
+ AF794F9309974A320059A8B0 /* Sources */,
+ AF794F9609974A320059A8B0 /* Frameworks */,
+ AF794F9A09974A320059A8B0 /* Rez */,
+ AFA3D91509C03D2100E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF794F8F09974A320059A8B0 /* PBXTargetDependency */,
+ );
+ name = Fiberlamp;
+ productName = Fiberlamp;
+ productReference = AF794F9E09974A320059A8B0 /* Fiberlamp.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF794FCD09974FA60059A8B0 /* Loop */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF794FDA09974FA60059A8B0 /* Build configuration list for PBXNativeTarget "Loop" */;
+ buildPhases = (
+ AF794FD009974FA60059A8B0 /* Resources */,
+ AF794FD209974FA60059A8B0 /* Sources */,
+ AF794FD509974FA60059A8B0 /* Frameworks */,
+ AF794FD909974FA60059A8B0 /* Rez */,
+ AFA3D93109C03D5100E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF794FCE09974FA60059A8B0 /* PBXTargetDependency */,
+ );
+ name = Loop;
+ productName = Loop;
+ productReference = AF794FDD09974FA60059A8B0 /* Loop.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF7ACFC019FF0A9200BD752B /* GeodesicGears */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF7ACFD119FF0A9200BD752B /* Build configuration list for PBXNativeTarget "GeodesicGears" */;
+ buildPhases = (
+ AF7ACFC319FF0A9200BD752B /* Resources */,
+ AF7ACFC519FF0A9200BD752B /* Sources */,
+ AF7ACFC819FF0A9200BD752B /* Frameworks */,
+ AF7ACFCF19FF0A9200BD752B /* Rez */,
+ AF7ACFD019FF0A9200BD752B /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF7ACFC119FF0A9200BD752B /* PBXTargetDependency */,
+ );
+ name = GeodesicGears;
+ productName = DangerBall;
+ productReference = AF7ACFD419FF0A9200BD752B /* GeodesicGears.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF918977158FC00A002B5D1E /* XScreenSaver-iOS */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF91898C158FC00A002B5D1E /* Build configuration list for PBXNativeTarget "XScreenSaver-iOS" */;
+ buildPhases = (
+ AF7E080115925EE300D81407 /* ICMP Sanity Check */,
+ AF94E7421A16F66900289B93 /* Update Function Table */,
+ AF91897B158FC00A002B5D1E /* Resources */,
+ AF918985158FC00A002B5D1E /* Sources */,
+ AF918989158FC00A002B5D1E /* Frameworks */,
+ AF91898A158FC00A002B5D1E /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF918978158FC00A002B5D1E /* PBXTargetDependency */,
+ AF7E07FE15925DF200D81407 /* PBXTargetDependency */,
+ AF7E080015925DFE00D81407 /* PBXTargetDependency */,
+ AFAC36BD202E80E5001A684C /* PBXTargetDependency */,
+ );
+ name = "XScreenSaver-iOS";
+ productName = SaverTester;
+ productReference = AF91898F158FC00A002B5D1E /* XScreenSaver.app */;
+ productType = "com.apple.product-type.application";
+ };
+ AF97572D099C317000B05160 /* IMSMap */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF97573A099C317000B05160 /* Build configuration list for PBXNativeTarget "IMSMap" */;
+ buildPhases = (
+ AF975730099C317000B05160 /* Resources */,
+ AF975732099C317000B05160 /* Sources */,
+ AF975735099C317000B05160 /* Frameworks */,
+ AF975739099C317000B05160 /* Rez */,
+ AFA3D89109C03C3C00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF97572E099C317000B05160 /* PBXTargetDependency */,
+ );
+ name = IMSMap;
+ productName = IMSMap;
+ productReference = AF97573D099C317000B05160 /* IMSMap.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF975775099C374A00B05160 /* Moire */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF975782099C374A00B05160 /* Build configuration list for PBXNativeTarget "Moire" */;
+ buildPhases = (
+ AF975778099C374A00B05160 /* Resources */,
+ AF97577A099C374A00B05160 /* Sources */,
+ AF97577D099C374A00B05160 /* Frameworks */,
+ AF975781099C374A00B05160 /* Rez */,
+ AFA3D8A909C03C6900E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF975776099C374A00B05160 /* PBXTargetDependency */,
+ );
+ name = Moire;
+ productName = Moire;
+ productReference = AF975785099C374A00B05160 /* Moire.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF9757C2099C3E6300B05160 /* RDbomb */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF9757CF099C3E6300B05160 /* Build configuration list for PBXNativeTarget "RDbomb" */;
+ buildPhases = (
+ AF9757C5099C3E6300B05160 /* Resources */,
+ AF9757C7099C3E6300B05160 /* Sources */,
+ AF9757CA099C3E6300B05160 /* Frameworks */,
+ AF9757CE099C3E6300B05160 /* Rez */,
+ AFA3D8C509C03C9600E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF9757C3099C3E6300B05160 /* PBXTargetDependency */,
+ );
+ name = RDbomb;
+ productName = RDbomb;
+ productReference = AF9757D2099C3E6300B05160 /* RDbomb.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF975808099C41D500B05160 /* XFlame */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF975815099C41D500B05160 /* Build configuration list for PBXNativeTarget "XFlame" */;
+ buildPhases = (
+ AF97580B099C41D500B05160 /* Resources */,
+ AF97580D099C41D500B05160 /* Sources */,
+ AF975810099C41D500B05160 /* Frameworks */,
+ AF975814099C41D500B05160 /* Rez */,
+ AFA3D8F109C03CE100E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF975809099C41D500B05160 /* PBXTargetDependency */,
+ );
+ name = XFlame;
+ productName = XFlame;
+ productReference = AF975818099C41D500B05160 /* XFlame.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF975865099C475900B05160 /* ShadeBobs */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF975872099C475900B05160 /* Build configuration list for PBXNativeTarget "ShadeBobs" */;
+ buildPhases = (
+ AF975868099C475900B05160 /* Resources */,
+ AF97586A099C475900B05160 /* Sources */,
+ AF97586D099C475900B05160 /* Frameworks */,
+ AF975871099C475900B05160 /* Rez */,
+ AFA3D8CF09C03CA800E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF975866099C475900B05160 /* PBXTargetDependency */,
+ );
+ name = ShadeBobs;
+ productName = ShadeBobs;
+ productReference = AF975875099C475900B05160 /* ShadeBobs.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF975A36099C681F00B05160 /* MetaBalls */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF975A43099C681F00B05160 /* Build configuration list for PBXNativeTarget "MetaBalls" */;
+ buildPhases = (
+ AF975A39099C681F00B05160 /* Resources */,
+ AF975A3B099C681F00B05160 /* Sources */,
+ AF975A3E099C681F00B05160 /* Frameworks */,
+ AF975A42099C681F00B05160 /* Rez */,
+ AFA3D8A509C03C6200E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF975A37099C681F00B05160 /* PBXTargetDependency */,
+ );
+ name = MetaBalls;
+ productName = MetaBalls;
+ productReference = AF975A46099C681F00B05160 /* MetaBalls.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF975A6C099C6AB200B05160 /* Eruption */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF975A79099C6AB200B05160 /* Build configuration list for PBXNativeTarget "Eruption" */;
+ buildPhases = (
+ AF975A6F099C6AB200B05160 /* Resources */,
+ AF975A71099C6AB200B05160 /* Sources */,
+ AF975A74099C6AB200B05160 /* Frameworks */,
+ AF975A78099C6AB200B05160 /* Rez */,
+ AFA3D87509C03C0400E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF975A6D099C6AB200B05160 /* PBXTargetDependency */,
+ );
+ name = Eruption;
+ productName = Eruption;
+ productReference = AF975A7C099C6AB200B05160 /* Eruption.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF975A86099C6BC300B05160 /* Barcode */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF975A93099C6BC300B05160 /* Build configuration list for PBXNativeTarget "Barcode" */;
+ buildPhases = (
+ AF975A89099C6BC300B05160 /* Resources */,
+ AF975A8B099C6BC300B05160 /* Sources */,
+ AF975A8E099C6BC300B05160 /* Frameworks */,
+ AF975A92099C6BC300B05160 /* Rez */,
+ AFCCCBCF09C03AF800353F4D /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF975A87099C6BC300B05160 /* PBXTargetDependency */,
+ );
+ name = Barcode;
+ productName = Barcode;
+ productReference = AF975A96099C6BC300B05160 /* Barcode.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF975AD7099C6EB100B05160 /* Fireworkx */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF975AE4099C6EB100B05160 /* Build configuration list for PBXNativeTarget "Fireworkx" */;
+ buildPhases = (
+ AF975ADA099C6EB100B05160 /* Resources */,
+ AF975ADC099C6EB100B05160 /* Sources */,
+ AF975ADF099C6EB100B05160 /* Frameworks */,
+ AF975AE3099C6EB100B05160 /* Rez */,
+ AFA3D87709C03C0A00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF975AD8099C6EB100B05160 /* PBXTargetDependency */,
+ );
+ name = Fireworkx;
+ productName = Fireworkx;
+ productReference = AF975AE7099C6EB100B05160 /* Fireworkx.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF975AFC099C6FE400B05160 /* MemScroller */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF975B09099C6FE400B05160 /* Build configuration list for PBXNativeTarget "MemScroller" */;
+ buildPhases = (
+ AF975AFF099C6FE400B05160 /* Resources */,
+ AF975B01099C6FE400B05160 /* Sources */,
+ AF975B04099C6FE400B05160 /* Frameworks */,
+ AF975B08099C6FE400B05160 /* Rez */,
+ AFA3D8A309C03C5F00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF975AFD099C6FE400B05160 /* PBXTargetDependency */,
+ );
+ name = MemScroller;
+ productName = MemScroller;
+ productReference = AF975B0C099C6FE400B05160 /* MemScroller.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF975C12099C8C1500B05160 /* Halo */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF975C1F099C8C1500B05160 /* Build configuration list for PBXNativeTarget "Halo" */;
+ buildPhases = (
+ AF975C15099C8C1500B05160 /* Resources */,
+ AF975C17099C8C1500B05160 /* Sources */,
+ AF975C1A099C8C1500B05160 /* Frameworks */,
+ AF975C1E099C8C1500B05160 /* Rez */,
+ AFA3D88709C03C2A00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF975C13099C8C1500B05160 /* PBXTargetDependency */,
+ );
+ name = Halo;
+ productName = Halo;
+ productReference = AF975C22099C8C1500B05160 /* Halo.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF975C3D099C8DCF00B05160 /* Greynetic */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF975C4B099C8DCF00B05160 /* Build configuration list for PBXNativeTarget "Greynetic" */;
+ buildPhases = (
+ AF975C40099C8DCF00B05160 /* Resources */,
+ AF975C43099C8DCF00B05160 /* Sources */,
+ AF975C46099C8DCF00B05160 /* Frameworks */,
+ AF975C4A099C8DCF00B05160 /* Rez */,
+ AFA3D88309C03C2400E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF975C3E099C8DCF00B05160 /* PBXTargetDependency */,
+ );
+ name = Greynetic;
+ productName = Greynetic;
+ productReference = AF975C4E099C8DCF00B05160 /* Greynetic.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF975C5D099C8F3F00B05160 /* NoseGuy */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF975C6B099C8F3F00B05160 /* Build configuration list for PBXNativeTarget "NoseGuy" */;
+ buildPhases = (
+ AF975C60099C8F3F00B05160 /* Resources */,
+ AF975C63099C8F3F00B05160 /* Sources */,
+ AF975C66099C8F3F00B05160 /* Frameworks */,
+ AF975C6A099C8F3F00B05160 /* Rez */,
+ AFA3D8B109C03C7600E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF975C5E099C8F3F00B05160 /* PBXTargetDependency */,
+ );
+ name = NoseGuy;
+ productName = NoseGuy;
+ productReference = AF975C6E099C8F3F00B05160 /* NoseGuy.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF975D52099CA0F000B05160 /* Rocks */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF975D60099CA0F000B05160 /* Build configuration list for PBXNativeTarget "Rocks" */;
+ buildPhases = (
+ AF975D55099CA0F000B05160 /* Resources */,
+ AF975D58099CA0F000B05160 /* Sources */,
+ AF975D5B099CA0F000B05160 /* Frameworks */,
+ AF975D5F099CA0F000B05160 /* Rez */,
+ AFA3D8C909C03C9E00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF975D53099CA0F000B05160 /* PBXTargetDependency */,
+ );
+ name = Rocks;
+ productName = Rocks;
+ productReference = AF975D63099CA0F000B05160 /* Rocks.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF976FBB0989CAA2001F8B92 /* Deco */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF976FBE0989CAA4001F8B92 /* Build configuration list for PBXNativeTarget "Deco" */;
+ buildPhases = (
+ AF976FB80989CAA2001F8B92 /* Resources */,
+ AF976FB90989CAA2001F8B92 /* Sources */,
+ AF976FBA0989CAA2001F8B92 /* Frameworks */,
+ AF9770150989D0F6001F8B92 /* Rez */,
+ AFA3D86D09C03BF300E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF480922098C412F00FB32B8 /* PBXTargetDependency */,
+ );
+ name = Deco;
+ productName = Deco;
+ productReference = AF976FBC0989CAA2001F8B92 /* Deco.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF9770290989D1E6001F8B92 /* Rorschach */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF97703D0989D1E6001F8B92 /* Build configuration list for PBXNativeTarget "Rorschach" */;
+ buildPhases = (
+ AF97702A0989D1E6001F8B92 /* Resources */,
+ AF97702C0989D1E6001F8B92 /* Sources */,
+ AF9770390989D1E6001F8B92 /* Frameworks */,
+ AF97703C0989D1E6001F8B92 /* Rez */,
+ AFA3D8CB09C03CA100E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF48092A098C419000FB32B8 /* PBXTargetDependency */,
+ );
+ name = Rorschach;
+ productName = Rorschach;
+ productReference = AF9770400989D1E6001F8B92 /* Rorschach.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF9770660989D2F6001F8B92 /* Attraction */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF97707A0989D2F6001F8B92 /* Build configuration list for PBXNativeTarget "Attraction" */;
+ buildPhases = (
+ AF9770670989D2F6001F8B92 /* Resources */,
+ AF9770690989D2F6001F8B92 /* Sources */,
+ AF9770760989D2F6001F8B92 /* Frameworks */,
+ AF9770790989D2F6001F8B92 /* Rez */,
+ AFCCCBCD09C03AF400353F4D /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF48092D098C41AE00FB32B8 /* PBXTargetDependency */,
+ );
+ name = Attraction;
+ productName = Attraction;
+ productReference = AF97707D0989D2F6001F8B92 /* Attraction.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF9771D60989DC4A001F8B92 /* SaverTester */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF9771DA0989DC4B001F8B92 /* Build configuration list for PBXNativeTarget "SaverTester" */;
+ buildPhases = (
+ AF9771D30989DC4A001F8B92 /* Resources */,
+ AF9771D40989DC4A001F8B92 /* Sources */,
+ AF9771D50989DC4A001F8B92 /* Frameworks */,
+ AF578FA11434E918002455DD /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF480936098C421200FB32B8 /* PBXTargetDependency */,
+ );
+ name = SaverTester;
+ productName = SaverTester;
+ productReference = AF9771D70989DC4A001F8B92 /* SaverTester.app */;
+ productType = "com.apple.product-type.application";
+ };
+ AF998EDA0A083DB30051049D /* TopBlock */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF998EEB0A083DB30051049D /* Build configuration list for PBXNativeTarget "TopBlock" */;
+ buildPhases = (
+ AF998EDD0A083DB30051049D /* Resources */,
+ AF998EDF0A083DB30051049D /* Sources */,
+ AF998EE20A083DB30051049D /* Frameworks */,
+ AF998EE90A083DB30051049D /* Rez */,
+ AF998EEA0A083DB30051049D /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF998EDB0A083DB30051049D /* PBXTargetDependency */,
+ );
+ name = TopBlock;
+ productName = TopBlock;
+ productReference = AF998EEE0A083DB30051049D /* TopBlock.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF9D466609B5109C006E59CF /* DecayScreen */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF9D467309B5109C006E59CF /* Build configuration list for PBXNativeTarget "DecayScreen" */;
+ buildPhases = (
+ AF9D466909B5109C006E59CF /* Resources */,
+ AF9D466B09B5109C006E59CF /* Sources */,
+ AF9D466E09B5109C006E59CF /* Frameworks */,
+ AF9D467209B5109C006E59CF /* Rez */,
+ AFA3D86B09C03BEF00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF9D466709B5109C006E59CF /* PBXTargetDependency */,
+ );
+ name = DecayScreen;
+ productName = DecayScreen;
+ productReference = AF9D467609B5109C006E59CF /* DecayScreen.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF9D474409B5300A006E59CF /* SlideScreen */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF9D475109B5300A006E59CF /* Build configuration list for PBXNativeTarget "SlideScreen" */;
+ buildPhases = (
+ AF9D474709B5300A006E59CF /* Resources */,
+ AF9D474909B5300A006E59CF /* Sources */,
+ AF9D474C09B5300A006E59CF /* Frameworks */,
+ AF9D475009B5300A006E59CF /* Rez */,
+ AFA3D8D109C03CAB00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF9D474509B5300A006E59CF /* PBXTargetDependency */,
+ );
+ name = SlideScreen;
+ productName = SlideScreen;
+ productReference = AF9D475409B5300A006E59CF /* SlideScreen.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF9D475F09B53166006E59CF /* Zoom */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF9D476C09B53166006E59CF /* Build configuration list for PBXNativeTarget "Zoom" */;
+ buildPhases = (
+ AF9D476209B53166006E59CF /* Resources */,
+ AF9D476409B53166006E59CF /* Sources */,
+ AF9D476709B53166006E59CF /* Frameworks */,
+ AF9D476B09B53166006E59CF /* Rez */,
+ AFA3D8FF09C03CF700E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF9D476009B53166006E59CF /* PBXTargetDependency */,
+ );
+ name = Zoom;
+ productName = Zoom;
+ productReference = AF9D476F09B53166006E59CF /* Zoom.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF9D48DB09B53322006E59CF /* Bumps */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF9D48E809B53322006E59CF /* Build configuration list for PBXNativeTarget "Bumps" */;
+ buildPhases = (
+ AF9D48DE09B53322006E59CF /* Resources */,
+ AF9D48E009B53322006E59CF /* Sources */,
+ AF9D48E309B53322006E59CF /* Frameworks */,
+ AF9D48E709B53322006E59CF /* Rez */,
+ AFA3D85B09C03BD300E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF9D48DC09B53322006E59CF /* PBXTargetDependency */,
+ );
+ name = Bumps;
+ productName = Bumps;
+ productReference = AF9D48EB09B53322006E59CF /* Bumps.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF9D48F409B535DA006E59CF /* Distort */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF9D490109B535DA006E59CF /* Build configuration list for PBXNativeTarget "Distort" */;
+ buildPhases = (
+ AF9D48F709B535DA006E59CF /* Resources */,
+ AF9D48F909B535DA006E59CF /* Sources */,
+ AF9D48FC09B535DA006E59CF /* Frameworks */,
+ AF9D490009B535DA006E59CF /* Rez */,
+ AFA3D87109C03BFB00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF9D48F509B535DA006E59CF /* PBXTargetDependency */,
+ );
+ name = Distort;
+ productName = Distort;
+ productReference = AF9D490409B535DA006E59CF /* Distort.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF9D492B09B53CBA006E59CF /* Ripples */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF9D493809B53CBA006E59CF /* Build configuration list for PBXNativeTarget "Ripples" */;
+ buildPhases = (
+ AF9D492E09B53CBA006E59CF /* Resources */,
+ AF9D493009B53CBA006E59CF /* Sources */,
+ AF9D493309B53CBA006E59CF /* Frameworks */,
+ AF9D493709B53CBA006E59CF /* Rez */,
+ AFA3D8C709C03C9900E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF9D492C09B53CBA006E59CF /* PBXTargetDependency */,
+ );
+ name = Ripples;
+ productName = Ripples;
+ productReference = AF9D493B09B53CBA006E59CF /* Ripples.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF9D495409B53FC9006E59CF /* RotZoomer */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF9D496109B53FC9006E59CF /* Build configuration list for PBXNativeTarget "RotZoomer" */;
+ buildPhases = (
+ AF9D495709B53FC9006E59CF /* Resources */,
+ AF9D495909B53FC9006E59CF /* Sources */,
+ AF9D495C09B53FC9006E59CF /* Frameworks */,
+ AF9D496009B53FC9006E59CF /* Rez */,
+ AFA3D8CD09C03CA400E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF9D495509B53FC9006E59CF /* PBXTargetDependency */,
+ );
+ name = RotZoomer;
+ productName = RotZoomer;
+ productReference = AF9D496409B53FC9006E59CF /* RotZoomer.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF9D496C09B5411D006E59CF /* Twang */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF9D497909B5411D006E59CF /* Build configuration list for PBXNativeTarget "Twang" */;
+ buildPhases = (
+ AF9D496F09B5411D006E59CF /* Resources */,
+ AF9D497109B5411D006E59CF /* Sources */,
+ AF9D497409B5411D006E59CF /* Frameworks */,
+ AF9D497809B5411D006E59CF /* Rez */,
+ AFA3D8E509C03CCD00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF9D496D09B5411D006E59CF /* PBXTargetDependency */,
+ );
+ name = Twang;
+ productName = Twang;
+ productReference = AF9D497C09B5411D006E59CF /* Twang.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF9D499709B544C2006E59CF /* Spotlight */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF9D49A409B544C2006E59CF /* Build configuration list for PBXNativeTarget "Spotlight" */;
+ buildPhases = (
+ AF9D499A09B544C2006E59CF /* Resources */,
+ AF9D499C09B544C2006E59CF /* Sources */,
+ AF9D499F09B544C2006E59CF /* Frameworks */,
+ AF9D49A309B544C2006E59CF /* Rez */,
+ AFA3D8D909C03CB700E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF9D499809B544C2006E59CF /* PBXTargetDependency */,
+ );
+ name = Spotlight;
+ productName = Spotlight;
+ productReference = AF9D49A709B544C3006E59CF /* Spotlight.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF9D4C6909B59F27006E59CF /* XLyap */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF9D4C7609B59F27006E59CF /* Build configuration list for PBXNativeTarget "XLyap" */;
+ buildPhases = (
+ AF9D4C6C09B59F27006E59CF /* Resources */,
+ AF9D4C6E09B59F27006E59CF /* Sources */,
+ AF9D4C7109B59F27006E59CF /* Frameworks */,
+ AF9D4C7509B59F27006E59CF /* Rez */,
+ AFA3D8F709C03CEA00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF9D4C6A09B59F27006E59CF /* PBXTargetDependency */,
+ );
+ name = XLyap;
+ productName = XLyap;
+ productReference = AF9D4C7909B59F27006E59CF /* XLyap.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF9D4CE709B5AA8E006E59CF /* Pong */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF9D4CF409B5AA8E006E59CF /* Build configuration list for PBXNativeTarget "Pong" */;
+ buildPhases = (
+ AF9D4CEA09B5AA8E006E59CF /* Resources */,
+ AF9D4CEC09B5AA8E006E59CF /* Sources */,
+ AF9D4CEF09B5AA8E006E59CF /* Frameworks */,
+ AF9D4CF309B5AA8E006E59CF /* Rez */,
+ AFA3D8BD09C03C8900E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF9D4CE809B5AA8E006E59CF /* PBXTargetDependency */,
+ );
+ name = Pong;
+ productName = Pong;
+ productReference = AF9D4CF709B5AA8E006E59CF /* Pong.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF9D4D7E09B5B2DC006E59CF /* XAnalogTV */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF9D4D8C09B5B2DC006E59CF /* Build configuration list for PBXNativeTarget "XAnalogTV" */;
+ buildPhases = (
+ AF9D4D8109B5B2DC006E59CF /* Resources */,
+ AF9D4D8309B5B2DC006E59CF /* Sources */,
+ AF9D4D8709B5B2DC006E59CF /* Frameworks */,
+ AF9D4D8B09B5B2DC006E59CF /* Rez */,
+ AFA3D8F309C03CE400E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF9D4D7F09B5B2DC006E59CF /* PBXTargetDependency */,
+ );
+ name = XAnalogTV;
+ productName = XAnalogTV;
+ productReference = AF9D4D8F09B5B2DC006E59CF /* XAnalogTV.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF9D4DAF09B5B71E006E59CF /* BSOD */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF9D4DBD09B5B71E006E59CF /* Build configuration list for PBXNativeTarget "BSOD" */;
+ buildPhases = (
+ AF9D4DB209B5B71E006E59CF /* Resources */,
+ AF9D4DB409B5B71E006E59CF /* Sources */,
+ AF9D4DB809B5B71E006E59CF /* Frameworks */,
+ AF9D4DBC09B5B71E006E59CF /* Rez */,
+ AFA3D69209C03B5C00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF9D4DB009B5B71E006E59CF /* PBXTargetDependency */,
+ );
+ name = BSOD;
+ productName = BSOD;
+ productReference = AF9D4DC009B5B71E006E59CF /* BSOD.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF9D4DEC09B5BB19006E59CF /* Apple2 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF9D4DFB09B5BB19006E59CF /* Build configuration list for PBXNativeTarget "Apple2" */;
+ buildPhases = (
+ AF9D4DEF09B5BB19006E59CF /* Resources */,
+ AF9D4DF109B5BB19006E59CF /* Sources */,
+ AF9D4DF609B5BB19006E59CF /* Frameworks */,
+ AF9D4DFA09B5BB19006E59CF /* Rez */,
+ AFCCCBCB09C03AEE00353F4D /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AF9D4DED09B5BB19006E59CF /* PBXTargetDependency */,
+ );
+ name = Apple2;
+ productName = Apple2;
+ productReference = AF9D4DFE09B5BB19006E59CF /* Apple2.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AF9E7EBE190F4C1B00A8B01F /* enable_gc */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AF9E7EC5190F4C1C00A8B01F /* Build configuration list for PBXNativeTarget "enable_gc" */;
+ buildPhases = (
+ AF9E7EBB190F4C1B00A8B01F /* Sources */,
+ AF9E7EBC190F4C1B00A8B01F /* Frameworks */,
+ AF9E7EBD190F4C1B00A8B01F /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = enable_gc;
+ productName = enable_gc;
+ productReference = AF9E7EBF190F4C1B00A8B01F /* enable_gc */;
+ productType = "com.apple.product-type.tool";
+ };
+ AFA2118C1CD59DAF00C0D2A1 /* RaverHoop */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA2119E1CD59DAF00C0D2A1 /* Build configuration list for PBXNativeTarget "RaverHoop" */;
+ buildPhases = (
+ AFA2118F1CD59DAF00C0D2A1 /* Resources */,
+ AFA211911CD59DAF00C0D2A1 /* Sources */,
+ AFA211941CD59DAF00C0D2A1 /* Frameworks */,
+ AFA2119C1CD59DAF00C0D2A1 /* Rez */,
+ AFA2119D1CD59DAF00C0D2A1 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA2118D1CD59DAF00C0D2A1 /* PBXTargetDependency */,
+ );
+ name = RaverHoop;
+ productName = DangerBall;
+ productReference = AFA211A11CD59DAF00C0D2A1 /* RaverHoop.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA3392E0B058505002B0E7D /* WebCollage */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA3393D0B058505002B0E7D /* Build configuration list for PBXNativeTarget "WebCollage" */;
+ buildPhases = (
+ AFA339310B058505002B0E7D /* Resources */,
+ AFA339340B058505002B0E7D /* Sources */,
+ AFA339370B058505002B0E7D /* Frameworks */,
+ AFA3393B0B058505002B0E7D /* Rez */,
+ AFA3393C0B058505002B0E7D /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA3392F0B058505002B0E7D /* PBXTargetDependency */,
+ AFA33BDC0B058952002B0E7D /* PBXTargetDependency */,
+ AFA33C040B058E3C002B0E7D /* PBXTargetDependency */,
+ );
+ name = WebCollage;
+ productName = WebCollage;
+ productReference = AFA339400B058505002B0E7D /* WebCollage.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA33BC60B058740002B0E7D /* webcollage-helper */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA33BCB0B058754002B0E7D /* Build configuration list for PBXNativeTarget "webcollage-helper" */;
+ buildPhases = (
+ AFA33BC40B058740002B0E7D /* Sources */,
+ AFA33BC50B058740002B0E7D /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "webcollage-helper";
+ productName = "webcollage-helper";
+ productReference = AFA33BC70B058740002B0E7D /* webcollage-helper */;
+ productType = "com.apple.product-type.tool";
+ };
+ AFA55946099330B000F3E977 /* Cage */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55957099330B000F3E977 /* Build configuration list for PBXNativeTarget "Cage" */;
+ buildPhases = (
+ AFA55949099330B000F3E977 /* Resources */,
+ AFA5594B099330B000F3E977 /* Sources */,
+ AFA5594F099330B000F3E977 /* Frameworks */,
+ AFA55956099330B000F3E977 /* Rez */,
+ AFA3D96309C03DB500E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55947099330B000F3E977 /* PBXTargetDependency */,
+ );
+ name = Cage;
+ productName = Cage;
+ productReference = AFA5595A099330B000F3E977 /* Cage.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA5596D0993317900F3E977 /* Moebius */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA5597C0993317900F3E977 /* Build configuration list for PBXNativeTarget "Moebius" */;
+ buildPhases = (
+ AFA559700993317900F3E977 /* Resources */,
+ AFA559720993317900F3E977 /* Sources */,
+ AFA559740993317900F3E977 /* Frameworks */,
+ AFA5597B0993317900F3E977 /* Rez */,
+ AFA3D9AB09C03E4200E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA5596E0993317900F3E977 /* PBXTargetDependency */,
+ );
+ name = Moebius;
+ productName = Moebius;
+ productReference = AFA5597F0993317900F3E977 /* Moebius.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA559920993322100F3E977 /* Superquadrics */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA559A10993322100F3E977 /* Build configuration list for PBXNativeTarget "Superquadrics" */;
+ buildPhases = (
+ AFA559950993322100F3E977 /* Resources */,
+ AFA559970993322100F3E977 /* Sources */,
+ AFA559990993322100F3E977 /* Frameworks */,
+ AFA559A00993322100F3E977 /* Rez */,
+ AFA3D9D109C03E8B00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA559930993322100F3E977 /* PBXTargetDependency */,
+ );
+ name = Superquadrics;
+ productName = Superquadrics;
+ productReference = AFA559A40993322100F3E977 /* Superquadrics.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA559B50993328000F3E977 /* Morph3D */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA559C40993328000F3E977 /* Build configuration list for PBXNativeTarget "Morph3D" */;
+ buildPhases = (
+ AFA559B80993328000F3E977 /* Resources */,
+ AFA559BA0993328000F3E977 /* Sources */,
+ AFA559BC0993328000F3E977 /* Frameworks */,
+ AFA559C30993328000F3E977 /* Rez */,
+ AFA3D9AF09C03E4B00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA559B60993328000F3E977 /* PBXTargetDependency */,
+ );
+ name = Morph3D;
+ productName = Morph3D;
+ productReference = AFA559C70993328000F3E977 /* Morph3D.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA559CF0993330600F3E977 /* Rubik */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA559DE0993330600F3E977 /* Build configuration list for PBXNativeTarget "Rubik" */;
+ buildPhases = (
+ AFA559D20993330600F3E977 /* Resources */,
+ AFA559D40993330600F3E977 /* Sources */,
+ AFA559D60993330600F3E977 /* Frameworks */,
+ AFA559DD0993330600F3E977 /* Rez */,
+ AFA3D9C109C03E6E00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA559D00993330600F3E977 /* PBXTargetDependency */,
+ );
+ name = Rubik;
+ productName = Rubik;
+ productReference = AFA559E10993330600F3E977 /* Rubik.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55A030993340300F3E977 /* Stairs */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55A120993340300F3E977 /* Build configuration list for PBXNativeTarget "Stairs" */;
+ buildPhases = (
+ AFA55A060993340300F3E977 /* Resources */,
+ AFA55A080993340300F3E977 /* Sources */,
+ AFA55A0A0993340300F3E977 /* Frameworks */,
+ AFA55A110993340300F3E977 /* Rez */,
+ AFA3D9CB09C03E7F00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55A040993340300F3E977 /* PBXTargetDependency */,
+ );
+ name = Stairs;
+ productName = Stairs;
+ productReference = AFA55A150993340300F3E977 /* Stairs.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55A20099334A000F3E977 /* Sproingies */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55A2F099334A000F3E977 /* Build configuration list for PBXNativeTarget "Sproingies" */;
+ buildPhases = (
+ AFA55A23099334A000F3E977 /* Resources */,
+ AFA55A25099334A000F3E977 /* Sources */,
+ AFA55A27099334A000F3E977 /* Frameworks */,
+ AFA55A2E099334A000F3E977 /* Rez */,
+ AFA3D9C909C03E7C00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55A21099334A000F3E977 /* PBXTargetDependency */,
+ );
+ name = Sproingies;
+ productName = Sproingies;
+ productReference = AFA55A32099334A000F3E977 /* Sproingies.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55A790993364300F3E977 /* Lament */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55A880993364300F3E977 /* Build configuration list for PBXNativeTarget "Lament" */;
+ buildPhases = (
+ AFA55A7C0993364300F3E977 /* Resources */,
+ AFA55A7E0993364300F3E977 /* Sources */,
+ AFA55A800993364300F3E977 /* Frameworks */,
+ AFA55A870993364300F3E977 /* Rez */,
+ AFA3D9A309C03E3200E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55A7A0993364300F3E977 /* PBXTargetDependency */,
+ );
+ name = Lament;
+ productName = Lament;
+ productReference = AFA55A8B0993364300F3E977 /* Lament.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55ACF09933CEF00F3E977 /* Bubble3D */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55ADE09933CEF00F3E977 /* Build configuration list for PBXNativeTarget "Bubble3D" */;
+ buildPhases = (
+ AFA55AD209933CEF00F3E977 /* Resources */,
+ AFA55AD409933CEF00F3E977 /* Sources */,
+ AFA55AD609933CEF00F3E977 /* Frameworks */,
+ AFA55ADD09933CEF00F3E977 /* Rez */,
+ AFA3D96109C03DB100E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55AD009933CEF00F3E977 /* PBXTargetDependency */,
+ );
+ name = Bubble3D;
+ productName = Bubble3D;
+ productReference = AFA55AE109933CEF00F3E977 /* Bubble3D.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55B0909933E0500F3E977 /* GLPlanet */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55B1B09933E0500F3E977 /* Build configuration list for PBXNativeTarget "GLPlanet" */;
+ buildPhases = (
+ AFA55B0C09933E0500F3E977 /* Resources */,
+ AFA55B0E09933E0500F3E977 /* Sources */,
+ AFA55B1309933E0500F3E977 /* Frameworks */,
+ AFA55B1A09933E0500F3E977 /* Rez */,
+ AFA3D99309C03E1600E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55B0A09933E0500F3E977 /* PBXTargetDependency */,
+ );
+ name = GLPlanet;
+ productName = GLPlanet;
+ productReference = AFA55B1E09933E0500F3E977 /* GLPlanet.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55B2509933E8D00F3E977 /* Pulsar */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55B3409933E8D00F3E977 /* Build configuration list for PBXNativeTarget "Pulsar" */;
+ buildPhases = (
+ AFA55B2809933E8D00F3E977 /* Resources */,
+ AFA55B2A09933E8D00F3E977 /* Sources */,
+ AFA55B2C09933E8D00F3E977 /* Frameworks */,
+ AFA55B3309933E8D00F3E977 /* Rez */,
+ AFA3D9BD09C03E6500E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55B2609933E8D00F3E977 /* PBXTargetDependency */,
+ );
+ name = Pulsar;
+ productName = Pulsar;
+ productReference = AFA55B3709933E8D00F3E977 /* Pulsar.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55B7909933F7200F3E977 /* Sierpinski3D */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55B8809933F7200F3E977 /* Build configuration list for PBXNativeTarget "Sierpinski3D" */;
+ buildPhases = (
+ AFA55B7C09933F7200F3E977 /* Resources */,
+ AFA55B7E09933F7200F3E977 /* Sources */,
+ AFA55B8009933F7200F3E977 /* Frameworks */,
+ AFA55B8709933F7200F3E977 /* Rez */,
+ AFA3D9C509C03E7400E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55B7A09933F7200F3E977 /* PBXTargetDependency */,
+ );
+ name = Sierpinski3D;
+ productName = Sierpinski3D;
+ productReference = AFA55B8B09933F7200F3E977 /* Sierpinski3D.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55B9109933FDA00F3E977 /* GFlux */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55BA009933FDA00F3E977 /* Build configuration list for PBXNativeTarget "GFlux" */;
+ buildPhases = (
+ AFA55B9409933FDA00F3E977 /* Resources */,
+ AFA55B9609933FDA00F3E977 /* Sources */,
+ AFA55B9809933FDA00F3E977 /* Frameworks */,
+ AFA55B9F09933FDA00F3E977 /* Rez */,
+ AFA3D98709C03DF400E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55B9209933FDA00F3E977 /* PBXTargetDependency */,
+ );
+ name = GFlux;
+ productName = GFlux;
+ productReference = AFA55BA309933FDA00F3E977 /* GFlux.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55BAB099340CE00F3E977 /* Circuit */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55BBA099340CE00F3E977 /* Build configuration list for PBXNativeTarget "Circuit" */;
+ buildPhases = (
+ AFA55BAE099340CE00F3E977 /* Resources */,
+ AFA55BB0099340CE00F3E977 /* Sources */,
+ AFA55BB2099340CE00F3E977 /* Frameworks */,
+ AFA55BB9099340CE00F3E977 /* Rez */,
+ AFA3D96709C03DBC00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55BAC099340CE00F3E977 /* PBXTargetDependency */,
+ );
+ name = Circuit;
+ productName = Circuit;
+ productReference = AFA55BBD099340CE00F3E977 /* Circuit.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55BE40993429100F3E977 /* Menger */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55BF30993429100F3E977 /* Build configuration list for PBXNativeTarget "Menger" */;
+ buildPhases = (
+ AFA55BE70993429100F3E977 /* Resources */,
+ AFA55BE90993429100F3E977 /* Sources */,
+ AFA55BEB0993429100F3E977 /* Frameworks */,
+ AFA55BF20993429100F3E977 /* Rez */,
+ AFA3D9A709C03E3A00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55BE50993429100F3E977 /* PBXTargetDependency */,
+ );
+ name = Menger;
+ productName = Menger;
+ productReference = AFA55BF60993429100F3E977 /* Menger.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55C0E0993431300F3E977 /* Engine */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55C1D0993431300F3E977 /* Build configuration list for PBXNativeTarget "Engine" */;
+ buildPhases = (
+ AFA55C110993431300F3E977 /* Resources */,
+ AFA55C130993431300F3E977 /* Sources */,
+ AFA55C150993431300F3E977 /* Frameworks */,
+ AFA55C1C0993431300F3E977 /* Rez */,
+ AFA3D97709C03DDA00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55C0F0993431300F3E977 /* PBXTargetDependency */,
+ );
+ name = Engine;
+ productName = Engine;
+ productReference = AFA55C200993431300F3E977 /* Engine.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55C77099349A600F3E977 /* GLSnake */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55C86099349A600F3E977 /* Build configuration list for PBXNativeTarget "GLSnake" */;
+ buildPhases = (
+ AFA55C7A099349A600F3E977 /* Resources */,
+ AFA55C7C099349A600F3E977 /* Sources */,
+ AFA55C7E099349A600F3E977 /* Frameworks */,
+ AFA55C85099349A600F3E977 /* Rez */,
+ AFA3D99709C03E1C00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55C78099349A600F3E977 /* PBXTargetDependency */,
+ );
+ name = GLSnake;
+ productName = GLSnake;
+ productReference = AFA55C89099349A600F3E977 /* GLSnake.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55CA909934BB200F3E977 /* Boxed */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55CB809934BB200F3E977 /* Build configuration list for PBXNativeTarget "Boxed" */;
+ buildPhases = (
+ AFA55CAC09934BB200F3E977 /* Resources */,
+ AFA55CAE09934BB200F3E977 /* Sources */,
+ AFA55CB009934BB200F3E977 /* Frameworks */,
+ AFA55CB709934BB200F3E977 /* Rez */,
+ AFA3D95F09C03DAE00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55CAA09934BB200F3E977 /* PBXTargetDependency */,
+ );
+ name = Boxed;
+ productName = Boxed;
+ productReference = AFA55CBB09934BB200F3E977 /* Boxed.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55CCC09934CE400F3E977 /* GLForestFire */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55CDB09934CE400F3E977 /* Build configuration list for PBXNativeTarget "GLForestFire" */;
+ buildPhases = (
+ AFA55CCF09934CE400F3E977 /* Resources */,
+ AFA55CD109934CE400F3E977 /* Sources */,
+ AFA55CD309934CE400F3E977 /* Frameworks */,
+ AFA55CDA09934CE400F3E977 /* Rez */,
+ AFA3D98B09C03DFC00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55CCD09934CE400F3E977 /* PBXTargetDependency */,
+ );
+ name = GLForestFire;
+ productName = GLForestFire;
+ productReference = AFA55CDE09934CE400F3E977 /* GLForestFire.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55D3C0993565300F3E977 /* SBalls */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55D4B0993565300F3E977 /* Build configuration list for PBXNativeTarget "SBalls" */;
+ buildPhases = (
+ AFA55D3F0993565300F3E977 /* Resources */,
+ AFA55D410993565300F3E977 /* Sources */,
+ AFA55D430993565300F3E977 /* Frameworks */,
+ AFA55D4A0993565300F3E977 /* Rez */,
+ AFA3D9C309C03E7100E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55D3D0993565300F3E977 /* PBXTargetDependency */,
+ );
+ name = SBalls;
+ productName = SBalls;
+ productReference = AFA55D4E0993565300F3E977 /* SBalls.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55D620993584B00F3E977 /* Cubenetic */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55D710993584B00F3E977 /* Build configuration list for PBXNativeTarget "Cubenetic" */;
+ buildPhases = (
+ AFA55D650993584B00F3E977 /* Resources */,
+ AFA55D670993584B00F3E977 /* Sources */,
+ AFA55D690993584B00F3E977 /* Frameworks */,
+ AFA55D700993584B00F3E977 /* Rez */,
+ AFA3D96D09C03DCA00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55D630993584B00F3E977 /* PBXTargetDependency */,
+ );
+ name = Cubenetic;
+ productName = Cubenetic;
+ productReference = AFA55D740993584B00F3E977 /* Cubenetic.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55D7F099358C400F3E977 /* Spheremonics */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55D8E099358C400F3E977 /* Build configuration list for PBXNativeTarget "Spheremonics" */;
+ buildPhases = (
+ AFA55D82099358C400F3E977 /* Resources */,
+ AFA55D84099358C400F3E977 /* Sources */,
+ AFA55D86099358C400F3E977 /* Frameworks */,
+ AFA55D8D099358C400F3E977 /* Rez */,
+ AFA3D9C709C03E7800E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55D80099358C400F3E977 /* PBXTargetDependency */,
+ );
+ name = Spheremonics;
+ productName = Spheremonics;
+ productReference = AFA55D91099358C400F3E977 /* Spheremonics.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55DC809935D7000F3E977 /* Lavalite */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55DD709935D7000F3E977 /* Build configuration list for PBXNativeTarget "Lavalite" */;
+ buildPhases = (
+ AFA55DCB09935D7000F3E977 /* Resources */,
+ AFA55DCD09935D7000F3E977 /* Sources */,
+ AFA55DCF09935D7000F3E977 /* Frameworks */,
+ AFA55DD609935D7000F3E977 /* Rez */,
+ AFA3D9A509C03E3600E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55DC909935D7000F3E977 /* PBXTargetDependency */,
+ );
+ name = Lavalite;
+ productName = Lavalite;
+ productReference = AFA55DDA09935D7000F3E977 /* Lavalite.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55DF009935E4900F3E977 /* Queens */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55E0009935E4900F3E977 /* Build configuration list for PBXNativeTarget "Queens" */;
+ buildPhases = (
+ AFA55DF309935E4900F3E977 /* Resources */,
+ AFA55DF509935E4900F3E977 /* Sources */,
+ AFA55DF809935E4900F3E977 /* Frameworks */,
+ AFA55DFF09935E4900F3E977 /* Rez */,
+ AFA3D9BF09C03E6900E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55DF109935E4900F3E977 /* PBXTargetDependency */,
+ );
+ name = Queens;
+ productName = Queens;
+ productReference = AFA55E0309935E4900F3E977 /* Queens.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55E0D09935EDC00F3E977 /* Endgame */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55E1C09935EDC00F3E977 /* Build configuration list for PBXNativeTarget "Endgame" */;
+ buildPhases = (
+ AFA55E1009935EDC00F3E977 /* Resources */,
+ AFA55E1209935EDC00F3E977 /* Sources */,
+ AFA55E1409935EDC00F3E977 /* Frameworks */,
+ AFA55E1B09935EDC00F3E977 /* Rez */,
+ AFA3D97509C03DD700E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55E0E09935EDC00F3E977 /* PBXTargetDependency */,
+ );
+ name = Endgame;
+ productName = Endgame;
+ productReference = AFA55E1F09935EDC00F3E977 /* Endgame.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55E2F09935F8E00F3E977 /* GLBlur */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55E3F09935F8E00F3E977 /* Build configuration list for PBXNativeTarget "GLBlur" */;
+ buildPhases = (
+ AFA55E3209935F8E00F3E977 /* Resources */,
+ AFA55E3409935F8E00F3E977 /* Sources */,
+ AFA55E3709935F8E00F3E977 /* Frameworks */,
+ AFA55E3E09935F8E00F3E977 /* Rez */,
+ AFA3D98909C03DF700E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55E3009935F8E00F3E977 /* PBXTargetDependency */,
+ );
+ name = GLBlur;
+ productName = GLBlur;
+ productReference = AFA55E4209935F8E00F3E977 /* GLBlur.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55E4E09935FF900F3E977 /* FlyingToasters */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55E5D09935FF900F3E977 /* Build configuration list for PBXNativeTarget "FlyingToasters" */;
+ buildPhases = (
+ AFA55E5109935FF900F3E977 /* Resources */,
+ AFA55E5309935FF900F3E977 /* Sources */,
+ AFA55E5509935FF900F3E977 /* Frameworks */,
+ AFA55E5C09935FF900F3E977 /* Rez */,
+ AFA3D98109C03DEA00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55E4F09935FF900F3E977 /* PBXTargetDependency */,
+ );
+ name = FlyingToasters;
+ productName = FlyingToasters;
+ productReference = AFA55E6009935FF900F3E977 /* FlyingToasters.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55EC7099360E300F3E977 /* BouncingCow */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55EE0099360E300F3E977 /* Build configuration list for PBXNativeTarget "BouncingCow" */;
+ buildPhases = (
+ AFA55ECA099360E300F3E977 /* Resources */,
+ AFA55ECC099360E300F3E977 /* Sources */,
+ AFA55ED8099360E300F3E977 /* Frameworks */,
+ AFA55EDF099360E300F3E977 /* Rez */,
+ AFA3D95D09C03DAB00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55EC8099360E300F3E977 /* PBXTargetDependency */,
+ );
+ name = BouncingCow;
+ productName = BouncingCow;
+ productReference = AFA55EE3099360E300F3E977 /* BouncingCow.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55F06099361B700F3E977 /* JigglyPuff */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55F1B099361B700F3E977 /* Build configuration list for PBXNativeTarget "JigglyPuff" */;
+ buildPhases = (
+ AFA55F09099361B700F3E977 /* Resources */,
+ AFA55F0B099361B700F3E977 /* Sources */,
+ AFA55F13099361B700F3E977 /* Frameworks */,
+ AFA55F1A099361B700F3E977 /* Rez */,
+ AFA3D99D09C03E2600E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55F07099361B700F3E977 /* PBXTargetDependency */,
+ );
+ name = JigglyPuff;
+ productName = JigglyPuff;
+ productReference = AFA55F1E099361B700F3E977 /* JigglyPuff.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55F2A0993622F00F3E977 /* Klein */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55F390993622F00F3E977 /* Build configuration list for PBXNativeTarget "Klein" */;
+ buildPhases = (
+ AFA55F2D0993622F00F3E977 /* Resources */,
+ AFA55F2F0993622F00F3E977 /* Sources */,
+ AFA55F310993622F00F3E977 /* Frameworks */,
+ AFA55F380993622F00F3E977 /* Rez */,
+ AFA3D9A109C03E2E00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55F2B0993622F00F3E977 /* PBXTargetDependency */,
+ );
+ name = Klein;
+ productName = Klein;
+ productReference = AFA55F3C0993622F00F3E977 /* Klein.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55F420993629000F3E977 /* Hypertorus */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55F510993629000F3E977 /* Build configuration list for PBXNativeTarget "Hypertorus" */;
+ buildPhases = (
+ AFA55F450993629000F3E977 /* Resources */,
+ AFA55F470993629000F3E977 /* Sources */,
+ AFA55F490993629000F3E977 /* Frameworks */,
+ AFA55F500993629000F3E977 /* Rez */,
+ AFA3D99B09C03E2300E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55F430993629000F3E977 /* PBXTargetDependency */,
+ );
+ name = Hypertorus;
+ productName = HyperTorus;
+ productReference = AFA55F540993629000F3E977 /* Hypertorus.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55F720993643600F3E977 /* GLMatrix */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55F810993643600F3E977 /* Build configuration list for PBXNativeTarget "GLMatrix" */;
+ buildPhases = (
+ AFA55F750993643600F3E977 /* Resources */,
+ AFA55F770993643600F3E977 /* Sources */,
+ AFA55F790993643600F3E977 /* Frameworks */,
+ AFA55F800993643600F3E977 /* Rez */,
+ AFA3D99109C03E1200E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55F730993643600F3E977 /* PBXTargetDependency */,
+ );
+ name = GLMatrix;
+ productName = GLMatrix;
+ productReference = AFA55F840993643600F3E977 /* GLMatrix.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55FD309936BFA00F3E977 /* CubeStorm */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA55FE209936BFA00F3E977 /* Build configuration list for PBXNativeTarget "CubeStorm" */;
+ buildPhases = (
+ AFA55FD609936BFA00F3E977 /* Resources */,
+ AFA55FD809936BFA00F3E977 /* Sources */,
+ AFA55FDA09936BFA00F3E977 /* Frameworks */,
+ AFA55FE109936BFA00F3E977 /* Rez */,
+ AFA3D96F09C03DCD00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55FD409936BFA00F3E977 /* PBXTargetDependency */,
+ );
+ name = CubeStorm;
+ productName = CubeStorm;
+ productReference = AFA55FE509936BFA00F3E977 /* CubeStorm.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA55FF909936C6D00F3E977 /* GLKnots */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA5600809936C6D00F3E977 /* Build configuration list for PBXNativeTarget "GLKnots" */;
+ buildPhases = (
+ AFA55FFC09936C6D00F3E977 /* Resources */,
+ AFA55FFE09936C6D00F3E977 /* Sources */,
+ AFA5600009936C6D00F3E977 /* Frameworks */,
+ AFA5600709936C6D00F3E977 /* Rez */,
+ AFA3D98F09C03E0F00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA55FFA09936C6D00F3E977 /* PBXTargetDependency */,
+ );
+ name = GLKnots;
+ productName = GLKnots;
+ productReference = AFA5600B09936C6D00F3E977 /* GLKnots.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA5601409936CC800F3E977 /* BlockTube */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA5602309936CC800F3E977 /* Build configuration list for PBXNativeTarget "BlockTube" */;
+ buildPhases = (
+ AFA5601709936CC800F3E977 /* Resources */,
+ AFA5601909936CC800F3E977 /* Sources */,
+ AFA5601B09936CC800F3E977 /* Frameworks */,
+ AFA5602209936CC800F3E977 /* Rez */,
+ AFA3D95909C03DA400E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA5601509936CC800F3E977 /* PBXTargetDependency */,
+ );
+ name = BlockTube;
+ productName = BlockTube;
+ productReference = AFA5602609936CC800F3E977 /* BlockTube.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA5603209936D5100F3E977 /* FlipFlop */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA5604109936D5100F3E977 /* Build configuration list for PBXNativeTarget "FlipFlop" */;
+ buildPhases = (
+ AFA5603509936D5100F3E977 /* Resources */,
+ AFA5603709936D5100F3E977 /* Sources */,
+ AFA5603909936D5100F3E977 /* Frameworks */,
+ AFA5604009936D5100F3E977 /* Rez */,
+ AFA3D97B09C03DE000E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA5603309936D5100F3E977 /* PBXTargetDependency */,
+ );
+ name = FlipFlop;
+ productName = FlipFlop;
+ productReference = AFA5604409936D5100F3E977 /* FlipFlop.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA5604A09936E2100F3E977 /* AntInspect */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA5605909936E2100F3E977 /* Build configuration list for PBXNativeTarget "AntInspect" */;
+ buildPhases = (
+ AFA5604D09936E2100F3E977 /* Resources */,
+ AFA5604F09936E2100F3E977 /* Sources */,
+ AFA5605109936E2100F3E977 /* Frameworks */,
+ AFA5605809936E2100F3E977 /* Rez */,
+ AFA3D94D09C03D8D00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA5604B09936E2100F3E977 /* PBXTargetDependency */,
+ );
+ name = AntInspect;
+ productName = AntInspect;
+ productReference = AFA5605C09936E2100F3E977 /* AntInspect.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA5606209936F3800F3E977 /* AntSpotlight */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA5607109936F3800F3E977 /* Build configuration list for PBXNativeTarget "AntSpotlight" */;
+ buildPhases = (
+ AFA5606509936F3800F3E977 /* Resources */,
+ AFA5606709936F3800F3E977 /* Sources */,
+ AFA5606909936F3800F3E977 /* Frameworks */,
+ AFA5607009936F3800F3E977 /* Rez */,
+ AFA3D95109C03D9400E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA5606309936F3800F3E977 /* PBXTargetDependency */,
+ );
+ name = AntSpotlight;
+ productName = AntSpotlight;
+ productReference = AFA5607409936F3800F3E977 /* AntSpotlight.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA560AE0993718D00F3E977 /* Polytopes */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA560BD0993718D00F3E977 /* Build configuration list for PBXNativeTarget "Polytopes" */;
+ buildPhases = (
+ AFA560B10993718D00F3E977 /* Resources */,
+ AFA560B30993718D00F3E977 /* Sources */,
+ AFA560B50993718D00F3E977 /* Frameworks */,
+ AFA560BC0993718D00F3E977 /* Rez */,
+ AFA3D9B909C03E5E00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA560AF0993718D00F3E977 /* PBXTargetDependency */,
+ );
+ name = Polytopes;
+ productName = Polytopes;
+ productReference = AFA560C00993718D00F3E977 /* Polytopes.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA560FD0993781600F3E977 /* Molecule */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA5610C0993781600F3E977 /* Build configuration list for PBXNativeTarget "Molecule" */;
+ buildPhases = (
+ AFA561000993781600F3E977 /* Resources */,
+ AFA561020993781600F3E977 /* Sources */,
+ AFA561040993781600F3E977 /* Frameworks */,
+ AFA5610B0993781600F3E977 /* Rez */,
+ AFA3D9AD09C03E4600E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA560FE0993781600F3E977 /* PBXTargetDependency */,
+ AFA5611E0993791D00F3E977 /* PBXTargetDependency */,
+ );
+ name = Molecule;
+ productName = Molecule;
+ productReference = AFA5610F0993781600F3E977 /* Molecule.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA5615609937C0D00F3E977 /* BlinkBox */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA5616709937C0D00F3E977 /* Build configuration list for PBXNativeTarget "BlinkBox" */;
+ buildPhases = (
+ AFA5615B09937C0D00F3E977 /* Resources */,
+ AFA5615D09937C0D00F3E977 /* Sources */,
+ AFA5615F09937C0D00F3E977 /* Frameworks */,
+ AFA5616609937C0D00F3E977 /* Rez */,
+ AFA3D95709C03DA100E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA5615709937C0D00F3E977 /* PBXTargetDependency */,
+ );
+ name = BlinkBox;
+ productName = BlinkBox;
+ productReference = AFA5616A09937C0D00F3E977 /* BlinkBox.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA5617B09937CF100F3E977 /* Noof */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA5618A09937CF100F3E977 /* Build configuration list for PBXNativeTarget "Noof" */;
+ buildPhases = (
+ AFA5617E09937CF100F3E977 /* Resources */,
+ AFA5618009937CF100F3E977 /* Sources */,
+ AFA5618209937CF100F3E977 /* Frameworks */,
+ AFA5618909937CF100F3E977 /* Rez */,
+ AFA3D9B109C03E4E00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA5617C09937CF100F3E977 /* PBXTargetDependency */,
+ );
+ name = Noof;
+ productName = Noof;
+ productReference = AFA5618D09937CF100F3E977 /* Noof.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA5619D09937D7E00F3E977 /* Polyhedra */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA561AC09937D7E00F3E977 /* Build configuration list for PBXNativeTarget "Polyhedra" */;
+ buildPhases = (
+ AFA561A009937D7E00F3E977 /* Resources */,
+ AFA561A209937D7E00F3E977 /* Sources */,
+ AFA561A409937D7E00F3E977 /* Frameworks */,
+ AFA561AB09937D7E00F3E977 /* Rez */,
+ AFA3D9B709C03E5B00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA5619E09937D7E00F3E977 /* PBXTargetDependency */,
+ );
+ name = Polyhedra;
+ productName = Polyhedra;
+ productReference = AFA561AF09937D7E00F3E977 /* Polyhedra.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA562060993849F00F3E977 /* Providence */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA562160993849F00F3E977 /* Build configuration list for PBXNativeTarget "Providence" */;
+ buildPhases = (
+ AFA562090993849F00F3E977 /* Resources */,
+ AFA5620B0993849F00F3E977 /* Sources */,
+ AFA5620E0993849F00F3E977 /* Frameworks */,
+ AFA562150993849F00F3E977 /* Rez */,
+ AFA3D9BB09C03E6200E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA562070993849F00F3E977 /* PBXTargetDependency */,
+ );
+ name = Providence;
+ productName = Providence;
+ productReference = AFA562190993849F00F3E977 /* Providence.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA5621F0993852500F3E977 /* Pinion */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA5622E0993852500F3E977 /* Build configuration list for PBXNativeTarget "Pinion" */;
+ buildPhases = (
+ AFA562220993852500F3E977 /* Resources */,
+ AFA562240993852500F3E977 /* Sources */,
+ AFA562260993852500F3E977 /* Frameworks */,
+ AFA5622D0993852500F3E977 /* Rez */,
+ AFA3D9B309C03E5100E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA562200993852500F3E977 /* PBXTargetDependency */,
+ );
+ name = Pinion;
+ productName = Pinion;
+ productReference = AFA562310993852500F3E977 /* Pinion.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA562BF099392C600F3E977 /* Boing */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA562CE099392C600F3E977 /* Build configuration list for PBXNativeTarget "Boing" */;
+ buildPhases = (
+ AFA562C2099392C600F3E977 /* Resources */,
+ AFA562C4099392C600F3E977 /* Sources */,
+ AFA562C6099392C600F3E977 /* Frameworks */,
+ AFA562CD099392C600F3E977 /* Rez */,
+ AFA3D95B09C03DA800E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA562C0099392C600F3E977 /* PBXTargetDependency */,
+ );
+ name = Boing;
+ productName = Boing;
+ productReference = AFA562D1099392C600F3E977 /* Boing.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA562DA099393C900F3E977 /* AntMaze */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA562E9099393C900F3E977 /* Build configuration list for PBXNativeTarget "AntMaze" */;
+ buildPhases = (
+ AFA562DD099393C900F3E977 /* Resources */,
+ AFA562DF099393C900F3E977 /* Sources */,
+ AFA562E1099393C900F3E977 /* Frameworks */,
+ AFA562E8099393C900F3E977 /* Rez */,
+ AFA3D94F09C03D9100E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA562DB099393C900F3E977 /* PBXTargetDependency */,
+ );
+ name = AntMaze;
+ productName = AntMaze;
+ productReference = AFA562EC099393C900F3E977 /* AntMaze.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA562F20993943B00F3E977 /* Tangram */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA563010993943B00F3E977 /* Build configuration list for PBXNativeTarget "Tangram" */;
+ buildPhases = (
+ AFA562F50993943B00F3E977 /* Resources */,
+ AFA562F70993943B00F3E977 /* Sources */,
+ AFA562F90993943B00F3E977 /* Frameworks */,
+ AFA563000993943B00F3E977 /* Rez */,
+ AFA3D9D309C03E8F00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA562F30993943B00F3E977 /* PBXTargetDependency */,
+ );
+ name = Tangram;
+ productName = Tangram;
+ productReference = AFA563040993943B00F3E977 /* Tangram.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA563130993951000F3E977 /* Crackberg */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA563230993951000F3E977 /* Build configuration list for PBXNativeTarget "Crackberg" */;
+ buildPhases = (
+ AFA563160993951000F3E977 /* Resources */,
+ AFA563180993951000F3E977 /* Sources */,
+ AFA5631B0993951000F3E977 /* Frameworks */,
+ AFA563220993951000F3E977 /* Rez */,
+ AFA3D96909C03DBF00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA563140993951000F3E977 /* PBXTargetDependency */,
+ );
+ name = Crackberg;
+ productName = Crackberg;
+ productReference = AFA563260993951000F3E977 /* Crackberg.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA56331099395ED00F3E977 /* GLHanoi */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA56340099395ED00F3E977 /* Build configuration list for PBXNativeTarget "GLHanoi" */;
+ buildPhases = (
+ AFA56334099395ED00F3E977 /* Resources */,
+ AFA56336099395ED00F3E977 /* Sources */,
+ AFA56338099395ED00F3E977 /* Frameworks */,
+ AFA5633F099395ED00F3E977 /* Rez */,
+ AFA3D98D09C03E0500E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA56332099395ED00F3E977 /* PBXTargetDependency */,
+ );
+ name = GLHanoi;
+ productName = GLHanoi;
+ productReference = AFA56343099395ED00F3E977 /* GLHanoi.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA56351099396C000F3E977 /* Cube21 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA56360099396C000F3E977 /* Build configuration list for PBXNativeTarget "Cube21" */;
+ buildPhases = (
+ AFA56354099396C000F3E977 /* Resources */,
+ AFA56356099396C000F3E977 /* Sources */,
+ AFA56358099396C000F3E977 /* Frameworks */,
+ AFA5635F099396C000F3E977 /* Rez */,
+ AFA3D96B09C03DC600E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA56352099396C000F3E977 /* PBXTargetDependency */,
+ );
+ name = Cube21;
+ productName = Cube21;
+ productReference = AFA56363099396C000F3E977 /* Cube21.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA56379099397B300F3E977 /* TimeTunnel */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA56388099397B300F3E977 /* Build configuration list for PBXNativeTarget "TimeTunnel" */;
+ buildPhases = (
+ AFA5637C099397B300F3E977 /* Resources */,
+ AFA5637E099397B300F3E977 /* Sources */,
+ AFA56380099397B300F3E977 /* Frameworks */,
+ AFA56387099397B300F3E977 /* Rez */,
+ AFA3D9D509C03E9300E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA5637A099397B300F3E977 /* PBXTargetDependency */,
+ );
+ name = TimeTunnel;
+ productName = TimeTunnel;
+ productReference = AFA5638B099397B300F3E977 /* TimeTunnel.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA563A4099398BB00F3E977 /* Juggler3D */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA563B3099398BB00F3E977 /* Build configuration list for PBXNativeTarget "Juggler3D" */;
+ buildPhases = (
+ AFA563A7099398BB00F3E977 /* Resources */,
+ AFA563A9099398BB00F3E977 /* Sources */,
+ AFA563AB099398BB00F3E977 /* Frameworks */,
+ AFA563B2099398BB00F3E977 /* Rez */,
+ AFA3D99F09C03E2900E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA563A5099398BB00F3E977 /* PBXTargetDependency */,
+ );
+ name = Juggler3D;
+ productName = Juggler3D;
+ productReference = AFA563B6099398BB00F3E977 /* Juggler3D.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFA6AAF020999950006D2685 /* GlitchPEG */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFA6AB0220999950006D2685 /* Build configuration list for PBXNativeTarget "GlitchPEG" */;
+ buildPhases = (
+ AFA6AAF320999950006D2685 /* Resources */,
+ AFA6AAF520999950006D2685 /* Sources */,
+ AFA6AAF820999950006D2685 /* Frameworks */,
+ AFA6AB0020999950006D2685 /* Rez */,
+ AFA6AB0120999950006D2685 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFA6AAF120999950006D2685 /* PBXTargetDependency */,
+ );
+ name = GlitchPEG;
+ productName = Attraction;
+ productReference = AFA6AB0520999950006D2685 /* GlitchPEG.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFAAE387207D6343007A515C /* Maze3D */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFAAE399207D6343007A515C /* Build configuration list for PBXNativeTarget "Maze3D" */;
+ buildPhases = (
+ AFAAE38A207D6343007A515C /* Resources */,
+ AFAAE38C207D6343007A515C /* Sources */,
+ AFAAE38F207D6343007A515C /* Frameworks */,
+ AFAAE397207D6343007A515C /* Rez */,
+ AFAAE398207D6343007A515C /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFAAE388207D6343007A515C /* PBXTargetDependency */,
+ );
+ name = Maze3D;
+ productName = DangerBall;
+ productReference = AFAAE39C207D6343007A515C /* Maze3D.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFACE8731CC83458008B24CD /* EnergyStream */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFACE8851CC83458008B24CD /* Build configuration list for PBXNativeTarget "EnergyStream" */;
+ buildPhases = (
+ AFACE8761CC83458008B24CD /* Resources */,
+ AFACE8781CC83458008B24CD /* Sources */,
+ AFACE87B1CC83458008B24CD /* Frameworks */,
+ AFACE8831CC83458008B24CD /* Rez */,
+ AFACE8841CC83458008B24CD /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFACE8741CC83458008B24CD /* PBXTargetDependency */,
+ );
+ name = EnergyStream;
+ productName = DangerBall;
+ productReference = AFACE8881CC83458008B24CD /* EnergyStream.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFB591A7178B812C00EA4005 /* Hexadrop */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFB591B7178B812C00EA4005 /* Build configuration list for PBXNativeTarget "Hexadrop" */;
+ buildPhases = (
+ AFB591AA178B812C00EA4005 /* Resources */,
+ AFB591AC178B812C00EA4005 /* Sources */,
+ AFB591AF178B812C00EA4005 /* Frameworks */,
+ AFB591B5178B812C00EA4005 /* Rez */,
+ AFB591B6178B812C00EA4005 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFB591A8178B812C00EA4005 /* PBXTargetDependency */,
+ );
+ name = Hexadrop;
+ productName = Attraction;
+ productReference = AFB591BA178B812C00EA4005 /* Hexadrop.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFBFE74B178642DC00432B21 /* Apple2-OSX */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFBFE75B178642DC00432B21 /* Build configuration list for PBXNativeTarget "Apple2-OSX" */;
+ buildPhases = (
+ AFBFE74E178642DC00432B21 /* Resources */,
+ AFBFE751178642DC00432B21 /* Sources */,
+ AFBFE755178642DC00432B21 /* Frameworks */,
+ AFBFE78817894FFA00432B21 /* Copy Standalone Preferences XML File */,
+ AFBFE75A178642DC00432B21 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFBFE7641786438900432B21 /* PBXTargetDependency */,
+ AFBFE74C178642DC00432B21 /* PBXTargetDependency */,
+ );
+ name = "Apple2-OSX";
+ productName = SaverTester;
+ productReference = AFBFE75E178642DC00432B21 /* Apple2.app */;
+ productType = "com.apple.product-type.application";
+ };
+ AFBFE767178647FE00432B21 /* Phosphor-OSX */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFBFE77B178647FE00432B21 /* Build configuration list for PBXNativeTarget "Phosphor-OSX" */;
+ buildPhases = (
+ AFBFE76C178647FE00432B21 /* Resources */,
+ AFBFE771178647FE00432B21 /* Sources */,
+ AFBFE775178647FE00432B21 /* Frameworks */,
+ AFBFE78917895AAF00432B21 /* Copy Standalone Preferences XML File */,
+ AFBFE77A178647FE00432B21 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFBFE7811786482B00432B21 /* PBXTargetDependency */,
+ AFBFE76A178647FE00432B21 /* PBXTargetDependency */,
+ );
+ name = "Phosphor-OSX";
+ productName = SaverTester;
+ productReference = AFBFE77E178647FE00432B21 /* Phosphor.app */;
+ productType = "com.apple.product-type.application";
+ };
+ AFC0E8AB1CDC601A008CAFAC /* Hydrostat */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFC0E8BD1CDC601A008CAFAC /* Build configuration list for PBXNativeTarget "Hydrostat" */;
+ buildPhases = (
+ AFC0E8AE1CDC601A008CAFAC /* Resources */,
+ AFC0E8B01CDC601A008CAFAC /* Sources */,
+ AFC0E8B31CDC601A008CAFAC /* Frameworks */,
+ AFC0E8BB1CDC601A008CAFAC /* Rez */,
+ AFC0E8BC1CDC601A008CAFAC /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFC0E8AC1CDC601A008CAFAC /* PBXTargetDependency */,
+ );
+ name = Hydrostat;
+ productName = DangerBall;
+ productReference = AFC0E8C01CDC601A008CAFAC /* Hydrostat.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFC5CFD62044AA23004CEB5E /* Crumbler */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFC5CFE82044AA23004CEB5E /* Build configuration list for PBXNativeTarget "Crumbler" */;
+ buildPhases = (
+ AFC5CFD92044AA23004CEB5E /* Resources */,
+ AFC5CFDB2044AA23004CEB5E /* Sources */,
+ AFC5CFDE2044AA23004CEB5E /* Frameworks */,
+ AFC5CFE62044AA23004CEB5E /* Rez */,
+ AFC5CFE72044AA23004CEB5E /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFC5CFD72044AA23004CEB5E /* PBXTargetDependency */,
+ );
+ name = Crumbler;
+ productName = DangerBall;
+ productReference = AFC5CFEB2044AA23004CEB5E /* Crumbler.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFCF833B1AF5B515008BB7E1 /* SplitFlap */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFCF834D1AF5B515008BB7E1 /* Build configuration list for PBXNativeTarget "SplitFlap" */;
+ buildPhases = (
+ AFCF833E1AF5B515008BB7E1 /* Resources */,
+ AFCF83401AF5B515008BB7E1 /* Sources */,
+ AFCF83431AF5B515008BB7E1 /* Frameworks */,
+ AFCF834B1AF5B515008BB7E1 /* Rez */,
+ AFCF834C1AF5B515008BB7E1 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFCF833C1AF5B515008BB7E1 /* PBXTargetDependency */,
+ );
+ name = SplitFlap;
+ productName = DangerBall;
+ productReference = AFCF83501AF5B515008BB7E1 /* SplitFlap.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD51B1B0F063B4A00471C02 /* Photopile */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD51B2D0F063B4A00471C02 /* Build configuration list for PBXNativeTarget "Photopile" */;
+ buildPhases = (
+ AFD51B1E0F063B4A00471C02 /* Resources */,
+ AFD51B210F063B4A00471C02 /* Sources */,
+ AFD51B240F063B4A00471C02 /* Frameworks */,
+ AFD51B2B0F063B4A00471C02 /* Rez */,
+ AFD51B2C0F063B4A00471C02 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD51B1C0F063B4A00471C02 /* PBXTargetDependency */,
+ );
+ name = Photopile;
+ productName = Photopile;
+ productReference = AFD51B300F063B4A00471C02 /* Photopile.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD56DF10996A03800BA26F7 /* GLText */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD56E010996A03800BA26F7 /* Build configuration list for PBXNativeTarget "GLText" */;
+ buildPhases = (
+ AFD56DF40996A03800BA26F7 /* Resources */,
+ AFD56DF60996A03800BA26F7 /* Sources */,
+ AFD56DF90996A03800BA26F7 /* Frameworks */,
+ AFD56E000996A03800BA26F7 /* Rez */,
+ AFA3D99909C03E2000E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD56DF20996A03800BA26F7 /* PBXTargetDependency */,
+ );
+ name = GLText;
+ productName = GLText;
+ productReference = AFD56E040996A03800BA26F7 /* GLText.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD56EAE0996A72600BA26F7 /* Braid */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD56EBB0996A72600BA26F7 /* Build configuration list for PBXNativeTarget "Braid" */;
+ buildPhases = (
+ AFD56EB10996A72600BA26F7 /* Resources */,
+ AFD56EB30996A72600BA26F7 /* Sources */,
+ AFD56EB60996A72600BA26F7 /* Frameworks */,
+ AFD56EBA0996A72600BA26F7 /* Rez */,
+ AFA3D90709C03D0B00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD56EAF0996A72600BA26F7 /* PBXTargetDependency */,
+ );
+ name = Braid;
+ productName = Braid;
+ productReference = AFD56EBE0996A72600BA26F7 /* Braid.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD56EDA0996A95700BA26F7 /* Forest */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD56EE70996A95700BA26F7 /* Build configuration list for PBXNativeTarget "Forest" */;
+ buildPhases = (
+ AFD56EDD0996A95700BA26F7 /* Resources */,
+ AFD56EDF0996A95700BA26F7 /* Sources */,
+ AFD56EE20996A95700BA26F7 /* Frameworks */,
+ AFD56EE60996A95700BA26F7 /* Rez */,
+ AFA3D91D09C03D3000E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD56EDB0996A95700BA26F7 /* PBXTargetDependency */,
+ );
+ name = Forest;
+ productName = Forest;
+ productReference = AFD56EEA0996A95700BA26F7 /* Forest.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD56F0B0996AAFA00BA26F7 /* Vines */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD56F180996AAFA00BA26F7 /* Build configuration list for PBXNativeTarget "Vines" */;
+ buildPhases = (
+ AFD56F0E0996AAFA00BA26F7 /* Resources */,
+ AFD56F100996AAFA00BA26F7 /* Sources */,
+ AFD56F130996AAFA00BA26F7 /* Frameworks */,
+ AFD56F170996AAFA00BA26F7 /* Rez */,
+ AFA3D94909C03D8100E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD56F0C0996AAFA00BA26F7 /* PBXTargetDependency */,
+ );
+ name = Vines;
+ productName = Vines;
+ productReference = AFD56F1B0996AAFA00BA26F7 /* Vines.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD56F230996AB8A00BA26F7 /* Galaxy */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD56F300996AB8A00BA26F7 /* Build configuration list for PBXNativeTarget "Galaxy" */;
+ buildPhases = (
+ AFD56F260996AB8A00BA26F7 /* Resources */,
+ AFD56F280996AB8A00BA26F7 /* Sources */,
+ AFD56F2B0996AB8A00BA26F7 /* Frameworks */,
+ AFD56F2F0996AB8A00BA26F7 /* Rez */,
+ AFA3D91F09C03D3300E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD56F240996AB8A00BA26F7 /* PBXTargetDependency */,
+ );
+ name = Galaxy;
+ productName = Galaxy;
+ productReference = AFD56F330996AB8A00BA26F7 /* Galaxy.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD56F4F0996AEEE00BA26F7 /* Grav */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD56F5C0996AEEE00BA26F7 /* Build configuration list for PBXNativeTarget "Grav" */;
+ buildPhases = (
+ AFD56F520996AEEE00BA26F7 /* Resources */,
+ AFD56F540996AEEE00BA26F7 /* Sources */,
+ AFD56F570996AEEE00BA26F7 /* Frameworks */,
+ AFD56F5B0996AEEE00BA26F7 /* Rez */,
+ AFA3D92109C03D3600E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD56F500996AEEE00BA26F7 /* PBXTargetDependency */,
+ );
+ name = Grav;
+ productName = Grav;
+ productReference = AFD56F5F0996AEEE00BA26F7 /* Grav.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD56F6B0996B01600BA26F7 /* Hopalong */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD56F780996B01600BA26F7 /* Build configuration list for PBXNativeTarget "Hopalong" */;
+ buildPhases = (
+ AFD56F6E0996B01600BA26F7 /* Resources */,
+ AFD56F700996B01600BA26F7 /* Sources */,
+ AFD56F730996B01600BA26F7 /* Frameworks */,
+ AFD56F770996B01600BA26F7 /* Rez */,
+ AFA3D92309C03D3A00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD56F6C0996B01600BA26F7 /* PBXTargetDependency */,
+ );
+ name = Hopalong;
+ productName = Hopalong;
+ productReference = AFD56F7B0996B01600BA26F7 /* Hopalong.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD56F8C0996B09400BA26F7 /* Laser */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD56F990996B09400BA26F7 /* Build configuration list for PBXNativeTarget "Laser" */;
+ buildPhases = (
+ AFD56F8F0996B09400BA26F7 /* Resources */,
+ AFD56F910996B09400BA26F7 /* Sources */,
+ AFD56F940996B09400BA26F7 /* Frameworks */,
+ AFD56F980996B09400BA26F7 /* Rez */,
+ AFA3D92909C03D4400E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD56F8D0996B09400BA26F7 /* PBXTargetDependency */,
+ );
+ name = Laser;
+ productName = Laser;
+ productReference = AFD56F9C0996B09400BA26F7 /* Laser.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD56FA30996B10F00BA26F7 /* Lightning */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD56FB00996B10F00BA26F7 /* Build configuration list for PBXNativeTarget "Lightning" */;
+ buildPhases = (
+ AFD56FA60996B10F00BA26F7 /* Resources */,
+ AFD56FA80996B10F00BA26F7 /* Sources */,
+ AFD56FAB0996B10F00BA26F7 /* Frameworks */,
+ AFD56FAF0996B10F00BA26F7 /* Rez */,
+ AFA3D92B09C03D4700E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD56FA40996B10F00BA26F7 /* PBXTargetDependency */,
+ );
+ name = Lightning;
+ productName = Lightning;
+ productReference = AFD56FB30996B10F00BA26F7 /* Lightning.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD56FB90996B18F00BA26F7 /* Lisa */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD56FC60996B18F00BA26F7 /* Build configuration list for PBXNativeTarget "Lisa" */;
+ buildPhases = (
+ AFD56FBC0996B18F00BA26F7 /* Resources */,
+ AFD56FBE0996B18F00BA26F7 /* Sources */,
+ AFD56FC10996B18F00BA26F7 /* Frameworks */,
+ AFD56FC50996B18F00BA26F7 /* Rez */,
+ AFA3D92D09C03D4A00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD56FBA0996B18F00BA26F7 /* PBXTargetDependency */,
+ );
+ name = Lisa;
+ productName = Lisa;
+ productReference = AFD56FC90996B18F00BA26F7 /* Lisa.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD56FCF0996B20900BA26F7 /* Lissie */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD56FDC0996B20900BA26F7 /* Build configuration list for PBXNativeTarget "Lissie" */;
+ buildPhases = (
+ AFD56FD20996B20900BA26F7 /* Resources */,
+ AFD56FD40996B20900BA26F7 /* Sources */,
+ AFD56FD70996B20900BA26F7 /* Frameworks */,
+ AFD56FDB0996B20900BA26F7 /* Rez */,
+ AFA3D92F09C03D4E00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD56FD00996B20900BA26F7 /* PBXTargetDependency */,
+ );
+ name = Lissie;
+ productName = Lissie;
+ productReference = AFD56FDF0996B20900BA26F7 /* Lissie.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD56FF80996B43800BA26F7 /* Penrose */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD570050996B43800BA26F7 /* Build configuration list for PBXNativeTarget "Penrose" */;
+ buildPhases = (
+ AFD56FFB0996B43800BA26F7 /* Resources */,
+ AFD56FFD0996B43800BA26F7 /* Sources */,
+ AFD570000996B43800BA26F7 /* Frameworks */,
+ AFD570040996B43800BA26F7 /* Rez */,
+ AFA3D93709C03D5B00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD56FF90996B43800BA26F7 /* PBXTargetDependency */,
+ );
+ name = Penrose;
+ productName = Penrose;
+ productReference = AFD570080996B43800BA26F7 /* Penrose.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD5700F0996B4CC00BA26F7 /* Sierpinski */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD5701C0996B4CC00BA26F7 /* Build configuration list for PBXNativeTarget "Sierpinski" */;
+ buildPhases = (
+ AFD570120996B4CC00BA26F7 /* Resources */,
+ AFD570140996B4CC00BA26F7 /* Sources */,
+ AFD570170996B4CC00BA26F7 /* Frameworks */,
+ AFD5701B0996B4CC00BA26F7 /* Rez */,
+ AFA3DBA209C0424C00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD570100996B4CC00BA26F7 /* PBXTargetDependency */,
+ );
+ name = Sierpinski;
+ productName = Sierpinski;
+ productReference = AFD5701F0996B4CC00BA26F7 /* Sierpinski.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD570260996B56D00BA26F7 /* Sphere */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD570330996B56D00BA26F7 /* Build configuration list for PBXNativeTarget "Sphere" */;
+ buildPhases = (
+ AFD570290996B56D00BA26F7 /* Resources */,
+ AFD5702B0996B56D00BA26F7 /* Sources */,
+ AFD5702E0996B56D00BA26F7 /* Frameworks */,
+ AFD570320996B56D00BA26F7 /* Rez */,
+ AFA3D93D09C03D6C00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD570270996B56D00BA26F7 /* PBXTargetDependency */,
+ );
+ name = Sphere;
+ productName = Sphere;
+ productReference = AFD570360996B56D00BA26F7 /* Sphere.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD570430996B61600BA26F7 /* Spiral */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD570500996B61600BA26F7 /* Build configuration list for PBXNativeTarget "Spiral" */;
+ buildPhases = (
+ AFD570460996B61600BA26F7 /* Resources */,
+ AFD570480996B61600BA26F7 /* Sources */,
+ AFD5704B0996B61600BA26F7 /* Frameworks */,
+ AFD5704F0996B61600BA26F7 /* Rez */,
+ AFA3D93F09C03D6F00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD570440996B61600BA26F7 /* PBXTargetDependency */,
+ );
+ name = Spiral;
+ productName = Spiral;
+ productReference = AFD570530996B61600BA26F7 /* Spiral.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD570590996B6A300BA26F7 /* FadePlot */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD570660996B6A300BA26F7 /* Build configuration list for PBXNativeTarget "FadePlot" */;
+ buildPhases = (
+ AFD5705C0996B6A300BA26F7 /* Resources */,
+ AFD5705E0996B6A300BA26F7 /* Sources */,
+ AFD570610996B6A300BA26F7 /* Frameworks */,
+ AFD570650996B6A300BA26F7 /* Rez */,
+ AFA3D91309C03D1E00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD5705A0996B6A300BA26F7 /* PBXTargetDependency */,
+ );
+ name = FadePlot;
+ productName = FadePlot;
+ productReference = AFD570690996B6A300BA26F7 /* FadePlot.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD5706F0996B72700BA26F7 /* Mountain */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD5707C0996B72700BA26F7 /* Build configuration list for PBXNativeTarget "Mountain" */;
+ buildPhases = (
+ AFD570720996B72700BA26F7 /* Resources */,
+ AFD570740996B72700BA26F7 /* Sources */,
+ AFD570770996B72700BA26F7 /* Frameworks */,
+ AFD5707B0996B72700BA26F7 /* Rez */,
+ AFA3D93309C03D5400E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD570700996B72700BA26F7 /* PBXTargetDependency */,
+ );
+ name = Mountain;
+ productName = Mountain;
+ productReference = AFD5707F0996B72800BA26F7 /* Mountain.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD570850996B80300BA26F7 /* Triangle */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD570920996B80300BA26F7 /* Build configuration list for PBXNativeTarget "Triangle" */;
+ buildPhases = (
+ AFD570880996B80300BA26F7 /* Resources */,
+ AFD5708A0996B80300BA26F7 /* Sources */,
+ AFD5708D0996B80300BA26F7 /* Frameworks */,
+ AFD570910996B80300BA26F7 /* Rez */,
+ AFA3D94709C03D7E00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD570860996B80300BA26F7 /* PBXTargetDependency */,
+ );
+ name = Triangle;
+ productName = Triangle;
+ productReference = AFD570950996B80300BA26F7 /* Triangle.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD5709B0996B88E00BA26F7 /* Worm */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD570A80996B88E00BA26F7 /* Build configuration list for PBXNativeTarget "Worm" */;
+ buildPhases = (
+ AFD5709E0996B88E00BA26F7 /* Resources */,
+ AFD570A00996B88E00BA26F7 /* Sources */,
+ AFD570A30996B88E00BA26F7 /* Frameworks */,
+ AFD570A70996B88E00BA26F7 /* Rez */,
+ AFA3D94B09C03D8500E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD5709C0996B88E00BA26F7 /* PBXTargetDependency */,
+ );
+ name = Worm;
+ productName = Worm;
+ productReference = AFD570AB0996B88E00BA26F7 /* Worm.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD570B10996B93000BA26F7 /* Rotor */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD570BE0996B93000BA26F7 /* Build configuration list for PBXNativeTarget "Rotor" */;
+ buildPhases = (
+ AFD570B40996B93000BA26F7 /* Resources */,
+ AFD570B60996B93000BA26F7 /* Sources */,
+ AFD570B90996B93000BA26F7 /* Frameworks */,
+ AFD570BD0996B93000BA26F7 /* Rez */,
+ AFA3D93B09C03D6200E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD570B20996B93000BA26F7 /* PBXTargetDependency */,
+ );
+ name = Rotor;
+ productName = Rotor;
+ productReference = AFD570C10996B93000BA26F7 /* Rotor.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD570C90996B9F800BA26F7 /* Ant */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD570D60996B9F800BA26F7 /* Build configuration list for PBXNativeTarget "Ant" */;
+ buildPhases = (
+ AFD570CC0996B9F800BA26F7 /* Resources */,
+ AFD570CE0996B9F800BA26F7 /* Sources */,
+ AFD570D10996B9F800BA26F7 /* Frameworks */,
+ AFD570D50996B9F800BA26F7 /* Rez */,
+ AFA3D90109C03D0000E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD570CA0996B9F800BA26F7 /* PBXTargetDependency */,
+ );
+ name = Ant;
+ productName = Ant;
+ productReference = AFD570D90996B9F800BA26F7 /* Ant.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD570EA0996BBBF00BA26F7 /* Flow */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD570F70996BBBF00BA26F7 /* Build configuration list for PBXNativeTarget "Flow" */;
+ buildPhases = (
+ AFD570ED0996BBBF00BA26F7 /* Resources */,
+ AFD570EF0996BBBF00BA26F7 /* Sources */,
+ AFD570F20996BBBF00BA26F7 /* Frameworks */,
+ AFD570F60996BBBF00BA26F7 /* Rez */,
+ AFA3D91909C03D2700E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD570EB0996BBBF00BA26F7 /* PBXTargetDependency */,
+ );
+ name = Flow;
+ productName = Flow;
+ productReference = AFD570FA0996BBBF00BA26F7 /* Flow.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD571130996BE9300BA26F7 /* Discrete */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD571200996BE9300BA26F7 /* Build configuration list for PBXNativeTarget "Discrete" */;
+ buildPhases = (
+ AFD571160996BE9300BA26F7 /* Resources */,
+ AFD571180996BE9300BA26F7 /* Sources */,
+ AFD5711B0996BE9300BA26F7 /* Frameworks */,
+ AFD5711F0996BE9300BA26F7 /* Rez */,
+ AFA3D90D09C03D1400E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD571140996BE9300BA26F7 /* PBXTargetDependency */,
+ );
+ name = Discrete;
+ productName = Discrete;
+ productReference = AFD571230996BE9300BA26F7 /* Discrete.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD5712C0996BF2E00BA26F7 /* Apollonian */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD571390996BF2E00BA26F7 /* Build configuration list for PBXNativeTarget "Apollonian" */;
+ buildPhases = (
+ AFD5712F0996BF2E00BA26F7 /* Resources */,
+ AFD571310996BF2E00BA26F7 /* Sources */,
+ AFD571340996BF2E00BA26F7 /* Frameworks */,
+ AFD571380996BF2E00BA26F7 /* Rez */,
+ AFA3D90309C03D0400E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD5712D0996BF2E00BA26F7 /* PBXTargetDependency */,
+ );
+ name = Apollonian;
+ productName = Apollonian;
+ productReference = AFD5713C0996BF2E00BA26F7 /* Apollonian.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD571430996C01700BA26F7 /* Euler2D */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD571500996C01700BA26F7 /* Build configuration list for PBXNativeTarget "Euler2D" */;
+ buildPhases = (
+ AFD571460996C01700BA26F7 /* Resources */,
+ AFD571480996C01700BA26F7 /* Sources */,
+ AFD5714B0996C01700BA26F7 /* Frameworks */,
+ AFD5714F0996C01700BA26F7 /* Rez */,
+ AFA3D91109C03D1B00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD571440996C01700BA26F7 /* PBXTargetDependency */,
+ );
+ name = Euler2D;
+ productName = Euler2D;
+ productReference = AFD571530996C01700BA26F7 /* Euler2D.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD571590996C0CE00BA26F7 /* Thornbird */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD571660996C0CE00BA26F7 /* Build configuration list for PBXNativeTarget "Thornbird" */;
+ buildPhases = (
+ AFD5715C0996C0CE00BA26F7 /* Resources */,
+ AFD5715E0996C0CE00BA26F7 /* Sources */,
+ AFD571610996C0CE00BA26F7 /* Frameworks */,
+ AFD571650996C0CE00BA26F7 /* Rez */,
+ AFA3D94509C03D7A00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD5715A0996C0CE00BA26F7 /* PBXTargetDependency */,
+ );
+ name = Thornbird;
+ productName = Thornbird;
+ productReference = AFD571690996C0CE00BA26F7 /* Thornbird.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD571B50996D9DC00BA26F7 /* Juggle */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD571C20996D9DC00BA26F7 /* Build configuration list for PBXNativeTarget "Juggle" */;
+ buildPhases = (
+ AFD571B80996D9DC00BA26F7 /* Resources */,
+ AFD571BA0996D9DC00BA26F7 /* Sources */,
+ AFD571BD0996D9DC00BA26F7 /* Frameworks */,
+ AFD571C10996D9DC00BA26F7 /* Rez */,
+ AFA3D92509C03D3D00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD571B60996D9DC00BA26F7 /* PBXTargetDependency */,
+ );
+ name = Juggle;
+ productName = Juggle;
+ productReference = AFD571C50996D9DC00BA26F7 /* Juggle.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD572220996E4A300BA26F7 /* Swirl */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD5722F0996E4A300BA26F7 /* Build configuration list for PBXNativeTarget "Swirl" */;
+ buildPhases = (
+ AFD572250996E4A300BA26F7 /* Resources */,
+ AFD572270996E4A300BA26F7 /* Sources */,
+ AFD5722A0996E4A300BA26F7 /* Frameworks */,
+ AFD5722E0996E4A300BA26F7 /* Rez */,
+ AFA3D94309C03D7600E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD572230996E4A300BA26F7 /* PBXTargetDependency */,
+ );
+ name = Swirl;
+ productName = Swirl;
+ productReference = AFD572320996E4A300BA26F7 /* Swirl.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD5726D0996EE8500BA26F7 /* Polyominoes */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD5727A0996EE8500BA26F7 /* Build configuration list for PBXNativeTarget "Polyominoes" */;
+ buildPhases = (
+ AFD572700996EE8500BA26F7 /* Resources */,
+ AFD572720996EE8500BA26F7 /* Sources */,
+ AFD572750996EE8500BA26F7 /* Frameworks */,
+ AFD572790996EE8500BA26F7 /* Rez */,
+ AFA3D93909C03D5E00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD5726E0996EE8500BA26F7 /* PBXTargetDependency */,
+ );
+ name = Polyominoes;
+ productName = Polyominoes;
+ productReference = AFD5727D0996EE8500BA26F7 /* Polyominoes.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD572A50996F99600BA26F7 /* Bouboule */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD572B20996F99600BA26F7 /* Build configuration list for PBXNativeTarget "Bouboule" */;
+ buildPhases = (
+ AFD572A80996F99600BA26F7 /* Resources */,
+ AFD572AA0996F99600BA26F7 /* Sources */,
+ AFD572AD0996F99600BA26F7 /* Frameworks */,
+ AFD572B10996F99600BA26F7 /* Rez */,
+ AFA3D90509C03D0700E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD572A60996F99600BA26F7 /* PBXTargetDependency */,
+ );
+ name = Bouboule;
+ productName = Bouboule;
+ productReference = AFD572B50996F99600BA26F7 /* Bouboule.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD572C20996FC0F00BA26F7 /* Crystal */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD572CF0996FC0F00BA26F7 /* Build configuration list for PBXNativeTarget "Crystal" */;
+ buildPhases = (
+ AFD572C50996FC0F00BA26F7 /* Resources */,
+ AFD572C70996FC0F00BA26F7 /* Sources */,
+ AFD572CA0996FC0F00BA26F7 /* Frameworks */,
+ AFD572CE0996FC0F00BA26F7 /* Rez */,
+ AFA3D90909C03D0E00E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD572C30996FC0F00BA26F7 /* PBXTargetDependency */,
+ );
+ name = Crystal;
+ productName = Crystal;
+ productReference = AFD572D20996FC0F00BA26F7 /* Crystal.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD572F9099701C000BA26F7 /* Julia */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD57306099701C000BA26F7 /* Build configuration list for PBXNativeTarget "Julia" */;
+ buildPhases = (
+ AFD572FC099701C000BA26F7 /* Resources */,
+ AFD572FE099701C000BA26F7 /* Sources */,
+ AFD57301099701C000BA26F7 /* Frameworks */,
+ AFD57305099701C000BA26F7 /* Rez */,
+ AFA3D92709C03D4000E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD572FA099701C000BA26F7 /* PBXTargetDependency */,
+ );
+ name = Julia;
+ productName = Julia;
+ productReference = AFD57309099701C000BA26F7 /* Julia.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD5735D0997411200BA26F7 /* Strange */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD5736A0997411200BA26F7 /* Build configuration list for PBXNativeTarget "Strange" */;
+ buildPhases = (
+ AFD573600997411200BA26F7 /* Resources */,
+ AFD573620997411200BA26F7 /* Sources */,
+ AFD573650997411200BA26F7 /* Frameworks */,
+ AFD573690997411200BA26F7 /* Rez */,
+ AFA3D94109C03D7200E4CFCA /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD5735E0997411200BA26F7 /* PBXTargetDependency */,
+ );
+ name = Strange;
+ productName = Strange;
+ productReference = AFD5736D0997411200BA26F7 /* Strange.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFD77E5B20C23F8600A3638D /* FilmLeader */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFD77E6D20C23F8600A3638D /* Build configuration list for PBXNativeTarget "FilmLeader" */;
+ buildPhases = (
+ AFD77E5E20C23F8600A3638D /* Resources */,
+ AFD77E6020C23F8600A3638D /* Sources */,
+ AFD77E6320C23F8600A3638D /* Frameworks */,
+ AFD77E6B20C23F8600A3638D /* Rez */,
+ AFD77E6C20C23F8600A3638D /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFD77E5C20C23F8600A3638D /* PBXTargetDependency */,
+ );
+ name = FilmLeader;
+ productName = Attraction;
+ productReference = AFD77E7020C23F8600A3638D /* FilmLeader.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFDA658E178A52B70070D24B /* Unknown Pleasures */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFDA659E178A52B70070D24B /* Build configuration list for PBXNativeTarget "Unknown Pleasures" */;
+ buildPhases = (
+ AFDA6591178A52B70070D24B /* Resources */,
+ AFDA6593178A52B70070D24B /* Sources */,
+ AFDA6596178A52B70070D24B /* Frameworks */,
+ AFDA659C178A52B70070D24B /* Rez */,
+ AFDA659D178A52B70070D24B /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFDA658F178A52B70070D24B /* PBXTargetDependency */,
+ );
+ name = "Unknown Pleasures";
+ productName = DangerBall;
+ productReference = AFDA65A1178A52B70070D24B /* UnknownPleasures.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFE2A4560E2E904600ADB298 /* SkyTentacles */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFE2A4670E2E904600ADB298 /* Build configuration list for PBXNativeTarget "SkyTentacles" */;
+ buildPhases = (
+ AFE2A4590E2E904600ADB298 /* Resources */,
+ AFE2A45B0E2E904600ADB298 /* Sources */,
+ AFE2A45E0E2E904600ADB298 /* Frameworks */,
+ AFE2A4650E2E904600ADB298 /* Rez */,
+ AFE2A4660E2E904600ADB298 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFE2A4570E2E904600ADB298 /* PBXTargetDependency */,
+ );
+ name = SkyTentacles;
+ productName = SkyTentacles;
+ productReference = AFE2A46A0E2E904600ADB298 /* SkyTentacles.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFE30BE80E52B14700CCF4A5 /* Sonar */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFE30BF90E52B14700CCF4A5 /* Build configuration list for PBXNativeTarget "Sonar" */;
+ buildPhases = (
+ AF7E08021592661100D81407 /* ICMP Sanity Check */,
+ AFE30BEB0E52B14700CCF4A5 /* Resources */,
+ AFE30BED0E52B14700CCF4A5 /* Sources */,
+ AFE30BF00E52B14700CCF4A5 /* Frameworks */,
+ AFE30BF70E52B14700CCF4A5 /* Rez */,
+ AFE30BF80E52B14700CCF4A5 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFE30BE90E52B14700CCF4A5 /* PBXTargetDependency */,
+ );
+ name = Sonar;
+ productName = Sonar;
+ productReference = AFE30BFC0E52B14700CCF4A5 /* Sonar.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFE6A1820CDD7B2E002805BF /* MoebiusGears */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFE6A1940CDD7B2E002805BF /* Build configuration list for PBXNativeTarget "MoebiusGears" */;
+ buildPhases = (
+ AFE6A1850CDD7B2E002805BF /* Resources */,
+ AFE6A1870CDD7B2E002805BF /* Sources */,
+ AFE6A18B0CDD7B2E002805BF /* Frameworks */,
+ AFE6A1920CDD7B2E002805BF /* Rez */,
+ AFE6A1930CDD7B2E002805BF /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFE6A1830CDD7B2E002805BF /* PBXTargetDependency */,
+ );
+ name = MoebiusGears;
+ productName = MoebiusGears;
+ productReference = AFE6A1970CDD7B2E002805BF /* MoebiusGears.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFE6A41B0CDD7FAA002805BF /* Abstractile */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFE6A42A0CDD7FAA002805BF /* Build configuration list for PBXNativeTarget "Abstractile" */;
+ buildPhases = (
+ AFE6A41E0CDD7FAA002805BF /* Resources */,
+ AFE6A4210CDD7FAA002805BF /* Sources */,
+ AFE6A4240CDD7FAA002805BF /* Frameworks */,
+ AFE6A4280CDD7FAA002805BF /* Rez */,
+ AFE6A4290CDD7FAA002805BF /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFE6A41C0CDD7FAA002805BF /* PBXTargetDependency */,
+ );
+ name = Abstractile;
+ productName = Abstractile;
+ productReference = AFE6A42D0CDD7FAA002805BF /* Abstractile.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFEC23CD1CB6EAE100DE138F /* DymaxionMap */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFEC23DF1CB6EAE100DE138F /* Build configuration list for PBXNativeTarget "DymaxionMap" */;
+ buildPhases = (
+ AFEC23D01CB6EAE100DE138F /* Resources */,
+ AFEC23D21CB6EAE100DE138F /* Sources */,
+ AFEC23D51CB6EAE100DE138F /* Frameworks */,
+ AFEC23DD1CB6EAE100DE138F /* Rez */,
+ AFEC23DE1CB6EAE100DE138F /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFEC23CE1CB6EAE100DE138F /* PBXTargetDependency */,
+ );
+ name = DymaxionMap;
+ productName = DangerBall;
+ productReference = AFEC23E21CB6EAE100DE138F /* DymaxionMap.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFEE104D1D13406000AAC8F7 /* CubeTwist */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFEE105F1D13406000AAC8F7 /* Build configuration list for PBXNativeTarget "CubeTwist" */;
+ buildPhases = (
+ AFEE10501D13406000AAC8F7 /* Resources */,
+ AFEE10521D13406000AAC8F7 /* Sources */,
+ AFEE10551D13406000AAC8F7 /* Frameworks */,
+ AFEE105D1D13406000AAC8F7 /* Rez */,
+ AFEE105E1D13406000AAC8F7 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFEE104E1D13406000AAC8F7 /* PBXTargetDependency */,
+ );
+ name = CubeTwist;
+ productName = DangerBall;
+ productReference = AFEE10621D13406000AAC8F7 /* CubeTwist.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFEE106C1D15EB0700AAC8F7 /* CubeStack */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFEE107E1D15EB0800AAC8F7 /* Build configuration list for PBXNativeTarget "CubeStack" */;
+ buildPhases = (
+ AFEE106F1D15EB0800AAC8F7 /* Resources */,
+ AFEE10711D15EB0800AAC8F7 /* Sources */,
+ AFEE10741D15EB0800AAC8F7 /* Frameworks */,
+ AFEE107C1D15EB0800AAC8F7 /* Rez */,
+ AFEE107D1D15EB0800AAC8F7 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFEE106D1D15EB0700AAC8F7 /* PBXTargetDependency */,
+ );
+ name = CubeStack;
+ productName = DangerBall;
+ productReference = AFEE10811D15EB0800AAC8F7 /* CubeStack.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFEE108B1D17E20B00AAC8F7 /* Splodesic */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFEE109D1D17E20B00AAC8F7 /* Build configuration list for PBXNativeTarget "Splodesic" */;
+ buildPhases = (
+ AFEE108E1D17E20B00AAC8F7 /* Resources */,
+ AFEE10901D17E20B00AAC8F7 /* Sources */,
+ AFEE10931D17E20B00AAC8F7 /* Frameworks */,
+ AFEE109B1D17E20B00AAC8F7 /* Rez */,
+ AFEE109C1D17E20B00AAC8F7 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFEE108C1D17E20B00AAC8F7 /* PBXTargetDependency */,
+ );
+ name = Splodesic;
+ productName = DangerBall;
+ productReference = AFEE10A01D17E20B00AAC8F7 /* Splodesic.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFF2867F17860E830050A578 /* QuasiCrystal */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFF2868F17860E830050A578 /* Build configuration list for PBXNativeTarget "QuasiCrystal" */;
+ buildPhases = (
+ AFF2868217860E830050A578 /* Resources */,
+ AFF2868417860E830050A578 /* Sources */,
+ AFF2868717860E830050A578 /* Frameworks */,
+ AFF2868D17860E830050A578 /* Rez */,
+ AFF2868E17860E830050A578 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFF2868017860E830050A578 /* PBXTargetDependency */,
+ );
+ name = QuasiCrystal;
+ productName = DangerBall;
+ productReference = AFF2869217860E830050A578 /* QuasiCrystal.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFF3C9E817CCAC440028F240 /* Geodesic */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFF3C9F817CCAC440028F240 /* Build configuration list for PBXNativeTarget "Geodesic" */;
+ buildPhases = (
+ AFF3C9EB17CCAC440028F240 /* Resources */,
+ AFF3C9ED17CCAC440028F240 /* Sources */,
+ AFF3C9F017CCAC440028F240 /* Frameworks */,
+ AFF3C9F617CCAC440028F240 /* Rez */,
+ AFF3C9F717CCAC440028F240 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFF3C9E917CCAC440028F240 /* PBXTargetDependency */,
+ );
+ name = Geodesic;
+ productName = DangerBall;
+ productReference = AFF3C9FB17CCAC440028F240 /* Geodesic.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFF463360C4403E400EE6509 /* CWaves */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFF463440C4403E400EE6509 /* Build configuration list for PBXNativeTarget "CWaves" */;
+ buildPhases = (
+ AFF463390C4403E400EE6509 /* Resources */,
+ AFF4633B0C4403E400EE6509 /* Sources */,
+ AFF4633E0C4403E400EE6509 /* Frameworks */,
+ AFF463420C4403E400EE6509 /* Rez */,
+ AFF463430C4403E400EE6509 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFF463370C4403E400EE6509 /* PBXTargetDependency */,
+ );
+ name = CWaves;
+ productName = CWaves;
+ productReference = AFF463470C4403E400EE6509 /* CWaves.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFF463580C440AEF00EE6509 /* GLCells */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFF463690C440AEF00EE6509 /* Build configuration list for PBXNativeTarget "GLCells" */;
+ buildPhases = (
+ AFF4635B0C440AEF00EE6509 /* Resources */,
+ AFF4635D0C440AEF00EE6509 /* Sources */,
+ AFF463600C440AEF00EE6509 /* Frameworks */,
+ AFF463670C440AEF00EE6509 /* Rez */,
+ AFF463680C440AEF00EE6509 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFF463590C440AEF00EE6509 /* PBXTargetDependency */,
+ );
+ name = GLCells;
+ productName = GLCells;
+ productReference = AFF4636C0C440AEF00EE6509 /* GLCells.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ AFFAB31519158CE40020F021 /* ProjectivePlane */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = AFFAB32619158CE40020F021 /* Build configuration list for PBXNativeTarget "ProjectivePlane" */;
+ buildPhases = (
+ AFFAB31819158CE40020F021 /* Resources */,
+ AFFAB31A19158CE40020F021 /* Sources */,
+ AFFAB31D19158CE40020F021 /* Frameworks */,
+ AFFAB32419158CE40020F021 /* Rez */,
+ AFFAB32519158CE40020F021 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ AFFAB31619158CE40020F021 /* PBXTargetDependency */,
+ );
+ name = ProjectivePlane;
+ productName = DangerBall;
+ productReference = AFFAB32919158CE40020F021 /* ProjectivePlane.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+ CE3D01511B76F4C100993C75 /* TestX11 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = CE3D01631B76F4C100993C75 /* Build configuration list for PBXNativeTarget "TestX11" */;
+ buildPhases = (
+ CE3D01541B76F4C100993C75 /* Resources */,
+ CE3D01561B76F4C100993C75 /* Sources */,
+ CE3D01591B76F4C100993C75 /* Frameworks */,
+ CE3D01611B76F4C100993C75 /* Rez */,
+ CE3D01621B76F4C100993C75 /* Run Update Info Plist */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ CE3D01521B76F4C100993C75 /* PBXTargetDependency */,
+ );
+ name = TestX11;
+ productName = Attraction;
+ productReference = CE3D01661B76F4C100993C75 /* TestX11.saver */;
+ productType = "com.apple.product-type.bundle";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 29B97313FDCFA39411CA2CEA /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0940;
+ TargetAttributes = {
+ AF08398F09930B6B00277BE9 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF083A32099311D700277BE9 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF0DC7AB0C4C73F600D76972 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF0DCA420C4CBB0D00D76972 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF137D410F075C9B004DE3B2 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF1A17610D6D6EE3008AF328 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF1AD9E118500F9F00932759 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF1B0FA71D7AB4740011DBE4 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF2107711FD23BDD00B61EA9 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF32D9E00F3AD0B40080F535 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF3581BF1431D47B00E09C51 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF3581FB143330F900E09C51 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF35E88A0E63823600691F2F = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF39381A1D0FBD6A00205406 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF39E282198A11F60064A58D = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF3C71450D624BF50030CC0D = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF3EC9782035154C00180A35 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF41E952201D49DB0098E253 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF46E9CF1CBBA2B300240FBC = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF476FB5099D154F001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF476FDA099D1686001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF47704C099D4385001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF477169099D4786001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF47717F099D4803001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4771A7099D4949001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4771DB099D4D9A001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4771F2099D4E63001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF477208099D4EE8001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF47721E099D4F67001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF477253099D5717001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF47726B099D57B9001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF477283099D5926001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF477382099D65A1001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF47739A099D6648001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4773C1099D67B9001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF477401099D69E7001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF477426099D7C70001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF477442099D7D33001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF477483099D89E4001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF477499099D8A74001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4774B4099D8B5F001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4774CE099D8BFF001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF47755D099D9A1A001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF477583099D9C28001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF47759F099D9CF7001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4775D8099D9F69001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4775F2099DA030001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF477613099DA26C001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF477644099DA6D0001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF47765A099DA78E001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF477670099DA849001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF47768F099DAA6F001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4776AA099DABDD001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4776C0099DAC8A001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4776DB099DADDF001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4776F1099DAE7A001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF47770D099DAF9F001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF477723099DB044001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF477752099DB61E001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF477774099DB965001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF477790099DBA90001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4777D1099DC183001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4778AB099DDB79001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4778C7099DDCAE001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4778E8099DDDC8001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF477909099DE379001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF47792A099DE4C7001F091E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4808C0098C3B6C00FB32B8 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF480AAF098C669800FB32B8 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF480C49098E301400FB32B8 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF480D58098EED3D00FB32B8 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF480D59098EED5100FB32B8 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF480D5A098EED5E00FB32B8 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF480D72098EEDDE00FB32B8 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4810EB09909FBA00FB32B8 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4812500990CE2700FB32B8 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4812B30990D3D900FB32B8 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF48DEEF0A0C25E000F94CF9 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4A3449102A593600A81B2A = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4FD6E60CE7A486005EE58E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4FF4930D52CA0800666F98 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF4FF4BA0D52CBDE00666F98 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF5C9AF91A0CCE6E00B0147A = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF5ECEA92116B1A400069433 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF633C011EE0BA6F00AB33BD = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF63A7F11AB4EDDB00593C75 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF63F2471C3465BE0033E133 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF63F4501C34682A0033E133 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF63F4781C3469FC0033E133 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF6423F2099FF9C2000F4CD4 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF6425CC09A18855000F4CD4 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF6425EC09A189EC000F4CD4 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF64260F09A18D6C000F4CD4 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF64262C09A18F54000F4CD4 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF64264F09A19229000F4CD4 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF64267B09A194B0000F4CD4 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF64277109A1D37A000F4CD4 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF6427A809A2DE36000F4CD4 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF68A47E19196CF800D41CD1 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF73FF221A09877F00E485E9 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF7510FF1782B5B900380EA1 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF7776E409B63ABF00EA3033 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF77771A09B6416100EA3033 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF77773E09B6446500EA3033 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF77777409B6497800EA3033 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF77778E09B64A5200EA3033 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF7777A809B64B2600EA3033 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF7777D009B64C6B00EA3033 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF7777EA09B64E3100EA3033 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF77781009B6504400EA3033 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF77784409B6528100EA3033 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF77786109B6536000EA3033 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF77787F09B6563500EA3033 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF7778A509B659C800EA3033 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF78D175142DD8F3002AAF77 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF794F64099748450059A8B0 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF794F8E09974A320059A8B0 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF794FCD09974FA60059A8B0 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF7ACFC019FF0A9200BD752B = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF918977158FC00A002B5D1E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF97572D099C317000B05160 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF975775099C374A00B05160 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF9757C2099C3E6300B05160 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF975808099C41D500B05160 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF975865099C475900B05160 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF975A36099C681F00B05160 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF975A6C099C6AB200B05160 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF975A86099C6BC300B05160 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF975AD7099C6EB100B05160 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF975AFC099C6FE400B05160 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF975C12099C8C1500B05160 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF975C3D099C8DCF00B05160 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF975C5D099C8F3F00B05160 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF975D52099CA0F000B05160 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF976FBB0989CAA2001F8B92 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF9770290989D1E6001F8B92 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF9770660989D2F6001F8B92 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF9771D60989DC4A001F8B92 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF998EDA0A083DB30051049D = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF9D466609B5109C006E59CF = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF9D474409B5300A006E59CF = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF9D475F09B53166006E59CF = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF9D48DB09B53322006E59CF = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF9D48F409B535DA006E59CF = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF9D492B09B53CBA006E59CF = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF9D495409B53FC9006E59CF = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF9D496C09B5411D006E59CF = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF9D499709B544C2006E59CF = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF9D4C6909B59F27006E59CF = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF9D4CE709B5AA8E006E59CF = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF9D4D7E09B5B2DC006E59CF = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF9D4DAF09B5B71E006E59CF = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF9D4DEC09B5BB19006E59CF = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AF9E7EBE190F4C1B00A8B01F = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA2118C1CD59DAF00C0D2A1 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA3392E0B058505002B0E7D = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA33BC60B058740002B0E7D = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA33C020B058E17002B0E7D = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55946099330B000F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA5596D0993317900F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA559920993322100F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA559B50993328000F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA559CF0993330600F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55A030993340300F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55A20099334A000F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55A790993364300F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55ACF09933CEF00F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55B0909933E0500F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55B2509933E8D00F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55B7909933F7200F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55B9109933FDA00F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55BAB099340CE00F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55BE40993429100F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55C0E0993431300F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55C77099349A600F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55CA909934BB200F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55CCC09934CE400F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55D3C0993565300F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55D620993584B00F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55D7F099358C400F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55DC809935D7000F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55DF009935E4900F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55E0D09935EDC00F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55E2F09935F8E00F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55E4E09935FF900F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55EC7099360E300F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55F06099361B700F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55F2A0993622F00F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55F420993629000F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55F720993643600F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55FD309936BFA00F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA55FF909936C6D00F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA5601409936CC800F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA5603209936D5100F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA5604A09936E2100F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA5606209936F3800F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA560AE0993718D00F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA560FD0993781600F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA56119099378CB00F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA5615609937C0D00F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA5617B09937CF100F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA5619D09937D7E00F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA562060993849F00F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA5621F0993852500F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA562BF099392C600F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA562DA099393C900F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA562F20993943B00F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA563130993951000F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA56331099395ED00F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA56351099396C000F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA56379099397B300F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA563A4099398BB00F3E977 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFA6AAF020999950006D2685 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFAAE387207D6343007A515C = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFAC36B6202E7F79001A684C = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFACE8731CC83458008B24CD = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFB591A7178B812C00EA4005 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFBFE74B178642DC00432B21 = {
+ DevelopmentTeam = 4627ATJELP;
+ SystemCapabilities = {
+ com.apple.Sandbox = {
+ enabled = 0;
+ };
+ };
+ };
+ AFBFE767178647FE00432B21 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFC0E8AB1CDC601A008CAFAC = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFC5CFD62044AA23004CEB5E = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFCF833B1AF5B515008BB7E1 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD51B1B0F063B4A00471C02 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD56DF10996A03800BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD56EAE0996A72600BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD56EDA0996A95700BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD56F0B0996AAFA00BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD56F230996AB8A00BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD56F4F0996AEEE00BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD56F6B0996B01600BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD56F8C0996B09400BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD56FA30996B10F00BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD56FB90996B18F00BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD56FCF0996B20900BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD56FF80996B43800BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD5700F0996B4CC00BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD570260996B56D00BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD570430996B61600BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD570590996B6A300BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD5706F0996B72700BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD570850996B80300BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD5709B0996B88E00BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD570B10996B93000BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD570C90996B9F800BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD570EA0996BBBF00BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD571130996BE9300BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD5712C0996BF2E00BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD571430996C01700BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD571590996C0CE00BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD571B50996D9DC00BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD572220996E4A300BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD5726D0996EE8500BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD572A50996F99600BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD572C20996FC0F00BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD572F9099701C000BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD5735D0997411200BA26F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFD77E5B20C23F8600A3638D = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFDA658E178A52B70070D24B = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFE2A4560E2E904600ADB298 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFE30BE80E52B14700CCF4A5 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFE6A1820CDD7B2E002805BF = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFE6A41B0CDD7FAA002805BF = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFEC23CD1CB6EAE100DE138F = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFEE104D1D13406000AAC8F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFEE106C1D15EB0700AAC8F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFEE108B1D17E20B00AAC8F7 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFF2867F17860E830050A578 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFF3C9E817CCAC440028F240 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFF463360C4403E400EE6509 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFF463580C440AEF00EE6509 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ AFFAB31519158CE40020F021 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ CE3D01511B76F4C100993C75 = {
+ DevelopmentTeam = 4627ATJELP;
+ };
+ };
+ };
+ buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "xscreensaver" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 1;
+ knownRegions = (
+ English,
+ Japanese,
+ French,
+ German,
+ en,
+ Base,
+ );
+ mainGroup = 29B97314FDCFA39411CA2CEA /* xscreensaver */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ AF480D5A098EED5E00FB32B8 /* All Savers */,
+ AF4808C0098C3B6C00FB32B8 /* jwxyz */,
+ AFAC36B6202E7F79001A684C /* images_png_h */,
+ AF480AAF098C669800FB32B8 /* All Savers (XScreenSaver) */,
+ AFE6A41B0CDD7FAA002805BF /* Abstractile */,
+ AF47721E099D4F67001F091E /* Anemone */,
+ AF4773C1099D67B9001F091E /* Anemotaxis */,
+ AF9D4DEC09B5BB19006E59CF /* Apple2 */,
+ AF63F2471C3465BE0033E133 /* Apple2-iOS */,
+ AFBFE74B178642DC00432B21 /* Apple2-OSX */,
+ AF9770660989D2F6001F8B92 /* Attraction */,
+ AF975A86099C6BC300B05160 /* Barcode */,
+ AF73FF221A09877F00E485E9 /* BinaryRing */,
+ AF47768F099DAA6F001F091E /* Blaster */,
+ AF7778A509B659C800EA3033 /* BlitSpin */,
+ AF4777D1099DC183001F091E /* BoxFit */,
+ AF9D4DAF09B5B71E006E59CF /* BSOD */,
+ AF9D48DB09B53322006E59CF /* Bumps */,
+ AF4771DB099D4D9A001F091E /* CCurve */,
+ AF477774099DB965001F091E /* Celtic */,
+ AF47770D099DAF9F001F091E /* CloudLife */,
+ AF477169099D4786001F091E /* Compass */,
+ AF4775D8099D9F69001F091E /* Coral */,
+ AFF463360C4403E400EE6509 /* CWaves */,
+ AF4778E8099DDDC8001F091E /* Cynosure */,
+ AF9D466609B5109C006E59CF /* DecayScreen */,
+ AF976FBB0989CAA2001F8B92 /* Deco */,
+ AF47704C099D4385001F091E /* Deluxe */,
+ AF9D48F409B535DA006E59CF /* Distort */,
+ AF4775F2099DA030001F091E /* Epicycle */,
+ AF975A6C099C6AB200B05160 /* Eruption */,
+ AFD77E5B20C23F8600A3638D /* FilmLeader */,
+ AF975AD7099C6EB100B05160 /* Fireworkx */,
+ AF477483099D89E4001F091E /* Flame */,
+ AF477790099DBA90001F091E /* FluidBalls */,
+ AF77787F09B6563500EA3033 /* FontGlide */,
+ AF47739A099D6648001F091E /* FuzzyFlakes */,
+ AFA6AAF020999950006D2685 /* GlitchPEG */,
+ AF64267B09A194B0000F4CD4 /* Goop */,
+ AF975C3D099C8DCF00B05160 /* Greynetic */,
+ AF477253099D5717001F091E /* Halftone */,
+ AF975C12099C8C1500B05160 /* Halo */,
+ AF480C49098E301400FB32B8 /* Helix */,
+ AFB591A7178B812C00EA4005 /* Hexadrop */,
+ AF477426099D7C70001F091E /* IFS */,
+ AF97572D099C317000B05160 /* IMSMap */,
+ AF477752099DB61E001F091E /* Interaggregate */,
+ AF476FB5099D154F001F091E /* Interference */,
+ AF477401099D69E7001F091E /* Intermomentary */,
+ AF477499099D8A74001F091E /* Kaleidescope */,
+ AF477613099DA26C001F091E /* Kumppa */,
+ AF1A17610D6D6EE3008AF328 /* LCDscrub */,
+ AF4FF4930D52CA0800666F98 /* m6502.h */,
+ AF0DC7AB0C4C73F600D76972 /* m6502 */,
+ AF4774CE099D8BFF001F091E /* Maze */,
+ AF975AFC099C6FE400B05160 /* MemScroller */,
+ AF975A36099C681F00B05160 /* MetaBalls */,
+ AF975775099C374A00B05160 /* Moire */,
+ AF64262C09A18F54000F4CD4 /* Moire2 */,
+ AF64264F09A19229000F4CD4 /* Munch */,
+ AF4771F2099D4E63001F091E /* NerveRot */,
+ AF975C5D099C8F3F00B05160 /* NoseGuy */,
+ AF47755D099D9A1A001F091E /* Pedal */,
+ AF4778AB099DDB79001F091E /* Penetrate */,
+ AF477670099DA849001F091E /* Petri */,
+ AF7776E409B63ABF00EA3033 /* Phosphor */,
+ AF63F4501C34682A0033E133 /* Phosphor-iOS */,
+ AFBFE767178647FE00432B21 /* Phosphor-OSX */,
+ AF477283099D5926001F091E /* Piecewise */,
+ AF9D4CE709B5AA8E006E59CF /* Pong */,
+ AF47726B099D57B9001F091E /* PopSquares */,
+ AF477583099D9C28001F091E /* Pyro */,
+ AF6425EC09A189EC000F4CD4 /* Qix */,
+ AF9757C2099C3E6300B05160 /* RDbomb */,
+ AF9D492B09B53CBA006E59CF /* Ripples */,
+ AF975D52099CA0F000B05160 /* Rocks */,
+ AF9770290989D1E6001F8B92 /* Rorschach */,
+ AF9D495409B53FC9006E59CF /* RotZoomer */,
+ AF975865099C475900B05160 /* ShadeBobs */,
+ AF9D474409B5300A006E59CF /* SlideScreen */,
+ AF47792A099DE4C7001F091E /* Slip */,
+ AF64277109A1D37A000F4CD4 /* SpeedMine */,
+ AF9D499709B544C2006E59CF /* Spotlight */,
+ AF477644099DA6D0001F091E /* Squiral */,
+ AF47759F099D9CF7001F091E /* Starfish */,
+ AF477723099DB044001F091E /* Substrate */,
+ AF68A47E19196CF800D41CD1 /* Tessellimage */,
+ AF476FDA099D1686001F091E /* Truchet */,
+ AF9D496C09B5411D006E59CF /* Twang */,
+ AF4776F1099DAE7A001F091E /* Vermiculate */,
+ AF5ECEA92116B1A400069433 /* VFeedback */,
+ AF47717F099D4803001F091E /* Wander */,
+ AFA3392E0B058505002B0E7D /* WebCollage */,
+ AFA33C020B058E17002B0E7D /* webcollage-perl */,
+ AFA33BC60B058740002B0E7D /* webcollage-helper */,
+ AF4776DB099DADDF001F091E /* WhirlWindWarp */,
+ AF477382099D65A1001F091E /* Wormhole */,
+ AF975808099C41D500B05160 /* XFlame */,
+ AF9D4D7E09B5B2DC006E59CF /* XAnalogTV */,
+ AF4778C7099DDCAE001F091E /* XJack */,
+ AF9D4C6909B59F27006E59CF /* XLyap */,
+ AF477442099D7D33001F091E /* XMatrix */,
+ AF4776C0099DAC8A001F091E /* XRaySwarm */,
+ AF4776AA099DABDD001F091E /* XSpirograph */,
+ AF9D475F09B53166006E59CF /* Zoom */,
+ AF480D58098EED3D00FB32B8 /* All Savers (XLockmore) */,
+ AFD5712C0996BF2E00BA26F7 /* Apollonian */,
+ AFD572A50996F99600BA26F7 /* Bouboule */,
+ AFD56EAE0996A72600BA26F7 /* Braid */,
+ AFD572C20996FC0F00BA26F7 /* Crystal */,
+ AF794F64099748450059A8B0 /* Demon */,
+ AFD571130996BE9300BA26F7 /* Discrete */,
+ AF480D72098EEDDE00FB32B8 /* Drift */,
+ AFD571430996C01700BA26F7 /* Euler2D */,
+ AFD570590996B6A300BA26F7 /* FadePlot */,
+ AF794F8E09974A320059A8B0 /* Fiberlamp */,
+ AFD570EA0996BBBF00BA26F7 /* Flow */,
+ AFD56F230996AB8A00BA26F7 /* Galaxy */,
+ AFD56F4F0996AEEE00BA26F7 /* Grav */,
+ AFD56F6B0996B01600BA26F7 /* Hopalong */,
+ AFD572F9099701C000BA26F7 /* Julia */,
+ AF794FCD09974FA60059A8B0 /* Loop */,
+ AFD5706F0996B72700BA26F7 /* Mountain */,
+ AF77771A09B6416100EA3033 /* Pacman */,
+ AFD56FF80996B43800BA26F7 /* Penrose */,
+ AFD5726D0996EE8500BA26F7 /* Polyominoes */,
+ AFD5700F0996B4CC00BA26F7 /* Sierpinski */,
+ AFD5735D0997411200BA26F7 /* Strange */,
+ AFD572220996E4A300BA26F7 /* Swirl */,
+ AFD571590996C0CE00BA26F7 /* Thornbird */,
+ AFD570850996B80300BA26F7 /* Triangle */,
+ AF480D59098EED5100FB32B8 /* All Savers (OpenGL) */,
+ AFA5604A09936E2100F3E977 /* AntInspect */,
+ AFA562DA099393C900F3E977 /* AntMaze */,
+ AFA5606209936F3800F3E977 /* AntSpotlight */,
+ AF08398F09930B6B00277BE9 /* Atlantis */,
+ AF083A32099311D700277BE9 /* Atunnel */,
+ AFA5615609937C0D00F3E977 /* BlinkBox */,
+ AFA5601409936CC800F3E977 /* BlockTube */,
+ AFA562BF099392C600F3E977 /* Boing */,
+ AFA55EC7099360E300F3E977 /* BouncingCow */,
+ AFA55CA909934BB200F3E977 /* Boxed */,
+ AFA55ACF09933CEF00F3E977 /* Bubble3D */,
+ AFA55946099330B000F3E977 /* Cage */,
+ AF77784409B6528100EA3033 /* Carousel */,
+ AFA55BAB099340CE00F3E977 /* Circuit */,
+ AF5C9AF91A0CCE6E00B0147A /* Cityflow */,
+ AF3581BF1431D47B00E09C51 /* CompanionCube */,
+ AFA563130993951000F3E977 /* Crackberg */,
+ AFC5CFD62044AA23004CEB5E /* Crumbler */,
+ AFA56351099396C000F3E977 /* Cube21 */,
+ AFA55D620993584B00F3E977 /* Cubenetic */,
+ AFEE106C1D15EB0700AAC8F7 /* CubeStack */,
+ AFA55FD309936BFA00F3E977 /* CubeStorm */,
+ AFEE104D1D13406000AAC8F7 /* CubeTwist */,
+ AF4FF4BA0D52CBDE00666F98 /* CubicGrid */,
+ AF4810EB09909FBA00FB32B8 /* DangerBall */,
+ AF39381A1D0FBD6A00205406 /* Discoball */,
+ AF77786109B6536000EA3033 /* DNAlogo */,
+ AFEC23CD1CB6EAE100DE138F /* DymaxionMap */,
+ AFACE8731CC83458008B24CD /* EnergyStream */,
+ AFA55E0D09935EDC00F3E977 /* Endgame */,
+ AFA55C0E0993431300F3E977 /* Engine */,
+ AF2107711FD23BDD00B61EA9 /* Esper */,
+ AF6423F2099FF9C2000F4CD4 /* Extrusion */,
+ AFA5603209936D5100F3E977 /* FlipFlop */,
+ AF77773E09B6446500EA3033 /* FlipScreen3D */,
+ AF7777EA09B64E3100EA3033 /* FlipText */,
+ AFA55E4E09935FF900F3E977 /* FlyingToasters */,
+ AF4812500990CE2700FB32B8 /* Gears */,
+ AFF3C9E817CCAC440028F240 /* Geodesic */,
+ AF7ACFC019FF0A9200BD752B /* GeodesicGears */,
+ AFA55B9109933FDA00F3E977 /* GFlux */,
+ AFA55E2F09935F8E00F3E977 /* GLBlur */,
+ AFF463580C440AEF00EE6509 /* GLCells */,
+ AF77777409B6497800EA3033 /* Gleidescope */,
+ AFA56331099395ED00F3E977 /* GLHanoi */,
+ AFA55FF909936C6D00F3E977 /* GLKnots */,
+ AFA55F720993643600F3E977 /* GLMatrix */,
+ AFA55B0909933E0500F3E977 /* GLPlanet */,
+ AF48DEEF0A0C25E000F94CF9 /* GLSchool */,
+ AF7777D009B64C6B00EA3033 /* GLSlideshow */,
+ AFA55C77099349A600F3E977 /* GLSnake */,
+ AFD56DF10996A03800BA26F7 /* GLText */,
+ AF1B0FA71D7AB4740011DBE4 /* Hexstrut */,
+ AF78D175142DD8F3002AAF77 /* Hilbert */,
+ AFC0E8AB1CDC601A008CAFAC /* Hydrostat */,
+ AFA55F420993629000F3E977 /* Hypertorus */,
+ AF3C71450D624BF50030CC0D /* Hypnowheel */,
+ AFA55F06099361B700F3E977 /* JigglyPuff */,
+ AF35E88A0E63823600691F2F /* Jigsaw */,
+ AFA563A4099398BB00F3E977 /* Juggler3D */,
+ AF7510FF1782B5B900380EA1 /* Kaleidocycle */,
+ AFA55F2A0993622F00F3E977 /* Klein */,
+ AFA55A790993364300F3E977 /* Lament */,
+ AFA55DC809935D7000F3E977 /* Lavalite */,
+ AF4FD6E60CE7A486005EE58E /* Lockward */,
+ AFAAE387207D6343007A515C /* Maze3D */,
+ AFA55BE40993429100F3E977 /* Menger */,
+ AF77778E09B64A5200EA3033 /* MirrorBlob */,
+ AFA5596D0993317900F3E977 /* Moebius */,
+ AFE6A1820CDD7B2E002805BF /* MoebiusGears */,
+ AFA56119099378CB00F3E977 /* molecules.h */,
+ AFA560FD0993781600F3E977 /* Molecule */,
+ AFA559B50993328000F3E977 /* Morph3D */,
+ AFA5617B09937CF100F3E977 /* Noof */,
+ AF3EC9782035154C00180A35 /* Peepers */,
+ AFD51B1B0F063B4A00471C02 /* Photopile */,
+ AFA5621F0993852500F3E977 /* Pinion */,
+ AF4812B30990D3D900FB32B8 /* Pipes */,
+ AFA5619D09937D7E00F3E977 /* Polyhedra */,
+ AFA560AE0993718D00F3E977 /* Polytopes */,
+ AFFAB31519158CE40020F021 /* ProjectivePlane */,
+ AFA562060993849F00F3E977 /* Providence */,
+ AFA55B2509933E8D00F3E977 /* Pulsar */,
+ AFF2867F17860E830050A578 /* QuasiCrystal */,
+ AFA55DF009935E4900F3E977 /* Queens */,
+ AF41E952201D49DB0098E253 /* RazzleDazzle */,
+ AFA2118C1CD59DAF00C0D2A1 /* RaverHoop */,
+ AF63A7F11AB4EDDB00593C75 /* RomanBoy */,
+ AFA559CF0993330600F3E977 /* Rubik */,
+ AF32D9E00F3AD0B40080F535 /* RubikBlocks */,
+ AFA55D3C0993565300F3E977 /* SBalls */,
+ AFA55B7909933F7200F3E977 /* Sierpinski3D */,
+ AFE2A4560E2E904600ADB298 /* SkyTentacles */,
+ AFE30BE80E52B14700CCF4A5 /* Sonar */,
+ AFA55D7F099358C400F3E977 /* Spheremonics */,
+ AFCF833B1AF5B515008BB7E1 /* SplitFlap */,
+ AFEE108B1D17E20B00AAC8F7 /* Splodesic */,
+ AFA55A20099334A000F3E977 /* Sproingies */,
+ AFA55A030993340300F3E977 /* Stairs */,
+ AF77781009B6504400EA3033 /* StarWars */,
+ AF7777A809B64B2600EA3033 /* StonerView */,
+ AFA559920993322100F3E977 /* Superquadrics */,
+ AF4A3449102A593600A81B2A /* Surfaces */,
+ AFA562F20993943B00F3E977 /* Tangram */,
+ AFA56379099397B300F3E977 /* TimeTunnel */,
+ AF998EDA0A083DB30051049D /* TopBlock */,
+ AF3581FB143330F900E09C51 /* TronBit */,
+ AF46E9CF1CBBA2B300240FBC /* Unicrud */,
+ AFDA658E178A52B70070D24B /* Unknown Pleasures */,
+ AF633C011EE0BA6F00AB33BD /* Vigilance */,
+ AF0DCA420C4CBB0D00D76972 /* Voronoi */,
+ AF39E282198A11F60064A58D /* WindupRobot */,
+ AF137D410F075C9B004DE3B2 /* Obsolete */,
+ AFA55CCC09934CE400F3E977 /* GLForestFire */,
+ AFD570C90996B9F800BA26F7 /* Ant */,
+ AF6427A809A2DE36000F4CD4 /* Bubbles */,
+ AF47765A099DA78E001F091E /* Critical */,
+ AF477909099DE379001F091E /* Flag */,
+ AFD56EDA0996A95700BA26F7 /* Forest */,
+ AF64260F09A18D6C000F4CD4 /* HyperBall */,
+ AF6425CC09A18855000F4CD4 /* HyperCube */,
+ AFD571B50996D9DC00BA26F7 /* Juggle */,
+ AFD56F8C0996B09400BA26F7 /* Laser */,
+ AFD56FA30996B10F00BA26F7 /* Lightning */,
+ AFD56FB90996B18F00BA26F7 /* Lisa */,
+ AFD56FCF0996B20900BA26F7 /* Lissie */,
+ AF4774B4099D8B5F001F091E /* LMorph */,
+ AFD570B10996B93000BA26F7 /* Rotor */,
+ AFD570260996B56D00BA26F7 /* Sphere */,
+ AFD570430996B61600BA26F7 /* Spiral */,
+ AF4771A7099D4949001F091E /* T3D */,
+ CE3D01511B76F4C100993C75 /* TestX11 */,
+ AF63F4781C3469FC0033E133 /* TestX11-iOS */,
+ AFD56F0B0996AAFA00BA26F7 /* Vines */,
+ AF477208099D4EE8001F091E /* Whirlygig */,
+ AFD5709B0996B88E00BA26F7 /* Worm */,
+ AF9E7EBE190F4C1B00A8B01F /* enable_gc */,
+ AF9771D60989DC4A001F8B92 /* SaverTester */,
+ AF918977158FC00A002B5D1E /* XScreenSaver-iOS */,
+ AF1AD9E118500F9F00932759 /* XScreenSaverUpdater */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ AF08399209930B6B00277BE9 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF0839A609930BAC00277BE9 /* atlantis.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF083A35099311D700277BE9 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF083A4B0993120900277BE9 /* atunnel.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF0DC7AE0C4C73F600D76972 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF0DCA380C4C74B700D76972 /* m6502.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF0DCA450C4CBB0D00D76972 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF0DCA620C4CBB8E00D76972 /* voronoi.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF1A17640D6D6EE3008AF328 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1A17810D6D6F62008AF328 /* lcdscrub.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF1AD9E018500F9F00932759 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1ADA1B18501B3D00932759 /* SaverRunner.icns in Resources */,
+ AF3633FC18530DD90086A439 /* sparkle_dsa_pub.pem in Resources */,
+ AF1ADA161850157400932759 /* Updater.xib in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF1B0FAA1D7AB4740011DBE4 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1B0FC11D7AB53A0011DBE4 /* hexstrut.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF2107741FD23BDD00B61EA9 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF2107891FD23D2800B61EA9 /* esper.xml in Resources */,
+ AFC523C31FED9420001C300A /* xscreensaver-getimage-file in Resources */,
+ AF2107901FD23FEC00B61EA9 /* OCRAStd.otf in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF32D9E30F3AD0B40080F535 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF32D9FD0F3AD1330080F535 /* rubikblocks.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF3581C21431D47B00E09C51 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF3581C31431D47B00E09C51 /* voronoi.xml in Resources */,
+ AF3581E81431D61D00E09C51 /* companioncube.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF3581FE143330F900E09C51 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF3581FF143330F900E09C51 /* voronoi.xml in Resources */,
+ AF3582221433318500E09C51 /* tronbit.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF35E88D0E63823600691F2F /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF35EB240E63829600691F2F /* jigsaw.xml in Resources */,
+ AF4A8CA010B609B50074B062 /* xscreensaver-getimage-file in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF39381D1D0FBD6A00205406 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF3938331D0FBF0100205406 /* discoball.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF39E285198A11F60064A58D /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF39E2AD198A15820064A58D /* winduprobot.xml in Resources */,
+ AFCF509D198C3612005B0DB1 /* xscreensaver-text in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF3C71480D624BF50030CC0D /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF3C71600D624C7C0030CC0D /* hypnowheel.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF3EC97B2035154C00180A35 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF3EC990203517AE00180A35 /* peepers.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF41E955201D49DB0098E253 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF41E96E201D4B940098E253 /* razzledazzle.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF46E9D21CBBA2B300240FBC /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF46E9E81CBBA41600240FBC /* unicrud.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF476FB8099D154F001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF476FCF099D1587001F091E /* interference.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF476FDD099D1686001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF476FEF099D16E4001F091E /* truchet.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47704F099D4385001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF47705E099D43B7001F091E /* deluxe.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47716C099D4786001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF47717B099D47B7001F091E /* compass.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477182099D4803001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477191099D4846001F091E /* wander.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4771AA099D4949001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4771B9099D4981001F091E /* t3d.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4771DE099D4D9A001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4771EE099D4DE5001F091E /* ccurve.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4771F5099D4E63001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477204099D4EA2001F091E /* nerverot.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47720B099D4EE8001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF47721A099D4F27001F091E /* whirlygig.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477221099D4F67001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477230099D4FBD001F091E /* anemone.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477256099D5717001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477265099D5752001F091E /* halftone.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47726E099D57B9001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF47727D099D57F5001F091E /* popsquares.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477286099D5926001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477296099D596A001F091E /* piecewise.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477385099D65A1001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477394099D65EB001F091E /* wormhole.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47739D099D6648001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4773AC099D6762001F091E /* fuzzyflakes.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4773C4099D67B9001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4773D3099D6804001F091E /* anemotaxis.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477404099D69E7001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF47741B099D6A58001F091E /* intermomentary.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477429099D7C70001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477439099D7CD0001F091E /* ifs.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477445099D7D33001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477454099D7D75001F091E /* xmatrix.xml in Resources */,
+ AF998ED60A083A280051049D /* xscreensaver-text in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477486099D89E4001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477495099D8A3A001F091E /* flame.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47749C099D8A74001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4774AB099D8AF3001F091E /* kaleidescope.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4774B7099D8B5F001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4774CA099D8BAE001F091E /* lmorph.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4774D1099D8BFF001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4774E0099D8C74001F091E /* maze.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477560099D9A1A001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF47756F099D9A70001F091E /* pedal.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477586099D9C28001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF47759B099D9C8D001F091E /* pyro.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4775A2099D9CF7001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4775B1099D9D51001F091E /* starfish.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4775DB099D9F69001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4775EC099D9FDB001F091E /* coral.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4775F5099DA030001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477604099DA083001F091E /* epicycle.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477616099DA26C001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477629099DA2D2001F091E /* kumppa.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477647099DA6D0001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477656099DA738001F091E /* squiral.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47765D099DA78E001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF47766C099DA7F3001F091E /* critical.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477673099DA849001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477682099DA8AC001F091E /* petri.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477692099DAA6F001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4776A1099DAAC9001F091E /* blaster.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4776AD099DABDD001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4776BC099DAC29001F091E /* xspirograph.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4776C3099DAC8A001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4776D2099DACD6001F091E /* xrayswarm.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4776DE099DADDF001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4776ED099DAE38001F091E /* whirlwindwarp.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4776F4099DAE7A001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477703099DAF24001F091E /* vermiculate.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477710099DAF9F001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF47771F099DB000001F091E /* cloudlife.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477726099DB044001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477735099DB0ED001F091E /* substrate.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477755099DB61E001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477768099DB6FD001F091E /* interaggregate.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477777099DB965001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477786099DBA11001F091E /* celtic.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477793099DBA90001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4777A3099DBAF8001F091E /* fluidballs.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4777D4099DC183001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4778A2099DDA76001F091E /* boxfit.xml in Resources */,
+ AF0FAF1609CA712600EE1051 /* xscreensaver-getimage-file in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4778AE099DDB79001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4778BD099DDC1B001F091E /* penetrate.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4778CA099DDCAE001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4778D9099DDD14001F091E /* xjack.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4778EB099DDDC8001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4778FA099DDE5F001F091E /* cynosure.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47790C099DE379001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF47791B099DE3D9001F091E /* flag.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47792D099DE4C7001F091E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF47793C099DE535001F091E /* slip.xml in Resources */,
+ AF0FAF2509CA712600EE1051 /* xscreensaver-getimage-file in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF480C4C098E301400FB32B8 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF480C69098E309E00FB32B8 /* helix.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF480D75098EEDDE00FB32B8 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF480D85098EEE3100FB32B8 /* drift.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4810EE09909FBA00FB32B8 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4811440990A35B00FB32B8 /* dangerball.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4812530990CE2700FB32B8 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF48126D0990CE8600FB32B8 /* gears.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4812B60990D3D900FB32B8 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4812C80990D41700FB32B8 /* pipes.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF48DEF20A0C25E000F94CF9 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF48E16C0A0C26A400F94CF9 /* glschool.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4A344C102A593600A81B2A /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4A3462102A59EB00A81B2A /* surfaces.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4FD6E90CE7A486005EE58E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4FD7030CE7A5BC005EE58E /* lockward.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4FF4BD0D52CBDE00666F98 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4FF4D40D52CCAA00666F98 /* cubicgrid.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF5C9AFC1A0CCE6E00B0147A /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF5C9B111A0CCF4E00B0147A /* cityflow.xml in Resources */,
+ AF5C9AFD1A0CCE6E00B0147A /* dangerball.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF5ECEAC2116B1A400069433 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF5ECEC62116B2FE00069433 /* vfeedback.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF633C041EE0BA6F00AB33BD /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF633C1B1EE0BC5A00AB33BD /* vigilance.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF63A7F41AB4EDDB00593C75 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF63A80A1AB4EF5D00593C75 /* romanboy.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF63F2501C3465BE0033E133 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF63F2511C3465BE0033E133 /* iSaverRunner.xib in Resources */,
+ AF63F2521C3465BE0033E133 /* LaunchScreen.xib in Resources */,
+ AF63F2531C3465BE0033E133 /* iSaverRunner57t.png in Resources */,
+ AF63F25D1C3465BE0033E133 /* apple2.xml in Resources */,
+ AF63F2B71C3465BE0033E133 /* Media-iOS.xcassets in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF63F4581C34682A0033E133 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF63F4591C34682A0033E133 /* iSaverRunner.xib in Resources */,
+ AF63F45A1C34682A0033E133 /* LaunchScreen.xib in Resources */,
+ AF63F45B1C34682A0033E133 /* iSaverRunner57t.png in Resources */,
+ AF63F4761C3469410033E133 /* phosphor.xml in Resources */,
+ AF63F45D1C34682A0033E133 /* Media-iOS.xcassets in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF63F4801C3469FC0033E133 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF63F4811C3469FC0033E133 /* iSaverRunner.xib in Resources */,
+ AF63F4821C3469FC0033E133 /* LaunchScreen.xib in Resources */,
+ AF63F4831C3469FC0033E133 /* iSaverRunner57t.png in Resources */,
+ AF63F49C1C346B0A0033E133 /* testx11.xml in Resources */,
+ AF63F4851C3469FC0033E133 /* Media-iOS.xcassets in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF6423F5099FF9C2000F4CD4 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF642408099FFAB0000F4CD4 /* extrusion.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF6425CF09A18855000F4CD4 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF6425DE09A188D7000F4CD4 /* hypercube.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF6425EF09A189EC000F4CD4 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF6425FE09A18A77000F4CD4 /* qix.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF64261209A18D6C000F4CD4 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF64262109A18DFF000F4CD4 /* hyperball.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF64262F09A18F54000F4CD4 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF64263E09A18FCE000F4CD4 /* moire2.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF64265209A19229000F4CD4 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF64266109A1929A000F4CD4 /* munch.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF64267E09A194B0000F4CD4 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF64268D09A19525000F4CD4 /* goop.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF64277409A1D37A000F4CD4 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF64278309A1D418000F4CD4 /* speedmine.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF6427AB09A2DE36000F4CD4 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF6427BA09A2DF09000F4CD4 /* bubbles.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF68A48119196CF800D41CD1 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF68A49719196E3E00D41CD1 /* tessellimage.xml in Resources */,
+ AF4A6692191F7CAE00C74753 /* xscreensaver-getimage-file in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF73FF251A09877F00E485E9 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF73FF3C1A0988C500E485E9 /* binaryring.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7511021782B5B900380EA1 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFB8A69B1782BA34004EDB85 /* kaleidocycle.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7776E709B63ABF00EA3033 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF77770209B63B3900EA3033 /* phosphor.xml in Resources */,
+ AF0FAF1009CA6FF900EE1051 /* xscreensaver-text in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77771D09B6416100EA3033 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF77772C09B641C800EA3033 /* pacman.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77774109B6446500EA3033 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF77775309B644E300EA3033 /* flipscreen3d.xml in Resources */,
+ AF0FAF1C09CA712600EE1051 /* xscreensaver-getimage-file in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77777709B6497800EA3033 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF77778A09B64A0D00EA3033 /* gleidescope.xml in Resources */,
+ AF0FAF1E09CA712600EE1051 /* xscreensaver-getimage-file in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77779109B64A5200EA3033 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF7777A409B64AE200EA3033 /* mirrorblob.xml in Resources */,
+ AF0FAF2109CA712600EE1051 /* xscreensaver-getimage-file in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7777AB09B64B2600EA3033 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF7777BE09B64BAC00EA3033 /* stonerview.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7777D309B64C6B00EA3033 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF7777E609B64CD800EA3033 /* glslideshow.xml in Resources */,
+ AF0FAF1F09CA712600EE1051 /* xscreensaver-getimage-file in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7777ED09B64E3100EA3033 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF77780009B64EA800EA3033 /* fliptext.xml in Resources */,
+ AF0FAF0D09CA6FF900EE1051 /* xscreensaver-text in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77781309B6504400EA3033 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF77782709B650D200EA3033 /* starwars.xml in Resources */,
+ AF0FAF1109CA6FF900EE1051 /* xscreensaver-text in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77784709B6528100EA3033 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF77787D09B654FE00EA3033 /* carousel.xml in Resources */,
+ AF0FAF1909CA712600EE1051 /* xscreensaver-getimage-file in Resources */,
+ AF01590A2077F56000F624F5 /* OCRAStd.otf in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77786409B6536000EA3033 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF77787A09B6545E00EA3033 /* dnalogo.xml in Resources */,
+ AFC43E7B1C6AA77900C89999 /* YearlReg.ttf in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77788209B6563500EA3033 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF77789109B656A900EA3033 /* fontglide.xml in Resources */,
+ AF0FAF0E09CA6FF900EE1051 /* xscreensaver-text in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7778A809B659C800EA3033 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF7778B909B65A6E00EA3033 /* blitspin.xml in Resources */,
+ AF0FAF1509CA712600EE1051 /* xscreensaver-getimage-file in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF78D178142DD8F3002AAF77 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF78D179142DD8F3002AAF77 /* voronoi.xml in Resources */,
+ AF78D191142DD99B002AAF77 /* hilbert.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF794F67099748450059A8B0 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF794F7D0997486C0059A8B0 /* demon.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF794F9109974A320059A8B0 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF794FA809974AC60059A8B0 /* fiberlamp.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF794FD009974FA60059A8B0 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF794FDF09974FD10059A8B0 /* loop.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7ACFC319FF0A9200BD752B /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF7ACFD919FF0BA600BD752B /* geodesicgears.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF91897B158FC00A002B5D1E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF918983158FC00A002B5D1E /* iSaverRunner.xib in Resources */,
+ AF73FF211A08AB9400E485E9 /* iSaverRunner57t.png in Resources */,
+ 55EDCB3D1AD498A800251909 /* LaunchScreen.xib in Resources */,
+ 550FB6001AD64424001A4FA5 /* Media-iOS.xcassets in Resources */,
+ AFEC68371BD6CA85004C1B64 /* OCRAStd.otf in Resources */,
+ AFC43E741C68364B00C89999 /* PxPlus_IBM_VGA8.ttf in Resources */,
+ AFEC68391BD6CDF9004C1B64 /* YearlReg.ttf in Resources */,
+ AF939AD72038C5F00032DD23 /* luximr.ttf in Resources */,
+ AF142BAE1EE75DBF0005C0A8 /* settings.png in Resources */,
+ 557BF07E1EE90D3B00846DCE /* settings@2x.png in Resources */,
+ 557BF07F1EE90D3B00846DCE /* settings@3x.png in Resources */,
+ AF142BAF1EE75DBF0005C0A8 /* stop.png in Resources */,
+ 557BF0801EE90D3B00846DCE /* stop@2x.png in Resources */,
+ 557BF0811EE90D3B00846DCE /* stop@3x.png in Resources */,
+ AF918AB4158FC53D002B5D1E /* abstractile.xml in Resources */,
+ AF918AB5158FC53D002B5D1E /* anemone.xml in Resources */,
+ AF918AB6158FC53D002B5D1E /* anemotaxis.xml in Resources */,
+ AF918AB8158FC53D002B5D1E /* antinspect.xml in Resources */,
+ AF918AB9158FC53D002B5D1E /* antmaze.xml in Resources */,
+ AF918ABA158FC53D002B5D1E /* antspotlight.xml in Resources */,
+ AF918ABB158FC53D002B5D1E /* apollonian.xml in Resources */,
+ AF918ABC158FC53D002B5D1E /* apple2.xml in Resources */,
+ AF918ABD158FC53D002B5D1E /* atlantis.xml in Resources */,
+ AF918ABE158FC53D002B5D1E /* attraction.xml in Resources */,
+ AF918ABF158FC53D002B5D1E /* atunnel.xml in Resources */,
+ AF918AC0158FC53D002B5D1E /* barcode.xml in Resources */,
+ AF73FF3D1A0988C500E485E9 /* binaryring.xml in Resources */,
+ AFEE10681D1341FE00AAC8F7 /* cubetwist.xml in Resources */,
+ AF918AC1158FC53D002B5D1E /* blaster.xml in Resources */,
+ AF918AC2158FC53D002B5D1E /* blinkbox.xml in Resources */,
+ AF918AC3158FC53D002B5D1E /* blitspin.xml in Resources */,
+ AFC5CFF52044AB28004CEB5E /* crumbler.xml in Resources */,
+ AF918AC4158FC53D002B5D1E /* blocktube.xml in Resources */,
+ AF918AC5158FC53D002B5D1E /* boing.xml in Resources */,
+ AF918AC6158FC53D002B5D1E /* bouboule.xml in Resources */,
+ AF918AC7158FC53D002B5D1E /* bouncingcow.xml in Resources */,
+ AF918AC8158FC53D002B5D1E /* boxed.xml in Resources */,
+ AF918AC9158FC53D002B5D1E /* boxfit.xml in Resources */,
+ AF918ACA158FC53D002B5D1E /* braid.xml in Resources */,
+ AF918ACB158FC53D002B5D1E /* bsod.xml in Resources */,
+ AF918ACC158FC53D002B5D1E /* bubble3d.xml in Resources */,
+ AF918ACE158FC53D002B5D1E /* bumps.xml in Resources */,
+ AF918ACF158FC53D002B5D1E /* cage.xml in Resources */,
+ AF918AD0158FC53D002B5D1E /* carousel.xml in Resources */,
+ AF918AD1158FC53D002B5D1E /* ccurve.xml in Resources */,
+ AF918AD2158FC53D002B5D1E /* celtic.xml in Resources */,
+ AF918AD3158FC53D002B5D1E /* circuit.xml in Resources */,
+ AF5C9B121A0CCF4E00B0147A /* cityflow.xml in Resources */,
+ AF918AD4158FC53D002B5D1E /* cloudlife.xml in Resources */,
+ AF918AD5158FC53D002B5D1E /* companioncube.xml in Resources */,
+ AF918AD6158FC53D002B5D1E /* compass.xml in Resources */,
+ AF918AD7158FC53D002B5D1E /* coral.xml in Resources */,
+ AF918AD8158FC53D002B5D1E /* crackberg.xml in Resources */,
+ AF918ADA158FC53D002B5D1E /* crystal.xml in Resources */,
+ AF918ADB158FC53D002B5D1E /* cube21.xml in Resources */,
+ AF918ADC158FC53D002B5D1E /* cubenetic.xml in Resources */,
+ AFEE10881D15EBDC00AAC8F7 /* cubestack.xml in Resources */,
+ AF918ADD158FC53D002B5D1E /* cubestorm.xml in Resources */,
+ AF918ADE158FC53D002B5D1E /* cubicgrid.xml in Resources */,
+ AF918ADF158FC53D002B5D1E /* cwaves.xml in Resources */,
+ AF918AE0158FC53D002B5D1E /* cynosure.xml in Resources */,
+ AF918AE1158FC53D002B5D1E /* dangerball.xml in Resources */,
+ AF918AE2158FC53D002B5D1E /* decayscreen.xml in Resources */,
+ AF918AE3158FC53D002B5D1E /* deco.xml in Resources */,
+ AF918AE4158FC53D002B5D1E /* deluxe.xml in Resources */,
+ AF918AE5158FC53D002B5D1E /* demon.xml in Resources */,
+ AF918AE6158FC53D002B5D1E /* discrete.xml in Resources */,
+ AF3938361D0FBF2700205406 /* discoball.xml in Resources */,
+ AF918AE7158FC53D002B5D1E /* distort.xml in Resources */,
+ AFCF453815986A3000E6E8CC /* dnalogo.xml in Resources */,
+ AFEC23E81CB6EC6800DE138F /* dymaxionmap.xml in Resources */,
+ AF918AE9158FC53D002B5D1E /* drift.xml in Resources */,
+ AF918AEA158FC53D002B5D1E /* endgame.xml in Resources */,
+ AFACE88C1CC835F7008B24CD /* energystream.xml in Resources */,
+ AF918AEB158FC53D002B5D1E /* engine.xml in Resources */,
+ AF918AEC158FC53D002B5D1E /* epicycle.xml in Resources */,
+ AF918AED158FC53D002B5D1E /* eruption.xml in Resources */,
+ AF21078A1FD23D2800B61EA9 /* esper.xml in Resources */,
+ AF918AEE158FC53D002B5D1E /* euler2d.xml in Resources */,
+ AF918AF0158FC53D002B5D1E /* fadeplot.xml in Resources */,
+ AFD77E7820C2419600A3638D /* filmleader.xml in Resources */,
+ AF918AF1158FC53D002B5D1E /* fiberlamp.xml in Resources */,
+ AF918AF2158FC53D002B5D1E /* fireworkx.xml in Resources */,
+ AF918AF4158FC53D002B5D1E /* flame.xml in Resources */,
+ AF918AF5158FC53D002B5D1E /* flipflop.xml in Resources */,
+ AF918AF6158FC53D002B5D1E /* flipscreen3d.xml in Resources */,
+ AF918AF7158FC53D002B5D1E /* fliptext.xml in Resources */,
+ AF918AF8158FC53D002B5D1E /* flow.xml in Resources */,
+ AF918AF9158FC53D002B5D1E /* fluidballs.xml in Resources */,
+ AF918AFB158FC53D002B5D1E /* flyingtoasters.xml in Resources */,
+ AF918AFC158FC53D002B5D1E /* fontglide.xml in Resources */,
+ AF918AFE158FC53D002B5D1E /* fuzzyflakes.xml in Resources */,
+ AF918AFF158FC53D002B5D1E /* galaxy.xml in Resources */,
+ AF918B00158FC53D002B5D1E /* gears.xml in Resources */,
+ AFF3C9FF17CCAD9A0028F240 /* geodesic.xml in Resources */,
+ AF7ACFDA19FF0BA600BD752B /* geodesicgears.xml in Resources */,
+ AF918B01158FC53D002B5D1E /* gflux.xml in Resources */,
+ AF918B02158FC53D002B5D1E /* glblur.xml in Resources */,
+ AF918B03158FC53D002B5D1E /* glcells.xml in Resources */,
+ AF918B04158FC53D002B5D1E /* gleidescope.xml in Resources */,
+ AF918B06158FC53D002B5D1E /* glhanoi.xml in Resources */,
+ AF918B07158FC53D002B5D1E /* glknots.xml in Resources */,
+ AF918B08158FC53D002B5D1E /* glmatrix.xml in Resources */,
+ AF918B09158FC53D002B5D1E /* glplanet.xml in Resources */,
+ AF918B0A158FC53D002B5D1E /* glschool.xml in Resources */,
+ AF918B0B158FC53D002B5D1E /* glslideshow.xml in Resources */,
+ AF918B0C158FC53D002B5D1E /* glsnake.xml in Resources */,
+ AF918B10158FC53D002B5D1E /* greynetic.xml in Resources */,
+ AF918B0D158FC53D002B5D1E /* gltext.xml in Resources */,
+ AF918B0E158FC53D002B5D1E /* goop.xml in Resources */,
+ AF918B0F158FC53D002B5D1E /* grav.xml in Resources */,
+ AF918B11158FC53D002B5D1E /* halftone.xml in Resources */,
+ AF918B12158FC53D002B5D1E /* halo.xml in Resources */,
+ AF918B13158FC53D002B5D1E /* helix.xml in Resources */,
+ AFB591BF178B81E600EA4005 /* hexadrop.xml in Resources */,
+ AF1B0FC01D7AB5330011DBE4 /* hexstrut.xml in Resources */,
+ AF918B14158FC53D002B5D1E /* hilbert.xml in Resources */,
+ AF918B15158FC53D002B5D1E /* hopalong.xml in Resources */,
+ AFC0E8C71CDC60DE008CAFAC /* hydrostat.xml in Resources */,
+ AF918B18158FC53D002B5D1E /* hypertorus.xml in Resources */,
+ AF918B19158FC53D002B5D1E /* hypnowheel.xml in Resources */,
+ AF918B1A158FC53D002B5D1E /* ifs.xml in Resources */,
+ AF918B1B158FC53D002B5D1E /* imsmap.xml in Resources */,
+ AF918B1C158FC53D002B5D1E /* interaggregate.xml in Resources */,
+ AF918B1D158FC53D002B5D1E /* interference.xml in Resources */,
+ AF918B1E158FC53D002B5D1E /* intermomentary.xml in Resources */,
+ AF918B1F158FC53D002B5D1E /* jigglypuff.xml in Resources */,
+ AF39483F15A1647A0000FFCD /* jigsaw.xml in Resources */,
+ AF918B22158FC53D002B5D1E /* juggler3d.xml in Resources */,
+ AFB8A69C1782BF6C004EDB85 /* kaleidocycle.xml in Resources */,
+ AF918B23158FC53D002B5D1E /* julia.xml in Resources */,
+ AF918B24158FC53D002B5D1E /* kaleidescope.xml in Resources */,
+ AF918B25158FC53D002B5D1E /* klein.xml in Resources */,
+ AF918B26158FC53D002B5D1E /* kumppa.xml in Resources */,
+ AF918B27158FC53D002B5D1E /* lament.xml in Resources */,
+ AF918B29158FC53D002B5D1E /* lavalite.xml in Resources */,
+ AF918B30158FC53D002B5D1E /* loop.xml in Resources */,
+ AF918B31158FC53D002B5D1E /* m6502.xml in Resources */,
+ AF918B32158FC53D002B5D1E /* maze.xml in Resources */,
+ AFAAE3A3207D6439007A515C /* maze3d.xml in Resources */,
+ AF918B33158FC53D002B5D1E /* memscroller.xml in Resources */,
+ AF918B34158FC53D002B5D1E /* menger.xml in Resources */,
+ AF918B35158FC53D002B5D1E /* metaballs.xml in Resources */,
+ AF918B36158FC53D002B5D1E /* mirrorblob.xml in Resources */,
+ AF918B38158FC53D002B5D1E /* moebius.xml in Resources */,
+ AF918B39158FC53D002B5D1E /* moebiusgears.xml in Resources */,
+ AF918B3A158FC53D002B5D1E /* moire.xml in Resources */,
+ AF918B3B158FC53D002B5D1E /* moire2.xml in Resources */,
+ AF918B3C158FC53D002B5D1E /* molecule.xml in Resources */,
+ AF918B3D158FC53D002B5D1E /* morph3d.xml in Resources */,
+ AF918B3E158FC53D002B5D1E /* mountain.xml in Resources */,
+ AF918B3F158FC53D002B5D1E /* munch.xml in Resources */,
+ AF918B40158FC53D002B5D1E /* nerverot.xml in Resources */,
+ AF918B41158FC53D002B5D1E /* noof.xml in Resources */,
+ AF918B42158FC53D002B5D1E /* noseguy.xml in Resources */,
+ AF918B43158FC53D002B5D1E /* pacman.xml in Resources */,
+ AF918B44158FC53D002B5D1E /* pedal.xml in Resources */,
+ AF3EC991203517AE00180A35 /* peepers.xml in Resources */,
+ AF918B45158FC53D002B5D1E /* penetrate.xml in Resources */,
+ AF918B46158FC53D002B5D1E /* penrose.xml in Resources */,
+ AF918B47158FC53D002B5D1E /* petri.xml in Resources */,
+ AF918B48158FC53E002B5D1E /* phosphor.xml in Resources */,
+ AF918B49158FC53E002B5D1E /* photopile.xml in Resources */,
+ AF918B4A158FC53E002B5D1E /* piecewise.xml in Resources */,
+ AF918B4B158FC53E002B5D1E /* pinion.xml in Resources */,
+ AF918B4C158FC53E002B5D1E /* pipes.xml in Resources */,
+ AFCF4547159878D500E6E8CC /* polyhedra.xml in Resources */,
+ AF918B4E158FC53E002B5D1E /* polyominoes.xml in Resources */,
+ AF918B4F158FC53E002B5D1E /* polytopes.xml in Resources */,
+ AF918B50158FC53E002B5D1E /* pong.xml in Resources */,
+ AF918B51158FC53E002B5D1E /* popsquares.xml in Resources */,
+ AFFAB33019158E2A0020F021 /* projectiveplane.xml in Resources */,
+ AF918B52158FC53E002B5D1E /* providence.xml in Resources */,
+ AF918B53158FC53E002B5D1E /* pulsar.xml in Resources */,
+ AF918B54158FC53E002B5D1E /* pyro.xml in Resources */,
+ AF918B55158FC53E002B5D1E /* qix.xml in Resources */,
+ AFF28697178611720050A578 /* quasicrystal.xml in Resources */,
+ AF918B56158FC53E002B5D1E /* queens.xml in Resources */,
+ AFA211A51CD5A00F00C0D2A1 /* raverhoop.xml in Resources */,
+ AF41E96F201D4B940098E253 /* razzledazzle.xml in Resources */,
+ AF918B57158FC53E002B5D1E /* rdbomb.xml in Resources */,
+ AF918B58158FC53E002B5D1E /* ripples.xml in Resources */,
+ AF918B59158FC53E002B5D1E /* rocks.xml in Resources */,
+ AF63A80B1AB4EF5D00593C75 /* romanboy.xml in Resources */,
+ AF918B5A158FC53E002B5D1E /* rorschach.xml in Resources */,
+ AF918B5C158FC53E002B5D1E /* rotzoomer.xml in Resources */,
+ AF918B5D158FC53E002B5D1E /* rubik.xml in Resources */,
+ AF918B5E158FC53E002B5D1E /* rubikblocks.xml in Resources */,
+ AF918B5F158FC53E002B5D1E /* sballs.xml in Resources */,
+ AF918B60158FC53E002B5D1E /* shadebobs.xml in Resources */,
+ AF918B61158FC53E002B5D1E /* sierpinski.xml in Resources */,
+ AF918B62158FC53E002B5D1E /* sierpinski3d.xml in Resources */,
+ AF918B63158FC53E002B5D1E /* skytentacles.xml in Resources */,
+ AF918B64158FC53E002B5D1E /* slidescreen.xml in Resources */,
+ AF918B65158FC53E002B5D1E /* slip.xml in Resources */,
+ AF918B66158FC53E002B5D1E /* sonar.xml in Resources */,
+ AF918B67158FC53E002B5D1E /* speedmine.xml in Resources */,
+ AF918B69158FC53E002B5D1E /* spheremonics.xml in Resources */,
+ AFCF83561AF5B5FD008BB7E1 /* splitflap.xml in Resources */,
+ AFEE10A71D17E2CD00AAC8F7 /* splodesic.xml in Resources */,
+ AF918B6B158FC53E002B5D1E /* spotlight.xml in Resources */,
+ AF918B6C158FC53E002B5D1E /* sproingies.xml in Resources */,
+ AF918B6D158FC53E002B5D1E /* squiral.xml in Resources */,
+ AF918B6E158FC53E002B5D1E /* stairs.xml in Resources */,
+ AF918B6F158FC53E002B5D1E /* starfish.xml in Resources */,
+ AF918B70158FC53E002B5D1E /* starwars.xml in Resources */,
+ AF918B71158FC53E002B5D1E /* stonerview.xml in Resources */,
+ AF918B72158FC53E002B5D1E /* strange.xml in Resources */,
+ AF918B73158FC53E002B5D1E /* substrate.xml in Resources */,
+ AF918B74158FC53E002B5D1E /* superquadrics.xml in Resources */,
+ AF918B75158FC53E002B5D1E /* surfaces.xml in Resources */,
+ AF918B76158FC53E002B5D1E /* swirl.xml in Resources */,
+ AF918B78158FC53E002B5D1E /* tangram.xml in Resources */,
+ AF68A49819196E3E00D41CD1 /* tessellimage.xml in Resources */,
+ AF918B79158FC53E002B5D1E /* thornbird.xml in Resources */,
+ AF918B7A158FC53E002B5D1E /* timetunnel.xml in Resources */,
+ AF918B7B158FC53E002B5D1E /* topblock.xml in Resources */,
+ AF918B7C158FC53E002B5D1E /* triangle.xml in Resources */,
+ AF918B7D158FC53E002B5D1E /* tronbit.xml in Resources */,
+ AF918B7E158FC53E002B5D1E /* truchet.xml in Resources */,
+ AF918B7F158FC53E002B5D1E /* twang.xml in Resources */,
+ AF46E9EA1CBBA42F00240FBC /* unicrud.xml in Resources */,
+ AFDA65A6178A541A0070D24B /* unknownpleasures.xml in Resources */,
+ AF918B80158FC53E002B5D1E /* vermiculate.xml in Resources */,
+ AF5ECEC72116B2FE00069433 /* vfeedback.xml in Resources */,
+ AF633C1A1EE0BC5500AB33BD /* vigilance.xml in Resources */,
+ AF918B83158FC53E002B5D1E /* voronoi.xml in Resources */,
+ AF918B84158FC53E002B5D1E /* wander.xml in Resources */,
+ AF918B86158FC53E002B5D1E /* whirlwindwarp.xml in Resources */,
+ AF39E2AE198A15820064A58D /* winduprobot.xml in Resources */,
+ AF918B89158FC53E002B5D1E /* wormhole.xml in Resources */,
+ AF918B8A158FC53E002B5D1E /* xanalogtv.xml in Resources */,
+ AF918B8B158FC53E002B5D1E /* xflame.xml in Resources */,
+ AF918B8C158FC53E002B5D1E /* xjack.xml in Resources */,
+ AF918B8D158FC53E002B5D1E /* xlyap.xml in Resources */,
+ AF918B8E158FC53E002B5D1E /* xmatrix.xml in Resources */,
+ AF918B8F158FC53E002B5D1E /* xrayswarm.xml in Resources */,
+ AF918B90158FC53E002B5D1E /* xspirograph.xml in Resources */,
+ AF918B91158FC554002B5D1E /* zoom.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975730099C317000B05160 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF97573F099C31BB00B05160 /* imsmap.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975778099C374A00B05160 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF975788099C378B00B05160 /* moire.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9757C5099C3E6300B05160 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFCCCBB009BFE4B000353F4D /* rdbomb.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF97580B099C41D500B05160 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF97581B099C423600B05160 /* xflame.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975868099C475900B05160 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF975879099C490500B05160 /* shadebobs.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975A39099C681F00B05160 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF975A48099C688B00B05160 /* metaballs.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975A6F099C6AB200B05160 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF975A82099C6B2700B05160 /* eruption.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975A89099C6BC300B05160 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF975A98099C6C2000B05160 /* barcode.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975ADA099C6EB100B05160 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF975AED099C6EFE00B05160 /* fireworkx.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975AFF099C6FE400B05160 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF975B16099C70B200B05160 /* memscroller.xml in Resources */,
+ AFC43E7C1C6AA78800C89999 /* OCRAStd.otf in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975C15099C8C1500B05160 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF975C28099C8C6A00B05160 /* halo.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975C40099C8DCF00B05160 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF975C55099C8E2800B05160 /* greynetic.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975C60099C8F3F00B05160 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF975C75099C8FAC00B05160 /* noseguy.xml in Resources */,
+ AF0FAF0F09CA6FF900EE1051 /* xscreensaver-text in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975D55099CA0F000B05160 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF975D65099CA14B00B05160 /* rocks.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF976FB80989CAA2001F8B92 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF976FCD0989CAEA001F8B92 /* deco.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF97702A0989D1E6001F8B92 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9770430989D226001F8B92 /* rorschach.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9770670989D2F6001F8B92 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9770800989D32E001F8B92 /* attraction.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9771D30989DC4A001F8B92 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9772E30989DFC6001F8B92 /* SaverRunner.nib in Resources */,
+ AF51FD3915845FCB00E5741F /* SaverRunner.icns in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF998EDD0A083DB30051049D /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF998EFB0A083E8C0051049D /* topblock.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D466909B5109C006E59CF /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D467A09B51126006E59CF /* decayscreen.xml in Resources */,
+ AF0FAF1A09CA712600EE1051 /* xscreensaver-getimage-file in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D474709B5300A006E59CF /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D475609B5306A006E59CF /* slidescreen.xml in Resources */,
+ AF0FAF2409CA712600EE1051 /* xscreensaver-getimage-file in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D476209B53166006E59CF /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D48D309B53214006E59CF /* zoom.xml in Resources */,
+ AF0FAF2909CA712600EE1051 /* xscreensaver-getimage-file in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D48DE09B53322006E59CF /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D48ED09B5338A006E59CF /* bumps.xml in Resources */,
+ AF0FAF1809CA712600EE1051 /* xscreensaver-getimage-file in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D48F709B535DA006E59CF /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D490609B536DE006E59CF /* distort.xml in Resources */,
+ AF0FAF1B09CA712600EE1051 /* xscreensaver-getimage-file in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D492E09B53CBA006E59CF /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D493D09B53D3B006E59CF /* ripples.xml in Resources */,
+ AF0FAF2209CA712600EE1051 /* xscreensaver-getimage-file in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D495709B53FC9006E59CF /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D496609B54087006E59CF /* rotzoomer.xml in Resources */,
+ AF0FAF2309CA712600EE1051 /* xscreensaver-getimage-file in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D496F09B5411D006E59CF /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D497E09B541CE006E59CF /* twang.xml in Resources */,
+ AF0FAF2709CA712600EE1051 /* xscreensaver-getimage-file in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D499A09B544C2006E59CF /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D49A909B5457B006E59CF /* spotlight.xml in Resources */,
+ AF0FAF2609CA712600EE1051 /* xscreensaver-getimage-file in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D4C6C09B59F27006E59CF /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D4C7B09B5A02D006E59CF /* xlyap.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D4CEA09B5AA8E006E59CF /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D4CF909B5AC73006E59CF /* pong.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D4D8109B5B2DC006E59CF /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D4D9109B5B42B006E59CF /* xanalogtv.xml in Resources */,
+ AF0FAF2809CA712600EE1051 /* xscreensaver-getimage-file in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D4DB209B5B71E006E59CF /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D4DC209B5B862006E59CF /* bsod.xml in Resources */,
+ AF0FAF1709CA712600EE1051 /* xscreensaver-getimage-file in Resources */,
+ AFC43E771C684BE400C89999 /* PxPlus_IBM_VGA8.ttf in Resources */,
+ AF939AD52038C0050032DD23 /* luximr.ttf in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D4DEF09B5BB19006E59CF /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D4E0409B5BC85006E59CF /* apple2.xml in Resources */,
+ AF0FAF0C09CA6FF900EE1051 /* xscreensaver-text in Resources */,
+ AF0FAF1409CA712600EE1051 /* xscreensaver-getimage-file in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA2118F1CD59DAF00C0D2A1 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA211A61CD5A02600C0D2A1 /* raverhoop.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA339310B058505002B0E7D /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA33BB00B05860F002B0E7D /* webcollage.xml in Resources */,
+ AFA33BDD0B058A30002B0E7D /* webcollage-helper in Resources */,
+ AFA33C0C0B058ED2002B0E7D /* webcollage in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55949099330B000F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA5595C099330E500F3E977 /* cage.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA559700993317900F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55981099331AC00F3E977 /* moebius.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA559950993322100F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA559A70993325200F3E977 /* superquadrics.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA559B80993328000F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA559CB099332CF00F3E977 /* morph3d.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA559D20993330600F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA559E90993333D00F3E977 /* rubik.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55A060993340300F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55A190993344100F3E977 /* stairs.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55A23099334A000F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55A34099334CB00F3E977 /* sproingies.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55A7C0993364300F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55A8D0993366F00F3E977 /* lament.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55AD209933CEF00F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55AE309933D1C00F3E977 /* bubble3d.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55B0C09933E0500F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55B2009933E3100F3E977 /* glplanet.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55B2809933E8D00F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55B3909933EB400F3E977 /* pulsar.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55B7C09933F7200F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55B8D09933FAA00F3E977 /* sierpinski3d.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55B9409933FDA00F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55BA50993400200F3E977 /* gflux.xml in Resources */,
+ AF0FAF1D09CA712600EE1051 /* xscreensaver-getimage-file in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55BAE099340CE00F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55BBF0993410100F3E977 /* circuit.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55BE70993429100F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55BF8099342BF00F3E977 /* menger.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55C110993431300F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55C220993433D00F3E977 /* engine.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55C7A099349A600F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55C8B099349CC00F3E977 /* glsnake.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55CAC09934BB200F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55CBD09934BDD00F3E977 /* boxed.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55CCF09934CE400F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55CE009934D1500F3E977 /* glforestfire.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55D3F0993565300F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55D500993568200F3E977 /* sballs.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55D650993584B00F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55D760993587600F3E977 /* cubenetic.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55D82099358C400F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55D93099358FB00F3E977 /* spheremonics.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55DCB09935D7000F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55DDC09935D9D00F3E977 /* lavalite.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55DF309935E4900F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55E0509935E7E00F3E977 /* queens.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55E1009935EDC00F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55E2109935F0B00F3E977 /* endgame.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55E3209935F8E00F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55E4409935FBA00F3E977 /* glblur.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55E5109935FF900F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55E970993602F00F3E977 /* flyingtoasters.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55ECA099360E300F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55EE50993610F00F3E977 /* bouncingcow.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55F09099361B700F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55F20099361E800F3E977 /* jigglypuff.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55F2D0993622F00F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55F3E0993625B00F3E977 /* klein.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55F450993629000F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55F57099362C500F3E977 /* hypertorus.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55F750993643600F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55F860993646900F3E977 /* glmatrix.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55FD609936BFA00F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55FF209936C2F00F3E977 /* cubestorm.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55FFC09936C6D00F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA5600D09936C9D00F3E977 /* glknots.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5601709936CC800F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA5602809936CF700F3E977 /* blocktube.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5603509936D5100F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF0D117D0E41566300BB14A4 /* xscreensaver-getimage-file in Resources */,
+ AFA5604609936DAB00F3E977 /* flipflop.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5604D09936E2100F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA560820993700500F3E977 /* antinspect.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5606509936F3800F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA560830993700900F3E977 /* antspotlight.xml in Resources */,
+ AF0FAF1309CA712600EE1051 /* xscreensaver-getimage-file in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA560B10993718D00F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA560C2099371BE00F3E977 /* polytopes.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA561000993781600F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA561110993784D00F3E977 /* molecule.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5615B09937C0D00F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA5616C09937C6800F3E977 /* blinkbox.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5617E09937CF100F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA5618F09937D2100F3E977 /* noof.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA561A009937D7E00F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA561B109937DB400F3E977 /* polyhedra.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA562090993849F00F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA5621B099384DA00F3E977 /* providence.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA562220993852500F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA562330993855500F3E977 /* pinion.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA562C2099392C600F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA562D3099392F900F3E977 /* boing.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA562DD099393C900F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA562EE0993940400F3E977 /* antmaze.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA562F50993943B00F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA563060993947300F3E977 /* tangram.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA563160993951000F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA563280993955000F3E977 /* crackberg.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA56334099395ED00F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA563740993977100F3E977 /* glhanoi.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA56354099396C000F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA563770993979A00F3E977 /* cube21.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5637C099397B300F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA5638D099397ED00F3E977 /* timetunnel.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA563A7099398BB00F3E977 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA563B8099398F700F3E977 /* juggler3d.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA6AAF320999950006D2685 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF95C30420999B3E001924BE /* xscreensaver-getimage-file in Resources */,
+ AFA6AB0D20999A60006D2685 /* glitchpeg.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFAAE38A207D6343007A515C /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFAAE3A2207D6439007A515C /* maze3d.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFACE8761CC83458008B24CD /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFACE88D1CC83608008B24CD /* energystream.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFB591AA178B812C00EA4005 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFB591BE178B81E600EA4005 /* hexadrop.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFBFE74E178642DC00432B21 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFBFE765178643B200432B21 /* Apple2.saver in Resources */,
+ AFBFE74F178642DC00432B21 /* SaverRunner.nib in Resources */,
+ AFBFE750178642DC00432B21 /* SaverRunner.icns in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFBFE76C178647FE00432B21 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFBFE7831786483B00432B21 /* Phosphor.saver in Resources */,
+ AFBFE76F178647FE00432B21 /* SaverRunner.nib in Resources */,
+ AFBFE770178647FE00432B21 /* SaverRunner.icns in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFC0E8AE1CDC601A008CAFAC /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFC0E8C61CDC60DB008CAFAC /* hydrostat.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFC5CFD92044AA23004CEB5E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFC5CFF42044AB28004CEB5E /* crumbler.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFCF833E1AF5B515008BB7E1 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFCF83551AF5B5FD008BB7E1 /* splitflap.xml in Resources */,
+ AFE349291B033A8200AF3D73 /* xscreensaver-text in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD51B1E0F063B4A00471C02 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD51B200F063B4A00471C02 /* xscreensaver-getimage-file in Resources */,
+ AFD51DB90F063BE700471C02 /* photopile.xml in Resources */,
+ AF5BEEFD1D2AFE21002E6D51 /* OCRAStd.otf in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56DF40996A03800BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD56E9F0996A23800BA26F7 /* gltext.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56EB10996A72600BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF642330099F45CA000F4CD4 /* braid.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56EDD0996A95700BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD56F1D0996AB1D00BA26F7 /* forest.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56F0E0996AAFA00BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD56F1E0996AB4000BA26F7 /* vines.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56F260996AB8A00BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD56F350996ABB300BA26F7 /* galaxy.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56F520996AEEE00BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD56F610996AF1500BA26F7 /* grav.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56F6E0996B01600BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD56F870996B04D00BA26F7 /* hopalong.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56F8F0996B09400BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD56F9F0996B0D000BA26F7 /* laser.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56FA60996B10F00BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD56FB50996B15000BA26F7 /* lightning.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56FBC0996B18F00BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD56FCB0996B1BE00BA26F7 /* lisa.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56FD20996B20900BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD56FE10996B24B00BA26F7 /* lissie.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56FFB0996B43800BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD5700B0996B47E00BA26F7 /* penrose.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570120996B4CC00BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD570210996B51100BA26F7 /* sierpinski.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570290996B56D00BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD5703A0996B5D000BA26F7 /* sphere.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570460996B61600BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD570550996B65A00BA26F7 /* spiral.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD5705C0996B6A300BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD5706B0996B6E700BA26F7 /* fadeplot.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570720996B72700BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD570810996B77F00BA26F7 /* mountain.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570880996B80300BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD570970996B84E00BA26F7 /* triangle.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD5709E0996B88E00BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD570AD0996B8DC00BA26F7 /* worm.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570B40996B93000BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD570C30996B96F00BA26F7 /* rotor.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570CC0996B9F800BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD570DD0996BA4600BA26F7 /* ant.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570ED0996BBBF00BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD570FE0996BC2000BA26F7 /* flow.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD571160996BE9300BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD571270996BEE100BA26F7 /* discrete.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD5712F0996BF2E00BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD5713E0996BFA500BA26F7 /* apollonian.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD571460996C01700BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD571550996C05F00BA26F7 /* euler2d.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD5715C0996C0CE00BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFCCCBB309BFE51900353F4D /* thornbird.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD571B80996D9DC00BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD571C70996DA3300BA26F7 /* juggle.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD572250996E4A300BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD572340996E52B00BA26F7 /* swirl.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD572700996EE8500BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD5727F0996EF1900BA26F7 /* polyominoes.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD572A80996F99600BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD572B80996FAF900BA26F7 /* bouboule.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD572C50996FC0F00BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD572EC0997005900BA26F7 /* crystal.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD572FC099701C000BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD5730B099702AF00BA26F7 /* julia.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD573600997411200BA26F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD573700997418D00BA26F7 /* strange.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD77E5E20C23F8600A3638D /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD77E7720C2419600A3638D /* filmleader.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFDA6591178A52B70070D24B /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFDA65A5178A541A0070D24B /* unknownpleasures.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFE2A4590E2E904600ADB298 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFE2A4750E2E911200ADB298 /* skytentacles.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFE30BEB0E52B14700CCF4A5 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFE30BFE0E52B18300CCF4A5 /* sonar.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFE6A1850CDD7B2E002805BF /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFE6A40E0CDD7BDC002805BF /* moebiusgears.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFE6A41E0CDD7FAA002805BF /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFE6A4370CDD8027002805BF /* abstractile.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFEC23D01CB6EAE100DE138F /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFEC23E71CB6EC0B00DE138F /* dymaxionmap.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFEE10501D13406000AAC8F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFEE10691D13420700AAC8F7 /* cubetwist.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFEE106F1D15EB0800AAC8F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFEE10871D15EBD900AAC8F7 /* cubestack.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFEE108E1D17E20B00AAC8F7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFEE10A61D17E2C900AAC8F7 /* splodesic.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFF2868217860E830050A578 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFF28696178611720050A578 /* quasicrystal.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFF3C9EB17CCAC440028F240 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFF3C9FE17CCAD9A0028F240 /* geodesic.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFF463390C4403E400EE6509 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFF4634C0C44046500EE6509 /* cwaves.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFF4635B0C440AEF00EE6509 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFF463740C440BAC00EE6509 /* glcells.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFFAB31819158CE40020F021 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFFAB32F19158E2A0020F021 /* projectiveplane.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CE3D01541B76F4C100993C75 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CE3D01691B76F88A00993C75 /* testx11.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXRezBuildPhase section */
+ AF08399E09930B6B00277BE9 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF083A44099311D700277BE9 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF0DC7B80C4C73F600D76972 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF0DCA510C4CBB0D00D76972 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF1A176E0D6D6EE3008AF328 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF1B0FB71D7AB4740011DBE4 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF2107811FD23BDD00B61EA9 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF32D9EF0F3AD0B40080F535 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF3581D01431D47B00E09C51 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF358211143330F900E09C51 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF35E89B0E63823600691F2F /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF39382A1D0FBD6A00205406 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF39E291198A11F60064A58D /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF3C71540D624BF50030CC0D /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF3EC9882035154C00180A35 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF41E962201D49DB0098E253 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF46E9DF1CBBA2B300240FBC /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF476FC2099D154F001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF476FE7099D1686001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477058099D4385001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477175099D4786001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47718B099D4803001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4771B3099D4949001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4771E7099D4D9A001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4771FE099D4E63001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477214099D4EE8001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47722A099D4F67001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47725F099D5717001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477277099D57B9001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47728F099D5926001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47738E099D65A1001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4773A6099D6648001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4773CD099D67B9001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47740E099D69E7001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477433099D7C70001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47744E099D7D33001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47748F099D89E4001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4774A5099D8A74001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4774C0099D8B5F001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4774DA099D8BFF001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477569099D9A1A001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47758F099D9C28001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4775AB099D9CF7001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4775E4099D9F69001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4775FE099DA030001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47761F099DA26C001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477650099DA6D0001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477666099DA78E001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47767C099DA849001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47769B099DAA6F001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4776B6099DABDD001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4776CC099DAC8A001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4776E7099DADDF001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4776FD099DAE7A001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477719099DAF9F001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47772F099DB044001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47775E099DB61E001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477780099DB965001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47779C099DBA90001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4777DD099DC183001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4778B7099DDB79001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4778D3099DDCAE001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4778F4099DDDC8001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477915099DE379001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477936099DE4C7001F091E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF480C54098E301400FB32B8 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF480D7D098EEDDE00FB32B8 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4810F709909FBA00FB32B8 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4812600990CE2700FB32B8 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4812C20990D3D900FB32B8 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF48DEFE0A0C25E000F94CF9 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4A3458102A593600A81B2A /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4FD6F50CE7A486005EE58E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4FF4C90D52CBDE00666F98 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF5C9B081A0CCE6E00B0147A /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF5ECEBB2116B1A400069433 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF633C111EE0BA6F00AB33BD /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF63A8011AB4EDDB00593C75 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF642401099FF9C2000F4CD4 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF6425D809A18855000F4CD4 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF6425F809A189EC000F4CD4 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF64261B09A18D6C000F4CD4 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF64263809A18F54000F4CD4 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF64265B09A19229000F4CD4 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF64268709A194B0000F4CD4 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF64277D09A1D37A000F4CD4 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF6427B409A2DE36000F4CD4 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF68A48D19196CF800D41CD1 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF73FF311A09877F00E485E9 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF75110D1782B5B900380EA1 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7776F209B63ABF00EA3033 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77772609B6416100EA3033 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77774D09B6446500EA3033 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77778409B6497800EA3033 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77779E09B64A5200EA3033 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7777B809B64B2600EA3033 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7777E009B64C6B00EA3033 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7777FA09B64E3100EA3033 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77782109B6504400EA3033 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77785409B6528100EA3033 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77787009B6536000EA3033 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77788B09B6563500EA3033 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7778B109B659C800EA3033 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF78D184142DD8F3002AAF77 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF794F70099748450059A8B0 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF794F9A09974A320059A8B0 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF794FD909974FA60059A8B0 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7ACFCF19FF0A9200BD752B /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975739099C317000B05160 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975781099C374A00B05160 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9757CE099C3E6300B05160 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975814099C41D500B05160 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975871099C475900B05160 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975A42099C681F00B05160 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975A78099C6AB200B05160 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975A92099C6BC300B05160 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975AE3099C6EB100B05160 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975B08099C6FE400B05160 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975C1E099C8C1500B05160 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975C4A099C8DCF00B05160 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975C6A099C8F3F00B05160 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975D5F099CA0F000B05160 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9770150989D0F6001F8B92 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF97703C0989D1E6001F8B92 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9770790989D2F6001F8B92 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF998EE90A083DB30051049D /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D467209B5109C006E59CF /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D475009B5300A006E59CF /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D476B09B53166006E59CF /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D48E709B53322006E59CF /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D490009B535DA006E59CF /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D493709B53CBA006E59CF /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D496009B53FC9006E59CF /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D497809B5411D006E59CF /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D49A309B544C2006E59CF /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D4C7509B59F27006E59CF /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D4CF309B5AA8E006E59CF /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D4D8B09B5B2DC006E59CF /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D4DBC09B5B71E006E59CF /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D4DFA09B5BB19006E59CF /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA2119C1CD59DAF00C0D2A1 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA3393B0B058505002B0E7D /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55956099330B000F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5597B0993317900F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA559A00993322100F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA559C30993328000F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA559DD0993330600F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55A110993340300F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55A2E099334A000F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55A870993364300F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55ADD09933CEF00F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55B1A09933E0500F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55B3309933E8D00F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55B8709933F7200F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55B9F09933FDA00F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55BB9099340CE00F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55BF20993429100F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55C1C0993431300F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55C85099349A600F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55CB709934BB200F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55CDA09934CE400F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55D4A0993565300F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55D700993584B00F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55D8D099358C400F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55DD609935D7000F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55DFF09935E4900F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55E1B09935EDC00F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55E3E09935F8E00F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55E5C09935FF900F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55EDF099360E300F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55F1A099361B700F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55F380993622F00F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55F500993629000F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55F800993643600F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55FE109936BFA00F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5600709936C6D00F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5602209936CC800F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5604009936D5100F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5605809936E2100F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5607009936F3800F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA560BC0993718D00F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5610B0993781600F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5616609937C0D00F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5618909937CF100F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA561AB09937D7E00F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA562150993849F00F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5622D0993852500F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA562CD099392C600F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA562E8099393C900F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA563000993943B00F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA563220993951000F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5633F099395ED00F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5635F099396C000F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA56387099397B300F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA563B2099398BB00F3E977 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA6AB0020999950006D2685 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFAAE397207D6343007A515C /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFACE8831CC83458008B24CD /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFB591B5178B812C00EA4005 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFC0E8BB1CDC601A008CAFAC /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFC5CFE62044AA23004CEB5E /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFCF834B1AF5B515008BB7E1 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD51B2B0F063B4A00471C02 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56E000996A03800BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56EBA0996A72600BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56EE60996A95700BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56F170996AAFA00BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56F2F0996AB8A00BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56F5B0996AEEE00BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56F770996B01600BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56F980996B09400BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56FAF0996B10F00BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56FC50996B18F00BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56FDB0996B20900BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570040996B43800BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD5701B0996B4CC00BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570320996B56D00BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD5704F0996B61600BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570650996B6A300BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD5707B0996B72700BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570910996B80300BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570A70996B88E00BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570BD0996B93000BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570D50996B9F800BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570F60996BBBF00BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD5711F0996BE9300BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD571380996BF2E00BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD5714F0996C01700BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD571650996C0CE00BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD571C10996D9DC00BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD5722E0996E4A300BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD572790996EE8500BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD572B10996F99600BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD572CE0996FC0F00BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD57305099701C000BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD573690997411200BA26F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD77E6B20C23F8600A3638D /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFDA659C178A52B70070D24B /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFE2A4650E2E904600ADB298 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFE30BF70E52B14700CCF4A5 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFE6A1920CDD7B2E002805BF /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFE6A4280CDD7FAA002805BF /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFEC23DD1CB6EAE100DE138F /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFEE105D1D13406000AAC8F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFEE107C1D15EB0800AAC8F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFEE109B1D17E20B00AAC8F7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFF2868D17860E830050A578 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFF3C9F617CCAC440028F240 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFF463420C4403E400EE6509 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFF463670C440AEF00EE6509 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFFAB32419158CE40020F021 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CE3D01611B76F4C100993C75 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXRezBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ AF0DC7B90C4C73F600D76972 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF0DCA520C4CBB0D00D76972 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF1A176F0D6D6EE3008AF328 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF1ADA1E18501DC200932759 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF1B0FB81D7AB4740011DBE4 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF2107821FD23BDD00B61EA9 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF32D9F00F3AD0B40080F535 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF3581D11431D47B00E09C51 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF358212143330F900E09C51 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF35E89C0E63823600691F2F /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF39382B1D0FBD6A00205406 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF39E292198A11F60064A58D /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF3C71550D624BF50030CC0D /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF3EC9892035154C00180A35 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF41E963201D49DB0098E253 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF46E9E01CBBA2B300240FBC /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF48DEFF0A0C25E000F94CF9 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF4A3459102A593600A81B2A /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF4E1D1819CE7013002B6190 /* Update GC build settings */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Update GC build settings";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "#!/bin/sh\n\n# Edit the contents of \"xscreensaver.xcconfig\" based on the running\n# Xcode version. If we are running Xcode 5.0.2, we *must* turn on GC.\n# If we are running a newer version of Xcode than that, we *cannot*\n# turn on GC.\n\nTMP=`mktemp -t xcode`\nSRC=\"$SRCROOT/xscreensaver.xcconfig\"\nMACOSX_DEPLOYMENT_TARGET=10.7\nOBJC_GC_CFLAGS=\nOBJC_NO_GC_CFLAGS=\nif [ \"$XCODE_VERSION_MAJOR\" -lt \"0600\" ]; then\n MACOSX_DEPLOYMENT_TARGET=10.4\n OBJC_GC_CFLAGS=\"-fobjc-gc\"\n OBJC_NO_GC_CFLAGS=\"-fno-objc-gc\"\nfi\n\nrm -f \"$TMP\"\nsed -e \"s/^\\(MACOSX_DEPLOYMENT_TARGET=\\).*/\\1${MACOSX_DEPLOYMENT_TARGET}/\" \\\n -e \"s/^\\(OBJC_GC_CFLAGS=\\).*/\\1${OBJC_GC_CFLAGS}/\" \\\n -e \"s/^\\(OBJC_NO_GC_CFLAGS=\\).*/\\1${OBJC_NO_GC_CFLAGS}/\" \\\n < $SRC > $TMP\nif ! ( cmp -s \"$SRC\" \"$TMP\" ); then\necho \"$SRC updated:\"\n diff -U0 \"$SRC\" \"$TMP\"\n cat \"$TMP\" > \"$SRC\"\nelse\n echo \"$SRC unchanged\"\nfi\n\nrm -f \"$TMP\"\nexit 0\n";
+ showEnvVarsInLog = 0;
+ };
+ AF4FD6F60CE7A486005EE58E /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF4FF4CA0D52CBDE00666F98 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF578FA11434E918002455DD /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF5C9B091A0CCE6E00B0147A /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF5ECEBC2116B1A400069433 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF633C121EE0BA6F00AB33BD /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF63A8021AB4EDDB00593C75 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF63F24F1C3465BE0033E133 /* Update Function Table */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Update Function Table";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/build-fntable.pl $SOURCE_ROOT/ios-function-table.m";
+ };
+ AF63F44A1C3465BE0033E133 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF63F4571C34682A0033E133 /* Update Function Table */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Update Function Table";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/build-fntable.pl $SOURCE_ROOT/ios-function-table.m";
+ };
+ AF63F4701C34682A0033E133 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF63F47F1C3469FC0033E133 /* Update Function Table */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Update Function Table";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/build-fntable.pl $SOURCE_ROOT/ios-function-table.m";
+ };
+ AF63F4961C3469FC0033E133 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF68A48E19196CF800D41CD1 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF73FF321A09877F00E485E9 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF75110E1782B5B900380EA1 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF78D185142DD8F3002AAF77 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF7ACFD019FF0A9200BD752B /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF7E080115925EE300D81407 /* ICMP Sanity Check */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "ICMP Sanity Check";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/icmp-warning.pl";
+ };
+ AF7E08021592661100D81407 /* ICMP Sanity Check */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "ICMP Sanity Check";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/icmp-warning.pl";
+ };
+ AF91898A158FC00A002B5D1E /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AF94E7421A16F66900289B93 /* Update Function Table */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Update Function Table";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/build-fntable.pl $SOURCE_ROOT/ios-function-table.m";
+ };
+ AF998EEA0A083DB30051049D /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA2119D1CD59DAF00C0D2A1 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3393C0B058505002B0E7D /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D69209C03B5C00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D69409C03B6200E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D85B09C03BD300E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D85D09C03BD700E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D85F09C03BDA00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D86109C03BDE00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D86309C03BE200E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D86509C03BE500E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D86709C03BE800E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D86909C03BEC00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D86B09C03BEF00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D86D09C03BF300E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D86F09C03BF700E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D87109C03BFB00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D87309C03C0000E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D87509C03C0400E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D87709C03C0A00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D87909C03C1200E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D87B09C03C1700E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D87D09C03C1B00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D87F09C03C1E00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D88109C03C2100E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D88309C03C2400E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D88509C03C2700E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D88709C03C2A00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D88909C03C2E00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D88B09C03C3200E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D88D09C03C3600E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D88F09C03C3900E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D89109C03C3C00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D89309C03C4000E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D89509C03C4400E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D89709C03C4700E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D89B09C03C4D00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D89D09C03C5000E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D89F09C03C5300E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8A109C03C5600E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8A309C03C5F00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8A509C03C6200E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8A909C03C6900E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8AB09C03C6D00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8AD09C03C7000E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8AF09C03C7300E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8B109C03C7600E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8B309C03C7900E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8B509C03C7C00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8B709C03C7F00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8B909C03C8200E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8BB09C03C8600E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8BD09C03C8900E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8BF09C03C8D00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8C109C03C9000E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8C309C03C9300E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8C509C03C9600E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8C709C03C9900E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8C909C03C9E00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8CB09C03CA100E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8CD09C03CA400E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8CF09C03CA800E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8D109C03CAB00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8D309C03CAE00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8D709C03CB400E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8D909C03CB700E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8DB09C03CBA00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8DD09C03CBD00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8DF09C03CC000E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8E109C03CC400E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8E309C03CCA00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8E509C03CCD00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8E709C03CD100E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8E909C03CD500E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8EB09C03CD800E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8ED09C03CDB00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8EF09C03CDE00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8F109C03CE100E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8F309C03CE400E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8F509C03CE800E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8F709C03CEA00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8F909C03CED00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8FB09C03CF100E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8FD09C03CF400E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D8FF09C03CF700E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D90109C03D0000E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D90309C03D0400E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D90509C03D0700E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D90709C03D0B00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D90909C03D0E00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D90B09C03D1100E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D90D09C03D1400E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D90F09C03D1800E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D91109C03D1B00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D91309C03D1E00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D91509C03D2100E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D91709C03D2400E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D91909C03D2700E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D91D09C03D3000E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D91F09C03D3300E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D92109C03D3600E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D92309C03D3A00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D92509C03D3D00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D92709C03D4000E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D92909C03D4400E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D92B09C03D4700E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D92D09C03D4A00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D92F09C03D4E00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D93109C03D5100E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D93309C03D5400E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D93509C03D5700E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D93709C03D5B00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D93909C03D5E00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D93B09C03D6200E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D93D09C03D6C00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D93F09C03D6F00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D94109C03D7200E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D94309C03D7600E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D94509C03D7A00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D94709C03D7E00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D94909C03D8100E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D94B09C03D8500E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D94D09C03D8D00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D94F09C03D9100E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D95109C03D9400E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D95309C03D9800E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D95509C03D9C00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D95709C03DA100E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D95909C03DA400E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D95B09C03DA800E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D95D09C03DAB00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D95F09C03DAE00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D96109C03DB100E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D96309C03DB500E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D96509C03DB900E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D96709C03DBC00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D96909C03DBF00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D96B09C03DC600E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D96D09C03DCA00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D96F09C03DCD00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D97109C03DD000E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D97309C03DD300E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D97509C03DD700E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D97709C03DDA00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D97909C03DDD00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D97B09C03DE000E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D97D09C03DE400E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D97F09C03DE700E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D98109C03DEA00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D98309C03DEE00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D98509C03DF100E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D98709C03DF400E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D98909C03DF700E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D98B09C03DFC00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D98D09C03E0500E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D98F09C03E0F00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D99109C03E1200E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D99309C03E1600E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D99509C03E1900E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D99709C03E1C00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D99909C03E2000E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D99B09C03E2300E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D99D09C03E2600E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D99F09C03E2900E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9A109C03E2E00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9A309C03E3200E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9A509C03E3600E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9A709C03E3A00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9A909C03E3D00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9AB09C03E4200E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9AD09C03E4600E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9AF09C03E4B00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9B109C03E4E00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9B309C03E5100E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9B509C03E5700E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9B709C03E5B00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9B909C03E5E00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9BB09C03E6200E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9BD09C03E6500E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9BF09C03E6900E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9C109C03E6E00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9C309C03E7100E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9C509C03E7400E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9C709C03E7800E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9C909C03E7C00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9CB09C03E7F00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9CD09C03E8400E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9CF09C03E8700E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9D109C03E8B00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9D309C03E8F00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3D9D509C03E9300E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA3DBA209C0424C00E4CFCA /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFA6AB0120999950006D2685 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFAAE398207D6343007A515C /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFACE8841CC83458008B24CD /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFB591B6178B812C00EA4005 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFBFE75A178642DC00432B21 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFBFE77A178647FE00432B21 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFBFE78817894FFA00432B21 /* Copy Standalone Preferences XML File */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Copy Standalone Preferences XML File";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "SRC=$SRCROOT/$PRODUCT_NAME-app.xml\nDST=$BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX/Contents/Resources\nNAME=`echo $PRODUCT_NAME.xml | tr A-Z a-z`\ncp -p $SRC $DST/$NAME\nln -sf ../../../$NAME $DST/$PRODUCT_NAME.saver/Contents/Resources/";
+ };
+ AFBFE78917895AAF00432B21 /* Copy Standalone Preferences XML File */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Copy Standalone Preferences XML File";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "SRC=$SRCROOT/$PRODUCT_NAME-app.xml\nDST=$BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX/Contents/Resources\nNAME=`echo $PRODUCT_NAME.xml | tr A-Z a-z`\ncp -p $SRC $DST/$NAME\nln -sf ../../../$NAME $DST/$PRODUCT_NAME.saver/Contents/Resources/";
+ };
+ AFC0E8BC1CDC601A008CAFAC /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFC5CFE72044AA23004CEB5E /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFCCCBB509C033DF00353F4D /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFCCCBC709C03AAF00353F4D /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFCCCBCB09C03AEE00353F4D /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFCCCBCD09C03AF400353F4D /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFCCCBCF09C03AF800353F4D /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFCCCBD109C03AFC00353F4D /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFCCCBD309C03B0000353F4D /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFCCCBD509C03B0500353F4D /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFCF834C1AF5B515008BB7E1 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFD51B2C0F063B4A00471C02 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFD77E6C20C23F8600A3638D /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFDA659D178A52B70070D24B /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFE2A4660E2E904600ADB298 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFE30BF80E52B14700CCF4A5 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFE6A1930CDD7B2E002805BF /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFE6A4290CDD7FAA002805BF /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFEC23DE1CB6EAE100DE138F /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFEE105E1D13406000AAC8F7 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFEE107D1D15EB0800AAC8F7 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFEE109C1D17E20B00AAC8F7 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFF2868E17860E830050A578 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFF3C9F717CCAC440028F240 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFF463430C4403E400EE6509 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFF463680C440AEF00EE6509 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ AFFAB32519158CE40020F021 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+ CE3D01621B76F4C100993C75 /* Run Update Info Plist */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Update Info Plist";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+ showEnvVarsInLog = 0;
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ AF08399409930B6B00277BE9 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF0839B009930C4900277BE9 /* atlantis.c in Sources */,
+ AF0839B109930C4900277BE9 /* dolphin.c in Sources */,
+ AF0839B209930C4900277BE9 /* shark.c in Sources */,
+ AF0839B309930C4900277BE9 /* swim.c in Sources */,
+ AF0839B409930C4900277BE9 /* whale.c in Sources */,
+ AF9CCAB509959CEF0075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF083A37099311D700277BE9 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF083A4A099311FF00277BE9 /* atunnel.c in Sources */,
+ AF083A59099312B000277BE9 /* tunnel_draw.c in Sources */,
+ AF9CCAB609959CF70075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF0DC7B00C4C73F600D76972 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF0DC7B10C4C73F600D76972 /* XScreenSaverSubclass.m in Sources */,
+ AF0DC7B20C4C73F600D76972 /* analogtv.c in Sources */,
+ AF0DCA350C4C74A200D76972 /* asm6502.c in Sources */,
+ AF0DCA360C4C74A200D76972 /* m6502.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF0DCA470C4CBB0D00D76972 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF0DCA480C4CBB0D00D76972 /* XScreenSaverSubclass.m in Sources */,
+ AF0DCA600C4CBB7300D76972 /* voronoi.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF1A17670D6D6EE3008AF328 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1A17680D6D6EE3008AF328 /* XScreenSaverSubclass.m in Sources */,
+ AF1A177F0D6D6F3E008AF328 /* lcdscrub.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF1AD9DE18500F9F00932759 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1ADA141850132600932759 /* main.m in Sources */,
+ AF3633FD18530DD90086A439 /* Updater.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF1B0FAC1D7AB4740011DBE4 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF1B0FC21D7AB54D0011DBE4 /* hexstrut.c in Sources */,
+ AF1B0FAE1D7AB4740011DBE4 /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF2107761FD23BDD00B61EA9 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF2107781FD23BDD00B61EA9 /* XScreenSaverSubclass.m in Sources */,
+ AF21078C1FD23D5000B61EA9 /* esper.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF32D9E50F3AD0B40080F535 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF32D9E70F3AD0B40080F535 /* XScreenSaverSubclass.m in Sources */,
+ AF32D9FB0F3AD1200080F535 /* rubikblocks.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF3581C51431D47B00E09C51 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF3581C61431D47B00E09C51 /* XScreenSaverSubclass.m in Sources */,
+ AF3581DC1431D5FC00E09C51 /* companion_disc.c in Sources */,
+ AF3581DF1431D5FC00E09C51 /* companion_heart.c in Sources */,
+ AF3581E21431D5FC00E09C51 /* companion_quad.c in Sources */,
+ AF3581E51431D5FC00E09C51 /* companion.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF358202143330F900E09C51 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF358203143330F900E09C51 /* XScreenSaverSubclass.m in Sources */,
+ AF35821C1433314C00E09C51 /* tronbit_idle1.c in Sources */,
+ AF35821D1433314C00E09C51 /* tronbit_idle2.c in Sources */,
+ AF35821E1433314C00E09C51 /* tronbit_no.c in Sources */,
+ AF35821F1433314C00E09C51 /* tronbit_yes.c in Sources */,
+ AF3582201433314C00E09C51 /* tronbit.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF35E88F0E63823600691F2F /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF35E8900E63823600691F2F /* XScreenSaverSubclass.m in Sources */,
+ AF35EB260E6382BA00691F2F /* jigsaw.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF39381F1D0FBD6A00205406 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF3938211D0FBD6A00205406 /* XScreenSaverSubclass.m in Sources */,
+ AF3938341D0FBF1900205406 /* discoball.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF39E287198A11F60064A58D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFCF509C198A1861005B0DB1 /* involute.c in Sources */,
+ AF39E289198A11F60064A58D /* XScreenSaverSubclass.m in Sources */,
+ AF39E2AB198A13F50064A58D /* winduprobot.c in Sources */,
+ AFBE744019A7C6930018AA35 /* robot.c in Sources */,
+ AF39E2AA198A13F50064A58D /* robot-wireframe.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF3C714A0D624BF50030CC0D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF3C714B0D624BF50030CC0D /* XScreenSaverSubclass.m in Sources */,
+ AF3C715E0D624C600030CC0D /* hypnowheel.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF3EC97D2035154C00180A35 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF3EC993203517CC00180A35 /* peepers.c in Sources */,
+ AF3EC97F2035154C00180A35 /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF41E957201D49DB0098E253 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD9D5BF201E686B0070E99D /* ships.c in Sources */,
+ AF41E959201D49DB0098E253 /* XScreenSaverSubclass.m in Sources */,
+ AF41E96B201D4B6B0098E253 /* razzledazzle.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF46E9D41CBBA2B300240FBC /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF46E9E91CBBA41B00240FBC /* unicrud.c in Sources */,
+ AF46E9D61CBBA2B300240FBC /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF476FBB099D154F001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF476FBC099D154F001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF476FD1099D15AA001F091E /* interference.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF476FE0099D1686001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF476FE1099D1686001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF476FF1099D1713001F091E /* truchet.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477051099D4385001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477052099D4385001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF477146099D43E2001F091E /* deluxe.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47716E099D4786001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF47716F099D4786001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF47717D099D47D3001F091E /* compass.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477184099D4803001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477185099D4803001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF477193099D4864001F091E /* wander.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4771AC099D4949001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4771AD099D4949001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF4771BB099D4997001F091E /* t3d.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4771E0099D4D9A001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4771E1099D4D9A001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF4771F0099D4DFE001F091E /* ccurve.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4771F7099D4E63001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4771F8099D4E63001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF477206099D4EB6001F091E /* nerverot.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47720D099D4EE8001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF47720E099D4EE8001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF47721C099D4F47001F091E /* whirlygig.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477223099D4F67001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477224099D4F67001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF477232099D4FD5001F091E /* anemone.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477258099D5717001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477259099D5717001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF477267099D5768001F091E /* halftone.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477270099D57B9001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477271099D57B9001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF47727F099D5808001F091E /* popsquares.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477288099D5926001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477289099D5926001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF477298099D5980001F091E /* piecewise.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477387099D65A1001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477388099D65A1001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF477396099D65FE001F091E /* wormhole.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47739F099D6648001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4773A0099D6648001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF4773B5099D6778001F091E /* fuzzyflakes.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4773C6099D67B9001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4773C7099D67B9001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF4773D5099D6817001F091E /* anemotaxis.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477407099D69E7001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477408099D69E7001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF47741D099D6A6D001F091E /* intermomentary.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47742C099D7C70001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF47742D099D7C70001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF47743B099D7CEA001F091E /* ifs.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477447099D7D33001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477448099D7D33001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF477456099D7D8A001F091E /* xmatrix.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477488099D89E4001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477489099D89E4001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF477497099D8A53001F091E /* flame.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47749E099D8A74001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF47749F099D8A74001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF4774AD099D8B08001F091E /* kaleidescope.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4774B9099D8B5F001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4774BA099D8B5F001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF4774CC099D8BC2001F091E /* lmorph.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4774D3099D8BFF001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4774D4099D8BFF001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF4774E2099D8C8B001F091E /* maze.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477562099D9A1A001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477563099D9A1A001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF477571099D9A8A001F091E /* pedal.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477588099D9C28001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477589099D9C28001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF47759D099D9CA3001F091E /* pyro.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4775A4099D9CF7001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4775A5099D9CF7001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF4775B4099D9D67001F091E /* starfish.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4775DD099D9F69001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4775DE099D9F69001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF4775F0099D9FFF001F091E /* coral.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4775F7099DA030001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4775F8099DA030001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF477606099DA097001F091E /* epicycle.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477618099DA26C001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477619099DA26C001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF47762B099DA2E9001F091E /* kumppa.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477649099DA6D0001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF47764A099DA6D0001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF477658099DA75D001F091E /* squiral.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47765F099DA78E001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477660099DA78E001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF47766E099DA80D001F091E /* critical.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477675099DA849001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477676099DA849001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF477684099DA8C7001F091E /* petri.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477694099DAA6F001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477695099DAA6F001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF4776A3099DAADE001F091E /* blaster.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4776AF099DABDD001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4776B0099DABDD001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF4776BE099DAC46001F091E /* xspirograph.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4776C5099DAC8A001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4776C6099DAC8A001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF4776D4099DACEB001F091E /* xrayswarm.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4776E0099DADDF001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4776E1099DADDF001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF4776EF099DAE58001F091E /* whirlwindwarp.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4776F6099DAE7A001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4776F7099DAE7A001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF477705099DAF3F001F091E /* vermiculate.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477712099DAF9F001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477713099DAF9F001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF477721099DB01C001F091E /* cloudlife.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477728099DB044001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477729099DB044001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF477737099DB104001F091E /* substrate.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477757099DB61E001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477758099DB61E001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF47776A099DB710001F091E /* interaggregate.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477779099DB965001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF47777A099DB965001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF477788099DBA29001F091E /* celtic.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF477795099DBA90001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477796099DBA90001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF4777A5099DBB12001F091E /* fluidballs.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4777D6099DC183001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4777D7099DC183001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF4778A4099DDA91001F091E /* boxfit.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4778B0099DDB79001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4778B1099DDB79001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF4778BF099DDC33001F091E /* penetrate.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4778CC099DDCAE001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4778CD099DDCAE001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF4778DB099DDD2B001F091E /* xjack.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4778ED099DDDC8001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4778EE099DDDC8001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF4778FC099DDE79001F091E /* cynosure.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47790E099DE379001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF47790F099DE379001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF47791D099DE3F1001F091E /* flag.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF47792F099DE4C7001F091E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF477930099DE4C7001F091E /* XScreenSaverSubclass.m in Sources */,
+ AF47793E099DE56A001F091E /* slip.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4808BE098C3B6C00FB32B8 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFE943B119DD54C1000A5E6D /* xft.c in Sources */,
+ AFE943B519DDF97F000A5E6D /* utf8wc.c in Sources */,
+ AF4808C5098C3BDC00FB32B8 /* colors.c in Sources */,
+ AF4808C6098C3BDF00FB32B8 /* erase.c in Sources */,
+ AF4808C7098C3BE600FB32B8 /* hsv.c in Sources */,
+ AFBF893E0E41D930006A2D66 /* fps.c in Sources */,
+ AFD77E7320C2418000A3638D /* filmleader.c in Sources */,
+ AFBF89AF0E423FC3006A2D66 /* fps-gl.c in Sources */,
+ 5501D1961DBDCC3D00624BE9 /* xshm.c in Sources */,
+ AF4808C8098C3BE800FB32B8 /* InvertedSlider.m in Sources */,
+ AF633C211EE0BDCD00AB33BD /* seccam.c in Sources */,
+ AF4808C9098C3BEC00FB32B8 /* jwxyz.m in Sources */,
+ AF4808CA098C3BEE00FB32B8 /* PrefsReader.m in Sources */,
+ AFDA11251934424D003D397F /* aligned_malloc.c in Sources */,
+ AF4808CC098C3BF200FB32B8 /* spline.c in Sources */,
+ AF2D8F321CEBA10300198014 /* jwxyz-timers.c in Sources */,
+ AF939AD320351BFD0032DD23 /* font-retry.c in Sources */,
+ AF4808CD098C3BF400FB32B8 /* usleep.c in Sources */,
+ CE55645A1C25141000645458 /* jwxyz-gl.c in Sources */,
+ AF4808CE098C3BF800FB32B8 /* XScreenSaverConfigSheet.m in Sources */,
+ AF4808CF098C3BFB00FB32B8 /* XScreenSaverView.m in Sources */,
+ AF4808D0098C3BFD00FB32B8 /* yarandom.c in Sources */,
+ AF480FCC09901DF900FB32B8 /* gltrackball.c in Sources */,
+ AF480FCD09901E0000FB32B8 /* rotator.c in Sources */,
+ AF480FCE09901E0400FB32B8 /* sphere.c in Sources */,
+ AF480FCF09901E0700FB32B8 /* trackball.c in Sources */,
+ AF480FD009901E0A00FB32B8 /* tube.c in Sources */,
+ AF4812FA0990D9AE00FB32B8 /* XScreenSaverGLView.m in Sources */,
+ AF083A21099310CF00277BE9 /* xlockmore.c in Sources */,
+ AFA55866099324D800F3E977 /* minixpm.c in Sources */,
+ AFA55A530993353500F3E977 /* gllist.c in Sources */,
+ AFA55A95099336D800F3E977 /* normals.c in Sources */,
+ AFDA11271934424D003D397F /* thread_util.c in Sources */,
+ AF975C93099C929800B05160 /* ximage-loader.c in Sources */,
+ CE8EA1C21C35CF10002D1020 /* jwxyz-common.c in Sources */,
+ AF4774E8099D8D8C001F091E /* logo.c in Sources */,
+ AFD9D5BE201E686B0070E99D /* ships.c in Sources */,
+ AF4775C0099D9E79001F091E /* resources.c in Sources */,
+ AF9D468F09B51567006E59CF /* grabclient-osx.m in Sources */,
+ AF9D473809B52EE0006E59CF /* colorbars.c in Sources */,
+ AF77783409B6516900EA3033 /* grab-ximage.c in Sources */,
+ AF77783709B6518400EA3033 /* texfont.c in Sources */,
+ CE43C2BF1C055157004C2BC6 /* jwxyz-cocoa.m in Sources */,
+ AF77783A09B651AF00EA3033 /* glut_stroke.c in Sources */,
+ AF77783D09B651C700EA3033 /* glut_swidth.c in Sources */,
+ AFAD462309D5F4DA00AB5F95 /* grabclient.c in Sources */,
+ AF41E96A201D4B6B0098E253 /* razzledazzle.c in Sources */,
+ AF6048FB157C07C600CA21E4 /* jwzgles.c in Sources */,
+ AFC7592D158D8E8B00C5458E /* textclient.c in Sources */,
+ AFC75930158D9A7A00C5458E /* textclient-ios.m in Sources */,
+ AF561DF615969BC3007CA5ED /* grabclient-ios.m in Sources */,
+ CE9289D319BD00E300961F22 /* async_netdb.c in Sources */,
+ 55374E321E1582C6005E2362 /* pow2.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF480C4E098E301400FB32B8 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF480C5C098E305900FB32B8 /* helix.c in Sources */,
+ AF9CCABB09959D1C0075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF480D77098EEDDE00FB32B8 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF480D88098EEE5B00FB32B8 /* drift.c in Sources */,
+ AF9CCAB909959D100075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4810F009909FBA00FB32B8 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4811030990A02700FB32B8 /* dangerball.c in Sources */,
+ AF9CC7A1099580E70075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4812550990CE2700FB32B8 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4812580990CE2700FB32B8 /* gears.c in Sources */,
+ AF9CCABA09959D170075E99B /* XScreenSaverSubclass.m in Sources */,
+ AFCFF1D90CE4517C00C7D111 /* involute.c in Sources */,
+ AFCFF1DA0CE4518B00C7D111 /* tube.c in Sources */,
+ AFCFF1DB0CE451A300C7D111 /* normals.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4812B80990D3D900FB32B8 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4812C90990D41E00FB32B8 /* buildlwo.c in Sources */,
+ AF4812CA0990D42000FB32B8 /* pipeobjs.c in Sources */,
+ AF4812CB0990D42100FB32B8 /* pipes.c in Sources */,
+ AF9CCABD09959D250075E99B /* XScreenSaverSubclass.m in Sources */,
+ AF69640B0E4FE3470085DBCE /* teapot.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF48DEF40A0C25E000F94CF9 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF48DEF60A0C25E000F94CF9 /* XScreenSaverSubclass.m in Sources */,
+ AF48E1680A0C268500F94CF9 /* glschool_alg.c in Sources */,
+ AF48E1690A0C268500F94CF9 /* glschool_gl.c in Sources */,
+ AF48E16A0A0C268500F94CF9 /* glschool.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4A344E102A593600A81B2A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4A3450102A593600A81B2A /* XScreenSaverSubclass.m in Sources */,
+ AF4A3464102A5A0E00A81B2A /* surfaces.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4FD6EB0CE7A486005EE58E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4FD6EC0CE7A486005EE58E /* XScreenSaverSubclass.m in Sources */,
+ AF4FD7010CE7A577005EE58E /* lockward.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF4FF4BF0D52CBDE00666F98 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF4FF4C10D52CBDE00666F98 /* XScreenSaverSubclass.m in Sources */,
+ AF4FF4D10D52CC8400666F98 /* cubicgrid.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF5C9AFE1A0CCE6E00B0147A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF5C9B131A0CCF4E00B0147A /* cityflow.c in Sources */,
+ AF5C9B001A0CCE6E00B0147A /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF5ECEAF2116B1A400069433 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF5ECEB02116B1A400069433 /* XScreenSaverSubclass.m in Sources */,
+ AF5ECEC32116B2CC00069433 /* vfeedback.c in Sources */,
+ AF5ECEB12116B1A400069433 /* analogtv.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF633C061EE0BA6F00AB33BD /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF633C1D1EE0BCA700AB33BD /* vigilance.c in Sources */,
+ AF633C081EE0BA6F00AB33BD /* XScreenSaverSubclass.m in Sources */,
+ AF633C221EE0BDCD00AB33BD /* seccam.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF63A7F61AB4EDDB00593C75 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF63A80C1AB4EF5D00593C75 /* romanboy.c in Sources */,
+ AF63A7F81AB4EDDB00593C75 /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF63F3271C3465BE0033E133 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF63F3281C3465BE0033E133 /* SaverRunner.m in Sources */,
+ AF63F3291C3465BE0033E133 /* main.m in Sources */,
+ AF63F32A1C3465BE0033E133 /* SaverListController.m in Sources */,
+ AF63F32D1C3465BE0033E133 /* analogtv.c in Sources */,
+ AF63F32F1C3465BE0033E133 /* apple2-main.c in Sources */,
+ AFA2118B1CD1AA3F00C0D2A1 /* textclient-mobile.c in Sources */,
+ AF63F3301C3465BE0033E133 /* apple2.c in Sources */,
+ AF63F43F1C3465BE0033E133 /* ios-function-table.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF63F45E1C34682A0033E133 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF63F45F1C34682A0033E133 /* SaverRunner.m in Sources */,
+ AF63F4601C34682A0033E133 /* main.m in Sources */,
+ AF63F4611C34682A0033E133 /* SaverListController.m in Sources */,
+ AF63F4771C3469570033E133 /* phosphor.c in Sources */,
+ AF63F4651C34682A0033E133 /* ios-function-table.m in Sources */,
+ AFA2118A1CD1AA3A00C0D2A1 /* textclient-mobile.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF63F4861C3469FC0033E133 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF63F4871C3469FC0033E133 /* SaverRunner.m in Sources */,
+ AF63F4881C3469FC0033E133 /* main.m in Sources */,
+ AF63F4891C3469FC0033E133 /* SaverListController.m in Sources */,
+ AF63F49D1C346B1A0033E133 /* testx11.c in Sources */,
+ AF63F48B1C3469FC0033E133 /* ios-function-table.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF6423F7099FF9C2000F4CD4 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF6423F9099FF9C2000F4CD4 /* XScreenSaverSubclass.m in Sources */,
+ AF642412099FFAF1000F4CD4 /* extrusion-helix2.c in Sources */,
+ AF642413099FFAF1000F4CD4 /* extrusion-helix3.c in Sources */,
+ AF642414099FFAF1000F4CD4 /* extrusion-helix4.c in Sources */,
+ AF642415099FFAF1000F4CD4 /* extrusion-joinoffset.c in Sources */,
+ AF642416099FFAF1000F4CD4 /* extrusion-screw.c in Sources */,
+ AF642417099FFAF1000F4CD4 /* extrusion-taper.c in Sources */,
+ AF642418099FFAF1000F4CD4 /* extrusion-twistoid.c in Sources */,
+ AF642419099FFAF1000F4CD4 /* extrusion.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF6425D109A18855000F4CD4 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF6425D209A18855000F4CD4 /* XScreenSaverSubclass.m in Sources */,
+ AF6425E009A188FB000F4CD4 /* hypercube.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF6425F109A189EC000F4CD4 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF6425F209A189EC000F4CD4 /* XScreenSaverSubclass.m in Sources */,
+ AF64260009A18A94000F4CD4 /* qix.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF64261409A18D6C000F4CD4 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF64261509A18D6C000F4CD4 /* XScreenSaverSubclass.m in Sources */,
+ AF64262309A18E1E000F4CD4 /* hyperball.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF64263109A18F54000F4CD4 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF64263209A18F54000F4CD4 /* XScreenSaverSubclass.m in Sources */,
+ AF64264009A18FEB000F4CD4 /* moire2.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF64265409A19229000F4CD4 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF64265509A19229000F4CD4 /* XScreenSaverSubclass.m in Sources */,
+ AF64266309A192C5000F4CD4 /* munch.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF64268009A194B0000F4CD4 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF64268109A194B0000F4CD4 /* XScreenSaverSubclass.m in Sources */,
+ AF64268F09A19542000F4CD4 /* goop.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF64277609A1D37A000F4CD4 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF64277709A1D37A000F4CD4 /* XScreenSaverSubclass.m in Sources */,
+ AF64278809A1D433000F4CD4 /* speedmine.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF6427AD09A2DE36000F4CD4 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF6427AE09A2DE36000F4CD4 /* XScreenSaverSubclass.m in Sources */,
+ AF6427BE09A2DF47000F4CD4 /* bubbles-default.c in Sources */,
+ AF6427BF09A2DF47000F4CD4 /* bubbles.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF68A48319196CF800D41CD1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF68A49919196E3E00D41CD1 /* tessellimage.c in Sources */,
+ AF68A49B19196E3E00D41CD1 /* delaunay.c in Sources */,
+ AF68A48519196CF800D41CD1 /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF73FF271A09877F00E485E9 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF73FF391A09889700E485E9 /* binaryring.c in Sources */,
+ AF73FF291A09877F00E485E9 /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7511041782B5B900380EA1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF7511151782B64300380EA1 /* kaleidocycle.c in Sources */,
+ AF7511051782B5B900380EA1 /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7776E909B63ABF00EA3033 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF7776EA09B63ABF00EA3033 /* XScreenSaverSubclass.m in Sources */,
+ AF77770409B63B5F00EA3033 /* phosphor.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77771F09B6416100EA3033 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF77772009B6416100EA3033 /* XScreenSaverSubclass.m in Sources */,
+ AF77772D09B641D300EA3033 /* pacman.c in Sources */,
+ AF77772E09B641D400EA3033 /* pacman_ai.c in Sources */,
+ AF77772F09B641D600EA3033 /* pacman_level.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77774309B6446500EA3033 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF77774509B6446500EA3033 /* XScreenSaverSubclass.m in Sources */,
+ AF77775509B644FF00EA3033 /* flipscreen3d.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77777909B6497800EA3033 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF77777A09B6497800EA3033 /* XScreenSaverSubclass.m in Sources */,
+ AF77778C09B64A2A00EA3033 /* gleidescope.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77779309B64A5200EA3033 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF77779409B64A5200EA3033 /* XScreenSaverSubclass.m in Sources */,
+ AF7777A609B64AFC00EA3033 /* mirrorblob.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7777AD09B64B2600EA3033 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF7777AE09B64B2600EA3033 /* XScreenSaverSubclass.m in Sources */,
+ AF7777C609B64BD400EA3033 /* stonerview-move.c in Sources */,
+ AF7777C709B64BD400EA3033 /* stonerview-osc.c in Sources */,
+ AF7777C809B64BD400EA3033 /* stonerview-view.c in Sources */,
+ AF7777C909B64BD400EA3033 /* stonerview.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7777D509B64C6B00EA3033 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF7777D609B64C6B00EA3033 /* XScreenSaverSubclass.m in Sources */,
+ AF7777E809B64CF700EA3033 /* glslideshow.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7777EF09B64E3100EA3033 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF7777F009B64E3100EA3033 /* XScreenSaverSubclass.m in Sources */,
+ AF77780209B64EC000EA3033 /* fliptext.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77781509B6504400EA3033 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF77781609B6504400EA3033 /* XScreenSaverSubclass.m in Sources */,
+ AF77782A09B650FF00EA3033 /* starwars.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77784A09B6528100EA3033 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF77784B09B6528100EA3033 /* XScreenSaverSubclass.m in Sources */,
+ AF77787C09B654F800EA3033 /* carousel.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77786609B6536000EA3033 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF77786709B6536000EA3033 /* XScreenSaverSubclass.m in Sources */,
+ AF77787709B653DC00EA3033 /* dnalogo.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF77788409B6563500EA3033 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF77788509B6563500EA3033 /* XScreenSaverSubclass.m in Sources */,
+ AF77789309B656C300EA3033 /* fontglide.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7778AA09B659C800EA3033 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF7778AB09B659C800EA3033 /* XScreenSaverSubclass.m in Sources */,
+ AF7778BB09B65A8A00EA3033 /* blitspin.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF78D17A142DD8F3002AAF77 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF78D17B142DD8F3002AAF77 /* XScreenSaverSubclass.m in Sources */,
+ AF78D18D142DD96E002AAF77 /* hilbert.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF794F69099748450059A8B0 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF794F6A099748450059A8B0 /* XScreenSaverSubclass.m in Sources */,
+ AF794F7F099748860059A8B0 /* demon.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF794F9309974A320059A8B0 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF794F9409974A320059A8B0 /* XScreenSaverSubclass.m in Sources */,
+ AF794FAA09974AE30059A8B0 /* fiberlamp.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF794FD209974FA60059A8B0 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF794FD309974FA60059A8B0 /* XScreenSaverSubclass.m in Sources */,
+ AF794FE109974FEC0059A8B0 /* loop.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF7ACFC519FF0A9200BD752B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF7ACFC719FF0A9200BD752B /* XScreenSaverSubclass.m in Sources */,
+ AF7ACFD719FF0B7A00BD752B /* geodesicgears.c in Sources */,
+ AFDDCCEC19FF0D170072365B /* involute.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF918985158FC00A002B5D1E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFAA6B451773F07800DE720C /* ios-function-table.m in Sources */,
+ AF918987158FC00A002B5D1E /* main.m in Sources */,
+ AF918986158FC00A002B5D1E /* SaverRunner.m in Sources */,
+ AF918988158FC00A002B5D1E /* SaverListController.m in Sources */,
+ AF918993158FC2BE002B5D1E /* abstractile.c in Sources */,
+ AF918994158FC2BE002B5D1E /* anemone.c in Sources */,
+ AF918995158FC2E0002B5D1E /* analogtv.c in Sources */,
+ AF918996158FC310002B5D1E /* anemotaxis.c in Sources */,
+ AF9189FF158FC38A002B5D1E /* apollonian.c in Sources */,
+ AF918997158FC310002B5D1E /* apple2-main.c in Sources */,
+ AF918998158FC310002B5D1E /* apple2.c in Sources */,
+ AF918999158FC310002B5D1E /* asm6502.c in Sources */,
+ AF91899A158FC310002B5D1E /* attraction.c in Sources */,
+ AF91899B158FC310002B5D1E /* barcode.c in Sources */,
+ AF73FF3A1A09889700E485E9 /* binaryring.c in Sources */,
+ AF91899C158FC310002B5D1E /* blaster.c in Sources */,
+ AF91899D158FC310002B5D1E /* blitspin.c in Sources */,
+ AF918A00158FC38A002B5D1E /* bouboule.c in Sources */,
+ AF91899E158FC310002B5D1E /* boxfit.c in Sources */,
+ AF918A01158FC38A002B5D1E /* braid.c in Sources */,
+ AF91899F158FC310002B5D1E /* bsod.c in Sources */,
+ AF9189A0158FC310002B5D1E /* bubbles-default.c in Sources */,
+ AF9189A2158FC310002B5D1E /* bumps.c in Sources */,
+ AF9189A3158FC310002B5D1E /* ccurve.c in Sources */,
+ AF9189A4158FC310002B5D1E /* celtic.c in Sources */,
+ AF9189A5158FC310002B5D1E /* cloudlife.c in Sources */,
+ AF9189AA158FC311002B5D1E /* compass.c in Sources */,
+ AF9189AB158FC311002B5D1E /* coral.c in Sources */,
+ AF918A02158FC38A002B5D1E /* crystal.c in Sources */,
+ AF9189AD158FC311002B5D1E /* cwaves.c in Sources */,
+ AF9189AE158FC311002B5D1E /* cynosure.c in Sources */,
+ AF9189AF158FC311002B5D1E /* decayscreen.c in Sources */,
+ AF9189B0158FC311002B5D1E /* deco.c in Sources */,
+ AF68A49C19196E3E00D41CD1 /* delaunay.c in Sources */,
+ AF9189B1158FC311002B5D1E /* deluxe.c in Sources */,
+ AF918A03158FC38A002B5D1E /* demon.c in Sources */,
+ AF918A04158FC38A002B5D1E /* discrete.c in Sources */,
+ AF9189B2158FC311002B5D1E /* distort.c in Sources */,
+ AF918A05158FC38A002B5D1E /* drift.c in Sources */,
+ AF9189B3158FC311002B5D1E /* epicycle.c in Sources */,
+ AF9189B4158FC311002B5D1E /* eruption.c in Sources */,
+ AF918A06158FC38A002B5D1E /* euler2d.c in Sources */,
+ AF918A07158FC38A002B5D1E /* fadeplot.c in Sources */,
+ AF918A08158FC38A002B5D1E /* fiberlamp.c in Sources */,
+ AFD77E7520C2418000A3638D /* filmleader.c in Sources */,
+ AF9189B5158FC311002B5D1E /* fireworkx.c in Sources */,
+ AF9189B6158FC334002B5D1E /* flame.c in Sources */,
+ AF918A0A158FC38A002B5D1E /* flow.c in Sources */,
+ AF9189B7158FC334002B5D1E /* fluidballs.c in Sources */,
+ AF9189B8158FC334002B5D1E /* fontglide.c in Sources */,
+ AF9189B9158FC334002B5D1E /* fps.c in Sources */,
+ AF9189BA158FC334002B5D1E /* fuzzyflakes.c in Sources */,
+ AF918A0C158FC38A002B5D1E /* galaxy.c in Sources */,
+ AF9189BB158FC334002B5D1E /* goop.c in Sources */,
+ AF918A0D158FC38A002B5D1E /* grav.c in Sources */,
+ AF9189BC158FC334002B5D1E /* greynetic.c in Sources */,
+ AF9189BD158FC334002B5D1E /* halftone.c in Sources */,
+ AF9189BE158FC334002B5D1E /* halo.c in Sources */,
+ AF9189BF158FC334002B5D1E /* helix.c in Sources */,
+ AFB591C1178B81E600EA4005 /* hexadrop.c in Sources */,
+ AF918A0E158FC38A002B5D1E /* hopalong.c in Sources */,
+ AF9189C2158FC334002B5D1E /* ifs.c in Sources */,
+ AF9189C3158FC334002B5D1E /* imsmap.c in Sources */,
+ AF9189C4158FC334002B5D1E /* interaggregate.c in Sources */,
+ AF9189C5158FC334002B5D1E /* interference.c in Sources */,
+ AF9189C6158FC334002B5D1E /* intermomentary.c in Sources */,
+ AF918A11158FC38A002B5D1E /* julia.c in Sources */,
+ AF9189C7158FC334002B5D1E /* kaleidescope.c in Sources */,
+ AF9189C8158FC334002B5D1E /* kumppa.c in Sources */,
+ AF918A16158FC38A002B5D1E /* loop.c in Sources */,
+ AF9189CB158FC334002B5D1E /* m6502.c in Sources */,
+ AF9189CC158FC334002B5D1E /* maze.c in Sources */,
+ AF9189CD158FC334002B5D1E /* memscroller.c in Sources */,
+ AF9189CE158FC334002B5D1E /* metaballs.c in Sources */,
+ AF9189CF158FC334002B5D1E /* moire.c in Sources */,
+ AF9189D0158FC334002B5D1E /* moire2.c in Sources */,
+ AF918A17158FC38A002B5D1E /* mountain.c in Sources */,
+ AF9189D1158FC334002B5D1E /* munch.c in Sources */,
+ AF9189D2158FC334002B5D1E /* nerverot.c in Sources */,
+ AF9189D3158FC334002B5D1E /* noseguy.c in Sources */,
+ AF918A18158FC38A002B5D1E /* pacman.c in Sources */,
+ AF918A19158FC38A002B5D1E /* pacman_ai.c in Sources */,
+ AF918A1A158FC38A002B5D1E /* pacman_level.c in Sources */,
+ AF9189D4158FC334002B5D1E /* pedal.c in Sources */,
+ AF4C300F208569AA00BE1DEF /* dymaxionmap-coords.c in Sources */,
+ AF9189D5158FC334002B5D1E /* penetrate.c in Sources */,
+ AF9189D6158FC334002B5D1E /* petri.c in Sources */,
+ AF9189D7158FC334002B5D1E /* phosphor.c in Sources */,
+ AF9189D8158FC334002B5D1E /* piecewise.c in Sources */,
+ AF9189D9158FC334002B5D1E /* pong.c in Sources */,
+ AF9189DA158FC334002B5D1E /* popsquares.c in Sources */,
+ AF9189DB158FC334002B5D1E /* pyro.c in Sources */,
+ AF9189DC158FC334002B5D1E /* qix.c in Sources */,
+ AF918A1B158FC38A002B5D1E /* penrose.c in Sources */,
+ AF918A1C158FC38A002B5D1E /* polyominoes.c in Sources */,
+ AF9189DD158FC334002B5D1E /* rd-bomb.c in Sources */,
+ AF9189DE158FC334002B5D1E /* ripples.c in Sources */,
+ AFD9D5C0201E686B0070E99D /* ships.c in Sources */,
+ AF9189DF158FC35D002B5D1E /* rocks.c in Sources */,
+ AF9189E0158FC35D002B5D1E /* rorschach.c in Sources */,
+ AF9189E1158FC35D002B5D1E /* rotzoomer.c in Sources */,
+ AF9189E2158FC35D002B5D1E /* shadebobs.c in Sources */,
+ AF9189E3158FC35D002B5D1E /* slidescreen.c in Sources */,
+ AF9189E4158FC35D002B5D1E /* speedmine.c in Sources */,
+ AF9189E5158FC35D002B5D1E /* spotlight.c in Sources */,
+ AF9189E6158FC35D002B5D1E /* squiral.c in Sources */,
+ AF9189E7158FC35D002B5D1E /* starfish.c in Sources */,
+ AF9189E8158FC35D002B5D1E /* substrate.c in Sources */,
+ AF918A1E158FC38A002B5D1E /* sierpinski.c in Sources */,
+ AF918A1F158FC38A002B5D1E /* slip.c in Sources */,
+ AF918A22158FC38A002B5D1E /* strange.c in Sources */,
+ AF918A23158FC38A002B5D1E /* swirl.c in Sources */,
+ AFA211891CD1AA2E00C0D2A1 /* textclient-mobile.c in Sources */,
+ AF68A49A19196E3E00D41CD1 /* tessellimage.c in Sources */,
+ AF918A25158FC38A002B5D1E /* triangle.c in Sources */,
+ AF918A24158FC38A002B5D1E /* thornbird.c in Sources */,
+ AF9189EF158FC35D002B5D1E /* truchet.c in Sources */,
+ AF9189F0158FC35D002B5D1E /* twang.c in Sources */,
+ AF9189F1158FC35D002B5D1E /* vermiculate.c in Sources */,
+ AF5ECEC42116B2CC00069433 /* vfeedback.c in Sources */,
+ AF9189F2158FC35D002B5D1E /* wander.c in Sources */,
+ AF9189F3158FC35E002B5D1E /* whirlwindwarp.c in Sources */,
+ AF9189F5158FC35E002B5D1E /* wormhole.c in Sources */,
+ AF9189F6158FC35E002B5D1E /* xanalogtv.c in Sources */,
+ AF9189F7158FC35E002B5D1E /* xflame.c in Sources */,
+ AF9189F8158FC35E002B5D1E /* xjack.c in Sources */,
+ AF9189F9158FC35E002B5D1E /* xlyap.c in Sources */,
+ AF9189FA158FC35E002B5D1E /* xmatrix.c in Sources */,
+ AF9189FB158FC35E002B5D1E /* xrayswarm.c in Sources */,
+ AF9189FC158FC35E002B5D1E /* xspirograph.c in Sources */,
+ AF9189FD158FC35E002B5D1E /* zoom.c in Sources */,
+ AF918A28158FC3BB002B5D1E /* antinspect.c in Sources */,
+ AF918A29158FC3BB002B5D1E /* antmaze.c in Sources */,
+ AF918A2A158FC3BB002B5D1E /* antspotlight.c in Sources */,
+ AF918A2B158FC3BB002B5D1E /* atlantis.c in Sources */,
+ AF918A2C158FC3BB002B5D1E /* atunnel.c in Sources */,
+ AF918A2D158FC3BB002B5D1E /* b_draw.c in Sources */,
+ AF918A2E158FC3BB002B5D1E /* b_lockglue.c in Sources */,
+ AF918A2F158FC3BB002B5D1E /* b_sphere.c in Sources */,
+ AF918A30158FC3BB002B5D1E /* blinkbox.c in Sources */,
+ AF918A31158FC3BB002B5D1E /* blocktube.c in Sources */,
+ AF918A32158FC3BB002B5D1E /* boing.c in Sources */,
+ AF918A33158FC3BB002B5D1E /* bouncingcow.c in Sources */,
+ AF918A34158FC3BB002B5D1E /* boxed.c in Sources */,
+ AF918A35158FC3BB002B5D1E /* bubble3d.c in Sources */,
+ AF918A36158FC3BB002B5D1E /* buildlwo.c in Sources */,
+ AF918A37158FC3BB002B5D1E /* cage.c in Sources */,
+ AF3938351D0FBF1D00205406 /* discoball.c in Sources */,
+ AF918A38158FC3BB002B5D1E /* carousel.c in Sources */,
+ AF918A39158FC3BB002B5D1E /* chessmodels.c in Sources */,
+ AF918A3A158FC3BB002B5D1E /* circuit.c in Sources */,
+ AF5C9B141A0CCF4E00B0147A /* cityflow.c in Sources */,
+ AF9189A6158FC310002B5D1E /* companion.c in Sources */,
+ AF9189A7158FC311002B5D1E /* companion_disc.c in Sources */,
+ AF9189A8158FC311002B5D1E /* companion_heart.c in Sources */,
+ AF9189A9158FC311002B5D1E /* companion_quad.c in Sources */,
+ AF918A3B158FC3BB002B5D1E /* cow_face.c in Sources */,
+ AF918A3C158FC3BB002B5D1E /* cow_hide.c in Sources */,
+ AF918A3D158FC3BB002B5D1E /* cow_hoofs.c in Sources */,
+ AF918A3E158FC3BB002B5D1E /* cow_horns.c in Sources */,
+ AF918A3F158FC3BB002B5D1E /* cow_tail.c in Sources */,
+ AF918A40158FC3BB002B5D1E /* cow_udder.c in Sources */,
+ AF918A41158FC3BB002B5D1E /* crackberg.c in Sources */,
+ AFC5CFF22044AB04004CEB5E /* crumbler.c in Sources */,
+ AF918A42158FC3BB002B5D1E /* cube21.c in Sources */,
+ AF918A43158FC3BB002B5D1E /* cubenetic.c in Sources */,
+ AFEE10851D15EBB900AAC8F7 /* cubestack.c in Sources */,
+ AF918A44158FC3BB002B5D1E /* cubestorm.c in Sources */,
+ AFEE10671D1341FA00AAC8F7 /* cubetwist.c in Sources */,
+ AF918A45158FC3BB002B5D1E /* cubicgrid.c in Sources */,
+ AF918A46158FC3BB002B5D1E /* dangerball.c in Sources */,
+ AFCF453715986A2100E6E8CC /* dnalogo.c in Sources */,
+ AF918A48158FC3BB002B5D1E /* dolphin.c in Sources */,
+ AFEC23E91CB6EC7F00DE138F /* dymaxionmap.c in Sources */,
+ AF918A49158FC3BB002B5D1E /* dropshadow.c in Sources */,
+ AF918A4A158FC3E5002B5D1E /* endgame.c in Sources */,
+ AFACE88F1CC83617008B24CD /* energystream.c in Sources */,
+ AF918A4B158FC3E5002B5D1E /* engine.c in Sources */,
+ AF21078D1FD23D5000B61EA9 /* esper.c in Sources */,
+ AF918A54158FC3E5002B5D1E /* flipflop.c in Sources */,
+ AF918A55158FC3E5002B5D1E /* flipscreen3d.c in Sources */,
+ AF918A56158FC3E5002B5D1E /* fliptext.c in Sources */,
+ AF918A57158FC3E5002B5D1E /* flyingtoasters.c in Sources */,
+ AF918A59158FC3E5002B5D1E /* fps-gl.c in Sources */,
+ AF918A5A158FC3E5002B5D1E /* gears.c in Sources */,
+ AFDDCCED19FF0EBD0072365B /* geodesicgears.c in Sources */,
+ AF918A5B158FC3E5002B5D1E /* gflux.c in Sources */,
+ AF918A5C158FC3E5002B5D1E /* glblur.c in Sources */,
+ AF918A5D158FC3E5002B5D1E /* glcells.c in Sources */,
+ AF918A5E158FC3E5002B5D1E /* gleidescope.c in Sources */,
+ AF918A60158FC3E5002B5D1E /* glhanoi.c in Sources */,
+ AF918A61158FC3E5002B5D1E /* glknots.c in Sources */,
+ AF918A62158FC3E5002B5D1E /* glmatrix.c in Sources */,
+ AF918A63158FC3E5002B5D1E /* glplanet.c in Sources */,
+ AF918A64158FC3E5002B5D1E /* glschool.c in Sources */,
+ AF918A65158FC3E5002B5D1E /* glschool_alg.c in Sources */,
+ AF918A66158FC3E5002B5D1E /* glschool_gl.c in Sources */,
+ AF918A67158FC3E5002B5D1E /* glslideshow.c in Sources */,
+ AF918A68158FC3E5002B5D1E /* glsnake.c in Sources */,
+ AF918A69158FC3E5002B5D1E /* gltext.c in Sources */,
+ AF1B0FC31D7AB5500011DBE4 /* hexstrut.c in Sources */,
+ AF918A6A158FC3E5002B5D1E /* hilbert.c in Sources */,
+ AFC0E8C41CDC60B0008CAFAC /* hydrostat.c in Sources */,
+ AF918A6B158FC3E5002B5D1E /* hypertorus.c in Sources */,
+ AF918A6C158FC3E5002B5D1E /* hypnowheel.c in Sources */,
+ AF918A6D158FC3E5002B5D1E /* involute.c in Sources */,
+ AF918A6E158FC417002B5D1E /* jigglypuff.c in Sources */,
+ AF39483E15A164680000FFCD /* jigsaw.c in Sources */,
+ AF918A6F158FC417002B5D1E /* juggler3d.c in Sources */,
+ AFB8A69D1782BFA6004EDB85 /* kaleidocycle.c in Sources */,
+ AF918A70158FC417002B5D1E /* klein.c in Sources */,
+ AF918A71158FC417002B5D1E /* lament.c in Sources */,
+ AFF1BA1019A96D8B0016A88D /* lament_model.c in Sources */,
+ AF918A72158FC417002B5D1E /* lavalite.c in Sources */,
+ AF918A74158FC417002B5D1E /* marching.c in Sources */,
+ AFAAE3A0207D6420007A515C /* maze3d.c in Sources */,
+ AF918A75158FC417002B5D1E /* menger.c in Sources */,
+ AF918A76158FC417002B5D1E /* mirrorblob.c in Sources */,
+ AF918A77158FC417002B5D1E /* moebius.c in Sources */,
+ AFF3CA0417CCAEB70028F240 /* geodesic.c in Sources */,
+ AF918A78158FC417002B5D1E /* moebiusgears.c in Sources */,
+ AF918A79158FC417002B5D1E /* molecule.c in Sources */,
+ AF918A7A158FC417002B5D1E /* morph3d.c in Sources */,
+ AF918A7B158FC417002B5D1E /* noof.c in Sources */,
+ AF3EC994203517CC00180A35 /* peepers.c in Sources */,
+ AFFAB33319158EA80020F021 /* projectiveplane.c in Sources */,
+ AF918A7C158FC417002B5D1E /* photopile.c in Sources */,
+ AF918A7D158FC417002B5D1E /* pinion.c in Sources */,
+ AF918A7E158FC417002B5D1E /* pipeobjs.c in Sources */,
+ AF918A7F158FC417002B5D1E /* pipes.c in Sources */,
+ AFCF4545159878C300E6E8CC /* polyhedra-gl.c in Sources */,
+ AFCF4546159878C300E6E8CC /* polyhedra.c in Sources */,
+ AF918A82158FC417002B5D1E /* polytopes.c in Sources */,
+ AF918A83158FC417002B5D1E /* providence.c in Sources */,
+ AF918A84158FC417002B5D1E /* pulsar.c in Sources */,
+ AFF28699178611720050A578 /* quasicrystal.c in Sources */,
+ AF918A85158FC417002B5D1E /* queens.c in Sources */,
+ AFC5CFF02044AB04004CEB5E /* quickhull.c in Sources */,
+ AFA211A81CD5A04300C0D2A1 /* raverhoop.c in Sources */,
+ AF41E96C201D4B6B0098E253 /* razzledazzle.c in Sources */,
+ AFBE744119A7C6EF0018AA35 /* robot.c in Sources */,
+ AF39E2B7198A15EE0064A58D /* robot-wireframe.c in Sources */,
+ AF63A80D1AB4EF5D00593C75 /* romanboy.c in Sources */,
+ AF918A86158FC417002B5D1E /* rubik.c in Sources */,
+ AF918A87158FC417002B5D1E /* rubikblocks.c in Sources */,
+ AF918A88158FC417002B5D1E /* s1_1.c in Sources */,
+ AF918A89158FC417002B5D1E /* s1_2.c in Sources */,
+ AF918A8A158FC417002B5D1E /* s1_3.c in Sources */,
+ AF918A8B158FC417002B5D1E /* s1_4.c in Sources */,
+ AF918A8C158FC417002B5D1E /* s1_5.c in Sources */,
+ AF918A8D158FC417002B5D1E /* s1_6.c in Sources */,
+ AF918A8E158FC417002B5D1E /* s1_b.c in Sources */,
+ AF918A8F158FC417002B5D1E /* sballs.c in Sources */,
+ AF633C231EE0BDCD00AB33BD /* seccam.c in Sources */,
+ AF918A90158FC417002B5D1E /* shark.c in Sources */,
+ AF918A91158FC417002B5D1E /* sierpinski3d.c in Sources */,
+ AF918A92158FC417002B5D1E /* skytentacles.c in Sources */,
+ AF918A93158FC417002B5D1E /* sonar-icmp.c in Sources */,
+ AF918A94158FC417002B5D1E /* sonar-sim.c in Sources */,
+ AF918A95158FC417002B5D1E /* sonar.c in Sources */,
+ AF918A96158FC417002B5D1E /* spheremonics.c in Sources */,
+ AFCF835A1AF5B5FD008BB7E1 /* splitflap.c in Sources */,
+ AFCF83581AF5B5FD008BB7E1 /* splitflap_obj.c in Sources */,
+ AFEE10A41D17E2BA00AAC8F7 /* splodesic.c in Sources */,
+ AF918A97158FC473002B5D1E /* sproingies.c in Sources */,
+ AF918A98158FC473002B5D1E /* sproingiewrap.c in Sources */,
+ AF918A99158FC473002B5D1E /* stairs.c in Sources */,
+ AF918A9A158FC473002B5D1E /* starwars.c in Sources */,
+ AF918A9B158FC473002B5D1E /* stonerview-move.c in Sources */,
+ AF918A9C158FC473002B5D1E /* stonerview-osc.c in Sources */,
+ AF918A9D158FC473002B5D1E /* stonerview-view.c in Sources */,
+ AF918A9E158FC473002B5D1E /* stonerview.c in Sources */,
+ AF918A9F158FC473002B5D1E /* superquadrics.c in Sources */,
+ AF918AA0158FC473002B5D1E /* surfaces.c in Sources */,
+ AF918AA1158FC473002B5D1E /* swim.c in Sources */,
+ AF918AA2158FC473002B5D1E /* tangram.c in Sources */,
+ AF918AA3158FC473002B5D1E /* tangram_shapes.c in Sources */,
+ AF918AA4158FC473002B5D1E /* teapot.c in Sources */,
+ AF918AA5158FC473002B5D1E /* timetunnel.c in Sources */,
+ AF918AA6158FC473002B5D1E /* toast.c in Sources */,
+ AF918AA7158FC473002B5D1E /* toast2.c in Sources */,
+ AF918AA8158FC473002B5D1E /* toaster.c in Sources */,
+ AF918AA9158FC473002B5D1E /* toaster_base.c in Sources */,
+ AF918AAA158FC473002B5D1E /* toaster_handle.c in Sources */,
+ AF918AAB158FC473002B5D1E /* toaster_handle2.c in Sources */,
+ AF918AAC158FC473002B5D1E /* toaster_jet.c in Sources */,
+ AF918AAD158FC473002B5D1E /* toaster_knob.c in Sources */,
+ AF918AAE158FC473002B5D1E /* toaster_slots.c in Sources */,
+ AF918AAF158FC473002B5D1E /* toaster_wing.c in Sources */,
+ AF918AB0158FC473002B5D1E /* topblock.c in Sources */,
+ AF9189EA158FC35D002B5D1E /* tronbit.c in Sources */,
+ AF9189EB158FC35D002B5D1E /* tronbit_idle1.c in Sources */,
+ AF9189EC158FC35D002B5D1E /* tronbit_idle2.c in Sources */,
+ AF9189ED158FC35D002B5D1E /* tronbit_no.c in Sources */,
+ AF9189EE158FC35D002B5D1E /* tronbit_yes.c in Sources */,
+ AF918AB1158FC47B002B5D1E /* tunnel_draw.c in Sources */,
+ AF46E9EB1CBBA43B00240FBC /* unicrud.c in Sources */,
+ AFDA65A8178A541A0070D24B /* unknownpleasures.c in Sources */,
+ AF633C1C1EE0BCA100AB33BD /* vigilance.c in Sources */,
+ AF918AB2158FC47B002B5D1E /* voronoi.c in Sources */,
+ AF918AB3158FC47B002B5D1E /* whale.c in Sources */,
+ AF39E2B8198A15EE0064A58D /* winduprobot.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975732099C317000B05160 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF975734099C317000B05160 /* XScreenSaverSubclass.m in Sources */,
+ AF975741099C31DD00B05160 /* imsmap.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF97577A099C374A00B05160 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF97577B099C374A00B05160 /* XScreenSaverSubclass.m in Sources */,
+ AF97578A099C37A500B05160 /* moire.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9757C7099C3E6300B05160 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9757C8099C3E6300B05160 /* XScreenSaverSubclass.m in Sources */,
+ AF9757D6099C3EB800B05160 /* rd-bomb.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF97580D099C41D500B05160 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF97580E099C41D500B05160 /* XScreenSaverSubclass.m in Sources */,
+ AF975830099C427500B05160 /* xflame.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF97586A099C475900B05160 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF97586B099C475900B05160 /* XScreenSaverSubclass.m in Sources */,
+ AF97587B099C492000B05160 /* shadebobs.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975A3B099C681F00B05160 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF975A3C099C681F00B05160 /* XScreenSaverSubclass.m in Sources */,
+ AF975A4A099C689F00B05160 /* metaballs.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975A71099C6AB200B05160 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF975A72099C6AB200B05160 /* XScreenSaverSubclass.m in Sources */,
+ AF975A84099C6B4900B05160 /* eruption.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975A8B099C6BC300B05160 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF975A8C099C6BC300B05160 /* XScreenSaverSubclass.m in Sources */,
+ AF975A9A099C6C3600B05160 /* barcode.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975ADC099C6EB100B05160 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF975ADD099C6EB100B05160 /* XScreenSaverSubclass.m in Sources */,
+ AF975AEF099C6F1700B05160 /* fireworkx.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975B01099C6FE400B05160 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF975B02099C6FE400B05160 /* XScreenSaverSubclass.m in Sources */,
+ AF975B15099C709E00B05160 /* memscroller.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975C17099C8C1500B05160 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF975C18099C8C1500B05160 /* XScreenSaverSubclass.m in Sources */,
+ AF975C29099C8C7600B05160 /* halo.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975C43099C8DCF00B05160 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF975C44099C8DCF00B05160 /* XScreenSaverSubclass.m in Sources */,
+ AF975C56099C8E3000B05160 /* greynetic.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975C63099C8F3F00B05160 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF975C64099C8F3F00B05160 /* XScreenSaverSubclass.m in Sources */,
+ AF975C77099C8FC700B05160 /* noseguy.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF975D58099CA0F000B05160 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF975D59099CA0F000B05160 /* XScreenSaverSubclass.m in Sources */,
+ AF975D67099CA16A00B05160 /* rocks.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF976FB90989CAA2001F8B92 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF976FCC0989CAD7001F8B92 /* deco.c in Sources */,
+ AF9CCAB809959D0D0075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF97702C0989D1E6001F8B92 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9770420989D21A001F8B92 /* rorschach.c in Sources */,
+ AF9CCABC09959D200075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9770690989D2F6001F8B92 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF97707F0989D327001F8B92 /* attraction.c in Sources */,
+ AF9CC8EE09958D920075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9771D40989DC4A001F8B92 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9771DF0989DC88001F8B92 /* SaverRunner.m in Sources */,
+ AF9772C80989DCD5001F8B92 /* main.m in Sources */,
+ AF84AF2015829AF000607E4C /* SaverListController.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF998EDF0A083DB30051049D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF998EE10A083DB30051049D /* XScreenSaverSubclass.m in Sources */,
+ AF998EF90A083E750051049D /* topblock.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D466B09B5109C006E59CF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D466D09B5109C006E59CF /* XScreenSaverSubclass.m in Sources */,
+ AF9D467909B5110B006E59CF /* decayscreen.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D474909B5300A006E59CF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D474A09B5300A006E59CF /* XScreenSaverSubclass.m in Sources */,
+ AF9D475909B53091006E59CF /* slidescreen.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D476409B53166006E59CF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D476509B53166006E59CF /* XScreenSaverSubclass.m in Sources */,
+ AF9D48D509B53229006E59CF /* zoom.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D48E009B53322006E59CF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D48E109B53322006E59CF /* XScreenSaverSubclass.m in Sources */,
+ AF9D48F009B533AE006E59CF /* bumps.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D48F909B535DA006E59CF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D48FA09B535DA006E59CF /* XScreenSaverSubclass.m in Sources */,
+ AF9D490809B536F7006E59CF /* distort.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D493009B53CBA006E59CF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D493109B53CBA006E59CF /* XScreenSaverSubclass.m in Sources */,
+ AF9D493F09B53D55006E59CF /* ripples.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D495909B53FC9006E59CF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D495A09B53FC9006E59CF /* XScreenSaverSubclass.m in Sources */,
+ AF9D496809B540A4006E59CF /* rotzoomer.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D497109B5411D006E59CF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D497209B5411D006E59CF /* XScreenSaverSubclass.m in Sources */,
+ AF9D498009B541E6006E59CF /* twang.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D499C09B544C2006E59CF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D499D09B544C2006E59CF /* XScreenSaverSubclass.m in Sources */,
+ AF9D49AB09B54596006E59CF /* spotlight.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D4C6E09B59F27006E59CF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D4C6F09B59F27006E59CF /* XScreenSaverSubclass.m in Sources */,
+ AF9D4C7D09B5A044006E59CF /* xlyap.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D4CEC09B5AA8E006E59CF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D4CED09B5AA8E006E59CF /* XScreenSaverSubclass.m in Sources */,
+ AF9D4CFD09B5AC94006E59CF /* analogtv.c in Sources */,
+ AF9D4CFE09B5AC94006E59CF /* pong.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D4D8309B5B2DC006E59CF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D4D8409B5B2DC006E59CF /* XScreenSaverSubclass.m in Sources */,
+ AF9D4D8509B5B2DC006E59CF /* analogtv.c in Sources */,
+ AF9D4D9309B5B444006E59CF /* xanalogtv.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D4DB409B5B71E006E59CF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D4DB509B5B71E006E59CF /* XScreenSaverSubclass.m in Sources */,
+ AF9D4DB609B5B71E006E59CF /* analogtv.c in Sources */,
+ AF9D4DC409B5B87D006E59CF /* bsod.c in Sources */,
+ AF9D4DD409B5B990006E59CF /* apple2.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9D4DF109B5BB19006E59CF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9D4DF209B5BB19006E59CF /* XScreenSaverSubclass.m in Sources */,
+ AF9D4DF309B5BB19006E59CF /* analogtv.c in Sources */,
+ AF9D4DF509B5BB19006E59CF /* apple2.c in Sources */,
+ AF9D4E0609B5BC9D006E59CF /* apple2-main.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AF9E7EBB190F4C1B00A8B01F /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF9E7EC9190F4C4000A8B01F /* enable_gc.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA211911CD59DAF00C0D2A1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA211A71CD5A03F00C0D2A1 /* raverhoop.c in Sources */,
+ AFA211931CD59DAF00C0D2A1 /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA339340B058505002B0E7D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA339350B058505002B0E7D /* XScreenSaverSubclass.m in Sources */,
+ AFA33BAF0B0585F7002B0E7D /* webcollage-cocoa.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA33BC40B058740002B0E7D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA33BD10B0587EE002B0E7D /* webcollage-helper-cocoa.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5594B099330B000F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA5595E0993310500F3E977 /* cage.c in Sources */,
+ AF9CCAB709959D000075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA559720993317900F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55983099331C300F3E977 /* moebius.c in Sources */,
+ AF9CCABF09959D2E0075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA559970993322100F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA559A90993326300F3E977 /* superquadrics.c in Sources */,
+ AF9CCAC109959D380075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA559BA0993328000F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA559CD099332E800F3E977 /* morph3d.c in Sources */,
+ AF9CCAC009959D310075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA559D40993330600F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA559EB0993335C00F3E977 /* rubik.c in Sources */,
+ AF9CCABE09959D290075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55A080993340300F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55A1B0993345900F3E977 /* stairs.c in Sources */,
+ AF9CCAC209959D3C0075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55A25099334A000F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55A4A0993351F00F3E977 /* s1_1.c in Sources */,
+ AFA55A4B0993351F00F3E977 /* s1_2.c in Sources */,
+ AFA55A4C0993351F00F3E977 /* s1_3.c in Sources */,
+ AFA55A4D0993351F00F3E977 /* s1_4.c in Sources */,
+ AFA55A4E0993351F00F3E977 /* s1_5.c in Sources */,
+ AFA55A4F0993351F00F3E977 /* s1_6.c in Sources */,
+ AFA55A500993351F00F3E977 /* s1_b.c in Sources */,
+ AFA55A510993351F00F3E977 /* sproingies.c in Sources */,
+ AFA55A520993351F00F3E977 /* sproingiewrap.c in Sources */,
+ AF9CCAC309959D420075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55A7E0993364300F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55A8F0993369100F3E977 /* lament.c in Sources */,
+ AFF1BA0F19A96D8B0016A88D /* lament_model.c in Sources */,
+ AF9CCAC409959D450075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55AD409933CEF00F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55AE509933D3800F3E977 /* bubble3d.c in Sources */,
+ AFA55AF709933DBF00F3E977 /* b_draw.c in Sources */,
+ AFA55AF809933DBF00F3E977 /* b_lockglue.c in Sources */,
+ AFA55AF909933DBF00F3E977 /* b_sphere.c in Sources */,
+ AF9CCAC509959D4B0075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55B0E09933E0500F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55B2209933E4A00F3E977 /* glplanet.c in Sources */,
+ AF9CCAC609959D500075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55B2A09933E8D00F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55B4509933EF800F3E977 /* pulsar.c in Sources */,
+ AF9CCAC709959D550075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55B7E09933F7200F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55B8F09933FBF00F3E977 /* sierpinski3d.c in Sources */,
+ AF9CCAC809959D5A0075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55B9609933FDA00F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55BA70993401A00F3E977 /* gflux.c in Sources */,
+ AF9CCAC909959D5D0075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55BB0099340CE00F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55BC10993416E00F3E977 /* circuit.c in Sources */,
+ AF9CCACA09959D630075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55BE90993429100F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55BFA099342D500F3E977 /* menger.c in Sources */,
+ AF9CCACB09959D680075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55C130993431300F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55C240993435300F3E977 /* engine.c in Sources */,
+ AF9CCACC09959D6B0075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55C7C099349A600F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55C8D099349EE00F3E977 /* glsnake.c in Sources */,
+ AF9CCACD09959D720075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55CAE09934BB200F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55CC009934C0900F3E977 /* boxed.c in Sources */,
+ AF9CCACE09959D750075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55CD109934CE400F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55CE209934D2E00F3E977 /* glforestfire.c in Sources */,
+ AF9CCACF09959D7C0075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55D410993565300F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55D520993569C00F3E977 /* sballs.c in Sources */,
+ AF9CCAD009959D800075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55D670993584B00F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55D780993589300F3E977 /* cubenetic.c in Sources */,
+ AF9CCAD109959D850075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55D84099358C400F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55D950993590F00F3E977 /* spheremonics.c in Sources */,
+ AF9CCAD209959D8A0075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55DCD09935D7000F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55DDE09935DB600F3E977 /* lavalite.c in Sources */,
+ AFA55DE309935DFB00F3E977 /* marching.c in Sources */,
+ AF9CCAD309959D8F0075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55DF509935E4900F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55E0709935EB800F3E977 /* queens.c in Sources */,
+ AF9CCAD409959D980075E99B /* XScreenSaverSubclass.m in Sources */,
+ AF012918157C1E4C00C396E1 /* chessmodels.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55E1209935EDC00F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55E2609935F2B00F3E977 /* chessmodels.c in Sources */,
+ AFA55E2709935F2B00F3E977 /* endgame.c in Sources */,
+ AF9CCAD509959D9C0075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55E3409935F8E00F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55E4609935FD300F3E977 /* glblur.c in Sources */,
+ AF9CCAD609959DA30075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55E5309935FF900F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55EAD0993608800F3E977 /* flyingtoasters.c in Sources */,
+ AFA55EAE0993608800F3E977 /* toast.c in Sources */,
+ AFA55EB00993608800F3E977 /* toast2.c in Sources */,
+ AFA55EB20993608800F3E977 /* toaster_base.c in Sources */,
+ AFA55EB40993608800F3E977 /* toaster_handle.c in Sources */,
+ AFA55EB60993608800F3E977 /* toaster_handle2.c in Sources */,
+ AFA55EB80993608800F3E977 /* toaster_jet.c in Sources */,
+ AFA55EBA0993608800F3E977 /* toaster_knob.c in Sources */,
+ AFA55EBC0993608800F3E977 /* toaster_slots.c in Sources */,
+ AFA55EBE0993608800F3E977 /* toaster_wing.c in Sources */,
+ AFA55EC00993608800F3E977 /* toaster.c in Sources */,
+ AF9CCAD709959DA70075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55ECC099360E300F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55EEE0993613E00F3E977 /* bouncingcow.c in Sources */,
+ AFA55EEF0993613E00F3E977 /* cow_face.c in Sources */,
+ AFA55EF00993613E00F3E977 /* cow_hide.c in Sources */,
+ AFA55EF10993613E00F3E977 /* cow_hoofs.c in Sources */,
+ AFA55EF20993613E00F3E977 /* cow_horns.c in Sources */,
+ AFA55EF30993613E00F3E977 /* cow_tail.c in Sources */,
+ AFA55EF40993613E00F3E977 /* cow_udder.c in Sources */,
+ AF9CCAD809959DAE0075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55F0B099361B700F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55F220993620200F3E977 /* jigglypuff.c in Sources */,
+ AF9CCAD909959DB20075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55F2F0993622F00F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55F400993626E00F3E977 /* klein.c in Sources */,
+ AF9CCADA09959DB60075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55F470993629000F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55F5A099362DF00F3E977 /* hypertorus.c in Sources */,
+ AF9CCADB09959DBB0075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55F770993643600F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55F880993648500F3E977 /* glmatrix.c in Sources */,
+ AF9CCADC09959DC10075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55FD809936BFA00F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA55FF409936C4500F3E977 /* cubestorm.c in Sources */,
+ AF9CCADD09959DC60075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA55FFE09936C6D00F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA5600F09936CB300F3E977 /* glknots.c in Sources */,
+ AF9CCADE09959DCB0075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5601909936CC800F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA5602A09936D0700F3E977 /* blocktube.c in Sources */,
+ AF9CCADF09959DCE0075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5603709936D5100F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA5604809936DCC00F3E977 /* flipflop.c in Sources */,
+ AF9CCAE009959DD50075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5604F09936E2100F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA5608109936FFA00F3E977 /* antinspect.c in Sources */,
+ AF9CCAE109959DDA0075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5606709936F3800F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA5607B09936FDD00F3E977 /* antspotlight.c in Sources */,
+ AF9CCAE209959DDF0075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA560B30993718D00F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA560C4099371D500F3E977 /* polytopes.c in Sources */,
+ AF9CCAE309959DE20075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA561020993781600F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA561130993786800F3E977 /* molecule.c in Sources */,
+ AF9CCAE409959DE60075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5615D09937C0D00F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA5616E09937C9A00F3E977 /* blinkbox.c in Sources */,
+ AF9CCAE509959DEB0075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5618009937CF100F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA5619109937D3600F3E977 /* noof.c in Sources */,
+ AF9CCAE609959DF00075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA561A209937D7E00F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA561B509937DCC00F3E977 /* polyhedra-gl.c in Sources */,
+ AFA561B609937DCC00F3E977 /* polyhedra.c in Sources */,
+ AF9CCAE709959DF50075E99B /* XScreenSaverSubclass.m in Sources */,
+ AFC211950E4E30C800D87B6E /* teapot.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5620B0993849F00F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA5621D099384F600F3E977 /* providence.c in Sources */,
+ AF9CCAE809959DF90075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA562240993852500F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA562350993856A00F3E977 /* pinion.c in Sources */,
+ AF9CCAE909959E000075E99B /* XScreenSaverSubclass.m in Sources */,
+ AFE6A16C0CDD78EA002805BF /* involute.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA562C4099392C600F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA562D50993930C00F3E977 /* boing.c in Sources */,
+ AF9CCAEA09959E050075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA562DF099393C900F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA562F00993941600F3E977 /* antmaze.c in Sources */,
+ AF9CCAEB09959E090075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA562F70993943B00F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA5630A0993948F00F3E977 /* tangram_shapes.c in Sources */,
+ AFA5630B0993948F00F3E977 /* tangram.c in Sources */,
+ AF9CCAEC09959E0D0075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA563180993951000F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA5632A0993957100F3E977 /* crackberg.c in Sources */,
+ AF9CCAED09959E140075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA56336099395ED00F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA563750993977D00F3E977 /* glhanoi.c in Sources */,
+ AF9CCAEE09959E170075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA56356099396C000F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA563760993978D00F3E977 /* cube21.c in Sources */,
+ AF9CCAEF09959E1E0075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA5637E099397B300F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA5638F0993980D00F3E977 /* timetunnel.c in Sources */,
+ AF9CCAF009959E230075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA563A9099398BB00F3E977 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA563BA0993991300F3E977 /* juggler3d.c in Sources */,
+ AF9CCAF109959E270075E99B /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFA6AAF520999950006D2685 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFA6AAF720999950006D2685 /* XScreenSaverSubclass.m in Sources */,
+ AFA6AB0F20999A7B006D2685 /* glitchpeg.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFAAE38C207D6343007A515C /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFAAE38E207D6343007A515C /* XScreenSaverSubclass.m in Sources */,
+ AFAAE39F207D6420007A515C /* maze3d.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFACE8781CC83458008B24CD /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFACE87A1CC83458008B24CD /* XScreenSaverSubclass.m in Sources */,
+ AFACE88E1CC83613008B24CD /* energystream.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFB591AC178B812C00EA4005 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFB591AE178B812C00EA4005 /* XScreenSaverSubclass.m in Sources */,
+ AFB591C0178B81E600EA4005 /* hexadrop.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFBFE751178642DC00432B21 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFBFE752178642DC00432B21 /* SaverRunner.m in Sources */,
+ AFBFE753178642DC00432B21 /* main.m in Sources */,
+ AFBFE754178642DC00432B21 /* SaverListController.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFBFE771178647FE00432B21 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFBFE772178647FE00432B21 /* SaverRunner.m in Sources */,
+ AFBFE773178647FE00432B21 /* main.m in Sources */,
+ AFBFE774178647FE00432B21 /* SaverListController.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFC0E8B01CDC601A008CAFAC /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFC0E8C51CDC60D6008CAFAC /* hydrostat.c in Sources */,
+ AFC0E8B21CDC601A008CAFAC /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFC5CFDB2044AA23004CEB5E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFC5CFDD2044AA23004CEB5E /* XScreenSaverSubclass.m in Sources */,
+ AFC5CFEF2044AB04004CEB5E /* quickhull.c in Sources */,
+ AFC5CFF12044AB04004CEB5E /* crumbler.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFCF83401AF5B515008BB7E1 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFCF83421AF5B515008BB7E1 /* XScreenSaverSubclass.m in Sources */,
+ AFCF83571AF5B5FD008BB7E1 /* splitflap_obj.c in Sources */,
+ AFCF83591AF5B5FD008BB7E1 /* splitflap.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD51B210F063B4A00471C02 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD51B220F063B4A00471C02 /* XScreenSaverSubclass.m in Sources */,
+ AFD51DB70F063BCE00471C02 /* photopile.c in Sources */,
+ AF241F83107C38DF00046A84 /* dropshadow.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56DF60996A03800BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD56DF80996A03800BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD56E090996A07A00BA26F7 /* gltext.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56EB30996A72600BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD56EB50996A72600BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AF64232F099F45C3000F4CD4 /* braid.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56EDF0996A95700BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD56EE00996A95700BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD56EEE0996A99E00BA26F7 /* forest.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56F100996AAFA00BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD56F110996AAFA00BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD56F200996AB5A00BA26F7 /* vines.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56F280996AB8A00BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD56F290996AB8A00BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD56F370996ABD200BA26F7 /* galaxy.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56F540996AEEE00BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD56F550996AEEE00BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD56F630996AF2D00BA26F7 /* grav.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56F700996B01600BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD56F710996B01600BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD56F890996B06600BA26F7 /* hopalong.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56F910996B09400BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD56F920996B09400BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD56FA10996B0E500BA26F7 /* laser.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56FA80996B10F00BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD56FA90996B10F00BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD56FB70996B16300BA26F7 /* lightning.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56FBE0996B18F00BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD56FBF0996B18F00BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD56FCD0996B1D600BA26F7 /* lisa.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56FD40996B20900BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD56FD50996B20900BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD56FE30996B26200BA26F7 /* lissie.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD56FFD0996B43800BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD56FFE0996B43800BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD5700D0996B49D00BA26F7 /* penrose.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570140996B4CC00BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD570150996B4CC00BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD570230996B52700BA26F7 /* sierpinski.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD5702B0996B56D00BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD5702C0996B56D00BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD5703C0996B5E300BA26F7 /* sphere.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570480996B61600BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD570490996B61600BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD570570996B67600BA26F7 /* spiral.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD5705E0996B6A300BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD5705F0996B6A300BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD5706D0996B70000BA26F7 /* fadeplot.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570740996B72700BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD570750996B72700BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD570830996B79300BA26F7 /* mountain.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD5708A0996B80300BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD5708B0996B80300BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD570990996B86200BA26F7 /* triangle.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570A00996B88E00BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD570A10996B88E00BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD570AF0996B8EF00BA26F7 /* worm.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570B60996B93000BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD570B70996B93000BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD570C50996B98500BA26F7 /* rotor.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570CE0996B9F800BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD570CF0996B9F800BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD570DF0996BA5D00BA26F7 /* ant.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD570EF0996BBBF00BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD570F00996BBBF00BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD571020996BC3800BA26F7 /* flow.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD571180996BE9300BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD571190996BE9300BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD571290996BEF700BA26F7 /* discrete.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD571310996BF2E00BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD571320996BF2E00BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD571400996BFBE00BA26F7 /* apollonian.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD571480996C01700BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD571490996C01700BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD571570996C07F00BA26F7 /* euler2d.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD5715E0996C0CE00BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD5715F0996C0CE00BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD5716C0996C16700BA26F7 /* thornbird.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD571BA0996D9DC00BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD571BB0996D9DC00BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD571C90996DA4600BA26F7 /* juggle.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD572270996E4A300BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD572280996E4A300BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD572360996E53E00BA26F7 /* swirl.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD572720996EE8500BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD572730996EE8500BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD572810996EF2B00BA26F7 /* polyominoes.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD572AA0996F99600BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD572AB0996F99600BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD572BA0996FB3D00BA26F7 /* bouboule.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD572C70996FC0F00BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD572C80996FC0F00BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD572EE0997006E00BA26F7 /* crystal.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD572FE099701C000BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD572FF099701C000BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD5730D099702C800BA26F7 /* julia.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD573620997411200BA26F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFD573630997411200BA26F7 /* XScreenSaverSubclass.m in Sources */,
+ AFD57372099741A200BA26F7 /* strange.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFD77E6020C23F8600A3638D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AF3FAD8F20C242DA00680000 /* analogtv.c in Sources */,
+ AFD77E7420C2418000A3638D /* filmleader.c in Sources */,
+ AFD77E6220C23F8600A3638D /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFDA6593178A52B70070D24B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFDA6595178A52B70070D24B /* XScreenSaverSubclass.m in Sources */,
+ AFDA65A7178A541A0070D24B /* unknownpleasures.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFE2A45B0E2E904600ADB298 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFE2A45C0E2E904600ADB298 /* XScreenSaverSubclass.m in Sources */,
+ AFE2A4730E2E90E300ADB298 /* skytentacles.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFE30BED0E52B14700CCF4A5 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFE30BEE0E52B14700CCF4A5 /* XScreenSaverSubclass.m in Sources */,
+ AFE30C020E52B1DC00CCF4A5 /* sonar-icmp.c in Sources */,
+ AFE30C030E52B1DC00CCF4A5 /* sonar-sim.c in Sources */,
+ AFE30C040E52B1DC00CCF4A5 /* sonar.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFE6A1870CDD7B2E002805BF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFE6A1890CDD7B2E002805BF /* XScreenSaverSubclass.m in Sources */,
+ AFE6A18A0CDD7B2E002805BF /* involute.c in Sources */,
+ AFE6A40C0CDD7BC3002805BF /* moebiusgears.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFE6A4210CDD7FAA002805BF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFE6A4220CDD7FAA002805BF /* XScreenSaverSubclass.m in Sources */,
+ AFE6A4350CDD800F002805BF /* abstractile.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFEC23D21CB6EAE100DE138F /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFEC23E61CB6EC0400DE138F /* dymaxionmap.c in Sources */,
+ AFEC23D41CB6EAE100DE138F /* XScreenSaverSubclass.m in Sources */,
+ AF4C300E208569AA00BE1DEF /* dymaxionmap-coords.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFEE10521D13406000AAC8F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFEE10661D1341F600AAC8F7 /* cubetwist.c in Sources */,
+ AFEE10541D13406000AAC8F7 /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFEE10711D15EB0800AAC8F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFEE10731D15EB0800AAC8F7 /* XScreenSaverSubclass.m in Sources */,
+ AFEE10861D15EBC800AAC8F7 /* cubestack.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFEE10901D17E20B00AAC8F7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFEE10A51D17E2C500AAC8F7 /* splodesic.c in Sources */,
+ AFEE10921D17E20B00AAC8F7 /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFF2868417860E830050A578 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFF2868617860E830050A578 /* XScreenSaverSubclass.m in Sources */,
+ AFF28698178611720050A578 /* quasicrystal.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFF3C9ED17CCAC440028F240 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFF3C9EF17CCAC440028F240 /* XScreenSaverSubclass.m in Sources */,
+ AFF3CA0317CCAEB70028F240 /* geodesic.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFF4633B0C4403E400EE6509 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFF4633C0C4403E400EE6509 /* XScreenSaverSubclass.m in Sources */,
+ AFF4634A0C44044F00EE6509 /* cwaves.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFF4635D0C440AEF00EE6509 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFF4635F0C440AEF00EE6509 /* XScreenSaverSubclass.m in Sources */,
+ AFF463720C440B9200EE6509 /* glcells.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ AFFAB31A19158CE40020F021 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ AFFAB31C19158CE40020F021 /* XScreenSaverSubclass.m in Sources */,
+ AFFAB33219158EA80020F021 /* projectiveplane.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ CE3D01561B76F4C100993C75 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ CE3D016B1B76F93700993C75 /* testx11.c in Sources */,
+ CE3D01581B76F4C100993C75 /* XScreenSaverSubclass.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ AF08399009930B6B00277BE9 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF08399109930B6B00277BE9 /* PBXContainerItemProxy */;
+ };
+ AF083A33099311D700277BE9 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF083A34099311D700277BE9 /* PBXContainerItemProxy */;
+ };
+ AF0DC7AC0C4C73F600D76972 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF0DC7AD0C4C73F600D76972 /* PBXContainerItemProxy */;
+ };
+ AF0DCA310C4C744D00D76972 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF0DC7AB0C4C73F600D76972 /* m6502 */;
+ targetProxy = AF0DCA300C4C744D00D76972 /* PBXContainerItemProxy */;
+ };
+ AF0DCA430C4CBB0D00D76972 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF0DCA440C4CBB0D00D76972 /* PBXContainerItemProxy */;
+ };
+ AF0DCA5C0C4CBB4300D76972 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF0DCA420C4CBB0D00D76972 /* Voronoi */;
+ targetProxy = AF0DCA5B0C4CBB4300D76972 /* PBXContainerItemProxy */;
+ };
+ AF137D470F075CC8004DE3B2 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF137D410F075C9B004DE3B2 /* Obsolete */;
+ targetProxy = AF137D460F075CC8004DE3B2 /* PBXContainerItemProxy */;
+ };
+ AF137D490F075E5C004DE3B2 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD5709B0996B88E00BA26F7 /* Worm */;
+ targetProxy = AF137D480F075E5C004DE3B2 /* PBXContainerItemProxy */;
+ };
+ AF137D4B0F075E5C004DE3B2 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF477208099D4EE8001F091E /* Whirlygig */;
+ targetProxy = AF137D4A0F075E5C004DE3B2 /* PBXContainerItemProxy */;
+ };
+ AF137D4D0F075E5C004DE3B2 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD56F0B0996AAFA00BA26F7 /* Vines */;
+ targetProxy = AF137D4C0F075E5C004DE3B2 /* PBXContainerItemProxy */;
+ };
+ AF137D4F0F075E5C004DE3B2 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4771A7099D4949001F091E /* T3D */;
+ targetProxy = AF137D4E0F075E5C004DE3B2 /* PBXContainerItemProxy */;
+ };
+ AF137D510F075E5C004DE3B2 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD570430996B61600BA26F7 /* Spiral */;
+ targetProxy = AF137D500F075E5C004DE3B2 /* PBXContainerItemProxy */;
+ };
+ AF137D530F075E5C004DE3B2 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD570260996B56D00BA26F7 /* Sphere */;
+ targetProxy = AF137D520F075E5C004DE3B2 /* PBXContainerItemProxy */;
+ };
+ AF137D550F075E5C004DE3B2 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD570B10996B93000BA26F7 /* Rotor */;
+ targetProxy = AF137D540F075E5C004DE3B2 /* PBXContainerItemProxy */;
+ };
+ AF137D570F075E5C004DE3B2 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD56FCF0996B20900BA26F7 /* Lissie */;
+ targetProxy = AF137D560F075E5C004DE3B2 /* PBXContainerItemProxy */;
+ };
+ AF137D590F075E5C004DE3B2 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD56FB90996B18F00BA26F7 /* Lisa */;
+ targetProxy = AF137D580F075E5C004DE3B2 /* PBXContainerItemProxy */;
+ };
+ AF137D5B0F075E5C004DE3B2 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD56FA30996B10F00BA26F7 /* Lightning */;
+ targetProxy = AF137D5A0F075E5C004DE3B2 /* PBXContainerItemProxy */;
+ };
+ AF137D5D0F075E5C004DE3B2 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD56F8C0996B09400BA26F7 /* Laser */;
+ targetProxy = AF137D5C0F075E5C004DE3B2 /* PBXContainerItemProxy */;
+ };
+ AF137D610F075E5C004DE3B2 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55CCC09934CE400F3E977 /* GLForestFire */;
+ targetProxy = AF137D600F075E5C004DE3B2 /* PBXContainerItemProxy */;
+ };
+ AF137D630F075E5C004DE3B2 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD56EDA0996A95700BA26F7 /* Forest */;
+ targetProxy = AF137D620F075E5C004DE3B2 /* PBXContainerItemProxy */;
+ };
+ AF137D650F075E5C004DE3B2 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF477909099DE379001F091E /* Flag */;
+ targetProxy = AF137D640F075E5C004DE3B2 /* PBXContainerItemProxy */;
+ };
+ AF137D670F075E5C004DE3B2 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF47765A099DA78E001F091E /* Critical */;
+ targetProxy = AF137D660F075E5C004DE3B2 /* PBXContainerItemProxy */;
+ };
+ AF137D690F075E5C004DE3B2 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF6427A809A2DE36000F4CD4 /* Bubbles */;
+ targetProxy = AF137D680F075E5C004DE3B2 /* PBXContainerItemProxy */;
+ };
+ AF1A17620D6D6EE3008AF328 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF1A17630D6D6EE3008AF328 /* PBXContainerItemProxy */;
+ };
+ AF1A17840D6D6FA7008AF328 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF1A17610D6D6EE3008AF328 /* LCDscrub */;
+ targetProxy = AF1A17830D6D6FA7008AF328 /* PBXContainerItemProxy */;
+ };
+ AF1B0FA81D7AB4740011DBE4 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF1B0FA91D7AB4740011DBE4 /* PBXContainerItemProxy */;
+ };
+ AF1B0FC51D7AB5740011DBE4 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF1B0FA71D7AB4740011DBE4 /* Hexstrut */;
+ targetProxy = AF1B0FC41D7AB5740011DBE4 /* PBXContainerItemProxy */;
+ };
+ AF2107721FD23BDD00B61EA9 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF2107731FD23BDD00B61EA9 /* PBXContainerItemProxy */;
+ };
+ AF21078F1FD23D9800B61EA9 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF2107711FD23BDD00B61EA9 /* Esper */;
+ targetProxy = AF21078E1FD23D9800B61EA9 /* PBXContainerItemProxy */;
+ };
+ AF32D9E10F3AD0B40080F535 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF32D9E20F3AD0B40080F535 /* PBXContainerItemProxy */;
+ };
+ AF32D9F90F3AD0D90080F535 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF32D9E00F3AD0B40080F535 /* RubikBlocks */;
+ targetProxy = AF32D9F80F3AD0D90080F535 /* PBXContainerItemProxy */;
+ };
+ AF3581C01431D47B00E09C51 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF3581C11431D47B00E09C51 /* PBXContainerItemProxy */;
+ };
+ AF3581FC143330F900E09C51 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF3581FD143330F900E09C51 /* PBXContainerItemProxy */;
+ };
+ AF35E88B0E63823600691F2F /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF35E88C0E63823600691F2F /* PBXContainerItemProxy */;
+ };
+ AF35E8A30E63825600691F2F /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF35E88A0E63823600691F2F /* Jigsaw */;
+ targetProxy = AF35E8A20E63825600691F2F /* PBXContainerItemProxy */;
+ };
+ AF36340118540D050086A439 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF1AD9E118500F9F00932759 /* XScreenSaverUpdater */;
+ targetProxy = AF36340018540D050086A439 /* PBXContainerItemProxy */;
+ };
+ AF39381B1D0FBD6A00205406 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF39381C1D0FBD6A00205406 /* PBXContainerItemProxy */;
+ };
+ AF3938381D0FBF5300205406 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF39381A1D0FBD6A00205406 /* Discoball */;
+ targetProxy = AF3938371D0FBF5300205406 /* PBXContainerItemProxy */;
+ };
+ AF39E283198A11F60064A58D /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF39E284198A11F60064A58D /* PBXContainerItemProxy */;
+ };
+ AF39E2BA198A16920064A58D /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF39E282198A11F60064A58D /* WindupRobot */;
+ targetProxy = AF39E2B9198A16920064A58D /* PBXContainerItemProxy */;
+ };
+ AF3C71460D624BF50030CC0D /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF3C71470D624BF50030CC0D /* PBXContainerItemProxy */;
+ };
+ AF3EC9792035154C00180A35 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF3EC97A2035154C00180A35 /* PBXContainerItemProxy */;
+ };
+ AF3EC996203517EE00180A35 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF3EC9782035154C00180A35 /* Peepers */;
+ targetProxy = AF3EC995203517EE00180A35 /* PBXContainerItemProxy */;
+ };
+ AF41E953201D49DB0098E253 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF41E954201D49DB0098E253 /* PBXContainerItemProxy */;
+ };
+ AF41E971201D4C380098E253 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF41E952201D49DB0098E253 /* RazzleDazzle */;
+ targetProxy = AF41E970201D4C380098E253 /* PBXContainerItemProxy */;
+ };
+ AF42C5160D624E9200B27FF6 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF3C71450D624BF50030CC0D /* Hypnowheel */;
+ targetProxy = AF42C5150D624E9200B27FF6 /* PBXContainerItemProxy */;
+ };
+ AF4540D20E52BE8800AE87B5 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFE30BE80E52B14700CCF4A5 /* Sonar */;
+ targetProxy = AF4540D10E52BE8800AE87B5 /* PBXContainerItemProxy */;
+ };
+ AF46E9D01CBBA2B300240FBC /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF46E9D11CBBA2B300240FBC /* PBXContainerItemProxy */;
+ };
+ AF46E9ED1CBBA49A00240FBC /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF46E9CF1CBBA2B300240FBC /* Unicrud */;
+ targetProxy = AF46E9EC1CBBA49A00240FBC /* PBXContainerItemProxy */;
+ };
+ AF476FB6099D154F001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF476FB7099D154F001F091E /* PBXContainerItemProxy */;
+ };
+ AF476FDB099D1686001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF476FDC099D1686001F091E /* PBXContainerItemProxy */;
+ };
+ AF47704D099D4385001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF47704E099D4385001F091E /* PBXContainerItemProxy */;
+ };
+ AF47716A099D4786001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF47716B099D4786001F091E /* PBXContainerItemProxy */;
+ };
+ AF477180099D4803001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF477181099D4803001F091E /* PBXContainerItemProxy */;
+ };
+ AF4771A8099D4949001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF4771A9099D4949001F091E /* PBXContainerItemProxy */;
+ };
+ AF4771DC099D4D9A001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF4771DD099D4D9A001F091E /* PBXContainerItemProxy */;
+ };
+ AF4771F3099D4E63001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF4771F4099D4E63001F091E /* PBXContainerItemProxy */;
+ };
+ AF477209099D4EE8001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF47720A099D4EE8001F091E /* PBXContainerItemProxy */;
+ };
+ AF47721F099D4F67001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF477220099D4F67001F091E /* PBXContainerItemProxy */;
+ };
+ AF477254099D5717001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF477255099D5717001F091E /* PBXContainerItemProxy */;
+ };
+ AF47726C099D57B9001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF47726D099D57B9001F091E /* PBXContainerItemProxy */;
+ };
+ AF477284099D5926001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF477285099D5926001F091E /* PBXContainerItemProxy */;
+ };
+ AF477383099D65A1001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF477384099D65A1001F091E /* PBXContainerItemProxy */;
+ };
+ AF47739B099D6648001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF47739C099D6648001F091E /* PBXContainerItemProxy */;
+ };
+ AF4773C2099D67B9001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF4773C3099D67B9001F091E /* PBXContainerItemProxy */;
+ };
+ AF477402099D69E7001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF477403099D69E7001F091E /* PBXContainerItemProxy */;
+ };
+ AF477427099D7C70001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF477428099D7C70001F091E /* PBXContainerItemProxy */;
+ };
+ AF477443099D7D33001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF477444099D7D33001F091E /* PBXContainerItemProxy */;
+ };
+ AF477484099D89E4001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF477485099D89E4001F091E /* PBXContainerItemProxy */;
+ };
+ AF47749A099D8A74001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF47749B099D8A74001F091E /* PBXContainerItemProxy */;
+ };
+ AF4774B5099D8B5F001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF4774B6099D8B5F001F091E /* PBXContainerItemProxy */;
+ };
+ AF4774CF099D8BFF001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF4774D0099D8BFF001F091E /* PBXContainerItemProxy */;
+ };
+ AF47755E099D9A1A001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF47755F099D9A1A001F091E /* PBXContainerItemProxy */;
+ };
+ AF477584099D9C28001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF477585099D9C28001F091E /* PBXContainerItemProxy */;
+ };
+ AF4775A0099D9CF7001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF4775A1099D9CF7001F091E /* PBXContainerItemProxy */;
+ };
+ AF4775D9099D9F69001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF4775DA099D9F69001F091E /* PBXContainerItemProxy */;
+ };
+ AF4775F3099DA030001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF4775F4099DA030001F091E /* PBXContainerItemProxy */;
+ };
+ AF477614099DA26C001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF477615099DA26C001F091E /* PBXContainerItemProxy */;
+ };
+ AF477645099DA6D0001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF477646099DA6D0001F091E /* PBXContainerItemProxy */;
+ };
+ AF47765B099DA78E001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF47765C099DA78E001F091E /* PBXContainerItemProxy */;
+ };
+ AF477671099DA849001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF477672099DA849001F091E /* PBXContainerItemProxy */;
+ };
+ AF477690099DAA6F001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF477691099DAA6F001F091E /* PBXContainerItemProxy */;
+ };
+ AF4776AB099DABDD001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF4776AC099DABDD001F091E /* PBXContainerItemProxy */;
+ };
+ AF4776C1099DAC8A001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF4776C2099DAC8A001F091E /* PBXContainerItemProxy */;
+ };
+ AF4776DC099DADDF001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF4776DD099DADDF001F091E /* PBXContainerItemProxy */;
+ };
+ AF4776F2099DAE7A001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF4776F3099DAE7A001F091E /* PBXContainerItemProxy */;
+ };
+ AF47770E099DAF9F001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF47770F099DAF9F001F091E /* PBXContainerItemProxy */;
+ };
+ AF477724099DB044001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF477725099DB044001F091E /* PBXContainerItemProxy */;
+ };
+ AF477753099DB61E001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF477754099DB61E001F091E /* PBXContainerItemProxy */;
+ };
+ AF477775099DB965001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF477776099DB965001F091E /* PBXContainerItemProxy */;
+ };
+ AF477791099DBA90001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF477792099DBA90001F091E /* PBXContainerItemProxy */;
+ };
+ AF4777D2099DC183001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF4777D3099DC183001F091E /* PBXContainerItemProxy */;
+ };
+ AF4778AC099DDB79001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF4778AD099DDB79001F091E /* PBXContainerItemProxy */;
+ };
+ AF4778C8099DDCAE001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF4778C9099DDCAE001F091E /* PBXContainerItemProxy */;
+ };
+ AF4778E9099DDDC8001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF4778EA099DDDC8001F091E /* PBXContainerItemProxy */;
+ };
+ AF47790A099DE379001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF47790B099DE379001F091E /* PBXContainerItemProxy */;
+ };
+ AF47792B099DE4C7001F091E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF47792C099DE4C7001F091E /* PBXContainerItemProxy */;
+ };
+ AF480922098C412F00FB32B8 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF480921098C412F00FB32B8 /* PBXContainerItemProxy */;
+ };
+ AF48092A098C419000FB32B8 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF480929098C419000FB32B8 /* PBXContainerItemProxy */;
+ };
+ AF48092D098C41AE00FB32B8 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF48092C098C41AE00FB32B8 /* PBXContainerItemProxy */;
+ };
+ AF480936098C421200FB32B8 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF480935098C421200FB32B8 /* PBXContainerItemProxy */;
+ };
+ AF480C4A098E301400FB32B8 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF480C4B098E301400FB32B8 /* PBXContainerItemProxy */;
+ };
+ AF480D5C098EED6900FB32B8 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF480D59098EED5100FB32B8 /* All Savers (OpenGL) */;
+ targetProxy = AF480D5B098EED6900FB32B8 /* PBXContainerItemProxy */;
+ };
+ AF480D5E098EED6900FB32B8 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF480D58098EED3D00FB32B8 /* All Savers (XLockmore) */;
+ targetProxy = AF480D5D098EED6900FB32B8 /* PBXContainerItemProxy */;
+ };
+ AF480D60098EED6900FB32B8 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF480AAF098C669800FB32B8 /* All Savers (XScreenSaver) */;
+ targetProxy = AF480D5F098EED6900FB32B8 /* PBXContainerItemProxy */;
+ };
+ AF480D73098EEDDE00FB32B8 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF480D74098EEDDE00FB32B8 /* PBXContainerItemProxy */;
+ };
+ AF4810EC09909FBA00FB32B8 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF4810ED09909FBA00FB32B8 /* PBXContainerItemProxy */;
+ };
+ AF4812510990CE2700FB32B8 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF4812520990CE2700FB32B8 /* PBXContainerItemProxy */;
+ };
+ AF4812B40990D3D900FB32B8 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF4812B50990D3D900FB32B8 /* PBXContainerItemProxy */;
+ };
+ AF48DEF00A0C25E000F94CF9 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF48DEF10A0C25E000F94CF9 /* PBXContainerItemProxy */;
+ };
+ AF48DF060A0C261100F94CF9 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF48DEEF0A0C25E000F94CF9 /* GLSchool */;
+ targetProxy = AF48DF050A0C261100F94CF9 /* PBXContainerItemProxy */;
+ };
+ AF4A344A102A593600A81B2A /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF4A344B102A593600A81B2A /* PBXContainerItemProxy */;
+ };
+ AF4A3460102A59A400A81B2A /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4A3449102A593600A81B2A /* Surfaces */;
+ targetProxy = AF4A345F102A59A400A81B2A /* PBXContainerItemProxy */;
+ };
+ AF4F10EE143450C300E34F3F /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF3581BF1431D47B00E09C51 /* CompanionCube */;
+ targetProxy = AF4F10ED143450C300E34F3F /* PBXContainerItemProxy */;
+ };
+ AF4F10F0143450C300E34F3F /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF78D175142DD8F3002AAF77 /* Hilbert */;
+ targetProxy = AF4F10EF143450C300E34F3F /* PBXContainerItemProxy */;
+ };
+ AF4F10F2143450C300E34F3F /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF3581FB143330F900E09C51 /* TronBit */;
+ targetProxy = AF4F10F1143450C300E34F3F /* PBXContainerItemProxy */;
+ };
+ AF4FD6E70CE7A486005EE58E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF4FD6E80CE7A486005EE58E /* PBXContainerItemProxy */;
+ };
+ AF4FD6FF0CE7A4F9005EE58E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4FD6E60CE7A486005EE58E /* Lockward */;
+ targetProxy = AF4FD6FE0CE7A4F9005EE58E /* PBXContainerItemProxy */;
+ };
+ AF4FF4980D52CA5000666F98 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4FF4930D52CA0800666F98 /* m6502.h */;
+ targetProxy = AF4FF4970D52CA5000666F98 /* PBXContainerItemProxy */;
+ };
+ AF4FF4BB0D52CBDE00666F98 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF4FF4BC0D52CBDE00666F98 /* PBXContainerItemProxy */;
+ };
+ AF4FF4D70D52CD0D00666F98 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4FF4BA0D52CBDE00666F98 /* CubicGrid */;
+ targetProxy = AF4FF4D60D52CD0D00666F98 /* PBXContainerItemProxy */;
+ };
+ AF5C9AFA1A0CCE6E00B0147A /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF5C9AFB1A0CCE6E00B0147A /* PBXContainerItemProxy */;
+ };
+ AF5C9B161A0CCF8000B0147A /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF5C9AF91A0CCE6E00B0147A /* Cityflow */;
+ targetProxy = AF5C9B151A0CCF8000B0147A /* PBXContainerItemProxy */;
+ };
+ AF5ECEAA2116B1A400069433 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF5ECEAB2116B1A400069433 /* PBXContainerItemProxy */;
+ };
+ AF5ECEC92116B31F00069433 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF5ECEA92116B1A400069433 /* VFeedback */;
+ targetProxy = AF5ECEC82116B31F00069433 /* PBXContainerItemProxy */;
+ };
+ AF633C021EE0BA6F00AB33BD /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF633C031EE0BA6F00AB33BD /* PBXContainerItemProxy */;
+ };
+ AF633C1F1EE0BCD300AB33BD /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF633C011EE0BA6F00AB33BD /* Vigilance */;
+ targetProxy = AF633C1E1EE0BCD300AB33BD /* PBXContainerItemProxy */;
+ };
+ AF63A7F21AB4EDDB00593C75 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF63A7F31AB4EDDB00593C75 /* PBXContainerItemProxy */;
+ };
+ AF63A80F1AB4EFD300593C75 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF63A7F11AB4EDDB00593C75 /* RomanBoy */;
+ targetProxy = AF63A80E1AB4EFD300593C75 /* PBXContainerItemProxy */;
+ };
+ AF63F2481C3465BE0033E133 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF63F2491C3465BE0033E133 /* PBXContainerItemProxy */;
+ };
+ AF63F24A1C3465BE0033E133 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4FF4930D52CA0800666F98 /* m6502.h */;
+ targetProxy = AF63F24B1C3465BE0033E133 /* PBXContainerItemProxy */;
+ };
+ AF63F24C1C3465BE0033E133 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA56119099378CB00F3E977 /* molecules.h */;
+ targetProxy = AF63F24D1C3465BE0033E133 /* PBXContainerItemProxy */;
+ };
+ AF63F4511C34682A0033E133 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF63F4521C34682A0033E133 /* PBXContainerItemProxy */;
+ };
+ AF63F4531C34682A0033E133 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4FF4930D52CA0800666F98 /* m6502.h */;
+ targetProxy = AF63F4541C34682A0033E133 /* PBXContainerItemProxy */;
+ };
+ AF63F4551C34682A0033E133 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA56119099378CB00F3E977 /* molecules.h */;
+ targetProxy = AF63F4561C34682A0033E133 /* PBXContainerItemProxy */;
+ };
+ AF63F4791C3469FC0033E133 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF63F47A1C3469FC0033E133 /* PBXContainerItemProxy */;
+ };
+ AF63F47B1C3469FC0033E133 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4FF4930D52CA0800666F98 /* m6502.h */;
+ targetProxy = AF63F47C1C3469FC0033E133 /* PBXContainerItemProxy */;
+ };
+ AF63F47D1C3469FC0033E133 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA56119099378CB00F3E977 /* molecules.h */;
+ targetProxy = AF63F47E1C3469FC0033E133 /* PBXContainerItemProxy */;
+ };
+ AF6423F3099FF9C2000F4CD4 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF6423F4099FF9C2000F4CD4 /* PBXContainerItemProxy */;
+ };
+ AF6425CD09A18855000F4CD4 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF6425CE09A18855000F4CD4 /* PBXContainerItemProxy */;
+ };
+ AF6425ED09A189EC000F4CD4 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF6425EE09A189EC000F4CD4 /* PBXContainerItemProxy */;
+ };
+ AF64261009A18D6C000F4CD4 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF64261109A18D6C000F4CD4 /* PBXContainerItemProxy */;
+ };
+ AF64262D09A18F54000F4CD4 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF64262E09A18F54000F4CD4 /* PBXContainerItemProxy */;
+ };
+ AF64265009A19229000F4CD4 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF64265109A19229000F4CD4 /* PBXContainerItemProxy */;
+ };
+ AF64267C09A194B0000F4CD4 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF64267D09A194B0000F4CD4 /* PBXContainerItemProxy */;
+ };
+ AF64277209A1D37A000F4CD4 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF64277309A1D37A000F4CD4 /* PBXContainerItemProxy */;
+ };
+ AF6427A909A2DE36000F4CD4 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF6427AA09A2DE36000F4CD4 /* PBXContainerItemProxy */;
+ };
+ AF68A47F19196CF800D41CD1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF68A48019196CF800D41CD1 /* PBXContainerItemProxy */;
+ };
+ AF68A49E19196EA000D41CD1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF68A47E19196CF800D41CD1 /* Tessellimage */;
+ targetProxy = AF68A49D19196EA000D41CD1 /* PBXContainerItemProxy */;
+ };
+ AF714E4F105613410046AB1D /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4774B4099D8B5F001F091E /* LMorph */;
+ targetProxy = AF714E4E105613410046AB1D /* PBXContainerItemProxy */;
+ };
+ AF714E51105613580046AB1D /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD570C90996B9F800BA26F7 /* Ant */;
+ targetProxy = AF714E50105613580046AB1D /* PBXContainerItemProxy */;
+ };
+ AF73FF231A09877F00E485E9 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF73FF241A09877F00E485E9 /* PBXContainerItemProxy */;
+ };
+ AF73FF3F1A0988F000E485E9 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF73FF221A09877F00E485E9 /* BinaryRing */;
+ targetProxy = AF73FF3E1A0988F000E485E9 /* PBXContainerItemProxy */;
+ };
+ AF7511001782B5B900380EA1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF7511011782B5B900380EA1 /* PBXContainerItemProxy */;
+ };
+ AF7776E509B63ABF00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF7776E609B63ABF00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77771B09B6416100EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF77771C09B6416100EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77773F09B6446500EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF77774009B6446500EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77777509B6497800EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF77777609B6497800EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77778F09B64A5200EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF77779009B64A5200EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7777A909B64B2600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF7777AA09B64B2600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7777D109B64C6B00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF7777D209B64C6B00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7777EB09B64E3100EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF7777EC09B64E3100EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77781109B6504400EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF77781209B6504400EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77784509B6528100EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF77784609B6528100EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77786209B6536000EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF77786309B6536000EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77788009B6563500EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF77788109B6563500EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7778A609B659C800EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF7778A709B659C800EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7778D709B6604500EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF9D475F09B53166006E59CF /* Zoom */;
+ targetProxy = AF7778D609B6604500EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7778D909B6604500EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4776AA099DABDD001F091E /* XSpirograph */;
+ targetProxy = AF7778D809B6604500EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7778DB09B6604500EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4776C0099DAC8A001F091E /* XRaySwarm */;
+ targetProxy = AF7778DA09B6604500EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7778DD09B6604600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF477442099D7D33001F091E /* XMatrix */;
+ targetProxy = AF7778DC09B6604600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7778DF09B6604600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF9D4C6909B59F27006E59CF /* XLyap */;
+ targetProxy = AF7778DE09B6604600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7778E109B6604600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4778C7099DDCAE001F091E /* XJack */;
+ targetProxy = AF7778E009B6604600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7778E309B6604600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF9D4D7E09B5B2DC006E59CF /* XAnalogTV */;
+ targetProxy = AF7778E209B6604600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7778E509B6604600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF975808099C41D500B05160 /* XFlame */;
+ targetProxy = AF7778E409B6604600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7778E709B6604600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF477382099D65A1001F091E /* Wormhole */;
+ targetProxy = AF7778E609B6604600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7778EB09B6604600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4776DB099DADDF001F091E /* WhirlWindWarp */;
+ targetProxy = AF7778EA09B6604600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7778ED09B6604600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF47717F099D4803001F091E /* Wander */;
+ targetProxy = AF7778EC09B6604600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7778EF09B6604600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4776F1099DAE7A001F091E /* Vermiculate */;
+ targetProxy = AF7778EE09B6604600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7778F109B6604600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF9D496C09B5411D006E59CF /* Twang */;
+ targetProxy = AF7778F009B6604600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7778F309B6604600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF476FDA099D1686001F091E /* Truchet */;
+ targetProxy = AF7778F209B6604600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7778F709B6604600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF477723099DB044001F091E /* Substrate */;
+ targetProxy = AF7778F609B6604600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7778F909B6604600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF47759F099D9CF7001F091E /* Starfish */;
+ targetProxy = AF7778F809B6604600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7778FB09B6604600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF477644099DA6D0001F091E /* Squiral */;
+ targetProxy = AF7778FA09B6604600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7778FD09B6604600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF9D499709B544C2006E59CF /* Spotlight */;
+ targetProxy = AF7778FC09B6604600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7778FF09B6604700EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF64277109A1D37A000F4CD4 /* SpeedMine */;
+ targetProxy = AF7778FE09B6604700EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77790309B6604700EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF47792A099DE4C7001F091E /* Slip */;
+ targetProxy = AF77790209B6604700EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77790509B6604700EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF9D474409B5300A006E59CF /* SlideScreen */;
+ targetProxy = AF77790409B6604700EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77790709B6604700EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF975865099C475900B05160 /* ShadeBobs */;
+ targetProxy = AF77790609B6604700EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77790909B6604700EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF9D495409B53FC9006E59CF /* RotZoomer */;
+ targetProxy = AF77790809B6604700EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77790B09B6604700EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF9770290989D1E6001F8B92 /* Rorschach */;
+ targetProxy = AF77790A09B6604700EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77790D09B6604700EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF975D52099CA0F000B05160 /* Rocks */;
+ targetProxy = AF77790C09B6604700EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77790F09B6604700EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF9D492B09B53CBA006E59CF /* Ripples */;
+ targetProxy = AF77790E09B6604700EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77791109B6604700EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF9757C2099C3E6300B05160 /* RDbomb */;
+ targetProxy = AF77791009B6604700EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77791309B6604700EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF6425EC09A189EC000F4CD4 /* Qix */;
+ targetProxy = AF77791209B6604700EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77791509B6604700EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF477583099D9C28001F091E /* Pyro */;
+ targetProxy = AF77791409B6604700EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77791709B6604700EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF47726B099D57B9001F091E /* PopSquares */;
+ targetProxy = AF77791609B6604700EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77791909B6604700EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF9D4CE709B5AA8E006E59CF /* Pong */;
+ targetProxy = AF77791809B6604700EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77791B09B6604700EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF477283099D5926001F091E /* Piecewise */;
+ targetProxy = AF77791A09B6604700EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77791D09B6604800EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF7776E409B63ABF00EA3033 /* Phosphor */;
+ targetProxy = AF77791C09B6604800EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77791F09B6604800EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF477670099DA849001F091E /* Petri */;
+ targetProxy = AF77791E09B6604800EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77792109B6604800EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4778AB099DDB79001F091E /* Penetrate */;
+ targetProxy = AF77792009B6604800EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77792309B6604800EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF47755D099D9A1A001F091E /* Pedal */;
+ targetProxy = AF77792209B6604800EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77792509B6604800EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF975C5D099C8F3F00B05160 /* NoseGuy */;
+ targetProxy = AF77792409B6604800EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77792709B6604800EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4771F2099D4E63001F091E /* NerveRot */;
+ targetProxy = AF77792609B6604800EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77792909B6604800EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF64264F09A19229000F4CD4 /* Munch */;
+ targetProxy = AF77792809B6604800EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77792B09B6604800EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF64262C09A18F54000F4CD4 /* Moire2 */;
+ targetProxy = AF77792A09B6604800EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77792D09B6604800EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF975775099C374A00B05160 /* Moire */;
+ targetProxy = AF77792C09B6604800EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77793109B6604800EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF975A36099C681F00B05160 /* MetaBalls */;
+ targetProxy = AF77793009B6604800EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77793309B6604800EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF975AFC099C6FE400B05160 /* MemScroller */;
+ targetProxy = AF77793209B6604800EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77793509B6604800EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4774CE099D8BFF001F091E /* Maze */;
+ targetProxy = AF77793409B6604800EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77793909B6604800EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF477613099DA26C001F091E /* Kumppa */;
+ targetProxy = AF77793809B6604800EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77793B09B6604900EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF477499099D8A74001F091E /* Kaleidescope */;
+ targetProxy = AF77793A09B6604900EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77793F09B6604900EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF477401099D69E7001F091E /* Intermomentary */;
+ targetProxy = AF77793E09B6604900EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77794109B6604900EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF476FB5099D154F001F091E /* Interference */;
+ targetProxy = AF77794009B6604900EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77794309B6604900EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF477752099DB61E001F091E /* Interaggregate */;
+ targetProxy = AF77794209B6604900EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77794509B6604900EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF97572D099C317000B05160 /* IMSMap */;
+ targetProxy = AF77794409B6604900EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77794709B6604900EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF477426099D7C70001F091E /* IFS */;
+ targetProxy = AF77794609B6604900EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77794D09B6604900EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF480C49098E301400FB32B8 /* Helix */;
+ targetProxy = AF77794C09B6604900EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77794F09B6604900EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF975C12099C8C1500B05160 /* Halo */;
+ targetProxy = AF77794E09B6604900EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77795109B6604900EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF477253099D5717001F091E /* Halftone */;
+ targetProxy = AF77795009B6604900EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77795309B6604900EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF975C3D099C8DCF00B05160 /* Greynetic */;
+ targetProxy = AF77795209B6604900EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77795509B6604A00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF64267B09A194B0000F4CD4 /* Goop */;
+ targetProxy = AF77795409B6604A00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77795709B6604A00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF47739A099D6648001F091E /* FuzzyFlakes */;
+ targetProxy = AF77795609B6604A00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77795909B6604A00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF77787F09B6563500EA3033 /* FontGlide */;
+ targetProxy = AF77795809B6604A00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77795B09B6604A00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF477790099DBA90001F091E /* FluidBalls */;
+ targetProxy = AF77795A09B6604A00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77795D09B6604A00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF477483099D89E4001F091E /* Flame */;
+ targetProxy = AF77795C09B6604A00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77795F09B6604A00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF975AD7099C6EB100B05160 /* Fireworkx */;
+ targetProxy = AF77795E09B6604A00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77796109B6604A00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF975A6C099C6AB200B05160 /* Eruption */;
+ targetProxy = AF77796009B6604A00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77796309B6604A00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4775F2099DA030001F091E /* Epicycle */;
+ targetProxy = AF77796209B6604A00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77796509B6604A00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF9D48F409B535DA006E59CF /* Distort */;
+ targetProxy = AF77796409B6604A00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77796709B6604A00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF47704C099D4385001F091E /* Deluxe */;
+ targetProxy = AF77796609B6604A00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77796909B6604A00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF976FBB0989CAA2001F8B92 /* Deco */;
+ targetProxy = AF77796809B6604A00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77796B09B6604A00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF9D466609B5109C006E59CF /* DecayScreen */;
+ targetProxy = AF77796A09B6604A00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77796D09B6604A00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4778E8099DDDC8001F091E /* Cynosure */;
+ targetProxy = AF77796C09B6604A00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77797109B6604B00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4775D8099D9F69001F091E /* Coral */;
+ targetProxy = AF77797009B6604B00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77797309B6604B00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF477169099D4786001F091E /* Compass */;
+ targetProxy = AF77797209B6604B00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77797509B6604B00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF47770D099DAF9F001F091E /* CloudLife */;
+ targetProxy = AF77797409B6604B00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77797709B6604B00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF477774099DB965001F091E /* Celtic */;
+ targetProxy = AF77797609B6604B00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77797909B6604B00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4771DB099D4D9A001F091E /* CCurve */;
+ targetProxy = AF77797809B6604B00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77797B09B6604B00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF9D48DB09B53322006E59CF /* Bumps */;
+ targetProxy = AF77797A09B6604B00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77797F09B6604B00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF9D4DAF09B5B71E006E59CF /* BSOD */;
+ targetProxy = AF77797E09B6604B00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77798109B6604B00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4777D1099DC183001F091E /* BoxFit */;
+ targetProxy = AF77798009B6604B00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77798309B6604B00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF7778A509B659C800EA3033 /* BlitSpin */;
+ targetProxy = AF77798209B6604B00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77798509B6604B00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF47768F099DAA6F001F091E /* Blaster */;
+ targetProxy = AF77798409B6604B00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77798709B6604B00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF975A86099C6BC300B05160 /* Barcode */;
+ targetProxy = AF77798609B6604B00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77798909B6604C00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF9770660989D2F6001F8B92 /* Attraction */;
+ targetProxy = AF77798809B6604C00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77798B09B6604C00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF9D4DEC09B5BB19006E59CF /* Apple2 */;
+ targetProxy = AF77798A09B6604C00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77798D09B6604C00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4773C1099D67B9001F091E /* Anemotaxis */;
+ targetProxy = AF77798C09B6604C00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77798F09B6604C00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF47721E099D4F67001F091E /* Anemone */;
+ targetProxy = AF77798E09B6604C00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77799509B6608000EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD570850996B80300BA26F7 /* Triangle */;
+ targetProxy = AF77799409B6608000EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77799709B6608100EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD571590996C0CE00BA26F7 /* Thornbird */;
+ targetProxy = AF77799609B6608100EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77799909B6608100EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD572220996E4A300BA26F7 /* Swirl */;
+ targetProxy = AF77799809B6608100EA3033 /* PBXContainerItemProxy */;
+ };
+ AF77799B09B6608100EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD5735D0997411200BA26F7 /* Strange */;
+ targetProxy = AF77799A09B6608100EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779A109B6608100EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD5700F0996B4CC00BA26F7 /* Sierpinski */;
+ targetProxy = AF7779A009B6608100EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779A509B6608100EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD5726D0996EE8500BA26F7 /* Polyominoes */;
+ targetProxy = AF7779A409B6608100EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779A709B6608100EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD56FF80996B43800BA26F7 /* Penrose */;
+ targetProxy = AF7779A609B6608100EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779A909B6608100EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF77771A09B6416100EA3033 /* Pacman */;
+ targetProxy = AF7779A809B6608100EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779AB09B6608100EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD5706F0996B72700BA26F7 /* Mountain */;
+ targetProxy = AF7779AA09B6608100EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779AD09B6608100EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF794FCD09974FA60059A8B0 /* Loop */;
+ targetProxy = AF7779AC09B6608100EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779B709B6608100EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD572F9099701C000BA26F7 /* Julia */;
+ targetProxy = AF7779B609B6608100EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779BB09B6608100EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD56F6B0996B01600BA26F7 /* Hopalong */;
+ targetProxy = AF7779BA09B6608100EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779BD09B6608100EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD56F4F0996AEEE00BA26F7 /* Grav */;
+ targetProxy = AF7779BC09B6608100EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779BF09B6608100EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD56F230996AB8A00BA26F7 /* Galaxy */;
+ targetProxy = AF7779BE09B6608100EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779C309B6608100EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD570EA0996BBBF00BA26F7 /* Flow */;
+ targetProxy = AF7779C209B6608100EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779C709B6608200EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF794F8E09974A320059A8B0 /* Fiberlamp */;
+ targetProxy = AF7779C609B6608200EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779C909B6608200EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD570590996B6A300BA26F7 /* FadePlot */;
+ targetProxy = AF7779C809B6608200EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779CB09B6608200EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD571430996C01700BA26F7 /* Euler2D */;
+ targetProxy = AF7779CA09B6608200EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779CD09B6608200EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF480D72098EEDDE00FB32B8 /* Drift */;
+ targetProxy = AF7779CC09B6608200EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779CF09B6608200EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD571130996BE9300BA26F7 /* Discrete */;
+ targetProxy = AF7779CE09B6608200EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779D109B6608200EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF794F64099748450059A8B0 /* Demon */;
+ targetProxy = AF7779D009B6608200EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779D309B6608200EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD572C20996FC0F00BA26F7 /* Crystal */;
+ targetProxy = AF7779D209B6608200EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779D509B6608200EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD56EAE0996A72600BA26F7 /* Braid */;
+ targetProxy = AF7779D409B6608200EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779D709B6608200EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD572A50996F99600BA26F7 /* Bouboule */;
+ targetProxy = AF7779D609B6608200EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779D909B6608200EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD5712C0996BF2E00BA26F7 /* Apollonian */;
+ targetProxy = AF7779D809B6608200EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779DD09B660AF00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA56379099397B300F3E977 /* TimeTunnel */;
+ targetProxy = AF7779DC09B660AF00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779DF09B660AF00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA562F20993943B00F3E977 /* Tangram */;
+ targetProxy = AF7779DE09B660AF00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779E109B660AF00EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA559920993322100F3E977 /* Superquadrics */;
+ targetProxy = AF7779E009B660AF00EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779E309B660B000EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF7777A809B64B2600EA3033 /* StonerView */;
+ targetProxy = AF7779E209B660B000EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779E509B660B000EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF77781009B6504400EA3033 /* StarWars */;
+ targetProxy = AF7779E409B660B000EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779E709B660B000EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55A030993340300F3E977 /* Stairs */;
+ targetProxy = AF7779E609B660B000EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779E909B660B000EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55A20099334A000F3E977 /* Sproingies */;
+ targetProxy = AF7779E809B660B000EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779EB09B660B000EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55D7F099358C400F3E977 /* Spheremonics */;
+ targetProxy = AF7779EA09B660B000EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779ED09B660B000EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55B7909933F7200F3E977 /* Sierpinski3D */;
+ targetProxy = AF7779EC09B660B000EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779EF09B660B000EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55D3C0993565300F3E977 /* SBalls */;
+ targetProxy = AF7779EE09B660B000EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779F109B660B000EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA559CF0993330600F3E977 /* Rubik */;
+ targetProxy = AF7779F009B660B000EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779F309B660B000EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55DF009935E4900F3E977 /* Queens */;
+ targetProxy = AF7779F209B660B000EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779F509B660B100EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55B2509933E8D00F3E977 /* Pulsar */;
+ targetProxy = AF7779F409B660B100EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779F709B660B100EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA562060993849F00F3E977 /* Providence */;
+ targetProxy = AF7779F609B660B100EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779F909B660B100EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA560AE0993718D00F3E977 /* Polytopes */;
+ targetProxy = AF7779F809B660B100EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779FB09B660B100EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA5619D09937D7E00F3E977 /* Polyhedra */;
+ targetProxy = AF7779FA09B660B100EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779FD09B660B100EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4812B30990D3D900FB32B8 /* Pipes */;
+ targetProxy = AF7779FC09B660B100EA3033 /* PBXContainerItemProxy */;
+ };
+ AF7779FF09B660B200EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA5621F0993852500F3E977 /* Pinion */;
+ targetProxy = AF7779FE09B660B200EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A0109B660B200EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA5617B09937CF100F3E977 /* Noof */;
+ targetProxy = AF777A0009B660B200EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A0309B660B200EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA559B50993328000F3E977 /* Morph3D */;
+ targetProxy = AF777A0209B660B200EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A0509B660B200EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA560FD0993781600F3E977 /* Molecule */;
+ targetProxy = AF777A0409B660B200EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A0709B660B200EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA5596D0993317900F3E977 /* Moebius */;
+ targetProxy = AF777A0609B660B200EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A0909B660B200EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF77778E09B64A5200EA3033 /* MirrorBlob */;
+ targetProxy = AF777A0809B660B200EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A0B09B660B200EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55BE40993429100F3E977 /* Menger */;
+ targetProxy = AF777A0A09B660B200EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A0D09B660B200EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55DC809935D7000F3E977 /* Lavalite */;
+ targetProxy = AF777A0C09B660B200EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A0F09B660B200EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55A790993364300F3E977 /* Lament */;
+ targetProxy = AF777A0E09B660B200EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A1109B660B300EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55F2A0993622F00F3E977 /* Klein */;
+ targetProxy = AF777A1009B660B300EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A1309B660B300EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA563A4099398BB00F3E977 /* Juggler3D */;
+ targetProxy = AF777A1209B660B300EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A1509B660B300EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55F06099361B700F3E977 /* JigglyPuff */;
+ targetProxy = AF777A1409B660B300EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A1709B660B300EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55F420993629000F3E977 /* Hypertorus */;
+ targetProxy = AF777A1609B660B300EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A1909B660B300EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD56DF10996A03800BA26F7 /* GLText */;
+ targetProxy = AF777A1809B660B300EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A1B09B660B300EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55C77099349A600F3E977 /* GLSnake */;
+ targetProxy = AF777A1A09B660B300EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A1D09B660B300EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF7777D009B64C6B00EA3033 /* GLSlideshow */;
+ targetProxy = AF777A1C09B660B300EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A1F09B660B300EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55B0909933E0500F3E977 /* GLPlanet */;
+ targetProxy = AF777A1E09B660B300EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A2109B660B300EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55F720993643600F3E977 /* GLMatrix */;
+ targetProxy = AF777A2009B660B300EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A2309B660B400EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55FF909936C6D00F3E977 /* GLKnots */;
+ targetProxy = AF777A2209B660B400EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A2509B660B400EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA56331099395ED00F3E977 /* GLHanoi */;
+ targetProxy = AF777A2409B660B400EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A2909B660B400EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55E2F09935F8E00F3E977 /* GLBlur */;
+ targetProxy = AF777A2809B660B400EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A2B09B660B400EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55B9109933FDA00F3E977 /* GFlux */;
+ targetProxy = AF777A2A09B660B400EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A2D09B660B400EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF77777409B6497800EA3033 /* Gleidescope */;
+ targetProxy = AF777A2C09B660B400EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A2F09B660B400EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4812500990CE2700FB32B8 /* Gears */;
+ targetProxy = AF777A2E09B660B400EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A3109B660B400EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55E4E09935FF900F3E977 /* FlyingToasters */;
+ targetProxy = AF777A3009B660B400EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A3309B660B400EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF7777EA09B64E3100EA3033 /* FlipText */;
+ targetProxy = AF777A3209B660B400EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A3509B660B400EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF77773E09B6446500EA3033 /* FlipScreen3D */;
+ targetProxy = AF777A3409B660B400EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A3709B660B400EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA5603209936D5100F3E977 /* FlipFlop */;
+ targetProxy = AF777A3609B660B400EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A3909B660B400EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF6423F2099FF9C2000F4CD4 /* Extrusion */;
+ targetProxy = AF777A3809B660B400EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A3B09B660B500EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55C0E0993431300F3E977 /* Engine */;
+ targetProxy = AF777A3A09B660B500EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A3D09B660B500EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55E0D09935EDC00F3E977 /* Endgame */;
+ targetProxy = AF777A3C09B660B500EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A3F09B660B500EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF77786109B6536000EA3033 /* DNAlogo */;
+ targetProxy = AF777A3E09B660B500EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A4109B660B500EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4810EB09909FBA00FB32B8 /* DangerBall */;
+ targetProxy = AF777A4009B660B500EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A4309B660B500EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55FD309936BFA00F3E977 /* CubeStorm */;
+ targetProxy = AF777A4209B660B500EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A4509B660B500EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55D620993584B00F3E977 /* Cubenetic */;
+ targetProxy = AF777A4409B660B500EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A4709B660B500EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA56351099396C000F3E977 /* Cube21 */;
+ targetProxy = AF777A4609B660B500EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A4909B660B500EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA563130993951000F3E977 /* Crackberg */;
+ targetProxy = AF777A4809B660B500EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A4B09B660B600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55BAB099340CE00F3E977 /* Circuit */;
+ targetProxy = AF777A4A09B660B600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A4D09B660B600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF77784409B6528100EA3033 /* Carousel */;
+ targetProxy = AF777A4C09B660B600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A4F09B660B600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55946099330B000F3E977 /* Cage */;
+ targetProxy = AF777A4E09B660B600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A5109B660B600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55ACF09933CEF00F3E977 /* Bubble3D */;
+ targetProxy = AF777A5009B660B600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A5309B660B600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55CA909934BB200F3E977 /* Boxed */;
+ targetProxy = AF777A5209B660B600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A5509B660B600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA55EC7099360E300F3E977 /* BouncingCow */;
+ targetProxy = AF777A5409B660B600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A5709B660B600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA562BF099392C600F3E977 /* Boing */;
+ targetProxy = AF777A5609B660B600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A5909B660B600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA5601409936CC800F3E977 /* BlockTube */;
+ targetProxy = AF777A5809B660B600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A5B09B660B600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA5615609937C0D00F3E977 /* BlinkBox */;
+ targetProxy = AF777A5A09B660B600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A5D09B660B600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF083A32099311D700277BE9 /* Atunnel */;
+ targetProxy = AF777A5C09B660B600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A5F09B660B600EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF08398F09930B6B00277BE9 /* Atlantis */;
+ targetProxy = AF777A5E09B660B600EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A6109B660B700EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA5606209936F3800F3E977 /* AntSpotlight */;
+ targetProxy = AF777A6009B660B700EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A6309B660B700EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA562DA099393C900F3E977 /* AntMaze */;
+ targetProxy = AF777A6209B660B700EA3033 /* PBXContainerItemProxy */;
+ };
+ AF777A6509B660B700EA3033 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA5604A09936E2100F3E977 /* AntInspect */;
+ targetProxy = AF777A6409B660B700EA3033 /* PBXContainerItemProxy */;
+ };
+ AF78D176142DD8F3002AAF77 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF78D177142DD8F3002AAF77 /* PBXContainerItemProxy */;
+ };
+ AF794F65099748450059A8B0 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF794F66099748450059A8B0 /* PBXContainerItemProxy */;
+ };
+ AF794F8F09974A320059A8B0 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF794F9009974A320059A8B0 /* PBXContainerItemProxy */;
+ };
+ AF794FCE09974FA60059A8B0 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF794FCF09974FA60059A8B0 /* PBXContainerItemProxy */;
+ };
+ AF7ACFC119FF0A9200BD752B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF7ACFC219FF0A9200BD752B /* PBXContainerItemProxy */;
+ };
+ AF7ACFDC19FF0BDB00BD752B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF7ACFC019FF0A9200BD752B /* GeodesicGears */;
+ targetProxy = AF7ACFDB19FF0BDB00BD752B /* PBXContainerItemProxy */;
+ };
+ AF7E07FE15925DF200D81407 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4FF4930D52CA0800666F98 /* m6502.h */;
+ targetProxy = AF7E07FD15925DF200D81407 /* PBXContainerItemProxy */;
+ };
+ AF7E080015925DFE00D81407 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA56119099378CB00F3E977 /* molecules.h */;
+ targetProxy = AF7E07FF15925DFE00D81407 /* PBXContainerItemProxy */;
+ };
+ AF918978158FC00A002B5D1E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF918979158FC00A002B5D1E /* PBXContainerItemProxy */;
+ };
+ AF97572E099C317000B05160 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF97572F099C317000B05160 /* PBXContainerItemProxy */;
+ };
+ AF975776099C374A00B05160 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF975777099C374A00B05160 /* PBXContainerItemProxy */;
+ };
+ AF9757C3099C3E6300B05160 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF9757C4099C3E6300B05160 /* PBXContainerItemProxy */;
+ };
+ AF975809099C41D500B05160 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF97580A099C41D500B05160 /* PBXContainerItemProxy */;
+ };
+ AF975866099C475900B05160 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF975867099C475900B05160 /* PBXContainerItemProxy */;
+ };
+ AF975A37099C681F00B05160 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF975A38099C681F00B05160 /* PBXContainerItemProxy */;
+ };
+ AF975A6D099C6AB200B05160 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF975A6E099C6AB200B05160 /* PBXContainerItemProxy */;
+ };
+ AF975A87099C6BC300B05160 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF975A88099C6BC300B05160 /* PBXContainerItemProxy */;
+ };
+ AF975AD8099C6EB100B05160 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF975AD9099C6EB100B05160 /* PBXContainerItemProxy */;
+ };
+ AF975AFD099C6FE400B05160 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF975AFE099C6FE400B05160 /* PBXContainerItemProxy */;
+ };
+ AF975C13099C8C1500B05160 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF975C14099C8C1500B05160 /* PBXContainerItemProxy */;
+ };
+ AF975C3E099C8DCF00B05160 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF975C3F099C8DCF00B05160 /* PBXContainerItemProxy */;
+ };
+ AF975C5E099C8F3F00B05160 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF975C5F099C8F3F00B05160 /* PBXContainerItemProxy */;
+ };
+ AF975D53099CA0F000B05160 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF975D54099CA0F000B05160 /* PBXContainerItemProxy */;
+ };
+ AF998EDB0A083DB30051049D /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF998EDC0A083DB30051049D /* PBXContainerItemProxy */;
+ };
+ AF998EF70A083E1D0051049D /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF998EDA0A083DB30051049D /* TopBlock */;
+ targetProxy = AF998EF60A083E1D0051049D /* PBXContainerItemProxy */;
+ };
+ AF9D466709B5109C006E59CF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF9D466809B5109C006E59CF /* PBXContainerItemProxy */;
+ };
+ AF9D474509B5300A006E59CF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF9D474609B5300A006E59CF /* PBXContainerItemProxy */;
+ };
+ AF9D476009B53166006E59CF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF9D476109B53166006E59CF /* PBXContainerItemProxy */;
+ };
+ AF9D48DC09B53322006E59CF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF9D48DD09B53322006E59CF /* PBXContainerItemProxy */;
+ };
+ AF9D48F509B535DA006E59CF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF9D48F609B535DA006E59CF /* PBXContainerItemProxy */;
+ };
+ AF9D492C09B53CBA006E59CF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF9D492D09B53CBA006E59CF /* PBXContainerItemProxy */;
+ };
+ AF9D495509B53FC9006E59CF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF9D495609B53FC9006E59CF /* PBXContainerItemProxy */;
+ };
+ AF9D496D09B5411D006E59CF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF9D496E09B5411D006E59CF /* PBXContainerItemProxy */;
+ };
+ AF9D499809B544C2006E59CF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF9D499909B544C2006E59CF /* PBXContainerItemProxy */;
+ };
+ AF9D4C6A09B59F27006E59CF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF9D4C6B09B59F27006E59CF /* PBXContainerItemProxy */;
+ };
+ AF9D4CE809B5AA8E006E59CF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF9D4CE909B5AA8E006E59CF /* PBXContainerItemProxy */;
+ };
+ AF9D4D7F09B5B2DC006E59CF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF9D4D8009B5B2DC006E59CF /* PBXContainerItemProxy */;
+ };
+ AF9D4DB009B5B71E006E59CF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF9D4DB109B5B71E006E59CF /* PBXContainerItemProxy */;
+ };
+ AF9D4DED09B5BB19006E59CF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AF9D4DEE09B5BB19006E59CF /* PBXContainerItemProxy */;
+ };
+ AFA160921052FF87009B93AA /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF6425CC09A18855000F4CD4 /* HyperCube */;
+ targetProxy = AFA160911052FF87009B93AA /* PBXContainerItemProxy */;
+ };
+ AFA160941052FF87009B93AA /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF64260F09A18D6C000F4CD4 /* HyperBall */;
+ targetProxy = AFA160931052FF87009B93AA /* PBXContainerItemProxy */;
+ };
+ AFA2118D1CD59DAF00C0D2A1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA2118E1CD59DAF00C0D2A1 /* PBXContainerItemProxy */;
+ };
+ AFA211AA1CD5A08000C0D2A1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA2118C1CD59DAF00C0D2A1 /* RaverHoop */;
+ targetProxy = AFA211A91CD5A08000C0D2A1 /* PBXContainerItemProxy */;
+ };
+ AFA3392F0B058505002B0E7D /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA339300B058505002B0E7D /* PBXContainerItemProxy */;
+ };
+ AFA33B8F0B0585A4002B0E7D /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA3392E0B058505002B0E7D /* WebCollage */;
+ targetProxy = AFA33B8E0B0585A4002B0E7D /* PBXContainerItemProxy */;
+ };
+ AFA33BCF0B0587B2002B0E7D /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA33BC60B058740002B0E7D /* webcollage-helper */;
+ targetProxy = AFA33BCE0B0587B2002B0E7D /* PBXContainerItemProxy */;
+ };
+ AFA33BDC0B058952002B0E7D /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA33BC60B058740002B0E7D /* webcollage-helper */;
+ targetProxy = AFA33BDB0B058952002B0E7D /* PBXContainerItemProxy */;
+ };
+ AFA33C040B058E3C002B0E7D /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA33C020B058E17002B0E7D /* webcollage-perl */;
+ targetProxy = AFA33C030B058E3C002B0E7D /* PBXContainerItemProxy */;
+ };
+ AFA55947099330B000F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55948099330B000F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA5596E0993317900F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA5596F0993317900F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA559930993322100F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA559940993322100F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA559B60993328000F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA559B70993328000F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA559D00993330600F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA559D10993330600F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55A040993340300F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55A050993340300F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55A21099334A000F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55A22099334A000F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55A7A0993364300F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55A7B0993364300F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55AD009933CEF00F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55AD109933CEF00F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55B0A09933E0500F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55B0B09933E0500F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55B2609933E8D00F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55B2709933E8D00F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55B7A09933F7200F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55B7B09933F7200F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55B9209933FDA00F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55B9309933FDA00F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55BAC099340CE00F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55BAD099340CE00F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55BE50993429100F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55BE60993429100F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55C0F0993431300F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55C100993431300F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55C78099349A600F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55C79099349A600F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55CAA09934BB200F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55CAB09934BB200F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55CCD09934CE400F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55CCE09934CE400F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55D3D0993565300F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55D3E0993565300F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55D630993584B00F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55D640993584B00F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55D80099358C400F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55D81099358C400F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55DC909935D7000F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55DCA09935D7000F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55DF109935E4900F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55DF209935E4900F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55E0E09935EDC00F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55E0F09935EDC00F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55E3009935F8E00F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55E3109935F8E00F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55E4F09935FF900F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55E5009935FF900F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55EC8099360E300F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55EC9099360E300F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55F07099361B700F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55F08099361B700F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55F2B0993622F00F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55F2C0993622F00F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55F430993629000F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55F440993629000F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55F730993643600F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55F740993643600F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55FD409936BFA00F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55FD509936BFA00F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA55FFA09936C6D00F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA55FFB09936C6D00F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA5601509936CC800F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA5601609936CC800F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA5603309936D5100F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA5603409936D5100F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA5604B09936E2100F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA5604C09936E2100F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA5606309936F3800F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA5606409936F3800F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA560AF0993718D00F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA560B00993718D00F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA560FE0993781600F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA560FF0993781600F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA5611E0993791D00F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA56119099378CB00F3E977 /* molecules.h */;
+ targetProxy = AFA5611D0993791D00F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA5615709937C0D00F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA5615809937C0D00F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA5617C09937CF100F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA5617D09937CF100F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA5619E09937D7E00F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA5619F09937D7E00F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA562070993849F00F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA562080993849F00F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA562200993852500F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA562210993852500F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA562C0099392C600F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA562C1099392C600F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA562DB099393C900F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA562DC099393C900F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA562F30993943B00F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA562F40993943B00F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA563140993951000F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA563150993951000F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA56332099395ED00F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA56333099395ED00F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA56352099396C000F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA56353099396C000F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA5637A099397B300F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA5637B099397B300F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA563A5099398BB00F3E977 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA563A6099398BB00F3E977 /* PBXContainerItemProxy */;
+ };
+ AFA6AAF120999950006D2685 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFA6AAF220999950006D2685 /* PBXContainerItemProxy */;
+ };
+ AFA6AB1120999A9A006D2685 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFA6AAF020999950006D2685 /* GlitchPEG */;
+ targetProxy = AFA6AB1020999A9A006D2685 /* PBXContainerItemProxy */;
+ };
+ AFAAE388207D6343007A515C /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFAAE389207D6343007A515C /* PBXContainerItemProxy */;
+ };
+ AFAAE3A5207D6470007A515C /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFAAE387207D6343007A515C /* Maze3D */;
+ targetProxy = AFAAE3A4207D6470007A515C /* PBXContainerItemProxy */;
+ };
+ AFAC36BB202E7FBA001A684C /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFAC36B6202E7F79001A684C /* images_png_h */;
+ targetProxy = AFAC36BA202E7FBA001A684C /* PBXContainerItemProxy */;
+ };
+ AFAC36BD202E80E5001A684C /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFAC36B6202E7F79001A684C /* images_png_h */;
+ targetProxy = AFAC36BC202E80E5001A684C /* PBXContainerItemProxy */;
+ };
+ AFACE8741CC83458008B24CD /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFACE8751CC83458008B24CD /* PBXContainerItemProxy */;
+ };
+ AFACE8911CC8365F008B24CD /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFACE8731CC83458008B24CD /* EnergyStream */;
+ targetProxy = AFACE8901CC8365F008B24CD /* PBXContainerItemProxy */;
+ };
+ AFB581B0102F363300342B11 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD571B50996D9DC00BA26F7 /* Juggle */;
+ targetProxy = AFB581AF102F363300342B11 /* PBXContainerItemProxy */;
+ };
+ AFB591A8178B812C00EA4005 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFB591A9178B812C00EA4005 /* PBXContainerItemProxy */;
+ };
+ AFB591C3178B821E00EA4005 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFB591A7178B812C00EA4005 /* Hexadrop */;
+ targetProxy = AFB591C2178B821E00EA4005 /* PBXContainerItemProxy */;
+ };
+ AFBFE7401786405E00432B21 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFF2867F17860E830050A578 /* QuasiCrystal */;
+ targetProxy = AFBFE73F1786405E00432B21 /* PBXContainerItemProxy */;
+ };
+ AFBFE7421786407000432B21 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF7510FF1782B5B900380EA1 /* Kaleidocycle */;
+ targetProxy = AFBFE7411786407000432B21 /* PBXContainerItemProxy */;
+ };
+ AFBFE74C178642DC00432B21 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFBFE74D178642DC00432B21 /* PBXContainerItemProxy */;
+ };
+ AFBFE7641786438900432B21 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF9D4DEC09B5BB19006E59CF /* Apple2 */;
+ targetProxy = AFBFE7631786438900432B21 /* PBXContainerItemProxy */;
+ };
+ AFBFE76A178647FE00432B21 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFBFE76B178647FE00432B21 /* PBXContainerItemProxy */;
+ };
+ AFBFE7811786482B00432B21 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF7776E409B63ABF00EA3033 /* Phosphor */;
+ targetProxy = AFBFE7801786482B00432B21 /* PBXContainerItemProxy */;
+ };
+ AFBFE785178648E600432B21 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFBFE74B178642DC00432B21 /* Apple2-OSX */;
+ targetProxy = AFBFE784178648E600432B21 /* PBXContainerItemProxy */;
+ };
+ AFBFE787178648F500432B21 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFBFE767178647FE00432B21 /* Phosphor-OSX */;
+ targetProxy = AFBFE786178648F500432B21 /* PBXContainerItemProxy */;
+ };
+ AFC0E8AC1CDC601A008CAFAC /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFC0E8AD1CDC601A008CAFAC /* PBXContainerItemProxy */;
+ };
+ AFC0E8C91CDC6125008CAFAC /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFC0E8AB1CDC601A008CAFAC /* Hydrostat */;
+ targetProxy = AFC0E8C81CDC6125008CAFAC /* PBXContainerItemProxy */;
+ };
+ AFC5CFD72044AA23004CEB5E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFC5CFD82044AA23004CEB5E /* PBXContainerItemProxy */;
+ };
+ AFC5CFF72044AB46004CEB5E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFC5CFD62044AA23004CEB5E /* Crumbler */;
+ targetProxy = AFC5CFF62044AB46004CEB5E /* PBXContainerItemProxy */;
+ };
+ AFCAD5F90992DFE00009617A /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF9771D60989DC4A001F8B92 /* SaverTester */;
+ targetProxy = AFCAD5F80992DFE00009617A /* PBXContainerItemProxy */;
+ };
+ AFCF833C1AF5B515008BB7E1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFCF833D1AF5B515008BB7E1 /* PBXContainerItemProxy */;
+ };
+ AFCF835C1AF5B683008BB7E1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFCF833B1AF5B515008BB7E1 /* SplitFlap */;
+ targetProxy = AFCF835B1AF5B683008BB7E1 /* PBXContainerItemProxy */;
+ };
+ AFD51B1C0F063B4A00471C02 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD51B1D0F063B4A00471C02 /* PBXContainerItemProxy */;
+ };
+ AFD51B350F063B7800471C02 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD51B1B0F063B4A00471C02 /* Photopile */;
+ targetProxy = AFD51B340F063B7800471C02 /* PBXContainerItemProxy */;
+ };
+ AFD56DF20996A03800BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD56DF30996A03800BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD56EAF0996A72600BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD56EB00996A72600BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD56EDB0996A95700BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD56EDC0996A95700BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD56F0C0996AAFA00BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD56F0D0996AAFA00BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD56F240996AB8A00BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD56F250996AB8A00BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD56F500996AEEE00BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD56F510996AEEE00BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD56F6C0996B01600BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD56F6D0996B01600BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD56F8D0996B09400BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD56F8E0996B09400BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD56FA40996B10F00BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD56FA50996B10F00BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD56FBA0996B18F00BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD56FBB0996B18F00BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD56FD00996B20900BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD56FD10996B20900BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD56FF90996B43800BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD56FFA0996B43800BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD570100996B4CC00BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD570110996B4CC00BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD570270996B56D00BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD570280996B56D00BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD570440996B61600BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD570450996B61600BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD5705A0996B6A300BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD5705B0996B6A300BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD570700996B72700BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD570710996B72700BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD570860996B80300BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD570870996B80300BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD5709C0996B88E00BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD5709D0996B88E00BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD570B20996B93000BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD570B30996B93000BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD570CA0996B9F800BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD570CB0996B9F800BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD570EB0996BBBF00BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD570EC0996BBBF00BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD571140996BE9300BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD571150996BE9300BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD5712D0996BF2E00BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD5712E0996BF2E00BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD571440996C01700BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD571450996C01700BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD5715A0996C0CE00BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD5715B0996C0CE00BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD571B60996D9DC00BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD571B70996D9DC00BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD572230996E4A300BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD572240996E4A300BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD5726E0996EE8500BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD5726F0996EE8500BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD572A60996F99600BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD572A70996F99600BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD572C30996FC0F00BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD572C40996FC0F00BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD572FA099701C000BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD572FB099701C000BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD5735E0997411200BA26F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD5735F0997411200BA26F7 /* PBXContainerItemProxy */;
+ };
+ AFD77E5C20C23F8600A3638D /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFD77E5D20C23F8600A3638D /* PBXContainerItemProxy */;
+ };
+ AFD77E7A20C241BE00A3638D /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFD77E5B20C23F8600A3638D /* FilmLeader */;
+ targetProxy = AFD77E7920C241BE00A3638D /* PBXContainerItemProxy */;
+ };
+ AFDA658F178A52B70070D24B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFDA6590178A52B70070D24B /* PBXContainerItemProxy */;
+ };
+ AFDA65AA178A54690070D24B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFDA658E178A52B70070D24B /* Unknown Pleasures */;
+ targetProxy = AFDA65A9178A54690070D24B /* PBXContainerItemProxy */;
+ };
+ AFE2A4570E2E904600ADB298 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFE2A4580E2E904600ADB298 /* PBXContainerItemProxy */;
+ };
+ AFE2A46F0E2E908E00ADB298 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFE2A4560E2E904600ADB298 /* SkyTentacles */;
+ targetProxy = AFE2A46E0E2E908E00ADB298 /* PBXContainerItemProxy */;
+ };
+ AFE30BE90E52B14700CCF4A5 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFE30BEA0E52B14700CCF4A5 /* PBXContainerItemProxy */;
+ };
+ AFE6A1830CDD7B2E002805BF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFE6A1840CDD7B2E002805BF /* PBXContainerItemProxy */;
+ };
+ AFE6A19C0CDD7B7F002805BF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFE6A1820CDD7B2E002805BF /* MoebiusGears */;
+ targetProxy = AFE6A19B0CDD7B7F002805BF /* PBXContainerItemProxy */;
+ };
+ AFE6A41C0CDD7FAA002805BF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFE6A41D0CDD7FAA002805BF /* PBXContainerItemProxy */;
+ };
+ AFE6A4300CDD7FEE002805BF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFE6A41B0CDD7FAA002805BF /* Abstractile */;
+ targetProxy = AFE6A42F0CDD7FEE002805BF /* PBXContainerItemProxy */;
+ };
+ AFEC23CE1CB6EAE100DE138F /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFEC23CF1CB6EAE100DE138F /* PBXContainerItemProxy */;
+ };
+ AFEC23EB1CB6ED0800DE138F /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFEC23CD1CB6EAE100DE138F /* DymaxionMap */;
+ targetProxy = AFEC23EA1CB6ED0800DE138F /* PBXContainerItemProxy */;
+ };
+ AFEE104E1D13406000AAC8F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFEE104F1D13406000AAC8F7 /* PBXContainerItemProxy */;
+ };
+ AFEE106B1D13424C00AAC8F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFEE104D1D13406000AAC8F7 /* CubeTwist */;
+ targetProxy = AFEE106A1D13424C00AAC8F7 /* PBXContainerItemProxy */;
+ };
+ AFEE106D1D15EB0700AAC8F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFEE106E1D15EB0700AAC8F7 /* PBXContainerItemProxy */;
+ };
+ AFEE108A1D15EBF900AAC8F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFEE106C1D15EB0700AAC8F7 /* CubeStack */;
+ targetProxy = AFEE10891D15EBF900AAC8F7 /* PBXContainerItemProxy */;
+ };
+ AFEE108C1D17E20B00AAC8F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFEE108D1D17E20B00AAC8F7 /* PBXContainerItemProxy */;
+ };
+ AFEE10A91D17E32100AAC8F7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFEE108B1D17E20B00AAC8F7 /* Splodesic */;
+ targetProxy = AFEE10A81D17E32100AAC8F7 /* PBXContainerItemProxy */;
+ };
+ AFF2868017860E830050A578 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFF2868117860E830050A578 /* PBXContainerItemProxy */;
+ };
+ AFF3C9E917CCAC440028F240 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFF3C9EA17CCAC440028F240 /* PBXContainerItemProxy */;
+ };
+ AFF3CA0117CCAE210028F240 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFF3C9E817CCAC440028F240 /* Geodesic */;
+ targetProxy = AFF3CA0017CCAE210028F240 /* PBXContainerItemProxy */;
+ };
+ AFF463370C4403E400EE6509 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFF463380C4403E400EE6509 /* PBXContainerItemProxy */;
+ };
+ AFF463530C44062500EE6509 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFF463360C4403E400EE6509 /* CWaves */;
+ targetProxy = AFF463520C44062500EE6509 /* PBXContainerItemProxy */;
+ };
+ AFF463590C440AEF00EE6509 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFF4635A0C440AEF00EE6509 /* PBXContainerItemProxy */;
+ };
+ AFF4636F0C440B3B00EE6509 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFF463580C440AEF00EE6509 /* GLCells */;
+ targetProxy = AFF4636E0C440B3B00EE6509 /* PBXContainerItemProxy */;
+ };
+ AFFAB31619158CE40020F021 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = AFFAB31719158CE40020F021 /* PBXContainerItemProxy */;
+ };
+ AFFAB33519158F1E0020F021 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AFFAB31519158CE40020F021 /* ProjectivePlane */;
+ targetProxy = AFFAB33419158F1E0020F021 /* PBXContainerItemProxy */;
+ };
+ CE04E8CB1B9B61D00085910B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = CE3D01511B76F4C100993C75 /* TestX11 */;
+ targetProxy = CE04E8CA1B9B61D00085910B /* PBXContainerItemProxy */;
+ };
+ CE3D01521B76F4C100993C75 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+ targetProxy = CE3D01531B76F4C100993C75 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 089C165DFE840E0CC02AAC07 /* InfoPlist.strings */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+ AF9772E10989DFC6001F8B92 /* SaverRunner.nib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ AF9772E20989DFC6001F8B92 /* English */,
+ );
+ name = SaverRunner.nib;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ AF0839A009930B6B00277BE9 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF0839A109930B6B00277BE9 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF083A46099311D700277BE9 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF083A47099311D700277BE9 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF0DC7BB0C4C73F600D76972 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF0DC7BC0C4C73F600D76972 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF0DCA540C4CBB0D00D76972 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF0DCA550C4CBB0D00D76972 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF137D420F075C9C004DE3B2 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = Obsolete;
+ };
+ name = Debug;
+ };
+ AF137D430F075C9C004DE3B2 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = Obsolete;
+ };
+ name = Release;
+ };
+ AF1A17710D6D6EE3008AF328 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF1A17720D6D6EE3008AF328 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF1ADA0F18500FA200932759 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.updater";
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)",
+ );
+ INFOPLIST_FILE = "$(SRCROOT)/Updater.plist";
+ "OTHER_CFLAGS[sdk=macosx*]" = "${OBJC_NO_GC_CFLAGS}";
+ PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ AF1ADA1018500FA200932759 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.updater";
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)",
+ );
+ INFOPLIST_FILE = "$(SRCROOT)/Updater.plist";
+ "OTHER_CFLAGS[sdk=macosx*]" = "${OBJC_NO_GC_CFLAGS}";
+ PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+ AF1B0FBA1D7AB4740011DBE4 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ AF1B0FBB1D7AB4740011DBE4 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ AF2107841FD23BDD00B61EA9 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ AF2107851FD23BDD00B61EA9 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ AF32D9F20F3AD0B40080F535 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF32D9F30F3AD0B40080F535 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF3581D31431D47B00E09C51 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF3581D41431D47B00E09C51 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF358214143330F900E09C51 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF358215143330F900E09C51 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF35E89E0E63823600691F2F /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF35E89F0E63823600691F2F /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF39382D1D0FBD6A00205406 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ AF39382E1D0FBD6A00205406 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ AF39E294198A11F60064A58D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = WindupRobot;
+ };
+ name = Debug;
+ };
+ AF39E295198A11F60064A58D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = WindupRobot;
+ };
+ name = Release;
+ };
+ AF3C71570D624BF50030CC0D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF3C71580D624BF50030CC0D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF3EC98B2035154C00180A35 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ AF3EC98C2035154C00180A35 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ AF41E965201D49DB0098E253 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ AF41E966201D49DB0098E253 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ AF46E9E21CBBA2B300240FBC /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ AF46E9E31CBBA2B300240FBC /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ AF476FC4099D154F001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF476FC5099D154F001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF476FE9099D1686001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF476FEA099D1686001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF47705A099D4385001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF47705B099D4385001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF477177099D4786001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF477178099D4786001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF47718D099D4803001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF47718E099D4803001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF4771B5099D4949001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF4771B6099D4949001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF4771E9099D4D9A001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF4771EA099D4D9A001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF477200099D4E63001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF477201099D4E63001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF477216099D4EE8001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF477217099D4EE8001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF47722C099D4F67001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF47722D099D4F67001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF477261099D5717001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF477262099D5717001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF477279099D57B9001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF47727A099D57B9001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF477291099D5926001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF477292099D5926001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF477390099D65A1001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF477391099D65A1001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF4773A8099D6648001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF4773A9099D6648001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF4773CF099D67B9001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF4773D0099D67B9001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF477410099D69E7001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF477411099D69E7001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF477435099D7C70001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF477436099D7C70001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF477450099D7D33001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF477451099D7D33001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF477491099D89E4001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF477492099D89E4001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF4774A7099D8A74001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF4774A8099D8A74001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF4774C2099D8B5F001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF4774C3099D8B5F001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF4774DC099D8BFF001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF4774DD099D8BFF001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF47756B099D9A1A001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF47756C099D9A1A001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF477591099D9C28001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF477592099D9C28001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF4775AD099D9CF7001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF4775AE099D9CF7001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF4775E6099D9F69001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF4775E7099D9F69001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF477600099DA030001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF477601099DA030001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF477621099DA26C001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF477622099DA26C001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF477652099DA6D0001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF477653099DA6D0001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF477668099DA78E001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF477669099DA78E001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF47767E099DA849001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF47767F099DA849001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF47769D099DAA6F001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF47769E099DAA6F001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF4776B8099DABDD001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF4776B9099DABDD001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF4776CE099DAC8A001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF4776CF099DAC8A001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF4776E9099DADDF001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF4776EA099DADDF001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF4776FF099DAE7A001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF477700099DAE7A001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF47771B099DAF9F001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF47771C099DAF9F001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF477731099DB044001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF477732099DB044001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF477760099DB61E001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF477761099DB61E001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF477782099DB965001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF477783099DB965001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF47779E099DBA90001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF47779F099DBA90001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF4777DF099DC183001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF4777E0099DC183001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF4778B9099DDB79001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF4778BA099DDB79001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF4778D5099DDCAE001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF4778D6099DDCAE001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF4778F6099DDDC8001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF4778F7099DDDC8001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF477917099DE379001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF477918099DE379001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF477938099DE4C7001F091E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF477939099DE4C7001F091E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF4808C3098C3B8B00FB32B8 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ INSTALL_PATH = /usr/local/lib;
+ PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER}";
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = "macosx iphonesimulator iphoneos";
+ VALID_ARCHS = "i386 x86_64 armv6 armv7 armv7s arm64";
+ };
+ name = Debug;
+ };
+ AF4808C4098C3B8B00FB32B8 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ INSTALL_PATH = /usr/local/lib;
+ PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER}";
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = "macosx iphonesimulator iphoneos";
+ VALID_ARCHS = "i386 x86_64 armv6 armv7 armv7s arm64";
+ };
+ name = Release;
+ };
+ AF480ABB098C66E300FB32B8 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "All Savers (XScreenSaver)";
+ };
+ name = Debug;
+ };
+ AF480ABC098C66E300FB32B8 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "All Savers (XScreenSaver)";
+ };
+ name = Release;
+ };
+ AF480C56098E301400FB32B8 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF480C57098E301400FB32B8 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF480D65098EED6E00FB32B8 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "All Savers (XLockmore)";
+ };
+ name = Debug;
+ };
+ AF480D66098EED6E00FB32B8 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "All Savers (XLockmore)";
+ };
+ name = Release;
+ };
+ AF480D68098EED6E00FB32B8 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "All Savers (OpenGL)";
+ };
+ name = Debug;
+ };
+ AF480D69098EED6E00FB32B8 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "All Savers (OpenGL)";
+ };
+ name = Release;
+ };
+ AF480D6B098EED6E00FB32B8 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "All Savers";
+ };
+ name = Debug;
+ };
+ AF480D6C098EED6E00FB32B8 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "All Savers";
+ };
+ name = Release;
+ };
+ AF480D7F098EEDDE00FB32B8 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF480D80098EEDDE00FB32B8 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF4810F909909FBA00FB32B8 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF4810FA09909FBA00FB32B8 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF4812620990CE2700FB32B8 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF4812630990CE2700FB32B8 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF4812C40990D3D900FB32B8 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF4812C50990D3D900FB32B8 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF48DF010A0C25E000F94CF9 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF48DF020A0C25E000F94CF9 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF4A345B102A593600A81B2A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF4A345C102A593600A81B2A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF4FD6F80CE7A486005EE58E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF4FD6F90CE7A486005EE58E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF4FF4950D52CA0800666F98 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = m6502.h;
+ };
+ name = Debug;
+ };
+ AF4FF4960D52CA0800666F98 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = m6502.h;
+ };
+ name = Release;
+ };
+ AF4FF4CC0D52CBDE00666F98 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF4FF4CD0D52CBDE00666F98 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF5C9B0B1A0CCE6E00B0147A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF5C9B0C1A0CCE6E00B0147A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF5ECEBE2116B1A400069433 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ AF5ECEBF2116B1A400069433 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ AF633C141EE0BA6F00AB33BD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ AF633C151EE0BA6F00AB33BD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ AF63A8041AB4EDDB00593C75 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = RomanBoy;
+ };
+ name = Debug;
+ };
+ AF63A8051AB4EDDB00593C75 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = RomanBoy;
+ };
+ name = Release;
+ };
+ AF63F44C1C3465BE0033E133 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+ BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.apple2";
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COMBINE_HIDPI_IMAGES = NO;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "USE_IPHONE=1",
+ "APPLE2_ONLY=1",
+ "$(inherited)",
+ );
+ "GCC_WARN_64_TO_32_BIT_CONVERSION[arch=*64]" = NO;
+ INFOPLIST_FILE = iSaverRunner.plist;
+ INSTALL_PATH = "$(HOME)/Applications";
+ PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
+ PRODUCT_NAME = Apple2;
+ PROVISIONING_PROFILE = "";
+ SDKROOT = iphoneos;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ AF63F44D1C3465BE0033E133 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+ BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.apple2";
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COMBINE_HIDPI_IMAGES = NO;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "USE_IPHONE=1",
+ "APPLE2_ONLY=1",
+ "$(inherited)",
+ );
+ "GCC_WARN_64_TO_32_BIT_CONVERSION[arch=*64]" = NO;
+ INFOPLIST_FILE = iSaverRunner.plist;
+ INSTALL_PATH = "$(HOME)/Applications";
+ PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
+ PRODUCT_NAME = Apple2;
+ PROVISIONING_PROFILE = "";
+ SDKROOT = iphoneos;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+ AF63F4721C34682A0033E133 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+ BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.phosphor";
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COMBINE_HIDPI_IMAGES = NO;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "USE_IPHONE=1",
+ "PHOSPHOR_ONLY=1",
+ "$(inherited)",
+ );
+ "GCC_WARN_64_TO_32_BIT_CONVERSION[arch=*64]" = NO;
+ INFOPLIST_FILE = iSaverRunner.plist;
+ INSTALL_PATH = "$(HOME)/Applications";
+ PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
+ PRODUCT_NAME = Phosphor;
+ PROVISIONING_PROFILE = "";
+ SDKROOT = iphoneos;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ AF63F4731C34682A0033E133 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+ BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.phosphor";
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COMBINE_HIDPI_IMAGES = NO;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "USE_IPHONE=1",
+ "PHOSPHOR_ONLY=1",
+ "$(inherited)",
+ );
+ "GCC_WARN_64_TO_32_BIT_CONVERSION[arch=*64]" = NO;
+ INFOPLIST_FILE = iSaverRunner.plist;
+ INSTALL_PATH = "$(HOME)/Applications";
+ PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
+ PRODUCT_NAME = Phosphor;
+ PROVISIONING_PROFILE = "";
+ SDKROOT = iphoneos;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+ AF63F4981C3469FC0033E133 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+ BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.testX11";
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COMBINE_HIDPI_IMAGES = NO;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "USE_IPHONE=1",
+ "TESTX11_ONLY=1",
+ "$(inherited)",
+ );
+ "GCC_WARN_64_TO_32_BIT_CONVERSION[arch=*64]" = NO;
+ INFOPLIST_FILE = iSaverRunner.plist;
+ INSTALL_PATH = "$(HOME)/Applications";
+ PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
+ PRODUCT_NAME = TestX11;
+ PROVISIONING_PROFILE = "";
+ SDKROOT = iphoneos;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ AF63F4991C3469FC0033E133 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+ BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.testX11";
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COMBINE_HIDPI_IMAGES = NO;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "USE_IPHONE=1",
+ "TESTX11_ONLY=1",
+ "$(inherited)",
+ );
+ "GCC_WARN_64_TO_32_BIT_CONVERSION[arch=*64]" = NO;
+ INFOPLIST_FILE = iSaverRunner.plist;
+ INSTALL_PATH = "$(HOME)/Applications";
+ PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
+ PRODUCT_NAME = TestX11;
+ PROVISIONING_PROFILE = "";
+ SDKROOT = iphoneos;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+ AF642403099FF9C2000F4CD4 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF642404099FF9C2000F4CD4 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF6425DA09A18855000F4CD4 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF6425DB09A18855000F4CD4 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF6425FA09A189EC000F4CD4 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF6425FB09A189EC000F4CD4 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF64261D09A18D6C000F4CD4 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF64261E09A18D6C000F4CD4 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF64263A09A18F54000F4CD4 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF64263B09A18F54000F4CD4 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF64265D09A19229000F4CD4 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF64265E09A19229000F4CD4 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF64268909A194B0000F4CD4 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF64268A09A194B0000F4CD4 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF64277F09A1D37A000F4CD4 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF64278009A1D37A000F4CD4 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF6427B609A2DE36000F4CD4 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF6427B709A2DE36000F4CD4 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF68A49019196CF800D41CD1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = Tessellimage;
+ };
+ name = Debug;
+ };
+ AF68A49119196CF800D41CD1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = Tessellimage;
+ };
+ name = Release;
+ };
+ AF73FF341A09877F00E485E9 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = BinaryRing;
+ };
+ name = Debug;
+ };
+ AF73FF351A09877F00E485E9 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = BinaryRing;
+ };
+ name = Release;
+ };
+ AF7511101782B5B900380EA1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = Kaleidocycle;
+ };
+ name = Debug;
+ };
+ AF7511111782B5B900380EA1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = Kaleidocycle;
+ };
+ name = Release;
+ };
+ AF7776F409B63ABF00EA3033 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF7776F509B63ABF00EA3033 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF77772809B6416100EA3033 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF77772909B6416100EA3033 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF77774F09B6446500EA3033 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF77775009B6446500EA3033 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF77778609B6497800EA3033 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF77778709B6497800EA3033 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF7777A009B64A5200EA3033 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF7777A109B64A5200EA3033 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF7777BA09B64B2600EA3033 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF7777BB09B64B2600EA3033 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF7777E209B64C6B00EA3033 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF7777E309B64C6B00EA3033 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF7777FC09B64E3100EA3033 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF7777FD09B64E3100EA3033 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF77782309B6504400EA3033 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF77782409B6504400EA3033 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF77785609B6528100EA3033 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF77785709B6528100EA3033 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF77787209B6536000EA3033 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF77787309B6536000EA3033 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF77788D09B6563500EA3033 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ "OTHER_CFLAGS[sdk=macosx*]" = (
+ "$(OBJC_GC_CFLAGS)",
+ "-DDEBUG",
+ );
+ };
+ name = Debug;
+ };
+ AF77788E09B6563500EA3033 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF7778B309B659C800EA3033 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF7778B409B659C800EA3033 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF78D187142DD8F3002AAF77 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF78D188142DD8F3002AAF77 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF794F72099748450059A8B0 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF794F73099748450059A8B0 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF794F9C09974A320059A8B0 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF794F9D09974A320059A8B0 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF794FDB09974FA60059A8B0 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF794FDC09974FA60059A8B0 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF7ACFD219FF0A9200BD752B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = GeodesicGears;
+ };
+ name = Debug;
+ };
+ AF7ACFD319FF0A9200BD752B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = GeodesicGears;
+ };
+ name = Release;
+ };
+ AF91898D158FC00A002B5D1E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+ BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}";
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COMBINE_HIDPI_IMAGES = NO;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "USE_IPHONE=1",
+ "$(inherited)",
+ );
+ "GCC_WARN_64_TO_32_BIT_CONVERSION[arch=*64]" = NO;
+ INFOPLIST_FILE = iSaverRunner.plist;
+ INSTALL_PATH = "$(HOME)/Applications";
+ PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER}";
+ PRODUCT_NAME = XScreenSaver;
+ PROVISIONING_PROFILE = "";
+ SDKROOT = iphoneos;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ AF91898E158FC00A002B5D1E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+ BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}";
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COMBINE_HIDPI_IMAGES = NO;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "USE_IPHONE=1",
+ "$(inherited)",
+ );
+ "GCC_WARN_64_TO_32_BIT_CONVERSION[arch=*64]" = NO;
+ INFOPLIST_FILE = iSaverRunner.plist;
+ INSTALL_PATH = "$(HOME)/Applications";
+ PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER}";
+ PRODUCT_NAME = XScreenSaver;
+ PROVISIONING_PROFILE = "";
+ SDKROOT = iphoneos;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+ AF97573B099C317000B05160 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF97573C099C317000B05160 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF975783099C374A00B05160 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF975784099C374A00B05160 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF9757D0099C3E6300B05160 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF9757D1099C3E6300B05160 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF975816099C41D500B05160 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF975817099C41D500B05160 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF975873099C475900B05160 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF975874099C475900B05160 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF975A44099C681F00B05160 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF975A45099C681F00B05160 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF975A7A099C6AB200B05160 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF975A7B099C6AB200B05160 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF975A94099C6BC300B05160 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF975A95099C6BC300B05160 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF975AE5099C6EB100B05160 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF975AE6099C6EB100B05160 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF975B0A099C6FE400B05160 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF975B0B099C6FE400B05160 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF975C20099C8C1500B05160 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF975C21099C8C1500B05160 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF975C4C099C8DCF00B05160 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF975C4D099C8DCF00B05160 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF975C6C099C8F3F00B05160 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF975C6D099C8F3F00B05160 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF975D61099CA0F000B05160 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF975D62099CA0F000B05160 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF976FBF0989CAA4001F8B92 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF976FC00989CAA4001F8B92 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF97703E0989D1E6001F8B92 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF97703F0989D1E6001F8B92 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF97707B0989D2F6001F8B92 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF97707C0989D2F6001F8B92 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF9771DB0989DC4B001F8B92 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ INFOPLIST_FILE = SaverRunner.plist;
+ INSTALL_PATH = "$(HOME)/Applications";
+ PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER}";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ AF9771DC0989DC4B001F8B92 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ INFOPLIST_FILE = SaverRunner.plist;
+ INSTALL_PATH = "$(HOME)/Applications";
+ PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER}";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+ AF998EEC0A083DB30051049D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AF998EED0A083DB30051049D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AF9D467409B5109C006E59CF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF9D467509B5109C006E59CF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF9D475209B5300A006E59CF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF9D475309B5300A006E59CF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF9D476D09B53166006E59CF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF9D476E09B53166006E59CF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF9D48E909B53322006E59CF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF9D48EA09B53322006E59CF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF9D490209B535DA006E59CF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF9D490309B535DA006E59CF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF9D493909B53CBA006E59CF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF9D493A09B53CBA006E59CF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF9D496209B53FC9006E59CF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF9D496309B53FC9006E59CF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF9D497A09B5411D006E59CF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF9D497B09B5411D006E59CF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF9D49A509B544C2006E59CF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF9D49A609B544C2006E59CF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF9D4C7709B59F27006E59CF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF9D4C7809B59F27006E59CF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF9D4CF509B5AA8E006E59CF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF9D4CF609B5AA8E006E59CF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF9D4D8D09B5B2DC006E59CF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF9D4D8E09B5B2DC006E59CF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF9D4DBE09B5B71E006E59CF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF9D4DBF09B5B71E006E59CF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF9D4DFC09B5BB19006E59CF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AF9D4DFD09B5BB19006E59CF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AF9E7EC6190F4C1C00A8B01F /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER}";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SKIP_INSTALL = YES;
+ };
+ name = Debug;
+ };
+ AF9E7EC7190F4C1C00A8B01F /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER}";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SKIP_INSTALL = YES;
+ };
+ name = Release;
+ };
+ AFA2119F1CD59DAF00C0D2A1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ AFA211A01CD59DAF00C0D2A1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ AFA3393E0B058505002B0E7D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ };
+ name = Debug;
+ };
+ AFA3393F0B058505002B0E7D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ };
+ name = Release;
+ };
+ AFA33BCC0B058754002B0E7D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h";
+ INSTALL_PATH = "$(HOME)/bin";
+ "OTHER_CFLAGS[sdk=macosx*]" = "${OBJC_NO_GC_CFLAGS}";
+ OTHER_LDFLAGS = (
+ "-framework",
+ Cocoa,
+ );
+ PRODUCT_NAME = "webcollage-helper";
+ };
+ name = Debug;
+ };
+ AFA33BCD0B058754002B0E7D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h";
+ INSTALL_PATH = "$(HOME)/bin";
+ "OTHER_CFLAGS[sdk=macosx*]" = "${OBJC_NO_GC_CFLAGS}";
+ OTHER_LDFLAGS = (
+ "-framework",
+ Cocoa,
+ );
+ PRODUCT_NAME = "webcollage-helper";
+ };
+ name = Release;
+ };
+ AFA33C080B058E67002B0E7D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = webcollage;
+ };
+ name = Debug;
+ };
+ AFA33C090B058E67002B0E7D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = webcollage;
+ };
+ name = Release;
+ };
+ AFA55958099330B000F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55959099330B000F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA5597D0993317900F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA5597E0993317900F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA559A20993322100F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA559A30993322100F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA559C50993328000F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA559C60993328000F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA559DF0993330600F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA559E00993330600F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55A130993340300F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55A140993340300F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55A30099334A000F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55A31099334A000F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55A890993364300F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55A8A0993364300F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55ADF09933CEF00F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55AE009933CEF00F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55B1C09933E0500F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55B1D09933E0500F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55B3509933E8D00F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55B3609933E8D00F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55B8909933F7200F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55B8A09933F7200F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55BA109933FDA00F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55BA209933FDA00F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55BBB099340CE00F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55BBC099340CE00F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55BF40993429100F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55BF50993429100F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55C1E0993431300F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55C1F0993431300F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55C87099349A600F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55C88099349A600F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55CB909934BB200F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55CBA09934BB200F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55CDC09934CE400F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55CDD09934CE400F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55D4C0993565300F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55D4D0993565300F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55D720993584B00F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55D730993584B00F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55D8F099358C400F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55D90099358C400F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55DD809935D7000F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55DD909935D7000F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55E0109935E4900F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55E0209935E4900F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55E1D09935EDC00F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55E1E09935EDC00F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55E4009935F8E00F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55E4109935F8E00F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55E5E09935FF900F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55E5F09935FF900F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55EE1099360E300F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55EE2099360E300F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55F1C099361B700F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55F1D099361B700F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55F3A0993622F00F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55F3B0993622F00F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55F520993629000F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55F530993629000F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55F820993643600F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55F830993643600F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA55FE309936BFA00F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA55FE409936BFA00F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA5600909936C6D00F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA5600A09936C6D00F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA5602409936CC800F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA5602509936CC800F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA5604209936D5100F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA5604309936D5100F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA5605A09936E2100F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA5605B09936E2100F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA5607209936F3800F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA5607309936F3800F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA560BE0993718D00F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA560BF0993718D00F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA5610D0993781600F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA5610E0993781600F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA5611B099378EA00F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = molecules.h;
+ };
+ name = Debug;
+ };
+ AFA5611C099378EA00F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = molecules.h;
+ };
+ name = Release;
+ };
+ AFA5616809937C0D00F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA5616909937C0D00F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA5618B09937CF100F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA5618C09937CF100F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA561AD09937D7E00F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA561AE09937D7E00F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA562170993849F00F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA562180993849F00F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA5622F0993852500F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA562300993852500F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA562CF099392C600F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA562D0099392C600F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA562EA099393C900F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA562EB099393C900F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA563020993943B00F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA563030993943B00F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA563240993951000F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA563250993951000F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA56341099395ED00F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA56342099395ED00F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA56361099396C000F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA56362099396C000F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA56389099397B300F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA5638A099397B300F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA563B4099398BB00F3E977 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFA563B5099398BB00F3E977 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFA6AB0320999950006D2685 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ AFA6AB0420999950006D2685 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ AFAAE39A207D6343007A515C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ AFAAE39B207D6343007A515C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ AFAC36B8202E7F79001A684C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ AFAC36B9202E7F79001A684C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ AFACE8861CC83458008B24CD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ AFACE8871CC83458008B24CD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ AFB591B8178B812C00EA4005 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = Hexadrop;
+ };
+ name = Debug;
+ };
+ AFB591B9178B812C00EA4005 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = Hexadrop;
+ };
+ name = Release;
+ };
+ AFBFE75C178642DC00432B21 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ INFOPLIST_FILE = SaverRunner.plist;
+ INSTALL_PATH = "$(HOME)/Applications";
+ "OTHER_CFLAGS[sdk=macosx*]" = "";
+ PRODUCT_NAME = Apple2;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ AFBFE75D178642DC00432B21 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ INFOPLIST_FILE = SaverRunner.plist;
+ INSTALL_PATH = "$(HOME)/Applications";
+ "OTHER_CFLAGS[sdk=macosx*]" = "";
+ PRODUCT_NAME = Apple2;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+ AFBFE77C178647FE00432B21 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ INFOPLIST_FILE = SaverRunner.plist;
+ INSTALL_PATH = "$(HOME)/Applications";
+ "OTHER_CFLAGS[sdk=macosx*]" = "";
+ PRODUCT_NAME = Phosphor;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ AFBFE77D178647FE00432B21 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ INFOPLIST_FILE = SaverRunner.plist;
+ INSTALL_PATH = "$(HOME)/Applications";
+ "OTHER_CFLAGS[sdk=macosx*]" = "";
+ PRODUCT_NAME = Phosphor;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+ AFC0E8BE1CDC601A008CAFAC /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ AFC0E8BF1CDC601A008CAFAC /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ AFC5CFE92044AA23004CEB5E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ AFC5CFEA2044AA23004CEB5E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ AFCF834E1AF5B515008BB7E1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = SplitFlap;
+ };
+ name = Debug;
+ };
+ AFCF834F1AF5B515008BB7E1 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = SplitFlap;
+ };
+ name = Release;
+ };
+ AFD51B2E0F063B4A00471C02 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFD51B2F0F063B4A00471C02 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFD56E020996A03800BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFD56E030996A03800BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFD56EBC0996A72600BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD56EBD0996A72600BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD56EE80996A95700BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD56EE90996A95700BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD56F190996AAFA00BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD56F1A0996AAFA00BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD56F310996AB8A00BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD56F320996AB8A00BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD56F5D0996AEEE00BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD56F5E0996AEEE00BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD56F790996B01600BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD56F7A0996B01600BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD56F9A0996B09400BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD56F9B0996B09400BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD56FB10996B10F00BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD56FB20996B10F00BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD56FC70996B18F00BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD56FC80996B18F00BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD56FDD0996B20900BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD56FDE0996B20900BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD570060996B43800BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD570070996B43800BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD5701D0996B4CC00BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD5701E0996B4CC00BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD570340996B56D00BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD570350996B56D00BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD570510996B61600BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD570520996B61600BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD570670996B6A300BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD570680996B6A300BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD5707D0996B72700BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD5707E0996B72700BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD570930996B80300BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD570940996B80300BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD570A90996B88E00BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD570AA0996B88E00BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD570BF0996B93000BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD570C00996B93000BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD570D70996B9F800BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD570D80996B9F800BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD570F80996BBBF00BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD570F90996BBBF00BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD571210996BE9300BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD571220996BE9300BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD5713A0996BF2E00BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD5713B0996BF2E00BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD571510996C01700BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD571520996C01700BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD571670996C0CE00BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD571680996C0CE00BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD571C30996D9DC00BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD571C40996D9DC00BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD572300996E4A300BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD572310996E4A300BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD5727B0996EE8500BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD5727C0996EE8500BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD572B30996F99600BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD572B40996F99600BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD572D00996FC0F00BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD572D10996FC0F00BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD57307099701C000BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD57308099701C000BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD5736B0997411200BA26F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFD5736C0997411200BA26F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFD77E6E20C23F8600A3638D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ AFD77E6F20C23F8600A3638D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ AFDA659F178A52B70070D24B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = UnknownPleasures;
+ };
+ name = Debug;
+ };
+ AFDA65A0178A52B70070D24B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = UnknownPleasures;
+ };
+ name = Release;
+ };
+ AFE2A4680E2E904600ADB298 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFE2A4690E2E904600ADB298 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFE30BFA0E52B14700CCF4A5 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFE30BFB0E52B14700CCF4A5 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFE6A1950CDD7B2E002805BF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFE6A1960CDD7B2E002805BF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFE6A42B0CDD7FAA002805BF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFE6A42C0CDD7FAA002805BF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFEC23E01CB6EAE100DE138F /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ AFEC23E11CB6EAE100DE138F /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ AFEE10601D13406000AAC8F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ AFEE10611D13406000AAC8F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ AFEE107F1D15EB0800AAC8F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ AFEE10801D15EB0800AAC8F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ AFEE109E1D17E20B00AAC8F7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ AFEE109F1D17E20B00AAC8F7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ AFF2869017860E830050A578 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = QuasiCrystal;
+ };
+ name = Debug;
+ };
+ AFF2869117860E830050A578 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = QuasiCrystal;
+ };
+ name = Release;
+ };
+ AFF3C9F917CCAC440028F240 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = Geodesic;
+ };
+ name = Debug;
+ };
+ AFF3C9FA17CCAC440028F240 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ PRODUCT_NAME = Geodesic;
+ };
+ name = Release;
+ };
+ AFF463450C4403E400EE6509 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ AFF463460C4403E400EE6509 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+ AFF4636A0C440AEF00EE6509 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFF4636B0C440AEF00EE6509 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ AFFAB32719158CE40020F021 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Debug;
+ };
+ AFFAB32819158CE40020F021 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "USE_GL=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ };
+ name = Release;
+ };
+ C01FCF4F08A954540054247B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = AF94E7411A16E93600289B93 /* xscreensaver.xcconfig */;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD)";
+ BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.${PRODUCT_NAME:rfc1034identifier}";
+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = NO;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = NO;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=iphonesimulator*]" = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application";
+ COMBINE_HIDPI_IMAGES = YES;
+ DEVELOPMENT_TEAM = 4627ATJELP;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = xscreensaver_Prefix.pch;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "HAVE_COCOA=1",
+ "GETTIMEOFDAY_TWO_ARGS=1",
+ "HAVE_UNISTD_H=1",
+ "STANDALONE=1",
+ "HAVE_GL=1",
+ "HAVE_GLBINDTEXTURE=1",
+ "HAVE_UNAME=1",
+ "HAVE_ICMP=1",
+ "HAVE_GETIFADDRS=1",
+ "HAVE_FORKPTY=1",
+ "HAVE_UTIL_H=1",
+ "HAVE_PTHREAD=1",
+ "HAVE_GETADDRINFO=1",
+ "HAVE_STRUCT_SOCKADDR_SA_LEN=1",
+ "HAVE_XUTF8DRAWSTRING=1",
+ "HAVE_INTTYPES_H=1",
+ "JWXYZ_QUARTZ=1",
+ "HAVE_JWXYZ=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS)",
+ );
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "CLASS=XScreenSaver${EXECUTABLE_NAME}View",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = NO;
+ GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_CHECK_SWITCH_STATEMENTS = YES;
+ GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
+ GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;
+ GCC_WARN_MISSING_PARENTHESES = YES;
+ GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_LABEL = YES;
+ GCC_WARN_UNUSED_VALUE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = (
+ "$(HEADER_SEARCH_PATHS)",
+ "$(SRCROOT)/..",
+ "$(SRCROOT)/../utils",
+ "$(SRCROOT)/../jwxyz",
+ "$(SRCROOT)/../hacks",
+ );
+ INFOPLIST_FILE = XScreenSaver.plist;
+ INSTALL_PATH = "$(HOME)/Library/Screen Savers";
+ IPHONEOS_DEPLOYMENT_TARGET = 9.3;
+ LIBRARY_SEARCH_PATHS = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)";
+ ONLY_ACTIVE_ARCH = YES;
+ OTHER_CFLAGS = "";
+ "OTHER_CFLAGS[sdk=macosx*]" = "$(OBJC_GC_CFLAGS)";
+ "OTHER_LDFLAGS[sdk=macosx*]" = "-headerpad_max_install_names";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE = "";
+ SDKROOT = macosx;
+ "SDKROOT[arch=arm*]" = iphoneos;
+ SYMROOT = "$(SRCROOT)/build";
+ TARGETED_DEVICE_FAMILY = "1,2";
+ USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR) $(USER_HEADER_SEARCH_PATHS)";
+ WARNING_CFLAGS = "-Wimplicit";
+ WRAPPER_EXTENSION = saver;
+ };
+ name = Debug;
+ };
+ C01FCF5008A954540054247B /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = AF94E7411A16E93600289B93 /* xscreensaver.xcconfig */;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD)";
+ BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.${PRODUCT_NAME:rfc1034identifier}";
+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = NO;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = NO;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Jamie Zawinski (4627ATJELP)";
+ "CODE_SIGN_IDENTITY[sdk=iphonesimulator*]" = "iPhone Distribution: Jamie Zawinski (4627ATJELP)";
+ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application: Jamie Zawinski (4627ATJELP)";
+ COMBINE_HIDPI_IMAGES = YES;
+ DEVELOPMENT_TEAM = 4627ATJELP;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = xscreensaver_Prefix.pch;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "HAVE_COCOA=1",
+ "GETTIMEOFDAY_TWO_ARGS=1",
+ "HAVE_UNISTD_H=1",
+ "STANDALONE=1",
+ "HAVE_GL=1",
+ "HAVE_GLBINDTEXTURE=1",
+ "HAVE_UNAME=1",
+ "HAVE_ICMP=1",
+ "HAVE_GETIFADDRS=1",
+ "HAVE_FORKPTY=1",
+ "HAVE_UTIL_H=1",
+ "HAVE_PTHREAD=1",
+ "HAVE_GETADDRINFO=1",
+ "HAVE_STRUCT_SOCKADDR_SA_LEN=1",
+ "HAVE_XUTF8DRAWSTRING=1",
+ "HAVE_INTTYPES_H=1",
+ "JWXYZ_QUARTZ=1",
+ "HAVE_JWXYZ=1",
+ "$(GCC_PREPROCESSOR_DEFINITIONS)",
+ );
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+ "CLASS=XScreenSaver${EXECUTABLE_NAME}View",
+ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = NO;
+ GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_CHECK_SWITCH_STATEMENTS = YES;
+ GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
+ GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;
+ GCC_WARN_MISSING_PARENTHESES = YES;
+ GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_LABEL = YES;
+ GCC_WARN_UNUSED_VALUE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = (
+ "$(HEADER_SEARCH_PATHS)",
+ "$(SRCROOT)/..",
+ "$(SRCROOT)/../utils",
+ "$(SRCROOT)/../jwxyz",
+ "$(SRCROOT)/../hacks",
+ );
+ INFOPLIST_FILE = XScreenSaver.plist;
+ INSTALL_PATH = "$(HOME)/Library/Screen Savers";
+ IPHONEOS_DEPLOYMENT_TARGET = 9.3;
+ LIBRARY_SEARCH_PATHS = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)";
+ LLVM_LTO = NO;
+ "LLVM_LTO[sdk=macosx*]" = NO;
+ OTHER_CFLAGS = "";
+ "OTHER_CFLAGS[sdk=macosx*]" = "$(OBJC_GC_CFLAGS)";
+ "OTHER_LDFLAGS[sdk=macosx*]" = "-headerpad_max_install_names";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE = "";
+ SDKROOT = macosx;
+ "SDKROOT[arch=arm*]" = iphoneos;
+ SYMROOT = "$(SRCROOT)/build";
+ TARGETED_DEVICE_FAMILY = "1,2";
+ USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR) $(USER_HEADER_SEARCH_PATHS)";
+ VALIDATE_PRODUCT = YES;
+ WARNING_CFLAGS = "-Wimplicit";
+ WRAPPER_EXTENSION = saver;
+ };
+ name = Release;
+ };
+ CE3D01641B76F4C100993C75 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Debug;
+ };
+ CE3D01651B76F4C100993C75 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ AF08399F09930B6B00277BE9 /* Build configuration list for PBXNativeTarget "Atlantis" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF0839A009930B6B00277BE9 /* Debug */,
+ AF0839A109930B6B00277BE9 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF083A45099311D700277BE9 /* Build configuration list for PBXNativeTarget "Atunnel" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF083A46099311D700277BE9 /* Debug */,
+ AF083A47099311D700277BE9 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF0DC7BA0C4C73F600D76972 /* Build configuration list for PBXNativeTarget "m6502" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF0DC7BB0C4C73F600D76972 /* Debug */,
+ AF0DC7BC0C4C73F600D76972 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF0DCA530C4CBB0D00D76972 /* Build configuration list for PBXNativeTarget "Voronoi" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF0DCA540C4CBB0D00D76972 /* Debug */,
+ AF0DCA550C4CBB0D00D76972 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF137D450F075CA4004DE3B2 /* Build configuration list for PBXAggregateTarget "Obsolete" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF137D420F075C9C004DE3B2 /* Debug */,
+ AF137D430F075C9C004DE3B2 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF1A17700D6D6EE3008AF328 /* Build configuration list for PBXNativeTarget "LCDscrub" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF1A17710D6D6EE3008AF328 /* Debug */,
+ AF1A17720D6D6EE3008AF328 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF1ADA0E18500FA200932759 /* Build configuration list for PBXNativeTarget "XScreenSaverUpdater" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF1ADA0F18500FA200932759 /* Debug */,
+ AF1ADA1018500FA200932759 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF1B0FB91D7AB4740011DBE4 /* Build configuration list for PBXNativeTarget "Hexstrut" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF1B0FBA1D7AB4740011DBE4 /* Debug */,
+ AF1B0FBB1D7AB4740011DBE4 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF2107831FD23BDD00B61EA9 /* Build configuration list for PBXNativeTarget "Esper" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF2107841FD23BDD00B61EA9 /* Debug */,
+ AF2107851FD23BDD00B61EA9 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF32D9F10F3AD0B40080F535 /* Build configuration list for PBXNativeTarget "RubikBlocks" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF32D9F20F3AD0B40080F535 /* Debug */,
+ AF32D9F30F3AD0B40080F535 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF3581D21431D47B00E09C51 /* Build configuration list for PBXNativeTarget "CompanionCube" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF3581D31431D47B00E09C51 /* Debug */,
+ AF3581D41431D47B00E09C51 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF358213143330F900E09C51 /* Build configuration list for PBXNativeTarget "TronBit" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF358214143330F900E09C51 /* Debug */,
+ AF358215143330F900E09C51 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF35E89D0E63823600691F2F /* Build configuration list for PBXNativeTarget "Jigsaw" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF35E89E0E63823600691F2F /* Debug */,
+ AF35E89F0E63823600691F2F /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF39382C1D0FBD6A00205406 /* Build configuration list for PBXNativeTarget "Discoball" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF39382D1D0FBD6A00205406 /* Debug */,
+ AF39382E1D0FBD6A00205406 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF39E293198A11F60064A58D /* Build configuration list for PBXNativeTarget "WindupRobot" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF39E294198A11F60064A58D /* Debug */,
+ AF39E295198A11F60064A58D /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF3C71560D624BF50030CC0D /* Build configuration list for PBXNativeTarget "Hypnowheel" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF3C71570D624BF50030CC0D /* Debug */,
+ AF3C71580D624BF50030CC0D /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF3EC98A2035154C00180A35 /* Build configuration list for PBXNativeTarget "Peepers" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF3EC98B2035154C00180A35 /* Debug */,
+ AF3EC98C2035154C00180A35 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF41E964201D49DB0098E253 /* Build configuration list for PBXNativeTarget "RazzleDazzle" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF41E965201D49DB0098E253 /* Debug */,
+ AF41E966201D49DB0098E253 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF46E9E11CBBA2B300240FBC /* Build configuration list for PBXNativeTarget "Unicrud" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF46E9E21CBBA2B300240FBC /* Debug */,
+ AF46E9E31CBBA2B300240FBC /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF476FC3099D154F001F091E /* Build configuration list for PBXNativeTarget "Interference" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF476FC4099D154F001F091E /* Debug */,
+ AF476FC5099D154F001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF476FE8099D1686001F091E /* Build configuration list for PBXNativeTarget "Truchet" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF476FE9099D1686001F091E /* Debug */,
+ AF476FEA099D1686001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF477059099D4385001F091E /* Build configuration list for PBXNativeTarget "Deluxe" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF47705A099D4385001F091E /* Debug */,
+ AF47705B099D4385001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF477176099D4786001F091E /* Build configuration list for PBXNativeTarget "Compass" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF477177099D4786001F091E /* Debug */,
+ AF477178099D4786001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF47718C099D4803001F091E /* Build configuration list for PBXNativeTarget "Wander" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF47718D099D4803001F091E /* Debug */,
+ AF47718E099D4803001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4771B4099D4949001F091E /* Build configuration list for PBXNativeTarget "T3D" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4771B5099D4949001F091E /* Debug */,
+ AF4771B6099D4949001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4771E8099D4D9A001F091E /* Build configuration list for PBXNativeTarget "CCurve" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4771E9099D4D9A001F091E /* Debug */,
+ AF4771EA099D4D9A001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4771FF099D4E63001F091E /* Build configuration list for PBXNativeTarget "NerveRot" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF477200099D4E63001F091E /* Debug */,
+ AF477201099D4E63001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF477215099D4EE8001F091E /* Build configuration list for PBXNativeTarget "Whirlygig" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF477216099D4EE8001F091E /* Debug */,
+ AF477217099D4EE8001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF47722B099D4F67001F091E /* Build configuration list for PBXNativeTarget "Anemone" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF47722C099D4F67001F091E /* Debug */,
+ AF47722D099D4F67001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF477260099D5717001F091E /* Build configuration list for PBXNativeTarget "Halftone" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF477261099D5717001F091E /* Debug */,
+ AF477262099D5717001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF477278099D57B9001F091E /* Build configuration list for PBXNativeTarget "PopSquares" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF477279099D57B9001F091E /* Debug */,
+ AF47727A099D57B9001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF477290099D5926001F091E /* Build configuration list for PBXNativeTarget "Piecewise" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF477291099D5926001F091E /* Debug */,
+ AF477292099D5926001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF47738F099D65A1001F091E /* Build configuration list for PBXNativeTarget "Wormhole" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF477390099D65A1001F091E /* Debug */,
+ AF477391099D65A1001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4773A7099D6648001F091E /* Build configuration list for PBXNativeTarget "FuzzyFlakes" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4773A8099D6648001F091E /* Debug */,
+ AF4773A9099D6648001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4773CE099D67B9001F091E /* Build configuration list for PBXNativeTarget "Anemotaxis" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4773CF099D67B9001F091E /* Debug */,
+ AF4773D0099D67B9001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF47740F099D69E7001F091E /* Build configuration list for PBXNativeTarget "Intermomentary" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF477410099D69E7001F091E /* Debug */,
+ AF477411099D69E7001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF477434099D7C70001F091E /* Build configuration list for PBXNativeTarget "IFS" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF477435099D7C70001F091E /* Debug */,
+ AF477436099D7C70001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF47744F099D7D33001F091E /* Build configuration list for PBXNativeTarget "XMatrix" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF477450099D7D33001F091E /* Debug */,
+ AF477451099D7D33001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF477490099D89E4001F091E /* Build configuration list for PBXNativeTarget "Flame" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF477491099D89E4001F091E /* Debug */,
+ AF477492099D89E4001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4774A6099D8A74001F091E /* Build configuration list for PBXNativeTarget "Kaleidescope" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4774A7099D8A74001F091E /* Debug */,
+ AF4774A8099D8A74001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4774C1099D8B5F001F091E /* Build configuration list for PBXNativeTarget "LMorph" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4774C2099D8B5F001F091E /* Debug */,
+ AF4774C3099D8B5F001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4774DB099D8BFF001F091E /* Build configuration list for PBXNativeTarget "Maze" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4774DC099D8BFF001F091E /* Debug */,
+ AF4774DD099D8BFF001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF47756A099D9A1A001F091E /* Build configuration list for PBXNativeTarget "Pedal" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF47756B099D9A1A001F091E /* Debug */,
+ AF47756C099D9A1A001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF477590099D9C28001F091E /* Build configuration list for PBXNativeTarget "Pyro" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF477591099D9C28001F091E /* Debug */,
+ AF477592099D9C28001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4775AC099D9CF7001F091E /* Build configuration list for PBXNativeTarget "Starfish" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4775AD099D9CF7001F091E /* Debug */,
+ AF4775AE099D9CF7001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4775E5099D9F69001F091E /* Build configuration list for PBXNativeTarget "Coral" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4775E6099D9F69001F091E /* Debug */,
+ AF4775E7099D9F69001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4775FF099DA030001F091E /* Build configuration list for PBXNativeTarget "Epicycle" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF477600099DA030001F091E /* Debug */,
+ AF477601099DA030001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF477620099DA26C001F091E /* Build configuration list for PBXNativeTarget "Kumppa" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF477621099DA26C001F091E /* Debug */,
+ AF477622099DA26C001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF477651099DA6D0001F091E /* Build configuration list for PBXNativeTarget "Squiral" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF477652099DA6D0001F091E /* Debug */,
+ AF477653099DA6D0001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF477667099DA78E001F091E /* Build configuration list for PBXNativeTarget "Critical" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF477668099DA78E001F091E /* Debug */,
+ AF477669099DA78E001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF47767D099DA849001F091E /* Build configuration list for PBXNativeTarget "Petri" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF47767E099DA849001F091E /* Debug */,
+ AF47767F099DA849001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF47769C099DAA6F001F091E /* Build configuration list for PBXNativeTarget "Blaster" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF47769D099DAA6F001F091E /* Debug */,
+ AF47769E099DAA6F001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4776B7099DABDD001F091E /* Build configuration list for PBXNativeTarget "XSpirograph" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4776B8099DABDD001F091E /* Debug */,
+ AF4776B9099DABDD001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4776CD099DAC8A001F091E /* Build configuration list for PBXNativeTarget "XRaySwarm" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4776CE099DAC8A001F091E /* Debug */,
+ AF4776CF099DAC8A001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4776E8099DADDF001F091E /* Build configuration list for PBXNativeTarget "WhirlWindWarp" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4776E9099DADDF001F091E /* Debug */,
+ AF4776EA099DADDF001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4776FE099DAE7A001F091E /* Build configuration list for PBXNativeTarget "Vermiculate" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4776FF099DAE7A001F091E /* Debug */,
+ AF477700099DAE7A001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF47771A099DAF9F001F091E /* Build configuration list for PBXNativeTarget "CloudLife" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF47771B099DAF9F001F091E /* Debug */,
+ AF47771C099DAF9F001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF477730099DB044001F091E /* Build configuration list for PBXNativeTarget "Substrate" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF477731099DB044001F091E /* Debug */,
+ AF477732099DB044001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF47775F099DB61E001F091E /* Build configuration list for PBXNativeTarget "Interaggregate" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF477760099DB61E001F091E /* Debug */,
+ AF477761099DB61E001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF477781099DB965001F091E /* Build configuration list for PBXNativeTarget "Celtic" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF477782099DB965001F091E /* Debug */,
+ AF477783099DB965001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF47779D099DBA90001F091E /* Build configuration list for PBXNativeTarget "FluidBalls" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF47779E099DBA90001F091E /* Debug */,
+ AF47779F099DBA90001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4777DE099DC183001F091E /* Build configuration list for PBXNativeTarget "BoxFit" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4777DF099DC183001F091E /* Debug */,
+ AF4777E0099DC183001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4778B8099DDB79001F091E /* Build configuration list for PBXNativeTarget "Penetrate" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4778B9099DDB79001F091E /* Debug */,
+ AF4778BA099DDB79001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4778D4099DDCAE001F091E /* Build configuration list for PBXNativeTarget "XJack" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4778D5099DDCAE001F091E /* Debug */,
+ AF4778D6099DDCAE001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4778F5099DDDC8001F091E /* Build configuration list for PBXNativeTarget "Cynosure" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4778F6099DDDC8001F091E /* Debug */,
+ AF4778F7099DDDC8001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF477916099DE379001F091E /* Build configuration list for PBXNativeTarget "Flag" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF477917099DE379001F091E /* Debug */,
+ AF477918099DE379001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF477937099DE4C7001F091E /* Build configuration list for PBXNativeTarget "Slip" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF477938099DE4C7001F091E /* Debug */,
+ AF477939099DE4C7001F091E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4808C2098C3B8B00FB32B8 /* Build configuration list for PBXNativeTarget "jwxyz" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4808C3098C3B8B00FB32B8 /* Debug */,
+ AF4808C4098C3B8B00FB32B8 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF480ABA098C66E300FB32B8 /* Build configuration list for PBXAggregateTarget "All Savers (XScreenSaver)" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF480ABB098C66E300FB32B8 /* Debug */,
+ AF480ABC098C66E300FB32B8 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF480C55098E301400FB32B8 /* Build configuration list for PBXNativeTarget "Helix" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF480C56098E301400FB32B8 /* Debug */,
+ AF480C57098E301400FB32B8 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF480D64098EED6E00FB32B8 /* Build configuration list for PBXAggregateTarget "All Savers (XLockmore)" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF480D65098EED6E00FB32B8 /* Debug */,
+ AF480D66098EED6E00FB32B8 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF480D67098EED6E00FB32B8 /* Build configuration list for PBXAggregateTarget "All Savers (OpenGL)" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF480D68098EED6E00FB32B8 /* Debug */,
+ AF480D69098EED6E00FB32B8 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF480D6A098EED6E00FB32B8 /* Build configuration list for PBXAggregateTarget "All Savers" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF480D6B098EED6E00FB32B8 /* Debug */,
+ AF480D6C098EED6E00FB32B8 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF480D7E098EEDDE00FB32B8 /* Build configuration list for PBXNativeTarget "Drift" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF480D7F098EEDDE00FB32B8 /* Debug */,
+ AF480D80098EEDDE00FB32B8 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4810F809909FBA00FB32B8 /* Build configuration list for PBXNativeTarget "DangerBall" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4810F909909FBA00FB32B8 /* Debug */,
+ AF4810FA09909FBA00FB32B8 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4812610990CE2700FB32B8 /* Build configuration list for PBXNativeTarget "Gears" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4812620990CE2700FB32B8 /* Debug */,
+ AF4812630990CE2700FB32B8 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4812C30990D3D900FB32B8 /* Build configuration list for PBXNativeTarget "Pipes" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4812C40990D3D900FB32B8 /* Debug */,
+ AF4812C50990D3D900FB32B8 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF48DF000A0C25E000F94CF9 /* Build configuration list for PBXNativeTarget "GLSchool" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF48DF010A0C25E000F94CF9 /* Debug */,
+ AF48DF020A0C25E000F94CF9 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4A345A102A593600A81B2A /* Build configuration list for PBXNativeTarget "Surfaces" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4A345B102A593600A81B2A /* Debug */,
+ AF4A345C102A593600A81B2A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4FD6F70CE7A486005EE58E /* Build configuration list for PBXNativeTarget "Lockward" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4FD6F80CE7A486005EE58E /* Debug */,
+ AF4FD6F90CE7A486005EE58E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4FF4940D52CA0800666F98 /* Build configuration list for PBXLegacyTarget "m6502.h" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4FF4950D52CA0800666F98 /* Debug */,
+ AF4FF4960D52CA0800666F98 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF4FF4CB0D52CBDE00666F98 /* Build configuration list for PBXNativeTarget "CubicGrid" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF4FF4CC0D52CBDE00666F98 /* Debug */,
+ AF4FF4CD0D52CBDE00666F98 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF5C9B0A1A0CCE6E00B0147A /* Build configuration list for PBXNativeTarget "Cityflow" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF5C9B0B1A0CCE6E00B0147A /* Debug */,
+ AF5C9B0C1A0CCE6E00B0147A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF5ECEBD2116B1A400069433 /* Build configuration list for PBXNativeTarget "VFeedback" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF5ECEBE2116B1A400069433 /* Debug */,
+ AF5ECEBF2116B1A400069433 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF633C131EE0BA6F00AB33BD /* Build configuration list for PBXNativeTarget "Vigilance" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF633C141EE0BA6F00AB33BD /* Debug */,
+ AF633C151EE0BA6F00AB33BD /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF63A8031AB4EDDB00593C75 /* Build configuration list for PBXNativeTarget "RomanBoy" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF63A8041AB4EDDB00593C75 /* Debug */,
+ AF63A8051AB4EDDB00593C75 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF63F44B1C3465BE0033E133 /* Build configuration list for PBXNativeTarget "Apple2-iOS" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF63F44C1C3465BE0033E133 /* Debug */,
+ AF63F44D1C3465BE0033E133 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF63F4711C34682A0033E133 /* Build configuration list for PBXNativeTarget "Phosphor-iOS" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF63F4721C34682A0033E133 /* Debug */,
+ AF63F4731C34682A0033E133 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF63F4971C3469FC0033E133 /* Build configuration list for PBXNativeTarget "TestX11-iOS" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF63F4981C3469FC0033E133 /* Debug */,
+ AF63F4991C3469FC0033E133 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF642402099FF9C2000F4CD4 /* Build configuration list for PBXNativeTarget "Extrusion" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF642403099FF9C2000F4CD4 /* Debug */,
+ AF642404099FF9C2000F4CD4 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF6425D909A18855000F4CD4 /* Build configuration list for PBXNativeTarget "HyperCube" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF6425DA09A18855000F4CD4 /* Debug */,
+ AF6425DB09A18855000F4CD4 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF6425F909A189EC000F4CD4 /* Build configuration list for PBXNativeTarget "Qix" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF6425FA09A189EC000F4CD4 /* Debug */,
+ AF6425FB09A189EC000F4CD4 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF64261C09A18D6C000F4CD4 /* Build configuration list for PBXNativeTarget "HyperBall" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF64261D09A18D6C000F4CD4 /* Debug */,
+ AF64261E09A18D6C000F4CD4 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF64263909A18F54000F4CD4 /* Build configuration list for PBXNativeTarget "Moire2" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF64263A09A18F54000F4CD4 /* Debug */,
+ AF64263B09A18F54000F4CD4 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF64265C09A19229000F4CD4 /* Build configuration list for PBXNativeTarget "Munch" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF64265D09A19229000F4CD4 /* Debug */,
+ AF64265E09A19229000F4CD4 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF64268809A194B0000F4CD4 /* Build configuration list for PBXNativeTarget "Goop" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF64268909A194B0000F4CD4 /* Debug */,
+ AF64268A09A194B0000F4CD4 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF64277E09A1D37A000F4CD4 /* Build configuration list for PBXNativeTarget "SpeedMine" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF64277F09A1D37A000F4CD4 /* Debug */,
+ AF64278009A1D37A000F4CD4 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF6427B509A2DE36000F4CD4 /* Build configuration list for PBXNativeTarget "Bubbles" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF6427B609A2DE36000F4CD4 /* Debug */,
+ AF6427B709A2DE36000F4CD4 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF68A48F19196CF800D41CD1 /* Build configuration list for PBXNativeTarget "Tessellimage" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF68A49019196CF800D41CD1 /* Debug */,
+ AF68A49119196CF800D41CD1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF73FF331A09877F00E485E9 /* Build configuration list for PBXNativeTarget "BinaryRing" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF73FF341A09877F00E485E9 /* Debug */,
+ AF73FF351A09877F00E485E9 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF75110F1782B5B900380EA1 /* Build configuration list for PBXNativeTarget "Kaleidocycle" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF7511101782B5B900380EA1 /* Debug */,
+ AF7511111782B5B900380EA1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF7776F309B63ABF00EA3033 /* Build configuration list for PBXNativeTarget "Phosphor" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF7776F409B63ABF00EA3033 /* Debug */,
+ AF7776F509B63ABF00EA3033 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF77772709B6416100EA3033 /* Build configuration list for PBXNativeTarget "Pacman" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF77772809B6416100EA3033 /* Debug */,
+ AF77772909B6416100EA3033 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF77774E09B6446500EA3033 /* Build configuration list for PBXNativeTarget "FlipScreen3D" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF77774F09B6446500EA3033 /* Debug */,
+ AF77775009B6446500EA3033 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF77778509B6497800EA3033 /* Build configuration list for PBXNativeTarget "Gleidescope" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF77778609B6497800EA3033 /* Debug */,
+ AF77778709B6497800EA3033 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF77779F09B64A5200EA3033 /* Build configuration list for PBXNativeTarget "MirrorBlob" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF7777A009B64A5200EA3033 /* Debug */,
+ AF7777A109B64A5200EA3033 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF7777B909B64B2600EA3033 /* Build configuration list for PBXNativeTarget "StonerView" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF7777BA09B64B2600EA3033 /* Debug */,
+ AF7777BB09B64B2600EA3033 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF7777E109B64C6B00EA3033 /* Build configuration list for PBXNativeTarget "GLSlideshow" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF7777E209B64C6B00EA3033 /* Debug */,
+ AF7777E309B64C6B00EA3033 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF7777FB09B64E3100EA3033 /* Build configuration list for PBXNativeTarget "FlipText" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF7777FC09B64E3100EA3033 /* Debug */,
+ AF7777FD09B64E3100EA3033 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF77782209B6504400EA3033 /* Build configuration list for PBXNativeTarget "StarWars" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF77782309B6504400EA3033 /* Debug */,
+ AF77782409B6504400EA3033 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF77785509B6528100EA3033 /* Build configuration list for PBXNativeTarget "Carousel" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF77785609B6528100EA3033 /* Debug */,
+ AF77785709B6528100EA3033 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF77787109B6536000EA3033 /* Build configuration list for PBXNativeTarget "DNAlogo" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF77787209B6536000EA3033 /* Debug */,
+ AF77787309B6536000EA3033 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF77788C09B6563500EA3033 /* Build configuration list for PBXNativeTarget "FontGlide" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF77788D09B6563500EA3033 /* Debug */,
+ AF77788E09B6563500EA3033 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF7778B209B659C800EA3033 /* Build configuration list for PBXNativeTarget "BlitSpin" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF7778B309B659C800EA3033 /* Debug */,
+ AF7778B409B659C800EA3033 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF78D186142DD8F3002AAF77 /* Build configuration list for PBXNativeTarget "Hilbert" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF78D187142DD8F3002AAF77 /* Debug */,
+ AF78D188142DD8F3002AAF77 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF794F71099748450059A8B0 /* Build configuration list for PBXNativeTarget "Demon" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF794F72099748450059A8B0 /* Debug */,
+ AF794F73099748450059A8B0 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF794F9B09974A320059A8B0 /* Build configuration list for PBXNativeTarget "Fiberlamp" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF794F9C09974A320059A8B0 /* Debug */,
+ AF794F9D09974A320059A8B0 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF794FDA09974FA60059A8B0 /* Build configuration list for PBXNativeTarget "Loop" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF794FDB09974FA60059A8B0 /* Debug */,
+ AF794FDC09974FA60059A8B0 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF7ACFD119FF0A9200BD752B /* Build configuration list for PBXNativeTarget "GeodesicGears" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF7ACFD219FF0A9200BD752B /* Debug */,
+ AF7ACFD319FF0A9200BD752B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF91898C158FC00A002B5D1E /* Build configuration list for PBXNativeTarget "XScreenSaver-iOS" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF91898D158FC00A002B5D1E /* Debug */,
+ AF91898E158FC00A002B5D1E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF97573A099C317000B05160 /* Build configuration list for PBXNativeTarget "IMSMap" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF97573B099C317000B05160 /* Debug */,
+ AF97573C099C317000B05160 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF975782099C374A00B05160 /* Build configuration list for PBXNativeTarget "Moire" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF975783099C374A00B05160 /* Debug */,
+ AF975784099C374A00B05160 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF9757CF099C3E6300B05160 /* Build configuration list for PBXNativeTarget "RDbomb" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF9757D0099C3E6300B05160 /* Debug */,
+ AF9757D1099C3E6300B05160 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF975815099C41D500B05160 /* Build configuration list for PBXNativeTarget "XFlame" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF975816099C41D500B05160 /* Debug */,
+ AF975817099C41D500B05160 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF975872099C475900B05160 /* Build configuration list for PBXNativeTarget "ShadeBobs" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF975873099C475900B05160 /* Debug */,
+ AF975874099C475900B05160 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF975A43099C681F00B05160 /* Build configuration list for PBXNativeTarget "MetaBalls" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF975A44099C681F00B05160 /* Debug */,
+ AF975A45099C681F00B05160 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF975A79099C6AB200B05160 /* Build configuration list for PBXNativeTarget "Eruption" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF975A7A099C6AB200B05160 /* Debug */,
+ AF975A7B099C6AB200B05160 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF975A93099C6BC300B05160 /* Build configuration list for PBXNativeTarget "Barcode" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF975A94099C6BC300B05160 /* Debug */,
+ AF975A95099C6BC300B05160 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF975AE4099C6EB100B05160 /* Build configuration list for PBXNativeTarget "Fireworkx" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF975AE5099C6EB100B05160 /* Debug */,
+ AF975AE6099C6EB100B05160 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF975B09099C6FE400B05160 /* Build configuration list for PBXNativeTarget "MemScroller" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF975B0A099C6FE400B05160 /* Debug */,
+ AF975B0B099C6FE400B05160 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF975C1F099C8C1500B05160 /* Build configuration list for PBXNativeTarget "Halo" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF975C20099C8C1500B05160 /* Debug */,
+ AF975C21099C8C1500B05160 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF975C4B099C8DCF00B05160 /* Build configuration list for PBXNativeTarget "Greynetic" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF975C4C099C8DCF00B05160 /* Debug */,
+ AF975C4D099C8DCF00B05160 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF975C6B099C8F3F00B05160 /* Build configuration list for PBXNativeTarget "NoseGuy" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF975C6C099C8F3F00B05160 /* Debug */,
+ AF975C6D099C8F3F00B05160 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF975D60099CA0F000B05160 /* Build configuration list for PBXNativeTarget "Rocks" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF975D61099CA0F000B05160 /* Debug */,
+ AF975D62099CA0F000B05160 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF976FBE0989CAA4001F8B92 /* Build configuration list for PBXNativeTarget "Deco" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF976FBF0989CAA4001F8B92 /* Debug */,
+ AF976FC00989CAA4001F8B92 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF97703D0989D1E6001F8B92 /* Build configuration list for PBXNativeTarget "Rorschach" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF97703E0989D1E6001F8B92 /* Debug */,
+ AF97703F0989D1E6001F8B92 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF97707A0989D2F6001F8B92 /* Build configuration list for PBXNativeTarget "Attraction" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF97707B0989D2F6001F8B92 /* Debug */,
+ AF97707C0989D2F6001F8B92 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF9771DA0989DC4B001F8B92 /* Build configuration list for PBXNativeTarget "SaverTester" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF9771DB0989DC4B001F8B92 /* Debug */,
+ AF9771DC0989DC4B001F8B92 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF998EEB0A083DB30051049D /* Build configuration list for PBXNativeTarget "TopBlock" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF998EEC0A083DB30051049D /* Debug */,
+ AF998EED0A083DB30051049D /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF9D467309B5109C006E59CF /* Build configuration list for PBXNativeTarget "DecayScreen" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF9D467409B5109C006E59CF /* Debug */,
+ AF9D467509B5109C006E59CF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF9D475109B5300A006E59CF /* Build configuration list for PBXNativeTarget "SlideScreen" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF9D475209B5300A006E59CF /* Debug */,
+ AF9D475309B5300A006E59CF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF9D476C09B53166006E59CF /* Build configuration list for PBXNativeTarget "Zoom" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF9D476D09B53166006E59CF /* Debug */,
+ AF9D476E09B53166006E59CF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF9D48E809B53322006E59CF /* Build configuration list for PBXNativeTarget "Bumps" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF9D48E909B53322006E59CF /* Debug */,
+ AF9D48EA09B53322006E59CF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF9D490109B535DA006E59CF /* Build configuration list for PBXNativeTarget "Distort" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF9D490209B535DA006E59CF /* Debug */,
+ AF9D490309B535DA006E59CF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF9D493809B53CBA006E59CF /* Build configuration list for PBXNativeTarget "Ripples" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF9D493909B53CBA006E59CF /* Debug */,
+ AF9D493A09B53CBA006E59CF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF9D496109B53FC9006E59CF /* Build configuration list for PBXNativeTarget "RotZoomer" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF9D496209B53FC9006E59CF /* Debug */,
+ AF9D496309B53FC9006E59CF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF9D497909B5411D006E59CF /* Build configuration list for PBXNativeTarget "Twang" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF9D497A09B5411D006E59CF /* Debug */,
+ AF9D497B09B5411D006E59CF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF9D49A409B544C2006E59CF /* Build configuration list for PBXNativeTarget "Spotlight" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF9D49A509B544C2006E59CF /* Debug */,
+ AF9D49A609B544C2006E59CF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF9D4C7609B59F27006E59CF /* Build configuration list for PBXNativeTarget "XLyap" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF9D4C7709B59F27006E59CF /* Debug */,
+ AF9D4C7809B59F27006E59CF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF9D4CF409B5AA8E006E59CF /* Build configuration list for PBXNativeTarget "Pong" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF9D4CF509B5AA8E006E59CF /* Debug */,
+ AF9D4CF609B5AA8E006E59CF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF9D4D8C09B5B2DC006E59CF /* Build configuration list for PBXNativeTarget "XAnalogTV" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF9D4D8D09B5B2DC006E59CF /* Debug */,
+ AF9D4D8E09B5B2DC006E59CF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF9D4DBD09B5B71E006E59CF /* Build configuration list for PBXNativeTarget "BSOD" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF9D4DBE09B5B71E006E59CF /* Debug */,
+ AF9D4DBF09B5B71E006E59CF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF9D4DFB09B5BB19006E59CF /* Build configuration list for PBXNativeTarget "Apple2" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF9D4DFC09B5BB19006E59CF /* Debug */,
+ AF9D4DFD09B5BB19006E59CF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AF9E7EC5190F4C1C00A8B01F /* Build configuration list for PBXNativeTarget "enable_gc" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AF9E7EC6190F4C1C00A8B01F /* Debug */,
+ AF9E7EC7190F4C1C00A8B01F /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA2119E1CD59DAF00C0D2A1 /* Build configuration list for PBXNativeTarget "RaverHoop" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA2119F1CD59DAF00C0D2A1 /* Debug */,
+ AFA211A01CD59DAF00C0D2A1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA3393D0B058505002B0E7D /* Build configuration list for PBXNativeTarget "WebCollage" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA3393E0B058505002B0E7D /* Debug */,
+ AFA3393F0B058505002B0E7D /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA33BCB0B058754002B0E7D /* Build configuration list for PBXNativeTarget "webcollage-helper" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA33BCC0B058754002B0E7D /* Debug */,
+ AFA33BCD0B058754002B0E7D /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA33C070B058E67002B0E7D /* Build configuration list for PBXAggregateTarget "webcollage-perl" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA33C080B058E67002B0E7D /* Debug */,
+ AFA33C090B058E67002B0E7D /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55957099330B000F3E977 /* Build configuration list for PBXNativeTarget "Cage" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55958099330B000F3E977 /* Debug */,
+ AFA55959099330B000F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA5597C0993317900F3E977 /* Build configuration list for PBXNativeTarget "Moebius" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA5597D0993317900F3E977 /* Debug */,
+ AFA5597E0993317900F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA559A10993322100F3E977 /* Build configuration list for PBXNativeTarget "Superquadrics" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA559A20993322100F3E977 /* Debug */,
+ AFA559A30993322100F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA559C40993328000F3E977 /* Build configuration list for PBXNativeTarget "Morph3D" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA559C50993328000F3E977 /* Debug */,
+ AFA559C60993328000F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA559DE0993330600F3E977 /* Build configuration list for PBXNativeTarget "Rubik" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA559DF0993330600F3E977 /* Debug */,
+ AFA559E00993330600F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55A120993340300F3E977 /* Build configuration list for PBXNativeTarget "Stairs" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55A130993340300F3E977 /* Debug */,
+ AFA55A140993340300F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55A2F099334A000F3E977 /* Build configuration list for PBXNativeTarget "Sproingies" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55A30099334A000F3E977 /* Debug */,
+ AFA55A31099334A000F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55A880993364300F3E977 /* Build configuration list for PBXNativeTarget "Lament" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55A890993364300F3E977 /* Debug */,
+ AFA55A8A0993364300F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55ADE09933CEF00F3E977 /* Build configuration list for PBXNativeTarget "Bubble3D" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55ADF09933CEF00F3E977 /* Debug */,
+ AFA55AE009933CEF00F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55B1B09933E0500F3E977 /* Build configuration list for PBXNativeTarget "GLPlanet" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55B1C09933E0500F3E977 /* Debug */,
+ AFA55B1D09933E0500F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55B3409933E8D00F3E977 /* Build configuration list for PBXNativeTarget "Pulsar" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55B3509933E8D00F3E977 /* Debug */,
+ AFA55B3609933E8D00F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55B8809933F7200F3E977 /* Build configuration list for PBXNativeTarget "Sierpinski3D" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55B8909933F7200F3E977 /* Debug */,
+ AFA55B8A09933F7200F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55BA009933FDA00F3E977 /* Build configuration list for PBXNativeTarget "GFlux" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55BA109933FDA00F3E977 /* Debug */,
+ AFA55BA209933FDA00F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55BBA099340CE00F3E977 /* Build configuration list for PBXNativeTarget "Circuit" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55BBB099340CE00F3E977 /* Debug */,
+ AFA55BBC099340CE00F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55BF30993429100F3E977 /* Build configuration list for PBXNativeTarget "Menger" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55BF40993429100F3E977 /* Debug */,
+ AFA55BF50993429100F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55C1D0993431300F3E977 /* Build configuration list for PBXNativeTarget "Engine" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55C1E0993431300F3E977 /* Debug */,
+ AFA55C1F0993431300F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55C86099349A600F3E977 /* Build configuration list for PBXNativeTarget "GLSnake" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55C87099349A600F3E977 /* Debug */,
+ AFA55C88099349A600F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55CB809934BB200F3E977 /* Build configuration list for PBXNativeTarget "Boxed" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55CB909934BB200F3E977 /* Debug */,
+ AFA55CBA09934BB200F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55CDB09934CE400F3E977 /* Build configuration list for PBXNativeTarget "GLForestFire" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55CDC09934CE400F3E977 /* Debug */,
+ AFA55CDD09934CE400F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55D4B0993565300F3E977 /* Build configuration list for PBXNativeTarget "SBalls" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55D4C0993565300F3E977 /* Debug */,
+ AFA55D4D0993565300F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55D710993584B00F3E977 /* Build configuration list for PBXNativeTarget "Cubenetic" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55D720993584B00F3E977 /* Debug */,
+ AFA55D730993584B00F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55D8E099358C400F3E977 /* Build configuration list for PBXNativeTarget "Spheremonics" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55D8F099358C400F3E977 /* Debug */,
+ AFA55D90099358C400F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55DD709935D7000F3E977 /* Build configuration list for PBXNativeTarget "Lavalite" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55DD809935D7000F3E977 /* Debug */,
+ AFA55DD909935D7000F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55E0009935E4900F3E977 /* Build configuration list for PBXNativeTarget "Queens" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55E0109935E4900F3E977 /* Debug */,
+ AFA55E0209935E4900F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55E1C09935EDC00F3E977 /* Build configuration list for PBXNativeTarget "Endgame" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55E1D09935EDC00F3E977 /* Debug */,
+ AFA55E1E09935EDC00F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55E3F09935F8E00F3E977 /* Build configuration list for PBXNativeTarget "GLBlur" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55E4009935F8E00F3E977 /* Debug */,
+ AFA55E4109935F8E00F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55E5D09935FF900F3E977 /* Build configuration list for PBXNativeTarget "FlyingToasters" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55E5E09935FF900F3E977 /* Debug */,
+ AFA55E5F09935FF900F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55EE0099360E300F3E977 /* Build configuration list for PBXNativeTarget "BouncingCow" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55EE1099360E300F3E977 /* Debug */,
+ AFA55EE2099360E300F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55F1B099361B700F3E977 /* Build configuration list for PBXNativeTarget "JigglyPuff" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55F1C099361B700F3E977 /* Debug */,
+ AFA55F1D099361B700F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55F390993622F00F3E977 /* Build configuration list for PBXNativeTarget "Klein" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55F3A0993622F00F3E977 /* Debug */,
+ AFA55F3B0993622F00F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55F510993629000F3E977 /* Build configuration list for PBXNativeTarget "Hypertorus" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55F520993629000F3E977 /* Debug */,
+ AFA55F530993629000F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55F810993643600F3E977 /* Build configuration list for PBXNativeTarget "GLMatrix" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55F820993643600F3E977 /* Debug */,
+ AFA55F830993643600F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA55FE209936BFA00F3E977 /* Build configuration list for PBXNativeTarget "CubeStorm" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA55FE309936BFA00F3E977 /* Debug */,
+ AFA55FE409936BFA00F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA5600809936C6D00F3E977 /* Build configuration list for PBXNativeTarget "GLKnots" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA5600909936C6D00F3E977 /* Debug */,
+ AFA5600A09936C6D00F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA5602309936CC800F3E977 /* Build configuration list for PBXNativeTarget "BlockTube" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA5602409936CC800F3E977 /* Debug */,
+ AFA5602509936CC800F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA5604109936D5100F3E977 /* Build configuration list for PBXNativeTarget "FlipFlop" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA5604209936D5100F3E977 /* Debug */,
+ AFA5604309936D5100F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA5605909936E2100F3E977 /* Build configuration list for PBXNativeTarget "AntInspect" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA5605A09936E2100F3E977 /* Debug */,
+ AFA5605B09936E2100F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA5607109936F3800F3E977 /* Build configuration list for PBXNativeTarget "AntSpotlight" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA5607209936F3800F3E977 /* Debug */,
+ AFA5607309936F3800F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA560BD0993718D00F3E977 /* Build configuration list for PBXNativeTarget "Polytopes" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA560BE0993718D00F3E977 /* Debug */,
+ AFA560BF0993718D00F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA5610C0993781600F3E977 /* Build configuration list for PBXNativeTarget "Molecule" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA5610D0993781600F3E977 /* Debug */,
+ AFA5610E0993781600F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA5611A099378EA00F3E977 /* Build configuration list for PBXLegacyTarget "molecules.h" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA5611B099378EA00F3E977 /* Debug */,
+ AFA5611C099378EA00F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA5616709937C0D00F3E977 /* Build configuration list for PBXNativeTarget "BlinkBox" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA5616809937C0D00F3E977 /* Debug */,
+ AFA5616909937C0D00F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA5618A09937CF100F3E977 /* Build configuration list for PBXNativeTarget "Noof" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA5618B09937CF100F3E977 /* Debug */,
+ AFA5618C09937CF100F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA561AC09937D7E00F3E977 /* Build configuration list for PBXNativeTarget "Polyhedra" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA561AD09937D7E00F3E977 /* Debug */,
+ AFA561AE09937D7E00F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA562160993849F00F3E977 /* Build configuration list for PBXNativeTarget "Providence" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA562170993849F00F3E977 /* Debug */,
+ AFA562180993849F00F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA5622E0993852500F3E977 /* Build configuration list for PBXNativeTarget "Pinion" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA5622F0993852500F3E977 /* Debug */,
+ AFA562300993852500F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA562CE099392C600F3E977 /* Build configuration list for PBXNativeTarget "Boing" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA562CF099392C600F3E977 /* Debug */,
+ AFA562D0099392C600F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA562E9099393C900F3E977 /* Build configuration list for PBXNativeTarget "AntMaze" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA562EA099393C900F3E977 /* Debug */,
+ AFA562EB099393C900F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA563010993943B00F3E977 /* Build configuration list for PBXNativeTarget "Tangram" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA563020993943B00F3E977 /* Debug */,
+ AFA563030993943B00F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA563230993951000F3E977 /* Build configuration list for PBXNativeTarget "Crackberg" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA563240993951000F3E977 /* Debug */,
+ AFA563250993951000F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA56340099395ED00F3E977 /* Build configuration list for PBXNativeTarget "GLHanoi" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA56341099395ED00F3E977 /* Debug */,
+ AFA56342099395ED00F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA56360099396C000F3E977 /* Build configuration list for PBXNativeTarget "Cube21" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA56361099396C000F3E977 /* Debug */,
+ AFA56362099396C000F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA56388099397B300F3E977 /* Build configuration list for PBXNativeTarget "TimeTunnel" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA56389099397B300F3E977 /* Debug */,
+ AFA5638A099397B300F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA563B3099398BB00F3E977 /* Build configuration list for PBXNativeTarget "Juggler3D" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA563B4099398BB00F3E977 /* Debug */,
+ AFA563B5099398BB00F3E977 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFA6AB0220999950006D2685 /* Build configuration list for PBXNativeTarget "GlitchPEG" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFA6AB0320999950006D2685 /* Debug */,
+ AFA6AB0420999950006D2685 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFAAE399207D6343007A515C /* Build configuration list for PBXNativeTarget "Maze3D" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFAAE39A207D6343007A515C /* Debug */,
+ AFAAE39B207D6343007A515C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFAC36B7202E7F79001A684C /* Build configuration list for PBXLegacyTarget "images_png_h" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFAC36B8202E7F79001A684C /* Debug */,
+ AFAC36B9202E7F79001A684C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFACE8851CC83458008B24CD /* Build configuration list for PBXNativeTarget "EnergyStream" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFACE8861CC83458008B24CD /* Debug */,
+ AFACE8871CC83458008B24CD /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFB591B7178B812C00EA4005 /* Build configuration list for PBXNativeTarget "Hexadrop" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFB591B8178B812C00EA4005 /* Debug */,
+ AFB591B9178B812C00EA4005 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFBFE75B178642DC00432B21 /* Build configuration list for PBXNativeTarget "Apple2-OSX" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFBFE75C178642DC00432B21 /* Debug */,
+ AFBFE75D178642DC00432B21 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFBFE77B178647FE00432B21 /* Build configuration list for PBXNativeTarget "Phosphor-OSX" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFBFE77C178647FE00432B21 /* Debug */,
+ AFBFE77D178647FE00432B21 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFC0E8BD1CDC601A008CAFAC /* Build configuration list for PBXNativeTarget "Hydrostat" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFC0E8BE1CDC601A008CAFAC /* Debug */,
+ AFC0E8BF1CDC601A008CAFAC /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFC5CFE82044AA23004CEB5E /* Build configuration list for PBXNativeTarget "Crumbler" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFC5CFE92044AA23004CEB5E /* Debug */,
+ AFC5CFEA2044AA23004CEB5E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFCF834D1AF5B515008BB7E1 /* Build configuration list for PBXNativeTarget "SplitFlap" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFCF834E1AF5B515008BB7E1 /* Debug */,
+ AFCF834F1AF5B515008BB7E1 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD51B2D0F063B4A00471C02 /* Build configuration list for PBXNativeTarget "Photopile" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD51B2E0F063B4A00471C02 /* Debug */,
+ AFD51B2F0F063B4A00471C02 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD56E010996A03800BA26F7 /* Build configuration list for PBXNativeTarget "GLText" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD56E020996A03800BA26F7 /* Debug */,
+ AFD56E030996A03800BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD56EBB0996A72600BA26F7 /* Build configuration list for PBXNativeTarget "Braid" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD56EBC0996A72600BA26F7 /* Debug */,
+ AFD56EBD0996A72600BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD56EE70996A95700BA26F7 /* Build configuration list for PBXNativeTarget "Forest" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD56EE80996A95700BA26F7 /* Debug */,
+ AFD56EE90996A95700BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD56F180996AAFA00BA26F7 /* Build configuration list for PBXNativeTarget "Vines" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD56F190996AAFA00BA26F7 /* Debug */,
+ AFD56F1A0996AAFA00BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD56F300996AB8A00BA26F7 /* Build configuration list for PBXNativeTarget "Galaxy" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD56F310996AB8A00BA26F7 /* Debug */,
+ AFD56F320996AB8A00BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD56F5C0996AEEE00BA26F7 /* Build configuration list for PBXNativeTarget "Grav" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD56F5D0996AEEE00BA26F7 /* Debug */,
+ AFD56F5E0996AEEE00BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD56F780996B01600BA26F7 /* Build configuration list for PBXNativeTarget "Hopalong" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD56F790996B01600BA26F7 /* Debug */,
+ AFD56F7A0996B01600BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD56F990996B09400BA26F7 /* Build configuration list for PBXNativeTarget "Laser" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD56F9A0996B09400BA26F7 /* Debug */,
+ AFD56F9B0996B09400BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD56FB00996B10F00BA26F7 /* Build configuration list for PBXNativeTarget "Lightning" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD56FB10996B10F00BA26F7 /* Debug */,
+ AFD56FB20996B10F00BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD56FC60996B18F00BA26F7 /* Build configuration list for PBXNativeTarget "Lisa" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD56FC70996B18F00BA26F7 /* Debug */,
+ AFD56FC80996B18F00BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD56FDC0996B20900BA26F7 /* Build configuration list for PBXNativeTarget "Lissie" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD56FDD0996B20900BA26F7 /* Debug */,
+ AFD56FDE0996B20900BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD570050996B43800BA26F7 /* Build configuration list for PBXNativeTarget "Penrose" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD570060996B43800BA26F7 /* Debug */,
+ AFD570070996B43800BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD5701C0996B4CC00BA26F7 /* Build configuration list for PBXNativeTarget "Sierpinski" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD5701D0996B4CC00BA26F7 /* Debug */,
+ AFD5701E0996B4CC00BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD570330996B56D00BA26F7 /* Build configuration list for PBXNativeTarget "Sphere" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD570340996B56D00BA26F7 /* Debug */,
+ AFD570350996B56D00BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD570500996B61600BA26F7 /* Build configuration list for PBXNativeTarget "Spiral" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD570510996B61600BA26F7 /* Debug */,
+ AFD570520996B61600BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD570660996B6A300BA26F7 /* Build configuration list for PBXNativeTarget "FadePlot" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD570670996B6A300BA26F7 /* Debug */,
+ AFD570680996B6A300BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD5707C0996B72700BA26F7 /* Build configuration list for PBXNativeTarget "Mountain" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD5707D0996B72700BA26F7 /* Debug */,
+ AFD5707E0996B72700BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD570920996B80300BA26F7 /* Build configuration list for PBXNativeTarget "Triangle" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD570930996B80300BA26F7 /* Debug */,
+ AFD570940996B80300BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD570A80996B88E00BA26F7 /* Build configuration list for PBXNativeTarget "Worm" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD570A90996B88E00BA26F7 /* Debug */,
+ AFD570AA0996B88E00BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD570BE0996B93000BA26F7 /* Build configuration list for PBXNativeTarget "Rotor" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD570BF0996B93000BA26F7 /* Debug */,
+ AFD570C00996B93000BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD570D60996B9F800BA26F7 /* Build configuration list for PBXNativeTarget "Ant" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD570D70996B9F800BA26F7 /* Debug */,
+ AFD570D80996B9F800BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD570F70996BBBF00BA26F7 /* Build configuration list for PBXNativeTarget "Flow" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD570F80996BBBF00BA26F7 /* Debug */,
+ AFD570F90996BBBF00BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD571200996BE9300BA26F7 /* Build configuration list for PBXNativeTarget "Discrete" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD571210996BE9300BA26F7 /* Debug */,
+ AFD571220996BE9300BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD571390996BF2E00BA26F7 /* Build configuration list for PBXNativeTarget "Apollonian" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD5713A0996BF2E00BA26F7 /* Debug */,
+ AFD5713B0996BF2E00BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD571500996C01700BA26F7 /* Build configuration list for PBXNativeTarget "Euler2D" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD571510996C01700BA26F7 /* Debug */,
+ AFD571520996C01700BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD571660996C0CE00BA26F7 /* Build configuration list for PBXNativeTarget "Thornbird" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD571670996C0CE00BA26F7 /* Debug */,
+ AFD571680996C0CE00BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD571C20996D9DC00BA26F7 /* Build configuration list for PBXNativeTarget "Juggle" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD571C30996D9DC00BA26F7 /* Debug */,
+ AFD571C40996D9DC00BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD5722F0996E4A300BA26F7 /* Build configuration list for PBXNativeTarget "Swirl" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD572300996E4A300BA26F7 /* Debug */,
+ AFD572310996E4A300BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD5727A0996EE8500BA26F7 /* Build configuration list for PBXNativeTarget "Polyominoes" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD5727B0996EE8500BA26F7 /* Debug */,
+ AFD5727C0996EE8500BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD572B20996F99600BA26F7 /* Build configuration list for PBXNativeTarget "Bouboule" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD572B30996F99600BA26F7 /* Debug */,
+ AFD572B40996F99600BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD572CF0996FC0F00BA26F7 /* Build configuration list for PBXNativeTarget "Crystal" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD572D00996FC0F00BA26F7 /* Debug */,
+ AFD572D10996FC0F00BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD57306099701C000BA26F7 /* Build configuration list for PBXNativeTarget "Julia" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD57307099701C000BA26F7 /* Debug */,
+ AFD57308099701C000BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD5736A0997411200BA26F7 /* Build configuration list for PBXNativeTarget "Strange" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD5736B0997411200BA26F7 /* Debug */,
+ AFD5736C0997411200BA26F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFD77E6D20C23F8600A3638D /* Build configuration list for PBXNativeTarget "FilmLeader" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFD77E6E20C23F8600A3638D /* Debug */,
+ AFD77E6F20C23F8600A3638D /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFDA659E178A52B70070D24B /* Build configuration list for PBXNativeTarget "Unknown Pleasures" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFDA659F178A52B70070D24B /* Debug */,
+ AFDA65A0178A52B70070D24B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFE2A4670E2E904600ADB298 /* Build configuration list for PBXNativeTarget "SkyTentacles" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFE2A4680E2E904600ADB298 /* Debug */,
+ AFE2A4690E2E904600ADB298 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFE30BF90E52B14700CCF4A5 /* Build configuration list for PBXNativeTarget "Sonar" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFE30BFA0E52B14700CCF4A5 /* Debug */,
+ AFE30BFB0E52B14700CCF4A5 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFE6A1940CDD7B2E002805BF /* Build configuration list for PBXNativeTarget "MoebiusGears" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFE6A1950CDD7B2E002805BF /* Debug */,
+ AFE6A1960CDD7B2E002805BF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFE6A42A0CDD7FAA002805BF /* Build configuration list for PBXNativeTarget "Abstractile" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFE6A42B0CDD7FAA002805BF /* Debug */,
+ AFE6A42C0CDD7FAA002805BF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFEC23DF1CB6EAE100DE138F /* Build configuration list for PBXNativeTarget "DymaxionMap" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFEC23E01CB6EAE100DE138F /* Debug */,
+ AFEC23E11CB6EAE100DE138F /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFEE105F1D13406000AAC8F7 /* Build configuration list for PBXNativeTarget "CubeTwist" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFEE10601D13406000AAC8F7 /* Debug */,
+ AFEE10611D13406000AAC8F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFEE107E1D15EB0800AAC8F7 /* Build configuration list for PBXNativeTarget "CubeStack" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFEE107F1D15EB0800AAC8F7 /* Debug */,
+ AFEE10801D15EB0800AAC8F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFEE109D1D17E20B00AAC8F7 /* Build configuration list for PBXNativeTarget "Splodesic" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFEE109E1D17E20B00AAC8F7 /* Debug */,
+ AFEE109F1D17E20B00AAC8F7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFF2868F17860E830050A578 /* Build configuration list for PBXNativeTarget "QuasiCrystal" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFF2869017860E830050A578 /* Debug */,
+ AFF2869117860E830050A578 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFF3C9F817CCAC440028F240 /* Build configuration list for PBXNativeTarget "Geodesic" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFF3C9F917CCAC440028F240 /* Debug */,
+ AFF3C9FA17CCAC440028F240 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFF463440C4403E400EE6509 /* Build configuration list for PBXNativeTarget "CWaves" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFF463450C4403E400EE6509 /* Debug */,
+ AFF463460C4403E400EE6509 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFF463690C440AEF00EE6509 /* Build configuration list for PBXNativeTarget "GLCells" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFF4636A0C440AEF00EE6509 /* Debug */,
+ AFF4636B0C440AEF00EE6509 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ AFFAB32619158CE40020F021 /* Build configuration list for PBXNativeTarget "ProjectivePlane" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ AFFAB32719158CE40020F021 /* Debug */,
+ AFFAB32819158CE40020F021 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ C01FCF4E08A954540054247B /* Build configuration list for PBXProject "xscreensaver" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C01FCF4F08A954540054247B /* Debug */,
+ C01FCF5008A954540054247B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ CE3D01631B76F4C100993C75 /* Build configuration list for PBXNativeTarget "TestX11" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ CE3D01641B76F4C100993C75 /* Debug */,
+ CE3D01651B76F4C100993C75 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
+}
diff --git a/OSX/xscreensaver_Prefix.pch b/OSX/xscreensaver_Prefix.pch
new file mode 100644
index 0000000..07c8c89
--- /dev/null
+++ b/OSX/xscreensaver_Prefix.pch
@@ -0,0 +1,33 @@
+/* Prefix header for all source files of the 'xscreensaver' project.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/time.h>
+
+#include <TargetConditionals.h>
+
+#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
+# undef USE_IPHONE
+# define USE_IPHONE
+# define HAVE_JWZGLES
+#endif
+
+#ifdef __OBJC__
+# ifdef USE_IPHONE
+# import <Foundation/Foundation.h>
+# import <UIKit/UIKit.h>
+# else
+# import <Cocoa/Cocoa.h>
+# endif
+#endif
+
+#include "jwxyz.h"
+
+# ifdef USE_IPHONE
+# include <OpenGLES/ES1/gl.h>
+# include <OpenGLES/ES1/glext.h>
+#else
+# include <OpenGL/gl.h>
+#endif
diff --git a/README b/README
new file mode 100644
index 0000000..af3f949
--- /dev/null
+++ b/README
@@ -0,0 +1,1615 @@
+
+ XScreenSaver
+
+ a collection of
+ free screen savers
+ for X11, macOS,
+ iOS and Android
+
+ By Jamie Zawinski
+ and many others
+
+ https://www.jwz.org/xscreensaver/
+
+===============================================================================
+
+This is the XScreenSaver source code distribution. It is strongly recommended
+that you install a binary release rather than trying to compile it yourself.
+Executables are available for almost all platforms, including macOS, iOS, and
+Android. See the XScreenSaver web site for details.
+
+To compile for a Unix system with X11:
+
+ ./configure
+ make
+ make install
+
+ If you are on an "apt"-based system, "apt-get build-dep xscreensaver"
+ might install most of the compilation dependencies.
+
+To compile for macOS X or iOS:
+
+ Use the included XCode project. Requires XCode 6 and macOS 10.8
+ or newer.
+
+To compile for Android:
+
+ See android/README.
+
+Interested in writing a new screen saver?
+
+ See the README.hacking file.
+
+===============================================================================
+
+XScreenSaver has an extensive manual -- please read it!
+
+===============================================================================
+
+5.40 * New hacks, 'filmleader', 'vfeedback'.
+ * New hack, 'glitchpeg' (X11 and macOS only).
+ * GLPlanet blends between day and night maps at the dusk terminator.
+ * DymaxionMap can display arbitrary map images, and animate sunlight
+ across the flattened globe.
+ * Tessellimage can draw either Delaunay or Voronoi tilings.
+ * XAnalogTV includes test cards.
+ * Android: These hacks work now: 'blitspin', 'bumps', 'cityflow',
+ 'endgame', 'esper', 'flipscreen3d', 'gleidescope', 'glslideshow',
+ 'jigglypuff', 'queens', 'tessellimage', 'xanalogtv', 'xmatrix',
+ 'zoom'.
+
+5.39 * New hacks, 'razzledazzle', 'peepers', 'crumbler' and `maze3d'.
+ * More heuristics for using RSS feeds as image sources.
+ * Android: Image loading works.
+ * Built-in image assets are now PNG instead of XPM or XBM.
+ * X11: Better font-loading fallback heuristics on systems with a
+ terrible selection of installed fonts.
+ * macOS: Retina display-related bug fixes.
+
+5.38 * New hack, 'esper'.
+ * macOS: Support for Retina displays.
+ * X11: `webcollage' now works with ImageMagick instead of with
+ pbmtools if `webcollage-helper' is not installed.
+ * 'bsod' now accepts Dunning-Krugerrands.
+ * Android: These hacks work now: 'anemone', 'anemotaxis', 'atlantis',
+ 'bouboule', 'celtic', 'compass', 'crackberg', 'epicycle',
+ 'fuzzyflakes', 'goop', 'kumppa' 'munch', 'pacman', 'polyominoes',
+ 'slip'.
+ * Android: Thick lines work better for: 'anemone', 'anemotaxis',
+ 'celtic', 'compass', 'deluxe', 'epicycle', 'fuzzyflakes', 'pacman'
+ * Android: Assorted performance improvements, especially for 'kumppa'
+ and 'slip'.
+ * Android TV: Daydreams work.
+ * iOS: Tweaks for iPhone X.
+ * Lots of xlockmore-derived hacks now have animated erase routines.
+ * 'crystal' works properly on non-X11 systems.
+ * 'm6502' now includes 'texture.asm'.
+ * X11: Try harder to find sensible fonts for the password dialog.
+
+5.37 * New hack, `vigilance'.
+ * Added Mac Software Update and VMware to `bsod'.
+ * macOS: Grabbing the desktop works again.
+ * macOS: Pinch to zoom.
+ * Android: Both Daydreams and Live Wallpapers are implemented.
+ * Updated `webcollage' for recent changes.
+ * Various bug fixes.
+
+5.36 * New hacks, `discoball', `cubetwist', `cubestack', `splodesic'
+ and `hexstrut'.
+ * macOS: loading image files works in `dymaxionmap', `glplanet',
+ `lavalite', `pulsar', `gleidescope' and `extrusion'.
+ * Several new programs in `m6502'.
+ * `rotzoomer -mode circle'.
+ * Better titles in `photopile'.
+
+5.35 * New hacks, `dymaxionmap', `unicrud', `energystream', `raverhoop'
+ and `hydrostat'.
+ * Added Windows 10 to `bsod'.
+ * X11: ignore WM_USER_TIME property changes with days-old timestamps.
+ Thanks, KDE.
+ * macOS, iOS: Better fonts in `bsod' and `memscroller'.
+ * macOS 10.8 or later and iOS 6.0 or later are now required, since
+ Xcode 6 can no longer build executables that work on older OSes.
+ * Many, many Android improvements.
+ * iOS: Fixed rotation to work with the new iOS 8+ API.
+ * X11: `pong' is now playable.
+
+5.34 * Fixed a crash when hot-swapping monitors while locked.
+ * Fixed some incorrect output from `xscreensaver-command -watch'.
+ * Various macOS and iOS performance improvements.
+
+5.33 * New hacks, `splitflap' and `romanboy'.
+ * Better detection of user activity on modern GNOME systems.
+ * Sonar now does asynchronous host name resolution.
+ * Improved Unicode support.
+ * Updated `webcollage' for recent changes.
+ * Various minor fixes.
+
+5.32 * Fixed some X11 compilation problems.
+ * Fixed display size and shake gestures on iOS.
+ * macOS/iOS Performance improvements.
+
+5.31 * New hacks, `geodesicgears', `binaryring' and `cityflow'.
+ * UTF-8 text support (instead of only Latin1) and antialiased text
+ on X11 with Xft (instead of only on macOS/iOS) in `fontglide',
+ `noseguy', `fliptext', `starwars', and `winduprobot'.
+ The other text-displaying hacks (`apple2', `phosphor', `xmatrix',
+ and `gltext') also now accept UTF-8 input, though they convert it
+ to Latin1 or ASCII.
+ * `glplanet' now has both day and night maps, and a sharp terminator.
+ * Fixed `webcollage' on macOS.
+ * Fixed a transparency glitch in `winduprobot'.
+ * `lockward' works on iOS.
+ * Text and image loading work on macOS 10.10.
+ * Rotation works properly on iOS 8.
+ * Added a search field on iOS.
+ * Preliminary, unfinished support for Android.
+
+5.30 * New hack, `winduprobot'.
+ * Many improvements to `lament', including Leviathan.
+ * Fixed the normals in `flyingtoasters': shading is correct now.
+ * Implemented TEXTURE_GEN in GLES: flying toast is now toasted on iOS.
+ * Make cel-shading sort-of work in `skytentacles' on iOS.
+ * Fixed dragging-to-rotate on rotated iOS devices, I think.
+ * Dragging has inertia now.
+ * Most hacks respond to mouse-clicks, double-taps and swipes as
+ meaning "do something different now".
+ * Reworked OpenGL fonts.
+ * The macOS auto-update installer wasn't working. This time for sure?
+ * Various minor fixes.
+
+5.29 * Downgraded to Xcode 5.0.2 to make it possible to build savers
+ that will still run on 10.6 and 10.7. Sigh.
+ * Updated `webcollage' for recent changes.
+
+5.28 * Fixed some compilation problems and intermittent crashes.
+ * Turned off the macOS 10.6 enable_gc hack. It didn't work.
+
+5.27 * New hacks, `tessellimage' and `projectiveplane'.
+ * Added support for pthreads, because Dave Odell is a madman.
+ * Updated `webcollage' for recent changes.
+ * Minor iOS tweaks to the `analogtv' hacks.
+ * X11: Don't assume Suspend = 0 implies "No DPMS".
+ * Minor updates to `boxed' and `klein'.
+ * Fixed possible crash in `apple2', `noseguy', `xmatrix', `shadebobs'.
+ * Fixed possible crash in macOS preferences.
+ * macOS Performance improvements.
+ * Plugged some leaks.
+
+5.26 * More auto-updater tweaks.
+
+5.25 * Try harder to bypass Quarrantine and Gatekeeper in macOS installer.
+ * Some files were missing from the tarball.
+
+5.24 * Added "Automatically check for updates" option on macOS.
+ * Updated feed-loading for recent Flickr changes.
+ * Updated `webcollage' for recent Google changes.
+ * Added Instagram and Bing as `webcollage' image sources.
+ * Updated to latest autoconf.
+ * Bug fixes.
+
+5.23 * New hack, `geodesic'.
+ * iOS and macOS: huge XCopyArea performance improvements.
+ * More heuristics for using RSS feeds as image sources.
+ * Improved Wikipedia parser.
+ * Updated `webcollage' for recent Flickr changes.
+ * Added Android to `bsod'.
+ * macOS: Added a real installer.
+ * iOS and macOS: fixed a font-metrics bug.
+ * iOS: Fixed aspect ratio bug in non-rotating apps when launched in
+ landscape mode.
+ * Made `quasicrystal' work on weak graphics cards.
+ * iOS: fixed `ifs'.
+ * Better compression on icons, plists and XML files: smaller
+ distribution and installation footprint.
+ * Reverted that DEACTIVATE change. Bad idea.
+ * `Phosphor' now supports amber as well as green.
+
+5.22 * New hacks, `kaleidocycle', `quasicrystal', `unknownpleasures' and
+ `hexadrop'.
+ * Performance improvements for `interference'.
+ * Fixed possible crashes in `apple2', `maze', `pacman', `polyominoes',
+ `fireworkx', `engine'.
+ * Fix for `bumps' in 64 bit.
+ * Fixed preferences crash on old iOS 5 devices.
+ * Fixed "Shake to Randomize"; display name of saver.
+ * Fixed weirdness with "Frame Rate" sliders on iOS.
+ * Fixed rotation problems with `pacman', `decayscreen'.
+ * Better dragging in `fluidballs'.
+ * Ignore rotation in hacks that don't benefit from it.
+ * Ignore DEACTIVATE messages when locked, instead of popping up the
+ password dialog box.
+
+5.21 * Changed default text source from Twitter to Wikipedia, since Twitter
+ now requires a login to get any feeds.
+ * New version of `fireworkx'.
+ * Minor fixes to `distort', `fontglide', `xmatrix'.
+ * New macOS crash in `bsod'.
+ * New mode in `lcdscrub'.
+
+5.20 * Support for iPhone 5 screen size.
+ * Fixed modifier key handing in Apple2.app and Phosphor.app on macOS.
+ * Various minor bug fixes.
+
+5.19 * macOS 10.8.0 compatibility.
+ * iOS performance improvements.
+
+5.18 * iOS responds to shake gestures to randomize.
+ * iOS can load images from your Photo Library.
+ * iOS has clickable Wikipedia links in Settings panels.
+ * Made `pipes' be ridiculously less efficient, but spin.
+ * Added better mouse control to `rubik', `cube21', `crackberg', and
+ `julia'.
+ * Cosmetic improvements to `queens' and `endgame'.
+ * `sonar' can now ping local subnet on DHCP.
+ * Most savers now resize/rotate properly.
+ * Various fixes.
+
+5.17 * More iOS tweaks.
+ * Fixed some compilation problems.
+ * Enlarged the texture image for `lament'.
+
+5.16 * Ported to iPhone and iPad.
+ * XInput devices now also ignore small mouse motions.
+ * Loading images via RSS feeds is much improved.
+ * Various minor fixes.
+
+5.15 * New hacks, `hilbert', `companioncube' and `tronbit'.
+ * Image-manipulating hacks can now load from RSS or Atom feeds:
+ `imageDirectory' may contain a URL.
+ * Updated `webcollage' for recent search engine changes.
+ * `phosphor' and `apple2' can now be run as standalone terminal
+ emulator applications on macOS.
+ * `photopile' sped up.
+ * New molecule in `molecule'.
+ * "Upgraded" to XCode 4.0, which means that macOS 10.4 PPC builds are
+ impossible, and Intel is now required.
+ * Turned on LC_CTYPE on Linux; maybe Japanese password entry works
+ now?
+
+5.14 * Fixed crash in Blank Only Mode when DPMS disabled.
+ * Added "Quick Power-off in Blank Only Mode" option.
+ * BSOD GLaDOS.
+
+5.13 * Optionally enabled full-scene OpenGL antialiasing. Set the resource
+ `*multiSample' to true if doing so doesn't kill performance with
+ your video hardware.
+ * New version of `glhanoi'.
+ * Image-loading hacks that display the file name now also display the
+ sub-directory (xscreensaver-getimage now returns relative paths
+ under imageDirectory).
+ * Passwords that contain UTF-8 non-Latin1 chars are now typeable.
+ * Numerous minor stability fixes.
+
+5.12 * Big speed improvement on macOS for heavy XCopyArea users (`xmatrix',
+ `moire2', `phosphor', etc.)
+ * Plugged a bad macOS-only Pixmap leak.
+ * Kludged around the macOS pty bug that caused text to be truncated in
+ phosphor, starwars, apple2, etc.
+ * New molecule in `molecule'.
+ * `glhanoi' now supports an arbitrary number of poles.
+ * Turned on "New Login" button by default.
+ * Added support for XInput-style alternate input devices.
+
+5.11 * New versions of `photopile', `strange'.
+ * Worked around macOS 10.6 garbage collector bug that caused the
+ screen saver process to become enormous.
+ * Fixed flicker in `pipes', `cubestorm', and `noof'.
+ * Fixed EXIF rotation on macOS 10.6.
+ * Fixed desktop-grabbing when screen locked on macOS.
+ * Minor fixes to `circuit', `polyhedra', `tangram', `gears', `pinion',
+ `substrate', `xanalogtv'.
+ * Fixed some leaks in `xanalogtv' and `apple2'.
+ * Better seeding of the RNG.
+
+5.10 * Fixed some crashes and color problems on macOS 10.6.
+ * Retired `hypercube' and `hyperball', which are redundant with
+ `polytopes'.
+
+
+5.09 * Ported to macOS 10.6, including various 64-bit fixes.
+ * New hack, `rubikblocks'.
+ * Fixed another potential RANDR crash.
+ * Use correct proxy server on macOS.
+ * `molecule' now correctly displays PDB 3.2 files.
+ * Updates to `mirrorblob', `glhanoi', and `sonar'.
+ * Rewritten version of `klein' hack.
+ * New hack, `surfaces', incorporating objects from old `klein' hack,
+ plus new ones.
+ * Merged `juggle' and `juggler3d' hacks.
+ * Fixed compilation under gcc 4.4.0 (strict aliasing).
+ * Fixed intermittent failure in `xscreensaver-command'.
+
+5.08 * New hack, `photopile'.
+ * Rewrote `sonar' and `jigsaw' as OpenGL programs.
+ * Minor tweaks to `maze', `m6502', `hypnowheel', and `timetunnel'.
+ * Savers that load images now obey EXIF rotation tags.
+ * Arrgh, more RANDR noise! Fixes this time for rotated screens, and
+ for systems where RANDR lies and says the screen size is 0x0.
+ * When the password dialog has timed out or been cancelled, don't pop
+ it right back up a second time.
+ * Password timeouts/cancels don't count as "failed logins".
+ * Retired some of the older, less interesting savers: say goodbye to
+ `bubbles', `critical', `flag', `forest', `glforestfire', `lmorph',
+ `laser', `lightning', `lisa', `lissie', `rotor', `sphere', `spiral',
+ `t3d', `vines', `whirlygig', and `worm'.
+ * Merged `munch' and `mismunch'.
+ * Updated `webcollage' to use twitpic.com as well.
+
+5.07 * Xinerama/RANDR tweaks for old-style multi-screen.
+ * Added bumpy skin and cel shading to `skytentacles'.
+ * `flipflop' can load images onto the tiles.
+ * Fixed the bouncing ball in `stairs'.
+ * Added the missing Utah Teapotahedron to `polyhedra'.
+ * `blitspin' works with color images on macOS now.
+ * Added transparency to `stonerview'.
+ * Improved layout of the preferences dialogs: they should all now be
+ usable even on ridiculously tiny laptop screens.
+ * macOS preferences text fields now prevent you from entering numbers
+ that are out of range.
+ * Added "Reset to Defaults" button on X11.
+ * Added relevant Wikipedia links to many of the screen saver
+ descriptions.
+ * All hacks support the `-fps' option, not just GL ones.
+ * The `-fps' option now shows CPU load.
+
+5.06 * Xinerama/RANDR fixes: this time for sure. It should now work to
+ add/remove monitors or resize screens at any time.
+ * New hack, `skytentacles'.
+ * New version of `gleidescope'.
+ * Added the `-log' option to the xscreensaver daemon, since a truly
+ shocking number of Linux users seem to have no idea how to redirect
+ output to a file.
+ * Added `-duration' arg to most image-loading hacks, so that they pick
+ a new image every few minutes.
+ * Added an ATM crash to `bsod'.
+
+5.05 * New hacks, `cubicgrid', `hypnowheel', and `lcdscrub' (which isn't
+ really a screen saver).
+ * Updates to `m6502' and `gears'.
+ * Fixed double-buffering problems in `cubestorm' and `noof'.
+ * Better handling of horizontal scroll wheels.
+ * Attempt to work around latest Xinerama braindamage: if the server
+ reports overlapping screens, use the largest non-overlapping
+ rectangles available.
+ * Don't warning about receipt of bogus ClientMessages, since Gnome's
+ just never going to stop sending those.
+ * Worked around macOS 10.5 perl bug that caused the text-displaying
+ hacks to fail on some systems.
+ * Hopefully fixed font-related System Preferences crashes in macOS
+ savers.
+ * The recent PAM changes broke the "Caps Lock" warning in the password
+ dialog, the failed login warnings, and syslogging. Fixed all that.
+
+5.04 * Fixed a possible crash in the unlock dialog (more fallout from the
+ recent PAM changes...)
+ * New hacks, `moebiusgears', `abstractile', and `lockward'.
+ * Rewrote `gears' to use better (involute) gear models, and to be more
+ random.
+ * Minor updates to `cwaves', `voronoi', `deco', `glcells', `rd-bomb',
+ `fireworkx' and `webcollage'.
+ * `pong' can now display the current time as the score.
+ * `xmatrix -mode pipe' works better.
+ * Minor tweaks for compilation on macOS 10.5.0.
+
+5.03 * New hacks, `cwaves', `glcells', `m6502', and `voronoi'.
+ * Minor fixes to `bsod'.
+ * Fixed possible crash with PAM USB-dongle auth.
+ * Updated `webcollage' to track recent Google Images and Flickr
+ changes.
+
+5.02 * Reworked PAM code to support fingerprint readers, etc.
+ * Ported `webcollage' to macOS.
+ * Added macOS 10.2 and 10.3 kernel panics to `bsod'.
+ * Fixed a Xinerama crash when changing the screen count.
+ * New blobbier `mirrorblob'.
+ * Minor updates to `lisa', `bsod', `ifs', `hypertorus', `polytopes',
+ `circuit', `endgame', `crackberg', `flipflop', `flipscreen3d',
+ `fliptext', and `carousel'.
+ * Enabled multi-threaded OpenGL on macOS.
+
+5.01 * Backed out recent locale-related changes, since they broke far more
+ things than they fixed.
+ * Fail gracefully with ridiculously small window sizes.
+ * `xflame' and `flag' ignore bitmap option on macOS.
+ * `speedmine' prefs work on macOS.
+ * Better explosions in `boxed'.
+ * More dynamic motion in `sproingies'.
+ * More options in `flipflop'.
+ * Minor updates to `topblock'.
+ * Various other minor fixes.
+
+5.00 * Ported to macOS! (10.4.0 or newer)
+ * API change: instead of providing a single screenhack() function that
+ does not return, screen savers using the screenhack.h framework must
+ now provide "init" and "draw one frame" functions instead. All
+ bundled savers have been updated; third-party patches will need
+ work.
+ * All image-loading happens asynchronously.
+ * xscreensaver-getimage-file caches the contents of the image
+ directory for a few hours, so consecutive runs won't have to re-list
+ the whole directory tree.
+ * New hacks, `topblock' and `glschool'.
+ * Removed `xteevee' (superceded by `xanalogtv').
+ * Added variable-sized puzzle pieces to `jigsaw'.
+ * Changes to the defaults and command-line options of many hacks to
+ make the .xml files more consistent.
+ * Reap zombies in `glslideshow' and `carousel'.
+ * `sonar' works without setuid on macOS (dgram icmp).
+ * `xmatrix -mode pipe' displays the text of a subprocess.
+ * `endgame' has higher resolution chess-piece models.
+ * `webcollage' takes a -directory option to get images from a local
+ directory.
+ * The RPM spec file no longer auto-restarts xscreensaver when a new
+ version is installed. Restart it manually.
+
+4.24 * New versions of `cube21', `glsnake', `celtic'.
+ * Backed out a DPMS-related patch that cause desktop flickering with
+ some X servers.
+ * Fixed startup crash in getgroups() when running setuid.
+ * Default to not displaying stderr on the saver window.
+ * Fixed bad free() in "Documentation" button.
+ * Don't try to run hacks that aren't installed.
+ * Minor fixes to various XML config files and man pages.
+
+4.23 * New hacks, `glhanoi', `cube21', `timetunnel', `juggler3d', and
+ `celtic'.
+ * New versions of `tangram', `webcollage', `hypertorus', `polytopes',
+ and `ripples'.
+ * `sonar' is now quiet about unresolvable hosts.
+ * Minor corrections to BASIC code in `apple2'.
+ * xscreensaver-demo now provides an RPM clue when none of the hacks
+ seem to be installed.
+ * Don't install `ant' by default, since there is some Java tool of
+ that name, which was causing confusion. And also it's boring.
+ * Made screen grabbing work again on macOS 10.4.2.
+ * No longer prints bogus warnings about ClientMessages intended for
+ the window manager.
+ * Ignore unprintable characters in passwd entry field.
+ * Fixed yet another cross-host-display image-loading endian problem.
+ * `xscreensaver-command -watch' and `-time' now work on 64-bit
+ machines.
+
+4.22 * Fixed a bug in the new mouse-motion code that caused the screen to
+ never blank on multi-head non-Xinerama systems. Oops.
+ * New hacks, `interaggregate', `antmaze', `tangram', and `crackberg'.
+ * Minor tweaks to `fiberlamp', `ifs', `slidescreen', `zoom', `sonar',
+ `fireworkx', `whirlwindwarp', `bubble3d', and `rd-bomb'.
+ * Added motion blur to `blinkbox'.
+ * `bsod' now includes Longhorn's "RSOD", and OS/2.
+ * Fixed `-wireframe' usage in most hacks and man pages.
+
+4.21 * New hack: `fliptext'.
+ * Changed default configure installation directories: /usr/bin/ for
+ xscreensaver, etc.; /usr/libexec/xscreensaver/ for hacks;
+ /usr/share/xscreensaver/config/ for xml files.
+ * All the text-manipulating screen savers can have their text source
+ configured via `xscreensaver-demo' now.
+ * xscreensaver.spec now builds three RPMs: base (no hacks); extras (2d
+ hacks); and gl-extras.
+ * Added `-program' and `-front' option to `gltext'.
+ * Added `-shells' to `molecule'.
+ * Fixed text-alpha glitch in `carousel'.
+ * New `pacman': the ghosts can be killed now.
+ * Fixed a bug in screen-grabbing GL hacks where images would be tiled
+ instead of scaled on machines that can't do large textures.
+ * `webcollage' can hit Flickr now.
+ * New (rewritten) implementation of `ifs'.
+ * The unlock dialog can be made to have a "New Login" button that will
+ run `gdmflexiserver'. Experimental!
+ * Fixed non-ASCII display bug in `starwars'.
+ * Configure finds a default for imageDirectory.
+ * "xscreensaver-command -lock" now works even if in "screensaver
+ disabled" mode.
+ * If a bad password is typed while CapsLock is on, the unlock dialog
+ says "CapsLock?" instead of "Sorry".
+ * Mouse motion only counts as activity if the mouse moved more than 10
+ pixels (so the screen won't unblank every time you bump your desk.)
+ * New mode option "random-same": if you have multiple monitors, this
+ will run the *same* randomly chosen hack on each screen, instead of
+ different ones on each.
+
+4.20 * New hacks, `fiberlamp', `boing', `boxfit', and `carousel'.
+ * Rewrote `glslideshow' again: should be faster now.
+ * Sped up loading of images in GL programs.
+ * `starwars' uses texture-mapped fonts now.
+ * New `bsod' modes: tru64, hppa, and nvidia.
+ * Updates to `webcollage', `juggle', `pinion', `fireworkx', `sonar',
+ `extrusion', `substrate', and `pong'.
+
+4.19 * New hacks, `substrate', `intermomentary', `fireworkx', and `pinion'.
+ * New version of `flow'.
+ * Made /proc/interrupts work again on Linux 2.6.
+ * Made `analogtv' not hog the CPU.
+ * Made analogtv-based hacks work properly on PPC/ARM.
+ * Fixed a bad memory leak in `piecewise'.
+ * Minor updates to `sonar', `molecule', `glmatrix', `galaxy', and
+ `webcollage'.
+ * Removed support for GTK 1.x (everyone uses 2.x now.)
+
+4.18 * Oops, pay no attention to the man behind the curtain.
+
+4.17 * New hacks, `anemotaxis' and `memscroller'.
+ * Fixed a bad bug that caused `vidwhacker' to never die.
+ * Fixed normals and lighting in `polyhedra'.
+ * Don't reuse the window when changing hacks (to work around bugs in
+ some GL implementations.)
+ * Made `xscreensaver-getimage-file' skip thumbnail-sized images.
+ * Fixed endian problem in `barcode' on non-x86.
+ * Updates to `webcollage', `apple2', `fuzzyflakes', `atunnel', and
+ `pacman'.
+ * Timing tweaks to `bubble3d', `bouncingcow', `engine', `gltext',
+ `lavalite', `molecule', `spotlight', `sballs', `boxed', `blinkbox',
+ and `circuit'.
+ * Configure updates for Fedora core 2 / xorg 6.7.0.
+ * Compile without warnings under gcc 3.3.3.
+ * I give up: don't blank or lock the screen if we can't get a keyboard
+ grab. In that case, both choices are bad.
+
+4.16 * New hacks, `polyhedra', `fuzzyflakes', `antinspect', and
+ `providence'.
+ * Minor updates to `webcollage', `bsod', `endgame', `antspotlight',
+ `xmatrix', and `glmatrix'.
+ * Added support for the RANDR (Resize and Rotate) extension to detect
+ when the size of the desktop has been changed while xscreensaver is
+ already running.
+ * Possibly-futile attempt to work around "rdesktop" focus/grab idiocy.
+ * Made `xscreensaver-getimage -file' still work even if imageDirectory
+ is unset.
+ * Convert Latin1 to ASCII in `starwars' and `phosphor' (since the GLUT
+ font only has ASCII glyphs.)
+ * Fixed randomization in `noof'.
+ * Added "GetViewPortIsFullOfLies" preference to work around
+ longstanding XFree86 bug #421.
+ * Made `sonar' subnet pinging work properly on bigendian machines
+ (e.g., PPC.)
+
+4.15 * New hacks, `wormhole', `mismunch', `noof', and `pacman'.
+ * `phosphor' and `apple2' include vt100 emulators now: this means you
+ can do "phosphor -program top", or can use either program as an
+ xterm replacement: "apple2 -text -fast -program 'xemacs -nw'".
+ * `analogtv' (and related) fill the screen better.
+ * The '-gradient' option works in `atlantis' now.
+ * Minor updates to `blinkbox', `queens', `endgame', `glmatrix',
+ `mirrorblob', `blocktube', and `molecule'.
+ * Integrated SuSE's "external passwd helper" support.
+ * Marginally better /tmp handling in various programs.
+ * Updated config defaults for xplanet 1.0.3.
+ * Portability fixes.
+
+4.14 * New hacks, `fontglide', `apple2', `xanalogtv', `pong',
+ `gleidescope', `mirrorblob', and `blinkbox'.
+ * New version of `glsnake' (with many more models.)
+ * Another Windows crash in `bsod'; also HVX/GCOS6/TPS6.
+ * New version of `endgame'.
+ * Screen grabbing works on macOS.
+ * Various minor fixes.
+
+4.13 * On Xinerama systems, xscreensaver now runs one hack on each monitor
+ (just like in "real" multi-head mode) instead of running one hack
+ stretching across all the screens. Note that for this to work with
+ any 3rd party screensavers, they must update their "vroot.h" file.
+ * `webcollage' and `vidwhacker' display images using
+ `xscreensaver-getimage' now.
+ * Added `ljlatest' script for use with `starwars' and `phosphor'.
+
+4.12 * New GL hacks, `flipflop', `antspotlight', and `polytopes'.
+ * Added VMS to `bsod'.
+ * Compile without warnings in "gcc -pedantic".
+ * Updates to `webcollage' and `queens'.
+ * Fixed a bug that could cause PAM to hang.
+
+4.11 * New hacks, `hypertorus', `cubestorm', `glknots', `blocktube', and
+ `glmatrix'.
+ * Updates to `cloudlife', `engine', `xmatrix', and `sonar'.
+ * Rewrote `glslideshow': it should work on somewhat wimpier video
+ cards now.
+ * Various portability tweaks.
+
+4.10 * New hacks, `cloudlife' and `klein'.
+ * Added Apple ][+, HPUX, and OS/390 sessions to `bsod'.
+ * Added some Matrix Reloaded text to `xmatrix'.
+ * Updates to `webcollage', `eruption', `jigglypuff', `metaballs', and
+ `endgame'.
+ * Completely ignore the `memoryLimit' setting now, since it was still
+ causing people GL grief.
+ * Various minor fixes.
+
+4.09 * New hacks, `flyingtoasters', `bouncingcow', `jigglypuff', and
+ `glslideshow'.
+ * More models in `engine'.
+ * Rewrote `xscreensaver-getimage' to remove reliance on external image
+ loaders (xv, chbg, xloadimage, etc.) and to reduce flicker when
+ loading files.
+ * Made `gflux' and `flipscreen3d' be mouse-spinnable.
+
+4.08 * New hacks, `atunnels' and `piecewise'.
+ * Physics improvement in `fluidballs'.
+ * Various fixes for XDarwin systems (X11 on macOS.)
+ * Added -clock option to `barcode'.
+ * Minor fixes to `endgame', `flurry', `flipscreen3d', and `gflux'.
+
+
+4.07 * New hacks, `flurry', `metaballs', `eruption', `popsquares', and
+ `barcode'.
+ * Minor updates to `maze' for high density mazes.
+ * Added double buffering to `fluidballs' and `whirlygig'.
+ * Bug fixes for running xscreensaver to a remote XFree86 display
+ (which nobody would ever do...)
+ * Updated `webcollage' (faster Alta Vista searching.)
+ * Updated `glplanet' so the sun sets in the west.
+ * Updated `sproingies' with smooth, unsegmented surfaces.
+ * Fixed Perl version-sensitivity in `xscreensaver-getimage-file'.
+ * Fixed GTK2 scrolling bug in `xscreensaver-demo'.
+
+4.06 * New hack, `glblur' (disabled by default, since it requires fast
+ OpenGL texture support.)
+ * New hack, `halftone'.
+ * Updates to `endgame', `queens', `bumps', `glplanet', `engine', and
+ `circuit'.
+ * New version of `menger' that uses far fewer polygons.
+ * Fixed minor bug in `critical' that could cause some bogus X servers
+ to crash.
+ * Better labels in `molecule': the labels now appear to be attached to
+ the atoms, instead of floating in front of the whole scene.
+ * Fixed bug that could rarely cause GL hacks to fail to double-buffer
+ (causing intermittent flickering.)
+ * Fixed a relative-URL-parsing bug in `webcollage'.
+ * Fixed a bug that (sometimes) caused the window manager close box to
+ kill `xscreensaver-demo' with a crash instead of a graceful exit.
+ * Updated xscreensaver.pam to the Red Hat 7.3 way.
+ * More Gnome2-related configure crap.
+ * Updated to latest `config.guess' and `config.sub'.
+ * Fixed occasional core dump in `distort'.
+ * Added a Linux fsck failure and kernel panic to `bsod'.
+ * Added macOS kernel panic to `bsod'.
+ * Fixed a bug in `bsod' (all bsod bugs are ironic.)
+ * Fixed a bug that caused `xscreensaver-gl-helper' to print a nonsense
+ visual ID with some versions of `printf': this could cause GL
+ programs to display incorrectly (e.g., flickery.)
+
+4.05 * More `configure' tweaks to try and get things working on systems
+ that both Gtk 1.x and 2.x installed.
+ * New hack, `endgame'.
+ * Minor updates to `gltext'.
+
+4.04 * Support for GTK 2.x / GNOME 2.x.
+ * The `configure' script will now use `pkg-config' if you have it, in
+ preference to `gtk-config', etc.
+ * New hacks, `lavalite', `queens', and `anemone'.
+ * Minor updates to `spheremonics', `gltext', `xmatrix'.
+ * You can use the mouse to manually spin most of the GL hacks now
+ (when they are displaying in a window.)
+ * Fixed a bug in `webcollage' (due to recent Alta Vista url changes)
+ that was causing it to try and load incorrect image URLs.
+ * Made `xscreensaver-getimage' use gdk_pixbuf if it is available: this
+ means that those hacks that load images will no longer rely on "xv",
+ "xloadimage", etc. This will close a race condition that could
+ sometimes cause your desktop background to be changed; and also
+ makes it possible for those programs to operate on image files when
+ running in windowed mode.
+ * `webcollage' can now be used in conjunction with `driftnet' to
+ display images snooped from your local ethernet instead of obtained
+ from search engines.
+ * Added man pages for all the hacks that didn't have them.
+
+4.03 * New hack, `spheremonics'.
+ * Minor updates to `webcollage', `cage', `moebius', `morph3d',
+ `boxed', `circuit', and `helix'.
+ * `pulsar' and `extrusion' can now load texture JPEGs.
+ * `rubik' now does non-square cubes.
+ * `fluidballs' now does various sizes of balls.
+ * `menger' and `sierpinski3d' now also show polygon counts in -fps
+ mode.
+ * `molecule' displays real subscripts in the formulae.
+ * GTK internationalization/localization support.
+ * Better detection of the various versions of libxml.
+ * Upgraded to autoconf 2.53 (from 2.13.)
+
+4.02 * Plugged a few minor leaks in `xscreensaver' and `xscreensaver-demo'.
+ * New hacks, `cubenetic' and `fluidballs'.
+ * Sped up `pipes'.
+ * Fixed sphere projection error in `glplanet'; installed a better
+ image of earth.
+ * Added Win2K and MacOS 1 crashes to `bsod'.
+ * Put back previous (better) version of `forest' that was
+ accidentially downgraded in the last release.
+ * New version of `bumps'.
+ * Made FPS computation in GL hacks more efficient: it will influence
+ the results less, thus resulting in higher (but more accurate)
+ reported frame rates.
+
+4.01 * New hacks: `twang', `glsnake', `boxed', `sballs', and
+ `glforestfire'.
+ * New hacks `apollonian', `euler2d', `juggle', `polyominoes' and
+ `thornbird', from xlockmore.
+ * Merged recent xlockmore changes into `ant', `braid', `demon',
+ `discrete', `drift', `fadeplot', `forest', `grav', `hopalong',
+ `ifs', `laser', `lightning', `lisa', `lissie', `loop', `mountain',
+ `penrose', `rotor', `sierpinski', `slip', `sphere', `spiral',
+ `strange', and `vines'.
+ * Fixed the `gltext' bug that sometimes caused horizontal lines to
+ vanish again. This time for sure.
+ * Sped up `webcollage' by adding a C helper program to replace the PPM
+ pipeline. It also pastes images semi-transparently now.
+ * Added support for the gdk_pixbuf library: if this lib is available,
+ then `blitspin', `xflame', and `flag' can load GIF, JPEG, and PNG
+ images in addition to XPM and XBM.
+ * Fixed a rare race condition where the desktop-grabbing hacks could
+ sometimes leave the screen wedged, if the user moved the mouse
+ exactly when they were grabbing the screen image (it would un-wedge
+ the next time the saver timed out or was activated.)
+ * Fixed incorrect colors in the screen-grabbing GL hacks (`gflux' and
+ `flipscreen3d'.)
+ * Made SIGHUP restart the daemon process (though using
+ `xscreensaver-command -restart' is still the preferred way.)
+ * Tweaks to `xspirograph'.
+ * Minor configure and portability tweaks.
+
+4.00 * Redesigned `xscreensaver-demo' GUI: it now includes small-preview
+ and per-hack configuration dialogs.
+ * Added three new modes of operation: `One Screen Saver', `Blank
+ Screen', and `Don't Blank' (in addition to the historical `Random
+ Screen Saver').
+ * Configure now defaults to installing the hacks in
+ <prefix>/lib/xscreensaver/ instead of <prefix>/bin/. (Most distros
+ already did it this way.)
+ * New GL hacks, `menger', `engine', `flipscreen3d'.
+ * Made `sierpinski3d' be more colorful.
+ * New versions of `xmatrix' and `nerverot'.
+ * Fixed a bug in `starwars' that made the font be drawn with thin
+ lines in -root mode.
+ * Fixed a bad colormap bug in `crystal' that could make *subsequent*
+ hacks malfunction!
+ * Made `gflux' able to grab screen images (`-mode grab').
+ * Updated `webcollage' for recent search engine changes.
+ * Removed most command-line options to `xscreensaver': just edit the
+ ~/.xscreensaver file instead.
+ * Improved behavior on multi-screen and Xinerama systems: the mouse
+ now stays on the screen where the user left it, and the password and
+ splash dialogs always appear on the screen that has the mouse.
+ * Made the splash dialog use more Gtk-like colors; made it have only
+ two buttons, "Settings" and "Help".
+ * Made `sonar' understand `.ssh/known_hosts2' format files, and be
+ better about stripping out illegal addresses.
+
+3.34 * Turned `memoryLimit' off by default, sigh. Apparently some versions
+ of the GL libraries (appear to) allocate hundreds of megs for every
+ GL program, so `memoryLimit' was causing GL programs to malfunction
+ or crash on those systems.
+ * Improved fading on TrueColor XFree86 4.1.x systems.
+ * New GL hack, `circuit'.
+ * Added `fuzz' mode to `decayscreen'.
+ * New version of `whirlygig'.
+ * Added links to `xplanet' and `sphereEversion'.
+ * Fixed rare race condition that could make `sonar' hang.
+ * Fixed potential crash in `speedmine'.
+ * Made `xscreensaver-demo' not crash when imageDirectory was set to a
+ non-existent directory.
+ * Made `xscreensaver-getimage-video' invoke XawTV's `streamer' program
+ better.
+ * Made `phosphor' and `starwars' deal with CR, LF, or CRLF line
+ endings.
+ * Changes for Cygwin compilation environments.
+ * Made `sonar' compile on systems that can't ping.
+ * Configure changes for HPUX 10.20.
+ * Made PAM code work on Red Had 4.2 systems.
+ * Made `xscreensaver-command -deactivate' work when the saver is not
+ active: what that does is reset the idle timer, as if keyboard input
+ had been detected. This was added for the benefit of people writing
+ DVD-playing software: they can now prevent the screensaver from
+ kicking in by sending a -deactivate message once a minute while the
+ movie is playing and not paused.
+ * Various minor portability tweaks.
+
+3.33 * New hacks, `speedmine' and `whirlygig'.
+ * Sped up `pyro', made the explosions look a bit better.
+ * Added better stars to `glplanet' and `starwars'.
+ * Many internal changes to `webcollage'.
+ * Some new options to `attraction'.
+ * Minor fix to `noseguy' to avoid un-erased pixels.
+ * Rewrote the screen-eraser effects so that they complete in the same
+ amount of time regardless of how slow your X server is (some of them
+ were glacial on servers with slow blitting.)
+ * Fixed a potential free memory reference that could sometimes cause a
+ crash at startup.
+ * Possibly fixed a problem that could cause the daemon to crash with
+ an X error. I was never able to reproduce this problem, but I think
+ I might have figured out what caused it.
+ * Worked around a problem that caused PAM authentication to fail on
+ some Red Hat 7.x systems.
+ * Added a `memoryLimit' parameter that controls the amount of memory a
+ graphics hack may allocate: if they try to allocate more than this,
+ malloc() will fail (and they will exit or (safely) crash, rather
+ than hogging memory.) Default is 50M.
+ * Made `gnome-help-browser' be the default way to display man pages in
+ `xscreensaver-demo', if running on a GNOME system.
+
+3.32 * The image-manipulating hacks (`slidescreen', etc.) can now operate
+ on randomly chosen image files from disk, or on frames captured from
+ the system's video input, instead of (or in addition to)
+ manipulating images of the desktop.
+ * Rewrote `vidwhacker' to use the new image-grabbing mechanism.
+ * Made fading work on TrueColor XFree86 4.x systems.
+ * Fixed a subtle rendering bug in `atlantis' (the fish were inside
+ out!)
+ * Made `atlantis' have a texture simulating light reflections from the
+ surface of the ocean.
+ * Fixed up label placement in `molecule'.
+ * Better color bars in `xteevee'.
+ * Made `install-strip' not try to strip scripts.
+
+3.31 * Put in more sensible defaults for DPMS, and updated the
+ documentation to reflect the fact that all your DPMS settings are
+ now belong to xscreensaver.
+ * Fixed the `xscreensaver.spec' file so that `--force' is no longer
+ needed.
+ * New versions of `rotzoomer' and `nerverot'.
+ * Fixed an OSF/1 compilation problem in `molecule'.
+
+3.30 * New hacks, `molecule', `dangerball', and `rotzoomer'.
+ * New version of `gflux'.
+ * Made `gltext' able to display the current time.
+ * Fixed a floating-point-precision problem in `gltext' that sometimes
+ caused horizontal lines to vanish.
+ * Removed the `-window-id' option from the hacks: it never worked
+ right, and was unnecessary.
+ * Made the `starwars' hack use thicker lines, antialias the text, and
+ fade out at the far edge instead of just dropping off.
+ * Fixed an SHM segment leak in `moire'.
+
+3.29 * Better rendering of the new logo.
+ * New hack, `gltext'.
+ * Added `-planetary' option to `gears', to draw a different kind of
+ gear system.
+ * Made motion and rotation be smoother in `gears', `glplanet',
+ `moebius', `rubik', and `sierpinski3d'.
+ * Improved coloration in `sierpinski3d'.
+ * Made the GL hacks react to window size changes.
+ * Made most of the GL hacks take a -fps option (like `pulsar' did), so
+ you can use them to benchmark your 3D hardware.
+ * Fixed the previous fix to `sonar'.
+ * Minor fix to `nerverot'. Made sonar able to ping hosts on DEC OSF1.
+ * Eliminated a bogus "didn't get enough colors" warning in some of the
+ hacks.
+
+3.28 * New logo for xscreensaver!
+ * New hacks, `starwars' and `stonerview'.
+ * Made the motion of the bouncing ball in `stairs' be a little less
+ jerky.
+ * Made newly-added screenhacks be added to .xscreensaver
+ automatically: if there are hacks in the app-defaults file that are
+ not also in ~/.xscreensaver, they will be added to the end of the
+ list.
+ * Redid the `Screensaver Options' part of the control panel;
+ xscreensaver now lets you configure your DPMS settings.
+ * Fixed some Makefile problems with non-GL builds.
+ * Fixed detection of MesaGL for version 3.3.
+ * Better workaround to Red Hat 7.0's broken gcc.
+ * Added Sparc Solaris kernel panic to `bsod'.
+
+3.27 * New hacks: `zoom' and `whirlwindwarp'.
+ * Fixed a free-memory-reference bug in `sonar'.
+ * Better error handling when there are no suitable GL visuals.
+ * Added diagnostic dialog when xscreensaver-demo is unable to launch
+ xscreensaver (e.g., when running as root.)
+ * Fixed a bug that caused screenhack argument changes to be ignored
+ when xscreensaver-demo was running as root (if "root" and "nobody"
+ have different home directories.)
+ * Made the programs default to ":0" if $DISPLAY is unset.
+ * Made the `-verbose' output include information about which server
+ extensions were supported at compile time.
+ * Worked around Red Hat 7.0's broken gcc 2.96.
+ * Updated default delays on the GL hacks to look better on machines
+ with super-fast 3D hardware.
+ * Install `screensaver-properties-capplet' to work around the usual
+ egregious GNOME lossage.
+
+3.26 * Added "enabled" checkboxes in the list of hacks in xscreensaver-demo
+ (Gtk version only.)
+ * New hacks `hyperball', `xrayswarm', and `gflux'.
+ * New versions of `nerverot', `galaxy', and `hypercube'.
+ * Small fixes to `phosphor', `shadebobs', `xflame', and `sonar'.
+ * Added external helper program `xscreensaver-gl-helper' to figure out
+ which X visual to use for OpenGL programs.
+ * Configure updates for XFree86 4.0, and for BSD.
+ * Made it be more tolerant of bogus /etc/group files.
+ * When installing the PAM config file, first try to just copy an
+ existing "xdm" or "login" config file, so that xscreensaver does
+ authentication in the same way as the rest of the system.
+
+3.25 * New hack, `nerverot'.
+ * Added BSD kernel panic to `bsod'.
+ * New version of `shadebobs'.
+ * New version of `petri'.
+ * Updated `webcollage' to handle recent Altavista URL format changes;
+ made it search the AP photo gallery.
+ * Revamped command-line options of `sonar' and made it properly handle
+ subnets.
+ * The `bubbles' hack can now trickle up or down the screen.
+ * The `xsublim' hack can now read its text from programs.
+ * Support for GLE version 3 in `extrusion'.
+ * Fixed compilation problems in `maze'.
+ * Fixed a rare crash in `flow'.
+ * Fixes for minor installation problems.
+
+3.24 * Added `-ignorant' option to `maze' hack.
+ * Updates to `critical', `bsod', `xflame', and `flow'.
+ * Added support for Kerberos 5 (via its Kerberos 4 compatibility
+ layer.)
+ * Fixed a bad leak in `xteevee'.
+ * Updated `webcollage' to handle recent Altavista URL format changes.
+ * Removed xscreensaver-demo's `Ok' and `Cancel' buttons, since they
+ were confusing people: all changes are now instantanious.
+ * Made xscreensaver-demo install itself into the Gnome Control Center.
+
+3.23 * Fixed some misplaced text fields in the Motif version of
+ xscreensaver-demo; fixed a crash in the Gtk version that would
+ happen if the programs list was empty.
+ * Fixed a recently-introduced bug in `pulsar'.
+ * Made `sierpinski3d' use solid tetrahedrons instead of points.
+ * Added `-trace' option to `xmatrix'.
+ * Added new hacks `xteevee' and `xspirograph'.
+
+3.22 * Fixed some bugs in xscreensaver-demo.
+ * Rewrote the Motif version of xscreensaver-demo to match the new Gtk
+ version.
+ * The Athena toolkit is no longer supported.
+
+3.21 * Tweaked the xscreensaver-demo UI (Gtk only.)
+ * Fixed a few visual selection bugs. I think the proper GL visual
+ should be used with nVidia systems now.
+ * Made the Makefiles obey $install_prefix.
+ * Made the `xscreensaver.spec' file able to generate both GL and
+ non-GL packages simultaneously.
+
+3.20 * Added new hacks `ripples' and `sierpinski3d'.
+ * Made `xscreensaver-command -exit' be silent when no screen saver was
+ running (instead of complaining.)
+ * Made `webcollage' and `vidwhacker' use `xloadimage' when available
+ (in addition to `xli' and `xv'.)
+ * Improved memory usage in `petri' and gave it a hard cap on how much
+ memory it can allocate.
+ * Added `-watch' option to `xscreensaver-command'.
+ * Made `xscreensaver-demo' come up with the most-recently-run hack
+ selected by default.
+ * Rewrote the Gtk version of `xscreensaver-demo'. It's a lot easier
+ to use now.
+ * Extended the format of the programs list in the .xscreensaver file,
+ for the benefit of the new capabilities of `xscreensaver-demo'.
+ NOTE: you might want to delete your ~/.xscreensaver file and allow
+ it to be re-created! The old one should still work, but
+ xscreensaver-demo won't be as pretty.
+
+3.19 * Fixed gcc dependencies in `bumps' and `ccurve'.
+ * New hack, `extrusion'.
+ * Some of the web sites that `webcollage' was using as its sources
+ changed formats; tweaked it to understand the current layouts.
+ * Added typeahead in the password dialog: if the screen is locked, and
+ you unlock it by typing a character, that key will be automatically
+ inserted in the password dialog (unless it is Return, Enter, Space,
+ or a non-printing key like Shift.)
+ * Made `xmatrix' take a `-small' option, since some folks with tiny
+ screens prefer a smaller font.
+
+3.18 * New versions of `shadebobs', `lmorph', and `distort'.
+ * Added `ccurve', `blaster', and `bumps' hacks.
+ * Replaced `forest' hack with a rewritten version.
+ * Worked around a Xinerama server bug.
+ * Fixed a bug I introduced in 3.10 that caused some hacks to print out
+ superfluous warnings about not having gotten enough colors.
+ * Made `sproingies' obey the `-delay' option.
+ * Fixed a portability bug in `shadebobs'.
+ * Made `webcollage' and `vidwhacker' use `xli' in preference to `xv',
+ if it is available.
+ * Added a new source of images to `webcollage'.
+ * If running under KDE, xscreensaver will add itself to KDE's list of
+ screensavers (via xscreensaver.kss.)
+ * Improved detection of GL libraries.
+ * Made the password dialog include the date and time.
+
+3.17 * New version of `webcollage' -- deals better with corrupted images,
+ and can use an http proxy.
+ * New hack, `xsublim' (run it in the background, rather than adding it
+ to the programs list.)
+ * The xscreensaver daemon was leaking a file descriptor each time you
+ edited your .xscreensaver file. Fixed.
+
+3.16 * New version of `shadebobs'.
+ * Improved image selection in `webcollage', and sped it up slightly.
+ * Made configure find the right version of perl.
+ * Rewrote the CGI part of `webcollage'.
+ * `make clean' was deleting some things it shouldn't.
+ * Fixed a typo in the default programs list.
+
+3.15 * Added `webcollage' and `shadebobs' hacks.
+ * Added a `-stdout' arg to `vidwhacker' so that it can be used in a
+ pipeline.
+ * Made `petri' use less memory.
+
+3.14 * Various improvements to the Gtk port.
+ * Turned off PAM by default on Solaris, since PAM seems generally to
+ be misconfigured out-of-the-box.
+ * Made the `--without-gtk' configure option work.
+ * Made configure check the Gtk version number, since it requires 1.2.
+ * Fixed a bug in the code that attempted to prevent changes of screen
+ resolution while the screen is locked.
+ * Fixed a race condition in `xscreensaver-demo' that could cause an X
+ error at startup.
+ * Added `-transparent' option to `deluxe'.
+ * Added `petri' hack.
+
+3.13 * Ported `xscreensaver-demo' to Gtk.
+ * Made it possible to build Motif, Gtk, and Athena versions of
+ `xscreensaver-demo' in the same directory without reconfiguring.
+ * Made `xscreensaver-demo' chase symlinks before writing the
+ .xscreensaver file, so that if .xscreensaver is itself a symlink,
+ the underlying file will be replaced instead.
+ * Some Makefile and configure tweaks for Solaris and FreeBSD.
+ * Made it possible to set the fire color in `xflame'.
+ * Made transparency work in TrueColor (for `goop' and `qix'.)
+ * Fixed a multi-head bug introduced by the virtual viewports stuff.
+
+
+3.12 * Made it so that you can't scroll the screen while the lock dialog is
+ up (with XFree86 virtual viewports.)
+ * Fixed a bug in `flag' that caused bob's chin to get cut off after a
+ few iterations.
+
+3.11 * Made `xjack' be black-on-white-ish, so that it looks less like a
+ computer screen and more like the typewritten paper it's supposed to
+ be.
+ * New version of `pulsar'.
+ * Fixed Solaris compilation problem in `phosphor'.
+ * Made xscreensaver notice XFree86's virtual root window hack, so that
+ if the X server's root window is larger than the monitor's
+ displayable resolution, the screen saver will limit itself to the
+ area that actually appears on the screen.
+ * Made the xscreensaver daemon do a better job of picking the visual
+ class that should be used for GL programs. Less user intervention
+ should be needed now: you can use the logical visual name `GL'
+ instead of having to figure out by hand which one to use.
+ * Oops, the visual was defaulting to "best" instead of
+ "default", because the .xscreensaver file was not being
+ loaded quite early enough.
+ * Made configure figure out how to build icmp ping support into the
+ `sonar' hack automatically.
+ * Made warnings about not being able to read shadow passwords not be
+ printed if compiled with PAM support.
+ * Improved PAM startup diagnostics.
+ * Worked around the Solaris PAM bug that was causing crashes there, so
+ now PAM is turned on by default.
+ * Made configure detect the number of arguments that pam_strerror()
+ takes, since on Linux, this apparently changed between 2.0 and 2.2,
+ sigh.
+ * Made the /proc/interrupts kludge look for "PS/2 Mouse" as well as
+ "keyboard".
+ * Made xscreensaver notice when there has been a sudden large jump in
+ wall-clock time, and if so, lock right away, instead of waiting for
+ "lockTimeout" to expire first. (Laptops need this for safer
+ recovery from ``hibernation.'')
+ * Added `-throttle' option to `xscreensaver-command'.
+
+3.10 * Added `phosphor', `xmatrix', and `pulsar' hacks.
+ * Fixed a bug in the color allocator that sometimes caused `starfish'
+ to fall back to monochrome.
+ * Reduced the amount of code that runs before root privileges are
+ disavowed: "normal" and "shadow" passwords now do some
+ initialization as root, but the PAM and Kerberos authorization
+ schemes will be initialized while running as "nobody". Supposedly
+ this closes a potential security hole when using Kerberos.
+ * Added some more sanity checking to configure.
+
+3.09 * Added `compass', `squiral', `xflame', `wander', `spotlight', and
+ `critical' hacks.
+ * Added some new modes to `decayscreen'.
+ * Made `deluxe' work in monochrome.
+ * Generalized usage of the Double-Buffer server extension in several
+ hacks (`compass', `deluxe', `interference', `kumppa', and `moire2'.)
+ * Fixed another visual-depth problem in `rd-bomb'.
+ * The screen saver will now defer blanking if neither the keyboard nor
+ the mouse could be grabbed. Instead, it will just try again in a
+ few minutes. This fixes a bad interaction between xscreensaver and
+ programs like VMware that hold the mouse and keyboard grabbed for a
+ long time.
+ * Added a new erase mode (expanding spiral.)
+
+3.08 * Fixed some bugs in my port of `t3d'.
+ * Added `penetrate' and `deluxe' hacks.
+ * When linking against Motif 2.x, also link against XPM.
+ * Added support for using /proc/interrupts for idle detection on
+ Linux. Now xscreensaver shouldn't kick in when the user is active
+ on a non-X virtual console.
+ * Upgraded to autoconf 2.13.
+
+3.07 * Configure tweaks (sometimes -lXmu wasn't getting linked in properly;
+ check for _Xsetlocale in -lXintl.)
+ * Portability fixes for sonar.c.
+ * Fixed a compilation problem when you have GL but don't have XPM.
+ * Made configure notice when MesaGL requires -lpthread.
+ * Made `flame' ignore SIGFPE (not sure if this is the right fix; it
+ seems only to be needed on FreeBSD.)
+ * Kludged `rd-bomb' work on visuals that are of depth 24 but that *do
+ not* support pixmaps of depth 32.
+ * Fixed `halo' to work properly in TrueColor.
+ * Changed `xscreensaver.spec' to install the hacks in
+ /usr/X11R6/lib/xscreensaver/ by default, since that's where recent
+ Red Hat distributions put them.
+ * Added `t3d' hack.
+ * Updated versions of `crystal', `hopalong', and `flow' from
+ xlockmore.
+ * Imported `demon' and `loop' modes from xlockmore.
+
+3.06 * Oops, the "default-n" visual descriptor was broken; it was always
+ installing a colormap if the `installColormap' preference was set,
+ meaning that `xearth', `xv' and friends were using the wrong colors
+ on 8-bit systems.
+ * Turned off HAVE_PING in `sonar', since it compiles on some Linux
+ systems, but not others of similar vintage...
+
+3.05 * Fixed an off-by-1 in `distort'.
+ * Added `sonar' hack.
+ * New version of `glplanet' (with stars.)
+ * Made all hacks exit when you type `q' or `ESC' at them, and made
+ them obey the WM_DELETE_WINDOW ClientMessage.
+ * Fixed a nonfatal buffer overrun in lament (note: lament still
+ doesn't work with MesaGL 3.0: it dies in
+ lambda_textured_triangle1(), which is Mesa's bug, not mine.)
+
+3.04 * Added an `xscreensaver.spec' file, to make it easier for other folks
+ to generate RPMs.
+ * Made the password code work on HPUX in the situation where:
+ ``enhanced security'' is available; but not used; but the user typed
+ a password more than 8 characters long anyway. FTSOHPUX.
+
+3.03 * Made locking work when passwd aging is enabled.
+ * Added support for PAM (Pluggable Authentication Modules.) It is
+ still turned off by default, though, since it doesn't seem to work
+ on Solaris 2.6, and has been behaving erratically on Red Hat 5.1.
+ * Made each possible authentication method be tried in turn until one
+ succeeds; this means that Kerberos is being used, we will first
+ check Kerberos, and if that fails, will then consult the local
+ password file. Likewise with PAM.
+ * Save and restore the bits under the passwd dialog, to avoid leaving
+ a black rectangle behind when unlocking is cancelled.
+
+3.02 * Not everyone has sys/select.h, sigh...
+
+3.01 * Some fixes to `reflect'.
+ * Configure tweaks.
+ * Made it log unsuccessful attempts to unlock the screen to syslog.
+ * Fixed a bug where `xscreensaver-demo' could be seeing a different
+ programs list than `xscreensaver' did.
+
+3.00 * The xscreensaver daemon no longer links against Motif or Athena:
+ demo-mode and the preferences panel are no longer built in to the
+ daemon, but are now handled by an external program,
+ `xscreensaver-demo'. (I decided that this, along with the recent
+ addition of the `.xscreensaver' config file, justified bumping the
+ version number to 3.00, since this is a fairly major architectural
+ change.)
+ * Lines in the `*programs' resource may now begin with the character
+ "-", meaning "don't run this hack." In this way, it's possible to
+ disable a hack without throwing away the information about it
+ (making it easier to change your mind later.) Eventually the
+ preferences/demo mode GUI should represent this as a checkbox or
+ something.
+ * Fixed a short race condition where it was possible for xscreensaver
+ to die with a BadWindow error if it was blanking the screen just as
+ another window was being deleted.
+ * Made it possible to disable specific modes in `bsod'.
+
+2.34 * Fixed a bug that was making `pipes' generate way too many valves.
+ Made the viewpoint in `pipes' be selected randomly instead of always
+ being -10 degrees.
+ * Fixed a bug in the XSHM code, in the case where the server supports
+ the XSHM extension but is not the same machine as the client.
+ * Made `rd-bomb' default to taking up the whole screen.
+ * Made it not try to do fading/unfading if no PseudoColor visuals
+ exist.
+ * Initial attempt at supporting VT-locking (doesn't work yet.)
+ * Eliminated the `captureStdout' resource; now `captureStderr'
+ controls both streams.
+ * Added `-capture-stderr' and `-no-capture-stderr' command-line
+ arguments.
+ * Added `glplanet' hack.
+ * When a hack is selected with `xscreensaver-command -select', that
+ hack will be used until further notice (until the saver turns off,
+ or another activation command is issued.)
+
+2.33 * Made `xscreensaver-command' print error messages: the xscreensaver
+ daemon now responds to ClientMessage events by writing a response
+ message on a window property, instead of just writing to its stderr.
+ * Made the ~/.xscreensaver file be automatically reloaded when the
+ file date changes.
+ * The password dialog and splash screen no longer depend on Motif or
+ Athena. This should clear up a number of focus problems, and is the
+ first step on the path toward moving all of the
+ Motif/Athena/whatever code out of the xscreensaver daemon, and into
+ external processes.
+ * Don't complain about LessTif 0.86 any more, since the new password
+ dialog makes that problem go away.
+ * Configure tweaks for Irix 6.5, SunOS 5.something.
+ * New `-reflect' option to `distort'.
+
+2.32 * Added reading and writing of a ~/.xscreensaver file, so that the
+ Preferences panel can save its settings.
+ * New version of `rubik'.
+ * Added `-select N' argument to `xscreensaver-command'.
+ * Oops, left out some of the `bubbles3d' files...
+
+2.31 * The cursor was invisible in the password dialog. Fixed.
+ * Made configure warn against MesaGL 2.6.
+ * Fixed X error at startup when using non-default visual.
+ * New version of `crystal', `ant', and `atlantis' from xlockmore.
+ * New hack, `bubble3d'.
+ * Added some new modes to `bsod'.
+
+2.30 * Changed the order in which -lSM and -lICE are linked to be after
+ Motif instead of before (Lesstif on Irix needs this.)
+
+2.29 * Work around a bash bug in configure.
+ * Tweaked HPUX paths again. FTSOHPUX.
+ * Made configure recommend against LessTif 0.86, due to a bug in that
+ version that causes a security hole in the screen locking code.
+ LessTif 0.87 will fix it.
+ * Made all of the `--with' options to `configure' accept a directory
+ option as well (so that --with-motif=/FOO will add -I/FOO/include
+ -L/FOO/lib). I believe this is the Configure Party Line of how do
+ to such things.
+ * Fixed a bug where the mouse was left un-grabbed after the first time
+ the graphics hack was changed (simplified all of the mouse-grabbing
+ logic.)
+ * Maybe possibly perhaps made `vidwhacker' really not leave stray xv
+ windows around. This time for sure.
+ * Added a new erase mode (random dots fizzling out.)
+ * Added `-prefs' argument to `xscreensaver-command', that brings up
+ the Preferences dialog directly (it seems that nobody ever noticed
+ the `Preferences' button on the Demo Mode dialog, maybe this will
+ help.)
+ * Added a splash screen. Turn it off with *splash:false.
+
+2.28 * Better macsbug text in `bsod'.
+ * New version of `distort' with many new modes.
+ * Plugged a leak in `coral'.
+ * Tweaked configure for HPUX.
+ * Removed some compiler warnings.
+ * More consistent usage of stderr versus stdout.
+ * More diagnostics should an X error occur.
+ * Fixed a possible crash in SGI-specific unfading code.
+
+2.27 * Improved version of `distort'.
+ * Made `lament' compile against OpenGL 1.0 (though it still requires
+ 1.1 to work properly.)
+ * Updated my email address and home page.
+
+2.25 * Improved motion in `rd-bomb'.
+ * Added XSHM (shared memory extension) support to the `distort',
+ `interference', `moire', `rd-bomb', and `swirl' hacks, which speeds
+ them up a bit.
+ * Added `lament' hack.
+
+2.24 * Tweaked the order of the -L options again.
+ * Cleaned up configure's `--help' message.
+ * Added `kumppa' hack.
+ * Smarter maze-solving algorithm in `maze'.
+ * Took `xlyap' out of the default list of hacks, since it's just
+ incredibly buggy (and slow.) Maybe someday someone will fix it...
+ * Added `distort' hack, but didn't add it to the default list (yet)
+ because it's still too slow.
+ * Made the Athena demo dialog look more like the Motif version; it has
+ a text-entry field now, too.
+ * Made the Athena password dialog echo asterisks, like Motif does,
+ instead of using a flyspeck font.
+ * Some random configure tweaks.
+ * Added a `timestamp' resource that makes the `-verbose' messages
+ include the time at which they were printed.
+
+2.23 * The fix for SGI's ``scheme'' nonsense broke things, and let the
+ user's "*background" resource show through. Fixed it in a different
+ way.
+
+2.22 * Added support for the DPMS server extension (Display Power
+ Management System.)
+ * Made configure advertize the `--enable-subdir' option a little more,
+ since that seemed to cause some people stress. Also, made that
+ directory be built into the xscreensaver executable, as a hardcoded
+ prefix to $PATH. (Might help, shouldn't hurt.)
+ * Made configure prefer the two-arg gettimeofday to the one-arg
+ version, since AIX doesn't have any prototypes.
+ * Made it work with Xaw3d (the 3D Athena library.)
+ * Made `make install' create directories as necessary.
+ * New version of lmorph from Sverre.
+ * Added `crystal' and `discreet' hacks from xlockmore.
+ * Added a new mode to `bsod'.
+
+2.21 * Made `xscreensaver-command -time' use different words. (It now
+ describes the two states as "screen blanked since..." and "screen
+ non-blanked since..." instead of "active since..." and "inactive
+ since..." which a lot of people interpreted as meaning the opposite
+ of what was intended.)
+ * Improved some error messages, in the hopes of making the distinction
+ between the xscreensaver and xscreensaver-command programs more
+ obvious.
+ * Rewrote (and reorganized) parts of the xscreensaver and
+ xscreensaver-command manual pages.
+ * Renamed xscreensaver's `-lock' command-line option to be
+ `-lock-mode', to avoid confusion with the `-lock' option to
+ xscreensaver-command, which does a totally different thing.
+ * Removed xscreensaver's `-demo' command-line option for a similar
+ reason; use `xscreensaver-command -demo' instead.
+ * Disabled SGI's ``scheme'' nonsense in a better way than
+ fully-qualifying the background colors in every single hack.
+ * Fixed some other minor cosmetic problems when *sgiMode is turned on.
+ * Fixed an X error in `bsod -root' (how ironic...)
+
+2.20 * Fixed a bug that caused the mouse to sometimes not be grabbed
+ properly (meaning the window manager menu could pop up over the
+ demo-mode display.)
+ * Fixed a bug that made the stderr output sometimes get printed twice.
+ * Fixed a bug that made the demo-mode scrollbar move too fast.
+ * Protected against a possible buffer overflow.
+ * Made `vidwhacker' not leave stray xv windows around.
+ * New version of `ant' so that Bagley doesn't calve.
+ * Make configure on AIX get XShm from the right library.
+
+2.19 * One file was missing from the tar file.
+
+2.18 * Oops, atlantis wasn't being built by default.
+ * Added `epicycle' hack.
+ * Added `interference' hack.
+ * Added `truchet' hack.
+ * Added `bsod' hack.
+ * Added some new modes to `vidwhacker'.
+
+2.17 * Added a -window-id argument to most hacks, so that they can draw on
+ arbitrary externally-provided windows.
+ * Synched with xlockmore 4.11a01.
+ * Added `flow' hack.
+ * Added `atlantis' GL hack.
+ * Renamed `puzzle' hack to `jigsaw', since xlock already had a
+ different mode called `puzzle'.
+ * Made it self-configure properly when Motif 2.1.0 is being used
+ (requires -lXp now, sigh...)
+
+2.16 * Made `flag' able to do XPM images.
+ * New look for the xscreensaver logo (`xroger').
+ * Fixed compilation error on Suns with adjunct passwords.
+ * Got multi-architecture builds working again.
+ * Some configure tweaks for building on HPUX and Solaris.
+ * Fixed bug in decayscreen.
+ * Fixed typo in passwd.c.
+ * Made `cynosure' not die when colormap is full.
+
+2.15 * Added `cynosure' hack.
+ * Added `moire2' hack.
+ * Tweaked `erase.c' some more.
+ * Made unfading a bit smoother.
+ * Added `vidwhacker' hack (not installed by default.)
+ * Added `stairs' hack.
+ * Split `escher' into `cage' and `moebius', as per xlockmore.
+ * Changed subprocess handling to use sigaction() instead of signal()
+ if it's available (this is necessary for SCO but should work fine on
+ other systems too.)
+ * Various other tweaks.
+
+2.14 * Better fix for the Motif drag-and-die lossage.
+ * Put in some kludges to work around a LessTif bug.
+ * XScreenSaver is known to work with LessTif 0.82 now.
+ * Made fading work on high-end SGI video hardware.
+ * Fixed another SGI-specific bug in screen grabbing; will the madness
+ never cease?
+ * Fixed another crash in `xlyap'.
+
+2.13 * Made `decayscreen' do directions other than down.
+ * Improved `puzzle'.
+ * Fixed a crash in `xlyap'.
+ * Added CDE info to the man page, removed `cde.txt'.
+ * Configure tweaks for Zippy.
+ * Turned off the signal handling in `bubbles' because it was sometimes
+ failing to die.
+ * Added `hacks/xscreensaver-sgigl.c' to make it possible to run SGI's
+ ElectroPaint hack (/usr/demos/bin/ep) with xscreensaver. Finally!
+ * Fixed a buffer overrun in the locking code that some wily, malicious
+ cracker must have slipped in.
+ * Disabled Motif drag-and-drool in the dialog box buttons, since it's
+ broken in some old versions of Motif.
+
+2.12 * Added `README.debugging'.
+ * Added `puzzle' hack.
+ * Added `xlyap' hack.
+ * Added `default-n' as a visual name, so that one can have -install on
+ by default, but turn it off for certain poorly-behaved hacks (like
+ xv.)
+ * Added support for grabbing frames of external video (on SGI) to the
+ screen-grabbing hacks (decayscreen, slidescreen, slip, blitspin, and
+ puzzle.)
+ * Improved look of tiles in `slidescreen'; fixed its color allocation
+ problem.
+
+2.11 * Tweaked `blitspin', added it to the default list.
+ * Added `lissie', `mountain', `triangle', `worm', `rotor', and `ant'
+ from xlockmore.
+ * Updated `sierpinski', `galaxy', and `lisa'.
+ * Thickened the lines in `braid' and `lmorph'.
+ * Updated VMS makefiles.
+ * Renamed `fract' to `vines'.
+ * Added `xjack' hack.
+ * Made a few more hacks use erase.c, and added a few more wipe styles.
+ * Fixed compilation problem with Sun's version of OpenGL.
+ * Added ability to use sigaction() instead of signal()
+ to work around a SCO kernel bug.
+
+2.10 * Fixed colormap bugs in `rd-bomb'; sped up `coral'.
+ * Configure tweaks for *BSD.
+
+2.08 * New hacks `rd-bomb' and `coral'.
+ * New version of `maze' with some new algorithms.
+ * New colorized version of `rocks'.
+ * Fixed a bug in qix on 64-bit machines.
+ * Fixed a bug in the -time option.
+ * Fixed a bug in configure related to LessTif.
+
+2.07 * Minor header tweaks in windows.c and flag.c.
+ * Made multi-architecture ($VPATH) builds work properly.
+ * Merged new GL stuff from xlockmore (rubik, morph3d.)
+ * Fixed intermittent crashes in `imsmap' and `munch'.
+ * Added `fadeplot' hack from xlockmore.
+
+2.06 * Merged in VMS support from Patrick Moreau.
+
+2.05 * Fixed a MIT-SCREEN-SAVER-related crash, and tweaked
+ configure to detect the extra-random -Xss library.
+
+2.04 * HP configure tweaks. Detect and warn about LessTif.
+ * Fixed low-color behavior of `goop', `pyro', `starfish',
+ `greynetic', `flame', `halo', and `moire'.
+
+2.03 * Fixed flicker in `pipes'. Fixed 3d in `bouboule'.
+ * Added `munch' hack.
+ * Added basic dependencies to the Makefile.in files.
+
+2.02 * Fixes for compiling with the MIT saver extension.
+ * Made the yow/fortune program be a configure option.
+ * Various configure tweaks.
+
+2.01 * Added `goop' and `starfish' hacks.
+ * Added colomap cycling to `halo'.
+ * Made `attraction' use the new colormap allocator.
+ * Added better $PATH diagnostics.
+ * There was a bug in frand! Color selection should be much improved
+ now.
+
+2.00 * Converted to use `configure' instead of `imake'.
+ * ANSI C is now required.
+ * Added Kerberos locking support, from Nat Lanza.
+ * Made the stderr text use overlay planes, if possible.
+ * Reworked the xlockmore compatibility stuff again.
+ * Added `gears', `superquadrics', `escher', `pipes', and `sproingies'
+ hacks (depend on OpenGL.)
+
+1.34 * Fixed some bugs, made fading be a little smoother.
+
+1.33 * Made it work with multi-headed displays.
+ * Generalized sub-process management (Unix sucks!)
+ * Added interactive mouse frobbing to Julia.
+ * Added (untested) support for HPUX shadow passwords.
+ * Made normal non-shadow passwords be checked if the shadow passwords
+ aren't accessible for some reason.
+
+1.32 * Removed *colorPrograms and *monoPrograms resources: made it possible
+ to specify the desired visual on a per-hack basis.
+ * Cleaned up / restructured the driver: no more globals.
+ * Made the Motif and Athena dialogs share more code.
+ * Probably fixed some Athena colormap-installation bugs.
+ * Fixed screen grabbing (cmap) on SGI 12-bit PseudoColor.
+ * Fixed divide-by-zero in bright random colormaps.
+ * Added an improved version of xlock's `flag' hack.
+ * Made unfading work better, and not flicker on SGIs.
+ * Added `sphere', `forest', `lisa' hacks from xlockmore.
+ * Added (untested) support for SunOS Adjunct passwords.
+
+1.31 * Improved colors and colormap cycling of many hacks.
+ * Cleaned up xlockmore compatibility layer.
+ * Made `blitspin' able to grab an image off the screen.
+ * Ported `swirl' and `bouboule' hacks from xlockmore.
+ * Made the driver more careful about not leaving bits on the screen,
+ or allowing other windows to raise themselves: it now re-blanks the
+ screen every so often.
+ * Added `-time' option to `xscreensaver-command'.
+ * Improved SGI screen-grabbing some more: now it can grab TrueColor
+ screens into PseudoColor windows and have the colors still come out
+ semi-reasonably.
+
+1.30 * Made `slidescreen' and `decayscreen' work better on SGIs when
+ windows of different visuals are present, by using the
+ XReadDisplay() extension to get a true 24-bit image out of the frame
+ buffer.
+ * Made `noseguy' be in color, if compiled with XPM.
+ * Ported `braid', `drift', `fract', `galaxy', `grav', `ifs', `julia',
+ `laser', `lightning', `penrose', `sierpinski', `slip', `spiral', and
+ `strange' hacks from xlockmore.
+ * Merged `hopalong' hack with a more recent version.
+ * Added `cde.txt'.
+
+1.28 * Added `deco', `moire', and `kaleidescope' hacks.
+ * Merged in support for non-Motif locking and demo mode.
+ * Made `blitspin' and `bubbles' work in TrueColor.
+ * Fixed a stupid bug I introduced in `imsmap'.
+ * Added `poly' and `gravity' options to `qix'.
+
+1.27 * Added support for SGI SCREEN_SAVER extension.
+ * Made `fade' and `unfade' work on 8-bit SGIs.
+ * Made the dialog boxes more Motify.
+ * Added `bubbles' hack.
+
+1.26 * Added `lmorph' hack.
+ * Added viscosity and mouse-control to attraction.
+ * Fixed possible bad color choices in qix and attraction.
+ * Added ramp-mode to halo.
+ * Added a new RNG, which is faster and more portable than using the
+ RNG in libc.
+ * Made locking work on SCO.
+ * Various other minor tweaks that I don't remember.
+
+1.25 * Made it capture the stdout/stderr of its subprocesses and present
+ them on the screensaver window itself.
+ * Made demo mode work correctly with non-default visuals and color
+ maps, instead of always using the defaults.
+ * Added -visual argument to all included screenhacks.
+ * Support for the R6 MIT-SCREEN-SAVER server extension.
+ * Made the demo mode list scroll properly.
+ * Added `pedal' hack.
+
+1.24 * Fixed some private-colormap oddities in slidescreen, decayscreen,
+ and xroger. Fixed apparent conservation- of-mass problem in pyro;
+ made the shrapnel round.
+
+1.23 * Minor tweaks for IRIX5; fixed locking race condition.
+
+1.22 * Minor tweaks for X11R6.
+ * Fixes for non-default visuals.
+
+1.21 * Fixed bug in color blitspin; added default image.
+ * Added diagnostics to noseguy. Fixed off-by-one error in flame.
+ * Added some missing casts.
+
+1.19 * Added `flame' hack.
+ * Fixed a minor Motif dialog text field bug.
+ * Fixed yet another XPointer-not-defined-in-R4 bug.
+
+1.18 * Added support for shadow password files.
+ * Fixed some Motif-related locking bugs.
+ * Added diagnostics when locking is disabled.
+ * Made blitspin able to use the XPM library.
+ * Added `decayscreen' hack.
+
+1.17 * Added `halo' hack.
+
+1.16 * Portability fixes.
+
+1.15 * Broke the driver up into more source files.
+ * Moved the hacks into their own directory.
+ * Made all `time' parameters accept the 00:00:00 syntax, so that even
+ the parameters which are normally read as minutes can be specified
+ in seconds.
+ * Added colormap cycling to `imsmap'.
+ * Made hyper work with K&R compilers.
+
+1.14 * Added `orbit' option to `attraction' hack.
+ * Added `lock-timeout' option.
+ * Cleaned up options of `maze' hack.
+
+1.09 * Added demo mode, and locking.
+ * Added `maze' hack.
+ * Added `norotate' option to `rocks' hack.
+
+1.05 * Works when run from XDM before anyone logs in.
+ * Sped up `imsmap'.
+ * Can use `xv' as a slideshow without using up colormap entries while
+ the screen is not blanked.
+ * Fixed a BadDrawable error in non-XIdle mode.
+ * Added `blitspin' and `imsmap'.
+
+1.01 * Current list of included hacks is now: qix, helix, rorschach,
+ attraction, greynetic, rocks, pyro, hopalong, and noseguy.
diff --git a/README.VMS b/README.VMS
new file mode 100644
index 0000000..d190344
--- /dev/null
+++ b/README.VMS
@@ -0,0 +1,57 @@
+OpenVMS port of Xscreensavser version 2.10 October 1997
+==========================================
+
+Xscreensaver distribution can be found in 3 subdirectories:
+
+[.DRIVER] The Xscreensaver and Xscreensaver-command programs.
+[.HACKS] Graphic demos ,can be run either through the xscreensaver program
+ or standalone.
+[.UTILS] A small libraries of various utilities.
+
+This port has been tested with VAX VMS 6.1 (compiled with DEC 5 5.0 and
+Motif 1.2) and AXP VMS 6.2 (compiled with DEC C 5.0 and Motif 1.2-4).
+
+To rebuild, you need to rebuild [.UTILS] directory first and create the
+object library (look at the end of COMPILE*.COM procedure).
+
+You can now build the [.HACKS] directory and the [.DRIVER] directory.
+
+A one-step build is now available via the MAKEVMS.COM script.
+
+WARNING : before building [.HACKS], you may need to correct some of the
+DECwindows bitmap files. Some files are bogus !! (they have a long line of
+null chars at the end). These files are under
+SYS$COMMON:[DECW$INCLUDE.BITMAPS] directory:
+
+STIPPLE.XBM
+HLINES2.XBM
+LIGHT_GRAY.XBM
+ROOT_WEAVES.XBM
+VLINES2.XBM
+
+These files are all used by Greynetic demo.
+
+Nota: link procedure automagically select appropriate X and Motif Libraries
+(X11R4/Motif 1.1 - X11R5/Motif 1.2).
+
+The SETUP.COM procedure gives you a definition of all DCL foreign command
+symbols needed to run Xscreensaver and all the graphic hacks. You need to
+modify this procedure if you install these programs in another directory tree.
+
+You can easily add new graphic demos without recompiling Xscreensaver. You just
+need to add them in resource file XSCREENSAVER.DAT. This file (originally
+present in [.DRIVER] directory ) can be installed under your SYS$LOGIN
+directory for a per-user customization basis. You can also install it under
+the system-wide user resource directory SYS$COMMON:[DECW$DEFAULT.USER]
+(with (W:RE) protections). The new graphics hack must be run in root-window
+mode to be accepted by Xscreensaver.
+
+The graphic demos are spawn into subprocess created by the system() call (in
+the Unix version the execvp() call is used).
+
+The VMS passord checking programs were picked up in the Xlock distribution.
+
+Enjoy,
+
+Patrick MOREAU - CENA/Athis-Mons - FRANCE (pmoreau@cena.dgac.fr)
+ (moreau_p@decus.decus.fr)
diff --git a/README.hacking b/README.hacking
new file mode 100644
index 0000000..6fc2fe5
--- /dev/null
+++ b/README.hacking
@@ -0,0 +1,198 @@
+
+==========================================================================
+
+ Writing new XScreenSaver modules
+
+==========================================================================
+
+Any program that can be made to render on an X window created by another
+process can be used as a screen saver. Just get the window ID out of
+$XSCREENSAVER_WINDOW, draw on that, and you're done.
+
+In theory, you can write a screen saver in any language you like. In
+practice, however, languages other than C or C++ tend not to allow you to
+draw to windows that they did not create themselves. Unfortunately, this
+means that if you want to write a screen saver, you must write it in C.
+
+Given that you're going to be writing in C, you might as well take
+advantage of the various utility functions that I have written to make
+that easier. Writing a new screen saver in C using the frameworks
+included with xscreensaver simplifies things enormously.
+
+Generally, the best way to learn how to do something is to find a similar
+program, and play around with it until you understand it. Another
+approach is to not worry about understanding it, but to just hack it out.
+Either way, your best bet is probably to start with one of the existing
+xscreensaver demos, included in the "hacks/" directory, rename the file,
+and edit it until it does what you want.
+
+The "Greynetic" and "Deluxe" hacks are probably good ones to start with,
+since they are so very simple. For OpenGL programs, "DangerBall" is a
+good example.
+
+
+==========================================================================
+Requirements for inclusion with the XScreenSaver collection
+==========================================================================
+
+ If you come up with anything, send it to me! If it's good, I'd love to
+ include it in the xscreensaver distribution. However, there are a few
+ requirements for me to distribute it:
+
+ - Write in portable ANSI C. No C++. No nonstandard libraries.
+
+ - Write a .man page describing all command-line options.
+
+ - Write an .xml file describing the graphical configuration dialog box.
+
+ - Include a BSD-like copyright/license notice at the top of each source
+ file (preferably, just use the one from "screenhack.h", and include
+ your name and the current year). The GNU GPL is not compatible with
+ the rest of XScreenSaver.
+
+
+==========================================================================
+The XScreenSaver API
+==========================================================================
+
+ - Start with #include "screenhack.h"
+
+ - Define 2 global variables:
+
+ yoursavername_defaults -- Default values for the resources you use.
+ yoursavername_options -- The command-line options you accept.
+
+ - Define 5 functions:
+
+ yoursavername_init -- Return an object holding your global state.
+ yoursavername_draw -- Draw a single frame, quickly.
+ yoursavername_free -- Free everything you've allocated.
+ yoursavername_reshape -- Called when the window is resized.
+ yoursavername_event -- Called when a keyboard or mouse event happens.
+
+ The "event" function will only be called when running in a window
+ (not as a screen saver). The "reshape" event will be called when the
+ window size changes, or (as a screen saver) when the display size
+ changes as a result of a RANDR event (e.g., plugging in a new monitor).
+
+ It's ok for both the "event" and "resize" functions to do nothing.
+
+ - All other functions should be static.
+
+ - The last line of the file should be
+ XSCREENSAVER_MODULE ("YourSaverName", yoursavername)
+
+ - Finally, edit the Makefile to add a rule for your program.
+ Just cut-and-paste one of the existing rules.
+
+ Your "draw" must not run for more than a fraction of a second without
+ returning. This means "don't call usleep()". Everything has to be a
+ state machine.
+
+ You may not store global state in global variables, or in function-local
+ static variables. All of your runtime state must be encapsulted in the
+ "state" object created by your "init" function. If you use global or
+ static variables, your screen saver will not work properly on macOS.
+
+ Do not call XSync() or XFlush(). If you think you need to do that, it
+ probably means that you are you are relying on the speed of the graphics
+ card for timing, which probably means that your "draw" function is
+ taking too long.
+
+
+==========================================================================
+The xlockmore API
+==========================================================================
+
+ Some of the display modes that come with xscreensaver were ported from
+ xlock, and so, for historical reasons, they follow a slightly different
+ programming convention. For newly-written Xlib programs, you'd be
+ better off following the pattern used in hacks like "Deluxe" than in
+ hacks like "Flag". The xlockmore ones are the ones that begin with
+ "#ifdef STANDALONE" and #include "xlockmore.h".
+
+ But, all OpenGL screen savers have to follow the xlockmore API.
+
+ The xlockmore API is similar to the XScreenSaver API, in that you define
+ (roughly) the same set of functions, but the naming conventions are
+ slightly different. Instead of "hackname_init", it's "init_hackname",
+ and it should be preceeded with the pseudo-declaration ENTRYPOINT.
+
+ One annoying mis-feature of the xlockmore API is that it *requires* you
+ to make use of global variables for two things: first, for each of your
+ command line options; and second, for an array that holds your global
+ state objects. These are the only exceptions to the "never use global
+ variables" rule.
+
+ There are a few important differences between the original xlockmore API
+ and XScreenSaver's implementation:
+
+ - XScreenSaver does not use refresh_hackname or change_hackname.
+
+ - XScreenSaver provides two additional hooks not present in xlockmore:
+ reshape_hackname, and hackname_handle_event. These are respectively
+ equivalent to hackname_reshape and hackname_event in the XScreenSaver
+ API.
+
+ - Under Xlib, MI_CLEARWINDOW doesn't clear the window immediately.
+ Instead, due to double buffering on macOS/iOS/Android, it waits until
+ after init_hackname or draw_hackname returns before clearing. Make
+ sure not to issue any Xlib drawing calls immediately after a call to
+ MI_CLEARWINDOW, as these will be erased. To clear the window
+ immediately, just use XClearWindow.
+
+
+==========================================================================
+Programming Tips
+==========================================================================
+
+ - Your screen saver should look reasonable at 20-30 frames per second.
+ That is, do not assume that your "draw" function will be called more
+ than 20 times a second. Even if you return a smaller requested delay
+ than that, you might not get it. Likewise, if your "draw" function
+ takes longer than 1/20th of a second to run, your screen saver may be
+ consuming too much CPU.
+
+ - Don't make assumptions about the depth of the display, or whether it
+ is colormapped. You must allocate all your colors explicitly: do not
+ assume you can construct an RGB value and use that as a pixel value
+ directly. In particular, you can't make assumptions about whether
+ pixels are RGB, RGBA, ARGB, ABGR, or even whether they are 32, 24,
+ 16 or 8 bits. Use the utility routines provided by "utils/colors.h"
+ to simplify color allocation.
+
+ - It is better to eliminate flicker by double-buffering to a Pixmap
+ than by erasing and re-drawing objects. Do not use drawing tricks
+ involving XOR.
+
+ - If you use double-buffering, have a resource to turn it off. (MacOS,
+ iOS and Android have double-buffering built in, so you'd end up
+ triple-buffering.)
+
+ - Understand the differences between Pixmaps and XImages, and keep in
+ mind which operations are happening in client memory and which are in
+ server memory, and which cause latency due to server round-trips.
+ Sometimes using the Shared Memory extension can be helpful, but
+ probably not as often as you might think.
+
+ - On modern machines, OpenGL will always run faster than Xlib. It's
+ also more portable. Consider writing in OpenGL whenever possible.
+
+
+==========================================================================
+macOS, iOS and Android
+==========================================================================
+
+ Though XScreenSaver started its life as an X11 program, it also now runs
+ on macOS, iOS and Android, due to a maniacal collection of compatibility
+ shims. If you do your development on an X11 system, and follow the
+ usual XScreenSaver APIs, you shouldn't need to do anything special for
+ it to also work on macOS and on phones.
+
+ See the READMEs in the OSX/ and android/ directories for instructions on
+ compiling for those platforms.
+
+ To check that an X11 saver will fit well on a mobile device, test it
+ with -geometry 640x1136 and 640x960. That's a good first step, anyway.
+
+==========================================================================
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..37e5872
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,717 @@
+# generated automatically by aclocal 1.16.1 -*- Autoconf -*-
+
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
+# Copyright (C) 1995-2002 Free Software Foundation, Inc.
+# Copyright (C) 2001-2003,2004 Red Hat, Inc.
+#
+# This file is free software, distributed under the terms of the GNU
+# General Public License. As a special exception to the GNU General
+# Public License, this file may be distributed as part of a program
+# that contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# This file can be copied and used freely without restrictions. It can
+# be used in projects which are not available under the GNU Public License
+# but which still want to provide support for the GNU gettext functionality.
+#
+# Macro to add for using GNU gettext.
+# Ulrich Drepper <drepper@cygnus.com>, 1995, 1996
+#
+# Modified to never use included libintl.
+# Owen Taylor <otaylor@redhat.com>, 12/15/1998
+#
+# Major rework to remove unused code
+# Owen Taylor <otaylor@redhat.com>, 12/11/2002
+#
+# Added better handling of ALL_LINGUAS from GNU gettext version
+# written by Bruno Haible, Owen Taylor <otaylor.redhat.com> 5/30/3002
+#
+# Modified to require ngettext
+# Matthias Clasen <mclasen@redhat.com> 08/06/2004
+#
+# We need this here as well, since someone might use autoconf-2.5x
+# to configure GLib then an older version to configure a package
+# using AM_GLIB_GNU_GETTEXT
+AC_PREREQ(2.53)
+
+dnl
+dnl We go to great lengths to make sure that aclocal won't
+dnl try to pull in the installed version of these macros
+dnl when running aclocal in the glib directory.
+dnl
+m4_copy([AC_DEFUN],[glib_DEFUN])
+m4_copy([AC_REQUIRE],[glib_REQUIRE])
+dnl
+dnl At the end, if we're not within glib, we'll define the public
+dnl definitions in terms of our private definitions.
+dnl
+
+# GLIB_LC_MESSAGES
+#--------------------
+glib_DEFUN([GLIB_LC_MESSAGES],
+ [AC_CHECK_HEADERS([locale.h])
+ if test $ac_cv_header_locale_h = yes; then
+ AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
+ [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
+ am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
+ if test $am_cv_val_LC_MESSAGES = yes; then
+ AC_DEFINE(HAVE_LC_MESSAGES, 1,
+ [Define if your <locale.h> file defines LC_MESSAGES.])
+ fi
+ fi])
+
+# GLIB_PATH_PROG_WITH_TEST
+#----------------------------
+dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
+dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+glib_DEFUN([GLIB_PATH_PROG_WITH_TEST],
+[# Extract the first word of "$2", so it can be a program name with args.
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL(ac_cv_path_$1,
+[case "[$]$1" in
+ /*)
+ ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in ifelse([$5], , $PATH, [$5]); do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if [$3]; then
+ ac_cv_path_$1="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+ ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
+ AC_MSG_RESULT([$]$1)
+else
+ AC_MSG_RESULT(no)
+fi
+AC_SUBST($1)dnl
+])
+
+dnl Checks for special options needed on Mac OS X.
+dnl Defines INTL_MACOSX_LIBS.
+dnl
+dnl Copied from intlmacosx.m4 in gettext, GPL.
+dnl Copyright (C) 2004-2013 Free Software Foundation, Inc.
+glib_DEFUN([glib_gt_INTL_MACOSX],
+[
+ dnl Check for API introduced in Mac OS X 10.2.
+ AC_CACHE_CHECK([for CFPreferencesCopyAppValue],
+ [gt_cv_func_CFPreferencesCopyAppValue],
+ [gt_save_LIBS="$LIBS"
+ LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <CoreFoundation/CFPreferences.h>]],
+ [[CFPreferencesCopyAppValue(NULL, NULL)]])],
+ [gt_cv_func_CFPreferencesCopyAppValue=yes],
+ [gt_cv_func_CFPreferencesCopyAppValue=no])
+ LIBS="$gt_save_LIBS"])
+ if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
+ AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1],
+ [Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.])
+ fi
+ dnl Check for API introduced in Mac OS X 10.3.
+ AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent],
+ [gt_save_LIBS="$LIBS"
+ LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <CoreFoundation/CFLocale.h>]],
+ [[CFLocaleCopyCurrent();]])],
+ [gt_cv_func_CFLocaleCopyCurrent=yes],
+ [gt_cv_func_CFLocaleCopyCurrent=no])
+ LIBS="$gt_save_LIBS"])
+ if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+ AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1],
+ [Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework.])
+ fi
+ INTL_MACOSX_LIBS=
+ if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+ INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
+ fi
+ AC_SUBST([INTL_MACOSX_LIBS])
+])
+
+# GLIB_WITH_NLS
+#-----------------
+glib_DEFUN([GLIB_WITH_NLS],
+ dnl NLS is obligatory
+ [USE_NLS=yes
+ AC_SUBST(USE_NLS)
+
+ gt_cv_have_gettext=no
+
+ CATOBJEXT=NONE
+ XGETTEXT=:
+ INTLLIBS=
+
+ glib_gt_INTL_MACOSX
+
+ AC_CHECK_HEADER(libintl.h,
+ [gt_cv_func_dgettext_libintl="no"
+ libintl_extra_libs=""
+
+ #
+ # First check in libc
+ #
+ AC_CACHE_CHECK([for ngettext in libc], gt_cv_func_ngettext_libc,
+ [AC_TRY_LINK([
+#include <libintl.h>
+],
+ [return !ngettext ("","", 1)],
+ gt_cv_func_ngettext_libc=yes,
+ gt_cv_func_ngettext_libc=no)
+ ])
+
+ if test "$gt_cv_func_ngettext_libc" = "yes" ; then
+ AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc,
+ [AC_TRY_LINK([
+#include <libintl.h>
+],
+ [return !dgettext ("","")],
+ gt_cv_func_dgettext_libc=yes,
+ gt_cv_func_dgettext_libc=no)
+ ])
+ fi
+
+ if test "$gt_cv_func_ngettext_libc" = "yes" ; then
+ AC_CHECK_FUNCS(bind_textdomain_codeset)
+ fi
+
+ #
+ # If we don't have everything we want, check in libintl
+ #
+ if test "$gt_cv_func_dgettext_libc" != "yes" \
+ || test "$gt_cv_func_ngettext_libc" != "yes" \
+ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then
+
+ AC_CHECK_LIB(intl, bindtextdomain,
+ [AC_CHECK_LIB(intl, ngettext,
+ [AC_CHECK_LIB(intl, dgettext,
+ gt_cv_func_dgettext_libintl=yes)])])
+
+ if test "$gt_cv_func_dgettext_libintl" != "yes" ; then
+ AC_MSG_CHECKING([if -liconv is needed to use gettext])
+ AC_MSG_RESULT([])
+ AC_CHECK_LIB(intl, ngettext,
+ [AC_CHECK_LIB(intl, dcgettext,
+ [gt_cv_func_dgettext_libintl=yes
+ libintl_extra_libs=-liconv],
+ :,-liconv)],
+ :,-liconv)
+ fi
+
+ #
+ # If we found libintl, then check in it for bind_textdomain_codeset();
+ # we'll prefer libc if neither have bind_textdomain_codeset(),
+ # and both have dgettext and ngettext
+ #
+ if test "$gt_cv_func_dgettext_libintl" = "yes" ; then
+ glib_save_LIBS="$LIBS"
+ LIBS="$LIBS -lintl $libintl_extra_libs"
+ unset ac_cv_func_bind_textdomain_codeset
+ AC_CHECK_FUNCS(bind_textdomain_codeset)
+ LIBS="$glib_save_LIBS"
+
+ if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then
+ gt_cv_func_dgettext_libc=no
+ else
+ if test "$gt_cv_func_dgettext_libc" = "yes" \
+ && test "$gt_cv_func_ngettext_libc" = "yes"; then
+ gt_cv_func_dgettext_libintl=no
+ fi
+ fi
+ fi
+ fi
+
+ if test "$gt_cv_func_dgettext_libc" = "yes" \
+ || test "$gt_cv_func_dgettext_libintl" = "yes"; then
+ gt_cv_have_gettext=yes
+ fi
+
+ if test "$gt_cv_func_dgettext_libintl" = "yes"; then
+ INTLLIBS="-lintl $libintl_extra_libs $INTL_MACOSX_LIBS"
+ fi
+
+ if test "$gt_cv_have_gettext" = "yes"; then
+ AC_DEFINE(HAVE_GETTEXT,1,
+ [Define if the GNU gettext() function is already present or preinstalled.])
+ GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+ [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl
+ if test "$MSGFMT" != "no"; then
+ glib_save_LIBS="$LIBS"
+ LIBS="$LIBS $INTLLIBS"
+ AC_CHECK_FUNCS(dcgettext)
+ MSGFMT_OPTS=
+ AC_MSG_CHECKING([if msgfmt accepts -c])
+ GLIB_RUN_PROG([$MSGFMT -c -o /dev/null],[
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: test 1.0\n"
+"PO-Revision-Date: 2007-02-15 12:01+0100\n"
+"Last-Translator: test <foo@bar.xx>\n"
+"Language-Team: C <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+], [MSGFMT_OPTS=-c; AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])])
+ AC_SUBST(MSGFMT_OPTS)
+ AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+ GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+ [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
+ AC_TRY_LINK(, [extern int _nl_msg_cat_cntr;
+ return _nl_msg_cat_cntr],
+ [CATOBJEXT=.gmo
+ DATADIRNAME=share],
+ [case $host in
+ *-*-solaris*)
+ dnl On Solaris, if bind_textdomain_codeset is in libc,
+ dnl GNU format message catalog is always supported,
+ dnl since both are added to the libc all together.
+ dnl Hence, we'd like to go with DATADIRNAME=share and
+ dnl and CATOBJEXT=.gmo in this case.
+ AC_CHECK_FUNC(bind_textdomain_codeset,
+ [CATOBJEXT=.gmo
+ DATADIRNAME=share],
+ [CATOBJEXT=.mo
+ DATADIRNAME=lib])
+ ;;
+ *-*-openbsd*)
+ CATOBJEXT=.mo
+ DATADIRNAME=share
+ ;;
+ *)
+ CATOBJEXT=.mo
+ DATADIRNAME=lib
+ ;;
+ esac])
+ LIBS="$glib_save_LIBS"
+ INSTOBJEXT=.mo
+ else
+ gt_cv_have_gettext=no
+ fi
+ fi
+ ])
+
+ if test "$gt_cv_have_gettext" = "yes" ; then
+ AC_DEFINE(ENABLE_NLS, 1,
+ [always defined to indicate that i18n is enabled])
+ fi
+
+ dnl Test whether we really found GNU xgettext.
+ if test "$XGETTEXT" != ":"; then
+ dnl If it is not GNU xgettext we define it as : so that the
+ dnl Makefiles still can work.
+ if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
+ : ;
+ else
+ AC_MSG_RESULT(
+ [found xgettext program is not GNU xgettext; ignore it])
+ XGETTEXT=":"
+ fi
+ fi
+
+ # We need to process the po/ directory.
+ POSUB=po
+
+ AC_OUTPUT_COMMANDS(
+ [case "$CONFIG_FILES" in *po/Makefile.in*)
+ sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
+ esac])
+
+ dnl These rules are solely for the distribution goal. While doing this
+ dnl we only have to keep exactly one list of the available catalogs
+ dnl in configure.ac.
+ for lang in $ALL_LINGUAS; do
+ GMOFILES="$GMOFILES $lang.gmo"
+ POFILES="$POFILES $lang.po"
+ done
+
+ dnl Make all variables we use known to autoconf.
+ AC_SUBST(CATALOGS)
+ AC_SUBST(CATOBJEXT)
+ AC_SUBST(DATADIRNAME)
+ AC_SUBST(GMOFILES)
+ AC_SUBST(INSTOBJEXT)
+ AC_SUBST(INTLLIBS)
+ AC_SUBST(PO_IN_DATADIR_TRUE)
+ AC_SUBST(PO_IN_DATADIR_FALSE)
+ AC_SUBST(POFILES)
+ AC_SUBST(POSUB)
+ ])
+
+# AM_GLIB_GNU_GETTEXT
+# -------------------
+# Do checks necessary for use of gettext. If a suitable implementation
+# of gettext is found in either in libintl or in the C library,
+# it will set INTLLIBS to the libraries needed for use of gettext
+# and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable
+# gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST()
+# on various variables needed by the Makefile.in.in installed by
+# glib-gettextize.
+dnl
+AU_DEFUN([GLIB_GNU_GETTEXT],
+ [AC_REQUIRE([AC_PROG_CC])dnl
+
+ GLIB_LC_MESSAGES
+ GLIB_WITH_NLS
+
+ if test "$gt_cv_have_gettext" = "yes"; then
+ if test "x$ALL_LINGUAS" = "x"; then
+ LINGUAS=
+ else
+ AC_MSG_CHECKING(for catalogs to be installed)
+ NEW_LINGUAS=
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then
+ desiredlanguages="$LINGUAS"
+ else
+ desiredlanguages="$ALL_LINGUAS"
+ fi
+ for desiredlang in $desiredlanguages; do
+ # Use the presentlang catalog if desiredlang is
+ # a. equal to presentlang, or
+ # b. a variant of presentlang (because in this case,
+ # presentlang can be used as a fallback for messages
+ # which are not translated in the desiredlang catalog).
+ case "$desiredlang" in
+ "$presentlang"*) useit=yes;;
+ esac
+ done
+ if test $useit = yes; then
+ NEW_LINGUAS="$NEW_LINGUAS $presentlang"
+ fi
+ done
+ LINGUAS=$NEW_LINGUAS
+ AC_MSG_RESULT($LINGUAS)
+ fi
+
+ dnl Construct list of names of catalog files to be constructed.
+ if test -n "$LINGUAS"; then
+ for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
+ fi
+ fi
+
+ dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
+ dnl find the mkinstalldirs script in another subdir but ($top_srcdir).
+ dnl Try to locate is.
+ MKINSTALLDIRS=
+ if test -n "$ac_aux_dir"; then
+ MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
+ fi
+ if test -z "$MKINSTALLDIRS"; then
+ MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+ fi
+ AC_SUBST(MKINSTALLDIRS)
+
+ dnl Generate list of files to be processed by xgettext which will
+ dnl be included in po/Makefile.
+ test -d po || mkdir po
+ if test "x$srcdir" != "x."; then
+ if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then
+ posrcprefix="$srcdir/"
+ else
+ posrcprefix="../$srcdir/"
+ fi
+ else
+ posrcprefix="../"
+ fi
+ rm -f po/POTFILES
+ sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
+ < $srcdir/po/POTFILES.in > po/POTFILES
+ ],
+ [[$0: This macro is deprecated. You should use upstream gettext instead.]])
+
+# AM_GLIB_DEFINE_LOCALEDIR(VARIABLE)
+# -------------------------------
+# Define VARIABLE to the location where catalog files will
+# be installed by po/Makefile.
+glib_DEFUN([GLIB_DEFINE_LOCALEDIR],
+[glib_REQUIRE([GLIB_GNU_GETTEXT])dnl
+glib_save_prefix="$prefix"
+glib_save_exec_prefix="$exec_prefix"
+glib_save_datarootdir="$datarootdir"
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+test "x$exec_prefix" = xNONE && exec_prefix=$prefix
+datarootdir=`eval echo "${datarootdir}"`
+if test "x$CATOBJEXT" = "x.mo" ; then
+ localedir=`eval echo "${libdir}/locale"`
+else
+ localedir=`eval echo "${datadir}/locale"`
+fi
+prefix="$glib_save_prefix"
+exec_prefix="$glib_save_exec_prefix"
+datarootdir="$glib_save_datarootdir"
+AC_DEFINE_UNQUOTED($1, "$localedir",
+ [Define the location where the catalogs will be installed])
+])
+
+dnl
+dnl Now the definitions that aclocal will find
+dnl
+ifdef(glib_configure_ac,[],[
+AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)])
+AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)])
+])dnl
+
+# GLIB_RUN_PROG(PROGRAM, TEST-FILE, [ACTION-IF-PASS], [ACTION-IF-FAIL])
+#
+# Create a temporary file with TEST-FILE as its contents and pass the
+# file name to PROGRAM. Perform ACTION-IF-PASS if PROGRAM exits with
+# 0 and perform ACTION-IF-FAIL for any other exit status.
+AC_DEFUN([GLIB_RUN_PROG],
+[cat >conftest.foo <<_ACEOF
+$2
+_ACEOF
+if AC_RUN_LOG([$1 conftest.foo]); then
+ m4_ifval([$3], [$3], [:])
+m4_ifvaln([$4], [else $4])dnl
+echo "$as_me: failed input was:" >&AS_MESSAGE_LOG_FD
+sed 's/^/| /' conftest.foo >&AS_MESSAGE_LOG_FD
+fi])
+
+
+
+dnl IT_PROG_INTLTOOL([MINIMUM-VERSION], [no-xml])
+# serial 42 IT_PROG_INTLTOOL
+AC_DEFUN([IT_PROG_INTLTOOL], [
+AC_PREREQ([2.50])dnl
+AC_REQUIRE([AM_NLS])dnl
+
+case "$am__api_version" in
+ 1.[01234])
+ AC_MSG_ERROR([Automake 1.5 or newer is required to use intltool])
+ ;;
+ *)
+ ;;
+esac
+
+INTLTOOL_REQUIRED_VERSION_AS_INT=`echo $1 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'`
+INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3`
+INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'`
+if test -n "$1"; then
+ AC_MSG_CHECKING([for intltool >= $1])
+ AC_MSG_RESULT([$INTLTOOL_APPLIED_VERSION found])
+ test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" ||
+ AC_MSG_ERROR([Your intltool is too old. You need intltool $1 or later.])
+fi
+
+AC_PATH_PROG(INTLTOOL_UPDATE, [intltool-update])
+AC_PATH_PROG(INTLTOOL_MERGE, [intltool-merge])
+AC_PATH_PROG(INTLTOOL_EXTRACT, [intltool-extract])
+if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then
+ AC_MSG_ERROR([The intltool scripts were not found. Please install intltool.])
+fi
+
+if test -z "$AM_DEFAULT_VERBOSITY"; then
+ AM_DEFAULT_VERBOSITY=1
+fi
+AC_SUBST([AM_DEFAULT_VERBOSITY])
+
+INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))'
+INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))'
+INTLTOOL__v_MERGE_0='@echo " ITMRG " [$]@;'
+AC_SUBST(INTLTOOL_V_MERGE)
+AC_SUBST(INTLTOOL__v_MERGE_)
+AC_SUBST(INTLTOOL__v_MERGE_0)
+
+INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))'
+intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))'
+intltool__v_merge_options_0='-q'
+AC_SUBST(INTLTOOL_V_MERGE_OPTIONS)
+AC_SUBST(intltool__v_merge_options_)
+AC_SUBST(intltool__v_merge_options_0)
+
+ INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< [$]@'
+ INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+if test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge 5000; then
+ INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< [$]@'
+else
+ INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.[$][$]RANDOM && mkdir [$][$]_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u [$][$]_it_tmp_dir $< [$]@ && rmdir [$][$]_it_tmp_dir'
+fi
+ INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+ INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@'
+
+_IT_SUBST(INTLTOOL_DESKTOP_RULE)
+_IT_SUBST(INTLTOOL_DIRECTORY_RULE)
+_IT_SUBST(INTLTOOL_KEYS_RULE)
+_IT_SUBST(INTLTOOL_PROP_RULE)
+_IT_SUBST(INTLTOOL_OAF_RULE)
+_IT_SUBST(INTLTOOL_PONG_RULE)
+_IT_SUBST(INTLTOOL_SERVER_RULE)
+_IT_SUBST(INTLTOOL_SHEET_RULE)
+_IT_SUBST(INTLTOOL_SOUNDLIST_RULE)
+_IT_SUBST(INTLTOOL_UI_RULE)
+_IT_SUBST(INTLTOOL_XAM_RULE)
+_IT_SUBST(INTLTOOL_KBD_RULE)
+_IT_SUBST(INTLTOOL_XML_RULE)
+_IT_SUBST(INTLTOOL_XML_NOMERGE_RULE)
+_IT_SUBST(INTLTOOL_CAVES_RULE)
+_IT_SUBST(INTLTOOL_SCHEMAS_RULE)
+_IT_SUBST(INTLTOOL_THEME_RULE)
+_IT_SUBST(INTLTOOL_SERVICE_RULE)
+_IT_SUBST(INTLTOOL_POLICY_RULE)
+
+# Check the gettext tools to make sure they are GNU
+AC_PATH_PROG(XGETTEXT, xgettext)
+AC_PATH_PROG(MSGMERGE, msgmerge)
+AC_PATH_PROG(MSGFMT, msgfmt)
+AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then
+ AC_MSG_ERROR([GNU gettext tools not found; required for intltool])
+fi
+xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`"
+mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`"
+mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`"
+if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then
+ AC_MSG_ERROR([GNU gettext tools not found; required for intltool])
+fi
+
+# Substitute ALL_LINGUAS so we can use it in po/Makefile
+AC_SUBST(ALL_LINGUAS)
+
+IT_PO_SUBDIR([po])
+
+])
+
+
+# IT_PO_SUBDIR(DIRNAME)
+# ---------------------
+# All po subdirs have to be declared with this macro; the subdir "po" is
+# declared by IT_PROG_INTLTOOL.
+#
+AC_DEFUN([IT_PO_SUBDIR],
+[AC_PREREQ([2.53])dnl We use ac_top_srcdir inside AC_CONFIG_COMMANDS.
+dnl
+dnl The following CONFIG_COMMANDS should be executed at the very end
+dnl of config.status.
+AC_CONFIG_COMMANDS_PRE([
+ AC_CONFIG_COMMANDS([$1/stamp-it], [
+ if [ ! grep "^# INTLTOOL_MAKEFILE$" "$1/Makefile.in" > /dev/null ]; then
+ AC_MSG_ERROR([$1/Makefile.in.in was not created by intltoolize.])
+ fi
+ rm -f "$1/stamp-it" "$1/stamp-it.tmp" "$1/POTFILES" "$1/Makefile.tmp"
+ >"$1/stamp-it.tmp"
+ [sed '/^#/d
+ s/^[[].*] *//
+ /^[ ]*$/d
+ '"s|^| $ac_top_srcdir/|" \
+ "$srcdir/$1/POTFILES.in" | sed '$!s/$/ \\/' >"$1/POTFILES"
+ ]
+ [sed '/^POTFILES =/,/[^\\]$/ {
+ /^POTFILES =/!d
+ r $1/POTFILES
+ }
+ ' "$1/Makefile.in" >"$1/Makefile"]
+ rm -f "$1/Makefile.tmp"
+ mv "$1/stamp-it.tmp" "$1/stamp-it"
+ ])
+])dnl
+])
+
+# _IT_SUBST(VARIABLE)
+# -------------------
+# Abstract macro to do either _AM_SUBST_NOTMAKE or AC_SUBST
+#
+AC_DEFUN([_IT_SUBST],
+[
+AC_SUBST([$1])
+m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([$1])])
+]
+)
+
+# deprecated macros
+AU_ALIAS([AC_PROG_INTLTOOL], [IT_PROG_INTLTOOL])
+# A hint is needed for aclocal from Automake <= 1.9.4:
+# AC_DEFUN([AC_PROG_INTLTOOL], ...)
+
+
+# nls.m4 serial 5 (gettext-0.18)
+dnl Copyright (C) 1995-2003, 2005-2006, 2008-2014, 2016 Free Software
+dnl Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+AC_PREREQ([2.50])
+
+AC_DEFUN([AM_NLS],
+[
+ AC_MSG_CHECKING([whether NLS is requested])
+ dnl Default is enabled NLS
+ AC_ARG_ENABLE([nls],
+ [ --disable-nls do not use Native Language Support],
+ USE_NLS=$enableval, USE_NLS=yes)
+ AC_MSG_RESULT([$USE_NLS])
+ AC_SUBST([USE_NLS])
+])
+
+# Copyright (C) 2006-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
diff --git a/android/Makefile b/android/Makefile
new file mode 100644
index 0000000..f0d5da0
--- /dev/null
+++ b/android/Makefile
@@ -0,0 +1,418 @@
+# XScreenSaver for Android
+
+export TERM=dumb
+GRADLE = ./gradlew
+
+default:: debug
+all:: release
+
+clean::
+ $(GRADLE) clean
+
+distdepend::
+
+# Set this to the set of platforms you want to compile for in debug mode.
+# E.g., if you are running an x86 emulator, there's no point in compiling
+# for a dozen other platforms. Release builds override this to "all".
+#
+export APP_ABI = all
+
+
+# TODO:
+# check_versions:
+
+
+# These hacks have interdependencies with others, so we can't build without
+# including them or there are link errors:
+#
+ANDROID_BASE_HACKS= \
+ apple2 \
+ bubble3d \
+ pacman \
+ polyhedra \
+ sonar \
+ sproingies \
+
+# These are the ones that currently work, at least to some degree:
+#
+export ANDROID_HACKS= \
+ $(ANDROID_BASE_HACKS) \
+ abstractile \
+ anemone \
+ anemotaxis \
+ antmaze \
+ antspotlight \
+ apollonian \
+ atlantis \
+ attraction \
+ atunnel \
+ binaryring \
+ blaster \
+ blinkbox \
+ blitspin \
+ blocktube \
+ boing \
+ bouboule \
+ bouncingcow \
+ boxed \
+ boxfit \
+ braid \
+ bsod \
+ bumps \
+ cage \
+ ccurve \
+ celtic \
+ circuit \
+ cityflow \
+ cloudlife \
+ companioncube \
+ compass \
+ coral \
+ crackberg \
+ crumbler \
+ crystal \
+ cube21 \
+ cubenetic \
+ cubestack \
+ cubestorm \
+ cubetwist \
+ cubicgrid \
+ cwaves \
+ cynosure \
+ dangerball \
+ decayscreen \
+ deco \
+ deluxe \
+ demon \
+ discoball \
+ discrete \
+ distort \
+ dnalogo \
+ drift \
+ dymaxionmap \
+ endgame \
+ energystream \
+ engine \
+ epicycle \
+ eruption \
+ esper \
+ euler2d \
+ fadeplot \
+ fiberlamp \
+ filmleader \
+ fireworkx \
+ flame \
+ flipflop \
+ flipscreen3d \
+ flow \
+ fluidballs \
+ flyingtoasters \
+ fuzzyflakes \
+ galaxy \
+ gears \
+ geodesic \
+ geodesicgears \
+ gflux \
+ glblur \
+ glcells \
+ gleidescope \
+ glhanoi \
+ glknots \
+ glmatrix \
+ glplanet \
+ glschool \
+ glslideshow \
+ glsnake \
+ gltext \
+ goop \
+ grav \
+ greynetic \
+ halo \
+ helix \
+ hexadrop \
+ hexstrut \
+ hilbert \
+ hopalong \
+ hypertorus \
+ hypnowheel \
+ ifs \
+ imsmap \
+ interaggregate \
+ interference \
+ intermomentary \
+ jigglypuff \
+ jigsaw \
+ julia \
+ kaleidescope \
+ kaleidocycle \
+ klein \
+ kumppa \
+ lament \
+ lavalite \
+ loop \
+ m6502 \
+ maze \
+ maze3d \
+ memscroller \
+ menger \
+ metaballs \
+ mirrorblob \
+ moebius \
+ moebiusgears \
+ moire \
+ moire2 \
+ morph3d \
+ mountain \
+ munch \
+ nerverot \
+ noof \
+ noseguy \
+ peepers \
+ penetrate \
+ penrose \
+ petri \
+ piecewise \
+ pinion \
+ pipes \
+ polytopes \
+ pong \
+ popsquares \
+ projectiveplane \
+ providence \
+ pulsar \
+ pyro \
+ quasicrystal \
+ queens \
+ raverhoop \
+ razzledazzle \
+ rd-bomb \
+ ripples \
+ rocks \
+ romanboy \
+ rorschach \
+ rotzoomer \
+ rubik \
+ rubikblocks \
+ sballs \
+ shadebobs \
+ sierpinski \
+ sierpinski3d \
+ skytentacles \
+ slidescreen \
+ slip \
+ spheremonics \
+ splitflap \
+ splodesic \
+ spotlight \
+ squiral \
+ stairs \
+ stonerview \
+ strange \
+ substrate \
+ superquadrics \
+ surfaces \
+ swirl \
+ tangram \
+ tessellimage \
+ thornbird \
+ timetunnel \
+ topblock \
+ triangle \
+ tronbit \
+ truchet \
+ twang \
+ unknownpleasures \
+ vermiculate \
+ vfeedback \
+ vigilance \
+ voronoi \
+ wander \
+ whirlwindwarp \
+ winduprobot \
+ wormhole \
+ xanalogtv \
+ xflame \
+ xjack \
+ xlyap \
+ xmatrix \
+ xrayswarm \
+ xspirograph \
+ zoom \
+
+
+# These don't work well enough to turn on by default:
+#
+ANDROID_TODO= \
+ antinspect \
+ barcode \
+ carousel \
+ fliptext \
+ fontglide \
+ halftone \
+ juggler3d \
+ molecule \
+ pedal \
+ phosphor \
+ photopile \
+ polyominoes \
+ qix \
+ speedmine \
+ starfish \
+ starwars \
+ testx11 \
+ unicrud \
+
+
+# Download and resize images from jwz.org.
+# This saves us having to include 4MB of images in the tar file
+# that will only be used by a vast minority of people building
+# from source.
+# Android actually wants these to be 160x160 but our source is 200x150.
+
+URL = https://www.jwz.org/xscreensaver/screenshots/
+WGET = wget -q -U xscreensaver-build-android
+CVT = -thumbnail '150x150^' -gravity center -extent 150x150 \
+ \( +clone -alpha extract \
+ -draw 'fill black polygon 0,0 0,15 15,0 fill white circle 15,15 15,0' \
+ \( +clone -flip \) -compose Multiply -composite \
+ \( +clone -flop \) -compose Multiply -composite \
+ \) -alpha off -compose CopyOpacity -composite \
+ -colorspace sRGB \
+ -strip \
+ -quality 95 \
+ +dither -colors 128
+
+# If we are making the m6502 hack, create the header file for Android
+m6502.h::
+ @for h in $(ANDROID_HACKS) ; do \
+ if [ $${h} = "m6502" ] ; then \
+ echo "Making $${h} header ..."; \
+ ../hacks/m6502.sh ../hacks/m6502.h ../hacks/images/m6502/*.asm ; \
+ echo "Made $${h} header"; \
+ fi; \
+ done
+
+xscreensaver/res/drawable/%.png:
+ @\
+ FILE1=`echo "$@" | sed 's!^.*/\([^/]*\)\.png$$!\1.jpg!'` ; \
+ FILE2="$@" ; \
+ FILE1=`echo "$$FILE1" | sed s/rdbomb/rd-bomb/` ; \
+ FILE2=`echo "$$FILE2" | sed s/rd-bomb/rdbomb/` ; \
+ URL="$(URL)$$FILE1" ; \
+ echo "converting $$URL..." ; \
+ rm -f "$$FILE2" ; \
+ $(WGET) -O- "$$URL" | \
+ convert jpg:- $(CVT) "$$FILE2" ; \
+ if [ ! -s "$$FILE2" ]; then \
+ echo "$$FILE2 failed" >&2 ; \
+ exit 1 ; \
+ fi
+
+thumbs::
+ @for f in $(ANDROID_HACKS) $(ANDROID_TODO) ; do \
+ $(MAKE) xscreensaver/res/drawable/$$f.png ; \
+ done
+
+clean_thumbs::
+ @\
+ for f in $(ANDROID_HACKS) $(ANDROID_TODO) ; do \
+ rm -f xscreensaver/res/drawable/$$f.png ; \
+ done
+
+distclean:: clean_thumbs clean
+
+
+EXTRA_TARFILES = xscreensaver/res/drawable/thumbnail.png \
+
+echo_tarfiles:
+ @FILES=`find . $(EXTRA_TARFILES) \( \( \
+ -name .DS_Store \
+ -o -name '*~' \
+ -o -name '*.jks' \
+ -o -name '*.keystore' \
+ -o -name '*_dream.xml' \
+ -o -name '*_settings.xml' \
+ -o -name '*_wallpaper.xml' \
+ -o -name AndroidManifest.xml \
+ -o -name strings.xml \
+ -o -name settings.xml \
+ -o -name attrs.xml \
+ -o -name .gitignore \
+ -o -name .gradle \
+ -o -name drawable \
+ -o -name build \
+ -o -name gen \
+ -o -name libs \
+ -o -name obj \
+ \) -prune \) \
+ -o \( \( -type f -o -type l \) \
+ -print \) \
+ | sed 's@^\./@@' \
+ | sort` ; \
+ echo $$FILES
+
+images_png_h:
+ cd ../hacks/images && $(MAKE)
+
+run_check::
+ ../hacks/check-configs.pl --build-android $(ANDROID_HACKS)
+
+debug:: m6502.h run_check images_png_h
+ $(GRADLE) assembleDebug
+release:: m6502.h run_check images_png_h
+ export APP_ABI=all ; \
+ $(GRADLE) assembleRelease
+
+
+KEYSTORE = xscreensaver.jks
+$(KEYSTORE):
+ keytool -genkey -v -keystore $@ \
+ -alias xscreensaver -keyalg RSA -keysize 2048 -validity 10000
+
+APK_DIR = xscreensaver/build/outputs/apk/release/
+APK_UNSIGNED = $(APK_DIR)xscreensaver-release-unsigned.apk
+APK_UNALIGNED = $(APK_DIR)xscreensaver-release-unaligned.apk
+APK_SIGNED = $(APK_DIR)xscreensaver-release.apk
+
+ TOOLDIR = $(shell ls -d $$HOME/Library/Android/sdk/build-tools/* | tail -1)
+ ZIPALIGN = $(TOOLDIR)/zipalign
+JARSIGNER = jarsigner
+
+sign_release::
+ cp -p $(APK_UNSIGNED) $(APK_UNALIGNED)
+ $(JARSIGNER) -verbose -sigalg SHA1withRSA -digestalg SHA1 \
+ -keystore $(KEYSTORE) $(APK_UNALIGNED) xscreensaver
+ rm -f $(APK_SIGNED)
+ $(ZIPALIGN) -v 4 $(APK_UNALIGNED) $(APK_SIGNED)
+ rm -f $(APK_UNALIGNED)
+ $(JARSIGNER) -verify -verbose -certs $(APK_SIGNED)
+ @ls -lF $(APK_SIGNED)
+
+apk:: release
+ @\
+ VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' ../utils/version.h` ; \
+ HEAD="xscreensaver-$$VERS" ; \
+ if [ ! -s $(APK_SIGNED) -o $(APK_UNSIGNED) -nt $(APK_SIGNED) ]; then \
+ $(MAKE) sign_release ; \
+ fi ; \
+ set -x ; \
+ cp -p $(APK_SIGNED) ../archive/$$HEAD.apk
+
+
+## #### Pare it down for faster debugging...
+#export APP_ABI = armeabi-v7a
+#export APP_ABI = x86
+#
+#export ANDROID_HACKS= \
+# $(ANDROID_BASE_HACKS) \
+# bsod \
+# apollonian \
+# engine \
+# dnalogo \
+# twang \
+# memscroller \
+# phosphor \
+# discoball \
+# cubetwist \
+# cubestack \
+# splodesic \
diff --git a/android/README b/android/README
new file mode 100644
index 0000000..2843296
--- /dev/null
+++ b/android/README
@@ -0,0 +1,189 @@
+
+This directory contains the Android-specific code for building xscreensaver.
+
+It is preliminary, and very much a work in progress.
+
+If you're messing with this, please let us know!
+
+ dennis@panaceasupplies.com
+ jwz@jwz.org
+
+
+To set up your Android development environment:
+
+ Install JDK 7 (http://www.oracle.com/technetwork/java/javase/downloads/)
+ Install Android Studio (http://developer.android.com/sdk/)
+ Install Android NDK (http://developer.android.com/ndk/downloads)
+ Rename or link the "android-ndk-*" directory to "ndk" inside your
+ $ANDROID_HOME (the "sdk/" directory that is the parent of
+ "build-tools/", etc.) That is, it should be "sdk/ndk/".
+
+ set $ANDROID_HOME to where your SDK is installed, or
+ set "sdk.dir" in the file local.properties.
+ On MacOS, the value you want is probably ~/Library/Android/sdk/
+ Also set "ndk.dir" in local.properties.
+
+To build:
+
+ ./configure
+ cd android
+ make
+
+ Hopefully an "xscreensaver-debug.apk" file will appear in
+ android/xscreensaver/build/outputs/apk/.
+
+ Load that onto your device and go to:
+ Settings / Display / Daydream
+ or just click on the XScreenSaver icon, which is a shortcut to that.
+
+ To create and configure an emulator image, use the GUI tool and and
+ give the emulator a name (say, "Nexus_5").
+
+ $ANDROID_HOME/sdk/tools/android avd
+
+ E.g.: Nexus 5, Android 5, Intel Atom x86_64, RAM 2048 VM 64,
+ storage 200, use host GPU.
+
+ Configuration options are in $HOME/.android/avd/*.avd/config.ini
+
+ To launch it:
+
+ $ANDROID_HOME/sdk/tools/emulator -avd Nexus_5
+
+ Warning! On my system at least, the emulator runs out of memory
+ when trying to display the Daydream page if all of the savers are
+ loaded. This is troubling. You can work around this by editing
+ your *.avd/config.ini and setting vm.heapSize=128; or by editing
+ android/Makefile and paring down the $ANDROID_HACKS list to a
+ smaller subset (60 or so with the default heapSize).
+
+
+ To load it into the currently-running emulator or device:
+ $ANDROID_HOME/platform-tools/adb install -r \
+ xscreensaver/build/outputs/apk/xscreensaver-debug.apk
+
+ Extremely verbose log output, including stack traces:
+ $ANDROID_HOME/platform-tools/adb logcat
+
+ Non-fatal log output for only this app:
+ $ANDROID_HOME/platform-tools/adb logcat \
+ -s xscreensaver:d AndroidRuntime:d libEGL:d
+
+ Note that sometimes "logcat" will just sit there forever saying
+ "waiting for device". This is because the emulator is a piece of
+ shit and sometimes decides to just randomly not service connections.
+ If you restart the emulator, and wait minutes for the whole damned
+ thing to boot up again, it will probably work next time. Probably.
+
+
+Directory structure:
+
+ Boilerplate for the Java version of "make":
+ *gradle*
+ *.properties
+ xscreensaver/*gradle*
+ xscreensaver/build.*
+ xscreensaver/*.properties
+
+ The other half of the Makefile:
+ xscreensaver/jni/*.mk
+
+ Source code:
+ xscreensaver/src/org/jwz/xscreensaver/*.java
+ xscreensaver/res/layout/*.xml
+
+ Other relevant source code is in ../jwxyz/ and ../hacks/.
+
+ Icons:
+ xscreensaver/res/drawable-ldpi/
+ xscreensaver/res/drawable-mdpi/
+ xscreensaver/res/drawable/
+
+ Files that we generate:
+
+ gen/function-table.h
+ xscreensaver/AndroidManifest.xml
+ xscreensaver/res/drawable/*.png
+ xscreensaver/res/values/settings.xml
+ xscreensaver/res/values/strings.xml
+ xscreensaver/res/xml/*.xml
+ xscreensaver/src/org/jwz/xscreensaver/gen/*.java
+
+ Other files generated as a part of the build process:
+
+ gen/
+ .gradle/
+ xscreensaver/build/
+ xscreensaver/build/outputs/apk/ -- app appears here
+ xscreensaver/jni/
+ xscreensaver/libs/
+ xscreensaver/obj/
+ xscreensaver/res/
+ xscreensaver/res/drawable/
+ xscreensaver/res/values/
+ xscreensaver/res/xml/
+ xscreensaver/src/org/jwz/xscreensaver/gen/
+
+When adding a new hack, edit android/Makefile, then "make clean" and "make".
+
+
+TODO list, and known bugs:
+
+ - See the top of ../jwxyz/jwxyz-gl.c for a low level TODO list,
+ but here's what's wrong with the savers from a high level view:
+
+ - Rotation is wonky (on some devices?)
+
+ - The Android emulator is a piece of shit and crashes all the time,
+ so it's possible that some of these work fine on real devices.
+ I don't actually have an Android device, so I have no idea.
+
+ - As mentioned above, the Android emulator runs out of memory if
+ more than about 60 of the Daydreams are installed with the default
+ heapSize. Again, I don't know if this is an issue on real devices.
+ I sure hope not.
+
+ - The code that attempts to grab a screen shot before the Daydream begins
+ doesn't work.
+
+ - When a saver exits abnormally, we catch the exception and attempt to
+ display the error message in a dialog. The catch works, but the dialog
+ box does not.
+
+ antinspect renders incorrectly
+ apple2 text, images into pixmaps doesn't work
+ barcode pixmaps
+ bsod pixmaps, XCopyArea problems
+ carousel images are corrupted
+ cityflow shading is wrong
+ endgame insanely slow
+ engine text
+ esper images don't load, no text
+ fliptext text
+ fontglide text
+ glblur grayscale instead of color
+ halftone XFillArc crash
+ jigglypuff incredibly slow
+ juggler3d blank
+ maze lines are not the same thickness (aliased?)
+ molecule blank
+ noseguy text; images
+ pacman images; launches really slowly
+ pedal polygons
+ phosphor text; pixmaps
+ photopile text; images don't display
+ polyhedra text
+ polyominoes pixmaps
+ qix polygons
+ queens insanely slow
+ sonar does icmp work?
+ speedmine polygons
+ splitflap super slow
+ spotlight blank
+ starfish polygons
+ starwars text
+ unicrud pixmaps
+ winduprobot dome is not transparent
+ xanalogtv pixmaps
+ xflame draws only upper left corner
+ xmatrix pretty slow
diff --git a/android/android.iml b/android/android.iml
new file mode 100644
index 0000000..7db6b23
--- /dev/null
+++ b/android/android.iml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.id="android" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/xscreensaver" external.system.id="GRADLE" type="JAVA_MODULE" version="4">
+ <component name="FacetManager">
+ <facet type="java-gradle" name="Java-Gradle">
+ <configuration>
+ <option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
+ <option name="BUILDABLE" value="false" />
+ </configuration>
+ </facet>
+ </component>
+ <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="true">
+ <exclude-output />
+ <content url="file://$MODULE_DIR$">
+ <excludeFolder url="file://$MODULE_DIR$/.gradle" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ </component>
+</module> \ No newline at end of file
diff --git a/android/build.gradle b/android/build.gradle
new file mode 100644
index 0000000..648cc32
--- /dev/null
+++ b/android/build.gradle
@@ -0,0 +1,30 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+buildscript {
+ repositories {
+ jcenter()
+ google()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.1.2'
+ }
+
+}
+
+allprojects {
+ repositories {
+ maven { url 'https://maven.google.com' }
+ jcenter()
+ google()
+ }
+}
+
+
+task clean(type: Delete) {
+ delete('./build')
+}
+
+task distClean(type: Delete) {
+ delete('./.gradle')
+}
+
+distClean.dependsOn clean
diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..13372ae
--- /dev/null
+++ b/android/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..0ac000f
--- /dev/null
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Sat Feb 10 21:20:31 PST 2018
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.8-bin.zip
diff --git a/android/gradlew b/android/gradlew
new file mode 100755
index 0000000..9d82f78
--- /dev/null
+++ b/android/gradlew
@@ -0,0 +1,160 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/android/gradlew.bat b/android/gradlew.bat
new file mode 100644
index 0000000..aec9973
--- /dev/null
+++ b/android/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/android/local.properties b/android/local.properties
new file mode 100644
index 0000000..238a21c
--- /dev/null
+++ b/android/local.properties
@@ -0,0 +1,11 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must *NOT* be checked into Version Control Systems,
+# as it contains information specific to your local configuration.
+
+# location of the SDK. This is only used by Ant
+# For customization when using a Version Control System, please read the
+# header note.
+sdk.dir=/Users/jwz/Library/Android/sdk
+ndk.dir=/Users/jwz/Library/Android/sdk/ndk
diff --git a/android/screenhack-android.c b/android/screenhack-android.c
new file mode 100644
index 0000000..d5067ab
--- /dev/null
+++ b/android/screenhack-android.c
@@ -0,0 +1,209 @@
+/* xscreensaver, Copyright (c) 2016 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Utility functions related to the hacks/ APIs.
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <time.h>
+#include <sys/time.h>
+#include <sys/utsname.h>
+#include <android/log.h>
+#include "screenhackI.h"
+#include "xlockmoreI.h"
+#include "textclient.h"
+
+#if defined(USE_IPHONE) || (HAVE_ANDROID)
+# include "jwzgles.h"
+#else
+# include <OpenGL/OpenGL.h>
+#endif
+
+#ifndef isupper
+# define isupper(c) ((c) >= 'A' && (c) <= 'Z')
+#endif
+#ifndef _tolower
+# define _tolower(c) ((c) - 'A' + 'a')
+#endif
+
+Bool
+get_boolean_resource (Display *dpy, char *res_name, char *res_class)
+{
+ char *tmp, buf [100];
+ char *s = get_string_resource (dpy, res_name, res_class);
+ char *os = s;
+ if (! s) return 0;
+ for (tmp = buf; *s; s++)
+ *tmp++ = isupper (*s) ? _tolower (*s) : *s;
+ *tmp = 0;
+ free (os);
+
+ while (*buf &&
+ (buf[strlen(buf)-1] == ' ' ||
+ buf[strlen(buf)-1] == '\t'))
+ buf[strlen(buf)-1] = 0;
+
+ if (!strcmp (buf, "on") || !strcmp (buf, "true") || !strcmp (buf, "yes"))
+ return 1;
+ if (!strcmp (buf,"off") || !strcmp (buf, "false") || !strcmp (buf,"no"))
+ return 0;
+ fprintf (stderr, "%s: %s must be boolean, not %s.\n",
+ progname, res_name, buf);
+ return 0;
+}
+
+int
+get_integer_resource (Display *dpy, char *res_name, char *res_class)
+{
+ int val;
+ char c, *s = get_string_resource (dpy, res_name, res_class);
+ char *ss = s;
+ if (!s) return 0;
+
+ while (*ss && *ss <= ' ') ss++; /* skip whitespace */
+
+ if (ss[0] == '0' && (ss[1] == 'x' || ss[1] == 'X')) /* 0x: parse as hex */
+ {
+ if (1 == sscanf (ss+2, "%x %c", (unsigned int *) &val, &c))
+ {
+ free (s);
+ return val;
+ }
+ }
+ else /* else parse as dec */
+ {
+ /* Allow integer values to end in ".0". */
+ int L = strlen(ss);
+ if (L > 2 && ss[L-2] == '.' && ss[L-1] == '0')
+ ss[L-2] = 0;
+
+ if (1 == sscanf (ss, "%d %c", &val, &c))
+ {
+ free (s);
+ return val;
+ }
+ }
+
+ fprintf (stderr, "%s: %s must be an integer, not %s.\n",
+ progname, res_name, s);
+ free (s);
+ return 0;
+}
+
+double
+get_float_resource (Display *dpy, char *res_name, char *res_class)
+{
+ double val;
+ char c, *s = get_string_resource (dpy, res_name, res_class);
+ if (! s) return 0.0;
+ if (1 == sscanf (s, " %lf %c", &val, &c))
+ {
+ free (s);
+ return val;
+ }
+ fprintf (stderr, "%s: %s must be a float, not %s.\n",
+ progname, res_name, s);
+ free (s);
+ return 0.0;
+}
+
+
+char *
+textclient_mobile_date_string (void)
+{
+ struct utsname uts;
+ if (uname (&uts) < 0)
+ return strdup("uname() failed");
+ else
+ {
+ time_t now = time ((time_t *) 0);
+ char *ts = ctime (&now);
+ char *buf, *s;
+ if ((s = strchr(uts.nodename, '.')))
+ *s = 0;
+ buf = (char *) malloc(strlen(uts.machine) +
+ strlen(uts.sysname) +
+ strlen(uts.release) +
+ strlen(ts) + 10);
+ sprintf (buf, "%s %s %s\n%s", uts.machine, uts.sysname, uts.release, ts);
+ return buf;
+ }
+}
+
+
+/* used by the OpenGL screen savers
+ */
+
+/* Does nothing - prepareContext already did the work.
+ */
+void
+glXMakeCurrent (Display *dpy, Window window, GLXContext context)
+{
+}
+
+
+/* clear away any lingering error codes */
+void
+clear_gl_error (void)
+{
+ while (glGetError() != GL_NO_ERROR)
+ ;
+}
+
+
+// needs to be implemented in Android...
+/* Copy the back buffer to the front buffer.
+ */
+void
+glXSwapBuffers (Display *dpy, Window window)
+{
+}
+
+
+/* Called by OpenGL savers using the XLockmore API.
+ */
+GLXContext *
+init_GL (ModeInfo *mi)
+{
+ // Window win = mi->window;
+
+ // Caller expects a pointer to an opaque struct... which it dereferences.
+ // Don't ask me, it's historical...
+ static int blort = -1;
+ return (void *) &blort;
+}
+
+/* report a GL error. */
+void
+check_gl_error (const char *type)
+{
+ char buf[100];
+ GLenum i;
+ const char *e;
+ switch ((i = glGetError())) {
+ case GL_NO_ERROR: return;
+ case GL_INVALID_ENUM: e = "invalid enum"; break;
+ case GL_INVALID_VALUE: e = "invalid value"; break;
+ case GL_INVALID_OPERATION: e = "invalid operation"; break;
+ case GL_STACK_OVERFLOW: e = "stack overflow"; break;
+ case GL_STACK_UNDERFLOW: e = "stack underflow"; break;
+ case GL_OUT_OF_MEMORY: e = "out of memory"; break;
+#ifdef GL_TABLE_TOO_LARGE_EXT
+ case GL_TABLE_TOO_LARGE_EXT: e = "table too large"; break;
+#endif
+#ifdef GL_TEXTURE_TOO_LARGE_EXT
+ case GL_TEXTURE_TOO_LARGE_EXT: e = "texture too large"; break;
+#endif
+ default:
+ e = buf; sprintf (buf, "unknown GL error %d", (int) i); break;
+ }
+ __android_log_write(ANDROID_LOG_ERROR, "xscreensaver", e);
+}
diff --git a/android/settings.gradle b/android/settings.gradle
new file mode 100644
index 0000000..5fc665b
--- /dev/null
+++ b/android/settings.gradle
@@ -0,0 +1 @@
+include ':xscreensaver'
diff --git a/android/xscreensaver/.idea/caches/build_file_checksums.ser b/android/xscreensaver/.idea/caches/build_file_checksums.ser
new file mode 100644
index 0000000..bc8f00c
--- /dev/null
+++ b/android/xscreensaver/.idea/caches/build_file_checksums.ser
Binary files differ
diff --git a/android/xscreensaver/.idea/codeStyles/Project.xml b/android/xscreensaver/.idea/codeStyles/Project.xml
new file mode 100644
index 0000000..30aa626
--- /dev/null
+++ b/android/xscreensaver/.idea/codeStyles/Project.xml
@@ -0,0 +1,29 @@
+<component name="ProjectCodeStyleConfiguration">
+ <code_scheme name="Project" version="173">
+ <Objective-C-extensions>
+ <file>
+ <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
+ <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
+ <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" />
+ <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" />
+ <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" />
+ <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" />
+ <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" />
+ <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" />
+ <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" />
+ </file>
+ <class>
+ <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" />
+ <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" />
+ <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" />
+ <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" />
+ <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" />
+ <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" />
+ </class>
+ <extensions>
+ <pair source="cpp" header="h" fileNamingConvention="NONE" />
+ <pair source="c" header="h" fileNamingConvention="NONE" />
+ </extensions>
+ </Objective-C-extensions>
+ </code_scheme>
+</component> \ No newline at end of file
diff --git a/android/xscreensaver/.idea/compiler.xml b/android/xscreensaver/.idea/compiler.xml
new file mode 100644
index 0000000..9a8b7e5
--- /dev/null
+++ b/android/xscreensaver/.idea/compiler.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="CompilerConfiguration">
+ <option name="DEFAULT_COMPILER" value="Javac" />
+ <resourceExtensions />
+ <wildcardResourcePatterns>
+ <entry name="!?*.java" />
+ <entry name="!?*.form" />
+ <entry name="!?*.class" />
+ <entry name="!?*.groovy" />
+ <entry name="!?*.scala" />
+ <entry name="!?*.flex" />
+ <entry name="!?*.kt" />
+ <entry name="!?*.clj" />
+ </wildcardResourcePatterns>
+ <annotationProcessing>
+ <profile default="true" name="Default" enabled="false">
+ <processorPath useClasspath="true" />
+ </profile>
+ </annotationProcessing>
+ </component>
+</project> \ No newline at end of file
diff --git a/android/xscreensaver/.idea/gradle.xml b/android/xscreensaver/.idea/gradle.xml
new file mode 100644
index 0000000..3ac097a
--- /dev/null
+++ b/android/xscreensaver/.idea/gradle.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="GradleSettings">
+ <option name="linkedExternalProjectsSettings">
+ <GradleProjectSettings>
+ <option name="distributionType" value="LOCAL" />
+ <option name="externalProjectPath" value="$PROJECT_DIR$" />
+ <option name="gradleHome" value="$APPLICATION_HOME_DIR$/gradle/gradle-4.1" />
+ <option name="modules">
+ <set>
+ <option value="$PROJECT_DIR$/.." />
+ <option value="$PROJECT_DIR$" />
+ </set>
+ </option>
+ <option name="resolveModulePerSourceSet" value="false" />
+ </GradleProjectSettings>
+ </option>
+ </component>
+</project> \ No newline at end of file
diff --git a/android/xscreensaver/.idea/libraries/Gradle__android_arch_core_common_1_1_0_jar.xml b/android/xscreensaver/.idea/libraries/Gradle__android_arch_core_common_1_1_0_jar.xml
new file mode 100644
index 0000000..9869803
--- /dev/null
+++ b/android/xscreensaver/.idea/libraries/Gradle__android_arch_core_common_1_1_0_jar.xml
@@ -0,0 +1,11 @@
+<component name="libraryTable">
+ <library name="Gradle: android.arch.core:common:1.1.0@jar">
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/android.arch.core/common/1.1.0/8007981f7d7540d89cd18471b8e5dcd2b4f99167/common-1.1.0.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES>
+ <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/android.arch.core/common/1.1.0/f211e8f994b67f7ae2a1bc06e4f7b974ec72ee50/common-1.1.0-sources.jar!/" />
+ </SOURCES>
+ </library>
+</component> \ No newline at end of file
diff --git a/android/xscreensaver/.idea/libraries/Gradle__android_arch_core_runtime_1_1_0.xml b/android/xscreensaver/.idea/libraries/Gradle__android_arch_core_runtime_1_1_0.xml
new file mode 100644
index 0000000..03529f7
--- /dev/null
+++ b/android/xscreensaver/.idea/libraries/Gradle__android_arch_core_runtime_1_1_0.xml
@@ -0,0 +1,12 @@
+<component name="libraryTable">
+ <library name="Gradle: android.arch.core:runtime-1.1.0">
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/runtime-1.1.0.aar/66eddde487cc032a22af511624a2dc1d/jars/classes.jar!/" />
+ <root url="file://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/runtime-1.1.0.aar/66eddde487cc032a22af511624a2dc1d/res" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES>
+ <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/android.arch.core/runtime/1.1.0/62944187d3ae3e7a4644b50da4e7b63c605a696/runtime-1.1.0-sources.jar!/" />
+ </SOURCES>
+ </library>
+</component> \ No newline at end of file
diff --git a/android/xscreensaver/.idea/libraries/Gradle__android_arch_lifecycle_common_1_1_0_jar.xml b/android/xscreensaver/.idea/libraries/Gradle__android_arch_lifecycle_common_1_1_0_jar.xml
new file mode 100644
index 0000000..29c0049
--- /dev/null
+++ b/android/xscreensaver/.idea/libraries/Gradle__android_arch_lifecycle_common_1_1_0_jar.xml
@@ -0,0 +1,11 @@
+<component name="libraryTable">
+ <library name="Gradle: android.arch.lifecycle:common:1.1.0@jar">
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/android.arch.lifecycle/common/1.1.0/edf3f7bfb84a7521d0599efa3b0113a0ee90f85/common-1.1.0.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES>
+ <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/android.arch.lifecycle/common/1.1.0/72f6113534923e49e8c032107ca638b97775c61b/common-1.1.0-sources.jar!/" />
+ </SOURCES>
+ </library>
+</component> \ No newline at end of file
diff --git a/android/xscreensaver/.idea/libraries/Gradle__android_arch_lifecycle_livedata_core_1_1_0.xml b/android/xscreensaver/.idea/libraries/Gradle__android_arch_lifecycle_livedata_core_1_1_0.xml
new file mode 100644
index 0000000..c43180e
--- /dev/null
+++ b/android/xscreensaver/.idea/libraries/Gradle__android_arch_lifecycle_livedata_core_1_1_0.xml
@@ -0,0 +1,12 @@
+<component name="libraryTable">
+ <library name="Gradle: android.arch.lifecycle:livedata-core-1.1.0">
+ <CLASSES>
+ <root url="file://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/livedata-core-1.1.0.aar/01d9f7cf052a887e242d3ac9bccb130e/res" />
+ <root url="jar://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/livedata-core-1.1.0.aar/01d9f7cf052a887e242d3ac9bccb130e/jars/classes.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES>
+ <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/android.arch.lifecycle/livedata-core/1.1.0/300f89e645a95de0bdc6d8833beeee6e3045df06/livedata-core-1.1.0-sources.jar!/" />
+ </SOURCES>
+ </library>
+</component> \ No newline at end of file
diff --git a/android/xscreensaver/.idea/libraries/Gradle__android_arch_lifecycle_runtime_1_1_0.xml b/android/xscreensaver/.idea/libraries/Gradle__android_arch_lifecycle_runtime_1_1_0.xml
new file mode 100644
index 0000000..6031fb9
--- /dev/null
+++ b/android/xscreensaver/.idea/libraries/Gradle__android_arch_lifecycle_runtime_1_1_0.xml
@@ -0,0 +1,12 @@
+<component name="libraryTable">
+ <library name="Gradle: android.arch.lifecycle:runtime-1.1.0">
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/runtime-1.1.0.aar/625fea47a711c4db819aa2d6df929100/jars/classes.jar!/" />
+ <root url="file://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/runtime-1.1.0.aar/625fea47a711c4db819aa2d6df929100/res" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES>
+ <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/android.arch.lifecycle/runtime/1.1.0/a4b0d6b8e8f51c8f95d5a0641f81ffc13ab406c7/runtime-1.1.0-sources.jar!/" />
+ </SOURCES>
+ </library>
+</component> \ No newline at end of file
diff --git a/android/xscreensaver/.idea/libraries/Gradle__android_arch_lifecycle_viewmodel_1_1_0.xml b/android/xscreensaver/.idea/libraries/Gradle__android_arch_lifecycle_viewmodel_1_1_0.xml
new file mode 100644
index 0000000..11a24fb
--- /dev/null
+++ b/android/xscreensaver/.idea/libraries/Gradle__android_arch_lifecycle_viewmodel_1_1_0.xml
@@ -0,0 +1,12 @@
+<component name="libraryTable">
+ <library name="Gradle: android.arch.lifecycle:viewmodel-1.1.0">
+ <CLASSES>
+ <root url="file://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/viewmodel-1.1.0.aar/0c933938d5403a08c5e3efe386ac2b02/res" />
+ <root url="jar://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/viewmodel-1.1.0.aar/0c933938d5403a08c5e3efe386ac2b02/jars/classes.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES>
+ <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/android.arch.lifecycle/viewmodel/1.1.0/e4c0c5d65f92ccad0b0148ac2f01b540ac7a711e/viewmodel-1.1.0-sources.jar!/" />
+ </SOURCES>
+ </library>
+</component> \ No newline at end of file
diff --git a/android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_annotations_27_1_1_jar.xml b/android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_annotations_27_1_1_jar.xml
new file mode 100644
index 0000000..1517ad9
--- /dev/null
+++ b/android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_annotations_27_1_1_jar.xml
@@ -0,0 +1,11 @@
+<component name="libraryTable">
+ <library name="Gradle: com.android.support:support-annotations:27.1.1@jar">
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.support/support-annotations/27.1.1/39ded76b5e1ce1c5b2688e1d25cdc20ecee32007/support-annotations-27.1.1.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES>
+ <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.support/support-annotations/27.1.1/46bebf5bd40146178cb33c7678f3782a09dea6e4/support-annotations-27.1.1-sources.jar!/" />
+ </SOURCES>
+ </library>
+</component> \ No newline at end of file
diff --git a/android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_compat_27_1_1.xml b/android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_compat_27_1_1.xml
new file mode 100644
index 0000000..fba52e8
--- /dev/null
+++ b/android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_compat_27_1_1.xml
@@ -0,0 +1,12 @@
+<component name="libraryTable">
+ <library name="Gradle: com.android.support:support-compat-27.1.1">
+ <CLASSES>
+ <root url="file://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/support-compat-27.1.1.aar/64b85698f5c1a639182eb49d0126a2d0/res" />
+ <root url="jar://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/support-compat-27.1.1.aar/64b85698f5c1a639182eb49d0126a2d0/jars/classes.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES>
+ <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.support/support-compat/27.1.1/fe233277b6eae25ce5b2afab6daf55d73c86f0b9/support-compat-27.1.1-sources.jar!/" />
+ </SOURCES>
+ </library>
+</component> \ No newline at end of file
diff --git a/android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_core_ui_27_1_1.xml b/android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_core_ui_27_1_1.xml
new file mode 100644
index 0000000..3ccece0
--- /dev/null
+++ b/android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_core_ui_27_1_1.xml
@@ -0,0 +1,12 @@
+<component name="libraryTable">
+ <library name="Gradle: com.android.support:support-core-ui-27.1.1">
+ <CLASSES>
+ <root url="file://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/support-core-ui-27.1.1.aar/b432dca2f3c4bd72e4ef10511d8d2ba5/res" />
+ <root url="jar://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/support-core-ui-27.1.1.aar/b432dca2f3c4bd72e4ef10511d8d2ba5/jars/classes.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES>
+ <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.support/support-core-ui/27.1.1/266c369a3227be5afec33e11c964472269ff2a7c/support-core-ui-27.1.1-sources.jar!/" />
+ </SOURCES>
+ </library>
+</component> \ No newline at end of file
diff --git a/android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_core_utils_27_1_1.xml b/android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_core_utils_27_1_1.xml
new file mode 100644
index 0000000..69d23f2
--- /dev/null
+++ b/android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_core_utils_27_1_1.xml
@@ -0,0 +1,12 @@
+<component name="libraryTable">
+ <library name="Gradle: com.android.support:support-core-utils-27.1.1">
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/support-core-utils-27.1.1.aar/0980a98a9ec854145d292239910611d4/jars/classes.jar!/" />
+ <root url="file://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/support-core-utils-27.1.1.aar/0980a98a9ec854145d292239910611d4/res" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES>
+ <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.support/support-core-utils/27.1.1/8fb37fd2f8dbc23482865700d2c340ae030ea561/support-core-utils-27.1.1-sources.jar!/" />
+ </SOURCES>
+ </library>
+</component> \ No newline at end of file
diff --git a/android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_fragment_27_1_1.xml b/android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_fragment_27_1_1.xml
new file mode 100644
index 0000000..8eb356f
--- /dev/null
+++ b/android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_fragment_27_1_1.xml
@@ -0,0 +1,12 @@
+<component name="libraryTable">
+ <library name="Gradle: com.android.support:support-fragment-27.1.1">
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/support-fragment-27.1.1.aar/c39b8c3b0b8a6fd39d4cf14a5ed4d9a8/jars/classes.jar!/" />
+ <root url="file://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/support-fragment-27.1.1.aar/c39b8c3b0b8a6fd39d4cf14a5ed4d9a8/res" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES>
+ <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.support/support-fragment/27.1.1/94732bda44fba11302c58e459b7c1f47e7521bf9/support-fragment-27.1.1-sources.jar!/" />
+ </SOURCES>
+ </library>
+</component> \ No newline at end of file
diff --git a/android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_media_compat_27_1_1.xml b/android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_media_compat_27_1_1.xml
new file mode 100644
index 0000000..c577eba
--- /dev/null
+++ b/android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_media_compat_27_1_1.xml
@@ -0,0 +1,12 @@
+<component name="libraryTable">
+ <library name="Gradle: com.android.support:support-media-compat-27.1.1">
+ <CLASSES>
+ <root url="file://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/support-media-compat-27.1.1.aar/68a94910a2befb2c6cb37bd04aa2aa39/res" />
+ <root url="jar://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/support-media-compat-27.1.1.aar/68a94910a2befb2c6cb37bd04aa2aa39/jars/classes.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES>
+ <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.support/support-media-compat/27.1.1/3ab3f968d7cd675d2f97e67a3e9fc0ac63618f46/support-media-compat-27.1.1-sources.jar!/" />
+ </SOURCES>
+ </library>
+</component> \ No newline at end of file
diff --git a/android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_v4_27_1_1.xml b/android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_v4_27_1_1.xml
new file mode 100644
index 0000000..10d3108
--- /dev/null
+++ b/android/xscreensaver/.idea/libraries/Gradle__com_android_support_support_v4_27_1_1.xml
@@ -0,0 +1,12 @@
+<component name="libraryTable">
+ <library name="Gradle: com.android.support:support-v4-27.1.1">
+ <CLASSES>
+ <root url="file://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/support-v4-27.1.1.aar/4063a17c1f54cf7b4dd719a35d318e61/res" />
+ <root url="jar://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/support-v4-27.1.1.aar/4063a17c1f54cf7b4dd719a35d318e61/jars/classes.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES>
+ <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.support/support-v4/27.1.1/5b8f86fea035328fc9e8c660773037a3401ce25f/support-v4-27.1.1-sources.jar!/" />
+ </SOURCES>
+ </library>
+</component> \ No newline at end of file
diff --git a/android/xscreensaver/.idea/misc.xml b/android/xscreensaver/.idea/misc.xml
new file mode 100644
index 0000000..c0f68ed
--- /dev/null
+++ b/android/xscreensaver/.idea/misc.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="NullableNotNullManager">
+ <option name="myDefaultNullable" value="android.support.annotation.Nullable" />
+ <option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
+ <option name="myNullables">
+ <value>
+ <list size="5">
+ <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
+ <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
+ <item index="2" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
+ <item index="3" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
+ <item index="4" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
+ </list>
+ </value>
+ </option>
+ <option name="myNotNulls">
+ <value>
+ <list size="4">
+ <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
+ <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
+ <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
+ <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
+ </list>
+ </value>
+ </option>
+ </component>
+ <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+ <output url="file://$PROJECT_DIR$/build/classes" />
+ </component>
+ <component name="ProjectType">
+ <option name="id" value="Android" />
+ </component>
+</project> \ No newline at end of file
diff --git a/android/xscreensaver/.idea/modules.xml b/android/xscreensaver/.idea/modules.xml
new file mode 100644
index 0000000..33191fe
--- /dev/null
+++ b/android/xscreensaver/.idea/modules.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="ProjectModuleManager">
+ <modules>
+ <module fileurl="file://$PROJECT_DIR$/../android.iml" filepath="$PROJECT_DIR$/../android.iml" />
+ <module fileurl="file://$PROJECT_DIR$/xscreensaver.iml" filepath="$PROJECT_DIR$/xscreensaver.iml" />
+ </modules>
+ </component>
+</project> \ No newline at end of file
diff --git a/android/xscreensaver/.idea/runConfigurations.xml b/android/xscreensaver/.idea/runConfigurations.xml
new file mode 100644
index 0000000..7f68460
--- /dev/null
+++ b/android/xscreensaver/.idea/runConfigurations.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="RunConfigurationProducerService">
+ <option name="ignoredProducers">
+ <set>
+ <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
+ <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
+ <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
+ </set>
+ </option>
+ </component>
+</project> \ No newline at end of file
diff --git a/android/xscreensaver/.idea/workspace.xml b/android/xscreensaver/.idea/workspace.xml
new file mode 100644
index 0000000..1dedd64
--- /dev/null
+++ b/android/xscreensaver/.idea/workspace.xml
@@ -0,0 +1,2227 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="ChangeListManager">
+ <list default="true" id="41008724-035d-4e24-92b6-6dfb9231c83c" name="Default" comment="" />
+ <ignored path="xscreensaver.iws" />
+ <ignored path=".idea/workspace.xml" />
+ <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
+ <option name="TRACKING_ENABLED" value="true" />
+ <option name="SHOW_DIALOG" value="false" />
+ <option name="HIGHLIGHT_CONFLICTS" value="true" />
+ <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+ <option name="LAST_RESOLUTION" value="IGNORE" />
+ </component>
+ <component name="CreatePatchCommitExecutor">
+ <option name="PATCH_PATH" value="" />
+ </component>
+ <component name="ExternalProjectsData">
+ <projectState path="$PROJECT_DIR$">
+ <ProjectState />
+ </projectState>
+ </component>
+ <component name="ExternalProjectsManager">
+ <system id="GRADLE">
+ <state>
+ <projects_view />
+ </state>
+ </system>
+ </component>
+ <component name="FavoritesManager">
+ <favorites_list name="xscreensaver" />
+ </component>
+ <component name="FileEditorManager">
+ <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
+ <file leaf-file-name="gradle-wrapper.properties" pinned="false" current-in-tab="true">
+ <entry file="file://$PROJECT_DIR$/../gradle/wrapper/gradle-wrapper.properties">
+ <provider selected="true" editor-type-id="text-editor">
+ <state relative-caret-position="90">
+ <caret line="6" column="0" lean-forward="false" selection-start-line="6" selection-start-column="0" selection-end-line="6" selection-end-column="0" />
+ <folding />
+ </state>
+ </provider>
+ </entry>
+ </file>
+ </leaf>
+ </component>
+ <component name="GradleLocalSettings">
+ <option name="myGradleHomes">
+ <map>
+ <entry key="$PROJECT_DIR$" value="$USER_HOME$/.gradle/wrapper/dists/gradle-4.8-bin/divx0s2uj4thofgytb7gf9fsi/gradle-4.8" />
+ </map>
+ </option>
+ <option name="myGradleVersions">
+ <map>
+ <entry key="$PROJECT_DIR$" value="4.8" />
+ </map>
+ </option>
+ <option name="availableProjects">
+ <map>
+ <entry>
+ <key>
+ <ExternalProjectPojo>
+ <option name="name" value="xscreensaver" />
+ <option name="path" value="$PROJECT_DIR$" />
+ </ExternalProjectPojo>
+ </key>
+ <value>
+ <list>
+ <ExternalProjectPojo>
+ <option name="name" value="android" />
+ <option name="path" value="$PROJECT_DIR$/.." />
+ </ExternalProjectPojo>
+ <ExternalProjectPojo>
+ <option name="name" value=":xscreensaver" />
+ <option name="path" value="$PROJECT_DIR$" />
+ </ExternalProjectPojo>
+ </list>
+ </value>
+ </entry>
+ </map>
+ </option>
+ <option name="availableTasks">
+ <map>
+ <entry key="$PROJECT_DIR$/..">
+ <value>
+ <list>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays all buildscript dependencies declared in root project 'android'." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="buildEnvironment" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="clean" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays the components produced by root project 'android'. [incubating]" />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="components" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays all dependencies declared in root project 'android'." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="dependencies" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays the insight into a specific dependency in root project 'android'." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="dependencyInsight" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays the dependent components of components in root project 'android'. [incubating]" />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="dependentComponents" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="distClean" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays a help message." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="help" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Initializes a new Gradle build." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="init" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays the configuration model of root project 'android'. [incubating]" />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="model" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays the sub-projects of root project 'android'." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="projects" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays the properties of root project 'android'." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="properties" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays the tasks runnable from root project 'android' (some of the displayed tasks may belong to subprojects)." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="tasks" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Generates Gradle wrapper files." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="wrapper" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays the Android dependencies of the project." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="androidDependencies" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Assembles all variants of all applications and secondary packages." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="assemble" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Assembles all the Test applications." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="assembleAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Assembles all Debug builds." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="assembleDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="assembleDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="assembleDebugUnitTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Assembles all Release builds." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="assembleRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="assembleReleaseUnitTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Assembles and tests this project." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="build" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Assembles and tests this project and all projects that depend on it." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="buildDependents" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Assembles and tests this project and all projects it depends on." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="buildNeeded" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="bundleAppClassesDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="bundleAppClassesDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="bundleAppClassesDebugUnitTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="bundleAppClassesRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="bundleAppClassesReleaseUnitTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="bundleDebugAndroidTestResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="bundleDebugResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="bundleReleaseResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Runs all checks." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="check" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="checkDebugManifest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="checkReleaseManifest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Deletes the build cache directory." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="cleanBuildCache" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="compileDebugAidl" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="compileDebugAndroidTestAidl" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="compileDebugAndroidTestJavaWithJavac" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="compileDebugAndroidTestNdk" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="compileDebugAndroidTestRenderscript" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="compileDebugAndroidTestShaders" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="compileDebugAndroidTestSources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="compileDebugJavaWithJavac" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="compileDebugNdk" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="compileDebugRenderscript" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="compileDebugShaders" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="compileDebugSources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="compileDebugUnitTestJavaWithJavac" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="compileDebugUnitTestSources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="compileLint" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="compileReleaseAidl" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="compileReleaseJavaWithJavac" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="compileReleaseNdk" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="compileReleaseRenderscript" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="compileReleaseShaders" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="compileReleaseSources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="compileReleaseUnitTestJavaWithJavac" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="compileReleaseUnitTestSources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Installs and runs instrumentation tests for all flavors on connected devices." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="connectedAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Runs all device checks on currently connected devices." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="connectedCheck" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Installs and runs the tests for debug on connected devices." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="connectedDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="consumeConfigAttr" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="createDebugCompatibleScreenManifests" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="createReleaseCompatibleScreenManifests" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Installs and runs instrumentation tests using all Device Providers." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="deviceAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Runs all device checks using Device Providers and Test Servers." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="deviceCheck" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="downloadNeededDrawables" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="extractProguardFiles" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="generateDebugAndroidTestAssets" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="generateDebugAndroidTestBuildConfig" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="generateDebugAndroidTestResValues" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="generateDebugAndroidTestResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="generateDebugAndroidTestSources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="generateDebugAssets" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="generateDebugBuildConfig" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="generateDebugResValues" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="generateDebugResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="generateDebugSources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="generateReleaseAssets" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="generateReleaseBuildConfig" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="generateReleaseResValues" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="generateReleaseResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="generateReleaseSources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Installs the Debug build." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="installDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Installs the android (on device) tests for the Debug build." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="installDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="javaPreCompileDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="javaPreCompileDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="javaPreCompileDebugUnitTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="javaPreCompileRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="javaPreCompileReleaseUnitTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Runs lint on all variants." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="lint" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Runs lint on the Debug build." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="lintDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Runs lint on the Release build." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="lintRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Runs lint on just the fatal issues in the release build." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="lintVitalRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="mainApkListPersistenceDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="mainApkListPersistenceDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="mainApkListPersistenceRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="mergeDebugAndroidTestAssets" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="mergeDebugAndroidTestJniLibFolders" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="mergeDebugAndroidTestResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="mergeDebugAndroidTestShaders" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="mergeDebugAssets" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="mergeDebugJniLibFolders" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="mergeDebugResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="mergeDebugShaders" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="mergeReleaseAssets" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="mergeReleaseJniLibFolders" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="mergeReleaseResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="mergeReleaseShaders" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Creates a version of android.jar that's suitable for unit tests." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="mockableAndroidJar" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="ndkBuild" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="objlibClean" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="packageDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="packageDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="packageRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="perlBuild" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="perlClean" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="platformAttrExtractor" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="preBuild" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="preDebugAndroidTestBuild" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="preDebugBuild" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="preDebugUnitTestBuild" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="preReleaseBuild" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="preReleaseUnitTestBuild" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="prepareLintJar" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="preparePUBLISHED_DEXDebugAndroidTestForPublishing" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="preparePUBLISHED_DEXDebugForPublishing" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="preparePUBLISHED_DEXReleaseForPublishing" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="preparePUBLISHED_JAVA_RESDebugAndroidTestForPublishing" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="preparePUBLISHED_JAVA_RESDebugForPublishing" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="preparePUBLISHED_JAVA_RESReleaseForPublishing" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="preparePUBLISHED_NATIVE_LIBSDebugAndroidTestForPublishing" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="preparePUBLISHED_NATIVE_LIBSDebugForPublishing" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="preparePUBLISHED_NATIVE_LIBSReleaseForPublishing" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="processDebugAndroidTestJavaRes" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="processDebugAndroidTestManifest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="processDebugAndroidTestResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="processDebugJavaRes" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="processDebugManifest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="processDebugResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="processDebugUnitTestJavaRes" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="processReleaseJavaRes" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="processReleaseManifest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="processReleaseResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="processReleaseUnitTestJavaRes" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="reportBuildArtifactsDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="reportBuildArtifactsRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="resolveConfigAttr" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays the signing info for each variant." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="signingReport" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Prints out all the source sets defined in this project." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="sourceSets" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="splitsDiscoveryTaskDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="splitsDiscoveryTaskRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Run unit tests for all variants." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="test" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Run unit tests for the debug build." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="testDebugUnitTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Run unit tests for the release build." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="testReleaseUnitTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="transformClassesWithDexBuilderForDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="transformClassesWithDexBuilderForDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="transformClassesWithDexBuilderForRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="transformDexArchiveWithDexMergerForDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="transformDexArchiveWithDexMergerForDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="transformDexArchiveWithDexMergerForRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="transformDexArchiveWithExternalLibsDexMergerForDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="transformDexArchiveWithExternalLibsDexMergerForDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="transformDexArchiveWithExternalLibsDexMergerForRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="transformNativeLibsWithMergeJniLibsForDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="transformNativeLibsWithMergeJniLibsForDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="transformNativeLibsWithMergeJniLibsForRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="transformNativeLibsWithStripDebugSymbolForDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="transformNativeLibsWithStripDebugSymbolForRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="transformResourcesWithMergeJavaResForDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="transformResourcesWithMergeJavaResForDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="transformResourcesWithMergeJavaResForDebugUnitTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="transformResourcesWithMergeJavaResForRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="transformResourcesWithMergeJavaResForReleaseUnitTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Uninstall all applications." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="uninstallAll" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Uninstalls the Debug build." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="uninstallDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Uninstalls the android (on device) tests for the Debug build." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="uninstallDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Uninstalls the Release build." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="uninstallRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="validateSigningDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="validateSigningDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="writeDebugApplicationId" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/.." />
+ <option name="name" value="writeReleaseApplicationId" />
+ </ExternalTaskPojo>
+ </list>
+ </value>
+ </entry>
+ <entry key="$PROJECT_DIR$">
+ <value>
+ <list>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays the sub-projects of project ':xscreensaver'." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="projects" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="bundleAppClassesRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="validateSigningDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="transformClassesWithDexBuilderForDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="assembleReleaseUnitTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="bundleReleaseResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="processReleaseJavaRes" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="generateReleaseAssets" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Runs lint on the Debug build." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="lintDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="preparePUBLISHED_JAVA_RESReleaseForPublishing" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="reportBuildArtifactsRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="assembleDebugUnitTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="createReleaseCompatibleScreenManifests" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Creates a version of android.jar that's suitable for unit tests." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="mockableAndroidJar" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays the configuration model of project ':xscreensaver'. [incubating]" />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="model" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="preparePUBLISHED_DEXReleaseForPublishing" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="bundleAppClassesDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays the tasks runnable from project ':xscreensaver'." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="tasks" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="compileDebugSources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="bundleDebugAndroidTestResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Runs all device checks using Device Providers and Test Servers." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="deviceCheck" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays all dependencies declared in project ':xscreensaver'." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="dependencies" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="processDebugResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="transformNativeLibsWithStripDebugSymbolForRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Runs lint on all variants." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="lint" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="packageDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="transformClassesWithDexBuilderForRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="compileReleaseNdk" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="generateDebugResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="bundleAppClassesReleaseUnitTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="compileDebugJavaWithJavac" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="mainApkListPersistenceDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Assembles and tests this project and all projects it depends on." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="buildNeeded" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="generateDebugAndroidTestBuildConfig" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="processDebugUnitTestJavaRes" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Run unit tests for the release build." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="testReleaseUnitTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Deletes the build cache directory." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="cleanBuildCache" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="compileDebugAndroidTestShaders" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="mergeDebugShaders" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="preparePUBLISHED_JAVA_RESDebugAndroidTestForPublishing" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="compileDebugAndroidTestJavaWithJavac" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays the components produced by project ':xscreensaver'. [incubating]" />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="components" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="compileReleaseRenderscript" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Assembles all Debug builds." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="assembleDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="processDebugAndroidTestManifest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="compileDebugUnitTestJavaWithJavac" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="transformResourcesWithMergeJavaResForReleaseUnitTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="preDebugAndroidTestBuild" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="processDebugAndroidTestJavaRes" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="processReleaseUnitTestJavaRes" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="reportBuildArtifactsDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="transformDexArchiveWithExternalLibsDexMergerForRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="javaPreCompileDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="splitsDiscoveryTaskDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="bundleAppClassesDebugUnitTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Uninstalls the Release build." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="uninstallRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="compileReleaseShaders" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="mergeReleaseResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="generateDebugAndroidTestSources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="checkReleaseManifest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="javaPreCompileDebugUnitTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="compileDebugAndroidTestSources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="createDebugCompatibleScreenManifests" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="preparePUBLISHED_NATIVE_LIBSReleaseForPublishing" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="mergeReleaseJniLibFolders" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="prepareLintJar" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="processReleaseResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Installs and runs instrumentation tests using all Device Providers." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="deviceAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="mergeDebugAndroidTestAssets" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="preparePUBLISHED_NATIVE_LIBSDebugForPublishing" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="processReleaseManifest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Uninstalls the android (on device) tests for the Debug build." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="uninstallDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays the insight into a specific dependency in project ':xscreensaver'." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="dependencyInsight" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="generateReleaseSources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="transformDexArchiveWithDexMergerForRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="preReleaseBuild" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="writeDebugApplicationId" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Assembles all variants of all applications and secondary packages." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="assemble" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays a help message." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="help" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="compileReleaseUnitTestSources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Installs the android (on device) tests for the Debug build." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="installDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="mainApkListPersistenceDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="transformClassesWithDexBuilderForDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="mergeDebugAssets" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="javaPreCompileReleaseUnitTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="preparePUBLISHED_DEXDebugAndroidTestForPublishing" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="javaPreCompileRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="splitsDiscoveryTaskRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Runs all device checks on currently connected devices." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="connectedCheck" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Installs and runs the tests for debug on connected devices." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="connectedDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="transformDexArchiveWithDexMergerForDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Uninstall all applications." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="uninstallAll" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="transformNativeLibsWithMergeJniLibsForDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Assembles all the Test applications." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="assembleAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="processDebugAndroidTestResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="preparePUBLISHED_DEXDebugForPublishing" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="packageRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="validateSigningDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="compileDebugAidl" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="mergeDebugResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="preDebugUnitTestBuild" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="compileLint" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="generateDebugAndroidTestResValues" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="mainApkListPersistenceRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="transformNativeLibsWithMergeJniLibsForDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="mergeReleaseShaders" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays the Android dependencies of the project." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="androidDependencies" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="compileDebugAndroidTestNdk" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="compileDebugUnitTestSources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="transformNativeLibsWithMergeJniLibsForRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="transformDexArchiveWithExternalLibsDexMergerForDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="generateDebugSources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="mergeDebugAndroidTestJniLibFolders" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="extractProguardFiles" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="assembleDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="preparePUBLISHED_JAVA_RESDebugForPublishing" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="objlibClean" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="processDebugJavaRes" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="consumeConfigAttr" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="generateDebugAndroidTestAssets" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="compileReleaseJavaWithJavac" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="transformResourcesWithMergeJavaResForDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="downloadNeededDrawables" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Run unit tests for all variants." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="test" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="transformNativeLibsWithStripDebugSymbolForDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="compileDebugNdk" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="mergeDebugAndroidTestResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="preReleaseUnitTestBuild" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="generateDebugResValues" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Runs all checks." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="check" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="javaPreCompileDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Run unit tests for the debug build." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="testDebugUnitTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Installs and runs instrumentation tests for all flavors on connected devices." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="connectedAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Installs the Debug build." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="installDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="preBuild" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="transformResourcesWithMergeJavaResForRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="compileReleaseSources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="compileReleaseUnitTestJavaWithJavac" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="compileDebugShaders" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="transformResourcesWithMergeJavaResForDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="compileReleaseAidl" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Runs lint on the Release build." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="lintRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Assembles and tests this project and all projects that depend on it." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="buildDependents" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="generateDebugAssets" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="transformDexArchiveWithDexMergerForDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays the dependent components of components in project ':xscreensaver'. [incubating]" />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="dependentComponents" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays all buildscript dependencies declared in project ':xscreensaver'." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="buildEnvironment" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="checkDebugManifest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="mergeDebugJniLibFolders" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Prints out all the source sets defined in this project." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="sourceSets" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="transformResourcesWithMergeJavaResForDebugUnitTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="perlBuild" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="bundleDebugResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="mergeReleaseAssets" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="compileDebugRenderscript" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="generateReleaseBuildConfig" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="preparePUBLISHED_NATIVE_LIBSDebugAndroidTestForPublishing" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="perlClean" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="generateReleaseResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Runs lint on just the fatal issues in the release build." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="lintVitalRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="ndkBuild" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="platformAttrExtractor" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Uninstalls the Debug build." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="uninstallDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays the signing info for each variant." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="signingReport" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="compileDebugAndroidTestAidl" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="mergeDebugAndroidTestShaders" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="bundleAppClassesDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Deletes the build directory." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="clean" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="preDebugBuild" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="generateDebugBuildConfig" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="transformDexArchiveWithExternalLibsDexMergerForDebug" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Assembles and tests this project." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="build" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Assembles all Release builds." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="assembleRelease" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="resolveConfigAttr" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="compileDebugAndroidTestRenderscript" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="generateDebugAndroidTestResources" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="processDebugManifest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="writeReleaseApplicationId" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="packageDebugAndroidTest" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="generateReleaseResValues" />
+ </ExternalTaskPojo>
+ <ExternalTaskPojo>
+ <option name="description" value="Displays the properties of project ':xscreensaver'." />
+ <option name="linkedExternalProjectPath" value="$PROJECT_DIR$" />
+ <option name="name" value="properties" />
+ </ExternalTaskPojo>
+ </list>
+ </value>
+ </entry>
+ </map>
+ </option>
+ <option name="projectBuildClasspath">
+ <map>
+ <entry key="$PROJECT_DIR$">
+ <value>
+ <ExternalProjectBuildClasspathPojo>
+ <option name="modulesBuildClasspath">
+ <map>
+ <entry key="$PROJECT_DIR$/..">
+ <value>
+ <ExternalModuleBuildClasspathPojo>
+ <option name="entries">
+ <list>
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/gradle/3.1.2/1608fa49add4d13366db7844998c6e59711f7e2a/gradle-3.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/gradle-core/3.1.2/ccab33656c1baa6514d88f4d9356db19d0e9823b/gradle-core-3.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/bundletool/0.1.0-alpha01/f7c303e37818223bd98566fcbea29aa0964c4d06/bundletool-0.1.0-alpha01.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/builder/3.1.2/133b1f665104f0ebf01f71b61e4794385d7b5f1b/builder-3.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.lint/lint-gradle-api/26.1.2/8c54aedfe9da66e64402de04883cee083c127a3b/lint-gradle-api-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/gradle-api/3.1.2/427e25639a55911cadcf70657c9b2ded2ad6af2b/gradle-api-3.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.databinding/compilerCommon/3.1.2/be65c11ded4242932046f23ecfa5c7ccb0e98f46/compilerCommon-3.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre8/1.2.0/505f55b9619bbc5f5e26c77427dd24a6a441eef1/kotlin-stdlib-jre8-1.2.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/transform-api/2.0.0-deprecated-use-gradle-api/85bee1acea9e27152b920746c68133b30b11431/transform-api-2.0.0-deprecated-use-gradle-api.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/5.1/5ef31c4fe953b1fd00b8a88fa1d6820e8785bb45/asm-5.1.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/5.1/6d1bf8989fc7901f868bee3863c44f21aa63d110/asm-analysis-5.1.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/5.1/25d8a575034dd9cfcb375a39b5334f0ba9c8474e/asm-commons-5.1.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/5.1/b60e33a6bd0d71831e0c249816d01e6c1dd90a47/asm-util-5.1.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/4.9/ee9e9eaa0a35360dcfeac129ff4923215fd65904/jopt-simple-4.9.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.sf.proguard/proguard-gradle/5.3.3/ad23a0505f58d0dfc95bb1472decc397460406c9/proguard-gradle-5.3.3.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.auto.value/auto-value/1.5.2/1b94ab7ec707e2220a0d1a7517488d1843236345/auto-value-1.5.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/22.0/3564ef3803de51fb0530a8377ec6100b33b0d073/guava-22.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.protobuf/protobuf-java/3.4.0/b32aba0cbe737a4ca953f71688725972e3ee927c/protobuf-java-3.4.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.protobuf/protobuf-java-util/3.4.0/96aba8ab71c16018c6adf66771ce15c6491bc0fe/protobuf-java-util-3.4.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.errorprone/error_prone_annotations/2.1.2/6dcc08f90f678ac33e5ef78c3c752b6f59e63e0c/error_prone_annotations-2.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/aapt2-proto/0.1.0/d1eb93a21a8d3590c3bfac574a8b6dffb2dbd21c/aapt2-proto-0.1.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/builder-model/3.1.2/4504b655fa8fe72302020ca9a2387f3f23fbfb57/builder-model-3.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/builder-test-api/3.1.2/ffb00b786822df6538377a90df9f2d11c022efc3/builder-test-api-3.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/sdklib/26.1.2/94697a9dff499b64b6e101bedb89a89825150af/sdklib-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/sdk-common/26.1.2/2cf773af3fb0e1bbd56a80fc6903a9d2a40a248/sdk-common-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/common/26.1.2/c31bbd68c51ed0ef3b8d7cdd5615acf762473887/common-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/manifest-merger/26.1.2/79f398427650c76f0c66c89f10e4886a1fe68c26/manifest-merger-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.ddms/ddmlib/26.1.2/1d423e621fb5c89fed13e41d0ed026cf5d8d7e7b/ddmlib-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.analytics-library/protos/26.1.2/ba53bcde9703b2bf9871128952dce844c5d743fa/protos-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.analytics-library/shared/26.1.2/bc21fe64fdaa64e59672e7d546d373f430e7557c/shared-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.analytics-library/tracker/26.1.2/2d2260da92e50ac072f89d60a596d03aab3a8757/tracker-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/apksig/3.1.2/5af360dd30015a9a47c8ab0af0e6b05f64760edc/apksig-3.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.squareup/javawriter/2.5.0/81241ff7078ef14f42ea2a8995fa09c096256e6b/javawriter-2.5.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.bouncycastle/bcpkix-jdk15on/1.56/4648af70268b6fdb24674fb1fd7c1fcc73db1231/bcpkix-jdk15on-1.56.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.bouncycastle/bcprov-jdk15on/1.56/a153c6f9744a3e9dd6feab5e210e1c9861362ec7/bcprov-jdk15on-1.56.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/5.1/87b38c12a0ea645791ead9d3e74ae5268d1d6c34/asm-tree-5.1.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/7.2.0/5ad3a2bb04143f70aa0765fc29fc29571a7d6b34/fastutil-7.2.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.googlecode.json-simple/json-simple/1.1/5e303a03d04e6788dddfa3655272580ae0fc13bb/json-simple-1.1.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/1.2.0/4bbda3b5425aa38a9f6960468a29c5ef3e8a28c9/kotlin-reflect-1.2.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.databinding/baseLibrary/3.1.2/1b6a1add6a577708b62737dc31c479549f77750d/baseLibrary-3.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.antlr/antlr4/4.5.3/f35db7e4b2446e4174ba6a73db7bd6b3e6bb5da1/antlr4-4.5.3.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/b1b6ea3b7e4aa4f492509a4952029cd8e48019ad/commons-io-2.4.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.googlecode.juniversalchardet/juniversalchardet/1.0.3/cd49678784c46aa8789c060538e0154013bb421b/juniversalchardet-1.0.3.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.squareup/javapoet/1.8.0/e858dc62ef484048540d27d36f3ec2177a3fa9b1/javapoet-1.8.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.7/751f548c85fa49f330cecbb1875893f971b33c4e/gson-2.7.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/annotations/26.1.2/4f4e0ee71b9ccaa4a70cc86e40fb84ada2ed99a3/annotations-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.sf.proguard/proguard-base/5.3.3/988b6b0636ce343d4962b3b37f6319dcc6e99a61/proguard-base-5.3.3.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.layoutlib/layoutlib-api/26.1.2/3697abf628d30042c1082ea846454dfd1e8da3e/layoutlib-api-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/dvlib/26.1.2/eb39925fee6e726468fc10344ec988c086301ed7/dvlib-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/repository/26.1.2/c8209ccb8ee0e5e3f293fd71d2a827f440ab811c/repository-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.12/84caa68576e345eb5e7ae61a0e5a9229eb100d7b/commons-compress-1.12.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.2.6/e4ca30a6a3a075053a61c6fc850d2432dc012ba7/httpclient-4.2.6.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpmime/4.1/9ba2dcdf94ce35c8a8e9bff242db0618ca932e92/httpmime-4.1.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.sf.kxml/kxml2/2.3.0/ccbc77a5fd907ef863c29f3596c6f54ffa4e9442/kxml2-2.3.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.sun.activation/javax.activation/1.2.0/bf744c1e2776ed1de3c55c8dac1057ec331ef744/javax.activation-1.2.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.glassfish.jaxb/jaxb-runtime/2.2.11/65510afc78679e347b0d774617a97fedac94f8/jaxb-runtime-2.2.11.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.jimfs/jimfs/1.1/8fbd0579dc68aba6186935cc1bee21d2f3e7ec1c/jimfs-1.1.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.2.5/472f0f5f8dba5d1962cb9d7739feed739a31c30d/httpcore-4.2.5.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.1.1/5043bfebc3db072ed80fbd362e7caf00e885d8ae/commons-logging-1.1.1.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.6/b7f0fc8f61ecadeb3695f0b9464755eee44374d4/commons-codec-1.6.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.2.0/25eb440d6eeb9fc60299121020fe726eb2100d03/kotlin-stdlib-1.2.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.glassfish.jaxb/jaxb-core/2.2.11/f5745049f5fb9cb9d9b5f513c207727f475983e9/jaxb-core-2.2.11.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jvnet.staxex/stax-ex/1.7.7/18bed5a0da27a6b43efe01282f2dc911b1cb3a72/stax-ex-1.7.7.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.sun.xml.fastinfoset/FastInfoset/1.2.13/98f56b9354e27bd2941cc5d461344e240ae51ae/FastInfoset-1.2.13.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre7/1.2.0/ec8b969e26fbcf2265a4d1a1539c4d1d4c5af380/kotlin-stdlib-jre7-1.2.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.code.findbugs/jsr305/1.3.9/40719ea6961c0cb6afaeb6a921eaa1f6afd4cfdf/jsr305-1.3.9.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.j2objc/j2objc-annotations/1.1/976d8d30bebc251db406f2bdb3eb01962b5685b3/j2objc-annotations-1.1.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.codehaus.mojo/animal-sniffer-annotations/1.14/775b7e22fb10026eed3f86e8dc556dfafe35f2d5/animal-sniffer-annotations-1.14.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/javax.xml.bind/jaxb-api/2.2.12-b140109.1041/7ed0e0d01198614194d56dfb03d9d95aa311824c/jaxb-api-2.2.12-b140109.1041.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.glassfish.jaxb/txw2/2.2.11/2df047d8c187a62f2177bf6013f1f9786cdfc8a2/txw2-2.2.11.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.sun.istack/istack-commons-runtime/2.21/c969d8f15c467f0ef7d7b04889afbe7b5d48e22f/istack-commons-runtime-2.21.jar" />
+ </list>
+ </option>
+ <option name="path" value="$PROJECT_DIR$/.." />
+ </ExternalModuleBuildClasspathPojo>
+ </value>
+ </entry>
+ <entry key="$PROJECT_DIR$">
+ <value>
+ <ExternalModuleBuildClasspathPojo>
+ <option name="entries">
+ <list>
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/gradle/3.1.2/1608fa49add4d13366db7844998c6e59711f7e2a/gradle-3.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/gradle-core/3.1.2/ccab33656c1baa6514d88f4d9356db19d0e9823b/gradle-core-3.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/bundletool/0.1.0-alpha01/f7c303e37818223bd98566fcbea29aa0964c4d06/bundletool-0.1.0-alpha01.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/builder/3.1.2/133b1f665104f0ebf01f71b61e4794385d7b5f1b/builder-3.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.lint/lint-gradle-api/26.1.2/8c54aedfe9da66e64402de04883cee083c127a3b/lint-gradle-api-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/gradle-api/3.1.2/427e25639a55911cadcf70657c9b2ded2ad6af2b/gradle-api-3.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.databinding/compilerCommon/3.1.2/be65c11ded4242932046f23ecfa5c7ccb0e98f46/compilerCommon-3.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre8/1.2.0/505f55b9619bbc5f5e26c77427dd24a6a441eef1/kotlin-stdlib-jre8-1.2.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/transform-api/2.0.0-deprecated-use-gradle-api/85bee1acea9e27152b920746c68133b30b11431/transform-api-2.0.0-deprecated-use-gradle-api.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/5.1/5ef31c4fe953b1fd00b8a88fa1d6820e8785bb45/asm-5.1.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/5.1/6d1bf8989fc7901f868bee3863c44f21aa63d110/asm-analysis-5.1.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/5.1/25d8a575034dd9cfcb375a39b5334f0ba9c8474e/asm-commons-5.1.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/5.1/b60e33a6bd0d71831e0c249816d01e6c1dd90a47/asm-util-5.1.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/4.9/ee9e9eaa0a35360dcfeac129ff4923215fd65904/jopt-simple-4.9.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.sf.proguard/proguard-gradle/5.3.3/ad23a0505f58d0dfc95bb1472decc397460406c9/proguard-gradle-5.3.3.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.auto.value/auto-value/1.5.2/1b94ab7ec707e2220a0d1a7517488d1843236345/auto-value-1.5.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/22.0/3564ef3803de51fb0530a8377ec6100b33b0d073/guava-22.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.protobuf/protobuf-java/3.4.0/b32aba0cbe737a4ca953f71688725972e3ee927c/protobuf-java-3.4.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.protobuf/protobuf-java-util/3.4.0/96aba8ab71c16018c6adf66771ce15c6491bc0fe/protobuf-java-util-3.4.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.errorprone/error_prone_annotations/2.1.2/6dcc08f90f678ac33e5ef78c3c752b6f59e63e0c/error_prone_annotations-2.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/aapt2-proto/0.1.0/d1eb93a21a8d3590c3bfac574a8b6dffb2dbd21c/aapt2-proto-0.1.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/builder-model/3.1.2/4504b655fa8fe72302020ca9a2387f3f23fbfb57/builder-model-3.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/builder-test-api/3.1.2/ffb00b786822df6538377a90df9f2d11c022efc3/builder-test-api-3.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/sdklib/26.1.2/94697a9dff499b64b6e101bedb89a89825150af/sdklib-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/sdk-common/26.1.2/2cf773af3fb0e1bbd56a80fc6903a9d2a40a248/sdk-common-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/common/26.1.2/c31bbd68c51ed0ef3b8d7cdd5615acf762473887/common-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/manifest-merger/26.1.2/79f398427650c76f0c66c89f10e4886a1fe68c26/manifest-merger-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.ddms/ddmlib/26.1.2/1d423e621fb5c89fed13e41d0ed026cf5d8d7e7b/ddmlib-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.analytics-library/protos/26.1.2/ba53bcde9703b2bf9871128952dce844c5d743fa/protos-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.analytics-library/shared/26.1.2/bc21fe64fdaa64e59672e7d546d373f430e7557c/shared-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.analytics-library/tracker/26.1.2/2d2260da92e50ac072f89d60a596d03aab3a8757/tracker-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/apksig/3.1.2/5af360dd30015a9a47c8ab0af0e6b05f64760edc/apksig-3.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.squareup/javawriter/2.5.0/81241ff7078ef14f42ea2a8995fa09c096256e6b/javawriter-2.5.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.bouncycastle/bcpkix-jdk15on/1.56/4648af70268b6fdb24674fb1fd7c1fcc73db1231/bcpkix-jdk15on-1.56.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.bouncycastle/bcprov-jdk15on/1.56/a153c6f9744a3e9dd6feab5e210e1c9861362ec7/bcprov-jdk15on-1.56.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/5.1/87b38c12a0ea645791ead9d3e74ae5268d1d6c34/asm-tree-5.1.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/7.2.0/5ad3a2bb04143f70aa0765fc29fc29571a7d6b34/fastutil-7.2.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.googlecode.json-simple/json-simple/1.1/5e303a03d04e6788dddfa3655272580ae0fc13bb/json-simple-1.1.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/1.2.0/4bbda3b5425aa38a9f6960468a29c5ef3e8a28c9/kotlin-reflect-1.2.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.databinding/baseLibrary/3.1.2/1b6a1add6a577708b62737dc31c479549f77750d/baseLibrary-3.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.antlr/antlr4/4.5.3/f35db7e4b2446e4174ba6a73db7bd6b3e6bb5da1/antlr4-4.5.3.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/b1b6ea3b7e4aa4f492509a4952029cd8e48019ad/commons-io-2.4.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.googlecode.juniversalchardet/juniversalchardet/1.0.3/cd49678784c46aa8789c060538e0154013bb421b/juniversalchardet-1.0.3.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.squareup/javapoet/1.8.0/e858dc62ef484048540d27d36f3ec2177a3fa9b1/javapoet-1.8.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.7/751f548c85fa49f330cecbb1875893f971b33c4e/gson-2.7.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/annotations/26.1.2/4f4e0ee71b9ccaa4a70cc86e40fb84ada2ed99a3/annotations-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.sf.proguard/proguard-base/5.3.3/988b6b0636ce343d4962b3b37f6319dcc6e99a61/proguard-base-5.3.3.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.layoutlib/layoutlib-api/26.1.2/3697abf628d30042c1082ea846454dfd1e8da3e/layoutlib-api-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/dvlib/26.1.2/eb39925fee6e726468fc10344ec988c086301ed7/dvlib-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/repository/26.1.2/c8209ccb8ee0e5e3f293fd71d2a827f440ab811c/repository-26.1.2.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.12/84caa68576e345eb5e7ae61a0e5a9229eb100d7b/commons-compress-1.12.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.2.6/e4ca30a6a3a075053a61c6fc850d2432dc012ba7/httpclient-4.2.6.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpmime/4.1/9ba2dcdf94ce35c8a8e9bff242db0618ca932e92/httpmime-4.1.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.sf.kxml/kxml2/2.3.0/ccbc77a5fd907ef863c29f3596c6f54ffa4e9442/kxml2-2.3.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.sun.activation/javax.activation/1.2.0/bf744c1e2776ed1de3c55c8dac1057ec331ef744/javax.activation-1.2.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.glassfish.jaxb/jaxb-runtime/2.2.11/65510afc78679e347b0d774617a97fedac94f8/jaxb-runtime-2.2.11.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.jimfs/jimfs/1.1/8fbd0579dc68aba6186935cc1bee21d2f3e7ec1c/jimfs-1.1.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.2.5/472f0f5f8dba5d1962cb9d7739feed739a31c30d/httpcore-4.2.5.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.1.1/5043bfebc3db072ed80fbd362e7caf00e885d8ae/commons-logging-1.1.1.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.6/b7f0fc8f61ecadeb3695f0b9464755eee44374d4/commons-codec-1.6.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.2.0/25eb440d6eeb9fc60299121020fe726eb2100d03/kotlin-stdlib-1.2.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.glassfish.jaxb/jaxb-core/2.2.11/f5745049f5fb9cb9d9b5f513c207727f475983e9/jaxb-core-2.2.11.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jvnet.staxex/stax-ex/1.7.7/18bed5a0da27a6b43efe01282f2dc911b1cb3a72/stax-ex-1.7.7.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.sun.xml.fastinfoset/FastInfoset/1.2.13/98f56b9354e27bd2941cc5d461344e240ae51ae/FastInfoset-1.2.13.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre7/1.2.0/ec8b969e26fbcf2265a4d1a1539c4d1d4c5af380/kotlin-stdlib-jre7-1.2.0.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.code.findbugs/jsr305/1.3.9/40719ea6961c0cb6afaeb6a921eaa1f6afd4cfdf/jsr305-1.3.9.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.j2objc/j2objc-annotations/1.1/976d8d30bebc251db406f2bdb3eb01962b5685b3/j2objc-annotations-1.1.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.codehaus.mojo/animal-sniffer-annotations/1.14/775b7e22fb10026eed3f86e8dc556dfafe35f2d5/animal-sniffer-annotations-1.14.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/javax.xml.bind/jaxb-api/2.2.12-b140109.1041/7ed0e0d01198614194d56dfb03d9d95aa311824c/jaxb-api-2.2.12-b140109.1041.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.glassfish.jaxb/txw2/2.2.11/2df047d8c187a62f2177bf6013f1f9786cdfc8a2/txw2-2.2.11.jar" />
+ <option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.sun.istack/istack-commons-runtime/2.21/c969d8f15c467f0ef7d7b04889afbe7b5d48e22f/istack-commons-runtime-2.21.jar" />
+ </list>
+ </option>
+ <option name="path" value="$PROJECT_DIR$" />
+ </ExternalModuleBuildClasspathPojo>
+ </value>
+ </entry>
+ </map>
+ </option>
+ <option name="name" value="android" />
+ <option name="projectBuildClasspath">
+ <list>
+ <option value="$PROJECT_DIR$/buildSrc/src/main/java" />
+ <option value="$PROJECT_DIR$/buildSrc/src/main/groovy" />
+ </list>
+ </option>
+ </ExternalProjectBuildClasspathPojo>
+ </value>
+ </entry>
+ </map>
+ </option>
+ <option name="externalProjectsViewState">
+ <projects_view />
+ </option>
+ </component>
+ <component name="ProjectFrameBounds">
+ <option name="x" value="90" />
+ <option name="y" value="24" />
+ <option name="width" value="1339" />
+ <option name="height" value="859" />
+ </component>
+ <component name="ProjectView">
+ <navigator currentView="Scope" currentSubView="Project Files" proportions="" version="1">
+ <flattenPackages />
+ <showMembers />
+ <showModules />
+ <showLibraryContents />
+ <hideEmptyPackages />
+ <abbreviatePackageNames />
+ <autoscrollToSource />
+ <autoscrollFromSource />
+ <sortByType />
+ <manualOrder />
+ <foldersAlwaysOnTop value="true" />
+ </navigator>
+ <panes>
+ <pane id="AndroidView">
+ <subPane>
+ <expand>
+ <path>
+ <item name="xscreensaver" type="1abcf292:AndroidViewProjectNode" />
+ <item name="Gradle Scripts" type="ae0cef3a:AndroidBuildScriptsGroupNode" />
+ </path>
+ </expand>
+ <select />
+ </subPane>
+ </pane>
+ <pane id="PackagesPane" />
+ <pane id="Scratches" />
+ <pane id="ProjectPane" />
+ <pane id="Scope">
+ <subPane subId="Project Files">
+ <expand>
+ <path>
+ <item name="Root" type="cbb8eebc:String" user="Root" />
+ <item name="android" type="cbb8eebc:String" user="android" />
+ </path>
+ <path>
+ <item name="Root" type="cbb8eebc:String" user="Root" />
+ <item name="android" type="cbb8eebc:String" user="android" />
+ <item name="$PROJECT_DIR$/.." type="cbb8eebc:String" user="$PROJECT_DIR$/.." />
+ </path>
+ <path>
+ <item name="Root" type="cbb8eebc:String" user="Root" />
+ <item name="android" type="cbb8eebc:String" user="android" />
+ <item name="$PROJECT_DIR$/.." type="cbb8eebc:String" user="$PROJECT_DIR$/.." />
+ <item name="gradle/wrapper" type="cbb8eebc:String" user="gradle/wrapper" />
+ </path>
+ </expand>
+ <select />
+ </subPane>
+ </pane>
+ </panes>
+ </component>
+ <component name="PropertiesComponent">
+ <property name="GoToClass.includeLibraries" value="false" />
+ <property name="GoToClass.toSaveIncludeLibraries" value="false" />
+ <property name="GoToFile.includeJavaFiles" value="false" />
+ <property name="MemberChooser.sorted" value="false" />
+ <property name="MemberChooser.showClasses" value="true" />
+ <property name="MemberChooser.copyJavadoc" value="false" />
+ <property name="settings.editor.selected.configurable" value="android.sdk-updates" />
+ <property name="settings.editor.splitter.proportion" value="0.2" />
+ <property name="SearchEverywhereHistoryKey" value="sdk manager&#9;ACTION&#9;WelcomeScreen.RunAndroidSdkManager" />
+ <property name="last_opened_file_path" value="$PROJECT_DIR$" />
+ <property name="show.do.not.ask.upgrade.gradle.plugin" value="2.1.0" />
+ <property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1533959035566" />
+ <property name="device.picker.selection" value="Nexus_5_8.1" />
+ </component>
+ <component name="RunDashboard">
+ <option name="ruleStates">
+ <list>
+ <RuleState>
+ <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
+ </RuleState>
+ <RuleState>
+ <option name="name" value="StatusDashboardGroupingRule" />
+ </RuleState>
+ </list>
+ </option>
+ </component>
+ <component name="RunManager">
+ <configuration default="true" type="AndroidJUnit" factoryName="Android JUnit">
+ <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+ <module name="" />
+ <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+ <option name="ALTERNATIVE_JRE_PATH" />
+ <option name="PACKAGE_NAME" />
+ <option name="MAIN_CLASS_NAME" />
+ <option name="METHOD_NAME" />
+ <option name="TEST_OBJECT" value="class" />
+ <option name="VM_PARAMETERS" />
+ <option name="PARAMETERS" />
+ <option name="WORKING_DIRECTORY" value="file://$MODULE_DIR$" />
+ <option name="ENV_VARIABLES" />
+ <option name="PASS_PARENT_ENVS" value="true" />
+ <option name="TEST_SEARCH_SCOPE">
+ <value defaultName="singleModule" />
+ </option>
+ <envs />
+ <patterns />
+ <method>
+ <option name="Android.Gradle.BeforeRunTask" enabled="true" />
+ </method>
+ </configuration>
+ <configuration default="true" type="AndroidRunConfigurationType" factoryName="Android App">
+ <module name="" />
+ <option name="DEPLOY" value="true" />
+ <option name="ARTIFACT_NAME" value="" />
+ <option name="PM_INSTALL_OPTIONS" value="" />
+ <option name="ACTIVITY_EXTRA_FLAGS" value="" />
+ <option name="MODE" value="default_activity" />
+ <option name="CLEAR_LOGCAT" value="false" />
+ <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
+ <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
+ <option name="FORCE_STOP_RUNNING_APP" value="true" />
+ <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
+ <option name="USE_LAST_SELECTED_DEVICE" value="false" />
+ <option name="PREFERRED_AVD" value="" />
+ <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
+ <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
+ <option name="DEBUGGER_TYPE" value="Auto" />
+ <Auto>
+ <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
+ <option name="SHOW_STATIC_VARS" value="true" />
+ <option name="WORKING_DIR" value="" />
+ <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
+ <option name="SHOW_OPTIMIZED_WARNING" value="true" />
+ </Auto>
+ <Hybrid>
+ <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
+ <option name="SHOW_STATIC_VARS" value="true" />
+ <option name="WORKING_DIR" value="" />
+ <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
+ <option name="SHOW_OPTIMIZED_WARNING" value="true" />
+ </Hybrid>
+ <Java />
+ <Native>
+ <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
+ <option name="SHOW_STATIC_VARS" value="true" />
+ <option name="WORKING_DIR" value="" />
+ <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
+ <option name="SHOW_OPTIMIZED_WARNING" value="true" />
+ </Native>
+ <Profilers>
+ <option name="ADVANCED_PROFILING_ENABLED" value="false" />
+ </Profilers>
+ <option name="DEEP_LINK" value="" />
+ <option name="ACTIVITY_CLASS" value="" />
+ <method>
+ <option name="Android.Gradle.BeforeRunTask" enabled="true" />
+ <option name="com.android.instantApps.provision.BeforeRunTask" enabled="true" clearCache="false" clearProvisionedDevices="false" />
+ </method>
+ </configuration>
+ <configuration name="xscreensaver" type="AndroidRunConfigurationType" factoryName="Android App">
+ <module name="xscreensaver" />
+ <option name="DEPLOY" value="true" />
+ <option name="ARTIFACT_NAME" value="" />
+ <option name="PM_INSTALL_OPTIONS" value="" />
+ <option name="ACTIVITY_EXTRA_FLAGS" value="" />
+ <option name="MODE" value="default_activity" />
+ <option name="CLEAR_LOGCAT" value="false" />
+ <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
+ <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
+ <option name="FORCE_STOP_RUNNING_APP" value="true" />
+ <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
+ <option name="USE_LAST_SELECTED_DEVICE" value="false" />
+ <option name="PREFERRED_AVD" value="" />
+ <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
+ <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
+ <option name="DEBUGGER_TYPE" value="Auto" />
+ <Auto>
+ <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
+ <option name="SHOW_STATIC_VARS" value="true" />
+ <option name="WORKING_DIR" value="" />
+ <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
+ <option name="SHOW_OPTIMIZED_WARNING" value="true" />
+ </Auto>
+ <Hybrid>
+ <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
+ <option name="SHOW_STATIC_VARS" value="true" />
+ <option name="WORKING_DIR" value="" />
+ <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
+ <option name="SHOW_OPTIMIZED_WARNING" value="true" />
+ </Hybrid>
+ <Java />
+ <Native>
+ <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
+ <option name="SHOW_STATIC_VARS" value="true" />
+ <option name="WORKING_DIR" value="" />
+ <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
+ <option name="SHOW_OPTIMIZED_WARNING" value="true" />
+ </Native>
+ <Profilers>
+ <option name="ADVANCED_PROFILING_ENABLED" value="false" />
+ </Profilers>
+ <option name="DEEP_LINK" value="" />
+ <option name="ACTIVITY_CLASS" value="" />
+ <method>
+ <option name="com.android.instantApps.provision.BeforeRunTask" enabled="true" clearCache="false" clearProvisionedDevices="false" />
+ </method>
+ </configuration>
+ <configuration default="true" type="Application" factoryName="Application">
+ <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+ <option name="MAIN_CLASS_NAME" />
+ <option name="VM_PARAMETERS" />
+ <option name="PROGRAM_PARAMETERS" />
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
+ <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+ <option name="ALTERNATIVE_JRE_PATH" />
+ <option name="ENABLE_SWING_INSPECTOR" value="false" />
+ <option name="ENV_VARIABLES" />
+ <option name="PASS_PARENT_ENVS" value="true" />
+ <module name="" />
+ <envs />
+ </configuration>
+ <configuration default="true" type="Remote" factoryName="Remote">
+ <option name="USE_SOCKET_TRANSPORT" value="true" />
+ <option name="SERVER_MODE" value="false" />
+ <option name="SHMEM_ADDRESS" value="javadebug" />
+ <option name="HOST" value="localhost" />
+ <option name="PORT" value="5005" />
+ </configuration>
+ <configuration default="true" type="TestNG" factoryName="TestNG">
+ <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+ <module name="" />
+ <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+ <option name="ALTERNATIVE_JRE_PATH" />
+ <option name="SUITE_NAME" />
+ <option name="PACKAGE_NAME" />
+ <option name="MAIN_CLASS_NAME" />
+ <option name="METHOD_NAME" />
+ <option name="GROUP_NAME" />
+ <option name="TEST_OBJECT" value="CLASS" />
+ <option name="VM_PARAMETERS" value="-ea" />
+ <option name="PARAMETERS" />
+ <option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
+ <option name="OUTPUT_DIRECTORY" />
+ <option name="ANNOTATION_TYPE" />
+ <option name="ENV_VARIABLES" />
+ <option name="PASS_PARENT_ENVS" value="true" />
+ <option name="TEST_SEARCH_SCOPE">
+ <value defaultName="singleModule" />
+ </option>
+ <option name="USE_DEFAULT_REPORTERS" value="false" />
+ <option name="PROPERTIES_FILE" />
+ <envs />
+ <properties />
+ <listeners />
+ </configuration>
+ <configuration name="&lt;template&gt;" type="Applet" default="true" selected="false">
+ <option name="MAIN_CLASS_NAME" />
+ <option name="HTML_FILE_NAME" />
+ <option name="HTML_USED" value="false" />
+ <option name="WIDTH" value="400" />
+ <option name="HEIGHT" value="300" />
+ <option name="POLICY_FILE" value="$APPLICATION_HOME_DIR$/bin/appletviewer.policy" />
+ <option name="VM_PARAMETERS" />
+ </configuration>
+ <configuration name="&lt;template&gt;" type="#org.jetbrains.idea.devkit.run.PluginConfigurationType" default="true" selected="false">
+ <option name="VM_PARAMETERS" value="-Xmx512m -Xms256m -XX:MaxPermSize=250m -ea" />
+ </configuration>
+ </component>
+ <component name="ShelveChangesManager" show_recycled="false">
+ <option name="remove_strategy" value="false" />
+ </component>
+ <component name="SvnConfiguration">
+ <configuration />
+ </component>
+ <component name="TaskManager">
+ <task active="true" id="Default" summary="Default task">
+ <changelist id="41008724-035d-4e24-92b6-6dfb9231c83c" name="Default" comment="" />
+ <created>1475536195508</created>
+ <option name="number" value="Default" />
+ <option name="presentableId" value="Default" />
+ <updated>1475536195508</updated>
+ </task>
+ <servers />
+ </component>
+ <component name="ToolWindowManager">
+ <frame x="90" y="24" width="1339" height="859" extended-state="0" />
+ <layout>
+ <window_info id="Android Profiler" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+ <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
+ <window_info id="Palette&#9;" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+ <window_info id="Image Layers" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+ <window_info id="Build Variants" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="true" content_ui="tabs" />
+ <window_info id="Capture Analysis" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+ <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32928476" sideWeight="0.5312259" order="7" side_tool="true" content_ui="tabs" />
+ <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+ <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+ <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+ <window_info id="Logcat" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+ <window_info id="Captures" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+ <window_info id="Capture Tool" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+ <window_info id="Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+ <window_info id="Project" active="true" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.2544333" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+ <window_info id="Build" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32928476" sideWeight="0.47185814" order="8" side_tool="false" content_ui="tabs" />
+ <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.32928476" sideWeight="0.49421743" order="1" side_tool="false" content_ui="tabs" />
+ <window_info id="Gradle" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+ <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+ <window_info id="Device File Explorer" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="true" content_ui="tabs" />
+ <window_info id="Theme Preview" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+ <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+ <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="true" content_ui="tabs" />
+ <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
+ <window_info id="Nl-Palette" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+ <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+ <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="SLIDING" type="SLIDING" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+ <window_info id="Android Monitor" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+ <window_info id="Properties" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+ <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
+ <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+ <window_info id="Android Model" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="true" content_ui="tabs" />
+ <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.32839838" sideWeight="0.49730146" order="7" side_tool="false" content_ui="tabs" />
+ <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
+ <window_info id="Gradle Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
+ </layout>
+ </component>
+ <component name="Vcs.Log.UiProperties">
+ <option name="RECENTLY_FILTERED_USER_GROUPS">
+ <collection />
+ </option>
+ <option name="RECENTLY_FILTERED_BRANCH_GROUPS">
+ <collection />
+ </option>
+ </component>
+ <component name="VcsContentAnnotationSettings">
+ <option name="myLimit" value="2678400000" />
+ </component>
+ <component name="VcsManagerConfiguration">
+ <ignored-roots>
+ <path value="$PROJECT_DIR$/../.." />
+ </ignored-roots>
+ </component>
+ <component name="XDebuggerManager">
+ <breakpoint-manager />
+ <watches-manager />
+ </component>
+ <component name="editorHistoryManager">
+ <entry file="file://$PROJECT_DIR$/../gradle/wrapper/gradle-wrapper.properties">
+ <provider selected="true" editor-type-id="text-editor">
+ <state relative-caret-position="0">
+ <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+ <folding />
+ </state>
+ </provider>
+ </entry>
+ <entry file="file://$PROJECT_DIR$/../gradle/wrapper/gradle-wrapper.properties">
+ <provider selected="true" editor-type-id="text-editor">
+ <state relative-caret-position="0">
+ <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+ <folding />
+ </state>
+ </provider>
+ </entry>
+ <entry file="file://$PROJECT_DIR$/../gradle/wrapper/gradle-wrapper.properties">
+ <provider selected="true" editor-type-id="text-editor">
+ <state relative-caret-position="0">
+ <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+ <folding />
+ </state>
+ </provider>
+ </entry>
+ <entry file="file://$PROJECT_DIR$/../gradle/wrapper/gradle-wrapper.properties">
+ <provider selected="true" editor-type-id="text-editor">
+ <state relative-caret-position="0">
+ <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+ <folding />
+ </state>
+ </provider>
+ </entry>
+ <entry file="file://$PROJECT_DIR$/../gradle/wrapper/gradle-wrapper.properties">
+ <provider selected="true" editor-type-id="text-editor">
+ <state relative-caret-position="0">
+ <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+ <folding />
+ </state>
+ </provider>
+ </entry>
+ <entry file="file://$PROJECT_DIR$/../gradle/wrapper/gradle-wrapper.properties">
+ <provider selected="true" editor-type-id="text-editor">
+ <state relative-caret-position="90">
+ <caret line="6" column="0" lean-forward="false" selection-start-line="6" selection-start-column="0" selection-end-line="6" selection-end-column="0" />
+ <folding />
+ </state>
+ </provider>
+ </entry>
+ </component>
+</project> \ No newline at end of file
diff --git a/android/xscreensaver/assets/fonts/OCRAStd.otf b/android/xscreensaver/assets/fonts/OCRAStd.otf
new file mode 120000
index 0000000..6259345
--- /dev/null
+++ b/android/xscreensaver/assets/fonts/OCRAStd.otf
@@ -0,0 +1 @@
+../../../../OSX/OCRAStd.otf \ No newline at end of file
diff --git a/android/xscreensaver/assets/fonts/PxPlus_IBM_VGA8.ttf b/android/xscreensaver/assets/fonts/PxPlus_IBM_VGA8.ttf
new file mode 120000
index 0000000..184d654
--- /dev/null
+++ b/android/xscreensaver/assets/fonts/PxPlus_IBM_VGA8.ttf
@@ -0,0 +1 @@
+../../../../OSX/PxPlus_IBM_VGA8.ttf \ No newline at end of file
diff --git a/android/xscreensaver/assets/fonts/YearlReg.ttf b/android/xscreensaver/assets/fonts/YearlReg.ttf
new file mode 120000
index 0000000..8977be4
--- /dev/null
+++ b/android/xscreensaver/assets/fonts/YearlReg.ttf
@@ -0,0 +1 @@
+../../../../OSX/YearlReg.ttf \ No newline at end of file
diff --git a/android/xscreensaver/build.gradle b/android/xscreensaver/build.gradle
new file mode 100644
index 0000000..f0ff9a3
--- /dev/null
+++ b/android/xscreensaver/build.gradle
@@ -0,0 +1,109 @@
+apply plugin: 'android'
+
+dependencies {
+ compile fileTree(include: '*.jar', dir: 'libs')
+ compile "com.android.support:support-v4:27.1.1"
+}
+
+android {
+ compileSdkVersion 27
+ buildToolsVersion "27.0.3"
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_7
+ targetCompatibility JavaVersion.VERSION_1_7
+ }
+ sourceSets {
+ main {
+ manifest.srcFile 'AndroidManifest.xml'
+ java.srcDirs = ['src']
+ resources.srcDirs = ['src']
+ aidl.srcDirs = ['src']
+ renderscript.srcDirs = ['src']
+ res.srcDirs = ['res']
+ assets.srcDirs = ['assets']
+ // jniLibs.srcDirs = ['jni']
+ jniLibs.srcDirs = ['libs']
+ jni.srcDirs = [] // disable automatic ndk-build call
+ }
+
+ // Move the tests to tests/java, tests/res, etc...
+ androidTest.setRoot('tests')
+
+ // Move the build types to build-types/<type>
+ // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
+ // This moves them out of them default location under src/<type>/... which would
+ // conflict with src/ being used by the main source set.
+ // Adding new build types or product flavors should be accompanied
+ // by a similar customization.
+ debug.setRoot('build-types/debug')
+ release.setRoot('build-types/release')
+ }
+ project.ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'arm64-v8a': 3, 'mips': 5, 'mips64': 6, 'x86': 8, 'x86_64': 9]
+ //versionCode digit for each supported ABI, with 64bit>32bit and x86>armeabi-*
+
+
+ // put ndk-build in build's path, or replace below with its full path
+ task ndkBuild(type: Exec) {
+ Properties properties = new Properties()
+ properties.load(project.rootProject.file('local.properties').newDataInputStream())
+ def ndkDir = properties.getProperty('ndk.dir')
+ commandLine "$ndkDir/ndk-build", '-C', file('jni').absolutePath,
+ '-j' + Runtime.getRuntime().availableProcessors().toString()
+ }
+
+ // generate files early in the process
+ task perlBuild(type: Exec) {
+ commandLine 'sh', '-c',
+ 'cd ..; ../hacks/check-configs.pl --build-android $ANDROID_HACKS'
+ }
+
+ task perlClean(type: Delete) {
+ delete('../gen')
+ delete('res/values')
+ delete('res/xml')
+ delete('src/org/jwz/xscreensaver/gen')
+ delete('AndroidManifest.xml')
+ }
+
+ task objlibClean(type: Delete) {
+ delete('./build')
+ delete('./libs')
+ delete('./obj')
+ }
+
+ task downloadNeededDrawables(type: Exec) {
+ commandLine 'sh', '-c',
+ 'cd ../ ; \
+ for f in $ANDROID_HACKS; do \
+ f=`echo "$f" | sed s/rd-bomb/rdbomb/` ; \
+ make -s xscreensaver/res/drawable/$f.png ; \
+ done'
+ }
+ preBuild.dependsOn downloadNeededDrawables
+
+ preBuild.dependsOn perlBuild
+
+ clean.dependsOn perlClean
+ clean.dependsOn objlibClean
+
+ tasks.withType(JavaCompile) {
+ options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
+ }
+
+ tasks.withType(JavaCompile) {
+ compileTask -> compileTask.dependsOn ndkBuild
+ }
+
+
+ defaultConfig {
+ minSdkVersion 15
+ targetSdkVersion 27
+ }
+ productFlavors {
+ }
+ buildTypes {
+ debug {
+ jniDebuggable true
+ }
+ }
+}
diff --git a/android/xscreensaver/build.xml b/android/xscreensaver/build.xml
new file mode 100644
index 0000000..abda7fe
--- /dev/null
+++ b/android/xscreensaver/build.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="Xscreensaver" default="help">
+
+ <!-- The local.properties file is created and updated by the 'android' tool.
+ It contains the path to the SDK. It should *NOT* be checked into
+ Version Control Systems. -->
+ <property file="local.properties" />
+
+ <!-- The ant.properties file can be created by you. It is only edited by the
+ 'android' tool to add properties to it.
+ This is the place to change some Ant specific build properties.
+ Here are some properties you may want to change/update:
+
+ source.dir
+ The name of the source directory. Default is 'src'.
+ out.dir
+ The name of the output directory. Default is 'bin'.
+
+ For other overridable properties, look at the beginning of the rules
+ files in the SDK, at tools/ant/build.xml
+
+ Properties related to the SDK location or the project target should
+ be updated using the 'android' tool with the 'update' action.
+
+ This file is an integral part of the build system for your
+ application and should be checked into Version Control Systems.
+
+ -->
+ <property file="ant.properties" />
+
+ <!-- if sdk.dir was not set from one of the property file, then
+ get it from the ANDROID_HOME env var.
+ This must be done before we load project.properties since
+ the proguard config can use sdk.dir -->
+ <property environment="env" />
+ <condition property="sdk.dir" value="${env.ANDROID_HOME}">
+ <isset property="env.ANDROID_HOME" />
+ </condition>
+
+ <!-- The project.properties file is created and updated by the 'android'
+ tool, as well as ADT.
+
+ This contains project specific properties such as project target, and library
+ dependencies. Lower level build properties are stored in ant.properties
+ (or in .classpath for Eclipse projects).
+
+ This file is an integral part of the build system for your
+ application and should be checked into Version Control Systems. -->
+ <loadproperties srcFile="project.properties" />
+
+ <!-- quick check on sdk.dir -->
+ <fail
+ message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
+ unless="sdk.dir"
+ />
+
+ <!--
+ Import per project custom build rules if present at the root of the project.
+ This is the place to put custom intermediary targets such as:
+ -pre-build
+ -pre-compile
+ -post-compile (This is typically used for code obfuscation.
+ Compiled code location: ${out.classes.absolute.dir}
+ If this is not done in place, override ${out.dex.input.absolute.dir})
+ -post-package
+ -post-build
+ -pre-clean
+ -->
+ <import file="custom_rules.xml" optional="true" />
+
+ <!-- Import the actual build file.
+
+ To customize existing targets, there are two options:
+ - Customize only one target:
+ - copy/paste the target into this file, *before* the
+ <import> task.
+ - customize it to your needs.
+ - Customize the whole content of build.xml
+ - copy/paste the content of the rules files (minus the top node)
+ into this file, replacing the <import> task.
+ - customize to your needs.
+
+ ***********************
+ ****** IMPORTANT ******
+ ***********************
+ In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
+ in order to avoid having your file be overridden by tools such as "android update project"
+ -->
+ <!-- version-tag: 1 -->
+ <import file="${sdk.dir}/tools/ant/build.xml" />
+
+</project>
diff --git a/android/xscreensaver/gradle/wrapper/gradle-wrapper.jar b/android/xscreensaver/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..13372ae
--- /dev/null
+++ b/android/xscreensaver/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/android/xscreensaver/gradle/wrapper/gradle-wrapper.properties b/android/xscreensaver/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..3524910
--- /dev/null
+++ b/android/xscreensaver/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Sat Feb 10 21:20:31 PST 2018
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
diff --git a/android/xscreensaver/gradlew b/android/xscreensaver/gradlew
new file mode 100644
index 0000000..9d82f78
--- /dev/null
+++ b/android/xscreensaver/gradlew
@@ -0,0 +1,160 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/android/xscreensaver/gradlew.bat b/android/xscreensaver/gradlew.bat
new file mode 100644
index 0000000..aec9973
--- /dev/null
+++ b/android/xscreensaver/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/android/xscreensaver/jni/Android.mk b/android/xscreensaver/jni/Android.mk
new file mode 100644
index 0000000..1e20a83
--- /dev/null
+++ b/android/xscreensaver/jni/Android.mk
@@ -0,0 +1,199 @@
+LOCAL_PATH := $(call my-dir)/../../..
+
+# -Wnested-externs would also be here, but for Android unistd.h.
+SHARED_CFLAGS = \
+ -std=c99 \
+ -Wall \
+ -Wstrict-prototypes \
+ -Wmissing-prototypes \
+ -DGL_GLEXT_PROTOTYPES \
+ -DSTANDALONE=1 \
+ -DHAVE_ANDROID=1 \
+ -DHAVE_GL=1 \
+ -DHAVE_JWXYZ=1 \
+ -DJWXYZ_GL=1 \
+ -DJWXYZ_IMAGE=1 \
+ -DHAVE_JWZGLES=1 \
+ -DHAVE_XUTF8DRAWSTRING=1 \
+ -DHAVE_GLBINDTEXTURE=1 \
+ -DHAVE_UNISTD_H=1 \
+ -DHAVE_INTTYPES_H=1 \
+ -DHAVE_UNAME=1 \
+ -DHAVE_UTIL_H=1 \
+ -DGETTIMEOFDAY_TWO_ARGS=1 \
+ -DHAVE_ICMP=1 \
+ -DHAVE_PTHREAD=1 \
+
+SHARED_C_INCLUDES = \
+ $(LOCAL_PATH) \
+ $(LOCAL_PATH)/android \
+ $(LOCAL_PATH)/utils \
+ $(LOCAL_PATH)/jwxyz \
+ $(LOCAL_PATH)/hacks \
+ $(LOCAL_PATH)/hacks/glx \
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := xscreensaver-gl
+
+LOCAL_SRC_FILES := \
+ android/screenhack-android.c \
+ hacks/glx/dropshadow.c \
+ hacks/glx/chessmodels.c \
+ hacks/glx/fps-gl.c \
+ hacks/glx/gltrackball.c \
+ hacks/glx/glut_stroke.c \
+ hacks/glx/glut_swidth.c \
+ hacks/glx/grab-ximage.c \
+ hacks/glx/marching.c \
+ hacks/glx/normals.c \
+ hacks/glx/rotator.c \
+ hacks/glx/sphere.c \
+ hacks/glx/texfont.c \
+ hacks/glx/trackball.c \
+ hacks/glx/tube.c \
+
+# Some savers occupy more than one source file:
+LOCAL_SRC_FILES += \
+ hacks/glx/b_draw.c \
+ hacks/glx/b_lockglue.c \
+ hacks/glx/b_sphere.c \
+ hacks/glx/buildlwo.c \
+ hacks/glx/companion_quad.c \
+ hacks/glx/companion_disc.c \
+ hacks/glx/companion_heart.c \
+ hacks/glx/cow_face.c \
+ hacks/glx/cow_hide.c \
+ hacks/glx/cow_hoofs.c \
+ hacks/glx/cow_horns.c \
+ hacks/glx/cow_tail.c \
+ hacks/glx/cow_udder.c \
+ hacks/glx/dolphin.c \
+ hacks/glx/dymaxionmap-coords.c \
+ hacks/glx/gllist.c \
+ hacks/glx/glschool_alg.c \
+ hacks/glx/glschool_gl.c \
+ hacks/glx/involute.c \
+ hacks/glx/lament_model.c \
+ hacks/glx/pipeobjs.c \
+ hacks/glx/quickhull.c \
+ hacks/glx/robot.c \
+ hacks/glx/robot-wireframe.c \
+ hacks/glx/polyhedra-gl.c \
+ hacks/glx/s1_1.c \
+ hacks/glx/s1_2.c \
+ hacks/glx/s1_3.c \
+ hacks/glx/s1_4.c \
+ hacks/glx/s1_5.c \
+ hacks/glx/s1_6.c \
+ hacks/glx/s1_b.c \
+ hacks/glx/seccam.c \
+ hacks/glx/shark.c \
+ hacks/glx/ships.c \
+ hacks/glx/sonar-sim.c \
+ hacks/glx/sonar-icmp.c \
+ hacks/glx/splitflap_obj.c \
+ hacks/glx/sproingiewrap.c \
+ hacks/glx/stonerview-move.c \
+ hacks/glx/stonerview-osc.c \
+ hacks/glx/stonerview-view.c \
+ hacks/glx/swim.c \
+ hacks/glx/tangram_shapes.c \
+ hacks/glx/teapot.c \
+ hacks/glx/toast.c \
+ hacks/glx/toast2.c \
+ hacks/glx/toaster.c \
+ hacks/glx/toaster_base.c \
+ hacks/glx/toaster_handle.c \
+ hacks/glx/toaster_handle2.c \
+ hacks/glx/toaster_jet.c \
+ hacks/glx/toaster_knob.c \
+ hacks/glx/toaster_slots.c \
+ hacks/glx/toaster_wing.c \
+ hacks/glx/tronbit_idle1.c \
+ hacks/glx/tronbit_idle2.c \
+ hacks/glx/tronbit_no.c \
+ hacks/glx/tronbit_yes.c \
+ hacks/glx/tunnel_draw.c \
+ hacks/glx/whale.c \
+
+# The source files of the currently active GL hacks:
+LOCAL_SRC_FILES += $(shell \
+ for f in $$ANDROID_HACKS ; do \
+ if [ "$$f" = "companioncube" ]; then f="companion"; fi ; \
+ if [ -f "../../../hacks/glx/$$f.c" ]; then \
+ echo "hacks/glx/$$f.c" ; \
+ fi ; \
+ done )
+
+LOCAL_C_INCLUDES := $(SHARED_C_INCLUDES)
+LOCAL_CFLAGS += $(SHARED_CFLAGS) -DUSE_GL
+
+include $(BUILD_STATIC_LIBRARY)
+
+##############################################################################
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := xscreensaver
+
+LOCAL_STATIC_LIBRARIES := xscreensaver-gl
+
+# The base framework files:
+LOCAL_SRC_FILES := \
+ jwxyz/jwxyz-android.c \
+ jwxyz/jwxyz-common.c \
+ jwxyz/jwxyz-gl.c \
+ jwxyz/jwxyz-image.c \
+ jwxyz/jwxyz-timers.c \
+ jwxyz/jwzgles.c \
+
+# Utilities used by the hacks:
+LOCAL_SRC_FILES += \
+ hacks/analogtv.c \
+ hacks/delaunay.c \
+ hacks/fps.c \
+ hacks/xlockmore.c \
+ hacks/ximage-loader.c \
+ utils/async_netdb.c \
+ utils/aligned_malloc.c \
+ utils/colorbars.c \
+ utils/colors.c \
+ utils/erase.c \
+ utils/font-retry.c \
+ utils/grabclient.c \
+ utils/hsv.c \
+ utils/logo.c \
+ utils/minixpm.c \
+ utils/pow2.c \
+ utils/resources.c \
+ utils/spline.c \
+ utils/textclient-mobile.c \
+ utils/thread_util.c \
+ utils/usleep.c \
+ utils/utf8wc.c \
+ utils/xft.c \
+ utils/xshm.c \
+ utils/yarandom.c \
+
+# The source files of the currently active Xlib hacks:
+LOCAL_SRC_FILES += $(shell \
+ for f in $$ANDROID_HACKS ; do \
+ if [ -f "../../../hacks/$$f.c" ]; then \
+ echo "hacks/$$f.c" ; \
+ fi ; \
+ done )
+
+# Some savers occupy more than one source file:
+LOCAL_SRC_FILES += \
+ hacks/apple2-main.c \
+ hacks/asm6502.c \
+ hacks/pacman_ai.c \
+ hacks/pacman_level.c \
+
+LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog -lEGL -latomic -landroid -ljnigraphics
+
+LOCAL_C_INCLUDES := $(SHARED_C_INCLUDES)
+LOCAL_CFLAGS += $(SHARED_CFLAGS)
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/android/xscreensaver/jni/Application.mk b/android/xscreensaver/jni/Application.mk
new file mode 100644
index 0000000..d3f5436
--- /dev/null
+++ b/android/xscreensaver/jni/Application.mk
@@ -0,0 +1,7 @@
+# Get this value from android/Makefile
+APP_ABI := $(shell echo $$APP_ABI)
+APP_STL := stlport_static
+APP_PLATFORM := android-14
+# ^^ APP_PLATFORM is minimum API version supported
+# https://android.googlesource.com/platform/ndk/+/master/docs/user/common_problems.md#target-api-set-higher-than-device-api
+
diff --git a/android/xscreensaver/local.properties b/android/xscreensaver/local.properties
new file mode 100644
index 0000000..d530e0d
--- /dev/null
+++ b/android/xscreensaver/local.properties
@@ -0,0 +1,11 @@
+## This file is automatically generated by Android Studio.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must *NOT* be checked into Version Control Systems,
+# as it contains information specific to your local configuration.
+#
+# Location of the SDK. This is only used by Gradle.
+# For customization when using a Version Control System, please read the
+# header note.
+#Mon Oct 03 16:09:56 PDT 2016
+sdk.dir=/Users/jwz/Library/Android/sdk
diff --git a/android/xscreensaver/project.properties b/android/xscreensaver/project.properties
new file mode 100644
index 0000000..1e1e7a3
--- /dev/null
+++ b/android/xscreensaver/project.properties
@@ -0,0 +1,15 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+android.library.reference.1=
+# Project target.
+target=android-19
diff --git a/android/xscreensaver/res/drawable-ldpi/icon.png b/android/xscreensaver/res/drawable-ldpi/icon.png
new file mode 100644
index 0000000..c4d1934
--- /dev/null
+++ b/android/xscreensaver/res/drawable-ldpi/icon.png
Binary files differ
diff --git a/android/xscreensaver/res/drawable-mdpi/icon.png b/android/xscreensaver/res/drawable-mdpi/icon.png
new file mode 100644
index 0000000..1e14e4b
--- /dev/null
+++ b/android/xscreensaver/res/drawable-mdpi/icon.png
Binary files differ
diff --git a/android/xscreensaver/res/drawable/thumbnail.png b/android/xscreensaver/res/drawable/thumbnail.png
new file mode 100644
index 0000000..a86c16c
--- /dev/null
+++ b/android/xscreensaver/res/drawable/thumbnail.png
Binary files differ
diff --git a/android/xscreensaver/res/layout-land/activity_xscreensaver.xml b/android/xscreensaver/res/layout-land/activity_xscreensaver.xml
new file mode 100644
index 0000000..d9094b9
--- /dev/null
+++ b/android/xscreensaver/res/layout-land/activity_xscreensaver.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- TODO: Remove action bar; it's redundant. -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="horizontal"
+ android:gravity="center_horizontal"
+ tools:context="org.jwz.xscreensaver.Activity">
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:layout_centerHorizontal="true"
+ android:layout_centerVertical="true"
+ android:gravity="center_vertical"
+ android:orientation="vertical">
+
+ <ImageView
+ android:layout_width="256sp"
+ android:layout_height="256sp"
+ android:layout_centerHorizontal="true"
+ android:src="@drawable/thumbnail" />
+ <!-- TODO: Version number! -->
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:layout_centerHorizontal="true"
+ android:layout_centerVertical="true"
+ android:gravity="center_vertical"
+ android:orientation="vertical">
+
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:text="XScreenSaver"
+ android:textSize="32sp" />
+ <Button
+ android:id="@+id/apply_wallpaper"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="Open live wallpaper list" />
+ <Button
+ android:id="@+id/apply_daydream"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="Open Daydream list" />
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:autoLink="web"
+ android:gravity="center"
+ android:text="https://www.jwz.org/xscreensaver/" />
+ </LinearLayout>
+</LinearLayout>
diff --git a/android/xscreensaver/res/layout/activity_tv_xscreensaver.xml b/android/xscreensaver/res/layout/activity_tv_xscreensaver.xml
new file mode 100644
index 0000000..4c658bd
--- /dev/null
+++ b/android/xscreensaver/res/layout/activity_tv_xscreensaver.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- TODO: Flip layout orientation on rotation. And maybe make scrollable? -->
+<!-- TODO: Remove action bar; it's redundant. -->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ tools:context="org.jwz.xscreensaver.TVActivity">
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerHorizontal="true"
+ android:layout_centerVertical="true"
+ android:orientation="vertical">
+ <ImageView
+ android:layout_width="256sp"
+ android:layout_height="256sp"
+ android:layout_centerHorizontal="true"
+ android:src="@drawable/thumbnail" />
+ <!-- TODO: Version number! -->
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:text="XScreenSaver"
+ android:textSize="32sp" />
+ <!-- TODO: Either figure out how to open daydream settings directly on
+ Android TV, or change this to say "Open Settings". -->
+ <Button
+ android:id="@+id/apply_daydream"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="Open Daydream list" />
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:autoLink="web"
+ android:gravity="center"
+ android:text="https://www.jwz.org/xscreensaver/" />
+ </LinearLayout>
+</RelativeLayout>
diff --git a/android/xscreensaver/res/layout/activity_xscreensaver.xml b/android/xscreensaver/res/layout/activity_xscreensaver.xml
new file mode 100644
index 0000000..88372e6
--- /dev/null
+++ b/android/xscreensaver/res/layout/activity_xscreensaver.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- TODO: Flip layout orientation on rotation. And maybe make scrollable? -->
+<!-- TODO: Remove action bar; it's redundant. -->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ tools:context="org.jwz.xscreensaver.Activity">
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerHorizontal="true"
+ android:layout_centerVertical="true"
+ android:orientation="vertical">
+ <ImageView
+ android:layout_width="256sp"
+ android:layout_height="256sp"
+ android:layout_centerHorizontal="true"
+ android:src="@drawable/thumbnail" />
+ <!-- TODO: Version number! -->
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:text="XScreenSaver"
+ android:textSize="32sp" />
+ <Button
+ android:id="@+id/apply_wallpaper"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="Open live wallpaper list" />
+ <Button
+ android:id="@+id/apply_daydream"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="Open Daydream list" />
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:autoLink="web"
+ android:gravity="center"
+ android:text="https://www.jwz.org/xscreensaver/" />
+ </LinearLayout>
+</RelativeLayout>
diff --git a/android/xscreensaver/res/layout/main.xml b/android/xscreensaver/res/layout/main.xml
new file mode 100644
index 0000000..4361cfe
--- /dev/null
+++ b/android/xscreensaver/res/layout/main.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ >
+</LinearLayout>
diff --git a/android/xscreensaver/res/layout/preference_blurb.xml b/android/xscreensaver/res/layout/preference_blurb.xml
new file mode 100644
index 0000000..66e6d82
--- /dev/null
+++ b/android/xscreensaver/res/layout/preference_blurb.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Layout for the description of each screen saver, that appears
+ at the bottom of the preferences screen. Based on
+ sdk/platforms/android-21/data/res/layout/preference.xml
+ -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:gravity="center_vertical"
+ android:paddingEnd="?android:attr/scrollbarSize"
+ android:background="?android:attr/selectableItemBackground" >
+
+ <ImageView
+ android:id="@+android:id/icon"
+ android:layout_gravity="top"
+ android:layout_width="40dip"
+ android:layout_height="40dip"
+ android:layout_marginTop="0dip"
+ />
+
+ <RelativeLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="0dip"
+ android:layout_marginEnd="0dip"
+ android:layout_marginTop="6dip"
+ android:layout_marginBottom="6dip"
+ android:layout_weight="1">
+
+ <TextView android:id="@+android:id/summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@android:id/title"
+ android:layout_alignStart="@android:id/title"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="?android:attr/textColorPrimary"
+ android:layout_marginTop="8dip"
+ android:maxLines="1000" />
+
+ </RelativeLayout>
+
+</LinearLayout>
diff --git a/android/xscreensaver/res/layout/slider_preference.xml b/android/xscreensaver/res/layout/slider_preference.xml
new file mode 100644
index 0000000..69647ff
--- /dev/null
+++ b/android/xscreensaver/res/layout/slider_preference.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Layout for org/jwz/xscreensaver/SliderPreference.java -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:gravity="center_vertical"
+ android:paddingEnd="?android:attr/scrollbarSize"
+ android:background="?android:attr/selectableItemBackground" >
+
+ <TextView
+ android:id="@+android:id/title"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:ellipsize="end"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="40"
+ android:width="0dp"
+ android:layout_marginLeft="16dip" />
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="60"
+ android:orientation="vertical"
+ android:layout_marginLeft="0dip" >
+
+ <SeekBar
+ android:id="@+id/slider_preference_seekbar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal" >
+
+ <TextView
+ android:id="@+id/slider_preference_low"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:ellipsize="end"
+ android:singleLine="true"
+ android:layout_alignParentLeft="true"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+ <TextView
+ android:id="@+id/slider_preference_high"
+ android:layout_alignParentRight="true"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:ellipsize="end"
+ android:singleLine="true"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+ </RelativeLayout>
+ </LinearLayout>
+</LinearLayout>
diff --git a/android/xscreensaver/src/org/jwz/xscreensaver/Activity.java b/android/xscreensaver/src/org/jwz/xscreensaver/Activity.java
new file mode 100644
index 0000000..ac0ab4c
--- /dev/null
+++ b/android/xscreensaver/src/org/jwz/xscreensaver/Activity.java
@@ -0,0 +1,169 @@
+/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * xscreensaver, Copyright (c) 2016 Jamie Zawinski <jwz@jwz.org>
+ * and Dennis Sheil <dennis@panaceasupplies.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * This is the XScreenSaver "application" that just brings up the
+ * Live Wallpaper preferences.
+ */
+
+package org.jwz.xscreensaver;
+
+import android.app.WallpaperManager;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Bundle;
+import android.view.View;
+import android.provider.Settings;
+import android.Manifest;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.ContextCompat;
+import android.os.Build;
+import android.content.pm.PackageManager;
+
+public class Activity extends android.app.Activity
+ implements View.OnClickListener {
+
+ private boolean wallpaperButtonClicked, daydreamButtonClicked;
+ private final static int MY_REQ_READ_EXTERNAL_STORAGE = 271828;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ // openList();
+ setContentView(R.layout.activity_xscreensaver);
+ wallpaperButtonClicked = false;
+ daydreamButtonClicked = false;
+
+ findViewById(R.id.apply_wallpaper).setOnClickListener(this);
+ findViewById(R.id.apply_daydream).setOnClickListener(this);
+ }
+
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.apply_wallpaper:
+ wallpaperButtonClicked();
+ break;
+ case R.id.apply_daydream:
+ daydreamButtonClicked();
+ break;
+ }
+ }
+
+ // synchronized when dealing with wallpaper state - perhaps can
+ // narrow down more
+ private synchronized void withProceed() {
+ if (daydreamButtonClicked) {
+ String action;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
+ action = Settings.ACTION_DREAM_SETTINGS;
+ } else {
+ action = Settings.ACTION_DISPLAY_SETTINGS;
+ }
+ startActivity(new Intent(action));
+ } else if (wallpaperButtonClicked) {
+ startActivity(new Intent(WallpaperManager.ACTION_LIVE_WALLPAPER_CHOOSER));
+ }
+ }
+
+ private void wallpaperButtonClicked() {
+ wallpaperButtonClicked = true;
+ checkPermission();
+ }
+
+ private void daydreamButtonClicked() {
+ daydreamButtonClicked = true;
+ checkPermission();
+ }
+
+ void checkPermission() {
+ // RES introduced in API 16
+ String permission = Manifest.permission.READ_EXTERNAL_STORAGE;
+ if (havePermission(permission)) {
+ withProceed();
+ } else {
+ noPermission(permission);
+ }
+ }
+
+ private void noPermission(String permission) {
+ int myRequestCode;
+ myRequestCode = MY_REQ_READ_EXTERNAL_STORAGE;
+
+ if (permissionsDeniedRationale(permission)) {
+ showDeniedRationale();
+ } else {
+ requestPermission(permission, myRequestCode);
+ }
+ }
+
+ private boolean permissionsDeniedRationale(String permission) {
+ boolean rationale = ActivityCompat.shouldShowRequestPermissionRationale(this,
+ permission);
+ return rationale;
+ }
+
+ private void requestPermission(String permission, int myRequestCode) {
+ ActivityCompat.requestPermissions(this,
+ new String[]{permission},
+ myRequestCode);
+
+ // myRequestCode is an app-defined int constant.
+ // The callback method gets the result of the request.
+ }
+
+ // TODO: This method should be asynchronous, and not block the thread
+ private void showDeniedRationale() {
+ withProceed();
+ }
+
+ boolean havePermission(String permission) {
+
+ if (Build.VERSION.SDK_INT < 16) {
+ return true;
+ }
+
+ if (permissionGranted(permission)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ private boolean permissionGranted(String permission) {
+ boolean check = ContextCompat.checkSelfPermission(this, permission) ==
+ PackageManager.PERMISSION_GRANTED;
+ return check;
+ }
+
+ public void proceedIfPermissionGranted(int[] grantResults) {
+
+ // If request is cancelled, the result arrays are empty.
+ if (grantResults.length > 0
+ && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ withProceed();
+ } else if (grantResults.length > 0) {
+ withProceed();
+ }
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode,
+ String permissions[], int[] grantResults) {
+ switch (requestCode) {
+ case MY_REQ_READ_EXTERNAL_STORAGE:
+ proceedIfPermissionGranted(grantResults);
+ }
+ }
+
+}
diff --git a/android/xscreensaver/src/org/jwz/xscreensaver/App.java b/android/xscreensaver/src/org/jwz/xscreensaver/App.java
new file mode 100644
index 0000000..3d39788
--- /dev/null
+++ b/android/xscreensaver/src/org/jwz/xscreensaver/App.java
@@ -0,0 +1,22 @@
+/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * xscreensaver, Copyright (c) 2016 Jamie Zawinski <jwz@jwz.org>
+ * and Dennis Sheil <dennis@panaceasupplies.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+package org.jwz.xscreensaver;
+
+import android.app.Application;
+
+public class App extends Application {
+ public App() {
+ super();
+ }
+}
diff --git a/android/xscreensaver/src/org/jwz/xscreensaver/Daydream.java b/android/xscreensaver/src/org/jwz/xscreensaver/Daydream.java
new file mode 100644
index 0000000..372af95
--- /dev/null
+++ b/android/xscreensaver/src/org/jwz/xscreensaver/Daydream.java
@@ -0,0 +1,269 @@
+/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * xscreensaver, Copyright (c) 2016-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * The superclass of every saver's Daydream.
+ *
+ * Each Daydream needs a distinct subclass in order to show up in the list.
+ * We know which saver we are running by the subclass name; we know which
+ * API to use by how the subclass calls super().
+ */
+
+package org.jwz.xscreensaver;
+
+import android.view.Display;
+import android.view.Surface;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.view.KeyEvent;
+import android.service.dreams.DreamService;
+import android.view.GestureDetector;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.os.Message;
+import android.os.Handler;
+import android.os.Looper;
+import android.util.Log;
+
+public class Daydream extends DreamService {
+
+ private class SaverView extends SurfaceView
+ implements SurfaceHolder.Callback {
+
+ private boolean initTried = false;
+ private jwxyz jwxyz_obj;
+
+ private GestureDetector detector;
+
+ private Runnable on_quit = new Runnable() {
+ @Override
+ public void run() {
+ finish(); // Exit the Daydream
+ }
+ };
+
+ SaverView () {
+ super (Daydream.this);
+ getHolder().addCallback(this);
+ }
+
+ @Override
+ public void surfaceChanged (SurfaceHolder holder, int format,
+ int width, int height) {
+
+ if (width == 0 || height == 0) {
+ detector = null;
+ jwxyz_obj.close();
+ jwxyz_obj = null;
+ }
+
+ Log.d ("xscreensaver",
+ String.format("surfaceChanged: %dx%d", width, height));
+
+ /*
+ double r = 0;
+
+ Display d = view.getDisplay();
+
+ if (d != null) {
+ switch (d.getRotation()) {
+ case Surface.ROTATION_90: r = 90; break;
+ case Surface.ROTATION_180: r = 180; break;
+ case Surface.ROTATION_270: r = 270; break;
+ }
+ }
+ */
+
+ if (jwxyz_obj == null) {
+ jwxyz_obj = new jwxyz (jwxyz.saverNameOf (Daydream.this),
+ Daydream.this, screenshot, width, height,
+ holder.getSurface(), on_quit);
+ detector = new GestureDetector (Daydream.this, jwxyz_obj);
+ } else {
+ jwxyz_obj.resize (width, height);
+ }
+
+ jwxyz_obj.start();
+ }
+
+ @Override
+ public void surfaceCreated (SurfaceHolder holder) {
+ if (!initTried) {
+ initTried = true;
+ } else {
+ if (jwxyz_obj != null) {
+ jwxyz_obj.close();
+ jwxyz_obj = null;
+ }
+ }
+ }
+
+ @Override
+ public void surfaceDestroyed (SurfaceHolder holder) {
+ if (jwxyz_obj != null) {
+ jwxyz_obj.close();
+ jwxyz_obj = null;
+ }
+ }
+
+ @Override
+ public boolean onTouchEvent (MotionEvent event) {
+ detector.onTouchEvent (event);
+ if (event.getAction() == MotionEvent.ACTION_UP)
+ jwxyz_obj.dragEnded (event);
+ return true;
+ }
+
+ @Override
+ public boolean onKeyDown (int keyCode, KeyEvent event) {
+ // In the emulator, this doesn't receive keyboard arrow keys, PgUp, etc.
+ // Some other keys like "Home" are interpreted before we get here, and
+ // function keys do weird shit.
+
+ // TODO: Does this still work? And is the above still true?
+
+ if (view.jwxyz_obj != null)
+ view.jwxyz_obj.sendKeyEvent (event);
+ return true;
+ }
+ }
+
+ private SaverView view;
+ Bitmap screenshot;
+
+ private void LOG (String fmt, Object... args) {
+ Log.d ("xscreensaver",
+ this.getClass().getSimpleName() + ": " +
+ String.format (fmt, args));
+ }
+
+ protected Daydream () {
+ super();
+ }
+
+ // Called when jwxyz_abort() is called, or other exceptions are thrown.
+ //
+/*
+ @Override
+ public void uncaughtException (Thread thread, Throwable ex) {
+
+ renderer = null;
+ String err = ex.toString();
+ LOG ("Caught exception: %s", err);
+
+ this.finish(); // Exit the Daydream
+
+ final AlertDialog.Builder b = new AlertDialog.Builder(this);
+ b.setMessage (err);
+ b.setCancelable (false);
+ b.setPositiveButton ("Bummer",
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface d, int id) {
+ }
+ });
+
+ // #### This isn't working:
+ // "Attempted to add window with non-application token"
+ // "Unable to add window -- token null is not for an application"
+ // I think I need to get an "Activity" to run it on somehow?
+
+ new Handler (Looper.getMainLooper()).post (new Runnable() {
+ public void run() {
+ AlertDialog alert = b.create();
+ alert.setTitle (this.getClass().getSimpleName() + " crashed");
+ alert.setIcon(android.R.drawable.ic_dialog_alert);
+ alert.show();
+ }
+ });
+
+ old_handler.uncaughtException (thread, ex);
+ }
+*/
+
+
+ @Override
+ public void onAttachedToWindow() {
+ super.onAttachedToWindow();
+
+ setInteractive (true);
+ setFullscreen (true);
+ saveScreenshot();
+
+ view = new SaverView ();
+ setContentView (view);
+ }
+
+ public void onDreamingStarted() {
+ super.onDreamingStarted();
+ // view.jwxyz_obj.start();
+ }
+
+ public void onDreamingStopped() {
+ super.onDreamingStopped();
+ view.jwxyz_obj.pause();
+ }
+
+ public void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ try {
+ if (view.jwxyz_obj != null)
+ view.jwxyz_obj.pause();
+ } catch (Exception exc) {
+ // Fun fact: Android swallows exceptions coming from here, then crashes
+ // elsewhere.
+ LOG ("onDetachedFromWindow: %s", exc.toString());
+ throw exc;
+ }
+ }
+
+
+ // At startup, before we have blanked the screen, save a screenshot
+ // for later use by the hacks.
+ //
+ private void saveScreenshot() {
+ View view = getWindow().getDecorView().getRootView();
+ if (view == null) {
+ LOG ("unable to get root view for screenshot");
+ } else {
+
+ // This doesn't work:
+ /*
+ boolean was = view.isDrawingCacheEnabled();
+ if (!was) view.setDrawingCacheEnabled (true);
+ view.buildDrawingCache();
+ screenshot = view.getDrawingCache();
+ if (!was) view.setDrawingCacheEnabled (false);
+ if (screenshot == null) {
+ LOG ("unable to get screenshot bitmap from %s", view.toString());
+ } else {
+ screenshot = Bitmap.createBitmap (screenshot);
+ }
+ */
+
+ // This doesn't work either: width and height are both -1...
+
+ int w = view.getLayoutParams().width;
+ int h = view.getLayoutParams().height;
+ if (w <= 0 || h <= 0) {
+ LOG ("unable to get root view for screenshot");
+ } else {
+ screenshot = Bitmap.createBitmap (w, h, Bitmap.Config.ARGB_8888);
+ Canvas c = new Canvas (screenshot);
+ view.layout (0, 0, w, h);
+ view.draw (c);
+ }
+ }
+ }
+}
diff --git a/android/xscreensaver/src/org/jwz/xscreensaver/Settings.java b/android/xscreensaver/src/org/jwz/xscreensaver/Settings.java
new file mode 100644
index 0000000..17bac0f
--- /dev/null
+++ b/android/xscreensaver/src/org/jwz/xscreensaver/Settings.java
@@ -0,0 +1,179 @@
+/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * xscreensaver, Copyright (c) 2016 Jamie Zawinski <jwz@jwz.org>
+ * and Dennis Sheil <dennis@panaceasupplies.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * The superclass of every saver's preferences panel.
+ *
+ * The only reason the subclasses of this class exist is so that we know
+ * which "_settings.xml" to read -- we extract the base name from self's
+ * class.
+ *
+ * project/xscreensaver/res/xml/SAVER_dream.xml refers to it as
+ * android:settingsActivity="SAVER_Settings". If there was some way
+ * to pass an argument from the XML into here, or to otherwise detect
+ * which Dream was instantiating this Settings, we wouldn't need those
+ * hundreds of Settings subclasses.
+ */
+
+package org.jwz.xscreensaver;
+
+import android.content.SharedPreferences;
+import android.os.Bundle;
+
+import android.content.SharedPreferences;
+import android.preference.PreferenceActivity;
+import android.preference.Preference;
+import android.preference.ListPreference;
+import android.preference.EditTextPreference;
+import android.preference.CheckBoxPreference;
+import org.jwz.xscreensaver.SliderPreference;
+
+import org.jwz.xscreensaver.R;
+import java.util.Map;
+import java.lang.reflect.Field;
+
+public abstract class Settings extends PreferenceActivity
+ implements SharedPreferences.OnSharedPreferenceChangeListener {
+
+ @Override
+ protected void onCreate (Bundle icicle) {
+ super.onCreate (icicle);
+
+ // Extract the saver name from e.g. "BouncingCowSettings"
+ String name = this.getClass().getSimpleName();
+ String tail = "Settings";
+ if (name.endsWith(tail))
+ name = name.substring (0, name.length() - tail.length());
+ name = name.toLowerCase();
+
+ // #### All of these have been deprecated:
+ // getPreferenceManager()
+ // addPreferencesFromResource(int)
+ // findPreference(CharSequence)
+
+ getPreferenceManager().setSharedPreferencesName (name);
+
+ // read R.xml.SAVER_settings dynamically
+ int res = -1;
+ String pref_class = name + "_settings";
+ try { res = R.xml.class.getDeclaredField(pref_class).getInt (null); }
+ catch (Exception e) { }
+ if (res != -1)
+ addPreferencesFromResource (res);
+
+ final int res_final = res;
+
+ SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
+ prefs.registerOnSharedPreferenceChangeListener (this);
+ updateAllPrefsSummaries (prefs);
+
+ // Find the "Reset to defaults" button and install a click handler on it.
+ //
+ Preference reset = findPreference (name + "_reset");
+ reset.setOnPreferenceClickListener(
+ new Preference.OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+
+ SharedPreferences prefs =
+ getPreferenceManager().getSharedPreferences();
+
+ // Wipe everything from the preferences hash, then reload defaults.
+ prefs.edit().clear().commit();
+ getPreferenceScreen().removeAll();
+ addPreferencesFromResource (res_final);
+
+ // I guess we need to re-get this after the removeAll?
+ prefs = getPreferenceManager().getSharedPreferences();
+
+ // But now we need to iterate over every Preference widget and
+ // push the new value down into it. If you think this all looks
+ // ridiculously non-object-oriented and completely insane, that's
+ // because it is.
+
+ Map <String, ?> keys = prefs.getAll();
+ for (Map.Entry <String, ?> entry : keys.entrySet()) {
+ String key = entry.getKey();
+ String val = String.valueOf (entry.getValue());
+
+ Preference pref = findPreference (key);
+ if (pref instanceof ListPreference) {
+ ((ListPreference) pref).setValue (prefs.getString (key, ""));
+ } else if (pref instanceof SliderPreference) {
+ ((SliderPreference) pref).setValue (prefs.getFloat (key, 0));
+ } else if (pref instanceof EditTextPreference) {
+ ((EditTextPreference) pref).setText (prefs.getString (key, ""));
+ } else if (pref instanceof CheckBoxPreference) {
+ ((CheckBoxPreference) pref).setChecked (
+ prefs.getBoolean (key,false));
+ }
+
+ updatePrefsSummary (prefs, pref);
+ }
+ return true;
+ }
+ });
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
+ prefs.registerOnSharedPreferenceChangeListener (this);
+ updateAllPrefsSummaries(prefs);
+ }
+
+ @Override
+ protected void onPause() {
+ getPreferenceManager().getSharedPreferences().
+ unregisterOnSharedPreferenceChangeListener(this);
+ super.onPause();
+ }
+
+ @Override
+ protected void onDestroy() {
+ getPreferenceManager().getSharedPreferences().
+ unregisterOnSharedPreferenceChangeListener(this);
+ super.onDestroy();
+ }
+
+ public void onSharedPreferenceChanged (SharedPreferences sharedPreferences,
+ String key) {
+ updatePrefsSummary(sharedPreferences, findPreference(key));
+ }
+
+ protected void updatePrefsSummary(SharedPreferences sharedPreferences,
+ Preference pref) {
+ if (pref == null)
+ return;
+
+ if (pref instanceof ListPreference) {
+ pref.setTitle (((ListPreference) pref).getEntry());
+ } else if (pref instanceof SliderPreference) {
+ float v = ((SliderPreference) pref).getValue();
+ int i = (int) Math.floor (v);
+ if (v == i)
+ pref.setSummary (String.valueOf (i));
+ else
+ pref.setSummary (String.valueOf (v));
+ } else if (pref instanceof EditTextPreference) {
+ pref.setSummary (((EditTextPreference) pref).getText());
+ }
+ }
+
+ protected void updateAllPrefsSummaries(SharedPreferences prefs) {
+
+ Map <String, ?> keys = prefs.getAll();
+ for (Map.Entry <String, ?> entry : keys.entrySet()) {
+ updatePrefsSummary (prefs, findPreference (entry.getKey()));
+ }
+ }
+}
diff --git a/android/xscreensaver/src/org/jwz/xscreensaver/SliderPreference.java b/android/xscreensaver/src/org/jwz/xscreensaver/SliderPreference.java
new file mode 100644
index 0000000..c1a1a1d
--- /dev/null
+++ b/android/xscreensaver/src/org/jwz/xscreensaver/SliderPreference.java
@@ -0,0 +1,160 @@
+/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * xscreensaver, Copyright (c) 2016 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * A numeric preference as a slider, inline in the preferences list.
+ * XML options include:
+ *
+ * low, high (floats) -- smallest and largest allowed values.
+ * If low > high, the value increases as the slider's thumb moves left.
+ *
+ * lowLabel, highLabel (strings) -- labels shown at the left and right
+ * ends of the slider.
+ *
+ * integral (boolean) -- whether to use whole numbers instead of floats;
+ */
+
+package org.jwz.xscreensaver;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.content.res.Resources;
+import android.preference.Preference;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.SeekBar;
+import android.widget.TextView;
+import android.util.Log;
+
+public class SliderPreference extends Preference {
+
+ protected float low, high;
+ protected String low_label, high_label;
+ protected boolean integral;
+ protected float mValue;
+ protected int seekbar_ticks;
+
+ public SliderPreference(Context context, AttributeSet attrs) {
+ this (context, attrs, 0);
+ }
+
+ public SliderPreference (Context context, AttributeSet attrs, int defStyle) {
+ super (context, attrs, defStyle);
+
+ Resources res = context.getResources();
+
+ // Parse these from the "<SliderPreference>" tag
+ low = Float.parseFloat (attrs.getAttributeValue (null, "low"));
+ high = Float.parseFloat (attrs.getAttributeValue (null, "high"));
+ integral = attrs.getAttributeBooleanValue (null, "integral", false);
+ low_label = res.getString(
+ attrs.getAttributeResourceValue (null, "lowLabel", 0));
+ high_label = res.getString(
+ attrs.getAttributeResourceValue (null, "highLabel", 0));
+
+ seekbar_ticks = (integral
+ ? (int) Math.floor (Math.abs (high - low))
+ : 100000);
+
+ setWidgetLayoutResource (R.layout.slider_preference);
+ }
+
+
+ @Override
+ protected void onSetInitialValue (boolean restore, Object def) {
+ if (restore) {
+ mValue = getPersistedFloat (low);
+ } else {
+ mValue = (Float) def;
+ persistFloat (mValue);
+ }
+ //Log.d("xscreensaver", String.format("SLIDER INIT %s: %f",
+ // low_label, mValue));
+ }
+
+ @Override
+ protected Object onGetDefaultValue(TypedArray a, int index) {
+ return a.getFloat (index, low);
+ }
+
+
+ public float getValue() {
+ return mValue;
+ }
+
+ public void setValue (float value) {
+
+ if (low < high) {
+ value = Math.max (low, Math.min (high, value));
+ } else {
+ value = Math.max (high, Math.min (low, value));
+ }
+
+ if (integral)
+ value = Math.round (value);
+
+ if (value != mValue) {
+ //Log.d("xscreensaver", String.format("SLIDER %s: %f", low_label, value));
+ persistFloat (value);
+ mValue = value;
+ notifyChanged();
+ }
+ }
+
+
+ @Override
+ protected View onCreateView (ViewGroup parent) {
+ View view = super.onCreateView(parent);
+
+ TextView low_view = (TextView)
+ view.findViewById (R.id.slider_preference_low);
+ low_view.setText (low_label);
+
+ TextView high_view = (TextView)
+ view.findViewById (R.id.slider_preference_high);
+ high_view.setText (high_label);
+
+ SeekBar seekbar = (SeekBar)
+ view.findViewById (R.id.slider_preference_seekbar);
+ seekbar.setMax (seekbar_ticks);
+
+ float ratio = (mValue - low) / (high - low);
+ int seek_value = (int) (ratio * (float) seekbar_ticks);
+
+ seekbar.setProgress (seek_value);
+
+ final SliderPreference slider = this;
+
+ seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) {
+ }
+
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) {
+ }
+
+ @Override
+ public void onProgressChanged (SeekBar seekBar, int progress,
+ boolean fromUser) {
+ if (fromUser) {
+ float ratio = (float) progress / (float) seekbar_ticks;
+ float value = low + (ratio * (high - low));
+ slider.setValue (value);
+ callChangeListener (progress);
+ }
+ }
+ });
+
+ return view;
+ }
+}
diff --git a/android/xscreensaver/src/org/jwz/xscreensaver/TTFAnalyzer.java b/android/xscreensaver/src/org/jwz/xscreensaver/TTFAnalyzer.java
new file mode 100644
index 0000000..3d01345
--- /dev/null
+++ b/android/xscreensaver/src/org/jwz/xscreensaver/TTFAnalyzer.java
@@ -0,0 +1,153 @@
+/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+
+ * Copyright (C) 2011 George Yunaev @ Ulduzsoft
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+
+ http://www.ulduzsoft.com/2012/01/enumerating-the-fonts-on-android-platform/
+ */
+
+package org.jwz.xscreensaver;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.util.HashMap;
+
+// The class which loads the TTF file, parses it and returns the TTF font name
+class TTFAnalyzer
+{
+ // This function parses the TTF file and returns the font name specified in the file
+ public String getTtfFontName( String fontFilename )
+ {
+ try
+ {
+ // Parses the TTF file format.
+ // See http://developer.apple.com/fonts/ttrefman/rm06/Chap6.html
+ m_file = new RandomAccessFile( fontFilename, "r" );
+
+ // Read the version first
+ int version = readDword();
+
+ // The version must be either 'true' (0x74727565) or 0x00010000 or 'OTTO' (0x4f54544f) for CFF style fonts.
+ if ( version != 0x74727565 && version != 0x00010000 && version != 0x4f54544f)
+ return null;
+
+ // The TTF file consist of several sections called "tables", and we need to know how many of them are there.
+ int numTables = readWord();
+
+ // Skip the rest in the header
+ readWord(); // skip searchRange
+ readWord(); // skip entrySelector
+ readWord(); // skip rangeShift
+
+ // Now we can read the tables
+ for ( int i = 0; i < numTables; i++ )
+ {
+ // Read the table entry
+ int tag = readDword();
+ readDword(); // skip checksum
+ int offset = readDword();
+ int length = readDword();
+
+ // Now here' the trick. 'name' field actually contains the textual string name.
+ // So the 'name' string in characters equals to 0x6E616D65
+ if ( tag == 0x6E616D65 )
+ {
+ // Here's the name section. Read it completely into the allocated buffer
+ byte[] table = new byte[ length ];
+
+ m_file.seek( offset );
+ read( table );
+
+ // This is also a table. See http://developer.apple.com/fonts/ttrefman/rm06/Chap6name.html
+ // According to Table 36, the total number of table records is stored in the second word, at the offset 2.
+ // Getting the count and string offset - remembering it's big endian.
+ int count = getWord( table, 2 );
+ int string_offset = getWord( table, 4 );
+
+ // Record starts from offset 6
+ for ( int record = 0; record < count; record++ )
+ {
+ // Table 37 tells us that each record is 6 words -> 12 bytes, and that the nameID is 4th word so its offset is 6.
+ // We also need to account for the first 6 bytes of the header above (Table 36), so...
+ int nameid_offset = record * 12 + 6;
+ int platformID = getWord( table, nameid_offset );
+ int nameid_value = getWord( table, nameid_offset + 6 );
+
+ // Table 42 lists the valid name Identifiers. We're interested in 4 but not in Unicode encoding (for simplicity).
+ // The encoding is stored as PlatformID and we're interested in Mac encoding
+ if ( nameid_value == 4 && platformID == 1 )
+ {
+ // We need the string offset and length, which are the word 6 and 5 respectively
+ int name_length = getWord( table, nameid_offset + 8 );
+ int name_offset = getWord( table, nameid_offset + 10 );
+
+ // The real name string offset is calculated by adding the string_offset
+ name_offset = name_offset + string_offset;
+
+ // Make sure it is inside the array
+ if ( name_offset >= 0 && name_offset + name_length < table.length )
+ return new String( table, name_offset, name_length );
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+ catch (FileNotFoundException e)
+ {
+ // Permissions?
+ return null;
+ }
+ catch (IOException e)
+ {
+ // Most likely a corrupted font file
+ return null;
+ }
+ }
+
+ // Font file; must be seekable
+ private RandomAccessFile m_file = null;
+
+ // Helper I/O functions
+ private int readByte() throws IOException
+ {
+ return m_file.read() & 0xFF;
+ }
+
+ private int readWord() throws IOException
+ {
+ int b1 = readByte();
+ int b2 = readByte();
+
+ return b1 << 8 | b2;
+ }
+
+ private int readDword() throws IOException
+ {
+ int b1 = readByte();
+ int b2 = readByte();
+ int b3 = readByte();
+ int b4 = readByte();
+
+ return b1 << 24 | b2 << 16 | b3 << 8 | b4;
+ }
+
+ private void read( byte [] array ) throws IOException
+ {
+ if ( m_file.read( array ) != array.length )
+ throw new IOException();
+ }
+
+ // Helper
+ private int getWord( byte [] array, int offset )
+ {
+ int b1 = array[ offset ] & 0xFF;
+ int b2 = array[ offset + 1 ] & 0xFF;
+
+ return b1 << 8 | b2;
+ }
+}
diff --git a/android/xscreensaver/src/org/jwz/xscreensaver/TVActivity.java b/android/xscreensaver/src/org/jwz/xscreensaver/TVActivity.java
new file mode 100644
index 0000000..0015c9d
--- /dev/null
+++ b/android/xscreensaver/src/org/jwz/xscreensaver/TVActivity.java
@@ -0,0 +1,50 @@
+/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * xscreensaver, Copyright (c) 2017 Jamie Zawinski <jwz@jwz.org>
+ * and Dennis Sheil <dennis@panaceasupplies.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * This is the XScreenSaver "application" that just brings up the
+ * Daydream preferences for Android TV.
+ */
+
+package org.jwz.xscreensaver;
+
+import android.app.Activity;
+import android.app.WallpaperManager;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Bundle;
+import android.view.View;
+import android.provider.Settings;
+
+public class TVActivity extends Activity
+ implements View.OnClickListener {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_tv_xscreensaver);
+ findViewById(R.id.apply_daydream).setOnClickListener(this);
+ }
+
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+
+ case R.id.apply_daydream:
+ String action;
+ Intent intent = new Intent(android.provider.Settings.ACTION_SETTINGS);
+ startActivityForResult(intent, 0);
+ break;
+ }
+ }
+}
diff --git a/android/xscreensaver/src/org/jwz/xscreensaver/Wallpaper.java b/android/xscreensaver/src/org/jwz/xscreensaver/Wallpaper.java
new file mode 100644
index 0000000..93896f2
--- /dev/null
+++ b/android/xscreensaver/src/org/jwz/xscreensaver/Wallpaper.java
@@ -0,0 +1,128 @@
+/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * xscreensaver, Copyright (c) 2016-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * The superclass of every saver's Wallpaper.
+ *
+ * Each Wallpaper needs a distinct subclass in order to show up in the list.
+ * We know which saver we are running by the subclass name; we know which
+ * API to use by how the subclass calls super().
+ */
+
+package org.jwz.xscreensaver;
+
+import android.content.res.Configuration;
+import android.service.wallpaper.WallpaperService;
+import android.view.GestureDetector;
+import android.view.SurfaceHolder;
+import android.util.Log;
+import java.lang.RuntimeException;
+import java.lang.Thread;
+import org.jwz.xscreensaver.jwxyz;
+import android.graphics.PixelFormat;
+import android.view.WindowManager;
+import android.view.Display;
+import android.graphics.Point;
+
+public class Wallpaper extends WallpaperService
+/*implements GestureDetector.OnGestureListener,
+ GestureDetector.OnDoubleTapListener, */ {
+
+ /* TODO: Input! */
+ private Engine engine;
+
+ @Override
+ public Engine onCreateEngine() {
+ // Log.d("xscreensaver", "tid = " + Thread.currentThread().getId());
+ engine = new XScreenSaverGLEngine();
+ return engine;
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration config) {
+ super.onConfigurationChanged(config);
+ Log.d("xscreensaver", "wallpaper onConfigurationChanged");
+ /*
+ WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
+ Display display = wm.getDefaultDisplay();
+ Point size = new Point();
+ display.getSize(size);
+ int width = size.x;
+ int height = size.y;
+ engine.onSurfaceChanged(engine.getSurfaceHolder(), PixelFormat.RGBA_8888, width, height);
+ */
+
+ }
+
+ class XScreenSaverGLEngine extends Engine {
+
+ private boolean initTried = false;
+ private jwxyz jwxyz_obj;
+
+ @Override
+ public void onSurfaceCreated (SurfaceHolder holder) {
+ super.onSurfaceCreated(holder);
+
+ if (!initTried) {
+ initTried = true;
+ } else {
+ if (jwxyz_obj != null) {
+ jwxyz_obj.close();
+ jwxyz_obj = null;
+ }
+ }
+ }
+
+ @Override
+ public void onVisibilityChanged(final boolean visible) {
+ if (jwxyz_obj != null) {
+ if (visible)
+ jwxyz_obj.start();
+ else
+ jwxyz_obj.pause();
+ }
+ }
+
+ @Override
+ public void onSurfaceChanged (SurfaceHolder holder, int format,
+ int width, int height) {
+
+ super.onSurfaceChanged(holder, format, width, height);
+
+ if (width == 0 || height == 0) {
+ jwxyz_obj.close();
+ jwxyz_obj = null;
+ }
+
+ Log.d ("xscreensaver",
+ String.format("surfaceChanged: %dx%d", width, height));
+
+ if (jwxyz_obj == null) {
+ jwxyz_obj = new jwxyz (jwxyz.saverNameOf(Wallpaper.this),
+ Wallpaper.this, null, width, height,
+ holder.getSurface(), null);
+ } else {
+ jwxyz_obj.resize (width, height);
+ }
+
+ jwxyz_obj.start();
+ }
+
+ @Override
+ public void onSurfaceDestroyed (SurfaceHolder holder) {
+ super.onSurfaceDestroyed (holder);
+
+ if (jwxyz_obj != null) {
+ jwxyz_obj.close();
+ jwxyz_obj = null;
+ }
+ }
+ }
+}
diff --git a/android/xscreensaver/src/org/jwz/xscreensaver/jwxyz.java b/android/xscreensaver/src/org/jwz/xscreensaver/jwxyz.java
new file mode 100644
index 0000000..a22a26d
--- /dev/null
+++ b/android/xscreensaver/src/org/jwz/xscreensaver/jwxyz.java
@@ -0,0 +1,1115 @@
+/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * xscreensaver, Copyright (c) 2016-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * This class is how the C implementation of jwxyz calls back into Java
+ * to do things that OpenGL does not have access to without Java-based APIs.
+ * It is the Java companion to jwxyz-android.c and screenhack-android.c.
+ */
+
+package org.jwz.xscreensaver;
+
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.ArrayList;
+import java.util.Random;
+import android.app.AlertDialog;
+import android.view.KeyEvent;
+import android.content.SharedPreferences;
+import android.content.Context;
+import android.content.ContentResolver;
+import android.content.DialogInterface;
+import android.content.res.AssetManager;
+import android.graphics.Typeface;
+import android.graphics.Rect;
+import android.graphics.Paint;
+import android.graphics.Paint.FontMetrics;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Matrix;
+import android.net.Uri;
+import android.view.GestureDetector;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import java.net.URL;
+import java.nio.ByteBuffer;
+import java.io.File;
+import java.io.InputStream;
+import java.io.FileOutputStream;
+import java.lang.InterruptedException;
+import java.lang.Runnable;
+import java.lang.Thread;
+import java.util.TimerTask;
+import android.database.Cursor;
+import android.provider.MediaStore;
+import android.provider.MediaStore.MediaColumns;
+import android.media.ExifInterface;
+import org.jwz.xscreensaver.TTFAnalyzer;
+import android.util.Log;
+import android.view.Surface;
+import android.Manifest;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.ContextCompat;
+import android.os.Build;
+import android.content.pm.PackageManager;
+
+public class jwxyz
+ implements GestureDetector.OnGestureListener,
+ GestureDetector.OnDoubleTapListener {
+
+ private class PrefListener
+ implements SharedPreferences.OnSharedPreferenceChangeListener {
+
+ @Override
+ public void onSharedPreferenceChanged (SharedPreferences sharedPreferences, String key)
+ {
+ if (key.startsWith(hack + "_")) {
+ if (render != null) {
+ boolean was_animating;
+ synchronized (render) {
+ was_animating = animating_p;
+ }
+ close();
+ if (was_animating)
+ start();
+ }
+ }
+ }
+ };
+
+ private static class SurfaceLost extends Exception {
+ SurfaceLost () {
+ super("surface lost");
+ }
+
+ SurfaceLost (String detailMessage) {
+ super(detailMessage);
+ }
+ }
+
+ public final static int STYLE_BOLD = 1;
+ public final static int STYLE_ITALIC = 2;
+ public final static int STYLE_MONOSPACE = 4;
+
+ public final static int FONT_FAMILY = 0;
+ public final static int FONT_FACE = 1;
+ public final static int FONT_RANDOM = 2;
+
+ public final static int MY_REQ_READ_EXTERNAL_STORAGE = 271828;
+
+ private long nativeRunningHackPtr;
+
+ private String hack;
+ private Context app;
+ private Bitmap screenshot;
+
+ SharedPreferences prefs;
+ SharedPreferences.OnSharedPreferenceChangeListener pref_listener;
+ Hashtable<String, String> defaults = new Hashtable<String, String>();
+
+
+ // Maps font names to either: String (system font) or Typeface (bundled).
+ private Hashtable<String, Object> all_fonts =
+ new Hashtable<String, Object>();
+
+ int width, height;
+ Surface surface;
+ boolean animating_p;
+
+ // Doubles as the mutex controlling width/height/animating_p.
+ private Thread render;
+
+ private Runnable on_quit;
+ boolean button_down_p;
+
+ // These are defined in jwxyz-android.c:
+ //
+ private native long nativeInit (String hack,
+ Hashtable<String,String> defaults,
+ int w, int h, Surface window)
+ throws SurfaceLost;
+ private native void nativeResize (int w, int h, double rot);
+ private native long nativeRender ();
+ private native void nativeDone ();
+ public native void sendButtonEvent (int x, int y, boolean down);
+ public native void sendMotionEvent (int x, int y);
+ public native void sendKeyEvent (boolean down_p, int code, int mods);
+
+ private void LOG (String fmt, Object... args) {
+ Log.d ("xscreensaver", hack + ": " + String.format (fmt, args));
+ }
+
+ static public String saverNameOf (Object obj) {
+ // Extract the saver name from e.g. "gen.Daydream$BouncingCow"
+ String name = obj.getClass().getSimpleName();
+ int index = name.lastIndexOf('$');
+ if (index != -1) {
+ index++;
+ name = name.substring (index, name.length() - index);
+ }
+ return name.toLowerCase();
+ }
+
+ // Constructor
+ public jwxyz (String hack, Context app, Bitmap screenshot, int w, int h,
+ Surface surface, Runnable on_quit) {
+
+ this.hack = hack;
+ this.app = app;
+ this.screenshot = screenshot;
+ this.on_quit = on_quit;
+ this.width = w;
+ this.height = h;
+ this.surface = surface;
+
+ // nativeInit populates 'defaults' with the default values for keys
+ // that are not overridden by SharedPreferences.
+
+ prefs = app.getSharedPreferences (hack, 0);
+
+ // Keep a strong reference to pref_listener, because
+ // registerOnSharedPreferenceChangeListener only uses a weak reference.
+ pref_listener = new PrefListener();
+ prefs.registerOnSharedPreferenceChangeListener (pref_listener);
+
+ scanSystemFonts();
+ }
+
+ protected void finalize() {
+ if (render != null) {
+ LOG ("jwxyz finalized without close. This might be OK.");
+ close();
+ }
+ }
+
+
+ public String getStringResource (String name) {
+
+ name = hack + "_" + name;
+
+ if (prefs.contains(name)) {
+
+ // SharedPreferences is very picky that you request the exact type that
+ // was stored: if it is a float and you ask for a string, you get an
+ // exception instead of the float converted to a string.
+
+ String s = null;
+ try { return prefs.getString (name, "");
+ } catch (Exception e) { }
+
+ try { return Float.toString (prefs.getFloat (name, 0));
+ } catch (Exception e) { }
+
+ try { return Long.toString (prefs.getLong (name, 0));
+ } catch (Exception e) { }
+
+ try { return Integer.toString (prefs.getInt (name, 0));
+ } catch (Exception e) { }
+
+ try { return (prefs.getBoolean (name, false) ? "true" : "false");
+ } catch (Exception e) { }
+ }
+
+ // If we got to here, it's not in there, so return the default.
+ return defaults.get (name);
+ }
+
+
+ private String mungeFontName (String name) {
+ // Roboto-ThinItalic => RobotoThin
+ // AndroidCock Regular => AndroidClock
+ String tails[] = { "Bold", "Italic", "Oblique", "Regular" };
+ for (String tail : tails) {
+ String pres[] = { " ", "-", "_", "" };
+ for (String pre : pres) {
+ int i = name.indexOf(pre + tail);
+ if (i > 0) name = name.substring (0, i);
+ }
+ }
+ return name;
+ }
+
+
+ private void scanSystemFonts() {
+
+ // First parse the system font directories for the global fonts.
+
+ String[] fontdirs = { "/system/fonts", "/system/font", "/data/fonts" };
+ TTFAnalyzer analyzer = new TTFAnalyzer();
+ for (String fontdir : fontdirs) {
+ File dir = new File(fontdir);
+ if (!dir.exists())
+ continue;
+ File[] files = dir.listFiles();
+ if (files == null)
+ continue;
+
+ for (File file : files) {
+ String name = analyzer.getTtfFontName (file.getAbsolutePath());
+ if (name == null) {
+ // LOG ("unparsable system font: %s", file);
+ } else {
+ name = mungeFontName (name);
+ if (! all_fonts.contains (name)) {
+ // LOG ("system font \"%s\" %s", name, file);
+ all_fonts.put (name, name);
+ }
+ }
+ }
+ }
+
+ // Now parse our assets, for our bundled fonts.
+
+ AssetManager am = app.getAssets();
+ String dir = "fonts";
+ String[] files = null;
+ try { files = am.list(dir); }
+ catch (Exception e) { LOG("listing assets: %s", e.toString()); }
+
+ for (String fn : files) {
+ String fn2 = dir + "/" + fn;
+ Typeface t = Typeface.createFromAsset (am, fn2);
+
+ File tmpfile = null;
+ try {
+ tmpfile = new File(app.getCacheDir(), fn);
+ if (tmpfile.createNewFile() == false) {
+ tmpfile.delete();
+ tmpfile.createNewFile();
+ }
+
+ InputStream in = am.open (fn2);
+ FileOutputStream out = new FileOutputStream (tmpfile);
+ byte[] buffer = new byte[1024 * 512];
+ while (in.read(buffer, 0, 1024 * 512) != -1) {
+ out.write(buffer);
+ }
+ out.close();
+ in.close();
+
+ String name = analyzer.getTtfFontName (tmpfile.getAbsolutePath());
+ tmpfile.delete();
+
+ name = mungeFontName (name);
+ all_fonts.put (name, t);
+ // LOG ("asset font \"%s\" %s", name, fn);
+ } catch (Exception e) {
+ if (tmpfile != null) tmpfile.delete();
+ LOG ("error: %s", e.toString());
+ }
+ }
+ }
+
+
+ // Parses family names from X Logical Font Descriptions, including a few
+ // standard X font names that aren't handled by try_xlfd_font().
+ // Returns [ String name, Typeface ]
+ private Object[] parseXLFD (int mask, int traits,
+ String name, int name_type) {
+ boolean fixed = false;
+ boolean serif = false;
+
+ int style_jwxyz = mask & traits;
+
+ if (name_type != FONT_RANDOM) {
+ if ((style_jwxyz & STYLE_BOLD) != 0 ||
+ name.equals("fixed") ||
+ name.equals("courier") ||
+ name.equals("console") ||
+ name.equals("lucidatypewriter") ||
+ name.equals("monospace")) {
+ fixed = true;
+ } else if (name.equals("times") ||
+ name.equals("georgia") ||
+ name.equals("serif")) {
+ serif = true;
+ } else if (name.equals("serif-monospace")) {
+ fixed = true;
+ serif = true;
+ }
+ } else {
+ Random r = new Random();
+ serif = r.nextBoolean(); // Not much to randomize here...
+ fixed = (r.nextInt(8) == 0);
+ }
+
+ name = (fixed
+ ? (serif ? "serif-monospace" : "monospace")
+ : (serif ? "serif" : "sans-serif"));
+
+ int style_android = 0;
+ if ((style_jwxyz & STYLE_BOLD) != 0)
+ style_android |= Typeface.BOLD;
+ if ((style_jwxyz & STYLE_ITALIC) != 0)
+ style_android |= Typeface.ITALIC;
+
+ return new Object[] { name, Typeface.create(name, style_android) };
+ }
+
+
+ // Parses "Native Font Name One 12, Native Font Name Two 14".
+ // Returns [ String name, Typeface ]
+ private Object[] parseNativeFont (String name) {
+ Object font2 = all_fonts.get (name);
+ if (font2 instanceof String)
+ font2 = Typeface.create (name, Typeface.NORMAL);
+ return new Object[] { name, (Typeface)font2 };
+ }
+
+
+ // Returns [ Paint paint, String family_name, Float ascent, Float descent ]
+ public Object[] loadFont(int mask, int traits, String name, int name_type,
+ float size) {
+ Object pair[];
+
+ if (name_type != FONT_RANDOM && name.equals("")) return null;
+
+ if (name_type == FONT_FACE) {
+ pair = parseNativeFont (name);
+ } else {
+ pair = parseXLFD (mask, traits, name, name_type);
+ }
+
+ String name2 = (String) pair[0];
+ Typeface font = (Typeface) pair[1];
+
+ size *= 2;
+
+ String suffix = (font.isBold() && font.isItalic() ? " bold italic" :
+ font.isBold() ? " bold" :
+ font.isItalic() ? " italic" :
+ "");
+ Paint paint = new Paint();
+ paint.setTypeface (font);
+ paint.setTextSize (size);
+ paint.setColor (Color.argb (0xFF, 0xFF, 0xFF, 0xFF));
+
+ LOG ("load font \"%s\" = \"%s %.1f\"", name, name2 + suffix, size);
+
+ FontMetrics fm = paint.getFontMetrics();
+ return new Object[] { paint, name2, -fm.ascent, fm.descent };
+ }
+
+
+ /* Returns a byte[] array containing XCharStruct with an optional
+ bitmap appended to it.
+ lbearing, rbearing, width, ascent, descent: 2 bytes each.
+ Followed by a WxH pixmap, 32 bits per pixel.
+ */
+ public ByteBuffer renderText (Paint paint, String text, boolean render_p,
+ boolean antialias_p) {
+
+ if (paint == null) {
+ LOG ("no font");
+ return null;
+ }
+
+ /* Font metric terminology, as used by X11:
+
+ "lbearing" is the distance from the logical origin to the leftmost
+ pixel. If a character's ink extends to the left of the origin, it is
+ negative.
+
+ "rbearing" is the distance from the logical origin to the rightmost
+ pixel.
+
+ "descent" is the distance from the logical origin to the bottommost
+ pixel. For characters with descenders, it is positive. For
+ superscripts, it is negative.
+
+ "ascent" is the distance from the logical origin to the topmost pixel.
+ It is the number of pixels above the baseline.
+
+ "width" is the distance from the logical origin to the position where
+ the logical origin of the next character should be placed.
+
+ If "rbearing" is greater than "width", then this character overlaps the
+ following character. If smaller, then there is trailing blank space.
+
+ The bbox coordinates returned by getTextBounds grow down and right:
+ for a character with ink both above and below the baseline, top is
+ negative and bottom is positive.
+ */
+ paint.setAntiAlias (antialias_p);
+ FontMetrics fm = paint.getFontMetrics();
+ Rect bbox = new Rect();
+ paint.getTextBounds (text, 0, text.length(), bbox);
+
+ /* The bbox returned by getTextBounds measures from the logical origin
+ with right and down being positive. This means most characters have
+ a negative top, and characters with descenders have a positive bottom.
+ */
+ int lbearing = bbox.left;
+ int rbearing = bbox.right;
+ int ascent = -bbox.top;
+ int descent = bbox.bottom;
+ int width = (int) paint.measureText (text);
+
+ int w = rbearing - lbearing;
+ int h = ascent + descent;
+ int size = 5 * 2 + (render_p ? w * h * 4 : 0);
+
+ ByteBuffer bits = ByteBuffer.allocateDirect (size);
+
+ bits.put ((byte) ((lbearing >> 8) & 0xFF));
+ bits.put ((byte) ( lbearing & 0xFF));
+ bits.put ((byte) ((rbearing >> 8) & 0xFF));
+ bits.put ((byte) ( rbearing & 0xFF));
+ bits.put ((byte) ((width >> 8) & 0xFF));
+ bits.put ((byte) ( width & 0xFF));
+ bits.put ((byte) ((ascent >> 8) & 0xFF));
+ bits.put ((byte) ( ascent & 0xFF));
+ bits.put ((byte) ((descent >> 8) & 0xFF));
+ bits.put ((byte) ( descent & 0xFF));
+
+ if (render_p && w > 0 && h > 0) {
+ Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas (bitmap);
+ canvas.drawText (text, -lbearing, ascent, paint);
+ bitmap.copyPixelsToBuffer (bits);
+ bitmap.recycle();
+ }
+
+ return bits;
+ }
+
+
+ /* Returns the contents of the URL.
+ Loads the URL in a background thread: if the URL has not yet loaded,
+ this will return null. Once the URL has completely loaded, the full
+ contents will be returned. Calling this again after that starts the
+ URL loading again.
+ */
+ private String loading_url = null;
+ private ByteBuffer loaded_url_body = null;
+
+ public synchronized ByteBuffer loadURL (String url) {
+
+ if (loaded_url_body != null) { // Thread finished
+
+ // LOG ("textclient finished %s", loading_url);
+
+ ByteBuffer bb = loaded_url_body;
+ loading_url = null;
+ loaded_url_body = null;
+ return bb;
+
+ } else if (loading_url != null) { // Waiting on thread
+ // LOG ("textclient waiting...");
+ return null;
+
+ } else { // Launch thread
+
+ loading_url = url;
+ LOG ("textclient launching %s...", url);
+
+ new Thread (new Runnable() {
+ public void run() {
+ int size0 = 10240;
+ int size = size0;
+ int count = 0;
+ ByteBuffer body = ByteBuffer.allocateDirect (size);
+
+ try {
+ URL u = new URL (loading_url);
+ // LOG ("textclient thread loading: %s", u.toString());
+ InputStream s = u.openStream();
+ byte buf[] = new byte[10240];
+ while (true) {
+ int n = s.read (buf);
+ if (n == -1) break;
+ // LOG ("textclient thread read %d", n);
+ if (count + n + 1 >= size) {
+ int size2 = (int) (size * 1.2 + size0);
+ // LOG ("textclient thread expand %d -> %d", size, size2);
+ ByteBuffer body2 = ByteBuffer.allocateDirect (size2);
+ body.rewind();
+ body2.put (body);
+ body2.position (count);
+ body = body2;
+ size = size2;
+ }
+ body.put (buf, 0, n);
+ count += n;
+ }
+ } catch (Exception e) {
+ LOG ("load URL error: %s", e.toString());
+ body.clear();
+ body.put (e.toString().getBytes());
+ body.put ((byte) 0);
+ }
+
+ // LOG ("textclient thread finished %s (%d)", loading_url, size);
+ loaded_url_body = body;
+ }
+ }).start();
+
+ return null;
+ }
+ }
+
+
+ // Returns [ Bitmap bitmap, String name ]
+ private Object[] convertBitmap (String name, Bitmap bitmap,
+ int target_width, int target_height,
+ ExifInterface exif, boolean rotate_p) {
+ if (bitmap == null) return null;
+
+ {
+
+ int width = bitmap.getWidth();
+ int height = bitmap.getHeight();
+ Matrix matrix = new Matrix();
+
+ LOG ("read image %s: %d x %d", name, width, height);
+
+ // First rotate the image as per EXIF.
+
+ if (exif != null) {
+ int deg = 0;
+ switch (exif.getAttributeInt (ExifInterface.TAG_ORIENTATION,
+ ExifInterface.ORIENTATION_NORMAL)) {
+ case ExifInterface.ORIENTATION_ROTATE_90: deg = 90; break;
+ case ExifInterface.ORIENTATION_ROTATE_180: deg = 180; break;
+ case ExifInterface.ORIENTATION_ROTATE_270: deg = 270; break;
+ }
+ if (deg != 0) {
+ LOG ("%s: EXIF rotate %d", name, deg);
+ matrix.preRotate (deg);
+ if (deg == 90 || deg == 270) {
+ int temp = width;
+ width = height;
+ height = temp;
+ }
+ }
+ }
+
+ // If the caller requested that we rotate the image to best fit the
+ // screen, rotate it again.
+
+ if (rotate_p &&
+ (width > height) != (target_width > target_height)) {
+ LOG ("%s: rotated to fit screen", name);
+ matrix.preRotate (90);
+
+ int temp = width;
+ width = height;
+ height = temp;
+ }
+
+ // Resize the image to be not larger than the screen, potentially
+ // copying it for the third time.
+ // Actually, always scale it, scaling up if necessary.
+
+// if (width > target_width || height > target_height)
+ {
+ float r1 = target_width / (float) width;
+ float r2 = target_height / (float) height;
+ float r = (r1 > r2 ? r2 : r1);
+ LOG ("%s: resize %.1f: %d x %d => %d x %d", name,
+ r, width, height, (int) (width * r), (int) (height * r));
+ matrix.preScale (r, r);
+ }
+
+ bitmap = Bitmap.createBitmap (bitmap, 0, 0,
+ bitmap.getWidth(), bitmap.getHeight(),
+ matrix, true);
+
+ if (bitmap.getConfig() != Bitmap.Config.ARGB_8888)
+ bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, false);
+
+ return new Object[] { bitmap, name };
+
+ }
+ }
+
+
+ boolean havePermission(String permission) {
+
+ if (Build.VERSION.SDK_INT < 16) {
+ return true;
+ }
+
+ if (permissionGranted(permission)) {
+ return true;
+ }
+
+ return false;
+ }
+
+
+ private boolean permissionGranted(String permission) {
+ boolean check = ContextCompat.checkSelfPermission(app, permission) ==
+ PackageManager.PERMISSION_GRANTED;
+ return check;
+ }
+
+ public Object[] checkThenLoadRandomImage (int target_width, int target_height,
+ boolean rotate_p) {
+ // RES introduced in API 16
+ String permission = Manifest.permission.READ_EXTERNAL_STORAGE;
+
+ if (havePermission(permission)) {
+ return loadRandomImage(target_width,target_height,rotate_p);
+ } else {
+ return null;
+ }
+ }
+
+ public Object[] loadRandomImage (int target_width, int target_height,
+ boolean rotate_p) {
+
+ int min_size = 480;
+ int max_size = 0x7FFF;
+
+ ArrayList<String> imgs = new ArrayList<String>();
+
+ ContentResolver cr = app.getContentResolver();
+ String[] cols = { MediaColumns.DATA,
+ MediaColumns.MIME_TYPE,
+ MediaColumns.WIDTH,
+ MediaColumns.HEIGHT };
+ Uri uris[] = {
+ android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI,
+ android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI };
+
+ for (int i = 0; i < uris.length; i++) {
+ Cursor cursor = cr.query (uris[i], cols, null, null, null);
+ if (cursor == null)
+ continue;
+ int j = 0;
+ int path_col = cursor.getColumnIndexOrThrow (cols[j++]);
+ int type_col = cursor.getColumnIndexOrThrow (cols[j++]);
+ int width_col = cursor.getColumnIndexOrThrow (cols[j++]);
+ int height_col = cursor.getColumnIndexOrThrow (cols[j++]);
+ while (cursor.moveToNext()) {
+ String path = cursor.getString(path_col);
+ String type = cursor.getString(type_col);
+ if (path != null && type != null && type.startsWith("image/")) {
+ String wc = cursor.getString(width_col);
+ String hc = cursor.getString(height_col);
+ if (wc != null && hc != null) {
+ int w = Integer.parseInt (wc);
+ int h = Integer.parseInt (hc);
+ if (w > min_size && h > min_size &&
+ w < max_size && h < max_size) {
+ imgs.add (path);
+ }
+ }
+ }
+ }
+ cursor.close();
+ }
+
+ String which = null;
+
+ int count = imgs.size();
+ if (count == 0) {
+ LOG ("no images");
+ return null;
+ }
+
+ int i = new Random().nextInt (count);
+ which = imgs.get (i);
+ LOG ("picked image %d of %d: %s", i, count, which);
+
+ Uri uri = Uri.fromFile (new File (which));
+ String name = uri.getLastPathSegment();
+ Bitmap bitmap = null;
+ ExifInterface exif = null;
+
+ try {
+ try {
+ bitmap = MediaStore.Images.Media.getBitmap (cr, uri);
+ } catch (Exception e) {
+ LOG ("image %s unloadable: %s", which, e.toString());
+ return null;
+ }
+
+ try {
+ exif = new ExifInterface (uri.getPath()); // If it fails, who cares
+ } catch (Exception e) {
+ }
+
+ return convertBitmap (name, bitmap, target_width, target_height,
+ exif, rotate_p);
+ } catch (java.lang.OutOfMemoryError e) {
+ LOG ("image %s got OutOfMemoryError: %s", which, e.toString());
+ return null;
+ }
+ }
+
+
+ public Object[] getScreenshot (int target_width, int target_height,
+ boolean rotate_p) {
+ return convertBitmap ("Screenshot", screenshot,
+ target_width, target_height,
+ null, rotate_p);
+ }
+
+
+ public Bitmap decodePNG (byte[] data) {
+ BitmapFactory.Options opts = new BitmapFactory.Options();
+ opts.inPreferredConfig = Bitmap.Config.ARGB_8888;
+ return BitmapFactory.decodeByteArray (data, 0, data.length, opts);
+ }
+
+
+ // Sadly duplicated from jwxyz.h (and thence X.h and keysymdef.h)
+ //
+ private static final int ShiftMask = (1<<0);
+ private static final int LockMask = (1<<1);
+ private static final int ControlMask = (1<<2);
+ private static final int Mod1Mask = (1<<3);
+ private static final int Mod2Mask = (1<<4);
+ private static final int Mod3Mask = (1<<5);
+ private static final int Mod4Mask = (1<<6);
+ private static final int Mod5Mask = (1<<7);
+ private static final int Button1Mask = (1<<8);
+ private static final int Button2Mask = (1<<9);
+ private static final int Button3Mask = (1<<10);
+ private static final int Button4Mask = (1<<11);
+ private static final int Button5Mask = (1<<12);
+
+ private static final int XK_Shift_L = 0xFFE1;
+ private static final int XK_Shift_R = 0xFFE2;
+ private static final int XK_Control_L = 0xFFE3;
+ private static final int XK_Control_R = 0xFFE4;
+ private static final int XK_Caps_Lock = 0xFFE5;
+ private static final int XK_Shift_Lock = 0xFFE6;
+ private static final int XK_Meta_L = 0xFFE7;
+ private static final int XK_Meta_R = 0xFFE8;
+ private static final int XK_Alt_L = 0xFFE9;
+ private static final int XK_Alt_R = 0xFFEA;
+ private static final int XK_Super_L = 0xFFEB;
+ private static final int XK_Super_R = 0xFFEC;
+ private static final int XK_Hyper_L = 0xFFED;
+ private static final int XK_Hyper_R = 0xFFEE;
+
+ private static final int XK_Home = 0xFF50;
+ private static final int XK_Left = 0xFF51;
+ private static final int XK_Up = 0xFF52;
+ private static final int XK_Right = 0xFF53;
+ private static final int XK_Down = 0xFF54;
+ private static final int XK_Prior = 0xFF55;
+ private static final int XK_Page_Up = 0xFF55;
+ private static final int XK_Next = 0xFF56;
+ private static final int XK_Page_Down = 0xFF56;
+ private static final int XK_End = 0xFF57;
+ private static final int XK_Begin = 0xFF58;
+
+ private static final int XK_F1 = 0xFFBE;
+ private static final int XK_F2 = 0xFFBF;
+ private static final int XK_F3 = 0xFFC0;
+ private static final int XK_F4 = 0xFFC1;
+ private static final int XK_F5 = 0xFFC2;
+ private static final int XK_F6 = 0xFFC3;
+ private static final int XK_F7 = 0xFFC4;
+ private static final int XK_F8 = 0xFFC5;
+ private static final int XK_F9 = 0xFFC6;
+ private static final int XK_F10 = 0xFFC7;
+ private static final int XK_F11 = 0xFFC8;
+ private static final int XK_F12 = 0xFFC9;
+
+ public void sendKeyEvent (KeyEvent event) {
+ int uc = event.getUnicodeChar();
+ int jcode = event.getKeyCode();
+ int jmods = event.getModifiers();
+ int xcode = 0;
+ int xmods = 0;
+
+ switch (jcode) {
+ case KeyEvent.KEYCODE_SHIFT_LEFT: xcode = XK_Shift_L; break;
+ case KeyEvent.KEYCODE_SHIFT_RIGHT: xcode = XK_Shift_R; break;
+ case KeyEvent.KEYCODE_CTRL_LEFT: xcode = XK_Control_L; break;
+ case KeyEvent.KEYCODE_CTRL_RIGHT: xcode = XK_Control_R; break;
+ case KeyEvent.KEYCODE_CAPS_LOCK: xcode = XK_Caps_Lock; break;
+ case KeyEvent.KEYCODE_META_LEFT: xcode = XK_Meta_L; break;
+ case KeyEvent.KEYCODE_META_RIGHT: xcode = XK_Meta_R; break;
+ case KeyEvent.KEYCODE_ALT_LEFT: xcode = XK_Alt_L; break;
+ case KeyEvent.KEYCODE_ALT_RIGHT: xcode = XK_Alt_R; break;
+
+ case KeyEvent.KEYCODE_HOME: xcode = XK_Home; break;
+ case KeyEvent.KEYCODE_DPAD_LEFT: xcode = XK_Left; break;
+ case KeyEvent.KEYCODE_DPAD_UP: xcode = XK_Up; break;
+ case KeyEvent.KEYCODE_DPAD_RIGHT: xcode = XK_Right; break;
+ case KeyEvent.KEYCODE_DPAD_DOWN: xcode = XK_Down; break;
+ //case KeyEvent.KEYCODE_NAVIGATE_PREVIOUS: xcode = XK_Prior; break;
+ case KeyEvent.KEYCODE_PAGE_UP: xcode = XK_Page_Up; break;
+ //case KeyEvent.KEYCODE_NAVIGATE_NEXT: xcode = XK_Next; break;
+ case KeyEvent.KEYCODE_PAGE_DOWN: xcode = XK_Page_Down; break;
+ case KeyEvent.KEYCODE_MOVE_END: xcode = XK_End; break;
+ case KeyEvent.KEYCODE_MOVE_HOME: xcode = XK_Begin; break;
+
+ case KeyEvent.KEYCODE_F1: xcode = XK_F1; break;
+ case KeyEvent.KEYCODE_F2: xcode = XK_F2; break;
+ case KeyEvent.KEYCODE_F3: xcode = XK_F3; break;
+ case KeyEvent.KEYCODE_F4: xcode = XK_F4; break;
+ case KeyEvent.KEYCODE_F5: xcode = XK_F5; break;
+ case KeyEvent.KEYCODE_F6: xcode = XK_F6; break;
+ case KeyEvent.KEYCODE_F7: xcode = XK_F7; break;
+ case KeyEvent.KEYCODE_F8: xcode = XK_F8; break;
+ case KeyEvent.KEYCODE_F9: xcode = XK_F9; break;
+ case KeyEvent.KEYCODE_F10: xcode = XK_F10; break;
+ case KeyEvent.KEYCODE_F11: xcode = XK_F11; break;
+ case KeyEvent.KEYCODE_F12: xcode = XK_F12; break;
+ default: xcode = uc; break;
+ }
+
+ if (0 != (jmods & KeyEvent.META_SHIFT_ON)) xmods |= ShiftMask;
+ if (0 != (jmods & KeyEvent.META_CAPS_LOCK_ON)) xmods |= LockMask;
+ if (0 != (jmods & KeyEvent.META_CTRL_MASK)) xmods |= ControlMask;
+ if (0 != (jmods & KeyEvent.META_ALT_MASK)) xmods |= Mod1Mask;
+ if (0 != (jmods & KeyEvent.META_META_ON)) xmods |= Mod1Mask;
+ if (0 != (jmods & KeyEvent.META_SYM_ON)) xmods |= Mod2Mask;
+ if (0 != (jmods & KeyEvent.META_FUNCTION_ON)) xmods |= Mod3Mask;
+
+ /* If you touch and release Shift, you get no events.
+ If you type Shift-A, you get Shift down, A down, A up, Shift up.
+ So let's just ignore all lone modifier key events.
+ */
+ if (xcode >= XK_Shift_L && xcode <= XK_Hyper_R)
+ return;
+
+ boolean down_p = event.getAction() == KeyEvent.ACTION_DOWN;
+ sendKeyEvent (down_p, xcode, xmods);
+ }
+
+ void start () {
+ if (render == null) {
+ animating_p = true;
+ render = new Thread(new Runnable() {
+ @Override
+ public void run()
+ {
+ int currentWidth, currentHeight;
+ synchronized (render) {
+ while (true) {
+ while (!animating_p || width == 0 || height == 0) {
+ try {
+ render.wait();
+ } catch(InterruptedException exc) {
+ return;
+ }
+ }
+
+ try {
+ nativeInit (hack, defaults, width, height, surface);
+ currentWidth = width;
+ currentHeight= height;
+ break;
+ } catch (SurfaceLost exc) {
+ width = 0;
+ height = 0;
+ }
+ }
+ }
+
+ main_loop:
+ while (true) {
+ synchronized (render) {
+ assert width != 0;
+ assert height != 0;
+ while (!animating_p) {
+ try {
+ render.wait();
+ } catch(InterruptedException exc) {
+ break main_loop;
+ }
+ }
+
+ if (currentWidth != width || currentHeight != height) {
+ currentWidth = width;
+ currentHeight = height;
+ nativeResize (width, height, 0);
+ }
+ }
+
+ long delay = nativeRender();
+
+ synchronized (render) {
+ if (delay != 0) {
+ try {
+ render.wait(delay / 1000, (int)(delay % 1000) * 1000);
+ } catch (InterruptedException exc) {
+ break main_loop;
+ }
+ } else {
+ if (Thread.interrupted ()) {
+ break main_loop;
+ }
+ }
+ }
+ }
+
+ assert nativeRunningHackPtr != 0;
+ nativeDone ();
+ }
+ });
+
+ render.start();
+ } else {
+ synchronized(render) {
+ animating_p = true;
+ render.notify();
+ }
+ }
+ }
+
+ void pause () {
+ if (render == null)
+ return;
+ synchronized (render) {
+ animating_p = false;
+ render.notify();
+ }
+ }
+
+ void close () {
+ if (render == null)
+ return;
+ synchronized (render) {
+ animating_p = false;
+ render.interrupt();
+ }
+ try {
+ render.join();
+ } catch (InterruptedException exc) {
+ }
+ render = null;
+ }
+
+ void resize (int w, int h) {
+ assert w != 0;
+ assert h != 0;
+ if (render != null) {
+ synchronized (render) {
+ width = w;
+ height = h;
+ render.notify();
+ }
+ } else {
+ width = w;
+ height = h;
+ }
+ }
+
+
+ /* We distinguish between taps and drags.
+
+ - Drags/pans (down, motion, up) are sent to the saver to handle.
+ - Single-taps exit the saver.
+ - Long-press single-taps are sent to the saver as ButtonPress/Release;
+ - Double-taps are sent to the saver as a "Space" keypress.
+
+ #### TODO:
+ - Swipes (really, two-finger drags/pans) send Up/Down/Left/RightArrow.
+ */
+
+ @Override
+ public boolean onSingleTapConfirmed (MotionEvent event) {
+ if (on_quit != null)
+ on_quit.run();
+ return true;
+ }
+
+ @Override
+ public boolean onDoubleTap (MotionEvent event) {
+ sendKeyEvent (new KeyEvent (KeyEvent.ACTION_DOWN,
+ KeyEvent.KEYCODE_SPACE));
+ return true;
+ }
+
+ @Override
+ public void onLongPress (MotionEvent event) {
+ if (! button_down_p) {
+ int x = (int) event.getX (event.getPointerId (0));
+ int y = (int) event.getY (event.getPointerId (0));
+ sendButtonEvent (x, y, true);
+ sendButtonEvent (x, y, false);
+ }
+ }
+
+ @Override
+ public void onShowPress (MotionEvent event) {
+ if (! button_down_p) {
+ button_down_p = true;
+ int x = (int) event.getX (event.getPointerId (0));
+ int y = (int) event.getY (event.getPointerId (0));
+ sendButtonEvent (x, y, true);
+ }
+ }
+
+ @Override
+ public boolean onScroll (MotionEvent e1, MotionEvent e2,
+ float distanceX, float distanceY) {
+ // LOG ("onScroll: %d", button_down_p ? 1 : 0);
+ if (button_down_p)
+ sendMotionEvent ((int) e2.getX (e2.getPointerId (0)),
+ (int) e2.getY (e2.getPointerId (0)));
+ return true;
+ }
+
+ // If you drag too fast, you get a single onFling event instead of a
+ // succession of onScroll events. I can't figure out how to disable it.
+ @Override
+ public boolean onFling (MotionEvent e1, MotionEvent e2,
+ float velocityX, float velocityY) {
+ return false;
+ }
+
+ public boolean dragEnded (MotionEvent event) {
+ if (button_down_p) {
+ int x = (int) event.getX (event.getPointerId (0));
+ int y = (int) event.getY (event.getPointerId (0));
+ sendButtonEvent (x, y, false);
+ button_down_p = false;
+ }
+ return true;
+ }
+
+ @Override
+ public boolean onDown (MotionEvent event) {
+ return false;
+ }
+
+ @Override
+ public boolean onSingleTapUp (MotionEvent event) {
+ return false;
+ }
+
+ @Override
+ public boolean onDoubleTapEvent (MotionEvent event) {
+ return false;
+ }
+
+
+ static {
+ System.loadLibrary ("xscreensaver");
+
+/*
+ Thread.setDefaultUncaughtExceptionHandler(
+ new Thread.UncaughtExceptionHandler() {
+ Thread.UncaughtExceptionHandler old_handler =
+ Thread.currentThread().getUncaughtExceptionHandler();
+
+ @Override
+ public void uncaughtException (Thread thread, Throwable ex) {
+ String err = ex.toString();
+ Log.d ("xscreensaver", "Caught exception: " + err);
+ old_handler.uncaughtException (thread, ex);
+ }
+ });
+*/
+ }
+}
diff --git a/android/xscreensaver/xscreensaver.iml b/android/xscreensaver/xscreensaver.iml
new file mode 100644
index 0000000..dd9566c
--- /dev/null
+++ b/android/xscreensaver/xscreensaver.iml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.id=":xscreensaver" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" type="JAVA_MODULE" version="4">
+ <component name="FacetManager">
+ <facet type="android-gradle" name="Android-Gradle">
+ <configuration>
+ <option name="GRADLE_PROJECT_PATH" value=":xscreensaver" />
+ </configuration>
+ </facet>
+ <facet type="android" name="Android">
+ <configuration>
+ <option name="SELECTED_BUILD_VARIANT" value="debug" />
+ <option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
+ <option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
+ <afterSyncTasks>
+ <task>generateDebugSources</task>
+ </afterSyncTasks>
+ <option name="ALLOW_USER_CONFIGURATION" value="false" />
+ <option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/res" />
+ </configuration>
+ </facet>
+ </component>
+ <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7">
+ <output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
+ <output-test url="file://$MODULE_DIR$/build/intermediates/classes/test/debug" />
+ <exclude-output />
+ <content url="file://$MODULE_DIR$">
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/debug" isTestSource="false" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/debug" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/androidTest/debug" isTestSource="true" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/debug" isTestSource="true" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug" isTestSource="true" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug" isTestSource="true" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/debug" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/test/debug" isTestSource="true" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build-types/debug/res" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/build-types/debug/resources" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/build-types/debug/assets" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/build-types/debug/aidl" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/build-types/debug/java" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/build-types/debug/rs" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/build-types/debug/shaders" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/res" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/resources" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/assets" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/aidl" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/java" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/rs" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/shaders" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/testDebug/res" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/testDebug/resources" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/testDebug/assets" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/testDebug/aidl" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/testDebug/java" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/testDebug/rs" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/testDebug/shaders" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/res" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/assets" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/tests/res" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/tests/resources" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/tests/assets" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/tests/aidl" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/tests/java" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/tests/rs" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/tests/shaders" isTestSource="true" />
+ <excludeFolder url="file://$MODULE_DIR$/build/outputs" />
+ <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
+ </content>
+ <orderEntry type="jdk" jdkName="Android API 27 Platform" jdkType="Android SDK" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ <orderEntry type="library" name="Gradle: com.android.support:support-v4-27.1.1" level="project" />
+ <orderEntry type="library" name="Gradle: android.arch.lifecycle:common:1.1.0@jar" level="project" />
+ <orderEntry type="library" name="Gradle: com.android.support:support-fragment-27.1.1" level="project" />
+ <orderEntry type="library" name="Gradle: com.android.support:support-annotations:27.1.1@jar" level="project" />
+ <orderEntry type="library" name="Gradle: android.arch.core:runtime-1.1.0" level="project" />
+ <orderEntry type="library" name="Gradle: com.android.support:support-compat-27.1.1" level="project" />
+ <orderEntry type="library" name="Gradle: android.arch.lifecycle:viewmodel-1.1.0" level="project" />
+ <orderEntry type="library" name="Gradle: android.arch.lifecycle:livedata-core-1.1.0" level="project" />
+ <orderEntry type="library" name="Gradle: com.android.support:support-media-compat-27.1.1" level="project" />
+ <orderEntry type="library" name="Gradle: com.android.support:support-core-ui-27.1.1" level="project" />
+ <orderEntry type="library" name="Gradle: android.arch.core:common:1.1.0@jar" level="project" />
+ <orderEntry type="library" name="Gradle: com.android.support:support-core-utils-27.1.1" level="project" />
+ <orderEntry type="library" name="Gradle: android.arch.lifecycle:runtime-1.1.0" level="project" />
+ </component>
+</module> \ No newline at end of file
diff --git a/ax_pthread.m4 b/ax_pthread.m4
new file mode 100644
index 0000000..d383ad5
--- /dev/null
+++ b/ax_pthread.m4
@@ -0,0 +1,332 @@
+# ===========================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_pthread.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+#
+# DESCRIPTION
+#
+# This macro figures out how to build C programs using POSIX threads. It
+# sets the PTHREAD_LIBS output variable to the threads library and linker
+# flags, and the PTHREAD_CFLAGS output variable to any special C compiler
+# flags that are needed. (The user can also force certain compiler
+# flags/libs to be tested by setting these environment variables.)
+#
+# Also sets PTHREAD_CC to any special C compiler that is needed for
+# multi-threaded programs (defaults to the value of CC otherwise). (This
+# is necessary on AIX to use the special cc_r compiler alias.)
+#
+# NOTE: You are assumed to not only compile your program with these flags,
+# but also link it with them as well. e.g. you should link with
+# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
+#
+# If you are only building threads programs, you may wish to use these
+# variables in your default LIBS, CFLAGS, and CC:
+#
+# LIBS="$PTHREAD_LIBS $LIBS"
+# CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+# CC="$PTHREAD_CC"
+#
+# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
+# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name
+# (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
+#
+# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
+# PTHREAD_PRIO_INHERIT symbol is defined when compiling with
+# PTHREAD_CFLAGS.
+#
+# ACTION-IF-FOUND is a list of shell commands to run if a threads library
+# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it
+# is not found. If ACTION-IF-FOUND is not specified, the default action
+# will define HAVE_PTHREAD.
+#
+# Please let the authors know if this macro fails on any platform, or if
+# you have any other suggestions or comments. This macro was based on work
+# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help
+# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by
+# Alejandro Forero Cuervo to the autoconf macro repository. We are also
+# grateful for the helpful feedback of numerous users.
+#
+# Updated for Autoconf 2.68 by Daniel Richard G.
+#
+# LICENSE
+#
+# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
+# Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>
+#
+# 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 3 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, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception, the respective Autoconf Macro's copyright owner
+# gives unlimited permission to copy, distribute and modify the configure
+# scripts that are the output of Autoconf when processing the Macro. You
+# need not follow the terms of the GNU General Public License when using
+# or distributing such scripts, even though portions of the text of the
+# Macro appear in them. The GNU General Public License (GPL) does govern
+# all other use of the material that constitutes the Autoconf Macro.
+#
+# This special exception to the GPL applies to versions of the Autoconf
+# Macro released by the Autoconf Archive. When you make and distribute a
+# modified version of the Autoconf Macro, you may extend this special
+# exception to the GPL to apply to your modified version as well.
+
+#serial 21
+
+AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
+AC_DEFUN([AX_PTHREAD], [
+AC_REQUIRE([AC_CANONICAL_HOST])
+AC_LANG_PUSH([C])
+ax_pthread_ok=no
+
+# We used to check for pthread.h first, but this fails if pthread.h
+# requires special compiler flags (e.g. on True64 or Sequent).
+# It gets checked for in the link test anyway.
+
+# First of all, check if the user has set any of the PTHREAD_LIBS,
+# etcetera environment variables, and if threads linking works using
+# them:
+if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+ save_LIBS="$LIBS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+ AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
+ AC_TRY_LINK_FUNC([pthread_join], [ax_pthread_ok=yes])
+ AC_MSG_RESULT([$ax_pthread_ok])
+ if test x"$ax_pthread_ok" = xno; then
+ PTHREAD_LIBS=""
+ PTHREAD_CFLAGS=""
+ fi
+ LIBS="$save_LIBS"
+ CFLAGS="$save_CFLAGS"
+fi
+
+# We must check for the threads library under a number of different
+# names; the ordering is very important because some systems
+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+# libraries is broken (non-POSIX).
+
+# Create a list of thread flags to try. Items starting with a "-" are
+# C compiler flags, and other items are library names, except for "none"
+# which indicates that we try without any flags at all, and "pthread-config"
+# which is a program returning the flags for the Pth emulation library.
+
+ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+
+# The ordering *is* (sometimes) important. Some notes on the
+# individual items follow:
+
+# pthreads: AIX (must check this before -lpthread)
+# none: in case threads are in libc; should be tried before -Kthread and
+# other compiler flags to prevent continual compiler warnings
+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
+# -pthreads: Solaris/gcc
+# -mthreads: Mingw32/gcc, Lynx/gcc
+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+# doesn't hurt to check since this sometimes defines pthreads too;
+# also defines -D_REENTRANT)
+# ... -mt is also the pthreads flag for HP/aCC
+# pthread: Linux, etcetera
+# --thread-safe: KAI C++
+# pthread-config: use pthread-config program (for GNU Pth library)
+
+case ${host_os} in
+ solaris*)
+
+ # On Solaris (at least, for some versions), libc contains stubbed
+ # (non-functional) versions of the pthreads routines, so link-based
+ # tests will erroneously succeed. (We need to link with -pthreads/-mt/
+ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
+ # a function called by this macro, so we could check for that, but
+ # who knows whether they'll stub that too in a future libc.) So,
+ # we'll just look for -pthreads and -lpthread first:
+
+ ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags"
+ ;;
+
+ darwin*)
+ ax_pthread_flags="-pthread $ax_pthread_flags"
+ ;;
+esac
+
+# Clang doesn't consider unrecognized options an error unless we specify
+# -Werror. We throw in some extra Clang-specific options to ensure that
+# this doesn't happen for GCC, which also accepts -Werror.
+
+AC_MSG_CHECKING([if compiler needs -Werror to reject unknown flags])
+save_CFLAGS="$CFLAGS"
+ax_pthread_extra_flags="-Werror"
+CFLAGS="$CFLAGS $ax_pthread_extra_flags -Wunknown-warning-option -Wsizeof-array-argument"
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([int foo(void);],[foo()])],
+ [AC_MSG_RESULT([yes])],
+ [ax_pthread_extra_flags=
+ AC_MSG_RESULT([no])])
+CFLAGS="$save_CFLAGS"
+
+if test x"$ax_pthread_ok" = xno; then
+for flag in $ax_pthread_flags; do
+
+ case $flag in
+ none)
+ AC_MSG_CHECKING([whether pthreads work without any flags])
+ ;;
+
+ -*)
+ AC_MSG_CHECKING([whether pthreads work with $flag])
+ PTHREAD_CFLAGS="$flag"
+ ;;
+
+ pthread-config)
+ AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no])
+ if test x"$ax_pthread_config" = xno; then continue; fi
+ PTHREAD_CFLAGS="`pthread-config --cflags`"
+ PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+ ;;
+
+ *)
+ AC_MSG_CHECKING([for the pthreads library -l$flag])
+ PTHREAD_LIBS="-l$flag"
+ ;;
+ esac
+
+ save_LIBS="$LIBS"
+ save_CFLAGS="$CFLAGS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS $ax_pthread_extra_flags"
+
+ # Check for various functions. We must include pthread.h,
+ # since some functions may be macros. (On the Sequent, we
+ # need a special flag -Kthread to make this header compile.)
+ # We check for pthread_join because it is in -lpthread on IRIX
+ # while pthread_create is in libc. We check for pthread_attr_init
+ # due to DEC craziness with -lpthreads. We check for
+ # pthread_cleanup_push because it is one of the few pthread
+ # functions on Solaris that doesn't have a non-functional libc stub.
+ # We try pthread_create on general principles.
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
+ static void routine(void *a) { a = 0; }
+ static void *start_routine(void *a) { return a; }],
+ [pthread_t th; pthread_attr_t attr;
+ pthread_create(&th, 0, start_routine, 0);
+ pthread_join(th, 0);
+ pthread_attr_init(&attr);
+ pthread_cleanup_push(routine, 0);
+ pthread_cleanup_pop(0) /* ; */])],
+ [ax_pthread_ok=yes],
+ [])
+
+ LIBS="$save_LIBS"
+ CFLAGS="$save_CFLAGS"
+
+ AC_MSG_RESULT([$ax_pthread_ok])
+ if test "x$ax_pthread_ok" = xyes; then
+ break;
+ fi
+
+ PTHREAD_LIBS=""
+ PTHREAD_CFLAGS=""
+done
+fi
+
+# Various other checks:
+if test "x$ax_pthread_ok" = xyes; then
+ save_LIBS="$LIBS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+ # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
+ AC_MSG_CHECKING([for joinable pthread attribute])
+ attr_name=unknown
+ for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
+ [int attr = $attr; return attr /* ; */])],
+ [attr_name=$attr; break],
+ [])
+ done
+ AC_MSG_RESULT([$attr_name])
+ if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
+ AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], [$attr_name],
+ [Define to necessary symbol if this constant
+ uses a non-standard name on your system.])
+ fi
+
+ AC_MSG_CHECKING([if more special flags are required for pthreads])
+ flag=no
+ case ${host_os} in
+ aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";;
+ osf* | hpux*) flag="-D_REENTRANT";;
+ solaris*)
+ if test "$GCC" = "yes"; then
+ flag="-D_REENTRANT"
+ else
+ # TODO: What about Clang on Solaris?
+ flag="-mt -D_REENTRANT"
+ fi
+ ;;
+ esac
+ AC_MSG_RESULT([$flag])
+ if test "x$flag" != xno; then
+ PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
+ fi
+
+ AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],
+ [ax_cv_PTHREAD_PRIO_INHERIT], [
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]],
+ [[int i = PTHREAD_PRIO_INHERIT;]])],
+ [ax_cv_PTHREAD_PRIO_INHERIT=yes],
+ [ax_cv_PTHREAD_PRIO_INHERIT=no])
+ ])
+ AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"],
+ [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])])
+
+ LIBS="$save_LIBS"
+ CFLAGS="$save_CFLAGS"
+
+ # More AIX lossage: compile with *_r variant
+ if test "x$GCC" != xyes; then
+ case $host_os in
+ aix*)
+ AS_CASE(["x/$CC"],
+ [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6],
+ [#handle absolute path differently from PATH based program lookup
+ AS_CASE(["x$CC"],
+ [x/*],
+ [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])],
+ [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])])
+ ;;
+ esac
+ fi
+fi
+
+test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
+
+AC_SUBST([PTHREAD_LIBS])
+AC_SUBST([PTHREAD_CFLAGS])
+AC_SUBST([PTHREAD_CC])
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test x"$ax_pthread_ok" = xyes; then
+ ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1])
+ :
+else
+ ax_pthread_ok=no
+ $2
+fi
+AC_LANG_POP
+])dnl AX_PTHREAD
diff --git a/config.guess b/config.guess
new file mode 100755
index 0000000..256083a
--- /dev/null
+++ b/config.guess
@@ -0,0 +1,1476 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright 1992-2018 Free Software Foundation, Inc.
+
+timestamp='2018-03-08'
+
+# This file 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 3 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, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program. This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
+#
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+#
+# Please send patches to <config-patches@gnu.org>.
+
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Options:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright 1992-2018 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,) echo "int x;" > "$dummy.c" ;
+ for c in cc gcc c89 c99 ; do
+ if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
+ CC_FOR_BUILD="$c"; break ;
+ fi ;
+ done ;
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found ;
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+case "$UNAME_SYSTEM" in
+Linux|GNU|GNU/*)
+ # If the system lacks a compiler, then just pick glibc.
+ # We could probably try harder.
+ LIBC=gnu
+
+ eval "$set_cc_for_build"
+ cat <<-EOF > "$dummy.c"
+ #include <features.h>
+ #if defined(__UCLIBC__)
+ LIBC=uclibc
+ #elif defined(__dietlibc__)
+ LIBC=dietlibc
+ #else
+ LIBC=gnu
+ #endif
+ EOF
+ eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`"
+
+ # If ldd exists, use it to detect musl libc.
+ if command -v ldd >/dev/null && \
+ ldd --version 2>&1 | grep -q ^musl
+ then
+ LIBC=musl
+ fi
+ ;;
+esac
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+ UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+ "/sbin/$sysctl" 2>/dev/null || \
+ "/usr/sbin/$sysctl" 2>/dev/null || \
+ echo unknown)`
+ case "$UNAME_MACHINE_ARCH" in
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ sh5el) machine=sh5le-unknown ;;
+ earmv*)
+ arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+ endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'`
+ machine="${arch}${endian}"-unknown
+ ;;
+ *) machine="$UNAME_MACHINE_ARCH"-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently (or will in the future) and ABI.
+ case "$UNAME_MACHINE_ARCH" in
+ earm*)
+ os=netbsdelf
+ ;;
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ eval "$set_cc_for_build"
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ELF__
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # Determine ABI tags.
+ case "$UNAME_MACHINE_ARCH" in
+ earm*)
+ expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+ abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"`
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case "$UNAME_VERSION" in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ echo "$machine-${os}${release}${abi}"
+ exit ;;
+ *:Bitrig:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+ echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE"
+ exit ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE"
+ exit ;;
+ *:LibertyBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+ echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE"
+ exit ;;
+ *:MidnightBSD:*:*)
+ echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE"
+ exit ;;
+ *:ekkoBSD:*:*)
+ echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE"
+ exit ;;
+ *:SolidBSD:*:*)
+ echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE"
+ exit ;;
+ macppc:MirBSD:*:*)
+ echo powerpc-unknown-mirbsd"$UNAME_RELEASE"
+ exit ;;
+ *:MirBSD:*:*)
+ echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE"
+ exit ;;
+ *:Sortix:*:*)
+ echo "$UNAME_MACHINE"-unknown-sortix
+ exit ;;
+ *:Redox:*:*)
+ echo "$UNAME_MACHINE"-unknown-redox
+ exit ;;
+ mips:OSF1:*.*)
+ echo mips-dec-osf1
+ exit ;;
+ alpha:OSF1:*:*)
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+ UNAME_MACHINE=alpha ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE=alpha ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE=alpha ;;
+ "EV5 (21164)")
+ UNAME_MACHINE=alphaev5 ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE=alphaev56 ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE=alphapca56 ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE=alphapca57 ;;
+ "EV6 (21264)")
+ UNAME_MACHINE=alphaev6 ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE=alphaev67 ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE=alphaev68 ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE=alphaev68 ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE=alphaev68 ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE=alphaev69 ;;
+ "EV7 (21364)")
+ UNAME_MACHINE=alphaev7 ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE=alphaev79 ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`"
+ # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+ exitcode=$?
+ trap '' 0
+ exit $exitcode ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-unknown-sysv4
+ exit ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo "$UNAME_MACHINE"-unknown-amigaos
+ exit ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo "$UNAME_MACHINE"-unknown-morphos
+ exit ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+ exit ;;
+ *:z/VM:*:*)
+ echo s390-ibm-zvmoe
+ exit ;;
+ *:OS400:*:*)
+ echo powerpc-ibm-os400
+ exit ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix"$UNAME_RELEASE"
+ exit ;;
+ arm*:riscos:*:*|arm*:RISCOS:*:*)
+ echo arm-unknown-riscos
+ exit ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit ;;
+ DRS?6000:unix:4.0:6*)
+ echo sparc-icl-nx6
+ exit ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) echo sparc-icl-nx7; exit ;;
+ esac ;;
+ s390x:SunOS:*:*)
+ echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`"
+ exit ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
+ exit ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`"
+ exit ;;
+ i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+ echo i386-pc-auroraux"$UNAME_RELEASE"
+ exit ;;
+ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+ eval "$set_cc_for_build"
+ SUN_ARCH=i386
+ # If there is a compiler, see if it is configured for 64-bit objects.
+ # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+ # This test works for both compilers.
+ if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+ if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ SUN_ARCH=x86_64
+ fi
+ fi
+ echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
+ exit ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
+ exit ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`"
+ exit ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos"$UNAME_RELEASE"
+ exit ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos"$UNAME_RELEASE"
+ ;;
+ sun4)
+ echo sparc-sun-sunos"$UNAME_RELEASE"
+ ;;
+ esac
+ exit ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos"$UNAME_RELEASE"
+ exit ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint"$UNAME_RELEASE"
+ exit ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint"$UNAME_RELEASE"
+ exit ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ echo m68k-atari-mint"$UNAME_RELEASE"
+ exit ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ echo m68k-milan-mint"$UNAME_RELEASE"
+ exit ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ echo m68k-hades-mint"$UNAME_RELEASE"
+ exit ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ echo m68k-unknown-mint"$UNAME_RELEASE"
+ exit ;;
+ m68k:machten:*:*)
+ echo m68k-apple-machten"$UNAME_RELEASE"
+ exit ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten"$UNAME_RELEASE"
+ exit ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix"$UNAME_RELEASE"
+ exit ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix"$UNAME_RELEASE"
+ exit ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix"$UNAME_RELEASE"
+ exit ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ eval "$set_cc_for_build"
+ sed 's/^ //' << EOF > "$dummy.c"
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o "$dummy" "$dummy.c" &&
+ dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+ SYSTEM_NAME=`"$dummy" "$dummyarg"` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo mips-mips-riscos"$UNAME_RELEASE"
+ exit ;;
+ Motorola:PowerMAX_OS:*:*)
+ echo powerpc-motorola-powermax
+ exit ;;
+ Motorola:*:4.3:PL8-*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ]
+ then
+ if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \
+ [ "$TARGET_BINARY_INTERFACE"x = x ]
+ then
+ echo m88k-dg-dgux"$UNAME_RELEASE"
+ else
+ echo m88k-dg-dguxbcs"$UNAME_RELEASE"
+ fi
+ else
+ echo i586-dg-dgux"$UNAME_RELEASE"
+ fi
+ exit ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`"
+ exit ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ echo i386-ibm-aix
+ exit ;;
+ ia64:AIX:*:*)
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
+ fi
+ echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV"
+ exit ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ eval "$set_cc_for_build"
+ sed 's/^ //' << EOF > "$dummy.c"
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"`
+ then
+ echo "$SYSTEM_NAME"
+ else
+ echo rs6000-ibm-aix3.2.5
+ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit ;;
+ *:AIX:*:[4567])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/lslpp ] ; then
+ IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
+ else
+ IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
+ fi
+ echo "$IBM_ARCH"-ibm-aix"$IBM_REV"
+ exit ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit ;;
+ ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)
+ echo romp-ibm-bsd4.4
+ exit ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to
+ exit ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'`
+ case "$UNAME_MACHINE" in
+ 9000/31?) HP_ARCH=m68000 ;;
+ 9000/[34]??) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if [ -x /usr/bin/getconf ]; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case "$sc_cpu_version" in
+ 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case "$sc_kernel_bits" in
+ 32) HP_ARCH=hppa2.0n ;;
+ 64) HP_ARCH=hppa2.0w ;;
+ '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if [ "$HP_ARCH" = "" ]; then
+ eval "$set_cc_for_build"
+ sed 's/^ //' << EOF > "$dummy.c"
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if [ "$HP_ARCH" = hppa2.0w ]
+ then
+ eval "$set_cc_for_build"
+
+ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
+ # generating 64-bit code. GNU and HP use different nomenclature:
+ #
+ # $ CC_FOR_BUILD=cc ./config.guess
+ # => hppa2.0w-hp-hpux11.23
+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ # => hppa64-hp-hpux11.23
+
+ if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
+ grep -q __LP64__
+ then
+ HP_ARCH=hppa2.0w
+ else
+ HP_ARCH=hppa64
+ fi
+ fi
+ echo "$HP_ARCH"-hp-hpux"$HPUX_REV"
+ exit ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'`
+ echo ia64-hp-hpux"$HPUX_REV"
+ exit ;;
+ 3050*:HI-UX:*:*)
+ eval "$set_cc_for_build"
+ sed 's/^ //' << EOF > "$dummy.c"
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo unknown-hitachi-hiuxwe2
+ exit ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)
+ echo hppa1.1-hp-bsd
+ exit ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+ exit ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)
+ echo hppa1.1-hp-osf
+ exit ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit ;;
+ i*86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo "$UNAME_MACHINE"-unknown-osf1mk
+ else
+ echo "$UNAME_MACHINE"-unknown-osf1
+ fi
+ exit ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*T3E:*:*:*)
+ echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ *:UNICOS/mp:*:*)
+ echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+ FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+ FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'`
+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+ FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE"
+ exit ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi"$UNAME_RELEASE"
+ exit ;;
+ *:BSD/OS:*:*)
+ echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE"
+ exit ;;
+ *:FreeBSD:*:*)
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ case "$UNAME_PROCESSOR" in
+ amd64)
+ UNAME_PROCESSOR=x86_64 ;;
+ i386)
+ UNAME_PROCESSOR=i586 ;;
+ esac
+ echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`"
+ exit ;;
+ i*:CYGWIN*:*)
+ echo "$UNAME_MACHINE"-pc-cygwin
+ exit ;;
+ *:MINGW64*:*)
+ echo "$UNAME_MACHINE"-pc-mingw64
+ exit ;;
+ *:MINGW*:*)
+ echo "$UNAME_MACHINE"-pc-mingw32
+ exit ;;
+ *:MSYS*:*)
+ echo "$UNAME_MACHINE"-pc-msys
+ exit ;;
+ i*:PW*:*)
+ echo "$UNAME_MACHINE"-pc-pw32
+ exit ;;
+ *:Interix*:*)
+ case "$UNAME_MACHINE" in
+ x86)
+ echo i586-pc-interix"$UNAME_RELEASE"
+ exit ;;
+ authenticamd | genuineintel | EM64T)
+ echo x86_64-unknown-interix"$UNAME_RELEASE"
+ exit ;;
+ IA64)
+ echo ia64-unknown-interix"$UNAME_RELEASE"
+ exit ;;
+ esac ;;
+ i*:UWIN*:*)
+ echo "$UNAME_MACHINE"-pc-uwin
+ exit ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ echo x86_64-unknown-cygwin
+ exit ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
+ exit ;;
+ *:GNU:*:*)
+ # the GNU system
+ echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`"
+ exit ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC"
+ exit ;;
+ i*86:Minix:*:*)
+ echo "$UNAME_MACHINE"-pc-minix
+ exit ;;
+ aarch64:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ aarch64_be:Linux:*:*)
+ UNAME_MACHINE=aarch64_be
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep -q ld.so.1
+ if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ arc:Linux:*:* | arceb:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ arm*:Linux:*:*)
+ eval "$set_cc_for_build"
+ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_EABI__
+ then
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ else
+ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_PCS_VFP
+ then
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi
+ else
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf
+ fi
+ fi
+ exit ;;
+ avr32*:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ cris:Linux:*:*)
+ echo "$UNAME_MACHINE"-axis-linux-"$LIBC"
+ exit ;;
+ crisv32:Linux:*:*)
+ echo "$UNAME_MACHINE"-axis-linux-"$LIBC"
+ exit ;;
+ e2k:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ frv:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ hexagon:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ i*86:Linux:*:*)
+ echo "$UNAME_MACHINE"-pc-linux-"$LIBC"
+ exit ;;
+ ia64:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ k1om:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ m32r*:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ m68*:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ mips:Linux:*:* | mips64:Linux:*:*)
+ eval "$set_cc_for_build"
+ sed 's/^ //' << EOF > "$dummy.c"
+ #undef CPU
+ #undef ${UNAME_MACHINE}
+ #undef ${UNAME_MACHINE}el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=${UNAME_MACHINE}el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=${UNAME_MACHINE}
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`"
+ test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; }
+ ;;
+ mips64el:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ openrisc*:Linux:*:*)
+ echo or1k-unknown-linux-"$LIBC"
+ exit ;;
+ or32:Linux:*:* | or1k*:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ padre:Linux:*:*)
+ echo sparc-unknown-linux-"$LIBC"
+ exit ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-"$LIBC"
+ exit ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;;
+ PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;;
+ *) echo hppa-unknown-linux-"$LIBC" ;;
+ esac
+ exit ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-"$LIBC"
+ exit ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-"$LIBC"
+ exit ;;
+ ppc64le:Linux:*:*)
+ echo powerpc64le-unknown-linux-"$LIBC"
+ exit ;;
+ ppcle:Linux:*:*)
+ echo powerpcle-unknown-linux-"$LIBC"
+ exit ;;
+ riscv32:Linux:*:* | riscv64:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo "$UNAME_MACHINE"-ibm-linux-"$LIBC"
+ exit ;;
+ sh64*:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ sh*:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ tile*:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ vax:Linux:*:*)
+ echo "$UNAME_MACHINE"-dec-linux-"$LIBC"
+ exit ;;
+ x86_64:Linux:*:*)
+ echo "$UNAME_MACHINE"-pc-linux-"$LIBC"
+ exit ;;
+ xtensa*:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ echo i386-sequent-sysv4
+ exit ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION"
+ exit ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ echo "$UNAME_MACHINE"-pc-os2-emx
+ exit ;;
+ i*86:XTS-300:*:STOP)
+ echo "$UNAME_MACHINE"-unknown-stop
+ exit ;;
+ i*86:atheos:*:*)
+ echo "$UNAME_MACHINE"-unknown-atheos
+ exit ;;
+ i*86:syllable:*:*)
+ echo "$UNAME_MACHINE"-pc-syllable
+ exit ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+ echo i386-unknown-lynxos"$UNAME_RELEASE"
+ exit ;;
+ i*86:*DOS:*:*)
+ echo "$UNAME_MACHINE"-pc-msdosdjgpp
+ exit ;;
+ i*86:*:4.*:*)
+ UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL"
+ else
+ echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL"
+ fi
+ exit ;;
+ i*86:*:5:[678]*)
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}"
+ exit ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo "$UNAME_MACHINE"-pc-isc"$UNAME_REL"
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL"
+ else
+ echo "$UNAME_MACHINE"-pc-sysv32
+ fi
+ exit ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i586.
+ # Note: whatever this is, it MUST be the same as what config.sub
+ # prints for the "djgpp" host, or else GDB configure will decide that
+ # this is a cross-build.
+ echo i586-pc-msdosdjgpp
+ exit ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4
+ fi
+ exit ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ echo m68k-convergent-sysv
+ exit ;;
+ M680?0:D-NIX:5.3:*)
+ echo m68k-diab-dnix
+ exit ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4; exit; } ;;
+ NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+ OS_REL='.3'
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ echo m68k-unknown-lynxos"$UNAME_RELEASE"
+ exit ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos"$UNAME_RELEASE"
+ exit ;;
+ rs6000:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos"$UNAME_RELEASE"
+ exit ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+ echo powerpc-unknown-lynxos"$UNAME_RELEASE"
+ exit ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv"$UNAME_RELEASE"
+ exit ;;
+ RM*:ReliantUNIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo "$UNAME_MACHINE"-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit ;;
+ i*86:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo "$UNAME_MACHINE"-stratus-vos
+ exit ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo hppa1.1-stratus-vos
+ exit ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux"$UNAME_RELEASE"
+ exit ;;
+ news*:NEWS-OS:6*:*)
+ echo mips-sony-newsos6
+ exit ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv"$UNAME_RELEASE"
+ else
+ echo mips-unknown-sysv"$UNAME_RELEASE"
+ fi
+ exit ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit ;;
+ BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
+ echo i586-pc-haiku
+ exit ;;
+ x86_64:Haiku:*:*)
+ echo x86_64-unknown-haiku
+ exit ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux"$UNAME_RELEASE"
+ exit ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux"$UNAME_RELEASE"
+ exit ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux"$UNAME_RELEASE"
+ exit ;;
+ SX-7:SUPER-UX:*:*)
+ echo sx7-nec-superux"$UNAME_RELEASE"
+ exit ;;
+ SX-8:SUPER-UX:*:*)
+ echo sx8-nec-superux"$UNAME_RELEASE"
+ exit ;;
+ SX-8R:SUPER-UX:*:*)
+ echo sx8r-nec-superux"$UNAME_RELEASE"
+ exit ;;
+ SX-ACE:SUPER-UX:*:*)
+ echo sxace-nec-superux"$UNAME_RELEASE"
+ exit ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody"$UNAME_RELEASE"
+ exit ;;
+ *:Rhapsody:*:*)
+ echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE"
+ exit ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+ eval "$set_cc_for_build"
+ if test "$UNAME_PROCESSOR" = unknown ; then
+ UNAME_PROCESSOR=powerpc
+ fi
+ if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then
+ if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ case $UNAME_PROCESSOR in
+ i386) UNAME_PROCESSOR=x86_64 ;;
+ powerpc) UNAME_PROCESSOR=powerpc64 ;;
+ esac
+ fi
+ # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
+ if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_PPC >/dev/null
+ then
+ UNAME_PROCESSOR=powerpc
+ fi
+ fi
+ elif test "$UNAME_PROCESSOR" = i386 ; then
+ # Avoid executing cc on OS X 10.9, as it ships with a stub
+ # that puts up a graphical alert prompting to install
+ # developer tools. Any system running Mac OS X 10.7 or
+ # later (Darwin 11 and later) is required to have a 64-bit
+ # processor. This is not true of the ARM version of Darwin
+ # that Apple uses in portable devices.
+ UNAME_PROCESSOR=x86_64
+ fi
+ echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE"
+ exit ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = x86; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE"
+ exit ;;
+ *:QNX:*:4*)
+ echo i386-pc-qnx
+ exit ;;
+ NEO-*:NONSTOP_KERNEL:*:*)
+ echo neo-tandem-nsk"$UNAME_RELEASE"
+ exit ;;
+ NSE-*:NONSTOP_KERNEL:*:*)
+ echo nse-tandem-nsk"$UNAME_RELEASE"
+ exit ;;
+ NSR-*:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk"$UNAME_RELEASE"
+ exit ;;
+ NSV-*:NONSTOP_KERNEL:*:*)
+ echo nsv-tandem-nsk"$UNAME_RELEASE"
+ exit ;;
+ NSX-*:NONSTOP_KERNEL:*:*)
+ echo nsx-tandem-nsk"$UNAME_RELEASE"
+ exit ;;
+ *:NonStop-UX:*:*)
+ echo mips-compaq-nonstopux
+ exit ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+ exit ;;
+ DS/*:UNIX_System_V:*:*)
+ echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE"
+ exit ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "$cputype" = 386; then
+ UNAME_MACHINE=i386
+ else
+ UNAME_MACHINE="$cputype"
+ fi
+ echo "$UNAME_MACHINE"-unknown-plan9
+ exit ;;
+ *:TOPS-10:*:*)
+ echo pdp10-unknown-tops10
+ exit ;;
+ *:TENEX:*:*)
+ echo pdp10-unknown-tenex
+ exit ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ echo pdp10-dec-tops20
+ exit ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ echo pdp10-xkl-tops20
+ exit ;;
+ *:TOPS-20:*:*)
+ echo pdp10-unknown-tops20
+ exit ;;
+ *:ITS:*:*)
+ echo pdp10-unknown-its
+ exit ;;
+ SEI:*:*:SEIUX)
+ echo mips-sei-seiux"$UNAME_RELEASE"
+ exit ;;
+ *:DragonFly:*:*)
+ echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`"
+ exit ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case "$UNAME_MACHINE" in
+ A*) echo alpha-dec-vms ; exit ;;
+ I*) echo ia64-dec-vms ; exit ;;
+ V*) echo vax-dec-vms ; exit ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ echo i386-pc-xenix
+ exit ;;
+ i*86:skyos:*:*)
+ echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`"
+ exit ;;
+ i*86:rdos:*:*)
+ echo "$UNAME_MACHINE"-pc-rdos
+ exit ;;
+ i*86:AROS:*:*)
+ echo "$UNAME_MACHINE"-pc-aros
+ exit ;;
+ x86_64:VMkernel:*:*)
+ echo "$UNAME_MACHINE"-unknown-esx
+ exit ;;
+ amd64:Isilon\ OneFS:*:*)
+ echo x86_64-unknown-onefs
+ exit ;;
+esac
+
+echo "$0: unable to guess system type" >&2
+
+case "$UNAME_MACHINE:$UNAME_SYSTEM" in
+ mips:Linux | mips64:Linux)
+ # If we got here on MIPS GNU/Linux, output extra information.
+ cat >&2 <<EOF
+
+NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize
+the system type. Please install a C compiler and try again.
+EOF
+ ;;
+esac
+
+cat >&2 <<EOF
+
+This script (version $timestamp), has failed to recognize the
+operating system you are using. If your script is old, overwrite *all*
+copies of config.guess and config.sub with the latest versions from:
+
+ https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+and
+ https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+
+If $0 has already been updated, send the following data and any
+information you think might be pertinent to config-patches@gnu.org to
+provide the necessary information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = "$UNAME_MACHINE"
+UNAME_RELEASE = "$UNAME_RELEASE"
+UNAME_SYSTEM = "$UNAME_SYSTEM"
+UNAME_VERSION = "$UNAME_VERSION"
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/config.h-vms b/config.h-vms
new file mode 100644
index 0000000..7a30b19
--- /dev/null
+++ b/config.h-vms
@@ -0,0 +1,284 @@
+/* This is a config.h file that has been pregenerated (from config.h.in)
+ * with settings that are correct for VMS.
+ */
+
+
+
+/* config.h.in --- xscreensaver, Copyright (c) 1998 Jamie Zawinski.
+ *
+ * The best way to set these parameters is by running the included `configure'
+ * script. That examines your system, and generates `config.h' from
+ * `config.h.in'.
+ *
+ * If something goes very wrong, you can edit `config.h' directly, but beware
+ * that your changes will be lost if you ever run `configure' again.
+ */
+
+
+/* *************************************************************************
+ CONFIGURING SERVER EXTENSIONS
+ ************************************************************************* */
+
+/* Define this if you have the XReadDisplay extension (I think this is an
+ SGI-only thing; it's in <X11/extensions/readdisplay.h>.) A few of the
+ screenhacks will take advantage of this if it's available.
+ */
+#undef HAVE_READ_DISPLAY_EXTENSION
+
+/* Define this if you have the Iris Video Library (dmedia/vl.h on SGI.)
+ A few of the screenhacks will take advantage of this if it's available.
+ */
+#undef HAVE_SGI_VIDEO
+
+/* Define this if you have the XHPDisableReset function (an HP only thing.)
+ */
+#undef HAVE_XHPDISABLERESET
+
+/* First, some background: there are three distinct server extensions which
+ * are useful to a screen saver program: they are XIDLE, MIT-SCREEN-SAVER,
+ * and SCREEN_SAVER.
+ *
+ * The XIDLE extension resides in .../contrib/extensions/xidle/ on the X11R5
+ * contrib tape. This extension lets the client get accurate idle-time
+ * information from the X server in a potentially more reliable way than by
+ * simply watching for keyboard and mouse activity. However, the XIDLE
+ * extension has apparently not been ported to X11R6.
+ *
+ * The SCREEN_SAVER extension is found (as far as I know) only in the SGI
+ * X server, and it exists in all releases since (at least) Irix 5. The
+ * relevant header file is /usr/include/X11/extensions/XScreenSaver.h.
+ *
+ * The similarly-named MIT-SCREEN-SAVER extension came into existence long
+ * after the SGI SCREEN_SAVER extension was already in use, and resides in
+ * .../contrib/extensions/screensaver/ on the X11R6 contrib tape. It is
+ * also found in certain recent X servers built in to NCD X terminals.
+ *
+ * The MIT extension does basically the same thing that the XIDLE extension
+ * does, but there are two things wrong with it: first, because of the way
+ * the extension was designed, the `fade' option to XScreenSaver will be
+ * uglier: just before the screen fades out, there will be an unattractive
+ * flicker to black, because this extension blanks the screen *before*
+ * telling us that it is time to do so. Second, this extension is known to
+ * be buggy; on the systems I use, it works, but some people have reported
+ * X server crashes as a result of using it. XScreenSaver uses this
+ * extension rather conservatively, because when I tried to use any of its
+ * more complicated features, I could get it to crash the server at the
+ * drop of a hat.
+ *
+ * In short, the MIT-SCREEN-SAVER extension is a piece of junk. The older
+ * SGI SCREEN_SAVER extension works great, as does XIDLE. It would be nice
+ * If those two existed on more systems, that is, would be adopted by the
+ * X Consortium in favor of their inferior "not-invented-here" entry.
+ */
+
+/* Define this if you have the XIDLE extension installed. If you have the
+ * XIDLE extension, this is recommended. (You have this extension if the
+ * file /usr/include/X11/extensions/xidle.h exists.) Turning on this flag
+ * lets XScreenSaver work better with servers which support this extension;
+ * but it will still work with servers which do not suport it, so it's a good
+ * idea to compile in support for it if you can.
+ */
+#undef HAVE_XIDLE_EXTENSION
+
+/* Define this if you have the MIT-SCREEN-SAVER extension installed. See the
+ * caveats about this extension, above. (It's available if the file
+ * /usr/include/X11/extensions/scrnsaver.h exists.)
+ */
+#undef HAVE_MIT_SAVER_EXTENSION
+
+/* Define this if you have the SGI SCREEN_SAVER extension. This is standard
+ * on Irix systems, and not available elsewhere.
+ */
+#undef HAVE_SGI_SAVER_EXTENSION
+
+/* Define this if you have the SGI-VIDEO-CONTROL extension. This is standard
+ * on Irix systems, and not available elsewhere.
+ */
+#undef HAVE_SGI_VC_EXTENSION
+
+/* Define this if you have the XDPMS extension. This is standard on
+ * sufficiently-recent XFree86 systems, and possibly elsewhere. (It's
+ * available if the file /usr/include/X11/extensions/dpms.h exists.)
+ */
+#define HAVE_DPMS_EXTENSION 1
+
+
+/* *************************************************************************
+ CONFIGURING GRAPHICS TOOLKITS
+ ************************************************************************* */
+
+/* Define this if you have Motif.
+ */
+#define HAVE_MOTIF 1
+
+/* Define this if you have the XmComboBox Motif widget (Motif 2.0.)
+ */
+#undef HAVE_XMCOMBOBOX
+
+/* Define this if you have the XPM library installed. Some of the demos can
+ * make use of this if it is available.
+ */
+#define HAVE_XPM 1
+
+/* Define this if you have the Xmu library. This is standard part of X, and
+ * if your vendor doesn't ship it, you should report that as a bug.
+ */
+#define HAVE_XMU 1
+
+/* Define this if you have OpenGL. Some of the demos require it, so if you
+ * don't have it, then those particular demos won't be built. (This won't
+ * affect the screen saver as a whole.)
+ */
+#undef HAVE_GL
+
+/* Define this if you have OpenGL, but it's the MesaGL variant. (The
+ libraries have different names.) (HAVE_GL should be defined too.)
+ */
+#undef HAVE_MESA_GL
+
+/* Define this if your version of OpenGL has the glBindTexture() routine.
+ This is the case for OpenGL 1.1, but not for OpenGL 1.0.
+ */
+#undef HAVE_GLBINDTEXTURE
+
+/* Define this if you have the X Shared Memory Extension.
+ */
+#undef HAVE_XSHM_EXTENSION
+
+
+/* *************************************************************************
+ CONFIGURING PASSWORD AUTHENTICATION
+ ************************************************************************* */
+
+/* Define this to remove the option of locking the screen at all.
+ */
+#undef NO_LOCKING
+
+/* Define this if you want to use Kerberos authentication to lock/unlock the
+ * screen instead of your local password. This currently uses Kerberos V4,
+ * but a V5 server with V4 compatibility will work. WARNING: DO NOT USE AFS
+ * string-to-key passwords with this option. This option currently *only*
+ * works with standard Kerberos des_string_to_key. If your password is an
+ * AFS password and not a kerberos password, it will not authenticate
+ * properly. See the comments in driver/kpasswd.c for more information if you
+ * need it.
+ */
+#undef HAVE_KERBEROS
+
+
+/* Define this if your system uses `shadow' passwords, that is, the passwords
+ * live in /etc/shadow instead of /etc/passwd, and one reads them with
+ * getspnam() instead of getpwnam(). (Note that SCO systems do some random
+ * other thing; others might as well. See the ifdefs in driver/passwd.c if
+ * you're having trouble related to reading passwords.)
+ */
+#undef HAVE_SHADOW_PASSWD
+
+/* Define this if your system is Digital or SCO Unix with so-called ``Enhanced
+ Security'', that is, the passwords live in /tcb/files/auth/<x>/<xyz>
+ instead of in /etc/passwd, and one reads them with getprpwnam() instead
+ of getpwnam().
+ */
+#undef HAVE_ENHANCED_PASSWD
+
+/* Define this if your system is Solaris with ``adjunct'' passwords (this is
+ the version where one gets at the passwords with getpwanam() instead of
+ getpwnam().) I haven't tested this one, let me know if it works.
+ */
+#undef HAVE_ADJUNCT_PASSWD
+
+/* Define this if you are running HPUX with so-called ``Secure Passwords''
+ (if you have /usr/include/hpsecurity.h, you probably have this.) I
+ haven't tested this one, let me know if it works.
+ */
+#undef HAVE_HPUX_PASSWD
+
+/* Define this if you are on a system that supports the VT_LOCKSWITCH and
+ VT_UNLOCKSWITCH ioctls. If this is defined, then when the screen is
+ locked, switching to another virtual terminal will also be prevented.
+ That is, the whole console will be locked, rather than just the VT on
+ which X is running.
+ */
+#define HAVE_VT_LOCKSWITCH 1
+
+
+/* *************************************************************************
+ OTHER C ENVIRONMENT JUNK
+ ************************************************************************* */
+
+/* Define this to void* if you're using X11R4 or earlier. */
+#undef XPointer
+
+/* Define if you have the nice function. */
+#undef HAVE_NICE
+
+/* Define if you have the setpriority function. */
+#undef HAVE_SETPRIORITY
+
+/* Define to empty if the keyword does not work. */
+#undef const
+
+/* Define if you have <sys/wait.h> that is POSIX.1 compatible. */
+#undef HAVE_SYS_WAIT_H
+
+/* Define as __inline if that's what the C compiler calls it. */
+#undef inline
+
+/* Define to `int' if <sys/types.h> doesn't define. */
+#undef mode_t
+
+/* Define to `int' if <sys/types.h> doesn't define. */
+#undef pid_t
+
+/* Define as the return type of signal handlers (int or void). */
+#define RETSIGTYPE void
+
+/* Define to `unsigned' if <sys/types.h> doesn't define. */
+#undef size_t
+
+/* Define if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define if you can safely include both <sys/time.h> and <time.h>. */
+#undef TIME_WITH_SYS_TIME
+
+/* Define if you have the gettimeofday function. */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define if gettimeofday requires two arguments. */
+#undef GETTIMEOFDAY_TWO_ARGS
+
+/* Define if you have the putenv function. */
+#undef HAVE_PUTENV
+
+/* Define if you have the select function. */
+#undef HAVE_SELECT
+
+/* Define if you have the getcwd function. */
+#undef HAVE_GETCWD
+
+/* Define if you have the getcwd function. */
+#undef HAVE_GETWD
+
+/* Define if you have the uname function. */
+#undef HAVE_UNAME
+#if (__VMS_VER >= 70000000)
+# define HAVE_UNAME 1
+#endif
+
+/* Define if you have the fcntl function. */
+#undef HAVE_FCNTL
+
+/* Define if you have the sigaction function. */
+#undef HAVE_SIGACTION
+
+/* Define if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define if you have the <crypt.h> header file. */
+#undef HAVE_CRYPT_H
+
+/* Define to use sigaction() instead of signal() for SIGCHLD-related activity.
+ This is necessary at least on SCO OpenServer 5, due to a Unix kernel bug.
+ */
+#undef USE_SIGACTION
diff --git a/config.h.in b/config.h.in
new file mode 100644
index 0000000..6294bee
--- /dev/null
+++ b/config.h.in
@@ -0,0 +1,475 @@
+/* config.h.in. Generated from configure.in by autoheader. */
+
+
+/* config.h.in --- xscreensaver, Copyright (c) 1991-2014 Jamie Zawinski.
+ *
+ * The best way to set these parameters is by running the included `configure'
+ * script. That examines your system, and generates `config.h' from
+ * `config.h.in'.
+ *
+ * If something goes very wrong, you can edit `config.h' directly, but beware
+ * that your changes will be lost if you ever run `configure' again.
+ */
+
+
+/* Define this to allow the root password to unlock the screen. */
+#undef ALLOW_ROOT_PASSWD
+
+/* always defined to indicate that i18n is enabled */
+#undef ENABLE_NLS
+
+/* Some screenhacks like to run an external program to generate random pieces
+ of text; set this to the one you like. Note that this is just the default;
+ X resources can be used to override it. */
+#undef FORTUNE_PROGRAM
+
+/* This is the name of the gettext package to use. */
+#undef GETTEXT_PACKAGE
+
+/* Define this if gettimeofday() takes two arguments. */
+#undef GETTIMEOFDAY_TWO_ARGS
+
+/* Define this if your system is Solaris with ``adjunct'' passwords (this is
+ the version where one gets at the passwords with getpwanam() instead of
+ getpwnam().) I haven't tested this one, let me know if it works. */
+#undef HAVE_ADJUNCT_PASSWD
+
+/* Define to 1 if you have the `bind_textdomain_codeset' function. */
+#undef HAVE_BIND_TEXTDOMAIN_CODESET
+
+/* Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the
+ CoreFoundation framework. */
+#undef HAVE_CFLOCALECOPYCURRENT
+
+/* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in
+ the CoreFoundation framework. */
+#undef HAVE_CFPREFERENCESCOPYAPPVALUE
+
+/* Define this if you have Gnome and want to build support for the
+ xscreensaver control panel in the Gnome Control Center (gnomecc). (This is
+ needed only with Gtk 1.x.) */
+#undef HAVE_CRAPPLET
+
+/* Define this if HAVE_CRAPPLET is defined, and the function
+ capplet_widget_changes_are_immediate() is available. */
+#undef HAVE_CRAPPLET_IMMEDIATE
+
+/* Define to 1 if you have the <crypt.h> header file. */
+#undef HAVE_CRYPT_H
+
+/* Define to 1 if you have the `dcgettext' function. */
+#undef HAVE_DCGETTEXT
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_DIRENT_H
+
+/* Define this if you have the X Double Buffer Extension. */
+#undef HAVE_DOUBLE_BUFFER_EXTENSION
+
+/* Define this if you have the XDPMS extension. This is standard on
+ sufficiently-recent XFree86 systems, and possibly elsewhere. (It's
+ available if the file /usr/include/X11/extensions/dpms.h exists.) */
+#undef HAVE_DPMS_EXTENSION
+
+/* Define this if your system is Digital or SCO Unix with so-called ``Enhanced
+ Security'', that is, the passwords live in /tcb/files/auth/<x>/<xyz>
+ instead of in /etc/passwd, and one reads them with getprpwnam() instead of
+ getpwnam(). */
+#undef HAVE_ENHANCED_PASSWD
+
+/* Define to 1 if you have the `fcntl' function. */
+#undef HAVE_FCNTL
+
+/* Define this if you have the 'forkpty' function: This allows 'phosphor' and
+ 'apple2' to run curses-based programs, or be used as terminal windows. */
+#undef HAVE_FORKPTY
+
+/* Define this if you have the GDK_Pixbuf library installed. Some of the demos
+ can make use of this if it is available. */
+#undef HAVE_GDK_PIXBUF
+
+/* Define this if you have the gdk_pixbuf_apply_embedded_orientation function
+ (gdk-pixbuf 2.12). */
+#undef HAVE_GDK_PIXBUF_APPLY_EMBEDDED_ORIENTATION
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+#undef HAVE_GETADDRINFO
+
+/* Define to 1 if you have the `getcwd' function. */
+#undef HAVE_GETCWD
+
+/* Define this if you have the getifaddrs() function. */
+#undef HAVE_GETIFADDRS
+
+/* Define if the GNU gettext() function is already present or preinstalled. */
+#undef HAVE_GETTEXT
+
+/* Define this if you have the gettimeofday function. */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define to 1 if you have the `getwd' function. */
+#undef HAVE_GETWD
+
+/* Define this if you have OpenGL. Some of the demos require it, so if you
+ don't have it, then those particular demos won't be built. (This won't
+ affect the screen saver as a whole.) */
+#undef HAVE_GL
+
+/* Define this if your version of OpenGL has the glBindTexture() routine. This
+ is the case for OpenGL 1.1, but not for OpenGL 1.0. */
+#undef HAVE_GLBINDTEXTURE
+
+/* Define this if you have the -lgle and -lmatrix libraries (GL extrusion.) */
+#undef HAVE_GLE
+
+/* Define this if you have the -lgle from GLE version 3 */
+#undef HAVE_GLE3
+
+/* Define this if you have Gtk (any version.) */
+#undef HAVE_GTK
+
+/* Define this if you have Gtk 2.x. */
+#undef HAVE_GTK2
+
+/* Define this if you are running HPUX with so-called ``Secure Passwords'' (if
+ you have /usr/include/hpsecurity.h, you probably have this.) I haven't
+ tested this one, let me know if it works. */
+#undef HAVE_HPUX_PASSWD
+
+/* Define this if you do pings with a `struct icmp' and an `icmp_id' slot. */
+#undef HAVE_ICMP
+
+/* Define this if you do pings with a `struct icmphdr' and an `un.echo.id'
+ slot. */
+#undef HAVE_ICMPHDR
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define this if you have the Independent JPEG Group's JPEG library
+ installed. Some of the demos can make use of this if it is available. */
+#undef HAVE_JPEGLIB
+
+/* Define this to target the OpenGL ES 1.x API instead of OpenGL 1.3. */
+#undef HAVE_JWZGLES
+
+/* Define this if you want to use Kerberos authentication to lock/unlock the
+ screen instead of your local password. This currently uses Kerberos V4, but
+ a V5 server with V4 compatibility will work. WARNING: DO NOT USE AFS
+ string-to-key passwords with this option. This option currently *only*
+ works with standard Kerberos des_string_to_key. If your password is an AFS
+ password and not a kerberos password, it will not authenticate properly.
+ See the comments in driver/kpasswd.c for more information if you need it.
+ */
+#undef HAVE_KERBEROS
+
+/* Define this if you have Kerberos 5, meaning we need to use the Kerberos 4
+ compatibility layer. */
+#undef HAVE_KERBEROS5
+
+/* Define if your <locale.h> file defines LC_MESSAGES. */
+#undef HAVE_LC_MESSAGES
+
+/* Define this if the Portable Network Graphics library is installed. It is
+ basically required, but many things will more-or-less limp along without
+ it. */
+#undef HAVE_LIBPNG
+
+/* Define to 1 if you have the <locale.h> header file. */
+#undef HAVE_LOCALE_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define this if you have OpenGL, but it's the MesaGL variant. (The libraries
+ have different names.) (HAVE_GL should be defined too.) */
+#undef HAVE_MESA_GL
+
+/* Define this if you have Motif. */
+#undef HAVE_MOTIF
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+#undef HAVE_NDIR_H
+
+/* Define to 1 if you have the `nice' function. */
+#undef HAVE_NICE
+
+/* Define this if you have the XML library headers in their old,
+ non-namespaced location (you lack the gnome-xml/libxml symlink) */
+#undef HAVE_OLD_XML_HEADERS
+
+/* Define this if you want to use PAM (Pluggable Authentication Modules) to
+ lock/unlock the screen, instead of standard /etc/passwd authentication. */
+#undef HAVE_PAM
+
+/* Define this if you have pam_fail_delay function. see driver/passwd-pam.c.
+ */
+#undef HAVE_PAM_FAIL_DELAY
+
+/* Define this if you have a Linux-like /proc/interrupts file which can be
+ examined to determine when keyboard activity has occurred. */
+#undef HAVE_PROC_INTERRUPTS
+
+/* Define this if your system supports POSIX threads. */
+#undef HAVE_PTHREAD
+
+/* Have PTHREAD_PRIO_INHERIT. */
+#undef HAVE_PTHREAD_PRIO_INHERIT
+
+/* Define to 1 if you have the <pty.h> header file. */
+#undef HAVE_PTY_H
+
+/* Define to 1 if you have the `putenv' function. */
+#undef HAVE_PUTENV
+
+/* Define this if you have the Resize and Rotate extension. This is standard
+ on sufficiently-recent XFree86 systems, and possibly elsewhere. (It's
+ available if the file /usr/include/X11/extensions/Xrandr.h exists.) */
+#undef HAVE_RANDR
+
+/* Define this if the RANDR library is version 1.2 or newer. */
+#undef HAVE_RANDR_12
+
+/* Define this if you have the XReadDisplay extension (I think this is an
+ SGI-only thing; it's in <X11/extensions/readdisplay.h>.) A few of the
+ screenhacks will take advantage of this if it's available. */
+#undef HAVE_READ_DISPLAY_EXTENSION
+
+/* Define to 1 if you have the `realpath' function. */
+#undef HAVE_REALPATH
+
+/* Define this to enable recording of videos. */
+#undef HAVE_RECORD_ANIM
+
+/* Define to 1 if you have the `sbrk' function. */
+#undef HAVE_SBRK
+
+/* Define to 1 if you have the `select' function. */
+#undef HAVE_SELECT
+
+/* Define to 1 if you have the `setlocale' function. */
+#undef HAVE_SETLOCALE
+
+/* Define to 1 if you have the `setpriority' function. */
+#undef HAVE_SETPRIORITY
+
+/* Define to 1 if you have the `setrlimit' function. */
+#undef HAVE_SETRLIMIT
+
+/* Define this if your system uses 'shadow' passwords, that is, the passwords
+ live in /etc/shadow instead of /etc/passwd, and one reads them with
+ getspnam() instead of getpwnam(). (Note that SCO systems do some random
+ other thing; others might as well. See the ifdefs in driver/passwd-pwent.c
+ if you're having trouble related to reading passwords.) */
+#undef HAVE_SHADOW_PASSWD
+
+/* Define to 1 if you have the `sigaction' function. */
+#undef HAVE_SIGACTION
+
+/* Define to 1 if you have the `sigtimedwait' function. */
+#undef HAVE_SIGTIMEDWAIT
+
+/* Define to 1 if you have the `sqrtf' function. */
+#undef HAVE_SQRTF
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if `sa_len' is a member of `struct sockaddr'. */
+#undef HAVE_STRUCT_SOCKADDR_SA_LEN
+
+/* Define to 1 if you have the `syslog' function. */
+#undef HAVE_SYSLOG
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_SYS_DIR_H
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_SYS_NDIR_H
+
+/* Define to 1 if you have the <sys/select.h> header file. */
+#undef HAVE_SYS_SELECT_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/termios.h> header file. */
+#undef HAVE_SYS_TERMIOS_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
+#undef HAVE_SYS_WAIT_H
+
+/* Define to 1 if you have the `uname' function. */
+#undef HAVE_UNAME
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the <util.h> header file. */
+#undef HAVE_UTIL_H
+
+/* Define this if you have the XF86MiscSetGrabKeysState function (which allows
+ the Ctrl-Alt-KP_star and Ctrl-Alt-KP_slash key sequences to be temporarily
+ disabled. Sadly, it doesn't affect Ctrl-Alt-BS or Ctrl-Alt-F1.) */
+#undef HAVE_XF86MISCSETGRABKEYSSTATE
+
+/* Define this if you have the functions XF86VidModeGetModeLine() and
+ XF86VidModeGetViewPort(), in support of virtual desktops where the X
+ server's root window is bigger than the actual screen. This is an XFree86
+ thing, and probably doesn't exist elsewhere. (It's available if the file
+ /usr/include/X11/extensions/xf86vmode.h exists.) */
+#undef HAVE_XF86VMODE
+
+/* Define this if you have the functions XF86VidModeGetGamma() and
+ XF86VidModeSetGamma(), which allow clients to change the gamma response of
+ the monitor. This is an XFree86 4.0.x thing, and probably doesn't exist
+ elsewhere. (It's available if the file
+ /usr/include/X11/extensions/xf86vmode.h exists and has stuff about gamma in
+ it.) */
+#undef HAVE_XF86VMODE_GAMMA
+
+/* Define this if you have the functions XF86VidModeGetGammaRamp() and
+ XF86VidModeSetGammaRamp(), which provide finer-grained control than
+ XF86VidMode[GS]etGamma(). These appeared in XFree86 4.1.0. */
+#undef HAVE_XF86VMODE_GAMMA_RAMP
+
+/* Define this if you have libXft2. */
+#undef HAVE_XFT
+
+/* Define this if you have the XHPDisableReset function (an HP only thing
+ which allows the Ctrl-Sh-Reset key sequence to be temporarily disabled.) */
+#undef HAVE_XHPDISABLERESET
+
+/* Define this if you have the Xinerama extension. This is standard on
+ sufficiently-recent XFree86 systems, and possibly elsewhere. (It's
+ available if the file /usr/include/X11/extensions/Xinerama.h exists.) */
+#undef HAVE_XINERAMA
+
+/* Define this if you have the Xinput extension. This is standard since X11R5,
+ and is thus almost everywhere. (It's available if the file
+ /usr/include/X11/extensions/XInput.h exists.) */
+#undef HAVE_XINPUT
+
+/* Define this if you have the XmComboBox Motif widget (Motif 2.0.) */
+#undef HAVE_XMCOMBOBOX
+
+/* Define this if you have the XML library. */
+#undef HAVE_XML
+
+/* Define this if you have the Xmu library. This is standard part of X, and if
+ your vendor doesn't ship it, you should report that as a bug. */
+#undef HAVE_XMU
+
+/* Define this if you have the X Shared Memory Extension. */
+#undef HAVE_XSHM_EXTENSION
+
+/* Define this if you have the function Xutf8DrawString(). */
+#undef HAVE_XUTF8DRAWSTRING
+
+/* Define this to remove the option of locking the screen at all. */
+#undef NO_LOCKING
+
+/* This is the same as GETTEXT_PACKAGE, but for the glade generated code. */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Whether PAM should check the result of account modules when authenticating.
+ Only do this if you have account configured properly on your system. */
+#undef PAM_CHECK_ACCOUNT_TYPE
+
+/* If PAM is being used, this is the name of the PAM service that xscreensaver
+ will authenticate as. The default is "xscreensaver", which means that the
+ PAM library will look for an "xscreensaver" line in /etc/pam.conf, or (on
+ recent Linux systems) will look for a file called /etc/pam.d/xscreensaver.
+ Some systems might already have a PAM installation that is configured for
+ xlock, so setting this to "xlock" would also work in that case. */
+#undef PAM_SERVICE_NAME
+
+/* Define if you have PAM and pam_strerror() requires two arguments. */
+#undef PAM_STRERROR_TWO_ARGS
+
+/* Set the name of the password helper program, if any */
+#undef PASSWD_HELPER_PROGRAM
+
+/* Define to necessary symbol if this constant uses a non-standard name on
+ your system. */
+#undef PTHREAD_CREATE_JOINABLE
+
+/* Define as the return type of signal handlers (`int' or `void'). */
+#undef RETSIGTYPE
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#undef TIME_WITH_SYS_TIME
+
+/* Define this to void* if you're using X11R4 or earlier. */
+#undef XPointer
+
+/* Define to 1 if the X Window System is missing or not being used. */
+#undef X_DISPLAY_MISSING
+
+/* Enable large inode numbers on Mac OS X 10.5. */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+ calls it, or to nothing if 'inline' is not supported under any name. */
+#ifndef __cplusplus
+#undef inline
+#endif
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef mode_t
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef pid_t
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#undef size_t
+
+/* Define to `int' if <sys/types.h> or <sys/socket.h> does not define. */
+#undef socklen_t
diff --git a/config.sub b/config.sub
new file mode 100644
index 0000000..9ccf09a
--- /dev/null
+++ b/config.sub
@@ -0,0 +1,1801 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright 1992-2018 Free Software Foundation, Inc.
+
+timestamp='2018-03-08'
+
+# This file 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 3 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, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program. This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+
+
+# Please send patches to <config-patches@gnu.org>.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
+
+Canonicalize a configuration name.
+
+Options:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright 1992-2018 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help"
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo "$1"
+ exit ;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
+ kopensolaris*-gnu* | cloudabi*-eabi* | \
+ storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ android-linux)
+ os=-linux-android
+ basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+ ;;
+ *)
+ basic_machine=`echo "$1" | sed 's/-[^-]*$//'`
+ if [ "$basic_machine" != "$1" ]
+ then os=`echo "$1" | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple | -axis | -knuth | -cray | -microblaze*)
+ os=
+ basic_machine=$1
+ ;;
+ -bluegene*)
+ os=-cnk
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+ ;;
+ -scout)
+ ;;
+ -wrs)
+ os=-vxworks
+ basic_machine=$1
+ ;;
+ -chorusos*)
+ os=-chorusos
+ basic_machine=$1
+ ;;
+ -chorusrdb)
+ os=-chorusrdb
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco6)
+ os=-sco5v6
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*178)
+ os=-lynxos178
+ ;;
+ -lynx*5)
+ os=-lynxos5
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
+ | aarch64 | aarch64_be \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arceb \
+ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
+ | avr | avr32 \
+ | ba \
+ | be32 | be64 \
+ | bfin \
+ | c4x | c8051 | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+ | e2k | epiphany \
+ | fido | fr30 | frv | ft32 \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | hexagon \
+ | i370 | i860 | i960 | ia16 | ia64 \
+ | ip2k | iq2000 \
+ | k1om \
+ | le32 | le64 \
+ | lm32 \
+ | m32c | m32r | m32rle | m68000 | m68k | m88k \
+ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64octeon | mips64octeonel \
+ | mips64orion | mips64orionel \
+ | mips64r5900 | mips64r5900el \
+ | mips64vr | mips64vrel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa32r6 | mipsisa32r6el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64r6 | mipsisa64r6el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipsr5900 | mipsr5900el \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | moxie \
+ | mt \
+ | msp430 \
+ | nds32 | nds32le | nds32be \
+ | nios | nios2 | nios2eb | nios2el \
+ | ns16k | ns32k \
+ | open8 | or1k | or1knd | or32 \
+ | pdp10 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle \
+ | pru \
+ | pyramid \
+ | riscv32 | riscv64 \
+ | rl78 | rx \
+ | score \
+ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+ | spu \
+ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+ | ubicom32 \
+ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+ | visium \
+ | wasm32 \
+ | x86 | xc16x | xstormy16 | xtensa \
+ | z8k | z80)
+ basic_machine=$basic_machine-unknown
+ ;;
+ c54x)
+ basic_machine=tic54x-unknown
+ ;;
+ c55x)
+ basic_machine=tic55x-unknown
+ ;;
+ c6x)
+ basic_machine=tic6x-unknown
+ ;;
+ leon|leon[3-9])
+ basic_machine=sparc-$basic_machine
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65)
+ ;;
+ ms1)
+ basic_machine=mt-unknown
+ ;;
+
+ strongarm | thumb | xscale)
+ basic_machine=arm-unknown
+ ;;
+ xgate)
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ xscaleeb)
+ basic_machine=armeb-unknown
+ ;;
+
+ xscaleel)
+ basic_machine=armel-unknown
+ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
+ | aarch64-* | aarch64_be-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* | avr32-* \
+ | ba-* \
+ | be32-* | be64-* \
+ | bfin-* | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* \
+ | c8051-* | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | e2k-* | elxsi-* \
+ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | hexagon-* \
+ | i*86-* | i860-* | i960-* | ia16-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | k1om-* \
+ | le32-* | le64-* \
+ | lm32-* \
+ | m32c-* | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+ | microblaze-* | microblazeel-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64octeon-* | mips64octeonel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64r5900-* | mips64r5900el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa32r6-* | mipsisa32r6el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64r6-* | mipsisa64r6el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipsr5900-* | mipsr5900el-* \
+ | mipstx39-* | mipstx39el-* \
+ | mmix-* \
+ | mt-* \
+ | msp430-* \
+ | nds32-* | nds32le-* | nds32be-* \
+ | nios-* | nios2-* | nios2eb-* | nios2el-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+ | open8-* \
+ | or1k*-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+ | pru-* \
+ | pyramid-* \
+ | riscv32-* | riscv64-* \
+ | rl78-* | romp-* | rs6000-* | rx-* \
+ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+ | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
+ | tahoe-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tile*-* \
+ | tron-* \
+ | ubicom32-* \
+ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+ | vax-* \
+ | visium-* \
+ | wasm32-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xc16x-* | xps100-* \
+ | xstormy16-* | xtensa*-* \
+ | ymp-* \
+ | z8k-* | z80-*)
+ ;;
+ # Recognize the basic CPU types without company name, with glob match.
+ xtensa*)
+ basic_machine=$basic_machine-unknown
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 386bsd)
+ basic_machine=i386-pc
+ os=-bsd
+ ;;
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amd64)
+ basic_machine=x86_64-pc
+ ;;
+ amd64-*)
+ basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-unknown
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aros)
+ basic_machine=i386-pc
+ os=-aros
+ ;;
+ asmjs)
+ basic_machine=asmjs-unknown
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ blackfin)
+ basic_machine=bfin-unknown
+ os=-linux
+ ;;
+ blackfin-*)
+ basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ bluegene*)
+ basic_machine=powerpc-ibm
+ os=-cnk
+ ;;
+ c54x-*)
+ basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ c55x-*)
+ basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ c6x-*)
+ basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ cegcc)
+ basic_machine=arm-unknown
+ os=-cegcc
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | j90)
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+ craynv)
+ basic_machine=craynv-cray
+ os=-unicosmp
+ ;;
+ cr16 | cr16-*)
+ basic_machine=cr16-unknown
+ os=-elf
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ crisv32 | crisv32-* | etraxfs*)
+ basic_machine=crisv32-axis
+ ;;
+ cris | cris-* | etrax*)
+ basic_machine=cris-axis
+ ;;
+ crx)
+ basic_machine=crx-unknown
+ os=-elf
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ decsystem10* | dec10*)
+ basic_machine=pdp10-dec
+ os=-tops10
+ ;;
+ decsystem20* | dec20*)
+ basic_machine=pdp10-dec
+ os=-tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ dicos)
+ basic_machine=i686-pc
+ os=-dicos
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ os=-msdosdjgpp
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2*)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ e500v[12])
+ basic_machine=powerpc-unknown
+ os=$os"spe"
+ ;;
+ e500v[12]-*)
+ basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ os=$os"spe"
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ os=-ose
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ os=-go32
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+ i*86v32)
+ basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i*86v4*)
+ basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i*86v)
+ basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i*86sol2)
+ basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ vsta)
+ basic_machine=i386-unknown
+ os=-vsta
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ leon-*|leon[3-9]-*)
+ basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'`
+ ;;
+ m68knommu)
+ basic_machine=m68k-unknown
+ os=-linux
+ ;;
+ m68knommu-*)
+ basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ microblaze*)
+ basic_machine=microblaze-xilinx
+ ;;
+ mingw64)
+ basic_machine=x86_64-pc
+ os=-mingw64
+ ;;
+ mingw32)
+ basic_machine=i686-pc
+ os=-mingw32
+ ;;
+ mingw32ce)
+ basic_machine=arm-unknown
+ os=-mingw32ce
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+ mips3*-*)
+ basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
+ moxiebox)
+ basic_machine=moxie-unknown
+ os=-moxiebox
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ os=-msdos
+ ;;
+ ms1-*)
+ basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'`
+ ;;
+ msys)
+ basic_machine=i686-pc
+ os=-msys
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ nacl)
+ basic_machine=le32-unknown
+ os=-nacl
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ os=-linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ os=-sysv
+ ;;
+ next | m*-next)
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ os=-mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ os=-nonstopux
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ neo-tandem)
+ basic_machine=neo-tandem
+ ;;
+ nse-tandem)
+ basic_machine=nse-tandem
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+ ;;
+ nsv-tandem)
+ basic_machine=nsv-tandem
+ ;;
+ nsx-tandem)
+ basic_machine=nsx-tandem
+ ;;
+ op50n-* | op60c-*)
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ openrisc | openrisc-*)
+ basic_machine=or32-unknown
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ os=-os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ os=-os68k
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ parisc)
+ basic_machine=hppa-unknown
+ os=-linux
+ ;;
+ parisc-*)
+ basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pc98)
+ basic_machine=i386-pc
+ ;;
+ pc98-*)
+ basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | 6x86 | athlon | athlon_*)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2 | pentiumiii | pentium3)
+ basic_machine=i686-pc
+ ;;
+ pentium4)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ pentium4-*)
+ basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=power-ibm
+ ;;
+ ppc | ppcbe) basic_machine=powerpc-unknown
+ ;;
+ ppc-* | ppcbe-*)
+ basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+ ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little)
+ basic_machine=powerpc64le-unknown
+ ;;
+ ppc64le-* | powerpc64little-*)
+ basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ os=-pw32
+ ;;
+ rdos | rdos64)
+ basic_machine=x86_64-pc
+ os=-rdos
+ ;;
+ rdos32)
+ basic_machine=i386-pc
+ os=-rdos
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ s390 | s390-*)
+ basic_machine=s390-ibm
+ ;;
+ s390x | s390x-*)
+ basic_machine=s390x-ibm
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sb1)
+ basic_machine=mipsisa64sb1-unknown
+ ;;
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
+ sde)
+ basic_machine=mipsisa32-sde
+ os=-elf
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh5el)
+ basic_machine=sh5le-unknown
+ ;;
+ simso-wrs)
+ basic_machine=sparclite-wrs
+ os=-vxworks
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
+ strongarm-* | thumb-*)
+ basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ os=-unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ os=-unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ os=-unicos
+ ;;
+ tile*)
+ basic_machine=$basic_machine-unknown
+ os=-linux-gnu
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ os=-tops20
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ os=-tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ os=-none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ w65*)
+ basic_machine=w65-wdc
+ os=-none
+ ;;
+ w89k-*)
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
+ x64)
+ basic_machine=x86_64-pc
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ os=-mingw32
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ xscale-* | xscalee[bl]-*)
+ basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'`
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ basic_machine=hppa1.1-winbond
+ ;;
+ op50n)
+ basic_machine=hppa1.1-oki
+ ;;
+ op60c)
+ basic_machine=hppa1.1-oki
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ mmix)
+ basic_machine=mmix-knuth
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw)
+ basic_machine=powerpc-apple
+ ;;
+ *-unknown)
+ # Make sure to match an already-canonicalized machine name.
+ ;;
+ *)
+ echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases that might get confused
+ # with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -auroraux)
+ os=-auroraux
+ ;;
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # es1800 is here to avoid being matched by es* (a different OS)
+ -es1800*)
+ os=-ose
+ ;;
+ # Now accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST end in a * to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+ | -sym* | -kopensolaris* | -plan9* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* | -aros* | -cloudabi* | -sortix* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \
+ | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* | -hcos* \
+ | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \
+ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+ | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -windiss* \
+ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
+ | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \
+ | -midnightbsd*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+ case $basic_machine in
+ x86-* | i*86-*)
+ ;;
+ *)
+ os=-nto$os
+ ;;
+ esac
+ ;;
+ -nto-qnx*)
+ ;;
+ -nto*)
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ ;;
+ -sim | -xray | -os68k* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+ os=`echo "$os" | sed -e 's|mac|macos|'`
+ ;;
+ -linux-dietlibc)
+ os=-linux-dietlibc
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -opened*)
+ os=-openedition
+ ;;
+ -os400*)
+ os=-os400
+ ;;
+ -wince*)
+ os=-wince
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -atheos*)
+ os=-atheos
+ ;;
+ -syllable*)
+ os=-syllable
+ ;;
+ -386bsd)
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -nova*)
+ os=-rtmk-nova
+ ;;
+ -ns2)
+ os=-nextstep2
+ ;;
+ -nsk*)
+ os=-nsk
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -tpf*)
+ os=-tpf
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -ose*)
+ os=-ose
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ os=-mint
+ ;;
+ -zvmoe)
+ os=-zvmoe
+ ;;
+ -dicos*)
+ os=-dicos
+ ;;
+ -pikeos*)
+ # Until real need of OS specific support for
+ # particular features comes up, bare metal
+ # configurations are quite functional.
+ case $basic_machine in
+ arm*)
+ os=-eabi
+ ;;
+ *)
+ os=-elf
+ ;;
+ esac
+ ;;
+ -nacl*)
+ ;;
+ -ios)
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ score-*)
+ os=-elf
+ ;;
+ spu-*)
+ os=-elf
+ ;;
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ c8051-*)
+ os=-elf
+ ;;
+ hexagon-*)
+ os=-elf
+ ;;
+ tic54x-*)
+ os=-coff
+ ;;
+ tic55x-*)
+ os=-coff
+ ;;
+ tic6x-*)
+ os=-coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=-tops20
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mep-*)
+ os=-elf
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ os=-elf
+ ;;
+ or32-*)
+ os=-coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ pru-*)
+ os=-elf
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-knuth)
+ os=-mmixware
+ ;;
+ *-wec)
+ os=-proelf
+ ;;
+ *-winbond)
+ os=-proelf
+ ;;
+ *-oki)
+ os=-proelf
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next)
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=-uxpv
+ ;;
+ *-rom68k)
+ os=-coff
+ ;;
+ *-*bug)
+ os=-coff
+ ;;
+ *-apple)
+ os=-macos
+ ;;
+ *-atari*)
+ os=-mint
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -cnk*|-aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -mpeix*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs* | -opened*)
+ vendor=ibm
+ ;;
+ -os400*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -tpf*)
+ vendor=ibm
+ ;;
+ -vxsim* | -vxworks* | -windiss*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*)
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*)
+ vendor=apple
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ vendor=atari
+ ;;
+ -vos*)
+ vendor=stratus
+ ;;
+ esac
+ basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo "$basic_machine$os"
+exit
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/configure b/configure
new file mode 100755
index 0000000..2ac1b1b
--- /dev/null
+++ b/configure
@@ -0,0 +1,18009 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69.
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else
+ case \`(set -o) 2>/dev/null\` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+ if (eval "$as_required") 2>/dev/null; then :
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ as_found=:
+ case $as_dir in #(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir/$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+ if test "x$CONFIG_SHELL" != x; then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno; then :
+ $as_echo "$0: This script requires a shell more modern than all"
+ $as_echo "$0: the shells that I found on your system."
+ if test x${ZSH_VERSION+set} = xset ; then
+ $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+PACKAGE_URL=
+
+ac_unique_file="driver/subprocs.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='LTLIBOBJS
+LIBOBJS
+DEPEND_DEFINES
+DEPEND_FLAGS
+DEPEND
+APPDEFAULTS
+ANIM_LIBS
+ANIM_OBJS
+GTK_EXTRA_OBJS
+HACK_CONF_DIR
+PO_DATADIR
+GTK_DATADIR
+HACKDIR_FULL
+HACKDIR
+NOGNOME
+GNOME22
+GNOME24
+JWZGLES_OBJS
+GLE_KLUDGE
+GLE_EXES
+GL_KLUDGE
+GL_MEN
+GL_UTIL_EXES
+SUID_EXES
+RETIRED_GL_EXES
+GL_EXES
+JPEG_EXES
+LOCK_OBJS
+LOCK_SRCS
+SAVER_GL_LIBS
+SAVER_GL_OBJS
+SAVER_GL_SRCS
+XFT_LIBS
+XFT_OBJS
+XFT_SRCS
+XMU_LIBS
+XMU_OBJS
+XMU_SRCS
+PASSWD_OBJS
+PASSWD_SRCS
+MEN_OSX
+SCRIPTS_OSX
+EXES_OSX
+OBJCC
+COMMENT_DEMO_GLADE2_GTK_2_22_TAIL
+COMMENT_DEMO_GLADE2_GTK_2_22_HEAD
+WITH_BROWSER
+DEFAULT_TEXT_FILE
+DEFAULT_IMAGE_DIRECTORY
+DEFAULT_IMAGES_P
+NEW_LOGIN_COMMAND_P
+NEW_LOGIN_COMMAND
+COMMENT_PAM_CHECK_ACCOUNT
+HAVE_PAM_FAIL_DELAY
+INSTALL_PAM
+NEED_SETUID
+INSTALL_DIRS
+SETUID_HACKS
+INSTALL_SETUID
+PASSWD_LIBS
+XINERAMA_LIBS
+XDPMS_LIBS
+GLE_LIBS
+GL_LIBS
+PTY_LIBS
+HACK_LIBS
+JPEG_LIBS
+PNG_LIBS
+XML_LIBS
+GTK_LIBS
+MOTIF_LIBS
+SAVER_LIBS
+ALL_DEMO_PROGRAMS
+PREFERRED_DEMO_PROGRAM
+INCLUDES
+gnome_url_show_program
+gnome_open_program
+pkg_config
+login_manager_tmp
+MKINSTALLDIRS
+POSUB
+POFILES
+PO_IN_DATADIR_FALSE
+PO_IN_DATADIR_TRUE
+INTLLIBS
+INSTOBJEXT
+GMOFILES
+DATADIRNAME
+CATOBJEXT
+CATALOGS
+MSGFMT_OPTS
+INTL_MACOSX_LIBS
+GETTEXT_PACKAGE
+ALL_LINGUAS
+GMSGFMT
+MSGFMT
+MSGMERGE
+XGETTEXT
+INTLTOOL_POLICY_RULE
+INTLTOOL_SERVICE_RULE
+INTLTOOL_THEME_RULE
+INTLTOOL_SCHEMAS_RULE
+INTLTOOL_CAVES_RULE
+INTLTOOL_XML_NOMERGE_RULE
+INTLTOOL_XML_RULE
+INTLTOOL_KBD_RULE
+INTLTOOL_XAM_RULE
+INTLTOOL_UI_RULE
+INTLTOOL_SOUNDLIST_RULE
+INTLTOOL_SHEET_RULE
+INTLTOOL_SERVER_RULE
+INTLTOOL_PONG_RULE
+INTLTOOL_OAF_RULE
+INTLTOOL_PROP_RULE
+INTLTOOL_KEYS_RULE
+INTLTOOL_DIRECTORY_RULE
+INTLTOOL_DESKTOP_RULE
+intltool__v_merge_options_0
+intltool__v_merge_options_
+INTLTOOL_V_MERGE_OPTIONS
+INTLTOOL__v_MERGE_0
+INTLTOOL__v_MERGE_
+INTLTOOL_V_MERGE
+AM_DEFAULT_VERBOSITY
+INTLTOOL_EXTRACT
+INTLTOOL_MERGE
+INTLTOOL_UPDATE
+USE_NLS
+X_EXTRA_LIBS
+X_LIBS
+X_PRE_LIBS
+X_CFLAGS
+XMKMF
+PERL
+EGREP
+GREP
+SET_MAKE
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+CPP
+PTHREAD_CFLAGS
+PTHREAD_LIBS
+PTHREAD_CC
+ax_pthread_config
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+with_x_app_defaults
+with_pthread
+enable_largefile
+with_x
+enable_nls
+with_hackdir
+enable_subdir
+with_configdir
+with_dpms_ext
+with_xinerama_ext
+with_xinput_ext
+with_xf86vmode_ext
+with_xf86gamma_ext
+with_randr_ext
+with_proc_interrupts
+enable_locking
+enable_root_passwd
+with_pam
+with_pam_service_name
+enable_pam_check_account_type
+with_kerberos
+with_shadow
+with_passwd_helper
+with_login_manager
+with_gtk
+with_motif
+with_gl
+with_gle
+with_gles
+with_png
+with_pixbuf
+with_jpeg
+with_xft
+with_xshm_ext
+with_xdbe_ext
+with_readdisplay
+with_image_directory
+with_text_file
+with_browser
+with_setuid_hacks
+with_record_animation
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP
+XMKMF'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+
+Configuration:
+
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+
+X features:
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-option-checking ignore unrecognized --enable/--with options
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --disable-largefile omit support for large files
+ --disable-nls do not use Native Language Support
+
+Screen locking options:
+ --enable-locking Compile in support for locking the display.
+ --disable-locking Do not allow locking at all.
+
+ --enable-root-passwd Allow root passwd to unlock screen.
+ --disable-root-passwd Do not allow that.
+ --enable-pam-check-account-type
+ Whether PAM should check the result of account
+ modules when authenticating. Only do this if you
+ have account configured properly on your system.
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+
+ --with-pthread Enables POSIX threads, for SMP support.
+
+Installation options:
+ --with-hackdir=DIR Where to install the hundreds of demo executables.
+ Default: `PREFIX/libexec/xscreensaver/'
+ --with-configdir=DIR Where to install the data files that describe each
+ of the display modes to the GUI.
+ Default: `PREFIX/share/xscreensaver/config/'
+ --with-x-app-defaults=DIR
+ Where to install xscreensaver configuration file.
+
+ --with-dpms-ext Include support for the DPMS extension.
+ --with-xinerama-ext Include support for the XINERAMA extension.
+ --with-xinput-ext Include support for the XInput extension.
+ --with-xf86vmode-ext Include support for XFree86 virtual screens.
+ --with-xf86gamma-ext Include support for XFree86 gamma fading.
+ --with-randr-ext Include support for the X Resize+Rotate extension.
+ --with-proc-interrupts Include support for consulting the /proc/interrupts
+ file to notice keyboard activity.
+ --with-pam Include support for PAM (Pluggable Auth Modules.)
+ --with-pam-service-name NAME arg is the name of the PAM service that
+ xscreensaver will authenticate as.
+ --with-kerberos Include support for Kerberos authentication.
+ --with-shadow Include support for shadow password authentication.
+ --with-passwd-helper Include support for an external password
+ verification helper program.
+ --with-login-manager Put a "New Login" button on the unlock dialog that
+ runs a login manager like gdmflexiserver or kdmctl.
+
+User interface options:
+
+ --with-gtk Use the Gtk toolkit for the user interface.
+ --with-motif Use the Motif toolkit for the user interface
+ (no longer supported.)
+
+Graphics options:
+
+ --with-gl Build those demos which depend on OpenGL.
+ --with-gle Build those demos which depend on GLE
+ (the OpenGL "extrusion" library.)
+ --with-gles Target OpenGL ES 1.x API instead of OpenGL 1.3.
+ --with-png Include support for the PNG library.
+ --with-pixbuf Include support for the GDK-Pixbuf library in some
+ demos, which will make it possible for them to read
+ GIF, JPEG, and PNG files as well.
+ --with-jpeg Include support for the JPEG library.
+ --with-xft Include support for the X Freetype library.
+ --with-xshm-ext Include support for the Shared Memory extension.
+ --with-xdbe-ext Include support for the DOUBLE-BUFFER extension.
+ --with-readdisplay Include support for the XReadDisplay extension.
+ --with-image-directory Arg is the default directory from which some demos
+ will choose random images to display.
+ --with-text-file=FILE By default, some demos may display this file.
+ --with-browser=BROWSER Specify the web browser used to show the help URL.
+ --with-setuid-hacks Allow some demos to be installed `setuid root'
+ (which is needed in order to ping other hosts.)
+
+ --with-record-animation Include code for generating MP4 videos.
+
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ CPP C preprocessor
+ XMKMF Path to xmkmf, Makefile generator for X Window System
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to the package provider.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for guested configure.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+configure
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -rf conftest.$ac_objext
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -rf conftest.$ac_objext conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: program exited with status $ac_status" >&5
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if eval \${$3+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_header_compiler=yes
+else
+ ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ ac_header_preproc=yes
+else
+ ac_header_preproc=no
+fi
+rm -rf conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+ yes:no: )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=no"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_type
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $2 (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES
+# ----------------------------------------------------
+# Tries to find if the field MEMBER exists in type AGGR, after including
+# INCLUDES, setting cache variable VAR accordingly.
+ac_fn_c_check_member ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
+$as_echo_n "checking for $2.$3... " >&6; }
+if eval \${$4+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (ac_aggr.$3)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$4=yes"
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (sizeof ac_aggr.$3)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$4=yes"
+else
+ eval "$4=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$4
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_member
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ $as_echo "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ $as_echo "$as_me: caught signal $ac_signal"
+ $as_echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+ # We do not want a PATH search for config.site.
+ case $CONFIG_SITE in #((
+ -*) ac_site_file1=./$CONFIG_SITE;;
+ */*) ac_site_file1=$CONFIG_SITE;;
+ *) ac_site_file1=./$CONFIG_SITE;;
+ esac
+elif test "x$prefix" != xNONE; then
+ ac_site_file1=$prefix/share/config.site
+ ac_site_file2=$prefix/etc/config.site
+else
+ ac_site_file1=$ac_default_prefix/share/config.site
+ ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+ test "x$ac_site_file" = xNONE && continue
+ if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_config_headers="$ac_config_headers config.h"
+
+
+echo "current directory: `pwd`"
+echo "command line was: $0 $@"
+
+###############################################################################
+#
+# Autoheader stuff
+#
+###############################################################################
+
+
+
+
+
+
+
+# This only ever existed in X11R4 and X11R5.
+#AH_TEMPLATE([HAVE_XIDLE_EXTENSION],
+# [Define this if you have the XIDLE extension installed. If you
+# have the XIDLE extension, this is recommended. (You have this
+# extension if the file /usr/include/X11/extensions/xidle.h
+# exists.) Turning on this flag lets XScreenSaver work better with
+# servers which support this extension; but it will still work
+# with servers which do not suport it, so it's a good idea to
+# compile in support for it if you can.])
+
+# Using this extension will crash your X server and make fading not work.
+#AH_TEMPLATE([HAVE_MIT_SAVER_EXTENSION],
+# [Define this if you have the MIT-SCREEN-SAVER extension
+# installed. See the caveats about this extension, above.
+# (It's available if /usr/include/X11/extensions/scrnsaver.h
+# exists.)])
+
+# This only ever existed on SGI hardware.
+#AH_TEMPLATE([HAVE_SGI_SAVER_EXTENSION],
+# [Define this if you have the SGI SCREEN_SAVER extension. This is
+# standard on Irix systems, and not available elsewhere.])
+
+# This only ever existed on SGI hardware.
+#AH_TEMPLATE([HAVE_SGI_VC_EXTENSION],
+# [Define this if you have the SGI-VIDEO-CONTROL extension. This
+# is standard on Irix systems, and not available elsewhere.])
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# After checking to see that --srcdir is correct (which AC_INIT does)
+# check for some random other files that come later in the tar file,
+# to make sure everything is here.
+#
+for d in utils jwxyz hacks hacks/glx driver ; do
+ f=$srcdir/$d/Makefile.in
+ if test \! -r $f ; then
+ echo ""
+ echo "ERROR: The package is incomplete: $f does not exist."
+ echo " This probably means that your download was truncated."
+ echo ""
+ exit 1
+ fi
+done
+
+###############################################################################
+#
+# Query AX_PTHREAD, and figure out which compiler gets used.
+#
+###############################################################################
+
+
+
+
+###############################################################################
+#
+# Function to figure out how to run the compiler.
+#
+###############################################################################
+
+
+
+
+###############################################################################
+#
+# Check for availability of various gcc command-line options.
+#
+###############################################################################
+
+
+
+
+
+
+
+# Need to disable Objective C extensions in ANSI C on MacOS X to work
+# around an Apple-specific gcc bug.
+#
+
+
+###############################################################################
+#
+# Function to figure out how to disable // comments in ANSI C code.
+#
+# (With recent gcc, this is done with "-std=c89". With older gcc, this
+# is done by passing "-lang-c89" to cpp, by passing "-Wp,-lang-c89" to
+# gcc. Old gcc doesn't support -std, and new gcc doesn't support -lang.
+# so much for compatibility!)
+#
+# UPDATE: apparently there is NO WAY to tell gcc 3.2.2 to require that
+# declarations preceed statements, without resorting to "-pedantic".
+# This means that there is no way to get gcc3 to issue warnings that
+# ensure that your code complies with the ANSI/ISO C89 standard, without
+# also drowning in totally useless warnings. Thank you master may I
+# have another.
+#
+# So, I give up, let's just use -pedantic.
+#
+###############################################################################
+
+
+
+
+
+
+###############################################################################
+#
+# Function to figure out how to create directory trees.
+#
+###############################################################################
+
+
+
+
+###############################################################################
+#
+# Function to check whether gettimeofday() exists, and how to call it.
+# This may define HAVE_GETTIMEOFDAY and GETTIMEOFDAY_TWO_ARGS.
+#
+###############################################################################
+
+
+
+
+###############################################################################
+#
+# Function to find perl5 (defines PERL and PERL_VERSION.)
+#
+###############################################################################
+
+# M4 sucks!! perl sucks too!!
+
+perl_version_cmd='print $]'
+
+
+
+
+
+###############################################################################
+#
+# Function to demand "bc". Losers.
+#
+###############################################################################
+
+
+
+###############################################################################
+#
+# Functions to check how to do ICMP PING requests.
+#
+###############################################################################
+
+
+
+
+
+
+###############################################################################
+#
+# Functions to check for various X11 crap.
+#
+###############################################################################
+
+# Try and find the app-defaults directory.
+# It sucks that autoconf doesn't do this already...
+#
+
+
+###############################################################################
+#
+# Handle the --with-x-app-defaults option HERE
+#
+###############################################################################
+
+
+# Check whether --with-x-app-defaults was given.
+if test "${with_x_app_defaults+set}" = set; then :
+ withval=$with_x_app_defaults; ac_cv_x_app_defaults="$withval"
+else
+ eval ac_x_app_defaults="$withval"
+fi
+
+
+
+
+
+
+
+
+
+
+
+# Random special-cases for X on certain pathological OSes.
+# You know who you are.
+#
+
+
+
+
+
+
+###############################################################################
+#
+# Some utility functions to make checking for X things easier.
+#
+###############################################################################
+
+# Like AC_CHECK_HEADER, but it uses the already-computed -I directories.
+#
+
+
+# Like AC_EGREP_HEADER, but it uses the already-computed -I directories.
+#
+
+
+# Like AC_TRY_COMPILE, but it uses the already-computed -I directories.
+#
+
+
+
+# Like AC_CHECK_LIB, but it uses the already-computed -I and -L directories.
+# Use this sparingly; it probably doesn't work very well on X programs.
+#
+
+
+# Like AC_TRY_RUN, but it uses the already-computed -I directories.
+# (But not the -L directories!)
+#
+
+
+
+
+# Usage: HANDLE_X_PATH_ARG([variable_name],
+# [--command-line-option],
+# [descriptive string])
+#
+# All of the --with options take three forms:
+#
+# --with-foo (or --with-foo=yes)
+# --without-foo (or --with-foo=no)
+# --with-foo=/DIR
+#
+# This function, HANDLE_X_PATH_ARG, deals with the /DIR case. When it sees
+# a directory (string beginning with a slash) it checks to see whether
+# /DIR/include and /DIR/lib exist, and adds them to $X_CFLAGS and $X_LIBS
+# as appropriate.
+#
+
+
+
+
+###############################################################################
+###############################################################################
+#
+# End of function definitions. Now start actually executing stuff.
+#
+###############################################################################
+###############################################################################
+
+# WTF! autoconf emits this *way* too late. Do it earlier.
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+
+# random compiler setup
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+ if test -f "$ac_dir/install-sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f "$ac_dir/install.sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f "$ac_dir/shtool"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+ ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "x$host_alias" = x; then
+ ac_cv_host=$ac_cv_build
+else
+ ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+ac_original_cc=$CC
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -rf conftest.er1 conftest.err
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+ ac_file=''
+fi
+if test -z "$ac_file"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -rf conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -rf conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -rf conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -rf conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -rf conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_compiler_gnu=yes
+else
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+else
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -rf conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+ x)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+ xno)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+ *)
+ CC="$CC $ac_cv_prog_cc_c89"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+have_pthread=no
+ with_pthread_req=unspecified
+
+ # AX_PTHREAD is from the GNU Autoconf Archive.
+ # https://savannah.gnu.org/projects/autoconf-archive/
+ # ===========================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_pthread.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+#
+# DESCRIPTION
+#
+# This macro figures out how to build C programs using POSIX threads. It
+# sets the PTHREAD_LIBS output variable to the threads library and linker
+# flags, and the PTHREAD_CFLAGS output variable to any special C compiler
+# flags that are needed. (The user can also force certain compiler
+# flags/libs to be tested by setting these environment variables.)
+#
+# Also sets PTHREAD_CC to any special C compiler that is needed for
+# multi-threaded programs (defaults to the value of CC otherwise). (This
+# is necessary on AIX to use the special cc_r compiler alias.)
+#
+# NOTE: You are assumed to not only compile your program with these flags,
+# but also link it with them as well. e.g. you should link with
+# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
+#
+# If you are only building threads programs, you may wish to use these
+# variables in your default LIBS, CFLAGS, and CC:
+#
+# LIBS="$PTHREAD_LIBS $LIBS"
+# CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+# CC="$PTHREAD_CC"
+#
+# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
+# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name
+# (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
+#
+# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
+# PTHREAD_PRIO_INHERIT symbol is defined when compiling with
+# PTHREAD_CFLAGS.
+#
+# ACTION-IF-FOUND is a list of shell commands to run if a threads library
+# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it
+# is not found. If ACTION-IF-FOUND is not specified, the default action
+# will define HAVE_PTHREAD.
+#
+# Please let the authors know if this macro fails on any platform, or if
+# you have any other suggestions or comments. This macro was based on work
+# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help
+# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by
+# Alejandro Forero Cuervo to the autoconf macro repository. We are also
+# grateful for the helpful feedback of numerous users.
+#
+# Updated for Autoconf 2.68 by Daniel Richard G.
+#
+# LICENSE
+#
+# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
+# Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>
+#
+# 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 3 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, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception, the respective Autoconf Macro's copyright owner
+# gives unlimited permission to copy, distribute and modify the configure
+# scripts that are the output of Autoconf when processing the Macro. You
+# need not follow the terms of the GNU General Public License when using
+# or distributing such scripts, even though portions of the text of the
+# Macro appear in them. The GNU General Public License (GPL) does govern
+# all other use of the material that constitutes the Autoconf Macro.
+#
+# This special exception to the GPL applies to versions of the Autoconf
+# Macro released by the Autoconf Archive. When you make and distribute a
+# modified version of the Autoconf Macro, you may extend this special
+# exception to the GPL to apply to your modified version as well.
+
+#serial 21
+
+# This is what autoupdate's m4 run will expand. It fires
+# the warning (with _au_warn_XXX), outputs it into the
+# updated configure.ac (with AC_DIAGNOSE), and then outputs
+# the replacement expansion.
+
+
+# This is an auxiliary macro that is also run when
+# autoupdate runs m4. It simply calls m4_warning, but
+# we need a wrapper so that each warning is emitted only
+# once. We break the quoting in m4_warning's argument in
+# order to expand this macro's arguments, not AU_DEFUN's.
+
+
+# Finally, this is the expansion that is picked up by
+# autoconf. It tells the user to run autoupdate, and
+# then outputs the replacement expansion. We do not care
+# about autoupdate's warning because that contains
+# information on what to do *after* running autoupdate.
+
+
+
+ # This affects CC, LIBS, and CFLAGS, instead of defining new variables.
+
+
+# Check whether --with-pthread was given.
+if test "${with_pthread+set}" = set; then :
+ withval=$with_pthread; with_pthread="$withval"; with_pthread_req="$withval"
+else
+ with_pthread=yes
+fi
+
+
+ if test "$with_pthread" = yes; then
+ # AX_PTHREAD might want a different compiler.
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ax_pthread_ok=no
+
+# We used to check for pthread.h first, but this fails if pthread.h
+# requires special compiler flags (e.g. on True64 or Sequent).
+# It gets checked for in the link test anyway.
+
+# First of all, check if the user has set any of the PTHREAD_LIBS,
+# etcetera environment variables, and if threads linking works using
+# them:
+if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+ save_LIBS="$LIBS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5
+$as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char pthread_join ();
+int
+main ()
+{
+return pthread_join ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ax_pthread_ok=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
+$as_echo "$ax_pthread_ok" >&6; }
+ if test x"$ax_pthread_ok" = xno; then
+ PTHREAD_LIBS=""
+ PTHREAD_CFLAGS=""
+ fi
+ LIBS="$save_LIBS"
+ CFLAGS="$save_CFLAGS"
+fi
+
+# We must check for the threads library under a number of different
+# names; the ordering is very important because some systems
+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+# libraries is broken (non-POSIX).
+
+# Create a list of thread flags to try. Items starting with a "-" are
+# C compiler flags, and other items are library names, except for "none"
+# which indicates that we try without any flags at all, and "pthread-config"
+# which is a program returning the flags for the Pth emulation library.
+
+ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+
+# The ordering *is* (sometimes) important. Some notes on the
+# individual items follow:
+
+# pthreads: AIX (must check this before -lpthread)
+# none: in case threads are in libc; should be tried before -Kthread and
+# other compiler flags to prevent continual compiler warnings
+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
+# -pthreads: Solaris/gcc
+# -mthreads: Mingw32/gcc, Lynx/gcc
+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+# doesn't hurt to check since this sometimes defines pthreads too;
+# also defines -D_REENTRANT)
+# ... -mt is also the pthreads flag for HP/aCC
+# pthread: Linux, etcetera
+# --thread-safe: KAI C++
+# pthread-config: use pthread-config program (for GNU Pth library)
+
+case ${host_os} in
+ solaris*)
+
+ # On Solaris (at least, for some versions), libc contains stubbed
+ # (non-functional) versions of the pthreads routines, so link-based
+ # tests will erroneously succeed. (We need to link with -pthreads/-mt/
+ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
+ # a function called by this macro, so we could check for that, but
+ # who knows whether they'll stub that too in a future libc.) So,
+ # we'll just look for -pthreads and -lpthread first:
+
+ ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags"
+ ;;
+
+ darwin*)
+ ax_pthread_flags="-pthread $ax_pthread_flags"
+ ;;
+esac
+
+# Clang doesn't consider unrecognized options an error unless we specify
+# -Werror. We throw in some extra Clang-specific options to ensure that
+# this doesn't happen for GCC, which also accepts -Werror.
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler needs -Werror to reject unknown flags" >&5
+$as_echo_n "checking if compiler needs -Werror to reject unknown flags... " >&6; }
+save_CFLAGS="$CFLAGS"
+ax_pthread_extra_flags="-Werror"
+CFLAGS="$CFLAGS $ax_pthread_extra_flags -Wunknown-warning-option -Wsizeof-array-argument"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int foo(void);
+int
+main ()
+{
+foo()
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ ax_pthread_extra_flags=
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+CFLAGS="$save_CFLAGS"
+
+if test x"$ax_pthread_ok" = xno; then
+for flag in $ax_pthread_flags; do
+
+ case $flag in
+ none)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5
+$as_echo_n "checking whether pthreads work without any flags... " >&6; }
+ ;;
+
+ -*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5
+$as_echo_n "checking whether pthreads work with $flag... " >&6; }
+ PTHREAD_CFLAGS="$flag"
+ ;;
+
+ pthread-config)
+ # Extract the first word of "pthread-config", so it can be a program name with args.
+set dummy pthread-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ax_pthread_config+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ax_pthread_config"; then
+ ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ax_pthread_config="yes"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no"
+fi
+fi
+ax_pthread_config=$ac_cv_prog_ax_pthread_config
+if test -n "$ax_pthread_config"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5
+$as_echo "$ax_pthread_config" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test x"$ax_pthread_config" = xno; then continue; fi
+ PTHREAD_CFLAGS="`pthread-config --cflags`"
+ PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+ ;;
+
+ *)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5
+$as_echo_n "checking for the pthreads library -l$flag... " >&6; }
+ PTHREAD_LIBS="-l$flag"
+ ;;
+ esac
+
+ save_LIBS="$LIBS"
+ save_CFLAGS="$CFLAGS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS $ax_pthread_extra_flags"
+
+ # Check for various functions. We must include pthread.h,
+ # since some functions may be macros. (On the Sequent, we
+ # need a special flag -Kthread to make this header compile.)
+ # We check for pthread_join because it is in -lpthread on IRIX
+ # while pthread_create is in libc. We check for pthread_attr_init
+ # due to DEC craziness with -lpthreads. We check for
+ # pthread_cleanup_push because it is one of the few pthread
+ # functions on Solaris that doesn't have a non-functional libc stub.
+ # We try pthread_create on general principles.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <pthread.h>
+ static void routine(void *a) { a = 0; }
+ static void *start_routine(void *a) { return a; }
+int
+main ()
+{
+pthread_t th; pthread_attr_t attr;
+ pthread_create(&th, 0, start_routine, 0);
+ pthread_join(th, 0);
+ pthread_attr_init(&attr);
+ pthread_cleanup_push(routine, 0);
+ pthread_cleanup_pop(0) /* ; */
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ax_pthread_ok=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+ LIBS="$save_LIBS"
+ CFLAGS="$save_CFLAGS"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
+$as_echo "$ax_pthread_ok" >&6; }
+ if test "x$ax_pthread_ok" = xyes; then
+ break;
+ fi
+
+ PTHREAD_LIBS=""
+ PTHREAD_CFLAGS=""
+done
+fi
+
+# Various other checks:
+if test "x$ax_pthread_ok" = xyes; then
+ save_LIBS="$LIBS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+ # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5
+$as_echo_n "checking for joinable pthread attribute... " >&6; }
+ attr_name=unknown
+ for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <pthread.h>
+int
+main ()
+{
+int attr = $attr; return attr /* ; */
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ attr_name=$attr; break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ done
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5
+$as_echo "$attr_name" >&6; }
+ if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
+
+cat >>confdefs.h <<_ACEOF
+#define PTHREAD_CREATE_JOINABLE $attr_name
+_ACEOF
+
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5
+$as_echo_n "checking if more special flags are required for pthreads... " >&6; }
+ flag=no
+ case ${host_os} in
+ aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";;
+ osf* | hpux*) flag="-D_REENTRANT";;
+ solaris*)
+ if test "$GCC" = "yes"; then
+ flag="-D_REENTRANT"
+ else
+ # TODO: What about Clang on Solaris?
+ flag="-mt -D_REENTRANT"
+ fi
+ ;;
+ esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag" >&5
+$as_echo "$flag" >&6; }
+ if test "x$flag" != xno; then
+ PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5
+$as_echo_n "checking for PTHREAD_PRIO_INHERIT... " >&6; }
+if ${ax_cv_PTHREAD_PRIO_INHERIT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <pthread.h>
+int
+main ()
+{
+int i = PTHREAD_PRIO_INHERIT;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ax_cv_PTHREAD_PRIO_INHERIT=yes
+else
+ ax_cv_PTHREAD_PRIO_INHERIT=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5
+$as_echo "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; }
+ if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"; then :
+
+$as_echo "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h
+
+fi
+
+ LIBS="$save_LIBS"
+ CFLAGS="$save_CFLAGS"
+
+ # More AIX lossage: compile with *_r variant
+ if test "x$GCC" != xyes; then
+ case $host_os in
+ aix*)
+ case "x/$CC" in #(
+ x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) :
+ #handle absolute path differently from PATH based program lookup
+ case "x$CC" in #(
+ x/*) :
+ if as_fn_executable_p ${CC}_r; then :
+ PTHREAD_CC="${CC}_r"
+fi ;; #(
+ *) :
+ for ac_prog in ${CC}_r
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_PTHREAD_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$PTHREAD_CC"; then
+ ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_PTHREAD_CC="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+PTHREAD_CC=$ac_cv_prog_PTHREAD_CC
+if test -n "$PTHREAD_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5
+$as_echo "$PTHREAD_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$PTHREAD_CC" && break
+done
+test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
+ ;;
+esac ;; #(
+ *) :
+ ;;
+esac
+ ;;
+ esac
+ fi
+fi
+
+test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
+
+
+
+
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test x"$ax_pthread_ok" = xyes; then
+ if test "$CC" = "$PTHREAD_CC" -o -z "$ac_original_cc"; then
+ have_pthread=yes
+ else
+ ac_prog_cc_no_pthread=yes
+ fi
+
+ :
+else
+ ax_pthread_ok=no
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+ if test "$have_pthread" = yes; then
+ $as_echo "#define HAVE_PTHREAD 1" >>confdefs.h
+
+ CC=$PTHREAD_CC
+ fi
+ fi
+ # Needs ac_original_cc.
+
+
+
+ if test -z "$GCC"; then
+ # not using GCC
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to request ANSI compilation" >&5
+$as_echo_n "checking how to request ANSI compilation... " >&6; }
+ case "$host" in
+ *-hpux* )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: HPUX: adding -Ae" >&5
+$as_echo "HPUX: adding -Ae" >&6; }
+ CC="$CC -Ae"
+ ;;
+ *-aix* )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: AIX: adding -qlanglvl=ansi -qhalt=e" >&5
+$as_echo "AIX: adding -qlanglvl=ansi -qhalt=e" >&6; }
+ CC="$CC -qlanglvl=ansi -qhalt=e"
+ ;;
+ *-dec-* )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: DEC: adding -std1 -ieee" >&5
+$as_echo "DEC: adding -std1 -ieee" >&6; }
+ CC="$CC -std1"
+ ;;
+ *)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no idea" >&5
+$as_echo "no idea" >&6; }
+ ;;
+ esac
+ else
+ # using GCC
+ case "$host" in
+ *-solaris*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: Solaris: adding -D__EXTENSIONS__" >&5
+$as_echo "Solaris: adding -D__EXTENSIONS__" >&6; }
+ CC="$CC -D__EXTENSIONS__"
+ ;;
+ esac
+ fi
+
+ OBJCC="$CC"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler works on ANSI C" >&5
+$as_echo_n "checking whether the compiler works on ANSI C... " >&6; }
+ if test "$cross_compiling" = yes; then :
+ as_fn_error $? "Couldn't build even a trivial ANSI C program: check CC." "$LINENO" 5
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+ main(int ac, char **av) { return 0; }
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ as_fn_error $? "Couldn't build even a trivial ANSI C program: check CC." "$LINENO" 5
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+ if test -n "$GCC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: Turning on gcc compiler warnings." >&5
+$as_echo "Turning on gcc compiler warnings." >&6; }
+ CC="$CC -pedantic -Wall -Wstrict-prototypes -Wnested-externs -Wmissing-prototypes"
+ OBJCC="$OBJCC -Wall"
+ # As of gcc 3.4, we have "-Wdeclaration-after-statement"
+ # and so perhaps now we can do without -pedantic?
+ else
+ case "$host" in
+ *-irix5* |*-irix6.0-3* )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: Turning on SGI compiler warnings." >&5
+$as_echo "Turning on SGI compiler warnings." >&6; }
+ CC="$CC -fullwarn -use_readonly_const -rdata_shared -g3"
+ ;;
+# *-dec-osf* )
+# if test -z "$GCC"; then
+# AC_MSG_RESULT(Turning on DEC C compiler warnings.)
+# CC="$CC -migrate -w0 -verbose -warnprotos"
+# fi
+# ;;
+ esac
+ fi
+
+if test -n "$GCC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wno-overlength-strings" >&5
+$as_echo_n "checking whether gcc accepts -Wno-overlength-strings... " >&6; }
+if ${ac_cv_gcc_accepts_no_overlength+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ rm -rf conftest.$ac_ext
+ touch conftest.$ac_ext
+ if ( ( gcc -c -Wno-overlength-strings conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
+ grep unrecognized >/dev/null ); then
+ ac_cv_gcc_accepts_no_overlength=no
+ else
+ ac_cv_gcc_accepts_no_overlength=yes
+ CC="$CC -Wno-overlength-strings"
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_no_overlength" >&5
+$as_echo "$ac_cv_gcc_accepts_no_overlength" >&6; }
+ ac_gcc_accepts_no_overlength="$ac_cv_gcc_accepts_no_overlength"
+ fi
+
+if test -n "$GCC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -Wdeclaration-after-statement" >&5
+$as_echo_n "checking whether gcc accepts -Wdeclaration-after-statement... " >&6; }
+if ${ac_cv_gcc_accepts_no_decl_after+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ rm -rf conftest.$ac_ext
+ touch conftest.$ac_ext
+ if ( ( gcc -c -Wdeclaration-after-statement conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
+ grep unrecognized >/dev/null ); then
+ ac_cv_gcc_accepts_no_decl_after=no
+ else
+ ac_cv_gcc_accepts_no_decl_after=yes
+ CC="$CC -Wdeclaration-after-statement"
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_no_decl_after" >&5
+$as_echo "$ac_cv_gcc_accepts_no_decl_after" >&6; }
+ ac_gcc_accepts_no_decl_after="$ac_cv_gcc_accepts_no_decl_after"
+ fi
+
+if test -n "$GCC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -no-cpp-precomp" >&5
+$as_echo_n "checking whether gcc accepts -no-cpp-precomp... " >&6; }
+if ${ac_cv_gcc_accepts_no_cpp_precomp+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ rm -rf conftest.$ac_ext
+ touch conftest.$ac_ext
+ if ( ( gcc -c -no-cpp-precomp conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
+ grep unrecognized >/dev/null ); then
+ ac_cv_gcc_accepts_no_cpp_precomp=no
+ else
+ ac_cv_gcc_accepts_no_cpp_precomp=yes
+ CC="$CC -no-cpp-precomp"
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_no_cpp_precomp" >&5
+$as_echo "$ac_cv_gcc_accepts_no_cpp_precomp" >&6; }
+ ac_gcc_accepts_no_cpp_precomp="$ac_cv_gcc_accepts_no_cpp_precomp"
+ fi
+
+if test -n "$GCC"; then
+
+ case "$host" in
+ *-darwin* )
+ # Fucking Apple let // comments sneak into OpenGL headers, so
+ # we *must* allow // comments when compiling on Mac OS 10.6! FUCK!
+ ;;
+ *)
+ if test -n "$GCC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc accepts -std=c89" >&5
+$as_echo_n "checking whether gcc accepts -std=c89... " >&6; }
+if ${ac_cv_gcc_accepts_std+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ rm -rf conftest.$ac_ext
+ touch conftest.$ac_ext
+ if ( ( gcc -c -std=c89 conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
+ grep unrecognized >/dev/null ); then
+ ac_cv_gcc_accepts_std=no
+ else
+ ac_cv_gcc_accepts_std=yes
+ CC="$CC -std=c89"
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_accepts_std" >&5
+$as_echo "$ac_cv_gcc_accepts_std" >&6; }
+ ac_gcc_accepts_std="$ac_cv_gcc_accepts_std"
+ fi
+
+ ;;
+ esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: Disabling C++ comments in ANSI C code." >&5
+$as_echo "Disabling C++ comments in ANSI C code." >&6; }
+ #
+ # The reason that // comments are banned from xscreensaver is that gcc is
+ # basically the only compiler in the world that supports them in C code.
+ # All other vendors support them only in their C++ compilers, not in their
+ # ANSI C compilers. This means that it's a portability problem: every time
+ # these comments have snuck into the xscreensaver source code, I've gotten
+ # complaints about it the next day. So we turn off support for them in gcc
+ # as well to prevent them from accidentially slipping in.
+ #
+ if test "$ac_gcc_accepts_std" = yes ; then
+ #
+ # -std=c89 defines __STRICT_ANSI__, which we don't want.
+ # (That appears to be the only additional preprocessor symbol
+ # it defines, in addition to the syntax changes it makes.)
+ #
+ # -std=gnu89 is no good, because // comments were a GNU extension
+ # before they were in the ANSI C 99 spec... (gcc 2.96 permits //
+ # with -std=gnu89 but not with -std=c89.)
+ #
+ # $CC already contains "-std=c89" via AC_GCC_ACCEPTS_STD
+ CC="$CC -U__STRICT_ANSI__"
+# else
+# # The old way:
+# CC="$CC -Wp,-lang-c89"
+ fi
+ fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if ${ac_cv_prog_CPP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -rf conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -rf conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -rf conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -rf conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -rf conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -rf conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
+$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
+if ${ac_cv_c_const+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+#ifndef __cplusplus
+ /* Ultrix mips cc rejects this sort of thing. */
+ typedef int charset[2];
+ const charset cs = { 0, 0 };
+ /* SunOS 4.1.1 cc rejects this. */
+ char const *const *pcpcc;
+ char **ppc;
+ /* NEC SVR4.0.2 mips cc rejects this. */
+ struct point {int x, y;};
+ static struct point const zero = {0,0};
+ /* AIX XL C 1.02.0.0 rejects this.
+ It does not let you subtract one const X* pointer from another in
+ an arm of an if-expression whose if-part is not a constant
+ expression */
+ const char *g = "string";
+ pcpcc = &g + (g ? g-g : 0);
+ /* HPUX 7.0 cc rejects these. */
+ ++pcpcc;
+ ppc = (char**) pcpcc;
+ pcpcc = (char const *const *) ppc;
+ { /* SCO 3.2v4 cc rejects this sort of thing. */
+ char tx;
+ char *t = &tx;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 0;
+ if (s) return 0;
+ }
+ { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
+ int x[] = {25, 17};
+ const int *foo = &x[0];
+ ++foo;
+ }
+ { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+ typedef const int *iptr;
+ iptr p = 0;
+ ++p;
+ }
+ { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+ struct s { int j; const int *ap[3]; } bx;
+ struct s *b = &bx; b->j = 5;
+ }
+ { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+ if (!foo) return 0;
+ }
+ return !cs[0] && !zero.x;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_c_const=yes
+else
+ ac_cv_c_const=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
+$as_echo "$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+
+$as_echo "#define const /**/" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+$as_echo_n "checking for inline... " >&6; }
+if ${ac_cv_c_inline+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo () {return 0; }
+$ac_kw foo_t foo () {return 0; }
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_c_inline=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
+$as_echo "$ac_cv_c_inline" >&6; }
+
+case $ac_cv_c_inline in
+ inline | yes) ;;
+ *)
+ case $ac_cv_c_inline in
+ no) ac_val=;;
+ *) ac_val=$ac_cv_c_inline;;
+ esac
+ cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+ ;;
+esac
+
+
+ac_bc_result=`echo 6+9 | bc 2>/dev/null`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bc" >&5
+$as_echo_n "checking for bc... " >&6; }
+ if test "$ac_bc_result" = "15" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ echo ''
+ as_fn_error $? "Your system doesn't have \"bc\", which has been a standard
+ part of Unix since the 1970s. Come back when your vendor
+ has grown a clue." "$LINENO" 5
+ fi
+
+
+# stuff for Makefiles
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+ ./ | .// | /[cC]/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+ done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \"\${INSTALL} -d\" creates intermediate directories" >&5
+$as_echo_n "checking whether \"\${INSTALL} -d\" creates intermediate directories... " >&6; }
+if ${ac_cv_install_d_creates_dirs+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_install_d_creates_dirs=no
+ rm -rf conftestdir
+ if mkdir conftestdir; then
+ cd conftestdir 2>/dev/null
+ ${INSTALL} -d `pwd`/dir1/dir2 >/dev/null 2>&1
+ if test -d dir1/dir2/. ; then
+ ac_cv_install_d_creates_dirs=yes
+ fi
+ cd .. 2>/dev/null
+ rm -rf conftestdir
+ fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_install_d_creates_dirs" >&5
+$as_echo "$ac_cv_install_d_creates_dirs" >&6; }
+
+ if test "$ac_cv_install_d_creates_dirs" = no ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \"mkdir -p\" creates intermediate directories" >&5
+$as_echo_n "checking whether \"mkdir -p\" creates intermediate directories... " >&6; }
+if ${ac_cv_mkdir_p_creates_dirs+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_mkdir_p_creates_dirs=no
+ rm -rf conftestdir
+ if mkdir conftestdir; then
+ cd conftestdir 2>/dev/null
+ mkdir -p dir1/dir2 >/dev/null 2>&1
+ if test -d dir1/dir2/. ; then
+ ac_cv_mkdir_p_creates_dirs=yes
+ fi
+ cd .. 2>/dev/null
+ rm -rf conftestdir
+ fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_mkdir_p_creates_dirs" >&5
+$as_echo "$ac_cv_mkdir_p_creates_dirs" >&6; }
+ fi
+
+ if test "$ac_cv_install_d_creates_dirs" = yes ; then
+ INSTALL_DIRS='${INSTALL} -d'
+ elif test "$ac_cv_mkdir_p_creates_dirs" = yes ; then
+ INSTALL_DIRS='mkdir -p'
+ else
+ # any other ideas?
+ INSTALL_DIRS='${INSTALL} -d'
+ fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+ @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+ *@@@%%%=?*=@@@%%%*)
+ eval ac_cv_prog_make_${ac_make}_set=yes;;
+ *)
+ eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -rf conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ SET_MAKE=
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+# By default, autoconf sets INSTALL_SCRIPT to '${INSTALL_PROGRAM}'.
+# That's wrong: it should be set to '${INSTALL}', so that one can
+# implement the "install-strip" target properly (strip executables,
+# but do not try to strip scripts.)
+#
+INSTALL_SCRIPT='${INSTALL}'
+
+# random libc stuff
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in grep ggrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -rf conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in egrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -rf conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_stdc=yes
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -rf conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -rf conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then :
+ :
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in unistd.h inttypes.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default"
+if test "x$ac_cv_type_mode_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define mode_t int
+_ACEOF
+
+fi
+
+ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default"
+if test "x$ac_cv_type_pid_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define pid_t int
+_ACEOF
+
+fi
+
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned int
+_ACEOF
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5
+$as_echo_n "checking return type of signal handlers... " >&6; }
+if ${ac_cv_type_signal+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <signal.h>
+
+int
+main ()
+{
+return *(signal (0, 0)) (0) == 1;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_type_signal=int
+else
+ ac_cv_type_signal=void
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5
+$as_echo "$ac_cv_type_signal" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define RETSIGTYPE $ac_cv_type_signal
+_ACEOF
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5
+$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; }
+if ${ac_cv_header_time+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+
+int
+main ()
+{
+if ((struct tm *) 0)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_time=yes
+else
+ ac_cv_header_time=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5
+$as_echo "$ac_cv_header_time" >&6; }
+if test $ac_cv_header_time = yes; then
+
+$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5
+$as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; }
+if ${ac_cv_header_sys_wait_h+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <sys/wait.h>
+#ifndef WEXITSTATUS
+# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8)
+#endif
+#ifndef WIFEXITED
+# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
+#endif
+
+int
+main ()
+{
+ int s;
+ wait (&s);
+ s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_sys_wait_h=yes
+else
+ ac_cv_header_sys_wait_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5
+$as_echo "$ac_cv_header_sys_wait_h" >&6; }
+if test $ac_cv_header_sys_wait_h = yes; then
+
+$as_echo "#define HAVE_SYS_WAIT_H 1" >>confdefs.h
+
+fi
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
+ as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5
+$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; }
+if eval \${$as_ac_Header+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <$ac_hdr>
+
+int
+main ()
+{
+if ((DIR *) 0)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$as_ac_Header=yes"
+else
+ eval "$as_ac_Header=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$as_ac_Header
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
+_ACEOF
+
+ac_header_dirent=$ac_hdr; break
+fi
+
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+$as_echo_n "checking for library containing opendir... " >&6; }
+if ${ac_cv_search_opendir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opendir ();
+int
+main ()
+{
+return opendir ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' dir; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_opendir=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_opendir+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_opendir+:} false; then :
+
+else
+ ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+$as_echo "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+$as_echo_n "checking for library containing opendir... " >&6; }
+if ${ac_cv_search_opendir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opendir ();
+int
+main ()
+{
+return opendir ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' x; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_opendir=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_opendir+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_opendir+:} false; then :
+
+else
+ ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+$as_echo "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to call gettimeofday" >&5
+$as_echo_n "checking how to call gettimeofday... " >&6; }
+ if ${ac_cv_gettimeofday_args+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+ #include <sys/time.h>
+int
+main ()
+{
+struct timeval tv; struct timezone tzp;
+ gettimeofday(&tv, &tzp);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_gettimeofday_args=2
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+ #include <sys/time.h>
+int
+main ()
+{
+struct timeval tv; gettimeofday(&tv);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_gettimeofday_args=1
+else
+ ac_gettimeofday_args=0
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_cv_gettimeofday_args=$ac_gettimeofday_args
+fi
+
+ ac_gettimeofday_args=$ac_cv_gettimeofday_args
+ if test "$ac_gettimeofday_args" = 1 ; then
+ $as_echo "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: one argument" >&5
+$as_echo "one argument" >&6; }
+ elif test "$ac_gettimeofday_args" = 2 ; then
+ $as_echo "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h
+
+ $as_echo "#define GETTIMEOFDAY_TWO_ARGS 1" >>confdefs.h
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: two arguments" >&5
+$as_echo "two arguments" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
+$as_echo "unknown" >&6; }
+ fi
+
+# Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then :
+ enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
+if ${ac_cv_sys_largefile_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_sys_largefile_CC=no
+ if test "$GCC" != yes; then
+ ac_save_CC=$CC
+ while :; do
+ # IRIX 6.2 and later do not support large files by default,
+ # so use the C compiler's -n32 option if that helps.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ if ac_fn_c_try_compile "$LINENO"; then :
+ break
+fi
+rm -f core conftest.err conftest.$ac_objext
+ CC="$CC -n32"
+ if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_largefile_CC=' -n32'; break
+fi
+rm -f core conftest.err conftest.$ac_objext
+ break
+ done
+ CC=$ac_save_CC
+ rm -rf conftest.$ac_ext
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+$as_echo "$ac_cv_sys_largefile_CC" >&6; }
+ if test "$ac_cv_sys_largefile_CC" != no; then
+ CC=$CC$ac_cv_sys_largefile_CC
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if ${ac_cv_sys_file_offset_bits+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_file_offset_bits=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_file_offset_bits=64; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_cv_sys_file_offset_bits=unknown
+ break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+ no | unknown) ;;
+ *)
+cat >>confdefs.h <<_ACEOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+_ACEOF
+;;
+esac
+rm -rf conftest*
+ if test $ac_cv_sys_file_offset_bits = unknown; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
+if ${ac_cv_sys_large_files+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_large_files=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_large_files=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_cv_sys_large_files=unknown
+ break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+$as_echo "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+ no | unknown) ;;
+ *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+_ACEOF
+;;
+esac
+rm -rf conftest*
+ fi
+
+
+fi
+
+for ac_func in select fcntl uname nice setpriority getcwd getwd putenv sbrk
+do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+for ac_func in sigaction syslog realpath setrlimit
+do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+for ac_func in setlocale sqrtf
+do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+for ac_func in getaddrinfo
+do :
+ ac_fn_c_check_func "$LINENO" "getaddrinfo" "ac_cv_func_getaddrinfo"
+if test "x$ac_cv_func_getaddrinfo" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_GETADDRINFO 1
+_ACEOF
+
+fi
+done
+
+ac_fn_c_check_member "$LINENO" "struct sockaddr" "sa_len" "ac_cv_member_struct_sockaddr_sa_len" "#include <sys/socket.h>
+"
+if test "x$ac_cv_member_struct_sockaddr_sa_len" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_SOCKADDR_SA_LEN 1
+_ACEOF
+
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct icmp" >&5
+$as_echo_n "checking for struct icmp... " >&6; }
+if ${ac_cv_have_icmp+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+ #include <stdio.h>
+ #include <math.h>
+ #include <unistd.h>
+ #include <limits.h>
+ #include <signal.h>
+ #include <fcntl.h>
+ #include <sys/types.h>
+ #include <sys/time.h>
+ #include <sys/ipc.h>
+ #include <sys/shm.h>
+ #include <sys/socket.h>
+ #include <netinet/in_systm.h>
+ #include <netinet/in.h>
+ #include <netinet/ip.h>
+ #include <netinet/ip_icmp.h>
+ #include <netinet/udp.h>
+ #include <arpa/inet.h>
+ #include <netdb.h>
+int
+main ()
+{
+struct icmp i;
+ struct sockaddr s;
+ struct sockaddr_in si;
+ struct ip ip;
+ i.icmp_type = ICMP_ECHO;
+ i.icmp_code = 0;
+ i.icmp_cksum = 0;
+ i.icmp_id = 0;
+ i.icmp_seq = 0;
+ si.sin_family = AF_INET;
+ #if defined(__DECC) || defined(_IP_VHL)
+ ip.ip_vhl = 0;
+ #else
+ ip.ip_hl = 0;
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_have_icmp=yes
+else
+ ac_cv_have_icmp=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_icmp" >&5
+$as_echo "$ac_cv_have_icmp" >&6; }
+ if test "$ac_cv_have_icmp" = yes ; then
+ $as_echo "#define HAVE_ICMP 1" >>confdefs.h
+
+ fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct icmphdr" >&5
+$as_echo_n "checking for struct icmphdr... " >&6; }
+if ${ac_cv_have_icmphdr+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+ #include <stdio.h>
+ #include <math.h>
+ #include <unistd.h>
+ #include <limits.h>
+ #include <signal.h>
+ #include <fcntl.h>
+ #include <sys/types.h>
+ #include <sys/time.h>
+ #include <sys/ipc.h>
+ #include <sys/shm.h>
+ #include <sys/socket.h>
+ #include <netinet/in_systm.h>
+ #include <netinet/in.h>
+ #include <netinet/ip.h>
+ #include <netinet/ip_icmp.h>
+ #include <netinet/udp.h>
+ #include <arpa/inet.h>
+ #include <netdb.h>
+int
+main ()
+{
+struct icmphdr i;
+ struct sockaddr s;
+ struct sockaddr_in si;
+ struct ip ip;
+ i.type = ICMP_ECHO;
+ i.code = 0;
+ i.checksum = 0;
+ i.un.echo.id = 0;
+ i.un.echo.sequence = 0;
+ si.sin_family = AF_INET;
+ ip.ip_hl = 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_have_icmphdr=yes
+else
+ ac_cv_have_icmphdr=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_icmphdr" >&5
+$as_echo "$ac_cv_have_icmphdr" >&6; }
+ if test "$ac_cv_have_icmphdr" = yes ; then
+ $as_echo "#define HAVE_ICMPHDR 1" >>confdefs.h
+
+ fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for getifaddrs" >&5
+$as_echo_n "checking for getifaddrs... " >&6; }
+if ${ac_cv_have_getifaddrs+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+ #include <unistd.h>
+ #include <arpa/inet.h>
+ #include <ifaddrs.h>
+int
+main ()
+{
+struct ifaddrs *ifa;
+ getifaddrs (&ifa);
+ ifa->ifa_next = 0;
+ ifa->ifa_addr->sa_family = 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_have_getifaddrs=yes
+else
+ ac_cv_have_getifaddrs=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_getifaddrs" >&5
+$as_echo "$ac_cv_have_getifaddrs" >&6; }
+ if test "$ac_cv_have_getifaddrs" = yes ; then
+ $as_echo "#define HAVE_GETIFADDRS 1" >>confdefs.h
+
+ fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for socklen_t" >&5
+$as_echo_n "checking for socklen_t... " >&6; }
+if ${ac_cv_type_socklen_t+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <sys/types.h>
+ #include <sys/socket.h>
+int
+main ()
+{
+
+ socklen_t socklen;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_type_socklen_t=yes
+else
+ ac_cv_type_socklen_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_socklen_t" >&5
+$as_echo "$ac_cv_type_socklen_t" >&6; }
+ if test "$ac_cv_type_socklen_t" != yes; then
+
+$as_echo "#define socklen_t int" >>confdefs.h
+
+ fi
+for ac_header in crypt.h sys/select.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+for ac_prog in perl5 perl
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PERL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $PERL in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PERL="$PERL" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PERL=$ac_cv_path_PERL
+if test -n "$PERL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5
+$as_echo "$PERL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$PERL" && break
+done
+
+ if test -z "$PERL" ; then
+ PERL_VERSION=0
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking perl version" >&5
+$as_echo_n "checking perl version... " >&6; }
+if ${ac_cv_perl_version+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_perl_version=`$PERL -e "$perl_version_cmd"`
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_perl_version" >&5
+$as_echo "$ac_cv_perl_version" >&6; }
+ PERL_VERSION=$ac_cv_perl_version
+ fi
+
+
+if test -z "$PERL" ; then
+ # don't let it be blank...
+ PERL=/usr/bin/perl
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5
+$as_echo_n "checking for X... " >&6; }
+
+
+# Check whether --with-x was given.
+if test "${with_x+set}" = set; then :
+ withval=$with_x;
+fi
+
+# $have_x is `yes', `no', `disabled', or empty when we do not yet know.
+if test "x$with_x" = xno; then
+ # The user explicitly disabled X.
+ have_x=disabled
+else
+ case $x_includes,$x_libraries in #(
+ *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #(
+ *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # One or both of the vars are not set, and there is no cached value.
+ac_x_includes=no ac_x_libraries=no
+rm -f -r conftest.dir
+if mkdir conftest.dir; then
+ cd conftest.dir
+ cat >Imakefile <<'_ACEOF'
+incroot:
+ @echo incroot='${INCROOT}'
+usrlibdir:
+ @echo usrlibdir='${USRLIBDIR}'
+libdir:
+ @echo libdir='${LIBDIR}'
+_ACEOF
+ if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then
+ # GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+ for ac_var in incroot usrlibdir libdir; do
+ eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`"
+ done
+ # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
+ for ac_extension in a so sl dylib la dll; do
+ if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" &&
+ test -f "$ac_im_libdir/libX11.$ac_extension"; then
+ ac_im_usrlibdir=$ac_im_libdir; break
+ fi
+ done
+ # Screen out bogus values from the imake configuration. They are
+ # bogus both because they are the default anyway, and because
+ # using them would break gcc on systems where it needs fixed includes.
+ case $ac_im_incroot in
+ /usr/include) ac_x_includes= ;;
+ *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;;
+ esac
+ case $ac_im_usrlibdir in
+ /usr/lib | /usr/lib64 | /lib | /lib64) ;;
+ *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;;
+ esac
+ fi
+ cd ..
+ rm -f -r conftest.dir
+fi
+
+# Standard set of common directories for X headers.
+# Check X11 before X11Rn because it is often a symlink to the current release.
+ac_x_header_dirs='
+/usr/X11/include
+/usr/X11R7/include
+/usr/X11R6/include
+/usr/X11R5/include
+/usr/X11R4/include
+
+/usr/include/X11
+/usr/include/X11R7
+/usr/include/X11R6
+/usr/include/X11R5
+/usr/include/X11R4
+
+/usr/local/X11/include
+/usr/local/X11R7/include
+/usr/local/X11R6/include
+/usr/local/X11R5/include
+/usr/local/X11R4/include
+
+/usr/local/include/X11
+/usr/local/include/X11R7
+/usr/local/include/X11R6
+/usr/local/include/X11R5
+/usr/local/include/X11R4
+
+/usr/X386/include
+/usr/x386/include
+/usr/XFree86/include/X11
+
+/usr/include
+/usr/local/include
+/usr/unsupported/include
+/usr/athena/include
+/usr/local/x11r5/include
+/usr/lpp/Xamples/include
+
+/usr/openwin/include
+/usr/openwin/share/include'
+
+if test "$ac_x_includes" = no; then
+ # Guess where to find include files, by looking for Xlib.h.
+ # First, try using that file with no special directory specified.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <X11/Xlib.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # We can compile using X headers with no special include directory.
+ac_x_includes=
+else
+ for ac_dir in $ac_x_header_dirs; do
+ if test -r "$ac_dir/X11/Xlib.h"; then
+ ac_x_includes=$ac_dir
+ break
+ fi
+done
+fi
+rm -rf conftest.err conftest.i conftest.$ac_ext
+fi # $ac_x_includes = no
+
+if test "$ac_x_libraries" = no; then
+ # Check for the libraries.
+ # See if we find them without any special options.
+ # Don't add to $LIBS permanently.
+ ac_save_LIBS=$LIBS
+ LIBS="-lX11 $LIBS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <X11/Xlib.h>
+int
+main ()
+{
+XrmInitialize ()
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ LIBS=$ac_save_LIBS
+# We can link X programs with no special library path.
+ac_x_libraries=
+else
+ LIBS=$ac_save_LIBS
+for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g`
+do
+ # Don't even attempt the hair of trying to link an X program!
+ for ac_extension in a so sl dylib la dll; do
+ if test -r "$ac_dir/libX11.$ac_extension"; then
+ ac_x_libraries=$ac_dir
+ break 2
+ fi
+ done
+done
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi # $ac_x_libraries = no
+
+case $ac_x_includes,$ac_x_libraries in #(
+ no,* | *,no | *\'*)
+ # Didn't find X, or a directory has "'" in its name.
+ ac_cv_have_x="have_x=no";; #(
+ *)
+ # Record where we found X for the cache.
+ ac_cv_have_x="have_x=yes\
+ ac_x_includes='$ac_x_includes'\
+ ac_x_libraries='$ac_x_libraries'"
+esac
+fi
+;; #(
+ *) have_x=yes;;
+ esac
+ eval "$ac_cv_have_x"
+fi # $with_x != no
+
+if test "$have_x" != yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5
+$as_echo "$have_x" >&6; }
+ no_x=yes
+else
+ # If each of the values was on the command line, it overrides each guess.
+ test "x$x_includes" = xNONE && x_includes=$ac_x_includes
+ test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries
+ # Update the cache value to reflect the command line values.
+ ac_cv_have_x="have_x=yes\
+ ac_x_includes='$x_includes'\
+ ac_x_libraries='$x_libraries'"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5
+$as_echo "libraries $x_libraries, headers $x_includes" >&6; }
+fi
+
+if test "$no_x" = yes; then
+ # Not all programs may use this symbol, but it does not hurt to define it.
+
+$as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h
+
+ X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS=
+else
+ if test -n "$x_includes"; then
+ X_CFLAGS="$X_CFLAGS -I$x_includes"
+ fi
+
+ # It would also be nice to do this for all -L options, not just this one.
+ if test -n "$x_libraries"; then
+ X_LIBS="$X_LIBS -L$x_libraries"
+ # For Solaris; some versions of Sun CC require a space after -R and
+ # others require no space. Words are not sufficient . . . .
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5
+$as_echo_n "checking whether -R must be followed by a space... " >&6; }
+ ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries"
+ ac_xsave_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ X_LIBS="$X_LIBS -R$x_libraries"
+else
+ LIBS="$ac_xsave_LIBS -R $x_libraries"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ X_LIBS="$X_LIBS -R $x_libraries"
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5
+$as_echo "neither works" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_c_werror_flag=$ac_xsave_c_werror_flag
+ LIBS=$ac_xsave_LIBS
+ fi
+
+ # Check for system-dependent libraries X programs must link with.
+ # Do this before checking for the system-independent R6 libraries
+ # (-lICE), since we may need -lsocket or whatever for X linking.
+
+ if test "$ISC" = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet"
+ else
+ # Martyn Johnson says this is needed for Ultrix, if the X
+ # libraries were built with DECnet support. And Karl Berry says
+ # the Alpha needs dnet_stub (dnet does not exist).
+ ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XOpenDisplay ();
+int
+main ()
+{
+return XOpenDisplay ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5
+$as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; }
+if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldnet $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dnet_ntoa ();
+int
+main ()
+{
+return dnet_ntoa ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dnet_dnet_ntoa=yes
+else
+ ac_cv_lib_dnet_dnet_ntoa=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5
+$as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; }
+if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then :
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"
+fi
+
+ if test $ac_cv_lib_dnet_dnet_ntoa = no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5
+$as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; }
+if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldnet_stub $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dnet_ntoa ();
+int
+main ()
+{
+return dnet_ntoa ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dnet_stub_dnet_ntoa=yes
+else
+ ac_cv_lib_dnet_stub_dnet_ntoa=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5
+$as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; }
+if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then :
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"
+fi
+
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$ac_xsave_LIBS"
+
+ # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT,
+ # to get the SysV transport functions.
+ # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4)
+ # needs -lnsl.
+ # The nsl library prevents programs from opening the X display
+ # on Irix 5.2, according to T.E. Dickey.
+ # The functions gethostbyname, getservbyname, and inet_addr are
+ # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking.
+ ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname"
+if test "x$ac_cv_func_gethostbyname" = xyes; then :
+
+fi
+
+ if test $ac_cv_func_gethostbyname = no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5
+$as_echo_n "checking for gethostbyname in -lnsl... " >&6; }
+if ${ac_cv_lib_nsl_gethostbyname+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gethostbyname ();
+int
+main ()
+{
+return gethostbyname ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_nsl_gethostbyname=yes
+else
+ ac_cv_lib_nsl_gethostbyname=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5
+$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; }
+if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then :
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl"
+fi
+
+ if test $ac_cv_lib_nsl_gethostbyname = no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5
+$as_echo_n "checking for gethostbyname in -lbsd... " >&6; }
+if ${ac_cv_lib_bsd_gethostbyname+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbsd $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gethostbyname ();
+int
+main ()
+{
+return gethostbyname ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_bsd_gethostbyname=yes
+else
+ ac_cv_lib_bsd_gethostbyname=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5
+$as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; }
+if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then :
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd"
+fi
+
+ fi
+ fi
+
+ # lieder@skyler.mavd.honeywell.com says without -lsocket,
+ # socket/setsockopt and other routines are undefined under SCO ODT
+ # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary
+ # on later versions), says Simon Leinen: it contains gethostby*
+ # variants that don't use the name server (or something). -lsocket
+ # must be given before -lnsl if both are needed. We assume that
+ # if connect needs -lnsl, so does gethostbyname.
+ ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect"
+if test "x$ac_cv_func_connect" = xyes; then :
+
+fi
+
+ if test $ac_cv_func_connect = no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5
+$as_echo_n "checking for connect in -lsocket... " >&6; }
+if ${ac_cv_lib_socket_connect+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char connect ();
+int
+main ()
+{
+return connect ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_socket_connect=yes
+else
+ ac_cv_lib_socket_connect=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5
+$as_echo "$ac_cv_lib_socket_connect" >&6; }
+if test "x$ac_cv_lib_socket_connect" = xyes; then :
+ X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS"
+fi
+
+ fi
+
+ # Guillermo Gomez says -lposix is necessary on A/UX.
+ ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove"
+if test "x$ac_cv_func_remove" = xyes; then :
+
+fi
+
+ if test $ac_cv_func_remove = no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5
+$as_echo_n "checking for remove in -lposix... " >&6; }
+if ${ac_cv_lib_posix_remove+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lposix $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char remove ();
+int
+main ()
+{
+return remove ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_posix_remove=yes
+else
+ ac_cv_lib_posix_remove=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5
+$as_echo "$ac_cv_lib_posix_remove" >&6; }
+if test "x$ac_cv_lib_posix_remove" = xyes; then :
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix"
+fi
+
+ fi
+
+ # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
+ ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat"
+if test "x$ac_cv_func_shmat" = xyes; then :
+
+fi
+
+ if test $ac_cv_func_shmat = no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5
+$as_echo_n "checking for shmat in -lipc... " >&6; }
+if ${ac_cv_lib_ipc_shmat+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lipc $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shmat ();
+int
+main ()
+{
+return shmat ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_ipc_shmat=yes
+else
+ ac_cv_lib_ipc_shmat=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5
+$as_echo "$ac_cv_lib_ipc_shmat" >&6; }
+if test "x$ac_cv_lib_ipc_shmat" = xyes; then :
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc"
+fi
+
+ fi
+ fi
+
+ # Check for libraries that X11R6 Xt/Xaw programs need.
+ ac_save_LDFLAGS=$LDFLAGS
+ test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries"
+ # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to
+ # check for ICE first), but we must link in the order -lSM -lICE or
+ # we get undefined symbols. So assume we have SM if we have ICE.
+ # These have to be linked with before -lX11, unlike the other
+ # libraries we check for below, so use a different variable.
+ # John Interrante, Karl Berry
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5
+$as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; }
+if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lICE $X_EXTRA_LIBS $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char IceConnectionNumber ();
+int
+main ()
+{
+return IceConnectionNumber ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_ICE_IceConnectionNumber=yes
+else
+ ac_cv_lib_ICE_IceConnectionNumber=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5
+$as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; }
+if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then :
+ X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE"
+fi
+
+ LDFLAGS=$ac_save_LDFLAGS
+
+fi
+
+
+if test "$have_x" != yes; then
+ as_fn_error $? "Couldn't find X11 headers/libs. Try \`$0 --help'." "$LINENO" 5
+fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X app-defaults directory" >&5
+$as_echo_n "checking for X app-defaults directory... " >&6; }
+if ${ac_cv_x_app_defaults+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # skip this, it's always wrong these days.
+ # AC_PATH_X_APP_DEFAULTS_XMKMF
+ if test x"$ac_x_app_defaults" = x; then
+ true
+ # Look for the directory under a standard set of common directories.
+ # Check X11 before X11Rn because it's often a symlink to the current release.
+ for ac_dir in \
+ \
+ /usr/share/X11/app-defaults \
+ \
+ /usr/X11/lib/app-defaults \
+ /usr/X11R6/lib/app-defaults \
+ /usr/X11R6/lib/X11/app-defaults \
+ /usr/X11R5/lib/app-defaults \
+ /usr/X11R5/lib/X11/app-defaults \
+ /usr/X11R4/lib/app-defaults \
+ /usr/X11R4/lib/X11/app-defaults \
+ \
+ /usr/lib/X11/app-defaults \
+ /usr/lib/X11R6/app-defaults \
+ /usr/lib/X11R5/app-defaults \
+ /usr/lib/X11R4/app-defaults \
+ \
+ /etc/X11/app-defaults \
+ \
+ /usr/local/X11/lib/app-defaults \
+ /usr/local/X11R6/lib/app-defaults \
+ /usr/local/X11R5/lib/app-defaults \
+ /usr/local/X11R4/lib/app-defaults \
+ \
+ /usr/local/lib/X11/app-defaults \
+ /usr/local/lib/X11R6/app-defaults \
+ /usr/local/lib/X11R6/X11/app-defaults \
+ /usr/local/lib/X11R5/app-defaults \
+ /usr/local/lib/X11R5/X11/app-defaults \
+ /usr/local/lib/X11R4/app-defaults \
+ /usr/local/lib/X11R4/X11/app-defaults \
+ \
+ /usr/X386/lib/X11/app-defaults \
+ /usr/x386/lib/X11/app-defaults \
+ /usr/XFree86/lib/X11/app-defaults \
+ \
+ /usr/lib/X11/app-defaults \
+ /usr/local/lib/X11/app-defaults \
+ /usr/unsupported/lib/X11/app-defaults \
+ /usr/athena/lib/X11/app-defaults \
+ /usr/local/x11r5/lib/X11/app-defaults \
+ /usr/lpp/Xamples/lib/X11/app-defaults \
+ /lib/usr/lib/X11/app-defaults \
+ \
+ /usr/openwin/lib/app-defaults \
+ /usr/openwin/lib/X11/app-defaults \
+ /usr/openwin/share/lib/app-defaults \
+ /usr/openwin/share/lib/X11/app-defaults \
+ \
+ /X11R6/lib/app-defaults \
+ /X11R5/lib/app-defaults \
+ /X11R4/lib/app-defaults \
+ ; \
+ do
+ if test -d "$ac_dir"; then
+ ac_x_app_defaults=$ac_dir
+ break
+ fi
+ done
+
+ fi
+ if test x"$ac_x_app_defaults" = x; then
+ /bin/echo -n 'fallback: '
+ ac_cv_x_app_defaults="/usr/lib/X11/app-defaults"
+ else
+ # Record where we found app-defaults for the cache.
+ ac_cv_x_app_defaults="$ac_x_app_defaults"
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_x_app_defaults" >&5
+$as_echo "$ac_cv_x_app_defaults" >&6; }
+ eval ac_x_app_defaults="$ac_cv_x_app_defaults"
+case "$host" in
+ *-hpux*)
+
+ # The following arcana was gleaned from conversations with
+ # Eric Schwartz <erics@col.hp.com>:
+ #
+ # On HPUX 10.x, the parts of X that HP considers "standard" live in
+ # /usr/{include,lib}/X11R6/. The parts that HP doesn't consider
+ # "standard", notably, Xaw and Xmu, live in /usr/contrib/X11R6/.
+ # Yet /usr/contrib/X11R6/ comes preinstalled on all HPUX systems.
+ # Also, there are symlinks from /usr/include/ and /usr/lib/ into
+ # /usr/{include,lib}/X11R6/, so that (if you don't use Xmu at all)
+ # you don't need any -I or -L arguments.
+ #
+ # On HPUX 9.x, /usr/{include,lib}/X11R5/ and /usr/contrib/X11R5/
+ # are the same division as 10.x. However, there are no symlinks to
+ # the X stuff from /usr/include/ and /usr/lib/, so -I and -L
+ # arguments are always necessary.
+ #
+ # However, X11R6 was available on HPUX 9.x as a patch: if that
+ # patch was installed, then all of X11R6 went in to
+ # /usr/contrib/X11R6/ (there was no /usr/{include,lib}/X11R6/.)
+ #
+ # HPUX 8.x was the same as 9.x, but was X11R4 instead (I don't know
+ # whether R5 was available as a patch; R6 undoubtedly was not.)
+ #
+ # So. We try and use the highest numbered pair of
+ # /usr/{include,lib}/X11R?/ and /usr/contrib/X11R?/{include,lib}/
+ # that are available. We do not mix and match different versions
+ # of X.
+ #
+ # Question I still don't know the answer to: (do you?)
+ #
+ # * On HPUX 9.x, where /usr/include/X11R5/ was standard, and
+ # /usr/contrib/X11R6/ could be installed as a patch, what was in
+ # that contrib directory? Did it contain so-called "standard"
+ # X11R6, or did it include Xaw and Xmu as well? If the former,
+ # where did one find Xaw and Xmu on 9.x R6 systems? Would this
+ # be a situation where one had to reach into the R5 headers and
+ # libs to find Xmu? That is, must both R6 and R5 directories
+ # be on the -I and -L lists in that case?
+ #
+ for version in X11R6 X11R5 X11R4 ; do
+ # if either pair of directories exists...
+ if test -d /usr/include/$version || test -d /usr/contrib/$version/include
+ then
+ # if contrib exists, use it...
+ if test -d /usr/contrib/$version/include ; then
+ X_CFLAGS="$X_CFLAGS -I/usr/contrib/$version/include"
+ X_LIBS="$X_LIBS -L/usr/contrib/$version/lib"
+ fi
+ # if the "standard" one exists, use it.
+ if test -d /usr/include/$version ; then
+ X_CFLAGS="$X_CFLAGS -I/usr/include/$version"
+ X_LIBS="$X_LIBS -L/usr/lib/$version"
+ fi
+ # since at least one of the pair exists, go no farther.
+ break
+ fi
+ done
+
+ # Now find Motif. Thanks for not making xmkmf find this by
+ # default, you losers.
+ #
+ if test -d /usr/include/Motif2.1 ; then
+ X_CFLAGS="$X_CFLAGS -I/usr/include/Motif2.1"
+ X_LIBS="$X_LIBS -L/usr/lib/Motif2.1"
+ elif test -d /usr/include/Motif1.2 ; then
+ X_CFLAGS="$X_CFLAGS -I/usr/include/Motif1.2"
+ X_LIBS="$X_LIBS -L/usr/lib/Motif1.2"
+ elif test -d /usr/include/Motif1.1 ; then
+ X_CFLAGS="$X_CFLAGS -I/usr/include/Motif1.1"
+ X_LIBS="$X_LIBS -L/usr/lib/Motif1.1"
+ fi
+
+ # Now let's check for the pseudo-standard locations for OpenGL.
+ #
+ if test -d /opt/graphics/OpenGL/include ; then
+ # HP-UX 10.20 puts it here
+ X_CFLAGS="-I/opt/graphics/OpenGL/include $X_CFLAGS"
+ X_LIBS="-L/opt/graphics/OpenGL/lib $X_LIBS"
+ elif test -d /opt/Mesa/lib ; then
+ X_CFLAGS="-I/opt/Mesa/include $X_CFLAGS"
+ X_LIBS="-L/opt/Mesa/lib $X_LIBS"
+ fi
+
+
+ # On HPUX, default to installing in /opt/xscreensaver/ instead of
+ # in /usr/local/, unless there is already an xscreensaver in
+ # /usr/local/bin/. This can be overridden with the --prefix arg
+ # to configure. I'm not sure this is the right thing to do, but
+ # Richard Lloyd says so...
+ #
+ if test \! -x /usr/local/bin/xscreensaver ; then
+ ac_default_prefix=/opt/xscreensaver
+ fi
+
+ ;;
+ *-solaris*)
+
+ # Thanks for not making xmkmf find this by default, pinheads.
+ # And thanks for moving things around again, too. Is this
+ # really the standard location now? What happened to the
+ # joke that this kind of thing went in /opt?
+ # cthomp says "answer: CDE (Common Disorganized Environment)"
+ #
+ if test -f /usr/dt/include/Xm/Xm.h ; then
+ X_CFLAGS="$X_CFLAGS -I/usr/dt/include"
+ MOTIF_LIBS="$MOTIF_LIBS -L/usr/dt/lib -R/usr/dt/lib"
+
+ # Some versions of Slowlaris Motif require -lgen. But not all. Why?
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for regcmp in -lgen" >&5
+$as_echo_n "checking for regcmp in -lgen... " >&6; }
+if ${ac_cv_lib_gen_regcmp+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgen $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char regcmp ();
+int
+main ()
+{
+return regcmp ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_gen_regcmp=yes
+else
+ ac_cv_lib_gen_regcmp=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gen_regcmp" >&5
+$as_echo "$ac_cv_lib_gen_regcmp" >&6; }
+if test "x$ac_cv_lib_gen_regcmp" = xyes; then :
+ MOTIF_LIBS="$MOTIF_LIBS -lgen"
+fi
+
+ fi
+
+ ;;
+ *-darwin*)
+
+ # On MacOS X (10.x with "fink"), many things are under /sw/.
+ #
+ if test -d /sw/include ; then
+ X_CFLAGS="-I/sw/include $X_CFLAGS"
+ X_LIBS="-L/sw/lib $X_LIBS"
+ fi
+ ;;
+ esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XPointer" >&5
+$as_echo_n "checking for XPointer... " >&6; }
+if ${ac_cv_xpointer+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <X11/Xlib.h>
+int
+main ()
+{
+XPointer foo = (XPointer) 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_xpointer=yes
+else
+ ac_cv_xpointer=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_xpointer" >&5
+$as_echo "$ac_cv_xpointer" >&6; }
+ if test "$ac_cv_xpointer" != yes; then
+ $as_echo "#define XPointer char*" >>confdefs.h
+
+ fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether this is MacOS X" >&5
+$as_echo_n "checking whether this is MacOS X... " >&6; }
+ ac_macosx=no
+ case "$host" in
+ *-apple-darwin* )
+ ac_macosx=yes
+ ;;
+ esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_macosx" >&5
+$as_echo "$ac_macosx" >&6; }
+
+
+###############################################################################
+#
+# Gettext support
+#
+###############################################################################
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5
+$as_echo_n "checking whether NLS is requested... " >&6; }
+ # Check whether --enable-nls was given.
+if test "${enable_nls+set}" = set; then :
+ enableval=$enable_nls; USE_NLS=$enableval
+else
+ USE_NLS=yes
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
+$as_echo "$USE_NLS" >&6; }
+
+
+
+
+case "$am__api_version" in
+ 1.01234)
+ as_fn_error $? "Automake 1.5 or newer is required to use intltool" "$LINENO" 5
+ ;;
+ *)
+ ;;
+esac
+
+INTLTOOL_REQUIRED_VERSION_AS_INT=`echo | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'`
+INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3`
+INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'`
+if test -n ""; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intltool >= " >&5
+$as_echo_n "checking for intltool >= ... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_APPLIED_VERSION found" >&5
+$as_echo "$INTLTOOL_APPLIED_VERSION found" >&6; }
+ test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" ||
+ as_fn_error $? "Your intltool is too old. You need intltool or later." "$LINENO" 5
+fi
+
+# Extract the first word of "intltool-update", so it can be a program name with args.
+set dummy intltool-update; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_INTLTOOL_UPDATE+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $INTLTOOL_UPDATE in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_INTLTOOL_UPDATE="$INTLTOOL_UPDATE" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_INTLTOOL_UPDATE="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+INTLTOOL_UPDATE=$ac_cv_path_INTLTOOL_UPDATE
+if test -n "$INTLTOOL_UPDATE"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_UPDATE" >&5
+$as_echo "$INTLTOOL_UPDATE" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+# Extract the first word of "intltool-merge", so it can be a program name with args.
+set dummy intltool-merge; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_INTLTOOL_MERGE+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $INTLTOOL_MERGE in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_INTLTOOL_MERGE="$INTLTOOL_MERGE" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_INTLTOOL_MERGE="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+INTLTOOL_MERGE=$ac_cv_path_INTLTOOL_MERGE
+if test -n "$INTLTOOL_MERGE"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_MERGE" >&5
+$as_echo "$INTLTOOL_MERGE" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+# Extract the first word of "intltool-extract", so it can be a program name with args.
+set dummy intltool-extract; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_INTLTOOL_EXTRACT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $INTLTOOL_EXTRACT in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_INTLTOOL_EXTRACT="$INTLTOOL_EXTRACT" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_INTLTOOL_EXTRACT="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+INTLTOOL_EXTRACT=$ac_cv_path_INTLTOOL_EXTRACT
+if test -n "$INTLTOOL_EXTRACT"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_EXTRACT" >&5
+$as_echo "$INTLTOOL_EXTRACT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then
+ as_fn_error $? "The intltool scripts were not found. Please install intltool." "$LINENO" 5
+fi
+
+if test -z "$AM_DEFAULT_VERBOSITY"; then
+ AM_DEFAULT_VERBOSITY=1
+fi
+
+
+INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))'
+INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))'
+INTLTOOL__v_MERGE_0='@echo " ITMRG " $@;'
+
+
+
+
+INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))'
+intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))'
+intltool__v_merge_options_0='-q'
+
+
+
+
+ INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+ INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+ INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+ INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< $@'
+ INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+ INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+ INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+ INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+ INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+if test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge 5000; then
+ INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< $@'
+else
+ INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.$$RANDOM && mkdir $$_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u $$_it_tmp_dir $< $@ && rmdir $$_it_tmp_dir'
+fi
+ INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+ INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+ INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+ INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+ INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+ INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+ INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check the gettext tools to make sure they are GNU
+# Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_XGETTEXT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $XGETTEXT in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_XGETTEXT="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+XGETTEXT=$ac_cv_path_XGETTEXT
+if test -n "$XGETTEXT"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5
+$as_echo "$XGETTEXT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+# Extract the first word of "msgmerge", so it can be a program name with args.
+set dummy msgmerge; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_MSGMERGE+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $MSGMERGE in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_MSGMERGE="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+MSGMERGE=$ac_cv_path_MSGMERGE
+if test -n "$MSGMERGE"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5
+$as_echo "$MSGMERGE" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+# Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_MSGFMT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $MSGFMT in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_MSGFMT="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+MSGFMT=$ac_cv_path_MSGFMT
+if test -n "$MSGFMT"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5
+$as_echo "$MSGFMT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+# Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GMSGFMT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $GMSGFMT in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+ ;;
+esac
+fi
+GMSGFMT=$ac_cv_path_GMSGFMT
+if test -n "$GMSGFMT"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5
+$as_echo "$GMSGFMT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then
+ as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5
+fi
+xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`"
+mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`"
+mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`"
+if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then
+ as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5
+fi
+
+# Substitute ALL_LINGUAS so we can use it in po/Makefile
+
+
+
+
+
+GETTEXT_PACKAGE=xscreensaver
+
+cat >>confdefs.h <<_ACEOF
+#define GETTEXT_PACKAGE "$GETTEXT_PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$GETTEXT_PACKAGE"
+_ACEOF
+
+
+
+ALL_LINGUAS="da de es et fi fr hu it ja ko nb nl pl pt pt_BR ru sk sv vi wa zh_CN zh_TW"
+
+ for ac_header in locale.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default"
+if test "x$ac_cv_header_locale_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LOCALE_H 1
+_ACEOF
+
+fi
+
+done
+
+ if test $ac_cv_header_locale_h = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES" >&5
+$as_echo_n "checking for LC_MESSAGES... " >&6; }
+if ${am_cv_val_LC_MESSAGES+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <locale.h>
+int
+main ()
+{
+return LC_MESSAGES
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ am_cv_val_LC_MESSAGES=yes
+else
+ am_cv_val_LC_MESSAGES=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_val_LC_MESSAGES" >&5
+$as_echo "$am_cv_val_LC_MESSAGES" >&6; }
+ if test $am_cv_val_LC_MESSAGES = yes; then
+
+$as_echo "#define HAVE_LC_MESSAGES 1" >>confdefs.h
+
+ fi
+ fi
+ USE_NLS=yes
+
+
+ gt_cv_have_gettext=no
+
+ CATOBJEXT=NONE
+ XGETTEXT=:
+ INTLLIBS=
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5
+$as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; }
+if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ gt_save_LIBS="$LIBS"
+ LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <CoreFoundation/CFPreferences.h>
+int
+main ()
+{
+CFPreferencesCopyAppValue(NULL, NULL)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ gt_cv_func_CFPreferencesCopyAppValue=yes
+else
+ gt_cv_func_CFPreferencesCopyAppValue=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$gt_save_LIBS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5
+$as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; }
+ if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
+
+$as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h
+
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5
+$as_echo_n "checking for CFLocaleCopyCurrent... " >&6; }
+if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ gt_save_LIBS="$LIBS"
+ LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <CoreFoundation/CFLocale.h>
+int
+main ()
+{
+CFLocaleCopyCurrent();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ gt_cv_func_CFLocaleCopyCurrent=yes
+else
+ gt_cv_func_CFLocaleCopyCurrent=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$gt_save_LIBS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5
+$as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; }
+ if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+
+$as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h
+
+ fi
+ INTL_MACOSX_LIBS=
+ if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+ INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
+ fi
+
+
+
+ ac_fn_c_check_header_mongrel "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default"
+if test "x$ac_cv_header_libintl_h" = xyes; then :
+ gt_cv_func_dgettext_libintl="no"
+ libintl_extra_libs=""
+
+ #
+ # First check in libc
+ #
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in libc" >&5
+$as_echo_n "checking for ngettext in libc... " >&6; }
+if ${gt_cv_func_ngettext_libc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <libintl.h>
+
+int
+main ()
+{
+return !ngettext ("","", 1)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ gt_cv_func_ngettext_libc=yes
+else
+ gt_cv_func_ngettext_libc=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_ngettext_libc" >&5
+$as_echo "$gt_cv_func_ngettext_libc" >&6; }
+
+ if test "$gt_cv_func_ngettext_libc" = "yes" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in libc" >&5
+$as_echo_n "checking for dgettext in libc... " >&6; }
+if ${gt_cv_func_dgettext_libc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <libintl.h>
+
+int
+main ()
+{
+return !dgettext ("","")
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ gt_cv_func_dgettext_libc=yes
+else
+ gt_cv_func_dgettext_libc=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_dgettext_libc" >&5
+$as_echo "$gt_cv_func_dgettext_libc" >&6; }
+ fi
+
+ if test "$gt_cv_func_ngettext_libc" = "yes" ; then
+ for ac_func in bind_textdomain_codeset
+do :
+ ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset"
+if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_BIND_TEXTDOMAIN_CODESET 1
+_ACEOF
+
+fi
+done
+
+ fi
+
+ #
+ # If we don't have everything we want, check in libintl
+ #
+ if test "$gt_cv_func_dgettext_libc" != "yes" \
+ || test "$gt_cv_func_ngettext_libc" != "yes" \
+ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bindtextdomain in -lintl" >&5
+$as_echo_n "checking for bindtextdomain in -lintl... " >&6; }
+if ${ac_cv_lib_intl_bindtextdomain+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lintl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char bindtextdomain ();
+int
+main ()
+{
+return bindtextdomain ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_intl_bindtextdomain=yes
+else
+ ac_cv_lib_intl_bindtextdomain=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_bindtextdomain" >&5
+$as_echo "$ac_cv_lib_intl_bindtextdomain" >&6; }
+if test "x$ac_cv_lib_intl_bindtextdomain" = xyes; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5
+$as_echo_n "checking for ngettext in -lintl... " >&6; }
+if ${ac_cv_lib_intl_ngettext+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lintl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ngettext ();
+int
+main ()
+{
+return ngettext ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_intl_ngettext=yes
+else
+ ac_cv_lib_intl_ngettext=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5
+$as_echo "$ac_cv_lib_intl_ngettext" >&6; }
+if test "x$ac_cv_lib_intl_ngettext" = xyes; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in -lintl" >&5
+$as_echo_n "checking for dgettext in -lintl... " >&6; }
+if ${ac_cv_lib_intl_dgettext+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lintl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dgettext ();
+int
+main ()
+{
+return dgettext ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_intl_dgettext=yes
+else
+ ac_cv_lib_intl_dgettext=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dgettext" >&5
+$as_echo "$ac_cv_lib_intl_dgettext" >&6; }
+if test "x$ac_cv_lib_intl_dgettext" = xyes; then :
+ gt_cv_func_dgettext_libintl=yes
+fi
+
+fi
+
+fi
+
+
+ if test "$gt_cv_func_dgettext_libintl" != "yes" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if -liconv is needed to use gettext" >&5
+$as_echo_n "checking if -liconv is needed to use gettext... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5
+$as_echo_n "checking for ngettext in -lintl... " >&6; }
+if ${ac_cv_lib_intl_ngettext+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lintl -liconv $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ngettext ();
+int
+main ()
+{
+return ngettext ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_intl_ngettext=yes
+else
+ ac_cv_lib_intl_ngettext=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5
+$as_echo "$ac_cv_lib_intl_ngettext" >&6; }
+if test "x$ac_cv_lib_intl_ngettext" = xyes; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dcgettext in -lintl" >&5
+$as_echo_n "checking for dcgettext in -lintl... " >&6; }
+if ${ac_cv_lib_intl_dcgettext+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lintl -liconv $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dcgettext ();
+int
+main ()
+{
+return dcgettext ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_intl_dcgettext=yes
+else
+ ac_cv_lib_intl_dcgettext=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dcgettext" >&5
+$as_echo "$ac_cv_lib_intl_dcgettext" >&6; }
+if test "x$ac_cv_lib_intl_dcgettext" = xyes; then :
+ gt_cv_func_dgettext_libintl=yes
+ libintl_extra_libs=-liconv
+else
+ :
+fi
+
+else
+ :
+fi
+
+ fi
+
+ #
+ # If we found libintl, then check in it for bind_textdomain_codeset();
+ # we'll prefer libc if neither have bind_textdomain_codeset(),
+ # and both have dgettext and ngettext
+ #
+ if test "$gt_cv_func_dgettext_libintl" = "yes" ; then
+ glib_save_LIBS="$LIBS"
+ LIBS="$LIBS -lintl $libintl_extra_libs"
+ unset ac_cv_func_bind_textdomain_codeset
+ for ac_func in bind_textdomain_codeset
+do :
+ ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset"
+if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_BIND_TEXTDOMAIN_CODESET 1
+_ACEOF
+
+fi
+done
+
+ LIBS="$glib_save_LIBS"
+
+ if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then
+ gt_cv_func_dgettext_libc=no
+ else
+ if test "$gt_cv_func_dgettext_libc" = "yes" \
+ && test "$gt_cv_func_ngettext_libc" = "yes"; then
+ gt_cv_func_dgettext_libintl=no
+ fi
+ fi
+ fi
+ fi
+
+ if test "$gt_cv_func_dgettext_libc" = "yes" \
+ || test "$gt_cv_func_dgettext_libintl" = "yes"; then
+ gt_cv_have_gettext=yes
+ fi
+
+ if test "$gt_cv_func_dgettext_libintl" = "yes"; then
+ INTLLIBS="-lintl $libintl_extra_libs $INTL_MACOSX_LIBS"
+ fi
+
+ if test "$gt_cv_have_gettext" = "yes"; then
+
+$as_echo "#define HAVE_GETTEXT 1" >>confdefs.h
+
+ # Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_MSGFMT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case "$MSGFMT" in
+ /*)
+ ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then
+ ac_cv_path_MSGFMT="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no"
+ ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test "$MSGFMT" != "no"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5
+$as_echo "$MSGFMT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+ if test "$MSGFMT" != "no"; then
+ glib_save_LIBS="$LIBS"
+ LIBS="$LIBS $INTLLIBS"
+ for ac_func in dcgettext
+do :
+ ac_fn_c_check_func "$LINENO" "dcgettext" "ac_cv_func_dcgettext"
+if test "x$ac_cv_func_dcgettext" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DCGETTEXT 1
+_ACEOF
+
+fi
+done
+
+ MSGFMT_OPTS=
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if msgfmt accepts -c" >&5
+$as_echo_n "checking if msgfmt accepts -c... " >&6; }
+ cat >conftest.foo <<_ACEOF
+
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: test 1.0\n"
+"PO-Revision-Date: 2007-02-15 12:01+0100\n"
+"Last-Translator: test <foo@bar.xx>\n"
+"Language-Team: C <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+_ACEOF
+if { { $as_echo "$as_me:${as_lineno-$LINENO}: \$MSGFMT -c -o /dev/null conftest.foo"; } >&5
+ ($MSGFMT -c -o /dev/null conftest.foo) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ MSGFMT_OPTS=-c; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+echo "$as_me: failed input was:" >&5
+sed 's/^/| /' conftest.foo >&5
+fi
+
+ # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GMSGFMT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $GMSGFMT in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+ ;;
+esac
+fi
+GMSGFMT=$ac_cv_path_GMSGFMT
+if test -n "$GMSGFMT"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5
+$as_echo "$GMSGFMT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ # Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_XGETTEXT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case "$XGETTEXT" in
+ /*)
+ ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then
+ ac_cv_path_XGETTEXT="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+ ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test "$XGETTEXT" != ":"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5
+$as_echo "$XGETTEXT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+extern int _nl_msg_cat_cntr;
+ return _nl_msg_cat_cntr
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ CATOBJEXT=.gmo
+ DATADIRNAME=share
+else
+ case $host in
+ *-*-solaris*)
+ ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset"
+if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then :
+ CATOBJEXT=.gmo
+ DATADIRNAME=share
+else
+ CATOBJEXT=.mo
+ DATADIRNAME=lib
+fi
+
+ ;;
+ *-*-openbsd*)
+ CATOBJEXT=.mo
+ DATADIRNAME=share
+ ;;
+ *)
+ CATOBJEXT=.mo
+ DATADIRNAME=lib
+ ;;
+ esac
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$glib_save_LIBS"
+ INSTOBJEXT=.mo
+ else
+ gt_cv_have_gettext=no
+ fi
+ fi
+
+fi
+
+
+
+ if test "$gt_cv_have_gettext" = "yes" ; then
+
+$as_echo "#define ENABLE_NLS 1" >>confdefs.h
+
+ fi
+
+ if test "$XGETTEXT" != ":"; then
+ if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
+ : ;
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: found xgettext program is not GNU xgettext; ignore it" >&5
+$as_echo "found xgettext program is not GNU xgettext; ignore it" >&6; }
+ XGETTEXT=":"
+ fi
+ fi
+
+ # We need to process the po/ directory.
+ POSUB=po
+
+ ac_config_commands="$ac_config_commands default-1"
+
+
+ for lang in $ALL_LINGUAS; do
+ GMOFILES="$GMOFILES $lang.gmo"
+ POFILES="$POFILES $lang.po"
+ done
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test "$gt_cv_have_gettext" = "yes"; then
+ if test "x$ALL_LINGUAS" = "x"; then
+ LINGUAS=
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for catalogs to be installed" >&5
+$as_echo_n "checking for catalogs to be installed... " >&6; }
+ NEW_LINGUAS=
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then
+ desiredlanguages="$LINGUAS"
+ else
+ desiredlanguages="$ALL_LINGUAS"
+ fi
+ for desiredlang in $desiredlanguages; do
+ # Use the presentlang catalog if desiredlang is
+ # a. equal to presentlang, or
+ # b. a variant of presentlang (because in this case,
+ # presentlang can be used as a fallback for messages
+ # which are not translated in the desiredlang catalog).
+ case "$desiredlang" in
+ "$presentlang"*) useit=yes;;
+ esac
+ done
+ if test $useit = yes; then
+ NEW_LINGUAS="$NEW_LINGUAS $presentlang"
+ fi
+ done
+ LINGUAS=$NEW_LINGUAS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LINGUAS" >&5
+$as_echo "$LINGUAS" >&6; }
+ fi
+
+ if test -n "$LINGUAS"; then
+ for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
+ fi
+ fi
+
+ MKINSTALLDIRS=
+ if test -n "$ac_aux_dir"; then
+ MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
+ fi
+ if test -z "$MKINSTALLDIRS"; then
+ MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+ fi
+
+
+ test -d po || mkdir po
+ if test "x$srcdir" != "x."; then
+ if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then
+ posrcprefix="$srcdir/"
+ else
+ posrcprefix="../$srcdir/"
+ fi
+ else
+ posrcprefix="../"
+ fi
+ rm -f po/POTFILES
+ sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
+ < $srcdir/po/POTFILES.in > po/POTFILES
+
+MKINSTALLDIRS="$INSTALL_DIRS"
+
+
+###############################################################################
+#
+# Check for -lXmu (some fucked up vendors don't ship it...)
+#
+###############################################################################
+
+have_xmu=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "X11/Xmu/Error.h" "ac_cv_header_X11_Xmu_Error_h" "#include <stdlib.h>
+ #include <stdio.h>
+ #include <X11/Intrinsic.h>
+"
+if test "x$ac_cv_header_X11_Xmu_Error_h" = xyes; then :
+ have_xmu=yes
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+if test "$have_xmu" = no ; then
+ XMU_SRCS='$(UTILS_SRC)/xmu.c'
+ XMU_OBJS='$(UTILS_BIN)/xmu.o'
+ XMU_LIBS=''
+else
+ XMU_SRCS=''
+ XMU_OBJS=''
+ XMU_LIBS='-lXmu'
+ $as_echo "#define HAVE_XMU 1" >>confdefs.h
+
+fi
+
+
+###############################################################################
+#
+# Check for the SunOS 4.1.x _get_wmShellWidgetClass bug.
+# See comp.windows.x FAQ question 124. The right fix is to
+# get OpenWindows 3.0 patches 100512-02 and 100573-03.
+#
+###############################################################################
+
+if test "$have_xmu" = yes ; then
+ case "$host" in
+ *-sunos4*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the SunOS 4.1.x _get_wmShellWidgetClass bug" >&5
+$as_echo_n "checking for the SunOS 4.1.x _get_wmShellWidgetClass bug... " >&6; }
+if ${ac_cv_sunos_xmu_bug+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_LDFLAGS="$LDFLAGS"
+ if test \! -z "$x_libraries" ; then
+ LDFLAGS="$LDFLAGS -L$x_libraries"
+ fi
+ # Note: this trick never works! (Generally.)
+ # We're only getting away with using AC_TRY_LINK
+ # with X libraries because we know it's SunOS.
+ LDFLAGS="$LDFLAGS -lXmu -lXt -lX11 -lXext -lm"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_sunos_xmu_bug=no
+else
+ ac_cv_sunos_xmu_bug=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS="$ac_save_LDFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sunos_xmu_bug" >&5
+$as_echo "$ac_cv_sunos_xmu_bug" >&6; }
+ if test "$ac_cv_sunos_xmu_bug" = yes ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler understands -static" >&5
+$as_echo_n "checking whether the compiler understands -static... " >&6; }
+if ${ac_cv_ld_static+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS -static"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_ld_static=yes
+else
+ ac_cv_ld_static=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS="$ac_save_LDFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_ld_static" >&5
+$as_echo "$ac_cv_ld_static" >&6; }
+ if test "$ac_cv_ld_static" = yes ; then
+ LDFLAGS="$LDFLAGS -static"
+ else
+ LDFLAGS="$LDFLAGS -Bstatic"
+ fi
+ fi
+ ;;
+ esac
+fi
+
+
+###############################################################################
+#
+# Handle the --with-hackdir option
+#
+###############################################################################
+
+have_hackdir=yes
+with_hackdir_req=unspecified
+
+# Check whether --with-hackdir was given.
+if test "${with_hackdir+set}" = set; then :
+ withval=$with_hackdir; with_hackdir="$withval"; with_hackdir_req="$withval"
+else
+ with_hackdir=yes
+fi
+
+
+if test x"$with_hackdir" = xyes; then
+ HACKDIR='${libexecdir}/xscreensaver'
+elif test x"$with_hackdir" = xno; then
+ HACKDIR='${bindir}'
+else
+ HACKDIR=$with_hackdir
+fi
+
+# canonicalize slashes.
+HACKDIR=`echo "${HACKDIR}" | sed 's@/$@@;s@//*@/@g'`
+
+# Expand HACKDIR as HACKDIR_FULL
+HACKDIR_FULL=`eval eval eval eval eval eval eval eval eval echo $HACKDIR`
+
+# This option used to be called --enable-subdir; make sure that is no longer
+# used, since configure brain-damagedly ignores unknown --enable options.
+
+obsolete_enable=
+# Check whether --enable-subdir was given.
+if test "${enable_subdir+set}" = set; then :
+ enableval=$enable_subdir; obsolete_enable=yes
+fi
+
+if test -n "$obsolete_enable"; then
+ echo "error: the --enable-subdir option has been replaced with"
+ echo " the new --with-hackdir option; see \`configure --help'"
+ echo " for more information."
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Handle the --with-configdir option
+# Help for --with-x-app-defaults option added.
+#
+###############################################################################
+
+have_configdir=yes
+with_configdir_req=unspecified
+
+# Check whether --with-configdir was given.
+if test "${with_configdir+set}" = set; then :
+ withval=$with_configdir; with_configdir="$withval"; with_configdir_req="$withval"
+else
+ with_configdir=yes
+fi
+
+
+if test x"$with_configdir" = xyes; then
+ HACK_CONF_DIR='${datadir}/xscreensaver/config'
+elif test x"$with_configdir" = xno; then
+ echo "error: must be yes, or a pathname: --with-configdir=$with_configdir"
+ exit 1
+else
+ # there must be a better way than this...
+ if test -z "`echo $with_configdir | sed 's@^/.*@@'`" ; then
+ # absolute path
+ HACK_CONF_DIR=$with_configdir
+ else
+ # relative path
+ HACK_CONF_DIR="\${exec_prefix}$with_configdir"
+ fi
+fi
+
+
+
+
+###############################################################################
+#
+# Check for the SGI SCREEN_SAVER server extension.
+#
+###############################################################################
+
+#have_sgi=no
+#with_sgi_req=unspecified
+#AC_ARG_WITH(sgi-ext,
+#[Except where noted, all of the --with options below can also take a
+#directory argument: for example, `--with-motif=/opt/Motif'. That would
+#cause /opt/Motif/include/ to be added to the -I list, and /opt/Motif/lib/
+#to be added to the -L list, assuming those directories exist.
+#
+#By default, support for each of these options will be built in, if the
+#relevant library routines exist. At run time, they will then be used
+#only if the X server being used supports them. Each --with option has
+#a corresponding --without option, to override building support for them
+#at all.
+#
+#Screen blanking and idle-detection options:
+#
+# --with-sgi-ext Include support for the SGI SCREEN_SAVER extension.],
+# [with_sgi="$withval"; with_sgi_req="$withval"],[with_sgi=yes])
+#
+#HANDLE_X_PATH_ARG(with_sgi, --with-sgi-ext, SGI SCREEN_SAVER)
+#
+#if test "$with_sgi" = yes; then
+# AC_CHECK_X_HEADER(X11/extensions/XScreenSaver.h,
+# [have_sgi=yes
+# AC_DEFINE(HAVE_SGI_SAVER_EXTENSION)],,
+# [#include <X11/Xlib.h>])
+#
+#elif test "$with_sgi" != no; then
+# echo "error: must be yes or no: --with-sgi-ext=$with_sgi"
+# exit 1
+#fi
+
+
+###############################################################################
+#
+# Check for the XIDLE server extension.
+#
+###############################################################################
+
+#have_xidle=no
+#with_xidle_req=unspecified
+#AC_ARG_WITH(xidle-ext,
+#[ --with-xidle-ext Include support for the XIDLE extension.],
+# [with_xidle="$withval"; with_xidle_req="$withval"],[with_xidle=yes])
+#
+#HANDLE_X_PATH_ARG(with_xidle, --with-xidle-ext, XIDLE)
+#
+#if test "$with_xidle" = yes; then
+# AC_CHECK_X_HEADER(X11/extensions/xidle.h,
+# [have_xidle=yes
+# AC_DEFINE(HAVE_XIDLE_EXTENSION)],,
+# [#include <X11/Xlib.h>])
+#elif test "$with_xidle" != no; then
+# echo "error: must be yes or no: --with-xidle-ext=$with_xidle"
+# exit 1
+#fi
+
+
+###############################################################################
+#
+# Check for the SGI-VIDEO-CONTROL server extension.
+#
+###############################################################################
+
+#have_sgivc=no
+#with_sgivc_req=unspecified
+#AC_ARG_WITH(sgivc-ext,
+#[ --with-sgivc-ext Include support for the SGI-VIDEO-CONTROL extension.],
+# [with_sgivc="$withval"; with_sgivc_req="$withval"],[with_sgivc=yes])
+#
+#HANDLE_X_PATH_ARG(with_sgivc, --with-sgivc-ext, SGI-VIDEO-CONTROL)
+#
+#if test "$with_sgivc" = yes; then
+#
+# # first check for XSGIvc.h
+# AC_CHECK_X_HEADER(X11/extensions/XSGIvc.h, [have_sgivc=yes],,
+# [#include <X11/Xlib.h>])
+#
+# # if that succeeded, then check for the -lXsgivc
+# if test "$have_sgivc" = yes; then
+# have_sgivc=no
+# AC_CHECK_X_LIB(Xsgivc, XSGIvcQueryGammaMap,
+# [have_sgivc=yes; SAVER_LIBS="$SAVER_LIBS -lXsgivc"], [true],
+# -lXext -lX11)
+# fi
+#
+# # if that succeeded, then we've really got it.
+# if test "$have_sgivc" = yes; then
+# AC_DEFINE(HAVE_SGI_VC_EXTENSION)
+# fi
+#
+#elif test "$with_sgivc" != no; then
+# echo "error: must be yes or no: --with-sgivc-ext=$with_sgivc"
+# exit 1
+#fi
+
+
+###############################################################################
+#
+# Check for the DPMS server extension.
+#
+###############################################################################
+
+have_dpms=no
+with_dpms_req=unspecified
+
+# Check whether --with-dpms-ext was given.
+if test "${with_dpms_ext+set}" = set; then :
+ withval=$with_dpms_ext; with_dpms="$withval"; with_dpms_req="$withval"
+else
+ with_dpms=yes
+fi
+
+
+
+ case "$with_dpms" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DPMS headers" >&5
+$as_echo_n "checking for DPMS headers... " >&6; }
+ d=$with_dpms/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DPMS libs" >&5
+$as_echo_n "checking for DPMS libs... " >&6; }
+ d=$with_dpms/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_dpms_req="yes"
+ with_dpms=$with_dpms_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-dpms-ext must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+
+if test "$with_dpms" = yes; then
+
+ # first check for dpms.h
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "X11/extensions/dpms.h" "ac_cv_header_X11_extensions_dpms_h" "#include <X11/Xlib.h>
+ #include <X11/Xmd.h>
+"
+if test "x$ac_cv_header_X11_extensions_dpms_h" = xyes; then :
+ have_dpms=yes
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+ # if that succeeded, then check for the DPMS code in the libraries
+ if test "$have_dpms" = yes; then
+
+ # first look in -lXext (this is where it is with XFree86 4.0)
+ have_dpms=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DPMSInfo in -lXext" >&5
+$as_echo_n "checking for DPMSInfo in -lXext... " >&6; }
+if ${ac_cv_lib_Xext_DPMSInfo+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXext -lXext -lX11 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char DPMSInfo ();
+int
+main ()
+{
+return DPMSInfo ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_Xext_DPMSInfo=yes
+else
+ ac_cv_lib_Xext_DPMSInfo=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_DPMSInfo" >&5
+$as_echo "$ac_cv_lib_Xext_DPMSInfo" >&6; }
+if test "x$ac_cv_lib_Xext_DPMSInfo" = xyes; then :
+ have_dpms=yes
+else
+ true
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+
+ # if that failed, look in -lXdpms (this is where it was in XFree86 3.x)
+ if test "$have_dpms" = no; then
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DPMSInfo in -lXdpms" >&5
+$as_echo_n "checking for DPMSInfo in -lXdpms... " >&6; }
+if ${ac_cv_lib_Xdpms_DPMSInfo+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXdpms -lXext -lX11 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char DPMSInfo ();
+int
+main ()
+{
+return DPMSInfo ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_Xdpms_DPMSInfo=yes
+else
+ ac_cv_lib_Xdpms_DPMSInfo=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xdpms_DPMSInfo" >&5
+$as_echo "$ac_cv_lib_Xdpms_DPMSInfo" >&6; }
+if test "x$ac_cv_lib_Xdpms_DPMSInfo" = xyes; then :
+ have_dpms=yes; XDPMS_LIBS="-lXdpms"
+else
+ true
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
+ fi
+
+
+ # if that succeeded, then we've really got it.
+ if test "$have_dpms" = yes; then
+ $as_echo "#define HAVE_DPMS_EXTENSION 1" >>confdefs.h
+
+ fi
+
+elif test "$with_dpms" != no; then
+ echo "error: must be yes or no: --with-dpms-ext=$with_dpms"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for the XINERAMA server extension.
+#
+###############################################################################
+
+have_xinerama=no
+with_xinerama_req=unspecified
+
+# Check whether --with-xinerama-ext was given.
+if test "${with_xinerama_ext+set}" = set; then :
+ withval=$with_xinerama_ext; with_xinerama="$withval"; with_xinerama_req="$withval"
+else
+ with_xinerama=yes
+fi
+
+
+
+ case "$with_xinerama" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XINERAMA headers" >&5
+$as_echo_n "checking for XINERAMA headers... " >&6; }
+ d=$with_xinerama/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XINERAMA libs" >&5
+$as_echo_n "checking for XINERAMA libs... " >&6; }
+ d=$with_xinerama/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_xinerama_req="yes"
+ with_xinerama=$with_xinerama_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-xinerama-ext must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+
+if test "$with_xinerama" = yes; then
+
+ # first check for Xinerama.h
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "X11/extensions/Xinerama.h" "ac_cv_header_X11_extensions_Xinerama_h" "#include <X11/Xlib.h>
+"
+if test "x$ac_cv_header_X11_extensions_Xinerama_h" = xyes; then :
+ have_xinerama=yes
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+ # if that succeeded, then check for the XINERAMA code in the libraries
+ if test "$have_xinerama" = yes; then
+
+ # first look in -lXext
+ have_xinerama=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XineramaQueryScreens in -lXext" >&5
+$as_echo_n "checking for XineramaQueryScreens in -lXext... " >&6; }
+if ${ac_cv_lib_Xext_XineramaQueryScreens+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXext -lXext -lX11 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XineramaQueryScreens ();
+int
+main ()
+{
+return XineramaQueryScreens ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_Xext_XineramaQueryScreens=yes
+else
+ ac_cv_lib_Xext_XineramaQueryScreens=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_XineramaQueryScreens" >&5
+$as_echo "$ac_cv_lib_Xext_XineramaQueryScreens" >&6; }
+if test "x$ac_cv_lib_Xext_XineramaQueryScreens" = xyes; then :
+ have_xinerama=yes
+else
+ true
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+
+ # if that failed, look in -lXinerama (this is where it is in XFree86 4.1.)
+ if test "$have_xinerama" = no; then
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XineramaQueryScreens in -lXinerama" >&5
+$as_echo_n "checking for XineramaQueryScreens in -lXinerama... " >&6; }
+if ${ac_cv_lib_Xinerama_XineramaQueryScreens+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXinerama -lXext -lX11 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XineramaQueryScreens ();
+int
+main ()
+{
+return XineramaQueryScreens ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_Xinerama_XineramaQueryScreens=yes
+else
+ ac_cv_lib_Xinerama_XineramaQueryScreens=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xinerama_XineramaQueryScreens" >&5
+$as_echo "$ac_cv_lib_Xinerama_XineramaQueryScreens" >&6; }
+if test "x$ac_cv_lib_Xinerama_XineramaQueryScreens" = xyes; then :
+ have_xinerama=yes; XINERAMA_LIBS="-lXinerama"
+else
+ true
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
+ fi
+
+ # if that succeeded, then we've really got it.
+ if test "$have_xinerama" = yes; then
+ $as_echo "#define HAVE_XINERAMA 1" >>confdefs.h
+
+ fi
+
+elif test "$with_xinerama" != no; then
+ echo "error: must be yes or no: --with-xinerama-ext=$with_xinerama"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for the XINPUT server extension.
+#
+###############################################################################
+
+have_xinput=no
+with_xinput_req=unspecified
+
+# Check whether --with-xinput-ext was given.
+if test "${with_xinput_ext+set}" = set; then :
+ withval=$with_xinput_ext; with_xinput="$withval"; with_xinput_req="$withval"
+else
+ with_xinput=yes
+fi
+
+
+
+ case "$with_xinput" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XINPUT headers" >&5
+$as_echo_n "checking for XINPUT headers... " >&6; }
+ d=$with_xinput/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XINPUT libs" >&5
+$as_echo_n "checking for XINPUT libs... " >&6; }
+ d=$with_xinput/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_xinput_req="yes"
+ with_xinput=$with_xinput_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-xinput-ext must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+
+if test "$with_xinput" = yes; then
+
+ # first check for Xinput.h
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "X11/extensions/XInput.h" "ac_cv_header_X11_extensions_XInput_h" "#include <X11/Xlib.h>
+"
+if test "x$ac_cv_header_X11_extensions_XInput_h" = xyes; then :
+ have_xinput=yes
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+ # if that succeeded, then check for libXi
+ if test "$have_xinput" = yes; then
+ have_xinput=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XListInputDevices in -lXi" >&5
+$as_echo_n "checking for XListInputDevices in -lXi... " >&6; }
+if ${ac_cv_lib_Xi_XListInputDevices+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXi -lXext -lX11 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XListInputDevices ();
+int
+main ()
+{
+return XListInputDevices ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_Xi_XListInputDevices=yes
+else
+ ac_cv_lib_Xi_XListInputDevices=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xi_XListInputDevices" >&5
+$as_echo "$ac_cv_lib_Xi_XListInputDevices" >&6; }
+if test "x$ac_cv_lib_Xi_XListInputDevices" = xyes; then :
+ have_xinput=yes; SAVER_LIBS="$SAVER_LIBS -lXi"
+else
+ true
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
+
+ # if that succeeded, then we've really got it.
+ if test "$have_xinput" = yes; then
+ $as_echo "#define HAVE_XINPUT 1" >>confdefs.h
+
+ fi
+
+elif test "$with_xinput" != no; then
+ echo "error: must be yes or no: --with-xinput-ext=$with_xinput"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for the XF86VMODE server extension (for virtual screens.)
+#
+###############################################################################
+
+have_xf86vmode=no
+with_xf86vmode_req=unspecified
+
+# Check whether --with-xf86vmode-ext was given.
+if test "${with_xf86vmode_ext+set}" = set; then :
+ withval=$with_xf86vmode_ext; with_xf86vmode="$withval"; with_xf86vmode_req="$withval"
+else
+ with_xf86vmode=yes
+fi
+
+
+
+ case "$with_xf86vmode" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xf86vmode headers" >&5
+$as_echo_n "checking for xf86vmode headers... " >&6; }
+ d=$with_xf86vmode/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xf86vmode libs" >&5
+$as_echo_n "checking for xf86vmode libs... " >&6; }
+ d=$with_xf86vmode/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_xf86vmode_req="yes"
+ with_xf86vmode=$with_xf86vmode_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-xf86vmode-ext must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+
+VIDMODE_LIBS=""
+
+if test "$with_xf86vmode" = yes; then
+
+ # first check for xf86vmode.h
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "X11/extensions/xf86vmode.h" "ac_cv_header_X11_extensions_xf86vmode_h" "#include <X11/Xlib.h>
+"
+if test "x$ac_cv_header_X11_extensions_xf86vmode_h" = xyes; then :
+ have_xf86vmode=yes
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+ # if that succeeded, then check for the -lXxf86vm
+ if test "$have_xf86vmode" = yes; then
+ have_xf86vmode=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XF86VidModeGetViewPort in -lXxf86vm" >&5
+$as_echo_n "checking for XF86VidModeGetViewPort in -lXxf86vm... " >&6; }
+if ${ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXxf86vm -lXext -lX11 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XF86VidModeGetViewPort ();
+int
+main ()
+{
+return XF86VidModeGetViewPort ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort=yes
+else
+ ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort" >&5
+$as_echo "$ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort" >&6; }
+if test "x$ac_cv_lib_Xxf86vm_XF86VidModeGetViewPort" = xyes; then :
+ have_xf86vmode=yes;
+ VIDMODE_LIBS="-lXxf86vm";
+ SAVER_LIBS="$SAVER_LIBS $VIDMODE_LIBS"
+else
+ true
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
+
+ # if that succeeded, then we've really got it.
+ if test "$have_xf86vmode" = yes; then
+ $as_echo "#define HAVE_XF86VMODE 1" >>confdefs.h
+
+ fi
+
+elif test "$with_xf86vmode" != no; then
+ echo "error: must be yes or no: --with-xf86vmode-ext=$with_xf86vmode"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for the XF86VMODE server extension (for gamma fading.)
+#
+###############################################################################
+
+have_xf86gamma=no
+have_xf86gamma_ramp=no
+with_xf86gamma_req=unspecified
+
+# Check whether --with-xf86gamma-ext was given.
+if test "${with_xf86gamma_ext+set}" = set; then :
+ withval=$with_xf86gamma_ext; with_xf86gamma="$withval"; with_xf86gamma_req="$withval"
+else
+ with_xf86gamma=yes
+fi
+
+
+
+ case "$with_xf86gamma" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xf86gamma headers" >&5
+$as_echo_n "checking for xf86gamma headers... " >&6; }
+ d=$with_xf86gamma/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xf86gamma libs" >&5
+$as_echo_n "checking for xf86gamma libs... " >&6; }
+ d=$with_xf86gamma/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_xf86gamma_req="yes"
+ with_xf86gamma=$with_xf86gamma_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-xf86gamma-ext must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+
+if test "$with_xf86gamma" = yes; then
+
+ # first check for xf86vmode.h, if we haven't already
+ if test "$have_xf86vmode" = yes; then
+ have_xf86gamma=yes
+ else
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "X11/extensions/xf86vmode.h" "ac_cv_header_X11_extensions_xf86vmode_h" "#include <X11/Xlib.h>
+"
+if test "x$ac_cv_header_X11_extensions_xf86vmode_h" = xyes; then :
+ have_xf86gamma=yes
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ fi
+
+ # if that succeeded, then check for the -lXxf86vm
+ if test "$have_xf86gamma" = yes; then
+ have_xf86gamma=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XF86VidModeSetGamma in -lXxf86vm" >&5
+$as_echo_n "checking for XF86VidModeSetGamma in -lXxf86vm... " >&6; }
+if ${ac_cv_lib_Xxf86vm_XF86VidModeSetGamma+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXxf86vm -lXext -lX11 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XF86VidModeSetGamma ();
+int
+main ()
+{
+return XF86VidModeSetGamma ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_Xxf86vm_XF86VidModeSetGamma=yes
+else
+ ac_cv_lib_Xxf86vm_XF86VidModeSetGamma=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xxf86vm_XF86VidModeSetGamma" >&5
+$as_echo "$ac_cv_lib_Xxf86vm_XF86VidModeSetGamma" >&6; }
+if test "x$ac_cv_lib_Xxf86vm_XF86VidModeSetGamma" = xyes; then :
+ have_xf86gamma=yes
+else
+ true
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
+
+ # check for the Ramp versions of the functions too.
+ if test "$have_xf86gamma" = yes; then
+ have_xf86gamma_ramp=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XF86VidModeSetGammaRamp in -lXxf86vm" >&5
+$as_echo_n "checking for XF86VidModeSetGammaRamp in -lXxf86vm... " >&6; }
+if ${ac_cv_lib_Xxf86vm_XF86VidModeSetGammaRamp+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXxf86vm -lXext -lX11 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XF86VidModeSetGammaRamp ();
+int
+main ()
+{
+return XF86VidModeSetGammaRamp ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_Xxf86vm_XF86VidModeSetGammaRamp=yes
+else
+ ac_cv_lib_Xxf86vm_XF86VidModeSetGammaRamp=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xxf86vm_XF86VidModeSetGammaRamp" >&5
+$as_echo "$ac_cv_lib_Xxf86vm_XF86VidModeSetGammaRamp" >&6; }
+if test "x$ac_cv_lib_Xxf86vm_XF86VidModeSetGammaRamp" = xyes; then :
+ have_xf86gamma_ramp=yes
+else
+ true
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
+
+ # if those tests succeeded, then we've really got the functions.
+ if test "$have_xf86gamma" = yes; then
+ $as_echo "#define HAVE_XF86VMODE_GAMMA 1" >>confdefs.h
+
+ fi
+
+ if test "$have_xf86gamma_ramp" = yes; then
+ $as_echo "#define HAVE_XF86VMODE_GAMMA_RAMP 1" >>confdefs.h
+
+ fi
+
+ # pull in the lib, if we haven't already
+ if test "$have_xf86gamma" = yes -a "$have_xf86vmode" = no; then
+ SAVER_LIBS="$SAVER_LIBS -lXxf86vm"
+ fi
+
+elif test "$with_xf86gamma" != no; then
+ echo "error: must be yes or no: --with-xf86gamma-ext=$with_xf86vmode"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for the RANDR (Resize and Rotate) server extension.
+#
+# We need this to detect when the resolution of the desktop
+# has changed out from under us (this is a newer, different
+# mechanism than the XF86VMODE virtual viewports.)
+#
+###############################################################################
+
+have_randr=no
+with_randr_req=unspecified
+
+# Check whether --with-randr-ext was given.
+if test "${with_randr_ext+set}" = set; then :
+ withval=$with_randr_ext; with_randr="$withval"; with_randr_req="$withval"
+else
+ with_randr=yes
+fi
+
+
+
+ case "$with_randr" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RANDR headers" >&5
+$as_echo_n "checking for RANDR headers... " >&6; }
+ d=$with_randr/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RANDR libs" >&5
+$as_echo_n "checking for RANDR libs... " >&6; }
+ d=$with_randr/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_randr_req="yes"
+ with_randr=$with_randr_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-randr-ext must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+
+if test "$with_randr" = yes; then
+
+ # first check for Xrandr.h
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "X11/extensions/Xrandr.h" "ac_cv_header_X11_extensions_Xrandr_h" "#include <X11/Xlib.h>
+"
+if test "x$ac_cv_header_X11_extensions_Xrandr_h" = xyes; then :
+ have_randr=yes
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+ # if that succeeded, then check for the XRR code in the libraries
+ if test "$have_randr" = yes; then
+
+ # RANDR probably needs -lXrender
+ xrender_libs=
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XRenderSetSubpixelOrder in -lXrender" >&5
+$as_echo_n "checking for XRenderSetSubpixelOrder in -lXrender... " >&6; }
+if ${ac_cv_lib_Xrender_XRenderSetSubpixelOrder+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXrender -lXext -lX11 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XRenderSetSubpixelOrder ();
+int
+main ()
+{
+return XRenderSetSubpixelOrder ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_Xrender_XRenderSetSubpixelOrder=yes
+else
+ ac_cv_lib_Xrender_XRenderSetSubpixelOrder=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xrender_XRenderSetSubpixelOrder" >&5
+$as_echo "$ac_cv_lib_Xrender_XRenderSetSubpixelOrder" >&6; }
+if test "x$ac_cv_lib_Xrender_XRenderSetSubpixelOrder" = xyes; then :
+ xrender_libs="-lXrender"
+else
+ true
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+
+ # first look for RANDR in -lXext
+ have_randr=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XRRGetScreenInfo in -lXext" >&5
+$as_echo_n "checking for XRRGetScreenInfo in -lXext... " >&6; }
+if ${ac_cv_lib_Xext_XRRGetScreenInfo+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXext $xrender_libs -lXext -lX11 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XRRGetScreenInfo ();
+int
+main ()
+{
+return XRRGetScreenInfo ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_Xext_XRRGetScreenInfo=yes
+else
+ ac_cv_lib_Xext_XRRGetScreenInfo=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_XRRGetScreenInfo" >&5
+$as_echo "$ac_cv_lib_Xext_XRRGetScreenInfo" >&6; }
+if test "x$ac_cv_lib_Xext_XRRGetScreenInfo" = xyes; then :
+ have_randr=yes; SAVER_LIBS="$SAVER_LIBS $xrender_libs"
+else
+ true
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+
+ # if that failed, look in -lXrandr
+ if test "$have_randr" = no; then
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XRRGetScreenInfo in -lXrandr" >&5
+$as_echo_n "checking for XRRGetScreenInfo in -lXrandr... " >&6; }
+if ${ac_cv_lib_Xrandr_XRRGetScreenInfo+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXrandr $xrender_libs -lXext -lX11 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XRRGetScreenInfo ();
+int
+main ()
+{
+return XRRGetScreenInfo ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_Xrandr_XRRGetScreenInfo=yes
+else
+ ac_cv_lib_Xrandr_XRRGetScreenInfo=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xrandr_XRRGetScreenInfo" >&5
+$as_echo "$ac_cv_lib_Xrandr_XRRGetScreenInfo" >&6; }
+if test "x$ac_cv_lib_Xrandr_XRRGetScreenInfo" = xyes; then :
+ have_randr=yes; SAVER_LIBS="$SAVER_LIBS -lXrandr $xrender_libs"
+else
+ true
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
+ fi
+
+ # if that succeeded, then we've really got it.
+ if test "$have_randr" = yes; then
+ $as_echo "#define HAVE_RANDR 1" >>confdefs.h
+
+
+ # Now check for version 1.2 in the same libs.
+ # Try to compile, since on MacOS 10.5.7, headers are older than libs!
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XRRGetScreenResources" >&5
+$as_echo_n "checking for XRRGetScreenResources... " >&6; }
+if ${ac_cv_randr_12+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_randr_12=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+ #include <X11/Xlib.h>
+ #include <X11/extensions/Xrandr.h>
+int
+main ()
+{
+XRRScreenResources *res =
+ XRRGetScreenResources (0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_randr_12=yes
+else
+ ac_cv_randr_12=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_randr_12" >&5
+$as_echo "$ac_cv_randr_12" >&6; }
+ if test "$ac_cv_randr_12" = yes ; then
+ $as_echo "#define HAVE_RANDR_12 1" >>confdefs.h
+
+ fi
+# AC_CHECK_X_LIB(c, XRRGetOutputInfo, [AC_DEFINE(HAVE_RANDR_12)],
+# [true], $SAVER_LIBS)
+ fi
+
+
+elif test "$with_randr" != no; then
+ echo "error: must be yes or no: --with-randr-ext=$with_randr"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for XF86MiscSetGrabKeysState (but only bother if we are already
+# using other XF86 stuff.)
+#
+###############################################################################
+
+have_xf86miscsetgrabkeysstate=no
+if test "$have_xf86gamma" = yes -o "$have_xf86vmode" = yes; then
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XF86MiscSetGrabKeysState in -lXxf86misc" >&5
+$as_echo_n "checking for XF86MiscSetGrabKeysState in -lXxf86misc... " >&6; }
+if ${ac_cv_lib_Xxf86misc_XF86MiscSetGrabKeysState+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXxf86misc -lXext -lX11 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XF86MiscSetGrabKeysState ();
+int
+main ()
+{
+return XF86MiscSetGrabKeysState ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_Xxf86misc_XF86MiscSetGrabKeysState=yes
+else
+ ac_cv_lib_Xxf86misc_XF86MiscSetGrabKeysState=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xxf86misc_XF86MiscSetGrabKeysState" >&5
+$as_echo "$ac_cv_lib_Xxf86misc_XF86MiscSetGrabKeysState" >&6; }
+if test "x$ac_cv_lib_Xxf86misc_XF86MiscSetGrabKeysState" = xyes; then :
+ have_xf86miscsetgrabkeysstate=yes
+else
+ true
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ if test "$have_xf86miscsetgrabkeysstate" = yes ; then
+ SAVER_LIBS="$SAVER_LIBS -lXxf86misc"
+ $as_echo "#define HAVE_XF86MISCSETGRABKEYSSTATE 1" >>confdefs.h
+
+ fi
+fi
+
+
+###############################################################################
+#
+# Check for HP XHPDisableReset and XHPEnableReset.
+#
+###############################################################################
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XHPDisableReset in X11/XHPlib.h" >&5
+$as_echo_n "checking for XHPDisableReset in X11/XHPlib.h... " >&6; }
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <X11/XHPlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "XHPDisableReset" >/dev/null 2>&1; then :
+ $as_echo "#define HAVE_XHPDISABLERESET 1" >>confdefs.h
+
+ SAVER_LIBS="-lXhp11 $SAVER_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -rf conftest*
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+
+###############################################################################
+#
+# Check for /proc/interrupts.
+#
+###############################################################################
+
+have_proc_interrupts=no
+with_proc_interrupts_req=unspecified
+
+# Check whether --with-proc-interrupts was given.
+if test "${with_proc_interrupts+set}" = set; then :
+ withval=$with_proc_interrupts; with_proc_interrupts="$withval"; with_proc_interrupts_req="$withval"
+else
+ with_proc_interrupts=yes
+fi
+
+
+if test "$with_proc_interrupts" = yes; then
+
+ # Note that we may be building in an environment (e.g. Debian buildd chroot)
+ # without a proper /proc filesystem. If /proc/interrupts exists, then we'll
+ # check that it has the bits we need, but otherwise we'll just go on faith.
+ #
+ have_proc_interrupts=yes
+
+ if test -f /proc/interrupts; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether /proc/interrupts contains keyboard data" >&5
+$as_echo_n "checking whether /proc/interrupts contains keyboard data... " >&6; }
+if ${ac_cv_have_proc_interrupts+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_have_proc_interrupts=no
+ if grep 'keyboard\|i8042' /proc/interrupts >/dev/null 2>&1 ; then
+ ac_cv_have_proc_interrupts=yes
+ fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_proc_interrupts" >&5
+$as_echo "$ac_cv_have_proc_interrupts" >&6; }
+ have_proc_interrupts=$ac_cv_have_proc_interrupts
+ fi
+
+ if test "$have_proc_interrupts" = yes; then
+ $as_echo "#define HAVE_PROC_INTERRUPTS 1" >>confdefs.h
+
+ fi
+
+elif test "$with_proc_interrupts" != no; then
+ echo "error: must be yes or no: --with-proc-interrupts=$with_proc_interrupts"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# The --enable-locking option
+#
+###############################################################################
+
+# Check whether --enable-locking was given.
+if test "${enable_locking+set}" = set; then :
+ enableval=$enable_locking; enable_locking="$enableval"
+else
+ if test "$ac_macosx" = yes; then
+ # We can't lock on MacOS X, so default to not compiling in support for it.
+ # But allow --enable-locking to override that, so I can debug Linux locking
+ # under MacOS X11.
+ enable_locking=no
+ else
+ enable_locking=yes
+ fi
+fi
+
+if test "$enable_locking" = yes; then
+ true
+elif test "$enable_locking" = no; then
+ $as_echo "#define NO_LOCKING 1" >>confdefs.h
+
+else
+ echo "error: must be yes or no: --enable-locking=$enable_locking"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Whether to allow root password to unblank.
+#
+###############################################################################
+# Check whether --enable-root-passwd was given.
+if test "${enable_root_passwd+set}" = set; then :
+ enableval=$enable_root_passwd; enable_root_passwd="$enableval"
+else
+ enable_root_passwd=yes
+fi
+
+if test "$enable_root_passwd" = yes; then
+ $as_echo "#define ALLOW_ROOT_PASSWD 1" >>confdefs.h
+
+ true
+elif test "$enable_root_passwd" != no; then
+ echo "error: must be yes or no: --enable-root-passwd=$enable_root_passwd"
+ exit 1
+fi
+
+###############################################################################
+#
+# Check for PAM.
+#
+###############################################################################
+
+case "$host" in
+ *-solaris*)
+ # Solaris systems tend to come with PAM misconfigured.
+ # Don't build it by default, even if the headers exist.
+ with_pam_default=no
+ ;;
+ *)
+ # Default to building PAM support on all other systems, if it exists.
+ with_pam_default=yes
+ ;;
+esac
+
+have_pam=no
+with_pam_req=unspecified
+
+
+# Check whether --with-pam was given.
+if test "${with_pam+set}" = set; then :
+ withval=$with_pam; with_pam="$withval"; with_pam_req="$withval"
+else
+ with_pam=$with_pam_default
+fi
+
+
+
+# Check whether --with-pam_service_name was given.
+if test "${with_pam_service_name+set}" = set; then :
+ withval=$with_pam_service_name; pam_service_name="$withval"
+else
+ pam_service_name="xscreensaver"
+fi
+
+
+# Check whether --enable-pam-check-account-type was given.
+if test "${enable_pam_check_account_type+set}" = set; then :
+ enableval=$enable_pam_check_account_type; enable_pam_check_account_type="$enableval"
+else
+ enable_pam_check_account_type=no
+fi
+
+if test "$enable_pam_check_account_type" = yes ; then
+ $as_echo "#define PAM_CHECK_ACCOUNT_TYPE 1" >>confdefs.h
+
+ true
+elif test "$enable_pam_check_account_type" != no ; then
+ echo "error: must be yes or no: --enable-pam-check-account-type=$enable_pam_check_account_type"
+ exit 1
+fi
+
+
+ case "$with_pam" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PAM headers" >&5
+$as_echo_n "checking for PAM headers... " >&6; }
+ d=$with_pam/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PAM libs" >&5
+$as_echo_n "checking for PAM libs... " >&6; }
+ d=$with_pam/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_pam_req="yes"
+ with_pam=$with_pam_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-pam must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+
+if test "$enable_locking" = yes -a "$with_pam" = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PAM" >&5
+$as_echo_n "checking for PAM... " >&6; }
+if ${ac_cv_pam+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <security/pam_appl.h>
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_pam=yes
+else
+ ac_cv_pam=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_pam" >&5
+$as_echo "$ac_cv_pam" >&6; }
+ if test "$ac_cv_pam" = yes ; then
+ have_pam=yes
+ $as_echo "#define HAVE_PAM 1" >>confdefs.h
+
+ cat >>confdefs.h <<_ACEOF
+#define PAM_SERVICE_NAME "$pam_service_name"
+_ACEOF
+
+
+ PASSWD_LIBS="${PASSWD_LIBS} -lpam"
+
+ # libpam typically requires dlopen and dlsym. On FreeBSD,
+ # those are in libc. On Linux and Solaris, they're in libdl.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dl_dlopen=yes
+else
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+ PASSWD_LIBS="${PASSWD_LIBS} -ldl"
+fi
+
+
+ # On Linux, sigtimedwait() is in libc; on Solaris, it's in librt.
+ have_timedwait=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigtimedwait in -lc" >&5
+$as_echo_n "checking for sigtimedwait in -lc... " >&6; }
+if ${ac_cv_lib_c_sigtimedwait+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char sigtimedwait ();
+int
+main ()
+{
+return sigtimedwait ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_c_sigtimedwait=yes
+else
+ ac_cv_lib_c_sigtimedwait=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_sigtimedwait" >&5
+$as_echo "$ac_cv_lib_c_sigtimedwait" >&6; }
+if test "x$ac_cv_lib_c_sigtimedwait" = xyes; then :
+ have_timedwait=yes
+ $as_echo "#define HAVE_SIGTIMEDWAIT 1" >>confdefs.h
+
+fi
+
+ if test "$have_timedwait" = no ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigtimedwait in -lrt" >&5
+$as_echo_n "checking for sigtimedwait in -lrt... " >&6; }
+if ${ac_cv_lib_rt_sigtimedwait+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lrt $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char sigtimedwait ();
+int
+main ()
+{
+return sigtimedwait ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_rt_sigtimedwait=yes
+else
+ ac_cv_lib_rt_sigtimedwait=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_sigtimedwait" >&5
+$as_echo "$ac_cv_lib_rt_sigtimedwait" >&6; }
+if test "x$ac_cv_lib_rt_sigtimedwait" = xyes; then :
+ have_timedwait=yes
+ $as_echo "#define HAVE_SIGTIMEDWAIT 1" >>confdefs.h
+
+ PASSWD_LIBS="${PASSWD_LIBS} -lrt"
+fi
+
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to call pam_strerror" >&5
+$as_echo_n "checking how to call pam_strerror... " >&6; }
+ if ${ac_cv_pam_strerror_args+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+ #include <stdlib.h>
+ #include <security/pam_appl.h>
+int
+main ()
+{
+pam_handle_t *pamh = 0;
+ char *s = pam_strerror(pamh, PAM_SUCCESS);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_pam_strerror_args=2
+else
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+ #include <stdlib.h>
+ #include <security/pam_appl.h>
+int
+main ()
+{
+char *s =
+ pam_strerror(PAM_SUCCESS);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_pam_strerror_args=1
+else
+ ac_pam_strerror_args=0
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ ac_cv_pam_strerror_args=$ac_pam_strerror_args
+fi
+
+ ac_pam_strerror_args=$ac_cv_pam_strerror_args
+ if test "$ac_pam_strerror_args" = 1 ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: one argument" >&5
+$as_echo "one argument" >&6; }
+ elif test "$ac_pam_strerror_args" = 2 ; then
+ $as_echo "#define PAM_STRERROR_TWO_ARGS 1" >>confdefs.h
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: two arguments" >&5
+$as_echo "two arguments" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
+$as_echo "unknown" >&6; }
+ fi
+
+# Check pam_fail_delay
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking pam_fail_delay in -lpam" >&5
+$as_echo_n "checking pam_fail_delay in -lpam... " >&6; }
+ if ${ac_cv_pam_fail_delay+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="-lpam"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <security/pam_appl.h>
+int
+main ()
+{
+pam_handle_t *pamh = 0;
+ unsigned int usec = 1;
+ int status = pam_fail_delay (pamh, usec);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_pam_fail_delay=yes
+else
+ ac_pam_fail_delay=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_cv_pam_fail_delay=$ac_pam_fail_delay,
+ LDFLAGS=$ac_save_LDFLAGS
+fi
+
+
+ if test "$ac_pam_fail_delay" = yes ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ $as_echo "#define HAVE_PAM_FAIL_DELAY 1" >>confdefs.h
+
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+
+ fi
+fi
+
+
+###############################################################################
+#
+# Check for Kerberos.
+#
+###############################################################################
+
+have_kerberos=no
+have_kerberos5=no
+with_kerberos_req=unspecified
+
+
+# Check whether --with-kerberos was given.
+if test "${with_kerberos+set}" = set; then :
+ withval=$with_kerberos; with_kerberos="$withval"; with_kerberos_req="$withval"
+else
+ with_kerberos=yes
+fi
+
+
+
+ case "$with_kerberos" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Kerberos headers" >&5
+$as_echo_n "checking for Kerberos headers... " >&6; }
+ d=$with_kerberos/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Kerberos libs" >&5
+$as_echo_n "checking for Kerberos libs... " >&6; }
+ d=$with_kerberos/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_kerberos_req="yes"
+ with_kerberos=$with_kerberos_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-kerberos must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+
+if test "$enable_locking" = yes -a "$with_kerberos" = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Kerberos 4" >&5
+$as_echo_n "checking for Kerberos 4... " >&6; }
+if ${ac_cv_kerberos+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <krb.h>
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_kerberos=yes
+else
+ ac_cv_kerberos=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_kerberos" >&5
+$as_echo "$ac_cv_kerberos" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Kerberos 5" >&5
+$as_echo_n "checking for Kerberos 5... " >&6; }
+if ${ac_cv_kerberos5+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <kerberosIV/krb.h>
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_kerberos5=yes
+else
+ ac_cv_kerberos5=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_kerberos5" >&5
+$as_echo "$ac_cv_kerberos5" >&6; }
+
+ if test "$ac_cv_kerberos" = yes ; then
+ have_kerberos=yes
+ $as_echo "#define HAVE_KERBEROS 1" >>confdefs.h
+
+ fi
+
+ if test "$ac_cv_kerberos5" = yes ; then
+
+ # Andrew Snare <ajs@pigpond.com> wrote:
+ #
+ # You were assuming that if kerberosV (krb5) was found, then kerberosIV
+ # (krb4) was also available. This turns out not to be the case with
+ # mit-krb-1.2.7; apparently backwards-compatibility with KerberosIV
+ # is optional.
+ #
+ # So, disable kerberosV support if libkrb4 can't be found.
+ # This is not the best solution, but it makes the compile not fail.
+ #
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for krb_get_tf_realm in -lkrb4" >&5
+$as_echo_n "checking for krb_get_tf_realm in -lkrb4... " >&6; }
+if ${ac_cv_lib_krb4_krb_get_tf_realm+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lkrb4 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char krb_get_tf_realm ();
+int
+main ()
+{
+return krb_get_tf_realm ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_krb4_krb_get_tf_realm=yes
+else
+ ac_cv_lib_krb4_krb_get_tf_realm=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_krb4_krb_get_tf_realm" >&5
+$as_echo "$ac_cv_lib_krb4_krb_get_tf_realm" >&6; }
+if test "x$ac_cv_lib_krb4_krb_get_tf_realm" = xyes; then :
+ have_kerberos=yes
+else
+ have_kerberos=no
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ if test "$have_kerberos" = yes ; then
+ have_kerberos5=yes
+ $as_echo "#define HAVE_KERBEROS 1" >>confdefs.h
+
+ $as_echo "#define HAVE_KERBEROS5 1" >>confdefs.h
+
+ else
+ have_kerberos5=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find compat lib (libkrb4) needed to use Kerberos 5" >&5
+$as_echo "$as_me: WARNING: Cannot find compat lib (libkrb4) needed to use Kerberos 5" >&2;}
+ fi
+
+ fi
+
+ if test "$have_kerberos5" = yes ; then
+ # from Matt Knopp <mhat@infocalypse.netlag.com>
+ # (who got it from amu@mit.edu)
+
+ PASSWD_LIBS="$PASSWD_LIBS -lkrb4 -ldes425 -lkrb5 -lk5crypto -lcom_err"
+
+ # jwz: MacOS X uses -lkrb5, but not -lcrypt
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for crypt in -lcrypt" >&5
+$as_echo_n "checking for crypt in -lcrypt... " >&6; }
+if ${ac_cv_lib_crypt_crypt+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcrypt $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char crypt ();
+int
+main ()
+{
+return crypt ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_crypt_crypt=yes
+else
+ ac_cv_lib_crypt_crypt=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypt_crypt" >&5
+$as_echo "$ac_cv_lib_crypt_crypt" >&6; }
+if test "x$ac_cv_lib_crypt_crypt" = xyes; then :
+ PASSWD_LIBS="$PASSWD_LIBS -lcrypt"
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+
+ elif test "$have_kerberos" = yes ; then
+ # from Tim Showalter <tjs@psaux.com> for FreeBSD 4.2
+ PASSWD_LIBS="$PASSWD_LIBS -lkrb -ldes -lcom_err"
+ fi
+
+ if test "$have_kerberos" = yes ; then
+ ac_fn_c_check_func "$LINENO" "res_search" "ac_cv_func_res_search"
+if test "x$ac_cv_func_res_search" = xyes; then :
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_search in -lresolv" >&5
+$as_echo_n "checking for res_search in -lresolv... " >&6; }
+if ${ac_cv_lib_resolv_res_search+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lresolv $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char res_search ();
+int
+main ()
+{
+return res_search ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_resolv_res_search=yes
+else
+ ac_cv_lib_resolv_res_search=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_res_search" >&5
+$as_echo "$ac_cv_lib_resolv_res_search" >&6; }
+if test "x$ac_cv_lib_resolv_res_search" = xyes; then :
+ PASSWD_LIBS="${PASSWD_LIBS} -lresolv"
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Can't find DNS resolver libraries needed for Kerberos" >&5
+$as_echo "$as_me: WARNING: Can't find DNS resolver libraries needed for Kerberos" >&2;}
+
+fi
+
+fi
+
+ fi
+fi
+
+
+###############################################################################
+#
+# Check for the nine billion variants of shadow passwords...
+#
+###############################################################################
+
+need_setuid=no
+
+have_shadow=no
+with_shadow_req=unspecified
+
+
+# Check whether --with-shadow was given.
+if test "${with_shadow+set}" = set; then :
+ withval=$with_shadow; with_shadow="$withval"; with_shadow_req="$withval"
+else
+ with_shadow=yes
+fi
+
+
+
+ case "$with_shadow" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shadow password headers" >&5
+$as_echo_n "checking for shadow password headers... " >&6; }
+ d=$with_shadow/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shadow password libs" >&5
+$as_echo_n "checking for shadow password libs... " >&6; }
+ d=$with_shadow/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_shadow_req="yes"
+ with_shadow=$with_shadow_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-shadow must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+
+if test "$enable_locking" = no ; then
+ with_shadow_req=no
+ with_shadow=no
+fi
+
+
+###############################################################################
+#
+# Check for Sun "adjunct" passwords.
+#
+###############################################################################
+
+if test "$with_shadow" = yes ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Sun-style shadow passwords" >&5
+$as_echo_n "checking for Sun-style shadow passwords... " >&6; }
+if ${ac_cv_sun_adjunct+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+ #include <unistd.h>
+ #include <sys/types.h>
+ #include <sys/label.h>
+ #include <sys/audit.h>
+ #include <pwdadj.h>
+int
+main ()
+{
+struct passwd_adjunct *p = getpwanam("nobody");
+ const char *pw = p->pwa_passwd;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sun_adjunct=yes
+else
+ ac_cv_sun_adjunct=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sun_adjunct" >&5
+$as_echo "$ac_cv_sun_adjunct" >&6; }
+ if test "$ac_cv_sun_adjunct" = yes; then
+ have_shadow_adjunct=yes
+ have_shadow=yes
+ need_setuid=yes
+ fi
+fi
+
+
+###############################################################################
+#
+# Check for DEC and SCO so-called "enhanced" security.
+#
+###############################################################################
+
+if test "$with_shadow" = yes ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DEC-style shadow passwords" >&5
+$as_echo_n "checking for DEC-style shadow passwords... " >&6; }
+if ${ac_cv_enhanced_passwd+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+ #include <unistd.h>
+ #include <sys/types.h>
+ #include <pwd.h>
+ #include <sys/security.h>
+ #include <prot.h>
+int
+main ()
+{
+struct pr_passwd *p;
+ const char *pw;
+ set_auth_parameters(0, 0);
+ check_auth_parameters();
+ p = getprpwnam("nobody");
+ pw = p->ufld.fd_encrypt;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_enhanced_passwd=yes
+else
+ ac_cv_enhanced_passwd=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enhanced_passwd" >&5
+$as_echo "$ac_cv_enhanced_passwd" >&6; }
+ if test $ac_cv_enhanced_passwd = yes; then
+ have_shadow_enhanced=yes
+ have_shadow=yes
+ need_setuid=yes
+
+ # On SCO, getprpwnam() is in -lprot (which uses nap() from -lx)
+ # (I'm told it needs -lcurses too, but I don't understand why.)
+ # But on DEC, it's in -lsecurity.
+ #
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getprpwnam in -lprot" >&5
+$as_echo_n "checking for getprpwnam in -lprot... " >&6; }
+if ${ac_cv_lib_prot_getprpwnam+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lprot -lx $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char getprpwnam ();
+int
+main ()
+{
+return getprpwnam ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_prot_getprpwnam=yes
+else
+ ac_cv_lib_prot_getprpwnam=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_prot_getprpwnam" >&5
+$as_echo "$ac_cv_lib_prot_getprpwnam" >&6; }
+if test "x$ac_cv_lib_prot_getprpwnam" = xyes; then :
+ PASSWD_LIBS="$PASSWD_LIBS -lprot -lcurses -lx"
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getprpwnam in -lsecurity" >&5
+$as_echo_n "checking for getprpwnam in -lsecurity... " >&6; }
+if ${ac_cv_lib_security_getprpwnam+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsecurity $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char getprpwnam ();
+int
+main ()
+{
+return getprpwnam ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_security_getprpwnam=yes
+else
+ ac_cv_lib_security_getprpwnam=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_security_getprpwnam" >&5
+$as_echo "$ac_cv_lib_security_getprpwnam" >&6; }
+if test "x$ac_cv_lib_security_getprpwnam" = xyes; then :
+ PASSWD_LIBS="$PASSWD_LIBS -lsecurity"
+fi
+
+fi
+
+ fi
+fi
+
+###############################################################################
+#
+# Check for HP's entry in the "Not Invented Here" Sweepstakes.
+#
+###############################################################################
+
+if test "$with_shadow" = yes ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for HP-style shadow passwords" >&5
+$as_echo_n "checking for HP-style shadow passwords... " >&6; }
+if ${ac_cv_hpux_passwd+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+ #include <unistd.h>
+ #include <sys/types.h>
+ #include <pwd.h>
+ #include <hpsecurity.h>
+ #include <prot.h>
+int
+main ()
+{
+struct s_passwd *p = getspwnam("nobody");
+ const char *pw = p->pw_passwd;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_hpux_passwd=yes
+else
+ ac_cv_hpux_passwd=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_hpux_passwd" >&5
+$as_echo "$ac_cv_hpux_passwd" >&6; }
+ if test "$ac_cv_hpux_passwd" = yes; then
+ have_shadow_hpux=yes
+ have_shadow=yes
+ need_setuid=yes
+
+ # on HPUX, bigcrypt is in -lsec
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bigcrypt in -lsec" >&5
+$as_echo_n "checking for bigcrypt in -lsec... " >&6; }
+if ${ac_cv_lib_sec_bigcrypt+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsec $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char bigcrypt ();
+int
+main ()
+{
+return bigcrypt ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_sec_bigcrypt=yes
+else
+ ac_cv_lib_sec_bigcrypt=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sec_bigcrypt" >&5
+$as_echo "$ac_cv_lib_sec_bigcrypt" >&6; }
+if test "x$ac_cv_lib_sec_bigcrypt" = xyes; then :
+ PASSWD_LIBS="$PASSWD_LIBS -lsec"
+fi
+
+ fi
+fi
+
+
+###############################################################################
+#
+# Check for FreeBSD-style shadow passwords.
+#
+# On FreeBSD, getpwnam() and friends work just like on non-shadow-
+# password systems -- except you only get stuff in the pw_passwd field
+# if the running program is setuid. So, guess that we've got this
+# lossage to contend with if /etc/master.passwd exists, and default to
+# a setuid installation.
+#
+###############################################################################
+
+if test "$with_shadow" = yes ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FreeBSD-style shadow passwords" >&5
+$as_echo_n "checking for FreeBSD-style shadow passwords... " >&6; }
+if ${ac_cv_master_passwd+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -f /etc/master.passwd ; then
+ ac_cv_master_passwd=yes
+ else
+ ac_cv_master_passwd=no
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_master_passwd" >&5
+$as_echo "$ac_cv_master_passwd" >&6; }
+ if test "$ac_cv_master_passwd" = yes; then
+ need_setuid=yes
+ fi
+fi
+
+
+###############################################################################
+#
+# Check for traditional (ha!) shadow passwords.
+#
+###############################################################################
+
+if test "$with_shadow" = yes ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for generic shadow passwords" >&5
+$as_echo_n "checking for generic shadow passwords... " >&6; }
+if ${ac_cv_shadow+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+ #include <unistd.h>
+ #include <sys/types.h>
+ #include <pwd.h>
+ #include <shadow.h>
+int
+main ()
+{
+struct spwd *p = getspnam("nobody");
+ const char *pw = p->sp_pwdp;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_shadow=yes
+else
+ ac_cv_shadow=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_shadow" >&5
+$as_echo "$ac_cv_shadow" >&6; }
+ if test "$ac_cv_shadow" = yes; then
+ have_shadow=yes
+ need_setuid=yes
+
+ # On some systems (UnixWare 2.1), getspnam() is in -lgen instead of -lc.
+ have_getspnam=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getspnam in -lc" >&5
+$as_echo_n "checking for getspnam in -lc... " >&6; }
+if ${ac_cv_lib_c_getspnam+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char getspnam ();
+int
+main ()
+{
+return getspnam ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_c_getspnam=yes
+else
+ ac_cv_lib_c_getspnam=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_getspnam" >&5
+$as_echo "$ac_cv_lib_c_getspnam" >&6; }
+if test "x$ac_cv_lib_c_getspnam" = xyes; then :
+ have_getspnam=yes
+fi
+
+ if test "$have_getspnam" = no ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getspnam in -lgen" >&5
+$as_echo_n "checking for getspnam in -lgen... " >&6; }
+if ${ac_cv_lib_gen_getspnam+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgen $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char getspnam ();
+int
+main ()
+{
+return getspnam ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_gen_getspnam=yes
+else
+ ac_cv_lib_gen_getspnam=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gen_getspnam" >&5
+$as_echo "$ac_cv_lib_gen_getspnam" >&6; }
+if test "x$ac_cv_lib_gen_getspnam" = xyes; then :
+ have_getspnam=yes; PASSWD_LIBS="$PASSWD_LIBS -lgen"
+fi
+
+ fi
+ fi
+fi
+
+
+###############################################################################
+#
+# Check for other libraries needed for non-shadow passwords.
+#
+###############################################################################
+
+if test "$enable_locking" = yes ; then
+
+ # On some systems (UnixWare 2.1), crypt() is in -lcrypt instead of -lc.
+ have_crypt=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for crypt in -lc" >&5
+$as_echo_n "checking for crypt in -lc... " >&6; }
+if ${ac_cv_lib_c_crypt+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char crypt ();
+int
+main ()
+{
+return crypt ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_c_crypt=yes
+else
+ ac_cv_lib_c_crypt=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_crypt" >&5
+$as_echo "$ac_cv_lib_c_crypt" >&6; }
+if test "x$ac_cv_lib_c_crypt" = xyes; then :
+ have_crypt=yes
+fi
+
+ if test "$have_crypt" = no ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for crypt in -lcrypt" >&5
+$as_echo_n "checking for crypt in -lcrypt... " >&6; }
+if ${ac_cv_lib_crypt_crypt+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcrypt $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char crypt ();
+int
+main ()
+{
+return crypt ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_crypt_crypt=yes
+else
+ ac_cv_lib_crypt_crypt=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypt_crypt" >&5
+$as_echo "$ac_cv_lib_crypt_crypt" >&6; }
+if test "x$ac_cv_lib_crypt_crypt" = xyes; then :
+ have_crypt=yes; PASSWD_LIBS="$PASSWD_LIBS -lcrypt"
+fi
+
+ fi
+fi
+
+
+# Most of the above shadow mechanisms will have set need_setuid to yes,
+# if they were found. But, on some systems, we need setuid even when
+# using plain old vanilla passwords.
+#
+if test "$enable_locking" = yes ; then
+ case "$host" in
+ *-hpux* | *-aix* | *-netbsd* | *-freebsd* | *-openbsd* )
+ need_setuid=yes
+ ;;
+ esac
+fi
+
+
+if test "$have_shadow_adjunct" = yes ; then
+ $as_echo "#define HAVE_ADJUNCT_PASSWD 1" >>confdefs.h
+
+elif test "$have_shadow_enhanced" = yes ; then
+ $as_echo "#define HAVE_ENHANCED_PASSWD 1" >>confdefs.h
+
+elif test "$have_shadow_hpux" = yes ; then
+ $as_echo "#define HAVE_HPUX_PASSWD 1" >>confdefs.h
+
+elif test "$have_shadow" = yes ; then
+ $as_echo "#define HAVE_SHADOW_PASSWD 1" >>confdefs.h
+
+fi
+
+
+###############################################################################
+#
+# Check for external password helper
+# On SuSE, instead of having xscreensaver be a setuid program, they
+# fork an external program that takes the password on stdin, and
+# returns true if that password is a valid one. Then only that
+# smaller program needs to be setuid.
+#
+# (Note that this external program is not a GUI: the GUI is still
+# all in xscreensaver itself; the external program just does auth.)
+#
+###############################################################################
+
+have_passwd_helper=no
+with_passwd_helper_req=unspecified
+
+
+# Check whether --with-passwd-helper was given.
+if test "${with_passwd_helper+set}" = set; then :
+ withval=$with_passwd_helper; with_passwd_helper="$withval"; with_passwd_helper_req="$withval"
+else
+ with_passwd_helper=no
+fi
+
+# no HANDLE_X_PATH_ARG for this one
+
+if test "$enable_locking" = no ; then
+ with_passwd_helper_req=no
+ with_passwd_helper=no
+fi
+
+case "$with_passwd_helper" in
+ ""|no) : ;;
+ /*)
+ cat >>confdefs.h <<_ACEOF
+#define PASSWD_HELPER_PROGRAM "$with_passwd_helper"
+_ACEOF
+
+ have_passwd_helper=yes;;
+ *)
+ echo "error: --with-passwd-helper needs full pathname of helper (not '$with_passwd_helper')." >&2
+ exit 1
+esac
+
+
+###############################################################################
+#
+# Check for a login manager for a "New Login" button on the lock dialog.
+# Usually this will be "/usr/bin/gdmflexiserver".
+#
+###############################################################################
+
+with_login_manager_req=unspecified
+default_login_manager_1='gdmflexiserver -ls'
+default_login_manager_2='kdmctl reserve'
+default_login_manager_3='lxdm -c USER_SWITCH'
+default_login_manager_4='dm-tool switch-to-greeter'
+
+
+# Check whether --with-login-manager was given.
+if test "${with_login_manager+set}" = set; then :
+ withval=$with_login_manager; with_login_manager="$withval"; with_login_manager_req="$withval"
+else
+ with_login_manager=yes
+fi
+
+# no HANDLE_X_PATH_ARG for this one
+
+if test "$enable_locking" = no ; then
+ with_login_manager_req=no
+ with_login_manager=no
+fi
+
+case "$with_login_manager_req" in
+ no)
+ with_login_manager=""
+ ;;
+
+ yes|unspecified)
+ # Try various defaults, use the first one that exists.
+
+ with_login_manager=""
+
+ if test -z "$with_login_manager" ; then
+ set dummy $default_login_manager_1 ; login_manager_tmp=$2
+ unset ac_cv_path_login_manager_tmp # don't cache
+ # Extract the first word of "$login_manager_tmp", so it can be a program name with args.
+set dummy $login_manager_tmp; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_login_manager_tmp+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $login_manager_tmp in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_login_manager_tmp="$login_manager_tmp" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_login_manager_tmp="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+login_manager_tmp=$ac_cv_path_login_manager_tmp
+if test -n "$login_manager_tmp"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $login_manager_tmp" >&5
+$as_echo "$login_manager_tmp" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test ! -z "$login_manager_tmp" ; then
+ with_login_manager="$default_login_manager_1"
+ fi
+ fi
+
+ if test -z "$with_login_manager" ; then
+ set dummy $default_login_manager_2 ; login_manager_tmp=$2
+ unset ac_cv_path_login_manager_tmp # don't cache
+ # Extract the first word of "$login_manager_tmp", so it can be a program name with args.
+set dummy $login_manager_tmp; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_login_manager_tmp+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $login_manager_tmp in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_login_manager_tmp="$login_manager_tmp" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_login_manager_tmp="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+login_manager_tmp=$ac_cv_path_login_manager_tmp
+if test -n "$login_manager_tmp"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $login_manager_tmp" >&5
+$as_echo "$login_manager_tmp" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test ! -z "$login_manager_tmp" ; then
+ with_login_manager="$default_login_manager_2"
+ fi
+ fi
+
+ if test -z "$with_login_manager" ; then
+ set dummy $default_login_manager_3 ; login_manager_tmp=$2
+ unset ac_cv_path_login_manager_tmp # don't cache
+ # Extract the first word of "$login_manager_tmp", so it can be a program name with args.
+set dummy $login_manager_tmp; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_login_manager_tmp+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $login_manager_tmp in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_login_manager_tmp="$login_manager_tmp" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_login_manager_tmp="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+login_manager_tmp=$ac_cv_path_login_manager_tmp
+if test -n "$login_manager_tmp"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $login_manager_tmp" >&5
+$as_echo "$login_manager_tmp" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test ! -z "$login_manager_tmp" ; then
+ with_login_manager="$default_login_manager_3"
+ fi
+ fi
+
+ if test -z "$with_login_manager" ; then
+ set dummy $default_login_manager_4 ; login_manager_tmp=$2
+ unset ac_cv_path_login_manager_tmp # don't cache
+ # Extract the first word of "$login_manager_tmp", so it can be a program name with args.
+set dummy $login_manager_tmp; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_login_manager_tmp+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $login_manager_tmp in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_login_manager_tmp="$login_manager_tmp" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_login_manager_tmp="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+login_manager_tmp=$ac_cv_path_login_manager_tmp
+if test -n "$login_manager_tmp"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $login_manager_tmp" >&5
+$as_echo "$login_manager_tmp" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test ! -z "$login_manager_tmp" ; then
+ with_login_manager="$default_login_manager_4"
+ fi
+ fi
+
+ ;;
+
+ /*)
+ # absolute path specified on cmd line
+ set dummy $with_login_manager_req ; login_manager_tmp=$2
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $login_manager_tmp" >&5
+$as_echo_n "checking for $login_manager_tmp... " >&6; }
+ if test -x "$login_manager_tmp" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ with_login_manager=""
+ fi
+ ;;
+
+ *)
+ # relative path specified on cmd line
+ set dummy $with_login_manager_req ; login_manager_tmp=$2
+ unset ac_cv_path_login_manager_tmp # don't cache
+ # Extract the first word of "$login_manager_tmp", so it can be a program name with args.
+set dummy $login_manager_tmp; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_login_manager_tmp+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $login_manager_tmp in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_login_manager_tmp="$login_manager_tmp" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_login_manager_tmp="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+login_manager_tmp=$ac_cv_path_login_manager_tmp
+if test -n "$login_manager_tmp"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $login_manager_tmp" >&5
+$as_echo "$login_manager_tmp" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test -z "$login_manager_tmp" ; then
+ with_login_manager=""
+ else
+ with_login_manager="$login_manager_tmp"
+ fi
+ ;;
+esac
+ac_cv_login_manager_program="$with_login_manager"
+
+NEW_LOGIN_COMMAND_P=''
+NEW_LOGIN_COMMAND="$ac_cv_login_manager_program"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for login manager" >&5
+$as_echo_n "checking for login manager... " >&6; }
+if test -z "$NEW_LOGIN_COMMAND" ; then
+ NEW_LOGIN_COMMAND="$default_login_manager_1"
+ NEW_LOGIN_COMMAND_P='! '
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NEW_LOGIN_COMMAND (disabled)" >&5
+$as_echo "$NEW_LOGIN_COMMAND (disabled)" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NEW_LOGIN_COMMAND" >&5
+$as_echo "$NEW_LOGIN_COMMAND" >&6; }
+fi
+
+
+###############################################################################
+#
+# Check for -lgtk (and Gnome stuff)
+#
+###############################################################################
+
+have_gtk=no
+with_gtk_req=unspecified
+
+# Check whether --with-gtk was given.
+if test "${with_gtk+set}" = set; then :
+ withval=$with_gtk; with_gtk="$withval"; with_gtk_req="$withval"
+else
+ with_gtk=yes
+fi
+
+
+# if --with-gtk=/directory/ was specified, remember that directory so that
+# we can also look for the `gtk-config' program in that directory.
+case "$with_gtk" in
+ /*)
+ gtk_dir="$with_gtk"
+ ;;
+ *)
+ gtk_dir=""
+ ;;
+esac
+
+
+ case "$with_gtk" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Gtk headers" >&5
+$as_echo_n "checking for Gtk headers... " >&6; }
+ d=$with_gtk/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Gtk libs" >&5
+$as_echo_n "checking for Gtk libs... " >&6; }
+ d=$with_gtk/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_gtk_req="yes"
+ with_gtk=$with_gtk_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-gtk must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+
+if test "$with_gtk" != yes -a "$with_gtk" != no ; then
+ echo "error: must be yes or no: --with-gtk=$with_gtk"
+ exit 1
+fi
+
+
+parse_gtk_version_string() {
+ # M4 sucks!!
+
+ maj=`echo $ac_gtk_version_string | sed -n 's/\..*//p'`
+ min=`echo $ac_gtk_version_string | sed -n 's/[^.]*\.\([^.]*\).*/\1/p'`
+
+ ac_gtk_version=`echo "$maj * 1000 + $min" | bc`
+ if test -z "$ac_gtk_version"; then
+ ac_gtk_version=unknown
+ ac_gtk_version_string=unknown
+ fi
+}
+
+# Find pkg-config... (need this for both gtk and gdk_pixbuf.)
+# if the user specified --with-gtk=/foo/ then look there.
+#
+gtk_path="$PATH"
+if test ! -z "$gtk_dir"; then
+ # canonicalize slashes.
+ foo=`echo "${gtk_dir}/bin" | sed 's@//*@/@g'`
+ gtk_path="$foo:$gtk_path"
+fi
+
+for ac_prog in pkg-config
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_pkg_config+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $pkg_config in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_pkg_config="$pkg_config" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $gtk_path
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_pkg_config="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+pkg_config=$ac_cv_path_pkg_config
+if test -n "$pkg_config"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pkg_config" >&5
+$as_echo "$pkg_config" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$pkg_config" && break
+done
+
+
+if test -z "$pkg_config" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: pkg-config not found!" >&5
+$as_echo "$as_me: WARNING: pkg-config not found!" >&2;}
+ pkg_config="false"
+fi
+
+
+# Utility function for running pkg-config-based tests...
+#
+pkgs=''
+pkg_check_version() {
+ if test "$ok" = yes ; then
+ req="$1"
+ min="$2"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $req" >&5
+$as_echo_n "checking for $req... " >&6; }
+ if $pkg_config --exists "$req" ; then
+ vers=`$pkg_config --modversion "$req"`
+ if $pkg_config --exists "$req >= $min" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $vers" >&5
+$as_echo "$vers" >&6; }
+ pkgs="$pkgs $req"
+ return 1
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $vers (wanted >= $min)" >&5
+$as_echo "$vers (wanted >= $min)" >&6; }
+ ok=no
+ return 0
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ok=no
+ return 0
+ fi
+ fi
+}
+
+
+jurassic_gtk=no
+gtk_halfassed=no
+have_gtk_2_22_or_higher=no
+COMMENT_DEMO_GLADE2_GTK_2_22_HEAD=""
+COMMENT_DEMO_GLADE2_GTK_2_22_TAIL=""
+
+if test "$with_gtk" = yes; then
+ have_gtk=no
+
+ ok="yes"
+ pkg_check_version gtk+-2.0 2.0.1 ; ac_gtk_version_string="$vers"
+ pkg_check_version gmodule-2.0 2.0.0
+ pkg_check_version libxml-2.0 2.4.6
+ pkg_check_version libglade-2.0 1.99.0
+ pkg_check_version gdk-pixbuf-2.0 2.0.0
+ pkg_check_version gdk-pixbuf-xlib-2.0 2.0.0
+ have_gtk="$ok"
+
+ if test "$have_gtk" = no; then
+ if test -n "$ac_gtk_version_string" ; then
+ gtk_halfassed="$ac_gtk_version_string"
+ gtk_halfassed_lib="$req"
+ fi
+ fi
+
+ if test "$have_gtk" = yes; then
+ parse_gtk_version_string
+ jurassic_gtk=no
+ fi
+
+ if test "$have_gtk" = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Gtk includes" >&5
+$as_echo_n "checking for Gtk includes... " >&6; }
+if ${ac_cv_gtk_config_cflags+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_gtk_config_cflags=`$pkg_config --cflags $pkgs`
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gtk_config_cflags" >&5
+$as_echo "$ac_cv_gtk_config_cflags" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Gtk libs" >&5
+$as_echo_n "checking for Gtk libs... " >&6; }
+if ${ac_cv_gtk_config_libs+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_gtk_config_libs=`$pkg_config --libs $pkgs`
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gtk_config_libs" >&5
+$as_echo "$ac_cv_gtk_config_libs" >&6; }
+ fi
+
+ ac_gtk_config_cflags=$ac_cv_gtk_config_cflags
+ ac_gtk_config_libs=$ac_cv_gtk_config_libs
+
+ GTK_EXTRA_OBJS=""
+ GTK_DATADIR=""
+ if test "$have_gtk" = yes; then
+ GTK_DATADIR=`$pkg_config --variable=prefix gtk+-2.0`
+ GTK_DATADIR="$GTK_DATADIR/share"
+ fi
+
+ if test "$have_gtk" = yes; then
+ INCLUDES="$INCLUDES $ac_gtk_config_cflags"
+ GTK_LIBS="$GTK_LIBS $ac_gtk_config_libs"
+ $as_echo "#define HAVE_GTK 1" >>confdefs.h
+
+ $as_echo "#define HAVE_GTK2 1" >>confdefs.h
+
+ $as_echo "#define HAVE_XML 1" >>confdefs.h
+
+ fi
+
+ if test "$have_gtk" = yes; then
+ ok="yes"
+ pkg_check_version gtk+-2.0 2.22
+ have_gtk_2_22_or_higher="$ok"
+ if test "$have_gtk_2_22_or_higher" = yes; then
+ COMMENT_DEMO_GLADE2_GTK_2_22_HEAD="<!-- comment>"
+ COMMENT_DEMO_GLADE2_GTK_2_22_TAIL="</comment -->"
+ fi
+ fi
+fi
+
+
+# Check for the various Gnome help and URL loading programs.
+#
+WITH_BROWSER=gnome-open
+if test "$have_gtk" = yes; then
+ for ac_prog in gnome-open
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_gnome_open_program+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$gnome_open_program"; then
+ ac_cv_prog_gnome_open_program="$gnome_open_program" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_gnome_open_program="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+gnome_open_program=$ac_cv_prog_gnome_open_program
+if test -n "$gnome_open_program"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gnome_open_program" >&5
+$as_echo "$gnome_open_program" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$gnome_open_program" && break
+done
+
+ for ac_prog in gnome-url-show
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_gnome_url_show_program+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$gnome_url_show_program"; then
+ ac_cv_prog_gnome_url_show_program="$gnome_url_show_program" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_gnome_url_show_program="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+gnome_url_show_program=$ac_cv_prog_gnome_url_show_program
+if test -n "$gnome_url_show_program"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gnome_url_show_program" >&5
+$as_echo "$gnome_url_show_program" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$gnome_url_show_program" && break
+done
+
+fi
+
+
+###############################################################################
+#
+# Check for -lXm.
+#
+###############################################################################
+
+have_motif=no
+with_motif_req=unspecified
+
+# Check whether --with-motif was given.
+if test "${with_motif+set}" = set; then :
+ withval=$with_motif; with_motif="$withval"; with_motif_req="$withval"
+else
+ with_motif=no
+fi
+
+
+
+ case "$with_motif" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Motif headers" >&5
+$as_echo_n "checking for Motif headers... " >&6; }
+ d=$with_motif/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Motif libs" >&5
+$as_echo_n "checking for Motif libs... " >&6; }
+ d=$with_motif/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_motif_req="yes"
+ with_motif=$with_motif_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-motif must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+
+if test "$with_motif" != yes -a "$with_motif" != no ; then
+ echo "error: must be yes or no: --with-motif=$with_motif"
+ exit 1
+fi
+
+if test "$with_motif" = yes; then
+ have_motif=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "Xm/Xm.h" "ac_cv_header_Xm_Xm_h" "#include <stdlib.h>
+ #include <stdio.h>
+ #include <X11/Intrinsic.h>
+"
+if test "x$ac_cv_header_Xm_Xm_h" = xyes; then :
+ have_motif=yes
+ $as_echo "#define HAVE_MOTIF 1" >>confdefs.h
+
+ MOTIF_LIBS="$MOTIF_LIBS -lXm"
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+
+
+if test "$have_motif" = yes; then
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "Xm/ComboBox.h" "ac_cv_header_Xm_ComboBox_h" "#include <stdlib.h>
+ #include <stdio.h>
+ #include <X11/Intrinsic.h>
+"
+if test "x$ac_cv_header_Xm_ComboBox_h" = xyes; then :
+ $as_echo "#define HAVE_XMCOMBOBOX 1" >>confdefs.h
+
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+
+
+###############################################################################
+#
+# Checking whether Motif is really Lesstif.
+#
+###############################################################################
+
+have_lesstif=no
+if test "$have_motif" = yes ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Motif is really LessTif" >&5
+$as_echo_n "checking whether Motif is really LessTif... " >&6; }
+if ${ac_cv_have_lesstif+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <Xm/Xm.h>
+int
+main ()
+{
+long vers = LesstifVersion;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_have_lesstif=yes
+else
+ ac_cv_have_lesstif=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_lesstif" >&5
+$as_echo "$ac_cv_have_lesstif" >&6; }
+ have_lesstif=$ac_cv_have_lesstif
+fi
+
+
+lesstif_version=unknown
+lesstif_version_string=unknown
+
+if test "$have_lesstif" = yes ; then
+ ltv=unknown
+ echo unknown > conftest-lt
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking LessTif version number" >&5
+$as_echo_n "checking LessTif version number... " >&6; }
+if ${ac_cv_lesstif_version_string+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ if test "$cross_compiling" = yes; then :
+ ac_cv_lesstif_version=unknown
+ ac_cv_lesstif_version_string=unknown
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+ #include <Xm/Xm.h>
+ int main() {
+ FILE *f = fopen("conftest-lt", "w");
+ if (!f) exit(1);
+ fprintf(f, "%d %d.%d\n", LesstifVersion,
+ LESSTIF_VERSION, LESSTIF_REVISION);
+ fclose(f);
+ exit(0);
+ }
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ ltv=`cat conftest-lt`
+ ac_cv_lesstif_version=`echo $ltv | sed 's/ .*//'`
+ ac_cv_lesstif_version_string=`echo $ltv | sed 's/.* //'`
+else
+ ac_cv_lesstif_version=unknown
+ ac_cv_lesstif_version_string=unknown
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lesstif_version_string" >&5
+$as_echo "$ac_cv_lesstif_version_string" >&6; }
+ rm -rf conftest-lt
+ lesstif_version=$ac_cv_lesstif_version
+ lesstif_version_string=$ac_cv_lesstif_version_string
+
+fi
+
+
+if test "$have_motif" = yes ; then
+ mtv=unknown
+ echo unknown > conftest-mt
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking Motif version number" >&5
+$as_echo_n "checking Motif version number... " >&6; }
+if ${ac_cv_motif_version_string+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ if test "$cross_compiling" = yes; then :
+ ac_cv_motif_version=unknown
+ ac_cv_motif_version_string=unknown
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+ #include <Xm/Xm.h>
+ int main() {
+ FILE *f = fopen("conftest-mt", "w");
+ if (!f) exit(1);
+ fprintf(f, "%d %d.%d\n", XmVersion,
+ XmVERSION, XmREVISION);
+ fclose(f);
+ exit(0);
+ }
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ mtv=`cat conftest-mt`
+ ac_cv_motif_version=`echo $mtv | sed 's/ .*//'`
+ ac_cv_motif_version_string=`echo $mtv | sed 's/.* //'`
+else
+ ac_cv_motif_version=unknown
+ ac_cv_motif_version_string=unknown
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_motif_version_string" >&5
+$as_echo "$ac_cv_motif_version_string" >&6; }
+ rm -rf conftest-mt
+ motif_version=$ac_cv_motif_version
+ motif_version_string=$ac_cv_motif_version_string
+
+fi
+
+
+###############################################################################
+#
+# Checking whether Motif requires -lXp.
+#
+# Some versions of Motif (2.1.0, at least) require -lXp, the "X Printing
+# Extension". Why this extension isn't in -lXext with all the others,
+# I have no idea.
+#
+###############################################################################
+
+have_xp_ext=no
+if test "$have_motif" = yes ; then
+ have_xp_ext=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XpQueryExtension in -lXp" >&5
+$as_echo_n "checking for XpQueryExtension in -lXp... " >&6; }
+if ${ac_cv_lib_Xp_XpQueryExtension+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXp -lX11 -lXext -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XpQueryExtension ();
+int
+main ()
+{
+return XpQueryExtension ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_Xp_XpQueryExtension=yes
+else
+ ac_cv_lib_Xp_XpQueryExtension=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xp_XpQueryExtension" >&5
+$as_echo "$ac_cv_lib_Xp_XpQueryExtension" >&6; }
+if test "x$ac_cv_lib_Xp_XpQueryExtension" = xyes; then :
+ have_xp_ext=yes; MOTIF_LIBS="$MOTIF_LIBS -lXp"
+else
+ true
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+fi
+
+
+###############################################################################
+#
+# Checking whether Motif requires -lXintl (for _Xsetlocale.)
+#
+###############################################################################
+
+have_xintl=no
+if test "$have_motif" = yes ; then
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _Xsetlocale in -lXintl" >&5
+$as_echo_n "checking for _Xsetlocale in -lXintl... " >&6; }
+if ${ac_cv_lib_Xintl__Xsetlocale+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXintl -lX11 -lXext -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char _Xsetlocale ();
+int
+main ()
+{
+return _Xsetlocale ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_Xintl__Xsetlocale=yes
+else
+ ac_cv_lib_Xintl__Xsetlocale=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xintl__Xsetlocale" >&5
+$as_echo "$ac_cv_lib_Xintl__Xsetlocale" >&6; }
+if test "x$ac_cv_lib_Xintl__Xsetlocale" = xyes; then :
+ have_xintl=yes
+else
+ have_xintl=no
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ if test "$have_xintl" = yes; then
+ MOTIF_LIBS="$MOTIF_LIBS -lXintl"
+ fi
+fi
+
+
+###############################################################################
+#
+# Check for -lGL or -lMesaGL.
+#
+###############################################################################
+
+have_gl=no
+ac_have_mesa_gl=no
+with_gl_req=unspecified
+gl_halfassed=no
+
+# Check whether --with-gl was given.
+if test "${with_gl+set}" = set; then :
+ withval=$with_gl; with_gl="$withval"; with_gl_req="$withval"
+else
+ with_gl=yes
+fi
+
+
+
+ case "$with_gl" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GL headers" >&5
+$as_echo_n "checking for GL headers... " >&6; }
+ d=$with_gl/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GL libs" >&5
+$as_echo_n "checking for GL libs... " >&6; }
+ d=$with_gl/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_gl_req="yes"
+ with_gl=$with_gl_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-gl must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+
+ac_mesagl_version=unknown
+ac_mesagl_version_string=unknown
+
+if test "$with_gl" = yes; then
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_mongrel "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default"
+if test "x$ac_cv_header_GL_gl_h" = xyes; then :
+ have_gl=yes
+else
+ have_gl=no
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ if test "$have_gl" = yes ; then
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "GL/glx.h" "ac_cv_header_GL_glx_h" "#include <GL/gl.h>
+"
+if test "x$ac_cv_header_GL_glx_h" = xyes; then :
+ have_gl=yes
+else
+ have_gl=no
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ fi
+
+ # If we have the headers, try and figure out which vendor it's from.
+ #
+ if test "$have_gl" = yes ; then
+
+ # We need to know whether it's MesaGL so that we know which libraries
+ # to link against.
+ #
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GL is really MesaGL" >&5
+$as_echo_n "checking whether GL is really MesaGL... " >&6; }
+if ${ac_cv_have_mesa_gl+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_have_mesa_gl=no
+ if test "$ac_macosx" = no; then
+ # WTF! MacOS 10.5.0 ships the Mesa GL headers!
+ # It's not really Mesa, is it?
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <GL/glx.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Mesa|MESA" >/dev/null 2>&1; then :
+ ac_cv_have_mesa_gl=yes
+fi
+rm -rf conftest*
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_mesa_gl" >&5
+$as_echo "$ac_cv_have_mesa_gl" >&6; }
+ ac_have_mesa_gl=$ac_cv_have_mesa_gl
+
+ gl_lib_1=""
+ GL_LIBS=""
+
+ if test "$ac_macosx" = yes; then
+
+ # Without these, every link against libGL gets a bunch of useless
+ # warnings.
+ #
+ osx_crud="-bind_at_load -multiply_defined suppress"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: adding \"$osx_crud\" to GL_LIBS" >&5
+$as_echo "adding \"$osx_crud\" to GL_LIBS" >&6; }
+ GL_LIBS="$GL_LIBS $osx_crud"
+ unset osx_crud
+
+ # New lossage in 10.5.0: without this, we get:
+ # ld: cycle in dylib re-exports with /usr/X11/lib/libGL.dylib
+ #
+ osx_crud="/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib"
+ osx_crud="-Wl,-dylib_file,${osx_crud}:${osx_crud}"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: adding \"$osx_crud\" to GL_LIBS" >&5
+$as_echo "adding \"$osx_crud\" to GL_LIBS" >&6; }
+ GL_LIBS="$GL_LIBS $osx_crud"
+ unset osx_crud
+
+ # New lossage in 10.6.8: we can't allow -L/opt/local/lib to be in the
+ # link line, or at runtime XQueryExtension gets a segv due to some kind
+ # of library version skew. Libs must come from /usr/X11/lib even if
+ # $prefix and/or $exec_prefix are set to /opt/local/.
+ #
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: omitting \"$libdir\" from LDFLAGS" >&5
+$as_echo "omitting \"$libdir\" from LDFLAGS" >&6; }
+ libdir=''
+
+ # Looks like as of OSX 10.12, gcc can't do ObjC.
+ OBJCC="clang -Wall"
+
+ fi
+
+
+ # Some versions of MesaGL are compiled to require -lpthread.
+ # So if the Mesa headers exist, and -lpthread exists, then always
+ # link -lpthread after the Mesa libs (be they named -lGL or -lMesaGL.)
+ #
+ # Oftentimes, AX_PTHREAD will bring in -lpthread as well; but that ends
+ # up before -l(Mesa)GL, instead of after where it would belong.
+ #
+ if test "$ac_have_mesa_gl" = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5
+$as_echo_n "checking for pthread_create in -lpthread... " >&6; }
+if ${ac_cv_lib_pthread_pthread_create+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char pthread_create ();
+int
+main ()
+{
+return pthread_create ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_pthread_pthread_create=yes
+else
+ ac_cv_lib_pthread_pthread_create=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5
+$as_echo "$ac_cv_lib_pthread_pthread_create" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then :
+ GL_LIBS="-lpthread"
+fi
+
+ fi
+
+
+ # If we have Mesa headers, check to see if we can link against -lMesaGL.
+ # If we don't have Mesa headers, or we don't have -lMesaGL, try -lGL.
+ # Else, warn that GL is busted. (We have the headers, but no libs.)
+ #
+
+ if test "$ac_have_mesa_gl" = yes ; then
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glXCreateContext in -lMesaGL" >&5
+$as_echo_n "checking for glXCreateContext in -lMesaGL... " >&6; }
+if ${ac_cv_lib_MesaGL_glXCreateContext+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lMesaGL -lMesaGLU $GL_LIBS -lX11 -lXext $VIDMODE_LIBS -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char glXCreateContext ();
+int
+main ()
+{
+return glXCreateContext ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_MesaGL_glXCreateContext=yes
+else
+ ac_cv_lib_MesaGL_glXCreateContext=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_MesaGL_glXCreateContext" >&5
+$as_echo "$ac_cv_lib_MesaGL_glXCreateContext" >&6; }
+if test "x$ac_cv_lib_MesaGL_glXCreateContext" = xyes; then :
+ gl_lib_1="MesaGL"
+ GL_LIBS="-lMesaGL -lMesaGLU $VIDMODE_LIBS $GL_LIBS"
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
+
+ if test "$gl_lib_1" = "" ; then
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glXCreateContext in -lGL" >&5
+$as_echo_n "checking for glXCreateContext in -lGL... " >&6; }
+if ${ac_cv_lib_GL_glXCreateContext+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lGL -lGLU $GL_LIBS -lX11 -lXext $VIDMODE_LIBS -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char glXCreateContext ();
+int
+main ()
+{
+return glXCreateContext ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_GL_glXCreateContext=yes
+else
+ ac_cv_lib_GL_glXCreateContext=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GL_glXCreateContext" >&5
+$as_echo "$ac_cv_lib_GL_glXCreateContext" >&6; }
+if test "x$ac_cv_lib_GL_glXCreateContext" = xyes; then :
+ gl_lib_1="GL"
+ GL_LIBS="-lGL -lGLU $VIDMODE_LIBS $GL_LIBS"
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
+
+ if test "$gl_lib_1" = "" ; then
+ # we have headers, but no libs -- bail.
+ have_gl=no
+ ac_have_mesa_gl=no
+ gl_halfassed=yes
+ else
+ # linking works -- we can build the GL hacks.
+ $as_echo "#define HAVE_GL 1" >>confdefs.h
+
+ if test "$ac_have_mesa_gl" = yes ; then
+ $as_echo "#define HAVE_MESA_GL 1" >>confdefs.h
+
+ fi
+ fi
+ fi
+
+
+ # Now that we know we have GL headers and libs, do some more GL testing.
+ #
+
+ if test "$have_gl" = yes ; then
+ # If it's MesaGL, we'd like to issue a warning if the version number
+ # is less than or equal to 2.6, because that version had a security bug.
+ #
+ if test "$ac_have_mesa_gl" = yes; then
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking MesaGL version number" >&5
+$as_echo_n "checking MesaGL version number... " >&6; }
+if ${ac_cv_mesagl_version_string+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 13358 "configure"
+#include "confdefs.h"
+#include <GL/gl.h>
+#ifndef MESA_MAJOR_VERSION
+# include <GL/xmesa.h>
+# ifdef XMESA_MAJOR_VERSION
+ /* Around Mesa 3.2, they took out the Mesa version number, so instead,
+ we have to check the XMesa version number (the number of the X protocol
+ support, which seems to be the same as the Mesa version number.)
+ */
+# define MESA_MAJOR_VERSION XMESA_MAJOR_VERSION
+# define MESA_MINOR_VERSION XMESA_MINOR_VERSION
+# else
+ /* Oh great. Some time after 3.4, they took out the xmesa.h header file,
+ so we have no way of telling what version of Mesa this is at all.
+ So, we'll guess that the osmesa version (the "offscreen protocol")
+ is less than or equal to the real mesa version number. Except that
+ if OSmesa is 3.3, assume at least Mesa 3.4, since OSmesa was 3.3 in
+ Mesa 3.4. And Mesa 3.3 had xmesa.h. What a complete load of shit!
+ */
+# include <GL/osmesa.h>
+# define MESA_MAJOR_VERSION OSMESA_MAJOR_VERSION
+# define MESA_MINOR_VERSION OSMESA_MINOR_VERSION or newer, probably?
+# if OSMESA_MAJOR_VERSION == 3 && OSMESA_MINOR_VERSION == 3
+# undef MESA_MINOR_VERSION
+# define MESA_MINOR_VERSION 4 or newer, probably?
+# endif
+# endif
+#endif
+configure: MESA_MAJOR_VERSION MESA_MINOR_VERSION
+EOF
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ mglv=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | grep configure:`
+
+ # M4 sucks!!
+
+ mglv=`echo "$mglv" | sed -n \
+ 's/^configure: *\([0-9][0-9]*\) *\([0-9].*\)$/\1.\2/p'`
+
+
+ rm -rf conftest.$ac_ext
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+ if test "$mglv" = ""; then
+ ac_mesagl_version=unknown
+ ac_mesagl_version_string=unknown
+ else
+ ac_mesagl_version_string="$mglv"
+ # M4 sucks!!
+
+ maj=`echo "$mglv" | sed -n 's/^\([0-9][0-9]*\)\..*$/\1/p'`
+ min=`echo "$mglv" | sed -n 's/^.*\.\([0-9][0-9]*\).*$/\1/p'`
+
+ ac_mesagl_version=`echo "$maj * 1000 + $min" | bc`
+ if test -z "$ac_mesagl_version"; then
+ ac_mesagl_version=unknown
+ ac_mesagl_version_string=unknown
+ fi
+ fi
+ ac_cv_mesagl_version=$ac_mesagl_version
+ ac_cv_mesagl_version_string=$ac_mesagl_version_string
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_mesagl_version_string" >&5
+$as_echo "$ac_cv_mesagl_version_string" >&6; }
+ ac_mesagl_version=$ac_cv_mesagl_version
+ ac_mesagl_version_string=$ac_cv_mesagl_version_string
+ fi
+
+
+ # Check for OpenGL 1.1 features.
+ #
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ as_ac_Lib=`$as_echo "ac_cv_lib_$gl_lib_1''_glBindTexture" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for glBindTexture in -l$gl_lib_1" >&5
+$as_echo_n "checking for glBindTexture in -l$gl_lib_1... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$gl_lib_1 $GL_LIBS -lX11 -lXext -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char glBindTexture ();
+int
+main ()
+{
+return glBindTexture ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ $as_echo "#define HAVE_GLBINDTEXTURE 1" >>confdefs.h
+
+else
+ true
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
+
+elif test "$with_gl" != no; then
+ echo "error: must be yes or no: --with-gl=$with_gl"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for -lgle.
+#
+###############################################################################
+
+have_gle=no
+with_gle_req=unspecified
+gle_halfassed=no
+
+# Check whether --with-gle was given.
+if test "${with_gle+set}" = set; then :
+ withval=$with_gle; with_gle="$withval"; with_gle_req="$withval"
+else
+ with_gle=yes
+fi
+
+
+
+ case "$with_gle" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLE headers" >&5
+$as_echo_n "checking for GLE headers... " >&6; }
+ d=$with_gle/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLE libs" >&5
+$as_echo_n "checking for GLE libs... " >&6; }
+ d=$with_gle/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_gle_req="yes"
+ with_gle=$with_gle_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-gle must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+
+GLE_LIBS=""
+
+if test "$have_gl" = no ; then
+ true
+elif test "$with_gle" = yes; then
+
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "GL/gle.h" "ac_cv_header_GL_gle_h" "#include <GL/gl.h>
+"
+if test "x$ac_cv_header_GL_gle_h" = xyes; then :
+ have_gle3=yes
+else
+ have_gle3=no
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ if test "$have_gle3" = yes ; then
+ have_gle=yes;
+ else
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "GL/gutil.h" "ac_cv_header_GL_gutil_h" "#include <GL/gl.h>
+"
+if test "x$ac_cv_header_GL_gutil_h" = xyes; then :
+ have_gle=yes
+else
+ have_gle=no
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ if test "$have_gle" = yes ; then
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "GL/tube.h" "ac_cv_header_GL_tube_h" "#include <GL/gl.h>
+"
+if test "x$ac_cv_header_GL_tube_h" = xyes; then :
+ have_gle=yes
+else
+ have_gle=no
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ fi
+ fi
+
+ if test "$have_gle" = yes ; then
+ have_gle=no
+ gle_halfassed=yes
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gleCreateGC in -lgle" >&5
+$as_echo_n "checking for gleCreateGC in -lgle... " >&6; }
+if ${ac_cv_lib_gle_gleCreateGC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgle $GL_LIBS -lX11 -lXext -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gleCreateGC ();
+int
+main ()
+{
+return gleCreateGC ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_gle_gleCreateGC=yes
+else
+ ac_cv_lib_gle_gleCreateGC=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gle_gleCreateGC" >&5
+$as_echo "$ac_cv_lib_gle_gleCreateGC" >&6; }
+if test "x$ac_cv_lib_gle_gleCreateGC" = xyes; then :
+ have_gle=yes; gle_halfassed=no; GLE_LIBS="-lgle"
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
+ if test "$have_gle" = yes ; then
+ have_gle=no
+ gle_halfassed=yes
+
+ # sometimes the libmatrix stuff is included in libgle. look there first.
+#
+# I don't get it. For some reason, this test passes on SGI, as if
+# uview_direction_d() was in libgle -- but it's not, it's in libmatrix.
+# Yet the link is succeeding. Why???
+#
+# AC_CHECK_X_LIB(gle, uview_direction_d,
+# [have_gle=yes; gle_halfassed=no],
+# [], $GL_LIBS -lX11 -lXext -lm)
+
+ # As of GLE 3 this is in libgle, and has changed name to uview_direction!
+ # *sigh*
+ if test "$have_gle3" = yes ; then
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uview_direction in -lgle" >&5
+$as_echo_n "checking for uview_direction in -lgle... " >&6; }
+if ${ac_cv_lib_gle_uview_direction+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgle $GL_LIBS -lX11 -lXext -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char uview_direction ();
+int
+main ()
+{
+return uview_direction ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_gle_uview_direction=yes
+else
+ ac_cv_lib_gle_uview_direction=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gle_uview_direction" >&5
+$as_echo "$ac_cv_lib_gle_uview_direction" >&6; }
+if test "x$ac_cv_lib_gle_uview_direction" = xyes; then :
+ have_gle=yes; gle_halfassed=no
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
+ # if it wasn't in libgle, then look in libmatrix.
+ if test "$have_gle" = no ; then
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uview_direction_d in -lmatrix" >&5
+$as_echo_n "checking for uview_direction_d in -lmatrix... " >&6; }
+if ${ac_cv_lib_matrix_uview_direction_d+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lmatrix $GL_LIBS -lX11 -lXext -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char uview_direction_d ();
+int
+main ()
+{
+return uview_direction_d ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_matrix_uview_direction_d=yes
+else
+ ac_cv_lib_matrix_uview_direction_d=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_matrix_uview_direction_d" >&5
+$as_echo "$ac_cv_lib_matrix_uview_direction_d" >&6; }
+if test "x$ac_cv_lib_matrix_uview_direction_d" = xyes; then :
+ have_gle=yes; gle_halfassed=no;
+ GLE_LIBS="$GLE_LIBS -lmatrix"
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
+ fi
+
+ if test "$have_gle" = yes ; then
+ $as_echo "#define HAVE_GLE 1" >>confdefs.h
+
+ if test "$have_gle3" = yes ; then
+ $as_echo "#define HAVE_GLE3 1" >>confdefs.h
+
+ fi
+ fi
+
+elif test "$with_gle" != no; then
+ echo "error: must be yes or no: --with-gle=$with_gle"
+ exit 1
+
+fi
+
+
+###############################################################################
+#
+# Handle --with-gles
+#
+###############################################################################
+
+with_gles_req=unspecified
+
+# Check whether --with-gles was given.
+if test "${with_gles+set}" = set; then :
+ withval=$with_gles; with_gles="$withval"; with_gles_req="$withval"
+else
+ with_gles=no
+fi
+
+
+
+ case "$with_gles" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JWZGLES headers" >&5
+$as_echo_n "checking for JWZGLES headers... " >&6; }
+ d=$with_gles/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JWZGLES libs" >&5
+$as_echo_n "checking for JWZGLES libs... " >&6; }
+ d=$with_gles/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_gles_req="yes"
+ with_gles=$with_gles_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-gles must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+
+if test "$with_gles" = yes; then
+ have_gles=yes
+ $as_echo "#define HAVE_JWZGLES 1" >>confdefs.h
+
+ JWZGLES_OBJS='$(JWXYZ_BIN)/jwzgles.o'
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: using OpenGL ES compatiblity shim" >&5
+$as_echo "using OpenGL ES compatiblity shim" >&6; }
+elif test "$with_gles" != no; then
+ echo "error: must be yes or no: --with-gles=$with_gles"
+ exit 1
+fi
+
+###############################################################################
+#
+# Check for -lpng
+#
+###############################################################################
+
+have_png=no
+with_png_req=unspecified
+png_halfassed=no
+
+# Check whether --with-png was given.
+if test "${with_png+set}" = set; then :
+ withval=$with_png; with_png="$withval"; with_png_req="$withval"
+else
+ with_png=yes
+fi
+
+
+
+ case "$with_png" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PNG headers" >&5
+$as_echo_n "checking for PNG headers... " >&6; }
+ d=$with_png/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PNG libs" >&5
+$as_echo_n "checking for PNG libs... " >&6; }
+ d=$with_png/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_png_req="yes"
+ with_png=$with_png_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-png must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+
+if test "$with_png" != yes -a "$with_png" != no ; then
+ echo "error: must be yes or no: --with-png=$with_png"
+ exit 1
+fi
+
+if test "$with_png" = yes; then
+
+ have_png=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_mongrel "$LINENO" "png.h" "ac_cv_header_png_h" "$ac_includes_default"
+if test "x$ac_cv_header_png_h" = xyes; then :
+ have_png=yes
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+ if test "$have_png" = yes; then
+ # we have the header, now check for the library
+ have_png=no
+ png_halfassed=yes
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_create_read_struct in -lpng" >&5
+$as_echo_n "checking for png_create_read_struct in -lpng... " >&6; }
+if ${ac_cv_lib_png_png_create_read_struct+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpng $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char png_create_read_struct ();
+int
+main ()
+{
+return png_create_read_struct ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_png_png_create_read_struct=yes
+else
+ ac_cv_lib_png_png_create_read_struct=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_create_read_struct" >&5
+$as_echo "$ac_cv_lib_png_png_create_read_struct" >&6; }
+if test "x$ac_cv_lib_png_png_create_read_struct" = xyes; then :
+ have_png=yes
+ png_halfassed=no
+ PNG_LIBS="-lpng"
+ $as_echo "#define HAVE_LIBPNG 1" >>confdefs.h
+
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
+fi
+
+
+###############################################################################
+#
+# Check for -lgdk_pixbuf.
+# These tests are for gdk_pixbuf usage of the hacks,
+# not xscreensaver-demo (thus we have to test again to get
+# the libraries right: don't want to pull in all of GTK
+# for the hacks.)
+#
+###############################################################################
+
+have_gdk_pixbuf=no
+with_gdk_pixbuf_req=unspecified
+
+# Check whether --with-pixbuf was given.
+if test "${with_pixbuf+set}" = set; then :
+ withval=$with_pixbuf; with_gdk_pixbuf="$withval"; with_gdk_pixbuf_req="$withval"
+else
+ with_gdk_pixbuf=yes
+fi
+
+
+# if --with-pixbuf=/directory/ was specified, remember that directory so that
+# we can also look for the `gdk-pixbuf-config' program in that directory.
+case "$with_gdk_pixbuf" in
+ /*)
+ gdk_pixbuf_dir="$with_gdk_pixbuf"
+ ;;
+ *)
+ gdk_pixbuf_dir=""
+ ;;
+esac
+
+
+ case "$with_gdk_pixbuf" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GDK_PIXBUF headers" >&5
+$as_echo_n "checking for GDK_PIXBUF headers... " >&6; }
+ d=$with_gdk_pixbuf/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GDK_PIXBUF libs" >&5
+$as_echo_n "checking for GDK_PIXBUF libs... " >&6; }
+ d=$with_gdk_pixbuf/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_gdk_pixbuf_req="yes"
+ with_gdk_pixbuf=$with_gdk_pixbuf_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-pixbuf must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+
+if test "$with_gdk_pixbuf" != yes -a "$with_gdk_pixbuf" != no ; then
+ echo "error: must be yes or no: --with-pixbuf=$with_gdk_pixbuf"
+ exit 1
+fi
+
+if test "$with_gdk_pixbuf" = yes; then
+ have_gdk_pixbuf=no
+
+ pkgs=''
+ ok="yes"
+
+ pkg_check_version gdk-pixbuf-2.0 2.0.0
+ pkg_check_version gdk-pixbuf-xlib-2.0 2.0.0
+ pkg_check_version gio-2.0 2.0.0
+ have_gdk_pixbuf="$ok"
+
+ if test "$have_gdk_pixbuf" = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdk-pixbuf includes" >&5
+$as_echo_n "checking for gdk-pixbuf includes... " >&6; }
+if ${ac_cv_gdk_pixbuf_config_cflags+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_gdk_pixbuf_config_cflags=`$pkg_config --cflags $pkgs`
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gdk_pixbuf_config_cflags" >&5
+$as_echo "$ac_cv_gdk_pixbuf_config_cflags" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdk-pixbuf libs" >&5
+$as_echo_n "checking for gdk-pixbuf libs... " >&6; }
+if ${ac_cv_gdk_pixbuf_config_libs+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_gdk_pixbuf_config_libs=`$pkg_config --libs $pkgs`
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gdk_pixbuf_config_libs" >&5
+$as_echo "$ac_cv_gdk_pixbuf_config_libs" >&6; }
+ fi
+
+ ac_gdk_pixbuf_config_cflags=$ac_cv_gdk_pixbuf_config_cflags
+ ac_gdk_pixbuf_config_libs=$ac_cv_gdk_pixbuf_config_libs
+
+
+ if test "$have_gdk_pixbuf" = yes; then
+ #
+ # we appear to have pixbuf; check for headers/libs to be sure.
+ #
+ ac_save_gdk_pixbuf_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $ac_gdk_pixbuf_config_cflags"
+
+ have_gdk_pixbuf=no
+
+ # check for header A...
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_mongrel "$LINENO" "gdk-pixbuf/gdk-pixbuf.h" "ac_cv_header_gdk_pixbuf_gdk_pixbuf_h" "$ac_includes_default"
+if test "x$ac_cv_header_gdk_pixbuf_gdk_pixbuf_h" = xyes; then :
+ have_gdk_pixbuf=yes
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+ # if that worked, check for header B...
+ if test "$have_gdk_pixbuf" = yes; then
+ have_gdk_pixbuf=no
+ gdk_pixbuf_halfassed=yes
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_mongrel "$LINENO" "gdk-pixbuf/gdk-pixbuf-xlib.h" "ac_cv_header_gdk_pixbuf_gdk_pixbuf_xlib_h" "$ac_includes_default"
+if test "x$ac_cv_header_gdk_pixbuf_gdk_pixbuf_xlib_h" = xyes; then :
+ have_gdk_pixbuf=yes
+ gdk_pixbuf_halfassed=no
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+ # yay, it has a new name in Gtk 2.x...
+ if test "$have_gdk_pixbuf" = no; then
+ have_gdk_pixbuf=no
+ gdk_pixbuf_halfassed=yes
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_mongrel "$LINENO" "gdk-pixbuf-xlib/gdk-pixbuf-xlib.h" "ac_cv_header_gdk_pixbuf_xlib_gdk_pixbuf_xlib_h" "$ac_includes_default"
+if test "x$ac_cv_header_gdk_pixbuf_xlib_gdk_pixbuf_xlib_h" = xyes; then :
+ have_gdk_pixbuf=yes
+ gdk_pixbuf_halfassed=no
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ fi
+ fi
+ CPPFLAGS="$ac_save_gdk_pixbuf_CPPFLAGS"
+ fi
+
+ if test "$have_gdk_pixbuf" = yes; then
+ # we have the headers, now check for the libraries
+ have_gdk_pixbuf=no
+ gdk_pixbuf_halfassed=yes
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for gdk_pixbuf usability..." >&5
+$as_echo "checking for gdk_pixbuf usability..." >&6; }
+
+ # library A...
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdk_pixbuf_new_from_file in -lc" >&5
+$as_echo_n "checking for gdk_pixbuf_new_from_file in -lc... " >&6; }
+if ${ac_cv_lib_c_gdk_pixbuf_new_from_file+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc $ac_gdk_pixbuf_config_libs -lX11 -lXext -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gdk_pixbuf_new_from_file ();
+int
+main ()
+{
+return gdk_pixbuf_new_from_file ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_c_gdk_pixbuf_new_from_file=yes
+else
+ ac_cv_lib_c_gdk_pixbuf_new_from_file=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_gdk_pixbuf_new_from_file" >&5
+$as_echo "$ac_cv_lib_c_gdk_pixbuf_new_from_file" >&6; }
+if test "x$ac_cv_lib_c_gdk_pixbuf_new_from_file" = xyes; then :
+ have_gdk_pixbuf=yes
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ # library B...
+ if test "$have_gdk_pixbuf" = yes; then
+ have_gdk_pixbuf=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdk_pixbuf_xlib_init in -lc" >&5
+$as_echo_n "checking for gdk_pixbuf_xlib_init in -lc... " >&6; }
+if ${ac_cv_lib_c_gdk_pixbuf_xlib_init+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc $ac_gdk_pixbuf_config_libs -lX11 -lXext -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gdk_pixbuf_xlib_init ();
+int
+main ()
+{
+return gdk_pixbuf_xlib_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_c_gdk_pixbuf_xlib_init=yes
+else
+ ac_cv_lib_c_gdk_pixbuf_xlib_init=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_gdk_pixbuf_xlib_init" >&5
+$as_echo "$ac_cv_lib_c_gdk_pixbuf_xlib_init" >&6; }
+if test "x$ac_cv_lib_c_gdk_pixbuf_xlib_init" = xyes; then :
+ have_gdk_pixbuf=yes
+ gdk_pixbuf_halfassed=no
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
+ fi
+
+ if test "$have_gdk_pixbuf" = yes; then
+ INCLUDES="$INCLUDES $ac_gdk_pixbuf_config_cflags"
+ PNG_LIBS="$ac_gdk_pixbuf_config_libs"
+ $as_echo "#define HAVE_GDK_PIXBUF 1" >>confdefs.h
+
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for gdk_pixbuf usability... no" >&5
+$as_echo "checking for gdk_pixbuf usability... no" >&6; }
+ fi
+
+ if test "$have_gdk_pixbuf" = yes; then
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdk_pixbuf_apply_embedded_orientation in -lc" >&5
+$as_echo_n "checking for gdk_pixbuf_apply_embedded_orientation in -lc... " >&6; }
+if ${ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc $ac_gdk_pixbuf_config_libs -lX11 -lXext -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gdk_pixbuf_apply_embedded_orientation ();
+int
+main ()
+{
+return gdk_pixbuf_apply_embedded_orientation ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation=yes
+else
+ ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation" >&5
+$as_echo "$ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation" >&6; }
+if test "x$ac_cv_lib_c_gdk_pixbuf_apply_embedded_orientation" = xyes; then :
+ $as_echo "#define HAVE_GDK_PIXBUF_APPLY_EMBEDDED_ORIENTATION 1" >>confdefs.h
+
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
+fi
+
+
+###############################################################################
+#
+# Check for -ljpeg
+#
+###############################################################################
+
+have_jpeg=no
+with_jpeg_req=unspecified
+jpeg_halfassed=no
+
+# Check whether --with-jpeg was given.
+if test "${with_jpeg+set}" = set; then :
+ withval=$with_jpeg; with_jpeg="$withval"; with_jpeg_req="$withval"
+else
+ with_jpeg=yes
+fi
+
+
+
+ case "$with_jpeg" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JPEG headers" >&5
+$as_echo_n "checking for JPEG headers... " >&6; }
+ d=$with_jpeg/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JPEG libs" >&5
+$as_echo_n "checking for JPEG libs... " >&6; }
+ d=$with_jpeg/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_jpeg_req="yes"
+ with_jpeg=$with_jpeg_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-jpeg must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+
+if test "$with_jpeg" != yes -a "$with_jpeg" != no ; then
+ echo "error: must be yes or no: --with-jpeg=$with_jpeg"
+ exit 1
+fi
+
+if test "$with_jpeg" = yes; then
+
+ have_jpeg=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default"
+if test "x$ac_cv_header_jpeglib_h" = xyes; then :
+ have_jpeg=yes
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+ if test "$have_jpeg" = yes; then
+ # we have the header, now check for the library
+ have_jpeg=no
+ jpeg_halfassed=yes
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_start_compress in -ljpeg" >&5
+$as_echo_n "checking for jpeg_start_compress in -ljpeg... " >&6; }
+if ${ac_cv_lib_jpeg_jpeg_start_compress+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ljpeg $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char jpeg_start_compress ();
+int
+main ()
+{
+return jpeg_start_compress ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_jpeg_jpeg_start_compress=yes
+else
+ ac_cv_lib_jpeg_jpeg_start_compress=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_start_compress" >&5
+$as_echo "$ac_cv_lib_jpeg_jpeg_start_compress" >&6; }
+if test "x$ac_cv_lib_jpeg_jpeg_start_compress" = xyes; then :
+ have_jpeg=yes
+ jpeg_halfassed=no
+ JPEG_LIBS="-ljpeg"
+ $as_echo "#define HAVE_JPEGLIB 1" >>confdefs.h
+
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
+fi
+
+
+###############################################################################
+#
+# Check for -lXft
+#
+###############################################################################
+
+have_xutf8drawstring=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xutf8DrawString in -lX11" >&5
+$as_echo_n "checking for Xutf8DrawString in -lX11... " >&6; }
+if ${ac_cv_lib_X11_Xutf8DrawString+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lX11 -lX11 -lXext -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char Xutf8DrawString ();
+int
+main ()
+{
+return Xutf8DrawString ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_X11_Xutf8DrawString=yes
+else
+ ac_cv_lib_X11_Xutf8DrawString=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_X11_Xutf8DrawString" >&5
+$as_echo "$ac_cv_lib_X11_Xutf8DrawString" >&6; }
+if test "x$ac_cv_lib_X11_Xutf8DrawString" = xyes; then :
+ have_xutf8drawstring=yes
+else
+ true
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+if test "$have_xutf8drawstring" = yes ; then
+ $as_echo "#define HAVE_XUTF8DRAWSTRING 1" >>confdefs.h
+
+fi
+
+
+have_xft=no
+with_xft_req=unspecified
+xft_halfassed=no
+
+# Check whether --with-xft was given.
+if test "${with_xft+set}" = set; then :
+ withval=$with_xft; with_xft="$withval"; with_xft_req="$withval"
+else
+ with_xft=yes
+fi
+
+
+
+ case "$with_xft" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xft headers" >&5
+$as_echo_n "checking for Xft headers... " >&6; }
+ d=$with_xft/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xft libs" >&5
+$as_echo_n "checking for Xft libs... " >&6; }
+ d=$with_xft/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_xft_req="yes"
+ with_xft=$with_xft_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-xft must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+
+if test "$with_xft" != yes -a "$with_xft" != no ; then
+ echo "error: must be yes or no: --with-xft=$with_xft"
+ exit 1
+fi
+
+if test "$with_xft" = yes; then
+
+ pkgs=''
+ ok="yes"
+ pkg_check_version xft 2.1.0
+ have_xft="$ok"
+
+ if test "$have_xft" = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xft includes" >&5
+$as_echo_n "checking for Xft includes... " >&6; }
+if ${ac_cv_xft_config_cflags+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_xft_config_cflags=`$pkg_config --cflags $pkgs`
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_xft_config_cflags" >&5
+$as_echo "$ac_cv_xft_config_cflags" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xft libs" >&5
+$as_echo_n "checking for Xft libs... " >&6; }
+if ${ac_cv_xft_config_libs+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_xft_config_libs=`$pkg_config --libs $pkgs`
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_xft_config_libs" >&5
+$as_echo "$ac_cv_xft_config_libs" >&6; }
+ fi
+
+ ac_xft_config_cflags=$ac_cv_xft_config_cflags
+ ac_xft_config_libs=$ac_cv_xft_config_libs
+
+ if test "$have_xft" = yes; then
+ #
+ # we appear to have Xft; check for headers/libs to be sure.
+ #
+ ac_save_xft_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $ac_xft_config_cflags"
+
+ have_xft=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_mongrel "$LINENO" "X11/Xft/Xft.h" "ac_cv_header_X11_Xft_Xft_h" "$ac_includes_default"
+if test "x$ac_cv_header_X11_Xft_Xft_h" = xyes; then :
+ have_xft=yes
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+ CPPFLAGS="$ac_save_xft_CPPFLAGS"
+ fi
+
+ if test "$have_xft" = yes; then
+ # we have the headers, now check for the libraries
+ have_xft=no
+ xft_halfassed=yes
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for Xft usability..." >&5
+$as_echo "checking for Xft usability..." >&6; }
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XftDrawStringUtf8 in -lc" >&5
+$as_echo_n "checking for XftDrawStringUtf8 in -lc... " >&6; }
+if ${ac_cv_lib_c_XftDrawStringUtf8+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc $ac_xft_config_libs -lX11 -lXext -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XftDrawStringUtf8 ();
+int
+main ()
+{
+return XftDrawStringUtf8 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_c_XftDrawStringUtf8=yes
+else
+ ac_cv_lib_c_XftDrawStringUtf8=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_XftDrawStringUtf8" >&5
+$as_echo "$ac_cv_lib_c_XftDrawStringUtf8" >&6; }
+if test "x$ac_cv_lib_c_XftDrawStringUtf8" = xyes; then :
+ have_xft=yes
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
+
+ if test "$have_xft" = no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for Xft usability... no" >&5
+$as_echo "checking for Xft usability... no" >&6; }
+ fi
+fi
+
+if test "$have_xft" = yes; then
+ INCLUDES="$INCLUDES $ac_xft_config_cflags"
+ XFT_LIBS="$ac_xft_config_libs"
+ XFT_SRCS=''
+ XFT_OBJS=''
+ $as_echo "#define HAVE_XFT 1" >>confdefs.h
+
+else
+ XFT_LIBS=''
+ XFT_SRCS='$(UTILS_SRC)/xft.c'
+ XFT_OBJS='$(UTILS_BIN)/xft.o'
+fi
+
+
+###############################################################################
+#
+# Check for pty support: this allows 'phosphor' and 'apple2'
+# to run curses-based programs, or be used as terminal windows.
+#
+###############################################################################
+
+PTY_LIBS=
+for ac_header in pty.h util.h sys/termios.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for forkpty in -lutil" >&5
+$as_echo_n "checking for forkpty in -lutil... " >&6; }
+if ${ac_cv_lib_util_forkpty+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lutil $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char forkpty ();
+int
+main ()
+{
+return forkpty ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_util_forkpty=yes
+else
+ ac_cv_lib_util_forkpty=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_forkpty" >&5
+$as_echo "$ac_cv_lib_util_forkpty" >&6; }
+if test "x$ac_cv_lib_util_forkpty" = xyes; then :
+ PTY_LIBS="-lutil"
+ ac_have_forkpty=yes
+ $as_echo "#define HAVE_FORKPTY 1" >>confdefs.h
+
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+
+if test "$ac_have_forkpty" != yes ; then
+ # we don't need (or have) -lutil on MacOS 10.4.2...
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for forkpty in -lc" >&5
+$as_echo_n "checking for forkpty in -lc... " >&6; }
+if ${ac_cv_lib_c_forkpty+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char forkpty ();
+int
+main ()
+{
+return forkpty ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_c_forkpty=yes
+else
+ ac_cv_lib_c_forkpty=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_forkpty" >&5
+$as_echo "$ac_cv_lib_c_forkpty" >&6; }
+if test "x$ac_cv_lib_c_forkpty" = xyes; then :
+ PTY_LIBS=""
+ $as_echo "#define HAVE_FORKPTY 1" >>confdefs.h
+
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+fi
+
+###############################################################################
+#
+# Check for the XSHM server extension.
+#
+###############################################################################
+
+have_xshm=no
+with_xshm_req=unspecified
+
+# Check whether --with-xshm-ext was given.
+if test "${with_xshm_ext+set}" = set; then :
+ withval=$with_xshm_ext; with_xshm="$withval"; with_xshm_req="$withval"
+else
+ with_xshm=yes
+fi
+
+
+
+ case "$with_xshm" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XSHM headers" >&5
+$as_echo_n "checking for XSHM headers... " >&6; }
+ d=$with_xshm/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XSHM libs" >&5
+$as_echo_n "checking for XSHM libs... " >&6; }
+ d=$with_xshm/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_xshm_req="yes"
+ with_xshm=$with_xshm_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-xshm-ext must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+
+if test "$with_xshm" = yes; then
+
+ # first check for Xshm.h.
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "X11/extensions/XShm.h" "ac_cv_header_X11_extensions_XShm_h" "#include <X11/Xlib.h>
+"
+if test "x$ac_cv_header_X11_extensions_XShm_h" = xyes; then :
+ have_xshm=yes
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+ # if that succeeded, then check for sys/ipc.h.
+ if test "$have_xshm" = yes; then
+ have_xshm=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_mongrel "$LINENO" "sys/ipc.h" "ac_cv_header_sys_ipc_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_ipc_h" = xyes; then :
+ have_xshm=yes
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ fi
+
+ # if that succeeded, then check for sys/shm.h.
+ if test "$have_xshm" = yes; then
+ have_xshm=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_mongrel "$LINENO" "sys/shm.h" "ac_cv_header_sys_shm_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_shm_h" = xyes; then :
+ have_xshm=yes
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ fi
+
+ # AIX is pathological, as usual: apparently it's normal for the Xshm headers
+ # to exist, but the library code to not exist. And even better, the library
+ # code is in its own library: libXextSam.a. So, if we're on AIX, and that
+ # lib doesn't exist, give up. (This lib gets added to X_EXTRA_LIBS, and
+ # that's not quite right, but close enough.)
+ #
+ case "$host" in
+ *-aix*)
+ if `uname -v` -eq 3 ; then
+ have_xshm=no
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XShmQueryExtension in -lXextSam" >&5
+$as_echo_n "checking for XShmQueryExtension in -lXextSam... " >&6; }
+if ${ac_cv_lib_XextSam_XShmQueryExtension+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXextSam -lX11 -lXext -lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XShmQueryExtension ();
+int
+main ()
+{
+return XShmQueryExtension ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_XextSam_XShmQueryExtension=yes
+else
+ ac_cv_lib_XextSam_XShmQueryExtension=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_XextSam_XShmQueryExtension" >&5
+$as_echo "$ac_cv_lib_XextSam_XShmQueryExtension" >&6; }
+if test "x$ac_cv_lib_XextSam_XShmQueryExtension" = xyes; then :
+ have_xshm=yes; X_EXTRA_LIBS="$X_EXTRA_LIBS -lXextSam"
+else
+ true
+fi
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+
+ fi
+ ;;
+ esac
+
+ # if that succeeded, then we've really got it.
+ if test "$have_xshm" = yes; then
+ $as_echo "#define HAVE_XSHM_EXTENSION 1" >>confdefs.h
+
+ fi
+
+elif test "$with_xshm" != no; then
+ echo "error: must be yes or no: --with-xshm-ext=$with_xshm"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for the DOUBLE-BUFFER server extension.
+#
+###############################################################################
+
+have_xdbe=no
+with_xdbe_req=unspecified
+
+# Check whether --with-xdbe-ext was given.
+if test "${with_xdbe_ext+set}" = set; then :
+ withval=$with_xdbe_ext; with_xdbe="$withval"; with_xdbe_req="$withval"
+else
+ with_xdbe=yes
+fi
+
+
+
+ case "$with_xdbe" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DOUBLE-BUFFER headers" >&5
+$as_echo_n "checking for DOUBLE-BUFFER headers... " >&6; }
+ d=$with_xdbe/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DOUBLE-BUFFER libs" >&5
+$as_echo_n "checking for DOUBLE-BUFFER libs... " >&6; }
+ d=$with_xdbe/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_xdbe_req="yes"
+ with_xdbe=$with_xdbe_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-xdbe-ext must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+
+if test "$with_xdbe" = yes; then
+
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "X11/extensions/Xdbe.h" "ac_cv_header_X11_extensions_Xdbe_h" "#include <X11/Xlib.h>
+"
+if test "x$ac_cv_header_X11_extensions_Xdbe_h" = xyes; then :
+ have_xdbe=yes
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ if test "$have_xdbe" = yes; then
+ $as_echo "#define HAVE_DOUBLE_BUFFER_EXTENSION 1" >>confdefs.h
+
+ fi
+
+elif test "$with_xdbe" != no; then
+ echo "error: must be yes or no: --with-xdbe-ext=$with_xshm"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for the SGI XReadDisplay server extension.
+#
+# Note: this has to be down here, rather than up with the other server
+# extension tests, so that the output of `configure --help' is in the
+# right order. Arrgh!
+#
+###############################################################################
+
+have_readdisplay=no
+with_readdisplay_req=unspecified
+
+# Check whether --with-readdisplay was given.
+if test "${with_readdisplay+set}" = set; then :
+ withval=$with_readdisplay; with_readdisplay="$withval"; with_readdisplay_req="$withval"
+else
+ with_readdisplay=yes
+fi
+
+
+
+ case "$with_readdisplay" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XReadDisplay headers" >&5
+$as_echo_n "checking for XReadDisplay headers... " >&6; }
+ d=$with_readdisplay/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XReadDisplay libs" >&5
+$as_echo_n "checking for XReadDisplay libs... " >&6; }
+ d=$with_readdisplay/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ with_readdisplay_req="yes"
+ with_readdisplay=$with_readdisplay_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-readdisplay must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+
+if test "$with_readdisplay" = yes; then
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ ac_fn_c_check_header_compile "$LINENO" "X11/extensions/readdisplay.h" "ac_cv_header_X11_extensions_readdisplay_h" "#include <X11/Xlib.h>
+"
+if test "x$ac_cv_header_X11_extensions_readdisplay_h" = xyes; then :
+ $as_echo "#define HAVE_READ_DISPLAY_EXTENSION 1" >>confdefs.h
+
+fi
+
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+elif test "$with_readdisplay" != no; then
+ echo "error: must be yes or no: --with-readdisplay=$with_readdisplay"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for a directory full of images to use as the default value
+# of the "imageDirectory" preference.
+#
+###############################################################################
+
+have_imagedir=no
+with_imagedir_req=unspecified
+
+
+# Check whether --with-image-directory was given.
+if test "${with_image_directory+set}" = set; then :
+ withval=$with_image_directory; with_imagedir="$withval"; with_imagedir_req="$withval"
+else
+ with_imagedir=yes
+fi
+
+# no HANDLE_X_PATH_ARG for this one
+
+case "$with_imagedir" in
+ /*)
+ # absolute path
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for image directory $with_imagedir" >&5
+$as_echo_n "checking for image directory $with_imagedir... " >&6; }
+ if test -d "$with_imagedir" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ with_imagedir=""
+ fi
+ ;;
+ yes)
+ with_imagedir=""
+
+ #### Could use some more defaults here...
+ for dd in \
+ "/usr/share/backgrounds/images/" \
+ "/usr/share/wallpapers/" \
+ "/Library/Desktop Pictures/" \
+ ; do
+ if test -z "$with_imagedir"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for image directory $dd" >&5
+$as_echo_n "checking for image directory $dd... " >&6; }
+ if test -d "$dd" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ with_imagedir="$dd"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+ fi
+ done
+
+ ;;
+ no)
+ with_imagedir=""
+ ;;
+
+ *)
+ echo "error: must be an absolute path: --with-image-directory=$with_imagedir_req"
+ exit 1
+ ;;
+esac
+ac_cv_imagedir="$with_imagedir"
+
+DEFAULT_IMAGES_P='True'
+DEFAULT_IMAGE_DIRECTORY="$ac_cv_imagedir"
+
+if test -z "$DEFAULT_IMAGE_DIRECTORY" ; then
+ DEFAULT_IMAGES_P='False'
+fi
+
+
+###############################################################################
+#
+# Pick a text file to use as the default of the "textFile" preference.
+# Any old file will do, but preferably one that will make interesting
+# shapes when displayed by "starwars" and "fontglide".
+#
+###############################################################################
+
+have_textfile=no
+with_textfile_req=unspecified
+
+
+# Check whether --with-text-file was given.
+if test "${with_text_file+set}" = set; then :
+ withval=$with_text_file; with_textfile="$withval"; with_textfile_req="$withval"
+else
+ with_textfile=yes
+fi
+
+# no HANDLE_X_PATH_ARG for this one
+
+case "$with_textfile" in
+ /*)
+ # absolute path
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for text file $with_textfile" >&5
+$as_echo_n "checking for text file $with_textfile... " >&6; }
+ if test -f "$with_textfile" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ with_textfile=""
+ fi
+ ;;
+ yes)
+ with_textfile=""
+
+ #### Could use some more defaults here...
+ for f in \
+ "/usr/X11R6/lib/X11/doc/README" \
+ "/usr/share/doc/xserver-common/copyright" \
+ "/usr/share/doc/xserver-xorg-core/copyright" \
+ "/usr/X11R6/README" \
+ "/usr/share/doc/libX11*/COPYING" \
+ "/usr/X11/share/X11/doc/README*" \
+ "/usr/share/doc/debian/debian-manifesto" \
+ ; do
+ if test -z "$with_textfile"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for text file $f" >&5
+$as_echo_n "checking for text file $f... " >&6; }
+ f=`/bin/ls $f 2>&- | head -1`
+ if test -f "$f" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ with_textfile="$f"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+ fi
+ done
+
+ ;;
+ no)
+ with_textfile=""
+ ;;
+
+ *)
+ echo "error: must be an absolute path: --with-text-file=$with_textfile_req"
+ exit 1
+ ;;
+esac
+ac_cv_textfile="$with_textfile"
+
+DEFAULT_TEXT_FILE="$ac_cv_textfile"
+
+
+###############################################################################
+#
+# Check the browser to see help URL
+#
+###############################################################################
+
+have_browser=no
+with_browser_req=unspecified
+
+
+# Check whether --with-browser was given.
+if test "${with_browser+set}" = set; then :
+ withval=$with_browser; with_browser="$withval"; with_browser_req="$withval"
+else
+ with_browser=no
+fi
+
+# no HANDLE_X_PATH_ARG for this one
+
+case "$with_browser" in
+ no )
+ ;;
+ * )
+ WITH_BROWSER=$with_browser
+ gnome_open_program=$with_browser
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for browser $with_browser" >&5
+$as_echo_n "checking for browser $with_browser... " >&6; }
+ with_browser_fullpath=`which $with_browser 2>/dev/null`
+ case $with_browser_fullpath in
+ /* )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ have_browser=yes
+ ;;
+ * )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+# Only warning: we don't want to install all packages for the
+# dependency of the browser in building stage...
+ echo "WARNING: browser not found: --with-browser=$with_browser"
+ ;;
+ esac
+ ;;
+esac
+ac_cv_browser="$with_browser"
+
+###############################################################################
+#
+# Check whether it's ok to install some hacks as setuid (e.g., "sonar")
+# This should be safe, but let's give people the option.
+#
+###############################################################################
+
+setuid_hacks_default=no
+setuid_hacks="$setuid_hacks_default"
+
+# Check whether --with-setuid-hacks was given.
+if test "${with_setuid_hacks+set}" = set; then :
+ withval=$with_setuid_hacks; setuid_hacks="$withval"
+else
+ setuid_hacks="$setuid_hacks_default"
+fi
+
+
+
+ case "$setuid_hacks" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setuid hacks headers" >&5
+$as_echo_n "checking for setuid hacks headers... " >&6; }
+ d=$setuid_hacks/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setuid hacks libs" >&5
+$as_echo_n "checking for setuid hacks libs... " >&6; }
+ d=$setuid_hacks/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ setuid_hacks_req="yes"
+ setuid_hacks=$setuid_hacks_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-setuid-hacks must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+
+if test "$setuid_hacks" = yes; then
+ true
+elif test "$setuid_hacks" != no; then
+ echo "error: must be yes or no: --with-setuid-hacks=$setuid_hacks"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for --with-record-animation
+#
+###############################################################################
+
+record_anim_default=no
+record_anim="$record_anim_default"
+
+# Check whether --with-record-animation was given.
+if test "${with_record_animation+set}" = set; then :
+ withval=$with_record_animation; record_anim="$withval"
+else
+ record_anim="$record_anim_default"
+fi
+
+
+
+ case "$record_anim" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for record animation headers" >&5
+$as_echo_n "checking for record animation headers... " >&6; }
+ d=$record_anim/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for record animation libs" >&5
+$as_echo_n "checking for record animation libs... " >&6; }
+ d=$record_anim/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5
+$as_echo "$d" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5
+$as_echo "not found ($d: no such directory)" >&6; }
+ fi
+
+ # replace the directory string with "yes".
+ record_anim_req="yes"
+ record_anim=$record_anim_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to --with-record-animation must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+
+
+if test "$record_anim" = yes; then
+ true
+elif test "$record_anim" != no; then
+ echo "error: must be yes or no: --with-record-animation=$record_anim"
+ exit 1
+fi
+
+if test "$record_anim" = yes; then
+ if test "$have_gdk_pixbuf" != yes; then
+ as_fn_error $? "--with-record-animation requires GDK-Pixbuf" "$LINENO" 5
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabling --with-record-animation" >&5
+$as_echo "enabling --with-record-animation" >&6; }
+ $as_echo "#define HAVE_RECORD_ANIM 1" >>confdefs.h
+
+ ANIM_OBJS='$(ANIM_OBJS)'
+ ANIM_LIBS='$(ANIM_LIBS)'
+ fi
+fi
+
+###############################################################################
+#
+# Done testing. Now, set up the various -I and -L variables,
+# and decide which GUI program to build by default.
+#
+###############################################################################
+
+DEPEND=makedepend
+DEPEND_FLAGS=
+DEPEND_DEFINES=
+
+
+if test \! -z "$includedir" ; then
+ INCLUDES="$INCLUDES -I$includedir"
+fi
+
+if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+fi
+
+
+PREFERRED_DEMO_PROGRAM=''
+ALL_DEMO_PROGRAMS=
+if test "$have_motif" = yes; then
+ PREFERRED_DEMO_PROGRAM=xscreensaver-demo-Xm
+ ALL_DEMO_PROGRAMS="$PREFERRED_DEMO_PROGRAM $ALL_DEMO_PROGRAMS"
+fi
+if test "$have_gtk" = yes; then
+ PREFERRED_DEMO_PROGRAM=xscreensaver-demo-Gtk
+ ALL_DEMO_PROGRAMS="$PREFERRED_DEMO_PROGRAM $ALL_DEMO_PROGRAMS"
+fi
+
+
+if test "$have_kerberos" = yes; then
+ PASSWD_SRCS="$PASSWD_SRCS \$(KERBEROS_SRCS)"
+ PASSWD_OBJS="$PASSWD_OBJS \$(KERBEROS_OBJS)"
+fi
+if test "$have_pam" = yes; then
+ PASSWD_SRCS="$PASSWD_SRCS \$(PAM_SRCS)"
+ PASSWD_OBJS="$PASSWD_OBJS \$(PAM_OBJS)"
+ INSTALL_PAM="install-pam"
+fi
+if test "$enable_pam_check_account_type" = yes; then
+ COMMENT_PAM_CHECK_ACCOUNT=""
+else
+ COMMENT_PAM_CHECK_ACCOUNT="#"
+fi
+if test "$have_passwd_helper" = yes; then
+ PASSWD_SRCS="$PASSWD_SRCS \$(PWHELPER_SRCS)"
+ PASSWD_OBJS="$PASSWD_OBJS \$(PWHELPER_OBJS)"
+fi
+ PASSWD_SRCS="$PASSWD_SRCS \$(PWENT_SRCS)"
+ PASSWD_OBJS="$PASSWD_OBJS \$(PWENT_OBJS)"
+
+
+if test "$enable_locking" = yes; then
+ LOCK_SRCS='$(LOCK_SRCS_1) $(PASSWD_SRCS)'
+ LOCK_OBJS='$(LOCK_OBJS_1) $(PASSWD_OBJS)'
+else
+ LOCK_SRCS='$(NOLOCK_SRCS_1)'
+ LOCK_OBJS='$(NOLOCK_OBJS_1)'
+fi
+
+if test "$ac_macosx" = yes; then
+ EXES_OSX='$(EXES_OSX)'
+ SCRIPTS_OSX='$(SCRIPTS_OSX)'
+ MEN_OSX='$(MEN_OSX)'
+else
+ EXES_OSX=
+ SCRIPTS_OSX=
+ MEN_OSX=
+fi
+
+
+INSTALL_SETUID='$(INSTALL_PROGRAM) $(SUID_FLAGS)'
+
+if test "$need_setuid" = yes; then
+ NEED_SETUID=yes
+else
+ NEED_SETUID=no
+fi
+
+if test "$setuid_hacks" = yes; then
+ SETUID_HACKS=yes
+else
+ SETUID_HACKS=no
+fi
+
+tab=' '
+if test "$have_gl" = yes; then
+ GL_EXES='$(GL_EXES)'
+ SUID_EXES='$(SUID_EXES)'
+ RETIRED_GL_EXES='$(RETIRED_GL_EXES)'
+ GL_UTIL_EXES='$(GL_UTIL_EXES)'
+ GL_MEN='$(GL_MEN)'
+ GL_KLUDGE=" "
+else
+ GL_KLUDGE="-"
+fi
+
+if test "$have_gle" = yes; then
+ GLE_EXES='$(GLE_EXES)'
+ GLE_KLUDGE=" "
+else
+ GLE_KLUDGE="-"
+fi
+
+if test "$have_jpeg" = yes -a "$have_gdk_pixbuf" = yes; then
+ JPEG_EXES='$(JPEG_EXES)'
+fi
+
+
+# Another substitution in the XScreenSaver.ad.in file:
+#
+if test "$gnome_open_program" != ''; then
+ GNOME24=''
+ GNOME22='! '
+ NOGNOME='! '
+elif test "$gnome_url_show_program" != ''; then
+ GNOME24='! '
+ GNOME22=''
+ NOGNOME='! '
+else
+ GNOME24='! '
+ GNOME22='! '
+ NOGNOME=''
+fi
+
+
+# Set PO_DATADIR to something sensible.
+#
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for locale directory" >&5
+$as_echo_n "checking for locale directory... " >&6; }
+if test -n "$GTK_DATADIR" ; then
+ PO_DATADIR="$GTK_DATADIR"
+elif test "$have_gtk" = yes; then
+ PO_DATADIR=`$pkg_config --variable=prefix gtk+-2.0`
+ PO_DATADIR="$PO_DATADIR/share"
+fi
+
+if test -z "$PO_DATADIR" ; then
+ #
+ # #### Total fucking kludge --
+ # Map /build/prefix/usr/X11R6/share/ to /build/prefix/usr/share/
+ # but of course we need to expand all the nested variables to do that...
+ #
+ dd=`eval eval eval eval eval eval eval eval eval eval eval echo $datadir`
+ PO_DATADIR=`echo $dd | sed 's@/X11R6/@/@'`
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PO_DATADIR/locale" >&5
+$as_echo "$PO_DATADIR/locale" >&6; }
+
+
+# canonicalize slashes.
+HACK_CONF_DIR=`echo "${HACK_CONF_DIR}" | sed 's@/$@@;s@//*@/@g'`
+
+# gcc 3.0 likes to issue this warning for every file:
+#
+# cc1: warning: changing search order for system directory "/usr/local/include"
+# cc1: warning: as it has already been specified as a non-system directory
+#
+# Yay. We can only avoid that by deleting "-I${prefix}/include" from the list.
+# Which *should* be totally redundant, and thus an ok thing to delete?
+#
+INCLUDES=`echo "$INCLUDES" | sed 's@ -I${prefix}/include@@g;'`
+
+
+###############################################################################
+#
+# Perform substitutions and write Makefiles.
+#
+###############################################################################
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+APPDEFAULTS=$ac_x_app_defaults
+
+
+
+
+
+
+
+ac_config_files="$ac_config_files Makefile utils/Makefile jwxyz/Makefile hacks/Makefile hacks/images/Makefile hacks/glx/Makefile po/Makefile.in driver/Makefile driver/xscreensaver.pam driver/xscreensaver-demo.glade2 driver/XScreenSaver.ad"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+ ac_config_commands="$ac_config_commands po/stamp-it"
+
+
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to the package provider."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ $as_echo "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ $as_echo "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+ --help | --hel | -h )
+ $as_echo "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+ "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "utils/Makefile") CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;;
+ "jwxyz/Makefile") CONFIG_FILES="$CONFIG_FILES jwxyz/Makefile" ;;
+ "hacks/Makefile") CONFIG_FILES="$CONFIG_FILES hacks/Makefile" ;;
+ "hacks/images/Makefile") CONFIG_FILES="$CONFIG_FILES hacks/images/Makefile" ;;
+ "hacks/glx/Makefile") CONFIG_FILES="$CONFIG_FILES hacks/glx/Makefile" ;;
+ "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
+ "driver/Makefile") CONFIG_FILES="$CONFIG_FILES driver/Makefile" ;;
+ "driver/xscreensaver.pam") CONFIG_FILES="$CONFIG_FILES driver/xscreensaver.pam" ;;
+ "driver/xscreensaver-demo.glade2") CONFIG_FILES="$CONFIG_FILES driver/xscreensaver-demo.glade2" ;;
+ "driver/XScreenSaver.ad") CONFIG_FILES="$CONFIG_FILES driver/XScreenSaver.ad" ;;
+ "po/stamp-it") CONFIG_COMMANDS="$CONFIG_COMMANDS po/stamp-it" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_tt"; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any. Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[ ]*#[ ]*define[ ][ ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ for (key in D) D_is_set[key] = 1
+ FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+ line = \$ 0
+ split(line, arg, " ")
+ if (arg[1] == "#") {
+ defundef = arg[2]
+ mac1 = arg[3]
+ } else {
+ defundef = substr(arg[1], 2)
+ mac1 = arg[2]
+ }
+ split(mac1, mac2, "(") #)
+ macro = mac2[1]
+ prefix = substr(line, 1, index(line, defundef) - 1)
+ if (D_is_set[macro]) {
+ # Preserve the white space surrounding the "#".
+ print prefix "define", macro P[macro] D[macro]
+ next
+ } else {
+ # Replace #undef with comments. This is necessary, for example,
+ # in the case of _POSIX_SOURCE, which is predefined and required
+ # on some systems where configure will not decide to define it.
+ if (defundef == "undef") {
+ print "/*", prefix defundef, macro, "*/"
+ next
+ }
+ }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`$as_echo "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+ if test x"$ac_file" != x-; then
+ {
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f "$ac_file"
+ mv "$ac_tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ || as_fn_error $? "could not create -" "$LINENO" 5
+ fi
+ ;;
+
+ :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+ esac
+
+
+ case $ac_file$ac_mode in
+ "default-1":C) case "$CONFIG_FILES" in *po/Makefile.in*)
+ sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
+ esac ;;
+ "po/stamp-it":C)
+ if ! grep "^# INTLTOOL_MAKEFILE$" "po/Makefile.in" > /dev/null ; then
+ as_fn_error $? "po/Makefile.in.in was not created by intltoolize." "$LINENO" 5
+ fi
+ rm -f "po/stamp-it" "po/stamp-it.tmp" "po/POTFILES" "po/Makefile.tmp"
+ >"po/stamp-it.tmp"
+ sed '/^#/d
+ s/^[[].*] *//
+ /^[ ]*$/d
+ '"s|^| $ac_top_srcdir/|" \
+ "$srcdir/po/POTFILES.in" | sed '$!s/$/ \\/' >"po/POTFILES"
+
+ sed '/^POTFILES =/,/[^\\]$/ {
+ /^POTFILES =/!d
+ r po/POTFILES
+ }
+ ' "po/Makefile.in" >"po/Makefile"
+ rm -f "po/Makefile.tmp"
+ mv "po/stamp-it.tmp" "po/stamp-it"
+ ;;
+
+ esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+
+###############################################################################
+#
+# Print some warnings at the end.
+#
+###############################################################################
+
+warn_prefix_1=" Warning:"
+warn_prefix_2=" Note:"
+warn_prefix="$warn_prefix_1"
+
+warning=no
+warnsep=' #################################################################'
+
+warnpre() {
+ if test "$warning" = no ; then
+ echo '' ; echo "$warnsep" ; echo ''
+ warning=yes
+ fi
+}
+
+warn() {
+ warnpre
+ if test "$warning" = long ; then echo '' ; fi
+ warning=yes
+ rest="$@"
+ echo "$warn_prefix $rest"
+}
+
+warnL() {
+ was=$warning
+ warnpre
+ warning=yes
+ if test "$was" != no ; then echo '' ; fi
+ rest="$@"
+ echo "$warn_prefix $rest"
+}
+
+warn2() {
+ rest="$@"
+ echo " $rest"
+ warning=long
+}
+
+note() {
+ warn_prefix="$warn_prefix_2"
+ warn $@
+ warn_prefix="$warn_prefix_1"
+}
+
+noteL() {
+ warn_prefix="$warn_prefix_2"
+ warnL $@
+ warn_prefix="$warn_prefix_1"
+}
+
+
+# ac_prog_cc_no_pthread normally only happens on AIX, because according
+# to AX_PTHREAD, AIX needs CC=xlc_r or CC=cc_r to do threads.
+# If CC is specified, it takes precedence over --with-pthread.
+if test "$ac_prog_cc_no_pthread" ; then
+ warnL "You requested $ac_original_cc for the C compiler, but it doesn't"
+ warn2 "support POSIX threads."
+ echo ""
+ warn2 "If you have multiple CPU cores, try CC=$PTHREAD_CC."
+elif test "$with_pthread_req" = yes -a "$have_pthread" = no ; then
+ warn 'POSIX threads were requested, but were not found.'
+fi
+
+if test "$with_sgi_req" = yes -a "$have_sgi" = no ; then
+ warn 'The SGI saver extension was requested, but was not found.'
+fi
+
+if test "$with_xidle_req" = yes -a "$have_xidle" = no ; then
+ warn 'The XIdle extension was requested, but was not found.'
+fi
+
+if test "$with_xshm_req" = yes -a "$have_xshm" = no ; then
+ warn 'The XSHM extension was requested, but was not found.'
+fi
+
+if test "$with_xdbe_req" = yes -a "$have_xdbe" = no ; then
+ warn 'The DOUBLE-BUFFER extension was requested, but was not found.'
+fi
+
+if test "$with_sgivc_req" = yes -a "$have_sgivc" = no ; then
+ warn 'The SGI-VIDEO-CONTROL extension was requested, but was not found.'
+fi
+
+if test "$with_dpms_req" = yes -a "$have_dpms" = no ; then
+ warn 'The DPMS extension was requested, but was not found.'
+fi
+
+if test "$with_xinerama_req" = yes -a "$have_xinerama" = no ; then
+ warn 'The Xinerama extension was requested, but was not found.'
+fi
+
+if test "$with_xf86vmode_req" = yes -a "$have_xf86vmode" = no ; then
+ warn 'The XF86VMODE extension was requested, but was not found.'
+fi
+
+if test "$with_randr_req" = yes -a "$have_randr" = no ; then
+ warn 'The RANDR extension was requested, but was not found.'
+fi
+
+if test "$with_proc_interrupts_req" = yes -a "$have_proc_interrupts" = no; then
+ warn "Checking of /proc/interrupts was requested, but it's bogus."
+fi
+
+if test "$pkg_config" = false ; then
+ warnL 'The "pkg-config" program was not found. Without that,'
+ warn2 "detection of the various GTK libraries won't work."
+else
+ pkgerr=`$pkg_config --list-all 2>&1 >/dev/null`
+ if test "x$pkgerr" != "x" ; then
+ warnL 'The "pkg-config" program produces errors. This often causes'
+ warn2 "detection of the various GTK libraries to malfunction."
+ warn2 "The errors are:"
+ echo ''
+ echo "$pkgerr" | sed 's/^/ > /g'
+ fi
+fi
+
+if test "$gtk_halfassed" != no ; then
+ warnL "GTK version $gtk_halfassed was found, but at least one supporting"
+ warn2 "library ($gtk_halfassed_lib) was not, so GTK can't be used."
+ warn2 "Perhaps some of the development packages are not installed?"
+ if test "$have_gtk" = yes ; then
+ v="$ac_gtk_version_string"
+ warn2 "GTK $v is also installed, so it will be used instead."
+ warn2 "Please read the above output and the \`config.log' file"
+ warn2 "for more details."
+ fi
+fi
+
+motif_warn2() {
+ warn2 'Though the Motif front-end to xscreensaver is still'
+ warn2 'maintained, it is no longer being updated with new'
+ warn2 'features: all new development on the xscreensaver-demo'
+ warn2 'program is happening in the GTK version, and not in the'
+ warn2 'Motif version. It is recommended that you build against'
+ warn2 'GTK instead of Motif. See <http://www.gtk.org/>.'
+}
+
+if test "$have_motif" = no -a "$have_gtk" = no; then
+
+ if test "$with_motif" = yes; then
+ warnL "Neither the GTK nor Motif libraries were found; the"
+ warn2 "\`xscreensaver-demo' program requires one of these."
+ echo ''
+ motif_warn2
+ else
+ warnL "The GTK libraries do not seem to be available; the"
+ warn2 "\`xscreensaver-demo' program requires them."
+# echo ''
+# warn2 'You can use Motif or Lesstif instead of GTK (use the'
+# warn2 "\`--with-motif' option) but that is NOT recommended."
+# motif_warn2
+ fi
+
+elif test "$with_motif_req" = yes -a "$have_motif" = no ; then
+ warnL "Use of Motif was requested, but it wasn't found;"
+ warn2 "Gtk will be used instead."
+
+elif test "$jurassic_gtk" = yes ; then
+
+ pref_gtk=2.0
+
+ v="$ac_gtk_version_string"
+ if test "$with_gtk_req" = yes -a "$ac_gtk_version" = "unknown" ; then
+ warnL "Use of Gtk was requested, but its version number is unknown;"
+ elif test "$with_gtk_req" = yes ; then
+ warnL "Use of Gtk was requested, but it is version $v;"
+ else
+ warnL "Gtk was found on this system, but it is version $v;"
+ fi
+
+ warn2 "Gtk $pref_gtk or newer is required."
+
+elif test "$with_gtk_req" = yes -a "$have_gtk" = no ; then
+ warnL "Use of Gtk was requested, but it wasn't found."
+fi
+
+
+if test "$have_gtk" = yes -a "$have_gdk_pixbuf" = no ; then
+ warn "GTK is being used, but the GDK-Pixbuf library and/or"
+ warn2 "headers were not found. That can't be good. Please"
+ warn2 "install the GDK-Pixbuf development kit and re-configure."
+fi
+
+if test "$have_motif" = yes -a "$have_lesstif" = yes ; then
+
+ preferred_lesstif=0.92
+
+ if test "$lesstif_version" = unknown; then
+ warnL "Unable to determine the LessTif version number!"
+ warn2 "Make sure you are using version $preferred_lesstif or newer."
+ warn2 "See <http://www.lesstif.org/>."
+
+ elif test \! $lesstif_version -gt 82; then
+ warnL "LessTif version $lesstif_version_string is being used."
+ warn2 "LessTif versions 0.82 and earlier are too buggy to"
+ warn2 "use with XScreenSaver; it is strongly recommended"
+ warn2 "that you upgrade to at least version $preferred_lesstif!"
+ warn2 "See <http://www.lesstif.org/>."
+ fi
+fi
+
+
+if test "$have_motif" = yes -a "$have_gtk" = no ; then
+ warn 'Motif is being used, and GTK is not.'
+ echo ''
+ motif_warn2
+fi
+
+
+if test "$with_gdk_pixbuf_req" = yes -a "$have_gdk_pixbuf" = no; then
+ warnL 'Use of GDK-Pixbuf was requested, but it was not found.'
+fi
+
+if test "$have_gdk_pixbuf" = no -o "$gdk_pixbuf_halfassed" = yes || \
+ test "$have_gdk_pixbuf" = no ; then
+
+ if test "$with_gdk_pixbuf_req" = yes ; then
+ true
+ elif test "$with_gdk_pixbuf_req" = no ; then
+ warnL 'The GDK-Pixbuf library is not being used.'
+ else
+ warnL 'The GDK-Pixbuf library was not found.'
+ fi
+
+ if test "$gdk_pixbuf_halfassed" = yes ; then
+ echo ''
+ warn2 'More specifically, we found the headers, but not the'
+ warn2 'libraries; so either GDK-Pixbuf is half-installed on this'
+ warn2 "system, or something else went wrong. The \`config.log'"
+ warn2 'file might contain some clues.'
+ fi
+
+ if test "$have_png" = yes ; then
+ echo ''
+ warn2 'The PNG library is being used instead.'
+ fi
+
+ echo ''
+ warn2 'Some of the demos will not use images as much as they could.'
+ warn2 'You should consider installing GDK-Pixbuf and re-running'
+ warn2 'configure.'
+fi
+
+
+if test "$have_jpeg" = no ; then
+ if test "$with_jpeg_req" = yes ; then
+ warnL 'Use of libjpeg was requested, but it was not found.'
+ elif test "$with_jpeg_req" = no ; then
+ noteL 'The JPEG library is not being used.'
+ else
+ noteL 'The JPEG library was not found.'
+ fi
+
+ if test "$jpeg_halfassed" = yes ; then
+ echo ''
+ warn2 'More specifically, we found the headers, but not the'
+ warn2 'library; so either JPEG is half-installed on this'
+ warn2 "system, or something else went wrong. The \`config.log'"
+ warn2 'file might contain some clues.'
+ echo ''
+ fi
+
+ if test "$have_gdk_pixbuf" = no ; then
+ warn2 "This means that it won't be possible for the image-manipulating"
+ warn2 "display modes to load files from disk; and it also means that"
+ warn2 "the \`webcollage' program will be much slower."
+ else
+ warn2 "This means the \`webcollage' program will be much slower."
+ fi
+fi
+
+
+if test "$have_png" = no ; then
+ if test "$with_png_req" = yes ; then
+ warnL 'Use of libpng was requested, but it was not found.'
+ elif test "$with_png_req" = no ; then
+ noteL 'The PNG library is not being used.'
+ else
+ noteL 'The PNG library was not found.'
+ fi
+
+ if test "$png_halfassed" = yes ; then
+ echo ''
+ warn2 'More specifically, we found the headers, but not the'
+ warn2 'library; so either PNG is half-installed on this'
+ warn2 "system, or something else went wrong. The \`config.log'"
+ warn2 'file might contain some clues.'
+ echo ''
+ fi
+
+ warn2 "Many things aren't going to work right."
+fi
+
+
+if test "$have_xft" = no ; then
+ if test "$with_xft_req" = yes ; then
+ warnL "Use of libXft was requested, but it was not found."
+ elif test "$with_xft_req" = no ; then
+ noteL 'The Xft library is not being used.'
+ else
+ noteL "The Xft library was not found."
+ fi
+
+ if test "$xft_halfassed" = yes ; then
+ echo ''
+ warn2 'More specifically, we found the headers, but not the'
+ warn2 'libraries; so either Xft is half-installed on this'
+ warn2 "system, or something else went wrong. The \`config.log'"
+ warn2 'file might contain some clues.'
+ echo ''
+ fi
+
+ warn2 "This means that fonts won't be anti-aliased."
+fi
+
+
+if test "$have_gl" = yes -a "$ac_have_mesa_gl" = yes ; then
+ preferred_mesagl=3.4
+ mgv="$ac_mesagl_version_string"
+ pgl="$preferred_mesagl"
+
+ if test "$ac_mesagl_version" = unknown; then
+ true
+ # warnL "Unable to determine the MesaGL version number!"
+ # warn2 "Make sure you are using version $preferred_mesagl or newer."
+
+ elif test \! "$ac_mesagl_version" -gt 2006; then
+ warnL "MesaGL version number is $mgv --"
+ warn2 "MesaGL 2.6 and earlier have a security bug. It is strongly"
+ warn2 "recommended that you upgrade to at least version $preferred_mesagl."
+
+ elif test \! "$ac_mesagl_version" -gt 3003; then
+ warnL "MesaGL version number is $mgv --"
+ warn2 "MesaGL 3.3 and earlier have some bugs; it is recommended"
+ warn2 "that you upgrade to $pgl or newer."
+ fi
+fi
+
+if test "$have_gl" = no ; then
+ if test "$with_gl_req" = yes ; then
+ warnL 'Use of GL was requested, but it was not found.'
+ elif test "$with_gl_req" = no ; then
+ noteL 'The OpenGL 3D library is not being used.'
+ else
+ noteL 'The OpenGL 3D library was not found.'
+ fi
+
+ if test "$gl_halfassed" = yes ; then
+ echo ''
+ warn2 'More specifically, we found the headers, but not the'
+ warn2 'libraries; so either GL is half-installed on this'
+ warn2 "system, or something else went wrong. The \`config.log'"
+ warn2 'file might contain some clues.'
+ fi
+
+ echo ''
+ warn2 'Those demos which use 3D will not be built or installed.'
+ warn2 'You might want to consider installing OpenGL and'
+ warn2 're-running configure.'
+
+fi
+
+
+if test "$have_gl" = yes -a "$have_gle" = no ; then
+
+ # nobody cares about this; don't print the warning unless it was
+ # requested and not found, or halfway-found.
+ if test "$with_gle_req" = yes -o "$gle_halfassed" = yes ; then
+
+ if test "$with_gle_req" = yes ; then
+ noteL 'Use of the GLE (GL Extrusion) library was requested, but'
+ warn2 'it was not found (though the OpenGL library was found, and'
+ warn2 'is being used.)'
+ elif test "$with_gle_req" = no ; then
+ noteL 'The OpenGL Library is being used, but the GLE (GL Extrusion)'
+ warn2 'library is not.'
+ else
+ noteL 'The OpenGL Library was found, but the GLE (GL Extrusion)'
+ warn2 'library was not.'
+ fi
+
+ if test "$gle_halfassed" = yes ; then
+ echo ''
+ warn2 'More specifically, we found the headers, but not the'
+ warn2 'libraries; so either GLE is half-installed on this'
+ warn2 "system, or something else went wrong. The \`config.log'"
+ warn2 'file might contain some clues.'
+ fi
+
+ echo ''
+ warn2 'Some of the OpenGL (3D) demos (those that depend on GLE)'
+ warn2 'will not be built or installed. You might want to consider'
+ warn2 'installing GLE and re-running configure. You can find the'
+ warn2 'GLE library at <http://www.linas.org/gle/>'
+
+ fi
+fi
+
+
+if test "$with_readdisplay_req" = yes -a "$have_readdisplay" = no ; then
+ warn 'Use of XReadDisplay was requested, but it was not found.'
+fi
+
+if test "$with_kerberos_req" = yes -a "$have_kerberos" = no ; then
+ warn 'Use of Kerberos was requested, but it was not found.'
+fi
+
+if test "$with_pam_req" = yes -a "$have_pam" = no ; then
+ warn 'Use of PAM was requested, but it was not found.'
+fi
+
+if test "$with_shadow_req" = yes -a "$have_shadow" = no ; then
+ warn 'Use of shadow passwords was requested, but they were not found.'
+fi
+
+if test "$ac_macosx" = yes ; then
+ if test "$enable_locking" = yes ; then
+ warn "You have specified --enable-locking on MacOS X."
+ warn2 "THIS DOES NOT WORK! Don't do this!"
+ fi
+fi
+
+
+# You are in a twisty maze of namespaces and syntaxes, all alike.
+# Fuck the skull of Unix.
+#
+bindir=`eval eval eval eval eval eval eval echo $bindir`
+HACKDIR=`eval eval eval eval eval eval eval echo $HACKDIR`
+HACK_CONF_DIR=`eval eval eval eval eval eval eval echo $HACK_CONF_DIR`
+
+# canonicalize slashes.
+bindir=`echo "${bindir}" | sed 's@/$@@;s@//*@/@g'`
+HACKDIR=`echo "${HACKDIR}" | sed 's@/$@@;s@//*@/@g'`
+HACK_CONF_DIR=`echo "${HACK_CONF_DIR}" | sed 's@/$@@;s@//*@/@g'`
+
+
+# Sanity check the hackdir
+for bad_choice in xscreensaver xscreensaver-demo xscreensaver-command ; do
+ if test "${HACKDIR}" = "${bindir}/${bad_choice}" ; then
+ echo ""
+ as_fn_error $? "\"--with-hackdir=${bindir}/${bad_choice}\" won't work.
+ There will be an executable installed with that name, so
+ that can't be the name of a directory as well. Please
+ re-configure with a different directory name." "$LINENO" 5
+ fi
+done
+
+
+do_dir_warning=no
+
+# Now let's warn if there's a previous RPM version already installed.
+# But don't bother with this test if we are currently *building* an RPM.
+
+if test -z "$RPM_PACKAGE_VERSION" ; then
+
+ rpmnames="xscreensaver xscreensaver-base xscreensaver-extras"
+
+ # M4 sucks!!
+
+ rpmv=`(rpm -qv $rpmnames) 2>/dev/null | \
+ sed -n 's/^[-a-z]*-\([0-9][0-9]*[.][0-9][0-9a-z]*\)-.*$/\1/p' | \
+ head -1`
+
+
+ if test \! -z "$rpmv" ; then
+ rpmbdir=`rpm -ql $rpmnames | sed -n 's@^\(.*\)/xscreensaver-demo$@\1@p'`
+ rpmhdir=`rpm -ql $rpmnames | sed -n 's@^\(.*\)/popsquares$@\1@p'`
+
+ warning=no
+ warnL "There is already an installed RPM of xscreensaver $rpmv"
+ warn2 'on this system. You might want to remove it ("rpm -ve")'
+ warn2 'before running "make install" in this directory.'
+ echo ""
+ warn2 "Alternately, you could build this version of xscreensaver"
+ warn2 'as an RPM, and then install that. An "xscreensaver.spec"'
+ warn2 'file is included. Try "rpmbuild -v -ba xscreensaver.spec".'
+ warn2 "See the RPM documentation for more info."
+ echo ""
+
+ if test "$rpmbdir" = "$rpmhdir" ; then
+ warn2 "The RPM version was installed in $rpmbdir/."
+ do_dir_warning=yes
+ else
+ warn2 "The RPM version was installed in $rpmbdir/,"
+ warn2 "with demos in $rpmhdir/."
+ fi
+ fi
+fi
+
+# Also warn if there's a Debian package installed.
+#
+debnames="xscreensaver xscreensaver-data xscreensaver-data-extra"
+debv=''
+for dpkg in $debnames ; do
+ if test -z "$debv"; then
+ debv=`dpkg -s $dpkg 2>/dev/null | sed -n 's/^Version: \(.*\)$/\1/p'`
+ fi
+done
+
+if test \! -z "$debv" ; then
+ debbdir=`dpkg -L $debnames 2>/dev/null | \
+ sed -n 's@^\(.*/bin/\)xscreensaver$@\1@p'`
+ debhdir=`dpkg -L $debnames 2>/dev/null | \
+ sed -n 's@^\(.*/\)popsquares$@\1@p'`
+ if test -z "$debbdir" ; then debbdir='???'; fi
+ if test -z "$debhdir" ; then debhdir='???'; fi
+
+ warning=no
+ warnL "There is already an installed dpkg of xscreensaver"
+ warn2 "version \"$debv\" on this system."
+ echo ""
+ warn2 "The dpkg was installed in $debbdir,"
+ warn2 "with demos in $debhdir."
+fi
+
+
+if test "${bindir}" = "${HACKDIR}" ; then
+ do_dir_warning=yes
+fi
+
+if test "$do_dir_warning" = yes; then
+ echo ""
+ echo "$warnsep"
+ echo ""
+ echo ' When you run "make install", the "xscreensaver",'
+ echo ' "xscreensaver-demo", and "xscreensaver-command" executables'
+ echo " will be installed in ${bindir}/."
+ echo ""
+ echo " The various graphics demos (200+ different executables) will"
+ echo " be installed in ${HACKDIR}/."
+ echo ""
+ echo " If you would prefer the demos to be installed elsewhere,"
+ echo " you should re-run configure with the --with-hackdir=DIR"
+ echo " option. For more information, run \`./configure --help'."
+ warning=yes
+fi
+
+if test "$warning" != no; then
+ echo '' ; echo "$warnsep" ; echo ''
+fi
+
+if test "$do_dir_warning" = no; then
+ if test "$warning" = no; then
+ echo ''
+ fi
+ echo "User programs will be installed in ${bindir}/"
+ echo "Screen savers will be installed in ${HACKDIR}/"
+ echo "Configuration dialogs will be installed in ${HACK_CONF_DIR}/"
+ echo "System-wide default settings will be installed in ${APPDEFAULTS}/"
+ echo ''
+fi
diff --git a/configure.in b/configure.in
new file mode 100644
index 0000000..d439bb5
--- /dev/null
+++ b/configure.in
@@ -0,0 +1,4709 @@
+# configure.in --- xscreensaver, Copyright (c) 1997-2014 Jamie Zawinski.
+#
+
+AC_PREREQ(2.52)
+AC_INIT(driver/subprocs.c)
+AC_CONFIG_HEADERS([config.h])
+
+echo "current directory: `pwd`"
+echo "command line was: $0 $@"
+
+###############################################################################
+#
+# Autoheader stuff
+#
+###############################################################################
+
+AH_TOP([
+/* config.h.in --- xscreensaver, Copyright (c) 1991-2014 Jamie Zawinski.
+ *
+ * The best way to set these parameters is by running the included `configure'
+ * script. That examines your system, and generates `config.h' from
+ * `config.h.in'.
+ *
+ * If something goes very wrong, you can edit `config.h' directly, but beware
+ * that your changes will be lost if you ever run `configure' again.
+ */
+])
+
+AH_TEMPLATE([HAVE_READ_DISPLAY_EXTENSION],
+ [Define this if you have the XReadDisplay extension (I think
+ this is an SGI-only thing; it's in
+ <X11/extensions/readdisplay.h>.) A few of the screenhacks will
+ take advantage of this if it's available.])
+
+AH_TEMPLATE([HAVE_XHPDISABLERESET],
+ [Define this if you have the XHPDisableReset function (an HP only
+ thing which allows the Ctrl-Sh-Reset key sequence to be
+ temporarily disabled.)])
+
+# This only ever existed in X11R4 and X11R5.
+#AH_TEMPLATE([HAVE_XIDLE_EXTENSION],
+# [Define this if you have the XIDLE extension installed. If you
+# have the XIDLE extension, this is recommended. (You have this
+# extension if the file /usr/include/X11/extensions/xidle.h
+# exists.) Turning on this flag lets XScreenSaver work better with
+# servers which support this extension; but it will still work
+# with servers which do not suport it, so it's a good idea to
+# compile in support for it if you can.])
+
+# Using this extension will crash your X server and make fading not work.
+#AH_TEMPLATE([HAVE_MIT_SAVER_EXTENSION],
+# [Define this if you have the MIT-SCREEN-SAVER extension
+# installed. See the caveats about this extension, above.
+# (It's available if /usr/include/X11/extensions/scrnsaver.h
+# exists.)])
+
+# This only ever existed on SGI hardware.
+#AH_TEMPLATE([HAVE_SGI_SAVER_EXTENSION],
+# [Define this if you have the SGI SCREEN_SAVER extension. This is
+# standard on Irix systems, and not available elsewhere.])
+
+# This only ever existed on SGI hardware.
+#AH_TEMPLATE([HAVE_SGI_VC_EXTENSION],
+# [Define this if you have the SGI-VIDEO-CONTROL extension. This
+# is standard on Irix systems, and not available elsewhere.])
+
+AH_TEMPLATE([HAVE_DPMS_EXTENSION],
+ [Define this if you have the XDPMS extension. This is standard
+ on sufficiently-recent XFree86 systems, and possibly elsewhere.
+ (It's available if the file /usr/include/X11/extensions/dpms.h
+ exists.)])
+
+AH_TEMPLATE([HAVE_XF86VMODE],
+ [Define this if you have the functions XF86VidModeGetModeLine()
+ and XF86VidModeGetViewPort(), in support of virtual desktops
+ where the X server's root window is bigger than the actual
+ screen. This is an XFree86 thing, and probably doesn't exist
+ elsewhere. (It's available if the file
+ /usr/include/X11/extensions/xf86vmode.h exists.)])
+
+AH_TEMPLATE([HAVE_XF86VMODE_GAMMA],
+ [Define this if you have the functions XF86VidModeGetGamma() and
+ XF86VidModeSetGamma(), which allow clients to change the gamma
+ response of the monitor. This is an XFree86 4.0.x thing, and
+ probably doesn't exist elsewhere. (It's available if the file
+ /usr/include/X11/extensions/xf86vmode.h exists and has stuff about
+ gamma in it.)])
+
+AH_TEMPLATE([HAVE_XF86VMODE_GAMMA_RAMP],
+ [Define this if you have the functions XF86VidModeGetGammaRamp()
+ and XF86VidModeSetGammaRamp(), which provide finer-grained
+ control than XF86VidMode[GS]etGamma(). These appeared in
+ XFree86 4.1.0.])
+
+AH_TEMPLATE([HAVE_XINERAMA],
+ [Define this if you have the Xinerama extension. This is
+ standard on sufficiently-recent XFree86 systems, and possibly
+ elsewhere. (It's available if the file
+ /usr/include/X11/extensions/Xinerama.h exists.)])
+
+AH_TEMPLATE([HAVE_XINPUT],
+ [Define this if you have the Xinput extension. This is
+ standard since X11R5, and is thus almost everywhere.
+ (It's available if the file /usr/include/X11/extensions/XInput.h
+ exists.)])
+
+AH_TEMPLATE([HAVE_XF86MISCSETGRABKEYSSTATE],
+ [Define this if you have the XF86MiscSetGrabKeysState function
+ (which allows the Ctrl-Alt-KP_star and Ctrl-Alt-KP_slash key
+ sequences to be temporarily disabled. Sadly, it doesn't affect
+ Ctrl-Alt-BS or Ctrl-Alt-F1.)])
+
+AH_TEMPLATE([HAVE_RANDR],
+ [Define this if you have the Resize and Rotate extension.
+ This is standard on sufficiently-recent XFree86 systems, and
+ possibly elsewhere. (It's available if the file
+ /usr/include/X11/extensions/Xrandr.h exists.)])
+
+AH_TEMPLATE([HAVE_RANDR_12],
+ [Define this if the RANDR library is version 1.2 or newer.])
+
+AH_TEMPLATE([HAVE_PROC_INTERRUPTS],
+ [Define this if you have a Linux-like /proc/interrupts file which
+ can be examined to determine when keyboard activity has
+ occurred.])
+
+AH_TEMPLATE([HAVE_MOTIF],[Define this if you have Motif.])
+
+AH_TEMPLATE([HAVE_XMCOMBOBOX],
+ [Define this if you have the XmComboBox Motif widget (Motif 2.0.)])
+
+AH_TEMPLATE([HAVE_GTK],[Define this if you have Gtk (any version.)])
+AH_TEMPLATE([HAVE_GTK2],[Define this if you have Gtk 2.x.])
+
+AH_TEMPLATE([HAVE_CRAPPLET],
+ [Define this if you have Gnome and want to build support for the
+ xscreensaver control panel in the Gnome Control Center
+ (gnomecc). (This is needed only with Gtk 1.x.)])
+
+AH_TEMPLATE([HAVE_CRAPPLET_IMMEDIATE],
+ [Define this if HAVE_CRAPPLET is defined, and the function
+ capplet_widget_changes_are_immediate() is available.])
+
+AH_TEMPLATE([HAVE_XML],[Define this if you have the XML library.])
+
+AH_TEMPLATE([HAVE_OLD_XML_HEADERS],
+ [Define this if you have the XML library headers in their old,
+ non-namespaced location (you lack the gnome-xml/libxml symlink)])
+
+AH_TEMPLATE([HAVE_GDK_PIXBUF],
+ [Define this if you have the GDK_Pixbuf library installed. Some
+ of the demos can make use of this if it is available.])
+
+AH_TEMPLATE([HAVE_GDK_PIXBUF_APPLY_EMBEDDED_ORIENTATION],
+ [Define this if you have the gdk_pixbuf_apply_embedded_orientation
+ function (gdk-pixbuf 2.12).])
+
+AH_TEMPLATE([HAVE_JPEGLIB],
+ [Define this if you have the Independent JPEG Group's JPEG
+ library installed. Some of the demos can make use of this if it
+ is available.])
+
+AH_TEMPLATE([HAVE_LIBPNG],
+ [Define this if the Portable Network Graphics library is installed.
+ It is basically required, but many things will more-or-less limp
+ along without it.])
+
+AH_TEMPLATE([HAVE_XMU],
+ [Define this if you have the Xmu library. This is standard part
+ of X, and if your vendor doesn't ship it, you should report that
+ as a bug.])
+
+AH_TEMPLATE([HAVE_XUTF8DRAWSTRING],
+ [Define this if you have the function Xutf8DrawString().])
+
+AH_TEMPLATE([HAVE_XFT],
+ [Define this if you have libXft2.])
+
+AH_TEMPLATE([HAVE_GL],
+ [Define this if you have OpenGL. Some of the demos require it,
+ so if you don't have it, then those particular demos won't be
+ built. (This won't affect the screen saver as a whole.)])
+
+AH_TEMPLATE([HAVE_MESA_GL],
+ [Define this if you have OpenGL, but it's the MesaGL variant.
+ (The libraries have different names.) (HAVE_GL should be defined
+ too.)])
+
+AH_TEMPLATE([HAVE_GLBINDTEXTURE],
+ [Define this if your version of OpenGL has the glBindTexture()
+ routine. This is the case for OpenGL 1.1, but not for OpenGL
+ 1.0.])
+
+AH_TEMPLATE([HAVE_GLE],
+ [Define this if you have the -lgle and -lmatrix libraries (GL
+ extrusion.)])
+
+AH_TEMPLATE([HAVE_GLE3],[Define this if you have the -lgle from GLE version 3])
+
+AH_TEMPLATE([HAVE_JWZGLES],[Define this to target the OpenGL ES 1.x API
+ instead of OpenGL 1.3.])
+
+AH_TEMPLATE([HAVE_XSHM_EXTENSION],
+ [Define this if you have the X Shared Memory Extension.])
+
+AH_TEMPLATE([HAVE_DOUBLE_BUFFER_EXTENSION],
+ [Define this if you have the X Double Buffer Extension.])
+
+AH_TEMPLATE([FORTUNE_PROGRAM],
+ [Some screenhacks like to run an external program to generate
+ random pieces of text; set this to the one you like. Note that
+ this is just the default; X resources can be used to override
+ it.])
+
+AH_TEMPLATE([PASSWD_HELPER_PROGRAM],
+ [Set the name of the password helper program, if any])
+
+AH_TEMPLATE([NO_LOCKING],
+ [Define this to remove the option of locking the screen at all.])
+
+AH_TEMPLATE([ALLOW_ROOT_PASSWD],
+ [Define this to allow the root password to unlock the screen.])
+
+AH_TEMPLATE([HAVE_KERBEROS],
+ [Define this if you want to use Kerberos authentication to
+ lock/unlock the screen instead of your local password. This
+ currently uses Kerberos V4, but a V5 server with V4
+ compatibility will work. WARNING: DO NOT USE AFS string-to-key
+ passwords with this option. This option currently *only* works
+ with standard Kerberos des_string_to_key. If your password is
+ an AFS password and not a kerberos password, it will not
+ authenticate properly. See the comments in driver/kpasswd.c for
+ more information if you need it.])
+
+AH_TEMPLATE([HAVE_KERBEROS5],
+ [Define this if you have Kerberos 5, meaning we need to use the
+ Kerberos 4 compatibility layer.])
+
+AH_TEMPLATE([HAVE_PAM],
+ [Define this if you want to use PAM (Pluggable Authentication
+ Modules) to lock/unlock the screen, instead of standard
+ /etc/passwd authentication.])
+
+AH_TEMPLATE([PAM_SERVICE_NAME],
+ [If PAM is being used, this is the name of the PAM service that
+ xscreensaver will authenticate as. The default is
+ "xscreensaver", which means that the PAM library will look for
+ an "xscreensaver" line in /etc/pam.conf, or (on recent Linux
+ systems) will look for a file called /etc/pam.d/xscreensaver.
+ Some systems might already have a PAM installation that is
+ configured for xlock, so setting this to "xlock" would also work
+ in that case.])
+
+AH_TEMPLATE([HAVE_PAM_FAIL_DELAY],
+ [Define this if you have pam_fail_delay function.
+ see driver/passwd-pam.c.])
+
+AH_TEMPLATE([PAM_CHECK_ACCOUNT_TYPE],
+ [Whether PAM should check the result of account modules
+ when authenticating. Only do this if you have account
+ configured properly on your system.])
+
+AH_TEMPLATE([PAM_STRERROR_TWO_ARGS],
+ [Define if you have PAM and pam_strerror() requires two
+ arguments.])
+
+AH_TEMPLATE([HAVE_SIGTIMEDWAIT],
+ [Define to 1 if you have the `sigtimedwait' function.])
+
+AH_TEMPLATE([HAVE_SHADOW_PASSWD],
+ [Define this if your system uses 'shadow' passwords, that is, the
+ passwords live in /etc/shadow instead of /etc/passwd, and one
+ reads them with getspnam() instead of getpwnam(). (Note that
+ SCO systems do some random other thing; others might as well.
+ See the ifdefs in driver/passwd-pwent.c if you're having trouble
+ related to reading passwords.)])
+
+AH_TEMPLATE([HAVE_ENHANCED_PASSWD],
+ [Define this if your system is Digital or SCO Unix with so-called
+ ``Enhanced Security'', that is, the passwords live in
+ /tcb/files/auth/<x>/<xyz> instead of in /etc/passwd, and one
+ reads them with getprpwnam() instead of getpwnam().])
+
+AH_TEMPLATE([HAVE_ADJUNCT_PASSWD],
+ [Define this if your system is Solaris with ``adjunct'' passwords
+ (this is the version where one gets at the passwords with
+ getpwanam() instead of getpwnam().) I haven't tested this one,
+ let me know if it works.])
+
+AH_TEMPLATE([HAVE_HPUX_PASSWD],
+ [Define this if you are running HPUX with so-called ``Secure
+ Passwords'' (if you have /usr/include/hpsecurity.h, you probably
+ have this.) I haven't tested this one, let me know if it works.])
+
+AH_TEMPLATE([HAVE_SYSLOG],
+ [Define this if you the openlog(), syslog(), and closelog()
+ functions. This is used for logging failed login attempts.])
+
+AH_TEMPLATE([HAVE_ICMP],
+ [Define this if you do pings with a `struct icmp' and an
+ `icmp_id' slot.])
+
+AH_TEMPLATE([HAVE_ICMPHDR],
+ [Define this if you do pings with a `struct icmphdr' and an
+ `un.echo.id' slot.])
+
+AH_TEMPLATE([HAVE_GETIFADDRS],
+ [Define this if you have the getifaddrs() function.])
+
+AH_TEMPLATE([HAVE_FORKPTY],
+ [Define this if you have the 'forkpty' function:
+ This allows 'phosphor' and 'apple2' to run curses-based
+ programs, or be used as terminal windows.])
+
+AH_TEMPLATE([HAVE_GETTIMEOFDAY],
+ [Define this if you have the gettimeofday function.])
+
+AH_TEMPLATE([GETTIMEOFDAY_TWO_ARGS],
+ [Define this if gettimeofday() takes two arguments.])
+
+AH_TEMPLATE([XPointer],
+ [Define this to void* if you're using X11R4 or earlier.])
+
+AH_TEMPLATE([HAVE_PTHREAD],
+ [Define this if your system supports POSIX threads.])
+
+AH_TEMPLATE([HAVE_RECORD_ANIM],
+ [Define this to enable recording of videos.])
+
+# After checking to see that --srcdir is correct (which AC_INIT does)
+# check for some random other files that come later in the tar file,
+# to make sure everything is here.
+#
+for d in utils jwxyz hacks hacks/glx driver ; do
+ f=$srcdir/$d/Makefile.in
+ if test \! -r $f ; then
+ echo ""
+ echo "ERROR: The package is incomplete: $f does not exist."
+ echo " This probably means that your download was truncated."
+ echo ""
+ exit 1
+ fi
+done
+
+###############################################################################
+#
+# Query AX_PTHREAD, and figure out which compiler gets used.
+#
+###############################################################################
+
+AC_DEFUN([AC_PROG_CC_PTHREAD],
+ [have_pthread=no
+ with_pthread_req=unspecified
+
+ # AX_PTHREAD is from the GNU Autoconf Archive.
+ # https://savannah.gnu.org/projects/autoconf-archive/
+ m4_include(ax_pthread.m4)
+
+ # This affects CC, LIBS, and CFLAGS, instead of defining new variables.
+
+ AC_ARG_WITH([pthread],
+ [ --with-pthread Enables POSIX threads, for SMP support.],
+ [with_pthread="$withval"; with_pthread_req="$withval"],
+ [with_pthread=yes])
+
+ if test "$with_pthread" = yes; then
+ # AX_PTHREAD might want a different compiler.
+ AX_PTHREAD(
+ [if test "$CC" = "$PTHREAD_CC" -o -z "$ac_original_cc"; then
+ have_pthread=yes
+ else
+ ac_prog_cc_no_pthread=yes
+ fi
+ ])
+
+ if test "$have_pthread" = yes; then
+ AC_DEFINE([HAVE_PTHREAD])
+ CC=$PTHREAD_CC
+ fi
+ fi
+])
+
+
+###############################################################################
+#
+# Function to figure out how to run the compiler.
+#
+###############################################################################
+
+AC_DEFUN([AC_PROG_CC_ANSI],
+ [AC_REQUIRE([AC_PROG_CC])
+
+ if test -z "$GCC"; then
+ # not using GCC
+ AC_MSG_CHECKING(how to request ANSI compilation)
+ case "$host" in
+ *-hpux* )
+ AC_MSG_RESULT(HPUX: adding -Ae)
+ CC="$CC -Ae"
+ ;;
+ *-aix* )
+ AC_MSG_RESULT(AIX: adding -qlanglvl=ansi -qhalt=e)
+ CC="$CC -qlanglvl=ansi -qhalt=e"
+ ;;
+ *-dec-* )
+ AC_MSG_RESULT(DEC: adding -std1 -ieee)
+ CC="$CC -std1"
+ ;;
+ *)
+ AC_MSG_RESULT(no idea)
+ ;;
+ esac
+ else
+ # using GCC
+ case "$host" in
+ *-solaris*)
+ AC_MSG_RESULT(Solaris: adding -D__EXTENSIONS__)
+ CC="$CC -D__EXTENSIONS__"
+ ;;
+ esac
+ fi
+
+ OBJCC="$CC"
+
+ AC_MSG_CHECKING([whether the compiler works on ANSI C])
+ AC_TRY_RUN([ main(int ac, char **av) { return 0; } ],
+ AC_MSG_RESULT(yes),
+ AC_MSG_RESULT(no)
+ AC_MSG_ERROR(Couldn't build even a trivial ANSI C program: check CC.),
+ AC_MSG_ERROR(Couldn't build even a trivial ANSI C program: check CC.))
+
+ if test -n "$GCC"; then
+ AC_MSG_RESULT(Turning on gcc compiler warnings.)
+ CC="$CC -pedantic -Wall -Wstrict-prototypes -Wnested-externs -Wmissing-prototypes"
+ OBJCC="$OBJCC -Wall"
+ # As of gcc 3.4, we have "-Wdeclaration-after-statement"
+ # and so perhaps now we can do without -pedantic?
+ else
+ case "$host" in
+ *-irix5* |*-irix6.[0-3]* )
+ AC_MSG_RESULT(Turning on SGI compiler warnings.)
+ CC="$CC -fullwarn -use_readonly_const -rdata_shared -g3"
+ ;;
+# *-dec-osf* )
+# if test -z "$GCC"; then
+# AC_MSG_RESULT(Turning on DEC C compiler warnings.)
+# CC="$CC -migrate -w0 -verbose -warnprotos"
+# fi
+# ;;
+ esac
+ fi
+])
+
+
+###############################################################################
+#
+# Check for availability of various gcc command-line options.
+#
+###############################################################################
+
+AC_DEFUN([AC_CHECK_GCC_ARG],
+ [if test -n "$GCC"; then
+ AC_CACHE_CHECK([whether gcc accepts [$2]],
+ ac_cv_gcc_accepts_[$1],
+ [rm -rf conftest.$ac_ext
+ touch conftest.$ac_ext
+ if ( ( gcc -c [$2] conftest.$ac_ext -o/dev/null >/dev/null ) 2>&1 | \
+ grep unrecognized >/dev/null ); then
+ ac_cv_gcc_accepts_[$1]=no
+ else
+ ac_cv_gcc_accepts_[$1]=yes
+ CC="$CC [$2]"
+ fi])
+ ac_gcc_accepts_[$1]="$ac_cv_gcc_accepts_[$1]"
+ fi
+])
+
+AC_DEFUN([AC_NO_LONG_STRING_WARNINGS],
+ [AC_CHECK_GCC_ARG(no_overlength, -Wno-overlength-strings)])
+
+AC_DEFUN([AC_NO_MISPLACED_DECLARATIONS],
+ [AC_CHECK_GCC_ARG(no_decl_after, -Wdeclaration-after-statement)])
+
+# Need to disable Objective C extensions in ANSI C on MacOS X to work
+# around an Apple-specific gcc bug.
+#
+AC_DEFUN([AC_NO_OBJECTIVE_C],
+ [AC_CHECK_GCC_ARG(no_cpp_precomp, -no-cpp-precomp)])
+
+###############################################################################
+#
+# Function to figure out how to disable // comments in ANSI C code.
+#
+# (With recent gcc, this is done with "-std=c89". With older gcc, this
+# is done by passing "-lang-c89" to cpp, by passing "-Wp,-lang-c89" to
+# gcc. Old gcc doesn't support -std, and new gcc doesn't support -lang.
+# so much for compatibility!)
+#
+# UPDATE: apparently there is NO WAY to tell gcc 3.2.2 to require that
+# declarations preceed statements, without resorting to "-pedantic".
+# This means that there is no way to get gcc3 to issue warnings that
+# ensure that your code complies with the ANSI/ISO C89 standard, without
+# also drowning in totally useless warnings. Thank you master may I
+# have another.
+#
+# So, I give up, let's just use -pedantic.
+#
+###############################################################################
+
+AC_DEFUN([AC_GCC_ACCEPTS_STD], [
+ case "$host" in
+ *-darwin* )
+ # Fucking Apple let // comments sneak into OpenGL headers, so
+ # we *must* allow // comments when compiling on Mac OS 10.6! FUCK!
+ ;;
+ *)
+ AC_CHECK_GCC_ARG(std, -std=c89)
+ ;;
+ esac
+])
+
+AC_DEFUN([AC_NO_CPLUSPLUS_COMMENTS_IN_C_CODE],
+ [if test -n "$GCC"; then
+ AC_GCC_ACCEPTS_STD
+ AC_MSG_RESULT(Disabling C++ comments in ANSI C code.)
+ #
+ # The reason that // comments are banned from xscreensaver is that gcc is
+ # basically the only compiler in the world that supports them in C code.
+ # All other vendors support them only in their C++ compilers, not in their
+ # ANSI C compilers. This means that it's a portability problem: every time
+ # these comments have snuck into the xscreensaver source code, I've gotten
+ # complaints about it the next day. So we turn off support for them in gcc
+ # as well to prevent them from accidentially slipping in.
+ #
+ if test "$ac_gcc_accepts_std" = yes ; then
+ #
+ # -std=c89 defines __STRICT_ANSI__, which we don't want.
+ # (That appears to be the only additional preprocessor symbol
+ # it defines, in addition to the syntax changes it makes.)
+ #
+ # -std=gnu89 is no good, because // comments were a GNU extension
+ # before they were in the ANSI C 99 spec... (gcc 2.96 permits //
+ # with -std=gnu89 but not with -std=c89.)
+ #
+ # $CC already contains "-std=c89" via AC_GCC_ACCEPTS_STD
+ CC="$CC -U__STRICT_ANSI__"
+# else
+# # The old way:
+# CC="$CC -Wp,-lang-c89"
+ fi
+ fi
+])
+
+
+###############################################################################
+#
+# Function to figure out how to create directory trees.
+#
+###############################################################################
+
+AC_DEFUN([AC_PROG_INSTALL_DIRS],
+ [AC_CACHE_CHECK([whether "\${INSTALL} -d" creates intermediate directories],
+ ac_cv_install_d_creates_dirs,
+ [ac_cv_install_d_creates_dirs=no
+ rm -rf conftestdir
+ if mkdir conftestdir; then
+ cd conftestdir 2>/dev/null
+ ${INSTALL} -d `pwd`/dir1/dir2 >/dev/null 2>&1
+ if test -d dir1/dir2/. ; then
+ ac_cv_install_d_creates_dirs=yes
+ fi
+ cd .. 2>/dev/null
+ rm -rf conftestdir
+ fi
+ ])
+
+ if test "$ac_cv_install_d_creates_dirs" = no ; then
+ AC_CACHE_CHECK([whether "mkdir -p" creates intermediate directories],
+ ac_cv_mkdir_p_creates_dirs,
+ [ac_cv_mkdir_p_creates_dirs=no
+ rm -rf conftestdir
+ if mkdir conftestdir; then
+ cd conftestdir 2>/dev/null
+ mkdir -p dir1/dir2 >/dev/null 2>&1
+ if test -d dir1/dir2/. ; then
+ ac_cv_mkdir_p_creates_dirs=yes
+ fi
+ cd .. 2>/dev/null
+ rm -rf conftestdir
+ fi
+ ])
+ fi
+
+ if test "$ac_cv_install_d_creates_dirs" = yes ; then
+ INSTALL_DIRS='${INSTALL} -d'
+ elif test "$ac_cv_mkdir_p_creates_dirs" = yes ; then
+ INSTALL_DIRS='mkdir -p'
+ else
+ # any other ideas?
+ INSTALL_DIRS='${INSTALL} -d'
+ fi
+])
+
+
+###############################################################################
+#
+# Function to check whether gettimeofday() exists, and how to call it.
+# This may define HAVE_GETTIMEOFDAY and GETTIMEOFDAY_TWO_ARGS.
+#
+###############################################################################
+
+AC_DEFUN([AC_GETTIMEOFDAY_ARGS],
+ [AC_MSG_CHECKING(how to call gettimeofday)
+ AC_CACHE_VAL(ac_cv_gettimeofday_args,
+ [AC_TRY_COMPILE([#include <stdlib.h>
+ #include <sys/time.h>],
+ [struct timeval tv; struct timezone tzp;
+ gettimeofday(&tv, &tzp);],
+ [ac_gettimeofday_args=2],
+ [AC_TRY_COMPILE([#include <stdlib.h>
+ #include <sys/time.h>],
+ [struct timeval tv; gettimeofday(&tv);],
+ [ac_gettimeofday_args=1],
+ [ac_gettimeofday_args=0])])
+ ac_cv_gettimeofday_args=$ac_gettimeofday_args])
+ ac_gettimeofday_args=$ac_cv_gettimeofday_args
+ if test "$ac_gettimeofday_args" = 1 ; then
+ AC_DEFINE(HAVE_GETTIMEOFDAY)
+ AC_MSG_RESULT(one argument)
+ elif test "$ac_gettimeofday_args" = 2 ; then
+ AC_DEFINE(HAVE_GETTIMEOFDAY)
+ AC_DEFINE(GETTIMEOFDAY_TWO_ARGS)
+ AC_MSG_RESULT(two arguments)
+ else
+ AC_MSG_RESULT(unknown)
+ fi
+])
+
+
+###############################################################################
+#
+# Function to find perl5 (defines PERL and PERL_VERSION.)
+#
+###############################################################################
+
+# M4 sucks!! perl sucks too!!
+changequote(X,Y)
+perl_version_cmd='print $]'
+changequote([,])
+
+AC_DEFUN([AC_PROG_PERL],
+ [AC_PATH_PROGS(PERL, [perl5 perl],,)
+ if test -z "$PERL" ; then
+ PERL_VERSION=0
+ else
+ AC_CACHE_CHECK([perl version], ac_cv_perl_version,
+ [ac_cv_perl_version=`$PERL -e "$perl_version_cmd"`])
+ PERL_VERSION=$ac_cv_perl_version
+ fi
+ ])
+
+
+###############################################################################
+#
+# Function to demand "bc". Losers.
+#
+###############################################################################
+
+AC_DEFUN([AC_DEMAND_BC],
+ [ac_bc_result=`echo 6+9 | bc 2>/dev/null`
+ AC_MSG_CHECKING([for bc])
+ if test "$ac_bc_result" = "15" ; then
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ echo ''
+ AC_MSG_ERROR([Your system doesn't have \"bc\", which has been a standard
+ part of Unix since the 1970s. Come back when your vendor
+ has grown a clue.])
+ fi
+ ])
+
+###############################################################################
+#
+# Functions to check how to do ICMP PING requests.
+#
+###############################################################################
+
+AC_DEFUN([AC_CHECK_ICMP],
+ [AC_CACHE_CHECK([for struct icmp], ac_cv_have_icmp,
+ [AC_TRY_COMPILE([#include <stdlib.h>
+ #include <stdio.h>
+ #include <math.h>
+ #include <unistd.h>
+ #include <limits.h>
+ #include <signal.h>
+ #include <fcntl.h>
+ #include <sys/types.h>
+ #include <sys/time.h>
+ #include <sys/ipc.h>
+ #include <sys/shm.h>
+ #include <sys/socket.h>
+ #include <netinet/in_systm.h>
+ #include <netinet/in.h>
+ #include <netinet/ip.h>
+ #include <netinet/ip_icmp.h>
+ #include <netinet/udp.h>
+ #include <arpa/inet.h>
+ #include <netdb.h>],
+ [struct icmp i;
+ struct sockaddr s;
+ struct sockaddr_in si;
+ struct ip ip;
+ i.icmp_type = ICMP_ECHO;
+ i.icmp_code = 0;
+ i.icmp_cksum = 0;
+ i.icmp_id = 0;
+ i.icmp_seq = 0;
+ si.sin_family = AF_INET;
+ #if defined(__DECC) || defined(_IP_VHL)
+ ip.ip_vhl = 0;
+ #else
+ ip.ip_hl = 0;
+ #endif
+ ],
+ [ac_cv_have_icmp=yes],
+ [ac_cv_have_icmp=no])])
+ if test "$ac_cv_have_icmp" = yes ; then
+ AC_DEFINE(HAVE_ICMP)
+ fi])
+
+AC_DEFUN([AC_CHECK_ICMPHDR],
+ [AC_CACHE_CHECK([for struct icmphdr], ac_cv_have_icmphdr,
+ [AC_TRY_COMPILE([#include <stdlib.h>
+ #include <stdio.h>
+ #include <math.h>
+ #include <unistd.h>
+ #include <limits.h>
+ #include <signal.h>
+ #include <fcntl.h>
+ #include <sys/types.h>
+ #include <sys/time.h>
+ #include <sys/ipc.h>
+ #include <sys/shm.h>
+ #include <sys/socket.h>
+ #include <netinet/in_systm.h>
+ #include <netinet/in.h>
+ #include <netinet/ip.h>
+ #include <netinet/ip_icmp.h>
+ #include <netinet/udp.h>
+ #include <arpa/inet.h>
+ #include <netdb.h>],
+ [struct icmphdr i;
+ struct sockaddr s;
+ struct sockaddr_in si;
+ struct ip ip;
+ i.type = ICMP_ECHO;
+ i.code = 0;
+ i.checksum = 0;
+ i.un.echo.id = 0;
+ i.un.echo.sequence = 0;
+ si.sin_family = AF_INET;
+ ip.ip_hl = 0;],
+ [ac_cv_have_icmphdr=yes],
+ [ac_cv_have_icmphdr=no])])
+ if test "$ac_cv_have_icmphdr" = yes ; then
+ AC_DEFINE(HAVE_ICMPHDR)
+ fi])
+
+
+###############################################################################
+#
+# Functions to check for various X11 crap.
+#
+###############################################################################
+
+# Try and find the app-defaults directory.
+# It sucks that autoconf doesn't do this already...
+#
+AC_DEFUN([AC_PATH_X_APP_DEFAULTS_XMKMF],[
+ rm -fr conftestdir
+ if mkdir conftestdir; then
+ cd conftestdir 2>/dev/null
+ # Make sure to not put "make" in the Imakefile rules, since we grep it out.
+ cat > Imakefile <<'EOF'
+acfindx:
+ @echo 'ac_x_app_defaults="${XAPPLOADDIR}"'
+EOF
+ if (xmkmf) >/dev/null 2>&1 && test -f Makefile; then
+ # GNU make sometimes prints "make[1]: Entering...", which'd confuse us.
+ eval `${MAKE-make} acfindx 2>/dev/null | grep -v make`
+ fi
+ cd .. 2>/dev/null
+ rm -fr conftestdir
+ fi])
+
+###############################################################################
+#
+# Handle the --with-x-app-defaults option HERE
+#
+###############################################################################
+
+AC_ARG_WITH(x-app-defaults,[],
+ [ac_cv_x_app_defaults="$withval"],
+ [eval ac_x_app_defaults="$withval"])
+
+
+AC_DEFUN([AC_PATH_X_APP_DEFAULTS_DIRECT],[
+ # Look for the directory under a standard set of common directories.
+ # Check X11 before X11Rn because it's often a symlink to the current release.
+ for ac_dir in \
+ \
+ /usr/share/X11/app-defaults \
+ \
+ /usr/X11/lib/app-defaults \
+ /usr/X11R6/lib/app-defaults \
+ /usr/X11R6/lib/X11/app-defaults \
+ /usr/X11R5/lib/app-defaults \
+ /usr/X11R5/lib/X11/app-defaults \
+ /usr/X11R4/lib/app-defaults \
+ /usr/X11R4/lib/X11/app-defaults \
+ \
+ /usr/lib/X11/app-defaults \
+ /usr/lib/X11R6/app-defaults \
+ /usr/lib/X11R5/app-defaults \
+ /usr/lib/X11R4/app-defaults \
+ \
+ /etc/X11/app-defaults \
+ \
+ /usr/local/X11/lib/app-defaults \
+ /usr/local/X11R6/lib/app-defaults \
+ /usr/local/X11R5/lib/app-defaults \
+ /usr/local/X11R4/lib/app-defaults \
+ \
+ /usr/local/lib/X11/app-defaults \
+ /usr/local/lib/X11R6/app-defaults \
+ /usr/local/lib/X11R6/X11/app-defaults \
+ /usr/local/lib/X11R5/app-defaults \
+ /usr/local/lib/X11R5/X11/app-defaults \
+ /usr/local/lib/X11R4/app-defaults \
+ /usr/local/lib/X11R4/X11/app-defaults \
+ \
+ /usr/X386/lib/X11/app-defaults \
+ /usr/x386/lib/X11/app-defaults \
+ /usr/XFree86/lib/X11/app-defaults \
+ \
+ /usr/lib/X11/app-defaults \
+ /usr/local/lib/X11/app-defaults \
+ /usr/unsupported/lib/X11/app-defaults \
+ /usr/athena/lib/X11/app-defaults \
+ /usr/local/x11r5/lib/X11/app-defaults \
+ /usr/lpp/Xamples/lib/X11/app-defaults \
+ /lib/usr/lib/X11/app-defaults \
+ \
+ /usr/openwin/lib/app-defaults \
+ /usr/openwin/lib/X11/app-defaults \
+ /usr/openwin/share/lib/app-defaults \
+ /usr/openwin/share/lib/X11/app-defaults \
+ \
+ /X11R6/lib/app-defaults \
+ /X11R5/lib/app-defaults \
+ /X11R4/lib/app-defaults \
+ ; \
+ do
+ if test -d "$ac_dir"; then
+ ac_x_app_defaults=$ac_dir
+ break
+ fi
+ done
+])
+
+AC_DEFUN([AC_PATH_X_APP_DEFAULTS],
+ [AC_REQUIRE_CPP()
+ AC_CACHE_CHECK([for X app-defaults directory], ac_cv_x_app_defaults,
+ [# skip this, it's always wrong these days.
+ # AC_PATH_X_APP_DEFAULTS_XMKMF
+ if test x"$ac_x_app_defaults" = x; then
+ true AC_PATH_X_APP_DEFAULTS_DIRECT
+ fi
+ if test x"$ac_x_app_defaults" = x; then
+ /bin/echo -n 'fallback: '
+ ac_cv_x_app_defaults="/usr/lib/X11/app-defaults"
+ else
+ # Record where we found app-defaults for the cache.
+ ac_cv_x_app_defaults="$ac_x_app_defaults"
+ fi])
+ eval ac_x_app_defaults="$ac_cv_x_app_defaults"])
+
+
+AC_DEFUN([AC_XPOINTER],
+ [AC_CACHE_CHECK([for XPointer], ac_cv_xpointer,
+ [AC_TRY_X_COMPILE([#include <X11/Xlib.h>],
+ [XPointer foo = (XPointer) 0;],
+ [ac_cv_xpointer=yes],
+ [ac_cv_xpointer=no])])
+ if test "$ac_cv_xpointer" != yes; then
+ AC_DEFINE(XPointer,[char*])
+ fi])
+
+
+# Random special-cases for X on certain pathological OSes.
+# You know who you are.
+#
+AC_DEFUN([AC_X_RANDOM_PATHS],
+ [case "$host" in
+ *-hpux*)
+
+ # The following arcana was gleaned from conversations with
+ # Eric Schwartz <erics@col.hp.com>:
+ #
+ # On HPUX 10.x, the parts of X that HP considers "standard" live in
+ # /usr/{include,lib}/X11R6/. The parts that HP doesn't consider
+ # "standard", notably, Xaw and Xmu, live in /usr/contrib/X11R6/.
+ # Yet /usr/contrib/X11R6/ comes preinstalled on all HPUX systems.
+ # Also, there are symlinks from /usr/include/ and /usr/lib/ into
+ # /usr/{include,lib}/X11R6/, so that (if you don't use Xmu at all)
+ # you don't need any -I or -L arguments.
+ #
+ # On HPUX 9.x, /usr/{include,lib}/X11R5/ and /usr/contrib/X11R5/
+ # are the same division as 10.x. However, there are no symlinks to
+ # the X stuff from /usr/include/ and /usr/lib/, so -I and -L
+ # arguments are always necessary.
+ #
+ # However, X11R6 was available on HPUX 9.x as a patch: if that
+ # patch was installed, then all of X11R6 went in to
+ # /usr/contrib/X11R6/ (there was no /usr/{include,lib}/X11R6/.)
+ #
+ # HPUX 8.x was the same as 9.x, but was X11R4 instead (I don't know
+ # whether R5 was available as a patch; R6 undoubtedly was not.)
+ #
+ # So. We try and use the highest numbered pair of
+ # /usr/{include,lib}/X11R?/ and /usr/contrib/X11R?/{include,lib}/
+ # that are available. We do not mix and match different versions
+ # of X.
+ #
+ # Question I still don't know the answer to: (do you?)
+ #
+ # * On HPUX 9.x, where /usr/include/X11R5/ was standard, and
+ # /usr/contrib/X11R6/ could be installed as a patch, what was in
+ # that contrib directory? Did it contain so-called "standard"
+ # X11R6, or did it include Xaw and Xmu as well? If the former,
+ # where did one find Xaw and Xmu on 9.x R6 systems? Would this
+ # be a situation where one had to reach into the R5 headers and
+ # libs to find Xmu? That is, must both R6 and R5 directories
+ # be on the -I and -L lists in that case?
+ #
+ for version in X11R6 X11R5 X11R4 ; do
+ # if either pair of directories exists...
+ if test -d /usr/include/$version || test -d /usr/contrib/$version/include
+ then
+ # if contrib exists, use it...
+ if test -d /usr/contrib/$version/include ; then
+ X_CFLAGS="$X_CFLAGS -I/usr/contrib/$version/include"
+ X_LIBS="$X_LIBS -L/usr/contrib/$version/lib"
+ fi
+ # if the "standard" one exists, use it.
+ if test -d /usr/include/$version ; then
+ X_CFLAGS="$X_CFLAGS -I/usr/include/$version"
+ X_LIBS="$X_LIBS -L/usr/lib/$version"
+ fi
+ # since at least one of the pair exists, go no farther.
+ break
+ fi
+ done
+
+ # Now find Motif. Thanks for not making xmkmf find this by
+ # default, you losers.
+ #
+ if test -d /usr/include/Motif2.1 ; then
+ X_CFLAGS="$X_CFLAGS -I/usr/include/Motif2.1"
+ X_LIBS="$X_LIBS -L/usr/lib/Motif2.1"
+ elif test -d /usr/include/Motif1.2 ; then
+ X_CFLAGS="$X_CFLAGS -I/usr/include/Motif1.2"
+ X_LIBS="$X_LIBS -L/usr/lib/Motif1.2"
+ elif test -d /usr/include/Motif1.1 ; then
+ X_CFLAGS="$X_CFLAGS -I/usr/include/Motif1.1"
+ X_LIBS="$X_LIBS -L/usr/lib/Motif1.1"
+ fi
+
+ # Now let's check for the pseudo-standard locations for OpenGL.
+ #
+ if test -d /opt/graphics/OpenGL/include ; then
+ # HP-UX 10.20 puts it here
+ X_CFLAGS="-I/opt/graphics/OpenGL/include $X_CFLAGS"
+ X_LIBS="-L/opt/graphics/OpenGL/lib $X_LIBS"
+ elif test -d /opt/Mesa/lib ; then
+ X_CFLAGS="-I/opt/Mesa/include $X_CFLAGS"
+ X_LIBS="-L/opt/Mesa/lib $X_LIBS"
+ fi
+
+
+ # On HPUX, default to installing in /opt/xscreensaver/ instead of
+ # in /usr/local/, unless there is already an xscreensaver in
+ # /usr/local/bin/. This can be overridden with the --prefix arg
+ # to configure. I'm not sure this is the right thing to do, but
+ # Richard Lloyd says so...
+ #
+ if test \! -x /usr/local/bin/xscreensaver ; then
+ ac_default_prefix=/opt/xscreensaver
+ fi
+
+ ;;
+ *-solaris*)
+
+ # Thanks for not making xmkmf find this by default, pinheads.
+ # And thanks for moving things around again, too. Is this
+ # really the standard location now? What happened to the
+ # joke that this kind of thing went in /opt?
+ # cthomp says "answer: CDE (Common Disorganized Environment)"
+ #
+ if test -f /usr/dt/include/Xm/Xm.h ; then
+ X_CFLAGS="$X_CFLAGS -I/usr/dt/include"
+ MOTIF_LIBS="$MOTIF_LIBS -L/usr/dt/lib -R/usr/dt/lib"
+
+ # Some versions of Slowlaris Motif require -lgen. But not all. Why?
+ AC_CHECK_LIB(gen, regcmp, [MOTIF_LIBS="$MOTIF_LIBS -lgen"])
+ fi
+
+ ;;
+ *-darwin*)
+
+ # On MacOS X (10.x with "fink"), many things are under /sw/.
+ #
+ if test -d /sw/include ; then
+ X_CFLAGS="-I/sw/include $X_CFLAGS"
+ X_LIBS="-L/sw/lib $X_LIBS"
+ fi
+ ;;
+ esac])
+
+AC_DEFUN([AC_CHECK_GETIFADDRS],
+ [AC_CACHE_CHECK([for getifaddrs], ac_cv_have_getifaddrs,
+ [AC_TRY_COMPILE([#include <stdlib.h>
+ #include <unistd.h>
+ #include <arpa/inet.h>
+ #include <ifaddrs.h>],
+ [struct ifaddrs *ifa;
+ getifaddrs (&ifa);
+ ifa->ifa_next = 0;
+ ifa->ifa_addr->sa_family = 0;],
+ [ac_cv_have_getifaddrs=yes],
+ [ac_cv_have_getifaddrs=no])])
+ if test "$ac_cv_have_getifaddrs" = yes ; then
+ AC_DEFINE(HAVE_GETIFADDRS)
+ fi])
+
+AC_DEFUN([AC_TYPE_SOCKLEN_T],
+ [AC_CACHE_CHECK([for socklen_t], ac_cv_type_socklen_t,
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+ #include <sys/types.h>
+ #include <sys/socket.h>]], [[
+ socklen_t socklen;
+ ]])],[ac_cv_type_socklen_t=yes],[ac_cv_type_socklen_t=no])])
+ if test "$ac_cv_type_socklen_t" != yes; then
+ AC_DEFINE(socklen_t, int,
+ [Define to `int' if <sys/types.h> or <sys/socket.h> does not define.])
+ fi])
+
+###############################################################################
+#
+# Some utility functions to make checking for X things easier.
+#
+###############################################################################
+
+# Like AC_CHECK_HEADER, but it uses the already-computed -I directories.
+#
+AC_DEFUN([AC_CHECK_X_HEADER], [
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ AC_CHECK_HEADER([$1],[$2],[$3],[$4])
+ CPPFLAGS="$ac_save_CPPFLAGS"])
+
+# Like AC_EGREP_HEADER, but it uses the already-computed -I directories.
+#
+AC_DEFUN([AC_EGREP_X_HEADER], [
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ AC_EGREP_HEADER([$1], [$2], [$3], [$4])
+ CPPFLAGS="$ac_save_CPPFLAGS"])
+
+# Like AC_TRY_COMPILE, but it uses the already-computed -I directories.
+#
+AC_DEFUN([AC_TRY_X_COMPILE], [
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ AC_TRY_COMPILE([$1], [$2], [$3], [$4])
+ CPPFLAGS="$ac_save_CPPFLAGS"])
+
+
+# Like AC_CHECK_LIB, but it uses the already-computed -I and -L directories.
+# Use this sparingly; it probably doesn't work very well on X programs.
+#
+AC_DEFUN([AC_CHECK_X_LIB], [
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_save_LDFLAGS="$LDFLAGS"
+# ac_save_LIBS="$LIBS"
+
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ # note: $X_CFLAGS includes $x_includes
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ # note: $X_LIBS includes $x_libraries
+ LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
+ AC_CHECK_LIB([$1], [$2], [$3], [$4], [$5])
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LDFLAGS="$ac_save_LDFLAGS"
+# LIBS="$ac_save_LIBS"
+ ])
+
+# Like AC_TRY_RUN, but it uses the already-computed -I directories.
+# (But not the -L directories!)
+#
+AC_DEFUN([AC_TRY_X_RUN], [
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+ CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
+ AC_TRY_RUN([$1], [$2], [$3], [$4])
+ CPPFLAGS="$ac_save_CPPFLAGS"])
+
+
+
+# Usage: HANDLE_X_PATH_ARG([variable_name],
+# [--command-line-option],
+# [descriptive string])
+#
+# All of the --with options take three forms:
+#
+# --with-foo (or --with-foo=yes)
+# --without-foo (or --with-foo=no)
+# --with-foo=/DIR
+#
+# This function, HANDLE_X_PATH_ARG, deals with the /DIR case. When it sees
+# a directory (string beginning with a slash) it checks to see whether
+# /DIR/include and /DIR/lib exist, and adds them to $X_CFLAGS and $X_LIBS
+# as appropriate.
+#
+AC_DEFUN([HANDLE_X_PATH_ARG], [
+ case "$[$1]" in
+ yes) ;;
+ no) ;;
+
+ /*)
+ AC_MSG_CHECKING([for [$3] headers])
+ d=$[$1]/include
+ if test -d $d; then
+ X_CFLAGS="-I$d $X_CFLAGS"
+ AC_MSG_RESULT($d)
+ else
+ AC_MSG_RESULT(not found ($d: no such directory))
+ fi
+
+ AC_MSG_CHECKING([for [$3] libs])
+ d=$[$1]/lib
+ if test -d $d; then
+ X_LIBS="-L$d $X_LIBS"
+ AC_MSG_RESULT($d)
+ else
+ AC_MSG_RESULT(not found ($d: no such directory))
+ fi
+
+ # replace the directory string with "yes".
+ [$1]_req="yes"
+ [$1]=$[$1]_req
+ ;;
+
+ *)
+ echo ""
+ echo "error: argument to [$2] must be \"yes\", \"no\", or a directory."
+ echo " If it is a directory, then \`DIR/include' will be added to"
+ echo " the -I list, and \`DIR/lib' will be added to the -L list."
+ exit 1
+ ;;
+ esac
+ ])
+
+
+
+###############################################################################
+###############################################################################
+#
+# End of function definitions. Now start actually executing stuff.
+#
+###############################################################################
+###############################################################################
+
+# WTF! autoconf emits this *way* too late. Do it earlier.
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+
+# random compiler setup
+AC_CANONICAL_HOST
+
+ac_original_cc=$CC
+AC_PROG_CC
+AC_PROG_CC_PTHREAD # Needs ac_original_cc.
+
+AC_PROG_CC_ANSI
+AC_NO_LONG_STRING_WARNINGS
+AC_NO_MISPLACED_DECLARATIONS
+AC_NO_OBJECTIVE_C
+AC_NO_CPLUSPLUS_COMMENTS_IN_C_CODE
+AC_PROG_CPP
+AC_C_CONST
+AC_C_INLINE
+AC_EXEEXT
+AC_DEMAND_BC
+
+# stuff for Makefiles
+AC_PROG_INSTALL
+AC_PROG_INSTALL_DIRS
+AC_PROG_MAKE_SET
+
+# By default, autoconf sets INSTALL_SCRIPT to '${INSTALL_PROGRAM}'.
+# That's wrong: it should be set to '${INSTALL}', so that one can
+# implement the "install-strip" target properly (strip executables,
+# but do not try to strip scripts.)
+#
+INSTALL_SCRIPT='${INSTALL}'
+
+# random libc stuff
+AC_HEADER_STDC
+AC_CHECK_HEADERS(unistd.h inttypes.h)
+AC_TYPE_MODE_T
+AC_TYPE_PID_T
+AC_TYPE_SIZE_T
+AC_TYPE_SIGNAL
+AC_HEADER_TIME
+AC_HEADER_SYS_WAIT
+AC_HEADER_DIRENT
+AC_GETTIMEOFDAY_ARGS
+AC_SYS_LARGEFILE
+AC_CHECK_FUNCS(select fcntl uname nice setpriority getcwd getwd putenv sbrk)
+AC_CHECK_FUNCS(sigaction syslog realpath setrlimit)
+AC_CHECK_FUNCS(setlocale sqrtf)
+AC_CHECK_FUNCS(getaddrinfo)
+AC_CHECK_MEMBERS([struct sockaddr.sa_len],,, [[#include <sys/socket.h>]])
+AC_CHECK_ICMP
+AC_CHECK_ICMPHDR
+AC_CHECK_GETIFADDRS
+AC_TYPE_SOCKLEN_T
+AC_CHECK_HEADERS(crypt.h sys/select.h)
+AC_PROG_PERL
+
+if test -z "$PERL" ; then
+ # don't let it be blank...
+ PERL=/usr/bin/perl
+fi
+
+AC_PATH_XTRA
+
+if test "$have_x" != yes; then
+ AC_MSG_ERROR(Couldn't find X11 headers/libs. Try `$0 --help'.)
+fi
+
+AC_PATH_X_APP_DEFAULTS
+AC_X_RANDOM_PATHS
+AC_XPOINTER
+
+AC_MSG_CHECKING(whether this is MacOS X)
+ ac_macosx=no
+ case "$host" in
+ *-apple-darwin* )
+ ac_macosx=yes
+ ;;
+ esac
+AC_MSG_RESULT($ac_macosx)
+
+
+###############################################################################
+#
+# Gettext support
+#
+###############################################################################
+
+IT_PROG_INTLTOOL
+GETTEXT_PACKAGE=xscreensaver
+AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE",
+ [This is the name of the gettext package to use.])
+AC_DEFINE_UNQUOTED(PACKAGE, "$GETTEXT_PACKAGE",
+ [This is the same as GETTEXT_PACKAGE, but for the glade
+ generated code.])
+AC_SUBST(GETTEXT_PACKAGE)
+
+ALL_LINGUAS="da de es et fi fr hu it ja ko nb nl pl pt pt_BR ru sk sv vi wa zh_CN zh_TW"
+AM_GLIB_GNU_GETTEXT
+MKINSTALLDIRS="$INSTALL_DIRS"
+
+
+###############################################################################
+#
+# Check for -lXmu (some fucked up vendors don't ship it...)
+#
+###############################################################################
+
+have_xmu=no
+AC_CHECK_X_HEADER(X11/Xmu/Error.h, [have_xmu=yes],,
+ [#include <stdlib.h>
+ #include <stdio.h>
+ #include <X11/Intrinsic.h>])
+if test "$have_xmu" = no ; then
+ XMU_SRCS='$(UTILS_SRC)/xmu.c'
+ XMU_OBJS='$(UTILS_BIN)/xmu.o'
+ XMU_LIBS=''
+else
+ XMU_SRCS=''
+ XMU_OBJS=''
+ XMU_LIBS='-lXmu'
+ AC_DEFINE(HAVE_XMU)
+fi
+
+
+###############################################################################
+#
+# Check for the SunOS 4.1.x _get_wmShellWidgetClass bug.
+# See comp.windows.x FAQ question 124. The right fix is to
+# get OpenWindows 3.0 patches 100512-02 and 100573-03.
+#
+###############################################################################
+
+if test "$have_xmu" = yes ; then
+ case "$host" in
+ *-sunos4*)
+ AC_CACHE_CHECK([for the SunOS 4.1.x _get_wmShellWidgetClass bug],
+ ac_cv_sunos_xmu_bug,
+ [ac_save_LDFLAGS="$LDFLAGS"
+ if test \! -z "$x_libraries" ; then
+ LDFLAGS="$LDFLAGS -L$x_libraries"
+ fi
+ # Note: this trick never works! (Generally.)
+ # We're only getting away with using AC_TRY_LINK
+ # with X libraries because we know it's SunOS.
+ LDFLAGS="$LDFLAGS -lXmu -lXt -lX11 -lXext -lm"
+ AC_TRY_LINK(,,
+ [ac_cv_sunos_xmu_bug=no],
+ [ac_cv_sunos_xmu_bug=yes])
+ LDFLAGS="$ac_save_LDFLAGS"])
+ if test "$ac_cv_sunos_xmu_bug" = yes ; then
+ AC_CACHE_CHECK([whether the compiler understands -static],
+ ac_cv_ld_static,
+ [ac_save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS -static"
+ AC_TRY_LINK(,,[ac_cv_ld_static=yes],[ac_cv_ld_static=no])
+ LDFLAGS="$ac_save_LDFLAGS"])
+ if test "$ac_cv_ld_static" = yes ; then
+ LDFLAGS="$LDFLAGS -static"
+ else
+ LDFLAGS="$LDFLAGS -Bstatic"
+ fi
+ fi
+ ;;
+ esac
+fi
+
+
+###############################################################################
+#
+# Handle the --with-hackdir option
+#
+###############################################################################
+
+have_hackdir=yes
+with_hackdir_req=unspecified
+AC_ARG_WITH(hackdir,[
+
+Installation options:
+ --with-hackdir=DIR Where to install the hundreds of demo executables.
+ Default: `PREFIX/libexec/xscreensaver/'],
+ [with_hackdir="$withval"; with_hackdir_req="$withval"],[with_hackdir=yes])
+
+if test x"$with_hackdir" = xyes; then
+ HACKDIR='${libexecdir}/xscreensaver'
+elif test x"$with_hackdir" = xno; then
+ HACKDIR='${bindir}'
+else
+ HACKDIR=$with_hackdir
+fi
+
+# canonicalize slashes.
+HACKDIR=`echo "${HACKDIR}" | sed 's@/$@@;s@//*@/@g'`
+
+# Expand HACKDIR as HACKDIR_FULL
+HACKDIR_FULL=`eval eval eval eval eval eval eval eval eval echo $HACKDIR`
+
+# This option used to be called --enable-subdir; make sure that is no longer
+# used, since configure brain-damagedly ignores unknown --enable options.
+
+obsolete_enable=
+AC_ARG_ENABLE(subdir,,[obsolete_enable=yes])
+if test -n "$obsolete_enable"; then
+ echo "error: the --enable-subdir option has been replaced with"
+ echo " the new --with-hackdir option; see \`configure --help'"
+ echo " for more information."
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Handle the --with-configdir option
+# Help for --with-x-app-defaults option added.
+#
+###############################################################################
+
+have_configdir=yes
+with_configdir_req=unspecified
+AC_ARG_WITH(configdir,
+[ --with-configdir=DIR Where to install the data files that describe each
+ of the display modes to the GUI.
+ Default: `PREFIX/share/xscreensaver/config/'
+ --with-x-app-defaults=DIR
+ Where to install xscreensaver configuration file.
+],
+ [with_configdir="$withval"; with_configdir_req="$withval"],
+ [with_configdir=yes])
+
+if test x"$with_configdir" = xyes; then
+ HACK_CONF_DIR='${datadir}/xscreensaver/config'
+elif test x"$with_configdir" = xno; then
+ echo "error: must be yes, or a pathname: --with-configdir=$with_configdir"
+ exit 1
+else
+ # there must be a better way than this...
+ if test -z "`echo $with_configdir | sed 's@^/.*@@'`" ; then
+ # absolute path
+ HACK_CONF_DIR=$with_configdir
+ else
+ # relative path
+ HACK_CONF_DIR="\${exec_prefix}$with_configdir"
+ fi
+fi
+
+
+
+
+###############################################################################
+#
+# Check for the SGI SCREEN_SAVER server extension.
+#
+###############################################################################
+
+#have_sgi=no
+#with_sgi_req=unspecified
+#AC_ARG_WITH(sgi-ext,
+#[Except where noted, all of the --with options below can also take a
+#directory argument: for example, `--with-motif=/opt/Motif'. That would
+#cause /opt/Motif/include/ to be added to the -I list, and /opt/Motif/lib/
+#to be added to the -L list, assuming those directories exist.
+#
+#By default, support for each of these options will be built in, if the
+#relevant library routines exist. At run time, they will then be used
+#only if the X server being used supports them. Each --with option has
+#a corresponding --without option, to override building support for them
+#at all.
+#
+#Screen blanking and idle-detection options:
+#
+# --with-sgi-ext Include support for the SGI SCREEN_SAVER extension.],
+# [with_sgi="$withval"; with_sgi_req="$withval"],[with_sgi=yes])
+#
+#HANDLE_X_PATH_ARG(with_sgi, --with-sgi-ext, SGI SCREEN_SAVER)
+#
+#if test "$with_sgi" = yes; then
+# AC_CHECK_X_HEADER(X11/extensions/XScreenSaver.h,
+# [have_sgi=yes
+# AC_DEFINE(HAVE_SGI_SAVER_EXTENSION)],,
+# [#include <X11/Xlib.h>])
+#
+#elif test "$with_sgi" != no; then
+# echo "error: must be yes or no: --with-sgi-ext=$with_sgi"
+# exit 1
+#fi
+
+
+###############################################################################
+#
+# Check for the XIDLE server extension.
+#
+###############################################################################
+
+#have_xidle=no
+#with_xidle_req=unspecified
+#AC_ARG_WITH(xidle-ext,
+#[ --with-xidle-ext Include support for the XIDLE extension.],
+# [with_xidle="$withval"; with_xidle_req="$withval"],[with_xidle=yes])
+#
+#HANDLE_X_PATH_ARG(with_xidle, --with-xidle-ext, XIDLE)
+#
+#if test "$with_xidle" = yes; then
+# AC_CHECK_X_HEADER(X11/extensions/xidle.h,
+# [have_xidle=yes
+# AC_DEFINE(HAVE_XIDLE_EXTENSION)],,
+# [#include <X11/Xlib.h>])
+#elif test "$with_xidle" != no; then
+# echo "error: must be yes or no: --with-xidle-ext=$with_xidle"
+# exit 1
+#fi
+
+
+###############################################################################
+#
+# Check for the SGI-VIDEO-CONTROL server extension.
+#
+###############################################################################
+
+#have_sgivc=no
+#with_sgivc_req=unspecified
+#AC_ARG_WITH(sgivc-ext,
+#[ --with-sgivc-ext Include support for the SGI-VIDEO-CONTROL extension.],
+# [with_sgivc="$withval"; with_sgivc_req="$withval"],[with_sgivc=yes])
+#
+#HANDLE_X_PATH_ARG(with_sgivc, --with-sgivc-ext, SGI-VIDEO-CONTROL)
+#
+#if test "$with_sgivc" = yes; then
+#
+# # first check for XSGIvc.h
+# AC_CHECK_X_HEADER(X11/extensions/XSGIvc.h, [have_sgivc=yes],,
+# [#include <X11/Xlib.h>])
+#
+# # if that succeeded, then check for the -lXsgivc
+# if test "$have_sgivc" = yes; then
+# have_sgivc=no
+# AC_CHECK_X_LIB(Xsgivc, XSGIvcQueryGammaMap,
+# [have_sgivc=yes; SAVER_LIBS="$SAVER_LIBS -lXsgivc"], [true],
+# -lXext -lX11)
+# fi
+#
+# # if that succeeded, then we've really got it.
+# if test "$have_sgivc" = yes; then
+# AC_DEFINE(HAVE_SGI_VC_EXTENSION)
+# fi
+#
+#elif test "$with_sgivc" != no; then
+# echo "error: must be yes or no: --with-sgivc-ext=$with_sgivc"
+# exit 1
+#fi
+
+
+###############################################################################
+#
+# Check for the DPMS server extension.
+#
+###############################################################################
+
+have_dpms=no
+with_dpms_req=unspecified
+AC_ARG_WITH(dpms-ext,
+[ --with-dpms-ext Include support for the DPMS extension.],
+ [with_dpms="$withval"; with_dpms_req="$withval"],[with_dpms=yes])
+
+HANDLE_X_PATH_ARG(with_dpms, --with-dpms-ext, DPMS)
+
+if test "$with_dpms" = yes; then
+
+ # first check for dpms.h
+ AC_CHECK_X_HEADER(X11/extensions/dpms.h, [have_dpms=yes],,
+ [#include <X11/Xlib.h>
+ #include <X11/Xmd.h>])
+
+ # if that succeeded, then check for the DPMS code in the libraries
+ if test "$have_dpms" = yes; then
+
+ # first look in -lXext (this is where it is with XFree86 4.0)
+ have_dpms=no
+ AC_CHECK_X_LIB(Xext, DPMSInfo, [have_dpms=yes], [true], -lXext -lX11)
+
+ # if that failed, look in -lXdpms (this is where it was in XFree86 3.x)
+ if test "$have_dpms" = no; then
+ AC_CHECK_X_LIB(Xdpms, DPMSInfo,
+ [have_dpms=yes; XDPMS_LIBS="-lXdpms"], [true],
+ -lXext -lX11)
+ fi
+ fi
+
+
+ # if that succeeded, then we've really got it.
+ if test "$have_dpms" = yes; then
+ AC_DEFINE(HAVE_DPMS_EXTENSION)
+ fi
+
+elif test "$with_dpms" != no; then
+ echo "error: must be yes or no: --with-dpms-ext=$with_dpms"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for the XINERAMA server extension.
+#
+###############################################################################
+
+have_xinerama=no
+with_xinerama_req=unspecified
+AC_ARG_WITH(xinerama-ext,
+[ --with-xinerama-ext Include support for the XINERAMA extension.],
+ [with_xinerama="$withval"; with_xinerama_req="$withval"],[with_xinerama=yes])
+
+HANDLE_X_PATH_ARG(with_xinerama, --with-xinerama-ext, XINERAMA)
+
+if test "$with_xinerama" = yes; then
+
+ # first check for Xinerama.h
+ AC_CHECK_X_HEADER(X11/extensions/Xinerama.h, [have_xinerama=yes],,
+ [#include <X11/Xlib.h>])
+
+ # if that succeeded, then check for the XINERAMA code in the libraries
+ if test "$have_xinerama" = yes; then
+
+ # first look in -lXext
+ have_xinerama=no
+ AC_CHECK_X_LIB(Xext, XineramaQueryScreens, [have_xinerama=yes], [true],
+ -lXext -lX11)
+
+ # if that failed, look in -lXinerama (this is where it is in XFree86 4.1.)
+ if test "$have_xinerama" = no; then
+ AC_CHECK_X_LIB(Xinerama, XineramaQueryScreens,
+ [have_xinerama=yes; XINERAMA_LIBS="-lXinerama"],
+ [true], -lXext -lX11)
+ fi
+ fi
+
+ # if that succeeded, then we've really got it.
+ if test "$have_xinerama" = yes; then
+ AC_DEFINE(HAVE_XINERAMA)
+ fi
+
+elif test "$with_xinerama" != no; then
+ echo "error: must be yes or no: --with-xinerama-ext=$with_xinerama"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for the XINPUT server extension.
+#
+###############################################################################
+
+have_xinput=no
+with_xinput_req=unspecified
+AC_ARG_WITH(xinput-ext,
+[ --with-xinput-ext Include support for the XInput extension.],
+ [with_xinput="$withval"; with_xinput_req="$withval"], [with_xinput=yes])
+
+HANDLE_X_PATH_ARG(with_xinput, --with-xinput-ext, XINPUT)
+
+if test "$with_xinput" = yes; then
+
+ # first check for Xinput.h
+ AC_CHECK_X_HEADER(X11/extensions/XInput.h, [have_xinput=yes],,
+ [#include <X11/Xlib.h>])
+
+ # if that succeeded, then check for libXi
+ if test "$have_xinput" = yes; then
+ have_xinput=no
+ AC_CHECK_X_LIB(Xi, XListInputDevices,
+ [have_xinput=yes; SAVER_LIBS="$SAVER_LIBS -lXi"],
+ [true], -lXext -lX11)
+ fi
+
+ # if that succeeded, then we've really got it.
+ if test "$have_xinput" = yes; then
+ AC_DEFINE(HAVE_XINPUT)
+ fi
+
+elif test "$with_xinput" != no; then
+ echo "error: must be yes or no: --with-xinput-ext=$with_xinput"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for the XF86VMODE server extension (for virtual screens.)
+#
+###############################################################################
+
+have_xf86vmode=no
+with_xf86vmode_req=unspecified
+AC_ARG_WITH(xf86vmode-ext,
+[ --with-xf86vmode-ext Include support for XFree86 virtual screens.],
+ [with_xf86vmode="$withval"; with_xf86vmode_req="$withval"],
+ [with_xf86vmode=yes])
+
+HANDLE_X_PATH_ARG(with_xf86vmode, --with-xf86vmode-ext, xf86vmode)
+
+VIDMODE_LIBS=""
+
+if test "$with_xf86vmode" = yes; then
+
+ # first check for xf86vmode.h
+ AC_CHECK_X_HEADER(X11/extensions/xf86vmode.h, [have_xf86vmode=yes],,
+ [#include <X11/Xlib.h>])
+
+ # if that succeeded, then check for the -lXxf86vm
+ if test "$have_xf86vmode" = yes; then
+ have_xf86vmode=no
+ AC_CHECK_X_LIB(Xxf86vm, XF86VidModeGetViewPort,
+ [have_xf86vmode=yes;
+ VIDMODE_LIBS="-lXxf86vm";
+ SAVER_LIBS="$SAVER_LIBS $VIDMODE_LIBS"],
+ [true], -lXext -lX11)
+ fi
+
+ # if that succeeded, then we've really got it.
+ if test "$have_xf86vmode" = yes; then
+ AC_DEFINE(HAVE_XF86VMODE)
+ fi
+
+elif test "$with_xf86vmode" != no; then
+ echo "error: must be yes or no: --with-xf86vmode-ext=$with_xf86vmode"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for the XF86VMODE server extension (for gamma fading.)
+#
+###############################################################################
+
+have_xf86gamma=no
+have_xf86gamma_ramp=no
+with_xf86gamma_req=unspecified
+AC_ARG_WITH(xf86gamma-ext,
+[ --with-xf86gamma-ext Include support for XFree86 gamma fading.],
+ [with_xf86gamma="$withval"; with_xf86gamma_req="$withval"],
+ [with_xf86gamma=yes])
+
+HANDLE_X_PATH_ARG(with_xf86gamma, --with-xf86gamma-ext, xf86gamma)
+
+if test "$with_xf86gamma" = yes; then
+
+ # first check for xf86vmode.h, if we haven't already
+ if test "$have_xf86vmode" = yes; then
+ have_xf86gamma=yes
+ else
+ AC_CHECK_X_HEADER(X11/extensions/xf86vmode.h, [have_xf86gamma=yes],,
+ [#include <X11/Xlib.h>])
+ fi
+
+ # if that succeeded, then check for the -lXxf86vm
+ if test "$have_xf86gamma" = yes; then
+ have_xf86gamma=no
+ AC_CHECK_X_LIB(Xxf86vm, XF86VidModeSetGamma,
+ [have_xf86gamma=yes],
+ [true], -lXext -lX11)
+ fi
+
+ # check for the Ramp versions of the functions too.
+ if test "$have_xf86gamma" = yes; then
+ have_xf86gamma_ramp=no
+ AC_CHECK_X_LIB(Xxf86vm, XF86VidModeSetGammaRamp,
+ [have_xf86gamma_ramp=yes],
+ [true], -lXext -lX11)
+ fi
+
+ # if those tests succeeded, then we've really got the functions.
+ if test "$have_xf86gamma" = yes; then
+ AC_DEFINE(HAVE_XF86VMODE_GAMMA)
+ fi
+
+ if test "$have_xf86gamma_ramp" = yes; then
+ AC_DEFINE(HAVE_XF86VMODE_GAMMA_RAMP)
+ fi
+
+ # pull in the lib, if we haven't already
+ if test "$have_xf86gamma" = yes -a "$have_xf86vmode" = no; then
+ SAVER_LIBS="$SAVER_LIBS -lXxf86vm"
+ fi
+
+elif test "$with_xf86gamma" != no; then
+ echo "error: must be yes or no: --with-xf86gamma-ext=$with_xf86vmode"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for the RANDR (Resize and Rotate) server extension.
+#
+# We need this to detect when the resolution of the desktop
+# has changed out from under us (this is a newer, different
+# mechanism than the XF86VMODE virtual viewports.)
+#
+###############################################################################
+
+have_randr=no
+with_randr_req=unspecified
+AC_ARG_WITH(randr-ext,
+[ --with-randr-ext Include support for the X Resize+Rotate extension.],
+ [with_randr="$withval"; with_randr_req="$withval"],[with_randr=yes])
+
+HANDLE_X_PATH_ARG(with_randr, --with-randr-ext, RANDR)
+
+if test "$with_randr" = yes; then
+
+ # first check for Xrandr.h
+ AC_CHECK_X_HEADER(X11/extensions/Xrandr.h, [have_randr=yes],,
+ [#include <X11/Xlib.h>])
+
+ # if that succeeded, then check for the XRR code in the libraries
+ if test "$have_randr" = yes; then
+
+ # RANDR probably needs -lXrender
+ xrender_libs=
+ AC_CHECK_X_LIB(Xrender, XRenderSetSubpixelOrder,
+ [xrender_libs="-lXrender"], [true], -lXext -lX11)
+
+ # first look for RANDR in -lXext
+ have_randr=no
+ AC_CHECK_X_LIB(Xext, XRRGetScreenInfo,
+ [have_randr=yes; SAVER_LIBS="$SAVER_LIBS $xrender_libs"],
+ [true], $xrender_libs -lXext -lX11)
+
+ # if that failed, look in -lXrandr
+ if test "$have_randr" = no; then
+ AC_CHECK_X_LIB(Xrandr, XRRGetScreenInfo,
+ [have_randr=yes; SAVER_LIBS="$SAVER_LIBS -lXrandr $xrender_libs"],
+ [true], $xrender_libs -lXext -lX11)
+ fi
+ fi
+
+ # if that succeeded, then we've really got it.
+ if test "$have_randr" = yes; then
+ AC_DEFINE(HAVE_RANDR)
+
+ # Now check for version 1.2 in the same libs.
+ # Try to compile, since on MacOS 10.5.7, headers are older than libs!
+ AC_CACHE_CHECK([for XRRGetScreenResources], ac_cv_randr_12,
+ [ac_cv_randr_12=no
+ AC_TRY_X_COMPILE([#include <stdlib.h>
+ #include <X11/Xlib.h>
+ #include <X11/extensions/Xrandr.h>],
+ [XRRScreenResources *res =
+ XRRGetScreenResources (0, 0);],
+ [ac_cv_randr_12=yes],
+ [ac_cv_randr_12=no])])
+ if test "$ac_cv_randr_12" = yes ; then
+ AC_DEFINE(HAVE_RANDR_12)
+ fi
+# AC_CHECK_X_LIB(c, XRRGetOutputInfo, [AC_DEFINE(HAVE_RANDR_12)],
+# [true], $SAVER_LIBS)
+ fi
+
+
+elif test "$with_randr" != no; then
+ echo "error: must be yes or no: --with-randr-ext=$with_randr"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for XF86MiscSetGrabKeysState (but only bother if we are already
+# using other XF86 stuff.)
+#
+###############################################################################
+
+have_xf86miscsetgrabkeysstate=no
+if test "$have_xf86gamma" = yes -o "$have_xf86vmode" = yes; then
+ AC_CHECK_X_LIB(Xxf86misc, XF86MiscSetGrabKeysState,
+ [have_xf86miscsetgrabkeysstate=yes],
+ [true], -lXext -lX11)
+ if test "$have_xf86miscsetgrabkeysstate" = yes ; then
+ SAVER_LIBS="$SAVER_LIBS -lXxf86misc"
+ AC_DEFINE(HAVE_XF86MISCSETGRABKEYSSTATE)
+ fi
+fi
+
+
+###############################################################################
+#
+# Check for HP XHPDisableReset and XHPEnableReset.
+#
+###############################################################################
+
+AC_MSG_CHECKING([for XHPDisableReset in X11/XHPlib.h])
+AC_EGREP_X_HEADER(XHPDisableReset, X11/XHPlib.h,
+ [AC_DEFINE(HAVE_XHPDISABLERESET)
+ SAVER_LIBS="-lXhp11 $SAVER_LIBS"
+ AC_MSG_RESULT(yes)],
+ [AC_MSG_RESULT(no)])
+
+
+###############################################################################
+#
+# Check for /proc/interrupts.
+#
+###############################################################################
+
+have_proc_interrupts=no
+with_proc_interrupts_req=unspecified
+AC_ARG_WITH(proc-interrupts,
+[ --with-proc-interrupts Include support for consulting the /proc/interrupts
+ file to notice keyboard activity.],
+ [with_proc_interrupts="$withval"; with_proc_interrupts_req="$withval"],
+ [with_proc_interrupts=yes])
+
+if test "$with_proc_interrupts" = yes; then
+
+ # Note that we may be building in an environment (e.g. Debian buildd chroot)
+ # without a proper /proc filesystem. If /proc/interrupts exists, then we'll
+ # check that it has the bits we need, but otherwise we'll just go on faith.
+ #
+ have_proc_interrupts=yes
+
+ if test -f /proc/interrupts; then
+ AC_CACHE_CHECK([whether /proc/interrupts contains keyboard data],
+ ac_cv_have_proc_interrupts,
+ [ac_cv_have_proc_interrupts=no
+ if grep 'keyboard\|i8042' /proc/interrupts >/dev/null 2>&1 ; then
+ ac_cv_have_proc_interrupts=yes
+ fi
+ ])
+ have_proc_interrupts=$ac_cv_have_proc_interrupts
+ fi
+
+ if test "$have_proc_interrupts" = yes; then
+ AC_DEFINE(HAVE_PROC_INTERRUPTS)
+ fi
+
+elif test "$with_proc_interrupts" != no; then
+ echo "error: must be yes or no: --with-proc-interrupts=$with_proc_interrupts"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# The --enable-locking option
+#
+###############################################################################
+
+AC_ARG_ENABLE(locking,[Screen locking options:
+ --enable-locking Compile in support for locking the display.
+ --disable-locking Do not allow locking at all.],
+ [enable_locking="$enableval"],
+ [if test "$ac_macosx" = yes; then
+ # We can't lock on MacOS X, so default to not compiling in support for it.
+ # But allow --enable-locking to override that, so I can debug Linux locking
+ # under MacOS X11.
+ enable_locking=no
+ else
+ enable_locking=yes
+ fi])
+if test "$enable_locking" = yes; then
+ true
+elif test "$enable_locking" = no; then
+ AC_DEFINE(NO_LOCKING)
+else
+ echo "error: must be yes or no: --enable-locking=$enable_locking"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Whether to allow root password to unblank.
+#
+###############################################################################
+AC_ARG_ENABLE(root-passwd, [
+ --enable-root-passwd Allow root passwd to unlock screen.
+ --disable-root-passwd Do not allow that.],
+ [enable_root_passwd="$enableval"],[enable_root_passwd=yes])
+if test "$enable_root_passwd" = yes; then
+ AC_DEFINE(ALLOW_ROOT_PASSWD)
+ true
+elif test "$enable_root_passwd" != no; then
+ echo "error: must be yes or no: --enable-root-passwd=$enable_root_passwd"
+ exit 1
+fi
+
+###############################################################################
+#
+# Check for PAM.
+#
+###############################################################################
+
+case "$host" in
+ *-solaris*)
+ # Solaris systems tend to come with PAM misconfigured.
+ # Don't build it by default, even if the headers exist.
+ with_pam_default=no
+ ;;
+ *)
+ # Default to building PAM support on all other systems, if it exists.
+ with_pam_default=yes
+ ;;
+esac
+
+have_pam=no
+with_pam_req=unspecified
+
+AC_ARG_WITH(pam,
+[ --with-pam Include support for PAM (Pluggable Auth Modules.)],
+ [with_pam="$withval"; with_pam_req="$withval"],[with_pam=$with_pam_default])
+
+AC_ARG_WITH([pam_service_name],
+ AC_HELP_STRING([--with-pam-service-name],
+ [NAME arg is the name of the PAM service that
+ xscreensaver will authenticate as.]),
+ [pam_service_name="$withval"],[pam_service_name="xscreensaver"])
+
+AC_ARG_ENABLE(pam-check-account-type,
+ [AC_HELP_STRING([--enable-pam-check-account-type],
+ [Whether PAM should check the result of account
+ modules when authenticating. Only do this if you
+ have account configured properly on your system.])],
+ [enable_pam_check_account_type="$enableval"],[enable_pam_check_account_type=no])
+if test "$enable_pam_check_account_type" = yes ; then
+ AC_DEFINE(PAM_CHECK_ACCOUNT_TYPE)
+ true
+elif test "$enable_pam_check_account_type" != no ; then
+ echo "error: must be yes or no: --enable-pam-check-account-type=$enable_pam_check_account_type"
+ exit 1
+fi
+
+HANDLE_X_PATH_ARG(with_pam, --with-pam, PAM)
+
+if test "$enable_locking" = yes -a "$with_pam" = yes; then
+ AC_CACHE_CHECK([for PAM], ac_cv_pam,
+ [AC_TRY_X_COMPILE([#include <security/pam_appl.h>],,
+ [ac_cv_pam=yes],
+ [ac_cv_pam=no])])
+ if test "$ac_cv_pam" = yes ; then
+ have_pam=yes
+ AC_DEFINE(HAVE_PAM)
+ AC_DEFINE_UNQUOTED(PAM_SERVICE_NAME,"$pam_service_name")
+
+ PASSWD_LIBS="${PASSWD_LIBS} -lpam"
+
+ # libpam typically requires dlopen and dlsym. On FreeBSD,
+ # those are in libc. On Linux and Solaris, they're in libdl.
+ AC_CHECK_LIB(dl, dlopen, [PASSWD_LIBS="${PASSWD_LIBS} -ldl"])
+
+ # On Linux, sigtimedwait() is in libc; on Solaris, it's in librt.
+ have_timedwait=no
+ AC_CHECK_LIB(c, sigtimedwait,
+ [have_timedwait=yes
+ AC_DEFINE(HAVE_SIGTIMEDWAIT)])
+ if test "$have_timedwait" = no ; then
+ AC_CHECK_LIB(rt, sigtimedwait, [have_timedwait=yes
+ AC_DEFINE(HAVE_SIGTIMEDWAIT)
+ PASSWD_LIBS="${PASSWD_LIBS} -lrt"])
+ fi
+
+ AC_MSG_CHECKING(how to call pam_strerror)
+ AC_CACHE_VAL(ac_cv_pam_strerror_args,
+ [AC_TRY_X_COMPILE([#include <stdio.h>
+ #include <stdlib.h>
+ #include <security/pam_appl.h>],
+ [pam_handle_t *pamh = 0;
+ char *s = pam_strerror(pamh, PAM_SUCCESS);],
+ [ac_pam_strerror_args=2],
+ [AC_TRY_X_COMPILE([#include <stdio.h>
+ #include <stdlib.h>
+ #include <security/pam_appl.h>],
+ [char *s =
+ pam_strerror(PAM_SUCCESS);],
+ [ac_pam_strerror_args=1],
+ [ac_pam_strerror_args=0])])
+ ac_cv_pam_strerror_args=$ac_pam_strerror_args])
+ ac_pam_strerror_args=$ac_cv_pam_strerror_args
+ if test "$ac_pam_strerror_args" = 1 ; then
+ AC_MSG_RESULT(one argument)
+ elif test "$ac_pam_strerror_args" = 2 ; then
+ AC_DEFINE(PAM_STRERROR_TWO_ARGS)
+ AC_MSG_RESULT(two arguments)
+ else
+ AC_MSG_RESULT(unknown)
+ fi
+
+# Check pam_fail_delay
+ AC_MSG_CHECKING(pam_fail_delay in -lpam)
+ AC_CACHE_VAL(ac_cv_pam_fail_delay,
+ [ac_save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="-lpam"
+ AC_TRY_LINK([#include <security/pam_appl.h>],
+ [pam_handle_t *pamh = 0;
+ unsigned int usec = 1;
+ int status = pam_fail_delay (pamh, usec);],
+ [ac_pam_fail_delay=yes],
+ [ac_pam_fail_delay=no])
+ ac_cv_pam_fail_delay=$ac_pam_fail_delay,
+ LDFLAGS=$ac_save_LDFLAGS])
+
+ if test "$ac_pam_fail_delay" = yes ; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_PAM_FAIL_DELAY)
+ else
+ AC_MSG_RESULT(no)
+ fi
+
+ fi
+fi
+
+
+###############################################################################
+#
+# Check for Kerberos.
+#
+###############################################################################
+
+have_kerberos=no
+have_kerberos5=no
+with_kerberos_req=unspecified
+
+AC_ARG_WITH(kerberos,
+[ --with-kerberos Include support for Kerberos authentication.],
+ [with_kerberos="$withval"; with_kerberos_req="$withval"],[with_kerberos=yes])
+
+HANDLE_X_PATH_ARG(with_kerberos, --with-kerberos, Kerberos)
+
+if test "$enable_locking" = yes -a "$with_kerberos" = yes; then
+ AC_CACHE_CHECK([for Kerberos 4], ac_cv_kerberos,
+ [AC_TRY_X_COMPILE([#include <krb.h>],,
+ [ac_cv_kerberos=yes],
+ [ac_cv_kerberos=no])])
+ AC_CACHE_CHECK([for Kerberos 5], ac_cv_kerberos5,
+ [AC_TRY_X_COMPILE([#include <kerberosIV/krb.h>],,
+ [ac_cv_kerberos5=yes],
+ [ac_cv_kerberos5=no])])
+
+ if test "$ac_cv_kerberos" = yes ; then
+ have_kerberos=yes
+ AC_DEFINE(HAVE_KERBEROS)
+ fi
+
+ if test "$ac_cv_kerberos5" = yes ; then
+
+ # Andrew Snare <ajs@pigpond.com> wrote:
+ #
+ # You were assuming that if kerberosV (krb5) was found, then kerberosIV
+ # (krb4) was also available. This turns out not to be the case with
+ # mit-krb-1.2.7; apparently backwards-compatibility with KerberosIV
+ # is optional.
+ #
+ # So, disable kerberosV support if libkrb4 can't be found.
+ # This is not the best solution, but it makes the compile not fail.
+ #
+ AC_CHECK_X_LIB(krb4, krb_get_tf_realm,
+ [have_kerberos=yes],
+ [have_kerberos=no])
+ if test "$have_kerberos" = yes ; then
+ have_kerberos5=yes
+ AC_DEFINE(HAVE_KERBEROS)
+ AC_DEFINE(HAVE_KERBEROS5)
+ else
+ have_kerberos5=no
+ AC_MSG_WARN([Cannot find compat lib (libkrb4) needed to use Kerberos 5])
+ fi
+
+ fi
+
+ if test "$have_kerberos5" = yes ; then
+ # from Matt Knopp <mhat@infocalypse.netlag.com>
+ # (who got it from amu@mit.edu)
+
+ PASSWD_LIBS="$PASSWD_LIBS -lkrb4 -ldes425 -lkrb5 -lk5crypto -lcom_err"
+
+ # jwz: MacOS X uses -lkrb5, but not -lcrypt
+ AC_CHECK_X_LIB(crypt, crypt, [PASSWD_LIBS="$PASSWD_LIBS -lcrypt"])
+
+ elif test "$have_kerberos" = yes ; then
+ # from Tim Showalter <tjs@psaux.com> for FreeBSD 4.2
+ PASSWD_LIBS="$PASSWD_LIBS -lkrb -ldes -lcom_err"
+ fi
+
+ if test "$have_kerberos" = yes ; then
+ AC_CHECK_FUNC(res_search,,
+ AC_CHECK_LIB(resolv,res_search,PASSWD_LIBS="${PASSWD_LIBS} -lresolv",
+ AC_MSG_WARN([Can't find DNS resolver libraries needed for Kerberos])
+ ))
+ fi
+fi
+
+
+###############################################################################
+#
+# Check for the nine billion variants of shadow passwords...
+#
+###############################################################################
+
+need_setuid=no
+
+have_shadow=no
+with_shadow_req=unspecified
+
+AC_ARG_WITH(shadow,
+[ --with-shadow Include support for shadow password authentication.],
+ [with_shadow="$withval"; with_shadow_req="$withval"],[with_shadow=yes])
+
+HANDLE_X_PATH_ARG(with_shadow, --with-shadow, shadow password)
+
+if test "$enable_locking" = no ; then
+ with_shadow_req=no
+ with_shadow=no
+fi
+
+
+###############################################################################
+#
+# Check for Sun "adjunct" passwords.
+#
+###############################################################################
+
+if test "$with_shadow" = yes ; then
+ AC_CACHE_CHECK([for Sun-style shadow passwords], ac_cv_sun_adjunct,
+ [AC_TRY_X_COMPILE([#include <stdlib.h>
+ #include <unistd.h>
+ #include <sys/types.h>
+ #include <sys/label.h>
+ #include <sys/audit.h>
+ #include <pwdadj.h>],
+ [struct passwd_adjunct *p = getpwanam("nobody");
+ const char *pw = p->pwa_passwd;],
+ [ac_cv_sun_adjunct=yes],
+ [ac_cv_sun_adjunct=no])])
+ if test "$ac_cv_sun_adjunct" = yes; then
+ have_shadow_adjunct=yes
+ have_shadow=yes
+ need_setuid=yes
+ fi
+fi
+
+
+###############################################################################
+#
+# Check for DEC and SCO so-called "enhanced" security.
+#
+###############################################################################
+
+if test "$with_shadow" = yes ; then
+ AC_CACHE_CHECK([for DEC-style shadow passwords], ac_cv_enhanced_passwd,
+ [AC_TRY_X_COMPILE([#include <stdlib.h>
+ #include <unistd.h>
+ #include <sys/types.h>
+ #include <pwd.h>
+ #include <sys/security.h>
+ #include <prot.h>],
+ [struct pr_passwd *p;
+ const char *pw;
+ set_auth_parameters(0, 0);
+ check_auth_parameters();
+ p = getprpwnam("nobody");
+ pw = p->ufld.fd_encrypt;],
+ [ac_cv_enhanced_passwd=yes],
+ [ac_cv_enhanced_passwd=no])])
+ if test $ac_cv_enhanced_passwd = yes; then
+ have_shadow_enhanced=yes
+ have_shadow=yes
+ need_setuid=yes
+
+ # On SCO, getprpwnam() is in -lprot (which uses nap() from -lx)
+ # (I'm told it needs -lcurses too, but I don't understand why.)
+ # But on DEC, it's in -lsecurity.
+ #
+ AC_CHECK_LIB(prot, getprpwnam,
+ [PASSWD_LIBS="$PASSWD_LIBS -lprot -lcurses -lx"],
+ [AC_CHECK_LIB(security, getprpwnam,
+ [PASSWD_LIBS="$PASSWD_LIBS -lsecurity"])],
+ [-lx])
+ fi
+fi
+
+###############################################################################
+#
+# Check for HP's entry in the "Not Invented Here" Sweepstakes.
+#
+###############################################################################
+
+if test "$with_shadow" = yes ; then
+ AC_CACHE_CHECK([for HP-style shadow passwords], ac_cv_hpux_passwd,
+ [AC_TRY_X_COMPILE([#include <stdlib.h>
+ #include <unistd.h>
+ #include <sys/types.h>
+ #include <pwd.h>
+ #include <hpsecurity.h>
+ #include <prot.h>],
+ [struct s_passwd *p = getspwnam("nobody");
+ const char *pw = p->pw_passwd;],
+ [ac_cv_hpux_passwd=yes],
+ [ac_cv_hpux_passwd=no])])
+ if test "$ac_cv_hpux_passwd" = yes; then
+ have_shadow_hpux=yes
+ have_shadow=yes
+ need_setuid=yes
+
+ # on HPUX, bigcrypt is in -lsec
+ AC_CHECK_LIB(sec, bigcrypt, [PASSWD_LIBS="$PASSWD_LIBS -lsec"])
+ fi
+fi
+
+
+###############################################################################
+#
+# Check for FreeBSD-style shadow passwords.
+#
+# On FreeBSD, getpwnam() and friends work just like on non-shadow-
+# password systems -- except you only get stuff in the pw_passwd field
+# if the running program is setuid. So, guess that we've got this
+# lossage to contend with if /etc/master.passwd exists, and default to
+# a setuid installation.
+#
+###############################################################################
+
+if test "$with_shadow" = yes ; then
+ AC_CACHE_CHECK([for FreeBSD-style shadow passwords], ac_cv_master_passwd,
+ [if test -f /etc/master.passwd ; then
+ ac_cv_master_passwd=yes
+ else
+ ac_cv_master_passwd=no
+ fi])
+ if test "$ac_cv_master_passwd" = yes; then
+ need_setuid=yes
+ fi
+fi
+
+
+###############################################################################
+#
+# Check for traditional (ha!) shadow passwords.
+#
+###############################################################################
+
+if test "$with_shadow" = yes ; then
+ AC_CACHE_CHECK([for generic shadow passwords], ac_cv_shadow,
+ [AC_TRY_X_COMPILE([#include <stdlib.h>
+ #include <unistd.h>
+ #include <sys/types.h>
+ #include <pwd.h>
+ #include <shadow.h>],
+ [struct spwd *p = getspnam("nobody");
+ const char *pw = p->sp_pwdp;],
+ [ac_cv_shadow=yes],
+ [ac_cv_shadow=no])])
+ if test "$ac_cv_shadow" = yes; then
+ have_shadow=yes
+ need_setuid=yes
+
+ # On some systems (UnixWare 2.1), getspnam() is in -lgen instead of -lc.
+ have_getspnam=no
+ AC_CHECK_LIB(c, getspnam, [have_getspnam=yes])
+ if test "$have_getspnam" = no ; then
+ AC_CHECK_LIB(gen, getspnam,
+ [have_getspnam=yes; PASSWD_LIBS="$PASSWD_LIBS -lgen"])
+ fi
+ fi
+fi
+
+
+###############################################################################
+#
+# Check for other libraries needed for non-shadow passwords.
+#
+###############################################################################
+
+if test "$enable_locking" = yes ; then
+
+ # On some systems (UnixWare 2.1), crypt() is in -lcrypt instead of -lc.
+ have_crypt=no
+ AC_CHECK_LIB(c, crypt, [have_crypt=yes])
+ if test "$have_crypt" = no ; then
+ AC_CHECK_LIB(crypt, crypt,
+ [have_crypt=yes; PASSWD_LIBS="$PASSWD_LIBS -lcrypt"])
+ fi
+fi
+
+
+# Most of the above shadow mechanisms will have set need_setuid to yes,
+# if they were found. But, on some systems, we need setuid even when
+# using plain old vanilla passwords.
+#
+if test "$enable_locking" = yes ; then
+ case "$host" in
+ *-hpux* | *-aix* | *-netbsd* | *-freebsd* | *-openbsd* )
+ need_setuid=yes
+ ;;
+ esac
+fi
+
+
+if test "$have_shadow_adjunct" = yes ; then
+ AC_DEFINE(HAVE_ADJUNCT_PASSWD)
+elif test "$have_shadow_enhanced" = yes ; then
+ AC_DEFINE(HAVE_ENHANCED_PASSWD)
+elif test "$have_shadow_hpux" = yes ; then
+ AC_DEFINE(HAVE_HPUX_PASSWD)
+elif test "$have_shadow" = yes ; then
+ AC_DEFINE(HAVE_SHADOW_PASSWD)
+fi
+
+
+###############################################################################
+#
+# Check for external password helper
+# On SuSE, instead of having xscreensaver be a setuid program, they
+# fork an external program that takes the password on stdin, and
+# returns true if that password is a valid one. Then only that
+# smaller program needs to be setuid.
+#
+# (Note that this external program is not a GUI: the GUI is still
+# all in xscreensaver itself; the external program just does auth.)
+#
+###############################################################################
+
+have_passwd_helper=no
+with_passwd_helper_req=unspecified
+
+AC_ARG_WITH(passwd-helper,
+[ --with-passwd-helper Include support for an external password
+ verification helper program.],
+ [with_passwd_helper="$withval"; with_passwd_helper_req="$withval"],[with_passwd_helper=no])
+# no HANDLE_X_PATH_ARG for this one
+
+if test "$enable_locking" = no ; then
+ with_passwd_helper_req=no
+ with_passwd_helper=no
+fi
+
+case "$with_passwd_helper" in
+ ""|no) : ;;
+ /*)
+ AC_DEFINE_UNQUOTED(PASSWD_HELPER_PROGRAM, "$with_passwd_helper")
+ have_passwd_helper=yes;;
+ *)
+ echo "error: --with-passwd-helper needs full pathname of helper (not '$with_passwd_helper')." >&2
+ exit 1
+esac
+
+
+###############################################################################
+#
+# Check for a login manager for a "New Login" button on the lock dialog.
+# Usually this will be "/usr/bin/gdmflexiserver".
+#
+###############################################################################
+
+with_login_manager_req=unspecified
+default_login_manager_1='gdmflexiserver -ls'
+default_login_manager_2='kdmctl reserve'
+default_login_manager_3='lxdm -c USER_SWITCH'
+default_login_manager_4='dm-tool switch-to-greeter'
+
+AC_ARG_WITH(login-manager,
+[ --with-login-manager Put a "New Login" button on the unlock dialog that
+ runs a login manager like gdmflexiserver or kdmctl.],
+ [with_login_manager="$withval"; with_login_manager_req="$withval"],
+ [with_login_manager=yes])
+# no HANDLE_X_PATH_ARG for this one
+
+if test "$enable_locking" = no ; then
+ with_login_manager_req=no
+ with_login_manager=no
+fi
+
+case "$with_login_manager_req" in
+ no)
+ with_login_manager=""
+ ;;
+
+ yes|unspecified)
+ # Try various defaults, use the first one that exists.
+
+ with_login_manager=""
+
+ if test -z "$with_login_manager" ; then
+ set dummy $default_login_manager_1 ; login_manager_tmp=$2
+ unset ac_cv_path_login_manager_tmp # don't cache
+ AC_PATH_PROG(login_manager_tmp, $login_manager_tmp, [])
+ if test ! -z "$login_manager_tmp" ; then
+ with_login_manager="$default_login_manager_1"
+ fi
+ fi
+
+ if test -z "$with_login_manager" ; then
+ set dummy $default_login_manager_2 ; login_manager_tmp=$2
+ unset ac_cv_path_login_manager_tmp # don't cache
+ AC_PATH_PROG(login_manager_tmp, $login_manager_tmp, [])
+ if test ! -z "$login_manager_tmp" ; then
+ with_login_manager="$default_login_manager_2"
+ fi
+ fi
+
+ if test -z "$with_login_manager" ; then
+ set dummy $default_login_manager_3 ; login_manager_tmp=$2
+ unset ac_cv_path_login_manager_tmp # don't cache
+ AC_PATH_PROG(login_manager_tmp, $login_manager_tmp, [])
+ if test ! -z "$login_manager_tmp" ; then
+ with_login_manager="$default_login_manager_3"
+ fi
+ fi
+
+ if test -z "$with_login_manager" ; then
+ set dummy $default_login_manager_4 ; login_manager_tmp=$2
+ unset ac_cv_path_login_manager_tmp # don't cache
+ AC_PATH_PROG(login_manager_tmp, $login_manager_tmp, [])
+ if test ! -z "$login_manager_tmp" ; then
+ with_login_manager="$default_login_manager_4"
+ fi
+ fi
+
+ ;;
+
+ /*)
+ # absolute path specified on cmd line
+ set dummy $with_login_manager_req ; login_manager_tmp=$2
+ AC_MSG_CHECKING([for $login_manager_tmp])
+ if test -x "$login_manager_tmp" ; then
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ with_login_manager=""
+ fi
+ ;;
+
+ *)
+ # relative path specified on cmd line
+ set dummy $with_login_manager_req ; login_manager_tmp=$2
+ unset ac_cv_path_login_manager_tmp # don't cache
+ AC_PATH_PROG(login_manager_tmp, $login_manager_tmp, [])
+ if test -z "$login_manager_tmp" ; then
+ with_login_manager=""
+ else
+ with_login_manager="$login_manager_tmp"
+ fi
+ ;;
+esac
+ac_cv_login_manager_program="$with_login_manager"
+
+NEW_LOGIN_COMMAND_P=''
+NEW_LOGIN_COMMAND="$ac_cv_login_manager_program"
+
+AC_MSG_CHECKING(for login manager)
+if test -z "$NEW_LOGIN_COMMAND" ; then
+ NEW_LOGIN_COMMAND="$default_login_manager_1"
+ NEW_LOGIN_COMMAND_P='! '
+ AC_MSG_RESULT($NEW_LOGIN_COMMAND (disabled))
+else
+ AC_MSG_RESULT($NEW_LOGIN_COMMAND)
+fi
+
+
+###############################################################################
+#
+# Check for -lgtk (and Gnome stuff)
+#
+###############################################################################
+
+have_gtk=no
+with_gtk_req=unspecified
+AC_ARG_WITH(gtk,[
+User interface options:
+
+ --with-gtk Use the Gtk toolkit for the user interface.],
+ [with_gtk="$withval"; with_gtk_req="$withval"],[with_gtk=yes])
+
+# if --with-gtk=/directory/ was specified, remember that directory so that
+# we can also look for the `gtk-config' program in that directory.
+case "$with_gtk" in
+ /*)
+ gtk_dir="$with_gtk"
+ ;;
+ *)
+ gtk_dir=""
+ ;;
+esac
+
+HANDLE_X_PATH_ARG(with_gtk, --with-gtk, Gtk)
+
+if test "$with_gtk" != yes -a "$with_gtk" != no ; then
+ echo "error: must be yes or no: --with-gtk=$with_gtk"
+ exit 1
+fi
+
+
+parse_gtk_version_string() {
+ # M4 sucks!!
+ changequote(X,Y)
+ maj=`echo $ac_gtk_version_string | sed -n 's/\..*//p'`
+ min=`echo $ac_gtk_version_string | sed -n 's/[^.]*\.\([^.]*\).*/\1/p'`
+ changequote([,])
+ ac_gtk_version=`echo "$maj * 1000 + $min" | bc`
+ if test -z "$ac_gtk_version"; then
+ ac_gtk_version=unknown
+ ac_gtk_version_string=unknown
+ fi
+}
+
+# Find pkg-config... (need this for both gtk and gdk_pixbuf.)
+# if the user specified --with-gtk=/foo/ then look there.
+#
+gtk_path="$PATH"
+if test ! -z "$gtk_dir"; then
+ # canonicalize slashes.
+ foo=`echo "${gtk_dir}/bin" | sed 's@//*@/@g'`
+ gtk_path="$foo:$gtk_path"
+fi
+
+AC_PATH_PROGS(pkg_config, pkg-config,, $gtk_path)
+
+if test -z "$pkg_config" ; then
+ AC_MSG_WARN([pkg-config not found!])
+ pkg_config="false"
+fi
+
+
+# Utility function for running pkg-config-based tests...
+#
+pkgs=''
+pkg_check_version() {
+ if test "$ok" = yes ; then
+ req="$1"
+ min="$2"
+ AC_MSG_CHECKING(for $req)
+ if $pkg_config --exists "$req" ; then
+ vers=`$pkg_config --modversion "$req"`
+ if $pkg_config --exists "$req >= $min" ; then
+ AC_MSG_RESULT($vers)
+ pkgs="$pkgs $req"
+ return 1
+ else
+ AC_MSG_RESULT($vers (wanted >= $min))
+ ok=no
+ return 0
+ fi
+ else
+ AC_MSG_RESULT(no)
+ ok=no
+ return 0
+ fi
+ fi
+}
+
+
+jurassic_gtk=no
+gtk_halfassed=no
+have_gtk_2_22_or_higher=no
+COMMENT_DEMO_GLADE2_GTK_2_22_HEAD=""
+COMMENT_DEMO_GLADE2_GTK_2_22_TAIL=""
+
+if test "$with_gtk" = yes; then
+ have_gtk=no
+
+ ok="yes"
+ pkg_check_version gtk+-2.0 2.0.1 ; ac_gtk_version_string="$vers"
+ pkg_check_version gmodule-2.0 2.0.0
+ pkg_check_version libxml-2.0 2.4.6
+ pkg_check_version libglade-2.0 1.99.0
+ pkg_check_version gdk-pixbuf-2.0 2.0.0
+ pkg_check_version gdk-pixbuf-xlib-2.0 2.0.0
+ have_gtk="$ok"
+
+ if test "$have_gtk" = no; then
+ if test -n "$ac_gtk_version_string" ; then
+ gtk_halfassed="$ac_gtk_version_string"
+ gtk_halfassed_lib="$req"
+ fi
+ fi
+
+ if test "$have_gtk" = yes; then
+ parse_gtk_version_string
+ jurassic_gtk=no
+ fi
+
+ if test "$have_gtk" = yes; then
+ AC_CACHE_CHECK([for Gtk includes], ac_cv_gtk_config_cflags,
+ [ac_cv_gtk_config_cflags=`$pkg_config --cflags $pkgs`])
+ AC_CACHE_CHECK([for Gtk libs], ac_cv_gtk_config_libs,
+ [ac_cv_gtk_config_libs=`$pkg_config --libs $pkgs`])
+ fi
+
+ ac_gtk_config_cflags=$ac_cv_gtk_config_cflags
+ ac_gtk_config_libs=$ac_cv_gtk_config_libs
+
+ GTK_EXTRA_OBJS=""
+ GTK_DATADIR=""
+ if test "$have_gtk" = yes; then
+ GTK_DATADIR=`$pkg_config --variable=prefix gtk+-2.0`
+ GTK_DATADIR="$GTK_DATADIR/share"
+ fi
+
+ if test "$have_gtk" = yes; then
+ INCLUDES="$INCLUDES $ac_gtk_config_cflags"
+ GTK_LIBS="$GTK_LIBS $ac_gtk_config_libs"
+ AC_DEFINE(HAVE_GTK)
+ AC_DEFINE(HAVE_GTK2)
+ AC_DEFINE(HAVE_XML)
+ fi
+
+ if test "$have_gtk" = yes; then
+ ok="yes"
+ pkg_check_version gtk+-2.0 2.22
+ have_gtk_2_22_or_higher="$ok"
+ if test "$have_gtk_2_22_or_higher" = yes; then
+ COMMENT_DEMO_GLADE2_GTK_2_22_HEAD="<!-- comment>"
+ COMMENT_DEMO_GLADE2_GTK_2_22_TAIL="</comment -->"
+ fi
+ fi
+fi
+
+
+# Check for the various Gnome help and URL loading programs.
+#
+WITH_BROWSER=gnome-open
+if test "$have_gtk" = yes; then
+ AC_CHECK_PROGS(gnome_open_program, gnome-open)
+ AC_CHECK_PROGS(gnome_url_show_program, gnome-url-show)
+fi
+
+
+###############################################################################
+#
+# Check for -lXm.
+#
+###############################################################################
+
+have_motif=no
+with_motif_req=unspecified
+AC_ARG_WITH(motif,[ --with-motif Use the Motif toolkit for the user interface
+ (no longer supported.)],
+ [with_motif="$withval"; with_motif_req="$withval"],[with_motif=no])
+
+HANDLE_X_PATH_ARG(with_motif, --with-motif, Motif)
+
+if test "$with_motif" != yes -a "$with_motif" != no ; then
+ echo "error: must be yes or no: --with-motif=$with_motif"
+ exit 1
+fi
+
+if test "$with_motif" = yes; then
+ have_motif=no
+ AC_CHECK_X_HEADER(Xm/Xm.h,
+ [have_motif=yes
+ AC_DEFINE(HAVE_MOTIF)
+ MOTIF_LIBS="$MOTIF_LIBS -lXm"],,
+ [#include <stdlib.h>
+ #include <stdio.h>
+ #include <X11/Intrinsic.h>])
+fi
+
+
+if test "$have_motif" = yes; then
+ AC_CHECK_X_HEADER(Xm/ComboBox.h, [AC_DEFINE(HAVE_XMCOMBOBOX)],,
+ [#include <stdlib.h>
+ #include <stdio.h>
+ #include <X11/Intrinsic.h>])
+fi
+
+
+###############################################################################
+#
+# Checking whether Motif is really Lesstif.
+#
+###############################################################################
+
+have_lesstif=no
+if test "$have_motif" = yes ; then
+ AC_CACHE_CHECK([whether Motif is really LessTif],
+ ac_cv_have_lesstif,
+ [AC_TRY_X_COMPILE([#include <Xm/Xm.h>],
+ [long vers = LesstifVersion;],
+ [ac_cv_have_lesstif=yes],
+ [ac_cv_have_lesstif=no])])
+ have_lesstif=$ac_cv_have_lesstif
+fi
+
+
+lesstif_version=unknown
+lesstif_version_string=unknown
+
+if test "$have_lesstif" = yes ; then
+ ltv=unknown
+ echo unknown > conftest-lt
+ AC_CACHE_CHECK([LessTif version number],
+ ac_cv_lesstif_version_string,
+ [AC_TRY_X_RUN([#include <stdio.h>
+ #include <Xm/Xm.h>
+ int main() {
+ FILE *f = fopen("conftest-lt", "w");
+ if (!f) exit(1);
+ fprintf(f, "%d %d.%d\n", LesstifVersion,
+ LESSTIF_VERSION, LESSTIF_REVISION);
+ fclose(f);
+ exit(0);
+ }],
+ [ltv=`cat conftest-lt`
+ ac_cv_lesstif_version=`echo $ltv | sed 's/ .*//'`
+ ac_cv_lesstif_version_string=`echo $ltv | sed 's/.* //'`],
+ [ac_cv_lesstif_version=unknown
+ ac_cv_lesstif_version_string=unknown],
+ [ac_cv_lesstif_version=unknown
+ ac_cv_lesstif_version_string=unknown])])
+ rm -f conftest-lt
+ lesstif_version=$ac_cv_lesstif_version
+ lesstif_version_string=$ac_cv_lesstif_version_string
+
+fi
+
+
+if test "$have_motif" = yes ; then
+ mtv=unknown
+ echo unknown > conftest-mt
+ AC_CACHE_CHECK([Motif version number],
+ ac_cv_motif_version_string,
+ [AC_TRY_X_RUN([#include <stdio.h>
+ #include <Xm/Xm.h>
+ int main() {
+ FILE *f = fopen("conftest-mt", "w");
+ if (!f) exit(1);
+ fprintf(f, "%d %d.%d\n", XmVersion,
+ XmVERSION, XmREVISION);
+ fclose(f);
+ exit(0);
+ }],
+ [mtv=`cat conftest-mt`
+ ac_cv_motif_version=`echo $mtv | sed 's/ .*//'`
+ ac_cv_motif_version_string=`echo $mtv | sed 's/.* //'`],
+ [ac_cv_motif_version=unknown
+ ac_cv_motif_version_string=unknown],
+ [ac_cv_motif_version=unknown
+ ac_cv_motif_version_string=unknown])])
+ rm -f conftest-mt
+ motif_version=$ac_cv_motif_version
+ motif_version_string=$ac_cv_motif_version_string
+
+fi
+
+
+###############################################################################
+#
+# Checking whether Motif requires -lXp.
+#
+# Some versions of Motif (2.1.0, at least) require -lXp, the "X Printing
+# Extension". Why this extension isn't in -lXext with all the others,
+# I have no idea.
+#
+###############################################################################
+
+have_xp_ext=no
+if test "$have_motif" = yes ; then
+ have_xp_ext=no
+ AC_CHECK_X_LIB(Xp, XpQueryExtension,
+ [have_xp_ext=yes; MOTIF_LIBS="$MOTIF_LIBS -lXp"],
+ [true], -lX11 -lXext -lm)
+fi
+
+
+###############################################################################
+#
+# Checking whether Motif requires -lXintl (for _Xsetlocale.)
+#
+###############################################################################
+
+have_xintl=no
+if test "$have_motif" = yes ; then
+ AC_CHECK_X_LIB(Xintl, _Xsetlocale, [have_xintl=yes], [have_xintl=no],
+ -lX11 -lXext -lm)
+ if test "$have_xintl" = yes; then
+ MOTIF_LIBS="$MOTIF_LIBS -lXintl"
+ fi
+fi
+
+
+###############################################################################
+#
+# Check for -lGL or -lMesaGL.
+#
+###############################################################################
+
+have_gl=no
+ac_have_mesa_gl=no
+with_gl_req=unspecified
+gl_halfassed=no
+AC_ARG_WITH(gl,[
+Graphics options:
+
+ --with-gl Build those demos which depend on OpenGL.],
+ [with_gl="$withval"; with_gl_req="$withval"],[with_gl=yes])
+
+HANDLE_X_PATH_ARG(with_gl, --with-gl, GL)
+
+ac_mesagl_version=unknown
+ac_mesagl_version_string=unknown
+
+if test "$with_gl" = yes; then
+ AC_CHECK_X_HEADER(GL/gl.h, have_gl=yes, have_gl=no)
+ if test "$have_gl" = yes ; then
+ AC_CHECK_X_HEADER(GL/glx.h, have_gl=yes, have_gl=no,
+ [#include <GL/gl.h>])
+ fi
+
+ # If we have the headers, try and figure out which vendor it's from.
+ #
+ if test "$have_gl" = yes ; then
+
+ # We need to know whether it's MesaGL so that we know which libraries
+ # to link against.
+ #
+ AC_CACHE_CHECK([whether GL is really MesaGL], ac_cv_have_mesa_gl,
+ [ac_cv_have_mesa_gl=no
+ if test "$ac_macosx" = no; then
+ # WTF! MacOS 10.5.0 ships the Mesa GL headers!
+ # It's not really Mesa, is it?
+ AC_EGREP_X_HEADER(Mesa|MESA, GL/glx.h, [ac_cv_have_mesa_gl=yes])
+ fi])
+ ac_have_mesa_gl=$ac_cv_have_mesa_gl
+
+ gl_lib_1=""
+ GL_LIBS=""
+
+ if test "$ac_macosx" = yes; then
+
+ # Without these, every link against libGL gets a bunch of useless
+ # warnings.
+ #
+ osx_crud="-bind_at_load -multiply_defined suppress"
+ AC_MSG_RESULT(adding "$osx_crud" to GL_LIBS)
+ GL_LIBS="$GL_LIBS $osx_crud"
+ unset osx_crud
+
+ # New lossage in 10.5.0: without this, we get:
+ # ld: cycle in dylib re-exports with /usr/X11/lib/libGL.dylib
+ #
+ osx_crud="/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib"
+ osx_crud="-Wl,-dylib_file,${osx_crud}:${osx_crud}"
+
+ AC_MSG_RESULT(adding "$osx_crud" to GL_LIBS)
+ GL_LIBS="$GL_LIBS $osx_crud"
+ unset osx_crud
+
+ # New lossage in 10.6.8: we can't allow -L/opt/local/lib to be in the
+ # link line, or at runtime XQueryExtension gets a segv due to some kind
+ # of library version skew. Libs must come from /usr/X11/lib even if
+ # $prefix and/or $exec_prefix are set to /opt/local/.
+ #
+ AC_MSG_RESULT(omitting "$libdir" from LDFLAGS)
+ libdir=''
+
+ # Looks like as of OSX 10.12, gcc can't do ObjC.
+ OBJCC="clang -Wall"
+
+ fi
+
+
+ # Some versions of MesaGL are compiled to require -lpthread.
+ # So if the Mesa headers exist, and -lpthread exists, then always
+ # link -lpthread after the Mesa libs (be they named -lGL or -lMesaGL.)
+ #
+ # Oftentimes, AX_PTHREAD will bring in -lpthread as well; but that ends
+ # up before -l(Mesa)GL, instead of after where it would belong.
+ #
+ if test "$ac_have_mesa_gl" = yes; then
+ AC_CHECK_LIB(pthread, pthread_create, [GL_LIBS="-lpthread"], [],)
+ fi
+
+
+ # If we have Mesa headers, check to see if we can link against -lMesaGL.
+ # If we don't have Mesa headers, or we don't have -lMesaGL, try -lGL.
+ # Else, warn that GL is busted. (We have the headers, but no libs.)
+ #
+
+ if test "$ac_have_mesa_gl" = yes ; then
+ AC_CHECK_X_LIB(MesaGL, glXCreateContext,
+ [gl_lib_1="MesaGL"
+ GL_LIBS="-lMesaGL -lMesaGLU $VIDMODE_LIBS $GL_LIBS"],
+ [], -lMesaGLU $GL_LIBS -lX11 -lXext $VIDMODE_LIBS -lm)
+ fi
+
+ if test "$gl_lib_1" = "" ; then
+ AC_CHECK_X_LIB(GL, glXCreateContext,
+ [gl_lib_1="GL"
+ GL_LIBS="-lGL -lGLU $VIDMODE_LIBS $GL_LIBS"],
+ [], -lGLU $GL_LIBS -lX11 -lXext $VIDMODE_LIBS -lm)
+ fi
+
+ if test "$gl_lib_1" = "" ; then
+ # we have headers, but no libs -- bail.
+ have_gl=no
+ ac_have_mesa_gl=no
+ gl_halfassed=yes
+ else
+ # linking works -- we can build the GL hacks.
+ AC_DEFINE(HAVE_GL)
+ if test "$ac_have_mesa_gl" = yes ; then
+ AC_DEFINE(HAVE_MESA_GL)
+ fi
+ fi
+ fi
+
+
+ # Now that we know we have GL headers and libs, do some more GL testing.
+ #
+
+ if test "$have_gl" = yes ; then
+ # If it's MesaGL, we'd like to issue a warning if the version number
+ # is less than or equal to 2.6, because that version had a security bug.
+ #
+ if test "$ac_have_mesa_gl" = yes; then
+
+ AC_CACHE_CHECK([MesaGL version number], ac_cv_mesagl_version_string,
+ [cat > conftest.$ac_ext <<EOF
+#line __oline__ "configure"
+#include "confdefs.h"
+#include <GL/gl.h>
+#ifndef MESA_MAJOR_VERSION
+# include <GL/xmesa.h>
+# ifdef XMESA_MAJOR_VERSION
+ /* Around Mesa 3.2, they took out the Mesa version number, so instead,
+ we have to check the XMesa version number (the number of the X protocol
+ support, which seems to be the same as the Mesa version number.)
+ */
+# define MESA_MAJOR_VERSION XMESA_MAJOR_VERSION
+# define MESA_MINOR_VERSION XMESA_MINOR_VERSION
+# else
+ /* Oh great. Some time after 3.4, they took out the xmesa.h header file,
+ so we have no way of telling what version of Mesa this is at all.
+ So, we'll guess that the osmesa version (the "offscreen protocol")
+ is less than or equal to the real mesa version number. Except that
+ if OSmesa is 3.3, assume at least Mesa 3.4, since OSmesa was 3.3 in
+ Mesa 3.4. And Mesa 3.3 had xmesa.h. What a complete load of shit!
+ */
+# include <GL/osmesa.h>
+# define MESA_MAJOR_VERSION OSMESA_MAJOR_VERSION
+# define MESA_MINOR_VERSION OSMESA_MINOR_VERSION or newer, probably?
+# if OSMESA_MAJOR_VERSION == 3 && OSMESA_MINOR_VERSION == 3
+# undef MESA_MINOR_VERSION
+# define MESA_MINOR_VERSION 4 or newer, probably?
+# endif
+# endif
+#endif
+configure: MESA_MAJOR_VERSION MESA_MINOR_VERSION
+EOF
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ if test \! -z "$includedir" ; then
+ CPPFLAGS="$CPPFLAGS -I$includedir"
+ fi
+ CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+ mglv=`(eval "$ac_cpp conftest.$ac_ext") 2>&AC_FD_CC | grep configure:`
+
+ # M4 sucks!!
+ changequote(X,Y)
+ mglv=`echo "$mglv" | sed -n \
+ 's/^configure: *\([0-9][0-9]*\) *\([0-9].*\)$/\1.\2/p'`
+ changequote([,])
+
+ rm -f conftest.$ac_ext
+
+ CPPFLAGS="$ac_save_CPPFLAGS"
+
+ if test "$mglv" = ""; then
+ ac_mesagl_version=unknown
+ ac_mesagl_version_string=unknown
+ else
+ ac_mesagl_version_string="$mglv"
+ # M4 sucks!!
+ changequote(X,Y)
+ maj=`echo "$mglv" | sed -n 's/^\([0-9][0-9]*\)\..*$/\1/p'`
+ min=`echo "$mglv" | sed -n 's/^.*\.\([0-9][0-9]*\).*$/\1/p'`
+ changequote([,])
+ ac_mesagl_version=`echo "$maj * 1000 + $min" | bc`
+ if test -z "$ac_mesagl_version"; then
+ ac_mesagl_version=unknown
+ ac_mesagl_version_string=unknown
+ fi
+ fi
+ ac_cv_mesagl_version=$ac_mesagl_version
+ ac_cv_mesagl_version_string=$ac_mesagl_version_string
+ ])
+ ac_mesagl_version=$ac_cv_mesagl_version
+ ac_mesagl_version_string=$ac_cv_mesagl_version_string
+ fi
+
+
+ # Check for OpenGL 1.1 features.
+ #
+ AC_CHECK_X_LIB($gl_lib_1, glBindTexture, [AC_DEFINE(HAVE_GLBINDTEXTURE)],
+ [true], $GL_LIBS -lX11 -lXext -lm)
+ fi
+
+elif test "$with_gl" != no; then
+ echo "error: must be yes or no: --with-gl=$with_gl"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for -lgle.
+#
+###############################################################################
+
+have_gle=no
+with_gle_req=unspecified
+gle_halfassed=no
+AC_ARG_WITH(gle,
+[ --with-gle Build those demos which depend on GLE
+ (the OpenGL "extrusion" library.)],
+ [with_gle="$withval"; with_gle_req="$withval"],[with_gle=yes])
+
+HANDLE_X_PATH_ARG(with_gle, --with-gle, GLE)
+
+GLE_LIBS=""
+
+if test "$have_gl" = no ; then
+ true
+elif test "$with_gle" = yes; then
+
+ AC_CHECK_X_HEADER(GL/gle.h, have_gle3=yes, have_gle3=no,
+ [#include <GL/gl.h>])
+ if test "$have_gle3" = yes ; then
+ have_gle=yes;
+ else
+ AC_CHECK_X_HEADER(GL/gutil.h, have_gle=yes, have_gle=no,
+ [#include <GL/gl.h>])
+ if test "$have_gle" = yes ; then
+ AC_CHECK_X_HEADER(GL/tube.h, have_gle=yes, have_gle=no,
+ [#include <GL/gl.h>])
+ fi
+ fi
+
+ if test "$have_gle" = yes ; then
+ have_gle=no
+ gle_halfassed=yes
+ AC_CHECK_X_LIB(gle, gleCreateGC,
+ [have_gle=yes; gle_halfassed=no; GLE_LIBS="-lgle"],
+ [], $GL_LIBS -lX11 -lXext -lm)
+ fi
+ if test "$have_gle" = yes ; then
+ have_gle=no
+ gle_halfassed=yes
+
+ # sometimes the libmatrix stuff is included in libgle. look there first.
+#
+# I don't get it. For some reason, this test passes on SGI, as if
+# uview_direction_d() was in libgle -- but it's not, it's in libmatrix.
+# Yet the link is succeeding. Why???
+#
+# AC_CHECK_X_LIB(gle, uview_direction_d,
+# [have_gle=yes; gle_halfassed=no],
+# [], $GL_LIBS -lX11 -lXext -lm)
+
+ # As of GLE 3 this is in libgle, and has changed name to uview_direction!
+ # *sigh*
+ if test "$have_gle3" = yes ; then
+ AC_CHECK_X_LIB(gle, uview_direction,
+ [have_gle=yes; gle_halfassed=no],
+ [], $GL_LIBS -lX11 -lXext -lm)
+ fi
+ # if it wasn't in libgle, then look in libmatrix.
+ if test "$have_gle" = no ; then
+ AC_CHECK_X_LIB(matrix, uview_direction_d,
+ [have_gle=yes; gle_halfassed=no;
+ GLE_LIBS="$GLE_LIBS -lmatrix"],
+ [], $GL_LIBS -lX11 -lXext -lm)
+ fi
+ fi
+
+ if test "$have_gle" = yes ; then
+ AC_DEFINE(HAVE_GLE)
+ if test "$have_gle3" = yes ; then
+ AC_DEFINE(HAVE_GLE3)
+ fi
+ fi
+
+elif test "$with_gle" != no; then
+ echo "error: must be yes or no: --with-gle=$with_gle"
+ exit 1
+
+fi
+
+
+###############################################################################
+#
+# Handle --with-gles
+#
+###############################################################################
+
+with_gles_req=unspecified
+AC_ARG_WITH(gles,
+[ --with-gles Target OpenGL ES 1.x API instead of OpenGL 1.3.],
+ [with_gles="$withval"; with_gles_req="$withval"],[with_gles=no])
+
+HANDLE_X_PATH_ARG(with_gles, --with-gles, JWZGLES)
+
+if test "$with_gles" = yes; then
+ have_gles=yes
+ AC_DEFINE(HAVE_JWZGLES)
+ JWZGLES_OBJS='$(JWXYZ_BIN)/jwzgles.o'
+ AC_MSG_RESULT(using OpenGL ES compatiblity shim)
+elif test "$with_gles" != no; then
+ echo "error: must be yes or no: --with-gles=$with_gles"
+ exit 1
+fi
+
+###############################################################################
+#
+# Check for -lpng
+#
+###############################################################################
+
+have_png=no
+with_png_req=unspecified
+png_halfassed=no
+AC_ARG_WITH(png,
+[ --with-png Include support for the PNG library.],
+ [with_png="$withval"; with_png_req="$withval"],
+ [with_png=yes])
+
+HANDLE_X_PATH_ARG(with_png, --with-png, PNG)
+
+if test "$with_png" != yes -a "$with_png" != no ; then
+ echo "error: must be yes or no: --with-png=$with_png"
+ exit 1
+fi
+
+if test "$with_png" = yes; then
+
+ have_png=no
+ AC_CHECK_X_HEADER(png.h, [have_png=yes])
+
+ if test "$have_png" = yes; then
+ # we have the header, now check for the library
+ have_png=no
+ png_halfassed=yes
+ AC_CHECK_X_LIB(png, png_create_read_struct,
+ [have_png=yes
+ png_halfassed=no
+ PNG_LIBS="-lpng"
+ AC_DEFINE(HAVE_LIBPNG)])
+ fi
+fi
+
+
+###############################################################################
+#
+# Check for -lgdk_pixbuf.
+# These tests are for gdk_pixbuf usage of the hacks,
+# not xscreensaver-demo (thus we have to test again to get
+# the libraries right: don't want to pull in all of GTK
+# for the hacks.)
+#
+###############################################################################
+
+have_gdk_pixbuf=no
+with_gdk_pixbuf_req=unspecified
+AC_ARG_WITH(pixbuf,
+[ --with-pixbuf Include support for the GDK-Pixbuf library in some
+ demos, which will make it possible for them to read
+ GIF, JPEG, and PNG files as well.],
+ [with_gdk_pixbuf="$withval"; with_gdk_pixbuf_req="$withval"],
+ [with_gdk_pixbuf=yes])
+
+# if --with-pixbuf=/directory/ was specified, remember that directory so that
+# we can also look for the `gdk-pixbuf-config' program in that directory.
+case "$with_gdk_pixbuf" in
+ /*)
+ gdk_pixbuf_dir="$with_gdk_pixbuf"
+ ;;
+ *)
+ gdk_pixbuf_dir=""
+ ;;
+esac
+
+HANDLE_X_PATH_ARG(with_gdk_pixbuf, --with-pixbuf, GDK_PIXBUF)
+
+if test "$with_gdk_pixbuf" != yes -a "$with_gdk_pixbuf" != no ; then
+ echo "error: must be yes or no: --with-pixbuf=$with_gdk_pixbuf"
+ exit 1
+fi
+
+if test "$with_gdk_pixbuf" = yes; then
+ have_gdk_pixbuf=no
+
+ pkgs=''
+ ok="yes"
+
+ pkg_check_version gdk-pixbuf-2.0 2.0.0
+ pkg_check_version gdk-pixbuf-xlib-2.0 2.0.0
+ pkg_check_version gio-2.0 2.0.0
+ have_gdk_pixbuf="$ok"
+
+ if test "$have_gdk_pixbuf" = yes; then
+ AC_CACHE_CHECK([for gdk-pixbuf includes], ac_cv_gdk_pixbuf_config_cflags,
+ [ac_cv_gdk_pixbuf_config_cflags=`$pkg_config --cflags $pkgs`])
+ AC_CACHE_CHECK([for gdk-pixbuf libs], ac_cv_gdk_pixbuf_config_libs,
+ [ac_cv_gdk_pixbuf_config_libs=`$pkg_config --libs $pkgs`])
+ fi
+
+ ac_gdk_pixbuf_config_cflags=$ac_cv_gdk_pixbuf_config_cflags
+ ac_gdk_pixbuf_config_libs=$ac_cv_gdk_pixbuf_config_libs
+
+
+ if test "$have_gdk_pixbuf" = yes; then
+ #
+ # we appear to have pixbuf; check for headers/libs to be sure.
+ #
+ ac_save_gdk_pixbuf_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $ac_gdk_pixbuf_config_cflags"
+
+ have_gdk_pixbuf=no
+
+ # check for header A...
+ AC_CHECK_X_HEADER(gdk-pixbuf/gdk-pixbuf.h, [have_gdk_pixbuf=yes])
+
+ # if that worked, check for header B...
+ if test "$have_gdk_pixbuf" = yes; then
+ have_gdk_pixbuf=no
+ gdk_pixbuf_halfassed=yes
+ AC_CHECK_X_HEADER(gdk-pixbuf/gdk-pixbuf-xlib.h,
+ [have_gdk_pixbuf=yes
+ gdk_pixbuf_halfassed=no])
+
+ # yay, it has a new name in Gtk 2.x...
+ if test "$have_gdk_pixbuf" = no; then
+ have_gdk_pixbuf=no
+ gdk_pixbuf_halfassed=yes
+ AC_CHECK_X_HEADER(gdk-pixbuf-xlib/gdk-pixbuf-xlib.h,
+ [have_gdk_pixbuf=yes
+ gdk_pixbuf_halfassed=no])
+ fi
+ fi
+ CPPFLAGS="$ac_save_gdk_pixbuf_CPPFLAGS"
+ fi
+
+ if test "$have_gdk_pixbuf" = yes; then
+ # we have the headers, now check for the libraries
+ have_gdk_pixbuf=no
+ gdk_pixbuf_halfassed=yes
+
+ AC_MSG_RESULT(checking for gdk_pixbuf usability...)
+
+ # library A...
+ AC_CHECK_X_LIB(c, gdk_pixbuf_new_from_file, [have_gdk_pixbuf=yes],,
+ $ac_gdk_pixbuf_config_libs -lX11 -lXext -lm)
+ # library B...
+ if test "$have_gdk_pixbuf" = yes; then
+ have_gdk_pixbuf=no
+ AC_CHECK_X_LIB(c, gdk_pixbuf_xlib_init,
+ [have_gdk_pixbuf=yes
+ gdk_pixbuf_halfassed=no],,
+ $ac_gdk_pixbuf_config_libs -lX11 -lXext -lm)
+ fi
+ fi
+
+ if test "$have_gdk_pixbuf" = yes; then
+ INCLUDES="$INCLUDES $ac_gdk_pixbuf_config_cflags"
+ PNG_LIBS="$ac_gdk_pixbuf_config_libs"
+ AC_DEFINE(HAVE_GDK_PIXBUF)
+ else
+ AC_MSG_RESULT(checking for gdk_pixbuf usability... no)
+ fi
+
+ if test "$have_gdk_pixbuf" = yes; then
+ AC_CHECK_X_LIB(c, gdk_pixbuf_apply_embedded_orientation,
+ [AC_DEFINE(HAVE_GDK_PIXBUF_APPLY_EMBEDDED_ORIENTATION)],,
+ $ac_gdk_pixbuf_config_libs -lX11 -lXext -lm)
+ fi
+fi
+
+
+###############################################################################
+#
+# Check for -ljpeg
+#
+###############################################################################
+
+have_jpeg=no
+with_jpeg_req=unspecified
+jpeg_halfassed=no
+AC_ARG_WITH(jpeg,
+[ --with-jpeg Include support for the JPEG library.],
+ [with_jpeg="$withval"; with_jpeg_req="$withval"],
+ [with_jpeg=yes])
+
+HANDLE_X_PATH_ARG(with_jpeg, --with-jpeg, JPEG)
+
+if test "$with_jpeg" != yes -a "$with_jpeg" != no ; then
+ echo "error: must be yes or no: --with-jpeg=$with_jpeg"
+ exit 1
+fi
+
+if test "$with_jpeg" = yes; then
+
+ have_jpeg=no
+ AC_CHECK_X_HEADER(jpeglib.h, [have_jpeg=yes])
+
+ if test "$have_jpeg" = yes; then
+ # we have the header, now check for the library
+ have_jpeg=no
+ jpeg_halfassed=yes
+ AC_CHECK_X_LIB(jpeg, jpeg_start_compress,
+ [have_jpeg=yes
+ jpeg_halfassed=no
+ JPEG_LIBS="-ljpeg"
+ AC_DEFINE(HAVE_JPEGLIB)])
+ fi
+fi
+
+
+###############################################################################
+#
+# Check for -lXft
+#
+###############################################################################
+
+have_xutf8drawstring=no
+AC_CHECK_X_LIB(X11, Xutf8DrawString,
+ [have_xutf8drawstring=yes],
+ [true], -lX11 -lXext -lm)
+if test "$have_xutf8drawstring" = yes ; then
+ AC_DEFINE(HAVE_XUTF8DRAWSTRING)
+fi
+
+
+have_xft=no
+with_xft_req=unspecified
+xft_halfassed=no
+AC_ARG_WITH(xft,
+[ --with-xft Include support for the X Freetype library.],
+ [with_xft="$withval"; with_xft_req="$withval"],
+ [with_xft=yes])
+
+HANDLE_X_PATH_ARG(with_xft, --with-xft, Xft)
+
+if test "$with_xft" != yes -a "$with_xft" != no ; then
+ echo "error: must be yes or no: --with-xft=$with_xft"
+ exit 1
+fi
+
+if test "$with_xft" = yes; then
+
+ pkgs=''
+ ok="yes"
+ pkg_check_version xft 2.1.0
+ have_xft="$ok"
+
+ if test "$have_xft" = yes; then
+ AC_CACHE_CHECK([for Xft includes], ac_cv_xft_config_cflags,
+ [ac_cv_xft_config_cflags=`$pkg_config --cflags $pkgs`])
+ AC_CACHE_CHECK([for Xft libs], ac_cv_xft_config_libs,
+ [ac_cv_xft_config_libs=`$pkg_config --libs $pkgs`])
+ fi
+
+ ac_xft_config_cflags=$ac_cv_xft_config_cflags
+ ac_xft_config_libs=$ac_cv_xft_config_libs
+
+ if test "$have_xft" = yes; then
+ #
+ # we appear to have Xft; check for headers/libs to be sure.
+ #
+ ac_save_xft_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $ac_xft_config_cflags"
+
+ have_xft=no
+ AC_CHECK_X_HEADER(X11/Xft/Xft.h, [have_xft=yes])
+
+ CPPFLAGS="$ac_save_xft_CPPFLAGS"
+ fi
+
+ if test "$have_xft" = yes; then
+ # we have the headers, now check for the libraries
+ have_xft=no
+ xft_halfassed=yes
+
+ AC_MSG_RESULT(checking for Xft usability...)
+ AC_CHECK_X_LIB(c, XftDrawStringUtf8, [have_xft=yes],,
+ $ac_xft_config_libs -lX11 -lXext -lm)
+ fi
+
+ if test "$have_xft" = no; then
+ AC_MSG_RESULT(checking for Xft usability... no)
+ fi
+fi
+
+if test "$have_xft" = yes; then
+ INCLUDES="$INCLUDES $ac_xft_config_cflags"
+ XFT_LIBS="$ac_xft_config_libs"
+ XFT_SRCS=''
+ XFT_OBJS=''
+ AC_DEFINE(HAVE_XFT)
+else
+ XFT_LIBS=''
+ XFT_SRCS='$(UTILS_SRC)/xft.c'
+ XFT_OBJS='$(UTILS_BIN)/xft.o'
+fi
+
+
+###############################################################################
+#
+# Check for pty support: this allows 'phosphor' and 'apple2'
+# to run curses-based programs, or be used as terminal windows.
+#
+###############################################################################
+
+PTY_LIBS=
+AC_CHECK_HEADERS(pty.h util.h sys/termios.h)
+AC_CHECK_X_LIB(util, forkpty,
+ [PTY_LIBS="-lutil"
+ ac_have_forkpty=yes
+ AC_DEFINE(HAVE_FORKPTY)])
+
+if test "$ac_have_forkpty" != yes ; then
+ # we don't need (or have) -lutil on MacOS 10.4.2...
+ AC_CHECK_X_LIB(c, forkpty,
+ [PTY_LIBS=""
+ AC_DEFINE(HAVE_FORKPTY)])
+fi
+
+###############################################################################
+#
+# Check for the XSHM server extension.
+#
+###############################################################################
+
+have_xshm=no
+with_xshm_req=unspecified
+AC_ARG_WITH(xshm-ext,
+[ --with-xshm-ext Include support for the Shared Memory extension.],
+ [with_xshm="$withval"; with_xshm_req="$withval"],[with_xshm=yes])
+
+HANDLE_X_PATH_ARG(with_xshm, --with-xshm-ext, XSHM)
+
+if test "$with_xshm" = yes; then
+
+ # first check for Xshm.h.
+ AC_CHECK_X_HEADER(X11/extensions/XShm.h, [have_xshm=yes],,
+ [#include <X11/Xlib.h>])
+
+ # if that succeeded, then check for sys/ipc.h.
+ if test "$have_xshm" = yes; then
+ have_xshm=no
+ AC_CHECK_X_HEADER(sys/ipc.h, [have_xshm=yes])
+ fi
+
+ # if that succeeded, then check for sys/shm.h.
+ if test "$have_xshm" = yes; then
+ have_xshm=no
+ AC_CHECK_X_HEADER(sys/shm.h, [have_xshm=yes])
+ fi
+
+ # AIX is pathological, as usual: apparently it's normal for the Xshm headers
+ # to exist, but the library code to not exist. And even better, the library
+ # code is in its own library: libXextSam.a. So, if we're on AIX, and that
+ # lib doesn't exist, give up. (This lib gets added to X_EXTRA_LIBS, and
+ # that's not quite right, but close enough.)
+ #
+ case "$host" in
+ *-aix*)
+ if [ `uname -v` -eq 3 ]; then
+ have_xshm=no
+ AC_CHECK_X_LIB(XextSam, XShmQueryExtension,
+ [have_xshm=yes; X_EXTRA_LIBS="$X_EXTRA_LIBS -lXextSam"],
+ [true], -lX11 -lXext -lm)
+ fi
+ ;;
+ esac
+
+ # if that succeeded, then we've really got it.
+ if test "$have_xshm" = yes; then
+ AC_DEFINE(HAVE_XSHM_EXTENSION)
+ fi
+
+elif test "$with_xshm" != no; then
+ echo "error: must be yes or no: --with-xshm-ext=$with_xshm"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for the DOUBLE-BUFFER server extension.
+#
+###############################################################################
+
+have_xdbe=no
+with_xdbe_req=unspecified
+AC_ARG_WITH(xdbe-ext,
+[ --with-xdbe-ext Include support for the DOUBLE-BUFFER extension.],
+ [with_xdbe="$withval"; with_xdbe_req="$withval"],[with_xdbe=yes])
+
+HANDLE_X_PATH_ARG(with_xdbe, --with-xdbe-ext, DOUBLE-BUFFER)
+
+if test "$with_xdbe" = yes; then
+
+ AC_CHECK_X_HEADER(X11/extensions/Xdbe.h, [have_xdbe=yes],,
+ [#include <X11/Xlib.h>])
+ if test "$have_xdbe" = yes; then
+ AC_DEFINE(HAVE_DOUBLE_BUFFER_EXTENSION)
+ fi
+
+elif test "$with_xdbe" != no; then
+ echo "error: must be yes or no: --with-xdbe-ext=$with_xshm"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for the SGI XReadDisplay server extension.
+#
+# Note: this has to be down here, rather than up with the other server
+# extension tests, so that the output of `configure --help' is in the
+# right order. Arrgh!
+#
+###############################################################################
+
+have_readdisplay=no
+with_readdisplay_req=unspecified
+AC_ARG_WITH(readdisplay,
+[ --with-readdisplay Include support for the XReadDisplay extension.],
+ [with_readdisplay="$withval"; with_readdisplay_req="$withval"],
+ [with_readdisplay=yes])
+
+HANDLE_X_PATH_ARG(with_readdisplay, --with-readdisplay, XReadDisplay)
+
+if test "$with_readdisplay" = yes; then
+ AC_CHECK_X_HEADER(X11/extensions/readdisplay.h,
+ AC_DEFINE(HAVE_READ_DISPLAY_EXTENSION),,
+ [#include <X11/Xlib.h>])
+elif test "$with_readdisplay" != no; then
+ echo "error: must be yes or no: --with-readdisplay=$with_readdisplay"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for a directory full of images to use as the default value
+# of the "imageDirectory" preference.
+#
+###############################################################################
+
+have_imagedir=no
+with_imagedir_req=unspecified
+
+AC_ARG_WITH(image-directory,
+[ --with-image-directory Arg is the default directory from which some demos
+ will choose random images to display.],
+ [with_imagedir="$withval"; with_imagedir_req="$withval"],
+ [with_imagedir=yes])
+# no HANDLE_X_PATH_ARG for this one
+
+case "$with_imagedir" in
+ /*)
+ # absolute path
+ AC_MSG_CHECKING([for image directory $with_imagedir])
+ if test -d "$with_imagedir" ; then
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ with_imagedir=""
+ fi
+ ;;
+ yes)
+ with_imagedir=""
+
+ #### Could use some more defaults here...
+ for dd in \
+ "/usr/share/backgrounds/images/" \
+ "/usr/share/wallpapers/" \
+ "/Library/Desktop Pictures/" \
+ ; do
+ if test -z "$with_imagedir"; then
+ AC_MSG_CHECKING([for image directory $dd])
+ if test -d "$dd" ; then
+ AC_MSG_RESULT(yes)
+ with_imagedir="$dd"
+ else
+ AC_MSG_RESULT(no)
+ fi
+ fi
+ done
+
+ ;;
+ no)
+ with_imagedir=""
+ ;;
+
+ *)
+ echo "error: must be an absolute path: --with-image-directory=$with_imagedir_req"
+ exit 1
+ ;;
+esac
+ac_cv_imagedir="$with_imagedir"
+
+DEFAULT_IMAGES_P='True'
+DEFAULT_IMAGE_DIRECTORY="$ac_cv_imagedir"
+
+if test -z "$DEFAULT_IMAGE_DIRECTORY" ; then
+ DEFAULT_IMAGES_P='False'
+fi
+
+
+###############################################################################
+#
+# Pick a text file to use as the default of the "textFile" preference.
+# Any old file will do, but preferably one that will make interesting
+# shapes when displayed by "starwars" and "fontglide".
+#
+###############################################################################
+
+have_textfile=no
+with_textfile_req=unspecified
+
+AC_ARG_WITH(text-file,
+[ --with-text-file=FILE By default, some demos may display this file.],
+ [with_textfile="$withval"; with_textfile_req="$withval"],
+ [with_textfile=yes])
+# no HANDLE_X_PATH_ARG for this one
+
+case "$with_textfile" in
+ /*)
+ # absolute path
+ AC_MSG_CHECKING([for text file $with_textfile])
+ if test -f "$with_textfile" ; then
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ with_textfile=""
+ fi
+ ;;
+ yes)
+ with_textfile=""
+
+ #### Could use some more defaults here...
+ for f in \
+ "/usr/X11R6/lib/X11/doc/README" \
+ "/usr/share/doc/xserver-common/copyright" \
+ "/usr/share/doc/xserver-xorg-core/copyright" \
+ "/usr/X11R6/README" \
+ "/usr/share/doc/libX11*/COPYING" \
+ "/usr/X11/share/X11/doc/README*" \
+ "/usr/share/doc/debian/debian-manifesto" \
+ ; do
+ if test -z "$with_textfile"; then
+ AC_MSG_CHECKING([for text file $f])
+ f=`/bin/ls $f 2>&- | head -1`
+ if test -f "$f" ; then
+ AC_MSG_RESULT(yes)
+ with_textfile="$f"
+ else
+ AC_MSG_RESULT(no)
+ fi
+ fi
+ done
+
+ ;;
+ no)
+ with_textfile=""
+ ;;
+
+ *)
+ echo "error: must be an absolute path: --with-text-file=$with_textfile_req"
+ exit 1
+ ;;
+esac
+ac_cv_textfile="$with_textfile"
+
+DEFAULT_TEXT_FILE="$ac_cv_textfile"
+
+
+###############################################################################
+#
+# Check the browser to see help URL
+#
+###############################################################################
+
+have_browser=no
+with_browser_req=unspecified
+
+AC_ARG_WITH(browser,
+[ --with-browser=BROWSER Specify the web browser used to show the help URL.],
+ [with_browser="$withval"; with_browser_req="$withval"],
+ [with_browser=no ])
+# no HANDLE_X_PATH_ARG for this one
+
+case "$with_browser" in
+ no )
+ ;;
+ * )
+ WITH_BROWSER=$with_browser
+ gnome_open_program=$with_browser
+ AC_MSG_CHECKING([for browser $with_browser])
+ with_browser_fullpath=`which $with_browser 2>/dev/null`
+ case $with_browser_fullpath in
+ /* )
+ AC_MSG_RESULT(yes)
+ have_browser=yes
+ ;;
+ * )
+ AC_MSG_RESULT(no)
+# Only warning: we don't want to install all packages for the
+# dependency of the browser in building stage...
+ echo "WARNING: browser not found: --with-browser=$with_browser"
+ ;;
+ esac
+ ;;
+esac
+ac_cv_browser="$with_browser"
+
+###############################################################################
+#
+# Check whether it's ok to install some hacks as setuid (e.g., "sonar")
+# This should be safe, but let's give people the option.
+#
+###############################################################################
+
+setuid_hacks_default=no
+setuid_hacks="$setuid_hacks_default"
+AC_ARG_WITH(setuid-hacks,
+[ --with-setuid-hacks Allow some demos to be installed `setuid root'
+ (which is needed in order to ping other hosts.)
+],
+ [setuid_hacks="$withval"], [setuid_hacks="$setuid_hacks_default"])
+
+HANDLE_X_PATH_ARG(setuid_hacks, --with-setuid-hacks, setuid hacks)
+
+if test "$setuid_hacks" = yes; then
+ true
+elif test "$setuid_hacks" != no; then
+ echo "error: must be yes or no: --with-setuid-hacks=$setuid_hacks"
+ exit 1
+fi
+
+
+###############################################################################
+#
+# Check for --with-record-animation
+#
+###############################################################################
+
+record_anim_default=no
+record_anim="$record_anim_default"
+AC_ARG_WITH(record-animation,
+[ --with-record-animation Include code for generating MP4 videos.
+],
+ [record_anim="$withval"], [record_anim="$record_anim_default"])
+
+HANDLE_X_PATH_ARG(record_anim, --with-record-animation, record animation)
+
+if test "$record_anim" = yes; then
+ true
+elif test "$record_anim" != no; then
+ echo "error: must be yes or no: --with-record-animation=$record_anim"
+ exit 1
+fi
+
+if test "$record_anim" = yes; then
+ if test "$have_gdk_pixbuf" != yes; then
+ AC_MSG_ERROR(--with-record-animation requires GDK-Pixbuf)
+ else
+ AC_MSG_RESULT(enabling --with-record-animation)
+ AC_DEFINE(HAVE_RECORD_ANIM)
+ ANIM_OBJS='$(ANIM_OBJS)'
+ ANIM_LIBS='$(ANIM_LIBS)'
+ fi
+fi
+
+###############################################################################
+#
+# Done testing. Now, set up the various -I and -L variables,
+# and decide which GUI program to build by default.
+#
+###############################################################################
+
+DEPEND=makedepend
+DEPEND_FLAGS=
+DEPEND_DEFINES=
+
+
+if test \! -z "$includedir" ; then
+ INCLUDES="$INCLUDES -I$includedir"
+fi
+
+if test \! -z "$libdir" ; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+fi
+
+
+PREFERRED_DEMO_PROGRAM=''
+ALL_DEMO_PROGRAMS=
+if test "$have_motif" = yes; then
+ PREFERRED_DEMO_PROGRAM=xscreensaver-demo-Xm
+ ALL_DEMO_PROGRAMS="$PREFERRED_DEMO_PROGRAM $ALL_DEMO_PROGRAMS"
+fi
+if test "$have_gtk" = yes; then
+ PREFERRED_DEMO_PROGRAM=xscreensaver-demo-Gtk
+ ALL_DEMO_PROGRAMS="$PREFERRED_DEMO_PROGRAM $ALL_DEMO_PROGRAMS"
+fi
+
+
+if test "$have_kerberos" = yes; then
+ PASSWD_SRCS="$PASSWD_SRCS \$(KERBEROS_SRCS)"
+ PASSWD_OBJS="$PASSWD_OBJS \$(KERBEROS_OBJS)"
+fi
+if test "$have_pam" = yes; then
+ PASSWD_SRCS="$PASSWD_SRCS \$(PAM_SRCS)"
+ PASSWD_OBJS="$PASSWD_OBJS \$(PAM_OBJS)"
+ INSTALL_PAM="install-pam"
+fi
+if test "$enable_pam_check_account_type" = yes; then
+ COMMENT_PAM_CHECK_ACCOUNT=""
+else
+ COMMENT_PAM_CHECK_ACCOUNT="#"
+fi
+if test "$have_passwd_helper" = yes; then
+ PASSWD_SRCS="$PASSWD_SRCS \$(PWHELPER_SRCS)"
+ PASSWD_OBJS="$PASSWD_OBJS \$(PWHELPER_OBJS)"
+fi
+ PASSWD_SRCS="$PASSWD_SRCS \$(PWENT_SRCS)"
+ PASSWD_OBJS="$PASSWD_OBJS \$(PWENT_OBJS)"
+
+
+if test "$enable_locking" = yes; then
+ LOCK_SRCS='$(LOCK_SRCS_1) $(PASSWD_SRCS)'
+ LOCK_OBJS='$(LOCK_OBJS_1) $(PASSWD_OBJS)'
+else
+ LOCK_SRCS='$(NOLOCK_SRCS_1)'
+ LOCK_OBJS='$(NOLOCK_OBJS_1)'
+fi
+
+if test "$ac_macosx" = yes; then
+ EXES_OSX='$(EXES_OSX)'
+ SCRIPTS_OSX='$(SCRIPTS_OSX)'
+ MEN_OSX='$(MEN_OSX)'
+else
+ EXES_OSX=
+ SCRIPTS_OSX=
+ MEN_OSX=
+fi
+
+
+INSTALL_SETUID='$(INSTALL_PROGRAM) $(SUID_FLAGS)'
+
+if test "$need_setuid" = yes; then
+ NEED_SETUID=yes
+else
+ NEED_SETUID=no
+fi
+
+if test "$setuid_hacks" = yes; then
+ SETUID_HACKS=yes
+else
+ SETUID_HACKS=no
+fi
+
+tab=' '
+if test "$have_gl" = yes; then
+ GL_EXES='$(GL_EXES)'
+ SUID_EXES='$(SUID_EXES)'
+ RETIRED_GL_EXES='$(RETIRED_GL_EXES)'
+ GL_UTIL_EXES='$(GL_UTIL_EXES)'
+ GL_MEN='$(GL_MEN)'
+ GL_KLUDGE=" "
+else
+ GL_KLUDGE="-"
+fi
+
+if test "$have_gle" = yes; then
+ GLE_EXES='$(GLE_EXES)'
+ GLE_KLUDGE=" "
+else
+ GLE_KLUDGE="-"
+fi
+
+if test "$have_jpeg" = yes -a "$have_gdk_pixbuf" = yes; then
+ JPEG_EXES='$(JPEG_EXES)'
+fi
+
+
+# Another substitution in the XScreenSaver.ad.in file:
+#
+if test "$gnome_open_program" != ''; then
+ GNOME24=''
+ GNOME22='! '
+ NOGNOME='! '
+elif test "$gnome_url_show_program" != ''; then
+ GNOME24='! '
+ GNOME22=''
+ NOGNOME='! '
+else
+ GNOME24='! '
+ GNOME22='! '
+ NOGNOME=''
+fi
+
+
+# Set PO_DATADIR to something sensible.
+#
+AC_MSG_CHECKING([for locale directory])
+if test -n "$GTK_DATADIR" ; then
+ PO_DATADIR="$GTK_DATADIR"
+elif test "$have_gtk" = yes; then
+ PO_DATADIR=`$pkg_config --variable=prefix gtk+-2.0`
+ PO_DATADIR="$PO_DATADIR/share"
+fi
+
+if test -z "$PO_DATADIR" ; then
+ #
+ # #### Total fucking kludge --
+ # Map /build/prefix/usr/X11R6/share/ to /build/prefix/usr/share/
+ # but of course we need to expand all the nested variables to do that...
+ #
+ dd=`eval eval eval eval eval eval eval eval eval eval eval echo $datadir`
+ PO_DATADIR=`echo $dd | sed 's@/X11R6/@/@'`
+fi
+
+AC_MSG_RESULT($PO_DATADIR/locale)
+
+
+# canonicalize slashes.
+HACK_CONF_DIR=`echo "${HACK_CONF_DIR}" | sed 's@/$@@;s@//*@/@g'`
+
+# gcc 3.0 likes to issue this warning for every file:
+#
+# cc1: warning: changing search order for system directory "/usr/local/include"
+# cc1: warning: as it has already been specified as a non-system directory
+#
+# Yay. We can only avoid that by deleting "-I${prefix}/include" from the list.
+# Which *should* be totally redundant, and thus an ok thing to delete?
+#
+INCLUDES=`echo "$INCLUDES" | sed 's@ -I${prefix}/include@@g;'`
+
+
+###############################################################################
+#
+# Perform substitutions and write Makefiles.
+#
+###############################################################################
+
+AC_SUBST(INCLUDES)
+
+AC_SUBST(PREFERRED_DEMO_PROGRAM)
+AC_SUBST(ALL_DEMO_PROGRAMS)
+AC_SUBST(SAVER_LIBS)
+AC_SUBST(MOTIF_LIBS)
+AC_SUBST(GTK_LIBS)
+AC_SUBST(XML_LIBS)
+AC_SUBST(PNG_LIBS)
+AC_SUBST(JPEG_LIBS)
+AC_SUBST(HACK_LIBS)
+AC_SUBST(PTY_LIBS)
+AC_SUBST(GL_LIBS)
+AC_SUBST(GLE_LIBS)
+AC_SUBST(XDPMS_LIBS)
+AC_SUBST(XINERAMA_LIBS)
+AC_SUBST(PASSWD_LIBS)
+AC_SUBST(INSTALL_SETUID)
+AC_SUBST(SETUID_HACKS)
+AC_SUBST(INSTALL_DIRS)
+AC_SUBST(NEED_SETUID)
+AC_SUBST(INSTALL_PAM)
+AC_SUBST(HAVE_PAM_FAIL_DELAY)
+AC_SUBST(COMMENT_PAM_CHECK_ACCOUNT)
+AC_SUBST(NEW_LOGIN_COMMAND)
+AC_SUBST(NEW_LOGIN_COMMAND_P)
+AC_SUBST(DEFAULT_IMAGES_P)
+AC_SUBST(DEFAULT_IMAGE_DIRECTORY)
+AC_SUBST(DEFAULT_TEXT_FILE)
+AC_SUBST(WITH_BROWSER)
+AC_SUBST(COMMENT_DEMO_GLADE2_GTK_2_22_HEAD)
+AC_SUBST(COMMENT_DEMO_GLADE2_GTK_2_22_TAIL)
+
+
+AC_SUBST(OBJCC)
+AC_SUBST(EXES_OSX)
+AC_SUBST(SCRIPTS_OSX)
+AC_SUBST(MEN_OSX)
+
+AC_SUBST(PASSWD_SRCS)
+AC_SUBST(PASSWD_OBJS)
+AC_SUBST(XMU_SRCS)
+AC_SUBST(XMU_OBJS)
+AC_SUBST(XMU_LIBS)
+AC_SUBST(XFT_SRCS)
+AC_SUBST(XFT_OBJS)
+AC_SUBST(XFT_LIBS)
+AC_SUBST(SAVER_GL_SRCS)
+AC_SUBST(SAVER_GL_OBJS)
+AC_SUBST(SAVER_GL_LIBS)
+AC_SUBST(LOCK_SRCS)
+AC_SUBST(LOCK_OBJS)
+AC_SUBST(JPEG_EXES)
+AC_SUBST(GL_EXES)
+AC_SUBST(RETIRED_GL_EXES)
+AC_SUBST(SUID_EXES)
+AC_SUBST(GL_UTIL_EXES)
+AC_SUBST(GL_MEN)
+AC_SUBST(GL_KLUDGE)
+AC_SUBST(GLE_EXES)
+AC_SUBST(GLE_KLUDGE)
+AC_SUBST(JWZGLES_OBJS)
+AC_SUBST(GNOME24)
+AC_SUBST(GNOME22)
+AC_SUBST(NOGNOME)
+AC_SUBST(HACKDIR)
+AC_SUBST(HACKDIR_FULL)
+AC_SUBST(GTK_DATADIR)
+AC_SUBST(PO_DATADIR)
+AC_SUBST(HACK_CONF_DIR)
+AC_SUBST(GTK_EXTRA_OBJS)
+AC_SUBST(ANIM_OBJS)
+AC_SUBST(ANIM_LIBS)
+
+APPDEFAULTS=$ac_x_app_defaults
+AC_SUBST(APPDEFAULTS)
+
+AC_SUBST(DEPEND)
+AC_SUBST(DEPEND_FLAGS)
+AC_SUBST(DEPEND_DEFINES)
+AC_SUBST(PERL)
+
+AC_OUTPUT(Makefile
+ utils/Makefile
+ jwxyz/Makefile
+ hacks/Makefile
+ hacks/images/Makefile
+ hacks/glx/Makefile
+ po/Makefile.in
+ driver/Makefile
+ driver/xscreensaver.pam
+ driver/xscreensaver-demo.glade2
+ driver/XScreenSaver.ad)
+
+###############################################################################
+#
+# Print some warnings at the end.
+#
+###############################################################################
+
+warn_prefix_1=" Warning:"
+warn_prefix_2=" Note:"
+warn_prefix="$warn_prefix_1"
+
+warning=no
+warnsep=' #################################################################'
+
+warnpre() {
+ if test "$warning" = no ; then
+ echo '' ; echo "$warnsep" ; echo ''
+ warning=yes
+ fi
+}
+
+warn() {
+ warnpre
+ if test "$warning" = long ; then echo '' ; fi
+ warning=yes
+ rest="$@"
+ echo "$warn_prefix $rest"
+}
+
+warnL() {
+ was=$warning
+ warnpre
+ warning=yes
+ if test "$was" != no ; then echo '' ; fi
+ rest="$@"
+ echo "$warn_prefix $rest"
+}
+
+warn2() {
+ rest="$@"
+ echo " $rest"
+ warning=long
+}
+
+note() {
+ warn_prefix="$warn_prefix_2"
+ warn $@
+ warn_prefix="$warn_prefix_1"
+}
+
+noteL() {
+ warn_prefix="$warn_prefix_2"
+ warnL $@
+ warn_prefix="$warn_prefix_1"
+}
+
+
+# ac_prog_cc_no_pthread normally only happens on AIX, because according
+# to AX_PTHREAD, AIX needs CC=xlc_r or CC=cc_r to do threads.
+# If CC is specified, it takes precedence over --with-pthread.
+if test "$ac_prog_cc_no_pthread" ; then
+ warnL "You requested $ac_original_cc for the C compiler, but it doesn't"
+ warn2 "support POSIX threads."
+ echo ""
+ warn2 "If you have multiple CPU cores, try CC=$PTHREAD_CC."
+elif test "$with_pthread_req" = yes -a "$have_pthread" = no ; then
+ warn 'POSIX threads were requested, but were not found.'
+fi
+
+if test "$with_sgi_req" = yes -a "$have_sgi" = no ; then
+ warn 'The SGI saver extension was requested, but was not found.'
+fi
+
+if test "$with_xidle_req" = yes -a "$have_xidle" = no ; then
+ warn 'The XIdle extension was requested, but was not found.'
+fi
+
+if test "$with_xshm_req" = yes -a "$have_xshm" = no ; then
+ warn 'The XSHM extension was requested, but was not found.'
+fi
+
+if test "$with_xdbe_req" = yes -a "$have_xdbe" = no ; then
+ warn 'The DOUBLE-BUFFER extension was requested, but was not found.'
+fi
+
+if test "$with_sgivc_req" = yes -a "$have_sgivc" = no ; then
+ warn 'The SGI-VIDEO-CONTROL extension was requested, but was not found.'
+fi
+
+if test "$with_dpms_req" = yes -a "$have_dpms" = no ; then
+ warn 'The DPMS extension was requested, but was not found.'
+fi
+
+if test "$with_xinerama_req" = yes -a "$have_xinerama" = no ; then
+ warn 'The Xinerama extension was requested, but was not found.'
+fi
+
+if test "$with_xf86vmode_req" = yes -a "$have_xf86vmode" = no ; then
+ warn 'The XF86VMODE extension was requested, but was not found.'
+fi
+
+if test "$with_randr_req" = yes -a "$have_randr" = no ; then
+ warn 'The RANDR extension was requested, but was not found.'
+fi
+
+if test "$with_proc_interrupts_req" = yes -a "$have_proc_interrupts" = no; then
+ warn "Checking of /proc/interrupts was requested, but it's bogus."
+fi
+
+if test "$pkg_config" = false ; then
+ warnL 'The "pkg-config" program was not found. Without that,'
+ warn2 "detection of the various GTK libraries won't work."
+else
+ pkgerr=`$pkg_config --list-all 2>&1 >/dev/null`
+ if test "x$pkgerr" != "x" ; then
+ warnL 'The "pkg-config" program produces errors. This often causes'
+ warn2 "detection of the various GTK libraries to malfunction."
+ warn2 "The errors are:"
+ echo ''
+ echo "$pkgerr" | sed 's/^/ > /g'
+ fi
+fi
+
+if test "$gtk_halfassed" != no ; then
+ warnL "GTK version $gtk_halfassed was found, but at least one supporting"
+ warn2 "library ($gtk_halfassed_lib) was not, so GTK can't be used."
+ warn2 "Perhaps some of the development packages are not installed?"
+ if test "$have_gtk" = yes ; then
+ v="$ac_gtk_version_string"
+ warn2 "GTK $v is also installed, so it will be used instead."
+ warn2 "Please read the above output and the \`config.log' file"
+ warn2 "for more details."
+ fi
+fi
+
+motif_warn2() {
+ warn2 'Though the Motif front-end to xscreensaver is still'
+ warn2 'maintained, it is no longer being updated with new'
+ warn2 'features: all new development on the xscreensaver-demo'
+ warn2 'program is happening in the GTK version, and not in the'
+ warn2 'Motif version. It is recommended that you build against'
+ warn2 'GTK instead of Motif. See <http://www.gtk.org/>.'
+}
+
+if test "$have_motif" = no -a "$have_gtk" = no; then
+
+ if test "$with_motif" = yes; then
+ warnL "Neither the GTK nor Motif libraries were found; the"
+ warn2 "\`xscreensaver-demo' program requires one of these."
+ echo ''
+ motif_warn2
+ else
+ warnL "The GTK libraries do not seem to be available; the"
+ warn2 "\`xscreensaver-demo' program requires them."
+# echo ''
+# warn2 'You can use Motif or Lesstif instead of GTK (use the'
+# warn2 "\`--with-motif' option) but that is NOT recommended."
+# motif_warn2
+ fi
+
+elif test "$with_motif_req" = yes -a "$have_motif" = no ; then
+ warnL "Use of Motif was requested, but it wasn't found;"
+ warn2 "Gtk will be used instead."
+
+elif test "$jurassic_gtk" = yes ; then
+
+ pref_gtk=2.0
+
+ v="$ac_gtk_version_string"
+ if test "$with_gtk_req" = yes -a "$ac_gtk_version" = "unknown" ; then
+ warnL "Use of Gtk was requested, but its version number is unknown;"
+ elif test "$with_gtk_req" = yes ; then
+ warnL "Use of Gtk was requested, but it is version $v;"
+ else
+ warnL "Gtk was found on this system, but it is version $v;"
+ fi
+
+ warn2 "Gtk $pref_gtk or newer is required."
+
+elif test "$with_gtk_req" = yes -a "$have_gtk" = no ; then
+ warnL "Use of Gtk was requested, but it wasn't found."
+fi
+
+
+if test "$have_gtk" = yes -a "$have_gdk_pixbuf" = no ; then
+ warn "GTK is being used, but the GDK-Pixbuf library and/or"
+ warn2 "headers were not found. That can't be good. Please"
+ warn2 "install the GDK-Pixbuf development kit and re-configure."
+fi
+
+if test "$have_motif" = yes -a "$have_lesstif" = yes ; then
+
+ preferred_lesstif=0.92
+
+ if test "$lesstif_version" = unknown; then
+ warnL "Unable to determine the LessTif version number!"
+ warn2 "Make sure you are using version $preferred_lesstif or newer."
+ warn2 "See <http://www.lesstif.org/>."
+
+ elif test \! $lesstif_version -gt 82; then
+ warnL "LessTif version $lesstif_version_string is being used."
+ warn2 "LessTif versions 0.82 and earlier are too buggy to"
+ warn2 "use with XScreenSaver; it is strongly recommended"
+ warn2 "that you upgrade to at least version $preferred_lesstif!"
+ warn2 "See <http://www.lesstif.org/>."
+ fi
+fi
+
+
+if test "$have_motif" = yes -a "$have_gtk" = no ; then
+ warn 'Motif is being used, and GTK is not.'
+ echo ''
+ motif_warn2
+fi
+
+
+if test "$with_gdk_pixbuf_req" = yes -a "$have_gdk_pixbuf" = no; then
+ warnL 'Use of GDK-Pixbuf was requested, but it was not found.'
+fi
+
+if test "$have_gdk_pixbuf" = no -o "$gdk_pixbuf_halfassed" = yes || \
+ test "$have_gdk_pixbuf" = no ; then
+
+ if test "$with_gdk_pixbuf_req" = yes ; then
+ true
+ elif test "$with_gdk_pixbuf_req" = no ; then
+ warnL 'The GDK-Pixbuf library is not being used.'
+ else
+ warnL 'The GDK-Pixbuf library was not found.'
+ fi
+
+ if test "$gdk_pixbuf_halfassed" = yes ; then
+ echo ''
+ warn2 'More specifically, we found the headers, but not the'
+ warn2 'libraries; so either GDK-Pixbuf is half-installed on this'
+ warn2 "system, or something else went wrong. The \`config.log'"
+ warn2 'file might contain some clues.'
+ fi
+
+ if test "$have_png" = yes ; then
+ echo ''
+ warn2 'The PNG library is being used instead.'
+ fi
+
+ echo ''
+ warn2 'Some of the demos will not use images as much as they could.'
+ warn2 'You should consider installing GDK-Pixbuf and re-running'
+ warn2 'configure.'
+fi
+
+
+if test "$have_jpeg" = no ; then
+ if test "$with_jpeg_req" = yes ; then
+ warnL 'Use of libjpeg was requested, but it was not found.'
+ elif test "$with_jpeg_req" = no ; then
+ noteL 'The JPEG library is not being used.'
+ else
+ noteL 'The JPEG library was not found.'
+ fi
+
+ if test "$jpeg_halfassed" = yes ; then
+ echo ''
+ warn2 'More specifically, we found the headers, but not the'
+ warn2 'library; so either JPEG is half-installed on this'
+ warn2 "system, or something else went wrong. The \`config.log'"
+ warn2 'file might contain some clues.'
+ echo ''
+ fi
+
+ if test "$have_gdk_pixbuf" = no ; then
+ warn2 "This means that it won't be possible for the image-manipulating"
+ warn2 "display modes to load files from disk; and it also means that"
+ warn2 "the \`webcollage' program will be much slower."
+ else
+ warn2 "This means the \`webcollage' program will be much slower."
+ fi
+fi
+
+
+if test "$have_png" = no ; then
+ if test "$with_png_req" = yes ; then
+ warnL 'Use of libpng was requested, but it was not found.'
+ elif test "$with_png_req" = no ; then
+ noteL 'The PNG library is not being used.'
+ else
+ noteL 'The PNG library was not found.'
+ fi
+
+ if test "$png_halfassed" = yes ; then
+ echo ''
+ warn2 'More specifically, we found the headers, but not the'
+ warn2 'library; so either PNG is half-installed on this'
+ warn2 "system, or something else went wrong. The \`config.log'"
+ warn2 'file might contain some clues.'
+ echo ''
+ fi
+
+ warn2 "Many things aren't going to work right."
+fi
+
+
+if test "$have_xft" = no ; then
+ if test "$with_xft_req" = yes ; then
+ warnL "Use of libXft was requested, but it was not found."
+ elif test "$with_xft_req" = no ; then
+ noteL 'The Xft library is not being used.'
+ else
+ noteL "The Xft library was not found."
+ fi
+
+ if test "$xft_halfassed" = yes ; then
+ echo ''
+ warn2 'More specifically, we found the headers, but not the'
+ warn2 'libraries; so either Xft is half-installed on this'
+ warn2 "system, or something else went wrong. The \`config.log'"
+ warn2 'file might contain some clues.'
+ echo ''
+ fi
+
+ warn2 "This means that fonts won't be anti-aliased."
+fi
+
+
+if test "$have_gl" = yes -a "$ac_have_mesa_gl" = yes ; then
+ preferred_mesagl=3.4
+ mgv="$ac_mesagl_version_string"
+ pgl="$preferred_mesagl"
+
+ if test "$ac_mesagl_version" = unknown; then
+ true
+ # warnL "Unable to determine the MesaGL version number!"
+ # warn2 "Make sure you are using version $preferred_mesagl or newer."
+
+ elif test \! "$ac_mesagl_version" -gt 2006; then
+ warnL "MesaGL version number is $mgv --"
+ warn2 "MesaGL 2.6 and earlier have a security bug. It is strongly"
+ warn2 "recommended that you upgrade to at least version $preferred_mesagl."
+
+ elif test \! "$ac_mesagl_version" -gt 3003; then
+ warnL "MesaGL version number is $mgv --"
+ warn2 "MesaGL 3.3 and earlier have some bugs; it is recommended"
+ warn2 "that you upgrade to $pgl or newer."
+ fi
+fi
+
+if test "$have_gl" = no ; then
+ if test "$with_gl_req" = yes ; then
+ warnL 'Use of GL was requested, but it was not found.'
+ elif test "$with_gl_req" = no ; then
+ noteL 'The OpenGL 3D library is not being used.'
+ else
+ noteL 'The OpenGL 3D library was not found.'
+ fi
+
+ if test "$gl_halfassed" = yes ; then
+ echo ''
+ warn2 'More specifically, we found the headers, but not the'
+ warn2 'libraries; so either GL is half-installed on this'
+ warn2 "system, or something else went wrong. The \`config.log'"
+ warn2 'file might contain some clues.'
+ fi
+
+ echo ''
+ warn2 'Those demos which use 3D will not be built or installed.'
+ warn2 'You might want to consider installing OpenGL and'
+ warn2 're-running configure.'
+
+fi
+
+
+if test "$have_gl" = yes -a "$have_gle" = no ; then
+
+ # nobody cares about this; don't print the warning unless it was
+ # requested and not found, or halfway-found.
+ if test "$with_gle_req" = yes -o "$gle_halfassed" = yes ; then
+
+ if test "$with_gle_req" = yes ; then
+ noteL 'Use of the GLE (GL Extrusion) library was requested, but'
+ warn2 'it was not found (though the OpenGL library was found, and'
+ warn2 'is being used.)'
+ elif test "$with_gle_req" = no ; then
+ noteL 'The OpenGL Library is being used, but the GLE (GL Extrusion)'
+ warn2 'library is not.'
+ else
+ noteL 'The OpenGL Library was found, but the GLE (GL Extrusion)'
+ warn2 'library was not.'
+ fi
+
+ if test "$gle_halfassed" = yes ; then
+ echo ''
+ warn2 'More specifically, we found the headers, but not the'
+ warn2 'libraries; so either GLE is half-installed on this'
+ warn2 "system, or something else went wrong. The \`config.log'"
+ warn2 'file might contain some clues.'
+ fi
+
+ echo ''
+ warn2 'Some of the OpenGL (3D) demos (those that depend on GLE)'
+ warn2 'will not be built or installed. You might want to consider'
+ warn2 'installing GLE and re-running configure. You can find the'
+ warn2 'GLE library at <http://www.linas.org/gle/>'
+
+ fi
+fi
+
+
+if test "$with_readdisplay_req" = yes -a "$have_readdisplay" = no ; then
+ warn 'Use of XReadDisplay was requested, but it was not found.'
+fi
+
+if test "$with_kerberos_req" = yes -a "$have_kerberos" = no ; then
+ warn 'Use of Kerberos was requested, but it was not found.'
+fi
+
+if test "$with_pam_req" = yes -a "$have_pam" = no ; then
+ warn 'Use of PAM was requested, but it was not found.'
+fi
+
+if test "$with_shadow_req" = yes -a "$have_shadow" = no ; then
+ warn 'Use of shadow passwords was requested, but they were not found.'
+fi
+
+if test "$ac_macosx" = yes ; then
+ if test "$enable_locking" = yes ; then
+ warn "You have specified --enable-locking on MacOS X."
+ warn2 "THIS DOES NOT WORK! Don't do this!"
+ fi
+fi
+
+
+# You are in a twisty maze of namespaces and syntaxes, all alike.
+# Fuck the skull of Unix.
+#
+bindir=`eval eval eval eval eval eval eval echo $bindir`
+HACKDIR=`eval eval eval eval eval eval eval echo $HACKDIR`
+HACK_CONF_DIR=`eval eval eval eval eval eval eval echo $HACK_CONF_DIR`
+
+# canonicalize slashes.
+bindir=`echo "${bindir}" | sed 's@/$@@;s@//*@/@g'`
+HACKDIR=`echo "${HACKDIR}" | sed 's@/$@@;s@//*@/@g'`
+HACK_CONF_DIR=`echo "${HACK_CONF_DIR}" | sed 's@/$@@;s@//*@/@g'`
+
+
+# Sanity check the hackdir
+for bad_choice in xscreensaver xscreensaver-demo xscreensaver-command ; do
+ if test "${HACKDIR}" = "${bindir}/${bad_choice}" ; then
+ echo ""
+ AC_MSG_ERROR([\"--with-hackdir=${bindir}/${bad_choice}\" won't work.
+ There will be an executable installed with that name, so
+ that can't be the name of a directory as well. Please
+ re-configure with a different directory name.])
+ fi
+done
+
+
+do_dir_warning=no
+
+# Now let's warn if there's a previous RPM version already installed.
+# But don't bother with this test if we are currently *building* an RPM.
+
+if test -z "$RPM_PACKAGE_VERSION" ; then
+
+ rpmnames="xscreensaver xscreensaver-base xscreensaver-extras"
+
+ # M4 sucks!!
+ changequote(X,Y)
+ rpmv=`(rpm -qv $rpmnames) 2>/dev/null | \
+ sed -n 's/^[-a-z]*-\([0-9][0-9]*[.][0-9][0-9a-z]*\)-.*$/\1/p' | \
+ head -1`
+ changequote([,])
+
+ if test \! -z "$rpmv" ; then
+ rpmbdir=`rpm -ql $rpmnames | sed -n 's@^\(.*\)/xscreensaver-demo$@\1@p'`
+ rpmhdir=`rpm -ql $rpmnames | sed -n 's@^\(.*\)/popsquares$@\1@p'`
+
+ warning=no
+ warnL "There is already an installed RPM of xscreensaver $rpmv"
+ warn2 'on this system. You might want to remove it ("rpm -ve")'
+ warn2 'before running "make install" in this directory.'
+ echo ""
+ warn2 "Alternately, you could build this version of xscreensaver"
+ warn2 'as an RPM, and then install that. An "xscreensaver.spec"'
+ warn2 'file is included. Try "rpmbuild -v -ba xscreensaver.spec".'
+ warn2 "See the RPM documentation for more info."
+ echo ""
+
+ if test "$rpmbdir" = "$rpmhdir" ; then
+ warn2 "The RPM version was installed in $rpmbdir/."
+ do_dir_warning=yes
+ else
+ warn2 "The RPM version was installed in $rpmbdir/,"
+ warn2 "with demos in $rpmhdir/."
+ fi
+ fi
+fi
+
+# Also warn if there's a Debian package installed.
+#
+debnames="xscreensaver xscreensaver-data xscreensaver-data-extra"
+debv=''
+for dpkg in $debnames ; do
+ if test -z "$debv"; then
+ debv=`dpkg -s $dpkg 2>/dev/null | sed -n 's/^Version: \(.*\)$/\1/p'`
+ fi
+done
+
+if test \! -z "$debv" ; then
+ debbdir=`dpkg -L $debnames 2>/dev/null | \
+ sed -n 's@^\(.*/bin/\)xscreensaver$@\1@p'`
+ debhdir=`dpkg -L $debnames 2>/dev/null | \
+ sed -n 's@^\(.*/\)popsquares$@\1@p'`
+ if test -z "$debbdir" ; then debbdir='???'; fi
+ if test -z "$debhdir" ; then debhdir='???'; fi
+
+ warning=no
+ warnL "There is already an installed dpkg of xscreensaver"
+ warn2 "version \"$debv\" on this system."
+ echo ""
+ warn2 "The dpkg was installed in $debbdir,"
+ warn2 "with demos in $debhdir."
+fi
+
+
+if test "${bindir}" = "${HACKDIR}" ; then
+ do_dir_warning=yes
+fi
+
+if test "$do_dir_warning" = yes; then
+ echo ""
+ echo "$warnsep"
+ echo ""
+ echo ' When you run "make install", the "xscreensaver",'
+ echo ' "xscreensaver-demo", and "xscreensaver-command" executables'
+ echo " will be installed in ${bindir}/."
+ echo ""
+ echo " The various graphics demos (200+ different executables) will"
+ echo " be installed in ${HACKDIR}/."
+ echo ""
+ echo " If you would prefer the demos to be installed elsewhere,"
+ echo " you should re-run configure with the --with-hackdir=DIR"
+ echo " option. For more information, run \`./configure --help'."
+ warning=yes
+fi
+
+if test "$warning" != no; then
+ echo '' ; echo "$warnsep" ; echo ''
+fi
+
+if test "$do_dir_warning" = no; then
+ if test "$warning" = no; then
+ echo ''
+ fi
+ echo "User programs will be installed in ${bindir}/"
+ echo "Screen savers will be installed in ${HACKDIR}/"
+ echo "Configuration dialogs will be installed in ${HACK_CONF_DIR}/"
+ echo "System-wide default settings will be installed in ${APPDEFAULTS}/"
+ echo ''
+fi
diff --git a/driver/.gdbinit b/driver/.gdbinit
new file mode 100644
index 0000000..a585259
--- /dev/null
+++ b/driver/.gdbinit
@@ -0,0 +1,27 @@
+# If you're debugging xscreensaver and you are running a virtual root window
+# manager, you'd better let the process handle these signals: it remaps the
+# virtual root window when they arrive. If you don't do this, your window
+# manager will be hosed.
+#
+# Also, gdb copes badly with breakpoints in functions that are called on the
+# other side of a fork(). The Trace/BPT traps cause the spawned process to
+# die.
+#
+#handle 1 pass nostop
+#handle 3 pass nostop
+#handle 4 pass nostop
+#handle 6 pass nostop
+#handle 7 pass nostop
+#handle 8 pass nostop
+#handle 9 pass nostop
+#handle 10 pass nostop
+#handle 11 pass nostop
+#handle 12 pass nostop
+#handle 13 pass nostop
+#handle 15 pass nostop
+#handle 19 pass nostop
+set env MallocGuardEdges 1
+set env MallocPreScribble 1
+set env MallocScribble 1
+b exit
+set args -debug
diff --git a/driver/Makefile.in b/driver/Makefile.in
new file mode 100644
index 0000000..55effec
--- /dev/null
+++ b/driver/Makefile.in
@@ -0,0 +1,1023 @@
+# driver/Makefile.in --- xscreensaver, Copyright (c) 1997-2010 Jamie Zawinski.
+# the `../configure' script generates `driver/Makefile' from this file.
+
+@SET_MAKE@
+.SUFFIXES:
+.SUFFIXES: .c .m .o
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+top_srcdir = @top_srcdir@
+top_builddir = ..
+
+install_prefix =
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+datarootdir = @datarootdir@
+datadir = @datadir@
+localedir = @PO_DATADIR@/locale
+mandir = @mandir@
+libexecdir = @libexecdir@
+mansuffix = 1
+manNdir = $(mandir)/man$(mansuffix)
+
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+
+GTK_DATADIR = @GTK_DATADIR@
+GTK_APPDIR = $(GTK_DATADIR)/applications
+GTK_ICONDIR = $(GTK_DATADIR)/pixmaps
+GTK_GLADEDIR = $(GTK_DATADIR)/xscreensaver/glade
+HACK_CONF_DIR = @HACK_CONF_DIR@
+
+CC = @CC@
+OBJCC = @OBJCC@
+CFLAGS = @CFLAGS@
+LDFLAGS = @LDFLAGS@
+DEFS = @DEFS@
+INTL_DEFS = -DLOCALEDIR=\"$(localedir)\"
+SUBP_DEFS = $(DEFS) -DDEFAULT_PATH_PREFIX='"@HACKDIR@"'
+GTK_DEFS = $(DEFS) -DDEFAULT_ICONDIR='"$(GTK_GLADEDIR)"'
+CONF_DEFS = -DHACK_CONFIGURATION_PATH='"$(HACK_CONF_DIR)"'
+
+LIBS = @LIBS@
+INTL_LIBS = @INTLLIBS@
+JPEG_LIBS = @JPEG_LIBS@
+PERL = @PERL@
+
+DEPEND = @DEPEND@
+DEPEND_FLAGS = @DEPEND_FLAGS@
+DEPEND_DEFINES = @DEPEND_DEFINES@
+
+SHELL = /bin/sh
+INSTALL = @INSTALL@
+SUID_FLAGS = -o root -m 4755
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_SETUID = @INSTALL_SETUID@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_DIRS = @INSTALL_DIRS@
+
+X_CFLAGS = @X_CFLAGS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+XMU_LIBS = @XMU_LIBS@
+PNG_LIBS = @PNG_LIBS@
+
+# Note:
+#
+# X_LIBS would more properly be called X_LDFLAGS (it contains the -L args.)
+# X_PRE_LIBS contains extra libraries you have to link against on some systems,
+# and that must come before -lX11. (e.g., -lSM and -lICE.)
+# X_EXTRA_LIBS contains extra libraries needed by X that aren't a part of X.
+# (e.g., -lsocket, -lnsl, etc.)
+#
+# I think (but am not totally sure) that LIBS is also really "LDFLAGS".
+#
+# SAVER_LIBS is the link line for "xscreensaver", and
+# CMD_LIBS is the link line for "xscreensaver-command".
+# GETIMG_LIBS is the link line for "xscreensaver-getimage".
+
+
+AD_DIR = @APPDEFAULTS@
+PAM_DIR = /etc/pam.d
+PAM_CONF = /etc/pam.conf
+
+UTILS_SRC = $(srcdir)/../utils
+UTILS_BIN = ../utils
+
+INCLUDES_1 = -I. -I$(srcdir) -I$(UTILS_SRC) -I..
+INCLUDES = $(INCLUDES_1) @INCLUDES@
+
+MOTIF_SRCS = demo-Xm.c demo-Xm-widgets.c
+MOTIF_OBJS = demo-Xm.o demo-Xm-widgets.o
+
+GTK_SRCS = demo-Gtk.c demo-Gtk-conf.c
+GTK_OBJS = demo-Gtk.o demo-Gtk-conf.o @GTK_EXTRA_OBJS@
+
+PWENT_SRCS = passwd-pwent.c
+PWENT_OBJS = passwd-pwent.o
+
+KERBEROS_SRCS = passwd-kerberos.c
+KERBEROS_OBJS = passwd-kerberos.o
+
+PAM_SRCS = passwd-pam.c
+PAM_OBJS = passwd-pam.o
+
+PWHELPER_SRCS = passwd-helper.c
+PWHELPER_OBJS = passwd-helper.o
+
+LOCK_SRCS_1 = lock.c passwd.c
+LOCK_OBJS_1 = lock.o passwd.o
+NOLOCK_SRCS_1 = lock.c
+NOLOCK_OBJS_1 = lock.o
+
+TEST_SRCS = test-passwd.c test-uid.c test-xdpms.c test-grab.c \
+ test-apm.c test-fade.c test-xinerama.c test-vp.c \
+ test-randr.c xdpyinfo.c test-mlstring.c test-screens.c
+TEST_EXES = test-passwd test-uid test-xdpms test-grab \
+ test-apm test-fade test-xinerama test-vp \
+ test-randr xdpyinfo test-mlstring test-screens
+
+MOTIF_LIBS = @MOTIF_LIBS@ @PNG_LIBS@ $(XMU_LIBS)
+GTK_LIBS = @GTK_LIBS@ $(XMU_LIBS)
+XML_LIBS = @XML_LIBS@
+
+XDPMS_LIBS = @XDPMS_LIBS@
+XINERAMA_LIBS = @XINERAMA_LIBS@
+XINPUT_LIBS = @XINPUT_LIBS@
+
+PASSWD_SRCS = @PASSWD_SRCS@
+PASSWD_OBJS = @PASSWD_OBJS@
+PASSWD_LIBS = @PASSWD_LIBS@
+
+LOCK_SRCS = @LOCK_SRCS@
+LOCK_OBJS = @LOCK_OBJS@
+
+XMU_SRCS = @XMU_SRCS@
+XMU_OBJS = @XMU_OBJS@
+
+GL_SRCS = @SAVER_GL_SRCS@
+GL_OBJS = @SAVER_GL_OBJS@
+GL_LIBS = @SAVER_GL_LIBS@
+
+ICON_SRC = $(UTILS_SRC)/images
+LOGO = $(ICON_SRC)/logo-50.xpm
+GTK_ICONS = $(ICON_SRC)/screensaver-*.png
+
+DEMO_UTIL_SRCS = $(UTILS_SRC)/resources.c $(UTILS_SRC)/usleep.c \
+ $(UTILS_SRC)/visual.c $(XMU_SRCS)
+DEMO_UTIL_OBJS = $(UTILS_BIN)/resources.o $(UTILS_BIN)/usleep.o \
+ $(UTILS_BIN)/visual.o $(XMU_OBJS)
+
+SAVER_UTIL_SRCS = $(UTILS_SRC)/fade.c $(UTILS_SRC)/overlay.c \
+ $(UTILS_SRC)/logo.c $(UTILS_SRC)/yarandom.c \
+ $(UTILS_SRC)/minixpm.c $(UTILS_SRC)/font-retry.c \
+ $(DEMO_UTIL_SRCS)
+SAVER_UTIL_OBJS = $(UTILS_BIN)/fade.o $(UTILS_BIN)/overlay.o \
+ $(UTILS_BIN)/logo.o $(UTILS_BIN)/yarandom.o \
+ $(UTILS_BIN)/minixpm.o $(UTILS_BIN)/font-retry.o \
+ $(DEMO_UTIL_OBJS)
+
+GETIMG_SRCS_1 = xscreensaver-getimage.c
+GETIMG_OBJS_1 = xscreensaver-getimage.o
+
+GETIMG_SRCS = $(GETIMG_SRCS_1) \
+ $(UTILS_BIN)/colorbars.o $(UTILS_BIN)/resources.o \
+ $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/visual.o \
+ $(UTILS_BIN)/usleep.o $(UTILS_BIN)/hsv.o \
+ $(UTILS_BIN)/colors.o $(UTILS_BIN)/grabscreen.o \
+ $(UTILS_BIN)/logo.o $(UTILS_BIN)/minixpm.o prefs.o \
+ $(XMU_SRCS)
+
+GETIMG_OBJS = $(GETIMG_OBJS_1) \
+ $(UTILS_BIN)/colorbars.o $(UTILS_BIN)/resources.o \
+ $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/visual.o \
+ $(UTILS_BIN)/usleep.o $(UTILS_BIN)/hsv.o \
+ $(UTILS_BIN)/colors.o $(UTILS_BIN)/grabscreen.o \
+ $(UTILS_BIN)/logo.o $(UTILS_BIN)/minixpm.o prefs.o \
+ $(XMU_OBJS)
+
+SAVER_SRCS_1 = xscreensaver.c windows.c screens.c timers.c subprocs.c \
+ exec.c xset.c splash.c setuid.c stderr.c mlstring.c
+SAVER_OBJS_1 = xscreensaver.o windows.o screens.o timers.o subprocs.o \
+ exec.o xset.o splash.o setuid.o stderr.o mlstring.o
+
+SAVER_SRCS = $(SAVER_SRCS_1) prefs.c dpms.c $(LOCK_SRCS) \
+ $(SAVER_UTIL_SRCS) $(GL_SRCS)
+SAVER_OBJS = $(SAVER_OBJS_1) prefs.o dpms.o $(LOCK_OBJS) \
+ $(SAVER_UTIL_OBJS) $(GL_OBJS)
+
+CMD_SRCS = remote.c xscreensaver-command.c
+CMD_OBJS = remote.o xscreensaver-command.o
+
+DEMO_SRCS_1 = prefs.c dpms.c
+DEMO_OBJS_1 = prefs.o dpms.o
+
+DEMO_SRCS = $(DEMO_SRCS_1) remote.c exec.c $(DEMO_UTIL_SRCS)
+DEMO_OBJS = $(DEMO_OBJS_1) remote.o exec.o $(DEMO_UTIL_OBJS)
+
+PDF2JPEG_SRCS = pdf2jpeg.m
+PDF2JPEG_OBJS = pdf2jpeg.o
+PDF2JPEG_LIBS = -framework Cocoa
+
+SAVER_LIBS = $(LIBS) $(X_LIBS) $(XMU_LIBS) @SAVER_LIBS@ \
+ $(XDPMS_LIBS) $(XINERAMA_LIBS) $(GL_LIBS) $(X_PRE_LIBS) \
+ -lXt -lX11 -lXext $(X_EXTRA_LIBS) \
+ $(PASSWD_LIBS) $(INTL_LIBS)
+
+CMD_LIBS = $(LIBS) $(X_LIBS) \
+ $(X_PRE_LIBS) -lX11 -lXext $(X_EXTRA_LIBS)
+
+GETIMG_LIBS = $(LIBS) $(X_LIBS) $(PNG_LIBS) $(JPEG_LIBS) \
+ $(X_PRE_LIBS) -lXt -lX11 $(XMU_LIBS) -lXext $(X_EXTRA_LIBS)
+
+EXES = xscreensaver xscreensaver-command xscreensaver-demo \
+ xscreensaver-getimage @EXES_OSX@
+EXES2 = @ALL_DEMO_PROGRAMS@
+EXES_OSX = pdf2jpeg
+
+SCRIPTS_1 = xscreensaver-getimage-file xscreensaver-getimage-video \
+ xscreensaver-text
+SCRIPTS_OSX = xscreensaver-getimage-desktop
+SCRIPTS = $(SCRIPTS_1) @SCRIPTS_OSX@
+
+HDRS = XScreenSaver_ad.h XScreenSaver_Xm_ad.h \
+ xscreensaver.h prefs.h remote.h exec.h \
+ demo-Gtk-conf.h auth.h mlstring.h types.h
+MEN_1 = xscreensaver.man xscreensaver-demo.man \
+ xscreensaver-command.man \
+ xscreensaver-text.man \
+ xscreensaver-getimage.man \
+ xscreensaver-getimage-file.man \
+ xscreensaver-getimage-video.man
+MEN_OSX = xscreensaver-getimage-desktop.man pdf2jpeg.man
+MEN = $(MEN_1) @MEN_OSX@
+
+EXTRAS = README Makefile.in \
+ XScreenSaver.ad.in XScreenSaver-Xm.ad xscreensaver.pam.in \
+ xscreensaver-demo.glade2.in xscreensaver-demo.glade2p \
+ screensaver-properties.desktop.in \
+ .gdbinit
+VMSFILES = compile_axp.com compile_decc.com link_axp.com link_decc.com \
+ vms-getpwnam.c vms-pwd.h vms-hpwd.c vms-validate.c \
+ vms_axp.opt vms_axp_12.opt vms_decc.opt vms_decc_12.opt
+
+TARFILES = $(EXTRAS) $(VMSFILES) $(SAVER_SRCS_1) \
+ $(MOTIF_SRCS) $(GTK_SRCS) $(PWENT_SRCS) $(PWHELPER_SRCS) \
+ $(KERBEROS_SRCS) $(PAM_SRCS) $(LOCK_SRCS_1) $(DEMO_SRCS_1) \
+ $(CMD_SRCS) $(GETIMG_SRCS_1) $(PDF2JPEG_SRCS) $(HDRS) \
+ $(SCRIPTS_1) $(SCRIPTS_OSX) $(MEN_1) $(MEN_OSX) \
+ $(TEST_SRCS)
+
+
+default: $(EXES)
+all: $(EXES) $(EXES2)
+tests: $(TEST_EXES)
+
+install: install-program install-ad install-scripts \
+ install-gnome install-man install-xml install-pam
+uninstall: uninstall-program uninstall-ad \
+ uninstall-gnome uninstall-man uninstall-xml
+
+install-strip:
+ $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \
+ install
+
+install-program: $(EXES)
+ @if [ ! -d $(install_prefix)$(bindir) ]; then \
+ $(INSTALL_DIRS) $(install_prefix)$(bindir) ; \
+ fi
+ @inst="$(INSTALL_PROGRAM)" ; \
+ if [ @NEED_SETUID@ = yes ]; then \
+ me=`PATH="$$PATH:/usr/ucb" whoami` ; \
+ if [ "$$me" = root ]; then \
+ inst="$(INSTALL_SETUID)" ; \
+ else \
+ e=echo ; \
+ $$e "" ;\
+ $$e " ####################################################################";\
+ $$e " Warning: xscreensaver has been compiled with support for shadow" ;\
+ $$e " passwords. If your system actually uses shadow passwords," ;\
+ $$e " then xscreensaver must be installed as a setuid root" ;\
+ $$e " program in order for locking to work. To do this, you" ;\
+ $$e " must run 'make install' as 'root', not as '$$me'." ;\
+ $$e "" ;\
+ $$e " For now, xscreensaver will be installed non-setuid, which" ;\
+ $$e " means that locking might not work. (Try it and see.)" ;\
+ $$e " ####################################################################";\
+ $$e "" ;\
+ fi ; \
+ fi ; \
+ echo $$inst xscreensaver $(install_prefix)$(bindir)/xscreensaver ; \
+ $$inst xscreensaver $(install_prefix)$(bindir)/xscreensaver
+ @for exe in xscreensaver-command xscreensaver-demo \
+ xscreensaver-getimage @EXES_OSX@ ; do \
+ echo $(INSTALL_PROGRAM) $$exe $(install_prefix)$(bindir)/$$exe ; \
+ $(INSTALL_PROGRAM) $$exe $(install_prefix)$(bindir)/$$exe ; \
+ done
+
+install-ad: XScreenSaver.ad
+ @if [ ! -d $(install_prefix)$(AD_DIR) ]; then \
+ $(INSTALL_DIRS) $(install_prefix)$(AD_DIR) ; \
+ fi
+ @-echo $(INSTALL_DATA) XScreenSaver.ad \
+ $(install_prefix)$(AD_DIR)/XScreenSaver ; \
+ if $(INSTALL_DATA) XScreenSaver.ad \
+ $(install_prefix)$(AD_DIR)/XScreenSaver ; then \
+ true ; \
+ else \
+ e=echo ; \
+ if [ -f $(install_prefix)$(AD_DIR)/XScreenSaver ]; then \
+ $$e "" ;\
+ $$e " ####################################################################";\
+ $$e " Warning: unable to install $(install_prefix)$(AD_DIR)/XScreenSaver" ;\
+ $$e " That file exists, and is unwritable. It is probably from" ;\
+ $$e " an older version of xscreensaver, and could cause things" ;\
+ $$e " to malfunction. Please delete it!" ;\
+ $$e " ####################################################################";\
+ $$e "" ;\
+ exit 1 ; \
+ else \
+ $$e "" ;\
+ $$e " ####################################################################";\
+ $$e " Warning: unable to install $(install_prefix)$(AD_DIR)/XScreenSaver" ;\
+ $$e " The directory is unwritable. This is probably ok;" ;\
+ $$e " xscreensaver should work without that file." ;\
+ $$e " ####################################################################";\
+ $$e "" ;\
+ exit 0 ; \
+ fi \
+ fi
+
+install-scripts: $(SCRIPTS) munge-scripts
+ @for program in $(SCRIPTS); do \
+ if [ -r $$program ] ; then \
+ p=$$program ; \
+ else \
+ p=$(srcdir)/$$program ; \
+ fi ; \
+ echo $(INSTALL_SCRIPT) $$p \
+ $(install_prefix)$(bindir)/$$program ; \
+ $(INSTALL_SCRIPT) $$p \
+ $(install_prefix)$(bindir)/$$program ; \
+ done
+
+munge-scripts: $(SCRIPTS)
+ @tmp=/tmp/mf.$$$$ ; \
+ perl="${PERL}" ; \
+ rm -f $$tmp ; \
+ for program in $(SCRIPTS); do \
+ sed "s@^\(#!\)\(/[^ ]*/perl[^ ]*\)\(.*\)\$$@\1$$perl\3@" \
+ < $(srcdir)/$$program > $$tmp ; \
+ if cmp -s $(srcdir)/$$program $$tmp ; then \
+ true ; \
+ else \
+ echo "$$program: setting interpreter to $$perl" >&2 ; \
+ cat $$tmp > ./$$program ; \
+ fi ; \
+ done ; \
+ rm -f $$tmp
+
+# When installing man pages, we install "foo.man" as "foo.N" and update
+# the .TH line in the installed file with one like
+#
+# .TH XScreenSaver N "V.VV (DD-MMM-YYYY)" "X Version 11"
+#
+# where N is the manual section suffix.
+#
+install-man: $(MEN)
+ @men="$(MEN)" ; \
+ U=$(UTILS_SRC)/version.h ; \
+ V=`sed -n 's/.*xscreensaver \([0-9]\.[^)]*)\).*/\1/p' < $$U` ; \
+ T=/tmp/xs$$$$.$(mansuffix) ; \
+ TH=".TH XScreenSaver $(mansuffix) \"$$V\" \"X Version 11\"" ; \
+ echo "installing man pages: $$TH" ; \
+ \
+ if [ ! -d $(install_prefix)$(manNdir) ]; then \
+ $(INSTALL_DIRS) $(install_prefix)$(manNdir) ; \
+ fi ; \
+ \
+ for man in $$men; do \
+ instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \
+ manbase=`echo $$man | sed 's/\.man$$//'` ; \
+ TH=".TH $$manbase $(mansuffix) \"$$V\" \"X Version 11\" \"XScreenSaver manual\"" ; \
+ sed -e "s/^\.TH.*/$$TH/" \
+ -e 's/^\(\.BR xscr.*(\)[^()]\(.*\)/\1$(mansuffix)\2/' \
+ -e 's@(MANSUFFIX)@($(mansuffix))@g' \
+ < $(srcdir)/$$man > $$T ; \
+ echo $(INSTALL_DATA) $(srcdir)/$$man \
+ $(install_prefix)$(manNdir)/$$instname ; \
+ $(INSTALL_DATA) $$T \
+ $(install_prefix)$(manNdir)/$$instname ; \
+ done ; \
+ rm -f $$T
+
+uninstall-program:
+ @for program in $(EXES) $(SCRIPTS); do \
+ echo rm -f $(install_prefix)$(bindir)/$$program ; \
+ rm -f $(install_prefix)$(bindir)/$$program ; \
+ done
+
+uninstall-ad:
+ rm -f $(install_prefix)$(AD_DIR)/XScreenSaver
+
+uninstall-man:
+ @men="$(MEN)" ; \
+ for man in $$men; do \
+ instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \
+ echo rm -f $(install_prefix)$(manNdir)/$$instname* ; \
+ rm -f $(install_prefix)$(manNdir)/$$instname* ; \
+ done
+
+install-pam: xscreensaver.pam
+ @src="xscreensaver.pam" ; \
+ dest=`sed -n 's/.*PAM_SERVICE_NAME[ ]*"\([^"]*\)".*$$/\1/p' \
+ < ../config.h` ; \
+ dir="$(install_prefix)$(PAM_DIR)" ; \
+ conf="$(PAM_CONF)" ; \
+ \
+ if [ -d $$dir ] ; then \
+ \
+ if [ -f $$dir/xdm ]; then \
+ src2=$$dir/xdm ; \
+ elif [ -f $$dir/login ]; then \
+ src2=$$dir/login ; \
+ fi ; \
+ \
+ if [ -z "$$src2" ]; then \
+ echo $(INSTALL_DATA) $$src $$dir/$$dest ; \
+ $(INSTALL_DATA) $$src $$dir/$$dest ; \
+ else \
+ src="xscreensaver.pam.$$$$" ; \
+ echo "grep '^#%\|^auth\|^@include' $$src2 > $$src" ; \
+ grep '^#%\|^auth\|^@include' $$src2 > $$src ; \
+ echo $(INSTALL_DATA) $$src $$dir/$$dest ; \
+ $(INSTALL_DATA) $$src $$dir/$$dest ; \
+ echo rm -f $$src ; \
+ rm -f $$src ; \
+ fi ; \
+ \
+ if [ ! -f $$dir/$$dest ]; then \
+ e=echo ; \
+ $$e "" ;\
+ $$e " ####################################################################";\
+ $$e " Warning: xscreensaver has been compiled with support for Pluggable" ;\
+ $$e " Authentication Modules (PAM). However, we were unable to" ;\
+ $$e " install the file $$dir/$$dest. PAM is unlikely" ;\
+ $$e " to work without this file (and old-style password" ;\
+ $$e " authentication will be used instead, which may or may not" ;\
+ $$e " work.)" ;\
+ $$e " ####################################################################";\
+ $$e "" ;\
+ fi ; \
+ elif [ -f $$conf -a "x$$dest" != "x" ]; then \
+ if ( grep $$dest $$conf >/dev/null ); then \
+ echo "$$conf unchanged: already has an entry for $$dest" ; \
+ else \
+ src="pam.conf.$$$$" ; \
+ echo "grep -v $$dest $$conf > $$src" ; \
+ grep -v $$dest $$conf > $$src ; \
+ extras=`sed -n "s/^login\(.*auth.*\)$$/$$dest\1/p" $$conf`; \
+ echo "$$extras" >> $$src ; \
+ if [ "x$$extras" = "x" ]; then \
+ echo "Error: no login rules in $$conf?" >&2 ; \
+ else \
+ echo "adding $$dest rules to $$src:" ; \
+ echo "$$extras" | sed 's/^/ /' ; \
+ fi ; \
+ echo $(INSTALL_DATA) $$src $$conf ; \
+ $(INSTALL_DATA) $$src $$conf ; \
+ echo rm -f $$src ; \
+ rm -f $$src ; \
+ fi ; \
+ if ( grep $$dest $$conf >/dev/null ); then \
+ echo ; \
+ else \
+ e=echo ; \
+ $$e "" ;\
+ $$e " ####################################################################";\
+ $$e " Warning: xscreensaver has been compiled with support for Pluggable" ;\
+ $$e " Authentication Modules (PAM). However, we were unable to" ;\
+ $$e " install xscreensaver rules in the file $$conf." ;\
+ $$e " PAM is unlikely to work without this (and old-style" ;\
+ $$e " password authentication will be used instead, which may" ;\
+ $$e " or may not work.)" ;\
+ $$e " ####################################################################";\
+ $$e "" ;\
+ fi ; \
+ fi
+
+# screensaver-properties.desktop
+# into /usr/share/applications/
+install-gnome:: screensaver-properties.desktop
+ @if [ "$(GTK_DATADIR)" != "" ]; then \
+ if [ ! -d "$(install_prefix)$(GTK_APPDIR)" ]; then \
+ echo $(INSTALL_DIRS) "$(install_prefix)$(GTK_APPDIR)" ;\
+ $(INSTALL_DIRS) "$(install_prefix)$(GTK_APPDIR)" ;\
+ fi ;\
+ name2=xscreensaver-properties.desktop ;\
+ echo $(INSTALL_DATA) screensaver-properties.desktop \
+ $(install_prefix)$(GTK_APPDIR)/$$name2 ;\
+ $(INSTALL_DATA) screensaver-properties.desktop \
+ $(install_prefix)$(GTK_APPDIR)/$$name2 ;\
+ fi
+
+
+# xscreensaver.xpm
+# into /usr/share/pixmaps/
+install-gnome:: $(LOGO)
+ @if [ "$(GTK_DATADIR)" != "" ]; then \
+ if [ ! -d "$(install_prefix)$(GTK_ICONDIR)" ]; then \
+ echo $(INSTALL_DIRS) "$(install_prefix)$(GTK_ICONDIR)" ;\
+ $(INSTALL_DIRS) "$(install_prefix)$(GTK_ICONDIR)" ;\
+ fi ;\
+ target=xscreensaver.xpm ;\
+ echo $(INSTALL_DATA) $(LOGO) \
+ $(install_prefix)$(GTK_ICONDIR)/$$target ;\
+ $(INSTALL_DATA) $(LOGO) \
+ $(install_prefix)$(GTK_ICONDIR)/$$target ;\
+ fi
+
+# ../utils/images/screensaver-*.png
+# into /usr/share/xscreensaver/glade/
+install-gnome::
+ @if [ "$(GTK_DATADIR)" != "" ]; then \
+ if [ ! -d "$(install_prefix)$(GTK_GLADEDIR)" ]; then \
+ echo $(INSTALL_DIRS) "$(install_prefix)$(GTK_GLADEDIR)" ;\
+ $(INSTALL_DIRS) "$(install_prefix)$(GTK_GLADEDIR)" ;\
+ fi ;\
+ for target in $(GTK_ICONS) ; do \
+ dest=`echo $$target | sed 's@^.*/@@'` ;\
+ echo $(INSTALL_DATA) $$target \
+ $(install_prefix)$(GTK_GLADEDIR)/$$dest ;\
+ $(INSTALL_DATA) $$target \
+ $(install_prefix)$(GTK_GLADEDIR)/$$dest ;\
+ done ;\
+ fi
+
+# xscreensaver-demo.glade2
+# into /usr/share/xscreensaver/glade/
+install-gnome:: xscreensaver-demo.glade2
+ @if [ "$(GTK_DATADIR)" != "" ]; then \
+ if [ ! -d "$(install_prefix)$(GTK_GLADEDIR)" ]; then \
+ echo $(INSTALL_DIRS) "$(install_prefix)$(GTK_GLADEDIR)" ;\
+ $(INSTALL_DIRS) "$(install_prefix)$(GTK_GLADEDIR)" ;\
+ fi ;\
+ target=xscreensaver-demo.glade2 ;\
+ echo $(INSTALL_DATA) $$target \
+ $(install_prefix)$(GTK_GLADEDIR)/$$target ;\
+ if $(INSTALL_DATA) $$target \
+ $(install_prefix)$(GTK_GLADEDIR)/$$target ;\
+ then true ;\
+ else \
+ e=echo ; \
+ $$e "" ;\
+ $$e " ####################################################################";\
+ $$e " Warning: unable to install $$target into" ;\
+ $$e " $(install_prefix)$(GTK_GLADEDIR)/." ;\
+ $$e " Without this file, xscreensaver-demo will not" ;\
+ $$e " be able to run properly." ;\
+ $$e " ####################################################################";\
+ $$e "" ;\
+ exit 1 ; \
+ fi ; \
+ fi
+
+
+# screensaver-properties.desktop
+# into /usr/share/applications/
+uninstall-gnome::
+ @if [ "$(GTK_DATADIR)" != "" ]; then \
+ f=xscreensaver-properties.desktop ;\
+ echo rm -f $(install_prefix)$(GTK_APPDIR)/$$f ;\
+ rm -f $(install_prefix)$(GTK_APPDIR)/$$f ;\
+ fi
+
+# xscreensaver.xpm
+# into /usr/share/pixmaps/
+uninstall-gnome::
+ @if [ "$(GTK_ICONDIR)" != "" ]; then \
+ target=xscreensaver.xpm ;\
+ echo rm -f $(install_prefix)$(GTK_ICONDIR)/$$target ;\
+ rm -f $(install_prefix)$(GTK_ICONDIR)/$$target ;\
+ fi
+
+# ../utils/images/screensaver-*.png
+# into /usr/share/xscreensaver/glade/
+uninstall-gnome::
+ @if [ "$(GTK_DATADIR)" != "" ]; then \
+ for target in $(GTK_ICONS) ; do \
+ dest=`echo $$target | sed 's@^.*/@@'` ;\
+ echo rm -f $(install_prefix)$(GTK_GLADEDIR)/$$dest ;\
+ rm -f $(install_prefix)$(GTK_GLADEDIR)/$$dest ;\
+ done ;\
+ fi
+
+# xscreensaver-demo.glade2
+# into /usr/share/xscreensaver/glade/
+uninstall-gnome:: xscreensaver-demo.glade2
+ @if [ "$(GTK_DATADIR)" != "" ]; then \
+ target=xscreensaver-demo.glade2 ;\
+ echo rm -f $(install_prefix)$(GTK_GLADEDIR)/$$target ;\
+ rm -f $(install_prefix)$(GTK_GLADEDIR)/$$target ;\
+ fi
+
+# /usr/share/xscreensaver/config/README
+install-xml:
+ @dest=$(install_prefix)$(HACK_CONF_DIR) ; \
+ if [ ! -d $$dest ]; then \
+ $(INSTALL_DIRS) $$dest ; \
+ fi ; \
+ src=$(srcdir)/../hacks/config ; \
+ echo $(INSTALL_DATA) $$src/README $$dest/README ; \
+ $(INSTALL_DATA) $$src/README $$dest/README
+
+
+# /usr/share/xscreensaver/config/README
+uninstall-xml:
+ rm -f $(install_prefix)$(HACK_CONF_DIR)/README
+
+clean:
+ -rm -f *.o a.out core $(EXES) $(EXES2) $(TEST_EXES) \
+ XScreenSaver_ad.h XScreenSaver_Xm_ad.h
+
+distclean: clean
+ -rm -f Makefile XScreenSaver.ad \
+ TAGS *~ "#"* screensaver-properties.desktop
+
+# Adds all current dependencies to Makefile
+depend: XScreenSaver_ad.h XScreenSaver_Xm_ad.h
+ $(DEPEND) -s '# DO NOT DELETE: updated by make depend' \
+ $(DEPEND_FLAGS) -- \
+ $(INCLUDES_1) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \
+ $(SAVER_SRCS) $(CMD_SRCS) $(GETIMG_SRCS_1)
+
+# Adds some dependencies to Makefile.in -- not totally accurate, but pretty
+# close. This excludes dependencies on files in /usr/include, etc. It tries
+# to include only dependencies on files which are themselves a part of this
+# package.
+distdepend: check_men update_ad_version XScreenSaver_ad.h XScreenSaver_Xm_ad.h
+ @echo updating dependencies in `pwd`/Makefile.in... ; \
+ $(DEPEND) -w 0 -f - \
+ -s '# DO NOT DELETE: updated by make distdepend' $(DEPEND_FLAGS) -- \
+ $(INCLUDES_1) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \
+ $(SAVER_SRCS_1) $(MOTIF_SRCS) $(GTK_SRCS) $(GETIMG_SRCS_1) \
+ $(PWENT_SRCS) $(LOCK_SRCS_1) $(DEMO_SRCS_1) $(CMD_SRCS) \
+ $(TEST_SRCS) 2>/dev/null | \
+ sort -d | \
+ ( \
+ awk '/^# .*Makefile.in ---/,/^# DO .*distdepend/' < Makefile.in ; \
+ sed -e '/^#.*/d' \
+ -e 's@ \./@ @g;s@ /[^ ]*@@g;/^.*:$$/d' \
+ -e 's@\.\./utils@$$(UTILS_SRC)@g' \
+ -e 's@ \([^$$]\)@ $$(srcdir)/\1@g' \
+ -e 's@$$.*\(XScreenSaver_ad\)@\1@g' \
+ -e 's@$$.*\(XScreenSaver_Xm_ad\)@\1@g' \
+ -e 's@ $$(srcdir)/\(.*config\.h\)@ \1@g' ; \
+ echo '' \
+ ) > /tmp/distdepend.$$$$ && \
+ mv /tmp/distdepend.$$$$ Makefile.in
+
+# Updates the version number in the app-defaults file to be in sync with
+# the version number in version.h. This is so people can tell when they
+# have a version skew between the app-defaults file and the executable.
+# Also update hacks/config/README in the same way.
+update_ad_version::
+ @ \
+ files="XScreenSaver.ad.in ../hacks/config/README ../OSX/bindist.rtf" ; \
+ U=$(UTILS_SRC)/version.h ; \
+ V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' < $$U` ; \
+ Y=`date '+%Y'` ; \
+ D=`date '+%d-%b-%Y'` ; \
+ for S in $$files ; do \
+ T=/tmp/xs.$$$$ ; \
+ sed -e "s/\(.*version \)[0-9][0-9]*\.[0-9]*[ab]*[0-9]*\(.*\)/\1$$V\2/" \
+ -e "s/\([0-9][0-9]-[A-Z][a-z][a-z]-[0-9][0-9][0-9]*\)/$$D/" \
+ -e "s/\( [0-9][0-9][0-9][0-9]-\)[0-9][0-9][0-9][0-9] /\1$$Y /" \
+ < $$S > $$T ; \
+ if cmp -s $$S $$T ; then \
+ true ; \
+ else \
+ cat $$T > $$S ; \
+ echo "updated $$S to $$V $$D" ; \
+ fi ; \
+ done ; \
+ rm $$T
+
+TAGS: tags
+tags:
+ find $(srcdir) -name '*.[chly]' -print | xargs etags -a
+
+echo_tarfiles:
+ @$(MAKE) XScreenSaver_ad.h XScreenSaver_Xm_ad.h 2>&1 >/dev/null
+ @echo $(TARFILES)
+
+check_men:
+ @badmen="" ; \
+ for exe in $(EXES); do \
+ if ! [ -f $(srcdir)/$$exe.man ]; then \
+ badmen="$$badmen $$exe" ; \
+ fi ; \
+ done ; \
+ if [ -n "$$badmen" ]; then \
+ echo "" ; \
+ echo "Warning: The following programs have no manuals:" ; \
+ echo "" ; \
+ for m in $$badmen ; do \
+ echo " $$m" ; \
+ done ; \
+ echo "" ; \
+ fi
+
+
+# Rules for noticing when the objects from the utils directory are out of
+# date with respect to their sources, and going and building them according
+# to the rules in their own Makefile...
+#
+$(UTILS_BIN)/fade.o: $(UTILS_SRC)/fade.c
+$(UTILS_BIN)/overlay.o: $(UTILS_SRC)/overlay.c
+$(UTILS_BIN)/resources.o: $(UTILS_SRC)/resources.c
+$(UTILS_BIN)/usleep.o: $(UTILS_SRC)/usleep.c
+$(UTILS_BIN)/visual.o: $(UTILS_SRC)/visual.c
+$(UTILS_BIN)/xmu.o: $(UTILS_SRC)/xmu.c
+$(UTILS_BIN)/logo.o: $(UTILS_SRC)/logo.c
+$(UTILS_BIN)/minixpm.o: $(UTILS_SRC)/minixpm.c
+$(UTILS_BIN)/yarandom.o: $(UTILS_SRC)/yarandom.c
+$(UTILS_BIN)/colorbars.o: $(UTILS_SRC)/colorbars.c
+$(UTILS_BIN)/hsv.o: $(UTILS_SRC)/hsv.c
+$(UTILS_BIN)/colors.o: $(UTILS_SRC)/colors.c
+$(UTILS_BIN)/grabscreen.o: $(UTILS_SRC)/grabscreen.c
+$(UTILS_BIN)/font-retry.o: $(UTILS_SRC)/font-retry.c
+
+UTIL_OBJS = $(SAVER_UTIL_OBJS) $(UTILS_BIN)/colorbars.o \
+ $(UTILS_BIN)/hsv.o $(UTILS_BIN)/colors.o \
+ $(UTILS_BIN)/grabscreen.o
+
+$(UTIL_OBJS):
+ cd $(UTILS_BIN) ; \
+ $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)"
+
+# How we build object files in this directory.
+.c.o:
+ $(CC) -c $(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) $<
+
+.m.o:
+ $(OBJCC) -c $(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) $<
+
+# subprocs takes an extra -D option.
+subprocs.o: subprocs.c
+ $(CC) -c $(INCLUDES) $(SUBP_DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) \
+ $(srcdir)/subprocs.c
+
+# xscreensaver takes an extra -D option.
+xscreensaver.o: xscreensaver.c
+ $(CC) -c $(INCLUDES) $(DEFS) $(INTL_DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) \
+ $(srcdir)/xscreensaver.c
+
+# demo-Gtk takes extra -D options, and an extra -I option.
+demo-Gtk.o: demo-Gtk.c
+ $(CC) -c $(INCLUDES) $(SUBP_DEFS) -I$(ICON_SRC) \
+ $(GTK_DEFS) $(INTL_DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) \
+ $(srcdir)/demo-Gtk.c
+
+# demo-Gtk-conf takes an extra -D option.
+demo-Gtk-conf.o: demo-Gtk-conf.c
+ $(CC) -c $(INCLUDES) $(CONF_DEFS) $(GTK_DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) \
+ $(srcdir)/demo-Gtk-conf.c
+
+
+# How we build the default app-defaults file into the program.
+#
+XScreenSaver_ad.h: XScreenSaver.ad
+ $(SHELL) $(UTILS_SRC)/ad2c XScreenSaver.ad > XScreenSaver_ad.h
+
+XScreenSaver_Xm_ad.h: XScreenSaver-Xm.ad
+ $(SHELL) $(UTILS_SRC)/ad2c XScreenSaver-Xm.ad > XScreenSaver_Xm_ad.h
+
+@INTLTOOL_DESKTOP_RULE@
+
+# The executables linked in this directory.
+#
+xscreensaver: $(SAVER_OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(SAVER_OBJS) $(SAVER_LIBS) $(INTL_LIBS)
+
+xscreensaver-command: $(CMD_OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(CMD_OBJS) $(CMD_LIBS)
+
+
+xscreensaver-demo: @PREFERRED_DEMO_PROGRAM@
+ @if [ "@PREFERRED_DEMO_PROGRAM@" = "" ]; then \
+ echo "WARNING: neither GTK nor Motif are available," \
+ "therefore no xscreensaver-demo!" ; \
+ rm -f $@@EXEEXT@ ; \
+ else \
+ echo cp -p @PREFERRED_DEMO_PROGRAM@@EXEEXT@ $@@EXEEXT@ ; \
+ cp -p @PREFERRED_DEMO_PROGRAM@@EXEEXT@ $@@EXEEXT@ ; \
+ fi
+
+xscreensaver-demo-Xm: $(DEMO_OBJS) $(MOTIF_OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(DEMO_OBJS) $(MOTIF_OBJS) $(LIBS) $(X_LIBS) \
+ $(MOTIF_LIBS) $(INTL_LIBS) $(X_PRE_LIBS) -lXt -lX11 \
+ $(XDPMS_LIBS) $(XINERAMA_LIBS) -lXext $(X_EXTRA_LIBS)
+
+xscreensaver-demo-Gtk: $(DEMO_OBJS) $(GTK_OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(DEMO_OBJS) $(GTK_OBJS) $(LIBS) $(X_LIBS) \
+ $(GTK_LIBS) $(XML_LIBS) $(INTL_LIBS) $(X_PRE_LIBS) \
+ -lXt -lX11 $(XDPMS_LIBS) $(XINERAMA_LIBS) -lXext $(X_EXTRA_LIBS)
+
+demo-Gtk.o: XScreenSaver_ad.h
+demo-Xm.o: XScreenSaver_Xm_ad.h
+xscreensaver.o: XScreenSaver_ad.h
+xscreensaver-getimage.o: XScreenSaver_ad.h
+
+xscreensaver-getimage: $(GETIMG_OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(GETIMG_OBJS) $(GETIMG_LIBS) -lm
+
+pdf2jpeg: $(PDF2JPEG_OBJS)
+ $(OBJCC) $(LDFLAGS) -o $@ $(PDF2JPEG_OBJS) $(PDF2JPEG_LIBS) -lm
+
+
+TEST_PASSWD_OBJS = test-passwd.o $(LOCK_OBJS_1) $(PASSWD_OBJS) \
+ subprocs.o setuid.o splash.o prefs.o mlstring.o exec.o \
+ $(SAVER_UTIL_OBJS)
+test-passwd.o: XScreenSaver_ad.h
+
+test-passwd: $(TEST_PASSWD_OBJS) XScreenSaver_ad.h
+ $(CC) $(LDFLAGS) -o $@ $(TEST_PASSWD_OBJS) $(SAVER_LIBS)
+
+test-uid: test-uid.o
+ $(CC) $(LDFLAGS) -o $@ test-uid.o
+
+test-xdpms: test-xdpms.o
+ $(CC) $(LDFLAGS) -o $@ test-xdpms.o $(LIBS) $(X_LIBS) $(XDPMS_LIBS) \
+ $(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS)
+
+test-xinerama: test-xinerama.o
+ $(CC) $(LDFLAGS) -o $@ test-xinerama.o $(LIBS) $(X_LIBS) $(SAVER_LIBS) \
+ $(X_PRE_LIBS) $(XINERAMA_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS)
+
+test-vp: test-vp.o
+ $(CC) $(LDFLAGS) -o $@ test-vp.o $(LIBS) $(X_LIBS) $(SAVER_LIBS) \
+ $(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS)
+
+test-randr: test-randr.o
+ $(CC) $(LDFLAGS) -o $@ test-randr.o $(LIBS) $(X_LIBS) $(SAVER_LIBS) \
+ $(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS)
+
+test-grab: test-grab.o
+ $(CC) $(LDFLAGS) -o $@ test-grab.o $(SAVER_LIBS)
+
+test-apm: test-apm.o
+ $(CC) $(LDFLAGS) -o $@ test-apm.o $(SAVER_LIBS) -lapm
+
+test-mlstring.o: mlstring.c
+test-mlstring: test-mlstring.o
+ $(CC) -DTEST $(LDFLAGS) -o $@ test-mlstring.o $(SAVER_LIBS)
+
+TEST_FADE_OBJS = test-fade.o $(UTILS_SRC)/fade.o $(DEMO_UTIL_OBJS)
+test-fade: test-fade.o $(UTILS_BIN)/fade.o
+ $(CC) $(LDFLAGS) -o $@ $(TEST_FADE_OBJS) $(SAVER_LIBS)
+
+TEST_SCREENS_OBJS = test-screens.o $(DEMO_UTIL_OBJS)
+test-screens.o: screens.c
+test-screens: test-screens.o
+ $(CC) $(LDFLAGS) -o $@ $(TEST_SCREENS_OBJS) $(SAVER_LIBS)
+
+
+xdpyinfo.o: xdpyinfo.c
+ $(CC) -c $(INCLUDES) -DHAVE_GLX $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) \
+ $(srcdir)/xdpyinfo.c
+
+xdpyinfo: xdpyinfo.o
+ $(CC) $(LDFLAGS) -o $@ xdpyinfo.o \
+ $(LIBS) $(X_LIBS) @GL_LIBS@ \
+ $(X_PRE_LIBS) -lX11 -lXext $(X_EXTRA_LIBS) -lm
+
+
+##############################################################################
+#
+# DO NOT DELETE: updated by make distdepend
+
+demo-Gtk-conf.o: ../config.h
+demo-Gtk-conf.o: $(srcdir)/demo-Gtk-conf.h
+demo-Gtk-conf.o: $(UTILS_SRC)/xscreensaver-intl.h
+demo-Gtk.o: XScreenSaver_ad.h
+demo-Gtk.o: ../config.h
+demo-Gtk.o: $(srcdir)/demo-Gtk-conf.h
+demo-Gtk.o: $(srcdir)/prefs.h
+demo-Gtk.o: $(srcdir)/remote.h
+demo-Gtk.o: $(srcdir)/types.h
+demo-Gtk.o: $(UTILS_SRC)/resources.h
+demo-Gtk.o: $(UTILS_SRC)/usleep.h
+demo-Gtk.o: $(UTILS_SRC)/version.h
+demo-Gtk.o: $(UTILS_SRC)/visual.h
+demo-Gtk.o: $(UTILS_SRC)/xscreensaver-intl.h
+demo-Xm.o: ../config.h
+demo-Xm-widgets.o: ../config.h
+dpms.o: ../config.h
+dpms.o: $(srcdir)/prefs.h
+dpms.o: $(srcdir)/types.h
+dpms.o: $(srcdir)/xscreensaver.h
+exec.o: ../config.h
+exec.o: $(srcdir)/exec.h
+lock.o: $(srcdir)/auth.h
+lock.o: ../config.h
+lock.o: $(srcdir)/mlstring.h
+lock.o: $(srcdir)/prefs.h
+lock.o: $(srcdir)/types.h
+lock.o: $(UTILS_SRC)/resources.h
+lock.o: $(srcdir)/xscreensaver.h
+mlstring.o: $(srcdir)/mlstring.h
+passwd.o: $(srcdir)/auth.h
+passwd.o: ../config.h
+passwd.o: $(srcdir)/prefs.h
+passwd.o: $(srcdir)/types.h
+passwd.o: $(srcdir)/xscreensaver.h
+passwd-pwent.o: ../config.h
+prefs.o: ../config.h
+prefs.o: $(srcdir)/prefs.h
+prefs.o: $(srcdir)/types.h
+prefs.o: $(UTILS_SRC)/resources.h
+prefs.o: $(UTILS_SRC)/version.h
+remote.o: ../config.h
+remote.o: $(srcdir)/remote.h
+screens.o: ../config.h
+screens.o: $(srcdir)/prefs.h
+screens.o: $(srcdir)/types.h
+screens.o: $(UTILS_SRC)/visual.h
+screens.o: $(srcdir)/xscreensaver.h
+setuid.o: ../config.h
+setuid.o: $(srcdir)/prefs.h
+setuid.o: $(srcdir)/types.h
+setuid.o: $(srcdir)/xscreensaver.h
+splash.o: ../config.h
+splash.o: $(srcdir)/prefs.h
+splash.o: $(srcdir)/types.h
+splash.o: $(UTILS_SRC)/font-retry.h
+splash.o: $(UTILS_SRC)/resources.h
+splash.o: $(srcdir)/xscreensaver.h
+stderr.o: ../config.h
+stderr.o: $(srcdir)/prefs.h
+stderr.o: $(srcdir)/types.h
+stderr.o: $(UTILS_SRC)/resources.h
+stderr.o: $(UTILS_SRC)/visual.h
+stderr.o: $(srcdir)/xscreensaver.h
+subprocs.o: ../config.h
+subprocs.o: $(srcdir)/exec.h
+subprocs.o: $(srcdir)/prefs.h
+subprocs.o: $(srcdir)/types.h
+subprocs.o: $(UTILS_SRC)/visual.h
+subprocs.o: $(UTILS_SRC)/yarandom.h
+subprocs.o: $(srcdir)/xscreensaver.h
+test-apm.o: ../config.h
+test-fade.o: ../config.h
+test-fade.o: $(srcdir)/prefs.h
+test-fade.o: $(srcdir)/types.h
+test-fade.o: $(UTILS_SRC)/fade.h
+test-fade.o: $(srcdir)/xscreensaver.h
+test-grab.o: ../config.h
+test-mlstring.o: $(srcdir)/mlstring.c
+test-mlstring.o: $(srcdir)/mlstring.h
+test-passwd.o: XScreenSaver_ad.h
+test-passwd.o: $(srcdir)/auth.h
+test-passwd.o: ../config.h
+test-passwd.o: $(srcdir)/prefs.h
+test-passwd.o: $(srcdir)/types.h
+test-passwd.o: $(UTILS_SRC)/resources.h
+test-passwd.o: $(UTILS_SRC)/version.h
+test-passwd.o: $(UTILS_SRC)/visual.h
+test-passwd.o: $(srcdir)/xscreensaver.h
+test-randr.o: ../config.h
+test-screens.o: ../config.h
+test-screens.o: $(srcdir)/prefs.h
+test-screens.o: $(srcdir)/screens.c
+test-screens.o: $(srcdir)/types.h
+test-screens.o: $(UTILS_SRC)/visual.h
+test-screens.o: $(srcdir)/xscreensaver.h
+test-uid.o: ../config.h
+test-vp.o: ../config.h
+test-xdpms.o: ../config.h
+test-xinerama.o: ../config.h
+timers.o: ../config.h
+timers.o: $(srcdir)/prefs.h
+timers.o: $(srcdir)/types.h
+timers.o: $(srcdir)/xscreensaver.h
+windows.o: ../config.h
+windows.o: $(srcdir)/prefs.h
+windows.o: $(srcdir)/types.h
+windows.o: $(UTILS_SRC)/fade.h
+windows.o: $(UTILS_SRC)/visual.h
+windows.o: $(srcdir)/xscreensaver.h
+xscreensaver-command.o: ../config.h
+xscreensaver-command.o: $(srcdir)/remote.h
+xscreensaver-command.o: $(UTILS_SRC)/version.h
+xscreensaver-getimage.o: ../config.h
+xscreensaver-getimage.o: XScreenSaver_ad.h
+xscreensaver-getimage.o: $(srcdir)/prefs.h
+xscreensaver-getimage.o: $(srcdir)/types.h
+xscreensaver-getimage.o: $(UTILS_SRC)/colorbars.h
+xscreensaver-getimage.o: $(UTILS_SRC)/grabscreen.h
+xscreensaver-getimage.o: $(UTILS_SRC)/resources.h
+xscreensaver-getimage.o: $(UTILS_SRC)/utils.h
+xscreensaver-getimage.o: $(UTILS_SRC)/version.h
+xscreensaver-getimage.o: $(UTILS_SRC)/visual.h
+xscreensaver-getimage.o: $(UTILS_SRC)/vroot.h
+xscreensaver-getimage.o: $(UTILS_SRC)/yarandom.h
+xscreensaver.o: XScreenSaver_ad.h
+xscreensaver.o: $(srcdir)/auth.h
+xscreensaver.o: ../config.h
+xscreensaver.o: $(srcdir)/prefs.h
+xscreensaver.o: $(srcdir)/types.h
+xscreensaver.o: $(UTILS_SRC)/resources.h
+xscreensaver.o: $(UTILS_SRC)/usleep.h
+xscreensaver.o: $(UTILS_SRC)/version.h
+xscreensaver.o: $(UTILS_SRC)/visual.h
+xscreensaver.o: $(UTILS_SRC)/yarandom.h
+xscreensaver.o: $(srcdir)/xscreensaver.h
+xset.o: ../config.h
+xset.o: $(srcdir)/prefs.h
+xset.o: $(srcdir)/types.h
+xset.o: $(srcdir)/xscreensaver.h
+
diff --git a/driver/README b/driver/README
new file mode 100644
index 0000000..df64793
--- /dev/null
+++ b/driver/README
@@ -0,0 +1,6 @@
+
+This directory contains the source for xscreensaver and xscreensaver-command,
+the screensaver driver, and the program for externally controlling it. Some
+stuff from the ../utils/ directory is used here as well.
+
+If you have compilation problems, check the parameters in ../config.h.
diff --git a/driver/XScreenSaver-Xm.ad b/driver/XScreenSaver-Xm.ad
new file mode 100644
index 0000000..6b04ae9
--- /dev/null
+++ b/driver/XScreenSaver-Xm.ad
@@ -0,0 +1,126 @@
+! Resources for the Motif dialog boxes of the "xscreensaver-demo" program.
+!
+*fontList: *-helvetica-medium-r-*-*-*-120-*-*-*-iso8859-1
+*demoDialog*label1.fontList: *-helvetica-medium-r-*-*-*-140-*-*-*-iso8859-1
+*cmdText.fontList: *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1
+*label0.fontList: *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1
+XScreenSaver*doc.fontList: *-helvetica-medium-r-*-*-*-100-*-*-*-iso8859-1
+! above must be fully qualified to get around *sgiMode.
+
+*foreground: #000000
+*background: #C0C0C0
+*XmTextField.foreground: #000000
+*XmTextField.background: #FFFFFF
+*list.foreground: #000000
+*list.background: #FFFFFF
+
+*ApplicationShell.title: XScreenSaver
+*warning.title: XScreenSaver
+*warning_popup.title: XScreenSaver
+*allowShellResize: True
+*autoUnmanage: False
+
+*menubar*file.labelString: File
+*menubar*file.mnemonic: F
+*file.blank.labelString: Blank Screen Now
+*file.blank.mnemonic: B
+*file.lock.labelString: Lock Screen Now
+*file.lock.mnemonic: L
+*file.kill.labelString: Kill Daemon
+*file.kill.mnemonic: K
+*file.restart.labelString: Restart Daemon
+*file.restart.mnemonic: R
+*file.exit.labelString: Exit
+*file.exit.mnemonic: E
+
+*menubar*edit.labelString: Edit
+*menubar*edit.mnemonic: E
+*edit.cut.labelString: Cut
+*edit.cut.mnemonic: u
+*edit.copy.labelString: Copy
+*edit.copy.mnemonic: C
+*edit.paste.labelString: Paste
+*edit.paste.mnemonic: P
+
+*menubar*help.labelString: Help
+*menubar*help.mnemonic: H
+*help.about.labelString: About...
+*help.about.mnemonic: A
+*help.docMenu.labelString: Documentation...
+*help.docMenu.mnemonic: D
+
+*demoTab.marginWidth: 10
+*optionsTab.marginWidth: 10
+
+*XmScrolledWindow.topOffset: 10
+*XmScrolledWindow.leftOffset: 10
+*demoTab.topOffset: 4
+*form1.bottomOffset: 10
+*form3.leftOffset: 10
+*form3.rightOffset: 10
+*frame.topOffset: 10
+*frame.bottomOffset: 10
+*enabled.topOffset: 10
+*visLabel.topOffset: 10
+*combo.topOffset: 10
+*form4.bottomOffset: 4
+*hr.bottomOffset: 4
+*XmComboBox.marginWidth: 0
+*XmComboBox.marginHeight: 0
+
+*demo.marginWidth: 30
+*demo.marginHeight: 4
+*man.marginWidth: 10
+*man.marginHeight: 4
+*down.leftOffset: 40
+*down.marginWidth: 4
+*down.marginHeight: 4
+*up.marginWidth: 4
+*up.marginHeight: 4
+*frame.traversalOn: False
+
+*list.automaticSelection: True
+*list.visibleItemCount: 20
+*doc.columns: 60
+*combo.columns: 11
+
+*demoTab.labelString: Graphics Demos
+*optionsTab.labelString: Screensaver Options
+*down.labelString: \\/
+*up.labelString: /\\
+*frameLabel.labelString:
+*cmdLabel.labelString: Command Line:
+*cmdLabel.alignment: ALIGNMENT_BEGINNING
+*enabled.labelString: Enabled
+*visLabel.labelString: Visual:
+*visLabel.alignment: ALIGNMENT_END
+*visLabel.leftOffset: 20
+*demo.labelString: Demo
+*man.labelString: Documentation...
+*done.labelString: Quit
+
+*preferencesLabel.labelString: XScreenSaver Parameters
+
+*timeoutLabel.labelString: Saver Timeout
+*cycleLabel.labelString: Cycle Timeout
+*fadeSecondsLabel.labelString: Fade Duration
+*fadeTicksLabel.labelString: Fade Ticks
+*lockLabel.labelString: Lock Timeout
+*passwdLabel.labelString: Password Timeout
+*preferencesForm*XmTextField.columns: 8
+
+*verboseToggle.labelString: Verbose
+*cmapToggle.labelString: Install Colormap
+*fadeToggle.labelString: Fade Colormap
+*unfadeToggle.labelString: Unfade Colormap
+*lockToggle.labelString: Require Password
+
+
+*OK.marginWidth: 30
+*OK.marginHeight: 4
+*OK.leftOffset: 10
+*OK.bottomOffset: 10
+*Cancel.marginWidth: 30
+*Cancel.marginHeight: 4
+*Cancel.rightOffset: 10
+*Cancel.bottomOffset: 10
diff --git a/driver/XScreenSaver.ad.in b/driver/XScreenSaver.ad.in
new file mode 100644
index 0000000..f4e29d4
--- /dev/null
+++ b/driver/XScreenSaver.ad.in
@@ -0,0 +1,556 @@
+!
+! XScreenSaver
+!
+! a screen saver and locker for the X window system
+! by Jamie Zawinski
+!
+! version 5.40
+! 12-Aug-2018
+!
+! See "man xscreensaver" for more info. The latest version is always
+! available at https://www.jwz.org/xscreensaver/
+
+
+! These resources, when placed in the system-wide app-defaults directory
+! (e.g., /usr/lib/X11/app-defaults/XScreenSaver) will provide the default
+! settings for new users. However, if you have a ".xscreensaver" file in
+! your home directory, the settings in that file take precedence.
+
+
+! Don't hand this file to "xrdb" -- that isn't how app-defaults files work.
+! Though app-defaults files have (mostly) the same syntax as your ~/.Xdefaults
+! file, they are used differently, and if you run this file through xrdb,
+! you will probably mess things up.
+
+#error Do not run app-defaults files through xrdb!
+#error That does not do what you might expect.
+#error Put this file in /usr/lib/X11/app-defaults/XScreenSaver instead.
+
+! /* (xrdb prevention kludge: whole file)
+
+*mode: random
+*timeout: 0:10:00
+*cycle: 0:10:00
+*lockTimeout: 0:00:00
+*passwdTimeout: 0:00:30
+*dpmsEnabled: False
+*dpmsQuickoffEnabled: False
+*dpmsStandby: 2:00:00
+*dpmsSuspend: 2:00:00
+*dpmsOff: 4:00:00
+*grabDesktopImages: True
+*grabVideoFrames: False
+*chooseRandomImages: @DEFAULT_IMAGES_P@
+! This can be a local directory name, or the URL of an RSS or Atom feed.
+*imageDirectory: @DEFAULT_IMAGE_DIRECTORY@
+*nice: 10
+*memoryLimit: 0
+*lock: False
+*verbose: False
+*timestamp: True
+*fade: True
+*unfade: False
+*fadeSeconds: 0:00:03
+*fadeTicks: 20
+*splash: True
+*splashDuration: 0:00:05
+*visualID: default
+*captureStderr: True
+*ignoreUninstalledPrograms: False
+*authWarningSlack: 20
+
+*textMode: file
+*textLiteral: XScreenSaver
+*textFile: @DEFAULT_TEXT_FILE@
+*textProgram: fortune
+*textURL: https://en.wikipedia.org/w/index.php?title=Special:NewPages&feed=rss
+
+*overlayTextForeground: #FFFF00
+*overlayTextBackground: #000000
+*overlayStderr: True
+*font: *-medium-r-*-140-*-m-*
+
+! The default is to use these extensions if available (as noted.)
+*sgiSaverExtension: True
+*xidleExtension: True
+*procInterrupts: True
+
+! Turning this on makes pointerHysteresis not work.
+*xinputExtensionDev: False
+
+! Set this to True if you are experiencing longstanding XFree86 bug #421
+! (xscreensaver not covering the whole screen)
+GetViewPortIsFullOfLies: False
+
+! This is what the "Demo" button on the splash screen runs (/bin/sh syntax.)
+*demoCommand: xscreensaver-demo
+
+! This is what the "Prefs" button on the splash screen runs (/bin/sh syntax.)
+*prefsCommand: xscreensaver-demo -prefs
+
+! This is the URL loaded by the "Help" button on the splash screen,
+! and by the "Documentation" menu item in xscreensaver-demo.
+*helpURL: https://www.jwz.org/xscreensaver/man.html
+
+! loadURL -- how the "Help" buttons load the helpURL (/bin/sh syntax.)
+! manualCommand -- how the "Documentation" buttons display man pages.
+!
+! And there are so very many options to choose from!
+!
+! Gnome 2.4, 2.6: (yelp can't display man pages, as of 2.6.3)
+!
+@GNOME24@*loadURL: @WITH_BROWSER@ '%s'
+@GNOME24@*manualCommand: gnome-terminal --title '%s manual' \
+@GNOME24@ --command '/bin/sh -c "man %s; read foo"'
+!
+! Gnome 2.2:
+!
+@GNOME22@*loadURL: gnome-url-show '%s'
+@GNOME22@*manualCommand: gnome-terminal --title '%s manual' \
+@GNOME22@ --command '/bin/sh -c "man %s; read foo"'
+!
+! Gnome 1.4:
+!
+! *loadURL: gnome-moz-remote --newwin '%s'
+! *manualCommand: gnome-help-browser 'man:%s'
+!
+! non-Gnome systems:
+!
+@NOGNOME@*loadURL: firefox '%s' || mozilla '%s' || netscape '%s'
+@NOGNOME@*manualCommand: xterm -sb -fg black -bg gray75 -T '%s manual' \
+@NOGNOME@ -e /bin/sh -c 'man "%s" ; read foo'
+
+
+! The format used for printing the date and time in the password dialog box
+! (see the strftime(3) manual page for details.)
+*dateFormat: %d-%b-%y (%a); %I:%M %p
+! To show the time only:
+! *dateFormat: %I:%M %p
+! For 24 hour time:
+! *dateFormat: %H:%M
+
+
+! This command is executed by the "New Login" button on the lock dialog.
+! (That button does not appear on the dialog if this program does not exist.)
+! For Gnome: probably "gdmflexiserver -ls". KDE, probably "kdmctl reserve".
+! Or maybe yet another wheel-reinvention, "lxdm -c USER_SWITCH".
+! Oh wait, this wheel just keeps getting better: "dm-tool switch-to-greeter".
+!
+@NEW_LOGIN_COMMAND_P@*newLoginCommand: @NEW_LOGIN_COMMAND@
+
+
+! Turning on "installColormap" on 8-bit systems interacts erratically with
+! certain jurassic window managers. If your screen turns some color other
+! than black, the window manager is buggy, and you need to set this resource
+! to false. Or switch WMs. Or join the 21st century and get a 24-bit
+! graphics card.
+!
+*installColormap: True
+
+
+! This is the list of installed screen saver modes. See "man xscreensaver"
+! for the syntax used here.
+!
+! If you want to disable a screensaver, DO NOT remove it from this list:
+! instead, mark it as inactive by placing a "-" at the beginning of the line.
+!
+! You can use the `xscreensaver-demo' program to edit the current list of
+! screen savers interactively.
+!
+*programs: \
+ maze -root \n\
+@GL_KLUDGE@ GL: superquadrics -root \n\
+ attraction -root \n\
+ blitspin -root \n\
+ greynetic -root \n\
+ helix -root \n\
+ hopalong -root \n\
+ imsmap -root \n\
+- noseguy -root \n\
+- pyro -root \n\
+ qix -root \n\
+- rocks -root \n\
+ rorschach -root \n\
+ decayscreen -root \n\
+ flame -root \n\
+ halo -root \n\
+ slidescreen -root \n\
+ pedal -root \n\
+ bouboule -root \n\
+- braid -root \n\
+ coral -root \n\
+ deco -root \n\
+ drift -root \n\
+- fadeplot -root \n\
+ galaxy -root \n\
+ goop -root \n\
+ grav -root \n\
+ ifs -root \n\
+@GL_KLUDGE@ GL: jigsaw -root \n\
+ julia -root \n\
+- kaleidescope -root \n\
+@GL_KLUDGE@ GL: moebius -root \n\
+ moire -root \n\
+@GL_KLUDGE@ GL: morph3d -root \n\
+ mountain -root \n\
+ munch -root \n\
+ penrose -root \n\
+@GL_KLUDGE@ GL: pipes -root \n\
+ rd-bomb -root \n\
+@GL_KLUDGE@ GL: rubik -root \n\
+- sierpinski -root \n\
+ slip -root \n\
+@GL_KLUDGE@ GL: sproingies -root \n\
+ starfish -root \n\
+ strange -root \n\
+ swirl -root \n\
+ triangle -root \n\
+ xjack -root \n\
+ xlyap -root \n\
+@GL_KLUDGE@ GL: atlantis -root \n\
+ bsod -root \n\
+@GL_KLUDGE@ GL: bubble3d -root \n\
+@GL_KLUDGE@ GL: cage -root \n\
+- crystal -root \n\
+ cynosure -root \n\
+ discrete -root \n\
+ distort -root \n\
+ epicycle -root \n\
+ flow -root \n\
+@GL_KLUDGE@ GL: glplanet -root \n\
+ interference -root \n\
+ kumppa -root \n\
+@GL_KLUDGE@ GL: lament -root \n\
+ moire2 -root \n\
+@GL_KLUDGE@ GL: sonar -root \n\
+@GL_KLUDGE@ GL: stairs -root \n\
+ truchet -root \n\
+- vidwhacker -root \n\
+ blaster -root \n\
+ bumps -root \n\
+ ccurve -root \n\
+ compass -root \n\
+ deluxe -root \n\
+- demon -root \n\
+@GLE_KLUDGE@ GL: extrusion -root \n\
+- loop -root \n\
+ penetrate -root \n\
+ petri -root \n\
+ phosphor -root \n\
+@GL_KLUDGE@ GL: pulsar -root \n\
+ ripples -root \n\
+ shadebobs -root \n\
+@GL_KLUDGE@ GL: sierpinski3d -root \n\
+ spotlight -root \n\
+ squiral -root \n\
+ wander -root \n\
+- webcollage -root \n\
+ xflame -root \n\
+ xmatrix -root \n\
+@GL_KLUDGE@ GL: gflux -root \n\
+- nerverot -root \n\
+ xrayswarm -root \n\
+ xspirograph -root \n\
+@GL_KLUDGE@ GL: circuit -root \n\
+@GL_KLUDGE@ GL: dangerball -root \n\
+- GL: dnalogo -root \n\
+@GL_KLUDGE@ GL: engine -root \n\
+@GL_KLUDGE@ GL: flipscreen3d -root \n\
+@GL_KLUDGE@ GL: gltext -root \n\
+@GL_KLUDGE@ GL: menger -root \n\
+@GL_KLUDGE@ GL: molecule -root \n\
+ rotzoomer -root \n\
+ speedmine -root \n\
+@GL_KLUDGE@ GL: starwars -root \n\
+@GL_KLUDGE@ GL: stonerview -root \n\
+ vermiculate -root \n\
+ whirlwindwarp -root \n\
+ zoom -root \n\
+ anemone -root \n\
+ apollonian -root \n\
+@GL_KLUDGE@ GL: boxed -root \n\
+@GL_KLUDGE@ GL: cubenetic -root \n\
+@GL_KLUDGE@ GL: endgame -root \n\
+ euler2d -root \n\
+ fluidballs -root \n\
+@GL_KLUDGE@ GL: flurry -root \n\
+- GL: glblur -root \n\
+@GL_KLUDGE@ GL: glsnake -root \n\
+ halftone -root \n\
+@GL_KLUDGE@ GL: juggler3d -root \n\
+@GL_KLUDGE@ GL: lavalite -root \n\
+- polyominoes -root \n\
+@GL_KLUDGE@ GL: queens -root \n\
+- GL: sballs -root \n\
+@GL_KLUDGE@ GL: spheremonics -root \n\
+- thornbird -root \n\
+ twang -root \n\
+- GL: antspotlight -root \n\
+ apple2 -root \n\
+@GL_KLUDGE@ GL: atunnel -root \n\
+ barcode -root \n\
+@GL_KLUDGE@ GL: blinkbox -root \n\
+@GL_KLUDGE@ GL: blocktube -root \n\
+@GL_KLUDGE@ GL: bouncingcow -root \n\
+ cloudlife -root \n\
+@GL_KLUDGE@ GL: cubestorm -root \n\
+ eruption -root \n\
+@GL_KLUDGE@ GL: flipflop -root \n\
+@GL_KLUDGE@ GL: flyingtoasters -root \n\
+ fontglide -root \n\
+@GL_KLUDGE@ GL: gleidescope -root \n\
+@GL_KLUDGE@ GL: glknots -root \n\
+@GL_KLUDGE@ GL: glmatrix -root \n\
+- GL: glslideshow -root \n\
+@GL_KLUDGE@ GL: hypertorus -root \n\
+- GL: jigglypuff -root \n\
+ metaballs -root \n\
+@GL_KLUDGE@ GL: mirrorblob -root \n\
+ piecewise -root \n\
+@GL_KLUDGE@ GL: polytopes -root \n\
+ pong -root \n\
+ popsquares -root \n\
+@GL_KLUDGE@ GL: surfaces -root \n\
+ xanalogtv -root \n\
+ abstractile -root \n\
+ anemotaxis -root \n\
+- GL: antinspect -root \n\
+ fireworkx -root \n\
+ fuzzyflakes -root \n\
+ interaggregate -root \n\
+ intermomentary -root \n\
+ memscroller -root \n\
+@GL_KLUDGE@ GL: noof -root \n\
+ pacman -root \n\
+@GL_KLUDGE@ GL: pinion -root \n\
+@GL_KLUDGE@ GL: polyhedra -root \n\
+- GL: providence -root \n\
+ substrate -root \n\
+ wormhole -root \n\
+- GL: antmaze -root \n\
+@GL_KLUDGE@ GL: boing -root \n\
+ boxfit -root \n\
+@GL_KLUDGE@ GL: carousel -root \n\
+ celtic -root \n\
+@GL_KLUDGE@ GL: crackberg -root \n\
+@GL_KLUDGE@ GL: cube21 -root \n\
+ fiberlamp -root \n\
+@GL_KLUDGE@ GL: fliptext -root \n\
+@GL_KLUDGE@ GL: glhanoi -root \n\
+@GL_KLUDGE@ GL: tangram -root \n\
+@GL_KLUDGE@ GL: timetunnel -root \n\
+@GL_KLUDGE@ GL: glschool -root \n\
+@GL_KLUDGE@ GL: topblock -root \n\
+@GL_KLUDGE@ GL: cubicgrid -root \n\
+ cwaves -root \n\
+@GL_KLUDGE@ GL: gears -root \n\
+@GL_KLUDGE@ GL: glcells -root \n\
+@GL_KLUDGE@ GL: lockward -root \n\
+ m6502 -root \n\
+@GL_KLUDGE@ GL: moebiusgears -root \n\
+@GL_KLUDGE@ GL: voronoi -root \n\
+@GL_KLUDGE@ GL: hypnowheel -root \n\
+@GL_KLUDGE@ GL: klein -root \n\
+- lcdscrub -root \n\
+@GL_KLUDGE@ GL: photopile -root \n\
+@GL_KLUDGE@ GL: skytentacles -root \n\
+@GL_KLUDGE@ GL: rubikblocks -root \n\
+@GL_KLUDGE@ GL: companioncube -root \n\
+@GL_KLUDGE@ GL: hilbert -root \n\
+@GL_KLUDGE@ GL: tronbit -root \n\
+@GL_KLUDGE@ GL: geodesic -root \n\
+ hexadrop -root \n\
+@GL_KLUDGE@ GL: kaleidocycle -root \n\
+@GL_KLUDGE@ GL: quasicrystal -root \n\
+@GL_KLUDGE@ GL: unknownpleasures -root \n\
+ binaryring -root \n\
+@GL_KLUDGE@ GL: cityflow -root \n\
+@GL_KLUDGE@ GL: geodesicgears -root \n\
+@GL_KLUDGE@ GL: projectiveplane -root \n\
+@GL_KLUDGE@ GL: romanboy -root \n\
+ tessellimage -root \n\
+@GL_KLUDGE@ GL: winduprobot -root \n\
+@GL_KLUDGE@ GL: splitflap -root \n\
+@GL_KLUDGE@ GL: cubestack -root \n\
+@GL_KLUDGE@ GL: cubetwist -root \n\
+@GL_KLUDGE@ GL: discoball -root \n\
+@GL_KLUDGE@ GL: dymaxionmap -root \n\
+@GL_KLUDGE@ GL: energystream -root \n\
+@GL_KLUDGE@ GL: hexstrut -root \n\
+@GL_KLUDGE@ GL: hydrostat -root \n\
+@GL_KLUDGE@ GL: raverhoop -root \n\
+@GL_KLUDGE@ GL: splodesic -root \n\
+@GL_KLUDGE@ GL: unicrud -root \n\
+@GL_KLUDGE@ GL: esper -root \n\
+@GL_KLUDGE@ GL: vigilance -root \n\
+@GL_KLUDGE@ GL: crumbler -root \n\
+ filmleader -root \n\
+ glitchpeg -root \n\
+@GL_KLUDGE@ GL: maze3d -root \n\
+@GL_KLUDGE@ GL: peepers -root \n\
+@GL_KLUDGE@ GL: razzledazzle -root \n\
+ vfeedback -root \n
+
+
+
+!=============================================================================
+!
+! You probably don't want to change anything after this point.
+!
+!=============================================================================
+
+
+XScreenSaver.pointerPollTime: 0:00:05
+XScreenSaver.pointerHysteresis: 10
+XScreenSaver.initialDelay: 0:00:00
+XScreenSaver.windowCreationTimeout: 0:00:30
+XScreenSaver.bourneShell: /bin/sh
+
+
+! Resources for the password and splash-screen dialog boxes of
+! the "xscreensaver" daemon.
+!
+*Dialog.headingFont: -*-helvetica-bold-r-*-*-*-180-*-*-*-*-iso8859-1
+*Dialog.bodyFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1
+*Dialog.labelFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1
+*Dialog.unameFont: -*-helvetica-bold-r-*-*-*-120-*-*-*-*-iso8859-1
+*Dialog.buttonFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1
+*Dialog.dateFont: -*-helvetica-medium-r-*-*-*-80-*-*-*-*-iso8859-1
+
+! Helvetica asterisks look terrible.
+*passwd.passwdFont: -*-courier-medium-r-*-*-*-140-*-*-*-iso8859-1
+
+
+*Dialog.foreground: #000000
+*Dialog.background: #E6E6E6
+*Dialog.Button.foreground: #000000
+*Dialog.Button.background: #F5F5F5
+!*Dialog.Button.pointBackground: #EAEAEA
+!*Dialog.Button.clickBackground: #C3C3C3
+*Dialog.text.foreground: #000000
+*Dialog.text.background: #FFFFFF
+*passwd.thermometer.foreground: #4464AC
+*passwd.thermometer.background: #FFFFFF
+*Dialog.topShadowColor: #FFFFFF
+*Dialog.bottomShadowColor: #CECECE
+*Dialog.logo.width: 210
+*Dialog.logo.height: 210
+*Dialog.internalBorderWidth: 24
+*Dialog.borderWidth: 1
+*Dialog.shadowThickness: 2
+
+*passwd.heading.label: XScreenSaver %s
+*passwd.body.label: This screen is locked.
+*passwd.unlock.label: OK
+*passwd.login.label: New Login
+*passwd.user.label: Username:
+*passwd.thermometer.width: 8
+*passwd.asterisks: True
+*passwd.uname: True
+
+*splash.heading.label: XScreenSaver %s
+*splash.body.label: Copyright \251 1991-2018 by
+*splash.body2.label: Jamie Zawinski <jwz@jwz.org>
+*splash.demo.label: Settings
+*splash.help.label: Help
+
+
+!=============================================================================
+!
+! Pretty names for the hacks that have unusual capitalization.
+!
+!=============================================================================
+
+*hacks.antinspect.name: AntInspect
+*hacks.antmaze.name: AntMaze
+*hacks.antspotlight.name: AntSpotlight
+*hacks.binaryring.name: BinaryRing
+*hacks.blinkbox.name: BlinkBox
+*hacks.blitspin.name: BlitSpin
+*hacks.blocktube.name: BlockTube
+*hacks.bouncingcow.name: BouncingCow
+*hacks.boxfit.name: BoxFit
+*hacks.bsod.name: BSOD
+*hacks.bubble3d.name: Bubble3D
+*hacks.ccurve.name: CCurve
+*hacks.cloudlife.name: CloudLife
+*hacks.companioncube.name: CompanionCube
+*hacks.cubestack.name: CubeStack
+*hacks.cubestorm.name: CubeStorm
+*hacks.cubetwist.name: CubeTwist
+*hacks.cubicgrid.name: CubicGrid
+*hacks.cwaves.name: CWaves
+*hacks.dangerball.name: DangerBall
+*hacks.decayscreen.name: DecayScreen
+*hacks.dnalogo.name: DNA Logo
+*hacks.dymaxionmap.name: DymaxionMap
+*hacks.energystream.name: EnergyStream
+*hacks.euler2d.name: Euler2D
+*hacks.fadeplot.name: FadePlot
+*hacks.filmleader.name: FilmLeader
+*hacks.flipflop.name: FlipFlop
+*hacks.flipscreen3d.name: FlipScreen3D
+*hacks.fliptext.name: FlipText
+*hacks.fluidballs.name: FluidBalls
+*hacks.flyingtoasters.name: FlyingToasters
+*hacks.fontglide.name: FontGlide
+*hacks.fuzzyflakes.name: FuzzyFlakes
+*hacks.geodesicgears.name: GeodesicGears
+*hacks.gflux.name: GFlux
+*hacks.gleidescope.name: Gleidescope
+*hacks.glforestfire.name: GLForestFire
+*hacks.glitchpeg.name: GlitchPEG
+*hacks.hyperball.name: HyperBall
+*hacks.hypercube.name: HyperCube
+*hacks.ifs.name: IFS
+*hacks.imsmap.name: IMSMap
+*hacks.jigglypuff.name: JigglyPuff
+*hacks.juggler3d.name: Juggler3D
+*hacks.lcdscrub.name: LCDscrub
+*hacks.lmorph.name: LMorph
+*hacks.m6502.name: m6502
+*hacks.maze3d.name: Maze3D
+*hacks.memscroller.name: MemScroller
+*hacks.metaballs.name: MetaBalls
+*hacks.mirrorblob.name: MirrorBlob
+*hacks.moebiusgears.name: MoebiusGears
+*hacks.morph3d.name: Morph3D
+*hacks.nerverot.name: NerveRot
+*hacks.noseguy.name: NoseGuy
+*hacks.popsquares.name: PopSquares
+*hacks.projectiveplane.name:ProjectivePlane
+*hacks.quasicrystal.name: QuasiCrystal
+*hacks.raverhoop.name: RaverHoop
+*hacks.razzledazzle.name: RazzleDazzle
+*hacks.rd-bomb.name: RDbomb
+*hacks.rdbomb.name: RDbomb
+*hacks.romanboy.name: RomanBoy
+*hacks.rotzoomer.name: RotZoomer
+*hacks.rubikblocks.name: RubikBlocks
+*hacks.sballs.name: SBalls
+*hacks.shadebobs.name: ShadeBobs
+*hacks.sierpinski3d.name: Sierpinski3D
+*hacks.skytentacles.name: SkyTentacles
+*hacks.slidescreen.name: SlideScreen
+*hacks.speedmine.name: SpeedMine
+*hacks.splitflap.name: SplitFlap
+*hacks.starwars.name: StarWars
+*hacks.stonerview.name: StonerView
+*hacks.t3d.name: T3D
+*hacks.testx11.name: TestX11
+*hacks.timetunnel.name: TimeTunnel
+*hacks.topblock.name: TopBlock
+*hacks.tronbit.name: TronBit
+*hacks.unknownpleasures.name:UnknownPleasures
+*hacks.vfeedback.name: VFeedback
+*hacks.vidwhacker.name: VidWhacker
+*hacks.webcollage.name: WebCollage
+*hacks.whirlwindwarp.name: WhirlWindWarp
+*hacks.winduprobot.name: WindupRobot
+*hacks.xanalogtv.name: XAnalogTV
+*hacks.xrayswarm.name: XRaySwarm
+
+! obsolete, but still used by xscreensaver-demo-Xm.
+*hacks.documentation.isInstalled: True
+
+! (xrdb prevention kludge: whole file) */
diff --git a/driver/XScreenSaver_Xm_ad.h b/driver/XScreenSaver_Xm_ad.h
new file mode 100644
index 0000000..371e0a2
--- /dev/null
+++ b/driver/XScreenSaver_Xm_ad.h
@@ -0,0 +1,108 @@
+"*fontList: *-helvetica-medium-r-*-*-*-120-*-*-*-iso8859-1",
+"*demoDialog*label1.fontList: *-helvetica-medium-r-*-*-*-140-*-*-*-iso8859-1",
+"*cmdText.fontList: *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1",
+"*label0.fontList: *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1",
+"XScreenSaver*doc.fontList: *-helvetica-medium-r-*-*-*-100-*-*-*-iso8859-1",
+"*foreground: #000000",
+"*background: #C0C0C0",
+"*XmTextField.foreground: #000000",
+"*XmTextField.background: #FFFFFF",
+"*list.foreground: #000000",
+"*list.background: #FFFFFF",
+"*ApplicationShell.title: XScreenSaver",
+"*warning.title: XScreenSaver",
+"*warning_popup.title: XScreenSaver",
+"*allowShellResize: True",
+"*autoUnmanage: False",
+"*menubar*file.labelString: File",
+"*menubar*file.mnemonic: F",
+"*file.blank.labelString: Blank Screen Now",
+"*file.blank.mnemonic: B",
+"*file.lock.labelString: Lock Screen Now",
+"*file.lock.mnemonic: L",
+"*file.kill.labelString: Kill Daemon",
+"*file.kill.mnemonic: K",
+"*file.restart.labelString: Restart Daemon",
+"*file.restart.mnemonic: R",
+"*file.exit.labelString: Exit",
+"*file.exit.mnemonic: E",
+"*menubar*edit.labelString: Edit",
+"*menubar*edit.mnemonic: E",
+"*edit.cut.labelString: Cut",
+"*edit.cut.mnemonic: u",
+"*edit.copy.labelString: Copy",
+"*edit.copy.mnemonic: C",
+"*edit.paste.labelString: Paste",
+"*edit.paste.mnemonic: P",
+"*menubar*help.labelString: Help",
+"*menubar*help.mnemonic: H",
+"*help.about.labelString: About...",
+"*help.about.mnemonic: A",
+"*help.docMenu.labelString: Documentation...",
+"*help.docMenu.mnemonic: D",
+"*demoTab.marginWidth: 10",
+"*optionsTab.marginWidth: 10",
+"*XmScrolledWindow.topOffset: 10",
+"*XmScrolledWindow.leftOffset: 10",
+"*demoTab.topOffset: 4",
+"*form1.bottomOffset: 10",
+"*form3.leftOffset: 10",
+"*form3.rightOffset: 10",
+"*frame.topOffset: 10",
+"*frame.bottomOffset: 10",
+"*enabled.topOffset: 10",
+"*visLabel.topOffset: 10",
+"*combo.topOffset: 10",
+"*form4.bottomOffset: 4",
+"*hr.bottomOffset: 4",
+"*XmComboBox.marginWidth: 0",
+"*XmComboBox.marginHeight: 0",
+"*demo.marginWidth: 30",
+"*demo.marginHeight: 4",
+"*man.marginWidth: 10",
+"*man.marginHeight: 4",
+"*down.leftOffset: 40",
+"*down.marginWidth: 4",
+"*down.marginHeight: 4",
+"*up.marginWidth: 4",
+"*up.marginHeight: 4",
+"*frame.traversalOn: False",
+"*list.automaticSelection: True",
+"*list.visibleItemCount: 20",
+"*doc.columns: 60",
+"*combo.columns: 11",
+"*demoTab.labelString: Graphics Demos",
+"*optionsTab.labelString: Screensaver Options",
+"*down.labelString: \\\\/ ",
+"*up.labelString: /\\\\ ",
+"*frameLabel.labelString: ",
+"*cmdLabel.labelString: Command Line:",
+"*cmdLabel.alignment: ALIGNMENT_BEGINNING",
+"*enabled.labelString: Enabled",
+"*visLabel.labelString: Visual:",
+"*visLabel.alignment: ALIGNMENT_END",
+"*visLabel.leftOffset: 20",
+"*demo.labelString: Demo",
+"*man.labelString: Documentation...",
+"*done.labelString: Quit",
+"*preferencesLabel.labelString: XScreenSaver Parameters",
+"*timeoutLabel.labelString: Saver Timeout",
+"*cycleLabel.labelString: Cycle Timeout",
+"*fadeSecondsLabel.labelString: Fade Duration",
+"*fadeTicksLabel.labelString: Fade Ticks",
+"*lockLabel.labelString: Lock Timeout",
+"*passwdLabel.labelString: Password Timeout",
+"*preferencesForm*XmTextField.columns: 8",
+"*verboseToggle.labelString: Verbose",
+"*cmapToggle.labelString: Install Colormap",
+"*fadeToggle.labelString: Fade Colormap",
+"*unfadeToggle.labelString: Unfade Colormap",
+"*lockToggle.labelString: Require Password",
+"*OK.marginWidth: 30",
+"*OK.marginHeight: 4",
+"*OK.leftOffset: 10",
+"*OK.bottomOffset: 10",
+"*Cancel.marginWidth: 30",
+"*Cancel.marginHeight: 4",
+"*Cancel.rightOffset: 10",
+"*Cancel.bottomOffset: 10",
diff --git a/driver/XScreenSaver_ad.h b/driver/XScreenSaver_ad.h
new file mode 100644
index 0000000..cd4976e
--- /dev/null
+++ b/driver/XScreenSaver_ad.h
@@ -0,0 +1,416 @@
+"#error Do not run app-defaults files through xrdb!",
+"#error That does not do what you might expect.",
+"#error Put this file in /usr/lib/X11/app-defaults/XScreenSaver instead.",
+"*mode: random",
+"*timeout: 0:10:00",
+"*cycle: 0:10:00",
+"*lockTimeout: 0:00:00",
+"*passwdTimeout: 0:00:30",
+"*dpmsEnabled: False",
+"*dpmsQuickoffEnabled: False",
+"*dpmsStandby: 2:00:00",
+"*dpmsSuspend: 2:00:00",
+"*dpmsOff: 4:00:00",
+"*grabDesktopImages: True",
+"*grabVideoFrames: False",
+"*chooseRandomImages: True",
+"*imageDirectory: /Library/Desktop Pictures/",
+"*nice: 10",
+"*memoryLimit: 0",
+"*lock: False",
+"*verbose: False",
+"*timestamp: True",
+"*fade: True",
+"*unfade: False",
+"*fadeSeconds: 0:00:03",
+"*fadeTicks: 20",
+"*splash: True",
+"*splashDuration: 0:00:05",
+"*visualID: default",
+"*captureStderr: True",
+"*ignoreUninstalledPrograms: False",
+"*authWarningSlack: 20",
+"*textMode: file",
+"*textLiteral: XScreenSaver",
+"*textFile: ",
+"*textProgram: fortune",
+"*textURL: https://en.wikipedia.org/w/index.php?title=Special:NewPages&feed=rss",
+"*overlayTextForeground: #FFFF00",
+"*overlayTextBackground: #000000",
+"*overlayStderr: True",
+"*font: *-medium-r-*-140-*-m-*",
+"*sgiSaverExtension: True",
+"*xidleExtension: True",
+"*procInterrupts: True",
+"*xinputExtensionDev: False",
+"GetViewPortIsFullOfLies: False",
+"*demoCommand: xscreensaver-demo",
+"*prefsCommand: xscreensaver-demo -prefs",
+"*helpURL: https://www.jwz.org/xscreensaver/man.html",
+"*loadURL: firefox '%s' || mozilla '%s' || netscape '%s'",
+"*manualCommand: xterm -sb -fg black -bg gray75 -T '%s manual' \
+ -e /bin/sh -c 'man \"%s\" ; read foo'",
+"*dateFormat: %d-%b-%y (%a); %I:%M %p",
+"*installColormap: True",
+"*programs: \
+ maze -root \\n\
+ GL: superquadrics -root \\n\
+ attraction -root \\n\
+ blitspin -root \\n\
+ greynetic -root \\n\
+ helix -root \\n\
+ hopalong -root \\n\
+ imsmap -root \\n\
+- noseguy -root \\n\
+- pyro -root \\n\
+ qix -root \\n\
+- rocks -root \\n\
+ rorschach -root \\n\
+ decayscreen -root \\n\
+ flame -root \\n\
+ halo -root \\n\
+ slidescreen -root \\n\
+ pedal -root \\n\
+ bouboule -root \\n\
+- braid -root \\n\
+ coral -root \\n\
+ deco -root \\n\
+ drift -root \\n\
+- fadeplot -root \\n\
+ galaxy -root \\n\
+ goop -root \\n\
+ grav -root \\n\
+ ifs -root \\n\
+ GL: jigsaw -root \\n\
+ julia -root \\n\
+- kaleidescope -root \\n\
+ GL: moebius -root \\n\
+ moire -root \\n\
+ GL: morph3d -root \\n\
+ mountain -root \\n\
+ munch -root \\n\
+ penrose -root \\n\
+ GL: pipes -root \\n\
+ rd-bomb -root \\n\
+ GL: rubik -root \\n\
+- sierpinski -root \\n\
+ slip -root \\n\
+ GL: sproingies -root \\n\
+ starfish -root \\n\
+ strange -root \\n\
+ swirl -root \\n\
+ triangle -root \\n\
+ xjack -root \\n\
+ xlyap -root \\n\
+ GL: atlantis -root \\n\
+ bsod -root \\n\
+ GL: bubble3d -root \\n\
+ GL: cage -root \\n\
+- crystal -root \\n\
+ cynosure -root \\n\
+ discrete -root \\n\
+ distort -root \\n\
+ epicycle -root \\n\
+ flow -root \\n\
+ GL: glplanet -root \\n\
+ interference -root \\n\
+ kumppa -root \\n\
+ GL: lament -root \\n\
+ moire2 -root \\n\
+ GL: sonar -root \\n\
+ GL: stairs -root \\n\
+ truchet -root \\n\
+- vidwhacker -root \\n\
+ blaster -root \\n\
+ bumps -root \\n\
+ ccurve -root \\n\
+ compass -root \\n\
+ deluxe -root \\n\
+- demon -root \\n\
+ GL: extrusion -root \\n\
+- loop -root \\n\
+ penetrate -root \\n\
+ petri -root \\n\
+ phosphor -root \\n\
+ GL: pulsar -root \\n\
+ ripples -root \\n\
+ shadebobs -root \\n\
+ GL: sierpinski3d -root \\n\
+ spotlight -root \\n\
+ squiral -root \\n\
+ wander -root \\n\
+- webcollage -root \\n\
+ xflame -root \\n\
+ xmatrix -root \\n\
+ GL: gflux -root \\n\
+- nerverot -root \\n\
+ xrayswarm -root \\n\
+ xspirograph -root \\n\
+ GL: circuit -root \\n\
+ GL: dangerball -root \\n\
+- GL: dnalogo -root \\n\
+ GL: engine -root \\n\
+ GL: flipscreen3d -root \\n\
+ GL: gltext -root \\n\
+ GL: menger -root \\n\
+ GL: molecule -root \\n\
+ rotzoomer -root \\n\
+ speedmine -root \\n\
+ GL: starwars -root \\n\
+ GL: stonerview -root \\n\
+ vermiculate -root \\n\
+ whirlwindwarp -root \\n\
+ zoom -root \\n\
+ anemone -root \\n\
+ apollonian -root \\n\
+ GL: boxed -root \\n\
+ GL: cubenetic -root \\n\
+ GL: endgame -root \\n\
+ euler2d -root \\n\
+ fluidballs -root \\n\
+ GL: flurry -root \\n\
+- GL: glblur -root \\n\
+ GL: glsnake -root \\n\
+ halftone -root \\n\
+ GL: juggler3d -root \\n\
+ GL: lavalite -root \\n\
+- polyominoes -root \\n\
+ GL: queens -root \\n\
+- GL: sballs -root \\n\
+ GL: spheremonics -root \\n\
+- thornbird -root \\n\
+ twang -root \\n\
+- GL: antspotlight -root \\n\
+ apple2 -root \\n\
+ GL: atunnel -root \\n\
+ barcode -root \\n\
+ GL: blinkbox -root \\n\
+ GL: blocktube -root \\n\
+ GL: bouncingcow -root \\n\
+ cloudlife -root \\n\
+ GL: cubestorm -root \\n\
+ eruption -root \\n\
+ GL: flipflop -root \\n\
+ GL: flyingtoasters -root \\n\
+ fontglide -root \\n\
+ GL: gleidescope -root \\n\
+ GL: glknots -root \\n\
+ GL: glmatrix -root \\n\
+- GL: glslideshow -root \\n\
+ GL: hypertorus -root \\n\
+- GL: jigglypuff -root \\n\
+ metaballs -root \\n\
+ GL: mirrorblob -root \\n\
+ piecewise -root \\n\
+ GL: polytopes -root \\n\
+ pong -root \\n\
+ popsquares -root \\n\
+ GL: surfaces -root \\n\
+ xanalogtv -root \\n\
+ abstractile -root \\n\
+ anemotaxis -root \\n\
+- GL: antinspect -root \\n\
+ fireworkx -root \\n\
+ fuzzyflakes -root \\n\
+ interaggregate -root \\n\
+ intermomentary -root \\n\
+ memscroller -root \\n\
+ GL: noof -root \\n\
+ pacman -root \\n\
+ GL: pinion -root \\n\
+ GL: polyhedra -root \\n\
+- GL: providence -root \\n\
+ substrate -root \\n\
+ wormhole -root \\n\
+- GL: antmaze -root \\n\
+ GL: boing -root \\n\
+ boxfit -root \\n\
+ GL: carousel -root \\n\
+ celtic -root \\n\
+ GL: crackberg -root \\n\
+ GL: cube21 -root \\n\
+ fiberlamp -root \\n\
+ GL: fliptext -root \\n\
+ GL: glhanoi -root \\n\
+ GL: tangram -root \\n\
+ GL: timetunnel -root \\n\
+ GL: glschool -root \\n\
+ GL: topblock -root \\n\
+ GL: cubicgrid -root \\n\
+ cwaves -root \\n\
+ GL: gears -root \\n\
+ GL: glcells -root \\n\
+ GL: lockward -root \\n\
+ m6502 -root \\n\
+ GL: moebiusgears -root \\n\
+ GL: voronoi -root \\n\
+ GL: hypnowheel -root \\n\
+ GL: klein -root \\n\
+- lcdscrub -root \\n\
+ GL: photopile -root \\n\
+ GL: skytentacles -root \\n\
+ GL: rubikblocks -root \\n\
+ GL: companioncube -root \\n\
+ GL: hilbert -root \\n\
+ GL: tronbit -root \\n\
+ GL: geodesic -root \\n\
+ hexadrop -root \\n\
+ GL: kaleidocycle -root \\n\
+ GL: quasicrystal -root \\n\
+ GL: unknownpleasures -root \\n\
+ binaryring -root \\n\
+ GL: cityflow -root \\n\
+ GL: geodesicgears -root \\n\
+ GL: projectiveplane -root \\n\
+ GL: romanboy -root \\n\
+ tessellimage -root \\n\
+ GL: winduprobot -root \\n\
+ GL: splitflap -root \\n\
+ GL: cubestack -root \\n\
+ GL: cubetwist -root \\n\
+ GL: discoball -root \\n\
+ GL: dymaxionmap -root \\n\
+ GL: energystream -root \\n\
+ GL: hexstrut -root \\n\
+ GL: hydrostat -root \\n\
+ GL: raverhoop -root \\n\
+ GL: splodesic -root \\n\
+ GL: unicrud -root \\n\
+ GL: esper -root \\n\
+ GL: vigilance -root \\n\
+ GL: crumbler -root \\n\
+ filmleader -root \\n\
+ glitchpeg -root \\n\
+ GL: maze3d -root \\n\
+ GL: peepers -root \\n\
+ GL: razzledazzle -root \\n\
+ vfeedback -root \\n",
+"XScreenSaver.pointerPollTime: 0:00:05",
+"XScreenSaver.pointerHysteresis: 10",
+"XScreenSaver.initialDelay: 0:00:00",
+"XScreenSaver.windowCreationTimeout: 0:00:30",
+"XScreenSaver.bourneShell: /bin/sh",
+"*Dialog.headingFont: -*-helvetica-bold-r-*-*-*-180-*-*-*-*-iso8859-1",
+"*Dialog.bodyFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1",
+"*Dialog.labelFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1",
+"*Dialog.unameFont: -*-helvetica-bold-r-*-*-*-120-*-*-*-*-iso8859-1",
+"*Dialog.buttonFont: -*-helvetica-bold-r-*-*-*-140-*-*-*-*-iso8859-1",
+"*Dialog.dateFont: -*-helvetica-medium-r-*-*-*-80-*-*-*-*-iso8859-1",
+"*passwd.passwdFont: -*-courier-medium-r-*-*-*-140-*-*-*-iso8859-1",
+"*Dialog.foreground: #000000",
+"*Dialog.background: #E6E6E6",
+"*Dialog.Button.foreground: #000000",
+"*Dialog.Button.background: #F5F5F5",
+"*Dialog.text.foreground: #000000",
+"*Dialog.text.background: #FFFFFF",
+"*passwd.thermometer.foreground: #4464AC",
+"*passwd.thermometer.background: #FFFFFF",
+"*Dialog.topShadowColor: #FFFFFF",
+"*Dialog.bottomShadowColor: #CECECE",
+"*Dialog.logo.width: 210",
+"*Dialog.logo.height: 210",
+"*Dialog.internalBorderWidth: 24",
+"*Dialog.borderWidth: 1",
+"*Dialog.shadowThickness: 2",
+"*passwd.heading.label: XScreenSaver %s",
+"*passwd.body.label: This screen is locked.",
+"*passwd.unlock.label: OK",
+"*passwd.login.label: New Login",
+"*passwd.user.label: Username:",
+"*passwd.thermometer.width: 8",
+"*passwd.asterisks: True",
+"*passwd.uname: True",
+"*splash.heading.label: XScreenSaver %s",
+"*splash.body.label: Copyright \\251 1991-2018 by",
+"*splash.body2.label: Jamie Zawinski <jwz@jwz.org>",
+"*splash.demo.label: Settings",
+"*splash.help.label: Help",
+"*hacks.antinspect.name: AntInspect",
+"*hacks.antmaze.name: AntMaze",
+"*hacks.antspotlight.name: AntSpotlight",
+"*hacks.binaryring.name: BinaryRing",
+"*hacks.blinkbox.name: BlinkBox",
+"*hacks.blitspin.name: BlitSpin",
+"*hacks.blocktube.name: BlockTube",
+"*hacks.bouncingcow.name: BouncingCow",
+"*hacks.boxfit.name: BoxFit",
+"*hacks.bsod.name: BSOD",
+"*hacks.bubble3d.name: Bubble3D",
+"*hacks.ccurve.name: CCurve",
+"*hacks.cloudlife.name: CloudLife",
+"*hacks.companioncube.name: CompanionCube",
+"*hacks.cubestack.name: CubeStack",
+"*hacks.cubestorm.name: CubeStorm",
+"*hacks.cubetwist.name: CubeTwist",
+"*hacks.cubicgrid.name: CubicGrid",
+"*hacks.cwaves.name: CWaves",
+"*hacks.dangerball.name: DangerBall",
+"*hacks.decayscreen.name: DecayScreen",
+"*hacks.dnalogo.name: DNA Logo",
+"*hacks.dymaxionmap.name: DymaxionMap",
+"*hacks.energystream.name: EnergyStream",
+"*hacks.euler2d.name: Euler2D",
+"*hacks.fadeplot.name: FadePlot",
+"*hacks.filmleader.name: FilmLeader",
+"*hacks.flipflop.name: FlipFlop",
+"*hacks.flipscreen3d.name: FlipScreen3D",
+"*hacks.fliptext.name: FlipText",
+"*hacks.fluidballs.name: FluidBalls",
+"*hacks.flyingtoasters.name: FlyingToasters",
+"*hacks.fontglide.name: FontGlide",
+"*hacks.fuzzyflakes.name: FuzzyFlakes",
+"*hacks.geodesicgears.name: GeodesicGears",
+"*hacks.gflux.name: GFlux",
+"*hacks.gleidescope.name: Gleidescope",
+"*hacks.glforestfire.name: GLForestFire",
+"*hacks.glitchpeg.name: GlitchPEG",
+"*hacks.hyperball.name: HyperBall",
+"*hacks.hypercube.name: HyperCube",
+"*hacks.ifs.name: IFS",
+"*hacks.imsmap.name: IMSMap",
+"*hacks.jigglypuff.name: JigglyPuff",
+"*hacks.juggler3d.name: Juggler3D",
+"*hacks.lcdscrub.name: LCDscrub",
+"*hacks.lmorph.name: LMorph",
+"*hacks.m6502.name: m6502",
+"*hacks.maze3d.name: Maze3D",
+"*hacks.memscroller.name: MemScroller",
+"*hacks.metaballs.name: MetaBalls",
+"*hacks.mirrorblob.name: MirrorBlob",
+"*hacks.moebiusgears.name: MoebiusGears",
+"*hacks.morph3d.name: Morph3D",
+"*hacks.nerverot.name: NerveRot",
+"*hacks.noseguy.name: NoseGuy",
+"*hacks.popsquares.name: PopSquares",
+"*hacks.projectiveplane.name:ProjectivePlane",
+"*hacks.quasicrystal.name: QuasiCrystal",
+"*hacks.raverhoop.name: RaverHoop",
+"*hacks.razzledazzle.name: RazzleDazzle",
+"*hacks.rd-bomb.name: RDbomb",
+"*hacks.rdbomb.name: RDbomb",
+"*hacks.romanboy.name: RomanBoy",
+"*hacks.rotzoomer.name: RotZoomer",
+"*hacks.rubikblocks.name: RubikBlocks",
+"*hacks.sballs.name: SBalls",
+"*hacks.shadebobs.name: ShadeBobs",
+"*hacks.sierpinski3d.name: Sierpinski3D",
+"*hacks.skytentacles.name: SkyTentacles",
+"*hacks.slidescreen.name: SlideScreen",
+"*hacks.speedmine.name: SpeedMine",
+"*hacks.splitflap.name: SplitFlap",
+"*hacks.starwars.name: StarWars",
+"*hacks.stonerview.name: StonerView",
+"*hacks.t3d.name: T3D",
+"*hacks.testx11.name: TestX11",
+"*hacks.timetunnel.name: TimeTunnel",
+"*hacks.topblock.name: TopBlock",
+"*hacks.tronbit.name: TronBit",
+"*hacks.unknownpleasures.name:UnknownPleasures",
+"*hacks.vfeedback.name: VFeedback",
+"*hacks.vidwhacker.name: VidWhacker",
+"*hacks.webcollage.name: WebCollage",
+"*hacks.whirlwindwarp.name: WhirlWindWarp",
+"*hacks.winduprobot.name: WindupRobot",
+"*hacks.xanalogtv.name: XAnalogTV",
+"*hacks.xrayswarm.name: XRaySwarm",
+"*hacks.documentation.isInstalled: True",
diff --git a/driver/auth.h b/driver/auth.h
new file mode 100644
index 0000000..65e00f3
--- /dev/null
+++ b/driver/auth.h
@@ -0,0 +1,54 @@
+/* auth.h --- Providing authentication mechanisms.
+ *
+ * (c) 2007, Quest Software, Inc. All rights reserved.
+ *
+ * This file is part of XScreenSaver,
+ * Copyright (c) 1993-2004 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+#ifndef XSS_AUTH_H
+#define XSS_AUTH_H
+
+#include "types.h"
+
+#undef Bool
+#undef True
+#undef False
+#define Bool int
+#define True 1
+#define False 0
+
+struct auth_message {
+ enum {
+ AUTH_MSGTYPE_INFO,
+ AUTH_MSGTYPE_ERROR,
+ AUTH_MSGTYPE_PROMPT_NOECHO,
+ AUTH_MSGTYPE_PROMPT_ECHO
+ } type;
+ const char *msg;
+};
+
+struct auth_response {
+ char *response;
+};
+
+int
+gui_auth_conv(int num_msg,
+ const struct auth_message auth_msgs[],
+ struct auth_response **resp,
+ saver_info *si);
+
+void
+xss_authenticate(saver_info *si, Bool verbose_p);
+
+void
+auth_finished_cb (saver_info *si);
+
+#endif
diff --git a/driver/compile_axp.com b/driver/compile_axp.com
new file mode 100644
index 0000000..d6ed0e8
--- /dev/null
+++ b/driver/compile_axp.com
@@ -0,0 +1,15 @@
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) DEMO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) DIALOGS-XM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) LOCK.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) PASSWD.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) STDERR.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,NO_SETUID)/INCL=([],[-],[-.UTILS]) SUBPROCS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) TIMERS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) WINDOWS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) XSCREENSAVER-COMMAND.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,NO_SETUID)/INCL=([],[-],[-.UTILS]) XSCREENSAVER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) XSET.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-GETPWNAM.C
+$!!! CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) GETPWUID.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-HPWD.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-VALIDATE.C
diff --git a/driver/compile_decc.com b/driver/compile_decc.com
new file mode 100644
index 0000000..d6ed0e8
--- /dev/null
+++ b/driver/compile_decc.com
@@ -0,0 +1,15 @@
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) DEMO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) DIALOGS-XM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) LOCK.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) PASSWD.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) STDERR.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,NO_SETUID)/INCL=([],[-],[-.UTILS]) SUBPROCS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) TIMERS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) WINDOWS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) XSCREENSAVER-COMMAND.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,NO_SETUID)/INCL=([],[-],[-.UTILS]) XSCREENSAVER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) XSET.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-GETPWNAM.C
+$!!! CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) GETPWUID.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-HPWD.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-VALIDATE.C
diff --git a/driver/demo-Gtk-conf.c b/driver/demo-Gtk-conf.c
new file mode 100644
index 0000000..bac6ecc
--- /dev/null
+++ b/driver/demo-Gtk-conf.c
@@ -0,0 +1,1998 @@
+/* demo-Gtk-conf.c --- implements the dynamic configuration dialogs.
+ * xscreensaver, Copyright (c) 2001-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#if defined(HAVE_GTK) && defined(HAVE_XML) /* whole file */
+
+#include <xscreensaver-intl.h>
+
+#include <stdlib.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+/*
+ * Both of these workarounds can be removed when support for ancient
+ * libxml versions is dropped. versions 1.8.11 and 2.3.4 provide the
+ * correct fixes.
+ */
+
+/*
+ * Older libxml polluted the global headerspace, while libxml2 fixed
+ * this. To support both old and recent libxmls, we have this
+ * workaround.
+ */
+#ifdef HAVE_OLD_XML_HEADERS
+# include <parser.h>
+#else /* ! HAVE_OLD_XML_HEADERS */
+# include <libxml/parser.h>
+#endif /* HAVE_OLD_XML_HEADERS */
+
+/*
+ * handle non-native spelling mistakes in earlier versions and provide
+ * the source-compat fix for this that may not be in older versions.
+ */
+#ifndef xmlChildrenNode
+# if LIBXML_VERSION >= 20000
+# define xmlChildrenNode children
+# define xmlRootNode children
+# else
+# define xmlChildrenNode childs
+# define xmlRootNode root
+# endif /* LIBXML_VERSION */
+#endif /* xmlChildrenNode */
+
+#include <gtk/gtk.h>
+
+#include "demo-Gtk-conf.h"
+
+/* Deal with deprecation of direct access to struct fields on the way to GTK3
+ See http://live.gnome.org/GnomeGoals/UseGseal
+ */
+#if GTK_CHECK_VERSION(2,14,0)
+# define GET_PARENT(w) gtk_widget_get_parent (w)
+# define GET_ADJ_VALUE(a) gtk_adjustment_get_value (a)
+# define GET_ADJ_UPPER(a) gtk_adjustment_get_upper (a)
+# define GET_ADJ_LOWER(a) gtk_adjustment_get_lower (a)
+#else
+# define GET_PARENT(w) ((w)->parent)
+# define GET_ADJ_VALUE(a) ((a)->value)
+# define GET_ADJ_UPPER(a) ((a)->upper)
+# define GET_ADJ_LOWER(a) ((a)->lower)
+#endif
+
+
+extern const char *blurb (void);
+
+
+const char *hack_configuration_path = HACK_CONFIGURATION_PATH;
+
+static gboolean debug_p = FALSE;
+
+
+#define MIN_SLIDER_WIDTH 150
+#define MIN_SPINBUTTON_WIDTH 48
+#define MIN_LABEL_WIDTH 70
+
+
+typedef enum {
+ COMMAND,
+ FAKE,
+ DESCRIPTION,
+ FAKEPREVIEW,
+ STRING,
+ FILENAME,
+ SLIDER,
+ SPINBUTTON,
+ BOOLEAN,
+ SELECT,
+ SELECT_OPTION
+} parameter_type;
+
+
+typedef struct {
+
+ parameter_type type;
+
+ xmlChar *id; /* widget name */
+ xmlChar *label; /* heading label, or null */
+
+ /* command, fake, description, fakepreview, string, file
+ */
+ xmlChar *string; /* file name, description, whatever. */
+
+ /* slider, spinbutton
+ */
+ xmlChar *low_label; /* label for the left side */
+ xmlChar *high_label; /* label for the right side */
+ float low; /* minimum value */
+ float high; /* maximum value */
+ float value; /* default value */
+ gboolean integer_p; /* whether the range is integral, or real */
+ xmlChar *arg; /* command-line option to set (substitute "%") */
+ gboolean invert_p; /* whether to flip the value and pretend the
+ range goes from hi-low instead of low-hi. */
+
+ /* boolean, select-option
+ */
+ xmlChar *arg_set; /* command-line option to set for "yes", or null */
+ xmlChar *arg_unset; /* command-line option to set for "no", or null */
+
+ /* select
+ */
+ GList *options;
+
+ /* select_option
+ */
+ GtkWidget *widget;
+
+} parameter;
+
+
+static parameter *make_select_option (const char *file, xmlNodePtr);
+static void make_parameter_widget (const char *filename,
+ parameter *, GtkWidget *);
+static void browse_button_cb (GtkButton *button, gpointer user_data);
+
+
+/* Frees the parameter object and all strings and sub-parameters.
+ Does not destroy the widget, if any.
+ */
+static void
+free_parameter (parameter *p)
+{
+ GList *rest;
+ if (p->id) free (p->id);
+ if (p->label) free (p->label);
+ if (p->string) free (p->string);
+ if (p->low_label) free (p->low_label);
+ if (p->high_label) free (p->high_label);
+ if (p->arg) free (p->arg);
+ if (p->arg_set) free (p->arg_set);
+ if (p->arg_unset) free (p->arg_unset);
+
+ for (rest = p->options; rest; rest = rest->next)
+ if (rest->data)
+ free_parameter ((parameter *) rest->data);
+
+ memset (p, ~0, sizeof(*p));
+ free (p);
+}
+
+
+/* Debugging: dumps out a `parameter' structure.
+ */
+#if 0
+void
+describe_parameter (FILE *out, parameter *p)
+{
+ fprintf (out, "<");
+ switch (p->type)
+ {
+ case COMMAND: fprintf (out, "command"); break;
+ case FAKE: fprintf (out, "fake"); break;
+ case DESCRIPTION: fprintf (out, "_description"); break;
+ case FAKEPREVIEW: fprintf (out, "fakepreview"); break;
+ case STRING: fprintf (out, "string"); break;
+ case FILENAME: fprintf (out, "filename"); break;
+ case SLIDER: fprintf (out, "number type=\"slider\""); break;
+ case SPINBUTTON: fprintf (out, "number type=\"spinbutton\""); break;
+ case BOOLEAN: fprintf (out, "boolean"); break;
+ case SELECT: fprintf (out, "select"); break;
+ default: abort(); break;
+ }
+ if (p->id) fprintf (out, " id=\"%s\"", p->id);
+ if (p->label) fprintf (out, " _label=\"%s\"", p->label);
+ if (p->string && p->type != DESCRIPTION)
+ fprintf (out, " string=\"%s\"", p->string);
+ if (p->low_label) fprintf (out, " _low-label=\"%s\"", p->low_label);
+ if (p->high_label) fprintf (out, " _high-label=\"%s\"", p->high_label);
+ if (p->low) fprintf (out, " low=\"%.2f\"", p->low);
+ if (p->high) fprintf (out, " high=\"%.2f\"", p->high);
+ if (p->value) fprintf (out, " default=\"%.2f\"", p->value);
+ if (p->arg) fprintf (out, " arg=\"%s\"", p->arg);
+ if (p->invert_p) fprintf (out, " convert=\"invert\"");
+ if (p->arg_set) fprintf (out, " arg-set=\"%s\"", p->arg_set);
+ if (p->arg_unset) fprintf (out, " arg-unset=\"%s\"", p->arg_unset);
+ fprintf (out, ">\n");
+
+ if (p->type == SELECT)
+ {
+ GList *opt;
+ for (opt = p->options; opt; opt = opt->next)
+ {
+ parameter *o = (parameter *) opt->data;
+ if (o->type != SELECT_OPTION) abort();
+ fprintf (out, " <option");
+ if (o->id) fprintf (out, " id=\"%s\"", o->id);
+ if (o->label) fprintf (out, " _label=\"%s\"", o->label);
+ if (o->arg_set) fprintf (out, " arg-set=\"%s\"", o->arg_set);
+ if (o->arg_unset) fprintf (out, " arg-unset=\"%s\"", o->arg_unset);
+ fprintf (out, ">\n");
+ }
+ fprintf (out, "</select>\n");
+ }
+ else if (p->type == DESCRIPTION)
+ {
+ if (p->string)
+ fprintf (out, " %s\n", p->string);
+ fprintf (out, "</_description>\n");
+ }
+}
+#endif /* 0 */
+
+
+/* Like xmlGetProp() but parses a float out of the string.
+ If the number was expressed as a float and not an integer
+ (that is, the string contained a decimal point) then
+ `floatp' is set to TRUE. Otherwise, it is unchanged.
+ */
+static float
+xml_get_float (xmlNodePtr node, const xmlChar *name, gboolean *floatpP)
+{
+ const char *s = (char *) xmlGetProp (node, name);
+ float f;
+ char c;
+ if (!s || 1 != sscanf (s, "%f %c", &f, &c))
+ return 0;
+ else
+ {
+ if (strchr (s, '.')) *floatpP = TRUE;
+ return f;
+ }
+}
+
+
+static void sanity_check_parameter (const char *filename,
+ const xmlChar *node_name,
+ parameter *p);
+static void sanity_check_text_node (const char *filename,
+ const xmlNodePtr node);
+static void sanity_check_menu_options (const char *filename,
+ const xmlChar *node_name,
+ parameter *p);
+
+/* Allocates and returns a new `parameter' object based on the
+ properties in the given XML node. Returns 0 if there's nothing
+ to create (comment, or unknown tag.)
+ */
+static parameter *
+make_parameter (const char *filename, xmlNodePtr node)
+{
+ parameter *p;
+ const char *name = (char *) node->name;
+ const char *convert;
+ gboolean floatp = FALSE;
+
+ if (node->type == XML_COMMENT_NODE)
+ return 0;
+
+ p = calloc (1, sizeof(*p));
+
+ if (!name) abort();
+ else if (!strcmp (name, "command")) p->type = COMMAND;
+ else if (!strcmp (name, "fullcommand")) p->type = COMMAND;
+ else if (!strcmp (name, "_description")) p->type = DESCRIPTION;
+ else if (!strcmp (name, "fakepreview")) p->type = FAKEPREVIEW;
+ else if (!strcmp (name, "fake")) p->type = FAKE;
+ else if (!strcmp (name, "boolean")) p->type = BOOLEAN;
+ else if (!strcmp (name, "string")) p->type = STRING;
+ else if (!strcmp (name, "file")) p->type = FILENAME;
+ else if (!strcmp (name, "number")) p->type = SPINBUTTON;
+ else if (!strcmp (name, "select")) p->type = SELECT;
+
+ else if (!strcmp (name, "xscreensaver-text") || /* ignored in X11; */
+ !strcmp (name, "xscreensaver-image") || /* used in Cocoa. */
+ !strcmp (name, "xscreensaver-updater") ||
+ !strcmp (name, "video"))
+ {
+ free (p);
+ return 0;
+ }
+ else if (node->type == XML_TEXT_NODE)
+ {
+ sanity_check_text_node (filename, node);
+ free (p);
+ return 0;
+ }
+ else
+ {
+ if (debug_p)
+ fprintf (stderr, "%s: WARNING: %s: unknown tag: \"%s\"\n",
+ blurb(), filename, name);
+ free (p);
+ return 0;
+ }
+
+ if (p->type == SPINBUTTON)
+ {
+ const char *type = (char *) xmlGetProp (node, (xmlChar *) "type");
+ if (!type || !strcmp (type, "spinbutton")) p->type = SPINBUTTON;
+ else if (!strcmp (type, "slider")) p->type = SLIDER;
+ else
+ {
+ if (debug_p)
+ fprintf (stderr, "%s: WARNING: %s: unknown %s type: \"%s\"\n",
+ blurb(), filename, name, type);
+ free (p);
+ return 0;
+ }
+ }
+ else if (p->type == DESCRIPTION)
+ {
+ if (node->xmlChildrenNode &&
+ node->xmlChildrenNode->type == XML_TEXT_NODE &&
+ !node->xmlChildrenNode->next)
+ p->string = (xmlChar *)
+ strdup ((char *) node->xmlChildrenNode->content);
+ }
+
+ p->id = xmlGetProp (node, (xmlChar *) "id");
+ p->label = xmlGetProp (node, (xmlChar *) "_label");
+ p->low_label = xmlGetProp (node, (xmlChar *) "_low-label");
+ p->high_label = xmlGetProp (node, (xmlChar *) "_high-label");
+ p->low = xml_get_float (node, (xmlChar *) "low", &floatp);
+ p->high = xml_get_float (node, (xmlChar *) "high", &floatp);
+ p->value = xml_get_float (node, (xmlChar *) "default", &floatp);
+ p->integer_p = !floatp;
+ convert = (char *) xmlGetProp (node, (xmlChar *) "convert");
+ p->invert_p = (convert && !strcmp (convert, "invert"));
+ p->arg = xmlGetProp (node, (xmlChar *) "arg");
+ p->arg_set = xmlGetProp (node, (xmlChar *) "arg-set");
+ p->arg_unset = xmlGetProp (node, (xmlChar *) "arg-unset");
+
+ /* Check for missing decimal point */
+ if (debug_p &&
+ p->integer_p &&
+ (p->high != p->low) &&
+ (p->high - p->low) <= 1)
+ fprintf (stderr,
+ "%s: WARNING: %s: %s: range [%.1f, %.1f] shouldn't be integral!\n",
+ blurb(), filename, p->id,
+ p->low, p->high);
+
+ if (p->type == SELECT)
+ {
+ xmlNodePtr kids;
+ for (kids = node->xmlChildrenNode; kids; kids = kids->next)
+ {
+ parameter *s = make_select_option (filename, kids);
+ if (s)
+ p->options = g_list_append (p->options, s);
+ }
+ }
+
+ sanity_check_parameter (filename, (const xmlChar *) name, p);
+
+ return p;
+}
+
+
+/* Allocates and returns a new SELECT_OPTION `parameter' object based
+ on the properties in the given XML node. Returns 0 if there's nothing
+ to create (comment, or unknown tag.)
+ */
+static parameter *
+make_select_option (const char *filename, xmlNodePtr node)
+{
+ if (node->type == XML_COMMENT_NODE)
+ return 0;
+ else if (node->type == XML_TEXT_NODE)
+ {
+ sanity_check_text_node (filename, node);
+ return 0;
+ }
+ else if (node->type != XML_ELEMENT_NODE)
+ {
+ if (debug_p)
+ fprintf (stderr,
+ "%s: WARNING: %s: %s: unexpected child tag type %d\n",
+ blurb(), filename, node->name, (int)node->type);
+ return 0;
+ }
+ else if (strcmp ((char *) node->name, "option"))
+ {
+ if (debug_p)
+ fprintf (stderr,
+ "%s: WARNING: %s: %s: child not an option tag: \"%s\"\n",
+ blurb(), filename, node->name, node->name);
+ return 0;
+ }
+ else
+ {
+ parameter *s = calloc (1, sizeof(*s));
+
+ s->type = SELECT_OPTION;
+ s->id = xmlGetProp (node, (xmlChar *) "id");
+ s->label = xmlGetProp (node, (xmlChar *) "_label");
+ s->arg_set = xmlGetProp (node, (xmlChar *) "arg-set");
+ s->arg_unset = xmlGetProp (node, (xmlChar *) "arg-unset");
+
+ sanity_check_parameter (filename, node->name, s);
+ return s;
+ }
+}
+
+
+/* Rudimentary check to make sure someone hasn't typed "arg-set="
+ when they should have typed "arg=", etc.
+ */
+static void
+sanity_check_parameter (const char *filename, const xmlChar *node_name,
+ parameter *p)
+{
+ struct {
+ gboolean id;
+ gboolean label;
+ gboolean string;
+ gboolean low_label;
+ gboolean high_label;
+ gboolean low;
+ gboolean high;
+ gboolean value;
+ gboolean arg;
+ gboolean invert_p;
+ gboolean arg_set;
+ gboolean arg_unset;
+ } allowed, require;
+
+ memset (&allowed, 0, sizeof (allowed));
+ memset (&require, 0, sizeof (require));
+
+ switch (p->type)
+ {
+ case COMMAND:
+ allowed.arg = TRUE;
+ require.arg = TRUE;
+ break;
+ case FAKE:
+ break;
+ case DESCRIPTION:
+ allowed.string = TRUE;
+ break;
+ case FAKEPREVIEW:
+ break;
+ case STRING:
+ allowed.id = TRUE;
+ require.id = TRUE;
+ allowed.label = TRUE;
+ require.label = TRUE;
+ allowed.arg = TRUE;
+ require.arg = TRUE;
+ break;
+ case FILENAME:
+ allowed.id = TRUE;
+ require.id = TRUE;
+ allowed.label = TRUE;
+ allowed.arg = TRUE;
+ require.arg = TRUE;
+ break;
+ case SLIDER:
+ allowed.id = TRUE;
+ require.id = TRUE;
+ allowed.label = TRUE;
+ allowed.low_label = TRUE;
+ allowed.high_label = TRUE;
+ allowed.arg = TRUE;
+ require.arg = TRUE;
+ allowed.low = TRUE;
+ /* require.low = TRUE; -- may be 0 */
+ allowed.high = TRUE;
+ /* require.high = TRUE; -- may be 0 */
+ allowed.value = TRUE;
+ /* require.value = TRUE; -- may be 0 */
+ allowed.invert_p = TRUE;
+ break;
+ case SPINBUTTON:
+ allowed.id = TRUE;
+ require.id = TRUE;
+ allowed.label = TRUE;
+ allowed.arg = TRUE;
+ require.arg = TRUE;
+ allowed.low = TRUE;
+ /* require.low = TRUE; -- may be 0 */
+ allowed.high = TRUE;
+ /* require.high = TRUE; -- may be 0 */
+ allowed.value = TRUE;
+ /* require.value = TRUE; -- may be 0 */
+ allowed.invert_p = TRUE;
+ break;
+ case BOOLEAN:
+ allowed.id = TRUE;
+ require.id = TRUE;
+ allowed.label = TRUE;
+ allowed.arg_set = TRUE;
+ allowed.arg_unset = TRUE;
+ break;
+ case SELECT:
+ allowed.id = TRUE;
+ require.id = TRUE;
+ break;
+ case SELECT_OPTION:
+ allowed.id = TRUE;
+ allowed.label = TRUE;
+ require.label = TRUE;
+ allowed.arg_set = TRUE;
+ break;
+ default:
+ abort();
+ break;
+ }
+
+# define WARN(STR) \
+ fprintf (stderr, "%s: %s: " STR " in <%s%s id=\"%s\">\n", \
+ blurb(), filename, node_name, \
+ (!strcmp((char *) node_name, "number") \
+ ? (p->type == SPINBUTTON ? " type=spinbutton" : " type=slider")\
+ : ""), \
+ (p->id ? (char *) p->id : ""))
+# define CHECK(SLOT,NAME) \
+ if (p->SLOT && !allowed.SLOT) \
+ WARN ("\"" NAME "\" is not a valid option"); \
+ if (!p->SLOT && require.SLOT) \
+ WARN ("\"" NAME "\" is required")
+
+ CHECK (id, "id");
+ CHECK (label, "_label");
+ CHECK (string, "(body text)");
+ CHECK (low_label, "_low-label");
+ CHECK (high_label, "_high-label");
+ CHECK (low, "low");
+ CHECK (high, "high");
+ CHECK (value, "default");
+ CHECK (arg, "arg");
+ CHECK (invert_p, "convert");
+ CHECK (arg_set, "arg-set");
+ CHECK (arg_unset, "arg-unset");
+# undef CHECK
+# undef WARN
+
+ if (p->type == SELECT)
+ sanity_check_menu_options (filename, node_name, p);
+}
+
+
+static void
+sanity_check_menu_options (const char *filename, const xmlChar *node_name,
+ parameter *p)
+{
+ GList *opts;
+ int noptions = 0;
+ int nulls = 0;
+ char *prefix = 0;
+
+/* fprintf (stderr, "\n## %s\n", p->id);*/
+ for (opts = p->options; opts; opts = opts->next)
+ {
+ parameter *s = (parameter *) opts->data;
+ if (!s->arg_set) nulls++;
+ noptions++;
+
+ if (s->arg_set)
+ {
+ char *a = strdup ((char *) s->arg_set);
+ char *spc = strchr (a, ' ');
+ if (spc) *spc = 0;
+ if (prefix)
+ {
+ if (strcmp (a, prefix))
+ fprintf (stderr,
+ "%s: %s: both \"%s\" and \"%s\" used in <select id=\"%s\">\n",
+ blurb(), filename, prefix, a, p->id);
+ free (prefix);
+ }
+ prefix = a;
+ }
+
+/* fprintf (stderr, "\n %s\n", s->arg_set);*/
+ }
+
+ if (prefix) free (prefix);
+ prefix = 0;
+ if (nulls > 1)
+ fprintf (stderr,
+ "%s: %s: more than one menu with no arg-set in <select id=\"%s\">\n",
+ blurb(), filename, p->id);
+}
+
+
+/* "text" nodes show up for all the non-tag text in the file, including
+ all the newlines between tags. Warn if there is text there that
+ is not whitespace.
+ */
+static void
+sanity_check_text_node (const char *filename, const xmlNodePtr node)
+{
+ const char *body = (const char *) node->content;
+ if (node->type != XML_TEXT_NODE) abort();
+ while (isspace (*body)) body++;
+ if (*body)
+ fprintf (stderr, "%s: WARNING: %s: random text present: \"%s\"\n",
+ blurb(), filename, body);
+}
+
+
+/* Returns a list of strings, every switch mentioned in the parameters.
+ The strings must be freed.
+ */
+static GList *
+get_all_switches (const char *filename, GList *parms)
+{
+ GList *switches = 0;
+ GList *p;
+ for (p = parms; p; p = p->next)
+ {
+ parameter *pp = (parameter *) p->data;
+
+ if (pp->type == SELECT)
+ {
+ GList *list2 = get_all_switches (filename, pp->options);
+ switches = g_list_concat (switches, list2);
+ }
+ if (pp->arg && *pp->arg)
+ switches = g_list_append (switches, strdup ((char *) pp->arg));
+ if (pp->arg_set && *pp->arg_set)
+ switches = g_list_append (switches, strdup ((char *) pp->arg_set));
+ if (pp->arg_unset && *pp->arg_unset)
+ switches = g_list_append (switches, strdup ((char *) pp->arg_unset));
+ }
+ return switches;
+}
+
+
+/* Ensures that no switch is mentioned more than once.
+ */
+static void
+sanity_check_parameters (const char *filename, GList *parms)
+{
+ GList *list = get_all_switches (filename, parms);
+ GList *p;
+ for (p = list; p; p = p->next)
+ {
+ char *sw = (char *) p->data;
+ GList *p2;
+
+ if (*sw != '-' && *sw != '+')
+ fprintf (stderr, "%s: %s: switch does not begin with hyphen \"%s\"\n",
+ blurb(), filename, sw);
+
+ for (p2 = p->next; p2; p2 = p2->next)
+ {
+ const char *sw2 = (const char *) p2->data;
+ if (!strcmp (sw, sw2))
+ fprintf (stderr, "%s: %s: duplicate switch \"%s\"\n",
+ blurb(), filename, sw);
+ }
+
+ free (sw);
+ }
+ g_list_free (list);
+}
+
+
+/* Helper for make_parameters()
+ */
+static GList *
+make_parameters_1 (const char *filename, xmlNodePtr node, GtkWidget *parent)
+{
+ GList *list = 0;
+
+ for (; node; node = node->next)
+ {
+ const char *name = (char *) node->name;
+ if (!strcmp (name, "hgroup") ||
+ !strcmp (name, "vgroup"))
+ {
+ GtkWidget *box = (*name == 'h'
+ ? gtk_hbox_new (FALSE, 0)
+ : gtk_vbox_new (FALSE, 0));
+ GList *list2;
+ gtk_widget_show (box);
+ gtk_box_pack_start (GTK_BOX (parent), box, FALSE, FALSE, 0);
+
+ list2 = make_parameters_1 (filename, node->xmlChildrenNode, box);
+ if (list2)
+ list = g_list_concat (list, list2);
+ }
+ else
+ {
+ parameter *p = make_parameter (filename, node);
+ if (p)
+ {
+ list = g_list_append (list, p);
+ make_parameter_widget (filename, p, parent);
+ }
+ }
+ }
+ return list;
+}
+
+
+/* Calls make_parameter() and make_parameter_widget() on each relevant
+ tag in the XML tree. Also handles the "hgroup" and "vgroup" flags.
+ Returns a GList of `parameter' objects.
+ */
+static GList *
+make_parameters (const char *filename, xmlNodePtr node, GtkWidget *parent)
+{
+ for (; node; node = node->next)
+ {
+ if (node->type == XML_ELEMENT_NODE &&
+ !strcmp ((char *) node->name, "screensaver"))
+ return make_parameters_1 (filename, node->xmlChildrenNode, parent);
+ }
+ return 0;
+}
+
+
+static gfloat
+invert_range (gfloat low, gfloat high, gfloat value)
+{
+ gfloat range = high-low;
+ gfloat off = value-low;
+ return (low + (range - off));
+}
+
+
+static GtkAdjustment *
+make_adjustment (const char *filename, parameter *p)
+{
+ float range = (p->high - p->low);
+ float value = (p->invert_p
+ ? invert_range (p->low, p->high, p->value)
+ : p->value);
+ gfloat si = (p->high - p->low) / 100;
+ gfloat pi = (p->high - p->low) / 10;
+ gfloat page_size = ((p->type == SLIDER) ? 1 : 0);
+
+ if (p->value < p->low || p->value > p->high)
+ {
+ if (debug_p && p->integer_p)
+ fprintf (stderr, "%s: WARNING: %s: %d is not in range [%d, %d]\n",
+ blurb(), filename,
+ (int) p->value, (int) p->low, (int) p->high);
+ else if (debug_p)
+ fprintf (stderr,
+ "%s: WARNING: %s: %.2f is not in range [%.2f, %.2f]\n",
+ blurb(), filename, p->value, p->low, p->high);
+ value = (value < p->low ? p->low : p->high);
+ }
+#if 0
+ else if (debug_p && p->value < 1000 && p->high >= 10000)
+ {
+ if (p->integer_p)
+ fprintf (stderr,
+ "%s: WARNING: %s: %d is suspicious for range [%d, %d]\n",
+ blurb(), filename,
+ (int) p->value, (int) p->low, (int) p->high);
+ else
+ fprintf (stderr,
+ "%s: WARNING: %s: %.2f is suspicious for range [%.2f, %.2f]\n",
+ blurb(), filename, p->value, p->low, p->high);
+ }
+#endif /* 0 */
+
+ si = (int) (si + 0.5);
+ pi = (int) (pi + 0.5);
+ if (si < 1) si = 1;
+ if (pi < 1) pi = 1;
+
+ if (range <= 500) si = 1;
+
+ return GTK_ADJUSTMENT (gtk_adjustment_new (value,
+ p->low,
+ p->high + page_size,
+ si, pi, page_size));
+}
+
+
+
+static void
+set_widget_min_width (GtkWidget *w, int width)
+{
+ GtkRequisition req;
+ gtk_widget_size_request (GTK_WIDGET (w), &req);
+ if (req.width < width)
+ gtk_widget_set_size_request (GTK_WIDGET (w), width, -1);
+}
+
+
+/* If we're inside a vbox, we need to put an hbox in it, or labels appear
+ on top instead of to the left, and things stretch to the full width of
+ the window.
+ */
+static GtkWidget *
+insert_fake_hbox (GtkWidget *parent)
+{
+ if (GTK_IS_VBOX (parent))
+ {
+ GtkWidget *hbox = gtk_hbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (parent), hbox, FALSE, FALSE, 4);
+ gtk_widget_show (hbox);
+ return hbox;
+ }
+ return parent;
+}
+
+
+static void
+link_atk_label_to_widget(GtkWidget *label, GtkWidget *widget)
+{
+ AtkObject *atk_label = gtk_widget_get_accessible (label);
+ AtkObject *atk_widget = gtk_widget_get_accessible (widget);
+
+ atk_object_add_relationship (atk_label, ATK_RELATION_LABEL_FOR,
+ atk_widget);
+ atk_object_add_relationship (atk_widget, ATK_RELATION_LABELLED_BY,
+ atk_label);
+}
+
+/* Given a `parameter' struct, allocates an appropriate GtkWidget for it,
+ and stores it in `p->widget'.
+ `parent' must be a GtkBox.
+ */
+static void
+make_parameter_widget (const char *filename, parameter *p, GtkWidget *parent)
+{
+ const char *label = (char *) p->label;
+ if (p->widget) return;
+
+ switch (p->type)
+ {
+ case STRING:
+ {
+ GtkWidget *entry = gtk_entry_new ();
+ parent = insert_fake_hbox (parent);
+ if (label)
+ {
+ GtkWidget *w = gtk_label_new (_(label));
+ link_atk_label_to_widget (w, entry);
+ gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_RIGHT);
+ gtk_misc_set_alignment (GTK_MISC (w), 1.0, 0.5);
+ set_widget_min_width (GTK_WIDGET (w), MIN_LABEL_WIDTH);
+ gtk_widget_show (w);
+ gtk_box_pack_start (GTK_BOX (parent), w, FALSE, FALSE, 4);
+ }
+
+ p->widget = entry;
+ if (p->string)
+ gtk_entry_set_text (GTK_ENTRY (p->widget), (char *) p->string);
+ gtk_box_pack_start (GTK_BOX (parent), p->widget, FALSE, FALSE, 4);
+ break;
+ }
+ case FILENAME:
+ {
+ GtkWidget *L = gtk_label_new (label ? _(label) : "");
+ GtkWidget *entry = gtk_entry_new ();
+ GtkWidget *button = gtk_button_new_with_label (_("Browse..."));
+ link_atk_label_to_widget (L, entry);
+ gtk_widget_show (entry);
+ gtk_widget_show (button);
+ p->widget = entry;
+
+ gtk_signal_connect (GTK_OBJECT (button),
+ "clicked", GTK_SIGNAL_FUNC (browse_button_cb),
+ (gpointer) entry);
+
+ gtk_label_set_justify (GTK_LABEL (L), GTK_JUSTIFY_RIGHT);
+ gtk_misc_set_alignment (GTK_MISC (L), 1.0, 0.5);
+ set_widget_min_width (GTK_WIDGET (L), MIN_LABEL_WIDTH);
+ gtk_widget_show (L);
+
+ if (p->string)
+ gtk_entry_set_text (GTK_ENTRY (entry), (char *) p->string);
+
+ parent = insert_fake_hbox (parent);
+ gtk_box_pack_start (GTK_BOX (parent), L, FALSE, FALSE, 4);
+ gtk_box_pack_start (GTK_BOX (parent), entry, TRUE, TRUE, 4);
+ gtk_box_pack_start (GTK_BOX (parent), button, FALSE, FALSE, 4);
+ break;
+ }
+ case SLIDER:
+ {
+ GtkAdjustment *adj = make_adjustment (filename, p);
+ GtkWidget *scale = gtk_hscale_new (adj);
+ GtkWidget *labelw = 0;
+
+ if (label)
+ {
+ labelw = gtk_label_new (_(label));
+ link_atk_label_to_widget (labelw, scale);
+ gtk_label_set_justify (GTK_LABEL (labelw), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_alignment (GTK_MISC (labelw), 0.0, 0.5);
+ set_widget_min_width (GTK_WIDGET (labelw), MIN_LABEL_WIDTH);
+ gtk_widget_show (labelw);
+ gtk_box_pack_start (GTK_BOX (parent), labelw, FALSE, FALSE, 2);
+ }
+
+ /* Do this after 'labelw' so that it appears above, not to left. */
+ parent = insert_fake_hbox (parent);
+
+ if (p->low_label)
+ {
+ GtkWidget *w = gtk_label_new (_((char *) p->low_label));
+ link_atk_label_to_widget (w, scale);
+ gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_RIGHT);
+ gtk_misc_set_alignment (GTK_MISC (w), 1.0, 0.5);
+ set_widget_min_width (GTK_WIDGET (w), MIN_LABEL_WIDTH);
+ gtk_widget_show (w);
+ gtk_box_pack_start (GTK_BOX (parent), w, FALSE, FALSE, 4);
+ }
+
+ gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_BOTTOM);
+ gtk_scale_set_draw_value (GTK_SCALE (scale), debug_p);
+ gtk_scale_set_digits (GTK_SCALE (scale), (p->integer_p ? 0 : 2));
+ set_widget_min_width (GTK_WIDGET (scale), MIN_SLIDER_WIDTH);
+
+ gtk_box_pack_start (GTK_BOX (parent), scale, FALSE, FALSE, 4);
+
+ gtk_widget_show (scale);
+
+ if (p->high_label)
+ {
+ GtkWidget *w = gtk_label_new (_((char *) p->high_label));
+ link_atk_label_to_widget (w, scale);
+ gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.5);
+ set_widget_min_width (GTK_WIDGET (w), MIN_LABEL_WIDTH);
+ gtk_widget_show (w);
+ gtk_box_pack_start (GTK_BOX (parent), w, FALSE, FALSE, 4);
+ }
+
+ p->widget = scale;
+ break;
+ }
+ case SPINBUTTON:
+ {
+ GtkAdjustment *adj = make_adjustment (filename, p);
+ GtkWidget *spin = gtk_spin_button_new (adj, 15, 0);
+ gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spin), TRUE);
+ gtk_spin_button_set_snap_to_ticks (GTK_SPIN_BUTTON (spin), TRUE);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), GET_ADJ_VALUE(adj));
+ set_widget_min_width (GTK_WIDGET (spin), MIN_SPINBUTTON_WIDTH);
+
+ if (label)
+ {
+ GtkWidget *w = gtk_label_new (_(label));
+ link_atk_label_to_widget (w, spin);
+ gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_RIGHT);
+ gtk_misc_set_alignment (GTK_MISC (w), 1.0, 0.5);
+ set_widget_min_width (GTK_WIDGET (w), MIN_LABEL_WIDTH);
+ gtk_widget_show (w);
+ parent = insert_fake_hbox (parent);
+ gtk_box_pack_start (GTK_BOX (parent), w, FALSE, FALSE, 4);
+ }
+
+ gtk_widget_show (spin);
+ gtk_box_pack_start (GTK_BOX (parent), spin, FALSE, FALSE, 4);
+
+ p->widget = spin;
+ break;
+ }
+ case BOOLEAN:
+ {
+ p->widget = gtk_check_button_new_with_label (_(label));
+ /* Let these stretch -- doesn't hurt.
+ parent = insert_fake_hbox (parent);
+ */
+ gtk_box_pack_start (GTK_BOX (parent), p->widget, FALSE, FALSE, 4);
+ break;
+ }
+ case SELECT:
+ {
+ GtkWidget *opt = gtk_option_menu_new ();
+ GtkWidget *menu = gtk_menu_new ();
+ GList *opts;
+
+ for (opts = p->options; opts; opts = opts->next)
+ {
+ parameter *s = (parameter *) opts->data;
+ GtkWidget *i = gtk_menu_item_new_with_label (_((char *) s->label));
+ gtk_widget_show (i);
+ gtk_menu_append (GTK_MENU (menu), i);
+ }
+
+ gtk_option_menu_set_menu (GTK_OPTION_MENU (opt), menu);
+ p->widget = opt;
+ parent = insert_fake_hbox (parent);
+ gtk_box_pack_start (GTK_BOX (parent), p->widget, FALSE, FALSE, 4);
+ break;
+ }
+
+ case COMMAND:
+ case FAKE:
+ case DESCRIPTION:
+ case FAKEPREVIEW:
+ break;
+ default:
+ abort();
+ }
+
+ if (p->widget)
+ {
+ gtk_widget_set_name (p->widget, (char *) p->id);
+ gtk_widget_show (p->widget);
+ }
+}
+
+
+/* File selection.
+ Absurdly, there is no GTK file entry widget, only a GNOME one,
+ so in order to avoid depending on GNOME in this code, we have
+ to do it ourselves.
+ */
+
+/* cancel button on GtkFileSelection: user_data unused */
+static void
+file_sel_cancel (GtkWidget *button, gpointer user_data)
+{
+ GtkWidget *dialog = button;
+ while (GET_PARENT (dialog))
+ dialog = GET_PARENT (dialog);
+ gtk_widget_destroy (dialog);
+}
+
+/* ok button on GtkFileSelection: user_data is the corresponding GtkEntry */
+static void
+file_sel_ok (GtkWidget *button, gpointer user_data)
+{
+ GtkWidget *entry = GTK_WIDGET (user_data);
+ GtkWidget *dialog = button;
+ const char *path;
+
+ while (GET_PARENT (dialog))
+ dialog = GET_PARENT (dialog);
+ gtk_widget_hide (dialog);
+
+ path = gtk_file_selection_get_filename (GTK_FILE_SELECTION (dialog));
+ /* apparently one doesn't free `path' */
+
+ gtk_entry_set_text (GTK_ENTRY (entry), path);
+ gtk_entry_set_position (GTK_ENTRY (entry), strlen (path));
+
+ gtk_widget_destroy (dialog);
+}
+
+/* WM close on GtkFileSelection: user_data unused */
+static void
+file_sel_close (GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+ file_sel_cancel (widget, user_data);
+}
+
+/* "Browse" button: user_data is the corresponding GtkEntry */
+static void
+browse_button_cb (GtkButton *button, gpointer user_data)
+{
+ GtkWidget *entry = GTK_WIDGET (user_data);
+ const char *text = gtk_entry_get_text (GTK_ENTRY (entry));
+ GtkFileSelection *selector =
+ GTK_FILE_SELECTION (gtk_file_selection_new (_("Select file.")));
+
+ gtk_file_selection_set_filename (selector, text);
+ gtk_signal_connect (GTK_OBJECT (selector->ok_button),
+ "clicked", GTK_SIGNAL_FUNC (file_sel_ok),
+ (gpointer) entry);
+ gtk_signal_connect (GTK_OBJECT (selector->cancel_button),
+ "clicked", GTK_SIGNAL_FUNC (file_sel_cancel),
+ (gpointer) entry);
+ gtk_signal_connect (GTK_OBJECT (selector), "delete_event",
+ GTK_SIGNAL_FUNC (file_sel_close),
+ (gpointer) entry);
+
+ gtk_window_set_modal (GTK_WINDOW (selector), TRUE);
+ gtk_widget_show (GTK_WIDGET (selector));
+}
+
+
+/* Converting to and from command-lines
+ */
+
+
+/* Returns a copy of string that has been quoted according to shell rules:
+ it may have been wrapped in "" and had some characters backslashed; or
+ it may be unchanged.
+ */
+static char *
+shell_quotify (const char *string)
+{
+ char *string2 = (char *) malloc ((strlen (string) * 2) + 10);
+ const char *in;
+ char *out;
+ int need_quotes = 0;
+ int in_length = 0;
+
+ out = string2;
+ *out++ = '"';
+ for (in = string; *in; in++)
+ {
+ in_length++;
+ if (*in == '!' ||
+ *in == '"' ||
+ *in == '$')
+ {
+ need_quotes = 1;
+ *out++ = '\\';
+ *out++ = *in;
+ }
+ else if (*in <= ' ' ||
+ *in >= 127 ||
+ *in == '\'' ||
+ *in == '#' ||
+ *in == '%' ||
+ *in == '&' ||
+ *in == '(' ||
+ *in == ')' ||
+ *in == '*')
+ {
+ need_quotes = 1;
+ *out++ = *in;
+ }
+ else
+ *out++ = *in;
+ }
+ *out++ = '"';
+ *out = 0;
+
+ if (in_length == 0)
+ need_quotes = 1;
+
+ if (need_quotes)
+ return (string2);
+
+ free (string2);
+ return strdup (string);
+}
+
+/* Modify the string in place to remove wrapping double-quotes
+ and interior backslashes.
+ */
+static void
+de_stringify (char *s)
+{
+ char q = s[0];
+ if (q != '\'' && q != '\"' && q != '`')
+ abort();
+ memmove (s, s+1, strlen (s));
+ while (*s && *s != q)
+ {
+ if (*s == '\\')
+ memmove (s, s+1, strlen (s)+1);
+ s++;
+ }
+ if (*s != q) abort();
+ *s = 0;
+}
+
+
+/* Substitutes a shell-quotified version of `value' into `p->arg' at
+ the place where the `%' character appeared.
+ */
+static char *
+format_switch (parameter *p, const char *value)
+{
+ char *fmt = (char *) p->arg;
+ char *v2;
+ char *result, *s;
+ if (!fmt || !value) return 0;
+ v2 = shell_quotify (value);
+ result = (char *) malloc (strlen (fmt) + strlen (v2) + 10);
+ s = result;
+ for (; *fmt; fmt++)
+ if (*fmt != '%')
+ *s++ = *fmt;
+ else
+ {
+ strcpy (s, v2);
+ s += strlen (s);
+ }
+ *s = 0;
+
+ free (v2);
+ return result;
+}
+
+
+/* Maps a `parameter' to a command-line switch.
+ Returns 0 if it can't, or if the parameter has the default value.
+ */
+static char *
+parameter_to_switch (parameter *p)
+{
+ switch (p->type)
+ {
+ case COMMAND:
+ if (p->arg)
+ return strdup ((char *) p->arg);
+ else
+ return 0;
+ break;
+ case STRING:
+ case FILENAME:
+ if (!p->widget) return 0;
+ {
+ const char *s = gtk_entry_get_text (GTK_ENTRY (p->widget));
+ char *v;
+ if (!strcmp ((s ? s : ""),
+ (p->string ? (char *) p->string : "")))
+ v = 0; /* same as default */
+ else
+ v = format_switch (p, s);
+
+ /* don't free `s' */
+ return v;
+ }
+ case SLIDER:
+ case SPINBUTTON:
+ if (!p->widget) return 0;
+ {
+ GtkAdjustment *adj =
+ (p->type == SLIDER
+ ? gtk_range_get_adjustment (GTK_RANGE (p->widget))
+ : gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (p->widget)));
+ char buf[255];
+ char *s1;
+ float value = (p->invert_p
+ ? invert_range (GET_ADJ_LOWER(adj), GET_ADJ_UPPER(adj),
+ GET_ADJ_VALUE(adj)) - 1
+ : GET_ADJ_VALUE(adj));
+
+ if (value == p->value) /* same as default */
+ return 0;
+
+ if (p->integer_p)
+ sprintf (buf, "%d", (int) (value + (value > 0 ? 0.5 : -0.5)));
+ else
+ sprintf (buf, "%.4f", value);
+
+ s1 = strchr (buf, '.');
+ if (s1)
+ {
+ char *s2 = s1 + strlen(s1) - 1;
+ while (s2 > s1 && *s2 == '0') /* lose trailing zeroes */
+ *s2-- = 0;
+ if (s2 >= s1 && *s2 == '.') /* lose trailing decimal */
+ *s2-- = 0;
+ }
+ return format_switch (p, buf);
+ }
+ case BOOLEAN:
+ if (!p->widget) return 0;
+ {
+ GtkToggleButton *b = GTK_TOGGLE_BUTTON (p->widget);
+ const char *s = (gtk_toggle_button_get_active (b)
+ ? (char *) p->arg_set
+ : (char *) p->arg_unset);
+ if (s)
+ return strdup (s);
+ else
+ return 0;
+ }
+ case SELECT:
+ if (!p->widget) return 0;
+ {
+ GtkOptionMenu *opt = GTK_OPTION_MENU (p->widget);
+ GtkMenu *menu = GTK_MENU (gtk_option_menu_get_menu (opt));
+ GtkWidget *selected = gtk_menu_get_active (menu);
+ GList *kids = gtk_container_children (GTK_CONTAINER (menu));
+ int menu_elt = g_list_index (kids, (gpointer) selected);
+ GList *ol = g_list_nth (p->options, menu_elt);
+ parameter *o = (ol ? (parameter *) ol->data : 0);
+ const char *s;
+ if (!o) abort();
+ if (o->type != SELECT_OPTION) abort();
+ s = (char *) o->arg_set;
+ if (s)
+ return strdup (s);
+ else
+ return 0;
+ }
+ default:
+ if (p->widget)
+ abort();
+ else
+ return 0;
+ }
+}
+
+/* Maps a GList of `parameter' objects to a complete command-line string.
+ All arguments will be properly quoted.
+ */
+static char *
+parameters_to_cmd_line (GList *parms, gboolean default_p)
+{
+ int L = g_list_length (parms);
+ int LL = 0;
+ char **strs = (char **) calloc (sizeof (*parms), L);
+ char *result;
+ char *out;
+ int i, j;
+
+ for (i = 0, j = 0; parms; parms = parms->next, i++)
+ {
+ parameter *p = (parameter *) parms->data;
+ if (!default_p || p->type == COMMAND)
+ {
+ char *s = parameter_to_switch (p);
+ strs[j++] = s;
+ LL += (s ? strlen(s) : 0) + 1;
+ }
+ }
+
+ result = (char *) malloc (LL + 10);
+ out = result;
+ for (i = 0; i < j; i++)
+ if (strs[i])
+ {
+ strcpy (out, strs[i]);
+ out += strlen (out);
+ *out++ = ' ';
+ free (strs[i]);
+ }
+ *out = 0;
+ while (out > result && out[-1] == ' ') /* strip trailing spaces */
+ *(--out) = 0;
+ free (strs);
+
+ return result;
+}
+
+
+/* Returns a GList of the tokens the string, using shell syntax;
+ Quoted strings are handled as a single token.
+ */
+static GList *
+tokenize_command_line (const char *cmd)
+{
+ GList *result = 0;
+ const char *s = cmd;
+ while (*s)
+ {
+ const char *start;
+ char *ss;
+ for (; isspace(*s); s++); /* skip whitespace */
+
+ start = s;
+ if (*s == '\'' || *s == '\"' || *s == '`')
+ {
+ char q = *s;
+ s++;
+ while (*s && *s != q) /* skip to matching quote */
+ {
+ if (*s == '\\' && s[1]) /* allowing backslash quoting */
+ s++;
+ s++;
+ }
+ s++;
+ }
+ else
+ {
+ while (*s &&
+ (! (isspace(*s) ||
+ *s == '\'' ||
+ *s == '\"' ||
+ *s == '`')))
+ s++;
+ }
+
+ if (s > start)
+ {
+ ss = (char *) malloc ((s - start) + 1);
+ strncpy (ss, start, s-start);
+ ss[s-start] = 0;
+ if (*ss == '\'' || *ss == '\"' || *ss == '`')
+ de_stringify (ss);
+ result = g_list_append (result, ss);
+ }
+ }
+
+ return result;
+}
+
+static void parameter_set_switch (parameter *, gpointer value);
+static gboolean parse_command_line_into_parameters_1 (const char *filename,
+ GList *parms,
+ const char *option,
+ const char *value,
+ parameter *parent);
+
+
+/* Parses the command line, and flushes those options down into
+ the `parameter' structs in the list.
+ */
+static void
+parse_command_line_into_parameters (const char *filename,
+ const char *cmd, GList *parms)
+{
+ GList *tokens = tokenize_command_line (cmd);
+ GList *rest;
+ for (rest = tokens; rest; rest = rest->next)
+ {
+ char *option = rest->data;
+ rest->data = 0;
+
+ if (option[0] != '-' && option[0] != '+')
+ {
+ if (debug_p)
+ fprintf (stderr, "%s: WARNING: %s: not a switch: \"%s\"\n",
+ blurb(), filename, option);
+ }
+ else
+ {
+ char *value = 0;
+
+ if (rest->next) /* pop off the arg to this option */
+ {
+ char *s = (char *) rest->next->data;
+ /* the next token is the next switch iff it matches "-[a-z]".
+ (To avoid losing on "-x -3.1".)
+ */
+ if (s && (s[0] != '-' || !isalpha(s[1])))
+ {
+ value = s;
+ rest->next->data = 0;
+ rest = rest->next;
+ }
+ }
+
+ parse_command_line_into_parameters_1 (filename, parms,
+ option, value, 0);
+ if (value) free (value);
+ free (option);
+ }
+ }
+ g_list_free (tokens);
+}
+
+
+static gboolean
+compare_opts (const char *option, const char *value,
+ const char *template)
+{
+ int ol = strlen (option);
+ char *c;
+
+ if (strncmp (option, template, ol))
+ return FALSE;
+
+ if (template[ol] != (value ? ' ' : 0))
+ return FALSE;
+
+ /* At this point, we have a match against "option".
+ If template contains a %, we're done.
+ Else, compare against "value" too.
+ */
+ c = strchr (template, '%');
+ if (c)
+ return TRUE;
+
+ if (!value)
+ return (template[ol] == 0);
+ if (strcmp (template + ol + 1, value))
+ return FALSE;
+
+ return TRUE;
+}
+
+
+static gboolean
+parse_command_line_into_parameters_1 (const char *filename,
+ GList *parms,
+ const char *option,
+ const char *value,
+ parameter *parent)
+{
+ GList *p;
+ parameter *match = 0;
+ gint which = -1;
+ gint index = 0;
+
+ for (p = parms; p; p = p->next)
+ {
+ parameter *pp = (parameter *) p->data;
+ which = -99;
+
+ if (pp->type == SELECT)
+ {
+ if (parse_command_line_into_parameters_1 (filename,
+ pp->options,
+ option, value,
+ pp))
+ {
+ which = -2;
+ match = pp;
+ }
+ }
+ else if (pp->arg)
+ {
+ if (compare_opts (option, value, (char *) pp->arg))
+ {
+ which = -1;
+ match = pp;
+ }
+ }
+ else if (pp->arg_set)
+ {
+ if (compare_opts (option, value, (char *) pp->arg_set))
+ {
+ which = 1;
+ match = pp;
+ }
+ }
+ else if (pp->arg_unset)
+ {
+ if (compare_opts (option, value, (char *) pp->arg_unset))
+ {
+ which = 0;
+ match = pp;
+ }
+ }
+
+ if (match)
+ break;
+
+ index++;
+ }
+
+ if (!match)
+ {
+ if (debug_p && !parent)
+ fprintf (stderr, "%s: WARNING: %s: no match for %s %s\n",
+ blurb(), filename, option, (value ? value : ""));
+ return FALSE;
+ }
+
+ switch (match->type)
+ {
+ case STRING:
+ case FILENAME:
+ case SLIDER:
+ case SPINBUTTON:
+ if (which != -1) abort();
+ parameter_set_switch (match, (gpointer) value);
+ break;
+ case BOOLEAN:
+ if (which != 0 && which != 1) abort();
+ parameter_set_switch (match, GINT_TO_POINTER(which));
+ break;
+ case SELECT_OPTION:
+ if (which != 1) abort();
+ parameter_set_switch (parent, GINT_TO_POINTER(index));
+ break;
+ default:
+ break;
+ }
+ return TRUE;
+}
+
+
+/* Set the parameter's value.
+ For STRING, FILENAME, SLIDER, and SPINBUTTON, `value' is a char*.
+ For BOOLEAN and SELECT, `value' is an int.
+ */
+static void
+parameter_set_switch (parameter *p, gpointer value)
+{
+ if (p->type == SELECT_OPTION) abort();
+ if (!p->widget) return;
+ switch (p->type)
+ {
+ case STRING:
+ case FILENAME:
+ {
+ gtk_entry_set_text (GTK_ENTRY (p->widget), (char *) value);
+ break;
+ }
+ case SLIDER:
+ case SPINBUTTON:
+ {
+ GtkAdjustment *adj =
+ (p->type == SLIDER
+ ? gtk_range_get_adjustment (GTK_RANGE (p->widget))
+ : gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (p->widget)));
+ float f;
+ char c;
+
+ if (1 == sscanf ((char *) value, "%f %c", &f, &c))
+ {
+ if (p->invert_p)
+ f = invert_range (GET_ADJ_LOWER(adj), GET_ADJ_UPPER(adj), f) - 1;
+ gtk_adjustment_set_value (adj, f);
+ }
+ break;
+ }
+ case BOOLEAN:
+ {
+ GtkToggleButton *b = GTK_TOGGLE_BUTTON (p->widget);
+ gtk_toggle_button_set_active (b, GPOINTER_TO_INT(value));
+ break;
+ }
+ case SELECT:
+ {
+ gtk_option_menu_set_history (GTK_OPTION_MENU (p->widget),
+ GPOINTER_TO_INT(value));
+ break;
+ }
+ default:
+ abort();
+ }
+}
+
+
+static void
+restore_defaults (const char *progname, GList *parms)
+{
+ for (; parms; parms = parms->next)
+ {
+ parameter *p = (parameter *) parms->data;
+ if (!p->widget) continue;
+ switch (p->type)
+ {
+ case STRING:
+ case FILENAME:
+ {
+ gtk_entry_set_text (GTK_ENTRY (p->widget),
+ (p->string ? (char *) p->string : ""));
+ break;
+ }
+ case SLIDER:
+ case SPINBUTTON:
+ {
+ GtkAdjustment *adj =
+ (p->type == SLIDER
+ ? gtk_range_get_adjustment (GTK_RANGE (p->widget))
+ : gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (p->widget)));
+ float value = (p->invert_p
+ ? invert_range (p->low, p->high, p->value)
+ : p->value);
+ gtk_adjustment_set_value (adj, value);
+ break;
+ }
+ case BOOLEAN:
+ {
+ /* A toggle button should be on by default if it inserts
+ nothing into the command line when on. E.g., it should
+ be on if `arg_set' is null.
+ */
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (p->widget),
+ (!p->arg_set || !*p->arg_set));
+ break;
+ }
+ case SELECT:
+ {
+ GtkOptionMenu *opt = GTK_OPTION_MENU (p->widget);
+ GList *opts;
+ int selected = 0;
+ int index;
+
+ for (opts = p->options, index = 0; opts;
+ opts = opts->next, index++)
+ {
+ parameter *s = (parameter *) opts->data;
+ /* The default menu item is the first one with
+ no `arg_set' field. */
+ if (!s->arg_set)
+ {
+ selected = index;
+ break;
+ }
+ }
+
+ gtk_option_menu_set_history (GTK_OPTION_MENU (opt), selected);
+ break;
+ }
+ default:
+ abort();
+ }
+ }
+}
+
+
+
+/* Documentation strings
+ */
+
+static char *
+get_description (GList *parms, gboolean verbose_p)
+{
+ parameter *doc = 0;
+ for (; parms; parms = parms->next)
+ {
+ parameter *p = (parameter *) parms->data;
+ if (p->type == DESCRIPTION)
+ {
+ doc = p;
+ break;
+ }
+ }
+
+ if (!doc || !doc->string)
+ return 0;
+ else
+ {
+ char *d = strdup ((char *) doc->string);
+ char *s;
+ char *p;
+ for (s = d; *s; s++)
+ if (s[0] == '\n')
+ {
+ if (s[1] == '\n') /* blank line: leave it */
+ s++;
+ else if (s[1] == ' ' || s[1] == '\t')
+ s++; /* next line is indented: leave newline */
+ else if (!strncmp(s+1, "http:", 5))
+ s++; /* next line begins a URL: leave newline */
+ else
+ s[0] = ' '; /* delete newline to un-fold this line */
+ }
+
+ /* strip off leading whitespace on first line only */
+ for (s = d; *s && (*s == ' ' || *s == '\t'); s++)
+ ;
+ while (*s == '\n') /* strip leading newlines */
+ s++;
+ if (s != d)
+ memmove (d, s, strlen(s)+1);
+
+ /* strip off trailing whitespace and newlines */
+ {
+ int L = strlen(d);
+ while (L && isspace(d[L-1]))
+ d[--L] = 0;
+ }
+
+ /* strip off duplicated whitespaces */
+ for (s = d; *s; s++)
+ if (s[0] == ' ')
+ {
+ p = s+1;
+ while (*s == ' ')
+ s++;
+ if (*p && (s != p))
+ memmove (p, s, strlen(s)+1);
+ }
+
+#if 0
+ if (verbose_p)
+ {
+ fprintf (stderr, "%s: text read is \"%s\"\n", blurb(),doc->string);
+ fprintf (stderr, "%s: description is \"%s\"\n", blurb(), d);
+ fprintf (stderr, "%s: translation is \"%s\"\n", blurb(), _(d));
+ }
+#endif /* 0 */
+
+ return (d);
+ }
+}
+
+
+/* External interface.
+ */
+
+static conf_data *
+load_configurator_1 (const char *program, const char *arguments,
+ gboolean verbose_p)
+{
+ const char *dir = hack_configuration_path;
+ char *base_program;
+ int L = strlen (dir);
+ char *file;
+ char *s;
+ FILE *f;
+ conf_data *data;
+
+ if (L == 0) return 0;
+
+ base_program = strrchr(program, '/');
+ if (base_program) base_program++;
+ if (!base_program) base_program = (char *) program;
+
+ file = (char *) malloc (L + strlen (base_program) + 10);
+ data = (conf_data *) calloc (1, sizeof(*data));
+
+ strcpy (file, dir);
+ if (file[L-1] != '/')
+ file[L++] = '/';
+ strcpy (file+L, base_program);
+
+ for (s = file+L; *s; s++)
+ if (*s == '/' || *s == ' ')
+ *s = '_';
+ else if (isupper (*s))
+ *s = tolower (*s);
+
+ strcat (file+L, ".xml");
+
+ f = fopen (file, "r");
+ if (f)
+ {
+ int res, size = 1024;
+ char chars[1024];
+ xmlParserCtxtPtr ctxt;
+ xmlDocPtr doc = 0;
+ GtkWidget *vbox0;
+ GList *parms;
+
+ if (verbose_p)
+ fprintf (stderr, "%s: reading %s...\n", blurb(), file);
+
+ res = fread (chars, 1, 4, f);
+ if (res <= 0)
+ {
+ free (data);
+ data = 0;
+ goto DONE;
+ }
+
+ ctxt = xmlCreatePushParserCtxt(NULL, NULL, chars, res, file);
+ while ((res = fread(chars, 1, size, f)) > 0)
+ xmlParseChunk (ctxt, chars, res, 0);
+ xmlParseChunk (ctxt, chars, 0, 1);
+ doc = ctxt->myDoc;
+ xmlFreeParserCtxt (ctxt);
+ fclose (f);
+
+ /* Parsed the XML file. Now make some widgets. */
+
+ vbox0 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox0);
+
+ parms = make_parameters (file, doc->xmlRootNode, vbox0);
+ sanity_check_parameters (file, parms);
+
+ xmlFreeDoc (doc);
+
+ restore_defaults (program, parms);
+ if (arguments && *arguments)
+ parse_command_line_into_parameters (program, arguments, parms);
+
+ data->widget = vbox0;
+ data->parameters = parms;
+ data->description = get_description (parms, verbose_p);
+ }
+ else
+ {
+ parameter *p;
+
+ if (verbose_p)
+ fprintf (stderr, "%s: %s does not exist.\n", blurb(), file);
+
+ p = calloc (1, sizeof(*p));
+ p->type = COMMAND;
+ p->arg = (xmlChar *) strdup (arguments);
+
+ data->parameters = g_list_append (0, (gpointer) p);
+ }
+
+ data->progname = strdup (program);
+
+ DONE:
+ free (file);
+ return data;
+}
+
+static void
+split_command_line (const char *full_command_line,
+ char **prog_ret, char **args_ret)
+{
+ char *line = strdup (full_command_line);
+ char *prog;
+ char *args;
+ char *s;
+
+ prog = line;
+ s = line;
+ while (*s)
+ {
+ if (isspace (*s))
+ {
+ *s = 0;
+ s++;
+ while (isspace (*s)) s++;
+ break;
+ }
+ else if (*s == '=') /* if the leading word contains an "=", skip it. */
+ {
+ while (*s && !isspace (*s)) s++;
+ while (isspace (*s)) s++;
+ prog = s;
+ }
+ s++;
+ }
+ args = s;
+
+ *prog_ret = strdup (prog);
+ *args_ret = strdup (args);
+ free (line);
+}
+
+
+conf_data *
+load_configurator (const char *full_command_line, gboolean verbose_p)
+{
+ char *prog;
+ char *args;
+ conf_data *cd;
+ debug_p = verbose_p;
+ split_command_line (full_command_line, &prog, &args);
+ cd = load_configurator_1 (prog, args, verbose_p);
+ free (prog);
+ free (args);
+ return cd;
+}
+
+
+
+char *
+get_configurator_command_line (conf_data *data, gboolean default_p)
+{
+ char *args = parameters_to_cmd_line (data->parameters, default_p);
+ char *result = (char *) malloc (strlen (data->progname) +
+ strlen (args) + 2);
+ strcpy (result, data->progname);
+ strcat (result, " ");
+ strcat (result, args);
+ free (args);
+ return result;
+}
+
+
+void
+set_configurator_command_line (conf_data *data, const char *full_command_line)
+{
+ char *prog;
+ char *args;
+ split_command_line (full_command_line, &prog, &args);
+ if (data->progname) free (data->progname);
+ data->progname = prog;
+ restore_defaults (prog, data->parameters);
+ parse_command_line_into_parameters (prog, args, data->parameters);
+ free (args);
+}
+
+void
+free_conf_data (conf_data *data)
+{
+ if (data->parameters)
+ {
+ GList *rest;
+ for (rest = data->parameters; rest; rest = rest->next)
+ {
+ free_parameter ((parameter *) rest->data);
+ rest->data = 0;
+ }
+ g_list_free (data->parameters);
+ data->parameters = 0;
+ }
+
+ if (data->widget)
+ gtk_widget_destroy (data->widget);
+
+ if (data->progname)
+ free (data->progname);
+ if (data->description)
+ free (data->description);
+
+ memset (data, ~0, sizeof(*data));
+ free (data);
+}
+
+
+#endif /* HAVE_GTK && HAVE_XML -- whole file */
diff --git a/driver/demo-Gtk-conf.h b/driver/demo-Gtk-conf.h
new file mode 100644
index 0000000..f462152
--- /dev/null
+++ b/driver/demo-Gtk-conf.h
@@ -0,0 +1,31 @@
+/* demo-Gtk-conf.c --- implements the dynamic configuration dialogs.
+ * xscreensaver, Copyright (c) 2001-2008 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef _DEMO_GTK_CONF_H_
+#define _DEMO_GTK_CONF_H_
+
+typedef struct {
+ GtkWidget *widget; /* the container widget with the sliders and stuff. */
+ GList *parameters; /* internal data -- hands off */
+ char *progname;
+ char *progclass;
+ char *description;
+} conf_data;
+
+extern conf_data *load_configurator (const char *cmd_line, gboolean verbose_p);
+extern char *get_configurator_command_line (conf_data *, gboolean default_p);
+extern void set_configurator_command_line (conf_data *, const char *cmd_line);
+extern void free_conf_data (conf_data *);
+
+extern const char *hack_configuration_path;
+
+#endif /* _DEMO_GTK_CONF_H_ */
diff --git a/driver/demo-Gtk.c b/driver/demo-Gtk.c
new file mode 100644
index 0000000..0dfc387
--- /dev/null
+++ b/driver/demo-Gtk.c
@@ -0,0 +1,5337 @@
+/* demo-Gtk.c --- implements the interactive demo-mode and options dialogs.
+ * xscreensaver, Copyright (c) 1993-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifdef HAVE_GTK /* whole file */
+
+#include <xscreensaver-intl.h>
+
+#include <stdlib.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+# ifdef __GNUC__
+# define STFU __extension__ /* ignore gcc -pendantic warnings in next sexp */
+# else
+# define STFU /* */
+# endif
+
+
+#ifdef ENABLE_NLS
+# include <locale.h>
+#endif /* ENABLE_NLS */
+
+#ifndef VMS
+# include <pwd.h> /* for getpwuid() */
+#else /* VMS */
+# include "vms-pwd.h"
+#endif /* VMS */
+
+#ifdef HAVE_UNAME
+# include <sys/utsname.h> /* for uname() */
+#endif /* HAVE_UNAME */
+
+#include <stdio.h>
+#include <time.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+
+
+#include <signal.h>
+#include <errno.h>
+#ifdef HAVE_SYS_WAIT_H
+# include <sys/wait.h> /* for waitpid() and associated macros */
+#endif
+
+
+#include <X11/Xproto.h> /* for CARD32 */
+#include <X11/Xatom.h> /* for XA_INTEGER */
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+
+/* We don't actually use any widget internals, but these are included
+ so that gdb will have debug info for the widgets... */
+#include <X11/IntrinsicP.h>
+#include <X11/ShellP.h>
+
+#ifdef HAVE_XMU
+# ifndef VMS
+# include <X11/Xmu/Error.h>
+# else /* VMS */
+# include <Xmu/Error.h>
+# endif
+#else
+# include "xmu.h"
+#endif
+
+#ifdef HAVE_XINERAMA
+# include <X11/extensions/Xinerama.h>
+#endif /* HAVE_XINERAMA */
+
+#include <gtk/gtk.h>
+
+#ifdef HAVE_CRAPPLET
+# include <gnome.h>
+# include <capplet-widget.h>
+#endif
+
+#include <gdk/gdkx.h>
+
+#ifdef HAVE_GTK2
+# include <glade/glade-xml.h>
+# include <gmodule.h>
+#else /* !HAVE_GTK2 */
+# define G_MODULE_EXPORT /**/
+#endif /* !HAVE_GTK2 */
+
+#if defined(DEFAULT_ICONDIR) && !defined(GLADE_DIR)
+# define GLADE_DIR DEFAULT_ICONDIR
+#endif
+#if !defined(DEFAULT_ICONDIR) && defined(GLADE_DIR)
+# define DEFAULT_ICONDIR GLADE_DIR
+#endif
+
+#ifndef HAVE_XML
+ /* Kludge: this is defined in demo-Gtk-conf.c when HAVE_XML.
+ It is unused otherwise, so in that case, stub it out. */
+ static const char *hack_configuration_path = 0;
+#endif
+
+
+
+#include "version.h"
+#include "prefs.h"
+#include "resources.h" /* for parse_time() */
+#include "visual.h" /* for has_writable_cells() */
+#include "remote.h" /* for xscreensaver_command() */
+#include "usleep.h"
+
+#include "logo-50.xpm"
+#include "logo-180.xpm"
+
+#include "demo-Gtk-conf.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#ifdef HAVE_GTK2
+enum {
+ COL_ENABLED,
+ COL_NAME,
+ COL_LAST
+};
+#endif /* HAVE_GTK2 */
+
+/* Deal with deprecation of direct access to struct fields on the way to GTK3
+ See http://live.gnome.org/GnomeGoals/UseGseal
+ */
+#if GTK_CHECK_VERSION(2,14,0)
+# define GET_PARENT(w) gtk_widget_get_parent (w)
+# define GET_WINDOW(w) gtk_widget_get_window (w)
+# define GET_ACTION_AREA(d) gtk_dialog_get_action_area (d)
+# define GET_CONTENT_AREA(d) gtk_dialog_get_content_area (d)
+# define GET_ADJ_VALUE(a) gtk_adjustment_get_value (a)
+# define SET_ADJ_VALUE(a,v) gtk_adjustment_set_value (a, v)
+# define SET_ADJ_UPPER(a,v) gtk_adjustment_set_upper (a, v)
+#else
+# define GET_PARENT(w) ((w)->parent)
+# define GET_WINDOW(w) ((w)->window)
+# define GET_ACTION_AREA(d) ((d)->action_area)
+# define GET_CONTENT_AREA(d) ((d)->vbox)
+# define GET_ADJ_VALUE(a) ((a)->value)
+# define SET_ADJ_VALUE(a,v) (a)->value = v
+# define SET_ADJ_UPPER(a,v) (a)->upper = v
+#endif
+
+#if GTK_CHECK_VERSION(2,18,0)
+# define SET_CAN_DEFAULT(w) gtk_widget_set_can_default ((w), TRUE)
+# define GET_SENSITIVE(w) gtk_widget_get_sensitive (w)
+#else
+# define SET_CAN_DEFAULT(w) GTK_WIDGET_SET_FLAGS ((w), GTK_CAN_DEFAULT)
+# define GET_SENSITIVE(w) GTK_WIDGET_IS_SENSITIVE (w)
+#endif
+
+#if GTK_CHECK_VERSION(2,20,0)
+# define GET_REALIZED(w) gtk_widget_get_realized (w)
+#else
+# define GET_REALIZED(w) GTK_WIDGET_REALIZED (w)
+#endif
+
+/* from exec.c */
+extern void exec_command (const char *shell, const char *command, int nice);
+extern int on_path_p (const char *program);
+
+static void hack_subproc_environment (Window preview_window_id, Bool debug_p);
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+
+/* You might think that to read an array of 32-bit quantities out of a
+ server-side property, you would pass an array of 32-bit data quantities
+ into XGetWindowProperty(). You would be wrong. You have to use an array
+ of longs, even if long is 64 bits (using 32 of each 64.)
+ */
+typedef long PROP32;
+
+char *progname = 0;
+char *progclass = "XScreenSaver";
+XrmDatabase db;
+
+/* The order of the items in the mode menu. */
+static int mode_menu_order[] = {
+ DONT_BLANK, BLANK_ONLY, ONE_HACK, RANDOM_HACKS, RANDOM_HACKS_SAME };
+
+
+typedef struct {
+
+ char *short_version; /* version number of this xscreensaver build */
+
+ GtkWidget *toplevel_widget; /* the main window */
+ GtkWidget *base_widget; /* root of our hierarchy (for name lookups) */
+ GtkWidget *popup_widget; /* the "Settings" dialog */
+ conf_data *cdata; /* private data for per-hack configuration */
+
+#ifdef HAVE_GTK2
+ GladeXML *glade_ui; /* Glade UI file */
+#endif /* HAVE_GTK2 */
+
+ Bool debug_p; /* whether to print diagnostics */
+ Bool initializing_p; /* flag for breaking recursion loops */
+ Bool saving_p; /* flag for breaking recursion loops */
+
+ char *desired_preview_cmd; /* subprocess we intend to run */
+ char *running_preview_cmd; /* subprocess we are currently running */
+ pid_t running_preview_pid; /* pid of forked subproc (might be dead) */
+ Bool running_preview_error_p; /* whether the pid died abnormally */
+
+ Bool preview_suppressed_p; /* flag meaning "don't launch subproc" */
+ int subproc_timer_id; /* timer to delay subproc launch */
+ int subproc_check_timer_id; /* timer to check whether it started up */
+ int subproc_check_countdown; /* how many more checks left */
+
+ int *list_elt_to_hack_number; /* table for sorting the hack list */
+ int *hack_number_to_list_elt; /* the inverse table */
+ Bool *hacks_available_p; /* whether hacks are on $PATH */
+ int total_available; /* how many are on $PATH */
+ int list_count; /* how many items are in the list: this may be
+ less than p->screenhacks_count, if some are
+ suppressed. */
+
+ int _selected_list_element; /* don't use this: call
+ selected_list_element() instead */
+
+ int nscreens; /* How many X or Xinerama screens there are */
+
+ saver_preferences prefs;
+
+} state;
+
+
+/* Total fucking evilness due to the fact that it's rocket science to get
+ a closure object of our own down into the various widget callbacks. */
+static state *global_state_kludge;
+
+Atom XA_VROOT;
+Atom XA_SCREENSAVER, XA_SCREENSAVER_RESPONSE, XA_SCREENSAVER_VERSION;
+Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_SELECT, XA_DEMO;
+Atom XA_ACTIVATE, XA_BLANK, XA_LOCK, XA_RESTART, XA_EXIT;
+
+
+static void populate_demo_window (state *, int list_elt);
+static void populate_prefs_page (state *);
+static void populate_popup_window (state *);
+
+static Bool flush_dialog_changes_and_save (state *);
+static Bool flush_popup_changes_and_save (state *);
+
+static int maybe_reload_init_file (state *);
+static void await_xscreensaver (state *);
+static Bool xscreensaver_running_p (state *);
+static void sensitize_menu_items (state *s, Bool force_p);
+static void force_dialog_repaint (state *s);
+
+static void schedule_preview (state *, const char *cmd);
+static void kill_preview_subproc (state *, Bool reset_p);
+static void schedule_preview_check (state *);
+
+
+/* Prototypes of functions used by the Glade-generated code,
+ to avoid warnings.
+ */
+void exit_menu_cb (GtkMenuItem *, gpointer user_data);
+void about_menu_cb (GtkMenuItem *, gpointer user_data);
+void doc_menu_cb (GtkMenuItem *, gpointer user_data);
+void file_menu_cb (GtkMenuItem *, gpointer user_data);
+void activate_menu_cb (GtkMenuItem *, gpointer user_data);
+void lock_menu_cb (GtkMenuItem *, gpointer user_data);
+void kill_menu_cb (GtkMenuItem *, gpointer user_data);
+void restart_menu_cb (GtkWidget *, gpointer user_data);
+void run_this_cb (GtkButton *, gpointer user_data);
+void manual_cb (GtkButton *, gpointer user_data);
+void run_next_cb (GtkButton *, gpointer user_data);
+void run_prev_cb (GtkButton *, gpointer user_data);
+void pref_changed_cb (GtkWidget *, gpointer user_data);
+gboolean pref_changed_event_cb (GtkWidget *, GdkEvent *, gpointer user_data);
+void mode_menu_item_cb (GtkWidget *, gpointer user_data);
+void switch_page_cb (GtkNotebook *, GtkNotebookPage *,
+ gint page_num, gpointer user_data);
+void browse_image_dir_cb (GtkButton *, gpointer user_data);
+void browse_text_file_cb (GtkButton *, gpointer user_data);
+void browse_text_program_cb (GtkButton *, gpointer user_data);
+void settings_cb (GtkButton *, gpointer user_data);
+void settings_adv_cb (GtkButton *, gpointer user_data);
+void settings_std_cb (GtkButton *, gpointer user_data);
+void settings_reset_cb (GtkButton *, gpointer user_data);
+void settings_switch_page_cb (GtkNotebook *, GtkNotebookPage *,
+ gint page_num, gpointer user_data);
+void settings_cancel_cb (GtkButton *, gpointer user_data);
+void settings_ok_cb (GtkButton *, gpointer user_data);
+
+static void kill_gnome_screensaver (void);
+static void kill_kde_screensaver (void);
+
+
+/* Some random utility functions
+ */
+
+const char *blurb (void);
+
+const char *
+blurb (void)
+{
+ time_t now = time ((time_t *) 0);
+ char *ct = (char *) ctime (&now);
+ static char buf[255];
+ int n = strlen(progname);
+ if (n > 100) n = 99;
+ strncpy(buf, progname, n);
+ buf[n++] = ':';
+ buf[n++] = ' ';
+ strncpy(buf+n, ct+11, 8);
+ strcpy(buf+n+9, ": ");
+ return buf;
+}
+
+
+static GtkWidget *
+name_to_widget (state *s, const char *name)
+{
+ GtkWidget *w;
+ if (!s) abort();
+ if (!name) abort();
+ if (!*name) abort();
+
+#ifdef HAVE_GTK2
+ if (!s->glade_ui)
+ {
+ /* First try to load the Glade file from the current directory;
+ if there isn't one there, check the installed directory.
+ */
+# define GLADE_FILE_NAME "xscreensaver-demo.glade2"
+ const char * const files[] = { GLADE_FILE_NAME,
+ GLADE_DIR "/" GLADE_FILE_NAME };
+ int i;
+ for (i = 0; i < countof (files); i++)
+ {
+ struct stat st;
+ if (!stat (files[i], &st))
+ {
+ s->glade_ui = glade_xml_new (files[i], NULL, NULL);
+ break;
+ }
+ }
+ if (!s->glade_ui)
+ {
+ fprintf (stderr,
+ "%s: could not load \"" GLADE_FILE_NAME "\"\n"
+ "\tfrom " GLADE_DIR "/ or current directory.\n",
+ blurb());
+ exit (-1);
+ }
+# undef GLADE_FILE_NAME
+
+ glade_xml_signal_autoconnect (s->glade_ui);
+ }
+
+ w = glade_xml_get_widget (s->glade_ui, name);
+
+#else /* !HAVE_GTK2 */
+
+ w = (GtkWidget *) gtk_object_get_data (GTK_OBJECT (s->base_widget),
+ name);
+ if (w) return w;
+ w = (GtkWidget *) gtk_object_get_data (GTK_OBJECT (s->popup_widget),
+ name);
+#endif /* HAVE_GTK2 */
+ if (w) return w;
+
+ fprintf (stderr, "%s: no widget \"%s\" (wrong Glade file?)\n",
+ blurb(), name);
+ abort();
+}
+
+
+/* Why this behavior isn't automatic in *either* toolkit, I'll never know.
+ Takes a scroller, viewport, or list as an argument.
+ */
+static void
+ensure_selected_item_visible (GtkWidget *widget)
+{
+#ifdef HAVE_GTK2
+ GtkTreePath *path;
+ GtkTreeSelection *selection;
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
+ if (!gtk_tree_selection_get_selected (selection, &model, &iter))
+ path = gtk_tree_path_new_first ();
+ else
+ path = gtk_tree_model_get_path (model, &iter);
+
+ gtk_tree_view_set_cursor (GTK_TREE_VIEW (widget), path, NULL, FALSE);
+
+ gtk_tree_path_free (path);
+
+#else /* !HAVE_GTK2 */
+
+ GtkScrolledWindow *scroller = 0;
+ GtkViewport *vp = 0;
+ GtkList *list_widget = 0;
+ GList *slist;
+ GList *kids;
+ int nkids = 0;
+ GtkWidget *selected = 0;
+ int list_elt = -1;
+ GtkAdjustment *adj;
+ gint parent_h, child_y, child_h, children_h, ignore;
+ double ratio_t, ratio_b;
+
+ if (GTK_IS_SCROLLED_WINDOW (widget))
+ {
+ scroller = GTK_SCROLLED_WINDOW (widget);
+ vp = GTK_VIEWPORT (GTK_BIN (scroller)->child);
+ list_widget = GTK_LIST (GTK_BIN(vp)->child);
+ }
+ else if (GTK_IS_VIEWPORT (widget))
+ {
+ vp = GTK_VIEWPORT (widget);
+ scroller = GTK_SCROLLED_WINDOW (GTK_WIDGET (vp)->parent);
+ list_widget = GTK_LIST (GTK_BIN(vp)->child);
+ }
+ else if (GTK_IS_LIST (widget))
+ {
+ list_widget = GTK_LIST (widget);
+ vp = GTK_VIEWPORT (GTK_WIDGET (list_widget)->parent);
+ scroller = GTK_SCROLLED_WINDOW (GTK_WIDGET (vp)->parent);
+ }
+ else
+ abort();
+
+ slist = list_widget->selection;
+ selected = (slist ? GTK_WIDGET (slist->data) : 0);
+ if (!selected)
+ return;
+
+ list_elt = gtk_list_child_position (list_widget, GTK_WIDGET (selected));
+
+ for (kids = gtk_container_children (GTK_CONTAINER (list_widget));
+ kids; kids = kids->next)
+ nkids++;
+
+ adj = gtk_scrolled_window_get_vadjustment (scroller);
+
+ gdk_window_get_geometry (GET_WINDOW (GTK_WIDGET (vp)),
+ &ignore, &ignore, &ignore, &parent_h, &ignore);
+ gdk_window_get_geometry (GET_WINDOW (GTK_WIDGET (selected)),
+ &ignore, &child_y, &ignore, &child_h, &ignore);
+ children_h = nkids * child_h;
+
+ ratio_t = ((double) child_y) / ((double) children_h);
+ ratio_b = ((double) child_y + child_h) / ((double) children_h);
+
+ if (adj->upper == 0.0) /* no items in list */
+ return;
+
+ if (ratio_t < (adj->value / adj->upper) ||
+ ratio_b > ((adj->value + adj->page_size) / adj->upper))
+ {
+ double target;
+ int slop = parent_h * 0.75; /* how much to overshoot by */
+
+ if (ratio_t < (adj->value / adj->upper))
+ {
+ double ratio_w = ((double) parent_h) / ((double) children_h);
+ double ratio_l = (ratio_b - ratio_t);
+ target = ((ratio_t - ratio_w + ratio_l) * adj->upper);
+ target += slop;
+ }
+ else /* if (ratio_b > ((adj->value + adj->page_size) / adj->upper))*/
+ {
+ target = ratio_t * adj->upper;
+ target -= slop;
+ }
+
+ if (target > adj->upper - adj->page_size)
+ target = adj->upper - adj->page_size;
+ if (target < 0)
+ target = 0;
+
+ gtk_adjustment_set_value (adj, target);
+ }
+#endif /* !HAVE_GTK2 */
+}
+
+static void
+warning_dialog_dismiss_cb (GtkWidget *widget, gpointer user_data)
+{
+ GtkWidget *shell = GTK_WIDGET (user_data);
+ while (GET_PARENT (shell))
+ shell = GET_PARENT (shell);
+ gtk_widget_destroy (GTK_WIDGET (shell));
+}
+
+
+void restart_menu_cb (GtkWidget *widget, gpointer user_data);
+
+static void warning_dialog_restart_cb (GtkWidget *widget, gpointer user_data)
+{
+ restart_menu_cb (widget, user_data);
+ warning_dialog_dismiss_cb (widget, user_data);
+}
+
+static void warning_dialog_killg_cb (GtkWidget *widget, gpointer user_data)
+{
+ kill_gnome_screensaver ();
+ warning_dialog_dismiss_cb (widget, user_data);
+}
+
+static void warning_dialog_killk_cb (GtkWidget *widget, gpointer user_data)
+{
+ kill_kde_screensaver ();
+ warning_dialog_dismiss_cb (widget, user_data);
+}
+
+typedef enum { D_NONE, D_LAUNCH, D_GNOME, D_KDE } dialog_button;
+
+static Bool
+warning_dialog (GtkWidget *parent, const char *message,
+ dialog_button button_type, int center)
+{
+ char *msg = strdup (message);
+ char *head;
+
+ GtkWidget *dialog = gtk_dialog_new ();
+ GtkWidget *label = 0;
+ GtkWidget *ok = 0;
+ GtkWidget *cancel = 0;
+ int i = 0;
+
+ while (parent && !GET_WINDOW (parent))
+ parent = GET_PARENT (parent);
+
+ if (!parent ||
+ !GET_WINDOW (parent)) /* too early to pop up transient dialogs */
+ {
+ fprintf (stderr, "%s: too early for dialog?\n", progname);
+ free(msg);
+ return False;
+ }
+
+ head = msg;
+ while (head)
+ {
+ char name[20];
+ char *s = strchr (head, '\n');
+ if (s) *s = 0;
+
+ sprintf (name, "label%d", i++);
+
+ {
+ label = gtk_label_new (head);
+#ifdef HAVE_GTK2
+ gtk_label_set_selectable (GTK_LABEL (label), TRUE);
+#endif /* HAVE_GTK2 */
+
+#ifndef HAVE_GTK2
+ if (i == 1)
+ {
+ GTK_WIDGET (label)->style =
+ gtk_style_copy (GTK_WIDGET (label)->style);
+ GTK_WIDGET (label)->style->font =
+ gdk_font_load (get_string_resource("warning_dialog.headingFont",
+ "Dialog.Font"));
+ gtk_widget_set_style (GTK_WIDGET (label),
+ GTK_WIDGET (label)->style);
+ }
+#endif /* !HAVE_GTK2 */
+ if (center <= 0)
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+ gtk_box_pack_start (GTK_BOX (GET_CONTENT_AREA (GTK_DIALOG (dialog))),
+ label, TRUE, TRUE, 0);
+ gtk_widget_show (label);
+ }
+
+ if (s)
+ head = s+1;
+ else
+ head = 0;
+
+ center--;
+ }
+
+ label = gtk_label_new ("");
+ gtk_box_pack_start (GTK_BOX (GET_CONTENT_AREA (GTK_DIALOG (dialog))),
+ label, TRUE, TRUE, 0);
+ gtk_widget_show (label);
+
+ label = gtk_hbutton_box_new ();
+ gtk_box_pack_start (GTK_BOX (GET_ACTION_AREA (GTK_DIALOG (dialog))),
+ label, TRUE, TRUE, 0);
+
+#ifdef HAVE_GTK2
+ if (button_type != D_NONE)
+ {
+ cancel = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
+ gtk_container_add (GTK_CONTAINER (label), cancel);
+ }
+
+ ok = gtk_button_new_from_stock (GTK_STOCK_OK);
+ gtk_container_add (GTK_CONTAINER (label), ok);
+
+#else /* !HAVE_GTK2 */
+
+ ok = gtk_button_new_with_label ("OK");
+ gtk_container_add (GTK_CONTAINER (label), ok);
+
+ if (button_type != D_NONE)
+ {
+ cancel = gtk_button_new_with_label ("Cancel");
+ gtk_container_add (GTK_CONTAINER (label), cancel);
+ }
+
+#endif /* !HAVE_GTK2 */
+
+ gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
+ gtk_container_set_border_width (GTK_CONTAINER (dialog), 10);
+ gtk_window_set_title (GTK_WINDOW (dialog), progclass);
+ SET_CAN_DEFAULT (ok);
+ gtk_widget_show (ok);
+ gtk_widget_grab_focus (ok);
+
+ if (cancel)
+ {
+ SET_CAN_DEFAULT (cancel);
+ gtk_widget_show (cancel);
+ }
+ gtk_widget_show (label);
+ gtk_widget_show (dialog);
+
+ if (button_type != D_NONE)
+ {
+ GtkSignalFunc fn;
+ switch (button_type) {
+ case D_LAUNCH: fn = GTK_SIGNAL_FUNC (warning_dialog_restart_cb); break;
+ case D_GNOME: fn = GTK_SIGNAL_FUNC (warning_dialog_killg_cb); break;
+ case D_KDE: fn = GTK_SIGNAL_FUNC (warning_dialog_killk_cb); break;
+ default: abort(); break;
+ }
+ gtk_signal_connect_object (GTK_OBJECT (ok), "clicked", fn,
+ (gpointer) dialog);
+ gtk_signal_connect_object (GTK_OBJECT (cancel), "clicked",
+ GTK_SIGNAL_FUNC (warning_dialog_dismiss_cb),
+ (gpointer) dialog);
+ }
+ else
+ {
+ gtk_signal_connect_object (GTK_OBJECT (ok), "clicked",
+ GTK_SIGNAL_FUNC (warning_dialog_dismiss_cb),
+ (gpointer) dialog);
+ }
+
+ gdk_window_set_transient_for (GET_WINDOW (GTK_WIDGET (dialog)),
+ GET_WINDOW (GTK_WIDGET (parent)));
+
+#ifdef HAVE_GTK2
+ gtk_window_present (GTK_WINDOW (dialog));
+#else /* !HAVE_GTK2 */
+ gdk_window_show (GTK_WIDGET (dialog)->window);
+ gdk_window_raise (GTK_WIDGET (dialog)->window);
+#endif /* !HAVE_GTK2 */
+
+ free (msg);
+ return True;
+}
+
+
+static void
+run_cmd (state *s, Atom command, int arg)
+{
+ char *err = 0;
+ int status;
+
+ flush_dialog_changes_and_save (s);
+ status = xscreensaver_command (GDK_DISPLAY(), command, arg, False, &err);
+
+ /* Kludge: ignore the spurious "window unexpectedly deleted" errors... */
+ if (status < 0 && err && strstr (err, "unexpectedly deleted"))
+ status = 0;
+
+ if (status < 0)
+ {
+ char buf [255];
+ if (err)
+ sprintf (buf, "Error:\n\n%s", err);
+ else
+ strcpy (buf, "Unknown error!");
+ warning_dialog (s->toplevel_widget, buf, D_NONE, 100);
+ }
+ if (err) free (err);
+
+ sensitize_menu_items (s, True);
+ force_dialog_repaint (s);
+}
+
+
+static void
+run_hack (state *s, int list_elt, Bool report_errors_p)
+{
+ int hack_number;
+ char *err = 0;
+ int status;
+
+ if (list_elt < 0) return;
+ hack_number = s->list_elt_to_hack_number[list_elt];
+
+ flush_dialog_changes_and_save (s);
+ schedule_preview (s, 0);
+
+ status = xscreensaver_command (GDK_DISPLAY(), XA_DEMO, hack_number + 1,
+ False, &err);
+
+ if (status < 0 && report_errors_p)
+ {
+ if (xscreensaver_running_p (s))
+ {
+ /* Kludge: ignore the spurious "window unexpectedly deleted"
+ errors... */
+ if (err && strstr (err, "unexpectedly deleted"))
+ status = 0;
+
+ if (status < 0)
+ {
+ char buf [255];
+ if (err)
+ sprintf (buf, "Error:\n\n%s", err);
+ else
+ strcpy (buf, "Unknown error!");
+ warning_dialog (s->toplevel_widget, buf, D_NONE, 100);
+ }
+ }
+ else
+ {
+ /* The error is that the daemon isn't running;
+ offer to restart it.
+ */
+ const char *d = DisplayString (GDK_DISPLAY());
+ char msg [1024];
+ sprintf (msg,
+ _("Warning:\n\n"
+ "The XScreenSaver daemon doesn't seem to be running\n"
+ "on display \"%s\". Launch it now?"),
+ d);
+ warning_dialog (s->toplevel_widget, msg, D_LAUNCH, 1);
+ }
+ }
+
+ if (err) free (err);
+
+ sensitize_menu_items (s, False);
+}
+
+
+
+/* Button callbacks
+
+ According to Eric Lassauge, this G_MODULE_EXPORT crud is needed to make
+ libglade work on Cygwin; apparently all Glade callbacks need this magic
+ extra declaration. I do not pretend to understand.
+ */
+
+G_MODULE_EXPORT void
+exit_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
+{
+ state *s = global_state_kludge; /* I hate C so much... */
+ flush_dialog_changes_and_save (s);
+ kill_preview_subproc (s, False);
+ gtk_main_quit ();
+}
+
+static gboolean
+wm_toplevel_close_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
+{
+ state *s = (state *) data;
+ flush_dialog_changes_and_save (s);
+ gtk_main_quit ();
+ return TRUE;
+}
+
+
+G_MODULE_EXPORT void
+about_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
+{
+ char msg [2048];
+ char *vers = strdup (screensaver_id + 4);
+ char *s, *s2;
+ char copy[1024];
+ char year[5];
+ char *desc = _("For updates, check https://www.jwz.org/xscreensaver/");
+
+ s = strchr (vers, ',');
+ *s = 0;
+ s += 2;
+
+ s2 = vers;
+ s2 = strrchr (vers, '-');
+ s2++;
+ strncpy (year, s2, 4);
+ year[4] = 0;
+
+ /* Ole Laursen <olau@hardworking.dk> says "don't use _() here because
+ non-ASCII characters aren't allowed in localizable string keys."
+ (I don't want to just use (c) instead of because that doesn't
+ look as good in the plain-old default Latin1 "C" locale.)
+ */
+#ifdef HAVE_GTK2
+ sprintf(copy, ("Copyright \xC2\xA9 1991-%s %s"), year, s);
+#else /* !HAVE_GTK2 */
+ sprintf(copy, ("Copyright \251 1991-%s %s"), year, s);
+#endif /* !HAVE_GTK2 */
+
+ sprintf (msg, "%s\n\n%s", copy, desc);
+
+ /* I can't make gnome_about_new() work here -- it starts dying in
+ gdk_imlib_get_visual() under gnome_about_new(). If this worked,
+ then this might be the thing to do:
+
+ #ifdef HAVE_CRAPPLET
+ {
+ const gchar *auth[] = { 0 };
+ GtkWidget *about = gnome_about_new (progclass, vers, "", auth, desc,
+ "xscreensaver.xpm");
+ gtk_widget_show (about);
+ }
+ #else / * GTK but not GNOME * /
+ ...
+ */
+ {
+ GdkColormap *colormap;
+ GdkPixmap *gdkpixmap;
+ GdkBitmap *mask;
+
+ GtkWidget *dialog = gtk_dialog_new ();
+ GtkWidget *hbox, *icon, *vbox, *label1, *label2, *hb, *ok;
+ GtkWidget *parent = GTK_WIDGET (menuitem);
+ while (GET_PARENT (parent))
+ parent = GET_PARENT (parent);
+
+ hbox = gtk_hbox_new (FALSE, 20);
+ gtk_box_pack_start (GTK_BOX (GET_CONTENT_AREA (GTK_DIALOG (dialog))),
+ hbox, TRUE, TRUE, 0);
+
+ colormap = gtk_widget_get_colormap (parent);
+ gdkpixmap =
+ gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mask, NULL,
+ (gchar **) logo_180_xpm);
+ icon = gtk_pixmap_new (gdkpixmap, mask);
+ gtk_misc_set_padding (GTK_MISC (icon), 10, 10);
+
+ gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 0);
+
+ vbox = gtk_vbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
+
+ label1 = gtk_label_new (vers);
+ gtk_box_pack_start (GTK_BOX (vbox), label1, TRUE, TRUE, 0);
+ gtk_label_set_justify (GTK_LABEL (label1), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_alignment (GTK_MISC (label1), 0.0, 0.75);
+
+#ifndef HAVE_GTK2
+ GTK_WIDGET (label1)->style = gtk_style_copy (GTK_WIDGET (label1)->style);
+ GTK_WIDGET (label1)->style->font =
+ gdk_font_load (get_string_resource ("about.headingFont","Dialog.Font"));
+ gtk_widget_set_style (GTK_WIDGET (label1), GTK_WIDGET (label1)->style);
+#endif /* HAVE_GTK2 */
+
+ label2 = gtk_label_new (msg);
+ gtk_box_pack_start (GTK_BOX (vbox), label2, TRUE, TRUE, 0);
+ gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_alignment (GTK_MISC (label2), 0.0, 0.25);
+
+#ifndef HAVE_GTK2
+ GTK_WIDGET (label2)->style = gtk_style_copy (GTK_WIDGET (label2)->style);
+ GTK_WIDGET (label2)->style->font =
+ gdk_font_load (get_string_resource ("about.bodyFont","Dialog.Font"));
+ gtk_widget_set_style (GTK_WIDGET (label2), GTK_WIDGET (label2)->style);
+#endif /* HAVE_GTK2 */
+
+ hb = gtk_hbutton_box_new ();
+
+ gtk_box_pack_start (GTK_BOX (GET_ACTION_AREA (GTK_DIALOG (dialog))),
+ hb, TRUE, TRUE, 0);
+
+#ifdef HAVE_GTK2
+ ok = gtk_button_new_from_stock (GTK_STOCK_OK);
+#else /* !HAVE_GTK2 */
+ ok = gtk_button_new_with_label (_("OK"));
+#endif /* !HAVE_GTK2 */
+ gtk_container_add (GTK_CONTAINER (hb), ok);
+
+ gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
+ gtk_container_set_border_width (GTK_CONTAINER (dialog), 10);
+ gtk_window_set_title (GTK_WINDOW (dialog), progclass);
+
+ gtk_widget_show (hbox);
+ gtk_widget_show (icon);
+ gtk_widget_show (vbox);
+ gtk_widget_show (label1);
+ gtk_widget_show (label2);
+ gtk_widget_show (hb);
+ gtk_widget_show (ok);
+ gtk_widget_show (dialog);
+
+ gtk_signal_connect_object (GTK_OBJECT (ok), "clicked",
+ GTK_SIGNAL_FUNC (warning_dialog_dismiss_cb),
+ (gpointer) dialog);
+ gdk_window_set_transient_for (GET_WINDOW (GTK_WIDGET (dialog)),
+ GET_WINDOW (GTK_WIDGET (parent)));
+ gdk_window_show (GET_WINDOW (GTK_WIDGET (dialog)));
+ gdk_window_raise (GET_WINDOW (GTK_WIDGET (dialog)));
+ }
+}
+
+
+G_MODULE_EXPORT void
+doc_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
+{
+ state *s = global_state_kludge; /* I hate C so much... */
+ saver_preferences *p = &s->prefs;
+ char *help_command;
+
+ if (!p->help_url || !*p->help_url)
+ {
+ warning_dialog (s->toplevel_widget,
+ _("Error:\n\n"
+ "No Help URL has been specified.\n"), D_NONE, 100);
+ return;
+ }
+
+ help_command = (char *) malloc (strlen (p->load_url_command) +
+ (strlen (p->help_url) * 4) + 20);
+ strcpy (help_command, "( ");
+ sprintf (help_command + strlen(help_command),
+ p->load_url_command,
+ p->help_url, p->help_url, p->help_url, p->help_url);
+ strcat (help_command, " ) &");
+ if (system (help_command) < 0)
+ fprintf (stderr, "%s: fork error\n", blurb());
+ free (help_command);
+}
+
+
+G_MODULE_EXPORT void
+file_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
+{
+ state *s = global_state_kludge; /* I hate C so much... */
+ sensitize_menu_items (s, False);
+}
+
+
+G_MODULE_EXPORT void
+activate_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
+{
+ state *s = global_state_kludge; /* I hate C so much... */
+ run_cmd (s, XA_ACTIVATE, 0);
+}
+
+
+G_MODULE_EXPORT void
+lock_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
+{
+ state *s = global_state_kludge; /* I hate C so much... */
+ run_cmd (s, XA_LOCK, 0);
+}
+
+
+G_MODULE_EXPORT void
+kill_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
+{
+ state *s = global_state_kludge; /* I hate C so much... */
+ run_cmd (s, XA_EXIT, 0);
+}
+
+
+G_MODULE_EXPORT void
+restart_menu_cb (GtkWidget *widget, gpointer user_data)
+{
+ state *s = global_state_kludge; /* I hate C so much... */
+ flush_dialog_changes_and_save (s);
+ xscreensaver_command (GDK_DISPLAY(), XA_EXIT, 0, False, NULL);
+ sleep (1);
+ if (system ("xscreensaver -nosplash &") < 0)
+ fprintf (stderr, "%s: fork error\n", blurb());
+
+ await_xscreensaver (s);
+}
+
+static Bool
+xscreensaver_running_p (state *s)
+{
+ Display *dpy = GDK_DISPLAY();
+ char *rversion = 0;
+ server_xscreensaver_version (dpy, &rversion, 0, 0);
+ if (!rversion)
+ return False;
+ free (rversion);
+ return True;
+}
+
+static void
+await_xscreensaver (state *s)
+{
+ int countdown = 5;
+ Bool ok = False;
+
+ while (!ok && (--countdown > 0))
+ if (xscreensaver_running_p (s))
+ ok = True;
+ else
+ sleep (1); /* If it's not there yet, wait a second... */
+
+ sensitize_menu_items (s, True);
+
+ if (! ok)
+ {
+ /* Timed out, no screensaver running. */
+
+ char buf [1024];
+ Bool root_p = (geteuid () == 0);
+
+ strcpy (buf,
+ _("Error:\n\n"
+ "The xscreensaver daemon did not start up properly.\n"
+ "\n"));
+
+ if (root_p)
+ strcat (buf, STFU
+ _("You are running as root. This usually means that xscreensaver\n"
+ "was unable to contact your X server because access control is\n"
+ "turned on. Try running this command:\n"
+ "\n"
+ " xhost +localhost\n"
+ "\n"
+ "and then selecting `File / Restart Daemon'.\n"
+ "\n"
+ "Note that turning off access control will allow anyone logged\n"
+ "on to this machine to access your screen, which might be\n"
+ "considered a security problem. Please read the xscreensaver\n"
+ "manual and FAQ for more information.\n"
+ "\n"
+ "You shouldn't run X as root. Instead, you should log in as a\n"
+ "normal user, and `su' as necessary."));
+ else
+ strcat (buf, _("Please check your $PATH and permissions."));
+
+ warning_dialog (s->toplevel_widget, buf, D_NONE, 1);
+ }
+
+ force_dialog_repaint (s);
+}
+
+
+static int
+selected_list_element (state *s)
+{
+ return s->_selected_list_element;
+}
+
+
+static int
+demo_write_init_file (state *s, saver_preferences *p)
+{
+ Display *dpy = GDK_DISPLAY();
+
+#if 0
+ /* #### try to figure out why shit keeps getting reordered... */
+ if (strcmp (s->prefs.screenhacks[0]->name, "DNA Lounge Slideshow"))
+ abort();
+#endif
+
+ if (!write_init_file (dpy, p, s->short_version, False))
+ {
+ if (s->debug_p)
+ fprintf (stderr, "%s: wrote %s\n", blurb(), init_file_name());
+ return 0;
+ }
+ else
+ {
+ const char *f = init_file_name();
+ if (!f || !*f)
+ warning_dialog (s->toplevel_widget,
+ _("Error:\n\nCouldn't determine init file name!\n"),
+ D_NONE, 100);
+ else
+ {
+ char *b = (char *) malloc (strlen(f) + 1024);
+ sprintf (b, _("Error:\n\nCouldn't write %s\n"), f);
+ warning_dialog (s->toplevel_widget, b, D_NONE, 100);
+ free (b);
+ }
+ return -1;
+ }
+}
+
+
+G_MODULE_EXPORT void
+run_this_cb (GtkButton *button, gpointer user_data)
+{
+ state *s = global_state_kludge; /* I hate C so much... */
+ int list_elt = selected_list_element (s);
+ if (list_elt < 0) return;
+ if (!flush_dialog_changes_and_save (s))
+ run_hack (s, list_elt, True);
+}
+
+
+G_MODULE_EXPORT void
+manual_cb (GtkButton *button, gpointer user_data)
+{
+ Display *dpy = GDK_DISPLAY();
+ state *s = global_state_kludge; /* I hate C so much... */
+ saver_preferences *p = &s->prefs;
+ GtkWidget *list_widget = name_to_widget (s, "list");
+ int list_elt = selected_list_element (s);
+ int hack_number;
+ char *name, *name2, *cmd, *str;
+ char *oname = 0;
+ if (list_elt < 0) return;
+ hack_number = s->list_elt_to_hack_number[list_elt];
+
+ flush_dialog_changes_and_save (s);
+ ensure_selected_item_visible (list_widget);
+
+ name = strdup (p->screenhacks[hack_number]->command);
+ name2 = name;
+ oname = name;
+ while (isspace (*name2)) name2++;
+ str = name2;
+ while (*str && !isspace (*str)) str++;
+ *str = 0;
+ str = strrchr (name2, '/');
+ if (str) name2 = str+1;
+
+ cmd = get_string_resource (dpy, "manualCommand", "ManualCommand");
+ if (cmd)
+ {
+ char *cmd2 = (char *) malloc (strlen (cmd) + (strlen (name2) * 4) + 100);
+ strcpy (cmd2, "( ");
+ sprintf (cmd2 + strlen (cmd2),
+ cmd,
+ name2, name2, name2, name2);
+ strcat (cmd2, " ) &");
+ if (system (cmd2) < 0)
+ fprintf (stderr, "%s: fork error\n", blurb());
+ free (cmd2);
+ }
+ else
+ {
+ warning_dialog (GTK_WIDGET (button),
+ _("Error:\n\nno `manualCommand' resource set."),
+ D_NONE, 100);
+ }
+
+ free (oname);
+}
+
+
+static void
+force_list_select_item (state *s, GtkWidget *list, int list_elt, Bool scroll_p)
+{
+ GtkWidget *parent = name_to_widget (s, "scroller");
+ gboolean was = GET_SENSITIVE (parent);
+#ifdef HAVE_GTK2
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+ GtkTreeSelection *selection;
+#endif /* HAVE_GTK2 */
+
+ if (!was) gtk_widget_set_sensitive (parent, True);
+#ifdef HAVE_GTK2
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (list));
+ g_assert (model);
+ if (gtk_tree_model_iter_nth_child (model, &iter, NULL, list_elt))
+ {
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (list));
+ gtk_tree_selection_select_iter (selection, &iter);
+ }
+#else /* !HAVE_GTK2 */
+ gtk_list_select_item (GTK_LIST (list), list_elt);
+#endif /* !HAVE_GTK2 */
+ if (scroll_p) ensure_selected_item_visible (GTK_WIDGET (list));
+ if (!was) gtk_widget_set_sensitive (parent, False);
+}
+
+
+G_MODULE_EXPORT void
+run_next_cb (GtkButton *button, gpointer user_data)
+{
+ state *s = global_state_kludge; /* I hate C so much... */
+ /* saver_preferences *p = &s->prefs; */
+ Bool ops = s->preview_suppressed_p;
+
+ GtkWidget *list_widget = name_to_widget (s, "list");
+ int list_elt = selected_list_element (s);
+
+ if (list_elt < 0)
+ list_elt = 0;
+ else
+ list_elt++;
+
+ if (list_elt >= s->list_count)
+ list_elt = 0;
+
+ s->preview_suppressed_p = True;
+
+ flush_dialog_changes_and_save (s);
+ force_list_select_item (s, list_widget, list_elt, True);
+ populate_demo_window (s, list_elt);
+ run_hack (s, list_elt, False);
+
+ s->preview_suppressed_p = ops;
+}
+
+
+G_MODULE_EXPORT void
+run_prev_cb (GtkButton *button, gpointer user_data)
+{
+ state *s = global_state_kludge; /* I hate C so much... */
+ /* saver_preferences *p = &s->prefs; */
+ Bool ops = s->preview_suppressed_p;
+
+ GtkWidget *list_widget = name_to_widget (s, "list");
+ int list_elt = selected_list_element (s);
+
+ if (list_elt < 0)
+ list_elt = s->list_count - 1;
+ else
+ list_elt--;
+
+ if (list_elt < 0)
+ list_elt = s->list_count - 1;
+
+ s->preview_suppressed_p = True;
+
+ flush_dialog_changes_and_save (s);
+ force_list_select_item (s, list_widget, list_elt, True);
+ populate_demo_window (s, list_elt);
+ run_hack (s, list_elt, False);
+
+ s->preview_suppressed_p = ops;
+}
+
+
+/* Writes the given settings into prefs.
+ Returns true if there was a change, False otherwise.
+ command and/or visual may be 0, or enabled_p may be -1, meaning "no change".
+ */
+static Bool
+flush_changes (state *s,
+ int list_elt,
+ int enabled_p,
+ const char *command,
+ const char *visual)
+{
+ saver_preferences *p = &s->prefs;
+ Bool changed = False;
+ screenhack *hack;
+ int hack_number;
+ if (list_elt < 0 || list_elt >= s->list_count)
+ abort();
+
+ hack_number = s->list_elt_to_hack_number[list_elt];
+ hack = p->screenhacks[hack_number];
+
+ if (enabled_p != -1 &&
+ enabled_p != hack->enabled_p)
+ {
+ hack->enabled_p = enabled_p;
+ changed = True;
+ if (s->debug_p)
+ fprintf (stderr, "%s: \"%s\": enabled => %d\n",
+ blurb(), hack->name, enabled_p);
+ }
+
+ if (command)
+ {
+ if (!hack->command || !!strcmp (command, hack->command))
+ {
+ if (hack->command) free (hack->command);
+ hack->command = strdup (command);
+ changed = True;
+ if (s->debug_p)
+ fprintf (stderr, "%s: \"%s\": command => \"%s\"\n",
+ blurb(), hack->name, command);
+ }
+ }
+
+ if (visual)
+ {
+ const char *ov = hack->visual;
+ if (!ov || !*ov) ov = "any";
+ if (!*visual) visual = "any";
+ if (!!strcasecmp (visual, ov))
+ {
+ if (hack->visual) free (hack->visual);
+ hack->visual = strdup (visual);
+ changed = True;
+ if (s->debug_p)
+ fprintf (stderr, "%s: \"%s\": visual => \"%s\"\n",
+ blurb(), hack->name, visual);
+ }
+ }
+
+ return changed;
+}
+
+
+/* Helper for the text fields that contain time specifications:
+ this parses the text, and does error checking.
+ */
+static void
+hack_time_text (state *s, const char *line, Time *store, Bool sec_p)
+{
+ if (*line)
+ {
+ int value;
+ if (!sec_p || strchr (line, ':'))
+ value = parse_time ((char *) line, sec_p, True);
+ else
+ {
+ char c;
+ if (sscanf (line, "%d%c", &value, &c) != 1)
+ value = -1;
+ if (!sec_p)
+ value *= 60;
+ }
+
+ value *= 1000; /* Time measures in microseconds */
+ if (value < 0)
+ {
+ char b[255];
+ sprintf (b,
+ _("Error:\n\n"
+ "Unparsable time format: \"%s\"\n"),
+ line);
+ warning_dialog (s->toplevel_widget, b, D_NONE, 100);
+ }
+ else
+ *store = value;
+ }
+}
+
+
+static Bool
+directory_p (const char *path)
+{
+ struct stat st;
+ if (!path || !*path)
+ return False;
+ else if (stat (path, &st))
+ return False;
+ else if (!S_ISDIR (st.st_mode))
+ return False;
+ else
+ return True;
+}
+
+static Bool
+file_p (const char *path)
+{
+ struct stat st;
+ if (!path || !*path)
+ return False;
+ else if (stat (path, &st))
+ return False;
+ else if (S_ISDIR (st.st_mode))
+ return False;
+ else
+ return True;
+}
+
+static char *
+normalize_directory (const char *path)
+{
+ int L;
+ char *p2, *s;
+ if (!path || !*path) return 0;
+ L = strlen (path);
+ p2 = (char *) malloc (L + 2);
+ strcpy (p2, path);
+ if (p2[L-1] == '/') /* remove trailing slash */
+ p2[--L] = 0;
+
+ for (s = p2; s && *s; s++)
+ {
+ if (*s == '/' &&
+ (!strncmp (s, "/../", 4) || /* delete "XYZ/../" */
+ !strncmp (s, "/..\000", 4))) /* delete "XYZ/..$" */
+ {
+ char *s0 = s;
+ while (s0 > p2 && s0[-1] != '/')
+ s0--;
+ if (s0 > p2)
+ {
+ s0--;
+ s += 3;
+ /* strcpy (s0, s); */
+ memmove(s0, s, strlen(s) + 1);
+ s = s0-1;
+ }
+ }
+ else if (*s == '/' && !strncmp (s, "/./", 3)) { /* delete "/./" */
+ /* strcpy (s, s+2), s--; */
+ memmove(s, s+2, strlen(s+2) + 1);
+ s--;
+ }
+ else if (*s == '/' && !strncmp (s, "/.\000", 3)) /* delete "/.$" */
+ *s = 0, s--;
+ }
+
+ /*
+ Normalize consecutive slashes.
+ Ignore doubled slashes after ":" to avoid mangling URLs.
+ */
+
+ for (s = p2; s && *s; s++){
+ if (*s == ':') continue;
+ if (!s[1] || !s[2]) continue;
+ while (s[1] == '/' && s[2] == '/')
+ /* strcpy (s+1, s+2); */
+ memmove (s+1, s+2, strlen(s+2) + 1);
+ }
+
+ /* and strip trailing whitespace for good measure. */
+ L = strlen(p2);
+ while (isspace(p2[L-1]))
+ p2[--L] = 0;
+
+ return p2;
+}
+
+
+#ifdef HAVE_GTK2
+
+typedef struct {
+ state *s;
+ int i;
+ Bool *changed;
+} FlushForeachClosure;
+
+static gboolean
+flush_checkbox (GtkTreeModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ gpointer data)
+{
+ FlushForeachClosure *closure = data;
+ gboolean checked;
+
+ gtk_tree_model_get (model, iter,
+ COL_ENABLED, &checked,
+ -1);
+
+ if (flush_changes (closure->s, closure->i,
+ checked, 0, 0))
+ *closure->changed = True;
+
+ closure->i++;
+
+ /* don't remove row */
+ return FALSE;
+}
+
+#endif /* HAVE_GTK2 */
+
+/* Flush out any changes made in the main dialog window (where changes
+ take place immediately: clicking on a checkbox causes the init file
+ to be written right away.)
+ */
+static Bool
+flush_dialog_changes_and_save (state *s)
+{
+ saver_preferences *p = &s->prefs;
+ saver_preferences P2, *p2 = &P2;
+#ifdef HAVE_GTK2
+ GtkTreeView *list_widget = GTK_TREE_VIEW (name_to_widget (s, "list"));
+ GtkTreeModel *model = gtk_tree_view_get_model (list_widget);
+ FlushForeachClosure closure;
+#else /* !HAVE_GTK2 */
+ GtkList *list_widget = GTK_LIST (name_to_widget (s, "list"));
+ GList *kids = gtk_container_children (GTK_CONTAINER (list_widget));
+ int i;
+#endif /* !HAVE_GTK2 */
+ static Bool already_warned_about_missing_image_directory = False; /* very long name... */
+
+ Bool changed = False;
+ GtkWidget *w;
+
+ if (s->saving_p) return False;
+ s->saving_p = True;
+
+ *p2 = *p;
+
+ /* Flush any checkbox changes in the list down into the prefs struct.
+ */
+#ifdef HAVE_GTK2
+ closure.s = s;
+ closure.changed = &changed;
+ closure.i = 0;
+ gtk_tree_model_foreach (model, flush_checkbox, &closure);
+
+#else /* !HAVE_GTK2 */
+
+ for (i = 0; kids; kids = kids->next, i++)
+ {
+ GtkWidget *line = GTK_WIDGET (kids->data);
+ GtkWidget *line_hbox = GTK_WIDGET (GTK_BIN (line)->child);
+ GtkWidget *line_check =
+ GTK_WIDGET (gtk_container_children (GTK_CONTAINER (line_hbox))->data);
+ Bool checked =
+ gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (line_check));
+
+ if (flush_changes (s, i, (checked ? 1 : 0), 0, 0))
+ changed = True;
+ }
+#endif /* ~HAVE_GTK2 */
+
+ /* Flush the non-hack-specific settings down into the prefs struct.
+ */
+
+# define SECONDS(FIELD,NAME) \
+ w = name_to_widget (s, (NAME)); \
+ hack_time_text (s, gtk_entry_get_text (GTK_ENTRY (w)), (FIELD), True)
+
+# define MINUTES(FIELD,NAME) \
+ w = name_to_widget (s, (NAME)); \
+ hack_time_text (s, gtk_entry_get_text (GTK_ENTRY (w)), (FIELD), False)
+
+# define CHECKBOX(FIELD,NAME) \
+ w = name_to_widget (s, (NAME)); \
+ (FIELD) = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w))
+
+# define PATHNAME(FIELD,NAME) \
+ w = name_to_widget (s, (NAME)); \
+ (FIELD) = normalize_directory (gtk_entry_get_text (GTK_ENTRY (w)))
+
+# define TEXT(FIELD,NAME) \
+ w = name_to_widget (s, (NAME)); \
+ (FIELD) = (char *) g_strdup(gtk_entry_get_text (GTK_ENTRY (w)))
+
+ MINUTES (&p2->timeout, "timeout_spinbutton");
+ MINUTES (&p2->cycle, "cycle_spinbutton");
+ CHECKBOX (p2->lock_p, "lock_button");
+ MINUTES (&p2->lock_timeout, "lock_spinbutton");
+
+ CHECKBOX (p2->dpms_enabled_p, "dpms_button");
+ CHECKBOX (p2->dpms_quickoff_p, "dpms_quickoff_button");
+ MINUTES (&p2->dpms_standby, "dpms_standby_spinbutton");
+ MINUTES (&p2->dpms_suspend, "dpms_suspend_spinbutton");
+ MINUTES (&p2->dpms_off, "dpms_off_spinbutton");
+
+ CHECKBOX (p2->grab_desktop_p, "grab_desk_button");
+ CHECKBOX (p2->grab_video_p, "grab_video_button");
+ CHECKBOX (p2->random_image_p, "grab_image_button");
+ PATHNAME (p2->image_directory, "image_text");
+
+#if 0
+ CHECKBOX (p2->verbose_p, "verbose_button");
+ CHECKBOX (p2->capture_stderr_p, "capture_button");
+ CHECKBOX (p2->splash_p, "splash_button");
+#endif
+
+ {
+ Bool v = False;
+ CHECKBOX (v, "text_host_radio"); if (v) p2->tmode = TEXT_DATE;
+ CHECKBOX (v, "text_radio"); if (v) p2->tmode = TEXT_LITERAL;
+ CHECKBOX (v, "text_file_radio"); if (v) p2->tmode = TEXT_FILE;
+ CHECKBOX (v, "text_program_radio"); if (v) p2->tmode = TEXT_PROGRAM;
+ CHECKBOX (v, "text_url_radio"); if (v) p2->tmode = TEXT_URL;
+ TEXT (p2->text_literal, "text_entry");
+ PATHNAME (p2->text_file, "text_file_entry");
+ PATHNAME (p2->text_program, "text_program_entry");
+ PATHNAME (p2->text_program, "text_program_entry");
+ TEXT (p2->text_url, "text_url_entry");
+ }
+
+ CHECKBOX (p2->install_cmap_p, "install_button");
+ CHECKBOX (p2->fade_p, "fade_button");
+ CHECKBOX (p2->unfade_p, "unfade_button");
+ SECONDS (&p2->fade_seconds, "fade_spinbutton");
+
+# undef SECONDS
+# undef MINUTES
+# undef CHECKBOX
+# undef PATHNAME
+# undef TEXT
+
+ /* Warn if the image directory doesn't exist, when:
+ - not being warned before
+ - image directory is changed and the directory doesn't exist
+ - image directory does not begin with http://
+ */
+ if (p2->image_directory &&
+ *p2->image_directory &&
+ !directory_p (p2->image_directory) &&
+ strncmp(p2->image_directory, "http://", 6) &&
+ ( !already_warned_about_missing_image_directory ||
+ ( p->image_directory &&
+ *p->image_directory &&
+ strcmp(p->image_directory, p2->image_directory)
+ )
+ )
+ )
+ {
+ char b[255];
+ sprintf (b, "Warning:\n\n" "Directory does not exist: \"%s\"\n",
+ p2->image_directory);
+ if (warning_dialog (s->toplevel_widget, b, D_NONE, 100))
+ already_warned_about_missing_image_directory = True;
+ }
+
+
+ /* Map the mode menu to `saver_mode' enum values. */
+ {
+ GtkOptionMenu *opt = GTK_OPTION_MENU (name_to_widget (s, "mode_menu"));
+ GtkMenu *menu = GTK_MENU (gtk_option_menu_get_menu (opt));
+ GtkWidget *selected = gtk_menu_get_active (menu);
+ GList *kids = gtk_container_children (GTK_CONTAINER (menu));
+ int menu_elt = g_list_index (kids, (gpointer) selected);
+ if (menu_elt < 0 || menu_elt >= countof(mode_menu_order)) abort();
+ p2->mode = mode_menu_order[menu_elt];
+ }
+
+ if (p2->mode == ONE_HACK)
+ {
+ int list_elt = selected_list_element (s);
+ p2->selected_hack = (list_elt >= 0
+ ? s->list_elt_to_hack_number[list_elt]
+ : -1);
+ }
+
+# define COPY(field, name) \
+ if (p->field != p2->field) { \
+ changed = True; \
+ if (s->debug_p) \
+ fprintf (stderr, "%s: %s => %d\n", blurb(), name, (int) p2->field); \
+ } \
+ p->field = p2->field
+
+ COPY(mode, "mode");
+ COPY(selected_hack, "selected_hack");
+
+ COPY(timeout, "timeout");
+ COPY(cycle, "cycle");
+ COPY(lock_p, "lock_p");
+ COPY(lock_timeout, "lock_timeout");
+
+ COPY(dpms_enabled_p, "dpms_enabled_p");
+ COPY(dpms_quickoff_p, "dpms_quickoff_enabled_p");
+ COPY(dpms_standby, "dpms_standby");
+ COPY(dpms_suspend, "dpms_suspend");
+ COPY(dpms_off, "dpms_off");
+
+#if 0
+ COPY(verbose_p, "verbose_p");
+ COPY(capture_stderr_p, "capture_stderr_p");
+ COPY(splash_p, "splash_p");
+#endif
+
+ COPY(tmode, "tmode");
+
+ COPY(install_cmap_p, "install_cmap_p");
+ COPY(fade_p, "fade_p");
+ COPY(unfade_p, "unfade_p");
+ COPY(fade_seconds, "fade_seconds");
+
+ COPY(grab_desktop_p, "grab_desktop_p");
+ COPY(grab_video_p, "grab_video_p");
+ COPY(random_image_p, "random_image_p");
+
+# undef COPY
+
+# define COPYSTR(FIELD,NAME) \
+ if (!p->FIELD || \
+ !p2->FIELD || \
+ strcmp(p->FIELD, p2->FIELD)) \
+ { \
+ changed = True; \
+ if (s->debug_p) \
+ fprintf (stderr, "%s: %s => \"%s\"\n", blurb(), NAME, p2->FIELD); \
+ } \
+ if (p->FIELD && p->FIELD != p2->FIELD) \
+ free (p->FIELD); \
+ p->FIELD = p2->FIELD; \
+ p2->FIELD = 0
+
+ COPYSTR(image_directory, "image_directory");
+ COPYSTR(text_literal, "text_literal");
+ COPYSTR(text_file, "text_file");
+ COPYSTR(text_program, "text_program");
+ COPYSTR(text_url, "text_url");
+# undef COPYSTR
+
+ populate_prefs_page (s);
+
+ if (changed)
+ {
+ Display *dpy = GDK_DISPLAY();
+ Bool enabled_p = (p->dpms_enabled_p && p->mode != DONT_BLANK);
+ sync_server_dpms_settings (dpy, enabled_p, p->dpms_quickoff_p,
+ p->dpms_standby / 1000,
+ p->dpms_suspend / 1000,
+ p->dpms_off / 1000,
+ False);
+
+ changed = demo_write_init_file (s, p);
+ }
+
+ s->saving_p = False;
+ return changed;
+}
+
+
+/* Flush out any changes made in the popup dialog box (where changes
+ take place only when the OK button is clicked.)
+ */
+static Bool
+flush_popup_changes_and_save (state *s)
+{
+ Bool changed = False;
+ saver_preferences *p = &s->prefs;
+ int list_elt = selected_list_element (s);
+
+ GtkEntry *cmd = GTK_ENTRY (name_to_widget (s, "cmd_text"));
+ GtkCombo *vis = GTK_COMBO (name_to_widget (s, "visual_combo"));
+
+ const char *visual = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (vis)->entry));
+ const char *command = gtk_entry_get_text (cmd);
+
+ char c;
+ unsigned long id;
+
+ if (s->saving_p) return False;
+ s->saving_p = True;
+
+ if (list_elt < 0)
+ goto DONE;
+
+ if (maybe_reload_init_file (s) != 0)
+ {
+ changed = True;
+ goto DONE;
+ }
+
+ /* Sanity-check and canonicalize whatever the user typed into the combo box.
+ */
+ if (!strcasecmp (visual, "")) visual = "";
+ else if (!strcasecmp (visual, "any")) visual = "";
+ else if (!strcasecmp (visual, "default")) visual = "Default";
+ else if (!strcasecmp (visual, "default-n")) visual = "Default-N";
+ else if (!strcasecmp (visual, "default-i")) visual = "Default-I";
+ else if (!strcasecmp (visual, "best")) visual = "Best";
+ else if (!strcasecmp (visual, "mono")) visual = "Mono";
+ else if (!strcasecmp (visual, "monochrome")) visual = "Mono";
+ else if (!strcasecmp (visual, "gray")) visual = "Gray";
+ else if (!strcasecmp (visual, "grey")) visual = "Gray";
+ else if (!strcasecmp (visual, "color")) visual = "Color";
+ else if (!strcasecmp (visual, "gl")) visual = "GL";
+ else if (!strcasecmp (visual, "staticgray")) visual = "StaticGray";
+ else if (!strcasecmp (visual, "staticcolor")) visual = "StaticColor";
+ else if (!strcasecmp (visual, "truecolor")) visual = "TrueColor";
+ else if (!strcasecmp (visual, "grayscale")) visual = "GrayScale";
+ else if (!strcasecmp (visual, "greyscale")) visual = "GrayScale";
+ else if (!strcasecmp (visual, "pseudocolor")) visual = "PseudoColor";
+ else if (!strcasecmp (visual, "directcolor")) visual = "DirectColor";
+ else if (1 == sscanf (visual, " %lu %c", &id, &c)) ;
+ else if (1 == sscanf (visual, " 0x%lx %c", &id, &c)) ;
+ else
+ {
+ gdk_beep (); /* unparsable */
+ visual = "";
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (vis)->entry), _("Any"));
+ }
+
+ changed = flush_changes (s, list_elt, -1, command, visual);
+ if (changed)
+ {
+ changed = demo_write_init_file (s, p);
+
+ /* Do this to re-launch the hack if (and only if) the command line
+ has changed. */
+ populate_demo_window (s, selected_list_element (s));
+ }
+
+ DONE:
+ s->saving_p = False;
+ return changed;
+}
+
+
+G_MODULE_EXPORT void
+pref_changed_cb (GtkWidget *widget, gpointer user_data)
+{
+ state *s = global_state_kludge; /* I hate C so much... */
+ if (! s->initializing_p)
+ {
+ s->initializing_p = True;
+ flush_dialog_changes_and_save (s);
+ s->initializing_p = False;
+ }
+}
+
+G_MODULE_EXPORT gboolean
+pref_changed_event_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+ pref_changed_cb (widget, user_data);
+ return FALSE;
+}
+
+/* Callback on menu items in the "mode" options menu.
+ */
+G_MODULE_EXPORT void
+mode_menu_item_cb (GtkWidget *widget, gpointer user_data)
+{
+ state *s = (state *) user_data;
+ saver_preferences *p = &s->prefs;
+ GtkWidget *list = name_to_widget (s, "list");
+ int list_elt;
+
+ GList *menu_items =
+ gtk_container_children (GTK_CONTAINER (GET_PARENT (widget)));
+ int menu_index = 0;
+ saver_mode new_mode;
+
+ while (menu_items)
+ {
+ if (menu_items->data == widget)
+ break;
+ menu_index++;
+ menu_items = menu_items->next;
+ }
+ if (!menu_items) abort();
+
+ new_mode = mode_menu_order[menu_index];
+
+ /* Keep the same list element displayed as before; except if we're
+ switching *to* "one screensaver" mode from any other mode, set
+ "the one" to be that which is currently selected.
+ */
+ list_elt = selected_list_element (s);
+ if (new_mode == ONE_HACK)
+ p->selected_hack = s->list_elt_to_hack_number[list_elt];
+
+ {
+ saver_mode old_mode = p->mode;
+ p->mode = new_mode;
+ populate_demo_window (s, list_elt);
+ force_list_select_item (s, list, list_elt, True);
+ p->mode = old_mode; /* put it back, so the init file gets written */
+ }
+
+ pref_changed_cb (widget, user_data);
+}
+
+
+G_MODULE_EXPORT void
+switch_page_cb (GtkNotebook *notebook, GtkNotebookPage *page,
+ gint page_num, gpointer user_data)
+{
+ state *s = global_state_kludge; /* I hate C so much... */
+ pref_changed_cb (GTK_WIDGET (notebook), user_data);
+
+ /* If we're switching to page 0, schedule the current hack to be run.
+ Otherwise, schedule it to stop. */
+ if (page_num == 0)
+ populate_demo_window (s, selected_list_element (s));
+ else
+ schedule_preview (s, 0);
+}
+
+#ifdef HAVE_GTK2
+static void
+list_activated_cb (GtkTreeView *list,
+ GtkTreePath *path,
+ GtkTreeViewColumn *column,
+ gpointer data)
+{
+ state *s = data;
+ char *str;
+ int list_elt;
+
+ g_return_if_fail (!gdk_pointer_is_grabbed ());
+
+ str = gtk_tree_path_to_string (path);
+ list_elt = strtol (str, NULL, 10);
+ g_free (str);
+
+ if (list_elt >= 0)
+ run_hack (s, list_elt, True);
+}
+
+static void
+list_select_changed_cb (GtkTreeSelection *selection, gpointer data)
+{
+ state *s = (state *)data;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ GtkTreePath *path;
+ char *str;
+ int list_elt;
+
+ if (!gtk_tree_selection_get_selected (selection, &model, &iter))
+ return;
+
+ path = gtk_tree_model_get_path (model, &iter);
+ str = gtk_tree_path_to_string (path);
+ list_elt = strtol (str, NULL, 10);
+
+ gtk_tree_path_free (path);
+ g_free (str);
+
+ populate_demo_window (s, list_elt);
+ flush_dialog_changes_and_save (s);
+
+ /* Re-populate the Settings window any time a new item is selected
+ in the list, in case both windows are currently visible.
+ */
+ populate_popup_window (s);
+}
+
+#else /* !HAVE_GTK2 */
+
+static time_t last_doubleclick_time = 0; /* FMH! This is to suppress the
+ list_select_cb that comes in
+ *after* we've double-clicked.
+ */
+
+static gint
+list_doubleclick_cb (GtkWidget *button, GdkEventButton *event,
+ gpointer data)
+{
+ state *s = (state *) data;
+ if (event->type == GDK_2BUTTON_PRESS)
+ {
+ GtkList *list = GTK_LIST (name_to_widget (s, "list"));
+ int list_elt = gtk_list_child_position (list, GTK_WIDGET (button));
+
+ last_doubleclick_time = time ((time_t *) 0);
+
+ if (list_elt >= 0)
+ run_hack (s, list_elt, True);
+ }
+
+ return FALSE;
+}
+
+
+static void
+list_select_cb (GtkList *list, GtkWidget *child, gpointer data)
+{
+ state *s = (state *) data;
+ time_t now = time ((time_t *) 0);
+
+ if (now >= last_doubleclick_time + 2)
+ {
+ int list_elt = gtk_list_child_position (list, GTK_WIDGET (child));
+ populate_demo_window (s, list_elt);
+ flush_dialog_changes_and_save (s);
+ }
+}
+
+static void
+list_unselect_cb (GtkList *list, GtkWidget *child, gpointer data)
+{
+ state *s = (state *) data;
+ populate_demo_window (s, -1);
+ flush_dialog_changes_and_save (s);
+}
+
+#endif /* !HAVE_GTK2 */
+
+
+/* Called when the checkboxes that are in the left column of the
+ scrolling list are clicked. This both populates the right pane
+ (just as clicking on the label (really, listitem) does) and
+ also syncs this checkbox with the right pane Enabled checkbox.
+ */
+static void
+list_checkbox_cb (
+#ifdef HAVE_GTK2
+ GtkCellRendererToggle *toggle,
+ gchar *path_string,
+#else /* !HAVE_GTK2 */
+ GtkWidget *cb,
+#endif /* !HAVE_GTK2 */
+ gpointer data)
+{
+ state *s = (state *) data;
+
+#ifdef HAVE_GTK2
+ GtkScrolledWindow *scroller =
+ GTK_SCROLLED_WINDOW (name_to_widget (s, "scroller"));
+ GtkTreeView *list = GTK_TREE_VIEW (name_to_widget (s, "list"));
+ GtkTreeModel *model = gtk_tree_view_get_model (list);
+ GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
+ GtkTreeIter iter;
+ gboolean active;
+#else /* !HAVE_GTK2 */
+ GtkWidget *line_hbox = GTK_WIDGET (cb)->parent;
+ GtkWidget *line = GTK_WIDGET (line_hbox)->parent;
+
+ GtkList *list = GTK_LIST (GTK_WIDGET (line)->parent);
+ GtkViewport *vp = GTK_VIEWPORT (GTK_WIDGET (list)->parent);
+ GtkScrolledWindow *scroller = GTK_SCROLLED_WINDOW (GTK_WIDGET (vp)->parent);
+#endif /* !HAVE_GTK2 */
+ GtkAdjustment *adj;
+ double scroll_top;
+
+ int list_elt;
+
+#ifdef HAVE_GTK2
+ if (!gtk_tree_model_get_iter (model, &iter, path))
+ {
+ g_warning ("bad path: %s", path_string);
+ return;
+ }
+ gtk_tree_path_free (path);
+
+ gtk_tree_model_get (model, &iter,
+ COL_ENABLED, &active,
+ -1);
+
+ gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+ COL_ENABLED, !active,
+ -1);
+
+ list_elt = strtol (path_string, NULL, 10);
+#else /* !HAVE_GTK2 */
+ list_elt = gtk_list_child_position (list, line);
+#endif /* !HAVE_GTK2 */
+
+ /* remember previous scroll position of the top of the list */
+ adj = gtk_scrolled_window_get_vadjustment (scroller);
+ scroll_top = GET_ADJ_VALUE (adj);
+
+ flush_dialog_changes_and_save (s);
+ force_list_select_item (s, GTK_WIDGET (list), list_elt, False);
+ populate_demo_window (s, list_elt);
+
+ /* restore the previous scroll position of the top of the list.
+ this is weak, but I don't really know why it's moving... */
+ gtk_adjustment_set_value (adj, scroll_top);
+}
+
+
+typedef struct {
+ state *state;
+ GtkFileSelection *widget;
+} file_selection_data;
+
+
+
+static void
+store_image_directory (GtkWidget *button, gpointer user_data)
+{
+ file_selection_data *fsd = (file_selection_data *) user_data;
+ state *s = fsd->state;
+ GtkFileSelection *selector = fsd->widget;
+ GtkWidget *top = s->toplevel_widget;
+ saver_preferences *p = &s->prefs;
+ const char *path = gtk_file_selection_get_filename (selector);
+
+ if (p->image_directory && !strcmp(p->image_directory, path))
+ return; /* no change */
+
+ /* No warning for URLs. */
+ if ((!directory_p (path)) && strncmp(path, "http://", 6))
+ {
+ char b[255];
+ sprintf (b, _("Error:\n\n" "Directory does not exist: \"%s\"\n"), path);
+ warning_dialog (GTK_WIDGET (top), b, D_NONE, 100);
+ return;
+ }
+
+ if (p->image_directory) free (p->image_directory);
+ p->image_directory = normalize_directory (path);
+
+ gtk_entry_set_text (GTK_ENTRY (name_to_widget (s, "image_text")),
+ (p->image_directory ? p->image_directory : ""));
+ demo_write_init_file (s, p);
+}
+
+
+static void
+store_text_file (GtkWidget *button, gpointer user_data)
+{
+ file_selection_data *fsd = (file_selection_data *) user_data;
+ state *s = fsd->state;
+ GtkFileSelection *selector = fsd->widget;
+ GtkWidget *top = s->toplevel_widget;
+ saver_preferences *p = &s->prefs;
+ const char *path = gtk_file_selection_get_filename (selector);
+
+ if (p->text_file && !strcmp(p->text_file, path))
+ return; /* no change */
+
+ if (!file_p (path))
+ {
+ char b[255];
+ sprintf (b, _("Error:\n\n" "File does not exist: \"%s\"\n"), path);
+ warning_dialog (GTK_WIDGET (top), b, D_NONE, 100);
+ return;
+ }
+
+ if (p->text_file) free (p->text_file);
+ p->text_file = normalize_directory (path);
+
+ gtk_entry_set_text (GTK_ENTRY (name_to_widget (s, "text_file_entry")),
+ (p->text_file ? p->text_file : ""));
+ demo_write_init_file (s, p);
+}
+
+
+static void
+store_text_program (GtkWidget *button, gpointer user_data)
+{
+ file_selection_data *fsd = (file_selection_data *) user_data;
+ state *s = fsd->state;
+ GtkFileSelection *selector = fsd->widget;
+ /*GtkWidget *top = s->toplevel_widget;*/
+ saver_preferences *p = &s->prefs;
+ const char *path = gtk_file_selection_get_filename (selector);
+
+ if (p->text_program && !strcmp(p->text_program, path))
+ return; /* no change */
+
+# if 0
+ if (!file_p (path))
+ {
+ char b[255];
+ sprintf (b, _("Error:\n\n" "File does not exist: \"%s\"\n"), path);
+ warning_dialog (GTK_WIDGET (top), b, D_NONE, 100);
+ return;
+ }
+# endif
+
+ if (p->text_program) free (p->text_program);
+ p->text_program = normalize_directory (path);
+
+ gtk_entry_set_text (GTK_ENTRY (name_to_widget (s, "text_program_entry")),
+ (p->text_program ? p->text_program : ""));
+ demo_write_init_file (s, p);
+}
+
+
+
+static void
+browse_image_dir_cancel (GtkWidget *button, gpointer user_data)
+{
+ file_selection_data *fsd = (file_selection_data *) user_data;
+ gtk_widget_hide (GTK_WIDGET (fsd->widget));
+}
+
+static void
+browse_image_dir_ok (GtkWidget *button, gpointer user_data)
+{
+ browse_image_dir_cancel (button, user_data);
+ store_image_directory (button, user_data);
+}
+
+static void
+browse_text_file_ok (GtkWidget *button, gpointer user_data)
+{
+ browse_image_dir_cancel (button, user_data);
+ store_text_file (button, user_data);
+}
+
+static void
+browse_text_program_ok (GtkWidget *button, gpointer user_data)
+{
+ browse_image_dir_cancel (button, user_data);
+ store_text_program (button, user_data);
+}
+
+static void
+browse_image_dir_close (GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+ browse_image_dir_cancel (widget, user_data);
+}
+
+
+G_MODULE_EXPORT void
+browse_image_dir_cb (GtkButton *button, gpointer user_data)
+{
+ state *s = global_state_kludge; /* I hate C so much... */
+ saver_preferences *p = &s->prefs;
+ static file_selection_data *fsd = 0;
+
+ GtkFileSelection *selector = GTK_FILE_SELECTION(
+ gtk_file_selection_new ("Please select the image directory."));
+
+ if (!fsd)
+ fsd = (file_selection_data *) malloc (sizeof (*fsd));
+
+ fsd->widget = selector;
+ fsd->state = s;
+
+ if (p->image_directory && *p->image_directory)
+ gtk_file_selection_set_filename (selector, p->image_directory);
+
+ gtk_signal_connect (GTK_OBJECT (selector->ok_button),
+ "clicked", GTK_SIGNAL_FUNC (browse_image_dir_ok),
+ (gpointer *) fsd);
+ gtk_signal_connect (GTK_OBJECT (selector->cancel_button),
+ "clicked", GTK_SIGNAL_FUNC (browse_image_dir_cancel),
+ (gpointer *) fsd);
+ gtk_signal_connect (GTK_OBJECT (selector), "delete_event",
+ GTK_SIGNAL_FUNC (browse_image_dir_close),
+ (gpointer *) fsd);
+
+ gtk_widget_set_sensitive (GTK_WIDGET (selector->file_list), False);
+
+ gtk_window_set_modal (GTK_WINDOW (selector), True);
+ gtk_widget_show (GTK_WIDGET (selector));
+}
+
+
+G_MODULE_EXPORT void
+browse_text_file_cb (GtkButton *button, gpointer user_data)
+{
+ state *s = global_state_kludge; /* I hate C so much... */
+ saver_preferences *p = &s->prefs;
+ static file_selection_data *fsd = 0;
+
+ GtkFileSelection *selector = GTK_FILE_SELECTION(
+ gtk_file_selection_new ("Please select a text file."));
+
+ if (!fsd)
+ fsd = (file_selection_data *) malloc (sizeof (*fsd));
+
+ fsd->widget = selector;
+ fsd->state = s;
+
+ if (p->text_file && *p->text_file)
+ gtk_file_selection_set_filename (selector, p->text_file);
+
+ gtk_signal_connect (GTK_OBJECT (selector->ok_button),
+ "clicked", GTK_SIGNAL_FUNC (browse_text_file_ok),
+ (gpointer *) fsd);
+ gtk_signal_connect (GTK_OBJECT (selector->cancel_button),
+ "clicked", GTK_SIGNAL_FUNC (browse_image_dir_cancel),
+ (gpointer *) fsd);
+ gtk_signal_connect (GTK_OBJECT (selector), "delete_event",
+ GTK_SIGNAL_FUNC (browse_image_dir_close),
+ (gpointer *) fsd);
+
+ gtk_window_set_modal (GTK_WINDOW (selector), True);
+ gtk_widget_show (GTK_WIDGET (selector));
+}
+
+
+G_MODULE_EXPORT void
+browse_text_program_cb (GtkButton *button, gpointer user_data)
+{
+ state *s = global_state_kludge; /* I hate C so much... */
+ saver_preferences *p = &s->prefs;
+ static file_selection_data *fsd = 0;
+
+ GtkFileSelection *selector = GTK_FILE_SELECTION(
+ gtk_file_selection_new ("Please select a text-generating program."));
+
+ if (!fsd)
+ fsd = (file_selection_data *) malloc (sizeof (*fsd));
+
+ fsd->widget = selector;
+ fsd->state = s;
+
+ if (p->text_program && *p->text_program)
+ gtk_file_selection_set_filename (selector, p->text_program);
+
+ gtk_signal_connect (GTK_OBJECT (selector->ok_button),
+ "clicked", GTK_SIGNAL_FUNC (browse_text_program_ok),
+ (gpointer *) fsd);
+ gtk_signal_connect (GTK_OBJECT (selector->cancel_button),
+ "clicked", GTK_SIGNAL_FUNC (browse_image_dir_cancel),
+ (gpointer *) fsd);
+ gtk_signal_connect (GTK_OBJECT (selector), "delete_event",
+ GTK_SIGNAL_FUNC (browse_image_dir_close),
+ (gpointer *) fsd);
+
+ gtk_window_set_modal (GTK_WINDOW (selector), True);
+ gtk_widget_show (GTK_WIDGET (selector));
+}
+
+
+
+
+
+G_MODULE_EXPORT void
+settings_cb (GtkButton *button, gpointer user_data)
+{
+ state *s = global_state_kludge; /* I hate C so much... */
+ int list_elt = selected_list_element (s);
+
+ populate_demo_window (s, list_elt); /* reset the widget */
+ populate_popup_window (s); /* create UI on popup window */
+ gtk_widget_show (s->popup_widget);
+}
+
+static void
+settings_sync_cmd_text (state *s)
+{
+# ifdef HAVE_XML
+ GtkWidget *cmd = GTK_WIDGET (name_to_widget (s, "cmd_text"));
+ char *cmd_line = get_configurator_command_line (s->cdata, False);
+ gtk_entry_set_text (GTK_ENTRY (cmd), cmd_line);
+ gtk_entry_set_position (GTK_ENTRY (cmd), strlen (cmd_line));
+ free (cmd_line);
+# endif /* HAVE_XML */
+}
+
+G_MODULE_EXPORT void
+settings_adv_cb (GtkButton *button, gpointer user_data)
+{
+ state *s = global_state_kludge; /* I hate C so much... */
+ GtkNotebook *notebook =
+ GTK_NOTEBOOK (name_to_widget (s, "opt_notebook"));
+
+ settings_sync_cmd_text (s);
+ gtk_notebook_set_page (notebook, 1);
+}
+
+G_MODULE_EXPORT void
+settings_std_cb (GtkButton *button, gpointer user_data)
+{
+ state *s = global_state_kludge; /* I hate C so much... */
+ GtkNotebook *notebook =
+ GTK_NOTEBOOK (name_to_widget (s, "opt_notebook"));
+
+ /* Re-create UI to reflect the in-progress command-line settings. */
+ populate_popup_window (s);
+
+ gtk_notebook_set_page (notebook, 0);
+}
+
+G_MODULE_EXPORT void
+settings_reset_cb (GtkButton *button, gpointer user_data)
+{
+# ifdef HAVE_XML
+ state *s = global_state_kludge; /* I hate C so much... */
+ GtkWidget *cmd = GTK_WIDGET (name_to_widget (s, "cmd_text"));
+ char *cmd_line = get_configurator_command_line (s->cdata, True);
+ gtk_entry_set_text (GTK_ENTRY (cmd), cmd_line);
+ gtk_entry_set_position (GTK_ENTRY (cmd), strlen (cmd_line));
+ free (cmd_line);
+ populate_popup_window (s);
+# endif /* HAVE_XML */
+}
+
+G_MODULE_EXPORT void
+settings_switch_page_cb (GtkNotebook *notebook, GtkNotebookPage *page,
+ gint page_num, gpointer user_data)
+{
+ state *s = global_state_kludge; /* I hate C so much... */
+ GtkWidget *adv = name_to_widget (s, "adv_button");
+ GtkWidget *std = name_to_widget (s, "std_button");
+
+ if (page_num == 0)
+ {
+ gtk_widget_show (adv);
+ gtk_widget_hide (std);
+ }
+ else if (page_num == 1)
+ {
+ gtk_widget_hide (adv);
+ gtk_widget_show (std);
+ }
+ else
+ abort();
+}
+
+
+
+G_MODULE_EXPORT void
+settings_cancel_cb (GtkButton *button, gpointer user_data)
+{
+ state *s = global_state_kludge; /* I hate C so much... */
+ gtk_widget_hide (s->popup_widget);
+}
+
+G_MODULE_EXPORT void
+settings_ok_cb (GtkButton *button, gpointer user_data)
+{
+ state *s = global_state_kludge; /* I hate C so much... */
+ GtkNotebook *notebook = GTK_NOTEBOOK (name_to_widget (s, "opt_notebook"));
+ int page = gtk_notebook_get_current_page (notebook);
+
+ if (page == 0)
+ /* Regenerate the command-line from the widget contents before saving.
+ But don't do this if we're looking at the command-line page already,
+ or we will blow away what they typed... */
+ settings_sync_cmd_text (s);
+
+ flush_popup_changes_and_save (s);
+ gtk_widget_hide (s->popup_widget);
+}
+
+static gboolean
+wm_popup_close_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
+{
+ state *s = (state *) data;
+ settings_cancel_cb (0, (gpointer) s);
+ return TRUE;
+}
+
+
+
+/* Populating the various widgets
+ */
+
+
+/* Returns the number of the last hack run by the server.
+ */
+static int
+server_current_hack (void)
+{
+ Atom type;
+ int format;
+ unsigned long nitems, bytesafter;
+ unsigned char *dataP = 0;
+ Display *dpy = GDK_DISPLAY();
+ int hack_number = -1;
+
+ if (XGetWindowProperty (dpy, RootWindow (dpy, 0), /* always screen #0 */
+ XA_SCREENSAVER_STATUS,
+ 0, 3, False, XA_INTEGER,
+ &type, &format, &nitems, &bytesafter,
+ &dataP)
+ == Success
+ && type == XA_INTEGER
+ && nitems >= 3
+ && dataP)
+ {
+ PROP32 *data = (PROP32 *) dataP;
+ hack_number = (int) data[2] - 1;
+ }
+
+ if (dataP) XFree (dataP);
+
+ return hack_number;
+}
+
+
+/* Finds the number of the last hack that was run, and makes that item be
+ selected by default.
+ */
+static void
+scroll_to_current_hack (state *s)
+{
+ saver_preferences *p = &s->prefs;
+ int hack_number = -1;
+
+ if (p->mode == ONE_HACK) /* in "one" mode, use the one */
+ hack_number = p->selected_hack;
+ if (hack_number < 0) /* otherwise, use the last-run */
+ hack_number = server_current_hack ();
+ if (hack_number < 0) /* failing that, last "one mode" */
+ hack_number = p->selected_hack;
+ if (hack_number < 0) /* failing that, newest hack. */
+ {
+ /* We should only get here if the user does not have a .xscreensaver
+ file, and the screen has not been blanked with a hack since X
+ started up: in other words, this is probably a fresh install.
+
+ Instead of just defaulting to hack #0 (in either "programs" or
+ "alphabetical" order) let's try to default to the last runnable
+ hack in the "programs" list: this is probably the hack that was
+ most recently added to the xscreensaver distribution (and so
+ it's probably the currently-coolest one!)
+ */
+ hack_number = p->screenhacks_count-1;
+ while (hack_number > 0 &&
+ ! (s->hacks_available_p[hack_number] &&
+ p->screenhacks[hack_number]->enabled_p))
+ hack_number--;
+ }
+
+ if (hack_number >= 0 && hack_number < p->screenhacks_count)
+ {
+ int list_elt = s->hack_number_to_list_elt[hack_number];
+ GtkWidget *list = name_to_widget (s, "list");
+ force_list_select_item (s, list, list_elt, True);
+ populate_demo_window (s, list_elt);
+ }
+}
+
+
+static void
+populate_hack_list (state *s)
+{
+ Display *dpy = GDK_DISPLAY();
+#ifdef HAVE_GTK2
+ saver_preferences *p = &s->prefs;
+ GtkTreeView *list = GTK_TREE_VIEW (name_to_widget (s, "list"));
+ GtkListStore *model;
+ GtkTreeSelection *selection;
+ GtkCellRenderer *ren;
+ GtkTreeIter iter;
+ int i;
+
+ g_object_get (G_OBJECT (list),
+ "model", &model,
+ NULL);
+ if (!model)
+ {
+ model = gtk_list_store_new (COL_LAST, G_TYPE_BOOLEAN, G_TYPE_STRING);
+ g_object_set (G_OBJECT (list), "model", model, NULL);
+ g_object_unref (model);
+
+ ren = gtk_cell_renderer_toggle_new ();
+ gtk_tree_view_insert_column_with_attributes (list, COL_ENABLED,
+ _("Use"), ren,
+ "active", COL_ENABLED,
+ NULL);
+
+ g_signal_connect (ren, "toggled",
+ G_CALLBACK (list_checkbox_cb),
+ s);
+
+ ren = gtk_cell_renderer_text_new ();
+ gtk_tree_view_insert_column_with_attributes (list, COL_NAME,
+ _("Screen Saver"), ren,
+ "markup", COL_NAME,
+ NULL);
+
+ g_signal_connect_after (list, "row_activated",
+ G_CALLBACK (list_activated_cb),
+ s);
+
+ selection = gtk_tree_view_get_selection (list);
+ g_signal_connect (selection, "changed",
+ G_CALLBACK (list_select_changed_cb),
+ s);
+
+ }
+
+ for (i = 0; i < s->list_count; i++)
+ {
+ int hack_number = s->list_elt_to_hack_number[i];
+ screenhack *hack = (hack_number < 0 ? 0 : p->screenhacks[hack_number]);
+ char *pretty_name;
+ Bool available_p = (hack && s->hacks_available_p [hack_number]);
+
+ if (!hack) continue;
+
+ /* If we're to suppress uninstalled hacks, check $PATH now. */
+ if (p->ignore_uninstalled_p && !available_p)
+ continue;
+
+ pretty_name = (hack->name
+ ? strdup (hack->name)
+ : make_hack_name (dpy, hack->command));
+
+ if (!available_p)
+ {
+ /* Make the text foreground be the color of insensitive widgets
+ (but don't actually make it be insensitive, since we still
+ want to be able to click on it.)
+ */
+ GtkStyle *style = gtk_widget_get_style (GTK_WIDGET (list));
+ GdkColor *fg = &style->fg[GTK_STATE_INSENSITIVE];
+ /* GdkColor *bg = &style->bg[GTK_STATE_INSENSITIVE]; */
+ char *buf = (char *) malloc (strlen (pretty_name) + 100);
+
+ sprintf (buf, "<span foreground=\"#%02X%02X%02X\""
+ /* " background=\"#%02X%02X%02X\"" */
+ ">%s</span>",
+ fg->red >> 8, fg->green >> 8, fg->blue >> 8,
+ /* bg->red >> 8, bg->green >> 8, bg->blue >> 8, */
+ pretty_name);
+ free (pretty_name);
+ pretty_name = buf;
+ }
+
+ gtk_list_store_append (model, &iter);
+ gtk_list_store_set (model, &iter,
+ COL_ENABLED, hack->enabled_p,
+ COL_NAME, pretty_name,
+ -1);
+ free (pretty_name);
+ }
+
+#else /* !HAVE_GTK2 */
+
+ saver_preferences *p = &s->prefs;
+ GtkList *list = GTK_LIST (name_to_widget (s, "list"));
+ int i;
+ for (i = 0; i < s->list_count; i++)
+ {
+ int hack_number = s->list_elt_to_hack_number[i];
+ screenhack *hack = (hack_number < 0 ? 0 : p->screenhacks[hack_number]);
+
+ /* A GtkList must contain only GtkListItems, but those can contain
+ an arbitrary widget. We add an Hbox, and inside that, a Checkbox
+ and a Label. We handle single and double click events on the
+ line itself, for clicking on the text, but the interior checkbox
+ also handles its own events.
+ */
+ GtkWidget *line;
+ GtkWidget *line_hbox;
+ GtkWidget *line_check;
+ GtkWidget *line_label;
+ char *pretty_name;
+ Bool available_p = (hack && s->hacks_available_p [hack_number]);
+
+ if (!hack) continue;
+
+ /* If we're to suppress uninstalled hacks, check $PATH now. */
+ if (p->ignore_uninstalled_p && !available_p)
+ continue;
+
+ pretty_name = (hack->name
+ ? strdup (hack->name)
+ : make_hack_name (hack->command));
+
+ line = gtk_list_item_new ();
+ line_hbox = gtk_hbox_new (FALSE, 0);
+ line_check = gtk_check_button_new ();
+ line_label = gtk_label_new (pretty_name);
+
+ gtk_container_add (GTK_CONTAINER (line), line_hbox);
+ gtk_box_pack_start (GTK_BOX (line_hbox), line_check, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (line_hbox), line_label, FALSE, FALSE, 0);
+
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (line_check),
+ hack->enabled_p);
+ gtk_label_set_justify (GTK_LABEL (line_label), GTK_JUSTIFY_LEFT);
+
+ gtk_widget_show (line_check);
+ gtk_widget_show (line_label);
+ gtk_widget_show (line_hbox);
+ gtk_widget_show (line);
+
+ free (pretty_name);
+
+ gtk_container_add (GTK_CONTAINER (list), line);
+ gtk_signal_connect (GTK_OBJECT (line), "button_press_event",
+ GTK_SIGNAL_FUNC (list_doubleclick_cb),
+ (gpointer) s);
+
+ gtk_signal_connect (GTK_OBJECT (line_check), "toggled",
+ GTK_SIGNAL_FUNC (list_checkbox_cb),
+ (gpointer) s);
+
+ gtk_widget_show (line);
+
+ if (!available_p)
+ {
+ /* Make the widget be colored like insensitive widgets
+ (but don't actually make it be insensitive, since we
+ still want to be able to click on it.)
+ */
+ GtkRcStyle *rc_style;
+ GdkColor fg, bg;
+
+ gtk_widget_realize (GTK_WIDGET (line_label));
+
+ fg = GTK_WIDGET (line_label)->style->fg[GTK_STATE_INSENSITIVE];
+ bg = GTK_WIDGET (line_label)->style->bg[GTK_STATE_INSENSITIVE];
+
+ rc_style = gtk_rc_style_new ();
+ rc_style->fg[GTK_STATE_NORMAL] = fg;
+ rc_style->bg[GTK_STATE_NORMAL] = bg;
+ rc_style->color_flags[GTK_STATE_NORMAL] |= GTK_RC_FG|GTK_RC_BG;
+
+ gtk_widget_modify_style (GTK_WIDGET (line_label), rc_style);
+ gtk_rc_style_unref (rc_style);
+ }
+ }
+
+ gtk_signal_connect (GTK_OBJECT (list), "select_child",
+ GTK_SIGNAL_FUNC (list_select_cb),
+ (gpointer) s);
+ gtk_signal_connect (GTK_OBJECT (list), "unselect_child",
+ GTK_SIGNAL_FUNC (list_unselect_cb),
+ (gpointer) s);
+#endif /* !HAVE_GTK2 */
+}
+
+static void
+update_list_sensitivity (state *s)
+{
+ saver_preferences *p = &s->prefs;
+ Bool sensitive = (p->mode == RANDOM_HACKS ||
+ p->mode == RANDOM_HACKS_SAME ||
+ p->mode == ONE_HACK);
+ Bool checkable = (p->mode == RANDOM_HACKS ||
+ p->mode == RANDOM_HACKS_SAME);
+ Bool blankable = (p->mode != DONT_BLANK);
+
+#ifndef HAVE_GTK2
+ GtkWidget *head = name_to_widget (s, "col_head_hbox");
+ GtkWidget *use = name_to_widget (s, "use_col_frame");
+#endif /* HAVE_GTK2 */
+ GtkWidget *scroller = name_to_widget (s, "scroller");
+ GtkWidget *buttons = name_to_widget (s, "next_prev_hbox");
+ GtkWidget *blanker = name_to_widget (s, "blanking_table");
+
+#ifdef HAVE_GTK2
+ GtkTreeView *list = GTK_TREE_VIEW (name_to_widget (s, "list"));
+ GtkTreeViewColumn *use = gtk_tree_view_get_column (list, COL_ENABLED);
+#else /* !HAVE_GTK2 */
+ GtkList *list = GTK_LIST (name_to_widget (s, "list"));
+ GList *kids = gtk_container_children (GTK_CONTAINER (list));
+
+ gtk_widget_set_sensitive (GTK_WIDGET (head), sensitive);
+#endif /* !HAVE_GTK2 */
+ gtk_widget_set_sensitive (GTK_WIDGET (scroller), sensitive);
+ gtk_widget_set_sensitive (GTK_WIDGET (buttons), sensitive);
+
+ gtk_widget_set_sensitive (GTK_WIDGET (blanker), blankable);
+
+#ifdef HAVE_GTK2
+ gtk_tree_view_column_set_visible (use, checkable);
+#else /* !HAVE_GTK2 */
+ if (checkable)
+ gtk_widget_show (use); /* the "Use" column header */
+ else
+ gtk_widget_hide (use);
+
+ while (kids)
+ {
+ GtkBin *line = GTK_BIN (kids->data);
+ GtkContainer *line_hbox = GTK_CONTAINER (line->child);
+ GtkWidget *line_check =
+ GTK_WIDGET (gtk_container_children (line_hbox)->data);
+
+ if (checkable)
+ gtk_widget_show (line_check);
+ else
+ gtk_widget_hide (line_check);
+
+ kids = kids->next;
+ }
+#endif /* !HAVE_GTK2 */
+}
+
+
+static void
+populate_prefs_page (state *s)
+{
+ saver_preferences *p = &s->prefs;
+
+ Bool can_lock_p = True;
+
+ /* Disable all the "lock" controls if locking support was not provided
+ at compile-time, or if running on MacOS. */
+# if defined(NO_LOCKING) || defined(__APPLE__)
+ can_lock_p = False;
+# endif
+
+
+ /* If there is only one screen, the mode menu contains
+ "random" but not "random-same".
+ */
+ if (s->nscreens <= 1 && p->mode == RANDOM_HACKS_SAME)
+ p->mode = RANDOM_HACKS;
+
+
+ /* The file supports timeouts of less than a minute, but the GUI does
+ not, so throttle the values to be at least one minute (since "0" is
+ a bad rounding choice...)
+ */
+# define THROTTLE(NAME) if (p->NAME != 0 && p->NAME < 60000) p->NAME = 60000
+ THROTTLE (timeout);
+ THROTTLE (cycle);
+ /* THROTTLE (passwd_timeout); */ /* GUI doesn't set this; leave it alone */
+# undef THROTTLE
+
+# define FMT_MINUTES(NAME,N) \
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (name_to_widget (s, (NAME))), (double)((N) + 59) / (60 * 1000))
+
+# define FMT_SECONDS(NAME,N) \
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (name_to_widget (s, (NAME))), (double)((N) / 1000))
+
+ FMT_MINUTES ("timeout_spinbutton", p->timeout);
+ FMT_MINUTES ("cycle_spinbutton", p->cycle);
+ FMT_MINUTES ("lock_spinbutton", p->lock_timeout);
+ FMT_MINUTES ("dpms_standby_spinbutton", p->dpms_standby);
+ FMT_MINUTES ("dpms_suspend_spinbutton", p->dpms_suspend);
+ FMT_MINUTES ("dpms_off_spinbutton", p->dpms_off);
+ FMT_SECONDS ("fade_spinbutton", p->fade_seconds);
+
+# undef FMT_MINUTES
+# undef FMT_SECONDS
+
+# define TOGGLE_ACTIVE(NAME,ACTIVEP) \
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (name_to_widget (s,(NAME))),\
+ (ACTIVEP))
+
+ TOGGLE_ACTIVE ("lock_button", p->lock_p);
+#if 0
+ TOGGLE_ACTIVE ("verbose_button", p->verbose_p);
+ TOGGLE_ACTIVE ("capture_button", p->capture_stderr_p);
+ TOGGLE_ACTIVE ("splash_button", p->splash_p);
+#endif
+ TOGGLE_ACTIVE ("dpms_button", p->dpms_enabled_p);
+ TOGGLE_ACTIVE ("dpms_quickoff_button", p->dpms_quickoff_p);
+ TOGGLE_ACTIVE ("grab_desk_button", p->grab_desktop_p);
+ TOGGLE_ACTIVE ("grab_video_button", p->grab_video_p);
+ TOGGLE_ACTIVE ("grab_image_button", p->random_image_p);
+ TOGGLE_ACTIVE ("install_button", p->install_cmap_p);
+ TOGGLE_ACTIVE ("fade_button", p->fade_p);
+ TOGGLE_ACTIVE ("unfade_button", p->unfade_p);
+
+ switch (p->tmode)
+ {
+ case TEXT_LITERAL: TOGGLE_ACTIVE ("text_radio", True); break;
+ case TEXT_FILE: TOGGLE_ACTIVE ("text_file_radio", True); break;
+ case TEXT_PROGRAM: TOGGLE_ACTIVE ("text_program_radio", True); break;
+ case TEXT_URL: TOGGLE_ACTIVE ("text_url_radio", True); break;
+ default: TOGGLE_ACTIVE ("text_host_radio", True); break;
+ }
+
+# undef TOGGLE_ACTIVE
+
+ gtk_entry_set_text (GTK_ENTRY (name_to_widget (s, "image_text")),
+ (p->image_directory ? p->image_directory : ""));
+ gtk_widget_set_sensitive (name_to_widget (s, "image_text"),
+ p->random_image_p);
+ gtk_widget_set_sensitive (name_to_widget (s, "image_browse_button"),
+ p->random_image_p);
+
+ gtk_entry_set_text (GTK_ENTRY (name_to_widget (s, "text_entry")),
+ (p->text_literal ? p->text_literal : ""));
+ gtk_entry_set_text (GTK_ENTRY (name_to_widget (s, "text_file_entry")),
+ (p->text_file ? p->text_file : ""));
+ gtk_entry_set_text (GTK_ENTRY (name_to_widget (s, "text_program_entry")),
+ (p->text_program ? p->text_program : ""));
+ gtk_entry_set_text (GTK_ENTRY (name_to_widget (s, "text_url_entry")),
+ (p->text_url ? p->text_url : ""));
+
+ gtk_widget_set_sensitive (name_to_widget (s, "text_entry"),
+ p->tmode == TEXT_LITERAL);
+ gtk_widget_set_sensitive (name_to_widget (s, "text_file_entry"),
+ p->tmode == TEXT_FILE);
+ gtk_widget_set_sensitive (name_to_widget (s, "text_file_browse"),
+ p->tmode == TEXT_FILE);
+ gtk_widget_set_sensitive (name_to_widget (s, "text_program_entry"),
+ p->tmode == TEXT_PROGRAM);
+ gtk_widget_set_sensitive (name_to_widget (s, "text_program_browse"),
+ p->tmode == TEXT_PROGRAM);
+ gtk_widget_set_sensitive (name_to_widget (s, "text_url_entry"),
+ p->tmode == TEXT_URL);
+
+
+ /* Map the `saver_mode' enum to mode menu to values. */
+ {
+ GtkOptionMenu *opt = GTK_OPTION_MENU (name_to_widget (s, "mode_menu"));
+
+ int i;
+ for (i = 0; i < countof(mode_menu_order); i++)
+ if (mode_menu_order[i] == p->mode)
+ break;
+ gtk_option_menu_set_history (opt, i);
+ update_list_sensitivity (s);
+ }
+
+ {
+ Bool found_any_writable_cells = False;
+ Bool fading_possible = False;
+ Bool dpms_supported = False;
+
+ Display *dpy = GDK_DISPLAY();
+ int nscreens = ScreenCount(dpy); /* real screens, not Xinerama */
+ int i;
+ for (i = 0; i < nscreens; i++)
+ {
+ Screen *s = ScreenOfDisplay (dpy, i);
+ if (has_writable_cells (s, DefaultVisualOfScreen (s)))
+ {
+ found_any_writable_cells = True;
+ break;
+ }
+ }
+
+ fading_possible = found_any_writable_cells;
+#ifdef HAVE_XF86VMODE_GAMMA
+ fading_possible = True;
+#endif
+
+#ifdef HAVE_DPMS_EXTENSION
+ {
+ int op = 0, event = 0, error = 0;
+ if (XQueryExtension (dpy, "DPMS", &op, &event, &error))
+ dpms_supported = True;
+ }
+#endif /* HAVE_DPMS_EXTENSION */
+
+
+# define SENSITIZE(NAME,SENSITIVEP) \
+ gtk_widget_set_sensitive (name_to_widget (s, (NAME)), (SENSITIVEP))
+
+ /* Blanking and Locking
+ */
+ SENSITIZE ("lock_button", can_lock_p);
+ SENSITIZE ("lock_spinbutton", can_lock_p && p->lock_p);
+ SENSITIZE ("lock_mlabel", can_lock_p && p->lock_p);
+
+ /* DPMS
+ */
+ SENSITIZE ("dpms_frame", dpms_supported);
+ SENSITIZE ("dpms_button", dpms_supported);
+ SENSITIZE ("dpms_quickoff_button", dpms_supported);
+
+ SENSITIZE ("dpms_standby_label", dpms_supported && p->dpms_enabled_p);
+ SENSITIZE ("dpms_standby_mlabel", dpms_supported && p->dpms_enabled_p);
+ SENSITIZE ("dpms_standby_spinbutton", dpms_supported && p->dpms_enabled_p);
+ SENSITIZE ("dpms_suspend_label", dpms_supported && p->dpms_enabled_p);
+ SENSITIZE ("dpms_suspend_mlabel", dpms_supported && p->dpms_enabled_p);
+ SENSITIZE ("dpms_suspend_spinbutton", dpms_supported && p->dpms_enabled_p);
+ SENSITIZE ("dpms_off_label", dpms_supported && p->dpms_enabled_p);
+ SENSITIZE ("dpms_off_mlabel", dpms_supported && p->dpms_enabled_p);
+ SENSITIZE ("dpms_off_spinbutton", dpms_supported && p->dpms_enabled_p);
+
+ /* Colormaps
+ */
+ SENSITIZE ("cmap_frame", found_any_writable_cells || fading_possible);
+ SENSITIZE ("install_button", found_any_writable_cells);
+ SENSITIZE ("fade_button", fading_possible);
+ SENSITIZE ("unfade_button", fading_possible);
+
+ SENSITIZE ("fade_label", (fading_possible &&
+ (p->fade_p || p->unfade_p)));
+ SENSITIZE ("fade_spinbutton", (fading_possible &&
+ (p->fade_p || p->unfade_p)));
+
+# undef SENSITIZE
+ }
+}
+
+
+static void
+populate_popup_window (state *s)
+{
+ GtkLabel *doc = GTK_LABEL (name_to_widget (s, "doc"));
+ char *doc_string = 0;
+
+ /* #### not in Gtk 1.2
+ gtk_label_set_selectable (doc);
+ */
+
+# ifdef HAVE_XML
+ if (s->cdata)
+ {
+ free_conf_data (s->cdata);
+ s->cdata = 0;
+ }
+
+ {
+ saver_preferences *p = &s->prefs;
+ int list_elt = selected_list_element (s);
+ int hack_number = (list_elt >= 0 && list_elt < s->list_count
+ ? s->list_elt_to_hack_number[list_elt]
+ : -1);
+ screenhack *hack = (hack_number >= 0 ? p->screenhacks[hack_number] : 0);
+ if (hack)
+ {
+ GtkWidget *parent = name_to_widget (s, "settings_vbox");
+ GtkWidget *cmd = GTK_WIDGET (name_to_widget (s, "cmd_text"));
+ const char *cmd_line = gtk_entry_get_text (GTK_ENTRY (cmd));
+ s->cdata = load_configurator (cmd_line, s->debug_p);
+ if (s->cdata && s->cdata->widget)
+ gtk_box_pack_start (GTK_BOX (parent), s->cdata->widget,
+ TRUE, TRUE, 0);
+ }
+ }
+
+ doc_string = (s->cdata
+ ? s->cdata->description
+ : 0);
+# else /* !HAVE_XML */
+ doc_string = _("Descriptions not available: no XML support compiled in.");
+# endif /* !HAVE_XML */
+
+ gtk_label_set_text (doc, (doc_string
+ ? _(doc_string)
+ : _("No description available.")));
+}
+
+
+static void
+sensitize_demo_widgets (state *s, Bool sensitive_p)
+{
+ const char *names[] = { "demo", "settings",
+ "cmd_label", "cmd_text", "manual",
+ "visual", "visual_combo" };
+ int i;
+ for (i = 0; i < countof(names); i++)
+ {
+ GtkWidget *w = name_to_widget (s, names[i]);
+ gtk_widget_set_sensitive (GTK_WIDGET(w), sensitive_p);
+ }
+}
+
+
+static void
+sensitize_menu_items (state *s, Bool force_p)
+{
+ static Bool running_p = False;
+ static time_t last_checked = 0;
+ time_t now = time ((time_t *) 0);
+ const char *names[] = { "activate_menu", "lock_menu", "kill_menu",
+ /* "demo" */ };
+ int i;
+
+ if (force_p || now > last_checked + 10) /* check every 10 seconds */
+ {
+ running_p = xscreensaver_running_p (s);
+ last_checked = time ((time_t *) 0);
+ }
+
+ for (i = 0; i < countof(names); i++)
+ {
+ GtkWidget *w = name_to_widget (s, names[i]);
+ gtk_widget_set_sensitive (GTK_WIDGET(w), running_p);
+ }
+}
+
+
+/* When the File menu is de-posted after a "Restart Daemon" command,
+ the window underneath doesn't repaint for some reason. I guess this
+ is a bug in exposure handling in GTK or GDK. This works around it.
+ */
+static void
+force_dialog_repaint (state *s)
+{
+#if 1
+ /* Tell GDK to invalidate and repaint the whole window.
+ */
+ GdkWindow *w = GET_WINDOW (s->toplevel_widget);
+ GdkRegion *region = gdk_region_new ();
+ GdkRectangle rect;
+ rect.x = rect.y = 0;
+ rect.width = rect.height = 32767;
+ gdk_region_union_with_rect (region, &rect);
+ gdk_window_invalidate_region (w, region, True);
+ gdk_region_destroy (region);
+ gdk_window_process_updates (w, True);
+#else
+ /* Force the server to send an exposure event by creating and then
+ destroying a window as a child of the top level shell.
+ */
+ Display *dpy = GDK_DISPLAY();
+ Window parent = GDK_WINDOW_XWINDOW (s->toplevel_widget->window);
+ Window w;
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (dpy, parent, &xgwa);
+ w = XCreateSimpleWindow (dpy, parent, 0, 0, xgwa.width, xgwa.height, 0,0,0);
+ XMapRaised (dpy, w);
+ XDestroyWindow (dpy, w);
+ XSync (dpy, False);
+#endif
+}
+
+
+/* Even though we've given these text fields a maximum number of characters,
+ their default size is still about 30 characters wide -- so measure out
+ a string in their font, and resize them to just fit that.
+ */
+static void
+fix_text_entry_sizes (state *s)
+{
+ GtkWidget *w;
+
+# if 0 /* appears no longer necessary with Gtk 1.2.10 */
+ const char * const spinbuttons[] = {
+ "timeout_spinbutton", "cycle_spinbutton", "lock_spinbutton",
+ "dpms_standby_spinbutton", "dpms_suspend_spinbutton",
+ "dpms_off_spinbutton",
+ "-fade_spinbutton" };
+ int i;
+ int width = 0;
+
+ for (i = 0; i < countof(spinbuttons); i++)
+ {
+ const char *n = spinbuttons[i];
+ int cols = 4;
+ while (*n == '-') n++, cols--;
+ w = GTK_WIDGET (name_to_widget (s, n));
+ width = gdk_text_width (w->style->font, "MMMMMMMM", cols);
+ gtk_widget_set_usize (w, width, -2);
+ }
+
+ /* Now fix the width of the combo box.
+ */
+ w = GTK_WIDGET (name_to_widget (s, "visual_combo"));
+ w = GTK_COMBO (w)->entry;
+ width = gdk_string_width (w->style->font, "PseudoColor___");
+ gtk_widget_set_usize (w, width, -2);
+
+ /* Now fix the width of the file entry text.
+ */
+ w = GTK_WIDGET (name_to_widget (s, "image_text"));
+ width = gdk_string_width (w->style->font, "mmmmmmmmmmmmmm");
+ gtk_widget_set_usize (w, width, -2);
+
+ /* Now fix the width of the command line text.
+ */
+ w = GTK_WIDGET (name_to_widget (s, "cmd_text"));
+ width = gdk_string_width (w->style->font, "mmmmmmmmmmmmmmmmmmmm");
+ gtk_widget_set_usize (w, width, -2);
+
+# endif /* 0 */
+
+ /* Now fix the height of the list widget:
+ make it default to being around 10 text-lines high instead of 4.
+ */
+ w = GTK_WIDGET (name_to_widget (s, "list"));
+ {
+ int lines = 10;
+ int height;
+ int leading = 3; /* approximate is ok... */
+ int border = 2;
+
+#ifdef HAVE_GTK2
+ PangoFontMetrics *pain =
+ pango_context_get_metrics (gtk_widget_get_pango_context (w),
+ gtk_widget_get_style (w)->font_desc,
+ gtk_get_default_language ());
+ height = PANGO_PIXELS (pango_font_metrics_get_ascent (pain) +
+ pango_font_metrics_get_descent (pain));
+#else /* !HAVE_GTK2 */
+ height = w->style->font->ascent + w->style->font->descent;
+#endif /* !HAVE_GTK2 */
+
+ height += leading;
+ height *= lines;
+ height += border * 2;
+ w = GTK_WIDGET (name_to_widget (s, "scroller"));
+ gtk_widget_set_usize (w, -2, height);
+ }
+}
+
+
+#ifndef HAVE_GTK2
+
+/* Pixmaps for the up and down arrow buttons (yeah, this is sleazy...)
+ */
+
+static char *up_arrow_xpm[] = {
+ "15 15 4 1",
+ " c None",
+ "- c #FFFFFF",
+ "+ c #D6D6D6",
+ "@ c #000000",
+
+ " @ ",
+ " @ ",
+ " -+@ ",
+ " -+@ ",
+ " -+++@ ",
+ " -+++@ ",
+ " -+++++@ ",
+ " -+++++@ ",
+ " -+++++++@ ",
+ " -+++++++@ ",
+ " -+++++++++@ ",
+ " -+++++++++@ ",
+ " -+++++++++++@ ",
+ " @@@@@@@@@@@@@ ",
+ " ",
+
+ /* Need these here because gdk_pixmap_create_from_xpm_d() walks off
+ the end of the array (Gtk 1.2.5.) */
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000",
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+};
+
+static char *down_arrow_xpm[] = {
+ "15 15 4 1",
+ " c None",
+ "- c #FFFFFF",
+ "+ c #D6D6D6",
+ "@ c #000000",
+
+ " ",
+ " ------------- ",
+ " -+++++++++++@ ",
+ " -+++++++++@ ",
+ " -+++++++++@ ",
+ " -+++++++@ ",
+ " -+++++++@ ",
+ " -+++++@ ",
+ " -+++++@ ",
+ " -+++@ ",
+ " -+++@ ",
+ " -+@ ",
+ " -+@ ",
+ " @ ",
+ " @ ",
+
+ /* Need these here because gdk_pixmap_create_from_xpm_d() walks off
+ the end of the array (Gtk 1.2.5.) */
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000",
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
+};
+
+static void
+pixmapify_button (state *s, int down_p)
+{
+ GdkPixmap *pixmap;
+ GdkBitmap *mask;
+ GtkWidget *pixmapwid;
+ GtkStyle *style;
+ GtkWidget *w;
+
+ w = GTK_WIDGET (name_to_widget (s, (down_p ? "next" : "prev")));
+ style = gtk_widget_get_style (w);
+ mask = 0;
+ pixmap = gdk_pixmap_create_from_xpm_d (w->window, &mask,
+ &style->bg[GTK_STATE_NORMAL],
+ (down_p
+ ? (gchar **) down_arrow_xpm
+ : (gchar **) up_arrow_xpm));
+ pixmapwid = gtk_pixmap_new (pixmap, mask);
+ gtk_widget_show (pixmapwid);
+ gtk_container_remove (GTK_CONTAINER (w), GTK_BIN (w)->child);
+ gtk_container_add (GTK_CONTAINER (w), pixmapwid);
+}
+
+static void
+map_next_button_cb (GtkWidget *w, gpointer user_data)
+{
+ state *s = (state *) user_data;
+ pixmapify_button (s, 1);
+}
+
+static void
+map_prev_button_cb (GtkWidget *w, gpointer user_data)
+{
+ state *s = (state *) user_data;
+ pixmapify_button (s, 0);
+}
+#endif /* !HAVE_GTK2 */
+
+
+#ifndef HAVE_GTK2
+/* Work around a Gtk bug that causes label widgets to wrap text too early.
+ */
+
+static void
+you_are_not_a_unique_or_beautiful_snowflake (GtkWidget *label,
+ GtkAllocation *allocation,
+ void *foo)
+{
+ GtkRequisition req;
+ GtkWidgetAuxInfo *aux_info;
+
+ aux_info = gtk_object_get_data (GTK_OBJECT (label), "gtk-aux-info");
+
+ aux_info->width = allocation->width;
+ aux_info->height = -2;
+ aux_info->x = -1;
+ aux_info->y = -1;
+
+ gtk_widget_size_request (label, &req);
+}
+
+/* Feel the love. Thanks to Nat Friedman for finding this workaround.
+ */
+static void
+eschew_gtk_lossage (GtkLabel *label)
+{
+ GtkWidgetAuxInfo *aux_info = g_new0 (GtkWidgetAuxInfo, 1);
+ aux_info->width = GTK_WIDGET (label)->allocation.width;
+ aux_info->height = -2;
+ aux_info->x = -1;
+ aux_info->y = -1;
+
+ gtk_object_set_data (GTK_OBJECT (label), "gtk-aux-info", aux_info);
+
+ gtk_signal_connect (GTK_OBJECT (label), "size_allocate",
+ GTK_SIGNAL_FUNC (you_are_not_a_unique_or_beautiful_snowflake),
+ 0);
+
+ gtk_widget_set_usize (GTK_WIDGET (label), -2, -2);
+
+ gtk_widget_queue_resize (GTK_WIDGET (label));
+}
+#endif /* !HAVE_GTK2 */
+
+
+static void
+populate_demo_window (state *s, int list_elt)
+{
+ Display *dpy = GDK_DISPLAY();
+ saver_preferences *p = &s->prefs;
+ screenhack *hack;
+ char *pretty_name;
+ GtkFrame *frame1 = GTK_FRAME (name_to_widget (s, "preview_frame"));
+ GtkFrame *frame2 = GTK_FRAME (name_to_widget (s, "opt_frame"));
+ GtkEntry *cmd = GTK_ENTRY (name_to_widget (s, "cmd_text"));
+ GtkCombo *vis = GTK_COMBO (name_to_widget (s, "visual_combo"));
+ GtkWidget *list = GTK_WIDGET (name_to_widget (s, "list"));
+
+ if (p->mode == BLANK_ONLY)
+ {
+ hack = 0;
+ pretty_name = strdup (_("Blank Screen"));
+ schedule_preview (s, 0);
+ }
+ else if (p->mode == DONT_BLANK)
+ {
+ hack = 0;
+ pretty_name = strdup (_("Screen Saver Disabled"));
+ schedule_preview (s, 0);
+ }
+ else
+ {
+ int hack_number = (list_elt >= 0 && list_elt < s->list_count
+ ? s->list_elt_to_hack_number[list_elt]
+ : -1);
+ hack = (hack_number >= 0 ? p->screenhacks[hack_number] : 0);
+
+ pretty_name = (hack
+ ? (hack->name
+ ? strdup (hack->name)
+ : make_hack_name (dpy, hack->command))
+ : 0);
+
+ if (hack)
+ schedule_preview (s, hack->command);
+ else
+ schedule_preview (s, 0);
+ }
+
+ if (!pretty_name)
+ pretty_name = strdup (_("Preview"));
+
+ gtk_frame_set_label (frame1, _(pretty_name));
+ gtk_frame_set_label (frame2, _(pretty_name));
+
+ gtk_entry_set_text (cmd, (hack ? hack->command : ""));
+ gtk_entry_set_position (cmd, 0);
+
+ {
+ char title[255];
+ sprintf (title, _("%s: %.100s Settings"),
+ progclass, (pretty_name ? pretty_name : "???"));
+ gtk_window_set_title (GTK_WINDOW (s->popup_widget), title);
+ }
+
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (vis)->entry),
+ (hack
+ ? (hack->visual && *hack->visual
+ ? hack->visual
+ : _("Any"))
+ : ""));
+
+ sensitize_demo_widgets (s, (hack ? True : False));
+
+ if (pretty_name) free (pretty_name);
+
+ ensure_selected_item_visible (list);
+
+ s->_selected_list_element = list_elt;
+}
+
+
+static void
+widget_deleter (GtkWidget *widget, gpointer data)
+{
+ /* #### Well, I want to destroy these widgets, but if I do that, they get
+ referenced again, and eventually I get a SEGV. So instead of
+ destroying them, I'll just hide them, and leak a bunch of memory
+ every time the disk file changes. Go go go Gtk!
+
+ #### Ok, that's a lie, I get a crash even if I just hide the widget
+ and don't ever delete it. Fuck!
+ */
+#if 0
+ gtk_widget_destroy (widget);
+#else
+ gtk_widget_hide (widget);
+#endif
+}
+
+
+static char **sort_hack_cmp_names_kludge;
+static int
+sort_hack_cmp (const void *a, const void *b)
+{
+ if (a == b)
+ return 0;
+ else
+ {
+ int aa = *(int *) a;
+ int bb = *(int *) b;
+ const char last[] = "\377\377\377\377\377\377\377\377\377\377\377";
+ return strcmp ((aa < 0 ? last : sort_hack_cmp_names_kludge[aa]),
+ (bb < 0 ? last : sort_hack_cmp_names_kludge[bb]));
+ }
+}
+
+
+static void
+initialize_sort_map (state *s)
+{
+ Display *dpy = GDK_DISPLAY();
+ saver_preferences *p = &s->prefs;
+ int i, j;
+
+ if (s->list_elt_to_hack_number) free (s->list_elt_to_hack_number);
+ if (s->hack_number_to_list_elt) free (s->hack_number_to_list_elt);
+ if (s->hacks_available_p) free (s->hacks_available_p);
+
+ s->list_elt_to_hack_number = (int *)
+ calloc (sizeof(int), p->screenhacks_count + 1);
+ s->hack_number_to_list_elt = (int *)
+ calloc (sizeof(int), p->screenhacks_count + 1);
+ s->hacks_available_p = (Bool *)
+ calloc (sizeof(Bool), p->screenhacks_count + 1);
+ s->total_available = 0;
+
+ /* Check which hacks actually exist on $PATH
+ */
+ for (i = 0; i < p->screenhacks_count; i++)
+ {
+ screenhack *hack = p->screenhacks[i];
+ int on = on_path_p (hack->command) ? 1 : 0;
+ s->hacks_available_p[i] = on;
+ s->total_available += on;
+ }
+
+ /* Initialize list->hack table to unsorted mapping, omitting nonexistent
+ hacks, if desired.
+ */
+ j = 0;
+ for (i = 0; i < p->screenhacks_count; i++)
+ {
+ if (!p->ignore_uninstalled_p ||
+ s->hacks_available_p[i])
+ s->list_elt_to_hack_number[j++] = i;
+ }
+ s->list_count = j;
+
+ for (; j < p->screenhacks_count; j++)
+ s->list_elt_to_hack_number[j] = -1;
+
+
+ /* Generate list of sortable names (once)
+ */
+ sort_hack_cmp_names_kludge = (char **)
+ calloc (sizeof(char *), p->screenhacks_count);
+ for (i = 0; i < p->screenhacks_count; i++)
+ {
+ screenhack *hack = p->screenhacks[i];
+ char *name = (hack->name && *hack->name
+ ? strdup (hack->name)
+ : make_hack_name (dpy, hack->command));
+ char *str;
+ for (str = name; *str; str++)
+ *str = tolower(*str);
+ sort_hack_cmp_names_kludge[i] = name;
+ }
+
+ /* Sort list->hack map alphabetically
+ */
+ qsort (s->list_elt_to_hack_number,
+ p->screenhacks_count,
+ sizeof(*s->list_elt_to_hack_number),
+ sort_hack_cmp);
+
+ /* Free names
+ */
+ for (i = 0; i < p->screenhacks_count; i++)
+ free (sort_hack_cmp_names_kludge[i]);
+ free (sort_hack_cmp_names_kludge);
+ sort_hack_cmp_names_kludge = 0;
+
+ /* Build inverse table */
+ for (i = 0; i < p->screenhacks_count; i++)
+ {
+ int n = s->list_elt_to_hack_number[i];
+ if (n != -1)
+ s->hack_number_to_list_elt[n] = i;
+ }
+}
+
+
+static int
+maybe_reload_init_file (state *s)
+{
+ Display *dpy = GDK_DISPLAY();
+ saver_preferences *p = &s->prefs;
+ int status = 0;
+
+ static Bool reentrant_lock = False;
+ if (reentrant_lock) return 0;
+ reentrant_lock = True;
+
+ if (init_file_changed_p (p))
+ {
+ const char *f = init_file_name();
+ char *b;
+ int list_elt;
+ GtkWidget *list;
+
+ if (!f || !*f) return 0;
+ b = (char *) malloc (strlen(f) + 1024);
+ sprintf (b,
+ _("Warning:\n\n"
+ "file \"%s\" has changed, reloading.\n"),
+ f);
+ warning_dialog (s->toplevel_widget, b, D_NONE, 100);
+ free (b);
+
+ load_init_file (dpy, p);
+ initialize_sort_map (s);
+
+ list_elt = selected_list_element (s);
+ list = name_to_widget (s, "list");
+ gtk_container_foreach (GTK_CONTAINER (list), widget_deleter, NULL);
+ populate_hack_list (s);
+ force_list_select_item (s, list, list_elt, True);
+ populate_prefs_page (s);
+ populate_demo_window (s, list_elt);
+ ensure_selected_item_visible (list);
+
+ status = 1;
+ }
+
+ reentrant_lock = False;
+ return status;
+}
+
+
+
+/* Making the preview window have the right X visual (so that GL works.)
+ */
+
+static Visual *get_best_gl_visual (state *);
+
+static GdkVisual *
+x_visual_to_gdk_visual (Visual *xv)
+{
+ GList *gvs = gdk_list_visuals();
+ if (!xv) return gdk_visual_get_system();
+ for (; gvs; gvs = gvs->next)
+ {
+ GdkVisual *gv = (GdkVisual *) gvs->data;
+ if (xv == GDK_VISUAL_XVISUAL (gv))
+ return gv;
+ }
+ fprintf (stderr, "%s: couldn't convert X Visual 0x%lx to a GdkVisual\n",
+ blurb(), (unsigned long) xv->visualid);
+ abort();
+}
+
+static void
+clear_preview_window (state *s)
+{
+ GtkWidget *p;
+ GdkWindow *window;
+ GtkStyle *style;
+
+ if (!s->toplevel_widget) return; /* very early */
+ p = name_to_widget (s, "preview");
+ window = GET_WINDOW (p);
+
+ if (!window) return;
+
+ /* Flush the widget background down into the window, in case a subproc
+ has changed it. */
+ style = gtk_widget_get_style (p);
+ gdk_window_set_background (window, &style->bg[GTK_STATE_NORMAL]);
+ gdk_window_clear (window);
+
+ {
+ int list_elt = selected_list_element (s);
+ int hack_number = (list_elt >= 0
+ ? s->list_elt_to_hack_number[list_elt]
+ : -1);
+ Bool available_p = (hack_number >= 0
+ ? s->hacks_available_p [hack_number]
+ : True);
+ Bool nothing_p = (s->total_available < 5);
+
+#ifdef HAVE_GTK2
+ GtkWidget *notebook = name_to_widget (s, "preview_notebook");
+ gtk_notebook_set_page (GTK_NOTEBOOK (notebook),
+ (s->running_preview_error_p
+ ? (available_p ? 1 :
+ nothing_p ? 3 : 2)
+ : 0));
+#else /* !HAVE_GTK2 */
+ if (s->running_preview_error_p)
+ {
+ const char * const lines1[] = { N_("No Preview"), N_("Available") };
+ const char * const lines2[] = { N_("Not"), N_("Installed") };
+ int nlines = countof(lines1);
+ int lh = p->style->font->ascent + p->style->font->descent;
+ int y, i;
+ gint w, h;
+
+ const char * const *lines = (available_p ? lines1 : lines2);
+
+ gdk_window_get_size (window, &w, &h);
+ y = (h - (lh * nlines)) / 2;
+ y += p->style->font->ascent;
+ for (i = 0; i < nlines; i++)
+ {
+ int sw = gdk_string_width (p->style->font, _(lines[i]));
+ int x = (w - sw) / 2;
+ gdk_draw_string (window, p->style->font,
+ p->style->fg_gc[GTK_STATE_NORMAL],
+ x, y, _(lines[i]));
+ y += lh;
+ }
+ }
+#endif /* !HAVE_GTK2 */
+ }
+
+ gdk_flush ();
+}
+
+
+static void
+reset_preview_window (state *s)
+{
+ /* On some systems (most recently, MacOS X) OpenGL programs get confused
+ when you kill one and re-start another on the same window. So maybe
+ it's best to just always destroy and recreate the preview window
+ when changing hacks, instead of always trying to reuse the same one?
+ */
+ GtkWidget *pr = name_to_widget (s, "preview");
+ if (GET_REALIZED (pr))
+ {
+ GdkWindow *window = GET_WINDOW (pr);
+ Window oid = (window ? GDK_WINDOW_XWINDOW (window) : 0);
+ Window id;
+ gtk_widget_hide (pr);
+ gtk_widget_unrealize (pr);
+ gtk_widget_realize (pr);
+ gtk_widget_show (pr);
+ id = (window ? GDK_WINDOW_XWINDOW (window) : 0);
+ if (s->debug_p)
+ fprintf (stderr, "%s: window id 0x%X -> 0x%X\n", blurb(),
+ (unsigned int) oid,
+ (unsigned int) id);
+ }
+}
+
+
+static void
+fix_preview_visual (state *s)
+{
+ GtkWidget *widget = name_to_widget (s, "preview");
+ Visual *xvisual = get_best_gl_visual (s);
+ GdkVisual *visual = x_visual_to_gdk_visual (xvisual);
+ GdkVisual *dvisual = gdk_visual_get_system();
+ GdkColormap *cmap = (visual == dvisual
+ ? gdk_colormap_get_system ()
+ : gdk_colormap_new (visual, False));
+
+ if (s->debug_p)
+ fprintf (stderr, "%s: using %s visual 0x%lx\n", blurb(),
+ (visual == dvisual ? "default" : "non-default"),
+ (xvisual ? (unsigned long) xvisual->visualid : 0L));
+
+ if (!GET_REALIZED (widget) ||
+ gtk_widget_get_visual (widget) != visual)
+ {
+ gtk_widget_unrealize (widget);
+ gtk_widget_set_visual (widget, visual);
+ gtk_widget_set_colormap (widget, cmap);
+ gtk_widget_realize (widget);
+ }
+
+ /* Set the Widget colors to be white-on-black. */
+ {
+ GdkWindow *window = GET_WINDOW (widget);
+ GtkStyle *style = gtk_style_copy (gtk_widget_get_style (widget));
+ GdkColormap *cmap = gtk_widget_get_colormap (widget);
+ GdkColor *fg = &style->fg[GTK_STATE_NORMAL];
+ GdkColor *bg = &style->bg[GTK_STATE_NORMAL];
+ GdkGC *fgc = gdk_gc_new(window);
+ GdkGC *bgc = gdk_gc_new(window);
+ if (!gdk_color_white (cmap, fg)) abort();
+ if (!gdk_color_black (cmap, bg)) abort();
+ gdk_gc_set_foreground (fgc, fg);
+ gdk_gc_set_background (fgc, bg);
+ gdk_gc_set_foreground (bgc, bg);
+ gdk_gc_set_background (bgc, fg);
+ style->fg_gc[GTK_STATE_NORMAL] = fgc;
+ style->bg_gc[GTK_STATE_NORMAL] = fgc;
+ gtk_widget_set_style (widget, style);
+
+ /* For debugging purposes, put a title on the window (so that
+ it can be easily found in the output of "xwininfo -tree".)
+ */
+ gdk_window_set_title (window, "Preview");
+ }
+
+ gtk_widget_show (widget);
+}
+
+
+/* Subprocesses
+ */
+
+static char *
+subproc_pretty_name (state *s)
+{
+ if (s->running_preview_cmd)
+ {
+ char *ps = strdup (s->running_preview_cmd);
+ char *ss = strchr (ps, ' ');
+ if (ss) *ss = 0;
+ ss = strrchr (ps, '/');
+ if (!ss)
+ ss = ps;
+ else
+ {
+ ss = strdup (ss+1);
+ free (ps);
+ }
+ return ss;
+ }
+ else
+ return strdup ("???");
+}
+
+
+static void
+reap_zombies (state *s)
+{
+ int wait_status = 0;
+ pid_t pid;
+ while ((pid = waitpid (-1, &wait_status, WNOHANG|WUNTRACED)) > 0)
+ {
+ if (s->debug_p)
+ {
+ if (pid == s->running_preview_pid)
+ {
+ char *ss = subproc_pretty_name (s);
+ fprintf (stderr, "%s: pid %lu (%s) died\n", blurb(),
+ (unsigned long) pid, ss);
+ free (ss);
+ }
+ else
+ fprintf (stderr, "%s: pid %lu died\n", blurb(),
+ (unsigned long) pid);
+ }
+ }
+}
+
+
+/* Mostly lifted from driver/subprocs.c */
+static Visual *
+get_best_gl_visual (state *s)
+{
+ Display *dpy = GDK_DISPLAY();
+ pid_t forked;
+ int fds [2];
+ int in, out;
+ char buf[1024];
+
+ char *av[10];
+ int ac = 0;
+
+ av[ac++] = "xscreensaver-gl-helper";
+ av[ac] = 0;
+
+ if (pipe (fds))
+ {
+ perror ("error creating pipe:");
+ return 0;
+ }
+
+ in = fds [0];
+ out = fds [1];
+
+ switch ((int) (forked = fork ()))
+ {
+ case -1:
+ {
+ sprintf (buf, "%s: couldn't fork", blurb());
+ perror (buf);
+ exit (1);
+ }
+ case 0:
+ {
+ int stdout_fd = 1;
+
+ close (in); /* don't need this one */
+ close (ConnectionNumber (dpy)); /* close display fd */
+
+ if (dup2 (out, stdout_fd) < 0) /* pipe stdout */
+ {
+ perror ("could not dup() a new stdout:");
+ return 0;
+ }
+
+ execvp (av[0], av); /* shouldn't return. */
+
+ if (errno != ENOENT)
+ {
+ /* Ignore "no such file or directory" errors, unless verbose.
+ Issue all other exec errors, though. */
+ sprintf (buf, "%s: running %s", blurb(), av[0]);
+ perror (buf);
+ }
+
+ /* Note that one must use _exit() instead of exit() in procs forked
+ off of Gtk programs -- Gtk installs an atexit handler that has a
+ copy of the X connection (which we've already closed, for safety.)
+ If one uses exit() instead of _exit(), then one sometimes gets a
+ spurious "Gdk-ERROR: Fatal IO error on X server" error message.
+ */
+ _exit (1); /* exits fork */
+ break;
+ }
+ default:
+ {
+ int result = 0;
+ int wait_status = 0;
+
+ FILE *f = fdopen (in, "r");
+ unsigned int v = 0;
+ char c;
+
+ close (out); /* don't need this one */
+
+ *buf = 0;
+ if (!fgets (buf, sizeof(buf)-1, f))
+ *buf = 0;
+ fclose (f);
+
+ /* Wait for the child to die. */
+ waitpid (-1, &wait_status, 0);
+
+ if (1 == sscanf (buf, "0x%x %c", &v, &c))
+ result = (int) v;
+
+ if (result == 0)
+ {
+ if (s->debug_p)
+ fprintf (stderr, "%s: %s did not report a GL visual!\n",
+ blurb(), av[0]);
+ return 0;
+ }
+ else
+ {
+ Visual *v = id_to_visual (DefaultScreenOfDisplay (dpy), result);
+ if (s->debug_p)
+ fprintf (stderr, "%s: %s says the GL visual is 0x%X.\n",
+ blurb(), av[0], result);
+ if (!v) abort();
+ return v;
+ }
+ }
+ }
+
+ abort();
+}
+
+
+static void
+kill_preview_subproc (state *s, Bool reset_p)
+{
+ s->running_preview_error_p = False;
+
+ reap_zombies (s);
+ clear_preview_window (s);
+
+ if (s->subproc_check_timer_id)
+ {
+ gtk_timeout_remove (s->subproc_check_timer_id);
+ s->subproc_check_timer_id = 0;
+ s->subproc_check_countdown = 0;
+ }
+
+ if (s->running_preview_pid)
+ {
+ int status = kill (s->running_preview_pid, SIGTERM);
+ char *ss = subproc_pretty_name (s);
+
+ if (status < 0)
+ {
+ if (errno == ESRCH)
+ {
+ if (s->debug_p)
+ fprintf (stderr, "%s: pid %lu (%s) was already dead.\n",
+ blurb(), (unsigned long) s->running_preview_pid, ss);
+ }
+ else
+ {
+ char buf [1024];
+ sprintf (buf, "%s: couldn't kill pid %lu (%s)",
+ blurb(), (unsigned long) s->running_preview_pid, ss);
+ perror (buf);
+ }
+ }
+ else {
+ int endstatus;
+ waitpid(s->running_preview_pid, &endstatus, 0);
+ if (s->debug_p)
+ fprintf (stderr, "%s: killed pid %lu (%s)\n", blurb(),
+ (unsigned long) s->running_preview_pid, ss);
+ }
+
+ free (ss);
+ s->running_preview_pid = 0;
+ if (s->running_preview_cmd) free (s->running_preview_cmd);
+ s->running_preview_cmd = 0;
+ }
+
+ reap_zombies (s);
+
+ if (reset_p)
+ {
+ reset_preview_window (s);
+ clear_preview_window (s);
+ }
+}
+
+
+/* Immediately and unconditionally launches the given process,
+ after appending the -window-id option; sets running_preview_pid.
+ */
+static void
+launch_preview_subproc (state *s)
+{
+ saver_preferences *p = &s->prefs;
+ Window id;
+ char *new_cmd = 0;
+ pid_t forked;
+ const char *cmd = s->desired_preview_cmd;
+
+ GtkWidget *pr = name_to_widget (s, "preview");
+ GdkWindow *window;
+
+ reset_preview_window (s);
+
+ window = GET_WINDOW (pr);
+
+ s->running_preview_error_p = False;
+
+ if (s->preview_suppressed_p)
+ {
+ kill_preview_subproc (s, False);
+ goto DONE;
+ }
+
+ new_cmd = malloc (strlen (cmd) + 40);
+
+ id = (window ? GDK_WINDOW_XWINDOW (window) : 0);
+ if (id == 0)
+ {
+ /* No window id? No command to run. */
+ free (new_cmd);
+ new_cmd = 0;
+ }
+ else
+ {
+ strcpy (new_cmd, cmd);
+ sprintf (new_cmd + strlen (new_cmd), " -window-id 0x%X",
+ (unsigned int) id);
+ }
+
+ kill_preview_subproc (s, False);
+ if (! new_cmd)
+ {
+ s->running_preview_error_p = True;
+ clear_preview_window (s);
+ goto DONE;
+ }
+
+ switch ((int) (forked = fork ()))
+ {
+ case -1:
+ {
+ char buf[255];
+ sprintf (buf, "%s: couldn't fork", blurb());
+ perror (buf);
+ s->running_preview_error_p = True;
+ goto DONE;
+ break;
+ }
+ case 0:
+ {
+ close (ConnectionNumber (GDK_DISPLAY()));
+
+ hack_subproc_environment (id, s->debug_p);
+
+ usleep (250000); /* pause for 1/4th second before launching, to give
+ the previous program time to die and flush its X
+ buffer, so we don't get leftover turds on the
+ window. */
+
+ exec_command (p->shell, new_cmd, p->nice_inferior);
+ /* Don't bother printing an error message when we are unable to
+ exec subprocesses; we handle that by polling the pid later.
+
+ Note that one must use _exit() instead of exit() in procs forked
+ off of Gtk programs -- Gtk installs an atexit handler that has a
+ copy of the X connection (which we've already closed, for safety.)
+ If one uses exit() instead of _exit(), then one sometimes gets a
+ spurious "Gdk-ERROR: Fatal IO error on X server" error message.
+ */
+ _exit (1); /* exits child fork */
+ break;
+
+ default:
+
+ if (s->running_preview_cmd) free (s->running_preview_cmd);
+ s->running_preview_cmd = strdup (s->desired_preview_cmd);
+ s->running_preview_pid = forked;
+
+ if (s->debug_p)
+ {
+ char *ss = subproc_pretty_name (s);
+ fprintf (stderr, "%s: forked %lu (%s)\n", blurb(),
+ (unsigned long) forked, ss);
+ free (ss);
+ }
+ break;
+ }
+ }
+
+ schedule_preview_check (s);
+
+ DONE:
+ if (new_cmd) free (new_cmd);
+ new_cmd = 0;
+}
+
+
+/* Modify $DISPLAY and $PATH for the benefit of subprocesses.
+ */
+static void
+hack_environment (state *s)
+{
+ static const char *def_path =
+# ifdef DEFAULT_PATH_PREFIX
+ DEFAULT_PATH_PREFIX;
+# else
+ "";
+# endif
+
+ Display *dpy = GDK_DISPLAY();
+ const char *odpy = DisplayString (dpy);
+ char *ndpy = (char *) malloc(strlen(odpy) + 20);
+ strcpy (ndpy, "DISPLAY=");
+ strcat (ndpy, odpy);
+ if (putenv (ndpy))
+ abort ();
+
+ if (s->debug_p)
+ fprintf (stderr, "%s: %s\n", blurb(), ndpy);
+
+ /* don't free(ndpy) -- some implementations of putenv (BSD 4.4, glibc
+ 2.0) copy the argument, but some (libc4,5, glibc 2.1.2) do not.
+ So we must leak it (and/or the previous setting). Yay.
+ */
+
+ if (def_path && *def_path)
+ {
+ const char *opath = getenv("PATH");
+ char *npath = (char *) malloc(strlen(def_path) + strlen(opath) + 20);
+ strcpy (npath, "PATH=");
+ strcat (npath, def_path);
+ strcat (npath, ":");
+ strcat (npath, opath);
+
+ if (putenv (npath))
+ abort ();
+ /* do not free(npath) -- see above */
+
+ if (s->debug_p)
+ fprintf (stderr, "%s: added \"%s\" to $PATH\n", blurb(), def_path);
+ }
+}
+
+
+static void
+hack_subproc_environment (Window preview_window_id, Bool debug_p)
+{
+ /* Store a window ID in $XSCREENSAVER_WINDOW -- this isn't strictly
+ necessary yet, but it will make programs work if we had invoked
+ them with "-root" and not with "-window-id" -- which, of course,
+ doesn't happen.
+ */
+ char *nssw = (char *) malloc (40);
+ sprintf (nssw, "XSCREENSAVER_WINDOW=0x%X", (unsigned int) preview_window_id);
+
+ /* Allegedly, BSD 4.3 didn't have putenv(), but nobody runs such systems
+ any more, right? It's not Posix, but everyone seems to have it. */
+ if (putenv (nssw))
+ abort ();
+
+ if (debug_p)
+ fprintf (stderr, "%s: %s\n", blurb(), nssw);
+
+ /* do not free(nssw) -- see above */
+}
+
+
+/* Called from a timer:
+ Launches the currently-chosen subprocess, if it's not already running.
+ If there's a different process running, kills it.
+ */
+static int
+update_subproc_timer (gpointer data)
+{
+ state *s = (state *) data;
+ if (! s->desired_preview_cmd)
+ kill_preview_subproc (s, True);
+ else if (!s->running_preview_cmd ||
+ !!strcmp (s->desired_preview_cmd, s->running_preview_cmd))
+ launch_preview_subproc (s);
+
+ s->subproc_timer_id = 0;
+ return FALSE; /* do not re-execute timer */
+}
+
+static int
+settings_timer (gpointer data)
+{
+ settings_cb (0, 0);
+ return FALSE;
+}
+
+
+/* Call this when you think you might want a preview process running.
+ It will set a timer that will actually launch that program a second
+ from now, if you haven't changed your mind (to avoid double-click
+ spazzing, etc.) `cmd' may be null meaning "no process".
+ */
+static void
+schedule_preview (state *s, const char *cmd)
+{
+ int delay = 1000 * 0.5; /* 1/2 second hysteresis */
+
+ if (s->debug_p)
+ {
+ if (cmd)
+ fprintf (stderr, "%s: scheduling preview \"%s\"\n", blurb(), cmd);
+ else
+ fprintf (stderr, "%s: scheduling preview death\n", blurb());
+ }
+
+ if (s->desired_preview_cmd) free (s->desired_preview_cmd);
+ s->desired_preview_cmd = (cmd ? strdup (cmd) : 0);
+
+ if (s->subproc_timer_id)
+ gtk_timeout_remove (s->subproc_timer_id);
+ s->subproc_timer_id = gtk_timeout_add (delay, update_subproc_timer, s);
+}
+
+
+/* Called from a timer:
+ Checks to see if the subproc that should be running, actually is.
+ */
+static int
+check_subproc_timer (gpointer data)
+{
+ state *s = (state *) data;
+ Bool again_p = True;
+
+ if (s->running_preview_error_p || /* already dead */
+ s->running_preview_pid <= 0)
+ {
+ again_p = False;
+ }
+ else
+ {
+ int status;
+ reap_zombies (s);
+ status = kill (s->running_preview_pid, 0);
+ if (status < 0 && errno == ESRCH)
+ s->running_preview_error_p = True;
+
+ if (s->debug_p)
+ {
+ char *ss = subproc_pretty_name (s);
+ fprintf (stderr, "%s: timer: pid %lu (%s) is %s\n", blurb(),
+ (unsigned long) s->running_preview_pid, ss,
+ (s->running_preview_error_p ? "dead" : "alive"));
+ free (ss);
+ }
+
+ if (s->running_preview_error_p)
+ {
+ clear_preview_window (s);
+ again_p = False;
+ }
+ }
+
+ /* Otherwise, it's currently alive. We might be checking again, or we
+ might be satisfied. */
+
+ if (--s->subproc_check_countdown <= 0)
+ again_p = False;
+
+ if (again_p)
+ return TRUE; /* re-execute timer */
+ else
+ {
+ s->subproc_check_timer_id = 0;
+ s->subproc_check_countdown = 0;
+ return FALSE; /* do not re-execute timer */
+ }
+}
+
+
+/* Call this just after launching a subprocess.
+ This sets a timer that will, five times a second for two seconds,
+ check whether the program is still running. The assumption here
+ is that if the process didn't stay up for more than a couple of
+ seconds, then either the program doesn't exist, or it doesn't
+ take a -window-id argument.
+ */
+static void
+schedule_preview_check (state *s)
+{
+ int seconds = 2;
+ int ticks = 5;
+
+ if (s->debug_p)
+ fprintf (stderr, "%s: scheduling check\n", blurb());
+
+ if (s->subproc_check_timer_id)
+ gtk_timeout_remove (s->subproc_check_timer_id);
+ s->subproc_check_timer_id =
+ gtk_timeout_add (1000 / ticks,
+ check_subproc_timer, (gpointer) s);
+ s->subproc_check_countdown = ticks * seconds;
+}
+
+
+static Bool
+screen_blanked_p (void)
+{
+ Atom type;
+ int format;
+ unsigned long nitems, bytesafter;
+ unsigned char *dataP = 0;
+ Display *dpy = GDK_DISPLAY();
+ Bool blanked_p = False;
+
+ if (XGetWindowProperty (dpy, RootWindow (dpy, 0), /* always screen #0 */
+ XA_SCREENSAVER_STATUS,
+ 0, 3, False, XA_INTEGER,
+ &type, &format, &nitems, &bytesafter,
+ &dataP)
+ == Success
+ && type == XA_INTEGER
+ && nitems >= 3
+ && dataP)
+ {
+ Atom *data = (Atom *) dataP;
+ blanked_p = (data[0] == XA_BLANK || data[0] == XA_LOCK);
+ }
+
+ if (dataP) XFree (dataP);
+
+ return blanked_p;
+}
+
+/* Wake up every now and then and see if the screen is blanked.
+ If it is, kill off the small-window demo -- no point in wasting
+ cycles by running two screensavers at once...
+ */
+static int
+check_blanked_timer (gpointer data)
+{
+ state *s = (state *) data;
+ Bool blanked_p = screen_blanked_p ();
+ if (blanked_p && s->running_preview_pid)
+ {
+ if (s->debug_p)
+ fprintf (stderr, "%s: screen is blanked: killing preview\n", blurb());
+ kill_preview_subproc (s, True);
+ }
+
+ return True; /* re-execute timer */
+}
+
+
+/* How many screens are there (including Xinerama.)
+ */
+static int
+screen_count (Display *dpy)
+{
+ int nscreens = ScreenCount(dpy);
+# ifdef HAVE_XINERAMA
+ if (nscreens <= 1)
+ {
+ int event_number, error_number;
+ if (XineramaQueryExtension (dpy, &event_number, &error_number) &&
+ XineramaIsActive (dpy))
+ {
+ XineramaScreenInfo *xsi = XineramaQueryScreens (dpy, &nscreens);
+ if (xsi) XFree (xsi);
+ }
+ }
+# endif /* HAVE_XINERAMA */
+
+ return nscreens;
+}
+
+
+/* Setting window manager icon
+ */
+
+static void
+init_icon (GdkWindow *window)
+{
+ GdkBitmap *mask = 0;
+ GdkPixmap *pixmap =
+ gdk_pixmap_create_from_xpm_d (window, &mask, 0,
+ (gchar **) logo_50_xpm);
+ if (pixmap)
+ gdk_window_set_icon (window, 0, pixmap, mask);
+}
+
+
+/* The main demo-mode command loop.
+ */
+
+#if 0
+static Bool
+mapper (XrmDatabase *db, XrmBindingList bindings, XrmQuarkList quarks,
+ XrmRepresentation *type, XrmValue *value, XPointer closure)
+{
+ int i;
+ for (i = 0; quarks[i]; i++)
+ {
+ if (bindings[i] == XrmBindTightly)
+ fprintf (stderr, (i == 0 ? "" : "."));
+ else if (bindings[i] == XrmBindLoosely)
+ fprintf (stderr, "*");
+ else
+ fprintf (stderr, " ??? ");
+ fprintf(stderr, "%s", XrmQuarkToString (quarks[i]));
+ }
+
+ fprintf (stderr, ": %s\n", (char *) value->addr);
+
+ return False;
+}
+#endif
+
+
+static Window
+gnome_screensaver_window (Screen *screen)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ Window root = RootWindowOfScreen (screen);
+ Window parent, *kids;
+ unsigned int nkids;
+ Window gnome_window = 0;
+ int i;
+
+ if (! XQueryTree (dpy, root, &root, &parent, &kids, &nkids))
+ abort ();
+ for (i = 0; i < nkids; i++)
+ {
+ Atom type;
+ int format;
+ unsigned long nitems, bytesafter;
+ unsigned char *name;
+ if (XGetWindowProperty (dpy, kids[i], XA_WM_COMMAND, 0, 128,
+ False, XA_STRING, &type, &format, &nitems,
+ &bytesafter, &name)
+ == Success
+ && type != None
+ && !strcmp ((char *) name, "gnome-screensaver"))
+ {
+ gnome_window = kids[i];
+ break;
+ }
+ }
+
+ if (kids) XFree ((char *) kids);
+ return gnome_window;
+}
+
+static Bool
+gnome_screensaver_active_p (void)
+{
+ Display *dpy = GDK_DISPLAY();
+ Window w = gnome_screensaver_window (DefaultScreenOfDisplay (dpy));
+ return (w ? True : False);
+}
+
+static void
+kill_gnome_screensaver (void)
+{
+ Display *dpy = GDK_DISPLAY();
+ Window w = gnome_screensaver_window (DefaultScreenOfDisplay (dpy));
+ if (w) XKillClient (dpy, (XID) w);
+}
+
+static Bool
+kde_screensaver_active_p (void)
+{
+ FILE *p = popen ("dcop kdesktop KScreensaverIface isEnabled 2>/dev/null",
+ "r");
+ char buf[255];
+ fgets (buf, sizeof(buf)-1, p);
+ pclose (p);
+ if (!strcmp (buf, "true\n"))
+ return True;
+ else
+ return False;
+}
+
+static void
+kill_kde_screensaver (void)
+{
+ system ("dcop kdesktop KScreensaverIface enable false");
+}
+
+
+static void
+the_network_is_not_the_computer (state *s)
+{
+ Display *dpy = GDK_DISPLAY();
+ char *rversion = 0, *ruser = 0, *rhost = 0;
+ char *luser, *lhost;
+ char *msg = 0;
+ struct passwd *p = getpwuid (getuid ());
+ const char *d = DisplayString (dpy);
+
+# if defined(HAVE_UNAME)
+ struct utsname uts;
+ if (uname (&uts) < 0)
+ lhost = "<UNKNOWN>";
+ else
+ lhost = uts.nodename;
+# elif defined(VMS)
+ strcpy (lhost, getenv("SYS$NODE"));
+# else /* !HAVE_UNAME && !VMS */
+ strcat (lhost, "<UNKNOWN>");
+# endif /* !HAVE_UNAME && !VMS */
+
+ if (p && p->pw_name)
+ luser = p->pw_name;
+ else
+ luser = "???";
+
+ server_xscreensaver_version (dpy, &rversion, &ruser, &rhost);
+
+ /* Make a buffer that's big enough for a number of copies of all the
+ strings, plus some. */
+ msg = (char *) malloc (10 * ((rversion ? strlen(rversion) : 0) +
+ (ruser ? strlen(ruser) : 0) +
+ (rhost ? strlen(rhost) : 0) +
+ strlen(lhost) +
+ strlen(luser) +
+ strlen(d) +
+ 1024));
+ *msg = 0;
+
+ if (!rversion || !*rversion)
+ {
+ sprintf (msg,
+ _("Warning:\n\n"
+ "The XScreenSaver daemon doesn't seem to be running\n"
+ "on display \"%s\". Launch it now?"),
+ d);
+ }
+ else if (p && ruser && *ruser && !!strcmp (ruser, p->pw_name))
+ {
+ /* Warn that the two processes are running as different users.
+ */
+ sprintf(msg,
+ _("Warning:\n\n"
+ "%s is running as user \"%s\" on host \"%s\".\n"
+ "But the xscreensaver managing display \"%s\"\n"
+ "is running as user \"%s\" on host \"%s\".\n"
+ "\n"
+ "Since they are different users, they won't be reading/writing\n"
+ "the same ~/.xscreensaver file, so %s isn't\n"
+ "going to work right.\n"
+ "\n"
+ "You should either re-run %s as \"%s\", or re-run\n"
+ "xscreensaver as \"%s\".\n"
+ "\n"
+ "Restart the xscreensaver daemon now?\n"),
+ progname, luser, lhost,
+ d,
+ (ruser ? ruser : "???"), (rhost ? rhost : "???"),
+ progname,
+ progname, (ruser ? ruser : "???"),
+ luser);
+ }
+ else if (rhost && *rhost && !!strcmp (rhost, lhost))
+ {
+ /* Warn that the two processes are running on different hosts.
+ */
+ sprintf (msg,
+ _("Warning:\n\n"
+ "%s is running as user \"%s\" on host \"%s\".\n"
+ "But the xscreensaver managing display \"%s\"\n"
+ "is running as user \"%s\" on host \"%s\".\n"
+ "\n"
+ "If those two machines don't share a file system (that is,\n"
+ "if they don't see the same ~%s/.xscreensaver file) then\n"
+ "%s won't work right.\n"
+ "\n"
+ "Restart the daemon on \"%s\" as \"%s\" now?\n"),
+ progname, luser, lhost,
+ d,
+ (ruser ? ruser : "???"), (rhost ? rhost : "???"),
+ luser,
+ progname,
+ lhost, luser);
+ }
+ else if (!!strcmp (rversion, s->short_version))
+ {
+ /* Warn that the version numbers don't match.
+ */
+ sprintf (msg,
+ _("Warning:\n\n"
+ "This is %s version %s.\n"
+ "But the xscreensaver managing display \"%s\"\n"
+ "is version %s. This could cause problems.\n"
+ "\n"
+ "Restart the xscreensaver daemon now?\n"),
+ progname, s->short_version,
+ d,
+ rversion);
+ }
+
+
+ if (*msg)
+ warning_dialog (s->toplevel_widget, msg, D_LAUNCH, 1);
+
+ if (rversion) free (rversion);
+ if (ruser) free (ruser);
+ if (rhost) free (rhost);
+ free (msg);
+ msg = 0;
+
+ /* Note: since these dialogs are not modal, they will stack up.
+ So we do this check *after* popping up the "xscreensaver is not
+ running" dialog so that these are on top. Good enough.
+ */
+
+ if (gnome_screensaver_active_p ())
+ warning_dialog (s->toplevel_widget,
+ _("Warning:\n\n"
+ "The GNOME screensaver daemon appears to be running.\n"
+ "It must be stopped for XScreenSaver to work properly.\n"
+ "\n"
+ "Stop the GNOME screen saver daemon now?\n"),
+ D_GNOME, 1);
+
+ if (kde_screensaver_active_p ())
+ warning_dialog (s->toplevel_widget,
+ _("Warning:\n\n"
+ "The KDE screen saver daemon appears to be running.\n"
+ "It must be stopped for XScreenSaver to work properly.\n"
+ "\n"
+ "Stop the KDE screen saver daemon now?\n"),
+ D_KDE, 1);
+}
+
+
+/* We use this error handler so that X errors are preceeded by the name
+ of the program that generated them.
+ */
+static int
+demo_ehandler (Display *dpy, XErrorEvent *error)
+{
+ state *s = global_state_kludge; /* I hate C so much... */
+ fprintf (stderr, "\nX error in %s:\n", blurb());
+ XmuPrintDefaultErrorMessage (dpy, error, stderr);
+ kill_preview_subproc (s, False);
+ exit (-1);
+ return 0;
+}
+
+
+/* We use this error handler so that Gtk/Gdk errors are preceeded by the name
+ of the program that generated them; and also that we can ignore one
+ particular bogus error message that Gdk madly spews.
+ */
+static void
+g_log_handler (const gchar *log_domain, GLogLevelFlags log_level,
+ const gchar *message, gpointer user_data)
+{
+ /* Ignore the message "Got event for unknown window: 0x...".
+ Apparently some events are coming in for the xscreensaver window
+ (presumably reply events related to the ClientMessage) and Gdk
+ feels the need to complain about them. So, just suppress any
+ messages that look like that one.
+ */
+ if (strstr (message, "unknown window"))
+ return;
+
+ fprintf (stderr, "%s: %s-%s: %s%s", blurb(),
+ (log_domain ? log_domain : progclass),
+ (log_level == G_LOG_LEVEL_ERROR ? "error" :
+ log_level == G_LOG_LEVEL_CRITICAL ? "critical" :
+ log_level == G_LOG_LEVEL_WARNING ? "warning" :
+ log_level == G_LOG_LEVEL_MESSAGE ? "message" :
+ log_level == G_LOG_LEVEL_INFO ? "info" :
+ log_level == G_LOG_LEVEL_DEBUG ? "debug" : "???"),
+ message,
+ ((!*message || message[strlen(message)-1] != '\n')
+ ? "\n" : ""));
+}
+
+
+STFU
+static char *defaults[] = {
+#include "XScreenSaver_ad.h"
+ 0
+};
+
+#if 0
+#ifdef HAVE_CRAPPLET
+static struct poptOption crapplet_options[] = {
+ {NULL, '\0', 0, NULL, 0}
+};
+#endif /* HAVE_CRAPPLET */
+#endif /* 0 */
+
+const char *usage = "[--display dpy] [--prefs | --settings]"
+# ifdef HAVE_CRAPPLET
+ " [--crapplet]"
+# endif
+ "\n\t\t [--debug] [--sync] [--no-xshm] [--configdir dir]";
+
+static void
+map_popup_window_cb (GtkWidget *w, gpointer user_data)
+{
+ state *s = (state *) user_data;
+ Boolean oi = s->initializing_p;
+#ifndef HAVE_GTK2
+ GtkLabel *label = GTK_LABEL (name_to_widget (s, "doc"));
+#endif
+ s->initializing_p = True;
+#ifndef HAVE_GTK2
+ eschew_gtk_lossage (label);
+#endif
+ s->initializing_p = oi;
+}
+
+
+#if 0
+static void
+print_widget_tree (GtkWidget *w, int depth)
+{
+ int i;
+ for (i = 0; i < depth; i++)
+ fprintf (stderr, " ");
+ fprintf (stderr, "%s\n", gtk_widget_get_name (w));
+
+ if (GTK_IS_LIST (w))
+ {
+ for (i = 0; i < depth+1; i++)
+ fprintf (stderr, " ");
+ fprintf (stderr, "...list kids...\n");
+ }
+ else if (GTK_IS_CONTAINER (w))
+ {
+ GList *kids = gtk_container_children (GTK_CONTAINER (w));
+ while (kids)
+ {
+ print_widget_tree (GTK_WIDGET (kids->data), depth+1);
+ kids = kids->next;
+ }
+ }
+}
+#endif /* 0 */
+
+static int
+delayed_scroll_kludge (gpointer data)
+{
+ state *s = (state *) data;
+ GtkWidget *w = GTK_WIDGET (name_to_widget (s, "list"));
+ ensure_selected_item_visible (w);
+
+ /* Oh, this is just fucking lovely, too. */
+ w = GTK_WIDGET (name_to_widget (s, "preview"));
+ gtk_widget_hide (w);
+ gtk_widget_show (w);
+
+ return FALSE; /* do not re-execute timer */
+}
+
+#ifdef HAVE_GTK2
+
+static GtkWidget *
+create_xscreensaver_demo (void)
+{
+ GtkWidget *nb;
+
+ nb = name_to_widget (global_state_kludge, "preview_notebook");
+ gtk_notebook_set_show_tabs (GTK_NOTEBOOK (nb), FALSE);
+
+ return name_to_widget (global_state_kludge, "xscreensaver_demo");
+}
+
+static GtkWidget *
+create_xscreensaver_settings_dialog (void)
+{
+ GtkWidget *w, *box;
+
+ box = name_to_widget (global_state_kludge, "dialog_action_area");
+
+ w = name_to_widget (global_state_kludge, "adv_button");
+ gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (box), w, TRUE);
+
+ w = name_to_widget (global_state_kludge, "std_button");
+ gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (box), w, TRUE);
+
+ return name_to_widget (global_state_kludge, "xscreensaver_settings_dialog");
+}
+
+#endif /* HAVE_GTK2 */
+
+int
+main (int argc, char **argv)
+{
+ XtAppContext app;
+ state S, *s;
+ saver_preferences *p;
+ Bool prefs_p = False;
+ Bool settings_p = False;
+ int i;
+ Display *dpy;
+ Widget toplevel_shell;
+ char *real_progname = argv[0];
+ char *window_title;
+ char *geom = 0;
+ Bool crapplet_p = False;
+ char *str;
+
+#ifdef ENABLE_NLS
+ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
+ textdomain (GETTEXT_PACKAGE);
+
+# ifdef HAVE_GTK2
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+# else /* !HAVE_GTK2 */
+ if (!setlocale (LC_ALL, ""))
+ fprintf (stderr, "%s: locale not supported by C library\n", real_progname);
+# endif /* !HAVE_GTK2 */
+
+#endif /* ENABLE_NLS */
+
+ str = strrchr (real_progname, '/');
+ if (str) real_progname = str+1;
+
+ s = &S;
+ memset (s, 0, sizeof(*s));
+ s->initializing_p = True;
+ p = &s->prefs;
+
+ global_state_kludge = s; /* I hate C so much... */
+
+ progname = real_progname;
+
+ s->short_version = (char *) malloc (5);
+ memcpy (s->short_version, screensaver_id + 17, 4);
+ s->short_version [4] = 0;
+
+
+ /* Register our error message logger for every ``log domain'' known.
+ There's no way to do this globally, so I grepped the Gtk/Gdk sources
+ for all of the domains that seem to be in use.
+ */
+ {
+ const char * const domains[] = { 0,
+ "Gtk", "Gdk", "GLib", "GModule",
+ "GThread", "Gnome", "GnomeUI" };
+ for (i = 0; i < countof(domains); i++)
+ g_log_set_handler (domains[i], G_LOG_LEVEL_MASK, g_log_handler, 0);
+ }
+
+#ifdef DEFAULT_ICONDIR /* from -D on compile line */
+# ifndef HAVE_GTK2
+ {
+ const char *dir = DEFAULT_ICONDIR;
+ if (*dir) add_pixmap_directory (dir);
+ }
+# endif /* !HAVE_GTK2 */
+#endif /* DEFAULT_ICONDIR */
+
+ /* This is gross, but Gtk understands --display and not -display...
+ */
+ for (i = 1; i < argc; i++)
+ if (argv[i][0] && argv[i][1] &&
+ !strncmp(argv[i], "-display", strlen(argv[i])))
+ argv[i] = "--display";
+
+
+ /* We need to parse this arg really early... Sigh. */
+ for (i = 1; i < argc; i++)
+ {
+ if (argv[i] &&
+ (!strcmp(argv[i], "--crapplet") ||
+ !strcmp(argv[i], "--capplet")))
+ {
+# if defined(HAVE_CRAPPLET) || defined(HAVE_GTK2)
+ int j;
+ crapplet_p = True;
+ for (j = i; j < argc; j++) /* remove it from the list */
+ argv[j] = argv[j+1];
+ argc--;
+# else /* !HAVE_CRAPPLET && !HAVE_GTK2 */
+ fprintf (stderr, "%s: not compiled with --crapplet support\n",
+ real_progname);
+ fprintf (stderr, "%s: %s\n", real_progname, usage);
+ exit (1);
+# endif /* !HAVE_CRAPPLET && !HAVE_GTK2 */
+ }
+ else if (argv[i] &&
+ (!strcmp(argv[i], "--debug") ||
+ !strcmp(argv[i], "-debug") ||
+ !strcmp(argv[i], "-d")))
+ {
+ int j;
+ s->debug_p = True;
+ for (j = i; j < argc; j++) /* remove it from the list */
+ argv[j] = argv[j+1];
+ argc--;
+ i--;
+ }
+ else if (argv[i] &&
+ argc > i+1 &&
+ *argv[i+1] &&
+ (!strcmp(argv[i], "-geometry") ||
+ !strcmp(argv[i], "-geom") ||
+ !strcmp(argv[i], "-geo") ||
+ !strcmp(argv[i], "-g")))
+ {
+ int j;
+ geom = argv[i+1];
+ for (j = i; j < argc; j++) /* remove them from the list */
+ argv[j] = argv[j+2];
+ argc -= 2;
+ i -= 2;
+ }
+ else if (argv[i] &&
+ argc > i+1 &&
+ *argv[i+1] &&
+ (!strcmp(argv[i], "--configdir")))
+ {
+ int j;
+ struct stat st;
+ hack_configuration_path = argv[i+1];
+ for (j = i; j < argc; j++) /* remove them from the list */
+ argv[j] = argv[j+2];
+ argc -= 2;
+ i -= 2;
+
+ if (0 != stat (hack_configuration_path, &st))
+ {
+ char buf[255];
+ sprintf (buf, "%s: %.200s", blurb(), hack_configuration_path);
+ perror (buf);
+ exit (1);
+ }
+ else if (!S_ISDIR (st.st_mode))
+ {
+ fprintf (stderr, "%s: not a directory: %s\n",
+ blurb(), hack_configuration_path);
+ exit (1);
+ }
+ }
+ }
+
+
+ if (s->debug_p)
+ fprintf (stderr, "%s: using config directory \"%s\"\n",
+ progname, hack_configuration_path);
+
+
+ /* Let Gtk open the X connection, then initialize Xt to use that
+ same connection. Doctor Frankenstein would be proud.
+ */
+# ifdef HAVE_CRAPPLET
+ if (crapplet_p)
+ {
+ GnomeClient *client;
+ GnomeClientFlags flags = 0;
+
+ int init_results = gnome_capplet_init ("screensaver-properties",
+ s->short_version,
+ argc, argv, NULL, 0, NULL);
+ /* init_results is:
+ 0 upon successful initialization;
+ 1 if --init-session-settings was passed on the cmdline;
+ 2 if --ignore was passed on the cmdline;
+ -1 on error.
+
+ So the 1 signifies just to init the settings, and quit, basically.
+ (Meaning launch the xscreensaver daemon.)
+ */
+
+ if (init_results < 0)
+ {
+# if 0
+ g_error ("An initialization error occurred while "
+ "starting xscreensaver-capplet.\n");
+# else /* !0 */
+ fprintf (stderr, "%s: gnome_capplet_init failed: %d\n",
+ real_progname, init_results);
+ exit (1);
+# endif /* !0 */
+ }
+
+ client = gnome_master_client ();
+
+ if (client)
+ flags = gnome_client_get_flags (client);
+
+ if (flags & GNOME_CLIENT_IS_CONNECTED)
+ {
+ int token =
+ gnome_startup_acquire_token ("GNOME_SCREENSAVER_PROPERTIES",
+ gnome_client_get_id (client));
+ if (token)
+ {
+ char *session_args[20];
+ int i = 0;
+ session_args[i++] = real_progname;
+ session_args[i++] = "--capplet";
+ session_args[i++] = "--init-session-settings";
+ session_args[i] = 0;
+ gnome_client_set_priority (client, 20);
+ gnome_client_set_restart_style (client, GNOME_RESTART_ANYWAY);
+ gnome_client_set_restart_command (client, i, session_args);
+ }
+ else
+ {
+ gnome_client_set_restart_style (client, GNOME_RESTART_NEVER);
+ }
+
+ gnome_client_flush (client);
+ }
+
+ if (init_results == 1)
+ {
+ system ("xscreensaver -nosplash &");
+ return 0;
+ }
+
+ }
+ else
+# endif /* HAVE_CRAPPLET */
+ {
+ gtk_init (&argc, &argv);
+ }
+
+
+ /* We must read exactly the same resources as xscreensaver.
+ That means we must have both the same progclass *and* progname,
+ at least as far as the resource database is concerned. So,
+ put "xscreensaver" in argv[0] while initializing Xt.
+ */
+ argv[0] = "xscreensaver";
+ progname = argv[0];
+
+
+ /* Teach Xt to use the Display that Gtk/Gdk have already opened.
+ */
+ XtToolkitInitialize ();
+ app = XtCreateApplicationContext ();
+ dpy = GDK_DISPLAY();
+ XtAppSetFallbackResources (app, defaults);
+ XtDisplayInitialize (app, dpy, progname, progclass, 0, 0, &argc, argv);
+ toplevel_shell = XtAppCreateShell (progname, progclass,
+ applicationShellWidgetClass,
+ dpy, 0, 0);
+
+ dpy = XtDisplay (toplevel_shell);
+ db = XtDatabase (dpy);
+ XtGetApplicationNameAndClass (dpy, &progname, &progclass);
+ XSetErrorHandler (demo_ehandler);
+
+ /* Let's just ignore these. They seem to confuse Irix Gtk... */
+ signal (SIGPIPE, SIG_IGN);
+
+ /* After doing Xt-style command-line processing, complain about any
+ unrecognized command-line arguments.
+ */
+ for (i = 1; i < argc; i++)
+ {
+ char *str = argv[i];
+ if (str[0] == '-' && str[1] == '-')
+ str++;
+ if (!strcmp (str, "-prefs"))
+ prefs_p = True;
+ else if (!strcmp (str, "-settings"))
+ settings_p = True;
+ else if (crapplet_p)
+ /* There are lots of random args that we don't care about when we're
+ started as a crapplet, so just ignore unknown args in that case. */
+ ;
+ else
+ {
+ fprintf (stderr, _("%s: unknown option: %s\n"), real_progname,
+ argv[i]);
+ fprintf (stderr, "%s: %s\n", real_progname, usage);
+ exit (1);
+ }
+ }
+
+ /* Load the init file, which may end up consulting the X resource database
+ and the site-wide app-defaults file. Note that at this point, it's
+ important that `progname' be "xscreensaver", rather than whatever
+ was in argv[0].
+ */
+ p->db = db;
+ s->nscreens = screen_count (dpy);
+
+ hack_environment (s); /* must be before initialize_sort_map() */
+
+ load_init_file (dpy, p);
+ initialize_sort_map (s);
+
+ /* Now that Xt has been initialized, and the resources have been read,
+ we can set our `progname' variable to something more in line with
+ reality.
+ */
+ progname = real_progname;
+
+
+#if 0
+ /* Print out all the resources we read. */
+ {
+ XrmName name = { 0 };
+ XrmClass class = { 0 };
+ int count = 0;
+ XrmEnumerateDatabase (db, &name, &class, XrmEnumAllLevels, mapper,
+ (POINTER) &count);
+ }
+#endif
+
+
+ /* Intern the atoms that xscreensaver_command() needs.
+ */
+ XA_VROOT = XInternAtom (dpy, "__SWM_VROOT", False);
+ XA_SCREENSAVER = XInternAtom (dpy, "SCREENSAVER", False);
+ XA_SCREENSAVER_VERSION = XInternAtom (dpy, "_SCREENSAVER_VERSION",False);
+ XA_SCREENSAVER_STATUS = XInternAtom (dpy, "_SCREENSAVER_STATUS", False);
+ XA_SCREENSAVER_ID = XInternAtom (dpy, "_SCREENSAVER_ID", False);
+ XA_SCREENSAVER_RESPONSE = XInternAtom (dpy, "_SCREENSAVER_RESPONSE", False);
+ XA_SELECT = XInternAtom (dpy, "SELECT", False);
+ XA_DEMO = XInternAtom (dpy, "DEMO", False);
+ XA_ACTIVATE = XInternAtom (dpy, "ACTIVATE", False);
+ XA_BLANK = XInternAtom (dpy, "BLANK", False);
+ XA_LOCK = XInternAtom (dpy, "LOCK", False);
+ XA_EXIT = XInternAtom (dpy, "EXIT", False);
+ XA_RESTART = XInternAtom (dpy, "RESTART", False);
+
+
+ /* Create the window and all its widgets.
+ */
+ s->base_widget = create_xscreensaver_demo ();
+ s->popup_widget = create_xscreensaver_settings_dialog ();
+ s->toplevel_widget = s->base_widget;
+
+
+ /* Set the main window's title. */
+ {
+ char *base_title = _("Screensaver Preferences");
+ char *v = (char *) strdup(strchr(screensaver_id, ' '));
+ char *s1, *s2, *s3, *s4;
+ s1 = (char *) strchr(v, ' '); s1++;
+ s2 = (char *) strchr(s1, ' ');
+ s3 = (char *) strchr(v, '('); s3++;
+ s4 = (char *) strchr(s3, ')');
+ *s2 = 0;
+ *s4 = 0;
+
+ window_title = (char *) malloc (strlen (base_title) +
+ strlen (progclass) +
+ strlen (s1) + strlen (s3) +
+ 100);
+ sprintf (window_title, "%s (%s %s, %s)", base_title, progclass, s1, s3);
+ gtk_window_set_title (GTK_WINDOW (s->toplevel_widget), window_title);
+ gtk_window_set_title (GTK_WINDOW (s->popup_widget), window_title);
+ free (v);
+ }
+
+ /* Adjust the (invisible) notebooks on the popup dialog... */
+ {
+ GtkNotebook *notebook =
+ GTK_NOTEBOOK (name_to_widget (s, "opt_notebook"));
+ GtkWidget *std = GTK_WIDGET (name_to_widget (s, "std_button"));
+ int page = 0;
+
+# ifdef HAVE_XML
+ gtk_widget_hide (std);
+# else /* !HAVE_XML */
+ /* Make the advanced page be the only one available. */
+ gtk_widget_set_sensitive (std, False);
+ std = GTK_WIDGET (name_to_widget (s, "adv_button"));
+ gtk_widget_hide (std);
+ std = GTK_WIDGET (name_to_widget (s, "reset_button"));
+ gtk_widget_hide (std);
+ page = 1;
+# endif /* !HAVE_XML */
+
+ gtk_notebook_set_page (notebook, page);
+ gtk_notebook_set_show_tabs (notebook, False);
+ }
+
+ /* Various other widget initializations...
+ */
+ gtk_signal_connect (GTK_OBJECT (s->toplevel_widget), "delete_event",
+ GTK_SIGNAL_FUNC (wm_toplevel_close_cb),
+ (gpointer) s);
+ gtk_signal_connect (GTK_OBJECT (s->popup_widget), "delete_event",
+ GTK_SIGNAL_FUNC (wm_popup_close_cb),
+ (gpointer) s);
+
+ populate_hack_list (s);
+ populate_prefs_page (s);
+ sensitize_demo_widgets (s, False);
+ fix_text_entry_sizes (s);
+ scroll_to_current_hack (s);
+
+ gtk_signal_connect (GTK_OBJECT (name_to_widget (s, "cancel_button")),
+ "map", GTK_SIGNAL_FUNC(map_popup_window_cb),
+ (gpointer) s);
+
+#ifndef HAVE_GTK2
+ gtk_signal_connect (GTK_OBJECT (name_to_widget (s, "prev")),
+ "map", GTK_SIGNAL_FUNC(map_prev_button_cb),
+ (gpointer) s);
+ gtk_signal_connect (GTK_OBJECT (name_to_widget (s, "next")),
+ "map", GTK_SIGNAL_FUNC(map_next_button_cb),
+ (gpointer) s);
+#endif /* !HAVE_GTK2 */
+
+ /* Hook up callbacks to the items on the mode menu. */
+ {
+ GtkOptionMenu *opt = GTK_OPTION_MENU (name_to_widget (s, "mode_menu"));
+ GtkMenu *menu = GTK_MENU (gtk_option_menu_get_menu (opt));
+ GList *kids = gtk_container_children (GTK_CONTAINER (menu));
+ int i;
+ for (i = 0; kids; kids = kids->next, i++)
+ {
+ gtk_signal_connect (GTK_OBJECT (kids->data), "activate",
+ GTK_SIGNAL_FUNC (mode_menu_item_cb),
+ (gpointer) s);
+
+ /* The "random-same" mode menu item does not appear unless
+ there are multple screens.
+ */
+ if (s->nscreens <= 1 &&
+ mode_menu_order[i] == RANDOM_HACKS_SAME)
+ gtk_widget_hide (GTK_WIDGET (kids->data));
+ }
+
+ if (s->nscreens <= 1) /* recompute option-menu size */
+ {
+ gtk_widget_unrealize (GTK_WIDGET (menu));
+ gtk_widget_realize (GTK_WIDGET (menu));
+ }
+ }
+
+
+ /* Handle the -prefs command-line argument. */
+ if (prefs_p)
+ {
+ GtkNotebook *notebook =
+ GTK_NOTEBOOK (name_to_widget (s, "notebook"));
+ gtk_notebook_set_page (notebook, 1);
+ }
+
+# ifdef HAVE_CRAPPLET
+ if (crapplet_p)
+ {
+ GtkWidget *capplet;
+ GtkWidget *outer_vbox;
+
+ gtk_widget_hide (s->toplevel_widget);
+
+ capplet = capplet_widget_new ();
+
+ /* Make there be a "Close" button instead of "OK" and "Cancel" */
+# ifdef HAVE_CRAPPLET_IMMEDIATE
+ capplet_widget_changes_are_immediate (CAPPLET_WIDGET (capplet));
+# endif /* HAVE_CRAPPLET_IMMEDIATE */
+ /* In crapplet-mode, take off the menubar. */
+ gtk_widget_hide (name_to_widget (s, "menubar"));
+
+ /* Reparent our top-level container to be a child of the capplet
+ window.
+ */
+ outer_vbox = GTK_BIN (s->toplevel_widget)->child;
+ gtk_widget_ref (outer_vbox);
+ gtk_container_remove (GTK_CONTAINER (s->toplevel_widget),
+ outer_vbox);
+ STFU GTK_OBJECT_SET_FLAGS (outer_vbox, GTK_FLOATING);
+ gtk_container_add (GTK_CONTAINER (capplet), outer_vbox);
+
+ /* Find the window above us, and set the title and close handler. */
+ {
+ GtkWidget *window = capplet;
+ while (window && !GTK_IS_WINDOW (window))
+ window = GET_PARENT (window);
+ if (window)
+ {
+ gtk_window_set_title (GTK_WINDOW (window), window_title);
+ gtk_signal_connect (GTK_OBJECT (window), "delete_event",
+ GTK_SIGNAL_FUNC (wm_toplevel_close_cb),
+ (gpointer) s);
+ }
+ }
+
+ s->toplevel_widget = capplet;
+ }
+# endif /* HAVE_CRAPPLET */
+
+
+ /* The Gnome folks hate the menubar. I think it's important to have access
+ to the commands on the File menu (Restart Daemon, etc.) and to the
+ About and Documentation commands on the Help menu.
+ */
+#if 0
+#ifdef HAVE_GTK2
+ gtk_widget_hide (name_to_widget (s, "menubar"));
+#endif
+#endif
+
+ free (window_title);
+ window_title = 0;
+
+#ifdef HAVE_GTK2
+ /* After picking the default size, allow -geometry to override it. */
+ if (geom)
+ gtk_window_parse_geometry (GTK_WINDOW (s->toplevel_widget), geom);
+#endif
+
+ gtk_widget_show (s->toplevel_widget);
+ init_icon (GET_WINDOW (GTK_WIDGET (s->toplevel_widget))); /* after `show' */
+ fix_preview_visual (s);
+
+ /* Realize page zero, so that we can diddle the scrollbar when the
+ user tabs back to it -- otherwise, the current hack isn't scrolled
+ to the first time they tab back there, when started with "-prefs".
+ (Though it is if they then tab away, and back again.)
+
+ #### Bah! This doesn't work. Gtk eats my ass! Someone who
+ #### understands this crap, explain to me how to make this work.
+ */
+ gtk_widget_realize (name_to_widget (s, "demos_table"));
+
+
+ gtk_timeout_add (60 * 1000, check_blanked_timer, s);
+
+
+ /* Handle the --settings command-line argument. */
+ if (settings_p)
+ gtk_timeout_add (500, settings_timer, 0);
+
+
+ /* Issue any warnings about the running xscreensaver daemon. */
+ if (! s->debug_p)
+ the_network_is_not_the_computer (s);
+
+
+ if (senesculent_p())
+ warning_dialog (s->toplevel_widget,
+ _("Warning:\n\n"
+ "This version of xscreensaver is VERY OLD!\n"
+ "Please upgrade!\n"
+ "\n"
+ "https://www.jwz.org/xscreensaver/\n"
+ "\n"
+ "(If this is the latest version that your distro ships, then\n"
+ "your distro is doing you a disservice. Build from source.)\n"
+ ),
+ D_NONE, 7);
+
+
+ /* Run the Gtk event loop, and not the Xt event loop. This means that
+ if there were Xt timers or fds registered, they would never get serviced,
+ and if there were any Xt widgets, they would never have events delivered.
+ Fortunately, we're using Gtk for all of the UI, and only initialized
+ Xt so that we could process the command line and use the X resource
+ manager.
+ */
+ s->initializing_p = False;
+
+ /* This totally sucks -- set a timer that whacks the scrollbar 0.5 seconds
+ after we start up. Otherwise, it always appears scrolled to the top
+ when in crapplet-mode. */
+ gtk_timeout_add (500, delayed_scroll_kludge, s);
+
+
+#if 1
+ /* Load every configurator in turn, to scan them for errors all at once. */
+ if (s->debug_p)
+ {
+ int i;
+ for (i = 0; i < p->screenhacks_count; i++)
+ {
+ screenhack *hack = p->screenhacks[i];
+ conf_data *d = load_configurator (hack->command, s->debug_p);
+ if (d) free_conf_data (d);
+ }
+ }
+#endif
+
+
+# ifdef HAVE_CRAPPLET
+ if (crapplet_p)
+ capplet_gtk_main ();
+ else
+# endif /* HAVE_CRAPPLET */
+ gtk_main ();
+
+ kill_preview_subproc (s, False);
+ exit (0);
+}
+
+#endif /* HAVE_GTK -- whole file */
diff --git a/driver/demo-Xm-widgets.c b/driver/demo-Xm-widgets.c
new file mode 100644
index 0000000..cbe3393
--- /dev/null
+++ b/driver/demo-Xm-widgets.c
@@ -0,0 +1,907 @@
+/* demo-Xm.c --- implements the interactive demo-mode and options dialogs.
+ * xscreensaver, Copyright (c) 1999, 2003 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+
+#include <X11/IntrinsicP.h> /* just for debug info */
+#include <X11/ShellP.h>
+
+#include <X11/Shell.h>
+#include <Xm/Xm.h>
+#include <Xm/MainW.h>
+#include <Xm/Form.h>
+#include <Xm/Frame.h>
+#include <Xm/ScrolledW.h>
+#include <Xm/List.h>
+#include <Xm/PushB.h>
+#include <Xm/PushBG.h>
+#include <Xm/Text.h>
+#include <Xm/TextF.h>
+#include <Xm/ToggleBG.h>
+#include <Xm/CascadeBG.h>
+#include <Xm/RowColumn.h>
+#include <Xm/LabelG.h>
+#include <Xm/SeparatoG.h>
+#include <Xm/SelectioB.h>
+
+#ifdef HAVE_XMCOMBOBOX /* a Motif 2.0 widget */
+# include <Xm/ComboBox.h>
+# ifndef XmNtextField /* Lesstif 0.89.4 bug */
+# undef HAVE_XMCOMBOBOX
+# endif
+#endif /* HAVE_XMCOMBOBOX */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+
+
+const char *visual_menu[] = {
+ "Any", "Best", "Default", "Default-N", "GL", "TrueColor", "PseudoColor",
+ "StaticGray", "GrayScale", "DirectColor", "Color", "Gray", "Mono", 0
+};
+
+
+
+static Widget create_demos_page (Widget parent);
+static Widget create_options_page (Widget parent);
+
+static void
+tab_cb (Widget button, XtPointer client_data, XtPointer ignored)
+{
+ Widget parent = XtParent(button);
+ Widget tabber = XtNameToWidget (parent, "*folder");
+ Widget this_tab = (Widget) client_data;
+ Widget *kids = 0;
+ Cardinal nkids = 0;
+ if (!tabber) abort();
+
+ XtVaGetValues (tabber, XmNnumChildren, &nkids, XmNchildren, &kids, NULL);
+ if (!kids) abort();
+ if (nkids > 0)
+ XtUnmanageChildren (kids, nkids);
+
+ XtManageChild (this_tab);
+}
+
+
+Widget
+create_xscreensaver_demo (Widget parent)
+{
+ /* MainWindow
+ Form
+ Menubar
+ DemoTab
+ OptionsTab
+ HR
+ Tabber
+ (demo page)
+ (options page)
+ */
+
+ Widget mainw, form, menubar;
+ Widget demo_tab, options_tab, hr, tabber, demos, options;
+ Arg av[100];
+ int ac = 0;
+
+ mainw = XmCreateMainWindow (parent, "demoForm", av, ac);
+ form = XmCreateForm (mainw, "form", av, ac);
+ menubar = XmCreateSimpleMenuBar (form, "menubar", av, ac);
+ XtVaSetValues (menubar,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ NULL);
+
+ {
+ Widget menu = 0, item = 0;
+ char *menus[] = {
+ "*file", "blank", "lock", "kill", "restart", "-", "exit",
+ "*edit", "cut", "copy", "paste",
+ "*help", "about", "docMenu" };
+ int i;
+ for (i = 0; i < sizeof(menus)/sizeof(*menus); i++)
+ {
+ ac = 0;
+ if (menus[i][0] == '-')
+ item = XmCreateSeparatorGadget (menu, "separator", av, ac);
+ else if (menus[i][0] != '*')
+ item = XmCreatePushButtonGadget (menu, menus[i], av, ac);
+ else
+ {
+ menu = XmCreatePulldownMenu (parent, menus[i]+1, av, ac);
+ XtSetArg (av [ac], XmNsubMenuId, menu); ac++;
+ item = XmCreateCascadeButtonGadget (menubar, menus[i]+1, av, ac);
+
+ if (!strcmp (menus[i]+1, "help"))
+ XtVaSetValues(menubar, XmNmenuHelpWidget, item, NULL);
+ }
+ XtManageChild (item);
+ }
+ ac = 0;
+ }
+
+ demo_tab = XmCreatePushButtonGadget (form, "demoTab", av, ac);
+ XtVaSetValues (demo_tab,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, menubar,
+ NULL);
+
+ options_tab = XmCreatePushButtonGadget (form, "optionsTab", av, ac);
+ XtVaSetValues (options_tab,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, demo_tab,
+ XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNtopWidget, demo_tab,
+ XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNbottomWidget, demo_tab,
+ NULL);
+
+ hr = XmCreateSeparatorGadget (form, "hr", av, ac);
+ XtVaSetValues (hr,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, demo_tab,
+ NULL);
+
+ tabber = XmCreateForm (form, "folder", av, ac);
+ XtVaSetValues (tabber,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, hr,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+
+ demos = create_demos_page (tabber);
+ options = create_options_page (tabber);
+
+ XtAddCallback (demo_tab, XmNactivateCallback, tab_cb, demos);
+ XtAddCallback (options_tab, XmNactivateCallback, tab_cb, options);
+
+ XtManageChild (demos);
+ XtManageChild (options);
+
+ XtManageChild (demo_tab);
+ XtManageChild (options_tab);
+ XtManageChild (hr);
+ XtManageChild (menubar);
+ XtManageChild (tabber);
+ XtManageChild (form);
+
+#if 1
+ XtUnmanageChild (options);
+ XtManageChild (demos);
+#endif
+
+ return mainw;
+}
+
+
+static Widget
+create_demos_page (Widget parent)
+{
+ /* Form1 (horizontal)
+ Form2 (vertical)
+ Scroller
+ List
+ ButtonBox1 (vertical)
+ Button ("Down")
+ Button ("Up")
+ Form3 (vertical)
+ Frame
+ Label
+ TextArea (doc)
+ Label
+ Text ("Command Line")
+ Form4 (horizontal)
+ Checkbox ("Enabled")
+ Label ("Visual")
+ ComboBox
+ HR
+ ButtonBox2 (vertical)
+ Button ("Demo")
+ Button ("Documentation")
+ */
+ Widget form1, form2, form3, form4;
+ Widget scroller, list, buttonbox1, down, up;
+ Widget frame, frame_label, doc, cmd_label, cmd_text, enabled, vis_label;
+ Widget combo;
+ Widget hr, buttonbox2, demo, man;
+ Arg av[100];
+ int ac = 0;
+ int i;
+
+ form1 = XmCreateForm (parent, "form1", av, ac);
+ form2 = XmCreateForm (form1, "form2", av, ac);
+ XtVaSetValues (form2,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+
+ scroller = XmCreateScrolledWindow (form2, "scroller", av, ac);
+ XtVaSetValues (scroller,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_WIDGET,
+ NULL);
+ list = XmCreateList (scroller, "list", av, ac);
+
+ buttonbox1 = XmCreateForm (form2, "buttonbox1", av, ac);
+ XtVaSetValues (buttonbox1,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+ XtVaSetValues (scroller, XmNbottomWidget, buttonbox1, NULL);
+
+ down = XmCreatePushButton (buttonbox1, "down", av, ac);
+ XtVaSetValues (down,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+ up = XmCreatePushButton (buttonbox1, "up", av, ac);
+ XtVaSetValues (up,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, down,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+
+ form3 = XmCreateForm (form1, "form3", av, ac);
+ XtVaSetValues (form3,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, form2,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+ frame = XmCreateFrame (form3, "frame", av, ac);
+
+ ac = 0;
+ XtSetArg (av [ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
+ frame_label = XmCreateLabelGadget (frame, "frameLabel", av, ac);
+
+ ac = 0;
+ XtVaSetValues (frame,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_WIDGET,
+ NULL);
+
+ ac = 0;
+ XtSetArg (av [ac], XmNchildType, XmFRAME_WORKAREA_CHILD); ac++;
+ doc = XmCreateText (frame, "doc", av, ac);
+
+ ac = 0;
+ XtVaSetValues (doc,
+ XmNeditable, FALSE,
+ XmNcursorPositionVisible, FALSE,
+ XmNwordWrap, TRUE,
+ XmNeditMode, XmMULTI_LINE_EDIT,
+ XmNshadowThickness, 0,
+ NULL);
+
+ cmd_label = XmCreateLabelGadget (form3, "cmdLabel", av, ac);
+ XtVaSetValues (cmd_label,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_WIDGET,
+ NULL);
+ XtVaSetValues (frame, XmNbottomWidget, cmd_label, NULL);
+
+ cmd_text = XmCreateTextField (form3, "cmdText", av, ac);
+ XtVaSetValues (cmd_text,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_WIDGET,
+ NULL);
+ XtVaSetValues (cmd_label, XmNbottomWidget, cmd_text, NULL);
+
+ form4 = XmCreateForm (form3, "form4", av, ac);
+ XtVaSetValues (form4,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_WIDGET,
+ NULL);
+ XtVaSetValues (cmd_text, XmNbottomWidget, form4, NULL);
+
+ enabled = XmCreateToggleButtonGadget (form4, "enabled", av, ac);
+ XtVaSetValues (enabled,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+ vis_label = XmCreateLabelGadget (form4, "visLabel", av, ac);
+ XtVaSetValues (vis_label,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, enabled,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+#ifdef HAVE_XMCOMBOBOX
+ {
+ Widget list;
+ ac = 0;
+ XtSetArg (av [ac], XmNcomboBoxType, XmDROP_DOWN_COMBO_BOX); ac++;
+ combo = XmCreateComboBox (form4, "combo", av, ac);
+ for (i = 0; visual_menu[i]; i++)
+ {
+ XmString xs = XmStringCreate ((char *) visual_menu[i],
+ XmSTRING_DEFAULT_CHARSET);
+ XmComboBoxAddItem (combo, xs, 0, False);
+ XmStringFree (xs);
+ }
+ XtVaGetValues (combo, XmNlist, &list, NULL);
+ XtVaSetValues (list, XmNvisibleItemCount, i, NULL);
+ }
+#else /* !HAVE_XMCOMBOBOX */
+ {
+ Widget popup_menu = XmCreatePulldownMenu (parent, "menu", av, ac);
+ Widget kids[100];
+ for (i = 0; visual_menu[i]; i++)
+ {
+ XmString xs = XmStringCreate ((char *) visual_menu[i],
+ XmSTRING_DEFAULT_CHARSET);
+ ac = 0;
+ XtSetArg (av [ac], XmNlabelString, xs); ac++;
+ kids[i] = XmCreatePushButtonGadget (popup_menu, "button", av, ac);
+ /* XtAddCallback (combo, XmNactivateCallback, visual_popup_cb,
+ combo); */
+ XmStringFree (xs);
+ }
+ XtManageChildren (kids, i);
+
+ ac = 0;
+ XtSetArg (av [ac], XmNsubMenuId, popup_menu); ac++;
+ combo = XmCreateOptionMenu (form4, "combo", av, ac);
+ ac = 0;
+ }
+#endif /* !HAVE_XMCOMBOBOX */
+
+ XtVaSetValues (combo,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, vis_label,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+
+ hr = XmCreateSeparatorGadget (form3, "hr", av, ac);
+ XtVaSetValues (hr,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_WIDGET,
+ NULL);
+ XtVaSetValues (form4, XmNbottomWidget, hr, NULL);
+
+ buttonbox2 = XmCreateForm (form3, "buttonbox2", av, ac);
+ XtVaSetValues (buttonbox2,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+ XtVaSetValues (hr, XmNbottomWidget, buttonbox2, NULL);
+
+ demo = XmCreatePushButtonGadget (buttonbox2, "demo", av, ac);
+ XtVaSetValues (demo,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+ man = XmCreatePushButtonGadget (buttonbox2, "man", av, ac);
+ XtVaSetValues (man,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+
+ XtManageChild (demo);
+ XtManageChild (man);
+ XtManageChild (buttonbox2);
+ XtManageChild (hr);
+
+ XtManageChild (combo);
+ XtManageChild (vis_label);
+ XtManageChild (enabled);
+ XtManageChild (form4);
+
+ XtManageChild (cmd_text);
+ XtManageChild (cmd_label);
+
+ XtManageChild (doc);
+ XtManageChild (frame_label);
+ XtManageChild (frame);
+ XtManageChild (form3);
+
+ XtManageChild (up);
+ XtManageChild (down);
+ XtManageChild (buttonbox1);
+
+ XtManageChild (list);
+ XtManageChild (scroller);
+ XtManageChild (form2);
+
+ XtManageChild (form1);
+
+ XtVaSetValues (form1,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+
+ return form1;
+}
+
+
+
+static Widget
+create_options_page (Widget parent)
+{
+ /* This is what the layout is today:
+
+ Form (horizontal)
+ Label ("Saver Timeout")
+ Label ("Cycle Timeout")
+ Label ("Fade Duration")
+ Label ("Fade Ticks")
+ Label ("Lock Timeout")
+ Label ("Password Timeout")
+
+ Text (timeout)
+ Text (cycle)
+ Text (fade seconds)
+ Text (fade ticks)
+ Text (lock)
+ Text (passwd)
+
+ Toggle ("Verbose")
+ Toggle ("Install Colormap")
+ Toggle ("Fade Colormap")
+ Toggle ("Unfade Colormap")
+ Toggle ("Require Password")
+
+ HR
+ Button ("OK")
+ Button ("Cancel")
+ */
+
+ /* This is what it should be:
+
+ Form (horizontal)
+ Form (vertical) ("column1")
+ Frame
+ Label ("Blanking and Locking")
+ Form
+ Label ("Blank After")
+ Label ("Cycle After")
+ Text ("Blank After")
+ Text ("Cycle After")
+ HR
+ Checkbox ("Require Password")
+ Label ("Lock After")
+ Text ("Lock After")
+ Frame
+ Label ("Image Manipulation")
+ Form
+ Checkbox ("Grab Desktop Images")
+ Checkbox ("Grab Video Frames")
+ Checkbox ("Choose Random Image")
+ Text (pathname)
+ Button ("Browse")
+ Frame
+ Label ("Diagnostics")
+ Form
+ Checkbox ("Verbose Diagnostics")
+ Checkbox ("Display Subprocess Errors")
+ Checkbox ("Display Splash Screen at Startup")
+ Form (vertical) ("column2")
+ Frame
+ Label ("Display Power Management")
+ Form
+ Checkbox ("Power Management Enabled")
+ Label ("Standby After")
+ Label ("Suspend After")
+ Label ("Off After")
+ Text ("Standby After")
+ Text ("Suspend After")
+ Text ("Off After")
+ Frame
+ Label ("Colormaps")
+ Form
+ Checkbox ("Install Colormap")
+ HR
+ Checkbox ("Fade To Black When Blanking")
+ Checkbox ("Fade From Black When Unblanking")
+ Label ("Fade Duration")
+ Text ("Fade Duration")
+
+ timeoutLabel
+ cycleLabel
+ fadeSecondsLabel
+ fadeTicksLabel
+ lockLabel
+ passwdLabel
+
+ timeoutText
+ cycleText
+ fadeSecondsText
+ fadeTicksText
+ lockText
+ passwdText
+
+ verboseToggle
+ cmapToggle
+ fadeToggle
+ unfadeToggle
+ lockToggle
+
+ separator
+ OK
+ Cancel
+ */
+
+
+
+ Arg av[64];
+ int ac = 0;
+ Widget children[100];
+ Widget timeout_label, cycle_label, fade_seconds_label, fade_ticks_label;
+ Widget lock_label, passwd_label, hr;
+ Widget preferences_form;
+
+ Widget timeout_text, cycle_text, fade_text, fade_ticks_text;
+ Widget lock_timeout_text, passwd_timeout_text, verbose_toggle;
+ Widget install_cmap_toggle, fade_toggle, unfade_toggle;
+ Widget lock_toggle, prefs_done, prefs_cancel;
+
+ ac = 0;
+ XtSetArg (av [ac], XmNdialogType, XmDIALOG_PROMPT); ac++;
+
+ ac = 0;
+ XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+ XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+ XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+ XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+ preferences_form = XmCreateForm (parent, "preferencesForm", av, ac);
+ XtManageChild (preferences_form);
+
+ ac = 0;
+
+ XtSetArg(av[ac], XmNalignment, XmALIGNMENT_END); ac++;
+ timeout_label = XmCreateLabelGadget (preferences_form, "timeoutLabel",
+ av, ac);
+ ac = 0;
+ XtSetArg(av[ac], XmNalignment, XmALIGNMENT_END); ac++;
+ cycle_label = XmCreateLabelGadget (preferences_form, "cycleLabel",
+ av, ac);
+ ac = 0;
+ XtSetArg(av[ac], XmNalignment, XmALIGNMENT_END); ac++;
+ fade_seconds_label = XmCreateLabelGadget (preferences_form,
+ "fadeSecondsLabel", av, ac);
+ ac = 0;
+ XtSetArg(av[ac], XmNalignment, XmALIGNMENT_END); ac++;
+ fade_ticks_label = XmCreateLabelGadget (preferences_form, "fadeTicksLabel",
+ av, ac);
+ ac = 0;
+ XtSetArg(av[ac], XmNalignment, XmALIGNMENT_END); ac++;
+ lock_label = XmCreateLabelGadget (preferences_form, "lockLabel", av, ac);
+ ac = 0;
+ XtSetArg(av[ac], XmNalignment, XmALIGNMENT_END); ac++;
+ passwd_label = XmCreateLabelGadget (preferences_form, "passwdLabel", av, ac);
+ ac = 0;
+ timeout_text = XmCreateTextField (preferences_form, "timeoutText", av, ac);
+ cycle_text = XmCreateTextField (preferences_form, "cycleText", av, ac);
+ fade_text = XmCreateTextField (preferences_form, "fadeSecondsText", av, ac);
+ fade_ticks_text = XmCreateTextField (preferences_form, "fadeTicksText",
+ av, ac);
+ lock_timeout_text = XmCreateTextField (preferences_form, "lockText",
+ av, ac);
+ passwd_timeout_text = XmCreateTextField (preferences_form, "passwdText",
+ av, ac);
+ XtSetArg(av[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+ verbose_toggle = XmCreateToggleButtonGadget (preferences_form,
+ "verboseToggle", av, ac);
+ ac = 0;
+ XtSetArg(av[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+ install_cmap_toggle = XmCreateToggleButtonGadget (preferences_form,
+ "cmapToggle", av, ac);
+ ac = 0;
+ XtSetArg(av[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+ fade_toggle = XmCreateToggleButtonGadget (preferences_form, "fadeToggle",
+ av, ac);
+ ac = 0;
+ XtSetArg(av[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+ unfade_toggle = XmCreateToggleButtonGadget (preferences_form, "unfadeToggle",
+ av,ac);
+ ac = 0;
+ XtSetArg(av[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+ lock_toggle = XmCreateToggleButtonGadget (preferences_form, "lockToggle",
+ av, ac);
+ ac = 0;
+ hr = XmCreateSeparatorGadget (preferences_form, "separator", av, ac);
+
+ prefs_done = XmCreatePushButtonGadget (preferences_form, "OK", av, ac);
+ prefs_cancel = XmCreatePushButtonGadget (preferences_form, "Cancel", av, ac);
+
+ XtVaSetValues (timeout_label,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNtopOffset, 4,
+ XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNbottomWidget, timeout_text,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNleftOffset, 20,
+ XmNrightAttachment, XmATTACH_WIDGET,
+ XmNrightOffset, 4,
+ XmNrightWidget, timeout_text,
+ NULL);
+
+ XtVaSetValues (cycle_label,
+ XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNtopOffset, 0,
+ XmNtopWidget, cycle_text,
+ XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNbottomOffset, 0,
+ XmNbottomWidget, cycle_text,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNleftOffset, 20,
+ XmNrightAttachment, XmATTACH_WIDGET,
+ XmNrightOffset, 4,
+ XmNrightWidget, cycle_text,
+ NULL);
+
+ XtVaSetValues (fade_seconds_label,
+ XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNtopOffset, 0,
+ XmNtopWidget, fade_text,
+ XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNbottomOffset, 0,
+ XmNbottomWidget, fade_text,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNleftOffset, 20,
+ XmNrightAttachment, XmATTACH_WIDGET,
+ XmNrightOffset, 4,
+ XmNrightWidget, fade_text,
+ NULL);
+
+ XtVaSetValues (fade_ticks_label,
+ XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNtopOffset, 0,
+ XmNtopWidget, fade_ticks_text,
+ XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNbottomOffset, 0,
+ XmNbottomWidget, fade_ticks_text,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNleftOffset, 20,
+ XmNrightAttachment, XmATTACH_WIDGET,
+ XmNrightOffset, 4,
+ XmNrightWidget, fade_ticks_text,
+ NULL);
+
+ XtVaSetValues (lock_label,
+ XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNtopOffset, 0,
+ XmNtopWidget, lock_timeout_text,
+ XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNbottomOffset, 0,
+ XmNbottomWidget, lock_timeout_text,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNleftOffset, 19,
+ XmNrightAttachment, XmATTACH_WIDGET,
+ XmNrightOffset, 4,
+ XmNrightWidget, lock_timeout_text,
+ NULL);
+
+ XtVaSetValues (passwd_label,
+ XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNtopOffset, 0,
+ XmNtopWidget, passwd_timeout_text,
+ XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNbottomOffset, 0,
+ XmNbottomWidget, passwd_timeout_text,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNleftOffset, 14,
+ XmNrightAttachment, XmATTACH_WIDGET,
+ XmNrightOffset, 4,
+ XmNrightWidget, passwd_timeout_text,
+ NULL);
+
+ XtVaSetValues (timeout_text,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNtopOffset, 4,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNleftOffset, 141,
+ NULL);
+
+ XtVaSetValues (cycle_text,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopOffset, 2,
+ XmNtopWidget, timeout_text,
+ XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNleftOffset, 0,
+ XmNleftWidget, timeout_text,
+ NULL);
+
+ XtVaSetValues (fade_text,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopOffset, 2,
+ XmNtopWidget, cycle_text,
+ XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNleftOffset, 0,
+ XmNleftWidget, cycle_text,
+ NULL);
+
+ XtVaSetValues (fade_ticks_text,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopOffset, 2,
+ XmNtopWidget, fade_text,
+ XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNleftOffset, 0,
+ XmNleftWidget, fade_text,
+ NULL);
+
+ XtVaSetValues (lock_timeout_text,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopOffset, 2,
+ XmNtopWidget, fade_ticks_text,
+ XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNleftOffset, 0,
+ XmNleftWidget, fade_ticks_text,
+ NULL);
+
+ XtVaSetValues (passwd_timeout_text,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopOffset, 4,
+ XmNtopWidget, lock_timeout_text,
+ XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNleftOffset, 0,
+ XmNleftWidget, lock_timeout_text,
+ NULL);
+
+ XtVaSetValues (verbose_toggle,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNtopOffset, 4,
+ XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNbottomOffset, 0,
+ XmNbottomWidget, timeout_text,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftOffset, 20,
+ XmNleftWidget, timeout_text,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNrightOffset, 20,
+ NULL);
+
+ XtVaSetValues (install_cmap_toggle,
+ XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNtopOffset, 0,
+ XmNtopWidget, cycle_text,
+ XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNbottomOffset, 0,
+ XmNbottomWidget, cycle_text,
+ XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNleftOffset, 0,
+ XmNleftWidget, verbose_toggle,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNrightOffset, 20,
+ NULL);
+
+ XtVaSetValues (fade_toggle,
+ XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNtopOffset, 0,
+ XmNtopWidget, fade_text,
+ XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNbottomOffset, 0,
+ XmNbottomWidget, fade_text,
+ XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNleftOffset, 0,
+ XmNleftWidget, install_cmap_toggle,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNrightOffset, 20,
+ NULL);
+
+ XtVaSetValues (unfade_toggle,
+ XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNtopOffset, 0,
+ XmNtopWidget, fade_ticks_text,
+ XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNbottomOffset, 0,
+ XmNbottomWidget, fade_ticks_text,
+ XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNleftOffset, 0,
+ XmNleftWidget, fade_toggle,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNrightOffset, 20,
+ NULL);
+
+ XtVaSetValues (lock_toggle,
+ XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNtopOffset, 0,
+ XmNtopWidget, lock_timeout_text,
+ XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNbottomOffset, 0,
+ XmNbottomWidget, lock_timeout_text,
+ XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
+ XmNleftOffset, 0,
+ XmNleftWidget, unfade_toggle,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNrightOffset, 20,
+ NULL);
+
+ XtVaSetValues (hr,
+ XmNtopWidget, passwd_timeout_text,
+ XmNbottomAttachment, XmATTACH_FORM,
+ XmNbottomOffset, 4,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ NULL);
+
+ XtVaSetValues (prefs_done,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+ XtVaSetValues (prefs_cancel,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+ XtVaSetValues (hr,
+ XmNbottomAttachment, XmATTACH_WIDGET,
+ XmNbottomWidget, prefs_done,
+ NULL);
+
+ ac = 0;
+ children[ac++] = timeout_label;
+ children[ac++] = cycle_label;
+ children[ac++] = fade_seconds_label;
+ children[ac++] = fade_ticks_label;
+ children[ac++] = lock_label;
+ children[ac++] = passwd_label;
+ children[ac++] = timeout_text;
+ children[ac++] = cycle_text;
+ children[ac++] = fade_text;
+ children[ac++] = fade_ticks_text;
+ children[ac++] = lock_timeout_text;
+ children[ac++] = passwd_timeout_text;
+ children[ac++] = verbose_toggle;
+ children[ac++] = install_cmap_toggle;
+ children[ac++] = fade_toggle;
+ children[ac++] = unfade_toggle;
+ children[ac++] = lock_toggle;
+ children[ac++] = hr;
+
+ XtManageChildren(children, ac);
+ ac = 0;
+
+ XtManageChild (prefs_done);
+ XtManageChild (prefs_cancel);
+
+ XtManageChild (preferences_form);
+
+ XtVaSetValues (preferences_form,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+
+ return preferences_form;
+}
diff --git a/driver/demo-Xm.c b/driver/demo-Xm.c
new file mode 100644
index 0000000..149e7c5
--- /dev/null
+++ b/driver/demo-Xm.c
@@ -0,0 +1,1875 @@
+/* demo-Xm.c --- implements the interactive demo-mode and options dialogs.
+ * xscreensaver, Copyright (c) 1993-2003, 2005 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifdef HAVE_MOTIF /* whole file */
+
+#include <stdlib.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#ifndef VMS
+# include <pwd.h> /* for getpwuid() */
+#else /* VMS */
+# include "vms-pwd.h"
+#endif /* VMS */
+
+#ifdef HAVE_UNAME
+# include <sys/utsname.h> /* for uname() */
+#endif /* HAVE_UNAME */
+
+#include <stdio.h>
+
+#include <X11/Xproto.h> /* for CARD32 */
+#include <X11/Xatom.h> /* for XA_INTEGER */
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+
+/* We don't actually use any widget internals, but these are included
+ so that gdb will have debug info for the widgets... */
+#include <X11/IntrinsicP.h>
+#include <X11/ShellP.h>
+
+#ifdef HAVE_XPM
+# include <X11/xpm.h>
+#endif /* HAVE_XPM */
+
+#ifdef HAVE_XMU
+# ifndef VMS
+# include <X11/Xmu/Error.h>
+# else /* VMS */
+# include <Xmu/Error.h>
+# endif
+#else
+# include "xmu.h"
+#endif
+
+
+
+#include <Xm/Xm.h>
+#include <Xm/List.h>
+#include <Xm/PushB.h>
+#include <Xm/LabelG.h>
+#include <Xm/RowColumn.h>
+#include <Xm/MessageB.h>
+
+#ifdef HAVE_XMCOMBOBOX /* a Motif 2.0 widget */
+# include <Xm/ComboBox.h>
+# ifndef XmNtextField /* Lesstif 0.89.4 bug */
+# undef HAVE_XMCOMBOBOX
+# endif
+# if (XmVersion < 2001) /* Lesstif has two personalities these days */
+# undef HAVE_XMCOMBOBOX
+# endif
+#endif /* HAVE_XMCOMBOBOX */
+
+#include "version.h"
+#include "prefs.h"
+#include "resources.h" /* for parse_time() */
+#include "visual.h" /* for has_writable_cells() */
+#include "remote.h" /* for xscreensaver_command() */
+#include "usleep.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+
+char *progname = 0;
+char *progclass = "XScreenSaver";
+XrmDatabase db;
+
+typedef struct {
+ saver_preferences *a, *b;
+} prefs_pair;
+
+static void *global_prefs_pair; /* I hate C so much... */
+
+char *blurb (void) { return progname; }
+
+extern Widget create_xscreensaver_demo (Widget parent);
+extern const char *visual_menu[];
+
+
+static char *short_version = 0;
+
+Atom XA_VROOT;
+Atom XA_SCREENSAVER, XA_SCREENSAVER_RESPONSE, XA_SCREENSAVER_VERSION;
+Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_SELECT, XA_DEMO;
+Atom XA_ACTIVATE, XA_BLANK, XA_LOCK, XA_RESTART, XA_EXIT;
+
+
+static void populate_demo_window (Widget toplevel,
+ int which, prefs_pair *pair);
+static void populate_prefs_page (Widget top, prefs_pair *pair);
+static int apply_changes_and_save (Widget widget);
+static int maybe_reload_init_file (Widget widget, prefs_pair *pair);
+static void await_xscreensaver (Widget widget);
+
+
+/* Some random utility functions
+ */
+
+static Widget
+name_to_widget (Widget widget, const char *name)
+{
+ Widget parent;
+ char name2[255];
+ name2[0] = '*';
+ strcpy (name2+1, name);
+
+ while ((parent = XtParent (widget)))
+ widget = parent;
+ return XtNameToWidget (widget, name2);
+}
+
+
+
+/* Why this behavior isn't automatic in *either* toolkit, I'll never know.
+ Takes a scroller, viewport, or list as an argument.
+ */
+static void
+ensure_selected_item_visible (Widget list)
+{
+ int *pos_list = 0;
+ int pos_count = 0;
+ if (XmListGetSelectedPos (list, &pos_list, &pos_count) && pos_count > 0)
+ {
+ int top = -2;
+ int visible = 0;
+ XtVaGetValues (list,
+ XmNtopItemPosition, &top,
+ XmNvisibleItemCount, &visible,
+ NULL);
+ if (pos_list[0] >= top + visible)
+ {
+ int pos = pos_list[0] - visible + 1;
+ if (pos < 0) pos = 0;
+ XmListSetPos (list, pos);
+ }
+ else if (pos_list[0] < top)
+ {
+ XmListSetPos (list, pos_list[0]);
+ }
+ }
+ if (pos_list)
+ XtFree ((char *) pos_list);
+}
+
+
+static void
+warning_dialog_dismiss_cb (Widget button, XtPointer client_data,
+ XtPointer user_data)
+{
+ Widget shell = (Widget) client_data;
+ XtDestroyWidget (shell);
+}
+
+
+static void
+warning_dialog (Widget parent, const char *message, int center)
+{
+ char *msg = strdup (message);
+ char *head;
+
+ Widget dialog = 0;
+ Widget label = 0;
+ Widget ok = 0;
+ int i = 0;
+
+ Widget w;
+ Widget container;
+ XmString xmstr;
+ Arg av[10];
+ int ac = 0;
+
+ ac = 0;
+ dialog = XmCreateWarningDialog (parent, "warning", av, ac);
+
+ w = XmMessageBoxGetChild (dialog, XmDIALOG_MESSAGE_LABEL);
+ if (w) XtUnmanageChild (w);
+ w = XmMessageBoxGetChild (dialog, XmDIALOG_CANCEL_BUTTON);
+ if (w) XtUnmanageChild (w);
+ w = XmMessageBoxGetChild (dialog, XmDIALOG_HELP_BUTTON);
+ if (w) XtUnmanageChild (w);
+
+ ok = XmMessageBoxGetChild (dialog, XmDIALOG_OK_BUTTON);
+
+ ac = 0;
+ XtSetArg (av[ac], XmNnumColumns, 1); ac++;
+ XtSetArg (av[ac], XmNorientation, XmVERTICAL); ac++;
+ XtSetArg (av[ac], XmNpacking, XmPACK_COLUMN); ac++;
+ XtSetArg (av[ac], XmNrowColumnType, XmWORK_AREA); ac++;
+ XtSetArg (av[ac], XmNspacing, 0); ac++;
+ container = XmCreateRowColumn (dialog, "container", av, ac);
+
+ head = msg;
+ while (head)
+ {
+ char name[20];
+ char *s = strchr (head, '\n');
+ if (s) *s = 0;
+
+ sprintf (name, "label%d", i++);
+
+ xmstr = XmStringCreate (head, XmSTRING_DEFAULT_CHARSET);
+ ac = 0;
+ XtSetArg (av[ac], XmNlabelString, xmstr); ac++;
+ XtSetArg (av[ac], XmNmarginHeight, 0); ac++;
+ label = XmCreateLabelGadget (container, name, av, ac);
+ XtManageChild (label);
+ XmStringFree (xmstr);
+
+ if (s)
+ head = s+1;
+ else
+ head = 0;
+
+ center--;
+ }
+
+ XtManageChild (container);
+ XtRealizeWidget (dialog);
+ XtManageChild (dialog);
+
+ XtAddCallback (ok, XmNactivateCallback, warning_dialog_dismiss_cb, dialog);
+
+ free (msg);
+}
+
+
+static void
+run_cmd (Widget widget, Atom command, int arg)
+{
+ char *err = 0;
+ int status;
+
+ apply_changes_and_save (widget);
+ status = xscreensaver_command (XtDisplay (widget),
+ command, arg, False, &err);
+ if (status < 0)
+ {
+ char buf [255];
+ if (err)
+ sprintf (buf, "Error:\n\n%s", err);
+ else
+ strcpy (buf, "Unknown error!");
+ warning_dialog (widget, buf, 100);
+ }
+ if (err) free (err);
+}
+
+
+static void
+run_hack (Widget widget, int which, Bool report_errors_p)
+{
+ if (which < 0) return;
+ apply_changes_and_save (widget);
+ if (report_errors_p)
+ run_cmd (widget, XA_DEMO, which + 1);
+ else
+ {
+ char *s = 0;
+ xscreensaver_command (XtDisplay (widget), XA_DEMO, which + 1, False, &s);
+ if (s) free (s);
+ }
+}
+
+
+
+/* Button callbacks
+ */
+
+void
+exit_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
+{
+ apply_changes_and_save (XtParent (button));
+ exit (0);
+}
+
+#if 0
+static void
+wm_close_cb (Widget widget, GdkEvent *event, XtPointer data)
+{
+ apply_changes_and_save (XtParent (button));
+ exit (0);
+}
+#endif
+
+void
+cut_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
+{
+ /* #### */
+ warning_dialog (XtParent (button),
+ "Error:\n\n"
+ "cut unimplemented\n", 1);
+}
+
+
+void
+copy_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
+{
+ /* #### */
+ warning_dialog (XtParent (button),
+ "Error:\n\n"
+ "copy unimplemented\n", 1);
+}
+
+
+void
+paste_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
+{
+ /* #### */
+ warning_dialog (XtParent (button),
+ "Error:\n\n"
+ "paste unimplemented\n", 1);
+}
+
+
+void
+about_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
+{
+ char buf [2048];
+ char *s = strdup (screensaver_id + 4);
+ char *s2;
+
+ s2 = strchr (s, ',');
+ *s2 = 0;
+ s2 += 2;
+
+ sprintf (buf, "%s\n%s\n"
+ "\n"
+ "This is the Motif version of \"xscreensaver-demo\". The Motif\n"
+ "version is no longer maintained. Please use the GTK version\n"
+ "instead, which has many more features.\n"
+ "\n"
+ "For xscreensaver updates, check https://www.jwz.org/xscreensaver/",
+ s, s2);
+ free (s);
+
+ warning_dialog (XtParent (button), buf, 100);
+}
+
+
+void
+doc_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
+{
+ prefs_pair *pair = (prefs_pair *) client_data;
+
+ saver_preferences *p = pair->a;
+ char *help_command;
+
+ if (!p->help_url || !*p->help_url)
+ {
+ warning_dialog (XtParent (button),
+ "Error:\n\n"
+ "No Help URL has been specified.\n", 100);
+ return;
+ }
+
+ help_command = (char *) malloc (strlen (p->load_url_command) +
+ (strlen (p->help_url) * 4) + 20);
+ strcpy (help_command, "( ");
+ sprintf (help_command + strlen(help_command),
+ p->load_url_command,
+ p->help_url, p->help_url, p->help_url, p->help_url);
+ strcat (help_command, " ) &");
+ system (help_command);
+ free (help_command);
+}
+
+
+void
+activate_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
+{
+ run_cmd (XtParent (button), XA_ACTIVATE, 0);
+}
+
+
+void
+lock_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
+{
+ run_cmd (XtParent (button), XA_LOCK, 0);
+}
+
+
+void
+kill_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
+{
+ run_cmd (XtParent (button), XA_EXIT, 0);
+}
+
+
+void
+restart_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
+{
+#if 0
+ run_cmd (XtParent (button), XA_RESTART, 0);
+#else
+ button = XtParent (button);
+ apply_changes_and_save (button);
+ xscreensaver_command (XtDisplay (button), XA_EXIT, 0, False, NULL);
+ sleep (1);
+ system ("xscreensaver -nosplash &");
+#endif
+
+ await_xscreensaver (button);
+}
+
+static void
+await_xscreensaver (Widget widget)
+{
+ int countdown = 5;
+
+ Display *dpy = XtDisplay (widget);
+ char *rversion = 0;
+
+ while (!rversion && (--countdown > 0))
+ {
+ /* Check for the version of the running xscreensaver... */
+ server_xscreensaver_version (dpy, &rversion, 0, 0);
+
+ /* If it's not there yet, wait a second... */
+ sleep (1);
+ }
+
+ if (rversion)
+ {
+ /* Got it. */
+ free (rversion);
+ }
+ else
+ {
+ /* Timed out, no screensaver running. */
+
+ char buf [1024];
+ Bool root_p = (geteuid () == 0);
+
+ strcpy (buf,
+ "Error:\n\n"
+ "The xscreensaver daemon did not start up properly.\n"
+ "\n");
+
+ if (root_p)
+# ifdef __GNUC__
+ __extension__ /* don't warn about "string length is greater than
+ the length ISO C89 compilers are required to
+ support" in the following expression... */
+# endif
+ strcat (buf,
+ "You are running as root. This usually means that xscreensaver\n"
+ "was unable to contact your X server because access control is\n"
+ "turned on. Try running this command:\n"
+ "\n"
+ " xhost +localhost\n"
+ "\n"
+ "and then selecting `File / Restart Daemon'.\n"
+ "\n"
+ "Note that turning off access control will allow anyone logged\n"
+ "on to this machine to access your screen, which might be\n"
+ "considered a security problem. Please read the xscreensaver\n"
+ "manual and FAQ for more information.\n"
+ "\n"
+ "You shouldn't run X as root. Instead, you should log in as a\n"
+ "normal user, and `su' as necessary.");
+ else
+ strcat (buf, "Please check your $PATH and permissions.");
+
+ warning_dialog (XtParent (widget), buf, 1);
+ }
+}
+
+
+static int _selected_hack_number = -1;
+
+static int
+selected_hack_number (Widget toplevel)
+{
+ return _selected_hack_number;
+}
+
+
+static int
+demo_write_init_file (Widget widget, saver_preferences *p)
+{
+ if (!write_init_file (XtDisplay (widget), p, short_version, False))
+ return 0;
+ else
+ {
+ const char *f = init_file_name();
+ if (!f || !*f)
+ warning_dialog (widget,
+ "Error:\n\nCouldn't determine init file name!\n",
+ 100);
+ else
+ {
+ char *b = (char *) malloc (strlen(f) + 1024);
+ sprintf (b, "Error:\n\nCouldn't write %s\n", f);
+ warning_dialog (widget, b, 100);
+ free (b);
+ }
+ return -1;
+ }
+}
+
+
+static int
+apply_changes_and_save (Widget widget)
+{
+ prefs_pair *pair = global_prefs_pair;
+ saver_preferences *p = pair->a;
+ Widget list_widget = name_to_widget (widget, "list");
+ int which = selected_hack_number (widget);
+
+ Widget cmd = name_to_widget (widget, "cmdText");
+ Widget enabled = name_to_widget (widget, "enabled");
+
+ Widget vis = name_to_widget (widget, "combo");
+# ifdef HAVE_XMCOMBOBOX
+ Widget text = 0;
+# else /* !HAVE_XMCOMBOBOX */
+ Widget menu = 0, *kids = 0, selected_item = 0;
+ Cardinal nkids = 0;
+ int i = 0;
+# endif /* !HAVE_XMCOMBOBOX */
+
+ Bool enabled_p = False;
+ const char *visual = 0;
+ const char *command = 0;
+
+ char c;
+ unsigned long id;
+
+ if (which < 0) return -1;
+
+# ifdef HAVE_XMCOMBOBOX
+ XtVaGetValues (vis, XmNtextField, &text, NULL);
+ if (!text)
+ /* If we can't get at the text field of this combo box, we're screwed. */
+ abort();
+ XtVaGetValues (text, XmNvalue, &visual, NULL);
+
+# else /* !HAVE_XMCOMBOBOX */
+ XtVaGetValues (vis, XmNsubMenuId, &menu, NULL);
+ XtVaGetValues (menu, XmNnumChildren, &nkids, XmNchildren, &kids, NULL);
+ XtVaGetValues (menu, XmNmenuHistory, &selected_item, NULL);
+ if (selected_item)
+ for (i = 0; i < nkids; i++)
+ if (kids[i] == selected_item)
+ break;
+
+ visual = visual_menu[i];
+# endif /* !HAVE_XMCOMBOBOX */
+
+ XtVaGetValues (enabled, XmNset, &enabled_p, NULL);
+ XtVaGetValues (cmd, XtNvalue, &command, NULL);
+
+ if (maybe_reload_init_file (widget, pair) != 0)
+ return 1;
+
+ /* Sanity-check and canonicalize whatever the user typed into the combo box.
+ */
+ if (!strcasecmp (visual, "")) visual = "";
+ else if (!strcasecmp (visual, "any")) visual = "";
+ else if (!strcasecmp (visual, "default")) visual = "Default";
+ else if (!strcasecmp (visual, "default-n")) visual = "Default-N";
+ else if (!strcasecmp (visual, "default-i")) visual = "Default-I";
+ else if (!strcasecmp (visual, "best")) visual = "Best";
+ else if (!strcasecmp (visual, "mono")) visual = "Mono";
+ else if (!strcasecmp (visual, "monochrome")) visual = "Mono";
+ else if (!strcasecmp (visual, "gray")) visual = "Gray";
+ else if (!strcasecmp (visual, "grey")) visual = "Gray";
+ else if (!strcasecmp (visual, "color")) visual = "Color";
+ else if (!strcasecmp (visual, "gl")) visual = "GL";
+ else if (!strcasecmp (visual, "staticgray")) visual = "StaticGray";
+ else if (!strcasecmp (visual, "staticcolor")) visual = "StaticColor";
+ else if (!strcasecmp (visual, "truecolor")) visual = "TrueColor";
+ else if (!strcasecmp (visual, "grayscale")) visual = "GrayScale";
+ else if (!strcasecmp (visual, "greyscale")) visual = "GrayScale";
+ else if (!strcasecmp (visual, "pseudocolor")) visual = "PseudoColor";
+ else if (!strcasecmp (visual, "directcolor")) visual = "DirectColor";
+ else if (1 == sscanf (visual, " %lu %c", &id, &c)) ;
+ else if (1 == sscanf (visual, " 0x%lx %c", &id, &c)) ;
+ else
+ {
+ XBell (XtDisplay (widget), 0); /* unparsable */
+ visual = "";
+ /* #### gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (vis)->entry), "Any");*/
+ }
+
+ ensure_selected_item_visible (list_widget);
+
+ if (!p->screenhacks[which]->visual)
+ p->screenhacks[which]->visual = strdup ("");
+ if (!p->screenhacks[which]->command)
+ p->screenhacks[which]->command = strdup ("");
+
+ if (p->screenhacks[which]->enabled_p != enabled_p ||
+ !!strcasecmp (p->screenhacks[which]->visual, visual) ||
+ !!strcasecmp (p->screenhacks[which]->command, command))
+ {
+ /* Something was changed -- store results into the struct,
+ and write the file.
+ */
+ free (p->screenhacks[which]->visual);
+ free (p->screenhacks[which]->command);
+ p->screenhacks[which]->visual = strdup (visual);
+ p->screenhacks[which]->command = strdup (command);
+ p->screenhacks[which]->enabled_p = enabled_p;
+
+ return demo_write_init_file (widget, p);
+ }
+
+ /* No changes made */
+ return 0;
+}
+
+void
+run_this_cb (Widget button, XtPointer client_data, XtPointer ignored)
+{
+ int which = selected_hack_number (XtParent (button));
+ if (which < 0) return;
+ if (0 == apply_changes_and_save (XtParent (button)))
+ run_hack (XtParent (button), which, True);
+}
+
+
+void
+manual_cb (Widget button, XtPointer client_data, XtPointer ignored)
+{
+ prefs_pair *pair = (prefs_pair *) client_data;
+ saver_preferences *p = pair->a;
+ Widget list_widget = name_to_widget (button, "list");
+ int which = selected_hack_number (button);
+ char *name, *name2, *cmd, *s;
+ if (which < 0) return;
+ apply_changes_and_save (button);
+ ensure_selected_item_visible (list_widget);
+
+ name = strdup (p->screenhacks[which]->command);
+ name2 = name;
+ while (isspace (*name2)) name2++;
+ s = name2;
+ while (*s && !isspace (*s)) s++;
+ *s = 0;
+ s = strrchr (name2, '/');
+ if (s) name = s+1;
+
+ cmd = get_string_resource (XtDisplay (button), "manualCommand", "ManualCommand");
+ if (cmd)
+ {
+ char *cmd2 = (char *) malloc (strlen (cmd) + (strlen (name2) * 4) + 100);
+ strcpy (cmd2, "( ");
+ sprintf (cmd2 + strlen (cmd2),
+ cmd,
+ name2, name2, name2, name2);
+ strcat (cmd2, " ) &");
+ system (cmd2);
+ free (cmd2);
+ }
+ else
+ {
+ warning_dialog (XtParent (button),
+ "Error:\n\nno `manualCommand' resource set.",
+ 100);
+ }
+
+ free (name);
+}
+
+
+void
+run_next_cb (Widget button, XtPointer client_data, XtPointer ignored)
+{
+ prefs_pair *pair = (prefs_pair *) client_data;
+ saver_preferences *p = pair->a;
+
+ Widget list_widget = name_to_widget (button, "list");
+ int which = selected_hack_number (button);
+
+ button = XtParent (button);
+
+ if (which < 0)
+ which = 0;
+ else
+ which++;
+
+ if (which >= p->screenhacks_count)
+ which = 0;
+
+ apply_changes_and_save (button);
+
+ XmListDeselectAllItems (list_widget); /* LessTif lossage */
+ XmListSelectPos (list_widget, which+1, True);
+
+ ensure_selected_item_visible (list_widget);
+ populate_demo_window (button, which, pair);
+ run_hack (button, which, False);
+}
+
+
+void
+run_prev_cb (Widget button, XtPointer client_data, XtPointer ignored)
+{
+ prefs_pair *pair = (prefs_pair *) client_data;
+ saver_preferences *p = pair->a;
+
+ Widget list_widget = name_to_widget (button, "list");
+ int which = selected_hack_number (button);
+
+ button = XtParent (button);
+
+ if (which < 0)
+ which = p->screenhacks_count - 1;
+ else
+ which--;
+
+ if (which < 0)
+ which = p->screenhacks_count - 1;
+
+ apply_changes_and_save (button);
+
+ XmListDeselectAllItems (list_widget); /* LessTif lossage */
+ XmListSelectPos (list_widget, which+1, True);
+
+ ensure_selected_item_visible (list_widget);
+ populate_demo_window (button, which, pair);
+ run_hack (button, which, False);
+}
+
+
+/* Helper for the text fields that contain time specifications:
+ this parses the text, and does error checking.
+ */
+static void
+hack_time_text (Widget button, const char *line, Time *store, Bool sec_p)
+{
+ if (*line)
+ {
+ int value;
+ value = parse_time ((char *) line, sec_p, True);
+ value *= 1000; /* Time measures in microseconds */
+ if (value < 0)
+ {
+ char b[255];
+ sprintf (b,
+ "Error:\n\n"
+ "Unparsable time format: \"%s\"\n",
+ line);
+ warning_dialog (XtParent (button), b, 100);
+ }
+ else
+ *store = value;
+ }
+}
+
+
+void
+prefs_ok_cb (Widget button, XtPointer client_data, XtPointer ignored)
+{
+ prefs_pair *pair = (prefs_pair *) client_data;
+
+ saver_preferences *p = pair->a;
+ saver_preferences *p2 = pair->b;
+ Bool changed = False;
+ char *v = 0;
+
+ button = XtParent (button);
+
+# define SECONDS(field, name) \
+ v = 0; \
+ XtVaGetValues (name_to_widget (button, (name)), XtNvalue, &v, NULL); \
+ hack_time_text (button, v, (field), True)
+
+# define MINUTES(field, name) \
+ v = 0; \
+ XtVaGetValues (name_to_widget (button, (name)), XtNvalue, &v, NULL); \
+ hack_time_text (button, v, (field), False)
+
+# define INTEGER(field, name) do { \
+ unsigned int value; \
+ char c; \
+ XtVaGetValues (name_to_widget (button, (name)), XtNvalue, &v, NULL); \
+ if (! *v) \
+ ; \
+ else if (sscanf (v, "%u%c", &value, &c) != 1) \
+ { \
+ char b[255]; \
+ sprintf (b, "Error:\n\n" "Not an integer: \"%s\"\n", v); \
+ warning_dialog (XtParent (button), b, 100); \
+ } \
+ else \
+ *(field) = value; \
+ } while(0)
+
+# define CHECKBOX(field, name) \
+ XtVaGetValues (name_to_widget (button, (name)), XmNset, &field, NULL)
+
+ MINUTES (&p2->timeout, "timeoutText");
+ MINUTES (&p2->cycle, "cycleText");
+ SECONDS (&p2->fade_seconds, "fadeSecondsText");
+ INTEGER (&p2->fade_ticks, "fadeTicksText");
+ MINUTES (&p2->lock_timeout, "lockText");
+ SECONDS (&p2->passwd_timeout, "passwdText");
+ CHECKBOX (p2->verbose_p, "verboseToggle");
+ CHECKBOX (p2->install_cmap_p, "cmapToggle");
+ CHECKBOX (p2->fade_p, "fadeToggle");
+ CHECKBOX (p2->unfade_p, "unfadeToggle");
+ CHECKBOX (p2->lock_p, "lockToggle");
+
+# undef SECONDS
+# undef MINUTES
+# undef INTEGER
+# undef CHECKBOX
+
+# define COPY(field) \
+ if (p->field != p2->field) changed = True; \
+ p->field = p2->field
+
+ COPY(timeout);
+ COPY(cycle);
+ COPY(lock_timeout);
+ COPY(passwd_timeout);
+ COPY(fade_seconds);
+ COPY(fade_ticks);
+ COPY(verbose_p);
+ COPY(install_cmap_p);
+ COPY(fade_p);
+ COPY(unfade_p);
+ COPY(lock_p);
+# undef COPY
+
+ populate_prefs_page (button, pair);
+
+ if (changed)
+ demo_write_init_file (button, p);
+}
+
+
+void
+prefs_cancel_cb (Widget button, XtPointer client_data, XtPointer ignored)
+{
+ prefs_pair *pair = (prefs_pair *) client_data;
+
+ *pair->b = *pair->a;
+ populate_prefs_page (XtParent (button), pair);
+}
+
+
+static void
+list_select_cb (Widget list, XtPointer client_data, XtPointer call_data)
+{
+ prefs_pair *pair = (prefs_pair *) client_data;
+
+ XmListCallbackStruct *lcb = (XmListCallbackStruct *) call_data;
+ int which = lcb->item_position - 1;
+
+ apply_changes_and_save (list);
+ populate_demo_window (list, which, pair);
+
+ if (lcb->reason == XmCR_DEFAULT_ACTION && which >= 0)
+ run_hack (list, which, True);
+}
+
+
+/* Populating the various widgets
+ */
+
+
+/* Formats a `Time' into "H:MM:SS". (Time is microseconds.)
+ */
+static void
+format_time (char *buf, Time time)
+{
+ int s = time / 1000;
+ unsigned int h = 0, m = 0;
+ if (s >= 60)
+ {
+ m += (s / 60);
+ s %= 60;
+ }
+ if (m >= 60)
+ {
+ h += (m / 60);
+ m %= 60;
+ }
+ sprintf (buf, "%u:%02u:%02u", h, m, s);
+}
+
+
+/* Finds the number of the last hack to run, and makes that item be
+ selected by default.
+ */
+static void
+scroll_to_current_hack (Widget toplevel, prefs_pair *pair)
+{
+ Atom type;
+ int format;
+ unsigned long nitems, bytesafter;
+ unsigned char *data = 0;
+ Display *dpy = XtDisplay (toplevel);
+ int which = 0;
+ Widget list;
+
+ if (XGetWindowProperty (dpy, RootWindow (dpy, 0), /* always screen #0 */
+ XA_SCREENSAVER_STATUS,
+ 0, 3, False, XA_INTEGER,
+ &type, &format, &nitems, &bytesafter,
+ &data)
+ == Success
+ && type == XA_INTEGER
+ && nitems >= 3
+ && data)
+ which = (int) data[2] - 1;
+
+ if (data) free (data);
+
+ if (which < 0)
+ return;
+
+ list = name_to_widget (toplevel, "list");
+ apply_changes_and_save (toplevel);
+
+ XmListDeselectAllItems (list); /* LessTif lossage */
+ XmListSelectPos (list, which+1, True);
+
+ ensure_selected_item_visible (list);
+ populate_demo_window (toplevel, which, pair);
+}
+
+
+
+static void
+populate_hack_list (Widget toplevel, prefs_pair *pair)
+{
+ saver_preferences *p = pair->a;
+ Widget list = name_to_widget (toplevel, "list");
+ screenhack **hacks = p->screenhacks;
+ screenhack **h;
+
+ for (h = hacks; *h; h++)
+ {
+ char *pretty_name = (h[0]->name
+ ? strdup (h[0]->name)
+ : make_hack_name (XtDisplay (toplevel), h[0]->command));
+
+ XmString xmstr = XmStringCreate (pretty_name, XmSTRING_DEFAULT_CHARSET);
+ XmListAddItem (list, xmstr, 0);
+ XmStringFree (xmstr);
+ }
+
+ XtAddCallback (list, XmNbrowseSelectionCallback, list_select_cb, pair);
+ XtAddCallback (list, XmNdefaultActionCallback, list_select_cb, pair);
+}
+
+
+static void
+populate_prefs_page (Widget top, prefs_pair *pair)
+{
+ saver_preferences *p = pair->a;
+ char s[100];
+
+ format_time (s, p->timeout);
+ XtVaSetValues (name_to_widget (top, "timeoutText"), XmNvalue, s, NULL);
+ format_time (s, p->cycle);
+ XtVaSetValues (name_to_widget (top, "cycleText"), XmNvalue, s, NULL);
+ format_time (s, p->lock_timeout);
+ XtVaSetValues (name_to_widget (top, "lockText"), XmNvalue, s, NULL);
+ format_time (s, p->passwd_timeout);
+ XtVaSetValues (name_to_widget (top, "passwdText"), XmNvalue, s, NULL);
+ format_time (s, p->fade_seconds);
+ XtVaSetValues (name_to_widget (top, "fadeSecondsText"), XmNvalue, s, NULL);
+ sprintf (s, "%u", p->fade_ticks);
+ XtVaSetValues (name_to_widget (top, "fadeTicksText"), XmNvalue, s, NULL);
+
+ XtVaSetValues (name_to_widget (top, "verboseToggle"),
+ XmNset, p->verbose_p, NULL);
+ XtVaSetValues (name_to_widget (top, "cmapToggle"),
+ XmNset, p->install_cmap_p, NULL);
+ XtVaSetValues (name_to_widget (top, "fadeToggle"),
+ XmNset, p->fade_p, NULL);
+ XtVaSetValues (name_to_widget (top, "unfadeToggle"),
+ XmNset, p->unfade_p, NULL);
+ XtVaSetValues (name_to_widget (top, "lockToggle"),
+ XmNset, p->lock_p, NULL);
+
+
+ {
+ Bool found_any_writable_cells = False;
+ Display *dpy = XtDisplay (top);
+ int nscreens = ScreenCount(dpy);
+ int i;
+ for (i = 0; i < nscreens; i++)
+ {
+ Screen *s = ScreenOfDisplay (dpy, i);
+ if (has_writable_cells (s, DefaultVisualOfScreen (s)))
+ {
+ found_any_writable_cells = True;
+ break;
+ }
+ }
+
+#ifdef HAVE_XF86VMODE_GAMMA
+ found_any_writable_cells = True; /* if we can gamma fade, go for it */
+#endif
+
+ XtVaSetValues (name_to_widget (top, "fadeSecondsLabel"), XtNsensitive,
+ found_any_writable_cells, NULL);
+ XtVaSetValues (name_to_widget (top, "fadeTicksLabel"), XtNsensitive,
+ found_any_writable_cells, NULL);
+ XtVaSetValues (name_to_widget (top, "fadeSecondsText"), XtNsensitive,
+ found_any_writable_cells, NULL);
+ XtVaSetValues (name_to_widget (top, "fadeTicksText"), XtNsensitive,
+ found_any_writable_cells, NULL);
+ XtVaSetValues (name_to_widget (top, "cmapToggle"), XtNsensitive,
+ found_any_writable_cells, NULL);
+ XtVaSetValues (name_to_widget (top, "fadeToggle"), XtNsensitive,
+ found_any_writable_cells, NULL);
+ XtVaSetValues (name_to_widget (top, "unfadeToggle"), XtNsensitive,
+ found_any_writable_cells, NULL);
+ }
+}
+
+
+static void
+sensitize_demo_widgets (Widget toplevel, Bool sensitive_p)
+{
+ const char *names[] = { "cmdLabel", "cmdText", "enabled",
+ "visLabel", "combo", "demo", "man" };
+ int i;
+ for (i = 0; i < sizeof(names)/countof(*names); i++)
+ {
+ Widget w = name_to_widget (toplevel, names[i]);
+ XtVaSetValues (w, XtNsensitive, sensitive_p, NULL);
+ }
+
+ /* I don't know how to handle these yet... */
+ {
+ const char *names2[] = { "cut", "copy", "paste" };
+ for (i = 0; i < sizeof(names2)/countof(*names2); i++)
+ {
+ Widget w = name_to_widget (toplevel, names2[i]);
+ XtVaSetValues (w, XtNsensitive, FALSE, NULL);
+ }
+ }
+}
+
+
+
+/* Pixmaps for the up and down arrow buttons (yeah, this is sleazy...)
+ */
+
+#ifdef HAVE_XPM
+
+static char *up_arrow_xpm[] = {
+ "15 15 4 1",
+ " c None s background",
+ "- c #FFFFFF",
+ "+ c #D6D6D6",
+ "@ c #000000",
+
+ " @ ",
+ " @ ",
+ " -+@ ",
+ " -+@ ",
+ " -+++@ ",
+ " -+++@ ",
+ " -+++++@ ",
+ " -+++++@ ",
+ " -+++++++@ ",
+ " -+++++++@ ",
+ " -+++++++++@ ",
+ " -+++++++++@ ",
+ " -+++++++++++@ ",
+ " @@@@@@@@@@@@@ ",
+ " "
+};
+
+static char *down_arrow_xpm[] = {
+ "15 15 4 1",
+ " c None s background",
+ "- c #FFFFFF",
+ "+ c #D6D6D6",
+ "@ c #000000",
+
+ " ",
+ " ------------- ",
+ " -+++++++++++@ ",
+ " -+++++++++@ ",
+ " -+++++++++@ ",
+ " -+++++++@ ",
+ " -+++++++@ ",
+ " -+++++@ ",
+ " -+++++@ ",
+ " -+++@ ",
+ " -+++@ ",
+ " -+@ ",
+ " -+@ ",
+ " @ ",
+ " @ "
+};
+
+#endif /* HAVE_XPM */
+
+
+static void
+pixmapify_buttons (Widget toplevel)
+{
+#ifdef HAVE_XPM
+
+ Display *dpy = XtDisplay (toplevel);
+ Window window = XtWindow (toplevel);
+ XWindowAttributes xgwa;
+ XpmAttributes xpmattrs;
+ Pixmap up_pixmap = 0, down_pixmap = 0;
+ int result;
+ Widget up = name_to_widget (toplevel, "up");
+ Widget dn = name_to_widget (toplevel, "down");
+# ifdef XpmColorSymbols
+ XColor xc;
+ XpmColorSymbol symbols[2];
+ char color[20];
+# endif
+
+ XGetWindowAttributes (dpy, window, &xgwa);
+
+ xpmattrs.valuemask = 0;
+
+# ifdef XpmColorSymbols
+ symbols[0].name = "background";
+ symbols[0].pixel = 0;
+ symbols[1].name = 0;
+ XtVaGetValues (up, XmNbackground, &xc, NULL);
+ XQueryColor (dpy, xgwa.colormap, &xc);
+ sprintf (color, "#%04X%04X%04X", xc.red, xc.green, xc.blue);
+ symbols[0].value = color;
+ symbols[0].pixel = xc.pixel;
+
+ xpmattrs.valuemask |= XpmColorSymbols;
+ xpmattrs.colorsymbols = symbols;
+ xpmattrs.numsymbols = 1;
+# endif
+
+# ifdef XpmCloseness
+ xpmattrs.valuemask |= XpmCloseness;
+ xpmattrs.closeness = 40000;
+# endif
+# ifdef XpmVisual
+ xpmattrs.valuemask |= XpmVisual;
+ xpmattrs.visual = xgwa.visual;
+# endif
+# ifdef XpmDepth
+ xpmattrs.valuemask |= XpmDepth;
+ xpmattrs.depth = xgwa.depth;
+# endif
+# ifdef XpmColormap
+ xpmattrs.valuemask |= XpmColormap;
+ xpmattrs.colormap = xgwa.colormap;
+# endif
+
+ result = XpmCreatePixmapFromData(dpy, window, up_arrow_xpm,
+ &up_pixmap, 0 /* mask */, &xpmattrs);
+ if (!up_pixmap || (result != XpmSuccess && result != XpmColorError))
+ {
+ fprintf (stderr, "%s: Can't load pixmaps\n", progname);
+ return;
+ }
+
+ result = XpmCreatePixmapFromData(dpy, window, down_arrow_xpm,
+ &down_pixmap, 0 /* mask */, &xpmattrs);
+ if (!down_pixmap || (result != XpmSuccess && result != XpmColorError))
+ {
+ fprintf (stderr, "%s: Can't load pixmaps\n", progname);
+ return;
+ }
+
+ XtVaSetValues (up, XmNlabelType, XmPIXMAP, XmNlabelPixmap, up_pixmap, NULL);
+ XtVaSetValues (dn, XmNlabelType, XmPIXMAP, XmNlabelPixmap, down_pixmap,NULL);
+
+#endif /* HAVE_XPM */
+}
+
+
+
+char *
+get_hack_blurb (Display *dpy, screenhack *hack)
+{
+ char *doc_string;
+ char *prog_name = strdup (hack->command);
+ char *pretty_name = (hack->name
+ ? strdup (hack->name)
+ : make_hack_name (dpy, hack->command));
+ char doc_name[255], doc_class[255];
+ char *s, *s2;
+
+ for (s = prog_name; *s && !isspace(*s); s++)
+ ;
+ *s = 0;
+ s = strrchr (prog_name, '/');
+ if (s) strcpy (prog_name, s+1);
+
+ sprintf (doc_name, "hacks.%s.documentation", pretty_name);
+ sprintf (doc_class, "hacks.%s.documentation", prog_name);
+ free (prog_name);
+ free (pretty_name);
+
+ doc_string = get_string_resource (dpy, doc_name, doc_class);
+ if (doc_string)
+ {
+ for (s = doc_string; *s; s++)
+ {
+ if (*s == '\n')
+ {
+ /* skip over whitespace at beginning of line */
+ s++;
+ while (*s && (*s == ' ' || *s == '\t'))
+ s++;
+ }
+ else if (*s == ' ' || *s == '\t')
+ {
+ /* compress all other horizontal whitespace. */
+ *s = ' ';
+ s++;
+ for (s2 = s; *s2 && (*s2 == ' ' || *s2 == '\t'); s2++)
+ ;
+ if (s2 > s) strcpy (s, s2);
+ s--;
+ }
+ }
+
+ while (*s && isspace (*s)) /* Strip trailing whitespace */
+ *(--s) = 0;
+
+ /* Delete whitespace at end of each line. */
+ for (; s > doc_string; s--)
+ if (*s == '\n' && (s[-1] == ' ' || s[-1] == '\t'))
+ {
+ for (s2 = s-1;
+ s2 > doc_string && (*s2 == ' ' || *s2 == '\t');
+ s2--)
+ ;
+ s2++;
+ if (s2 < s) strcpy (s2, s);
+ s = s2;
+ }
+
+ /* Delete leading blank lines. */
+ for (s = doc_string; *s == '\n'; s++)
+ ;
+ if (s > doc_string) strcpy (doc_string, s);
+ }
+ else
+ {
+# if 0
+ static int doc_installed = 0;
+ if (doc_installed == 0)
+ {
+ if (get_boolean_resource ("hacks.documentation.isInstalled",
+ "hacks.documentation.isInstalled"))
+ doc_installed = 1;
+ else
+ doc_installed = -1;
+ }
+
+ if (doc_installed < 0)
+ doc_string =
+ strdup ("Error:\n\n"
+ "The documentation strings do not appear to be "
+ "installed. This is probably because there is "
+ "an \"XScreenSaver\" app-defaults file installed "
+ "that is from an older version of the program. "
+ "To fix this problem, delete that file, or "
+ "install a current version (either will work.)");
+ else
+# endif /* 0 */
+ doc_string = strdup (
+ "\n"
+ "This is the Motif version of \"xscreensaver-demo\". The Motif "
+ "version is no longer maintained. Please use the GTK version "
+ "instead, which has many more features."
+ "\n\n"
+ "If you were running the GTK version, there would be a preview "
+ "of this screen saver mode displayed here, along with graphical "
+ "configuration options.");
+ }
+
+ return doc_string;
+}
+
+
+static void
+populate_demo_window (Widget toplevel, int which, prefs_pair *pair)
+{
+ saver_preferences *p = pair->a;
+ screenhack *hack = (which >= 0 ? p->screenhacks[which] : 0);
+ Widget frameL = name_to_widget (toplevel, "frameLabel");
+ Widget doc = name_to_widget (toplevel, "doc");
+ Widget cmd = name_to_widget (toplevel, "cmdText");
+ Widget enabled = name_to_widget (toplevel, "enabled");
+ Widget vis = name_to_widget (toplevel, "combo");
+ int i = 0;
+
+ char *pretty_name = (hack
+ ? (hack->name
+ ? strdup (hack->name)
+ : make_hack_name (XtDisplay (toplevel), hack->command))
+ : 0);
+ char *doc_string = hack ? get_hack_blurb (XtDisplay (toplevel), hack) : 0;
+
+ XmString xmstr;
+
+ xmstr = XmStringCreate (pretty_name, XmSTRING_DEFAULT_CHARSET);
+ XtVaSetValues (frameL, XmNlabelString, xmstr, NULL);
+ XmStringFree (xmstr);
+
+ XtVaSetValues (doc, XmNvalue, doc_string, NULL);
+ XtVaSetValues (cmd, XmNvalue, (hack ? hack->command : ""), NULL);
+
+ XtVaSetValues (enabled, XmNset, (hack ? hack->enabled_p : False), NULL);
+
+ i = 0;
+ if (hack && hack->visual && *hack->visual)
+ for (i = 0; visual_menu[i]; i++)
+ if (!strcasecmp (hack->visual, visual_menu[i]))
+ break;
+ if (!visual_menu[i]) i = -1;
+
+ {
+# ifdef HAVE_XMCOMBOBOX
+ Widget text = 0;
+ XtVaGetValues (vis, XmNtextField, &text, NULL);
+ XtVaSetValues (vis, XmNselectedPosition, i, NULL);
+ if (i < 0)
+ XtVaSetValues (text, XmNvalue, hack->visual, NULL);
+# else /* !HAVE_XMCOMBOBOX */
+ Cardinal nkids;
+ Widget *kids;
+ Widget menu;
+
+ XtVaGetValues (vis, XmNsubMenuId, &menu, NULL);
+ if (!menu) abort ();
+ XtVaGetValues (menu, XmNnumChildren, &nkids, XmNchildren, &kids, NULL);
+ if (!kids) abort();
+ if (i < nkids)
+ XtVaSetValues (vis, XmNmenuHistory, kids[i], NULL);
+# endif /* !HAVE_XMCOMBOBOX */
+ }
+
+ sensitize_demo_widgets (toplevel, (hack ? True : False));
+
+ if (pretty_name) free (pretty_name);
+ if (doc_string) free (doc_string);
+
+ _selected_hack_number = which;
+}
+
+
+
+static int
+maybe_reload_init_file (Widget widget, prefs_pair *pair)
+{
+ int status = 0;
+ saver_preferences *p = pair->a;
+
+ static Bool reentrant_lock = False;
+ if (reentrant_lock) return 0;
+ reentrant_lock = True;
+
+ if (init_file_changed_p (p))
+ {
+ const char *f = init_file_name();
+ char *b;
+ int which;
+ Widget list;
+
+ if (!f || !*f) return 0;
+ b = (char *) malloc (strlen(f) + 1024);
+ sprintf (b,
+ "Warning:\n\n"
+ "file \"%s\" has changed, reloading.\n",
+ f);
+ warning_dialog (widget, b, 100);
+ free (b);
+
+ load_init_file (XtDisplay (widget), p);
+
+ which = selected_hack_number (widget);
+ list = name_to_widget (widget, "list");
+
+ XtVaSetValues (list, XmNitemCount, 0, NULL);
+
+ populate_hack_list (widget, pair);
+
+ XmListDeselectAllItems (list); /* LessTif lossage */
+ XmListSelectPos (list, which+1, True);
+
+ populate_prefs_page (widget, pair);
+ populate_demo_window (widget, which, pair);
+ ensure_selected_item_visible (list);
+
+ status = 1;
+ }
+
+ reentrant_lock = False;
+ return status;
+}
+
+
+
+/* Attach all callback functions to widgets
+ */
+
+static void
+add_callbacks (Widget toplevel, prefs_pair *pair)
+{
+ Widget w;
+
+# define CB(NAME,FN) \
+ w = name_to_widget (toplevel, (NAME)); \
+ XtAddCallback (w, XmNactivateCallback, (FN), pair)
+
+ CB ("blank", activate_menu_cb);
+ CB ("lock", lock_menu_cb);
+ CB ("kill", kill_menu_cb);
+ CB ("restart", restart_menu_cb);
+ CB ("exit", exit_menu_cb);
+
+ CB ("cut", cut_menu_cb);
+ CB ("copy", copy_menu_cb);
+ CB ("paste", paste_menu_cb);
+
+ CB ("about", about_menu_cb);
+ CB ("docMenu", doc_menu_cb);
+
+ CB ("down", run_next_cb);
+ CB ("up", run_prev_cb);
+ CB ("demo", run_this_cb);
+ CB ("man", manual_cb);
+
+ CB ("preferencesForm.Cancel", prefs_cancel_cb);
+ CB ("preferencesForm.OK", prefs_ok_cb);
+
+# undef CB
+}
+
+
+static void
+sanity_check_resources (Widget toplevel)
+{
+ const char *names[] = { "demoTab", "optionsTab", "cmdLabel", "visLabel",
+ "enabled", "demo", "man", "timeoutLabel",
+ "cycleLabel", "fadeSecondsLabel", "fadeTicksLabel",
+ "lockLabel", "passwdLabel" };
+ int i;
+ for (i = 0; i < sizeof(names)/countof(*names); i++)
+ {
+ Widget w = name_to_widget (toplevel, names[i]);
+ const char *name = XtName(w);
+ XmString xm = 0;
+ char *label = 0;
+ XtVaGetValues (w, XmNlabelString, &xm, NULL);
+ if (xm) XmStringGetLtoR (xm, XmSTRING_DEFAULT_CHARSET, &label);
+ if (w && (!label || !strcmp (name, label)))
+ {
+ xm = XmStringCreate ("ERROR", XmSTRING_DEFAULT_CHARSET);
+ XtVaSetValues (w, XmNlabelString, xm, NULL);
+ }
+ }
+}
+
+/* Set certain buttons to be the same size (the max of the set.)
+ */
+static void
+hack_button_sizes (Widget toplevel)
+{
+ Widget demo = name_to_widget (toplevel, "demo");
+ Widget man = name_to_widget (toplevel, "man");
+ Widget ok = name_to_widget (toplevel, "OK");
+ Widget can = name_to_widget (toplevel, "Cancel");
+ Widget up = name_to_widget (toplevel, "up");
+ Widget down = name_to_widget (toplevel, "down");
+ Dimension w1, w2;
+
+ XtVaGetValues (demo, XmNwidth, &w1, NULL);
+ XtVaGetValues (man, XmNwidth, &w2, NULL);
+ XtVaSetValues ((w1 > w2 ? man : demo), XmNwidth, (w1 > w2 ? w1 : w2), NULL);
+
+ XtVaGetValues (ok, XmNwidth, &w1, NULL);
+ XtVaGetValues (can, XmNwidth, &w2, NULL);
+ XtVaSetValues ((w1 > w2 ? can : ok), XmNwidth, (w1 > w2 ? w1 : w2), NULL);
+
+ XtVaGetValues (up, XmNwidth, &w1, NULL);
+ XtVaGetValues (down, XmNwidth, &w2, NULL);
+ XtVaSetValues ((w1 > w2 ? down : up), XmNwidth, (w1 > w2 ? w1 : w2), NULL);
+}
+
+
+
+
+/* The main demo-mode command loop.
+ */
+
+#if 0
+static Bool
+mapper (XrmDatabase *db, XrmBindingList bindings, XrmQuarkList quarks,
+ XrmRepresentation *type, XrmValue *value, XPointer closure)
+{
+ int i;
+ for (i = 0; quarks[i]; i++)
+ {
+ if (bindings[i] == XrmBindTightly)
+ fprintf (stderr, (i == 0 ? "" : "."));
+ else if (bindings[i] == XrmBindLoosely)
+ fprintf (stderr, "*");
+ else
+ fprintf (stderr, " ??? ");
+ fprintf(stderr, "%s", XrmQuarkToString (quarks[i]));
+ }
+
+ fprintf (stderr, ": %s\n", (char *) value->addr);
+
+ return False;
+}
+#endif
+
+
+static void
+the_network_is_not_the_computer (Widget parent)
+{
+ Display *dpy = XtDisplay (parent);
+ char *rversion, *ruser, *rhost;
+ char *luser, *lhost;
+ char *msg = 0;
+ struct passwd *p = getpwuid (getuid ());
+ const char *d = DisplayString (dpy);
+
+# if defined(HAVE_UNAME)
+ struct utsname uts;
+ if (uname (&uts) < 0)
+ lhost = "<UNKNOWN>";
+ else
+ lhost = uts.nodename;
+# elif defined(VMS)
+ strcpy (lhost, getenv("SYS$NODE"));
+# else /* !HAVE_UNAME && !VMS */
+ strcat (lhost, "<UNKNOWN>");
+# endif /* !HAVE_UNAME && !VMS */
+
+ if (p && p->pw_name)
+ luser = p->pw_name;
+ else
+ luser = "???";
+
+ server_xscreensaver_version (dpy, &rversion, &ruser, &rhost);
+
+ /* Make a buffer that's big enough for a number of copies of all the
+ strings, plus some. */
+ msg = (char *) malloc (10 * ((rversion ? strlen(rversion) : 0) +
+ (ruser ? strlen(ruser) : 0) +
+ (rhost ? strlen(rhost) : 0) +
+ strlen(lhost) +
+ strlen(luser) +
+ strlen(d) +
+ 1024));
+ *msg = 0;
+
+ if (!rversion || !*rversion)
+ {
+ sprintf (msg,
+ "Warning:\n\n"
+ "The XScreenSaver daemon doesn't seem to be running\n"
+ "on display \"%s\". You can launch it by selecting\n"
+ "`Restart Daemon' from the File menu, or by typing\n"
+ "\"xscreensaver &\" in a shell.",
+ d);
+ }
+ else if (p && ruser && *ruser && !!strcmp (ruser, p->pw_name))
+ {
+ /* Warn that the two processes are running as different users.
+ */
+ sprintf(msg,
+ "Warning:\n\n"
+ "%s is running as user \"%s\" on host \"%s\".\n"
+ "But the xscreensaver managing display \"%s\"\n"
+ "is running as user \"%s\" on host \"%s\".\n"
+ "\n"
+ "Since they are different users, they won't be reading/writing\n"
+ "the same ~/.xscreensaver file, so %s isn't\n"
+ "going to work right.\n"
+ "\n"
+ "Either re-run %s as \"%s\", or re-run\n"
+ "xscreensaver as \"%s\" (which you can do by\n"
+ "selecting `Restart Daemon' from the File menu.)\n",
+ progname, luser, lhost,
+ d,
+ (ruser ? ruser : "???"), (rhost ? rhost : "???"),
+ progname,
+ progname, (ruser ? ruser : "???"),
+ luser);
+ }
+ else if (rhost && *rhost && !!strcmp (rhost, lhost))
+ {
+ /* Warn that the two processes are running on different hosts.
+ */
+ sprintf (msg,
+ "Warning:\n\n"
+ "%s is running as user \"%s\" on host \"%s\".\n"
+ "But the xscreensaver managing display \"%s\"\n"
+ "is running as user \"%s\" on host \"%s\".\n"
+ "\n"
+ "If those two machines don't share a file system (that is,\n"
+ "if they don't see the same ~%s/.xscreensaver file) then\n"
+ "%s won't work right.\n"
+ "\n"
+ "You can restart the daemon on \"%s\" as \"%s\" by\n"
+ "selecting `Restart Daemon' from the File menu.)",
+ progname, luser, lhost,
+ d,
+ (ruser ? ruser : "???"), (rhost ? rhost : "???"),
+ luser,
+ progname,
+ lhost, luser);
+ }
+ else if (!!strcmp (rversion, short_version))
+ {
+ /* Warn that the version numbers don't match.
+ */
+ sprintf (msg,
+ "Warning:\n\n"
+ "This is %s version %s.\n"
+ "But the xscreensaver managing display \"%s\"\n"
+ "is version %s. This could cause problems.",
+ progname, short_version,
+ d,
+ rversion);
+ }
+
+
+ if (*msg)
+ warning_dialog (parent, msg, 1);
+
+ free (msg);
+}
+
+
+/* We use this error handler so that X errors are preceeded by the name
+ of the program that generated them.
+ */
+static int
+demo_ehandler (Display *dpy, XErrorEvent *error)
+{
+ fprintf (stderr, "\nX error in %s:\n", progname);
+ XmuPrintDefaultErrorMessage (dpy, error, stderr);
+ exit (-1);
+ return 0;
+}
+
+
+
+#ifdef __GNUC__
+ __extension__ /* shut up about "string length is greater than the length
+ ISO C89 compilers are required to support" when including
+ the .ad file... */
+#endif
+
+static char *defaults[] = {
+#include "XScreenSaver_ad.h"
+#include "XScreenSaver_Xm_ad.h"
+ 0
+};
+
+
+int
+main (int argc, char **argv)
+{
+ XtAppContext app;
+ prefs_pair Pair, *pair;
+ saver_preferences P, P2, *p, *p2;
+ Bool prefs = False;
+ int i;
+ Display *dpy;
+ Widget toplevel_shell, dialog;
+ char *real_progname = argv[0];
+ char *s;
+
+ s = strrchr (real_progname, '/');
+ if (s) real_progname = s+1;
+
+ p = &P;
+ p2 = &P2;
+ pair = &Pair;
+ pair->a = p;
+ pair->b = p2;
+ memset (p, 0, sizeof (*p));
+ memset (p2, 0, sizeof (*p2));
+
+ global_prefs_pair = pair;
+
+ progname = real_progname;
+
+ /* We must read exactly the same resources as xscreensaver.
+ That means we must have both the same progclass *and* progname,
+ at least as far as the resource database is concerned. So,
+ put "xscreensaver" in argv[0] while initializing Xt.
+ */
+ argv[0] = "xscreensaver";
+ progname = argv[0];
+
+
+ toplevel_shell = XtAppInitialize (&app, progclass, 0, 0, &argc, argv,
+ defaults, 0, 0);
+
+ dpy = XtDisplay (toplevel_shell);
+ db = XtDatabase (dpy);
+ XtGetApplicationNameAndClass (dpy, &progname, &progclass);
+ XSetErrorHandler (demo_ehandler);
+
+ /* Complain about unrecognized command-line arguments.
+ */
+ for (i = 1; i < argc; i++)
+ {
+ char *s = argv[i];
+ if (s[0] == '-' && s[1] == '-')
+ s++;
+ if (!strcmp (s, "-prefs"))
+ prefs = True;
+ else
+ {
+ fprintf (stderr, "usage: %s [ -display dpy-string ] [ -prefs ]\n",
+ real_progname);
+ exit (1);
+ }
+ }
+
+ short_version = (char *) malloc (5);
+ memcpy (short_version, screensaver_id + 17, 4);
+ short_version [4] = 0;
+
+ /* Load the init file, which may end up consulting the X resource database
+ and the site-wide app-defaults file. Note that at this point, it's
+ important that `progname' be "xscreensaver", rather than whatever
+ was in argv[0].
+ */
+ p->db = db;
+ load_init_file (dpy, p);
+ *p2 = *p;
+
+ /* Now that Xt has been initialized, and the resources have been read,
+ we can set our `progname' variable to something more in line with
+ reality.
+ */
+ progname = real_progname;
+
+
+#if 0
+ {
+ XrmName name = { 0 };
+ XrmClass class = { 0 };
+ int count = 0;
+ XrmEnumerateDatabase (db, &name, &class, XrmEnumAllLevels, mapper,
+ (POINTER) &count);
+ }
+#endif
+
+
+ /* Intern the atoms that xscreensaver_command() needs.
+ */
+ XA_VROOT = XInternAtom (dpy, "__SWM_VROOT", False);
+ XA_SCREENSAVER = XInternAtom (dpy, "SCREENSAVER", False);
+ XA_SCREENSAVER_VERSION = XInternAtom (dpy, "_SCREENSAVER_VERSION",False);
+ XA_SCREENSAVER_STATUS = XInternAtom (dpy, "_SCREENSAVER_STATUS", False);
+ XA_SCREENSAVER_ID = XInternAtom (dpy, "_SCREENSAVER_ID", False);
+ XA_SCREENSAVER_RESPONSE = XInternAtom (dpy, "_SCREENSAVER_RESPONSE", False);
+ XA_SELECT = XInternAtom (dpy, "SELECT", False);
+ XA_DEMO = XInternAtom (dpy, "DEMO", False);
+ XA_ACTIVATE = XInternAtom (dpy, "ACTIVATE", False);
+ XA_BLANK = XInternAtom (dpy, "BLANK", False);
+ XA_LOCK = XInternAtom (dpy, "LOCK", False);
+ XA_EXIT = XInternAtom (dpy, "EXIT", False);
+ XA_RESTART = XInternAtom (dpy, "RESTART", False);
+
+ /* Create the window and all its widgets.
+ */
+ dialog = create_xscreensaver_demo (toplevel_shell);
+
+ /* Set the window's title. */
+ {
+ char title[255];
+ char *v = (char *) strdup(strchr(screensaver_id, ' '));
+ char *s1, *s2, *s3, *s4;
+ s1 = (char *) strchr(v, ' '); s1++;
+ s2 = (char *) strchr(s1, ' ');
+ s3 = (char *) strchr(v, '('); s3++;
+ s4 = (char *) strchr(s3, ')');
+ *s2 = 0;
+ *s4 = 0;
+ sprintf (title, "%.50s %.50s, %.50s", progclass, s1, s3);
+ XtVaSetValues (toplevel_shell, XtNtitle, title, NULL);
+ free (v);
+ }
+
+ sanity_check_resources (toplevel_shell);
+ add_callbacks (toplevel_shell, pair);
+ populate_hack_list (toplevel_shell, pair);
+ populate_prefs_page (toplevel_shell, pair);
+ sensitize_demo_widgets (toplevel_shell, False);
+ scroll_to_current_hack (toplevel_shell, pair);
+
+ XtManageChild (dialog);
+ XtRealizeWidget(toplevel_shell);
+
+ /* The next few calls must come after XtRealizeWidget(). */
+ pixmapify_buttons (toplevel_shell);
+ hack_button_sizes (toplevel_shell);
+ ensure_selected_item_visible (name_to_widget (toplevel_shell, "list"));
+
+ XSync (dpy, False);
+ XtVaSetValues (toplevel_shell, XmNallowShellResize, False, NULL);
+
+
+ /* Handle the -prefs command-line argument. */
+ if (prefs)
+ {
+ Widget tabber = name_to_widget (toplevel_shell, "folder");
+ Widget this_tab = name_to_widget (toplevel_shell, "optionsTab");
+ Widget this_page = name_to_widget (toplevel_shell, "preferencesForm");
+ Widget *kids = 0;
+ Cardinal nkids = 0;
+ if (!tabber) abort();
+
+ XtVaGetValues (tabber, XmNnumChildren, &nkids, XmNchildren, &kids, NULL);
+ if (!kids) abort();
+ if (nkids > 0)
+ XtUnmanageChildren (kids, nkids);
+
+ XtManageChild (this_page);
+
+ XmProcessTraversal (this_tab, XmTRAVERSE_CURRENT);
+ }
+
+ /* Issue any warnings about the running xscreensaver daemon. */
+ the_network_is_not_the_computer (toplevel_shell);
+
+
+ XtAppMainLoop (app);
+ exit (0);
+}
+
+#endif /* HAVE_MOTIF -- whole file */
diff --git a/driver/dpms.c b/driver/dpms.c
new file mode 100644
index 0000000..a0dd7b8
--- /dev/null
+++ b/driver/dpms.c
@@ -0,0 +1,304 @@
+/* dpms.c --- syncing the X Display Power Management values
+ * xscreensaver, Copyright (c) 2001-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* Display Power Management System (DPMS.)
+
+ On XFree86 systems, "man xset" reports:
+
+ -dpms The -dpms option disables DPMS (Energy Star) features.
+ +dpms The +dpms option enables DPMS (Energy Star) features.
+
+ dpms flags...
+ The dpms option allows the DPMS (Energy Star)
+ parameters to be set. The option can take up to three
+ numerical values, or the `force' flag followed by a
+ DPMS state. The `force' flags forces the server to
+ immediately switch to the DPMS state specified. The
+ DPMS state can be one of `standby', `suspend', or
+ `off'. When numerical values are given, they set the
+ inactivity period before the three modes are activated.
+ The first value given is for the `standby' mode, the
+ second is for the `suspend' mode, and the third is for
+ the `off' mode. Setting these values implicitly
+ enables the DPMS features. A value of zero disables a
+ particular mode.
+
+ However, note that the implementation is more than a little bogus,
+ in that there is code in /usr/X11R6/lib/libXdpms.a to implement all
+ the usual server-extension-querying utilities -- but there are no
+ prototypes in any header file! Thus, the prototypes here. (The
+ stuff in X11/extensions/dpms.h and X11/extensions/dpmsstr.h define
+ the raw X protcol, they don't define the API to libXdpms.a.)
+
+ Some documentation:
+ Library: ftp://ftp.x.org/pub/R6.4/xc/doc/specs/Xext/DPMSLib.ms
+ Protocol: ftp://ftp.x.org/pub/R6.4/xc/doc/specs/Xext/DPMS.ms
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <X11/Xlib.h>
+
+#ifdef HAVE_DPMS_EXTENSION /* almost the whole file */
+
+# include <X11/Xproto.h>
+# include <X11/extensions/dpms.h>
+/*# include <X11/extensions/dpmsstr.h>*/
+
+ /* Why this crap is not in a header file somewhere, I have no idea. Losers!
+ */
+ extern Bool DPMSQueryExtension (Display *, int *event_ret, int *err_ret);
+ extern Status DPMSGetVersion (Display *, int *major_ret, int *minor_ret);
+ extern Bool DPMSCapable (Display *);
+ extern Status DPMSInfo (Display *, CARD16 *power_level, BOOL *state);
+ extern Status DPMSEnable (Display *dpy);
+ extern Status DPMSDisable (Display *dpy);
+ extern Status DPMSForceLevel (Display *, CARD16 level);
+ extern Status DPMSSetTimeouts (Display *, CARD16 standby, CARD16 suspend,
+ CARD16 off);
+ extern Bool DPMSGetTimeouts (Display *, CARD16 *standby,
+ CARD16 *suspend, CARD16 *off);
+
+#endif /* HAVE_DPMS_EXTENSION */
+
+
+/* This file doesn't need the Xt headers, so stub these types out... */
+#undef XtPointer
+#define XtAppContext void*
+#define XrmDatabase void*
+#define XtIntervalId void*
+#define XtPointer void*
+#define Widget void*
+
+#include "xscreensaver.h"
+
+#ifdef HAVE_DPMS_EXTENSION
+
+static Bool error_handler_hit_p = False;
+
+static int
+ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
+{
+ error_handler_hit_p = True;
+ return 0;
+}
+
+
+void
+sync_server_dpms_settings (Display *dpy, Bool enabled_p, Bool dpms_quickoff_p,
+ int standby_secs, int suspend_secs, int off_secs,
+ Bool verbose_p)
+{
+ int event = 0, error = 0;
+ BOOL o_enabled = False;
+ CARD16 o_power = 0;
+ CARD16 o_standby = 0, o_suspend = 0, o_off = 0;
+ Bool bogus_p = False;
+
+ if (dpms_quickoff_p && !off_secs)
+ {
+ /* To do this, we might need to temporarily re-enable DPMS first. */
+ off_secs = 0xFFFF;
+ }
+
+ if (standby_secs == 0 && suspend_secs == 0 && off_secs == 0)
+ /* all zero implies "DPMS disabled" */
+ enabled_p = False;
+
+ else if ((standby_secs != 0 && standby_secs < 10) ||
+ (suspend_secs != 0 && suspend_secs < 10) ||
+ (off_secs != 0 && off_secs < 10))
+ /* any negative, or any positive-and-less-than-10-seconds, is crazy. */
+ bogus_p = True;
+
+ if (bogus_p) enabled_p = False;
+
+ /* X protocol sends these values in a CARD16, so truncate them to 16 bits.
+ This means that the maximum timeout is 18:12:15.
+ */
+ if (standby_secs > 0xFFFF) standby_secs = 0xFFFF;
+ if (suspend_secs > 0xFFFF) suspend_secs = 0xFFFF;
+ if (off_secs > 0xFFFF) off_secs = 0xFFFF;
+
+ if (! DPMSQueryExtension (dpy, &event, &error))
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: XDPMS extension not supported.\n", blurb());
+ return;
+ }
+
+ if (! DPMSCapable (dpy))
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: DPMS not supported.\n", blurb());
+ return;
+ }
+
+ if (! DPMSInfo (dpy, &o_power, &o_enabled))
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: unable to get DPMS state.\n", blurb());
+ return;
+ }
+
+ if (o_enabled != enabled_p)
+ {
+ if (! (enabled_p ? DPMSEnable (dpy) : DPMSDisable (dpy)))
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: unable to set DPMS state.\n", blurb());
+ return;
+ }
+ else if (verbose_p)
+ fprintf (stderr, "%s: turned DPMS %s.\n", blurb(),
+ enabled_p ? "on" : "off");
+ }
+
+ if (bogus_p)
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: not setting bogus DPMS timeouts: %d %d %d.\n",
+ blurb(), standby_secs, suspend_secs, off_secs);
+ return;
+ }
+
+ if (!DPMSGetTimeouts (dpy, &o_standby, &o_suspend, &o_off))
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: unable to get DPMS timeouts.\n", blurb());
+ return;
+ }
+
+ if (o_standby != standby_secs ||
+ o_suspend != suspend_secs ||
+ o_off != off_secs)
+ {
+ if (!DPMSSetTimeouts (dpy, standby_secs, suspend_secs, off_secs))
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: unable to set DPMS timeouts.\n", blurb());
+ return;
+ }
+ else if (verbose_p)
+ fprintf (stderr, "%s: set DPMS timeouts: %d %d %d.\n", blurb(),
+ standby_secs, suspend_secs, off_secs);
+ }
+}
+
+Bool
+monitor_powered_on_p (saver_info *si)
+{
+ Bool result;
+ int event_number, error_number;
+ BOOL onoff = False;
+ CARD16 state;
+
+ if (!DPMSQueryExtension(si->dpy, &event_number, &error_number))
+ /* Server doesn't know -- assume the monitor is on. */
+ result = True;
+
+ else if (!DPMSCapable(si->dpy))
+ /* Server says the monitor doesn't do power management -- so it's on. */
+ result = True;
+
+ else
+ {
+ DPMSInfo(si->dpy, &state, &onoff);
+ if (!onoff)
+ /* Server says DPMS is disabled -- so the monitor is on. */
+ result = True;
+ else
+ switch (state) {
+ case DPMSModeOn: result = True; break; /* really on */
+ case DPMSModeStandby: result = False; break; /* kinda off */
+ case DPMSModeSuspend: result = False; break; /* pretty off */
+ case DPMSModeOff: result = False; break; /* really off */
+ default: result = True; break; /* protocol error? */
+ }
+ }
+
+ return result;
+}
+
+void
+monitor_power_on (saver_info *si, Bool on_p)
+{
+ if ((!!on_p) != monitor_powered_on_p (si))
+ {
+ XErrorHandler old_handler;
+ int event_number, error_number;
+ if (!DPMSQueryExtension(si->dpy, &event_number, &error_number) ||
+ !DPMSCapable(si->dpy))
+ {
+ if (si->prefs.verbose_p)
+ fprintf (stderr,
+ "%s: unable to power %s monitor: no DPMS extension.\n",
+ blurb(), (on_p ? "on" : "off"));
+ return;
+ }
+
+ /* The manual for DPMSForceLevel() says that it throws BadMatch if
+ "DPMS is disabled on the specified display."
+
+ The manual for DPMSCapable() says that it "returns True if the X
+ server is capable of DPMS."
+
+ Apparently they consider "capable of DPMS" and "DPMS is enabled"
+ to be different things, and so even if DPMSCapable() returns
+ True, DPMSForceLevel() *might* throw an X Error. Isn't that
+ just fucking special.
+ */
+ XSync (si->dpy, False);
+ error_handler_hit_p = False;
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+ XSync (si->dpy, False);
+ DPMSForceLevel(si->dpy, (on_p ? DPMSModeOn : DPMSModeOff));
+ XSync (si->dpy, False);
+ XSetErrorHandler (old_handler);
+ /* Ignore error_handler_hit_p, just probe monitor instead */
+
+ if ((!!on_p) != monitor_powered_on_p (si)) /* double-check */
+ fprintf (stderr,
+ "%s: DPMSForceLevel(dpy, %s) did not change monitor power state.\n",
+ blurb(),
+ (on_p ? "DPMSModeOn" : "DPMSModeOff"));
+ }
+}
+
+#else /* !HAVE_DPMS_EXTENSION */
+
+void
+sync_server_dpms_settings (Display *dpy, Bool enabled_p,
+ Bool dpms_quickoff_p,
+ int standby_secs, int suspend_secs, int off_secs,
+ Bool verbose_p)
+{
+ if (verbose_p)
+ fprintf (stderr, "%s: DPMS support not compiled in.\n", blurb());
+}
+
+Bool
+monitor_powered_on_p (saver_info *si)
+{
+ return True;
+}
+
+void
+monitor_power_on (saver_info *si, Bool on_p)
+{
+ return;
+}
+
+#endif /* !HAVE_DPMS_EXTENSION */
diff --git a/driver/exec.c b/driver/exec.c
new file mode 100644
index 0000000..38ca88a
--- /dev/null
+++ b/driver/exec.c
@@ -0,0 +1,300 @@
+/* exec.c --- executes a program in *this* pid, without an intervening process.
+ * xscreensaver, Copyright (c) 1991-2013 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+
+/* I don't believe what a sorry excuse for an operating system UNIX is!
+
+ - I want to spawn a process.
+ - I want to know it's pid so that I can kill it.
+ - I would like to receive a message when it dies of natural causes.
+ - I want the spawned process to have user-specified arguments.
+
+ If shell metacharacters are present (wildcards, backquotes, etc), the
+ only way to parse those arguments is to run a shell to do the parsing
+ for you.
+
+ And the only way to know the pid of the process is to fork() and exec()
+ it in the spawned side of the fork.
+
+ But if you're running a shell to parse your arguments, this gives you
+ the pid of the *shell*, not the pid of the *process* that you're
+ actually interested in, which is an *inferior* of the shell. This also
+ means that the SIGCHLD you get applies to the shell, not its inferior.
+ (Why isn't that sufficient? I don't remember any more, but it turns
+ out that it isn't.)
+
+ So, the only solution, when metacharacters are present, is to force the
+ shell to exec() its inferior. What a fucking hack! We prepend "exec "
+ to the command string, and hope it doesn't contain unquoted semicolons
+ or ampersands (we don't search for them, because we don't want to
+ prohibit their use in quoted strings (messages, for example) and parsing
+ out the various quote characters is too much of a pain.)
+
+ (Actually, Clint Wong <clint@jts.com> points out that process groups
+ might be used to take care of this problem; this may be worth considering
+ some day, except that, 1: this code works now, so why fix it, and 2: from
+ what I've seen in Emacs, dealing with process groups isn't especially
+ portable.)
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <sys/stat.h>
+
+#ifndef ESRCH
+# include <errno.h>
+#endif
+
+#if defined(HAVE_SETPRIORITY) && defined(PRIO_PROCESS)
+# include <sys/resource.h> /* for setpriority() and PRIO_PROCESS */
+ /* and also setrlimit() and RLIMIT_AS */
+#endif
+
+#ifdef VMS
+# include <processes.h>
+# include <unixio.h> /* for close */
+# include <unixlib.h> /* for getpid */
+# define pid_t int
+# define fork vfork
+#endif /* VMS */
+
+#include "exec.h"
+
+extern const char *blurb (void);
+
+static void nice_process (int nice_level);
+
+
+#ifndef VMS
+
+static void
+exec_simple_command (const char *command)
+{
+ char *av[1024];
+ int ac = 0;
+ char *token = strtok (strdup(command), " \t");
+ while (token)
+ {
+ av[ac++] = token;
+ token = strtok(0, " \t");
+ }
+ av[ac] = 0;
+
+ execvp (av[0], av); /* shouldn't return. */
+}
+
+
+static void
+exec_complex_command (const char *shell, const char *command)
+{
+ char *av[5];
+ int ac = 0;
+ char *command2 = (char *) malloc (strlen (command) + 10);
+ const char *s;
+ int got_eq = 0;
+ const char *after_vars;
+
+ /* Skip leading whitespace.
+ */
+ while (*command == ' ' || *command == '\t')
+ command++;
+
+ /* If the string has a series of tokens with "=" in them at them, set
+ `after_vars' to point into the string after those tokens and any
+ trailing whitespace. Otherwise, after_vars == command.
+ */
+ after_vars = command;
+ for (s = command; *s; s++)
+ {
+ if (*s == '=') got_eq = 1;
+ else if (*s == ' ')
+ {
+ if (got_eq)
+ {
+ while (*s == ' ' || *s == '\t')
+ s++;
+ after_vars = s;
+ got_eq = 0;
+ }
+ else
+ break;
+ }
+ }
+
+ *command2 = 0;
+ strncat (command2, command, after_vars - command);
+ strcat (command2, "exec ");
+ strcat (command2, after_vars);
+
+ /* We have now done these transformations:
+ "foo -x -y" ==> "exec foo -x -y"
+ "BLAT=foop foo -x" ==> "BLAT=foop exec foo -x"
+ "BLAT=foop A=b foo -x" ==> "BLAT=foop A=b exec foo -x"
+ */
+
+
+ /* Invoke the shell as "/bin/sh -c 'exec prog -arg -arg ...'" */
+ av [ac++] = (char *) shell;
+ av [ac++] = "-c";
+ av [ac++] = command2;
+ av [ac] = 0;
+
+ execvp (av[0], av); /* shouldn't return. */
+}
+
+#else /* VMS */
+
+static void
+exec_vms_command (const char *command)
+{
+ system (command);
+ fflush (stderr);
+ fflush (stdout);
+ exit (1); /* Note that this only exits a child fork. */
+}
+
+#endif /* !VMS */
+
+
+void
+exec_command (const char *shell, const char *command, int nice_level)
+{
+ int hairy_p;
+
+#ifndef VMS
+ nice_process (nice_level);
+
+ hairy_p = !!strpbrk (command, "*?$&!<>[];`'\\\"=");
+ /* note: = is in the above because of the sh syntax "FOO=bar cmd". */
+
+ if (getuid() == (uid_t) 0 || geteuid() == (uid_t) 0)
+ {
+ /* If you're thinking of commenting this out, think again.
+ If you do so, you will open a security hole. Mail jwz
+ so that he may enlighten you as to the error of your ways.
+ */
+ fprintf (stderr, "%s: we're still running as root! Disaster!\n",
+ blurb());
+ exit (-1);
+ }
+
+ if (hairy_p)
+ /* If it contains any shell metacharacters, do it the hard way,
+ and fork a shell to parse the arguments for us. */
+ exec_complex_command (shell, command);
+ else
+ /* Otherwise, we can just exec the program directly. */
+ exec_simple_command (command);
+
+#else /* VMS */
+ exec_vms_command (command);
+#endif /* VMS */
+}
+
+
+/* Setting process priority
+ */
+
+static void
+nice_process (int nice_level)
+{
+ if (nice_level == 0)
+ return;
+
+#if defined(HAVE_NICE)
+ {
+ int old_nice = nice (0);
+ int n = nice_level - old_nice;
+ errno = 0;
+ if (nice (n) == -1 && errno != 0)
+ {
+ char buf [512];
+ sprintf (buf, "%s: nice(%d) failed", blurb(), n);
+ perror (buf);
+ }
+ }
+#elif defined(HAVE_SETPRIORITY) && defined(PRIO_PROCESS)
+ if (setpriority (PRIO_PROCESS, getpid(), nice_level) != 0)
+ {
+ char buf [512];
+ sprintf (buf, "%s: setpriority(PRIO_PROCESS, %lu, %d) failed",
+ blurb(), (unsigned long) getpid(), nice_level);
+ perror (buf);
+ }
+#else
+ fprintf (stderr,
+ "%s: don't know how to change process priority on this system.\n",
+ blurb());
+
+#endif
+}
+
+
+/* Whether the given command exists on $PATH.
+ (Anything before the first space is considered to be the program name.)
+ */
+int
+on_path_p (const char *program)
+{
+ int result = 0;
+ struct stat st;
+ char *cmd = strdup (program);
+ char *token = strchr (cmd, ' ');
+ char *path = 0;
+ int L;
+
+ if (token) *token = 0;
+ token = 0;
+
+ if (strchr (cmd, '/'))
+ {
+ result = (0 == stat (cmd, &st));
+ goto DONE;
+ }
+
+ path = getenv("PATH");
+ if (!path || !*path)
+ goto DONE;
+
+ L = strlen (cmd);
+ path = strdup (path);
+ token = strtok (path, ":");
+
+ while (token)
+ {
+ char *p2 = (char *) malloc (strlen (token) + L + 3);
+ strcpy (p2, token);
+ strcat (p2, "/");
+ strcat (p2, cmd);
+ result = (0 == stat (p2, &st));
+ free (p2);
+ if (result)
+ goto DONE;
+ token = strtok (0, ":");
+ }
+
+ DONE:
+ free (cmd);
+ if (path) free (path);
+ return result;
+}
+
diff --git a/driver/exec.h b/driver/exec.h
new file mode 100644
index 0000000..318410b
--- /dev/null
+++ b/driver/exec.h
@@ -0,0 +1,21 @@
+/* exec.c --- executes a program in *this* pid, without an intervening process.
+ * xscreensaver, Copyright (c) 1991-2006 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __XSCREENSAVER_EXEC_H__
+#define __XSCREENSAVER_EXEC_H__
+
+extern void exec_command (const char *shell, const char *command,
+ int nice_level);
+
+extern int on_path_p (const char *program);
+
+#endif /* __XSCREENSAVER_EXEC_H__ */
diff --git a/driver/link_axp.com b/driver/link_axp.com
new file mode 100644
index 0000000..a141892
--- /dev/null
+++ b/driver/link_axp.com
@@ -0,0 +1,15 @@
+$! We fisrt test the version of DECW/Motif ; if 1.2 we need to link with new
+$! X11R5 libraries
+$@sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version
+$ if f$extract(4,3,decw$version).eqs."1.2"
+$ then
+$! DECW/Motif 1.2 : link with X11R5 libraries
+$ link xscreensaver-command,vms_axp_12.opt/opt
+$ link xscreensaver,demo,dialogs-xm,lock,passwd,stderr,subprocs,timers, -
+ windows,xset,vms-getpwnam,vms-hpwd,vms-validate,vms_axp_12.opt/opt
+$ else
+$! Else, link with X11R4 libraries
+$ link xscreensaver-command,vms_axp.opt/opt
+$ link xscreensaver,demo,dialogs-xm,lock,passwd,stderr,subprocs,timers, -
+ windows,xset,vms-getpwnam,vms-hpwd,vms-validate,vms_axp.opt/opt
+$ endif
diff --git a/driver/link_decc.com b/driver/link_decc.com
new file mode 100644
index 0000000..d1de0d0
--- /dev/null
+++ b/driver/link_decc.com
@@ -0,0 +1,15 @@
+$! We fisrt test the version of DECW/Motif ; if 1.2 we need to link with new
+$! X11R5 libraries
+$@sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version
+$ if f$extract(4,3,decw$version).eqs."1.2"
+$ then
+$! DECW/Motif 1.2 : link with X11R5 libraries
+$ link xscreensaver-command,vms_decc_12.opt/opt
+$ link xscreensaver,demo,dialogs-xm,lock,passwd,stderr,subprocs,timers, -
+ windows,xset,vms-getpwnam,vms-hpwd,vms-validate,vms_decc_12.opt/opt
+$ else
+$! Else, link with X11R4 libraries
+$ link xscreensaver-command,vms_decc.opt/opt
+$ link xscreensaver,demo,dialogs-xm,lock,passwd,stderr,subprocs,timers, -
+ windows,xset,vms-getpwnam,vms-hpwd,vms-validate,vms_decc.opt/opt
+$ endif
diff --git a/driver/lock.c b/driver/lock.c
new file mode 100644
index 0000000..10b879e
--- /dev/null
+++ b/driver/lock.c
@@ -0,0 +1,2259 @@
+/* lock.c --- handling the password dialog for locking-mode.
+ * xscreensaver, Copyright (c) 1993-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* Athena locking code contributed by Jon A. Christopher <jac8782@tamu.edu> */
+/* Copyright 1997, with the same permissions as above. */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <ctype.h>
+#include <X11/Intrinsic.h>
+#include <X11/cursorfont.h>
+#include <X11/Xos.h> /* for time() */
+#include <time.h>
+#include <sys/time.h>
+#include "xscreensaver.h"
+#include "resources.h"
+#include "mlstring.h"
+#include "auth.h"
+
+#ifndef NO_LOCKING /* (mostly) whole file */
+
+#ifdef HAVE_XHPDISABLERESET
+# include <X11/XHPlib.h>
+ static void hp_lock_reset (saver_info *si, Bool lock_p);
+#endif /* HAVE_XHPDISABLERESET */
+
+#ifdef HAVE_XF86VMODE
+# include <X11/extensions/xf86vmode.h>
+ static void xfree_lock_mode_switch (saver_info *si, Bool lock_p);
+#endif /* HAVE_XF86VMODE */
+
+#ifdef HAVE_XF86MISCSETGRABKEYSSTATE
+# include <X11/extensions/xf86misc.h>
+ static void xfree_lock_grab_smasher (saver_info *si, Bool lock_p);
+#endif /* HAVE_XF86MISCSETGRABKEYSSTATE */
+
+#ifdef HAVE_RANDR
+# include <X11/extensions/Xrandr.h>
+#endif /* HAVE_RANDR */
+
+#ifdef _VROOT_H_
+ERROR! You must not include vroot.h in this file.
+#endif
+
+#ifdef HAVE_UNAME
+# include <sys/utsname.h> /* for hostname info */
+#endif /* HAVE_UNAME */
+#include <ctype.h>
+
+#ifndef VMS
+# include <pwd.h>
+#else /* VMS */
+
+extern char *getenv(const char *name);
+extern int validate_user(char *name, char *password);
+
+static Bool
+vms_passwd_valid_p(char *pw, Bool verbose_p)
+{
+ return (validate_user (getenv("USER"), typed_passwd) == 1);
+}
+# undef passwd_valid_p
+# define passwd_valid_p vms_passwd_valid_p
+
+#endif /* VMS */
+
+#define SAMPLE_INPUT "MMMMMMMMMMMM"
+
+
+#undef MAX
+#define MAX(a,b) ((a)>(b)?(a):(b))
+
+typedef struct info_dialog_data info_dialog_data;
+
+
+#define MAX_BYTES_PER_CHAR 8 /* UTF-8 uses no more than 3, I think */
+#define MAX_PASSWD_CHARS 128 /* Longest possible passphrase */
+
+struct passwd_dialog_data {
+
+ saver_screen_info *prompt_screen;
+ int previous_mouse_x, previous_mouse_y;
+
+ /* "Characters" in the password may be a variable number of bytes long.
+ typed_passwd contains the raw bytes.
+ typed_passwd_char_size indicates the size in bytes of each character,
+ so that we can make backspace work.
+ */
+ char typed_passwd [MAX_PASSWD_CHARS * MAX_BYTES_PER_CHAR];
+ char typed_passwd_char_size [MAX_PASSWD_CHARS];
+
+ XtIntervalId timer;
+ int i_beam;
+
+ float ratio;
+ Position x, y;
+ Dimension width;
+ Dimension height;
+ Dimension border_width;
+
+ Bool echo_input;
+ Bool show_stars_p; /* "I regret that I have but one asterisk for my country."
+ -- Nathan Hale, 1776. */
+
+ char *heading_label;
+ char *body_label;
+ char *user_label;
+ mlstring *info_label;
+ /* The entry field shall only be displayed if prompt_label is not NULL */
+ mlstring *prompt_label;
+ char *date_label;
+ char *passwd_string;
+ Bool passwd_changed_p; /* Whether the user entry field needs redrawing */
+ Bool caps_p; /* Whether we saw a keypress with caps-lock on */
+ char *unlock_label;
+ char *login_label;
+ char *uname_label;
+
+ Bool show_uname_p;
+
+ XFontStruct *heading_font;
+ XFontStruct *body_font;
+ XFontStruct *label_font;
+ XFontStruct *passwd_font;
+ XFontStruct *date_font;
+ XFontStruct *button_font;
+ XFontStruct *uname_font;
+
+ Pixel foreground;
+ Pixel background;
+ Pixel border;
+ Pixel passwd_foreground;
+ Pixel passwd_background;
+ Pixel thermo_foreground;
+ Pixel thermo_background;
+ Pixel shadow_top;
+ Pixel shadow_bottom;
+ Pixel button_foreground;
+ Pixel button_background;
+
+ Dimension preferred_logo_width, logo_width;
+ Dimension preferred_logo_height, logo_height;
+ Dimension thermo_width;
+ Dimension internal_border;
+ Dimension shadow_width;
+
+ Dimension passwd_field_x, passwd_field_y;
+ Dimension passwd_field_width, passwd_field_height;
+
+ Dimension unlock_button_x, unlock_button_y;
+ Dimension unlock_button_width, unlock_button_height;
+
+ Dimension login_button_x, login_button_y;
+ Dimension login_button_width, login_button_height;
+
+ Dimension thermo_field_x, thermo_field_y;
+ Dimension thermo_field_height;
+
+ Pixmap logo_pixmap;
+ Pixmap logo_clipmask;
+ int logo_npixels;
+ unsigned long *logo_pixels;
+
+ Cursor passwd_cursor;
+ Bool unlock_button_down_p;
+ Bool login_button_down_p;
+ Bool login_button_p;
+ Bool login_button_enabled_p;
+ Bool button_state_changed_p; /* Refers to both buttons */
+
+ Pixmap save_under;
+ Pixmap user_entry_pixmap;
+};
+
+static void draw_passwd_window (saver_info *si);
+static void update_passwd_window (saver_info *si, const char *printed_passwd,
+ float ratio);
+static void destroy_passwd_window (saver_info *si);
+static void undo_vp_motion (saver_info *si);
+static void finished_typing_passwd (saver_info *si, passwd_dialog_data *pw);
+static void cleanup_passwd_window (saver_info *si);
+static void restore_background (saver_info *si);
+
+extern void xss_authenticate(saver_info *si, Bool verbose_p);
+
+static int
+new_passwd_window (saver_info *si)
+{
+ passwd_dialog_data *pw;
+ Screen *screen;
+ Colormap cmap;
+ saver_screen_info *ssi = &si->screens [mouse_screen (si)];
+
+ pw = (passwd_dialog_data *) calloc (1, sizeof(*pw));
+ if (!pw)
+ return -1;
+
+ /* Display the button only if the "newLoginCommand" pref is non-null.
+ */
+ pw->login_button_p = (si->prefs.new_login_command &&
+ *si->prefs.new_login_command);
+
+ pw->passwd_cursor = XCreateFontCursor (si->dpy, XC_top_left_arrow);
+
+ pw->prompt_screen = ssi;
+
+ screen = pw->prompt_screen->screen;
+ cmap = DefaultColormapOfScreen (screen);
+
+ pw->show_stars_p = get_boolean_resource(si->dpy, "passwd.asterisks",
+ "Boolean");
+
+ pw->heading_label = get_string_resource (si->dpy, "passwd.heading.label",
+ "Dialog.Label.Label");
+ pw->body_label = get_string_resource (si->dpy, "passwd.body.label",
+ "Dialog.Label.Label");
+ pw->user_label = get_string_resource (si->dpy, "passwd.user.label",
+ "Dialog.Label.Label");
+ pw->unlock_label = get_string_resource (si->dpy, "passwd.unlock.label",
+ "Dialog.Button.Label");
+ pw->login_label = get_string_resource (si->dpy, "passwd.login.label",
+ "Dialog.Button.Label");
+
+ pw->date_label = get_string_resource (si->dpy, "dateFormat", "DateFormat");
+
+ if (!pw->heading_label)
+ pw->heading_label = strdup("ERROR: RESOURCES NOT INSTALLED CORRECTLY");
+ if (!pw->body_label)
+ pw->body_label = strdup("ERROR: RESOURCES NOT INSTALLED CORRECTLY");
+ if (!pw->user_label) pw->user_label = strdup("ERROR");
+ if (!pw->date_label) pw->date_label = strdup("ERROR");
+ if (!pw->unlock_label) pw->unlock_label = strdup("ERROR (UNLOCK)");
+ if (!pw->login_label) pw->login_label = strdup ("ERROR (LOGIN)") ;
+
+ /* Put the version number in the label. */
+ {
+ char *s = (char *) malloc (strlen(pw->heading_label) + 20);
+ sprintf(s, pw->heading_label, si->version);
+ free (pw->heading_label);
+ pw->heading_label = s;
+ }
+
+ /* Get hostname info */
+ pw->uname_label = strdup(""); /* Initialy, write nothing */
+
+# ifdef HAVE_UNAME
+ {
+ struct utsname uts;
+
+ if (uname (&uts) == 0)
+ {
+#if 0 /* Get the full hostname */
+ {
+ char *s;
+ if ((s = strchr(uts.nodename, '.')))
+ *s = 0;
+ }
+#endif
+ char *s = strdup (uts.nodename);
+ free (pw->uname_label);
+ pw->uname_label = s;
+ }
+ }
+# endif
+
+ pw->passwd_string = strdup("");
+
+ pw->heading_font =
+ splash_load_font (si->dpy, "passwd.headingFont", "Dialog.Font");
+ pw->button_font =
+ splash_load_font (si->dpy, "passwd.buttonFont", "Dialog.Font");
+ pw->body_font =
+ splash_load_font (si->dpy, "passwd.bodyFont", "Dialog.Font");
+ pw->label_font =
+ splash_load_font (si->dpy, "passwd.labelFont", "Dialog.Font");
+ pw->passwd_font =
+ splash_load_font (si->dpy, "passwd.passwdFont", "Dialog.Font");
+ pw->date_font =
+ splash_load_font (si->dpy, "passwd.dateFont", "Dialog.Font");
+ pw->uname_font =
+ splash_load_font (si->dpy, "passwd.unameFont", "Dialog.Font");
+
+ pw->show_uname_p = get_boolean_resource(si->dpy, "passwd.uname", "Boolean");
+
+ pw->foreground = get_pixel_resource (si->dpy, cmap,
+ "passwd.foreground",
+ "Dialog.Foreground" );
+ pw->background = get_pixel_resource (si->dpy, cmap,
+ "passwd.background",
+ "Dialog.Background" );
+ pw->border = get_pixel_resource (si->dpy, cmap,
+ "passwd.borderColor",
+ "Dialog.borderColor");
+
+ if (pw->foreground == pw->background)
+ {
+ /* Make sure the error messages show up. */
+ pw->foreground = BlackPixelOfScreen (screen);
+ pw->background = WhitePixelOfScreen (screen);
+ }
+
+ pw->passwd_foreground = get_pixel_resource (si->dpy, cmap,
+ "passwd.text.foreground",
+ "Dialog.Text.Foreground" );
+ pw->passwd_background = get_pixel_resource (si->dpy, cmap,
+ "passwd.text.background",
+ "Dialog.Text.Background" );
+ pw->button_foreground = get_pixel_resource (si->dpy, cmap,
+ "splash.Button.foreground",
+ "Dialog.Button.Foreground" );
+ pw->button_background = get_pixel_resource (si->dpy, cmap,
+ "splash.Button.background",
+ "Dialog.Button.Background" );
+ pw->thermo_foreground = get_pixel_resource (si->dpy, cmap,
+ "passwd.thermometer.foreground",
+ "Dialog.Thermometer.Foreground");
+ pw->thermo_background = get_pixel_resource ( si->dpy, cmap,
+ "passwd.thermometer.background",
+ "Dialog.Thermometer.Background");
+ pw->shadow_top = get_pixel_resource ( si->dpy, cmap,
+ "passwd.topShadowColor",
+ "Dialog.Foreground" );
+ pw->shadow_bottom = get_pixel_resource (si->dpy, cmap,
+ "passwd.bottomShadowColor",
+ "Dialog.Background" );
+
+ pw->preferred_logo_width = get_integer_resource (si->dpy,
+ "passwd.logo.width",
+ "Dialog.Logo.Width");
+ pw->preferred_logo_height = get_integer_resource (si->dpy,
+ "passwd.logo.height",
+ "Dialog.Logo.Height");
+ pw->thermo_width = get_integer_resource (si->dpy, "passwd.thermometer.width",
+ "Dialog.Thermometer.Width");
+ pw->internal_border = get_integer_resource (si->dpy,
+ "passwd.internalBorderWidth",
+ "Dialog.InternalBorderWidth");
+ pw->shadow_width = get_integer_resource (si->dpy, "passwd.shadowThickness",
+ "Dialog.ShadowThickness");
+
+ if (pw->preferred_logo_width == 0) pw->preferred_logo_width = 150;
+ if (pw->preferred_logo_height == 0) pw->preferred_logo_height = 150;
+ if (pw->internal_border == 0) pw->internal_border = 15;
+ if (pw->shadow_width == 0) pw->shadow_width = 4;
+ if (pw->thermo_width == 0) pw->thermo_width = pw->shadow_width;
+
+
+ /* We need to remember the mouse position and restore it afterward, or
+ sometimes (perhaps only with Xinerama?) the mouse gets warped to
+ inside the bounds of the lock dialog window.
+ */
+ {
+ Window pointer_root, pointer_child;
+ int root_x, root_y, win_x, win_y;
+ unsigned int mask;
+ pw->previous_mouse_x = 0;
+ pw->previous_mouse_y = 0;
+ if (XQueryPointer (si->dpy, RootWindowOfScreen (pw->prompt_screen->screen),
+ &pointer_root, &pointer_child,
+ &root_x, &root_y, &win_x, &win_y, &mask))
+ {
+ pw->previous_mouse_x = root_x;
+ pw->previous_mouse_y = root_y;
+ if (si->prefs.verbose_p)
+ fprintf (stderr, "%s: %d: mouse is at %d,%d.\n",
+ blurb(), pw->prompt_screen->number,
+ pw->previous_mouse_x, pw->previous_mouse_y);
+ }
+ else if (si->prefs.verbose_p)
+ fprintf (stderr, "%s: %d: unable to determine mouse position?\n",
+ blurb(), pw->prompt_screen->number);
+ }
+
+ /* Before mapping the window, save a pixmap of the current screen.
+ When we lower the window, we restore these bits. This works,
+ because the running screenhack has already been sent SIGSTOP, so
+ we know nothing else is drawing right now! */
+ {
+ XGCValues gcv;
+ GC gc;
+ pw->save_under = XCreatePixmap (si->dpy,
+ pw->prompt_screen->screensaver_window,
+ pw->prompt_screen->width,
+ pw->prompt_screen->height,
+ pw->prompt_screen->current_depth);
+ gcv.function = GXcopy;
+ gc = XCreateGC (si->dpy, pw->save_under, GCFunction, &gcv);
+ XCopyArea (si->dpy, pw->prompt_screen->screensaver_window,
+ pw->save_under, gc,
+ 0, 0,
+ pw->prompt_screen->width, pw->prompt_screen->height,
+ 0, 0);
+ XFreeGC (si->dpy, gc);
+ }
+
+ si->pw_data = pw;
+ return 0;
+}
+
+
+Bool debug_passwd_window_p = False; /* used only by test-passwd.c */
+
+
+/**
+ * info_msg and prompt may be NULL.
+ */
+static int
+make_passwd_window (saver_info *si,
+ const char *info_msg,
+ const char *prompt,
+ Bool echo)
+{
+ XSetWindowAttributes attrs;
+ unsigned long attrmask = 0;
+ passwd_dialog_data *pw;
+ Screen *screen;
+ Colormap cmap;
+ Dimension max_string_width_px;
+ saver_screen_info *ssi = &si->screens [mouse_screen (si)];
+
+ cleanup_passwd_window (si);
+
+ if (! ssi) /* WTF? Trying to prompt while no screens connected? */
+ return -1;
+
+ if (!si->pw_data)
+ if (new_passwd_window (si) < 0)
+ return -1;
+
+ if (!(pw = si->pw_data))
+ return -1;
+
+ pw->ratio = 1.0;
+
+ pw->prompt_screen = ssi;
+ if (si->prefs.verbose_p)
+ fprintf (stderr, "%s: %d: creating password dialog (\"%s\")\n",
+ blurb(), pw->prompt_screen->number,
+ info_msg ? info_msg : "");
+
+ screen = pw->prompt_screen->screen;
+ cmap = DefaultColormapOfScreen (screen);
+
+ pw->echo_input = echo;
+
+ max_string_width_px = ssi->width
+ - pw->shadow_width * 4
+ - pw->border_width * 2
+ - pw->thermo_width
+ - pw->preferred_logo_width
+ - pw->internal_border * 2;
+ /* As the string wraps it makes the window taller which makes the logo wider
+ * which leaves less room for the text which makes the string wrap. Uh-oh, a
+ * loop. By wrapping at a bit less than the available width, there's some
+ * room for the dialog to grow without going off the edge of the screen. */
+ max_string_width_px *= 0.75;
+
+ if (!info_msg && senesculent_p())
+ info_msg = ("\n"
+ "This version of XScreenSaver\n"
+ "is very old! Please upgrade!\n");
+
+ pw->info_label = mlstring_new(info_msg ? info_msg : pw->body_label,
+ pw->label_font, max_string_width_px);
+
+ {
+ int direction, ascent, descent;
+ XCharStruct overall;
+
+ pw->width = 0;
+ pw->height = 0;
+
+ /* Measure the heading_label. */
+ XTextExtents (pw->heading_font,
+ pw->heading_label, strlen(pw->heading_label),
+ &direction, &ascent, &descent, &overall);
+ if (overall.width > pw->width) pw->width = overall.width;
+ pw->height += ascent + descent;
+
+ /* Measure the uname_label. */
+ if ((strlen(pw->uname_label)) && pw->show_uname_p)
+ {
+ XTextExtents (pw->uname_font,
+ pw->uname_label, strlen(pw->uname_label),
+ &direction, &ascent, &descent, &overall);
+ if (overall.width > pw->width) pw->width = overall.width;
+ pw->height += ascent + descent;
+ }
+
+ {
+ Dimension w2 = 0, w3 = 0, button_w = 0;
+ Dimension h2 = 0, h3 = 0, button_h = 0;
+ const char *passwd_string = SAMPLE_INPUT;
+
+ /* Measure the user_label. */
+ XTextExtents (pw->label_font,
+ pw->user_label, strlen(pw->user_label),
+ &direction, &ascent, &descent, &overall);
+ if (overall.width > w2) w2 = overall.width;
+ h2 += ascent + descent;
+
+ /* Measure the info_label. */
+ if (pw->info_label->overall_width > pw->width)
+ pw->width = pw->info_label->overall_width;
+ h2 += pw->info_label->overall_height;
+
+ /* Measure the user string. */
+ XTextExtents (pw->passwd_font,
+ si->user, strlen(si->user),
+ &direction, &ascent, &descent, &overall);
+ overall.width += (pw->shadow_width * 4);
+ ascent += (pw->shadow_width * 4);
+ if (overall.width > w3) w3 = overall.width;
+ h3 += ascent + descent;
+
+ /* Measure the (dummy) passwd_string. */
+ if (prompt)
+ {
+ XTextExtents (pw->passwd_font,
+ passwd_string, strlen(passwd_string),
+ &direction, &ascent, &descent, &overall);
+ overall.width += (pw->shadow_width * 4);
+ ascent += (pw->shadow_width * 4);
+ if (overall.width > w3) w3 = overall.width;
+ h3 += ascent + descent;
+
+ /* Measure the prompt_label. */
+ max_string_width_px -= w3;
+ pw->prompt_label = mlstring_new (prompt, pw->label_font,
+ max_string_width_px);
+
+ if (pw->prompt_label->overall_width > w2)
+ w2 = pw->prompt_label->overall_width;
+
+ h2 += pw->prompt_label->overall_height;
+
+ w2 = w2 + w3 + (pw->shadow_width * 2);
+ h2 = MAX (h2, h3);
+ }
+
+ /* The "Unlock" button. */
+ XTextExtents (pw->label_font,
+ pw->unlock_label, strlen(pw->unlock_label),
+ &direction, &ascent, &descent, &overall);
+ button_w = overall.width;
+ button_h = ascent + descent;
+
+ /* Add some horizontal padding inside the button. */
+ button_w += ascent;
+
+ button_w += ((ascent + descent) / 2) + (pw->shadow_width * 2);
+ button_h += ((ascent + descent) / 2) + (pw->shadow_width * 2);
+
+ pw->unlock_button_width = button_w;
+ pw->unlock_button_height = button_h;
+
+ w2 = MAX (w2, button_w);
+ h2 += button_h * 1.5;
+
+ /* The "New Login" button */
+ pw->login_button_width = 0;
+ pw->login_button_height = 0;
+
+ if (pw->login_button_p)
+ {
+ pw->login_button_enabled_p = True;
+
+ /* Measure the "New Login" button */
+ XTextExtents (pw->button_font, pw->login_label,
+ strlen (pw->login_label),
+ &direction, &ascent, &descent, &overall);
+ button_w = overall.width;
+ button_h = ascent + descent;
+
+ /* Add some horizontal padding inside the buttons. */
+ button_w += ascent;
+
+ button_w += ((ascent + descent) / 2) + (pw->shadow_width * 2);
+ button_h += ((ascent + descent) / 2) + (pw->shadow_width * 2);
+
+ pw->login_button_width = button_w;
+ pw->login_button_height = button_h;
+
+ if (button_h > pw->unlock_button_height)
+ h2 += (button_h * 1.5 - pw->unlock_button_height * 1.5);
+
+ /* Use (2 * shadow_width) spacing between the buttons. Another
+ (2 * shadow_width) is required to account for button shadows. */
+ w2 = MAX (w2,
+ button_w + pw->unlock_button_width +
+ (pw->shadow_width * 4));
+ }
+
+ if (w2 > pw->width) pw->width = w2;
+ pw->height += h2;
+ }
+
+ pw->width += (pw->internal_border * 2);
+ pw->height += (pw->internal_border * 4);
+
+ pw->width += pw->thermo_width + (pw->shadow_width * 3);
+
+ if (pw->preferred_logo_height > pw->height)
+ pw->height = pw->logo_height = pw->preferred_logo_height;
+ else if (pw->height > pw->preferred_logo_height)
+ pw->logo_height = pw->height;
+
+ pw->logo_width = pw->logo_height;
+
+ pw->width += pw->logo_width;
+ }
+
+ attrmask |= CWOverrideRedirect; attrs.override_redirect = True;
+
+ if (debug_passwd_window_p)
+ attrs.override_redirect = False; /* kludge for test-passwd.c */
+
+ attrmask |= CWEventMask;
+ attrs.event_mask = (ExposureMask | KeyPressMask |
+ ButtonPressMask | ButtonReleaseMask);
+
+ /* Figure out where on the desktop to place the window so that it will
+ actually be visible; this takes into account virtual viewports as
+ well as Xinerama. */
+ {
+ saver_screen_info *ssi = &si->screens [mouse_screen (si)];
+ int x = ssi->x;
+ int y = ssi->y;
+ int w = ssi->width;
+ int h = ssi->height;
+ if (si->prefs.debug_p) w /= 2;
+ pw->x = x + ((w + pw->width) / 2) - pw->width;
+ pw->y = y + ((h + pw->height) / 2) - pw->height;
+ if (pw->x < x) pw->x = x;
+ if (pw->y < y) pw->y = y;
+ }
+
+ pw->border_width = get_integer_resource (si->dpy, "passwd.borderWidth",
+ "Dialog.BorderWidth");
+
+ /* Only create the window the first time around */
+ if (!si->passwd_dialog)
+ {
+ si->passwd_dialog =
+ XCreateWindow (si->dpy,
+ RootWindowOfScreen(screen),
+ pw->x, pw->y, pw->width, pw->height, pw->border_width,
+ DefaultDepthOfScreen (screen), InputOutput,
+ DefaultVisualOfScreen(screen),
+ attrmask, &attrs);
+ XSetWindowBackground (si->dpy, si->passwd_dialog, pw->background);
+ XSetWindowBorder (si->dpy, si->passwd_dialog, pw->border);
+
+ /* We use the default visual, not ssi->visual, so that the logo pixmap's
+ visual matches that of the si->passwd_dialog window. */
+ pw->logo_pixmap = xscreensaver_logo (ssi->screen,
+ /* ssi->current_visual, */
+ DefaultVisualOfScreen(screen),
+ si->passwd_dialog, cmap,
+ pw->background,
+ &pw->logo_pixels, &pw->logo_npixels,
+ &pw->logo_clipmask, True);
+ }
+ else /* On successive prompts, just resize the window */
+ {
+ XWindowChanges wc;
+ unsigned int mask = CWX | CWY | CWWidth | CWHeight;
+
+ wc.x = pw->x;
+ wc.y = pw->y;
+ wc.width = pw->width;
+ wc.height = pw->height;
+
+ XConfigureWindow (si->dpy, si->passwd_dialog, mask, &wc);
+ }
+
+ restore_background(si);
+
+ XMapRaised (si->dpy, si->passwd_dialog);
+ XSync (si->dpy, False);
+
+ move_mouse_grab (si, si->passwd_dialog,
+ pw->passwd_cursor,
+ pw->prompt_screen->number);
+ undo_vp_motion (si);
+
+ si->pw_data = pw;
+
+ if (cmap)
+ XInstallColormap (si->dpy, cmap);
+ draw_passwd_window (si);
+
+ return 0;
+}
+
+
+static void
+draw_passwd_window (saver_info *si)
+{
+ passwd_dialog_data *pw = si->pw_data;
+ XGCValues gcv;
+ GC gc1, gc2;
+ int spacing, height;
+ int x1, x2, x3, y1, y2;
+ int sw;
+ int tb_height;
+
+ /* Force redraw */
+ pw->passwd_changed_p = True;
+ pw->button_state_changed_p = True;
+
+ /* This height is the height of all the elements, not to be confused with
+ * the overall window height which is pw->height. It is used to compute
+ * the amount of spacing (padding) between elements. */
+ height = (pw->heading_font->ascent + pw->heading_font->descent +
+ pw->info_label->overall_height +
+ MAX (((pw->label_font->ascent + pw->label_font->descent) +
+ (pw->prompt_label ? pw->prompt_label->overall_height : 0)),
+ ((pw->passwd_font->ascent + pw->passwd_font->descent) +
+ (pw->shadow_width * 2)) * (pw->prompt_label ? 2 : 1)) +
+ pw->date_font->ascent + pw->date_font->descent);
+
+ if ((strlen(pw->uname_label)) && pw->show_uname_p)
+ height += (pw->uname_font->ascent + pw->uname_font->descent);
+
+ height += ((pw->button_font->ascent + pw->button_font->descent) * 2 +
+ 2 * pw->shadow_width);
+
+ spacing = ((pw->height - 2 * pw->shadow_width
+ - pw->internal_border - height)
+ / 10);
+
+ if (spacing < 0) spacing = 0;
+
+ gcv.foreground = pw->foreground;
+ gc1 = XCreateGC (si->dpy, si->passwd_dialog, GCForeground, &gcv);
+ gc2 = XCreateGC (si->dpy, si->passwd_dialog, GCForeground, &gcv);
+ x1 = pw->logo_width + pw->thermo_width + (pw->shadow_width * 3);
+ x3 = pw->width - (pw->shadow_width * 2);
+ y1 = (pw->shadow_width * 2) + spacing + spacing;
+
+ /* top heading
+ */
+ XSetFont (si->dpy, gc1, pw->heading_font->fid);
+ sw = string_width (pw->heading_font, pw->heading_label);
+ x2 = (x1 + ((x3 - x1 - sw) / 2));
+ y1 += spacing + pw->heading_font->ascent + pw->heading_font->descent;
+ XDrawString (si->dpy, si->passwd_dialog, gc1, x2, y1,
+ pw->heading_label, strlen(pw->heading_label));
+
+ /* uname below top heading
+ */
+ if ((strlen(pw->uname_label)) && pw->show_uname_p)
+ {
+ XSetFont (si->dpy, gc1, pw->uname_font->fid);
+ y1 += spacing + pw->uname_font->ascent + pw->uname_font->descent;
+ sw = string_width (pw->uname_font, pw->uname_label);
+ x2 = (x1 + ((x3 - x1 - sw) / 2));
+ XDrawString (si->dpy, si->passwd_dialog, gc1, x2, y1,
+ pw->uname_label, strlen(pw->uname_label));
+ }
+
+ /* the info_label (below uname)
+ */
+ x2 = (x1 + ((x3 - x1 - pw->info_label->overall_width) / 2));
+ y1 += spacing + pw->info_label->font_height / 2;
+ mlstring_draw(si->dpy, si->passwd_dialog, gc1, pw->info_label,
+ x2, y1);
+ y1 += pw->info_label->overall_height;
+
+
+ tb_height = (pw->passwd_font->ascent + pw->passwd_font->descent +
+ (pw->shadow_width * 4));
+
+ /* the "User:" prompt
+ */
+ y2 = y1;
+ XSetForeground (si->dpy, gc1, pw->foreground);
+ XSetFont (si->dpy, gc1, pw->label_font->fid);
+ y1 += (spacing + tb_height + pw->shadow_width);
+ x2 = (x1 + pw->internal_border +
+ MAX(string_width (pw->label_font, pw->user_label),
+ pw->prompt_label ? pw->prompt_label->overall_width : 0));
+ XDrawString (si->dpy, si->passwd_dialog, gc1,
+ x2 - string_width (pw->label_font, pw->user_label),
+ y1 - pw->passwd_font->descent,
+ pw->user_label, strlen(pw->user_label));
+
+ /* the prompt_label prompt
+ */
+ if (pw->prompt_label)
+ {
+ y1 += tb_height - pw->label_font->ascent + pw->shadow_width;
+ mlstring_draw(si->dpy, si->passwd_dialog, gc1, pw->prompt_label,
+ x2 - pw->prompt_label->overall_width, y1);
+ }
+
+ /* the "user name" text field
+ */
+ y1 = y2;
+ XSetForeground (si->dpy, gc1, pw->passwd_foreground);
+ XSetForeground (si->dpy, gc2, pw->passwd_background);
+ XSetFont (si->dpy, gc1, pw->passwd_font->fid);
+ y1 += (spacing + tb_height);
+ x2 += (pw->shadow_width * 4);
+
+ pw->passwd_field_width = x3 - x2 - pw->internal_border;
+ pw->passwd_field_height = (pw->passwd_font->ascent +
+ pw->passwd_font->descent +
+ pw->shadow_width);
+
+ XFillRectangle (si->dpy, si->passwd_dialog, gc2,
+ x2 - pw->shadow_width,
+ y1 - (pw->passwd_font->ascent + pw->passwd_font->descent),
+ pw->passwd_field_width, pw->passwd_field_height);
+ XDrawString (si->dpy, si->passwd_dialog, gc1,
+ x2,
+ y1 - pw->passwd_font->descent,
+ si->user, strlen(si->user));
+
+ /* the password/prompt text field
+ */
+ if (pw->prompt_label)
+ {
+ y1 += (spacing + pw->prompt_label->overall_height + pw->shadow_width*2);
+
+ pw->passwd_field_x = x2 - pw->shadow_width;
+ pw->passwd_field_y = y1 - (pw->passwd_font->ascent +
+ pw->passwd_font->descent);
+ }
+
+ /* The shadow around the text fields
+ */
+ y1 = y2;
+ y1 += (spacing + (pw->shadow_width * 3));
+ x1 = x2 - (pw->shadow_width * 2);
+ x2 = pw->passwd_field_width + (pw->shadow_width * 2);
+ y2 = pw->passwd_field_height + (pw->shadow_width * 2);
+
+ draw_shaded_rectangle (si->dpy, si->passwd_dialog,
+ x1, y1, x2, y2,
+ pw->shadow_width,
+ pw->shadow_bottom, pw->shadow_top);
+
+ if (pw->prompt_label)
+ {
+ y1 += (spacing + pw->prompt_label->overall_height + pw->shadow_width*2);
+ draw_shaded_rectangle (si->dpy, si->passwd_dialog,
+ x1, y1, x2, y2,
+ pw->shadow_width,
+ pw->shadow_bottom, pw->shadow_top);
+ }
+
+
+ /* The date, below the text fields
+ */
+ {
+ char buf[100];
+ time_t now = time ((time_t *) 0);
+ struct tm *tm = localtime (&now);
+ memset (buf, 0, sizeof(buf));
+ strftime (buf, sizeof(buf)-1, pw->date_label, tm);
+
+ XSetFont (si->dpy, gc1, pw->date_font->fid);
+ y1 += pw->shadow_width;
+ y1 += (spacing + tb_height);
+ y1 += spacing/2;
+ sw = string_width (pw->date_font, buf);
+ x2 = x1 + x2 - sw;
+ XDrawString (si->dpy, si->passwd_dialog, gc1, x2, y1, buf, strlen(buf));
+ }
+
+ /* Set up the GCs for the "New Login" and "Unlock" buttons.
+ */
+ XSetForeground(si->dpy, gc1, pw->button_foreground);
+ XSetForeground(si->dpy, gc2, pw->button_background);
+ XSetFont(si->dpy, gc1, pw->button_font->fid);
+
+ /* The "Unlock" button */
+ x2 = pw->width - pw->internal_border - (pw->shadow_width * 2);
+
+ /* right aligned button */
+ x1 = x2 - pw->unlock_button_width;
+
+ /* Add half the difference between y1 and the internal edge.
+ * It actually looks better if the internal border is ignored. */
+ y1 += ((pw->height - MAX (pw->unlock_button_height, pw->login_button_height)
+ - spacing - y1)
+ / 2);
+
+ pw->unlock_button_x = x1;
+ pw->unlock_button_y = y1;
+
+ /* The "New Login" button
+ */
+ if (pw->login_button_p)
+ {
+ /* Using the same GC as for the Unlock button */
+
+ sw = string_width (pw->button_font, pw->login_label);
+
+ /* left aligned button */
+ x1 = (pw->logo_width + pw->thermo_width + (pw->shadow_width * 3) +
+ pw->internal_border);
+
+ pw->login_button_x = x1;
+ pw->login_button_y = y1;
+ }
+
+ /* The logo
+ */
+ x1 = pw->shadow_width * 6;
+ y1 = pw->shadow_width * 6;
+ x2 = pw->logo_width - (pw->shadow_width * 12);
+ y2 = pw->logo_height - (pw->shadow_width * 12);
+
+ if (pw->logo_pixmap)
+ {
+ Window root;
+ int x, y;
+ unsigned int w, h, bw, d;
+ XGetGeometry (si->dpy, pw->logo_pixmap, &root, &x, &y, &w, &h, &bw, &d);
+ XSetForeground (si->dpy, gc1, pw->foreground);
+ XSetBackground (si->dpy, gc1, pw->background);
+ XSetClipMask (si->dpy, gc1, pw->logo_clipmask);
+ XSetClipOrigin (si->dpy, gc1,
+ x1 + ((x2 - (int)w) / 2),
+ y1 + ((y2 - (int)h) / 2));
+ if (d == 1)
+ XCopyPlane (si->dpy, pw->logo_pixmap, si->passwd_dialog, gc1,
+ 0, 0, w, h,
+ x1 + ((x2 - (int)w) / 2),
+ y1 + ((y2 - (int)h) / 2),
+ 1);
+ else
+ XCopyArea (si->dpy, pw->logo_pixmap, si->passwd_dialog, gc1,
+ 0, 0, w, h,
+ x1 + ((x2 - (int)w) / 2),
+ y1 + ((y2 - (int)h) / 2));
+ }
+
+ /* The thermometer
+ */
+ XSetForeground (si->dpy, gc1, pw->thermo_foreground);
+ XSetForeground (si->dpy, gc2, pw->thermo_background);
+
+ pw->thermo_field_x = pw->logo_width + pw->shadow_width;
+ pw->thermo_field_y = pw->shadow_width * 5;
+ pw->thermo_field_height = pw->height - (pw->shadow_width * 10);
+
+#if 0
+ /* Solid border inside the logo box. */
+ XSetForeground (si->dpy, gc1, pw->foreground);
+ XDrawRectangle (si->dpy, si->passwd_dialog, gc1, x1, y1, x2-1, y2-1);
+#endif
+
+ /* The shadow around the logo
+ */
+ draw_shaded_rectangle (si->dpy, si->passwd_dialog,
+ pw->shadow_width * 4,
+ pw->shadow_width * 4,
+ pw->logo_width - (pw->shadow_width * 8),
+ pw->logo_height - (pw->shadow_width * 8),
+ pw->shadow_width,
+ pw->shadow_bottom, pw->shadow_top);
+
+ /* The shadow around the thermometer
+ */
+ draw_shaded_rectangle (si->dpy, si->passwd_dialog,
+ pw->logo_width,
+ pw->shadow_width * 4,
+ pw->thermo_width + (pw->shadow_width * 2),
+ pw->height - (pw->shadow_width * 8),
+ pw->shadow_width,
+ pw->shadow_bottom, pw->shadow_top);
+
+#if 1
+ /* Solid border inside the thermometer. */
+ XSetForeground (si->dpy, gc1, pw->foreground);
+ XDrawRectangle (si->dpy, si->passwd_dialog, gc1,
+ pw->thermo_field_x, pw->thermo_field_y,
+ pw->thermo_width - 1, pw->thermo_field_height - 1);
+#endif
+
+ /* The shadow around the whole window
+ */
+ draw_shaded_rectangle (si->dpy, si->passwd_dialog,
+ 0, 0, pw->width, pw->height, pw->shadow_width,
+ pw->shadow_top, pw->shadow_bottom);
+
+ XFreeGC (si->dpy, gc1);
+ XFreeGC (si->dpy, gc2);
+
+ update_passwd_window (si, pw->passwd_string, pw->ratio);
+}
+
+static void
+draw_button(Display *dpy,
+ Drawable dialog,
+ XFontStruct *font,
+ unsigned long foreground, unsigned long background,
+ char *label,
+ int x, int y,
+ int width, int height,
+ int shadow_width,
+ Pixel shadow_light, Pixel shadow_dark,
+ Bool button_down)
+{
+ XGCValues gcv;
+ GC gc1, gc2;
+ int sw;
+ int label_x, label_y;
+
+ gcv.foreground = foreground;
+ gcv.font = font->fid;
+ gc1 = XCreateGC(dpy, dialog, GCForeground|GCFont, &gcv);
+ gcv.foreground = background;
+ gc2 = XCreateGC(dpy, dialog, GCForeground, &gcv);
+
+ XFillRectangle(dpy, dialog, gc2,
+ x, y, width, height);
+
+ sw = string_width(font, label);
+
+ label_x = x + ((width - sw) / 2);
+ label_y = (y + (height - (font->ascent + font->descent)) / 2 + font->ascent);
+
+ if (button_down)
+ {
+ label_x += 2;
+ label_y += 2;
+ }
+
+ XDrawString(dpy, dialog, gc1, label_x, label_y, label, strlen(label));
+
+ XFreeGC(dpy, gc1);
+ XFreeGC(dpy, gc2);
+
+ draw_shaded_rectangle(dpy, dialog, x, y, width, height,
+ shadow_width, shadow_light, shadow_dark);
+}
+
+static void
+update_passwd_window (saver_info *si, const char *printed_passwd, float ratio)
+{
+ passwd_dialog_data *pw = si->pw_data;
+ XGCValues gcv;
+ GC gc1, gc2;
+ int x, y;
+ XRectangle rects[1];
+
+ pw->ratio = ratio;
+ gcv.foreground = pw->passwd_foreground;
+ gcv.font = pw->passwd_font->fid;
+ gc1 = XCreateGC (si->dpy, si->passwd_dialog, GCForeground|GCFont, &gcv);
+ gcv.foreground = pw->passwd_background;
+ gc2 = XCreateGC (si->dpy, si->passwd_dialog, GCForeground, &gcv);
+
+ if (printed_passwd)
+ {
+ char *s = strdup (printed_passwd);
+ if (pw->passwd_string) free (pw->passwd_string);
+ pw->passwd_string = s;
+ }
+
+ if (pw->prompt_label)
+ {
+
+ /* the "password" text field
+ */
+ rects[0].x = pw->passwd_field_x;
+ rects[0].y = pw->passwd_field_y;
+ rects[0].width = pw->passwd_field_width;
+ rects[0].height = pw->passwd_field_height;
+
+ /* The user entry (password) field is double buffered.
+ * This avoids flickering, particularly in synchronous mode. */
+
+ if (pw->passwd_changed_p)
+ {
+ pw->passwd_changed_p = False;
+
+ if (pw->user_entry_pixmap)
+ {
+ XFreePixmap(si->dpy, pw->user_entry_pixmap);
+ pw->user_entry_pixmap = 0;
+ }
+
+ pw->user_entry_pixmap =
+ XCreatePixmap (si->dpy, si->passwd_dialog,
+ rects[0].width, rects[0].height,
+ DefaultDepthOfScreen (pw->prompt_screen->screen));
+
+ XFillRectangle (si->dpy, pw->user_entry_pixmap, gc2,
+ 0, 0, rects[0].width, rects[0].height);
+
+ XDrawString (si->dpy, pw->user_entry_pixmap, gc1,
+ pw->shadow_width,
+ pw->passwd_font->ascent,
+ pw->passwd_string, strlen(pw->passwd_string));
+
+ /* Ensure the new pixmap gets copied to the window */
+ pw->i_beam = 0;
+
+ }
+
+ /* The I-beam
+ */
+ if (pw->i_beam == 0)
+ {
+ /* Make the I-beam disappear */
+ XCopyArea(si->dpy, pw->user_entry_pixmap, si->passwd_dialog, gc2,
+ 0, 0, rects[0].width, rects[0].height,
+ rects[0].x, rects[0].y);
+ }
+ else if (pw->i_beam == 1)
+ {
+ /* Make the I-beam appear */
+ x = (rects[0].x + pw->shadow_width +
+ string_width (pw->passwd_font, pw->passwd_string));
+ y = rects[0].y + pw->shadow_width;
+
+ if (x > rects[0].x + rects[0].width - 1)
+ x = rects[0].x + rects[0].width - 1;
+ XDrawLine (si->dpy, si->passwd_dialog, gc1,
+ x, y,
+ x, y + pw->passwd_font->ascent +
+ pw->passwd_font->descent-1);
+ }
+
+ pw->i_beam = (pw->i_beam + 1) % 4;
+
+ }
+
+ /* the thermometer
+ */
+ y = (pw->thermo_field_height - 2) * (1.0 - pw->ratio);
+ if (y > 0)
+ {
+ XFillRectangle (si->dpy, si->passwd_dialog, gc2,
+ pw->thermo_field_x + 1,
+ pw->thermo_field_y + 1,
+ pw->thermo_width-2,
+ y);
+ XSetForeground (si->dpy, gc1, pw->thermo_foreground);
+ XFillRectangle (si->dpy, si->passwd_dialog, gc1,
+ pw->thermo_field_x + 1,
+ pw->thermo_field_y + 1 + y,
+ pw->thermo_width-2,
+ MAX (0, pw->thermo_field_height - y - 2));
+ }
+
+ if (pw->button_state_changed_p)
+ {
+ pw->button_state_changed_p = False;
+
+ /* The "Unlock" button
+ */
+ draw_button(si->dpy, si->passwd_dialog, pw->button_font,
+ pw->button_foreground, pw->button_background,
+ pw->unlock_label,
+ pw->unlock_button_x, pw->unlock_button_y,
+ pw->unlock_button_width, pw->unlock_button_height,
+ pw->shadow_width,
+ (pw->unlock_button_down_p ? pw->shadow_bottom :
+ pw->shadow_top),
+ (pw->unlock_button_down_p ? pw->shadow_top :
+ pw->shadow_bottom),
+ pw->unlock_button_down_p);
+
+ /* The "New Login" button
+ */
+ if (pw->login_button_p)
+ {
+ draw_button(si->dpy, si->passwd_dialog, pw->button_font,
+ (pw->login_button_enabled_p
+ ? pw->passwd_foreground
+ : pw->shadow_bottom),
+ pw->button_background,
+ pw->login_label,
+ pw->login_button_x, pw->login_button_y,
+ pw->login_button_width, pw->login_button_height,
+ pw->shadow_width,
+ (pw->login_button_down_p
+ ? pw->shadow_bottom
+ : pw->shadow_top),
+ (pw->login_button_down_p
+ ? pw->shadow_top
+ : pw->shadow_bottom),
+ pw->login_button_down_p);
+ }
+ }
+
+ XFreeGC (si->dpy, gc1);
+ XFreeGC (si->dpy, gc2);
+ XSync (si->dpy, False);
+}
+
+
+void
+restore_background (saver_info *si)
+{
+ passwd_dialog_data *pw = si->pw_data;
+ saver_screen_info *ssi = pw->prompt_screen;
+ XGCValues gcv;
+ GC gc;
+
+ gcv.function = GXcopy;
+
+ gc = XCreateGC (si->dpy, ssi->screensaver_window, GCFunction, &gcv);
+
+ XCopyArea (si->dpy, pw->save_under,
+ ssi->screensaver_window, gc,
+ 0, 0,
+ ssi->width, ssi->height,
+ 0, 0);
+
+ XFreeGC (si->dpy, gc);
+}
+
+
+/* Frees anything created by make_passwd_window */
+static void
+cleanup_passwd_window (saver_info *si)
+{
+ passwd_dialog_data *pw;
+
+ if (!(pw = si->pw_data))
+ return;
+
+ if (pw->info_label)
+ {
+ mlstring_free(pw->info_label);
+ pw->info_label = 0;
+ }
+
+ if (pw->prompt_label)
+ {
+ mlstring_free(pw->prompt_label);
+ pw->prompt_label = 0;
+ }
+
+ memset (pw->typed_passwd, 0, sizeof(pw->typed_passwd));
+ memset (pw->typed_passwd_char_size, 0, sizeof(pw->typed_passwd_char_size));
+ memset (pw->passwd_string, 0, strlen(pw->passwd_string));
+
+ if (pw->timer)
+ {
+ XtRemoveTimeOut (pw->timer);
+ pw->timer = 0;
+ }
+
+ if (pw->user_entry_pixmap)
+ {
+ XFreePixmap(si->dpy, pw->user_entry_pixmap);
+ pw->user_entry_pixmap = 0;
+ }
+}
+
+
+static void
+destroy_passwd_window (saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+ passwd_dialog_data *pw = si->pw_data;
+ saver_screen_info *ssi = pw->prompt_screen;
+ Colormap cmap = DefaultColormapOfScreen (ssi->screen);
+ Pixel black = BlackPixelOfScreen (ssi->screen);
+ Pixel white = WhitePixelOfScreen (ssi->screen);
+ XEvent event;
+
+ cleanup_passwd_window (si);
+
+ if (si->cached_passwd)
+ {
+ char *wipe = si->cached_passwd;
+
+ while (*wipe)
+ *wipe++ = '\0';
+
+ free(si->cached_passwd);
+ si->cached_passwd = NULL;
+ }
+
+ move_mouse_grab (si, RootWindowOfScreen (ssi->screen),
+ ssi->cursor, ssi->number);
+
+ if (pw->passwd_cursor)
+ XFreeCursor (si->dpy, pw->passwd_cursor);
+
+ if (p->verbose_p)
+ fprintf (stderr, "%s: %d: moving mouse back to %d,%d.\n",
+ blurb(), ssi->number,
+ pw->previous_mouse_x, pw->previous_mouse_y);
+
+ XWarpPointer (si->dpy, None, RootWindowOfScreen (ssi->screen),
+ 0, 0, 0, 0,
+ pw->previous_mouse_x, pw->previous_mouse_y);
+ XSync (si->dpy, False);
+
+ while (XCheckMaskEvent (si->dpy, PointerMotionMask, &event))
+ if (p->verbose_p)
+ fprintf (stderr, "%s: discarding MotionNotify event.\n", blurb());
+
+#ifdef HAVE_XINPUT
+ if (si->using_xinput_extension && si->xinput_DeviceMotionNotify)
+ while (XCheckTypedEvent (si->dpy, si->xinput_DeviceMotionNotify, &event))
+ if (p->verbose_p)
+ fprintf (stderr, "%s: discarding DeviceMotionNotify event.\n",
+ blurb());
+#endif
+
+ if (si->passwd_dialog)
+ {
+ if (si->prefs.verbose_p)
+ fprintf (stderr, "%s: %d: destroying password dialog.\n",
+ blurb(), pw->prompt_screen->number);
+
+ XDestroyWindow (si->dpy, si->passwd_dialog);
+ si->passwd_dialog = 0;
+ }
+
+ if (pw->save_under)
+ {
+ restore_background(si);
+ XFreePixmap (si->dpy, pw->save_under);
+ pw->save_under = 0;
+ }
+
+ if (pw->heading_label) free (pw->heading_label);
+ if (pw->body_label) free (pw->body_label);
+ if (pw->user_label) free (pw->user_label);
+ if (pw->date_label) free (pw->date_label);
+ if (pw->login_label) free (pw->login_label);
+ if (pw->unlock_label) free (pw->unlock_label);
+ if (pw->passwd_string) free (pw->passwd_string);
+ if (pw->uname_label) free (pw->uname_label);
+
+ if (pw->heading_font) XFreeFont (si->dpy, pw->heading_font);
+ if (pw->body_font) XFreeFont (si->dpy, pw->body_font);
+ if (pw->label_font) XFreeFont (si->dpy, pw->label_font);
+ if (pw->passwd_font) XFreeFont (si->dpy, pw->passwd_font);
+ if (pw->date_font) XFreeFont (si->dpy, pw->date_font);
+ if (pw->button_font) XFreeFont (si->dpy, pw->button_font);
+ if (pw->uname_font) XFreeFont (si->dpy, pw->uname_font);
+
+ if (pw->foreground != black && pw->foreground != white)
+ XFreeColors (si->dpy, cmap, &pw->foreground, 1, 0L);
+ if (pw->background != black && pw->background != white)
+ XFreeColors (si->dpy, cmap, &pw->background, 1, 0L);
+ if (!(pw->button_foreground == black || pw->button_foreground == white))
+ XFreeColors (si->dpy, cmap, &pw->button_foreground, 1, 0L);
+ if (!(pw->button_background == black || pw->button_background == white))
+ XFreeColors (si->dpy, cmap, &pw->button_background, 1, 0L);
+ if (pw->passwd_foreground != black && pw->passwd_foreground != white)
+ XFreeColors (si->dpy, cmap, &pw->passwd_foreground, 1, 0L);
+ if (pw->passwd_background != black && pw->passwd_background != white)
+ XFreeColors (si->dpy, cmap, &pw->passwd_background, 1, 0L);
+ if (pw->thermo_foreground != black && pw->thermo_foreground != white)
+ XFreeColors (si->dpy, cmap, &pw->thermo_foreground, 1, 0L);
+ if (pw->thermo_background != black && pw->thermo_background != white)
+ XFreeColors (si->dpy, cmap, &pw->thermo_background, 1, 0L);
+ if (pw->shadow_top != black && pw->shadow_top != white)
+ XFreeColors (si->dpy, cmap, &pw->shadow_top, 1, 0L);
+ if (pw->shadow_bottom != black && pw->shadow_bottom != white)
+ XFreeColors (si->dpy, cmap, &pw->shadow_bottom, 1, 0L);
+
+ if (pw->logo_pixmap)
+ XFreePixmap (si->dpy, pw->logo_pixmap);
+ if (pw-> logo_clipmask)
+ XFreePixmap (si->dpy, pw->logo_clipmask);
+ if (pw->logo_pixels)
+ {
+ if (pw->logo_npixels)
+ XFreeColors (si->dpy, cmap, pw->logo_pixels, pw->logo_npixels, 0L);
+ free (pw->logo_pixels);
+ pw->logo_pixels = 0;
+ pw->logo_npixels = 0;
+ }
+
+ if (pw->save_under)
+ XFreePixmap (si->dpy, pw->save_under);
+
+ if (cmap)
+ XInstallColormap (si->dpy, cmap);
+
+ memset (pw, 0, sizeof(*pw));
+ free (pw);
+ si->pw_data = 0;
+}
+
+
+#if defined(HAVE_XF86MISCSETGRABKEYSSTATE) || defined(HAVE_XF86VMODE)
+
+static Bool error_handler_hit_p = False;
+
+static int
+ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
+{
+ error_handler_hit_p = True;
+ return 0;
+}
+
+#endif /* HAVE_XF86MISCSETGRABKEYSSTATE || HAVE_XF86VMODE */
+
+
+#ifdef HAVE_XHPDISABLERESET
+/* This function enables and disables the C-Sh-Reset hot-key, which
+ normally resets the X server (logging out the logged-in user.)
+ We don't want random people to be able to do that while the
+ screen is locked.
+ */
+static void
+hp_lock_reset (saver_info *si, Bool lock_p)
+{
+ static Bool hp_locked_p = False;
+
+ /* Calls to XHPDisableReset and XHPEnableReset must be balanced,
+ or BadAccess errors occur. (It's ok for this to be global,
+ since it affects the whole machine, not just the current screen.)
+ */
+ if (hp_locked_p == lock_p)
+ return;
+
+ if (lock_p)
+ XHPDisableReset (si->dpy);
+ else
+ XHPEnableReset (si->dpy);
+ hp_locked_p = lock_p;
+}
+#endif /* HAVE_XHPDISABLERESET */
+
+
+#ifdef HAVE_XF86MISCSETGRABKEYSSTATE
+
+/* This function enables and disables the Ctrl-Alt-KP_star and
+ Ctrl-Alt-KP_slash hot-keys, which (in XFree86 4.2) break any
+ grabs and/or kill the grabbing client. That would effectively
+ unlock the screen, so we don't like that.
+
+ The Ctrl-Alt-KP_star and Ctrl-Alt-KP_slash hot-keys only exist
+ if AllowDeactivateGrabs and/or AllowClosedownGrabs are turned on
+ in XF86Config. I believe they are disabled by default.
+
+ This does not affect any other keys (specifically Ctrl-Alt-BS or
+ Ctrl-Alt-F1) but I wish it did. Maybe it will someday.
+ */
+static void
+xfree_lock_grab_smasher (saver_info *si, Bool lock_p)
+{
+ saver_preferences *p = &si->prefs;
+ int status;
+ int event, error;
+ XErrorHandler old_handler;
+
+ if (!XF86MiscQueryExtension(si->dpy, &event, &error))
+ return;
+
+ XSync (si->dpy, False);
+ error_handler_hit_p = False;
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+ XSync (si->dpy, False);
+ status = XF86MiscSetGrabKeysState (si->dpy, !lock_p);
+ XSync (si->dpy, False);
+ if (error_handler_hit_p) status = 666;
+
+ if (!lock_p && status == MiscExtGrabStateAlready)
+ status = MiscExtGrabStateSuccess; /* shut up, consider this success */
+
+ if (p->verbose_p && status != MiscExtGrabStateSuccess)
+ fprintf (stderr, "%s: error: XF86MiscSetGrabKeysState(%d) returned %s\n",
+ blurb(), !lock_p,
+ (status == MiscExtGrabStateSuccess ? "MiscExtGrabStateSuccess" :
+ status == MiscExtGrabStateLocked ? "MiscExtGrabStateLocked" :
+ status == MiscExtGrabStateAlready ? "MiscExtGrabStateAlready" :
+ status == 666 ? "an X error" :
+ "unknown value"));
+
+ XSync (si->dpy, False);
+ XSetErrorHandler (old_handler);
+ XSync (si->dpy, False);
+}
+#endif /* HAVE_XF86MISCSETGRABKEYSSTATE */
+
+
+
+/* This function enables and disables the C-Alt-Plus and C-Alt-Minus
+ hot-keys, which normally change the resolution of the X server.
+ We don't want people to be able to switch the server resolution
+ while the screen is locked, because if they switch to a higher
+ resolution, it could cause part of the underlying desktop to become
+ exposed.
+ */
+#ifdef HAVE_XF86VMODE
+
+static void
+xfree_lock_mode_switch (saver_info *si, Bool lock_p)
+{
+ static Bool any_mode_locked_p = False;
+ saver_preferences *p = &si->prefs;
+ int screen;
+ int real_nscreens = ScreenCount (si->dpy);
+ int event, error;
+ Bool status;
+ XErrorHandler old_handler;
+
+ if (any_mode_locked_p == lock_p)
+ return;
+ if (!XF86VidModeQueryExtension (si->dpy, &event, &error))
+ return;
+
+ for (screen = 0; screen < real_nscreens; screen++)
+ {
+ XSync (si->dpy, False);
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+ error_handler_hit_p = False;
+ status = XF86VidModeLockModeSwitch (si->dpy, screen, lock_p);
+ XSync (si->dpy, False);
+ XSetErrorHandler (old_handler);
+ if (error_handler_hit_p) status = False;
+
+ if (status)
+ any_mode_locked_p = lock_p;
+
+ if (!status && (p->verbose_p || !lock_p))
+ /* Only print this when verbose, or when we locked but can't unlock.
+ I tried printing this message whenever it comes up, but
+ mode-locking always fails if DontZoom is set in XF86Config. */
+ fprintf (stderr, "%s: %d: unable to %s mode switching!\n",
+ blurb(), screen, (lock_p ? "lock" : "unlock"));
+ else if (p->verbose_p)
+ fprintf (stderr, "%s: %d: %s mode switching.\n",
+ blurb(), screen, (lock_p ? "locked" : "unlocked"));
+ }
+}
+#endif /* HAVE_XF86VMODE */
+
+
+/* If the viewport has been scrolled since the screen was blanked,
+ then scroll it back to where it belongs. This function only exists
+ to patch over a very brief race condition.
+ */
+static void
+undo_vp_motion (saver_info *si)
+{
+#ifdef HAVE_XF86VMODE
+ saver_preferences *p = &si->prefs;
+ int screen;
+ int real_nscreens = ScreenCount (si->dpy);
+ int event, error;
+
+ if (!XF86VidModeQueryExtension (si->dpy, &event, &error))
+ return;
+
+ for (screen = 0; screen < real_nscreens; screen++)
+ {
+ saver_screen_info *ssi = &si->screens[screen];
+ int x, y;
+ Bool status;
+
+ if (ssi->blank_vp_x == -1 && ssi->blank_vp_y == -1)
+ break;
+ if (!XF86VidModeGetViewPort (si->dpy, screen, &x, &y))
+ return;
+ if (ssi->blank_vp_x == x && ssi->blank_vp_y == y)
+ return;
+
+ /* We're going to move the viewport. The mouse has just been grabbed on
+ (and constrained to, thus warped to) the password window, so it is no
+ longer near the edge of the screen. However, wait a bit anyway, just
+ to make sure the server drains its last motion event, so that the
+ screen doesn't continue to scroll after we've reset the viewport.
+ */
+ XSync (si->dpy, False);
+ usleep (250000); /* 1/4 second */
+ XSync (si->dpy, False);
+
+ status = XF86VidModeSetViewPort (si->dpy, screen,
+ ssi->blank_vp_x, ssi->blank_vp_y);
+
+ if (!status)
+ fprintf (stderr,
+ "%s: %d: unable to move vp from (%d,%d) back to (%d,%d)!\n",
+ blurb(), screen, x, y, ssi->blank_vp_x, ssi->blank_vp_y);
+ else if (p->verbose_p)
+ fprintf (stderr,
+ "%s: %d: vp moved to (%d,%d); moved it back to (%d,%d).\n",
+ blurb(), screen, x, y, ssi->blank_vp_x, ssi->blank_vp_y);
+ }
+#endif /* HAVE_XF86VMODE */
+}
+
+
+
+/* Interactions
+ */
+
+static void
+passwd_animate_timer (XtPointer closure, XtIntervalId *id)
+{
+ saver_info *si = (saver_info *) closure;
+ int tick = 166;
+ passwd_dialog_data *pw = si->pw_data;
+
+ if (!pw) return;
+
+ pw->ratio -= (1.0 / ((double) si->prefs.passwd_timeout / (double) tick));
+ if (pw->ratio < 0)
+ {
+ pw->ratio = 0;
+ if (si->unlock_state == ul_read)
+ si->unlock_state = ul_time;
+ }
+
+ update_passwd_window (si, 0, pw->ratio);
+
+ if (si->unlock_state == ul_read)
+ pw->timer = XtAppAddTimeOut (si->app, tick, passwd_animate_timer,
+ (XtPointer) si);
+ else
+ pw->timer = 0;
+
+ idle_timer ((XtPointer) si, 0);
+}
+
+
+static XComposeStatus *compose_status;
+
+static void
+handle_login_button (saver_info *si, XEvent *event)
+{
+ saver_preferences *p = &si->prefs;
+ Bool mouse_in_box = False;
+ Bool hit_p = False;
+ passwd_dialog_data *pw = si->pw_data;
+ saver_screen_info *ssi = pw->prompt_screen;
+
+ if (! pw->login_button_enabled_p)
+ return;
+
+ mouse_in_box =
+ (event->xbutton.x >= pw->login_button_x &&
+ event->xbutton.x <= pw->login_button_x + pw->login_button_width &&
+ event->xbutton.y >= pw->login_button_y &&
+ event->xbutton.y <= pw->login_button_y + pw->login_button_height);
+
+ if (ButtonRelease == event->xany.type &&
+ pw->login_button_down_p &&
+ mouse_in_box)
+ {
+ /* Only allow them to press the button once: don't want to
+ accidentally launch a dozen gdm choosers if the machine
+ is being slow.
+ */
+ hit_p = True;
+ pw->login_button_enabled_p = False;
+ }
+
+ pw->login_button_down_p = (mouse_in_box &&
+ ButtonRelease != event->xany.type);
+
+ update_passwd_window (si, 0, pw->ratio);
+
+ if (hit_p)
+ fork_and_exec (ssi, p->new_login_command);
+}
+
+
+static void
+handle_unlock_button (saver_info *si, XEvent *event)
+{
+ Bool mouse_in_box = False;
+ passwd_dialog_data *pw = si->pw_data;
+
+ mouse_in_box =
+ (event->xbutton.x >= pw->unlock_button_x &&
+ event->xbutton.x <= pw->unlock_button_x + pw->unlock_button_width &&
+ event->xbutton.y >= pw->unlock_button_y &&
+ event->xbutton.y <= pw->unlock_button_y + pw->unlock_button_height);
+
+ if (ButtonRelease == event->xany.type &&
+ pw->unlock_button_down_p &&
+ mouse_in_box)
+ finished_typing_passwd (si, pw);
+
+ pw->unlock_button_down_p = (mouse_in_box &&
+ ButtonRelease != event->xany.type);
+}
+
+
+static void
+finished_typing_passwd (saver_info *si, passwd_dialog_data *pw)
+{
+ if (si->unlock_state == ul_read)
+ {
+ update_passwd_window (si, "Checking...", pw->ratio);
+ XSync (si->dpy, False);
+
+ si->unlock_state = ul_finished;
+ update_passwd_window (si, "", pw->ratio);
+ }
+}
+
+static void
+handle_passwd_key (saver_info *si, XKeyEvent *event)
+{
+ passwd_dialog_data *pw = si->pw_data;
+ unsigned char decoded [MAX_BYTES_PER_CHAR * 10]; /* leave some slack */
+ KeySym keysym = 0;
+
+ /* XLookupString may return more than one character via XRebindKeysym;
+ and on some systems it returns multi-byte UTF-8 characters (contrary
+ to its documentation, which says it returns only Latin1.)
+
+ It seems to only do so, however, if setlocale() has been called.
+ See the code inside ENABLE_NLS in xscreensaver.c.
+ */
+ int decoded_size = XLookupString (event, (char *)decoded, sizeof(decoded),
+ &keysym, compose_status);
+
+#if 0
+ {
+ const char *ks = XKeysymToString (keysym);
+ int i;
+ fprintf(stderr, "## %-12s\t=> %d\t", (ks ? ks : "(null)"), decoded_size);
+ for (i = 0; i < decoded_size; i++)
+ fprintf(stderr, "%c", decoded[i]);
+ fprintf(stderr, "\t");
+ for (i = 0; i < decoded_size; i++)
+ fprintf(stderr, "\\%03o", ((unsigned char *)decoded)[i]);
+ fprintf(stderr, "\n");
+ }
+#endif
+
+ if (decoded_size > MAX_BYTES_PER_CHAR)
+ {
+ /* The multi-byte character returned is too large. */
+ XBell (si->dpy, 0);
+ return;
+ }
+
+ decoded[decoded_size] = 0;
+ pw->passwd_changed_p = True;
+
+ /* Add 10% to the time remaining every time a key is pressed. */
+ pw->ratio += 0.1;
+ if (pw->ratio > 1) pw->ratio = 1;
+
+ if (decoded_size == 1) /* Handle single-char commands */
+ {
+ switch (*decoded)
+ {
+ case '\010': case '\177': /* Backspace */
+ {
+ /* kludgey way to get the number of "logical" characters. */
+ int nchars = strlen (pw->typed_passwd_char_size);
+ int nbytes = strlen (pw->typed_passwd);
+ if (nbytes <= 0)
+ XBell (si->dpy, 0);
+ else
+ {
+ int i;
+ for (i = pw->typed_passwd_char_size[nchars-1]; i >= 0; i--)
+ {
+ if (nbytes < 0) abort();
+ pw->typed_passwd[nbytes--] = 0;
+ }
+ pw->typed_passwd_char_size[nchars-1] = 0;
+ }
+ }
+ break;
+
+ case '\012': case '\015': /* Enter */
+ finished_typing_passwd (si, pw);
+ break;
+
+ case '\033': /* Escape */
+ si->unlock_state = ul_cancel;
+ break;
+
+ case '\025': case '\030': /* Erase line */
+ memset (pw->typed_passwd, 0, sizeof (pw->typed_passwd));
+ memset (pw->typed_passwd_char_size, 0,
+ sizeof (pw->typed_passwd_char_size));
+ break;
+
+ default:
+ if (*decoded < ' ' && *decoded != '\t') /* Other ctrl char */
+ XBell (si->dpy, 0);
+ else
+ goto SELF_INSERT;
+ break;
+ }
+ }
+ else
+ {
+ int nbytes, nchars;
+ SELF_INSERT:
+ nbytes = strlen (pw->typed_passwd);
+ nchars = strlen (pw->typed_passwd_char_size);
+ if (nchars + 1 >= sizeof (pw->typed_passwd_char_size)-1 ||
+ nbytes + decoded_size >= sizeof (pw->typed_passwd)-1) /* overflow */
+ XBell (si->dpy, 0);
+ else
+ {
+ pw->typed_passwd_char_size[nchars] = decoded_size;
+ pw->typed_passwd_char_size[nchars+1] = 0;
+ memcpy (pw->typed_passwd + nbytes, decoded, decoded_size);
+ pw->typed_passwd[nbytes + decoded_size] = 0;
+ }
+ }
+
+ if (pw->echo_input)
+ {
+ /* If the input is wider than the text box, only show the last portion,
+ to simulate a horizontally-scrolling text field. */
+ int chars_in_pwfield = (pw->passwd_field_width /
+ pw->passwd_font->max_bounds.width);
+ const char *output = pw->typed_passwd;
+ if (strlen(output) > chars_in_pwfield)
+ output += (strlen(output) - chars_in_pwfield);
+ update_passwd_window (si, output, pw->ratio);
+ }
+ else if (pw->show_stars_p)
+ {
+ int nchars = strlen (pw->typed_passwd_char_size);
+ char *stars = 0;
+ stars = (char *) malloc(nchars + 1);
+ memset (stars, '*', nchars);
+ stars[nchars] = 0;
+ update_passwd_window (si, stars, pw->ratio);
+ free (stars);
+ }
+ else
+ {
+ update_passwd_window (si, "", pw->ratio);
+ }
+}
+
+
+static void
+passwd_event_loop (saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+ char *msg = 0;
+
+ /* We have to go through this union bullshit because gcc-4.4.0 has
+ stricter struct-aliasing rules. Without this, the optimizer
+ can fuck things up.
+ */
+ union {
+ XEvent x_event;
+# ifdef HAVE_RANDR
+ XRRScreenChangeNotifyEvent xrr_event;
+# endif /* HAVE_RANDR */
+ } event;
+
+ passwd_animate_timer ((XtPointer) si, 0);
+ reset_watchdog_timer (si, False); /* Disable watchdog while dialog up */
+
+ while (si->unlock_state == ul_read)
+ {
+ XtAppNextEvent (si->app, &event.x_event);
+
+#ifdef HAVE_RANDR
+ if (si->using_randr_extension &&
+ (event.x_event.type ==
+ (si->randr_event_number + RRScreenChangeNotify)))
+ {
+ /* The Resize and Rotate extension sends an event when the
+ size, rotation, or refresh rate of any screen has changed. */
+
+ if (p->verbose_p)
+ {
+ /* XRRRootToScreen is in Xrandr.h 1.4, 2001/06/07 */
+ int screen = XRRRootToScreen(si->dpy, event.xrr_event.window);
+ fprintf (stderr, "%s: %d: screen change event received\n",
+ blurb(), screen);
+ }
+
+#ifdef RRScreenChangeNotifyMask
+ /* Inform Xlib that it's ok to update its data structures. */
+ XRRUpdateConfiguration(&event.x_event); /* Xrandr.h 1.9, 2002/09/29*/
+#endif /* RRScreenChangeNotifyMask */
+
+ /* Resize the existing xscreensaver windows and cached ssi data. */
+ if (update_screen_layout (si))
+ {
+ if (p->verbose_p)
+ {
+ fprintf (stderr, "%s: new layout:\n", blurb());
+ describe_monitor_layout (si);
+ }
+ resize_screensaver_window (si);
+ }
+ }
+ else
+#endif /* HAVE_RANDR */
+
+ if (event.x_event.xany.window == si->passwd_dialog &&
+ event.x_event.xany.type == Expose)
+ draw_passwd_window (si);
+ else if (event.x_event.xany.type == KeyPress)
+ {
+ handle_passwd_key (si, &event.x_event.xkey);
+ si->pw_data->caps_p = (event.x_event.xkey.state & LockMask);
+ }
+ else if (event.x_event.xany.type == ButtonPress ||
+ event.x_event.xany.type == ButtonRelease)
+ {
+ si->pw_data->button_state_changed_p = True;
+ handle_unlock_button (si, &event.x_event);
+ if (si->pw_data->login_button_p)
+ handle_login_button (si, &event.x_event);
+ }
+ else
+ XtDispatchEvent (&event.x_event);
+ }
+
+ switch (si->unlock_state)
+ {
+ case ul_cancel: msg = ""; break;
+ case ul_time: msg = "Timed out!"; break;
+ case ul_finished: msg = "Checking..."; break;
+ default: msg = 0; break;
+ }
+
+ if (p->verbose_p)
+ switch (si->unlock_state) {
+ case ul_cancel:
+ fprintf (stderr, "%s: input cancelled.\n", blurb()); break;
+ case ul_time:
+ fprintf (stderr, "%s: input timed out.\n", blurb()); break;
+ case ul_finished:
+ fprintf (stderr, "%s: input finished.\n", blurb()); break;
+ default: break;
+ }
+
+ if (msg)
+ {
+ si->pw_data->i_beam = 0;
+ update_passwd_window (si, msg, 0.0);
+ XSync (si->dpy, False);
+
+ /* Swallow all pending KeyPress/KeyRelease events. */
+ {
+ XEvent e;
+ while (XCheckMaskEvent (si->dpy, KeyPressMask|KeyReleaseMask, &e))
+ ;
+ }
+ }
+
+ reset_watchdog_timer (si, True); /* Re-enable watchdog */
+}
+
+
+static void
+handle_typeahead (saver_info *si)
+{
+ passwd_dialog_data *pw = si->pw_data;
+ int i;
+ if (!si->unlock_typeahead)
+ return;
+
+ pw->passwd_changed_p = True;
+
+ i = strlen (si->unlock_typeahead);
+ if (i >= sizeof(pw->typed_passwd) - 1)
+ i = sizeof(pw->typed_passwd) - 1;
+
+ memcpy (pw->typed_passwd, si->unlock_typeahead, i);
+ pw->typed_passwd [i] = 0;
+ {
+ int j;
+ char *c = pw->typed_passwd_char_size;
+ for (j = 0; j < i; j++)
+ *c++ = 1;
+ *c = 0;
+ }
+
+ memset (si->unlock_typeahead, '*', strlen(si->unlock_typeahead));
+ si->unlock_typeahead[i] = 0;
+ update_passwd_window (si, si->unlock_typeahead, pw->ratio);
+
+ free (si->unlock_typeahead);
+ si->unlock_typeahead = 0;
+}
+
+
+/**
+ * Returns a copy of the input string with trailing whitespace removed.
+ * Whitespace is anything considered so by isspace().
+ * It is safe to call this with NULL, in which case NULL will be returned.
+ * The returned string (if not NULL) should be freed by the caller with free().
+ */
+static char *
+remove_trailing_whitespace(const char *str)
+{
+ size_t len;
+ char *newstr, *chr;
+
+ if (!str)
+ return NULL;
+
+ len = strlen(str);
+
+ newstr = malloc(len + 1);
+ if (!newstr)
+ return NULL;
+
+ (void) strcpy(newstr, str);
+ chr = newstr + len;
+ while (isspace(*--chr) && chr >= newstr)
+ *chr = '\0';
+
+ return newstr;
+}
+
+
+/*
+ * The authentication conversation function.
+ * Like a PAM conversation function, this accepts multiple messages in a single
+ * round. It then splits them into individual messages for display on the
+ * passwd dialog. A message sequence of info or error followed by a prompt will
+ * be reduced into a single dialog window.
+ *
+ * Returns 0 on success or -1 if some problem occurred (cancelled, OOM, etc.)
+ */
+int
+gui_auth_conv(int num_msg,
+ const struct auth_message auth_msgs[],
+ struct auth_response **resp,
+ saver_info *si)
+{
+ int i;
+ const char *info_msg, *prompt;
+ struct auth_response *responses;
+
+ if (si->unlock_state == ul_cancel ||
+ si->unlock_state == ul_time)
+ /* If we've already cancelled or timed out in this PAM conversation,
+ don't prompt again even if PAM asks us to! */
+ return -1;
+
+ if (!(responses = calloc(num_msg, sizeof(struct auth_response))))
+ goto fail;
+
+ for (i = 0; i < num_msg; ++i)
+ {
+ info_msg = prompt = NULL;
+
+ /* See if there is a following message that can be shown at the same
+ * time */
+ if (auth_msgs[i].type == AUTH_MSGTYPE_INFO
+ && i+1 < num_msg
+ && ( auth_msgs[i+1].type == AUTH_MSGTYPE_PROMPT_NOECHO
+ || auth_msgs[i+1].type == AUTH_MSGTYPE_PROMPT_ECHO)
+ )
+ {
+ info_msg = auth_msgs[i].msg;
+ prompt = auth_msgs[++i].msg;
+ }
+ else
+ {
+ if ( auth_msgs[i].type == AUTH_MSGTYPE_INFO
+ || auth_msgs[i].type == AUTH_MSGTYPE_ERROR)
+ info_msg = auth_msgs[i].msg;
+ else
+ prompt = auth_msgs[i].msg;
+ }
+
+ {
+ char *info_msg_trimmed, *prompt_trimmed;
+
+ /* Trailing whitespace looks bad in a GUI */
+ info_msg_trimmed = remove_trailing_whitespace(info_msg);
+ prompt_trimmed = remove_trailing_whitespace(prompt);
+
+ if (make_passwd_window(si, info_msg_trimmed, prompt_trimmed,
+ auth_msgs[i].type == AUTH_MSGTYPE_PROMPT_ECHO
+ ? True : False)
+ < 0)
+ goto fail;
+
+ if (info_msg_trimmed)
+ free(info_msg_trimmed);
+
+ if (prompt_trimmed)
+ free(prompt_trimmed);
+ }
+
+ compose_status = calloc (1, sizeof (*compose_status));
+ if (!compose_status)
+ goto fail;
+
+ si->unlock_state = ul_read;
+
+ handle_typeahead (si);
+ passwd_event_loop (si);
+
+ if (si->unlock_state == ul_cancel)
+ goto fail;
+
+ responses[i].response = strdup(si->pw_data->typed_passwd);
+
+ /* Cache the first response to a PROMPT_NOECHO to save prompting for
+ * each auth mechanism. */
+ if (si->cached_passwd == NULL &&
+ auth_msgs[i].type == AUTH_MSGTYPE_PROMPT_NOECHO)
+ si->cached_passwd = strdup(responses[i].response);
+
+ free (compose_status);
+ compose_status = 0;
+ }
+
+ *resp = responses;
+
+ return (si->unlock_state == ul_finished) ? 0 : -1;
+
+fail:
+ if (compose_status)
+ free (compose_status);
+ compose_status = 0;
+
+ if (responses)
+ {
+ for (i = 0; i < num_msg; ++i)
+ if (responses[i].response)
+ free (responses[i].response);
+ free (responses);
+ }
+
+ return -1;
+}
+
+
+void
+auth_finished_cb (saver_info *si)
+{
+ char buf[1024];
+ const char *s;
+
+ /* If we have something to say, put the dialog back up for a few seconds
+ to display it. Otherwise, don't bother.
+ */
+
+ if (si->unlock_state == ul_fail && /* failed with caps lock on */
+ si->pw_data && si->pw_data->caps_p)
+ s = "Authentication failed (Caps Lock?)";
+ else if (si->unlock_state == ul_fail) /* failed without caps lock */
+ s = "Authentication failed!";
+ else if (si->unlock_state == ul_success && /* good, but report failures */
+ si->unlock_failures > 0)
+ {
+ if (si->unlock_failures == 1)
+ s = "There has been\n1 failed login attempt.";
+ else
+ {
+ sprintf (buf, "There have been\n%d failed login attempts.",
+ si->unlock_failures);
+ s = buf;
+ }
+ si->unlock_failures = 0;
+
+ /* ignore failures if they all were too recent */
+ if (time((time_t *) 0) - si->unlock_failure_time
+ < si->prefs.auth_warning_slack)
+ goto END;
+ }
+ else /* good, with no failures, */
+ goto END; /* or timeout, or cancel. */
+
+ make_passwd_window (si, s, NULL, True);
+ XSync (si->dpy, False);
+
+ {
+ int secs = 4;
+ time_t start = time ((time_t *) 0);
+ XEvent event;
+ while (time ((time_t *) 0) < start + secs)
+ if (XPending (si->dpy))
+ {
+ XNextEvent (si->dpy, &event);
+ if (event.xany.window == si->passwd_dialog &&
+ event.xany.type == Expose)
+ draw_passwd_window (si);
+ else if (event.xany.type == ButtonPress ||
+ event.xany.type == KeyPress)
+ break;
+ XSync (si->dpy, False);
+ }
+ else
+ usleep (250000); /* 1/4 second */
+ }
+
+ END:
+ if (si->pw_data)
+ destroy_passwd_window (si);
+}
+
+
+Bool
+unlock_p (saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+
+ if (!si->unlock_cb)
+ {
+ fprintf(stderr, "%s: Error: no unlock function specified!\n", blurb());
+ return False;
+ }
+
+ raise_window (si, True, True, True);
+
+ xss_authenticate(si, p->verbose_p);
+
+ return (si->unlock_state == ul_success);
+}
+
+
+void
+set_locked_p (saver_info *si, Bool locked_p)
+{
+ si->locked_p = locked_p;
+
+#ifdef HAVE_XHPDISABLERESET
+ hp_lock_reset (si, locked_p); /* turn off/on C-Sh-Reset */
+#endif
+#ifdef HAVE_XF86VMODE
+ xfree_lock_mode_switch (si, locked_p); /* turn off/on C-Alt-Plus */
+#endif
+#ifdef HAVE_XF86MISCSETGRABKEYSSTATE
+ xfree_lock_grab_smasher (si, locked_p); /* turn off/on C-Alt-KP-*,/ */
+#endif
+
+ store_saver_status (si); /* store locked-p */
+}
+
+
+#else /* NO_LOCKING -- whole file */
+
+void
+set_locked_p (saver_info *si, Bool locked_p)
+{
+ if (locked_p) abort();
+}
+
+#endif /* !NO_LOCKING */
diff --git a/driver/mlstring.c b/driver/mlstring.c
new file mode 100644
index 0000000..fdba1ee
--- /dev/null
+++ b/driver/mlstring.c
@@ -0,0 +1,229 @@
+/*
+ * (c) 2007, Quest Software, Inc. All rights reserved.
+ *
+ * This file is part of XScreenSaver,
+ * Copyright (c) 1993-2009 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include <stdlib.h>
+#include <ctype.h>
+
+#include <X11/Xlib.h>
+
+#include "mlstring.h"
+
+#define LINE_SPACING 1.2
+
+static mlstring *
+mlstring_allocate(const char *msg);
+
+static void
+mlstring_calculate(mlstring *str, XFontStruct *font);
+
+mlstring*
+mlstring_new(const char *msg, XFontStruct *font, Dimension wrap_width)
+{
+ mlstring *newstr;
+
+ if (!(newstr = mlstring_allocate(msg)))
+ return NULL;
+
+ newstr->font_id = font->fid;
+
+ mlstring_wrap(newstr, font, wrap_width);
+
+ return newstr;
+}
+
+mlstring *
+mlstring_allocate(const char *msg)
+{
+ const char *s;
+ mlstring *ml;
+ struct mlstr_line *cur, *prev = NULL;
+ size_t linelength;
+ int the_end = 0;
+
+ if (!msg)
+ return NULL;
+
+ ml = calloc(1, sizeof(mlstring));
+
+ if (!ml)
+ return NULL;
+
+ for (s = msg; !the_end; msg = ++s)
+ {
+ /* New string struct */
+ cur = calloc(1, sizeof(struct mlstr_line));
+ if (!cur)
+ goto fail;
+
+ if (!ml->lines)
+ ml->lines = cur;
+
+ /* Find the \n or end of string */
+ while (*s != '\n')
+ {
+ if (*s == '\0')
+ {
+ the_end = 1;
+ break;
+ }
+
+ ++s;
+ }
+
+ linelength = s - msg;
+
+ /* Duplicate the string */
+ cur->line = malloc(linelength + 1);
+ if (!cur->line)
+ goto fail;
+
+ strncpy(cur->line, msg, linelength);
+ cur->line[linelength] = '\0';
+
+ if (prev)
+ prev->next_line = cur;
+ prev = cur;
+ }
+
+ return ml;
+
+fail:
+
+ if (ml)
+ mlstring_free(ml);
+
+ return NULL;
+}
+
+
+/*
+ * Frees an mlstring.
+ * This function does not have any unit tests.
+ */
+void
+mlstring_free(mlstring *str) {
+ struct mlstr_line *cur, *next;
+
+ for (cur = str->lines; cur; cur = next) {
+ next = cur->next_line;
+ free(cur->line);
+ free(cur);
+ }
+
+ free(str);
+}
+
+
+void
+mlstring_wrap(mlstring *mstring, XFontStruct *font, Dimension width)
+{
+ short char_width = font->max_bounds.width;
+ int line_length, wrap_at;
+ struct mlstr_line *mstr, *newml;
+
+ /* An alternative implementation of this function would be to keep trying
+ * XTextWidth() on space-delimited substrings until the longest one less
+ * than 'width' is found, however there shouldn't be much difference
+ * between that, and this implementation.
+ */
+
+ for (mstr = mstring->lines; mstr; mstr = mstr->next_line)
+ {
+ if (XTextWidth(font, mstr->line, strlen(mstr->line)) > width)
+ {
+ /* Wrap it */
+ line_length = width / char_width;
+ if (line_length == 0)
+ line_length = 1;
+
+ /* First try to soft wrap by finding a space */
+ for (wrap_at = line_length; wrap_at >= 0 && !isspace(mstr->line[wrap_at]); --wrap_at);
+
+ if (wrap_at == -1) /* No space found, hard wrap */
+ wrap_at = line_length;
+ else
+ wrap_at++; /* Leave the space at the end of the line. */
+
+ newml = calloc(1, sizeof(*newml));
+ if (!newml) /* OOM, don't bother trying to wrap */
+ break;
+
+ if (NULL == (newml->line = strdup(mstr->line + wrap_at)))
+ {
+ /* OOM, jump ship */
+ free(newml);
+ break;
+ }
+
+ /* Terminate the existing string at its end */
+ mstr->line[wrap_at] = '\0';
+
+ newml->next_line = mstr->next_line;
+ mstr->next_line = newml;
+ }
+ }
+
+ mlstring_calculate(mstring, font);
+}
+
+#undef MAX
+#define MAX(x, y) ((x) > (y) ? (x) : (y))
+
+/*
+ * Calculates the overall extents (width + height of the multi-line string).
+ * This function is called as part of mlstring_new().
+ * It does not have any unit testing.
+ */
+void
+mlstring_calculate(mlstring *str, XFontStruct *font) {
+ struct mlstr_line *line;
+
+ str->font_height = font->ascent + font->descent;
+ str->overall_height = 0;
+ str->overall_width = 0;
+
+ /* XXX: Should there be some baseline calculations to help XDrawString later on? */
+ str->font_ascent = font->ascent;
+
+ for (line = str->lines; line; line = line->next_line)
+ {
+ line->line_width = XTextWidth(font, line->line, strlen(line->line));
+ str->overall_width = MAX(str->overall_width, line->line_width);
+ /* Don't add line spacing for the first line */
+ str->overall_height += (font->ascent + font->descent) *
+ (line == str->lines ? 1 : LINE_SPACING);
+ }
+}
+
+void
+mlstring_draw(Display *dpy, Drawable dialog, GC gc, mlstring *string, int x, int y) {
+ struct mlstr_line *line;
+
+ if (!string)
+ return;
+
+ y += string->font_ascent;
+
+ XSetFont(dpy, gc, string->font_id);
+
+ for (line = string->lines; line; line = line->next_line)
+ {
+ XDrawString(dpy, dialog, gc, x, y, line->line, strlen(line->line));
+ y += string->font_height * LINE_SPACING;
+ }
+}
+
+/* vim:ts=8:sw=2:noet
+ */
diff --git a/driver/mlstring.h b/driver/mlstring.h
new file mode 100644
index 0000000..ce36205
--- /dev/null
+++ b/driver/mlstring.h
@@ -0,0 +1,57 @@
+/* mlstring.h --- Multi-line strings for use with Xlib
+ *
+ * (c) 2007, Quest Software, Inc. All rights reserved.
+ *
+ * This file is part of XScreenSaver,
+ * Copyright (c) 1993-2004 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+#ifndef MLSTRING_H
+#define MLSTRING_H
+
+#include <X11/Intrinsic.h>
+
+/* mlstring means multi-line string */
+
+struct mlstr_line;
+
+typedef struct mlstring mlstring;
+struct mlstring {
+ struct mlstr_line *lines; /* linked list */
+ Dimension overall_height;
+ Dimension overall_width;
+ /* XXX: Perhaps it is simpler to keep a reference to the XFontStruct */
+ int font_ascent;
+ int font_height;
+ Font font_id;
+};
+
+struct mlstr_line {
+ char *line;
+ Dimension line_width;
+ struct mlstr_line *next_line;
+};
+
+mlstring *
+mlstring_new(const char *str, XFontStruct *font, Dimension wrap_width);
+
+/* Does not have to be called manually */
+void
+mlstring_wrap(mlstring *mstr, XFontStruct *font, Dimension width);
+
+void
+mlstring_free(mlstring *str);
+
+void
+mlstring_draw(Display *dpy, Drawable dialog, GC gc, mlstring *string, int x, int y);
+
+#endif
+/* vim:ts=8:sw=2:noet
+ */
diff --git a/driver/passwd-helper.c b/driver/passwd-helper.c
new file mode 100644
index 0000000..a3a6b92
--- /dev/null
+++ b/driver/passwd-helper.c
@@ -0,0 +1,162 @@
+/* passwd-helper.c --- verifying typed passwords with external helper program
+ * written by Olaf Kirch <okir@suse.de>
+ * xscreensaver, Copyright (c) 1993-2005 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* The idea here is to be able to run xscreensaver without any setuid bits.
+ * Password verification happens through an external program that you feed
+ * your password to on stdin. The external command is invoked with a user
+ * name argument.
+ *
+ * The external helper does whatever authentication is necessary. Currently,
+ * SuSE uses "unix2_chkpwd", which is a variation of "unix_chkpwd" from the
+ * PAM distribution.
+ *
+ * Normally, the password helper should just authenticate the calling user
+ * (i.e. based on the caller's real uid). This is in order to prevent
+ * brute-forcing passwords in a shadow environment. A less restrictive
+ * approach would be to allow verifying other passwords as well, but always
+ * with a 2 second delay or so. (Not sure what SuSE's "unix2_chkpwd"
+ * currently does.)
+ * -- Olaf Kirch <okir@suse.de>, 16-Dec-2003
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifndef NO_LOCKING /* whole file */
+
+#include <X11/Xlib.h> /* not used for much... */
+
+/* This file doesn't need the Xt headers, so stub these types out... */
+#undef XtPointer
+#define XtAppContext void*
+#define XrmDatabase void*
+#define XtIntervalId void*
+#define XtPointer void*
+#define Widget void*
+
+#include "xscreensaver.h"
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <pwd.h>
+#include <errno.h>
+
+#include <sys/wait.h>
+
+static int
+ext_run (const char *user, const char *typed_passwd, int verbose_p)
+{
+ int pfd[2], status;
+ pid_t pid;
+
+ if (pipe(pfd) < 0)
+ return 0;
+
+ if (verbose_p)
+ fprintf (stderr, "%s: ext_run (%s, %s)\n",
+ blurb(), PASSWD_HELPER_PROGRAM, user);
+
+ block_sigchld();
+
+ if ((pid = fork()) < 0) {
+ close(pfd[0]);
+ close(pfd[1]);
+ return 0;
+ }
+
+ if (pid == 0) {
+ close(pfd[1]);
+ if (pfd[0] != 0)
+ dup2(pfd[0], 0);
+
+ /* Helper is invoked as helper service-name [user] */
+ execlp(PASSWD_HELPER_PROGRAM, PASSWD_HELPER_PROGRAM, "xscreensaver", user, NULL);
+ if (verbose_p)
+ fprintf(stderr, "%s: %s\n", PASSWD_HELPER_PROGRAM,
+ strerror(errno));
+ exit(1);
+ }
+
+ close(pfd[0]);
+
+ /* Write out password to helper process */
+ if (!typed_passwd)
+ typed_passwd = "";
+ write(pfd[1], typed_passwd, strlen(typed_passwd));
+ close(pfd[1]);
+
+ while (waitpid(pid, &status, 0) < 0) {
+ if (errno == EINTR)
+ continue;
+ if (verbose_p)
+ fprintf(stderr, "%s: ext_run: waitpid failed: %s\n",
+ blurb(), strerror(errno));
+ unblock_sigchld();
+ return 0;
+ }
+
+ unblock_sigchld();
+
+ if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
+ return 0;
+ return 1;
+}
+
+
+
+/* This can be called at any time, and says whether the typed password
+ belongs to either the logged in user (real uid, not effective); or
+ to root.
+ */
+int
+ext_passwd_valid_p (const char *typed_passwd, int verbose_p)
+{
+ struct passwd *pw;
+ int res = 0;
+
+ if ((pw = getpwuid(getuid())) != NULL)
+ res = ext_run (pw->pw_name, typed_passwd, verbose_p);
+ endpwent();
+
+#ifdef ALLOW_ROOT_PASSWD
+ if (!res)
+ res = ext_run ("root", typed_passwd, verbose_p);
+#endif /* ALLOW_ROOT_PASSWD */
+
+ return res;
+}
+
+
+int
+ext_priv_init (int argc, char **argv, int verbose_p)
+{
+ /* Make sure the passwd helper exists */
+ if (access(PASSWD_HELPER_PROGRAM, X_OK) < 0) {
+ fprintf(stderr,
+ "%s: warning: %s does not exist.\n"
+ "%s: password authentication via "
+ "external helper will not work.\n",
+ blurb(), PASSWD_HELPER_PROGRAM, blurb());
+ return 0;
+ }
+ return 1;
+}
+
+#endif /* NO_LOCKING -- whole file */
diff --git a/driver/passwd-kerberos.c b/driver/passwd-kerberos.c
new file mode 100644
index 0000000..202e0eb
--- /dev/null
+++ b/driver/passwd-kerberos.c
@@ -0,0 +1,251 @@
+/* kpasswd.c --- verify kerberos passwords.
+ * written by Nat Lanza (magus@cs.cmu.edu) for
+ * xscreensaver, Copyright (c) 1993-2004 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifndef NO_LOCKING /* whole file */
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+/* I'm not sure if this is exactly the right test...
+ Might __APPLE__ be defined if this is apple hardware, but not
+ an Apple OS?
+
+ Thanks to Alexei Kosut <akosut@stanford.edu> for the MacOS X code.
+ */
+#ifdef __APPLE__
+# define HAVE_DARWIN
+#endif
+
+
+#if defined(HAVE_DARWIN)
+# include <Kerberos/Kerberos.h>
+#elif defined(HAVE_KERBEROS5)
+# include <kerberosIV/krb.h>
+# include <kerberosIV/des.h>
+#else /* !HAVE_KERBEROS5 (meaning Kerberos 4) */
+# include <krb.h>
+# include <des.h>
+#endif /* !HAVE_KERBEROS5 */
+
+#if !defined(VMS) && !defined(HAVE_ADJUNCT_PASSWD)
+# include <pwd.h>
+#endif
+
+
+#ifdef __bsdi__
+# include <sys/param.h>
+# if _BSDI_VERSION >= 199608
+# define BSD_AUTH
+# endif
+#endif /* __bsdi__ */
+
+/* blargh */
+#undef Bool
+#undef True
+#undef False
+#define Bool int
+#define True 1
+#define False 0
+
+/* The user information we need to store */
+#ifdef HAVE_DARWIN
+ static KLPrincipal princ;
+#else /* !HAVE_DARWIN */
+ static char realm[REALM_SZ];
+ static char name[ANAME_SZ];
+ static char inst[INST_SZ];
+ static const char *tk_file;
+#endif /* !HAVE_DARWIN */
+
+/* warning suppression: duplicated in passwd.c */
+extern Bool kerberos_lock_init (int argc, char **argv, Bool verbose_p);
+extern Bool kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p);
+
+
+/* Called at startup to grab user, instance, and realm information
+ from the user's ticketfile (remember, name.inst@realm). Since we're
+ using tf_get_pname(), this should work even if your kerberos username
+ isn't the same as your local username. We grab the ticket at startup
+ time so that even if your ticketfile dies while the screen's locked
+ we'll still have the information to unlock it.
+
+ Problems: the password dialog currently displays local username, so if
+ you have some non-standard name/instance when you run xscreensaver,
+ you'll need to remember what it was when unlocking, or else you lose.
+
+ Also, we use des_string_to_key(), so if you have an AFS password
+ (encrypted with ka_StringToKey()), you'll lose. Get a kerberos password;
+ it isn't that hard.
+
+ Like the original lock_init, we return false if something went wrong.
+ We don't use the arguments we're given, though.
+ */
+Bool
+kerberos_lock_init (int argc, char **argv, Bool verbose_p)
+{
+# ifdef HAVE_DARWIN
+
+ KLBoolean found;
+ return ((klNoErr == (KLCacheHasValidTickets (NULL, kerberosVersion_Any,
+ &found, &princ, NULL)))
+ && found);
+
+# else /* !HAVE_DARWIN */
+
+ /* Perhaps we should be doing it the Mac way (above) all the time?
+ The following code assumes Unix-style file-based Kerberos credentials
+ cache, which Mac OS X doesn't use. But is there any real reason to
+ do it this way at all, even on other Unixen?
+ */
+ int k_errno;
+
+ memset(name, 0, sizeof(name));
+ memset(inst, 0, sizeof(inst));
+
+ /* find out where the user's keeping his tickets.
+ squirrel it away for later use. */
+ tk_file = tkt_string();
+
+ /* open ticket file or die trying. */
+ if ((k_errno = tf_init(tk_file, R_TKT_FIL))) {
+ return False;
+ }
+
+ /* same with principal and instance names */
+ if ((k_errno = tf_get_pname(name)) ||
+ (k_errno = tf_get_pinst(inst))) {
+ return False;
+ }
+
+ /* close the ticketfile to release the lock on it. */
+ tf_close();
+
+ /* figure out what realm we're authenticated to. this ought
+ to be the local realm, but it pays to be sure. */
+ if ((k_errno = krb_get_tf_realm(tk_file, realm))) {
+ return False;
+ }
+
+ /* last-minute sanity check on what we got. */
+ if ((strlen(name)+strlen(inst)+strlen(realm)+3) >
+ (REALM_SZ + ANAME_SZ + INST_SZ + 3)) {
+ return False;
+ }
+
+ /* success */
+ return True;
+
+# endif /* !HAVE_DARWIN */
+}
+
+
+/* des_string_to_key() wants this. If C didn't suck, we could have an
+ anonymous function do this. Even a local one. But it does, so here
+ we are. Calling it ive_got_your_local_function_right_here_buddy()
+ would have been rude.
+ */
+#ifndef HAVE_DARWIN
+static int
+key_to_key(char *user, char *instance, char *realm, char *passwd, C_Block key)
+{
+ memcpy(key, passwd, sizeof(des_cblock));
+ return (0);
+}
+#endif /* !HAVE_DARWIN */
+
+/* Called to see if the user's typed password is valid. We do this by asking
+ the kerberos server for a ticket and checking to see if it gave us one.
+ We need to move the ticketfile first, or otherwise we end up updating the
+ user's tkfile with new tickets. This would break services like zephyr that
+ like to stay authenticated, and it would screw with AFS authentication at
+ some sites. So, we do a quick, painful hack with a tmpfile.
+ */
+Bool
+kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
+{
+# ifdef HAVE_DARWIN
+ return (klNoErr ==
+ KLAcquireNewInitialTicketsWithPassword (princ, NULL,
+ typed_passwd, NULL));
+# else /* !HAVE_DARWIN */
+
+ /* See comments in kerberos_lock_init -- should we do it the Mac Way
+ on all systems?
+ */
+ C_Block mitkey;
+ Bool success;
+ char *newtkfile;
+ int fh = -1;
+
+ /* temporarily switch to a new ticketfile.
+ I'm not using tmpnam() because it isn't entirely portable.
+ this could probably be fixed with autoconf. */
+ newtkfile = malloc(80 * sizeof(char));
+ memset(newtkfile, 0, sizeof(newtkfile));
+
+ sprintf(newtkfile, "/tmp/xscrn-%i.XXXXXX", getpid());
+
+ if( (fh = mkstemp(newtkfile)) < 0)
+ {
+ free(newtkfile);
+ return(False);
+ }
+ if( fchmod(fh, 0600) < 0)
+ {
+ free(newtkfile);
+ return(False);
+ }
+
+
+ krb_set_tkt_string(newtkfile);
+
+ /* encrypt the typed password. if you have an AFS password instead
+ of a kerberos one, you lose *right here*. If you want to use AFS
+ passwords, you can use ka_StringToKey() instead. As always, ymmv. */
+ des_string_to_key(typed_passwd, mitkey);
+
+ if (krb_get_in_tkt(name, inst, realm, "krbtgt", realm, DEFAULT_TKT_LIFE,
+ key_to_key, NULL, (char *) mitkey) != 0) {
+ success = False;
+ } else {
+ success = True;
+ }
+
+ /* quickly block out the tempfile and password to prevent snooping,
+ then restore the old ticketfile and cleean up a bit. */
+
+ dest_tkt();
+ krb_set_tkt_string(tk_file);
+ free(newtkfile);
+ memset(mitkey, 0, sizeof(mitkey));
+ close(fh); /* #### tom: should the file be removed? */
+
+
+ /* Did we verify successfully? */
+ return success;
+
+# endif /* !HAVE_DARWIN */
+}
+
+#endif /* NO_LOCKING -- whole file */
diff --git a/driver/passwd-pam.c b/driver/passwd-pam.c
new file mode 100644
index 0000000..d463bc2
--- /dev/null
+++ b/driver/passwd-pam.c
@@ -0,0 +1,526 @@
+/* passwd-pam.c --- verifying typed passwords with PAM
+ * (Pluggable Authentication Modules.)
+ * written by Bill Nottingham <notting@redhat.com> (and jwz) for
+ * xscreensaver, Copyright (c) 1993-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Some PAM resources:
+ *
+ * PAM home page:
+ * http://www.us.kernel.org/pub/linux/libs/pam/
+ *
+ * PAM FAQ:
+ * http://www.us.kernel.org/pub/linux/libs/pam/FAQ
+ *
+ * PAM Application Developers' Guide:
+ * http://www.us.kernel.org/pub/linux/libs/pam/Linux-PAM-html/Linux-PAM_ADG.html
+ *
+ * PAM Mailing list archives:
+ * http://www.linuxhq.com/lnxlists/linux-pam/
+ *
+ * Compatibility notes, especially between Linux and Solaris:
+ * http://www.contrib.andrew.cmu.edu/u/shadow/pam.html
+ *
+ * The Open Group's PAM API documentation:
+ * http://www.opengroup.org/onlinepubs/8329799/pam_start.htm
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifndef NO_LOCKING /* whole file */
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+extern char *blurb(void);
+
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <pwd.h>
+#include <grp.h>
+#include <security/pam_appl.h>
+#include <signal.h>
+#include <errno.h>
+#include <X11/Intrinsic.h>
+
+#include <sys/stat.h>
+
+#include "auth.h"
+
+extern sigset_t block_sigchld (void);
+extern void unblock_sigchld (void);
+
+/* blargh */
+#undef Bool
+#undef True
+#undef False
+#define Bool int
+#define True 1
+#define False 0
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof(*(x)))
+
+/* Some time between Red Hat 4.2 and 7.0, the words were transposed
+ in the various PAM_x_CRED macro names. Yay!
+ */
+#if !defined(PAM_REFRESH_CRED) && defined(PAM_CRED_REFRESH)
+# define PAM_REFRESH_CRED PAM_CRED_REFRESH
+#endif
+#if !defined(PAM_REINITIALIZE_CRED) && defined(PAM_CRED_REINITIALIZE)
+# define PAM_REINITIALIZE_CRED PAM_CRED_REINITIALIZE
+#endif
+
+static int pam_conversation (int nmsgs,
+ const struct pam_message **msg,
+ struct pam_response **resp,
+ void *closure);
+
+void pam_try_unlock(saver_info *si, Bool verbose_p,
+ Bool (*valid_p)(const char *typed_passwd, Bool verbose_p));
+
+Bool pam_priv_init (int argc, char **argv, Bool verbose_p);
+
+#ifdef HAVE_PAM_FAIL_DELAY
+ /* We handle delays ourself.*/
+ /* Don't set this to 0 (Linux bug workaround.) */
+# define PAM_NO_DELAY(pamh) pam_fail_delay ((pamh), 1)
+#else /* !HAVE_PAM_FAIL_DELAY */
+# define PAM_NO_DELAY(pamh) /* */
+#endif /* !HAVE_PAM_FAIL_DELAY */
+
+
+/* On SunOS 5.6, and on Linux with PAM 0.64, pam_strerror() takes two args.
+ On some other Linux systems with some other version of PAM (e.g.,
+ whichever Debian release comes with a 2.2.5 kernel) it takes one arg.
+ I can't tell which is more "recent" or "correct" behavior, so configure
+ figures out which is in use for us. Shoot me!
+ */
+#ifdef PAM_STRERROR_TWO_ARGS
+# define PAM_STRERROR(pamh, status) pam_strerror((pamh), (status))
+#else /* !PAM_STRERROR_TWO_ARGS */
+# define PAM_STRERROR(pamh, status) pam_strerror((status))
+#endif /* !PAM_STRERROR_TWO_ARGS */
+
+
+/* PAM sucks in that there is no way to tell whether a particular service
+ is configured at all. That is, there is no way to tell the difference
+ between "authentication of the FOO service is not allowed" and "the
+ user typed the wrong password."
+
+ On RedHat 5.1 systems, if a service name is not known, it defaults to
+ being not allowed (because the fallback service, /etc/pam.d/other, is
+ set to `pam_deny'.)
+
+ On Solaris 2.6 systems, unknown services default to authenticating normally.
+
+ So, we could simply require that the person who installs xscreensaver
+ set up an "xscreensaver" PAM service. However, if we went that route,
+ it would have a really awful failure mode: the failure mode would be that
+ xscreensaver was willing to *lock* the screen, but would be unwilling to
+ *unlock* the screen. (With the non-PAM password code, the analagous
+ situation -- security not being configured properly, for example do to the
+ executable not being installed as setuid root -- the failure mode is much
+ more palettable, in that xscreensaver will refuse to *lock* the screen,
+ because it can know up front that there is no password that will work.)
+
+ Another route would be to have the service name to consult be computed at
+ compile-time (perhaps with a configure option.) However, that doesn't
+ really solve the problem, because it means that the same executable might
+ work fine on one machine, but refuse to unlock when run on another
+ machine.
+
+ Another alternative would be to look in /etc/pam.conf or /etc/pam.d/ at
+ runtime to see what services actually exist. But I think that's no good,
+ because who is to say that the PAM info is actually specified in those
+ files? Opening and reading those files is not a part of the PAM client
+ API, so it's not guarenteed to work on any given system.
+
+ An alternative I tried was to specify a list of services to try, and to
+ try them all in turn ("xscreensaver", "xlock", "xdm", and "login").
+ This worked, but it was slow (and I also had to do some contortions to
+ work around bugs in Linux PAM 0.64-3.)
+
+ So what we do today is, try PAM once, and if that fails, try the usual
+ getpwent() method. So if PAM doesn't work, it will at least make an
+ attempt at looking up passwords in /etc/passwd or /etc/shadow instead.
+
+ This all kind of blows. I'm not sure what else to do.
+ */
+
+
+/* On SunOS 5.6, the `pam_conv.appdata_ptr' slot seems to be ignored, and
+ the `closure' argument to pc.conv always comes in as random garbage.
+ So we get around this by using a global variable instead. Shoot me!
+
+ (I've been told this is bug 4092227, and is fixed in Solaris 7.)
+ (I've also been told that it's fixed in Solaris 2.6 by patch 106257-05.)
+ */
+static void *suns_pam_implementation_blows = 0;
+
+
+/**
+ * This function is the PAM conversation driver. It conducts a full
+ * authentication round by invoking the GUI with various prompts.
+ */
+void
+pam_try_unlock(saver_info *si, Bool verbose_p,
+ Bool (*valid_p)(const char *typed_passwd, Bool verbose_p))
+{
+ const char *service = PAM_SERVICE_NAME;
+ pam_handle_t *pamh = 0;
+ int status = -1;
+ struct pam_conv pc;
+# ifdef HAVE_SIGTIMEDWAIT
+ sigset_t set;
+ struct timespec timeout;
+# endif /* HAVE_SIGTIMEDWAIT */
+
+ pc.conv = &pam_conversation;
+ pc.appdata_ptr = (void *) si;
+
+ /* On SunOS 5.6, the `appdata_ptr' slot seems to be ignored, and the
+ `closure' argument to pc.conv always comes in as random garbage. */
+ suns_pam_implementation_blows = (void *) si;
+
+
+ /* Initialize PAM.
+ */
+ status = pam_start (service, si->user, &pc, &pamh);
+ if (verbose_p)
+ fprintf (stderr, "%s: pam_start (\"%s\", \"%s\", ...) ==> %d (%s)\n",
+ blurb(), service, si->user,
+ status, PAM_STRERROR (pamh, status));
+ if (status != PAM_SUCCESS) goto DONE;
+
+ /* #### We should set PAM_TTY to the display we're using, but we
+ don't have that handy from here. So set it to :0.0, which is a
+ good guess (and has the bonus of counting as a "secure tty" as
+ far as PAM is concerned...)
+ */
+ {
+ char *tty = strdup (":0.0");
+ status = pam_set_item (pamh, PAM_TTY, tty);
+ if (verbose_p)
+ fprintf (stderr, "%s: pam_set_item (p, PAM_TTY, \"%s\") ==> %d (%s)\n",
+ blurb(), tty, status, PAM_STRERROR(pamh, status));
+ free (tty);
+ }
+
+ /* Try to authenticate as the current user.
+ We must turn off our SIGCHLD handler for the duration of the call to
+ pam_authenticate(), because in some cases, the underlying PAM code
+ will do this:
+
+ 1: fork a setuid subprocess to do some dirty work;
+ 2: read a response from that subprocess;
+ 3: waitpid(pid, ...) on that subprocess.
+
+ If we (the ignorant parent process) have a SIGCHLD handler, then there's
+ a race condition between steps 2 and 3: if the subprocess exits before
+ waitpid() was called, then our SIGCHLD handler fires, and gets notified
+ of the subprocess death; then PAM's call to waitpid() fails, because the
+ process has already been reaped.
+
+ I consider this a bug in PAM, since the caller should be able to have
+ whatever signal handlers it wants -- the PAM documentation doesn't say
+ "oh by the way, if you use PAM, you can't use SIGCHLD."
+ */
+
+ PAM_NO_DELAY(pamh);
+
+ if (verbose_p)
+ fprintf (stderr, "%s: pam_authenticate (...) ...\n", blurb());
+
+# ifdef HAVE_SIGTIMEDWAIT
+ timeout.tv_sec = 0;
+ timeout.tv_nsec = 1;
+ set =
+# endif /* HAVE_SIGTIMEDWAIT */
+ block_sigchld();
+ status = pam_authenticate (pamh, 0);
+# ifdef HAVE_SIGTIMEDWAIT
+ sigtimedwait (&set, NULL, &timeout);
+ /* #### What is the portable thing to do if we don't have it? */
+# endif /* HAVE_SIGTIMEDWAIT */
+ unblock_sigchld();
+
+ if (verbose_p)
+ fprintf (stderr, "%s: pam_authenticate (...) ==> %d (%s)\n",
+ blurb(), status, PAM_STRERROR(pamh, status));
+
+ if (status == PAM_SUCCESS) /* Win! */
+ {
+ int status2;
+
+ /* On most systems, it doesn't matter whether the account modules
+ are run, or whether they fail or succeed.
+
+ On some systems, the account modules fail, because they were
+ never configured properly, but it's necessary to run them anyway
+ because certain PAM modules depend on side effects of the account
+ modules having been run.
+
+ And on still other systems, the account modules are actually
+ used, and failures in them should be considered to be true!
+
+ So:
+ - We run the account modules on all systems.
+ - Whether we ignore them is a configure option.
+
+ It's all kind of a mess.
+ */
+ status2 = pam_acct_mgmt (pamh, 0);
+
+ if (verbose_p)
+ fprintf (stderr, "%s: pam_acct_mgmt (...) ==> %d (%s)\n",
+ blurb(), status2, PAM_STRERROR(pamh, status2));
+
+ /* HPUX for some reason likes to make PAM defines different from
+ * everyone else's. */
+#ifdef PAM_AUTHTOKEN_REQD
+ if (status2 == PAM_AUTHTOKEN_REQD)
+#else
+ if (status2 == PAM_NEW_AUTHTOK_REQD)
+#endif
+ {
+ status2 = pam_chauthtok (pamh, PAM_CHANGE_EXPIRED_AUTHTOK);
+ if (verbose_p)
+ fprintf (stderr, "%s: pam_chauthtok (...) ==> %d (%s)\n",
+ blurb(), status2, PAM_STRERROR(pamh, status2));
+ }
+
+ /* If 'configure' requested that we believe the results of PAM
+ account module failures, then obey that status code.
+ Otherwise ignore it.
+ */
+#ifdef PAM_CHECK_ACCOUNT_TYPE
+ status = status2;
+#endif
+
+ /* Each time we successfully authenticate, refresh credentials,
+ for Kerberos/AFS/DCE/etc. If this fails, just ignore that
+ failure and blunder along; it shouldn't matter.
+ */
+
+#if defined(__linux__)
+ /* Apparently the Linux PAM library ignores PAM_REFRESH_CRED and only
+ refreshes credentials when using PAM_REINITIALIZE_CRED. */
+ status2 = pam_setcred (pamh, PAM_REINITIALIZE_CRED);
+#else
+ /* But Solaris requires PAM_REFRESH_CRED or extra prompts appear. */
+ status2 = pam_setcred (pamh, PAM_REFRESH_CRED);
+#endif
+
+ if (verbose_p)
+ fprintf (stderr, "%s: pam_setcred (...) ==> %d (%s)\n",
+ blurb(), status2, PAM_STRERROR(pamh, status2));
+ }
+
+ DONE:
+ if (pamh)
+ {
+ int status2 = pam_end (pamh, status);
+ pamh = 0;
+ if (verbose_p)
+ fprintf (stderr, "%s: pam_end (...) ==> %d (%s)\n",
+ blurb(), status2,
+ (status2 == PAM_SUCCESS ? "Success" : "Failure"));
+ }
+
+ if (status == PAM_SUCCESS)
+ si->unlock_state = ul_success; /* yay */
+ else if (si->unlock_state == ul_cancel ||
+ si->unlock_state == ul_time)
+ ; /* more specific failures ok */
+ else
+ si->unlock_state = ul_fail; /* generic failure */
+}
+
+
+Bool
+pam_priv_init (int argc, char **argv, Bool verbose_p)
+{
+ /* We have nothing to do at init-time.
+ However, we might as well do some error checking.
+ If "/etc/pam.d" exists and is a directory, but "/etc/pam.d/xlock"
+ does not exist, warn that PAM probably isn't going to work.
+
+ This is a priv-init instead of a non-priv init in case the directory
+ is unreadable or something (don't know if that actually happens.)
+ */
+ const char dir[] = "/etc/pam.d";
+ const char file[] = "/etc/pam.d/" PAM_SERVICE_NAME;
+ const char file2[] = "/etc/pam.conf";
+ struct stat st;
+
+# ifndef S_ISDIR
+# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
+# endif
+
+ if (stat (dir, &st) == 0 && S_ISDIR(st.st_mode))
+ {
+ if (stat (file, &st) != 0)
+ fprintf (stderr,
+ "%s: warning: %s does not exist.\n"
+ "%s: password authentication via PAM is unlikely to work.\n",
+ blurb(), file, blurb());
+ }
+ else if (stat (file2, &st) == 0)
+ {
+ FILE *f = fopen (file2, "r");
+ if (f)
+ {
+ Bool ok = False;
+ char buf[255];
+ while (fgets (buf, sizeof(buf), f))
+ if (strstr (buf, PAM_SERVICE_NAME))
+ {
+ ok = True;
+ break;
+ }
+ fclose (f);
+ if (!ok)
+ {
+ fprintf (stderr,
+ "%s: warning: %s does not list the `%s' service.\n"
+ "%s: password authentication via PAM is unlikely to work.\n",
+ blurb(), file2, PAM_SERVICE_NAME, blurb());
+ }
+ }
+ /* else warn about file2 existing but being unreadable? */
+ }
+ else
+ {
+ fprintf (stderr,
+ "%s: warning: neither %s nor %s exist.\n"
+ "%s: password authentication via PAM is unlikely to work.\n",
+ blurb(), file2, file, blurb());
+ }
+
+ /* Return true anyway, just in case. */
+ return True;
+}
+
+
+static int
+pam_conversation (int nmsgs,
+ const struct pam_message **msg,
+ struct pam_response **resp,
+ void *vsaver_info)
+{
+ int i, ret = -1;
+ struct auth_message *messages = 0;
+ struct auth_response *authresp = 0;
+ struct pam_response *pam_responses;
+ saver_info *si = (saver_info *) vsaver_info;
+ Bool verbose_p;
+
+ /* On SunOS 5.6, the `closure' argument always comes in as random garbage. */
+ si = (saver_info *) suns_pam_implementation_blows;
+
+ verbose_p = si->prefs.verbose_p;
+
+ /* Converting the PAM prompts into the XScreenSaver native format.
+ * It was a design goal to collapse (INFO,PROMPT) pairs from PAM
+ * into a single call to the unlock_cb function. The unlock_cb function
+ * does that, but only if it is passed several prompts at a time. Most PAM
+ * modules only send a single prompt at a time, but because there is no way
+ * of telling whether there will be more prompts to follow, we can only ever
+ * pass along whatever was passed in here.
+ */
+
+ messages = calloc(nmsgs, sizeof(struct auth_message));
+ pam_responses = calloc(nmsgs, sizeof(*pam_responses));
+
+ if (!pam_responses || !messages)
+ goto end;
+
+ if (verbose_p)
+ fprintf (stderr, "%s: pam_conversation (", blurb());
+
+ for (i = 0; i < nmsgs; ++i)
+ {
+ if (verbose_p && i > 0) fprintf (stderr, ", ");
+
+ messages[i].msg = msg[i]->msg;
+
+ switch (msg[i]->msg_style) {
+ case PAM_PROMPT_ECHO_OFF: messages[i].type = AUTH_MSGTYPE_PROMPT_NOECHO;
+ if (verbose_p) fprintf (stderr, "ECHO_OFF");
+ break;
+ case PAM_PROMPT_ECHO_ON: messages[i].type = AUTH_MSGTYPE_PROMPT_ECHO;
+ if (verbose_p) fprintf (stderr, "ECHO_ON");
+ break;
+ case PAM_ERROR_MSG: messages[i].type = AUTH_MSGTYPE_ERROR;
+ if (verbose_p) fprintf (stderr, "ERROR_MSG");
+ break;
+ case PAM_TEXT_INFO: messages[i].type = AUTH_MSGTYPE_INFO;
+ if (verbose_p) fprintf (stderr, "TEXT_INFO");
+ break;
+ default: messages[i].type = AUTH_MSGTYPE_PROMPT_ECHO;
+ if (verbose_p) fprintf (stderr, "PROMPT_ECHO");
+ break;
+ }
+
+ if (verbose_p)
+ fprintf (stderr, "=\"%s\"", msg[i]->msg ? msg[i]->msg : "(null)");
+ }
+
+ if (verbose_p)
+ fprintf (stderr, ") ...\n");
+
+ ret = si->unlock_cb(nmsgs, messages, &authresp, si);
+
+ /* #### If the user times out, or hits ESC or Cancel, we return PAM_CONV_ERR,
+ and PAM logs this as an authentication failure. It would be nice if
+ there was some way to indicate that this was a "cancel" rather than
+ a "fail", so that it wouldn't show up in syslog, but I think the
+ only options are PAM_SUCCESS and PAM_CONV_ERR. (I think that
+ PAM_ABORT means "internal error", not "cancel".) Bleh.
+ */
+
+ if (ret == 0)
+ {
+ for (i = 0; i < nmsgs; ++i)
+ pam_responses[i].resp = authresp[i].response;
+ }
+
+end:
+ if (messages)
+ free(messages);
+
+ if (authresp)
+ free(authresp);
+
+ if (verbose_p)
+ fprintf (stderr, "%s: pam_conversation (...) ==> %s\n", blurb(),
+ (ret == 0 ? "PAM_SUCCESS" : "PAM_CONV_ERR"));
+
+ if (ret == 0)
+ {
+ *resp = pam_responses;
+ return PAM_SUCCESS;
+ }
+
+ /* Failure only */
+ if (pam_responses)
+ free(pam_responses);
+
+ return PAM_CONV_ERR;
+}
+
+#endif /* NO_LOCKING -- whole file */
diff --git a/driver/passwd-pwent.c b/driver/passwd-pwent.c
new file mode 100644
index 0000000..bb0edfc
--- /dev/null
+++ b/driver/passwd-pwent.c
@@ -0,0 +1,312 @@
+/* passwd-pwent.c --- verifying typed passwords with the OS.
+ * xscreensaver, Copyright (c) 1993-1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifndef NO_LOCKING /* whole file */
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#ifdef HAVE_CRYPT_H
+# include <crypt.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#ifndef VMS
+# include <pwd.h>
+# include <grp.h>
+#else /* VMS */
+# include "vms-pwd.h"
+#endif /* VMS */
+
+
+#ifdef __bsdi__
+# include <sys/param.h>
+# if _BSDI_VERSION >= 199608
+# define BSD_AUTH
+# endif
+#endif /* __bsdi__ */
+
+
+#if defined(HAVE_SHADOW_PASSWD) /* passwds live in /etc/shadow */
+
+# include <shadow.h>
+# define PWTYPE struct spwd *
+# define PWPSLOT sp_pwdp
+# define GETPW getspnam
+
+#elif defined(HAVE_ENHANCED_PASSWD) /* passwds live in /tcb/files/auth/ */
+ /* M.Matsumoto <matsu@yao.sharp.co.jp> */
+# include <sys/security.h>
+# include <prot.h>
+
+# define PWTYPE struct pr_passwd *
+# define PWPSLOT ufld.fd_encrypt
+# define GETPW getprpwnam
+
+#elif defined(HAVE_ADJUNCT_PASSWD)
+
+# include <sys/label.h>
+# include <sys/audit.h>
+# include <pwdadj.h>
+
+# define PWTYPE struct passwd_adjunct *
+# define PWPSLOT pwa_passwd
+# define GETPW getpwanam
+
+#elif defined(HAVE_HPUX_PASSWD)
+
+# include <hpsecurity.h>
+# include <prot.h>
+
+# define PWTYPE struct s_passwd *
+# define PWPSLOT pw_passwd
+# define GETPW getspwnam
+
+# define HAVE_BIGCRYPT
+
+#endif
+
+
+/* blargh */
+#undef Bool
+#undef True
+#undef False
+#define Bool int
+#define True 1
+#define False 0
+
+
+extern const char *blurb(void);
+
+static char *encrypted_root_passwd = 0;
+static char *encrypted_user_passwd = 0;
+
+#ifdef VMS
+# define ROOT "SYSTEM"
+#else
+# define ROOT "root"
+#endif
+
+#ifndef VMS
+Bool pwent_priv_init (int argc, char **argv, Bool verbose_p);
+Bool pwent_lock_init (int argc, char **argv, Bool verbose_p);
+Bool pwent_passwd_valid_p (const char *typed_passwd, Bool verbose_p);
+#endif
+
+
+#ifndef VMS
+
+static char *
+user_name (void)
+{
+ /* I think that just checking $USER here is not the best idea. */
+
+ const char *u = 0;
+
+ /* It has been reported that getlogin() returns the wrong user id on some
+ very old SGI systems... And I've seen it return the string "rlogin"
+ sometimes! Screw it, using getpwuid() should be enough...
+ */
+/* u = (char *) getlogin ();
+ */
+
+ /* getlogin() fails if not attached to a terminal; in that case, use
+ getpwuid(). (Note that in this case, we're not doing shadow stuff, since
+ all we're interested in is the name, not the password. So that should
+ still work. Right?) */
+ if (!u || !*u)
+ {
+ struct passwd *p = getpwuid (getuid ());
+ u = (p ? p->pw_name : 0);
+ }
+
+ return (u ? strdup(u) : 0);
+}
+
+#else /* VMS */
+
+static char *
+user_name (void)
+{
+ char *u = getenv("USER");
+ return (u ? strdup(u) : 0);
+}
+
+#endif /* VMS */
+
+
+static Bool
+passwd_known_p (const char *pw)
+{
+ return (pw &&
+ pw[0] != '*' && /* This would be sensible... */
+ strlen(pw) > 4); /* ...but this is what Solaris does. */
+}
+
+
+static char *
+get_encrypted_passwd(const char *user)
+{
+ char *result = 0;
+
+#ifdef PWTYPE
+ if (user && *user && !result)
+ { /* First check the shadow passwords. */
+ PWTYPE p = GETPW((char *) user);
+ if (p && passwd_known_p (p->PWPSLOT))
+ result = strdup(p->PWPSLOT);
+ }
+#endif /* PWTYPE */
+
+ if (user && *user && !result)
+ { /* Check non-shadow passwords too. */
+ struct passwd *p = getpwnam(user);
+ if (p && passwd_known_p (p->pw_passwd))
+ result = strdup(p->pw_passwd);
+ }
+
+ /* The manual for passwd(4) on HPUX 10.10 says:
+
+ Password aging is put in effect for a particular user if his
+ encrypted password in the password file is followed by a comma and
+ a nonnull string of characters from the above alphabet. This
+ string defines the "age" needed to implement password aging.
+
+ So this means that passwd->pw_passwd isn't simply a string of cyphertext,
+ it might have trailing junk. So, if there is a comma in the string, and
+ that comma is beyond position 13, terminate the string before the comma.
+ */
+ if (result && strlen(result) > 13)
+ {
+ char *s = strchr (result+13, ',');
+ if (s)
+ *s = 0;
+ }
+
+#ifndef HAVE_PAM
+ /* We only issue this warning if not compiled with support for PAM.
+ If we're using PAM, it's not unheard of that normal pwent passwords
+ would be unavailable. */
+
+ if (!result)
+ fprintf (stderr, "%s: couldn't get password of \"%s\"\n",
+ blurb(), (user ? user : "(null)"));
+#endif /* !HAVE_PAM */
+
+ return result;
+}
+
+
+
+/* This has to be called before we've changed our effective user ID,
+ because it might need privileges to get at the encrypted passwords.
+ Returns false if we weren't able to get any passwords, and therefore,
+ locking isn't possible. (It will also have written to stderr.)
+ */
+
+#ifndef VMS
+
+Bool
+pwent_priv_init (int argc, char **argv, Bool verbose_p)
+{
+ char *u;
+
+#ifdef HAVE_ENHANCED_PASSWD
+ set_auth_parameters(argc, argv);
+ check_auth_parameters();
+#endif /* HAVE_DEC_ENHANCED */
+
+ u = user_name();
+ encrypted_user_passwd = get_encrypted_passwd(u);
+ encrypted_root_passwd = get_encrypted_passwd(ROOT);
+ if (u) free (u);
+
+ if (encrypted_user_passwd)
+ return True;
+ else
+ return False;
+}
+
+
+Bool
+pwent_lock_init (int argc, char **argv, Bool verbose_p)
+{
+ if (encrypted_user_passwd)
+ return True;
+ else
+ return False;
+}
+
+
+
+static Bool
+passwds_match_p (const char *cleartext, const char *ciphertext)
+{
+ char *s = 0; /* note that on some systems, crypt() may return null */
+
+ s = (char *) crypt (cleartext, ciphertext);
+ if (s && !strcmp (s, ciphertext))
+ return True;
+
+#ifdef HAVE_BIGCRYPT
+ /* There seems to be no way to tell at runtime if an HP machine is in
+ "trusted" mode, and thereby, which of crypt() or bigcrypt() we should
+ be calling to compare passwords. So call them both, and see which
+ one works. */
+
+ s = (char *) bigcrypt (cleartext, ciphertext);
+ if (s && !strcmp (s, ciphertext))
+ return True;
+
+#endif /* HAVE_BIGCRYPT */
+
+ return False;
+}
+
+
+
+/* This can be called at any time, and says whether the typed password
+ belongs to either the logged in user (real uid, not effective); or
+ to root.
+ */
+Bool
+pwent_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
+{
+ if (encrypted_user_passwd &&
+ passwds_match_p (typed_passwd, encrypted_user_passwd))
+ return True;
+
+#ifdef ALLOW_ROOT_PASSWD
+ /* do not allow root to have a null password. */
+ else if (typed_passwd[0] &&
+ encrypted_root_passwd &&
+ passwds_match_p (typed_passwd, encrypted_root_passwd))
+ return True;
+#endif /* ALLOW_ROOT_PASSWD */
+
+ else
+ return False;
+}
+
+#else /* VMS */
+Bool pwent_lock_init (int argc, char **argv, Bool verbose_p) { return True; }
+#endif /* VMS */
+
+#endif /* NO_LOCKING -- whole file */
diff --git a/driver/passwd.c b/driver/passwd.c
new file mode 100644
index 0000000..ac5a3f0
--- /dev/null
+++ b/driver/passwd.c
@@ -0,0 +1,339 @@
+/* passwd.c --- verifying typed passwords with the OS.
+ * xscreensaver, Copyright (c) 1993-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifndef NO_LOCKING /* whole file */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include <time.h>
+#include <sys/time.h>
+
+#ifndef VMS
+# include <pwd.h> /* for getpwuid() */
+#else /* VMS */
+# include "vms-pwd.h"
+#endif /* VMS */
+
+#ifdef HAVE_SYSLOG
+# include <syslog.h>
+#endif /* HAVE_SYSLOG */
+
+#include <X11/Intrinsic.h>
+
+#include "xscreensaver.h"
+#include "auth.h"
+
+extern const char *blurb(void);
+extern void check_for_leaks (const char *where);
+
+
+/* blargh */
+#undef Bool
+#undef True
+#undef False
+#define Bool int
+#define True 1
+#define False 0
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof(*(x)))
+
+struct auth_methods {
+ const char *name;
+ Bool (*init) (int argc, char **argv, Bool verbose_p);
+ Bool (*priv_init) (int argc, char **argv, Bool verbose_p);
+ Bool (*valid_p) (const char *typed_passwd, Bool verbose_p);
+ void (*try_unlock) (saver_info *si, Bool verbose_p,
+ Bool (*valid_p)(const char *typed_passwd, Bool verbose_p));
+ Bool initted_p;
+ Bool priv_initted_p;
+};
+
+
+#ifdef HAVE_KERBEROS
+extern Bool kerberos_lock_init (int argc, char **argv, Bool verbose_p);
+extern Bool kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p);
+#endif
+#ifdef HAVE_PAM
+extern Bool pam_priv_init (int argc, char **argv, Bool verbose_p);
+extern void pam_try_unlock (saver_info *si, Bool verbose_p,
+ Bool (*valid_p)(const char *typed_passwd, Bool verbose_p));
+#endif
+#ifdef PASSWD_HELPER_PROGRAM
+extern Bool ext_priv_init (int argc, char **argv, Bool verbose_p);
+extern Bool ext_passwd_valid_p (const char *typed_passwd, Bool verbose_p);
+#endif
+extern Bool pwent_lock_init (int argc, char **argv, Bool verbose_p);
+extern Bool pwent_priv_init (int argc, char **argv, Bool verbose_p);
+extern Bool pwent_passwd_valid_p (const char *typed_passwd, Bool verbose_p);
+
+Bool lock_priv_init (int argc, char **argv, Bool verbose_p);
+Bool lock_init (int argc, char **argv, Bool verbose_p);
+Bool passwd_valid_p (const char *typed_passwd, Bool verbose_p);
+
+/* The authorization methods to try, in order.
+ Note that the last one (the pwent version) is actually two auth methods,
+ since that code tries shadow passwords, and then non-shadow passwords.
+ (It's all in the same file since the APIs are randomly nearly-identical.)
+ */
+struct auth_methods methods[] = {
+# ifdef HAVE_PAM
+ { "PAM", 0, pam_priv_init, 0, pam_try_unlock,
+ False, False },
+# endif
+# ifdef HAVE_KERBEROS
+ { "Kerberos", kerberos_lock_init, 0, kerberos_passwd_valid_p, 0,
+ False, False },
+# endif
+# ifdef PASSWD_HELPER_PROGRAM
+ { "external", 0, ext_priv_init, ext_passwd_valid_p, 0,
+ False, False },
+# endif
+ { "normal", pwent_lock_init, pwent_priv_init, pwent_passwd_valid_p, 0,
+ False, False }
+};
+
+
+Bool
+lock_priv_init (int argc, char **argv, Bool verbose_p)
+{
+ int i;
+ Bool any_ok = False;
+ for (i = 0; i < countof(methods); i++)
+ {
+ if (!methods[i].priv_init)
+ methods[i].priv_initted_p = True;
+ else
+ methods[i].priv_initted_p = methods[i].priv_init (argc, argv,
+ verbose_p);
+
+ if (methods[i].priv_initted_p)
+ any_ok = True;
+ else if (verbose_p)
+ fprintf (stderr, "%s: initialization of %s passwords failed.\n",
+ blurb(), methods[i].name);
+ }
+ return any_ok;
+}
+
+
+Bool
+lock_init (int argc, char **argv, Bool verbose_p)
+{
+ int i;
+ Bool any_ok = False;
+ for (i = 0; i < countof(methods); i++)
+ {
+ if (!methods[i].priv_initted_p) /* Bail if lock_priv_init failed. */
+ continue;
+
+ if (!methods[i].init)
+ methods[i].initted_p = True;
+ else
+ methods[i].initted_p = methods[i].init (argc, argv, verbose_p);
+
+ if (methods[i].initted_p)
+ any_ok = True;
+ else if (verbose_p)
+ fprintf (stderr, "%s: initialization of %s passwords failed.\n",
+ blurb(), methods[i].name);
+ }
+ return any_ok;
+}
+
+
+/* A basic auth driver that simply prompts for a password then runs it through
+ * valid_p to determine whether the password is correct.
+ */
+static void
+try_unlock_password(saver_info *si,
+ Bool verbose_p,
+ Bool (*valid_p)(const char *typed_passwd, Bool verbose_p))
+{
+ struct auth_message message;
+ struct auth_response *response = NULL;
+
+ memset(&message, 0, sizeof(message));
+
+ if (verbose_p)
+ fprintf(stderr, "%s: non-PAM password auth.\n", blurb());
+
+ /* Call the auth_conv function with "Password:", then feed
+ * the result into valid_p()
+ */
+ message.type = AUTH_MSGTYPE_PROMPT_NOECHO;
+ message.msg = "Password:";
+
+ si->unlock_cb(1, &message, &response, si);
+
+ if (!response)
+ return;
+
+ if (valid_p (response->response, verbose_p))
+ si->unlock_state = ul_success; /* yay */
+ else if (si->unlock_state == ul_cancel ||
+ si->unlock_state == ul_time)
+ ; /* more specific failures ok */
+ else
+ si->unlock_state = ul_fail; /* generic failure */
+
+ if (response->response)
+ free(response->response);
+ free(response);
+}
+
+
+/* Write a password failure to the system log.
+ */
+static void
+do_syslog (saver_info *si, Bool verbose_p)
+{
+# ifdef HAVE_SYSLOG
+ struct passwd *pw = getpwuid (getuid ());
+ char *d = DisplayString (si->dpy);
+ char *u = (pw && pw->pw_name ? pw->pw_name : "???");
+ int opt = 0;
+ int fac = 0;
+
+# ifdef LOG_PID
+ opt = LOG_PID;
+# endif
+
+# if defined(LOG_AUTHPRIV)
+ fac = LOG_AUTHPRIV;
+# elif defined(LOG_AUTH)
+ fac = LOG_AUTH;
+# else
+ fac = LOG_DAEMON;
+# endif
+
+ if (!d) d = "";
+
+# undef FMT
+# define FMT "FAILED LOGIN %d ON DISPLAY \"%s\", FOR \"%s\""
+
+ if (verbose_p)
+ fprintf (stderr, "%s: syslog: " FMT "\n", blurb(),
+ si->unlock_failures, d, u);
+
+ openlog (progname, opt, fac);
+ syslog (LOG_NOTICE, FMT, si->unlock_failures, d, u);
+ closelog ();
+
+# endif /* HAVE_SYSLOG */
+}
+
+
+
+/**
+ * Runs through each authentication driver calling its try_unlock function.
+ * Called xss_authenticate() because AIX beat us to the name authenticate().
+ */
+void
+xss_authenticate(saver_info *si, Bool verbose_p)
+{
+ int i, j;
+
+ si->unlock_state = ul_read;
+
+ for (i = 0; i < countof(methods); i++)
+ {
+ if (!methods[i].initted_p)
+ continue;
+
+ if (si->cached_passwd != NULL && methods[i].valid_p)
+ si->unlock_state = (methods[i].valid_p(si->cached_passwd, verbose_p) == True)
+ ? ul_success : ul_fail;
+ else if (methods[i].try_unlock != NULL)
+ methods[i].try_unlock(si, verbose_p, methods[i].valid_p);
+ else if (methods[i].valid_p)
+ try_unlock_password(si, verbose_p, methods[i].valid_p);
+ else /* Ze goggles, zey do nozing! */
+ fprintf(stderr, "%s: authentication method %s does nothing.\n",
+ blurb(), methods[i].name);
+
+ check_for_leaks (methods[i].name);
+
+ /* If password authentication failed, but the password was NULL
+ (meaning the user just hit RET) then treat that as "cancel".
+ This means that if the password is literally NULL, it will
+ work; but if not, then NULL passwords are treated as cancel.
+ */
+ if (si->unlock_state == ul_fail &&
+ si->cached_passwd &&
+ !*si->cached_passwd)
+ {
+ fprintf (stderr, "%s: assuming null password means cancel.\n",
+ blurb());
+ si->unlock_state = ul_cancel;
+ }
+
+ if (si->unlock_state == ul_success)
+ {
+ /* If we successfully authenticated by method N, but attempting
+ to authenticate by method N-1 failed, mention that (since if
+ an earlier authentication method fails and a later one succeeds,
+ something screwy is probably going on.)
+ */
+ if (verbose_p && i > 0)
+ {
+ for (j = 0; j < i; j++)
+ if (methods[j].initted_p)
+ fprintf (stderr,
+ "%s: authentication via %s failed.\n",
+ blurb(), methods[j].name);
+ fprintf (stderr,
+ "%s: authentication via %s succeeded.\n",
+ blurb(), methods[i].name);
+ }
+ goto DONE; /* Successfully authenticated! */
+ }
+ else if (si->unlock_state == ul_cancel ||
+ si->unlock_state == ul_time)
+ {
+ /* If any auth method gets a cancel or timeout, don't try the
+ next auth method! We're done! */
+ fprintf (stderr,
+ "%s: authentication via %s %s.\n",
+ blurb(), methods[i].name,
+ (si->unlock_state == ul_cancel
+ ? "cancelled" : "timed out"));
+ goto DONE;
+ }
+ }
+
+ if (verbose_p)
+ fprintf(stderr, "%s: All authentication mechanisms failed.\n", blurb());
+
+ if (si->unlock_state == ul_fail)
+ {
+ /* Note the time of the first failure */
+ if (si->unlock_failures == 0)
+ si->unlock_failure_time = time((time_t *) 0);
+ si->unlock_failures++;
+ do_syslog (si, verbose_p);
+ }
+
+DONE:
+ if (si->auth_finished_cb)
+ si->auth_finished_cb (si);
+}
+
+#endif /* NO_LOCKING -- whole file */
diff --git a/driver/pdf2jpeg.m b/driver/pdf2jpeg.m
new file mode 100644
index 0000000..d681b4a
--- /dev/null
+++ b/driver/pdf2jpeg.m
@@ -0,0 +1,152 @@
+/* pdf2jpeg -- converts a PDF file to a JPEG file, using Cocoa
+ *
+ * Copyright (c) 2003, 2008 by Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Inspired by clues provided by Jan Kujawa and Jonathan Hendry.
+ */
+
+#import <Cocoa/Cocoa.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main (int argc, char** argv)
+{
+ const char *progname = argv[0];
+ const char *infile = 0, *outfile = 0;
+ double compression = 0.85;
+ double scale = 1.0;
+ int verbose = 0;
+ int i;
+
+ for (i = 1; i < argc; i++)
+ {
+ char c;
+ if (argv[i][0] == '-' && argv[i][1] == '-')
+ argv[i]++;
+ if (!strcmp (argv[i], "-q") ||
+ !strcmp (argv[i], "-qual") ||
+ !strcmp (argv[i], "-quality"))
+ {
+ int q;
+ if (1 != sscanf (argv[++i], " %d %c", &q, &c) ||
+ q < 5 || q > 100)
+ {
+ fprintf (stderr, "%s: quality must be 5 - 100 (%d)\n",
+ progname, q);
+ goto USAGE;
+ }
+ compression = q / 100.0;
+ }
+ else if (!strcmp (argv[i], "-scale"))
+ {
+ float s;
+ if (1 != sscanf (argv[++i], " %f %c", &s, &c) ||
+ s <= 0 || s > 50)
+ {
+ fprintf (stderr, "%s: scale must be 0.0 - 50.0 (%f)\n",
+ progname, s);
+ goto USAGE;
+ }
+ scale = s;
+ }
+ else if (!strcmp (argv[i], "-verbose"))
+ verbose++;
+ else if (!strcmp (argv[i], "-v") ||
+ !strcmp (argv[i], "-vv") ||
+ !strcmp (argv[i], "-vvv"))
+ verbose += strlen(argv[i])-1;
+ else if (argv[i][0] == '-')
+ {
+ fprintf (stderr, "%s: unknown option %s\n", progname, argv[i]);
+ goto USAGE;
+ }
+ else if (!infile)
+ infile = argv[i];
+ else if (!outfile)
+ outfile = argv[i];
+ else
+ {
+ USAGE:
+ fprintf (stderr,
+ "usage: %s [-verbose] [-scale N] [-quality NN] "
+ "infile.pdf outfile.jpg\n",
+ progname);
+ exit (1);
+ }
+ }
+
+ if (!infile || !outfile)
+ goto USAGE;
+
+
+ // Much of Cocoa needs one of these to be available.
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ //Need an NSApp instance to make [NSImage TIFFRepresentation] work
+ NSApp = [NSApplication sharedApplication];
+ [NSApp autorelease];
+
+ if (verbose)
+ fprintf (stderr, "%s: reading %s...\n", progname, infile);
+
+ // Load the PDF file into an NSData object:
+ NSData *pdf_data = [NSData dataWithContentsOfFile:
+ [NSString stringWithCString:infile
+ encoding:NSUTF8StringEncoding]];
+
+ // Create an NSPDFImageRep from the data:
+ NSPDFImageRep *pdf_rep = [NSPDFImageRep imageRepWithData:pdf_data];
+
+ // Create an NSImage instance
+ NSRect rect;
+ rect.size = [pdf_rep size];
+ rect.size.width *= scale;
+ rect.size.height *= scale;
+ rect.origin.x = rect.origin.y = 0;
+ NSImage *image = [[NSImage alloc] initWithSize:rect.size];
+
+ // Draw the PDFImageRep in the NSImage
+ [image lockFocus];
+ [pdf_rep drawInRect:rect];
+ [image unlockFocus];
+
+ // Load the NSImage's contents into an NSBitmapImageRep:
+ NSBitmapImageRep *bit_rep = [NSBitmapImageRep
+ imageRepWithData:[image TIFFRepresentation]];
+
+ // Write the bitmapImageRep to a JPEG file:
+ if (bit_rep == nil)
+ {
+ fprintf (stderr, "%s: error converting image?\n", argv[0]);
+ exit (1);
+ }
+
+ if (verbose)
+ fprintf (stderr, "%s: writing %s (%d%% quality)...\n",
+ progname, outfile, (int) (compression * 100));
+
+ NSDictionary *props = [NSDictionary
+ dictionaryWithObject:
+ [NSNumber numberWithFloat:compression]
+ forKey:NSImageCompressionFactor];
+ NSData *jpeg_data = [bit_rep representationUsingType:NSJPEGFileType
+ properties:props];
+
+ [jpeg_data writeToFile:
+ [NSString stringWithCString:outfile
+ encoding:NSUTF8StringEncoding]
+ atomically:YES];
+ [image release];
+
+ [pool release];
+ exit (0);
+}
diff --git a/driver/pdf2jpeg.man b/driver/pdf2jpeg.man
new file mode 100644
index 0000000..9d80dd7
--- /dev/null
+++ b/driver/pdf2jpeg.man
@@ -0,0 +1,43 @@
+.TH XScreenSaver 1 "07-Sep-2003 (4.13)" "X Version 11"
+.SH NAME
+pdf2jpeg - converts a PDF file to a JPEG file using Cocoa
+.SH SYNOPSIS
+.B pdf2jpeg
+[\--verbose] [\--quality \fINN\fP] infile.pdf outfile.jpg
+.SH DESCRIPTION
+This reads a PDF file (for example, as written by the
+.BR screencapture (1)
+program) and writes a JPEG file.
+.SH OPTIONS
+.I pdf2jpeg
+accepts the following options:
+.TP 4
+.B --verbose
+Print diagnostics.
+.TP 4
+.B --quality \fINN\fP
+JPEG compression factor. Default 85%.
+.SH BUGS
+The input and output files must be files: pipes don't work.
+
+This program is Cocoa-specific, so it won't work on non-MacOS systems.
+
+This shouldn't need to be a part of the XScreenSaver distribution at
+all, but Apple is COMPLETELY INSANE and made
+.BR screencapture (1)
+only write PDFs, with no simple way to convert that to something
+less crazy.
+.SH SEE ALSO
+.BR screencapture (1),
+.BR xscreensaver\-getimage\-desktop (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Jamie Zawinski. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 20-Oct-03.
diff --git a/driver/prefs.c b/driver/prefs.c
new file mode 100644
index 0000000..8fb029e
--- /dev/null
+++ b/driver/prefs.c
@@ -0,0 +1,1770 @@
+/* dotfile.c --- management of the ~/.xscreensaver file.
+ * xscreensaver, Copyright (c) 1998-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <time.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/param.h> /* for PATH_MAX */
+
+#include <X11/Xlib.h>
+#include <X11/Xresource.h>
+
+#ifndef VMS
+# include <pwd.h>
+#else /* VMS */
+# include "vms-pwd.h"
+#endif /* VMS */
+
+
+/* This file doesn't need the Xt headers, so stub these types out... */
+#undef XtPointer
+#define XtAppContext void*
+#define XtIntervalId void*
+#define XtPointer void*
+#define Widget void*
+
+
+/* Just in case there's something pathological about stat.h... */
+#ifndef S_IRUSR
+# define S_IRUSR 00400
+#endif
+#ifndef S_IWUSR
+# define S_IWUSR 00200
+#endif
+#ifndef S_IXUSR
+# define S_IXUSR 00100
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 00010
+#endif
+#ifndef S_IXOTH
+# define S_IXOTH 00001
+#endif
+
+
+#include "version.h"
+#include "prefs.h"
+#include "resources.h"
+
+/* don't use realpath() on fedora system */
+#ifdef _FORTIFY_SOURCE
+#undef HAVE_REALPATH
+#endif
+
+
+extern char *progname;
+extern char *progclass;
+extern const char *blurb (void);
+
+
+
+static void get_screenhacks (Display *, saver_preferences *);
+static char *format_command (const char *cmd, Bool wrap_p);
+static void merge_system_screenhacks (Display *, saver_preferences *,
+ screenhack **system_list, int count);
+static void stop_the_insanity (saver_preferences *p);
+
+
+static char *
+chase_symlinks (const char *file)
+{
+# ifdef HAVE_REALPATH
+ if (file)
+ {
+# ifndef PATH_MAX
+# ifdef MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+# else
+# define PATH_MAX 2048
+# endif
+# endif
+ char buf[PATH_MAX];
+ if (realpath (file, buf))
+ return strdup (buf);
+
+/* sprintf (buf, "%.100s: realpath %.200s", blurb(), file);
+ perror(buf);*/
+ }
+# endif /* HAVE_REALPATH */
+ return 0;
+}
+
+
+static Bool
+i_am_a_nobody (uid_t uid)
+{
+ struct passwd *p;
+
+ p = getpwnam ("nobody");
+ if (! p) p = getpwnam ("noaccess");
+ if (! p) p = getpwnam ("daemon");
+
+ if (! p) /* There is no nobody? */
+ return False;
+
+ return (uid == p->pw_uid);
+}
+
+
+const char *
+init_file_name (void)
+{
+ static char *file = 0;
+
+ if (!file)
+ {
+ uid_t uid = getuid ();
+ struct passwd *p = getpwuid (uid);
+
+ if (i_am_a_nobody (uid))
+ /* If we're running as nobody, then use root's .xscreensaver file
+ (since ~root/.xscreensaver and ~nobody/.xscreensaver are likely
+ to be different -- if we didn't do this, then xscreensaver-demo
+ would appear to have no effect when the luser is running as root.)
+ */
+ uid = 0;
+
+ p = getpwuid (uid);
+
+ if (!p || !p->pw_name || !*p->pw_name)
+ {
+ fprintf (stderr, "%s: couldn't get user info of uid %d\n",
+ blurb(), getuid ());
+ file = "";
+ }
+ else if (!p->pw_dir || !*p->pw_dir)
+ {
+ fprintf (stderr, "%s: couldn't get home directory of \"%s\"\n",
+ blurb(), (p->pw_name ? p->pw_name : "???"));
+ file = "";
+ }
+ else
+ {
+ const char *home = p->pw_dir;
+ const char *name = ".xscreensaver";
+ file = (char *) malloc(strlen(home) + strlen(name) + 2);
+ strcpy(file, home);
+ if (!*home || home[strlen(home)-1] != '/')
+ strcat(file, "/");
+ strcat(file, name);
+ }
+ }
+
+ if (file && *file)
+ return file;
+ else
+ return 0;
+}
+
+
+static const char *
+init_file_tmp_name (void)
+{
+ static char *file = 0;
+ if (!file)
+ {
+ const char *name = init_file_name();
+ const char *suffix = ".tmp";
+
+ char *n2 = chase_symlinks (name);
+ if (n2) name = n2;
+
+ if (!name || !*name)
+ file = "";
+ else
+ {
+ file = (char *) malloc(strlen(name) + strlen(suffix) + 2);
+ strcpy(file, name);
+ strcat(file, suffix);
+ }
+
+ if (n2) free (n2);
+ }
+
+ if (file && *file)
+ return file;
+ else
+ return 0;
+}
+
+static int
+get_byte_resource (Display *dpy, char *name, char *class)
+{
+ char *s = get_string_resource (dpy, name, class);
+ char *s2 = s;
+ int n = 0;
+ if (!s) return 0;
+
+ while (isspace(*s2)) s2++;
+ while (*s2 >= '0' && *s2 <= '9')
+ {
+ n = (n * 10) + (*s2 - '0');
+ s2++;
+ }
+ while (isspace(*s2)) s2++;
+ if (*s2 == 'k' || *s2 == 'K') n <<= 10;
+ else if (*s2 == 'm' || *s2 == 'M') n <<= 20;
+ else if (*s2 == 'g' || *s2 == 'G') n <<= 30;
+ else if (*s2)
+ {
+ LOSE:
+ fprintf (stderr, "%s: %s must be a number of bytes, not \"%s\".\n",
+ progname, name, s);
+ free (s);
+ return 0;
+ }
+ s2++;
+ if (*s2 == 'b' || *s2 == 'B') s2++;
+ while (isspace(*s2)) s2++;
+ if (*s2) goto LOSE;
+
+ free (s);
+ return n;
+}
+
+
+static const char * const prefs[] = {
+ "timeout",
+ "cycle",
+ "lock",
+ "lockVTs", /* not saved */
+ "lockTimeout",
+ "passwdTimeout",
+ "visualID",
+ "installColormap",
+ "verbose",
+ "timestamp",
+ "splash",
+ "splashDuration",
+ "quad",
+ "demoCommand",
+ "prefsCommand",
+ "newLoginCommand",
+ "helpURL", /* not saved */
+ "loadURL", /* not saved */
+ "newLoginCommand", /* not saved */
+ "nice",
+ "memoryLimit",
+ "fade",
+ "unfade",
+ "fadeSeconds",
+ "fadeTicks",
+ "captureStderr",
+ "captureStdout", /* not saved -- obsolete */
+ "logFile", /* not saved */
+ "ignoreUninstalledPrograms",
+ "font",
+ "dpmsEnabled",
+ "dpmsQuickOff",
+ "dpmsStandby",
+ "dpmsSuspend",
+ "dpmsOff",
+ "grabDesktopImages",
+ "grabVideoFrames",
+ "chooseRandomImages",
+ "imageDirectory",
+ "mode",
+ "selected",
+ "textMode",
+ "textLiteral",
+ "textFile",
+ "textProgram",
+ "textURL",
+ "",
+ "programs",
+ "",
+ "pointerPollTime",
+ "pointerHysteresis",
+ "windowCreationTimeout",
+ "initialDelay",
+ "sgiSaverExtension", /* not saved -- obsolete */
+ "mitSaverExtension", /* not saved -- obsolete */
+ "xidleExtension", /* not saved -- obsolete */
+ "GetViewPortIsFullOfLies",
+ "procInterrupts",
+ "xinputExtensionDev",
+ "overlayStderr",
+ "overlayTextBackground", /* not saved -- X resources only */
+ "overlayTextForeground", /* not saved -- X resources only */
+ "bourneShell", /* not saved -- X resources only */
+ "authWarningSlack",
+ 0
+};
+
+static char *
+strip (char *s)
+{
+ char *s2;
+ while (*s == '\t' || *s == ' ' || *s == '\r' || *s == '\n')
+ s++;
+ for (s2 = s; *s2; s2++)
+ ;
+ for (s2--; s2 >= s; s2--)
+ if (*s2 == '\t' || *s2 == ' ' || *s2 == '\r' || *s2 =='\n')
+ *s2 = 0;
+ else
+ break;
+ return s;
+}
+
+
+/* Reading
+ */
+
+static int
+handle_entry (XrmDatabase *db, const char *key, const char *value,
+ const char *filename, int line)
+{
+ int i;
+ for (i = 0; prefs[i]; i++)
+ if (*prefs[i] && !strcasecmp(key, prefs[i]))
+ {
+ char *val = strdup(value);
+ char *spec = (char *) malloc(strlen(progclass) + strlen(prefs[i]) +10);
+ strcpy(spec, progclass);
+ strcat(spec, ".");
+ strcat(spec, prefs[i]);
+
+ XrmPutStringResource (db, spec, val);
+
+ free(spec);
+ free(val);
+ return 0;
+ }
+
+ fprintf(stderr, "%s: %s:%d: unknown option \"%s\"\n",
+ blurb(), filename, line, key);
+ return 1;
+}
+
+
+static int
+parse_init_file (saver_preferences *p)
+{
+ time_t write_date = 0;
+ const char *name = init_file_name();
+ int line = 0;
+ struct stat st;
+ FILE *in;
+ int buf_size = 1024;
+ char *buf;
+
+ if (!name) return 0;
+
+ if (stat(name, &st) != 0)
+ {
+ p->init_file_date = 0;
+ return 0;
+ }
+
+ in = fopen(name, "r");
+ if (!in)
+ {
+ char *buf = (char *) malloc(1024 + strlen(name));
+ sprintf(buf, "%s: error reading \"%s\"", blurb(), name);
+ perror(buf);
+ free(buf);
+ return -1;
+ }
+
+ if (fstat (fileno(in), &st) == 0)
+ {
+ write_date = st.st_mtime;
+ }
+ else
+ {
+ char *buf = (char *) malloc(1024 + strlen(name));
+ sprintf(buf, "%s: couldn't re-stat \"%s\"", blurb(), name);
+ perror(buf);
+ free(buf);
+ return -1;
+ }
+
+ buf = (char *) malloc(buf_size);
+
+ while (fgets (buf, buf_size-1, in))
+ {
+ char *key, *value;
+ int L = strlen(buf);
+
+ line++;
+ while (L > 2 &&
+ (buf[L-1] != '\n' || /* whole line didn't fit in buffer */
+ buf[L-2] == '\\')) /* or line ended with backslash */
+ {
+ if (buf[L-2] == '\\') /* backslash-newline gets swallowed */
+ {
+ buf[L-2] = 0;
+ L -= 2;
+ }
+ buf_size += 1024;
+ buf = (char *) realloc(buf, buf_size);
+ if (!buf) exit(1);
+
+ line++;
+ if (!fgets (buf + L, buf_size-L-1, in))
+ break;
+ L = strlen(buf);
+ }
+
+ /* Now handle other backslash escapes. */
+ {
+ int i, j;
+ for (i = 0; buf[i]; i++)
+ if (buf[i] == '\\')
+ {
+ switch (buf[i+1])
+ {
+ case 'n': buf[i] = '\n'; break;
+ case 'r': buf[i] = '\r'; break;
+ case 't': buf[i] = '\t'; break;
+ default: buf[i] = buf[i+1]; break;
+ }
+ for (j = i+2; buf[j]; j++)
+ buf[j-1] = buf[j];
+ buf[j-1] = 0;
+ }
+ }
+
+ key = strip(buf);
+
+ if (*key == '#' || *key == '!' || *key == ';' ||
+ *key == '\n' || *key == 0)
+ continue;
+
+ value = strchr (key, ':');
+ if (!value)
+ {
+ fprintf(stderr, "%s: %s:%d: unparsable line: %s\n", blurb(),
+ name, line, key);
+ continue;
+ }
+ else
+ {
+ *value++ = 0;
+ value = strip(value);
+ }
+
+ if (!p->db) abort();
+ handle_entry (&p->db, key, value, name, line);
+ }
+ fclose (in);
+ free(buf);
+
+ p->init_file_date = write_date;
+ return 0;
+}
+
+
+Bool
+init_file_changed_p (saver_preferences *p)
+{
+ const char *name = init_file_name();
+ struct stat st;
+
+ if (!name) return False;
+
+ if (stat(name, &st) != 0)
+ return False;
+
+ if (p->init_file_date == st.st_mtime)
+ return False;
+
+ return True;
+}
+
+
+/* Writing
+ */
+
+static int
+tab_to (FILE *out, int from, int to)
+{
+ int tab_width = 8;
+ int to_mod = (to / tab_width) * tab_width;
+ while (from < to_mod)
+ {
+ fprintf(out, "\t");
+ from = (((from / tab_width) + 1) * tab_width);
+ }
+ while (from < to)
+ {
+ fprintf(out, " ");
+ from++;
+ }
+ return from;
+}
+
+static char *
+stab_to (char *out, int from, int to)
+{
+ int tab_width = 8;
+ int to_mod = (to / tab_width) * tab_width;
+ while (from < to_mod)
+ {
+ *out++ = '\t';
+ from = (((from / tab_width) + 1) * tab_width);
+ }
+ while (from < to)
+ {
+ *out++ = ' ';
+ from++;
+ }
+ return out;
+}
+
+static int
+string_columns (const char *string, int length, int start)
+{
+ int tab_width = 8;
+ int col = start;
+ const char *end = string + length;
+ while (string < end)
+ {
+ if (*string == '\n')
+ col = 0;
+ else if (*string == '\t')
+ col = (((col / tab_width) + 1) * tab_width);
+ else
+ col++;
+ string++;
+ }
+ return col;
+}
+
+
+static void
+write_entry (FILE *out, const char *key, const char *value)
+{
+ char *v = strdup(value ? value : "");
+ char *v2 = v;
+ char *nl = 0;
+ int col;
+ Bool programs_p = (!strcmp(key, "programs"));
+ int tab = (programs_p ? 32 : 16);
+ Bool first = True;
+
+ fprintf(out, "%s:", key);
+ col = strlen(key) + 1;
+
+ if (strlen(key) > 14)
+ col = tab_to (out, col, 20);
+
+ while (1)
+ {
+ if (!programs_p)
+ v2 = strip(v2);
+ nl = strchr(v2, '\n');
+ if (nl)
+ *nl = 0;
+
+ if (first && programs_p)
+ {
+ col = tab_to (out, col, 77);
+ fprintf (out, " \\\n");
+ col = 0;
+ }
+
+ if (first)
+ first = False;
+ else
+ {
+ col = tab_to (out, col, 75);
+ fprintf (out, " \\n\\\n");
+ col = 0;
+ }
+
+ if (!programs_p)
+ col = tab_to (out, col, tab);
+
+ if (programs_p &&
+ string_columns(v2, strlen (v2), col) + col > 75)
+ {
+ int L = strlen (v2);
+ int start = 0;
+ int end = start;
+ while (start < L)
+ {
+ while (v2[end] == ' ' || v2[end] == '\t')
+ end++;
+ while (v2[end] != ' ' && v2[end] != '\t' &&
+ v2[end] != '\n' && v2[end] != 0)
+ end++;
+ if (string_columns (v2 + start, (end - start), col) >= 74)
+ {
+ col = tab_to (out, col, 75);
+ fprintf(out, " \\\n");
+ col = tab_to (out, 0, tab + 2);
+ while (v2[start] == ' ' || v2[start] == '\t')
+ start++;
+ }
+
+ col = string_columns (v2 + start, (end - start), col);
+ while (start < end)
+ fputc(v2[start++], out);
+ }
+ }
+ else
+ {
+ fprintf (out, "%s", v2);
+ col += string_columns(v2, strlen (v2), col);
+ }
+
+ if (nl)
+ v2 = nl + 1;
+ else
+ break;
+ }
+
+ fprintf(out, "\n");
+ free(v);
+}
+
+int
+write_init_file (Display *dpy,
+ saver_preferences *p, const char *version_string,
+ Bool verbose_p)
+{
+ int status = -1;
+ const char *name = init_file_name();
+ const char *tmp_name = init_file_tmp_name();
+ char *n2 = chase_symlinks (name);
+ struct stat st;
+ int i, j;
+
+ /* Kludge, since these aren't in the saver_preferences struct as strings...
+ */
+ char *visual_name;
+ char *programs;
+ Bool overlay_stderr_p;
+ char *stderr_font;
+ FILE *out;
+
+ if (!name) goto END;
+
+ if (n2) name = n2;
+
+ /* Throttle the various timeouts to reasonable values before writing
+ the file to disk. */
+ stop_the_insanity (p);
+
+
+ if (verbose_p)
+ fprintf (stderr, "%s: writing \"%s\".\n", blurb(), name);
+
+ unlink (tmp_name);
+ out = fopen(tmp_name, "w");
+ if (!out)
+ {
+ char *buf = (char *) malloc(1024 + strlen(name));
+ sprintf(buf, "%s: error writing \"%s\"", blurb(), name);
+ perror(buf);
+ free(buf);
+ goto END;
+ }
+
+ /* Give the new .xscreensaver file the same permissions as the old one;
+ except ensure that it is readable and writable by owner, and not
+ executable. Extra hack: if we're running as root, make the file
+ be world-readable (so that the daemon, running as "nobody", will
+ still be able to read it.)
+ */
+ if (stat(name, &st) == 0)
+ {
+ mode_t mode = st.st_mode;
+ mode |= S_IRUSR | S_IWUSR; /* read/write by user */
+ mode &= ~(S_IXUSR | S_IXGRP | S_IXOTH); /* executable by none */
+
+ if (getuid() == (uid_t) 0) /* read by group/other */
+ mode |= S_IRGRP | S_IROTH;
+
+ if (fchmod (fileno(out), mode) != 0)
+ {
+ char *buf = (char *) malloc(1024 + strlen(name));
+ sprintf (buf, "%s: error fchmodding \"%s\" to 0%o", blurb(),
+ tmp_name, (unsigned int) mode);
+ perror(buf);
+ free(buf);
+ goto END;
+ }
+ }
+
+ /* Kludge, since these aren't in the saver_preferences struct... */
+ visual_name = get_string_resource (dpy, "visualID", "VisualID");
+ programs = 0;
+ overlay_stderr_p = get_boolean_resource (dpy, "overlayStderr", "Boolean");
+ stderr_font = get_string_resource (dpy, "font", "Font");
+
+ i = 0;
+ {
+ char *ss;
+ char **hack_strings = (char **)
+ calloc (p->screenhacks_count, sizeof(char *));
+
+ for (j = 0; j < p->screenhacks_count; j++)
+ {
+ hack_strings[j] = format_hack (dpy, p->screenhacks[j], True);
+ i += strlen (hack_strings[j]);
+ i += 2;
+ }
+
+ ss = programs = (char *) malloc(i + 10);
+ *ss = 0;
+ for (j = 0; j < p->screenhacks_count; j++)
+ {
+ strcat (ss, hack_strings[j]);
+ free (hack_strings[j]);
+ ss += strlen(ss);
+ *ss++ = '\n';
+ *ss = 0;
+ }
+ free (hack_strings);
+ }
+
+ {
+ struct passwd *pw = getpwuid (getuid ());
+ char *whoami = (pw && pw->pw_name && *pw->pw_name
+ ? pw->pw_name
+ : "<unknown>");
+ time_t now = time ((time_t *) 0);
+ char *timestr = (char *) ctime (&now);
+ char *nl = (char *) strchr (timestr, '\n');
+ if (nl) *nl = 0;
+ fprintf (out,
+ "# %s Preferences File\n"
+ "# Written by %s %s for %s on %s.\n"
+ "# https://www.jwz.org/xscreensaver/\n"
+ "\n",
+ progclass, progname, version_string, whoami, timestr);
+ }
+
+ for (j = 0; prefs[j]; j++)
+ {
+ char buf[255];
+ const char *pr = prefs[j];
+ enum pref_type { pref_str, pref_int, pref_bool, pref_byte, pref_time
+ } type = pref_str;
+ const char *s = 0;
+ int i = 0;
+ Bool b = False;
+ Time t = 0;
+
+ if (pr && !*pr)
+ {
+ fprintf(out, "\n");
+ continue;
+ }
+
+# undef CHECK
+# define CHECK(X) else if (!strcmp(pr, X))
+ if (!pr || !*pr) ;
+ CHECK("timeout") type = pref_time, t = p->timeout;
+ CHECK("cycle") type = pref_time, t = p->cycle;
+ CHECK("lock") type = pref_bool, b = p->lock_p;
+ CHECK("lockVTs") continue; /* don't save, unused */
+ CHECK("lockTimeout") type = pref_time, t = p->lock_timeout;
+ CHECK("passwdTimeout") type = pref_time, t = p->passwd_timeout;
+ CHECK("visualID") type = pref_str, s = visual_name;
+ CHECK("installColormap") type = pref_bool, b = p->install_cmap_p;
+ CHECK("verbose") type = pref_bool, b = p->verbose_p;
+ CHECK("timestamp") type = pref_bool, b = p->timestamp_p;
+ CHECK("splash") type = pref_bool, b = p->splash_p;
+ CHECK("splashDuration") type = pref_time, t = p->splash_duration;
+# ifdef QUAD_MODE
+ CHECK("quad") type = pref_bool, b = p->quad_p;
+# else /* !QUAD_MODE */
+ CHECK("quad") continue; /* don't save */
+# endif /* !QUAD_MODE */
+ CHECK("demoCommand") type = pref_str, s = p->demo_command;
+ CHECK("prefsCommand") type = pref_str, s = p->prefs_command;
+/* CHECK("helpURL") type = pref_str, s = p->help_url; */
+ CHECK("helpURL") continue; /* don't save */
+/* CHECK("loadURL") type = pref_str, s = p->load_url_command; */
+ CHECK("loadURL") continue; /* don't save */
+/* CHECK("newLoginCommand") type = pref_str, s = p->new_login_command; */
+ CHECK("newLoginCommand") continue; /* don't save */
+ CHECK("nice") type = pref_int, i = p->nice_inferior;
+ CHECK("memoryLimit") type = pref_byte, i = p->inferior_memory_limit;
+ CHECK("fade") type = pref_bool, b = p->fade_p;
+ CHECK("unfade") type = pref_bool, b = p->unfade_p;
+ CHECK("fadeSeconds") type = pref_time, t = p->fade_seconds;
+ CHECK("fadeTicks") type = pref_int, i = p->fade_ticks;
+ CHECK("captureStderr") type = pref_bool, b = p->capture_stderr_p;
+ CHECK("captureStdout") continue; /* don't save */
+ CHECK("logFile") continue; /* don't save */
+ CHECK("ignoreUninstalledPrograms")
+ type = pref_bool, b = p->ignore_uninstalled_p;
+
+ CHECK("font") type = pref_str, s = stderr_font;
+
+ CHECK("dpmsEnabled") type = pref_bool, b = p->dpms_enabled_p;
+ CHECK("dpmsQuickOff") type = pref_bool, b = p->dpms_quickoff_p;
+ CHECK("dpmsStandby") type = pref_time, t = p->dpms_standby;
+ CHECK("dpmsSuspend") type = pref_time, t = p->dpms_suspend;
+ CHECK("dpmsOff") type = pref_time, t = p->dpms_off;
+
+ CHECK("grabDesktopImages") type =pref_bool, b = p->grab_desktop_p;
+ CHECK("grabVideoFrames") type =pref_bool, b = p->grab_video_p;
+ CHECK("chooseRandomImages")type =pref_bool, b = p->random_image_p;
+ CHECK("imageDirectory") type =pref_str, s = p->image_directory;
+
+ CHECK("mode") type = pref_str,
+ s = (p->mode == ONE_HACK ? "one" :
+ p->mode == BLANK_ONLY ? "blank" :
+ p->mode == DONT_BLANK ? "off" :
+ p->mode == RANDOM_HACKS_SAME
+ ? "random-same"
+ : "random");
+ CHECK("selected") type = pref_int, i = p->selected_hack;
+
+ CHECK("textMode") type = pref_str,
+ s = (p->tmode == TEXT_URL ? "url" :
+ p->tmode == TEXT_LITERAL ? "literal" :
+ p->tmode == TEXT_FILE ? "file" :
+ p->tmode == TEXT_PROGRAM ? "program" :
+ "date");
+ CHECK("textLiteral") type = pref_str, s = p->text_literal;
+ CHECK("textFile") type = pref_str, s = p->text_file;
+ CHECK("textProgram") type = pref_str, s = p->text_program;
+ CHECK("textURL") type = pref_str, s = p->text_url;
+
+ CHECK("programs") type = pref_str, s = programs;
+ CHECK("pointerPollTime") type = pref_time, t = p->pointer_timeout;
+ CHECK("pointerHysteresis")type = pref_int, i = p->pointer_hysteresis;
+ CHECK("windowCreationTimeout")type=pref_time,t= p->notice_events_timeout;
+ CHECK("initialDelay") type = pref_time, t = p->initial_delay;
+ CHECK("sgiSaverExtension") continue; /* don't save */
+ CHECK("mitSaverExtension") continue; /* don't save */
+ CHECK("xidleExtension") continue; /* don't save */
+ CHECK("procInterrupts") type = pref_bool, b = p->use_proc_interrupts;
+ CHECK("xinputExtensionDev") type = pref_bool, b = p->use_xinput_extension;
+ CHECK("GetViewPortIsFullOfLies") type = pref_bool,
+ b = p->getviewport_full_of_lies_p;
+ CHECK("overlayStderr") type = pref_bool, b = overlay_stderr_p;
+ CHECK("overlayTextBackground") continue; /* don't save */
+ CHECK("overlayTextForeground") continue; /* don't save */
+ CHECK("bourneShell") continue; /* don't save */
+ CHECK("authWarningSlack") type = pref_int, i = p->auth_warning_slack;
+ else abort();
+# undef CHECK
+
+ switch (type)
+ {
+ case pref_str:
+ break;
+ case pref_int:
+ sprintf(buf, "%d", i);
+ s = buf;
+ break;
+ case pref_bool:
+ s = b ? "True" : "False";
+ break;
+ case pref_time:
+ {
+ unsigned int hour = 0, min = 0, sec = (unsigned int) (t/1000);
+ if (sec >= 60)
+ {
+ min += (sec / 60);
+ sec %= 60;
+ }
+ if (min >= 60)
+ {
+ hour += (min / 60);
+ min %= 60;
+ }
+ sprintf (buf, "%u:%02u:%02u", hour, min, sec);
+ s = buf;
+ }
+ break;
+ case pref_byte:
+ {
+ if (i >= (1<<30) && i == ((i >> 30) << 30))
+ sprintf(buf, "%dG", i >> 30);
+ else if (i >= (1<<20) && i == ((i >> 20) << 20))
+ sprintf(buf, "%dM", i >> 20);
+ else if (i >= (1<<10) && i == ((i >> 10) << 10))
+ sprintf(buf, "%dK", i >> 10);
+ else
+ sprintf(buf, "%d", i);
+ s = buf;
+ }
+ break;
+ default:
+ abort();
+ break;
+ }
+
+ if (pr && (!strcmp(pr, "mode") || !strcmp(pr, "textMode")))
+ fprintf(out, "\n");
+
+ write_entry (out, pr, s);
+ }
+
+ fprintf(out, "\n");
+
+ if (visual_name) free(visual_name);
+ if (stderr_font) free(stderr_font);
+ if (programs) free(programs);
+
+ if (fclose(out) == 0)
+ {
+ time_t write_date = 0;
+
+ if (stat(tmp_name, &st) == 0)
+ {
+ write_date = st.st_mtime;
+ }
+ else
+ {
+ char *buf = (char *) malloc(1024 + strlen(tmp_name) + strlen(name));
+ sprintf(buf, "%s: couldn't stat \"%s\"", blurb(), tmp_name);
+ perror(buf);
+ unlink (tmp_name);
+ free(buf);
+ goto END;
+ }
+
+ if (rename (tmp_name, name) != 0)
+ {
+ char *buf = (char *) malloc(1024 + strlen(tmp_name) + strlen(name));
+ sprintf(buf, "%s: error renaming \"%s\" to \"%s\"",
+ blurb(), tmp_name, name);
+ perror(buf);
+ unlink (tmp_name);
+ free(buf);
+ goto END;
+ }
+ else
+ {
+ p->init_file_date = write_date;
+
+ /* Since the .xscreensaver file is used for IPC, let's try and make
+ sure that the bits actually land on the disk right away. */
+ sync ();
+
+ status = 0; /* wrote and renamed successfully! */
+ }
+ }
+ else
+ {
+ char *buf = (char *) malloc(1024 + strlen(name));
+ sprintf(buf, "%s: error closing \"%s\"", blurb(), name);
+ perror(buf);
+ free(buf);
+ unlink (tmp_name);
+ goto END;
+ }
+
+ END:
+ if (n2) free (n2);
+ return status;
+}
+
+
+/* Parsing the resource database
+ */
+
+void
+free_screenhack (screenhack *hack)
+{
+ if (hack->visual) free (hack->visual);
+ if (hack->name) free (hack->name);
+ free (hack->command);
+ memset (hack, 0, sizeof(*hack));
+ free (hack);
+}
+
+static void
+free_screenhack_list (screenhack **list, int count)
+{
+ int i;
+ if (!list) return;
+ for (i = 0; i < count; i++)
+ if (list[i])
+ free_screenhack (list[i]);
+ free (list);
+}
+
+
+
+/* Populate `saver_preferences' with the contents of the resource database.
+ Note that this may be called multiple times -- it is re-run each time
+ the ~/.xscreensaver file is reloaded.
+
+ This function can be very noisy, since it issues resource syntax errors
+ and so on.
+ */
+void
+load_init_file (Display *dpy, saver_preferences *p)
+{
+ static Bool first_time = True;
+
+ screenhack **system_default_screenhacks = 0;
+ int system_default_screenhack_count = 0;
+
+ if (first_time)
+ {
+ /* Get the programs resource before the .xscreensaver file has been
+ parsed and merged into the resource database for the first time:
+ this is the value of *programs from the app-defaults file.
+ Then clear it out so that it will be parsed again later, after
+ the init file has been read.
+ */
+ get_screenhacks (dpy, p);
+ system_default_screenhacks = p->screenhacks;
+ system_default_screenhack_count = p->screenhacks_count;
+ p->screenhacks = 0;
+ p->screenhacks_count = 0;
+ }
+
+ if (parse_init_file (p) != 0) /* file might have gone away */
+ if (!first_time) return;
+
+ first_time = False;
+
+ p->xsync_p = get_boolean_resource (dpy, "synchronous", "Synchronous");
+ p->verbose_p = get_boolean_resource (dpy, "verbose", "Boolean");
+ p->timestamp_p = get_boolean_resource (dpy, "timestamp", "Boolean");
+ p->lock_p = get_boolean_resource (dpy, "lock", "Boolean");
+ p->fade_p = get_boolean_resource (dpy, "fade", "Boolean");
+ p->unfade_p = get_boolean_resource (dpy, "unfade", "Boolean");
+ p->fade_seconds = 1000 * get_seconds_resource (dpy, "fadeSeconds", "Time");
+ p->fade_ticks = get_integer_resource (dpy, "fadeTicks", "Integer");
+ p->install_cmap_p = get_boolean_resource (dpy, "installColormap", "Boolean");
+ p->nice_inferior = get_integer_resource (dpy, "nice", "Nice");
+ p->inferior_memory_limit = get_byte_resource (dpy, "memoryLimit",
+ "MemoryLimit");
+ p->splash_p = get_boolean_resource (dpy, "splash", "Boolean");
+# ifdef QUAD_MODE
+ p->quad_p = get_boolean_resource (dpy, "quad", "Boolean");
+# endif
+ p->capture_stderr_p = get_boolean_resource (dpy, "captureStderr", "Boolean");
+ p->ignore_uninstalled_p = get_boolean_resource (dpy,
+ "ignoreUninstalledPrograms",
+ "Boolean");
+
+ p->initial_delay = 1000 * get_seconds_resource (dpy, "initialDelay", "Time");
+ p->splash_duration = 1000 * get_seconds_resource (dpy, "splashDuration", "Time");
+ p->timeout = 1000 * get_minutes_resource (dpy, "timeout", "Time");
+ p->lock_timeout = 1000 * get_minutes_resource (dpy, "lockTimeout", "Time");
+ p->cycle = 1000 * get_minutes_resource (dpy, "cycle", "Time");
+ p->passwd_timeout = 1000 * get_seconds_resource (dpy, "passwdTimeout", "Time");
+ p->pointer_timeout = 1000 * get_seconds_resource (dpy, "pointerPollTime", "Time");
+ p->pointer_hysteresis = get_integer_resource (dpy, "pointerHysteresis","Integer");
+ p->notice_events_timeout = 1000*get_seconds_resource(dpy,
+ "windowCreationTimeout",
+ "Time");
+
+ p->dpms_enabled_p = get_boolean_resource (dpy, "dpmsEnabled", "Boolean");
+ p->dpms_quickoff_p = get_boolean_resource (dpy, "dpmsQuickOff", "Boolean");
+ p->dpms_standby = 1000 * get_minutes_resource (dpy, "dpmsStandby", "Time");
+ p->dpms_suspend = 1000 * get_minutes_resource (dpy, "dpmsSuspend", "Time");
+ p->dpms_off = 1000 * get_minutes_resource (dpy, "dpmsOff", "Time");
+
+ p->grab_desktop_p = get_boolean_resource (dpy, "grabDesktopImages", "Boolean");
+ p->grab_video_p = get_boolean_resource (dpy, "grabVideoFrames", "Boolean");
+ p->random_image_p = get_boolean_resource (dpy, "chooseRandomImages", "Boolean");
+ p->image_directory = get_string_resource (dpy,
+ "imageDirectory",
+ "ImageDirectory");
+
+ p->text_literal = get_string_resource (dpy, "textLiteral", "TextLiteral");
+ p->text_file = get_string_resource (dpy, "textFile", "TextFile");
+ p->text_program = get_string_resource (dpy, "textProgram", "TextProgram");
+ p->text_url = get_string_resource (dpy, "textURL", "TextURL");
+
+ p->shell = get_string_resource (dpy, "bourneShell", "BourneShell");
+
+ p->demo_command = get_string_resource(dpy, "demoCommand", "URL");
+ p->prefs_command = get_string_resource(dpy, "prefsCommand", "URL");
+ p->help_url = get_string_resource(dpy, "helpURL", "URL");
+ p->load_url_command = get_string_resource(dpy, "loadURL", "LoadURL");
+ p->new_login_command = get_string_resource(dpy,
+ "newLoginCommand",
+ "NewLoginCommand");
+ p->auth_warning_slack = get_integer_resource(dpy, "authWarningSlack",
+ "Integer");
+
+ /* If "*splash" is unset, default to true. */
+ {
+ char *s = get_string_resource (dpy, "splash", "Boolean");
+ if (s)
+ free (s);
+ else
+ p->splash_p = True;
+ }
+
+ /* If "*grabDesktopImages" is unset, default to true. */
+ {
+ char *s = get_string_resource (dpy, "grabDesktopImages", "Boolean");
+ if (s)
+ free (s);
+ else
+ p->grab_desktop_p = True;
+ }
+
+ p->use_xidle_extension = get_boolean_resource (dpy, "xidleExtension","Boolean");
+#if 0 /* obsolete. */
+ p->use_sgi_saver_extension = get_boolean_resource (dpy,
+ "sgiSaverExtension",
+ "Boolean");
+#endif
+#ifdef HAVE_XINPUT
+ p->use_xinput_extension = get_boolean_resource (dpy, "xinputExtensionDev",
+ "Boolean");
+#endif
+#if 0 /* broken and evil. */
+ p->use_mit_saver_extension = get_boolean_resource (dpy,
+ "mitSaverExtension",
+ "Boolean");
+#endif
+
+ p->use_proc_interrupts = get_boolean_resource (dpy,
+ "procInterrupts", "Boolean");
+
+ p->getviewport_full_of_lies_p =
+ get_boolean_resource (dpy, "GetViewPortIsFullOfLies", "Boolean");
+
+ get_screenhacks (dpy, p); /* Parse the "programs" resource. */
+
+ {
+ char *s = get_string_resource (dpy, "selected", "Integer");
+ if (!s || !*s)
+ p->selected_hack = -1;
+ else
+ p->selected_hack = get_integer_resource (dpy, "selected", "Integer");
+ if (s) free (s);
+ if (p->selected_hack < 0 || p->selected_hack >= p->screenhacks_count)
+ p->selected_hack = -1;
+ }
+
+ {
+ char *s = get_string_resource (dpy, "mode", "Mode");
+ if (s && !strcasecmp (s, "one")) p->mode = ONE_HACK;
+ else if (s && !strcasecmp (s, "blank")) p->mode = BLANK_ONLY;
+ else if (s && !strcasecmp (s, "off")) p->mode = DONT_BLANK;
+ else if (s && !strcasecmp (s, "random-same")) p->mode = RANDOM_HACKS_SAME;
+ else p->mode = RANDOM_HACKS;
+ if (s) free (s);
+ }
+
+ {
+ char *s = get_string_resource (dpy, "textMode", "TextMode");
+ if (s && !strcasecmp (s, "url")) p->tmode = TEXT_URL;
+ else if (s && !strcasecmp (s, "literal")) p->tmode = TEXT_LITERAL;
+ else if (s && !strcasecmp (s, "file")) p->tmode = TEXT_FILE;
+ else if (s && !strcasecmp (s, "program")) p->tmode = TEXT_PROGRAM;
+ else p->tmode = TEXT_DATE;
+ if (s) free (s);
+ }
+
+ if (system_default_screenhack_count) /* note: first_time is also true */
+ {
+ merge_system_screenhacks (dpy, p, system_default_screenhacks,
+ system_default_screenhack_count);
+ free_screenhack_list (system_default_screenhacks,
+ system_default_screenhack_count);
+ system_default_screenhacks = 0;
+ system_default_screenhack_count = 0;
+ }
+
+ if (p->debug_p)
+ {
+ p->xsync_p = True;
+ p->verbose_p = True;
+ p->timestamp_p = True;
+ p->initial_delay = 0;
+ }
+
+ /* Throttle the various timeouts to reasonable values after reading the
+ disk file. */
+ stop_the_insanity (p);
+}
+
+
+/* If there are any hacks in the system-wide defaults that are not in
+ the ~/.xscreensaver file, add the new ones to the end of the list.
+ This does *not* actually save the file.
+ */
+static void
+merge_system_screenhacks (Display *dpy, saver_preferences *p,
+ screenhack **system_list, int system_count)
+{
+ /* Yeah yeah, this is an N^2 operation, but I don't have hashtables handy,
+ so fuck it. */
+
+ int made_space = 0;
+ int i;
+ for (i = 0; i < system_count; i++)
+ {
+ int j;
+ Bool matched_p = False;
+
+ for (j = 0; j < p->screenhacks_count; j++)
+ {
+ char *name;
+ if (!system_list[i]->name)
+ system_list[i]->name = make_hack_name (dpy,
+ system_list[i]->command);
+
+ name = p->screenhacks[j]->name;
+ if (!name)
+ name = make_hack_name (dpy, p->screenhacks[j]->command);
+
+ matched_p = !strcasecmp (name, system_list[i]->name);
+
+ if (name != p->screenhacks[j]->name)
+ free (name);
+
+ if (matched_p)
+ break;
+ }
+
+ if (!matched_p)
+ {
+ /* We have an entry in the system-wide list that is not in the
+ user's .xscreensaver file. Add it to the end.
+ Note that p->screenhacks is a single malloc block, not a
+ linked list, so we have to realloc it.
+ */
+ screenhack *oh = system_list[i];
+ screenhack *nh = (screenhack *) malloc (sizeof(screenhack));
+
+ if (made_space == 0)
+ {
+ made_space = 10;
+ p->screenhacks = (screenhack **)
+ realloc (p->screenhacks,
+ (p->screenhacks_count + made_space + 1)
+ * sizeof(screenhack));
+ if (!p->screenhacks) abort();
+ }
+
+ nh->enabled_p = oh->enabled_p;
+ nh->visual = oh->visual ? strdup(oh->visual) : 0;
+ nh->name = oh->name ? strdup(oh->name) : 0;
+ nh->command = oh->command ? strdup(oh->command) : 0;
+
+ p->screenhacks[p->screenhacks_count++] = nh;
+ p->screenhacks[p->screenhacks_count] = 0;
+ made_space--;
+
+#if 0
+ fprintf (stderr, "%s: noticed new hack: %s\n", blurb(),
+ (nh->name ? nh->name : make_hack_name (dpy, nh->command)));
+#endif
+ }
+ }
+}
+
+
+
+/* Parsing the programs resource.
+ */
+
+screenhack *
+parse_screenhack (const char *line)
+{
+ screenhack *h = (screenhack *) calloc (1, sizeof(*h));
+ const char *s;
+
+ h->enabled_p = True;
+
+ while (isspace(*line)) line++; /* skip whitespace */
+ if (*line == '-') /* handle "-" */
+ {
+ h->enabled_p = False;
+ line++;
+ while (isspace(*line)) line++; /* skip whitespace */
+ }
+
+ s = line; /* handle "visual:" */
+ while (*line && *line != ':' && *line != '"' && !isspace(*line))
+ line++;
+ if (*line != ':')
+ line = s;
+ else
+ {
+ h->visual = (char *) malloc (line-s+1);
+ strncpy (h->visual, s, line-s);
+ h->visual[line-s] = 0;
+ if (*line == ':') line++; /* skip ":" */
+ while (isspace(*line)) line++; /* skip whitespace */
+ }
+
+ if (*line == '"') /* handle "name" */
+ {
+ line++;
+ s = line;
+ while (*line && *line != '"')
+ line++;
+ h->name = (char *) malloc (line-s+1);
+ strncpy (h->name, s, line-s);
+ h->name[line-s] = 0;
+ if (*line == '"') line++; /* skip "\"" */
+ while (isspace(*line)) line++; /* skip whitespace */
+ }
+
+ h->command = format_command (line, False); /* handle command */
+ return h;
+}
+
+
+static char *
+format_command (const char *cmd, Bool wrap_p)
+{
+ int tab = 30;
+ int col = tab;
+ char *cmd2 = (char *) calloc (1, 2 * (strlen (cmd) + 1));
+ const char *in = cmd;
+ char *out = cmd2;
+ while (*in)
+ {
+ /* shrink all whitespace to one space, for the benefit of the "demo"
+ mode display. We only do this when we can easily tell that the
+ whitespace is not significant (no shell metachars).
+ */
+ switch (*in)
+ {
+ case '\'': case '"': case '`': case '\\':
+ /* Metachars are scary. Copy the rest of the line unchanged. */
+ while (*in)
+ *out++ = *in++, col++;
+ break;
+
+ case ' ': case '\t':
+ /* Squeeze all other whitespace down to one space. */
+ while (*in == ' ' || *in == '\t')
+ in++;
+ *out++ = ' ', col++;
+ break;
+
+ default:
+ /* Copy other chars unchanged. */
+ *out++ = *in++, col++;
+ break;
+ }
+ }
+
+ *out = 0;
+
+ /* Strip trailing whitespace */
+ while (out > cmd2 && isspace (out[-1]))
+ *(--out) = 0;
+
+ return cmd2;
+}
+
+
+/* Returns a new string describing the shell command.
+ This may be just the name of the program, capitalized.
+ It also may be something from the resource database (gotten
+ by looking for "hacks.XYZ.name", where XYZ is the program.)
+ */
+char *
+make_hack_name (Display *dpy, const char *shell_command)
+{
+ char *s = strdup (shell_command);
+ char *s2;
+ char res_name[255];
+
+ for (s2 = s; *s2; s2++) /* truncate at first whitespace */
+ if (isspace (*s2))
+ {
+ *s2 = 0;
+ break;
+ }
+
+ s2 = strrchr (s, '/'); /* if pathname, take last component */
+ if (s2)
+ {
+ s2 = strdup (s2+1);
+ free (s);
+ s = s2;
+ }
+
+ if (strlen (s) > 50) /* 51 is hereby defined as "unreasonable" */
+ s[50] = 0;
+
+ sprintf (res_name, "hacks.%s.name", s); /* resource? */
+ s2 = get_string_resource (dpy, res_name, res_name);
+ if (s2)
+ {
+ free (s);
+ return s2;
+ }
+
+ for (s2 = s; *s2; s2++) /* if it has any capitals, return it */
+ if (*s2 >= 'A' && *s2 <= 'Z')
+ return s;
+
+ if (s[0] >= 'a' && s[0] <= 'z') /* else cap it */
+ s[0] -= 'a'-'A';
+ if (s[0] == 'X' && s[1] >= 'a' && s[1] <= 'z') /* (magic leading X) */
+ s[1] -= 'a'-'A';
+ if (s[0] == 'G' && s[1] == 'l' &&
+ s[2] >= 'a' && s[2] <= 'z') /* (magic leading GL) */
+ s[1] -= 'a'-'A',
+ s[2] -= 'a'-'A';
+ return s;
+}
+
+
+char *
+format_hack (Display *dpy, screenhack *hack, Bool wrap_p)
+{
+ int tab = 32;
+ int size;
+ char *h2, *out, *s;
+ int col = 0;
+
+ char *def_name = make_hack_name (dpy, hack->command);
+
+ /* Don't ever write out a name for a hack if it's the same as the default.
+ */
+ if (hack->name && !strcmp (hack->name, def_name))
+ {
+ free (hack->name);
+ hack->name = 0;
+ }
+ free (def_name);
+
+ size = (2 * (strlen(hack->command) +
+ (hack->visual ? strlen(hack->visual) : 0) +
+ (hack->name ? strlen(hack->name) : 0) +
+ tab));
+ h2 = (char *) malloc (size);
+ out = h2;
+
+ if (!hack->enabled_p) *out++ = '-'; /* write disabled flag */
+
+ if (hack->visual && *hack->visual) /* write visual name */
+ {
+ if (hack->enabled_p) *out++ = ' ';
+ *out++ = ' ';
+ strcpy (out, hack->visual);
+ out += strlen (hack->visual);
+ *out++ = ':';
+ *out++ = ' ';
+ }
+
+ *out = 0;
+ col = string_columns (h2, strlen (h2), 0);
+
+ if (hack->name && *hack->name) /* write pretty name */
+ {
+ int L = (strlen (hack->name) + 2);
+ if (L + col < tab)
+ out = stab_to (out, col, tab - L - 2);
+ else
+ *out++ = ' ';
+ *out++ = '"';
+ strcpy (out, hack->name);
+ out += strlen (hack->name);
+ *out++ = '"';
+ *out = 0;
+
+ col = string_columns (h2, strlen (h2), 0);
+ if (wrap_p && col >= tab)
+ out = stab_to (out, col, 77);
+ else
+ *out++ = ' ';
+
+ if (out >= h2+size) abort();
+ }
+
+ *out = 0;
+ col = string_columns (h2, strlen (h2), 0);
+ out = stab_to (out, col, tab); /* indent */
+
+ if (out >= h2+size) abort();
+ s = format_command (hack->command, wrap_p);
+ strcpy (out, s);
+ out += strlen (s);
+ free (s);
+ *out = 0;
+
+ return h2;
+}
+
+
+static void
+get_screenhacks (Display *dpy, saver_preferences *p)
+{
+ int i, j;
+ int start = 0;
+ int end = 0;
+ int size;
+ char *d;
+
+ d = get_string_resource (dpy, "monoPrograms", "MonoPrograms");
+ if (d && !*d) { free(d); d = 0; }
+ if (!d)
+ d = get_string_resource (dpy, "colorPrograms", "ColorPrograms");
+ if (d && !*d) { free(d); d = 0; }
+
+ if (d)
+ {
+ fprintf (stderr,
+ "%s: the `monoPrograms' and `colorPrograms' resources are obsolete;\n\
+ see the manual for details.\n", blurb());
+ free(d);
+ }
+
+ d = get_string_resource (dpy, "programs", "Programs");
+
+ free_screenhack_list (p->screenhacks, p->screenhacks_count);
+ p->screenhacks = 0;
+ p->screenhacks_count = 0;
+
+ if (!d || !*d)
+ return;
+
+ size = strlen (d);
+
+
+ /* Count up the number of newlines (which will be equal to or larger than
+ one less than the number of hacks.)
+ */
+ for (i = j = 0; d[i]; i++)
+ if (d[i] == '\n')
+ j++;
+ j++;
+
+ p->screenhacks = (screenhack **) calloc (j + 1, sizeof (screenhack *));
+
+ /* Iterate over the lines in `d' (the string with newlines)
+ and make new strings to stuff into the `screenhacks' array.
+ */
+ p->screenhacks_count = 0;
+ while (start < size)
+ {
+ /* skip forward over whitespace. */
+ while (d[start] == ' ' || d[start] == '\t' || d[start] == '\n')
+ start++;
+
+ /* skip forward to newline or end of string. */
+ end = start;
+ while (d[end] != 0 && d[end] != '\n')
+ end++;
+
+ /* null terminate. */
+ d[end] = 0;
+
+ p->screenhacks[p->screenhacks_count++] = parse_screenhack (d + start);
+ if (p->screenhacks_count >= i)
+ abort();
+
+ start = end+1;
+ }
+
+ free (d);
+
+ if (p->screenhacks_count == 0)
+ {
+ free (p->screenhacks);
+ p->screenhacks = 0;
+ }
+}
+
+
+/* Make sure all the values in the preferences struct are sane.
+ */
+static void
+stop_the_insanity (saver_preferences *p)
+{
+ if (p->passwd_timeout <= 0) p->passwd_timeout = 30000; /* 30 secs */
+ if (p->timeout < 15000) p->timeout = 15000; /* 15 secs */
+ if (p->cycle != 0 && p->cycle < 2000) p->cycle = 2000; /* 2 secs */
+ if (p->pointer_timeout <= 0) p->pointer_timeout = 5000; /* 5 secs */
+ if (p->notice_events_timeout <= 0)
+ p->notice_events_timeout = 10000; /* 10 secs */
+ if (p->fade_seconds <= 0 || p->fade_ticks <= 0)
+ p->fade_p = False;
+ if (! p->fade_p) p->unfade_p = False;
+
+ /* The DPMS settings may have the value 0.
+ But if they are negative, or are a range less than 10 seconds,
+ reset them to sensible defaults. (Since that must be a mistake.)
+ */
+ if (p->dpms_standby != 0 &&
+ p->dpms_standby < 10 * 1000)
+ p->dpms_standby = 2 * 60 * 60 * 1000; /* 2 hours */
+ if (p->dpms_suspend != 0 &&
+ p->dpms_suspend < 10 * 1000)
+ p->dpms_suspend = 2 * 60 * 60 * 1000; /* 2 hours */
+ if (p->dpms_off != 0 &&
+ p->dpms_off < 10 * 1000)
+ p->dpms_off = 4 * 60 * 60 * 1000; /* 4 hours */
+
+ /* suspend may not be greater than off, unless off is 0.
+ standby may not be greater than suspend, unless suspend is 0.
+ */
+ if (p->dpms_off != 0 &&
+ p->dpms_suspend > p->dpms_off)
+ p->dpms_suspend = p->dpms_off;
+ if (p->dpms_suspend != 0 &&
+ p->dpms_standby > p->dpms_suspend)
+ p->dpms_standby = p->dpms_suspend;
+
+ /* These fixes above ignores the case
+ suspend = 0 and standby > off ...
+ */
+ if (p->dpms_off != 0 &&
+ p->dpms_standby > p->dpms_off)
+ p->dpms_standby = p->dpms_off;
+
+
+ if (p->dpms_standby == 0 && /* if *all* are 0, then DPMS is disabled */
+ p->dpms_suspend == 0 &&
+ p->dpms_off == 0 &&
+ !(p->dpms_quickoff_p) /* ... but we want to do DPMS quick off */
+ )
+ p->dpms_enabled_p = False;
+
+
+ /* Set watchdog timeout to about half of the cycle timeout, but
+ don't let it be faster than 1/2 minute or slower than 1 minute.
+ */
+ p->watchdog_timeout = p->cycle * 0.6;
+ if (p->watchdog_timeout < 27000) p->watchdog_timeout = 27000; /* 27 secs */
+ if (p->watchdog_timeout > 57000) p->watchdog_timeout = 57000; /* 57 secs */
+
+ if (p->pointer_hysteresis < 0) p->pointer_hysteresis = 0;
+ if (p->pointer_hysteresis > 100) p->pointer_hysteresis = 100;
+
+ if (p->auth_warning_slack < 0) p->auth_warning_slack = 0;
+ if (p->auth_warning_slack > 300) p->auth_warning_slack = 300;
+}
+
+
+Bool
+senesculent_p (void)
+{
+ /* If you are in here because you're planning on disabling this warning
+ before redistributing my software, please don't.
+
+ I sincerely request that you do one of the following:
+
+ 1: leave this code intact and this warning in place, -OR-
+
+ 2: Remove xscreensaver from your distribution.
+
+ I would seriously prefer that you not distribute my software at all
+ than that you distribute one version and then never update it for
+ years.
+
+ I am *constantly* getting email from users reporting bugs that have
+ been fixed for literally years who have no idea that the software
+ they are running is years out of date. Yes, it would be great if we
+ lived in the ideal world where people checked that they were running
+ the latest release before they report a bug, but we don't. To most
+ people, "running the latest release" is synonymous with "running the
+ latest release that my distro packages for me."
+
+ When they even bother to tell me what version they're running, I
+ say, "That version is three years old!", and they say "But this is
+ the latest version my distro ships". Then I say, "your distro
+ sucks", and they say "but I don't know how to compile from source,
+ herp derp I eat paste", and *everybody* goes away unhappy.
+
+ It wastes an enormous amount of my time, but worse than that, it
+ does a grave disservice to the users, who are stuck experiencing
+ bugs that are already fixed! These users think they are running the
+ latest release, and they are not. They would like to be running the
+ actual latest release, but they don't know how, because their distro
+ makes that very difficult for them. It's terrible for everyone, and
+ kind of makes me regret ever having released this software in the
+ first place.
+
+ So seriously. I ask that if you're planning on disabling this
+ obsolescence warning, that you instead just remove xscreensaver from
+ your distro entirely. Everybody will be happier that way. Check
+ out gnome-screensaver instead, I understand it's really nice.
+
+ Of course, my license allows you to ignore me and do whatever the
+ fuck you want, but as the author, I hope you will have the common
+ courtesy of complying with my request.
+
+ Thank you!
+
+ jwz, 2014, 2016, 2018.
+
+ PS: In particular, since Debian refuses to upgrade software on any
+ kind of rational timeline, I have asked that they stop shipping
+ xscreensaver at all. They have refused. Instead of upgrading the
+ software, they simply patched out this warning.
+
+ If you want to witness the sad state of the open source peanut
+ gallery, look no farther than the comments on my blog:
+ http://jwz.org/b/yiYo
+
+ Many of these people fall back on their go-to argument of, "If it is
+ legal, it must be right." If you believe in that rhetorical device
+ then you are a terrible person, and possibly a sociopath.
+
+ There are also the armchair lawyers who say "Well, instead of
+ *asking* people to do the right thing out of common courtesy, you
+ should just change your license to prohibit them from acting
+ amorally." Again, this is the answer of a sociopath, but that aside,
+ if you devote even a second's thought to this you will realize that
+ the end result of this would be for distros like Debian to just keep
+ shipping the last version with the old license and then never
+ upgrading it again -- which would be the worst possible outcome for
+ everyone involved, most especially the users.
+ */
+
+ time_t now = time ((time_t *) 0); /* d */
+ struct tm *tm = localtime (&now); /* o */
+ const char *s = screensaver_id; /* n */
+ char mon[4], year[5]; /* ' */
+ int m, y, mrnths; /* t */
+ s = strchr (s, ' '); if (!s) abort(); s++; /* */
+ s = strchr (s, '('); if (!s) abort(); s++; /* d */
+ s = strchr (s, '-'); if (!s) abort(); s++; /* o */
+ strncpy (mon, s, 3); /* o */
+ mon[3] = 0; /* */
+ s = strchr (s, '-'); if (!s) abort(); s++; /* e */
+ strncpy (year, s, 4); /* e */
+ year[4] = 0; /* t */
+ y = atoi (year); /* , */
+ if (!strcmp(mon, "Jan")) m = 0; /* */
+ else if (!strcmp(mon, "Feb")) m = 1; /* s */
+ else if (!strcmp(mon, "Mar")) m = 2; /* t */
+ else if (!strcmp(mon, "Apr")) m = 3; /* o */
+ else if (!strcmp(mon, "May")) m = 4; /* p */
+ else if (!strcmp(mon, "Jun")) m = 5; /* , */
+ else if (!strcmp(mon, "Jul")) m = 6; /* */
+ else if (!strcmp(mon, "Aug")) m = 7; /* s */
+ else if (!strcmp(mon, "Sep")) m = 8; /* t */
+ else if (!strcmp(mon, "Oct")) m = 9; /* a */
+ else if (!strcmp(mon, "Nov")) m = 10; /* a */
+ else if (!strcmp(mon, "Dec")) m = 11; /* a */
+ else abort(); /* h */
+ mrnths = ((((tm->tm_year + 1900) * 12) + tm->tm_mon) - /* h */
+ (y * 12 + m)); /* h */
+ /* p */
+ return (mrnths >= 17); /* . */
+}
diff --git a/driver/prefs.h b/driver/prefs.h
new file mode 100644
index 0000000..cd1016d
--- /dev/null
+++ b/driver/prefs.h
@@ -0,0 +1,37 @@
+/* xscreensaver, Copyright (c) 1993-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __XSCREENSAVER_PREFS_H__
+#define __XSCREENSAVER_PREFS_H__
+
+#include "types.h"
+
+extern void load_init_file (Display *, saver_preferences *);
+extern Bool init_file_changed_p (saver_preferences *);
+extern int write_init_file (Display *,
+ saver_preferences *, const char *version_string,
+ Bool verbose_p);
+const char *init_file_name (void);
+extern Bool senesculent_p (void);
+
+extern screenhack *parse_screenhack (const char *line);
+extern void free_screenhack (screenhack *);
+extern char *format_hack (Display *, screenhack *, Bool wrap_p);
+char *make_hack_name (Display *, const char *shell_command);
+
+/* From dpms.c */
+extern void sync_server_dpms_settings (Display *, Bool enabled_p,
+ Bool dpms_quickoff_p,
+ int standby_secs, int suspend_secs,
+ int off_secs,
+ Bool verbose_p);
+
+#endif /* __XSCREENSAVER_PREFS_H__ */
diff --git a/driver/remote.c b/driver/remote.c
new file mode 100644
index 0000000..775036a
--- /dev/null
+++ b/driver/remote.c
@@ -0,0 +1,595 @@
+/* xscreensaver-command, Copyright (c) 1991-2009 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <sys/time.h>
+#include <sys/types.h>
+
+#ifdef HAVE_SYS_SELECT_H
+# include <sys/select.h>
+#endif /* HAVE_SYS_SELECT_H */
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <X11/Xproto.h> /* for CARD32 */
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Xutil.h> /* for XGetClassHint() */
+#include <X11/Xos.h>
+
+#include "remote.h"
+
+#ifdef _VROOT_H_
+ERROR! you must not include vroot.h in this file
+#endif
+
+extern char *progname;
+extern Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_RESPONSE;
+extern Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_EXIT;
+extern Atom XA_VROOT, XA_SELECT, XA_DEMO, XA_BLANK, XA_LOCK;
+
+
+static XErrorHandler old_handler = 0;
+static Bool got_badwindow = False;
+static int
+BadWindow_ehandler (Display *dpy, XErrorEvent *error)
+{
+ if (error->error_code == BadWindow)
+ {
+ got_badwindow = True;
+ return 0;
+ }
+ else
+ {
+ fprintf (stderr, "%s: ", progname);
+ if (!old_handler) abort();
+ return (*old_handler) (dpy, error);
+ }
+}
+
+
+
+static Window
+find_screensaver_window (Display *dpy, char **version)
+{
+ int i;
+ Window root = RootWindowOfScreen (DefaultScreenOfDisplay (dpy));
+ Window root2, parent, *kids;
+ unsigned int nkids;
+
+ if (version) *version = 0;
+
+ if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids))
+ abort ();
+ if (root != root2)
+ abort ();
+ if (parent)
+ abort ();
+ if (! (kids && nkids))
+ return 0;
+ for (i = 0; i < nkids; i++)
+ {
+ Atom type;
+ int format;
+ unsigned long nitems, bytesafter;
+ unsigned char *v;
+ int status;
+
+ /* We're walking the list of root-level windows and trying to find
+ the one that has a particular property on it. We need to trap
+ BadWindows errors while doing this, because it's possible that
+ some random window might get deleted in the meantime. (That
+ window won't have been the one we're looking for.)
+ */
+ XSync (dpy, False);
+ if (old_handler) abort();
+ got_badwindow = False;
+ old_handler = XSetErrorHandler (BadWindow_ehandler);
+ status = XGetWindowProperty (dpy, kids[i],
+ XA_SCREENSAVER_VERSION,
+ 0, 200, False, XA_STRING,
+ &type, &format, &nitems, &bytesafter,
+ &v);
+ XSync (dpy, False);
+ XSetErrorHandler (old_handler);
+ old_handler = 0;
+
+ if (got_badwindow)
+ {
+ status = BadWindow;
+ got_badwindow = False;
+ }
+
+ if (status == Success && type != None)
+ {
+ Window ret = kids[i];
+ if (version)
+ *version = (char *) v;
+ XFree (kids);
+ return ret;
+ }
+ }
+
+ if (kids) XFree (kids);
+ return 0;
+}
+
+
+static int
+send_xscreensaver_command (Display *dpy, Atom command, long arg,
+ Window *window_ret, char **error_ret)
+{
+ int status = -1;
+ char *v = 0;
+ Window window = find_screensaver_window (dpy, &v);
+ XWindowAttributes xgwa;
+ char err[2048];
+
+ if (window_ret)
+ *window_ret = window;
+
+ if (!window)
+ {
+ sprintf (err, "no screensaver is running on display %s",
+ DisplayString (dpy));
+
+ if (error_ret)
+ {
+ *error_ret = strdup (err);
+ status = -1;
+ goto DONE;
+ }
+
+ if (command == XA_EXIT)
+ {
+ /* Don't print an error if xscreensaver is already dead. */
+ status = 1;
+ goto DONE;
+ }
+
+ fprintf (stderr, "%s: %s\n", progname, err);
+ status = -1;
+ goto DONE;
+ }
+
+ /* Select for property change events, so that we can read the response. */
+ XGetWindowAttributes (dpy, window, &xgwa);
+ XSelectInput (dpy, window, xgwa.your_event_mask | PropertyChangeMask);
+
+ if (command == XA_SCREENSAVER_STATUS ||
+ command == XA_SCREENSAVER_VERSION)
+ {
+ XClassHint hint;
+ memset (&hint, 0, sizeof(hint));
+ if (!v || !*v)
+ {
+ sprintf (err, "version property not set on window 0x%x?",
+ (unsigned int) window);
+ if (error_ret)
+ *error_ret = strdup (err);
+ else
+ fprintf (stderr, "%s: %s\n", progname, err);
+
+ status = -1;
+ goto DONE;
+ }
+
+ XGetClassHint(dpy, window, &hint);
+ if (!hint.res_class)
+ {
+ sprintf (err, "class hints not set on window 0x%x?",
+ (unsigned int) window);
+ if (error_ret)
+ *error_ret = strdup (err);
+ else
+ fprintf (stderr, "%s: %s\n", progname, err);
+
+ status = -1;
+ goto DONE;
+ }
+
+ fprintf (stdout, "%s %s", hint.res_class, v);
+
+ if (command != XA_SCREENSAVER_STATUS)
+ {
+ fprintf (stdout, "\n");
+ }
+ else
+ {
+ Atom type;
+ int format;
+ unsigned long nitems, bytesafter;
+ unsigned char *dataP = 0;
+
+ if (XGetWindowProperty (dpy,
+ RootWindow (dpy, 0),
+ XA_SCREENSAVER_STATUS,
+ 0, 999, False, XA_INTEGER,
+ &type, &format, &nitems, &bytesafter,
+ &dataP)
+ == Success
+ && type
+ && dataP)
+ {
+ Atom blanked;
+ time_t tt;
+ char *s;
+ Atom *data = (Atom *) dataP;
+
+ if (type != XA_INTEGER || nitems < 3)
+ {
+ STATUS_LOSE:
+ if (data) free (data);
+ fprintf (stdout, "\n");
+ fflush (stdout);
+ fprintf (stderr, "bad status format on root window.\n");
+ status = -1;
+ goto DONE;
+ }
+
+ blanked = (Atom) data[0];
+ tt = (time_t) data[1];
+
+ if (tt <= (time_t) 666000000L) /* early 1991 */
+ goto STATUS_LOSE;
+
+ if (blanked == XA_BLANK)
+ fputs (": screen blanked since ", stdout);
+ else if (blanked == XA_LOCK)
+ fputs (": screen locked since ", stdout);
+ else if (blanked == 0)
+ /* suggestions for a better way to phrase this are welcome. */
+ fputs (": screen non-blanked since ", stdout);
+ else
+ /* `blanked' has an unknown value - fail. */
+ goto STATUS_LOSE;
+
+ s = ctime(&tt);
+ if (s[strlen(s)-1] == '\n')
+ s[strlen(s)-1] = 0;
+ fputs (s, stdout);
+
+ {
+ int nhacks = nitems - 2;
+ Bool any = False;
+ int i;
+ for (i = 0; i < nhacks; i++)
+ if (data[i + 2] > 0)
+ {
+ any = True;
+ break;
+ }
+
+ if (any && nhacks == 1)
+ fprintf (stdout, " (hack #%d)\n", (int) data[2]);
+ else if (any)
+ {
+ fprintf (stdout, " (hacks: ");
+ for (i = 0; i < nhacks; i++)
+ {
+ fprintf (stdout, "#%d", (int) data[2 + i]);
+ if (i != nhacks-1)
+ fputs (", ", stdout);
+ }
+ fputs (")\n", stdout);
+ }
+ else
+ fputs ("\n", stdout);
+ }
+
+ if (data) free (data);
+ }
+ else
+ {
+ if (dataP) XFree (dataP);
+ fprintf (stdout, "\n");
+ fflush (stdout);
+ fprintf (stderr, "no saver status on root window.\n");
+ status = -1;
+ goto DONE;
+ }
+ }
+
+ /* No need to read a response for these commands. */
+ status = 1;
+ goto DONE;
+ }
+ else
+ {
+ XEvent event;
+ long arg1 = arg;
+ long arg2 = 0;
+
+ if (arg < 0)
+ abort();
+ else if (arg == 0 && command == XA_SELECT)
+ abort();
+ else if (arg != 0 && command == XA_DEMO)
+ {
+ arg1 = 5000; /* version number of the XA_DEMO protocol, */
+ arg2 = arg; /* since it didn't use to take an argument. */
+ }
+
+ event.xany.type = ClientMessage;
+ event.xclient.display = dpy;
+ event.xclient.window = window;
+ event.xclient.message_type = XA_SCREENSAVER;
+ event.xclient.format = 32;
+ memset (&event.xclient.data, 0, sizeof(event.xclient.data));
+ event.xclient.data.l[0] = (long) command;
+ event.xclient.data.l[1] = arg1;
+ event.xclient.data.l[2] = arg2;
+ if (! XSendEvent (dpy, window, False, 0L, &event))
+ {
+ sprintf (err, "XSendEvent(dpy, 0x%x ...) failed.\n",
+ (unsigned int) window);
+ if (error_ret)
+ *error_ret = strdup (err);
+ else
+ fprintf (stderr, "%s: %s\n", progname, err);
+ status = -1;
+ goto DONE;
+ }
+ }
+
+ status = 0;
+
+ DONE:
+ if (v) free (v);
+ XSync (dpy, 0);
+ return status;
+}
+
+
+static Bool
+xscreensaver_command_event_p (Display *dpy, XEvent *event, XPointer arg)
+{
+ return (event->xany.type == PropertyNotify &&
+ event->xproperty.state == PropertyNewValue &&
+ event->xproperty.atom == XA_SCREENSAVER_RESPONSE);
+}
+
+
+static int
+xscreensaver_command_response (Display *dpy, Window window,
+ Bool verbose_p, Bool exiting_p,
+ char **error_ret)
+{
+ int sleep_count = 0;
+ char err[2048];
+ XEvent event;
+ Bool got_event = False;
+
+ while (!(got_event = XCheckIfEvent(dpy, &event,
+ &xscreensaver_command_event_p, 0)) &&
+ sleep_count++ < 10)
+ {
+# if defined(HAVE_SELECT)
+ /* Wait for an event, but don't wait longer than 1 sec. Note that we
+ might do this multiple times if an event comes in, but it wasn't
+ the event we're waiting for.
+ */
+ int fd = XConnectionNumber(dpy);
+ fd_set rset;
+ struct timeval tv;
+ tv.tv_sec = 1;
+ tv.tv_usec = 0;
+ FD_ZERO (&rset);
+ FD_SET (fd, &rset);
+ select (fd+1, &rset, 0, 0, &tv);
+# else /* !HAVE_SELECT */
+ sleep(1);
+# endif /* !HAVE_SELECT */
+ }
+
+ if (!got_event)
+ {
+ sprintf (err, "no response to command.");
+ if (error_ret)
+ *error_ret = strdup (err);
+ else
+ fprintf (stderr, "%s: %s\n", progname, err);
+
+ return -1;
+ }
+ else
+ {
+ Status st2;
+ Atom type;
+ int format;
+ unsigned long nitems, bytesafter;
+ unsigned char *msg = 0;
+
+ XSync (dpy, False);
+ if (old_handler) abort();
+ old_handler = XSetErrorHandler (BadWindow_ehandler);
+ st2 = XGetWindowProperty (dpy, window,
+ XA_SCREENSAVER_RESPONSE,
+ 0, 1024, True,
+ AnyPropertyType,
+ &type, &format, &nitems, &bytesafter,
+ &msg);
+ XSync (dpy, False);
+ XSetErrorHandler (old_handler);
+ old_handler = 0;
+
+ if (got_badwindow)
+ {
+ if (exiting_p)
+ return 0;
+
+ sprintf (err, "xscreensaver window unexpectedly deleted.");
+
+ if (error_ret)
+ *error_ret = strdup (err);
+ else
+ fprintf (stderr, "%s: %s\n", progname, err);
+
+ return -1;
+ }
+
+ if (st2 == Success && type != None)
+ {
+ if (type != XA_STRING || format != 8)
+ {
+ sprintf (err, "unrecognized response property.");
+
+ if (error_ret)
+ *error_ret = strdup (err);
+ else
+ fprintf (stderr, "%s: %s\n", progname, err);
+
+ if (msg) XFree (msg);
+ return -1;
+ }
+ else if (!msg || (msg[0] != '+' && msg[0] != '-'))
+ {
+ sprintf (err, "unrecognized response message.");
+
+ if (error_ret)
+ *error_ret = strdup (err);
+ else
+ fprintf (stderr, "%s: %s\n", progname, err);
+
+ if (msg) XFree (msg);
+ return -1;
+ }
+ else
+ {
+ int ret = (msg[0] == '+' ? 0 : -1);
+ sprintf (err, "%s: %s\n", progname, (char *) msg+1);
+
+ if (error_ret)
+ *error_ret = strdup (err);
+ else if (verbose_p || ret != 0)
+ fprintf ((ret < 0 ? stderr : stdout), "%s\n", err);
+
+ XFree (msg);
+ return ret;
+ }
+ }
+ }
+
+ return -1; /* warning suppression: not actually reached */
+}
+
+
+int
+xscreensaver_command (Display *dpy, Atom command, long arg, Bool verbose_p,
+ char **error_ret)
+{
+ Window w = 0;
+ int status = send_xscreensaver_command (dpy, command, arg, &w, error_ret);
+ if (status == 0)
+ status = xscreensaver_command_response (dpy, w, verbose_p,
+ (command == XA_EXIT),
+ error_ret);
+
+ fflush (stdout);
+ fflush (stderr);
+ return (status < 0 ? status : 0);
+}
+
+
+void
+server_xscreensaver_version (Display *dpy,
+ char **version_ret,
+ char **user_ret,
+ char **host_ret)
+{
+ Window window = find_screensaver_window (dpy, 0);
+
+ Atom type;
+ int format;
+ unsigned long nitems, bytesafter;
+
+ if (version_ret)
+ *version_ret = 0;
+ if (user_ret)
+ *user_ret = 0;
+ if (host_ret)
+ *host_ret = 0;
+
+ if (!window)
+ return;
+
+ if (version_ret)
+ {
+ unsigned char *v = 0;
+ XGetWindowProperty (dpy, window, XA_SCREENSAVER_VERSION, 0, 1,
+ False, XA_STRING, &type, &format, &nitems,
+ &bytesafter, &v);
+ if (v)
+ {
+ *version_ret = strdup ((char *) v);
+ XFree (v);
+ }
+ }
+
+ if (user_ret || host_ret)
+ {
+ unsigned char *id = 0;
+ const char *user = 0;
+ const char *host = 0;
+
+ XGetWindowProperty (dpy, window, XA_SCREENSAVER_ID, 0, 512,
+ False, XA_STRING, &type, &format, &nitems,
+ &bytesafter, &id);
+ if (id && *id)
+ {
+ const char *old_tag = " on host ";
+ const char *s = strstr ((char *) id, old_tag);
+ if (s)
+ {
+ /* found ID of the form "1234 on host xyz". */
+ user = 0;
+ host = s + strlen (old_tag);
+ }
+ else
+ {
+ char *o = 0, *p = 0, *c = 0;
+ o = strchr ((char *) id, '(');
+ if (o) p = strchr (o, '@');
+ if (p) c = strchr (p, ')');
+ if (c)
+ {
+ /* found ID of the form "1234 (user@host)". */
+ user = o+1;
+ host = p+1;
+ *p = 0;
+ *c = 0;
+ }
+ }
+
+ }
+
+ if (user && *user && *user != '?')
+ *user_ret = strdup (user);
+ else
+ *user_ret = 0;
+
+ if (host && *host && *host != '?')
+ *host_ret = strdup (host);
+ else
+ *host_ret = 0;
+
+ if (id)
+ XFree (id);
+ }
+}
diff --git a/driver/remote.h b/driver/remote.h
new file mode 100644
index 0000000..e1db351
--- /dev/null
+++ b/driver/remote.h
@@ -0,0 +1,24 @@
+/* xscreensaver-command, Copyright (c) 1991-1998
+ * by Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef _XSCREENSAVER_REMOTE_H_
+#define _XSCREENSAVER_REMOTE_H_
+
+extern int xscreensaver_command (Display *dpy, Atom command, long arg,
+ Bool verbose_p, char **error_ret);
+
+extern void server_xscreensaver_version (Display *dpy,
+ char **version_ret,
+ char **user_ret,
+ char **host_ret);
+
+#endif /* _XSCREENSAVER_REMOTE_H_ */
diff --git a/driver/screens.c b/driver/screens.c
new file mode 100644
index 0000000..1a2f41d
--- /dev/null
+++ b/driver/screens.c
@@ -0,0 +1,1094 @@
+/* screens.c --- dealing with RANDR, Xinerama, and VidMode Viewports.
+ * xscreensaver, Copyright (c) 1991-2008 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* There are a bunch of different mechanisms for multiple monitors
+ * available in X. XScreenSaver needs to care about this for two
+ * reasons: first, to ensure that all visible areas go black; and
+ * second, so that the windows of screen savers exactly fill the
+ * glass of each monitor (instead of one saver spanning multiple
+ * monitors, or a monitor displaying only a sub-rectangle of the
+ * screen saver.)
+ *
+ * 1) Multi-screen:
+ *
+ * This is the original way. Each monitor gets its own display
+ * number. :0.0 is the first one, :0.1 is the next, etc. The
+ * value of $DISPLAY determines which screen windows open on by
+ * default. A single app can open windows on multiple screens
+ * with the same display connection, but windows cannot be moved
+ * from one screen to another. The mouse can be moved from one
+ * screen to another, though. Screens may be different depths
+ * (e.g., one can be TrueColor and one can be PseudoColor.)
+ * Screens cannot be resized or moved without restarting X.
+ *
+ * Everyone hates this way of doing things because of the
+ * inability to move a window from one screen to another without
+ * restarting the application.
+ *
+ * 2) Xinerama:
+ *
+ * There is a single giant root window that spans all the
+ * monitors. All monitors are the same depth, and windows can be
+ * moved around. Applications can learn which rectangles are
+ * actually visible on monitors by querying the Xinerama server
+ * extension. (If you don't do that, you end up with dialog
+ * boxes that try to appear in the middle of the screen actually
+ * spanning the gap between two monitors.)
+ *
+ * Xinerama doesn't work with DRI, which means that if you use
+ * it, you lose hardware acceleration on OpenGL programs. Also,
+ * screens can't be resized or moved without restarting X.
+ *
+ * 3) Vidmode Viewports:
+ *
+ * With this extension, the root window can be bigger than the
+ * monitor. Moving the mouse near the edges of the screen
+ * scrolls around, like a pan-and-scan movie. There can also be
+ * a hot key for changing the monitor's resolution (zooming
+ * in/out).
+ *
+ * Trying to combine this with Xinerama crashes the server, so
+ * you can only use this if you have only a single screen, or are
+ * in old-multi-screen mode.
+ *
+ * Also, half the time it doesn't work at all: it tends to lie
+ * about the size of the rectangle in use.
+ *
+ * 4) RANDR 1.0:
+ *
+ * The first version of the "Resize and Rotate" extension let you
+ * change the resolution of a screen on the fly. The root window
+ * would actually resize. However, it was also incompatible with
+ * Xinerama (did it crash, or just do nothing? I can't remember)
+ * so you needed to be in single-screen or old multi-screen mode.
+ * I believe RANDR could co-exist with Vidmode Viewports, but I'm
+ * not sure.
+ *
+ * 5) RANDR 1.2:
+ *
+ * Finally, RANDR added the functionality of Xinerama, plus some.
+ * Each X screen (in the sense of #1, "multi-screen") can have a
+ * number of sub-rectangles that are displayed on monitors, and
+ * each of those sub-rectangles can be displayed on more than one
+ * monitor. So it's possible (I think) to have a hybrid of
+ * multi-screen and Xinerama (e.g., to have two monitors running
+ * in one depth, and three monitors running in another?)
+ * Typically though, there will be a single X screen, with
+ * Xinerama-like division of that large root window onto multiple
+ * monitors. Also everything's dynamic: monitors can be added,
+ * removed, and resized at runtime.
+ *
+ * I believe that as of RANDR 1.2, the Xinerama extension still
+ * exists but only as a compatiblity layer: it's actually
+ * returning data from the RANDR extension.
+ *
+ * Though RANDR 1.2 allows the same image to be cloned onto more
+ * than one monitor, and also allows one monitor to show a
+ * subsection of something on another monitor (e.g., the
+ * rectangles can be enclosed or overlap). Since there's no way
+ * to put seperate savers on those duplicated-or-overlapping
+ * monitors, xscreensaver just ignores them (which allows them to
+ * display duplicates or overlaps).
+ *
+ * 5a) Nvidia fucks it up:
+ *
+ * Nvidia drivers as of Aug 2008 running in "TwinView" mode
+ * apparently report correct screen geometry via Xinerama, but
+ * report one giant screen via RANDR. The response from the
+ * nvidia developers is, "we don't support RANDR, use Xinerama
+ * instead." Which is a seriously lame answer. So, xscreensaver
+ * has to query *both* extensions, and make a guess as to which
+ * is to be believed.
+ *
+ * 5b) Also sometimes RANDR says stupid shit like, "You have one
+ * screen, and it has no available orientations or sizes."
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <X11/Xlib.h>
+
+#ifdef HAVE_RANDR
+# include <X11/extensions/Xrandr.h>
+#endif /* HAVE_RANDR */
+
+#ifdef HAVE_XINERAMA
+# include <X11/extensions/Xinerama.h>
+#endif /* HAVE_XINERAMA */
+
+#ifdef HAVE_XF86VMODE
+# include <X11/extensions/xf86vmode.h>
+#endif /* HAVE_XF86VMODE */
+
+/* This file doesn't need the Xt headers, so stub these types out... */
+#undef XtPointer
+#define XtAppContext void*
+#define XrmDatabase void*
+#define XtIntervalId void*
+#define XtPointer void*
+#define Widget void*
+
+#include "xscreensaver.h"
+#include "visual.h"
+
+
+typedef enum { S_SANE, S_ENCLOSED, S_DUPLICATE, S_OVERLAP,
+ S_OFFSCREEN, S_DISABLED } monitor_sanity;
+
+/* 'typedef monitor' is in types.h */
+struct _monitor {
+ int id;
+ char *desc;
+ Screen *screen;
+ int x, y, width, height;
+ monitor_sanity sanity; /* I'm not crazy you're the one who's crazy */
+ int enemy; /* which monitor it overlaps or duplicates */
+ char *err; /* msg to print at appropriate later time;
+ exists only on monitor #0. */
+};
+
+static Bool layouts_differ_p (monitor **a, monitor **b);
+
+
+static void
+free_monitors (monitor **monitors)
+{
+ monitor **m2 = monitors;
+ if (! monitors) return;
+ while (*m2)
+ {
+ if ((*m2)->desc) free ((*m2)->desc);
+ if ((*m2)->err) free ((*m2)->err);
+ free (*m2);
+ m2++;
+ }
+ free (monitors);
+}
+
+
+static char *
+append (char *s1, const char *s2)
+{
+ char *s = (char *) malloc ((s1 ? strlen(s1) : 0) +
+ (s2 ? strlen(s2) : 0) + 3);
+ *s = 0;
+ if (s1) strcat (s, s1);
+ if (s1 && s2) strcat (s, "\n");
+ if (s2) strcat (s, s2);
+ if (s1) free (s1);
+ return s;
+}
+
+
+#ifdef HAVE_XINERAMA
+
+static monitor **
+xinerama_scan_monitors (Display *dpy, char **errP)
+{
+ Screen *screen = DefaultScreenOfDisplay (dpy);
+ int event, error, nscreens, i;
+ XineramaScreenInfo *xsi;
+ monitor **monitors;
+
+ if (! XineramaQueryExtension (dpy, &event, &error))
+ return 0;
+
+ if (! XineramaIsActive (dpy))
+ return 0;
+
+ xsi = XineramaQueryScreens (dpy, &nscreens);
+ if (!xsi) return 0;
+
+ monitors = (monitor **) calloc (nscreens + 1, sizeof(*monitors));
+ if (!monitors) return 0;
+
+ for (i = 0; i < nscreens; i++)
+ {
+ monitor *m = (monitor *) calloc (1, sizeof (monitor));
+ monitors[i] = m;
+ m->id = i;
+ m->screen = screen;
+ m->x = xsi[i].x_org;
+ m->y = xsi[i].y_org;
+ m->width = xsi[i].width;
+ m->height = xsi[i].height;
+ }
+ return monitors;
+}
+
+#endif /* HAVE_XINERAMA */
+
+
+#ifdef HAVE_XF86VMODE
+
+static monitor **
+vidmode_scan_monitors (Display *dpy, char **errP)
+{
+ int event, error, nscreens, i;
+ monitor **monitors;
+
+ /* Note that XF86VidModeGetViewPort() tends to be full of lies on laptops
+ that have a docking station or external monitor that runs in a different
+ resolution than the laptop's screen:
+
+ http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=81593
+ http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=208417
+ http://bugs.xfree86.org/show_bug.cgi?id=421
+
+ Presumably this is fixed by using RANDR instead of VidMode.
+ */
+
+# ifdef HAVE_XINERAMA
+ /* Attempts to use the VidMode extension when the Xinerama extension is
+ active can result in a server crash! Yay! */
+ if (XQueryExtension (dpy, "XINERAMA", &error, &event, &error))
+ return 0;
+# endif /* !HAVE_XINERAMA */
+
+ if (! XF86VidModeQueryExtension (dpy, &event, &error))
+ return 0;
+
+ nscreens = ScreenCount (dpy);
+ monitors = (monitor **) calloc (nscreens + 1, sizeof(*monitors));
+ if (!monitors) return 0;
+
+ for (i = 0; i < nscreens; i++)
+ {
+ monitor *m = (monitor *) calloc (1, sizeof (monitor));
+ XF86VidModeModeLine ml;
+ int dot;
+ Screen *screen = ScreenOfDisplay (dpy, i);
+
+ monitors[i] = m;
+ m->id = i;
+ m->screen = screen;
+
+ if (! safe_XF86VidModeGetViewPort (dpy, i, &m->x, &m->y))
+ m->x = m->y = -1;
+
+ if (XF86VidModeGetModeLine (dpy, i, &dot, &ml))
+ {
+ m->width = ml.hdisplay;
+ m->height = ml.vdisplay;
+ }
+
+ /* On a system that has VidMode but does not have RANDR, and that has
+ "Option Rotate" set, WidthOfScreen/HeightOfScreen are the rotated
+ size, but XF86VidModeModeLine contains the unrotated size.
+ Maybe there's something in 'flags' that indicates this?
+ Or, we can just notice that the aspect ratios are inverted:
+ */
+ if (m->width > 0 &&
+ m->height > 0 &&
+ ((m->width > m->height) !=
+ (WidthOfScreen(screen) > HeightOfScreen(screen))))
+ {
+ int swap = m->width;
+ m->width = m->height;
+ m->height = swap;
+ }
+
+
+ /* Apparently, though the server stores the X position in increments of
+ 1 pixel, it will only make changes to the *display* in some other
+ increment. With XF86_SVGA on a Thinkpad, the display only updates
+ in multiples of 8 pixels when in 8-bit mode, and in multiples of 4
+ pixels in 16-bit mode. I don't know what it does in 24- and 32-bit
+ mode, because I don't have enough video memory to find out.
+
+ I consider it a bug that XF86VidModeGetViewPort() is telling me the
+ server's *target* scroll position rather than the server's *actual*
+ scroll position. David Dawes agrees, and says they may fix this in
+ XFree86 4.0, but it's nontrivial.
+
+ He also confirms that this behavior is server-dependent, so the
+ actual scroll position cannot be reliably determined by the client.
+ So... that means the only solution is to provide a ``sandbox''
+ around the blackout window -- we make the window be up to N pixels
+ larger than the viewport on both the left and right sides. That
+ means some part of the outer edges of each hack might not be
+ visible, but screw it.
+
+ I'm going to guess that 16 pixels is enough, and that the Y dimension
+ doesn't have this problem.
+
+ The drawback of doing this, of course, is that some of the screenhacks
+ will still look pretty stupid -- for example, "slidescreen" will cut
+ off the left and right edges of the grid, etc.
+ */
+# define FUDGE 16
+ if (m->x > 0 && m->x < m->width - ml.hdisplay)
+ {
+ /* Not at left edge or right edge:
+ Round X position down to next lower multiple of FUDGE.
+ Increase width by 2*FUDGE in case some server rounds up.
+ */
+ m->x = ((m->x - 1) / FUDGE) * FUDGE;
+ m->width += (FUDGE * 2);
+ }
+# undef FUDGE
+ }
+
+ return monitors;
+}
+
+#endif /* HAVE_XF86VMODE */
+
+
+#ifdef HAVE_RANDR
+
+static monitor **
+randr_scan_monitors (Display *dpy, char **errP)
+{
+ int event, error, major, minor, nscreens, i, j;
+ monitor **monitors;
+ Bool new_randr_p = False;
+
+ if (! XRRQueryExtension (dpy, &event, &error))
+ return 0;
+
+ if (! XRRQueryVersion (dpy, &major, &minor))
+ return 0;
+
+ if (major <= 0) /* Protocol was still in flux back then -- fuck it. */
+ return 0;
+
+# ifdef HAVE_RANDR_12
+ new_randr_p = (major > 1 || (major == 1 && minor >= 2));
+# endif
+
+ if (! new_randr_p)
+ /* RANDR 1.0 -- no Xinerama-like virtual screens. */
+ nscreens = ScreenCount (dpy);
+ else /* RANDR 1.2 or newer -- built-in Xinerama */
+ {
+# ifdef HAVE_RANDR_12
+ int xsc = ScreenCount (dpy);
+ nscreens = 0;
+ /* Add up the virtual screens on each X screen. */
+ for (i = 0; i < xsc; i++)
+ {
+ XRRScreenResources *res =
+ XRRGetScreenResources (dpy, RootWindow (dpy, i));
+ nscreens += res->noutput;
+ XRRFreeScreenResources (res);
+ }
+# endif /* HAVE_RANDR_12 */
+ }
+
+ if (nscreens <= 0)
+ {
+ *errP = append (*errP,
+ "WARNING: RANDR reported no screens! Ignoring it.");
+ return 0;
+ }
+
+ monitors = (monitor **) calloc (nscreens + 1, sizeof(*monitors));
+ if (!monitors) return 0;
+
+ for (i = 0, j = 0; i < ScreenCount (dpy); i++)
+ {
+ Screen *screen = ScreenOfDisplay (dpy, i);
+
+ if (! new_randr_p) /* RANDR 1.0 */
+ {
+ XRRScreenConfiguration *rrc;
+ monitor *m = (monitor *) calloc (1, sizeof (monitor));
+ monitors[i] = m;
+ m->screen = screen;
+ m->id = i;
+
+ rrc = XRRGetScreenInfo (dpy, RootWindowOfScreen (screen));
+ if (rrc)
+ {
+ SizeID size = -1;
+ Rotation rot = ~0;
+ XRRScreenSize *rrsizes;
+ int nsizes = 0;
+
+ size = XRRConfigCurrentConfiguration (rrc, &rot);
+ rrsizes = XRRConfigSizes (rrc, &nsizes);
+
+ if (nsizes <= 0) /* WTF? Shouldn't happen but does. */
+ {
+ m->width = DisplayWidth (dpy, i);
+ m->height = DisplayHeight (dpy, i);
+ }
+ else if (rot & (RR_Rotate_90|RR_Rotate_270))
+ {
+ m->width = rrsizes[size].height;
+ m->height = rrsizes[size].width;
+ }
+ else
+ {
+ m->width = rrsizes[size].width;
+ m->height = rrsizes[size].height;
+ }
+
+ /* don't free 'rrsizes' */
+ XRRFreeScreenConfigInfo (rrc);
+ }
+ }
+ else /* RANDR 1.2 or newer */
+ {
+# ifdef HAVE_RANDR_12
+ int k;
+ XRRScreenResources *res =
+ XRRGetScreenResources (dpy, RootWindowOfScreen (screen));
+ for (k = 0; k < res->noutput; k++, j++)
+ {
+ monitor *m = (monitor *) calloc (1, sizeof (monitor));
+ XRROutputInfo *rroi = XRRGetOutputInfo (dpy, res,
+ res->outputs[k]);
+ RRCrtc crtc = (rroi->crtc ? rroi->crtc :
+ rroi->ncrtc ? rroi->crtcs[0] : 0);
+ XRRCrtcInfo *crtci = (crtc ? XRRGetCrtcInfo(dpy, res, crtc) : 0);
+
+ monitors[j] = m;
+ m->screen = screen;
+ m->id = (i * 1000) + j;
+ m->desc = (rroi->name ? strdup (rroi->name) : 0);
+
+ if (crtci)
+ {
+ /* Note: if the screen is rotated, XRRConfigSizes contains
+ the unrotated WxH, but XRRCrtcInfo contains rotated HxW.
+ */
+ m->x = crtci->x;
+ m->y = crtci->y;
+ m->width = crtci->width;
+ m->height = crtci->height;
+ }
+
+ if (rroi->connection == RR_Disconnected)
+ m->sanity = S_DISABLED;
+ /* #### do the same for RR_UnknownConnection? */
+
+ if (crtci)
+ XRRFreeCrtcInfo (crtci);
+ XRRFreeOutputInfo (rroi);
+ }
+ XRRFreeScreenResources (res);
+# endif /* HAVE_RANDR_12 */
+ }
+ }
+
+ /* Work around more fucking brain damage. */
+ {
+ int ok = 0;
+ int i = 0;
+ while (monitors[i])
+ {
+ if (monitors[i]->width != 0 && monitors[i]->height != 0)
+ ok++;
+ i++;
+ }
+ if (! ok)
+ {
+ *errP = append (*errP,
+ "WARNING: RANDR says all screens are 0x0! Ignoring it.");
+ free_monitors (monitors);
+ monitors = 0;
+ }
+ }
+
+ return monitors;
+}
+
+#endif /* HAVE_RANDR */
+
+
+static monitor **
+basic_scan_monitors (Display *dpy, char **errP)
+{
+ int nscreens = ScreenCount (dpy);
+ int i;
+ monitor **monitors = (monitor **) calloc (nscreens + 1, sizeof(*monitors));
+ if (!monitors) return 0;
+
+ for (i = 0; i < nscreens; i++)
+ {
+ Screen *screen = ScreenOfDisplay (dpy, i);
+ monitor *m = (monitor *) calloc (1, sizeof (monitor));
+ monitors[i] = m;
+ m->id = i;
+ m->screen = screen;
+ m->x = 0;
+ m->y = 0;
+ m->width = WidthOfScreen (screen);
+ m->height = HeightOfScreen (screen);
+ }
+ return monitors;
+}
+
+
+#if defined(HAVE_RANDR) && defined(HAVE_XINERAMA)
+
+/* From: Aaron Plattner <aplattner@nvidia.com>
+ Date: August 7, 2008 10:21:25 AM PDT
+ To: linux-bugs@nvidia.com
+
+ The NVIDIA X driver does not yet support RandR 1.2. The X server has
+ a compatibility layer in it that allows RandR 1.2 clients to talk to
+ RandR 1.1 drivers through an RandR 1.2 pseudo-output called "default".
+ This reports the total combined resolution of the TwinView display,
+ since it doesn't have any visibility into TwinView metamodes. There
+ is no way for the driver to prevent the server from turning on this
+ compatibility layer.
+
+ The intention is for X client applications to continue to use the
+ Xinerama extension to query the screen geometry. RandR 1.2 reports
+ its own Xinerama info for this purpose. I would recommend against
+ modifying xscreensaver to try to get this information from RandR.
+ */
+static monitor **
+randr_versus_xinerama_fight (Display *dpy, monitor **randr_monitors,
+ char **errP)
+{
+ monitor **xinerama_monitors;
+
+ if (!randr_monitors)
+ return 0;
+
+ xinerama_monitors = xinerama_scan_monitors (dpy, errP);
+ if (!xinerama_monitors)
+ return randr_monitors;
+
+ if (! layouts_differ_p (randr_monitors, xinerama_monitors))
+ {
+ free_monitors (xinerama_monitors);
+ return randr_monitors;
+ }
+ else if ( randr_monitors[0] && !randr_monitors[1] && /* 1 monitor */
+ xinerama_monitors[0] && xinerama_monitors[1]) /* >1 monitor */
+ {
+ *errP = append (*errP,
+ "WARNING: RANDR reports 1 screen but Xinerama\n"
+ "\t\treports multiple. Believing Xinerama.");
+ free_monitors (randr_monitors);
+ return xinerama_monitors;
+ }
+ else
+ {
+ *errP = append (*errP,
+ "WARNING: RANDR and Xinerama report different\n"
+ "\t\tscreen layouts! Believing RANDR.");
+ free_monitors (xinerama_monitors);
+ return randr_monitors;
+ }
+}
+
+#endif /* HAVE_RANDR && HAVE_XINERAMA */
+
+
+#ifdef DEBUG_MULTISCREEN
+
+/* If DEBUG_MULTISCREEN is defined, then in "-debug" mode, xscreensaver
+ will pretend that it is changing the number of connected monitors
+ every few seconds, using the geometries in the following list,
+ for stress-testing purposes.
+ */
+static monitor **
+debug_scan_monitors (Display *dpy, char **errP)
+{
+ static const char * const geoms[] = {
+ "1600x1028+0+22",
+ "1024x768+0+22",
+ "800x600+0+22",
+ "800x600+0+22,800x600+800+22",
+ "800x600+0+22,800x600+800+22,800x600+300+622",
+ "800x600+0+22,800x600+800+22,800x600+0+622,800x600+800+622",
+ "640x480+0+22,640x480+640+22,640x480+0+502,640x480+640+502",
+ "640x480+240+22,640x480+0+502,640x480+640+502",
+ "640x480+0+200,640x480+640+200",
+ "800x600+400+22",
+ "320x200+0+22,320x200+320+22,320x200+640+22,320x200+960+22,320x200+0+222,320x200+320+222,320x200+640+222,320x200+960+222,320x200+0+422,320x200+320+422,320x200+640+422,320x200+960+422,320x200+0+622,320x200+320+622,320x200+640+622,320x200+960+622,320x200+0+822,320x200+320+822,320x200+640+822,320x200+960+822"
+ };
+ static int index = 0;
+ monitor **monitors = (monitor **) calloc (100, sizeof(*monitors));
+ int nscreens = 0;
+ Screen *screen = DefaultScreenOfDisplay (dpy);
+
+ char *s = strdup (geoms[index]);
+ char *token = strtok (s, ",");
+ while (token)
+ {
+ monitor *m = calloc (1, sizeof (monitor));
+ char c;
+ m->id = nscreens;
+ m->screen = screen;
+ if (4 != sscanf (token, "%dx%d+%d+%d%c",
+ &m->width, &m->height, &m->x, &m->y, &c))
+ abort();
+ m->width -= 2;
+ m->height -= 2;
+ monitors[nscreens++] = m;
+ token = strtok (0, ",");
+ }
+ free (s);
+
+ index = (index+1) % countof(geoms);
+ return monitors;
+}
+
+#endif /* DEBUG_MULTISCREEN */
+
+
+#ifdef QUAD_MODE
+static monitor **
+quadruple (monitor **monitors, Bool debug_p, char **errP)
+{
+ int i, j, count = 0;
+ monitor **monitors2;
+ while (monitors[count])
+ count++;
+ monitors2 = (monitor **) calloc (count * 4 + 1, sizeof(*monitors));
+ if (!monitors2) abort();
+
+ for (i = 0, j = 0; i < count; i++)
+ {
+ int k;
+ for (k = 0; k < 4; k++)
+ {
+ monitors2[j+k] = (monitor *) calloc (1, sizeof (monitor));
+ *monitors2[j+k] = *monitors[i];
+ monitors2[j+k]->width /= (debug_p ? 4 : 2);
+ monitors2[j+k]->height /= 2;
+ monitors2[j+k]->id = (monitors[i]->id * 4) + k;
+ monitors2[j+k]->name = (monitors[i]->name
+ ? strdup (monitors[i]->name) : 0);
+ }
+ monitors2[j+1]->x += monitors2[j]->width;
+ monitors2[j+2]->y += monitors2[j]->height;
+ monitors2[j+3]->x += monitors2[j]->width;
+ monitors2[j+3]->y += monitors2[j]->height;
+ j += 4;
+ }
+
+ free_monitors (monitors);
+ return monitors2;
+}
+#endif /* QUAD_MODE */
+
+
+static monitor **
+scan_monitors (saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+ monitor **monitors = 0;
+ char *err = 0;
+
+# ifdef DEBUG_MULTISCREEN
+ if (! monitors) monitors = debug_scan_monitors (si->dpy, &err);
+# endif
+
+# ifdef HAVE_RANDR
+ if (! p->getviewport_full_of_lies_p)
+ if (! monitors) monitors = randr_scan_monitors (si->dpy, &err);
+
+# ifdef HAVE_XINERAMA
+ monitors = randr_versus_xinerama_fight (si->dpy, monitors, &err);
+# endif
+# endif /* HAVE_RANDR */
+
+# ifdef HAVE_XF86VMODE
+ if (! monitors) monitors = vidmode_scan_monitors (si->dpy, &err);
+# endif
+
+# ifdef HAVE_XINERAMA
+ if (! monitors) monitors = xinerama_scan_monitors (si->dpy, &err);
+# endif
+
+ if (! monitors) monitors = basic_scan_monitors (si->dpy, &err);
+
+# ifdef QUAD_MODE
+ if (p->quad_p)
+ monitors = quadruple (monitors, p->debug_p, &err);
+# endif
+
+ if (monitors && err) monitors[0]->err = err;
+
+ return monitors;
+}
+
+
+static Bool
+monitors_overlap_p (monitor *a, monitor *b)
+{
+ /* Two rectangles overlap if the max of the tops is less than the
+ min of the bottoms and the max of the lefts is less than the min
+ of the rights.
+ */
+# undef MAX
+# undef MIN
+# define MAX(A,B) ((A)>(B)?(A):(B))
+# define MIN(A,B) ((A)<(B)?(A):(B))
+
+ int maxleft = MAX(a->x, b->x);
+ int maxtop = MAX(a->y, b->y);
+ int minright = MIN(a->x + a->width - 1, b->x + b->width);
+ int minbot = MIN(a->y + a->height - 1, b->y + b->height);
+ return (maxtop < minbot && maxleft < minright);
+}
+
+
+static Bool
+plausible_aspect_ratio_p (monitor **monitors)
+{
+ /* Modern wide-screen monitors come in the following aspect ratios:
+
+ One monitor: If you tack a 640x480 monitor
+ onto the right, the ratio is:
+ 16 x 9 --> 1.78
+ 852 x 480 --> 1.77 852+640 x 480 --> 3.11 "SD 480p"
+ 1280 x 720 --> 1.78 1280+640 x 720 --> 2.67 "HD 720p"
+ 1280 x 920 --> 1.39 1280+640 x 920 --> 2.09
+ 1366 x 768 --> 1.78 1366+640 x 768 --> 2.61 "HD 768p"
+ 1440 x 900 --> 1.60 1440+640 x 900 --> 2.31
+ 1680 x 1050 --> 1.60 1680+640 x 1050 --> 2.21
+ 1690 x 1050 --> 1.61 1690+640 x 1050 --> 2.22
+ 1920 x 1080 --> 1.78 1920+640 x 1080 --> 2.37 "HD 1080p"
+ 1920 x 1200 --> 1.60 1920+640 x 1200 --> 2.13
+ 2560 x 1600 --> 1.60 2560+640 x 1600 --> 2.00
+
+ So that implies that if we ever see an aspect ratio >= 2.0,
+ we can be pretty sure that the X server is lying to us, and
+ that's actually two monitors, not one.
+ */
+ if (monitors[0] && !monitors[1] && /* exactly 1 monitor */
+ monitors[0]->height &&
+ monitors[0]->width / (double) monitors[0]->height >= 1.9)
+ return False;
+ else
+ return True;
+}
+
+
+/* Mark the ones that overlap, etc.
+ */
+static void
+check_monitor_sanity (monitor **monitors)
+{
+ int i, j, count = 0;
+
+ while (monitors[count])
+ count++;
+
+# define X1 monitors[i]->x
+# define X2 monitors[j]->x
+# define Y1 monitors[i]->y
+# define Y2 monitors[j]->y
+# define W1 monitors[i]->width
+# define W2 monitors[j]->width
+# define H1 monitors[i]->height
+# define H2 monitors[j]->height
+
+ /* If a monitor is enclosed by any other monitor, that's insane.
+ */
+ for (i = 0; i < count; i++)
+ for (j = 0; j < count; j++)
+ if (i != j &&
+ monitors[i]->sanity == S_SANE &&
+ monitors[j]->sanity == S_SANE &&
+ monitors[i]->screen == monitors[j]->screen &&
+ X2 >= X1 &&
+ Y2 >= Y1 &&
+ (X2+W2) <= (X1+W1) &&
+ (Y2+H2) <= (Y1+H1))
+ {
+ if (X1 == X2 &&
+ Y1 == Y2 &&
+ W1 == W2 &&
+ H1 == H2)
+ monitors[j]->sanity = S_DUPLICATE;
+ else
+ monitors[j]->sanity = S_ENCLOSED;
+ monitors[j]->enemy = i;
+ }
+
+ /* After checking for enclosure, check for other lossage against earlier
+ monitors. We do enclosure first so that we make sure to pick the
+ larger one.
+ */
+ for (i = 0; i < count; i++)
+ for (j = 0; j < i; j++)
+ {
+ if (monitors[i]->sanity != S_SANE) continue; /* already marked */
+ if (monitors[j]->sanity != S_SANE) continue;
+ if (monitors[i]->screen != monitors[j]->screen) continue;
+
+ if (monitors_overlap_p (monitors[i], monitors[j]))
+ {
+ monitors[i]->sanity = S_OVERLAP;
+ monitors[i]->enemy = j;
+ }
+ }
+
+ /* Finally, make sure all monitors have sane positions and sizes.
+ Xinerama sometimes reports 1024x768 VPs at -1936862040, -1953705044.
+ */
+ for (i = 0; i < count; i++)
+ {
+ if (monitors[i]->sanity != S_SANE) continue; /* already marked */
+ if (X1 < 0 || Y1 < 0 ||
+ W1 <= 0 || H1 <= 0 ||
+ X1+W1 >= 0x7FFF || Y1+H1 >= 0x7FFF)
+ {
+ monitors[i]->sanity = S_OFFSCREEN;
+ monitors[i]->enemy = 0;
+ }
+ }
+
+# undef X1
+# undef X2
+# undef Y1
+# undef Y2
+# undef W1
+# undef W2
+# undef H1
+# undef H2
+}
+
+
+static Bool
+layouts_differ_p (monitor **a, monitor **b)
+{
+ if (!a || !b) return True;
+ while (1)
+ {
+ if (!*a) break;
+ if (!*b) break;
+ if ((*a)->screen != (*b)->screen ||
+ (*a)->x != (*b)->x ||
+ (*a)->y != (*b)->y ||
+ (*a)->width != (*b)->width ||
+ (*a)->height != (*b)->height)
+ return True;
+ a++;
+ b++;
+ }
+ if (*a) return True;
+ if (*b) return True;
+
+ return False;
+}
+
+
+void
+describe_monitor_layout (saver_info *si)
+{
+ monitor **monitors = si->monitor_layout;
+ int count = 0;
+ int good_count = 0;
+ int bad_count = 0;
+ int implausible_p = !plausible_aspect_ratio_p (monitors);
+
+ while (monitors[count])
+ {
+ if (monitors[count]->sanity == S_SANE)
+ good_count++;
+ else
+ bad_count++;
+ count++;
+ }
+
+ if (monitors[0]->err) /* deferred error msg */
+ {
+ char *token = strtok (monitors[0]->err, "\n");
+ while (token)
+ {
+ fprintf (stderr, "%s: %s\n", blurb(), token);
+ token = strtok (0, "\n");
+ }
+ free (monitors[0]->err);
+ monitors[0]->err = 0;
+ }
+
+ if (count == 0)
+ fprintf (stderr, "%s: no screens!\n", blurb());
+ else
+ {
+ int i;
+ fprintf (stderr, "%s: screens in use: %d\n", blurb(), good_count);
+ for (i = 0; i < count; i++)
+ {
+ monitor *m = monitors[i];
+ if (m->sanity != S_SANE) continue;
+ fprintf (stderr, "%s: %3d/%d: %dx%d+%d+%d",
+ blurb(), m->id, screen_number (m->screen),
+ m->width, m->height, m->x, m->y);
+ if (m->desc && *m->desc) fprintf (stderr, " (%s)", m->desc);
+ fprintf (stderr, "\n");
+ }
+ if (bad_count > 0)
+ {
+ fprintf (stderr, "%s: rejected screens: %d\n", blurb(), bad_count);
+ for (i = 0; i < count; i++)
+ {
+ monitor *m = monitors[i];
+ monitor *e = monitors[m->enemy];
+ if (m->sanity == S_SANE) continue;
+ fprintf (stderr, "%s: %3d/%d: %dx%d+%d+%d",
+ blurb(), m->id, screen_number (m->screen),
+ m->width, m->height, m->x, m->y);
+ if (m->desc && *m->desc) fprintf (stderr, " (%s)", m->desc);
+ fprintf (stderr, " -- ");
+ switch (m->sanity)
+ {
+ case S_SANE: abort(); break;
+ case S_ENCLOSED:
+ fprintf (stderr, "enclosed by %d (%dx%d+%d+%d)\n",
+ e->id, e->width, e->height, e->x, e->y);
+ break;
+ case S_DUPLICATE:
+ fprintf (stderr, "duplicate of %d\n", e->id);
+ break;
+ case S_OVERLAP:
+ fprintf (stderr, "overlaps %d (%dx%d+%d+%d)\n",
+ e->id, e->width, e->height, e->x, e->y);
+ break;
+ case S_OFFSCREEN:
+ fprintf (stderr, "off screen (%dx%d)\n",
+ WidthOfScreen (e->screen),
+ HeightOfScreen (e->screen));
+ break;
+ case S_DISABLED:
+ fprintf (stderr, "output disabled\n");
+ break;
+ }
+ }
+ }
+
+ if (implausible_p)
+ fprintf (stderr,
+ "%s: WARNING: single screen aspect ratio is %dx%d = %.2f\n"
+ "%s: probable X server bug in Xinerama/RANDR!\n",
+ blurb(), monitors[0]->width, monitors[0]->height,
+ monitors[0]->width / (double) monitors[0]->height,
+ blurb());
+ }
+}
+
+
+/* Synchronize the contents of si->ssi to the current state of the monitors.
+ Doesn't change anything if nothing has changed; otherwise, alters and
+ reuses existing saver_screen_info structs as much as possible.
+ Returns True if anything changed.
+ */
+Bool
+update_screen_layout (saver_info *si)
+{
+ monitor **monitors = scan_monitors (si);
+ int count = 0;
+ int good_count = 0;
+ int i, j;
+ int seen_screens[100] = { 0, };
+
+ if (! layouts_differ_p (monitors, si->monitor_layout))
+ {
+ free_monitors (monitors);
+ return False;
+ }
+
+ free_monitors (si->monitor_layout);
+ si->monitor_layout = monitors;
+ check_monitor_sanity (si->monitor_layout);
+
+ while (monitors[count])
+ {
+ if (monitors[count]->sanity == S_SANE)
+ good_count++;
+ count++;
+ }
+
+ if (si->ssi_count == 0)
+ {
+ si->ssi_count = 10;
+ si->screens = (saver_screen_info *)
+ calloc (sizeof(*si->screens), si->ssi_count);
+ }
+
+ if (si->ssi_count <= good_count)
+ {
+ si->ssi_count = good_count + 10;
+ si->screens = (saver_screen_info *)
+ realloc (si->screens, sizeof(*si->screens) * si->ssi_count);
+ memset (si->screens + si->nscreens, 0,
+ sizeof(*si->screens) * (si->ssi_count - si->nscreens));
+ }
+
+ if (! si->screens) abort();
+
+ si->nscreens = good_count;
+
+ /* Regenerate the list of GL visuals as needed. */
+ if (si->best_gl_visuals)
+ free (si->best_gl_visuals);
+ si->best_gl_visuals = 0;
+
+ for (i = 0, j = 0; i < count; i++)
+ {
+ monitor *m = monitors[i];
+ saver_screen_info *ssi = &si->screens[j];
+ Screen *old_screen = ssi->screen;
+ int sn;
+ if (monitors[i]->sanity != S_SANE) continue;
+
+ ssi->global = si;
+ ssi->number = j;
+
+ sn = screen_number (m->screen);
+ ssi->screen = m->screen;
+ ssi->real_screen_number = sn;
+ ssi->real_screen_p = (seen_screens[sn] == 0);
+ seen_screens[sn]++;
+
+ ssi->default_visual =
+ get_visual_resource (ssi->screen, "visualID", "VisualID", False);
+ ssi->current_visual = ssi->default_visual;
+ ssi->current_depth = visual_depth (ssi->screen, ssi->current_visual);
+
+ /* If the screen changed (or if this is the first time) we need
+ a new toplevel shell for this screen's depth.
+ */
+ if (ssi->screen != old_screen)
+ initialize_screen_root_widget (ssi);
+
+ ssi->last_poll_mouse.root_x = -1;
+ ssi->last_poll_mouse.root_y = -1;
+
+ ssi->x = m->x;
+ ssi->y = m->y;
+ ssi->width = m->width;
+ ssi->height = m->height;
+
+# ifndef DEBUG_MULTISCREEN
+ {
+ saver_preferences *p = &si->prefs;
+ if (p->debug_p
+# ifdef QUAD_MODE
+ && !p->quad_p
+# endif
+ )
+ ssi->width /= 2;
+ }
+# endif
+
+ j++;
+ }
+
+ si->default_screen = &si->screens[0];
+ return True;
+}
diff --git a/driver/screensaver-properties.desktop.in b/driver/screensaver-properties.desktop.in
new file mode 100644
index 0000000..de42527
--- /dev/null
+++ b/driver/screensaver-properties.desktop.in
@@ -0,0 +1,8 @@
+[Desktop Entry]
+Exec=xscreensaver-demo
+Icon=xscreensaver
+Terminal=false
+_Name=Screensaver
+_Comment=Change screensaver properties
+Type=Application
+Categories=Settings;DesktopSettings;Security;X-XFCE;
diff --git a/driver/setuid.c b/driver/setuid.c
new file mode 100644
index 0000000..3ac78e4
--- /dev/null
+++ b/driver/setuid.c
@@ -0,0 +1,361 @@
+/* setuid.c --- management of runtime privileges.
+ * xscreensaver, Copyright (c) 1993-1998, 2005 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <X11/Xlib.h> /* not used for much... */
+
+/* This file doesn't need the Xt headers, so stub these types out... */
+#undef XtPointer
+#define XtAppContext void*
+#define XrmDatabase void*
+#define XtIntervalId void*
+#define XtPointer void*
+#define Widget void*
+
+#include "xscreensaver.h"
+
+#ifndef EPERM
+#include <errno.h>
+#endif
+
+#include <pwd.h> /* for getpwnam() and struct passwd */
+#include <grp.h> /* for getgrgid() and struct group */
+
+static const char *
+uid_gid_string (uid_t uid, gid_t gid)
+{
+ static char buf[255];
+ struct passwd *p = 0;
+ struct group *g = 0;
+ p = getpwuid (uid);
+ g = getgrgid (gid);
+ sprintf (buf, "%.100s/%.100s (%ld/%ld)",
+ (p && p->pw_name ? p->pw_name : "???"),
+ (g && g->gr_name ? g->gr_name : "???"),
+ (long) uid, (long) gid);
+ return buf;
+}
+
+
+void
+describe_uids (saver_info *si, FILE *out)
+{
+ uid_t uid = getuid();
+ gid_t gid = getgid();
+ uid_t euid = geteuid();
+ gid_t egid = getegid();
+ char *s1 = strdup (uid_gid_string (uid, gid));
+ char *s2 = strdup (uid_gid_string (euid, egid));
+
+ if (si->orig_uid && *si->orig_uid &&
+ (!!strcmp (si->orig_uid, s1) ||
+ !!strcmp (si->orig_uid, s2)))
+ fprintf (out, "%s: initial effective uid/gid was %s\n", blurb(),
+ si->orig_uid);
+
+ fprintf (out, "%s: running as %s", blurb(), s1);
+ if (uid != euid || gid != egid)
+ fprintf (out, "; effectively %s", s2);
+ fprintf(out, "\n");
+ free(s1);
+ free(s2);
+}
+
+
+/* Returns true if we need to call setgroups().
+
+ Without calling setgroups(), the process will retain any supplementary
+ gids associated with the uid, e.g.:
+
+ % groups root
+ root : root bin daemon sys adm disk wheel
+
+ However, setgroups() can only be called by root, and returns EPERM
+ for other users even if the call would be a no-op (e.g., setting the
+ group list to the current list.) So, to avoid that spurious error,
+ before calling setgroups() we first check whether the current list
+ of groups contains only one element, our target group. If so, we
+ don't need to call setgroups().
+ */
+static int
+setgroups_needed_p (uid_t target_group)
+{
+ gid_t groups[1024];
+ int n, size;
+ size = sizeof(groups) / sizeof(gid_t);
+ n = getgroups (size - 1, groups);
+ if (n < 0)
+ {
+ char buf [1024];
+ sprintf (buf, "%s: getgroups(%ld, ...)", blurb(), (long int)(size - 1));
+ perror (buf);
+ return 1;
+ }
+ else if (n == 0) /* an empty list means only egid is in effect. */
+ return 0;
+ else if (n == 1 && groups[0] == target_group) /* one element, the target */
+ return 0;
+ else /* more than one, or the wrong one. */
+ return 1;
+}
+
+
+static int
+set_ids_by_number (uid_t uid, gid_t gid, char **message_ret)
+{
+ int uid_errno = 0;
+ int gid_errno = 0;
+ int sgs_errno = 0;
+ struct passwd *p = getpwuid (uid);
+ struct group *g = getgrgid (gid);
+
+ if (message_ret)
+ *message_ret = 0;
+
+ /* Rumor has it that some implementations of of setuid() do nothing
+ when called with -1; therefore, if the "nobody" user has a uid of
+ -1, then that would be Really Bad. Rumor further has it that such
+ systems really ought to be using -2 for "nobody", since that works.
+ So, if we get a uid (or gid, for good measure) of -1, switch to -2
+ instead. Note that this must be done after we've looked up the
+ user/group names with getpwuid(-1) and/or getgrgid(-1).
+ */
+ if (gid == (gid_t) -1) gid = (gid_t) -2;
+ if (uid == (uid_t) -1) uid = (uid_t) -2;
+
+ errno = 0;
+ if (setgroups_needed_p (gid) &&
+ setgroups (1, &gid) < 0)
+ sgs_errno = errno ? errno : -1;
+
+ errno = 0;
+ if (setgid (gid) != 0)
+ gid_errno = errno ? errno : -1;
+
+ errno = 0;
+ if (setuid (uid) != 0)
+ uid_errno = errno ? errno : -1;
+
+ if (uid_errno == 0 && gid_errno == 0 && sgs_errno == 0)
+ {
+ static char buf [1024];
+ sprintf (buf, "changed uid/gid to %.100s/%.100s (%ld/%ld).",
+ (p && p->pw_name ? p->pw_name : "???"),
+ (g && g->gr_name ? g->gr_name : "???"),
+ (long) uid, (long) gid);
+ if (message_ret)
+ *message_ret = buf;
+ return 0;
+ }
+ else
+ {
+ char buf [1024];
+ gid_t groups[1024];
+ int n, size;
+
+ if (sgs_errno)
+ {
+ sprintf (buf, "%s: couldn't setgroups to %.100s (%ld)",
+ blurb(),
+ (g && g->gr_name ? g->gr_name : "???"),
+ (long) gid);
+ if (sgs_errno == -1)
+ fprintf(stderr, "%s: unknown error\n", buf);
+ else
+ {
+ errno = sgs_errno;
+ perror(buf);
+ }
+
+ fprintf (stderr, "%s: effective group list: ", blurb());
+ size = sizeof(groups) / sizeof(gid_t);
+ n = getgroups (size - 1, groups);
+ if (n < 0)
+ fprintf (stderr, "unknown!\n");
+ else
+ {
+ int i;
+ fprintf (stderr, "[");
+ for (i = 0; i < n; i++)
+ {
+ g = getgrgid (groups[i]);
+ if (i > 0) fprintf (stderr, ", ");
+ if (g && g->gr_name) fprintf (stderr, "%s", g->gr_name);
+ else fprintf (stderr, "%ld", (long) groups[i]);
+ }
+ fprintf (stderr, "]\n");
+ }
+ }
+
+ if (gid_errno)
+ {
+ sprintf (buf, "%s: couldn't set gid to %.100s (%ld)",
+ blurb(),
+ (g && g->gr_name ? g->gr_name : "???"),
+ (long) gid);
+ if (gid_errno == -1)
+ fprintf(stderr, "%s: unknown error\n", buf);
+ else
+ {
+ errno = gid_errno;
+ perror(buf);
+ }
+ }
+
+ if (uid_errno)
+ {
+ sprintf (buf, "%s: couldn't set uid to %.100s (%ld)",
+ blurb(),
+ (p && p->pw_name ? p->pw_name : "???"),
+ (long) uid);
+ if (uid_errno == -1)
+ fprintf(stderr, "%s: unknown error\n", buf);
+ else
+ {
+ errno = uid_errno;
+ perror(buf);
+ }
+ }
+
+ return -1;
+ }
+}
+
+
+/* If we've been run as setuid or setgid to someone else (most likely root)
+ turn off the extra permissions so that random user-specified programs
+ don't get special privileges. (On some systems it is necessary to install
+ this program as setuid root in order to read the passwd file to implement
+ lock-mode.)
+
+ *** WARNING: DO NOT DISABLE ANY OF THE FOLLOWING CODE!
+ If you do so, you will open a security hole. See the sections
+ of the xscreensaver manual titled "LOCKING AND ROOT LOGINS",
+ and "USING XDM".
+ */
+void
+hack_uid (saver_info *si)
+{
+
+ /* Discard privileges, and set the effective user/group ids to the
+ real user/group ids. That is, give up our "chmod +s" rights.
+ */
+ {
+ uid_t euid = geteuid();
+ gid_t egid = getegid();
+ uid_t uid = getuid();
+ gid_t gid = getgid();
+
+ si->orig_uid = strdup (uid_gid_string (euid, egid));
+
+ if (uid != euid || gid != egid)
+ if (set_ids_by_number (uid, gid, &si->uid_message) != 0)
+ saver_exit (si, 1, 0);
+ }
+
+
+ /* Locking can't work when running as root, because we have no way of
+ knowing what the user id of the logged in user is (so we don't know
+ whose password to prompt for.)
+
+ *** WARNING: DO NOT DISABLE THIS CODE!
+ If you do so, you will open a security hole. See the sections
+ of the xscreensaver manual titled "LOCKING AND ROOT LOGINS",
+ and "USING XDM".
+ */
+ if (getuid() == (uid_t) 0)
+ {
+ si->locking_disabled_p = True;
+ si->nolock_reason = "running as root";
+ }
+
+
+ /* If we're running as root, switch to a safer user. This is above and
+ beyond the fact that we've disabling locking, above -- the theory is
+ that running graphics demos as root is just always a stupid thing
+ to do, since they have probably never been security reviewed and are
+ more likely to be buggy than just about any other kind of program.
+ (And that assumes non-malicious code. There are also attacks here.)
+
+ *** WARNING: DO NOT DISABLE THIS CODE!
+ If you do so, you will open a security hole. See the sections
+ of the xscreensaver manual titled "LOCKING AND ROOT LOGINS",
+ and "USING XDM".
+ */
+ if (getuid() == (uid_t) 0)
+ {
+ struct passwd *p;
+
+ p = getpwnam ("nobody");
+ if (! p) p = getpwnam ("noaccess");
+ if (! p) p = getpwnam ("daemon");
+ if (! p)
+ {
+ fprintf (stderr,
+ "%s: running as root, and couldn't find a safer uid.\n",
+ blurb());
+ saver_exit(si, 1, 0);
+ }
+
+ if (set_ids_by_number (p->pw_uid, p->pw_gid, &si->uid_message) != 0)
+ saver_exit (si, -1, 0);
+ }
+
+
+ /* If there's anything even remotely funny looking about the passwd struct,
+ or if we're running as some other user from the list below (a
+ non-comprehensive selection of users known to be privileged in some way,
+ and not normal end-users) then disable locking. If it was possible,
+ switching to "nobody" would be the thing to do, but only root itself has
+ the privs to do that.
+
+ *** WARNING: DO NOT DISABLE THIS CODE!
+ If you do so, you will open a security hole. See the sections
+ of the xscreensaver manual titled "LOCKING AND ROOT LOGINS",
+ and "USING XDM".
+ */
+ {
+ uid_t uid = getuid (); /* get it again */
+ struct passwd *p = getpwuid (uid); /* get it again */
+
+ if (!p ||
+ uid == (uid_t) 0 ||
+ uid == (uid_t) -1 ||
+ uid == (uid_t) -2 ||
+ p->pw_uid == (uid_t) 0 ||
+ p->pw_uid == (uid_t) -1 ||
+ p->pw_uid == (uid_t) -2 ||
+ !p->pw_name ||
+ !*p->pw_name ||
+ !strcmp (p->pw_name, "root") ||
+ !strcmp (p->pw_name, "nobody") ||
+ !strcmp (p->pw_name, "noaccess") ||
+ !strcmp (p->pw_name, "operator") ||
+ !strcmp (p->pw_name, "daemon") ||
+ !strcmp (p->pw_name, "bin") ||
+ !strcmp (p->pw_name, "adm") ||
+ !strcmp (p->pw_name, "sys") ||
+ !strcmp (p->pw_name, "games"))
+ {
+ static char buf [1024];
+ sprintf (buf, "running as %.100s",
+ (p && p->pw_name && *p->pw_name
+ ? p->pw_name : "<unknown>"));
+ si->nolock_reason = buf;
+ si->locking_disabled_p = True;
+ si->dangerous_uid_p = True;
+ }
+ }
+}
diff --git a/driver/splash.c b/driver/splash.c
new file mode 100644
index 0000000..a4f1761
--- /dev/null
+++ b/driver/splash.c
@@ -0,0 +1,917 @@
+/* xscreensaver, Copyright (c) 1991-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <X11/Intrinsic.h>
+
+#include "xscreensaver.h"
+#include "resources.h"
+#include "font-retry.h"
+
+#undef MAX
+#define MAX(a,b) ((a)>(b)?(a):(b))
+
+void
+draw_shaded_rectangle (Display *dpy, Window window,
+ int x, int y,
+ int width, int height,
+ int thickness,
+ unsigned long top_color,
+ unsigned long bottom_color)
+{
+ XPoint points[4];
+ XGCValues gcv;
+ GC gc1, gc2;
+ if (thickness == 0) return;
+
+ gcv.foreground = top_color;
+ gc1 = XCreateGC (dpy, window, GCForeground, &gcv);
+ gcv.foreground = bottom_color;
+ gc2 = XCreateGC (dpy, window, GCForeground, &gcv);
+
+ points [0].x = x;
+ points [0].y = y;
+ points [1].x = x + width;
+ points [1].y = y;
+ points [2].x = x + width - thickness;
+ points [2].y = y + thickness;
+ points [3].x = x;
+ points [3].y = y + thickness;
+ XFillPolygon (dpy, window, gc1, points, 4, Convex, CoordModeOrigin);
+
+ points [0].x = x;
+ points [0].y = y + thickness;
+ points [1].x = x;
+ points [1].y = y + height;
+ points [2].x = x + thickness;
+ points [2].y = y + height - thickness;
+ points [3].x = x + thickness;
+ points [3].y = y + thickness;
+ XFillPolygon (dpy, window, gc1, points, 4, Convex, CoordModeOrigin);
+
+ points [0].x = x + width;
+ points [0].y = y;
+ points [1].x = x + width - thickness;
+ points [1].y = y + thickness;
+ points [2].x = x + width - thickness;
+ points [2].y = y + height - thickness;
+ points [3].x = x + width;
+ points [3].y = y + height - thickness;
+ XFillPolygon (dpy, window, gc2, points, 4, Convex, CoordModeOrigin);
+
+ points [0].x = x;
+ points [0].y = y + height;
+ points [1].x = x + width;
+ points [1].y = y + height;
+ points [2].x = x + width;
+ points [2].y = y + height - thickness;
+ points [3].x = x + thickness;
+ points [3].y = y + height - thickness;
+ XFillPolygon (dpy, window, gc2, points, 4, Convex, CoordModeOrigin);
+
+ XFreeGC (dpy, gc1);
+ XFreeGC (dpy, gc2);
+}
+
+
+int
+string_width (XFontStruct *font, char *s)
+{
+ return XTextWidth(font, s, strlen(s));
+}
+
+
+static void update_splash_window (saver_info *si);
+static void draw_splash_window (saver_info *si);
+static void destroy_splash_window (saver_info *si);
+static void unsplash_timer (XtPointer closure, XtIntervalId *id);
+
+static void do_demo (saver_screen_info *ssi);
+#ifdef PREFS_BUTTON
+static void do_prefs (saver_screen_info *ssi);
+#endif /* PREFS_BUTTON */
+static void do_help (saver_screen_info *ssi);
+
+
+XFontStruct *
+splash_load_font (Display *dpy, char *name, char *class)
+{
+ char *s = get_string_resource (dpy, name, class);
+ XFontStruct *f;
+ if (!s || !*s)
+ s = "-*-helvetica-bold-r-*-*-*-140-*-*-*-*-*-*";
+ f = load_font_retry (dpy, s);
+ if (!f) abort();
+ return f;
+}
+
+
+struct splash_dialog_data {
+
+ saver_screen_info *prompt_screen;
+ XtIntervalId timer;
+
+ Dimension width;
+ Dimension height;
+
+ char *heading_label;
+ char *body_label;
+ char *body2_label;
+ char *body3_label;
+ char *body4_label;
+ char *demo_label;
+#ifdef PREFS_BUTTON
+ char *prefs_label;
+#endif /* PREFS_BUTTON */
+ char *help_label;
+
+ XFontStruct *heading_font;
+ XFontStruct *body_font;
+ XFontStruct *button_font;
+
+ Pixel foreground;
+ Pixel background;
+ Pixel border;
+ Pixel button_foreground;
+ Pixel button_background;
+ Pixel shadow_top;
+ Pixel shadow_bottom;
+
+ Dimension logo_width;
+ Dimension logo_height;
+ Dimension internal_border;
+ Dimension shadow_width;
+
+ Dimension button_width, button_height;
+ Dimension demo_button_x, demo_button_y;
+#ifdef PREFS_BUTTON
+ Dimension prefs_button_x, prefs_button_y;
+#endif /* PREFS_BUTTON */
+ Dimension help_button_x, help_button_y;
+
+ Pixmap logo_pixmap;
+ Pixmap logo_clipmask;
+ int logo_npixels;
+ unsigned long *logo_pixels;
+
+ int pressed;
+};
+
+
+void
+make_splash_dialog (saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+ int x, y, bw;
+ XSetWindowAttributes attrs;
+ unsigned long attrmask = 0;
+ splash_dialog_data *sp;
+ saver_screen_info *ssi;
+ Colormap cmap;
+
+ Bool whyne = senesculent_p ();
+
+ if (whyne)
+ {
+ /* If locking is not enabled, make sure they see the message. */
+ if (!p->lock_p)
+ {
+ si->prefs.splash_p = True;
+ if (si->prefs.splash_duration < 5000)
+ si->prefs.splash_duration = 5000;
+ }
+ si->prefs.splash_duration += 3000;
+ }
+
+ if (si->sp_data)
+ return;
+ if (!si->prefs.splash_p ||
+ si->prefs.splash_duration <= 0)
+ return;
+
+ ssi = &si->screens[mouse_screen (si)];
+
+ if (!ssi || !ssi->screen)
+ return; /* WTF? Trying to splash while no screens connected? */
+
+ cmap = DefaultColormapOfScreen (ssi->screen);
+
+ sp = (splash_dialog_data *) calloc (1, sizeof(*sp));
+ sp->prompt_screen = ssi;
+
+ sp->heading_label = get_string_resource (si->dpy,
+ "splash.heading.label",
+ "Dialog.Label.Label");
+ sp->body_label = get_string_resource (si->dpy,
+ "splash.body.label",
+ "Dialog.Label.Label");
+ sp->body2_label = get_string_resource (si->dpy,
+ "splash.body2.label",
+ "Dialog.Label.Label");
+ sp->demo_label = get_string_resource (si->dpy,
+ "splash.demo.label",
+ "Dialog.Button.Label");
+#ifdef PREFS_BUTTON
+ sp->prefs_label = get_string_resource (si->dpy,
+ "splash.prefs.label",
+ "Dialog.Button.Label");
+#endif /* PREFS_BUTTON */
+ sp->help_label = get_string_resource (si->dpy,
+ "splash.help.label",
+ "Dialog.Button.Label");
+
+
+
+ if (whyne)
+ {
+ sp->body3_label = strdup("WARNING: This version is very old!");
+ sp->body4_label = strdup("Please upgrade!");
+ }
+
+ if (!sp->heading_label)
+ sp->heading_label = strdup("ERROR: REESOURCES NOT INSTALLED CORRECTLY");
+ if (!sp->body_label)
+ sp->body_label = strdup("ERROR: REESOURCES NOT INSTALLED CORRECTLY");
+ if (!sp->body2_label)
+ sp->body2_label = strdup("ERROR: REESOURCES NOT INSTALLED CORRECTLY");
+ if (!sp->demo_label) sp->demo_label = strdup("ERROR");
+#ifdef PREFS_BUTTON
+ if (!sp->prefs_label) sp->prefs_label = strdup("ERROR");
+#endif /* PREFS_BUTTON */
+ if (!sp->help_label) sp->help_label = strdup("ERROR");
+
+ /* Put the version number in the label. */
+ {
+ char *s = (char *) malloc (strlen(sp->heading_label) + 20);
+ sprintf(s, sp->heading_label, si->version);
+ free (sp->heading_label);
+ sp->heading_label = s;
+ }
+
+ sp->heading_font =
+ splash_load_font (si->dpy, "splash.headingFont", "Dialog.Font");
+ sp->body_font =
+ splash_load_font (si->dpy, "splash.bodyFont", "Dialog.Font");
+ sp->button_font =
+ splash_load_font (si->dpy, "splash.buttonFont", "Dialog.Font");
+
+ sp->foreground = get_pixel_resource (si->dpy, cmap,
+ "splash.foreground",
+ "Dialog.Foreground");
+ sp->background = get_pixel_resource (si->dpy, cmap,
+ "splash.background",
+ "Dialog.Background");
+ sp->border = get_pixel_resource (si->dpy, cmap,
+ "splash.borderColor",
+ "Dialog.borderColor");
+
+ if (sp->foreground == sp->background)
+ {
+ /* Make sure the error messages show up. */
+ sp->foreground = BlackPixelOfScreen (ssi->screen);
+ sp->background = WhitePixelOfScreen (ssi->screen);
+ }
+
+ sp->button_foreground = get_pixel_resource (si->dpy, cmap,
+ "splash.Button.foreground",
+ "Dialog.Button.Foreground");
+ sp->button_background = get_pixel_resource (si->dpy, cmap,
+ "splash.Button.background",
+ "Dialog.Button.Background");
+ sp->shadow_top = get_pixel_resource (si->dpy, cmap,
+ "splash.topShadowColor",
+ "Dialog.Foreground");
+ sp->shadow_bottom = get_pixel_resource (si->dpy, cmap,
+ "splash.bottomShadowColor",
+ "Dialog.Background");
+
+ sp->logo_width = get_integer_resource (si->dpy,
+ "splash.logo.width",
+ "Dialog.Logo.Width");
+ sp->logo_height = get_integer_resource (si->dpy,
+ "splash.logo.height",
+ "Dialog.Logo.Height");
+ sp->internal_border = get_integer_resource (si->dpy,
+ "splash.internalBorderWidth",
+ "Dialog.InternalBorderWidth");
+ sp->shadow_width = get_integer_resource (si->dpy,
+ "splash.shadowThickness",
+ "Dialog.ShadowThickness");
+
+ if (sp->logo_width == 0) sp->logo_width = 150;
+ if (sp->logo_height == 0) sp->logo_height = 150;
+ if (sp->internal_border == 0) sp->internal_border = 15;
+ if (sp->shadow_width == 0) sp->shadow_width = 4;
+
+ {
+ int direction, ascent, descent;
+ XCharStruct overall;
+
+ sp->width = 0;
+ sp->height = 0;
+
+ /* Measure the heading_label. */
+ XTextExtents (sp->heading_font,
+ sp->heading_label, strlen(sp->heading_label),
+ &direction, &ascent, &descent, &overall);
+ if (overall.width > sp->width) sp->width = overall.width;
+ sp->height += ascent + descent;
+
+ /* Measure the body_label. */
+ XTextExtents (sp->body_font,
+ sp->body_label, strlen(sp->body_label),
+ &direction, &ascent, &descent, &overall);
+ if (overall.width > sp->width) sp->width = overall.width;
+ sp->height += ascent + descent;
+
+ /* Measure the body2_label. */
+ XTextExtents (sp->body_font,
+ sp->body2_label, strlen(sp->body2_label),
+ &direction, &ascent, &descent, &overall);
+ if (overall.width > sp->width) sp->width = overall.width;
+ sp->height += ascent + descent;
+
+ /* Measure the optional body3_label. */
+ if (sp->body3_label)
+ {
+ XTextExtents (sp->heading_font,
+ sp->body3_label, strlen(sp->body3_label),
+ &direction, &ascent, &descent, &overall);
+ if (overall.width > sp->width) sp->width = overall.width;
+ XTextExtents (sp->heading_font,
+ sp->body4_label, strlen(sp->body4_label),
+ &direction, &ascent, &descent, &overall);
+ if (overall.width > sp->width) sp->width = overall.width;
+ sp->height += (ascent + descent) * 5;
+ }
+
+ {
+ Dimension w2 = 0, w3 = 0, w4 = 0;
+ Dimension h2 = 0, h3 = 0, h4 = 0;
+
+ /* Measure the Demo button. */
+ XTextExtents (sp->button_font,
+ sp->demo_label, strlen(sp->demo_label),
+ &direction, &ascent, &descent, &overall);
+ w2 = overall.width;
+ h2 = ascent + descent;
+
+#ifdef PREFS_BUTTON
+ /* Measure the Prefs button. */
+ XTextExtents (sp->button_font,
+ sp->prefs_label, strlen(sp->prefs_label),
+ &direction, &ascent, &descent, &overall);
+ w3 = overall.width;
+ h3 = ascent + descent;
+#else /* !PREFS_BUTTON */
+ w3 = 0;
+ h3 = 0;
+#endif /* !PREFS_BUTTON */
+
+ /* Measure the Help button. */
+ XTextExtents (sp->button_font,
+ sp->help_label, strlen(sp->help_label),
+ &direction, &ascent, &descent, &overall);
+ w4 = overall.width;
+ h4 = ascent + descent;
+
+ w2 = MAX(w2, w3); w2 = MAX(w2, w4);
+ h2 = MAX(h2, h3); h2 = MAX(h2, h4);
+
+ /* Add some horizontal padding inside the buttons. */
+ w2 += ascent;
+
+ w2 += ((ascent + descent) / 2) + (sp->shadow_width * 2);
+ h2 += ((ascent + descent) / 2) + (sp->shadow_width * 2);
+
+ sp->button_width = w2;
+ sp->button_height = h2;
+
+#ifdef PREFS_BUTTON
+ w2 *= 3;
+#else /* !PREFS_BUTTON */
+ w2 *= 2;
+#endif /* !PREFS_BUTTON */
+
+ w2 += ((ascent + descent) * 2); /* for space between buttons */
+
+ if (w2 > sp->width) sp->width = w2;
+ sp->height += h2;
+ }
+
+ sp->width += (sp->internal_border * 2);
+ sp->height += (sp->internal_border * 3);
+
+ if (sp->logo_height > sp->height)
+ sp->height = sp->logo_height;
+ else if (sp->height > sp->logo_height)
+ sp->logo_height = sp->height;
+
+ sp->logo_width = sp->logo_height;
+
+ sp->width += sp->logo_width;
+ }
+
+ attrmask |= CWOverrideRedirect; attrs.override_redirect = True;
+ attrmask |= CWEventMask;
+ attrs.event_mask = (ExposureMask | ButtonPressMask | ButtonReleaseMask);
+
+ {
+ int sx = 0, sy = 0, w, h;
+
+ x = ssi->x;
+ y = ssi->y;
+ w = ssi->width;
+ h = ssi->height;
+ if (si->prefs.debug_p) w /= 2;
+ x = sx + (((w + sp->width) / 2) - sp->width);
+ y = sy + (((h + sp->height) / 2) - sp->height);
+ if (x < sx) x = sx;
+ if (y < sy) y = sy;
+ }
+
+ bw = get_integer_resource (si->dpy,
+ "splash.borderWidth",
+ "Dialog.BorderWidth");
+
+ si->splash_dialog =
+ XCreateWindow (si->dpy,
+ RootWindowOfScreen(ssi->screen),
+ x, y, sp->width, sp->height, bw,
+ DefaultDepthOfScreen (ssi->screen), InputOutput,
+ DefaultVisualOfScreen(ssi->screen),
+ attrmask, &attrs);
+ XSetWindowBackground (si->dpy, si->splash_dialog, sp->background);
+ XSetWindowBorder (si->dpy, si->splash_dialog, sp->border);
+
+
+ sp->logo_pixmap = xscreensaver_logo (ssi->screen,
+ /* same visual as si->splash_dialog */
+ DefaultVisualOfScreen (ssi->screen),
+ si->splash_dialog, cmap,
+ sp->background,
+ &sp->logo_pixels, &sp->logo_npixels,
+ &sp->logo_clipmask, True);
+
+ XMapRaised (si->dpy, si->splash_dialog);
+ XSync (si->dpy, False);
+
+ si->sp_data = sp;
+
+ sp->timer = XtAppAddTimeOut (si->app, si->prefs.splash_duration,
+ unsplash_timer, (XtPointer) si);
+
+ draw_splash_window (si);
+ XSync (si->dpy, False);
+}
+
+
+static void
+draw_splash_window (saver_info *si)
+{
+ splash_dialog_data *sp = si->sp_data;
+ XGCValues gcv;
+ GC gc1, gc2;
+ int vspacing, height;
+ int x1, x2, x3, y1, y2;
+ int sw;
+
+#ifdef PREFS_BUTTON
+ int hspacing;
+ int nbuttons = 3;
+#endif /* !PREFS_BUTTON */
+
+ height = (sp->heading_font->ascent + sp->heading_font->descent +
+ sp->body_font->ascent + sp->body_font->descent +
+ sp->body_font->ascent + sp->body_font->descent +
+ sp->button_font->ascent + sp->button_font->descent);
+ vspacing = ((sp->height
+ - (4 * sp->shadow_width)
+ - (2 * sp->internal_border)
+ - height) / 5);
+ if (vspacing < 0) vspacing = 0;
+ if (vspacing > (sp->heading_font->ascent * 2))
+ vspacing = (sp->heading_font->ascent * 2);
+
+ gcv.foreground = sp->foreground;
+ gc1 = XCreateGC (si->dpy, si->splash_dialog, GCForeground, &gcv);
+ gc2 = XCreateGC (si->dpy, si->splash_dialog, GCForeground, &gcv);
+ x1 = sp->logo_width;
+ x3 = sp->width - (sp->shadow_width * 2);
+ y1 = sp->internal_border;
+
+ /* top heading
+ */
+ XSetFont (si->dpy, gc1, sp->heading_font->fid);
+ sw = string_width (sp->heading_font, sp->heading_label);
+ x2 = (x1 + ((x3 - x1 - sw) / 2));
+ y1 += sp->heading_font->ascent;
+ XDrawString (si->dpy, si->splash_dialog, gc1, x2, y1,
+ sp->heading_label, strlen(sp->heading_label));
+ y1 += sp->heading_font->descent;
+
+ /* text below top heading
+ */
+ XSetFont (si->dpy, gc1, sp->body_font->fid);
+ y1 += vspacing + sp->body_font->ascent;
+ sw = string_width (sp->body_font, sp->body_label);
+ x2 = (x1 + ((x3 - x1 - sw) / 2));
+ XDrawString (si->dpy, si->splash_dialog, gc1, x2, y1,
+ sp->body_label, strlen(sp->body_label));
+ y1 += sp->body_font->descent;
+
+ y1 += sp->body_font->ascent;
+ sw = string_width (sp->body_font, sp->body2_label);
+ x2 = (x1 + ((x3 - x1 - sw) / 2));
+ XDrawString (si->dpy, si->splash_dialog, gc1, x2, y1,
+ sp->body2_label, strlen(sp->body2_label));
+ y1 += sp->body_font->descent;
+
+ if (sp->body3_label)
+ {
+ XSetFont (si->dpy, gc1, sp->heading_font->fid);
+ y1 += sp->heading_font->ascent + sp->heading_font->descent;
+ y1 += sp->heading_font->ascent;
+ sw = string_width (sp->heading_font, sp->body3_label);
+ x2 = (x1 + ((x3 - x1 - sw) / 2));
+ XDrawString (si->dpy, si->splash_dialog, gc1, x2, y1,
+ sp->body3_label, strlen(sp->body3_label));
+ y1 += sp->heading_font->descent + sp->heading_font->ascent;
+ sw = string_width (sp->heading_font, sp->body4_label);
+ x2 = (x1 + ((x3 - x1 - sw) / 2));
+ XDrawString (si->dpy, si->splash_dialog, gc1, x2, y1,
+ sp->body4_label, strlen(sp->body4_label));
+ y1 += sp->heading_font->descent;
+ XSetFont (si->dpy, gc1, sp->body_font->fid);
+ }
+
+ /* The buttons
+ */
+ XSetForeground (si->dpy, gc1, sp->button_foreground);
+ XSetForeground (si->dpy, gc2, sp->button_background);
+
+/* y1 += (vspacing * 2);*/
+ y1 = sp->height - sp->internal_border - sp->button_height;
+
+ x1 += sp->internal_border;
+ y2 = (y1 + ((sp->button_height -
+ (sp->button_font->ascent + sp->button_font->descent))
+ / 2)
+ + sp->button_font->ascent);
+#ifdef PREFS_BUTTON
+ hspacing = ((sp->width - x1 - (sp->shadow_width * 2) -
+ sp->internal_border - (sp->button_width * nbuttons))
+ / 2);
+#endif
+
+ x2 = x1 + ((sp->button_width - string_width(sp->button_font, sp->demo_label))
+ / 2);
+ XFillRectangle (si->dpy, si->splash_dialog, gc2, x1, y1,
+ sp->button_width, sp->button_height);
+ XDrawString (si->dpy, si->splash_dialog, gc1, x2, y2,
+ sp->demo_label, strlen(sp->demo_label));
+ sp->demo_button_x = x1;
+ sp->demo_button_y = y1;
+
+#ifdef PREFS_BUTTON
+ x1 += hspacing + sp->button_width;
+ x2 = x1 + ((sp->button_width - string_width(sp->button_font,sp->prefs_label))
+ / 2);
+ XFillRectangle (si->dpy, si->splash_dialog, gc2, x1, y1,
+ sp->button_width, sp->button_height);
+ XDrawString (si->dpy, si->splash_dialog, gc1, x2, y2,
+ sp->prefs_label, strlen(sp->prefs_label));
+ sp->prefs_button_x = x1;
+ sp->prefs_button_y = y1;
+#endif /* PREFS_BUTTON */
+
+#ifdef PREFS_BUTTON
+ x1 += hspacing + sp->button_width;
+#else /* !PREFS_BUTTON */
+ x1 = (sp->width - sp->button_width -
+ sp->internal_border - (sp->shadow_width * 2));
+#endif /* !PREFS_BUTTON */
+
+ x2 = x1 + ((sp->button_width - string_width(sp->button_font,sp->help_label))
+ / 2);
+ XFillRectangle (si->dpy, si->splash_dialog, gc2, x1, y1,
+ sp->button_width, sp->button_height);
+ XDrawString (si->dpy, si->splash_dialog, gc1, x2, y2,
+ sp->help_label, strlen(sp->help_label));
+ sp->help_button_x = x1;
+ sp->help_button_y = y1;
+
+
+ /* The logo
+ */
+ x1 = sp->shadow_width * 6;
+ y1 = sp->shadow_width * 6;
+ x2 = sp->logo_width - (sp->shadow_width * 12);
+ y2 = sp->logo_height - (sp->shadow_width * 12);
+
+ if (sp->logo_pixmap)
+ {
+ Window root;
+ int x, y;
+ unsigned int w, h, bw, d;
+ XGetGeometry (si->dpy, sp->logo_pixmap, &root, &x, &y, &w, &h, &bw, &d);
+ XSetForeground (si->dpy, gc1, sp->foreground);
+ XSetBackground (si->dpy, gc1, sp->background);
+ XSetClipMask (si->dpy, gc1, sp->logo_clipmask);
+ XSetClipOrigin (si->dpy, gc1, x1 + ((x2 - (int)w) /2), y1 + ((y2 - (int)h) / 2));
+ if (d == 1)
+ XCopyPlane (si->dpy, sp->logo_pixmap, si->splash_dialog, gc1,
+ 0, 0, w, h,
+ x1 + ((x2 - (int)w) / 2),
+ y1 + ((y2 - (int)h) / 2),
+ 1);
+ else
+ XCopyArea (si->dpy, sp->logo_pixmap, si->splash_dialog, gc1,
+ 0, 0, w, h,
+ x1 + ((x2 - (int)w) / 2),
+ y1 + ((y2 - (int)h) / 2));
+ }
+
+ /* Solid border inside the logo box. */
+#if 0
+ XSetForeground (si->dpy, gc1, sp->foreground);
+ XDrawRectangle (si->dpy, si->splash_dialog, gc1, x1, y1, x2-1, y2-1);
+#endif
+
+ /* The shadow around the logo
+ */
+ draw_shaded_rectangle (si->dpy, si->splash_dialog,
+ sp->shadow_width * 4,
+ sp->shadow_width * 4,
+ sp->logo_width - (sp->shadow_width * 8),
+ sp->logo_height - (sp->shadow_width * 8),
+ sp->shadow_width,
+ sp->shadow_bottom, sp->shadow_top);
+
+ /* The shadow around the whole window
+ */
+ draw_shaded_rectangle (si->dpy, si->splash_dialog,
+ 0, 0, sp->width, sp->height, sp->shadow_width,
+ sp->shadow_top, sp->shadow_bottom);
+
+ XFreeGC (si->dpy, gc1);
+ XFreeGC (si->dpy, gc2);
+
+ update_splash_window (si);
+}
+
+
+static void
+update_splash_window (saver_info *si)
+{
+ splash_dialog_data *sp = si->sp_data;
+ int pressed;
+ if (!sp) return;
+ pressed = sp->pressed;
+
+ /* The shadows around the buttons
+ */
+ draw_shaded_rectangle (si->dpy, si->splash_dialog,
+ sp->demo_button_x, sp->demo_button_y,
+ sp->button_width, sp->button_height, sp->shadow_width,
+ (pressed == 1 ? sp->shadow_bottom : sp->shadow_top),
+ (pressed == 1 ? sp->shadow_top : sp->shadow_bottom));
+#ifdef PREFS_BUTTON
+ draw_shaded_rectangle (si->dpy, si->splash_dialog,
+ sp->prefs_button_x, sp->prefs_button_y,
+ sp->button_width, sp->button_height, sp->shadow_width,
+ (pressed == 2 ? sp->shadow_bottom : sp->shadow_top),
+ (pressed == 2 ? sp->shadow_top : sp->shadow_bottom));
+#endif /* PREFS_BUTTON */
+ draw_shaded_rectangle (si->dpy, si->splash_dialog,
+ sp->help_button_x, sp->help_button_y,
+ sp->button_width, sp->button_height, sp->shadow_width,
+ (pressed == 3 ? sp->shadow_bottom : sp->shadow_top),
+ (pressed == 3 ? sp->shadow_top : sp->shadow_bottom));
+}
+
+static void
+destroy_splash_window (saver_info *si)
+{
+ splash_dialog_data *sp = si->sp_data;
+ saver_screen_info *ssi = sp->prompt_screen;
+ Colormap cmap = DefaultColormapOfScreen (ssi->screen);
+ Pixel black = BlackPixelOfScreen (ssi->screen);
+ Pixel white = WhitePixelOfScreen (ssi->screen);
+
+ if (sp->timer)
+ XtRemoveTimeOut (sp->timer);
+
+ if (si->splash_dialog)
+ {
+ XDestroyWindow (si->dpy, si->splash_dialog);
+ si->splash_dialog = 0;
+ }
+
+ if (sp->heading_label) free (sp->heading_label);
+ if (sp->body_label) free (sp->body_label);
+ if (sp->body2_label) free (sp->body2_label);
+ if (sp->body3_label) free (sp->body3_label);
+ if (sp->body4_label) free (sp->body4_label);
+ if (sp->demo_label) free (sp->demo_label);
+#ifdef PREFS_BUTTON
+ if (sp->prefs_label) free (sp->prefs_label);
+#endif /* PREFS_BUTTON */
+ if (sp->help_label) free (sp->help_label);
+
+ if (sp->heading_font) XFreeFont (si->dpy, sp->heading_font);
+ if (sp->body_font) XFreeFont (si->dpy, sp->body_font);
+ if (sp->button_font) XFreeFont (si->dpy, sp->button_font);
+
+ if (sp->foreground != black && sp->foreground != white)
+ XFreeColors (si->dpy, cmap, &sp->foreground, 1, 0L);
+ if (sp->background != black && sp->background != white)
+ XFreeColors (si->dpy, cmap, &sp->background, 1, 0L);
+ if (sp->button_foreground != black && sp->button_foreground != white)
+ XFreeColors (si->dpy, cmap, &sp->button_foreground, 1, 0L);
+ if (sp->button_background != black && sp->button_background != white)
+ XFreeColors (si->dpy, cmap, &sp->button_background, 1, 0L);
+ if (sp->shadow_top != black && sp->shadow_top != white)
+ XFreeColors (si->dpy, cmap, &sp->shadow_top, 1, 0L);
+ if (sp->shadow_bottom != black && sp->shadow_bottom != white)
+ XFreeColors (si->dpy, cmap, &sp->shadow_bottom, 1, 0L);
+
+ if (sp->logo_pixmap)
+ XFreePixmap (si->dpy, sp->logo_pixmap);
+ if (sp->logo_clipmask)
+ XFreePixmap (si->dpy, sp->logo_clipmask);
+ if (sp->logo_pixels)
+ {
+ if (sp->logo_npixels)
+ XFreeColors (si->dpy, cmap, sp->logo_pixels, sp->logo_npixels, 0L);
+ free (sp->logo_pixels);
+ sp->logo_pixels = 0;
+ sp->logo_npixels = 0;
+ }
+
+ memset (sp, 0, sizeof(*sp));
+ free (sp);
+ si->sp_data = 0;
+}
+
+void
+handle_splash_event (saver_info *si, XEvent *event)
+{
+ splash_dialog_data *sp = si->sp_data;
+ saver_screen_info *ssi;
+ int which = 0;
+ if (!sp) return;
+ ssi = sp->prompt_screen;
+
+ switch (event->xany.type)
+ {
+ case Expose:
+ draw_splash_window (si);
+ break;
+
+ case ButtonPress: case ButtonRelease:
+
+ if (event->xbutton.x >= sp->demo_button_x &&
+ event->xbutton.x < sp->demo_button_x + sp->button_width &&
+ event->xbutton.y >= sp->demo_button_y &&
+ event->xbutton.y < sp->demo_button_y + sp->button_height)
+ which = 1;
+
+#ifdef PREFS_BUTTON
+ else if (event->xbutton.x >= sp->prefs_button_x &&
+ event->xbutton.x < sp->prefs_button_x + sp->button_width &&
+ event->xbutton.y >= sp->prefs_button_y &&
+ event->xbutton.y < sp->prefs_button_y + sp->button_height)
+ which = 2;
+#endif /* PREFS_BUTTON */
+
+ else if (event->xbutton.x >= sp->help_button_x &&
+ event->xbutton.x < sp->help_button_x + sp->button_width &&
+ event->xbutton.y >= sp->help_button_y &&
+ event->xbutton.y < sp->help_button_y + sp->button_height)
+ which = 3;
+
+ if (event->xany.type == ButtonPress)
+ {
+ sp->pressed = which;
+ update_splash_window (si);
+ if (which == 0)
+ XBell (si->dpy, False);
+ }
+ else if (event->xany.type == ButtonRelease)
+ {
+ if (which && sp->pressed == which)
+ {
+ destroy_splash_window (si);
+ sp = si->sp_data;
+ switch (which)
+ {
+ case 1: do_demo (ssi); break;
+#ifdef PREFS_BUTTON
+ case 2: do_prefs (ssi); break;
+#endif /* PREFS_BUTTON */
+ case 3: do_help (ssi); break;
+ default: abort();
+ }
+ }
+ else if (which == 0 && sp->pressed == 0)
+ {
+ /* click and release on the window but not in a button:
+ treat that as "dismiss the splash dialog." */
+ destroy_splash_window (si);
+ sp = si->sp_data;
+ }
+ if (sp) sp->pressed = 0;
+ update_splash_window (si);
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+static void
+unsplash_timer (XtPointer closure, XtIntervalId *id)
+{
+ saver_info *si = (saver_info *) closure;
+ if (si && si->sp_data)
+ destroy_splash_window (si);
+}
+
+
+/* Button callbacks */
+
+#ifdef VMS
+# define pid_t int
+# define fork vfork
+#endif /* VMS */
+
+
+static void
+do_demo (saver_screen_info *ssi)
+{
+ saver_info *si = ssi->global;
+ saver_preferences *p = &si->prefs;
+ const char *cmd = p->demo_command;
+
+ if (cmd && *cmd)
+ fork_and_exec (ssi, cmd);
+ else
+ fprintf (stderr, "%s: no demo-mode command has been specified.\n",
+ blurb());
+}
+
+#ifdef PREFS_BUTTON
+static void
+do_prefs (saver_screen_info *ssi)
+{
+ saver_info *si = ssi->global;
+ saver_preferences *p = &si->prefs;
+ const char *cmd = p->prefs_command;
+
+ if (command && *command)
+ fork_and_exec (ssi, cmd);
+ else
+ fprintf (stderr, "%s: no preferences command has been specified.\n",
+ blurb());
+}
+#endif /* PREFS_BUTTON */
+
+static void
+do_help (saver_screen_info *ssi)
+{
+ saver_info *si = ssi->global;
+ saver_preferences *p = &si->prefs;
+ char *help_command = 0;
+
+ if (!p->load_url_command || !*p->load_url_command)
+ {
+ fprintf (stderr, "%s: no URL command has been specified.\n", blurb());
+ return;
+ }
+ if (!p->help_url || !*p->help_url)
+ {
+ fprintf (stderr, "%s: no Help URL has been specified.\n", blurb());
+ return;
+ }
+
+ help_command = (char *) malloc (strlen (p->load_url_command) +
+ (strlen (p->help_url) * 4) + 10);
+ sprintf (help_command, p->load_url_command,
+ p->help_url, p->help_url, p->help_url, p->help_url);
+
+ fork_and_exec (ssi, help_command);
+ free (help_command);
+}
diff --git a/driver/stderr.c b/driver/stderr.c
new file mode 100644
index 0000000..84fa697
--- /dev/null
+++ b/driver/stderr.c
@@ -0,0 +1,560 @@
+/* stderr.c --- capturing stdout/stderr output onto the screensaver window.
+ * xscreensaver, Copyright (c) 1991-2016 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* stderr hackery - Why Unix Sucks, reason number 32767.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+
+#include <stdio.h>
+#include <time.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#ifdef HAVE_FCNTL
+# include <fcntl.h>
+#endif
+
+#include <X11/Intrinsic.h>
+
+#include "xscreensaver.h"
+#include "resources.h"
+#include "visual.h"
+
+FILE *real_stderr = 0;
+FILE *real_stdout = 0;
+
+
+/* It's ok for these to be global, since they refer to the one and only
+ stderr stream, not to a particular screen or window or visual.
+ */
+static char stderr_buffer [4096];
+static char *stderr_tail = 0;
+static time_t stderr_last_read = 0;
+
+static int stderr_stdout_read_fd = -1;
+
+static void make_stderr_overlay_window (saver_screen_info *);
+
+
+/* Recreates the stderr window or GCs: do this when the xscreensaver window
+ on a screen has been re-created.
+ */
+void
+reset_stderr (saver_screen_info *ssi)
+{
+ saver_info *si = ssi->global;
+
+ if (si->prefs.debug_p)
+ fprintf ((real_stderr ? real_stderr : stderr),
+ "%s: resetting stderr\n", blurb());
+
+ ssi->stderr_text_x = 0;
+ ssi->stderr_text_y = 0;
+
+ if (ssi->stderr_gc)
+ XFreeGC (si->dpy, ssi->stderr_gc);
+ ssi->stderr_gc = 0;
+
+ if (ssi->stderr_overlay_window)
+ XDestroyWindow(si->dpy, ssi->stderr_overlay_window);
+ ssi->stderr_overlay_window = 0;
+
+ if (ssi->stderr_cmap)
+ XFreeColormap(si->dpy, ssi->stderr_cmap);
+ ssi->stderr_cmap = 0;
+}
+
+/* Erases any stderr text overlaying the screen (if possible) and resets
+ the stderr output cursor to the upper left. Do this when the xscreensaver
+ window is cleared.
+ */
+void
+clear_stderr (saver_screen_info *ssi)
+{
+ saver_info *si = ssi->global;
+ ssi->stderr_text_x = 0;
+ ssi->stderr_text_y = 0;
+ if (ssi->stderr_overlay_window)
+ XClearWindow (si->dpy, ssi->stderr_overlay_window);
+}
+
+
+/* Draws the string on the screen's window.
+ */
+static void
+print_stderr_1 (saver_screen_info *ssi, char *string)
+{
+ saver_info *si = ssi->global;
+ Display *dpy = si->dpy;
+ Screen *screen = ssi->screen;
+ Window window = (ssi->stderr_overlay_window ?
+ ssi->stderr_overlay_window :
+ ssi->screensaver_window);
+ int h_border = 20;
+ int v_border = 20;
+ char *head = string;
+ char *tail;
+
+ if (! ssi->stderr_font)
+ {
+ char *font_name = get_string_resource (dpy, "font", "Font");
+ if (!font_name) font_name = strdup ("fixed");
+ ssi->stderr_font = XLoadQueryFont (dpy, font_name);
+ if (! ssi->stderr_font) ssi->stderr_font = XLoadQueryFont (dpy, "fixed");
+ ssi->stderr_line_height = (ssi->stderr_font->ascent +
+ ssi->stderr_font->descent);
+ free (font_name);
+ }
+
+ if (! ssi->stderr_gc)
+ {
+ XGCValues gcv;
+ Pixel fg, bg;
+ Colormap cmap = ssi->cmap;
+
+ if (!ssi->stderr_overlay_window &&
+ get_boolean_resource(dpy, "overlayStderr", "Boolean"))
+ {
+ make_stderr_overlay_window (ssi);
+ if (ssi->stderr_overlay_window)
+ window = ssi->stderr_overlay_window;
+ if (ssi->stderr_cmap)
+ cmap = ssi->stderr_cmap;
+ }
+
+ fg = get_pixel_resource (dpy,cmap,"overlayTextForeground","Foreground");
+ bg = get_pixel_resource (dpy,cmap,"overlayTextBackground","Background");
+ gcv.font = ssi->stderr_font->fid;
+ gcv.foreground = fg;
+ gcv.background = bg;
+ ssi->stderr_gc = XCreateGC (dpy, window,
+ (GCFont | GCForeground | GCBackground),
+ &gcv);
+ }
+
+
+ if (ssi->stderr_cmap)
+ XInstallColormap(si->dpy, ssi->stderr_cmap);
+
+ for (tail = string; *tail; tail++)
+ {
+ if (*tail == '\n' || *tail == '\r')
+ {
+ int maxy = HeightOfScreen (screen) - v_border - v_border;
+ if (tail != head)
+ XDrawImageString (dpy, window, ssi->stderr_gc,
+ ssi->stderr_text_x + h_border,
+ ssi->stderr_text_y + v_border +
+ ssi->stderr_font->ascent,
+ head, tail - head);
+ ssi->stderr_text_x = 0;
+ ssi->stderr_text_y += ssi->stderr_line_height;
+ head = tail + 1;
+ if (*tail == '\r' && *head == '\n')
+ head++, tail++;
+
+ if (ssi->stderr_text_y > maxy - ssi->stderr_line_height)
+ {
+#if 0
+ ssi->stderr_text_y = 0;
+#else
+ int offset = ssi->stderr_line_height * 5;
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (dpy, window, &xgwa);
+
+ XCopyArea (dpy, window, window, ssi->stderr_gc,
+ 0, v_border + offset,
+ xgwa.width,
+ (xgwa.height - v_border - v_border - offset),
+ 0, v_border);
+ XClearArea (dpy, window,
+ 0, xgwa.height - v_border - offset,
+ xgwa.width, offset, False);
+ ssi->stderr_text_y -= offset;
+#endif
+ }
+ }
+ }
+ if (tail != head)
+ {
+ int direction, ascent, descent;
+ XCharStruct overall;
+ XDrawImageString (dpy, window, ssi->stderr_gc,
+ ssi->stderr_text_x + h_border,
+ ssi->stderr_text_y + v_border
+ + ssi->stderr_font->ascent,
+ head, tail - head);
+ XTextExtents (ssi->stderr_font, tail, tail - head,
+ &direction, &ascent, &descent, &overall);
+ ssi->stderr_text_x += overall.width;
+ }
+}
+
+static void
+make_stderr_overlay_window (saver_screen_info *ssi)
+{
+ saver_info *si = ssi->global;
+ unsigned long transparent_pixel = 0;
+ Visual *visual = get_overlay_visual (ssi->screen, &transparent_pixel);
+ if (visual)
+ {
+ int depth = visual_depth (ssi->screen, visual);
+ XSetWindowAttributes attrs;
+ XWindowAttributes xgwa;
+ unsigned long attrmask;
+ XGetWindowAttributes (si->dpy, ssi->screensaver_window, &xgwa);
+
+ if (si->prefs.debug_p)
+ fprintf(real_stderr,
+ "%s: using overlay visual 0x%0x for stderr text layer.\n",
+ blurb(), (int) XVisualIDFromVisual (visual));
+
+ ssi->stderr_cmap = XCreateColormap(si->dpy,
+ RootWindowOfScreen(ssi->screen),
+ visual, AllocNone);
+
+ attrmask = (CWColormap | CWBackPixel | CWBackingPixel | CWBorderPixel |
+ CWBackingStore | CWSaveUnder);
+ attrs.colormap = ssi->stderr_cmap;
+ attrs.background_pixel = transparent_pixel;
+ attrs.backing_pixel = transparent_pixel;
+ attrs.border_pixel = transparent_pixel;
+ attrs.backing_store = NotUseful;
+ attrs.save_under = False;
+
+ ssi->stderr_overlay_window =
+ XCreateWindow(si->dpy, ssi->screensaver_window, 0, 0,
+ xgwa.width, xgwa.height,
+ 0, depth, InputOutput, visual, attrmask, &attrs);
+ XMapRaised(si->dpy, ssi->stderr_overlay_window);
+ }
+}
+
+
+/* Draws the string on each screen's window as error text.
+ */
+static void
+print_stderr (saver_info *si, char *string)
+{
+ saver_preferences *p = &si->prefs;
+ int i;
+
+ /* In verbose mode, copy it to stderr as well. */
+ if (p->verbose_p)
+ fprintf (real_stderr, "%s", string);
+
+ for (i = 0; i < si->nscreens; i++)
+ print_stderr_1 (&si->screens[i], string);
+}
+
+
+/* Polls the stderr buffer every few seconds and if it finds any text,
+ writes it on all screens.
+ */
+static void
+stderr_popup_timer_fn (XtPointer closure, XtIntervalId *id)
+{
+ saver_info *si = (saver_info *) closure;
+ char *s = stderr_buffer;
+ if (*s)
+ {
+ /* If too much data was printed, then something has gone haywire,
+ so truncate it. */
+ char *trailer = "\n\n<< stderr diagnostics have been truncated >>\n\n";
+ int max = sizeof (stderr_buffer) - strlen (trailer) - 5;
+ if (strlen (s) > max)
+ strcpy (s + max, trailer);
+ /* Now show the user. */
+ print_stderr (si, s);
+ }
+
+ stderr_tail = stderr_buffer;
+ si->stderr_popup_timer = 0;
+}
+
+
+/* Called when data becomes available on the stderr pipe. Copies it into
+ stderr_buffer where stderr_popup_timer_fn() can find it later.
+ */
+static void
+stderr_callback (XtPointer closure, int *fd, XtIntervalId *id)
+{
+ saver_info *si = (saver_info *) closure;
+ char *s;
+ int left;
+ int size;
+ int read_this_time = 0;
+
+ if (!fd || *fd < 0 || *fd != stderr_stdout_read_fd)
+ abort();
+
+ if (stderr_tail == 0)
+ stderr_tail = stderr_buffer;
+
+ left = ((sizeof (stderr_buffer) - 2) - (stderr_tail - stderr_buffer));
+
+ s = stderr_tail;
+ *s = 0;
+
+ /* Read as much data from the fd as we can, up to our buffer size. */
+ if (left > 0)
+ {
+ while ((size = read (*fd, (void *) s, left)) > 0)
+ {
+ left -= size;
+ s += size;
+ read_this_time += size;
+ }
+ *s = 0;
+ }
+ else
+ {
+ char buf2 [1024];
+ /* The buffer is full; flush the rest of it. */
+ while (read (*fd, (void *) buf2, sizeof (buf2)) > 0)
+ ;
+ }
+
+ stderr_tail = s;
+ stderr_last_read = time ((time_t *) 0);
+
+ /* Now we have read some data that we would like to put up in a dialog
+ box. But more data may still be coming in - so don't pop up the
+ dialog right now, but instead, start a timer that will pop it up
+ a second from now. Should more data come in in the meantime, we
+ will be called again, and will reset that timer again. So the
+ dialog will only pop up when a second has elapsed with no new data
+ being written to stderr.
+
+ However, if the buffer is full (meaning lots of data has been written)
+ then we don't reset the timer.
+ */
+ if (read_this_time > 0)
+ {
+ if (si->stderr_popup_timer)
+ XtRemoveTimeOut (si->stderr_popup_timer);
+
+ si->stderr_popup_timer =
+ XtAppAddTimeOut (si->app, 1 * 1000, stderr_popup_timer_fn,
+ (XtPointer) si);
+ }
+}
+
+/* If stderr capturing is desired, this replaces `stdout' and `stderr'
+ with a pipe, so that any output written to them will show up on the
+ screen as well as on the original value of those streams.
+ */
+void
+initialize_stderr (saver_info *si)
+{
+ static Boolean done = False;
+ int fds [2];
+ int in, out;
+ int new_stdout, new_stderr;
+ int stdout_fd = 1;
+ int stderr_fd = 2;
+ int flags = 0;
+ Boolean stderr_dialog_p;
+
+ if (done) return;
+ done = True;
+
+ real_stderr = stderr;
+ real_stdout = stdout;
+
+ stderr_dialog_p = get_boolean_resource (si->dpy, "captureStderr", "Boolean");
+
+ if (!stderr_dialog_p)
+ return;
+
+ if (pipe (fds))
+ {
+ perror ("error creating pipe:");
+ return;
+ }
+
+ in = fds [0];
+ out = fds [1];
+
+# ifdef HAVE_FCNTL
+
+# if defined(O_NONBLOCK)
+ flags = O_NONBLOCK;
+# elif defined(O_NDELAY)
+ flags = O_NDELAY;
+# else
+ ERROR!! neither O_NONBLOCK nor O_NDELAY are defined.
+# endif
+
+ /* Set both sides of the pipe to nonblocking - this is so that
+ our reads (in stderr_callback) will terminate, and so that
+ out writes (in the client programs) will silently fail when
+ the pipe is full, instead of hosing the program. */
+ if (fcntl (in, F_SETFL, flags) != 0)
+ {
+ perror ("fcntl:");
+ return;
+ }
+ if (fcntl (out, F_SETFL, flags) != 0)
+ {
+ perror ("fcntl:");
+ return;
+ }
+
+# endif /* !HAVE_FCNTL */
+
+ if (stderr_dialog_p)
+ {
+ FILE *new_stderr_file;
+ FILE *new_stdout_file;
+
+ new_stderr = dup (stderr_fd);
+ if (new_stderr < 0)
+ {
+ perror ("could not dup() a stderr:");
+ return;
+ }
+ if (! (new_stderr_file = fdopen (new_stderr, "w")))
+ {
+ perror ("could not fdopen() the new stderr:");
+ return;
+ }
+ real_stderr = new_stderr_file;
+
+ close (stderr_fd);
+ if (dup2 (out, stderr_fd) < 0)
+ {
+ perror ("could not dup() a new stderr:");
+ return;
+ }
+
+
+ new_stdout = dup (stdout_fd);
+ if (new_stdout < 0)
+ {
+ perror ("could not dup() a stdout:");
+ return;
+ }
+ if (! (new_stdout_file = fdopen (new_stdout, "w")))
+ {
+ perror ("could not fdopen() the new stdout:");
+ return;
+ }
+ real_stdout = new_stdout_file;
+
+ close (stdout_fd);
+ if (dup2 (out, stdout_fd) < 0)
+ {
+ perror ("could not dup() a new stdout:");
+ return;
+ }
+ close (out);
+ }
+
+ stderr_stdout_read_fd = in;
+ XtAppAddInput (si->app, in, (XtPointer) XtInputReadMask, stderr_callback,
+ (XtPointer) si);
+}
+
+
+/* If the "-log file" command-line option has been specified,
+ open the file for append, and redirect stdout/stderr there.
+ This is called very early, before initialize_stderr().
+ */
+void
+stderr_log_file (saver_info *si)
+{
+ int stdout_fd = 1;
+ int stderr_fd = 2;
+ const char *filename = get_string_resource (si->dpy, "logFile", "LogFile");
+ int fd;
+
+ if (!filename || !*filename) return;
+
+ fd = open (filename, O_WRONLY | O_APPEND | O_CREAT, 0666);
+
+ if (fd < 0)
+ {
+ char buf[255];
+ FAIL:
+ sprintf (buf, "%.100s: %.100s", blurb(), filename);
+ perror (buf);
+ fflush (stderr);
+ fflush (stdout);
+ exit (1);
+ }
+
+ fprintf (stderr, "%s: logging to file %s\n", blurb(), filename);
+
+ if (dup2 (fd, stdout_fd) < 0) goto FAIL;
+ if (dup2 (fd, stderr_fd) < 0) goto FAIL;
+
+ fprintf (stderr, "\n\n"
+ "##########################################################################\n"
+ "%s: logging to \"%s\" at %s\n"
+ "##########################################################################\n"
+ "\n",
+ blurb(), filename, timestring(0));
+}
+
+
+/* If there is anything in the stderr buffer, flush it to the real stderr.
+ This does no X operations. Call this when exiting to make sure any
+ last words actually show up.
+ */
+void
+shutdown_stderr (saver_info *si)
+{
+ fflush (stdout);
+ fflush (stderr);
+
+ if (!real_stderr || stderr_stdout_read_fd < 0)
+ return;
+
+ stderr_callback ((XtPointer) si, &stderr_stdout_read_fd, 0);
+
+ if (stderr_tail &&
+ stderr_buffer < stderr_tail)
+ {
+ *stderr_tail = 0;
+ fprintf (real_stderr, "%s", stderr_buffer);
+ stderr_tail = stderr_buffer;
+ }
+
+ if (real_stdout) fflush (real_stdout);
+ if (real_stderr) fflush (real_stderr);
+
+ if (stdout != real_stdout)
+ {
+ dup2 (fileno(real_stdout), fileno(stdout));
+ fclose (real_stdout);
+ real_stdout = stdout;
+ }
+ if (stderr != real_stderr)
+ {
+ dup2 (fileno(real_stderr), fileno(stderr));
+ fclose (real_stderr);
+ real_stderr = stderr;
+ }
+ if (stderr_stdout_read_fd != -1)
+ {
+ close (stderr_stdout_read_fd);
+ stderr_stdout_read_fd = -1;
+ }
+}
diff --git a/driver/subprocs.c b/driver/subprocs.c
new file mode 100644
index 0000000..4f327e9
--- /dev/null
+++ b/driver/subprocs.c
@@ -0,0 +1,1423 @@
+/* subprocs.c --- choosing, spawning, and killing screenhacks.
+ * xscreensaver, Copyright (c) 1991-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <X11/Xlib.h> /* not used for much... */
+
+#ifndef ESRCH
+# include <errno.h>
+#endif
+
+#include <sys/time.h> /* sys/resource.h needs this for timeval */
+#include <sys/param.h> /* for PATH_MAX */
+
+#ifdef HAVE_SYS_WAIT_H
+# include <sys/wait.h> /* for waitpid() and associated macros */
+#endif
+
+#ifdef HAVE_SETRLIMIT
+# include <sys/resource.h> /* for setrlimit() and RLIMIT_AS */
+#endif
+
+#ifdef VMS
+# include <processes.h>
+# include <unixio.h> /* for close */
+# include <unixlib.h> /* for getpid */
+# define pid_t int
+# define fork vfork
+#endif /* VMS */
+
+#include <signal.h> /* for the signal names */
+#include <time.h>
+
+#if !defined(SIGCHLD) && defined(SIGCLD)
+# define SIGCHLD SIGCLD
+#endif
+
+#if 0 /* putenv() is declared in stdlib.h on modern linux systems. */
+#ifdef HAVE_PUTENV
+extern int putenv (/* const char * */); /* getenv() is in stdlib.h... */
+#endif
+#endif
+
+extern int kill (pid_t, int); /* signal() is in sys/signal.h... */
+
+/* This file doesn't need the Xt headers, so stub these types out... */
+#undef XtPointer
+#define XtAppContext void*
+#define XrmDatabase void*
+#define XtIntervalId void*
+#define XtPointer void*
+#define Widget void*
+
+#include "xscreensaver.h"
+#include "exec.h"
+#include "yarandom.h"
+#include "visual.h" /* for id_to_visual() */
+
+extern saver_info *global_si_kludge; /* I hate C so much... */
+
+
+/* Used when printing error/debugging messages from signal handlers.
+ */
+static const char *
+no_malloc_number_to_string (long num)
+{
+ static char string[128] = "";
+ int num_digits;
+ Bool negative_p = False;
+
+ num_digits = 0;
+
+ if (num == 0)
+ return "0";
+
+ if (num < 0)
+ {
+ negative_p = True;
+ num = -num;
+ }
+
+ while ((num > 0) && (num_digits < sizeof(string) - 1))
+ {
+ int digit;
+ digit = (int) num % 10;
+ num_digits++;
+ string[sizeof(string) - 1 - num_digits] = digit + '0';
+ num /= 10;
+ }
+
+ if (negative_p)
+ {
+ num_digits++;
+ string[sizeof(string) - 1 - num_digits] = '-';
+ }
+
+ return string + sizeof(string) - 1 - num_digits;
+}
+
+/* Like write(), but runs strlen() on the arg to get the length. */
+static int
+write_string (int fd, const char *str)
+{
+ return write (fd, str, strlen (str));
+}
+
+static int
+write_long (int fd, long n)
+{
+ const char *str = no_malloc_number_to_string (n);
+ return write_string (fd, str);
+}
+
+
+/* RLIMIT_AS (called RLIMIT_VMEM on some systems) controls the maximum size
+ of a process's address space, i.e., the maximal brk(2) and mmap(2) values.
+ Setting this lets you put a cap on how much memory a process can allocate.
+
+ Except the "and mmap()" part kinda makes this useless, since many GL
+ implementations end up using mmap() to pull the whole frame buffer into
+ memory (or something along those lines) making it appear processes are
+ using hundreds of megabytes when in fact they're using very little, and
+ we end up capping their mallocs prematurely. YAY!
+ */
+#if defined(RLIMIT_VMEM) && !defined(RLIMIT_AS)
+# define RLIMIT_AS RLIMIT_VMEM
+#endif
+
+static void
+limit_subproc_memory (int address_space_limit, Bool verbose_p)
+{
+
+/* This has caused way more problems than it has solved...
+ Let's just completely ignore the "memoryLimit" option now.
+ */
+#undef HAVE_SETRLIMIT
+
+#if defined(HAVE_SETRLIMIT) && defined(RLIMIT_AS)
+ struct rlimit r;
+
+ if (address_space_limit < 10 * 1024) /* let's not be crazy */
+ return;
+
+ if (getrlimit (RLIMIT_AS, &r) != 0)
+ {
+ char buf [512];
+ sprintf (buf, "%s: getrlimit(RLIMIT_AS) failed", blurb());
+ perror (buf);
+ return;
+ }
+
+ r.rlim_cur = address_space_limit;
+
+ if (setrlimit (RLIMIT_AS, &r) != 0)
+ {
+ char buf [512];
+ sprintf (buf, "%s: setrlimit(RLIMIT_AS, {%lu, %lu}) failed",
+ blurb(), r.rlim_cur, r.rlim_max);
+ perror (buf);
+ return;
+ }
+
+ if (verbose_p)
+ {
+ int i = address_space_limit;
+ char buf[100];
+ if (i >= (1<<30) && i == ((i >> 30) << 30))
+ sprintf(buf, "%dG", i >> 30);
+ else if (i >= (1<<20) && i == ((i >> 20) << 20))
+ sprintf(buf, "%dM", i >> 20);
+ else if (i >= (1<<10) && i == ((i >> 10) << 10))
+ sprintf(buf, "%dK", i >> 10);
+ else
+ sprintf(buf, "%d bytes", i);
+
+ fprintf (stderr, "%s: limited pid %lu address space to %s.\n",
+ blurb(), (unsigned long) getpid (), buf);
+ }
+
+#endif /* HAVE_SETRLIMIT && RLIMIT_AS */
+}
+
+
+/* Management of child processes, and de-zombification.
+ */
+
+enum job_status {
+ job_running, /* the process is still alive */
+ job_stopped, /* we have sent it a STOP signal */
+ job_killed, /* we have sent it a TERM signal */
+ job_dead /* we have wait()ed for it, and it's dead -- this state only
+ occurs so that we can avoid calling free() from a signal
+ handler. Shortly after going into this state, the list
+ element will be removed. */
+};
+
+struct screenhack_job {
+ char *name;
+ pid_t pid;
+ int screen;
+ enum job_status status;
+ time_t launched, killed;
+ struct screenhack_job *next;
+};
+
+static struct screenhack_job *jobs = 0;
+
+/* for debugging -- nothing calls this, but it's useful to invoke from gdb.
+ */
+void show_job_list (void);
+
+void
+show_job_list (void)
+{
+ struct screenhack_job *job;
+ fprintf(stderr, "%s: job list:\n", blurb());
+ for (job = jobs; job; job = job->next)
+ {
+ char b[] = " ??:??:?? ";
+ char *t = (job->killed ? timestring (job->killed) :
+ job->launched ? timestring (job->launched) : b);
+ t += 11;
+ t[8] = 0;
+ fprintf (stderr, " %5ld: %2d: (%s) %s %s\n",
+ (long) job->pid,
+ job->screen,
+ (job->status == job_running ? "running" :
+ job->status == job_stopped ? "stopped" :
+ job->status == job_killed ? " killed" :
+ job->status == job_dead ? " dead" : " ???"),
+ t, job->name);
+ }
+ fprintf (stderr, "\n");
+}
+
+
+static void clean_job_list (void);
+
+static struct screenhack_job *
+make_job (pid_t pid, int screen, const char *cmd)
+{
+ struct screenhack_job *job = (struct screenhack_job *) malloc (sizeof(*job));
+
+ static char name [1024];
+ const char *in = cmd;
+ char *out = name;
+ int got_eq = 0;
+
+ clean_job_list();
+
+ AGAIN:
+ while (isspace(*in)) in++; /* skip whitespace */
+ while (!isspace(*in) && *in != ':') {
+ if (*in == '=') got_eq = 1;
+ *out++ = *in++; /* snarf first token */
+ }
+
+ if (got_eq) /* if the first token was FOO=bar */
+ { /* then get the next token instead. */
+ got_eq = 0;
+ out = name;
+ goto AGAIN;
+ }
+
+ while (isspace(*in)) in++; /* skip whitespace */
+ *out = 0;
+
+ job->name = strdup(name);
+ job->pid = pid;
+ job->screen = screen;
+ job->status = job_running;
+ job->launched = time ((time_t *) 0);
+ job->killed = 0;
+ job->next = jobs;
+ jobs = job;
+
+ return jobs;
+}
+
+
+static void
+free_job (struct screenhack_job *job)
+{
+ if (!job)
+ return;
+ else if (job == jobs)
+ jobs = jobs->next;
+ else
+ {
+ struct screenhack_job *job2, *prev;
+ for (prev = 0, job2 = jobs;
+ job2;
+ prev = job2, job2 = job2->next)
+ if (job2 == job)
+ {
+ prev->next = job->next;
+ break;
+ }
+ }
+ free(job->name);
+ free(job);
+}
+
+
+/* Cleans out dead jobs from the jobs list -- this must only be called
+ from the main thread, not from a signal handler.
+ */
+static void
+clean_job_list (void)
+{
+ struct screenhack_job *job, *prev, *next;
+ time_t now = time ((time_t *) 0);
+ static time_t last_warn = 0;
+ Bool warnedp = False;
+
+ for (prev = 0, job = jobs, next = (job ? job->next : 0);
+ job;
+ prev = job, job = next, next = (job ? job->next : 0))
+ {
+ if (job->status == job_dead)
+ {
+ if (prev)
+ prev->next = next;
+ free_job (job);
+ job = prev;
+ }
+ else if (job->status == job_killed &&
+ now - job->killed > 10 &&
+ now - last_warn > 10)
+ {
+ fprintf (stderr,
+ "%s: WARNING: pid %ld (%s) sent SIGTERM %ld seconds ago"
+ " and did not die!\n",
+ blurb(),
+ (long) job->pid,
+ job->name,
+ (long) (now - job->killed));
+ warnedp = True;
+ }
+ }
+ if (warnedp) last_warn = now;
+}
+
+
+static struct screenhack_job *
+find_job (pid_t pid)
+{
+ struct screenhack_job *job;
+ for (job = jobs; job; job = job->next)
+ if (job->pid == pid)
+ return job;
+ return 0;
+}
+
+static void await_dying_children (saver_info *si);
+#ifndef VMS
+static void describe_dead_child (saver_info *, pid_t, int wait_status);
+#endif
+
+
+/* Semaphore to temporarily turn the SIGCHLD handler into a no-op.
+ Don't alter this directly -- use block_sigchld() / unblock_sigchld().
+ */
+static int block_sigchld_handler = 0;
+
+
+#ifdef HAVE_SIGACTION
+ sigset_t
+#else /* !HAVE_SIGACTION */
+ int
+#endif /* !HAVE_SIGACTION */
+block_sigchld (void)
+{
+#ifdef HAVE_SIGACTION
+ struct sigaction sa;
+ sigset_t child_set;
+
+ memset (&sa, 0, sizeof (sa));
+ sa.sa_handler = SIG_IGN;
+ sigaction (SIGPIPE, &sa, NULL);
+
+ sigemptyset (&child_set);
+ sigaddset (&child_set, SIGCHLD);
+ sigprocmask (SIG_BLOCK, &child_set, 0);
+
+#else /* !HAVE_SIGACTION */
+ signal (SIGPIPE, SIG_IGN);
+#endif /* !HAVE_SIGACTION */
+
+ block_sigchld_handler++;
+
+#ifdef HAVE_SIGACTION
+ return child_set;
+#else /* !HAVE_SIGACTION */
+ return 0;
+#endif /* !HAVE_SIGACTION */
+}
+
+void
+unblock_sigchld (void)
+{
+ if (block_sigchld_handler <= 0)
+ abort();
+
+ if (block_sigchld_handler <= 1) /* only unblock if count going to 0 */
+ {
+#ifdef HAVE_SIGACTION
+ struct sigaction sa;
+ sigset_t child_set;
+
+ memset(&sa, 0, sizeof (sa));
+ sa.sa_handler = SIG_DFL;
+ sigaction(SIGPIPE, &sa, NULL);
+
+ sigemptyset(&child_set);
+ sigaddset(&child_set, SIGCHLD);
+ sigprocmask(SIG_UNBLOCK, &child_set, 0);
+
+#else /* !HAVE_SIGACTION */
+ signal(SIGPIPE, SIG_DFL);
+#endif /* !HAVE_SIGACTION */
+ }
+
+ block_sigchld_handler--;
+}
+
+static int
+kill_job (saver_info *si, pid_t pid, int signal)
+{
+ saver_preferences *p = &si->prefs;
+ struct screenhack_job *job;
+ int status = -1;
+
+ clean_job_list();
+
+ if (in_signal_handler_p)
+ /* This function should not be called from the signal handler. */
+ abort();
+
+ block_sigchld(); /* we control the horizontal... */
+
+ job = find_job (pid);
+ if (!job ||
+ !job->pid ||
+ job->status == job_killed)
+ {
+ if (p->verbose_p)
+ fprintf (stderr, "%s: no child %ld to signal!\n",
+ blurb(), (long) pid);
+ goto DONE;
+ }
+
+ switch (signal) {
+ case SIGTERM:
+ job->status = job_killed;
+ job->killed = time ((time_t *) 0);
+ break;
+#ifdef SIGSTOP
+ /* #### there must be a way to do this on VMS... */
+ case SIGSTOP: job->status = job_stopped; break;
+ case SIGCONT: job->status = job_running; break;
+#endif /* SIGSTOP */
+ default: abort();
+ }
+
+ if (p->verbose_p)
+ fprintf (stderr, "%s: %d: %s pid %lu (%s)\n",
+ blurb(), job->screen,
+ (job->status == job_killed ? "killing" :
+ job->status == job_stopped ? "suspending" : "resuming"),
+ (unsigned long) job->pid,
+ job->name);
+
+ status = kill (job->pid, signal);
+
+ if (p->verbose_p && status < 0)
+ {
+ if (errno == ESRCH)
+ fprintf (stderr,
+ "%s: %d: child process %lu (%s) was already dead.\n",
+ blurb(), job->screen, (unsigned long) job->pid, job->name);
+ else
+ {
+ char buf [1024];
+ sprintf (buf, "%s: %d: couldn't kill child process %lu (%s)",
+ blurb(), job->screen, (unsigned long) job->pid, job->name);
+ perror (buf);
+ }
+ }
+
+ await_dying_children (si);
+
+ DONE:
+ unblock_sigchld();
+ if (block_sigchld_handler < 0)
+ abort();
+
+ clean_job_list();
+ return status;
+}
+
+
+#ifdef SIGCHLD
+static RETSIGTYPE
+sigchld_handler (int sig)
+{
+ saver_info *si = global_si_kludge; /* I hate C so much... */
+ in_signal_handler_p++;
+
+ if (si->prefs.debug_p)
+ {
+ /* Don't call fprintf() from signal handlers, as it might malloc.
+ fprintf(stderr, "%s: got SIGCHLD%s\n", blurb(),
+ (block_sigchld_handler ? " (blocked)" : ""));
+ */
+ write_string (STDERR_FILENO, blurb());
+ write_string (STDERR_FILENO, ": got SIGCHLD");
+
+ if (block_sigchld_handler)
+ write_string (STDERR_FILENO, " (blocked)\n");
+ else
+ write_string (STDERR_FILENO, "\n");
+ }
+
+ if (block_sigchld_handler < 0)
+ abort();
+ else if (block_sigchld_handler == 0)
+ {
+ block_sigchld();
+ await_dying_children (si);
+ unblock_sigchld();
+ }
+
+ init_sigchld();
+ in_signal_handler_p--;
+}
+#endif /* SIGCHLD */
+
+
+#ifndef VMS
+
+static void
+await_dying_children (saver_info *si)
+{
+ while (1)
+ {
+ int wait_status = 0;
+ pid_t kid;
+
+ errno = 0;
+ kid = waitpid (-1, &wait_status, WNOHANG|WUNTRACED);
+
+ if (si->prefs.debug_p)
+ {
+ if (kid < 0 && errno)
+ {
+ /* Don't call fprintf() from signal handlers, as it might malloc.
+ fprintf (stderr, "%s: waitpid(-1) ==> %ld (%d)\n", blurb(),
+ (long) kid, errno);
+ */
+ write_string (STDERR_FILENO, blurb());
+ write_string (STDERR_FILENO, ": waitpid(-1) ==> ");
+ write_long (STDERR_FILENO, (long) kid);
+ write_string (STDERR_FILENO, " (");
+ write_long (STDERR_FILENO, (long) errno);
+ write_string (STDERR_FILENO, ")\n");
+ }
+ else
+ {
+ /* Don't call fprintf() from signal handlers, as it might malloc.
+ fprintf (stderr, "%s: waitpid(-1) ==> %ld\n", blurb(),
+ (long) kid);
+ */
+ write_string (STDERR_FILENO, blurb());
+ write_string (STDERR_FILENO, ": waitpid(-1) ==> ");
+ write_long (STDERR_FILENO, (long) kid);
+ write_string (STDERR_FILENO, "\n");
+ }
+ }
+
+ /* 0 means no more children to reap.
+ -1 means error -- except "interrupted system call" isn't a "real"
+ error, so if we get that, we should just try again. */
+ if (kid == 0 ||
+ (kid < 0 && errno != EINTR))
+ break;
+
+ describe_dead_child (si, kid, wait_status);
+ }
+}
+
+
+static void
+describe_dead_child (saver_info *si, pid_t kid, int wait_status)
+{
+ int i;
+ saver_preferences *p = &si->prefs;
+ struct screenhack_job *job = find_job (kid);
+ const char *name = job ? job->name : "<unknown>";
+ int screen_no = job ? job->screen : 0;
+
+ if (WIFEXITED (wait_status))
+ {
+ int exit_status = WEXITSTATUS (wait_status);
+
+ /* Treat exit code as a signed 8-bit quantity. */
+ if (exit_status & 0x80) exit_status |= ~0xFF;
+
+ /* One might assume that exiting with non-0 means something went wrong.
+ But that loser xswarm exits with the code that it was killed with, so
+ it *always* exits abnormally. Treat abnormal exits as "normal" (don't
+ mention them) if we've just killed the subprocess. But mention them
+ if they happen on their own.
+ */
+ if (!job ||
+ (exit_status != 0 &&
+ (p->verbose_p || job->status != job_killed)))
+ {
+ /* Don't call fprintf() from signal handlers, as it might malloc.
+ fprintf (stderr,
+ "%s: %d: child pid %lu (%s) exited abnormally (code %d).\n",
+ blurb(), screen_no, (unsigned long) kid, name, exit_status);
+ */
+ write_string (STDERR_FILENO, blurb());
+ write_string (STDERR_FILENO, ": ");
+ write_long (STDERR_FILENO, (long) screen_no);
+ write_string (STDERR_FILENO, ": child pid ");
+ write_long (STDERR_FILENO, (long) kid);
+ write_string (STDERR_FILENO, " (");
+ write_string (STDERR_FILENO, name);
+ write_string (STDERR_FILENO, ") exited abnormally (code ");
+ write_long (STDERR_FILENO, (long) exit_status);
+ write_string (STDERR_FILENO, ").\n");
+ }
+ else if (p->verbose_p)
+ {
+ /* Don't call fprintf() from signal handlers, as it might malloc.
+ fprintf (stderr, "%s: %d: child pid %lu (%s) exited normally.\n",
+ blurb(), screen_no, (unsigned long) kid, name);
+ */
+ write_string (STDERR_FILENO, blurb());
+ write_string (STDERR_FILENO, ": ");
+ write_long (STDERR_FILENO, (long) screen_no);
+ write_string (STDERR_FILENO, ": child pid ");
+ write_long (STDERR_FILENO, (long) kid);
+ write_string (STDERR_FILENO, " (");
+ write_string (STDERR_FILENO, name);
+ write_string (STDERR_FILENO, ") exited normally.\n");
+ }
+
+ if (job)
+ job->status = job_dead;
+ }
+ else if (WIFSIGNALED (wait_status))
+ {
+ if (p->verbose_p ||
+ !job ||
+ job->status != job_killed ||
+ WTERMSIG (wait_status) != SIGTERM)
+ {
+ /* Don't call fprintf() from signal handlers, as it might malloc.
+ fprintf (stderr, "%s: %d: child pid %lu (%s) terminated with %s.\n",
+ blurb(), screen_no, (unsigned long) kid, name,
+ signal_name (WTERMSIG(wait_status)));
+ */
+ write_string (STDERR_FILENO, blurb());
+ write_string (STDERR_FILENO, ": ");
+ write_long (STDERR_FILENO, (long) screen_no);
+ write_string (STDERR_FILENO, ": child pid ");
+ write_long (STDERR_FILENO, (long) kid);
+ write_string (STDERR_FILENO, " (");
+ write_string (STDERR_FILENO, name);
+ write_string (STDERR_FILENO, ") terminated with signal ");
+ write_long (STDERR_FILENO, WTERMSIG(wait_status));
+ write_string (STDERR_FILENO, ".\n");
+ }
+
+ if (job)
+ job->status = job_dead;
+ }
+ else if (WIFSTOPPED (wait_status))
+ {
+ if (p->verbose_p)
+ {
+ /* Don't call fprintf() from signal handlers, as it might malloc.
+ fprintf (stderr, "%s: child pid %lu (%s) stopped with %s.\n",
+ blurb(), (unsigned long) kid, name,
+ signal_name (WSTOPSIG (wait_status)));
+ */
+ write_string (STDERR_FILENO, blurb());
+ write_string (STDERR_FILENO, ": ");
+ write_long (STDERR_FILENO, (long) screen_no);
+ write_string (STDERR_FILENO, ": child pid ");
+ write_long (STDERR_FILENO, (long) kid);
+ write_string (STDERR_FILENO, " (");
+ write_string (STDERR_FILENO, name);
+ write_string (STDERR_FILENO, ") stopped with signal ");
+ write_long (STDERR_FILENO, WSTOPSIG(wait_status));
+ write_string (STDERR_FILENO, ".\n");
+ }
+
+ if (job)
+ job->status = job_stopped;
+ }
+ else
+ {
+ /* Don't call fprintf() from signal handlers, as it might malloc.
+ fprintf (stderr, "%s: child pid %lu (%s) died in a mysterious way!",
+ blurb(), (unsigned long) kid, name);
+ */
+ write_string (STDERR_FILENO, blurb());
+ write_string (STDERR_FILENO, ": ");
+ write_long (STDERR_FILENO, (long) screen_no);
+ write_string (STDERR_FILENO, ": child pid ");
+ write_long (STDERR_FILENO, (long) kid);
+ write_string (STDERR_FILENO, " (");
+ write_string (STDERR_FILENO, name);
+ write_string (STDERR_FILENO, ") died in a mysterious way!");
+ if (job)
+ job->status = job_dead;
+ }
+
+ /* Clear out the pid so that screenhack_running_p() knows it's dead.
+ */
+ if (!job || job->status == job_dead)
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ if (kid == ssi->pid)
+ ssi->pid = 0;
+ }
+}
+
+#else /* VMS */
+static void await_dying_children (saver_info *si) { return; }
+#endif /* VMS */
+
+
+void
+init_sigchld (void)
+{
+#ifdef SIGCHLD
+
+# ifdef HAVE_SIGACTION /* Thanks to Tom Kelly <tom@ancilla.toronto.on.ca> */
+
+ static Bool sigchld_initialized_p = 0;
+ if (!sigchld_initialized_p)
+ {
+ struct sigaction action, old;
+
+ action.sa_handler = sigchld_handler;
+ sigemptyset(&action.sa_mask);
+ action.sa_flags = 0;
+
+ if (sigaction(SIGCHLD, &action, &old) < 0)
+ {
+ char buf [255];
+ sprintf (buf, "%s: couldn't catch SIGCHLD", blurb());
+ perror (buf);
+ }
+ sigchld_initialized_p = True;
+ }
+
+# else /* !HAVE_SIGACTION */
+
+ if (((long) signal (SIGCHLD, sigchld_handler)) == -1L)
+ {
+ char buf [255];
+ sprintf (buf, "%s: couldn't catch SIGCHLD", blurb());
+ perror (buf);
+ }
+# endif /* !HAVE_SIGACTION */
+#endif /* SIGCHLD */
+}
+
+
+
+
+
+static Bool
+select_visual_of_hack (saver_screen_info *ssi, screenhack *hack)
+{
+ saver_info *si = ssi->global;
+ saver_preferences *p = &si->prefs;
+ Bool selected;
+
+ if (hack->visual && *hack->visual)
+ selected = select_visual(ssi, hack->visual);
+ else
+ selected = select_visual(ssi, 0);
+
+ if (!selected && (p->verbose_p || si->demoing_p))
+ fprintf (stderr,
+ (si->demoing_p
+ ? "%s: warning, no \"%s\" visual for \"%s\".\n"
+ : "%s: no \"%s\" visual; skipping \"%s\".\n"),
+ blurb(),
+ (hack->visual && *hack->visual ? hack->visual : "???"),
+ hack->command);
+
+ return selected;
+}
+
+
+static void
+print_path_error (const char *program)
+{
+ char buf [512];
+ char *cmd = strdup (program);
+ char *token = strchr (cmd, ' ');
+
+ if (token) *token = 0;
+ sprintf (buf, "%s: could not execute \"%.100s\"", blurb(), cmd);
+ free (cmd);
+ perror (buf);
+
+ if (errno == ENOENT &&
+ (token = getenv("PATH")))
+ {
+# ifndef PATH_MAX
+# ifdef MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+# else
+# define PATH_MAX 2048
+# endif
+# endif
+ char path[PATH_MAX];
+ fprintf (stderr, "\n");
+ *path = 0;
+# if defined(HAVE_GETCWD)
+ if (! getcwd (path, sizeof(path)))
+ *path = 0;
+# elif defined(HAVE_GETWD)
+ getwd (path);
+# endif
+ if (*path)
+ fprintf (stderr, " Current directory is: %s\n", path);
+ fprintf (stderr, " PATH is:\n");
+ token = strtok (strdup(token), ":");
+ while (token)
+ {
+ fprintf (stderr, " %s\n", token);
+ token = strtok(0, ":");
+ }
+ fprintf (stderr, "\n");
+ }
+}
+
+
+/* Executes the command in another process.
+ Command may be any single command acceptable to /bin/sh.
+ It may include wildcards, but no semicolons.
+ If successful, the pid of the other process is returned.
+ Otherwise, -1 is returned and an error may have been
+ printed to stderr.
+ */
+pid_t
+fork_and_exec (saver_screen_info *ssi, const char *command)
+{
+ saver_info *si = ssi->global;
+ saver_preferences *p = &si->prefs;
+ pid_t forked;
+
+ switch ((int) (forked = fork ()))
+ {
+ case -1:
+ {
+ char buf [255];
+ sprintf (buf, "%s: couldn't fork", blurb());
+ perror (buf);
+ break;
+ }
+
+ case 0:
+ close (ConnectionNumber (si->dpy)); /* close display fd */
+ limit_subproc_memory (p->inferior_memory_limit, p->verbose_p);
+ hack_subproc_environment (ssi->screen, ssi->screensaver_window);
+
+ if (p->verbose_p)
+ fprintf (stderr, "%s: %d: spawning \"%s\" in pid %lu.\n",
+ blurb(), ssi->number, command,
+ (unsigned long) getpid ());
+
+ exec_command (p->shell, command, p->nice_inferior);
+
+ /* If that returned, we were unable to exec the subprocess.
+ Print an error message, if desired.
+ */
+ if (! p->ignore_uninstalled_p)
+ print_path_error (command);
+
+ exit (1); /* exits child fork */
+ break;
+
+ default: /* parent */
+ (void) make_job (forked, ssi->number, command);
+ break;
+ }
+
+ return forked;
+}
+
+
+void
+spawn_screenhack (saver_screen_info *ssi)
+{
+ saver_info *si = ssi->global;
+ saver_preferences *p = &si->prefs;
+ XFlush (si->dpy);
+
+ if (!monitor_powered_on_p (si))
+ {
+ if (si->prefs.verbose_p)
+ fprintf (stderr,
+ "%s: %d: X says monitor has powered down; "
+ "not launching a hack.\n", blurb(), ssi->number);
+ return;
+ }
+
+ if (p->screenhacks_count)
+ {
+ screenhack *hack;
+ pid_t forked;
+ char buf [255];
+ int new_hack = -1;
+ int retry_count = 0;
+ Bool force = False;
+
+ AGAIN:
+
+ if (p->screenhacks_count < 1)
+ {
+ /* No hacks at all */
+ new_hack = -1;
+ }
+ else if (p->screenhacks_count == 1)
+ {
+ /* Exactly one hack in the list */
+ new_hack = 0;
+ }
+ else if (si->selection_mode == -1)
+ {
+ /* Select the next hack, wrapping. */
+ new_hack = (ssi->current_hack + 1) % p->screenhacks_count;
+ }
+ else if (si->selection_mode == -2)
+ {
+ /* Select the previous hack, wrapping. */
+ if (ssi->current_hack < 0)
+ new_hack = p->screenhacks_count - 1;
+ else
+ new_hack = ((ssi->current_hack + p->screenhacks_count - 1)
+ % p->screenhacks_count);
+ }
+ else if (si->selection_mode > 0)
+ {
+ /* Select a specific hack, by number (via the ACTIVATE command.) */
+ new_hack = ((si->selection_mode - 1) % p->screenhacks_count);
+ force = True;
+ }
+ else if (p->mode == ONE_HACK &&
+ p->selected_hack >= 0)
+ {
+ /* Select a specific hack, by number (via "One Saver" mode.) */
+ new_hack = p->selected_hack;
+ force = True;
+ }
+ else if (p->mode == BLANK_ONLY || p->mode == DONT_BLANK)
+ {
+ new_hack = -1;
+ }
+ else if (p->mode == RANDOM_HACKS_SAME &&
+ ssi->number != 0)
+ {
+ /* Use the same hack that's running on screen 0.
+ (Assumes this function was called on screen 0 first.)
+ */
+ new_hack = si->screens[0].current_hack;
+ }
+ else /* (p->mode == RANDOM_HACKS) */
+ {
+ /* Select a random hack (but not the one we just ran.) */
+ while ((new_hack = random () % p->screenhacks_count)
+ == ssi->current_hack)
+ ;
+ }
+
+ if (new_hack < 0) /* don't run a hack */
+ {
+ ssi->current_hack = -1;
+ if (si->selection_mode < 0)
+ si->selection_mode = 0;
+ return;
+ }
+
+ ssi->current_hack = new_hack;
+ hack = p->screenhacks[ssi->current_hack];
+
+ /* If the hack is disabled, or there is no visual for this hack,
+ then try again (move forward, or backward, or re-randomize.)
+ Unless this hack was specified explicitly, in which case,
+ use it regardless.
+ */
+ if (force)
+ select_visual_of_hack (ssi, hack);
+
+ if (!force &&
+ (!hack->enabled_p ||
+ !on_path_p (hack->command) ||
+ !select_visual_of_hack (ssi, hack)))
+ {
+ if (++retry_count > (p->screenhacks_count*4))
+ {
+ /* Uh, oops. Odds are, there are no suitable visuals,
+ and we're looping. Give up. (This is totally lame,
+ what we should do is make a list of suitable hacks at
+ the beginning, then only loop over them.)
+ */
+ if (p->verbose_p)
+ fprintf(stderr,
+ "%s: %d: no programs enabled, or no suitable visuals.\n",
+ blurb(), ssi->number);
+ return;
+ }
+ else
+ goto AGAIN;
+ }
+
+ /* Turn off "next" and "prev" modes now, but "demo" mode is only
+ turned off by explicit action.
+ */
+ if (si->selection_mode < 0)
+ si->selection_mode = 0;
+
+ forked = fork_and_exec (ssi, hack->command);
+ switch ((int) forked)
+ {
+ case -1: /* fork failed */
+ case 0: /* child fork (can't happen) */
+ sprintf (buf, "%s: couldn't fork", blurb());
+ perror (buf);
+ restore_real_vroot (si);
+ saver_exit (si, 1, "couldn't fork");
+ break;
+
+ default:
+ ssi->pid = forked;
+ break;
+ }
+ }
+
+ store_saver_status (si); /* store current hack number */
+}
+
+
+void
+kill_screenhack (saver_screen_info *ssi)
+{
+ saver_info *si = ssi->global;
+ if (ssi->pid)
+ kill_job (si, ssi->pid, SIGTERM);
+ ssi->pid = 0;
+}
+
+
+void
+suspend_screenhack (saver_screen_info *ssi, Bool suspend_p)
+{
+#ifdef SIGSTOP /* older VMS doesn't have it... */
+ saver_info *si = ssi->global;
+ if (ssi->pid)
+ kill_job (si, ssi->pid, (suspend_p ? SIGSTOP : SIGCONT));
+#endif /* SIGSTOP */
+}
+
+
+/* Called when we're exiting abnormally, to kill off the subproc. */
+void
+emergency_kill_subproc (saver_info *si)
+{
+ int i;
+#ifdef SIGCHLD
+ signal (SIGCHLD, SIG_IGN);
+#endif /* SIGCHLD */
+
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ if (ssi->pid)
+ {
+ kill_job (si, ssi->pid, SIGTERM);
+ ssi->pid = 0;
+ }
+ }
+}
+
+Bool
+screenhack_running_p (saver_info *si)
+{
+ Bool any_running_p = False;
+ int i;
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ if (ssi->pid) any_running_p = True;
+ }
+ return any_running_p;
+}
+
+
+/* Environment variables. */
+
+
+/* Modifies $PATH in the current environment, so that if DEFAULT_PATH_PREFIX
+ is defined, the xscreensaver daemon will search that directory for hacks.
+ */
+void
+hack_environment (saver_info *si)
+{
+#if defined(HAVE_PUTENV) && defined(DEFAULT_PATH_PREFIX)
+ static const char *def_path = DEFAULT_PATH_PREFIX;
+ if (def_path && *def_path)
+ {
+ const char *opath = getenv("PATH");
+ char *npath;
+ if (! opath) opath = "/bin:/usr/bin"; /* WTF */
+ npath = (char *) malloc(strlen(def_path) + strlen(opath) + 20);
+ strcpy (npath, "PATH=");
+ strcat (npath, def_path);
+ strcat (npath, ":");
+ strcat (npath, opath);
+
+ if (putenv (npath))
+ abort ();
+
+ /* don't free (npath) -- some implementations of putenv (BSD 4.4,
+ glibc 2.0) copy the argument, but some (libc4,5, glibc 2.1.2)
+ do not. So we must leak it (and/or the previous setting). Yay.
+ */
+ }
+#endif /* HAVE_PUTENV && DEFAULT_PATH_PREFIX */
+}
+
+
+void
+hack_subproc_environment (Screen *screen, Window saver_window)
+{
+ /* Store $DISPLAY into the environment, so that the $DISPLAY variable that
+ the spawned processes inherit is correct. First, it must be on the same
+ host and display as the value of -display passed in on our command line
+ (which is not necessarily the same as what our $DISPLAY variable is.)
+ Second, the screen number in the $DISPLAY passed to the subprocess should
+ be the screen on which this particular hack is running -- not the display
+ specification which the driver itself is using, since the driver ignores
+ its screen number and manages all existing screens.
+
+ Likewise, store a window ID in $XSCREENSAVER_WINDOW -- this will allow
+ us to (eventually) run multiple hacks in Xinerama mode, where each hack
+ has the same $DISPLAY but a different piece of glass.
+ */
+ Display *dpy = DisplayOfScreen (screen);
+ const char *odpy = DisplayString (dpy);
+ char *ndpy = (char *) malloc (strlen(odpy) + 20);
+ char *nssw = (char *) malloc (40);
+ char *s, *c;
+
+ strcpy (ndpy, "DISPLAY=");
+ s = ndpy + strlen(ndpy);
+ strcpy (s, odpy);
+
+ /* We have to find the last colon since it is the boundary between
+ hostname & screen - IPv6 numeric format addresses may have many
+ colons before that point, and DECnet addresses always have two colons */
+ c = strrchr(s,':'); /* skip to last colon */
+ if (c != NULL) s = c+1;
+ while (isdigit(*s)) s++; /* skip over dpy number */
+ while (*s == '.') s++; /* skip over dot */
+ if (s[-1] != '.') *s++ = '.'; /* put on a dot */
+ sprintf(s, "%d", screen_number (screen)); /* put on screen number */
+
+ sprintf (nssw, "XSCREENSAVER_WINDOW=0x%lX", (unsigned long) saver_window);
+
+ /* Allegedly, BSD 4.3 didn't have putenv(), but nobody runs such systems
+ any more, right? It's not Posix, but everyone seems to have it. */
+#ifdef HAVE_PUTENV
+ if (putenv (ndpy))
+ abort ();
+ if (putenv (nssw))
+ abort ();
+
+ /* don't free ndpy/nssw -- some implementations of putenv (BSD 4.4,
+ glibc 2.0) copy the argument, but some (libc4,5, glibc 2.1.2)
+ do not. So we must leak it (and/or the previous setting). Yay.
+ */
+#endif /* HAVE_PUTENV */
+}
+
+
+/* GL crap */
+
+Visual *
+get_best_gl_visual (saver_info *si, Screen *screen)
+{
+ pid_t forked;
+ int fds [2];
+ int in, out;
+ int errfds[2];
+ int errin = -1, errout = -1;
+ char buf[1024];
+
+ char *av[10];
+ int ac = 0;
+
+ av[ac++] = "xscreensaver-gl-helper";
+ av[ac] = 0;
+
+ if (pipe (fds))
+ {
+ perror ("error creating pipe:");
+ return 0;
+ }
+
+ in = fds [0];
+ out = fds [1];
+
+ if (!si->prefs.verbose_p)
+ {
+ if (pipe (errfds))
+ {
+ perror ("error creating pipe:");
+ return 0;
+ }
+
+ errin = errfds [0];
+ errout = errfds [1];
+ }
+
+ block_sigchld(); /* This blocks it in the parent and child, to avoid
+ racing. It is never unblocked in the child before
+ the child exits, but that doesn't matter.
+ */
+
+ switch ((int) (forked = fork ()))
+ {
+ case -1:
+ {
+ sprintf (buf, "%s: couldn't fork", blurb());
+ perror (buf);
+ saver_exit (si, 1, 0);
+ }
+ case 0:
+ {
+ close (in); /* don't need this one */
+ close (ConnectionNumber (si->dpy)); /* close display fd */
+
+ if (dup2 (out, STDOUT_FILENO) < 0) /* pipe stdout */
+ {
+ perror ("could not dup() a new stdout:");
+ return 0;
+ }
+
+ if (! si->prefs.verbose_p)
+ {
+ close(errin);
+ if (dup2 (errout, STDERR_FILENO) < 0)
+ {
+ perror ("could not dup() a new stderr:");
+ return 0;
+ }
+ }
+
+ hack_subproc_environment (screen, 0); /* set $DISPLAY */
+
+ execvp (av[0], av); /* shouldn't return. */
+
+ if (errno != ENOENT /* || si->prefs.verbose_p */ )
+ {
+ /* Ignore "no such file or directory" errors.
+ Issue all other exec errors, though. */
+ sprintf (buf, "%s: running %s", blurb(), av[0]);
+ perror (buf);
+ }
+ exit (1); /* exits fork */
+ break;
+ }
+ default:
+ {
+ int result = 0;
+ int wait_status = 0;
+ pid_t pid = -1;
+
+ FILE *f = fdopen (in, "r");
+ unsigned long v = 0;
+ char c;
+
+ close (out); /* don't need this one */
+
+ *buf = 0;
+ if (! fgets (buf, sizeof(buf)-1, f))
+ *buf = 0;
+ fclose (f);
+
+ if (! si->prefs.verbose_p)
+ {
+ close (errout);
+ close (errin);
+ }
+
+ /* Wait for the child to die - wait for this pid only, not others. */
+ pid = waitpid (forked, &wait_status, 0);
+ if (si->prefs.debug_p)
+ {
+ write_string (STDERR_FILENO, blurb());
+ write_string (STDERR_FILENO, ": waitpid(");
+ write_long (STDERR_FILENO, (long) forked);
+ write_string (STDERR_FILENO, ") ==> ");
+ write_long (STDERR_FILENO, (long) pid);
+ write_string (STDERR_FILENO, "\n");
+ }
+
+ unblock_sigchld(); /* child is dead and waited, unblock now. */
+
+ if (1 == sscanf (buf, "0x%lx %c", &v, &c))
+ result = (int) v;
+
+ if (result == 0)
+ {
+ if (si->prefs.verbose_p)
+ {
+ int L = strlen(buf);
+ fprintf (stderr, "%s: %s did not report a GL visual!\n",
+ blurb(), av[0]);
+
+ if (L && buf[L-1] == '\n')
+ buf[--L] = 0;
+ if (*buf)
+ fprintf (stderr, "%s: %s said: \"%s\"\n",
+ blurb(), av[0], buf);
+ }
+ return 0;
+ }
+ else
+ {
+ Visual *v = id_to_visual (screen, result);
+ if (si->prefs.verbose_p)
+ fprintf (stderr, "%s: %d: %s: GL visual is 0x%X%s.\n",
+ blurb(), screen_number (screen),
+ av[0], result,
+ (v == DefaultVisualOfScreen (screen)
+ ? " (default)" : ""));
+ return v;
+ }
+ }
+ }
+
+ abort();
+}
+
+
+
+/* Restarting the xscreensaver process from scratch. */
+
+static char **saved_argv;
+
+void
+save_argv (int argc, char **argv)
+{
+ saved_argv = (char **) calloc (argc+2, sizeof (char *));
+ saved_argv [argc] = 0;
+ while (argc--)
+ {
+ int i = strlen (argv [argc]) + 1;
+ saved_argv [argc] = (char *) malloc (i);
+ memcpy (saved_argv [argc], argv [argc], i);
+ }
+}
+
+
+/* Re-execs the process with the arguments in saved_argv. Does not return.
+ */
+void
+restart_process (saver_info *si)
+{
+ fflush (stdout);
+ fflush (stderr);
+ shutdown_stderr (si);
+ if (si->prefs.verbose_p)
+ {
+ int i;
+ fprintf (stderr, "%s: re-executing", blurb());
+ for (i = 0; saved_argv[i]; i++)
+ fprintf (stderr, " %s", saved_argv[i]);
+ fprintf (stderr, "\n");
+ }
+ describe_uids (si, stderr);
+ fprintf (stderr, "\n");
+
+ fflush (stdout);
+ fflush (stderr);
+ execvp (saved_argv [0], saved_argv); /* shouldn't return */
+ {
+ char buf [512];
+ sprintf (buf, "%s: could not restart process", blurb());
+ perror(buf);
+ fflush(stderr);
+ abort();
+ }
+}
diff --git a/driver/test-apm.c b/driver/test-apm.c
new file mode 100644
index 0000000..6b87c7e
--- /dev/null
+++ b/driver/test-apm.c
@@ -0,0 +1,101 @@
+/* test-apm.c --- playing with the APM library.
+ * xscreensaver, Copyright (c) 1999 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+#include <time.h>
+#include <sys/time.h>
+
+#include <X11/Xlib.h>
+#include <X11/Intrinsic.h>
+
+#include <apm.h>
+
+#define countof(x) (sizeof((x))/sizeof(*(x)))
+
+
+char *progname = 0;
+char *progclass = "XScreenSaver";
+
+static const char *
+blurb (void)
+{
+ static char buf[255];
+ time_t now = time ((time_t *) 0);
+ char *ct = (char *) ctime (&now);
+ int n = strlen(progname);
+ if (n > 100) n = 99;
+ strncpy(buf, progname, n);
+ buf[n++] = ':';
+ buf[n++] = ' ';
+ strncpy(buf+n, ct+11, 8);
+ strcpy(buf+n+9, ": ");
+ return buf;
+}
+
+static void
+apm_cb (XtPointer closure, int *fd, XtInputId *id)
+{
+ apm_event_t events[100];
+ int n, i;
+ while ((n = apm_get_events (*fd, 0, events, countof(events)))
+ > 0)
+ for (i = 0; i < n; i++)
+ {
+ fprintf (stderr, "%s: APM event 0x%x: %s.\n", blurb(),
+ events[i], apm_event_name (events[i]));
+#if 0
+ switch (events[i])
+ {
+ case APM_SYS_STANDBY:
+ case APM_USER_STANDBY:
+ case APM_SYS_SUSPEND:
+ case APM_USER_SUSPEND:
+ case APM_CRITICAL_SUSPEND:
+ break;
+ }
+#endif
+ }
+}
+
+int
+main (int argc, char **argv)
+{
+ XtAppContext app;
+ Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0,
+ &argc, argv, 0, 0, 0);
+ Display *dpy = XtDisplay (toplevel_shell);
+ int fd;
+ XtInputId id;
+ XtGetApplicationNameAndClass (dpy, &progname, &progclass);
+
+ fd = apm_open ();
+ if (fd <= 0)
+ {
+ fprintf (stderr, "%s: couldn't initialize APM.\n", blurb());
+ exit (1);
+ }
+
+ id = XtAppAddInput(app, fd,
+ (XtPointer) (XtInputReadMask | XtInputWriteMask),
+ apm_cb, 0);
+ XtAppMainLoop (app);
+ exit (0);
+}
diff --git a/driver/test-fade.c b/driver/test-fade.c
new file mode 100644
index 0000000..9db773d
--- /dev/null
+++ b/driver/test-fade.c
@@ -0,0 +1,123 @@
+/* test-fade.c --- playing with colormap and/or gamma fading.
+ * xscreensaver, Copyright (c) 2001, 2004 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+
+#include <X11/Intrinsic.h>
+#include "xscreensaver.h"
+#include "fade.h"
+
+#ifdef HAVE_SGI_VC_EXTENSION
+# include <X11/extensions/XSGIvc.h>
+#endif
+#ifdef HAVE_XF86VMODE_GAMMA
+# include <X11/extensions/xf86vmode.h>
+#endif
+
+XrmDatabase db = 0;
+char *progname = 0;
+char *progclass = "XScreenSaver";
+
+#define SGI_VC_NAME "SGI-VIDEO-CONTROL"
+#define XF86_VIDMODE_NAME "XFree86-VidModeExtension"
+
+int
+main (int argc, char **argv)
+{
+ int seconds = 3;
+ int ticks = 20;
+ int delay = 1;
+
+ int op, event, error, major, minor;
+
+ XtAppContext app;
+ Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0,
+ &argc, argv, 0, 0, 0);
+ Display *dpy = XtDisplay (toplevel_shell);
+ Colormap *current_maps;
+ int i;
+
+ XtGetApplicationNameAndClass (dpy, &progname, &progclass);
+ db = XtDatabase (dpy);
+
+ current_maps = (Colormap *) calloc(sizeof(Colormap), ScreenCount(dpy));
+ for (i = 0; i < ScreenCount(dpy); i++)
+ current_maps[i] = DefaultColormap (dpy, i);
+
+ if (!XQueryExtension (dpy, SGI_VC_NAME, &op, &event, &error))
+ fprintf(stderr, "%s: no " SGI_VC_NAME " extension\n", progname);
+ else
+ {
+# ifdef HAVE_SGI_VC_EXTENSION
+ if (!XSGIvcQueryVersion (dpy, &major, &minor))
+ fprintf(stderr, "%s: unable to get " SGI_VC_NAME " version\n",
+ progname);
+ else
+ fprintf(stderr, "%s: " SGI_VC_NAME " version %d.%d\n",
+ progname, major, minor);
+# else /* !HAVE_SGI_VC_EXTENSION */
+ fprintf(stderr, "%s: no support for display's " SGI_VC_NAME
+ " extension\n", progname);
+# endif /* !HAVE_SGI_VC_EXTENSION */
+ }
+
+
+ if (!XQueryExtension (dpy, XF86_VIDMODE_NAME, &op, &event, &error))
+ fprintf(stderr, "%s: no " XF86_VIDMODE_NAME " extension\n", progname);
+ else
+ {
+# ifdef HAVE_XF86VMODE_GAMMA
+ if (!XF86VidModeQueryVersion (dpy, &major, &minor))
+ fprintf(stderr, "%s: unable to get " XF86_VIDMODE_NAME " version\n",
+ progname);
+ else
+ fprintf(stderr, "%s: " XF86_VIDMODE_NAME " version %d.%d\n",
+ progname, major, minor);
+# else /* !HAVE_XF86VMODE_GAMMA */
+ fprintf(stderr, "%s: no support for display's " XF86_VIDMODE_NAME
+ " extension\n", progname);
+# endif /* !HAVE_XF86VMODE_GAMMA */
+ }
+
+ fprintf (stderr, "%s: fading %d screen%s\n",
+ progname, ScreenCount(dpy), ScreenCount(dpy) == 1 ? "" : "s");
+
+ while (1)
+ {
+ XSync (dpy, False);
+
+ fprintf(stderr, "%s: out...", progname);
+ fflush(stderr);
+ fade_screens (dpy, current_maps, 0, 0, seconds, ticks, True, False);
+ fprintf(stderr, "done.\n");
+ fflush(stderr);
+
+ if (delay) sleep (delay);
+
+ fprintf(stderr,"%s: in...", progname);
+ fflush(stderr);
+ fade_screens (dpy, current_maps, 0, 0, seconds, ticks, False, False);
+ fprintf(stderr, "done.\n");
+ fflush(stderr);
+
+ if (delay) sleep (delay);
+ }
+}
diff --git a/driver/test-grab.c b/driver/test-grab.c
new file mode 100644
index 0000000..03018eb
--- /dev/null
+++ b/driver/test-grab.c
@@ -0,0 +1,89 @@
+/* test-uid.c --- playing with grabs.
+ * xscreensaver, Copyright (c) 1999, 2004 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+#include <sys/time.h>
+
+#include <X11/Xlib.h>
+#include <X11/Intrinsic.h>
+
+char *progname = 0;
+char *progclass = "XScreenSaver";
+
+#define ALL_POINTER_EVENTS \
+ (ButtonPressMask | ButtonReleaseMask | EnterWindowMask | \
+ LeaveWindowMask | PointerMotionMask | PointerMotionHintMask | \
+ Button1MotionMask | Button2MotionMask | Button3MotionMask | \
+ Button4MotionMask | Button5MotionMask | ButtonMotionMask)
+
+int
+main (int argc, char **argv)
+{
+ XtAppContext app;
+ int kstatus, mstatus;
+ Cursor cursor = 0;
+ int delay = 60 * 15;
+ Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0,
+ &argc, argv, 0, 0, 0);
+ Display *dpy = XtDisplay (toplevel_shell);
+ Window w = RootWindow (dpy, DefaultScreen(dpy));
+ XtGetApplicationNameAndClass (dpy, &progname, &progclass);
+
+ kstatus = XGrabKeyboard (dpy, w, True,
+ GrabModeSync, GrabModeAsync,
+ CurrentTime);
+ fprintf (stderr, "%s: grabbing keyboard on 0x%lx... %s.\n",
+ progname, (unsigned long) w,
+ (kstatus == GrabSuccess ? "GrabSuccess" :
+ kstatus == AlreadyGrabbed ? "AlreadyGrabbed" :
+ kstatus == GrabInvalidTime ? "GrabInvalidTime" :
+ kstatus == GrabNotViewable ? "GrabNotViewable" :
+ kstatus == GrabFrozen ? "GrabFrozen" :
+ "???"));
+
+ mstatus = XGrabPointer (dpy, w, True, ALL_POINTER_EVENTS,
+ GrabModeAsync, GrabModeAsync, None,
+ cursor, CurrentTime);
+ fprintf (stderr, "%s: grabbing mouse on 0x%lx... %s.\n",
+ progname, (unsigned long) w,
+ (mstatus == GrabSuccess ? "GrabSuccess" :
+ mstatus == AlreadyGrabbed ? "AlreadyGrabbed" :
+ mstatus == GrabInvalidTime ? "GrabInvalidTime" :
+ mstatus == GrabNotViewable ? "GrabNotViewable" :
+ mstatus == GrabFrozen ? "GrabFrozen" :
+ "???"));
+
+ XSync(dpy, False);
+
+ if (kstatus == GrabSuccess || mstatus == GrabSuccess)
+ {
+ fprintf (stderr, "%s: sleeping for %d:%02d:%02d...\n",
+ progname,
+ delay / (60 * 60),
+ (delay % (60 * 60)) / 60,
+ delay % 60);
+ fflush(stderr);
+ sleep (delay);
+ XSync(dpy, False);
+ }
+
+ exit (0);
+}
diff --git a/driver/test-mlstring.c b/driver/test-mlstring.c
new file mode 100644
index 0000000..e269a00
--- /dev/null
+++ b/driver/test-mlstring.c
@@ -0,0 +1,312 @@
+/*
+ * (c) 2007, Quest Software, Inc. All rights reserved.
+ *
+ * This file is part of XScreenSaver,
+ * Copyright (c) 1993-2004 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "mlstring.c" /* hokey, but whatever */
+
+#define WRAP_WIDTH_PX 100
+
+#undef Bool
+#undef True
+#undef False
+typedef int Bool;
+#define True 1
+#define False 0
+
+#define SKIPPED -1
+#define SUCCESS 0
+#define FAILURE 1
+
+#define FAIL(msg, ...) \
+ do { \
+ ++failcount; \
+ fprintf(stderr, "[FAIL] "); \
+ fprintf(stderr, msg, __VA_ARGS__); \
+ putc('\n', stderr); \
+ return FAILURE; \
+ } while (0)
+
+#define SUCCEED(testname) \
+ do { \
+ fprintf(stderr, "[SUCCESS] %s\n", (testname)); \
+ } while (0)
+
+#define SKIP(testname) \
+ do { \
+ fprintf(stderr, "[SKIPPED] %s\n", (testname)); \
+ } while (0)
+
+extern mlstring* mlstring_allocate(const char *msg);
+extern void mlstring_wrap(mlstring *mstr, XFontStruct *font, Dimension width);
+
+static int failcount = 0;
+
+static char *mlstring_to_cstr(const mlstring *mlstr) {
+ char *cstr;
+ size_t cstrlen = 0, alloclen = 1024;
+ const struct mlstr_line *line;
+
+ cstr = malloc(alloclen);
+ if (!cstr)
+ return NULL;
+ cstr[0] = '\0';
+
+ for (line = mlstr->lines; line; line = line->next_line) {
+ /* Extend the buffer if necessary. */
+ if (cstrlen + strlen(line->line) + 1 > alloclen) {
+ cstr = realloc(cstr, alloclen *= 2);
+ if (!cstr)
+ return NULL;
+ }
+
+ /* If this is not the first line */
+ if (line != mlstr->lines) {
+ /* Append a newline character */
+ cstr[cstrlen] = '\n';
+ ++cstrlen;
+ cstr[cstrlen] = '\0';
+ }
+
+ strcat(cstr, line->line);
+ cstrlen += strlen(line->line);
+ }
+ return cstr;
+}
+
+/* Pass -1 for expect_min or expect_exact to not check that value.
+ * expect_empty_p means an empty line is expected at some point in the string.
+ * Also ensures that the string was not too wide after wrapping. */
+static int mlstring_expect_lines(const mlstring *mlstr, int expect_min, int expect_exact, Bool expect_empty_p)
+{
+ int count;
+ Bool got_empty_line = False;
+ const struct mlstr_line *line = mlstr->lines;
+
+ for (count = 0; line; line = line->next_line) {
+ if (line->line[0] == '\0') {
+ if (!expect_empty_p)
+ FAIL("Not expecting empty lines, but got one on line %d of [%s]", count + 1, mlstring_to_cstr(mlstr));
+ got_empty_line = True;
+ }
+ ++count;
+ }
+
+ if (expect_empty_p && !got_empty_line)
+ FAIL("Expecting an empty line, but none found in [%s]", mlstring_to_cstr(mlstr));
+
+ if (expect_exact != -1 && expect_exact != count)
+ FAIL("Expected %d lines, got %d", expect_exact, count);
+
+ if (expect_min != -1 && count < expect_min)
+ FAIL("Expected at least %d lines, got %d", expect_min, count);
+
+ return SUCCESS;
+}
+
+static int mlstring_expect(const char *msg, int expect_lines, const mlstring *mlstr, Bool expect_empty_p)
+{
+ char *str, *str_top;
+ const struct mlstr_line *cur;
+ int linecount = 0;
+
+ /* Duplicate msg so we can chop it up */
+ str_top = strdup(msg);
+ if (!str_top)
+ return SKIPPED;
+
+ /* Replace all newlines with NUL */
+ str = str_top;
+ while ((str = strchr(str, '\n')))
+ *str++ = '\0';
+
+ /* str is now used to point to the expected string */
+ str = str_top;
+
+ for (cur = mlstr->lines; cur; cur = cur->next_line)
+ {
+ ++linecount;
+ if (strcmp(cur->line, str))
+ FAIL("lines didn't match; expected [%s], got [%s]", str, cur->line);
+
+ str += strlen(str) + 1; /* Point to the next expected string */
+ }
+
+ free(str_top);
+
+ return mlstring_expect_lines(mlstr, -1, expect_lines, expect_empty_p);
+}
+
+/* Ensures that the width has been set properly after wrapping */
+static int check_width(const char *msg, const mlstring *mlstr) {
+ if (mlstr->overall_width == 0)
+ FAIL("Overall width was zero for string [%s]", msg);
+
+ if (mlstr->overall_width > WRAP_WIDTH_PX)
+ FAIL("Overall width was %hu but the maximum wrap width was %d", mlstr->overall_width, WRAP_WIDTH_PX);
+
+ return SUCCESS;
+}
+
+/* FAIL() actually returns the wrong return codes in main, but it
+ * prints a message which is what we want. */
+
+#define TRY_NEW(str, numl, expect_empty) \
+ do { \
+ mlstr = mlstring_allocate((str)); \
+ if (!mlstr) \
+ FAIL("%s", #str); \
+ if (SUCCESS == mlstring_expect((str), (numl), mlstr, (expect_empty))) \
+ SUCCEED(#str); \
+ free(mlstr); \
+ } while (0)
+
+/* Expects an XFontStruct* font, and tries to wrap to 100px */
+#define TRY_WRAP(str, minl, expect_empty) \
+ do { \
+ mltest = mlstring_allocate((str)); \
+ if (!mltest) \
+ SKIP(#str); \
+ else { \
+ mlstring_wrap(mltest, font, WRAP_WIDTH_PX); \
+ check_width((str), mltest); \
+ if (SUCCESS == mlstring_expect_lines(mltest, (minl), -1, (expect_empty))) \
+ SUCCEED(#str); \
+ free(mltest); \
+ mltest = NULL; \
+ } \
+ } while (0)
+
+
+/* Ideally this function would use stub functions rather than real Xlib.
+ * Then it would be possible to test for exact line counts, which would be
+ * more reliable.
+ * It also doesn't handle Xlib errors.
+ *
+ * Don't print anything based on the return value of this function, it only
+ * returns a value so that I can use the FAIL() macro without warning.
+ *
+ * Anyone who understands this function wins a cookie ;)
+ */
+static int test_wrapping(void)
+{
+ Display *dpy = NULL;
+ XFontStruct *font = NULL;
+ mlstring *mltest = NULL;
+ int ok = 0;
+ int chars_per_line, chars_first_word, i;
+
+ const char *test_short = "a";
+ const char *test_hardwrap = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
+ const char *test_withnewlines = "a\nb";
+ char *test_softwrap = NULL;
+
+ dpy = XOpenDisplay(NULL);
+ if (!dpy)
+ goto end;
+
+ font = XLoadQueryFont(dpy, "fixed");
+ if (!font)
+ goto end;
+
+ TRY_WRAP(test_short, 1, False);
+ TRY_WRAP(test_hardwrap, 2, False);
+ TRY_WRAP(test_withnewlines, 2, False);
+
+ /* See if wrapping splits on word boundaries like it should */
+ chars_per_line = WRAP_WIDTH_PX / font->max_bounds.width;
+ if (chars_per_line < 3)
+ goto end;
+
+ /* Allocate for 2 lines + \0 */
+ test_softwrap = malloc(chars_per_line * 2 + 1);
+ if (!test_softwrap)
+ goto end;
+
+ /* 2 = strlen(' a'); that is, the minimum space required to start a new word
+ * on the same line. */
+ chars_first_word = chars_per_line - 2;
+
+ for (i = 0; i < chars_first_word; ++i) {
+ test_softwrap[i] = 'a'; /* first word */
+ test_softwrap[i + chars_per_line] = 'b'; /* second word */
+ }
+ /* space between first & second words */
+ test_softwrap[chars_first_word] = ' ';
+ /* first char of second word (last char of first line) */
+ test_softwrap[chars_first_word + 1] = 'b';
+ /* after second word */
+ test_softwrap[chars_per_line * 2] = '\0';
+
+ mltest = mlstring_allocate(test_softwrap);
+ mlstring_wrap(mltest, font, WRAP_WIDTH_PX);
+
+ /* reusing 'i' for a moment here to make freeing mltest easier */
+ i = strlen(mltest->lines->line);
+ free(mltest);
+
+ if (i != chars_first_word)
+ FAIL("Soft wrap failed, expected the first line to be %d chars, but it was %d.", chars_first_word, i);
+ SUCCEED("Soft wrap");
+
+ ok = 1;
+
+end:
+ if (test_softwrap)
+ free(test_softwrap);
+
+ if (font)
+ XFreeFont(dpy, font);
+
+ if (dpy)
+ XCloseDisplay(dpy);
+
+ if (!ok)
+ SKIP("wrapping");
+
+ return ok ? SUCCESS : SKIPPED; /* Unused, actually */
+}
+
+
+int main(int argc, char *argv[])
+{
+ const char *oneline = "1Foo";
+ const char *twolines = "2Foo\nBar";
+ const char *threelines = "3Foo\nBar\nWhippet";
+ const char *trailnewline = "4Foo\n";
+ const char *trailnewlines = "5Foo\n\n";
+ const char *embeddednewlines = "6Foo\n\nBar";
+ mlstring *mlstr;
+
+ TRY_NEW(oneline, 1, False);
+ TRY_NEW(twolines, 2, False);
+ TRY_NEW(threelines, 3, False);
+ TRY_NEW(trailnewline, 2, True);
+ TRY_NEW(trailnewlines, 3, True);
+ TRY_NEW(embeddednewlines, 3, True);
+
+ (void) test_wrapping();
+
+ fprintf(stdout, "%d test failures.\n", failcount);
+
+ return !!failcount;
+}
+
+/* vim:ts=8:sw=2:noet
+ */
diff --git a/driver/test-passwd.c b/driver/test-passwd.c
new file mode 100644
index 0000000..9b4f98e
--- /dev/null
+++ b/driver/test-passwd.c
@@ -0,0 +1,306 @@
+/* xscreensaver, Copyright (c) 1998-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* This is a kludgy test harness for debugging the password dialog box.
+ It's somewhat easier to debug it here than in the xscreensaver executable
+ itself.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <ctype.h>
+#include <pwd.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Shell.h>
+#include <X11/Xlocale.h>
+
+#include "xscreensaver.h"
+#include "resources.h"
+#include "version.h"
+#include "visual.h"
+#include "auth.h"
+
+char *progname = 0;
+char *progclass = 0;
+XrmDatabase db = 0;
+saver_info *global_si_kludge;
+
+FILE *real_stderr, *real_stdout;
+
+void monitor_power_on (saver_info *si, Bool on_p) {}
+Bool monitor_powered_on_p (saver_info *si) { return True; }
+void initialize_screensaver_window (saver_info *si) {}
+void raise_window (saver_info *si, Bool i, Bool b, Bool d) {}
+Bool blank_screen (saver_info *si) {return False;}
+void unblank_screen (saver_info *si) {}
+void reset_watchdog_timer(saver_info *si, Bool on_p) {}
+Bool select_visual (saver_screen_info *ssi, const char *v) { return False; }
+Bool window_exists_p (Display *dpy, Window window) {return True;}
+void start_notice_events_timer (saver_info *si, Window w, Bool b) {}
+Bool handle_clientmessage (saver_info *si, XEvent *e, Bool u) { return False; }
+int BadWindow_ehandler (Display *dpy, XErrorEvent *error) { exit(1); }
+const char *signal_name(int signal) { return "???"; }
+Bool restore_real_vroot (saver_info *si) { return False; }
+void store_saver_status (saver_info *si) {}
+void saver_exit (saver_info *si, int status, const char *core) { exit(status);}
+int move_mouse_grab (saver_info *si, Window to, Cursor c, int ts) { return 0; }
+int mouse_screen (saver_info *si) { return 0; }
+void check_for_leaks (const char *where) { }
+void shutdown_stderr (saver_info *si) { }
+void resize_screensaver_window (saver_info *si) { }
+void describe_monitor_layout (saver_info *si) { }
+Bool update_screen_layout (saver_info *si) { return 0; }
+Bool in_signal_handler_p = 0;
+char *timestring (time_t when) { return ""; }
+
+const char *blurb(void) { return progname; }
+Atom XA_SCREENSAVER, XA_DEMO, XA_PREFS;
+
+void
+idle_timer (XtPointer closure, XtIntervalId *id)
+{
+ saver_info *si = (saver_info *) closure;
+ XEvent fake_event;
+ fake_event.type = 0; /* XAnyEvent type, ignored. */
+ fake_event.xany.display = si->dpy;
+ fake_event.xany.window = 0;
+ XPutBackEvent (si->dpy, &fake_event);
+}
+
+static int
+text_auth_conv (
+ int num_msg,
+ const struct auth_message *auth_msgs,
+ struct auth_response **resp,
+ saver_info *si)
+{
+ char *input;
+ char buf[255];
+ struct auth_response *responses;
+ int i;
+
+ responses = calloc(num_msg, sizeof(struct auth_response));
+ if (!responses)
+ return -1;
+
+ /* The unlock state won't actually be used until this function returns and
+ * the auth module processes the response, but set it anyway for consistency
+ */
+ si->unlock_state = ul_read;
+
+ for (i = 0; i < num_msg; ++i)
+ {
+ printf ("\n%s: %s", progname, auth_msgs[i].msg);
+ if ( auth_msgs[i].type == AUTH_MSGTYPE_PROMPT_NOECHO
+ || auth_msgs[i].type == AUTH_MSGTYPE_PROMPT_ECHO)
+ {
+ input = fgets (buf, sizeof(buf)-1, stdin);
+ if (!input || !*input)
+ exit (0);
+ if (input[strlen(input)-1] == '\n')
+ input[strlen(input)-1] = 0;
+
+ responses[i].response = strdup(input);
+ }
+ }
+
+ *resp = responses;
+
+ si->unlock_state = ul_finished;
+
+ return 0;
+}
+
+
+#ifdef __GNUC__
+ __extension__ /* shut up about "string length is greater than the length
+ ISO C89 compilers are required to support" when including
+ the .ad file... */
+#endif
+
+static char *fallback[] = {
+#include "XScreenSaver_ad.h"
+ 0
+};
+
+extern Bool debug_passwd_window_p; /* lock.c kludge */
+
+int
+main (int argc, char **argv)
+{
+ enum { PASS, SPLASH, TTY } which;
+ Widget toplevel_shell = 0;
+ saver_screen_info ssip;
+ saver_info sip;
+ saver_info *si = &sip;
+ saver_preferences *p = &si->prefs;
+ struct passwd *pw;
+
+ memset(&sip, 0, sizeof(sip));
+ memset(&ssip, 0, sizeof(ssip));
+
+ si->nscreens = 1;
+ si->screens = si->default_screen = &ssip;
+ ssip.global = si;
+
+ global_si_kludge = si;
+ real_stderr = stderr;
+ real_stdout = stdout;
+
+ si->version = (char *) malloc (5);
+ memcpy (si->version, screensaver_id + 17, 4);
+ si->version[4] = 0;
+ progname = argv[0];
+ {
+ char *s = strrchr(progname, '/');
+ if (*s) progname = s+1;
+ }
+
+ if (argc != 2) goto USAGE;
+ else if (!strcmp (argv[1], "pass")) which = PASS;
+ else if (!strcmp (argv[1], "splash")) which = SPLASH;
+ else if (!strcmp (argv[1], "tty")) which = TTY;
+ else
+ {
+ USAGE:
+ fprintf (stderr, "usage: %s [ pass | splash | tty ]\n", progname);
+ exit (1);
+ }
+
+#ifdef NO_LOCKING
+ if (which == PASS || which == TTY)
+ {
+ fprintf (stderr, "%s: compiled with NO_LOCKING\n", progname);
+ exit (1);
+ }
+#endif
+
+#ifndef NO_LOCKING
+ /* before hack_uid() for proper permissions */
+ lock_priv_init (argc, argv, True);
+
+ hack_uid (si);
+
+ if (! lock_init (argc, argv, True))
+ {
+ si->locking_disabled_p = True;
+ si->nolock_reason = "error getting password";
+ }
+#endif
+
+ progclass = "XScreenSaver";
+
+ if (!setlocale (LC_CTYPE, ""))
+ fprintf (stderr, "%s: warning: could not set default locale\n",
+ progname);
+
+
+ if (which != TTY)
+ {
+ toplevel_shell = XtAppInitialize (&si->app, progclass, 0, 0,
+ &argc, argv, fallback,
+ 0, 0);
+
+ si->dpy = XtDisplay (toplevel_shell);
+ p->db = XtDatabase (si->dpy);
+ si->default_screen->toplevel_shell = toplevel_shell;
+ si->default_screen->screen = XtScreen(toplevel_shell);
+ si->default_screen->default_visual =
+ si->default_screen->current_visual =
+ DefaultVisualOfScreen(si->default_screen->screen);
+ si->default_screen->screensaver_window =
+ RootWindowOfScreen(si->default_screen->screen);
+ si->default_screen->current_depth =
+ visual_depth(si->default_screen->screen,
+ si->default_screen->current_visual);
+
+ ssip.width = WidthOfScreen(ssip.screen);
+ ssip.height = HeightOfScreen(ssip.screen);
+
+ db = p->db;
+ XtGetApplicationNameAndClass (si->dpy, &progname, &progclass);
+
+ load_init_file (si->dpy, &si->prefs);
+ }
+
+ p->verbose_p = True;
+
+ pw = getpwuid (getuid ());
+ si->user = strdup (pw->pw_name);
+
+/* si->nscreens = 0;
+ si->screens = si->default_screen = 0; */
+
+ while (1)
+ {
+#ifndef NO_LOCKING
+ if (which == PASS)
+ {
+ si->unlock_cb = gui_auth_conv;
+ si->auth_finished_cb = auth_finished_cb;
+
+ debug_passwd_window_p = True;
+ xss_authenticate(si, True);
+
+ if (si->unlock_state == ul_success)
+ fprintf (stderr, "%s: authentication succeeded\n", progname);
+ else
+ fprintf (stderr, "%s: authentication FAILED!\n", progname);
+
+ XSync(si->dpy, False);
+ fprintf (stderr, "\n######################################\n\n");
+ sleep (3);
+ }
+ else
+#endif
+ if (which == SPLASH)
+ {
+ XEvent event;
+ make_splash_dialog (si);
+ XtAppAddTimeOut (si->app, p->splash_duration + 1000,
+ idle_timer, (XtPointer) si);
+ while (si->splash_dialog)
+ {
+ XtAppNextEvent (si->app, &event);
+ if (event.xany.window == si->splash_dialog)
+ handle_splash_event (si, &event);
+ XtDispatchEvent (&event);
+ }
+ XSync (si->dpy, False);
+ sleep (1);
+ }
+#ifndef NO_LOCKING
+ else if (which == TTY)
+ {
+ si->unlock_cb = text_auth_conv;
+
+ printf ("%s: Authenticating user %s\n", progname, si->user);
+ xss_authenticate(si, True);
+
+ if (si->unlock_state == ul_success)
+ printf ("%s: Ok!\n", progname);
+ else
+ printf ("%s: Wrong!\n", progname);
+ }
+#endif
+ else
+ abort();
+ }
+
+ free(si->user);
+}
diff --git a/driver/test-randr.c b/driver/test-randr.c
new file mode 100644
index 0000000..74ead37
--- /dev/null
+++ b/driver/test-randr.c
@@ -0,0 +1,339 @@
+/* test-randr.c --- playing with the Resize And Rotate extension.
+ * xscreensaver, Copyright (c) 2004-2008 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+#include <time.h>
+#include <sys/time.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+
+#include <X11/Xproto.h>
+#include <X11/extensions/Xrandr.h>
+
+char *progname = 0;
+char *progclass = "XScreenSaver";
+
+static const char *
+blurb (void)
+{
+ static char buf[255];
+ time_t now = time ((time_t *) 0);
+ char *ct = (char *) ctime (&now);
+ int n = strlen(progname);
+ if (n > 100) n = 99;
+ strncpy(buf, progname, n);
+ buf[n++] = ':';
+ buf[n++] = ' ';
+ strncpy(buf+n, ct+11, 8);
+ strcpy(buf+n+9, ": ");
+ return buf;
+}
+
+
+static Bool error_handler_hit_p = False;
+
+static int
+ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
+{
+ error_handler_hit_p = True;
+ return 0;
+}
+
+
+int
+main (int argc, char **argv)
+{
+ int event_number = -1, error_number = -1;
+ int major = -1, minor = -1;
+ int nscreens = 0;
+ int i;
+
+ XtAppContext app;
+ Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0,
+ &argc, argv, 0, 0, 0);
+ Display *dpy = XtDisplay (toplevel_shell);
+ XtGetApplicationNameAndClass (dpy, &progname, &progclass);
+
+ nscreens = ScreenCount(dpy);
+
+ if (!XRRQueryExtension(dpy, &event_number, &error_number))
+ {
+ fprintf(stderr, "%s: XRRQueryExtension(dpy, ...) ==> False\n",
+ blurb());
+ fprintf(stderr, "%s: server does not support the RANDR extension.\n",
+ blurb());
+ major = -1;
+ }
+ else
+ {
+ fprintf(stderr, "%s: XRRQueryExtension(dpy, ...) ==> %d, %d\n",
+ blurb(), event_number, error_number);
+
+ if (!XRRQueryVersion(dpy, &major, &minor))
+ {
+ fprintf(stderr, "%s: XRRQueryVersion(dpy, ...) ==> False\n",
+ blurb());
+ fprintf(stderr, "%s: server didn't report RANDR version numbers?\n",
+ blurb());
+ }
+ else
+ fprintf(stderr, "%s: XRRQueryVersion(dpy, ...) ==> %d, %d\n", blurb(),
+ major, minor);
+ }
+
+ for (i = 0; i < nscreens; i++)
+ {
+ XRRScreenConfiguration *rrc;
+ XErrorHandler old_handler;
+
+ XSync (dpy, False);
+ error_handler_hit_p = False;
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+
+ rrc = (major >= 0 ? XRRGetScreenInfo (dpy, RootWindow (dpy, i)) : 0);
+
+ XSync (dpy, False);
+ XSetErrorHandler (old_handler);
+ XSync (dpy, False);
+
+ if (error_handler_hit_p)
+ {
+ fprintf(stderr, "%s: XRRGetScreenInfo(dpy, %d) ==> X error:\n",
+ blurb(), i);
+ /* do it again without the error handler to print the error */
+ rrc = XRRGetScreenInfo (dpy, RootWindow (dpy, i));
+ }
+ else if (rrc)
+ {
+ SizeID current_size = -1;
+ Rotation current_rotation = ~0;
+
+ fprintf (stderr, "\n%s: Screen %d\n", blurb(), i);
+
+ current_size =
+ XRRConfigCurrentConfiguration (rrc, &current_rotation);
+
+ /* Times */
+# if 0 /* #### This is wrong -- I don't understand what these two
+ timestamp numbers represent, or how they correlate
+ to the wall clock or to each other. */
+ {
+ Time server_time, config_time;
+ server_time = XRRConfigTimes (rrc, &config_time);
+ if (config_time == 0 || server_time == 0)
+ fprintf (stderr, "%s: config has never been changed\n",
+ blurb());
+ else
+ fprintf (stderr, "%s: config changed %lu seconds ago\n",
+ blurb(), (unsigned long) (server_time - config_time));
+ }
+# endif
+
+ /* Rotations */
+ {
+ Rotation available, current;
+ available = XRRConfigRotations (rrc, &current);
+
+ fprintf (stderr, "%s: Available Rotations:\t", blurb());
+ if (available & RR_Rotate_0) fprintf (stderr, " 0");
+ if (available & RR_Rotate_90) fprintf (stderr, " 90");
+ if (available & RR_Rotate_180) fprintf (stderr, " 180");
+ if (available & RR_Rotate_270) fprintf (stderr, " 270");
+ if (! (available & (RR_Rotate_0 | RR_Rotate_90 |
+ RR_Rotate_180 | RR_Rotate_270)))
+ fprintf (stderr, " none");
+ fprintf (stderr, "\n");
+
+ if (current_rotation != current)
+ fprintf (stderr,
+ "%s: WARNING: rotation inconsistency: 0x%X vs 0x%X\n",
+ blurb(), current_rotation, current);
+
+ fprintf (stderr, "%s: Current Rotation:\t", blurb());
+ if (current & RR_Rotate_0) fprintf (stderr, " 0");
+ if (current & RR_Rotate_90) fprintf (stderr, " 90");
+ if (current & RR_Rotate_180) fprintf (stderr, " 180");
+ if (current & RR_Rotate_270) fprintf (stderr, " 270");
+ if (! (current & (RR_Rotate_0 | RR_Rotate_90 |
+ RR_Rotate_180 | RR_Rotate_270)))
+ fprintf (stderr, " none");
+ fprintf (stderr, "\n");
+
+ fprintf (stderr, "%s: Available Reflections:\t", blurb());
+ if (available & RR_Reflect_X) fprintf (stderr, " X");
+ if (available & RR_Reflect_Y) fprintf (stderr, " Y");
+ if (! (available & (RR_Reflect_X | RR_Reflect_Y)))
+ fprintf (stderr, " none");
+ fprintf (stderr, "\n");
+
+ fprintf (stderr, "%s: Current Reflections:\t", blurb());
+ if (current & RR_Reflect_X) fprintf (stderr, " X");
+ if (current & RR_Reflect_Y) fprintf (stderr, " Y");
+ if (! (current & (RR_Reflect_X | RR_Reflect_Y)))
+ fprintf (stderr, " none");
+ fprintf (stderr, "\n");
+ }
+
+ /* Sizes */
+ {
+ int nsizes, j;
+ XRRScreenSize *rrsizes;
+
+ rrsizes = XRRConfigSizes (rrc, &nsizes);
+ if (nsizes <= 0)
+ fprintf (stderr, "%s: sizes:\t none\n", blurb());
+ else
+ for (j = 0; j < nsizes; j++)
+ {
+ short *rates;
+ int nrates, k;
+ fprintf (stderr,
+ "%s: %c size %d: %d x %d\t rates:",
+ blurb(),
+ (j == current_size ? '+' : ' '),
+ j,
+ rrsizes[j].width, rrsizes[j].height);
+
+ rates = XRRConfigRates (rrc, j, &nrates);
+ if (nrates == 0)
+ fprintf (stderr, " none?");
+ else
+ for (k = 0; k < nrates; k++)
+ fprintf (stderr, " %d", rates[k]);
+ fprintf (stderr, "\n");
+ /* don't free 'rates' */
+ }
+ /* don't free 'rrsizes' */
+ }
+
+ XRRFreeScreenConfigInfo (rrc);
+ }
+ else if (major >= 0)
+ {
+ fprintf(stderr, "%s: XRRGetScreenInfo(dpy, %d) ==> NULL\n",
+ blurb(), i);
+ }
+
+
+# ifdef HAVE_RANDR_12
+ if (major > 1 || (major == 1 && minor >= 2))
+ {
+ int j;
+ XRRScreenResources *res =
+ XRRGetScreenResources (dpy, RootWindow (dpy, i));
+ fprintf (stderr, "\n");
+ for (j = 0; j < res->noutput; j++)
+ {
+ int k;
+ XRROutputInfo *rroi =
+ XRRGetOutputInfo (dpy, res, res->outputs[j]);
+ fprintf (stderr, "%s: Output %d: %s: %s (%d)\n", blurb(), j,
+ rroi->name,
+ (rroi->connection == RR_Disconnected ? "disconnected" :
+ rroi->connection == RR_UnknownConnection ? "unknown" :
+ "connected"),
+ (int) rroi->crtc);
+ for (k = 0; k < rroi->ncrtc; k++)
+ {
+ XRRCrtcInfo *crtci = XRRGetCrtcInfo (dpy, res,
+ rroi->crtcs[k]);
+ fprintf(stderr, "%s: %c CRTC %d (%d): %dx%d+%d+%d\n",
+ blurb(),
+ (rroi->crtc == rroi->crtcs[k] ? '+' : ' '),
+ k, (int) rroi->crtcs[k],
+ crtci->width, crtci->height, crtci->x, crtci->y);
+ XRRFreeCrtcInfo (crtci);
+ }
+ XRRFreeOutputInfo (rroi);
+ fprintf (stderr, "\n");
+ }
+ XRRFreeScreenResources (res);
+ }
+# endif /* HAVE_RANDR_12 */
+ }
+
+ if (major > 0)
+ {
+ Window w[20];
+ XWindowAttributes xgwa[20];
+
+ for (i = 0; i < nscreens; i++)
+ {
+ XRRSelectInput (dpy, RootWindow (dpy, i), RRScreenChangeNotifyMask);
+ w[i] = RootWindow (dpy, i);
+ XGetWindowAttributes (dpy, w[i], &xgwa[i]);
+ }
+
+ XSync (dpy, False);
+
+ fprintf (stderr, "\n%s: awaiting events...\n\n"
+ "\t(If you resize the screen or add/remove monitors, this should\n"
+ "\tnotice that and print stuff. Otherwise, hit ^C.)\n\n",
+ progname);
+ while (1)
+ {
+ XEvent event;
+ XNextEvent (dpy, &event);
+
+ if (event.type == event_number + RRScreenChangeNotify)
+ {
+ XRRScreenChangeNotifyEvent *xrr_event =
+ (XRRScreenChangeNotifyEvent *) &event;
+ int screen = XRRRootToScreen (dpy, xrr_event->window);
+
+ fprintf (stderr, "%s: screen %d: RRScreenChangeNotify event\n",
+ progname, screen);
+
+ fprintf (stderr, "%s: screen %d: old size: \t%d x %d\n",
+ progname, screen,
+ DisplayWidth (dpy, screen),
+ DisplayHeight (dpy, screen));
+ fprintf (stderr, "%s: screen %d: old root 0x%lx:\t%d x %d\n",
+ progname, screen, (unsigned long) w[screen],
+ xgwa[screen].width, xgwa[screen].height);
+
+ XRRUpdateConfiguration (&event);
+ XSync (dpy, False);
+
+ fprintf (stderr, "%s: screen %d: new size: \t%d x %d\n",
+ progname, screen,
+ DisplayWidth (dpy, screen),
+ DisplayHeight (dpy, screen));
+
+ w[screen] = RootWindow (dpy, screen);
+ XGetWindowAttributes (dpy, w[screen], &xgwa[screen]);
+ fprintf (stderr, "%s: screen %d: new root 0x%lx:\t%d x %d\n",
+ progname, screen, (unsigned long) w[screen],
+ xgwa[screen].width, xgwa[screen].height);
+ fprintf (stderr, "\n");
+ }
+ else
+ {
+ fprintf (stderr, "%s: event %d\n", progname, event.type);
+ }
+ }
+ }
+
+ XSync (dpy, False);
+ exit (0);
+}
diff --git a/driver/test-screens.c b/driver/test-screens.c
new file mode 100644
index 0000000..2fb3e35
--- /dev/null
+++ b/driver/test-screens.c
@@ -0,0 +1,208 @@
+/* test-screens.c --- some test cases for the "monitor sanity" checks.
+ * xscreensaver, Copyright (c) 2008 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <X11/Xlib.h>
+
+/* This file doesn't need the Xt headers, so stub these types out... */
+#undef XtPointer
+#define XtAppContext void*
+#define XrmDatabase void*
+#define XtIntervalId void*
+#define XtPointer void*
+#define Widget void*
+
+#include "xscreensaver.h"
+#include "visual.h"
+
+#undef WidthOfScreen
+#undef HeightOfScreen
+#define WidthOfScreen(s) 10240
+#define HeightOfScreen(s) 10240
+
+#undef screen_number
+#define screen_number(s) ((int) s)
+
+#include "screens.c" /* to get at static void check_monitor_sanity() */
+
+char *progname = 0;
+char *progclass = "XScreenSaver";
+
+const char *blurb(void) { return progname; }
+
+Bool safe_XF86VidModeGetViewPort(Display *d, int i, int *x, int *y) { abort(); }
+void initialize_screen_root_widget(saver_screen_info *ssi) { abort(); }
+Visual *get_best_gl_visual (saver_info *si, Screen *sc) { abort(); }
+
+
+static const char *
+failstr (monitor_sanity san)
+{
+ switch (san) {
+ case S_SANE: return "OK";
+ case S_ENCLOSED: return "ENC";
+ case S_DUPLICATE: return "DUP";
+ case S_OVERLAP: return "OVR";
+ case S_OFFSCREEN: return "OFF";
+ case S_DISABLED: return "DIS";
+ default: abort(); break;
+ }
+}
+
+
+static void
+test (int testnum, const char *screens, const char *desired)
+{
+ monitor *monitors[100];
+ char result[2048];
+ char *out = result;
+ int i, nscreens = 0;
+ char *token = strtok (strdup(screens), ",");
+ while (token)
+ {
+ monitor *m = calloc (1, sizeof (monitor));
+ char c;
+ m->id = (testnum * 1000) + nscreens;
+ if (5 == sscanf (token, "%dx%d+%d+%d@%d%c",
+ &m->width, &m->height, &m->x, &m->y,
+ (int *) &m->screen, &c))
+ ;
+ else if (4 != sscanf (token, "%dx%d+%d+%d%c",
+ &m->width, &m->height, &m->x, &m->y, &c))
+ {
+ fprintf (stderr, "%s: unparsable geometry: %s\n", blurb(), token);
+ exit (1);
+ }
+ monitors[nscreens] = m;
+ nscreens++;
+ token = strtok (0, ",");
+ }
+ monitors[nscreens] = 0;
+
+ check_monitor_sanity (monitors);
+
+ *out = 0;
+ for (i = 0; i < nscreens; i++)
+ {
+ monitor *m = monitors[i];
+ if (out != result) *out++ = ',';
+ if (m->sanity == S_SANE)
+ {
+ sprintf (out, "%dx%d+%d+%d", m->width, m->height, m->x, m->y);
+ if (m->screen)
+ sprintf (out + strlen(out), "@%d", (int) m->screen);
+ }
+ else
+ strcpy (out, failstr (m->sanity));
+ out += strlen(out);
+ }
+ *out = 0;
+
+ if (!strcmp (result, desired))
+ fprintf (stderr, "%s: test %2d OK\n", blurb(), testnum);
+ else
+ fprintf (stderr, "%s: test %2d FAILED:\n"
+ "%s: given: %s\n"
+ "%s: wanted: %s\n"
+ "%s: got: %s\n",
+ blurb(), testnum,
+ blurb(), screens,
+ blurb(), desired,
+ blurb(), result);
+
+# if 0
+ {
+ saver_info SI;
+ SI.monitor_layout = monitors;
+ describe_monitor_layout (&SI);
+ }
+# endif
+
+}
+
+static void
+run_tests(void)
+{
+ int i = 1;
+# define A(a) test (i++, a, a);
+# define B(a,b) test (i++, a, b)
+
+ A("");
+ A("1024x768+0+0");
+ A("1024x768+0+0,1024x768+1024+0");
+ A("1024x768+0+0,1024x768+0+768");
+ A("1024x768+0+0,1024x768+0+768,1024x768+1024+0");
+ A("800x600+0+0,800x600+0+0@1,800x600+10+0@2");
+
+ B("1024x768+999999+0",
+ "OFF");
+ B("1024x768+-999999+-999999",
+ "OFF");
+ B("1024x768+0+0,1024x768+0+0",
+ "1024x768+0+0,DUP");
+ B("1024x768+0+0,1024x768+0+0,1024x768+0+0",
+ "1024x768+0+0,DUP,DUP");
+ B("1024x768+0+0,1024x768+1024+0,1024x768+0+0",
+ "1024x768+0+0,1024x768+1024+0,DUP");
+ B("1280x1024+0+0,1024x768+0+64,800x600+0+0,640x480+0+0,720x400+0+0",
+ "1280x1024+0+0,ENC,ENC,ENC,ENC");
+ B("1024x768+0+64,1280x1024+0+0,800x600+0+0,640x480+0+0,800x600+0+0,720x400+0+0",
+ "ENC,1280x1024+0+0,ENC,ENC,ENC,ENC");
+ B("1024x768+0+64,1280x1024+0+0,800x600+0+0,640x480+0+0,1280x1024+0+0,720x400+0+0",
+ "ENC,1280x1024+0+0,ENC,ENC,DUP,ENC");
+ B("720x400+0+0,640x480+0+0,800x600+0+0,1024x768+0+64,1280x1024+0+0",
+ "ENC,ENC,ENC,ENC,1280x1024+0+0");
+ B("1280x1024+0+0,800x600+1280+0,800x600+1300+0",
+ "1280x1024+0+0,800x600+1280+0,OVR");
+ B("1280x1024+0+0,800x600+1280+0,800x600+1300+0,1280x1024+0+0,800x600+1280+0",
+ "1280x1024+0+0,800x600+1280+0,OVR,DUP,DUP");
+
+ /* +-------------+----+ +------+---+ 1: 1440x900, widescreen display
+ | : | | 3+4 : | 2: 1280x1024, conventional display
+ | 1+2 : 1 | +......+ | 3: 1024x768, laptop
+ | : | | 3 | 4: 800x600, external projector
+ +.............+----+ +----------+
+ | 2 |
+ | |
+ +-------------+
+ */
+ B("1440x900+0+0,1280x1024+0+0,1024x768+1440+0,800x600+1440+0",
+ "1440x900+0+0,OVR,1024x768+1440+0,ENC");
+ B("800x600+0+0,800x600+0+0,800x600+800+0",
+ "800x600+0+0,DUP,800x600+800+0");
+ B("1600x1200+0+0,1360x768+0+0",
+ "1600x1200+0+0,ENC");
+ B("1600x1200+0+0,1360x768+0+0,1600x1200+0+0@1,1360x768+0+0@1",
+ "1600x1200+0+0,ENC,1600x1200+0+0@1,ENC");
+}
+
+
+int
+main (int argc, char **argv)
+{
+ char *s;
+ progname = argv[0];
+ s = strrchr(progname, '/');
+ if (s) progname = s+1;
+ if (argc != 1)
+ {
+ fprintf (stderr, "usage: %s\n", argv[0]);
+ exit (1);
+ }
+
+ run_tests();
+
+ exit (0);
+}
diff --git a/driver/test-uid.c b/driver/test-uid.c
new file mode 100644
index 0000000..6a1f9cc
--- /dev/null
+++ b/driver/test-uid.c
@@ -0,0 +1,209 @@
+/* test-uid.c --- playing with setuid.
+ * xscreensaver, Copyright (c) 1998, 2005 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <pwd.h>
+#include <grp.h>
+
+static void
+print(void)
+{
+ int uid = getuid();
+ int gid = getgid();
+ int euid = geteuid();
+ int egid = getegid();
+ struct passwd *p = 0;
+ struct group *g = 0;
+ gid_t groups[1024];
+ int n, size;
+
+ p = getpwuid (uid);
+ g = getgrgid (gid);
+ fprintf(stderr, "real user/group: %ld/%ld (%s/%s)\n", (long) uid, (long) gid,
+ (p && p->pw_name ? p->pw_name : "???"),
+ (g && g->gr_name ? g->gr_name : "???"));
+
+ p = getpwuid (euid);
+ g = getgrgid (egid);
+ fprintf(stderr, "eff. user/group: %ld/%ld (%s/%s)\n", (long)euid, (long)egid,
+ (p && p->pw_name ? p->pw_name : "???"),
+ (g && g->gr_name ? g->gr_name : "???"));
+
+ size = sizeof(groups) / sizeof(gid_t);
+ n = getgroups(size - 1, groups);
+ if (n < 0)
+ perror("getgroups failed");
+ else
+ {
+ int i;
+ fprintf (stderr, "eff. group list: [");
+ for (i = 0; i < n; i++)
+ {
+ g = getgrgid (groups[i]);
+ fprintf(stderr, "%s%s=%ld", (i == 0 ? "" : ", "),
+ (g->gr_name ? g->gr_name : "???"),
+ (long) groups[i]);
+ }
+ fprintf (stderr, "]\n");
+ }
+}
+
+int
+main (int argc, char **argv)
+{
+ int i;
+ struct passwd *p = 0;
+ struct group *g = 0;
+
+ if (argc <= 1)
+ {
+ fprintf(stderr,
+ "usage: %s [ user/group ... ]\n"
+ "\tEach argument may be a user name, or user/group.\n"
+ "\tThis program will attempt to setuid/setgid to each\n"
+ "\tin turn, and report the results. The user and group\n"
+ "\tnames may be strings, or numeric.\n",
+ argv[0]);
+ exit(1);
+ }
+
+ print();
+ for (i = 1; i < argc; i++)
+ {
+ char *user = argv[i];
+ char *group = strchr(user, '/');
+ if (!group)
+ group = strchr(user, '.');
+ if (group)
+ *group++ = 0;
+
+ if (group && *group)
+ {
+ long gid = 0;
+ int was_numeric = 0;
+
+ g = 0;
+ if (*group == '-' || (*group >= '0' && *group <= '9'))
+ if (1 == sscanf(group, "%ld", &gid))
+ {
+ g = getgrgid (gid);
+ was_numeric = 1;
+ }
+
+ if (!g)
+ g = getgrnam(group);
+
+ if (g)
+ {
+ gid = g->gr_gid;
+ group = g->gr_name;
+ }
+ else
+ {
+ if (was_numeric)
+ {
+ fprintf(stderr, "no group numbered %s.\n", group);
+ group = "";
+ }
+ else
+ {
+ fprintf(stderr, "no group named %s.\n", group);
+ goto NOGROUP;
+ }
+ }
+
+ fprintf(stderr, "setgroups(1, [%ld]) \"%s\"", gid, group);
+ {
+ gid_t g2 = gid;
+ if (setgroups(1, &g2) == 0)
+ fprintf(stderr, " succeeded.\n");
+ else
+ perror(" failed");
+ }
+
+ fprintf(stderr, "setgid(%ld) \"%s\"", gid, group);
+ if (setgid(gid) == 0)
+ fprintf(stderr, " succeeded.\n");
+ else
+ perror(" failed");
+
+ NOGROUP: ;
+ }
+
+ if (user && *user)
+ {
+ long uid = 0;
+ int was_numeric = 0;
+
+ p = 0;
+ if (*user == '-' || (*user >= '0' && *user <= '9'))
+ if (1 == sscanf(user, "%ld", &uid))
+ {
+ p = getpwuid (uid);
+ was_numeric = 1;
+ }
+
+ if (!p)
+ p = getpwnam(user);
+
+ if (p)
+ {
+ uid = p->pw_uid;
+ user = p->pw_name;
+ }
+ else
+ {
+ if (was_numeric)
+ {
+ fprintf(stderr, "no user numbered \"%s\".\n", user);
+ user = "";
+ }
+ else
+ {
+ fprintf(stderr, "no user named %s.\n", user);
+ goto NOUSER;
+ }
+ }
+
+ fprintf(stderr, "setuid(%ld) \"%s\"", uid, user);
+ if (setuid(uid) == 0)
+ fprintf(stderr, " succeeded.\n");
+ else
+ perror(" failed");
+ NOUSER: ;
+ }
+ print();
+ }
+
+ fprintf(stderr,
+ "running \"whoami\" and \"groups\" in a sub-process reports:\n");
+ fflush(stdout);
+ fflush(stderr);
+ system ("/bin/sh -c 'echo \"`whoami` / `groups`\"'");
+
+ fflush(stdout);
+ fflush(stderr);
+ exit(0);
+}
diff --git a/driver/test-vp.c b/driver/test-vp.c
new file mode 100644
index 0000000..bf1a0b1
--- /dev/null
+++ b/driver/test-vp.c
@@ -0,0 +1,213 @@
+/* test-xinerama.c --- playing with XF86VidModeGetViewPort
+ * xscreensaver, Copyright (c) 2004 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+#include <time.h>
+#include <sys/time.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+
+#include <X11/Xproto.h>
+#include <X11/extensions/xf86vmode.h>
+#include <X11/extensions/Xinerama.h>
+
+char *progname = 0;
+char *progclass = "XScreenSaver";
+
+static const char *
+blurb (void)
+{
+ static char buf[255];
+ time_t now = time ((time_t *) 0);
+ char *ct = (char *) ctime (&now);
+ int n = strlen(progname);
+ if (n > 100) n = 99;
+ strncpy(buf, progname, n);
+ buf[n++] = ':';
+ buf[n++] = ' ';
+ strncpy(buf+n, ct+11, 8);
+ strcpy(buf+n+9, ": ");
+ return buf;
+}
+
+
+static Bool error_handler_hit_p = False;
+
+static int
+ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
+{
+ error_handler_hit_p = True;
+ return 0;
+}
+
+
+static int
+screen_count (Display *dpy)
+{
+ int n = ScreenCount(dpy);
+ int xn = 0;
+ int event_number, error_number;
+
+ if (!XineramaQueryExtension (dpy, &event_number, &error_number))
+ {
+ fprintf(stderr, "%s: XineramaQueryExtension(dpy, ...) ==> False\n",
+ blurb());
+ goto DONE;
+ }
+ else
+ fprintf(stderr, "%s: XineramaQueryExtension(dpy, ...) ==> %d, %d\n",
+ blurb(), event_number, error_number);
+
+ if (!XineramaIsActive(dpy))
+ {
+ fprintf(stderr, "%s: XineramaIsActive(dpy) ==> False\n",
+ blurb());
+ goto DONE;
+ }
+ else
+ {
+ int major, minor;
+ XineramaScreenInfo *xsi;
+ fprintf(stderr, "%s: XineramaIsActive(dpy) ==> True\n",
+ blurb());
+ if (!XineramaQueryVersion(dpy, &major, &minor))
+ {
+ fprintf(stderr,
+ "%s: XineramaQueryVersion(dpy, ...) ==> False\n",
+ blurb());
+ goto DONE;
+ }
+ else
+ fprintf(stderr,
+ "%s: XineramaQueryVersion(dpy, ...) ==> %d, %d\n",
+ blurb(), major, minor);
+
+ xsi = XineramaQueryScreens (dpy, &xn);
+ if (xsi) XFree (xsi);
+ }
+
+ DONE:
+ fprintf (stderr, "\n");
+ fprintf (stderr, "%s: X client screens: %d\n", blurb(), n);
+ fprintf (stderr, "%s: Xinerama screens: %d\n", blurb(), xn);
+ fprintf (stderr, "\n");
+
+ if (xn > n) return xn;
+ else return n;
+}
+
+
+int
+main (int argc, char **argv)
+{
+ int event_number, error_number;
+ int major, minor;
+ int nscreens = 0;
+ int i;
+
+ XtAppContext app;
+ Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0,
+ &argc, argv, 0, 0, 0);
+ Display *dpy = XtDisplay (toplevel_shell);
+ XtGetApplicationNameAndClass (dpy, &progname, &progclass);
+
+ if (!XF86VidModeQueryExtension(dpy, &event_number, &error_number))
+ {
+ fprintf(stderr, "%s: XF86VidModeQueryExtension(dpy, ...) ==> False\n",
+ blurb());
+ fprintf(stderr,
+ "%s: server does not support the XF86VidMode extension.\n",
+ blurb());
+ exit(1);
+ }
+ else
+ fprintf(stderr, "%s: XF86VidModeQueryExtension(dpy, ...) ==> %d, %d\n",
+ blurb(), event_number, error_number);
+
+ if (!XF86VidModeQueryVersion(dpy, &major, &minor))
+ {
+ fprintf(stderr, "%s: XF86VidModeQueryVersion(dpy, ...) ==> False\n",
+ blurb());
+ fprintf(stderr,
+ "%s: server didn't report XF86VidMode version numbers?\n",
+ blurb());
+ }
+ else
+ fprintf(stderr, "%s: XF86VidModeQueryVersion(dpy, ...) ==> %d, %d\n",
+ blurb(), major, minor);
+
+ nscreens = screen_count (dpy);
+
+ for (i = 0; i < nscreens; i++)
+ {
+ int result = 0;
+ int x = 0, y = 0, dot = 0;
+ XF86VidModeModeLine ml = { 0, };
+ XErrorHandler old_handler;
+
+ XSync (dpy, False);
+ error_handler_hit_p = False;
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+
+ result = XF86VidModeGetViewPort (dpy, i, &x, &y);
+
+ XSync (dpy, False);
+ XSetErrorHandler (old_handler);
+ XSync (dpy, False);
+
+ if (error_handler_hit_p)
+ {
+ fprintf(stderr,
+ "%s: XF86VidModeGetViewPort(dpy, %d, ...) ==> X error\n",
+ blurb(), i);
+ continue;
+ }
+
+ if (! result)
+ fprintf(stderr, "%s: XF86VidModeGetViewPort(dpy, %d, ...) ==> %d\n",
+ blurb(), i, result);
+
+ result = XF86VidModeGetModeLine (dpy, i, &dot, &ml);
+ if (! result)
+ fprintf(stderr, "%s: XF86VidModeGetModeLine(dpy, %d, ...) ==> %d\n",
+ blurb(), i, result);
+
+ fprintf (stderr, "%s: screen %d: %dx%d; viewport: %dx%d+%d+%d\n",
+ blurb(), i,
+ DisplayWidth (dpy, i), DisplayHeight (dpy, i),
+ ml.hdisplay, ml.vdisplay, x, y
+ );
+
+ fprintf (stderr,
+ "%s: hsync start %d; end %d; total %d; skew %d;\n",
+ blurb(),
+ ml.hsyncstart, ml.hsyncend, ml.htotal, ml.hskew);
+ fprintf (stderr,
+ "%s: vsync start %d; end %d; total %d; flags 0x%04x;\n",
+ blurb(),
+ ml.vsyncstart, ml.vsyncend, ml.vtotal, ml.flags);
+ fprintf (stderr, "\n");
+ }
+ XSync (dpy, False);
+ exit (0);
+}
diff --git a/driver/test-xdpms.c b/driver/test-xdpms.c
new file mode 100644
index 0000000..b86aed3
--- /dev/null
+++ b/driver/test-xdpms.c
@@ -0,0 +1,179 @@
+/* test-xdpms.c --- playing with the XDPMS extension.
+ * xscreensaver, Copyright (c) 1998-2011 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+#include <time.h>
+#include <sys/time.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+
+#include <X11/Xproto.h>
+#include <X11/extensions/dpms.h>
+#include <X11/extensions/dpmsstr.h>
+
+extern Bool DPMSQueryExtension (Display *dpy, int *event_ret, int *error_ret);
+extern Bool DPMSCapable (Display *dpy);
+extern Status DPMSForceLevel (Display *dpy, CARD16 level);
+extern Status DPMSInfo (Display *dpy, CARD16 *power_level, BOOL *state);
+
+extern Status DPMSGetVersion (Display *dpy, int *major_ret, int *minor_ret);
+extern Status DPMSSetTimeouts (Display *dpy,
+ CARD16 standby, CARD16 suspend, CARD16 off);
+extern Bool DPMSGetTimeouts (Display *dpy,
+ CARD16 *standby, CARD16 *suspend, CARD16 *off);
+extern Status DPMSEnable (Display *dpy);
+extern Status DPMSDisable (Display *dpy);
+
+
+char *progname = 0;
+char *progclass = "XScreenSaver";
+
+static const char *
+blurb (void)
+{
+ static char buf[255];
+ time_t now = time ((time_t *) 0);
+ char *ct = (char *) ctime (&now);
+ int n = strlen(progname);
+ if (n > 100) n = 99;
+ strncpy(buf, progname, n);
+ buf[n++] = ':';
+ buf[n++] = ' ';
+ strncpy(buf+n, ct+11, 8);
+ strcpy(buf+n+9, ": ");
+ return buf;
+}
+
+
+static Bool error_handler_hit_p = False;
+
+static int
+ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
+{
+ error_handler_hit_p = True;
+ return 0;
+}
+
+
+int
+main (int argc, char **argv)
+{
+ int delay = 10;
+
+ int event_number, error_number;
+ int major, minor;
+ CARD16 standby, suspend, off;
+ CARD16 state;
+ BOOL onoff;
+
+ XtAppContext app;
+ Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0,
+ &argc, argv, 0, 0, 0);
+ Display *dpy = XtDisplay (toplevel_shell);
+ XtGetApplicationNameAndClass (dpy, &progname, &progclass);
+
+ if (!DPMSQueryExtension(dpy, &event_number, &error_number))
+ {
+ fprintf(stderr, "%s: DPMSQueryExtension(dpy, ...) ==> False\n",
+ blurb());
+ fprintf(stderr, "%s: server does not support the XDPMS extension.\n",
+ blurb());
+ exit(1);
+ }
+ else
+ fprintf(stderr, "%s: DPMSQueryExtension(dpy, ...) ==> %d, %d\n", blurb(),
+ event_number, error_number);
+
+ if (!DPMSCapable(dpy))
+ {
+ fprintf(stderr, "%s: DPMSCapable(dpy) ==> False\n", blurb());
+ fprintf(stderr, "%s: server says hardware doesn't support DPMS.\n",
+ blurb());
+ exit(1);
+ }
+ else
+ fprintf(stderr, "%s: DPMSCapable(dpy) ==> True\n", blurb());
+
+ if (!DPMSGetVersion(dpy, &major, &minor))
+ {
+ fprintf(stderr, "%s: DPMSGetVersion(dpy, ...) ==> False\n", blurb());
+ fprintf(stderr, "%s: server didn't report XDPMS version numbers?\n",
+ blurb());
+ }
+ else
+ fprintf(stderr, "%s: DPMSGetVersion(dpy, ...) ==> %d, %d\n", blurb(),
+ major, minor);
+
+ if (!DPMSGetTimeouts(dpy, &standby, &suspend, &off))
+ {
+ fprintf(stderr, "%s: DPMSGetTimeouts(dpy, ...) ==> False\n", blurb());
+ fprintf(stderr, "%s: server didn't report DPMS timeouts?\n", blurb());
+ }
+ else
+ fprintf(stderr,
+ "%s: DPMSGetTimeouts(dpy, ...)\n"
+ "\t ==> standby = %d, suspend = %d, off = %d\n",
+ blurb(), standby, suspend, off);
+
+ while (1)
+ {
+ if (!DPMSInfo(dpy, &state, &onoff))
+ {
+ fprintf(stderr, "%s: DPMSInfo(dpy, ...) ==> False\n", blurb());
+ fprintf(stderr, "%s: couldn't read DPMS state?\n", blurb());
+ onoff = 0;
+ state = -1;
+ }
+ else
+ {
+ fprintf(stderr, "%s: DPMSInfo(dpy, ...) ==> %s, %s\n", blurb(),
+ (state == DPMSModeOn ? "DPMSModeOn" :
+ state == DPMSModeStandby ? "DPMSModeStandby" :
+ state == DPMSModeSuspend ? "DPMSModeSuspend" :
+ state == DPMSModeOff ? "DPMSModeOff" : "???"),
+ (onoff == 1 ? "On" : onoff == 0 ? "Off" : "???"));
+ }
+
+ if (state == DPMSModeStandby ||
+ state == DPMSModeSuspend ||
+ state == DPMSModeOff)
+ {
+ XErrorHandler old_handler;
+ int st;
+ fprintf(stderr, "%s: monitor is off; turning it on.\n", blurb());
+
+ XSync (dpy, False);
+ error_handler_hit_p = False;
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+ XSync (dpy, False);
+ st = DPMSForceLevel (dpy, DPMSModeOn);
+ XSync (dpy, False);
+ if (error_handler_hit_p) st = -666;
+
+ fprintf (stderr, "%s: DPMSForceLevel (dpy, DPMSModeOn) ==> %s\n",
+ blurb(), (st == -666 ? "X Error" : st ? "Ok" : "Error"));
+ }
+
+ sleep (delay);
+ }
+}
diff --git a/driver/test-xinerama.c b/driver/test-xinerama.c
new file mode 100644
index 0000000..8bafbb0
--- /dev/null
+++ b/driver/test-xinerama.c
@@ -0,0 +1,112 @@
+/* test-xinerama.c --- playing with the Xinerama extension.
+ * xscreensaver, Copyright (c) 2003 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+#include <time.h>
+#include <sys/time.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+
+#include <X11/Xproto.h>
+#include <X11/extensions/Xinerama.h>
+
+char *progname = 0;
+char *progclass = "XScreenSaver";
+
+static const char *
+blurb (void)
+{
+ static char buf[255];
+ time_t now = time ((time_t *) 0);
+ char *ct = (char *) ctime (&now);
+ int n = strlen(progname);
+ if (n > 100) n = 99;
+ strncpy(buf, progname, n);
+ buf[n++] = ':';
+ buf[n++] = ' ';
+ strncpy(buf+n, ct+11, 8);
+ strcpy(buf+n+9, ": ");
+ return buf;
+}
+
+
+int
+main (int argc, char **argv)
+{
+ int event_number, error_number;
+ int major, minor;
+ int nscreens = 0;
+ XineramaScreenInfo *xsi;
+ int i;
+
+ XtAppContext app;
+ Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0,
+ &argc, argv, 0, 0, 0);
+ Display *dpy = XtDisplay (toplevel_shell);
+ XtGetApplicationNameAndClass (dpy, &progname, &progclass);
+
+ if (!XineramaQueryExtension(dpy, &event_number, &error_number))
+ {
+ fprintf(stderr, "%s: XineramaQueryExtension(dpy, ...) ==> False\n",
+ blurb());
+ fprintf(stderr, "%s: server does not support the Xinerama extension.\n",
+ blurb());
+ exit(1);
+ }
+ else
+ fprintf(stderr, "%s: XineramaQueryExtension(dpy, ...) ==> %d, %d\n",
+ blurb(), event_number, error_number);
+
+ if (!XineramaIsActive(dpy))
+ {
+ fprintf(stderr, "%s: XineramaIsActive(dpy) ==> False\n", blurb());
+ fprintf(stderr, "%s: server says Xinerama is turned off.\n", blurb());
+ exit(1);
+ }
+ else
+ fprintf(stderr, "%s: XineramaIsActive(dpy) ==> True\n", blurb());
+
+ if (!XineramaQueryVersion(dpy, &major, &minor))
+ {
+ fprintf(stderr, "%s: XineramaQueryVersion(dpy, ...) ==> False\n",
+ blurb());
+ fprintf(stderr, "%s: server didn't report Xinerama version numbers?\n",
+ blurb());
+ }
+ else
+ fprintf(stderr, "%s: XineramaQueryVersion(dpy, ...) ==> %d, %d\n", blurb(),
+ major, minor);
+
+ xsi = XineramaQueryScreens (dpy, &nscreens);
+ fprintf(stderr, "%s: %d Xinerama screens\n", blurb(), nscreens);
+
+ for (i = 0; i < nscreens; i++)
+ fprintf (stderr, "%s: screen %d: %dx%d+%d+%d\n",
+ blurb(),
+ xsi[i].screen_number,
+ xsi[i].width, xsi[i].height,
+ xsi[i].x_org, xsi[i].y_org);
+ XFree (xsi);
+ XSync (dpy, False);
+ exit (0);
+}
diff --git a/driver/timers.c b/driver/timers.c
new file mode 100644
index 0000000..ea97f34
--- /dev/null
+++ b/driver/timers.c
@@ -0,0 +1,1788 @@
+/* timers.c --- detecting when the user is idle, and other timer-related tasks.
+ * xscreensaver, Copyright (c) 1991-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <X11/Xlib.h>
+#include <X11/Intrinsic.h>
+#include <X11/Xos.h>
+#include <X11/Xatom.h>
+#include <time.h>
+#include <sys/time.h>
+#ifdef HAVE_XMU
+# ifndef VMS
+# include <X11/Xmu/Error.h>
+# else /* VMS */
+# include <Xmu/Error.h>
+# endif /* VMS */
+# else /* !HAVE_XMU */
+# include "xmu.h"
+#endif /* !HAVE_XMU */
+
+#ifdef HAVE_XIDLE_EXTENSION
+#include <X11/extensions/xidle.h>
+#endif /* HAVE_XIDLE_EXTENSION */
+
+#ifdef HAVE_MIT_SAVER_EXTENSION
+#include <X11/extensions/scrnsaver.h>
+#endif /* HAVE_MIT_SAVER_EXTENSION */
+
+#ifdef HAVE_SGI_SAVER_EXTENSION
+#include <X11/extensions/XScreenSaver.h>
+#endif /* HAVE_SGI_SAVER_EXTENSION */
+
+#ifdef HAVE_RANDR
+#include <X11/extensions/Xrandr.h>
+#endif /* HAVE_RANDR */
+
+#include "xscreensaver.h"
+
+#undef ABS
+#define ABS(x)((x)<0?-(x):(x))
+
+#undef MAX
+#define MAX(x,y)((x)>(y)?(x):(y))
+
+
+#ifdef HAVE_PROC_INTERRUPTS
+static Bool proc_interrupts_activity_p (saver_info *si);
+#endif /* HAVE_PROC_INTERRUPTS */
+
+static void check_for_clock_skew (saver_info *si);
+
+
+void
+idle_timer (XtPointer closure, XtIntervalId *id)
+{
+ saver_info *si = (saver_info *) closure;
+
+ /* What an amazingly shitty design. Not only does Xt execute timeout
+ events from XtAppNextEvent() instead of from XtDispatchEvent(), but
+ there is no way to tell Xt to block until there is an X event OR a
+ timeout happens. Once your timeout proc is called, XtAppNextEvent()
+ still won't return until a "real" X event comes in.
+
+ So this function pushes a stupid, gratuitous, unnecessary event back
+ on the event queue to force XtAppNextEvent to return Right Fucking Now.
+ When the code in sleep_until_idle() sees an event of type XAnyEvent,
+ which the server never generates, it knows that a timeout has occurred.
+ */
+ XEvent fake_event;
+ fake_event.type = 0; /* XAnyEvent type, ignored. */
+ fake_event.xany.display = si->dpy;
+ fake_event.xany.window = 0;
+ XPutBackEvent (si->dpy, &fake_event);
+
+ /* If we are the timer that just went off, clear the pointer to the id. */
+ if (id)
+ {
+ if (si->timer_id && *id != si->timer_id)
+ abort(); /* oops, scheduled timer twice?? */
+ si->timer_id = 0;
+ }
+}
+
+
+void
+schedule_wakeup_event (saver_info *si, Time when, Bool verbose_p)
+{
+ if (si->timer_id)
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: idle_timer already running\n", blurb());
+ return;
+ }
+
+ /* Wake up periodically to ask the server if we are idle. */
+ si->timer_id = XtAppAddTimeOut (si->app, when, idle_timer,
+ (XtPointer) si);
+
+ if (verbose_p)
+ fprintf (stderr, "%s: starting idle_timer (%ld, %ld)\n",
+ blurb(), when, si->timer_id);
+}
+
+
+static void
+notice_events (saver_info *si, Window window, Bool top_p)
+{
+ saver_preferences *p = &si->prefs;
+ XWindowAttributes attrs;
+ unsigned long events;
+ Window root, parent, *kids;
+ unsigned int nkids;
+ int screen_no;
+
+ if (XtWindowToWidget (si->dpy, window))
+ /* If it's one of ours, don't mess up its event mask. */
+ return;
+
+ if (!XQueryTree (si->dpy, window, &root, &parent, &kids, &nkids))
+ return;
+ if (window == root)
+ top_p = False;
+
+ /* Figure out which screen this window is on, for the diagnostics. */
+ for (screen_no = 0; screen_no < si->nscreens; screen_no++)
+ if (root == RootWindowOfScreen (si->screens[screen_no].screen))
+ break;
+
+ XGetWindowAttributes (si->dpy, window, &attrs);
+ events = ((attrs.all_event_masks | attrs.do_not_propagate_mask)
+ & (KeyPressMask | PropertyChangeMask));
+
+ /* Select for SubstructureNotify on all windows.
+ Select for PropertyNotify on all windows.
+ Select for KeyPress on all windows that already have it selected.
+
+ Note that we can't select for ButtonPress, because of X braindamage:
+ only one client at a time may select for ButtonPress on a given
+ window, though any number can select for KeyPress. Someone explain
+ *that* to me.
+
+ So, if the user spends a while clicking the mouse without ever moving
+ the mouse or touching the keyboard, we won't know that they've been
+ active, and the screensaver will come on. That sucks, but I don't
+ know how to get around it.
+
+ Since X presents mouse wheels as clicks, this applies to those, too:
+ scrolling through a document using only the mouse wheel doesn't
+ count as activity... Fortunately, /proc/interrupts helps, on
+ systems that have it. Oh, if it's a PS/2 mouse, not serial or USB.
+ This sucks!
+ */
+ XSelectInput (si->dpy, window,
+ SubstructureNotifyMask | PropertyChangeMask | events);
+
+ if (top_p && p->debug_p && (events & KeyPressMask))
+ {
+ /* Only mention one window per tree (hack hack). */
+ fprintf (stderr, "%s: %d: selected KeyPress on 0x%lX\n",
+ blurb(), screen_no, (unsigned long) window);
+ top_p = False;
+ }
+
+ if (kids)
+ {
+ while (nkids)
+ notice_events (si, kids [--nkids], top_p);
+ XFree ((char *) kids);
+ }
+}
+
+
+int
+BadWindow_ehandler (Display *dpy, XErrorEvent *error)
+{
+ /* When we notice a window being created, we spawn a timer that waits
+ 30 seconds or so, and then selects events on that window. This error
+ handler is used so that we can cope with the fact that the window
+ may have been destroyed <30 seconds after it was created.
+ */
+ if (error->error_code == BadWindow ||
+ error->error_code == BadMatch ||
+ error->error_code == BadDrawable)
+ return 0;
+ else
+ return saver_ehandler (dpy, error);
+}
+
+
+struct notice_events_timer_arg {
+ saver_info *si;
+ Window w;
+};
+
+static void
+notice_events_timer (XtPointer closure, XtIntervalId *id)
+{
+ struct notice_events_timer_arg *arg =
+ (struct notice_events_timer_arg *) closure;
+
+ XErrorHandler old_handler = XSetErrorHandler (BadWindow_ehandler);
+
+ saver_info *si = arg->si;
+ Window window = arg->w;
+
+ free(arg);
+ notice_events (si, window, True);
+ XSync (si->dpy, False);
+ XSetErrorHandler (old_handler);
+}
+
+void
+start_notice_events_timer (saver_info *si, Window w, Bool verbose_p)
+{
+ saver_preferences *p = &si->prefs;
+ struct notice_events_timer_arg *arg =
+ (struct notice_events_timer_arg *) malloc(sizeof(*arg));
+ arg->si = si;
+ arg->w = w;
+ XtAppAddTimeOut (si->app, p->notice_events_timeout, notice_events_timer,
+ (XtPointer) arg);
+
+ if (verbose_p)
+ fprintf (stderr, "%s: starting notice_events_timer for 0x%X (%lu)\n",
+ blurb(), (unsigned int) w, p->notice_events_timeout);
+}
+
+
+/* When the screensaver is active, this timer will periodically change
+ the running program.
+ */
+void
+cycle_timer (XtPointer closure, XtIntervalId *id)
+{
+ saver_info *si = (saver_info *) closure;
+ saver_preferences *p = &si->prefs;
+ Time how_long = p->cycle;
+
+ if (si->selection_mode > 0 &&
+ screenhack_running_p (si))
+ /* If we're in "SELECT n" mode, the cycle timer going off will just
+ restart this same hack again. There's not much point in doing this
+ every 5 or 10 minutes, but on the other hand, leaving one hack running
+ for days is probably not a great idea, since they tend to leak and/or
+ crash. So, restart the thing once an hour. */
+ how_long = 1000 * 60 * 60;
+
+ if (si->dbox_up_p)
+ {
+ if (p->verbose_p)
+ fprintf (stderr, "%s: dialog box up; delaying hack change.\n",
+ blurb());
+ how_long = 30000; /* 30 secs */
+ }
+ else
+ {
+ int i;
+ maybe_reload_init_file (si);
+ for (i = 0; i < si->nscreens; i++)
+ kill_screenhack (&si->screens[i]);
+
+ raise_window (si, True, True, False);
+
+ if (!si->throttled_p)
+ for (i = 0; i < si->nscreens; i++)
+ spawn_screenhack (&si->screens[i]);
+ else
+ {
+ if (p->verbose_p)
+ fprintf (stderr, "%s: not launching new hack (throttled.)\n",
+ blurb());
+ }
+ }
+
+ if (how_long > 0)
+ {
+ si->cycle_id = XtAppAddTimeOut (si->app, how_long, cycle_timer,
+ (XtPointer) si);
+
+ if (p->debug_p)
+ fprintf (stderr, "%s: starting cycle_timer (%ld, %ld)\n",
+ blurb(), how_long, si->cycle_id);
+ }
+ else
+ {
+ if (p->debug_p)
+ fprintf (stderr, "%s: not starting cycle_timer: how_long == %ld\n",
+ blurb(), (unsigned long) how_long);
+ }
+}
+
+
+void
+activate_lock_timer (XtPointer closure, XtIntervalId *id)
+{
+ saver_info *si = (saver_info *) closure;
+ saver_preferences *p = &si->prefs;
+
+ if (p->verbose_p)
+ fprintf (stderr, "%s: timed out; activating lock.\n", blurb());
+ set_locked_p (si, True);
+}
+
+
+/* Call this when user activity (or "simulated" activity) has been noticed.
+ */
+void
+reset_timers (saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+ if (si->using_mit_saver_extension || si->using_sgi_saver_extension)
+ return;
+
+ if (si->timer_id)
+ {
+ if (p->debug_p)
+ fprintf (stderr, "%s: killing idle_timer (%ld, %ld)\n",
+ blurb(), p->timeout, si->timer_id);
+ XtRemoveTimeOut (si->timer_id);
+ si->timer_id = 0;
+ }
+
+ schedule_wakeup_event (si, p->timeout, p->debug_p); /* sets si->timer_id */
+
+ if (si->cycle_id) abort (); /* no cycle timer when inactive */
+
+ si->last_activity_time = time ((time_t *) 0);
+
+ /* This will (hopefully, supposedly) tell the server to re-set its
+ DPMS timer. Without this, the -deactivate clientmessage would
+ prevent xscreensaver from blanking, but would not prevent the
+ monitor from powering down. */
+#if 0
+ /* #### With some servers, this causes the screen to flicker every
+ time a key is pressed! Ok, I surrender. I give up on ever
+ having DPMS work properly.
+ */
+ XForceScreenSaver (si->dpy, ScreenSaverReset);
+
+ /* And if the monitor is already powered off, turn it on.
+ You'd think the above would do that, but apparently not? */
+ monitor_power_on (si, True);
+#endif
+
+}
+
+
+/* Returns true if a mouse has moved since the last time we checked.
+ Small motions (of less than "hysteresis" pixels/second) are ignored.
+ */
+static Bool
+device_pointer_moved_p (saver_info *si, poll_mouse_data *last_poll_mouse,
+ poll_mouse_data *this_poll_mouse, Bool mods_p,
+ const char *debug_type, int debug_id)
+{
+ saver_preferences *p = &si->prefs;
+
+ unsigned int distance, dps;
+ unsigned long seconds = 0;
+ Bool moved_p = False;
+
+ distance = MAX (ABS (last_poll_mouse->root_x - this_poll_mouse->root_x),
+ ABS (last_poll_mouse->root_y - this_poll_mouse->root_y));
+ seconds = (this_poll_mouse->time - last_poll_mouse->time);
+
+
+ /* When the screen is blanked, we get MotionNotify events, but when not
+ blanked, we poll only every 5 seconds, and that's not enough resolution
+ to do hysteresis based on a 1 second interval. So, assume that any
+ motion we've seen during the 5 seconds when our eyes were closed happened
+ in the last 1 second instead.
+ */
+ if (seconds > 1) seconds = 1;
+
+ dps = (seconds <= 0 ? distance : (distance / seconds));
+
+ /* Motion only counts if the rate is more than N pixels per second.
+ */
+ if (dps >= p->pointer_hysteresis &&
+ distance > 0)
+ moved_p = True;
+
+ /* If the mouse is not on this screen but used to be, that's motion.
+ If the mouse was not on this screen, but is now, that's motion.
+ */
+ {
+ Bool on_screen_p = (this_poll_mouse->root_x != -1 &&
+ this_poll_mouse->root_y != -1);
+ Bool was_on_screen_p = (last_poll_mouse->root_x != -1 &&
+ last_poll_mouse->root_y != -1);
+
+ if (on_screen_p != was_on_screen_p)
+ moved_p = True;
+ }
+
+ if (p->debug_p && (distance != 0 || moved_p))
+ {
+ fprintf (stderr, "%s: %s %d: pointer %s", blurb(), debug_type, debug_id,
+ (moved_p ? "moved: " : "ignored:"));
+ if (last_poll_mouse->root_x == -1)
+ fprintf (stderr, "off screen");
+ else
+ fprintf (stderr, "%d,%d",
+ last_poll_mouse->root_x,
+ last_poll_mouse->root_y);
+ fprintf (stderr, " -> ");
+ if (this_poll_mouse->root_x == -1)
+ fprintf (stderr, "off screen");
+ else
+ fprintf (stderr, "%d,%d", this_poll_mouse->root_x,
+ this_poll_mouse->root_y);
+ if (last_poll_mouse->root_x != -1 && this_poll_mouse->root_x != -1)
+ fprintf (stderr, " (%d,%d; %d/%lu=%d)",
+ ABS(last_poll_mouse->root_x - this_poll_mouse->root_x),
+ ABS(last_poll_mouse->root_y - this_poll_mouse->root_y),
+ distance, seconds, dps);
+
+ fprintf (stderr, ".\n");
+ }
+
+ if (!moved_p &&
+ mods_p &&
+ this_poll_mouse->mask != last_poll_mouse->mask)
+ {
+ moved_p = True;
+
+ if (p->debug_p)
+ fprintf (stderr, "%s: %s %d: modifiers changed: 0x%04x -> 0x%04x.\n",
+ blurb(), debug_type, debug_id,
+ last_poll_mouse->mask, this_poll_mouse->mask);
+ }
+
+ last_poll_mouse->child = this_poll_mouse->child;
+ last_poll_mouse->mask = this_poll_mouse->mask;
+
+ if (moved_p || seconds > 0)
+ {
+ last_poll_mouse->time = this_poll_mouse->time;
+ last_poll_mouse->root_x = this_poll_mouse->root_x;
+ last_poll_mouse->root_y = this_poll_mouse->root_y;
+ }
+
+ return moved_p;
+}
+
+/* Returns true if core mouse pointer has moved since the last time we checked.
+ */
+static Bool
+pointer_moved_p (saver_screen_info *ssi, Bool mods_p)
+{
+ saver_info *si = ssi->global;
+
+ Window root;
+ poll_mouse_data this_poll_mouse;
+ int x, y;
+
+ /* don't check xinerama pseudo-screens. */
+ if (!ssi->real_screen_p) return False;
+
+ this_poll_mouse.time = time ((time_t *) 0);
+
+ if (!XQueryPointer (si->dpy, ssi->screensaver_window, &root,
+ &this_poll_mouse.child,
+ &this_poll_mouse.root_x, &this_poll_mouse.root_y,
+ &x, &y, &this_poll_mouse.mask))
+ {
+ /* If XQueryPointer() returns false, the mouse is not on this screen.
+ */
+ this_poll_mouse.root_x = -1;
+ this_poll_mouse.root_y = -1;
+ this_poll_mouse.child = 0;
+ this_poll_mouse.mask = 0;
+ }
+ else
+ si->last_activity_screen = ssi;
+
+ return device_pointer_moved_p(si, &(ssi->last_poll_mouse), &this_poll_mouse,
+ mods_p, "screen", ssi->number);
+}
+
+
+/* When we aren't using a server extension, this timer is used to periodically
+ wake up and poll the mouse position, which is possibly more reliable than
+ selecting motion events on every window.
+ */
+static void
+check_pointer_timer (XtPointer closure, XtIntervalId *id)
+{
+ int i;
+ saver_info *si = (saver_info *) closure;
+ saver_preferences *p = &si->prefs;
+ Bool active_p = False;
+
+ if (!si->using_proc_interrupts &&
+ (si->using_xidle_extension ||
+ si->using_mit_saver_extension ||
+ si->using_sgi_saver_extension))
+ /* If an extension is in use, we should not be polling the mouse.
+ Unless we're also checking /proc/interrupts, in which case, we should.
+ */
+ abort ();
+
+ if (id && *id == si->check_pointer_timer_id) /* this is us - it's expired */
+ si->check_pointer_timer_id = 0;
+
+ if (si->check_pointer_timer_id) /* only queue one at a time */
+ XtRemoveTimeOut (si->check_pointer_timer_id);
+
+ si->check_pointer_timer_id = /* now re-queue */
+ XtAppAddTimeOut (si->app, p->pointer_timeout, check_pointer_timer,
+ (XtPointer) si);
+
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ if (pointer_moved_p (ssi, True))
+ active_p = True;
+ }
+
+#ifdef HAVE_PROC_INTERRUPTS
+ if (!active_p &&
+ si->using_proc_interrupts &&
+ proc_interrupts_activity_p (si))
+ {
+ active_p = True;
+ }
+#endif /* HAVE_PROC_INTERRUPTS */
+
+ if (active_p)
+ reset_timers (si);
+
+ check_for_clock_skew (si);
+}
+
+
+/* An unfortunate situation is this: the saver is not active, because the
+ user has been typing. The machine is a laptop. The user closes the lid
+ and suspends it. The CPU halts. Some hours later, the user opens the
+ lid. At this point, Xt's timers will fire, and xscreensaver will blank
+ the screen.
+
+ So far so good -- well, not really, but it's the best that we can do,
+ since the OS doesn't send us a signal *before* shutdown -- but if the
+ user had delayed locking (lockTimeout > 0) then we should start off
+ in the locked state, rather than only locking N minutes from when the
+ lid was opened. Also, eschewing fading is probably a good idea, to
+ clamp down as soon as possible.
+
+ We only do this when we'd be polling the mouse position anyway.
+ This amounts to an assumption that machines with APM support also
+ have /proc/interrupts.
+
+ Now here's a thing that sucks about this: if the user actually changes
+ the time of the machine, it will either trigger or delay the triggering
+ of a lock. On most systems, that requires root, but I'll bet at least
+ some GUI configs let non-root do it. Also, NTP attacks.
+
+ On Linux 2.6.39+ systems, there exists clock_gettime(CLOCK_BOOTTIME)
+ which would allow us to detect the "laptop CPU had been halted" state
+ independently of changes in wall-clock time. But of course that's not
+ portable.
+
+ When the wall clock changes, what do Xt timers do, anyway? If I have
+ a timer set for 30 seconds from now, and adjust the wall clock +15 seconds,
+ does the timer fire 30 seconds from now or 15? I actually have no idea.
+ It does not appear to be specified.
+ */
+static void
+check_for_clock_skew (saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+ time_t now = time ((time_t *) 0);
+ long shift = now - si->last_wall_clock_time;
+
+ if (p->debug_p)
+ {
+ int i = (si->last_wall_clock_time == 0 ? 0 : shift);
+ fprintf (stderr,
+ "%s: checking wall clock for hibernation (%d:%02d:%02d).\n",
+ blurb(),
+ (i / (60 * 60)), ((i / 60) % 60), (i % 60));
+ }
+
+ if (si->last_wall_clock_time != 0 &&
+ shift > (p->timeout / 1000))
+ {
+ if (p->verbose_p)
+ fprintf (stderr, "%s: wall clock has jumped by %ld:%02ld:%02ld%s\n",
+ blurb(),
+ (shift / (60 * 60)), ((shift / 60) % 60), (shift % 60),
+ (p->mode == DONT_BLANK ? " while saver disabled" : ""));
+
+ /* If the saver is entirely disabled, there's no need to do the
+ emergency-blank-and-lock thing.
+ */
+ if (p->mode != DONT_BLANK)
+ {
+ si->emergency_lock_p = True;
+ idle_timer ((XtPointer) si, 0);
+ }
+ }
+
+ si->last_wall_clock_time = now;
+}
+
+
+
+static void
+dispatch_event (saver_info *si, XEvent *event)
+{
+ /* If this is for the splash dialog, pass it along.
+ Note that the password dialog is handled with its own event loop,
+ so events for that window will never come through here.
+ */
+ if (si->splash_dialog && event->xany.window == si->splash_dialog)
+ handle_splash_event (si, event);
+
+ XtDispatchEvent (event);
+}
+
+
+static void
+swallow_unlock_typeahead_events (saver_info *si, XEvent *e)
+{
+ XEvent event;
+ char buf [100];
+ int i = 0;
+
+ memset (buf, 0, sizeof(buf));
+
+ event = *e;
+
+ do
+ {
+ if (event.xany.type == KeyPress)
+ {
+ char s[2];
+ int size = XLookupString ((XKeyEvent *) &event, s, 1, 0, 0);
+ if (size != 1) continue;
+ switch (*s)
+ {
+ case '\010': case '\177': /* Backspace */
+ if (i > 0) i--;
+ break;
+ case '\025': case '\030': /* Erase line */
+ case '\012': case '\015': /* Enter */
+ case '\033': /* ESC */
+ i = 0;
+ break;
+ case '\040': /* Space */
+ if (i == 0)
+ break; /* ignore space at beginning of line */
+ /* else, fall through */
+ default:
+ buf [i++] = *s;
+ break;
+ }
+ }
+
+ } while (i < sizeof(buf)-1 &&
+ XCheckMaskEvent (si->dpy, KeyPressMask, &event));
+
+ buf[i] = 0;
+
+ if (si->unlock_typeahead)
+ {
+ memset (si->unlock_typeahead, 0, strlen(si->unlock_typeahead));
+ free (si->unlock_typeahead);
+ }
+
+ if (i > 0)
+ si->unlock_typeahead = strdup (buf);
+ else
+ si->unlock_typeahead = 0;
+
+ memset (buf, 0, sizeof(buf));
+}
+
+
+/* methods of detecting idleness:
+
+ explicitly informed by SGI SCREEN_SAVER server event;
+ explicitly informed by MIT-SCREEN-SAVER server event;
+ poll server idle time with XIDLE extension;
+ select events on all windows, and note absence of recent events;
+ note that /proc/interrupts has not changed in a while;
+ activated by clientmessage.
+
+ methods of detecting non-idleness:
+
+ read events on the xscreensaver window;
+ explicitly informed by SGI SCREEN_SAVER server event;
+ explicitly informed by MIT-SCREEN-SAVER server event;
+ select events on all windows, and note events on any of them;
+ note that a client updated their window's _NET_WM_USER_TIME property;
+ note that /proc/interrupts has changed;
+ deactivated by clientmessage.
+
+ I trust that explains why this function is a big hairy mess.
+ */
+void
+sleep_until_idle (saver_info *si, Bool until_idle_p)
+{
+ saver_preferences *p = &si->prefs;
+
+ /* We have to go through this union bullshit because gcc-4.4.0 has
+ stricter struct-aliasing rules. Without this, the optimizer
+ can fuck things up.
+ */
+ union {
+ XEvent x_event;
+# ifdef HAVE_RANDR
+ XRRScreenChangeNotifyEvent xrr_event;
+# endif /* HAVE_RANDR */
+# ifdef HAVE_MIT_SAVER_EXTENSION
+ XScreenSaverNotifyEvent sevent;
+# endif /* HAVE_MIT_SAVER_EXTENSION */
+ } event;
+
+ /* We need to select events on all windows if we're not using any extensions.
+ Otherwise, we don't need to. */
+ Bool scanning_all_windows = !(si->using_xidle_extension ||
+ si->using_mit_saver_extension ||
+ si->using_sgi_saver_extension);
+
+ /* We need to periodically wake up and check for idleness if we're not using
+ any extensions, or if we're using the XIDLE extension. The other two
+ extensions explicitly deliver events when we go idle/non-idle, so we
+ don't need to poll. */
+ Bool polling_for_idleness = !(si->using_mit_saver_extension ||
+ si->using_sgi_saver_extension);
+
+ /* Whether we need to periodically wake up and check to see if the mouse has
+ moved. We only need to do this when not using any extensions. The reason
+ this isn't the same as `polling_for_idleness' is that the "idleness" poll
+ can happen (for example) 5 minutes from now, whereas the mouse-position
+ poll should happen with low periodicity. We don't need to poll the mouse
+ position with the XIDLE extension, but we do need to periodically wake up
+ and query the server with that extension. For our purposes, polling
+ /proc/interrupts is just like polling the mouse position. It has to
+ happen on the same kind of schedule. */
+ Bool polling_mouse_position = (si->using_proc_interrupts ||
+ !(si->using_xidle_extension ||
+ si->using_mit_saver_extension ||
+ si->using_sgi_saver_extension) ||
+ si->using_xinput_extension);
+
+ const char *why = 0; /* What caused the idle-state to change? */
+
+ if (until_idle_p)
+ {
+ if (polling_for_idleness)
+ /* This causes a no-op event to be delivered to us in a while, so that
+ we come back around through the event loop again. */
+ schedule_wakeup_event (si, p->timeout, p->debug_p);
+
+ if (polling_mouse_position)
+ /* Check to see if the mouse has moved, and set up a repeating timer
+ to do so periodically (typically, every 5 seconds.) */
+ check_pointer_timer ((XtPointer) si, 0);
+ }
+
+ while (1)
+ {
+ XtAppNextEvent (si->app, &event.x_event);
+
+ switch (event.x_event.xany.type) {
+ case 0: /* our synthetic "timeout" event has been signalled */
+ if (until_idle_p)
+ {
+ Time idle;
+
+ /* We may be idle; check one last time to see if the mouse has
+ moved, just in case the idle-timer went off within the 5 second
+ window between mouse polling. If the mouse has moved, then
+ check_pointer_timer() will reset last_activity_time.
+ */
+ if (polling_mouse_position)
+ check_pointer_timer ((XtPointer) si, 0);
+
+#ifdef HAVE_XIDLE_EXTENSION
+ if (si->using_xidle_extension)
+ {
+ /* The XIDLE extension uses the synthetic event to prod us into
+ re-asking the server how long the user has been idle. */
+ if (! XGetIdleTime (si->dpy, &idle))
+ {
+ fprintf (stderr, "%s: XGetIdleTime() failed.\n", blurb());
+ saver_exit (si, 1, 0);
+ }
+ }
+ else
+#endif /* HAVE_XIDLE_EXTENSION */
+#ifdef HAVE_MIT_SAVER_EXTENSION
+ if (si->using_mit_saver_extension)
+ {
+ /* We don't need to do anything in this case - the synthetic
+ event isn't necessary, as we get sent specific events
+ to wake us up. In fact, this event generally shouldn't
+ be being delivered when the MIT extension is in use. */
+ idle = 0;
+ }
+ else
+#endif /* HAVE_MIT_SAVER_EXTENSION */
+#ifdef HAVE_SGI_SAVER_EXTENSION
+ if (si->using_sgi_saver_extension)
+ {
+ /* We don't need to do anything in this case - the synthetic
+ event isn't necessary, as we get sent specific events
+ to wake us up. In fact, this event generally shouldn't
+ be being delivered when the SGI extension is in use. */
+ idle = 0;
+ }
+ else
+#endif /* HAVE_SGI_SAVER_EXTENSION */
+ {
+ /* Otherwise, no server extension is in use. The synthetic
+ event was to tell us to wake up and see if the user is now
+ idle. Compute the amount of idle time by comparing the
+ `last_activity_time' to the wall clock. The l_a_t was set
+ by calling `reset_timers()', which is called only in only
+ two situations: when polling the mouse position has revealed
+ the the mouse has moved (user activity) or when we have read
+ an event (again, user activity.)
+ */
+ idle = 1000 * (si->last_activity_time - time ((time_t *) 0));
+ }
+
+ if (idle >= p->timeout)
+ {
+ /* Look, we've been idle long enough. We're done. */
+ why = "timeout";
+ goto DONE;
+ }
+ else if (si->emergency_lock_p)
+ {
+ /* Oops, the wall clock has jumped far into the future, so
+ we need to lock down in a hurry! */
+ why = "large wall clock change";
+ goto DONE;
+ }
+ else
+ {
+ /* The event went off, but it turns out that the user has not
+ yet been idle for long enough. So re-signal the event.
+ Be economical: if we should blank after 5 minutes, and the
+ user has been idle for 2 minutes, then set this timer to
+ go off in 3 minutes.
+ */
+ if (polling_for_idleness)
+ schedule_wakeup_event (si, p->timeout - idle, p->debug_p);
+ }
+ }
+ break;
+
+ case ClientMessage:
+ if (handle_clientmessage (si, &event.x_event, until_idle_p))
+ {
+ why = "ClientMessage";
+ goto DONE;
+ }
+ break;
+
+ case CreateNotify:
+ /* A window has been created on the screen somewhere. If we're
+ supposed to scan all windows for events, prepare this window. */
+ if (scanning_all_windows)
+ {
+ Window w = event.x_event.xcreatewindow.window;
+ start_notice_events_timer (si, w, p->debug_p);
+ }
+ break;
+
+ case KeyPress:
+ case ButtonPress:
+ /* Ignore release events so that hitting ESC at the password dialog
+ doesn't result in the password dialog coming right back again when
+ the fucking release key is seen! */
+ /* case KeyRelease:*/
+ /* case ButtonRelease:*/
+ case MotionNotify:
+
+ if (p->debug_p)
+ {
+ Window root=0, window=0;
+ int x=-1, y=-1;
+ const char *type = 0;
+ if (event.x_event.xany.type == MotionNotify)
+ {
+ /*type = "MotionNotify";*/
+ root = event.x_event.xmotion.root;
+ window = event.x_event.xmotion.window;
+ x = event.x_event.xmotion.x_root;
+ y = event.x_event.xmotion.y_root;
+ }
+ else if (event.x_event.xany.type == KeyPress)
+ {
+ type = "KeyPress";
+ root = event.x_event.xkey.root;
+ window = event.x_event.xkey.window;
+ x = y = -1;
+ }
+ else if (event.x_event.xany.type == ButtonPress)
+ {
+ type = "ButtonPress";
+ root = event.x_event.xkey.root;
+ window = event.x_event.xkey.window;
+ x = event.x_event.xmotion.x_root;
+ y = event.x_event.xmotion.y_root;
+ }
+
+ if (type)
+ {
+ int i;
+ for (i = 0; i < si->nscreens; i++)
+ if (root == RootWindowOfScreen (si->screens[i].screen))
+ break;
+ fprintf (stderr,"%s: %d: %s on 0x%lx",
+ blurb(), i, type, (unsigned long) window);
+
+ /* Be careful never to do this unless in -debug mode, as
+ this could expose characters from the unlock password. */
+ if (p->debug_p && event.x_event.xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event.x_event.xkey, &c, 1, &keysym, 0);
+ fprintf (stderr, " (%s%s)",
+ (event.x_event.xkey.send_event ? "synthetic " : ""),
+ XKeysymToString (keysym));
+ }
+
+ if (x == -1)
+ fprintf (stderr, "\n");
+ else
+ fprintf (stderr, " at %d,%d.\n", x, y);
+ }
+ }
+
+ /* If any widgets want to handle this event, let them. */
+ dispatch_event (si, &event.x_event);
+
+
+ /* If we got a MotionNotify event, figure out what screen it
+ was on and poll the mouse there: if the mouse hasn't moved
+ far enough to count as "real" motion, then ignore this
+ event.
+ */
+ if (event.x_event.xany.type == MotionNotify)
+ {
+ int i;
+ for (i = 0; i < si->nscreens; i++)
+ if (event.x_event.xmotion.root ==
+ RootWindowOfScreen (si->screens[i].screen))
+ break;
+ if (i < si->nscreens)
+ {
+ if (!pointer_moved_p (&si->screens[i], False))
+ continue;
+ }
+ }
+
+
+ /* We got a user event.
+ If we're waiting for the user to become active, this is it.
+ If we're waiting until the user becomes idle, reset the timers
+ (since now we have longer to wait.)
+ */
+ if (!until_idle_p)
+ {
+ if (si->demoing_p &&
+ (event.x_event.xany.type == MotionNotify ||
+ event.x_event.xany.type == KeyRelease))
+ /* When we're demoing a single hack, mouse motion doesn't
+ cause deactivation. Only clicks and keypresses do. */
+ ;
+ else
+ {
+ /* If we're not demoing, then any activity causes deactivation.
+ */
+ why = (event.x_event.xany.type == MotionNotify ?"mouse motion":
+ event.x_event.xany.type == KeyPress?"keyboard activity":
+ event.x_event.xany.type == ButtonPress ? "mouse click" :
+ "unknown user activity");
+ goto DONE;
+ }
+ }
+ else
+ reset_timers (si);
+
+ break;
+
+ case PropertyNotify:
+
+ /* Starting in late 2014, GNOME programs don't actually select for
+ or receive KeyPress events: they do it behind the scenes through
+ some kind of Input Method magic, even when running in an en_US
+ locale. However, those applications *do* update the WM_USER_TIME
+ property on their own windows every time they recieve a secret
+ KeyPress, so we must *also* monitor that property on every
+ window, and treat changes to it as identical to KeyPress.
+
+ _NET_WM_USER_TIME is documented (such as it is) here:
+
+ http://standards.freedesktop.org/wm-spec/latest/ar01s05.html
+ #idm139870829932528
+
+ Specifically:
+
+ "Contains the XServer time at which last user activity in this
+ window took place. [...] A client [...] might, for example,
+ use the timestamp of the last KeyPress or ButtonPress event."
+
+ As of early 2016, KDE4 does something really stupid, though: some
+ hidden power management thing reduces the display brightness 150
+ seconds after the screen is blanked -- and sets a WM_USER_TIME
+ property on a hidden "kded4" window whose time is in the distant
+ past (the time at which the X server launched).
+
+ So we ignore any WM_USER_TIME whose timestamp is more than a
+ couple seconds old.
+ */
+ if (event.x_event.xproperty.state == PropertyNewValue &&
+ event.x_event.xproperty.atom == XA_NET_WM_USER_TIME)
+ {
+ int threshold = 2; /* seconds */
+ Bool bogus_p = True;
+ Window w = event.x_event.xproperty.window;
+
+ Atom type;
+ int format;
+ unsigned long nitems, bytesafter;
+ unsigned char *data = 0;
+ Cardinal user_time = 0;
+ XErrorHandler old_handler = XSetErrorHandler (BadWindow_ehandler);
+
+ if (XGetWindowProperty (si->dpy, w,
+ XA_NET_WM_USER_TIME, 0L, 1L, False,
+ XA_CARDINAL, &type, &format, &nitems,
+ &bytesafter, &data)
+ == Success &&
+ data &&
+ type == XA_CARDINAL &&
+ format == 32 &&
+ nitems == 1)
+ {
+ long diff;
+ user_time = ((Cardinal *) data)[0];
+ diff = event.x_event.xproperty.time - user_time;
+ if (diff >= 0 && diff < threshold)
+ bogus_p = False;
+ }
+
+ if (data) XFree (data);
+
+ why = "WM_USER_TIME";
+
+ if (p->debug_p)
+ {
+ XWindowAttributes xgwa;
+ int i;
+
+ XGetWindowAttributes (si->dpy, w, &xgwa);
+ for (i = 0; i < si->nscreens; i++)
+ if (xgwa.root == RootWindowOfScreen (si->screens[i].screen))
+ break;
+ fprintf (stderr,"%s: %d: %s = %ld%s on 0x%lx\n",
+ blurb(), i, why, (unsigned long) user_time,
+ (bogus_p ? " (bad)" : ""),
+ (unsigned long) w);
+ }
+
+ XSync (si->dpy, False);
+ XSetErrorHandler (old_handler);
+
+ if (bogus_p)
+ break;
+ else if (until_idle_p)
+ reset_timers (si);
+ else
+ goto DONE;
+ }
+ break;
+
+ default:
+
+#ifdef HAVE_MIT_SAVER_EXTENSION
+ if (event.x_event.type == si->mit_saver_ext_event_number)
+ {
+ /* This event's number is that of the MIT-SCREEN-SAVER server
+ extension. This extension has one event number, and the event
+ itself contains sub-codes that say what kind of event it was
+ (an "idle" or "not-idle" event.)
+ */
+ if (event.sevent.state == ScreenSaverOn)
+ {
+ int i = 0;
+ if (p->verbose_p)
+ fprintf (stderr, "%s: MIT ScreenSaverOn event received.\n",
+ blurb());
+
+ /* Get the "real" server window(s) out of the way as soon
+ as possible. */
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ if (ssi->server_mit_saver_window &&
+ window_exists_p (si->dpy,
+ ssi->server_mit_saver_window))
+ XUnmapWindow (si->dpy, ssi->server_mit_saver_window);
+ }
+
+ if (event.sevent.kind != ScreenSaverExternal)
+ {
+ fprintf (stderr,
+ "%s: ScreenSaverOn event wasn't of type External!\n",
+ blurb());
+ }
+
+ if (until_idle_p)
+ {
+ why = "MIT ScreenSaverOn";
+ goto DONE;
+ }
+ }
+ else if (event.sevent.state == ScreenSaverOff)
+ {
+ if (p->verbose_p)
+ fprintf (stderr, "%s: MIT ScreenSaverOff event received.\n",
+ blurb());
+ if (!until_idle_p)
+ {
+ why = "MIT ScreenSaverOff";
+ goto DONE;
+ }
+ }
+ else
+ fprintf (stderr,
+ "%s: unknown MIT-SCREEN-SAVER event %d received!\n",
+ blurb(), event.sevent.state);
+ }
+ else
+
+#endif /* HAVE_MIT_SAVER_EXTENSION */
+
+
+#ifdef HAVE_SGI_SAVER_EXTENSION
+ if (event.x_event.type == (si->sgi_saver_ext_event_number + ScreenSaverStart))
+ {
+ /* The SGI SCREEN_SAVER server extension has two event numbers,
+ and this event matches the "idle" event. */
+ if (p->verbose_p)
+ fprintf (stderr, "%s: SGI ScreenSaverStart event received.\n",
+ blurb());
+
+ if (until_idle_p)
+ {
+ why = "SGI ScreenSaverStart";
+ goto DONE;
+ }
+ }
+ else if (event.x_event.type == (si->sgi_saver_ext_event_number +
+ ScreenSaverEnd))
+ {
+ /* The SGI SCREEN_SAVER server extension has two event numbers,
+ and this event matches the "idle" event. */
+ if (p->verbose_p)
+ fprintf (stderr, "%s: SGI ScreenSaverEnd event received.\n",
+ blurb());
+ if (!until_idle_p)
+ {
+ why = "SGI ScreenSaverEnd";
+ goto DONE;
+ }
+ }
+ else
+#endif /* HAVE_SGI_SAVER_EXTENSION */
+
+#ifdef HAVE_XINPUT
+ /* If we got a MotionNotify event, check to see if the mouse has
+ moved far enough to count as "real" motion, if not, then ignore
+ this event.
+ */
+ if ((si->num_xinput_devices > 0) &&
+ (event.x_event.type == si->xinput_DeviceMotionNotify))
+ {
+ XDeviceMotionEvent *dme = (XDeviceMotionEvent *) &event;
+ poll_mouse_data *last_poll_mouse = NULL;
+ int d;
+
+ for (d = 0; d < si->num_xinput_devices; d++)
+ {
+ if (si->xinput_devices[d].device->device_id == dme->deviceid)
+ {
+ last_poll_mouse = &(si->xinput_devices[d].last_poll_mouse);
+ break;
+ }
+ }
+
+ if (last_poll_mouse)
+ {
+ poll_mouse_data this_poll_mouse;
+ this_poll_mouse.root_x = dme->x_root;
+ this_poll_mouse.root_y = dme->y_root;
+ this_poll_mouse.child = dme->subwindow;
+ this_poll_mouse.mask = dme->device_state;
+ this_poll_mouse.time = dme->time / 1000; /* milliseconds */
+
+ if (!device_pointer_moved_p (si, last_poll_mouse,
+ &this_poll_mouse, False,
+ "device", dme->deviceid))
+ continue;
+ }
+ else if (p->debug_p)
+ fprintf (stderr,
+ "%s: received MotionNotify from unknown device %d\n",
+ blurb(), (int) dme->deviceid);
+ }
+
+ if ((!until_idle_p) &&
+ (si->num_xinput_devices > 0) &&
+ (event.x_event.type == si->xinput_DeviceMotionNotify ||
+ event.x_event.type == si->xinput_DeviceButtonPress))
+ /* Ignore DeviceButtonRelease, see ButtonRelease comment above. */
+ {
+
+ dispatch_event (si, &event.x_event);
+ if (si->demoing_p &&
+ event.x_event.type == si->xinput_DeviceMotionNotify)
+ /* When we're demoing a single hack, mouse motion doesn't
+ cause deactivation. Only clicks and keypresses do. */
+ ;
+ else
+ /* If we're not demoing, then any activity causes deactivation.
+ */
+ {
+ why = (event.x_event.type == si->xinput_DeviceMotionNotify
+ ? "XI mouse motion" :
+ event.x_event.type == si->xinput_DeviceButtonPress
+ ? "XI mouse click" : "unknown XINPUT event");
+ goto DONE;
+ }
+ }
+ else
+#endif /* HAVE_XINPUT */
+
+#ifdef HAVE_RANDR
+ if (si->using_randr_extension &&
+ (event.x_event.type ==
+ (si->randr_event_number + RRScreenChangeNotify)))
+ {
+ /* The Resize and Rotate extension sends an event when the
+ size, rotation, or refresh rate of any screen has changed.
+ */
+ if (p->verbose_p)
+ {
+ /* XRRRootToScreen is in Xrandr.h 1.4, 2001/06/07 */
+ int screen = XRRRootToScreen (si->dpy, event.xrr_event.window);
+ fprintf (stderr, "%s: %d: screen change event received\n",
+ blurb(), screen);
+ }
+
+# ifdef RRScreenChangeNotifyMask
+ /* Inform Xlib that it's ok to update its data structures. */
+ XRRUpdateConfiguration (&event.x_event); /* Xrandr.h 1.9, 2002/09/29 */
+# endif /* RRScreenChangeNotifyMask */
+
+ /* Resize the existing xscreensaver windows and cached ssi data. */
+ if (update_screen_layout (si))
+ {
+ if (p->verbose_p)
+ {
+ fprintf (stderr, "%s: new layout:\n", blurb());
+ describe_monitor_layout (si);
+ }
+ resize_screensaver_window (si);
+ }
+ }
+ else
+#endif /* HAVE_RANDR */
+
+ /* Just some random event. Let the Widgets handle it, if desired. */
+ dispatch_event (si, &event.x_event);
+ }
+ }
+ DONE:
+
+ if (p->verbose_p)
+ {
+ if (! why) why = "unknown reason";
+ fprintf (stderr, "%s: %s (%s)\n", blurb(),
+ (until_idle_p ? "user is idle" : "user is active"),
+ why);
+ }
+
+ /* If there's a user event on the queue, swallow it.
+ If we're using a server extension, and the user becomes active, we
+ get the extension event before the user event -- so the keypress or
+ motion or whatever is still on the queue. This makes "unfade" not
+ work, because it sees that event, and bugs out. (This problem
+ doesn't exhibit itself without an extension, because in that case,
+ there's only one event generated by user activity, not two.)
+ */
+ if (!until_idle_p && si->locked_p)
+ swallow_unlock_typeahead_events (si, &event.x_event);
+ else
+ while (XCheckMaskEvent (si->dpy,
+ (KeyPressMask|ButtonPressMask|PointerMotionMask),
+ &event.x_event))
+ ;
+
+
+ if (si->check_pointer_timer_id)
+ {
+ XtRemoveTimeOut (si->check_pointer_timer_id);
+ si->check_pointer_timer_id = 0;
+ }
+ if (si->timer_id)
+ {
+ XtRemoveTimeOut (si->timer_id);
+ si->timer_id = 0;
+ }
+
+ if (until_idle_p && si->cycle_id) /* no cycle timer when inactive */
+ abort ();
+}
+
+
+
+/* Some crap for dealing with /proc/interrupts.
+
+ On Linux systems, it's possible to see the hardware interrupt count
+ associated with the keyboard. We can therefore use that as another method
+ of detecting idleness.
+
+ Why is it a good idea to do this? Because it lets us detect keyboard
+ activity that is not associated with X events. For example, if the user
+ has switched to another virtual console, it's good for xscreensaver to not
+ be running graphics hacks on the (non-visible) X display. The common
+ complaint that checking /proc/interrupts addresses is that the user is
+ playing Quake on a non-X console, and the GL hacks are perceptibly slowing
+ the game...
+
+ This is tricky for a number of reasons.
+
+ * First, we must be sure to only do this when running on an X server that
+ is on the local machine (because otherwise, we'd be reacting to the
+ wrong keyboard.) The way we do this is by noting that the $DISPLAY is
+ pointing to display 0 on the local machine. It *could* be that display
+ 1 is also on the local machine (e.g., two X servers, each on a different
+ virtual-terminal) but it's also possible that screen 1 is an X terminal,
+ using this machine as the host. So we can't take that chance.
+
+ * Second, one can only access these interrupt numbers in a completely
+ and utterly brain-damaged way. You would think that one would use an
+ ioctl for this. But no. The ONLY way to get this information is to
+ open the pseudo-file /proc/interrupts AS A FILE, and read the numbers
+ out of it TEXTUALLY. Because this is Unix, and all the world's a file,
+ and the only real data type is the short-line sequence of ASCII bytes.
+
+ Now it's all well and good that the /proc/interrupts pseudo-file
+ exists; that's a clever idea, and a useful API for things that are
+ already textually oriented, like shell scripts, and users doing
+ interactive debugging sessions. But to make a *C PROGRAM* open a file
+ and parse the textual representation of integers out of it is just
+ insane.
+
+ * Third, you can't just hold the file open, and fseek() back to the
+ beginning to get updated data! If you do that, the data never changes.
+ And I don't want to call open() every five seconds, because I don't want
+ to risk going to disk for any inodes. It turns out that if you dup()
+ it early, then each copy gets fresh data, so we can get around that in
+ this way (but for how many releases, one might wonder?)
+
+ * Fourth, the format of the output of the /proc/interrupts file is
+ undocumented, and has changed several times already! In Linux 2.0.33,
+ even on a multiprocessor machine, it looks like this:
+
+ 0: 309453991 timer
+ 1: 4771729 keyboard
+
+ but in Linux 2.2 and 2.4 kernels with MP machines, it looks like this:
+
+ CPU0 CPU1
+ 0: 1671450 1672618 IO-APIC-edge timer
+ 1: 13037 13495 IO-APIC-edge keyboard
+
+ and in Linux 2.6, it's gotten even goofier: now there are two lines
+ labelled "i8042". One of them is the keyboard, and one of them is
+ the PS/2 mouse -- and of course, you can't tell them apart, except
+ by wiggling the mouse and noting which one changes:
+
+ CPU0 CPU1
+ 1: 32051 30864 IO-APIC-edge i8042
+ 12: 476577 479913 IO-APIC-edge i8042
+
+ Joy! So how are we expected to parse that? Well, this code doesn't
+ parse it: it saves the first line with the string "keyboard" (or
+ "i8042") in it, and does a string-comparison to note when it has
+ changed. If there are two "i8042" lines, we assume the first is
+ the keyboard and the second is the mouse (doesn't matter which is
+ which, really, as long as we don't compare them against each other.)
+
+ Thanks to Nat Friedman <nat@nat.org> for figuring out most of this crap.
+
+ Note that if you have a serial or USB mouse, or a USB keyboard, it won't
+ detect it. That's because there's no way to tell the difference between a
+ serial mouse and a general serial port, and all USB devices look the same
+ from here. It would be somewhat unfortunate to have the screensaver turn
+ off when the modem on COM1 burped, or when a USB disk was accessed.
+ */
+
+
+#ifdef HAVE_PROC_INTERRUPTS
+
+#define PROC_INTERRUPTS "/proc/interrupts"
+
+Bool
+query_proc_interrupts_available (saver_info *si, const char **why)
+{
+ /* We can use /proc/interrupts if $DISPLAY points to :0, and if the
+ "/proc/interrupts" file exists and is readable.
+ */
+ FILE *f;
+ if (why) *why = 0;
+
+ if (!display_is_on_console_p (si))
+ {
+ if (why) *why = "not on primary console";
+ return False;
+ }
+
+ f = fopen (PROC_INTERRUPTS, "r");
+ if (!f)
+ {
+ if (why) *why = "does not exist";
+ return False;
+ }
+
+ fclose (f);
+ return True;
+}
+
+
+static Bool
+proc_interrupts_activity_p (saver_info *si)
+{
+ static FILE *f0 = 0;
+ FILE *f1 = 0;
+ int fd;
+ static char last_kbd_line[255] = { 0, };
+ static char last_ptr_line[255] = { 0, };
+ char new_line[sizeof(last_kbd_line)];
+ Bool checked_kbd = False, kbd_changed = False;
+ Bool checked_ptr = False, ptr_changed = False;
+ int i8042_count = 0;
+
+ if (!f0)
+ {
+ /* First time -- open the file. */
+ f0 = fopen (PROC_INTERRUPTS, "r");
+ if (!f0)
+ {
+ char buf[255];
+ sprintf(buf, "%s: error opening %s", blurb(), PROC_INTERRUPTS);
+ perror (buf);
+ goto FAIL;
+ }
+
+# if defined(HAVE_FCNTL) && defined(FD_CLOEXEC)
+ /* Close this fd upon exec instead of inheriting / leaking it. */
+ if (fcntl (fileno (f0), F_SETFD, FD_CLOEXEC) != 0)
+ perror ("fcntl: CLOEXEC:");
+# endif
+ }
+
+ if (f0 == (FILE *) -1) /* means we got an error initializing. */
+ return False;
+
+ fd = dup (fileno (f0));
+ if (fd < 0)
+ {
+ char buf[255];
+ sprintf(buf, "%s: could not dup() the %s fd", blurb(), PROC_INTERRUPTS);
+ perror (buf);
+ goto FAIL;
+ }
+
+ f1 = fdopen (fd, "r");
+ if (!f1)
+ {
+ char buf[255];
+ sprintf(buf, "%s: could not fdopen() the %s fd", blurb(),
+ PROC_INTERRUPTS);
+ perror (buf);
+ goto FAIL;
+ }
+
+ /* Actually, I'm unclear on why this fseek() is necessary, given the timing
+ of the dup() above, but it is. */
+ if (fseek (f1, 0, SEEK_SET) != 0)
+ {
+ char buf[255];
+ sprintf(buf, "%s: error rewinding %s", blurb(), PROC_INTERRUPTS);
+ perror (buf);
+ goto FAIL;
+ }
+
+ /* Now read through the pseudo-file until we find the "keyboard",
+ "PS/2 mouse", or "i8042" lines. */
+
+ while (fgets (new_line, sizeof(new_line)-1, f1))
+ {
+ Bool i8042_p = !!strstr (new_line, "i8042");
+ if (i8042_p) i8042_count++;
+
+ if (strchr (new_line, ','))
+ {
+ /* Ignore any line that has a comma on it: this is because
+ a setup like this:
+
+ 12: 930935 XT-PIC usb-uhci, PS/2 Mouse
+
+ is really bad news. It *looks* like we can note mouse
+ activity from that line, but really, that interrupt gets
+ fired any time any USB device has activity! So we have
+ to ignore any shared IRQs.
+ */
+ }
+ else if (!checked_kbd &&
+ (strstr (new_line, "keyboard") ||
+ (i8042_p && i8042_count == 1)))
+ {
+ /* Assume the keyboard interrupt is the line that says "keyboard",
+ or the *first* line that says "i8042".
+ */
+ kbd_changed = (*last_kbd_line && !!strcmp (new_line, last_kbd_line));
+ strcpy (last_kbd_line, new_line);
+ checked_kbd = True;
+ }
+ else if (!checked_ptr &&
+ (strstr (new_line, "PS/2 Mouse") ||
+ (i8042_p && i8042_count == 2)))
+ {
+ /* Assume the mouse interrupt is the line that says "PS/2 mouse",
+ or the *second* line that says "i8042".
+ */
+ ptr_changed = (*last_ptr_line && !!strcmp (new_line, last_ptr_line));
+ strcpy (last_ptr_line, new_line);
+ checked_ptr = True;
+ }
+
+ if (checked_kbd && checked_ptr)
+ break;
+ }
+
+ if (checked_kbd || checked_ptr)
+ {
+ fclose (f1);
+
+ if (si->prefs.debug_p && (kbd_changed || ptr_changed))
+ fprintf (stderr, "%s: /proc/interrupts activity: %s\n",
+ blurb(),
+ ((kbd_changed && ptr_changed) ? "mouse and kbd" :
+ kbd_changed ? "kbd" :
+ ptr_changed ? "mouse" : "ERR"));
+
+ return (kbd_changed || ptr_changed);
+ }
+
+
+ /* If we got here, we didn't find either a "keyboard" or a "PS/2 Mouse"
+ line in the file at all. */
+ fprintf (stderr, "%s: no keyboard or mouse data in %s?\n",
+ blurb(), PROC_INTERRUPTS);
+
+ FAIL:
+ if (f1)
+ fclose (f1);
+
+ if (f0 && f0 != (FILE *) -1)
+ fclose (f0);
+
+ f0 = (FILE *) -1;
+ return False;
+}
+
+#endif /* HAVE_PROC_INTERRUPTS */
+
+
+/* This timer goes off every few minutes, whether the user is idle or not,
+ to try and clean up anything that has gone wrong.
+
+ It calls disable_builtin_screensaver() so that if xset has been used,
+ or some other program (like xlock) has messed with the XSetScreenSaver()
+ settings, they will be set back to sensible values (if a server extension
+ is in use, messing with xlock can cause xscreensaver to never get a wakeup
+ event, and could cause monitor power-saving to occur, and all manner of
+ heinousness.)
+
+ If the screen is currently blanked, it raises the window, in case some
+ other window has been mapped on top of it.
+
+ If the screen is currently blanked, and there is no hack running, it
+ clears the window, in case there is an error message printed on it (we
+ don't want the error message to burn in.)
+ */
+
+static void
+watchdog_timer (XtPointer closure, XtIntervalId *id)
+{
+ saver_info *si = (saver_info *) closure;
+ saver_preferences *p = &si->prefs;
+
+ disable_builtin_screensaver (si, False);
+
+ /* If the DPMS settings on the server have changed, change them back to
+ what ~/.xscreensaver says they should be. */
+ sync_server_dpms_settings (si->dpy,
+ (p->dpms_enabled_p &&
+ p->mode != DONT_BLANK),
+ p->dpms_quickoff_p,
+ p->dpms_standby / 1000,
+ p->dpms_suspend / 1000,
+ p->dpms_off / 1000,
+ False);
+
+ if (si->screen_blanked_p)
+ {
+ Bool running_p = screenhack_running_p (si);
+
+ if (si->dbox_up_p)
+ {
+ if (si->prefs.debug_p)
+ fprintf (stderr, "%s: dialog box is up: not raising screen.\n",
+ blurb());
+ }
+ else
+ {
+ if (si->prefs.debug_p)
+ fprintf (stderr, "%s: watchdog timer raising %sscreen.\n",
+ blurb(), (running_p ? "" : "and clearing "));
+
+ raise_window (si, True, True, running_p);
+ }
+
+ if (screenhack_running_p (si) &&
+ !monitor_powered_on_p (si))
+ {
+ int i;
+ if (si->prefs.verbose_p)
+ fprintf (stderr,
+ "%s: X says monitor has powered down; "
+ "killing running hacks.\n", blurb());
+ for (i = 0; i < si->nscreens; i++)
+ kill_screenhack (&si->screens[i]);
+ }
+
+ /* Re-schedule this timer. The watchdog timer defaults to a bit less
+ than the hack cycle period, but is never longer than one hour.
+ */
+ si->watchdog_id = 0;
+ reset_watchdog_timer (si, True);
+ }
+}
+
+
+void
+reset_watchdog_timer (saver_info *si, Bool on_p)
+{
+ saver_preferences *p = &si->prefs;
+
+ if (si->watchdog_id)
+ {
+ XtRemoveTimeOut (si->watchdog_id);
+ si->watchdog_id = 0;
+ }
+
+ if (on_p && p->watchdog_timeout)
+ {
+ si->watchdog_id = XtAppAddTimeOut (si->app, p->watchdog_timeout,
+ watchdog_timer, (XtPointer) si);
+
+ if (p->debug_p)
+ fprintf (stderr, "%s: restarting watchdog_timer (%ld, %ld)\n",
+ blurb(), p->watchdog_timeout, si->watchdog_id);
+ }
+}
+
+
+/* It's possible that a race condition could have led to the saver
+ window being unexpectedly still mapped. This can happen like so:
+
+ - screen is blanked
+ - hack is launched
+ - that hack tries to grab a screen image (it does this by
+ first unmapping the saver window, then remapping it.)
+ - hack unmaps window
+ - hack waits
+ - user becomes active
+ - hack re-maps window (*)
+ - driver kills subprocess
+ - driver unmaps window (**)
+
+ The race is that (*) might have been sent to the server before
+ the client process was killed, but, due to scheduling randomness,
+ might not have been received by the server until after (**).
+ In other words, (*) and (**) might happen out of order, meaning
+ the driver will unmap the window, and then after that, the
+ recently-dead client will re-map it. This leaves the user
+ locked out (it looks like a desktop, but it's not!)
+
+ To avoid this: after un-blanking the screen, we launch a timer
+ that wakes up once a second for ten seconds, and makes damned
+ sure that the window is still unmapped.
+ */
+
+void
+de_race_timer (XtPointer closure, XtIntervalId *id)
+{
+ saver_info *si = (saver_info *) closure;
+ saver_preferences *p = &si->prefs;
+ int secs = 1;
+
+ if (id == 0) /* if id is 0, this is the initialization call. */
+ {
+ si->de_race_ticks = 10;
+ if (p->verbose_p)
+ fprintf (stderr, "%s: starting de-race timer (%d seconds.)\n",
+ blurb(), si->de_race_ticks);
+ }
+ else
+ {
+ int i;
+ XSync (si->dpy, False);
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ Window w = ssi->screensaver_window;
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (si->dpy, w, &xgwa);
+ if (xgwa.map_state != IsUnmapped)
+ {
+ if (p->verbose_p)
+ fprintf (stderr,
+ "%s: %d: client race! emergency unmap 0x%lx.\n",
+ blurb(), i, (unsigned long) w);
+ XUnmapWindow (si->dpy, w);
+ }
+ else if (p->debug_p)
+ fprintf (stderr, "%s: %d: (de-race of 0x%lx is cool.)\n",
+ blurb(), i, (unsigned long) w);
+ }
+ XSync (si->dpy, False);
+
+ si->de_race_ticks--;
+ }
+
+ if (id && *id == si->de_race_id)
+ si->de_race_id = 0;
+
+ if (si->de_race_id) abort();
+
+ if (si->de_race_ticks <= 0)
+ {
+ si->de_race_id = 0;
+ if (p->verbose_p)
+ fprintf (stderr, "%s: de-race completed.\n", blurb());
+ }
+ else
+ {
+ si->de_race_id = XtAppAddTimeOut (si->app, secs * 1000,
+ de_race_timer, closure);
+ }
+}
diff --git a/driver/types.h b/driver/types.h
new file mode 100644
index 0000000..f1630b0
--- /dev/null
+++ b/driver/types.h
@@ -0,0 +1,442 @@
+/* xscreensaver, Copyright (c) 1993-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __XSCREENSAVER_TYPES_H__
+#define __XSCREENSAVER_TYPES_H__
+
+typedef struct saver_info saver_info;
+
+typedef enum {
+ ul_read, /* reading input or ready to do so */
+ ul_success, /* auth success, unlock */
+ ul_fail, /* auth fail */
+ ul_cancel, /* user cancelled auth (pw_cancel or pw_null) */
+ ul_time, /* timed out */
+ ul_finished /* user pressed enter */
+} unlock_state;
+
+typedef struct screenhack screenhack;
+struct screenhack {
+ Bool enabled_p;
+ char *visual;
+ char *name;
+ char *command;
+};
+
+typedef enum {
+ RANDOM_HACKS, ONE_HACK, BLANK_ONLY, DONT_BLANK, RANDOM_HACKS_SAME
+} saver_mode;
+
+typedef enum {
+ TEXT_DATE, TEXT_LITERAL, TEXT_FILE, TEXT_PROGRAM, TEXT_URL
+} text_mode;
+
+struct auth_message;
+struct auth_response;
+
+typedef int (*auth_conv_cb_t) (
+ int num_msg,
+ const struct auth_message *msg,
+ struct auth_response **resp,
+ saver_info *si);
+
+typedef struct saver_preferences saver_preferences;
+typedef struct saver_screen_info saver_screen_info;
+typedef struct passwd_dialog_data passwd_dialog_data;
+typedef struct splash_dialog_data splash_dialog_data;
+typedef struct _monitor monitor;
+
+typedef struct poll_mouse_data poll_mouse_data;
+struct poll_mouse_data {
+ int root_x;
+ int root_y;
+ Window child;
+ unsigned int mask;
+ time_t time;
+};
+
+#ifdef HAVE_XINPUT
+/* XInputExtension device support */
+#include <X11/extensions/XInput.h>
+
+typedef struct xinput_dev_info xinput_dev_info;
+struct xinput_dev_info {
+ XDevice *device;
+ XEventClass press, release, valuator;
+ poll_mouse_data last_poll_mouse;
+};
+#endif
+
+/* This structure holds all the user-specified parameters, read from the
+ command line, the resource database, or entered through a dialog box.
+ */
+struct saver_preferences {
+
+ XrmDatabase db; /* The resource database into which the
+ init file is merged, and out of which the
+ preferences are parsed. */
+
+ time_t init_file_date; /* The date (from stat()) of the .xscreensaver
+ file the last time this process read or
+ wrote it. */
+
+ Bool verbose_p; /* whether to print out lots of status info */
+ Bool timestamp_p; /* whether to mark messages with a timestamp */
+ Bool capture_stderr_p; /* whether to redirect stdout/stderr */
+ Bool ignore_uninstalled_p; /* whether to avoid displaying or complaining
+ about hacks that are not on $PATH */
+ Bool debug_p; /* pay no mind to the man behind the curtain */
+ Bool xsync_p; /* whether XSynchronize has been called */
+
+ Bool lock_p; /* whether to lock as well as save */
+
+ Bool fade_p; /* whether to fade to black, if possible */
+ Bool unfade_p; /* whether to fade from black, if possible */
+ Time fade_seconds; /* how long that should take */
+ int fade_ticks; /* how many ticks should be used */
+ Bool splash_p; /* whether to do a splash screen at startup */
+
+ Bool install_cmap_p; /* whether we should use our own colormap
+ when using the screen's default visual. */
+
+# ifdef QUAD_MODE
+ Bool quad_p; /* whether to run four savers per monitor */
+# endif
+
+ screenhack **screenhacks; /* the programs to run */
+ int screenhacks_count;
+
+ saver_mode mode; /* hack-selection mode */
+ int selected_hack; /* in one_hack mode, this is the one */
+
+ int nice_inferior; /* nice value for subprocs */
+ int inferior_memory_limit; /* setrlimit(LIMIT_AS) value for subprocs */
+
+ Time initial_delay; /* how long to sleep after launch */
+ Time splash_duration; /* how long the splash screen stays up */
+ Time timeout; /* how much idle time before activation */
+ Time lock_timeout; /* how long after activation locking starts */
+ Time cycle; /* how long each hack should run */
+ Time passwd_timeout; /* how much time before pw dialog goes down */
+ Time pointer_timeout; /* how often to check mouse position */
+ Time notice_events_timeout; /* how long after window creation to select */
+ Time watchdog_timeout; /* how often to re-raise and re-blank screen */
+ int pointer_hysteresis; /* mouse motions less than N/sec are ignored */
+
+ Bool dpms_enabled_p; /* Whether to power down the monitor */
+ Bool dpms_quickoff_p; /* Whether to power down monitor immediately
+ in "Blank Only" mode */
+ Time dpms_standby; /* how long until monitor goes black */
+ Time dpms_suspend; /* how long until monitor power-saves */
+ Time dpms_off; /* how long until monitor powers down */
+
+ Bool grab_desktop_p; /* These are not used by "xscreensaver" */
+ Bool grab_video_p; /* itself: they are used by the external */
+ Bool random_image_p; /* "xscreensaver-getimage" program, and set */
+ char *image_directory; /* by the "xscreensaver-demo" configurator. */
+
+ text_mode tmode; /* How we generate text to display. */
+ char *text_literal; /* used when tmode is TEXT_LITERAL. */
+ char *text_file; /* used when tmode is TEXT_FILE. */
+ char *text_program; /* used when tmode is TEXT_PROGRAM. */
+ char *text_url; /* used when tmode is TEXT_URL. */
+
+ Bool use_xidle_extension; /* which extension to use, if possible */
+ Bool use_mit_saver_extension;
+ Bool use_sgi_saver_extension;
+ Bool use_proc_interrupts;
+ Bool use_xinput_extension;
+
+ Bool getviewport_full_of_lies_p; /* XFree86 bug #421 */
+
+ char *shell; /* where to find /bin/sh */
+
+ char *demo_command; /* How to enter demo mode. */
+ char *prefs_command; /* How to edit preferences. */
+ char *help_url; /* Where the help document resides. */
+ char *load_url_command; /* How one loads URLs. */
+ char *new_login_command; /* Command for the "New Login" button. */
+
+ int auth_warning_slack; /* Don't warn about login failures if they
+ all happen within this many seconds of
+ a successful login. */
+};
+
+/* This structure holds all the data that applies to the program as a whole,
+ or to the non-screen-specific parts of the display connection.
+
+ The saver_preferences structure (prefs.h) holds all the user-specified
+ parameters, read from the command line, the resource database, or entered
+ through a dialog box.
+ */
+struct saver_info {
+ char *version;
+ saver_preferences prefs;
+
+ int nscreens;
+ int ssi_count;
+ saver_screen_info *screens;
+ saver_screen_info *default_screen; /* ...on which dialogs will appear. */
+ monitor **monitor_layout; /* private to screens.c */
+ Visual **best_gl_visuals; /* visuals for GL hacks on screen N */
+
+ /* =======================================================================
+ global connection info
+ ======================================================================= */
+
+ XtAppContext app;
+ Display *dpy;
+
+ /* =======================================================================
+ server extension info
+ ======================================================================= */
+
+ Bool using_xidle_extension; /* which extension is being used. */
+ Bool using_mit_saver_extension; /* Note that `p->use_*' is the *request*, */
+ Bool using_sgi_saver_extension; /* and `si->using_*' is the *reality*. */
+ Bool using_proc_interrupts;
+
+# ifdef HAVE_MIT_SAVER_EXTENSION
+ int mit_saver_ext_event_number;
+ int mit_saver_ext_error_number;
+# endif
+# ifdef HAVE_SGI_SAVER_EXTENSION
+ int sgi_saver_ext_event_number;
+ int sgi_saver_ext_error_number;
+# endif
+# ifdef HAVE_RANDR
+ int randr_event_number;
+ int randr_error_number;
+ Bool using_randr_extension;
+# endif
+
+ Bool using_xinput_extension; /* Note that `p->use_*' is the *request*, */
+ /* and `si->using_*' is the *reality*. */
+#ifdef HAVE_XINPUT
+ int xinput_ext_event_number; /* may not be used */
+ int xinput_ext_error_number;
+ int xinput_DeviceButtonPress; /* Extension device event codes. */
+ int xinput_DeviceButtonRelease; /* Assigned by server at runtime */
+ int xinput_DeviceMotionNotify;
+ xinput_dev_info *xinput_devices;
+ int num_xinput_devices;
+# endif
+
+ /* =======================================================================
+ blanking
+ ======================================================================= */
+
+ Bool screen_blanked_p; /* Whether the saver is currently active. */
+ Window mouse_grab_window; /* Window holding our mouse grab */
+ Window keyboard_grab_window; /* Window holding our keyboard grab */
+ int mouse_grab_screen; /* The screen number the mouse grab is on */
+ int keyboard_grab_screen; /* The screen number the keyboard grab is on */
+ Bool fading_possible_p; /* Whether fading to/from black is possible. */
+ Bool throttled_p; /* Whether we should temporarily just blank
+ the screen, not run hacks. (Deprecated:
+ users should use "xset dpms force off"
+ instead.) */
+ time_t blank_time; /* The time at which the screen was blanked
+ (if currently blanked) or unblanked (if
+ not blanked.) */
+
+
+ /* =======================================================================
+ locking and runtime privileges
+ ======================================================================= */
+
+ Bool locked_p; /* Whether the screen is currently locked. */
+ Bool dbox_up_p; /* Whether the demo-mode or passwd dialogs
+ are currently visible */
+
+ Bool locking_disabled_p; /* Sometimes locking is impossible. */
+ char *nolock_reason; /* This is why. */
+
+ char *orig_uid; /* What uid/gid we had at startup, before
+ discarding privileges. */
+ char *uid_message; /* Any diagnostics from our attempt to
+ discard privileges (printed only in
+ -verbose mode.) */
+ Bool dangerous_uid_p; /* Set to true if we're running as a user id
+ which is known to not be a normal, non-
+ privileged user. */
+
+ Window passwd_dialog; /* The password dialog, if it's up. */
+ passwd_dialog_data *pw_data; /* Other info necessary to draw it. */
+
+ int unlock_failures; /* Counts failed login attempts while the
+ screen is locked. */
+ time_t unlock_failure_time; /* Time of first failed login attempt. */
+
+ char *unlock_typeahead; /* If the screen is locked, and the user types
+ a character, we assume that it is the first
+ character of the password. It's stored here
+ for the password dialog to use to populate
+ itself. */
+
+ char *user; /* The user whose session is locked. */
+ char *cached_passwd; /* Cached password, used to avoid multiple
+ prompts for password-only auth mechanisms.*/
+ unlock_state unlock_state;
+
+ auth_conv_cb_t unlock_cb; /* The function used to prompt for creds. */
+ void (*auth_finished_cb) (saver_info *si);
+ /* Called when authentication has finished,
+ regardless of success or failure.
+ May be NULL. */
+
+
+ /* =======================================================================
+ demoing
+ ======================================================================= */
+
+ Bool demoing_p; /* Whether we are demoing a single hack
+ (without UI.) */
+
+ Window splash_dialog; /* The splash dialog, if its up. */
+ splash_dialog_data *sp_data; /* Other info necessary to draw it. */
+
+
+ /* =======================================================================
+ timers
+ ======================================================================= */
+
+ XtIntervalId lock_id; /* Timer to implement `prefs.lock_timeout' */
+ XtIntervalId cycle_id; /* Timer to implement `prefs.cycle' */
+ XtIntervalId timer_id; /* Timer to implement `prefs.timeout' */
+ XtIntervalId watchdog_id; /* Timer to implement `prefs.watchdog */
+ XtIntervalId check_pointer_timer_id; /* `prefs.pointer_timeout' */
+
+ XtIntervalId de_race_id; /* Timer to make sure screen un-blanks */
+ int de_race_ticks;
+
+ time_t last_activity_time; /* Used only when no server exts. */
+ time_t last_wall_clock_time; /* Used to detect laptop suspend. */
+ saver_screen_info *last_activity_screen;
+
+ Bool emergency_lock_p; /* Set when the wall clock has jumped
+ (presumably due to laptop suspend) and we
+ need to lock down right away instead of
+ waiting for the lock timer to go off. */
+
+
+ /* =======================================================================
+ remote control
+ ======================================================================= */
+
+ int selection_mode; /* Set to -1 if the NEXT ClientMessage has just
+ been received; set to -2 if PREV has just
+ been received; set to N if SELECT or DEMO N
+ has been received. (This is kind of nasty.)
+ */
+
+ /* =======================================================================
+ subprocs
+ ======================================================================= */
+
+ XtIntervalId stderr_popup_timer;
+
+};
+
+/* This structure holds all the data that applies to the screen-specific parts
+ of the display connection; if the display has multiple screens, there will
+ be one of these for each screen.
+ */
+struct saver_screen_info {
+ saver_info *global;
+
+ int number; /* The internal ordinal of this screen,
+ counting Xinerama rectangles as separate
+ screens. */
+ int real_screen_number; /* The number of the underlying X screen on
+ which this rectangle lies. */
+ Screen *screen; /* The X screen in question. */
+
+ int x, y, width, height; /* The size and position of this rectangle
+ on its underlying X screen. */
+
+ Bool real_screen_p; /* This will be true of exactly one ssi per
+ X screen. */
+
+ Widget toplevel_shell;
+
+ /* =======================================================================
+ blanking
+ ======================================================================= */
+
+ Window screensaver_window; /* The window that will impersonate the root,
+ when the screensaver activates. Note that
+ the window stored here may change, as we
+ destroy and recreate it on different
+ visuals. */
+ Colormap cmap; /* The colormap that goes with the window. */
+ Bool install_cmap_p; /* Whether this screen should have its own
+ colormap installed, for whichever of several
+ reasons. This is definitive (even a false
+ value here overrides prefs->install_cmap_p.)
+ */
+ Visual *current_visual; /* The visual of the window. */
+ int current_depth; /* How deep the visual (and the window) are. */
+
+ Visual *default_visual; /* visual to use when none other specified */
+
+ Window real_vroot; /* The original virtual-root window. */
+ Window real_vroot_value; /* What was in the __SWM_VROOT property. */
+
+ Cursor cursor; /* A blank cursor that goes with the
+ real root window. */
+ unsigned long black_pixel; /* Black, allocated from `cmap'. */
+
+ int blank_vp_x, blank_vp_y; /* Where the virtual-scrolling viewport was
+ when the screen went blank. We need to
+ prevent the X server from letting the mouse
+ bump the edges to scroll while the screen
+ is locked, so we reset to this when it has
+ moved, and the lock dialog is up... */
+
+# ifdef HAVE_MIT_SAVER_EXTENSION
+ Window server_mit_saver_window;
+# endif
+
+
+ /* =======================================================================
+ demoing
+ ======================================================================= */
+
+ Colormap demo_cmap; /* The colormap that goes with the dialogs:
+ this might be the same as `cmap' so care
+ must be taken not to free it while it's
+ still in use. */
+
+ /* =======================================================================
+ timers
+ ======================================================================= */
+
+ poll_mouse_data last_poll_mouse; /* Used only when no server exts. */
+
+ /* =======================================================================
+ subprocs
+ ======================================================================= */
+
+ int current_hack; /* Index into `prefs.screenhacks' */
+ pid_t pid;
+
+ int stderr_text_x;
+ int stderr_text_y;
+ int stderr_line_height;
+ XFontStruct *stderr_font;
+ GC stderr_gc;
+ Window stderr_overlay_window; /* Used if the server has overlay planes */
+ Colormap stderr_cmap;
+};
+
+
+#endif /* __XSCREENSAVER_TYPES_H__ */
diff --git a/driver/vms-getpwnam.c b/driver/vms-getpwnam.c
new file mode 100644
index 0000000..ec0650c
--- /dev/null
+++ b/driver/vms-getpwnam.c
@@ -0,0 +1,129 @@
+/*
+ * getpwnam(name) - retrieves a UAF entry
+ *
+ * Author: Patrick L. Mahan
+ * Location: TGV, Inc
+ * Date: 15-Nov-1991
+ *
+ * Purpose: Provides emulation for the UNIX getpwname routine.
+ *
+ * Modification History
+ *
+ * Date | Who | Version | Reason
+ * ------------+-----------+---------------+---------------------------
+ * 15-Nov-1991 | PLM | 1.0 | First Write
+ */
+
+#define PASSWDROUTINES
+
+#include <stdio.h>
+#include <descrip.h>
+#include <uaidef.h>
+#include <string.h>
+#include <stdlib.h>
+#include <starlet.h>
+#include "vms-pwd.h"
+
+struct uic {
+ unsigned short uid;
+ unsigned short gid;
+};
+
+#define TEST(ptr, str) { if (ptr == NULL) { \
+ fprintf(stderr, "getpwnam: memory allocation failure for \"%s\"\n", \
+ str); \
+ return ((struct passwd *)(NULL)); \
+ } }
+
+struct passwd *getpwnam(name)
+char *name;
+{
+ int istatus;
+ int UserNameLen;
+ int UserOwnerLen;
+ int UserDeviceLen;
+ int UserDirLen;
+ static char UserName[13];
+ static char UserOwner[32];
+ static char UserDevice[32];
+ static char UserDir[64];
+ char *cptr, *sptr;
+ unsigned long int UserPwd[2];
+ unsigned short int UserSalt;
+ unsigned long int UserEncrypt;
+ struct uic UicValue;
+ struct passwd *entry;
+
+ struct dsc$descriptor_s VMSNAME =
+ {strlen(name), DSC$K_DTYPE_T, DSC$K_CLASS_S, name};
+
+ struct itmlist3 {
+ unsigned short int length;
+ unsigned short int item;
+ unsigned long int addr;
+ unsigned long int retaddr;
+ } ItemList[] = {
+ {12, UAI$_USERNAME, (unsigned long)&UserName, (unsigned long)&UserNameLen},
+ {8, UAI$_PWD, (unsigned long)&UserPwd, 0},
+ {4, UAI$_UIC, (unsigned long)&UicValue, 0},
+ {32, UAI$_OWNER, (unsigned long)&UserOwner, (unsigned long)&UserOwnerLen},
+ {32, UAI$_DEFDEV, (unsigned long)&UserDevice, (unsigned long)&UserDeviceLen},
+ {64, UAI$_DEFDIR, (unsigned long)&UserDir, (unsigned long)&UserDirLen},
+ {2, UAI$_SALT, (unsigned long)&UserSalt, 0},
+ {4, UAI$_ENCRYPT, (unsigned long)&UserEncrypt, 0},
+ {0, 0, 0, 0}
+ };
+
+ UserNameLen = 0;
+ istatus = sys$getuai (0, 0, &VMSNAME, &ItemList, 0, 0, 0);
+
+ if (!(istatus & 1)) {
+ fprintf (stderr, "getpwnam: unable to retrieve passwd entry for %s\n",
+ name);
+ fprintf (stderr, "getpwnam: vms error number is 0x%x\n", istatus);
+ return ((struct passwd *)NULL);
+ }
+
+ entry = (struct passwd *) calloc (1, sizeof(struct passwd));
+ TEST(entry, "PASSWD_ENTRY");
+
+ entry->pw_uid = UicValue.uid;
+ entry->pw_gid = UicValue.gid;
+ entry->pw_salt = UserSalt;
+ entry->pw_encrypt = UserEncrypt;
+
+ sptr = UserName;
+ cptr = calloc (UserNameLen+1, sizeof(char));
+ TEST(cptr, "USERNAME");
+ strncpy (cptr, sptr, UserNameLen);
+ cptr[UserNameLen] = '\0';
+ entry->pw_name = cptr;
+
+ cptr = calloc(8, sizeof(char));
+ TEST(cptr, "PASSWORD");
+ memcpy(cptr, UserPwd, 8);
+ entry->pw_passwd = cptr;
+
+ sptr = UserOwner; sptr++;
+ cptr = calloc ((int)UserOwner[0]+1, sizeof(char));
+ TEST(cptr, "FULLNAME");
+ strncpy (cptr, sptr, (int)UserOwner[0]);
+ cptr[(int)UserOwner[0]] = '\0';
+ entry->pw_gecos = cptr;
+
+ cptr = calloc ((int)UserDevice[0]+(int)UserDir[0]+1, sizeof(char));
+ TEST(cptr, "HOME");
+ sptr = UserDevice; sptr++;
+ strncpy (cptr, sptr, (int)UserDevice[0]);
+ sptr = UserDir; sptr++;
+ strncat (cptr, sptr, (int)UserDir[0]);
+ cptr[(int)UserDevice[0]+(int)UserDir[0]] = '\0';
+ entry->pw_dir = cptr;
+
+ cptr = calloc (strlen("SYS$SYSTEM:LOGINOUT.EXE")+1, sizeof(char));
+ TEST(cptr,"SHELL");
+ strcpy (cptr, "SYS$SYSTEM:LOGINOUT.EXE");
+ entry->pw_shell = cptr;
+
+ return (entry);
+}
diff --git a/driver/vms-hpwd.c b/driver/vms-hpwd.c
new file mode 100644
index 0000000..707e3ea
--- /dev/null
+++ b/driver/vms-hpwd.c
@@ -0,0 +1,75 @@
+/*
+ * VAX/VMS Password hashing routines:
+ *
+ * uses the System Service SYS$HASH_PASSWORD
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ */
+
+#include <syidef.h>
+#include <descrip.h>
+#include <string.h>
+#include <starlet.h>
+/*
+ * Hashing routine
+ */
+hash_vms_password(output_buf,input_buf,input_length,username,encryption_type,salt)
+char *output_buf;
+char *input_buf;
+int input_length;
+char *username;
+int encryption_type;
+unsigned short salt;
+{
+ struct dsc$descriptor_s password;
+ struct dsc$descriptor_s user;
+
+ /*
+ * Check the VMS Version. If this is V5.4 or later, then
+ * we can use the new system service SYS$HASH_PASSWORD. Else
+ * fail and return garbage.
+ */
+
+ static char VMS_Version[32];
+ struct {
+ unsigned short int Size;
+ unsigned short int Code;
+ char *Buffer;
+ unsigned short int *Resultant_Size;
+ } Item_List[2]={32, SYI$_VERSION, VMS_Version, 0, 0, 0};
+ struct {int Size; char *Ptr;} Descr1;
+
+ /*
+ * Get the information
+ */
+ sys$getsyiw(0,0,0,Item_List,0,0,0);
+ /*
+ * Call the old routine if this isn't V5.4 or later...
+ */
+#ifndef __DECC
+ if ((VMS_Version[1] < '5') ||
+ ((VMS_Version[1] == '5') && (VMS_Version[3] < '4'))) {
+ printf("Unsupported OS version\n");
+ return(1);
+ }
+#endif /* !__DECC */
+ /*
+ * Call the SYS$HASH_PASSWORD system service...
+ */
+ password.dsc$b_dtype = DSC$K_DTYPE_T;
+ password.dsc$b_class = DSC$K_CLASS_S;
+ password.dsc$w_length = input_length;
+ password.dsc$a_pointer = input_buf;
+ user.dsc$b_dtype = DSC$K_DTYPE_T;
+ user.dsc$b_class = DSC$K_CLASS_S;
+ user.dsc$w_length = strlen(username);
+ user.dsc$a_pointer = username;
+ sys$hash_password (&password, encryption_type, salt, &user, output_buf);
+}
diff --git a/driver/vms-pwd.h b/driver/vms-pwd.h
new file mode 100644
index 0000000..6cb73d3
--- /dev/null
+++ b/driver/vms-pwd.h
@@ -0,0 +1,48 @@
+/* @(#)pwd.h 1.7 89/08/24 SMI; from S5R2 1.1 */
+
+#ifndef __pwd_h
+#define __pwd_h
+
+#ifdef vax11c
+#include <types.h>
+#else
+#include <sys/types.h>
+#endif /* vax11c */
+
+#ifdef PASSWDROUTINES
+#define EXTERN
+#else
+#define EXTERN extern
+#endif /* PASSWDROUTINES */
+
+struct passwd {
+ char *pw_name;
+ char *pw_passwd;
+ int pw_uid;
+ int pw_gid;
+ short pw_salt;
+ int pw_encrypt;
+ char *pw_age;
+ char *pw_comment;
+ char *pw_gecos;
+ char *pw_dir;
+ char *pw_shell;
+};
+
+
+#ifndef _POSIX_SOURCE
+extern struct passwd *getpwent();
+
+struct comment {
+ char *c_dept;
+ char *c_name;
+ char *c_acct;
+ char *c_bin;
+};
+
+#endif
+
+EXTERN struct passwd *getpwuid(/* uid_t uid */);
+EXTERN struct passwd *getpwnam(/* char *name */);
+
+#endif /* !__pwd_h */
diff --git a/driver/vms-validate.c b/driver/vms-validate.c
new file mode 100644
index 0000000..8f7141d
--- /dev/null
+++ b/driver/vms-validate.c
@@ -0,0 +1,75 @@
+/*
+ * validate a password for a user
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/*
+ * Includes
+ */
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+
+#include "vms-pwd.h"
+int hash_vms_password(char *output_buf,char *input_buf,int input_length,
+ char *username,int encryption_type,unsigned short salt);
+
+/*
+ *
+ * Validate a VMS UserName/Password pair.
+ *
+ */
+
+int validate_user(name,password)
+char *name;
+char *password;
+{
+ char password_buf[64];
+ char username_buf[31];
+ char encrypt_buf[8];
+ register int i;
+ register char *cp,*cp1;
+ struct passwd *user_entry;
+
+ /*
+ * Get the users UAF entry
+ */
+ user_entry = getpwnam(name);
+
+ /*
+ * If user_entry == NULL then we got a bad error
+ * return -1 to indicate a bad error
+ */
+ if (user_entry == NULL) return (-1);
+
+ /*
+ * Uppercase the password
+ */
+ cp = password;
+ cp1 = password_buf;
+ while (*cp)
+ if (islower(*cp))
+ *cp1++ = toupper(*cp++);
+ else
+ *cp1++ = *cp++;
+ /*
+ * Get the length of the password
+ */
+ i = strlen(password);
+ /*
+ * Encrypt the password
+ */
+ hash_vms_password(encrypt_buf,password_buf,i,user_entry->pw_name,
+ user_entry->pw_encrypt, user_entry->pw_salt);
+ if (memcmp(encrypt_buf,user_entry->pw_passwd,8) == 0)
+ return(1);
+ else return(0);
+}
+
diff --git a/driver/vms_axp.opt b/driver/vms_axp.opt
new file mode 100644
index 0000000..04d465d
--- /dev/null
+++ b/driver/vms_axp.opt
@@ -0,0 +1,5 @@
+[-.UTILS]UTILS.OLB_AXP/LIB
+SYS$SHARE:DECW$XMLIBSHR.EXE/SHARE
+SYS$SHARE:DECW$XMULIBSHR.EXE/SHARE
+SYS$SHARE:DECW$XTSHR.EXE/SHARE
+SYS$SHARE:DECW$XLIBSHR.EXE/SHARE
diff --git a/driver/vms_axp_12.opt b/driver/vms_axp_12.opt
new file mode 100644
index 0000000..25dd1f1
--- /dev/null
+++ b/driver/vms_axp_12.opt
@@ -0,0 +1,5 @@
+[-.UTILS]UTILS.OLB_AXP/LIB
+SYS$SHARE:DECW$XMLIBSHR12.EXE/SHARE
+SYS$SHARE:DECW$XMULIBSHRR5.EXE/SHARE
+SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE
+SYS$SHARE:DECW$XLIBSHR.EXE/SHARE
diff --git a/driver/vms_decc.opt b/driver/vms_decc.opt
new file mode 100644
index 0000000..65bec03
--- /dev/null
+++ b/driver/vms_decc.opt
@@ -0,0 +1,5 @@
+[-.UTILS]UTILS.OLB_DECC/LIB
+SYS$SHARE:DECW$XMLIBSHR.EXE/SHARE
+SYS$SHARE:DECW$XMULIBSHR.EXE/SHARE
+SYS$SHARE:DECW$XTSHR.EXE/SHARE
+SYS$SHARE:DECW$XLIBSHR.EXE/SHARE
diff --git a/driver/vms_decc_12.opt b/driver/vms_decc_12.opt
new file mode 100644
index 0000000..fdd9a80
--- /dev/null
+++ b/driver/vms_decc_12.opt
@@ -0,0 +1,5 @@
+[-.UTILS]UTILS.OLB_DECC/LIB
+SYS$SHARE:DECW$XMLIBSHR12.EXE/SHARE
+SYS$SHARE:DECW$XMULIBSHRR5.EXE/SHARE
+SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE
+SYS$SHARE:DECW$XLIBSHR.EXE/SHARE
diff --git a/driver/windows.c b/driver/windows.c
new file mode 100644
index 0000000..9b2bf84
--- /dev/null
+++ b/driver/windows.c
@@ -0,0 +1,2003 @@
+/* windows.c --- turning the screen black; dealing with visuals, virtual roots.
+ * xscreensaver, Copyright (c) 1991-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifdef VMS
+# include <unixlib.h> /* for getpid() */
+# include "vms-gtod.h" /* for gettimeofday() */
+#endif /* VMS */
+
+#ifndef VMS
+# include <pwd.h> /* for getpwuid() */
+#else /* VMS */
+# include "vms-pwd.h"
+#endif /* VMS */
+
+#ifdef HAVE_UNAME
+# include <sys/utsname.h> /* for uname() */
+#endif /* HAVE_UNAME */
+
+#include <stdio.h>
+/* #include <X11/Xproto.h> / * for CARD32 */
+#include <X11/Xlib.h>
+#include <X11/Xutil.h> /* for XSetClassHint() */
+#include <X11/Xatom.h>
+#include <X11/Xos.h> /* for time() */
+#include <signal.h> /* for the signal names */
+#include <time.h>
+#include <sys/time.h>
+
+/* You might think that to store an array of 32-bit quantities onto a
+ server-side property, you would pass an array of 32-bit data quantities
+ into XChangeProperty(). You would be wrong. You have to use an array
+ of longs, even if long is 64 bits (using 32 of each 64.)
+ */
+typedef long PROP32;
+
+#ifdef HAVE_MIT_SAVER_EXTENSION
+# include <X11/extensions/scrnsaver.h>
+#endif /* HAVE_MIT_SAVER_EXTENSION */
+
+#ifdef HAVE_XF86VMODE
+# include <X11/extensions/xf86vmode.h>
+#endif /* HAVE_XF86VMODE */
+
+#ifdef HAVE_XINERAMA
+# include <X11/extensions/Xinerama.h>
+#endif /* HAVE_XINERAMA */
+
+/* This file doesn't need the Xt headers, so stub these types out... */
+#undef XtPointer
+#define XtAppContext void*
+#define XrmDatabase void*
+#define XtIntervalId void*
+#define XtPointer void*
+#define Widget void*
+
+#include "xscreensaver.h"
+#include "visual.h"
+#include "fade.h"
+
+
+extern int kill (pid_t, int); /* signal() is in sys/signal.h... */
+
+Atom XA_VROOT, XA_XSETROOT_ID, XA_ESETROOT_PMAP_ID, XA_XROOTPMAP_ID;
+Atom XA_NET_WM_USER_TIME;
+Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_ID;
+Atom XA_SCREENSAVER_STATUS;
+
+extern saver_info *global_si_kludge; /* I hate C so much... */
+
+static void maybe_transfer_grabs (saver_screen_info *ssi,
+ Window old_w, Window new_w, int new_screen);
+
+#define ALL_POINTER_EVENTS \
+ (ButtonPressMask | ButtonReleaseMask | EnterWindowMask | \
+ LeaveWindowMask | PointerMotionMask | PointerMotionHintMask | \
+ Button1MotionMask | Button2MotionMask | Button3MotionMask | \
+ Button4MotionMask | Button5MotionMask | ButtonMotionMask)
+
+
+static const char *
+grab_string(int status)
+{
+ switch (status)
+ {
+ case GrabSuccess: return "GrabSuccess";
+ case AlreadyGrabbed: return "AlreadyGrabbed";
+ case GrabInvalidTime: return "GrabInvalidTime";
+ case GrabNotViewable: return "GrabNotViewable";
+ case GrabFrozen: return "GrabFrozen";
+ default:
+ {
+ static char foo[255];
+ sprintf(foo, "unknown status: %d", status);
+ return foo;
+ }
+ }
+}
+
+static int
+grab_kbd(saver_info *si, Window w, int screen_no)
+{
+ saver_preferences *p = &si->prefs;
+ int status = XGrabKeyboard (si->dpy, w, True,
+ /* I don't really understand Sync vs Async,
+ but these seem to work... */
+ GrabModeSync, GrabModeAsync,
+ CurrentTime);
+ if (status == GrabSuccess)
+ {
+ si->keyboard_grab_window = w;
+ si->keyboard_grab_screen = screen_no;
+ }
+
+ if (p->verbose_p)
+ fprintf(stderr, "%s: %d: grabbing keyboard on 0x%lx... %s.\n",
+ blurb(), screen_no, (unsigned long) w, grab_string(status));
+ return status;
+}
+
+
+static int
+grab_mouse (saver_info *si, Window w, Cursor cursor, int screen_no)
+{
+ saver_preferences *p = &si->prefs;
+ int status = XGrabPointer (si->dpy, w, True, ALL_POINTER_EVENTS,
+ GrabModeAsync, GrabModeAsync, w,
+ cursor, CurrentTime);
+ if (status == GrabSuccess)
+ {
+ si->mouse_grab_window = w;
+ si->mouse_grab_screen = screen_no;
+ }
+
+ if (p->verbose_p)
+ fprintf(stderr, "%s: %d: grabbing mouse on 0x%lx... %s.\n",
+ blurb(), screen_no, (unsigned long) w, grab_string(status));
+ return status;
+}
+
+
+static void
+ungrab_kbd(saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+ XUngrabKeyboard(si->dpy, CurrentTime);
+ if (p->verbose_p)
+ fprintf(stderr, "%s: %d: ungrabbing keyboard (was 0x%lx).\n",
+ blurb(), si->keyboard_grab_screen,
+ (unsigned long) si->keyboard_grab_window);
+ si->keyboard_grab_window = 0;
+}
+
+
+static void
+ungrab_mouse(saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+ XUngrabPointer(si->dpy, CurrentTime);
+ if (p->verbose_p)
+ fprintf(stderr, "%s: %d: ungrabbing mouse (was 0x%lx).\n",
+ blurb(), si->mouse_grab_screen,
+ (unsigned long) si->mouse_grab_window);
+ si->mouse_grab_window = 0;
+}
+
+
+/* Apparently there is this program called "rdesktop" which is a windows
+ terminal server client for Unix. It would seem that this program holds
+ the keyboard GRABBED the whole time it has focus! This is, of course,
+ completely idiotic: the whole point of grabbing is to get events when
+ you do *not* have focus, so grabbing *only when* you have focus is
+ completely redundant -- unless your goal is to make xscreensaver not
+ able to ever lock the screen when your program is running.
+
+ If xscreensaver blanks while rdesktop still has a keyboard grab, then
+ when we try to prompt for the password, we won't get the characters:
+ they'll be typed into rdesktop.
+
+ Perhaps rdesktop will release its keyboard grab if it loses focus?
+ What the hell, let's give it a try. If we fail to grab the keyboard
+ four times in a row, we forcibly set focus to "None" and try four
+ more times. (We don't touch focus unless we're already having a hard
+ time getting a grab.)
+ */
+static void
+nuke_focus (saver_info *si, int screen_no)
+{
+ saver_preferences *p = &si->prefs;
+ Window focus = 0;
+ int rev = 0;
+
+ XGetInputFocus (si->dpy, &focus, &rev);
+
+ if (p->verbose_p)
+ {
+ char w[255], r[255];
+
+ if (focus == PointerRoot) strcpy (w, "PointerRoot");
+ else if (focus == None) strcpy (w, "None");
+ else sprintf (w, "0x%lx", (unsigned long) focus);
+
+ if (rev == RevertToParent) strcpy (r, "RevertToParent");
+ else if (rev == RevertToPointerRoot) strcpy (r, "RevertToPointerRoot");
+ else if (rev == RevertToNone) strcpy (r, "RevertToNone");
+ else sprintf (r, "0x%x", rev);
+
+ fprintf (stderr, "%s: %d: removing focus from %s / %s.\n",
+ blurb(), screen_no, w, r);
+ }
+
+ XSetInputFocus (si->dpy, None, RevertToNone, CurrentTime);
+ XSync (si->dpy, False);
+}
+
+
+static void
+ungrab_keyboard_and_mouse (saver_info *si)
+{
+ ungrab_mouse (si);
+ ungrab_kbd (si);
+}
+
+
+static Bool
+grab_keyboard_and_mouse (saver_info *si, Window window, Cursor cursor,
+ int screen_no)
+{
+ Status mstatus = 0, kstatus = 0;
+ int i;
+ int retries = 4;
+ Bool focus_fuckus = False;
+
+ AGAIN:
+
+ for (i = 0; i < retries; i++)
+ {
+ XSync (si->dpy, False);
+ kstatus = grab_kbd (si, window, screen_no);
+ if (kstatus == GrabSuccess)
+ break;
+
+ /* else, wait a second and try to grab again. */
+ sleep (1);
+ }
+
+ if (kstatus != GrabSuccess)
+ {
+ fprintf (stderr, "%s: couldn't grab keyboard! (%s)\n",
+ blurb(), grab_string(kstatus));
+
+ if (! focus_fuckus)
+ {
+ focus_fuckus = True;
+ nuke_focus (si, screen_no);
+ goto AGAIN;
+ }
+ }
+
+ for (i = 0; i < retries; i++)
+ {
+ XSync (si->dpy, False);
+ mstatus = grab_mouse (si, window, cursor, screen_no);
+ if (mstatus == GrabSuccess)
+ break;
+
+ /* else, wait a second and try to grab again. */
+ sleep (1);
+ }
+
+ if (mstatus != GrabSuccess)
+ fprintf (stderr, "%s: couldn't grab pointer! (%s)\n",
+ blurb(), grab_string(mstatus));
+
+
+ /* When should we allow blanking to proceed? The current theory
+ is that a keyboard grab is mandatory; a mouse grab is optional.
+
+ - If we don't have a keyboard grab, then we won't be able to
+ read a password to unlock, so the kbd grab is mandatory.
+ (We can't conditionalize this on locked_p, because someone
+ might run "xscreensaver-command -lock" at any time.)
+
+ - If we don't have a mouse grab, then we might not see mouse
+ clicks as a signal to unblank -- but we will still see kbd
+ activity, so that's not a disaster.
+
+ It has been suggested that we should allow blanking if locking
+ is disabled, and we have a mouse grab but no keyboard grab
+ (that is: kstatus != GrabSuccess &&
+ mstatus == GrabSuccess &&
+ si->locking_disabled_p)
+ That would allow screen blanking (but not locking) while the gdm
+ login screen had the keyboard grabbed, but one would have to use
+ the mouse to unblank. Keyboard characters would go to the gdm
+ login field without unblanking. I have not made this change
+ because I'm not completely convinced it is a safe thing to do.
+ */
+
+ if (kstatus != GrabSuccess) /* Do not blank without a kbd grab. */
+ {
+ /* If we didn't get both grabs, release the one we did get. */
+ ungrab_keyboard_and_mouse (si);
+ return False;
+ }
+
+ return True; /* Grab is good, go ahead and blank. */
+}
+
+
+int
+move_mouse_grab (saver_info *si, Window to, Cursor cursor, int to_screen_no)
+{
+ Window old = si->mouse_grab_window;
+
+ if (old == 0)
+ return grab_mouse (si, to, cursor, to_screen_no);
+ else
+ {
+ saver_preferences *p = &si->prefs;
+ int status;
+
+ XSync (si->dpy, False);
+ XGrabServer (si->dpy); /* ############ DANGER! */
+ XSync (si->dpy, False);
+
+ if (p->verbose_p)
+ fprintf(stderr, "%s: grabbing server...\n", blurb());
+
+ ungrab_mouse (si);
+ status = grab_mouse (si, to, cursor, to_screen_no);
+
+ if (status != GrabSuccess) /* Augh! */
+ {
+ sleep (1); /* Note dramatic evil of sleeping
+ with server grabbed. */
+ XSync (si->dpy, False);
+ status = grab_mouse (si, to, cursor, to_screen_no);
+ }
+
+ if (status != GrabSuccess) /* Augh! Try to get the old one back... */
+ grab_mouse (si, old, cursor, to_screen_no);
+
+ XUngrabServer (si->dpy);
+ XSync (si->dpy, False); /* ###### (danger over) */
+
+ if (p->verbose_p)
+ fprintf(stderr, "%s: ungrabbing server.\n", blurb());
+
+ return status;
+ }
+}
+
+
+/* Prints an error message to stderr and returns True if there is another
+ xscreensaver running already. Silently returns False otherwise. */
+Bool
+ensure_no_screensaver_running (Display *dpy, Screen *screen)
+{
+ Bool status = 0;
+ int i;
+ Window root = RootWindowOfScreen (screen);
+ Window root2, parent, *kids;
+ unsigned int nkids;
+ XErrorHandler old_handler = XSetErrorHandler (BadWindow_ehandler);
+
+ if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids))
+ abort ();
+ if (root != root2)
+ abort ();
+ if (parent)
+ abort ();
+ for (i = 0; i < nkids; i++)
+ {
+ Atom type;
+ int format;
+ unsigned long nitems, bytesafter;
+ unsigned char *version;
+
+ if (XGetWindowProperty (dpy, kids[i], XA_SCREENSAVER_VERSION, 0, 1,
+ False, XA_STRING, &type, &format, &nitems,
+ &bytesafter, &version)
+ == Success
+ && type != None)
+ {
+ unsigned char *id;
+ if (XGetWindowProperty (dpy, kids[i], XA_SCREENSAVER_ID, 0, 512,
+ False, XA_STRING, &type, &format, &nitems,
+ &bytesafter, &id)
+ != Success
+ || type == None)
+ id = (unsigned char *) "???";
+
+ fprintf (stderr,
+ "%s: already running on display %s (window 0x%x)\n from process %s.\n",
+ blurb(), DisplayString (dpy), (int) kids [i],
+ (char *) id);
+ status = True;
+ }
+
+ else if (XGetWindowProperty (dpy, kids[i], XA_WM_COMMAND, 0, 128,
+ False, XA_STRING, &type, &format, &nitems,
+ &bytesafter, &version)
+ == Success
+ && type != None
+ && !strcmp ((char *) version, "gnome-screensaver"))
+ {
+ fprintf (stderr,
+ "%s: \"%s\" is already running on display %s (window 0x%x)\n",
+ blurb(), (char *) version,
+ DisplayString (dpy), (int) kids [i]);
+ status = True;
+ break;
+ }
+ }
+
+ if (kids) XFree ((char *) kids);
+ XSync (dpy, False);
+ XSetErrorHandler (old_handler);
+ return status;
+}
+
+
+
+/* Virtual-root hackery */
+
+#ifdef _VROOT_H_
+ERROR! You must not include vroot.h in this file.
+#endif
+
+static void
+store_vroot_property (Display *dpy, Window win, Window value)
+{
+#if 0
+ if (p->verbose_p)
+ fprintf (stderr,
+ "%s: storing XA_VROOT = 0x%x (%s) = 0x%x (%s)\n", blurb(),
+ win,
+ (win == screensaver_window ? "ScreenSaver" :
+ (win == real_vroot ? "VRoot" :
+ (win == real_vroot_value ? "Vroot_value" : "???"))),
+ value,
+ (value == screensaver_window ? "ScreenSaver" :
+ (value == real_vroot ? "VRoot" :
+ (value == real_vroot_value ? "Vroot_value" : "???"))));
+#endif
+ XChangeProperty (dpy, win, XA_VROOT, XA_WINDOW, 32, PropModeReplace,
+ (unsigned char *) &value, 1);
+}
+
+static void
+remove_vroot_property (Display *dpy, Window win)
+{
+#if 0
+ if (p->verbose_p)
+ fprintf (stderr, "%s: removing XA_VROOT from 0x%x (%s)\n", blurb(), win,
+ (win == screensaver_window ? "ScreenSaver" :
+ (win == real_vroot ? "VRoot" :
+ (win == real_vroot_value ? "Vroot_value" : "???"))));
+#endif
+ XDeleteProperty (dpy, win, XA_VROOT);
+}
+
+
+static Bool safe_XKillClient (Display *dpy, XID id);
+
+static void
+kill_xsetroot_data_1 (Display *dpy, Window window,
+ Atom prop, const char *atom_name,
+ Bool verbose_p)
+{
+ Atom type;
+ int format;
+ unsigned long nitems, bytesafter;
+ unsigned char *dataP = 0;
+
+ /* If the user has been using xv or xsetroot as a screensaver (to display
+ an image on the screensaver window, as a kind of slideshow) then the
+ pixmap and its associated color cells have been put in RetainPermanent
+ CloseDown mode. Since we're not destroying the xscreensaver window,
+ but merely unmapping it, we need to free these resources or those
+ colormap cells will stay allocated while the screensaver is off. (We
+ could just delete the screensaver window and recreate it later, but
+ that could cause other problems.) This code does an atomic read-and-
+ delete of the _XSETROOT_ID property, and if it held a pixmap, then we
+ cause the RetainPermanent resources of the client which created it
+ (and which no longer exists) to be freed.
+
+ Update: it seems that Gnome and KDE do this same trick, but with the
+ properties "ESETROOT_PMAP_ID" and/or "_XROOTPMAP_ID" instead of
+ "_XSETROOT_ID". So, we'll kill those too.
+ */
+ if (XGetWindowProperty (dpy, window, prop, 0, 1,
+ True, AnyPropertyType, &type, &format, &nitems,
+ &bytesafter, &dataP)
+ == Success
+ && type != None)
+ {
+ Pixmap *pixP = (Pixmap *) dataP;
+ if (pixP && *pixP && type == XA_PIXMAP && format == 32 &&
+ nitems == 1 && bytesafter == 0)
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: destroying %s data (0x%lX).\n",
+ blurb(), atom_name, *pixP);
+ safe_XKillClient (dpy, *pixP);
+ }
+ else
+ fprintf (stderr,
+ "%s: deleted unrecognised %s property: \n"
+ "\t%lu, %lu; type: %lu, format: %d, "
+ "nitems: %lu, bytesafter %ld\n",
+ blurb(), atom_name,
+ (unsigned long) pixP, (pixP ? *pixP : 0), type,
+ format, nitems, bytesafter);
+ }
+}
+
+
+static void
+kill_xsetroot_data (Display *dpy, Window w, Bool verbose_p)
+{
+ kill_xsetroot_data_1 (dpy, w, XA_XSETROOT_ID, "_XSETROOT_ID", verbose_p);
+ kill_xsetroot_data_1 (dpy, w, XA_ESETROOT_PMAP_ID, "ESETROOT_PMAP_ID",
+ verbose_p);
+ kill_xsetroot_data_1 (dpy, w, XA_XROOTPMAP_ID, "_XROOTPMAP_ID", verbose_p);
+}
+
+
+static void
+save_real_vroot (saver_screen_info *ssi)
+{
+ saver_info *si = ssi->global;
+ Display *dpy = si->dpy;
+ Screen *screen = ssi->screen;
+ int i;
+ Window root = RootWindowOfScreen (screen);
+ Window root2, parent, *kids;
+ unsigned int nkids;
+ XErrorHandler old_handler;
+
+ /* It's possible that a window might be deleted between our call to
+ XQueryTree() and our call to XGetWindowProperty(). Don't die if
+ that happens (but just ignore that window, it's not the one we're
+ interested in anyway.)
+ */
+ XSync (dpy, False);
+ old_handler = XSetErrorHandler (BadWindow_ehandler);
+ XSync (dpy, False);
+
+ ssi->real_vroot = 0;
+ ssi->real_vroot_value = 0;
+ if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids))
+ abort ();
+ if (root != root2)
+ abort ();
+ if (parent)
+ abort ();
+ for (i = 0; i < nkids; i++)
+ {
+ Atom type;
+ int format;
+ unsigned long nitems, bytesafter;
+ unsigned char *dataP = 0;
+ Window *vrootP;
+ int j;
+
+ /* Skip this window if it is the xscreensaver window of any other
+ screen (this can happen in the Xinerama case.)
+ */
+ for (j = 0; j < si->nscreens; j++)
+ {
+ saver_screen_info *ssi2 = &si->screens[j];
+ if (kids[i] == ssi2->screensaver_window)
+ goto SKIP;
+ }
+
+ if (XGetWindowProperty (dpy, kids[i], XA_VROOT, 0, 1, False, XA_WINDOW,
+ &type, &format, &nitems, &bytesafter,
+ &dataP)
+ != Success)
+ continue;
+ if (! dataP)
+ continue;
+
+ vrootP = (Window *) dataP;
+ if (ssi->real_vroot)
+ {
+ if (*vrootP == ssi->screensaver_window) abort ();
+ fprintf (stderr,
+ "%s: more than one virtual root window found (0x%x and 0x%x).\n",
+ blurb(), (int) ssi->real_vroot, (int) kids [i]);
+ exit (1);
+ }
+ ssi->real_vroot = kids [i];
+ ssi->real_vroot_value = *vrootP;
+ SKIP:
+ ;
+ }
+
+ XSync (dpy, False);
+ XSetErrorHandler (old_handler);
+ XSync (dpy, False);
+
+ if (ssi->real_vroot)
+ {
+ remove_vroot_property (si->dpy, ssi->real_vroot);
+ XSync (dpy, False);
+ }
+
+ XFree ((char *) kids);
+}
+
+
+static Bool
+restore_real_vroot_1 (saver_screen_info *ssi)
+{
+ saver_info *si = ssi->global;
+ saver_preferences *p = &si->prefs;
+ if (p->verbose_p && ssi->real_vroot)
+ fprintf (stderr,
+ "%s: restoring __SWM_VROOT property on the real vroot (0x%lx).\n",
+ blurb(), (unsigned long) ssi->real_vroot);
+ if (ssi->screensaver_window)
+ remove_vroot_property (si->dpy, ssi->screensaver_window);
+ if (ssi->real_vroot)
+ {
+ store_vroot_property (si->dpy, ssi->real_vroot, ssi->real_vroot_value);
+ ssi->real_vroot = 0;
+ ssi->real_vroot_value = 0;
+ /* make sure the property change gets there before this process
+ terminates! We might be doing this because we have intercepted
+ SIGTERM or something. */
+ XSync (si->dpy, False);
+ return True;
+ }
+ return False;
+}
+
+Bool
+restore_real_vroot (saver_info *si)
+{
+ int i;
+ Bool did_any = False;
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ if (restore_real_vroot_1 (ssi))
+ did_any = True;
+ }
+ return did_any;
+}
+
+
+/* Signal hackery to ensure that the vroot doesn't get left in an
+ inconsistent state
+ */
+
+const char *
+signal_name(int signal)
+{
+ switch (signal) {
+ case SIGHUP: return "SIGHUP";
+ case SIGINT: return "SIGINT";
+ case SIGQUIT: return "SIGQUIT";
+ case SIGILL: return "SIGILL";
+ case SIGTRAP: return "SIGTRAP";
+#ifdef SIGABRT
+ case SIGABRT: return "SIGABRT";
+#endif
+ case SIGFPE: return "SIGFPE";
+ case SIGKILL: return "SIGKILL";
+ case SIGBUS: return "SIGBUS";
+ case SIGSEGV: return "SIGSEGV";
+ case SIGPIPE: return "SIGPIPE";
+ case SIGALRM: return "SIGALRM";
+ case SIGTERM: return "SIGTERM";
+#ifdef SIGSTOP
+ case SIGSTOP: return "SIGSTOP";
+#endif
+#ifdef SIGCONT
+ case SIGCONT: return "SIGCONT";
+#endif
+#ifdef SIGUSR1
+ case SIGUSR1: return "SIGUSR1";
+#endif
+#ifdef SIGUSR2
+ case SIGUSR2: return "SIGUSR2";
+#endif
+#ifdef SIGEMT
+ case SIGEMT: return "SIGEMT";
+#endif
+#ifdef SIGSYS
+ case SIGSYS: return "SIGSYS";
+#endif
+#ifdef SIGCHLD
+ case SIGCHLD: return "SIGCHLD";
+#endif
+#ifdef SIGPWR
+ case SIGPWR: return "SIGPWR";
+#endif
+#ifdef SIGWINCH
+ case SIGWINCH: return "SIGWINCH";
+#endif
+#ifdef SIGURG
+ case SIGURG: return "SIGURG";
+#endif
+#ifdef SIGIO
+ case SIGIO: return "SIGIO";
+#endif
+#ifdef SIGVTALRM
+ case SIGVTALRM: return "SIGVTALRM";
+#endif
+#ifdef SIGXCPU
+ case SIGXCPU: return "SIGXCPU";
+#endif
+#ifdef SIGXFSZ
+ case SIGXFSZ: return "SIGXFSZ";
+#endif
+#ifdef SIGDANGER
+ case SIGDANGER: return "SIGDANGER";
+#endif
+ default:
+ {
+ static char buf[50];
+ sprintf(buf, "signal %d\n", signal);
+ return buf;
+ }
+ }
+}
+
+
+
+static RETSIGTYPE
+restore_real_vroot_handler (int sig)
+{
+ saver_info *si = global_si_kludge; /* I hate C so much... */
+
+ signal (sig, SIG_DFL);
+ if (restore_real_vroot (si))
+ fprintf (real_stderr, "\n%s: %s intercepted, vroot restored.\n",
+ blurb(), signal_name(sig));
+ kill (getpid (), sig);
+}
+
+static void
+catch_signal (saver_info *si, int sig, RETSIGTYPE (*handler) (int))
+{
+# ifdef HAVE_SIGACTION
+
+ struct sigaction a;
+ a.sa_handler = handler;
+ sigemptyset (&a.sa_mask);
+ a.sa_flags = 0;
+
+ /* On Linux 2.4.9 (at least) we need to tell the kernel to not mask delivery
+ of this signal from inside its handler, or else when we execvp() the
+ process again, it starts up with SIGHUP blocked, meaning that killing
+ it with -HUP only works *once*. You'd think that execvp() would reset
+ all the signal masks, but it doesn't.
+ */
+# if defined(SA_NOMASK)
+ a.sa_flags |= SA_NOMASK;
+# elif defined(SA_NODEFER)
+ a.sa_flags |= SA_NODEFER;
+# endif
+
+ if (sigaction (sig, &a, 0) < 0)
+# else /* !HAVE_SIGACTION */
+ if (((long) signal (sig, handler)) == -1L)
+# endif /* !HAVE_SIGACTION */
+ {
+ char buf [255];
+ sprintf (buf, "%s: couldn't catch %s", blurb(), signal_name(sig));
+ perror (buf);
+ saver_exit (si, 1, 0);
+ }
+}
+
+static RETSIGTYPE saver_sighup_handler (int sig);
+
+void
+handle_signals (saver_info *si)
+{
+ catch_signal (si, SIGHUP, saver_sighup_handler);
+
+ catch_signal (si, SIGINT, restore_real_vroot_handler);
+ catch_signal (si, SIGQUIT, restore_real_vroot_handler);
+ catch_signal (si, SIGILL, restore_real_vroot_handler);
+ catch_signal (si, SIGTRAP, restore_real_vroot_handler);
+#ifdef SIGIOT
+ catch_signal (si, SIGIOT, restore_real_vroot_handler);
+#endif
+ catch_signal (si, SIGABRT, restore_real_vroot_handler);
+#ifdef SIGEMT
+ catch_signal (si, SIGEMT, restore_real_vroot_handler);
+#endif
+ catch_signal (si, SIGFPE, restore_real_vroot_handler);
+ catch_signal (si, SIGBUS, restore_real_vroot_handler);
+ catch_signal (si, SIGSEGV, restore_real_vroot_handler);
+#ifdef SIGSYS
+ catch_signal (si, SIGSYS, restore_real_vroot_handler);
+#endif
+ catch_signal (si, SIGTERM, restore_real_vroot_handler);
+#ifdef SIGXCPU
+ catch_signal (si, SIGXCPU, restore_real_vroot_handler);
+#endif
+#ifdef SIGXFSZ
+ catch_signal (si, SIGXFSZ, restore_real_vroot_handler);
+#endif
+#ifdef SIGDANGER
+ catch_signal (si, SIGDANGER, restore_real_vroot_handler);
+#endif
+}
+
+
+static RETSIGTYPE
+saver_sighup_handler (int sig)
+{
+ saver_info *si = global_si_kludge; /* I hate C so much... */
+
+ /* Re-establish SIGHUP handler */
+ catch_signal (si, SIGHUP, saver_sighup_handler);
+
+ fprintf (stderr, "%s: %s received: restarting...\n",
+ blurb(), signal_name(sig));
+
+ if (si->screen_blanked_p)
+ {
+ int i;
+ for (i = 0; i < si->nscreens; i++)
+ kill_screenhack (&si->screens[i]);
+ unblank_screen (si);
+ XSync (si->dpy, False);
+ }
+
+ restart_process (si); /* Does not return */
+ abort ();
+}
+
+
+
+void
+saver_exit (saver_info *si, int status, const char *dump_core_reason)
+{
+ saver_preferences *p = &si->prefs;
+ static Bool exiting = False;
+ Bool bugp;
+ Bool vrs;
+
+ if (exiting)
+ exit(status);
+
+ exiting = True;
+
+ vrs = restore_real_vroot (si);
+ emergency_kill_subproc (si);
+ shutdown_stderr (si);
+
+ if (p->verbose_p && vrs)
+ fprintf (real_stderr, "%s: old vroot restored.\n", blurb());
+
+ fflush(real_stdout);
+
+#ifdef VMS /* on VMS, 1 is the "normal" exit code instead of 0. */
+ if (status == 0) status = 1;
+ else if (status == 1) status = -1;
+#endif
+
+ bugp = !!dump_core_reason;
+
+ if (si->prefs.debug_p && !dump_core_reason)
+ dump_core_reason = "because of -debug";
+
+ if (dump_core_reason)
+ {
+ /* Note that the Linux man page for setuid() says If uid is
+ different from the old effective uid, the process will be
+ forbidden from leaving core dumps.
+ */
+ char cwd[4096]; /* should really be PATH_MAX, but who cares. */
+ cwd[0] = 0;
+ fprintf(real_stderr, "%s: dumping core (%s)\n", blurb(),
+ dump_core_reason);
+
+ if (bugp)
+ fprintf(real_stderr,
+ "%s: see https://www.jwz.org/xscreensaver/bugs.html\n"
+ "\t\t\tfor bug reporting information.\n\n",
+ blurb());
+
+# if defined(HAVE_GETCWD)
+ if (!getcwd (cwd, sizeof(cwd)))
+# elif defined(HAVE_GETWD)
+ if (!getwd (cwd))
+# endif
+ strcpy(cwd, "unknown.");
+
+ fprintf (real_stderr, "%s: current directory is %s\n", blurb(), cwd);
+ describe_uids (si, real_stderr);
+
+ /* Do this to drop a core file, so that we can get a stack trace. */
+ abort();
+ }
+
+ exit (status);
+}
+
+
+/* Managing the actual screensaver window */
+
+Bool
+window_exists_p (Display *dpy, Window window)
+{
+ XErrorHandler old_handler;
+ XWindowAttributes xgwa;
+ xgwa.screen = 0;
+ old_handler = XSetErrorHandler (BadWindow_ehandler);
+ XGetWindowAttributes (dpy, window, &xgwa);
+ XSync (dpy, False);
+ XSetErrorHandler (old_handler);
+ return (xgwa.screen != 0);
+}
+
+static void
+store_saver_id (saver_screen_info *ssi)
+{
+ XClassHint class_hints;
+ saver_info *si = ssi->global;
+ unsigned long pid = (unsigned long) getpid ();
+ char buf[20];
+ struct passwd *p = getpwuid (getuid ());
+ const char *name, *host;
+ char *id;
+# if defined(HAVE_UNAME)
+ struct utsname uts;
+# endif /* UNAME */
+
+ /* First store the name and class on the window.
+ */
+ class_hints.res_name = progname;
+ class_hints.res_class = progclass;
+ XSetClassHint (si->dpy, ssi->screensaver_window, &class_hints);
+ XStoreName (si->dpy, ssi->screensaver_window, "screensaver");
+
+ /* Then store the xscreensaver version number.
+ */
+ XChangeProperty (si->dpy, ssi->screensaver_window,
+ XA_SCREENSAVER_VERSION,
+ XA_STRING, 8, PropModeReplace,
+ (unsigned char *) si->version,
+ strlen (si->version));
+
+ /* Now store the XSCREENSAVER_ID property, that says what user and host
+ xscreensaver is running as.
+ */
+
+ if (p && p->pw_name && *p->pw_name)
+ name = p->pw_name;
+ else if (p)
+ {
+ sprintf (buf, "%lu", (unsigned long) p->pw_uid);
+ name = buf;
+ }
+ else
+ name = "???";
+
+# if defined(HAVE_UNAME)
+ {
+ if (uname (&uts) < 0)
+ host = "???";
+ else
+ host = uts.nodename;
+ }
+# elif defined(VMS)
+ host = getenv("SYS$NODE");
+# else /* !HAVE_UNAME && !VMS */
+ host = "???";
+# endif /* !HAVE_UNAME && !VMS */
+
+ id = (char *) malloc (strlen(name) + strlen(host) + 50);
+ sprintf (id, "%lu (%s@%s)", pid, name, host);
+
+ XChangeProperty (si->dpy, ssi->screensaver_window,
+ XA_SCREENSAVER_ID, XA_STRING,
+ 8, PropModeReplace,
+ (unsigned char *) id, strlen (id));
+ free (id);
+}
+
+
+void
+store_saver_status (saver_info *si)
+{
+ PROP32 *status;
+ int size = si->nscreens + 2;
+ int i;
+
+ status = (PROP32 *) calloc (size, sizeof(PROP32));
+
+ status[0] = (PROP32) (si->screen_blanked_p || si->locked_p
+ ? (si->locked_p ? XA_LOCK : XA_BLANK)
+ : 0);
+ status[1] = (PROP32) si->blank_time;
+
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ status [2 + i] = ssi->current_hack + 1;
+ }
+
+ XChangeProperty (si->dpy,
+ RootWindow (si->dpy, 0), /* always screen #0 */
+ XA_SCREENSAVER_STATUS,
+ XA_INTEGER, 32, PropModeReplace,
+ (unsigned char *) status, size);
+ free (status);
+}
+
+
+static Bool error_handler_hit_p = False;
+
+static int
+ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
+{
+ error_handler_hit_p = True;
+ return 0;
+}
+
+
+/* Returns True if successful, False if an X error occurred.
+ We need this because other programs might have done things to
+ our window that will cause XChangeWindowAttributes() to fail:
+ if that happens, we give up, destroy the window, and re-create
+ it.
+ */
+static Bool
+safe_XChangeWindowAttributes (Display *dpy, Window window,
+ unsigned long mask,
+ XSetWindowAttributes *attrs)
+{
+ XErrorHandler old_handler;
+ XSync (dpy, False);
+ error_handler_hit_p = False;
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+
+ XChangeWindowAttributes (dpy, window, mask, attrs);
+
+ XSync (dpy, False);
+ XSetErrorHandler (old_handler);
+ XSync (dpy, False);
+
+ return (!error_handler_hit_p);
+}
+
+
+/* This might not be necessary, but just in case. */
+static Bool
+safe_XConfigureWindow (Display *dpy, Window window,
+ unsigned long mask, XWindowChanges *changes)
+{
+ XErrorHandler old_handler;
+ XSync (dpy, False);
+ error_handler_hit_p = False;
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+
+ XConfigureWindow (dpy, window, mask, changes);
+
+ XSync (dpy, False);
+ XSetErrorHandler (old_handler);
+ XSync (dpy, False);
+
+ return (!error_handler_hit_p);
+}
+
+/* This might not be necessary, but just in case. */
+static Bool
+safe_XDestroyWindow (Display *dpy, Window window)
+{
+ XErrorHandler old_handler;
+ XSync (dpy, False);
+ error_handler_hit_p = False;
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+
+ XDestroyWindow (dpy, window);
+
+ XSync (dpy, False);
+ XSetErrorHandler (old_handler);
+ XSync (dpy, False);
+
+ return (!error_handler_hit_p);
+}
+
+
+static Bool
+safe_XKillClient (Display *dpy, XID id)
+{
+ XErrorHandler old_handler;
+ XSync (dpy, False);
+ error_handler_hit_p = False;
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+
+ XKillClient (dpy, id);
+
+ XSync (dpy, False);
+ XSetErrorHandler (old_handler);
+ XSync (dpy, False);
+
+ return (!error_handler_hit_p);
+}
+
+
+#ifdef HAVE_XF86VMODE
+Bool
+safe_XF86VidModeGetViewPort (Display *dpy, int screen, int *xP, int *yP)
+{
+ Bool result;
+ XErrorHandler old_handler;
+ XSync (dpy, False);
+ error_handler_hit_p = False;
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+
+ result = XF86VidModeGetViewPort (dpy, screen, xP, yP);
+
+ XSync (dpy, False);
+ XSetErrorHandler (old_handler);
+ XSync (dpy, False);
+
+ return (error_handler_hit_p
+ ? False
+ : result);
+}
+
+/* There is no "safe_XF86VidModeGetModeLine" because it fails with an
+ untrappable I/O error instead of an X error -- so one must call
+ safe_XF86VidModeGetViewPort first, and assume that both have the
+ same error condition. Thank you XFree, may I have another.
+ */
+
+#endif /* HAVE_XF86VMODE */
+
+
+static void
+initialize_screensaver_window_1 (saver_screen_info *ssi)
+{
+ saver_info *si = ssi->global;
+ saver_preferences *p = &si->prefs;
+ Bool install_cmap_p = ssi->install_cmap_p; /* not p->install_cmap_p */
+
+ /* This resets the screensaver window as fully as possible, since there's
+ no way of knowing what some random client may have done to us in the
+ meantime. We could just destroy and recreate the window, but that has
+ its own set of problems...
+ */
+ XColor black;
+ XSetWindowAttributes attrs;
+ unsigned long attrmask;
+ static Bool printed_visual_info = False; /* only print the message once. */
+ Window horked_window = 0;
+
+ black.red = black.green = black.blue = 0;
+
+ if (ssi->cmap == DefaultColormapOfScreen (ssi->screen))
+ ssi->cmap = 0;
+
+ if (ssi->current_visual != DefaultVisualOfScreen (ssi->screen))
+ /* It's not the default visual, so we have no choice but to install. */
+ install_cmap_p = True;
+
+ if (install_cmap_p)
+ {
+ if (! ssi->cmap)
+ {
+ ssi->cmap = XCreateColormap (si->dpy,
+ RootWindowOfScreen (ssi->screen),
+ ssi->current_visual, AllocNone);
+ if (! XAllocColor (si->dpy, ssi->cmap, &black)) abort ();
+ ssi->black_pixel = black.pixel;
+ }
+ }
+ else
+ {
+ Colormap def_cmap = DefaultColormapOfScreen (ssi->screen);
+ if (ssi->cmap)
+ {
+ XFreeColors (si->dpy, ssi->cmap, &ssi->black_pixel, 1, 0);
+ if (ssi->cmap != ssi->demo_cmap &&
+ ssi->cmap != def_cmap)
+ XFreeColormap (si->dpy, ssi->cmap);
+ }
+ ssi->cmap = def_cmap;
+ ssi->black_pixel = BlackPixelOfScreen (ssi->screen);
+ }
+
+ attrmask = (CWOverrideRedirect | CWEventMask | CWBackingStore | CWColormap |
+ CWBackPixel | CWBackingPixel | CWBorderPixel);
+ attrs.override_redirect = True;
+
+ /* When use_mit_saver_extension or use_sgi_saver_extension is true, we won't
+ actually be reading these events during normal operation; but we still
+ need to see Button events for demo-mode to work properly.
+ */
+ attrs.event_mask = (KeyPressMask | KeyReleaseMask |
+ ButtonPressMask | ButtonReleaseMask |
+ PointerMotionMask);
+
+ attrs.backing_store = NotUseful;
+ attrs.colormap = ssi->cmap;
+ attrs.background_pixel = ssi->black_pixel;
+ attrs.backing_pixel = ssi->black_pixel;
+ attrs.border_pixel = ssi->black_pixel;
+
+ if (!p->verbose_p || printed_visual_info)
+ ;
+ else if (ssi->current_visual == DefaultVisualOfScreen (ssi->screen))
+ {
+ fprintf (stderr, "%s: %d: visual ", blurb(), ssi->number);
+ describe_visual (stderr, ssi->screen, ssi->current_visual,
+ install_cmap_p);
+ }
+ else
+ {
+ fprintf (stderr, "%s: using visual: ", blurb());
+ describe_visual (stderr, ssi->screen, ssi->current_visual,
+ install_cmap_p);
+ fprintf (stderr, "%s: default visual: ", blurb());
+ describe_visual (stderr, ssi->screen,
+ DefaultVisualOfScreen (ssi->screen),
+ ssi->install_cmap_p);
+ }
+ printed_visual_info = True;
+
+#ifdef HAVE_MIT_SAVER_EXTENSION
+ if (si->using_mit_saver_extension)
+ {
+ XScreenSaverInfo *info;
+ Window root = RootWindowOfScreen (ssi->screen);
+
+#if 0
+ /* This call sets the server screensaver timeouts to what we think
+ they should be (based on the resources and args xscreensaver was
+ started with.) It's important that we do this to sync back up
+ with the server - if we have turned on prematurely, as by an
+ ACTIVATE ClientMessage, then the server may decide to activate
+ the screensaver while it's already active. That's ok for us,
+ since we would know to ignore that ScreenSaverActivate event,
+ but a side effect of this would be that the server would map its
+ saver window (which we then hide again right away) meaning that
+ the bits currently on the screen get blown away. Ugly. */
+
+ /* #### Ok, that doesn't work - when we tell the server that the
+ screensaver is "off" it sends us a Deactivate event, which is
+ sensible... but causes the saver to never come on. Hmm. */
+ disable_builtin_screensaver (si, True);
+#endif /* 0 */
+
+#if 0
+ /* #### The MIT-SCREEN-SAVER extension gives us access to the
+ window that the server itself uses for saving the screen.
+ However, using this window in any way, in particular, calling
+ XScreenSaverSetAttributes() as below, tends to make the X server
+ crash. So fuck it, let's try and get along without using it...
+
+ It's also inconvenient to use this window because it doesn't
+ always exist (though the ID is constant.) So to use this
+ window, we'd have to reimplement the ACTIVATE ClientMessage to
+ tell the *server* to tell *us* to turn on, to cause the window
+ to get created at the right time. Gag. */
+ XScreenSaverSetAttributes (si->dpy, root,
+ 0, 0, width, height, 0,
+ current_depth, InputOutput, visual,
+ attrmask, &attrs);
+ XSync (si->dpy, False);
+#endif /* 0 */
+
+ info = XScreenSaverAllocInfo ();
+ XScreenSaverQueryInfo (si->dpy, root, info);
+ ssi->server_mit_saver_window = info->window;
+ if (! ssi->server_mit_saver_window) abort ();
+ XFree (info);
+ }
+#endif /* HAVE_MIT_SAVER_EXTENSION */
+
+ if (ssi->screensaver_window)
+ {
+ XWindowChanges changes;
+ unsigned int changesmask = CWX|CWY|CWWidth|CWHeight|CWBorderWidth;
+ changes.x = ssi->x;
+ changes.y = ssi->y;
+ changes.width = ssi->width;
+ changes.height = ssi->height;
+ changes.border_width = 0;
+
+ if (! (safe_XConfigureWindow (si->dpy, ssi->screensaver_window,
+ changesmask, &changes) &&
+ safe_XChangeWindowAttributes (si->dpy, ssi->screensaver_window,
+ attrmask, &attrs)))
+ {
+ horked_window = ssi->screensaver_window;
+ ssi->screensaver_window = 0;
+ }
+ }
+
+ if (!ssi->screensaver_window)
+ {
+ ssi->screensaver_window =
+ XCreateWindow (si->dpy, RootWindowOfScreen (ssi->screen),
+ ssi->x, ssi->y, ssi->width, ssi->height,
+ 0, ssi->current_depth, InputOutput,
+ ssi->current_visual, attrmask, &attrs);
+ reset_stderr (ssi);
+
+ if (horked_window)
+ {
+ fprintf (stderr,
+ "%s: someone horked our saver window (0x%lx)! Recreating it...\n",
+ blurb(), (unsigned long) horked_window);
+ maybe_transfer_grabs (ssi, horked_window, ssi->screensaver_window,
+ ssi->number);
+ safe_XDestroyWindow (si->dpy, horked_window);
+ horked_window = 0;
+ }
+
+ if (p->verbose_p)
+ fprintf (stderr, "%s: %d: saver window is 0x%lx.\n",
+ blurb(), ssi->number,
+ (unsigned long) ssi->screensaver_window);
+ }
+
+ store_saver_id (ssi); /* store window name and IDs */
+
+ if (!ssi->cursor)
+ {
+ Pixmap bit;
+ bit = XCreatePixmapFromBitmapData (si->dpy, ssi->screensaver_window,
+ "\000", 1, 1,
+ BlackPixelOfScreen (ssi->screen),
+ BlackPixelOfScreen (ssi->screen),
+ 1);
+ ssi->cursor = XCreatePixmapCursor (si->dpy, bit, bit, &black, &black,
+ 0, 0);
+ XFreePixmap (si->dpy, bit);
+ }
+
+ XSetWindowBackground (si->dpy, ssi->screensaver_window, ssi->black_pixel);
+
+ if (si->demoing_p)
+ XUndefineCursor (si->dpy, ssi->screensaver_window);
+ else
+ XDefineCursor (si->dpy, ssi->screensaver_window, ssi->cursor);
+}
+
+void
+initialize_screensaver_window (saver_info *si)
+{
+ int i;
+ for (i = 0; i < si->nscreens; i++)
+ initialize_screensaver_window_1 (&si->screens[i]);
+}
+
+
+/* Called when the RANDR (Resize and Rotate) extension tells us that
+ the size of the screen has changed while the screen was blanked.
+ Call update_screen_layout() first, then call this to synchronize
+ the size of the saver windows to the new sizes of the screens.
+ */
+void
+resize_screensaver_window (saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+ int i;
+
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ XWindowAttributes xgwa;
+
+ /* Make sure a window exists -- it might not if a monitor was just
+ added for the first time.
+ */
+ if (! ssi->screensaver_window)
+ {
+ initialize_screensaver_window_1 (ssi);
+ if (p->verbose_p)
+ fprintf (stderr,
+ "%s: %d: newly added window 0x%lx %dx%d+%d+%d\n",
+ blurb(), i, (unsigned long) ssi->screensaver_window,
+ ssi->width, ssi->height, ssi->x, ssi->y);
+ }
+
+ /* Make sure the window is the right size -- it might not be if
+ the monitor changed resolution, or if a badly-behaved hack
+ screwed with it.
+ */
+ XGetWindowAttributes (si->dpy, ssi->screensaver_window, &xgwa);
+ if (xgwa.x != ssi->x ||
+ xgwa.y != ssi->y ||
+ xgwa.width != ssi->width ||
+ xgwa.height != ssi->height)
+ {
+ XWindowChanges changes;
+ unsigned int changesmask = CWX|CWY|CWWidth|CWHeight|CWBorderWidth;
+ changes.x = ssi->x;
+ changes.y = ssi->y;
+ changes.width = ssi->width;
+ changes.height = ssi->height;
+ changes.border_width = 0;
+
+ if (p->verbose_p)
+ fprintf (stderr,
+ "%s: %d: resize 0x%lx from %dx%d+%d+%d to %dx%d+%d+%d\n",
+ blurb(), i, (unsigned long) ssi->screensaver_window,
+ xgwa.width, xgwa.height, xgwa.x, xgwa.y,
+ ssi->width, ssi->height, ssi->x, ssi->y);
+
+ if (! safe_XConfigureWindow (si->dpy, ssi->screensaver_window,
+ changesmask, &changes))
+ fprintf (stderr, "%s: %d: someone horked our saver window"
+ " (0x%lx)! Unable to resize it!\n",
+ blurb(), i, (unsigned long) ssi->screensaver_window);
+ }
+
+ /* Now (if blanked) make sure that it's mapped and running a hack --
+ it might not be if we just added it. (We also might be re-using
+ an old window that existed for a previous monitor that was
+ removed and re-added.)
+
+ Note that spawn_screenhack() calls select_visual() which may destroy
+ and re-create the window via initialize_screensaver_window_1().
+ */
+ if (si->screen_blanked_p)
+ {
+ if (ssi->cmap)
+ XInstallColormap (si->dpy, ssi->cmap);
+ XMapRaised (si->dpy, ssi->screensaver_window);
+ if (! ssi->pid)
+ spawn_screenhack (ssi);
+
+ /* Make sure the act of adding a screen doesn't present as
+ pointer motion (and thus cause an unblank). */
+ {
+ Window root, child;
+ int x, y;
+ unsigned int mask;
+ XQueryPointer (si->dpy, ssi->screensaver_window, &root, &child,
+ &ssi->last_poll_mouse.root_x,
+ &ssi->last_poll_mouse.root_y,
+ &x, &y, &mask);
+ }
+ }
+ }
+
+ /* Kill off any savers running on no-longer-extant monitors.
+ */
+ for (; i < si->ssi_count; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ if (ssi->pid)
+ kill_screenhack (ssi);
+ if (ssi->screensaver_window)
+ {
+ XUnmapWindow (si->dpy, ssi->screensaver_window);
+ restore_real_vroot_1 (ssi);
+ }
+ }
+}
+
+
+void
+raise_window (saver_info *si,
+ Bool inhibit_fade, Bool between_hacks_p, Bool dont_clear)
+{
+ saver_preferences *p = &si->prefs;
+ int i;
+
+ if (si->demoing_p)
+ inhibit_fade = True;
+
+ if (si->emergency_lock_p)
+ inhibit_fade = True;
+
+ if (!dont_clear)
+ initialize_screensaver_window (si);
+
+ reset_watchdog_timer (si, True);
+
+ if (p->fade_p && si->fading_possible_p && !inhibit_fade)
+ {
+ Window *current_windows = (Window *)
+ calloc(sizeof(Window), si->nscreens);
+ Colormap *current_maps = (Colormap *)
+ calloc(sizeof(Colormap), si->nscreens);
+
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ current_windows[i] = ssi->screensaver_window;
+ current_maps[i] = (between_hacks_p
+ ? ssi->cmap
+ : DefaultColormapOfScreen (ssi->screen));
+ /* Ensure that the default background of the window is really black,
+ not a pixmap or something. (This does not clear the window.) */
+ XSetWindowBackground (si->dpy, ssi->screensaver_window,
+ ssi->black_pixel);
+ }
+
+ if (p->verbose_p) fprintf (stderr, "%s: fading...\n", blurb());
+
+ XGrabServer (si->dpy); /* ############ DANGER! */
+
+ /* Clear the stderr layer on each screen.
+ */
+ if (!dont_clear)
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ if (ssi->stderr_overlay_window)
+ /* Do this before the fade, since the stderr cmap won't fade
+ even if we uninstall it (beats me...) */
+ clear_stderr (ssi);
+ }
+
+ /* Note! The server is grabbed, and this will take several seconds
+ to complete! */
+ fade_screens (si->dpy, current_maps,
+ current_windows, si->nscreens,
+ p->fade_seconds/1000, p->fade_ticks, True, !dont_clear);
+
+ free(current_maps);
+ free(current_windows);
+ current_maps = 0;
+ current_windows = 0;
+
+ if (p->verbose_p) fprintf (stderr, "%s: fading done.\n", blurb());
+
+#ifdef HAVE_MIT_SAVER_EXTENSION
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ if (ssi->server_mit_saver_window &&
+ window_exists_p (si->dpy, ssi->server_mit_saver_window))
+ XUnmapWindow (si->dpy, ssi->server_mit_saver_window);
+ }
+#endif /* HAVE_MIT_SAVER_EXTENSION */
+
+ XUngrabServer (si->dpy);
+ XSync (si->dpy, False); /* ###### (danger over) */
+ }
+ else
+ {
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ if (!dont_clear)
+ XClearWindow (si->dpy, ssi->screensaver_window);
+ if (!dont_clear || ssi->stderr_overlay_window)
+ clear_stderr (ssi);
+ XMapRaised (si->dpy, ssi->screensaver_window);
+#ifdef HAVE_MIT_SAVER_EXTENSION
+ if (ssi->server_mit_saver_window &&
+ window_exists_p (si->dpy, ssi->server_mit_saver_window))
+ XUnmapWindow (si->dpy, ssi->server_mit_saver_window);
+#endif /* HAVE_MIT_SAVER_EXTENSION */
+ }
+ }
+
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ if (ssi->cmap)
+ XInstallColormap (si->dpy, ssi->cmap);
+ }
+}
+
+
+int
+mouse_screen (saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+ Window pointer_root, pointer_child;
+ int root_x, root_y, win_x, win_y;
+ unsigned int mask;
+ int i;
+
+ if (si->nscreens == 1)
+ return 0;
+
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ if (XQueryPointer (si->dpy, RootWindowOfScreen (ssi->screen),
+ &pointer_root, &pointer_child,
+ &root_x, &root_y, &win_x, &win_y, &mask) &&
+ root_x >= ssi->x &&
+ root_y >= ssi->y &&
+ root_x < ssi->x + ssi->width &&
+ root_y < ssi->y + ssi->height)
+ {
+ if (p->verbose_p)
+ fprintf (stderr, "%s: mouse is on screen %d of %d\n",
+ blurb(), i, si->nscreens);
+ return i;
+ }
+ }
+
+ /* couldn't figure out where the mouse is? Oh well. */
+ return 0;
+}
+
+
+Bool
+blank_screen (saver_info *si)
+{
+ int i;
+ Bool ok;
+ Window w;
+ int mscreen;
+
+ /* Note: we do our grabs on the root window, not on the screensaver window.
+ If we grabbed on the saver window, then the demo mode and lock dialog
+ boxes wouldn't get any events.
+
+ By "the root window", we mean "the root window that contains the mouse."
+ We use to always grab the mouse on screen 0, but that has the effect of
+ moving the mouse to screen 0 from whichever screen it was on, on
+ multi-head systems.
+ */
+ mscreen = mouse_screen (si);
+ w = RootWindowOfScreen(si->screens[mscreen].screen);
+ ok = grab_keyboard_and_mouse (si, w,
+ (si->demoing_p ? 0 : si->screens[0].cursor),
+ mscreen);
+
+
+# if 0
+ if (si->using_mit_saver_extension || si->using_sgi_saver_extension)
+ /* If we're using a server extension, then failure to get a grab is
+ not a big deal -- even without the grab, we will still be able
+ to un-blank when there is user activity, since the server will
+ tell us. */
+ /* #### No, that's not true: if we don't have a keyboard grab,
+ then we can't read passwords to unlock.
+ */
+ ok = True;
+# endif /* 0 */
+
+ if (!ok)
+ return False;
+
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ if (ssi->real_screen_p)
+ save_real_vroot (ssi);
+ store_vroot_property (si->dpy,
+ ssi->screensaver_window,
+ ssi->screensaver_window);
+
+#ifdef HAVE_XF86VMODE
+ {
+ int ev, er;
+ if (!XF86VidModeQueryExtension (si->dpy, &ev, &er) ||
+ !safe_XF86VidModeGetViewPort (si->dpy, i,
+ &ssi->blank_vp_x,
+ &ssi->blank_vp_y))
+ ssi->blank_vp_x = ssi->blank_vp_y = -1;
+ }
+#endif /* HAVE_XF86VMODE */
+ }
+
+ raise_window (si, False, False, False);
+
+ si->screen_blanked_p = True;
+ si->blank_time = time ((time_t *) 0);
+ si->last_wall_clock_time = 0;
+
+ store_saver_status (si); /* store blank time */
+
+ return True;
+}
+
+
+void
+unblank_screen (saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+ Bool unfade_p = (si->fading_possible_p && p->unfade_p);
+ int i;
+
+ monitor_power_on (si, True);
+ reset_watchdog_timer (si, False);
+
+ if (si->demoing_p)
+ unfade_p = False;
+
+ if (unfade_p)
+ {
+ Window *current_windows = (Window *)
+ calloc(sizeof(Window), si->nscreens);
+
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ current_windows[i] = ssi->screensaver_window;
+ /* Ensure that the default background of the window is really black,
+ not a pixmap or something. (This does not clear the window.) */
+ XSetWindowBackground (si->dpy, ssi->screensaver_window,
+ ssi->black_pixel);
+ }
+
+ if (p->verbose_p) fprintf (stderr, "%s: unfading...\n", blurb());
+
+
+ XSync (si->dpy, False);
+ XGrabServer (si->dpy); /* ############ DANGER! */
+ XSync (si->dpy, False);
+
+ /* Clear the stderr layer on each screen.
+ */
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ clear_stderr (ssi);
+ }
+
+ XUngrabServer (si->dpy);
+ XSync (si->dpy, False); /* ###### (danger over) */
+
+ fade_screens (si->dpy, 0,
+ current_windows, si->nscreens,
+ p->fade_seconds/1000, p->fade_ticks,
+ False, False);
+
+ free(current_windows);
+ current_windows = 0;
+
+ if (p->verbose_p) fprintf (stderr, "%s: unfading done.\n", blurb());
+ }
+ else
+ {
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ if (ssi->cmap)
+ {
+ Colormap c = DefaultColormapOfScreen (ssi->screen);
+ /* avoid technicolor */
+ XClearWindow (si->dpy, ssi->screensaver_window);
+ if (c) XInstallColormap (si->dpy, c);
+ }
+ XUnmapWindow (si->dpy, ssi->screensaver_window);
+ }
+ }
+
+
+ /* If the focus window does has a non-default colormap, then install
+ that colormap as well. (On SGIs, this will cause both the root map
+ and the focus map to be installed simultaneously. It'd be nice to
+ pick up the other colormaps that had been installed, too; perhaps
+ XListInstalledColormaps could be used for that?)
+ */
+ {
+ Window focus = 0;
+ int revert_to;
+ XGetInputFocus (si->dpy, &focus, &revert_to);
+ if (focus && focus != PointerRoot && focus != None)
+ {
+ XWindowAttributes xgwa;
+ xgwa.colormap = 0;
+ XGetWindowAttributes (si->dpy, focus, &xgwa);
+ if (xgwa.colormap &&
+ xgwa.colormap != DefaultColormapOfScreen (xgwa.screen))
+ XInstallColormap (si->dpy, xgwa.colormap);
+ }
+ }
+
+
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ kill_xsetroot_data (si->dpy, ssi->screensaver_window, p->verbose_p);
+ }
+
+ store_saver_status (si); /* store unblank time */
+ ungrab_keyboard_and_mouse (si);
+ restore_real_vroot (si);
+
+ /* Unmap the windows a second time, dammit -- just to avoid a race
+ with the screen-grabbing hacks. (I'm not sure if this is really
+ necessary; I'm stabbing in the dark now.)
+ */
+ for (i = 0; i < si->nscreens; i++)
+ XUnmapWindow (si->dpy, si->screens[i].screensaver_window);
+
+ si->screen_blanked_p = False;
+ si->blank_time = time ((time_t *) 0);
+ si->last_wall_clock_time = 0;
+
+ store_saver_status (si); /* store unblank time */
+}
+
+
+/* Transfer any grabs from the old window to the new.
+ Actually I think none of this is necessary, since we always
+ hold our grabs on the root window, but I wrote this before
+ re-discovering that...
+ */
+static void
+maybe_transfer_grabs (saver_screen_info *ssi,
+ Window old_w, Window new_w,
+ int new_screen_no)
+{
+ saver_info *si = ssi->global;
+
+ /* If the old window held our mouse grab, transfer the grab to the new
+ window. (Grab the server while so doing, to avoid a race condition.)
+ */
+ if (old_w == si->mouse_grab_window)
+ {
+ XGrabServer (si->dpy); /* ############ DANGER! */
+ ungrab_mouse (si);
+ grab_mouse (si, ssi->screensaver_window,
+ (si->demoing_p ? 0 : ssi->cursor),
+ new_screen_no);
+ XUngrabServer (si->dpy);
+ XSync (si->dpy, False); /* ###### (danger over) */
+ }
+
+ /* If the old window held our keyboard grab, transfer the grab to the new
+ window. (Grab the server while so doing, to avoid a race condition.)
+ */
+ if (old_w == si->keyboard_grab_window)
+ {
+ XGrabServer (si->dpy); /* ############ DANGER! */
+ ungrab_kbd(si);
+ grab_kbd(si, ssi->screensaver_window, ssi->number);
+ XUngrabServer (si->dpy);
+ XSync (si->dpy, False); /* ###### (danger over) */
+ }
+}
+
+
+static Visual *
+get_screen_gl_visual (saver_info *si, int real_screen_number)
+{
+ int i;
+ int nscreens = ScreenCount (si->dpy);
+
+ if (! si->best_gl_visuals)
+ si->best_gl_visuals = (Visual **)
+ calloc (nscreens + 1, sizeof (*si->best_gl_visuals));
+
+ for (i = 0; i < nscreens; i++)
+ if (! si->best_gl_visuals[i])
+ si->best_gl_visuals[i] =
+ get_best_gl_visual (si, ScreenOfDisplay (si->dpy, i));
+
+ if (real_screen_number < 0 || real_screen_number >= nscreens) abort();
+ return si->best_gl_visuals[real_screen_number];
+}
+
+
+Bool
+select_visual (saver_screen_info *ssi, const char *visual_name)
+{
+ XWindowAttributes xgwa;
+ saver_info *si = ssi->global;
+ saver_preferences *p = &si->prefs;
+ Bool install_cmap_p = p->install_cmap_p;
+ Bool was_installed_p = (ssi->cmap != DefaultColormapOfScreen(ssi->screen));
+ Visual *new_v = 0;
+ Bool got_it;
+
+ /* On some systems (most recently, MacOS X) OpenGL programs get confused
+ when you kill one and re-start another on the same window. So maybe
+ it's best to just always destroy and recreate the xscreensaver window
+ when changing hacks, instead of trying to reuse the old one?
+ */
+ Bool always_recreate_window_p = True;
+
+ get_screen_gl_visual (si, 0); /* let's probe all the GL visuals early */
+
+ /* We make sure the existing window is actually on ssi->screen before
+ trying to use it, in case things moved around radically when monitors
+ were added or deleted. If we don't do this we could get a BadMatch
+ even though the depths match. I think.
+ */
+ memset (&xgwa, 0, sizeof(xgwa));
+ if (ssi->screensaver_window)
+ XGetWindowAttributes (si->dpy, ssi->screensaver_window, &xgwa);
+
+ if (visual_name && *visual_name)
+ {
+ if (!strcmp(visual_name, "default-i") ||
+ !strcmp(visual_name, "Default-i") ||
+ !strcmp(visual_name, "Default-I")
+ )
+ {
+ visual_name = "default";
+ install_cmap_p = True;
+ }
+ else if (!strcmp(visual_name, "default-n") ||
+ !strcmp(visual_name, "Default-n") ||
+ !strcmp(visual_name, "Default-N"))
+ {
+ visual_name = "default";
+ install_cmap_p = False;
+ }
+ else if (!strcmp(visual_name, "gl") ||
+ !strcmp(visual_name, "Gl") ||
+ !strcmp(visual_name, "GL"))
+ {
+ new_v = get_screen_gl_visual (si, ssi->real_screen_number);
+ if (!new_v && p->verbose_p)
+ fprintf (stderr, "%s: no GL visuals.\n", progname);
+ }
+
+ if (!new_v)
+ new_v = get_visual (ssi->screen, visual_name, True, False);
+ }
+ else
+ {
+ new_v = ssi->default_visual;
+ }
+
+ got_it = !!new_v;
+
+ if (new_v && new_v != DefaultVisualOfScreen(ssi->screen))
+ /* It's not the default visual, so we have no choice but to install. */
+ install_cmap_p = True;
+
+ ssi->install_cmap_p = install_cmap_p;
+
+ if ((ssi->screen != xgwa.screen) ||
+ (new_v &&
+ (always_recreate_window_p ||
+ (ssi->current_visual != new_v) ||
+ (install_cmap_p != was_installed_p))))
+ {
+ Colormap old_c = ssi->cmap;
+ Window old_w = ssi->screensaver_window;
+ if (! new_v)
+ new_v = ssi->current_visual;
+
+ if (p->verbose_p)
+ {
+ fprintf (stderr, "%s: %d: visual ", blurb(), ssi->number);
+ describe_visual (stderr, ssi->screen, new_v, install_cmap_p);
+#if 0
+ fprintf (stderr, "%s: from ", blurb());
+ describe_visual (stderr, ssi->screen, ssi->current_visual,
+ was_installed_p);
+#endif
+ }
+
+ reset_stderr (ssi);
+ ssi->current_visual = new_v;
+ ssi->current_depth = visual_depth(ssi->screen, new_v);
+ ssi->cmap = 0;
+ ssi->screensaver_window = 0;
+
+ initialize_screensaver_window_1 (ssi);
+
+ /* stderr_overlay_window is a child of screensaver_window, so we need
+ to destroy that as well (actually, we just need to invalidate and
+ drop our pointers to it, but this will destroy it, which is ok so
+ long as it happens before old_w itself is destroyed.) */
+ reset_stderr (ssi);
+
+ raise_window (si, True, True, False);
+ store_vroot_property (si->dpy,
+ ssi->screensaver_window, ssi->screensaver_window);
+
+ /* Transfer any grabs from the old window to the new. */
+ maybe_transfer_grabs (ssi, old_w, ssi->screensaver_window, ssi->number);
+
+ /* Now we can destroy the old window without horking our grabs. */
+ XDestroyWindow (si->dpy, old_w);
+
+ if (p->verbose_p)
+ fprintf (stderr, "%s: %d: destroyed old saver window 0x%lx.\n",
+ blurb(), ssi->number, (unsigned long) old_w);
+
+ if (old_c &&
+ old_c != DefaultColormapOfScreen (ssi->screen) &&
+ old_c != ssi->demo_cmap)
+ XFreeColormap (si->dpy, old_c);
+ }
+
+ return got_it;
+}
diff --git a/driver/xdpyinfo.c b/driver/xdpyinfo.c
new file mode 100644
index 0000000..9f67966
--- /dev/null
+++ b/driver/xdpyinfo.c
@@ -0,0 +1,1098 @@
+/*
+ * $ TOG: xdpyinfo.c /main/35 1998/02/09 13:57:05 kaleb $
+ *
+ * xdpyinfo - print information about X display connecton
+ *
+ *
+Copyright 1988, 1998 The Open Group
+
+All Rights Reserved.
+
+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
+OPEN GROUP 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.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+ *
+ * Author: Jim Fulton, MIT X Consortium
+ *
+ * GLX and Overlay support added by Jamie Zawinski <jwz@jwz.org>, 11-Nov-99
+ *
+ * To compile:
+ * cc -DHAVE_GLX xdpyinfo.c -o xdpyinfo -lGL -lX11 -lXext [-lXtst] -lm
+ *
+ * Other defines to consider:
+ * -DMITSHM -DHAVE_XDBE -DHAVE_XIE -DHAVE_XTEST -DHAVE_SYNC
+ * -DHAVE_XRECORD
+ */
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xproto.h> /* for CARD32 */
+#include <X11/extensions/multibuf.h>
+#ifdef HAVE_XIE
+#include <X11/extensions/XIElib.h>
+#endif /* HAVE_XIE */
+#ifdef HAVE_XTEST
+#include <X11/extensions/XTest.h>
+#endif /* HAVE_XTEST */
+#ifdef HAVE_XSYNC
+#include <X11/extensions/sync.h>
+#endif /* HAVE_XSYNC */
+#ifdef HAVE_XDBE
+#include <X11/extensions/Xdbe.h>
+#endif /* HAVE_XDBE */
+#ifdef HAVE_XRECORD
+#include <X11/extensions/record.h>
+#endif /* HAVE_XRECORD */
+#ifdef MITSHM
+#include <X11/extensions/XShm.h>
+#endif
+#include <X11/Xos.h>
+#include <stdio.h>
+
+#ifdef HAVE_GLX
+# include <GL/gl.h>
+# include <GL/glx.h>
+#endif /* HAVE_GLX */
+
+#define HAVE_OVERLAY /* jwz: no compile-time deps, so do this all the time */
+
+char *ProgramName;
+Bool queryExtensions = False;
+
+static int StrCmp(a, b)
+ char **a, **b;
+{
+ return strcmp(*a, *b);
+}
+
+
+#ifdef HAVE_GLX /* Added by jwz, 11-Nov-99 */
+
+static void
+print_glx_versions (dpy)
+ Display *dpy;
+{
+ /* Note: with Mesa 3.0, this lies: it prints the info from the
+ client's GL library, rather than the info from the GLX server.
+
+ Note also that we can't protect these calls by only doing
+ them when the GLX extension is present, because with Mesa,
+ the server doesn't have that extension (but the GL library
+ works anyway.)
+ */
+ int scr = DefaultScreen (dpy);
+ const char *vend, *vers;
+ vend = glXQueryServerString (dpy, scr, GLX_VENDOR);
+ if (!vend) return;
+ vers = glXQueryServerString (dpy, scr, GLX_VERSION);
+ printf ("GLX vendor: %s (%s)\n",
+ vend, (vers ? vers : "unknown version"));
+}
+
+static void
+print_glx_visual_info (dpy, vip)
+ Display *dpy;
+ XVisualInfo *vip;
+{
+ int status, value = False;
+
+ status = glXGetConfig (dpy, vip, GLX_USE_GL, &value);
+ if (status == GLX_NO_EXTENSION)
+ /* dpy does not support the GLX extension. */
+ return;
+
+ if (status == GLX_BAD_VISUAL || value == False)
+ {
+ printf (" GLX supported: no\n");
+ return;
+ }
+ else
+ {
+ printf (" GLX supported: yes\n");
+ }
+
+ if (!glXGetConfig (dpy, vip, GLX_LEVEL, &value) &&
+ value != 0)
+ printf (" GLX level: %d\n", value);
+
+ if (!glXGetConfig (dpy, vip, GLX_RGBA, &value) && value)
+ {
+ int r=0, g=0, b=0, a=0;
+ glXGetConfig (dpy, vip, GLX_RED_SIZE, &r);
+ glXGetConfig (dpy, vip, GLX_GREEN_SIZE, &g);
+ glXGetConfig (dpy, vip, GLX_BLUE_SIZE, &b);
+ glXGetConfig (dpy, vip, GLX_ALPHA_SIZE, &a);
+ printf (" GLX type: RGBA (%2d, %2d, %2d, %2d)\n",
+ r, g, b, a);
+
+ r=0, g=0, b=0, a=0;
+ glXGetConfig (dpy, vip, GLX_ACCUM_RED_SIZE, &r);
+ glXGetConfig (dpy, vip, GLX_ACCUM_GREEN_SIZE, &g);
+ glXGetConfig (dpy, vip, GLX_ACCUM_BLUE_SIZE, &b);
+ glXGetConfig (dpy, vip, GLX_ACCUM_ALPHA_SIZE, &a);
+ printf (" GLX accum: RGBA (%2d, %2d, %2d, %2d)\n",
+ r, g, b, a);
+ }
+ else
+ {
+ value = 0;
+ glXGetConfig (dpy, vip, GLX_BUFFER_SIZE, &value);
+ printf (" GLX type: indexed (%d)\n", value);
+ }
+
+# if 0 /* redundant */
+ if (!glXGetConfig (dpy, vip, GLX_X_VISUAL_TYPE_EXT, &value))
+ printf (" GLX class: %s\n",
+ (value == GLX_TRUE_COLOR_EXT ? "TrueColor" :
+ value == GLX_DIRECT_COLOR_EXT ? "DirectColor" :
+ value == GLX_PSEUDO_COLOR_EXT ? "PseudoColor" :
+ value == GLX_STATIC_COLOR_EXT ? "StaticColor" :
+ value == GLX_GRAY_SCALE_EXT ? "Grayscale" :
+ value == GLX_STATIC_GRAY_EXT ? "StaticGray" : "???"));
+# endif
+
+# ifdef GLX_VISUAL_CAVEAT_EXT
+ if (!glXGetConfig (dpy, vip, GLX_VISUAL_CAVEAT_EXT, &value) &&
+ value != GLX_NONE_EXT)
+ printf (" GLX rating: %s\n",
+ (value == GLX_NONE_EXT ? "none" :
+ value == GLX_SLOW_VISUAL_EXT ? "slow" :
+# ifdef GLX_NON_CONFORMANT_EXT
+ value == GLX_NON_CONFORMANT_EXT ? "non-conformant" :
+# endif
+ "???"));
+# endif
+
+ if (!glXGetConfig (dpy, vip, GLX_DOUBLEBUFFER, &value))
+ printf (" GLX double-buffer: %s\n", (value ? "yes" : "no"));
+
+ if (!glXGetConfig (dpy, vip, GLX_STEREO, &value) &&
+ value)
+ printf (" GLX stereo: %s\n", (value ? "yes" : "no"));
+
+ if (!glXGetConfig (dpy, vip, GLX_AUX_BUFFERS, &value) &&
+ value != 0)
+ printf (" GLX aux buffers: %d\n", value);
+
+ if (!glXGetConfig (dpy, vip, GLX_DEPTH_SIZE, &value))
+ printf (" GLX depth size: %d\n", value);
+
+ if (!glXGetConfig (dpy, vip, GLX_STENCIL_SIZE, &value) &&
+ value != 0)
+ printf (" GLX stencil size: %d\n", value);
+
+# if defined(GL_SAMPLE_BUFFERS)
+# define SB GL_SAMPLE_BUFFERS
+# define SM GL_SAMPLES
+# elif defined(GLX_SAMPLE_BUFFERS)
+# define SB GLX_SAMPLE_BUFFERS
+# define SM GLX_SAMPLES
+# elif defined(GLX_SAMPLE_BUFFERS_ARB)
+# define SB GLX_SAMPLE_BUFFERS_ARB
+# define SM GLX_SAMPLES_ARB
+# elif defined(GLX_SAMPLE_BUFFERS_SGIS)
+# define SB GLX_SAMPLE_BUFFERS_SGIS
+# define SM GLX_SAMPLES_SGIS
+# endif
+
+# ifdef SB
+ if (!glXGetConfig (dpy, vip, SB, &value) && value != 0)
+ {
+ int bufs = value;
+ if (!glXGetConfig (dpy, vip, SM, &value))
+ printf (" GLX multisample: %d, %d\n", bufs, value);
+ }
+# endif /* SB */
+
+ if (!glXGetConfig (dpy, vip, GLX_TRANSPARENT_TYPE_EXT, &value) &&
+ value != GLX_NONE_EXT)
+ {
+ if (value == GLX_NONE_EXT)
+ printf (" GLX transparency: none\n");
+ else if (value == GLX_TRANSPARENT_INDEX_EXT)
+ {
+ if (!glXGetConfig (dpy, vip, GLX_TRANSPARENT_INDEX_VALUE_EXT,&value))
+ printf (" GLX transparency: indexed (%d)\n", value);
+ }
+ else if (value == GLX_TRANSPARENT_RGB_EXT)
+ {
+ int r=0, g=0, b=0, a=0;
+ glXGetConfig (dpy, vip, GLX_TRANSPARENT_RED_VALUE_EXT, &r);
+ glXGetConfig (dpy, vip, GLX_TRANSPARENT_GREEN_VALUE_EXT, &g);
+ glXGetConfig (dpy, vip, GLX_TRANSPARENT_BLUE_VALUE_EXT, &b);
+ glXGetConfig (dpy, vip, GLX_TRANSPARENT_ALPHA_VALUE_EXT, &a);
+ printf (" GLX transparency: RGBA (%2d, %2d, %2d, %2d)\n",
+ r, g, b, a);
+ }
+ }
+}
+#endif /* HAVE_GLX */
+
+
+#ifdef HAVE_OVERLAY /* Added by jwz, 11-Nov-99 */
+
+ /* If the server's root window contains a SERVER_OVERLAY_VISUALS property,
+ then that identifies the visuals which correspond to the video hardware's
+ overlay planes. Windows created in these kinds of visuals may have
+ transparent pixels that let other layers shine through.
+
+ This might not be an X Consortium standard, but it turns out that
+ SGI, HP, DEC, and IBM all use this same mechanism. So that's close
+ enough for me.
+
+ Documentation on the SERVER_OVERLAY_VISUALS property can be found at:
+ http://www.hp.com/xwindow/sharedInfo/Whitepapers/Visuals/server_overlay_visuals.html
+ */
+
+struct overlay
+{
+ CARD32 visual_id;
+ CARD32 transparency; /* 0: none; 1: pixel; 2: mask */
+ CARD32 value; /* the transparent pixel */
+ CARD32 layer; /* -1: underlay; 0: normal; 1: popup; 2: overlay */
+};
+
+struct overlay_list
+{
+ int count;
+ struct overlay *list;
+};
+
+static struct overlay_list *overlays = 0;
+
+static void
+find_overlay_info (dpy)
+ Display *dpy;
+{
+ int screen;
+ Atom OVERLAY = XInternAtom (dpy, "SERVER_OVERLAY_VISUALS", False);
+
+ overlays = (struct overlay_list *) calloc (sizeof (struct overlay_list),
+ ScreenCount (dpy));
+
+ for (screen = 0; screen < ScreenCount (dpy); screen++)
+ {
+ Window window = RootWindow (dpy, screen);
+ Atom actual_type;
+ int actual_format;
+ unsigned long nitems, bytes_after;
+ struct overlay *data = 0;
+ int result = XGetWindowProperty (dpy, window, OVERLAY,
+ 0, (65536 / sizeof (long)), False,
+ OVERLAY, &actual_type, &actual_format,
+ &nitems, &bytes_after,
+ (unsigned char **) &data);
+ if (result == Success &&
+ actual_type == OVERLAY &&
+ actual_format == 32 &&
+ nitems > 0)
+ {
+ overlays[screen].count = (nitems /
+ (sizeof(struct overlay) / sizeof(CARD32)));
+ overlays[screen].list = data;
+ }
+ else if (data)
+ XFree((char *) data);
+ }
+}
+
+static void
+print_overlay_visual_info (vip)
+ XVisualInfo *vip;
+{
+ int i;
+ int vis = vip->visualid;
+ int scr = vip->screen;
+ if (!overlays) return;
+ for (i = 0; i < overlays[scr].count; i++)
+ if (vis == overlays[scr].list[i].visual_id)
+ {
+ struct overlay *ov = &overlays[scr].list[i];
+ printf (" Overlay info: layer %ld (%s), ",
+ (long) ov->layer,
+ (ov->layer == -1 ? "underlay" :
+ ov->layer == 0 ? "normal" :
+ ov->layer == 1 ? "popup" :
+ ov->layer == 2 ? "overlay" : "???"));
+ if (ov->transparency == 1)
+ printf ("transparent pixel %lu\n", (unsigned long) ov->value);
+ else if (ov->transparency == 2)
+ printf ("transparent mask 0x%x\n", (unsigned long) ov->value);
+ else
+ printf ("opaque\n");
+ }
+}
+#endif /* HAVE_OVERLAY */
+
+
+void
+print_extension_info (dpy)
+ Display *dpy;
+{
+ int n = 0;
+ char **extlist = XListExtensions (dpy, &n);
+
+ printf ("number of extensions: %d\n", n);
+
+ if (extlist) {
+ register int i;
+ int opcode, event, error;
+
+ qsort(extlist, n, sizeof(char *), StrCmp);
+ for (i = 0; i < n; i++) {
+ if (!queryExtensions) {
+ printf (" %s\n", extlist[i]);
+ continue;
+ }
+ XQueryExtension(dpy, extlist[i], &opcode, &event, &error);
+ printf (" %s (opcode: %d", extlist[i], opcode);
+ if (event)
+ printf (", base event: %d", event);
+ if (error)
+ printf (", base error: %d", error);
+ printf(")\n");
+ }
+ /* do not free, Xlib can depend on contents being unaltered */
+ /* XFreeExtensionList (extlist); */
+ }
+}
+
+void
+print_display_info (dpy)
+ Display *dpy;
+{
+ char dummybuf[40];
+ char *cp;
+ int minkeycode, maxkeycode;
+ int i, n;
+ long req_size;
+ XPixmapFormatValues *pmf;
+ Window focuswin;
+ int focusrevert;
+
+ printf ("name of display: %s\n", DisplayString (dpy));
+ printf ("version number: %d.%d\n",
+ ProtocolVersion (dpy), ProtocolRevision (dpy));
+ printf ("vendor string: %s\n", ServerVendor (dpy));
+ printf ("vendor release number: %d\n", VendorRelease (dpy));
+
+#ifdef HAVE_GLX
+ print_glx_versions (dpy);
+#endif /* HAVE_GLX */
+
+ req_size = XExtendedMaxRequestSize (dpy);
+ if (!req_size) req_size = XMaxRequestSize (dpy);
+ printf ("maximum request size: %ld bytes\n", req_size * 4);
+ printf ("motion buffer size: %d\n", XDisplayMotionBufferSize (dpy));
+
+ switch (BitmapBitOrder (dpy)) {
+ case LSBFirst: cp = "LSBFirst"; break;
+ case MSBFirst: cp = "MSBFirst"; break;
+ default:
+ sprintf (dummybuf, "unknown order %d", BitmapBitOrder (dpy));
+ cp = dummybuf;
+ break;
+ }
+ printf ("bitmap unit, bit order, padding: %d, %s, %d\n",
+ BitmapUnit (dpy), cp, BitmapPad (dpy));
+
+ switch (ImageByteOrder (dpy)) {
+ case LSBFirst: cp = "LSBFirst"; break;
+ case MSBFirst: cp = "MSBFirst"; break;
+ default:
+ sprintf (dummybuf, "unknown order %d", ImageByteOrder (dpy));
+ cp = dummybuf;
+ break;
+ }
+ printf ("image byte order: %s\n", cp);
+
+ pmf = XListPixmapFormats (dpy, &n);
+ printf ("number of supported pixmap formats: %d\n", n);
+ if (pmf) {
+ printf ("supported pixmap formats:\n");
+ for (i = 0; i < n; i++) {
+ printf (" depth %d, bits_per_pixel %d, scanline_pad %d\n",
+ pmf[i].depth, pmf[i].bits_per_pixel, pmf[i].scanline_pad);
+ }
+ XFree ((char *) pmf);
+ }
+
+
+ /*
+ * when we get interfaces to the PixmapFormat stuff, insert code here
+ */
+
+ XDisplayKeycodes (dpy, &minkeycode, &maxkeycode);
+ printf ("keycode range: minimum %d, maximum %d\n",
+ minkeycode, maxkeycode);
+
+ XGetInputFocus (dpy, &focuswin, &focusrevert);
+ printf ("focus: ");
+ switch (focuswin) {
+ case PointerRoot:
+ printf ("PointerRoot\n");
+ break;
+ case None:
+ printf ("None\n");
+ break;
+ default:
+ printf("window 0x%lx, revert to ", focuswin);
+ switch (focusrevert) {
+ case RevertToParent:
+ printf ("Parent\n");
+ break;
+ case RevertToNone:
+ printf ("None\n");
+ break;
+ case RevertToPointerRoot:
+ printf ("PointerRoot\n");
+ break;
+ default: /* should not happen */
+ printf ("%d\n", focusrevert);
+ break;
+ }
+ break;
+ }
+
+ print_extension_info (dpy);
+
+ printf ("default screen number: %d\n", DefaultScreen (dpy));
+ printf ("number of screens: %d\n", ScreenCount (dpy));
+}
+
+void
+print_visual_info (vip)
+ XVisualInfo *vip;
+{
+ char errorbuf[40]; /* for sprintfing into */
+ char *class = NULL; /* for printing */
+
+ switch (vip->class) {
+ case StaticGray: class = "StaticGray"; break;
+ case GrayScale: class = "GrayScale"; break;
+ case StaticColor: class = "StaticColor"; break;
+ case PseudoColor: class = "PseudoColor"; break;
+ case TrueColor: class = "TrueColor"; break;
+ case DirectColor: class = "DirectColor"; break;
+ default:
+ sprintf (errorbuf, "unknown class %d", vip->class);
+ class = errorbuf;
+ break;
+ }
+
+ printf (" visual:\n");
+ printf (" visual id: 0x%lx\n", vip->visualid);
+ printf (" class: %s\n", class);
+ printf (" depth: %d plane%s\n", vip->depth,
+ vip->depth == 1 ? "" : "s");
+ if (vip->class == TrueColor || vip->class == DirectColor)
+ printf (" available colormap entries: %d per subfield\n",
+ vip->colormap_size);
+ else
+ printf (" available colormap entries: %d\n",
+ vip->colormap_size);
+ printf (" red, green, blue masks: 0x%lx, 0x%lx, 0x%lx\n",
+ vip->red_mask, vip->green_mask, vip->blue_mask);
+ printf (" significant bits in color specification: %d bits\n",
+ vip->bits_per_rgb);
+}
+
+void
+print_screen_info (dpy, scr)
+ Display *dpy;
+ int scr;
+{
+ Screen *s = ScreenOfDisplay (dpy, scr); /* opaque structure */
+ XVisualInfo viproto; /* fill in for getting info */
+ XVisualInfo *vip; /* retured info */
+ int nvi; /* number of elements returned */
+ int i; /* temp variable: iterator */
+ char eventbuf[80]; /* want 79 chars per line + nul */
+ static char *yes = "YES", *no = "NO", *when = "WHEN MAPPED";
+ double xres, yres;
+ int ndepths = 0, *depths = NULL;
+ unsigned int width, height;
+
+
+ /*
+ * there are 2.54 centimeters to an inch; so there are 25.4 millimeters.
+ *
+ * dpi = N pixels / (M millimeters / (25.4 millimeters / 1 inch))
+ * = N pixels / (M inch / 25.4)
+ * = N * 25.4 pixels / M inch
+ */
+
+ xres = ((((double) DisplayWidth(dpy,scr)) * 25.4) /
+ ((double) DisplayWidthMM(dpy,scr)));
+ yres = ((((double) DisplayHeight(dpy,scr)) * 25.4) /
+ ((double) DisplayHeightMM(dpy,scr)));
+
+ printf ("\n");
+ printf ("screen #%d:\n", scr);
+ printf (" dimensions: %dx%d pixels (%dx%d millimeters)\n",
+ DisplayWidth (dpy, scr), DisplayHeight (dpy, scr),
+ DisplayWidthMM(dpy, scr), DisplayHeightMM (dpy, scr));
+ printf (" resolution: %dx%d dots per inch\n",
+ (int) (xres + 0.5), (int) (yres + 0.5));
+ depths = XListDepths (dpy, scr, &ndepths);
+ if (!depths) ndepths = 0;
+ printf (" depths (%d): ", ndepths);
+ for (i = 0; i < ndepths; i++) {
+ printf ("%d", depths[i]);
+ if (i < ndepths - 1) {
+ putchar (',');
+ putchar (' ');
+ }
+ }
+ putchar ('\n');
+ if (depths) XFree ((char *) depths);
+ printf (" root window id: 0x%lx\n", RootWindow (dpy, scr));
+ printf (" depth of root window: %d plane%s\n",
+ DisplayPlanes (dpy, scr),
+ DisplayPlanes (dpy, scr) == 1 ? "" : "s");
+ printf (" number of colormaps: minimum %d, maximum %d\n",
+ MinCmapsOfScreen(s), MaxCmapsOfScreen(s));
+ printf (" default colormap: 0x%lx\n", DefaultColormap (dpy, scr));
+ printf (" default number of colormap cells: %d\n",
+ DisplayCells (dpy, scr));
+ printf (" preallocated pixels: black %d, white %d\n",
+ BlackPixel (dpy, scr), WhitePixel (dpy, scr));
+ printf (" options: backing-store %s, save-unders %s\n",
+ (DoesBackingStore (s) == NotUseful) ? no :
+ ((DoesBackingStore (s) == Always) ? yes : when),
+ DoesSaveUnders (s) ? yes : no);
+ XQueryBestSize (dpy, CursorShape, RootWindow (dpy, scr), 65535, 65535,
+ &width, &height);
+ if (width == 65535 && height == 65535)
+ printf (" largest cursor: unlimited\n");
+ else
+ printf (" largest cursor: %dx%d\n", width, height);
+ printf (" current input event mask: 0x%lx\n", EventMaskOfScreen (s));
+ (void) print_event_mask (eventbuf, 79, 4, EventMaskOfScreen (s));
+
+
+ nvi = 0;
+ viproto.screen = scr;
+ vip = XGetVisualInfo (dpy, VisualScreenMask, &viproto, &nvi);
+ printf (" number of visuals: %d\n", nvi);
+ printf (" default visual id: 0x%lx\n",
+ XVisualIDFromVisual (DefaultVisual (dpy, scr)));
+ for (i = 0; i < nvi; i++) {
+ print_visual_info (vip+i);
+#ifdef HAVE_OVERLAY
+ print_overlay_visual_info (vip+i);
+#endif /* HAVE_OVERLAY */
+#ifdef HAVE_GLX
+ print_glx_visual_info (dpy, vip+i);
+#endif /* HAVE_GLX */
+ }
+ if (vip) XFree ((char *) vip);
+}
+
+/*
+ * The following routine prints out an event mask, wrapping events at nice
+ * boundaries.
+ */
+
+#define MASK_NAME_WIDTH 25
+
+static struct _event_table {
+ char *name;
+ long value;
+} event_table[] = {
+ { "KeyPressMask ", KeyPressMask },
+ { "KeyReleaseMask ", KeyReleaseMask },
+ { "ButtonPressMask ", ButtonPressMask },
+ { "ButtonReleaseMask ", ButtonReleaseMask },
+ { "EnterWindowMask ", EnterWindowMask },
+ { "LeaveWindowMask ", LeaveWindowMask },
+ { "PointerMotionMask ", PointerMotionMask },
+ { "PointerMotionHintMask ", PointerMotionHintMask },
+ { "Button1MotionMask ", Button1MotionMask },
+ { "Button2MotionMask ", Button2MotionMask },
+ { "Button3MotionMask ", Button3MotionMask },
+ { "Button4MotionMask ", Button4MotionMask },
+ { "Button5MotionMask ", Button5MotionMask },
+ { "ButtonMotionMask ", ButtonMotionMask },
+ { "KeymapStateMask ", KeymapStateMask },
+ { "ExposureMask ", ExposureMask },
+ { "VisibilityChangeMask ", VisibilityChangeMask },
+ { "StructureNotifyMask ", StructureNotifyMask },
+ { "ResizeRedirectMask ", ResizeRedirectMask },
+ { "SubstructureNotifyMask ", SubstructureNotifyMask },
+ { "SubstructureRedirectMask ", SubstructureRedirectMask },
+ { "FocusChangeMask ", FocusChangeMask },
+ { "PropertyChangeMask ", PropertyChangeMask },
+ { "ColormapChangeMask ", ColormapChangeMask },
+ { "OwnerGrabButtonMask ", OwnerGrabButtonMask },
+ { NULL, 0 }};
+
+int print_event_mask (buf, lastcol, indent, mask)
+ char *buf; /* string to write into */
+ int lastcol; /* strlen(buf)+1 */
+ int indent; /* amount by which to indent */
+ long mask; /* event mask */
+{
+ struct _event_table *etp;
+ int len;
+ int bitsfound = 0;
+
+ buf[0] = buf[lastcol] = '\0'; /* just in case */
+
+#define INDENT() { register int i; len = indent; \
+ for (i = 0; i < indent; i++) buf[i] = ' '; }
+
+ INDENT ();
+
+ for (etp = event_table; etp->name; etp++) {
+ if (mask & etp->value) {
+ if (len + MASK_NAME_WIDTH > lastcol) {
+ puts (buf);
+ INDENT ();
+ }
+ strcpy (buf+len, etp->name);
+ len += MASK_NAME_WIDTH;
+ bitsfound++;
+ }
+ }
+
+ if (bitsfound) puts (buf);
+
+#undef INDENT
+
+ return (bitsfound);
+}
+
+void
+print_standard_extension_info(dpy, extname, majorrev, minorrev)
+ Display *dpy;
+ char *extname;
+ int majorrev, minorrev;
+{
+ int opcode, event, error;
+
+ printf("%s version %d.%d ", extname, majorrev, minorrev);
+
+ XQueryExtension(dpy, extname, &opcode, &event, &error);
+ printf ("opcode: %d", opcode);
+ if (event)
+ printf (", base event: %d", event);
+ if (error)
+ printf (", base error: %d", error);
+ printf("\n");
+}
+
+int
+print_multibuf_info(dpy, extname)
+ Display *dpy;
+ char *extname;
+{
+ int i, j; /* temp variable: iterator */
+ int nmono, nstereo; /* count */
+ XmbufBufferInfo *mono_info = NULL, *stereo_info = NULL; /* arrays */
+ static char *fmt =
+ " visual id, max buffers, depth: 0x%lx, %d, %d\n";
+ int scr = 0;
+ int majorrev, minorrev;
+
+ if (!XmbufGetVersion(dpy, &majorrev, &minorrev))
+ return 0;
+
+ print_standard_extension_info(dpy, extname, majorrev, minorrev);
+
+ for (i = 0; i < ScreenCount (dpy); i++)
+ {
+ if (!XmbufGetScreenInfo (dpy, RootWindow(dpy, scr), &nmono, &mono_info,
+ &nstereo, &stereo_info)) {
+ fprintf (stderr,
+ "%s: unable to get multibuffer info for screen %d\n",
+ ProgramName, scr);
+ } else {
+ printf (" screen %d number of mono multibuffer types: %d\n", i, nmono);
+ for (j = 0; j < nmono; j++) {
+ printf (fmt, mono_info[j].visualid, mono_info[j].max_buffers,
+ mono_info[j].depth);
+ }
+ printf (" number of stereo multibuffer types: %d\n", nstereo);
+ for (j = 0; j < nstereo; j++) {
+ printf (fmt, stereo_info[j].visualid,
+ stereo_info[j].max_buffers, stereo_info[j].depth);
+ }
+ if (mono_info) XFree ((char *) mono_info);
+ if (stereo_info) XFree ((char *) stereo_info);
+ }
+ }
+ return 1;
+} /* end print_multibuf_info */
+
+
+/* XIE stuff */
+
+#ifdef HAVE_XIE
+
+char *subset_names[] = { NULL, "FULL", "DIS" };
+char *align_names[] = { NULL, "Alignable", "Arbitrary" };
+char *group_names[] = { /* 0 */ "Default",
+ /* 2 */ "ColorAlloc",
+ /* 4 */ "Constrain",
+ /* 6 */ "ConvertFromRGB",
+ /* 8 */ "ConvertToRGB",
+ /* 10 */ "Convolve",
+ /* 12 */ "Decode",
+ /* 14 */ "Dither",
+ /* 16 */ "Encode",
+ /* 18 */ "Gamut",
+ /* 20 */ "Geometry",
+ /* 22 */ "Histogram",
+ /* 24 */ "WhiteAdjust"
+ };
+
+int
+print_xie_info(dpy, extname)
+ Display *dpy;
+ char *extname;
+{
+ XieExtensionInfo *xieInfo;
+ int i;
+ int ntechs;
+ XieTechnique *techs;
+ XieTechniqueGroup prevGroup;
+
+ if (!XieInitialize(dpy, &xieInfo ))
+ return 0;
+
+ print_standard_extension_info(dpy, extname,
+ xieInfo->server_major_rev, xieInfo->server_minor_rev);
+
+ printf(" service class: %s\n", subset_names[xieInfo->service_class]);
+ printf(" alignment: %s\n", align_names[xieInfo->alignment]);
+ printf(" uncnst_mantissa: %d\n", xieInfo->uncnst_mantissa);
+ printf(" uncnst_min_exp: %d\n", xieInfo->uncnst_min_exp);
+ printf(" uncnst_max_exp: %d\n", xieInfo->uncnst_max_exp);
+ printf(" cnst_levels:");
+ for (i = 0; i < xieInfo->n_cnst_levels; i++)
+ printf(" %d", xieInfo->cnst_levels[i]);
+ printf("\n");
+
+ if (!XieQueryTechniques(dpy, xieValAll, &ntechs, &techs))
+ return 1;
+
+ prevGroup = -1;
+
+ for (i = 0; i < ntechs; i++)
+ {
+ if (techs[i].group != prevGroup)
+ {
+ printf(" technique group: %s\n", group_names[techs[i].group >> 1]);
+ prevGroup = techs[i].group;
+ }
+ printf(" %s\tspeed: %d needs_param: %s number: %d\n",
+ techs[i].name,
+ techs[i].speed, (techs[i].needs_param ? "True " : "False"),
+ techs[i].number);
+ }
+ return 1;
+} /* end print_xie_info */
+
+#endif /* HAVE_XIE */
+
+
+#ifdef HAVE_XTEST
+int
+print_xtest_info(dpy, extname)
+ Display *dpy;
+ char *extname;
+{
+ int majorrev, minorrev, foo;
+
+ if (!XTestQueryExtension(dpy, &foo, &foo, &majorrev, &minorrev))
+ return 0;
+ print_standard_extension_info(dpy, extname, majorrev, minorrev);
+ return 1;
+}
+#endif /* HAVE_XTEST */
+
+#ifdef HAVE_XSYNC
+int
+print_sync_info(dpy, extname)
+ Display *dpy;
+ char *extname;
+{
+ int majorrev, minorrev;
+ XSyncSystemCounter *syscounters;
+ int ncounters, i;
+
+ if (!XSyncInitialize(dpy, &majorrev, &minorrev))
+ return 0;
+ print_standard_extension_info(dpy, extname, majorrev, minorrev);
+
+ syscounters = XSyncListSystemCounters(dpy, &ncounters);
+ printf(" system counters: %d\n", ncounters);
+ for (i = 0; i < ncounters; i++)
+ {
+ printf(" %s id: 0x%08x resolution_lo: %d resolution_hi: %d\n",
+ syscounters[i].name, syscounters[i].counter,
+ XSyncValueLow32(syscounters[i].resolution),
+ XSyncValueHigh32(syscounters[i].resolution));
+ }
+ XSyncFreeSystemCounterList(syscounters);
+ return 1;
+}
+#endif /* HAVE_XSYNC */
+
+int
+print_shape_info(dpy, extname)
+ Display *dpy;
+ char *extname;
+{
+ int majorrev, minorrev;
+
+ if (!XShapeQueryVersion(dpy, &majorrev, &minorrev))
+ return 0;
+ print_standard_extension_info(dpy, extname, majorrev, minorrev);
+ return 1;
+}
+
+#ifdef MITSHM
+int
+print_mitshm_info(dpy, extname)
+ Display *dpy;
+ char *extname;
+{
+ int majorrev, minorrev;
+ Bool sharedPixmaps;
+
+ if (!XShmQueryVersion(dpy, &majorrev, &minorrev, &sharedPixmaps))
+ return 0;
+ print_standard_extension_info(dpy, extname, majorrev, minorrev);
+ printf(" shared pixmaps: ");
+ if (sharedPixmaps)
+ {
+ int format = XShmPixmapFormat(dpy);
+ printf("yes, format: %d\n", format);
+ }
+ else
+ {
+ printf("no\n");
+ }
+ return 1;
+}
+#endif /* MITSHM */
+
+#ifdef HAVE_XDBE
+int
+print_dbe_info(dpy, extname)
+ Display *dpy;
+ char *extname;
+{
+ int majorrev, minorrev;
+ XdbeScreenVisualInfo *svi;
+ int numscreens = 0;
+ int iscrn, ivis;
+
+ if (!XdbeQueryExtension(dpy, &majorrev, &minorrev))
+ return 0;
+
+ print_standard_extension_info(dpy, extname, majorrev, minorrev);
+ svi = XdbeGetVisualInfo(dpy, (Drawable *)NULL, &numscreens);
+ for (iscrn = 0; iscrn < numscreens; iscrn++)
+ {
+ printf(" Double-buffered visuals on screen %d\n", iscrn);
+ for (ivis = 0; ivis < svi[iscrn].count; ivis++)
+ {
+ printf(" visual id 0x%lx depth %d perflevel %d\n",
+ svi[iscrn].visinfo[ivis].visual,
+ svi[iscrn].visinfo[ivis].depth,
+ svi[iscrn].visinfo[ivis].perflevel);
+ }
+ }
+ XdbeFreeVisualInfo(svi);
+ return 1;
+}
+#endif /* HAVE_XDBE */
+
+#ifdef HAVE_XRECORD
+int
+print_record_info(dpy, extname)
+ Display *dpy;
+ char *extname;
+{
+ int majorrev, minorrev;
+
+ if (!XRecordQueryVersion(dpy, &majorrev, &minorrev))
+ return 0;
+ print_standard_extension_info(dpy, extname, majorrev, minorrev);
+ return 1;
+}
+#endif /* HAVE_XRECORD */
+
+/* utilities to manage the list of recognized extensions */
+
+
+typedef int (*ExtensionPrintFunc)(
+#if NeedFunctionPrototypes
+ Display *, char *
+#endif
+);
+
+typedef struct {
+ char *extname;
+ ExtensionPrintFunc printfunc;
+ Bool printit;
+} ExtensionPrintInfo;
+
+ExtensionPrintInfo known_extensions[] =
+{
+#ifdef MITSHM
+ {"MIT-SHM", print_mitshm_info, False},
+#endif /* MITSHM */
+ {MULTIBUFFER_PROTOCOL_NAME, print_multibuf_info, False},
+ {"SHAPE", print_shape_info, False},
+#ifdef HAVE_XSYNC
+ {SYNC_NAME, print_sync_info, False},
+#endif /* HAVE_XSYNC */
+#ifdef HAVE_XIE
+ {xieExtName, print_xie_info, False},
+#endif /* HAVE_XIE */
+#ifdef HAVE_XTEST
+ {XTestExtensionName, print_xtest_info, False},
+#endif /* HAVE_XTEST */
+#ifdef HAVE_XDBE
+ {"DOUBLE-BUFFER", print_dbe_info, False},
+#endif /* HAVE_XDBE */
+#ifdef HAVE_XRECORD
+ {"RECORD", print_record_info, False}
+#endif /* HAVE_XRECORD */
+ /* add new extensions here */
+ /* wish list: PEX XKB LBX */
+};
+
+int num_known_extensions = sizeof known_extensions / sizeof known_extensions[0];
+
+void
+print_known_extensions(f)
+ FILE *f;
+{
+ int i;
+ for (i = 0; i < num_known_extensions; i++)
+ {
+ fprintf(f, "%s ", known_extensions[i].extname);
+ }
+}
+
+void
+mark_extension_for_printing(extname)
+ char *extname;
+{
+ int i;
+
+ if (strcmp(extname, "all") == 0)
+ {
+ for (i = 0; i < num_known_extensions; i++)
+ known_extensions[i].printit = True;
+ }
+ else
+ {
+ for (i = 0; i < num_known_extensions; i++)
+ {
+ if (strcmp(extname, known_extensions[i].extname) == 0)
+ {
+ known_extensions[i].printit = True;
+ return;
+ }
+ }
+ printf("%s extension not supported by %s\n", extname, ProgramName);
+ }
+}
+
+void
+print_marked_extensions(dpy)
+ Display *dpy;
+{
+ int i;
+ for (i = 0; i < num_known_extensions; i++)
+ {
+ if (known_extensions[i].printit)
+ {
+ printf("\n");
+ if (! (*known_extensions[i].printfunc)(dpy,
+ known_extensions[i].extname))
+ {
+ printf("%s extension not supported by server\n",
+ known_extensions[i].extname);
+ }
+ }
+ }
+}
+
+static void usage ()
+{
+ fprintf (stderr, "usage: %s [options]\n", ProgramName);
+ fprintf (stderr, "-display displayname\tserver to query\n");
+ fprintf (stderr, "-queryExtensions\tprint info returned by XQueryExtension\n");
+ fprintf (stderr, "-ext all\t\tprint detailed info for all supported extensions\n");
+ fprintf (stderr, "-ext extension-name\tprint detailed info for extension-name if one of:\n ");
+ print_known_extensions(stderr);
+ fprintf (stderr, "\n");
+ exit (1);
+}
+
+int main (argc, argv)
+ int argc;
+ char *argv[];
+{
+ Display *dpy; /* X connection */
+ char *displayname = NULL; /* server to contact */
+ int i; /* temp variable: iterator */
+ Bool multibuf = False;
+ int mbuf_event_base, mbuf_error_base;
+
+ ProgramName = argv[0];
+
+ for (i = 1; i < argc; i++) {
+ char *arg = argv[i];
+ int len = strlen(arg);
+
+ if (!strncmp("-display", arg, len)) {
+ if (++i >= argc) usage ();
+ displayname = argv[i];
+ } else if (!strncmp("-queryExtensions", arg, len)) {
+ queryExtensions = True;
+ } else if (!strncmp("-ext", arg, len)) {
+ if (++i >= argc) usage ();
+ mark_extension_for_printing(argv[i]);
+ } else
+ usage ();
+ }
+
+ dpy = XOpenDisplay (displayname);
+ if (!dpy) {
+ fprintf (stderr, "%s: unable to open display \"%s\".\n",
+ ProgramName, XDisplayName (displayname));
+ exit (1);
+ }
+
+#ifdef HAVE_OVERLAY
+ find_overlay_info (dpy);
+#endif /* HAVE_OVERLAY */
+
+ print_display_info (dpy);
+ for (i = 0; i < ScreenCount (dpy); i++) {
+ print_screen_info (dpy, i);
+ }
+
+ print_marked_extensions(dpy);
+
+ XCloseDisplay (dpy);
+ exit (0);
+}
diff --git a/driver/xscreensaver-command.c b/driver/xscreensaver-command.c
new file mode 100644
index 0000000..f4a855d
--- /dev/null
+++ b/driver/xscreensaver-command.c
@@ -0,0 +1,450 @@
+/* xscreensaver-command, Copyright (c) 1991-2013 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <sys/time.h>
+#include <sys/types.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+/* #include <X11/Xproto.h> / * for CARD32 */
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Xutil.h> /* for XGetClassHint() */
+#include <X11/Xos.h>
+
+#include <X11/Intrinsic.h> /* only needed to get through xscreensaver.h */
+
+
+/* You might think that to read an array of 32-bit quantities out of a
+ server-side property, you would pass an array of 32-bit data quantities
+ into XGetWindowProperty(). You would be wrong. You have to use an array
+ of longs, even if long is 64 bits (using 32 of each 64.)
+ */
+typedef long PROP32;
+
+#include "remote.h"
+#include "version.h"
+
+#ifdef _VROOT_H_
+ERROR! you must not include vroot.h in this file
+#endif
+
+char *progname;
+
+Atom XA_VROOT;
+Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_RESPONSE;
+Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_STATUS, XA_SELECT, XA_DEMO, XA_EXIT;
+Atom XA_BLANK, XA_LOCK;
+static Atom XA_ACTIVATE, XA_DEACTIVATE, XA_CYCLE, XA_NEXT, XA_PREV;
+static Atom XA_RESTART, XA_PREFS, XA_THROTTLE, XA_UNTHROTTLE;
+
+static char *screensaver_version;
+# ifdef __GNUC__
+ __extension__ /* don't warn about "string length is greater than the
+ length ISO C89 compilers are required to support" in the
+ usage string... */
+# endif
+static char *usage = "\n\
+usage: %s -<option>\n\
+\n\
+ This program provides external control of a running xscreensaver process.\n\
+ Version %s, copyright (c) 1991-%s Jamie Zawinski <jwz@jwz.org>.\n\
+\n\
+ The xscreensaver program is a daemon that runs in the background.\n\
+ You control a running xscreensaver process by sending it messages\n\
+ with this program, xscreensaver-command. See the man pages for\n\
+ details. These are the arguments understood by xscreensaver-command:\n\
+\n\
+ -demo Ask the xscreensaver process to enter interactive demo mode.\n\
+\n\
+ -prefs Ask the xscreensaver process to bring up the preferences\n\
+ panel.\n\
+\n\
+ -activate Turn on the screensaver (blank the screen), as if the user\n\
+ had been idle for long enough.\n\
+\n\
+ -deactivate Turns off the screensaver (un-blank the screen), as if user\n\
+ activity had been detected.\n\
+\n\
+ -cycle If the screensaver is active (the screen is blanked), then\n\
+ stop the current graphics demo and run a new one (chosen\n\
+ randomly.)\n\
+\n\
+ -next Like either -activate or -cycle, depending on which is more\n\
+ appropriate, except that the graphics hack that will be run\n\
+ is the next one in the list, instead of a randomly-chosen\n\
+ one. In other words, repeatedly executing -next will cause\n\
+ the xscreensaver process to invoke each graphics demo\n\
+ sequentially. (Though using the -demo option is probably\n\
+ an easier way to accomplish that.)\n\
+\n\
+ -prev Like -next, but goes in the other direction.\n\
+\n\
+ -select <N> Like -activate, but runs the Nth element in the list of\n\
+ hacks. By knowing what is in the `programs' list, and in\n\
+ what order, you can use this to activate the screensaver\n\
+ with a particular graphics demo. (The first element in the\n\
+ list is numbered 1, not 0.)\n\
+\n\
+ -exit Causes the xscreensaver process to exit gracefully.\n\
+ This does nothing if the display is currently locked.\n\
+ (Note that one must *never* kill xscreensaver with -9!)\n\
+\n\
+ -restart Causes the screensaver process to exit and then restart with\n\
+ the same command line arguments as last time. You shouldn't\n\
+ really need to do this, since xscreensaver notices when the\n\
+ .xscreensaver file has changed and re-reads it as needed.\n\
+\n\
+ -lock Tells the running xscreensaver process to lock the screen\n\
+ immediately. This is like -activate, but forces locking as\n\
+ well, even if locking is not the default. If the saver is\n\
+ already active, this causes it to be locked as well.\n\
+\n\
+ -version Prints the version of xscreensaver that is currently running\n\
+ on the display -- that is, the actual version number of the\n\
+ running xscreensaver background process, rather than the\n\
+ version number of xscreensaver-command.\n\
+\n\
+ -time Prints the time at which the screensaver last activated or\n\
+ deactivated (roughly, how long the user has been idle or\n\
+ non-idle -- but not quite, since it only tells you when the\n\
+ screen became blanked or un-blanked.)\n\
+\n\
+ -watch Prints a line each time the screensaver changes state: when\n\
+ the screen blanks, locks, unblanks, or when the running hack\n\
+ is changed. This option never returns; it is intended for\n\
+ use by shell scripts that want to react to the screensaver\n\
+ in some way.\n\
+\n\
+ See the man page for more details.\n\
+ For updates, check https://www.jwz.org/xscreensaver/\n\
+\n";
+
+/* Note: The "-throttle" command is deprecated -- it predates the XDPMS
+ extension. Instead of using -throttle, users should instead just
+ power off the monitor (e.g., "xset dpms force off".) In a few
+ minutes, the xscreensaver daemon will notice that the monitor is
+ off, and cease running hacks.
+ */
+
+#define USAGE() do { \
+ fprintf (stderr, usage, progname, screensaver_version, year); exit (1); \
+ } while(0)
+
+static int watch (Display *);
+
+int
+main (int argc, char **argv)
+{
+ Display *dpy;
+ int i;
+ char *dpyname = 0;
+ Atom *cmd = 0;
+ long arg = 0L;
+ char *s;
+ Atom XA_WATCH = 0; /* kludge: not really an atom */
+ char year[5];
+
+ progname = argv[0];
+ s = strrchr (progname, '/');
+ if (s) progname = s+1;
+
+ screensaver_version = (char *) malloc (5);
+ memcpy (screensaver_version, screensaver_id + 17, 4);
+ screensaver_version [4] = 0;
+
+ s = strchr (screensaver_id, '-');
+ s = strrchr (s, '-');
+ s++;
+ strncpy (year, s, 4);
+ year[4] = 0;
+
+ for (i = 1; i < argc; i++)
+ {
+ const char *s = argv [i];
+ int L;
+ if (s[0] == '-' && s[1] == '-') s++;
+ L = strlen (s);
+ if (L < 2) USAGE ();
+ if (!strncmp (s, "-display", L)) dpyname = argv [++i];
+ else if (cmd) USAGE();
+ else if (!strncmp (s, "-activate", L)) cmd = &XA_ACTIVATE;
+ else if (!strncmp (s, "-deactivate", L)) cmd = &XA_DEACTIVATE;
+ else if (!strncmp (s, "-cycle", L)) cmd = &XA_CYCLE;
+ else if (!strncmp (s, "-next", L)) cmd = &XA_NEXT;
+ else if (!strncmp (s, "-prev", L)) cmd = &XA_PREV;
+ else if (!strncmp (s, "-select", L)) cmd = &XA_SELECT;
+ else if (!strncmp (s, "-exit", L)) cmd = &XA_EXIT;
+ else if (!strncmp (s, "-restart", L)) cmd = &XA_RESTART;
+ else if (!strncmp (s, "-demo", L)) cmd = &XA_DEMO;
+ else if (!strncmp (s, "-preferences",L)) cmd = &XA_PREFS;
+ else if (!strncmp (s, "-prefs",L)) cmd = &XA_PREFS;
+ else if (!strncmp (s, "-lock", L)) cmd = &XA_LOCK;
+ else if (!strncmp (s, "-throttle", L)) cmd = &XA_THROTTLE;
+ else if (!strncmp (s, "-unthrottle", L)) cmd = &XA_UNTHROTTLE;
+ else if (!strncmp (s, "-version", L)) cmd = &XA_SCREENSAVER_VERSION;
+ else if (!strncmp (s, "-time", L)) cmd = &XA_SCREENSAVER_STATUS;
+ else if (!strncmp (s, "-watch", L)) cmd = &XA_WATCH;
+ else USAGE ();
+
+ if (cmd == &XA_SELECT || cmd == &XA_DEMO)
+ {
+ long a;
+ char c;
+ if (i+1 < argc && (1 == sscanf(argv[i+1], " %ld %c", &a, &c)))
+ {
+ arg = a;
+ i++;
+ }
+ }
+ }
+
+ if (!cmd)
+ USAGE ();
+
+ if (arg < 0)
+ /* no command may have a negative argument. */
+ USAGE();
+ else if (arg == 0)
+ {
+ /* SELECT must have a non-zero argument. */
+ if (cmd == &XA_SELECT)
+ USAGE();
+ }
+ else /* arg > 0 */
+ {
+ /* no command other than SELECT and DEMO may have a non-zero argument. */
+ if (cmd != &XA_DEMO && cmd != &XA_SELECT)
+ USAGE();
+ }
+
+
+
+ /* For backward compatibility: -demo with no arguments used to send a
+ "DEMO 0" ClientMessage to the xscreensaver process, which brought up
+ the built-in demo mode dialog. Now that the demo mode dialog is no
+ longer built in, we bring it up by just running the "xscreensaver-demo"
+ program.
+
+ Note that "-DEMO <n>" still sends a ClientMessage.
+ */
+ if (cmd == &XA_PREFS ||
+ (cmd == &XA_DEMO && arg == 0))
+ {
+ char buf [512];
+ char *new_argv[] = { "xscreensaver-demo", 0, 0, 0, 0, 0 };
+ int ac = 1;
+
+ if (dpyname)
+ {
+ new_argv[ac++] = "-display";
+ new_argv[ac++] = dpyname;
+ }
+
+ if (cmd == &XA_PREFS)
+ new_argv[ac++] = "-prefs";
+
+ fflush(stdout);
+ fflush(stderr);
+ execvp (new_argv[0], new_argv); /* shouldn't return */
+
+ sprintf (buf, "%s: could not exec %s", progname, new_argv[0]);
+ perror(buf);
+ fflush(stdout);
+ fflush(stderr);
+ exit (-1);
+ }
+
+
+
+ if (!dpyname) dpyname = (char *) getenv ("DISPLAY");
+
+ if (!dpyname)
+ {
+ dpyname = ":0.0";
+ fprintf (stderr,
+ "%s: warning: $DISPLAY is not set: defaulting to \"%s\".\n",
+ progname, dpyname);
+ }
+
+ dpy = XOpenDisplay (dpyname);
+ if (!dpy)
+ {
+ fprintf (stderr, "%s: can't open display %s\n", progname,
+ (dpyname ? dpyname : "(null)"));
+ exit (1);
+ }
+
+ XA_VROOT = XInternAtom (dpy, "__SWM_VROOT", False);
+ XA_SCREENSAVER = XInternAtom (dpy, "SCREENSAVER", False);
+ XA_SCREENSAVER_ID = XInternAtom (dpy, "_SCREENSAVER_ID", False);
+ XA_SCREENSAVER_VERSION = XInternAtom (dpy, "_SCREENSAVER_VERSION",False);
+ XA_SCREENSAVER_STATUS = XInternAtom (dpy, "_SCREENSAVER_STATUS", False);
+ XA_SCREENSAVER_RESPONSE = XInternAtom (dpy, "_SCREENSAVER_RESPONSE", False);
+ XA_ACTIVATE = XInternAtom (dpy, "ACTIVATE", False);
+ XA_DEACTIVATE = XInternAtom (dpy, "DEACTIVATE", False);
+ XA_RESTART = XInternAtom (dpy, "RESTART", False);
+ XA_CYCLE = XInternAtom (dpy, "CYCLE", False);
+ XA_NEXT = XInternAtom (dpy, "NEXT", False);
+ XA_PREV = XInternAtom (dpy, "PREV", False);
+ XA_SELECT = XInternAtom (dpy, "SELECT", False);
+ XA_EXIT = XInternAtom (dpy, "EXIT", False);
+ XA_DEMO = XInternAtom (dpy, "DEMO", False);
+ XA_PREFS = XInternAtom (dpy, "PREFS", False);
+ XA_LOCK = XInternAtom (dpy, "LOCK", False);
+ XA_BLANK = XInternAtom (dpy, "BLANK", False);
+ XA_THROTTLE = XInternAtom (dpy, "THROTTLE", False);
+ XA_UNTHROTTLE = XInternAtom (dpy, "UNTHROTTLE", False);
+
+ XSync (dpy, 0);
+
+ if (cmd == &XA_WATCH)
+ {
+ i = watch (dpy);
+ exit (i);
+ }
+
+ if (*cmd == XA_ACTIVATE || *cmd == XA_LOCK ||
+ *cmd == XA_NEXT || *cmd == XA_PREV || *cmd == XA_SELECT)
+ /* People never guess that KeyRelease deactivates the screen saver too,
+ so if we're issuing an activation command, wait a second.
+ No need to do this if stdin is not a tty, meaning we're not being
+ run from the command line.
+ */
+ if (isatty(0))
+ sleep (1);
+
+ i = xscreensaver_command (dpy, *cmd, arg, True, NULL);
+ if (i < 0) exit (i);
+ else exit (0);
+}
+
+
+static int
+watch (Display *dpy)
+{
+ char *v = 0;
+ Window window = RootWindow (dpy, 0);
+ XWindowAttributes xgwa;
+ XEvent event;
+ PROP32 *last = 0;
+
+ if (v) free (v);
+ XGetWindowAttributes (dpy, window, &xgwa);
+ XSelectInput (dpy, window, xgwa.your_event_mask | PropertyChangeMask);
+
+ while (1)
+ {
+ XNextEvent (dpy, &event);
+ if (event.xany.type == PropertyNotify &&
+ event.xproperty.state == PropertyNewValue &&
+ event.xproperty.atom == XA_SCREENSAVER_STATUS)
+ {
+ Atom type;
+ int format;
+ unsigned long nitems, bytesafter;
+ unsigned char *dataP = 0;
+
+ if (XGetWindowProperty (dpy,
+ RootWindow (dpy, 0), /* always screen #0 */
+ XA_SCREENSAVER_STATUS,
+ 0, 999, False, XA_INTEGER,
+ &type, &format, &nitems, &bytesafter,
+ &dataP)
+ == Success
+ && type
+ && dataP)
+ {
+ time_t tt;
+ char *s;
+ Bool changed = False;
+ Bool running = False;
+ PROP32 *data = (PROP32 *) dataP;
+
+ if (type != XA_INTEGER || nitems < 3)
+ {
+ STATUS_LOSE:
+ if (last) XFree (last);
+ if (data) XFree (data);
+ fprintf (stderr, "%s: bad status format on root window.\n",
+ progname);
+ return -1;
+ }
+
+ tt = (time_t) data[1];
+ if (tt <= (time_t) 666000000L) /* early 1991 */
+ goto STATUS_LOSE;
+
+ s = ctime(&tt);
+ if (s[strlen(s)-1] == '\n')
+ s[strlen(s)-1] = 0;
+
+ if (!last || data[0] != last[0])
+ {
+ /* State changed. */
+ if (data[0] == XA_BLANK)
+ printf ("BLANK %s\n", s);
+ else if (data[0] == XA_LOCK)
+ printf ("LOCK %s\n", s);
+ else if (data[0] == 0)
+ printf ("UNBLANK %s\n", s);
+ else
+ goto STATUS_LOSE;
+ }
+
+ if (!last)
+ changed = True;
+ else
+ {
+ int i;
+ for (i = 2; i < nitems; i++)
+ {
+ if (data[i] != last[i])
+ changed = True;
+ if (data[i])
+ running = True;
+ }
+ }
+
+ if (running && changed)
+ {
+ int i;
+ fprintf (stdout, "RUN");
+ for (i = 2; i < nitems; i++)
+ fprintf (stdout, " %d", (int) data[i]);
+ fprintf (stdout, "\n");
+ }
+
+ fflush (stdout);
+
+ if (last) XFree (last);
+ last = data;
+ }
+ else
+ {
+ if (last) XFree (last);
+ if (dataP) XFree (dataP);
+ fprintf (stderr, "%s: no saver status on root window.\n",
+ progname);
+ return -1;
+ }
+ }
+ }
+}
diff --git a/driver/xscreensaver-command.man b/driver/xscreensaver-command.man
new file mode 100644
index 0000000..040a183
--- /dev/null
+++ b/driver/xscreensaver-command.man
@@ -0,0 +1,263 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "09-Nov-2013 (5.23)" "X Version 11"
+.SH NAME
+xscreensaver-command - control a running xscreensaver process
+.SH SYNOPSIS
+.B xscreensaver-command
+[\-display \fIhost:display.screen\fP] \
+[\-help | \
+\-demo | \
+\-prefs | \
+\-activate | \
+\-deactivate | \
+\-cycle | \
+\-next | \
+\-prev | \
+\-select \fIn\fP | \
+\-exit | \
+\-restart | \
+\-lock | \
+\-version | \
+\-time | \
+\-watch]
+.SH DESCRIPTION
+The \fIxscreensaver\-command\fP program controls a running \fIxscreensaver\fP
+process by sending it client-messages.
+
+.BR xscreensaver (1)
+has a client-server model: the xscreensaver process is a
+daemon that runs in the background; it is controlled by other
+foreground programs such as \fIxscreensaver-command\fP and
+.BR xscreensaver\-demo (1).
+
+This program, \fIxscreensaver-command\fP, is a command-line-oriented tool; the
+.BR xscreensaver\-demo (1).
+program is a graphical tool.
+.SH OPTIONS
+.I xscreensaver-command
+accepts the following command-line options:
+.TP 8
+.B \-help
+Prints a brief summary of command-line options.
+.TP 8
+.B \-demo
+This just launches the
+.BR xscreensaver\-demo (1)
+program, in which one can experiment with the various graphics hacks
+available, and edit parameters.
+.TP 8
+.B \-demo \fP\fInumber\fP
+When the \fI\-demo\fP option is followed by an integer, it instructs
+the \fIxscreensaver\fP daemon to run that hack, and wait for the user
+to click the mouse before deactivating (i.e., mouse motion does not
+deactivate.) This is the mechanism by which
+.BR xscreensaver\-demo (1)
+communicates with the
+.BR xscreensaver (1)
+daemon. (The first hack in the list is numbered 1, not 0.)
+.TP 8
+.B \-prefs
+Like the no-argument form of \fI\-demo\fP, but brings up that program's
+Preferences panel by default.
+.TP 8
+.B \-activate
+Tell xscreensaver to turn on immediately (that is, blank the screen, as if
+the user had been idle for long enough.) The screensaver will deactivate as
+soon as there is any user activity, as usual.
+
+It is useful to run this from a menu; you may wish to run it as
+.EX
+sleep 5 ; xscreensaver-command -activate
+.EE
+to be sure that you have time to take your hand off the mouse before
+the screensaver comes on. (Because if you jiggle the mouse, xscreensaver
+will notice, and deactivate.)
+.TP 8
+.B \-deactivate
+This tells xscreensaver to pretend that there has just been user activity.
+This means that if the screensaver is active (the screen is blanked),
+then this command will cause the screen to un-blank as if there had been
+keyboard or mouse activity. If the screen is locked, then the password
+dialog will pop up first, as usual. If the screen is not blanked, then
+this simulated user activity will re-start the countdown (so, issuing
+the \fI\-deactivate\fP command periodically is \fIone\fP way to prevent
+the screen from blanking.)
+.TP 8
+.B \-cycle
+If the screensaver is active (the screen is blanked), then stop the current
+graphics demo and run a new one (chosen randomly.)
+.TP 8
+.B \-next
+This is like either \fI\-activate\fP or \fI\-cycle\fP, depending on which is
+more appropriate, except that the graphics hack that will be run is the next
+one in the list, instead of a randomly-chosen one. In other words,
+repeatedly executing -next will cause the xscreensaver process to invoke each
+graphics demo sequentially. (Though using the \fI\-demo\fP option is probably
+an easier way to accomplish that.)
+.TP 8
+.B \-prev
+This is like \fI\-next\fP, but cycles in the other direction.
+.TP 8
+.B \-select \fInumber\fP
+Like \fI\-activate\fP, but runs the \fIN\fPth element in the list of hacks.
+By knowing what is in the \fIprograms\fP list, and in what order, you can use
+this to activate the screensaver with a particular graphics demo. (The first
+element in the list is numbered 1, not 0.)
+.TP 8
+.B \-exit
+Causes the xscreensaver process to exit gracefully.
+This does nothing if the display is currently locked.
+
+.B Warning:
+never use \fIkill -9\fP with \fIxscreensaver\fP while the screensaver is
+active. If you are using a virtual root window manager, that can leave
+things in an inconsistent state, and you may need to restart your window
+manager to repair the damage.
+.TP 8
+.B \-lock
+Tells the running xscreensaver process to lock the screen immediately.
+This is like \fI\-activate\fP, but forces locking as well, even if locking
+is not the default (that is, even if xscreensaver's \fIlock\fP resource is
+false, and even if the \fIlockTimeout\fP resource is non-zero.)
+
+Note that locking doesn't work unless the \fIxscreensaver\fP process is
+running as you. See
+.BR xscreensaver (1)
+for details.
+.TP 8
+.B \-version
+Prints the version of xscreensaver that is currently running on the display:
+that is, the actual version number of the running xscreensaver background
+process, rather than the version number of xscreensaver-command. (To see
+the version number of \fIxscreensaver-command\fP itself, use
+the \fI\-help\fP option.)
+.TP 8
+.B \-time
+Prints the time at which the screensaver last activated or
+deactivated (roughly, how long the user has been idle or non-idle: but
+not quite, since it only tells you when the screen became blanked or
+un-blanked.)
+.TP 8
+.B \-restart
+Causes the screensaver process to exit and then restart with the same command
+line arguments as last time. You shouldn't really need to do this,
+since xscreensaver notices when the \fI.xscreensaver\fP file has
+changed and re-reads it as needed.
+.TP 8
+.B \-watch
+Prints a line each time the screensaver changes state: when the screen
+blanks, locks, unblanks, or when the running hack is changed. This option
+never returns; it is intended for use by shell scripts that want to react to
+the screensaver in some way. An example of its output would be:
+.EX
+BLANK Fri Nov 5 01:57:22 1999
+RUN 34
+RUN 79
+RUN 16
+LOCK Fri Nov 5 01:57:22 1999
+RUN 76
+RUN 12
+UNBLANK Fri Nov 5 02:05:59 1999
+.EE
+The above shows the screensaver activating, running three different
+hacks, then locking (perhaps because the lock-timeout went off) then
+unblanking (because the user became active, and typed the correct
+password.) The hack numbers are their index in the `programs'
+list (starting with 1, not 0, as for the \fI\-select\fP command.)
+
+For example, suppose you want to run a program that turns down the volume
+on your machine when the screen blanks, and turns it back up when the screen
+un-blanks. You could do that by running a Perl program like the following
+in the background. The following program tracks the output of
+the \fI\-watch\fP command and reacts accordingly:
+.EX
+#!/usr/bin/perl
+
+my $blanked = 0;
+open (IN, "xscreensaver-command -watch |");
+while (<IN>) {
+ if (m/^(BLANK|LOCK)/) {
+ if (!$blanked) {
+ system "sound-off";
+ $blanked = 1;
+ }
+ } elsif (m/^UNBLANK/) {
+ system "sound-on";
+ $blanked = 0;
+ }
+}
+.EE
+Note that LOCK might come either with or without a preceding BLANK
+(depending on whether the lock-timeout is non-zero), so the above program
+keeps track of both of them.
+.SH STOPPING GRAPHICS
+If xscreensaver is running, but you want it to stop running screen hacks
+(e.g., if you are logged in remotely, and you want the console to remain
+locked but just be black, with no graphics processes running) you can
+accomplish that by simply powering down the monitor remotely. In a
+minute or so, xscreensaver will notice that the monitor is off, and
+will stop running screen hacks. You can power off the monitor like so:
+.EX
+xset dpms force off
+.EE
+See the
+.BR xset (1)
+manual for more info.
+
+You can also use
+.BR xscreensaver-demo (1)
+to make the monitor power down after a few hours, meaning that xscreensaver
+will run graphics until it has been idle for the length of time you
+specified; and after that, the monitor will power off, and screen hacks
+will stop being run.
+.SH DIAGNOSTICS
+If an error occurs while communicating with the \fIxscreensaver\fP daemon, or
+if the daemon reports an error, a diagnostic message will be printed to
+stderr, and \fIxscreensaver-command\fP will exit with a non-zero value. If
+the command is accepted, an indication of this will be printed to stdout, and
+the exit value will be zero.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the host and display number of the screen whose saver is
+to be manipulated.
+.TP 8
+.B PATH
+to find the executable to restart (for the \fI\-restart\fP command).
+Note that this variable is consulted in the environment of
+the \fIxscreensaver\fP process, not the \fIxscreensaver-command\fP process.
+.SH UPGRADES
+The latest version of
+.BR xscreensaver (1)
+and related tools can always be found at https://www.jwz.org/xscreensaver/
+.SH "SEE ALSO"
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xset (1)
+.SH COPYRIGHT
+Copyright \(co 1992-2013 by Jamie Zawinski.
+Permission to use, copy, modify, distribute, and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 13-aug-1992.
+
+Please let me know if you find any bugs or make any improvements.
diff --git a/driver/xscreensaver-demo.glade2.in b/driver/xscreensaver-demo.glade2.in
new file mode 100644
index 0000000..ad0095d
--- /dev/null
+++ b/driver/xscreensaver-demo.glade2.in
@@ -0,0 +1,3136 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
+
+<glade-interface>
+<requires lib="gnome"/>
+
+<widget class="GtkWindow" id="xscreensaver_demo">
+ <property name="title" translatable="yes">XScreenSaver</property>
+ <property name="type">GTK_WINDOW_TOPLEVEL</property>
+ <property name="window_position">GTK_WIN_POS_NONE</property>
+ <property name="modal">False</property>
+ <property name="resizable">True</property>
+ <property name="destroy_with_parent">False</property>
+ <property name="decorated">True</property>
+ <property name="skip_taskbar_hint">False</property>
+ <property name="skip_pager_hint">False</property>
+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+ <property name="focus_on_map">True</property>
+ <property name="urgency_hint">False</property>
+
+ <child>
+ <widget class="GtkVBox" id="outer_vbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">5</property>
+
+ <child>
+ <widget class="GtkMenuBar" id="menubar">
+ <property name="visible">True</property>
+ <property name="pack_direction">GTK_PACK_DIRECTION_LTR</property>
+ <property name="child_pack_direction">GTK_PACK_DIRECTION_LTR</property>
+
+ <child>
+ <widget class="GtkMenuItem" id="file">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_File</property>
+ <property name="use_underline">True</property>
+ <signal name="activate" handler="file_menu_cb" last_modification_time="Sun, 06 Mar 2005 21:41:13 GMT"/>
+
+ <child>
+ <widget class="GtkMenu" id="file_menu">
+
+ <child>
+ <widget class="GtkMenuItem" id="activate_menu">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Blank Screen Now</property>
+ <property name="use_underline">True</property>
+ <signal name="activate" handler="activate_menu_cb"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="lock_menu">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Lock Screen Now</property>
+ <property name="use_underline">True</property>
+ <signal name="activate" handler="lock_menu_cb"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="kill_menu">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Kill Daemon</property>
+ <property name="use_underline">True</property>
+ <signal name="activate" handler="kill_menu_cb"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="restart">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Restart Daemon</property>
+ <property name="use_underline">True</property>
+ <signal name="activate" handler="restart_menu_cb"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="separator1">
+ <property name="visible">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="exit_menu">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Quit</property>
+ <property name="use_underline">True</property>
+ <signal name="activate" handler="exit_menu_cb"/>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="help">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Help</property>
+ <property name="use_underline">True</property>
+
+ <child>
+ <widget class="GtkMenu" id="help_menu">
+
+ <child>
+ <widget class="GtkMenuItem" id="about_menu">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_About...</property>
+ <property name="use_underline">True</property>
+ <signal name="activate" handler="about_menu_cb"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="doc_menu">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Documentation...</property>
+ <property name="use_underline">True</property>
+ <signal name="activate" handler="doc_menu_cb"/>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHBox" id="spacer_hbox">
+ <property name="border_width">8</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkNotebook" id="notebook">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_tabs">True</property>
+ <property name="show_border">True</property>
+ <property name="tab_pos">GTK_POS_TOP</property>
+ <property name="scrollable">False</property>
+ <property name="enable_popup">False</property>
+ <signal name="switch_page" handler="switch_page_cb"/>
+
+ <child>
+ <widget class="GtkTable" id="demos_table">
+ <property name="border_width">10</property>
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
+ <property name="homogeneous">False</property>
+ <property name="row_spacing">0</property>
+ <property name="column_spacing">0</property>
+
+ <child>
+ <widget class="GtkTable" id="blanking_table">
+ <property name="visible">True</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">4</property>
+ <property name="homogeneous">False</property>
+ <property name="row_spacing">2</property>
+ <property name="column_spacing">0</property>
+
+ <child>
+ <widget class="GtkLabel" id="cycle_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Cycle After</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_RIGHT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">8</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">cycle_spinbutton</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="cycle_spinbutton" type="label-for"/>
+ <atkrelation target="cycle_spinbutton" type="flows-to"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkEventBox" id="lock_button_eventbox">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Whether a password should be required to un-blank the screen.</property>
+ <property name="visible_window">True</property>
+ <property name="above_child">False</property>
+
+ <child>
+ <widget class="GtkCheckButton" id="lock_button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Lock Screen After </property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <accessibility>
+ <atkproperty name="AtkObject::accessible_name" translatable="yes">Lock Screen</atkproperty>
+ <atkrelation target="lock_spinbutton" type="controller-for"/>
+ <atkrelation target="lock_spinbutton" type="label-for"/>
+ <atkrelation target="lock_spinbutton" type="flows-to"/>
+ </accessibility>
+ <signal name="toggled" handler="pref_changed_cb"/>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkSpinButton" id="timeout_spinbutton">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">How long before the screen saver activates.</property>
+ <property name="can_focus">True</property>
+ <property name="climb_rate">15</property>
+ <property name="digits">0</property>
+ <property name="numeric">True</property>
+ <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">1 1 720 1 15 0</property>
+ <accessibility>
+ <atkrelation target="timeout_label" type="labelled-by"/>
+ <atkrelation target="timeout_mlabel" type="labelled-by"/>
+ <atkrelation target="timeout_label" type="flows-from"/>
+ <atkrelation target="timeout_mlabel" type="flows-to"/>
+ </accessibility>
+ <signal name="activate" handler="pref_changed_cb"/>
+ <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+ <signal name="value_changed" handler="pref_changed_cb"/>
+ </widget>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkSpinButton" id="lock_spinbutton">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">How long after the screen blanks until a password will be required.</property>
+ <property name="can_focus">True</property>
+ <property name="climb_rate">15</property>
+ <property name="digits">0</property>
+ <property name="numeric">True</property>
+ <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">0 0 720 1 15 0</property>
+ <accessibility>
+ <atkproperty name="AtkObject::accessible_name" translatable="yes">Lock Screen After</atkproperty>
+ <atkrelation target="lock_button" type="controlled-by"/>
+ <atkrelation target="lock_button" type="labelled-by"/>
+ <atkrelation target="lock_mlabel" type="labelled-by"/>
+ <atkrelation target="lock_button" type="flows-from"/>
+ <atkrelation target="lock_mlabel" type="flows-to"/>
+ </accessibility>
+ <signal name="activate" handler="pref_changed_cb"/>
+ <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+ <signal name="value_changed" handler="pref_changed_cb"/>
+ </widget>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_padding">10</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkSpinButton" id="cycle_spinbutton">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">How long each display mode should run before choosing a new one (in Random mode.)</property>
+ <property name="can_focus">True</property>
+ <property name="climb_rate">15</property>
+ <property name="digits">0</property>
+ <property name="numeric">True</property>
+ <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">0 0 720 1 15 0</property>
+ <accessibility>
+ <atkrelation target="cycle_label" type="labelled-by"/>
+ <atkrelation target="cycle_mlabel" type="labelled-by"/>
+ <atkrelation target="cycle_label" type="flows-from"/>
+ <atkrelation target="cycle_mlabel" type="flows-to"/>
+ </accessibility>
+ <signal name="activate" handler="pref_changed_cb"/>
+ <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+ <signal name="value_changed" handler="pref_changed_cb"/>
+ </widget>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="lock_mlabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">minutes</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">8</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="lock_spinbutton" type="label-for"/>
+ <atkrelation target="lock_spinbutton" type="flows-to"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="cycle_mlabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">minutes</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">8</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="cycle_spinbutton" type="label-for"/>
+ <atkrelation target="cycle_spinbutton" type="flows-from"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="timeout_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Blank After</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_RIGHT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">8</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">timeout_spinbutton</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="timeout_spinbutton" type="label-for"/>
+ <atkrelation target="timeout_spinbutton" type="flows-to"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="timeout_mlabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">minutes</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">8</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="timeout_spinbutton" type="label-for"/>
+ <atkrelation target="timeout_spinbutton" type="flows-from"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options">fill</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHButtonBox" id="demo_manual_hbbox">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_SPREAD</property>
+ <property name="spacing">30</property>
+
+ <child>
+ <widget class="GtkButton" id="demo">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Demo the selected screen saver in full-screen mode (click the mouse to return.)</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Preview</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal name="clicked" handler="run_this_cb"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="settings">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Customization and explanation of the selected screen saver.</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Settings...</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal name="clicked" handler="settings_cb"/>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options">fill</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkVBox" id="list_vbox">
+ <property name="border_width">10</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkHBox" id="mode_hbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkLabel" id="mode_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Mode:</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">mode_menu</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="mode_menu_popup" type="label-for"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkOptionMenu" id="mode_menu">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="history">0</property>
+ <accessibility>
+ <atkrelation target="mode_label" type="labelled-by"/>
+ </accessibility>
+
+ <child internal-child="menu">
+ <widget class="GtkMenu" id="mode_menu_popup">
+ <property name="visible">True</property>
+
+ <child>
+ <widget class="GtkMenuItem" id="disable_menuitem">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Never blank the screen or power down the monitor.</property>
+ <property name="label" translatable="yes">_Disable Screen Saver</property>
+ <property name="use_underline">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="blank_menuitem">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">When idle or locked, blacken the screen only.</property>
+ <property name="label" translatable="yes">_Blank Screen Only</property>
+ <property name="use_underline">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="one_menuitem">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">When idle or locked, run the display mode selected below.</property>
+ <property name="label" translatable="yes">_Only One Screen Saver</property>
+ <property name="use_underline">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="random_menuitem">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">When idle or locked, choose a random display mode from among the checked items in the list below.</property>
+ <property name="label" translatable="yes">_Random Screen Saver</property>
+ <property name="use_underline">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="random_same_menuitem">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">When idle or locked, choose a random display mode from among the checked items in the list below. Run that same mode on each monitor.</property>
+ <property name="label" translatable="yes">_Same Random Savers</property>
+ <property name="use_underline">True</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">4</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">10</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkScrolledWindow" id="scroller">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
+ <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
+ <property name="shadow_type">GTK_SHADOW_IN</property>
+ <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+ <child>
+ <widget class="GtkTreeView" id="list">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="headers_visible">False</property>
+ <property name="rules_hint">True</property>
+ <property name="reorderable">False</property>
+ <property name="enable_search">True</property>
+ <property name="fixed_height_mode">False</property>
+ <property name="hover_selection">False</property>
+ <property name="hover_expand">False</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHBox" id="centering_hbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">True</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkHBox" id="next_prev_hbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkButton" id="next">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Run the next screen saver in the list in full-screen mode (click the mouse to return.)</property>
+ <property name="can_focus">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal name="clicked" handler="run_next_cb"/>
+
+ <child>
+ <widget class="GtkArrow" id="arrow1">
+ <property name="visible">True</property>
+ <property name="arrow_type">GTK_ARROW_DOWN</property>
+ <property name="shadow_type">GTK_SHADOW_OUT</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="prev">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Run the previous screen saver in the list in full-screen mode (click the mouse to return.)</property>
+ <property name="can_focus">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal name="clicked" handler="run_prev_cb"/>
+
+ <child>
+ <widget class="GtkArrow" id="arrow2">
+ <property name="visible">True</property>
+ <property name="arrow_type">GTK_ARROW_UP</property>
+ <property name="shadow_type">GTK_SHADOW_OUT</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">GTK_PACK_END</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkFrame" id="preview_frame">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="label_yalign">0.5</property>
+ <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+ <accessibility>
+ <atkrelation target="label1" type="labelled-by"/>
+ </accessibility>
+
+ <child>
+ <widget class="GtkNotebook" id="preview_notebook">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_tabs">True</property>
+ <property name="show_border">False</property>
+ <property name="tab_pos">GTK_POS_BOTTOM</property>
+ <property name="scrollable">False</property>
+ <property name="enable_popup">False</property>
+
+ <child>
+ <widget class="GtkAspectFrame" id="preview_aspectframe">
+ <property name="border_width">8</property>
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="label_yalign">0.5</property>
+ <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="ratio">1.33000004292</property>
+ <property name="obey_child">False</property>
+
+ <child>
+ <widget class="GtkDrawingArea" id="preview">
+ <property name="visible">True</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="preview_tab">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">preview</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="no_preview_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">No Preview
+Available</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_CENTER</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="no_preview_tab">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">no preview</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="not_installed_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Not
+Installed</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_CENTER</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="not_installed_tab">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">not installed</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="nothing_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Very few (or no) screen savers appear to be available.
+
+This probably means that the &quot;xscreensaver-extras&quot; and
+&quot;xscreensaver-gl-extras&quot; packages are not installed.</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_CENTER</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="nothing_tab">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">nothing</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Description</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="preview_frame" type="label-for"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="y_padding">6</property>
+ <property name="x_options">expand|shrink|fill</property>
+ <property name="y_options">expand|shrink|fill</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="demo_tab">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Display Modes</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_CENTER</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">notebook</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkTable" id="options_table">
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
+ <property name="homogeneous">True</property>
+ <property name="row_spacing">0</property>
+ <property name="column_spacing">0</property>
+
+ <child>
+ <widget class="GtkFrame" id="grab_frame">
+ <property name="border_width">10</property>
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="label_yalign">0.5</property>
+ <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+ <accessibility>
+ <atkrelation target="label2" type="labelled-by"/>
+ </accessibility>
+
+ <child>
+ <widget class="GtkHBox" id="grab_hbox">
+ <property name="border_width">8</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">8</property>
+
+ <child>
+ <widget class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="pixbuf">screensaver-snap.png</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="xpad">4</property>
+ <property name="ypad">8</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkVBox" id="grab_vbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkCheckButton" id="grab_desk_button">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Whether the image-manipulating modes should be allowed to operate on an image of your desktop.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Grab Desktop _Images</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="pref_changed_cb"/>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkCheckButton" id="grab_video_button">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Whether the image-manipulating modes should operate on images captured from the system's video input (if there is one.)</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Grab _Video Frames</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="pref_changed_cb"/>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkCheckButton" id="grab_image_button">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Whether the image-manipulating modes should load image files.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Choose _Random Image:</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <accessibility>
+ <atkrelation target="image_text" type="controller-for"/>
+ <atkrelation target="image_browse_button" type="controller-for"/>
+ </accessibility>
+ <signal name="toggled" handler="pref_changed_cb"/>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHBox" id="image_hbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkLabel" id="grab_dummy">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"></property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">8</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkEntry" id="image_text">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">The local directory, RSS feed or Atom feed from which images will be randomly chosen.</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes"></property>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">*</property>
+ <property name="activates_default">False</property>
+ <accessibility>
+ <atkrelation target="grab_image_button" type="labelled-by"/>
+ <atkrelation target="grab_image_button" type="controlled-by"/>
+ </accessibility>
+ <signal name="activate" handler="pref_changed_cb"/>
+ <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+ </widget>
+ <packing>
+ <property name="padding">2</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="image_browse_button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Browse</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal name="clicked" handler="browse_image_dir_cb"/>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Local directory, or RSS feed URL.</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">20</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Image Manipulation</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="grab_frame" type="label-for"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkFrame" id="diag_frame">
+ <property name="border_width">10</property>
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="label_yalign">0.5</property>
+ <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+ <accessibility>
+ <atkrelation target="label3" type="labelled-by"/>
+ </accessibility>
+
+ <child>
+ <widget class="GtkHBox" id="diag_hbox">
+ <property name="border_width">8</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">8</property>
+
+ <child>
+ <widget class="GtkImage" id="diag_logo">
+ <property name="visible">True</property>
+ <property name="pixbuf">screensaver-diagnostic.png</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkTable" id="text_table">
+ <property name="visible">True</property>
+ <property name="n_rows">5</property>
+ <property name="n_columns">3</property>
+ <property name="homogeneous">False</property>
+ <property name="row_spacing">2</property>
+ <property name="column_spacing">2</property>
+
+ <child>
+ <widget class="GtkRadioButton" id="text_radio">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Text-displaying modes will display the text typed here.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Text</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <accessibility>
+ <atkrelation target="text_entry" type="controller-for"/>
+ <atkrelation target="text_entry" type="label-for"/>
+ </accessibility>
+ <signal name="toggled" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:31:44 GMT"/>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkRadioButton" id="text_file_radio">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Text-displaying modes will display the contents of this file.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Text _file</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">text_radio</property>
+ <accessibility>
+ <atkrelation target="text_file_entry" type="label-for"/>
+ <atkrelation target="text_file_entry" type="controller-for"/>
+ </accessibility>
+ <signal name="toggled" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:31:55 GMT"/>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkRadioButton" id="text_program_radio">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Text-displaying modes will display the output of this program.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Program</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">text_radio</property>
+ <accessibility>
+ <atkrelation target="text_program_entry" type="label-for"/>
+ <atkrelation target="text_program_entry" type="controller-for"/>
+ <atkrelation target="text_program_browse" type="controller-for"/>
+ </accessibility>
+ <signal name="toggled" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:32:07 GMT"/>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkRadioButton" id="text_url_radio">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Text-displaying modes will display the contents of this URL (HTML or RSS).</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_URL</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">text_radio</property>
+ <accessibility>
+ <atkrelation target="text_url_entry" type="label-for"/>
+ <atkrelation target="text_url_entry" type="controller-for"/>
+ </accessibility>
+ <signal name="toggled" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:32:17 GMT"/>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkRadioButton" id="text_host_radio">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Text-displaying modes will display the local host name, date, and time.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Host Name and Time</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">True</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">text_radio</property>
+ <signal name="toggled" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:31:32 GMT"/>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkEntry" id="text_url_entry">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Text-displaying modes will display the contents of this URL (HTML or RSS).</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes"></property>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">*</property>
+ <property name="activates_default">False</property>
+ <accessibility>
+ <atkrelation target="text_url_radio" type="controlled-by"/>
+ </accessibility>
+ <signal name="activate" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:33:10 GMT"/>
+ <signal name="focus_out_event" handler="pref_changed_event_cb" last_modification_time="Sun, 20 Mar 2005 21:34:26 GMT"/>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="text_file_browse">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Browse</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <accessibility>
+ <atkrelation target="text_file_radio" type="controlled-by"/>
+ </accessibility>
+ <signal name="clicked" handler="browse_text_file_cb" last_modification_time="Sun, 20 Mar 2005 01:24:38 GMT"/>
+ </widget>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkEntry" id="text_entry">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Text-displaying modes will display the text typed here.</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes"></property>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">*</property>
+ <property name="activates_default">False</property>
+ <accessibility>
+ <atkrelation target="text_program_radio" type="labelled-by"/>
+ <atkrelation target="text_program_radio" type="controlled-by"/>
+ </accessibility>
+ <signal name="activate" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:32:42 GMT"/>
+ <signal name="focus_out_event" handler="pref_changed_event_cb" last_modification_time="Sun, 20 Mar 2005 21:33:43 GMT"/>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkEntry" id="text_program_entry">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Text-displaying modes will display the output of this program.</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes"></property>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">*</property>
+ <property name="activates_default">False</property>
+ <accessibility>
+ <atkrelation target="text_program_radio" type="labelled-by"/>
+ <atkrelation target="text_program_radio" type="controlled-by"/>
+ </accessibility>
+ <signal name="activate" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:33:02 GMT"/>
+ <signal name="focus_out_event" handler="pref_changed_event_cb" last_modification_time="Sun, 20 Mar 2005 21:34:15 GMT"/>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="text_program_browse">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Browse</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <accessibility>
+ <atkrelation target="text_program_radio" type="controller-for"/>
+ </accessibility>
+ <signal name="clicked" handler="browse_text_program_cb" last_modification_time="Sun, 20 Mar 2005 01:24:51 GMT"/>
+ </widget>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkEntry" id="text_file_entry">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Text-displaying modes will display the contents of this file.</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes"></property>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">*</property>
+ <property name="activates_default">False</property>
+ <accessibility>
+ <atkrelation target="text_file_radio" type="labelled-by"/>
+ <atkrelation target="text_file_radio" type="controlled-by"/>
+ </accessibility>
+ <signal name="activate" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:32:53 GMT"/>
+ <signal name="focus_out_event" handler="pref_changed_event_cb" last_modification_time="Sun, 20 Mar 2005 21:33:55 GMT"/>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Text Manipulation</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="diag_frame" type="label-for"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkFrame" id="dpms_frame">
+ <property name="border_width">10</property>
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="label_yalign">0.5</property>
+ <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+
+ <child>
+ <widget class="GtkHBox" id="dpms_hbox">
+ <property name="border_width">8</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">8</property>
+
+ <child>
+ <widget class="GtkImage" id="dpms_logo">
+ <property name="visible">True</property>
+ <property name="pixbuf">screensaver-power.png</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkVBox" id="vbox6">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkCheckButton" id="dpms_button">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Whether the monitor should be powered down after a while.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Power Management Enabled</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">True</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <accessibility>
+ <atkrelation target="dpms_suspend_spinbutton" type="controller-for"/>
+ <atkrelation target="dpms_standby_spinbutton" type="controller-for"/>
+ <atkrelation target="dpms_off_spinbutton" type="controller-for"/>
+ </accessibility>
+ <signal name="toggled" handler="pref_changed_cb"/>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkTable" id="dpms_table">
+ <property name="visible">True</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">3</property>
+ <property name="homogeneous">False</property>
+ <property name="row_spacing">2</property>
+ <property name="column_spacing">4</property>
+
+ <child>
+ <widget class="GtkLabel" id="dpms_standby_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Stand_by After</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">10</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">dpms_standby_spinbutton</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="dpms_standby_spinbutton" type="label-for"/>
+ <atkrelation target="dpms_standby_spinbutton" type="flows-to"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="dpms_suspend_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Sus_pend After</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">10</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">dpms_suspend_spinbutton</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="dpms_suspend_spinbutton" type="label-for"/>
+ <atkrelation target="dpms_suspend_spinbutton" type="flows-to"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="dpms_off_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Off After</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">10</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">dpms_off_spinbutton</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="dpms_off_spinbutton" type="label-for"/>
+ <atkrelation target="dpms_off_spinbutton" type="flows-to"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="dpms_standby_mlabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">minutes</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="dpms_standby_spinbutton" type="label-for"/>
+ <atkrelation target="dpms_standby_spinbutton" type="flows-from"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="dpms_suspend_mlabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">minutes</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="dpms_suspend_spinbutton" type="label-for"/>
+ <atkrelation target="dpms_suspend_spinbutton" type="flows-from"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="dpms_off_mlabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">minutes</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="dpms_off_spinbutton" type="label-for"/>
+ <atkrelation target="dpms_off_spinbutton" type="flows-from"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkSpinButton" id="dpms_off_spinbutton">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">How long until the monitor powers down.</property>
+ <property name="can_focus">True</property>
+ <property name="climb_rate">15</property>
+ <property name="digits">0</property>
+ <property name="numeric">True</property>
+ <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">0 0 1440 1 15 0</property>
+ <accessibility>
+ <atkrelation target="dpms_button" type="controlled-by"/>
+ <atkrelation target="dpms_off_label" type="labelled-by"/>
+ <atkrelation target="dpms_off_mlabel" type="labelled-by"/>
+ <atkrelation target="dpms_off_label" type="flows-from"/>
+ <atkrelation target="dpms_off_mlabel" type="flows-to"/>
+ </accessibility>
+ <signal name="activate" handler="pref_changed_cb"/>
+ <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+ <signal name="value_changed" handler="pref_changed_cb"/>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options"></property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkSpinButton" id="dpms_suspend_spinbutton">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">How long until the monitor goes into power-saving mode.</property>
+ <property name="can_focus">True</property>
+ <property name="climb_rate">15</property>
+ <property name="digits">0</property>
+ <property name="numeric">True</property>
+ <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">0 0 1440 1 15 0</property>
+ <accessibility>
+ <atkrelation target="dpms_button" type="controlled-by"/>
+ <atkrelation target="dpms_suspend_label" type="labelled-by"/>
+ <atkrelation target="dpms_suspend_mlabel" type="labelled-by"/>
+ <atkrelation target="dpms_suspend_label" type="flows-from"/>
+ <atkrelation target="dpms_suspend_mlabel" type="flows-to"/>
+ </accessibility>
+ <signal name="activate" handler="pref_changed_cb"/>
+ <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+ <signal name="value_changed" handler="pref_changed_cb"/>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options"></property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkSpinButton" id="dpms_standby_spinbutton">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">How long until the monitor goes completely black.</property>
+ <property name="can_focus">True</property>
+ <property name="climb_rate">15</property>
+ <property name="digits">0</property>
+ <property name="numeric">True</property>
+ <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">0 0 1440 1 15 0</property>
+ <accessibility>
+ <atkrelation target="dpms_button" type="controlled-by"/>
+ <atkrelation target="dpms_standby_label" type="labelled-by"/>
+ <atkrelation target="dpms_standby_mlabel" type="labelled-by"/>
+ <atkrelation target="dpms_standby_label" type="flows-from"/>
+ <atkrelation target="dpms_standby_mlabel" type="flows-to"/>
+ </accessibility>
+ <signal name="activate" handler="pref_changed_cb"/>
+ <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+ <signal name="value_changed" handler="pref_changed_cb"/>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options"></property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkCheckButton" id="dpms_quickoff_button">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Whether the monitor should be powered off immediately in "Blank Screen Only" mode, regardless of the above power-management timeouts.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Quick Power-off in Blank Only Mode</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="pref_changed_cb"/>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Display Power Management</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="dpms_frame" type="label-for"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="y_options">fill</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkFrame" id="cmap_frame">
+ <property name="border_width">10</property>
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="label_yalign">0.5</property>
+ <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+ <accessibility>
+ <atkrelation target="label5" type="labelled-by"/>
+ </accessibility>
+
+ <child>
+ <widget class="GtkHBox" id="cmap_hbox">
+ <property name="border_width">8</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">8</property>
+
+ <child>
+ <widget class="GtkImage" id="image5">
+ <property name="visible">True</property>
+ <property name="pixbuf">screensaver-colorselector.png</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkVBox" id="vbox7">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkCheckButton" id="fade_button">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Whether the screen should slowly fade to black when the screen saver activates.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Fade to Black when _Blanking</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <accessibility>
+ <atkrelation target="fade_spinbutton" type="controller-for"/>
+ </accessibility>
+ <signal name="toggled" handler="pref_changed_cb"/>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkCheckButton" id="unfade_button">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Whether the screen should slowly fade in from black when the screen saver deactivates.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Fade from Black When _Unblanking</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <accessibility>
+ <atkrelation target="fade_spinbutton" type="controller-for"/>
+ </accessibility>
+ <signal name="toggled" handler="pref_changed_cb"/>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHBox" id="fade_hbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkLabel" id="fade_dummy">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"></property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">3</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="fade_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">F_ade Duration</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">fade_spinbutton</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="fade_spinbutton" type="label-for"/>
+ <atkrelation target="fade_spinbutton" type="flows-to"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="padding">14</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkSpinButton" id="fade_spinbutton">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">How long it should take for the screen to fade in and out.</property>
+ <property name="can_focus">True</property>
+ <property name="climb_rate">1</property>
+ <property name="digits">0</property>
+ <property name="numeric">True</property>
+ <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+ <property name="snap_to_ticks">True</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">0 0 10 1 1 0</property>
+ <accessibility>
+ <atkrelation target="unfade_button" type="controlled-by"/>
+ <atkrelation target="fade_button" type="controlled-by"/>
+ <atkrelation target="fade_label" type="labelled-by"/>
+ <atkrelation target="fade_sec_label" type="labelled-by"/>
+ <atkrelation target="fade_label" type="flows-from"/>
+ <atkrelation target="fade_sec_label" type="flows-to"/>
+ </accessibility>
+ <signal name="activate" handler="pref_changed_cb"/>
+ <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+ <signal name="value_changed" handler="pref_changed_cb"/>
+ </widget>
+ <packing>
+ <property name="padding">4</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="fade_sec_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">seconds</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="fade_spinbutton" type="label-for"/>
+ <atkrelation target="fade_spinbutton" type="flows-from"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="padding">2</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHSeparator" id="cmap_hr">
+ <property name="visible">True</property>
+ </widget>
+ <packing>
+ <property name="padding">8</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkCheckButton" id="install_button">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Whether to install a private colormap when running in 8-bit mode on the default Visual.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Install _Colormap</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="pref_changed_cb"/>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Fading and Colormaps</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="cmap_frame" type="label-for"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options">fill</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="options_tab">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Advanced</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">notebook</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHButtonBox" id="hbuttonbox2">
+ <property name="border_width">5</property>
+ <property name="layout_style">GTK_BUTTONBOX_EDGE</property>
+ <property name="spacing">10</property>
+
+ <child>
+ <widget class="GtkButton" id="helpbutton">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label">gtk-help</property>
+ <property name="use_stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal name="clicked" handler="doc_menu_cb"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="closebutton">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label">gtk-close</property>
+ <property name="use_stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal name="clicked" handler="exit_menu_cb"/>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">GTK_PACK_END</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+</widget>
+
+<widget class="GtkDialog" id="xscreensaver_settings_dialog">
+ <property name="title" translatable="yes">dialog1</property>
+ <property name="type">GTK_WINDOW_TOPLEVEL</property>
+ <property name="window_position">GTK_WIN_POS_NONE</property>
+ <property name="modal">False</property>
+ <property name="resizable">True</property>
+ <property name="destroy_with_parent">False</property>
+ <property name="decorated">True</property>
+ <property name="skip_taskbar_hint">False</property>
+ <property name="skip_pager_hint">False</property>
+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+ <property name="focus_on_map">True</property>
+ <property name="urgency_hint">False</property>
+ @COMMENT_DEMO_GLADE2_GTK_2_22_HEAD@<property name="has_separator">False</property>@COMMENT_DEMO_GLADE2_GTK_2_22_TAIL@
+
+ <child internal-child="vbox">
+ <widget class="GtkVBox" id="dialog_vbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child internal-child="action_area">
+ <widget class="GtkHButtonBox" id="dialog_action_area">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+ <child>
+ <widget class="GtkButton" id="adv_button">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Advanced &gt;&gt;</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="response_id">0</property>
+ <signal name="clicked" handler="settings_adv_cb"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="std_button">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Standard &lt;&lt;</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="response_id">0</property>
+ <signal name="clicked" handler="settings_std_cb"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="reset_button">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Reset to Defaults</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="response_id">0</property>
+ <signal name="clicked" handler="settings_reset_cb"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="cancel_button">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label">gtk-cancel</property>
+ <property name="use_stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="response_id">-6</property>
+ <signal name="clicked" handler="settings_cancel_cb"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="ok_button">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label">gtk-ok</property>
+ <property name="use_stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="response_id">-5</property>
+ <signal name="clicked" handler="settings_ok_cb"/>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">GTK_PACK_END</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkFrame" id="opt_frame">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="label_yalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+ <accessibility>
+ <atkrelation target="label6" type="labelled-by"/>
+ </accessibility>
+
+ <child>
+ <widget class="GtkNotebook" id="opt_notebook">
+ <property name="border_width">12</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_tabs">True</property>
+ <property name="show_border">False</property>
+ <property name="tab_pos">GTK_POS_BOTTOM</property>
+ <property name="scrollable">False</property>
+ <property name="enable_popup">False</property>
+ <signal name="switch_page" handler="settings_switch_page_cb"/>
+
+ <child>
+ <widget class="GtkVBox" id="settings_vbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <placeholder/>
+ </child>
+ </widget>
+ <packing>
+ <property name="tab_expand">True</property>
+ <property name="tab_fill">True</property>
+ <property name="tab_pack">GTK_PACK_END</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="std_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Standard</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkTable" id="adv_table">
+ <property name="visible">True</property>
+ <property name="n_rows">4</property>
+ <property name="n_columns">2</property>
+ <property name="homogeneous">False</property>
+ <property name="row_spacing">0</property>
+ <property name="column_spacing">0</property>
+
+ <child>
+ <widget class="GtkImage" id="cmd_logo">
+ <property name="visible">True</property>
+ <property name="pixbuf">screensaver-cmndln.png</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">4</property>
+ <property name="ypad">8</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options">fill</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="cmd_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Command Line:</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">cmd_text</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="cmd_text" type="label-for"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkEntry" id="cmd_text">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes"></property>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">*</property>
+ <property name="activates_default">False</property>
+ <accessibility>
+ <atkrelation target="cmd_label" type="labelled-by"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHBox" id="visual_hbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkLabel" id="visual">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Visual:</property>
+ <property name="use_underline">True</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">3</property>
+ <property name="ypad">0</property>
+ <property name="mnemonic_widget">visual_entry</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="visual_combo" type="label-for"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkCombo" id="visual_combo">
+ <property name="visible">True</property>
+ <property name="value_in_list">False</property>
+ <property name="allow_empty">True</property>
+ <property name="case_sensitive">False</property>
+ <property name="enable_arrow_keys">True</property>
+ <property name="enable_arrows_always">False</property>
+ <accessibility>
+ <atkrelation target="visual" type="labelled-by"/>
+ </accessibility>
+
+ <child internal-child="entry">
+ <widget class="GtkEntry" id="visual_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes"></property>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">*</property>
+ <property name="activates_default">False</property>
+ </widget>
+ </child>
+
+ <child internal-child="list">
+ <widget class="GtkList" id="combo-list1">
+ <property name="visible">True</property>
+ <property name="selection_mode">GTK_SELECTION_BROWSE</property>
+
+ <child>
+ <widget class="GtkListItem" id="listitem25">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Any</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkListItem" id="listitem26">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Best</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkListItem" id="listitem27">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Default</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkListItem" id="listitem28">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Default-N</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkListItem" id="listitem29">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">GL</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkListItem" id="listitem30">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">TrueColor</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkListItem" id="listitem31">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">PseudoColor</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkListItem" id="listitem32">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">StaticGray</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkListItem" id="listitem33">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">GrayScale</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkListItem" id="listitem34">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">DirectColor</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkListItem" id="listitem35">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Color</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkListItem" id="listitem36">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Gray</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkListItem" id="listitem37">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Mono</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">fill</property>
+ <property name="y_options">fill</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="adv_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Advanced</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Settings</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ <accessibility>
+ <atkrelation target="opt_frame" type="label-for"/>
+ </accessibility>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkFrame" id="doc_frame">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="label_yalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+
+ <child>
+ <widget class="GtkVBox" id="doc_vbox">
+ <property name="border_width">5</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">5</property>
+
+ <child>
+ <widget class="GtkLabel" id="doc">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes"></property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">True</property>
+ <property name="selectable">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkButton" id="manual">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Documentation...</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal name="clicked" handler="manual_cb"/>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">GTK_PACK_END</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"></property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+</widget>
+
+</glade-interface>
diff --git a/driver/xscreensaver-demo.glade2p b/driver/xscreensaver-demo.glade2p
new file mode 100644
index 0000000..3dfe894
--- /dev/null
+++ b/driver/xscreensaver-demo.glade2p
@@ -0,0 +1,19 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-project SYSTEM "http://glade.gnome.org/glade-project-2.0.dtd">
+
+<glade-project>
+ <name>XScreenSaver Demo</name>
+ <program_name>xscreensaver-demo</program_name>
+ <source_directory></source_directory>
+ <pixmaps_directory>../utils/images</pixmaps_directory>
+ <use_widget_names>TRUE</use_widget_names>
+ <output_main_file>FALSE</output_main_file>
+ <output_build_files>FALSE</output_build_files>
+ <backup_source_files>FALSE</backup_source_files>
+ <main_source_file>demo-Gtk2-widgets.c</main_source_file>
+ <main_header_file>demo-Gtk2-widgets.h</main_header_file>
+ <handler_source_file>demo-Gtk2-stubs.c</handler_source_file>
+ <handler_header_file>demo-Gtk2-stubs.h</handler_header_file>
+ <support_source_file>demo-Gtk2-support.c</support_source_file>
+ <support_header_file>demo-Gtk2-support.h</support_header_file>
+</glade-project>
diff --git a/driver/xscreensaver-demo.man b/driver/xscreensaver-demo.man
new file mode 100644
index 0000000..7da5fea
--- /dev/null
+++ b/driver/xscreensaver-demo.man
@@ -0,0 +1,402 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "09-Nov-2013 (5.23)" "X Version 11"
+.SH NAME
+xscreensaver-demo - interactively control the background xscreensaver daemon
+.SH SYNOPSIS
+.B xscreensaver\-demo
+[\-display \fIhost:display.screen\fP]
+[\-prefs]
+[--debug]
+.SH DESCRIPTION
+The \fIxscreensaver\-demo\fP program is a graphical front-end for
+setting the parameters used by the background
+.BR xscreensaver (1)
+daemon.
+It is essentially two things: a tool for editing the \fI~/.xscreensaver\fP
+file; and a tool for demoing the various graphics hacks that
+the \fIxscreensaver\fP daemon will launch.
+
+The main window consists of a menu bar and two tabbed pages. The first page
+is for editing the list of demos, and the second is for editing various other
+parameters of the screensaver.
+.SH MENU COMMANDS
+All of these commands are on either the \fBFile\fP or \fBHelp\fP menus:
+.TP 4
+.B Blank Screen Now
+Activates the background \fIxscreensaver\fP daemon, which will then run
+a demo at random. This is the same as running
+.BR xscreensaver-command (1)
+with the \fI\-activate\fP option.
+.TP 4
+.B Lock Screen Now
+Just like \fBBlank Screen Now\fP, except the screen will be locked as
+well (even if it is not configured to lock all the time.) This is the
+same as running
+.BR xscreensaver-command (1)
+with the \fI\-lock\fP option.
+.TP 4
+.B Kill Daemon
+If the xscreensaver daemon is running on this screen, kill it.
+This is the same as running
+.BR xscreensaver-command (1)
+with the \fI\-exit\fP option.
+.TP 4
+.B Restart Daemon
+If the xscreensaver daemon is running on this screen, kill it.
+Then launch it again. This is the same as doing
+``\fIxscreensaver-command -exit\fP'' followed by ``\fIxscreensaver\fP''.
+
+Note that it is \fInot\fP the same as doing
+``\fIxscreensaver-command -restart\fP''.
+.TP 4
+.B Exit
+Exits the \fIxscreensaver-demo\fP program (this program) without
+affecting the background \fIxscreensaver\fP daemon, if any.
+.TP 4
+.B About...
+Displays the version number of this program, \fIxscreensaver-demo\fP.
+.TP 4
+.B Documentation...
+Opens up a web browser looking at the XScreenSaver web page, where you
+can find online copies of the
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+and
+.BR xscreensaver\-command (1)
+manuals.
+.SH DISPLAY MODES TAB
+This page contains a list of the names of the various display modes, a
+preview area, and some fields that let you configure screen saver behavior.
+.TP 4
+.B Mode
+This option menu controls the activation behavior of the screen saver.
+The options are:
+.RS 4
+.TP 4
+.B Disable Screen Saver
+Don't ever blank the screen, and don't ever allow the monitor to power down.
+.TP 4
+.B Blank Screen Only
+When blanking the screen, just go black: don't run any graphics.
+.TP 4
+.B Only One Screen Saver
+When blanking the screen, only ever use one particular display mode (the
+one selected in the list.)
+.TP 4
+.B Random Screen Saver
+When blanking the screen, select a random display mode from among those
+that are enabled and applicable. If there are multiple monitors
+connected, run a different display mode on each one. This is the default.
+.TP 4
+.B Random Same Saver
+This is just like \fBRandom Screen Saver\fP, except that the \fIsame\fP
+randomly-chosen display mode will be run on all monitors, instead of
+different ones on each.
+.RE
+.TP 4
+.B Demo List
+Double-clicking in the list on the left will let you try out the indicated
+demo. The screen will go black, and the program will run in full-screen
+mode, just as it would if the \fIxscreensaver\fP daemon had launched it.
+Clicking the mouse again will stop the demo and un-blank the screen.
+
+Single-clicking in the list will run it in the small preview pane on the
+right. (But beware: many of the display modes behave somewhat differently
+when running in full-screen mode, so the scaled-down view might not give
+an accurate impression.)
+
+When \fBMode\fP is set to \fBRandom Screen Saver\fP, each name in the list
+has a checkbox next to it: this controls whether this display mode is
+enabled. If it is unchecked, then that mode will not be chosen. (Though
+you can still run it explicitly by double-clicking on its name.)
+.TP 4
+.B Arrow Buttons
+Beneath the list are a pair of up and down arrows. Clicking on the down
+arrow will select the next item in the list, and then run it in full-screen
+mode, just as if you had double-clicked on it. The up arrow goes the other
+way. This is just a shortcut for trying out all of the display modes in turn.
+.TP 4
+.B Blank After
+After the user has been idle this long, the \fIxscreensaver\fP daemon
+will blank the screen.
+.TP 4
+.B Cycle After
+After the screensaver has been running for this long, the currently
+running graphics demo will be killed, and a new one started.
+If this is 0, then the graphics demo will never be changed:
+only one demo will run until the screensaver is deactivated by user
+activity.
+
+The running saver will be restarted every this-many minutes even in
+\fIOnly One Screen Saver\fP mode, since some savers tend to converge
+on a steady state.
+.TP 4
+.B Lock Screen
+When this is checked, the screen will be locked when it activates.
+.TP 4
+.B Lock Screen After
+This controls the length of the ``grace period'' between when the
+screensaver activates, and when the screen becomes locked. For
+example, if this is 5 minutes, and \fIBlank After\fP is 10 minutes,
+then after 10 minutes, the screen would blank. If there was user
+activity at 12 minutes, no password would be required to un-blank the
+screen. But, if there was user activity at 15 minutes or later (that
+is, \fILock Screen After\fP minutes after activation) then a password
+would be required. The default is 0, meaning that if locking is
+enabled, then a password will be required as soon as the screen blanks.
+.TP 4
+.B Preview
+This button, below the small preview window, runs the demo in full-screen
+mode so that you can try it out. This is the same thing that happens when
+you double-click an element in the list. Click the mouse to dismiss the
+full-screen preview.
+.TP 4
+.B Settings
+This button will pop up a dialog where you can configure settings specific
+to the display mode selected in the list.
+.SH SETTINGS DIALOG
+When you click on the \fISettings\fP button on the \fIDisplay Modes\fP
+tab, a configuration dialog will pop up that lets you customize settings
+of the selected display mode. Each display mode has its own custom
+configuration controls on the left side.
+
+On the right side is a paragraph or two describing the display mode.
+Below that is a \fBDocumentation\fP button that will display the display
+mode's manual page, if it has one, in a new window (since each of the
+display modes is actually a separate program, they each have their
+own manual.)
+
+The \fBAdvanced\fP button reconfigures the dialog box so that you can
+edit the display mode's command line directly, instead of using the
+graphical controls.
+.SH ADVANCED TAB
+This tab lets you change various settings used by the xscreensaver daemon
+itself, as well as some global options shared by all of the display modes.
+
+.B Image Manipulation
+
+Some of the graphics hacks manipulate images. These settings control
+where those source images come from.
+(All of these options work by invoking the
+.BR xscreensaver\-getimage (1)
+program, which is what actually does the work.)
+.RS 4
+.TP 4
+.B Grab Desktop Images
+If this option is selected, then they are allowed to manipulate the
+desktop image, that is, a display mode might draw a picture of your
+desktop melting, or being distorted in some way. The
+security-paranoid might want to disable this option, because if it is
+set, it means that the windows on your desktop will occasionally be
+visible while your screen is locked. Others will not be able to
+\fIdo\fP anything, but they may be able to \fIsee\fP whatever you left
+on your screen.
+.TP 4
+.B Grab Video Frames
+If your system has a video capture card, selecting this option will allow
+the image-manipulating modes to capture a frame of video to operate on.
+.TP 4
+.B Choose Random Image
+If this option is set, then the image-manipulating modes will select a
+random image file to operate on, from the specified source. That
+source may be a local directory, which will be recursively searched
+for images. Or, it may be the URL of an RSS or Atom feed (e.g., a
+Flickr gallery), in which case a random image from that feed will be
+selected instead. The contents of the feed will be cached locally and
+refreshed periodically as needed.
+.PP
+If more than one of the above image-related options are selected, then
+one will be chosen at random. If none of them are selected, then an
+image of video colorbars will be used instead.
+.RE
+.PP
+.B Text Manipulation
+
+Some of the display modes display and manipulate text. The following
+options control how that text is generated. (These parameters control
+the behavior of the
+.BR xscreensaver\-text (1)
+program, which is what actually does the work.)
+.RS 4
+.TP 4
+.B Host Name and Time
+If this checkbox is selected, then the text used by the screen savers
+will be the local host name, OS version, date, time, and system load.
+.TP 4
+.B Text
+If this checkbox is selected, then the literal text typed in the
+field to its right will be used. If it contains % escape sequences,
+they will be expanded as per
+.BR strftime (2).
+.TP 4
+.B Text File
+If this checkbox is selected, then the contents of the corresponding
+file will be displayed.
+.TP 4
+.B Program
+If this checkbox is selected, then the given program will be run,
+repeatedly, and its output will be displayed.
+.TP 4
+.B URL
+If this checkbox is selected, then the given HTTP URL will be downloaded
+and displayed repeatedly. If the document contains HTML, RSS, or Atom,
+it will be converted to plain-text first.
+
+Note: this re-downloads the document every time the screen saver
+runs out of text, so it will probably be hitting that web server multiple
+times a minute. Be careful that the owner of that server doesn't
+consider that to be abusive.
+.RE
+.PP
+.B Power Management Settings
+
+These settings control whether, and when, your monitor powers down.
+.RS 4
+.TP 4
+.B Power Management Enabled
+Whether the monitor should be powered down after a period of inactivity.
+
+If this option is grayed out, it means your X server does not support
+the XDPMS extension, and so control over the monitor's power state is
+not available.
+
+If you're using a laptop, don't be surprised if this has no effect:
+many laptops have monitor power-saving behavior built in at a very low
+level that is invisible to Unix and X. On such systems, you can
+typically only adjust the power-saving delays by changing settings
+in the BIOS in some hardware-specific way.
+.TP 4
+.B Standby After
+If \fIPower Management Enabled\fP is selected, the monitor will go black
+after this much idle time. (Graphics demos will stop running, also.)
+.TP 4
+.B Suspend After
+If \fIPower Management Enabled\fP is selected, the monitor will go
+into power-saving mode after this much idle time. This duration should
+be greater than or equal to \fIStandby\fP.
+.TP 4
+.B Off After
+If \fIPower Management Enabled\fP is selected, the monitor will fully
+power down after this much idle time. This duration should be greater
+than or equal to \fISuspend\fP.
+.TP 4
+.B Quick Power-off in "Blank Only" Mode
+If the display mode is set to \fIBlank Screen Only\fP and this is
+checked, then the monitor will be powered off immediately upon
+blanking, regardless of the other power-management settings. In this
+way, the power management idle-timers can be completely disabled, but
+the screen will be powered off when black. (This might be preferable
+on laptops.)
+.RE
+.PP
+.B Fading and Colormaps
+
+These options control how the screen fades to or from black when
+a screen saver begins or ends.
+.RS 4
+.TP 4
+.B Fade To Black When Blanking
+If selected, then when the screensaver activates, the current contents
+of the screen will fade to black instead of simply winking out. (Note:
+this doesn't work with all X servers.) A fade will also be done when
+switching graphics hacks (when the \fICycle After\fP expires.)
+.TP 4
+.B Unfade From Black When Unblanking
+The complement to \fIFade Colormap\fP: if selected, then when the screensaver
+deactivates, the original contents of the screen will fade in from black
+instead of appearing immediately. This is only done if \fIFade Colormap\fP
+is also selected.
+.TP 4
+.B Fade Duration
+When fading or unfading are selected, this controls how long the fade will
+take.
+.TP 4
+.B Install Colormap
+On 8-bit screens, whether to install a private colormap while the
+screensaver is active, so that the graphics hacks can get as many
+colors as possible. This does nothing if you are running in 16-bit
+or better.
+.PP
+.RE
+There are more settings than these available, but these are the most
+commonly used ones; see the manual for
+.BR xscreensaver (1)
+for other parameters that can be set by editing the \fI~/.xscreensaver\fP
+file, or the X resource database.
+.SH COMMAND-LINE OPTIONS
+.I xscreensaver\-demo
+accepts the following command line options.
+.TP 8
+.B \-display \fIhost:display.screen\fP
+The X display to use. The \fIxscreensaver\-demo\fP program will open its
+window on that display, and also control the \fIxscreensaver\fP daemon that
+is managing that same display.
+.TP 8
+.B \-prefs
+Start up with the \fBAdvanced\fP tab selected by default
+instead of the \fBDisplay Modes\fP tab.
+.TP 8
+.B \-debug
+Causes lots of diagnostics to be printed on stderr.
+.P
+It is important that the \fIxscreensaver\fP and \fIxscreensaver\-demo\fP
+processes be running on the same machine, or at least, on two machines
+that share a file system. When \fIxscreensaver\-demo\fP writes a new version
+of the \fI~/.xscreensaver\fP file, it's important that the \fIxscreensaver\fP
+see that same file. If the two processes are seeing
+different \fI~/.xscreensaver\fP files, things will malfunction.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B PATH
+to find the sub-programs to run. However, note that the sub-programs
+are actually launched by the \fIxscreensaver\fP daemon, not
+by \fIxscreensaver-demo\fP itself. So, what matters is what \fB$PATH\fP
+that the \fIxscreensaver\fP program sees.
+.TP 8
+.B HOME
+for the directory in which to read and write the \fI.xscreensaver\fP file.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.TP 8
+.B HTTP_PROXY\fR or \fPhttp_proxy
+to get the default HTTP proxy host and port.
+.SH UPGRADES
+The latest version of xscreensaver, an online version of this manual,
+and a FAQ can always be found at https://www.jwz.org/xscreensaver/
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-command (1),
+.BR xscreensaver\-getimage (1),
+.BR xscreensaver\-text (1)
+.SH COPYRIGHT
+Copyright \(co 1992-2015 by Jamie Zawinski.
+Permission to use, copy, modify, distribute, and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
+
+Please let me know if you find any bugs or make any improvements.
diff --git a/driver/xscreensaver-getimage-desktop b/driver/xscreensaver-getimage-desktop
new file mode 100755
index 0000000..2a6d345
--- /dev/null
+++ b/driver/xscreensaver-getimage-desktop
@@ -0,0 +1,174 @@
+#!/usr/bin/perl -w
+# Copyright © 2003-2013 Jamie Zawinski <jwz@jwz.org>.
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+#
+#
+# This script is invoked by "xscreensaver-getimage" on X11 MacOS systems
+# to grab an image of the desktop, and then load it on to the given X11
+# Drawable using the "xscreensaver-getimage-file" program.
+#
+# This script is only used in an *X11* build on MacOS systems.
+#
+# When running on non-Mac X11 systems, utils/grabscreen.c is used.
+#
+# However, when running under X11 on MacOS, that usual X11-based
+# screen-grabbing mechanism doesn't work, so we need to invoke the
+# "/usr/bin/screencapture" program to do it instead. (This script).
+#
+# However again, for the MacOS-native (Cocoa) build of the screen savers,
+# "utils/grabclient.c" instead links against "OSX/osxgrabscreen.m", which
+# grabs screen images directly without invoking a sub-process to do it.
+#
+# Created: 20-Oct-2003.
+
+
+require 5;
+#use diagnostics; # Fails on some MacOS 10.5 systems
+use strict;
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my $version = q{ $Revision: 1.6 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+
+my @grabber = ("screencapture", "-x");
+my @converter = ("pdf2jpeg");
+
+my $verbose = 0;
+
+
+sub error($) {
+ ($_) = @_;
+ print STDERR "$progname: $_\n";
+ exit 1;
+}
+
+# returns the full path of the named program, or undef.
+#
+sub which($) {
+ my ($prog) = @_;
+ foreach (split (/:/, $ENV{PATH})) {
+ if (-x "$_/$prog") {
+ return $prog;
+ }
+ }
+ return undef;
+}
+
+sub check_path() {
+ my $ok = 1;
+ foreach ($grabber[0], $converter[0]) {
+ if (! which ($_)) {
+ print STDERR "$progname: \"$_\" not found on \$PATH.\n";
+ $ok = 0;
+ }
+ }
+ exit (1) unless $ok;
+}
+
+
+sub grab_image() {
+
+ check_path();
+
+ my $tmpdir = $ENV{TMPDIR};
+ $tmpdir = "/tmp" unless $tmpdir;
+
+ my $tmpfile = sprintf ("%s/xssgrab.%08x.pdf", $tmpdir, rand(0xffffffff));
+ my @cmd = (@grabber, $tmpfile);
+
+ unlink $tmpfile;
+
+ print STDERR "$progname: executing \"" . join(' ', @cmd) . "\"\n"
+ if ($verbose);
+ system (join(' ', @cmd) . ' 2>/dev/null');
+
+ my @st = stat($tmpfile);
+ my $size = (@st ? $st[7] : 0);
+ if ($size <= 2048) {
+ unlink $tmpfile;
+ if ($size == 0) {
+ error "\"" . join(' ', @cmd) . "\" produced no data.";
+ } else {
+ error "\"" . join(' ', @cmd) . "\" produced only $size bytes.";
+ }
+ }
+
+ # On MacOS 10.3, "screencapture -x" always wrote a PDF.
+ # On 10.4.2, it writes a PNG by default, and the output format can be
+ # changed with the new "-t" argument.
+ #
+ # So, for maximal compatibility, we run it without "-t", but look at
+ # the first few bytes to see if it's a PDF, and if it is, convert it
+ # to a JPEG first. Otherwise, we assume that whatever screencapture
+ # wrote is a file format that xscreensaver-getimage-file can already
+ # cope with (though it will have the extension ".pdf", regardless of
+ # what is actually in the file).
+ #
+ my $pdf_p = 0;
+ {
+ open (my $in, '<:raw', $tmpfile) || error ("$tmpfile: $!");
+ my $buf = '';
+ read ($in, $buf, 10);
+ close $in;
+ $pdf_p = ($buf =~ m/^%PDF-/s);
+ }
+
+ # If it's a PDF, convert it to a JPEG.
+ #
+ if ($pdf_p)
+ {
+ my $jpgfile = $tmpfile;
+ $jpgfile =~ s/\.[^.]+$//;
+ $jpgfile .= ".jpg";
+
+ @cmd = (@converter, $tmpfile, $jpgfile);
+ push @cmd, "--verbose" if ($verbose);
+
+ print STDERR "$progname: executing \"" . join(' ', @cmd) . "\"\n"
+ if ($verbose);
+ system (@cmd);
+ unlink $tmpfile;
+ $tmpfile = $jpgfile;
+ }
+
+ @st = stat($tmpfile);
+ $size = (@st ? $st[7] : 0);
+ if ($size <= 2048) {
+ unlink $tmpfile;
+ if ($size == 0) {
+ error "\"" . join(' ', @cmd) . "\" produced no data.";
+ } else {
+ error "\"" . join(' ', @cmd) . "\" produced only $size bytes.";
+ }
+ }
+
+ print STDERR "$progname: wrote \"$tmpfile\"\n" if ($verbose);
+ print STDOUT "$tmpfile\n";
+}
+
+
+sub usage() {
+ print STDERR "usage: $progname [--verbose]\n";
+ exit 1;
+}
+
+sub main() {
+ while ($_ = $ARGV[0]) {
+ shift @ARGV;
+ if (m/^--?verbose$/s) { $verbose++; }
+ elsif (m/^-v+$/s) { $verbose += length($_)-1; }
+ elsif (m/^--?name$/s) { } # ignored, for compatibility
+ elsif (m/^-./) { usage; }
+ else { usage; }
+ }
+ grab_image();
+}
+
+main;
+exit 0;
diff --git a/driver/xscreensaver-getimage-desktop.man b/driver/xscreensaver-getimage-desktop.man
new file mode 100644
index 0000000..1974525
--- /dev/null
+++ b/driver/xscreensaver-getimage-desktop.man
@@ -0,0 +1,55 @@
+.TH XScreenSaver 1 "07-Sep-2003 (4.13)" "X Version 11"
+.SH NAME
+xscreensaver-getimage-desktop - put a desktop image on the root window
+.SH SYNOPSIS
+.B xscreensaver-getimage-desktop
+[\-display \fIhost:display.screen\fP] [\--verbose] [\--stdout]
+.SH DESCRIPTION
+The \fIxscreensaver\-getimage\-desktop\fP program is a helper program
+for the xscreensaver hacks that manipulate images. Specifically, it
+is invoked by
+.BR xscreensaver\-getimage (1)
+as needed. This is not a user-level command.
+
+This program is only used on MacOS X / XDarwin systems, because
+on those systems, it's necessary to use the
+.BR screencapture (1)
+program to get an image of the desktop -- the usual X11
+mechanism for grabbing the screen doesn't work on OSX.
+
+This script works by running
+.BR screencapture (1)
+to get a PDF, then converting it to a JPEG with
+.BR pdf2jpeg (1),
+then loading it onto the window with
+.BR xscreensaver\-getimage\-file (1).
+.SH OPTIONS
+.I xscreensaver-getimage-desktop
+accepts the following options:
+.TP 4
+.B --verbose
+Print diagnostics.
+.TP 4
+.B --stdout
+Instead of loading the image onto the root window, write it to stdout
+as a PBM file.
+.SH SEE ALSO
+.BR screencapture (1),
+.BR pdf2jpeg (1),
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1),
+.BR xscreensaver\-getimage\-file (1),
+.BR xscreensaver\-getimage\-video (1),
+.SH COPYRIGHT
+Copyright \(co 2003 by Jamie Zawinski. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 20-Oct-03.
diff --git a/driver/xscreensaver-getimage-file b/driver/xscreensaver-getimage-file
new file mode 100755
index 0000000..ba1ef30
--- /dev/null
+++ b/driver/xscreensaver-getimage-file
@@ -0,0 +1,1316 @@
+#!/usr/bin/perl -w
+# Copyright © 2001-2018 Jamie Zawinski <jwz@jwz.org>.
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+#
+# This program chooses a random file from under the given directory, and
+# prints its name. The file will be an image file whose dimensions are
+# larger than a certain minimum size.
+#
+# If the directory is a URL, it is assumed to be an RSS or Atom feed.
+# The images from that feed will be downloaded, cached, and selected from
+# at random. The feed will be re-polled periodically, as needed.
+#
+# The various xscreensaver hacks that manipulate images ("jigsaw", etc.) get
+# the image to manipulate by running the "xscreensaver-getimage" program.
+#
+# Under X11, the "xscreensaver-getimage" program invokes this script,
+# depending on the value of the "chooseRandomImages" and "imageDirectory"
+# settings in the ~/.xscreensaver file (or .../app-defaults/XScreenSaver).
+# The screen savers invoke "xscreensaver-getimage" via utils/grabclient.c,
+# which then invokes this script.
+#
+# Under Cocoa, this script lives inside the .saver bundle, and is invoked
+# directly from utils/grabclient.c.
+#
+# Created: 12-Apr-01.
+
+require 5;
+#use diagnostics; # Fails on some MacOS 10.5 systems
+use strict;
+
+use POSIX;
+use Fcntl;
+
+use Fcntl ':flock'; # import LOCK_* constants
+
+use POSIX ':fcntl_h'; # S_ISDIR was here in Perl 5.6
+import Fcntl ':mode' unless defined &S_ISUID; # but it is here in Perl 5.8
+ # but in Perl 5.10, both of these load, and cause errors!
+ # So we have to check for S_ISUID instead of S_ISDIR? WTF?
+
+use Digest::MD5 qw(md5_base64);
+
+# Some Linux systems don't install LWP by default!
+# Only error out if we're actually loading a URL instead of local data.
+BEGIN { eval 'use LWP::Simple;' }
+
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my ($version) = ('$Revision: 1.52 $' =~ m/\s(\d[.\d]+)\s/s);
+
+my $verbose = 0;
+
+# Whether to use MacOS X's Spotlight to generate the list of files.
+# When set to -1, uses Spotlight if "mdfind" exists.
+#
+# (In my experience, this isn't actually any faster, and might not find
+# everything if your Spotlight index is out of date, which happens often.)
+#
+my $use_spotlight_p = 0;
+
+# Whether to cache the results of the last run.
+#
+my $cache_p = 1;
+
+# Regenerate the cache if it is older than this many seconds.
+#
+my $cache_max_age = 60 * 60 * 3; # 3 hours
+
+# Re-poll RSS/Atom feeds when local copy is older than this many seconds.
+#
+my $feed_max_age = $cache_max_age;
+
+
+# This matches files that we are allowed to use as images (case-insensitive.)
+# Anything not matching this is ignored. This is so you can point your
+# imageDirectory at directory trees that have things other than images in
+# them, but it assumes that you gave your images sensible file extensions.
+#
+my @good_extensions = ('jpg', 'jpeg', 'pjpeg', 'pjpg', 'png', 'gif',
+ 'tif', 'tiff', 'xbm', 'xpm');
+my $good_file_re = '\.(' . join("|", @good_extensions) . ')$';
+
+# This matches file extensions that might occur in an image directory,
+# and that are never used in the name of a subdirectory. This is an
+# optimization that prevents us from having to stat() those files to
+# tell whether they are directories or not. (It speeds things up a
+# lot. Don't give your directories stupid names.)
+#
+my @nondir_extensions = ('ai', 'bmp', 'bz2', 'cr2', 'crw', 'db',
+ 'dmg', 'eps', 'gz', 'hqx', 'htm', 'html', 'icns', 'ilbm', 'mov',
+ 'nef', 'pbm', 'pdf', 'php', 'pl', 'ppm', 'ps', 'psd', 'sea', 'sh',
+ 'shtml', 'tar', 'tgz', 'thb', 'txt', 'xcf', 'xmp', 'Z', 'zip' );
+my $nondir_re = '\.(' . join("|", @nondir_extensions) . ')$';
+
+
+# JPEG, GIF, and PNG files that are are smaller than this are rejected:
+# this is so that you can use an image directory that contains both big
+# images and thumbnails, and have it only select the big versions.
+# But, if all of your images are smaller than this, all will be rejected.
+#
+my $min_image_width = 500;
+my $min_image_height = 500;
+
+my @all_files = (); # list of "good" files we've collected
+my %seen_inodes; # for breaking recursive symlink loops
+
+# For diagnostic messages:
+#
+my $dir_count = 1; # number of directories seen
+my $stat_count = 0; # number of files/dirs stat'ed
+my $skip_count_unstat = 0; # number of files skipped without stat'ing
+my $skip_count_stat = 0; # number of files skipped after stat
+
+my $config_file = $ENV{HOME} . "/.xscreensaver";
+my $image_directory = undef;
+
+
+sub find_all_files($);
+sub find_all_files($) {
+ my ($dir) = @_;
+
+ print STDERR "$progname: + reading dir $dir/...\n" if ($verbose > 1);
+
+ my $dd;
+ if (! opendir ($dd, $dir)) {
+ print STDERR "$progname: couldn't open $dir: $!\n" if ($verbose);
+ return;
+ }
+ my @files = readdir ($dd);
+ closedir ($dd);
+
+ my @dirs = ();
+
+ foreach my $file (@files) {
+ next if ($file =~ m/^\./); # silently ignore dot files/dirs
+
+ if ($file =~ m/[~%\#]$/) { # ignore backup files (and dirs...)
+ $skip_count_unstat++;
+ print STDERR "$progname: - skip file $file\n" if ($verbose > 1);
+ }
+
+ $file = "$dir/$file";
+
+ if ($file =~ m/$good_file_re/io) {
+ #
+ # Assume that files ending in .jpg exist and are not directories.
+ #
+ push @all_files, $file;
+ print STDERR "$progname: - found file $file\n" if ($verbose > 1);
+
+ } elsif ($file =~ m/$nondir_re/io) {
+ #
+ # Assume that files ending in .html are not directories.
+ #
+ $skip_count_unstat++;
+ print STDERR "$progname: -- skip file $file\n" if ($verbose > 1);
+
+ } else {
+ #
+ # Now we need to stat the file to see if it's a subdirectory.
+ #
+ # Note: we could use the trick of checking "nlinks" on the parent
+ # directory to see if this directory contains any subdirectories,
+ # but that would exclude any symlinks to directories.
+ #
+ my @st = stat($file);
+ my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+ $atime,$mtime,$ctime,$blksize,$blocks) = @st;
+
+ $stat_count++;
+
+ if ($#st == -1) {
+ if ($verbose) {
+ my $ll = readlink $file;
+ if (defined ($ll)) {
+ print STDERR "$progname: + dangling symlink: $file -> $ll\n";
+ } else {
+ print STDERR "$progname: + unreadable: $file\n";
+ }
+ }
+ next;
+ }
+
+ next if ($seen_inodes{"$dev:$ino"}); # break symlink loops
+ $seen_inodes{"$dev:$ino"} = 1;
+
+ if (S_ISDIR($mode)) {
+ push @dirs, $file;
+ $dir_count++;
+ print STDERR "$progname: + found dir $file\n" if ($verbose > 1);
+
+ } else {
+ $skip_count_stat++;
+ print STDERR "$progname: + skip file $file\n" if ($verbose > 1);
+ }
+ }
+ }
+
+ foreach (@dirs) {
+ find_all_files ($_);
+ }
+}
+
+
+sub spotlight_all_files($) {
+ my ($dir) = @_;
+
+ my @terms = ();
+ # "public.image" matches all (indexed) images, including Photoshop, etc.
+# push @terms, "kMDItemContentTypeTree == 'public.image'";
+ foreach (@good_extensions) {
+
+ # kMDItemFSName hits the file system every time: much worse than "find".
+# push @terms, "kMDItemFSName == '*.$_'";
+
+ # kMDItemDisplayName matches against the name in the Spotlight index,
+ # but won't find files that (for whatever reason) didn't get indexed.
+ push @terms, "kMDItemDisplayName == '*.$_'";
+ }
+
+ $dir =~ s@([^-_/a-z\d.,])@\\$1@gsi; # quote for sh
+ my $cmd = "mdfind -onlyin $dir \"" . join (' || ', @terms) . "\"";
+
+ print STDERR "$progname: executing: $cmd\n" if ($verbose > 1);
+ @all_files = split (/[\r\n]+/, `$cmd`);
+}
+
+
+# If we're using cacheing, read the cache file and return its contents,
+# if any. This also holds an exclusive lock on the cache file, which
+# has the additional benefit that if two copies of this program are
+# running at once, one will wait for the other, instead of both of
+# them spanking the same file system at the same time.
+#
+my $cache_fd = undef;
+my $cache_file_name = undef;
+my $read_cache_p = 0;
+
+sub read_cache($) {
+ my ($dir) = @_;
+
+ return () unless ($cache_p);
+
+ my $dd = "$ENV{HOME}/Library/Caches"; # MacOS location
+ if (-d $dd) {
+ $cache_file_name = "$dd/org.jwz.xscreensaver.getimage.cache";
+ } elsif (-d "$ENV{HOME}/.cache") { # Gnome "FreeDesktop XDG" location
+ $dd = "$ENV{HOME}/.cache/xscreensaver";
+ if (! -d $dd) { mkdir ($dd) || error ("mkdir $dd: $!"); }
+ $cache_file_name = "$dd/xscreensaver-getimage.cache"
+ } elsif (-d "$ENV{HOME}/tmp") { # If ~/tmp/ exists, use it.
+ $cache_file_name = "$ENV{HOME}/tmp/.xscreensaver-getimage.cache";
+ } else {
+ $cache_file_name = "$ENV{HOME}/.xscreensaver-getimage.cache";
+ }
+
+ print STDERR "$progname: awaiting lock: $cache_file_name\n"
+ if ($verbose > 1);
+
+ my $file = $cache_file_name;
+ open ($cache_fd, '+>>', $file) || error ("unable to write $file: $!");
+ flock ($cache_fd, LOCK_EX) || error ("unable to lock $file: $!");
+ seek ($cache_fd, 0, 0) || error ("unable to rewind $file: $!");
+
+ my $mtime = (stat($cache_fd))[9];
+
+ if ($mtime + $cache_max_age < time) {
+ print STDERR "$progname: cache is too old\n" if ($verbose);
+ return ();
+ }
+
+ my $odir = <$cache_fd>;
+ $odir =~ s/[\r\n]+$//s if defined ($odir);
+ if (!defined ($odir) || ($dir ne $odir)) {
+ print STDERR "$progname: cache is for $odir, not $dir\n"
+ if ($verbose && $odir);
+ return ();
+ }
+
+ my @files = ();
+ while (<$cache_fd>) {
+ s/[\r\n]+$//s;
+ push @files, "$odir/$_";
+ }
+
+ print STDERR "$progname: " . ($#files+1) . " files in cache\n"
+ if ($verbose);
+
+ $read_cache_p = 1;
+ return @files;
+}
+
+
+sub write_cache($) {
+ my ($dir) = @_;
+
+ return unless ($cache_p);
+
+ # If we read the cache, just close it without rewriting it.
+ # If we didn't read it, then write it now.
+
+ if (! $read_cache_p) {
+
+ truncate ($cache_fd, 0) ||
+ error ("unable to truncate $cache_file_name: $!");
+ seek ($cache_fd, 0, 0) ||
+ error ("unable to rewind $cache_file_name: $!");
+
+ if ($#all_files >= 0) {
+ print $cache_fd "$dir\n";
+ foreach (@all_files) {
+ my $f = $_; # stupid Perl. do this to avoid modifying @all_files!
+ $f =~ s@^\Q$dir/@@so || die; # remove $dir from front
+ print $cache_fd "$f\n";
+ }
+ }
+
+ print STDERR "$progname: cached " . ($#all_files+1) . " files\n"
+ if ($verbose);
+ }
+
+ flock ($cache_fd, LOCK_UN) ||
+ error ("unable to unlock $cache_file_name: $!");
+ close ($cache_fd);
+ $cache_fd = undef;
+}
+
+
+sub html_unquote($) {
+ my ($h) = @_;
+
+ # This only needs to handle entities that occur in RSS, not full HTML.
+ my %ent = ( 'amp' => '&', 'lt' => '<', 'gt' => '>',
+ 'quot' => '"', 'apos' => "'" );
+ $h =~ s/(&(\#)?([[:alpha:]\d]+);?)/
+ {
+ my ($o, $c) = ($1, $3);
+ if (! defined($2)) {
+ $c = $ent{$c}; # for &lt;
+ } else {
+ if ($c =~ m@^x([\dA-F]+)$@si) { # for &#x41;
+ $c = chr(hex($1));
+ } elsif ($c =~ m@^\d+$@si) { # for &#65;
+ $c = chr($c);
+ } else {
+ $c = undef;
+ }
+ }
+ ($c || $o);
+ }
+ /gexi;
+ return $h;
+}
+
+
+
+# Figure out what the proxy server should be, either from environment
+# variables or by parsing the output of the (MacOS) program "scutil",
+# which tells us what the system-wide proxy settings are.
+#
+sub set_proxy($) {
+ my ($ua) = @_;
+
+ my $proxy_data = `scutil --proxy 2>/dev/null`;
+ foreach my $proto ('http', 'https') {
+ my ($server) = ($proxy_data =~ m/\b${proto}Proxy\s*:\s*([^\s]+)/si);
+ my ($port) = ($proxy_data =~ m/\b${proto}Port\s*:\s*([^\s]+)/si);
+ my ($enable) = ($proxy_data =~ m/\b${proto}Enable\s*:\s*([^\s]+)/si);
+
+ if ($server && $enable) {
+ # Note: this ignores the "ExceptionsList".
+ my $proto2 = 'http';
+ $ENV{"${proto}_proxy"} = ("${proto2}://" . $server .
+ ($port ? ":$port" : "") . "/");
+ print STDERR "$progname: MacOS $proto proxy: " .
+ $ENV{"${proto}_proxy"} . "\n"
+ if ($verbose > 2);
+ }
+ }
+
+ $ua->env_proxy();
+}
+
+
+sub init_lwp() {
+ if (! defined ($LWP::Simple::ua)) {
+ error ("\n\n\tPerl is broken. Do this to repair it:\n" .
+ "\n\tsudo cpan LWP::Simple LWP::Protocol::https Mozilla::CA\n");
+ }
+ set_proxy ($LWP::Simple::ua);
+}
+
+
+sub sanity_check_lwp() {
+ my $url1 = 'https://www.mozilla.org/';
+ my $url2 = 'http://www.mozilla.org/';
+ my $body = (LWP::Simple::get($url1) || '');
+ if (length($body) < 10240) {
+ my $err = "";
+ $body = (LWP::Simple::get($url2) || '');
+ if (length($body) < 10240) {
+ $err = "Perl is broken: neither HTTP nor HTTPS URLs work.";
+ } else {
+ $err = "Perl is broken: HTTP URLs work but HTTPS URLs don't.";
+ }
+ $err .= "\nMaybe try: sudo cpan -f Mozilla::CA LWP::Protocol::https";
+ $err =~ s/^/\t/gm;
+ error ("\n\n$err\n");
+ }
+}
+
+
+# If the URL does not already end with an extension appropriate for the
+# content-type, add it after a "#" search.
+#
+# This is for when we know the content type of the URL, but the URL is
+# some crazy thing without an extension. The files on disk need to have
+# proper extensions.
+#
+sub force_extension($$) {
+ my ($url, $ct) = @_;
+ return $url unless (defined($url) && defined($ct));
+ my ($ext) = ($ct =~ m@^image/([-a-z\d]+)@si);
+ return $url unless $ext;
+ $ext = lc($ext);
+ $ext = 'jpg' if ($ext eq 'jpeg');
+ return $url if ($url =~ m/\.$ext$/si);
+ return "$url#.$ext";
+}
+
+
+# Returns a list of the image enclosures in the RSS or Atom feed.
+# Elements of the list are references, [ "url", "guid" ].
+#
+sub parse_feed($);
+sub parse_feed($) {
+ my ($url) = @_;
+
+ init_lwp();
+ $LWP::Simple::ua->agent ("$progname/$version");
+ $LWP::Simple::ua->timeout (10); # bail sooner than the default of 3 minutes
+
+
+ # Half the time, random Linux systems don't have Mozilla::CA installed,
+ # which results in "Can't verify SSL peers without knowning which
+ # Certificate Authorities to trust".
+ #
+ # In xscreensaver-text we just disabled certificate checks. However,
+ # malicious images really do exist, so for xscreensaver-getimage-file,
+ # let's actually require that SSL be installed properly.
+
+ print STDERR "$progname: loading $url\n" if ($verbose);
+ my $body = (LWP::Simple::get($url) || '');
+
+ if ($body !~ m@^\s*<(\?xml|rss)\b@si) {
+ # Not an RSS/Atom feed. Try RSS autodiscovery.
+
+ # (Great news, everybody: Flickr no longer provides RSS for "Sets",
+ # only for "Photostreams", and only the first 20 images of those.
+ # Thanks, assholes.)
+
+ if ($body =~ m/^\s*$/s) {
+ sanity_check_lwp();
+ error ("null response: $url");
+ }
+
+ error ("not an RSS or Atom feed, or HTML: $url")
+ unless ($body =~ m@<(HEAD|BODY|A|IMG)\b@si);
+
+ # Find the first <link> with RSS or Atom in it, and use that instead.
+
+ $body =~ s@<LINK\s+([^<>]*)>@{
+ my $p = $1;
+ if ($p =~ m! \b REL \s* = \s* ['"]? alternate \b!six &&
+ $p =~ m! \b TYPE \s* = \s* ['"]? application/(atom|rss) !six &&
+ $p =~ m! \b HREF \s* = \s* ['"] ( [^<>'"]+ ) !six
+ ) {
+ my $u2 = html_unquote ($1);
+ if ($u2 =~ m!^/!s) {
+ my ($h) = ($url =~ m!^([a-z]+://[^/]+)!si);
+ $u2 = "$h$u2";
+ }
+ print STDERR "$progname: found feed: $u2\n"
+ if ($verbose);
+ return parse_feed ($u2);
+ }
+ '';
+ }@gsexi;
+
+ error ("no RSS or Atom feed for HTML page: $url");
+ }
+
+
+ $body =~ s@(<ENTRY|<ITEM)@\001$1@gsi;
+ my @items = split(/\001/, $body);
+ shift @items;
+
+ my @imgs = ();
+ my %ids;
+
+ foreach my $item (@items) {
+ my $iurl = undef;
+ my $id = undef;
+
+ # First look for <link rel="enclosure" href="...">
+ #
+ if (! $iurl) {
+ foreach my $link ($item =~ m@<LINK[^<>]*>@gsi) {
+ last if $iurl;
+ my ($href) = ($link =~ m/\bHREF\s*=\s*[\"\']([^<>\'\"]+)/si);
+ my ($type) = ($link =~ m/\bTYPE\s*=\s*[\"\']?([^<>\'\"]+)/si);
+ my ($rel) = ($link =~ m/\bREL\s*=\s*[\"\']?([^<>\'\"]+)/si);
+ $href = undef unless (lc($rel || '') eq 'enclosure');
+ $href = undef if ($type && $type !~ m@^image/@si); # omit videos
+ $iurl = html_unquote($href) if $href;
+ $iurl = force_extension ($iurl, $type);
+ }
+ }
+
+ # Then look for <media:content url="...">
+ #
+ if (! $iurl) {
+ foreach my $link ($item =~ m@<MEDIA:CONTENT[^<>]*>@gsi) {
+ last if $iurl;
+ my ($href) = ($link =~ m/\bURL\s*=\s*[\"\']([^<>\'\"]+)/si);
+ my ($type) = ($link =~ m/\bTYPE\s*=\s*[\"\']?([^<>\'\"]+)/si);
+ my ($med) = ($link =~ m/\bMEDIUM\s*=\s*[\"\']?([^<>\'\"]+)/si);
+ $type = 'image/jpeg' if (!$type && lc($med || '') eq 'image');
+ $href = undef if ($type && $type !~ m@^image/@si); # omit videos
+ $iurl = html_unquote($href) if $href;
+ $iurl = force_extension ($iurl, $type);
+ }
+ }
+
+ # Then look for <enclosure url="..."/>
+ #
+ if (! $iurl) {
+ foreach my $link ($item =~ m@<ENCLOSURE[^<>]*>@gsi) {
+ last if $iurl;
+ my ($href) = ($link =~ m/\bURL\s*=\s*[\"\']([^<>\'\"]+)/si);
+ my ($type) = ($link =~ m/\bTYPE\s*=\s*[\"\']?([^<>\'\"]+)/si);
+ $href = undef if ($type && $type !~ m@^image/@si); # omit videos
+ $iurl = html_unquote($href) if ($href);
+ $iurl = force_extension ($iurl, $type);
+ }
+ }
+
+ # Ok, maybe there's an image in the <url> field?
+ #
+ if (! $iurl) {
+ foreach my $link ($item =~ m@<URL\b[^<>]*>([^<>]*)@gsi) {
+ last if $iurl;
+ my $u2 = $1;
+ $iurl = html_unquote($u2) if ($u2 =~ m/$good_file_re/io);
+ if (! $iurl) {
+ my $u3 = $u2;
+ $u3 =~ s/#.*$//gs;
+ $u3 =~ s/[?&].*$//gs;
+ $iurl = html_unquote($u2) if ($u3 =~ m/$good_file_re/io);
+ }
+ }
+ }
+
+ # Then look for <content:encoded> or <description>... with an
+ # <img src="..."> inside. If more than one image, take the first.
+ #
+ foreach my $t ('content:encoded', 'description') {
+ last if $iurl;
+ foreach my $link ($item =~ m@<$t[^<>]*>(.*?)</$t>@gsi) {
+ last if $iurl;
+ my $desc = $1;
+ if ($desc =~ m@<!\[CDATA\[\s*(.*?)\s*\]\]>@gs) {
+ $desc = $1;
+ } else {
+ $desc = html_unquote($desc);
+ }
+ my ($href) = ($desc =~ m@<IMG[^<>]*\bSRC=[\"\']?([^\"\'<>]+)@si);
+ $iurl = html_unquote($href) if ($href);
+ # If IMG SRC has a bogus extension, pretend it's a JPEG.
+ $iurl = force_extension ($iurl, 'image/jpeg')
+ if ($iurl && $iurl !~ m/$good_file_re/io);
+ }
+ }
+
+ # Find a unique ID for this image, to defeat image farms.
+ # First look for <id>...</id>
+ ($id) = ($item =~ m!<ID\b[^<>]*>\s*([^<>]+?)\s*</ID>!si) unless $id;
+
+ # Then look for <guid isPermaLink=...> ... </guid>
+ ($id) = ($item =~ m!<GUID\b[^<>]*>\s*([^<>]+?)\s*</GUID>!si) unless $id;
+
+ # Then look for <link> ... </link>
+ ($id) = ($item =~ m!<LINK\b[^<>]*>\s*([^<>]+?)\s*</LINK>!si) unless $id;
+
+ # If we only have a GUID or LINK, but it's an image, use that.
+ $iurl = $id if (!$iurl && $id && $id =~ m/$good_file_re/io);
+
+ if ($iurl) {
+ $id = $iurl unless $id;
+ my $o = $ids{$id};
+ if (! $o) {
+ $ids{$id} = $iurl;
+ my @P = ($iurl, $id);
+ push @imgs, \@P;
+ } elsif ($iurl ne $o) {
+ print STDERR "$progname: WARNING: dup ID \"$id\"" .
+ " for \"$o\" and \"$iurl\"\n";
+ }
+ }
+ }
+
+ return @imgs;
+}
+
+
+# Like md5_base64 but uses filename-safe characters.
+#
+sub md5_file($) {
+ my ($s) = @_;
+ $s = md5_base64($s);
+ $s =~ s@[/]@_@gs;
+ $s =~ s@[+]@-@gs;
+ return $s;
+}
+
+
+# expands the first URL relative to the second.
+#
+sub expand_url($$) {
+ my ($url, $base) = @_;
+
+ $url =~ s/^\s+//gs; # lose whitespace at front and back
+ $url =~ s/\s+$//gs;
+
+ if (! ($url =~ m/^[a-z]+:/)) {
+
+ $base =~ s@(\#.*)$@@; # strip anchors
+ $base =~ s@(\?.*)$@@; # strip arguments
+ $base =~ s@/[^/]*$@/@; # take off trailing file component
+
+ my $tail = '';
+ if ($url =~ s@(\#.*)$@@) { $tail = $1; } # save anchors
+ if ($url =~ s@(\?.*)$@@) { $tail = "$1$tail"; } # save arguments
+
+ my $base2 = $base;
+
+ $base2 =~ s@^([a-z]+:/+[^/]+)/.*@$1@ # if url is an absolute path
+ if ($url =~ m@^/@);
+
+ my $ourl = $url;
+
+ $url = $base2 . $url;
+ $url =~ s@/\./@/@g; # expand "."
+ 1 while ($url =~ s@/[^/]+/\.\./@/@s); # expand ".."
+
+ $url .= $tail; # put anchors/args back
+
+ print STDERR "$progname: relative URL: $ourl --> $url\n"
+ if ($verbose > 1);
+
+ } else {
+ print STDERR "$progname: absolute URL: $url\n"
+ if ($verbose > 2);
+ }
+
+ return $url;
+}
+
+
+# Given the URL of an image, download it into the given directory
+# and return the file name.
+#
+sub download_image($$$) {
+ my ($url, $uid, $dir) = @_;
+
+ my $url2 = $url;
+ $url2 =~ s/\#.*$//s; # Omit search terms after file extension
+ $url2 =~ s/\?.*$//s;
+ my ($ext) = ($url =~ m@\.([a-z\d]+)$@si);
+ ($ext) = ($url2 =~ m@\.([a-z\d]+)$@si) unless $ext;
+
+ # If the feed hasn't put a sane extension on their URLs, nothing's going
+ # to work. This code assumes that file names have extensions, even the
+ # ones in the cache directory.
+ #
+ if (! $ext) {
+ print STDERR "$progname: skipping extensionless URL: $url\n"
+ if ($verbose > 1);
+ return undef;
+ }
+
+ # Don't bother downloading files that we will reject anyway.
+ #
+ if (! ($url =~ m/$good_file_re/io ||
+ $url2 =~ m/$good_file_re/io)) {
+ print STDERR "$progname: skipping non-image URL: $url\n"
+ if ($verbose > 1);
+ return undef;
+ }
+
+ my $file = md5_file ($uid);
+ $file .= '.' . lc($ext) if $ext;
+
+ # Don't bother doing If-Modified-Since to see if the URL has changed.
+ # If we have already downloaded it, assume it's good.
+ if (-f "$dir/$file") {
+ print STDERR "$progname: exists: $dir/$file for $uid / $url\n"
+ if ($verbose > 1);
+ return $file;
+ }
+
+ # Special-case kludge for Flickr:
+ # Their RSS feeds sometimes include only the small versions of the images.
+ # So if the URL ends in one of the "small-size" letters, change it to "b".
+ #
+ # _o orig, 1600 +
+ # _k large, 2048 max
+ # _h large, 1600 max
+ # _b large, 1024 max
+ # _c medium, 800 max
+ # _z medium, 640 max
+ # "" medium, 500 max
+ # _n small, 320 max
+ # _m small, 240 max
+ # _t thumb, 100 max
+ # _q square, 150x150
+ # _s square, 75x75
+ #
+ # Note: if we wanted to get the _k or _o version instead of the _b or _h
+ # version, we'd need to crack the DRM -- which is easy: see crack_secret
+ # in "https://www.jwz.org/hacks/galdown".
+ #
+ $url =~ s@_[sqtmnzc](\.[a-z]+)$@_b$1@si
+ if ($url =~ m@^https?://[^/?#&]*?flickr\.com/@si);
+
+ print STDERR "$progname: downloading: $dir/$file for $uid / $url\n"
+ if ($verbose > 1);
+ init_lwp();
+ $LWP::Simple::ua->agent ("$progname/$version");
+
+ $url =~ s/\#.*$//s; # Omit search terms
+ my $status = LWP::Simple::mirror ($url, "$dir/$file");
+ if (!LWP::Simple::is_success ($status)) {
+ print STDERR "$progname: error $status: $url\n"; # keep going
+ }
+
+ return $file;
+}
+
+
+sub mirror_feed($) {
+ my ($url) = @_;
+
+ if ($url !~ m/^https?:/si) { # not a URL: local directory.
+ return (undef, $url);
+ }
+
+ my $dir = "$ENV{HOME}/Library/Caches"; # MacOS location
+ if (-d $dir) {
+ $dir = "$dir/org.jwz.xscreensaver.feeds";
+ } elsif (-d "$ENV{HOME}/.cache") { # Gnome "FreeDesktop XDG" location
+ $dir = "$ENV{HOME}/.cache/xscreensaver";
+ if (! -d $dir) { mkdir ($dir) || error ("mkdir $dir: $!"); }
+ $dir .= "/feeds";
+ if (! -d $dir) { mkdir ($dir) || error ("mkdir $dir: $!"); }
+ } elsif (-d "$ENV{HOME}/tmp") { # If ~/tmp/ exists, use it.
+ $dir = "$ENV{HOME}/tmp/.xscreensaver-feeds";
+ } else {
+ $dir = "$ENV{HOME}/.xscreensaver-feeds";
+ }
+
+ if (! -d $dir) {
+ mkdir ($dir) || error ("mkdir $dir: $!");
+ print STDERR "$progname: mkdir $dir/\n" if ($verbose);
+ }
+
+ # MD5 for directory name to use for cache of a feed URL.
+ $dir .= '/' . md5_file ($url);
+
+ if (! -d $dir) {
+ mkdir ($dir) || error ("mkdir $dir: $!");
+ print STDERR "$progname: mkdir $dir/ for $url\n" if ($verbose);
+ }
+
+ # At this point, we have the directory corresponding to this URL.
+ # Now check to see if the files in it are up to date, and download
+ # them if not.
+
+ my $stamp = '.timestamp';
+ my $lock = "$dir/$stamp";
+
+ print STDERR "$progname: awaiting lock: $lock\n"
+ if ($verbose > 1);
+
+ my $mtime = ((stat($lock))[9]) || 0;
+
+ my $lock_fd;
+ open ($lock_fd, '+>>', $lock) || error ("unable to write $lock: $!");
+ flock ($lock_fd, LOCK_EX) || error ("unable to lock $lock: $!");
+ seek ($lock_fd, 0, 0) || error ("unable to rewind $lock: $!");
+
+ my $poll_p = ($mtime + $feed_max_age < time);
+
+ # --no-cache cmd line arg means poll again right now.
+ $poll_p = 1 unless ($cache_p);
+
+ # Even if the cache is young, make sure there is at least one file,
+ # and re-check if not.
+ #
+ if (! $poll_p) {
+ my $count = 0;
+ opendir (my $dirh, $dir) || error ("$dir: $!");
+ foreach my $f (readdir ($dirh)) {
+ next if ($f =~ m/^\./s);
+ $count++;
+ last;
+ }
+ closedir $dirh;
+
+ if ($count <= 0) {
+ print STDERR "$progname: no image files in cache of $url\n"
+ if ($verbose);
+ $poll_p = 1;
+ }
+ }
+
+ if ($poll_p) {
+
+ print STDERR "$progname: loading $url\n" if ($verbose);
+
+ my %files;
+ opendir (my $dirh, $dir) || error ("$dir: $!");
+ foreach my $f (readdir ($dirh)) {
+ next if ($f eq '.' || $f eq '..');
+ $files{$f} = 0; # 0 means "file exists, should be deleted"
+ }
+ closedir $dirh;
+
+ $files{$stamp} = 1;
+
+ # Download each image currently in the feed.
+ #
+ my $count = 0;
+ my @urls = parse_feed ($url);
+ print STDERR "$progname: " . ($#urls + 1) . " images\n"
+ if ($verbose > 1);
+ my %seen_src_urls;
+ foreach my $p (@urls) {
+ my ($furl, $id) = @$p;
+ $furl = expand_url ($furl, $url);
+
+ # No need to download the same image twice, even if it was in the feed
+ # multiple times under different GUIDs.
+ next if ($seen_src_urls{$furl});
+ $seen_src_urls{$furl} = 1;
+
+ my $f = download_image ($furl, $id, $dir);
+ next unless $f;
+ $files{$f} = 1; # Got it, don't delete
+ $count++;
+ }
+
+ my $empty_p = ($count <= 0);
+
+ # Now delete any files that are no longer in the feed.
+ # But if there was nothing in the feed (network failure?)
+ # then don't blow away the old files.
+ #
+ my $kept = 0;
+ foreach my $f (keys(%files)) {
+ if ($count <= 0) {
+ $kept++;
+ } elsif ($files{$f}) {
+ $kept++;
+ } else {
+ if (unlink ("$dir/$f")) {
+ print STDERR "$progname: rm $dir/$f\n" if ($verbose > 1);
+ } else {
+ print STDERR "$progname: rm $dir/$f: $!\n"; # don't bail
+ }
+ }
+ }
+
+ # Both feed and cache are empty. No files at all. Bail.
+ error ("empty feed: $url") if ($kept <= 1);
+
+ # Feed is empty, but we have some files from last time. Warn.
+ print STDERR "$progname: empty feed: using cache: $url\n"
+ if ($empty_p);
+
+ $mtime = time(); # update the timestamp
+
+ } else {
+
+ # Not yet time to re-check the URL.
+ print STDERR "$progname: using cache: $url\n" if ($verbose);
+
+ }
+
+ # Unlock and update the write date on the .timestamp file.
+ #
+ truncate ($lock_fd, 0) || error ("unable to truncate $lock: $!");
+ seek ($lock_fd, 0, 0) || error ("unable to rewind $lock: $!");
+ utime ($mtime, $mtime, $lock_fd) || error ("unable to touch $lock: $!");
+ flock ($lock_fd, LOCK_UN) || error ("unable to unlock $lock: $!");
+ close ($lock_fd);
+ $lock_fd = undef;
+ print STDERR "$progname: unlocked $lock\n" if ($verbose > 1);
+
+ # Don't bother using the imageDirectory cache. We know that this directory
+ # is flat, and we can assume that an RSS feed doesn't contain 100,000 images
+ # like ~/Pictures/ might.
+ #
+ $cache_p = 0;
+
+ # Return the URL and directory name of the files of that URL's local cache.
+ #
+ return ($url, $dir);
+}
+
+
+sub find_random_file($) {
+ my ($dir) = @_;
+
+ if ($use_spotlight_p == -1) {
+ $use_spotlight_p = 0;
+ if (-x '/usr/bin/mdfind') {
+ $use_spotlight_p = 1;
+ }
+ }
+
+ my $url;
+ ($url, $dir) = mirror_feed ($dir);
+
+ if ($url) {
+ $use_spotlight_p = 0;
+ print STDERR "$progname: $dir is cache for $url\n" if ($verbose > 1);
+ }
+
+ @all_files = read_cache ($dir);
+
+ if ($#all_files >= 0) {
+ # got it from the cache...
+
+ } elsif ($use_spotlight_p) {
+ print STDERR "$progname: spotlighting $dir...\n" if ($verbose);
+ spotlight_all_files ($dir);
+ print STDERR "$progname: found " . ($#all_files+1) .
+ " file" . ($#all_files == 0 ? "" : "s") .
+ " via Spotlight\n"
+ if ($verbose);
+ } else {
+ print STDERR "$progname: recursively reading $dir...\n" if ($verbose);
+ find_all_files ($dir);
+ print STDERR "$progname: " .
+ "f=" . ($#all_files+1) . "; " .
+ "d=$dir_count; " .
+ "s=$stat_count; " .
+ "skip=${skip_count_unstat}+$skip_count_stat=" .
+ ($skip_count_unstat + $skip_count_stat) .
+ ".\n"
+ if ($verbose);
+ }
+
+ write_cache ($dir);
+
+ if ($#all_files < 0) {
+ print STDERR "$progname: no image files in $dir\n";
+ exit 1;
+ }
+
+ my $max_tries = 50;
+ my $total_files = @all_files;
+ my $sparse_p = ($total_files < 20);
+
+ # If the directory has a lot of files in it:
+ # Make a pass through looking for hirez files (assume some are thumbs);
+ # If we found none, then, select any other file at random.
+ # Otherwise if there are a small number of files:
+ # Just select one at random (in case there's like, just one hirez).
+
+ for (my $check_size_p = $sparse_p ? 0 : 1;
+ $check_size_p >= 0; $check_size_p--) {
+
+ for (my $i = 0; $i < $max_tries; $i++) {
+ my $n = int (rand ($total_files));
+ my $file = $all_files[$n];
+ if (!$check_size_p || large_enough_p ($file)) {
+ if (! $url) {
+ $file =~ s@^\Q$dir/@@so || die; # remove $dir from front
+ }
+ return $file;
+ }
+ }
+ }
+
+ print STDERR "$progname: no suitable images in " . ($url || $dir) . " -- " .
+ ($total_files <= $max_tries
+ ? "all $total_files images"
+ : "$max_tries of $total_files images") .
+ " are smaller than ${min_image_width}x${min_image_height}.\n";
+
+ # If we got here, blow away the cache. Maybe it's stale.
+ unlink $cache_file_name if $cache_file_name;
+
+ exit 1;
+}
+
+
+sub large_enough_p($) {
+ my ($file) = @_;
+
+ my ($w, $h) = image_file_size ($file);
+
+ if (!defined ($h)) {
+
+ # Nonexistent files are obviously too small!
+ # Already printed $verbose message about the file not existing.
+ return 0 unless -f $file;
+
+ print STDERR "$progname: $file: unable to determine image size\n"
+ if ($verbose);
+ # Assume that unknown files are of good sizes: this will happen if
+ # they matched $good_file_re, but we don't have code to parse them.
+ # (This will also happen if the file is junk...)
+ return 1;
+ }
+
+ if ($w < $min_image_width || $h < $min_image_height) {
+ print STDERR "$progname: $file: too small ($w x $h)\n" if ($verbose);
+ return 0;
+ }
+
+ print STDERR "$progname: $file: $w x $h\n" if ($verbose);
+ return 1;
+}
+
+
+
+# Given the raw body of a GIF document, returns the dimensions of the image.
+#
+sub gif_size($) {
+ my ($body) = @_;
+ my $type = substr($body, 0, 6);
+ my $s;
+ return () unless ($type =~ /GIF8[7,9]a/);
+ $s = substr ($body, 6, 10);
+ my ($a,$b,$c,$d) = unpack ("C"x4, $s);
+ return (($b<<8|$a), ($d<<8|$c));
+}
+
+# Given the raw body of a JPEG document, returns the dimensions of the image.
+#
+sub jpeg_size($) {
+ my ($body) = @_;
+ my $i = 0;
+ my $L = length($body);
+
+ my $c1 = substr($body, $i, 1); $i++;
+ my $c2 = substr($body, $i, 1); $i++;
+ return () unless (ord($c1) == 0xFF && ord($c2) == 0xD8);
+
+ my $ch = "0";
+ while (ord($ch) != 0xDA && $i < $L) {
+ # Find next marker, beginning with 0xFF.
+ while (ord($ch) != 0xFF) {
+ return () if (length($body) <= $i);
+ $ch = substr($body, $i, 1); $i++;
+ }
+ # markers can be padded with any number of 0xFF.
+ while (ord($ch) == 0xFF) {
+ return () if (length($body) <= $i);
+ $ch = substr($body, $i, 1); $i++;
+ }
+
+ # $ch contains the value of the marker.
+ my $marker = ord($ch);
+
+ if (($marker >= 0xC0) &&
+ ($marker <= 0xCF) &&
+ ($marker != 0xC4) &&
+ ($marker != 0xCC)) { # it's a SOFn marker
+ $i += 3;
+ return () if (length($body) <= $i);
+ my $s = substr($body, $i, 4); $i += 4;
+ my ($a,$b,$c,$d) = unpack("C"x4, $s);
+ return (($c<<8|$d), ($a<<8|$b));
+
+ } else {
+ # We must skip variables, since FFs in variable names aren't
+ # valid JPEG markers.
+ return () if (length($body) <= $i);
+ my $s = substr($body, $i, 2); $i += 2;
+ my ($c1, $c2) = unpack ("C"x2, $s);
+ my $length = ($c1 << 8) | $c2;
+ return () if ($length < 2);
+ $i += $length-2;
+ }
+ }
+ return ();
+}
+
+# Given the raw body of a PNG document, returns the dimensions of the image.
+#
+sub png_size($) {
+ my ($body) = @_;
+ return () unless ($body =~ m/^\211PNG\r/s);
+ my ($bits) = ($body =~ m/^.{12}(.{12})/s);
+ return () unless defined ($bits);
+ return () unless ($bits =~ /^IHDR/);
+ my ($ign, $w, $h) = unpack("a4N2", $bits);
+ return ($w, $h);
+}
+
+
+# Given the raw body of a GIF, JPEG, or PNG document, returns the dimensions
+# of the image.
+#
+sub image_size($) {
+ my ($body) = @_;
+ return () if (length($body) < 10);
+ my ($w, $h) = gif_size ($body);
+ if ($w && $h) { return ($w, $h); }
+ ($w, $h) = jpeg_size ($body);
+ if ($w && $h) { return ($w, $h); }
+ # #### TODO: need image parsers for TIFF, XPM, XBM.
+ return png_size ($body);
+}
+
+# Returns the dimensions of the image file.
+#
+sub image_file_size($) {
+ my ($file) = @_;
+ my $in;
+ if (! open ($in, '<:raw', $file)) {
+ print STDERR "$progname: $file: $!\n" if ($verbose);
+ return ();
+ }
+ my $body = '';
+ sysread ($in, $body, 1024 * 50); # The first 50k should be enough.
+ close $in; # (It's not for certain huge jpegs...
+ return image_size ($body); # but we know they're huge!)
+}
+
+
+# Reads the prefs we use from ~/.xscreensaver
+#
+sub get_x11_prefs() {
+ my $got_any_p = 0;
+
+ if (open (my $in, '<', $config_file)) {
+ print STDERR "$progname: reading $config_file\n" if ($verbose > 1);
+ local $/ = undef; # read entire file
+ my $body = <$in>;
+ close $in;
+ $got_any_p = get_x11_prefs_1 ($body);
+
+ } elsif ($verbose > 1) {
+ print STDERR "$progname: $config_file: $!\n";
+ }
+
+ if (! $got_any_p && defined ($ENV{DISPLAY})) {
+ # We weren't able to read settings from the .xscreensaver file.
+ # Fall back to any settings in the X resource database
+ # (/usr/X11R6/lib/X11/app-defaults/XScreenSaver)
+ #
+ print STDERR "$progname: reading X resources\n" if ($verbose > 1);
+ my $body = `appres XScreenSaver xscreensaver -1`;
+ $got_any_p = get_x11_prefs_1 ($body);
+ }
+}
+
+
+sub get_x11_prefs_1($) {
+ my ($body) = @_;
+
+ my $got_any_p = 0;
+ $body =~ s@\\\n@@gs;
+ $body =~ s@^[ \t]*#[^\n]*$@@gm;
+
+ if ($body =~ m/^[.*]*imageDirectory:[ \t]*([^\s]+)\s*$/im) {
+ $image_directory = $1;
+ $got_any_p = 1;
+ }
+ return $got_any_p;
+}
+
+
+sub get_cocoa_prefs($) {
+ my ($id) = @_;
+ print STDERR "$progname: reading Cocoa prefs: \"$id\"\n" if ($verbose > 1);
+ my $v = get_cocoa_pref_1 ($id, "imageDirectory");
+ $v = '~/Pictures' unless defined ($v); # Match default in XScreenSaverView
+ $image_directory = $v if defined ($v);
+}
+
+
+sub get_cocoa_pref_1($$) {
+ my ($id, $key) = @_;
+ # make sure there's nothing stupid/malicious in either string.
+ $id =~ s/[^-a-z\d. ]/_/gsi;
+ $key =~ s/[^-a-z\d. ]/_/gsi;
+ my $cmd = "defaults -currentHost read \"$id\" \"$key\"";
+
+ print STDERR "$progname: executing $cmd\n"
+ if ($verbose > 3);
+
+ my $val = `$cmd 2>/dev/null`;
+ $val =~ s/^\s+//s;
+ $val =~ s/\s+$//s;
+
+ print STDERR "$progname: Cocoa: $id $key = \"$val\"\n"
+ if ($verbose > 2);
+
+ $val = undef if ($val =~ m/^$/s);
+
+ return $val;
+}
+
+
+sub error($) {
+ my ($err) = @_;
+ print STDERR "$progname: $err\n";
+ exit 1;
+}
+
+sub usage() {
+ print STDERR "usage: $progname [--verbose] [ directory-or-feed-url ]\n\n" .
+ " Prints the name of a randomly-selected image file. The directory\n" .
+ " is searched recursively. Images smaller than " .
+ "${min_image_width}x${min_image_height} are excluded.\n" .
+ "\n" .
+ " The directory may also be the URL of an RSS/Atom feed. Enclosed\n" .
+ " images will be downloaded and cached locally.\n" .
+ "\n";
+ exit 1;
+}
+
+sub main() {
+ my $cocoa_id = undef;
+ my $abs_p = 0;
+
+ while ($_ = $ARGV[0]) {
+ shift @ARGV;
+ if (m/^--?verbose$/s) { $verbose++; }
+ elsif (m/^-v+$/s) { $verbose += length($_)-1; }
+ elsif (m/^--?name$/s) { } # ignored, for compatibility
+ elsif (m/^--?spotlight$/s) { $use_spotlight_p = 1; }
+ elsif (m/^--?no-spotlight$/s) { $use_spotlight_p = 0; }
+ elsif (m/^--?cache$/s) { $cache_p = 1; }
+ elsif (m/^--?no-?cache$/s) { $cache_p = 0; }
+ elsif (m/^--?cocoa$/) { $cocoa_id = shift @ARGV; }
+ elsif (m/^--?abs(olute)?$/) { $abs_p = 1; }
+ elsif (m/^-./) { usage; }
+ elsif (!defined($image_directory)) { $image_directory = $_; }
+ else { usage; }
+ }
+
+ # Most hacks (X11 and Cocoa) pass a --directory value on the command line,
+ # but if they don't, look it up from the resources. Currently this only
+ # happens with "glitchpeg" which invokes xscreensaver-getimage-file
+ # directly instead of going through the traditional path.
+ #
+ if (! $image_directory) {
+ if (!defined ($cocoa_id)) {
+ # see OSX/XScreenSaverView.m
+ $cocoa_id = $ENV{XSCREENSAVER_CLASSPATH};
+ }
+
+ if (defined ($cocoa_id)) {
+ get_cocoa_prefs($cocoa_id);
+ error ("no imageDirectory in $cocoa_id") unless $image_directory;
+ } else {
+ get_x11_prefs();
+ error ("no imageDirectory in X11 resources") unless $image_directory;
+ }
+ }
+
+ usage unless (defined($image_directory));
+
+ $image_directory =~ s@^feed:@http:@si;
+
+ if ($image_directory =~ m/^https?:/si) {
+ # ok
+ } else {
+ $image_directory =~ s@^~/@$ENV{HOME}/@s; # allow literal "~/"
+ $image_directory =~ s@/+$@@s; # omit trailing /
+
+ if (! -d $image_directory) {
+ print STDERR "$progname: $image_directory not a directory or URL\n";
+ usage;
+ }
+ }
+
+ my $file = find_random_file ($image_directory);
+
+ # With --absolute return fully qualified paths instead of relative to --dir.
+ if ($abs_p &&
+ $file !~ m@^/@ &&
+ $image_directory =~ m@^/@s) {
+ $file = "$image_directory/$file";
+ $file =~ s@//+@/@gs;
+ }
+
+ print STDOUT "$file\n";
+}
+
+main;
+exit 0;
diff --git a/driver/xscreensaver-getimage-file.man b/driver/xscreensaver-getimage-file.man
new file mode 100644
index 0000000..778ad85
--- /dev/null
+++ b/driver/xscreensaver-getimage-file.man
@@ -0,0 +1,66 @@
+.TH XScreenSaver 1 "20-Mar-2005 (4.21)" "X Version 11"
+.SH NAME
+xscreensaver-getimage-file - put a randomly-selected image on the root window
+.SH SYNOPSIS
+.B xscreensaver-getimage-file
+[\-display \fIhost:display.screen\fP]
+[\--verbose]
+[\--name]
+[\--no-cache]
+directory-or-URL
+.SH DESCRIPTION
+The \fIxscreensaver\-getimage\-file\fP program is a helper program
+for the xscreensaver hacks that manipulate images. Specifically, it
+is invoked by
+.BR xscreensaver\-getimage (1)
+as needed. This is not a user-level command.
+
+This program selects a random image from disk, and loads it on the root
+window. It does this by figuring out which image-loading programs are
+installed on the system, and invoking the first one it finds.
+.SH OPTIONS
+.I xscreensaver-getimage-file
+accepts the following options:
+.TP 4
+.B --verbose
+Print diagnostics.
+.TP 4
+.B --name
+Don't load an image: instead just print the file name to stdout.
+.TP 4
+.I directory-or-URL
+If a directory is specified, it will be searched recursively for
+images. Any images found will eligible for display. For efficiency,
+the contents of the directory are cached for a few hours before it
+is re-scanned.
+
+If a URL is specified, it should be the URL of an RSS or Atom feed
+containing images. The first time it is accessed, all of the images
+in the feed will be downloaded to a local cache directory. If a few
+hours have elapsed since last time, the URL will be polled again, and
+any new images will be cached, any images no longer in the feed
+will be expired.
+.TP 4
+.B --no-cache
+Update the cache immediately, even if it is not time yet. This
+will re-scan the directory, or re-poll the RSS feed.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1),
+.BR xv (1),
+.BR xli (1),
+.BR xloadimage (1),
+.BR chbg (1)
+.SH COPYRIGHT
+Copyright \(co 2001-2012 by Jamie Zawinski. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 14-Apr-01
diff --git a/driver/xscreensaver-getimage-video b/driver/xscreensaver-getimage-video
new file mode 100755
index 0000000..dbc8986
--- /dev/null
+++ b/driver/xscreensaver-getimage-video
@@ -0,0 +1,144 @@
+#!/usr/bin/perl -w
+# Copyright © 2001-2015 Jamie Zawinski <jwz@jwz.org>.
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+#
+# This program attempts to grab a single frame of video from the system's
+# video capture card, and then load it on to the root window using the
+# "xscreensaver-getimage-file" program. Various frame-grabbing programs
+# are known, and the first one found is used.
+#
+# The various xscreensaver hacks that manipulate images ("slidescreen",
+# "jigsaw", etc.) get the image to manipulate by running the
+# "xscreensaver-getimage" program.
+#
+# The various screen savers invoke "xscreensaver-getimage", which will in
+# turn invoke this program, depending on the value of the "grabVideoFrames"
+# setting in the ~/.xscreensaver file (or in the app-defaults file, usually
+# /usr/lib/X11/app-defaults/XScreenSaver).
+#
+# Created: 13-Apr-2001.
+
+require 5;
+#use diagnostics; # Fails on some MacOS 10.5 systems
+use strict;
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my $version = q{ $Revision: 1.23 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+
+my $tmpdir = $ENV{TMPDIR} || "/tmp";
+my $tmpfile = sprintf("%s/xssv.%08x.ppm", $tmpdir, rand(0xFFFFFFFF));
+
+my $verbose = 0;
+
+
+# These are programs that can be used to grab a video frame. The first one
+# of these programs that exists on $PATH will be used, and the image file
+# is assumed to be written to $tmpfile (in some image format acceptable to
+# "xscreensaver-getimage-file", e.g., PPM or JPEG.)
+#
+# If you add other programs to this list, please let me know!
+#
+my @programs = (
+
+ "bttvgrab -d q -Q -l 1 -o ppm -f $tmpfile", # BTTV
+ "qcam > $tmpfile", # Connectix Qcam
+ "gqcam -t PPM -d $tmpfile", # GTK+ Qcam clone
+
+ "v4lctl snap ppm full $tmpfile", # XawTV 3.94.
+
+ "streamer -a -s 768x576 -o $tmpfile", # XawTV
+ # the "-a" option ("mute audio") arrived with XawTV 3.76.
+
+ "atitv snap $tmpfile", # ATI video capture card
+
+ "grab -type ppm -format ntsc -source 1 " . # *BSD BT848 module
+ "-settle 0.75 -output $tmpfile",
+
+ "motioneye -j $tmpfile", # Sony Vaio MotionEye
+ # (hardware jpeg encoder)
+
+ "vidcat -b -f ppm -s 640x480 > $tmpfile 2>&-", # w3cam/ovcam
+
+ "vidtomem -f $tmpfile 2>&- " . # Silicon Graphics
+ "&& mv $tmpfile-00000.rgb $tmpfile",
+
+ # Maybe this works?
+ # "ffmpeg -i /dev/video0 -ss 00:00:01 -vframes 1 $tmpfile 2>&-",
+
+ # "mplayer -really-quiet tv://0 " . # Maybe works with some cams?
+ # "-ao null -vo pnm -frames 1 2>&- " .
+ # "&& mv 00000001.ppm $tmpfile",
+
+);
+
+
+sub error($) {
+ my ($e) = @_;
+ print STDERR "$progname: $e\n";
+ exit 1;
+}
+
+sub pick_grabber() {
+ my @names = ();
+
+ foreach my $cmd (@programs) {
+ $_ = $cmd;
+ my ($name) = m/^([^ ]+)/;
+ push @names, "\"$name\"";
+ print STDERR "$progname: looking for $name...\n" if ($verbose > 2);
+ foreach my $dir (split (/:/, $ENV{PATH})) {
+ print STDERR "$progname: checking $dir/$name\n" if ($verbose > 3);
+ if (-x "$dir/$name") {
+ return $cmd;
+ }
+ }
+ }
+
+ $names[$#names] = "or " . $names[$#names];
+ error ("none of: " . join (", ", @names) . " were found on \$PATH.");
+}
+
+
+sub grab_image() {
+ my $cmd = pick_grabber();
+ unlink $tmpfile;
+
+ print STDERR "$progname: executing \"$cmd\"\n" if ($verbose);
+ system ($cmd);
+
+ if (! -s $tmpfile) {
+ unlink $tmpfile;
+ error ("\"$cmd\" produced no data.");
+ }
+
+ print STDERR "$progname: wrote \"$tmpfile\"\n" if ($verbose);
+ print STDOUT "$tmpfile\n";
+}
+
+
+sub usage() {
+ print STDERR "usage: $progname [--verbose] [--name | --stdout]\n";
+ exit 1;
+}
+
+sub main() {
+ while ($_ = $ARGV[0]) {
+ shift @ARGV;
+ if (m/^--?verbose$/s) { $verbose++; }
+ elsif (m/^-v+$/s) { $verbose += length($_)-1; }
+ elsif (m/^--?name$/s) { } # ignored, for compatibility
+ elsif (m/^-./) { usage; }
+ else { usage; }
+ }
+ grab_image();
+}
+
+main;
+exit 0;
diff --git a/driver/xscreensaver-getimage-video.man b/driver/xscreensaver-getimage-video.man
new file mode 100644
index 0000000..d19f34e
--- /dev/null
+++ b/driver/xscreensaver-getimage-video.man
@@ -0,0 +1,51 @@
+.TH XScreenSaver 1 "20-Mar-2005 (4.21)" "X Version 11"
+.SH NAME
+xscreensaver-getimage-video - put a video frame on the root window
+.SH SYNOPSIS
+.B xscreensaver-getimage-video
+[\-display \fIhost:display.screen\fP] [\--verbose] [\--stdout]
+.SH DESCRIPTION
+The \fIxscreensaver\-getimage\-video\fP program is a helper program
+for the xscreensaver hacks that manipulate images. Specifically, it
+is invoked by
+.BR xscreensaver\-getimage (1)
+as needed. This is not a user-level command.
+
+This program grabs a random frame of video from the system's video input,
+and then loads it on the root window. It does this by figuring out which
+frame-grabbing programs are installed on the system, and invoking the
+first one it finds. Then it runs
+.BR xscreensaver\-getimage\-file (1)
+to load that image onto the root window.
+.SH OPTIONS
+.I xscreensaver-getimage-video
+accepts the following options:
+.TP 4
+.B --verbose
+Print diagnostics.
+.TP 4
+.B --stdout
+Instead of loading the image onto the root window, write it to stdout
+as a PBM file.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1),
+.BR xscreensaver\-getimage\-file (1),
+.BR bttvgrab (1),
+.BR qcam (1),
+.BR streamer (1),
+.BR atitv (1),
+.BR vidtomem (1)
+.SH COPYRIGHT
+Copyright \(co 2001 by Jamie Zawinski. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 14-Apr-01
diff --git a/driver/xscreensaver-getimage.c b/driver/xscreensaver-getimage.c
new file mode 100644
index 0000000..092540d
--- /dev/null
+++ b/driver/xscreensaver-getimage.c
@@ -0,0 +1,2000 @@
+/* xscreensaver, Copyright (c) 2001-2018 by Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* xscreensaver-getimage -- helper program that puts a random image
+ onto the given window or pixmap. That image is either a screen-grab,
+ a file loaded from disk, or a frame grabbed from the system's video
+ input.
+ */
+
+#include "utils.h"
+
+#include <X11/Intrinsic.h>
+#include <ctype.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+
+#ifdef HAVE_SYS_WAIT_H
+# include <sys/wait.h> /* for waitpid() and associated macros */
+#endif
+
+#ifdef HAVE_XMU
+# ifndef VMS
+# include <X11/Xmu/Error.h>
+# else /* VMS */
+# include <Xmu/Error.h>
+# endif
+#else
+# include "xmu.h"
+#endif
+
+#include "yarandom.h"
+#include "grabscreen.h"
+#include "resources.h"
+#include "colorbars.h"
+#include "visual.h"
+#include "prefs.h"
+#include "version.h"
+#include "vroot.h"
+
+#ifndef _XSCREENSAVER_VROOT_H_
+# error Error! You have an old version of vroot.h! Check -I args.
+#endif /* _XSCREENSAVER_VROOT_H_ */
+
+#ifdef HAVE_GDK_PIXBUF
+# undef HAVE_JPEGLIB
+# ifdef HAVE_GTK2
+# include <gdk-pixbuf-xlib/gdk-pixbuf-xlib.h>
+# else /* !HAVE_GTK2 */
+# include <gdk-pixbuf/gdk-pixbuf-xlib.h>
+# endif /* !HAVE_GTK2 */
+#endif /* HAVE_GDK_PIXBUF */
+
+#ifdef HAVE_JPEGLIB
+# undef HAVE_GDK_PIXBUF
+# include <jpeglib.h>
+#endif
+
+
+#ifdef __APPLE__
+ /* On MacOS under X11, the usual X11 mechanism of getting a screen shot
+ doesn't work, and we need to use an external program. This is only
+ used when running under X11 on MacOS. If it's a Cocoa build, this
+ path is not taken, and OSX/grabclient-osx.m is used instead.
+ */
+# define USE_EXTERNAL_SCREEN_GRABBER
+#endif
+
+
+#ifdef __GNUC__
+ __extension__ /* shut up about "string length is greater than the length
+ ISO C89 compilers are required to support" when including
+ the .ad file... */
+#endif
+
+static char *defaults[] = {
+#include "../driver/XScreenSaver_ad.h"
+ 0
+};
+
+
+
+char *progname = 0;
+char *progclass = "XScreenSaver";
+XrmDatabase db;
+XtAppContext app;
+
+extern void grabscreen_verbose (void);
+
+typedef enum {
+ GRAB_DESK, GRAB_VIDEO, GRAB_FILE, GRAB_BARS
+} grab_type;
+
+
+#define GETIMAGE_VIDEO_PROGRAM "xscreensaver-getimage-video"
+#define GETIMAGE_FILE_PROGRAM "xscreensaver-getimage-file"
+#define GETIMAGE_SCREEN_PROGRAM "xscreensaver-getimage-desktop"
+
+extern const char *blurb (void);
+
+const char *
+blurb (void)
+{
+ return progname;
+}
+
+
+static int
+x_ehandler (Display *dpy, XErrorEvent *error)
+{
+ if (error->error_code == BadWindow || error->error_code == BadDrawable)
+ {
+ fprintf (stderr, "%s: target %s 0x%lx unexpectedly deleted\n", progname,
+ (error->error_code == BadWindow ? "window" : "pixmap"),
+ (unsigned long) error->resourceid);
+ }
+ else
+ {
+ fprintf (stderr, "\nX error in %s:\n", progname);
+ XmuPrintDefaultErrorMessage (dpy, error, stderr);
+ }
+ exit (-1);
+ return 0;
+}
+
+
+static Bool error_handler_hit_p = False;
+
+static int
+ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
+{
+ error_handler_hit_p = True;
+ return 0;
+}
+
+#ifndef USE_EXTERNAL_SCREEN_GRABBER
+static int
+ignore_badmatch_ehandler (Display *dpy, XErrorEvent *error)
+{
+ if (error->error_code == BadMatch)
+ return ignore_all_errors_ehandler (dpy, error);
+ else
+ return x_ehandler (dpy, error);
+}
+#endif /* ! USE_EXTERNAL_SCREEN_GRABBER */
+
+
+/* Returns True if the given Drawable is a Window; False if it's a Pixmap.
+ */
+static Bool
+drawable_window_p (Display *dpy, Drawable d)
+{
+ XErrorHandler old_handler;
+ XWindowAttributes xgwa;
+
+ XSync (dpy, False);
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+ error_handler_hit_p = False;
+ XGetWindowAttributes (dpy, d, &xgwa);
+ XSync (dpy, False);
+ XSetErrorHandler (old_handler);
+ XSync (dpy, False);
+
+ if (!error_handler_hit_p)
+ return True; /* It's a Window. */
+ else
+ return False; /* It's a Pixmap, or an invalid ID. */
+}
+
+
+/* Returns true if the window is the root window, or a virtual root window,
+ but *not* the xscreensaver window. That is, if it's a "real" desktop
+ root window of some kind.
+ */
+static Bool
+root_window_p (Screen *screen, Window window)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ Atom type;
+ int format;
+ unsigned long nitems, bytesafter;
+ unsigned char *version;
+
+ if (window != RootWindowOfScreen (screen))
+ return False;
+
+ if (XGetWindowProperty (dpy, window,
+ XInternAtom (dpy, "_SCREENSAVER_VERSION", False),
+ 0, 1, False, XA_STRING,
+ &type, &format, &nitems, &bytesafter,
+ &version)
+ == Success
+ && type != None)
+ return False;
+
+ return True;
+}
+
+
+/* Clear the window or pixmap to black, or its background color.
+ */
+static void
+clear_drawable (Screen *screen, Drawable drawable)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ XGCValues gcv;
+ GC gc;
+ Window root;
+ int x, y;
+ unsigned int w, h, bw, d;
+ XGetGeometry (dpy, drawable, &root, &x, &y, &w, &h, &bw, &d);
+
+ /* The window might have no-op background of None, so to clear it,
+ draw a black rectangle first, then do XClearWindow (in case the
+ actual background color is non-black...) */
+
+ /* #### really we should allocate "black" instead, but I'm lazy... */
+ gcv.foreground = BlackPixelOfScreen (screen);
+ gc = XCreateGC (dpy, drawable, GCForeground, &gcv);
+ XFillRectangle (dpy, drawable, gc, 0, 0, w, h);
+ XFreeGC (dpy, gc);
+ if (drawable_window_p (dpy, drawable))
+ XClearWindow (dpy, (Window) drawable);
+ XFlush (dpy);
+}
+
+
+/* Figure out what kind of scaling/positioning we ought to do to display
+ a src-sized image in a dest-sized window/pixmap. Returns the width
+ and height to which the image should be scaled, and the position where
+ it should be displayed to center it.
+ */
+static void
+compute_image_scaling (int src_w, int src_h,
+ int dest_w, int dest_h,
+ Bool verbose_p,
+ int *scaled_from_x_ret, int *scaled_from_y_ret,
+ int *scaled_to_x_ret, int *scaled_to_y_ret,
+ int *scaled_w_ret, int *scaled_h_ret)
+{
+ int srcx, srcy, destx, desty;
+
+ Bool exact_fit_p = ((src_w == dest_w && src_h <= dest_h) ||
+ (src_h == dest_h && src_w <= dest_w));
+
+ if (!exact_fit_p) /* scale the image up or down */
+ {
+ float rw = (float) dest_w / src_w;
+ float rh = (float) dest_h / src_h;
+ float r = (rw < rh ? rw : rh);
+ int tw, th, pct;
+
+ /* If the window is a goofy aspect ratio, take a middle slice of
+ the image instead. */
+ if (dest_w > dest_h * 5 || dest_h > dest_w * 5)
+ {
+ double r2 = (dest_w > dest_h
+ ? dest_w / (double) dest_h
+ : dest_h / (double) dest_w);
+ r *= r2;
+ if (verbose_p)
+ fprintf (stderr, "%s: weird aspect: scaling by %.1f\n",
+ progname, r2);
+ }
+
+ tw = src_w * r;
+ th = src_h * r;
+ pct = (r * 100);
+
+#if 0
+ /* this optimization breaks things */
+ if (pct < 95 || pct > 105) /* don't scale if it's close */
+#endif
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: scaling image by %d%% (%dx%d -> %dx%d)\n",
+ progname, pct, src_w, src_h, tw, th);
+ src_w = tw;
+ src_h = th;
+ }
+ }
+
+ /* Center the image on the window/pixmap. */
+ srcx = 0;
+ srcy = 0;
+ destx = (dest_w - src_w) / 2;
+ desty = (dest_h - src_h) / 2;
+ if (destx < 0) srcx = -destx, destx = 0;
+ if (desty < 0) srcy = -desty, desty = 0;
+
+ /* if (dest_w < src_w) src_w = dest_w;
+ if (dest_h < src_h) src_h = dest_h; */
+
+ *scaled_w_ret = src_w;
+ *scaled_h_ret = src_h;
+ *scaled_from_x_ret = srcx;
+ *scaled_from_y_ret = srcy;
+ *scaled_to_x_ret = destx;
+ *scaled_to_y_ret = desty;
+
+ if (verbose_p)
+ fprintf (stderr, "%s: displaying %dx%d+%d+%d image at %d,%d in %dx%d.\n",
+ progname, src_w, src_h, srcx, srcy, destx, desty, dest_w, dest_h);
+}
+
+
+static void
+colorbars (Screen *screen, Visual *visual, Drawable drawable, Colormap cmap)
+{
+ Pixmap mask = 0;
+ unsigned long *pixels; /* ignored - unfreed */
+ int npixels;
+ Pixmap logo = xscreensaver_logo (screen, visual, drawable, cmap,
+ BlackPixelOfScreen (screen),
+ &pixels, &npixels, &mask, True);
+ draw_colorbars (screen, visual, drawable, cmap, 0, 0, 0, 0, logo, mask);
+ XFreePixmap (DisplayOfScreen (screen), logo);
+ XFreePixmap (DisplayOfScreen (screen), mask);
+}
+
+
+/* Scales an XImage, modifying it in place.
+ This doesn't do dithering or smoothing, so it might have artifacts.
+ If out of memory, returns False, and the XImage will have been
+ destroyed and freed.
+ */
+#if !defined(USE_EXTERNAL_SCREEN_GRABBER) || defined(HAVE_JPEGLIB)
+static Bool
+scale_ximage (Screen *screen, Visual *visual,
+ XImage *ximage, int new_width, int new_height)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ int depth = visual_depth (screen, visual);
+ int x, y;
+ double xscale, yscale;
+
+ XImage *ximage2 = XCreateImage (dpy, visual, depth,
+ ZPixmap, 0, 0,
+ new_width, new_height, 8, 0);
+ ximage2->data = (char *) calloc (ximage2->height, ximage2->bytes_per_line);
+
+ if (!ximage2->data)
+ {
+ fprintf (stderr, "%s: out of memory scaling %dx%d image to %dx%d\n",
+ progname,
+ ximage->width, ximage->height,
+ ximage2->width, ximage2->height);
+ if (ximage->data) free (ximage->data);
+ if (ximage2->data) free (ximage2->data);
+ ximage->data = 0;
+ ximage2->data = 0;
+ XDestroyImage (ximage);
+ XDestroyImage (ximage2);
+ return False;
+ }
+
+ /* Brute force scaling... */
+ xscale = (double) ximage->width / ximage2->width;
+ yscale = (double) ximage->height / ximage2->height;
+ for (y = 0; y < ximage2->height; y++)
+ for (x = 0; x < ximage2->width; x++)
+ XPutPixel (ximage2, x, y,
+ XGetPixel (ximage, x * xscale, y * yscale));
+
+ free (ximage->data);
+ ximage->data = 0;
+
+ (*ximage) = (*ximage2);
+
+ ximage2->data = 0;
+ XDestroyImage (ximage2);
+
+ return True;
+}
+#endif /* !USE_EXTERNAL_SCREEN_GRABBER || HAVE_JPEGLIB */
+
+
+#ifdef HAVE_GDK_PIXBUF
+
+/* Reads the given image file and renders it on the Drawable, using GDK.
+ Returns False if it fails.
+ */
+static Bool
+read_file_gdk (Screen *screen, Window window, Drawable drawable,
+ const char *filename, Bool verbose_p,
+ XRectangle *geom_ret)
+{
+ GdkPixbuf *pb;
+ Display *dpy = DisplayOfScreen (screen);
+ unsigned int win_width, win_height, win_depth;
+# ifdef HAVE_GTK2
+ GError *gerr = 0;
+# endif /* HAVE_GTK2 */
+
+ /* Find the size of the Drawable. */
+ {
+ Window root;
+ int x, y;
+ unsigned int bw;
+ XGetGeometry (dpy, drawable,
+ &root, &x, &y, &win_width, &win_height, &bw, &win_depth);
+ }
+
+ gdk_pixbuf_xlib_init_with_depth (dpy, screen_number (screen), win_depth);
+# ifdef HAVE_GTK2
+# if !GLIB_CHECK_VERSION(2, 36 ,0)
+ g_type_init();
+# endif
+# else /* !HAVE_GTK2 */
+ xlib_rgb_init (dpy, screen);
+# endif /* !HAVE_GTK2 */
+
+ pb = gdk_pixbuf_new_from_file (filename
+# ifdef HAVE_GTK2
+ , &gerr
+# endif /* HAVE_GTK2 */
+ );
+
+ if (!pb)
+ {
+ fprintf (stderr, "%s: unable to load \"%s\"\n", progname, filename);
+# ifdef HAVE_GTK2
+ if (gerr && gerr->message && *gerr->message)
+ fprintf (stderr, "%s: reason: %s\n", progname, gerr->message);
+# endif /* HAVE_GTK2 */
+ return False;
+ }
+ else
+ {
+ int w = gdk_pixbuf_get_width (pb);
+ int h = gdk_pixbuf_get_height (pb);
+ int srcx, srcy, destx, desty, w2, h2;
+ Bool bg_p = False;
+
+# ifdef HAVE_GDK_PIXBUF_APPLY_EMBEDDED_ORIENTATION
+ {
+ int ow = w, oh = h;
+ GdkPixbuf *opb = pb;
+ pb = gdk_pixbuf_apply_embedded_orientation (opb);
+ g_object_unref (opb);
+ w = gdk_pixbuf_get_width (pb);
+ h = gdk_pixbuf_get_height (pb);
+ if (verbose_p && (w != ow || h != oh))
+ fprintf (stderr, "%s: rotated %dx%d to %dx%d\n",
+ progname, ow, oh, w, h);
+ }
+# endif
+
+ compute_image_scaling (w, h, win_width, win_height, verbose_p,
+ &srcx, &srcy, &destx, &desty, &w2, &h2);
+ if (w != w2 || h != h2)
+ {
+ GdkPixbuf *pb2 = gdk_pixbuf_scale_simple (pb, w2, h2,
+ GDK_INTERP_BILINEAR);
+ if (pb2)
+ {
+ g_object_unref (pb);
+ pb = pb2;
+ w = w2;
+ h = h2;
+ }
+ else
+ fprintf (stderr, "%s: out of memory when scaling?\n", progname);
+ }
+
+ /* If we're rendering onto the root window (and it's not the
+ xscreensaver pseudo-root) then put the image in the window's
+ background. Otherwise, just paint the image onto the window.
+ */
+ bg_p = (window == drawable && root_window_p (screen, window));
+
+ if (bg_p)
+ {
+ XGCValues gcv;
+ GC gc;
+ drawable = XCreatePixmap (dpy, window,
+ win_width, win_height, win_depth);
+ gcv.foreground = BlackPixelOfScreen (screen);
+ gc = XCreateGC (dpy, drawable, GCForeground, &gcv);
+ XFillRectangle (dpy, drawable, gc, 0, 0, win_width, win_height);
+ XFreeGC (dpy, gc);
+ }
+ else
+ clear_drawable (screen, drawable);
+
+ /* #### Note that this always uses the default colormap! Morons!
+ Owen says that in Gnome 2.0, I should try using
+ gdk_pixbuf_render_pixmap_and_mask_for_colormap() instead.
+ But I haven't tried.
+ */
+ if (srcx > 0) w -= srcx;
+ if (srcy > 0) h -= srcy;
+ gdk_pixbuf_xlib_render_to_drawable_alpha (pb, drawable,
+ srcx, srcy, destx, desty,
+ w, h,
+ GDK_PIXBUF_ALPHA_FULL, 127,
+ XLIB_RGB_DITHER_NORMAL,
+ 0, 0);
+ if (bg_p)
+ {
+ XSetWindowBackgroundPixmap (dpy, window, drawable);
+ XClearWindow (dpy, window);
+ }
+
+ if (geom_ret)
+ {
+ geom_ret->x = destx;
+ geom_ret->y = desty;
+ geom_ret->width = w;
+ geom_ret->height = h;
+ }
+ }
+
+ XSync (dpy, False);
+ return True;
+}
+
+#endif /* HAVE_GDK_PIXBUF */
+
+
+
+#ifdef HAVE_JPEGLIB
+
+/* Allocates a colormap that makes a PseudoColor or DirectColor
+ visual behave like a TrueColor visual of the same depth.
+
+ #### Duplicated in utils/grabscreen.c
+ */
+static void
+allocate_cubic_colormap (Screen *screen, Visual *visual, Colormap cmap,
+ Bool verbose_p)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ int nr, ng, nb, cells;
+ int r, g, b;
+ int depth;
+ XColor colors[4097];
+ int i;
+
+ depth = visual_depth (screen, visual);
+
+ switch (depth)
+ {
+ case 8: nr = 3; ng = 3; nb = 2; cells = 256; break;
+ case 12: nr = 4; ng = 4; nb = 4; cells = 4096; break;
+ default: abort(); break;
+ }
+
+ memset(colors, 0, sizeof(colors));
+ for (r = 0; r < (1 << nr); r++)
+ for (g = 0; g < (1 << ng); g++)
+ for (b = 0; b < (1 << nb); b++)
+ {
+ i = (r | (g << nr) | (b << (nr + ng)));
+ colors[i].pixel = i;
+ colors[i].flags = DoRed|DoGreen|DoBlue;
+ if (depth == 8)
+ {
+ colors[i].red = ((r << 13) | (r << 10) | (r << 7) |
+ (r << 4) | (r << 1));
+ colors[i].green = ((g << 13) | (g << 10) | (g << 7) |
+ (g << 4) | (g << 1));
+ colors[i].blue = ((b << 14) | (b << 12) | (b << 10) |
+ (b << 8) | (b << 6) | (b << 4) |
+ (b << 2) | b);
+ }
+ else
+ {
+ colors[i].red = (r << 12) | (r << 8) | (r << 4) | r;
+ colors[i].green = (g << 12) | (g << 8) | (g << 4) | g;
+ colors[i].blue = (b << 12) | (b << 8) | (b << 4) | b;
+ }
+ }
+
+ {
+ int j;
+ int allocated = 0;
+ int interleave = cells / 8; /* skip around, rather than allocating in
+ order, so that we get better coverage if
+ we can't allocated all of them. */
+ for (j = 0; j < interleave; j++)
+ for (i = 0; i < cells; i += interleave)
+ if (XAllocColor (dpy, cmap, &colors[i + j]))
+ allocated++;
+
+ if (verbose_p)
+ fprintf (stderr, "%s: allocated %d of %d colors for cubic map\n",
+ progname, allocated, cells);
+ }
+}
+
+/* Find the pixel index that is closest to the given color
+ (using linear distance in RGB space -- which is far from the best way.)
+
+ #### Duplicated in utils/grabscreen.c
+ */
+static unsigned long
+find_closest_pixel (XColor *colors, int ncolors,
+ unsigned long r, unsigned long g, unsigned long b)
+{
+ unsigned long distance = ~0;
+ int i, found = 0;
+
+ if (ncolors == 0)
+ abort();
+ for (i = 0; i < ncolors; i++)
+ {
+ unsigned long d;
+ int rd, gd, bd;
+
+ rd = r - colors[i].red;
+ gd = g - colors[i].green;
+ bd = b - colors[i].blue;
+ if (rd < 0) rd = -rd;
+ if (gd < 0) gd = -gd;
+ if (bd < 0) bd = -bd;
+ d = (rd << 1) + (gd << 2) + bd;
+
+ if (d < distance)
+ {
+ distance = d;
+ found = i;
+ if (distance == 0)
+ break;
+ }
+ }
+
+ return found;
+}
+
+
+/* Given an XImage with 8-bit or 12-bit RGB data, convert it to be
+ displayable with the given X colormap. The farther from a perfect
+ color cube the contents of the colormap are, the lossier the
+ transformation will be. No dithering is done.
+
+ #### Duplicated in utils/grabscreen.c
+ */
+static void
+remap_image (Screen *screen, Colormap cmap, XImage *image, Bool verbose_p)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ unsigned long map[4097];
+ int x, y, i;
+ int cells;
+ XColor colors[4097];
+
+ if (image->depth == 8)
+ cells = 256;
+ else if (image->depth == 12)
+ cells = 4096;
+ else
+ abort();
+
+ memset(map, -1, sizeof(*map));
+ memset(colors, -1, sizeof(*colors));
+
+ for (i = 0; i < cells; i++)
+ colors[i].pixel = i;
+ XQueryColors (dpy, cmap, colors, cells);
+
+ if (verbose_p)
+ fprintf(stderr, "%s: building color cube for %d bit image\n",
+ progname, image->depth);
+
+ for (i = 0; i < cells; i++)
+ {
+ unsigned short r, g, b;
+
+ if (cells == 256)
+ {
+ /* "RRR GGG BB" In an 8 bit map. Convert that to
+ "RRR RRR RR" "GGG GGG GG" "BB BB BB BB" to give
+ an even spread. */
+ r = (i & 0x07);
+ g = (i & 0x38) >> 3;
+ b = (i & 0xC0) >> 6;
+
+ r = ((r << 13) | (r << 10) | (r << 7) | (r << 4) | (r << 1));
+ g = ((g << 13) | (g << 10) | (g << 7) | (g << 4) | (g << 1));
+ b = ((b << 14) | (b << 12) | (b << 10) | (b << 8) |
+ (b << 6) | (b << 4) | (b << 2) | b);
+ }
+ else
+ {
+ /* "RRRR GGGG BBBB" In a 12 bit map. Convert that to
+ "RRRR RRRR" "GGGG GGGG" "BBBB BBBB" to give an even
+ spread. */
+ r = (i & 0x00F);
+ g = (i & 0x0F0) >> 4;
+ b = (i & 0xF00) >> 8;
+
+ r = (r << 12) | (r << 8) | (r << 4) | r;
+ g = (g << 12) | (g << 8) | (g << 4) | g;
+ b = (b << 12) | (b << 8) | (b << 4) | b;
+ }
+
+ map[i] = find_closest_pixel (colors, cells, r, g, b);
+ }
+
+ if (verbose_p)
+ fprintf(stderr, "%s: remapping colors in %d bit image\n",
+ progname, image->depth);
+
+ for (y = 0; y < image->height; y++)
+ for (x = 0; x < image->width; x++)
+ {
+ unsigned long pixel = XGetPixel(image, x, y);
+ if (pixel >= cells) abort();
+ XPutPixel(image, x, y, map[pixel]);
+ }
+}
+
+
+/* If the file has a PPM (P6) on it, read it and return an XImage.
+ Otherwise, rewind the fd back to the beginning, and return 0.
+ */
+static XImage *
+maybe_read_ppm (Screen *screen, Visual *visual,
+ const char *filename, FILE *in, Bool verbose_p)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ int depth = visual_depth (screen, visual);
+ struct stat st;
+ char *buf = 0;
+ int bufsiz = 0;
+ char *s, dummy;
+ int i, j;
+ int x, y, w, h, maxval;
+ XImage *ximage = 0;
+
+ if (fstat (fileno (in), &st))
+ goto FAIL;
+
+ bufsiz = st.st_size;
+ buf = (char *) malloc (bufsiz + 1);
+ if (!buf)
+ {
+ fprintf (stderr, "%s: out of memory loading %d byte PPM file %s\n",
+ progname, bufsiz, filename);
+ goto FAIL;
+ }
+
+ if (! (s = fgets (buf, bufsiz, in))) /* line 1 */
+ goto FAIL;
+
+ if (!strncmp (buf, "\107\111", 2))
+ {
+ fprintf (stderr, "%s: %s: sorry, GIF files not supported"
+ " when compiled with JPEGlib instead of GDK_Pixbuf.\n",
+ progname, filename);
+ goto FAIL;
+ }
+ else if (!strncmp (buf, "\211\120", 2))
+ {
+ fprintf (stderr, "%s: %s: sorry, PNG files not supported"
+ " when compiled with JPEGlib instead of GDK_Pixbuf.\n",
+ progname, filename);
+ goto FAIL;
+ }
+
+ if (strncmp (s, "P6", 2))
+ goto FAIL;
+
+ if (! (s = fgets (buf, bufsiz, in))) /* line 2 */
+ goto FAIL;
+ if (2 != sscanf (s, " %d %d %c", &w, &h, &dummy))
+ {
+ fprintf (stderr, "%s: %s: invalid PPM (line 2)\n", progname, filename);
+ goto FAIL;
+ }
+
+ if (! (s = fgets (buf, bufsiz, in))) /* line 3 */
+ goto FAIL;
+ if (1 != sscanf (s, " %d %c", &maxval, &dummy))
+ {
+ fprintf (stderr, "%s: %s: invalid PPM (line 3)\n", progname, filename);
+ goto FAIL;
+ }
+ if (maxval != 255)
+ {
+ fprintf (stderr, "%s: %s: unparsable PPM: maxval is %d\n",
+ progname, filename, maxval);
+ goto FAIL;
+ }
+
+ ximage = XCreateImage (dpy, visual, depth, ZPixmap, 0, 0,
+ w, h, 8, 0);
+ if (ximage)
+ ximage->data = (char *) calloc (ximage->height, ximage->bytes_per_line);
+ if (!ximage || !ximage->data)
+ {
+ fprintf (stderr, "%s: out of memory loading %dx%d PPM file %s\n",
+ progname, ximage->width, ximage->height, filename);
+ goto FAIL;
+ }
+
+ s = buf;
+ j = bufsiz;
+ while ((i = fread (s, 1, j, in)) > 0)
+ s += i, j -= i;
+
+ i = 0;
+ for (y = 0; y < ximage->height; y++)
+ for (x = 0; x < ximage->width; x++)
+ {
+ unsigned char r = buf[i++];
+ unsigned char g = buf[i++];
+ unsigned char b = buf[i++];
+ unsigned long pixel;
+
+ if (depth > 16)
+ pixel = (r << 16) | (g << 8) | b;
+ else if (depth == 8)
+ pixel = ((r >> 5) | ((g >> 5) << 3) | ((b >> 6) << 6));
+ else if (depth == 12)
+ pixel = ((r >> 4) | ((g >> 4) << 4) | ((b >> 4) << 8));
+ else if (depth == 16 || depth == 15)
+ pixel = (((r >> 3) << 10) | ((g >> 3) << 5) | ((b >> 3)));
+ else
+ abort();
+
+ XPutPixel (ximage, x, y, pixel);
+ }
+
+ free (buf);
+ return ximage;
+
+ FAIL:
+ if (buf) free (buf);
+ if (ximage && ximage->data)
+ {
+ free (ximage->data);
+ ximage->data = 0;
+ }
+ if (ximage) XDestroyImage (ximage);
+ fseek (in, 0, SEEK_SET);
+ return 0;
+}
+
+
+typedef struct {
+ struct jpeg_error_mgr pub; /* this is what passes for subclassing in C */
+ const char *filename;
+ Screen *screen;
+ Visual *visual;
+ Drawable drawable;
+ Colormap cmap;
+} getimg_jpg_error_mgr;
+
+
+static void
+jpg_output_message (j_common_ptr cinfo)
+{
+ getimg_jpg_error_mgr *err = (getimg_jpg_error_mgr *) cinfo->err;
+ char buf[JMSG_LENGTH_MAX];
+ cinfo->err->format_message (cinfo, buf);
+ fprintf (stderr, "%s: %s: %s\n", progname, err->filename, buf);
+}
+
+
+static void
+jpg_error_exit (j_common_ptr cinfo)
+{
+ getimg_jpg_error_mgr *err = (getimg_jpg_error_mgr *) cinfo->err;
+ cinfo->err->output_message (cinfo);
+ colorbars (err->screen, err->visual, err->drawable, err->cmap);
+ XSync (DisplayOfScreen (err->screen), False);
+ exit (1);
+}
+
+
+/* Reads a JPEG file, returns an RGB XImage of it.
+ */
+static XImage *
+read_jpeg_ximage (Screen *screen, Visual *visual, Drawable drawable,
+ Colormap cmap, const char *filename, Bool verbose_p)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ int depth = visual_depth (screen, visual);
+
+ FILE *in = 0;
+ XImage *ximage = 0;
+ struct jpeg_decompress_struct cinfo;
+ getimg_jpg_error_mgr jerr;
+ JSAMPARRAY scanbuf = 0;
+ int y;
+
+ jerr.filename = filename;
+ jerr.screen = screen;
+ jerr.visual = visual;
+ jerr.drawable = drawable;
+ jerr.cmap = cmap;
+
+ if (! (depth >= 15 || depth == 12 || depth == 8))
+ {
+ fprintf (stderr, "%s: unsupported depth: %d\n", progname, depth);
+ goto FAIL;
+ }
+
+ in = fopen (filename, "rb");
+ if (!in)
+ {
+ fprintf (stderr, "%s: %s: unreadable\n", progname, filename);
+ goto FAIL;
+ }
+
+ /* Check to see if it's a PPM, and if so, read that instead of using
+ the JPEG library. Yeah, this is all modular and stuff.
+ */
+ if ((ximage = maybe_read_ppm (screen, visual, filename, in, verbose_p)))
+ {
+ fclose (in);
+ return ximage;
+ }
+
+ cinfo.err = jpeg_std_error (&jerr.pub);
+ jerr.pub.output_message = jpg_output_message;
+ jerr.pub.error_exit = jpg_error_exit;
+
+ jpeg_create_decompress (&cinfo);
+ jpeg_stdio_src (&cinfo, in);
+ jpeg_read_header (&cinfo, TRUE);
+
+ /* set some decode parameters */
+ cinfo.out_color_space = JCS_RGB;
+ cinfo.quantize_colors = FALSE;
+
+ jpeg_start_decompress (&cinfo);
+
+ ximage = XCreateImage (dpy, visual, depth, ZPixmap, 0, 0,
+ cinfo.output_width, cinfo.output_height,
+ 8, 0);
+ if (ximage)
+ ximage->data = (char *) calloc (ximage->height, ximage->bytes_per_line);
+
+ if (ximage && ximage->data)
+ scanbuf = (*cinfo.mem->alloc_sarray) ((j_common_ptr) &cinfo, JPOOL_IMAGE,
+ cinfo.rec_outbuf_height *
+ cinfo.output_width *
+ cinfo.output_components,
+ 1);
+ if (!ximage || !ximage->data || !scanbuf)
+ {
+ fprintf (stderr, "%s: out of memory loading %dx%d file %s\n",
+ progname, ximage->width, ximage->height, filename);
+ goto FAIL;
+ }
+
+ y = 0;
+ while (cinfo.output_scanline < cinfo.output_height)
+ {
+ int n = jpeg_read_scanlines (&cinfo, scanbuf, 1);
+ int i;
+ for (i = 0; i < n; i++)
+ {
+ int x;
+ for (x = 0; x < ximage->width; x++)
+ {
+ int j = x * cinfo.output_components;
+ unsigned char r = scanbuf[i][j];
+ unsigned char g = scanbuf[i][j+1];
+ unsigned char b = scanbuf[i][j+2];
+ unsigned long pixel;
+
+ if (depth > 16)
+ pixel = (r << 16) | (g << 8) | b;
+ else if (depth == 8)
+ pixel = ((r >> 5) | ((g >> 5) << 3) | ((b >> 6) << 6));
+ else if (depth == 12)
+ pixel = ((r >> 4) | ((g >> 4) << 4) | ((b >> 4) << 8));
+ else if (depth == 15)
+ /* Gah! I don't understand why these are in the other
+ order. */
+ pixel = (((r >> 3) << 10) | ((g >> 3) << 5) | ((b >> 3)));
+ else if (depth == 16)
+ pixel = (((r >> 3) << 11) | ((g >> 2) << 5) | ((b >> 3)));
+ else
+ abort();
+
+ XPutPixel (ximage, x, y, pixel);
+ }
+ y++;
+ }
+ }
+
+ if (cinfo.output_scanline < cinfo.output_height)
+ /* don't goto FAIL -- we might have viewable partial data. */
+ jpeg_abort_decompress (&cinfo);
+ else
+ jpeg_finish_decompress (&cinfo);
+
+ jpeg_destroy_decompress (&cinfo);
+ fclose (in);
+ in = 0;
+
+ return ximage;
+
+ FAIL:
+ if (in) fclose (in);
+ if (ximage && ximage->data)
+ {
+ free (ximage->data);
+ ximage->data = 0;
+ }
+ if (ximage) XDestroyImage (ximage);
+ if (scanbuf) free (scanbuf);
+ return 0;
+}
+
+
+/* Reads the given image file and renders it on the Drawable, using JPEG lib.
+ Returns False if it fails.
+ */
+static Bool
+read_file_jpeglib (Screen *screen, Window window, Drawable drawable,
+ const char *filename, Bool verbose_p,
+ XRectangle *geom_ret)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ XImage *ximage;
+ Visual *visual;
+ int class, depth;
+ Colormap cmap;
+ unsigned int win_width, win_height, win_depth;
+ int srcx, srcy, destx, desty, w2, h2;
+
+ /* Find the size of the Drawable, and the Visual/Colormap of the Window. */
+ {
+ Window root;
+ int x, y;
+ unsigned int bw;
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (dpy, window, &xgwa);
+ visual = xgwa.visual;
+ cmap = xgwa.colormap;
+ XGetGeometry (dpy, drawable,
+ &root, &x, &y, &win_width, &win_height, &bw, &win_depth);
+ }
+
+ /* Make sure we're not on some weirdo visual...
+ */
+ class = visual_class (screen, visual);
+ depth = visual_depth (screen, visual);
+ if ((class == PseudoColor || class == DirectColor) &&
+ (depth != 8 && depth != 12))
+ {
+ fprintf (stderr, "%s: Pseudo/DirectColor depth %d unsupported\n",
+ progname, depth);
+ return False;
+ }
+
+ /* Read the file...
+ */
+ ximage = read_jpeg_ximage (screen, visual, drawable, cmap,
+ filename, verbose_p);
+ if (!ximage) return False;
+
+ /* Scale it, if necessary...
+ */
+ compute_image_scaling (ximage->width, ximage->height,
+ win_width, win_height, verbose_p,
+ &srcx, &srcy, &destx, &desty, &w2, &h2);
+ if (ximage->width != w2 || ximage->height != h2)
+ if (! scale_ximage (screen, visual, ximage, w2, h2))
+ return False;
+
+ /* Allocate a colormap, if we need to...
+ */
+ if (class == PseudoColor || class == DirectColor)
+ {
+ allocate_cubic_colormap (screen, visual, cmap, verbose_p);
+ remap_image (screen, cmap, ximage, verbose_p);
+ }
+
+ /* Finally, put the resized image on the window.
+ */
+ {
+ GC gc;
+ XGCValues gcv;
+
+ /* If we're rendering onto the root window (and it's not the xscreensaver
+ pseudo-root) then put the image in the window's background. Otherwise,
+ just paint the image onto the window.
+ */
+ if (window == drawable && root_window_p (screen, window))
+ {
+ Pixmap bg = XCreatePixmap (dpy, window,
+ win_width, win_height, win_depth);
+ gcv.foreground = BlackPixelOfScreen (screen);
+ gc = XCreateGC (dpy, drawable, GCForeground, &gcv);
+ XFillRectangle (dpy, bg, gc, 0, 0, win_width, win_height);
+ XPutImage (dpy, bg, gc, ximage,
+ srcx, srcy, destx, desty, ximage->width, ximage->height);
+ XSetWindowBackgroundPixmap (dpy, window, bg);
+ XClearWindow (dpy, window);
+ }
+ else
+ {
+ gc = XCreateGC (dpy, drawable, 0, &gcv);
+ clear_drawable (screen, drawable);
+ XPutImage (dpy, drawable, gc, ximage,
+ srcx, srcy, destx, desty, ximage->width, ximage->height);
+ }
+
+ XFreeGC (dpy, gc);
+ }
+
+ if (geom_ret)
+ {
+ geom_ret->x = destx;
+ geom_ret->y = desty;
+ geom_ret->width = ximage->width;
+ geom_ret->height = ximage->height;
+ }
+
+ free (ximage->data);
+ ximage->data = 0;
+ XDestroyImage (ximage);
+ XSync (dpy, False);
+ return True;
+}
+
+#endif /* HAVE_JPEGLIB */
+
+
+/* Reads the given image file and renders it on the Drawable.
+ Returns False if it fails.
+ */
+static Bool
+display_file (Screen *screen, Window window, Drawable drawable,
+ const char *filename, Bool verbose_p,
+ XRectangle *geom_ret)
+{
+ if (verbose_p)
+ fprintf (stderr, "%s: loading \"%s\"\n", progname, filename);
+
+# if defined(HAVE_GDK_PIXBUF)
+ if (read_file_gdk (screen, window, drawable, filename, verbose_p, geom_ret))
+ return True;
+# elif defined(HAVE_JPEGLIB)
+ if (read_file_jpeglib (screen, window, drawable, filename, verbose_p,
+ geom_ret))
+ return True;
+# else /* !(HAVE_GDK_PIXBUF || HAVE_JPEGLIB) */
+ /* shouldn't get here if we have no image-loading methods available. */
+ abort();
+# endif /* !(HAVE_GDK_PIXBUF || HAVE_JPEGLIB) */
+
+ return False;
+}
+
+
+/* Invokes a sub-process and returns its output (presumably, a file to
+ load.) Free the string when done. 'grab_type' controls which program
+ to run. Returned pathname may be relative to 'directory', or absolute.
+ */
+static char *
+get_filename_1 (Screen *screen, const char *directory, grab_type type,
+ Bool verbose_p)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ pid_t forked;
+ int fds [2];
+ int in, out;
+ char buf[10240];
+ char *av[20];
+ int ac = 0;
+
+ switch (type)
+ {
+ case GRAB_FILE:
+ av[ac++] = GETIMAGE_FILE_PROGRAM;
+ if (verbose_p)
+ av[ac++] = "--verbose";
+ av[ac++] = "--name";
+ av[ac++] = (char *) directory;
+ break;
+
+ case GRAB_VIDEO:
+ av[ac++] = GETIMAGE_VIDEO_PROGRAM;
+ if (verbose_p)
+ av[ac++] = "--verbose";
+ av[ac++] = "--name";
+ break;
+
+# ifdef USE_EXTERNAL_SCREEN_GRABBER
+ case GRAB_DESK:
+ av[ac++] = GETIMAGE_SCREEN_PROGRAM;
+ if (verbose_p)
+ av[ac++] = "--verbose";
+ av[ac++] = "--name";
+ break;
+# endif
+
+ default:
+ abort();
+ }
+ av[ac] = 0;
+
+ if (verbose_p)
+ {
+ int i;
+ fprintf (stderr, "%s: executing:", progname);
+ for (i = 0; i < ac; i++)
+ fprintf (stderr, " %s", av[i]);
+ fprintf (stderr, "\n");
+ }
+
+ if (pipe (fds))
+ {
+ sprintf (buf, "%s: error creating pipe", progname);
+ perror (buf);
+ return 0;
+ }
+
+ in = fds [0];
+ out = fds [1];
+
+ switch ((int) (forked = fork ()))
+ {
+ case -1:
+ {
+ sprintf (buf, "%s: couldn't fork", progname);
+ perror (buf);
+ return 0;
+ }
+ case 0:
+ {
+ int stdout_fd = 1;
+
+ close (in); /* don't need this one */
+ close (ConnectionNumber (dpy)); /* close display fd */
+
+ if (dup2 (out, stdout_fd) < 0) /* pipe stdout */
+ {
+ sprintf (buf, "%s: could not dup() a new stdout", progname);
+ exit (-1); /* exits fork */
+ }
+
+ execvp (av[0], av); /* shouldn't return. */
+ exit (-1); /* exits fork */
+ break;
+ }
+ default:
+ {
+ struct stat st;
+ int wait_status = 0;
+ FILE *f = fdopen (in, "r");
+ int L;
+ char *ret = 0;
+
+ close (out); /* don't need this one */
+ *buf = 0;
+ if (! fgets (buf, sizeof(buf)-1, f))
+ *buf = 0;
+ fclose (f);
+
+ /* Wait for the child to die. */
+ waitpid (-1, &wait_status, 0);
+
+ L = strlen (buf);
+ while (L && buf[L-1] == '\n')
+ buf[--L] = 0;
+
+ if (!*buf)
+ return 0;
+
+ ret = strdup (buf);
+
+ if (*ret != '/')
+ {
+ /* Program returned path relative to directory. Prepend dir
+ to buf so that we can properly stat it. */
+ strcpy (buf, directory);
+ if (directory[strlen(directory)-1] != '/')
+ strcat (buf, "/");
+ strcat (buf, ret);
+ }
+
+ if (stat(buf, &st))
+ {
+ fprintf (stderr, "%s: file does not exist: \"%s\"\n",
+ progname, buf);
+ free (ret);
+ return 0;
+ }
+ else
+ return ret;
+ }
+ }
+
+ abort();
+}
+
+
+/* Returns a pathname to an image file. Free the string when you're done.
+ */
+static char *
+get_filename (Screen *screen, const char *directory, Bool verbose_p)
+{
+ return get_filename_1 (screen, directory, GRAB_FILE, verbose_p);
+}
+
+
+/* Grabs a video frame to a file, and returns a pathname to that file.
+ Delete that file when you are done with it (and free the string.)
+ */
+static char *
+get_video_filename (Screen *screen, Bool verbose_p)
+{
+ return get_filename_1 (screen, 0, GRAB_VIDEO, verbose_p);
+}
+
+/* Grabs a desktop image to a file, and returns a pathname to that file.
+ Delete that file when you are done with it (and free the string.)
+ */
+# ifdef USE_EXTERNAL_SCREEN_GRABBER
+static char *
+get_desktop_filename (Screen *screen, Bool verbose_p)
+{
+ return get_filename_1 (screen, 0, GRAB_DESK, verbose_p);
+}
+#endif /* USE_EXTERNAL_SCREEN_GRABBER */
+
+
+/* Grabs a video frame, and renders it on the Drawable.
+ Returns False if it fails;
+ */
+static Bool
+display_video (Screen *screen, Window window, Drawable drawable,
+ Bool verbose_p, XRectangle *geom_ret)
+{
+ char *filename = get_video_filename (screen, verbose_p);
+ Bool status;
+
+ if (!filename)
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: video grab failed.\n", progname);
+ return False;
+ }
+
+ status = display_file (screen, window, drawable, filename, verbose_p,
+ geom_ret);
+
+ if (unlink (filename))
+ {
+ char buf[512];
+ sprintf (buf, "%s: rm %.100s", progname, filename);
+ perror (buf);
+ }
+ else if (verbose_p)
+ fprintf (stderr, "%s: rm %s\n", progname, filename);
+
+ if (filename) free (filename);
+ return status;
+}
+
+
+/* Grabs a desktop screen shot onto the window and the drawable.
+ If the window and drawable are not the same size, the image in
+ the drawable is scaled to fit.
+ Returns False if it fails.
+ */
+static Bool
+display_desktop (Screen *screen, Window window, Drawable drawable,
+ Bool verbose_p, XRectangle *geom_ret)
+{
+# ifdef USE_EXTERNAL_SCREEN_GRABBER
+
+ Display *dpy = DisplayOfScreen (screen);
+ Bool top_p = top_level_window_p (screen, window);
+ char *filename;
+ Bool status;
+
+ if (top_p)
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: unmapping 0x%lx.\n", progname,
+ (unsigned long) window);
+ XUnmapWindow (dpy, window);
+ XSync (dpy, False);
+ }
+
+ filename = get_desktop_filename (screen, verbose_p);
+
+ if (top_p)
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: mapping 0x%lx.\n", progname,
+ (unsigned long) window);
+ XMapRaised (dpy, window);
+ XSync (dpy, False);
+ }
+
+ if (!filename)
+ {
+ if (verbose_p)
+ fprintf (stderr, "%s: desktop grab failed.\n", progname);
+ return False;
+ }
+
+ status = display_file (screen, window, drawable, filename, verbose_p,
+ geom_ret);
+
+ if (unlink (filename))
+ {
+ char buf[512];
+ sprintf (buf, "%s: rm %.100s", progname, filename);
+ perror (buf);
+ }
+ else if (verbose_p)
+ fprintf (stderr, "%s: rm %s\n", progname, filename);
+
+ if (filename) free (filename);
+ return status;
+
+# else /* !USE_EXTERNAL_SCREEN_GRABBER */
+
+ Display *dpy = DisplayOfScreen (screen);
+ XGCValues gcv;
+ XWindowAttributes xgwa;
+ Window root;
+ int px, py;
+ unsigned int pw, ph, pbw, pd;
+ int srcx, srcy, destx, desty, w2, h2;
+
+ if (verbose_p)
+ {
+ fprintf (stderr, "%s: grabbing desktop image\n", progname);
+ grabscreen_verbose();
+ }
+
+ XGetWindowAttributes (dpy, window, &xgwa);
+ XGetGeometry (dpy, drawable, &root, &px, &py, &pw, &ph, &pbw, &pd);
+
+ grab_screen_image_internal (screen, window);
+
+ compute_image_scaling (xgwa.width, xgwa.height,
+ pw, ph, verbose_p,
+ &srcx, &srcy, &destx, &desty, &w2, &h2);
+
+ if (pw == w2 && ph == h2) /* it fits -- just copy server-side pixmaps */
+ {
+ GC gc = XCreateGC (dpy, drawable, 0, &gcv);
+ XCopyArea (dpy, window, drawable, gc,
+ 0, 0, xgwa.width, xgwa.height, 0, 0);
+ XFreeGC (dpy, gc);
+ }
+ else /* size mismatch -- must scale client-side images to fit drawable */
+ {
+ GC gc;
+ XImage *ximage = 0;
+ XErrorHandler old_handler;
+
+ XSync (dpy, False);
+ old_handler = XSetErrorHandler (ignore_badmatch_ehandler);
+ error_handler_hit_p = False;
+
+ /* This can return BadMatch if the window is not fully on screen.
+ Trap that error and return color bars in that case.
+ (Note that this only happens with XGetImage, not with XCopyArea:
+ yet another totally gratuitous inconsistency in X, thanks.)
+ */
+ ximage = XGetImage (dpy, window, 0, 0, xgwa.width, xgwa.height,
+ ~0L, ZPixmap);
+
+ XSync (dpy, False);
+ XSetErrorHandler (old_handler);
+ XSync (dpy, False);
+
+ if (error_handler_hit_p)
+ {
+ ximage = 0;
+ if (verbose_p)
+ fprintf (stderr, "%s: BadMatch reading window 0x%x contents!\n",
+ progname, (unsigned int) window);
+ }
+
+ if (!ximage ||
+ !scale_ximage (xgwa.screen, xgwa.visual, ximage, w2, h2))
+ return False;
+
+ gc = XCreateGC (dpy, drawable, 0, &gcv);
+ clear_drawable (screen, drawable);
+ XPutImage (dpy, drawable, gc, ximage,
+ srcx, srcy, destx, desty, ximage->width, ximage->height);
+ XDestroyImage (ximage);
+ XFreeGC (dpy, gc);
+ }
+
+ if (geom_ret)
+ {
+ geom_ret->x = destx;
+ geom_ret->y = desty;
+ geom_ret->width = w2;
+ geom_ret->height = h2;
+ }
+
+ XSync (dpy, False);
+ return True;
+
+# endif /* !USE_EXTERNAL_SCREEN_GRABBER */
+}
+
+
+/* Whether the given Drawable is unreasonably small.
+ */
+static Bool
+drawable_miniscule_p (Display *dpy, Drawable drawable)
+{
+ Window root;
+ int xx, yy;
+ unsigned int bw, d, w = 0, h = 0;
+ XGetGeometry (dpy, drawable, &root, &xx, &yy, &w, &h, &bw, &d);
+ return (w < 32 || h < 30);
+}
+
+
+/* Grabs an image (from a file, video, or the desktop) and renders it on
+ the Drawable. If `file' is specified, always use that file. Otherwise,
+ select randomly, based on the other arguments.
+ */
+static void
+get_image (Screen *screen,
+ Window window, Drawable drawable,
+ Bool verbose_p,
+ Bool desk_p,
+ Bool video_p,
+ Bool image_p,
+ const char *dir,
+ const char *file)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ grab_type which = GRAB_BARS;
+ struct stat st;
+ const char *file_prop = 0;
+ char *absfile = 0;
+ XRectangle geom = { 0, 0, 0, 0 };
+
+ if (! drawable_window_p (dpy, window))
+ {
+ fprintf (stderr, "%s: 0x%lx is a pixmap, not a window!\n",
+ progname, (unsigned long) window);
+ exit (1);
+ }
+
+ /* Make sure the Screen and the Window correspond. */
+ {
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (dpy, window, &xgwa);
+ screen = xgwa.screen;
+ }
+
+ if (file && stat (file, &st))
+ {
+ fprintf (stderr, "%s: file \"%s\" does not exist\n", progname, file);
+ file = 0;
+ }
+
+ if (verbose_p)
+ {
+ fprintf (stderr, "%s: grabDesktopImages: %s\n",
+ progname, desk_p ? "True" : "False");
+ fprintf (stderr, "%s: grabVideoFrames: %s\n",
+ progname, video_p ? "True" : "False");
+ fprintf (stderr, "%s: chooseRandomImages: %s\n",
+ progname, image_p ? "True" : "False");
+ fprintf (stderr, "%s: imageDirectory: %s\n",
+ progname, (file ? file : dir ? dir : ""));
+ }
+
+# if !(defined(HAVE_GDK_PIXBUF) || defined(HAVE_JPEGLIB))
+ image_p = False; /* can't load images from files... */
+# ifdef USE_EXTERNAL_SCREEN_GRABBER
+ desk_p = False; /* ...or from desktops grabbed to files. */
+# endif
+
+ if (file)
+ {
+ fprintf (stderr,
+ "%s: image file loading not available at compile-time\n",
+ progname);
+ fprintf (stderr, "%s: can't load \"%s\"\n", progname, file);
+ file = 0;
+ }
+# endif /* !(HAVE_GDK_PIXBUF || HAVE_JPEGLIB) */
+
+ if (file)
+ {
+ desk_p = False;
+ video_p = False;
+ image_p = True;
+ }
+ else if (!dir || !*dir)
+ {
+ if (verbose_p && image_p)
+ fprintf (stderr,
+ "%s: no imageDirectory: turning off chooseRandomImages.\n",
+ progname);
+ image_p = False;
+ }
+
+ /* If the target drawable is really small, no good can come of that.
+ Always do colorbars in that case.
+ */
+ if (drawable_miniscule_p (dpy, drawable))
+ {
+ desk_p = False;
+ video_p = False;
+ image_p = False;
+ }
+
+# ifndef _VROOT_H_
+# error Error! This file definitely needs vroot.h!
+# endif
+
+ /* We can grab desktop images (using the normal X11 method) if:
+ - the window is the real root window;
+ - the window is a toplevel window.
+ We cannot grab desktop images that way if:
+ - the window is a non-top-level window.
+
+ Under X11 on MacOS, desktops are just like loaded image files.
+ Under Cocoa on MacOS, this code is not used at all.
+ */
+# ifndef USE_EXTERNAL_SCREEN_GRABBER
+ if (desk_p)
+ {
+ if (!top_level_window_p (screen, window))
+ {
+ desk_p = False;
+ if (verbose_p)
+ fprintf (stderr,
+ "%s: 0x%x not top-level: turning off grabDesktopImages.\n",
+ progname, (unsigned int) window);
+ }
+ }
+# endif /* !USE_EXTERNAL_SCREEN_GRABBER */
+
+ if (! (desk_p || video_p || image_p))
+ which = GRAB_BARS;
+ else
+ {
+ int i = 0;
+ int n;
+ /* Loop until we get one that's permitted.
+ If files or video are permitted, do them more often
+ than desktop.
+
+ D+V+I: 10% + 45% + 45%.
+ V+I: 50% + 50%
+ D+V: 18% + 82%
+ D+I: 18% + 82%
+ */
+ AGAIN:
+ n = (random() % 100);
+ if (++i > 300) abort();
+ else if (desk_p && n < 10) which = GRAB_DESK; /* 10% */
+ else if (video_p && n < 55) which = GRAB_VIDEO; /* 45% */
+ else if (image_p) which = GRAB_FILE; /* 45% */
+ else goto AGAIN;
+ }
+
+
+ /* If we're to search a directory to find an image file, do so now.
+ */
+ if (which == GRAB_FILE && !file)
+ {
+ file = get_filename (screen, dir, verbose_p);
+ if (!file)
+ {
+ which = GRAB_BARS;
+ if (verbose_p)
+ fprintf (stderr, "%s: no image files found.\n", progname);
+ }
+ }
+
+ /* Now actually render something.
+ */
+ switch (which)
+ {
+ case GRAB_BARS:
+ {
+ XWindowAttributes xgwa;
+ COLORBARS:
+ if (verbose_p)
+ fprintf (stderr, "%s: drawing colorbars.\n", progname);
+ XGetWindowAttributes (dpy, window, &xgwa);
+ colorbars (screen, xgwa.visual, drawable, xgwa.colormap);
+ XSync (dpy, False);
+ if (! file_prop) file_prop = "";
+
+ }
+ break;
+
+ case GRAB_DESK:
+ if (! display_desktop (screen, window, drawable, verbose_p, &geom))
+ goto COLORBARS;
+ file_prop = "desktop";
+ break;
+
+ case GRAB_FILE:
+ if (*file && *file != '/') /* pathname is relative to dir. */
+ {
+ if (absfile) free (absfile);
+ absfile = malloc (strlen(dir) + strlen(file) + 10);
+ strcpy (absfile, dir);
+ if (dir[strlen(dir)-1] != '/')
+ strcat (absfile, "/");
+ strcat (absfile, file);
+ }
+ if (! display_file (screen, window, drawable,
+ (absfile ? absfile : file),
+ verbose_p, &geom))
+ goto COLORBARS;
+ file_prop = file;
+ break;
+
+ case GRAB_VIDEO:
+ if (! display_video (screen, window, drawable, verbose_p, &geom))
+ goto COLORBARS;
+ file_prop = "video";
+ break;
+
+ default:
+ abort();
+ break;
+ }
+
+ {
+ Atom a = XInternAtom (dpy, XA_XSCREENSAVER_IMAGE_FILENAME, False);
+ if (file_prop && *file_prop)
+ {
+ char *f2 = strdup (file_prop);
+
+ /* Take the extension off of the file name. */
+ /* Duplicated in utils/grabclient.c. */
+ char *slash = strrchr (f2, '/');
+ char *dot = strrchr ((slash ? slash : f2), '.');
+ if (dot) *dot = 0;
+ /* Replace slashes with newlines */
+ /* while ((dot = strchr(f2, '/'))) *dot = '\n'; */
+ /* Replace slashes with spaces */
+ /* while ((dot = strchr(f2, '/'))) *dot = ' '; */
+
+ XChangeProperty (dpy, window, a, XA_STRING, 8, PropModeReplace,
+ (unsigned char *) f2, strlen(f2));
+ free (f2);
+ }
+ else
+ XDeleteProperty (dpy, window, a);
+
+ a = XInternAtom (dpy, XA_XSCREENSAVER_IMAGE_GEOMETRY, False);
+ if (geom.width > 0)
+ {
+ char gstr[30];
+ sprintf (gstr, "%dx%d+%d+%d", geom.width, geom.height, geom.x, geom.y);
+ XChangeProperty (dpy, window, a, XA_STRING, 8, PropModeReplace,
+ (unsigned char *) gstr, strlen (gstr));
+ }
+ else
+ XDeleteProperty (dpy, window, a);
+ }
+
+ if (absfile) free (absfile);
+ XSync (dpy, False);
+}
+
+
+#ifdef DEBUG
+static Bool
+mapper (XrmDatabase *db, XrmBindingList bindings, XrmQuarkList quarks,
+ XrmRepresentation *type, XrmValue *value, XPointer closure)
+{
+ int i;
+ for (i = 0; quarks[i]; i++)
+ {
+ if (bindings[i] == XrmBindTightly)
+ fprintf (stderr, (i == 0 ? "" : "."));
+ else if (bindings[i] == XrmBindLoosely)
+ fprintf (stderr, "*");
+ else
+ fprintf (stderr, " ??? ");
+ fprintf(stderr, "%s", XrmQuarkToString (quarks[i]));
+ }
+
+ fprintf (stderr, ": %s\n", (char *) value->addr);
+
+ return False;
+}
+#endif /* DEBUG */
+
+
+#define USAGE "usage: %s [ -options... ] window-id [pixmap-id]\n" \
+ "\n" \
+ " %s\n" \
+ "\n" \
+ " %s puts an image on the given window or pixmap.\n" \
+ "\n" \
+ " It is used by those xscreensaver demos that operate on images.\n" \
+ " The image may be a file loaded from disk, a frame grabbed from\n" \
+ " the system's video camera, or a screenshot of the desktop,\n" \
+ " depending on command-line options or the ~/.xscreensaver file.\n" \
+ "\n" \
+ " Options include:\n" \
+ "\n" \
+ " -display host:dpy.screen which display to use\n" \
+ " -root draw to the root window\n" \
+ " -verbose print diagnostics\n" \
+ " -images / -no-images whether to allow image file loading\n" \
+ " -video / -no-video whether to allow video grabs\n" \
+ " -desktop / -no-desktop whether to allow desktop screen grabs\n"\
+ " -directory <path> where to find image files to load\n" \
+ " -file <filename> load this image file\n" \
+ "\n" \
+ " The XScreenSaver Control Panel (xscreensaver-demo) lets you set the\n"\
+ " defaults for these options in your ~/.xscreensaver file.\n" \
+ "\n"
+
+int
+main (int argc, char **argv)
+{
+ saver_preferences P;
+ Widget toplevel;
+ Display *dpy;
+ Screen *screen;
+ char *oprogname = progname;
+ char *file = 0;
+ char version[255];
+
+ Window window = (Window) 0;
+ Drawable drawable = (Drawable) 0;
+ const char *window_str = 0;
+ const char *drawable_str = 0;
+ char *s;
+ int i;
+
+ progname = argv[0];
+ s = strrchr (progname, '/');
+ if (s) progname = s+1;
+ oprogname = progname;
+
+ /* half-assed way of avoiding buffer-overrun attacks. */
+ if (strlen (progname) >= 100) progname[100] = 0;
+
+# ifndef _VROOT_H_
+# error Error! This file definitely needs vroot.h!
+# endif
+
+ /* Get the version number, for error messages. */
+ {
+ char *v = (char *) strdup(strchr(screensaver_id, ' '));
+ char *s1, *s2, *s3, *s4;
+ s1 = (char *) strchr(v, ' '); s1++;
+ s2 = (char *) strchr(s1, ' ');
+ s3 = (char *) strchr(v, '('); s3++;
+ s4 = (char *) strchr(s3, ')');
+ *s2 = 0;
+ *s4 = 0;
+ sprintf (version, "Part of XScreenSaver %s -- %s.", s1, s3);
+ free(v);
+ }
+
+ /* We must read exactly the same resources as xscreensaver.
+ That means we must have both the same progclass *and* progname,
+ at least as far as the resource database is concerned. So,
+ put "xscreensaver" in argv[0] while initializing Xt.
+ */
+ progname = argv[0] = "xscreensaver";
+
+ /* allow one dash or two. */
+ for (i = 1; i < argc; i++)
+ if (argv[i][0] == '-' && argv[i][1] == '-') argv[i]++;
+
+ toplevel = XtAppInitialize (&app, progclass, 0, 0, &argc, argv,
+ defaults, 0, 0);
+ dpy = XtDisplay (toplevel);
+ screen = XtScreen (toplevel);
+ db = XtDatabase (dpy);
+ XtGetApplicationNameAndClass (dpy, &s, &progclass);
+ XSetErrorHandler (x_ehandler);
+ XSync (dpy, False);
+
+ /* Randomize -- only need to do this here because this program
+ doesn't use the `screenhack.h' or `lockmore.h' APIs. */
+# undef ya_rand_init
+ ya_rand_init (0);
+
+ memset (&P, 0, sizeof(P));
+ P.db = db;
+ load_init_file (dpy, &P);
+
+ progname = argv[0] = oprogname;
+
+ for (i = 1; i < argc; i++)
+ {
+ unsigned long w;
+ char dummy;
+
+ /* Have to re-process these, or else the .xscreensaver file
+ has priority over the command line...
+ */
+ if (!strcmp (argv[i], "-v") || !strcmp (argv[i], "-verbose"))
+ P.verbose_p = True;
+ else if (!strcmp (argv[i], "-desktop")) P.grab_desktop_p = True;
+ else if (!strcmp (argv[i], "-no-desktop")) P.grab_desktop_p = False;
+ else if (!strcmp (argv[i], "-video")) P.grab_video_p = True;
+ else if (!strcmp (argv[i], "-no-video")) P.grab_video_p = False;
+ else if (!strcmp (argv[i], "-images")) P.random_image_p = True;
+ else if (!strcmp (argv[i], "-no-images")) P.random_image_p = False;
+ else if (!strcmp (argv[i], "-file")) file = argv[++i];
+ else if (!strcmp (argv[i], "-directory") || !strcmp (argv[i], "-dir"))
+ P.image_directory = argv[++i];
+ else if (!strcmp (argv[i], "-root") || !strcmp (argv[i], "root"))
+ {
+ if (window)
+ {
+ fprintf (stderr, "%s: both %s and %s specified?\n",
+ progname, argv[i], window_str);
+ goto LOSE;
+ }
+ window_str = argv[i];
+ window = VirtualRootWindowOfScreen (screen);
+ }
+ else if ((1 == sscanf (argv[i], " 0x%lx %c", &w, &dummy) ||
+ 1 == sscanf (argv[i], " %lu %c", &w, &dummy)) &&
+ w != 0)
+ {
+ if (drawable)
+ {
+ fprintf (stderr, "%s: both %s and %s specified?\n",
+ progname, drawable_str, argv[i]);
+ goto LOSE;
+ }
+ else if (window)
+ {
+ drawable_str = argv[i];
+ drawable = (Drawable) w;
+ }
+ else
+ {
+ window_str = argv[i];
+ window = (Window) w;
+ }
+ }
+ else
+ {
+ if (argv[i][0] == '-')
+ fprintf (stderr, "\n%s: unknown option \"%s\"\n",
+ progname, argv[i]);
+ else
+ fprintf (stderr, "\n%s: unparsable window/pixmap ID: \"%s\"\n",
+ progname, argv[i]);
+ LOSE:
+# ifdef __GNUC__
+ __extension__ /* don't warn about "string length is greater than
+ the length ISO C89 compilers are required to
+ support" in the usage string... */
+# endif
+ fprintf (stderr, USAGE, progname, version, progname);
+ exit (1);
+ }
+ }
+
+ if (window == 0)
+ {
+ fprintf (stderr, "\n%s: no window ID specified!\n", progname);
+ goto LOSE;
+ }
+
+
+#ifdef DEBUG
+ if (P.verbose_p) /* Print out all the resources we can see. */
+ {
+ XrmName name = { 0 };
+ XrmClass class = { 0 };
+ int count = 0;
+ XrmEnumerateDatabase (db, &name, &class, XrmEnumAllLevels, mapper,
+ (XtPointer) &count);
+ }
+#endif /* DEBUG */
+
+ if (!window) abort();
+ if (!drawable) drawable = window;
+
+ get_image (screen, window, drawable, P.verbose_p,
+ P.grab_desktop_p, P.grab_video_p, P.random_image_p,
+ P.image_directory, file);
+ exit (0);
+}
diff --git a/driver/xscreensaver-getimage.man b/driver/xscreensaver-getimage.man
new file mode 100644
index 0000000..ae68014
--- /dev/null
+++ b/driver/xscreensaver-getimage.man
@@ -0,0 +1,73 @@
+.TH XScreenSaver 1 "20-Mar-2005 (4.21)" "X Version 11"
+.SH NAME
+xscreensaver-getimage - put some randomly-selected image on the root window
+.SH SYNOPSIS
+.B xscreensaver-getimage
+[\-display \fIhost:display.screen\fP] [\--verbose] window-id [pixmap-id]
+.SH DESCRIPTION
+The \fIxscreensaver\-getimage\fP program is a helper program for the
+xscreensaver hacks that manipulate images. This is not a user-level
+command.
+
+This program selects a random image, and puts it on the specified
+window or pixmap. This image might be a snapshot of the desktop; or
+a frame captured from the system's video input; or a randomly-selected
+image from disk.
+
+If only a window ID is specified, the image will be painted there.
+If both a window ID and a pixmap ID are specified, then the image will
+be painted on the pixmap; and the window \fImay\fP be modified as a
+side-effect.
+.SH OPTIONS
+.I xscreensaver-getimage
+reads the \fI~/.xscreensaver\fP file for configuration information.
+It uses these settings:
+.TP 4
+.B grabDesktopImages
+Whether it is acceptable to grab snapshots of the desktop.
+The security paranoid might want to turn this off, to avoid letting
+people see (but not touch!) your desktop while the screen is locked.
+.TP 4
+.B grabVideoFrames
+Whether it is acceptable to grab frames of video from the system's video
+input. Grabbing of video is done by invoking the
+.BR xscreensaver-getimage-video (1)
+program.
+.TP 4
+.B chooseRandomImages
+Whether it is acceptable to display random images found on disk.
+Selection and loading of images is done by invoking the
+.BR xscreensaver-getimage-file (1)
+program.
+.TP 4
+.B imageDirectory
+When loading images from disk, this is the directory to find them in.
+The directory will be searched recursively for images.
+
+It may also be the URL of an RSS or Atom feed, in which case a
+random image from that feed will be selected instead. The contents
+of the feed will be cached locally and refreshed periodically as needed.
+.PP
+If none of the three options are set to True, then video
+colorbars will be displayed instead.
+.SH BUGS
+When grabbing desktop images, the \fIwindow\fP argument will be unmapped
+and have its contents modified, causing flicker. (This does not happen
+when loading image files or video frames.)
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver\-demo (1)
+.BR xscreensaver\-getimage\-file (1)
+.BR xscreensaver\-getimage\-video (1)
+.SH COPYRIGHT
+Copyright \(co 2001-2011 by Jamie Zawinski. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 14-Apr-01
diff --git a/driver/xscreensaver-text b/driver/xscreensaver-text
new file mode 100755
index 0000000..e965bed
--- /dev/null
+++ b/driver/xscreensaver-text
@@ -0,0 +1,884 @@
+#!/usr/bin/perl -w
+# Copyright © 2005-2017 Jamie Zawinski <jwz@jwz.org>
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+#
+# This program writes some text to stdout, based on preferences in the
+# .xscreensaver file. It may load a file, a URL, run a program, or just
+# print the date.
+#
+# In a native MacOS build of xscreensaver, this script is included in
+# the Contents/Resources/ directory of each screen saver .bundle that
+# uses it; and in that case, it looks up its resources using
+# /usr/bin/defaults instead.
+#
+# Created: 19-Mar-2005.
+
+require 5;
+#use diagnostics; # Fails on some MacOS 10.5 systems
+use strict;
+
+# Some Linux systems don't install LWP by default!
+# Only error out if we're actually loading a URL instead of local data.
+BEGIN { eval 'use LWP::UserAgent;' }
+
+# Not sure how prevalent this is. Hope it's part of the default install.
+BEGIN { eval 'use HTML::Entities;' }
+
+use Socket;
+use POSIX qw(strftime);
+use Text::Wrap qw(wrap);
+#use bytes; # This breaks shit.
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my ($version) = ('$Revision: 1.46 $' =~ m/\s(\d[.\d]+)\s/s);
+
+my $verbose = 0;
+my $http_proxy = undef;
+
+my $config_file = $ENV{HOME} . "/.xscreensaver";
+my $text_mode = 'date';
+my $text_literal = '';
+my $text_file = '';
+my $text_program = '';
+my $text_url = 'https://en.wikipedia.org/w/index.php?title=Special:NewPages&feed=rss';
+# Default URL needs to be set and match what's in OSX/XScreenSaverView.m
+
+my $wrap_columns = undef;
+my $truncate_lines = undef;
+my $latin1_p = 0;
+my $nyarlathotep_p = 0;
+
+
+# Convert any HTML entities to Latin1 characters.
+#
+sub de_entify($) {
+ my ($text) = @_;
+
+ return '' unless defined($text);
+ return $text unless ($text =~ m/&/s);
+
+ # Convert any HTML entities to Unicode characters,
+ # if the HTML::Entities module is installed.
+ eval {
+ my $t2 = $text;
+ $text = undef;
+ $text = HTML::Entities::decode_entities ($t2);
+ };
+ return $text if defined($text);
+
+ # If it's not installed, just complain instead of trying to halfass it.
+ print STDOUT ("\n\tPerl is broken. Do this to repair it:\n" .
+ "\n\tsudo cpan HTML::Entities\n\n");
+ exit (1);
+}
+
+
+# Convert any Unicode characters to Latin1 if possible.
+# Unconvertable bytes are left alone.
+#
+sub utf8_to_latin1($) {
+ my ($text) = @_;
+
+ utf8::encode ($text); # Unpack Unicode back to multi-byte UTF-8.
+
+ # Maybe it would be better to handle this in the Unicode domain
+ # by doing things like s/\x{2018}/\"/g, but without decoding the
+ # string back to UTF-8 first, I'm at a loss as to how to have
+ # "&aacute;" print as "\340" instead of as "\303\240".
+
+ $text =~ s/ \xC2 ( [\xA0-\xFF] ) / $1 /gsex;
+ $text =~ s/ \xC3 ( [\x80-\xFF] ) / chr (ord($1) | 0x40) /gsex;
+
+ # Handles a few 3-byte sequences too.
+ $text =~ s/\xE2\x80\x93/--/gs;
+ $text =~ s/\xE2\x80\x94/--/gs;
+ $text =~ s/\xE2\x80\x98/`/gs;
+ $text =~ s/\xE2\x80\x99/'/gs;
+ $text =~ s/\xE2\x80\x9C/``/gs;
+ $text =~ s/\xE2\x80\x9D/'/gs;
+ $text =~ s/\xE2\x80\xA2/&bull;/gs;
+ $text =~ s/\xE2\x80\xA6/.../gs;
+ $text =~ s/\xE2\x80\xB2/'/gs;
+ $text =~ s/\xE2\x84\xA2/&trade;/gs;
+ $text =~ s/\xE2\x86\x90/ &larr; /gs;
+
+ return $text;
+}
+
+
+# Reads the prefs we use from ~/.xscreensaver
+#
+sub get_x11_prefs() {
+ my $got_any_p = 0;
+
+ if (open (my $in, '<', $config_file)) {
+ print STDERR "$progname: reading $config_file\n" if ($verbose > 1);
+ local $/ = undef; # read entire file
+ my $body = <$in>;
+ close $in;
+ $got_any_p = get_x11_prefs_1 ($body);
+
+ } elsif ($verbose > 1) {
+ print STDERR "$progname: $config_file: $!\n";
+ }
+
+ if (! $got_any_p && defined ($ENV{DISPLAY})) {
+ # We weren't able to read settings from the .xscreensaver file.
+ # Fall back to any settings in the X resource database
+ # (/usr/X11R6/lib/X11/app-defaults/XScreenSaver)
+ #
+ print STDERR "$progname: reading X resources\n" if ($verbose > 1);
+ my $body = `appres XScreenSaver xscreensaver -1`;
+ $got_any_p = get_x11_prefs_1 ($body);
+ }
+
+ if ($verbose > 1) {
+ print STDERR "$progname: mode: $text_mode\n";
+ print STDERR "$progname: literal: $text_literal\n";
+ print STDERR "$progname: file: $text_file\n";
+ print STDERR "$progname: program: $text_program\n";
+ print STDERR "$progname: url: $text_url\n";
+ }
+
+ $text_mode =~ tr/A-Z/a-z/;
+ $text_literal =~ s@\\n@\n@gs;
+ $text_literal =~ s@\\\n@\n@gs;
+}
+
+
+sub get_x11_prefs_1($) {
+ my ($body) = @_;
+
+ my $got_any_p = 0;
+ $body =~ s@\\\n@@gs;
+ $body =~ s@^[ \t]*#[^\n]*$@@gm;
+
+ if ($body =~ m/^[.*]*textMode:[ \t]*([^\s]+)\s*$/im) {
+ $text_mode = $1;
+ $got_any_p = 1;
+ }
+ if ($body =~ m/^[.*]*textLiteral:[ \t]*(.*?)[ \t]*$/im) {
+ $text_literal = $1;
+ }
+ if ($body =~ m/^[.*]*textFile:[ \t]*(.*?)[ \t]*$/im) {
+ $text_file = $1;
+ }
+ if ($body =~ m/^[.*]*textProgram:[ \t]*(.*?)[ \t]*$/im) {
+ $text_program = $1;
+ }
+ if ($body =~ m/^[.*]*textURL:[ \t]*(.*?)[ \t]*$/im) {
+ $text_url = $1;
+ }
+
+ return $got_any_p;
+}
+
+
+sub get_cocoa_prefs($) {
+ my ($id) = @_;
+ my $v;
+
+ print STDERR "$progname: reading Cocoa prefs: \"$id\"\n" if ($verbose > 1);
+
+ $v = get_cocoa_pref_1 ($id, "textMode");
+ $text_mode = $v if defined ($v);
+
+ # The "textMode" pref is set to a number instead of a string because I
+ # couldn't figure out the black magic to make Cocoa bindings work right.
+ #
+ # Update: as of 5.33, Cocoa writes strings instead of numbers, but
+ # pre-existing saved preferences might still have numbers in them.
+ #
+ if ($text_mode eq '0') { $text_mode = 'date'; }
+ elsif ($text_mode eq '1') { $text_mode = 'literal'; }
+ elsif ($text_mode eq '2') { $text_mode = 'file'; }
+ elsif ($text_mode eq '3') { $text_mode = 'url'; }
+ elsif ($text_mode eq '4') { $text_mode = 'program'; }
+
+ $v = get_cocoa_pref_1 ($id, "textLiteral");
+ $text_literal = $v if defined ($v);
+ $text_literal =~ s@\\n@\n@gs;
+ $text_literal =~ s@\\\n@\n@gs;
+
+ $v = get_cocoa_pref_1 ($id, "textFile");
+ $text_file = $v if defined ($v);
+
+ $v = get_cocoa_pref_1 ($id, "textProgram");
+ $text_program = $v if defined ($v);
+
+ $v = get_cocoa_pref_1 ($id, "textURL");
+ $text_url = $v if defined ($v);
+}
+
+
+sub get_cocoa_pref_1($$) {
+ my ($id, $key) = @_;
+ # make sure there's nothing stupid/malicious in either string.
+ $id =~ s/[^-a-z\d. ]/_/gsi;
+ $key =~ s/[^-a-z\d. ]/_/gsi;
+ my $cmd = "defaults -currentHost read \"$id\" \"$key\"";
+
+ print STDERR "$progname: executing $cmd\n"
+ if ($verbose > 3);
+
+ my $val = `$cmd 2>/dev/null`;
+ $val =~ s/^\s+//s;
+ $val =~ s/\s+$//s;
+
+ print STDERR "$progname: Cocoa: $id $key = \"$val\"\n"
+ if ($verbose > 2);
+
+ $val = undef if ($val =~ m/^$/s);
+
+ return $val;
+}
+
+
+# like system() but checks errors.
+#
+sub safe_system(@) {
+ my (@cmd) = @_;
+
+ print STDERR "$progname: executing " . join(' ', @cmd) . "\n"
+ if ($verbose > 3);
+
+ system @cmd;
+ my $exit_value = $? >> 8;
+ my $signal_num = $? & 127;
+ my $dumped_core = $? & 128;
+ error ("$cmd[0]: core dumped!") if ($dumped_core);
+ error ("$cmd[0]: signal $signal_num!") if ($signal_num);
+ error ("$cmd[0]: exited with $exit_value!") if ($exit_value);
+}
+
+
+sub which($) {
+ my ($cmd) = @_;
+
+ if ($cmd =~ m@^\./|^/@) {
+ error ("cannot execute $cmd") unless (-x $cmd);
+ return $cmd;
+ }
+
+ foreach my $dir (split (/:/, $ENV{PATH})) {
+ my $cmd2 = "$dir/$cmd";
+ print STDERR "$progname: checking $cmd2\n" if ($verbose > 3);
+ return $cmd2 if (-x "$cmd2");
+ }
+ error ("$cmd not found on \$PATH");
+}
+
+
+sub output() {
+
+ binmode (STDOUT, ($latin1_p ? ':raw' : ':utf8'));
+ binmode (STDERR, ':utf8');
+
+ # Do some basic sanity checking (null text, null file names, etc.)
+ #
+ if (($text_mode eq 'literal' && $text_literal =~ m/^\s*$/i) ||
+ ($text_mode eq 'file' && $text_file =~ m/^\s*$/i) ||
+ ($text_mode eq 'program' && $text_program =~ m/^\s*$/i) ||
+ ($text_mode eq 'url' && $text_url =~ m/^\s*$/i)) {
+ print STDERR "$progname: falling back to 'date'\n" if ($verbose);
+ $text_mode = 'date';
+ }
+
+ if ($text_mode eq 'literal') {
+ $text_literal = strftime ($text_literal, localtime);
+ $text_literal = utf8_to_latin1($text_literal) if ($latin1_p);
+ $text_literal =~ y/A-Za-z/N-ZA-Mn-za-m/ if ($nyarlathotep_p);
+ print STDOUT $text_literal;
+ print STDOUT "\n" unless ($text_literal =~ m/\n$/s);
+
+ } elsif ($text_mode eq 'file') {
+
+ $text_file =~ s@^~/@$ENV{HOME}/@s; # allow literal "~/"
+
+ if (open (my $in, '<:raw', $text_file)) {
+ print STDERR "$progname: reading $text_file\n" if ($verbose);
+ binmode (STDOUT, ':raw');
+
+ if (($wrap_columns && $wrap_columns > 0) || $truncate_lines) {
+ # read it, then reformat it.
+ local $/ = undef; # read entire file
+ my $body = <$in>;
+ $body = reformat_text ($body);
+ print STDOUT $body;
+ } else {
+ # stream it by lines
+ while (<$in>) {
+ $_ = utf8_to_latin1($_) if ($latin1_p);
+ y/A-Za-z/N-ZA-Mn-za-m/ if ($nyarlathotep_p);
+ print STDOUT $_;
+ }
+ }
+ close $in;
+ } else {
+ error ("$text_file: $!");
+ }
+
+ } elsif ($text_mode eq 'program') {
+
+ my ($prog, $args) = ($text_program =~ m/^([^\s]+)(.*)$/);
+ $text_program = which ($prog) . $args;
+ print STDERR "$progname: running $text_program\n" if ($verbose);
+
+ if (($wrap_columns && $wrap_columns > 0) || $truncate_lines) {
+ # read it, then reformat it.
+ my $lines = 0;
+ my $body = "";
+ my $cmd = "( $text_program ) 2>&1";
+ # $cmd .= " | sed -l"; # line buffer instead of 4k pipe buffer
+ open (my $pipe, '-|:unix', $cmd);
+ while (my $line = <$pipe>) {
+ $body .= $line;
+ $lines++;
+ last if ($truncate_lines && $lines > $truncate_lines);
+ }
+ close $pipe;
+ $body = reformat_text ($body);
+ print STDOUT $body;
+ } else {
+ # stream it
+ safe_system ("$text_program");
+ }
+
+ } elsif ($text_mode eq 'url') {
+
+ get_url_text ($text_url);
+
+ } else { # $text_mode eq 'date'
+
+ my $n = `uname -n`;
+ $n =~ s/\.local\n/\n/s;
+ print $n;
+
+ my $unamep = 1;
+
+ if (-f "/etc/redhat-release") { # "Fedora Core release 4 (Stentz)"
+ safe_system ("cat", "/etc/redhat-release");
+ }
+
+ if (-f "/etc/release") { # "Solaris 10 3/05 s10_74L2a X86"
+ safe_system ("head", "-1", "/etc/release");
+ }
+
+ if (-f "/usr/sbin/system_profiler") { # "Mac OS X 10.4.5 (8H14)"
+ my $sp = # "iMac G5"
+ `/usr/sbin/system_profiler SPSoftwareDataType SPHardwareDataType 2>/dev/null`;
+ # system_profiler on OS X 10.10 generates spurious error messages.
+ my ($v) = ($sp =~ m/^\s*System Version:\s*(.*)$/mi);
+ my ($s) = ($sp =~ m/^\s*(?:CPU|Processor) Speed:\s*(.*)$/mi);
+ my ($t) = ($sp =~ m/^\s*(?:Machine|Model) Name:\s*(.*)$/mi);
+ print "$v\n" if ($v);
+ print "$s $t\n" if ($s && $t);
+ $unamep = !defined ($v);
+ }
+
+ if ($unamep) {
+ safe_system ("uname", "-sr"); # "Linux 2.6.15-1.1831_FC4"
+ }
+
+ print "\n";
+ safe_system ("date", "+%c");
+ print "\n";
+ my $ut = `uptime`;
+ $ut =~ s/^[ \d:]*(am|pm)?//i;
+ $ut =~ s/,\s*(load)/\n$1/;
+ print "$ut\n";
+ }
+
+}
+
+
+# Make an educated guess as to what's in this document.
+# We don't necessarily take the Content-Type header at face value.
+# Returns 'html', 'rss', or 'text';
+#
+sub guess_content_type($$) {
+ my ($ct, $body) = @_;
+
+ $body =~ s/^(.{512}).*/$1/s; # only look in first half K of file
+
+ if ($ct =~ m@^text/.*html@i) { return 'html'; }
+ if ($ct =~ m@\b(atom|rss|xml)\b@i) { return 'rss'; }
+
+ if ($body =~ m@^\s*<\?xml@is) { return 'rss'; }
+ if ($body =~ m@^\s*<!DOCTYPE RSS@is) { return 'rss'; }
+ if ($body =~ m@^\s*<!DOCTYPE HTML@is) { return 'html'; }
+
+ if ($body =~ m@<(BASE|HTML|HEAD|BODY|SCRIPT|STYLE|TABLE|A\s+HREF)\b@i) {
+ return 'html';
+ }
+
+ if ($body =~ m@<(RSS|CHANNEL|GENERATOR|DESCRIPTION|CONTENT|FEED|ENTRY)\b@i) {
+ return 'rss';
+ }
+
+ return 'text';
+}
+
+
+sub reformat_html($$) {
+ my ($body, $rss_p) = @_;
+ $_ = $body;
+
+ # In HTML, try to preserve newlines inside of PRE.
+ #
+ if (! $rss_p) {
+ s@(<PRE\b[^<>]*>\s*)(.*?)(</PRE)@{
+ my ($a, $b, $c) = ($1, $2, $3);
+ $b =~ s/[\r\n]/<BR>/gs;
+ $a . $b . $c;
+ }@gsexi;
+ }
+
+ if (! $rss_p) {
+ # In HTML, unfold lines.
+ # In RSS, assume \n means literal line break.
+ s@[\r\n]@ @gsi;
+ }
+
+ # This right here is the part where I doom us all to inhuman
+ # toil for the One whose Name cannot be expressed in the
+ # Basic Multilingual Plane. http://jwz.org/b/yhAT He comes.
+
+ s@<!--.*?-->@@gsi; # lose comments
+ s@<(STYLE|SCRIPT)\b[^<>]*>.*?</\1\s*>@@gsi; # lose css and js
+
+ s@</?(BR|TR|TD|LI|DIV)\b[^<>]*>@\n@gsi; # line break at BR, TD, DIV, etc
+ s@</?(P|UL|OL|BLOCKQUOTE)\b[^<>]*>@\n\n@gsi; # two line breaks
+
+ s@<lj\s+user=\"?([^<>\"]+)\"?[^<>]*>?@$1@gsi; # handle <LJ USER=>
+ s@</?[BI]>@*@gsi; # bold, italic => asterisks
+
+
+ s@<[^<>]*>?@@gs; # lose all other HTML tags
+ $_ = de_entify ($_); # convert HTML entities
+
+ # For Wikipedia: delete anything inside {{ }} and unwrap [[tags]],
+ # among other things.
+ #
+ if ($rss_p eq 'wiki') {
+
+ s@<!--.*?-->@@gsi; # lose HTML comments again
+
+ # Creation line is often truncated: screws up parsing with unbalanced {{.
+ s@(: +[^a-zA-Z ]* *Created page) with [^\n]+@$1@s;
+
+ s@/\*.*?\*/@@si; # /* ... */
+
+ # Try to omit all tables, since they're impossible to read as text.
+ #
+ 1 while (s/\{\{[^{}]*}}/ /gs); # {{ ... }}
+ 1 while (s/\{\|.*?\|\}/\n\n/gs); # {| ... |}
+ 1 while (s/\|-.*?\|/ /gs); # |- ... | (table cell)
+
+ # Convert anchors to something more readable.
+ #
+ s/\[\[([^\[\]\|]+)\|([^\[\]]+)\]\]/$2/gs; # [[link|anchor]]
+ s/\[\[([^:\[\]\|]+)\]\]/$1/gs; # [[anchor]]
+ s/\[https?:[^\[\]\s]+\s+([^\[\]]+)\]/$1/gs; # [url anchor]
+
+ # Convert all references to asterisks.
+ s@\s*<ref>\s*.*?</ref>@*@gs; # <ref> ... <ref> -> "*"
+ s@\n[ \t]*\d+\s*\^\s*http[^\s]+[ \t]*\n@\n@gs; # 1 ^ URL (a Reflist)
+
+ s@\[\[File:([^\|\]]+).*?\]\]@\n$1\n@gs; # [[File: X | ... ]]
+ s@\[\[Category:.*?\]\]@@gs; # omit categories
+
+ s/<[^<>]*>//gs; # Omit all remaining tags
+ s/\'{3,}//gs; # Omit ''' and ''''
+ s/\'\'/\"/gs; # '' -> "
+ s/\`\`/\"/gs; # `` -> "
+ s/\"\"+/\"/gs; # "" -> "
+
+ s/^[ \t]*[*#]+[ \t]*$//gm; # Omit lines with just * or # on them
+
+ # Omit trailing headlines with no text after them (e.g. == Notes ==)
+ 1 while (s/\n==+[ \t]*[^\n=]+[ \t]*==+\s*$/\n/s);
+
+ $_ = de_entify ($_); # convert HTML entities, again
+ }
+
+
+ # elide any remaining non-Latin1 binary data.
+ if ($latin1_p) {
+ utf8::encode ($_); # Unpack Unicode back to multi-byte UTF-8.
+ s/([^\000-\176]+(\s*[^\000-\176]+)[^a-z\d]*)/\xAB...\xBB /g;
+ }
+
+ $_ .= "\n";
+
+ s/[ \t]+$//gm; # lose whitespace at end of line
+ s@\n\n\n+@\n\n@gs; # compress blank lines
+
+ if (!defined($wrap_columns) || $wrap_columns > 0) {
+ $Text::Wrap::columns = ($wrap_columns || 72);
+ $Text::Wrap::break = '[\s/|]'; # wrap on slashes for URLs
+ $_ = wrap ("", " ", $_); # wrap the lines as a paragraph
+ s/[ \t]+$//gm; # lose whitespace at end of line again
+ }
+
+ s/^\n+//gs;
+
+ if ($truncate_lines) {
+ s/^(([^\n]*\n){$truncate_lines}).*$/$1/s;
+ }
+
+ $_ = utf8_to_latin1($_) if ($latin1_p);
+ y/A-Za-z/N-ZA-Mn-za-m/ if ($nyarlathotep_p);
+
+ return $_;
+}
+
+
+sub reformat_rss($) {
+ my ($body) = @_;
+
+ my $wiki_p = ($body =~ m@<generator>[^<>]*Wiki@si);
+
+ $body =~ s/(<(ITEM|ENTRY)\b)/\001\001$1/gsi;
+ my @items = split (/\001\001/, $body);
+
+ print STDERR "$progname: converting RSS ($#items items)...\n"
+ if ($verbose > 2);
+
+ shift @items;
+
+ # Let's skip forward in the stream by a random amount, so that if
+ # two copies of ljlatest are running at the same time (e.g., on a
+ # multi-headed machine), they get different text. (Put the items
+ # that we take off the front back on the back.)
+ #
+ if ($#items > 7) {
+ my $n = int (rand ($#items - 5));
+ print STDERR "$progname: rotating by $n items...\n" if ($verbose > 2);
+ while ($n-- > 0) {
+ push @items, (shift @items);
+ }
+ }
+
+ my $out = '';
+
+ my $i = -1;
+ foreach (@items) {
+ $i++;
+
+ my ($title, $body1, $body2, $body3);
+
+ $title = $3 if (m@<((TITLE) [^<>\s]*)[^<>]*>\s*(.*?)\s*</\1>@xsi);
+ $body1 = $3 if (m@<((DESCRIPTION) [^<>\s]*)[^<>]*>\s*(.*?)\s*</\1>@xsi);
+ $body2 = $3 if (m@<((CONTENT) [^<>\s]*)[^<>]*>\s*(.*?)\s*</\1>@xsi);
+ $body3 = $3 if (m@<((SUMMARY) [^<>\s]*)[^<>]*>\s*(.*?)\s*</\1>@xsi);
+
+ # If there are both <description> and <content> or <content:encoded>,
+ # use whichever one contains more text.
+ #
+ if ($body3 && length($body3) >= length($body2 || '')) {
+ $body2 = $body3;
+ }
+ if ($body2 && length($body2) >= length($body1 || '')) {
+ $body1 = $body2;
+ }
+
+ if (! $body1) {
+ if ($title) {
+ print STDERR "$progname: no body in item $i (\"$title\")\n"
+ if ($verbose > 2);
+ } else {
+ print STDERR "$progname: no body or title in item $i\n"
+ if ($verbose > 2);
+ next;
+ }
+ }
+
+ $title = rss_field_to_html ($title || '');
+ $body1 = rss_field_to_html ($body1 || '');
+
+ $title = '' if ($body1 eq $title); # Identical in Twitter's atom feed.
+
+ $out .= reformat_html ("$title<P>$body1", $wiki_p ? 'wiki' : 'rss');
+ $out .= "\n";
+ }
+
+ if ($truncate_lines) {
+ $out =~ s/^(([^\n]*\n){$truncate_lines}).*$/$1/s;
+ }
+
+ return $out;
+}
+
+
+sub rss_field_to_html($) {
+ my ($body) = @_;
+
+ # If <![CDATA[...]]> is present, everything inside that is HTML,
+ # and not double-encoded.
+ #
+ if ($body =~ m/^\s*<!\[CDATA\[(.*?)\]\s*\]/is) {
+ $body = $1;
+ } else {
+ $body = de_entify ($body); # convert entities to get HTML from XML
+ }
+
+ return $body;
+}
+
+
+sub reformat_text($) {
+ my ($body) = @_;
+
+ # only re-wrap if --cols was specified. Otherwise, dump it as is.
+ #
+ if ($wrap_columns && $wrap_columns > 0) {
+ print STDERR "$progname: wrapping at $wrap_columns...\n" if ($verbose > 2);
+ $Text::Wrap::columns = $wrap_columns;
+ $Text::Wrap::break = '[\s/]'; # wrap on slashes for URLs
+ $body = wrap ("", "", $body);
+ $body =~ s/[ \t]+$//gm;
+ }
+
+ if ($truncate_lines) {
+ $body =~ s/^(([^\n]*\n){$truncate_lines}).*$/$1/s;
+ }
+
+ $body = utf8_to_latin1($body) if ($latin1_p);
+ $body =~ y/A-Za-z/N-ZA-Mn-za-m/ if ($nyarlathotep_p);
+ return $body;
+}
+
+
+# Figure out what the proxy server should be, either from environment
+# variables or by parsing the output of the (MacOS) program "scutil",
+# which tells us what the system-wide proxy settings are.
+#
+sub set_proxy($) {
+ my ($ua) = @_;
+
+ my $proxy_data = `scutil --proxy 2>/dev/null`;
+ foreach my $proto ('http', 'https') {
+ my ($server) = ($proxy_data =~ m/\b${proto}Proxy\s*:\s*([^\s]+)/si);
+ my ($port) = ($proxy_data =~ m/\b${proto}Port\s*:\s*([^\s]+)/si);
+ my ($enable) = ($proxy_data =~ m/\b${proto}Enable\s*:\s*([^\s]+)/si);
+
+ if ($server && $enable) {
+ # Note: this ignores the "ExceptionsList".
+ my $proto2 = 'http';
+ $ENV{"${proto}_proxy"} = ("${proto2}://" . $server .
+ ($port ? ":$port" : "") . "/");
+ print STDERR "$progname: MacOS $proto proxy: " .
+ $ENV{"${proto}_proxy"} . "\n"
+ if ($verbose > 2);
+ }
+ }
+
+ $ua->env_proxy();
+}
+
+
+sub get_url_text($) {
+ my ($url) = @_;
+
+ my $ua = eval 'LWP::UserAgent->new';
+
+ if (! $ua) {
+ print STDOUT ("\n\tPerl is broken. Do this to repair it:\n" .
+ "\n\tsudo cpan LWP::UserAgent" .
+ " LWP::Protocol::https Mozilla::CA\n\n");
+ return;
+ }
+
+ # Half the time, random Linux systems don't have Mozilla::CA installed,
+ # which results in "Can't verify SSL peers without knowning which
+ # Certificate Authorities to trust".
+ #
+ # I'm going to take a controversial stand here and say that, for the
+ # purposes of plain-text being displayed in a screen saver via RSS,
+ # the chances of a certificate-based man-in-the-middle attack having
+ # a malicious effect on anyone anywhere at any time is so close to
+ # zero that it can be discounted. So, just don't bother validating
+ # SSL connections.
+ #
+ $ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;
+ eval {
+ $ua->ssl_opts (verify_hostname => 0, SSL_verify_mode => 0);
+ };
+
+
+ set_proxy ($ua);
+ $ua->agent ("$progname/$version");
+ my $res = $ua->get ($url);
+ my $body;
+ my $ct;
+
+ if ($res && $res->is_success) {
+ $body = $res->decoded_content || '';
+ $ct = $res->header ('Content-Type') || 'text/plain';
+
+ } else {
+ my $err = ($res ? $res->status_line : '') || '';
+ $err = 'unknown error' unless $err;
+ $err = "$url: $err";
+ # error ($err);
+ $body = "Error loading URL $err\n\n";
+ $ct = 'text/plain';
+ }
+
+ # This is not necessary, since HTTP::Message::decoded_content() has
+ # already done 'decode (<charset-header>, $body)'.
+ # utf8::decode ($body); # Pack multi-byte UTF-8 back into wide chars.
+
+ $ct = guess_content_type ($ct, $body);
+ if ($ct eq 'html') {
+ print STDERR "$progname: converting HTML...\n" if ($verbose > 2);
+ $body = reformat_html ($body, 0);
+ } elsif ($ct eq 'rss') {
+ $body = reformat_rss ($body);
+ } else {
+ print STDERR "$progname: plain text...\n" if ($verbose > 2);
+ $body = reformat_text ($body);
+ }
+ print STDOUT $body;
+}
+
+
+
+sub error($) {
+ my ($err) = @_;
+ print STDERR "$progname: $err\n";
+ exit 1;
+}
+
+sub usage() {
+ print STDERR "usage: $progname [ --options ... ]\n" .
+ ("\n" .
+ " Prints out some text for use by various screensavers,\n" .
+ " according to the options in the ~/.xscreensaver file.\n" .
+ " This may dump the contents of a file, run a program,\n" .
+ " or load a URL.\n".
+ "\n" .
+ " Options:\n" .
+ "\n" .
+ " --date Print the host name and current time.\n" .
+ "\n" .
+ " --text STRING Print out the given text. It may contain %\n" .
+ " escape sequences as per strftime(2).\n" .
+ "\n" .
+ " --file PATH Print the contents of the given file.\n" .
+ " If --cols is specified, re-wrap the lines;\n" .
+ " otherwise, print them as-is.\n" .
+ "\n" .
+ " --program CMD Run the given program and print its output.\n" .
+ " If --cols is specified, re-wrap the output.\n" .
+ "\n" .
+ " --url HTTP-URL Download and print the contents of the HTTP\n" .
+ " document. If it contains HTML, RSS, or Atom,\n" .
+ " it will be converted to plain-text.\n" .
+ "\n" .
+ " --cols N Wrap lines at this column. Default 72.\n" .
+ "\n" .
+ " --lines N No more than N lines of output.\n" .
+ "\n" .
+ " --latin1 Emit Latin1 instead of UTF-8.\n" .
+ "\n");
+ exit 1;
+}
+
+sub main() {
+
+ my $load_p = 1;
+ my $cocoa_id = undef;
+
+ while ($#ARGV >= 0) {
+ $_ = shift @ARGV;
+ if ($_ eq "--verbose") { $verbose++; }
+ elsif (m/^-v+$/) { $verbose += length($_)-1; }
+ elsif (m/^--?date$/) { $text_mode = 'date';
+ $load_p = 0; }
+ elsif (m/^--?text$/) { $text_mode = 'literal';
+ $text_literal = shift @ARGV || '';
+ $text_literal =~ s@\\n@\n@gs;
+ $text_literal =~ s@\\\n@\n@gs;
+ $load_p = 0; }
+ elsif (m/^--?file$/) { $text_mode = 'file';
+ $text_file = shift @ARGV || '';
+ $load_p = 0; }
+ elsif (m/^--?program$/) { $text_mode = 'program';
+ $text_program = shift @ARGV || '';
+ $load_p = 0; }
+ elsif (m/^--?url$/) { $text_mode = 'url';
+ $text_url = shift @ARGV || '';
+ $load_p = 0; }
+ elsif (m/^--?col(umn)?s?$/) { $wrap_columns = 0 + shift @ARGV; }
+ elsif (m/^--?lines?$/) { $truncate_lines = 0 + shift @ARGV; }
+ elsif (m/^--?cocoa$/) { $cocoa_id = shift @ARGV; }
+ elsif (m/^--?latin1$/) { $latin1_p++; }
+ elsif (m/^--?nyarlathotep$/) { $nyarlathotep_p++; }
+ elsif (m/^-./) { usage; }
+ else { usage; }
+ }
+
+ if ($load_p) {
+
+ if (!defined ($cocoa_id)) {
+ # see OSX/XScreenSaverView.m
+ $cocoa_id = $ENV{XSCREENSAVER_CLASSPATH};
+ }
+
+ if (defined ($cocoa_id)) {
+ get_cocoa_prefs($cocoa_id);
+ } else {
+ get_x11_prefs();
+ }
+ }
+
+ output();
+
+
+ if (defined ($cocoa_id)) {
+ #
+ # On MacOS, sleep for 10 seconds between when the last output is
+ # printed, and when this process exits. This is because MacOS
+ # 10.5.0 and later broke ptys in a new and exciting way: basically,
+ # once the process at the end of the pty exits, you have exactly
+ # 1 second to read all the queued data off the pipe before it is
+ # summarily flushed.
+ #
+ # Many of the screen savers were written to depend on being able
+ # to read a small number of bytes, and continue reading until they
+ # reached EOF. This is no longer possible.
+ #
+ # Note that the current MacOS behavior has all four of these
+ # awesome properties: 1) Inconvenient; 2) Has no sane workaround;
+ # 3) Different behavior than MacOS 10.1 through 10.4; and 4)
+ # Different behavior than every other Unix in the world.
+ #
+ # See http://jwz.org/b/DHke, and for those of you inside Apple,
+ # "Problem ID 5606018".
+ #
+ # One workaround would be to rewrite the savers to have an
+ # internal buffer, and always read as much data as possible as
+ # soon as a pipe has input available. However, that's a lot more
+ # work, so instead, let's just not exit right away, and hope that
+ # 10 seconds is enough.
+ #
+ # This will solve the problem for invocations of xscreensaver-text
+ # that produce little output (e.g., date-mode); and won't solve it
+ # in cases where a large amount of text is generated in a short
+ # amount of time (e.g., url-mode.)
+ #
+ sleep (10);
+ }
+}
+
+main();
+exit 0;
diff --git a/driver/xscreensaver-text.man b/driver/xscreensaver-text.man
new file mode 100644
index 0000000..dcedc3b
--- /dev/null
+++ b/driver/xscreensaver-text.man
@@ -0,0 +1,85 @@
+.TH XScreenSaver 1 "20-Mar-2005 (4.21)" "X Version 11"
+.SH NAME
+xscreensaver\-text - prints some text to stdout, for use by screen savers.
+.SH SYNOPSIS
+.B xscreensaver\-text
+[\--verbose]
+[\--columns \fIN\fP]
+[\--text \fISTRING\fP]
+[\--file \fIPATH\fP]
+[\--program \fICMD\fP]
+[\--url \fIURL\fP]
+.SH DESCRIPTION
+The \fIxscreensaver\-text\fP script prints out some text for use by
+various screensavers, according to the options set in the ~/.xscreensaver
+file. This may dump the contents of a file, run a program, or load a URL.
+.SH OPTIONS
+.I xscreensaver\-text
+accepts the following options:
+.TP 8
+.B \-\-columns \fIN\fP or \-\-cols \fIN\fP
+Where to wrap lines; default 72 columns.
+.TP 8
+.B \-\-verbose \fRor\fP \-v
+Print diagnostics to stderr. Multiple \fI-v\fP switches increase the
+amount of output.
+.PP
+Command line options may be used to override the settings in the
+~/.xscreensaver file:
+.TP 8
+.B \-\-string \fISTRING\fP
+Print the given string. It may contain % escape sequences as per
+.BR strftime (2).
+.TP 8
+.B \-\-file \fIPATH\fP
+Print the contents of the given file. If --cols is specified, re-wrap
+the lines; otherwise, print them as-is.
+.TP 8
+.B \-\-program \fICMD\fP
+Run the given program and print its output. If --cols is specified,
+re-wrap the output.
+.TP 8
+.B \-\-url \fIHTTP-URL\fP
+Download and print the contents of the HTTP document. If it contains
+HTML, RSS, or Atom, it will be converted to plain-text.
+
+Note: this re-downloads the document every time it is run! It might
+be considered abusive for you to point this at a web server that you
+do not control!
+.SH ENVIRONMENT
+.PP
+.TP 4
+.B HTTP_PROXY\fR or \fPhttp_proxy
+to get the default HTTP proxy host and port.
+.SH BUGS
+The RSS and Atom output is always ISO-8859-1, regardless of locale.
+
+URLs should be cached, use "If-Modified-Since", and obey "Expires".
+.SH SEE ALSO
+.BR xscreensaver-demo (1),
+.BR xscreensaver (1),
+.BR fortune (1),
+.BR phosphor (MANSUFFIX),
+.BR apple2 (MANSUFFIX),
+.BR starwars (MANSUFFIX),
+.BR fontglide (MANSUFFIX),
+.BR dadadodo (1),
+.BR webcollage (MANSUFFIX),
+.RS 0
+.I http://www.livejournal.com/stats/latest-rss.bml,
+.RS 0
+.I https://en.wikipedia.org/w/index.php?title=Special:NewPages&feed=rss,
+.RS 0
+.BR driftnet (1),
+.BR EtherPEG ,
+.BR EtherPeek
+.SH COPYRIGHT
+Copyright \(co 2005 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 20-Mar-2005.
diff --git a/driver/xscreensaver.c b/driver/xscreensaver.c
new file mode 100644
index 0000000..f5f65dc
--- /dev/null
+++ b/driver/xscreensaver.c
@@ -0,0 +1,2463 @@
+/* xscreensaver, Copyright (c) 1991-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* ========================================================================
+ * First we wait until the keyboard and mouse become idle for the specified
+ * amount of time. We do this in one of three different ways: periodically
+ * checking with the XIdle server extension; selecting key and mouse events
+ * on (nearly) all windows; or by waiting for the MIT-SCREEN-SAVER extension
+ * to send us a "you are idle" event.
+ *
+ * Then, we map a full screen black window.
+ *
+ * We place a __SWM_VROOT property on this window, so that newly-started
+ * clients will think that this window is a "virtual root" window (as per
+ * the logic in the historical "vroot.h" header.)
+ *
+ * If there is an existing "virtual root" window (one that already had
+ * an __SWM_VROOT property) then we remove that property from that window.
+ * Otherwise, clients would see that window (the real virtual root) instead
+ * of ours (the impostor.)
+ *
+ * Then we pick a random program to run, and start it. Two assumptions
+ * are made about this program: that it has been specified with whatever
+ * command-line options are necessary to make it run on the root window;
+ * and that it has been compiled with vroot.h, so that it is able to find
+ * the root window when a virtual-root window manager (or this program) is
+ * running.
+ *
+ * Then, we wait for keyboard or mouse events to be generated on the window.
+ * When they are, we kill the inferior process, unmap the window, and restore
+ * the __SWM_VROOT property to the real virtual root window if there was one.
+ *
+ * On multi-screen systems, we do the above on each screen, and start
+ * multiple programs, each with a different value of $DISPLAY.
+ *
+ * On Xinerama systems, we do a similar thing, but instead create multiple
+ * windows on the (only) display, and tell the subprocess which one to use
+ * via the $XSCREENSAVER_WINDOW environment variable -- this trick requires
+ * a recent (Aug 2003) revision of vroot.h.
+ *
+ * (See comments in screens.c for more details about Xinerama/RANDR stuff.)
+ *
+ * While we are waiting for user activity, we also set up timers so that,
+ * after a certain amount of time has passed, we can start a different
+ * screenhack. We do this by killing the running child process with
+ * SIGTERM, and then starting a new one in the same way.
+ *
+ * If there was a real virtual root, meaning that we removed the __SWM_VROOT
+ * property from it, meaning we must (absolutely must) restore it before we
+ * exit, then we set up signal handlers for most signals (SIGINT, SIGTERM,
+ * etc.) that do this. Most Xlib and Xt routines are not reentrant, so it
+ * is not generally safe to call them from signal handlers; however, this
+ * program spends most of its time waiting, so the window of opportunity
+ * when code could be called reentrantly is fairly small; and also, the worst
+ * that could happen is that the call would fail. If we've gotten one of
+ * these signals, then we're on our way out anyway. If we didn't restore the
+ * __SWM_VROOT property, that would be very bad, so it's worth a shot. Note
+ * that this means that, if you're using a virtual-root window manager, you
+ * can really fuck up the world by killing this process with "kill -9".
+ *
+ * This program accepts ClientMessages of type SCREENSAVER; these messages
+ * may contain the atoms ACTIVATE, DEACTIVATE, etc, meaning to turn the
+ * screensaver on or off now, regardless of the idleness of the user,
+ * and a few other things. The included "xscreensaver-command" program
+ * sends these messsages.
+ *
+ * If we don't have the XIdle, MIT-SCREEN-SAVER, or SGI SCREEN_SAVER
+ * extensions, then we do the XAutoLock trick: notice every window that
+ * gets created, and wait 30 seconds or so until its creating process has
+ * settled down, and then select KeyPress events on those windows which
+ * already select for KeyPress events. It's important that we not select
+ * KeyPress on windows which don't select them, because that would
+ * interfere with event propagation. This will break if any program
+ * changes its event mask to contain KeyRelease or PointerMotion more than
+ * 30 seconds after creating the window, but such programs do not seem to
+ * occur in nature (I've never seen it happen in all these years.)
+ *
+ * The reason that we can't select KeyPresses on windows that don't have
+ * them already is that, when dispatching a KeyPress event, X finds the
+ * lowest (leafmost) window in the hierarchy on which *any* client selects
+ * for KeyPress, and sends the event to that window. This means that if a
+ * client had a window with subwindows, and expected to receive KeyPress
+ * events on the parent window instead of the subwindows, then that client
+ * would malfunction if some other client selected KeyPress events on the
+ * subwindows. It is an incredible misdesign that one client can make
+ * another client malfunction in this way.
+ *
+ * But here's a new kink that started showing up in late 2014: GNOME programs
+ * don't actually select for or receive KeyPress events! They do it behind
+ * the scenes through some kind of Input Method magic, even when running in
+ * an en_US locale. However, in that case, those applications *do* seem to
+ * update the _NET_WM_USER_TIME on their own windows every time they have
+ * received a secret KeyPress, so we *also* monitor that property on every
+ * window, and treat changes to it as identical to KeyPress.
+ *
+ * To detect mouse motion, we periodically wake up and poll the mouse
+ * position and button/modifier state, and notice when something has
+ * changed. We make this check every five seconds by default, and since the
+ * screensaver timeout has a granularity of one minute, this makes the
+ * chance of a false positive very small. We could detect mouse motion in
+ * the same way as keyboard activity, but that would suffer from the same
+ * "client changing event mask" problem that the KeyPress events hack does.
+ * I think polling is more reliable.
+ *
+ * On systems with /proc/interrupts (Linux) we poll that file and note when
+ * the interrupt counter numbers on the "keyboard" and "PS/2" lines change.
+ * (There is no reliable way, using /proc/interrupts, to detect non-PS/2
+ * mice, so it doesn't help for serial or USB mice.)
+ *
+ * None of this crap happens if we're using one of the extensions. Sadly,
+ * the XIdle extension hasn't been available for many years; the SGI
+ * extension only exists on SGIs; and the MIT extension, while widely
+ * deployed, is garbage in several ways.
+ *
+ * A third idle-detection option could be implemented (but is not): when
+ * running on the console display ($DISPLAY is `localhost`:0) and we're on a
+ * machine where /dev/tty and /dev/mouse have reasonable last-modification
+ * times, we could just stat() those. But the incremental benefit of
+ * implementing this is really small, so forget I said anything.
+ *
+ * Debugging hints:
+ * - Have a second terminal handy.
+ * - Be careful where you set your breakpoints, you don't want this to
+ * stop under the debugger with the keyboard grabbed or the blackout
+ * window exposed.
+ * - If you run your debugger under XEmacs, try M-ESC (x-grab-keyboard)
+ * to keep your emacs window alive even when xscreensaver has grabbed.
+ * - Go read the code related to `debug_p'.
+ * - You probably can't set breakpoints in functions that are called on
+ * the other side of a call to fork() -- if your subprocesses are
+ * dying with signal 5, Trace/BPT Trap, you're losing in this way.
+ * - If you aren't using a server extension, don't leave this stopped
+ * under the debugger for very long, or the X input buffer will get
+ * huge because of the keypress events it's selecting for. This can
+ * make your X server wedge with "no more input buffers."
+ *
+ * ======================================================================== */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <ctype.h>
+#include <X11/Xlib.h>
+
+#ifdef ENABLE_NLS
+# include <locale.h>
+# include <libintl.h>
+#endif /* ENABLE_NLS */
+
+#include <X11/Xlibint.h>
+
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Shell.h>
+#include <X11/Xos.h>
+#include <time.h>
+#include <sys/time.h>
+#include <netdb.h> /* for gethostbyname() */
+#include <sys/types.h>
+#include <pwd.h>
+#ifdef HAVE_XMU
+# ifndef VMS
+# include <X11/Xmu/Error.h>
+# else /* !VMS */
+# include <Xmu/Error.h>
+# endif /* !VMS */
+#else /* !HAVE_XMU */
+# include "xmu.h"
+#endif /* !HAVE_XMU */
+
+#ifdef HAVE_MIT_SAVER_EXTENSION
+#include <X11/extensions/scrnsaver.h>
+#endif /* HAVE_MIT_SAVER_EXTENSION */
+
+#ifdef HAVE_XIDLE_EXTENSION
+# include <X11/extensions/xidle.h>
+#endif /* HAVE_XIDLE_EXTENSION */
+
+#ifdef HAVE_SGI_VC_EXTENSION
+# include <X11/extensions/XSGIvc.h>
+#endif /* HAVE_SGI_VC_EXTENSION */
+
+#ifdef HAVE_READ_DISPLAY_EXTENSION
+# include <X11/extensions/readdisplay.h>
+#endif /* HAVE_READ_DISPLAY_EXTENSION */
+
+#ifdef HAVE_XSHM_EXTENSION
+# include <X11/extensions/XShm.h>
+#endif /* HAVE_XSHM_EXTENSION */
+
+#ifdef HAVE_DPMS_EXTENSION
+# include <X11/extensions/dpms.h>
+#endif /* HAVE_DPMS_EXTENSION */
+
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+# include <X11/extensions/Xdbe.h>
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+#ifdef HAVE_XF86VMODE
+# include <X11/extensions/xf86vmode.h>
+#endif /* HAVE_XF86VMODE */
+
+#ifdef HAVE_XF86MISCSETGRABKEYSSTATE
+# include <X11/extensions/xf86misc.h>
+#endif /* HAVE_XF86MISCSETGRABKEYSSTATE */
+
+#ifdef HAVE_XINERAMA
+# include <X11/extensions/Xinerama.h>
+#endif /* HAVE_XINERAMA */
+
+#ifdef HAVE_RANDR
+# include <X11/extensions/Xrandr.h>
+#endif /* HAVE_RANDR */
+
+
+#include "xscreensaver.h"
+#include "version.h"
+#include "yarandom.h"
+#include "resources.h"
+#include "visual.h"
+#include "usleep.h"
+#include "auth.h"
+
+saver_info *global_si_kludge = 0; /* I hate C so much... */
+
+char *progname = 0;
+char *progclass = 0;
+XrmDatabase db = 0;
+
+
+static Atom XA_SCREENSAVER_RESPONSE;
+static Atom XA_ACTIVATE, XA_DEACTIVATE, XA_CYCLE, XA_NEXT, XA_PREV;
+static Atom XA_RESTART, XA_SELECT;
+static Atom XA_THROTTLE, XA_UNTHROTTLE;
+Atom XA_DEMO, XA_PREFS, XA_EXIT, XA_LOCK, XA_BLANK;
+
+
+static XrmOptionDescRec options [] = {
+
+ { "-verbose", ".verbose", XrmoptionNoArg, "on" },
+ { "-silent", ".verbose", XrmoptionNoArg, "off" },
+
+ /* xscreensaver-demo uses this one */
+ { "-nosplash", ".splash", XrmoptionNoArg, "off" },
+ { "-no-splash", ".splash", XrmoptionNoArg, "off" },
+
+ /* useful for debugging */
+ { "-no-capture-stderr", ".captureStderr", XrmoptionNoArg, "off" },
+ { "-log", ".logFile", XrmoptionSepArg, 0 },
+};
+
+#ifdef __GNUC__
+ __extension__ /* shut up about "string length is greater than the length
+ ISO C89 compilers are required to support" when including
+ the .ad file... */
+#endif
+
+static char *defaults[] = {
+#include "XScreenSaver_ad.h"
+ 0
+};
+
+#ifdef _VROOT_H_
+ERROR! You must not include vroot.h in this file.
+#endif
+
+static void
+do_help (saver_info *si)
+{
+ char *s, year[5];
+ s = strchr (screensaver_id, '-');
+ s = strrchr (s, '-');
+ s++;
+ strncpy (year, s, 4);
+ year[4] = 0;
+
+ fflush (stdout);
+ fflush (stderr);
+ fprintf (stdout, "\
+xscreensaver %s, copyright (c) 1991-%s by Jamie Zawinski <jwz@jwz.org>\n\
+\n\
+ All xscreensaver configuration is via the `~/.xscreensaver' file.\n\
+ Rather than editing that file by hand, just run `xscreensaver-demo':\n\
+ that program lets you configure the screen saver graphically,\n\
+ including timeouts, locking, and display modes.\n\
+\n",
+ si->version, year);
+ fprintf (stdout, "\
+ Just getting started? Try this:\n\
+\n\
+ xscreensaver &\n\
+ xscreensaver-demo\n\
+\n\
+ For updates, online manual, and FAQ, please see the web page:\n\
+\n\
+ https://www.jwz.org/xscreensaver/\n\
+\n");
+
+ fflush (stdout);
+ fflush (stderr);
+ exit (1);
+}
+
+
+Bool in_signal_handler_p = 0; /* I hate C so much... */
+
+char *
+timestring (time_t when)
+{
+ if (in_signal_handler_p)
+ {
+ /* Turns out that ctime() and even localtime_r() call malloc() on Linux!
+ So we can't call them from inside SIGCHLD. WTF.
+ */
+ static char buf[30];
+ strcpy (buf, "... ... .. signal ....");
+ return buf;
+ }
+ else
+ {
+ char *str, *nl;
+ if (! when) when = time ((time_t *) 0);
+ str = (char *) ctime (&when);
+ nl = (char *) strchr (str, '\n');
+ if (nl) *nl = 0; /* take off that dang newline */
+ return str;
+ }
+}
+
+static Bool blurb_timestamp_p = True; /* kludge */
+
+const char *
+blurb (void)
+{
+ if (!blurb_timestamp_p)
+ return progname;
+ else
+ {
+ static char buf[255];
+ char *ct = timestring(0);
+ int n = strlen(progname);
+ if (n > 100) n = 99;
+ strncpy(buf, progname, n);
+ buf[n++] = ':';
+ buf[n++] = ' ';
+ strncpy(buf+n, ct+11, 8);
+ strcpy(buf+n+9, ": ");
+ return buf;
+ }
+}
+
+
+int
+saver_ehandler (Display *dpy, XErrorEvent *error)
+{
+ saver_info *si = global_si_kludge; /* I hate C so much... */
+ int i;
+ Bool fatal_p;
+
+ if (!real_stderr) real_stderr = stderr;
+
+ fprintf (real_stderr, "\n"
+ "#######################################"
+ "#######################################\n\n"
+ "%s: X Error! PLEASE REPORT THIS BUG.\n",
+ blurb());
+
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ fprintf (real_stderr, "%s: screen %d/%d: 0x%x, 0x%x, 0x%x\n",
+ blurb(), ssi->real_screen_number, ssi->number,
+ (unsigned int) RootWindowOfScreen (si->screens[i].screen),
+ (unsigned int) si->screens[i].real_vroot,
+ (unsigned int) si->screens[i].screensaver_window);
+ }
+
+ fprintf (real_stderr, "\n"
+ "#######################################"
+ "#######################################\n\n");
+
+ fatal_p = XmuPrintDefaultErrorMessage (dpy, error, real_stderr);
+
+ fatal_p = True; /* The only time I've ever seen a supposedly nonfatal error,
+ it has been BadImplementation / Xlib sequence lost, which
+ are in truth pretty damned fatal.
+ */
+
+ fprintf (real_stderr, "\n");
+
+ if (! fatal_p)
+ fprintf (real_stderr, "%s: nonfatal error.\n\n", blurb());
+ else
+ {
+ if (si->prefs.xsync_p)
+ {
+ saver_exit (si, -1, "because of synchronous X Error");
+ }
+ else
+ {
+#ifdef __GNUC__
+ __extension__ /* don't warn about "string length is greater than the
+ length ISO C89 compilers are required to support". */
+#endif
+ fprintf (real_stderr,
+ "#######################################################################\n"
+ "\n"
+ " If at all possible, please re-run xscreensaver with the command\n"
+ " line arguments `-sync -verbose -log log.txt', and reproduce this\n"
+ " bug. That will cause xscreensaver to dump a `core' file to the\n"
+ " current directory. Please include the stack trace from that core\n"
+ " file in your bug report. *DO NOT* mail the core file itself! That\n"
+ " won't work. A \"log.txt\" file will also be written. Please *do*\n"
+ " include the complete \"log.txt\" file with your bug report.\n"
+ "\n"
+ " https://www.jwz.org/xscreensaver/bugs.html explains how to create\n"
+ " the most useful bug reports, and how to examine core files.\n"
+ "\n"
+ " The more information you can provide, the better. But please\n"
+ " report this bug, regardless!\n"
+ "\n"
+ "#######################################################################\n"
+ "\n"
+ "\n");
+
+ saver_exit (si, -1, 0);
+ }
+ }
+
+ return 0;
+}
+
+
+/* This error handler is used only while the X connection is being set up;
+ after we've got a connection, we don't use this handler again. The only
+ reason for having this is so that we can present a more idiot-proof error
+ message than "cannot open display."
+ */
+static void
+startup_ehandler (String name, String type, String class,
+ String defalt, /* one can't even spel properly
+ in this joke of a language */
+ String *av, Cardinal *ac)
+{
+ char fmt[512];
+ String p[10];
+ saver_info *si = global_si_kludge; /* I hate C so much... */
+ XrmDatabase *db = XtAppGetErrorDatabase(si->app);
+ *fmt = 0;
+ XtAppGetErrorDatabaseText(si->app, name, type, class, defalt,
+ fmt, sizeof(fmt)-1, *db);
+
+ fprintf (stderr, "%s: ", blurb());
+
+ memset (p, 0, sizeof(p));
+ if (*ac > countof (p)) *ac = countof (p);
+ memcpy ((char *) p, (char *) av, (*ac) * sizeof(*av));
+ fprintf (stderr, fmt, /* Did I mention that I hate C? */
+ p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9]);
+ fprintf (stderr, "\n");
+
+ describe_uids (si, stderr);
+
+ if (si->orig_uid && !strncmp (si->orig_uid, "root/", 5))
+ {
+ fprintf (stderr, "\n"
+ "%s: This is probably because you're logging in as root. You\n"
+" shouldn't log in as root: you should log in as a normal user,\n"
+" and then `su' as needed. If you insist on logging in as\n"
+" root, you will have to turn off X's security features before\n"
+" xscreensaver will work.\n"
+ "\n"
+" Please read the manual and FAQ for more information:\n",
+ blurb());
+ }
+ else
+ {
+ fprintf (stderr, "\n"
+ "%s: Errors at startup are usually authorization problems.\n"
+" But you're not logging in as root (good!) so something\n"
+" else must be wrong. Did you read the manual and the FAQ?\n",
+ blurb());
+ }
+
+ fprintf (stderr, "\n"
+ " https://www.jwz.org/xscreensaver/faq.html\n"
+ " https://www.jwz.org/xscreensaver/man.html\n"
+ "\n");
+
+ fflush (stderr);
+ fflush (stdout);
+ exit (1);
+}
+
+
+/* The zillions of initializations.
+ */
+
+/* Set progname, version, etc. This is done very early.
+ */
+static void
+set_version_string (saver_info *si, int *argc, char **argv)
+{
+ progclass = "XScreenSaver";
+
+ /* progname is reset later, after we connect to X. */
+ progname = strrchr(argv[0], '/');
+ if (progname) progname++;
+ else progname = argv[0];
+
+ if (strlen(progname) > 100) /* keep it short. */
+ progname[99] = 0;
+
+ /* The X resource database blows up if argv[0] has a "." in it. */
+ {
+ char *s = argv[0];
+ while ((s = strchr (s, '.')))
+ *s = '_';
+ }
+
+ si->version = (char *) malloc (32);
+ memcpy (si->version, screensaver_id + 17, 4);
+ si->version [4] = 0;
+}
+
+
+/* Initializations that potentially take place as a priveleged user:
+ If the xscreensaver executable is setuid root, then these initializations
+ are run as root, before discarding privileges.
+ */
+static void
+privileged_initialization (saver_info *si, int *argc, char **argv)
+{
+#ifndef NO_LOCKING
+ /* before hack_uid() for proper permissions */
+ lock_priv_init (*argc, argv, si->prefs.verbose_p);
+#endif /* NO_LOCKING */
+
+ hack_uid (si);
+}
+
+
+/* Figure out what locking mechanisms are supported.
+ */
+static void
+lock_initialization (saver_info *si, int *argc, char **argv)
+{
+#ifdef NO_LOCKING
+ si->locking_disabled_p = True;
+ si->nolock_reason = "not compiled with locking support";
+#else /* !NO_LOCKING */
+
+ /* Finish initializing locking, now that we're out of privileged code. */
+ if (! lock_init (*argc, argv, si->prefs.verbose_p))
+ {
+ si->locking_disabled_p = True;
+ si->nolock_reason = "error getting password";
+ }
+
+ /* If locking is currently enabled, but the environment indicates that
+ we have been launched as GDM's "Background" program, then disable
+ locking just in case.
+ */
+ if (!si->locking_disabled_p && getenv ("RUNNING_UNDER_GDM"))
+ {
+ si->locking_disabled_p = True;
+ si->nolock_reason = "running under GDM";
+ }
+
+ /* If the server is XDarwin (MacOS X) then disable locking.
+ (X grabs only affect X programs, so you can use Command-Tab
+ to bring any other Mac program to the front, e.g., Terminal.)
+ */
+ if (!si->locking_disabled_p)
+ {
+ int op = 0, event = 0, error = 0;
+ Bool macos_p = False;
+
+#ifdef __APPLE__
+ /* Disable locking if *running* on Apple hardware, since we have no
+ reliable way to determine whether the server is running on MacOS.
+ Hopefully __APPLE__ means "MacOS" and not "Linux on Mac hardware"
+ but I'm not really sure about that.
+ */
+ macos_p = True;
+#endif
+
+ if (!macos_p)
+ /* This extension exists on the Apple X11 server, but not
+ on earlier versions of the XDarwin server. */
+ macos_p = XQueryExtension (si->dpy, "Apple-DRI", &op, &event, &error);
+
+ if (macos_p)
+ {
+ si->locking_disabled_p = True;
+ si->nolock_reason = "Cannot lock securely on MacOS X";
+ }
+ }
+
+ /* Like MacOS, locking under Wayland's embedded X11 server does not work.
+ (X11 grabs don't work because the Wayland window manager lives at a
+ higher level than the X11 emulation layer.)
+ */
+ if (!si->locking_disabled_p && getenv ("WAYLAND_DISPLAY"))
+ {
+ si->locking_disabled_p = True;
+ si->nolock_reason = "Cannot lock securely under Wayland";
+ }
+
+ if (si->prefs.debug_p) /* But allow locking anyway in debug mode. */
+ si->locking_disabled_p = False;
+
+#endif /* NO_LOCKING */
+}
+
+
+/* Open the connection to the X server, and intern our Atoms.
+ */
+static Widget
+connect_to_server (saver_info *si, int *argc, char **argv)
+{
+ Widget toplevel_shell;
+
+#ifdef HAVE_PUTENV
+ char *d = getenv ("DISPLAY");
+ if (!d || !*d)
+ {
+ char *ndpy = strdup("DISPLAY=:0.0");
+ /* if (si->prefs.verbose_p) */ /* sigh, too early to test this... */
+ fprintf (stderr,
+ "%s: warning: $DISPLAY is not set: defaulting to \"%s\".\n",
+ blurb(), ndpy+8);
+ if (putenv (ndpy))
+ abort ();
+ /* don't free (ndpy) -- some implementations of putenv (BSD 4.4,
+ glibc 2.0) copy the argument, but some (libc4,5, glibc 2.1.2)
+ do not. So we must leak it (and/or the previous setting). Yay.
+ */
+ }
+#endif /* HAVE_PUTENV */
+
+ XSetErrorHandler (saver_ehandler);
+
+ XtAppSetErrorMsgHandler (si->app, startup_ehandler);
+ toplevel_shell = XtAppInitialize (&si->app, progclass,
+ options, XtNumber (options),
+ argc, argv, defaults, 0, 0);
+ XtAppSetErrorMsgHandler (si->app, 0);
+
+ si->dpy = XtDisplay (toplevel_shell);
+ si->prefs.db = XtDatabase (si->dpy);
+ XtGetApplicationNameAndClass (si->dpy, &progname, &progclass);
+
+ if(strlen(progname) > 100) /* keep it short. */
+ progname [99] = 0;
+
+ db = si->prefs.db; /* resources.c needs this */
+
+ XA_VROOT = XInternAtom (si->dpy, "__SWM_VROOT", False);
+ XA_SCREENSAVER = XInternAtom (si->dpy, "SCREENSAVER", False);
+ XA_SCREENSAVER_VERSION = XInternAtom (si->dpy, "_SCREENSAVER_VERSION",False);
+ XA_SCREENSAVER_ID = XInternAtom (si->dpy, "_SCREENSAVER_ID", False);
+ XA_SCREENSAVER_STATUS = XInternAtom (si->dpy, "_SCREENSAVER_STATUS", False);
+ XA_SCREENSAVER_RESPONSE = XInternAtom (si->dpy, "_SCREENSAVER_RESPONSE",
+ False);
+ XA_XSETROOT_ID = XInternAtom (si->dpy, "_XSETROOT_ID", False);
+ XA_ESETROOT_PMAP_ID = XInternAtom (si->dpy, "ESETROOT_PMAP_ID", False);
+ XA_XROOTPMAP_ID = XInternAtom (si->dpy, "_XROOTPMAP_ID", False);
+ XA_NET_WM_USER_TIME = XInternAtom (si->dpy, "_NET_WM_USER_TIME", False);
+ XA_ACTIVATE = XInternAtom (si->dpy, "ACTIVATE", False);
+ XA_DEACTIVATE = XInternAtom (si->dpy, "DEACTIVATE", False);
+ XA_RESTART = XInternAtom (si->dpy, "RESTART", False);
+ XA_CYCLE = XInternAtom (si->dpy, "CYCLE", False);
+ XA_NEXT = XInternAtom (si->dpy, "NEXT", False);
+ XA_PREV = XInternAtom (si->dpy, "PREV", False);
+ XA_SELECT = XInternAtom (si->dpy, "SELECT", False);
+ XA_EXIT = XInternAtom (si->dpy, "EXIT", False);
+ XA_DEMO = XInternAtom (si->dpy, "DEMO", False);
+ XA_PREFS = XInternAtom (si->dpy, "PREFS", False);
+ XA_LOCK = XInternAtom (si->dpy, "LOCK", False);
+ XA_BLANK = XInternAtom (si->dpy, "BLANK", False);
+ XA_THROTTLE = XInternAtom (si->dpy, "THROTTLE", False);
+ XA_UNTHROTTLE = XInternAtom (si->dpy, "UNTHROTTLE", False);
+
+ return toplevel_shell;
+}
+
+
+/* Handle the command-line arguments that were not handled for us by Xt.
+ Issue an error message and exit if there are unknown options.
+ */
+static void
+process_command_line (saver_info *si, int *argc, char **argv)
+{
+ int i;
+ for (i = 1; i < *argc; i++)
+ {
+ if (!strcmp (argv[i], "-debug"))
+ /* no resource for this one, out of paranoia. */
+ si->prefs.debug_p = True;
+
+ else if (!strcmp (argv[i], "-h") ||
+ !strcmp (argv[i], "-help") ||
+ !strcmp (argv[i], "--help"))
+ do_help (si);
+
+ else
+ {
+ const char *s = argv[i];
+ fprintf (stderr, "%s: unknown option \"%s\". Try \"-help\".\n",
+ blurb(), s);
+
+ if (s[0] == '-' && s[1] == '-') s++;
+ if (!strcmp (s, "-activate") ||
+ !strcmp (s, "-deactivate") ||
+ !strcmp (s, "-cycle") ||
+ !strcmp (s, "-next") ||
+ !strcmp (s, "-prev") ||
+ !strcmp (s, "-exit") ||
+ !strcmp (s, "-restart") ||
+ !strcmp (s, "-demo") ||
+ !strcmp (s, "-prefs") ||
+ !strcmp (s, "-preferences") ||
+ !strcmp (s, "-lock") ||
+ !strcmp (s, "-version") ||
+ !strcmp (s, "-time"))
+ {
+
+ if (!strcmp (s, "-demo") || !strcmp (s, "-prefs"))
+ fprintf (stderr, "\n\
+ Perhaps you meant to run the `xscreensaver-demo' program instead?\n");
+ else
+ fprintf (stderr, "\n\
+ However, `%s' is an option to the `xscreensaver-command' program.\n", s);
+
+ fprintf (stderr, "\
+ The `xscreensaver' program is a daemon that runs in the background.\n\
+ You control a running xscreensaver process by sending it messages\n\
+ with `xscreensaver-demo' or `xscreensaver-command'.\n\
+. See the man pages for details, or check the web page:\n\
+ https://www.jwz.org/xscreensaver/\n\n");
+ }
+
+ exit (1);
+ }
+ }
+}
+
+
+/* Print out the xscreensaver banner to the tty if applicable;
+ Issue any other warnings that are called for at this point.
+ */
+static void
+print_banner (saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+
+ char *s, year[5];
+ s = strchr (screensaver_id, '-');
+ s = strrchr (s, '-');
+ s++;
+ strncpy (year, s, 4);
+ year[4] = 0;
+
+ /* This resource gets set some time before the others, so that we know
+ whether to print the banner (and so that the banner gets printed before
+ any resource-database-related error messages.)
+ */
+ p->verbose_p = (p->debug_p ||
+ get_boolean_resource (si->dpy, "verbose", "Boolean"));
+
+ /* Ditto, for the locking_disabled_p message. */
+ p->lock_p = get_boolean_resource (si->dpy, "lock", "Boolean");
+
+ if (p->verbose_p)
+ fprintf (stderr,
+ "%s %s, copyright (c) 1991-%s "
+ "by Jamie Zawinski <jwz@jwz.org>.\n",
+ progname, si->version, year);
+
+ if (p->debug_p)
+ fprintf (stderr, "\n"
+ "%s: Warning: running in DEBUG MODE. Be afraid.\n"
+ "\n"
+ "\tNote that in debug mode, the xscreensaver window will only\n"
+ "\tcover the left half of the screen. (The idea is that you\n"
+ "\tcan still see debugging output in a shell, if you position\n"
+ "\tit on the right side of the screen.)\n"
+ "\n"
+ "\tDebug mode is NOT SECURE. Do not run with -debug in\n"
+ "\tuntrusted environments.\n"
+ "\n",
+ blurb());
+
+ if (p->verbose_p && senesculent_p ())
+ fprintf (stderr, "\n"
+ "*************************************"
+ "**************************************\n"
+ "%s: Warning: this version of xscreensaver is VERY OLD!\n"
+ "%s: Please upgrade! https://www.jwz.org/xscreensaver/\n"
+ "*************************************"
+ "**************************************\n"
+ "\n",
+ blurb(), blurb());
+
+ if (p->verbose_p)
+ {
+ if (!si->uid_message || !*si->uid_message)
+ describe_uids (si, stderr);
+ else
+ {
+ if (si->orig_uid && *si->orig_uid)
+ fprintf (stderr, "%s: initial effective uid/gid was %s.\n",
+ blurb(), si->orig_uid);
+ fprintf (stderr, "%s: %s\n", blurb(), si->uid_message);
+ }
+
+ fprintf (stderr, "%s: in process %lu.\n", blurb(),
+ (unsigned long) getpid());
+ }
+}
+
+static void
+print_lock_failure_banner (saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+
+ /* If locking was not able to be initalized for some reason, explain why.
+ (This has to be done after we've read the lock_p resource.)
+ */
+ if (si->locking_disabled_p)
+ {
+ p->lock_p = False;
+ fprintf (stderr, "%s: locking is disabled (%s).\n", blurb(),
+ si->nolock_reason);
+ if (strstr (si->nolock_reason, "passw"))
+ fprintf (stderr, "%s: does xscreensaver need to be setuid? "
+ "consult the manual.\n", blurb());
+ else if (strstr (si->nolock_reason, "running as "))
+ fprintf (stderr,
+ "%s: locking only works when xscreensaver is launched\n"
+ "\t by a normal, non-privileged user (e.g., not \"root\".)\n"
+ "\t See the manual for details.\n",
+ blurb());
+ }
+
+}
+
+
+/* called from screens.c so that all the Xt crud is here. */
+void
+initialize_screen_root_widget (saver_screen_info *ssi)
+{
+ saver_info *si = ssi->global;
+ if (ssi->toplevel_shell)
+ XtDestroyWidget (ssi->toplevel_shell);
+ ssi->toplevel_shell =
+ XtVaAppCreateShell (progname, progclass,
+ applicationShellWidgetClass,
+ si->dpy,
+ XtNscreen, ssi->screen,
+ XtNvisual, ssi->current_visual,
+ XtNdepth, visual_depth (ssi->screen,
+ ssi->current_visual),
+ NULL);
+}
+
+
+/* Examine all of the display's screens, and populate the `saver_screen_info'
+ structures. Make sure this is called after hack_environment() sets $PATH.
+ */
+static void
+initialize_per_screen_info (saver_info *si, Widget toplevel_shell)
+{
+ int i;
+
+ update_screen_layout (si);
+
+ /* Check to see whether fading is ever possible -- if any of the
+ screens on the display has a PseudoColor visual, then fading can
+ work (on at least some screens.) If no screen has a PseudoColor
+ visual, then don't bother ever trying to fade, because it will
+ just cause a delay without causing any visible effect.
+ */
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ if (has_writable_cells (ssi->screen, ssi->current_visual) ||
+ get_visual (ssi->screen, "PseudoColor", True, False) ||
+ get_visual (ssi->screen, "GrayScale", True, False))
+ {
+ si->fading_possible_p = True;
+ break;
+ }
+ }
+
+#ifdef HAVE_XF86VMODE_GAMMA
+ si->fading_possible_p = True; /* if we can gamma fade, go for it */
+#endif
+}
+
+
+/* If any server extensions have been requested, try and initialize them.
+ Issue warnings if requests can't be honored.
+ */
+static void
+initialize_server_extensions (saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+
+ Bool server_has_xidle_extension_p = False;
+ Bool server_has_sgi_saver_extension_p = False;
+ Bool server_has_mit_saver_extension_p = False;
+ Bool system_has_proc_interrupts_p = False;
+ Bool server_has_xinput_extension_p = False;
+ const char *piwhy = 0;
+
+ si->using_xidle_extension = p->use_xidle_extension;
+ si->using_sgi_saver_extension = p->use_sgi_saver_extension;
+ si->using_mit_saver_extension = p->use_mit_saver_extension;
+ si->using_proc_interrupts = p->use_proc_interrupts;
+ si->using_xinput_extension = p->use_xinput_extension;
+
+#ifdef HAVE_XIDLE_EXTENSION
+ {
+ int ev, er;
+ server_has_xidle_extension_p = XidleQueryExtension (si->dpy, &ev, &er);
+ }
+#endif
+#ifdef HAVE_SGI_SAVER_EXTENSION
+ server_has_sgi_saver_extension_p =
+ XScreenSaverQueryExtension (si->dpy,
+ &si->sgi_saver_ext_event_number,
+ &si->sgi_saver_ext_error_number);
+#endif
+#ifdef HAVE_MIT_SAVER_EXTENSION
+ server_has_mit_saver_extension_p =
+ XScreenSaverQueryExtension (si->dpy,
+ &si->mit_saver_ext_event_number,
+ &si->mit_saver_ext_error_number);
+#endif
+#ifdef HAVE_PROC_INTERRUPTS
+ system_has_proc_interrupts_p = query_proc_interrupts_available (si, &piwhy);
+#endif
+
+#ifdef HAVE_XINPUT
+ server_has_xinput_extension_p = query_xinput_extension (si);
+#endif
+
+ if (!server_has_xidle_extension_p)
+ si->using_xidle_extension = False;
+ else if (p->verbose_p)
+ {
+ if (si->using_xidle_extension)
+ fprintf (stderr, "%s: using XIDLE extension.\n", blurb());
+ else
+ fprintf (stderr, "%s: not using server's XIDLE extension.\n", blurb());
+ }
+
+ if (!server_has_sgi_saver_extension_p)
+ si->using_sgi_saver_extension = False;
+ else if (p->verbose_p)
+ {
+ if (si->using_sgi_saver_extension)
+ fprintf (stderr, "%s: using SGI SCREEN_SAVER extension.\n", blurb());
+ else
+ fprintf (stderr,
+ "%s: not using server's SGI SCREEN_SAVER extension.\n",
+ blurb());
+ }
+
+ if (!server_has_mit_saver_extension_p)
+ si->using_mit_saver_extension = False;
+ else if (p->verbose_p)
+ {
+ if (si->using_mit_saver_extension)
+ fprintf (stderr, "%s: using lame MIT-SCREEN-SAVER extension.\n",
+ blurb());
+ else
+ fprintf (stderr,
+ "%s: not using server's lame MIT-SCREEN-SAVER extension.\n",
+ blurb());
+ }
+
+#ifdef HAVE_RANDR
+ if (XRRQueryExtension (si->dpy,
+ &si->randr_event_number, &si->randr_error_number))
+ {
+ int nscreens = ScreenCount (si->dpy); /* number of *real* screens */
+ int i;
+
+ si->using_randr_extension = TRUE;
+
+ if (p->verbose_p)
+ fprintf (stderr, "%s: selecting RANDR events\n", blurb());
+ for (i = 0; i < nscreens; i++)
+# ifdef RRScreenChangeNotifyMask /* randr.h 1.5, 2002/09/29 */
+ XRRSelectInput (si->dpy, RootWindow (si->dpy, i),
+ RRScreenChangeNotifyMask);
+# else /* !RRScreenChangeNotifyMask */ /* Xrandr.h 1.4, 2001/06/07 */
+ XRRScreenChangeSelectInput (si->dpy, RootWindow (si->dpy, i), True);
+# endif /* !RRScreenChangeNotifyMask */
+ }
+# endif /* HAVE_RANDR */
+
+#ifdef HAVE_XINPUT
+ if (!server_has_xinput_extension_p)
+ si->using_xinput_extension = False;
+ else
+ {
+ if (si->using_xinput_extension)
+ init_xinput_extension(si);
+
+ if (p->verbose_p)
+ {
+ if (si->using_xinput_extension)
+ fprintf (stderr,
+ "%s: selecting events from %d XInputExtension devices.\n",
+ blurb(), si->num_xinput_devices);
+ else
+ fprintf (stderr,
+ "%s: not using XInputExtension.\n",
+ blurb());
+ }
+ }
+#endif
+
+ if (!system_has_proc_interrupts_p)
+ {
+ si->using_proc_interrupts = False;
+ if (p->verbose_p && piwhy)
+ fprintf (stderr, "%s: not using /proc/interrupts: %s.\n", blurb(),
+ piwhy);
+ }
+ else if (p->verbose_p)
+ {
+ if (si->using_proc_interrupts)
+ fprintf (stderr,
+ "%s: consulting /proc/interrupts for keyboard activity.\n",
+ blurb());
+ else
+ fprintf (stderr,
+ "%s: not consulting /proc/interrupts for keyboard activity.\n",
+ blurb());
+ }
+}
+
+
+#ifdef DEBUG_MULTISCREEN
+static void
+debug_multiscreen_timer (XtPointer closure, XtIntervalId *id)
+{
+ saver_info *si = (saver_info *) closure;
+ saver_preferences *p = &si->prefs;
+ if (update_screen_layout (si))
+ {
+ if (p->verbose_p)
+ {
+ fprintf (stderr, "%s: new layout:\n", blurb());
+ describe_monitor_layout (si);
+ }
+ resize_screensaver_window (si);
+ }
+ XtAppAddTimeOut (si->app, 1000*4, debug_multiscreen_timer, (XtPointer) si);
+}
+#endif /* DEBUG_MULTISCREEN */
+
+
+/* For the case where we aren't using an server extensions, select user events
+ on all the existing windows, and launch timers to select events on
+ newly-created windows as well.
+
+ If a server extension is being used, this does nothing.
+ */
+static void
+select_events (saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+ int i;
+
+ if (si->using_xidle_extension ||
+ si->using_mit_saver_extension ||
+ si->using_sgi_saver_extension)
+ return;
+
+ if (p->initial_delay)
+ {
+ if (p->verbose_p)
+ {
+ fprintf (stderr, "%s: waiting for %d second%s...", blurb(),
+ (int) p->initial_delay/1000,
+ (p->initial_delay == 1000 ? "" : "s"));
+ fflush (stderr);
+ fflush (stdout);
+ }
+ usleep (p->initial_delay);
+ if (p->verbose_p)
+ fprintf (stderr, " done.\n");
+ }
+
+ if (p->verbose_p)
+ {
+ fprintf (stderr, "%s: selecting events on extant windows...", blurb());
+ fflush (stderr);
+ fflush (stdout);
+ }
+
+ /* Select events on the root windows of every screen. This also selects
+ for window creation events, so that new subwindows will be noticed.
+ */
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ if (ssi->real_screen_p)
+ start_notice_events_timer (si,
+ RootWindowOfScreen (si->screens[i].screen), False);
+ }
+
+ if (p->verbose_p)
+ fprintf (stderr, " done.\n");
+
+# ifdef DEBUG_MULTISCREEN
+ if (p->debug_p) debug_multiscreen_timer ((XtPointer) si, 0);
+# endif
+}
+
+
+void
+maybe_reload_init_file (saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+ if (init_file_changed_p (p))
+ {
+ if (p->verbose_p)
+ fprintf (stderr, "%s: file \"%s\" has changed, reloading.\n",
+ blurb(), init_file_name());
+
+ load_init_file (si->dpy, p);
+
+ /* If a server extension is in use, and p->timeout has changed,
+ we need to inform the server of the new timeout. */
+ disable_builtin_screensaver (si, False);
+
+ /* If the DPMS settings in the init file have changed,
+ change the settings on the server to match. */
+ sync_server_dpms_settings (si->dpy,
+ (p->dpms_enabled_p &&
+ p->mode != DONT_BLANK),
+ p->dpms_quickoff_p,
+ p->dpms_standby / 1000,
+ p->dpms_suspend / 1000,
+ p->dpms_off / 1000,
+ False);
+ }
+}
+
+
+/* Loop forever:
+
+ - wait until the user is idle;
+ - blank the screen;
+ - wait until the user is active;
+ - unblank the screen;
+ - repeat.
+
+ */
+static void
+main_loop (saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+ Bool ok_to_unblank;
+ int i;
+
+ while (1)
+ {
+ Bool was_locked = False;
+
+ if (p->verbose_p)
+ fprintf (stderr, "%s: awaiting idleness.\n", blurb());
+
+ check_for_leaks ("unblanked A");
+ sleep_until_idle (si, True);
+ check_for_leaks ("unblanked B");
+
+ if (p->verbose_p)
+ {
+ if (si->demoing_p)
+ fprintf (stderr, "%s: demoing %d at %s.\n", blurb(),
+ si->selection_mode, timestring(0));
+ else
+ fprintf (stderr, "%s: blanking screen at %s.\n", blurb(),
+ timestring(0));
+ }
+
+ maybe_reload_init_file (si);
+
+ if (p->mode == DONT_BLANK)
+ {
+ if (p->verbose_p)
+ fprintf (stderr, "%s: idle with blanking disabled at %s.\n",
+ blurb(), timestring(0));
+
+ /* Go around the loop and wait for the next bout of idleness,
+ or for the init file to change, or for a remote command to
+ come in, or something.
+
+ But, if locked_p is true, go ahead. This can only happen
+ if we're in "disabled" mode but a "lock" clientmessage came
+ in: in that case, we should go ahead and blank/lock the screen.
+ */
+ if (!si->locked_p)
+ continue;
+ }
+
+ /* Since we're about to blank the screen, kill the de-race timer,
+ if any. It might still be running if we have unblanked and then
+ re-blanked in a short period (e.g., when using the "next" button
+ in xscreensaver-demo.)
+ */
+ if (si->de_race_id)
+ {
+ if (p->verbose_p)
+ fprintf (stderr, "%s: stopping de-race timer (%d remaining.)\n",
+ blurb(), si->de_race_ticks);
+ XtRemoveTimeOut (si->de_race_id);
+ si->de_race_id = 0;
+ }
+
+
+ /* Now, try to blank.
+ */
+
+ if (! blank_screen (si))
+ {
+ /* We were unable to grab either the keyboard or mouse.
+ This means we did not (and must not) blank the screen.
+ If we were to blank the screen while some other program
+ is holding both the mouse and keyboard grabbed, then
+ we would never be able to un-blank it! We would never
+ see any events, and the display would be wedged.
+
+ In particular, without that keyboard grab, we will be
+ unable to ever read keypresses on the unlock dialog.
+ You can't unlock if you can't type your password.
+
+ So, just go around the loop again and wait for the
+ next bout of idleness. (If the user remains idle, we
+ will next try to blank the screen again in no more than
+ 60 seconds.)
+ */
+ Time retry = 60 * 1000;
+ if (p->timeout < retry)
+ retry = p->timeout;
+
+ if (p->debug_p)
+ {
+ fprintf (stderr,
+ "%s: DEBUG MODE: unable to grab -- BLANKING ANYWAY.\n",
+ blurb());
+ }
+ else
+ {
+ fprintf (stderr,
+ "%s: unable to grab keyboard or mouse! Blanking aborted.\n",
+ blurb());
+
+ /* Since we were unable to blank, clearly we're not locked,
+ but we might have been prematurely marked as locked by
+ the LOCK ClientMessage. */
+ if (si->locked_p)
+ set_locked_p (si, False);
+
+ schedule_wakeup_event (si, retry, p->debug_p);
+ continue;
+ }
+ }
+
+ for (i = 0; i < si->nscreens; i++)
+ kill_screenhack (&si->screens[i]);
+
+ raise_window (si, True, True, False);
+ if (si->throttled_p)
+ fprintf (stderr, "%s: not launching hack (throttled.)\n", blurb());
+ else
+ for (i = 0; i < si->nscreens; i++)
+ spawn_screenhack (&si->screens[i]);
+
+ /* If we are blanking only, optionally power down monitor right now. */
+ if (p->mode == BLANK_ONLY &&
+ p->dpms_enabled_p &&
+ p->dpms_quickoff_p)
+ {
+ sync_server_dpms_settings (si->dpy, True,
+ p->dpms_quickoff_p,
+ p->dpms_standby / 1000,
+ p->dpms_suspend / 1000,
+ p->dpms_off / 1000,
+ False);
+ monitor_power_on (si, False);
+ }
+
+ /* Don't start the cycle timer in demo mode. */
+ if (!si->demoing_p && p->cycle)
+ si->cycle_id = XtAppAddTimeOut (si->app,
+ (si->selection_mode
+ /* see comment in cycle_timer() */
+ ? 1000 * 60 * 60
+ : p->cycle),
+ cycle_timer,
+ (XtPointer) si);
+
+
+#ifndef NO_LOCKING
+ /* Maybe start locking the screen.
+ */
+ {
+ Time lock_timeout = p->lock_timeout;
+
+ if (si->emergency_lock_p && p->lock_p && lock_timeout)
+ {
+ int secs = p->lock_timeout / 1000;
+ if (p->verbose_p)
+ fprintf (stderr,
+ "%s: locking now, instead of waiting for %d:%02d:%02d.\n",
+ blurb(),
+ (secs / (60 * 60)), ((secs / 60) % 60), (secs % 60));
+ lock_timeout = 0;
+ }
+
+ si->emergency_lock_p = False;
+
+ if (!si->demoing_p && /* if not going into demo mode */
+ p->lock_p && /* and locking is enabled */
+ !si->locking_disabled_p && /* and locking is possible */
+ lock_timeout == 0) /* and locking is not timer-deferred */
+ set_locked_p (si, True); /* then lock right now. */
+
+ /* locked_p might be true already because of the above, or because of
+ the LOCK ClientMessage. But if not, and if we're supposed to lock
+ after some time, set up a timer to do so.
+ */
+ if (p->lock_p &&
+ !si->locked_p &&
+ lock_timeout > 0)
+ si->lock_id = XtAppAddTimeOut (si->app, lock_timeout,
+ activate_lock_timer,
+ (XtPointer) si);
+ }
+#endif /* !NO_LOCKING */
+
+
+ ok_to_unblank = True;
+ do {
+
+ check_for_leaks ("blanked A");
+ sleep_until_idle (si, False); /* until not idle */
+ check_for_leaks ("blanked B");
+
+ maybe_reload_init_file (si);
+
+#ifndef NO_LOCKING
+ /* Maybe unlock the screen.
+ */
+ if (si->locked_p)
+ {
+ saver_screen_info *ssi = si->default_screen;
+ if (si->locking_disabled_p) abort ();
+
+ was_locked = True;
+ si->dbox_up_p = True;
+ for (i = 0; i < si->nscreens; i++)
+ suspend_screenhack (&si->screens[i], True); /* suspend */
+ XUndefineCursor (si->dpy, ssi->screensaver_window);
+
+ ok_to_unblank = unlock_p (si);
+
+ si->dbox_up_p = False;
+ XDefineCursor (si->dpy, ssi->screensaver_window, ssi->cursor);
+ for (i = 0; i < si->nscreens; i++)
+ suspend_screenhack (&si->screens[i], False); /* resume */
+
+ if (!ok_to_unblank &&
+ !screenhack_running_p (si))
+ {
+ /* If the lock dialog has been dismissed and we're not about to
+ unlock the screen, and there is currently no hack running,
+ then launch one. (There might be no hack running if DPMS
+ had kicked in. But DPMS is off now, so bring back the hack)
+ */
+ if (si->cycle_id)
+ XtRemoveTimeOut (si->cycle_id);
+ si->cycle_id = 0;
+ cycle_timer ((XtPointer) si, 0);
+ }
+ }
+#endif /* !NO_LOCKING */
+
+ } while (!ok_to_unblank);
+
+
+ if (p->verbose_p)
+ fprintf (stderr, "%s: unblanking screen at %s.\n",
+ blurb(), timestring (0));
+
+ /* Kill before unblanking, to stop drawing as soon as possible. */
+ for (i = 0; i < si->nscreens; i++)
+ kill_screenhack (&si->screens[i]);
+ unblank_screen (si);
+
+ set_locked_p (si, False);
+ si->emergency_lock_p = False;
+ si->demoing_p = 0;
+ si->selection_mode = 0;
+
+ /* If we're throttled, and the user has explicitly unlocked the screen,
+ then unthrottle. If we weren't locked, then don't unthrottle
+ automatically, because someone might have just bumped the desk... */
+ if (was_locked)
+ {
+ if (si->throttled_p && p->verbose_p)
+ fprintf (stderr, "%s: unthrottled.\n", blurb());
+ si->throttled_p = False;
+ }
+
+ if (si->cycle_id)
+ {
+ XtRemoveTimeOut (si->cycle_id);
+ si->cycle_id = 0;
+ }
+
+ if (si->lock_id)
+ {
+ XtRemoveTimeOut (si->lock_id);
+ si->lock_id = 0;
+ }
+
+ /* Since we're unblanked now, break race conditions and make
+ sure we stay that way (see comment in timers.c.) */
+ if (! si->de_race_id)
+ de_race_timer ((XtPointer) si, 0);
+ }
+}
+
+static void analyze_display (saver_info *si);
+static void fix_fds (void);
+
+int
+main (int argc, char **argv)
+{
+ Widget shell;
+ saver_info the_si;
+ saver_info *si = &the_si;
+ saver_preferences *p = &si->prefs;
+ struct passwd *spasswd;
+ int i;
+
+ /* It turns out that if we do setlocale (LC_ALL, "") here, people
+ running in Japanese locales get font craziness on the password
+ dialog, presumably because it is displaying Japanese characters
+ in a non-Japanese font. However, if we don't call setlocale()
+ at all, then XLookupString() never returns multi-byte UTF-8
+ characters when people type non-Latin1 characters on the
+ keyboard.
+
+ The current theory (and at this point, I'm really guessing!) is
+ that using LC_CTYPE instead of LC_ALL will make XLookupString()
+ behave usefully, without having the side-effect of screwing up
+ the fonts on the unlock dialog.
+
+ See https://bugs.launchpad.net/ubuntu/+source/xscreensaver/+bug/671923
+ from comment #20 onward.
+
+ -- jwz, 24-Sep-2011
+ */
+#ifdef ENABLE_NLS
+ if (!setlocale (LC_CTYPE, ""))
+ fprintf (stderr, "%s: warning: could not set default locale\n",
+ progname);
+
+ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
+ textdomain (GETTEXT_PACKAGE);
+#endif /* ENABLE_NLS */
+
+ memset(si, 0, sizeof(*si));
+ global_si_kludge = si; /* I hate C so much... */
+
+ fix_fds();
+
+# undef ya_rand_init
+ ya_rand_init (0);
+
+ save_argv (argc, argv);
+ set_version_string (si, &argc, argv);
+ privileged_initialization (si, &argc, argv);
+ hack_environment (si);
+
+ spasswd = getpwuid(getuid());
+ if (!spasswd)
+ {
+ fprintf(stderr, "Could not figure out who the current user is!\n");
+ return 1;
+ }
+
+ si->user = strdup(spasswd->pw_name ? spasswd->pw_name : "(unknown)");
+
+# ifndef NO_LOCKING
+ si->unlock_cb = gui_auth_conv;
+ si->auth_finished_cb = auth_finished_cb;
+# endif /* !NO_LOCKING */
+
+ shell = connect_to_server (si, &argc, argv);
+ process_command_line (si, &argc, argv);
+ stderr_log_file (si);
+ print_banner (si);
+
+ load_init_file(si->dpy, p); /* must be before initialize_per_screen_info() */
+ blurb_timestamp_p = p->timestamp_p; /* kludge */
+ initialize_per_screen_info (si, shell); /* also sets si->fading_possible_p */
+
+ /* We can only issue this warning now. */
+ if (p->verbose_p && !si->fading_possible_p && (p->fade_p || p->unfade_p))
+ fprintf (stderr,
+ "%s: there are no PseudoColor or GrayScale visuals.\n"
+ "%s: ignoring the request for fading/unfading.\n",
+ blurb(), blurb());
+
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ if (ssi->real_screen_p)
+ if (ensure_no_screensaver_running (si->dpy, si->screens[i].screen))
+ exit (1);
+ }
+
+ lock_initialization (si, &argc, argv);
+ print_lock_failure_banner (si);
+
+ if (p->xsync_p) XSynchronize (si->dpy, True);
+
+ if (p->verbose_p) analyze_display (si);
+ initialize_server_extensions (si);
+
+ si->blank_time = time ((time_t *) 0); /* must be before ..._window */
+ initialize_screensaver_window (si);
+
+ select_events (si);
+ init_sigchld ();
+
+ disable_builtin_screensaver (si, True);
+ sync_server_dpms_settings (si->dpy,
+ (p->dpms_enabled_p &&
+ p->mode != DONT_BLANK),
+ p->dpms_quickoff_p,
+ p->dpms_standby / 1000,
+ p->dpms_suspend / 1000,
+ p->dpms_off / 1000,
+ False);
+
+ initialize_stderr (si);
+ handle_signals (si);
+
+ make_splash_dialog (si);
+
+ main_loop (si); /* doesn't return */
+ return 0;
+}
+
+static void
+fix_fds (void)
+{
+ /* Bad Things Happen if stdin, stdout, and stderr have been closed
+ (as by the `sh incantation "xscreensaver >&- 2>&-"). When you do
+ that, the X connection gets allocated to one of these fds, and
+ then some random library writes to stderr, and random bits get
+ stuffed down the X pipe, causing "Xlib: sequence lost" errors.
+ So, we cause the first three file descriptors to be open to
+ /dev/null if they aren't open to something else already. This
+ must be done before any other files are opened (or the closing
+ of that other file will again free up one of the "magic" first
+ three FDs.)
+
+ We do this by opening /dev/null three times, and then closing
+ those fds, *unless* any of them got allocated as #0, #1, or #2,
+ in which case we leave them open. Gag.
+
+ Really, this crap is technically required of *every* X program,
+ if you want it to be robust in the face of "2>&-".
+ */
+ int fd0 = open ("/dev/null", O_RDWR);
+ int fd1 = open ("/dev/null", O_RDWR);
+ int fd2 = open ("/dev/null", O_RDWR);
+ if (fd0 > 2) close (fd0);
+ if (fd1 > 2) close (fd1);
+ if (fd2 > 2) close (fd2);
+}
+
+
+
+/* Processing ClientMessage events.
+ */
+
+
+static Bool error_handler_hit_p = False;
+
+static int
+ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
+{
+ error_handler_hit_p = True;
+ return 0;
+}
+
+/* Sometimes some systems send us ClientMessage events with bogus atoms in
+ them. We only look up the atom names for printing warning messages,
+ so don't bomb out when it happens...
+ */
+static char *
+XGetAtomName_safe (Display *dpy, Atom atom)
+{
+ char *result;
+ XErrorHandler old_handler;
+ if (!atom) return 0;
+
+ XSync (dpy, False);
+ error_handler_hit_p = False;
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+ result = XGetAtomName (dpy, atom);
+ XSync (dpy, False);
+ XSetErrorHandler (old_handler);
+ XSync (dpy, False);
+ if (error_handler_hit_p) result = 0;
+
+ if (result)
+ return result;
+ else
+ {
+ char buf[100];
+ sprintf (buf, "<<undefined atom 0x%04X>>", (unsigned int) atom);
+ return strdup (buf);
+ }
+}
+
+
+static void
+clientmessage_response (saver_info *si, Window w, Bool error,
+ const char *stderr_msg,
+ const char *protocol_msg)
+{
+ char *proto;
+ int L;
+ saver_preferences *p = &si->prefs;
+ XErrorHandler old_handler;
+
+ if (error || p->verbose_p)
+ fprintf (stderr, "%s: %s\n", blurb(), stderr_msg);
+
+ L = strlen(protocol_msg);
+ proto = (char *) malloc (L + 2);
+ proto[0] = (error ? '-' : '+');
+ strcpy (proto+1, protocol_msg);
+ L++;
+
+ /* Ignore all X errors while sending a response to a ClientMessage.
+ Pretty much the only way we could get an error here is if the
+ window we're trying to send the reply on has been deleted, in
+ which case, the sender of the ClientMessage won't see our response
+ anyway.
+ */
+ XSync (si->dpy, False);
+ error_handler_hit_p = False;
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+
+ XChangeProperty (si->dpy, w, XA_SCREENSAVER_RESPONSE, XA_STRING, 8,
+ PropModeReplace, (unsigned char *) proto, L);
+
+ XSync (si->dpy, False);
+ XSetErrorHandler (old_handler);
+ XSync (si->dpy, False);
+
+ free (proto);
+}
+
+
+static void
+bogus_clientmessage_warning (saver_info *si, XEvent *event)
+{
+#if 0 /* Oh, fuck it. GNOME likes to spew random ClientMessages at us
+ all the time. This is presumably indicative of an error in
+ the sender of that ClientMessage: if we're getting it and
+ ignoring it, then it's not reaching the intended recipient.
+ But people complain to me about this all the time ("waaah!
+ xscreensaver is printing to it's stderr and that gets my
+ panties all in a bunch!") And I'm sick of hearing about it.
+ So we'll just ignore these messages and let GNOME go right
+ ahead and continue to stumble along in its malfunction.
+ */
+
+ saver_preferences *p = &si->prefs;
+ char *str = XGetAtomName_safe (si->dpy, event->xclient.message_type);
+ Window w = event->xclient.window;
+ char wdesc[255];
+ int screen = 0;
+ Bool root_p = False;
+
+ *wdesc = 0;
+ for (screen = 0; screen < si->nscreens; screen++)
+ if (w == si->screens[screen].screensaver_window)
+ {
+ strcpy (wdesc, "xscreensaver");
+ break;
+ }
+ else if (w == RootWindow (si->dpy, screen))
+ {
+ strcpy (wdesc, "root");
+ root_p = True;
+ break;
+ }
+
+ /* If this ClientMessage was sent to the real root window instead of to the
+ xscreensaver window, then it might be intended for someone else who is
+ listening on the root window (e.g., the window manager). So only print
+ the warning if: we are in debug mode; or if the bogus message was
+ actually sent to one of the xscreensaver-created windows.
+ */
+ if (root_p && !p->debug_p)
+ return;
+
+ if (!*wdesc)
+ {
+ XErrorHandler old_handler;
+ XClassHint hint;
+ XWindowAttributes xgwa;
+ memset (&hint, 0, sizeof(hint));
+ memset (&xgwa, 0, sizeof(xgwa));
+
+ XSync (si->dpy, False);
+ old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+ XGetClassHint (si->dpy, w, &hint);
+ XGetWindowAttributes (si->dpy, w, &xgwa);
+ XSync (si->dpy, False);
+ XSetErrorHandler (old_handler);
+ XSync (si->dpy, False);
+
+ screen = (xgwa.screen ? screen_number (xgwa.screen) : -1);
+
+ sprintf (wdesc, "%.20s / %.20s",
+ (hint.res_name ? hint.res_name : "(null)"),
+ (hint.res_class ? hint.res_class : "(null)"));
+ if (hint.res_name) XFree (hint.res_name);
+ if (hint.res_class) XFree (hint.res_class);
+ }
+
+ fprintf (stderr, "%s: %d: unrecognised ClientMessage \"%s\" received\n",
+ blurb(), screen, (str ? str : "(null)"));
+ fprintf (stderr, "%s: %d: for window 0x%lx (%s)\n",
+ blurb(), screen, (unsigned long) w, wdesc);
+ if (str) XFree (str);
+
+#endif /* 0 */
+}
+
+
+Bool
+handle_clientmessage (saver_info *si, XEvent *event, Bool until_idle_p)
+{
+ saver_preferences *p = &si->prefs;
+ Atom type = 0;
+ Window window = event->xclient.window;
+
+ /* Preferences might affect our handling of client messages. */
+ maybe_reload_init_file (si);
+
+ if (event->xclient.message_type != XA_SCREENSAVER ||
+ event->xclient.format != 32)
+ {
+ bogus_clientmessage_warning (si, event);
+ return False;
+ }
+
+ type = event->xclient.data.l[0];
+ if (type == XA_ACTIVATE)
+ {
+ if (until_idle_p)
+ {
+ if (p->mode == DONT_BLANK)
+ {
+ clientmessage_response(si, window, True,
+ "ACTIVATE ClientMessage received in DONT_BLANK mode.",
+ "screen blanking is currently disabled.");
+ return False;
+ }
+
+ clientmessage_response(si, window, False,
+ "ACTIVATE ClientMessage received.",
+ "activating.");
+ si->selection_mode = 0;
+ si->demoing_p = False;
+
+ if (si->throttled_p && p->verbose_p)
+ fprintf (stderr, "%s: unthrottled.\n", blurb());
+ si->throttled_p = False;
+
+ if (si->using_mit_saver_extension || si->using_sgi_saver_extension)
+ {
+ XForceScreenSaver (si->dpy, ScreenSaverActive);
+ return False;
+ }
+ else
+ {
+ return True;
+ }
+ }
+ clientmessage_response(si, window, True,
+ "ClientMessage ACTIVATE received while already active.",
+ "already active.");
+ }
+ else if (type == XA_DEACTIVATE)
+ {
+# if 0
+ /* When -deactivate is received while locked, pop up the dialog box
+ instead of just ignoring it. Some people depend on this behavior
+ to be able to unlock by using e.g. a fingerprint reader without
+ also having to click the mouse first.
+ */
+ if (si->locked_p)
+ {
+ clientmessage_response(si, window, False,
+ "DEACTIVATE ClientMessage received while locked: ignored.",
+ "screen is locked.");
+ }
+ else
+# endif /* 0 */
+ {
+ if (! until_idle_p)
+ {
+ if (si->throttled_p && p->verbose_p)
+ fprintf (stderr, "%s: unthrottled.\n", blurb());
+ si->throttled_p = False;
+
+ clientmessage_response(si, window, False,
+ "DEACTIVATE ClientMessage received.",
+ "deactivating.");
+ if (si->using_mit_saver_extension ||
+ si->using_sgi_saver_extension)
+ {
+ XForceScreenSaver (si->dpy, ScreenSaverReset);
+ return False;
+ }
+ else
+ {
+ return True;
+ }
+ }
+ clientmessage_response(si, window, False,
+ "ClientMessage DEACTIVATE received while inactive: "
+ "resetting idle timer.",
+ "not active: idle timer reset.");
+ reset_timers (si);
+ }
+ }
+ else if (type == XA_CYCLE)
+ {
+ if (! until_idle_p)
+ {
+ clientmessage_response(si, window, False,
+ "CYCLE ClientMessage received.",
+ "cycling.");
+ si->selection_mode = 0; /* 0 means randomize when its time. */
+ si->demoing_p = False;
+
+ if (si->throttled_p && p->verbose_p)
+ fprintf (stderr, "%s: unthrottled.\n", blurb());
+ si->throttled_p = False;
+
+ if (si->cycle_id)
+ XtRemoveTimeOut (si->cycle_id);
+ si->cycle_id = 0;
+ cycle_timer ((XtPointer) si, 0);
+ return False;
+ }
+ clientmessage_response(si, window, True,
+ "ClientMessage CYCLE received while inactive.",
+ "not active.");
+ }
+ else if (type == XA_NEXT || type == XA_PREV)
+ {
+ clientmessage_response(si, window, False,
+ (type == XA_NEXT
+ ? "NEXT ClientMessage received."
+ : "PREV ClientMessage received."),
+ "cycling.");
+ si->selection_mode = (type == XA_NEXT ? -1 : -2);
+ si->demoing_p = False;
+
+ if (si->throttled_p && p->verbose_p)
+ fprintf (stderr, "%s: unthrottled.\n", blurb());
+ si->throttled_p = False;
+
+ if (! until_idle_p)
+ {
+ if (si->cycle_id)
+ XtRemoveTimeOut (si->cycle_id);
+ si->cycle_id = 0;
+ cycle_timer ((XtPointer) si, 0);
+ }
+ else
+ return True;
+ }
+ else if (type == XA_SELECT)
+ {
+ char buf [255];
+ char buf2 [255];
+ long which = event->xclient.data.l[1];
+
+ if (p->mode == DONT_BLANK)
+ {
+ clientmessage_response(si, window, True,
+ "SELECT ClientMessage received in DONT_BLANK mode.",
+ "screen blanking is currently disabled.");
+ return False;
+ }
+
+ sprintf (buf, "SELECT %ld ClientMessage received.", which);
+ sprintf (buf2, "activating (%ld).", which);
+ clientmessage_response (si, window, False, buf, buf2);
+
+ if (which < 0) which = 0; /* 0 == "random" */
+ si->selection_mode = which;
+ si->demoing_p = False;
+
+ if (si->throttled_p && p->verbose_p)
+ fprintf (stderr, "%s: unthrottled.\n", blurb());
+ si->throttled_p = False;
+
+ if (! until_idle_p)
+ {
+ if (si->cycle_id)
+ XtRemoveTimeOut (si->cycle_id);
+ si->cycle_id = 0;
+ cycle_timer ((XtPointer) si, 0);
+ }
+ else
+ return True;
+ }
+ else if (type == XA_EXIT)
+ {
+ /* Ignore EXIT message if the screen is locked. */
+ if (until_idle_p || !si->locked_p)
+ {
+ clientmessage_response (si, window, False,
+ "EXIT ClientMessage received.",
+ "exiting.");
+ if (! until_idle_p)
+ {
+ int i;
+ for (i = 0; i < si->nscreens; i++)
+ kill_screenhack (&si->screens[i]);
+ unblank_screen (si);
+ XSync (si->dpy, False);
+ }
+ saver_exit (si, 0, 0);
+ }
+ else
+ clientmessage_response (si, window, True,
+ "EXIT ClientMessage received while locked.",
+ "screen is locked.");
+ }
+ else if (type == XA_RESTART)
+ {
+ /* The RESTART message works whether the screensaver is active or not,
+ unless the screen is locked, in which case it doesn't work.
+ */
+ if (until_idle_p || !si->locked_p)
+ {
+ clientmessage_response (si, window, False,
+ "RESTART ClientMessage received.",
+ "restarting.");
+ if (! until_idle_p)
+ {
+ int i;
+ for (i = 0; i < si->nscreens; i++)
+ kill_screenhack (&si->screens[i]);
+ unblank_screen (si);
+ XSync (si->dpy, False);
+ }
+
+ restart_process (si); /* does not return */
+ abort();
+ }
+ else
+ clientmessage_response (si, window, True,
+ "RESTART ClientMessage received while locked.",
+ "screen is locked.");
+ }
+ else if (type == XA_DEMO)
+ {
+ long arg = event->xclient.data.l[1];
+ Bool demo_one_hack_p = (arg == 5000);
+
+ if (demo_one_hack_p)
+ {
+ if (until_idle_p)
+ {
+ long which = event->xclient.data.l[2];
+ char buf [255];
+ char buf2 [255];
+ sprintf (buf, "DEMO %ld ClientMessage received.", which);
+ sprintf (buf2, "demoing (%ld).", which);
+ clientmessage_response (si, window, False, buf, buf2);
+
+ if (which < 0) which = 0; /* 0 == "random" */
+ si->selection_mode = which;
+ si->demoing_p = True;
+
+ if (si->throttled_p && p->verbose_p)
+ fprintf (stderr, "%s: unthrottled.\n", blurb());
+ si->throttled_p = False;
+
+ return True;
+ }
+
+ clientmessage_response (si, window, True,
+ "DEMO ClientMessage received while active.",
+ "already active.");
+ }
+ else
+ {
+ clientmessage_response (si, window, True,
+ "obsolete form of DEMO ClientMessage.",
+ "obsolete form of DEMO ClientMessage.");
+ }
+ }
+ else if (type == XA_PREFS)
+ {
+ clientmessage_response (si, window, True,
+ "the PREFS client-message is obsolete.",
+ "the PREFS client-message is obsolete.");
+ }
+ else if (type == XA_LOCK)
+ {
+#ifdef NO_LOCKING
+ clientmessage_response (si, window, True,
+ "not compiled with support for locking.",
+ "locking not enabled.");
+#else /* !NO_LOCKING */
+ if (si->locking_disabled_p)
+ clientmessage_response (si, window, True,
+ "LOCK ClientMessage received, but locking is disabled.",
+ "locking not enabled.");
+ else if (si->locked_p)
+ clientmessage_response (si, window, True,
+ "LOCK ClientMessage received while already locked.",
+ "already locked.");
+ else
+ {
+ char buf [255];
+ char *response = (until_idle_p
+ ? "activating and locking."
+ : "locking.");
+ sprintf (buf, "LOCK ClientMessage received; %s", response);
+ clientmessage_response (si, window, False, buf, response);
+
+ /* Note that this leaves things in a slightly inconsistent state:
+ we are blanked but not locked. And blanking might actually
+ fail if we can't get the grab. */
+ set_locked_p (si, True);
+
+ /* Have to set the time or xscreensaver-command doesn't
+ report the LOCK state change. */
+ si->blank_time = time ((time_t *) 0);
+
+ si->selection_mode = 0;
+ si->demoing_p = False;
+
+ if (si->lock_id) /* we're doing it now, so lose the timeout */
+ {
+ XtRemoveTimeOut (si->lock_id);
+ si->lock_id = 0;
+ }
+
+ if (until_idle_p)
+ {
+ if (si->using_mit_saver_extension ||
+ si->using_sgi_saver_extension)
+ {
+ XForceScreenSaver (si->dpy, ScreenSaverActive);
+ return False;
+ }
+ else
+ {
+ return True;
+ }
+ }
+ }
+#endif /* !NO_LOCKING */
+ }
+ else if (type == XA_THROTTLE)
+ {
+ /* The THROTTLE command is deprecated -- it predates the XDPMS
+ extension. Instead of using -throttle, users should instead
+ just power off the monitor (e.g., "xset dpms force off".)
+ In a few minutes, xscreensaver will notice that the monitor
+ is off, and cease running hacks.
+ */
+ if (si->throttled_p)
+ clientmessage_response (si, window, True,
+ "THROTTLE ClientMessage received, but "
+ "already throttled.",
+ "already throttled.");
+ else
+ {
+ char buf [255];
+ char *response = "throttled.";
+ si->throttled_p = True;
+ si->selection_mode = 0;
+ si->demoing_p = False;
+ sprintf (buf, "THROTTLE ClientMessage received; %s", response);
+ clientmessage_response (si, window, False, buf, response);
+
+ if (! until_idle_p)
+ {
+ if (si->cycle_id)
+ XtRemoveTimeOut (si->cycle_id);
+ si->cycle_id = 0;
+ cycle_timer ((XtPointer) si, 0);
+ }
+ }
+ }
+ else if (type == XA_UNTHROTTLE)
+ {
+ if (! si->throttled_p)
+ clientmessage_response (si, window, True,
+ "UNTHROTTLE ClientMessage received, but "
+ "not throttled.",
+ "not throttled.");
+ else
+ {
+ char buf [255];
+ char *response = "unthrottled.";
+ si->throttled_p = False;
+ si->selection_mode = 0;
+ si->demoing_p = False;
+ sprintf (buf, "UNTHROTTLE ClientMessage received; %s", response);
+ clientmessage_response (si, window, False, buf, response);
+
+ if (! until_idle_p)
+ {
+ if (si->cycle_id)
+ XtRemoveTimeOut (si->cycle_id);
+ si->cycle_id = 0;
+ cycle_timer ((XtPointer) si, 0);
+ }
+ }
+ }
+ else
+ {
+ char buf [1024];
+ char *str;
+ str = XGetAtomName_safe (si->dpy, type);
+
+ if (str)
+ {
+ if (strlen (str) > 80)
+ strcpy (str+70, "...");
+ sprintf (buf, "unrecognised screensaver ClientMessage %s received.",
+ str);
+ free (str);
+ }
+ else
+ {
+ sprintf (buf,
+ "unrecognised screensaver ClientMessage 0x%x received.",
+ (unsigned int) event->xclient.data.l[0]);
+ }
+
+ clientmessage_response (si, window, True, buf, buf);
+ }
+ return False;
+}
+
+
+/* Some random diagnostics printed in -verbose mode.
+ */
+
+static void
+analyze_display (saver_info *si)
+{
+ int i, j;
+ static struct {
+ const char *name; const char *desc;
+ Bool useful_p;
+ Status (*version_fn) (Display *, int *majP, int *minP);
+ } exts[] = {
+
+ { "SCREEN_SAVER", /* underscore */ "SGI Screen-Saver",
+# ifdef HAVE_SGI_SAVER_EXTENSION
+ True, 0
+# else
+ False, 0
+# endif
+ }, { "SCREEN-SAVER", /* dash */ "SGI Screen-Saver",
+# ifdef HAVE_SGI_SAVER_EXTENSION
+ True, 0
+# else
+ False, 0
+# endif
+ }, { "MIT-SCREEN-SAVER", "MIT Screen-Saver",
+# ifdef HAVE_MIT_SAVER_EXTENSION
+ True, XScreenSaverQueryVersion
+# else
+ False, 0
+# endif
+ }, { "XIDLE", "XIdle",
+# ifdef HAVE_XIDLE_EXTENSION
+ True, 0
+# else
+ False, 0
+# endif
+ }, { "SGI-VIDEO-CONTROL", "SGI Video-Control",
+# ifdef HAVE_SGI_VC_EXTENSION
+ True, XSGIvcQueryVersion
+# else
+ False, 0
+# endif
+ }, { "READDISPLAY", "SGI Read-Display",
+# ifdef HAVE_READ_DISPLAY_EXTENSION
+ True, XReadDisplayQueryVersion
+# else
+ False, 0
+# endif
+ }, { "MIT-SHM", "Shared Memory",
+# ifdef HAVE_XSHM_EXTENSION
+ True, (Status (*) (Display*,int*,int*)) XShmQueryVersion /* 4 args */
+# else
+ False, 0
+# endif
+ }, { "DOUBLE-BUFFER", "Double-Buffering",
+# ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ True, XdbeQueryExtension
+# else
+ False, 0
+# endif
+ }, { "DPMS", "Power Management",
+# ifdef HAVE_DPMS_EXTENSION
+ True, DPMSGetVersion
+# else
+ False, 0
+# endif
+ }, { "GLX", "GLX",
+# ifdef HAVE_GL
+ True, 0
+# else
+ False, 0
+# endif
+ }, { "XFree86-VidModeExtension", "XF86 Video-Mode",
+# ifdef HAVE_XF86VMODE
+ True, XF86VidModeQueryVersion
+# else
+ False, 0
+# endif
+ }, { "XC-VidModeExtension", "XC Video-Mode",
+# ifdef HAVE_XF86VMODE
+ True, XF86VidModeQueryVersion
+# else
+ False, 0
+# endif
+ }, { "XFree86-MISC", "XF86 Misc",
+# ifdef HAVE_XF86MISCSETGRABKEYSSTATE
+ True, XF86MiscQueryVersion
+# else
+ False, 0
+# endif
+ }, { "XC-MISC", "XC Misc",
+# ifdef HAVE_XF86MISCSETGRABKEYSSTATE
+ True, XF86MiscQueryVersion
+# else
+ False, 0
+# endif
+ }, { "XINERAMA", "Xinerama",
+# ifdef HAVE_XINERAMA
+ True, XineramaQueryVersion
+# else
+ False, 0
+# endif
+ }, { "RANDR", "Resize-and-Rotate",
+# ifdef HAVE_RANDR
+ True, XRRQueryVersion
+# else
+ False, 0
+# endif
+ }, { "DRI", "DRI",
+ True, 0
+ }, { "NV-CONTROL", "NVidia",
+ True, 0
+ }, { "NV-GLX", "NVidia GLX",
+ True, 0
+ }, { "Apple-DRI", "Apple-DRI (XDarwin)",
+ True, 0
+ }, { "XInputExtension", "XInput",
+ True, 0
+ },
+ };
+
+ fprintf (stderr, "%s: running on display \"%s\"\n", blurb(),
+ DisplayString(si->dpy));
+ fprintf (stderr, "%s: vendor is %s, %d.\n", blurb(),
+ ServerVendor(si->dpy), VendorRelease(si->dpy));
+
+ fprintf (stderr, "%s: useful extensions:\n", blurb());
+ for (i = 0; i < countof(exts); i++)
+ {
+ int op = 0, event = 0, error = 0;
+ char buf [255];
+ int maj = 0, min = 0;
+ int dummy1, dummy2, dummy3;
+
+ /* Most of the extension version functions take 3 args,
+ writing results into args 2 and 3, but some take more.
+ We only ever care about the first two results, but we
+ pass in three extra pointers just in case.
+ */
+ Status (*version_fn_2) (Display*,int*,int*,int*,int*,int*) =
+ (Status (*) (Display*,int*,int*,int*,int*,int*)) exts[i].version_fn;
+
+ if (!XQueryExtension (si->dpy, exts[i].name, &op, &event, &error))
+ continue;
+ sprintf (buf, "%s: ", blurb());
+ strcat (buf, exts[i].desc);
+
+ if (!version_fn_2)
+ ;
+ else if (version_fn_2 (si->dpy, &maj, &min, &dummy1, &dummy2, &dummy3))
+ sprintf (buf+strlen(buf), " (%d.%d)", maj, min);
+ else
+ strcat (buf, " (unavailable)");
+
+ if (!exts[i].useful_p)
+ strcat (buf, " (disabled at compile time)");
+ fprintf (stderr, "%s\n", buf);
+ }
+
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ unsigned long colormapped_depths = 0;
+ unsigned long non_mapped_depths = 0;
+ XVisualInfo vi_in, *vi_out;
+ int out_count;
+
+ if (!ssi->real_screen_p) continue;
+
+ vi_in.screen = ssi->real_screen_number;
+ vi_out = XGetVisualInfo (si->dpy, VisualScreenMask, &vi_in, &out_count);
+ if (!vi_out) continue;
+ for (j = 0; j < out_count; j++) {
+ if (vi_out[j].depth >= 32) continue;
+ if (vi_out[j].class == PseudoColor)
+ colormapped_depths |= (1 << vi_out[j].depth);
+ else
+ non_mapped_depths |= (1 << vi_out[j].depth);
+ }
+ XFree ((char *) vi_out);
+
+ if (colormapped_depths)
+ {
+ fprintf (stderr, "%s: screen %d colormapped depths:", blurb(),
+ ssi->real_screen_number);
+ for (j = 0; j < 32; j++)
+ if (colormapped_depths & (1 << j))
+ fprintf (stderr, " %d", j);
+ fprintf (stderr, ".\n");
+ }
+ if (non_mapped_depths)
+ {
+ fprintf (stderr, "%s: screen %d non-colormapped depths:",
+ blurb(), ssi->real_screen_number);
+ for (j = 0; j < 32; j++)
+ if (non_mapped_depths & (1 << j))
+ fprintf (stderr, " %d", j);
+ fprintf (stderr, ".\n");
+ }
+ }
+
+ describe_monitor_layout (si);
+}
+
+
+Bool
+display_is_on_console_p (saver_info *si)
+{
+ Bool not_on_console = True;
+ char *dpystr = DisplayString (si->dpy);
+ char *tail = (char *) strchr (dpystr, ':');
+ if (! tail || strncmp (tail, ":0", 2))
+ not_on_console = True;
+ else
+ {
+ char dpyname[255], localname[255];
+ strncpy (dpyname, dpystr, tail-dpystr);
+ dpyname [tail-dpystr] = 0;
+ if (!*dpyname ||
+ !strcmp(dpyname, "unix") ||
+ !strcmp(dpyname, "localhost"))
+ not_on_console = False;
+ else if (gethostname (localname, sizeof (localname)))
+ not_on_console = True; /* can't find hostname? */
+ else if (!strncmp (dpyname, "/tmp/launch-", 12)) /* MacOS X launchd */
+ not_on_console = False;
+ else
+ {
+ /* We have to call gethostbyname() on the result of gethostname()
+ because the two aren't guarenteed to be the same name for the
+ same host: on some losing systems, one is a FQDN and the other
+ is not. Here in the wide wonderful world of Unix it's rocket
+ science to obtain the local hostname in a portable fashion.
+
+ And don't forget, gethostbyname() reuses the structure it
+ returns, so we have to copy the fucker before calling it again.
+ Thank you master, may I have another.
+ */
+ struct hostent *h = gethostbyname (dpyname);
+ if (!h)
+ not_on_console = True;
+ else
+ {
+ char hn [255];
+ struct hostent *l;
+ strcpy (hn, h->h_name);
+ l = gethostbyname (localname);
+ not_on_console = (!l || !!(strcmp (l->h_name, hn)));
+ }
+ }
+ }
+ return !not_on_console;
+}
+
+
+/* Do a little bit of heap introspection...
+ */
+void
+check_for_leaks (const char *where)
+{
+#if defined(HAVE_SBRK) && defined(LEAK_PARANOIA)
+ static unsigned long last_brk = 0;
+ int b = (unsigned long) sbrk(0);
+ if (last_brk && last_brk < b)
+ fprintf (stderr, "%s: %s: brk grew by %luK.\n",
+ blurb(), where,
+ (((b - last_brk) + 1023) / 1024));
+ last_brk = b;
+#endif /* HAVE_SBRK */
+}
diff --git a/driver/xscreensaver.h b/driver/xscreensaver.h
new file mode 100644
index 0000000..42cf794
--- /dev/null
+++ b/driver/xscreensaver.h
@@ -0,0 +1,210 @@
+/* xscreensaver, Copyright (c) 1993-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __XSCREENSAVER_H__
+#define __XSCREENSAVER_H__
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <string.h>
+#include <stdio.h>
+
+#ifdef HAVE_SIGACTION
+# include <signal.h> /* for sigset_t */
+#endif
+
+#include "prefs.h"
+
+extern char *progname;
+extern char *progclass;
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+
+
+/* =======================================================================
+ server extensions and virtual roots
+ ======================================================================= */
+
+extern Bool restore_real_vroot (saver_info *si);
+extern void disable_builtin_screensaver (saver_info *, Bool unblank_screen_p);
+extern Bool ensure_no_screensaver_running (Display *, Screen *);
+
+#ifdef HAVE_PROC_INTERRUPTS
+extern Bool query_proc_interrupts_available (saver_info *, const char **why);
+#endif
+
+#ifdef HAVE_XINPUT
+extern Bool query_xinput_extension (saver_info *);
+extern void init_xinput_extension (saver_info *si);
+#endif
+
+/* Display Power Management System (DPMS) interface. */
+extern Bool monitor_powered_on_p (saver_info *si);
+extern void monitor_power_on (saver_info *si, Bool on_p);
+
+
+/* =======================================================================
+ blanking
+ ======================================================================= */
+
+extern Bool update_screen_layout (saver_info *si);
+extern void initialize_screensaver_window (saver_info *si);
+extern void initialize_screen_root_widget (saver_screen_info *ssi);
+
+extern void raise_window (saver_info *si,
+ Bool inhibit_fade, Bool between_hacks_p,
+ Bool dont_clear);
+extern Bool blank_screen (saver_info *si);
+extern void unblank_screen (saver_info *si);
+extern void resize_screensaver_window (saver_info *si);
+
+extern void get_screen_viewport (saver_screen_info *ssi,
+ int *x_ret, int *y_ret,
+ int *w_ret, int *h_ret,
+ int target_x, int target_y,
+ Bool verbose_p);
+
+
+/* =======================================================================
+ locking
+ ======================================================================= */
+
+#ifndef NO_LOCKING
+extern Bool unlock_p (saver_info *si);
+extern Bool lock_priv_init (int argc, char **argv, Bool verbose_p);
+extern Bool lock_init (int argc, char **argv, Bool verbose_p);
+extern Bool passwd_valid_p (const char *typed_passwd, Bool verbose_p);
+#endif /* NO_LOCKING */
+
+extern void set_locked_p (saver_info *si, Bool locked_p);
+extern int move_mouse_grab (saver_info *si, Window to, Cursor cursor,
+ int to_screen_no);
+extern int mouse_screen (saver_info *si);
+
+
+/* =======================================================================
+ runtime privileges
+ ======================================================================= */
+
+extern void hack_uid (saver_info *si);
+extern void describe_uids (saver_info *si, FILE *out);
+
+/* =======================================================================
+ demoing
+ ======================================================================= */
+
+extern void draw_shaded_rectangle (Display *dpy, Window window,
+ int x, int y,
+ int width, int height,
+ int thickness,
+ unsigned long top_color,
+ unsigned long bottom_color);
+extern int string_width (XFontStruct *font, char *s);
+
+extern void make_splash_dialog (saver_info *si);
+extern void handle_splash_event (saver_info *si, XEvent *e);
+extern XFontStruct *splash_load_font (Display *, char *name, char *class);
+
+
+/* =======================================================================
+ timers
+ ======================================================================= */
+
+extern void start_notice_events_timer (saver_info *, Window, Bool verbose_p);
+extern void cycle_timer (XtPointer si, XtIntervalId *id);
+extern void activate_lock_timer (XtPointer si, XtIntervalId *id);
+extern void reset_watchdog_timer (saver_info *si, Bool on_p);
+extern void idle_timer (XtPointer si, XtIntervalId *id);
+extern void de_race_timer (XtPointer si, XtIntervalId *id);
+extern void sleep_until_idle (saver_info *si, Bool until_idle_p);
+extern void reset_timers (saver_info *si);
+extern void schedule_wakeup_event (saver_info *si, Time when, Bool verbose_p);
+
+
+/* =======================================================================
+ remote control
+ ======================================================================= */
+
+extern Bool handle_clientmessage (saver_info *, XEvent *, Bool);
+extern void maybe_reload_init_file (saver_info *);
+
+/* =======================================================================
+ subprocs
+ ======================================================================= */
+
+extern void handle_signals (saver_info *si);
+#ifdef HAVE_SIGACTION
+ extern sigset_t block_sigchld (void);
+#else /* !HAVE_SIGACTION */
+ extern int block_sigchld (void);
+#endif /* !HAVE_SIGACTION */
+extern void unblock_sigchld (void);
+extern void hack_environment (saver_info *si);
+extern void hack_subproc_environment (Screen *, Window saver_window);
+extern void init_sigchld (void);
+extern void spawn_screenhack (saver_screen_info *ssi);
+extern pid_t fork_and_exec (saver_screen_info *ssi, const char *command);
+extern void kill_screenhack (saver_screen_info *ssi);
+extern void suspend_screenhack (saver_screen_info *ssi, Bool suspend_p);
+extern Bool screenhack_running_p (saver_info *si);
+extern void emergency_kill_subproc (saver_info *si);
+extern Bool select_visual (saver_screen_info *ssi, const char *visual_name);
+extern void store_saver_status (saver_info *si);
+extern const char *signal_name (int signal);
+
+/* =======================================================================
+ subprocs diagnostics
+ ======================================================================= */
+
+extern FILE *real_stderr;
+extern FILE *real_stdout;
+extern void stderr_log_file (saver_info *si);
+extern void initialize_stderr (saver_info *si);
+extern void reset_stderr (saver_screen_info *ssi);
+extern void clear_stderr (saver_screen_info *ssi);
+extern void shutdown_stderr (saver_info *si);
+
+
+/* =======================================================================
+ misc
+ ======================================================================= */
+
+extern const char *blurb (void);
+extern void save_argv (int argc, char **argv);
+extern void saver_exit (saver_info *si, int status, const char *core_reason);
+extern void restart_process (saver_info *si);
+
+extern int saver_ehandler (Display *dpy, XErrorEvent *error);
+extern int BadWindow_ehandler (Display *dpy, XErrorEvent *error);
+extern Bool window_exists_p (Display *dpy, Window window);
+extern Bool in_signal_handler_p;
+extern char *timestring (time_t);
+extern Bool display_is_on_console_p (saver_info *si);
+extern Visual *get_best_gl_visual (saver_info *si, Screen *screen);
+extern void check_for_leaks (const char *where);
+extern void describe_monitor_layout (saver_info *si);
+
+#ifdef HAVE_XF86VMODE
+Bool safe_XF86VidModeGetViewPort (Display *, int, int *, int *);
+#endif /* HAVE_XF86VMODE */
+
+extern Atom XA_VROOT, XA_XSETROOT_ID, XA_ESETROOT_PMAP_ID, XA_XROOTPMAP_ID;
+extern Atom XA_NET_WM_USER_TIME;
+extern Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_ID;
+extern Atom XA_SCREENSAVER_STATUS, XA_LOCK, XA_BLANK;
+extern Atom XA_DEMO, XA_PREFS;
+
+#endif /* __XSCREENSAVER_H__ */
diff --git a/driver/xscreensaver.man b/driver/xscreensaver.man
new file mode 100644
index 0000000..a99845b
--- /dev/null
+++ b/driver/xscreensaver.man
@@ -0,0 +1,1035 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "09-Nov-2013 (5.23)" "X Version 11"
+.SH NAME
+xscreensaver - extensible screen saver and screen locking framework
+.SH SYNOPSIS
+.B xscreensaver
+[\-display \fIhost:display.screen\fP] \
+[\-verbose] \
+[\-no\-splash] \
+[\-no\-capture\-stderr] \
+[\-log \fIfilename\fP]
+.SH DESCRIPTION
+The \fIxscreensaver\fP program waits until the keyboard and mouse have been
+idle for a period, and then runs a graphics demo chosen at random. It
+turns off as soon as there is any mouse or keyboard activity.
+
+This program can lock your terminal in order to prevent others from using it,
+though its default mode of operation is merely to display pretty pictures on
+your screen when it is not in use.
+
+It also provides configuration and control of your monitor's power-saving
+features.
+.SH GETTING STARTED
+For the impatient, try this:
+.EX
+xscreensaver &
+xscreensaver-demo
+.EE
+The
+.BR xscreensaver-demo (1)
+program pops up a dialog box that lets you configure the screen saver,
+and experiment with the various display modes.
+
+.B Note that xscreensaver has a client-server model:
+the \fIxscreensaver\fP program is a daemon that runs in the background;
+it is controlled by the foreground
+.BR xscreensaver-demo (1)
+and
+.BR xscreensaver-command (1)
+programs.
+.SH CONFIGURATION
+The easiest way to configure \fIxscreensaver\fP is to simply run the
+.BR xscreensaver-demo (1)
+program, and change the settings through the GUI. The rest of this
+manual page describes lower level ways of changing settings.
+
+I'll repeat that because it's important:
+
+.RS 4
+The easy way to configure xscreensaver is to run the
+.BR xscreensaver-demo (1)
+program. You shouldn't need to know any of the stuff described
+in \fIthis\fP manual unless you are trying to do something tricky,
+like customize xscreensaver for site-wide use or something.
+.RE
+
+Options to \fIxscreensaver\fP are stored in one of two places: in
+a \fI.xscreensaver\fP file in your home directory; or in the X resource
+database. If the \fI.xscreensaver\fP file exists, it overrides any settings
+in the resource database.
+
+The syntax of the \fI.xscreensaver\fP file is similar to that of
+the \fI.Xdefaults\fP file; for example, to set the \fItimeout\fP parameter
+in the \fI.xscreensaver\fP file, you would write the following:
+.EX
+timeout: 5
+.EE
+whereas, in the \fI.Xdefaults\fP file, you would write
+.EX
+xscreensaver.timeout: 5
+.EE
+If you change a setting in the \fI.xscreensaver\fP file while xscreensaver
+is already running, it will notice this, and reload the file. (The file will
+be reloaded the next time the screen saver needs to take some action, such as
+blanking or unblanking the screen, or picking a new graphics mode.)
+
+If you change a setting in your X resource database, or if you want
+xscreensaver to notice your changes immediately instead of the next time
+it wakes up, then you will need to reload your \fI.Xdefaults\fP file,
+and then tell the running xscreensaver process to restart itself, like so:
+.EX
+xrdb < ~/.Xdefaults
+xscreensaver-command -restart
+.EE
+If you want to set the system-wide defaults, then make your edits to
+the xscreensaver app-defaults file, which should have been installed
+when xscreensaver itself was installed. The app-defaults file will
+usually be named /usr/lib/X11/app-defaults/XScreenSaver, but different
+systems might keep it in a different place (for example,
+/usr/openwin/lib/app-defaults/XScreenSaver on Solaris).
+
+When settings are changed in the Preferences dialog box (see above)
+the current settings will be written to the \fI.xscreensaver\fP file.
+(The \fI.Xdefaults\fP file and the app-defaults file will never be
+written by xscreensaver itself.)
+.SH COMMAND-LINE OPTIONS
+.I xscreensaver
+also accepts a few command-line options, mostly for use when debugging:
+for normal operation, you should configure things via the \fI~/.xscreensaver\fP
+file.
+.TP 8
+.B \-display \fIhost:display.screen\fP
+The X display to use. For displays with multiple screens, XScreenSaver
+will manage all screens on the display simultaniously.
+.TP 8
+.B \-verbose
+Same as setting the \fIverbose\fP resource to \fItrue\fP: print diagnostics
+on stderr and on the xscreensaver window.
+.TP 8
+.B \-no-capture-stderr
+Do not redirect the stdout and stderr streams to the xscreensaver window
+itself. If xscreensaver is crashing, you might need to do this in order
+to see the error message.
+.TP 8
+.B \-log \fIfilename\fP
+This is exactly the same as redirecting stdout and stderr to the given
+file (for append). This is useful when reporting bugs.
+.SH HOW IT WORKS
+When it is time to activate the screensaver, a full-screen black window is
+created on each screen of the display. Each window is created in such a way
+that, to any subsequently-created programs, it will appear to be a "virtual
+root" window. Because of this, any program which draws on the root
+window (and which understands virtual roots) can be used as a screensaver.
+The various graphics demos are, in fact, just standalone programs that
+know how to draw on the provided window.
+
+When the user becomes active again, the screensaver windows are unmapped, and
+the running subprocesses are killed by sending them \fBSIGTERM\fP. This is
+also how the subprocesses are killed when the screensaver decides that it's
+time to run a different demo: the old one is killed and a new one is launched.
+
+You can control a running screensaver process by using the
+.BR xscreensaver\-command (1)
+program (which see).
+.SH POWER MANAGEMENT
+Modern X servers contain support to power down the monitor after an idle
+period. If the monitor has powered down, then \fIxscreensaver\fP will
+notice this (after a few minutes), and will not waste CPU by drawing
+graphics demos on a black screen. An attempt will also be made to
+explicitly power the monitor back up as soon as user activity is detected.
+
+The \fI~/.xscreensaver\fP file controls the configuration of your
+display's power management settings: if you have used
+.BR xset (1)
+to change your power management settings, then xscreensaver will
+override those changes with the values specified
+in \fI~/.xscreensaver\fP (or with its built-in defaults, if there
+is no \fI~/.xscreensaver\fP file yet).
+
+To change your power management settings, run
+.BR xscreensaver\-demo (1)
+and change the various timeouts through the user interface.
+Alternatively, you can edit the \fI~/.xscreensaver\fP file directly.
+
+If the power management section is grayed out in the
+.BR xscreensaver\-demo (1)
+window, then that means that your X server does not support
+the XDPMS extension, and so control over the monitor's power state
+is not available.
+
+If you're using a laptop, don't be surprised if changing the DPMS
+settings has no effect: many laptops have monitor power-saving behavior
+built in at a very low level that is invisible to Unix and X. On such
+systems, you can typically adjust the power-saving delays only by
+changing settings in the BIOS in some hardware-specific way.
+
+If DPMS seems not to be working with XFree86, make sure the "DPMS"
+option is set in your \fI/etc/X11/XF86Config\fP file. See the
+.BR XF86Config (5)
+manual for details.
+.SH USING GNOME OR UNITY
+For the better part of a decade, GNOME shipped xscreensaver as-is,
+and everything just worked out of the box. In 2005, however, they
+decided to re-invent the wheel and ship their own replacement for
+the \fIxscreensaver\fP daemon called "\fIgnome-screensaver\fP",
+rather than improving xscreensaver and contributing their changes
+back. As a result, the "\fIgnome-screensaver\fP" program is insecure,
+bug-ridden, and missing many features of xscreensaver. You shouldn't
+use it.
+
+To replace gnome-screensaver with xscreensaver:
+.RS 4
+.TP 3
+\fB1: Fully uninstall the gnome-screensaver package.\fP
+.EX
+sudo apt-get remove gnome-screensaver
+.EE
+or possibly
+.EX
+sudo dpkg -P gnome-screensaver
+.EE
+.TP 3
+\fB2: Launch xscreensaver at login.\fP
+Select "\fIStartup Applications\fP" from the menu (or manually
+launch "\fIgnome-session-properties\fP") and add "\fIxscreensaver\fP".
+
+Do this as your normal user account, not as root.
+(This should go without saying, because you should never, ever, ever
+be logged in to the graphical desktop as user "root".)
+.TP 3
+\fB3: Make GNOME's "Lock Screen" use xscreensaver.\fP
+.EX
+sudo ln -sf /usr/bin/xscreensaver-command \\
+ /usr/bin/gnome-screensaver-command
+.EE
+That doesn't work under Unity, though. Apparently it has its own
+built-in screen locker which is not gnome-screensaver, and cannot be
+removed, and yet still manages to be bug-addled and insecure.
+Keep reinventing that wheel, guys! (If you have figured out how to
+replace Unity's locking "feature" with xscreensaver, let me know.)
+.TP 3
+\fB4: Turn off Unity's built-in blanking.\fP
+Open "\fISystem Settings / Brightness & Lock\fP";
+.br
+Un-check "\fIStart Automatically\fP";
+.br
+Set \fI"Turn screen off when inactive for"\fP to \fI"Never".\fP
+.SH USING KDE
+Like GNOME, KDE also decided to invent their own screen saver framework
+from scratch instead of simply using xscreensaver. To replace the KDE
+screen saver with xscreensaver, do the following:
+.RS 4
+.TP 3
+\fB1: Turn off KDE's screen saver.\fP
+Open the "\fIControl Center\fP" and
+select the "\fIAppearance & Themes / Screensaver\fP" page.
+Un-check "\fIStart Automatically\fP".
+
+Or possibly:
+Open "\fISystem Settings\fP" and
+select "\fIScreen Locking\fP".
+Un-check "\fILock Screen Automatically\fP".
+.TP 3
+\fB2: Find your Autostart directory.\fP
+Open the "\fISystem Administration / Paths\fP" page,
+and see what your "Autostart path" is set to: it will
+probably be something like \fI~/.kde/Autostart/\fP
+or \fI~/.config/autostart/\fP
+
+If that doesn't work, then try this:
+
+Open "\fISystem Settings / Startup/Shutdown / Autostart\fP", and then
+add "\fI/usr/bin/xscreensaver\fP".
+
+If you are lucky, that will create a \fIxscreensaver.desktop"\fP file
+for you in \fI~/.config/autostart/\fP or \fI~/.kde/Autostart/\fP.
+.TP 3
+\fB3: Make xscreensaver be an Autostart program.\fP
+If it does not already exist, create a file in your autostart directory
+called \fIxscreensaver.desktop\fP that contains the following six lines:
+.EX
+[Desktop Entry]
+Exec=xscreensaver
+Name=XScreenSaver
+Type=Application
+StartupNotify=false
+X-KDE-StartupNotify=false
+.EE
+.TP 3
+\fB4: Make the various "lock session" buttons call xscreensaver.\fP
+The file you want to replace next has moved around over the years. It
+might be called \fI/usr/libexec/kde4/kscreenlocker\fP,
+or it might be called "\fIkdesktop_lock\fP" or "\fIkrunner_lock\fP"
+or "\fIkscreenlocker_greet\fP", and
+it might be in \fI/usr/lib/kde4/libexec/\fP
+or in \fI/usr/kde/3.5/bin/\fP or even in \fI/usr/bin/\fP,
+depending on the distro and phase of the moon. Replace the contents
+of that file with these two lines:
+.EX
+#!/bin/sh
+xscreensaver-command -lock
+.EE
+Make sure the file is executable (chmod a+x).
+.RE
+.PP
+Now use xscreensaver normally, controlling it via the usual
+.BR xscreensaver-demo (1)
+and
+.BR xscreensaver-command (1)
+mechanisms.
+.SH USING SYSTEMD
+If the above didn't do it, and your system has
+.BR systemd (1),
+then give this a try:
+.TP 3
+\fB1: Create a service.\fP
+Create the file \fI~/.config/systemd/user/xscreensaver.service\fP
+containing:
+.EX
+[Unit]
+Description=XScreenSaver
+[Service]
+ExecStart=/usr/bin/xscreensaver
+[Install]
+WantedBy=default.target
+.EE
+.TP 3
+\fB2. Enable it.\fP
+.EX
+systemctl --user enable xscreensaver
+.EE
+Then restart X11.
+.SH USING UPSTART
+If it's still not working, but on your distro, that newfangled
+.BR systemd (1)
+nonsense has already fallen out of favor? Then maybe this will work:
+launch the \fI"Startup Applications"\fP applet, click \fI"Add"\fP,
+enter these lines, then restart X11:
+.EX
+Name: XScreenSaver
+Command: xscreensaver
+Comment: xscreensaver
+.EE
+.SH USING GDM
+You can run \fIxscreensaver\fP from your
+.BR gdm (1)
+session, so that the screensaver will run even when nobody is logged
+in on the console. To do this, run
+.BR gdmconfig (1).
+
+On the \fIGeneral\fP page set the \fILocal Greeter\fP to
+\fIStandard Greeter\fP.
+
+On the \fIBackground\fP page, type the
+command \fB"xscreensaver -nosplash"\fP into the \fIBackground Program\fP
+field. That will cause gdm to run xscreensaver while nobody is logged
+in, and kill it as soon as someone does log in. (The user will then
+be responsible for starting xscreensaver on their own, if they want.)
+
+If that doesn't work, you can edit the config file directly. Edit
+\fI/etc/X11/gdm/gdm.conf\fP to include:
+.EX
+Greeter=/usr/bin/gdmlogin
+BackgroundProgram=xscreensaver -nosplash
+RunBackgroundProgramAlways=true
+.EE
+In this situation, the \fIxscreensaver\fP process will probably be running
+as user \fIgdm\fP instead of \fIroot\fP. You can configure the settings
+for this nobody-logged-in state (timeouts, DPMS, etc.) by editing
+the \fI~gdm/.xscreensaver\fP file.
+
+It is safe to run \fIxscreensaver\fP as root (as \fIxdm\fP or \fIgdm\fP may do).
+If run as root, \fIxscreensaver\fP changes its effective user and group ids
+to something safe (like \fI"nobody"\fP) before connecting to the X server
+or launching user-specified programs.
+
+An unfortunate side effect of this (important) security precaution is that
+it may conflict with cookie-based authentication.
+
+If you get "connection refused" errors when running \fIxscreensaver\fP
+from \fIgdm\fP, then this probably means that you have
+.BR xauth (1)
+or some other security mechanism turned on. For information on the
+X server's access control mechanisms, see the man pages for
+.BR X (1),
+.BR Xsecurity (1),
+.BR xauth (1),
+and
+.BR xhost (1).
+.SH BUGS
+Bugs? There are no bugs. Ok, well, maybe. If you find one, please let
+me know. https://www.jwz.org/xscreensaver/bugs.html explains how to
+construct the most useful bug reports.
+.PP
+.TP 4
+.B Locking and root logins
+In order for it to be safe for xscreensaver to be launched by \fIxdm\fP,
+certain precautions had to be taken, among them that xscreensaver never
+runs as \fIroot\fP. In particular, if it is launched as root (as \fIxdm\fP
+is likely to do), xscreensaver will disavow its privileges, and switch
+itself to a safe user id (such as \fInobody\fP).
+
+An implication of this is that if you log in as \fIroot\fP on the console,
+xscreensaver will refuse to lock the screen (because it can't tell
+the difference between \fIroot\fP being logged in on the console, and a
+normal user being logged in on the console but xscreensaver having been
+launched by the
+.BR xdm (1)
+.I Xsetup
+file).
+
+The solution to this is simple: you shouldn't be logging in on the console
+as \fIroot\fP in the first place! (What, are you crazy or something?)
+
+Proper Unix hygiene dictates that you should log in as yourself, and
+.BR su (1)
+to \fIroot\fP as necessary. People who spend their day logged in
+as \fIroot\fP are just begging for disaster.
+.TP 4
+.B XAUTH and XDM
+For xscreensaver to work when launched by
+.BR xdm (1)
+or
+.BR gdm (1),
+programs running on the local machine as user \fI"nobody"\fP must be
+able to connect to the X server. This means that if you want to run
+xscreensaver on the console while nobody is logged in, you may need
+to disable cookie-based access control (and allow all users who can log
+in to the local machine to connect to the display).
+
+You should be sure that this is an acceptable thing to do in your
+environment before doing it. See the "\fIUsing GDM\fP" section,
+above, for more details.
+.TP 4
+.B Passwords
+If you get an error message at startup like "couldn't get password
+of \fIuser\fP" then this probably means that you're on a system in which
+the
+.BR getpwent (3)
+library routine can only be effectively used by root. If this is the case,
+then \fIxscreensaver\fP must be installed as setuid to root in order for
+locking to work. Care has been taken to make this a safe thing to do.
+
+It also may mean that your system uses shadow passwords instead of the standard
+.BR getpwent (3)
+interface; in that case, you may need to change some options
+with \fIconfigure\fP and recompile.
+
+If you change your password after xscreensaver has been launched, it will
+continue using your old password to unlock the screen until xscreensaver
+is restarted. On some systems, it may accept \fIboth\fP your old and new
+passwords. So, after you change your password, you'll have to do
+.EX
+xscreensaver-command -restart
+.EE
+to make \fIxscreensaver\fP notice.
+.TP 4
+.B PAM Passwords
+If your system uses PAM (Pluggable Authentication Modules), then in order
+for xscreensaver to use PAM properly, PAM must be told about xscreensaver.
+The xscreensaver installation process should update the PAM data (on Linux,
+by creating the file \fI/etc/pam.d/xscreensaver\fP for you, and on Solaris,
+by telling you what lines to add to the \fI/etc/pam.conf\fP file).
+
+If the PAM configuration files do not know about xscreensaver, then
+you \fImight\fP be in a situation where xscreensaver will refuse to ever
+unlock the screen.
+
+This is a design flaw in PAM (there is no way for a client to tell the
+difference between PAM responding "I have never heard of your module",
+and responding, "you typed the wrong password"). As far as I can tell,
+there is no way for xscreensaver to automatically work around this, or
+detect the problem in advance, so if you have PAM, make sure it is
+configured correctly!
+.TP 4
+.B Machine Load
+Although this program "nices" the subprocesses that it starts,
+graphics-intensive subprograms can still overload the machine by causing
+the X server process itself (which is not "niced") to consume many
+cycles. Care has been taken in all the modules shipped with xscreensaver
+to sleep periodically, and not run full tilt, so as not to cause
+appreciable load.
+
+However, if you are running the OpenGL-based screen savers on a machine
+that does not have a video card with 3D acceleration, they \fIwill\fP
+make your machine slow, despite
+.BR nice (1).
+
+Your options are: don't use the OpenGL display modes; or, collect the
+spare change hidden under the cushions of your couch, and use it to
+buy a video card manufactured after 1998. (It doesn't even need to be
+\fIfast\fP 3D hardware: the problem will be fixed if there is any
+3D hardware \fIat all.\fP)
+.TP 4
+.B Magic Backdoor Keystrokes
+The XFree86 X server and the Linux kernel both trap certain magic
+keystrokes before X11 client programs ever see them. If you care
+about keeping your screen locked, this is a big problem.
+.RS 4
+.TP 3
+.B Ctrl+Alt+Backspace
+This keystroke kills the X server, and on some systems, leaves you at
+a text console. If the user launched X11 manually, that text console
+will still be logged in. To disable this keystroke globally and
+permanently, you need to set the \fBDontZap\fP flag in your
+\fIxorg.conf\fP or \fIXF86Config\fP or \fIXF86Config-4\fP file,
+depending which is in use on your system. See
+.BR XF86Config (5)
+for details.
+.TP 3
+.B Ctrl-Alt-F1, Ctrl-Alt-F2, etc.
+These keystrokes will switch to a different virtual console, while
+leaving the console that X11 is running on locked. If you left a
+shell logged in on another virtual console, it is unprotected. So
+don't leave yourself logged in on other consoles. You can disable VT
+switching globally and permanently by setting \fBDontVTSwitch\fP in
+your \fIxorg.conf\fP, but that might make your system harder to use,
+since VT switching is an actual useful feature.
+
+There is no way to disable VT switching only when the screen is
+locked. It's all or nothing.
+.TP 3
+.B Ctrl-Alt-KP_Multiply
+This keystroke kills any X11 app that holds a lock, so typing this
+will kill xscreensaver and unlock the screen. This so-called
+"feature" showed up in the X server in 2008, and as of 2011, some
+vendors are shipping it turned on by default. How nice. You can
+disable it by turning off
+\fBAllowClosedownGrabs\fP in \fIxorg.conf\fP.
+.TP 3
+.B Alt-SysRq-F
+This is the Linux kernel "OOM-killer" keystroke. It shoots down
+random long-running programs of its choosing, and so might might
+target and kill xscreensaver, and there's no way for xscreensaver to
+protect itself from that. You can disable it globally with:
+.EX
+echo 176 > /proc/sys/kernel/sysrq
+.EE
+.RE
+There's little that I can do to make the screen locker be secure so long
+as the kernel and X11 developers are \fIactively\fP working against
+security like this. The strength of the lock on your front door
+doesn't matter much so long as someone else in the house insists on
+leaving a key under the welcome mat.
+.TP 4
+.B Dangerous Backdoor Server Extensions
+Many distros enable by default several X11 server extensions that can
+be used to bypass grabs, and thus snoop on you while you're typing
+your password. These extensions are nominally for debugging and
+automation, but they are also security-circumventing keystroke
+loggers. If your server is configured to load the \fBRECORD, XTRAP\fP
+or \fBXTEST\fP extensions, you absolutely should disable those, 100%
+of the time. Look for them in \fIxorg.conf\fP or whatever it is
+called.
+.SH X RESOURCES
+These are the X resources use by the \fIxscreensaver\fP program.
+You probably won't need to change these manually (that's what the
+.BR xscreensaver\-demo (1)
+program is for).
+.TP 8
+.B timeout\fP (class \fBTime\fP)
+The screensaver will activate (blank the screen) after the keyboard and
+mouse have been idle for this many minutes. Default 10 minutes.
+.TP 8
+.B cycle\fP (class \fBTime\fP)
+After the screensaver has been running for this many minutes, the currently
+running graphics-hack sub-process will be killed (with \fBSIGTERM\fP), and a
+new one started. If this is 0, then the graphics hack will never be changed:
+only one demo will run until the screensaver is deactivated by user activity.
+Default 10 minutes.
+
+The running saver will be restarted every \fIcycle\fP minutes even when
+\fImode\fP is \fIone\fP, since some savers tend to converge on a steady
+state.
+.TP 8
+.B lock\fP (class \fBBoolean\fP)
+Enable locking: before the screensaver will turn off, it will require you
+to type the password of the logged-in user (really, the person who ran
+xscreensaver), or the root password. (\fBNote:\fP this doesn't work if the
+screensaver is launched by
+.BR xdm (1)
+because it can't know the user-id of the logged-in user. See
+the "\fIUsing XDM(1)\fP" section, below.
+.TP 8
+.B lockTimeout\fP (class \fBTime\fP)
+If locking is enabled, this controls the length of the "grace period"
+between when the screensaver activates, and when the screen becomes locked.
+For example, if this is 5, and \fI\-timeout\fP is 10, then after 10 minutes,
+the screen would blank. If there was user activity at 12 minutes, no password
+would be required to un-blank the screen. But, if there was user activity
+at 15 minutes or later (that is, \fI\-lock\-timeout\fP minutes after
+activation) then a password would be required. The default is 0, meaning
+that if locking is enabled, then a password will be required as soon as the
+screen blanks.
+.TP 8
+.B passwdTimeout\fP (class \fBTime\fP)
+If the screen is locked, then this is how many seconds the password dialog box
+should be left on the screen before giving up (default 30 seconds). This
+should not be too large: the X server is grabbed for the duration that the
+password dialog box is up (for security purposes) and leaving the server
+grabbed for too long can cause problems.
+.TP 8
+.B dpmsEnabled\fP (class \fBBoolean\fP)
+Whether power management is enabled.
+.TP 8
+.B dpmsStandby\fP (class \fBTime\fP)
+If power management is enabled, how long until the monitor goes solid black.
+.TP 8
+.B dpmsSuspend\fP (class \fBTime\fP)
+If power management is enabled, how long until the monitor goes into
+power-saving mode.
+.TP 8
+.B dpmsOff\fP (class \fBTime\fP)
+If power management is enabled, how long until the monitor powers down
+completely. Note that these settings will have no effect unless both
+the X server and the display hardware support power management; not
+all do. See the \fIPower Management\fP section, below, for more
+information.
+.TP 8
+.B dpmsQuickOff\fP (class \fBBoolean\fP)
+If \fImode\fP is \fIblank\fP and this is true, then the screen will be
+powered down immediately upon blanking, regardless of other
+power-management settings.
+.TP 8
+.B visualID\fP (class \fBVisualID\fP)
+This is an historical artifacts left over from when 8-bit
+displays were still common. You should probably ignore this.
+
+Specify which X visual to use by default. (Note carefully that this resource
+is called \fBvisualID\fP, not merely \fBvisual\fP; if you set the \fBvisual\fP
+resource instead, things will malfunction in obscure ways for obscure reasons.)
+
+Legal values for the \fBVisualID\fP resource are:
+.RS 8
+.TP 8
+.B default
+Use the screen's default visual (the visual of the root window).
+This is the default.
+.TP 8
+.B best
+Use the visual which supports the most colors. Note, however, that the
+visual with the most colors might be a TrueColor visual, which does not
+support colormap animation. Some programs have more interesting behavior
+when run on PseudoColor visuals than on TrueColor.
+.TP 8
+.B mono
+Use a monochrome visual, if there is one.
+.TP 8
+.B gray
+Use a grayscale or staticgray visual, if there is one and it has more than
+one plane (that is, it's not monochrome).
+.TP 8
+.B color
+Use the best of the color visuals, if there are any.
+.TP 8
+.B GL
+Use the visual that is best for OpenGL programs. (OpenGL programs have
+somewhat different requirements than other X programs.)
+.TP 8
+.I class
+where \fIclass\fP is one of \fBStaticGray\fP, \fBStaticColor\fP,
+\fBTrueColor\fP, \fBGrayScale\fP, \fBPseudoColor\fP, or \fBDirectColor\fP.
+Selects the deepest visual of the given class.
+.TP 8
+.I number
+where \fInumber\fP (decimal or hex) is interpreted as a visual id number,
+as reported by the
+.BR xdpyinfo (1)
+program; in this way you can have finer control over exactly which visual
+gets used, for example, to select a shallower one than would otherwise
+have been chosen.
+
+.RE
+.RS 8
+Note that this option specifies only the \fIdefault\fP visual that will
+be used: the visual used may be overridden on a program-by-program basis.
+See the description of the \fBprograms\fP resource, below.
+.RE
+.TP 8
+.B installColormap\fP (class \fBBoolean\fP)
+On PseudoColor (8-bit) displays, install a private colormap while the
+screensaver is active, so that the graphics hacks can get as many
+colors as possible. This is the default. (This only applies when the
+screen's default visual is being used, since non-default visuals get
+their own colormaps automatically.) This can also be overridden on a
+per-hack basis: see the discussion of the \fBdefault\-n\fP name in the
+section about the \fBprograms\fP resource.
+
+This does nothing if you have a TrueColor (16-bit or deeper) display.
+(Which, in this century, you do.)
+.TP 8
+.B verbose\fP (class \fBBoolean\fP)
+Whether to print diagnostics. Default false.
+.TP 8
+.B timestamp\fP (class \fBBoolean\fP)
+Whether to print the time of day along with any other diagnostic messages.
+Default true.
+.TP 8
+.B splash\fP (class \fBBoolean\fP)
+Whether to display a splash screen at startup. Default true.
+.TP 8
+.B splashDuration\fP (class \fBTime\fP)
+How long the splash screen should remain visible; default 5 seconds.
+.TP 8
+.B helpURL\fP (class \fBURL\fP)
+The splash screen has a \fIHelp\fP button on it. When you press it, it will
+display the web page indicated here in your web browser.
+.TP 8
+.B loadURL\fP (class \fBLoadURL\fP)
+This is the shell command used to load a URL into your web browser.
+The default setting will load it into Mozilla/Netscape if it is already
+running, otherwise, will launch a new browser looking at the \fIhelpURL\fP.
+.TP 8
+.B demoCommand\fP (class \fBDemoCommand\fP)
+This is the shell command run when the \fIDemo\fP button on the splash window
+is pressed. It defaults to
+.BR xscreensaver\-demo (1).
+.TP 8
+.B prefsCommand\fP (class \fBPrefsCommand\fP)
+This is the shell command run when the \fIPrefs\fP button on the splash window
+is pressed. It defaults to \fIxscreensaver\-demo\ \-prefs\fP.
+.TP 8
+.B newLoginCommand\fP (class \fBNewLoginCommand\fP)
+If set, this is the shell command that is run when the "New Login" button
+is pressed on the unlock dialog box, in order to create a new desktop
+session without logging out the user who has locked the screen.
+Typically this will be some variant of
+.BR gdmflexiserver (1),
+.BR kdmctl (1),
+.BR lxdm (1)
+or
+.BR dm-tool (1).
+.TP 8
+.B nice\fP (class \fBNice\fP)
+The sub-processes created by \fIxscreensaver\fP will be "niced" to this
+level, so that they are given lower priority than other processes on the
+system, and don't increase the load unnecessarily. The default is 10.
+(Higher numbers mean lower priority; see
+.BR nice (1)
+for details.)
+.TP 8
+.B fade\fP (class \fBBoolean\fP)
+If this is true, then when the screensaver activates, the current contents
+of the screen will fade to black instead of simply winking out. This only
+works on certain systems. A fade will also be done when switching graphics
+hacks (when the \fIcycle\fP timer expires). Default: true.
+.TP 8
+.B unfade\fP (class \fBBoolean\fP)
+If this is true, then when the screensaver deactivates, the original contents
+of the screen will fade in from black instead of appearing immediately. This
+only works on certain systems, and if \fIfade\fP is true as well.
+Default false.
+.TP 8
+.B fadeSeconds\fP (class \fBTime\fP)
+If \fIfade\fP is true, this is how long the fade will be in
+seconds (default 3 seconds).
+.TP 8
+.B fadeTicks\fP (class \fBInteger\fP)
+If \fIfade\fP is true, this is how many times a second the colormap will
+be changed to effect a fade. Higher numbers yield smoother fades, but
+may make the fades take longer than the specified \fIfadeSeconds\fP if
+your server isn't fast enough to keep up. Default 20.
+.TP 8
+.B captureStderr\fP (class \fBBoolean\fP)
+Whether \fIxscreensaver\fP should redirect its stdout and stderr streams to
+the window itself. Since its nature is to take over the screen, you would not
+normally see error messages generated by xscreensaver or the sub-programs it
+runs; this resource will cause the output of all relevant programs to be
+drawn on the screensaver window itself, as well as being written to the
+controlling terminal of the screensaver driver process. Default true.
+.TP 8
+.B ignoreUninstalledPrograms\fP (class \fBBoolean\fP)
+There may be programs in the list that are not installed on the system,
+yet are marked as "enabled". If this preference is true, then such
+programs will simply be ignored. If false, then a warning will be printed
+if an attempt is made to run the nonexistent program. Also, the
+.BR xscreensaver-demo (1)
+program will suppress the non-existent programs from the list if this
+is true. Default: false.
+.TP 8
+.B authWarningSlack\fP (class \fBInteger\fP)
+If \fIall\fP failed unlock attempts (incorrect password entered) were
+made within this period of time, the usual dialog that warns about such
+attempts after a successful login will be suppressed. The assumption
+is that incorrect passwords entered within a few seconds of a correct
+one are user error, rather than hostile action. Default 20 seconds.
+.TP 8
+.B GetViewPortIsFullOfLies\fP (class \fBBoolean\fP)
+Set this to true if the xscreensaver window doesn't cover the whole screen.
+This works around a longstanding XFree86 bug #421. See the
+xscreensaver FAQ for details.
+.TP 8
+.B font\fP (class \fBFont\fP)
+The font used for the stdout/stderr text, if \fBcaptureStderr\fP is true.
+Default \fB*\-medium\-r\-*\-140\-*\-m\-*\fP (a 14 point fixed-width font).
+.TP 8
+.B mode\fP (class \fBMode\fP)
+Controls the behavior of xscreensaver. Legal values are:
+.RS 8
+.TP 8
+.B random
+When blanking the screen, select a random display mode from among those
+that are enabled and applicable. This is the default.
+.TP 8
+.B random-same
+Like \fIrandom\fP, but if there are multiple screens, each screen
+will run the \fIsame\fP random display mode, instead of each screen
+running a different one.
+.TP 8
+.B one
+When blanking the screen, only ever use one particular display mode (the
+one indicated by the \fIselected\fP setting).
+.TP 8
+.B blank
+When blanking the screen, just go black: don't run any graphics hacks.
+.TP 8
+.B off
+Don't ever blank the screen, and don't ever allow the monitor to power down.
+
+.RE
+.TP 8
+.B selected\fP (class \fBInteger\fP)
+When \fImode\fP is set to \fIone\fP, this is the one, indicated by its
+index in the \fIprograms\fP list. You're crazy if you count them and
+set this number by hand: let
+.BR xscreensaver\-demo (1)
+do it for you!
+.TP 8
+.B programs\fP (class \fBPrograms\fP)
+The graphics hacks which \fIxscreensaver\fP runs when the user is idle.
+The value of this resource is a multi-line string, one \fIsh\fP-syntax
+command per line. Each line must contain exactly one command: no
+semicolons, no ampersands.
+
+When the screensaver starts up, one of these is selected (according to
+the \fBmode\fP setting), and run. After the \fIcycle\fP period
+expires, it is killed, and another is selected and run.
+
+If a line begins with a dash (-) then that particular program is
+disabled: it won't be selected at random (though you can still select
+it explicitly using the
+.BR xscreensaver\-demo (1)
+program).
+
+If all programs are disabled, then the screen will just be made blank,
+as when \fImode\fP is set to \fIblank\fP.
+
+To disable a program, you must mark it as disabled with a dash instead
+of removing it from the list. This is because the system-wide (app-defaults)
+and per-user (.xscreensaver) settings are merged together, and if a user
+just \fIdeletes\fP an entry from their programs list, but that entry still
+exists in the system-wide list, then it will come back. However, if the
+user \fIdisables\fP it, then their setting takes precedence.
+
+If the display has multiple screens, then a different program will be run
+for each screen. (All screens are blanked and unblanked simultaneously.)
+
+Note that you must escape the newlines; here is an example of how you
+might set this in your \fI~/.xscreensaver\fP file:
+
+.RS 8
+.EX
+programs: \\
+ qix -root \\n\\
+ ico -r -faces -sleep 1 -obj ico \\n\\
+ xdaliclock -builtin2 -root \\n\\
+ xv -root -rmode 5 image.gif -quit \\n
+.EE
+.RE
+.RS 8
+Make sure your \fB$PATH\fP environment variable is set up correctly
+\fIbefore\fP xscreensaver is launched, or it won't be able to find the
+programs listed in the \fIprograms\fP resource.
+
+To use a program as a screensaver, two things are required: that that
+program draw on the root window (or be able to be configured to draw on
+the root window); and that that program understand "virtual root"
+windows, as used by virtual window managers such as
+.BR tvtwm (1).
+(Generally, this is accomplished by just including the \fI"vroot.h"\fP
+header file in the program's source.)
+
+.B Visuals:
+
+Because xscreensaver was created back when dinosaurs roamed the earth,
+it still contains support for some things you've probably never seen,
+such as 1-bit monochrome monitors, grayscale monitors, and monitors
+capable of displaying only 8-bit colormapped images.
+
+If there are some programs that you want to run only when using a color
+display, and others that you want to run only when using a monochrome
+display, you can specify that like this:
+.EX
+ mono: mono-program -root \\n\\
+ color: color-program -root \\n\\
+.EE
+.RE
+.RS 8
+More generally, you can specify the kind of visual that should be used for
+the window on which the program will be drawing. For example, if one
+program works best if it has a colormap, but another works best if it has
+a 24-bit visual, both can be accommodated:
+.EX
+ PseudoColor: cmap-program -root \\n\\
+ TrueColor: 24bit-program -root \\n\\
+.EE
+.RE
+.RS 8
+In addition to the symbolic visual names described above (in the discussion
+of the \fIvisualID\fP resource) one other visual name is supported in
+the \fIprograms\fP list:
+.RS 1
+.TP 4
+.B default-n
+This is like \fBdefault\fP, but also requests the use of the default colormap,
+instead of a private colormap. (That is, it behaves as if
+the \fI\-no\-install\fP command-line option was specified, but only for
+this particular hack.) This is provided because some third-party programs
+that draw on the root window (notably:
+.BR xv (1),
+and
+.BR xearth (1))
+make assumptions about the visual and colormap of the root window:
+assumptions which xscreensaver can violate.
+
+.RE
+If you specify a particular visual for a program, and that visual does not
+exist on the screen, then that program will not be chosen to run. This
+means that on displays with multiple screens of different depths, you can
+arrange for appropriate hacks to be run on each. For example, if one screen
+is color and the other is monochrome, hacks that look good in mono can be
+run on one, and hacks that only look good in color will show up on the other.
+.RE
+.PP
+.PP
+You shouldn't ever need to change the following resources:
+.PP
+.TP 8
+.B pointerPollTime\fP (class \fBTime\fP)
+When server extensions are not in use, this controls how
+frequently \fIxscreensaver\fP checks to see if the mouse position or buttons
+have changed. Default 5 seconds.
+.TP 8
+.B pointerHysteresis\fP (class \fBInteger\fP)
+If the mouse moves less than this-many pixels in a second, ignore it
+(do not consider that to be "activity"). This is so that the screen
+doesn't un-blank (or fail to blank) just because you bumped the desk.
+Default: 10 pixels.
+.TP 8
+.B windowCreationTimeout\fP (class \fBTime\fP)
+When server extensions are not in use, this controls the delay between when
+windows are created and when \fIxscreensaver\fP selects events on them.
+Default 30 seconds.
+.TP 8
+.B initialDelay\fP (class \fBTime\fP)
+When server extensions are not in use, \fIxscreensaver\fP will wait this many
+seconds before selecting events on existing windows, under the assumption that
+\fIxscreensaver\fP is started during your login procedure, and the window
+state may be in flux. Default 0. (This used to default to 30, but that was
+back in the days when slow machines and X terminals were more common...)
+.TP 8
+.B procInterrupts\fP (class \fBBoolean\fP)
+This resource controls whether the \fB/proc/interrupts\fP file should be
+consulted to decide whether the user is idle. This is the default
+if \fIxscreensaver\fP has been compiled on a system which supports this
+mechanism (i.e., Linux systems).
+
+The benefit to doing this is that \fIxscreensaver\fP can note that the user
+is active even when the X console is not the active one: if the user is
+typing in another virtual console, xscreensaver will notice that and will
+fail to activate. For example, if you're playing Quake in VGA-mode,
+xscreensaver won't wake up in the middle of your game and start competing
+for CPU.
+
+The drawback to doing this is that perhaps you \fIreally do\fP want idleness
+on the X console to cause the X display to lock, even if there is activity
+on other virtual consoles. If you want that, then set this option to False.
+(Or just lock the X console manually.)
+
+The default value for this resource is True, on systems where it works.
+.TP 8
+.B overlayStderr\fP (class \fBBoolean\fP)
+If \fBcaptureStderr\fP is True, and your server supports "overlay" visuals,
+then the text will be written into one of the higher layers instead of into
+the same layer as the running screenhack. Set this to False to disable
+that (though you shouldn't need to).
+.TP 8
+.B overlayTextForeground\fP (class \fBForeground\fP)
+The foreground color used for the stdout/stderr text, if \fBcaptureStderr\fP
+is true. Default: Yellow.
+.TP 8
+.B overlayTextBackground\fP (class \fBBackground\fP)
+The background color used for the stdout/stderr text, if \fBcaptureStderr\fP
+is true. Default: Black.
+.TP 8
+.B bourneShell\fP (class \fBBourneShell\fP)
+The pathname of the shell that \fIxscreensaver\fP uses to start subprocesses.
+This must be whatever your local variant of \fB/bin/sh\fP is: in particular,
+it must not be \fBcsh\fP.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number, and to inform the sub-programs
+of the screen on which to draw.
+.TP 8
+.B XSCREENSAVER_WINDOW
+Passed to sub-programs to indicate the ID of the window on which they
+should draw. This is necessary on Xinerama/RANDR systems where
+multiple physical monitors share a single X11 "Screen".
+.TP 8
+.B PATH
+to find the sub-programs to run.
+.TP 8
+.B HOME
+for the directory in which to read the \fI.xscreensaver\fP file.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH UPGRADES
+The latest version of xscreensaver, an online version of this manual,
+and a FAQ can always be found at https://www.jwz.org/xscreensaver/
+.SH SEE ALSO
+.BR X (1),
+.BR Xsecurity (1),
+.BR xauth (1),
+.BR xdm (1),
+.BR gdm (1),
+.BR xhost (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-command (1),
+.BR xscreensaver\-gl\-helper (1),
+.BR xscreensaver\-getimage (1),
+.BR xscreensaver\-text (1).
+.SH COPYRIGHT
+Copyright \(co 1991-2018 by Jamie Zawinski.
+Permission to use, copy, modify, distribute, and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>. Written in late 1991; version 1.0 posted
+to comp.sources.x on 17-Aug-1992.
+
+Please let me know if you find any bugs or make any improvements.
+
+And a huge thank you to the hundreds of people who have contributed, in
+large ways and small, to the xscreensaver collection over the past
+two decades!
diff --git a/driver/xscreensaver.pam.in b/driver/xscreensaver.pam.in
new file mode 100644
index 0000000..c18fa9f
--- /dev/null
+++ b/driver/xscreensaver.pam.in
@@ -0,0 +1,13 @@
+#%PAM-1.0
+
+# Fedora Core 5:
+auth include system-auth
+
+# SuSE 9.0: (along with "configure --with-passwd-helper" and "unix2_chkpwd")
+# auth required pam_unix2.so nullok
+
+# Distant past:
+# auth required /lib/security/pam_pwdb.so shadow nullok
+
+# Account validation
+@COMMENT_PAM_CHECK_ACCOUNT@account include system-auth
diff --git a/driver/xset.c b/driver/xset.c
new file mode 100644
index 0000000..a381429
--- /dev/null
+++ b/driver/xset.c
@@ -0,0 +1,389 @@
+/* xset.c --- interacting with server extensions and the builtin screensaver.
+ * xscreensaver, Copyright (c) 1991-2008 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+#include <X11/Xos.h>
+
+/* This file doesn't need the Xt headers, so stub these types out... */
+#undef XtPointer
+#define XtAppContext void*
+#define XrmDatabase void*
+#define XtIntervalId void*
+#define XtPointer void*
+#define Widget void*
+
+#include "xscreensaver.h"
+
+#ifdef _VROOT_H_
+ERROR! You must not include vroot.h in this file.
+#endif
+
+
+/* MIT SCREEN-SAVER server extension hackery.
+ */
+
+#ifdef HAVE_MIT_SAVER_EXTENSION
+
+# include <X11/extensions/scrnsaver.h>
+
+static int
+ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
+{
+ return 0;
+}
+
+static void
+init_mit_saver_extension (saver_info *si)
+{
+ int i;
+ Pixmap *blank_pix = (Pixmap *) calloc (sizeof(Pixmap), si->nscreens);
+
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ XID kill_id = 0;
+ Atom kill_type = 0;
+ Window root = RootWindowOfScreen (ssi->screen);
+ blank_pix[i] = XCreatePixmap (si->dpy, root, 1, 1, 1);
+
+ /* Kill off the old MIT-SCREEN-SAVER client if there is one.
+ This tends to generate X errors, though (possibly due to a bug
+ in the server extension itself?) so just ignore errors here. */
+ if (XScreenSaverGetRegistered (si->dpy,
+ XScreenNumberOfScreen (ssi->screen),
+ &kill_id, &kill_type)
+ && kill_id != blank_pix[i])
+ {
+ XErrorHandler old_handler =
+ XSetErrorHandler (ignore_all_errors_ehandler);
+ XKillClient (si->dpy, kill_id);
+ XSync (si->dpy, False);
+ XSetErrorHandler (old_handler);
+ }
+ XScreenSaverSelectInput (si->dpy, root, ScreenSaverNotifyMask);
+ XScreenSaverRegister (si->dpy,
+ XScreenNumberOfScreen (ssi->screen),
+ (XID) blank_pix[i], XA_PIXMAP);
+ }
+ free(blank_pix);
+}
+#endif /* HAVE_MIT_SAVER_EXTENSION */
+
+
+#ifdef HAVE_XINPUT
+/* XInputExtension device support */
+
+Bool
+query_xinput_extension (saver_info *si)
+{
+ XExtCodes codes;
+ return XQueryExtension (si->dpy, INAME, &codes.major_opcode,
+ &codes.first_event, &codes.first_error);
+}
+
+void
+init_xinput_extension (saver_info *si)
+{
+ int i, ndevices;
+ int class;
+ XDeviceInfo *list;
+ XDevice *dev;
+ XAnyClassPtr pClass;
+ XEventClass *event_list;
+ int nevents = 0;
+
+ /* skip if already initialized */
+ if (si->num_xinput_devices && si->xinput_devices)
+ return;
+
+ si->num_xinput_devices = 0;
+
+ list = XListInputDevices (si->dpy, &ndevices);
+ if (list == NULL)
+ {
+ si->xinput_devices = NULL;
+ return;
+ }
+
+ /* We only care about 3 event types per device (DeviceButtonPress,
+ DeviceButtonRelease, and DeviceMotionNotify), hence the "* 3"
+ for the event count. */
+ event_list = calloc(ndevices * 3, sizeof(XEventClass));
+ if (event_list == NULL)
+ return;
+
+ si->xinput_devices = calloc(ndevices, sizeof(struct xinput_dev_info));
+ if (si->xinput_devices == NULL)
+ {
+ free(event_list);
+ return;
+ }
+
+ for (i = 0; i < ndevices; i++)
+ {
+ if ((list[i].use == IsXExtensionDevice)
+#ifdef IsXExtensionPointer
+ || (list[i].use == IsXExtensionPointer)
+#endif
+ )
+ {
+ struct xinput_dev_info *dev_info =
+ &si->xinput_devices[si->num_xinput_devices];
+ Bool device_we_want = False;
+
+ if (si->prefs.debug_p)
+ fprintf(stderr,
+ "Extension device #%2d: XID=%2d type=%3d name=\"%s\"\n",
+ i, (int) list[i].id, (int) list[i].type, list[i].name);
+
+ dev = XOpenDevice (si->dpy, list[i].id);
+ if (!dev)
+ continue;
+ dev_info->device = dev;
+
+ pClass = list[i].inputclassinfo;
+ for (class = 0; class < list[i].num_classes; class++)
+ {
+ switch (pClass->class)
+ {
+ case ButtonClass:
+ if (((XButtonInfo *) pClass)->num_buttons > 0)
+ {
+ /* Macros set values in the second & third arguments */
+ DeviceButtonPress (dev, si->xinput_DeviceButtonPress,
+ dev_info->press);
+ event_list[nevents++] = dev_info->press;
+
+ DeviceButtonRelease (dev, si->xinput_DeviceButtonRelease,
+ dev_info->release);
+ event_list[nevents++] = dev_info->release;
+ device_we_want = True;
+ }
+ break;
+
+ case ValuatorClass:
+ if (((XValuatorInfo *) pClass)->num_axes > 0)
+ {
+ DeviceMotionNotify (dev, si->xinput_DeviceMotionNotify,
+ dev_info->valuator);
+ event_list[nevents++] = dev_info->valuator;
+ device_we_want = True;
+ }
+ break;
+
+ default:
+ /* ignore other classes of devices/events */
+ break;
+ }
+
+ pClass = (XAnyClassPtr) & ((char *) pClass)[pClass->length];
+ }
+
+ if (device_we_want)
+ si->num_xinput_devices++;
+ else
+ XCloseDevice (si->dpy, dev);
+ }
+ }
+
+ if (list)
+ XFreeDeviceList (list);
+
+ if ((nevents == 0) || (si->num_xinput_devices == 0))
+ {
+ free(event_list);
+ free(si->xinput_devices);
+ si->xinput_devices = NULL;
+ si->num_xinput_devices = 0;
+ return;
+ }
+
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ Window root = RootWindowOfScreen (ssi->screen);
+ XSelectExtensionEvent (si->dpy, root, event_list, nevents);
+ }
+
+ free(event_list);
+}
+
+#if 0
+/* not used */
+static void
+close_xinput_extension (saver_info *si)
+{
+ int i;
+
+ for (i = 0; i < si->num_xinput_devices; i++)
+ XCloseDevice (si->dpy, si->xinput_devices[i].device);
+
+ free(si->xinput_devices);
+ si->xinput_devices = NULL;
+ si->num_xinput_devices = 0;
+}
+#endif
+#endif /* HAVE_XINPUT */
+
+
+/* SGI SCREEN_SAVER server extension hackery.
+ */
+
+#ifdef HAVE_SGI_SAVER_EXTENSION
+
+# include <X11/extensions/XScreenSaver.h>
+
+static void
+init_sgi_saver_extension (saver_info *si)
+{
+ saver_preferences *p = &si->prefs;
+ int i;
+ if (si->screen_blanked_p)
+ /* If you mess with this while the server thinks it's active,
+ the server crashes. */
+ return;
+
+ for (i = 0; i < si->nscreens; i++)
+ {
+ saver_screen_info *ssi = &si->screens[i];
+ XScreenSaverDisable (si->dpy, XScreenNumberOfScreen(ssi->screen));
+ if (! XScreenSaverEnable (si->dpy, XScreenNumberOfScreen(ssi->screen)))
+ {
+ fprintf (stderr,
+ "%s: SGI SCREEN_SAVER extension exists, but can't be initialized;\n\
+ perhaps some other screensaver program is already running?\n",
+ blurb());
+ si->using_sgi_saver_extension = False;
+ return;
+ }
+ }
+}
+
+#endif /* HAVE_SGI_SAVER_EXTENSION */
+
+
+
+/* Figuring out what the appropriate XSetScreenSaver() parameters are
+ (one wouldn't expect this to be rocket science.)
+ */
+
+void
+disable_builtin_screensaver (saver_info *si, Bool unblank_screen_p)
+{
+ saver_preferences *p = &si->prefs;
+ int current_server_timeout, current_server_interval;
+ int current_prefer_blank, current_allow_exp;
+ int desired_server_timeout, desired_server_interval;
+ int desired_prefer_blank, desired_allow_exp;
+
+ XGetScreenSaver (si->dpy, &current_server_timeout, &current_server_interval,
+ &current_prefer_blank, &current_allow_exp);
+
+ desired_server_timeout = current_server_timeout;
+ desired_server_interval = current_server_interval;
+ desired_prefer_blank = current_prefer_blank;
+ desired_allow_exp = current_allow_exp;
+
+ /* On SGIs, if interval is non-zero, it is the number of seconds after
+ screen saving starts at which the monitor should be powered down.
+ Obviously I don't want that, so set it to 0 (meaning "never".)
+
+ Power saving is disabled if DontPreferBlanking, but in that case,
+ we don't get extension events either. So we can't turn it off that way.
+
+ Note: if you're running Irix 6.3 (O2), you may find that your monitor is
+ powering down anyway, regardless of the xset settings. This is fixed by
+ installing SGI patches 2447 and 2537.
+ */
+ desired_server_interval = 0;
+
+ /* I suspect (but am not sure) that DontAllowExposures might have
+ something to do with powering off the monitor as well, at least
+ on some systems that don't support XDPMS? Who knows... */
+ desired_allow_exp = AllowExposures;
+
+ if (si->using_mit_saver_extension || si->using_sgi_saver_extension)
+ {
+ desired_server_timeout = (p->timeout / 1000);
+
+ /* The SGI extension won't give us events unless blanking is on.
+ I think (unsure right now) that the MIT extension is the opposite. */
+ if (si->using_sgi_saver_extension)
+ desired_prefer_blank = PreferBlanking;
+ else
+ desired_prefer_blank = DontPreferBlanking;
+ }
+ else
+ {
+ /* When we're not using an extension, set the server-side timeout to 0,
+ so that the server never gets involved with screen blanking, and we
+ do it all ourselves. (However, when we *are* using an extension,
+ we tell the server when to notify us, and rather than blanking the
+ screen, the server will send us an X event telling us to blank.)
+ */
+ desired_server_timeout = 0;
+ }
+
+ /* XSetScreenSaver() generates BadValue if either timeout parameter
+ exceeds 15 bits (signed short.) That is 09:06:07.
+ */
+ if (desired_server_timeout > 0x7FFF) desired_server_timeout = 0x7FFF;
+ if (desired_server_interval > 0x7FFF) desired_server_interval = 0x7FFF;
+
+ if (desired_server_timeout != current_server_timeout ||
+ desired_server_interval != current_server_interval ||
+ desired_prefer_blank != current_prefer_blank ||
+ desired_allow_exp != current_allow_exp)
+ {
+ if (p->verbose_p)
+ fprintf (stderr,
+ "%s: disabling server builtin screensaver:\n"
+ "%s: (xset s %d %d; xset s %s; xset s %s)\n",
+ blurb(), blurb(),
+ desired_server_timeout, desired_server_interval,
+ (desired_prefer_blank ? "blank" : "noblank"),
+ (desired_allow_exp ? "expose" : "noexpose"));
+
+ XSetScreenSaver (si->dpy,
+ desired_server_timeout, desired_server_interval,
+ desired_prefer_blank, desired_allow_exp);
+ XSync(si->dpy, False);
+ }
+
+
+#if defined(HAVE_MIT_SAVER_EXTENSION) || defined(HAVE_SGI_SAVER_EXTENSION)
+ {
+ static Bool extension_initted = False;
+ if (!extension_initted)
+ {
+ extension_initted = True;
+# ifdef HAVE_MIT_SAVER_EXTENSION
+ if (si->using_mit_saver_extension) init_mit_saver_extension(si);
+# endif
+# ifdef HAVE_SGI_SAVER_EXTENSION
+ if (si->using_sgi_saver_extension) init_sgi_saver_extension(si);
+# endif
+ }
+ }
+#endif /* HAVE_MIT_SAVER_EXTENSION || HAVE_SGI_SAVER_EXTENSION */
+
+ if (unblank_screen_p)
+ /* Turn off the server builtin saver if it is now running. */
+ XForceScreenSaver (si->dpy, ScreenSaverReset);
+}
diff --git a/hacks/.gdbinit b/hacks/.gdbinit
new file mode 100644
index 0000000..5649178
--- /dev/null
+++ b/hacks/.gdbinit
@@ -0,0 +1,12 @@
+set args -geom =800x600+0+0 -sync
+set env MallocScribble 1
+set env MallocPreScribble 1
+set env MallocErrorAbort 1
+set env MallocCheckHeapAbort 1
+set env MallocGuardEdges 1
+#set env MallocCheckHeapStart 130000
+#set env MallocCheckHeapEach 1
+b screenhack_ehandler
+b malloc_error_break
+b exit
+b abort
diff --git a/hacks/Makefile.in b/hacks/Makefile.in
new file mode 100644
index 0000000..4556872
--- /dev/null
+++ b/hacks/Makefile.in
@@ -0,0 +1,3263 @@
+# hacks/Makefile.in --- xscreensaver, Copyright (c) 1997-2015 Jamie Zawinski.
+# the `../configure' script generates `hacks/Makefile' from this file.
+
+@SET_MAKE@
+.SUFFIXES:
+.SUFFIXES: .c .o
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+top_srcdir = @top_srcdir@
+top_builddir = ..
+
+install_prefix =
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+datarootdir = @datarootdir@
+datadir = @datadir@
+mandir = @mandir@
+libexecdir = @libexecdir@
+mansuffix = 6
+manNdir = $(mandir)/man$(mansuffix)
+
+HACKDIR = @HACKDIR@
+HACK_CONF_DIR = @HACK_CONF_DIR@
+
+CC = @CC@
+CFLAGS = @CFLAGS@
+LDFLAGS = @LDFLAGS@
+DEFS = -DSTANDALONE @DEFS@
+LIBS = @LIBS@
+PERL = @PERL@
+
+THREAD_LIBS = @PTHREAD_LIBS@
+THREAD_CFLAGS = @PTHREAD_CFLAGS@
+
+DEPEND = @DEPEND@
+DEPEND_FLAGS = @DEPEND_FLAGS@
+DEPEND_DEFINES = @DEPEND_DEFINES@
+
+SHELL = /bin/sh
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_DIRS = @INSTALL_DIRS@
+
+X_CFLAGS = @X_CFLAGS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+XMU_LIBS = @XMU_LIBS@
+XFT_LIBS = @XFT_LIBS@
+
+# Note: see comment in ../driver/Makefile.in for explanation of X_LIBS, etc.
+#
+HACK_PRE = $(LIBS) $(X_LIBS)
+HACK_POST = $(X_PRE_LIBS) $(XFT_LIBS) -lXt -lX11 $(XMU_LIBS) -lXext $(X_EXTRA_LIBS) -lm
+HACK_LIBS = $(HACK_PRE) @ANIM_LIBS@ @HACK_LIBS@ $(HACK_POST)
+PNG_LIBS = $(HACK_PRE) @PNG_LIBS@ @HACK_LIBS@ $(HACK_POST)
+JPEG_LIBS = @JPEG_LIBS@
+XLOCK_LIBS = $(HACK_LIBS)
+TEXT_LIBS = @PTY_LIBS@
+
+UTILS_SRC = $(srcdir)/../utils
+UTILS_BIN = ../utils
+HACK_BIN = .
+
+INCLUDES_1 = -I. -I$(srcdir) -I$(UTILS_SRC) -I..
+INCLUDES = $(INCLUDES_1) @INCLUDES@
+
+UTIL_SRCS = $(UTILS_SRC)/alpha.c $(UTILS_SRC)/colors.c \
+ $(UTILS_SRC)/grabclient.c \
+ $(UTILS_SRC)/hsv.c $(UTILS_SRC)/resources.c \
+ $(UTILS_SRC)/spline.c $(UTILS_SRC)/usleep.c \
+ $(UTILS_SRC)/visual.c \
+ $(UTILS_SRC)/yarandom.c $(UTILS_SRC)/erase.c \
+ $(UTILS_SRC)/xshm.c $(UTILS_SRC)/xdbe.c \
+ $(UTILS_SRC)/textclient.c $(UTILS_SRC)/aligned_malloc.c \
+ $(UTILS_SRC)/thread_util.c $(UTILS_SRC)/pow2.c \
+ $(UTILS_SRC)/font-retry.c
+UTIL_OBJS = $(UTILS_BIN)/alpha.o $(UTILS_BIN)/colors.o \
+ $(UTILS_BIN)/grabclient.o \
+ $(UTILS_BIN)/hsv.o $(UTILS_BIN)/resources.o \
+ $(UTILS_BIN)/spline.o $(UTILS_BIN)/usleep.o \
+ $(UTILS_BIN)/visual.o \
+ $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/erase.o \
+ $(UTILS_BIN)/xshm.o $(UTILS_BIN)/xdbe.o \
+ $(UTILS_BIN)/colorbars.o \
+ $(UTILS_BIN)/textclient.o $(UTILS_BIN)/aligned_malloc.o \
+ $(UTILS_BIN)/thread_util.o $(UTILS_BIN)/pow2.o \
+ $(UTILS_BIN)/xft.o $(UTILS_BIN)/utf8wc.o \
+ $(UTILS_BIN)/font-retry-xft.o
+
+SRCS = attraction.c blitspin.c bouboule.c braid.c bubbles.c \
+ bubbles-default.c decayscreen.c deco.c drift.c flag.c \
+ flame.c forest.c vines.c galaxy.c grav.c greynetic.c \
+ halo.c helix.c hopalong.c hypercube.c ifs.c imsmap.c \
+ julia.c kaleidescope.c laser.c lightning.c lisa.c lmorph.c \
+ maze.c moire.c noseguy.c pedal.c penrose.c pyro.c qix.c \
+ rocks.c rorschach.c screenhack.c sierpinski.c slidescreen.c \
+ slip.c sphere.c spiral.c strange.c swirl.c xlockmore.c \
+ fps.c goop.c starfish.c munch.c fadeplot.c \
+ rd-bomb.c coral.c mountain.c triangle.c lissie.c worm.c \
+ rotor.c ant.c xjack.c xlyap.c xscreensaver-sgigl.c \
+ cynosure.c moire2.c flow.c epicycle.c interference.c \
+ truchet.c bsod.c crystal.c discrete.c distort.c kumppa.c \
+ demon.c loop.c t3d.c penetrate.c deluxe.c compass.c \
+ squiral.c xflame.c wander.c spotlight.c critical.c \
+ phosphor.c xmatrix.c petri.c shadebobs.c xsublim.c ccurve.c \
+ blaster.c bumps.c ripples.c xspirograph.c \
+ nerverot.c xrayswarm.c hyperball.c zoom.c whirlwindwarp.c \
+ rotzoomer.c whirlygig.c speedmine.c vermiculate.c \
+ ximage-loader.c webcollage-helper.c twang.c apollonian.c \
+ euler2d.c juggle.c polyominoes.c thornbird.c fluidballs.c \
+ anemone.c halftone.c metaballs.c eruption.c popsquares.c \
+ barcode.c piecewise.c cloudlife.c fontglide.c apple2.c \
+ apple2-main.c analogtv.c xanalogtv.c pong.c filmleader.c \
+ wormhole.c pacman.c pacman_ai.c pacman_level.c \
+ fuzzyflakes.c anemotaxis.c memscroller.c substrate.c \
+ intermomentary.c fireworkx.c fiberlamp.c \
+ boxfit.c interaggregate.c celtic.c cwaves.c m6502.c \
+ asm6502.c abstractile.c lcdscrub.c hexadrop.c \
+ tessellimage.c delaunay.c recanim.c binaryring.c \
+ glitchpeg.c vfeedback.c \
+ webcollage-cocoa.m webcollage-helper-cocoa.m testx11.c
+SCRIPTS = vidwhacker webcollage ljlatest
+
+# Programs that are mentioned in XScreenSaver.ad, and that have XML files,
+# but that are not shipped with xscreensaver itself.
+#
+EXTERNALS = cosmos electricsheep fireflies goban \
+ sphereeversion ssystem xaos xdaliclock xearth xfishtank \
+ xmountains xplanet xsnow
+
+OBJS = attraction.o blitspin.o bouboule.o braid.o bubbles.o \
+ bubbles-default.o decayscreen.o deco.o drift.o flag.o \
+ flame.o forest.o vines.o galaxy.o grav.o greynetic.o \
+ halo.o helix.o hopalong.o hypercube.o ifs.o imsmap.o \
+ julia.o kaleidescope.o laser.o lightning.o lisa.o lmorph.o \
+ maze.o moire.o noseguy.o pedal.o penrose.o pyro.o qix.o \
+ rocks.o rorschach.o screenhack.o sierpinski.o slidescreen.o \
+ slip.o sphere.o spiral.o strange.o swirl.o xlockmore.o \
+ fps.o goop.o starfish.o munch.o fadeplot.o \
+ rd-bomb.o coral.o mountain.o triangle.o lissie.o worm.o \
+ rotor.o ant.o xjack.o xlyap.o xscreensaver-sgigl.o \
+ cynosure.o moire2.o flow.o epicycle.o interference.o \
+ truchet.o bsod.o crystal.o discrete.o distort.o kumppa.o \
+ demon.o loop.o t3d.o penetrate.o deluxe.o compass.o \
+ squiral.o xflame.o wander.o spotlight.o critical.o \
+ phosphor.o xmatrix.o petri.o shadebobs.o xsublim.o ccurve.o \
+ blaster.o bumps.o ripples.o xspirograph.o \
+ nerverot.o xrayswarm.o hyperball.o zoom.o whirlwindwarp.o \
+ rotzoomer.o whirlygig.o speedmine.o vermiculate.o \
+ ximage-loader.o webcollage-helper.o twang.o apollonian.o \
+ euler2d.o juggle.o polyominoes.o thornbird.o fluidballs.o \
+ anemone.o halftone.o metaballs.o eruption.o popsquares.o \
+ barcode.o piecewise.o cloudlife.o fontglide.o apple2.o \
+ apple2-main.o analogtv.o xanalogtv.o pong.o filmleader.o \
+ wormhole.o pacman.o pacman_ai.o pacman_level.o \
+ fuzzyflakes.o anemotaxis.o memscroller.o substrate.o \
+ intermomentary.o fireworkx.o fiberlamp.o boxfit.o \
+ interaggregate.o celtic.o cwaves.o webcollage-cocoa.o \
+ webcollage-helper-cocoa.o m6502.o asm6502.o abstractile.o \
+ lcdscrub.o hexadrop.o tessellimage.o delaunay.o recanim.o \
+ binaryring.o glitchpeg.o vfeedback.o testx11.o
+
+EXES = attraction blitspin bouboule braid decayscreen deco \
+ drift flame galaxy grav greynetic halo \
+ helix hopalong ifs imsmap julia kaleidescope \
+ maze moire noseguy pedal \
+ penrose pyro qix rocks rorschach sierpinski slidescreen \
+ slip strange swirl goop starfish munch \
+ fadeplot rd-bomb coral mountain triangle \
+ xjack xlyap cynosure moire2 flow epicycle \
+ interference truchet bsod crystal discrete distort kumppa \
+ demon loop penetrate deluxe compass squiral xflame \
+ wander spotlight phosphor xmatrix petri shadebobs \
+ ccurve blaster bumps ripples xspirograph \
+ nerverot xrayswarm zoom whirlwindwarp rotzoomer \
+ speedmine vermiculate twang apollonian euler2d \
+ polyominoes thornbird fluidballs anemone halftone \
+ metaballs eruption popsquares barcode piecewise cloudlife \
+ fontglide apple2 xanalogtv pong filmleader wormhole \
+ pacman fuzzyflakes anemotaxis memscroller substrate \
+ intermomentary fireworkx fiberlamp boxfit interaggregate \
+ celtic cwaves m6502 abstractile lcdscrub hexadrop \
+ tessellimage binaryring glitchpeg vfeedback \
+ @JPEG_EXES@
+JPEG_EXES = webcollage-helper
+
+RETIRED_EXES = ant bubbles critical flag forest hyperball hypercube laser \
+ lightning lisa lissie lmorph rotor sphere spiral t3d vines \
+ whirlygig worm xsublim juggle testx11
+
+HACK_OBJS_1 = fps.o $(UTILS_BIN)/resources.o $(UTILS_BIN)/visual.o \
+ $(UTILS_BIN)/usleep.o $(UTILS_BIN)/yarandom.o \
+ $(UTILS_BIN)/utf8wc.o $(UTILS_BIN)/font-retry-xft.o \
+ @XMU_OBJS@ @XFT_OBJS@ @ANIM_OBJS@
+HACK_OBJS = screenhack.o $(HACK_OBJS_1)
+XLOCK_OBJS = screenhack.o xlockmore.o $(COLOR_OBJS) $(HACK_OBJS_1) \
+ $(ERASE)
+COLOR_OBJS = $(UTILS_BIN)/hsv.o $(UTILS_BIN)/colors.o
+GRAB_OBJS = $(UTILS_BIN)/grabclient.o
+XSHM_OBJS = $(UTILS_BIN)/xshm.o
+XDBE_OBJS = $(UTILS_BIN)/xdbe.o
+ANIM_OBJS = recanim.o
+ANIM_LIBS = @PNG_LIBS@
+THREAD_OBJS = $(UTILS_BIN)/aligned_malloc.o $(UTILS_BIN)/thread_util.o
+
+HDRS = screenhack.h screenhackI.h fps.h fpsI.h xlockmore.h \
+ xlockmoreI.h automata.h bubbles.h ximage-loader.h \
+ apple2.h analogtv.h pacman.h pacman_ai.h pacman_level.h \
+ asm6502.h delaunay.h recanim.h
+MEN = anemone.man apollonian.man attraction.man \
+ blaster.man blitspin.man bouboule.man braid.man bsod.man \
+ bumps.man ccurve.man compass.man coral.man \
+ crystal.man cynosure.man decayscreen.man \
+ deco.man deluxe.man demon.man discrete.man distort.man \
+ drift.man epicycle.man euler2d.man fadeplot.man \
+ flame.man flow.man fluidballs.man galaxy.man \
+ goop.man grav.man greynetic.man halo.man helix.man \
+ hopalong.man ifs.man imsmap.man \
+ interference.man julia.man \
+ kaleidescope.man kumppa.man \
+ loop.man maze.man moire.man \
+ moire2.man mountain.man munch.man nerverot.man noseguy.man \
+ pedal.man penetrate.man penrose.man petri.man phosphor.man \
+ polyominoes.man pyro.man qix.man rd-bomb.man ripples.man \
+ rocks.man rorschach.man rotzoomer.man \
+ shadebobs.man sierpinski.man slidescreen.man slip.man \
+ speedmine.man \
+ spotlight.man squiral.man starfish.man strange.man \
+ swirl.man thornbird.man triangle.man truchet.man \
+ twang.man vermiculate.man vidwhacker.man \
+ wander.man webcollage.man whirlwindwarp.man \
+ xflame.man xjack.man xlyap.man xmatrix.man \
+ xrayswarm.man xspirograph.man \
+ zoom.man halftone.man eruption.man metaballs.man \
+ barcode.man piecewise.man cloudlife.man ljlatest.man \
+ fontglide.man apple2.man xanalogtv.man filmleader.man \
+ pong.man wormhole.man pacman.man fuzzyflakes.man \
+ anemotaxis.man memscroller.man substrate.man \
+ intermomentary.man fireworkx.man fiberlamp.man boxfit.man \
+ interaggregate.man celtic.man cwaves.man abstractile.man \
+ lcdscrub.man hexadrop.man tessellimage.man binaryring.man \
+ glitchpeg.man vfeedback.man
+
+RETIRED_MEN = ant.man bubbles.man critical.man flag.man forest.man \
+ laser.man lightning.man lisa.man lissie.man lmorph.man \
+ rotor.man sphere.man spiral.man t3d.man vines.man \
+ whirlygig.man worm.man xsublim.man juggle.man \
+ hypercube.man hyperball.man
+
+STAR = *
+EXTRAS = README Makefile.in xml2man.pl m6502.sh .gdbinit \
+ euler2d.tex check-configs.pl munge-ad.pl \
+ config/README \
+ config/$(STAR).xml \
+ config/$(STAR).dtd \
+ config/$(STAR).xsd \
+
+VMSFILES = compile_axp.com compile_decc.com link_axp.com link_decc.com \
+ vms_axp.opt vms_axp_12.opt vms_decc.opt vms_decc_12.opt
+
+TARFILES = $(SRCS) $(HDRS) $(SCRIPTS) $(MEN) $(RETIRED_MEN) \
+ $(EXTRAS) $(VMSFILES)
+
+
+default: all
+all: $(EXES) $(RETIRED_EXES)
+
+install: install-program install-scripts install-xml install-man
+uninstall: uninstall-program uninstall-xml uninstall-man
+
+install-strip:
+ $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \
+ install
+
+# the hacks, in $HACKDIR
+install-program:: $(EXES)
+ @if [ ! -d $(install_prefix)$(HACKDIR) ]; then \
+ $(INSTALL_DIRS) $(install_prefix)$(HACKDIR) ; \
+ fi ; \
+ for program in $(EXES); do \
+ echo $(INSTALL_PROGRAM) $$program \
+ $(install_prefix)$(HACKDIR)/$$program ; \
+ $(INSTALL_PROGRAM) $$program \
+ $(install_prefix)$(HACKDIR)/$$program ; \
+ done
+
+install-scripts: $(SCRIPTS) munge-scripts
+ @for program in $(SCRIPTS); do \
+ if [ -r $$program ] ; then \
+ p=$$program ; \
+ else \
+ p=$(srcdir)/$$program ; \
+ fi ; \
+ echo $(INSTALL_SCRIPT) $$p \
+ $(install_prefix)$(HACKDIR)/$$program ; \
+ $(INSTALL_SCRIPT) $$p \
+ $(install_prefix)$(HACKDIR)/$$program ; \
+ done
+
+munge-scripts: $(SCRIPTS)
+ @tmp=/tmp/mf.$$$$ ; \
+ perl="${PERL}" ; \
+ rm -f $$tmp ; \
+ for program in $(SCRIPTS); do \
+ sed "s@^\(#!\)\(/[^ ]*/perl[^ ]*\)\(.*\)\$$@\1$$perl\3@" \
+ < $(srcdir)/$$program > $$tmp ; \
+ if ! cmp -s $(srcdir)/$$program $$tmp ; then \
+ echo "$$program: setting interpreter to $$perl" >&2 ; \
+ cat $$tmp > ./$$program ; \
+ fi ; \
+ done ; \
+ rm -f $$tmp
+
+# When installing man pages, we install "foo.man" as "foo.N" and update
+# the .TH line in the installed file with one like
+#
+# .TH XScreenSaver N "V.VV (DD-MMM-YYYY)" "X Version 11"
+#
+# where N is the manual section suffix.
+#
+install-man: $(MEN)
+ @men="$(MEN)" ; \
+ U=$(UTILS_SRC)/version.h ; \
+ V=`sed -n 's/.*xscreensaver \([0-9]\.[^)]*)\).*/\1/p' < $$U` ; \
+ T=/tmp/xs$$$$.$(mansuffix) ; \
+ TH=".TH XScreenSaver $(mansuffix) \"$$V\" \"X Version 11\"" ; \
+ echo "installing man pages: $$TH" ; \
+ \
+ if [ ! -d $(install_prefix)$(manNdir) ]; then \
+ $(INSTALL_DIRS) $(install_prefix)$(manNdir) ; \
+ fi ; \
+ \
+ for man in $$men; do \
+ instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \
+ manbase=`echo $$man | sed 's/\.man$$//'` ; \
+ TH=".TH $$manbase $(mansuffix) \"$$V\" \"X Version 11\" \"XScreenSaver manual\"" ; \
+ sed -e "s/^\.TH.*/$$TH/" \
+ -e 's@(MANSUFFIX)@($(mansuffix))@g' \
+ < $(srcdir)/$$man > $$T ; \
+ echo $(INSTALL_DATA) $(srcdir)/$$man \
+ $(install_prefix)$(manNdir)/$$instname ; \
+ $(INSTALL_DATA) $$T \
+ $(install_prefix)$(manNdir)/$$instname ; \
+ done ; \
+ rm -f $$T
+
+install-xml:
+ @dest=$(install_prefix)$(HACK_CONF_DIR) ; \
+ if [ ! -d $$dest ]; then \
+ $(INSTALL_DIRS) $$dest ; \
+ fi ; \
+ src=$(srcdir)/config ; \
+ for file in $(EXES) $(SCRIPTS) $(EXTERNALS) ; do \
+ if [ -f $$src/$$file.xml ]; then \
+ echo $(INSTALL_DATA) $$src/$$file.xml $$dest/$$file.xml ; \
+ $(INSTALL_DATA) $$src/$$file.xml $$dest/$$file.xml ; \
+ fi ; \
+ done
+
+uninstall-program:
+ @for program in $(EXES) $(RETIRED_EXES) $(SCRIPTS); do \
+ echo rm -f $(install_prefix)$(HACKDIR)/$$program ; \
+ rm -f $(install_prefix)$(HACKDIR)/$$program ; \
+ done
+
+uninstall-man:
+ @men="$(MEN) $(RETIRED_MEN)" ; \
+ for man in $$men; do \
+ instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \
+ echo rm -f $(install_prefix)$(manNdir)/$$instname* ; \
+ rm -f $(install_prefix)$(manNdir)/$$instname* ; \
+ done
+
+uninstall-xml:
+ @dest=$(install_prefix)$(HACK_CONF_DIR) ; \
+ for file in $(EXES) $(RETIRED_EXES) $(SCRIPTS) $(EXTERNALS) ; do \
+ echo rm -f $$dest/$$file.xml ; \
+ rm -f $$dest/$$file.xml ; \
+ done
+
+clean::
+ -rm -f *.o a.out core $(EXES) $(RETIRED_EXES) m6502.h
+
+distclean: clean
+ -rm -f Makefile TAGS *~ "#"*
+
+# Adds all current dependencies to Makefile
+depend:
+ $(DEPEND) -s '# DO NOT DELETE: updated by make depend' \
+ $(DEPEND_FLAGS) -- \
+ $(INCLUDES) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \
+ $(SRCS)
+
+# Adds some dependencies to Makefile.in -- not totally accurate, but pretty
+# close. This excludes dependencies on files in /usr/include, etc. It tries
+# to include only dependencies on files which are themselves a part of this
+# package.
+distdepend:: m6502.h
+ @echo updating dependencies in `pwd`/Makefile.in... ; \
+ $(DEPEND) -w 0 -f - \
+ -s '# DO NOT DELETE: updated by make distdepend' $(DEPEND_FLAGS) -- \
+ $(INCLUDES_1) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \
+ $(SRCS) 2>/dev/null | \
+ sort -d | \
+ ( \
+ awk '/^# .*Makefile.in ---/,/^# DO .*distdepend/' < Makefile.in ; \
+ sed -e '/^#.*/d' \
+ -e 's@ \./@ @g;s@ /[^ ]*@@g;/^.*:$$/d' \
+ -e 's@\.\./utils@$$(UTILS_SRC)@g' \
+ -e 's@ \([^$$]\)@ $$(srcdir)/\1@g' \
+ -e 's@ $$(srcdir)/\(.*config.h\)@ \1@g' \
+ -e 's@ $$(srcdir)/\(m6502.h\)@ \1@g' ; \
+ echo '' \
+ ) > /tmp/distdepend.$$$$ && \
+ mv /tmp/distdepend.$$$$ Makefile.in
+
+TAGS: tags
+tags:
+ find $(srcdir) -name '*.[chly]' -print | xargs etags -a
+
+echo_tarfiles:
+ @echo $(TARFILES)
+
+check_men:
+ @badmen="" ; \
+ for exe in $(EXES) $(SCRIPTS); do \
+ if ! [ -f $(srcdir)/$$exe.man \
+ -o "$$exe" = webcollage-helper ]; then \
+ badmen="$$badmen $$exe" ; \
+ fi ; \
+ done ; \
+ if [ -n "$$badmen" ]; then \
+ echo "" ; \
+ echo "Warning: The following programs have no manuals:" ; \
+ echo "" ; \
+ for m in $$badmen ; do \
+ echo " $$m" ; \
+ done ; \
+ fi
+
+validate_xml:
+ @echo "Validating XML..." ; \
+ cd $(srcdir) ; ./check-configs.pl $(EXES)
+
+munge_ad_file:
+ @echo "Updating hack list in XScreenSaver.ad.in..." ; \
+ cd $(srcdir) ; ./munge-ad.pl ../driver/XScreenSaver.ad.in
+
+
+# Rules for generating the VMS makefiles on Unix, so that it doesn't have to
+# be done by hand...
+#
+VMS_AXP_COMPILE_1=$$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE
+VMS_AXP_COMPILE_2=)/INCL=([],[-],[-.UTILS])
+
+compile_axp.com: Makefile.in
+ @echo generating $@ from $<... ; \
+ ( for c in $(SRCS) ; do \
+ c=`echo $$c | tr a-z A-Z` ; \
+ echo "$(VMS_AXP_COMPILE_1)$(VMS_AXP_COMPILE_2) $$c" ; \
+ done ; \
+ ) | sort -d > $@
+
+compile_decc.com: compile_axp.com
+ @echo generating $@ from $<... ; \
+ sed 's/axp/decc/g' < $< > $@
+
+#### TODO: generating link_axp.com is kinda tricky...
+
+link_decc.com: link_axp.com
+ @echo generating $@ from $<... ; \
+ sed 's/axp/decc/g' < $< > $@
+
+$(srcdir)/../setup.com: Makefile.in
+ @echo generating $@ from $<... ; \
+ ( echo '$$! Xscreensaver - definition of various DCL symbols' ; \
+ echo '$$ set NOON' ; \
+ echo '$$ set def [.HACKS]' ; \
+ echo '$$ mydisk = f$$trnlmn("SYS$$DISK")' ; \
+ echo '$$ mydir = mydisk+f$$directory()' ; \
+ ( for c in $(EXES) ; do \
+ c2="$${c} " ; \
+ c2=`echo "$${c2}" | sed 's/^\(........*\) $$/\1/'` ; \
+ echo '$$' "$${c2}:== $$'mydir'$${c}" ; \
+ done ; \
+ ) | sort -d ; \
+ echo '$$ set def [-.DRIVER]' ; \
+ echo '$$ mydir = mydisk+f$$directory()' ; \
+ echo "$$ xscreensaver :== $$'mydir'xscreensaver" ; \
+ echo "$$ xscreen*command :== $$'mydir'xscreensaver-command" ; \
+ echo '$$ set def [-]' ; \
+ echo '$$ exit' ; \
+ ) > $@
+
+distdepend:: compile_axp.com compile_decc.com
+distdepend:: link_axp.com link_decc.com
+distdepend:: $(srcdir)/../setup.com
+distdepend:: check_men validate_xml munge_ad_file
+
+
+# Rules for noticing when the objects from the utils directory are out of
+# date with respect to their sources, and going and building them according
+# to the rules in their own Makefile...
+#
+$(UTILS_BIN)/alpha.o: $(UTILS_SRC)/alpha.c
+$(UTILS_BIN)/colors.o: $(UTILS_SRC)/colors.c
+$(UTILS_BIN)/grabclient.o: $(UTILS_SRC)/grabclient.c
+$(UTILS_BIN)/hsv.o: $(UTILS_SRC)/hsv.c
+$(UTILS_BIN)/resources.o: $(UTILS_SRC)/resources.c
+$(UTILS_BIN)/spline.o: $(UTILS_SRC)/spline.c
+$(UTILS_BIN)/usleep.o: $(UTILS_SRC)/usleep.c
+$(UTILS_BIN)/visual.o: $(UTILS_SRC)/visual.c
+$(UTILS_BIN)/xmu.o: $(UTILS_SRC)/xmu.c
+$(UTILS_BIN)/xft.o: $(UTILS_SRC)/xft.c
+$(UTILS_BIN)/utf8wc.o: $(UTILS_SRC)/utf8wc.c
+$(UTILS_BIN)/yarandom.o: $(UTILS_SRC)/yarandom.c
+$(UTILS_BIN)/erase.o: $(UTILS_SRC)/erase.c
+$(UTILS_BIN)/xshm.o: $(UTILS_SRC)/xshm.c
+$(UTILS_BIN)/xdbe.o: $(UTILS_SRC)/xdbe.c
+$(UTILS_BIN)/textclient.o: $(UTILS_SRC)/textclient.c
+$(UTILS_BIN)/aligned_malloc.o: $(UTILS_SRC)/aligned_malloc.c
+$(UTILS_BIN)/thread_util.o: $(UTILS_SRC)/thread_util.c
+$(UTILS_BIN)/pow2.o: $(UTILS_SRC)/pow2.c
+$(UTILS_BIN)/font-retry-xft.o: $(UTILS_SRC)/font-retry.c
+
+$(UTIL_OBJS):
+ cd $(UTILS_BIN) ; \
+ $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)"
+
+# How we build object files in this directory.
+.c.o:
+ $(CC) -c $(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) $<
+
+
+# Make sure these are regenerated when the version number ticks.
+screenhack.o: $(UTILS_SRC)/version.h
+
+# Some abbreviations to keep the lines short...
+PNG = ximage-loader.o
+ALP = $(UTILS_BIN)/alpha.o
+HSV = $(UTILS_BIN)/hsv.o
+SPL = $(UTILS_BIN)/spline.o
+GRAB = $(GRAB_OBJS)
+ERASE = $(UTILS_BIN)/erase.o
+COL = $(COLOR_OBJS)
+SHM = $(XSHM_OBJS) $(THREAD_OBJS)
+DBE = $(XDBE_OBJS)
+BARS = $(UTILS_BIN)/colorbars.o
+THRO = $(THREAD_OBJS)
+THRL = $(THREAD_CFLAGS) $(THREAD_LIBS)
+ATV = analogtv.o $(SHM)
+APPLE2 = apple2.o $(ATV)
+TEXT = $(UTILS_BIN)/textclient.o
+
+CC_HACK = $(CC) $(LDFLAGS)
+
+xscreensaver-sgigl: xscreensaver-sgigl.c
+ $(CC) $(LDFLAGS) -o $@ $< -I$(UTILS_SRC) $(HACK_PRE) \
+ $(XMU_LIBS) -lX11 -lXext $(X_EXTRA_LIBS) -lm
+
+test-utf8wc: $(UTILS_SRC)/utf8wc.c
+ $(CC) $(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) $(LDFLAGS)\
+ -o $@ -DSELFTEST $<
+
+# Make sure the images have been packaged. This is the first one hit:
+$(HACK_BIN)/images/gen/nose-f1_png.h:
+ cd $(srcdir)/images && $(MAKE)
+
+# The rules for those hacks which follow the `screenhack.c' API.
+# If make wasn't such an utter abomination, these could all be combined
+# into one rule, but we don't live in such a perfect world. The $< rule
+# is pretty much useless in the face of more than one dependency, as far
+# as I can tell.
+#
+attraction: attraction.o $(HACK_OBJS) $(COL) $(SPL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
+
+binaryring: binaryring.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+blitspin: blitspin.o $(HACK_OBJS) $(GRAB) $(PNG) $(UTILS_BIN)/pow2.o
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(PNG) $(UTILS_BIN)/pow2.o $(PNG_LIBS)
+
+bubbles: bubbles.o $(HACK_OBJS) bubbles-default.o $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) bubbles-default.o $(PNG) $(PNG_LIBS)
+
+decayscreen: decayscreen.o $(HACK_OBJS) $(GRAB)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(HACK_LIBS)
+
+deco: deco.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+flame: flame.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+greynetic: greynetic.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+halo: halo.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+helix: helix.o $(HACK_OBJS) $(HSV) $(ERASE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HSV) $(ERASE) $(HACK_LIBS)
+
+hypercube: hypercube.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+imsmap: imsmap.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+kaleidescope: kaleidescope.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+lmorph: lmorph.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+maze: maze.o $(HACK_OBJS) $(ERASE) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(ERASE) $(PNG) $(PNG_LIBS)
+
+moire: moire.o $(HACK_OBJS) $(COL) $(SHM)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SHM) $(HACK_LIBS) $(THRL)
+
+moire2: moire2.o $(HACK_OBJS) $(COL) $(DBE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(DBE) $(HACK_LIBS)
+
+noseguy: noseguy.o $(HACK_OBJS) $(PNG) $(TEXT)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(PNG) $(TEXT) $(PNG_LIBS) $(TEXT_LIBS)
+
+pedal: pedal.o $(HACK_OBJS) $(HSV) $(ERASE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HSV) $(ERASE) $(HACK_LIBS)
+
+pyro: pyro.o $(HACK_OBJS) $(HSV)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HSV) $(HACK_LIBS)
+
+qix: qix.o $(HACK_OBJS) $(HSV) $(ALP)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HSV) $(ALP) $(HACK_LIBS)
+
+rocks: rocks.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+rorschach: rorschach.o $(HACK_OBJS) $(HSV) $(ERASE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HSV) $(ERASE) $(HACK_LIBS)
+
+slidescreen: slidescreen.o $(HACK_OBJS) $(GRAB)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(HACK_LIBS)
+
+goop: goop.o $(HACK_OBJS) $(HSV) $(ALP) $(SPL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HSV) $(ALP) $(SPL) $(HACK_LIBS)
+
+starfish: starfish.o $(HACK_OBJS) $(COL) $(SPL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
+
+munch: munch.o $(HACK_OBJS) $(COL) $(SPL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
+
+rd-bomb: rd-bomb.o $(HACK_OBJS) $(COL) $(SHM)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SHM) $(HACK_LIBS) $(THRL)
+
+coral: coral.o $(HACK_OBJS) $(COL) $(ERASE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
+
+xjack: xjack.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+xlyap: xlyap.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+cynosure: cynosure.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+epicycle: epicycle.o $(HACK_OBJS) $(COL) $(ERASE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
+
+interference: interference.o $(HACK_OBJS) $(COL) $(SHM) $(DBE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SHM) $(DBE) $(HACK_LIBS) $(THRL)
+
+truchet: truchet.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+bsod: bsod.o $(HACK_OBJS) $(GRAB) $(APPLE2) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(APPLE2) $(PNG) $(PNG_LIBS) $(THRL)
+
+apple2: apple2.o apple2-main.o $(HACK_OBJS) $(ATV) $(GRAB) $(TEXT) $(PNG)
+ $(CC_HACK) -o $@ $@.o apple2-main.o $(HACK_OBJS) $(ATV) $(GRAB) $(TEXT) $(PNG) $(PNG_LIBS) $(TEXT_LIBS) $(THRL)
+
+xanalogtv: xanalogtv.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG) $(PNG_LIBS) $(HACK_LIBS) $(THRL)
+
+distort: distort.o $(HACK_OBJS) $(GRAB) $(SHM)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(SHM) $(HACK_LIBS) $(THRL)
+
+kumppa: kumppa.o $(HACK_OBJS) $(DBE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(DBE) $(HACK_LIBS)
+
+t3d: t3d.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+penetrate: penetrate.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+deluxe: deluxe.o $(HACK_OBJS) $(ALP) $(COL) $(DBE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(ALP) $(COL) $(DBE) $(HACK_LIBS)
+
+compass: compass.o $(HACK_OBJS) $(DBE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(DBE) $(HACK_LIBS)
+
+squiral: squiral.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+xflame: xflame.o $(HACK_OBJS) $(SHM) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(SHM) $(PNG) $(PNG_LIBS) $(THRL)
+
+wander: wander.o $(HACK_OBJS) $(COL) $(ERASE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
+
+spotlight: spotlight.o $(HACK_OBJS) $(GRAB)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(HACK_LIBS)
+
+critical: critical.o $(HACK_OBJS) $(COL) $(ERASE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
+
+phosphor: phosphor.o $(HACK_OBJS) $(TEXT) $(COL) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(TEXT) $(COL) $(PNG) $(PNG_LIBS) $(TEXT_LIBS)
+
+xmatrix: xmatrix.o $(HACK_OBJS) $(TEXT) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(TEXT) $(PNG) $(PNG_LIBS) $(TEXT_LIBS)
+
+petri: petri.o $(HACK_OBJS) $(COL) $(SPL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
+
+shadebobs: shadebobs.o $(HACK_OBJS) $(COL) $(SPL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
+
+ccurve: ccurve.o $(HACK_OBJS) $(COL) $(SPL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
+
+blaster: blaster.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+bumps: bumps.o $(HACK_OBJS) $(GRAB) $(SHM)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(SHM) $(HACK_LIBS) $(THRL)
+
+ripples: ripples.o $(HACK_OBJS) $(SHM) $(COL) $(GRAB)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(SHM) $(COL) $(GRAB) $(HACK_LIBS) $(THRL)
+
+xspirograph: xspirograph.o $(HACK_OBJS) $(COL) $(ERASE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
+
+nerverot: nerverot.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+xrayswarm: xrayswarm.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+hyperball: hyperball.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+zoom: zoom.o $(HACK_OBJS) $(GRAB)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(HACK_LIBS)
+
+whirlwindwarp: whirlwindwarp.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+rotzoomer: rotzoomer.o $(HACK_OBJS) $(GRAB) $(SHM)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(SHM) $(HACK_LIBS) $(THRL)
+
+whirlygig: whirlygig.o $(HACK_OBJS) $(DBE) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(DBE) $(COL) $(HACK_LIBS)
+
+speedmine: speedmine.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+vermiculate: vermiculate.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+twang: twang.o $(HACK_OBJS) $(GRAB) $(SHM)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(GRAB) $(SHM) $(HACK_LIBS) $(THRL)
+
+fluidballs: fluidballs.o $(HACK_OBJS) $(DBE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(DBE) $(HACK_LIBS)
+
+anemone: anemone.o $(HACK_OBJS) $(COL) $(DBE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(DBE) $(HACK_LIBS)
+
+halftone: halftone.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+metaballs: metaballs.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+eruption: eruption.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+popsquares: popsquares.o $(HACK_OBJS) $(DBE) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(DBE) $(COL) $(HACK_LIBS)
+
+barcode: barcode.o $(HACK_OBJS) $(HSV)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HSV) $(HACK_LIBS)
+
+piecewise: piecewise.o $(HACK_OBJS) $(COL) $(DBE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(DBE) $(HACK_LIBS)
+
+cloudlife: cloudlife.o $(HACK_OBJS) $(COL) $(DBE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(DBE) $(HACK_LIBS)
+
+fontglide: fontglide.o $(HACK_OBJS) $(DBE) $(TEXT)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(DBE) $(TEXT) $(HACK_LIBS) $(TEXT_LIBS)
+
+pong: pong.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG) $(PNG_LIBS) $(HACK_LIBS) $(THRL)
+
+wormhole: wormhole.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+fuzzyflakes: fuzzyflakes.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+anemotaxis: anemotaxis.o $(HACK_OBJS) $(COL) $(DBE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(DBE) $(HACK_LIBS)
+
+memscroller: memscroller.o $(HACK_OBJS) $(SHM) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(SHM) $(COL) $(HACK_LIBS) $(THRL)
+
+substrate: substrate.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+intermomentary: intermomentary.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+interaggregate: interaggregate.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+fireworkx: fireworkx.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+boxfit: boxfit.o $(HACK_OBJS) $(COL) $(GRAB)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(GRAB) $(HACK_LIBS)
+
+ifs: ifs.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+celtic: celtic.o $(HACK_OBJS) $(COL) $(ERASE)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
+
+cwaves: cwaves.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+m6502.h:
+ @echo "building m6502.h from $(srcdir)/images/m6502/*.asm"; \
+ UTILS_SRC="$(UTILS_SRC)" \
+ $(srcdir)/m6502.sh m6502.h $(srcdir)/images/m6502/*.asm
+
+m6502.o: m6502.h
+m6502: m6502.o asm6502.o $(HACK_OBJS) $(ATV) $(PNG)
+ $(CC_HACK) -o $@ $@.o asm6502.o $(HACK_OBJS) $(ATV) $(PNG) $(PNG_LIBS) $(THRL)
+
+abstractile: abstractile.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+lcdscrub: lcdscrub.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+hexadrop: hexadrop.o $(HACK_OBJS) $(COL)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+tessellimage: tessellimage.o delaunay.o $(HACK_OBJS) $(GRAB)
+ $(CC_HACK) -o $@ $@.o delaunay.o $(HACK_OBJS) $(GRAB) $(HACK_LIBS)
+
+glitchpeg: glitchpeg.o $(HACK_OBJS) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(PNG) $(PNG_LIBS)
+
+filmleader: filmleader.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG) $(PNG_LIBS) $(HACK_LIBS) $(THRL)
+
+vfeedback: vfeedback.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(ATV) $(GRAB) $(PNG) $(PNG_LIBS) $(HACK_LIBS) $(THRL)
+
+
+testx11: testx11.o glx/rotator.o $(HACK_OBJS) $(COL) $(PNG) $(BARS) $(ERASE)
+ $(CC_HACK) -o $@ $@.o glx/rotator.o $(HACK_OBJS) $(COL) $(PNG) $(BARS) $(ERASE) $(PNG_LIBS)
+
+glx/rotator.o: glx/rotator.c
+ cd glx ; \
+ $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)"
+
+# The rules for those hacks which follow the `xlockmore' API.
+#
+
+bouboule: bouboule.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+braid: braid.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+drift: drift.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+flag: flag.o $(XLOCK_OBJS) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(PNG) $(PNG_LIBS)
+
+forest: forest.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+vines: vines.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+galaxy: galaxy.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+grav: grav.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+hopalong: hopalong.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+julia: julia.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+laser: laser.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+lightning: lightning.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+lisa: lisa.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+lissie: lissie.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+penrose: penrose.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+sierpinski: sierpinski.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+slip: slip.o $(XLOCK_OBJS) $(GRAB)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(GRAB) $(HACK_LIBS)
+
+sphere: sphere.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+spiral: spiral.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+strange: strange.o $(XLOCK_OBJS) $(SHM) $(UTILS_BIN)/pow2.o
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(SHM) $(UTILS_BIN)/pow2.o $(HACK_LIBS) $(THRL)
+
+swirl: swirl.o $(XLOCK_OBJS) $(SHM)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(SHM) $(HACK_LIBS) $(THRL)
+
+fadeplot: fadeplot.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+mountain: mountain.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+triangle: triangle.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+worm: worm.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+rotor: rotor.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+ant: ant.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+demon: demon.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+loop: loop.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+flow: flow.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+discrete: discrete.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+crystal: crystal.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+apollonian: apollonian.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+euler2d: euler2d.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+juggle: juggle.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+polyominoes: polyominoes.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+thornbird: thornbird.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+PACOBJS=pacman_ai.o pacman_level.o
+pacman: pacman.o $(PACOBJS) $(XLOCK_OBJS) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(PACOBJS) $(XLOCK_OBJS) $(PNG) $(PNG_LIBS)
+
+fiberlamp: fiberlamp.o $(XLOCK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS)
+
+# These are not like the others.
+#
+xsublim: xsublim.o $(HACK_OBJS_1)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS_1) $(HACK_LIBS)
+
+webcollage-helper: webcollage-helper.o
+ $(CC_HACK) -o $@ $@.o $(PNG_LIBS) $(JPEG_LIBS)
+
+
+##############################################################################
+#
+# DO NOT DELETE: updated by make distdepend
+
+abstractile.o: ../config.h
+abstractile.o: $(srcdir)/fps.h
+abstractile.o: $(srcdir)/recanim.h
+abstractile.o: $(srcdir)/screenhackI.h
+abstractile.o: $(srcdir)/screenhack.h
+abstractile.o: $(UTILS_SRC)/colors.h
+abstractile.o: $(UTILS_SRC)/font-retry.h
+abstractile.o: $(UTILS_SRC)/grabscreen.h
+abstractile.o: $(UTILS_SRC)/hsv.h
+abstractile.o: $(UTILS_SRC)/resources.h
+abstractile.o: $(UTILS_SRC)/usleep.h
+abstractile.o: $(UTILS_SRC)/visual.h
+abstractile.o: $(UTILS_SRC)/yarandom.h
+analogtv.o: $(srcdir)/analogtv.h
+analogtv.o: ../config.h
+analogtv.o: $(srcdir)/images/gen/6x10font_png.h
+analogtv.o: $(UTILS_SRC)/aligned_malloc.h
+analogtv.o: $(UTILS_SRC)/font-retry.h
+analogtv.o: $(UTILS_SRC)/grabscreen.h
+analogtv.o: $(UTILS_SRC)/resources.h
+analogtv.o: $(UTILS_SRC)/thread_util.h
+analogtv.o: $(UTILS_SRC)/utils.h
+analogtv.o: $(UTILS_SRC)/visual.h
+analogtv.o: $(UTILS_SRC)/xshm.h
+analogtv.o: $(UTILS_SRC)/yarandom.h
+analogtv.o: $(srcdir)/ximage-loader.h
+anemone.o: ../config.h
+anemone.o: $(srcdir)/fps.h
+anemone.o: $(srcdir)/recanim.h
+anemone.o: $(srcdir)/screenhackI.h
+anemone.o: $(srcdir)/screenhack.h
+anemone.o: $(UTILS_SRC)/colors.h
+anemone.o: $(UTILS_SRC)/font-retry.h
+anemone.o: $(UTILS_SRC)/grabscreen.h
+anemone.o: $(UTILS_SRC)/hsv.h
+anemone.o: $(UTILS_SRC)/resources.h
+anemone.o: $(UTILS_SRC)/usleep.h
+anemone.o: $(UTILS_SRC)/visual.h
+anemone.o: $(UTILS_SRC)/xdbe.h
+anemone.o: $(UTILS_SRC)/yarandom.h
+anemotaxis.o: ../config.h
+anemotaxis.o: $(srcdir)/fps.h
+anemotaxis.o: $(srcdir)/recanim.h
+anemotaxis.o: $(srcdir)/screenhackI.h
+anemotaxis.o: $(srcdir)/screenhack.h
+anemotaxis.o: $(UTILS_SRC)/colors.h
+anemotaxis.o: $(UTILS_SRC)/font-retry.h
+anemotaxis.o: $(UTILS_SRC)/grabscreen.h
+anemotaxis.o: $(UTILS_SRC)/hsv.h
+anemotaxis.o: $(UTILS_SRC)/resources.h
+anemotaxis.o: $(UTILS_SRC)/usleep.h
+anemotaxis.o: $(UTILS_SRC)/visual.h
+anemotaxis.o: $(UTILS_SRC)/xdbe.h
+anemotaxis.o: $(UTILS_SRC)/yarandom.h
+ant.o: $(srcdir)/automata.h
+ant.o: ../config.h
+ant.o: $(srcdir)/fps.h
+ant.o: $(srcdir)/recanim.h
+ant.o: $(srcdir)/screenhackI.h
+ant.o: $(UTILS_SRC)/colors.h
+ant.o: $(UTILS_SRC)/erase.h
+ant.o: $(UTILS_SRC)/font-retry.h
+ant.o: $(UTILS_SRC)/grabscreen.h
+ant.o: $(UTILS_SRC)/hsv.h
+ant.o: $(UTILS_SRC)/resources.h
+ant.o: $(UTILS_SRC)/usleep.h
+ant.o: $(UTILS_SRC)/visual.h
+ant.o: $(UTILS_SRC)/yarandom.h
+ant.o: $(srcdir)/xlockmoreI.h
+ant.o: $(srcdir)/xlockmore.h
+apollonian.o: ../config.h
+apollonian.o: $(srcdir)/fps.h
+apollonian.o: $(srcdir)/recanim.h
+apollonian.o: $(srcdir)/screenhackI.h
+apollonian.o: $(UTILS_SRC)/colors.h
+apollonian.o: $(UTILS_SRC)/erase.h
+apollonian.o: $(UTILS_SRC)/font-retry.h
+apollonian.o: $(UTILS_SRC)/grabscreen.h
+apollonian.o: $(UTILS_SRC)/hsv.h
+apollonian.o: $(UTILS_SRC)/resources.h
+apollonian.o: $(UTILS_SRC)/usleep.h
+apollonian.o: $(UTILS_SRC)/visual.h
+apollonian.o: $(UTILS_SRC)/yarandom.h
+apollonian.o: $(srcdir)/xlockmoreI.h
+apollonian.o: $(srcdir)/xlockmore.h
+apple2-main.o: $(srcdir)/analogtv.h
+apple2-main.o: $(srcdir)/apple2.h
+apple2-main.o: ../config.h
+apple2-main.o: $(srcdir)/fps.h
+apple2-main.o: $(srcdir)/recanim.h
+apple2-main.o: $(srcdir)/screenhackI.h
+apple2-main.o: $(srcdir)/screenhack.h
+apple2-main.o: $(UTILS_SRC)/aligned_malloc.h
+apple2-main.o: $(UTILS_SRC)/colors.h
+apple2-main.o: $(UTILS_SRC)/font-retry.h
+apple2-main.o: $(UTILS_SRC)/grabscreen.h
+apple2-main.o: $(UTILS_SRC)/hsv.h
+apple2-main.o: $(UTILS_SRC)/resources.h
+apple2-main.o: $(UTILS_SRC)/textclient.h
+apple2-main.o: $(UTILS_SRC)/thread_util.h
+apple2-main.o: $(UTILS_SRC)/usleep.h
+apple2-main.o: $(UTILS_SRC)/utf8wc.h
+apple2-main.o: $(UTILS_SRC)/visual.h
+apple2-main.o: $(UTILS_SRC)/xshm.h
+apple2-main.o: $(UTILS_SRC)/yarandom.h
+apple2.o: $(srcdir)/analogtv.h
+apple2.o: $(srcdir)/apple2.h
+apple2.o: ../config.h
+apple2.o: $(srcdir)/fps.h
+apple2.o: $(srcdir)/images/gen/apple2font_png.h
+apple2.o: $(srcdir)/recanim.h
+apple2.o: $(srcdir)/screenhackI.h
+apple2.o: $(UTILS_SRC)/aligned_malloc.h
+apple2.o: $(UTILS_SRC)/colors.h
+apple2.o: $(UTILS_SRC)/font-retry.h
+apple2.o: $(UTILS_SRC)/grabscreen.h
+apple2.o: $(UTILS_SRC)/hsv.h
+apple2.o: $(UTILS_SRC)/resources.h
+apple2.o: $(UTILS_SRC)/thread_util.h
+apple2.o: $(UTILS_SRC)/usleep.h
+apple2.o: $(UTILS_SRC)/visual.h
+apple2.o: $(UTILS_SRC)/xshm.h
+apple2.o: $(UTILS_SRC)/yarandom.h
+apple2.o: $(srcdir)/ximage-loader.h
+asm6502.o: $(srcdir)/asm6502.h
+asm6502.o: ../config.h
+asm6502.o: $(UTILS_SRC)/yarandom.h
+attraction.o: ../config.h
+attraction.o: $(srcdir)/fps.h
+attraction.o: $(srcdir)/recanim.h
+attraction.o: $(srcdir)/screenhackI.h
+attraction.o: $(srcdir)/screenhack.h
+attraction.o: $(UTILS_SRC)/colors.h
+attraction.o: $(UTILS_SRC)/font-retry.h
+attraction.o: $(UTILS_SRC)/grabscreen.h
+attraction.o: $(UTILS_SRC)/hsv.h
+attraction.o: $(UTILS_SRC)/resources.h
+attraction.o: $(UTILS_SRC)/spline.h
+attraction.o: $(UTILS_SRC)/usleep.h
+attraction.o: $(UTILS_SRC)/visual.h
+attraction.o: $(UTILS_SRC)/yarandom.h
+barcode.o: ../config.h
+barcode.o: $(srcdir)/fps.h
+barcode.o: $(srcdir)/recanim.h
+barcode.o: $(srcdir)/screenhackI.h
+barcode.o: $(srcdir)/screenhack.h
+barcode.o: $(UTILS_SRC)/colors.h
+barcode.o: $(UTILS_SRC)/font-retry.h
+barcode.o: $(UTILS_SRC)/grabscreen.h
+barcode.o: $(UTILS_SRC)/hsv.h
+barcode.o: $(UTILS_SRC)/resources.h
+barcode.o: $(UTILS_SRC)/usleep.h
+barcode.o: $(UTILS_SRC)/visual.h
+barcode.o: $(UTILS_SRC)/yarandom.h
+binaryring.o: ../config.h
+binaryring.o: $(srcdir)/fps.h
+binaryring.o: $(srcdir)/recanim.h
+binaryring.o: $(srcdir)/screenhackI.h
+binaryring.o: $(srcdir)/screenhack.h
+binaryring.o: $(UTILS_SRC)/colors.h
+binaryring.o: $(UTILS_SRC)/font-retry.h
+binaryring.o: $(UTILS_SRC)/grabscreen.h
+binaryring.o: $(UTILS_SRC)/hsv.h
+binaryring.o: $(UTILS_SRC)/resources.h
+binaryring.o: $(UTILS_SRC)/usleep.h
+binaryring.o: $(UTILS_SRC)/visual.h
+binaryring.o: $(UTILS_SRC)/yarandom.h
+blaster.o: ../config.h
+blaster.o: $(srcdir)/fps.h
+blaster.o: $(srcdir)/recanim.h
+blaster.o: $(srcdir)/screenhackI.h
+blaster.o: $(srcdir)/screenhack.h
+blaster.o: $(UTILS_SRC)/colors.h
+blaster.o: $(UTILS_SRC)/font-retry.h
+blaster.o: $(UTILS_SRC)/grabscreen.h
+blaster.o: $(UTILS_SRC)/hsv.h
+blaster.o: $(UTILS_SRC)/resources.h
+blaster.o: $(UTILS_SRC)/usleep.h
+blaster.o: $(UTILS_SRC)/visual.h
+blaster.o: $(UTILS_SRC)/yarandom.h
+blitspin.o: ../config.h
+blitspin.o: $(srcdir)/fps.h
+blitspin.o: $(srcdir)/images/gen/som_png.h
+blitspin.o: $(srcdir)/recanim.h
+blitspin.o: $(srcdir)/screenhackI.h
+blitspin.o: $(srcdir)/screenhack.h
+blitspin.o: $(UTILS_SRC)/colors.h
+blitspin.o: $(UTILS_SRC)/font-retry.h
+blitspin.o: $(UTILS_SRC)/grabscreen.h
+blitspin.o: $(UTILS_SRC)/hsv.h
+blitspin.o: $(UTILS_SRC)/pow2.h
+blitspin.o: $(UTILS_SRC)/resources.h
+blitspin.o: $(UTILS_SRC)/usleep.h
+blitspin.o: $(UTILS_SRC)/visual.h
+blitspin.o: $(UTILS_SRC)/yarandom.h
+blitspin.o: $(srcdir)/ximage-loader.h
+bouboule.o: ../config.h
+bouboule.o: $(srcdir)/fps.h
+bouboule.o: $(srcdir)/recanim.h
+bouboule.o: $(srcdir)/screenhackI.h
+bouboule.o: $(UTILS_SRC)/colors.h
+bouboule.o: $(UTILS_SRC)/erase.h
+bouboule.o: $(UTILS_SRC)/font-retry.h
+bouboule.o: $(UTILS_SRC)/grabscreen.h
+bouboule.o: $(UTILS_SRC)/hsv.h
+bouboule.o: $(UTILS_SRC)/resources.h
+bouboule.o: $(UTILS_SRC)/usleep.h
+bouboule.o: $(UTILS_SRC)/visual.h
+bouboule.o: $(UTILS_SRC)/yarandom.h
+bouboule.o: $(srcdir)/xlockmoreI.h
+bouboule.o: $(srcdir)/xlockmore.h
+boxfit.o: ../config.h
+boxfit.o: $(srcdir)/fps.h
+boxfit.o: $(srcdir)/recanim.h
+boxfit.o: $(srcdir)/screenhackI.h
+boxfit.o: $(srcdir)/screenhack.h
+boxfit.o: $(UTILS_SRC)/colors.h
+boxfit.o: $(UTILS_SRC)/font-retry.h
+boxfit.o: $(UTILS_SRC)/grabscreen.h
+boxfit.o: $(UTILS_SRC)/hsv.h
+boxfit.o: $(UTILS_SRC)/resources.h
+boxfit.o: $(UTILS_SRC)/usleep.h
+boxfit.o: $(UTILS_SRC)/visual.h
+boxfit.o: $(UTILS_SRC)/yarandom.h
+boxfit.o: $(srcdir)/ximage-loader.h
+braid.o: ../config.h
+braid.o: $(srcdir)/fps.h
+braid.o: $(srcdir)/recanim.h
+braid.o: $(srcdir)/screenhackI.h
+braid.o: $(UTILS_SRC)/colors.h
+braid.o: $(UTILS_SRC)/erase.h
+braid.o: $(UTILS_SRC)/font-retry.h
+braid.o: $(UTILS_SRC)/grabscreen.h
+braid.o: $(UTILS_SRC)/hsv.h
+braid.o: $(UTILS_SRC)/resources.h
+braid.o: $(UTILS_SRC)/usleep.h
+braid.o: $(UTILS_SRC)/visual.h
+braid.o: $(UTILS_SRC)/yarandom.h
+braid.o: $(srcdir)/xlockmoreI.h
+braid.o: $(srcdir)/xlockmore.h
+bsod.o: $(srcdir)/analogtv.h
+bsod.o: $(srcdir)/apple2.h
+bsod.o: ../config.h
+bsod.o: $(srcdir)/fps.h
+bsod.o: $(srcdir)/images/gen/amiga_png.h
+bsod.o: $(srcdir)/images/gen/android_png.h
+bsod.o: $(srcdir)/images/gen/apple_png.h
+bsod.o: $(srcdir)/images/gen/atari_png.h
+bsod.o: $(srcdir)/images/gen/atm_png.h
+bsod.o: $(srcdir)/images/gen/hmac_png.h
+bsod.o: $(srcdir)/images/gen/macbomb_png.h
+bsod.o: $(srcdir)/images/gen/mac_png.h
+bsod.o: $(srcdir)/images/gen/osx_10_2_png.h
+bsod.o: $(srcdir)/images/gen/osx_10_3_png.h
+bsod.o: $(srcdir)/images/gen/ransomware_png.h
+bsod.o: $(srcdir)/recanim.h
+bsod.o: $(srcdir)/screenhackI.h
+bsod.o: $(srcdir)/screenhack.h
+bsod.o: $(UTILS_SRC)/aligned_malloc.h
+bsod.o: $(UTILS_SRC)/colors.h
+bsod.o: $(UTILS_SRC)/font-retry.h
+bsod.o: $(UTILS_SRC)/grabscreen.h
+bsod.o: $(UTILS_SRC)/hsv.h
+bsod.o: $(UTILS_SRC)/resources.h
+bsod.o: $(UTILS_SRC)/thread_util.h
+bsod.o: $(UTILS_SRC)/usleep.h
+bsod.o: $(UTILS_SRC)/visual.h
+bsod.o: $(UTILS_SRC)/xshm.h
+bsod.o: $(UTILS_SRC)/yarandom.h
+bsod.o: $(srcdir)/ximage-loader.h
+bubbles-default.o: $(srcdir)/bubbles.h
+bubbles-default.o: ../config.h
+bubbles-default.o: $(srcdir)/images/gen/blood10_png.h
+bubbles-default.o: $(srcdir)/images/gen/blood11_png.h
+bubbles-default.o: $(srcdir)/images/gen/blood1_png.h
+bubbles-default.o: $(srcdir)/images/gen/blood2_png.h
+bubbles-default.o: $(srcdir)/images/gen/blood3_png.h
+bubbles-default.o: $(srcdir)/images/gen/blood4_png.h
+bubbles-default.o: $(srcdir)/images/gen/blood5_png.h
+bubbles-default.o: $(srcdir)/images/gen/blood6_png.h
+bubbles-default.o: $(srcdir)/images/gen/blood7_png.h
+bubbles-default.o: $(srcdir)/images/gen/blood8_png.h
+bubbles-default.o: $(srcdir)/images/gen/blood9_png.h
+bubbles-default.o: $(srcdir)/images/gen/blue10_png.h
+bubbles-default.o: $(srcdir)/images/gen/blue11_png.h
+bubbles-default.o: $(srcdir)/images/gen/blue1_png.h
+bubbles-default.o: $(srcdir)/images/gen/blue2_png.h
+bubbles-default.o: $(srcdir)/images/gen/blue3_png.h
+bubbles-default.o: $(srcdir)/images/gen/blue4_png.h
+bubbles-default.o: $(srcdir)/images/gen/blue5_png.h
+bubbles-default.o: $(srcdir)/images/gen/blue6_png.h
+bubbles-default.o: $(srcdir)/images/gen/blue7_png.h
+bubbles-default.o: $(srcdir)/images/gen/blue8_png.h
+bubbles-default.o: $(srcdir)/images/gen/blue9_png.h
+bubbles-default.o: $(srcdir)/images/gen/glass10_png.h
+bubbles-default.o: $(srcdir)/images/gen/glass11_png.h
+bubbles-default.o: $(srcdir)/images/gen/glass1_png.h
+bubbles-default.o: $(srcdir)/images/gen/glass2_png.h
+bubbles-default.o: $(srcdir)/images/gen/glass3_png.h
+bubbles-default.o: $(srcdir)/images/gen/glass4_png.h
+bubbles-default.o: $(srcdir)/images/gen/glass5_png.h
+bubbles-default.o: $(srcdir)/images/gen/glass6_png.h
+bubbles-default.o: $(srcdir)/images/gen/glass7_png.h
+bubbles-default.o: $(srcdir)/images/gen/glass8_png.h
+bubbles-default.o: $(srcdir)/images/gen/glass9_png.h
+bubbles-default.o: $(srcdir)/images/gen/jade10_png.h
+bubbles-default.o: $(srcdir)/images/gen/jade11_png.h
+bubbles-default.o: $(srcdir)/images/gen/jade1_png.h
+bubbles-default.o: $(srcdir)/images/gen/jade2_png.h
+bubbles-default.o: $(srcdir)/images/gen/jade3_png.h
+bubbles-default.o: $(srcdir)/images/gen/jade4_png.h
+bubbles-default.o: $(srcdir)/images/gen/jade5_png.h
+bubbles-default.o: $(srcdir)/images/gen/jade6_png.h
+bubbles-default.o: $(srcdir)/images/gen/jade7_png.h
+bubbles-default.o: $(srcdir)/images/gen/jade8_png.h
+bubbles-default.o: $(srcdir)/images/gen/jade9_png.h
+bubbles-default.o: $(UTILS_SRC)/yarandom.h
+bubbles.o: $(srcdir)/bubbles.h
+bubbles.o: ../config.h
+bubbles.o: $(srcdir)/fps.h
+bubbles.o: $(srcdir)/recanim.h
+bubbles.o: $(srcdir)/screenhackI.h
+bubbles.o: $(srcdir)/screenhack.h
+bubbles.o: $(UTILS_SRC)/colors.h
+bubbles.o: $(UTILS_SRC)/font-retry.h
+bubbles.o: $(UTILS_SRC)/grabscreen.h
+bubbles.o: $(UTILS_SRC)/hsv.h
+bubbles.o: $(UTILS_SRC)/resources.h
+bubbles.o: $(UTILS_SRC)/usleep.h
+bubbles.o: $(UTILS_SRC)/visual.h
+bubbles.o: $(UTILS_SRC)/yarandom.h
+bubbles.o: $(srcdir)/ximage-loader.h
+bumps.o: ../config.h
+bumps.o: $(srcdir)/fps.h
+bumps.o: $(srcdir)/recanim.h
+bumps.o: $(srcdir)/screenhackI.h
+bumps.o: $(srcdir)/screenhack.h
+bumps.o: $(UTILS_SRC)/colors.h
+bumps.o: $(UTILS_SRC)/font-retry.h
+bumps.o: $(UTILS_SRC)/grabscreen.h
+bumps.o: $(UTILS_SRC)/hsv.h
+bumps.o: $(UTILS_SRC)/resources.h
+bumps.o: $(UTILS_SRC)/usleep.h
+bumps.o: $(UTILS_SRC)/visual.h
+bumps.o: $(UTILS_SRC)/xshm.h
+bumps.o: $(UTILS_SRC)/yarandom.h
+ccurve.o: ../config.h
+ccurve.o: $(srcdir)/fps.h
+ccurve.o: $(srcdir)/recanim.h
+ccurve.o: $(srcdir)/screenhackI.h
+ccurve.o: $(srcdir)/screenhack.h
+ccurve.o: $(UTILS_SRC)/colors.h
+ccurve.o: $(UTILS_SRC)/erase.h
+ccurve.o: $(UTILS_SRC)/font-retry.h
+ccurve.o: $(UTILS_SRC)/grabscreen.h
+ccurve.o: $(UTILS_SRC)/hsv.h
+ccurve.o: $(UTILS_SRC)/resources.h
+ccurve.o: $(UTILS_SRC)/usleep.h
+ccurve.o: $(UTILS_SRC)/visual.h
+ccurve.o: $(UTILS_SRC)/yarandom.h
+celtic.o: ../config.h
+celtic.o: $(srcdir)/fps.h
+celtic.o: $(srcdir)/recanim.h
+celtic.o: $(srcdir)/screenhackI.h
+celtic.o: $(srcdir)/screenhack.h
+celtic.o: $(UTILS_SRC)/colors.h
+celtic.o: $(UTILS_SRC)/erase.h
+celtic.o: $(UTILS_SRC)/font-retry.h
+celtic.o: $(UTILS_SRC)/grabscreen.h
+celtic.o: $(UTILS_SRC)/hsv.h
+celtic.o: $(UTILS_SRC)/resources.h
+celtic.o: $(UTILS_SRC)/usleep.h
+celtic.o: $(UTILS_SRC)/visual.h
+celtic.o: $(UTILS_SRC)/yarandom.h
+cloudlife.o: ../config.h
+cloudlife.o: $(srcdir)/fps.h
+cloudlife.o: $(srcdir)/recanim.h
+cloudlife.o: $(srcdir)/screenhackI.h
+cloudlife.o: $(srcdir)/screenhack.h
+cloudlife.o: $(UTILS_SRC)/colors.h
+cloudlife.o: $(UTILS_SRC)/font-retry.h
+cloudlife.o: $(UTILS_SRC)/grabscreen.h
+cloudlife.o: $(UTILS_SRC)/hsv.h
+cloudlife.o: $(UTILS_SRC)/resources.h
+cloudlife.o: $(UTILS_SRC)/usleep.h
+cloudlife.o: $(UTILS_SRC)/visual.h
+cloudlife.o: $(UTILS_SRC)/yarandom.h
+compass.o: ../config.h
+compass.o: $(srcdir)/fps.h
+compass.o: $(srcdir)/recanim.h
+compass.o: $(srcdir)/screenhackI.h
+compass.o: $(srcdir)/screenhack.h
+compass.o: $(UTILS_SRC)/colors.h
+compass.o: $(UTILS_SRC)/font-retry.h
+compass.o: $(UTILS_SRC)/grabscreen.h
+compass.o: $(UTILS_SRC)/hsv.h
+compass.o: $(UTILS_SRC)/resources.h
+compass.o: $(UTILS_SRC)/usleep.h
+compass.o: $(UTILS_SRC)/visual.h
+compass.o: $(UTILS_SRC)/xdbe.h
+compass.o: $(UTILS_SRC)/yarandom.h
+coral.o: ../config.h
+coral.o: $(srcdir)/fps.h
+coral.o: $(srcdir)/recanim.h
+coral.o: $(srcdir)/screenhackI.h
+coral.o: $(srcdir)/screenhack.h
+coral.o: $(UTILS_SRC)/colors.h
+coral.o: $(UTILS_SRC)/erase.h
+coral.o: $(UTILS_SRC)/font-retry.h
+coral.o: $(UTILS_SRC)/grabscreen.h
+coral.o: $(UTILS_SRC)/hsv.h
+coral.o: $(UTILS_SRC)/resources.h
+coral.o: $(UTILS_SRC)/usleep.h
+coral.o: $(UTILS_SRC)/visual.h
+coral.o: $(UTILS_SRC)/yarandom.h
+critical.o: ../config.h
+critical.o: $(srcdir)/fps.h
+critical.o: $(srcdir)/recanim.h
+critical.o: $(srcdir)/screenhackI.h
+critical.o: $(srcdir)/screenhack.h
+critical.o: $(UTILS_SRC)/colors.h
+critical.o: $(UTILS_SRC)/erase.h
+critical.o: $(UTILS_SRC)/font-retry.h
+critical.o: $(UTILS_SRC)/grabscreen.h
+critical.o: $(UTILS_SRC)/hsv.h
+critical.o: $(UTILS_SRC)/resources.h
+critical.o: $(UTILS_SRC)/usleep.h
+critical.o: $(UTILS_SRC)/visual.h
+critical.o: $(UTILS_SRC)/yarandom.h
+crystal.o: ../config.h
+crystal.o: $(srcdir)/fps.h
+crystal.o: $(srcdir)/recanim.h
+crystal.o: $(srcdir)/screenhackI.h
+crystal.o: $(UTILS_SRC)/colors.h
+crystal.o: $(UTILS_SRC)/erase.h
+crystal.o: $(UTILS_SRC)/font-retry.h
+crystal.o: $(UTILS_SRC)/grabscreen.h
+crystal.o: $(UTILS_SRC)/hsv.h
+crystal.o: $(UTILS_SRC)/resources.h
+crystal.o: $(UTILS_SRC)/usleep.h
+crystal.o: $(UTILS_SRC)/visual.h
+crystal.o: $(UTILS_SRC)/yarandom.h
+crystal.o: $(srcdir)/xlockmoreI.h
+crystal.o: $(srcdir)/xlockmore.h
+cwaves.o: ../config.h
+cwaves.o: $(srcdir)/fps.h
+cwaves.o: $(srcdir)/recanim.h
+cwaves.o: $(srcdir)/screenhackI.h
+cwaves.o: $(srcdir)/screenhack.h
+cwaves.o: $(UTILS_SRC)/colors.h
+cwaves.o: $(UTILS_SRC)/font-retry.h
+cwaves.o: $(UTILS_SRC)/grabscreen.h
+cwaves.o: $(UTILS_SRC)/hsv.h
+cwaves.o: $(UTILS_SRC)/resources.h
+cwaves.o: $(UTILS_SRC)/usleep.h
+cwaves.o: $(UTILS_SRC)/visual.h
+cwaves.o: $(UTILS_SRC)/yarandom.h
+cwaves.o: $(srcdir)/ximage-loader.h
+cynosure.o: ../config.h
+cynosure.o: $(srcdir)/fps.h
+cynosure.o: $(srcdir)/recanim.h
+cynosure.o: $(srcdir)/screenhackI.h
+cynosure.o: $(srcdir)/screenhack.h
+cynosure.o: $(UTILS_SRC)/colors.h
+cynosure.o: $(UTILS_SRC)/font-retry.h
+cynosure.o: $(UTILS_SRC)/grabscreen.h
+cynosure.o: $(UTILS_SRC)/hsv.h
+cynosure.o: $(UTILS_SRC)/resources.h
+cynosure.o: $(UTILS_SRC)/usleep.h
+cynosure.o: $(UTILS_SRC)/visual.h
+cynosure.o: $(UTILS_SRC)/yarandom.h
+decayscreen.o: ../config.h
+decayscreen.o: $(srcdir)/fps.h
+decayscreen.o: $(srcdir)/recanim.h
+decayscreen.o: $(srcdir)/screenhackI.h
+decayscreen.o: $(srcdir)/screenhack.h
+decayscreen.o: $(UTILS_SRC)/colors.h
+decayscreen.o: $(UTILS_SRC)/font-retry.h
+decayscreen.o: $(UTILS_SRC)/grabscreen.h
+decayscreen.o: $(UTILS_SRC)/hsv.h
+decayscreen.o: $(UTILS_SRC)/resources.h
+decayscreen.o: $(UTILS_SRC)/usleep.h
+decayscreen.o: $(UTILS_SRC)/visual.h
+decayscreen.o: $(UTILS_SRC)/yarandom.h
+deco.o: ../config.h
+deco.o: $(srcdir)/fps.h
+deco.o: $(srcdir)/recanim.h
+deco.o: $(srcdir)/screenhackI.h
+deco.o: $(srcdir)/screenhack.h
+deco.o: $(UTILS_SRC)/colors.h
+deco.o: $(UTILS_SRC)/font-retry.h
+deco.o: $(UTILS_SRC)/grabscreen.h
+deco.o: $(UTILS_SRC)/hsv.h
+deco.o: $(UTILS_SRC)/resources.h
+deco.o: $(UTILS_SRC)/usleep.h
+deco.o: $(UTILS_SRC)/visual.h
+deco.o: $(UTILS_SRC)/yarandom.h
+delaunay.o: ../config.h
+delaunay.o: $(srcdir)/delaunay.h
+deluxe.o: ../config.h
+deluxe.o: $(srcdir)/fps.h
+deluxe.o: $(srcdir)/recanim.h
+deluxe.o: $(srcdir)/screenhackI.h
+deluxe.o: $(srcdir)/screenhack.h
+deluxe.o: $(UTILS_SRC)/alpha.h
+deluxe.o: $(UTILS_SRC)/colors.h
+deluxe.o: $(UTILS_SRC)/font-retry.h
+deluxe.o: $(UTILS_SRC)/grabscreen.h
+deluxe.o: $(UTILS_SRC)/hsv.h
+deluxe.o: $(UTILS_SRC)/resources.h
+deluxe.o: $(UTILS_SRC)/usleep.h
+deluxe.o: $(UTILS_SRC)/visual.h
+deluxe.o: $(UTILS_SRC)/xdbe.h
+deluxe.o: $(UTILS_SRC)/yarandom.h
+demon.o: $(srcdir)/automata.h
+demon.o: ../config.h
+demon.o: $(srcdir)/fps.h
+demon.o: $(srcdir)/recanim.h
+demon.o: $(srcdir)/screenhackI.h
+demon.o: $(UTILS_SRC)/colors.h
+demon.o: $(UTILS_SRC)/erase.h
+demon.o: $(UTILS_SRC)/font-retry.h
+demon.o: $(UTILS_SRC)/grabscreen.h
+demon.o: $(UTILS_SRC)/hsv.h
+demon.o: $(UTILS_SRC)/resources.h
+demon.o: $(UTILS_SRC)/usleep.h
+demon.o: $(UTILS_SRC)/visual.h
+demon.o: $(UTILS_SRC)/yarandom.h
+demon.o: $(srcdir)/xlockmoreI.h
+demon.o: $(srcdir)/xlockmore.h
+discrete.o: ../config.h
+discrete.o: $(srcdir)/fps.h
+discrete.o: $(srcdir)/recanim.h
+discrete.o: $(srcdir)/screenhackI.h
+discrete.o: $(UTILS_SRC)/colors.h
+discrete.o: $(UTILS_SRC)/erase.h
+discrete.o: $(UTILS_SRC)/font-retry.h
+discrete.o: $(UTILS_SRC)/grabscreen.h
+discrete.o: $(UTILS_SRC)/hsv.h
+discrete.o: $(UTILS_SRC)/resources.h
+discrete.o: $(UTILS_SRC)/usleep.h
+discrete.o: $(UTILS_SRC)/visual.h
+discrete.o: $(UTILS_SRC)/yarandom.h
+discrete.o: $(srcdir)/xlockmoreI.h
+discrete.o: $(srcdir)/xlockmore.h
+distort.o: ../config.h
+distort.o: $(srcdir)/fps.h
+distort.o: $(srcdir)/recanim.h
+distort.o: $(srcdir)/screenhackI.h
+distort.o: $(srcdir)/screenhack.h
+distort.o: $(UTILS_SRC)/colors.h
+distort.o: $(UTILS_SRC)/font-retry.h
+distort.o: $(UTILS_SRC)/grabscreen.h
+distort.o: $(UTILS_SRC)/hsv.h
+distort.o: $(UTILS_SRC)/resources.h
+distort.o: $(UTILS_SRC)/usleep.h
+distort.o: $(UTILS_SRC)/visual.h
+distort.o: $(UTILS_SRC)/xshm.h
+distort.o: $(UTILS_SRC)/yarandom.h
+drift.o: ../config.h
+drift.o: $(srcdir)/fps.h
+drift.o: $(srcdir)/recanim.h
+drift.o: $(srcdir)/screenhackI.h
+drift.o: $(UTILS_SRC)/colors.h
+drift.o: $(UTILS_SRC)/erase.h
+drift.o: $(UTILS_SRC)/font-retry.h
+drift.o: $(UTILS_SRC)/grabscreen.h
+drift.o: $(UTILS_SRC)/hsv.h
+drift.o: $(UTILS_SRC)/resources.h
+drift.o: $(UTILS_SRC)/usleep.h
+drift.o: $(UTILS_SRC)/visual.h
+drift.o: $(UTILS_SRC)/yarandom.h
+drift.o: $(srcdir)/xlockmoreI.h
+drift.o: $(srcdir)/xlockmore.h
+epicycle.o: ../config.h
+epicycle.o: $(srcdir)/fps.h
+epicycle.o: $(srcdir)/recanim.h
+epicycle.o: $(srcdir)/screenhackI.h
+epicycle.o: $(srcdir)/screenhack.h
+epicycle.o: $(UTILS_SRC)/colors.h
+epicycle.o: $(UTILS_SRC)/erase.h
+epicycle.o: $(UTILS_SRC)/font-retry.h
+epicycle.o: $(UTILS_SRC)/grabscreen.h
+epicycle.o: $(UTILS_SRC)/hsv.h
+epicycle.o: $(UTILS_SRC)/resources.h
+epicycle.o: $(UTILS_SRC)/usleep.h
+epicycle.o: $(UTILS_SRC)/visual.h
+epicycle.o: $(UTILS_SRC)/yarandom.h
+eruption.o: ../config.h
+eruption.o: $(srcdir)/fps.h
+eruption.o: $(srcdir)/recanim.h
+eruption.o: $(srcdir)/screenhackI.h
+eruption.o: $(srcdir)/screenhack.h
+eruption.o: $(UTILS_SRC)/colors.h
+eruption.o: $(UTILS_SRC)/font-retry.h
+eruption.o: $(UTILS_SRC)/grabscreen.h
+eruption.o: $(UTILS_SRC)/hsv.h
+eruption.o: $(UTILS_SRC)/resources.h
+eruption.o: $(UTILS_SRC)/usleep.h
+eruption.o: $(UTILS_SRC)/visual.h
+eruption.o: $(UTILS_SRC)/yarandom.h
+euler2d.o: ../config.h
+euler2d.o: $(srcdir)/fps.h
+euler2d.o: $(srcdir)/recanim.h
+euler2d.o: $(srcdir)/screenhackI.h
+euler2d.o: $(UTILS_SRC)/colors.h
+euler2d.o: $(UTILS_SRC)/erase.h
+euler2d.o: $(UTILS_SRC)/font-retry.h
+euler2d.o: $(UTILS_SRC)/grabscreen.h
+euler2d.o: $(UTILS_SRC)/hsv.h
+euler2d.o: $(UTILS_SRC)/resources.h
+euler2d.o: $(UTILS_SRC)/usleep.h
+euler2d.o: $(UTILS_SRC)/visual.h
+euler2d.o: $(UTILS_SRC)/yarandom.h
+euler2d.o: $(srcdir)/xlockmoreI.h
+euler2d.o: $(srcdir)/xlockmore.h
+fadeplot.o: ../config.h
+fadeplot.o: $(srcdir)/fps.h
+fadeplot.o: $(srcdir)/recanim.h
+fadeplot.o: $(srcdir)/screenhackI.h
+fadeplot.o: $(UTILS_SRC)/colors.h
+fadeplot.o: $(UTILS_SRC)/erase.h
+fadeplot.o: $(UTILS_SRC)/font-retry.h
+fadeplot.o: $(UTILS_SRC)/grabscreen.h
+fadeplot.o: $(UTILS_SRC)/hsv.h
+fadeplot.o: $(UTILS_SRC)/resources.h
+fadeplot.o: $(UTILS_SRC)/usleep.h
+fadeplot.o: $(UTILS_SRC)/visual.h
+fadeplot.o: $(UTILS_SRC)/yarandom.h
+fadeplot.o: $(srcdir)/xlockmoreI.h
+fadeplot.o: $(srcdir)/xlockmore.h
+fiberlamp.o: ../config.h
+fiberlamp.o: $(srcdir)/fps.h
+fiberlamp.o: $(srcdir)/recanim.h
+fiberlamp.o: $(srcdir)/screenhackI.h
+fiberlamp.o: $(UTILS_SRC)/colors.h
+fiberlamp.o: $(UTILS_SRC)/erase.h
+fiberlamp.o: $(UTILS_SRC)/font-retry.h
+fiberlamp.o: $(UTILS_SRC)/grabscreen.h
+fiberlamp.o: $(UTILS_SRC)/hsv.h
+fiberlamp.o: $(UTILS_SRC)/resources.h
+fiberlamp.o: $(UTILS_SRC)/usleep.h
+fiberlamp.o: $(UTILS_SRC)/visual.h
+fiberlamp.o: $(UTILS_SRC)/yarandom.h
+fiberlamp.o: $(srcdir)/xlockmoreI.h
+fiberlamp.o: $(srcdir)/xlockmore.h
+filmleader.o: $(srcdir)/analogtv.h
+filmleader.o: ../config.h
+filmleader.o: $(srcdir)/fps.h
+filmleader.o: $(srcdir)/recanim.h
+filmleader.o: $(srcdir)/screenhackI.h
+filmleader.o: $(srcdir)/screenhack.h
+filmleader.o: $(UTILS_SRC)/aligned_malloc.h
+filmleader.o: $(UTILS_SRC)/colors.h
+filmleader.o: $(UTILS_SRC)/font-retry.h
+filmleader.o: $(UTILS_SRC)/grabscreen.h
+filmleader.o: $(UTILS_SRC)/hsv.h
+filmleader.o: $(UTILS_SRC)/resources.h
+filmleader.o: $(UTILS_SRC)/thread_util.h
+filmleader.o: $(UTILS_SRC)/usleep.h
+filmleader.o: $(UTILS_SRC)/visual.h
+filmleader.o: $(UTILS_SRC)/xft.h
+filmleader.o: $(UTILS_SRC)/xshm.h
+filmleader.o: $(UTILS_SRC)/yarandom.h
+fireworkx.o: ../config.h
+fireworkx.o: $(srcdir)/fps.h
+fireworkx.o: $(srcdir)/recanim.h
+fireworkx.o: $(srcdir)/screenhackI.h
+fireworkx.o: $(srcdir)/screenhack.h
+fireworkx.o: $(UTILS_SRC)/colors.h
+fireworkx.o: $(UTILS_SRC)/font-retry.h
+fireworkx.o: $(UTILS_SRC)/grabscreen.h
+fireworkx.o: $(UTILS_SRC)/hsv.h
+fireworkx.o: $(UTILS_SRC)/resources.h
+fireworkx.o: $(UTILS_SRC)/usleep.h
+fireworkx.o: $(UTILS_SRC)/visual.h
+fireworkx.o: $(UTILS_SRC)/yarandom.h
+flag.o: ../config.h
+flag.o: $(srcdir)/fps.h
+flag.o: $(srcdir)/images/gen/bob_png.h
+flag.o: $(srcdir)/recanim.h
+flag.o: $(srcdir)/screenhackI.h
+flag.o: $(UTILS_SRC)/colors.h
+flag.o: $(UTILS_SRC)/erase.h
+flag.o: $(UTILS_SRC)/font-retry.h
+flag.o: $(UTILS_SRC)/grabscreen.h
+flag.o: $(UTILS_SRC)/hsv.h
+flag.o: $(UTILS_SRC)/resources.h
+flag.o: $(UTILS_SRC)/usleep.h
+flag.o: $(UTILS_SRC)/visual.h
+flag.o: $(UTILS_SRC)/yarandom.h
+flag.o: $(srcdir)/ximage-loader.h
+flag.o: $(srcdir)/xlockmoreI.h
+flag.o: $(srcdir)/xlockmore.h
+flame.o: ../config.h
+flame.o: $(srcdir)/fps.h
+flame.o: $(srcdir)/recanim.h
+flame.o: $(srcdir)/screenhackI.h
+flame.o: $(srcdir)/screenhack.h
+flame.o: $(UTILS_SRC)/colors.h
+flame.o: $(UTILS_SRC)/font-retry.h
+flame.o: $(UTILS_SRC)/grabscreen.h
+flame.o: $(UTILS_SRC)/hsv.h
+flame.o: $(UTILS_SRC)/resources.h
+flame.o: $(UTILS_SRC)/usleep.h
+flame.o: $(UTILS_SRC)/visual.h
+flame.o: $(UTILS_SRC)/yarandom.h
+flow.o: ../config.h
+flow.o: $(srcdir)/fps.h
+flow.o: $(srcdir)/recanim.h
+flow.o: $(srcdir)/screenhackI.h
+flow.o: $(UTILS_SRC)/colors.h
+flow.o: $(UTILS_SRC)/erase.h
+flow.o: $(UTILS_SRC)/font-retry.h
+flow.o: $(UTILS_SRC)/grabscreen.h
+flow.o: $(UTILS_SRC)/hsv.h
+flow.o: $(UTILS_SRC)/resources.h
+flow.o: $(UTILS_SRC)/usleep.h
+flow.o: $(UTILS_SRC)/visual.h
+flow.o: $(UTILS_SRC)/yarandom.h
+flow.o: $(srcdir)/xlockmoreI.h
+flow.o: $(srcdir)/xlockmore.h
+fluidballs.o: ../config.h
+fluidballs.o: $(srcdir)/fps.h
+fluidballs.o: $(srcdir)/recanim.h
+fluidballs.o: $(srcdir)/screenhackI.h
+fluidballs.o: $(srcdir)/screenhack.h
+fluidballs.o: $(UTILS_SRC)/colors.h
+fluidballs.o: $(UTILS_SRC)/font-retry.h
+fluidballs.o: $(UTILS_SRC)/grabscreen.h
+fluidballs.o: $(UTILS_SRC)/hsv.h
+fluidballs.o: $(UTILS_SRC)/resources.h
+fluidballs.o: $(UTILS_SRC)/usleep.h
+fluidballs.o: $(UTILS_SRC)/visual.h
+fluidballs.o: $(UTILS_SRC)/xdbe.h
+fluidballs.o: $(UTILS_SRC)/yarandom.h
+fontglide.o: ../config.h
+fontglide.o: $(srcdir)/fps.h
+fontglide.o: $(srcdir)/recanim.h
+fontglide.o: $(srcdir)/screenhackI.h
+fontglide.o: $(srcdir)/screenhack.h
+fontglide.o: $(UTILS_SRC)/colors.h
+fontglide.o: $(UTILS_SRC)/font-retry.h
+fontglide.o: $(UTILS_SRC)/grabscreen.h
+fontglide.o: $(UTILS_SRC)/hsv.h
+fontglide.o: $(UTILS_SRC)/resources.h
+fontglide.o: $(UTILS_SRC)/textclient.h
+fontglide.o: $(UTILS_SRC)/usleep.h
+fontglide.o: $(UTILS_SRC)/utf8wc.h
+fontglide.o: $(UTILS_SRC)/visual.h
+fontglide.o: $(UTILS_SRC)/xdbe.h
+fontglide.o: $(UTILS_SRC)/xft.h
+fontglide.o: $(UTILS_SRC)/yarandom.h
+forest.o: ../config.h
+forest.o: $(srcdir)/fps.h
+forest.o: $(srcdir)/recanim.h
+forest.o: $(srcdir)/screenhackI.h
+forest.o: $(UTILS_SRC)/colors.h
+forest.o: $(UTILS_SRC)/erase.h
+forest.o: $(UTILS_SRC)/font-retry.h
+forest.o: $(UTILS_SRC)/grabscreen.h
+forest.o: $(UTILS_SRC)/hsv.h
+forest.o: $(UTILS_SRC)/resources.h
+forest.o: $(UTILS_SRC)/usleep.h
+forest.o: $(UTILS_SRC)/visual.h
+forest.o: $(UTILS_SRC)/yarandom.h
+forest.o: $(srcdir)/xlockmoreI.h
+forest.o: $(srcdir)/xlockmore.h
+fps.o: ../config.h
+fps.o: $(srcdir)/fpsI.h
+fps.o: $(srcdir)/fps.h
+fps.o: $(srcdir)/recanim.h
+fps.o: $(srcdir)/screenhackI.h
+fps.o: $(UTILS_SRC)/colors.h
+fps.o: $(UTILS_SRC)/font-retry.h
+fps.o: $(UTILS_SRC)/grabscreen.h
+fps.o: $(UTILS_SRC)/hsv.h
+fps.o: $(UTILS_SRC)/resources.h
+fps.o: $(UTILS_SRC)/usleep.h
+fps.o: $(UTILS_SRC)/visual.h
+fps.o: $(UTILS_SRC)/yarandom.h
+fuzzyflakes.o: ../config.h
+fuzzyflakes.o: $(srcdir)/fps.h
+fuzzyflakes.o: $(srcdir)/recanim.h
+fuzzyflakes.o: $(srcdir)/screenhackI.h
+fuzzyflakes.o: $(srcdir)/screenhack.h
+fuzzyflakes.o: $(UTILS_SRC)/colors.h
+fuzzyflakes.o: $(UTILS_SRC)/font-retry.h
+fuzzyflakes.o: $(UTILS_SRC)/grabscreen.h
+fuzzyflakes.o: $(UTILS_SRC)/hsv.h
+fuzzyflakes.o: $(UTILS_SRC)/resources.h
+fuzzyflakes.o: $(UTILS_SRC)/usleep.h
+fuzzyflakes.o: $(UTILS_SRC)/visual.h
+fuzzyflakes.o: $(UTILS_SRC)/yarandom.h
+galaxy.o: ../config.h
+galaxy.o: $(srcdir)/fps.h
+galaxy.o: $(srcdir)/recanim.h
+galaxy.o: $(srcdir)/screenhackI.h
+galaxy.o: $(UTILS_SRC)/colors.h
+galaxy.o: $(UTILS_SRC)/erase.h
+galaxy.o: $(UTILS_SRC)/font-retry.h
+galaxy.o: $(UTILS_SRC)/grabscreen.h
+galaxy.o: $(UTILS_SRC)/hsv.h
+galaxy.o: $(UTILS_SRC)/resources.h
+galaxy.o: $(UTILS_SRC)/usleep.h
+galaxy.o: $(UTILS_SRC)/visual.h
+galaxy.o: $(UTILS_SRC)/yarandom.h
+galaxy.o: $(srcdir)/xlockmoreI.h
+galaxy.o: $(srcdir)/xlockmore.h
+glitchpeg.o: ../config.h
+glitchpeg.o: $(srcdir)/fps.h
+glitchpeg.o: $(srcdir)/recanim.h
+glitchpeg.o: $(srcdir)/screenhackI.h
+glitchpeg.o: $(srcdir)/screenhack.h
+glitchpeg.o: $(UTILS_SRC)/colors.h
+glitchpeg.o: $(UTILS_SRC)/font-retry.h
+glitchpeg.o: $(UTILS_SRC)/grabscreen.h
+glitchpeg.o: $(UTILS_SRC)/hsv.h
+glitchpeg.o: $(UTILS_SRC)/resources.h
+glitchpeg.o: $(UTILS_SRC)/usleep.h
+glitchpeg.o: $(UTILS_SRC)/visual.h
+glitchpeg.o: $(UTILS_SRC)/yarandom.h
+glitchpeg.o: $(srcdir)/ximage-loader.h
+goop.o: ../config.h
+goop.o: $(srcdir)/fps.h
+goop.o: $(srcdir)/recanim.h
+goop.o: $(srcdir)/screenhackI.h
+goop.o: $(srcdir)/screenhack.h
+goop.o: $(UTILS_SRC)/alpha.h
+goop.o: $(UTILS_SRC)/colors.h
+goop.o: $(UTILS_SRC)/font-retry.h
+goop.o: $(UTILS_SRC)/grabscreen.h
+goop.o: $(UTILS_SRC)/hsv.h
+goop.o: $(UTILS_SRC)/resources.h
+goop.o: $(UTILS_SRC)/spline.h
+goop.o: $(UTILS_SRC)/usleep.h
+goop.o: $(UTILS_SRC)/visual.h
+goop.o: $(UTILS_SRC)/yarandom.h
+grav.o: ../config.h
+grav.o: $(srcdir)/fps.h
+grav.o: $(srcdir)/recanim.h
+grav.o: $(srcdir)/screenhackI.h
+grav.o: $(UTILS_SRC)/colors.h
+grav.o: $(UTILS_SRC)/erase.h
+grav.o: $(UTILS_SRC)/font-retry.h
+grav.o: $(UTILS_SRC)/grabscreen.h
+grav.o: $(UTILS_SRC)/hsv.h
+grav.o: $(UTILS_SRC)/resources.h
+grav.o: $(UTILS_SRC)/usleep.h
+grav.o: $(UTILS_SRC)/visual.h
+grav.o: $(UTILS_SRC)/yarandom.h
+grav.o: $(srcdir)/xlockmoreI.h
+grav.o: $(srcdir)/xlockmore.h
+greynetic.o: ../config.h
+greynetic.o: $(srcdir)/fps.h
+greynetic.o: $(srcdir)/recanim.h
+greynetic.o: $(srcdir)/screenhackI.h
+greynetic.o: $(srcdir)/screenhack.h
+greynetic.o: $(UTILS_SRC)/colors.h
+greynetic.o: $(UTILS_SRC)/font-retry.h
+greynetic.o: $(UTILS_SRC)/grabscreen.h
+greynetic.o: $(UTILS_SRC)/hsv.h
+greynetic.o: $(UTILS_SRC)/resources.h
+greynetic.o: $(UTILS_SRC)/usleep.h
+greynetic.o: $(UTILS_SRC)/visual.h
+greynetic.o: $(UTILS_SRC)/yarandom.h
+halftone.o: ../config.h
+halftone.o: $(srcdir)/fps.h
+halftone.o: $(srcdir)/recanim.h
+halftone.o: $(srcdir)/screenhackI.h
+halftone.o: $(srcdir)/screenhack.h
+halftone.o: $(UTILS_SRC)/colors.h
+halftone.o: $(UTILS_SRC)/font-retry.h
+halftone.o: $(UTILS_SRC)/grabscreen.h
+halftone.o: $(UTILS_SRC)/hsv.h
+halftone.o: $(UTILS_SRC)/resources.h
+halftone.o: $(UTILS_SRC)/usleep.h
+halftone.o: $(UTILS_SRC)/visual.h
+halftone.o: $(UTILS_SRC)/yarandom.h
+halo.o: ../config.h
+halo.o: $(srcdir)/fps.h
+halo.o: $(srcdir)/recanim.h
+halo.o: $(srcdir)/screenhackI.h
+halo.o: $(srcdir)/screenhack.h
+halo.o: $(UTILS_SRC)/colors.h
+halo.o: $(UTILS_SRC)/font-retry.h
+halo.o: $(UTILS_SRC)/grabscreen.h
+halo.o: $(UTILS_SRC)/hsv.h
+halo.o: $(UTILS_SRC)/resources.h
+halo.o: $(UTILS_SRC)/usleep.h
+halo.o: $(UTILS_SRC)/visual.h
+halo.o: $(UTILS_SRC)/yarandom.h
+helix.o: ../config.h
+helix.o: $(srcdir)/fps.h
+helix.o: $(srcdir)/recanim.h
+helix.o: $(srcdir)/screenhackI.h
+helix.o: $(srcdir)/screenhack.h
+helix.o: $(UTILS_SRC)/colors.h
+helix.o: $(UTILS_SRC)/erase.h
+helix.o: $(UTILS_SRC)/font-retry.h
+helix.o: $(UTILS_SRC)/grabscreen.h
+helix.o: $(UTILS_SRC)/hsv.h
+helix.o: $(UTILS_SRC)/resources.h
+helix.o: $(UTILS_SRC)/usleep.h
+helix.o: $(UTILS_SRC)/visual.h
+helix.o: $(UTILS_SRC)/yarandom.h
+hexadrop.o: ../config.h
+hexadrop.o: $(srcdir)/fps.h
+hexadrop.o: $(srcdir)/recanim.h
+hexadrop.o: $(srcdir)/screenhackI.h
+hexadrop.o: $(srcdir)/screenhack.h
+hexadrop.o: $(UTILS_SRC)/colors.h
+hexadrop.o: $(UTILS_SRC)/font-retry.h
+hexadrop.o: $(UTILS_SRC)/grabscreen.h
+hexadrop.o: $(UTILS_SRC)/hsv.h
+hexadrop.o: $(UTILS_SRC)/resources.h
+hexadrop.o: $(UTILS_SRC)/usleep.h
+hexadrop.o: $(UTILS_SRC)/visual.h
+hexadrop.o: $(UTILS_SRC)/yarandom.h
+hopalong.o: ../config.h
+hopalong.o: $(srcdir)/fps.h
+hopalong.o: $(srcdir)/recanim.h
+hopalong.o: $(srcdir)/screenhackI.h
+hopalong.o: $(UTILS_SRC)/colors.h
+hopalong.o: $(UTILS_SRC)/erase.h
+hopalong.o: $(UTILS_SRC)/font-retry.h
+hopalong.o: $(UTILS_SRC)/grabscreen.h
+hopalong.o: $(UTILS_SRC)/hsv.h
+hopalong.o: $(UTILS_SRC)/resources.h
+hopalong.o: $(UTILS_SRC)/usleep.h
+hopalong.o: $(UTILS_SRC)/visual.h
+hopalong.o: $(UTILS_SRC)/yarandom.h
+hopalong.o: $(srcdir)/xlockmoreI.h
+hopalong.o: $(srcdir)/xlockmore.h
+hyperball.o: ../config.h
+hyperball.o: $(srcdir)/fps.h
+hyperball.o: $(srcdir)/recanim.h
+hyperball.o: $(srcdir)/screenhackI.h
+hyperball.o: $(srcdir)/screenhack.h
+hyperball.o: $(UTILS_SRC)/colors.h
+hyperball.o: $(UTILS_SRC)/font-retry.h
+hyperball.o: $(UTILS_SRC)/grabscreen.h
+hyperball.o: $(UTILS_SRC)/hsv.h
+hyperball.o: $(UTILS_SRC)/resources.h
+hyperball.o: $(UTILS_SRC)/usleep.h
+hyperball.o: $(UTILS_SRC)/visual.h
+hyperball.o: $(UTILS_SRC)/yarandom.h
+hypercube.o: ../config.h
+hypercube.o: $(srcdir)/fps.h
+hypercube.o: $(srcdir)/recanim.h
+hypercube.o: $(srcdir)/screenhackI.h
+hypercube.o: $(srcdir)/screenhack.h
+hypercube.o: $(UTILS_SRC)/colors.h
+hypercube.o: $(UTILS_SRC)/font-retry.h
+hypercube.o: $(UTILS_SRC)/grabscreen.h
+hypercube.o: $(UTILS_SRC)/hsv.h
+hypercube.o: $(UTILS_SRC)/resources.h
+hypercube.o: $(UTILS_SRC)/usleep.h
+hypercube.o: $(UTILS_SRC)/visual.h
+hypercube.o: $(UTILS_SRC)/yarandom.h
+ifs.o: ../config.h
+ifs.o: $(srcdir)/fps.h
+ifs.o: $(srcdir)/recanim.h
+ifs.o: $(srcdir)/screenhackI.h
+ifs.o: $(srcdir)/screenhack.h
+ifs.o: $(UTILS_SRC)/colors.h
+ifs.o: $(UTILS_SRC)/font-retry.h
+ifs.o: $(UTILS_SRC)/grabscreen.h
+ifs.o: $(UTILS_SRC)/hsv.h
+ifs.o: $(UTILS_SRC)/resources.h
+ifs.o: $(UTILS_SRC)/usleep.h
+ifs.o: $(UTILS_SRC)/visual.h
+ifs.o: $(UTILS_SRC)/yarandom.h
+imsmap.o: ../config.h
+imsmap.o: $(srcdir)/fps.h
+imsmap.o: $(srcdir)/recanim.h
+imsmap.o: $(srcdir)/screenhackI.h
+imsmap.o: $(srcdir)/screenhack.h
+imsmap.o: $(UTILS_SRC)/colors.h
+imsmap.o: $(UTILS_SRC)/font-retry.h
+imsmap.o: $(UTILS_SRC)/grabscreen.h
+imsmap.o: $(UTILS_SRC)/hsv.h
+imsmap.o: $(UTILS_SRC)/resources.h
+imsmap.o: $(UTILS_SRC)/usleep.h
+imsmap.o: $(UTILS_SRC)/visual.h
+imsmap.o: $(UTILS_SRC)/yarandom.h
+interaggregate.o: ../config.h
+interaggregate.o: $(srcdir)/fps.h
+interaggregate.o: $(srcdir)/recanim.h
+interaggregate.o: $(srcdir)/screenhackI.h
+interaggregate.o: $(srcdir)/screenhack.h
+interaggregate.o: $(UTILS_SRC)/colors.h
+interaggregate.o: $(UTILS_SRC)/font-retry.h
+interaggregate.o: $(UTILS_SRC)/grabscreen.h
+interaggregate.o: $(UTILS_SRC)/hsv.h
+interaggregate.o: $(UTILS_SRC)/resources.h
+interaggregate.o: $(UTILS_SRC)/usleep.h
+interaggregate.o: $(UTILS_SRC)/visual.h
+interaggregate.o: $(UTILS_SRC)/yarandom.h
+interference.o: ../config.h
+interference.o: $(srcdir)/fps.h
+interference.o: $(srcdir)/recanim.h
+interference.o: $(srcdir)/screenhackI.h
+interference.o: $(srcdir)/screenhack.h
+interference.o: $(UTILS_SRC)/aligned_malloc.h
+interference.o: $(UTILS_SRC)/colors.h
+interference.o: $(UTILS_SRC)/font-retry.h
+interference.o: $(UTILS_SRC)/grabscreen.h
+interference.o: $(UTILS_SRC)/hsv.h
+interference.o: $(UTILS_SRC)/resources.h
+interference.o: $(UTILS_SRC)/thread_util.h
+interference.o: $(UTILS_SRC)/usleep.h
+interference.o: $(UTILS_SRC)/visual.h
+interference.o: $(UTILS_SRC)/xdbe.h
+interference.o: $(UTILS_SRC)/xshm.h
+interference.o: $(UTILS_SRC)/yarandom.h
+intermomentary.o: ../config.h
+intermomentary.o: $(srcdir)/fps.h
+intermomentary.o: $(srcdir)/recanim.h
+intermomentary.o: $(srcdir)/screenhackI.h
+intermomentary.o: $(srcdir)/screenhack.h
+intermomentary.o: $(UTILS_SRC)/colors.h
+intermomentary.o: $(UTILS_SRC)/font-retry.h
+intermomentary.o: $(UTILS_SRC)/grabscreen.h
+intermomentary.o: $(UTILS_SRC)/hsv.h
+intermomentary.o: $(UTILS_SRC)/resources.h
+intermomentary.o: $(UTILS_SRC)/usleep.h
+intermomentary.o: $(UTILS_SRC)/visual.h
+intermomentary.o: $(UTILS_SRC)/yarandom.h
+juggle.o: ../config.h
+juggle.o: $(srcdir)/fps.h
+juggle.o: $(srcdir)/recanim.h
+juggle.o: $(srcdir)/screenhackI.h
+juggle.o: $(UTILS_SRC)/colors.h
+juggle.o: $(UTILS_SRC)/erase.h
+juggle.o: $(UTILS_SRC)/font-retry.h
+juggle.o: $(UTILS_SRC)/grabscreen.h
+juggle.o: $(UTILS_SRC)/hsv.h
+juggle.o: $(UTILS_SRC)/resources.h
+juggle.o: $(UTILS_SRC)/usleep.h
+juggle.o: $(UTILS_SRC)/visual.h
+juggle.o: $(UTILS_SRC)/yarandom.h
+juggle.o: $(srcdir)/xlockmoreI.h
+juggle.o: $(srcdir)/xlockmore.h
+julia.o: ../config.h
+julia.o: $(srcdir)/fps.h
+julia.o: $(srcdir)/recanim.h
+julia.o: $(srcdir)/screenhackI.h
+julia.o: $(UTILS_SRC)/colors.h
+julia.o: $(UTILS_SRC)/erase.h
+julia.o: $(UTILS_SRC)/font-retry.h
+julia.o: $(UTILS_SRC)/grabscreen.h
+julia.o: $(UTILS_SRC)/hsv.h
+julia.o: $(UTILS_SRC)/resources.h
+julia.o: $(UTILS_SRC)/usleep.h
+julia.o: $(UTILS_SRC)/visual.h
+julia.o: $(UTILS_SRC)/yarandom.h
+julia.o: $(srcdir)/xlockmoreI.h
+julia.o: $(srcdir)/xlockmore.h
+kaleidescope.o: ../config.h
+kaleidescope.o: $(srcdir)/fps.h
+kaleidescope.o: $(srcdir)/recanim.h
+kaleidescope.o: $(srcdir)/screenhackI.h
+kaleidescope.o: $(srcdir)/screenhack.h
+kaleidescope.o: $(UTILS_SRC)/colors.h
+kaleidescope.o: $(UTILS_SRC)/font-retry.h
+kaleidescope.o: $(UTILS_SRC)/grabscreen.h
+kaleidescope.o: $(UTILS_SRC)/hsv.h
+kaleidescope.o: $(UTILS_SRC)/resources.h
+kaleidescope.o: $(UTILS_SRC)/spline.h
+kaleidescope.o: $(UTILS_SRC)/usleep.h
+kaleidescope.o: $(UTILS_SRC)/visual.h
+kaleidescope.o: $(UTILS_SRC)/yarandom.h
+kumppa.o: ../config.h
+kumppa.o: $(srcdir)/fps.h
+kumppa.o: $(srcdir)/recanim.h
+kumppa.o: $(srcdir)/screenhackI.h
+kumppa.o: $(srcdir)/screenhack.h
+kumppa.o: $(UTILS_SRC)/colors.h
+kumppa.o: $(UTILS_SRC)/font-retry.h
+kumppa.o: $(UTILS_SRC)/grabscreen.h
+kumppa.o: $(UTILS_SRC)/hsv.h
+kumppa.o: $(UTILS_SRC)/resources.h
+kumppa.o: $(UTILS_SRC)/usleep.h
+kumppa.o: $(UTILS_SRC)/visual.h
+kumppa.o: $(UTILS_SRC)/xdbe.h
+kumppa.o: $(UTILS_SRC)/yarandom.h
+laser.o: ../config.h
+laser.o: $(srcdir)/fps.h
+laser.o: $(srcdir)/recanim.h
+laser.o: $(srcdir)/screenhackI.h
+laser.o: $(UTILS_SRC)/colors.h
+laser.o: $(UTILS_SRC)/erase.h
+laser.o: $(UTILS_SRC)/font-retry.h
+laser.o: $(UTILS_SRC)/grabscreen.h
+laser.o: $(UTILS_SRC)/hsv.h
+laser.o: $(UTILS_SRC)/resources.h
+laser.o: $(UTILS_SRC)/usleep.h
+laser.o: $(UTILS_SRC)/visual.h
+laser.o: $(UTILS_SRC)/yarandom.h
+laser.o: $(srcdir)/xlockmoreI.h
+laser.o: $(srcdir)/xlockmore.h
+lcdscrub.o: ../config.h
+lcdscrub.o: $(srcdir)/fps.h
+lcdscrub.o: $(srcdir)/recanim.h
+lcdscrub.o: $(srcdir)/screenhackI.h
+lcdscrub.o: $(srcdir)/screenhack.h
+lcdscrub.o: $(UTILS_SRC)/colors.h
+lcdscrub.o: $(UTILS_SRC)/font-retry.h
+lcdscrub.o: $(UTILS_SRC)/grabscreen.h
+lcdscrub.o: $(UTILS_SRC)/hsv.h
+lcdscrub.o: $(UTILS_SRC)/resources.h
+lcdscrub.o: $(UTILS_SRC)/usleep.h
+lcdscrub.o: $(UTILS_SRC)/visual.h
+lcdscrub.o: $(UTILS_SRC)/yarandom.h
+lightning.o: ../config.h
+lightning.o: $(srcdir)/fps.h
+lightning.o: $(srcdir)/recanim.h
+lightning.o: $(srcdir)/screenhackI.h
+lightning.o: $(UTILS_SRC)/colors.h
+lightning.o: $(UTILS_SRC)/erase.h
+lightning.o: $(UTILS_SRC)/font-retry.h
+lightning.o: $(UTILS_SRC)/grabscreen.h
+lightning.o: $(UTILS_SRC)/hsv.h
+lightning.o: $(UTILS_SRC)/resources.h
+lightning.o: $(UTILS_SRC)/usleep.h
+lightning.o: $(UTILS_SRC)/visual.h
+lightning.o: $(UTILS_SRC)/yarandom.h
+lightning.o: $(srcdir)/xlockmoreI.h
+lightning.o: $(srcdir)/xlockmore.h
+lisa.o: ../config.h
+lisa.o: $(srcdir)/fps.h
+lisa.o: $(srcdir)/recanim.h
+lisa.o: $(srcdir)/screenhackI.h
+lisa.o: $(UTILS_SRC)/colors.h
+lisa.o: $(UTILS_SRC)/erase.h
+lisa.o: $(UTILS_SRC)/font-retry.h
+lisa.o: $(UTILS_SRC)/grabscreen.h
+lisa.o: $(UTILS_SRC)/hsv.h
+lisa.o: $(UTILS_SRC)/resources.h
+lisa.o: $(UTILS_SRC)/usleep.h
+lisa.o: $(UTILS_SRC)/visual.h
+lisa.o: $(UTILS_SRC)/yarandom.h
+lisa.o: $(srcdir)/xlockmoreI.h
+lisa.o: $(srcdir)/xlockmore.h
+lissie.o: ../config.h
+lissie.o: $(srcdir)/fps.h
+lissie.o: $(srcdir)/recanim.h
+lissie.o: $(srcdir)/screenhackI.h
+lissie.o: $(UTILS_SRC)/colors.h
+lissie.o: $(UTILS_SRC)/erase.h
+lissie.o: $(UTILS_SRC)/font-retry.h
+lissie.o: $(UTILS_SRC)/grabscreen.h
+lissie.o: $(UTILS_SRC)/hsv.h
+lissie.o: $(UTILS_SRC)/resources.h
+lissie.o: $(UTILS_SRC)/usleep.h
+lissie.o: $(UTILS_SRC)/visual.h
+lissie.o: $(UTILS_SRC)/yarandom.h
+lissie.o: $(srcdir)/xlockmoreI.h
+lissie.o: $(srcdir)/xlockmore.h
+lmorph.o: ../config.h
+lmorph.o: $(srcdir)/fps.h
+lmorph.o: $(srcdir)/recanim.h
+lmorph.o: $(srcdir)/screenhackI.h
+lmorph.o: $(srcdir)/screenhack.h
+lmorph.o: $(UTILS_SRC)/colors.h
+lmorph.o: $(UTILS_SRC)/font-retry.h
+lmorph.o: $(UTILS_SRC)/grabscreen.h
+lmorph.o: $(UTILS_SRC)/hsv.h
+lmorph.o: $(UTILS_SRC)/resources.h
+lmorph.o: $(UTILS_SRC)/usleep.h
+lmorph.o: $(UTILS_SRC)/visual.h
+lmorph.o: $(UTILS_SRC)/yarandom.h
+loop.o: $(srcdir)/automata.h
+loop.o: ../config.h
+loop.o: $(srcdir)/fps.h
+loop.o: $(srcdir)/recanim.h
+loop.o: $(srcdir)/screenhackI.h
+loop.o: $(UTILS_SRC)/colors.h
+loop.o: $(UTILS_SRC)/erase.h
+loop.o: $(UTILS_SRC)/font-retry.h
+loop.o: $(UTILS_SRC)/grabscreen.h
+loop.o: $(UTILS_SRC)/hsv.h
+loop.o: $(UTILS_SRC)/resources.h
+loop.o: $(UTILS_SRC)/usleep.h
+loop.o: $(UTILS_SRC)/visual.h
+loop.o: $(UTILS_SRC)/yarandom.h
+loop.o: $(srcdir)/xlockmoreI.h
+loop.o: $(srcdir)/xlockmore.h
+m6502.o: $(srcdir)/analogtv.h
+m6502.o: $(srcdir)/asm6502.h
+m6502.o: ../config.h
+m6502.o: $(srcdir)/fps.h
+m6502.o: m6502.h
+m6502.o: $(srcdir)/recanim.h
+m6502.o: $(srcdir)/screenhackI.h
+m6502.o: $(srcdir)/screenhack.h
+m6502.o: $(UTILS_SRC)/aligned_malloc.h
+m6502.o: $(UTILS_SRC)/colors.h
+m6502.o: $(UTILS_SRC)/font-retry.h
+m6502.o: $(UTILS_SRC)/grabscreen.h
+m6502.o: $(UTILS_SRC)/hsv.h
+m6502.o: $(UTILS_SRC)/resources.h
+m6502.o: $(UTILS_SRC)/thread_util.h
+m6502.o: $(UTILS_SRC)/usleep.h
+m6502.o: $(UTILS_SRC)/visual.h
+m6502.o: $(UTILS_SRC)/xshm.h
+m6502.o: $(UTILS_SRC)/yarandom.h
+maze.o: ../config.h
+maze.o: $(srcdir)/fps.h
+maze.o: $(srcdir)/images/gen/logo-180_png.h
+maze.o: $(srcdir)/images/gen/logo-50_png.h
+maze.o: $(srcdir)/recanim.h
+maze.o: $(srcdir)/screenhackI.h
+maze.o: $(srcdir)/screenhack.h
+maze.o: $(UTILS_SRC)/colors.h
+maze.o: $(UTILS_SRC)/erase.h
+maze.o: $(UTILS_SRC)/font-retry.h
+maze.o: $(UTILS_SRC)/grabscreen.h
+maze.o: $(UTILS_SRC)/hsv.h
+maze.o: $(UTILS_SRC)/resources.h
+maze.o: $(UTILS_SRC)/usleep.h
+maze.o: $(UTILS_SRC)/visual.h
+maze.o: $(UTILS_SRC)/yarandom.h
+maze.o: $(srcdir)/ximage-loader.h
+memscroller.o: ../config.h
+memscroller.o: $(srcdir)/fps.h
+memscroller.o: $(srcdir)/recanim.h
+memscroller.o: $(srcdir)/screenhackI.h
+memscroller.o: $(srcdir)/screenhack.h
+memscroller.o: $(UTILS_SRC)/colors.h
+memscroller.o: $(UTILS_SRC)/font-retry.h
+memscroller.o: $(UTILS_SRC)/grabscreen.h
+memscroller.o: $(UTILS_SRC)/hsv.h
+memscroller.o: $(UTILS_SRC)/resources.h
+memscroller.o: $(UTILS_SRC)/usleep.h
+memscroller.o: $(UTILS_SRC)/visual.h
+memscroller.o: $(UTILS_SRC)/xshm.h
+memscroller.o: $(UTILS_SRC)/yarandom.h
+metaballs.o: ../config.h
+metaballs.o: $(srcdir)/fps.h
+metaballs.o: $(srcdir)/recanim.h
+metaballs.o: $(srcdir)/screenhackI.h
+metaballs.o: $(srcdir)/screenhack.h
+metaballs.o: $(UTILS_SRC)/colors.h
+metaballs.o: $(UTILS_SRC)/font-retry.h
+metaballs.o: $(UTILS_SRC)/grabscreen.h
+metaballs.o: $(UTILS_SRC)/hsv.h
+metaballs.o: $(UTILS_SRC)/resources.h
+metaballs.o: $(UTILS_SRC)/usleep.h
+metaballs.o: $(UTILS_SRC)/visual.h
+metaballs.o: $(UTILS_SRC)/yarandom.h
+moire2.o: ../config.h
+moire2.o: $(srcdir)/fps.h
+moire2.o: $(srcdir)/recanim.h
+moire2.o: $(srcdir)/screenhackI.h
+moire2.o: $(srcdir)/screenhack.h
+moire2.o: $(UTILS_SRC)/colors.h
+moire2.o: $(UTILS_SRC)/font-retry.h
+moire2.o: $(UTILS_SRC)/grabscreen.h
+moire2.o: $(UTILS_SRC)/hsv.h
+moire2.o: $(UTILS_SRC)/resources.h
+moire2.o: $(UTILS_SRC)/usleep.h
+moire2.o: $(UTILS_SRC)/visual.h
+moire2.o: $(UTILS_SRC)/xdbe.h
+moire2.o: $(UTILS_SRC)/yarandom.h
+moire.o: ../config.h
+moire.o: $(srcdir)/fps.h
+moire.o: $(srcdir)/recanim.h
+moire.o: $(srcdir)/screenhackI.h
+moire.o: $(srcdir)/screenhack.h
+moire.o: $(UTILS_SRC)/colors.h
+moire.o: $(UTILS_SRC)/font-retry.h
+moire.o: $(UTILS_SRC)/grabscreen.h
+moire.o: $(UTILS_SRC)/hsv.h
+moire.o: $(UTILS_SRC)/resources.h
+moire.o: $(UTILS_SRC)/usleep.h
+moire.o: $(UTILS_SRC)/visual.h
+moire.o: $(UTILS_SRC)/xshm.h
+moire.o: $(UTILS_SRC)/yarandom.h
+mountain.o: ../config.h
+mountain.o: $(srcdir)/fps.h
+mountain.o: $(srcdir)/recanim.h
+mountain.o: $(srcdir)/screenhackI.h
+mountain.o: $(UTILS_SRC)/colors.h
+mountain.o: $(UTILS_SRC)/erase.h
+mountain.o: $(UTILS_SRC)/font-retry.h
+mountain.o: $(UTILS_SRC)/grabscreen.h
+mountain.o: $(UTILS_SRC)/hsv.h
+mountain.o: $(UTILS_SRC)/resources.h
+mountain.o: $(UTILS_SRC)/usleep.h
+mountain.o: $(UTILS_SRC)/visual.h
+mountain.o: $(UTILS_SRC)/yarandom.h
+mountain.o: $(srcdir)/xlockmoreI.h
+mountain.o: $(srcdir)/xlockmore.h
+munch.o: ../config.h
+munch.o: $(srcdir)/fps.h
+munch.o: $(srcdir)/recanim.h
+munch.o: $(srcdir)/screenhackI.h
+munch.o: $(srcdir)/screenhack.h
+munch.o: $(UTILS_SRC)/colors.h
+munch.o: $(UTILS_SRC)/font-retry.h
+munch.o: $(UTILS_SRC)/grabscreen.h
+munch.o: $(UTILS_SRC)/hsv.h
+munch.o: $(UTILS_SRC)/resources.h
+munch.o: $(UTILS_SRC)/usleep.h
+munch.o: $(UTILS_SRC)/visual.h
+munch.o: $(UTILS_SRC)/yarandom.h
+nerverot.o: ../config.h
+nerverot.o: $(srcdir)/fps.h
+nerverot.o: $(srcdir)/recanim.h
+nerverot.o: $(srcdir)/screenhackI.h
+nerverot.o: $(srcdir)/screenhack.h
+nerverot.o: $(UTILS_SRC)/colors.h
+nerverot.o: $(UTILS_SRC)/font-retry.h
+nerverot.o: $(UTILS_SRC)/grabscreen.h
+nerverot.o: $(UTILS_SRC)/hsv.h
+nerverot.o: $(UTILS_SRC)/resources.h
+nerverot.o: $(UTILS_SRC)/usleep.h
+nerverot.o: $(UTILS_SRC)/visual.h
+nerverot.o: $(UTILS_SRC)/yarandom.h
+noseguy.o: ../config.h
+noseguy.o: $(srcdir)/fps.h
+noseguy.o: $(srcdir)/images/gen/nose-f1_png.h
+noseguy.o: $(srcdir)/images/gen/nose-f2_png.h
+noseguy.o: $(srcdir)/images/gen/nose-f3_png.h
+noseguy.o: $(srcdir)/images/gen/nose-f4_png.h
+noseguy.o: $(srcdir)/images/gen/nose-l1_png.h
+noseguy.o: $(srcdir)/images/gen/nose-l2_png.h
+noseguy.o: $(srcdir)/images/gen/nose-r1_png.h
+noseguy.o: $(srcdir)/images/gen/nose-r2_png.h
+noseguy.o: $(srcdir)/recanim.h
+noseguy.o: $(srcdir)/screenhackI.h
+noseguy.o: $(srcdir)/screenhack.h
+noseguy.o: $(UTILS_SRC)/colors.h
+noseguy.o: $(UTILS_SRC)/font-retry.h
+noseguy.o: $(UTILS_SRC)/grabscreen.h
+noseguy.o: $(UTILS_SRC)/hsv.h
+noseguy.o: $(UTILS_SRC)/resources.h
+noseguy.o: $(UTILS_SRC)/textclient.h
+noseguy.o: $(UTILS_SRC)/usleep.h
+noseguy.o: $(UTILS_SRC)/visual.h
+noseguy.o: $(UTILS_SRC)/xft.h
+noseguy.o: $(UTILS_SRC)/yarandom.h
+noseguy.o: $(srcdir)/ximage-loader.h
+pacman_ai.o: ../config.h
+pacman_ai.o: $(srcdir)/fps.h
+pacman_ai.o: $(srcdir)/pacman_ai.h
+pacman_ai.o: $(srcdir)/pacman.h
+pacman_ai.o: $(srcdir)/pacman_level.h
+pacman_ai.o: $(srcdir)/recanim.h
+pacman_ai.o: $(srcdir)/screenhackI.h
+pacman_ai.o: $(UTILS_SRC)/colors.h
+pacman_ai.o: $(UTILS_SRC)/erase.h
+pacman_ai.o: $(UTILS_SRC)/font-retry.h
+pacman_ai.o: $(UTILS_SRC)/grabscreen.h
+pacman_ai.o: $(UTILS_SRC)/hsv.h
+pacman_ai.o: $(UTILS_SRC)/resources.h
+pacman_ai.o: $(UTILS_SRC)/usleep.h
+pacman_ai.o: $(UTILS_SRC)/visual.h
+pacman_ai.o: $(UTILS_SRC)/yarandom.h
+pacman_ai.o: $(srcdir)/ximage-loader.h
+pacman_ai.o: $(srcdir)/xlockmoreI.h
+pacman_level.o: ../config.h
+pacman_level.o: $(srcdir)/fps.h
+pacman_level.o: $(srcdir)/pacman.h
+pacman_level.o: $(srcdir)/pacman_level.h
+pacman_level.o: $(srcdir)/recanim.h
+pacman_level.o: $(srcdir)/screenhackI.h
+pacman_level.o: $(UTILS_SRC)/colors.h
+pacman_level.o: $(UTILS_SRC)/erase.h
+pacman_level.o: $(UTILS_SRC)/font-retry.h
+pacman_level.o: $(UTILS_SRC)/grabscreen.h
+pacman_level.o: $(UTILS_SRC)/hsv.h
+pacman_level.o: $(UTILS_SRC)/resources.h
+pacman_level.o: $(UTILS_SRC)/usleep.h
+pacman_level.o: $(UTILS_SRC)/visual.h
+pacman_level.o: $(UTILS_SRC)/yarandom.h
+pacman_level.o: $(srcdir)/ximage-loader.h
+pacman_level.o: $(srcdir)/xlockmoreI.h
+pacman.o: ../config.h
+pacman.o: $(srcdir)/fps.h
+pacman.o: $(srcdir)/images/gen/pacman_png.h
+pacman.o: $(srcdir)/pacman_ai.h
+pacman.o: $(srcdir)/pacman.h
+pacman.o: $(srcdir)/pacman_level.h
+pacman.o: $(srcdir)/recanim.h
+pacman.o: $(srcdir)/screenhackI.h
+pacman.o: $(UTILS_SRC)/colors.h
+pacman.o: $(UTILS_SRC)/erase.h
+pacman.o: $(UTILS_SRC)/font-retry.h
+pacman.o: $(UTILS_SRC)/grabscreen.h
+pacman.o: $(UTILS_SRC)/hsv.h
+pacman.o: $(UTILS_SRC)/resources.h
+pacman.o: $(UTILS_SRC)/usleep.h
+pacman.o: $(UTILS_SRC)/visual.h
+pacman.o: $(UTILS_SRC)/yarandom.h
+pacman.o: $(srcdir)/ximage-loader.h
+pacman.o: $(srcdir)/xlockmoreI.h
+pacman.o: $(srcdir)/xlockmore.h
+pedal.o: ../config.h
+pedal.o: $(srcdir)/fps.h
+pedal.o: $(srcdir)/recanim.h
+pedal.o: $(srcdir)/screenhackI.h
+pedal.o: $(srcdir)/screenhack.h
+pedal.o: $(UTILS_SRC)/colors.h
+pedal.o: $(UTILS_SRC)/erase.h
+pedal.o: $(UTILS_SRC)/font-retry.h
+pedal.o: $(UTILS_SRC)/grabscreen.h
+pedal.o: $(UTILS_SRC)/hsv.h
+pedal.o: $(UTILS_SRC)/resources.h
+pedal.o: $(UTILS_SRC)/usleep.h
+pedal.o: $(UTILS_SRC)/visual.h
+pedal.o: $(UTILS_SRC)/yarandom.h
+penetrate.o: ../config.h
+penetrate.o: $(srcdir)/fps.h
+penetrate.o: $(srcdir)/recanim.h
+penetrate.o: $(srcdir)/screenhackI.h
+penetrate.o: $(srcdir)/screenhack.h
+penetrate.o: $(UTILS_SRC)/colors.h
+penetrate.o: $(UTILS_SRC)/font-retry.h
+penetrate.o: $(UTILS_SRC)/grabscreen.h
+penetrate.o: $(UTILS_SRC)/hsv.h
+penetrate.o: $(UTILS_SRC)/resources.h
+penetrate.o: $(UTILS_SRC)/usleep.h
+penetrate.o: $(UTILS_SRC)/visual.h
+penetrate.o: $(UTILS_SRC)/yarandom.h
+penrose.o: ../config.h
+penrose.o: $(srcdir)/fps.h
+penrose.o: $(srcdir)/recanim.h
+penrose.o: $(srcdir)/screenhackI.h
+penrose.o: $(UTILS_SRC)/colors.h
+penrose.o: $(UTILS_SRC)/erase.h
+penrose.o: $(UTILS_SRC)/font-retry.h
+penrose.o: $(UTILS_SRC)/grabscreen.h
+penrose.o: $(UTILS_SRC)/hsv.h
+penrose.o: $(UTILS_SRC)/resources.h
+penrose.o: $(UTILS_SRC)/usleep.h
+penrose.o: $(UTILS_SRC)/visual.h
+penrose.o: $(UTILS_SRC)/yarandom.h
+penrose.o: $(srcdir)/xlockmoreI.h
+penrose.o: $(srcdir)/xlockmore.h
+petri.o: ../config.h
+petri.o: $(srcdir)/fps.h
+petri.o: $(srcdir)/recanim.h
+petri.o: $(srcdir)/screenhackI.h
+petri.o: $(srcdir)/screenhack.h
+petri.o: $(UTILS_SRC)/colors.h
+petri.o: $(UTILS_SRC)/font-retry.h
+petri.o: $(UTILS_SRC)/grabscreen.h
+petri.o: $(UTILS_SRC)/hsv.h
+petri.o: $(UTILS_SRC)/resources.h
+petri.o: $(UTILS_SRC)/spline.h
+petri.o: $(UTILS_SRC)/usleep.h
+petri.o: $(UTILS_SRC)/visual.h
+petri.o: $(UTILS_SRC)/yarandom.h
+phosphor.o: ../config.h
+phosphor.o: $(srcdir)/fps.h
+phosphor.o: $(srcdir)/images/gen/6x10font_png.h
+phosphor.o: $(srcdir)/recanim.h
+phosphor.o: $(srcdir)/screenhackI.h
+phosphor.o: $(srcdir)/screenhack.h
+phosphor.o: $(UTILS_SRC)/colors.h
+phosphor.o: $(UTILS_SRC)/font-retry.h
+phosphor.o: $(UTILS_SRC)/grabscreen.h
+phosphor.o: $(UTILS_SRC)/hsv.h
+phosphor.o: $(UTILS_SRC)/resources.h
+phosphor.o: $(UTILS_SRC)/textclient.h
+phosphor.o: $(UTILS_SRC)/usleep.h
+phosphor.o: $(UTILS_SRC)/utf8wc.h
+phosphor.o: $(UTILS_SRC)/visual.h
+phosphor.o: $(UTILS_SRC)/yarandom.h
+phosphor.o: $(srcdir)/ximage-loader.h
+piecewise.o: ../config.h
+piecewise.o: $(srcdir)/fps.h
+piecewise.o: $(srcdir)/recanim.h
+piecewise.o: $(srcdir)/screenhackI.h
+piecewise.o: $(srcdir)/screenhack.h
+piecewise.o: $(UTILS_SRC)/colors.h
+piecewise.o: $(UTILS_SRC)/font-retry.h
+piecewise.o: $(UTILS_SRC)/grabscreen.h
+piecewise.o: $(UTILS_SRC)/hsv.h
+piecewise.o: $(UTILS_SRC)/resources.h
+piecewise.o: $(UTILS_SRC)/usleep.h
+piecewise.o: $(UTILS_SRC)/visual.h
+piecewise.o: $(UTILS_SRC)/xdbe.h
+piecewise.o: $(UTILS_SRC)/yarandom.h
+polyominoes.o: ../config.h
+polyominoes.o: $(srcdir)/fps.h
+polyominoes.o: $(srcdir)/recanim.h
+polyominoes.o: $(srcdir)/screenhackI.h
+polyominoes.o: $(UTILS_SRC)/colors.h
+polyominoes.o: $(UTILS_SRC)/erase.h
+polyominoes.o: $(UTILS_SRC)/font-retry.h
+polyominoes.o: $(UTILS_SRC)/grabscreen.h
+polyominoes.o: $(UTILS_SRC)/hsv.h
+polyominoes.o: $(UTILS_SRC)/resources.h
+polyominoes.o: $(UTILS_SRC)/usleep.h
+polyominoes.o: $(UTILS_SRC)/visual.h
+polyominoes.o: $(UTILS_SRC)/yarandom.h
+polyominoes.o: $(srcdir)/xlockmoreI.h
+polyominoes.o: $(srcdir)/xlockmore.h
+pong.o: $(srcdir)/analogtv.h
+pong.o: ../config.h
+pong.o: $(srcdir)/fps.h
+pong.o: $(srcdir)/recanim.h
+pong.o: $(srcdir)/screenhackI.h
+pong.o: $(srcdir)/screenhack.h
+pong.o: $(UTILS_SRC)/aligned_malloc.h
+pong.o: $(UTILS_SRC)/colors.h
+pong.o: $(UTILS_SRC)/font-retry.h
+pong.o: $(UTILS_SRC)/grabscreen.h
+pong.o: $(UTILS_SRC)/hsv.h
+pong.o: $(UTILS_SRC)/resources.h
+pong.o: $(UTILS_SRC)/thread_util.h
+pong.o: $(UTILS_SRC)/usleep.h
+pong.o: $(UTILS_SRC)/visual.h
+pong.o: $(UTILS_SRC)/xshm.h
+pong.o: $(UTILS_SRC)/yarandom.h
+popsquares.o: ../config.h
+popsquares.o: $(srcdir)/fps.h
+popsquares.o: $(srcdir)/recanim.h
+popsquares.o: $(srcdir)/screenhackI.h
+popsquares.o: $(srcdir)/screenhack.h
+popsquares.o: $(UTILS_SRC)/colors.h
+popsquares.o: $(UTILS_SRC)/font-retry.h
+popsquares.o: $(UTILS_SRC)/grabscreen.h
+popsquares.o: $(UTILS_SRC)/hsv.h
+popsquares.o: $(UTILS_SRC)/resources.h
+popsquares.o: $(UTILS_SRC)/usleep.h
+popsquares.o: $(UTILS_SRC)/visual.h
+popsquares.o: $(UTILS_SRC)/xdbe.h
+popsquares.o: $(UTILS_SRC)/yarandom.h
+pyro.o: ../config.h
+pyro.o: $(srcdir)/fps.h
+pyro.o: $(srcdir)/recanim.h
+pyro.o: $(srcdir)/screenhackI.h
+pyro.o: $(srcdir)/screenhack.h
+pyro.o: $(UTILS_SRC)/colors.h
+pyro.o: $(UTILS_SRC)/font-retry.h
+pyro.o: $(UTILS_SRC)/grabscreen.h
+pyro.o: $(UTILS_SRC)/hsv.h
+pyro.o: $(UTILS_SRC)/resources.h
+pyro.o: $(UTILS_SRC)/usleep.h
+pyro.o: $(UTILS_SRC)/visual.h
+pyro.o: $(UTILS_SRC)/yarandom.h
+qix.o: ../config.h
+qix.o: $(srcdir)/fps.h
+qix.o: $(srcdir)/recanim.h
+qix.o: $(srcdir)/screenhackI.h
+qix.o: $(srcdir)/screenhack.h
+qix.o: $(UTILS_SRC)/alpha.h
+qix.o: $(UTILS_SRC)/colors.h
+qix.o: $(UTILS_SRC)/font-retry.h
+qix.o: $(UTILS_SRC)/grabscreen.h
+qix.o: $(UTILS_SRC)/hsv.h
+qix.o: $(UTILS_SRC)/resources.h
+qix.o: $(UTILS_SRC)/usleep.h
+qix.o: $(UTILS_SRC)/visual.h
+qix.o: $(UTILS_SRC)/yarandom.h
+rd-bomb.o: ../config.h
+rd-bomb.o: $(srcdir)/fps.h
+rd-bomb.o: $(srcdir)/recanim.h
+rd-bomb.o: $(srcdir)/screenhackI.h
+rd-bomb.o: $(srcdir)/screenhack.h
+rd-bomb.o: $(UTILS_SRC)/colors.h
+rd-bomb.o: $(UTILS_SRC)/font-retry.h
+rd-bomb.o: $(UTILS_SRC)/grabscreen.h
+rd-bomb.o: $(UTILS_SRC)/hsv.h
+rd-bomb.o: $(UTILS_SRC)/resources.h
+rd-bomb.o: $(UTILS_SRC)/usleep.h
+rd-bomb.o: $(UTILS_SRC)/visual.h
+rd-bomb.o: $(UTILS_SRC)/xshm.h
+rd-bomb.o: $(UTILS_SRC)/yarandom.h
+recanim.o: ../config.h
+recanim.o: $(srcdir)/fps.h
+recanim.o: $(srcdir)/recanim.h
+recanim.o: $(srcdir)/screenhackI.h
+recanim.o: $(UTILS_SRC)/colors.h
+recanim.o: $(UTILS_SRC)/font-retry.h
+recanim.o: $(UTILS_SRC)/grabscreen.h
+recanim.o: $(UTILS_SRC)/hsv.h
+recanim.o: $(UTILS_SRC)/resources.h
+recanim.o: $(UTILS_SRC)/usleep.h
+recanim.o: $(UTILS_SRC)/visual.h
+recanim.o: $(UTILS_SRC)/yarandom.h
+ripples.o: ../config.h
+ripples.o: $(srcdir)/fps.h
+ripples.o: $(srcdir)/recanim.h
+ripples.o: $(srcdir)/screenhackI.h
+ripples.o: $(srcdir)/screenhack.h
+ripples.o: $(UTILS_SRC)/colors.h
+ripples.o: $(UTILS_SRC)/font-retry.h
+ripples.o: $(UTILS_SRC)/grabscreen.h
+ripples.o: $(UTILS_SRC)/hsv.h
+ripples.o: $(UTILS_SRC)/resources.h
+ripples.o: $(UTILS_SRC)/usleep.h
+ripples.o: $(UTILS_SRC)/visual.h
+ripples.o: $(UTILS_SRC)/xshm.h
+ripples.o: $(UTILS_SRC)/yarandom.h
+rocks.o: ../config.h
+rocks.o: $(srcdir)/fps.h
+rocks.o: $(srcdir)/recanim.h
+rocks.o: $(srcdir)/screenhackI.h
+rocks.o: $(srcdir)/screenhack.h
+rocks.o: $(UTILS_SRC)/colors.h
+rocks.o: $(UTILS_SRC)/font-retry.h
+rocks.o: $(UTILS_SRC)/grabscreen.h
+rocks.o: $(UTILS_SRC)/hsv.h
+rocks.o: $(UTILS_SRC)/resources.h
+rocks.o: $(UTILS_SRC)/usleep.h
+rocks.o: $(UTILS_SRC)/visual.h
+rocks.o: $(UTILS_SRC)/yarandom.h
+rorschach.o: ../config.h
+rorschach.o: $(srcdir)/fps.h
+rorschach.o: $(srcdir)/recanim.h
+rorschach.o: $(srcdir)/screenhackI.h
+rorschach.o: $(srcdir)/screenhack.h
+rorschach.o: $(UTILS_SRC)/colors.h
+rorschach.o: $(UTILS_SRC)/erase.h
+rorschach.o: $(UTILS_SRC)/font-retry.h
+rorschach.o: $(UTILS_SRC)/grabscreen.h
+rorschach.o: $(UTILS_SRC)/hsv.h
+rorschach.o: $(UTILS_SRC)/resources.h
+rorschach.o: $(UTILS_SRC)/usleep.h
+rorschach.o: $(UTILS_SRC)/visual.h
+rorschach.o: $(UTILS_SRC)/yarandom.h
+rotor.o: ../config.h
+rotor.o: $(srcdir)/fps.h
+rotor.o: $(srcdir)/recanim.h
+rotor.o: $(srcdir)/screenhackI.h
+rotor.o: $(UTILS_SRC)/colors.h
+rotor.o: $(UTILS_SRC)/erase.h
+rotor.o: $(UTILS_SRC)/font-retry.h
+rotor.o: $(UTILS_SRC)/grabscreen.h
+rotor.o: $(UTILS_SRC)/hsv.h
+rotor.o: $(UTILS_SRC)/resources.h
+rotor.o: $(UTILS_SRC)/usleep.h
+rotor.o: $(UTILS_SRC)/visual.h
+rotor.o: $(UTILS_SRC)/yarandom.h
+rotor.o: $(srcdir)/xlockmoreI.h
+rotor.o: $(srcdir)/xlockmore.h
+rotzoomer.o: ../config.h
+rotzoomer.o: $(srcdir)/fps.h
+rotzoomer.o: $(srcdir)/recanim.h
+rotzoomer.o: $(srcdir)/screenhackI.h
+rotzoomer.o: $(srcdir)/screenhack.h
+rotzoomer.o: $(UTILS_SRC)/colors.h
+rotzoomer.o: $(UTILS_SRC)/font-retry.h
+rotzoomer.o: $(UTILS_SRC)/grabscreen.h
+rotzoomer.o: $(UTILS_SRC)/hsv.h
+rotzoomer.o: $(UTILS_SRC)/resources.h
+rotzoomer.o: $(UTILS_SRC)/usleep.h
+rotzoomer.o: $(UTILS_SRC)/visual.h
+rotzoomer.o: $(UTILS_SRC)/xshm.h
+rotzoomer.o: $(UTILS_SRC)/yarandom.h
+screenhack.o: ../config.h
+screenhack.o: $(srcdir)/fps.h
+screenhack.o: $(srcdir)/recanim.h
+screenhack.o: $(srcdir)/screenhackI.h
+screenhack.o: $(UTILS_SRC)/colors.h
+screenhack.o: $(UTILS_SRC)/font-retry.h
+screenhack.o: $(UTILS_SRC)/grabscreen.h
+screenhack.o: $(UTILS_SRC)/hsv.h
+screenhack.o: $(UTILS_SRC)/resources.h
+screenhack.o: $(UTILS_SRC)/usleep.h
+screenhack.o: $(UTILS_SRC)/version.h
+screenhack.o: $(UTILS_SRC)/visual.h
+screenhack.o: $(UTILS_SRC)/vroot.h
+screenhack.o: $(UTILS_SRC)/xmu.h
+screenhack.o: $(UTILS_SRC)/yarandom.h
+shadebobs.o: ../config.h
+shadebobs.o: $(srcdir)/fps.h
+shadebobs.o: $(srcdir)/recanim.h
+shadebobs.o: $(srcdir)/screenhackI.h
+shadebobs.o: $(srcdir)/screenhack.h
+shadebobs.o: $(UTILS_SRC)/colors.h
+shadebobs.o: $(UTILS_SRC)/font-retry.h
+shadebobs.o: $(UTILS_SRC)/grabscreen.h
+shadebobs.o: $(UTILS_SRC)/hsv.h
+shadebobs.o: $(UTILS_SRC)/resources.h
+shadebobs.o: $(UTILS_SRC)/usleep.h
+shadebobs.o: $(UTILS_SRC)/visual.h
+shadebobs.o: $(UTILS_SRC)/yarandom.h
+sierpinski.o: ../config.h
+sierpinski.o: $(srcdir)/fps.h
+sierpinski.o: $(srcdir)/recanim.h
+sierpinski.o: $(srcdir)/screenhackI.h
+sierpinski.o: $(UTILS_SRC)/colors.h
+sierpinski.o: $(UTILS_SRC)/erase.h
+sierpinski.o: $(UTILS_SRC)/font-retry.h
+sierpinski.o: $(UTILS_SRC)/grabscreen.h
+sierpinski.o: $(UTILS_SRC)/hsv.h
+sierpinski.o: $(UTILS_SRC)/resources.h
+sierpinski.o: $(UTILS_SRC)/usleep.h
+sierpinski.o: $(UTILS_SRC)/visual.h
+sierpinski.o: $(UTILS_SRC)/yarandom.h
+sierpinski.o: $(srcdir)/xlockmoreI.h
+sierpinski.o: $(srcdir)/xlockmore.h
+slidescreen.o: ../config.h
+slidescreen.o: $(srcdir)/fps.h
+slidescreen.o: $(srcdir)/recanim.h
+slidescreen.o: $(srcdir)/screenhackI.h
+slidescreen.o: $(srcdir)/screenhack.h
+slidescreen.o: $(UTILS_SRC)/colors.h
+slidescreen.o: $(UTILS_SRC)/font-retry.h
+slidescreen.o: $(UTILS_SRC)/grabscreen.h
+slidescreen.o: $(UTILS_SRC)/hsv.h
+slidescreen.o: $(UTILS_SRC)/resources.h
+slidescreen.o: $(UTILS_SRC)/usleep.h
+slidescreen.o: $(UTILS_SRC)/visual.h
+slidescreen.o: $(UTILS_SRC)/yarandom.h
+slip.o: ../config.h
+slip.o: $(srcdir)/fps.h
+slip.o: $(srcdir)/recanim.h
+slip.o: $(srcdir)/screenhackI.h
+slip.o: $(UTILS_SRC)/colors.h
+slip.o: $(UTILS_SRC)/erase.h
+slip.o: $(UTILS_SRC)/font-retry.h
+slip.o: $(UTILS_SRC)/grabscreen.h
+slip.o: $(UTILS_SRC)/hsv.h
+slip.o: $(UTILS_SRC)/resources.h
+slip.o: $(UTILS_SRC)/usleep.h
+slip.o: $(UTILS_SRC)/visual.h
+slip.o: $(UTILS_SRC)/yarandom.h
+slip.o: $(srcdir)/xlockmoreI.h
+slip.o: $(srcdir)/xlockmore.h
+speedmine.o: ../config.h
+speedmine.o: $(srcdir)/fps.h
+speedmine.o: $(srcdir)/recanim.h
+speedmine.o: $(srcdir)/screenhackI.h
+speedmine.o: $(srcdir)/screenhack.h
+speedmine.o: $(UTILS_SRC)/colors.h
+speedmine.o: $(UTILS_SRC)/erase.h
+speedmine.o: $(UTILS_SRC)/font-retry.h
+speedmine.o: $(UTILS_SRC)/grabscreen.h
+speedmine.o: $(UTILS_SRC)/hsv.h
+speedmine.o: $(UTILS_SRC)/resources.h
+speedmine.o: $(UTILS_SRC)/usleep.h
+speedmine.o: $(UTILS_SRC)/visual.h
+speedmine.o: $(UTILS_SRC)/yarandom.h
+sphere.o: ../config.h
+sphere.o: $(srcdir)/fps.h
+sphere.o: $(srcdir)/recanim.h
+sphere.o: $(srcdir)/screenhackI.h
+sphere.o: $(UTILS_SRC)/colors.h
+sphere.o: $(UTILS_SRC)/erase.h
+sphere.o: $(UTILS_SRC)/font-retry.h
+sphere.o: $(UTILS_SRC)/grabscreen.h
+sphere.o: $(UTILS_SRC)/hsv.h
+sphere.o: $(UTILS_SRC)/resources.h
+sphere.o: $(UTILS_SRC)/usleep.h
+sphere.o: $(UTILS_SRC)/visual.h
+sphere.o: $(UTILS_SRC)/yarandom.h
+sphere.o: $(srcdir)/xlockmoreI.h
+sphere.o: $(srcdir)/xlockmore.h
+spiral.o: ../config.h
+spiral.o: $(srcdir)/fps.h
+spiral.o: $(srcdir)/recanim.h
+spiral.o: $(srcdir)/screenhackI.h
+spiral.o: $(UTILS_SRC)/colors.h
+spiral.o: $(UTILS_SRC)/erase.h
+spiral.o: $(UTILS_SRC)/font-retry.h
+spiral.o: $(UTILS_SRC)/grabscreen.h
+spiral.o: $(UTILS_SRC)/hsv.h
+spiral.o: $(UTILS_SRC)/resources.h
+spiral.o: $(UTILS_SRC)/usleep.h
+spiral.o: $(UTILS_SRC)/visual.h
+spiral.o: $(UTILS_SRC)/yarandom.h
+spiral.o: $(srcdir)/xlockmoreI.h
+spiral.o: $(srcdir)/xlockmore.h
+spotlight.o: ../config.h
+spotlight.o: $(srcdir)/fps.h
+spotlight.o: $(srcdir)/recanim.h
+spotlight.o: $(srcdir)/screenhackI.h
+spotlight.o: $(srcdir)/screenhack.h
+spotlight.o: $(UTILS_SRC)/colors.h
+spotlight.o: $(UTILS_SRC)/font-retry.h
+spotlight.o: $(UTILS_SRC)/grabscreen.h
+spotlight.o: $(UTILS_SRC)/hsv.h
+spotlight.o: $(UTILS_SRC)/resources.h
+spotlight.o: $(UTILS_SRC)/usleep.h
+spotlight.o: $(UTILS_SRC)/visual.h
+spotlight.o: $(UTILS_SRC)/yarandom.h
+squiral.o: ../config.h
+squiral.o: $(srcdir)/fps.h
+squiral.o: $(srcdir)/recanim.h
+squiral.o: $(srcdir)/screenhackI.h
+squiral.o: $(srcdir)/screenhack.h
+squiral.o: $(UTILS_SRC)/colors.h
+squiral.o: $(UTILS_SRC)/erase.h
+squiral.o: $(UTILS_SRC)/font-retry.h
+squiral.o: $(UTILS_SRC)/grabscreen.h
+squiral.o: $(UTILS_SRC)/hsv.h
+squiral.o: $(UTILS_SRC)/resources.h
+squiral.o: $(UTILS_SRC)/usleep.h
+squiral.o: $(UTILS_SRC)/visual.h
+squiral.o: $(UTILS_SRC)/yarandom.h
+starfish.o: ../config.h
+starfish.o: $(srcdir)/fps.h
+starfish.o: $(srcdir)/recanim.h
+starfish.o: $(srcdir)/screenhackI.h
+starfish.o: $(srcdir)/screenhack.h
+starfish.o: $(UTILS_SRC)/colors.h
+starfish.o: $(UTILS_SRC)/font-retry.h
+starfish.o: $(UTILS_SRC)/grabscreen.h
+starfish.o: $(UTILS_SRC)/hsv.h
+starfish.o: $(UTILS_SRC)/resources.h
+starfish.o: $(UTILS_SRC)/spline.h
+starfish.o: $(UTILS_SRC)/usleep.h
+starfish.o: $(UTILS_SRC)/visual.h
+starfish.o: $(UTILS_SRC)/yarandom.h
+strange.o: ../config.h
+strange.o: $(srcdir)/fps.h
+strange.o: $(srcdir)/recanim.h
+strange.o: $(srcdir)/screenhackI.h
+strange.o: $(UTILS_SRC)/aligned_malloc.h
+strange.o: $(UTILS_SRC)/colors.h
+strange.o: $(UTILS_SRC)/erase.h
+strange.o: $(UTILS_SRC)/font-retry.h
+strange.o: $(UTILS_SRC)/grabscreen.h
+strange.o: $(UTILS_SRC)/hsv.h
+strange.o: $(UTILS_SRC)/pow2.h
+strange.o: $(UTILS_SRC)/resources.h
+strange.o: $(UTILS_SRC)/thread_util.h
+strange.o: $(UTILS_SRC)/usleep.h
+strange.o: $(UTILS_SRC)/visual.h
+strange.o: $(UTILS_SRC)/xshm.h
+strange.o: $(UTILS_SRC)/yarandom.h
+strange.o: $(srcdir)/xlockmoreI.h
+strange.o: $(srcdir)/xlockmore.h
+substrate.o: ../config.h
+substrate.o: $(srcdir)/fps.h
+substrate.o: $(srcdir)/recanim.h
+substrate.o: $(srcdir)/screenhackI.h
+substrate.o: $(srcdir)/screenhack.h
+substrate.o: $(UTILS_SRC)/colors.h
+substrate.o: $(UTILS_SRC)/font-retry.h
+substrate.o: $(UTILS_SRC)/grabscreen.h
+substrate.o: $(UTILS_SRC)/hsv.h
+substrate.o: $(UTILS_SRC)/resources.h
+substrate.o: $(UTILS_SRC)/usleep.h
+substrate.o: $(UTILS_SRC)/visual.h
+substrate.o: $(UTILS_SRC)/yarandom.h
+swirl.o: ../config.h
+swirl.o: $(srcdir)/fps.h
+swirl.o: $(srcdir)/recanim.h
+swirl.o: $(srcdir)/screenhackI.h
+swirl.o: $(UTILS_SRC)/colors.h
+swirl.o: $(UTILS_SRC)/erase.h
+swirl.o: $(UTILS_SRC)/font-retry.h
+swirl.o: $(UTILS_SRC)/grabscreen.h
+swirl.o: $(UTILS_SRC)/hsv.h
+swirl.o: $(UTILS_SRC)/resources.h
+swirl.o: $(UTILS_SRC)/usleep.h
+swirl.o: $(UTILS_SRC)/visual.h
+swirl.o: $(UTILS_SRC)/xshm.h
+swirl.o: $(UTILS_SRC)/yarandom.h
+swirl.o: $(srcdir)/xlockmoreI.h
+swirl.o: $(srcdir)/xlockmore.h
+t3d.o: ../config.h
+t3d.o: $(srcdir)/fps.h
+t3d.o: $(srcdir)/recanim.h
+t3d.o: $(srcdir)/screenhackI.h
+t3d.o: $(srcdir)/screenhack.h
+t3d.o: $(UTILS_SRC)/colors.h
+t3d.o: $(UTILS_SRC)/font-retry.h
+t3d.o: $(UTILS_SRC)/grabscreen.h
+t3d.o: $(UTILS_SRC)/hsv.h
+t3d.o: $(UTILS_SRC)/resources.h
+t3d.o: $(UTILS_SRC)/usleep.h
+t3d.o: $(UTILS_SRC)/visual.h
+t3d.o: $(UTILS_SRC)/yarandom.h
+tessellimage.o: ../config.h
+tessellimage.o: $(srcdir)/delaunay.h
+tessellimage.o: $(srcdir)/fps.h
+tessellimage.o: $(srcdir)/recanim.h
+tessellimage.o: $(srcdir)/screenhackI.h
+tessellimage.o: $(srcdir)/screenhack.h
+tessellimage.o: $(UTILS_SRC)/colors.h
+tessellimage.o: $(UTILS_SRC)/font-retry.h
+tessellimage.o: $(UTILS_SRC)/grabscreen.h
+tessellimage.o: $(UTILS_SRC)/hsv.h
+tessellimage.o: $(UTILS_SRC)/resources.h
+tessellimage.o: $(UTILS_SRC)/usleep.h
+tessellimage.o: $(UTILS_SRC)/visual.h
+tessellimage.o: $(UTILS_SRC)/yarandom.h
+testx11.o: ../config.h
+testx11.o: $(srcdir)/fps.h
+testx11.o: $(srcdir)/glx/rotator.h
+testx11.o: $(srcdir)/images/gen/logo-180_png.h
+testx11.o: $(srcdir)/recanim.h
+testx11.o: $(srcdir)/screenhackI.h
+testx11.o: $(srcdir)/screenhack.h
+testx11.o: $(UTILS_SRC)/colorbars.h
+testx11.o: $(UTILS_SRC)/colors.h
+testx11.o: $(UTILS_SRC)/erase.h
+testx11.o: $(UTILS_SRC)/font-retry.h
+testx11.o: $(UTILS_SRC)/grabscreen.h
+testx11.o: $(UTILS_SRC)/hsv.h
+testx11.o: $(UTILS_SRC)/resources.h
+testx11.o: $(UTILS_SRC)/usleep.h
+testx11.o: $(UTILS_SRC)/visual.h
+testx11.o: $(UTILS_SRC)/yarandom.h
+testx11.o: $(srcdir)/ximage-loader.h
+thornbird.o: ../config.h
+thornbird.o: $(srcdir)/fps.h
+thornbird.o: $(srcdir)/recanim.h
+thornbird.o: $(srcdir)/screenhackI.h
+thornbird.o: $(UTILS_SRC)/colors.h
+thornbird.o: $(UTILS_SRC)/erase.h
+thornbird.o: $(UTILS_SRC)/font-retry.h
+thornbird.o: $(UTILS_SRC)/grabscreen.h
+thornbird.o: $(UTILS_SRC)/hsv.h
+thornbird.o: $(UTILS_SRC)/resources.h
+thornbird.o: $(UTILS_SRC)/usleep.h
+thornbird.o: $(UTILS_SRC)/visual.h
+thornbird.o: $(UTILS_SRC)/yarandom.h
+thornbird.o: $(srcdir)/xlockmoreI.h
+thornbird.o: $(srcdir)/xlockmore.h
+triangle.o: ../config.h
+triangle.o: $(srcdir)/fps.h
+triangle.o: $(srcdir)/recanim.h
+triangle.o: $(srcdir)/screenhackI.h
+triangle.o: $(UTILS_SRC)/colors.h
+triangle.o: $(UTILS_SRC)/erase.h
+triangle.o: $(UTILS_SRC)/font-retry.h
+triangle.o: $(UTILS_SRC)/grabscreen.h
+triangle.o: $(UTILS_SRC)/hsv.h
+triangle.o: $(UTILS_SRC)/resources.h
+triangle.o: $(UTILS_SRC)/usleep.h
+triangle.o: $(UTILS_SRC)/visual.h
+triangle.o: $(UTILS_SRC)/yarandom.h
+triangle.o: $(srcdir)/xlockmoreI.h
+triangle.o: $(srcdir)/xlockmore.h
+truchet.o: ../config.h
+truchet.o: $(srcdir)/fps.h
+truchet.o: $(srcdir)/recanim.h
+truchet.o: $(srcdir)/screenhackI.h
+truchet.o: $(srcdir)/screenhack.h
+truchet.o: $(UTILS_SRC)/colors.h
+truchet.o: $(UTILS_SRC)/font-retry.h
+truchet.o: $(UTILS_SRC)/grabscreen.h
+truchet.o: $(UTILS_SRC)/hsv.h
+truchet.o: $(UTILS_SRC)/resources.h
+truchet.o: $(UTILS_SRC)/usleep.h
+truchet.o: $(UTILS_SRC)/visual.h
+truchet.o: $(UTILS_SRC)/yarandom.h
+twang.o: ../config.h
+twang.o: $(srcdir)/fps.h
+twang.o: $(srcdir)/recanim.h
+twang.o: $(srcdir)/screenhackI.h
+twang.o: $(srcdir)/screenhack.h
+twang.o: $(UTILS_SRC)/colors.h
+twang.o: $(UTILS_SRC)/font-retry.h
+twang.o: $(UTILS_SRC)/grabscreen.h
+twang.o: $(UTILS_SRC)/hsv.h
+twang.o: $(UTILS_SRC)/resources.h
+twang.o: $(UTILS_SRC)/usleep.h
+twang.o: $(UTILS_SRC)/visual.h
+twang.o: $(UTILS_SRC)/xshm.h
+twang.o: $(UTILS_SRC)/yarandom.h
+vermiculate.o: ../config.h
+vermiculate.o: $(srcdir)/fps.h
+vermiculate.o: $(srcdir)/recanim.h
+vermiculate.o: $(srcdir)/screenhackI.h
+vermiculate.o: $(srcdir)/screenhack.h
+vermiculate.o: $(UTILS_SRC)/colors.h
+vermiculate.o: $(UTILS_SRC)/font-retry.h
+vermiculate.o: $(UTILS_SRC)/grabscreen.h
+vermiculate.o: $(UTILS_SRC)/hsv.h
+vermiculate.o: $(UTILS_SRC)/resources.h
+vermiculate.o: $(UTILS_SRC)/usleep.h
+vermiculate.o: $(UTILS_SRC)/visual.h
+vermiculate.o: $(UTILS_SRC)/yarandom.h
+vfeedback.o: $(srcdir)/analogtv.h
+vfeedback.o: ../config.h
+vfeedback.o: $(srcdir)/fps.h
+vfeedback.o: $(srcdir)/recanim.h
+vfeedback.o: $(srcdir)/screenhackI.h
+vfeedback.o: $(srcdir)/screenhack.h
+vfeedback.o: $(UTILS_SRC)/aligned_malloc.h
+vfeedback.o: $(UTILS_SRC)/colors.h
+vfeedback.o: $(UTILS_SRC)/font-retry.h
+vfeedback.o: $(UTILS_SRC)/grabscreen.h
+vfeedback.o: $(UTILS_SRC)/hsv.h
+vfeedback.o: $(UTILS_SRC)/resources.h
+vfeedback.o: $(UTILS_SRC)/thread_util.h
+vfeedback.o: $(UTILS_SRC)/usleep.h
+vfeedback.o: $(UTILS_SRC)/visual.h
+vfeedback.o: $(UTILS_SRC)/xshm.h
+vfeedback.o: $(UTILS_SRC)/yarandom.h
+vines.o: ../config.h
+vines.o: $(srcdir)/fps.h
+vines.o: $(srcdir)/recanim.h
+vines.o: $(srcdir)/screenhackI.h
+vines.o: $(UTILS_SRC)/colors.h
+vines.o: $(UTILS_SRC)/erase.h
+vines.o: $(UTILS_SRC)/font-retry.h
+vines.o: $(UTILS_SRC)/grabscreen.h
+vines.o: $(UTILS_SRC)/hsv.h
+vines.o: $(UTILS_SRC)/resources.h
+vines.o: $(UTILS_SRC)/usleep.h
+vines.o: $(UTILS_SRC)/visual.h
+vines.o: $(UTILS_SRC)/yarandom.h
+vines.o: $(srcdir)/xlockmoreI.h
+vines.o: $(srcdir)/xlockmore.h
+wander.o: ../config.h
+wander.o: $(srcdir)/fps.h
+wander.o: $(srcdir)/recanim.h
+wander.o: $(srcdir)/screenhackI.h
+wander.o: $(srcdir)/screenhack.h
+wander.o: $(UTILS_SRC)/colors.h
+wander.o: $(UTILS_SRC)/erase.h
+wander.o: $(UTILS_SRC)/font-retry.h
+wander.o: $(UTILS_SRC)/grabscreen.h
+wander.o: $(UTILS_SRC)/hsv.h
+wander.o: $(UTILS_SRC)/resources.h
+wander.o: $(UTILS_SRC)/usleep.h
+wander.o: $(UTILS_SRC)/visual.h
+wander.o: $(UTILS_SRC)/yarandom.h
+webcollage-cocoa.o: ../config.h
+webcollage-cocoa.o: $(srcdir)/fps.h
+webcollage-cocoa.o: $(srcdir)/recanim.h
+webcollage-cocoa.o: $(srcdir)/screenhackI.h
+webcollage-cocoa.o: $(srcdir)/screenhack.h
+webcollage-cocoa.o: $(UTILS_SRC)/colors.h
+webcollage-cocoa.o: $(UTILS_SRC)/font-retry.h
+webcollage-cocoa.o: $(UTILS_SRC)/grabscreen.h
+webcollage-cocoa.o: $(UTILS_SRC)/hsv.h
+webcollage-cocoa.o: $(UTILS_SRC)/resources.h
+webcollage-cocoa.o: $(UTILS_SRC)/usleep.h
+webcollage-cocoa.o: $(UTILS_SRC)/visual.h
+webcollage-cocoa.o: $(UTILS_SRC)/yarandom.h
+webcollage-helper.o: ../config.h
+whirlwindwarp.o: ../config.h
+whirlwindwarp.o: $(srcdir)/fps.h
+whirlwindwarp.o: $(srcdir)/recanim.h
+whirlwindwarp.o: $(srcdir)/screenhackI.h
+whirlwindwarp.o: $(srcdir)/screenhack.h
+whirlwindwarp.o: $(UTILS_SRC)/colors.h
+whirlwindwarp.o: $(UTILS_SRC)/erase.h
+whirlwindwarp.o: $(UTILS_SRC)/font-retry.h
+whirlwindwarp.o: $(UTILS_SRC)/grabscreen.h
+whirlwindwarp.o: $(UTILS_SRC)/hsv.h
+whirlwindwarp.o: $(UTILS_SRC)/resources.h
+whirlwindwarp.o: $(UTILS_SRC)/usleep.h
+whirlwindwarp.o: $(UTILS_SRC)/visual.h
+whirlwindwarp.o: $(UTILS_SRC)/yarandom.h
+whirlygig.o: ../config.h
+whirlygig.o: $(srcdir)/fps.h
+whirlygig.o: $(srcdir)/recanim.h
+whirlygig.o: $(srcdir)/screenhackI.h
+whirlygig.o: $(srcdir)/screenhack.h
+whirlygig.o: $(UTILS_SRC)/colors.h
+whirlygig.o: $(UTILS_SRC)/font-retry.h
+whirlygig.o: $(UTILS_SRC)/grabscreen.h
+whirlygig.o: $(UTILS_SRC)/hsv.h
+whirlygig.o: $(UTILS_SRC)/resources.h
+whirlygig.o: $(UTILS_SRC)/usleep.h
+whirlygig.o: $(UTILS_SRC)/visual.h
+whirlygig.o: $(UTILS_SRC)/xdbe.h
+whirlygig.o: $(UTILS_SRC)/yarandom.h
+wormhole.o: ../config.h
+wormhole.o: $(srcdir)/fps.h
+wormhole.o: $(srcdir)/recanim.h
+wormhole.o: $(srcdir)/screenhackI.h
+wormhole.o: $(srcdir)/screenhack.h
+wormhole.o: $(UTILS_SRC)/colors.h
+wormhole.o: $(UTILS_SRC)/font-retry.h
+wormhole.o: $(UTILS_SRC)/grabscreen.h
+wormhole.o: $(UTILS_SRC)/hsv.h
+wormhole.o: $(UTILS_SRC)/resources.h
+wormhole.o: $(UTILS_SRC)/usleep.h
+wormhole.o: $(UTILS_SRC)/visual.h
+wormhole.o: $(UTILS_SRC)/yarandom.h
+worm.o: ../config.h
+worm.o: $(srcdir)/fps.h
+worm.o: $(srcdir)/recanim.h
+worm.o: $(srcdir)/screenhackI.h
+worm.o: $(UTILS_SRC)/colors.h
+worm.o: $(UTILS_SRC)/erase.h
+worm.o: $(UTILS_SRC)/font-retry.h
+worm.o: $(UTILS_SRC)/grabscreen.h
+worm.o: $(UTILS_SRC)/hsv.h
+worm.o: $(UTILS_SRC)/resources.h
+worm.o: $(UTILS_SRC)/usleep.h
+worm.o: $(UTILS_SRC)/visual.h
+worm.o: $(UTILS_SRC)/yarandom.h
+worm.o: $(srcdir)/xlockmoreI.h
+worm.o: $(srcdir)/xlockmore.h
+xanalogtv.o: $(srcdir)/analogtv.h
+xanalogtv.o: ../config.h
+xanalogtv.o: $(srcdir)/fps.h
+xanalogtv.o: $(srcdir)/images/gen/logo-180_png.h
+xanalogtv.o: $(srcdir)/images/gen/testcard_bbcf_png.h
+xanalogtv.o: $(srcdir)/images/gen/testcard_pm5544_png.h
+xanalogtv.o: $(srcdir)/images/gen/testcard_rca_png.h
+xanalogtv.o: $(srcdir)/recanim.h
+xanalogtv.o: $(srcdir)/screenhackI.h
+xanalogtv.o: $(srcdir)/screenhack.h
+xanalogtv.o: $(UTILS_SRC)/aligned_malloc.h
+xanalogtv.o: $(UTILS_SRC)/colors.h
+xanalogtv.o: $(UTILS_SRC)/font-retry.h
+xanalogtv.o: $(UTILS_SRC)/grabscreen.h
+xanalogtv.o: $(UTILS_SRC)/hsv.h
+xanalogtv.o: $(UTILS_SRC)/resources.h
+xanalogtv.o: $(UTILS_SRC)/thread_util.h
+xanalogtv.o: $(UTILS_SRC)/usleep.h
+xanalogtv.o: $(UTILS_SRC)/visual.h
+xanalogtv.o: $(UTILS_SRC)/xshm.h
+xanalogtv.o: $(UTILS_SRC)/yarandom.h
+xanalogtv.o: $(srcdir)/ximage-loader.h
+xflame.o: ../config.h
+xflame.o: $(srcdir)/fps.h
+xflame.o: $(srcdir)/images/gen/bob_png.h
+xflame.o: $(srcdir)/recanim.h
+xflame.o: $(srcdir)/screenhackI.h
+xflame.o: $(srcdir)/screenhack.h
+xflame.o: $(UTILS_SRC)/colors.h
+xflame.o: $(UTILS_SRC)/font-retry.h
+xflame.o: $(UTILS_SRC)/grabscreen.h
+xflame.o: $(UTILS_SRC)/hsv.h
+xflame.o: $(UTILS_SRC)/resources.h
+xflame.o: $(UTILS_SRC)/usleep.h
+xflame.o: $(UTILS_SRC)/visual.h
+xflame.o: $(UTILS_SRC)/xshm.h
+xflame.o: $(UTILS_SRC)/yarandom.h
+xflame.o: $(srcdir)/ximage-loader.h
+ximage-loader.o: ../config.h
+ximage-loader.o: $(srcdir)/ximage-loader.h
+xjack.o: ../config.h
+xjack.o: $(srcdir)/fps.h
+xjack.o: $(srcdir)/recanim.h
+xjack.o: $(srcdir)/screenhackI.h
+xjack.o: $(srcdir)/screenhack.h
+xjack.o: $(UTILS_SRC)/colors.h
+xjack.o: $(UTILS_SRC)/font-retry.h
+xjack.o: $(UTILS_SRC)/grabscreen.h
+xjack.o: $(UTILS_SRC)/hsv.h
+xjack.o: $(UTILS_SRC)/resources.h
+xjack.o: $(UTILS_SRC)/usleep.h
+xjack.o: $(UTILS_SRC)/visual.h
+xjack.o: $(UTILS_SRC)/yarandom.h
+xlockmore.o: ../config.h
+xlockmore.o: $(srcdir)/fps.h
+xlockmore.o: $(srcdir)/recanim.h
+xlockmore.o: $(srcdir)/screenhackI.h
+xlockmore.o: $(srcdir)/screenhack.h
+xlockmore.o: $(UTILS_SRC)/colors.h
+xlockmore.o: $(UTILS_SRC)/erase.h
+xlockmore.o: $(UTILS_SRC)/font-retry.h
+xlockmore.o: $(UTILS_SRC)/grabscreen.h
+xlockmore.o: $(UTILS_SRC)/hsv.h
+xlockmore.o: $(UTILS_SRC)/resources.h
+xlockmore.o: $(UTILS_SRC)/usleep.h
+xlockmore.o: $(UTILS_SRC)/visual.h
+xlockmore.o: $(UTILS_SRC)/yarandom.h
+xlockmore.o: $(srcdir)/xlockmoreI.h
+xlyap.o: ../config.h
+xlyap.o: $(srcdir)/fps.h
+xlyap.o: $(srcdir)/recanim.h
+xlyap.o: $(srcdir)/screenhackI.h
+xlyap.o: $(srcdir)/screenhack.h
+xlyap.o: $(UTILS_SRC)/colors.h
+xlyap.o: $(UTILS_SRC)/font-retry.h
+xlyap.o: $(UTILS_SRC)/grabscreen.h
+xlyap.o: $(UTILS_SRC)/hsv.h
+xlyap.o: $(UTILS_SRC)/resources.h
+xlyap.o: $(UTILS_SRC)/usleep.h
+xlyap.o: $(UTILS_SRC)/visual.h
+xlyap.o: $(UTILS_SRC)/yarandom.h
+xmatrix.o: ../config.h
+xmatrix.o: $(srcdir)/fps.h
+xmatrix.o: $(srcdir)/images/gen/matrix1b_png.h
+xmatrix.o: $(srcdir)/images/gen/matrix1_png.h
+xmatrix.o: $(srcdir)/images/gen/matrix2b_png.h
+xmatrix.o: $(srcdir)/images/gen/matrix2_png.h
+xmatrix.o: $(srcdir)/recanim.h
+xmatrix.o: $(srcdir)/screenhackI.h
+xmatrix.o: $(srcdir)/screenhack.h
+xmatrix.o: $(UTILS_SRC)/colors.h
+xmatrix.o: $(UTILS_SRC)/font-retry.h
+xmatrix.o: $(UTILS_SRC)/grabscreen.h
+xmatrix.o: $(UTILS_SRC)/hsv.h
+xmatrix.o: $(UTILS_SRC)/resources.h
+xmatrix.o: $(UTILS_SRC)/textclient.h
+xmatrix.o: $(UTILS_SRC)/usleep.h
+xmatrix.o: $(UTILS_SRC)/visual.h
+xmatrix.o: $(UTILS_SRC)/yarandom.h
+xmatrix.o: $(srcdir)/ximage-loader.h
+xrayswarm.o: ../config.h
+xrayswarm.o: $(srcdir)/fps.h
+xrayswarm.o: $(srcdir)/recanim.h
+xrayswarm.o: $(srcdir)/screenhackI.h
+xrayswarm.o: $(srcdir)/screenhack.h
+xrayswarm.o: $(UTILS_SRC)/colors.h
+xrayswarm.o: $(UTILS_SRC)/font-retry.h
+xrayswarm.o: $(UTILS_SRC)/grabscreen.h
+xrayswarm.o: $(UTILS_SRC)/hsv.h
+xrayswarm.o: $(UTILS_SRC)/resources.h
+xrayswarm.o: $(UTILS_SRC)/usleep.h
+xrayswarm.o: $(UTILS_SRC)/visual.h
+xrayswarm.o: $(UTILS_SRC)/yarandom.h
+xscreensaver-sgigl.o: $(UTILS_SRC)/vroot.h
+xspirograph.o: ../config.h
+xspirograph.o: $(srcdir)/fps.h
+xspirograph.o: $(srcdir)/recanim.h
+xspirograph.o: $(srcdir)/screenhackI.h
+xspirograph.o: $(srcdir)/screenhack.h
+xspirograph.o: $(UTILS_SRC)/colors.h
+xspirograph.o: $(UTILS_SRC)/erase.h
+xspirograph.o: $(UTILS_SRC)/font-retry.h
+xspirograph.o: $(UTILS_SRC)/grabscreen.h
+xspirograph.o: $(UTILS_SRC)/hsv.h
+xspirograph.o: $(UTILS_SRC)/resources.h
+xspirograph.o: $(UTILS_SRC)/usleep.h
+xspirograph.o: $(UTILS_SRC)/visual.h
+xspirograph.o: $(UTILS_SRC)/yarandom.h
+xsublim.o: ../config.h
+xsublim.o: $(UTILS_SRC)/font-retry.h
+xsublim.o: $(UTILS_SRC)/resources.h
+xsublim.o: $(UTILS_SRC)/usleep.h
+xsublim.o: $(UTILS_SRC)/vroot.h
+xsublim.o: $(UTILS_SRC)/yarandom.h
+zoom.o: ../config.h
+zoom.o: $(srcdir)/fps.h
+zoom.o: $(srcdir)/recanim.h
+zoom.o: $(srcdir)/screenhackI.h
+zoom.o: $(srcdir)/screenhack.h
+zoom.o: $(UTILS_SRC)/colors.h
+zoom.o: $(UTILS_SRC)/font-retry.h
+zoom.o: $(UTILS_SRC)/grabscreen.h
+zoom.o: $(UTILS_SRC)/hsv.h
+zoom.o: $(UTILS_SRC)/resources.h
+zoom.o: $(UTILS_SRC)/usleep.h
+zoom.o: $(UTILS_SRC)/visual.h
+zoom.o: $(UTILS_SRC)/yarandom.h
+
diff --git a/hacks/README b/hacks/README
new file mode 100644
index 0000000..34e687e
--- /dev/null
+++ b/hacks/README
@@ -0,0 +1,6 @@
+
+This directory contains various graphics hacks. These are independent from
+the xscreensaver program (in the ../driver/ directory) but some of them use
+the utility functions found in the ../utils/ directory.
+
+If you have compilation problems, check the parameters in ../config.h.
diff --git a/hacks/abstractile.c b/hacks/abstractile.c
new file mode 100644
index 0000000..b4394f1
--- /dev/null
+++ b/hacks/abstractile.c
@@ -0,0 +1,1605 @@
+/*
+ * Copyright (c) 2004-2009 Steve Sundstrom
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include "screenhack.h"
+#include "colors.h"
+#include "hsv.h"
+#include <stdio.h>
+#include <math.h>
+#include <sys/time.h>
+/*#include <sys/utsname.h>*/
+
+#define MODE_CREATE 0 /* init, create, then finish sleep */
+#define MODE_ERASE 1 /* erase, then reset colors */
+#define MODE_DRAW 2
+
+#define DIR_NONE 0
+#define DIR_UP 1
+#define DIR_DOWN 2
+#define DIR_LEFT 3
+#define DIR_RIGHT 4
+
+#define LINE_FORCE 1
+#define LINE_NEW 2
+#define LINE_BRIN 3
+#define LINE_BROUT 4
+
+#define PT_UL 0
+#define PT_MP 1
+#define PT_LR 2
+#define PT_NL 3
+
+#define D3D_NONE 0
+#define D3D_BLOCK 1
+#define D3D_NEON 2
+#define D3D_TILED 3
+
+#define TILE_RANDOM 0
+#define TILE_FLAT 1
+#define TILE_THIN 2
+#define TILE_OUTLINE 3
+#define TILE_BLOCK 4
+#define TILE_NEON 5
+#define TILE_TILED 6
+
+#define BASECOLORS 30
+#define SHADES 12
+#define MAXCOLORS 40
+#define LAYERS 4
+#define PATTERNS 40
+#define SHAPES 18
+#define DRAWORDERS 40
+#define COLORMAPS 20
+#define WAVES 6
+#define STRETCHES 8
+
+struct lineStruct {
+ unsigned int x, y, len, obj, color, ndol;
+ int deo;
+ Bool hv;
+};
+
+struct gridStruct {
+ unsigned int line, hl, hr, vu, vd, dhl, dhr, dvu, dvd;
+};
+
+/* basically the same as global variables, but used to keep them in a bucket
+ and pass them around easier like the original C++ implementation */
+struct state {
+ /* window values */
+ Display *display;
+ Window window;
+ XWindowAttributes xgwa;
+ GC fgc, bgc;
+ XColor colors[255];
+
+ /* memory values */
+ struct lineStruct *dline, *eline;
+ struct gridStruct *grid;
+ unsigned int *zlist, *fdol;
+ Bool *odi;
+ /* draw, erase, fill, init, line, object, z indexes */
+ unsigned int di, ei, fi, ii, bi, li, eli, oi, zi;
+ /* size variables */
+ int gridx, gridy; /* grid size */
+ unsigned int gridn;
+ int lwid, bwid, swid;/* line width, background width, shadow width */
+ int narray, max_wxh;
+ int elwid, elpu, egridx, egridy; /* for now */
+ /* fill variables */
+ int bnratio; /* ratio of branch lines to new lines */
+ int maxlen; /* maximum length of line */
+ int forcemax; /* make line be max possible length */
+ int olen; /* open length set by findopen */
+ int bln; /* blocking line number set by findopen, -1=edge */
+ /* color variables */
+ int ncolors; /* number of colors for screen */
+ int shades;
+ int rco[MAXCOLORS]; /* random ordering of colors for deo */
+ int cmap;
+ int layers;
+ Bool newcols; /* can we create new colormaps with each screen */
+ /* draw variables */
+ int dmap, emap; /* pattern by which line draw order is determined */
+ int dvar, evar; /* random number added to .deo to vary */
+ int ddir, edir; /* draw/erase in forward direction or reverse */
+ int lpu; /* lines drawn per update used to adjust speed */
+ int d3d;
+ int round;
+ int outline;
+ /* layered draw variables */
+ int pattern[LAYERS], shape[LAYERS], mix[LAYERS];
+ int csw[LAYERS], wsx[LAYERS], wsy[LAYERS], sec[LAYERS];
+ int cs1[LAYERS], cs2[LAYERS], cs3[LAYERS]; int cs4[LAYERS];
+ int wave[LAYERS], waveh[LAYERS], wavel[LAYERS];
+ int rx1[LAYERS], rx2[LAYERS], rx3[LAYERS];
+ int ry1[LAYERS], ry2[LAYERS], ry3[LAYERS];
+ /* misc variables */
+ int mode, sleep, speed, tile, dialog;
+ Bool grid_full, resized;
+ struct timeval time;
+};
+
+static int
+_min(int a, int b)
+{
+ if (a<=b)
+ return(a);
+ return(b);
+}
+
+static int
+_max(int a, int b)
+{
+ if (a>=b)
+ return(a);
+ return(b);
+}
+
+static int
+_dist(struct state *st, int x1, int x2, int y1, int y2, int s)
+{
+ double xd=x1-x2;
+ double yd=y1-y2;
+ switch(s) {
+ case 0:
+ return((int)sqrt(xd*xd+yd*yd));
+ case 1:
+ return((int)sqrt(xd*xd*st->cs1[0]*2+yd*yd));
+ case 2:
+ return((int)sqrt(xd*xd+yd*yd*st->cs2[0]*2));
+ default:
+ return((int)sqrt(xd*xd*st->cs1[0]/st->cs2[0]+yd*yd*st->cs3[0]/st->cs4[0]));
+ }
+}
+
+static int
+_wave(struct state *st, int x, int h, int l, int wave)
+{
+ l+=1;
+ switch(wave) {
+ case 0: /* cos wave*/
+ return((int)(cos((double)x*M_PI/l)*h));
+ case 1: /* double wave*/
+ case 2: /* double wave*/
+ return((int)(cos((double)x*M_PI/l)*h)+(int)(sin((double)x*M_PI/l/st->cs1[1])*h));
+ case 3: /* zig zag */
+ return(abs((x%(l*2)-l))*h/l);
+ case 4: /* giant zig zag */
+ return(abs((x%(l*4)-l*2))*h*3/l);
+ case 5: /* sawtooth */
+ return((x%(l))*h/l);
+ default: /* no wave */
+ return(0);
+ }
+}
+
+static int
+_triangle(struct state *st, int x, int y, int rx, int ry, int t)
+{
+ switch(t) {
+ case 1:
+ return(_min(_min(x+y+rx-(st->gridx/2),st->gridx-x+y),(st->gridy-y+(ry/2))*3/2));
+ case 2:
+ return(_min(_min(x-rx,y-ry),(rx+ry-x-y)*2/3));
+ case 3:
+ return(_min(_min(st->gridx-x-rx,y-ry),(rx+ry-st->gridx+x-y)*2/3));
+ case 4:
+ return(_min(_min(x-rx,st->gridy-y-ry),(rx+ry-x-st->gridy+y)*2/3));
+ }
+ return(_min(_min(st->gridx-x-rx,st->gridy-y-ry),(rx+ry-st->gridx+x-st->gridy+y)*2/3));
+}
+
+static void
+_init_zlist(struct state *st)
+{
+ unsigned int tmp, y, z;
+
+ st->gridx=st->xgwa.width/st->lwid;
+ st->gridy=st->xgwa.height/st->lwid;
+ if ((st->gridx <= 0) || (st->gridy <= 0)) abort();
+ st->gridn=st->gridx*st->gridy;
+ /* clear grid */
+ for (z=0; z<st->gridn; z++) {
+ st->grid[z].line=st->grid[z].hl=st->grid[z].hr=st->grid[z].vu=st->grid[z].vd=st->grid[z].dhl=st->grid[z].dhr=st->grid[z].dvu=st->grid[z].dvd=0;
+ st->zlist[z]=z;
+ }
+ /* rather than pull x,y points randomly and wait to hit final empy cells a
+ list of all points is created and mixed so empty cells do get hit last */
+ for (z=0; z<st->gridn; z++) {
+ y=random()%st->gridn;
+ tmp=st->zlist[y];
+ st->zlist[y]=st->zlist[z];
+ st->zlist[z]=tmp;
+ }
+}
+
+static void
+make_color_ramp_rgb (Screen *screen, Visual *visual, Colormap cmap,
+ int r1, int g1, int b1, int r2, int g2, int b2,
+ XColor *colors, int *ncolorsP, Bool closed_p)
+{
+ int h1, h2;
+ double s1, s2, v1, v2;
+ rgb_to_hsv(r1, g1, b1, &h1, &s1, &v1);
+ rgb_to_hsv(r2, g2, b2, &h2, &s2, &v2);
+ make_color_ramp(screen, visual, cmap, h1, s1, v1, h2, s2, v2,
+ colors, ncolorsP, False, True, 0);
+}
+
+
+static void
+_init_colors(struct state *st)
+{
+ int col[BASECOLORS];
+ int c1, c2, c3, h1, h2, h3;
+ int r1, g1, b1, r2, g2, b2, r3, g3, b3;
+ double s1, s2, s3, v1, v2, v3;
+ XColor tmp_col1[16], tmp_col2[16], tmp_col3[16];
+
+ unsigned short basecol[BASECOLORS][3]={
+ /* 0 dgray */ {0x3333,0x3333,0x3333},
+ /* 1 dbrown */ {0x6666,0x3333,0x0000},
+ /* 2 dred */ {0x9999,0x0000,0x0000},
+ /* 3 orange */ {0xFFFF,0x6666,0x0000},
+ /* 4 gold */ {0xFFFF,0xCCCC,0x0000},
+ /* 5 olive */ {0x6666,0x6666,0x0000},
+ /* 6 ivy */ {0x0000,0x6666,0x0000},
+ /* 7 dgreen */ {0x0000,0x9999,0x0000},
+ /* 8 bluegray */ {0x3333,0x6666,0x6666},
+ /* 9 dblue */ {0x0000,0x0000,0x9999},
+ /* 10 blue */ {0x3333,0x3333,0xFFFF},
+ /* 11 dpurple */ {0x6666,0x0000,0xCCCC},
+ /* 12 purple */ {0x6666,0x3333,0xFFFF},
+ /* 13 violet */ {0x9999,0x3333,0x9999},
+ /* 14 magenta */ {0xCCCC,0x3333,0xCCCC},
+ /* lights */
+ /* 15 gray */ {0x3333,0x3333,0x3333},
+ /* 16 brown */ {0x9999,0x6666,0x3333},
+ /* 17 tan */ {0xCCCC,0x9999,0x3333},
+ /* 18 red */ {0xFFFF,0x0000,0x0000},
+ /* 19 lorange */ {0xFFFF,0x9999,0x0000},
+ /* 20 yellow */ {0xFFFF,0xFFFF,0x0000},
+ /* 21 lolive */ {0x9999,0x9999,0x0000},
+ /* 22 green */ {0x3333,0xCCCC,0x0000},
+ /* 23 lgreen */ {0x3333,0xFFFF,0x3333},
+ /* 24 cyan */ {0x0000,0xCCCC,0xCCCC},
+ /* 25 sky */ {0x3333,0xFFFF,0xFFFF},
+ /* 26 marine */ {0x3333,0x6666,0xFFFF},
+ /* 27 lblue */ {0x3333,0xCCCC,0xFFFF},
+ /* 28 lpurple */ {0x9999,0x9999,0xFFFF},
+ /* 29 pink */ {0xFFFF,0x9999,0xFFFF}};
+
+ if (st->d3d) {
+ st->shades = (st->d3d==D3D_TILED) ? 5 : st->lwid/2+1;
+ st->ncolors=4+random()%4;
+ if (st->cmap>0) { /* tint the basecolors a bit */
+ for (c1=0; c1<BASECOLORS; c1++)
+ for (c2=0; c2<2; c2++)
+ if (!basecol[c1][c2]) {
+ basecol[c1][c2]+=random()%16000;
+ } else if (basecol[c1][c2]==0xFFFF) {
+ basecol[c1][c2]-=random()%16000;
+ } else {
+ basecol[c1][c2]-=8000;
+ basecol[c1][c2]+=random()%16000;
+ }
+ }
+ switch(st->cmap%4) {
+ case 0: /* all */
+ for (c1=0; c1<st->ncolors; c1++)
+ col[c1]=random()%BASECOLORS;
+ break;
+ case 1: /* darks */
+ for (c1=0; c1<st->ncolors; c1++)
+ col[c1]=random()%15;
+ break;
+ case 2: /* semi consecutive darks */
+ col[0]=random()%15;
+ for (c1=1; c1<st->ncolors; c1++)
+ col[c1]=(col[c1-1]+1+random()%2)%15;
+ break;
+ case 3: /* consecutive darks */
+ col[0]=random()%(15-st->ncolors);
+ for (c1=1; c1<st->ncolors; c1++)
+ col[c1]=col[c1-1]+1;
+ break;
+ }
+ for (c1=0; c1<st->ncolors; c1++) {
+ /* adjust colors already set */
+ for (h1=c1*st->shades-1; h1>=0; h1--)
+ st->colors[h1+st->shades]=st->colors[h1];
+ make_color_ramp_rgb(st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ basecol[col[c1]][0], basecol[col[c1]][1], basecol[col[c1]][2],
+ 0xFFFF, 0xFFFF, 0xFFFF, st->colors, &st->shades,
+ False);
+ }
+ return;
+ }
+ /* not 3d */
+ st->shades=1;
+ if (st->cmap%2) { /* basecolors */
+ if (random()%3) {
+ c1=random()%15;
+ c2=(c1+3+(random()%5))%15;
+ c3=(c2+3+(random()%5))%15;
+ } else {
+ c1=random()%BASECOLORS;
+ c2=(c1+5+(random()%10))%BASECOLORS;
+ c3=(c2+5+(random()%10))%BASECOLORS;
+ }
+ r1=basecol[c1][0];
+ g1=basecol[c1][1];
+ b1=basecol[c1][2];
+ r2=basecol[c2][0];
+ g2=basecol[c2][1];
+ b2=basecol[c2][2];
+ r3=basecol[c3][0];
+ g3=basecol[c3][1];
+ b3=basecol[c3][2];
+ } else { /* random rgb's */
+ r1=random()%65535;
+ g1=random()%65535;
+ b1=random()%65535;
+ r2=(r1+16384+random()%32768)%65535;
+ g2=(g1+16384+random()%32768)%65535;
+ b2=(b1+16384+random()%32768)%65535;
+ r3=(r2+16384+random()%32768)%65535;
+ g3=(g2+16384+random()%32768)%65535;
+ b3=(b2+16384+random()%32768)%65535;
+ }
+ switch(st->cmap) {
+ case 0: /* make_color_ramp color->color */
+ case 1:
+ case 2: /* make_color_ramp color->white */
+ case 3:
+ st->ncolors=5+random()%5;
+ if (st->cmap>1)
+ r2=g2=b2=0xFFFF;
+ make_color_ramp_rgb(st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ r1, g1, b1, r2, g2, b2,
+ st->colors, &st->ncolors, random()%2);
+ break;
+ case 4: /* 3 color make_color_loop */
+ case 5:
+ case 6:
+ case 7:
+ st->ncolors=8+random()%12;
+ rgb_to_hsv(r1, g1, b1, &h1, &s1, &v1);
+ rgb_to_hsv(r2, g2, b2, &h2, &s2, &v2);
+ rgb_to_hsv(r3, g3, b3, &h3, &s3, &v3);
+
+ make_color_loop(st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ h1, s1, v1, h2, s2, v2, h3, s3, v3,
+ st->colors, &st->ncolors, True, False);
+ break;
+ case 8: /* random smooth */
+ case 9:
+ st->ncolors=(random()%4)*6+12;
+ make_smooth_colormap (st->xgwa.screen, st->xgwa.visual,
+ st->xgwa.colormap, st->colors, &st->ncolors,
+ True, False, True);
+ break;
+ case 10: /* rainbow */
+ st->ncolors=(random()%4)*6+12;
+ make_uniform_colormap (st->xgwa.screen, st->xgwa.visual,
+ st->xgwa.colormap, st->colors, &st->ncolors,
+ True, False, True);
+ break;
+ case 11: /* dark to light blend */
+ case 12:
+ case 13:
+ case 14:
+ st->ncolors=7;
+ make_color_ramp_rgb(st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ r1, g1, b1, 0xFFFF, 0xFFFF, 0xFFFF,
+ tmp_col1, &st->ncolors, False);
+ make_color_ramp_rgb(st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ r2, g2, b2, 0xFFFF, 0xFFFF, 0xFFFF,
+ tmp_col2, &st->ncolors, False);
+ if (st->cmap<13) {
+ for(c1=0; c1<=4; c1++) {
+ st->colors[c1*2]=tmp_col1[c1];
+ st->colors[c1*2+1]=tmp_col2[c1];
+ }
+ st->ncolors=10;
+ } else {
+ make_color_ramp_rgb(st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ r3, g3, b3, 0xFFFF, 0xFFFF, 0xFFFF,
+ tmp_col3, &st->ncolors, False);
+ for(c1=0; c1<=4; c1++) {
+ st->colors[c1*3]=tmp_col1[c1];
+ st->colors[c1*3+1]=tmp_col2[c1];
+ st->colors[c1*3+2]=tmp_col3[c1];
+ }
+ st->ncolors=15;
+ }
+ break;
+ default: /* random */
+ st->ncolors=(random()%4)*6+12;
+ make_random_colormap (st->xgwa.screen, st->xgwa.visual,
+ st->xgwa.colormap, st->colors, &st->ncolors,
+ False, True, False, True);
+ break;
+ }
+
+ /* set random color order for drawing and erasing */
+ for (c1=0; c1<MAXCOLORS; c1++)
+ st->rco[c1]=c1;
+ for (c1=0; c1<MAXCOLORS; c1++) {
+ c3=random()%MAXCOLORS;
+ c2=st->rco[c1];
+ st->rco[c1]=st->rco[c3];
+ st->rco[c3]=c2;
+ }
+}
+
+static int _comparedeo(const void *i, const void *j)
+{
+ struct lineStruct *h1, *h2;
+
+ h1=(struct lineStruct *)i;
+ h2=(struct lineStruct *)j;
+ if (h1->deo > h2->deo)
+ return(1);
+ if (h1->deo < h2->deo)
+ return(-1);
+ return(0);
+}
+
+static int
+_hv(struct state *st, int x, int y, int d1, int d2, int pn, Bool de)
+{
+ int v1, v2, r;
+
+ switch (d1) {
+ case 0:
+ v1 = (de) ? st->egridx-x : st->gridx-x;
+ break;
+ case 1:
+ v1 = y;
+ break;
+ case 2:
+ v1 = x;
+ break;
+ default:
+ v1 = (de) ? st->egridy-y : st->gridy-y;
+ break;
+ }
+ switch (d2) {
+ case 0:
+ v2 = (de) ? st->egridx-x : st->gridx-x;
+ break;
+ case 1:
+ v2 = y;
+ break;
+ case 2:
+ v2 = x;
+ break;
+ default:
+ v2 = (de) ? st->egridy-y : st->gridy-y;
+ break;
+ }
+ r = (de) ? (st->dline[st->li].hv) ? (v1+10000)*pn : (v2+10000)*-pn :
+ (st->eline[st->li].hv) ? (v1+10000)*pn : (v2+10000)*-pn;
+ return(r);
+}
+
+static int
+_getdeo(struct state *st, int x, int y, int map, int de)
+{
+ int cr;
+ switch(map) {
+ case 0: /* horizontal one side */
+ return(x);
+ case 1: /* vertical one side */
+ return(y);
+ case 2: /* horizontal two side */
+ return(_min(x,st->gridx-x)+1);
+ case 3: /* vertical two side */
+ return(_min(y,st->gridy-y)+1);
+ case 4: /* square */
+ return(_max(abs(x-st->rx3[de]),abs(y-st->ry3[de]))+1);
+ case 5: /* two squares */
+ return(_min(_max(abs(x-(st->rx3[de]/2)),abs(y-st->ry3[de])),_max(abs(x-(st->gridx-(st->rx2[de]/2))),abs(y-st->ry2[de])))+1);
+ case 6: /* horizontal rectangle */
+ return(_max(abs(x-st->rx3[de]),abs(y-(st->ry3[de]))*st->cs1[de])+1);
+ case 7: /* vertical rectangle */
+ return(_max(abs(x-st->rx3[de])*st->cs1[de],abs(y-(st->ry3[de])))+1);
+ case 8: /* + cross */
+ return(_min(abs(x-st->rx3[de]),abs(y-(st->ry3[de])))+1);
+ case 9: /* diagonal */
+ return((x*3/4+y)+1);
+ case 10: /* opposite diagonal */
+ return((x*3/4+st->gridy-y)+1);
+ case 11: /* diamond */
+ return((abs(x-st->rx3[de])+abs(y-st->ry3[de]))/2+1);
+ case 12: /* two diamonds */
+ return(_min(abs(x-(st->rx3[de]/2))+abs(y-st->ry3[de]),abs(x-(st->gridx-(st->rx2[de]/2)))+abs(y-st->ry2[de]))/2+1);
+ case 13: /* circle */
+ return(_dist(st,x,st->rx3[de],y,st->ry3[de],0)+1);
+ case 14: /* horizontal ellipse */
+ return(_dist(st,x,st->rx3[de],y,st->ry3[de],1)+1);
+ case 15: /* vertical ellipse */
+ return(_dist(st,x,st->rx3[de],y,st->ry3[de],2)+1);
+ case 16: /* two circles */
+ return(_min(_dist(st,x,st->rx3[de]/2,y,st->ry3[de],0),_dist(st,x,st->gridx-(st->rx2[de]/2),y,st->ry2[de],0))+1);
+ case 17: /* horizontal straight wave */
+ return(x+_wave(st,st->gridy+y,st->csw[0]*st->cs1[0],st->csw[0]*st->cs2[0],st->wave[de]));
+ case 18: /* vertical straight wave */
+ return(y+_wave(st,st->gridx+x,st->csw[0]*st->cs1[0],st->csw[0]*st->cs2[0],st->wave[de]));
+ case 19: /* horizontal wavey wave */
+ return(x+_wave(st,st->gridy+y+((x/5)*st->edir),st->csw[de]*st->cs1[de],st->csw[de]*st->cs2[de],st->wave[de])+1);
+ case 20: /* vertical wavey wave */
+ return(y+_wave(st,st->gridx+x+((y/5)*st->edir),st->csw[de]*st->cs1[de],st->csw[de]*st->cs2[de],st->wave[de])+1);
+/* no d3d for 21,22 */
+ case 21: /* simultaneous directional */
+ return(_hv(st,x,y,st->cs1[0]%2,st->cs2[0]%2,1,de));
+ case 22: /* reverse directional */
+ return(_hv(st,x,y,st->cs1[0]%2,st->cs2[0]%2,-1,de));
+ case 23: /* length */
+ if (de)
+ return(st->dline[st->li].len*1000+random()%5000);
+ else
+ return(st->eline[st->li].len*1000+random()%5000);
+ case 24: /* object */
+ case 25:
+ case 26:
+ case 27:
+ if (de)
+ return(st->dline[st->li].obj*100);
+ else
+ return(st->eline[st->li].obj*100);
+ default: /* color */
+ cr = (de) ? st->dline[st->li].color : st->eline[st->li].color;
+ if (map<34) cr=st->rco[cr];
+ if ((map%6<4) || (de)) { /* by color */
+ cr*=1000;
+ cr+=random()%1000;
+ } else if (map%6==4) { /* by color horizontaly */
+ cr*=st->gridx;
+ cr+=(x+random()%(st->gridx/2));
+ } else { /* by color vertically */
+ cr*=st->gridy;
+ cr+=(y+random()%(st->gridy/2));
+ }
+ return(cr);
+ }
+ return(1);
+}
+
+static void
+_init_screen(struct state *st)
+{
+ int nstr, x;
+ struct lineStruct *tmp;
+
+ /* malloc memory in case of resize */
+ if (st->resized) {
+ st->max_wxh=st->xgwa.width*st->xgwa.height;
+ if (st->dline!=NULL)
+ free(st->dline);
+ if (st->eline!=NULL)
+ free(st->eline);
+ if (st->grid!=NULL)
+ free(st->grid);
+ if (st->zlist!=NULL)
+ free(st->zlist);
+ if (st->fdol!=NULL)
+ free(st->fdol);
+ if (st->odi!=NULL)
+ free(st->odi);
+ st->narray = (st->xgwa.width+1)*(st->xgwa.height+1)/4+1;
+ st->dline = calloc(st->narray, sizeof(struct lineStruct));
+ st->eline = calloc(st->narray, sizeof(struct lineStruct));
+ st->grid = calloc(st->narray, sizeof(struct gridStruct));
+ st->zlist = calloc(st->narray, sizeof(unsigned int));
+ st->fdol = calloc(st->narray, sizeof(unsigned int));
+ st->odi = calloc(st->narray, sizeof(Bool));
+ if ((st->dline == NULL) || (st->eline == NULL) ||
+ (st->grid == NULL) || (st->zlist == NULL) ||
+ (st->fdol == NULL) || (st->odi == NULL)) {
+ fprintf(stderr, "not enough memory\n");
+ exit(1);
+ }
+ st->dialog = (st->xgwa.width<500) ? 1 : 0;
+ st->resized=False;
+ }
+ if (st->ii) {
+ /* swap st->dline and st->eline pointers to resort and erase */
+ tmp=st->eline;
+ st->eline=st->dline;
+ st->dline=tmp;
+ st->eli=st->li;
+ st->elwid=st->lwid;
+ st->elpu=st->lpu;
+ st->egridx=st->gridx;
+ st->egridy=st->gridy;
+
+ /* create new erase order */
+ for (st->li=1; st->li<=st->eli; st->li++)
+ st->eline[st->li].deo=(_getdeo(st,st->eline[st->li].x,st->eline[st->li].y,st->emap,0) + (random()%st->evar) + (random()%st->evar))*st->edir;
+ qsort(st->eline, st->eli+1, sizeof(struct lineStruct), _comparedeo);
+ }
+ st->ii++;
+
+ /* clear arrays and other counters */
+ st->di=st->ei=st->fi=st->li=st->oi=st->zi=0;
+ st->grid_full=False;
+ /* li starts from 1 */
+ st->dline[0].x=st->dline[0].y=st->dline[0].len=0;
+ /* to keep it first after sorting so di is never null */
+ st->dline[0].deo=-999999999;
+
+ /* set random screen variables */
+ st->lwid = (st->ii==1) ? 3 : 2+((random()%6)%4);
+ st->d3d = ((st->tile==TILE_FLAT) || (st->tile==TILE_THIN) ||
+ (st->tile==TILE_OUTLINE)) ? D3D_NONE :
+ (st->tile==TILE_BLOCK) ? D3D_BLOCK :
+ (st->tile==TILE_NEON) ? D3D_NEON :
+ (st->tile==TILE_TILED) ? D3D_TILED :
+ /* force TILE_D3D on first screen to properly load all shades */
+ ((st->ii==1) && (!st->newcols)) ? D3D_TILED : (random()%5)%4;
+/* st->d3d=D3D_BLOCK; st->lwid=2; */
+ st->outline = (st->tile==TILE_OUTLINE) ? 1 :
+ ((st->tile!=TILE_RANDOM) || (random()%5)) ? 0 : 1;
+ st->round = (st->d3d==D3D_NEON) ? 1 :
+ ((st->d3d==D3D_BLOCK) || (st->outline) || (random()%6)) ? 0 : 1;
+ if ((st->d3d) || (st->outline) || (st->round))
+ st->lwid+=2;
+ if ((!st->d3d) && (!st->round) && (!st->outline) && (st->lwid>3))
+ st->lwid-=2;
+ if (st->d3d==D3D_TILED)
+ st->lwid++;
+ if (st->tile==TILE_THIN)
+ st->lwid=2;
+
+ _init_zlist(st);
+
+ st->maxlen=(st->lwid>6) ? 2+(random()%4) :
+ (st->lwid>4) ? 2+(random()%8)%6 :
+ (st->lwid>2) ? 2+(random()%12)%8 : 2+(random()%15)%10;
+ st->bnratio = 4+(random()%4)+(random()%4);
+ st->forcemax = (random()%6) ? 0 : 1;
+
+ if ((st->ii==1) || (st->newcols))
+ _init_colors(st);
+
+ st->dmap = (st->emap+5+(random()%5))%DRAWORDERS;
+
+ st->dmap=20+random()%20;
+
+ st->dvar = (st->dmap>22) ? 100 : 10+(st->csw[0]*(random()%5));
+ st->ddir= (random()%2) ? 1 : -1;
+
+ st->emap = (st->dmap+10+(random()%10))%20;
+ st->evar = (st->emap>22) ? 100 : 10+(st->csw[0]*(random()%5));
+ st->edir= (random()%2) ? 1 : -1;
+
+ st->layers= (random()%2) ? 2 : (random()%2) ? 1 : (random()%2) ? 3 : 4;
+ st->cmap=(st->cmap+5+(random()%10))%COLORMAPS;
+
+ for (x=0; x<LAYERS; x++) {
+ st->pattern[x]=random()%PATTERNS;
+ st->shape[x]=random()%SHAPES;
+ st->mix[x]=random()%20;
+ nstr = (st->lwid==2) ? 20+random()%12 :
+ (st->lwid==3) ? 16+random()%8 :
+ (st->lwid==4) ? 12+random()%6 :
+ (st->lwid==5) ? 10+random()%5 :
+ (st->lwid==6) ? 8+random()%4 :
+ 5+random()%5;
+ st->csw[x] = _max(5,st->gridy/nstr);
+ st->wsx[x] = (st->wsx[x]+3+(random()%3))%STRETCHES;
+ st->wsy[x] = (st->wsy[x]+3+(random()%3))%STRETCHES;
+ st->sec[x] = random()%5;
+ if ((!st->dialog) && (st->sec[x]<2)) st->csw[x]/=2;
+ st->cs1[x] = (st->dialog) ? 1+random()%3 : 2+random()%5;
+ st->cs2[x] = (st->dialog) ? 1+random()%3 : 2+random()%5;
+ st->cs3[x] = (st->dialog) ? 1+random()%3 : 2+random()%5;
+ st->cs4[x] = (st->dialog) ? 1+random()%3 : 2+random()%5;
+ st->wave[x]=random()%WAVES;
+ st->wavel[x]=st->csw[x]*(2+random()%6);
+ st->waveh[x]=st->csw[x]*(1+random()%3);
+ st->rx1[x]=(st->gridx/10+random()%(st->gridx*8/10));
+ st->ry1[x]=(st->gridy/10+random()%(st->gridy*8/10));
+ st->rx2[x]=(st->gridx*2/10+random()%(st->gridx*6/10));
+ st->ry2[x]=(st->gridy*2/10+random()%(st->gridy*6/10));
+ st->rx3[x]=(st->gridx*3/10+random()%(st->gridx*4/10));
+ st->ry3[x]=(st->gridy*3/10+random()%(st->gridy*4/10));
+ }
+}
+
+static int
+_shape(struct state *st, int x, int y, int rx, int ry, int n)
+{
+ switch(st->shape[n]) {
+ case 0: /* square/rectangle */
+ case 1:
+ case 2:
+ return(1+_max(abs(x-rx)*st->cs1[n]/st->cs2[n],abs(y-ry)*st->cs3[n]/st->cs4[n]));
+ case 3: /* diamond */
+ case 4:
+ return(1+(abs(x-rx)*st->cs1[n]/st->cs2[n]+abs(y-ry)*st->cs3[n]/st->cs4[n]));
+ case 5: /* 8 point star */
+ return(1+_min(_max(abs(x-rx),abs(y-ry))*3/2,abs(x-rx)+abs(y-ry)));
+ case 6: /* circle/oval */
+ case 7:
+ case 8:
+ return(1+_dist(st,x,rx,y,ry,st->cs1[n]));
+ case 9: /* black hole circle */
+ return(1+(st->gridx*st->gridy/(1+(_dist(st,x,rx,y,ry,st->cs2[n])))));
+ case 10: /* sun */
+ return(1+_min(abs(x-rx)*st->gridx/(abs(y-ry)+1),abs(y-ry)*st->gridx/(abs(x-rx)+1)));
+ case 11: /* 2 circles+inverted circle */
+ return(1+(_dist(st,x,rx,y,ry,st->cs1[n])*_dist(st,x,(rx*3)%st->gridx,y,(ry*5)%st->gridy,st->cs1[n])/(1+_dist(st,x,(rx*4)%st->gridx,y,(ry*7)%st->gridy,st->cs1[n]))));
+ case 12: /* star */
+ return(1+(int)sqrt(abs((x-rx)*(y-ry))));
+ case 13: /* centered ellipse */
+ return(1+_dist(st,x,rx,y,ry,0)+_dist(st,x,st->gridx-rx,y,st->gridy-ry,0));
+ default: /* triangle */
+ return(1+_triangle(st,x,y,rx,ry,st->cs4[n]));
+ }
+ return(1+_triangle(st,x,y,rx,ry,st->cs4[n]));
+}
+
+static int
+_pattern(struct state *st, int x, int y, int n)
+{
+ int v=0, ox;
+ ox=x;
+ switch(st->wsx[n]) {
+ case 0: /* slants */
+ x+=y/(1+st->cs4[n]);
+ break;
+ case 1:
+ x+=(st->gridy-y)/(1+st->cs4[n]);
+ break;
+ case 2: /* curves */
+ x+=_wave(st,y,st->gridx/(1+st->cs1[n]),st->gridy,0);
+ break;
+ case 3:
+ x+=_wave(st,st->gridy-y,st->gridy/(1+st->cs1[n]),st->gridy,0);
+ break;
+ case 4: /* U curves */
+ x+=_wave(st,y,st->cs1[n]*st->csw[n]/2,st->gridy*2/M_PI,0);
+ break;
+ case 5:
+ x-=_wave(st,y,st->cs1[n]*st->csw[n]/2,st->gridy*2/M_PI,0);
+ break;
+ }
+ switch(st->wsy[0]) {
+ case 0: /* slants */
+ y+=ox/(1+st->cs1[n]);
+ break;
+ case 1:
+ y+=(st->gridx-ox)/(1+st->cs1[n]);
+ break;
+ case 2: /* curves */
+ y+=_wave(st,ox,st->gridx/(1+st->cs1[n]),st->gridx,0);
+ break;
+ case 3:
+ y+=_wave(st,st->gridx-ox,st->gridx/(1+st->cs1[n]),st->gridx,0);
+ break;
+ case 4: /* U curves */
+ y+=_wave(st,ox,st->cs1[n]*st->csw[n]/2,st->gridy*2/M_PI,0);
+ break;
+ case 5:
+ y-=_wave(st,ox,st->cs1[n]*st->csw[n]/2,st->gridy*2/M_PI,0);
+ break;
+ }
+ switch(st->pattern[n]) {
+ case 0: /* horizontal stripes */
+ v=y;
+ break;
+ case 1: /* vertical stripes */
+ v=x;
+ break;
+ case 2: /* diagonal stripes */
+ v=(x+(y*st->cs1[n]/st->cs2[n]));
+ break;
+ case 3: /* reverse diagonal stripes */
+ v=(x-(y*st->cs1[n]/st->cs2[n]));
+ break;
+ case 4: /* checkerboard */
+ v=(y/st->csw[n]*3+x/st->csw[n])*st->csw[n];
+ break;
+ case 5: /* diagonal checkerboard */
+ v=((x+y)/2/st->csw[n]+(x+st->gridy-y)/2/st->csw[n]*3)*st->csw[n];
+ break;
+ case 6: /* + cross */
+ v=st->gridx+(_min(abs(x-st->rx3[n]),abs(y-st->ry3[n]))*2);
+ break;
+ case 7: /* double + cross */
+ v=_min(_min(abs(x-st->rx2[n]),abs(y-st->ry2[n])),_min(abs(x-st->rx1[n]),abs(y-st->ry1[n])))*2;
+ break;
+ case 8: /* X cross */
+ v=st->gridx+(_min(abs(x-st->rx3[n])*st->cs1[n]/st->cs2[n]+abs(y-st->ry2[n])*st->cs3[n]/st->cs4[n],abs(x-st->rx3[n])*st->cs1[n]/st->cs2[n]-abs(y-st->ry3[n])*st->cs3[n]/st->cs4[n])*2);
+ break;
+ case 9: /* double X cross */
+ v=_min(_min(abs(x-st->rx2[n])+abs(y-st->ry2[n]),abs(x-st->rx2[n])-abs(y-st->ry2[n])),_min(abs(x-st->rx1[n])+abs(y-st->ry1[n]),abs(x-st->rx1[n])-abs(y-st->ry1[n])))*2;
+ break;
+ case 10: /* horizontal stripes/waves */
+ v=st->gridy+(y+_wave(st,x,st->waveh[n],st->wavel[n],st->wave[n]));
+ break;
+ case 11: /* vertical stripes/waves */
+ v=st->gridx+(x+_wave(st,y,st->waveh[n],st->wavel[n],st->wave[n]));
+ break;
+ case 12: /* diagonal stripes/waves */
+ v=st->gridx+(x+(y*st->cs1[n]/st->cs2[n])+_wave(st,x,st->waveh[n],st->wavel[n],st->wave[n]));
+ break;
+ case 13: /* diagonal stripes/waves */
+ v=st->gridx+(x-(y*st->cs1[n]/st->cs2[n])+_wave(st,y,st->waveh[n],st->wavel[n],st->wave[n]));
+ break;
+ case 14: /* horizontal spikey waves */
+ v=y+(st->csw[n]*st->cs4[n]/st->cs3[n])+_wave(st,x+((y/st->cs3[n])*st->edir),st->csw[n]/2*st->cs1[n]/st->cs2[n],st->csw[n]/2*st->cs2[n]/st->cs1[n],st->wave[n]);
+ break;
+ case 15: /* vertical spikey waves */
+ v=x+(st->csw[n]*st->cs1[n]/st->cs2[n])+_wave(st,y+((x/st->cs3[n])*st->edir),st->csw[n]/2*st->cs1[n]/st->cs2[n],st->csw[n]/2*st->cs3[n]/st->cs4[n],st->wave[n]);
+ break;
+ case 16: /* big slanted hwaves */
+ v=st->gridy-y-(x*st->cs1[n]/st->cs3[n])+(st->csw[n]*st->cs1[n]*st->cs2[n]) +_wave(st,x,st->csw[n]/3*st->cs1[n]*st->cs2[n],st->csw[n]/3*st->cs3[n]*st->cs2[n],st->wave[n]);
+ break;
+ case 17: /* big slanted vwaves */
+ v=x-(y*st->cs1[n]/st->cs3[n])+(st->csw[n]*st->cs1[n]*st->cs2[n]) +_wave(st,y, st->csw[n]/3*st->cs1[n]*st->cs2[n], st->csw[n]/3*st->cs3[n]*st->cs2[n], st->wave[n]);
+ break;
+ case 18: /* double hwave */
+ v=y+(y+st->csw[n]*st->cs3[n])+_wave(st,x,st->csw[n]/3*st->cs3[n],st->csw[n]/3*st->cs2[n],st->wave[n])+_wave(st,x,st->csw[n]/3*st->cs4[n],st->csw[n]/3*st->cs1[n]*3/2,st->wave[n]);
+ break;
+ case 19: /* double vwave */
+ v=x+(x+st->csw[n]*st->cs1[n])+_wave(st,y,st->csw[n]/3*st->cs1[n],st->csw[n]/3*st->cs3[n],st->wave[n])+_wave(st,y,st->csw[n]/3*st->cs2[n],st->csw[n]/3*st->cs4[n]*3/2,st->wave[n]);
+ break;
+ case 20: /* one shape */
+ case 21:
+ case 22:
+ v=_shape(st,x, y, st->rx3[n], st->ry3[n], n);
+ break;
+ case 23: /* two shapes */
+ case 24:
+ case 25:
+ v=_min(_shape(st,x, y, st->rx1[n], st->ry1[n], n),_shape(st,x, y, st->rx2[n], st->ry2[n], n));
+ break;
+ case 26: /* two shapes opposites */
+ case 27:
+ v=_min(_shape(st,x, y, st->rx2[n], st->ry2[n], n),_shape(st,x, y, st->gridx-st->rx2[n], st->gridy-st->rx2[n], n));
+ break;
+ case 28: /* two shape checkerboard */
+ case 29:
+ v=((_shape(st,x, y, st->rx1[n], st->ry1[n], n)/st->csw[n])+(_shape(st,x, y, st->rx2[n], st->ry2[n], n)/st->csw[n]))*st->csw[n];
+ break;
+ case 30: /* two shape blob */
+ case 31:
+ v=(_shape(st,x, y, st->rx1[n], st->ry1[n], n)+_shape(st,x, y, st->rx2[n], st->ry2[n], n))/2;
+ break;
+ case 32: /* inverted two shape blob */
+ case 33:
+ v=(_shape(st,x, y, st->rx1[n], st->ry1[n], n)+_shape(st,st->gridx-x, st->gridy-y, st->rx1[n], st->ry1[n], n))/2;
+ break;
+ case 34: /* three shapes */
+ case 35:
+ v=_min(_shape(st,x, y, st->rx3[n], st->ry3[n], n),_min(_shape(st,x, y, st->rx1[n], st->ry1[n], n),_shape(st,x, y, st->rx2[n], st->ry2[n], n)));
+ break;
+ case 36: /* three shape blob */
+ case 37:
+ v=(_shape(st,x, y, st->rx1[n], st->ry1[n], n)+_shape(st,x, y, st->rx2[n], st->ry2[n], n)+_shape(st,x, y, st->rx3[n], st->ry3[n], n))/3;
+ break;
+ case 38: /* 4 shapes */
+ v=(_min(_shape(st,x, y, st->rx2[n], st->ry2[n], n),_shape(st,x, y, st->gridx-st->rx2[n], st->gridy-st->ry2[n], n)),_min(_shape(st,x, y, st->gridx-st->rx2[n], st->ry2[n], n),_shape(st,x, y, st->rx2[n], st->gridy-st->ry2[n], n)));
+ break;
+ case 39: /* four rainbows */
+ v=(_min(_shape(st,x, y, st->gridx-st->rx2[n]/2, st->csw[n], n),_shape(st,x, y, st->csw[n], st->ry2[n]/2, n)),_min(_shape(st,x, y, st->rx2[n]/2, st->gridy-st->csw[n], n),_shape(st,x, y, st->gridx-st->csw[n], st->gridy-(st->ry2[n]/2), n)));
+ break;
+ }
+ /* stretch or contract stripe */
+ switch(st->sec[n]) {
+ case 0:
+ v=(int)sqrt((int)sqrt(abs(v)*st->gridx)*st->gridx);
+ break;
+ case 1:
+ v=((int)pow(v,2)/st->gridx);
+ break;
+ }
+ return (abs(v));
+}
+
+static int
+_getcolor(struct state *st, int x, int y)
+{
+ int n, cv[LAYERS];
+
+ cv[0] = 0;
+ for (n=0; n<st->layers; n++) {
+ cv[n]=_pattern(st,x,y,n);
+ /* first wave/shape */
+ cv[0] = (!n) ? cv[0]/st->csw[0] :
+ /* checkerboard+1 */
+ (st->mix[n]<5) ? (cv[0]*st->csw[0]+cv[n])/st->csw[n] :
+ /* checkerboard+ncol/2 */
+ (st->mix[n]<12) ? cv[0]+(cv[n]/st->csw[n]*st->ncolors/2) :
+ /* add mix */
+ (st->mix[n]<16) ? cv[0]+(cv[n]/st->csw[n]) :
+ /* subtract mix */
+ (st->mix[n]<18) ? cv[0]-(cv[n]/st->csw[n]) :
+ /* r to l morph mix */
+ (st->mix[n]==18) ? ((cv[0]*x)+(cv[n]*(st->gridx-x)/st->csw[n]))/st->gridx :
+ /* u to d morph mix */
+ ((cv[0]*y)+(cv[n]*(st->gridy-y)/st->csw[n]))/st->gridy;
+ }
+ return(cv[0]);
+}
+
+/* return value=line direction
+ st->olen=open space to edge or next blocking line
+ st->bln=blocking line number or -1 if edge blocks */
+static int
+_findopen(struct state *st, int x, int y, int z)
+{
+ int dir, od[4], no=0;
+
+ if (((st->grid[z].hl) || (st->grid[z].hr)) &&
+ ((st->grid[z].vu) || (st->grid[z].vd)))
+ return(DIR_NONE);
+ if ((z>st->gridx) && (!st->grid[z].hl) && (!st->grid[z].hr) &&
+ (!st->grid[z-st->gridx].line)) {
+ od[no]=DIR_UP;
+ no++;
+ }
+ if ((z<st->gridn-st->gridx) && (!st->grid[z].hl) &&
+ (!st->grid[z].hr) && (!st->grid[z+st->gridx].line)) {
+ od[no]=DIR_DOWN;
+ no++;
+ }
+ if ((x) && (!st->grid[z].hl) && (!st->grid[z].hr) &&
+ (!st->grid[z-1].line)) {
+ od[no]=DIR_LEFT;
+ no++;
+ }
+ if (((z+1)%st->gridx) && (!st->grid[z].hl) && (!st->grid[z].hr) &&
+ (!st->grid[z+1].line)) {
+ od[no]=DIR_RIGHT;
+ no++;
+ }
+ if (!no)
+ return(DIR_NONE);
+ dir=od[random()%no];
+ st->olen=st->bln=0;
+ while ((st->olen<=st->maxlen) && (!st->bln)) {
+ st->olen++;
+ if (dir==DIR_UP)
+ st->bln = (y-st->olen<0) ? -1 :
+ st->grid[z-(st->olen*st->gridx)].line;
+ if (dir==DIR_DOWN)
+ st->bln = (y+st->olen>=st->gridy) ? -1 :
+ st->grid[z+(st->olen*st->gridx)].line;
+ if (dir==DIR_LEFT)
+ st->bln = (x-st->olen<0) ? -1 :
+ st->grid[z-st->olen].line;
+ if (dir==DIR_RIGHT)
+ st->bln = (x+st->olen>=st->gridx) ? -1 :
+ st->grid[z+st->olen].line;
+ }
+ st->olen--;
+ return(dir);
+}
+
+static void
+_fillgrid(struct state *st)
+{
+ unsigned int gridc, n, add;
+
+ gridc=st->gridx*st->dline[st->li].y+st->dline[st->li].x;
+ add = (st->dline[st->li].hv) ? 1 : st->gridx;
+ for (n=0; n<=st->dline[st->li].len; n++) {
+ if (n)
+ gridc+=add;
+ if (!st->grid[gridc].line) {
+ st->fi++;
+ st->grid[gridc].line=st->li;
+ }
+ if (st->dline[st->li].hv) {
+ if (n)
+ st->grid[gridc].hr=st->li;
+ if (n<st->dline[st->li].len)
+ st->grid[gridc].hl=st->li;
+ } else {
+ if (n)
+ st->grid[gridc].vd=st->li;
+ if (n<st->dline[st->li].len)
+ st->grid[gridc].vu=st->li;
+ }
+ if (st->fi>=st->gridn) {
+ st->grid_full=True;
+ return;
+ }
+ }
+}
+
+static void
+_newline(struct state *st)
+{
+ int bl, bz, dir, lt, x, y, z;
+
+ bl=0;
+ z=st->zlist[st->zi];
+ x=z%st->gridx;
+ y=z/st->gridx;
+ st->zi++;
+ dir=_findopen(st,x,y,z);
+
+ if (!st->grid[z].line) {
+ /* this is an empty space, make a new line unless nothing is open around it */
+ if (dir==DIR_NONE) {
+ /* nothing is open, force a len 1 branch in any direction */
+ lt=LINE_FORCE;
+ while ((dir==DIR_NONE) ||
+ ((dir==DIR_UP) && (!y)) ||
+ ((dir==DIR_DOWN) && (y+1==st->gridy)) ||
+ ((dir==DIR_LEFT) && (!x)) ||
+ ((dir==DIR_RIGHT) && (x+1==st->gridx))) {
+ dir=random()%4;
+ }
+ bz = (dir==DIR_UP) ? z-st->gridx : (dir==DIR_DOWN) ? z+st->gridx : (dir==DIR_LEFT) ? z-1 : z+1;
+ bl = st->grid[bz].line;
+ } else if ((st->bnratio>1) && (st->bln>0) &&
+ (st->olen<st->maxlen) && (random()%st->bnratio)) {
+ /* branch into blocking line */
+ lt=LINE_BRIN;
+ bl = st->bln;
+ } else {
+ /* make a new line and new object */
+ lt=LINE_NEW;
+ st->oi++;
+ }
+ } else {
+ /* this is a filled space, make a branch unless nothing is open around it */
+ if (dir==DIR_NONE)
+ return;
+ /* make a branch out of this line */
+ lt=LINE_BROUT;
+ bl=st->grid[z].line;
+ }
+ st->li++;
+ st->dline[st->li].len = (lt==LINE_FORCE) ? 1 : (lt==LINE_BRIN) ?
+ st->olen+1 : (!st->forcemax) ? st->olen : 1+random()%st->olen;
+ st->dline[st->li].x=x;
+ if (dir==DIR_LEFT)
+ st->dline[st->li].x-=st->dline[st->li].len;
+ st->dline[st->li].y=y;
+ if (dir==DIR_UP)
+ st->dline[st->li].y-=st->dline[st->li].len;
+ st->dline[st->li].hv = ((dir==DIR_LEFT) || (dir==DIR_RIGHT)) ?
+ True : False;
+ st->dline[st->li].obj = (lt==LINE_NEW) ? st->oi :
+ st->dline[bl].obj;
+ if (lt==LINE_NEW) {
+ int color = (_getcolor(st,x,y))%st->ncolors;
+ if (color < 0) color += st->ncolors;
+ st->dline[st->li].color = color;
+ } else {
+ st->dline[st->li].color = st->dline[bl].color;
+ }
+ st->dline[st->li].deo=(_getdeo(st,x,y,st->dmap,1) +
+ (random()%st->dvar) + (random()%st->dvar))*st->ddir;
+ st->dline[st->li].ndol=0;
+ _fillgrid(st);
+}
+
+static void
+_create_screen(struct state *st)
+{
+ while(!st->grid_full)
+ _newline(st);
+ qsort(st->dline, st->li+1, sizeof(struct lineStruct), _comparedeo);
+/*st->lpu=st->li/20/((6-st->speed)*3);
+ Used to use a computed lpu, lines per update to control draw speed
+ draw 1/lpu of the lines before each XSync which takes a split second
+ the higher the lpu, the quicker the screen draws. This worked somewhat
+ after the 4->5 update, however with the Mac updating so much more slowly,
+ values tuned for it draw the screen in a blink on Linux. Therefore we
+ draw 1/200th of the screen with each update and sleep, if necessary */
+ st->lpu = (st->dialog) ? st->li/50 : st->li/200;
+ if (!st->lpu) st->lpu = 1;
+ st->bi=1;
+ st->mode=MODE_ERASE;
+}
+
+static void
+_fill_outline(struct state *st, int di)
+{
+ int x, y, h, w;
+
+ if (!di)
+ return;
+ x=st->dline[di].x*st->lwid+1;
+ y=st->dline[di].y*st->lwid+1;
+ if (st->dline[di].hv) {
+ w=(st->dline[di].len+1)*st->lwid-3;
+ h=st->lwid-3;
+ } else {
+ w=st->lwid-3;
+ h=(st->dline[di].len+1)*st->lwid-3;
+ }
+ XFillRectangle (st->display, st->window, st->bgc, x, y, w, h);
+}
+
+static void
+_XFillRectangle(struct state *st, int di, int adj)
+{
+ int a, b, x, y, w, h;
+
+ x=st->dline[di].x*st->lwid;
+ y=st->dline[di].y*st->lwid;
+ if (st->dline[di].hv) {
+ w=(st->dline[di].len+1)*st->lwid-1;
+ h=st->lwid-1;
+ } else {
+ w=st->lwid-1;
+ h=(st->dline[di].len+1)*st->lwid-1;
+ }
+ switch (st->d3d) {
+ case D3D_NEON:
+ x+=adj;
+ y+=adj;
+ w-=adj*2;
+ h-=adj*2;
+ break;
+ case D3D_BLOCK:
+ x+=adj;
+ y+=adj;
+ w-=st->lwid/2-1;
+ h-=st->lwid/2-1;
+ break;
+ }
+ if (!st->round) {
+ XFillRectangle(st->display, st->window, st->fgc, x, y, w, h);
+ } else {
+ if (h<st->lwid) { /* horizontal */
+ a=(h-1)/2;
+ for (b=0; b<=a; b++)
+ XFillRectangle(st->display, st->window, st->fgc,
+ x+b, y+a-b, w-b*2, h-((a-b)*2));
+ } else { /* vertical */
+ a=(w-1)/2;
+ for (b=0; b<=a; b++)
+ XFillRectangle(st->display, st->window, st->fgc,
+ x+a-b, y+b, w-((a-b)*2), h-b*2);
+ }
+ }
+}
+
+static void
+_XFillTriangle(struct state *st, int color, int x1, int y1, int x2, int y2,
+ int x3, int y3)
+{
+ XPoint points[3];
+
+ points[0].x=x1;
+ points[0].y=y1;
+ points[1].x=x2;
+ points[1].y=y2;
+ points[2].x=x3;
+ points[2].y=y3;
+ XSetForeground(st->display, st->fgc, st->colors[color].pixel);
+ XFillPolygon (st->display, st->window, st->fgc, points, 3, Convex,
+ CoordModeOrigin);
+}
+
+static void
+_XFillPolygon4(struct state *st, int color, int x1, int y1, int x2, int y2,
+ int x3, int y3, int x4, int y4)
+{
+ XPoint points[4];
+
+ points[0].x=x1;
+ points[0].y=y1;
+ points[1].x=x2;
+ points[1].y=y2;
+ points[2].x=x3;
+ points[2].y=y3;
+ points[3].x=x4;
+ points[3].y=y4;
+ XSetForeground(st->display, st->fgc, st->colors[color].pixel);
+ XFillPolygon (st->display, st->window, st->fgc, points, 4, Convex,
+ CoordModeOrigin);
+}
+
+static void
+_draw_tiled(struct state *st, int color)
+{
+ int a, c, d, x, y, z, m1, m2, lr, nl, w, h;
+ a = (st->dline[st->di].hv) ? 1 : st->gridx;
+ z = st->dline[st->di].y*st->gridx+st->dline[st->di].x;
+ m1 = (st->lwid-1)/2;
+ m2 = st->lwid/2;
+ lr = st->lwid-1;
+ nl = st->lwid;
+
+ /* draw tiles one grid cell at a time */
+ for (c=0; c<=st->dline[st->di].len; c++) {
+ if (st->dline[st->di].hv) {
+ x = (st->dline[st->di].x+c)*st->lwid;
+ y = st->dline[st->di].y*st->lwid;
+ if (c)
+ st->grid[z].dhr=st->di;
+ if (c<st->dline[st->di].len)
+ st->grid[z].dhl=st->di;
+ } else {
+ x = st->dline[st->di].x*st->lwid;
+ y = (st->dline[st->di].y+c)*st->lwid;
+ if (c)
+ st->grid[z].dvd=st->di;
+ if (c<st->dline[st->di].len)
+ st->grid[z].dvu=st->di;
+ }
+ d=0;
+ if (st->grid[z].dhl)
+ d+=8;
+ if (st->grid[z].dhr)
+ d+=4;
+ if (st->grid[z].dvu)
+ d+=2;
+ if (st->grid[z].dvd)
+ d++;
+ /* draw line base */
+ switch (d) {
+ case 1:
+ case 2: /* vertical */
+ case 3:
+ case 5:
+ case 6:
+ case 7:
+ case 11:
+ case 15:
+ h = ((d==1) || (d==5)) ? lr : nl;
+ XSetForeground(st->display, st->fgc,
+ st->colors[color].pixel);
+ XFillRectangle (st->display, st->window, st->fgc,
+ x, y, m2, h);
+ XSetForeground(st->display, st->fgc,
+ st->colors[color+3].pixel);
+ XFillRectangle (st->display, st->window, st->fgc,
+ x+m2, y, m1, h);
+ break;
+ case 4:
+ case 8: /* horizontal */
+ case 9:
+ case 10:
+ case 12:
+ case 13:
+ case 14:
+ w = (d==4) ? lr : nl;
+ XSetForeground(st->display, st->fgc,
+ st->colors[color+1].pixel);
+ XFillRectangle (st->display, st->window, st->fgc,
+ x, y, w, m2);
+ XSetForeground(st->display, st->fgc,
+ st->colors[color+2].pixel);
+ XFillRectangle (st->display, st->window, st->fgc,
+ x, y+m2, w, m1);
+ break;
+ }
+ /* draw angles */
+ switch(d) {
+ case 1: /* bottom end ^ */
+ _XFillTriangle(st,color+2, x, y+lr, x+lr, y+lr, x+m2, y+m2);
+ break;
+ case 2: /* top end \/ */
+ _XFillTriangle(st,color+1, x, y, x+lr, y, x+m2, y+m2);
+ break;
+ case 4: /* right end < */
+ _XFillTriangle(st,color+3, x+lr, y, x+lr, y+lr, x+m2, y+m2);
+ break;
+ case 5: /* LR corner */
+ _XFillTriangle(st,color+1, x, y+m2, x+m2, y+m2, x, y);
+ _XFillPolygon4(st,color+2, x, y+m2, x+m2, y+m2, x+lr, y+lr, x, y+lr);
+ break;
+ case 6: /* UR corner */
+ _XFillPolygon4(st,color+1, x, y+m2, x+m2, y+m2, x+lr, y, x, y);
+ _XFillTriangle(st,color+2, x, y+m2, x+m2, y+m2, x, y+lr);
+ break;
+ case 7: /* T > into line */
+ _XFillTriangle(st,color+1, x, y+m2, x+m2, y+m2, x, y);
+ _XFillTriangle(st,color+2, x, y+m2, x+m2, y+m2, x, y+lr);
+ break;
+ case 8: /* left end > */
+ _XFillTriangle(st,color, x, y, x, y+lr, x+m2, y+m2);
+ break;
+ case 9: /* LL corner */
+ _XFillPolygon4(st,color, x+m2, y, x+m2, y+m2, x, y+lr, x, y);
+ _XFillTriangle(st,color+3, x+m2, y, x+m2, y+m2, x+lr, y);
+ break;
+ case 10: /* UL corner */
+ _XFillPolygon4(st,color, x+m2, y+nl, x+m2, y+m2, x, y, x, y+nl);
+ _XFillPolygon4(st,color+3, x+m2, y+nl, x+m2, y+m2, x+lr, y+lr, x+lr, y+nl);
+ break;
+ case 11: /* T < into line */
+ _XFillPolygon4(st,color+1, x+nl, y+m2, x+m2, y+m2, x+lr, y, x+nl, y);
+ _XFillPolygon4(st,color+2, x+nl, y+m2, x+m2, y+m2, x+lr, y+lr, x+nl, y+lr);
+ break;
+ case 13: /* T \/ into line */
+ _XFillTriangle(st,color, x+m2, y, x+m2, y+m2, x, y);
+ _XFillTriangle(st,color+3, x+m2, y, x+m2, y+m2, x+lr, y);
+ break;
+ case 14: /* T ^ into line */
+ _XFillPolygon4(st,color, x+m2, y+nl, x+m2, y+m2, x, y+lr, x, y+nl);
+ _XFillPolygon4(st,color+3, x+m2, y+nl, x+m2, y+m2, x+lr, y+lr, x+lr, y+nl);
+ break;
+ case 15: /* X intersection */
+ _XFillTriangle(st,color+1, x, y+m2, x+m2, y+m2, x, y);
+ _XFillTriangle(st,color+2, x, y+m2, x+m2, y+m2, x, y+lr);
+ _XFillPolygon4(st,color+1, x+nl, y+m2, x+m2, y+m2, x+lr, y, x+nl, y);
+ _XFillPolygon4(st,color+2, x+nl, y+m2, x+m2, y+m2, x+lr, y+lr, x+nl, y+lr);
+ break;
+ }
+ z+=a;
+ }
+}
+
+static long
+_mselapsed(struct state *st)
+{
+ struct timeval t;
+ gettimeofday(&t, NULL);
+ t.tv_sec -= st->time.tv_sec;
+ t.tv_usec -= st->time.tv_usec;
+ return ((long)t.tv_sec*1000000+t.tv_usec);
+}
+
+static void
+_draw_lines(struct state *st)
+{
+ int n, z, a, color, sh, di;
+ if (st->bi==1)
+ for (a=0; a<=st->oi; a++)
+ st->fdol[a]=0;
+
+ for (st->di=st->bi; st->di<_min(st->li+1,st->bi+st->lpu); st->di++) {
+ color=(st->dline[st->di].color%st->ncolors)*st->shades;
+ XSetForeground(st->display, st->fgc, st->colors[color].pixel);
+
+ switch (st->d3d) {
+ case D3D_NEON:
+ st->dline[st->di].ndol=st->fdol[st->dline[st->di].obj];
+ st->fdol[st->dline[st->di].obj]=st->di;
+ for (sh=0; sh<st->lwid/2; sh++) {
+ XSetForeground(st->display, st->fgc,
+ st->colors[color+sh].pixel);
+ di=st->di;
+ while(di>0) {
+ _XFillRectangle(st,di,sh);
+ di=st->dline[di].ndol;
+ }
+ }
+ break;
+ case D3D_BLOCK:
+ st->dline[st->di].ndol=st->fdol[st->dline[st->di].obj];
+ st->fdol[st->dline[st->di].obj]=st->di;
+ for (sh=0; sh<st->lwid/2; sh++) {
+ XSetForeground(st->display, st->fgc,
+ st->colors[color+(st->lwid/2)-sh-1].pixel);
+ di=st->di;
+ while(di>0) {
+ _XFillRectangle(st,di,sh);
+ di=st->dline[di].ndol;
+ }
+ }
+ break;
+ case D3D_TILED:
+ _draw_tiled(st,color);
+ break;
+ default: /* D3D_NONE */
+ _XFillRectangle(st,st->di,0);
+ if (st->outline) {
+ _fill_outline(st, st->di);
+ z=st->dline[st->di].y*st->gridx+st->dline[st->di].x;
+ a = (st->dline[st->di].hv) ? 1 : st->gridx;
+ for (n=0; n<=st->dline[st->di].len; n++) {
+ _fill_outline(st, st->grid[z].dhl);
+ _fill_outline(st, st->grid[z].dhr);
+ _fill_outline(st, st->grid[z].dvu);
+ _fill_outline(st, st->grid[z].dvd);
+ if (st->dline[st->di].hv) {
+ if (n)
+ st->grid[z].dhr=st->di;
+ if (n<st->dline[st->di].len)
+ st->grid[z].dhl=st->di;
+ } else {
+ if (n)
+ st->grid[z].dvd=st->di;
+ if (n<st->dline[st->di].len)
+ st->grid[z].dvu=st->di;
+ }
+ z+=a;
+ }
+ }
+ break;
+ }
+ }
+ if (st->di>st->li) {
+ st->bi=1;
+ st->mode=MODE_CREATE;
+ } else {
+ st->bi+=st->lpu;
+ }
+}
+
+static void
+_erase_lines(struct state *st)
+{
+ if (!st->ii)
+ return;
+ for (st->di=st->bi; st->di<_min(st->eli+1,st->bi+st->elpu); st->di++) {
+ if (st->eline[st->di].hv) {
+ XFillRectangle (st->display, st->window, st->bgc,
+ st->eline[st->di].x*st->elwid,
+ st->eline[st->di].y*st->elwid,
+ (st->eline[st->di].len+1)*st->elwid, st->elwid);
+ } else {
+ XFillRectangle (st->display, st->window, st->bgc,
+ st->eline[st->di].x*st->elwid,
+ st->eline[st->di].y*st->elwid,
+ st->elwid, (st->eline[st->di].len+1)*st->elwid);
+ }
+ if (st->di==st->eli) /* clear just in case */
+ XFillRectangle(st->display, st->window, st->bgc, 0, 0,
+ st->xgwa.width, st->xgwa.height);
+ }
+ if (st->di>st->eli) {
+ st->bi=1;
+ if (st->resized) {
+ st->mode=MODE_CREATE;
+ } else {
+ st->mode=MODE_DRAW;
+ }
+ } else {
+ st->bi+=st->elpu;
+ }
+}
+
+static void *
+abstractile_init(Display *display, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+/* struct utsname os;*/
+
+ char *tile = get_string_resource(display, "tile", "Tile");
+ if (tile && !strcmp(tile, "random")) st->tile = TILE_RANDOM;
+ else if (tile && !strcmp(tile, "flat")) st->tile = TILE_FLAT;
+ else if (tile && !strcmp(tile, "thin")) st->tile = TILE_THIN;
+ else if (tile && !strcmp(tile, "outline")) st->tile = TILE_OUTLINE;
+ else if (tile && !strcmp(tile, "block")) st->tile = TILE_BLOCK;
+ else if (tile && !strcmp(tile, "neon")) st->tile = TILE_NEON;
+ else if (tile && !strcmp(tile, "tiled")) st->tile = TILE_TILED;
+ else {
+ if (tile && *tile && !!strcmp(tile, "random"))
+ fprintf(stderr, "%s: unknown tile option %s\n", progname, tile);
+ st->tile = TILE_RANDOM;
+ }
+
+ st->speed = get_integer_resource(display, "speed", "Integer");
+ if (st->speed < 0) st->speed = 0;
+ if (st->speed > 5) st->speed = 5;
+ st->sleep = get_integer_resource(display, "sleep", "Integer");
+ if (st->sleep < 0) st->sleep = 0;
+ if (st->sleep > 60) st->sleep = 60;
+
+ st->display=display;
+ st->window=window;
+
+ /* get screen size and create Graphics Contexts */
+ XGetWindowAttributes (display, window, &st->xgwa);
+ gcv.foreground = get_pixel_resource(display, st->xgwa.colormap,
+ "foreground", "Foreground");
+ st->fgc = XCreateGC (display, window, GCForeground, &gcv);
+ gcv.foreground = get_pixel_resource(display, st->xgwa.colormap,
+ "background", "Background");
+ st->bgc = XCreateGC (display, window, GCForeground, &gcv);
+
+/* Um, no. This is obscene. -jwz.
+ uname(&os);
+ st->newcols=((!strcmp(os.sysname,"Linux")) || (!strcmp(os.sysname,"Darwin")))
+ ? True : False;
+*/
+ st->newcols=False;
+
+ st->mode=MODE_CREATE;
+ st->ii=0;
+ st->resized=True;
+ return st;
+}
+
+static unsigned long
+abstractile_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int mse, usleep;
+
+ gettimeofday(&st->time, NULL);
+
+ /* If the window is too small, do nothing, sorry! */
+ if (st->xgwa.width > 20 && st->xgwa.height > 20) {
+ switch (st->mode) {
+ case MODE_CREATE:
+ _init_screen(st);
+ _create_screen(st);
+ break;
+ case MODE_ERASE:
+ _erase_lines(st);
+ break;
+ case MODE_DRAW:
+ _draw_lines(st);
+ break;
+ }
+ }
+ mse=_mselapsed(st);
+ usleep = ((!st->ii) && (st->mode==MODE_CREATE)) ? 0 :
+ (st->mode==MODE_CREATE) ? st->sleep*1000000-mse :
+ /* speed=0-5, goal is 10,8,6,4,2,0 sec normal and 5,4,3,2,1,0 dialog */
+ (5-st->speed)*(2-st->dialog)*100000/st->lpu-mse;
+ if (usleep>=0)
+ return usleep;
+ return 0;
+}
+
+static void
+abstractile_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->xgwa.width = w;
+ st->xgwa.height = h;
+ if (w*h>st->max_wxh)
+ st->resized=True;
+}
+
+static Bool
+abstractile_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->mode=MODE_CREATE;
+ return True;
+ }
+
+ return False;
+}
+
+static void
+abstractile_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+static const char *abstractile_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*sleep: 3",
+ "*speed: 3",
+ "*tile: random",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec abstractile_options [] = {
+ { "-sleep", ".sleep", XrmoptionSepArg, 0 },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-tile", ".tile", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Abstractile", abstractile)
diff --git a/hacks/abstractile.man b/hacks/abstractile.man
new file mode 100644
index 0000000..d043ce7
--- /dev/null
+++ b/hacks/abstractile.man
@@ -0,0 +1,52 @@
+.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
+.SH NAME
+abstractile - draw abstract mosaic patterns of interlocking tiles
+.SH SYNOPSIS
+.B abstractile
+[\-sleep \fIseconds\fP] [\-speed \fIint\fP] [\-tile \fItile_mode\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIabstractile\fP program draws chaotic grids of randomly colored
+and shaped interlocking tiles.
+.SH OPTIONS
+.I abstractile
+accepts the following options:
+.TP 8
+.B \-sleep \fIseconds\fP
+Specify the number of seconds to sleep between screens (0-60).
+.TP 8
+.B \-speed \fIint\fP
+A value between 0 and 5 used to specify the speed at which each screen is drawn.
+.TP 8
+.B \-tile \fItile_mode\fP
+The type of tile that is drawn on each screen. Legal values are
+\fIrandom\fP, \fIflat\fP, \fIthin\fP, \fIoutline\fP,
+\fIblock\fP, \fIneon\fP, and \fItiled\fP
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2004 by Steve Sundstrom. Based on
+examples from the hacks directory of xscreensaver,
+Copyright (c) 1997, 1998, 2002 Jamie Zawinski
+<jwz@jwz.org>
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Steve Sundstrom
diff --git a/hacks/analogtv.c b/hacks/analogtv.c
new file mode 100644
index 0000000..fd7f504
--- /dev/null
+++ b/hacks/analogtv.c
@@ -0,0 +1,2431 @@
+/* analogtv, Copyright (c) 2003-2018 Trevor Blackwell <tlb@tlb.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/*
+
+ This is the code for implementing something that looks like a conventional
+ analog TV set. It simulates the following characteristics of standard
+ televisions:
+
+ - Realistic rendering of a composite video signal
+ - Compression & brightening on the right, as the scan gets truncated
+ because of saturation in the flyback transformer
+ - Blooming of the picture dependent on brightness
+ - Overscan, cutting off a few pixels on the left side.
+ - Colored text in mixed graphics/text modes
+
+ It's amazing how much it makes your high-end monitor look like at large
+ late-70s TV. All you need is to put a big "Solid State" logo in curly script
+ on it and you'd be set.
+
+ In DirectColor or TrueColor modes, it generates pixel values
+ directly from RGB values it calculates across each scan line. In
+ PseudoColor mode, it consider each possible pattern of 5 preceding
+ bit values in each possible position modulo 4 and allocates a color
+ for each. A few things, like the brightening on the right side as
+ the horizontal trace slows down, aren't done in PseudoColor.
+
+ I originally wrote it for the Apple ][ emulator, and generalized it
+ here for use with a rewrite of xteevee and possibly others.
+
+ A maxim of technology is that failures reveal underlying mechanism.
+ A good way to learn how something works is to push it to failure.
+ The way it fails will usually tell you a lot about how it works. The
+ corollary for this piece of software is that in order to emulate
+ realistic failures of a TV set, it has to work just like a TV set.
+ So there is lots of DSP-style emulation of analog circuitry for
+ things like color decoding, H and V sync following, and more. In
+ 2003, computers are just fast enough to do this at television signal
+ rates. We use a 14 MHz sample rate here, so we can do on the order
+ of a couple hundred instructions per sample and keep a good frame
+ rate.
+
+ Trevor Blackwell <tlb@tlb.org>
+*/
+
+/*
+ 2014-04-20, Dave Odell <dmo2118@gmail.com>:
+ API change: Folded analogtv_init_signal and *_add_signal into *_draw().
+ Added SMP support.
+ Replaced doubles with floats, including constants and transcendental functions.
+ Fixed a bug or two.
+*/
+
+/* 2015-02-27, Tomasz Sulej <tomeksul@gmail.com>:
+ - tint_control variable is used now
+ - removed unusable hashnoise code
+ */
+
+/*
+ 2016-10-09, Dave Odell <dmo2118@gmail.com>:
+ Updated for new xshm.c.
+*/
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+#else /* !HAVE_JWXYZ */
+# include <X11/Xlib.h>
+# include <X11/Xutil.h>
+#endif
+#include <limits.h>
+
+#include <assert.h>
+#include <errno.h>
+#include "utils.h"
+#include "resources.h"
+#include "analogtv.h"
+#include "yarandom.h"
+#include "grabscreen.h"
+#include "visual.h"
+#include "font-retry.h"
+#include "ximage-loader.h"
+
+/* #define DEBUG 1 */
+
+#if defined(DEBUG) && (defined(__linux) || defined(__FreeBSD__))
+/* only works on linux + freebsd */
+#include <machine/cpufunc.h>
+
+#define DTIME_DECL u_int64_t dtimes[100]; int n_dtimes
+#define DTIME_START do {n_dtimes=0; dtimes[n_dtimes++]=rdtsc(); } while (0)
+#define DTIME dtimes[n_dtimes++]=rdtsc()
+#define DTIME_SHOW(DIV) \
+do { \
+ double _dtime_div=(DIV); \
+ printf("time/%.1f: ",_dtime_div); \
+ for (i=1; i<n_dtimes; i++) \
+ printf(" %0.9f",(dtimes[i]-dtimes[i-1])* 1e-9 / _dtime_div); \
+ printf("\n"); \
+} while (0)
+
+#else
+
+#define DTIME_DECL
+#define DTIME_START do { } while (0)
+#define DTIME do { } while (0)
+#define DTIME_SHOW(DIV) do { } while (0)
+
+#endif
+
+
+#define FASTRND_A 1103515245
+#define FASTRND_C 12345
+#define FASTRND (fastrnd = fastrnd*FASTRND_A+FASTRND_C)
+
+static void analogtv_ntsc_to_yiq(const analogtv *it, int lineno, const float *signal,
+ int start, int end, struct analogtv_yiq_s *it_yiq);
+
+static float puramp(const analogtv *it, float tc, float start, float over)
+{
+ float pt=it->powerup-start;
+ float ret;
+ if (pt<0.0f) return 0.0f;
+ if (pt>900.0f || pt/tc>8.0f) return 1.0f;
+
+ ret=(1.0f-expf(-pt/tc))*over;
+ if (ret>1.0f) return 1.0f;
+ return ret*ret;
+}
+
+/*
+ There are actual standards for TV signals: NTSC and RS-170A describe the
+ system used in the US and Japan. Europe has slightly different systems, but
+ not different enough to make substantially different screensaver displays.
+ Sadly, the standards bodies don't do anything so useful as publish the spec on
+ the web. Best bets are:
+
+ http://www.ee.washington.edu/conselec/CE/kuhn/ntsc/95x4.htm
+ http://www.ntsc-tv.com/ntsc-index-02.htm
+
+ In DirectColor or TrueColor modes, it generates pixel values directly from RGB
+ values it calculates across each scan line. In PseudoColor mode, it consider
+ each possible pattern of 5 preceding bit values in each possible position
+ modulo 4 and allocates a color for each. A few things, like the brightening on
+ the right side as the horizontal trace slows down, aren't done in PseudoColor.
+
+ I'd like to add a bit of visible retrace, but it conflicts with being able to
+ bitcopy the image when fast scrolling. After another couple of CPU
+ generations, we could probably regenerate the whole image from scratch every
+ time. On a P4 2 GHz it can manage this fine for blinking text, but scrolling
+ looks too slow.
+*/
+
+/* localbyteorder is MSBFirst or LSBFirst */
+static int localbyteorder;
+static const double float_low8_ofs=8388608.0;
+static int float_extraction_works;
+
+typedef union {
+ float f;
+ int i;
+} float_extract_t;
+
+static void
+analogtv_init(void)
+{
+ int i;
+ {
+ unsigned int localbyteorder_loc = (MSBFirst<<24) | (LSBFirst<<0);
+ localbyteorder=*(char *)&localbyteorder_loc;
+ }
+
+ if (1) {
+ float_extract_t fe;
+ int ans;
+
+ float_extraction_works=1;
+ for (i=0; i<256*4; i++) {
+ fe.f=float_low8_ofs+(double)i;
+ ans=fe.i&0x3ff;
+ if (ans != i) {
+#ifdef DEBUG
+ printf("Float extraction failed for %d => %d\n",i,ans);
+#endif
+ float_extraction_works=0;
+ break;
+ }
+ }
+ }
+
+}
+
+void
+analogtv_set_defaults(analogtv *it, char *prefix)
+{
+ char buf[256];
+
+ sprintf(buf,"%sTVTint",prefix);
+ it->tint_control = get_float_resource(it->dpy, buf,"TVTint");
+ sprintf(buf,"%sTVColor",prefix);
+ it->color_control = get_float_resource(it->dpy, buf,"TVColor")/100.0;
+ sprintf(buf,"%sTVBrightness",prefix);
+ it->brightness_control = get_float_resource(it->dpy, buf,"TVBrightness") / 100.0;
+ sprintf(buf,"%sTVContrast",prefix);
+ it->contrast_control = get_float_resource(it->dpy, buf,"TVContrast") / 100.0;
+ it->height_control = 1.0;
+ it->width_control = 1.0;
+ it->squish_control = 0.0;
+ it->powerup=1000.0;
+
+ it->hashnoise_rpm=0;
+ it->hashnoise_on=0;
+ it->hashnoise_enable=1;
+
+ it->horiz_desync=frand(10.0)-5.0;
+ it->squeezebottom=frand(5.0)-1.0;
+
+#ifdef DEBUG
+ printf("analogtv: prefix=%s\n",prefix);
+ printf(" use: cmap=%d color=%d\n",
+ it->use_cmap,it->use_color);
+ printf(" controls: tint=%g color=%g brightness=%g contrast=%g\n",
+ it->tint_control, it->color_control, it->brightness_control,
+ it->contrast_control);
+/* printf(" freq_error %g: %g %d\n",
+ it->freq_error, it->freq_error_inc, it->flutter_tint); */
+ printf(" desync: %g %d\n",
+ it->horiz_desync, it->flutter_horiz_desync);
+ printf(" hashnoise rpm: %g\n",
+ it->hashnoise_rpm);
+ printf(" vis: %d %d\n",
+ it->visclass, it->visdepth);
+ printf(" shift: %d-%d %d-%d %d-%d\n",
+ it->red_invprec,it->red_shift,
+ it->green_invprec,it->green_shift,
+ it->blue_invprec,it->blue_shift);
+ printf(" size: %d %d %d %d xrepl=%d\n",
+ it->usewidth, it->useheight,
+ it->screen_xo, it->screen_yo, it->xrepl);
+
+ printf(" ANALOGTV_V=%d\n",ANALOGTV_V);
+ printf(" ANALOGTV_TOP=%d\n",ANALOGTV_TOP);
+ printf(" ANALOGTV_VISLINES=%d\n",ANALOGTV_VISLINES);
+ printf(" ANALOGTV_BOT=%d\n",ANALOGTV_BOT);
+ printf(" ANALOGTV_H=%d\n",ANALOGTV_H);
+ printf(" ANALOGTV_SYNC_START=%d\n",ANALOGTV_SYNC_START);
+ printf(" ANALOGTV_BP_START=%d\n",ANALOGTV_BP_START);
+ printf(" ANALOGTV_CB_START=%d\n",ANALOGTV_CB_START);
+ printf(" ANALOGTV_PIC_START=%d\n",ANALOGTV_PIC_START);
+ printf(" ANALOGTV_PIC_LEN=%d\n",ANALOGTV_PIC_LEN);
+ printf(" ANALOGTV_FP_START=%d\n",ANALOGTV_FP_START);
+ printf(" ANALOGTV_PIC_END=%d\n",ANALOGTV_PIC_END);
+ printf(" ANALOGTV_HASHNOISE_LEN=%d\n",ANALOGTV_HASHNOISE_LEN);
+
+#endif
+
+}
+
+extern Bool mono_p; /* shoot me */
+
+static void
+analogtv_free_image(analogtv *it)
+{
+ if (it->image) {
+ destroy_xshm_image(it->dpy, it->image, &it->shm_info);
+ it->image=NULL;
+ }
+}
+
+static void
+analogtv_alloc_image(analogtv *it)
+{
+ /* On failure, it->image is NULL. */
+
+ unsigned bits_per_pixel = visual_pixmap_depth(it->screen, it->xgwa.visual);
+ unsigned align = thread_memory_alignment(it->dpy) * 8 - 1;
+ /* Width is in bits. */
+ unsigned width = (it->usewidth * bits_per_pixel + align) & ~align;
+
+ it->image=create_xshm_image(it->dpy, it->xgwa.visual, it->xgwa.depth,
+ ZPixmap, &it->shm_info,
+ width / bits_per_pixel, it->useheight);
+
+ if (it->image) {
+ memset (it->image->data, 0, it->image->height * it->image->bytes_per_line);
+ } else {
+ /* Not enough memory. Maybe try a smaller window. */
+ fprintf(stderr, "analogtv: %s\n", strerror(ENOMEM));
+ }
+}
+
+
+static void
+analogtv_configure(analogtv *it)
+{
+ int oldwidth=it->usewidth;
+ int oldheight=it->useheight;
+ int wlim,hlim,height_diff;
+
+ /* If the window is very small, don't let the image we draw get lower
+ than the actual TV resolution (266x200.)
+
+ If the aspect ratio of the window is close to a 4:3 or 16:9 ratio --
+ or if it is a completely weird aspect ratio --
+ then scale the image to exactly fill the window.
+
+ Otherwise, center the image either horizontally or vertically,
+ letterboxing or pillarboxing (but not both).
+
+ If it's very close (2.5%) to a multiple of VISLINES, make it exact
+ For example, it maps 1024 => 1000.
+ */
+ float percent = 0.15;
+ float min_ratio = 4.0 / 3.0 * (1 - percent);
+ float max_ratio = 16.0 / 9.0 * (1 + percent);
+ float crazy_min_ratio = 10;
+ float crazy_max_ratio = 1/crazy_min_ratio;
+ float ratio;
+ float height_snap=0.025;
+
+ hlim = it->xgwa.height;
+ wlim = it->xgwa.width;
+ ratio = wlim / (float) hlim;
+
+#ifdef HAVE_MOBILE
+ /* Fill the whole iPhone screen, even though that distorts the image. */
+ min_ratio = 0;
+ max_ratio = 10;
+#endif
+
+ if (wlim < 266 || hlim < 200)
+ {
+ wlim = 266;
+ hlim = 200;
+# ifdef DEBUG
+ fprintf (stderr,
+ "size: minimal: %dx%d in %dx%d (%.3f < %.3f < %.3f)\n",
+ wlim, hlim, it->xgwa.width, it->xgwa.height,
+ min_ratio, ratio, max_ratio);
+# endif
+ }
+ else if (ratio > min_ratio && ratio < max_ratio)
+ {
+# ifdef DEBUG
+ fprintf (stderr,
+ "size: close enough: %dx%d (%.3f < %.3f < %.3f)\n",
+ wlim, hlim, min_ratio, ratio, max_ratio);
+# endif
+ }
+ else if (ratio >= max_ratio)
+ {
+ wlim = hlim*max_ratio;
+# ifdef DEBUG
+ fprintf (stderr,
+ "size: center H: %dx%d in %dx%d (%.3f < %.3f < %.3f)\n",
+ wlim, hlim, it->xgwa.width, it->xgwa.height,
+ min_ratio, ratio, max_ratio);
+# endif
+ }
+ else /* ratio <= min_ratio */
+ {
+ hlim = wlim/min_ratio;
+# ifdef DEBUG
+ fprintf (stderr,
+ "size: center V: %dx%d in %dx%d (%.3f < %.3f < %.3f)\n",
+ wlim, hlim, it->xgwa.width, it->xgwa.height,
+ min_ratio, ratio, max_ratio);
+# endif
+ }
+
+ if (ratio < crazy_min_ratio || ratio > crazy_max_ratio)
+ {
+ if (ratio < crazy_min_ratio)
+ hlim = it->xgwa.height;
+ else
+ wlim = it->xgwa.width;
+# ifdef DEBUG
+ fprintf (stderr,
+ "size: aspect: %dx%d in %dx%d (%.3f < %.3f < %.3f)\n",
+ wlim, hlim, it->xgwa.width, it->xgwa.height,
+ min_ratio, ratio, max_ratio);
+# endif
+ }
+
+
+ height_diff = ((hlim + ANALOGTV_VISLINES/2) % ANALOGTV_VISLINES) - ANALOGTV_VISLINES/2;
+ if (height_diff != 0 && abs(height_diff) < hlim * height_snap)
+ {
+ hlim -= height_diff;
+ }
+
+
+ /* Most times this doesn't change */
+ if (wlim != oldwidth || hlim != oldheight) {
+
+ it->usewidth=wlim;
+ it->useheight=hlim;
+
+ it->xrepl=1+it->usewidth/640;
+ if (it->xrepl>2) it->xrepl=2;
+ it->subwidth=it->usewidth/it->xrepl;
+
+ analogtv_free_image(it);
+ analogtv_alloc_image(it);
+ }
+
+ it->screen_xo = (it->xgwa.width-it->usewidth)/2;
+ it->screen_yo = (it->xgwa.height-it->useheight)/2;
+ it->need_clear=1;
+}
+
+void
+analogtv_reconfigure(analogtv *it)
+{
+ XGetWindowAttributes (it->dpy, it->window, &it->xgwa);
+ analogtv_configure(it);
+}
+
+/* Can be any power-of-two <= 32. 16 a slightly better choice for 2-3 threads. */
+#define ANALOGTV_SUBTOTAL_LEN 32
+
+typedef struct analogtv_thread_s
+{
+ analogtv *it;
+ unsigned thread_id;
+ size_t signal_start, signal_end;
+} analogtv_thread;
+
+#define SIGNAL_OFFSET(thread_id) \
+ ((ANALOGTV_SIGNAL_LEN * (thread_id) / threads->count) & align)
+
+static int analogtv_thread_create(void *thread_raw, struct threadpool *threads,
+ unsigned thread_id)
+{
+ analogtv_thread *thread = (analogtv_thread *)thread_raw;
+ unsigned align;
+
+ thread->it = GET_PARENT_OBJ(analogtv, threads, threads);
+ thread->thread_id = thread_id;
+
+ align = thread_memory_alignment(thread->it->dpy) /
+ sizeof(thread->it->signal_subtotals[0]);
+ if (!align)
+ align = 1;
+ align = ~(align * ANALOGTV_SUBTOTAL_LEN - 1);
+
+ thread->signal_start = SIGNAL_OFFSET(thread_id);
+ thread->signal_end = thread_id + 1 == threads->count ?
+ ANALOGTV_SIGNAL_LEN :
+ SIGNAL_OFFSET(thread_id + 1);
+
+ return 0;
+}
+
+static void analogtv_thread_destroy(void *thread_raw)
+{
+}
+
+analogtv *
+analogtv_allocate(Display *dpy, Window window)
+{
+ static const struct threadpool_class cls = {
+ sizeof(analogtv_thread),
+ analogtv_thread_create,
+ analogtv_thread_destroy
+ };
+
+ XGCValues gcv;
+ analogtv *it=NULL;
+ int i;
+ const size_t rx_signal_len = ANALOGTV_SIGNAL_LEN + 2*ANALOGTV_H;
+
+ analogtv_init();
+
+ it=(analogtv *)calloc(1,sizeof(analogtv));
+ if (!it) return 0;
+ it->threads.count=0;
+ it->rx_signal=NULL;
+ it->signal_subtotals=NULL;
+
+ it->dpy=dpy;
+ it->window=window;
+
+ if (thread_malloc((void **)&it->rx_signal, dpy,
+ sizeof(it->rx_signal[0]) * rx_signal_len))
+ goto fail;
+
+ assert(!(ANALOGTV_SIGNAL_LEN % ANALOGTV_SUBTOTAL_LEN));
+ if (thread_malloc((void **)&it->signal_subtotals, dpy,
+ sizeof(it->signal_subtotals[0]) *
+ (rx_signal_len / ANALOGTV_SUBTOTAL_LEN)))
+ goto fail;
+
+ if (threadpool_create(&it->threads, &cls, dpy, hardware_concurrency(dpy)))
+ goto fail;
+
+ assert(it->threads.count);
+
+ it->shrinkpulse=-1;
+
+ it->n_colors=0;
+
+ XGetWindowAttributes (it->dpy, it->window, &it->xgwa);
+
+ it->screen=it->xgwa.screen;
+ it->colormap=it->xgwa.colormap;
+ it->visclass=visual_class(it->xgwa.screen, it->xgwa.visual);
+ it->visdepth=it->xgwa.depth;
+ if (it->visclass == TrueColor || it->visclass == DirectColor) {
+ if (get_integer_resource (it->dpy, "use_cmap", "Integer")) {
+ it->use_cmap=1;
+ } else {
+ it->use_cmap=0;
+ }
+ it->use_color=!mono_p;
+ }
+ else if (it->visclass == PseudoColor || it->visclass == StaticColor) {
+ it->use_cmap=1;
+ it->use_color=!mono_p;
+ }
+ else {
+ it->use_cmap=1;
+ it->use_color=0;
+ }
+
+ visual_rgb_masks (it->xgwa.screen, it->xgwa.visual,
+ &it->red_mask, &it->green_mask, &it->blue_mask);
+ it->red_shift=it->red_invprec=-1;
+ it->green_shift=it->green_invprec=-1;
+ it->blue_shift=it->blue_invprec=-1;
+ if (!it->use_cmap) {
+ /* Is there a standard way to do this? Does this handle all cases? */
+ int shift, prec;
+ for (shift=0; shift<32; shift++) {
+ for (prec=1; prec<16 && prec<40-shift; prec++) {
+ unsigned long mask=(0xffffUL>>(16-prec)) << shift;
+ if (it->red_shift<0 && mask==it->red_mask)
+ it->red_shift=shift, it->red_invprec=16-prec;
+ if (it->green_shift<0 && mask==it->green_mask)
+ it->green_shift=shift, it->green_invprec=16-prec;
+ if (it->blue_shift<0 && mask==it->blue_mask)
+ it->blue_shift=shift, it->blue_invprec=16-prec;
+ }
+ }
+ if (it->red_shift<0 || it->green_shift<0 || it->blue_shift<0) {
+ if (0) fprintf(stderr,"Can't figure out color space\n");
+ goto fail;
+ }
+
+ for (i=0; i<ANALOGTV_CV_MAX; i++) {
+ int intensity=pow(i/256.0, 0.8)*65535.0; /* gamma correction */
+ if (intensity>65535) intensity=65535;
+ it->red_values[i]=((intensity>>it->red_invprec)<<it->red_shift);
+ it->green_values[i]=((intensity>>it->green_invprec)<<it->green_shift);
+ it->blue_values[i]=((intensity>>it->blue_invprec)<<it->blue_shift);
+ }
+
+ }
+
+ gcv.background=get_pixel_resource(it->dpy, it->colormap,
+ "background", "Background");
+
+ it->gc = XCreateGC(it->dpy, it->window, GCBackground, &gcv);
+# ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (it->dpy, it->gc, False);
+# endif
+ XSetWindowBackground(it->dpy, it->window, gcv.background);
+ XClearWindow(dpy,window);
+
+ analogtv_configure(it);
+
+ return it;
+
+ fail:
+ if (it) {
+ if(it->threads.count)
+ threadpool_destroy(&it->threads);
+ thread_free(it->signal_subtotals);
+ thread_free(it->rx_signal);
+ free(it);
+ }
+ return NULL;
+}
+
+void
+analogtv_release(analogtv *it)
+{
+ if (it->image) {
+ destroy_xshm_image(it->dpy, it->image, &it->shm_info);
+ it->image=NULL;
+ }
+ if (it->gc) XFreeGC(it->dpy, it->gc);
+ it->gc=NULL;
+ if (it->n_colors) XFreeColors(it->dpy, it->colormap, it->colors, it->n_colors, 0L);
+ it->n_colors=0;
+ threadpool_destroy(&it->threads);
+ thread_free(it->rx_signal);
+ thread_free(it->signal_subtotals);
+ free(it);
+}
+
+
+/*
+ First generate the I and Q reference signals, which we'll multiply
+ the input signal by to accomplish the demodulation. Normally they
+ are shifted 33 degrees from the colorburst. I think this was convenient
+ for inductor-capacitor-vacuum tube implementation.
+
+ The tint control, FWIW, just adds a phase shift to the chroma signal,
+ and the color control controls the amplitude.
+
+ In text modes (colormode==0) the system disabled the color burst, and no
+ color was detected by the monitor.
+
+ freq_error gives a mismatch between the built-in oscillator and the
+ TV's colorbust. Some II Plus machines seemed to occasionally get
+ instability problems -- the crystal oscillator was a single
+ transistor if I remember correctly -- and the frequency would vary
+ enough that the tint would change across the width of the screen.
+ The left side would be in correct tint because it had just gotten
+ resynchronized with the color burst.
+
+ If we're using a colormap, set it up.
+*/
+int
+analogtv_set_demod(analogtv *it)
+{
+ int y_levels=10,i_levels=5,q_levels=5;
+
+ /*
+ In principle, we might be able to figure out how to adjust the
+ color map frame-by-frame to get some nice color bummage. But I'm
+ terrified of changing the color map because we'll get flashing.
+
+ I can hardly believe we still have to deal with colormaps. They're
+ like having NEAR PTRs: an enormous hassle for the programmer just
+ to save on memory. They should have been deprecated by 1995 or
+ so. */
+
+ cmap_again:
+ if (it->use_cmap && !it->n_colors) {
+
+ if (it->n_colors) {
+ XFreeColors(it->dpy, it->colormap, it->colors, it->n_colors, 0L);
+ it->n_colors=0;
+ }
+
+ {
+ int yli,qli,ili;
+ for (yli=0; yli<y_levels; yli++) {
+ for (ili=0; ili<i_levels; ili++) {
+ for (qli=0; qli<q_levels; qli++) {
+ double interpy,interpi,interpq;
+ double levelmult=700.0;
+ int r,g,b;
+ XColor col;
+
+ interpy=100.0 * ((double)yli/y_levels);
+ interpi=50.0 * (((double)ili-(0.5*i_levels))/(double)i_levels);
+ interpq=50.0 * (((double)qli-(0.5*q_levels))/(double)q_levels);
+
+ r=(int)((interpy + 1.04*interpi + 0.624*interpq)*levelmult);
+ g=(int)((interpy - 0.276*interpi - 0.639*interpq)*levelmult);
+ b=(int)((interpy - 1.105*interpi + 1.729*interpq)*levelmult);
+ if (r<0) r=0;
+ if (r>65535) r=65535;
+ if (g<0) g=0;
+ if (g>65535) g=65535;
+ if (b<0) b=0;
+ if (b>65535) b=65535;
+
+#ifdef DEBUG
+ printf("%0.2f %0.2f %0.2f => %02x%02x%02x\n",
+ interpy, interpi, interpq,
+ r/256,g/256,b/256);
+#endif
+
+ col.red=r;
+ col.green=g;
+ col.blue=b;
+ col.pixel=0;
+ if (!XAllocColor(it->dpy, it->colormap, &col)) {
+ if (q_levels > y_levels*4/12)
+ q_levels--;
+ else if (i_levels > y_levels*5/12)
+ i_levels--;
+ else
+ y_levels--;
+
+ if (y_levels<2)
+ return -1;
+ goto cmap_again;
+ }
+ it->colors[it->n_colors++]=col.pixel;
+ }
+ }
+ }
+
+ it->cmap_y_levels=y_levels;
+ it->cmap_i_levels=i_levels;
+ it->cmap_q_levels=q_levels;
+ }
+ }
+
+ return 0;
+}
+
+#if 0
+unsigned int
+analogtv_line_signature(analogtv_input *input, int lineno)
+{
+ int i;
+ char *origsignal=&input->signal[(lineno+input->vsync)
+ %ANALOGTV_V][input->line_hsync[lineno]];
+ unsigned int hash=0;
+
+ /* probably lame */
+ for (i=0; i<ANALOGTV_PIC_LEN; i++) {
+ int c=origsignal[i];
+ hash = hash + (hash<<17) + c;
+ }
+
+ hash += input->line_hsync[lineno];
+ hash ^= hash >> 2;
+ /*
+ hash += input->hashnoise_times[lineno];
+ hash ^= hash >> 2;
+ */
+
+ return hash;
+}
+#endif
+
+
+/* Here we model the analog circuitry of an NTSC television.
+ Basically, it splits the signal into 3 signals: Y, I and Q. Y
+ corresponds to luminance, and you get it by low-pass filtering the
+ input signal to below 3.57 MHz.
+
+ I and Q are the in-phase and quadrature components of the 3.57 MHz
+ subcarrier. We get them by multiplying by cos(3.57 MHz*t) and
+ sin(3.57 MHz*t), and low-pass filtering. Because the eye has less
+ resolution in some colors than others, the I component gets
+ low-pass filtered at 1.5 MHz and the Q at 0.5 MHz. The I component
+ is approximately orange-blue, and Q is roughly purple-green. See
+ http://www.ntsc-tv.com for details.
+
+ We actually do an awful lot to the signal here. I suspect it would
+ make sense to wrap them all up together by calculating impulse
+ response and doing FFT convolutions.
+
+*/
+
+static void
+analogtv_ntsc_to_yiq(const analogtv *it, int lineno, const float *signal,
+ int start, int end, struct analogtv_yiq_s *it_yiq)
+{
+ enum {MAXDELAY=32};
+ int i;
+ const float *sp;
+ int phasecorr=(signal-it->rx_signal)&3;
+ struct analogtv_yiq_s *yiq;
+ int colormode;
+ float agclevel=it->agclevel;
+ float brightadd=it->brightness_control*100.0 - ANALOGTV_BLACK_LEVEL;
+ float delay[MAXDELAY+ANALOGTV_PIC_LEN], *dp;
+ float multiq2[4];
+
+ {
+
+ double cb_i=(it->line_cb_phase[lineno][(2+phasecorr)&3]-
+ it->line_cb_phase[lineno][(0+phasecorr)&3])/16.0;
+ double cb_q=(it->line_cb_phase[lineno][(3+phasecorr)&3]-
+ it->line_cb_phase[lineno][(1+phasecorr)&3])/16.0;
+
+ colormode = (cb_i * cb_i + cb_q * cb_q) > 2.8;
+
+ if (colormode) {
+ multiq2[0] = (cb_i*it->tint_i - cb_q*it->tint_q) * it->color_control;
+ multiq2[1] = (cb_q*it->tint_i + cb_i*it->tint_q) * it->color_control;
+ multiq2[2]=-multiq2[0];
+ multiq2[3]=-multiq2[1];
+ }
+ }
+
+#if 0
+ if (lineno==100) {
+ printf("multiq = [%0.3f %0.3f %0.3f %0.3f] ",
+ it->multiq[60],it->multiq[61],it->multiq[62],it->multiq[63]);
+ printf("it->line_cb_phase = [%0.3f %0.3f %0.3f %0.3f]\n",
+ it->line_cb_phase[lineno][0],it->line_cb_phase[lineno][1],
+ it->line_cb_phase[lineno][2],it->line_cb_phase[lineno][3]);
+ printf("multiq2 = [%0.3f %0.3f %0.3f %0.3f]\n",
+ multiq2[0],multiq2[1],multiq2[2],multiq2[3]);
+ }
+#endif
+
+ dp=delay+ANALOGTV_PIC_LEN-MAXDELAY;
+ for (i=0; i<5; i++) dp[i]=0.0f;
+
+ assert(start>=0);
+ assert(end < ANALOGTV_PIC_LEN+10);
+
+ dp=delay+ANALOGTV_PIC_LEN-MAXDELAY;
+ for (i=0; i<24; i++) dp[i]=0.0;
+ for (i=start, yiq=it_yiq+start, sp=signal+start;
+ i<end;
+ i++, dp--, yiq++, sp++) {
+
+ /* Now filter them. These are infinite impulse response filters
+ calculated by the script at
+ http://www-users.cs.york.ac.uk/~fisher/mkfilter. This is
+ fixed-point integer DSP, son. No place for wimps. We do it in
+ integer because you can count on integer being faster on most
+ CPUs. We care about speed because we need to recalculate every
+ time we blink text, and when we spew random bytes into screen
+ memory. This is roughly 16.16 fixed point arithmetic, but we
+ scale some filter values up by a few bits to avoid some nasty
+ precision errors. */
+
+ /* Filter Y with a 4-pole low-pass Butterworth filter at 3.5 MHz
+ with an extra zero at 3.5 MHz, from
+ mkfilter -Bu -Lp -o 4 -a 2.1428571429e-01 0 -Z 2.5e-01 -l
+ Delay about 2 */
+
+ dp[0] = sp[0] * 0.0469904257251935f * agclevel;
+ dp[8] = (+1.0f*(dp[6]+dp[0])
+ +4.0f*(dp[5]+dp[1])
+ +7.0f*(dp[4]+dp[2])
+ +8.0f*(dp[3])
+ -0.0176648f*dp[12]
+ -0.4860288f*dp[10]);
+ yiq->y = dp[8] + brightadd;
+ }
+
+ if (colormode) {
+ dp=delay+ANALOGTV_PIC_LEN-MAXDELAY;
+ for (i=0; i<27; i++) dp[i]=0.0;
+
+ for (i=start, yiq=it_yiq+start, sp=signal+start;
+ i<end;
+ i++, dp--, yiq++, sp++) {
+ float sig=*sp;
+
+ /* Filter I and Q with a 3-pole low-pass Butterworth filter at
+ 1.5 MHz with an extra zero at 3.5 MHz, from
+ mkfilter -Bu -Lp -o 3 -a 1.0714285714e-01 0 -Z 2.5000000000e-01 -l
+ Delay about 3.
+ */
+
+ dp[0] = sig*multiq2[i&3] * 0.0833333333333f;
+ yiq->i=dp[8] = (dp[5] + dp[0]
+ +3.0f*(dp[4] + dp[1])
+ +4.0f*(dp[3] + dp[2])
+ -0.3333333333f * dp[10]);
+
+ dp[16] = sig*multiq2[(i+3)&3] * 0.0833333333333f;
+ yiq->q=dp[24] = (dp[16+5] + dp[16+0]
+ +3.0f*(dp[16+4] + dp[16+1])
+ +4.0f*(dp[16+3] + dp[16+2])
+ -0.3333333333f * dp[24+2]);
+ }
+ } else {
+ for (i=start, yiq=it_yiq+start; i<end; i++, yiq++) {
+ yiq->i = yiq->q = 0.0f;
+ }
+ }
+}
+
+void
+analogtv_setup_teletext(analogtv_input *input)
+{
+ int x,y;
+ int teletext=ANALOGTV_BLACK_LEVEL;
+
+ /* Teletext goes in line 21. But I suspect there are other things
+ in the vertical retrace interval */
+
+ for (y=19; y<22; y++) {
+ for (x=ANALOGTV_PIC_START; x<ANALOGTV_PIC_END; x++) {
+ if ((x&7)==0) {
+ teletext=(random()&1) ? ANALOGTV_WHITE_LEVEL : ANALOGTV_BLACK_LEVEL;
+ }
+ input->signal[y][x]=teletext;
+ }
+ }
+}
+
+void
+analogtv_setup_frame(analogtv *it)
+{
+ /* int i,x,y;*/
+
+ it->redraw_all=0;
+
+ if (it->flutter_horiz_desync) {
+ /* Horizontal sync during vertical sync instability. */
+ it->horiz_desync += -0.10*(it->horiz_desync-3.0) +
+ ((int)(random()&0xff)-0x80) *
+ ((int)(random()&0xff)-0x80) *
+ ((int)(random()&0xff)-0x80) * 0.000001;
+ }
+
+ /* it wasn't used
+ for (i=0; i<ANALOGTV_V; i++) {
+ it->hashnoise_times[i]=0;
+ }
+ */
+
+ /* let's leave it to process shrinkpulse */
+ if (it->hashnoise_enable && !it->hashnoise_on) {
+ if (random()%10000==0) {
+ it->hashnoise_on=1;
+ it->shrinkpulse=random()%ANALOGTV_V;
+ }
+ }
+ if (random()%1000==0) {
+ it->hashnoise_on=0;
+ }
+
+#if 0 /* never used */
+ if (it->hashnoise_on) {
+ it->hashnoise_rpm += (15000.0 - it->hashnoise_rpm)*0.05 +
+ ((int)(random()%2000)-1000)*0.1;
+ } else {
+ it->hashnoise_rpm -= 100 + 0.01*it->hashnoise_rpm;
+ if (it->hashnoise_rpm<0.0) it->hashnoise_rpm=0.0;
+ }
+ if (it->hashnoise_rpm > 0.0) {
+ int hni;
+ double hni_double;
+ int hnc=it->hashnoise_counter; /* in 24.8 format */
+
+ /* Convert rpm of a 16-pole motor into dots in 24.8 format */
+ hni_double = ANALOGTV_V * ANALOGTV_H * 256.0 /
+ (it->hashnoise_rpm * 16.0 / 60.0 / 60.0);
+ hni = (hni_double <= INT_MAX) ? (int)hni_double : INT_MAX;
+
+ while (hnc < (ANALOGTV_V * ANALOGTV_H)<<8) {
+ y=(hnc>>8)/ANALOGTV_H;
+ x=(hnc>>8)%ANALOGTV_H;
+
+ if (x>0 && x<ANALOGTV_H - ANALOGTV_HASHNOISE_LEN) {
+ it->hashnoise_times[y]=x;
+ }
+ /* hnc += hni + (int)(random()%65536)-32768; */
+ {
+ hnc += (int)(random()%65536)-32768;
+ if ((hnc >= 0) && (INT_MAX - hnc < hni)) break;
+ hnc += hni;
+ }
+ }
+ }
+#endif /* 0 */
+
+/* hnc -= (ANALOGTV_V * ANALOGTV_H)<<8;*/
+
+
+ if (it->rx_signal_level != 0.0)
+ it->agclevel = 1.0/it->rx_signal_level;
+
+
+#ifdef DEBUG2
+ printf("filter: ");
+ for (i=0; i<ANALOGTV_GHOSTFIR_LEN; i++) {
+ printf(" %0.3f",it->ghostfir[i]);
+ }
+ printf(" siglevel=%g agc=%g\n", siglevel, it->agclevel);
+#endif
+}
+
+void
+analogtv_setup_sync(analogtv_input *input, int do_cb, int do_ssavi)
+{
+ int i,lineno,vsync;
+ signed char *sig;
+
+ int synclevel = do_ssavi ? ANALOGTV_WHITE_LEVEL : ANALOGTV_SYNC_LEVEL;
+
+ for (lineno=0; lineno<ANALOGTV_V; lineno++) {
+ vsync=lineno>=3 && lineno<7;
+
+ sig=input->signal[lineno];
+
+ i=ANALOGTV_SYNC_START;
+ if (vsync) {
+ while (i<ANALOGTV_BP_START) sig[i++]=ANALOGTV_BLANK_LEVEL;
+ while (i<ANALOGTV_H) sig[i++]=synclevel;
+ } else {
+ while (i<ANALOGTV_BP_START) sig[i++]=synclevel;
+ while (i<ANALOGTV_PIC_START) sig[i++]=ANALOGTV_BLANK_LEVEL;
+ while (i<ANALOGTV_FP_START) sig[i++]=ANALOGTV_BLACK_LEVEL;
+ }
+ while (i<ANALOGTV_H) sig[i++]=ANALOGTV_BLANK_LEVEL;
+
+ if (do_cb) {
+ /* 9 cycles of colorburst */
+ for (i=ANALOGTV_CB_START; i<ANALOGTV_CB_START+36; i+=4) {
+ sig[i+1] += ANALOGTV_CB_LEVEL;
+ sig[i+3] -= ANALOGTV_CB_LEVEL;
+ }
+ }
+ }
+}
+
+static void
+analogtv_sync(analogtv *it)
+{
+ int cur_hsync=it->cur_hsync;
+ int cur_vsync=it->cur_vsync;
+ int lineno = 0;
+ int i,j;
+ float osc,filt;
+ float *sp;
+ float cbfc=1.0f/128.0f;
+
+/* sp = it->rx_signal + lineno*ANALOGTV_H + cur_hsync;*/
+ for (i=-32; i<32; i++) {
+ lineno = (cur_vsync + i + ANALOGTV_V) % ANALOGTV_V;
+ sp = it->rx_signal + lineno*ANALOGTV_H;
+ filt=0.0f;
+ for (j=0; j<ANALOGTV_H; j+=ANALOGTV_H/16) {
+ filt += sp[j];
+ }
+ filt *= it->agclevel;
+
+ osc = (float)(ANALOGTV_V+i)/(float)ANALOGTV_V;
+
+ if (osc >= 1.05f+0.0002f * filt) break;
+ }
+ cur_vsync = (cur_vsync + i + ANALOGTV_V) % ANALOGTV_V;
+
+ for (lineno=0; lineno<ANALOGTV_V; lineno++) {
+
+ if (lineno>5 && lineno<ANALOGTV_V-3) { /* ignore vsync interval */
+ unsigned lineno2 = (lineno + cur_vsync + ANALOGTV_V)%ANALOGTV_V;
+ if (!lineno2) lineno2 = ANALOGTV_V;
+ sp = it->rx_signal + lineno2*ANALOGTV_H + cur_hsync;
+ for (i=-8; i<8; i++) {
+ osc = (float)(ANALOGTV_H+i)/(float)ANALOGTV_H;
+ filt=(sp[i-3]+sp[i-2]+sp[i-1]+sp[i]) * it->agclevel;
+
+ if (osc >= 1.005f + 0.0001f*filt) break;
+ }
+ cur_hsync = (cur_hsync + i + ANALOGTV_H) % ANALOGTV_H;
+ }
+
+ it->line_hsync[lineno]=(cur_hsync + ANALOGTV_PIC_START +
+ ANALOGTV_H) % ANALOGTV_H;
+
+ /* Now look for the colorburst, which is a few cycles after the H
+ sync pulse, and store its phase.
+ The colorburst is 9 cycles long, and we look at the middle 5
+ cycles.
+ */
+
+ if (lineno>15) {
+ sp = it->rx_signal + lineno*ANALOGTV_H + (cur_hsync&~3);
+ for (i=ANALOGTV_CB_START+8; i<ANALOGTV_CB_START+36-8; i++) {
+ it->cb_phase[i&3] = it->cb_phase[i&3]*(1.0f-cbfc) +
+ sp[i]*it->agclevel*cbfc;
+ }
+ }
+
+ {
+ float tot=0.1f;
+ float cbgain;
+
+ for (i=0; i<4; i++) {
+ tot += it->cb_phase[i]*it->cb_phase[i];
+ }
+ cbgain = 32.0f/sqrtf(tot);
+
+ for (i=0; i<4; i++) {
+ it->line_cb_phase[lineno][i]=it->cb_phase[i]*cbgain;
+ }
+ }
+
+#ifdef DEBUG
+ if (0) printf("hs=%d cb=[%0.3f %0.3f %0.3f %0.3f]\n",
+ cur_hsync,
+ it->cb_phase[0], it->cb_phase[1],
+ it->cb_phase[2], it->cb_phase[3]);
+#endif
+
+ /* if (random()%2000==0) cur_hsync=random()%ANALOGTV_H; */
+ }
+
+ it->cur_hsync = cur_hsync;
+ it->cur_vsync = cur_vsync;
+}
+
+static double
+analogtv_levelmult(const analogtv *it, int level)
+{
+ static const double levelfac[3]={-7.5, 5.5, 24.5};
+ return (40.0 + levelfac[level]*puramp(it, 3.0, 6.0, 1.0))/256.0;
+}
+
+static int
+analogtv_level(const analogtv *it, int y, int ytop, int ybot)
+{
+ int level;
+ if (ybot-ytop>=7) {
+ if (y==ytop || y==ybot-1) level=0;
+ else if (y==ytop+1 || y==ybot-2) level=1;
+ else level=2;
+ }
+ else if (ybot-ytop>=5) {
+ if (y==ytop || y==ybot-1) level=0;
+ else level=2;
+ }
+ else if (ybot-ytop>=3) {
+ if (y==ytop) level=0;
+ else level=2;
+ }
+ else {
+ level=2;
+ }
+ return level;
+}
+
+/*
+ The point of this stuff is to ensure that when useheight is not a
+ multiple of VISLINES so that TV scan lines map to different numbers
+ of vertical screen pixels, the total brightness of each scan line
+ remains the same.
+ ANALOGTV_MAX_LINEHEIGHT corresponds to 2400 vertical pixels, beyond which
+ it interpolates extra black lines.
+ */
+
+static void
+analogtv_setup_levels(analogtv *it, double avgheight)
+{
+ int i,height;
+ static const double levelfac[3]={-7.5, 5.5, 24.5};
+
+ for (height=0; height<avgheight+2.0 && height<=ANALOGTV_MAX_LINEHEIGHT; height++) {
+
+ for (i=0; i<height; i++) {
+ it->leveltable[height][i].index = 2;
+ }
+
+ if (avgheight>=3) {
+ it->leveltable[height][0].index=0;
+ }
+ if (avgheight>=5) {
+ if (height >= 1) it->leveltable[height][height-1].index=0;
+ }
+ if (avgheight>=7) {
+ it->leveltable[height][1].index=1;
+ if (height >= 2) it->leveltable[height][height-2].index=1;
+ }
+
+ for (i=0; i<height; i++) {
+ it->leveltable[height][i].value =
+ (40.0 + levelfac[it->leveltable[height][i].index]*puramp(it, 3.0, 6.0, 1.0)) / 256.0;
+ }
+
+ }
+}
+
+static void rnd_combine(unsigned *a0, unsigned *c0, unsigned a1, unsigned c1)
+{
+ *a0 = (*a0 * a1) & 0xffffffffu;
+ *c0 = (c1 + a1 * *c0) & 0xffffffffu;
+}
+
+static void rnd_seek_ac(unsigned *a, unsigned *c, unsigned dist)
+{
+ unsigned int a1 = *a, c1 = *c;
+ *a = 1, *c = 0;
+
+ while(dist)
+ {
+ if(dist & 1)
+ rnd_combine(a, c, a1, c1);
+ dist >>= 1;
+ rnd_combine(&a1, &c1, a1, c1);
+ }
+}
+
+static unsigned int rnd_seek(unsigned a, unsigned c, unsigned rnd, unsigned dist)
+{
+ rnd_seek_ac(&a, &c, dist);
+ return a * rnd + c;
+}
+
+static void analogtv_init_signal(const analogtv *it, double noiselevel, unsigned start, unsigned end)
+{
+ float *ps=it->rx_signal + start;
+ float *pe=it->rx_signal + end;
+ float *p=ps;
+ unsigned int fastrnd=rnd_seek(FASTRND_A, FASTRND_C, it->random0, start);
+ unsigned int fastrnd_offset;
+ float nm1,nm2;
+ float noisemul = sqrt(noiselevel*150)/(float)0x7fffffff;
+
+ fastrnd_offset = fastrnd - 0x7fffffff;
+ nm1 = (fastrnd_offset <= INT_MAX ? (int)fastrnd_offset : -1 - (int)(UINT_MAX - fastrnd_offset)) * noisemul;
+ while (p != pe) {
+ nm2=nm1;
+ fastrnd = (fastrnd*FASTRND_A+FASTRND_C) & 0xffffffffu;
+ fastrnd_offset = fastrnd - 0x7fffffff;
+ nm1 = (fastrnd_offset <= INT_MAX ? (int)fastrnd_offset : -1 - (int)(UINT_MAX - fastrnd_offset)) * noisemul;
+ *p++ = nm1*nm2;
+ }
+}
+
+static void analogtv_add_signal(const analogtv *it, const analogtv_reception *rec, unsigned start, unsigned end, int ec)
+{
+ analogtv_input *inp=rec->input;
+ float *ps=it->rx_signal + start;
+ float *pe=it->rx_signal + end;
+ float *p=ps;
+ signed char *ss=&inp->signal[0][0];
+ signed char *se=&inp->signal[0][0] + ANALOGTV_SIGNAL_LEN;
+ signed char *s=ss + ((start + (unsigned)rec->ofs) % ANALOGTV_SIGNAL_LEN);
+ signed char *s2;
+ int i;
+ float level=rec->level;
+ float hfloss=rec->hfloss;
+ unsigned int fastrnd=rnd_seek(FASTRND_A, FASTRND_C, it->random1, start);
+ float dp[5];
+
+ const float noise_decay = 0.99995f;
+ float noise_ampl = 1.3f * powf(noise_decay, start);
+
+ if (ec > end)
+ ec = end;
+
+ /* assert((se-ss)%4==0 && (se-s)%4==0); */
+
+ for (i = start; i < ec; i++) { /* Sometimes start > ec. */
+
+ /* Do a big noisy transition. We can make the transition noise of
+ high constant strength regardless of signal strength.
+
+ There are two separate state machines. here, One is the noise
+ process and the other is the
+
+ We don't bother with the FIR filter here
+ */
+
+ float sig0=(float)s[0];
+ unsigned int fastrnd_offset = fastrnd - 0x7fffffff;
+ float noise = (fastrnd_offset <= INT_MAX ? (int)fastrnd_offset : -1 - (int)(UINT_MAX - fastrnd_offset)) * (50.0f/(float)0x7fffffff);
+ fastrnd = (fastrnd*FASTRND_A+FASTRND_C) & 0xffffffffu;
+
+ p[0] += sig0 * level * (1.0f - noise_ampl) + noise * noise_ampl;
+
+ noise_ampl *= noise_decay;
+
+ p++;
+ s++;
+ if (s>=se) s=ss;
+ }
+
+ dp[0]=0.0;
+ s2 = s;
+ for (i=1; i<5; i++) {
+ s2 -= 4;
+ if (s2 < ss)
+ s2 += ANALOGTV_SIGNAL_LEN;
+ dp[i] = (float)((int)s2[0]+(int)s2[1]+(int)s2[2]+(int)s2[3]);
+ }
+
+ assert(p <= pe);
+ assert(!((pe - p) % 4));
+ while (p != pe) {
+ float sig0,sig1,sig2,sig3,sigr;
+
+ sig0=(float)s[0];
+ sig1=(float)s[1];
+ sig2=(float)s[2];
+ sig3=(float)s[3];
+
+ dp[0]=sig0+sig1+sig2+sig3;
+
+ /* Get the video out signal, and add some ghosting, typical of RF
+ monitor cables. This corresponds to a pretty long cable, but
+ looks right to me.
+ */
+
+ sigr=(dp[1]*rec->ghostfir[0] + dp[2]*rec->ghostfir[1] +
+ dp[3]*rec->ghostfir[2] + dp[4]*rec->ghostfir[3]);
+ dp[4]=dp[3]; dp[3]=dp[2]; dp[2]=dp[1]; dp[1]=dp[0];
+
+ p[0] += (sig0+sigr + sig2*hfloss) * level;
+ p[1] += (sig1+sigr + sig3*hfloss) * level;
+ p[2] += (sig2+sigr + sig0*hfloss) * level;
+ p[3] += (sig3+sigr + sig1*hfloss) * level;
+
+ p += 4;
+ s += 4;
+ if (s>=se) s = ss + (s-se);
+ }
+
+ assert(p == pe);
+}
+
+static void analogtv_thread_add_signals(void *thread_raw)
+{
+ const analogtv_thread *thread = (analogtv_thread *)thread_raw;
+ const analogtv *it = thread->it;
+ unsigned i, j;
+ unsigned subtotal_end;
+
+ unsigned start = thread->signal_start;
+ while(start != thread->signal_end)
+ {
+ float *p;
+
+ /* Work on 8 KB blocks; these should fit in L1. */
+ /* (Though it doesn't seem to help much on my system.) */
+ unsigned end = start + 2048;
+ if(end > thread->signal_end)
+ end = thread->signal_end;
+
+ analogtv_init_signal (it, it->noiselevel, start, end);
+
+ for (i = 0; i != it->rec_count; ++i) {
+ analogtv_add_signal (it, it->recs[i], start, end,
+ !i ? it->channel_change_cycles : 0);
+ }
+
+ assert (!(start % ANALOGTV_SUBTOTAL_LEN));
+ assert (!(end % ANALOGTV_SUBTOTAL_LEN));
+
+ p = it->rx_signal + start;
+ subtotal_end = end / ANALOGTV_SUBTOTAL_LEN;
+ for (i = start / ANALOGTV_SUBTOTAL_LEN; i != subtotal_end; ++i) {
+ float sum = p[0];
+ for (j = 1; j != ANALOGTV_SUBTOTAL_LEN; ++j)
+ sum += p[j];
+ it->signal_subtotals[i] = sum;
+ p += ANALOGTV_SUBTOTAL_LEN;
+ }
+
+ start = end;
+ }
+}
+
+static int analogtv_get_line(const analogtv *it, int lineno, int *slineno,
+ int *ytop, int *ybot, unsigned *signal_offset)
+{
+ *slineno=lineno-ANALOGTV_TOP;
+ *ytop=(int)((*slineno*it->useheight/ANALOGTV_VISLINES -
+ it->useheight/2)*it->puheight) + it->useheight/2;
+ *ybot=(int)(((*slineno+1)*it->useheight/ANALOGTV_VISLINES -
+ it->useheight/2)*it->puheight) + it->useheight/2;
+#if 0
+ int linesig=analogtv_line_signature(input,lineno)
+ + it->hashnoise_times[lineno];
+#endif
+ *signal_offset = ((lineno+it->cur_vsync+ANALOGTV_V) % ANALOGTV_V) * ANALOGTV_H +
+ it->line_hsync[lineno];
+
+ if (*ytop==*ybot) return 0;
+ if (*ybot<0 || *ytop>it->useheight) return 0;
+ if (*ytop<0) *ytop=0;
+ if (*ybot>it->useheight) *ybot=it->useheight;
+
+ if (*ybot > *ytop+ANALOGTV_MAX_LINEHEIGHT) *ybot=*ytop+ANALOGTV_MAX_LINEHEIGHT;
+ return 1;
+}
+
+static void
+analogtv_blast_imagerow(const analogtv *it,
+ float *rgbf, float *rgbf_end,
+ int ytop, int ybot)
+{
+ int i,j,x,y;
+ float *rpf;
+ char *level_copyfrom[3];
+ int xrepl=it->xrepl;
+ unsigned lineheight = ybot - ytop;
+ if (lineheight > ANALOGTV_MAX_LINEHEIGHT) lineheight = ANALOGTV_MAX_LINEHEIGHT;
+ for (i=0; i<3; i++) level_copyfrom[i]=NULL;
+
+ for (y=ytop; y<ybot; y++) {
+ char *rowdata=it->image->data + y*it->image->bytes_per_line;
+ unsigned line = y-ytop;
+
+ int level=it->leveltable[lineheight][line].index;
+ float levelmult=it->leveltable[lineheight][line].value;
+
+ /* Fast special cases to avoid the slow XPutPixel. Ugh. It goes to show
+ why standard graphics sw has to be fast, or else people will have to
+ work around it and risk incompatibility. The quickdraw folks
+ understood this. The other answer would be for X11 to have fewer
+ formats for bitm.. oh, never mind. If neither of these cases work
+ (they probably cover 99% of setups) it falls back on the Xlib
+ routines. */
+
+ if (level_copyfrom[level]) {
+ memcpy(rowdata, level_copyfrom[level], it->image->bytes_per_line);
+ }
+ else {
+ level_copyfrom[level] = rowdata;
+
+ if (0) {
+ }
+ else if (it->image->format==ZPixmap &&
+ it->image->bits_per_pixel==32 &&
+ sizeof(unsigned int)==4 &&
+ it->image->byte_order==localbyteorder) {
+ /* int is more likely to be 32 bits than long */
+ unsigned int *pixelptr=(unsigned int *)rowdata;
+ unsigned int pix;
+
+ for (rpf=rgbf; rpf!=rgbf_end; rpf+=3) {
+ int ntscri=rpf[0]*levelmult;
+ int ntscgi=rpf[1]*levelmult;
+ int ntscbi=rpf[2]*levelmult;
+ if (ntscri>=ANALOGTV_CV_MAX) ntscri=ANALOGTV_CV_MAX-1;
+ if (ntscgi>=ANALOGTV_CV_MAX) ntscgi=ANALOGTV_CV_MAX-1;
+ if (ntscbi>=ANALOGTV_CV_MAX) ntscbi=ANALOGTV_CV_MAX-1;
+ pix = (it->red_values[ntscri] |
+ it->green_values[ntscgi] |
+ it->blue_values[ntscbi]);
+ pixelptr[0] = pix;
+ if (xrepl>=2) {
+ pixelptr[1] = pix;
+ if (xrepl>=3) pixelptr[2] = pix;
+ }
+ pixelptr+=xrepl;
+ }
+ }
+ else if (it->image->format==ZPixmap &&
+ it->image->bits_per_pixel==16 &&
+ sizeof(unsigned short)==2 &&
+ float_extraction_works &&
+ it->image->byte_order==localbyteorder) {
+ unsigned short *pixelptr=(unsigned short *)rowdata;
+ float r2,g2,b2;
+ float_extract_t r1,g1,b1;
+ unsigned short pix;
+
+ for (rpf=rgbf; rpf!=rgbf_end; rpf+=3) {
+ r2=rpf[0]; g2=rpf[1]; b2=rpf[2];
+ r1.f=r2 * levelmult+float_low8_ofs;
+ g1.f=g2 * levelmult+float_low8_ofs;
+ b1.f=b2 * levelmult+float_low8_ofs;
+ pix = (it->red_values[r1.i & 0x3ff] |
+ it->green_values[g1.i & 0x3ff] |
+ it->blue_values[b1.i & 0x3ff]);
+ pixelptr[0] = pix;
+ if (xrepl>=2) {
+ pixelptr[1] = pix;
+ if (xrepl>=3) pixelptr[2] = pix;
+ }
+ pixelptr+=xrepl;
+ }
+ }
+ else if (it->image->format==ZPixmap &&
+ it->image->bits_per_pixel==16 &&
+ sizeof(unsigned short)==2 &&
+ it->image->byte_order==localbyteorder) {
+ unsigned short *pixelptr=(unsigned short *)rowdata;
+ unsigned short pix;
+
+ for (rpf=rgbf; rpf!=rgbf_end; rpf+=3) {
+ int r1=rpf[0] * levelmult;
+ int g1=rpf[1] * levelmult;
+ int b1=rpf[2] * levelmult;
+ if (r1>=ANALOGTV_CV_MAX) r1=ANALOGTV_CV_MAX-1;
+ if (g1>=ANALOGTV_CV_MAX) g1=ANALOGTV_CV_MAX-1;
+ if (b1>=ANALOGTV_CV_MAX) b1=ANALOGTV_CV_MAX-1;
+ pix = it->red_values[r1] | it->green_values[g1] | it->blue_values[b1];
+ pixelptr[0] = pix;
+ if (xrepl>=2) {
+ pixelptr[1] = pix;
+ if (xrepl>=3) pixelptr[2] = pix;
+ }
+ pixelptr+=xrepl;
+ }
+ }
+ else {
+ for (x=0, rpf=rgbf; rpf!=rgbf_end ; x++, rpf+=3) {
+ int ntscri=rpf[0]*levelmult;
+ int ntscgi=rpf[1]*levelmult;
+ int ntscbi=rpf[2]*levelmult;
+ if (ntscri>=ANALOGTV_CV_MAX) ntscri=ANALOGTV_CV_MAX-1;
+ if (ntscgi>=ANALOGTV_CV_MAX) ntscgi=ANALOGTV_CV_MAX-1;
+ if (ntscbi>=ANALOGTV_CV_MAX) ntscbi=ANALOGTV_CV_MAX-1;
+ for (j=0; j<xrepl; j++) {
+ XPutPixel(it->image, x*xrepl + j, y,
+ it->red_values[ntscri] | it->green_values[ntscgi] |
+ it->blue_values[ntscbi]);
+ }
+ }
+ }
+ }
+ }
+}
+
+static void analogtv_thread_draw_lines(void *thread_raw)
+{
+ const analogtv_thread *thread = (analogtv_thread *)thread_raw;
+ const analogtv *it = thread->it;
+
+ int lineno;
+
+ float *raw_rgb_start;
+ float *raw_rgb_end;
+ raw_rgb_start=(float *)calloc(it->subwidth*3, sizeof(float));
+
+ if (! raw_rgb_start) return;
+
+ raw_rgb_end=raw_rgb_start+3*it->subwidth;
+
+ for (lineno=ANALOGTV_TOP + thread->thread_id;
+ lineno<ANALOGTV_BOT;
+ lineno += it->threads.count) {
+ int i,j,x,y;
+
+ int slineno, ytop, ybot;
+ unsigned signal_offset;
+
+ const float *signal;
+
+ int scanstart_i,scanend_i,squishright_i,squishdiv,pixrate;
+ float *rgb_start, *rgb_end;
+ float pixbright;
+ int pixmultinc;
+
+ float *rrp;
+
+ struct analogtv_yiq_s yiq[ANALOGTV_PIC_LEN+10];
+
+ if (! analogtv_get_line(it, lineno, &slineno, &ytop, &ybot,
+ &signal_offset))
+ continue;
+
+ signal = it->rx_signal + signal_offset;
+
+ {
+
+ float bloomthisrow,shiftthisrow;
+ float viswidth,middle;
+ float scanwidth;
+ int scw,scl,scr;
+
+ bloomthisrow = -10.0f * it->crtload[lineno];
+ if (bloomthisrow<-10.0f) bloomthisrow=-10.0f;
+ if (bloomthisrow>2.0f) bloomthisrow=2.0f;
+ if (slineno<16) {
+ shiftthisrow=it->horiz_desync * (expf(-0.17f*slineno) *
+ (0.7f+cosf(slineno*0.6f)));
+ } else {
+ shiftthisrow=0.0f;
+ }
+
+ viswidth=ANALOGTV_PIC_LEN * 0.79f - 5.0f*bloomthisrow;
+ middle=ANALOGTV_PIC_LEN/2 - shiftthisrow;
+
+ scanwidth=it->width_control * puramp(it, 0.5f, 0.3f, 1.0f);
+
+ scw=it->subwidth*scanwidth;
+ if (scw>it->subwidth) scw=it->usewidth;
+ scl=it->subwidth/2 - scw/2;
+ scr=it->subwidth/2 + scw/2;
+
+ pixrate=(int)((viswidth*65536.0f*1.0f)/it->subwidth)/scanwidth;
+ scanstart_i=(int)((middle-viswidth*0.5f)*65536.0f);
+ scanend_i=(ANALOGTV_PIC_LEN-1)*65536;
+ squishright_i=(int)((middle+viswidth*(0.25f + 0.25f*puramp(it, 2.0f, 0.0f, 1.1f)
+ - it->squish_control)) *65536.0f);
+ squishdiv=it->subwidth/15;
+
+ rgb_start=raw_rgb_start+scl*3;
+ rgb_end=raw_rgb_start+scr*3;
+
+ assert(scanstart_i>=0);
+
+#ifdef DEBUG
+ if (0) printf("scan %d: %0.3f %0.3f %0.3f scl=%d scr=%d scw=%d\n",
+ lineno,
+ scanstart_i/65536.0f,
+ squishright_i/65536.0f,
+ scanend_i/65536.0f,
+ scl,scr,scw);
+#endif
+ }
+
+ if (it->use_cmap) {
+ for (y=ytop; y<ybot; y++) {
+ int level=analogtv_level(it, y, ytop, ybot);
+ float levelmult=analogtv_levelmult(it, level);
+ float levelmult_y = levelmult * it->contrast_control
+ * puramp(it, 1.0f, 0.0f, 1.0f) / (0.5f+0.5f*it->puheight) * 0.070f;
+ float levelmult_iq = levelmult * 0.090f;
+
+ analogtv_ntsc_to_yiq(it, lineno, signal,
+ (scanstart_i>>16)-10, (scanend_i>>16)+10, yiq);
+ pixmultinc=pixrate;
+
+ x=0;
+ i=scanstart_i;
+ while (i<0 && x<it->usewidth) {
+ XPutPixel(it->image, x, y, it->colors[0]);
+ i+=pixmultinc;
+ x++;
+ }
+
+ while (i<scanend_i && x<it->usewidth) {
+ float pixfrac=(i&0xffff)/65536.0f;
+ float invpixfrac=(1.0f-pixfrac);
+ int pati=i>>16;
+ int yli,ili,qli,cmi;
+
+ float interpy=(yiq[pati].y*invpixfrac
+ + yiq[pati+1].y*pixfrac) * levelmult_y;
+ float interpi=(yiq[pati].i*invpixfrac
+ + yiq[pati+1].i*pixfrac) * levelmult_iq;
+ float interpq=(yiq[pati].q*invpixfrac
+ + yiq[pati+1].q*pixfrac) * levelmult_iq;
+
+ yli = (int)(interpy * it->cmap_y_levels);
+ ili = (int)((interpi+0.5f) * it->cmap_i_levels);
+ qli = (int)((interpq+0.5f) * it->cmap_q_levels);
+ if (yli<0) yli=0;
+ if (yli>=it->cmap_y_levels) yli=it->cmap_y_levels-1;
+ if (ili<0) ili=0;
+ if (ili>=it->cmap_i_levels) ili=it->cmap_i_levels-1;
+ if (qli<0) qli=0;
+ if (qli>=it->cmap_q_levels) qli=it->cmap_q_levels-1;
+
+ cmi=qli + it->cmap_i_levels*(ili + it->cmap_q_levels*yli);
+
+#ifdef DEBUG
+ if ((random()%65536)==0) {
+ printf("%0.3f %0.3f %0.3f => %d %d %d => %d\n",
+ interpy, interpi, interpq,
+ yli, ili, qli,
+ cmi);
+ }
+#endif
+
+ for (j=0; j<it->xrepl; j++) {
+ XPutPixel(it->image, x, y,
+ it->colors[cmi]);
+ x++;
+ }
+ if (i >= squishright_i) {
+ pixmultinc += pixmultinc/squishdiv;
+ }
+ i+=pixmultinc;
+ }
+ while (x<it->usewidth) {
+ XPutPixel(it->image, x, y, it->colors[0]);
+ x++;
+ }
+ }
+ }
+ else {
+ analogtv_ntsc_to_yiq(it, lineno, signal,
+ (scanstart_i>>16)-10, (scanend_i>>16)+10, yiq);
+
+ pixbright=it->contrast_control * puramp(it, 1.0f, 0.0f, 1.0f)
+ / (0.5f+0.5f*it->puheight) * 1024.0f/100.0f;
+ pixmultinc=pixrate;
+ i=scanstart_i; rrp=rgb_start;
+ while (i<0 && rrp!=rgb_end) {
+ rrp[0]=rrp[1]=rrp[2]=0;
+ i+=pixmultinc;
+ rrp+=3;
+ }
+ while (i<scanend_i && rrp!=rgb_end) {
+ float pixfrac=(i&0xffff)/65536.0f;
+ float invpixfrac=1.0f-pixfrac;
+ int pati=i>>16;
+ float r,g,b;
+
+ float interpy=(yiq[pati].y*invpixfrac + yiq[pati+1].y*pixfrac);
+ float interpi=(yiq[pati].i*invpixfrac + yiq[pati+1].i*pixfrac);
+ float interpq=(yiq[pati].q*invpixfrac + yiq[pati+1].q*pixfrac);
+
+ /*
+ According to the NTSC spec, Y,I,Q are generated as:
+
+ y=0.30 r + 0.59 g + 0.11 b
+ i=0.60 r - 0.28 g - 0.32 b
+ q=0.21 r - 0.52 g + 0.31 b
+
+ So if you invert the implied 3x3 matrix you get what standard
+ televisions implement with a bunch of resistors (or directly in the
+ CRT -- don't ask):
+
+ r = y + 0.948 i + 0.624 q
+ g = y - 0.276 i - 0.639 q
+ b = y - 1.105 i + 1.729 q
+ */
+
+ r=(interpy + 0.948f*interpi + 0.624f*interpq) * pixbright;
+ g=(interpy - 0.276f*interpi - 0.639f*interpq) * pixbright;
+ b=(interpy - 1.105f*interpi + 1.729f*interpq) * pixbright;
+ if (r<0.0f) r=0.0f;
+ if (g<0.0f) g=0.0f;
+ if (b<0.0f) b=0.0f;
+ rrp[0]=r;
+ rrp[1]=g;
+ rrp[2]=b;
+
+ if (i>=squishright_i) {
+ pixmultinc += pixmultinc/squishdiv;
+ pixbright += pixbright/squishdiv/2;
+ }
+ i+=pixmultinc;
+ rrp+=3;
+ }
+ while (rrp != rgb_end) {
+ rrp[0]=rrp[1]=rrp[2]=0.0f;
+ rrp+=3;
+ }
+
+ analogtv_blast_imagerow(it, raw_rgb_start, raw_rgb_end,
+ ytop,ybot);
+ }
+ }
+
+ free(raw_rgb_start);
+}
+
+void
+analogtv_draw(analogtv *it, double noiselevel,
+ const analogtv_reception *const *recs, unsigned rec_count)
+{
+ int i,lineno;
+ /* int bigloadchange,drawcount;*/
+ double baseload;
+ int overall_top, overall_bot;
+
+ /* AnalogTV isn't very interesting if there isn't enough RAM. */
+ if (!it->image)
+ return;
+
+ it->rx_signal_level = noiselevel;
+ for (i = 0; i != rec_count; ++i) {
+ const analogtv_reception *rec = recs[i];
+ double level = rec->level;
+ analogtv_input *inp=rec->input;
+
+ it->rx_signal_level =
+ sqrt(it->rx_signal_level * it->rx_signal_level +
+ (level * level * (1.0 + 4.0*(rec->ghostfir[0] + rec->ghostfir[1] +
+ rec->ghostfir[2] + rec->ghostfir[3]))));
+
+ /* duplicate the first line into the Nth line to ease wraparound computation */
+ memcpy(inp->signal[ANALOGTV_V], inp->signal[0],
+ ANALOGTV_H * sizeof(inp->signal[0][0]));
+ }
+
+ analogtv_setup_frame(it);
+ analogtv_set_demod(it);
+
+ it->random0 = random();
+ it->random1 = random();
+ it->noiselevel = noiselevel;
+ it->recs = recs;
+ it->rec_count = rec_count;
+ threadpool_run(&it->threads, analogtv_thread_add_signals);
+ threadpool_wait(&it->threads);
+
+ it->channel_change_cycles=0;
+
+ /* rx_signal has an extra 2 lines at the end, where we copy the
+ first 2 lines so we can index into it while only worrying about
+ wraparound on a per-line level */
+ memcpy(&it->rx_signal[ANALOGTV_SIGNAL_LEN],
+ &it->rx_signal[0],
+ 2*ANALOGTV_H*sizeof(it->rx_signal[0]));
+
+ /* Repeat for signal_subtotals. */
+
+ memcpy(&it->signal_subtotals[ANALOGTV_SIGNAL_LEN / ANALOGTV_SUBTOTAL_LEN],
+ &it->signal_subtotals[0],
+ (2*ANALOGTV_H/ANALOGTV_SUBTOTAL_LEN)*sizeof(it->signal_subtotals[0]));
+
+ analogtv_sync(it); /* Requires the add_signals be complete. */
+
+ baseload=0.5;
+ /* if (it->hashnoise_on) baseload=0.5; */
+
+ /*bigloadchange=1;
+ drawcount=0;*/
+ it->crtload[ANALOGTV_TOP-1]=baseload;
+ it->puheight = puramp(it, 2.0, 1.0, 1.3) * it->height_control *
+ (1.125 - 0.125*puramp(it, 2.0, 2.0, 1.1));
+
+ analogtv_setup_levels(it, it->puheight * (double)it->useheight/(double)ANALOGTV_VISLINES);
+
+ /* calculate tint once per frame */
+ it->tint_i = -cos((103 + it->tint_control)*3.1415926/180);
+ it->tint_q = sin((103 + it->tint_control)*3.1415926/180);
+
+ for (lineno=ANALOGTV_TOP; lineno<ANALOGTV_BOT; lineno++) {
+ int slineno, ytop, ybot;
+ unsigned signal_offset;
+ if (! analogtv_get_line(it, lineno, &slineno, &ytop, &ybot, &signal_offset))
+ continue;
+
+ if (lineno==it->shrinkpulse) {
+ baseload += 0.4;
+ /*bigloadchange=1;*/
+ it->shrinkpulse=-1;
+ }
+
+#if 0
+ if (it->hashnoise_rpm>0.0 &&
+ !(bigloadchange ||
+ it->redraw_all ||
+ (slineno<20 && it->flutter_horiz_desync) ||
+ it->gaussiannoise_level>30 ||
+ ((it->gaussiannoise_level>2.0 ||
+ it->multipath) && random()%4) ||
+ linesig != it->onscreen_signature[lineno])) {
+ continue;
+ }
+ it->onscreen_signature[lineno] = linesig;
+#endif
+ /* drawcount++;*/
+
+ /*
+ Interpolate the 600-dotclock line into however many horizontal
+ screen pixels we're using, and convert to RGB.
+
+ We add some 'bloom', variations in the horizontal scan width with
+ the amount of brightness, extremely common on period TV sets. They
+ had a single oscillator which generated both the horizontal scan and
+ (during the horizontal retrace interval) the high voltage for the
+ electron beam. More brightness meant more load on the oscillator,
+ which caused an decrease in horizontal deflection. Look for
+ (bloomthisrow).
+
+ Also, the A2 did a bad job of generating horizontal sync pulses
+ during the vertical blanking interval. This, and the fact that the
+ horizontal frequency was a bit off meant that TVs usually went a bit
+ out of sync during the vertical retrace, and the top of the screen
+ would be bent a bit to the left or right. Look for (shiftthisrow).
+
+ We also add a teeny bit of left overscan, just enough to be
+ annoying, but you can still read the left column of text.
+
+ We also simulate compression & brightening on the right side of the
+ screen. Most TVs do this, but you don't notice because they overscan
+ so it's off the right edge of the CRT. But the A2 video system used
+ so much of the horizontal scan line that you had to crank the
+ horizontal width down in order to not lose the right few characters,
+ and you'd see the compression on the right edge. Associated with
+ compression is brightening; since the electron beam was scanning
+ slower, the same drive signal hit the phosphor harder. Look for
+ (squishright_i) and (squishdiv).
+ */
+
+ {
+ /* This used to be an int, I suspect by mistake. - Dave */
+ float totsignal=0;
+ float ncl/*,diff*/;
+ unsigned frac;
+ size_t end0, end1;
+ const float *p;
+
+ frac = signal_offset & (ANALOGTV_SUBTOTAL_LEN - 1);
+ p = it->rx_signal + (signal_offset & ~(ANALOGTV_SUBTOTAL_LEN - 1));
+ for (i=0; i != frac; i++) {
+ totsignal -= p[i];
+ }
+
+ end0 = (signal_offset + ANALOGTV_PIC_LEN);
+
+ end1 = end0 / ANALOGTV_SUBTOTAL_LEN;
+ for (i=signal_offset / ANALOGTV_SUBTOTAL_LEN; i<end1; i++) {
+ totsignal += it->signal_subtotals[i];
+ }
+
+ frac = end0 & (ANALOGTV_SUBTOTAL_LEN - 1);
+ p = it->rx_signal + (end0 & ~(ANALOGTV_SUBTOTAL_LEN - 1));
+ for (i=0; i != frac; i++) {
+ totsignal += p[i];
+ }
+
+ totsignal *= it->agclevel;
+ ncl = 0.95f * it->crtload[lineno-1] +
+ 0.05f*(baseload +
+ (totsignal-30000)/100000.0f +
+ (slineno>184 ? (slineno-184)*(lineno-184)*0.001f * it->squeezebottom
+ : 0.0f));
+ /*diff=ncl - it->crtload[lineno];*/
+ /*bigloadchange = (diff>0.01 || diff<-0.01);*/
+ it->crtload[lineno]=ncl;
+ }
+ }
+
+ threadpool_run(&it->threads, analogtv_thread_draw_lines);
+ threadpool_wait(&it->threads);
+
+#if 0
+ /* poor attempt at visible retrace */
+ for (i=0; i<15; i++) {
+ int ytop=(int)((i*it->useheight/15 -
+ it->useheight/2)*puheight) + it->useheight/2;
+ int ybot=(int)(((i+1)*it->useheight/15 -
+ it->useheight/2)*puheight) + it->useheight/2;
+ int div=it->usewidth*3/2;
+
+ for (x=0; x<it->usewidth; x++) {
+ y = ytop + (ybot-ytop)*x / div;
+ if (y<0 || y>=it->useheight) continue;
+ XPutPixel(it->image, x, y, 0xffffff);
+ }
+ }
+#endif
+
+ if (it->need_clear) {
+ XClearWindow(it->dpy, it->window);
+ it->need_clear=0;
+ }
+
+ /*
+ Subtle change: overall_bot was the bottom of the last scan line. Now it's
+ the top of the next-after-the-last scan line. This is the same until
+ the y-dimension is > 2400, note ANALOGTV_MAX_LINEHEIGHT.
+ */
+
+ overall_top=(int)(it->useheight*(1-it->puheight)/2);
+ overall_bot=(int)(it->useheight*(1+it->puheight)/2);
+
+ if (overall_top<0) overall_top=0;
+ if (overall_bot>it->useheight) overall_bot=it->useheight;
+
+ if (overall_top>0) {
+ XClearArea(it->dpy, it->window,
+ it->screen_xo, it->screen_yo,
+ it->usewidth, overall_top, 0);
+ }
+ if (it->useheight > overall_bot) {
+ XClearArea(it->dpy, it->window,
+ it->screen_xo, it->screen_yo+overall_bot,
+ it->usewidth, it->useheight-overall_bot, 0);
+ }
+
+ if (overall_bot > overall_top) {
+ put_xshm_image(it->dpy, it->window, it->gc, it->image,
+ 0, overall_top,
+ it->screen_xo, it->screen_yo+overall_top,
+ it->usewidth, overall_bot - overall_top,
+ &it->shm_info);
+ }
+
+#ifdef DEBUG
+ if (0) {
+ struct timeval tv;
+ double fps;
+ char buf[256];
+ gettimeofday(&tv,NULL);
+
+ fps=1.0/((tv.tv_sec - it->last_display_time.tv_sec)
+ + 0.000001*(tv.tv_usec - it->last_display_time.tv_usec));
+ sprintf(buf, "FPS=%0.1f",fps);
+ XDrawString(it->dpy, it->window, it->gc, 50, it->useheight*2/3,
+ buf, strlen(buf));
+
+ it->last_display_time=tv;
+ }
+#endif
+}
+
+analogtv_input *
+analogtv_input_allocate()
+{
+ analogtv_input *ret=(analogtv_input *)calloc(1,sizeof(analogtv_input));
+
+ return ret;
+}
+
+/*
+ This takes a screen image and encodes it as a video camera would,
+ including all the bandlimiting and YIQ modulation.
+ This isn't especially tuned for speed.
+
+ xoff, yoff: top left corner of rendered image, in window pixels.
+ w, h: scaled size of rendered image, in window pixels.
+ mask: BlackPixel means don't render (it's not full alpha)
+*/
+
+int
+analogtv_load_ximage(analogtv *it, analogtv_input *input,
+ XImage *pic_im, XImage *mask_im,
+ int xoff, int yoff, int target_w, int target_h)
+{
+ int i,x,y;
+ int img_w,img_h;
+ int fyx[7],fyy[7];
+ int fix[4],fiy[4];
+ int fqx[4],fqy[4];
+ XColor col1[ANALOGTV_PIC_LEN];
+ XColor col2[ANALOGTV_PIC_LEN];
+ char mask[ANALOGTV_PIC_LEN];
+ int multiq[ANALOGTV_PIC_LEN+4];
+ unsigned long black = 0; /* not BlackPixelOfScreen (it->xgwa.screen); */
+
+ int x_length=ANALOGTV_PIC_LEN;
+ int y_overscan=5; /* overscan this much top and bottom */
+ int y_scanlength=ANALOGTV_VISLINES+2*y_overscan;
+
+ if (target_w > 0) x_length = x_length * target_w / it->xgwa.width;
+ if (target_h > 0) y_scanlength = y_scanlength * target_h / it->xgwa.height;
+
+ img_w = pic_im->width;
+ img_h = pic_im->height;
+
+ xoff = ANALOGTV_PIC_LEN * xoff / it->xgwa.width;
+ yoff = ANALOGTV_VISLINES * yoff / it->xgwa.height;
+
+ for (i=0; i<x_length+4; i++) {
+ double phase=90.0-90.0*i;
+ double ampl=1.0;
+ multiq[i]=(int)(-cos(3.1415926/180.0*(phase-303)) * 4096.0 * ampl);
+ }
+
+ for (y=0; y<y_scanlength; y++) {
+ int picy1=(y*img_h)/y_scanlength;
+ int picy2=(y*img_h + y_scanlength/2)/y_scanlength;
+
+ for (x=0; x<x_length; x++) {
+ int picx=(x*img_w)/x_length;
+ col1[x].pixel=XGetPixel(pic_im, picx, picy1);
+ col2[x].pixel=XGetPixel(pic_im, picx, picy2);
+ if (mask_im)
+ mask[x] = (XGetPixel(mask_im, picx, picy1) != black);
+ else
+ mask[x] = 1;
+ }
+ XQueryColors(it->dpy, it->colormap, col1, x_length);
+ XQueryColors(it->dpy, it->colormap, col2, x_length);
+ for (i=0; i<7; i++) fyx[i]=fyy[i]=0;
+ for (i=0; i<4; i++) fix[i]=fiy[i]=fqx[i]=fqy[i]=0.0;
+
+ for (x=0; x<x_length; x++) {
+ int rawy,rawi,rawq;
+ int filty,filti,filtq;
+ int composite;
+
+ if (!mask[x]) continue;
+
+ /* Compute YIQ as:
+ y=0.30 r + 0.59 g + 0.11 b
+ i=0.60 r - 0.28 g - 0.32 b
+ q=0.21 r - 0.52 g + 0.31 b
+ The coefficients below are in .4 format */
+
+ rawy=( 5*col1[x].red + 11*col1[x].green + 2*col1[x].blue +
+ 5*col2[x].red + 11*col2[x].green + 2*col2[x].blue)>>7;
+ rawi=(10*col1[x].red - 4*col1[x].green - 5*col1[x].blue +
+ 10*col2[x].red - 4*col2[x].green - 5*col2[x].blue)>>7;
+ rawq=( 3*col1[x].red - 8*col1[x].green + 5*col1[x].blue +
+ 3*col2[x].red - 8*col2[x].green + 5*col2[x].blue)>>7;
+
+ /* Filter y at with a 4-pole low-pass Butterworth filter at 3.5 MHz
+ with an extra zero at 3.5 MHz, from
+ mkfilter -Bu -Lp -o 4 -a 2.1428571429e-01 0 -Z 2.5e-01 -l */
+
+ fyx[0] = fyx[1]; fyx[1] = fyx[2]; fyx[2] = fyx[3];
+ fyx[3] = fyx[4]; fyx[4] = fyx[5]; fyx[5] = fyx[6];
+ fyx[6] = (rawy * 1897) >> 16;
+ fyy[0] = fyy[1]; fyy[1] = fyy[2]; fyy[2] = fyy[3];
+ fyy[3] = fyy[4]; fyy[4] = fyy[5]; fyy[5] = fyy[6];
+ fyy[6] = (fyx[0]+fyx[6]) + 4*(fyx[1]+fyx[5]) + 7*(fyx[2]+fyx[4]) + 8*fyx[3]
+ + ((-151*fyy[2] + 8115*fyy[3] - 38312*fyy[4] + 36586*fyy[5]) >> 16);
+ filty = fyy[6];
+
+ /* Filter I at 1.5 MHz. 3 pole Butterworth from
+ mkfilter -Bu -Lp -o 3 -a 1.0714285714e-01 0 */
+
+ fix[0] = fix[1]; fix[1] = fix[2]; fix[2] = fix[3];
+ fix[3] = (rawi * 1413) >> 16;
+ fiy[0] = fiy[1]; fiy[1] = fiy[2]; fiy[2] = fiy[3];
+ fiy[3] = (fix[0]+fix[3]) + 3*(fix[1]+fix[2])
+ + ((16559*fiy[0] - 72008*fiy[1] + 109682*fiy[2]) >> 16);
+ filti = fiy[3];
+
+ /* Filter Q at 0.5 MHz. 3 pole Butterworth from
+ mkfilter -Bu -Lp -o 3 -a 3.5714285714e-02 0 -l */
+
+ fqx[0] = fqx[1]; fqx[1] = fqx[2]; fqx[2] = fqx[3];
+ fqx[3] = (rawq * 75) >> 16;
+ fqy[0] = fqy[1]; fqy[1] = fqy[2]; fqy[2] = fqy[3];
+ fqy[3] = (fqx[0]+fqx[3]) + 3 * (fqx[1]+fqx[2])
+ + ((2612*fqy[0] - 9007*fqy[1] + 10453 * fqy[2]) >> 12);
+ filtq = fqy[3];
+
+
+ composite = filty + ((multiq[x] * filti + multiq[x+3] * filtq)>>12);
+ composite = ((composite*100)>>14) + ANALOGTV_BLACK_LEVEL;
+ if (composite>125) composite=125;
+ if (composite<0) composite=0;
+
+ input->signal[y-y_overscan+ANALOGTV_TOP+yoff][x+ANALOGTV_PIC_START+xoff] = composite;
+ }
+ }
+
+ return 1;
+}
+
+#if 0
+void analogtv_channel_noise(analogtv_input *it, analogtv_input *s2)
+{
+ int x,y,newsig;
+ int change=random()%ANALOGTV_V;
+ unsigned int fastrnd=random();
+ double hso=(int)(random()%1000)-500;
+ int yofs=random()%ANALOGTV_V;
+ int noise;
+
+ for (y=change; y<ANALOGTV_V; y++) {
+ int s2y=(y+yofs)%ANALOGTV_V;
+ int filt=0;
+ int noiselevel=60000 / (y-change+100);
+
+ it->line_hsync[y] = s2->line_hsync[y] + (int)hso;
+ hso *= 0.9;
+ for (x=0; x<ANALOGTV_H; x++) {
+ FASTRND;
+ filt+= (-filt/16) + (int)(fastrnd&0xfff)-0x800;
+ noise=(filt*noiselevel)>>16;
+ newsig=s2->signal[s2y][x] + noise;
+ if (newsig>120) newsig=120;
+ if (newsig<0) newsig=0;
+ it->signal[y][x]=newsig;
+ }
+ }
+ s2->vsync=yofs;
+}
+#endif
+
+
+#ifdef FIXME
+/* add hash */
+ if (it->hashnoise_times[lineno]) {
+ int hnt=it->hashnoise_times[lineno] - input->line_hsync[lineno];
+
+ if (hnt>=0 && hnt<ANALOGTV_PIC_LEN) {
+ double maxampl=1.0;
+ double cur=frand(150.0)-20.0;
+ int len=random()%15+3;
+ if (len > ANALOGTV_PIC_LEN-hnt) len=ANALOGTV_PIC_LEN-hnt;
+ for (i=0; i<len; i++) {
+ double sig=signal[hnt];
+
+ sig += cur*maxampl;
+ cur += frand(5.0)-5.0;
+ maxampl = maxampl*0.9;
+
+ signal[hnt]=sig;
+ hnt++;
+ }
+ }
+ }
+#endif
+
+
+void
+analogtv_reception_update(analogtv_reception *rec)
+{
+ int i;
+
+ if (rec->multipath > 0.0) {
+ for (i=0; i<ANALOGTV_GHOSTFIR_LEN; i++) {
+ rec->ghostfir2[i] +=
+ -(rec->ghostfir2[i]/16.0) + rec->multipath * (frand(0.02)-0.01);
+ }
+ if (random()%20==0) {
+ rec->ghostfir2[random()%(ANALOGTV_GHOSTFIR_LEN)]
+ = rec->multipath * (frand(0.08)-0.04);
+ }
+ for (i=0; i<ANALOGTV_GHOSTFIR_LEN; i++) {
+ rec->ghostfir[i] = 0.8*rec->ghostfir[i] + 0.2*rec->ghostfir2[i];
+ }
+
+ if (0) {
+ rec->hfloss2 += -(rec->hfloss2/16.0) + rec->multipath * (frand(0.08)-0.04);
+ rec->hfloss = 0.5*rec->hfloss + 0.5*rec->hfloss2;
+ }
+
+ } else {
+ for (i=0; i<ANALOGTV_GHOSTFIR_LEN; i++) {
+ rec->ghostfir[i] = (i>=ANALOGTV_GHOSTFIR_LEN/2) ? ((i&1) ? +0.04 : -0.08) /ANALOGTV_GHOSTFIR_LEN
+ : 0.0;
+ }
+ }
+}
+
+
+/* jwz: since MacOS doesn't have "6x10", I dumped this font to a PNG...
+ */
+
+#include "images/gen/6x10font_png.h"
+
+void
+analogtv_make_font(Display *dpy, Window window, analogtv_font *f,
+ int w, int h, char *fontname)
+{
+ int i;
+ XFontStruct *font;
+ Pixmap text_pm;
+ GC gc;
+ XGCValues gcv;
+ XWindowAttributes xgwa;
+
+ f->char_w = w;
+ f->char_h = h;
+
+ XGetWindowAttributes (dpy, window, &xgwa);
+
+ if (fontname && !strcmp (fontname, "6x10")) {
+
+ int pix_w, pix_h;
+ XWindowAttributes xgwa;
+ Pixmap m = 0;
+ Pixmap p = image_data_to_pixmap (dpy, window,
+ _6x10font_png, sizeof(_6x10font_png),
+ &pix_w, &pix_h, &m);
+ XImage *im = XGetImage (dpy, p, 0, 0, pix_w, pix_h, ~0L, ZPixmap);
+ XImage *mm = XGetImage (dpy, m, 0, 0, pix_w, pix_h, 1, XYPixmap);
+ unsigned long black = BlackPixelOfScreen (DefaultScreenOfDisplay (dpy));
+ int x, y;
+
+ XFreePixmap (dpy, p);
+ XFreePixmap (dpy, m);
+ if (pix_w != 256*7) abort();
+ if (pix_h != 10) abort();
+
+ XGetWindowAttributes (dpy, window, &xgwa);
+ f->text_im = XCreateImage (dpy, xgwa.visual, 1, XYBitmap, 0, 0,
+ pix_w, pix_h, 8, 0);
+ f->text_im->data = malloc (f->text_im->bytes_per_line * f->text_im->height);
+
+ /* Convert deep image to 1 bit */
+ for (y = 0; y < pix_h; y++)
+ for (x = 0; x < pix_w; x++)
+ XPutPixel (f->text_im, x, y,
+ (XGetPixel (mm, x, y)
+ ? XGetPixel (im, x, y) == black
+ : 0));
+ XDestroyImage (im);
+ XDestroyImage (mm);
+
+ } else if (fontname) {
+
+ font = load_font_retry (dpy, fontname);
+ if (!font) {
+ fprintf(stderr, "analogtv: can't load font %s\n", fontname);
+ abort();
+ }
+
+ text_pm=XCreatePixmap(dpy, window, 256*f->char_w, f->char_h, 1);
+
+ memset(&gcv, 0, sizeof(gcv));
+ gcv.foreground=1;
+ gcv.background=0;
+ gcv.font=font->fid;
+ gc=XCreateGC(dpy, text_pm, GCFont|GCBackground|GCForeground, &gcv);
+# ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (dpy, gc, False);
+# endif
+
+ XSetForeground(dpy, gc, 0);
+ XFillRectangle(dpy, text_pm, gc, 0, 0, 256*f->char_w, f->char_h);
+ XSetForeground(dpy, gc, 1);
+ for (i=0; i<256; i++) {
+ char c=i;
+ int x=f->char_w*i+1;
+ int y=f->char_h*8/10;
+ XDrawString(dpy, text_pm, gc, x, y, &c, 1);
+ }
+ f->text_im = XGetImage(dpy, text_pm, 0, 0, 256*f->char_w, f->char_h,
+ 1, XYPixmap);
+# if 0
+ XWriteBitmapFile(dpy, "/tmp/tvfont.xbm", text_pm,
+ 256*f->char_w, f->char_h, -1, -1);
+# endif
+ XFreeGC(dpy, gc);
+ XFreePixmap(dpy, text_pm);
+ } else {
+ f->text_im = XCreateImage(dpy, xgwa.visual, 1, XYPixmap, 0, 0,
+ 256*f->char_w, f->char_h, 8, 0);
+ f->text_im->data = (char *)calloc(f->text_im->height,
+ f->text_im->bytes_per_line);
+
+ }
+ f->x_mult=4;
+ f->y_mult=2;
+}
+
+int
+analogtv_font_pixel(analogtv_font *f, int c, int x, int y)
+{
+ if (x<0 || x>=f->char_w) return 0;
+ if (y<0 || y>=f->char_h) return 0;
+ if (c<0 || c>=256) return 0;
+ return XGetPixel(f->text_im, c*f->char_w + x, y) ? 1 : 0;
+}
+
+void
+analogtv_font_set_pixel(analogtv_font *f, int c, int x, int y, int value)
+{
+ if (x<0 || x>=f->char_w) return;
+ if (y<0 || y>=f->char_h) return;
+ if (c<0 || c>=256) return;
+
+ XPutPixel(f->text_im, c*f->char_w + x, y, value);
+}
+
+void
+analogtv_font_set_char(analogtv_font *f, int c, char *s)
+{
+ int value,x,y;
+
+ if (c<0 || c>=256) return;
+
+ for (y=0; y<f->char_h; y++) {
+ for (x=0; x<f->char_w; x++) {
+ if (!*s) return;
+ value=(*s==' ') ? 0 : 1;
+ analogtv_font_set_pixel(f, c, x, y, value);
+ s++;
+ }
+ }
+}
+
+void
+analogtv_lcp_to_ntsc(double luma, double chroma, double phase, int ntsc[4])
+{
+ int i;
+ for (i=0; i<4; i++) {
+ double w=90.0*i + phase;
+ double val=luma + chroma * (cos(3.1415926/180.0*w));
+ if (val<0.0) val=0.0;
+ if (val>127.0) val=127.0;
+ ntsc[i]=(int)val;
+ }
+}
+
+void
+analogtv_draw_solid(analogtv_input *input,
+ int left, int right, int top, int bot,
+ int ntsc[4])
+{
+ int x,y;
+
+ if (right-left<4) right=left+4;
+ if (bot-top<1) bot=top+1;
+
+ for (y=top; y<bot; y++) {
+ for (x=left; x<right; x++) {
+ input->signal[y][x] = ntsc[x&3];
+ }
+ }
+}
+
+
+void
+analogtv_draw_solid_rel_lcp(analogtv_input *input,
+ double left, double right, double top, double bot,
+ double luma, double chroma, double phase)
+{
+ int ntsc[4];
+
+ int topi=(int)(ANALOGTV_TOP + ANALOGTV_VISLINES*top);
+ int boti=(int)(ANALOGTV_TOP + ANALOGTV_VISLINES*bot);
+ int lefti=(int)(ANALOGTV_VIS_START + ANALOGTV_VIS_LEN*left);
+ int righti=(int)(ANALOGTV_VIS_START + ANALOGTV_VIS_LEN*right);
+
+ analogtv_lcp_to_ntsc(luma, chroma, phase, ntsc);
+ analogtv_draw_solid(input, lefti, righti, topi, boti, ntsc);
+}
+
+
+void
+analogtv_draw_char(analogtv_input *input, analogtv_font *f,
+ int c, int x, int y, int ntsc[4])
+{
+ int yc,xc,ys,xs,pix;
+
+ for (yc=0; yc<f->char_h; yc++) {
+ for (ys=y + yc*f->y_mult; ys<y + (yc+1)*f->y_mult; ys++) {
+ if (ys<0 || ys>=ANALOGTV_V) continue;
+
+ for (xc=0; xc<f->char_w; xc++) {
+ pix=analogtv_font_pixel(f, c, xc, yc);
+
+ for (xs=x + xc*f->x_mult; xs<x + (xc+1)*f->x_mult; xs++) {
+ if (xs<0 || xs>=ANALOGTV_H) continue;
+ if (pix) {
+ input->signal[ys][xs] = ntsc[xs&3];
+ }
+ }
+ }
+ }
+ }
+}
+
+void
+analogtv_draw_string(analogtv_input *input, analogtv_font *f,
+ char *s, int x, int y, int ntsc[4])
+{
+ while (*s) {
+ analogtv_draw_char(input, f, *s, x, y, ntsc);
+ x += f->char_w * 4;
+ s++;
+ }
+}
+
+void
+analogtv_draw_string_centered(analogtv_input *input, analogtv_font *f,
+ char *s, int x, int y, int ntsc[4])
+{
+ int width=strlen(s) * f->char_w * 4;
+ x -= width/2;
+
+ analogtv_draw_string(input, f, s, x, y, ntsc);
+}
diff --git a/hacks/analogtv.h b/hacks/analogtv.h
new file mode 100644
index 0000000..e3170f1
--- /dev/null
+++ b/hacks/analogtv.h
@@ -0,0 +1,338 @@
+/* analogtv, Copyright (c) 2003-2018 Trevor Blackwell <tlb@tlb.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef _XSCREENSAVER_ANALOGTV_H
+#define _XSCREENSAVER_ANALOGTV_H
+
+#include "thread_util.h"
+#include "xshm.h"
+
+#if defined(USE_IPHONE) || defined(HAVE_ANDROID)
+# define HAVE_MOBILE
+#endif
+
+/*
+ You'll need these to generate standard NTSC TV signals
+ */
+enum {
+ /* We don't handle interlace here */
+ ANALOGTV_V=262,
+ ANALOGTV_TOP=30,
+ ANALOGTV_VISLINES=200,
+ ANALOGTV_BOT=ANALOGTV_TOP + ANALOGTV_VISLINES,
+
+ /* This really defines our sampling rate, 4x the colorburst
+ frequency. Handily equal to the Apple II's dot clock.
+ You could also make a case for using 3x the colorburst freq,
+ but 4x isn't hard to deal with. */
+ ANALOGTV_H=912,
+
+ /* Each line is 63500 nS long. The sync pulse is 4700 nS long, etc.
+ Define sync, back porch, colorburst, picture, and front porch
+ positions */
+ ANALOGTV_SYNC_START=0,
+ ANALOGTV_BP_START=4700*ANALOGTV_H/63500,
+ ANALOGTV_CB_START=5800*ANALOGTV_H/63500,
+ /* signal[row][ANALOGTV_PIC_START] is the first displayed pixel */
+ ANALOGTV_PIC_START=9400*ANALOGTV_H/63500,
+ ANALOGTV_PIC_LEN=52600*ANALOGTV_H/63500,
+ ANALOGTV_FP_START=62000*ANALOGTV_H/63500,
+ ANALOGTV_PIC_END=ANALOGTV_FP_START,
+
+ /* TVs scan past the edges of the picture tube, so normally you only
+ want to use about the middle 3/4 of the nominal scan line.
+ */
+ ANALOGTV_VIS_START=ANALOGTV_PIC_START + (ANALOGTV_PIC_LEN*1/8),
+ ANALOGTV_VIS_END=ANALOGTV_PIC_START + (ANALOGTV_PIC_LEN*7/8),
+ ANALOGTV_VIS_LEN=ANALOGTV_VIS_END-ANALOGTV_VIS_START,
+
+ ANALOGTV_HASHNOISE_LEN=6,
+
+ ANALOGTV_GHOSTFIR_LEN=4,
+
+ /* analogtv.signal is in IRE units, as defined below: */
+ ANALOGTV_WHITE_LEVEL=100,
+ ANALOGTV_GRAY50_LEVEL=55,
+ ANALOGTV_GRAY30_LEVEL=35,
+ ANALOGTV_BLACK_LEVEL=10,
+ ANALOGTV_BLANK_LEVEL=0,
+ ANALOGTV_SYNC_LEVEL=-40,
+ ANALOGTV_CB_LEVEL=20,
+
+ ANALOGTV_SIGNAL_LEN=ANALOGTV_V*ANALOGTV_H,
+
+ /* The number of intensity levels we deal with for gamma correction &c */
+ ANALOGTV_CV_MAX=1024,
+
+ /* MAX_LINEHEIGHT corresponds to 2400 vertical pixels, beyond which
+ it interpolates extra black lines. */
+ ANALOGTV_MAX_LINEHEIGHT=12
+
+};
+
+typedef struct analogtv_input_s {
+ signed char signal[ANALOGTV_V+1][ANALOGTV_H];
+
+ int do_teletext;
+
+ /* for client use */
+ void (*updater)(struct analogtv_input_s *inp);
+ void *client_data;
+ double next_update_time;
+
+} analogtv_input;
+
+typedef struct analogtv_font_s {
+ XImage *text_im;
+ int char_w, char_h;
+ int x_mult, y_mult;
+} analogtv_font;
+
+typedef struct analogtv_reception_s {
+
+ analogtv_input *input;
+ double ofs;
+ double level;
+ double multipath;
+ double freqerr;
+
+ double ghostfir[ANALOGTV_GHOSTFIR_LEN];
+ double ghostfir2[ANALOGTV_GHOSTFIR_LEN];
+
+ double hfloss;
+ double hfloss2;
+
+} analogtv_reception;
+
+/*
+ The rest of this should be considered mostly opaque to the analogtv module.
+ */
+
+struct analogtv_yiq_s {
+ float y,i,q;
+} /*yiq[ANALOGTV_PIC_LEN+10] */;
+
+typedef struct analogtv_s {
+
+ Display *dpy;
+ Window window;
+ Screen *screen;
+ XWindowAttributes xgwa;
+
+ struct threadpool threads;
+
+#if 0
+ unsigned int onscreen_signature[ANALOGTV_V];
+#endif
+
+ int n_colors;
+
+ int interlace;
+ int interlace_counter;
+
+ float agclevel;
+
+ /* If you change these, call analogtv_set_demod */
+ float tint_control,color_control,brightness_control,contrast_control;
+ float height_control, width_control, squish_control;
+ float horiz_desync;
+ float squeezebottom;
+ float powerup;
+
+ /* internal cache */
+ int blur_mult;
+
+ /* For fast display, set fakeit_top, fakeit_bot to
+ the scanlines (0..ANALOGTV_V) that can be preserved on screen.
+ fakeit_scroll is the number of scan lines to scroll it up,
+ or 0 to not scroll at all. It will DTRT if asked to scroll from
+ an offscreen region.
+ */
+ int fakeit_top;
+ int fakeit_bot;
+ int fakeit_scroll;
+ int redraw_all;
+
+ int use_cmap,use_color;
+ int bilevel_signal;
+
+ XShmSegmentInfo shm_info;
+ int visdepth,visclass,visbits;
+ int red_invprec, red_shift;
+ int green_invprec, green_shift;
+ int blue_invprec, blue_shift;
+ unsigned long red_mask, green_mask, blue_mask;
+
+ Colormap colormap;
+ int usewidth,useheight,xrepl,subwidth;
+ XImage *image; /* usewidth * useheight */
+ GC gc;
+ int screen_xo,screen_yo; /* centers image in window */
+
+ int flutter_horiz_desync;
+ int flutter_tint;
+
+ struct timeval last_display_time;
+ int need_clear;
+
+
+ /* Add hash (in the radio sense, not the programming sense.) These
+ are the small white streaks that appear in quasi-regular patterns
+ all over the screen when someone is running the vacuum cleaner or
+ the blender. We also set shrinkpulse for one period which
+ squishes the image horizontally to simulate the temporary line
+ voltate drop when someone turns on a big motor */
+ double hashnoise_rpm;
+ int hashnoise_counter;
+ int hashnoise_times[ANALOGTV_V];
+ int hashnoise_signal[ANALOGTV_V];
+ int hashnoise_on;
+ int hashnoise_enable;
+ int shrinkpulse;
+
+ float crtload[ANALOGTV_V];
+
+ unsigned int red_values[ANALOGTV_CV_MAX];
+ unsigned int green_values[ANALOGTV_CV_MAX];
+ unsigned int blue_values[ANALOGTV_CV_MAX];
+
+ unsigned long colors[256];
+ int cmap_y_levels;
+ int cmap_i_levels;
+ int cmap_q_levels;
+
+ float tint_i, tint_q;
+
+ int cur_hsync;
+ int line_hsync[ANALOGTV_V];
+ int cur_vsync;
+ double cb_phase[4];
+ double line_cb_phase[ANALOGTV_V][4];
+
+ int channel_change_cycles;
+ double rx_signal_level;
+ float *rx_signal;
+
+ struct {
+ int index;
+ double value;
+ } leveltable[ANALOGTV_MAX_LINEHEIGHT+1][ANALOGTV_MAX_LINEHEIGHT+1];
+
+ /* Only valid during draw. */
+ unsigned random0, random1;
+ double noiselevel;
+ const analogtv_reception *const *recs;
+ unsigned rec_count;
+
+ float *signal_subtotals;
+
+ float puheight;
+} analogtv;
+
+
+analogtv *analogtv_allocate(Display *dpy, Window window);
+analogtv_input *analogtv_input_allocate(void);
+
+/* call if window size changes */
+void analogtv_reconfigure(analogtv *it);
+
+void analogtv_set_defaults(analogtv *it, char *prefix);
+void analogtv_release(analogtv *it);
+int analogtv_set_demod(analogtv *it);
+void analogtv_setup_frame(analogtv *it);
+void analogtv_setup_sync(analogtv_input *input, int do_cb, int do_ssavi);
+void analogtv_draw(analogtv *it, double noiselevel,
+ const analogtv_reception *const *recs, unsigned rec_count);
+
+int analogtv_load_ximage(analogtv *it, analogtv_input *input,
+ XImage *pic_im, XImage *mask_im,
+ int xoff, int yoff, int width, int height);
+
+void analogtv_reception_update(analogtv_reception *inp);
+
+void analogtv_setup_teletext(analogtv_input *input);
+
+
+/* Functions for rendering content into an analogtv_input */
+
+void analogtv_make_font(Display *dpy, Window window,
+ analogtv_font *f, int w, int h, char *fontname);
+int analogtv_font_pixel(analogtv_font *f, int c, int x, int y);
+void analogtv_font_set_pixel(analogtv_font *f, int c, int x, int y, int value);
+void analogtv_font_set_char(analogtv_font *f, int c, char *s);
+void analogtv_lcp_to_ntsc(double luma, double chroma, double phase,
+ int ntsc[4]);
+
+
+void analogtv_draw_solid(analogtv_input *input,
+ int left, int right, int top, int bot,
+ int ntsc[4]);
+
+void analogtv_draw_solid_rel_lcp(analogtv_input *input,
+ double left, double right,
+ double top, double bot,
+ double luma, double chroma, double phase);
+
+void analogtv_draw_char(analogtv_input *input, analogtv_font *f,
+ int c, int x, int y, int ntsc[4]);
+void analogtv_draw_string(analogtv_input *input, analogtv_font *f,
+ char *s, int x, int y, int ntsc[4]);
+void analogtv_draw_string_centered(analogtv_input *input, analogtv_font *f,
+ char *s, int x, int y, int ntsc[4]);
+
+int analogtv_handle_events (analogtv *it);
+
+#ifdef HAVE_XSHM_EXTENSION
+#define ANALOGTV_DEFAULTS_SHM "*useSHM: True",
+#else
+#define ANALOGTV_DEFAULTS_SHM
+#endif
+
+#ifndef HAVE_MOBILE
+# define ANALOGTV_DEF_BRIGHTNESS "2"
+# define ANALOGTV_DEF_CONTRAST "150"
+#else
+ /* Need to really crank this up for it to look good on the iPhone screen. */
+# define ANALOGTV_DEF_BRIGHTNESS "3"
+# define ANALOGTV_DEF_CONTRAST "400"
+#endif
+
+/* Brightness: useful range is around -75 to 100.
+ Contrast: useful range is around 0 - 500.
+ Color: useful range is around +/- 500.
+ Tint: range is mod 360.
+
+ The values in the 'analogtv' struct are the resource divided by 100.0,
+ except for tint, which is exact.
+ */
+
+#define ANALOGTV_DEFAULTS \
+ "*TVColor: 70", \
+ "*TVTint: 5", \
+ "*TVBrightness: " ANALOGTV_DEF_BRIGHTNESS, \
+ "*TVContrast: " ANALOGTV_DEF_CONTRAST, \
+ "*Background: Black", \
+ "*use_cmap: 0", \
+ "*geometry: 800x600", \
+ "*fpsSolid: True", \
+ "*lowrez: True", \
+ THREAD_DEFAULTS \
+ ANALOGTV_DEFAULTS_SHM
+
+#define ANALOGTV_OPTIONS \
+ THREAD_OPTIONS \
+ { "-use-cmap", ".use_cmap", XrmoptionSepArg, 0 }, \
+ { "-tv-color", ".TVColor", XrmoptionSepArg, 0 }, \
+ { "-tv-tint", ".TVTint", XrmoptionSepArg, 0 }, \
+ { "-tv-brightness", ".TVBrightness", XrmoptionSepArg, 0 }, \
+ { "-tv-contrast", ".TVContrast", XrmoptionSepArg, 0 },
+
+#endif /* _XSCREENSAVER_ANALOGTV_H */
diff --git a/hacks/anemone.c b/hacks/anemone.c
new file mode 100644
index 0000000..deedb27
--- /dev/null
+++ b/hacks/anemone.c
@@ -0,0 +1,448 @@
+/* anemone, Copyright (c) 2001 Gabriel Finch
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/*------------------------------------------------------------------------
+ |
+ | FILE anemone.c
+ | MODULE OF xscreensaver
+ |
+ | DESCRIPTION Anemone.
+ |
+ | WRITTEN BY Gabriel Finch
+ |
+ |
+ |
+ | MODIFICATIONS june 2001 started
+ |
+ +----------------------------------------------------------------------*/
+
+
+#include <math.h>
+#include "screenhack.h"
+
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+#include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+
+/*-----------------------------------------------------------------------+
+ | PRIVATE DATA |
+ +-----------------------------------------------------------------------*/
+
+
+#define TWO_PI (2.0 * M_PI)
+#define RND(x) (random() % (x))
+#define MAXPEND 2000
+#define MAXPTS 200
+#define TRUE 1
+#define FALSE 0
+
+
+typedef struct {
+ double x,y,z;
+ int sx,sy,sz;
+} vPend;
+
+typedef struct {
+ long col;
+ int numpt;
+ int growth;
+ unsigned short rate;
+} appDef;
+
+struct state {
+ Display *dpy;
+ Pixmap b, ba, bb;
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ XdbeBackBuffer backb;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ int arms; /* number of arms */
+ int finpoints; /* final number of points in each array. */
+ long delay; /* usecs to wait between updates. */
+
+ int scrWidth, scrHeight;
+ GC gcDraw, gcClear;
+
+ Bool dbuf;
+ int width;
+
+ vPend *vPendage; /* 3D representation of appendages */
+ appDef *appD; /* defaults */
+ vPend *vCurr, *vNext;
+ appDef *aCurr;
+
+ double turn, turndelta;
+
+ int mx, my; /* max screen coordinates. */
+ int withdraw;
+
+ XGCValues gcv;
+ Colormap cmap;
+ XColor *colors;
+ int ncolors;
+};
+
+
+
+/*-----------------------------------------------------------------------+
+ | PUBLIC DATA |
+ +-----------------------------------------------------------------------*/
+
+
+
+/*-----------------------------------------------------------------------+
+ | PRIVATE FUNCTIONS |
+ +-----------------------------------------------------------------------*/
+
+static void *
+xmalloc(size_t size)
+{
+ void *ret;
+
+ if ((ret = malloc(size)) == NULL) {
+ fprintf(stderr, "anemone: out of memory\n");
+ exit(1);
+ }
+ return ret;
+}
+
+
+static void
+initAppendages(struct state *st)
+{
+ int i;
+ /*int marginx, marginy; */
+
+ /*double scalex, scaley;*/
+
+ double x,y,z,dist;
+
+ st->mx = st->scrWidth - 1;
+ st->my = st->scrHeight - 1;
+
+ /* each appendage will have: colour,
+ number of points, and a grow or shrink indicator */
+
+ /* added: growth rate 1-10 (smaller==faster growth) */
+ /* each appendage needs virtual coords (x,y,z) with y and z combining to
+ give the screen y */
+
+ st->vPendage = (vPend *) xmalloc((st->finpoints + 1) * sizeof(vPend) * st->arms);
+ st->appD = (appDef *) xmalloc(sizeof(appDef) * st->arms);
+
+
+ for (i = 0; i < st->arms; i++) {
+ st->aCurr = st->appD + i;
+ st->vCurr = st->vPendage + (st->finpoints + 1) * i;
+ st->vNext = st->vCurr + 1;
+
+ st->aCurr->col = st->colors[random() % st->ncolors].pixel;
+ st->aCurr->numpt = 1;
+ st->aCurr->growth = st->finpoints / 2 + RND(st->finpoints / 2);
+ st->aCurr->rate = RND(11) * RND(11);
+
+ do {
+ x = (1 - RND(1001) / 500);
+ y = (1 - RND(1001) / 500);
+ z = (1 - RND(1001) / 500);
+ dist = x * x + y * y + z * z;
+ } while (dist >= 1.);
+
+ st->vCurr->x = x * 200;
+ st->vCurr->y = st->my / 2 + y * 200;
+ st->vCurr->z = 0 + z * 200;
+
+ /* start the arm going outwards */
+ st->vCurr->sx = st->vCurr->x / 5;
+ st->vCurr->sy = (st->vCurr->y - st->my / 2) / 5;
+ st->vCurr->sz = (st->vCurr->z) / 5;
+
+
+ st->vNext->x = st->vCurr->x + st->vCurr->sx;
+ st->vNext->y = st->vCurr->y + st->vCurr->sy;
+ st->vNext->z = st->vCurr->z + st->vCurr->sz;
+ }
+}
+
+static void *
+anemone_init (Display *disp, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XWindowAttributes wa;
+
+ st->dpy = disp;
+ st->turn = 0.;
+
+ st->width = get_integer_resource(st->dpy, "width", "Integer");
+ st->arms = get_integer_resource(st->dpy, "arms", "Integer");
+ st->finpoints = get_integer_resource(st->dpy, "finpoints", "Integer");
+ st->delay = get_integer_resource(st->dpy, "delay", "Integer");
+ st->withdraw = get_integer_resource(st->dpy, "withdraw", "Integer");
+ st->turndelta = get_float_resource(st->dpy, "turnspeed", "float") / 100000;
+
+ st->dbuf = TRUE;
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ st->dbuf = False;
+# endif
+
+ st->b = st->ba = st->bb = 0; /* double-buffer to reduce flicker */
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ st->b = st->backb = xdbe_get_backbuffer (st->dpy, window, XdbeUndefined);
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+
+ XGetWindowAttributes(st->dpy, window, &wa);
+ st->scrWidth = wa.width;
+ st->scrHeight = wa.height;
+ st->cmap = wa.colormap;
+
+ st->ncolors = get_integer_resource (st->dpy, "colors", "Colors");
+ st->ncolors += 3;
+ st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
+ make_smooth_colormap (wa.screen, wa.visual, st->cmap,
+ st->colors, &st->ncolors,
+ True, 0, True);
+
+ st->gcDraw = XCreateGC(st->dpy, window, 0, &st->gcv);
+ st->gcv.foreground = get_pixel_resource(st->dpy, st->cmap,
+ "background", "Background");
+ st->gcClear = XCreateGC(st->dpy, window, GCForeground, &st->gcv);
+
+ if (st->dbuf) {
+ if (!st->b)
+ {
+ st->ba = XCreatePixmap (st->dpy, window, st->scrWidth, st->scrHeight, wa.depth);
+ st->bb = XCreatePixmap (st->dpy, window, st->scrWidth, st->scrHeight, wa.depth);
+ st->b = st->ba;
+ }
+ }
+ else
+ {
+ st->b = window;
+ }
+
+ if (st->ba) XFillRectangle (st->dpy, st->ba, st->gcClear, 0, 0, st->scrWidth, st->scrHeight);
+ if (st->bb) XFillRectangle (st->dpy, st->bb, st->gcClear, 0, 0, st->scrWidth, st->scrHeight);
+
+ XClearWindow(st->dpy, window);
+ XSetLineAttributes(st->dpy, st->gcDraw, st->width, LineSolid, CapRound, JoinBevel);
+
+ initAppendages(st);
+
+ return st;
+}
+
+
+static void
+createPoints(struct state *st)
+{
+ int i;
+ int withdrawall = RND(st->withdraw);
+
+ for (i = 0; i< st->arms; i++) {
+ st->aCurr = st->appD + i;
+ if (!withdrawall) {
+ st->aCurr->growth = -st->finpoints;
+ st->turndelta = -st->turndelta;
+ }
+
+ else if (withdrawall<11) st->aCurr->growth = -st->aCurr->numpt;
+
+ else if (RND(100)<st->aCurr->rate) {
+ if (st->aCurr->growth>0) {
+ if (!(--st->aCurr->growth)) st->aCurr->growth = -RND(st->finpoints) - 1;
+ st->vCurr = st->vPendage + (st->finpoints + 1) * i + st->aCurr->numpt - 1;
+ if (st->aCurr->numpt<st->finpoints - 1) {
+ /* add a piece */
+ st->vNext = st->vCurr + 1;
+ st->aCurr->numpt++;
+ st->vNext->sx = st->vCurr->sx + RND(3) - 1;
+ st->vNext->sy = st->vCurr->sy + RND(3) - 1;
+ st->vNext->sz = st->vCurr->sz + RND(3) - 1;
+ st->vCurr = st->vNext + 1;
+ st->vCurr->x = st->vNext->x + st->vNext->sx;
+ st->vCurr->y = st->vNext->y + st->vNext->sy;
+ st->vCurr->z = st->vNext->z + st->vNext->sz;
+ }
+ }
+ }
+ }
+}
+
+
+static void
+drawImage(struct state *st, Drawable curr_window, double sint, double cost)
+{
+ int q,numpt,mx2 = st->mx / 2;
+ double cx,cy,cz,nx = 0,ny = 0,nz = 0;
+
+ if ((numpt = st->aCurr->numpt)==1) return;
+ XSetForeground(st->dpy, st->gcDraw, st->aCurr->col);
+
+ st->vNext = st->vCurr + 1;
+
+ cx = st->vCurr->x;
+ cy = st->vCurr->y;
+ cz = st->vCurr->z;
+
+
+ for (q = 0; q < numpt - 1; q++) {
+ nx = st->vNext->x + 2 - RND(5);
+ ny = st->vNext->y + 2 - RND(5);
+ nz = st->vNext->z + 2 - RND(5);
+
+ XDrawLine(st->dpy, curr_window, st->gcDraw,
+ mx2 + cx * cost - cz * sint, cy,
+ mx2 + nx * cost - nz * sint, ny);
+ st->vCurr++;
+ st->vNext++;
+
+ cx = nx;
+ cy = ny;
+ cz = nz;
+ }
+ XSetLineAttributes(st->dpy, st->gcDraw, st->width * 3,
+ LineSolid, CapRound, JoinBevel);
+ XDrawLine(st->dpy, curr_window, st->gcDraw,
+ st->mx / 2 + cx * cost - cz * sint, cy,
+ st->mx / 2 + nx * cost - nz * sint, ny);
+ XSetLineAttributes(st->dpy, st->gcDraw, st->width,
+ LineSolid, CapRound, JoinBevel);
+
+}
+
+static void
+animateAnemone(struct state *st, Drawable curr_window)
+{
+ int i;
+ double sint = sin(st->turn),cost = cos(st->turn);
+
+ st->aCurr = st->appD;
+ for (i = 0; i< st->arms; i++) {
+ st->vCurr = st->vPendage + (st->finpoints + 1) * i;
+ if (RND(25)<st->aCurr->rate) {
+ if (st->aCurr->growth<0) {
+ st->aCurr->numpt -= st->aCurr->numpt>1;
+ if (!(++st->aCurr->growth)) st->aCurr->growth = RND(st->finpoints - st->aCurr->numpt) + 1;
+ }
+ }
+ drawImage(st, curr_window, sint, cost);
+ st->turn += st->turndelta;
+ st->aCurr++;
+ }
+ createPoints(st);
+
+ if (st->turn >= TWO_PI) st->turn -= TWO_PI;
+}
+
+static unsigned long
+anemone_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ XFillRectangle (st->dpy, st->b, st->gcClear, 0, 0, st->scrWidth, st->scrHeight);
+
+ animateAnemone(st, st->b);
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (st->backb)
+ {
+ XdbeSwapInfo info[1];
+ info[0].swap_window = window;
+ info[0].swap_action = XdbeUndefined;
+ XdbeSwapBuffers (st->dpy, info, 1);
+ }
+ else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ if (st->dbuf)
+ {
+ XCopyArea (st->dpy, st->b, window, st->gcClear, 0, 0,
+ st->scrWidth, st->scrHeight, 0, 0);
+ st->b = (st->b == st->ba ? st->bb : st->ba);
+ }
+
+ return st->delay;
+}
+
+
+static void
+anemone_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->scrWidth = w;
+ st->scrHeight = h;
+#if 0
+ if (st->dbuf) {
+ XWindowAttributes wa;
+ XGetWindowAttributes(dpy, window, &wa);
+ if (st->ba) XFreePixmap (dpy, st->ba);
+ if (st->bb) XFreePixmap (dpy, st->bb);
+ st->ba = XCreatePixmap (dpy, window, st->scrWidth, st->scrHeight, wa.depth);
+ st->bb = XCreatePixmap (dpy, window, st->scrWidth, st->scrHeight, wa.depth);
+ st->b = st->ba;
+ }
+#endif
+}
+
+static Bool
+anemone_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+anemone_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ if (st->vPendage) free (st->vPendage);
+ if (st->appD) free (st->appD);
+ free (st);
+}
+
+
+
+static const char *anemone_defaults [] = {
+ ".background: black",
+ "*arms: 128",
+ "*width: 2",
+ "*finpoints: 64",
+ "*delay: 40000",
+ "*withdraw: 1200",
+ "*turnspeed: 50",
+ "*colors: 20",
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ "*useDBE: True",
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+
+static XrmOptionDescRec anemone_options [] = {
+ { "-arms", ".arms", XrmoptionSepArg, 0 },
+ { "-finpoints", ".finpoints", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-width", ".width", XrmoptionSepArg, 0 },
+ { "-withdraw", ".withdraw", XrmoptionSepArg, 0 },
+ { "-turnspeed", ".turnspeed", XrmoptionSepArg, 0 },
+ { "-colors", ".colors", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("Anemone", anemone)
diff --git a/hacks/anemone.man b/hacks/anemone.man
new file mode 100644
index 0000000..463a999
--- /dev/null
+++ b/hacks/anemone.man
@@ -0,0 +1,74 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+anemone - wiggling tentacles.
+.SH SYNOPSIS
+.B anemone
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-arms \fInumber\fP]
+[\-finpoints \fInumber\fP]
+[\-width \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Wiggling tentacles.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 40000 (0.04 seconds.).
+.TP 8
+.B \-arms \fInumber\fP
+Arms. 2 - 500. Default: 128.
+.TP 8
+.B \-finpoints \fInumber\fP
+Tentacles. 3 - 200. Default: 64.
+.TP 8
+.B \-withdraw \fInumber\fP
+Frequency that the arms withdraw. Arms withdraw on randomly generated
+values between 1 and 11; this value determines the maximum value of
+that range. So 100 spends a lot of time withdrawn, while 1000,000 tends
+not to withdraw at all. Default: 1200.
+.TP 8
+.B \-turnspeed \fInumber\fP
+How fast it turns. At zero, not at all, all they way up to thousands
+which are very fast indeed. Default: 50.
+.TP 8
+.B \-width \fInumber\fP
+Thickness. 1 - 10. Default: 2.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Gabriel Finch. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Gabriel Finch.
diff --git a/hacks/anemotaxis.c b/hacks/anemotaxis.c
new file mode 100644
index 0000000..9f240e8
--- /dev/null
+++ b/hacks/anemotaxis.c
@@ -0,0 +1,755 @@
+/* anemotaxis, Copyright (c) 2004 Eugene Balkovski
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation. No representations are made
+ * about the suitability of this software for any purpose. It is
+ * provided "as is" without express or implied warranty.
+ */
+
+/*------------------------------------------------------------------------
+ |
+ | FILE anemotaxis.c
+ |
+ | DESCRIPTION Anemotaxis
+ |
+ | This code illustrates an optimal algorithm designed
+ | for searching a source of particles on a plane.
+ | The particles drift in one direction and walk randomly
+ | in the other. The only information available to the
+ | searcher is the presence of a particle at its location
+ | and the local direction from where particle arrived.
+ | The algorithm "explains" the behavior
+ | of some animals and insects
+ | who use olfactory and directional cues to find
+ | sources of odor (mates, food, home etc) in
+ | turbulent atmosphere (odor-modulated anemotaxis),
+ | e.g. male moths locating females who release
+ | pheromones to attract males. The search trajectories
+ | resemble the trajectories that the animals follow.
+ |
+ |
+ | WRITTEN BY Eugene Balkovski
+ |
+ | MODIFICATIONS june 2004 started
+ |
+ +----------------------------------------------------------------------*/
+
+/*
+ Options:
+
+ -distance <arg> size of the lattice
+ -sources <arg> number of sources
+ -searhers <arg> number of searcher */
+
+
+#include "screenhack.h"
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+#include "xdbe.h"
+#endif
+
+
+/*-----------------------------------------------------------------------+
+ | PRIVATE DATA |
+ +-----------------------------------------------------------------------*/
+
+#define MAX_DIST 250
+#define MIN_DIST 10
+#define LINE_WIDTH 4
+#define MAX_INV_RATE 5
+
+#define RND(x) (random() % (x))
+#define X(x) ((int) (st->ax * (x) + st->bx))
+#define Y(x) ((int) (st->ay * (x) + st->by))
+
+typedef struct {
+ short x;
+ short y;
+} Point;
+
+typedef struct {
+
+ short y; /* y-coordinate of the particle (relative to the source) */
+
+ short v; /* velocity of the particle. Allowed values are -1, 0, 1.
+ 2 means the particle is not valid */
+} YV;
+
+typedef struct {
+
+ int n; /* size of array xv */
+
+ YV *yv; /* yv[i] keeps velocity and y-coordinate of the
+ particle at (i + 1, yv[i].y) relative to the
+ source */
+
+ int inv_rate; /* Inverse rate of particle emission (if 0 then
+ source doesn't emit new particles (although
+ old ones can still exist )*/
+
+ Point r; /* Position of the source */
+
+ long color;
+
+} Source;
+
+
+typedef struct PList {
+ Point r;
+ struct PList *next;
+} PList;
+
+typedef enum {UP_LEFT, UP_RIGHT, LEFT, RIGHT, DONE} State_t;
+
+typedef struct {
+
+ Point r; /* Current position */
+
+ Point vertex; /* Position of the vertex of the most recent
+ cone, which is the region where the source
+ is located. We do exhaustive search in the
+ cone until we encounter a new particle,
+ which gives us a new cone. */
+
+ State_t state; /* Internal state variable */
+
+ unsigned char c; /* Concentration at r */
+
+ short v; /* Velocity at r (good only when c != 0) */
+
+ PList *hist; /* Trajectory */
+
+ int rs; /* small shift of x-coordinate to avoid
+ painting over the same x */
+
+ long color;
+
+} Searcher;
+
+struct state {
+ Source **source;
+ Searcher **searcher;
+
+ int max_dist, max_src, max_searcher;
+
+ double ax, ay, bx, by;
+ int dx, dy;
+
+ Display *dpy;
+ Window window;
+
+ Pixmap b, ba, bb;
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ XdbeBackBuffer backb;
+#endif
+
+ long delay; /* usecs to wait between updates. */
+
+ int scrWidth, scrHeight;
+ GC gcDraw, gcClear;
+
+ Bool dbuf;
+
+ XGCValues gcv;
+ Colormap cmap;
+ XColor *colors;
+ int ncolors;
+};
+
+/*-----------------------------------------------------------------------+
+ | PUBLIC DATA |
+ +-----------------------------------------------------------------------*/
+
+
+
+/*-----------------------------------------------------------------------+
+ | PRIVATE FUNCTIONS |
+ +-----------------------------------------------------------------------*/
+
+static void *emalloc(size_t size)
+{
+ void *ret = malloc(size);
+
+ if (ret == NULL) {
+ fprintf(stderr, "out of memory\n");
+ exit(1);
+ }
+ return ret;
+}
+
+static Searcher *new_searcher(struct state *st)
+{
+ Searcher *m = (Searcher *) emalloc(sizeof(Searcher));
+
+ m->r.x = m->vertex.x = st->max_dist;
+
+ do {
+ m->r.y = RND(2 * st->max_dist);
+ } while(m->r.y < MIN_DIST || m->r.y > 2 * st->max_dist - MIN_DIST);
+
+ m->vertex.y = m->r.y;
+
+ m->state = (RND(2) == 0 ? UP_RIGHT : UP_LEFT);
+ m->hist = NULL;
+ m->color = st->colors[random() % st->ncolors].pixel;
+
+ m->rs = RND(st->dx);
+
+ return m;
+}
+
+static void destroy_searcher(Searcher *m)
+{
+ PList *p = m->hist, *q;
+
+ while(p != NULL) {
+ q = p->next;
+ free(p);
+ p = q;
+ }
+
+ free(m);
+}
+
+static void write_hist(Searcher *m)
+{
+ PList *l;
+
+ l = m->hist;
+ m->hist = (PList *) emalloc(sizeof(PList));
+ m->hist->next = l;
+ m->hist->r = m->r;
+
+}
+
+static void move_searcher(Searcher *m)
+{
+
+ if(m->c == True) {
+ write_hist(m);
+ m->r.x -= 1;
+ m->r.y -= m->v;
+ write_hist(m);
+ m->state = (RND(2) == 0 ? UP_LEFT : UP_RIGHT);
+ m->vertex = m->r;
+ return;
+
+ }
+
+ switch(m->state) {
+ case UP_LEFT:
+
+ m->r.x -= 1;
+ m->r.y += 1;
+ m->state = RIGHT;
+ write_hist(m);
+ return;
+
+ case RIGHT:
+
+ m->r.y -= 1;
+ if(m->vertex.x - m->r.x == m->vertex.y - m->r.y) {
+ write_hist(m);
+ m->state = UP_RIGHT;
+ }
+ return;
+
+ case UP_RIGHT:
+
+ m->r.x -= 1;
+ m->r.y -= 1;
+
+ m->state = LEFT;
+ write_hist(m);
+ return;
+
+ case LEFT:
+
+ m->r.y += 1;
+
+ if(m->vertex.x - m->r.x == m->r.y - m->vertex.y) {
+ write_hist(m);
+ m->state = UP_LEFT;
+ }
+ return;
+
+ default:
+ break;
+ }
+
+}
+
+static void evolve_source(Source *s)
+{
+
+ int i;
+
+ /* propagate existing particles */
+
+ for(i = s->n - 1; i > 0; i--) {
+
+ if(s->yv[i - 1].v == 2)
+ s->yv[i].v = 2;
+ else {
+ s->yv[i].v = RND(3) - 1;
+ s->yv[i].y = s->yv[i - 1].y + s->yv[i].v;
+ }
+
+ }
+
+
+ if(s->inv_rate > 0 && (RND(s->inv_rate) == 0)) /* emit a particle */
+ s->yv[0].y = s->yv[0].v = RND(3) - 1;
+ else
+ s->yv[0].v = 2;
+
+}
+
+static Source *new_source(struct state *st)
+{
+ int i;
+
+ Source *s = (Source *) emalloc(sizeof(Source));
+ if(st->max_searcher == 0) {
+ s->r.x = 0;
+ s->r.y = RND(2 * st->max_dist);
+ }
+ else {
+ s->r.x = RND(st->max_dist / 3);
+ do {
+ s->r.y = RND(2 * st->max_dist);
+ } while(s->r.y < MIN_DIST || s->r.y > 2 * st->max_dist - MIN_DIST);
+ }
+
+ s->n = st->max_dist - s->r.x;
+ s->yv = emalloc(sizeof(YV) * s->n);
+
+ for(i = 0; i < s->n; i++)
+ s->yv[i].v = 2;
+
+ s->inv_rate = RND(MAX_INV_RATE);
+
+ if(s->inv_rate == 0)
+ s->inv_rate = 1;
+
+ s->color = st->colors[random() % st->ncolors].pixel;
+
+ return s;
+}
+
+static void destroy_source(Source *s)
+{
+ free(s->yv);
+ free(s);
+}
+
+static void get_v(const Source *s, Searcher *m)
+{
+ int x = m->r.x - s->r.x - 1;
+
+ m->c = 0;
+
+ if(x < 0 || x >= s->n)
+ return;
+
+ if((s->yv[x].v == 2) || (s->yv[x].y != m->r.y - s->r.y))
+ return;
+
+ m->c = 1;
+ m->v = s->yv[x].v;
+ m->color = s->color;
+}
+
+
+static void *
+anemotaxis_init (Display *disp, Window win)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XWindowAttributes wa;
+
+ st->dpy = disp;
+ st->window = win;
+
+ XGetWindowAttributes(st->dpy, st->window, &wa);
+
+ st->ncolors = get_integer_resource (st->dpy, "colors", "Colors");
+ st->ncolors++;
+ st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
+ make_random_colormap (wa.screen, wa.visual, wa.colormap,
+ st->colors, &st->ncolors,
+ True, True, 0, True);
+
+ st->delay = get_integer_resource(st->dpy, "delay", "Integer");
+ st->max_dist = get_integer_resource(st->dpy, "distance", "Integer");
+
+ if(st->max_dist < MIN_DIST)
+ st->max_dist = MIN_DIST + 1;
+ if(st->max_dist > MAX_DIST)
+ st->max_dist = MAX_DIST;
+
+ st->max_src = get_integer_resource(st->dpy, "sources", "Integer");
+
+ if(st->max_src <= 0)
+ st->max_src = 1;
+
+ st->max_searcher = get_integer_resource(st->dpy, "searchers", "Integer");
+
+ if(st->max_searcher < 0)
+ st->max_searcher = 0;
+
+ st->dbuf = True;
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ st->dbuf = False;
+# endif
+
+ st->source = (Source **) emalloc(sizeof(Source *) * st->max_src);
+ memset(st->source, 0, st->max_src * sizeof(Source *));
+
+ st->source[0] = new_source(st);
+
+ st->searcher = (Searcher **) emalloc(st->max_searcher * sizeof(Searcher *));
+
+ memset(st->searcher, 0, st->max_searcher * sizeof(Searcher *));
+
+ st->b = st->ba = st->bb = 0; /* double-buffer to reduce flicker */
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ st->b = st->backb = xdbe_get_backbuffer (st->dpy, st->window, XdbeUndefined);
+#endif
+
+ st->scrWidth = wa.width;
+ st->scrHeight = wa.height;
+ st->cmap = wa.colormap;
+ st->gcDraw = XCreateGC(st->dpy, st->window, 0, &st->gcv);
+ st->gcv.foreground = get_pixel_resource(st->dpy, st->cmap,
+ "background", "Background");
+ st->gcClear = XCreateGC(st->dpy, st->window, GCForeground, &st->gcv);
+
+ if (st->dbuf) {
+ if (!st->b) {
+ st->ba = XCreatePixmap (st->dpy, st->window, st->scrWidth, st->scrHeight, wa.depth);
+ st->bb = XCreatePixmap (st->dpy, st->window, st->scrWidth, st->scrHeight, wa.depth);
+ st->b = st->ba;
+ }
+ }
+ else
+ st->b = st->window;
+
+
+ if (st->ba) XFillRectangle (st->dpy, st->ba, st->gcClear, 0, 0, st->scrWidth, st->scrHeight);
+ if (st->bb) XFillRectangle (st->dpy, st->bb, st->gcClear, 0, 0, st->scrWidth, st->scrHeight);
+
+ st->ax = st->scrWidth / (double) st->max_dist;
+ st->ay = st->scrHeight / (2. * st->max_dist);
+ st->bx = 0.;
+ st->by = 0.;
+
+ if((st->dx = st->scrWidth / (2 * st->max_dist)) == 0)
+ st->dx = 1;
+ if((st->dy = st->scrHeight / (4 * st->max_dist)) == 0)
+ st->dy = 1;
+ XSetLineAttributes(st->dpy, st->gcDraw, st->dx / 3 + 1, LineSolid, CapRound, JoinRound);
+ XClearWindow(st->dpy, st->window);
+
+ return st;
+}
+
+static void draw_searcher(struct state *st, Drawable curr_window, int i)
+{
+ Point r1, r2;
+ PList *l;
+
+ if(st->searcher[i] == NULL)
+ return;
+
+ XSetForeground(st->dpy, st->gcDraw, st->searcher[i]->color);
+
+ r1.x = X(st->searcher[i]->r.x) + st->searcher[i]->rs;
+ r1.y = Y(st->searcher[i]->r.y);
+
+ XFillRectangle(st->dpy, curr_window, st->gcDraw, r1.x - 2, r1.y - 2, 4, 4);
+
+ for(l = st->searcher[i]->hist; l != NULL; l = l->next) {
+
+ r2.x = X(l->r.x) + st->searcher[i]->rs;
+ r2.y = Y(l->r.y);
+
+ XDrawLine(st->dpy, curr_window, st->gcDraw, r1.x, r1.y, r2.x, r2.y);
+
+ r1 = r2;
+ }
+
+}
+
+static void draw_image(struct state *st, Drawable curr_window)
+{
+ int i, j;
+ int x, y;
+
+ for(i = 0; i < st->max_src; i++) {
+
+ if(st->source[i] == NULL)
+ continue;
+
+ XSetForeground(st->dpy, st->gcDraw, st->source[i]->color);
+
+ if(st->source[i]->inv_rate > 0) {
+
+ if(st->max_searcher > 0) {
+ x = (int) X(st->source[i]->r.x);
+ y = (int) Y(st->source[i]->r.y);
+ j = st->dx * (MAX_INV_RATE + 1 - st->source[i]->inv_rate) / (2 * MAX_INV_RATE);
+ if(j == 0)
+ j = 1;
+ XFillArc(st->dpy, curr_window, st->gcDraw, x - j, y - j, 2 * j, 2 * j, 0, 360 * 64);
+ }}
+
+ for(j = 0; j < st->source[i]->n; j++) {
+
+ int size = (st->scrWidth > 2560 ? 8 : 4); /* Retina displays */
+
+ if(st->source[i]->yv[j].v == 2)
+ continue;
+
+ /* Move the particles slightly off lattice */
+ x = X(st->source[i]->r.x + 1 + j) + RND(st->dx);
+ y = Y(st->source[i]->r.y + st->source[i]->yv[j].y) + RND(st->dy);
+ XFillArc(st->dpy, curr_window, st->gcDraw, x - size/2, y - size/2, size, size, 0, 360 * 64);
+ }
+
+ }
+
+ for(i = 0; i < st->max_searcher; i++)
+ draw_searcher(st, curr_window, i);
+
+}
+
+static void animate_anemotaxis(struct state *st, Drawable curr_window)
+{
+ int i, j;
+ Bool dead;
+
+ for(i = 0; i < st->max_src; i++) {
+
+ if(st->source[i] == NULL)
+ continue;
+
+ evolve_source(st->source[i]);
+
+ /* reap dead sources for which all particles are gone */
+ if(st->source[i]->inv_rate == 0) {
+
+ dead = True;
+
+ for(j = 0; j < st->source[i]->n; j++) {
+ if(st->source[i]->yv[j].v != 2) {
+ dead = False;
+ break;
+ }
+ }
+
+ if(dead == True) {
+ destroy_source(st->source[i]);
+ st->source[i] = NULL;
+ }
+ }
+ }
+
+ /* Decide if we want to add new sources */
+
+ for(i = 0; i < st->max_src; i++) {
+ if(st->source[i] == NULL && RND(st->max_dist * st->max_src) == 0)
+ st->source[i] = new_source(st);
+ }
+
+ if(st->max_searcher == 0) { /* kill some sources when searchers don't do that */
+ for(i = 0; i < st->max_src; i++) {
+ if(st->source[i] != NULL && RND(st->max_dist * st->max_src) == 0) {
+ destroy_source(st->source[i]);
+ st->source[i] = 0;
+ }
+ }
+ }
+
+ /* Now deal with searchers */
+
+ for(i = 0; i < st->max_searcher; i++) {
+
+ if((st->searcher[i] != NULL) && (st->searcher[i]->state == DONE)) {
+ destroy_searcher(st->searcher[i]);
+ st->searcher[i] = NULL;
+ }
+
+ if(st->searcher[i] == NULL) {
+
+ if(RND(st->max_dist * st->max_searcher) == 0) {
+
+ st->searcher[i] = new_searcher(st);
+
+ }
+ }
+
+ if(st->searcher[i] == NULL)
+ continue;
+
+ /* Check if searcher found a source or missed all of them */
+ for(j = 0; j < st->max_src; j++) {
+
+ if(st->source[j] == NULL || st->source[j]->inv_rate == 0)
+ continue;
+
+ if(st->searcher[i]->r.x < 0) {
+ st->searcher[i]->state = DONE;
+ break;
+ }
+
+ if((st->source[j]->r.y == st->searcher[i]->r.y) &&
+ (st->source[j]->r.x == st->searcher[i]->r.x)) {
+ st->searcher[i]->state = DONE;
+ st->source[j]->inv_rate = 0; /* source disappears */
+
+ /* Make it flash */
+ st->searcher[i]->color = WhitePixel(st->dpy, DefaultScreen(st->dpy));
+
+ break;
+ }
+ }
+
+ st->searcher[i]->c = 0; /* set it here in case we don't get to get_v() */
+
+ /* Find the concentration at searcher's location */
+
+ if(st->searcher[i]->state != DONE) {
+ for(j = 0; j < st->max_src; j++) {
+
+ if(st->source[j] == NULL)
+ continue;
+
+ get_v(st->source[j], st->searcher[i]);
+
+ if(st->searcher[i]->c == 1)
+ break;
+ }
+ }
+
+ move_searcher(st->searcher[i]);
+
+ }
+
+ draw_image(st, curr_window);
+}
+
+static unsigned long
+anemotaxis_draw (Display *disp, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ XWindowAttributes wa;
+ int w, h;
+
+
+ XGetWindowAttributes(st->dpy, st->window, &wa);
+
+ w = wa.width;
+ h = wa.height;
+
+ if(w != st->scrWidth || h != st->scrHeight) {
+ st->scrWidth = w;
+ st->scrHeight = h;
+ st->ax = st->scrWidth / (double) st->max_dist;
+ st->ay = st->scrHeight / (2. * st->max_dist);
+ st->bx = 0.;
+ st->by = 0.;
+
+ if((st->dx = st->scrWidth / (2 * st->max_dist)) == 0)
+ st->dx = 1;
+ if((st->dy = st->scrHeight / (4 * st->max_dist)) == 0)
+ st->dy = 1;
+ XSetLineAttributes(st->dpy, st->gcDraw, st->dx / 3 + 1, LineSolid, CapRound, JoinRound);
+ }
+
+ XFillRectangle (st->dpy, st->b, st->gcClear, 0, 0, st->scrWidth, st->scrHeight);
+ animate_anemotaxis(st, st->b);
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (st->backb) {
+ XdbeSwapInfo info[1];
+ info[0].swap_window = st->window;
+ info[0].swap_action = XdbeUndefined;
+ XdbeSwapBuffers (st->dpy, info, 1);
+ }
+ else
+#endif
+ if (st->dbuf) {
+ XCopyArea (st->dpy, st->b, st->window, st->gcClear, 0, 0,
+ st->scrWidth, st->scrHeight, 0, 0);
+ st->b = (st->b == st->ba ? st->bb : st->ba);
+ }
+
+ return st->delay;
+}
+
+
+
+static void
+anemotaxis_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+anemotaxis_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+anemotaxis_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int i;
+ if (st->source) {
+ for (i = 0; i < st->max_src; i++)
+ if (st->source[i]) destroy_source (st->source[i]);
+ free (st->source);
+ }
+ if (st->searcher) {
+ for (i = 0; i < st->max_searcher; i++)
+ if (st->searcher[i]) destroy_searcher (st->searcher[i]);
+ free (st->searcher);
+ }
+ free (st);
+}
+
+
+
+
+static const char *anemotaxis_defaults [] = {
+ ".background: black",
+ "*distance: 40",
+ "*sources: 25",
+ "*searchers: 25",
+ "*delay: 20000",
+ "*colors: 20",
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ "*useDBE: True",
+#endif
+ 0
+};
+
+
+static XrmOptionDescRec anemotaxis_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-distance", ".distance", XrmoptionSepArg, 0 },
+ { "-sources", ".sources", XrmoptionSepArg, 0 },
+ { "-searchers", ".searchers", XrmoptionSepArg, 0 },
+ { "-colors", ".colors", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("Anemotaxis", anemotaxis)
diff --git a/hacks/anemotaxis.man b/hacks/anemotaxis.man
new file mode 100644
index 0000000..cf5c1ea
--- /dev/null
+++ b/hacks/anemotaxis.man
@@ -0,0 +1,78 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+anemotaxis - directional search on a plane.
+.SH SYNOPSIS
+.B anemotaxis
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-distance \fInumber\fP]
+[\-sources \fInumber\fP]
+[\-searchers \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+The program demonstrates a search algorithm designed for locating a
+source of odor in turbulent atmosphere. The odor is convected by wind
+which has a constant mean direction and fluctuations around it. The
+searcher is able to sense the odor and determine local instantaneous
+wind direction. The goal is to find the source in the shortest mean
+time. Some animals face this task to find mates, food, home etc. They
+exhibit very particular, zigzagging search trajectories.
+
+This is modeled as a search on a discrete two-dimensional lattice. The
+source releases particles that drift with constant velocity in one
+direction and walk randomly in the other direction. The searcher knows
+if it hit a particle, and if so, particle's position one time step
+earlier (local wind direction). The program paints sources and
+particles released by them as well as trajectories of searchers who are
+trying to capture the sources.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-distance \fInumber\fP
+Max initial distance to the source . 10 - 250. Default: 40.
+.TP 8
+.B \-sources \fInumber\fP
+Max number of sources. Default: 25.
+.TP 8
+.B \-searchers \fInumber\fP
+Max number of searchers. Default: 25.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2004 by Eugene Balkovsky. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Eugene Balkovsky
diff --git a/hacks/ant.c b/hacks/ant.c
new file mode 100644
index 0000000..56d3036
--- /dev/null
+++ b/hacks/ant.c
@@ -0,0 +1,1350 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/*-
+ * ant --- Chris Langton's generalized turing machine ants (also known
+ * as Greg Turk's turmites) whose tape is the screen
+ */
+
+#if 0
+static const char sccsid[] = "@(#)ant.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1995 by David Bagley.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 10-May-1997: Compatible with xscreensaver
+ * 16-Apr-1997: -neighbors 3 and 8 added
+ * 01-Jan-1997: Updated ant.c to handle more kinds of ants. Thanks to
+ * J Austin David <Austin.David@tlogic.com>. Check it out in
+ * java at http://havoc.gtf.gatech.edu/austin He thought up the
+ * new Ladder ant.
+ * 04-Apr-1996: -neighbors 6 runtime-time option added for hexagonal ants
+ * (bees), coded from an idea of Jim Propp's in Science News,
+ * Oct 28, 1995 VOL. 148 page 287
+ * 20-Sep-1995: Memory leak in ant fixed. Now random colors.
+ * 05-Sep-1995: Coded from A.K. Dewdney's "Computer Recreations", Scientific
+ * American Magazine" Sep 1989 pp 180-183, Mar 1990 p 121
+ * Also used Ian Stewart's Mathematical Recreations, Scientific
+ * American Jul 1994 pp 104-107
+ * also used demon.c and life.c as a guide.
+ */
+
+/*-
+ Species Grid Number of Neighbors
+ ------- ---- ------------------
+ Ants Square 4 (or 8)
+ Bees Hexagon 6
+ Bees Triangle 3 (or 9, 12)
+
+ Neighbors 6 and neighbors 3 produce the same Turk ants.
+*/
+
+#ifndef HAVE_JWXYZ
+/*# define DO_STIPPLE*/
+#endif
+
+#ifdef STANDALONE
+# define MODE_ant
+# define DEFAULTS "*delay: 20000 \n" \
+ "*count: -3 \n" \
+ "*cycles: 40000 \n" \
+ "*size: -12 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+
+# define reshape_ant 0
+# define release_ant 0
+# define ant_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+#include "automata.h"
+
+#ifdef MODE_ant
+
+/*-
+ * neighbors of 0 randomizes it for 3, 4, 6, 8, 12 (last 2 are less likely)
+ */
+
+#define DEF_NEIGHBORS "0" /* choose random value */
+#define DEF_TRUCHET "False"
+#define DEF_EYES "False"
+#define DEF_SHARPTURN "False"
+
+static int neighbors;
+static Bool truchet;
+static Bool eyes;
+static Bool sharpturn;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-neighbors", ".ant.neighbors", XrmoptionSepArg, 0},
+ {"-truchet", ".ant.truchet", XrmoptionNoArg, "on"},
+ {"+truchet", ".ant.truchet", XrmoptionNoArg, "off"},
+ {"-eyes", ".ant.eyes", XrmoptionNoArg, "on"},
+ {"+eyes", ".ant.eyes", XrmoptionNoArg, "off"},
+ {"-sharpturn", ".ant.sharpturn", XrmoptionNoArg, "on"},
+ {"+sharpturn", ".ant.sharpturn", XrmoptionNoArg, "off"},
+};
+static argtype vars[] =
+{
+ {&neighbors, "neighbors", "Neighbors", DEF_NEIGHBORS, t_Int},
+ {&truchet, "truchet", "Truchet", DEF_TRUCHET, t_Bool},
+ {&eyes, "eyes", "Eyes", DEF_EYES, t_Bool},
+ {&sharpturn, "sharpturn", "SharpTurn", DEF_SHARPTURN, t_Bool},
+};
+static OptionStruct desc[] =
+{
+ {"-neighbors num", "squares 4 or 8, hexagons 6, triangles 3 or 12"},
+ {"-/+truchet", "turn on/off Truchet lines"},
+ {"-/+eyes", "turn on/off eyes"},
+ {"-/+sharpturn", "turn on/off sharp turns (6, 8 or 12 neighbors only)"}
+};
+
+ENTRYPOINT ModeSpecOpt ant_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+const ModStruct ant_description =
+{"ant",
+ "init_ant", "draw_ant", (char *) NULL,
+ "refresh_ant", "init_ant", "free_ant", &ant_opts,
+ 1000, -3, 40000, -12, 64, 1.0, "",
+ "Shows Langton's and Turk's generalized ants", 0, NULL};
+
+#endif
+
+#define ANTBITS(n,w,h)\
+ if ((ap->pixmaps[ap->init_bits]=\
+ XCreatePixmapFromBitmapData(display,window,(char *)n,w,h,1,0,1))==None){\
+ free_ant(mi); return;} else {ap->init_bits++;}
+
+/* If you change the table you may have to change the following 2 constants */
+#define STATES 2
+#define MINANTS 1
+#define REDRAWSTEP 2000 /* How much tape to draw per cycle */
+#define MINGRIDSIZE 24
+#define MINSIZE 1
+#define MINRANDOMSIZE 5
+#define ANGLES 360
+
+typedef struct {
+ unsigned char color;
+ short direction;
+ unsigned char next;
+} statestruct;
+
+typedef struct {
+ int col, row;
+ short direction;
+ unsigned char state;
+} antstruct;
+
+typedef struct {
+ Bool painted;
+ int neighbors;
+ int generation;
+ int xs, ys;
+ int xb, yb;
+ int init_dir;
+ int nrows, ncols;
+ int width, height;
+ unsigned char ncolors, nstates;
+ int n;
+ int redrawing, redrawpos;
+ int truchet; /* Only for Turk modes */
+ int eyes;
+ int sharpturn;
+ statestruct machine[NUMSTIPPLES * STATES];
+ unsigned char *tape;
+ unsigned char *truchet_state;
+ antstruct *ants;
+ int init_bits;
+ unsigned char colors[NUMSTIPPLES - 1];
+# ifdef DO_STIPPLE
+ GC stippledGC;
+# endif /* DO_STIPPLE */
+ Pixmap pixmaps[NUMSTIPPLES - 1];
+ union {
+ XPoint hexagon[7]; /* Need more than 6 for truchet */
+ XPoint triangle[2][4]; /* Need more than 3 for truchet */
+ } shape;
+} antfarmstruct;
+
+static char plots[] =
+{3, 4, 6, 8,
+#ifdef NUMBER_9
+ 9,
+#endif
+ 12};
+
+#define NEIGHBORKINDS ((long) (sizeof plots / sizeof *plots))
+#define GOODNEIGHBORKINDS 3
+
+/* Relative ant moves */
+#define FS 0 /* Step */
+#define TRS 1 /* Turn right, then step */
+#define THRS 2 /* Turn hard right, then step */
+#define TBS 3 /* Turn back, then step */
+#define THLS 4 /* Turn hard left, then step */
+#define TLS 5 /* Turn left, then step */
+#define SF 6 /* Step */
+#define STR 7 /* Step then turn right */
+#define STHR 8 /* Step then turn hard right */
+#define STB 9 /* Step then turn back */
+#define STHL 10 /* Step then turn hard left */
+#define STL 11 /* Step then turn left */
+
+static antfarmstruct *antfarms = (antfarmstruct *) NULL;
+
+/* LANGTON'S ANT (10) Chaotic after 500, Builder after 10,000 (104p) */
+/* TURK'S 100 ANT Always chaotic?, tested past 150,000,000 */
+/* TURK'S 101 ANT Always chaotic? */
+/* TURK'S 110 ANT Builder at 150 (18p) */
+/* TURK'S 1000 ANT Always chaotic? */
+/* TURK'S 1100 SYMMETRIC ANT all even run 1's and 0's are symmetric */
+/* other examples 1001, 110011, 110000, 1001101 */
+/* TURK'S 1101 ANT Builder after 250,000 (388p) */
+/* Once saw a chess horse type builder (i.e. non-45 degree builder) */
+
+/* BEE ONLY */
+/* All alternating 10 appear symmetric, no proof (i.e. 10, 1010, etc) */
+/* Even runs of 0's and 1's are also symmetric */
+/* I have seen Hexagonal builders but they are more rare. */
+
+static unsigned char tables[][3 * NUMSTIPPLES * STATES + 2] =
+{
+#if 0
+ /* Here just so you can figure out notation */
+ { /* Langton's ant */
+ 2, 1,
+ 1, TLS, 0, 0, TRS, 0
+ },
+#else
+ /* First 2 numbers are the size (ncolors, nstates) */
+ { /* LADDER BUILDER */
+ 4, 1,
+ 1, STR, 0, 2, STL, 0, 3, TRS, 0, 0, TLS, 0
+ },
+ { /* SPIRALING PATTERN */
+ 2, 2,
+ 1, TLS, 0, 0, FS, 1,
+ 1, TRS, 0, 1, TRS, 0
+ },
+ { /* SQUARE (HEXAGON) BUILDER */
+ 2, 2,
+ 1, TLS, 0, 0, FS, 1,
+ 0, TRS, 0, 1, TRS, 0
+ },
+#endif
+};
+
+#define NTABLES (sizeof tables / sizeof tables[0])
+
+static void
+position_of_neighbor(antfarmstruct * ap, int dir, int *pcol, int *prow)
+{
+ int col = *pcol, row = *prow;
+
+ if (ap->neighbors == 6) {
+ switch (dir) {
+ case 0:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ break;
+ case 60:
+ if (!(row & 1))
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ row = (!row) ? ap->nrows - 1 : row - 1;
+ break;
+ case 120:
+ if (row & 1)
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ row = (!row) ? ap->nrows - 1 : row - 1;
+ break;
+ case 180:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ break;
+ case 240:
+ if (row & 1)
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ row = (row + 1 == ap->nrows) ? 0 : row + 1;
+ break;
+ case 300:
+ if (!(row & 1))
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ row = (row + 1 == ap->nrows) ? 0 : row + 1;
+ break;
+ default:
+ (void) fprintf(stderr, "wrong direction %d\n", dir);
+ }
+ } else if (ap->neighbors == 4 || ap->neighbors == 8) {
+ switch (dir) {
+ case 0:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ break;
+ case 45:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ row = (!row) ? ap->nrows - 1 : row - 1;
+ break;
+ case 90:
+ row = (!row) ? ap->nrows - 1 : row - 1;
+ break;
+ case 135:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ row = (!row) ? ap->nrows - 1 : row - 1;
+ break;
+ case 180:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ break;
+ case 225:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ row = (row + 1 == ap->nrows) ? 0 : row + 1;
+ break;
+ case 270:
+ row = (row + 1 == ap->nrows) ? 0 : row + 1;
+ break;
+ case 315:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ row = (row + 1 == ap->nrows) ? 0 : row + 1;
+ break;
+ default:
+ (void) fprintf(stderr, "wrong direction %d\n", dir);
+ }
+ } else { /* TRI */
+ if ((col + row) % 2) { /* right */
+ switch (dir) {
+ case 0:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ break;
+ case 30:
+ case 40:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ row = (!row) ? ap->nrows - 1 : row - 1;
+ break;
+ case 60:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ if (!row)
+ row = ap->nrows - 2;
+ else if (!(row - 1))
+ row = ap->nrows - 1;
+ else
+ row = row - 2;
+ break;
+ case 80:
+ case 90:
+ if (!row)
+ row = ap->nrows - 2;
+ else if (!(row - 1))
+ row = ap->nrows - 1;
+ else
+ row = row - 2;
+ break;
+ case 120:
+ row = (!row) ? ap->nrows - 1 : row - 1;
+ break;
+ case 150:
+ case 160:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ row = (!row) ? ap->nrows - 1 : row - 1;
+ break;
+ case 180:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ break;
+ case 200:
+ case 210:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ row = (row + 1 == ap->nrows) ? 0 : row + 1;
+ break;
+ case 240:
+ row = (row + 1 == ap->nrows) ? 0 : row + 1;
+ break;
+ case 270:
+ case 280:
+ if (row + 1 == ap->nrows)
+ row = 1;
+ else if (row + 2 == ap->nrows)
+ row = 0;
+ else
+ row = row + 2;
+ break;
+ case 300:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ if (row + 1 == ap->nrows)
+ row = 1;
+ else if (row + 2 == ap->nrows)
+ row = 0;
+ else
+ row = row + 2;
+ break;
+ case 320:
+ case 330:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ row = (row + 1 == ap->nrows) ? 0 : row + 1;
+ break;
+ default:
+ (void) fprintf(stderr, "wrong direction %d\n", dir);
+ }
+ } else { /* left */
+ switch (dir) {
+ case 0:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ break;
+ case 30:
+ case 40:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ row = (row + 1 == ap->nrows) ? 0 : row + 1;
+ break;
+ case 60:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ if (row + 1 == ap->nrows)
+ row = 1;
+ else if (row + 2 == ap->nrows)
+ row = 0;
+ else
+ row = row + 2;
+ break;
+ case 80:
+ case 90:
+ if (row + 1 == ap->nrows)
+ row = 1;
+ else if (row + 2 == ap->nrows)
+ row = 0;
+ else
+ row = row + 2;
+ break;
+ case 120:
+ row = (row + 1 == ap->nrows) ? 0 : row + 1;
+ break;
+ case 150:
+ case 160:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ row = (row + 1 == ap->nrows) ? 0 : row + 1;
+ break;
+ case 180:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ break;
+ case 200:
+ case 210:
+ col = (!col) ? ap->ncols - 1 : col - 1;
+ row = (!row) ? ap->nrows - 1 : row - 1;
+ break;
+ case 240:
+ row = (!row) ? ap->nrows - 1 : row - 1;
+ break;
+ case 270:
+ case 280:
+ if (!row)
+ row = ap->nrows - 2;
+ else if (row == 1)
+ row = ap->nrows - 1;
+ else
+ row = row - 2;
+ break;
+ case 300:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ if (!row)
+ row = ap->nrows - 2;
+ else if (row == 1)
+ row = ap->nrows - 1;
+ else
+ row = row - 2;
+ break;
+ case 320:
+ case 330:
+ col = (col + 1 == ap->ncols) ? 0 : col + 1;
+ row = (!row) ? ap->nrows - 1 : row - 1;
+ break;
+ default:
+ (void) fprintf(stderr, "wrong direction %d\n", dir);
+ }
+ }
+ }
+ *pcol = col;
+ *prow = row;
+}
+
+static void
+fillcell(ModeInfo * mi, GC gc, int col, int row)
+{
+ antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+
+ if (ap->neighbors == 6) {
+ int ccol = 2 * col + !(row & 1), crow = 2 * row;
+
+ ap->shape.hexagon[0].x = ap->xb + ccol * ap->xs;
+ ap->shape.hexagon[0].y = ap->yb + crow * ap->ys;
+ if (ap->xs == 1 && ap->ys == 1)
+ XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ ap->shape.hexagon[0].x, ap->shape.hexagon[0].y);
+ else
+ XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ ap->shape.hexagon, 6, Convex, CoordModePrevious);
+ } else if (ap->neighbors == 4 || ap->neighbors == 8) {
+ XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ ap->xb + ap->xs * col, ap->yb + ap->ys * row,
+ ap->xs - (ap->xs > 3), ap->ys - (ap->ys > 3));
+ } else { /* TRI */
+ int orient = (col + row) % 2; /* O left 1 right */
+
+ ap->shape.triangle[orient][0].x = ap->xb + col * ap->xs;
+ ap->shape.triangle[orient][0].y = ap->yb + row * ap->ys;
+ if (ap->xs <= 3 || ap->ys <= 3)
+ XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ ((orient) ? -1 : 1) + ap->shape.triangle[orient][0].x,
+ ap->shape.triangle[orient][0].y);
+ else {
+ if (orient)
+ ap->shape.triangle[orient][0].x += (ap->xs / 2 - 1);
+ else
+ ap->shape.triangle[orient][0].x -= (ap->xs / 2 - 1);
+ XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ ap->shape.triangle[orient], 3, Convex, CoordModePrevious);
+ }
+ }
+}
+
+static void
+truchetcell(ModeInfo * mi, int col, int row, int truchetstate)
+{
+ antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+
+ if (ap->neighbors == 6) {
+
+ int ccol = 2 * col + !(row & 1), crow = 2 * row;
+ int side;
+ int fudge = 7; /* fudge because the hexagons are not exact */
+ XPoint hex, hex2;
+
+ if (ap->sharpturn) {
+ hex.x = ap->xb + ccol * ap->xs - (int) ((double) ap->xs / 2.0) - 1;
+ hex.y = ap->yb + crow * ap->ys - (int) ((double) ap->ys / 2.0) - 1;
+ for (side = 0; side < 6; side++) {
+ if (side) {
+ hex.x += ap->shape.hexagon[side].x;
+ hex.y += ap->shape.hexagon[side].y;
+ }
+ if (truchetstate == side % 2)
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ hex.x, hex.y, ap->xs, ap->ys,
+ ((570 - (side * 60) + fudge) % 360) * 64, (120 - 2 * fudge) * 64);
+ }
+ } else {
+ /* Very crude approx of Sqrt 3, so it will not cause drawing errors. */
+ hex.x = ap->xb + ccol * ap->xs - (int) ((double) ap->xs * 1.6 / 2.0) - 1;
+ hex.y = ap->yb + crow * ap->ys - (int) ((double) ap->ys * 1.6 / 2.0) - 1;
+ for (side = 0; side < 6; side++) {
+ if (side) {
+ hex.x += ap->shape.hexagon[side].x;
+ hex.y += ap->shape.hexagon[side].y;
+ }
+ hex2.x = hex.x + ap->shape.hexagon[side + 1].x / 2;
+ hex2.y = hex.y + ap->shape.hexagon[side + 1].y / 2 + 1;
+ /* Lots of fudging here */
+ if (side == 1) {
+ hex2.x += (short) (ap->xs * 0.1 + 1);
+ hex2.y += (short) (ap->ys * 0.1 - ((ap->ys > 5) ? 1 : 0));
+ } else if (side == 2) {
+ hex2.x += (short) (ap->xs * 0.1);
+ } else if (side == 4) {
+ hex2.x += (short) (ap->xs * 0.1);
+ hex2.y += (short) (ap->ys * 0.1 - 1);
+ } else if (side == 5) {
+ hex2.x += (short) (ap->xs * 0.5);
+ hex2.y += (short) (-ap->ys * 0.3 + 1);
+ }
+ if (truchetstate == side % 3)
+ /* Crude approx of 120 deg, so it will not cause drawing errors. */
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ hex2.x, hex2.y,
+ (int) ((double) ap->xs * 1.5), (int) ((double) ap->ys * 1.5),
+ ((555 - (side * 60)) % 360) * 64, 90 * 64);
+ }
+ }
+ } else if (ap->neighbors == 4) {
+ if (truchetstate) {
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ ap->xb + ap->xs * col - ap->xs / 2 + 1,
+ ap->yb + ap->ys * row + ap->ys / 2 - 1,
+ ap->xs - 2, ap->ys - 2,
+ 0 * 64, 90 * 64);
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ ap->xb + ap->xs * col + ap->xs / 2 - 1,
+ ap->yb + ap->ys * row - ap->ys / 2 + 1,
+ ap->xs - 2, ap->ys - 2,
+ -90 * 64, -90 * 64);
+ } else {
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ ap->xb + ap->xs * col - ap->xs / 2 + 1,
+ ap->yb + ap->ys * row - ap->ys / 2 + 1,
+ ap->xs - 2, ap->ys - 2,
+ 0 * 64, -90 * 64);
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ ap->xb + ap->xs * col + ap->xs / 2 - 1,
+ ap->yb + ap->ys * row + ap->ys / 2 - 1,
+ ap->xs - 2, ap->ys - 2,
+ 90 * 64, 90 * 64);
+ }
+ } else if (ap->neighbors == 3) {
+ int orient = (col + row) % 2; /* O left 1 right */
+ int side, ang;
+ int fudge = 7; /* fudge because the triangles are not exact */
+ double fudge2 = 1.18;
+ XPoint tri;
+
+ tri.x = ap->xb + col * ap->xs;
+ tri.y = ap->yb + row * ap->ys;
+ if (orient) {
+ tri.x += (ap->xs / 2 - 1);
+ } else {
+ tri.x -= (ap->xs / 2 - 1);
+ }
+ for (side = 0; side < 3; side++) {
+ if (side > 0) {
+ tri.x += ap->shape.triangle[orient][side].x;
+ tri.y += ap->shape.triangle[orient][side].y;
+ }
+ if (truchetstate == side) {
+ if (orient)
+ ang = (510 - side * 120) % 360; /* Right */
+ else
+ ang = (690 - side * 120) % 360; /* Left */
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ (int) (tri.x - ap->xs * fudge2 / 2),
+ (int) (tri.y - 3 * ap->ys * fudge2 / 4),
+ (unsigned int) (ap->xs * fudge2),
+ (unsigned int) (3 * ap->ys * fudge2 / 2),
+ (ang + fudge) * 64, (60 - 2 * fudge) * 64);
+ }
+ }
+ }
+}
+
+static void
+drawcell(ModeInfo * mi, int col, int row, unsigned char color)
+{
+ antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+ GC gc;
+
+ if (!color) {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ gc = MI_GC(mi);
+# ifdef DO_STIPPLE
+ } else if (MI_NPIXELS(mi) <= 2) {
+ XGCValues gcv;
+ gcv.foreground = MI_WHITE_PIXEL(mi);
+ gcv.background = MI_BLACK_PIXEL(mi);
+ gcv.stipple = ap->pixmaps[color - 1];
+ XChangeGC(MI_DISPLAY(mi), ap->stippledGC,
+ GCStipple | GCForeground | GCBackground, &gcv);
+ gc = ap->stippledGC;
+# endif /* !DO_STIPPLE */
+ } else {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
+ MI_PIXEL(mi, ap->colors[color - 1]));
+ gc = MI_GC(mi);
+ }
+ fillcell(mi, gc, col, row);
+}
+
+static void
+drawtruchet(ModeInfo * mi, int col, int row,
+ unsigned char color, unsigned char truchetstate)
+{
+ antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+
+ if (!color)
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+ else if (MI_NPIXELS(mi) > 2 || color > ap->ncolors / 2)
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ else
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+ truchetcell(mi, col, row, truchetstate);
+}
+
+static void
+draw_anant(ModeInfo * mi, int direction, int col, int row)
+{
+ antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ XSetForeground(display, MI_GC(mi), MI_WHITE_PIXEL(mi));
+ fillcell(mi, MI_GC(mi), col, row);
+ if (ap->eyes) { /* Draw Eyes */
+ XSetForeground(display, MI_GC(mi), MI_BLACK_PIXEL(mi));
+ if (ap->neighbors == 6) {
+ int ccol = 2 * col + !(row & 1), crow = 2 * row;
+ int side, ang;
+ XPoint hex;
+
+ if (!(ap->xs > 3 && ap->ys > 3))
+ return;
+ hex.x = ap->xb + ccol * ap->xs;
+ hex.y = ap->yb + crow * ap->ys + ap->ys / 2;
+ ang = direction * ap->neighbors / ANGLES;
+ for (side = 0; side < ap->neighbors; side++) {
+ if (side) {
+ hex.x -= ap->shape.hexagon[side].x / 2;
+ hex.y += ap->shape.hexagon[side].y / 2;
+ }
+ if (side == (ap->neighbors + ang - 2) % ap->neighbors)
+ XDrawPoint(display, window, MI_GC(mi), hex.x, hex.y);
+ if (side == (ap->neighbors + ang - 1) % ap->neighbors)
+ XDrawPoint(display, window, MI_GC(mi), hex.x, hex.y);
+ }
+ } else if (ap->neighbors == 4 || ap->neighbors == 8) {
+ if (!(ap->xs > 3 && ap->ys > 3))
+ return;
+ switch (direction) {
+ case 0:
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * (col + 1) - 3,
+ ap->yb + ap->ys * row + ap->ys / 2 - 2);
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * (col + 1) - 3,
+ ap->yb + ap->ys * row + ap->ys / 2);
+ break;
+ case 45:
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * (col + 1) - 4,
+ ap->yb + ap->ys * row + 1);
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * (col + 1) - 3,
+ ap->yb + ap->ys * row + 2);
+ break;
+ case 90:
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * col + ap->xs / 2 - 2,
+ ap->yb + ap->ys * row + 1);
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * col + ap->xs / 2,
+ ap->yb + ap->ys * row + 1);
+ break;
+ case 135:
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * col + 2,
+ ap->yb + ap->ys * row + 1);
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * col + 1,
+ ap->yb + ap->ys * row + 2);
+ break;
+ case 180:
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * col + 1,
+ ap->yb + ap->ys * row + ap->ys / 2 - 2);
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * col + 1,
+ ap->yb + ap->ys * row + ap->ys / 2);
+ break;
+ case 225:
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * col + 2,
+ ap->yb + ap->ys * (row + 1) - 3);
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * col + 1,
+ ap->yb + ap->ys * (row + 1) - 4);
+ break;
+ case 270:
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * col + ap->xs / 2 - 2,
+ ap->yb + ap->ys * (row + 1) - 3);
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * col + ap->xs / 2,
+ ap->yb + ap->ys * (row + 1) - 3);
+ break;
+ case 315:
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * (col + 1) - 4,
+ ap->yb + ap->ys * (row + 1) - 3);
+ XDrawPoint(display, window, MI_GC(mi),
+ ap->xb + ap->xs * (col + 1) - 3,
+ ap->yb + ap->ys * (row + 1) - 4);
+ break;
+ default:
+ (void) fprintf(stderr, "wrong eyes direction %d for ant eyes\n", direction);
+ }
+ } else { /* TRI */
+ int orient = (col + row) % 2; /* O left 1 right */
+ int side, ang;
+ XPoint tri;
+
+ if (!(ap->xs > 6 && ap->ys > 6))
+ return;
+ tri.x = ap->xb + col * ap->xs;
+ tri.y = ap->yb + row * ap->ys;
+ if (orient)
+ tri.x += (ap->xs / 6 - 1);
+ else
+ tri.x -= (ap->xs / 6 - 1);
+ ang = direction * ap->neighbors / ANGLES;
+ /* approx... does not work that well for even numbers */
+ if (
+#ifdef NUMBER_9
+ ap->neighbors == 9 ||
+#endif
+ ap->neighbors == 12) {
+#ifdef UNDER_CONSTRUCTION
+ /* Not sure why this does not work */
+ ang = ((ang + ap->neighbors / 6) / (ap->neighbors / 3)) % 3;
+#else
+ return;
+#endif
+ }
+ for (side = 0; side < 3; side++) {
+ if (side) {
+ tri.x += ap->shape.triangle[orient][side].x / 3;
+ tri.y += ap->shape.triangle[orient][side].y / 3;
+ }
+ /* Either you have the eyes in back or one eye in front */
+#if 0
+ if (side == ang)
+ XDrawPoint(display, window, MI_GC(mi), tri.x, tri.y);
+#else
+ if (side == (ang + 2) % 3)
+ XDrawPoint(display, window, MI_GC(mi), tri.x, tri.y);
+ if (side == (ang + 1) % 3)
+ XDrawPoint(display, window, MI_GC(mi), tri.x, tri.y);
+#endif
+ }
+ }
+ }
+}
+
+#if 0
+static void
+RandomSoup(mi)
+ ModeInfo *mi;
+{
+ antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+ int row, col, mrow = 0;
+
+ for (row = 0; row < ap->nrows; ++row) {
+ for (col = 0; col < ap->ncols; ++col) {
+ ap->old[col + mrow] = (unsigned char) NRAND((int) ap->ncolors);
+ drawcell(mi, col, row, ap->old[col + mrow]);
+ }
+ mrow += ap->nrows;
+ }
+}
+
+#endif
+
+static short
+fromTableDirection(unsigned char dir, int local_neighbors)
+{
+ /* Crafted to work for odd number of neighbors */
+ switch (dir) {
+ case FS:
+ return 0;
+ case TLS:
+ return (ANGLES / local_neighbors);
+ case THLS:
+ return (2 * ANGLES / local_neighbors);
+ case TBS:
+ return ((local_neighbors / 2) * ANGLES / local_neighbors);
+ case THRS:
+ return (ANGLES - 2 * ANGLES / local_neighbors);
+ case TRS:
+ return (ANGLES - ANGLES / local_neighbors);
+ case SF:
+ return ANGLES;
+ case STL:
+ return (ANGLES + ANGLES / local_neighbors);
+ case STHL:
+ return (ANGLES + 2 * ANGLES / local_neighbors);
+ case STB:
+ return (ANGLES + (local_neighbors / 2) * ANGLES / local_neighbors);
+ case STHR:
+ return (2 * ANGLES - 2 * ANGLES / local_neighbors);
+ case STR:
+ return (2 * ANGLES - ANGLES / local_neighbors);
+ default:
+ (void) fprintf(stderr, "wrong direction %d from table\n", dir);
+ }
+ return -1;
+}
+
+static void
+getTable(ModeInfo * mi, int i)
+{
+ antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+ int j, total;
+ unsigned char *patptr;
+
+ patptr = &tables[i][0];
+ ap->ncolors = *patptr++;
+ ap->nstates = *patptr++;
+ total = ap->ncolors * ap->nstates;
+ if (MI_IS_VERBOSE(mi))
+ (void) fprintf(stdout,
+ "ants %d, neighbors %d, table number %d, colors %d, states %d\n",
+ ap->n, ap->neighbors, i, ap->ncolors, ap->nstates);
+ for (j = 0; j < total; j++) {
+ ap->machine[j].color = *patptr++;
+ if (ap->sharpturn && ap->neighbors > 4) {
+ int k = *patptr++;
+
+ switch (k) {
+ case TRS:
+ k = THRS;
+ break;
+ case THRS:
+ k = TRS;
+ break;
+ case THLS:
+ k = TLS;
+ break;
+ case TLS:
+ k = THLS;
+ break;
+ case STR:
+ k = STHR;
+ break;
+ case STHR:
+ k = STR;
+ break;
+ case STHL:
+ k = STL;
+ break;
+ case STL:
+ k = STHL;
+ break;
+ default:
+ break;
+ }
+ ap->machine[j].direction = fromTableDirection(k, ap->neighbors);
+ } else {
+ ap->machine[j].direction = fromTableDirection(*patptr++, ap->neighbors);
+ }
+ ap->machine[j].next = *patptr++;
+ }
+ ap->truchet = False;
+}
+
+static void
+getTurk(ModeInfo * mi, int i)
+{
+ antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+ int power2, j, number, total;
+
+ /* To force a number, say <i = 2;> has i + 2 (or 4) binary digits */
+ power2 = 1 << (i + 1);
+ /* Do not want numbers which in binary are all 1's. */
+ number = NRAND(power2 - 1) + power2;
+ /* To force a particular number, say <number = 10;> */
+
+ ap->ncolors = i + 2;
+ ap->nstates = 1;
+ total = ap->ncolors * ap->nstates;
+ for (j = 0; j < total; j++) {
+ ap->machine[j].color = (j + 1) % total;
+ if (ap->sharpturn && ap->neighbors > 4) {
+ ap->machine[j].direction = (power2 & number) ?
+ fromTableDirection(THRS, ap->neighbors) :
+ fromTableDirection(THLS, ap->neighbors);
+ } else {
+ ap->machine[j].direction = (power2 & number) ?
+ fromTableDirection(TRS, ap->neighbors) :
+ fromTableDirection(TLS, ap->neighbors);
+ }
+ ap->machine[j].next = 0;
+ power2 >>= 1;
+ }
+ ap->truchet = (ap->truchet && ap->xs > 2 && ap->ys > 2 &&
+ (ap->neighbors == 3 || ap->neighbors == 4 || ap->neighbors == 6));
+ if (MI_IS_VERBOSE(mi))
+ (void) fprintf(stdout,
+ "ants %d, neighbors %d, Turk's number %d, colors %d\n",
+ ap->n, ap->neighbors, number, ap->ncolors);
+}
+
+ENTRYPOINT void
+free_ant(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+ int shade;
+
+#ifdef DO_STIPPLE
+ if (ap->stippledGC != None) {
+ XFreeGC(display, ap->stippledGC);
+ ap->stippledGC = None;
+ }
+#endif /* DO_STIPPLE */
+ for (shade = 0; shade < ap->init_bits; shade++) {
+ XFreePixmap(display, ap->pixmaps[shade]);
+ }
+ ap->init_bits = 0;
+ if (ap->tape != NULL) {
+ (void) free((void *) ap->tape);
+ ap->tape = (unsigned char *) NULL;
+ }
+ if (ap->ants != NULL) {
+ (void) free((void *) ap->ants);
+ ap->ants = (antstruct *) NULL;
+ }
+ if (ap->truchet_state != NULL) {
+ (void) free((void *) ap->truchet_state);
+ ap->truchet_state = (unsigned char *) NULL;
+ }
+}
+
+ENTRYPOINT void
+init_ant(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ int size = MI_SIZE(mi);
+ antfarmstruct *ap;
+ int col, row, dir;
+ int i;
+
+ MI_INIT(mi, antfarms);
+ /*if (antfarms == NULL) {
+ if ((antfarms = (antfarmstruct *) calloc(MI_NUM_SCREENS(mi),
+ sizeof (antfarmstruct))) == NULL)
+ return;
+ }*/
+ ap = &antfarms[MI_SCREEN(mi)];
+
+ ap->redrawing = 0;
+#ifdef DO_STIPPLE
+ if (MI_NPIXELS(mi) <= 2) {
+ Window window = MI_WINDOW(mi);
+ if (ap->stippledGC == None) {
+ XGCValues gcv;
+
+ gcv.fill_style = FillOpaqueStippled;
+ if ((ap->stippledGC = XCreateGC(display, window,
+ GCFillStyle,
+ &gcv)) == None) {
+ free_ant(mi);
+ return;
+ }
+ }
+ if (ap->init_bits == 0) {
+ for (i = 1; i < NUMSTIPPLES; i++) {
+ ANTBITS(stipples[i], STIPPLESIZE, STIPPLESIZE);
+ }
+ }
+ }
+#endif /* DO_STIPPLE */
+ ap->generation = 0;
+ ap->n = MI_COUNT(mi);
+ if (ap->n < -MINANTS) {
+ /* if ap->n is random ... the size can change */
+ if (ap->ants != NULL) {
+ (void) free((void *) ap->ants);
+ ap->ants = (antstruct *) NULL;
+ }
+ ap->n = NRAND(-ap->n - MINANTS + 1) + MINANTS;
+ } else if (ap->n < MINANTS)
+ ap->n = MINANTS;
+
+ ap->width = MI_WIDTH(mi);
+ ap->height = MI_HEIGHT(mi);
+
+ for (i = 0; i < NEIGHBORKINDS; i++) {
+ if (neighbors == plots[i]) {
+ ap->neighbors = plots[i];
+ break;
+ }
+ if (i == NEIGHBORKINDS - 1) {
+ if (!NRAND(10)) {
+ /* Make above 6 rare */
+ ap->neighbors = plots[NRAND(NEIGHBORKINDS)];
+ } else {
+ ap->neighbors = plots[NRAND(GOODNEIGHBORKINDS)];
+ }
+ break;
+ }
+ }
+
+ if (ap->neighbors == 6) {
+ int nccols, ncrows;
+
+ if (ap->width < 8)
+ ap->width = 8;
+ if (ap->height < 8)
+ ap->height = 8;
+ if (size < -MINSIZE) {
+ ap->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(ap->width, ap->height) /
+ MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
+ if (ap->ys < MINRANDOMSIZE)
+ ap->ys = MIN(MINRANDOMSIZE,
+ MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE));
+ } else if (size < MINSIZE) {
+ if (!size)
+ ap->ys = MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE);
+ else
+ ap->ys = MINSIZE;
+ } else
+ ap->ys = MIN(size, MAX(MINSIZE, MIN(ap->width, ap->height) /
+ MINGRIDSIZE));
+ ap->xs = ap->ys;
+ nccols = MAX(ap->width / ap->xs - 2, 2);
+ ncrows = MAX(ap->height / ap->ys - 1, 4);
+ ap->ncols = nccols / 2;
+ ap->nrows = 2 * (ncrows / 4);
+ ap->xb = (ap->width - ap->xs * nccols) / 2 + ap->xs / 2;
+ ap->yb = (ap->height - ap->ys * (ncrows / 2) * 2) / 2 + ap->ys - 2;
+ for (i = 0; i < 6; i++) {
+ ap->shape.hexagon[i].x = (ap->xs - 1) * hexagonUnit[i].x;
+ ap->shape.hexagon[i].y = ((ap->ys - 1) * hexagonUnit[i].y / 2) * 4 / 3;
+ }
+ /* Avoid array bounds read of hexagonUnit */
+ ap->shape.hexagon[6].x = 0;
+ ap->shape.hexagon[6].y = 0;
+ } else if (ap->neighbors == 4 || ap->neighbors == 8) {
+ if (size < -MINSIZE) {
+ ap->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(ap->width, ap->height) /
+ MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
+ if (ap->ys < MINRANDOMSIZE)
+ ap->ys = MIN(MINRANDOMSIZE,
+ MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE));
+ } else if (size < MINSIZE) {
+ if (!size)
+ ap->ys = MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE);
+ else
+ ap->ys = MINSIZE;
+ } else
+ ap->ys = MIN(size, MAX(MINSIZE, MIN(ap->width, ap->height) /
+ MINGRIDSIZE));
+ ap->xs = ap->ys;
+ ap->ncols = MAX(ap->width / ap->xs, 2);
+ ap->nrows = MAX(ap->height / ap->ys, 2);
+ ap->xb = (ap->width - ap->xs * ap->ncols) / 2;
+ ap->yb = (ap->height - ap->ys * ap->nrows) / 2;
+ } else { /* TRI */
+ int orient;
+
+ if (ap->width < 2)
+ ap->width = 2;
+ if (ap->height < 2)
+ ap->height = 2;
+ if (size < -MINSIZE) {
+ ap->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(ap->width, ap->height) /
+ MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
+ if (ap->ys < MINRANDOMSIZE)
+ ap->ys = MIN(MINRANDOMSIZE,
+ MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE));
+ } else if (size < MINSIZE) {
+ if (!size)
+ ap->ys = MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE);
+ else
+ ap->ys = MINSIZE;
+ } else
+ ap->ys = MIN(size, MAX(MINSIZE, MIN(ap->width, ap->height) /
+ MINGRIDSIZE));
+ ap->xs = (int) (1.52 * ap->ys);
+ ap->ncols = (MAX(ap->width / ap->xs - 1, 2) / 2) * 2;
+ ap->nrows = (MAX(ap->height / ap->ys - 1, 2) / 2) * 2;
+ ap->xb = (ap->width - ap->xs * ap->ncols) / 2 + ap->xs / 2;
+ ap->yb = (ap->height - ap->ys * ap->nrows) / 2 + ap->ys;
+ for (orient = 0; orient < 2; orient++) {
+ for (i = 0; i < 3; i++) {
+ ap->shape.triangle[orient][i].x =
+ (ap->xs - 2) * triangleUnit[orient][i].x;
+ ap->shape.triangle[orient][i].y =
+ (ap->ys - 2) * triangleUnit[orient][i].y;
+ }
+ /* Avoid array bounds read of triangleUnit */
+ ap->shape.triangle[orient][3].x = 0;
+ ap->shape.triangle[orient][3].y = 0;
+ }
+ }
+
+ XSetLineAttributes(display, MI_GC(mi), 1, LineSolid, CapNotLast, JoinMiter);
+ MI_CLEARWINDOW(mi);
+ ap->painted = False;
+
+ if (MI_IS_FULLRANDOM(mi)) {
+ ap->truchet = (Bool) (LRAND() & 1);
+ ap->eyes = (Bool) (LRAND() & 1);
+ ap->sharpturn = (Bool) (LRAND() & 1);
+ } else {
+ ap->truchet = truchet;
+ ap->eyes = eyes;
+ ap->sharpturn = sharpturn;
+ }
+ if (!NRAND(NUMSTIPPLES)) {
+ getTable(mi, (int) (NRAND(NTABLES)));
+ } else
+ getTurk(mi, (int) (NRAND(NUMSTIPPLES - 1)));
+ if (MI_NPIXELS(mi) > 2)
+ for (i = 0; i < (int) ap->ncolors - 1; i++)
+ ap->colors[i] = (unsigned char) (NRAND(MI_NPIXELS(mi)) +
+ i * MI_NPIXELS(mi)) / ((int) (ap->ncolors - 1));
+ if (ap->ants == NULL) {
+ if ((ap->ants = (antstruct *) malloc(ap->n * sizeof (antstruct))) ==
+ NULL) {
+ free_ant(mi);
+ return;
+ }
+ }
+ if (ap->tape != NULL)
+ (void) free((void *) ap->tape);
+ if ((ap->tape = (unsigned char *) calloc(ap->ncols * ap->nrows,
+ sizeof (unsigned char))) == NULL) {
+ free_ant(mi);
+ return;
+ }
+ if (ap->truchet_state != NULL)
+ (void) free((void *) ap->truchet_state);
+ if ((ap->truchet_state = (unsigned char *) calloc(ap->ncols * ap->nrows,
+ sizeof (unsigned char))) == NULL) {
+ free_ant(mi);
+ return;
+ }
+
+ row = ap->nrows / 2;
+ col = ap->ncols / 2;
+ if (col > 0 && ((ap->neighbors % 2) || ap->neighbors == 12) && (LRAND() & 1))
+ col--;
+ dir = NRAND(ap->neighbors) * ANGLES / ap->neighbors;
+ ap->init_dir = dir;
+#ifdef NUMBER_9
+ if (ap->neighbors == 9 && !((col + row) & 1))
+ dir = (dir + ANGLES - ANGLES / (ap->neighbors * 2)) % ANGLES;
+#endif
+ /* Have them all start in the same spot, why not? */
+ for (i = 0; i < ap->n; i++) {
+ ap->ants[i].col = col;
+ ap->ants[i].row = row;
+ ap->ants[i].direction = dir;
+ ap->ants[i].state = 0;
+ }
+ draw_anant(mi, dir, col, row);
+}
+
+ENTRYPOINT void
+draw_ant(ModeInfo * mi)
+{
+ antstruct *anant;
+ statestruct *status;
+ int i, state_pos, tape_pos;
+ unsigned char color;
+ short chg_dir, old_dir;
+ antfarmstruct *ap;
+
+ if (antfarms == NULL)
+ return;
+ ap = &antfarms[MI_SCREEN(mi)];
+ if (ap->ants == NULL)
+ return;
+
+ MI_IS_DRAWN(mi) = True;
+ ap->painted = True;
+ for (i = 0; i < ap->n; i++) {
+ anant = &ap->ants[i];
+ tape_pos = anant->col + anant->row * ap->ncols;
+ color = ap->tape[tape_pos]; /* read tape */
+ state_pos = color + anant->state * ap->ncolors;
+ status = &(ap->machine[state_pos]);
+ drawcell(mi, anant->col, anant->row, status->color);
+ ap->tape[tape_pos] = status->color; /* write on tape */
+
+ /* Find direction of Bees or Ants. */
+ /* Translate relative direction to actual direction */
+ old_dir = anant->direction;
+ chg_dir = (2 * ANGLES - status->direction) % ANGLES;
+ anant->direction = (chg_dir + old_dir) % ANGLES;
+ if (ap->truchet) {
+ int a = 0, b;
+
+ if (ap->neighbors == 6) {
+ if (ap->sharpturn) {
+ a = (((ANGLES + anant->direction - old_dir) % ANGLES) == 240);
+ /* should be some way of getting rid of the init_dir dependency... */
+ b = !(ap->init_dir % 120);
+ a = ((a && !b) || (b && !a));
+ drawtruchet(mi, anant->col, anant->row, status->color, a);
+ } else {
+ a = (old_dir / 60) % 3;
+ b = (anant->direction / 60) % 3;
+ a = (a + b + 1) % 3;
+ drawtruchet(mi, anant->col, anant->row, status->color, a);
+ }
+ } else if (ap->neighbors == 4) {
+ a = old_dir / 180;
+ b = anant->direction / 180;
+ a = ((a && !b) || (b && !a));
+ drawtruchet(mi, anant->col, anant->row, status->color, a);
+ } else if (ap->neighbors == 3) {
+ if (chg_dir == 240)
+ a = (2 + anant->direction / 120) % 3;
+ else
+ a = (1 + anant->direction / 120) % 3;
+ drawtruchet(mi, anant->col, anant->row, status->color, a);
+ }
+ ap->truchet_state[tape_pos] = a + 1;
+ }
+ anant->state = status->next;
+
+ /* Allow step first and turn */
+ old_dir = ((status->direction < ANGLES) ? anant->direction : old_dir);
+#if DEBUG
+ (void) printf("old_dir %d, col %d, row %d", old_dir, anant->col, anant->row);
+#endif
+ position_of_neighbor(ap, old_dir, &(anant->col), &(anant->row));
+#if DEBUG
+ (void) printf(", ncol %d, nrow %d\n", anant->col, anant->row);
+#endif
+ draw_anant(mi, anant->direction, anant->col, anant->row);
+ }
+ if (++ap->generation > MI_CYCLES(mi)) {
+ init_ant(mi);
+ }
+ if (ap->redrawing) {
+ for (i = 0; i < REDRAWSTEP; i++) {
+ if (ap->tape[ap->redrawpos] ||
+ (ap->truchet && ap->truchet_state[ap->redrawpos])) {
+ drawcell(mi, ap->redrawpos % ap->ncols, ap->redrawpos / ap->ncols,
+ ap->tape[ap->redrawpos]);
+ if (ap->truchet)
+ drawtruchet(mi, ap->redrawpos % ap->ncols, ap->redrawpos / ap->ncols,
+ ap->tape[ap->redrawpos],
+ ap->truchet_state[ap->redrawpos] - 1);
+ }
+ if (++(ap->redrawpos) >= ap->ncols * ap->nrows) {
+ ap->redrawing = 0;
+ break;
+ }
+ }
+ }
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_ant(ModeInfo * mi)
+{
+ antfarmstruct *ap;
+
+ if (antfarms == NULL)
+ return;
+ ap = &antfarms[MI_SCREEN(mi)];
+
+ if (ap->painted) {
+ MI_CLEARWINDOW(mi);
+ ap->redrawing = 1;
+ ap->redrawpos = 0;
+ }
+}
+#endif
+
+XSCREENSAVER_MODULE ("Ant", ant)
+
+#endif /* MODE_ant */
diff --git a/hacks/ant.man b/hacks/ant.man
new file mode 100644
index 0000000..fb71d57
--- /dev/null
+++ b/hacks/ant.man
@@ -0,0 +1,96 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+ant - cellular automaton.
+.SH SYNOPSIS
+.B ant
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-install]
+[\-noinstall]
+[\-root]
+[\-eyes]
+[\-no-eyes]
+[\-truchet]
+[\-no-truchet]
+[\-sharpturn]
+[\-no-sharpturn]
+[\-delay \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-count \fInumber\fP]
+[\-size \fInumber\fP]
+[\-neighbors 3]
+[\-neighbors 4]
+[\-neighbors 6]
+[\-neighbors 9]
+[\-neighbors 12]
+[\-ncolors \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+A cellular automaton that is really a two-dimensional Turing machine: as
+the heads ("ants") walk along the screen, they change pixel values in
+their path. Then, as they pass over changed pixels, their behavior is
+influenced.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-sharpturns | \-no-sharpturns
+Whether to do sharp turns.
+.TP 8
+.B \-truchet | \-no-truchet
+Whether to use truchet lines.
+.TP 8
+.B \-eyes | \-no-eyes
+Whether to draw eyes on the ants.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 1000 (0.0001 seconds.).
+.TP 8
+.B \-cycles \fInumber\fP
+How long to wait until resetting. 0 - 800000. Default: 40000.
+.TP 8
+.B \-count \fInumber\fP
+Ants Count. -20 - 20. Default: -3.
+.TP 8
+.B \-size \fInumber\fP
+Ant Size. -18 - 18. Default: -12.
+.TP 8
+.B \-neighbors \fIN\fP
+How many neighbors each cell has. Legal values are 3, 4, 6, 9, and 12.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of colors. Default: 64.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by David Bagley. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+David Bagley.
diff --git a/hacks/apollonian.c b/hacks/apollonian.c
new file mode 100644
index 0000000..4b28ac3
--- /dev/null
+++ b/hacks/apollonian.c
@@ -0,0 +1,810 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* apollonian --- Apollonian Circles */
+
+#if 0
+static const char sccsid[] = "@(#)apollonian.c 5.02 2001/07/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 2000, 2001 by Allan R. Wilks <allan@research.att.com>.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * radius r = 1 / c (curvature)
+ *
+ * Descartes Circle Theorem: (a, b, c, d are curvatures of tangential circles)
+ * Let a, b, c, d be the curvatures of for mutually (externally) tangent
+ * circles in the plane. Then
+ * a^2 + b^2 + c^2 + d^2 = (a + b + c + d)^2 / 2
+ *
+ * Complex Descartes Theorem: If the oriented curvatues and (complex) centers
+ * of an oriented Descrates configuration in the plane are a, b, c, d and
+ * w, x, y, z respectively, then
+ * a^2*w^2 + b^2*x^2 + c^2*y^2 + d^2*z^2 = (aw + bx + cy + dz)^2 / 2
+ * In addition these quantities satisfy
+ * a^2*w + b^2*x + c^2*y + d^2*z = (aw + bx + cy + dz)(a + b + c + d) / 2
+ *
+ * Enumerate root integer Descartes quadruples (a,b,c,d) satisfying the
+ * Descartes condition:
+ * 2(a^2+b^2+c^2+d^2) = (a+b+c+d)^2
+ * i.e., quadruples for which no application of the "pollinate" operator
+ * z <- 2(a+b+c+d) - 3*z,
+ * where z is in {a,b,c,d}, gives a quad of strictly smaller sum. This
+ * is equivalent to the condition:
+ * sum(a,b,c,d) >= 2*max(a,b,c,d)
+ * which, because of the Descartes condition, is equivalent to
+ * sum(a^2,b^2,c^2,d^2) >= 2*max(a,b,c,d)^2
+ *
+ *
+ * Todo:
+ * Add a small font
+ *
+ * Revision History:
+ * 25-Jun-2001: Converted from C and Postscript code by David Bagley
+ * Original code by Allan R. Wilks <allan@research.att.com>.
+ *
+ * From Circle Math Science News April 21, 2001 VOL. 254-255
+ * http://www.sciencenews.org/20010421/toc.asp
+ * Apollonian Circle Packings Assorted papers from Ronald L Graham,
+ * Jeffrey Lagarias, Colin Mallows, Allan Wilks, Catherine Yan
+ * http://front.math.ucdavis.edu/math.NT/0009113
+ * http://front.math.ucdavis.edu/math.MG/0101066
+ * http://front.math.ucdavis.edu/math.MG/0010298
+ * http://front.math.ucdavis.edu/math.MG/0010302
+ * http://front.math.ucdavis.edu/math.MG/0010324
+ */
+
+#ifdef STANDALONE
+# define MODE_apollonian
+# define DEFAULTS "*delay: 1000000 \n" \
+ "*count: 64 \n" \
+ "*cycles: 20 \n" \
+ "*ncolors: 64 \n" \
+ "*font: fixed" "\n" \
+ "*fpsTop: true \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True" \
+
+# define release_apollonian 0
+# define reshape_apollonian 0
+# define apollonian_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_apollonian
+
+#define DEF_ALTGEOM "True"
+#define DEF_LABEL "True"
+
+static Bool altgeom;
+static Bool label;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-altgeom", ".apollonian.altgeom", XrmoptionNoArg, "on"},
+ {"+altgeom", ".apollonian.altgeom", XrmoptionNoArg, "off"},
+ {"-label", ".apollonian.label", XrmoptionNoArg, "on"},
+ {"+label", ".apollonian.label", XrmoptionNoArg, "off"},
+};
+static argtype vars[] =
+{
+ {&altgeom, "altgeom", "AltGeom", DEF_ALTGEOM, t_Bool},
+ {&label, "label", "Label", DEF_LABEL, t_Bool},
+};
+static OptionStruct desc[] =
+{
+ {"-/+altgeom", "turn on/off alternate geometries (off euclidean space, on includes spherical and hyperbolic)"},
+ {"-/+label", "turn on/off alternate space and number labeling"},
+};
+
+ENTRYPOINT ModeSpecOpt apollonian_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef DOFONT
+extern XFontStruct *getFont(Display * display);
+#endif
+
+#ifdef USE_MODULES
+ModStruct apollonian_description =
+{"apollonian", "init_apollonian", "draw_apollonian", (char *) NULL,
+ "init_apollonian", "init_apollonian", "free_apollonian", &apollonian_opts,
+ 1000000, 64, 20, 1, 64, 1.0, "",
+ "Shows Apollonian Circles", 0, NULL};
+
+#endif
+
+typedef struct {
+ int a, b, c, d;
+} apollonian_quadruple;
+
+typedef struct {
+ double e; /* euclidean bend */
+ double s; /* spherical bend */
+ double h; /* hyperbolic bend */
+ double x, y; /* euclidean bend times euclidean position */
+} circle;
+enum space {
+ euclidean = 0, spherical, hyperbolic
+};
+
+static const char * space_string[] = {
+ "euclidean",
+ "spherical",
+ "hyperbolic"
+};
+
+/*
+Generate Apollonian packing starting with a quadruple of circles.
+The four input lines each contain the 5-tuple (e,s,h,x,y) representing
+the circle with radius 1/e and center (x/e,y/e). The s and h is propagated
+like e, x and y, but can differ from e so as to represent different
+geometries, spherical and hyperbolic, respectively. The "standard" picture,
+for example (-1, 2, 2, 3), can be labeled for the three geometries.
+Origins of circles z1, z2, z3, z4
+a * z1 = 0
+b * z2 = (a+b)/a
+c * z3 = (q123 + a * i)^2/(a*(a+b)) where q123 = sqrt(a*b+a*c+b*c)
+d * z4 = (q124 + a * i)^2/(a*(a+b)) where q124 = q123 - a - b
+If (e,x,y) represents the Euclidean circle (1/e,x/e,y/e) (so that e is
+the label in the standard picture) then the "spherical label" is
+(e^2+x^2+y^2-1)/(2*e) (an integer!) and the "hyperbolic label", is
+calulated by h + s = e.
+*/
+static circle examples[][4] = {
+{ /* double semi-bounded */
+ { 0, 0, 0, 0, 1},
+ { 0, 0, 0, 0, -1},
+ { 1, 1, 1, -1, 0},
+ { 1, 1, 1, 1, 0}
+},
+#if 0
+{ /* standard */
+ {-1, 0, -1, 0, 0},
+ { 2, 1, 1, 1, 0},
+ { 2, 1, 1, -1, 0},
+ { 3, 2, 1, 0, 2}
+},
+{ /* next simplest */
+ {-2, -1, -1, 0.0, 0},
+ { 3, 2, 1, 0.5, 0},
+ { 6, 3, 3, -2.0, 0},
+ { 7, 4, 3, -1.5, 2}
+},
+{ /* */
+ {-3, -2, -1, 0.0, 0},
+ { 4, 3, 1, 1.0 / 3.0, 0},
+ {12, 7, 5, -3.0, 0},
+ {13, 8, 5, -8.0 / 3.0, 2}
+},
+{ /* Mickey */
+ {-3, -2, -1, 0.0, 0},
+ { 5, 4, 1, 2.0 / 3.0, 0},
+ { 8, 5, 3, -4.0 / 3.0, -1},
+ { 8, 5, 3, -4.0 / 3.0, 1}
+},
+{ /* */
+ {-4, -3, -1, 0.00, 0},
+ { 5, 4, 1, 0.25, 0},
+ {20, 13, 7, -4.00, 0},
+ {21, 14, 7, -3.75, 2}
+},
+{ /* Mickey2 */
+ {-4, -2, -2, 0.0, 0},
+ { 8, 4, 4, 1.0, 0},
+ { 9, 5, 4, -0.75, -1},
+ { 9, 5, 4, -0.75, 1}
+},
+{ /* Mickey3 */
+ {-5, -4, -1, 0.0, 0},
+ { 7, 6, 1, 0.4, 0},
+ {18, 13, 5, -2.4, -1},
+ {18, 13, 5, -2.4, 1}
+},
+{ /* */
+ {-6, -5, -1, 0.0, 0},
+ { 7, 6, 1, 1.0 / 6.0, 0},
+ {42, 31, 11, -6.0, 0},
+ {43, 32, 11, -35.0 / 6.0, 2}
+},
+{ /* */
+ {-6, -3, -3, 0.0, 0},
+ {10, 5, 5, 2.0 / 3.0, 0},
+ {15, 8, 7, -1.5, 0},
+ {19, 10, 9, -5.0 / 6.0, 2}
+},
+{ /* asymmetric */
+ {-6, -5, -1, 0.0, 0.0},
+ {11, 10, 1, 5.0 / 6.0, 0.0},
+ {14, 11, 3, -16.0 / 15.0, -0.8},
+ {15, 12, 3, -0.9, 1.2}
+},
+#endif
+/* Non integer stuff */
+#define DELTA 2.154700538 /* ((3+2*sqrt(3))/3) */
+{ /* 3 fold symmetric bounded (x, y calculated later) */
+ { -1, -1, -1, 0.0, 0.0},
+ {DELTA, DELTA, DELTA, 1.0, 0.0},
+ {DELTA, DELTA, DELTA, 1.0, -1.0},
+ {DELTA, DELTA, DELTA, -1.0, 1.0}
+},
+{ /* semi-bounded (x, y calculated later) */
+#define ALPHA 2.618033989 /* ((3+sqrt(5))/2) */
+ { 1.0, 1.0, 1.0, 0, 0},
+ { 0.0, 0.0, 0.0, 0, -1},
+ {1.0/(ALPHA*ALPHA), 1.0/(ALPHA*ALPHA), 1.0/(ALPHA*ALPHA), -1, 0},
+ { 1.0/ALPHA, 1.0/ALPHA, 1.0/ALPHA, -1, 0}
+},
+{ /* unbounded (x, y calculated later) */
+/* #define PHI 1.618033989 *//* ((1+sqrt(5))/2) */
+#define BETA 2.890053638 /* (PHI+sqrt(PHI)) */
+ { 1.0, 1.0, 1.0, 0, 0},
+ {1.0/(BETA*BETA*BETA), 1.0/(BETA*BETA*BETA), 1.0/(BETA*BETA*BETA), 1, 0},
+ { 1.0/(BETA*BETA), 1.0/(BETA*BETA), 1.0/(BETA*BETA), 1, 0},
+ { 1.0/BETA, 1.0/BETA, 1.0/BETA, 1, 0}
+}
+};
+
+#define PREDEF_CIRCLE_GAMES (sizeof (examples) / (4 * sizeof (circle)))
+
+#if 0
+Euclidean
+0, 0, 1, 1
+-1, 2, 2, 3
+-2, 3, 6, 7
+-3, 5, 8, 8
+-4, 8, 9, 9
+-3, 4, 12, 13
+-6, 11, 14, 15
+ -5, 7, 18, 18
+ -6, 10, 15, 19
+ -7, 12, 17, 20
+ -4, 5, 20, 21
+ -9, 18, 19, 22
+ -8, 13, 21, 24
+Spherical
+0, 1, 1, 2
+ -1, 2, 3, 4
+ -2, 4, 5, 5
+ -2, 3, 7, 8
+Hyperbolic
+-1, 1, 1, 1
+ 0, 0, 1, 3
+ -2, 3, 5, 6
+ -3, 6, 6, 7
+#endif
+
+typedef struct {
+ int size;
+ XPoint offset;
+ int geometry;
+ circle c1, c2, c3, c4;
+ int color_offset;
+ int count;
+ Bool label, altgeom;
+ apollonian_quadruple *quad;
+#ifdef DOFONT
+ XFontStruct *font;
+#endif
+ int time;
+ int game;
+} apollonianstruct;
+
+static apollonianstruct *apollonians = (apollonianstruct *) NULL;
+
+#define FONT_HEIGHT 19
+#define FONT_WIDTH 15
+#define FONT_LENGTH 20
+#define MAX_CHAR 10
+#define K 2.15470053837925152902 /* 1+2/sqrt(3) */
+#define MAXBEND 100 /* Do not want configurable by user since it will take too
+ much time if increased. */
+
+static int
+gcd(int a, int b)
+{
+ int r;
+
+ while (b) {
+ r = a % b;
+ a = b;
+ b = r;
+ }
+ return a;
+}
+
+static int
+isqrt(int n)
+{
+ int y;
+
+ if (n < 0)
+ return -1;
+ y = (int) (sqrt((double) n) + 0.5);
+ return ((n == y*y) ? y : -1);
+}
+
+static void
+dquad(int n, apollonian_quadruple *quad)
+{
+ int a, b, c, d;
+ int counter = 0, B, C;
+
+ for (a = 0; a < MAXBEND; a++) {
+ B = (int) (K * a);
+ for (b = a + 1; b <= B; b++) {
+ C = (int) (((a + b) * (a + b)) / (4.0 * (b - a)));
+ for (c = b; c <= C; c++) {
+ d = isqrt(b*c-a*(b+c));
+ if (d >= 0 && (gcd(a,gcd(b,c)) <= 1)) {
+ quad[counter].a = -a;
+ quad[counter].b = b;
+ quad[counter].c = c;
+ quad[counter].d = -a+b+c-2*d;
+ if (++counter >= n) {
+ return;
+ }
+ }
+ }
+ }
+ }
+ (void) printf("found only %d below maximum bend of %d\n",
+ counter, MAXBEND);
+ for (; counter < n; counter++) {
+ quad[counter].a = -1;
+ quad[counter].b = 2;
+ quad[counter].c = 2;
+ quad[counter].d = 3;
+ }
+ return;
+}
+
+/*
+ * Given a Descartes quadruple of bends (a,b,c,d), with a<0, find a
+ * quadruple of circles, represented by (bend,bend*x,bend*y), such
+ * that the circles have the given bends and the bends times the
+ * centers are integers.
+ *
+ * This just performs an exaustive search, assuming that the outer
+ * circle has center in the unit square.
+ *
+ * It is always sufficient to look in {(x,y):0<=y<=x<=1/2} for the
+ * center of the outer circle, but this may not lead to a packing
+ * that can be labelled with integer spherical and hyperbolic labels.
+ * To effect the smaller search, replace FOR(a) with
+ *
+ * for (pa = ea/2; pa <= 0; pa++) for (qa = pa; qa <= 0; qa++)
+ */
+
+#define For(v,l,h) for (v = l; v <= h; v++)
+#define FOR(z) For(p##z,lop##z,hip##z) For(q##z,loq##z,hiq##z)
+#define H(z) ((e##z*e##z+p##z*p##z+q##z*q##z)%2)
+#define UNIT(z) ((abs(e##z)-1)*(abs(e##z)-1) >= p##z*p##z+q##z*q##z)
+#define T(z,w) is_tangent(e##z,p##z,q##z,e##w,p##w,q##w)
+#define LO(r,z) lo##r##z = iceil(e##z*(r##a+1),ea)-1
+#define HI(r,z) hi##r##z = iflor(e##z*(r##a-1),ea)-1
+#define B(z) LO(p,z); HI(p,z); LO(q,z); HI(q,z)
+
+static int
+is_quad(int a, int b, int c, int d)
+{
+ int s;
+
+ s = a+b+c+d;
+ return 2*(a*a+b*b+c*c+d*d) == s*s;
+}
+
+static Bool
+is_tangent(int e1, int p1, int q1, int e2, int p2, int q2)
+{
+ int dx, dy, s;
+
+ dx = p1*e2 - p2*e1;
+ dy = q1*e2 - q2*e1;
+ s = e1 + e2;
+ return dx*dx + dy*dy == s*s;
+}
+
+static int
+iflor(int a, int b)
+{
+ int q;
+
+ if (b == 0) {
+ (void) printf("iflor: b = 0\n");
+ return 0;
+ }
+ if (a%b == 0)
+ return a/b;
+ q = abs(a)/abs(b);
+ return ((a<0)^(b<0)) ? -q-1 : q;
+}
+
+static int
+iceil(int a, int b)
+{
+ int q;
+
+ if (b == 0) {
+ (void) printf("iceil: b = 0\n");
+ return 0;
+ }
+ if (a%b == 0)
+ return a/b;
+ q = abs(a)/abs(b);
+ return ((a<0)^(b<0)) ? -q : 1+q;
+}
+
+static double
+geom(int geometry, int e, int p, int q)
+{
+ int g = (geometry == spherical) ? -1 :
+ (geometry == hyperbolic) ? 1 : 0;
+
+ if (g)
+ return (e*e + (1.0 - p*p - q*q) * g) / (2.0*e);
+ (void) printf("geom: g = 0\n");
+ return e;
+}
+
+static void
+cquad(circle *c1, circle *c2, circle *c3, circle *c4)
+{
+ int ea, eb, ec, ed;
+ int pa, pb, pc, pd;
+ int qa, qb, qc, qd;
+ int lopa, lopb, lopc, lopd;
+ int hipa, hipb, hipc, hipd;
+ int loqa, loqb, loqc, loqd;
+ int hiqa, hiqb, hiqc, hiqd;
+
+ ea = (int) c1->e;
+ eb = (int) c2->e;
+ ec = (int) c3->e;
+ ed = (int) c4->e;
+ if (ea >= 0)
+ (void) printf("ea = %d\n", ea);
+ if (!is_quad(ea,eb,ec,ed))
+ (void) printf("Error not quad %d %d %d %d\n", ea, eb, ec, ed);
+ lopa = loqa = ea;
+ hipa = hiqa = 0;
+ FOR(a) {
+ B(b); B(c); B(d);
+ if (H(a) && UNIT(a)) FOR(b) {
+ if (H(b) && T(a,b)) FOR(c) {
+ if (H(c) && T(a,c) && T(b,c)) FOR(d) {
+ if (H(d) && T(a,d) && T(b,d) && T(c,d)) {
+ c1->s = geom(spherical, ea, pa, qa);
+ c1->h = geom(hyperbolic, ea, pa, qa);
+ c2->s = geom(spherical, eb, pb, qb);
+ c2->h = geom(hyperbolic, eb, pb, qb);
+ c3->s = geom(spherical, ec, pc, qc);
+ c3->h = geom(hyperbolic, ec, pc, qc);
+ c4->s = geom(spherical, ed, pd, qd);
+ c4->h = geom(hyperbolic, ed, pd, qd);
+ }
+ }
+ }
+ }
+ }
+}
+
+static void
+p(ModeInfo *mi, circle c)
+{
+ apollonianstruct *cp = &apollonians[MI_SCREEN(mi)];
+ char string[15];
+ double g, e;
+ int g_width;
+
+#ifdef DEBUG
+ (void) printf("c.e=%g c.s=%g c.h=%g c.x=%g c.y=%g\n",
+ c.e, c.s, c.h, c.x, c.y);
+#endif
+ g = (cp->geometry == spherical) ? c.s : (cp->geometry == hyperbolic) ?
+ c.h : c.e;
+ if (c.e < 0.0) {
+ if (g < 0.0)
+ g = -g;
+ if (MI_NPIXELS(mi) <= 2)
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
+ MI_WHITE_PIXEL(mi));
+ else
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
+ MI_PIXEL(mi, ((int) ((g + cp->color_offset) *
+ g)) % MI_NPIXELS(mi)));
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ ((int) (cp->size * (-cp->c1.e) * (c.x - 1.0) /
+ (-2.0 * c.e) + cp->size / 2.0 + cp->offset.x)),
+ ((int) (cp->size * (-cp->c1.e) * (c.y - 1.0) /
+ (-2.0 * c.e) + cp->size / 2.0 + cp->offset.y)),
+ (int) (cp->c1.e * cp->size / c.e),
+ (int) (cp->c1.e * cp->size / c.e), 0, 23040);
+ if (!cp->label) {
+#ifdef DEBUG
+ (void) printf("%g\n", -g);
+#endif
+ return;
+ }
+ (void) sprintf(string, "%g", (g == 0.0) ? 0 : -g);
+ if (cp->size >= 10 * FONT_WIDTH) {
+ /* hard code these to corners */
+ XDrawString(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ ((int) (cp->size * c.x / (2.0 * c.e))) + cp->offset.x,
+ ((int) (cp->size * c.y / (2.0 * c.e))) + FONT_HEIGHT,
+ string, (g == 0.0) ? 1 : ((g < 10.0) ? 2 :
+ ((g < 100.0) ? 3 : 4)));
+ }
+ if (cp->altgeom && MI_HEIGHT(mi) >= 30 * FONT_WIDTH) {
+ XDrawString(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ ((int) (cp->size * c.x / (2.0 * c.e) + cp->offset.x)),
+ ((int) (cp->size * c.y / (2.0 * c.e) + MI_HEIGHT(mi) -
+ FONT_HEIGHT / 2)), (char *) space_string[cp->geometry],
+ strlen(space_string[cp->geometry]));
+ }
+ return;
+ }
+ if (MI_NPIXELS(mi) <= 2)
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+ else
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
+ MI_PIXEL(mi, ((int) ((g + cp->color_offset) * g)) %
+ MI_NPIXELS(mi)));
+ if (c.e == 0.0) {
+ if (c.x == 0.0 && c.y != 0.0) {
+ XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ 0, (int) ((c.y + 1.0) * cp->size / 2.0 + cp->offset.y),
+ MI_WIDTH(mi),
+ (int) ((c.y + 1.0) * cp->size / 2.0 + cp->offset.y));
+ } else if (c.y == 0.0 && c.x != 0.0) {
+ XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ (int) ((c.x + 1.0) * cp->size / 2.0 + cp->offset.x), 0,
+ (int) ((c.x + 1.0) * cp->size / 2.0 + cp->offset.x),
+ MI_HEIGHT(mi));
+ }
+ return;
+ }
+ e = (cp->c1.e >= 0.0) ? 1.0 : -cp->c1.e;
+ XFillArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ ((int) (cp->size * e * (c.x - 1.0) / (2.0 * c.e) +
+ cp->size / 2.0 + cp->offset.x)),
+ ((int) (cp->size * e * (c.y - 1.0) / (2.0 * c.e) +
+ cp->size / 2.0 + cp->offset.y)),
+ (int) (e * cp->size / c.e), (int) (e * cp->size / c.e),
+ 0, 23040);
+ if (!cp->label) {
+#ifdef DEBUG
+ (void) printf("%g\n", g);
+#endif
+ return;
+ }
+ if (MI_NPIXELS(mi) <= 2)
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ else
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
+ MI_PIXEL(mi, ((int) ((g + cp->color_offset) * g) +
+ MI_NPIXELS(mi) / 2) % MI_NPIXELS(mi)));
+ g_width = (g < 10.0) ? 1: ((g < 100.0) ? 2 : 3);
+ if (c.e < e * cp->size / (FONT_LENGTH + 5 * g_width) && g < 1000.0) {
+ (void) sprintf(string, "%g", g);
+ XDrawString(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ ((int) (cp->size * e * c.x / (2.0 * c.e) +
+ cp->size / 2.0 + cp->offset.x)) -
+ g_width * FONT_WIDTH / 2,
+ ((int) (cp->size * e * c.y / (2.0 * c.e) +
+ cp->size / 2.0 + cp->offset.y)) +
+ FONT_HEIGHT / 2,
+ string, g_width);
+ }
+}
+
+#define BIG 7
+static void
+f(ModeInfo *mi, circle c1, circle c2, circle c3, circle c4, int depth)
+{
+ apollonianstruct *cp = &apollonians[MI_SCREEN(mi)];
+ int e = (int) ((cp->c1.e >= 0.0) ? 1.0 : -cp->c1.e);
+ circle c;
+
+ if (depth > mi->recursion_depth) mi->recursion_depth = depth;
+
+ c.e = 2*(c1.e+c2.e+c3.e) - c4.e;
+ c.s = 2*(c1.s+c2.s+c3.s) - c4.s;
+ c.h = 2*(c1.h+c2.h+c3.h) - c4.h;
+ c.x = 2*(c1.x+c2.x+c3.x) - c4.x;
+ c.y = 2*(c1.y+c2.y+c3.y) - c4.y;
+ if (c.e == 0 ||
+ c.e > cp->size * e || c.x / c.e > BIG || c.y / c.e > BIG ||
+ c.x / c.e < -BIG || c.y / c.e < -BIG)
+ return;
+ p(mi, c);
+ f(mi, c2, c3, c, c1, depth+1);
+ f(mi, c1, c3, c, c2, depth+1);
+ f(mi, c1, c2, c, c3, depth+1);
+}
+
+ENTRYPOINT void
+free_apollonian (ModeInfo * mi)
+{
+ apollonianstruct *cp = &apollonians[MI_SCREEN(mi)];
+
+ if (cp->quad != NULL) {
+ (void) free((void *) cp->quad);
+ cp->quad = (apollonian_quadruple *) NULL;
+ }
+#ifdef DOFONT
+ if (cp->gc != None) {
+ XFreeGC(display, cp->gc);
+ cp->gc = None;
+ }
+ if (cp->font != None) {
+ XFreeFont(display, cp->font);
+ cp->font = None;
+ }
+#endif
+}
+
+#ifndef DEBUG
+static void
+randomize_c(int randomize, circle * c)
+{
+ if (randomize / 2) {
+ double temp;
+
+ temp = c->x;
+ c->x = c->y;
+ c->y = temp;
+ }
+ if (randomize % 2) {
+ c->x = -c->x;
+ c->y = -c->y;
+ }
+}
+#endif
+
+ENTRYPOINT void
+init_apollonian (ModeInfo * mi)
+{
+ apollonianstruct *cp;
+ int i;
+
+ MI_INIT (mi, apollonians);
+ cp = &apollonians[MI_SCREEN(mi)];
+
+ cp->size = MAX(MIN(MI_WIDTH(mi), MI_HEIGHT(mi)) - 1, 1);
+ cp->offset.x = (MI_WIDTH(mi) - cp->size) / 2;
+ cp->offset.y = (MI_HEIGHT(mi) - cp->size) / 2;
+ cp->color_offset = NRAND(MI_NPIXELS(mi));
+
+#ifdef DOFONT
+ if (cp->font == None) {
+ if ((cp->font = getFont(MI_DISPLAY(mi))) == None)
+ return False;
+ }
+#endif
+ cp->label = label;
+ cp->altgeom = cp->label && altgeom;
+
+ if (cp->quad == NULL) {
+ cp->count = ABS(MI_COUNT(mi));
+ if ((cp->quad = (apollonian_quadruple *) malloc(cp->count *
+ sizeof (apollonian_quadruple))) == NULL) {
+ return;
+ }
+ dquad(cp->count, cp->quad);
+ }
+ cp->game = NRAND(PREDEF_CIRCLE_GAMES + cp->count);
+ cp->geometry = (cp->game && cp->altgeom) ? NRAND(3) : 0;
+
+ if (cp->game < PREDEF_CIRCLE_GAMES) {
+ cp->c1 = examples[cp->game][0];
+ cp->c2 = examples[cp->game][1];
+ cp->c3 = examples[cp->game][2];
+ cp->c4 = examples[cp->game][3];
+ /* do not label non int */
+ cp->label = cp->label && (cp->c4.e == (int) cp->c4.e);
+ } else { /* uses results of dquad, all int */
+ i = cp->game - PREDEF_CIRCLE_GAMES;
+ cp->c1.e = cp->quad[i].a;
+ cp->c2.e = cp->quad[i].b;
+ cp->c3.e = cp->quad[i].c;
+ cp->c4.e = cp->quad[i].d;
+ if (cp->geometry)
+ cquad(&(cp->c1), &(cp->c2), &(cp->c3), &(cp->c4));
+ }
+ cp->time = 0;
+ MI_CLEARWINDOW(mi);
+ if (cp->game != 0) {
+ double q123;
+
+ if (cp->c1.e == 0.0 || cp->c1.e == -cp->c2.e)
+ return;
+ cp->c1.x = 0.0;
+ cp->c1.y = 0.0;
+ cp->c2.x = -(cp->c1.e + cp->c2.e) / cp->c1.e;
+ cp->c2.y = 0;
+ q123 = sqrt(cp->c1.e * cp->c2.e + cp->c1.e * cp->c3.e +
+ cp->c2.e * cp->c3.e);
+#ifdef DEBUG
+ (void) printf("q123 = %g, ", q123);
+#endif
+ cp->c3.x = (cp->c1.e * cp->c1.e - q123 * q123) / (cp->c1.e *
+ (cp->c1.e + cp->c2.e));
+ cp->c3.y = -2.0 * q123 / (cp->c1.e + cp->c2.e);
+ q123 = -cp->c1.e - cp->c2.e + q123;
+ cp->c4.x = (cp->c1.e * cp->c1.e - q123 * q123) / (cp->c1.e *
+ (cp->c1.e + cp->c2.e));
+ cp->c4.y = -2.0 * q123 / (cp->c1.e + cp->c2.e);
+#ifdef DEBUG
+ (void) printf("q124 = %g\n", q123);
+ (void) printf("%g %g %g %g %g %g %g %g\n",
+ cp->c1.x, cp->c1.y, cp->c2.x, cp->c2.y,
+ cp->c3.x, cp->c3.y, cp->c4.x, cp->c4.y);
+#endif
+ }
+#ifndef DEBUG
+ if (LRAND() & 1) {
+ cp->c3.y = -cp->c3.y;
+ cp->c4.y = -cp->c4.y;
+ }
+ i = NRAND(4);
+ randomize_c(i, &(cp->c1));
+ randomize_c(i, &(cp->c2));
+ randomize_c(i, &(cp->c3));
+ randomize_c(i, &(cp->c4));
+#endif
+
+ mi->recursion_depth = -1;
+}
+
+ENTRYPOINT void
+draw_apollonian (ModeInfo * mi)
+{
+ apollonianstruct *cp;
+
+ if (apollonians == NULL)
+ return;
+ cp = &apollonians[MI_SCREEN(mi)];
+
+
+ MI_IS_DRAWN(mi) = True;
+
+ if (cp->time < 5) {
+ switch (cp->time) {
+ case 0:
+ p(mi, cp->c1);
+ p(mi, cp->c2);
+ p(mi, cp->c3);
+ p(mi, cp->c4);
+ break;
+ case 1:
+ f(mi, cp->c1, cp->c2, cp->c3, cp->c4, 0);
+ break;
+ case 2:
+ f(mi, cp->c1, cp->c2, cp->c4, cp->c3, 0);
+ break;
+ case 3:
+ f(mi, cp->c1, cp->c3, cp->c4, cp->c2, 0);
+ break;
+ case 4:
+ f(mi, cp->c2, cp->c3, cp->c4, cp->c1, 0);
+ }
+ }
+ if (++cp->time > MI_CYCLES(mi))
+ init_apollonian(mi);
+}
+
+XSCREENSAVER_MODULE ("Apollonian", apollonian)
+
+#endif /* MODE_apollonian */
diff --git a/hacks/apollonian.man b/hacks/apollonian.man
new file mode 100644
index 0000000..157d109
--- /dev/null
+++ b/hacks/apollonian.man
@@ -0,0 +1,70 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+apollonian - Descartes Circle Theorem.
+.SH SYNOPSIS
+.B apollonian
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-no-label]
+[\-no-altgeom]
+[\-cycles \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Packs a large circle with smaller circles, demonstrating the Descartes
+Circle Theorem.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-label | \-no-label
+Draw Labels. Boolean.
+.TP 8
+.B \-altgeom | \-no-altgeom
+Include Alternate Geometries. Boolean.
+.TP 8
+.B \-cycles \fInumber\fP
+Depth. 1 - 20. Default: 20.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 64.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 1000000 (1.00 seconds.).
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Allan R. Wilks and David Bagley. Permission to
+use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided
+that the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation. No representations are made about the suitability of
+this software for any purpose. It is provided "as is" without express
+or implied warranty.
+.SH AUTHOR
+Allan R. Wilks and David Bagley.
diff --git a/hacks/apple2-main.c b/hacks/apple2-main.c
new file mode 100644
index 0000000..3063b58
--- /dev/null
+++ b/hacks/apple2-main.c
@@ -0,0 +1,1913 @@
+/* xscreensaver, Copyright (c) 1998-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Apple ][ CRT simulator, by Trevor Blackwell <tlb@tlb.org>
+ * with additional work by Jamie Zawinski <jwz@jwz.org>
+ * Pty and vt100 emulation by Fredrik Tolf <fredrik@dolda2000.com>
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include <math.h>
+#include <ctype.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include "screenhack.h"
+#include "apple2.h"
+#include "textclient.h"
+#include "utf8wc.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define SCREEN_COLS 40
+#define SCREEN_ROWS 24
+
+
+/* Given a bitmask, returns the position and width of the field.
+ */
+static void
+decode_mask (unsigned int mask, unsigned int *pos_ret, unsigned int *size_ret)
+{
+ int i;
+ for (i = 0; i < 32; i++)
+ if (mask & (1L << i))
+ {
+ int j = 0;
+ *pos_ret = i;
+ for (; i < 32; i++, j++)
+ if (! (mask & (1L << i)))
+ break;
+ *size_ret = j;
+ return;
+ }
+}
+
+
+/* Given a value and a field-width, expands the field to fill out 8 bits.
+ */
+static unsigned char
+spread_bits (unsigned char value, unsigned char width)
+{
+ switch (width)
+ {
+ case 8: return value;
+ case 7: return (value << 1) | (value >> 6);
+ case 6: return (value << 2) | (value >> 4);
+ case 5: return (value << 3) | (value >> 2);
+ case 4: return (value << 4) | (value);
+ case 3: return (value << 5) | (value << 2) | (value >> 2);
+ case 2: return (value << 6) | (value << 4) | (value);
+ default: abort(); break;
+ }
+}
+
+
+/* Convert an XImage (of any size/depth/visual) to a 32bpp RGB array.
+ Scales it (without dithering) to WxH.
+ */
+static void
+scale_image (Display *dpy, Window window, XImage *in,
+ int fromx, int fromy, int fromw, int fromh,
+ unsigned int *out, int w, int h)
+{
+ float scale;
+ int x, y, i;
+ unsigned int rpos=0, gpos=0, bpos=0; /* bitfield positions */
+ unsigned int rsiz=0, gsiz=0, bsiz=0;
+ unsigned long rmsk=0, gmsk=0, bmsk=0;
+ unsigned char spread_map[3][256];
+ XWindowAttributes xgwa;
+ XColor *colors = 0;
+
+ if (fromx + fromw > in->width ||
+ fromy + fromh > in->height)
+ abort();
+
+ XGetWindowAttributes (dpy, window, &xgwa);
+
+ /* Compute the field offsets for RGB decoding in the XImage,
+ when in TrueColor mode. Otherwise we use the colormap.
+ */
+ if (visual_class (xgwa.screen, xgwa.visual) == PseudoColor ||
+ visual_class (xgwa.screen, xgwa.visual) == GrayScale)
+ {
+ int ncolors = visual_cells (xgwa.screen, xgwa.visual);
+ colors = (XColor *) calloc (sizeof (*colors), ncolors+1);
+ for (i = 0; i < ncolors; i++)
+ colors[i].pixel = i;
+ XQueryColors (dpy, xgwa.colormap, colors, ncolors);
+ }
+ else
+ {
+ visual_rgb_masks (xgwa.screen, xgwa.visual, &rmsk, &gmsk, &bmsk);
+ decode_mask (rmsk, &rpos, &rsiz);
+ decode_mask (gmsk, &gpos, &gsiz);
+ decode_mask (bmsk, &bpos, &bsiz);
+
+ for (i = 0; i < 256; i++)
+ {
+ spread_map[0][i] = spread_bits (i, rsiz);
+ spread_map[1][i] = spread_bits (i, gsiz);
+ spread_map[2][i] = spread_bits (i, bsiz);
+ }
+ }
+
+ scale = (fromw > fromh
+ ? (float) fromw / w
+ : (float) fromh / h);
+
+ /* Scale the pixmap from window size to Apple][ screen size (but 32bpp)
+ */
+ for (y = 0; y < h-1; y++) /* iterate over dest pixels */
+ for (x = 0; x < w-1; x++)
+ {
+ int xx, yy;
+ unsigned int r=0, g=0, b=0;
+
+ int xx1 = x * scale + fromx;
+ int yy1 = y * scale + fromy;
+ int xx2 = (x+1) * scale + fromx;
+ int yy2 = (y+1) * scale + fromy;
+
+ /* Iterate over the source pixels contributing to this one, and sum. */
+ for (xx = xx1; xx < xx2; xx++)
+ for (yy = yy1; yy < yy2; yy++)
+ {
+ unsigned char rr, gg, bb;
+ unsigned long sp = ((xx > in->width || yy > in->height)
+ ? 0 : XGetPixel (in, xx, yy));
+ if (colors)
+ {
+ rr = colors[sp].red & 0xFF;
+ gg = colors[sp].green & 0xFF;
+ bb = colors[sp].blue & 0xFF;
+ }
+ else
+ {
+ rr = (sp & rmsk) >> rpos;
+ gg = (sp & gmsk) >> gpos;
+ bb = (sp & bmsk) >> bpos;
+ rr = spread_map[0][rr];
+ gg = spread_map[1][gg];
+ bb = spread_map[2][bb];
+ }
+ r += rr;
+ g += gg;
+ b += bb;
+ }
+
+ /* Scale summed pixel values down to 8/8/8 range */
+ i = (xx2 - xx1) * (yy2 - yy1);
+ if (i < 1) i = 1;
+ r /= i;
+ g /= i;
+ b /= i;
+
+ out[y * w + x] = (r << 16) | (g << 8) | b;
+ }
+}
+
+
+/* Convert an XImage (of any size/depth/visual) to a 32bpp RGB array.
+ Picks a random sub-image out of the source image, and scales it to WxH.
+ */
+static void
+pick_a2_subimage (Display *dpy, Window window, XImage *in,
+ unsigned int *out, int w, int h)
+{
+ int fromx, fromy, fromw, fromh;
+ if (in->width <= w || in->height <= h)
+ {
+ fromx = 0;
+ fromy = 0;
+ fromw = in->width;
+ fromh = in->height;
+ }
+ else
+ {
+ int dw, dh;
+ do {
+ double scale = (0.5 + frand(0.7) + frand(0.7) + frand(0.7));
+ fromw = w * scale;
+ fromh = h * scale;
+ } while (fromw > in->width ||
+ fromh > in->height);
+
+ dw = (in->width - fromw) / 2; /* near the center! */
+ dh = (in->height - fromh) / 2;
+
+ fromx = (dw <= 0 ? 0 : (random() % dw) + (dw/2));
+ fromy = (dh <= 0 ? 0 : (random() % dh) + (dh/2));
+ }
+
+ scale_image (dpy, window, in,
+ fromx, fromy, fromw, fromh,
+ out, w, h);
+}
+
+
+/* Floyd-Steinberg dither. Derived from ppmquant.c,
+ Copyright (c) 1989, 1991 by Jef Poskanzer.
+ */
+static void
+a2_dither (unsigned int *in, unsigned char *out, int w, int h)
+{
+ /*
+ Apple ][ color map. Each pixel can only be 1 or 0, but what that
+ means depends on whether it's an odd or even pixel, and whether
+ the high bit in the byte is set or not. If it's 0, it's always
+ black.
+ */
+ static const int a2_cmap[2][2][3] = {
+ {
+ /* hibit=0 */
+ {/* odd pixels = blue */ 0x00, 0x80, 0xff},
+ {/* even pixels = red */ 0xff, 0x80, 0x00}
+ },
+ {
+ /* hibit=1 */
+ {/* even pixels = purple */ 0xa0, 0x40, 0xa0},
+ {/* odd pixels = green */ 0x40, 0xff, 0x40}
+ }
+ };
+
+ int x, y;
+ unsigned int **pixels;
+ unsigned int *pP;
+ int maxval = 255;
+ long *this_rerr;
+ long *next_rerr;
+ long *this_gerr;
+ long *next_gerr;
+ long *this_berr;
+ long *next_berr;
+ long *temp_err;
+ int fs_scale = 1024;
+ int brightness = 75;
+
+#if 0
+ {
+ FILE *pipe = popen ("xv -", "w");
+ fprintf (pipe, "P6\n%d %d\n%d\n", w, h, 255);
+ for (y = 0; y < h; y++)
+ for (x = 0; x < w; x++)
+ {
+ unsigned int p = in[y * w + x];
+ unsigned int r = (p >> 16) & 0xFF;
+ unsigned int g = (p >> 8) & 0xFF;
+ unsigned int b = (p ) & 0xFF;
+ fprintf(pipe, "%c%c%c", r, g, b);
+ }
+ fclose (pipe);
+ }
+#endif
+
+ /* Initialize Floyd-Steinberg error vectors. */
+ this_rerr = (long *) calloc (w + 2, sizeof(long));
+ next_rerr = (long *) calloc (w + 2, sizeof(long));
+ this_gerr = (long *) calloc (w + 2, sizeof(long));
+ next_gerr = (long *) calloc (w + 2, sizeof(long));
+ this_berr = (long *) calloc (w + 2, sizeof(long));
+ next_berr = (long *) calloc (w + 2, sizeof(long));
+
+
+ /* #### do we really need more than one element of "pixels" at once?
+ */
+ pixels = (unsigned int **) malloc (h * sizeof (unsigned int *));
+ for (y = 0; y < h; y++)
+ pixels[y] = (unsigned int *) malloc (w * sizeof (unsigned int));
+
+ for (x = 0; x < w + 2; ++x)
+ {
+ this_rerr[x] = random() % (fs_scale * 2) - fs_scale;
+ this_gerr[x] = random() % (fs_scale * 2) - fs_scale;
+ this_berr[x] = random() % (fs_scale * 2) - fs_scale;
+ /* (random errors in [-1 .. 1]) */
+ }
+
+ for (y = 0; y < h; y++)
+ for (x = 0; x < w; x++)
+ pixels[y][x] = in[y * w + x];
+
+ for (y = 0; y < h; y++)
+ {
+ int xbyte;
+ int err;
+ int prev_byte=0;
+
+ for (x = 0; x < w + 2; x++)
+ next_rerr[x] = next_gerr[x] = next_berr[x] = 0;
+
+ /* It's too complicated to go back and forth on alternate rows,
+ so we always go left-right here. It doesn't change the result
+ very much.
+
+ For each group of 7 pixels, we have to try it both with the
+ high bit=0 and =1. For each high bit value, we add up the
+ total error and pick the best one.
+
+ Because we have to go through each group of bits twice, we
+ don't propagate the error values through this_[rgb]err since
+ it would add them twice. So we keep seperate local_[rgb]err
+ variables for propagating error within the 7-pixel group.
+ */
+
+ pP = pixels[y];
+ for (xbyte=0; xbyte<280; xbyte+=7)
+ {
+ int best_byte=0;
+ int best_error=2000000000;
+ int hibit;
+ int sr, sg, sb;
+ int r2, g2, b2;
+ int local_rerr=0, local_gerr=0, local_berr=0;
+
+ for (hibit=0; hibit<2; hibit++)
+ {
+ int byte = hibit<<7;
+ int tot_error=0;
+
+ for (x=xbyte; x<xbyte+7; x++)
+ {
+ int dist0, dist1;
+
+ /* Use Floyd-Steinberg errors to adjust actual color. */
+ sr = ((pP[x] >> 16) & 0xFF) * brightness/256;
+ sg = ((pP[x] >> 8) & 0xFF) * brightness/256;
+ sb = ((pP[x] ) & 0xFF) * brightness/256;
+ sr += (this_rerr[x + 1] + local_rerr) / fs_scale;
+ sg += (this_gerr[x + 1] + local_gerr) / fs_scale;
+ sb += (this_berr[x + 1] + local_berr) / fs_scale;
+
+ if (sr < 0) sr = 0;
+ else if (sr > maxval) sr = maxval;
+ if (sg < 0) sg = 0;
+ else if (sg > maxval) sg = maxval;
+ if (sb < 0) sb = 0;
+ else if (sb > maxval) sb = maxval;
+
+ /* This is the color we'd get if we set the bit 1. For 0,
+ we get black */
+ r2=a2_cmap[hibit][x&1][0];
+ g2=a2_cmap[hibit][x&1][1];
+ b2=a2_cmap[hibit][x&1][2];
+
+ /*
+ dist0 and dist1 are the error (Minkowski 2-metric
+ distances in the color space) for choosing 0 and
+ 1 respectively. 0 is black, 1 is the color r2,g2,b2.
+ */
+ dist1= (sr-r2)*(sr-r2) + (sg-g2)*(sg-g2) + (sb-b2)*(sb-b2);
+ dist0= sr*sr + sg*sg + sb*sb;
+
+ if (dist1<dist0)
+ {
+ byte |= 1 << (x-xbyte);
+ tot_error += dist1;
+
+ /* Wanted sr but got r2, so propagate sr-r2 */
+ local_rerr = (sr - r2) * fs_scale * 7/16;
+ local_gerr = (sg - g2) * fs_scale * 7/16;
+ local_berr = (sb - b2) * fs_scale * 7/16;
+ }
+ else
+ {
+ tot_error += dist0;
+
+ /* Wanted sr but got 0, so propagate sr */
+ local_rerr = sr * fs_scale * 7/16;
+ local_gerr = sg * fs_scale * 7/16;
+ local_berr = sb * fs_scale * 7/16;
+ }
+ }
+
+ if (tot_error < best_error)
+ {
+ best_byte = byte;
+ best_error = tot_error;
+ }
+ }
+
+ /* Avoid alternating 7f and ff in all-white areas, because it makes
+ regular pink vertical lines */
+ if ((best_byte&0x7f)==0x7f && (prev_byte&0x7f)==0x7f)
+ best_byte=prev_byte;
+ prev_byte=best_byte;
+
+ /*
+ Now that we've chosen values for all 8 bits of the byte, we
+ have to fill in the real pixel values into pP and propagate
+ all the error terms. We end up repeating a lot of the code
+ above.
+ */
+
+ for (x=xbyte; x<xbyte+7; x++)
+ {
+ int bit=(best_byte>>(x-xbyte))&1;
+ hibit=(best_byte>>7)&1;
+
+ sr = (pP[x] >> 16) & 0xFF;
+ sg = (pP[x] >> 8) & 0xFF;
+ sb = (pP[x] ) & 0xFF;
+ sr += this_rerr[x + 1] / fs_scale;
+ sg += this_gerr[x + 1] / fs_scale;
+ sb += this_berr[x + 1] / fs_scale;
+
+ if (sr < 0) sr = 0;
+ else if (sr > maxval) sr = maxval;
+ if (sg < 0) sg = 0;
+ else if (sg > maxval) sg = maxval;
+ if (sb < 0) sb = 0;
+ else if (sb > maxval) sb = maxval;
+
+ r2=a2_cmap[hibit][x&1][0] * bit;
+ g2=a2_cmap[hibit][x&1][1] * bit;
+ b2=a2_cmap[hibit][x&1][2] * bit;
+
+ pP[x] = (r2<<16) | (g2<<8) | (b2);
+
+ /* Propagate Floyd-Steinberg error terms. */
+ err = (sr - r2) * fs_scale;
+ this_rerr[x + 2] += (err * 7) / 16;
+ next_rerr[x ] += (err * 3) / 16;
+ next_rerr[x + 1] += (err * 5) / 16;
+ next_rerr[x + 2] += (err ) / 16;
+ err = (sg - g2) * fs_scale;
+ this_gerr[x + 2] += (err * 7) / 16;
+ next_gerr[x ] += (err * 3) / 16;
+ next_gerr[x + 1] += (err * 5) / 16;
+ next_gerr[x + 2] += (err ) / 16;
+ err = (sb - b2) * fs_scale;
+ this_berr[x + 2] += (err * 7) / 16;
+ next_berr[x ] += (err * 3) / 16;
+ next_berr[x + 1] += (err * 5) / 16;
+ next_berr[x + 2] += (err ) / 16;
+ }
+
+ /*
+ And put the actual byte into out.
+ */
+
+ out[y*(w/7) + xbyte/7] = best_byte;
+
+ }
+
+ temp_err = this_rerr;
+ this_rerr = next_rerr;
+ next_rerr = temp_err;
+ temp_err = this_gerr;
+ this_gerr = next_gerr;
+ next_gerr = temp_err;
+ temp_err = this_berr;
+ this_berr = next_berr;
+ next_berr = temp_err;
+ }
+
+ free (this_rerr);
+ free (next_rerr);
+ free (this_gerr);
+ free (next_gerr);
+ free (this_berr);
+ free (next_berr);
+
+ for (y=0; y<h; y++)
+ free (pixels[y]);
+ free (pixels);
+
+#if 0
+ {
+ /* let's see what we got... */
+ FILE *pipe = popen ("xv -", "w");
+ fprintf (pipe, "P6\n%d %d\n%d\n", w, h, 255);
+ for (y = 0; y < h; y++)
+ for (x = 0; x < w; x++)
+ {
+ unsigned int r = (pixels[y][x]>>16)&0xff;
+ unsigned int g = (pixels[y][x]>>8)&0xff;
+ unsigned int b = (pixels[y][x]>>0)&0xff;
+ fprintf(pipe, "%c%c%c", r, g, b);
+ }
+ fclose (pipe);
+ }
+#endif
+}
+
+typedef struct slideshow_data_s {
+ int slideno;
+ int render_img_lineno;
+ unsigned char *render_img;
+ char *img_filename;
+ Bool image_loading_p;
+} slideshow_data;
+
+
+static void
+image_loaded_cb (Screen *screen, Window window, Drawable p,
+ const char *name, XRectangle *geometry,
+ void *closure)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ apple2_sim_t *sim = (apple2_sim_t *) closure;
+ slideshow_data *mine = (slideshow_data *) sim->controller_data;
+ XWindowAttributes xgwa;
+ int w = 280;
+ int h = 192;
+ XImage *image;
+ unsigned int *buf32 = (unsigned int *) calloc (w, h * 4);
+ unsigned char *buf8 = (unsigned char *) calloc (w/7, h);
+
+ if (!buf32 || !buf8)
+ {
+ fprintf (stderr, "%s: out of memory (%dx%d)\n", progname, w, h);
+ exit (1);
+ }
+
+ XGetWindowAttributes (dpy, window, &xgwa);
+
+ image = XGetImage (dpy, p, 0, 0, xgwa.width, xgwa.height, ~0, ZPixmap);
+ XFreePixmap (dpy, p);
+ p = 0;
+
+ /* Scale the XImage down to Apple][ size, and convert it to a 32bpp
+ image (regardless of whether it started as TrueColor/PseudoColor.)
+ */
+ pick_a2_subimage (dpy, window, image, buf32, w, h);
+ free(image->data);
+ image->data = 0;
+ XDestroyImage(image);
+
+ /* Then dither the 32bpp image to a 6-color Apple][ colormap.
+ */
+ a2_dither (buf32, buf8, w, h);
+
+ free (buf32);
+
+ mine->image_loading_p = False;
+ mine->img_filename = (name ? strdup (name) : 0);
+ mine->render_img = buf8;
+}
+
+
+
+static const char *apple2_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*mode: random",
+ "*duration: 60",
+ "*program: xscreensaver-text --cols 40",
+ "*metaSendsESC: True",
+ "*swapBSDEL: True",
+ "*fast: False",
+# ifdef HAVE_FORKPTY
+ "*usePty: True",
+#else
+ "*usePty: False",
+# endif /* !HAVE_FORKPTY */
+
+ ANALOGTV_DEFAULTS
+ 0
+};
+
+static XrmOptionDescRec apple2_options [] = {
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-slideshow", ".mode", XrmoptionNoArg, "slideshow" },
+ { "-basic", ".mode", XrmoptionNoArg, "basic" },
+ { "-text", ".mode", XrmoptionNoArg, "text" },
+ { "-program", ".program", XrmoptionSepArg, 0 },
+ { "-duration", ".duration", XrmoptionSepArg, 0 },
+ { "-pty", ".usePty", XrmoptionNoArg, "True" },
+ { "-pipe", ".usePty", XrmoptionNoArg, "False" },
+ { "-meta", ".metaSendsESC", XrmoptionNoArg, "False" },
+ { "-esc", ".metaSendsESC", XrmoptionNoArg, "True" },
+ { "-bs", ".swapBSDEL", XrmoptionNoArg, "False" },
+ { "-del", ".swapBSDEL", XrmoptionNoArg, "True" },
+ { "-fast", ".fast", XrmoptionNoArg, "True" },
+ ANALOGTV_OPTIONS
+ { 0, 0, 0, 0 }
+};
+
+/*
+ TODO: this should load 10 images at startup time, then cycle through them
+ to avoid the pause while it loads.
+ */
+
+static void slideshow_controller(apple2_sim_t *sim, int *stepno,
+ double *next_actiontime)
+{
+ apple2_state_t *st=sim->st;
+ int i;
+ slideshow_data *mine;
+
+ if (!sim->controller_data)
+ sim->controller_data = calloc (1, sizeof(*mine));
+ mine = (slideshow_data *) sim->controller_data;
+
+ switch(*stepno) {
+
+ case 0:
+ a2_invalidate(st);
+ a2_clear_hgr(st);
+ a2_cls(st);
+ sim->typing_rate = 0.3;
+ sim->dec->powerup=0.0;
+
+ a2_goto(st, 0, 16);
+ a2_prints(st, "APPLE ][");
+ a2_goto(st,23,0);
+ a2_printc(st,']');
+
+ *stepno=10;
+ break;
+
+ case 10:
+ {
+ XWindowAttributes xgwa;
+ Pixmap p;
+ XGetWindowAttributes (sim->dpy, sim->window, &xgwa);
+ p = XCreatePixmap (sim->dpy, sim->window, xgwa.width, xgwa.height,
+ xgwa.depth);
+ mine->image_loading_p = True;
+ load_image_async (xgwa.screen, sim->window, p, image_loaded_cb, sim);
+
+ /* pause with a blank screen for a bit, while the image loads in the
+ background. */
+ *next_actiontime += 2.0;
+ *stepno=11;
+ }
+ break;
+
+ case 11:
+ if (! mine->image_loading_p) { /* image is finally loaded */
+ if (st->gr_mode) {
+ *stepno=30;
+ } else {
+ *stepno=20;
+ }
+ *next_actiontime += 3.0;
+ }
+ break;
+
+ case 20:
+ sim->typing="HGR\n";
+ *stepno=29;
+ break;
+
+ case 29:
+ sim->printing="]";
+ *stepno=30;
+ break;
+
+ case 30:
+ st->gr_mode=A2_GR_HIRES;
+ if (mine->img_filename) {
+ char *basename, *tmp;
+ char *s;
+
+ basename = tmp = strdup (mine->img_filename);
+ while (1)
+ {
+ char *slash = strchr(basename, '/');
+ if (!slash || !slash[1]) break;
+ basename = slash+1;
+ }
+ {
+ char *dot=strrchr(basename,'.');
+ if (dot) *dot=0;
+ }
+ if (strlen(basename)>20) basename[20]=0;
+ for (s=basename; *s; s++) {
+ *s = toupper (*s);
+ if (*s <= ' ') *s = '_';
+ }
+ sprintf(sim->typing_buf, "BLOAD %s\n", basename);
+ sim->typing = sim->typing_buf;
+
+ free(tmp);
+ } else {
+ sim->typing = "BLOAD IMAGE\n";
+ }
+ mine->render_img_lineno=0;
+
+ *stepno=35;
+ break;
+
+ case 35:
+ *next_actiontime += 0.7;
+ *stepno=40;
+ break;
+
+ case 40:
+ if (mine->render_img_lineno>=192) {
+ sim->printing="]";
+ sim->typing="POKE 49234,0\n";
+ *stepno=50;
+ return;
+ }
+
+ for (i=0; i<6 && mine->render_img_lineno<192; i++) {
+ a2_display_image_loading(st, mine->render_img,
+ mine->render_img_lineno++);
+ }
+
+ /* The disk would have to seek every 13 sectors == 78 lines.
+ (This ain't no newfangled 16-sector operating system) */
+ if ((mine->render_img_lineno%78)==0) {
+ *next_actiontime += 0.5;
+ } else {
+ *next_actiontime += 0.08;
+ }
+ break;
+
+ case 50:
+ st->gr_mode |= A2_GR_FULL;
+ *stepno=60;
+ /* Note that sim->delay is sometimes "infinite" in this controller.
+ These images are kinda dull anyway, so don't leave it on too long. */
+ *next_actiontime += 2;
+ break;
+
+ case 60:
+ sim->printing="]";
+ sim->typing="POKE 49235,0\n";
+ *stepno=70;
+ break;
+
+ case 70:
+ sim->printing="]";
+ st->gr_mode &= ~A2_GR_FULL;
+ if (mine->render_img) {
+ free(mine->render_img);
+ mine->render_img=NULL;
+ }
+ if (mine->img_filename) {
+ free(mine->img_filename);
+ mine->img_filename=NULL;
+ }
+ *stepno=10;
+ break;
+
+ case 80:
+ /* Do nothing, just wait */
+ *next_actiontime += 2.0;
+ *stepno = A2CONTROLLER_FREE;
+ break;
+
+ case A2CONTROLLER_FREE:
+ /* It is possible that still image is being loaded,
+ in that case mine cannot be freed, because
+ callback function tries to use it, so wait.
+ */
+ if (mine->image_loading_p) {
+ *stepno = 80;
+ break;
+ }
+ free(mine->render_img);
+ free(mine->img_filename);
+ free(mine);
+ mine = 0;
+ return;
+
+ }
+}
+
+#define NPAR 16
+
+struct terminal_controller_data {
+ Display *dpy;
+ char curword[256];
+ unsigned char lastc;
+ double last_emit_time;
+ text_data *tc;
+
+ int escstate;
+ int csiparam[NPAR];
+ int curparam;
+ int cursor_x, cursor_y;
+ int saved_x, saved_y;
+ int unicruds; char unicrud[7];
+ union {
+ struct {
+ unsigned int bold : 1;
+ unsigned int blink : 1;
+ unsigned int rev : 1;
+ } bf;
+ int w;
+ } termattrib;
+ Bool fast_p;
+
+};
+
+
+/* The structure of closure linkage throughout this code is so amazingly
+ baroque that I can't get to the 'struct state' from where I need it. */
+static const char *global_program;
+static Bool global_fast_p;
+
+
+static void
+terminal_closegen(struct terminal_controller_data *mine)
+{
+ if (mine->tc) {
+ textclient_close (mine->tc);
+ mine->tc = 0;
+ }
+}
+
+static int
+terminal_read(struct terminal_controller_data *mine, unsigned char *buf, int n)
+{
+ if (!mine || !mine->tc) {
+ return 0;
+ } else {
+ int i, count = 0;
+ for (i = 0; i < n; i++) {
+ int c = textclient_getc (mine->tc);
+ if (c <= 0) break;
+ buf[i] = c;
+ mine->lastc = c;
+ count++;
+ }
+ return count;
+ }
+}
+
+
+static int
+terminal_keypress_handler (Display *dpy, XEvent *event, void *data)
+{
+ struct terminal_controller_data *mine =
+ (struct terminal_controller_data *) data;
+ mine->dpy = dpy;
+ if (event->xany.type == KeyPress && mine->tc)
+ return textclient_putc (mine->tc, &event->xkey);
+ return 0;
+}
+
+
+static void
+a2_ascii_printc (apple2_state_t *st, unsigned char c,
+ Bool bold_p, Bool blink_p, Bool rev_p,
+ Bool scroll_p)
+{
+ if (c >= 'a' && c <= 'z') /* upcase lower-case chars */
+ {
+ c &= 0xDF;
+ }
+ else if ((c >= 'A'+128) || /* upcase and blink */
+ (c < ' ' && c != 014 && /* high-bit & ctl chrs */
+ c != '\r' && c != '\n' && c!='\t'))
+ {
+ c = (c & 0x1F) | 0x80;
+ }
+ else if (c >= 'A' && c <= 'Z') /* invert upper-case chars */
+ {
+ c |= 0x80;
+ }
+
+ if (bold_p) c |= 0xc0;
+ if (blink_p) c = (c & ~0x40) | 0x80;
+ if (rev_p) c |= 0xc0;
+
+ if (scroll_p)
+ a2_printc(st, c);
+ else
+ a2_printc_noscroll(st, c);
+}
+
+
+static void
+a2_vt100_printc (apple2_sim_t *sim, struct terminal_controller_data *state,
+ unsigned char c)
+{
+ apple2_state_t *st=sim->st;
+ int cols = SCREEN_COLS;
+ int rows = SCREEN_ROWS;
+
+ int i;
+ int start, end;
+
+ /* Mostly duplicated in phosphor.c */
+
+ switch (state->escstate)
+ {
+ case 0:
+ switch (c)
+ {
+ case 7: /* BEL */
+ /* Dummy case - we don't want the screensaver to beep */
+ /* #### But maybe this should flash the screen? */
+ break;
+ case 8: /* BS */
+ if (state->cursor_x > 0)
+ state->cursor_x--;
+ break;
+ case 9: /* HT */
+ if (state->cursor_x < cols - 8)
+ {
+ state->cursor_x = (state->cursor_x & ~7) + 8;
+ }
+ else
+ {
+ state->cursor_x = 0;
+ if (state->cursor_y < rows - 1)
+ state->cursor_y++;
+ else
+ a2_scroll (st);
+ }
+ break;
+ case 10: /* LF */
+# ifndef HAVE_FORKPTY
+ state->cursor_x = 0; /* No ptys on iPhone; assume CRLF. */
+# endif
+ case 11: /* VT */
+ case 12: /* FF */
+ if (state->cursor_y < rows - 1)
+ state->cursor_y++;
+ else
+ a2_scroll (st);
+ break;
+ case 13: /* CR */
+ state->cursor_x = 0;
+ break;
+ case 14: /* SO */
+ case 15: /* SI */
+ /* Dummy case - there is one and only one font. */
+ break;
+ case 24: /* CAN */
+ case 26: /* SUB */
+ /* Dummy case - these interrupt escape sequences, so
+ they don't do anything in this state */
+ break;
+ case 27: /* ESC */
+ state->escstate = 1;
+ break;
+ case 127: /* DEL */
+ /* Dummy case - this is supposed to be ignored */
+ break;
+ case 155: /* CSI */
+ state->escstate = 2;
+ for(i = 0; i < NPAR; i++)
+ state->csiparam[i] = 0;
+ state->curparam = 0;
+ break;
+ default:
+
+ /* states 102-106 are for UTF-8 decoding */
+
+ if ((c & 0xE0) == 0xC0) { /* 110xxxxx - 11 bits, 2 bytes */
+ state->unicruds = 1;
+ state->unicrud[0] = c;
+ state->escstate = 102;
+ break;
+ } else if ((c & 0xF0) == 0xE0) { /* 1110xxxx - 16 bits, 3 bytes */
+ state->unicruds = 1;
+ state->unicrud[0] = c;
+ state->escstate = 103;
+ break;
+ } else if ((c & 0xF8) == 0xF0) { /* 11110xxx - 21 bits, 4 bytes */
+ state->unicruds = 1;
+ state->unicrud[0] = c;
+ state->escstate = 104;
+ break;
+ } else if ((c & 0xFC) == 0xF8) { /* 111110xx - 26 bits, 5 bytes */
+ state->unicruds = 1;
+ state->unicrud[0] = c;
+ state->escstate = 105;
+ break;
+ } else if ((c & 0xFE) == 0xFC) { /* 1111110x - 31 bits, 6 bytes */
+ state->unicruds = 1;
+ state->unicrud[0] = c;
+ state->escstate = 106;
+ break;
+ }
+
+ PRINT:
+
+ /* If the cursor is in column 39 and we print a character, then
+ that character shows up in column 39, and the cursor is no longer
+ visible on the screen (it's in "column 40".) If another character
+ is printed, then that character shows up in column 0, and the
+ cursor moves to column 1.
+
+ This is empirically what xterm and gnome-terminal do, so that must
+ be the right thing. (In xterm, the cursor vanishes, whereas; in
+ gnome-terminal, the cursor overprints the character in col 39.)
+ */
+ if (state->cursor_x >= cols)
+ {
+ state->cursor_x = 0;
+ if (state->cursor_y >= rows - 1)
+ a2_scroll (st);
+ else
+ state->cursor_y++;
+ }
+
+ a2_goto(st, state->cursor_y, state->cursor_x); /* clips range */
+ a2_ascii_printc (st, c,
+ state->termattrib.bf.bold,
+ state->termattrib.bf.blink,
+ state->termattrib.bf.rev,
+ False);
+ state->cursor_x++;
+
+ break;
+ }
+ break;
+ case 1:
+ switch (c)
+ {
+ case 24: /* CAN */
+ case 26: /* SUB */
+ state->escstate = 0;
+ break;
+ case 'c': /* Reset */
+ a2_cls(st);
+ state->escstate = 0;
+ break;
+ case 'D': /* Linefeed */
+ if (state->cursor_y < rows - 1)
+ state->cursor_y++;
+ else
+ a2_scroll (st);
+ state->escstate = 0;
+ break;
+ case 'E': /* Newline */
+ state->cursor_x = 0;
+ state->escstate = 0;
+ break;
+ case 'M': /* Reverse newline */
+ if (state->cursor_y > 0)
+ state->cursor_y--;
+ state->escstate = 0;
+ break;
+ case '7': /* Save state */
+ state->saved_x = state->cursor_x;
+ state->saved_y = state->cursor_y;
+ state->escstate = 0;
+ break;
+ case '8': /* Restore state */
+ state->cursor_x = state->saved_x;
+ state->cursor_y = state->saved_y;
+ state->escstate = 0;
+ break;
+ case '[': /* CSI */
+ state->escstate = 2;
+ for(i = 0; i < NPAR; i++)
+ state->csiparam[i] = 0;
+ state->curparam = 0;
+ break;
+ case '%': /* Select charset */
+ /* @: Select default (ISO 646 / ISO 8859-1)
+ G: Select UTF-8
+ 8: Select UTF-8 (obsolete)
+
+ We can just ignore this and always process UTF-8, I think?
+ We must still catch the last byte, though.
+ */
+ case '(':
+ case ')':
+ /* I don't support different fonts either - see above
+ for SO and SI */
+ state->escstate = 3;
+ break;
+ default:
+ /* Escape sequences not supported:
+ *
+ * H - Set tab stop
+ * Z - Terminal identification
+ * > - Keypad change
+ * = - Other keypad change
+ * ] - OS command
+ */
+ state->escstate = 0;
+ break;
+ }
+ break;
+ case 2:
+ switch (c)
+ {
+ case 24: /* CAN */
+ case 26: /* SUB */
+ state->escstate = 0;
+ break;
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ if (state->curparam < NPAR)
+ state->csiparam[state->curparam] =
+ (state->csiparam[state->curparam] * 10) + (c - '0');
+ break;
+ case ';':
+ state->csiparam[++state->curparam] = 0;
+ break;
+ case '[':
+ state->escstate = 3;
+ break;
+ case '@':
+ for (i = 0; i < state->csiparam[0]; i++)
+ {
+ if(++state->cursor_x > cols)
+ {
+ state->cursor_x = 0;
+ if (state->cursor_y < rows - 1)
+ state->cursor_y++;
+ else
+ a2_scroll (st);
+ }
+ }
+ state->escstate = 0;
+ break;
+ case 'F':
+ state->cursor_x = 0;
+ case 'A':
+ if (state->csiparam[0] == 0)
+ state->csiparam[0] = 1;
+ if ((state->cursor_y -= state->csiparam[0]) < 0)
+ state->cursor_y = 0;
+ state->escstate = 0;
+ break;
+ case 'E':
+ state->cursor_x = 0;
+ case 'e':
+ case 'B':
+ if (state->csiparam[0] == 0)
+ state->csiparam[0] = 1;
+ if ((state->cursor_y += state->csiparam[0]) >= rows)
+ state->cursor_y = rows - 1;
+ state->escstate = 0;
+ break;
+ case 'a':
+ case 'C':
+ if (state->csiparam[0] == 0)
+ state->csiparam[0] = 1;
+ if ((state->cursor_x += state->csiparam[0]) >= cols)
+ state->cursor_x = cols - 1;
+ state->escstate = 0;
+ break;
+ case 'D':
+ if (state->csiparam[0] == 0)
+ state->csiparam[0] = 1;
+ if ((state->cursor_x -= state->csiparam[0]) < 0)
+ state->cursor_x = 0;
+ state->escstate = 0;
+ break;
+ case 'd':
+ if ((state->cursor_y = (state->csiparam[0] - 1)) >= rows)
+ state->cursor_y = rows - 1;
+ state->escstate = 0;
+ break;
+ case '`':
+ case 'G':
+ if ((state->cursor_x = (state->csiparam[0] - 1)) >= cols)
+ state->cursor_x = cols - 1;
+ state->escstate = 0;
+ break;
+ case 'f':
+ case 'H':
+ if ((state->cursor_y = (state->csiparam[0] - 1)) >= rows)
+ state->cursor_y = rows - 1;
+ if ((state->cursor_x = (state->csiparam[1] - 1)) >= cols)
+ state->cursor_x = cols - 1;
+ if(state->cursor_y < 0)
+ state->cursor_y = 0;
+ if(state->cursor_x < 0)
+ state->cursor_x = 0;
+ state->escstate = 0;
+ break;
+ case 'J':
+ start = 0;
+ end = rows * cols;
+ if (state->csiparam[0] == 0)
+ start = cols * state->cursor_y + state->cursor_x;
+ if (state->csiparam[0] == 1)
+ end = cols * state->cursor_y + state->cursor_x;
+
+ a2_goto(st, state->cursor_y, state->cursor_x);
+ for (i = start; i < end; i++)
+ {
+ a2_ascii_printc(st, ' ', False, False, False, False);
+ }
+ state->escstate = 0;
+ break;
+ case 'K':
+ start = 0;
+ end = cols;
+ if (state->csiparam[0] == 0)
+ start = state->cursor_x;
+ if (state->csiparam[1] == 1)
+ end = state->cursor_x;
+
+ a2_goto(st, state->cursor_y, state->cursor_x);
+ for (i = start; i < end; i++)
+ {
+ a2_ascii_printc(st, ' ', False, False, False, False);
+ }
+ state->escstate = 0;
+ break;
+ case 'm': /* Set attributes */
+ for (i = 0; i <= state->curparam; i++)
+ {
+ switch(state->csiparam[i])
+ {
+ case 0:
+ state->termattrib.w = 0;
+ break;
+ case 1:
+ state->termattrib.bf.bold = 1;
+ break;
+ case 5:
+ state->termattrib.bf.blink = 1;
+ break;
+ case 7:
+ state->termattrib.bf.rev = 1;
+ break;
+ case 21:
+ case 22:
+ state->termattrib.bf.bold = 0;
+ break;
+ case 25:
+ state->termattrib.bf.blink = 0;
+ break;
+ case 27:
+ state->termattrib.bf.rev = 0;
+ break;
+ }
+ }
+ state->escstate = 0;
+ break;
+ case 's': /* Save position */
+ state->saved_x = state->cursor_x;
+ state->saved_y = state->cursor_y;
+ state->escstate = 0;
+ break;
+ case 'u': /* Restore position */
+ state->cursor_x = state->saved_x;
+ state->cursor_y = state->saved_y;
+ state->escstate = 0;
+ break;
+ case '?': /* DEC Private modes */
+ if ((state->curparam != 0) || (state->csiparam[0] != 0))
+ state->escstate = 0;
+ break;
+ default:
+ /* Known unsupported CSIs:
+ *
+ * L - Insert blank lines
+ * M - Delete lines (I don't know what this means...)
+ * P - Delete characters
+ * X - Erase characters (difference with P being...?)
+ * c - Terminal identification
+ * g - Clear tab stop(s)
+ * h - Set mode (Mainly due to its complexity and lack of good
+ docs)
+ * l - Clear mode
+ * m - Set mode (Phosphor is, per defenition, green on black)
+ * n - Status report
+ * q - Set keyboard LEDs
+ * r - Set scrolling region (too exhausting - noone uses this,
+ right?)
+ */
+ state->escstate = 0;
+ break;
+ }
+ break;
+ case 3:
+ state->escstate = 0;
+ break;
+
+ case 102:
+ case 103:
+ case 104:
+ case 105:
+ case 106:
+ {
+ int total = state->escstate - 100; /* see what I did there */
+ if (state->unicruds < total) {
+ /* Buffer more bytes of the UTF-8 sequence */
+ state->unicrud[state->unicruds++] = c;
+ }
+
+ if (state->unicruds >= total) {
+ /* Done! Convert it to ASCII and print that. */
+ char *s;
+ state->unicrud[state->unicruds] = 0;
+ s = utf8_to_latin1 ((const char *) state->unicrud, True);
+ state->unicruds = 0;
+ state->escstate = 0;
+ if (s) {
+ c = s[0];
+ free (s);
+ goto PRINT;
+ } else {
+ /* c = 0; */
+ }
+ }
+ }
+ break;
+
+ default:
+ abort();
+ }
+ a2_goto(st, state->cursor_y, state->cursor_x);
+}
+
+
+/*
+ It's fun to put things like "gdb" as the command. For one, it's
+ amusing how the standard mumble (version, no warranty, it's
+ GNU/Linux dammit) occupies an entire screen on the Apple ][.
+*/
+
+static void
+terminal_controller(apple2_sim_t *sim, int *stepno, double *next_actiontime)
+{
+ apple2_state_t *st=sim->st;
+ int c;
+ int i;
+
+ struct terminal_controller_data *mine;
+ if (!sim->controller_data)
+ sim->controller_data=calloc(sizeof(struct terminal_controller_data),1);
+ mine=(struct terminal_controller_data *) sim->controller_data;
+ mine->dpy = sim->dpy;
+
+ mine->fast_p = global_fast_p;
+
+ switch(*stepno) {
+
+ case 0:
+ if (random()%2)
+ st->gr_mode |= A2_GR_FULL; /* Turn on color mode even through it's
+ showing text */
+ a2_cls(st);
+ a2_goto(st,0,16);
+ a2_prints(st, "APPLE ][");
+ a2_goto(st,2,0);
+ mine->cursor_y = 2;
+
+ if (! mine->tc) {
+ mine->tc = textclient_open (mine->dpy);
+ textclient_reshape (mine->tc,
+ SCREEN_COLS, SCREEN_ROWS,
+ SCREEN_COLS, SCREEN_ROWS,
+ 0);
+ }
+
+ if (! mine->fast_p)
+ *next_actiontime += 4.0;
+ *stepno = 10;
+
+ mine->last_emit_time = sim->curtime;
+ break;
+
+ case 10:
+ case 11:
+ {
+ Bool first_line_p = (*stepno == 10);
+ unsigned char buf[1024];
+ int nr,nwant;
+ double elapsed;
+
+ elapsed=sim->curtime - mine->last_emit_time;
+
+ nwant = elapsed * 25.0; /* characters per second */
+
+ if (first_line_p) {
+ *stepno = 11;
+ nwant = 1;
+ }
+
+ if (nwant > 40) nwant = 40;
+
+ if (mine->fast_p)
+ nwant = sizeof(buf)-1;
+
+ if (nwant <= 0) break;
+
+ mine->last_emit_time = sim->curtime;
+
+ nr=terminal_read(mine, buf, nwant);
+ for (i=0; i<nr; i++) {
+ c=buf[i];
+
+ if (mine->tc)
+ a2_vt100_printc (sim, mine, c);
+ else
+ a2_ascii_printc (st, c, False, False, False, True);
+ }
+ }
+ break;
+
+ case A2CONTROLLER_FREE:
+ terminal_closegen(mine);
+ free(mine);
+ mine = 0;
+ return;
+ }
+}
+
+struct basic_controller_data {
+ int prog_line;
+ int x,y,k;
+ const char * const * progtext;
+ int progstep;
+ char *rep_str;
+ int rep_pos;
+ double prog_start_time;
+ char error_buf[256];
+};
+
+/*
+ Adding more programs is easy. Just add a listing here and to all_programs,
+ then add the state machine to actually execute it to basic_controller.
+ */
+static const char * const moire_program[]={
+ "10 HGR2\n",
+ "20 FOR Y = 0 TO 190 STEP 2\n",
+ "30 HCOLOR=4 : REM BLACK\n",
+ "40 HPLOT 0,191-Y TO 279,Y\n",
+ "60 HCOLOR=7 : REM WHITE\n",
+ "80 HPLOT 0,190-Y TO 279,Y+1\n",
+ "90 NEXT Y\n",
+ "100 FOR X = 0 TO 278 STEP 3\n",
+ "110 HCOLOR=4\n",
+ "120 HPLOT 279-X,0 TO X,191\n",
+ "140 HCOLOR=7\n",
+ "150 HPLOT 278-X,0 TO X+1,191\n",
+ "160 NEXT X\n",
+ NULL
+};
+
+static const char * const sinewave_program[] = {
+ "10 HGR\n",
+ "25 K=0\n",
+ "30 FOR X = 0 TO 279\n",
+ "32 HCOLOR= 0\n",
+ "35 HPLOT X,0 TO X,159\n",
+ "38 HCOLOR= 3\n",
+ "40 Y = 80 + SIN(15*(X-K)/279) * 40\n",
+ "50 HPLOT X,Y\n",
+ "60 NEXT X\n",
+ "70 K=K+4\n",
+ "80 GOTO 30\n",
+ NULL
+};
+
+#if 0
+static const char * const dumb_program[]={
+ "10 PRINT \"APPLE ][ ROOLZ! TRS-80 DROOLZ!\"\n",
+ "20 GOTO 10\n",
+ NULL
+};
+#endif
+
+static const char * const random_lores_program[]={
+ "1 REM APPLE ][ SCREEN SAVER\n",
+ "10 GR\n",
+ "100 COLOR= RND(1)*16\n",
+
+ "110 X=RND(1)*40\n",
+ "120 Y1=RND(1)*40\n",
+ "130 Y2=RND(1)*40\n",
+ "140 FOR Y = Y1 TO Y2\n",
+ "150 PLOT X,Y\n",
+ "160 NEXT Y\n",
+
+ "210 Y=RND(1)*40\n",
+ "220 X1=RND(1)*40\n",
+ "230 X2=RND(1)*40\n",
+ "240 FOR X = X1 TO X2\n",
+ "250 PLOT X,Y\n",
+ "260 NEXT X\n",
+ "300 GOTO 100\n",
+
+ NULL
+};
+
+static char typo_map[256];
+
+static int make_typo(char *out_buf, const char *orig, char *err_buf)
+{
+ int i,j;
+ int errc;
+ int success=0;
+ err_buf[0]=0;
+
+ typo_map['A']='Q';
+ typo_map['S']='A';
+ typo_map['D']='S';
+ typo_map['F']='G';
+ typo_map['G']='H';
+ typo_map['H']='J';
+ typo_map['J']='H';
+ typo_map['K']='L';
+ typo_map['L']=';';
+
+ typo_map['Q']='1';
+ typo_map['W']='Q';
+ typo_map['E']='3';
+ typo_map['R']='T';
+ typo_map['T']='Y';
+ typo_map['Y']='U';
+ typo_map['U']='Y';
+ typo_map['I']='O';
+ typo_map['O']='P';
+ typo_map['P']='[';
+
+ typo_map['Z']='X';
+ typo_map['X']='C';
+ typo_map['C']='V';
+ typo_map['V']='C';
+ typo_map['B']='N';
+ typo_map['N']='B';
+ typo_map['M']='N';
+ typo_map[',']='.';
+ typo_map['.']=',';
+
+ typo_map['!']='1';
+ typo_map['@']='2';
+ typo_map['#']='3';
+ typo_map['$']='4';
+ typo_map['%']='5';
+ typo_map['^']='6';
+ typo_map['&']='7';
+ typo_map['*']='8';
+ typo_map['(']='9';
+ typo_map[')']='0';
+
+ typo_map['1']='Q';
+ typo_map['2']='W';
+ typo_map['3']='E';
+ typo_map['4']='R';
+ typo_map['5']='T';
+ typo_map['6']='Y';
+ typo_map['7']='U';
+ typo_map['8']='I';
+ typo_map['9']='O';
+ typo_map['0']='-';
+
+ strcpy(out_buf, orig);
+ for (i=0; out_buf[i]; i++) {
+ char *p = out_buf+i;
+
+ if (i>2 && p[-2]=='R' && p[-1]=='E' && p[0]=='M')
+ break;
+
+ if (isalpha(p[0]) &&
+ isalpha(p[1]) &&
+ p[0] != p[1] &&
+ random()%15==0)
+ {
+ int tmp=p[1];
+ p[1]=p[0];
+ p[0]=tmp;
+ success=1;
+ sprintf(err_buf,"?SYNTAX ERROR\n");
+ break;
+ }
+
+ if (random()%10==0 && strlen(p)>=4 && (errc=typo_map[(int)(unsigned char)p[0]])) {
+ int remain=strlen(p);
+ int past=random()%(remain-2)+1;
+ memmove(p+past+past, p, remain+1);
+ p[0]=errc;
+ for (j=0; j<past; j++) {
+ p[past+j]=010;
+ }
+ break;
+ }
+ }
+ return success;
+}
+
+static const struct {
+ const char * const * progtext;
+ int progstep;
+} all_programs[]={
+ {moire_program, 100},
+ /*{dumb_program, 200}, */
+ {sinewave_program, 400},
+ {random_lores_program, 500},
+};
+
+static void
+basic_controller(apple2_sim_t *sim, int *stepno, double *next_actiontime)
+{
+ apple2_state_t *st=sim->st;
+ int i;
+
+ struct basic_controller_data *mine;
+ if (!sim->controller_data)
+ sim->controller_data=calloc(sizeof(struct basic_controller_data),1);
+ mine=(struct basic_controller_data *) sim->controller_data;
+
+ switch (*stepno) {
+ case 0:
+ st->gr_mode=0;
+ a2_cls(st);
+ a2_goto(st,0,16);
+ a2_prints(st, "APPLE ][");
+ a2_goto(st,23,0);
+ a2_printc(st,']');
+ sim->typing_rate=0.2;
+
+ i=random()%countof(all_programs);
+ mine->progtext=all_programs[i].progtext;
+ mine->progstep=all_programs[i].progstep;
+ mine->prog_line=0;
+
+ *next_actiontime += 1.0;
+ *stepno=10;
+ break;
+
+ case 10:
+ if (st->cursx==0) a2_printc(st,']');
+ if (mine->progtext[mine->prog_line]) {
+ if (random()%4==0) {
+ int err=make_typo(sim->typing_buf,
+ mine->progtext[mine->prog_line],
+ mine->error_buf);
+ sim->typing=sim->typing_buf;
+ if (err) {
+ *stepno=11;
+ } else {
+ mine->prog_line++;
+ }
+ } else {
+ sim->typing=mine->progtext[mine->prog_line++];
+ }
+ } else {
+ *stepno=15;
+ }
+ break;
+
+ case 11:
+ sim->printing=mine->error_buf;
+ *stepno=12;
+ break;
+
+ case 12:
+ if (st->cursx==0) a2_printc(st,']');
+ *next_actiontime+=1.0;
+ *stepno=10;
+ break;
+
+ case 15:
+ sim->typing="RUN\n";
+ mine->y=0;
+ mine->x=0;
+ mine->k=0;
+ mine->prog_start_time=*next_actiontime;
+ *stepno=mine->progstep;
+ break;
+
+ /* moire_program */
+ case 100:
+ st->gr_mode=A2_GR_HIRES|A2_GR_FULL;
+ for (i=0; i<24 && mine->y<192; i++)
+ {
+ a2_hline(st, 4, 0, 191-mine->y, 279, mine->y);
+ a2_hline(st, 7, 0, 191-mine->y-1, 279, mine->y+1);
+ mine->y += 2;
+ }
+ if (mine->y>=192) {
+ mine->x = 0;
+ *stepno = 110;
+ }
+ break;
+
+ case 110:
+ for (i=0; i<24 && mine->x<280; i++)
+ {
+ a2_hline(st, 4, 279-mine->x, 0, mine->x, 192);
+ a2_hline(st, 7, 279-mine->x-1, 0, mine->x+1, 192);
+ mine->x+=3;
+ }
+ if (mine->x >= 280) *stepno=120;
+ break;
+
+ case 120:
+ if (*next_actiontime > mine->prog_start_time+sim->delay) *stepno=999;
+ break;
+
+ /* dumb_program */
+ case 200:
+ mine->rep_str="\nAPPLE ][ ROOLZ! TRS-80 DROOLZ!";
+ for (i=0; i<30; i++) {
+ a2_prints(st, mine->rep_str);
+ }
+ *stepno=210;
+ break;
+
+ case 210:
+ i=random()%strlen(mine->rep_str);
+ while (mine->rep_pos != i) {
+ a2_printc(st, mine->rep_str[mine->rep_pos]);
+ mine->rep_pos++;
+ if (!mine->rep_str[mine->rep_pos]) mine->rep_pos=0;
+ }
+ if (*next_actiontime > mine->prog_start_time+sim->delay) *stepno=999;
+ break;
+
+ /* sinewave_program */
+ case 400:
+ st->gr_mode=A2_GR_HIRES;
+ *stepno=410;
+ break;
+
+ case 410:
+ for (i=0; i<48; i++) {
+ int y=80 + (int)(75.0*sin(15.0*(mine->x-mine->k)/279.0));
+ a2_hline(st, 0, mine->x, 0, mine->x, 159);
+ a2_hplot(st, 3, mine->x, y);
+ mine->x += 1;
+ if (mine->x>=279) {
+ mine->x=0;
+ mine->k+=4;
+ }
+ }
+ if (*next_actiontime > mine->prog_start_time+sim->delay) *stepno=999;
+ break;
+
+ case 420:
+ a2_prints(st, "]");
+ *stepno=999;
+ break;
+
+ /* random_lores_program */
+ case 500:
+ st->gr_mode=A2_GR_LORES|A2_GR_FULL;
+ a2_clear_gr(st);
+ *stepno=510;
+
+ case 510:
+ for (i=0; i<10; i++) {
+ int color,x,y,x1,x2,y1,y2;
+
+ color=random()%15;
+ x=random()%40;
+ y1=random()%48;
+ y2=random()%48;
+ for (y=y1; y<y2; y++) a2_plot(st, color, x, y);
+
+ x1=random()%40;
+ x2=random()%40;
+ y=random()%48;
+ for (x=x1; x<x2; x++) a2_plot(st, color, x, y);
+ }
+ if (*next_actiontime > mine->prog_start_time+sim->delay) *stepno=999;
+ break;
+
+ case 999:
+ *stepno=0;
+ break;
+
+ case A2CONTROLLER_FREE:
+ free(mine);
+ mine = 0;
+ break;
+ }
+
+}
+
+static void (* const controllers[]) (apple2_sim_t *sim, int *stepno,
+ double *next_actiontime) = {
+ slideshow_controller,
+ terminal_controller,
+ basic_controller
+};
+
+struct state {
+ int duration;
+ Bool random_p;
+ apple2_sim_t *sim;
+ void (*controller) (apple2_sim_t *sim, int *stepno, double *next_actiontime);
+};
+
+
+static void *
+apple2_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ char *s;
+
+ st->duration = get_integer_resource (dpy, "duration", "Integer");
+
+ st->controller = 0;
+ if (st->duration < 1) st->duration = 1;
+
+ s = get_string_resource (dpy, "mode", "Mode");
+ if (!s || !*s || !strcasecmp(s, "random"))
+ st->random_p = True;
+ else if (!strcasecmp(s, "text"))
+ st->controller = terminal_controller;
+ else if (!strcasecmp(s, "slideshow"))
+ st->controller = slideshow_controller;
+ else if (!strcasecmp(s, "basic"))
+ st->controller = basic_controller;
+ else
+ {
+ fprintf (stderr, "%s: mode must be text, slideshow, or random; not %s\n",
+ progname, s);
+ exit (1);
+ }
+ if (s) free (s);
+
+ global_program = get_string_resource (dpy, "program", "Program");
+ global_fast_p = get_boolean_resource (dpy, "fast", "Boolean");
+
+
+ /* Kludge for MacOS standalone mode: see OSX/SaverRunner.m. */
+ {
+ const char *s = getenv ("XSCREENSAVER_STANDALONE");
+ if (s && *s && strcmp(s, "0"))
+ {
+ st->controller = terminal_controller;
+ st->random_p = False;
+ global_program = getenv ("SHELL");
+ global_fast_p = True;
+ }
+ }
+
+
+ if (! st->random_p) {
+ if (st->controller == terminal_controller ||
+ st->controller == slideshow_controller)
+ st->duration = 999999; /* these run "forever" */
+ }
+
+ return st;
+}
+
+static unsigned long
+apple2_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if (! st->sim) {
+ if (st->random_p)
+ st->controller = controllers[random() % (countof(controllers))];
+ st->sim = apple2_start (dpy, window, st->duration, st->controller);
+ }
+
+ if (! apple2_one_frame (st->sim)) {
+ st->sim = 0;
+ }
+
+#ifdef HAVE_MOBILE
+ return 0;
+#else
+ return 5000;
+#endif
+}
+
+static void
+apple2_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ if (st->sim)
+ analogtv_reconfigure (st->sim->dec);
+}
+
+static Bool
+apple2_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+
+ if (st->sim &&
+ st->controller == terminal_controller &&
+ event->xany.type == KeyPress) {
+ terminal_keypress_handler (dpy, event, st->sim->controller_data);
+ return True;
+ }
+
+ return False;
+}
+
+static void
+apple2_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ if (st->sim) {
+ st->sim->stepno = A2CONTROLLER_DONE;
+ if (apple2_one_frame (st->sim))
+ abort(); /* should have freed! */
+ }
+ free (st);
+}
+
+
+XSCREENSAVER_MODULE ("Apple2", apple2)
diff --git a/hacks/apple2.c b/hacks/apple2.c
new file mode 100644
index 0000000..1918a5c
--- /dev/null
+++ b/hacks/apple2.c
@@ -0,0 +1,885 @@
+/* xscreensaver, Copyright (c) 1998-2010 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Apple ][ CRT simulator, by Trevor Blackwell <tlb@tlb.org>
+ * with additional work by Jamie Zawinski <jwz@jwz.org>
+ */
+
+#include <math.h>
+#include "screenhackI.h"
+#include "apple2.h"
+#include "ximage-loader.h"
+
+#ifdef HAVE_XSHM_EXTENSION
+#include "xshm.h"
+#endif
+
+/*
+ * Implementation notes
+ *
+ * The A2 had 3 display modes: text, lores, and hires. Text was 40x24, and it
+ * disabled color in the TV. Lores gave you 40x48 graphics blocks, using the
+ * same memory as the text screen. Each could be one of 16 colors. Hires gave
+ * you 280x192 pixels. Odd pixels were blue or purple, and even pixels were
+ * orange or green depending on the setting of the high bit in each byte.
+ *
+ * The graphics modes could also have 4 lines of text at the bottom. This was
+ * fairly unreadable if you had a color monitor.
+ *
+ * Each mode had 2 different screens using different memory space. In hires
+ * mode this was sometimes used for double buffering, but more often the lower
+ * screen was full of code/data and the upper screen was used for display, so
+ * you got random garbage on the screen.
+ *
+ * The text font is based on X's standard 6x10 font, with a few tweaks like
+ * putting a slash across the zero.
+ *
+ * To use this, you'll call apple2(display, window, duration,
+ * controller) where the function controller defines what will happen.
+ * See bsod.c and apple2-main.c for example controllers. The
+ * controller function gets called whenever the machine ready to start
+ * something new. By setting sim->printing or sim->typing, it'll be
+ * busy for some time spitting characters out one at a time. By
+ * setting *next_actiontime+=X.X, it'll pause and just update the screen
+ * for that long before calling the controller function again.
+ *
+ * By setting stepno to A2CONTROLLER_DONE, the loop will end. It will also end
+ * after the time specified by the delay parameter. In either case, it calls
+ * the controller with stepno==A2CONTROLLER_FREE to allow it to release any
+ * memory.
+ *
+ * The void* apple2_sim_t::controller_data is for the use of the controller.
+ * It will be initialize to NULL, and the controller can store its own state
+ * there.
+ *
+ */
+
+void
+a2_scroll(apple2_state_t *st)
+{
+ int i;
+ st->textlines[st->cursy][st->cursx] |= 0xc0; /* turn off cursor */
+
+ for (i=0; i<23; i++) {
+ memcpy(st->textlines[i],st->textlines[i+1],40);
+ }
+ memset(st->textlines[23],0xe0,40);
+}
+
+static void
+a2_printc_1(apple2_state_t *st, char c, int scroll_p)
+{
+ st->textlines[st->cursy][st->cursx] |= 0xc0; /* turn off blink */
+
+ if (c == '\n') /* ^J == NL */
+ {
+ if (st->cursy==23)
+ {
+ if (scroll_p)
+ a2_scroll(st);
+ }
+ else
+ {
+ st->cursy++;
+ }
+ st->cursx=0;
+ }
+ else if (c == 014) /* ^L == CLS, Home */
+ {
+ a2_cls(st);
+ a2_goto(st,0,0);
+ }
+ else if (c == '\t') /* ^I == tab */
+ {
+ a2_goto(st, st->cursy, (st->cursx+8)&~7);
+ }
+ else if (c == 010) /* ^H == backspace */
+ {
+ st->textlines[st->cursy][st->cursx]=0xe0;
+ a2_goto(st, st->cursy, st->cursx-1);
+ }
+ else if (c == '\r') /* ^M == CR */
+ {
+ st->cursx=0;
+ }
+ else
+ {
+ st->textlines[st->cursy][st->cursx]=c ^ 0xc0;
+ st->cursx++;
+ if (st->cursx==40) {
+ if (st->cursy==23) {
+ if (scroll_p)
+ a2_scroll(st);
+ } else {
+ st->cursy++;
+ }
+ st->cursx=0;
+ }
+ }
+
+ st->textlines[st->cursy][st->cursx] &= 0x7f; /* turn on blink */
+}
+
+void
+a2_printc(apple2_state_t *st, char c)
+{
+ a2_printc_1(st, c, 1);
+}
+
+void
+a2_printc_noscroll(apple2_state_t *st, char c)
+{
+ a2_printc_1(st, c, 0);
+}
+
+
+void
+a2_prints(apple2_state_t *st, char *s)
+{
+ while (*s) a2_printc(st, *s++);
+}
+
+void
+a2_goto(apple2_state_t *st, int r, int c)
+{
+ if (r > 23) r = 23;
+ if (c > 39) c = 39;
+ st->textlines[st->cursy][st->cursx] |= 0xc0; /* turn off blink */
+ st->cursy=r;
+ st->cursx=c;
+ st->textlines[st->cursy][st->cursx] &= 0x7f; /* turn on blink */
+}
+
+void
+a2_cls(apple2_state_t *st)
+{
+ int i;
+ for (i=0; i<24; i++) {
+ memset(st->textlines[i],0xe0,40);
+ }
+}
+
+void
+a2_clear_gr(apple2_state_t *st)
+{
+ int i;
+ for (i=0; i<24; i++) {
+ memset(st->textlines[i],0x00,40);
+ }
+}
+
+void
+a2_clear_hgr(apple2_state_t *st)
+{
+ int i;
+ for (i=0; i<192; i++) {
+ memset(st->hireslines[i],0,40);
+ }
+}
+
+void
+a2_invalidate(apple2_state_t *st)
+{
+}
+
+void
+a2_poke(apple2_state_t *st, int addr, int val)
+{
+
+ if (addr>=0x400 && addr<0x800) {
+ /* text memory */
+ int row=((addr&0x380)/0x80) + ((addr&0x7f)/0x28)*8;
+ int col=(addr&0x7f)%0x28;
+ if (row<24 && col<40) {
+ st->textlines[row][col]=val;
+ if (!(st->gr_mode&(A2_GR_HIRES)) ||
+ (!(st->gr_mode&(A2_GR_FULL)) && row>=20)) {
+ }
+ }
+ }
+ else if (addr>=0x2000 && addr<0x4000) {
+ int row=(((addr&0x1c00) / 0x400) * 1 +
+ ((addr&0x0380) / 0x80) * 8 +
+ ((addr&0x0078) / 0x28) * 64);
+ int col=((addr&0x07f)%0x28);
+ if (row<192 && col<40) {
+ st->hireslines[row][col]=val;
+ if (st->gr_mode&A2_GR_HIRES) {
+ }
+ }
+ }
+}
+
+void
+a2_hplot(apple2_state_t *st, int hcolor, int x, int y)
+{
+ int highbit,run;
+
+ highbit=((hcolor<<5)&0x80) ^ 0x80; /* capture bit 2 into bit 7 */
+
+ if (y<0 || y>=192 || x<0 || x>=280) return;
+
+ for (run=0; run<2 && x<280; run++) {
+ unsigned char *vidbyte = &st->hireslines[y][x/7];
+ unsigned char whichbit=1<<(x%7);
+ int masked_bit;
+
+ *vidbyte = (*vidbyte & 0x7f) | highbit;
+
+ /* use either bit 0 or 1 of hcolor for odd or even pixels */
+ masked_bit = (hcolor>>(1-(x&1)))&1;
+
+ /* Set whichbit to 1 or 0 depending on color */
+ *vidbyte = (*vidbyte & ~whichbit) | (masked_bit ? whichbit : 0);
+
+ x++;
+ }
+}
+
+void
+a2_hline(apple2_state_t *st, int hcolor, int x1, int y1, int x2, int y2)
+{
+ int dx,dy,incx,incy,x,y,balance;
+
+ /* Bresenham's line drawing algorithm */
+
+ if (x2>=x1) {
+ dx=x2-x1;
+ incx=1;
+ } else {
+ dx=x1-x2;
+ incx=-1;
+ }
+ if (y2>=y1) {
+ dy=y2-y1;
+ incy=1;
+ } else {
+ dy=y1-y2;
+ incy=-1;
+ }
+
+ x=x1; y=y1;
+
+ if (dx>=dy) {
+ dy*=2;
+ balance=dy-dx;
+ dx*=2;
+ while (x!=x2) {
+ a2_hplot(st, hcolor, x, y);
+ if (balance>=0) {
+ y+=incy;
+ balance-=dx;
+ }
+ balance+=dy;
+ x+=incx;
+ }
+ a2_hplot(st, hcolor, x, y);
+ } else {
+ dx*=2;
+ balance=dx-dy;
+ dy*=2;
+ while (y!=y2) {
+ a2_hplot(st, hcolor, x, y);
+ if (balance>=0) {
+ x+=incx;
+ balance-=dy;
+ }
+ balance+=dx;
+ y+=incy;
+ }
+ a2_hplot(st, hcolor, x, y);
+ }
+}
+
+void
+a2_plot(apple2_state_t *st, int color, int x, int y)
+{
+ int textrow=y/2;
+ unsigned char byte;
+
+ if (x<0 || x>=40 || y<0 || y>=48) return;
+
+ byte=st->textlines[textrow][x];
+ if (y&1) {
+ byte = (byte&0xf0) | (color&0x0f);
+ } else {
+ byte = (byte&0x0f) | ((color&0x0f)<<4);
+ }
+ st->textlines[textrow][x]=byte;
+}
+
+void
+a2_display_image_loading(apple2_state_t *st, unsigned char *image,
+ int lineno)
+{
+ /*
+ When loading images,it would normally just load the big binary
+ dump into screen memory while you watched. Because of the way
+ screen memory was laid out, it wouldn't load from the top down,
+ but in a funny interleaved way. You should call this with lineno
+ increasing from 0 thru 191 over a period of a few seconds.
+ */
+
+ int row=(((lineno / 24) % 8) * 1 +
+ ((lineno / 3 ) % 8) * 8 +
+ ((lineno / 1 ) % 3) * 64);
+
+ memcpy (st->hireslines[row], &image[row * 40], 40);
+}
+
+/*
+ Simulate plausible initial memory contents for running a program.
+*/
+void
+a2_init_memory_active(apple2_sim_t *sim)
+{
+ int i,j,x,y,c;
+ int addr=0;
+ apple2_state_t *st=sim->st;
+
+ while (addr<0x4000) {
+ int n;
+
+ switch (random()%4) {
+ case 0:
+ case 1:
+ n=random()%500;
+ for (i=0; i<n && addr<0x4000; i++) {
+ unsigned char rb=((random()%6==0 ? 0 : random()%16) |
+ ((random()%5==0 ? 0 : random()%16)<<4));
+ a2_poke(st, addr++, rb);
+ }
+ break;
+
+ case 2:
+ /* Simulate shapes stored in memory. We use the font since we have it.
+ Unreadable, since rows of each character are stored in consecutive
+ bytes. It was typical to store each of the 7 possible shifts of
+ bitmaps, for fastest blitting to the screen. */
+ x=random()%(sim->text_im->width);
+ for (i=0; i<100; i++) {
+ for (y=0; y<8; y++) {
+ c=0;
+ for (j=0; j<8; j++) {
+ c |= XGetPixel(sim->text_im, (x+j)%sim->text_im->width, y)<<j;
+ }
+ a2_poke(st, addr++, c);
+ }
+ x=(x+1)%(sim->text_im->width);
+ }
+ break;
+
+ case 3:
+ if (addr>0x2000) {
+ n=random()%200;
+ for (i=0; i<n && addr<0x4000; i++) {
+ a2_poke(st, addr++, 0);
+ }
+ }
+ break;
+
+ }
+ }
+}
+
+
+#if 1 /* jwz: since MacOS doesn't have "6x10", I dumped this font to a PNG...
+ */
+
+#include "images/gen/apple2font_png.h"
+
+static void
+a2_make_font(apple2_sim_t *sim)
+{
+ int pix_w, pix_h;
+ XWindowAttributes xgwa;
+ Pixmap m = 0;
+ Pixmap p = image_data_to_pixmap (sim->dpy, sim->window,
+ apple2font_png, sizeof(apple2font_png),
+ &pix_w, &pix_h, &m);
+ XImage *im = XGetImage (sim->dpy, p, 0, 0, pix_w, pix_h, ~0L, ZPixmap);
+ XImage *mm = XGetImage (sim->dpy, m, 0, 0, pix_w, pix_h, 1, XYPixmap);
+ unsigned long black =
+ BlackPixelOfScreen (DefaultScreenOfDisplay (sim->dpy));
+ int x, y;
+
+ XFreePixmap (sim->dpy, p);
+ XFreePixmap (sim->dpy, m);
+ if (pix_w != 64*7) abort();
+ if (pix_h != 8) abort();
+
+ XGetWindowAttributes (sim->dpy, sim->window, &xgwa);
+ sim->text_im = XCreateImage (sim->dpy, xgwa.visual, 1, XYBitmap, 0, 0,
+ pix_w, pix_h, 8, 0);
+ sim->text_im->data = malloc (sim->text_im->bytes_per_line *
+ sim->text_im->height);
+
+ /* Convert deep image to 1 bit */
+ for (y = 0; y < pix_h; y++)
+ for (x = 0; x < pix_w; x++)
+ XPutPixel (sim->text_im, x, y,
+ (XGetPixel (mm, x, y)
+ ? XGetPixel (im, x, y) == black
+ : 0));
+
+ XDestroyImage (im);
+ XDestroyImage (mm);
+}
+
+#else /* 0 */
+
+/* This table lists fixes for characters that differ from the standard 6x10
+ font. Each encodes a pixel, as (charindex*7 + x) + (y<<10) + (value<<15)
+ where value is 0 for white and 1 for black. */
+static const unsigned short a2_fixfont[] = {
+ /* Fix $ */ 0x8421, 0x941d,
+ /* Fix % */ 0x8024, 0x0028, 0x8425, 0x0426, 0x0825, 0x1027, 0x1426, 0x9427,
+ 0x1824, 0x9828,
+ /* Fix * */ 0x8049, 0x8449, 0x8849, 0x0c47, 0x0c48, 0x0c4a, 0x0c4b, 0x9049,
+ 0x9449, 0x9849,
+ /* Fix , */ 0x9057, 0x1458, 0x9856, 0x1857, 0x1c56,
+ /* Fix . */ 0x1465, 0x1864, 0x1866, 0x1c65,
+ /* Fix / */ 0x006e, 0x186a,
+ /* Fix 0 */ 0x8874, 0x8c73, 0x9072,
+ /* Fix 1 */ 0x0878, 0x1878, 0x187c,
+ /* Fix 5 */ 0x8895, 0x0c94, 0x0c95,
+ /* Fix 6 */ 0x809f, 0x8c9c, 0x109c,
+ /* Fix 7 */ 0x8ca4, 0x0ca5, 0x90a3, 0x10a4,
+ /* Fix 9 */ 0x08b3, 0x8cb3, 0x98b0,
+ /* Fix : */ 0x04b9, 0x08b8, 0x08ba, 0x0cb9, 0x90b9, 0x14b9, 0x18b8, 0x18b9,
+ 0x18ba, 0x1cb9,
+ /* Fix ; */ 0x04c0, 0x08bf, 0x08c1, 0x0cc0, 0x90c0, 0x14c1, 0x98bf, 0x18c0,
+ 0x1cbf,
+ /* Fix < */ 0x80c8, 0x00c9, 0x84c7, 0x04c8, 0x88c6, 0x08c7, 0x8cc5, 0x0cc6,
+ 0x90c6, 0x10c7,
+ 0x94c7, 0x14c8, 0x98c8, 0x18c9,
+ /* Fix > */ 0x80d3, 0x00d4, 0x84d4, 0x04d5, 0x88d5, 0x08d6, 0x8cd6, 0x0cd7,
+ 0x90d5, 0x10d6,
+ 0x94d4, 0x14d5, 0x98d3, 0x18d4,
+ /* Fix @ */ 0x88e3, 0x08e4, 0x8ce4, 0x98e5,
+ /* Fix B */ 0x84ef, 0x04f0, 0x88ef, 0x08f0, 0x8cef, 0x90ef, 0x10f0, 0x94ef,
+ 0x14f0,
+ /* Fix D */ 0x84fd, 0x04fe, 0x88fd, 0x08fe, 0x8cfd, 0x0cfe, 0x90fd, 0x10fe,
+ 0x94fd, 0x14fe,
+ /* Fix G */ 0x8116, 0x0516, 0x9916,
+ /* Fix J */ 0x0129, 0x012a, 0x052a, 0x852b, 0x092a, 0x892b, 0x0d2a, 0x8d2b,
+ 0x112a, 0x912b,
+ 0x152a, 0x952b, 0x992a,
+ /* Fix M */ 0x853d, 0x853f, 0x093d, 0x893e, 0x093f,
+ /* Fix Q */ 0x915a, 0x155a, 0x955b, 0x155c, 0x195b, 0x995c, 0x1d5c,
+ /* Fix V */ 0x8d7b, 0x0d7c, 0x0d7e, 0x8d7f, 0x917b, 0x117c, 0x117e, 0x917f,
+ /* Fix [ */ 0x819e, 0x81a2, 0x859e, 0x899e, 0x8d9e, 0x919e, 0x959e, 0x999e,
+ 0x99a2,
+ /* Fix \ */ 0x01a5, 0x19a9,
+ /* Fix ] */ 0x81ac, 0x81b0, 0x85b0, 0x89b0, 0x8db0, 0x91b0, 0x95b0, 0x99ac,
+ 0x99b0,
+ /* Fix ^ */ 0x01b5, 0x05b4, 0x05b6, 0x09b3, 0x89b5, 0x09b7, 0x8db4, 0x8db6,
+ 0x91b3, 0x91b7,
+ /* Fix _ */ 0x9db9, 0x9dbf,
+ 0,
+};
+
+static void
+a2_make_font(apple2_sim_t *sim)
+{
+ /*
+ Generate the font. It used a 5x7 font which looks a lot like the standard X
+ 6x10 font, with a few differences. So we render up all the uppercase
+ letters of 6x10, and make a few tweaks (like putting a slash across the
+ zero) according to fixfont.
+ */
+
+ int i;
+ const char *def_font="6x10";
+ XFontStruct *font;
+ Pixmap text_pm;
+ GC gc;
+ XGCValues gcv;
+
+ font = load_font_retry (sim->dpy, def_font);
+ if (!font) {
+ fprintf(stderr, "%s: can't load font %s\n", progname, def_font);
+ abort();
+ }
+
+ text_pm=XCreatePixmap(sim->dpy, sim->window, 64*7, 8, 1);
+
+ memset(&gcv, 0, sizeof(gcv));
+ gcv.foreground=1;
+ gcv.background=0;
+ gcv.font=font->fid;
+ gc=XCreateGC(sim->dpy, text_pm, GCFont|GCBackground|GCForeground, &gcv);
+
+ XSetForeground(sim->dpy, gc, 0);
+ XFillRectangle(sim->dpy, text_pm, gc, 0, 0, 64*7, 8);
+ XSetForeground(sim->dpy, gc, 1);
+ for (i=0; i<64; i++) {
+ char c=32+i;
+ int x=7*i+1;
+ int y=7;
+ if (c=='0') {
+ c='O';
+ XDrawString(sim->dpy, text_pm, gc, x, y, &c, 1);
+ } else {
+ XDrawString(sim->dpy, text_pm, gc, x, y, &c, 1);
+ }
+ }
+
+# if 0
+ for (i=0; a2_fixfont[i]; i++) {
+ XSetForeground (sim->dpy, gc, (a2_fixfont[i]>>15)&1);
+ XDrawPoint(sim->dpy, text_pm, gc, a2_fixfont[i]&0x3ff,
+ (a2_fixfont[i]>>10)&0xf);
+ }
+ XWriteBitmapFile(sim->dpy, "/tmp/a2font.xbm", text_pm, 64*7, 8, -1, -1);
+# endif
+
+ sim->text_im = XGetImage(sim->dpy, text_pm, 0, 0, 64*7, 8, ~0L, ZPixmap);
+ XFreeGC(sim->dpy, gc);
+ XFreePixmap(sim->dpy, text_pm);
+
+ for (i=0; a2_fixfont[i]; i++) {
+ XPutPixel(sim->text_im, a2_fixfont[i]&0x3ff,
+ (a2_fixfont[i]>>10)&0xf,
+ (a2_fixfont[i]>>15)&1);
+ }
+}
+
+#endif /* 0 */
+
+apple2_sim_t *
+apple2_start(Display *dpy, Window window, int delay,
+ void (*controller)(apple2_sim_t *sim,
+ int *stepno,
+ double *next_actiontime))
+{
+ apple2_sim_t *sim;
+
+ sim=(apple2_sim_t *)calloc(1,sizeof(apple2_sim_t));
+ sim->dpy = dpy;
+ sim->window = window;
+ sim->delay = delay;
+ sim->controller = controller;
+
+ sim->st = (apple2_state_t *)calloc(1,sizeof(apple2_state_t));
+ sim->dec = analogtv_allocate(dpy, window);
+ sim->inp = analogtv_input_allocate();
+
+ sim->reception.input = sim->inp;
+ sim->reception.level = 1.0;
+
+ sim->prompt=']';
+
+ if (random()%4==0 && !sim->dec->use_cmap && sim->dec->use_color && sim->dec->visbits>=8) {
+ sim->dec->flutter_tint=1;
+ }
+ else if (random()%3==0) {
+ sim->dec->flutter_horiz_desync=1;
+ }
+ sim->typing_rate = 1.0;
+
+ analogtv_set_defaults(sim->dec, "");
+ sim->dec->squish_control=0.05;
+ analogtv_setup_sync(sim->inp, 1, 0);
+
+
+ a2_make_font(sim);
+
+ sim->stepno=0;
+ a2_goto(sim->st,23,0);
+
+ if (random()%2==0) sim->basetime_tv.tv_sec -= 1; /* random blink phase */
+ sim->next_actiontime=0.0;
+
+ sim->curtime=0.0;
+ sim->next_actiontime=sim->curtime;
+ sim->controller (sim, &sim->stepno, &sim->next_actiontime);
+
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ gettimeofday(&sim->basetime_tv, NULL);
+# else
+ gettimeofday(&sim->basetime_tv);
+# endif
+
+ return sim;
+}
+
+int
+apple2_one_frame (apple2_sim_t *sim)
+{
+ double blinkphase;
+ int i;
+ int textrow;
+
+ if (sim->stepno==A2CONTROLLER_DONE)
+ goto DONE; /* when caller says we're done, be done, dammit! */
+
+ {
+ struct timeval curtime_tv;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&curtime_tv, &tzp);
+# else
+ gettimeofday(&curtime_tv);
+# endif
+ sim->curtime=(curtime_tv.tv_sec - sim->basetime_tv.tv_sec) +
+ 0.000001*(curtime_tv.tv_usec - sim->basetime_tv.tv_usec);
+ if (sim->curtime > sim->dec->powerup)
+ sim->dec->powerup=sim->curtime;
+ }
+
+ blinkphase=sim->curtime/0.8;
+
+ /* The blinking rate was controlled by 555 timer with a resistor/capacitor
+ time constant. Because the capacitor was electrolytic, the flash rate
+ varied somewhat between machines. I'm guessing 1.6 seconds/cycle was
+ reasonable. (I soldered a resistor in mine to make it blink faster.) */
+ i=sim->st->blink;
+ sim->st->blink=((int)blinkphase)&1;
+ if (sim->st->blink!=i && !(sim->st->gr_mode&A2_GR_FULL)) {
+ int downcounter=0;
+ /* For every row with blinking text, set the changed flag. This basically
+ works great except with random screen garbage in text mode, when we
+ end up redrawing the whole screen every second */
+ int row, col;
+ for (row=(sim->st->gr_mode ? 20 : 0); row<24; row++) {
+ for (col=0; col<40; col++) {
+ int c=sim->st->textlines[row][col];
+ if ((c & 0xc0) == 0x40) {
+ downcounter=4;
+ break;
+ }
+ }
+ if (downcounter>0) {
+ downcounter--;
+ }
+ }
+ }
+
+ if (sim->curtime >= sim->delay)
+ sim->stepno = A2CONTROLLER_DONE;
+
+ if (sim->printing) {
+ int nlcnt=0;
+ while (*sim->printing) {
+ if (*sim->printing=='\001') { /* pause */
+ sim->printing++;
+ break;
+ }
+ else if (*sim->printing=='\n') {
+ a2_printc(sim->st,*sim->printing);
+ sim->printing++;
+ nlcnt++;
+ if (nlcnt>=2) break;
+ }
+ else {
+ a2_printc(sim->st,*sim->printing);
+ sim->printing++;
+ }
+ }
+ if (!*sim->printing) sim->printing=NULL;
+ }
+ else if (sim->curtime >= sim->next_actiontime) {
+ if (sim->typing) {
+
+ int c;
+ /* If we're in the midst of typing a string, emit a character with
+ random timing. */
+ c =*sim->typing;
+ if (c==0) {
+ sim->typing=NULL;
+ }
+ else {
+ sim->typing++;
+ a2_printc(sim->st, c);
+ if (c=='\r' || c=='\n') {
+ sim->next_actiontime = sim->curtime;
+ }
+ else if (c==010) {
+ sim->next_actiontime = sim->curtime + 0.1;
+ }
+ else {
+ sim->next_actiontime = (sim->curtime +
+ (((random()%1000)*0.001 + 0.3) *
+ sim->typing_rate));
+ }
+ }
+ } else {
+ sim->next_actiontime = sim->curtime;
+
+ sim->controller (sim, &sim->stepno, &sim->next_actiontime);
+
+ if (sim->stepno==A2CONTROLLER_DONE) {
+
+ DONE:
+ sim->stepno=A2CONTROLLER_FREE;
+ sim->controller (sim, &sim->stepno, &sim->next_actiontime);
+ /* if stepno is changed, return 1 */
+ if (sim->stepno != A2CONTROLLER_FREE)
+ return 1;
+
+ XClearWindow(sim->dpy, sim->window);
+
+ /* free sim */
+ /* This is from a2_make_font */
+ free(sim->text_im->data);
+ sim->text_im->data = 0;
+ XDestroyImage(sim->text_im);
+
+ /* And free else */
+ analogtv_release(sim->dec);
+ free(sim->st);
+ free(sim->inp);
+ free(sim);
+
+ return 0;
+ }
+
+ }
+ }
+
+
+ analogtv_setup_sync(sim->inp, sim->st->gr_mode? 1 : 0, 0);
+ analogtv_setup_frame(sim->dec);
+
+ for (textrow=0; textrow<24; textrow++) {
+ int row;
+ for (row=textrow*8; row<textrow*8+8; row++) {
+
+ /* First we generate the pattern that the video circuitry shifts out
+ of memory. It has a 14.something MHz dot clock, equal to 4 times
+ the color burst frequency. So each group of 4 bits defines a color.
+ Each character position, or byte in hires, defines 14 dots, so odd
+ and even bytes have different color spaces. So, pattern[0..600]
+ gets the dots for one scan line. */
+
+ signed char *pp=&sim->inp->signal[row+ANALOGTV_TOP+4][ANALOGTV_PIC_START+100];
+
+ if ((sim->st->gr_mode&A2_GR_HIRES) &&
+ (row<160 || (sim->st->gr_mode&A2_GR_FULL))) {
+ int col;
+
+ /* Emulate the mysterious pink line, due to a bit getting
+ stuck in a shift register between the end of the last
+ row and the beginning of this one. */
+ if ((sim->st->hireslines[row][0] & 0x80) &&
+ (sim->st->hireslines[row][39]&0x40)) {
+ pp[-1]=ANALOGTV_WHITE_LEVEL;
+ }
+
+ for (col=0; col<40; col++) {
+ unsigned char b=sim->st->hireslines[row][col];
+ int shift=(b&0x80)?0:1;
+
+ /* Each of the low 7 bits in hires mode corresponded to 2 dot
+ clocks, shifted by one if the high bit was set. */
+ for (i=0; i<7; i++) {
+ pp[shift+1] = pp[shift] = (((b>>i)&1)
+ ?ANALOGTV_WHITE_LEVEL
+ :ANALOGTV_BLACK_LEVEL);
+ pp+=2;
+ }
+ }
+ }
+ else if ((sim->st->gr_mode&A2_GR_LORES) &&
+ (row<160 || (sim->st->gr_mode&A2_GR_FULL))) {
+ int col;
+ for (col=0; col<40; col++) {
+ unsigned char nib=((sim->st->textlines[textrow][col] >> (((row/4)&1)*4))
+ & 0xf);
+ /* The low or high nybble was shifted out one bit at a time. */
+ for (i=0; i<14; i++) {
+ *pp = (((nib>>((col*14+i)&3))&1)
+ ?ANALOGTV_WHITE_LEVEL
+ :ANALOGTV_BLACK_LEVEL);
+ pp++;
+ }
+ }
+ }
+ else {
+ int col;
+ for (col=0; col<40; col++) {
+ int rev;
+ int c=sim->st->textlines[textrow][col]&0xff;
+ /* hi bits control inverse/blink as follows:
+ 0x00: inverse
+ 0x40: blink
+ 0x80: normal
+ 0xc0: normal */
+ rev=!(c&0x80) && (!(c&0x40) || sim->st->blink);
+
+ for (i=0; i<7; i++) {
+ unsigned long pix=XGetPixel(sim->text_im,
+ ((c&0x3f)^0x20)*7+i,
+ row%8);
+ pp[1] = pp[2] = ((pix^rev)
+ ?ANALOGTV_WHITE_LEVEL
+ :ANALOGTV_BLACK_LEVEL);
+ pp+=2;
+ }
+ }
+ }
+ }
+ }
+ analogtv_reception_update(&sim->reception);
+ {
+ const analogtv_reception *rec = &sim->reception;
+ analogtv_draw(sim->dec, 0.02, &rec, 1);
+ }
+
+ return 1;
+}
+
+
+#if 0
+void
+a2controller_test(apple2_sim_t *sim, int *stepno, double *next_actiontime)
+{
+ int row,col;
+
+ switch(*stepno) {
+ case 0:
+ a2_invalidate(sim->st);
+ /*
+ For testing color rendering. The spec is:
+ red grn blu
+ 0 black 0 0 0
+ 1 red 227 30 96
+ 2 dk blue 96 78 189
+ 3 purple 255 68 253
+ 4 dk green 0 163 96
+ 5 gray 156 156 156
+ 6 med blue 20 207 253
+ 7 lt blue 208 195 255
+ 8 brown 96 114 3
+ 9 orange 255 106 60
+ 10 grey 156 156 156
+ 11 pink 255 160 208
+ 12 lt green 20 245 60
+ 13 yellow 208 221 141
+ 14 aqua 114 255 208
+ 15 white 255 255 255
+ */
+ sim->st->gr_mode=A2_GR_LORES;
+ for (row=0; row<24; row++) {
+ for (col=0; col<40; col++) {
+ sim->st->textlines[row][col]=(row&15)*17;
+ }
+ }
+ *next_actiontime+=0.4;
+ *stepno=99;
+ break;
+
+ case 99:
+ if (sim->curtime > 10) *stepno=-1;
+ break;
+ }
+}
+#endif
diff --git a/hacks/apple2.h b/hacks/apple2.h
new file mode 100644
index 0000000..87f18a9
--- /dev/null
+++ b/hacks/apple2.h
@@ -0,0 +1,121 @@
+/* xscreensaver, Copyright (c) 1998-2004 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Apple ][ CRT simulator, by Trevor Blackwell <tlb@tlb.org>
+ * with additional work by Jamie Zawinski <jwz@jwz.org>
+ */
+
+#ifndef __XSCREENSAVER_APPLE_II__
+#define __XSCREENSAVER_APPLE_II__
+
+#include "analogtv.h"
+
+typedef struct apple2_state {
+ unsigned char hireslines[192][40];
+ unsigned char textlines[24][40];
+ int gr_text;
+ enum {
+ A2_GR_FULL=1,
+ A2_GR_LORES=2,
+ A2_GR_HIRES=4
+ } gr_mode;
+ int cursx;
+ int cursy;
+ int blink;
+
+} apple2_state_t;
+
+
+typedef struct apple2_sim_s apple2_sim_t;
+struct apple2_sim_s {
+
+ void *controller_data;
+
+ apple2_state_t *st;
+
+ analogtv *dec;
+ analogtv_input *inp;
+ analogtv_reception reception;
+
+ const char *typing;
+ char typing_buf[1024];
+ double typing_rate;
+
+ char *printing;
+ char printing_buf[1024];
+
+ char prompt;
+
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ XImage *text_im;
+
+ struct timeval basetime_tv;
+ double curtime;
+ double delay;
+
+ int stepno;
+ double next_actiontime;
+ void (*controller)(apple2_sim_t *sim,
+ int *stepno,
+ double *next_actiontime);
+
+};
+
+
+enum {
+ A2_HCOLOR_BLACK=0,
+ A2_HCOLOR_GREEN=1,
+ A2_HCOLOR_PURPLE=2,
+ A2_HCOLOR_WHITE=3,
+ A2_HCOLOR_ALTBLACK=4,
+ A2_HCOLOR_RED=5,
+ A2_HCOLOR_BLUE=6,
+ A2_HCOLOR_ALTWHITE=7
+ };
+
+enum {
+ A2CONTROLLER_DONE=-1,
+ A2CONTROLLER_FREE=-2
+};
+
+
+extern apple2_sim_t * apple2_start (Display *, Window, int delay,
+ void (*)(apple2_sim_t *, int *stepno,
+ double *next_actiontime));
+extern int apple2_one_frame (apple2_sim_t *);
+
+
+void a2_poke(apple2_state_t *st, int addr, int val);
+void a2_goto(apple2_state_t *st, int r, int c);
+void a2_cls(apple2_state_t *st);
+void a2_invalidate(apple2_state_t *st);
+
+void a2_add_disk_item(apple2_state_t *st, char *name, unsigned char *data,
+ int len, char type);
+void a2_scroll(apple2_state_t *st);
+void a2_printc(apple2_state_t *st, char c);
+void a2_printc_noscroll(apple2_state_t *st, char c);
+void a2_prints(apple2_state_t *st, char *s);
+void a2_goto(apple2_state_t *st, int r, int c);
+void a2_cls(apple2_state_t *st);
+void a2_clear_hgr(apple2_state_t *st);
+void a2_clear_gr(apple2_state_t *st);
+void a2_invalidate(apple2_state_t *st);
+void a2_poke(apple2_state_t *st, int addr, int val);
+void a2_display_image_loading(apple2_state_t *st, unsigned char *image,
+ int lineno);
+void a2_init_memory_active(apple2_sim_t *sim);
+void a2_hplot(apple2_state_t *st, int hcolor, int x, int y);
+void a2_hline(apple2_state_t *st, int hcolor, int x1, int y1, int x2, int y2);
+void a2_plot(apple2_state_t *st, int color, int x, int y);
+
+#endif /* __XSCREENSAVER_APPLE_II__ */
diff --git a/hacks/apple2.man b/hacks/apple2.man
new file mode 100644
index 0000000..b0d6d5c
--- /dev/null
+++ b/hacks/apple2.man
@@ -0,0 +1,206 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "5-May-2004" "X Version 11"
+.SH NAME
+apple2 - Apple ][ display emulator
+.SH SYNOPSIS
+.B apple2
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-visual \fIvisual\fP]
+[\-program \fIcommand to run\fP]
+[\-basic] [\-slideshow] [\-text]
+[\-meta] [\-esc] [\-bs] [\-del] [\-fast]
+[\-fps]
+.SH DESCRIPTION
+The
+.I apple2
+program simulates an original Apple ][ Plus computer in all its 1979
+glory. It also reproduces the appearance of display on a color
+television set of the period.
+.PP
+There are 3 modes: basic, slideshow, and text. Normally it chooses a
+mode randomly, but you can override with the \fI\-basic\fP,
+\fI\-slideshow\fP, or \fI\-text\fP options.
+
+In basic mode a simulated user types in a Basic program and runs it.
+
+In slideshow mode it chooses a number of images from the image source
+you configured into XScreenSaver and displays them within the
+limitations of the Apple ][ display hardware. With only 6 available
+colors, you can only make out the general shape of the pictures.
+
+In text mode it displays the output of a command or the contents of
+a file or URL (via the default
+.BR xscreensaver-text (1)
+program, which can be overridden with \fI\-program\fP).
+
+In text mode, it is also a fully functional (if anachronistic)
+vt100 terminal emulator.
+.SH OPTIONS
+.I apple2
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-basic
+Choose basic mode
+.TP 8
+.B \-slideshow
+Choose slideshow mode
+.TP 8
+.B \-text
+Choose text mode
+.TP 8
+.B \-program \fIsh-command\fP
+In text mode, the command to run to generate the text to display. This
+option may be any string acceptable to /bin/sh. The program will be
+run at the end of a pipe, and any characters that it prints to
+\fIstdout\fP will be printed on the Apple ][ display. If the program
+exits, it will be launched again after 3 seconds. Default:
+.BR xscreensaver-text (1).
+
+In text mode, \fIapple2\fP emulates a vt100 terminal running on a 40x24
+uppercase-only screen.
+
+For example:
+.EX
+apple2 -text \\
+ -program 'cat /usr/src/linux*/README | fold -sw40'
+apple2 -text -program 'ping apple.com'
+apple2 -text -program 'ps -e'
+apple2 -text -program 'od -txCz -w7 /dev/urandom'
+apple2 -text -program 'cat /dev/random'
+apple2 -text -fast -program 'xemacs -nw -q -f life'
+apple2 -text -fast \\
+ -program 'xemacs -nw -q --eval "(hanoi 5)"'
+.EE
+You can also use \fIapple2\fP as an extremely lo-fi replacement for the
+.BR xterm (1)
+and
+.BR gnome-terminal (1)
+terminal emulators:
+.EX
+apple2 -text -fast -program tcsh
+.EE
+.TP 8
+.B \-pty
+In \fI\-text\fP mode, launch the sub-program under a pty so that it
+can address the screen directly. This is the default.
+.TP 8
+.B \-pipe
+In \fI\-text\fP mode, launch the sub-program at the end of a pipe:
+do not let it address the screen directly.
+.TP 8
+.B \-esc
+When the user types a key with the Alt or Meta keys held down, send an
+ESC character first. This is the default.
+.TP 8
+.B \-meta
+When Meta or Alt are held down, set the high bit on the character instead.
+.TP 8
+.B \-del
+Swap Backspace and Delete. This is the default.
+.TP 8
+.B \-bs
+Do not swap Backspace and Delete.
+.TP 8
+.B \-fast
+Normally, characters are printed at the speed of an original Apple][
+computer; however, when using this program as a terminal emulator,
+the novelty of those 300 baud characters might wear off. You can use
+the \fI\-fast\fP option to speed things up a bit.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH TERMINAL EMULATION
+By default, \fIapple2\fP allocates a pseudo-tty for the \fI\-text\fP-mode
+sub-process to run under. This has the desirable side effect that the
+program will be able to use
+.BR ioctl (2)
+to fetch information about terminal parameters and window size, which
+many programs (such as
+.BR top (1))
+need to run properly. \fIapple2\fP will also set the environment
+variable \fITERM\fP to \fIvt100\fP in the child process.
+
+Any characters typed on the apple2 window will be passed along to
+the sub-process. (Note that this only works when running in "window"
+mode, not when running in \fI\-root\fP mode under xscreensaver.)
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.TP 8
+.B TERM
+to inform the sub-process of the type of terminal emulation.
+.SH X RESOURCES
+Notable X resources supported include the following which correspond
+to standard TV controls:
+.BR analogTVTint ,
+.BR analogTVColor ,
+.BR analogTVBrightness ,
+and
+.BR analogTVContrast
+which correspond to standard TV controls. They range from 0 to
+100,except for tint which is an angle between -180 and +180.
+.SH TRADEMARKS
+Apple ][ and Applesoft are trademarks of Apple Computer.
+
+.SH SEE ALSO
+.BR xscreensaver (1),
+.BR bsod (MANSUFFIX),
+.BR xscreensaver-text (1),
+.BR fortune (1),
+.BR phosphor (MANSUFFIX),
+.BR starwars (MANSUFFIX),
+.BR ljlatest (MANSUFFIX),
+.BR dadadodo (1),
+.BR webcollage (MANSUFFIX),
+.BR driftnet (1)
+.BR EtherPEG ,
+.BR EtherPeek ,
+.BR console_codes (4).
+.SH COPYRIGHT
+Copyright \(co 2002-2003 by Trevor Blackwell. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Television and Apple ][ emulation by Trevor Blackwell <tlb@tlb.org>.
+Slideshow and text mode by Jamie Zawinski <jwz@jwz.org>.
+Pty and vt100 emulation by Fredrik Tolf <fredrik@dolda2000.com>.
diff --git a/hacks/asm6502.c b/hacks/asm6502.c
new file mode 100644
index 0000000..27d2824
--- /dev/null
+++ b/hacks/asm6502.c
@@ -0,0 +1,2275 @@
+/*-*- indent-tabs-mode:nil -*- */
+/* Copyright (C) 2007 Jeremy English <jhe@jeremyenglish.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Created: 12-April-2007
+ */
+
+/*
+ This is a port of the javascript 6502 assembler, compiler and
+ debugger. The orignal code was copyright 2006 by Stian Soreng -
+ www.6502asm.com
+
+ I changed the structure of the assembler in this version.
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+/*#include <malloc.h>*/
+#include <string.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <ctype.h>
+#include <math.h>
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+#if defined(HAVE_STDINT_H)
+# include <stdint.h>
+#elif defined(HAVE_INTTYPES_H)
+# include <inttypes.h>
+#endif
+#include <unistd.h>
+
+#include "yarandom.h"
+#include "asm6502.h"
+
+/*#ifdef DEBUGGER
+# define random rand
+#endif*/
+
+#ifndef HAVE_MOBILE
+# define READ_FILES
+#endif
+
+typedef enum{
+ LEFT, RIGHT
+ } Side;
+
+/*
+
+Bit Flags
+ _ _ _ _ _ _ _ _
+ |N||V||F||B||D||I||Z||C|
+ - - - - - - - -
+ 7 6 5 4 3 2 1 0
+
+*/
+
+typedef enum{
+ CARRY_FL = 0, ZERO_FL = 1, INTERRUPT_FL = 2,
+ DECIMAL_FL = 3, BREAK_FL = 4, FUTURE_FL = 5,
+ OVERFLOW_FL = 6, NEGATIVE_FL = 7
+ } Flags;
+
+
+typedef BOOL (*CharTest) (char);
+
+/* A jump function takes a pointer to the current machine and a
+ opcode. The opcode is needed to figure out the memory mode. */
+/*typedef void (*JumpFunc) (machine_6502* AddrMode);*/
+
+typedef struct {
+ m6502_AddrMode type;
+ Bit32 value[MAX_PARAM_VALUE];
+ unsigned int vp; /*value pointer, index into the value table.*/
+ char *label;
+ Bit32 lbladdr;
+} Param;
+
+typedef struct {
+ Bit32 addr; /* Address of the label */
+ char *label;
+} Label;
+
+typedef struct AsmLine AsmLine;
+struct AsmLine {
+ BOOL labelDecl; /* Does the line have a label declaration? */
+ Label *label;
+ char *command;
+ Param *param;
+ AsmLine *next; /* in list */
+};
+
+typedef struct {
+ Bit16 addr;
+ Bit16 value;
+} Pointer;
+
+
+/*static void *emalloc(size_t n) {
+ void *p = malloc(n);
+ if (! p) abort();
+ return p;
+}*/
+
+static void *ecalloc(uint32_t nelm, size_t nsize){
+ void *p = calloc(nelm, nsize);
+ if (!p) abort();
+ return p;
+}
+
+/* estrdup() - Allocates memory for a new string a returns a copy of the source sting in it. */
+static char *estrdup(const char *source){
+ int ln = strlen(source) + 1;
+ char *s = ecalloc(ln, sizeof(char));
+ strncpy(s,source,ln);
+ return s;
+}
+
+static void checkAddress(Bit32 address){
+ /* XXX: Do we want to kill the program here? */
+ if (address >= MEM_64K)
+ fprintf(stderr, "Address %d is beyond 64k", address);
+}
+
+/*
+ * stackPush() - Push byte to stack
+ *
+ */
+
+static void stackPush(machine_6502 *machine, Bit8 value ) {
+ if(machine->regSP >= STACK_BOTTOM){
+ machine->memory[machine->regSP--] = value;
+ }
+ else{
+ fprintf(stderr, "The stack is full: %.4x\n", machine->regSP);
+ machine->codeRunning = FALSE;
+ }
+}
+
+
+/*
+ * stackPop() - Pop byte from stack
+ *
+ */
+
+static Bit8 stackPop(machine_6502 *machine) {
+ if (machine->regSP < STACK_TOP){
+ Bit8 value =machine->memory[++machine->regSP];
+ return value;
+ }
+ else {
+ /* fprintf(stderr, "The stack is empty.\n"); xxx */
+ machine->codeRunning = FALSE;
+ return 0;
+ }
+}
+
+static void pushByte(machine_6502 *machine, Bit32 value ) {
+ Bit32 address = machine->defaultCodePC;
+ checkAddress(address);
+ machine->memory[address] = value & 0xff;
+ machine->codeLen++;
+ machine->defaultCodePC++;
+}
+
+/*
+ * pushWord() - Push a word using pushByte twice
+ *
+ */
+
+static void pushWord(machine_6502 *machine, Bit16 value ) {
+ pushByte(machine, value & 0xff );
+ pushByte(machine, (value>>8) & 0xff );
+}
+
+/*
+ * popByte( machine_6502 *machine,) - Pops a byte
+ *
+ */
+
+static Bit8 popByte( machine_6502 *machine) {
+ Bit8 value = machine->memory[machine->regPC];
+ machine->regPC++;
+ return value;
+}
+
+/*
+ * popWord() - Pops a word using popByte() twice
+ *
+ */
+
+static int popWord(machine_6502 *machine) {
+ return popByte(machine) + (popByte(machine) << 8);
+}
+
+
+/*
+ * memReadByte() - Peek a byte, don't touch any registers
+ *
+ */
+
+static int memReadByte( machine_6502 *machine, int addr ) {
+ if( addr == 0xfe ) return floor( random()%255 );
+ return machine->memory[addr];
+}
+
+static void updateDisplayPixel(machine_6502 *machine, Bit16 addr){
+ Bit8 idx = memReadByte(machine,addr) & 0x0f;
+ Bit8 x,y;
+ addr -= 0x200;
+ x = addr & 0x1f;
+ y = (addr >> 5);
+ if (machine->plot) {
+ machine->plot(x,y,idx,machine->plotterState);
+ }
+}
+
+/*
+ * memStoreByte() - Poke a byte, don't touch any registers
+ *
+ */
+
+static void memStoreByte( machine_6502 *machine, int addr, int value ) {
+ machine->memory[ addr ] = (value & 0xff);
+ if( (addr >= 0x200) && (addr<=0x5ff) )
+ updateDisplayPixel(machine, addr );
+}
+
+
+
+/* EMULATION CODE */
+
+static Bit8 bitOn(Bit8 value,Flags bit){
+ Bit8 mask = 1;
+ mask = mask << bit;
+ return ((value & mask) > 0);
+}
+
+static Bit8 bitOff(Bit8 value, Flags bit){
+ return (! bitOn(value,bit));
+}
+
+static Bit8 setBit(Bit8 value, Flags bit, int on){
+ Bit8 onMask = 1;
+ Bit8 offMask = 0xff;
+ onMask = onMask << bit;
+ offMask = offMask ^ onMask;
+ return ((on) ? value | onMask : value & offMask);
+}
+
+static Bit8 nibble(Bit8 value, Side side){
+ switch(side){
+ case LEFT: return value & 0xf0;
+ case RIGHT: return value & 0xf;
+ default:
+ fprintf(stderr,"nibble unknown side\n");
+ return 0;
+ }
+}
+
+
+/* used for tracing. XXX: combined with function getvalue */
+static BOOL peekValue(machine_6502 *machine, m6502_AddrMode adm, Pointer *pointer, Bit16 PC){
+ Bit8 zp;
+ pointer->value = 0;
+ pointer->addr = 0;
+ switch(adm){
+ case SINGLE:
+ return FALSE;
+ case IMMEDIATE_LESS:
+ case IMMEDIATE_GREAT:
+ case IMMEDIATE_VALUE:
+ pointer->value = memReadByte(machine, PC);
+ return TRUE;
+ case INDIRECT_X:
+ zp = memReadByte(machine, PC) + machine->regX;
+ pointer->addr = memReadByte(machine,zp) +
+ (memReadByte(machine,zp+1)<<8);
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case INDIRECT_Y:
+ zp = memReadByte(machine, PC);
+ pointer->addr = memReadByte(machine,zp) +
+ (memReadByte(machine,zp+1)<<8) + machine->regY;
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ZERO:
+ pointer->addr = memReadByte(machine, PC);
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ZERO_X:
+ pointer->addr = memReadByte(machine, PC) + machine->regX;
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ZERO_Y:
+ pointer->addr = memReadByte(machine, PC) + machine->regY;
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ABS_OR_BRANCH:
+ pointer->addr = memReadByte(machine, PC);
+ return TRUE;
+ case ABS_VALUE:
+ pointer->addr = memReadByte(machine, PC) + (memReadByte(machine, PC+1) << 8);
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ABS_LABEL_X:
+ case ABS_X:
+ pointer->addr = (memReadByte(machine, PC) +
+ (memReadByte(machine, PC+1) << 8)) + machine->regX;
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ABS_LABEL_Y:
+ case ABS_Y:
+ pointer->addr = (memReadByte(machine, PC) +
+ (memReadByte(machine, PC+1) << 8)) + machine->regY;
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case DCB_PARAM:
+ /* Handled elsewhere */
+ break;
+ }
+ return FALSE;
+
+}
+
+
+/* Figure out how to get the value from the addrmode and get it.*/
+static BOOL getValue(machine_6502 *machine, m6502_AddrMode adm, Pointer *pointer){
+ Bit8 zp;
+ pointer->value = 0;
+ pointer->addr = 0;
+ switch(adm){
+ case SINGLE:
+ return FALSE;
+ case IMMEDIATE_LESS:
+ case IMMEDIATE_GREAT:
+ case IMMEDIATE_VALUE:
+ pointer->value = popByte(machine);
+ return TRUE;
+ case INDIRECT_X:
+ zp = popByte(machine) + machine->regX;
+ pointer->addr = memReadByte(machine,zp) +
+ (memReadByte(machine,zp+1)<<8);
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case INDIRECT_Y:
+ zp = popByte(machine);
+ pointer->addr = memReadByte(machine,zp) +
+ (memReadByte(machine,zp+1)<<8) + machine->regY;
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ZERO:
+ pointer->addr = popByte(machine);
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ZERO_X:
+ pointer->addr = popByte(machine) + machine->regX;
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ZERO_Y:
+ pointer->addr = popByte(machine) + machine->regY;
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ABS_OR_BRANCH:
+ pointer->addr = popByte(machine);
+ return TRUE;
+ case ABS_VALUE:
+ pointer->addr = popWord(machine);
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ABS_LABEL_X:
+ case ABS_X:
+ pointer->addr = popWord(machine) + machine->regX;
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case ABS_LABEL_Y:
+ case ABS_Y:
+ pointer->addr = popWord(machine) + machine->regY;
+ pointer->value = memReadByte(machine, pointer->addr);
+ return TRUE;
+ case DCB_PARAM:
+ /* Handled elsewhere */
+ break;
+ }
+ return FALSE;
+
+}
+
+#if 0
+static void dismem(machine_6502 *machine, m6502_AddrMode adm, char *output){
+ Bit8 zp;
+ Bit16 n;
+ switch(adm){
+ case SINGLE:
+ *output = 0;
+ break;
+ case IMMEDIATE_LESS:
+ case IMMEDIATE_GREAT:
+ case IMMEDIATE_VALUE:
+ n = popByte(machine);
+ sprintf(output,"#$%x",n);
+ break;
+ case INDIRECT_X:
+ zp = popByte(machine);
+ n = memReadByte(machine,zp) +
+ (memReadByte(machine,zp+1)<<8);
+ sprintf(output,"($%x,x)",n);
+ break;
+ case INDIRECT_Y:
+ zp = popByte(machine);
+ n = memReadByte(machine,zp) +
+ (memReadByte(machine,zp+1)<<8);
+ sprintf(output,"($%x),y",n);
+ break;
+ case ABS_OR_BRANCH:
+ case ZERO:
+ n = popByte(machine);
+ sprintf(output,"$%x",n);
+ break;
+ case ZERO_X:
+ n = popByte(machine);
+ sprintf(output,"$%x,x",n);
+ break;
+ case ZERO_Y:
+ n = popByte(machine);
+ sprintf(output,"$%x,y",n);
+ break;
+ case ABS_VALUE:
+ n = popWord(machine);
+ sprintf(output,"$%x",n);
+ break;
+ case ABS_LABEL_X:
+ case ABS_X:
+ n = popWord(machine);
+ sprintf(output,"$%x,x",n);
+ break;
+ case ABS_LABEL_Y:
+ case ABS_Y:
+ n = popWord(machine);
+ sprintf(output,"$%x,x",n);
+ break;
+ case DCB_PARAM:
+ *output = 0;
+ break;
+ }
+}
+#endif
+
+/* manZeroNeg - Manage the negative and zero flags */
+static void manZeroNeg(machine_6502 *machine, Bit8 value){
+ machine->regP = setBit(machine->regP, ZERO_FL, (value == 0));
+ machine->regP = setBit(machine->regP, NEGATIVE_FL, bitOn(value,NEGATIVE_FL));
+}
+
+static void warnValue(BOOL isValue){
+ if (! isValue){
+ fprintf(stderr,"Invalid Value from getValue.\n");
+ }
+}
+
+static void jmpADC(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ Bit16 tmp;
+ Bit8 c = bitOn(machine->regP, CARRY_FL);
+ BOOL isValue = getValue(machine, adm, &ptr);
+
+ warnValue(isValue);
+
+ if (bitOn(machine->regA, NEGATIVE_FL) &&
+ bitOn(ptr.value, NEGATIVE_FL))
+ machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
+ else
+ machine->regP = setBit(machine->regP, OVERFLOW_FL, 1);
+
+ if (bitOn(machine->regP, DECIMAL_FL)) {
+ tmp = nibble(machine->regA,RIGHT) + nibble(ptr.value,RIGHT ) + c;
+ /* The decimal part is limited to 0 through 9 */
+ if (tmp >= 10){
+ tmp = 0x10 | ((tmp + 6) & 0xf);
+ }
+ tmp += nibble(machine->regA,LEFT) + nibble(ptr.value,LEFT);
+ if (tmp >= 160){
+ machine->regP = setBit(machine->regP,CARRY_FL,1);
+ if (bitOn(machine->regP, OVERFLOW_FL) && tmp >= 0x180)
+ machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
+ tmp += 0x60;
+ }
+ else {
+ machine->regP = setBit(machine->regP,CARRY_FL,0);
+ if (bitOn(machine->regP, OVERFLOW_FL) && tmp < 0x80)
+ machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
+ }
+ } /* end decimal */
+ else {
+ tmp = machine->regA + ptr.value + c;
+ if ( tmp >= 0x100 ){
+ machine->regP = setBit(machine->regP,CARRY_FL,1);
+ if (bitOn(machine->regP, OVERFLOW_FL) && tmp >= 0x180)
+ machine->regP =setBit(machine->regP, OVERFLOW_FL, 0);
+ }
+ else {
+ machine->regP = setBit(machine->regP,CARRY_FL,0);
+ if (bitOn(machine->regP, OVERFLOW_FL) && tmp < 0x80)
+ machine->regP =setBit(machine->regP, OVERFLOW_FL, 0);
+ }
+ }
+
+ machine->regA = tmp;
+ manZeroNeg(machine,machine->regA);
+}
+
+static void jmpAND(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ machine->regA &= ptr.value;
+ manZeroNeg(machine,machine->regA);
+}
+
+static void jmpASL(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ if (isValue){
+ machine->regP = setBit(machine->regP, CARRY_FL, bitOn(ptr.value, NEGATIVE_FL));
+ ptr.value = ptr.value << 1;
+ ptr.value = setBit(ptr.value, CARRY_FL, 0);
+ memStoreByte(machine, ptr.addr, ptr.value);
+ manZeroNeg(machine,ptr.value);
+ }
+ else { /* Accumulator */
+ machine->regP = setBit(machine->regP, CARRY_FL, bitOn(machine->regA, NEGATIVE_FL));
+ machine->regA = machine->regA << 1;
+ machine->regA = setBit(machine->regA, CARRY_FL, 0);
+ manZeroNeg(machine,machine->regA);
+ }
+
+}
+
+static void jmpBIT(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ machine->regP = setBit(machine->regP, ZERO_FL, !(ptr.value & machine->regA));
+ machine->regP = setBit(machine->regP, OVERFLOW_FL, bitOn(ptr.value, OVERFLOW_FL));
+ machine->regP = setBit(machine->regP, NEGATIVE_FL, bitOn(ptr.value, NEGATIVE_FL));
+
+}
+
+static void jumpBranch(machine_6502 *machine, Bit16 offset){
+ if ( offset > 0x7f )
+ machine->regPC = machine->regPC - (0x100 - offset);
+ else
+ machine->regPC = machine->regPC + offset;
+}
+
+static void jmpBPL(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ if (bitOff(machine->regP,NEGATIVE_FL))
+ jumpBranch(machine, ptr.addr);
+
+}
+
+static void jmpBMI(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ if (bitOn(machine->regP,NEGATIVE_FL))
+ jumpBranch(machine, ptr.addr);
+
+}
+
+static void jmpBVC(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ if (bitOff(machine->regP,OVERFLOW_FL))
+ jumpBranch(machine, ptr.addr);
+}
+
+static void jmpBVS(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ if (bitOn(machine->regP,OVERFLOW_FL))
+ jumpBranch(machine, ptr.addr);
+}
+
+static void jmpBCC(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ if (bitOff(machine->regP,CARRY_FL))
+ jumpBranch(machine, ptr.addr);
+}
+
+static void jmpBCS(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ if (bitOn(machine->regP,CARRY_FL))
+ jumpBranch(machine, ptr.addr);
+}
+
+static void jmpBNE(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ if (bitOff(machine->regP, ZERO_FL))
+ jumpBranch(machine, ptr.addr);
+}
+
+static void jmpBEQ(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ if (bitOn(machine->regP, ZERO_FL))
+ jumpBranch(machine, ptr.addr);
+}
+
+static void doCompare(machine_6502 *machine, Bit16 reg, Pointer *ptr){
+ machine->regP = setBit(machine->regP,CARRY_FL, ((reg + ptr->value) > 0xff));
+ manZeroNeg(machine,(reg - ptr->value));
+}
+
+static void jmpCMP(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ doCompare(machine,machine->regA,&ptr);
+}
+
+static void jmpCPX(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ doCompare(machine,machine->regX,&ptr);
+}
+
+static void jmpCPY(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ doCompare(machine,machine->regY,&ptr);
+}
+
+static void jmpDEC(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ if (ptr.value > 0)
+ ptr.value--;
+ else
+ ptr.value = 0xFF;
+ memStoreByte(machine, ptr.addr, ptr.value);
+ manZeroNeg(machine,ptr.value);
+}
+
+static void jmpEOR(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ machine->regA ^= ptr.value;
+ manZeroNeg(machine, machine->regA);
+}
+
+static void jmpCLC(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regP = setBit(machine->regP, CARRY_FL, 0);
+}
+
+static void jmpSEC(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regP = setBit(machine->regP, CARRY_FL, 1);
+}
+
+static void jmpCLI(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regP = setBit(machine->regP, INTERRUPT_FL, 0);
+}
+
+static void jmpSEI(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regP = setBit(machine->regP, INTERRUPT_FL, 1);
+}
+
+static void jmpCLV(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
+}
+
+static void jmpCLD(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regP = setBit(machine->regP, DECIMAL_FL, 0);
+}
+
+static void jmpSED(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regP = setBit(machine->regP, DECIMAL_FL, 1);
+}
+
+static void jmpINC(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ ptr.value = (ptr.value + 1) & 0xFF;
+ memStoreByte(machine, ptr.addr, ptr.value);
+ manZeroNeg(machine,ptr.value);
+}
+
+static void jmpJMP(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ machine->regPC = ptr.addr;
+}
+
+static void jmpJSR(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ /* Move past the 2 byte parameter. JSR is always followed by
+ absolute address. */
+ Bit16 currAddr = machine->regPC + 2;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ stackPush(machine, (currAddr >> 8) & 0xff);
+ stackPush(machine, currAddr & 0xff);
+ machine->regPC = ptr.addr;
+}
+
+static void jmpLDA(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ machine->regA = ptr.value;
+ manZeroNeg(machine, machine->regA);
+}
+
+static void jmpLDX(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ machine->regX = ptr.value;
+ manZeroNeg(machine, machine->regX);
+}
+
+static void jmpLDY(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ machine->regY = ptr.value;
+ manZeroNeg(machine, machine->regY);
+}
+
+static void jmpLSR(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ if (isValue){
+ machine->regP =
+ setBit(machine->regP, CARRY_FL,
+ bitOn(ptr.value, CARRY_FL));
+ ptr.value = ptr.value >> 1;
+ ptr.value = setBit(ptr.value,NEGATIVE_FL,0);
+ memStoreByte(machine,ptr.addr,ptr.value);
+ manZeroNeg(machine,ptr.value);
+ }
+ else { /* Accumulator */
+ machine->regP =
+ setBit(machine->regP, CARRY_FL,
+ bitOn(machine->regA, CARRY_FL));
+ machine->regA = machine->regA >> 1;
+ machine->regA = setBit(machine->regA,NEGATIVE_FL,0);
+ manZeroNeg(machine,ptr.value);
+ }
+}
+
+static void jmpNOP(machine_6502 *machine, m6502_AddrMode adm){
+ /* no operation */
+}
+
+static void jmpORA(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ machine->regA |= ptr.value;
+ manZeroNeg(machine,machine->regA);
+}
+
+static void jmpTAX(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regX = machine->regA;
+ manZeroNeg(machine,machine->regX);
+}
+
+static void jmpTXA(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regA = machine->regX;
+ manZeroNeg(machine,machine->regA);
+}
+
+static void jmpDEX(machine_6502 *machine, m6502_AddrMode adm){
+ if (machine->regX > 0)
+ machine->regX--;
+ else
+ machine->regX = 0xFF;
+ manZeroNeg(machine, machine->regX);
+}
+
+static void jmpINX(machine_6502 *machine, m6502_AddrMode adm){
+ Bit16 value = machine->regX + 1;
+ machine->regX = value & 0xFF;
+ manZeroNeg(machine, machine->regX);
+}
+
+static void jmpTAY(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regY = machine->regA;
+ manZeroNeg(machine, machine->regY);
+}
+
+static void jmpTYA(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regA = machine->regY;
+ manZeroNeg(machine, machine->regA);
+}
+
+static void jmpDEY(machine_6502 *machine, m6502_AddrMode adm){
+ if (machine->regY > 0)
+ machine->regY--;
+ else
+ machine->regY = 0xFF;
+ manZeroNeg(machine, machine->regY);
+}
+
+static void jmpINY(machine_6502 *machine, m6502_AddrMode adm){
+ Bit16 value = machine->regY + 1;
+ machine->regY = value & 0xff;
+ manZeroNeg(machine, machine->regY);
+}
+
+static void jmpROR(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ Bit8 cf;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ if (isValue) {
+ cf = bitOn(machine->regP, CARRY_FL);
+ machine->regP =
+ setBit(machine->regP, CARRY_FL,
+ bitOn(ptr.value, CARRY_FL));
+ ptr.value = ptr.value >> 1;
+ ptr.value = setBit(ptr.value, NEGATIVE_FL, cf);
+ memStoreByte(machine, ptr.addr, ptr.value);
+ manZeroNeg(machine, ptr.value);
+ }
+ else { /* Implied */
+ cf = bitOn(machine->regP, CARRY_FL);
+ machine->regP =
+ setBit(machine->regP, CARRY_FL,
+ bitOn(machine->regA, CARRY_FL));
+ machine->regA = machine->regA >> 1;
+ machine->regA = setBit(machine->regA, NEGATIVE_FL, cf);
+ manZeroNeg(machine, machine->regA);
+ }
+}
+
+static void jmpROL(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ Bit8 cf;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ if (isValue) {
+ cf = bitOn(machine->regP, CARRY_FL);
+ machine->regP =
+ setBit(machine->regP, CARRY_FL,
+ bitOn(ptr.value, NEGATIVE_FL));
+ ptr.value = ptr.value << 1;
+ ptr.value = setBit(ptr.value, CARRY_FL, cf);
+ memStoreByte(machine, ptr.addr, ptr.value);
+ manZeroNeg(machine, ptr.value);
+ }
+ else { /* Implied */
+ cf = bitOn(machine->regP, CARRY_FL);
+ machine->regP =
+ setBit(machine->regP, CARRY_FL,
+ bitOn(machine->regA,NEGATIVE_FL));
+ machine->regA = machine->regA << 1;
+ machine->regA = setBit(machine->regA, CARRY_FL, cf);
+ manZeroNeg(machine, machine->regA);
+ }
+}
+
+static void jmpRTI(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regP = stackPop(machine);
+ machine->regPC = stackPop(machine);
+}
+
+static void jmpRTS(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ Bit16 nr = stackPop(machine);
+ Bit16 nl = stackPop(machine);
+ warnValue(! isValue);
+ machine->regPC = (nl << 8) | nr;
+}
+
+static void jmpSBC(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ /*Bit8 vflag;*/
+ Bit8 c = bitOn(machine->regP, CARRY_FL);
+ Bit16 tmp, w;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ /*vflag = (bitOn(machine->regA,NEGATIVE_FL) &&
+ bitOn(ptr.value, NEGATIVE_FL));*/
+
+ if (bitOn(machine->regP, DECIMAL_FL)) {
+ Bit8 ar = nibble(machine->regA, RIGHT);
+ Bit8 br = nibble(ptr.value, RIGHT);
+ Bit8 al = nibble(machine->regA, LEFT);
+ Bit8 bl = nibble(ptr.value, LEFT);
+
+ tmp = 0xf + ar - br + c;
+ if ( tmp < 0x10){
+ w = 0;
+ tmp -= 6;
+ }
+ else {
+ w = 0x10;
+ tmp -= 0x10;
+ }
+ w += 0xf0 + al - bl;
+ if ( w < 0x100) {
+ machine->regP = setBit(machine->regP, CARRY_FL, 0);
+ if (bitOn(machine->regP, OVERFLOW_FL) && w < 0x80)
+ machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
+ w -= 0x60;
+ }
+ else {
+ machine->regP = setBit(machine->regP, CARRY_FL, 1);
+ if (bitOn(machine->regP, OVERFLOW_FL) && w >= 0x180)
+ machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
+ }
+ w += tmp;
+ } /* end decimal mode */
+ else {
+ w = 0xff + machine->regA - ptr.value + c;
+ if ( w < 0x100 ){
+ machine->regP = setBit(machine->regP, CARRY_FL, 0);
+ if (bitOn(machine->regP, OVERFLOW_FL) && w < 0x80)
+ machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
+ }
+ else {
+ machine->regP = setBit(machine->regP, CARRY_FL, 1);
+ if (bitOn(machine->regP, OVERFLOW_FL) && w >= 0x180)
+ machine->regP = setBit(machine->regP, OVERFLOW_FL, 0);
+ }
+ }
+ machine->regA = w;
+ manZeroNeg(machine,machine->regA);
+}
+
+static void jmpSTA(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ memStoreByte(machine,ptr.addr,machine->regA);
+}
+
+static void jmpTXS(machine_6502 *machine, m6502_AddrMode adm){
+ stackPush(machine,machine->regX);
+}
+
+static void jmpTSX(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regX = stackPop(machine);
+ manZeroNeg(machine, machine->regX);
+}
+
+static void jmpPHA(machine_6502 *machine, m6502_AddrMode adm){
+ stackPush(machine, machine->regA);
+}
+
+static void jmpPLA(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regA = stackPop(machine);
+ manZeroNeg(machine, machine->regA);
+}
+
+static void jmpPHP(machine_6502 *machine, m6502_AddrMode adm){
+ stackPush(machine,machine->regP);
+}
+
+static void jmpPLP(machine_6502 *machine, m6502_AddrMode adm){
+ machine->regP = stackPop(machine);
+ machine->regP = setBit(machine->regP, FUTURE_FL, 1);
+}
+
+static void jmpSTX(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ memStoreByte(machine,ptr.addr,machine->regX);
+}
+
+static void jmpSTY(machine_6502 *machine, m6502_AddrMode adm){
+ Pointer ptr;
+ BOOL isValue = getValue(machine, adm, &ptr);
+ warnValue(isValue);
+ memStoreByte(machine,ptr.addr,machine->regY);
+}
+
+
+
+/* OPCODES */
+static void assignOpCodes(m6502_Opcodes *opcodes){
+
+ #define SETOP(num, _name, _Imm, _ZP, _ZPX, _ZPY, _ABS, _ABSX, _ABSY, _INDX, _INDY, _SNGL, _BRA, _func) \
+{opcodes[num].name[3] = '\0'; \
+ strncpy(opcodes[num].name, _name, 3); opcodes[num].Imm = _Imm; opcodes[num].ZP = _ZP; \
+ opcodes[num].ZPX = _ZPX; opcodes[num].ZPY = _ZPY; opcodes[num].ABS = _ABS; \
+ opcodes[num].ABSX = _ABSX; opcodes[num].ABSY = _ABSY; opcodes[num].INDX = _INDX; \
+ opcodes[num].INDY = _INDY; opcodes[num].SNGL = _SNGL; opcodes[num].BRA = _BRA; \
+ opcodes[num].func = _func;}
+
+ /* OPCODE Imm ZP ZPX ZPY ABS ABSX ABSY INDX INDY SGNL BRA Jump Function*/
+ SETOP( 0, "ADC", 0x69, 0x65, 0x75, 0x00, 0x6d, 0x7d, 0x79, 0x61, 0x71, 0x00, 0x00, jmpADC);
+ SETOP( 1, "AND", 0x29, 0x25, 0x35, 0x31, 0x2d, 0x3d, 0x39, 0x00, 0x00, 0x00, 0x00, jmpAND);
+ SETOP( 2, "ASL", 0x00, 0x06, 0x16, 0x00, 0x0e, 0x1e, 0x00, 0x00, 0x00, 0x0a, 0x00, jmpASL);
+ SETOP( 3, "BIT", 0x00, 0x24, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, jmpBIT);
+ SETOP( 4, "BPL", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, jmpBPL);
+ SETOP( 5, "BMI", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, jmpBMI);
+ SETOP( 6, "BVC", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, jmpBVC);
+ SETOP( 7, "BVS", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, jmpBVS);
+ SETOP( 8, "BCC", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, jmpBCC);
+ SETOP( 9, "BCS", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, jmpBCS);
+ SETOP(10, "BNE", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, jmpBNE);
+ SETOP(11, "BEQ", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, jmpBEQ);
+ SETOP(12, "CMP", 0xc9, 0xc5, 0xd5, 0x00, 0xcd, 0xdd, 0xd9, 0xc1, 0xd1, 0x00, 0x00, jmpCMP);
+ SETOP(13, "CPX", 0xe0, 0xe4, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, jmpCPX);
+ SETOP(14, "CPY", 0xc0, 0xc4, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, jmpCPY);
+ SETOP(15, "DEC", 0x00, 0xc6, 0xd6, 0x00, 0xce, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, jmpDEC);
+ SETOP(16, "EOR", 0x49, 0x45, 0x55, 0x00, 0x4d, 0x5d, 0x59, 0x41, 0x51, 0x00, 0x00, jmpEOR);
+ SETOP(17, "CLC", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, jmpCLC);
+ SETOP(18, "SEC", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, jmpSEC);
+ SETOP(19, "CLI", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, jmpCLI);
+ SETOP(20, "SEI", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, jmpSEI);
+ SETOP(21, "CLV", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, jmpCLV);
+ SETOP(22, "CLD", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x00, jmpCLD);
+ SETOP(23, "SED", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, jmpSED);
+ SETOP(24, "INC", 0x00, 0xe6, 0xf6, 0x00, 0xee, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, jmpINC);
+ SETOP(25, "JMP", 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, jmpJMP);
+ SETOP(26, "JSR", 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, jmpJSR);
+ SETOP(27, "LDA", 0xa9, 0xa5, 0xb5, 0x00, 0xad, 0xbd, 0xb9, 0xa1, 0xb1, 0x00, 0x00, jmpLDA);
+ SETOP(28, "LDX", 0xa2, 0xa6, 0x00, 0xb6, 0xae, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x00, jmpLDX);
+ SETOP(29, "LDY", 0xa0, 0xa4, 0xb4, 0x00, 0xac, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, jmpLDY);
+ SETOP(30, "LSR", 0x00, 0x46, 0x56, 0x00, 0x4e, 0x5e, 0x00, 0x00, 0x00, 0x4a, 0x00, jmpLSR);
+ SETOP(31, "NOP", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x00, jmpNOP);
+ SETOP(32, "ORA", 0x09, 0x05, 0x15, 0x00, 0x0d, 0x1d, 0x19, 0x01, 0x11, 0x00, 0x00, jmpORA);
+ SETOP(33, "TAX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x00, jmpTAX);
+ SETOP(34, "TXA", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x00, jmpTXA);
+ SETOP(35, "DEX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xca, 0x00, jmpDEX);
+ SETOP(36, "INX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x00, jmpINX);
+ SETOP(37, "TAY", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x00, jmpTAY);
+ SETOP(38, "TYA", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, jmpTYA);
+ SETOP(39, "DEY", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, jmpDEY);
+ SETOP(40, "INY", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, jmpINY);
+ SETOP(41, "ROR", 0x00, 0x66, 0x76, 0x00, 0x6e, 0x7e, 0x00, 0x00, 0x00, 0x6a, 0x00, jmpROR);
+ SETOP(42, "ROL", 0x00, 0x26, 0x36, 0x00, 0x2e, 0x3e, 0x00, 0x00, 0x00, 0x2a, 0x00, jmpROL);
+ SETOP(43, "RTI", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, jmpRTI);
+ SETOP(44, "RTS", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, jmpRTS);
+ SETOP(45, "SBC", 0xe9, 0xe5, 0xf5, 0x00, 0xed, 0xfd, 0xf9, 0xe1, 0xf1, 0x00, 0x00, jmpSBC);
+ SETOP(46, "STA", 0x00, 0x85, 0x95, 0x00, 0x8d, 0x9d, 0x99, 0x81, 0x91, 0x00, 0x00, jmpSTA);
+ SETOP(47, "TXS", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x00, jmpTXS);
+ SETOP(48, "TSX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0x00, jmpTSX);
+ SETOP(49, "PHA", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, jmpPHA);
+ SETOP(50, "PLA", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, jmpPLA);
+ SETOP(51, "PHP", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, jmpPHP);
+ SETOP(52, "PLP", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, jmpPLP);
+ SETOP(53, "STX", 0x00, 0x86, 0x00, 0x96, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, jmpSTX);
+ SETOP(54, "STY", 0x00, 0x84, 0x94, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, jmpSTY);
+ SETOP(55, "---", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, NULL);
+}
+
+static void buildIndexCache(machine_6502 *machine){
+ unsigned int i;
+ for (i = 0; i < NUM_OPCODES; i++) {
+ if (machine->opcodes[i].Imm != 0x00){
+ machine->opcache[machine->opcodes[i].Imm].adm = IMMEDIATE_VALUE;
+ machine->opcache[machine->opcodes[i].Imm].index = i;
+ }
+ if (machine->opcodes[i].ZP != 0x00){
+ machine->opcache[machine->opcodes[i].ZP].adm = ZERO;
+ machine->opcache[machine->opcodes[i].ZP].index = i;
+ }
+ if (machine->opcodes[i].ZPX != 0x00){
+ machine->opcache[machine->opcodes[i].ZPX].adm = ZERO_X;
+ machine->opcache[machine->opcodes[i].ZPX].index = i;;
+ }
+ if (machine->opcodes[i].ZPY != 0x00){
+ machine->opcache[machine->opcodes[i].ZPY].adm = ZERO_Y;
+ machine->opcache[machine->opcodes[i].ZPY].index = i;;
+ }
+ if (machine->opcodes[i].ABS != 0x00){
+ machine->opcache[machine->opcodes[i].ABS].adm = ABS_VALUE;
+ machine->opcache[machine->opcodes[i].ABS].index = i;;
+ }
+ if (machine->opcodes[i].ABSX != 0x00){
+ machine->opcache[machine->opcodes[i].ABSX].adm = ABS_X;
+ machine->opcache[machine->opcodes[i].ABSX].index = i;;
+ }
+ if (machine->opcodes[i].ABSY != 0x00){
+ machine->opcache[machine->opcodes[i].ABSY].adm = ABS_Y;
+ machine->opcache[machine->opcodes[i].ABSY].index = i;;
+ }
+ if (machine->opcodes[i].INDX != 0x00){
+ machine->opcache[machine->opcodes[i].INDX].adm = INDIRECT_X;
+ machine->opcache[machine->opcodes[i].INDX].index = i;;
+ }
+ if (machine->opcodes[i].INDY != 0x00){
+ machine->opcache[machine->opcodes[i].INDY].adm = INDIRECT_Y;
+ machine->opcache[machine->opcodes[i].INDY].index = i;;
+ }
+ if (machine->opcodes[i].SNGL != 0x00){
+ machine->opcache[machine->opcodes[i].SNGL].adm = SINGLE;
+ machine->opcache[machine->opcodes[i].SNGL].index = i;
+ }
+ if (machine->opcodes[i].BRA != 0x00){
+ machine->opcache[machine->opcodes[i].BRA].adm = ABS_OR_BRANCH;
+ machine->opcache[machine->opcodes[i].BRA].index = i;
+ }
+ }
+}
+
+/* opIndex() - Search the opcode table for a match. If found return
+ the index into the optable and the address mode of the opcode. If
+ the opcode is not found then return -1. */
+static int opIndex(machine_6502 *machine, Bit8 opcode, m6502_AddrMode *adm){
+ /* XXX could catch errors by setting a addressmode of error or something */
+ *adm = machine->opcache[opcode].adm;
+ return machine->opcache[opcode].index;
+}
+
+
+/* Assembly parser */
+
+static Param *newParam(void){
+ Param *newp;
+ int i = 0;
+
+ newp = (Param *) ecalloc(1, sizeof(Param));
+ newp->type = SINGLE;
+ for (i = 0; i < MAX_PARAM_VALUE; i++)
+ newp->value[i] = 0;
+ newp->vp = 0;
+ newp->label = ecalloc(MAX_LABEL_LEN,sizeof(char));
+ newp->lbladdr = 0;
+ return newp;
+}
+
+/* Copy the fields from p2 to p1 */
+static void copyParam(Param *p1, Param *p2){
+ int i = 0;
+ strncpy(p1->label,p2->label,MAX_LABEL_LEN);
+ for(i = 0; i < MAX_PARAM_VALUE; i++)
+ p1->value[i] = p2->value[i];
+ p1->vp = p2->vp;
+ p1->type = p2->type;
+}
+
+static Label *newLabel(void){
+ Label *newp;
+
+ newp = (Label *) ecalloc(1, sizeof(Label));
+ newp->addr = 0;
+ newp->label = ecalloc(MAX_LABEL_LEN,sizeof(char));
+
+ return newp;
+}
+
+static AsmLine *newAsmLine(char *cmd, char *label, BOOL decl, Param *param, int lc)
+{
+ AsmLine *newp;
+
+ newp = (AsmLine *) ecalloc(1, sizeof(AsmLine));
+ newp->labelDecl = decl;
+ newp->label = newLabel();
+ strncpy(newp->label->label,label,MAX_LABEL_LEN);
+ newp->command = estrdup(cmd);
+ newp->param = newParam();
+ copyParam(newp->param, param);
+ newp->next = NULL;
+ return newp;
+}
+
+static AsmLine *addend(AsmLine *listp, AsmLine *newp)
+{
+ AsmLine *p;
+ if(listp == NULL)
+ return newp;
+ for (p =listp; p->next != NULL; p = p->next)
+ ;
+ p->next = newp;
+ return listp;
+}
+
+static BOOL apply(AsmLine *listp, BOOL(*fn)(AsmLine*, void*), void *arg)
+{
+ AsmLine *p;
+ if(listp == NULL)
+ return FALSE;
+ for (p = listp; p != NULL; p = p->next)
+ if (! fn(p,arg) )
+ return FALSE;
+ return TRUE;
+}
+
+static void freeParam(Param *param){
+ free(param->label);
+ free(param);
+}
+
+static void freeLabel(Label *label){
+ free(label->label);
+ free(label);
+}
+
+static void freeallAsmLine(AsmLine *listp)
+{
+ AsmLine *next;
+ for(; listp != NULL; listp = next){
+ next = listp->next;
+ freeParam(listp->param);
+ freeLabel(listp->label);
+ free(listp->command);
+ free(listp);
+ }
+}
+
+static BOOL addvalue(Param *param,Bit32 value){
+ /* jwz: suppress "0 <= unsigned" warning */
+ if (/*0 <= param->vp &&*/ param->vp < MAX_PARAM_VALUE) {
+ param->value[param->vp++] = value;
+ return TRUE;
+ }
+ else {
+ fprintf(stderr,"Wrong number of parameters: %d. The limit is %d\n",param->vp+1, MAX_PARAM_VALUE);
+ return FALSE;
+ }
+}
+
+static void parseError(char *s){
+ fprintf(stderr,"6502 Syntax Error: %s\n", s);
+}
+
+/* stoupper() - Destructivley modifies the string making all letters upper case*/
+static void stoupper(char **s){
+ int i = 0;
+ while((*s)[i] != '\0'){
+ (*s)[i] = toupper((*s)[i]);
+ i++;
+ }
+}
+
+static BOOL isWhite(char c){
+ return (c == '\r' || c == '\t' || c == ' ');
+}
+
+static void skipSpace(char **s){
+ for(; isWhite(**s); (*s)++)
+ ;
+}
+
+/* nullify() - fills a string with upto sourceLength null characters. */
+static void nullify(char *token, unsigned int sourceLength){
+ unsigned int i = 0;
+ while (i < sourceLength)
+ token[i++] = '\0';
+}
+
+static BOOL isBlank(const char *token){
+ return (token[0] == '\0');
+}
+
+static BOOL isCommand(machine_6502 *machine, const char *token){
+ int i = 0;
+
+ while (i < NUM_OPCODES) {
+ if (strcmp(machine->opcodes[i].name,token) == 0)
+ return TRUE;
+ i++;
+ }
+
+ if (strcmp(token, "DCB") == 0) return TRUE;
+ return FALSE;
+}
+
+/* hasChar() - Check to see if the current line has a certain
+ charater */
+static BOOL hasChar(char *s, char c){
+ for(; *s != '\0' && *s != '\n'; s++) {
+ if (*s == c)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static BOOL ishexdigit(char c){
+ if (isdigit(c))
+ return TRUE;
+ else {
+ char c1 = toupper(c);
+ return ('A' <= c1 && c1 <= 'F');
+ }
+}
+
+/* isCmdChar() - Is this a valid character for a command. All of the
+ command are alpha except for the entry point code that is "*=" */
+static BOOL isCmdChar(char c){
+ return (isalpha(c) || c == '*' || c == '=');
+}
+
+
+/* command() - parse a command from the source code. We pass along a
+ machine so the opcode can be validated. */
+static BOOL command(machine_6502 *machine, char **s, char **cmd){
+ int i = 0;
+ skipSpace(s);
+ for(;isCmdChar(**s) && i < MAX_CMD_LEN; (*s)++)
+ (*cmd)[i++] = **s;
+ if (i == 0)
+ return TRUE; /* Could be a blank line. */
+ else if (strcmp(*cmd,"*=") == 0)
+ return TRUE; /* This is an entry point. */
+ else
+ return isCommand(machine,*cmd);
+}
+
+static BOOL declareLabel(char **s, char **label){
+ int i = 0;
+ skipSpace(s);
+ for(;**s != ':' && **s != '\n' && **s != '\0'; (*s)++){
+ if (isWhite(**s))
+ continue;
+ (*label)[i++] = **s;
+ }
+ if (i == 0)
+ return FALSE; /* Current line has to have a label */
+ else if (**s == ':'){
+ (*s)++; /* Skip colon */
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+static BOOL parseHex(char **s, Bit32 *value){
+ enum { MAX_HEX_LEN = 5 };
+ if (**s == '$') {
+ char *hex = ecalloc(MAX_HEX_LEN, sizeof(char));
+ int i = 0;
+
+ (*s)++; /* move pass $ */
+ for(; ishexdigit(**s) && i < MAX_HEX_LEN; (*s)++)
+ hex[i++] = **s;
+
+ *value = strtol(hex,NULL,16);
+ free(hex);
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+static BOOL parseDec(char **s, Bit32 *value){
+ enum { MAX_DEC_LEN = 4 };
+ char *dec = ecalloc(MAX_DEC_LEN, sizeof(char));
+ int i;
+ for(i = 0; isdigit(**s) && i < MAX_DEC_LEN; (*s)++)
+ dec[i++] = **s;
+
+ if (i > 0){
+ *value = atoi(dec);
+ free(dec);
+ return TRUE;
+ }
+ else{
+ free(dec);
+ return FALSE;
+ }
+}
+
+static BOOL parseValue(char **s, Bit32 *value){
+ skipSpace(s);
+ if (**s == '$')
+ return parseHex(s, value);
+ else
+ return parseDec(s, value);
+}
+
+static BOOL paramLabel(char **s, char **label){
+ int i;
+ for(i = 0; (isalnum(**s) || **s == '_') && i < MAX_LABEL_LEN; (*s)++)
+ (*label)[i++] = **s;
+
+ if (i > 0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static BOOL immediate(char **s, Param *param){
+ if (**s != '#')
+ return FALSE;
+
+ (*s)++; /*Move past hash */
+ if (**s == '<' || **s == '>'){
+ char *label = ecalloc(MAX_LABEL_LEN, sizeof(char));
+ param->type = (**s == '<') ? IMMEDIATE_LESS : IMMEDIATE_GREAT;
+ (*s)++; /* move past < or > */
+ if (paramLabel(s, &label)){
+ int ln = strlen(label) + 1;
+ strncpy(param->label, label, ln);
+ free(label);
+ return TRUE;
+ }
+ free(label);
+ }
+ else {
+ Bit32 value;
+ if (parseValue(s, &value)){
+ if (value > 0xFF){
+ parseError("Immediate value is too large.");
+ return FALSE;
+ }
+ param->type = IMMEDIATE_VALUE;
+ return addvalue(param, value);
+ }
+ }
+ return FALSE;
+}
+
+static BOOL isDirection(char c){
+ return (c == 'X' || c == 'Y');
+}
+
+static BOOL getDirection(char **s, char *direction){
+ skipSpace(s);
+ if (**s == ','){
+ (*s)++;
+ skipSpace(s);
+ if (isDirection(**s)){
+ *direction = **s;
+ (*s)++;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static BOOL indirect(char **s, Param *param){
+ Bit32 value;
+ char c;
+ if (**s == '(')
+ (*s)++;
+ else
+ return FALSE;
+
+ if (! parseHex(s,&value))
+ return FALSE;
+ if (value > 0xFF) {
+ parseError("Indirect value is too large.");
+ return FALSE;
+ }
+ if (!addvalue(param, value))
+ return FALSE;
+ skipSpace(s);
+ if (**s == ')'){
+ (*s)++;
+ if (getDirection(s,&c)) {
+ if (c == 'Y'){
+ param->type = INDIRECT_Y;
+ return TRUE;
+ }
+ }
+ }
+ else if (getDirection(s, &c)){
+ if (c == 'X'){
+ skipSpace(s);
+ if (**s == ')'){
+ (*s)++;
+ param->type = INDIRECT_X;
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+static BOOL dcbValue(char **s, Param *param){
+ Bit32 val;
+ if (! parseValue(s,&val))
+ return FALSE;
+
+ if (val > 0xFF)
+ return FALSE;
+
+ if (!addvalue(param,val))
+ return FALSE;
+
+ param->type = DCB_PARAM;
+
+ skipSpace(s);
+ if(**s == ','){
+ (*s)++;
+ return dcbValue(s, param);
+ }
+ else
+ return TRUE;
+}
+
+static BOOL value(char **s, Param *param){
+ Bit32 val;
+ BOOL abs;
+ BOOL dir;
+ char c = '\0';
+ if (! parseValue(s,&val))
+ return FALSE;
+
+ abs = (val > 0xFF);
+ dir = getDirection(s,&c);
+ if (!addvalue(param,val))
+ return FALSE;
+
+ if(abs && dir){
+ if (c == 'X')
+ param->type = ABS_X;
+ else if (c == 'Y')
+ param->type = ABS_Y;
+ else
+ return FALSE;
+ }
+ else if (abs)
+ param->type = ABS_VALUE;
+ else if (dir){
+ if (c == 'X')
+ param->type = ZERO_X;
+ else if (c == 'Y')
+ param->type = ZERO_Y;
+ else
+ return FALSE;
+ }
+ else
+ param->type = ZERO;
+
+ return TRUE;
+}
+
+static BOOL label(char **s, Param *param){
+ char *label = ecalloc(MAX_LABEL_LEN, sizeof(char));
+ char c;
+ BOOL labelOk = FALSE;
+ if (paramLabel(s, &label)){
+ labelOk = TRUE;
+ param->type = ABS_OR_BRANCH;
+ if (getDirection(s, &c)){
+ if (c == 'X')
+ param->type = ABS_LABEL_X;
+ else if (c == 'Y')
+ param->type = ABS_LABEL_Y;
+ else
+ labelOk = FALSE;
+ }
+ strncpy(param->label,label,MAX_LABEL_LEN);
+ }
+ free(label);
+ return labelOk;
+}
+
+static BOOL parameter(const char *cmd, char **s, Param *param){
+ skipSpace(s);
+ if (**s == '\0' || **s == '\n')
+ return TRUE;
+ else if (**s == '#')
+ return immediate(s,param);
+ else if (**s == '(')
+ return indirect(s,param);
+ else if (**s == '$' || isdigit(**s)){
+ if (strcmp(cmd, "DCB") == 0)
+ return dcbValue(s,param);
+ else
+ return value(s,param);
+ }
+ else if (isalpha(**s))
+ return label(s ,param);
+ else
+ return FALSE; /* Invalid Parameter */
+}
+
+static void comment(char **s){
+ skipSpace(s);
+ if (**s == ';')
+ for(;**s != '\n' && **s != '\0'; (*s)++)
+ ;
+}
+
+static void initParam(Param *param){
+ int i;
+ param->type = SINGLE;
+ for(i = 0; i < MAX_PARAM_VALUE; i++)
+ param->value[i] = 0;
+ param->vp = 0;
+ nullify(param->label,MAX_LABEL_LEN);
+}
+
+
+static AsmLine *parseAssembly(machine_6502 *machine, BOOL *codeOk, const char *code){
+ char *s;
+ char *cmd = ecalloc(MAX_CMD_LEN, sizeof(char));
+ char *label = ecalloc(MAX_LABEL_LEN, sizeof(char));
+ char *start; /*pointer to the start of the code.*/
+ unsigned int lc = 1;
+ Param *param;
+ BOOL decl;
+ AsmLine *listp = NULL;
+
+ *codeOk = TRUE;
+ param = newParam();
+ s = estrdup(code);
+ start = s;
+ stoupper(&s);
+
+ while(*s != '\0' && *codeOk){
+ initParam(param);
+ nullify(cmd, MAX_CMD_LEN);
+ nullify(label, MAX_LABEL_LEN);
+ decl = FALSE;
+ skipSpace(&s);
+ comment(&s);
+ if (*s == '\n'){
+ lc++;
+ s++;
+ continue; /* blank line */
+ }
+ else if (*s == '\0')
+ continue; /* no newline at the end of the code */
+ else if (hasChar(s,':')){
+ decl = TRUE;
+ if(! declareLabel(&s,&label)){
+ *codeOk = FALSE;
+ break;
+ }
+ skipSpace(&s);
+ }
+ if(!command(machine, &s, &cmd)){
+ *codeOk = FALSE;
+ break;
+ }
+ skipSpace(&s);
+ comment(&s);
+ if(!parameter(cmd, &s, param)){
+ *codeOk = FALSE;
+ break;
+ }
+ skipSpace(&s);
+ comment(&s);
+ if (*s == '\n' || *s == '\0'){
+ AsmLine *asmm;
+ asmm = newAsmLine(cmd,label,decl,param,lc);
+ listp = addend(listp,asmm);
+ }
+ else {
+ *codeOk = FALSE;
+ break;
+ }
+ }
+ if (! *codeOk)
+ fprintf(stderr,"Syntax error at line %u\n", lc);
+ free(start);
+ free(cmd);
+ free(label);
+ freeParam(param);
+ return listp;
+}
+
+#ifdef READ_FILES
+/* fileToBuffer() - Allocates a buffer and loads all of the file into memory. */
+static char *fileToBuffer(const char *filename){
+ const int defaultSize = 1024;
+ FILE *ifp;
+ int c;
+ int size = defaultSize;
+ int i = 0;
+ char *buffer = ecalloc(defaultSize,sizeof(char));
+
+ if (!buffer) abort();
+
+ ifp = fopen(filename, "rb");
+ if (!ifp) abort();
+
+ while((c = getc(ifp)) != EOF){
+ buffer[i++] = c;
+ if (i == size){
+ size += defaultSize;
+ buffer = realloc(buffer, size);
+ if (buffer == NULL) {
+ abort();
+ }
+ }
+ }
+ fclose(ifp);
+ buffer = realloc(buffer, i+2);
+ if (!buffer) abort();
+ /* Make sure we have a line feed at the end */
+ buffer[i] = '\n';
+ buffer[i+1] = '\0';
+ return buffer;
+}
+#endif
+
+
+/* Routines */
+
+/* reset() - Reset CPU and memory. */
+static void reset(machine_6502 *machine){
+ int x, y;
+ for ( y = 0; y < 32; y++ ){
+ for (x = 0; x < 32; x++){
+ machine->screen[x][y] = 0;
+ }
+ }
+
+ for(x=0; x < MEM_64K; x++)
+ machine->memory[x] = 0;
+
+ machine->codeCompiledOK = FALSE;
+ machine->regA = 0;
+ machine->regX = 0;
+ machine->regY = 0;
+ machine->regP = setBit(machine->regP, FUTURE_FL, 1);
+ machine->defaultCodePC = machine->regPC = PROG_START;
+ machine->regSP = STACK_TOP;
+ machine->runForever = FALSE;
+ machine->labelPtr = 0;
+ machine->codeRunning = FALSE;
+}
+
+/* hexDump() - Dump the memory to output */
+void m6502_hexDump(machine_6502 *machine, Bit16 start, Bit16 numbytes, FILE *output){
+ Bit32 address;
+ Bit32 i;
+ for( i = 0; i < numbytes; i++){
+ address = start + i;
+ if ( (i&15) == 0 ) {
+ fprintf(output,"\n%.4x: ", address);
+ }
+ fprintf(output,"%.2x%s",machine->memory[address], (i & 1) ? " ":"");
+ }
+ fprintf(output,"%s\n",(i&1)?"--":"");
+}
+
+/* XXX */
+/* void save_program(machine_6502 *machine, char *filename){ */
+/* FILE *ofp; */
+/* Bit16 pc = PROG_START; */
+/* Bit16 end = pc + machine->codeLen; */
+/* Bit16 n; */
+/* ofp = fopen(filename, "w"); */
+/* if (!ofp) abort(); */
+
+/* fprintf(ofp,"Bit8 prog[%d] =\n{",machine->codeLen); */
+/* n = 1; */
+/* while(pc < end) */
+/* fprintf(ofp,"0x%.2x,%s",machine->memory[pc++],n++%10?" ":"\n"); */
+/* fseek(ofp,-2,SEEK_CUR); */
+/* fprintf(ofp,"};\n"); */
+
+/* fclose(ofp); */
+/* } */
+
+static BOOL translate(m6502_Opcodes *op,Param *param, machine_6502 *machine){
+ switch(param->type){
+ case SINGLE:
+ if (op->SNGL)
+ pushByte(machine, op->SNGL);
+ else {
+ fprintf(stderr,"%s needs a parameter.\n",op->name);
+ return FALSE;
+ }
+ break;
+ case IMMEDIATE_VALUE:
+ if (op->Imm) {
+ pushByte(machine, op->Imm);
+ pushByte(machine, param->value[0]);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take IMMEDIATE_VALUE parameters.\n",op->name);
+ return FALSE;
+ }
+ case IMMEDIATE_GREAT:
+ if (op->Imm) {
+ pushByte(machine, op->Imm);
+ pushByte(machine, param->lbladdr >> 8);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take IMMEDIATE_GREAT parameters.\n",op->name);
+ return FALSE;
+ }
+ case IMMEDIATE_LESS:
+ if (op->Imm) {
+ pushByte(machine, op->Imm);
+ pushByte(machine, param->lbladdr & 0xFF);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take IMMEDIATE_LESS parameters.\n",op->name);
+ return FALSE;
+ }
+ case INDIRECT_X:
+ if (op->INDX) {
+ pushByte(machine, op->INDX);
+ pushByte(machine, param->value[0]);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take INDIRECT_X parameters.\n",op->name);
+ return FALSE;
+ }
+ case INDIRECT_Y:
+ if (op->INDY) {
+ pushByte(machine, op->INDY);
+ pushByte(machine, param->value[0]);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take INDIRECT_Y parameters.\n",op->name);
+ return FALSE;
+ }
+ case ZERO:
+ if (op->ZP) {
+ pushByte(machine, op->ZP);
+ pushByte(machine, param->value[0]);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take ZERO parameters.\n",op->name);
+ return FALSE;
+ }
+ case ZERO_X:
+ if (op->ZPX) {
+ pushByte(machine, op->ZPX);
+ pushByte(machine, param->value[0]);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take ZERO_X parameters.\n",op->name);
+ return FALSE;
+ }
+ case ZERO_Y:
+ if (op->ZPY) {
+ pushByte(machine, op->ZPY);
+ pushByte(machine, param->value[0]);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take ZERO_Y parameters.\n",op->name);
+ return FALSE;
+ }
+ case ABS_VALUE:
+ if (op->ABS) {
+ pushByte(machine, op->ABS);
+ pushWord(machine, param->value[0]);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take ABS_VALUE parameters.\n",op->name);
+ return FALSE;
+ }
+ case ABS_OR_BRANCH:
+ if (op->ABS > 0){
+ pushByte(machine, op->ABS);
+ pushWord(machine, param->lbladdr);
+ }
+ else {
+ if (op->BRA) {
+ pushByte(machine, op->BRA);
+ {
+ int diff = abs((int)param->lbladdr - (int)machine->defaultCodePC);
+ int backward = (param->lbladdr < machine->defaultCodePC);
+ pushByte(machine, (backward) ? 0xff - diff : diff - 1);
+ }
+ }
+ else {
+ fprintf(stderr,"%s does not take BRANCH parameters.\n",op->name);
+ return FALSE;
+ }
+ }
+ break;
+ case ABS_X:
+ if (op->ABSX) {
+ pushByte(machine, op->ABSX);
+ pushWord(machine, param->value[0]);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take ABS_X parameters.\n",op->name);
+ return FALSE;
+ }
+ case ABS_Y:
+ if (op->ABSY) {
+ pushByte(machine, op->ABSY);
+ pushWord(machine, param->value[0]);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take ABS_Y parameters.\n",op->name);
+ return FALSE;
+ }
+ case ABS_LABEL_X:
+ if (op->ABSX) {
+ pushByte(machine, op->ABSX);
+ pushWord(machine, param->lbladdr);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take ABS_LABEL_X parameters.\n",op->name);
+ return FALSE;
+ }
+ case ABS_LABEL_Y:
+ if (op->ABSY) {
+ pushByte(machine, op->ABSY);
+ pushWord(machine, param->lbladdr);
+ break;
+ }
+ else {
+ fprintf(stderr,"%s does not take ABS_LABEL_Y parameters.\n",op->name);
+ return FALSE;
+ }
+ case DCB_PARAM:
+ /* Handled elsewhere */
+ break;
+ }
+ return TRUE;
+}
+
+/* compileLine() - Compile one line of code. Returns
+ TRUE if it compile successfully. */
+static BOOL compileLine(AsmLine *asmline, void *args){
+ machine_6502 *machine;
+ machine = args;
+ if (isBlank(asmline->command)) return TRUE;
+ if (strcmp("*=",asmline->command) == 0){
+ machine->defaultCodePC = asmline->param->value[0];
+ }
+ else if (strcmp("DCB",asmline->command) == 0){
+ int i;
+ for(i = 0; i < asmline->param->vp; i++)
+ pushByte(machine, asmline->param->value[i]);
+ }
+ else{
+ int i;
+ char *command = asmline->command;
+ m6502_Opcodes op;
+ for(i = 0; i < NUM_OPCODES; i++){
+ if (strcmp(machine->opcodes[i].name, command) == 0){
+ op = machine->opcodes[i];
+ break;
+ }
+ }
+ if (i == NUM_OPCODES)
+ return FALSE; /* unknow upcode */
+ else
+ return translate(&op,asmline->param,machine);
+ }
+ return TRUE;
+}
+
+/* indexLabels() - Get the address for each label */
+static BOOL indexLabels(AsmLine *asmline, void *arg){
+ machine_6502 *machine;
+ int thisPC;
+ Bit16 oldDefault;
+ machine = arg;
+ oldDefault = machine->defaultCodePC;
+ thisPC = machine->regPC;
+ /* Figure out how many bytes this instruction takes */
+ machine->codeLen = 0;
+
+ if ( ! compileLine(asmline, machine) ){
+ return FALSE;
+ }
+
+ /* If the machine's defaultCodePC has changed then we encountered a
+ *= which changes the load address. We need to initials our code
+ *counter with the current default. */
+ if (oldDefault == machine->defaultCodePC){
+ machine->regPC += machine->codeLen;
+ }
+ else {
+ machine->regPC = machine->defaultCodePC;
+ /*oldDefault = machine->defaultCodePC;*/
+ }
+
+ if (asmline->labelDecl) {
+ asmline->label->addr = thisPC;
+ }
+ return TRUE;
+}
+
+static BOOL changeParamLabelAddr(AsmLine *asmline, void *label){
+ Label *la = label;
+ if (strcmp(asmline->param->label, la->label) == 0)
+ asmline->param->lbladdr = la->addr;
+ return TRUE;
+}
+
+static BOOL linkit(AsmLine *asmline, void *asmlist){
+ apply(asmlist,changeParamLabelAddr,asmline->label);
+ return TRUE;
+}
+
+/* linkLabels - Make sure all of the references to the labels contain
+ the right address*/
+static void linkLabels(AsmLine *asmlist){
+ apply(asmlist,linkit,asmlist);
+}
+
+/* compileCode() - Compile the current assembly code for the machine */
+static BOOL compileCode(machine_6502 *machine, const char *code){
+ BOOL codeOk;
+ AsmLine *asmlist;
+
+ reset(machine);
+ machine->defaultCodePC = machine->regPC = PROG_START;
+ asmlist = parseAssembly(machine, &codeOk, code);
+
+ if(codeOk){
+ /* First pass: Find the addresses for the labels */
+ if (!apply(asmlist, indexLabels, machine))
+ return FALSE;
+ /* update label references */
+ linkLabels(asmlist);
+
+#if 0 /* prints out some debugging information */
+ {
+ AsmLine *p;
+ if(asmlist != NULL){
+ for (p = asmlist; p != NULL; p = p->next)
+ fprintf(stderr,"%s lbl: %s addr: %x ParamLbl: %s ParamAddr: %x\n",
+ p->command, p->label->label, p->label->addr,
+ p->param->label, p->param->lbladdr);
+ }
+ }
+
+#endif
+
+ /* Second pass: translate the instructions */
+ machine->codeLen = 0;
+ /* Link label call push_byte which increments defaultCodePC.
+ We need to reset it so the compiled code goes in the
+ correct spot. */
+ machine->defaultCodePC = PROG_START;
+ if (!apply(asmlist, compileLine, machine))
+ return FALSE;
+
+ if (machine->defaultCodePC > PROG_START ){
+ machine->memory[machine->defaultCodePC] = 0x00;
+ codeOk = TRUE;
+ }
+ else{
+ fprintf(stderr,"No Code to run.\n");
+ codeOk = FALSE;
+ }
+ }
+ else{
+ fprintf(stderr,"An error occured while parsing the file.\n");
+ codeOk = FALSE;
+ }
+ freeallAsmLine(asmlist);
+ return codeOk;
+}
+
+
+/*
+ * execute() - Executes one instruction.
+ * This is the main part of the CPU emulator.
+ *
+ */
+
+static void execute(machine_6502 *machine){
+ Bit8 opcode;
+ m6502_AddrMode adm;
+ int opidx;
+
+ if(!machine->codeRunning) return;
+
+ opcode = popByte(machine);
+ if (opcode == 0x00)
+ machine->codeRunning = FALSE;
+ else {
+ opidx = opIndex(machine,opcode,&adm);
+ if(opidx > -1)
+ machine->opcodes[opidx].func(machine, adm);
+ else
+ fprintf(stderr,"Invalid opcode!\n");
+ }
+ if( (machine->regPC == 0) ||
+ (!machine->codeRunning) ) {
+ machine->codeRunning = FALSE;
+ }
+}
+
+machine_6502 *m6502_build(void){
+ machine_6502 *machine;
+ machine = ecalloc(1, sizeof(machine_6502));
+ assignOpCodes(machine->opcodes);
+ buildIndexCache(machine);
+ reset(machine);
+ return machine;
+}
+
+void m6502_destroy6502(machine_6502 *machine){
+ free(machine);
+ machine = NULL;
+}
+
+void m6502_trace(machine_6502 *machine, FILE *output){
+ Bit8 opcode = memReadByte(machine,machine->regPC);
+ m6502_AddrMode adm;
+ Pointer ptr;
+ int opidx = opIndex(machine,opcode,&adm);
+ int stacksz = STACK_TOP - machine->regSP;
+
+ fprintf(output,"\n NVFBDIZC\nP: %d%d%d%d%d%d%d%d ",
+ bitOn(machine->regP,NEGATIVE_FL),
+ bitOn(machine->regP,OVERFLOW_FL),
+ bitOn(machine->regP,FUTURE_FL),
+ bitOn(machine->regP,BREAK_FL),
+ bitOn(machine->regP,DECIMAL_FL),
+ bitOn(machine->regP,INTERRUPT_FL),
+ bitOn(machine->regP,ZERO_FL),
+ bitOn(machine->regP,CARRY_FL));
+ fprintf(output,"A: %.2x X: %.2x Y: %.2x SP: %.4x PC: %.4x\n",
+ machine->regA, machine->regX, machine->regY, machine->regSP, machine->regPC);
+ if (opidx > -1){
+ Bit16 pc = machine->regPC;
+ fprintf(output,"\n%.4x:\t%s",machine->regPC, machine->opcodes[opidx].name);
+ if (peekValue(machine, adm, &ptr, pc+1))
+ fprintf(output,"\tAddress:%.4x\tValue:%.4x\n",
+ ptr.addr,ptr.value);
+ else
+ fprintf(output,"\n");
+ }
+ fprintf(output,"STACK:");
+ m6502_hexDump(machine,(STACK_TOP - stacksz) + 1, stacksz, output);
+}
+
+#if 0
+void disassemble(machine_6502 *machine, FILE *output){
+ /* Read the opcode
+ increment the program counter
+ print the opcode
+ loop until end of program. */
+ m6502_AddrMode adm;
+ Bit16 addr;
+ Bit8 opcode;
+ int opidx;
+ char *mem;
+ int i;
+ Bit16 opc = machine->regPC;
+ mem = calloc(20,sizeof(char));
+ machine->regPC = PROG_START;
+ do{
+ addr = machine->regPC;
+ opcode = popByte(machine);
+ opidx = opIndex(machine,opcode,&adm);
+ for (i = 0; i < 20; i++) mem[i] = '\0';
+ dismem(machine, adm, mem);
+ fprintf(output,"%x\t%s\t%s\n",
+ addr,machine->opcodes[opidx].name,mem);
+ }while((machine->regPC - PROG_START) < machine->codeLen); /*XXX - may need to change since defaultCodePC */
+ free(mem);
+ machine->regPC = opc;
+}
+#endif
+
+
+#ifdef READ_FILES
+void m6502_eval_file(machine_6502 *machine, const char *filename, m6502_Plotter plot, void *plotterState){
+ char *code = NULL;
+
+ machine->plot = plot;
+ machine->plotterState = plotterState;
+
+ code = fileToBuffer(filename);
+
+ if (! compileCode(machine, code) ) abort();
+
+ free(code);
+
+ machine->defaultCodePC = machine->regPC = PROG_START;
+ machine->codeRunning = TRUE;
+ do{
+ sleep(0); /* XXX */
+#if 0
+ m6502_trace(machine, stdout);
+#endif
+ execute(machine);
+ }while(machine->codeRunning);
+}
+
+void m6502_start_eval_file(machine_6502 *machine, const char *filename, m6502_Plotter plot, void *plotterState){
+ char *code = NULL;
+ reset(machine);
+
+ machine->plot = plot;
+ machine->plotterState = plotterState;
+
+ code = fileToBuffer(filename);
+
+ if (! compileCode(machine, code) ) abort();
+
+ free(code);
+
+ machine->defaultCodePC = machine->regPC = PROG_START;
+ machine->codeRunning = TRUE;
+ execute(machine);
+}
+#endif /* READ_FILES */
+
+void m6502_start_eval_string(machine_6502 *machine, const char *code,
+ m6502_Plotter plot, void *plotterState){
+ reset(machine);
+
+ machine->plot = plot;
+ machine->plotterState = plotterState;
+
+ if (! compileCode(machine, code) ){
+ fprintf(stderr,"Could not compile code.\n");
+ }
+
+ machine->defaultCodePC = machine->regPC = PROG_START;
+ machine->codeRunning = TRUE;
+ execute(machine);
+}
+
+/* void start_eval_binary(machine_6502 *machine, Bit8 *program, */
+/* unsigned int proglen, */
+/* Plotter plot, void *plotterState){ */
+/* unsigned int pc, n; */
+/* reset(machine); */
+/* machine->plot = plot; */
+/* machine->plotterState = plotterState; */
+
+/* machine->regPC = PROG_START; */
+/* pc = machine->regPC; */
+/* machine->codeLen = proglen; */
+/* n = 0; */
+/* while (n < proglen){ */
+/* machine->memory[pc++] = program[n++]; */
+/* } */
+/* machine->codeRunning = TRUE; */
+/* execute(machine); */
+/* } */
+
+void m6502_next_eval(machine_6502 *machine, int insno){
+ int i = 0;
+ for (i = 1; i < insno; i++){
+ if (machine->codeRunning){
+#if 0
+ trace(machine, stdout);
+#endif
+ execute(machine);
+ }
+ else
+ break;
+ }
+}
+
diff --git a/hacks/asm6502.h b/hacks/asm6502.h
new file mode 100644
index 0000000..79b13a2
--- /dev/null
+++ b/hacks/asm6502.h
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 2007 Jeremy English <jhe@jeremyenglish.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Created: 07-May-2007
+ */
+
+/*
+ This is a port of the javascript 6502 assembler, compiler and
+ debugger. The orignal code was copyright 2006 by Stian Soreng -
+ www.6502asm.com
+
+ The stack space is in page $100 to $1ff. The video buffer starts at
+ $200 and is 1024 bytes. Programs get loaded at address
+ $600. Address $fe is random and byte $ff is used for user input.
+
+ User input is disabled.
+*/
+
+#ifndef __ASM6502_H__
+#define __ASM6502_H__
+
+typedef uint8_t Bit8;
+typedef uint16_t Bit16;
+typedef uint32_t Bit32;
+
+#undef BOOL
+#undef TRUE
+#undef FALSE
+#define BOOL Bit8
+#define TRUE 1
+#define FALSE 0
+
+enum {
+ MAX_LABEL_LEN = 80,
+ NUM_OPCODES = 56, /* Number of unique instructions not counting DCB */
+ MEM_64K = 65536, /* We have 64k of memory to work with. */
+ MAX_PARAM_VALUE = 25, /* The number of values allowed behind dcb */
+ MAX_CMD_LEN = 4, /* Each assembly command is 3 characeters long */
+/* The stack works from the top down in page $100 to $1ff */
+ STACK_TOP = 0x1ff,
+ STACK_BOTTOM = 0x100,
+ PROG_START = 0x600 /* The default entry point for the program */
+};
+
+typedef enum{
+ SINGLE, IMMEDIATE_VALUE, IMMEDIATE_GREAT,
+ IMMEDIATE_LESS, INDIRECT_X, INDIRECT_Y,
+ ZERO, ZERO_X, ZERO_Y,
+ ABS_VALUE, ABS_OR_BRANCH, ABS_X, ABS_Y,
+ ABS_LABEL_X, ABS_LABEL_Y, DCB_PARAM
+} m6502_AddrMode;
+
+typedef struct machine_6502 machine_6502;
+
+typedef struct {
+ char name[MAX_CMD_LEN];
+ Bit8 Imm;
+ Bit8 ZP;
+ Bit8 ZPX;
+ Bit8 ZPY;
+ Bit8 ABS;
+ Bit8 ABSX;
+ Bit8 ABSY;
+ Bit8 INDX;
+ Bit8 INDY;
+ Bit8 SNGL;
+ Bit8 BRA;
+ void (*func) (machine_6502*, m6502_AddrMode);
+} m6502_Opcodes;
+
+/* Used to cache the index of each opcode */
+typedef struct {
+ Bit8 index;
+ m6502_AddrMode adm;
+} m6502_OpcodeIndex;
+
+/* Plotter is a function that will be called everytime a pixel
+ needs to be updated. The first two parameter are the x and y
+ values. The third parameter is the color index:
+
+ Color Index Table
+ 00 black #000000
+ 01 white #ffffff
+ 02 Red #880000
+ 03 seafoam #aaffee
+ 04 fuscia #cc44cc
+ 05 green #00cc55
+ 06 blue #0000aa
+ 07 Yellow #eeee77
+ 08 tangerine #dd8855
+ 09 brown #664400
+ 10 salmon #ff7777
+ 11 charcoal #333333
+ 12 smoke #777777
+ 13 lime #aaff66
+ 14 light blue #0088ff
+ 15 gray #bbbbbb
+
+ The plotter state variable of the machine gets passed as the forth
+ parameter. You can use this parameter to store state information.
+
+*/
+typedef void (*m6502_Plotter) (Bit8, Bit8, Bit8, void*);
+
+struct machine_6502 {
+ BOOL codeCompiledOK;
+ Bit8 regA;
+ Bit8 regX;
+ Bit8 regY;
+ Bit8 regP;
+ Bit16 regPC; /* A pair of 8 bit registers */
+ Bit16 regSP;
+ Bit16 defaultCodePC;
+ Bit8 memory[MEM_64K];
+ BOOL runForever;
+ int labelPtr;
+ BOOL codeRunning;
+ int myInterval;
+ m6502_Opcodes opcodes[NUM_OPCODES];
+ int screen[32][32];
+ int codeLen;
+ m6502_OpcodeIndex opcache[0xff];
+ m6502_Plotter plot;
+ void *plotterState;
+};
+
+/* build6502() - Creates an instance of the 6502 machine */
+machine_6502 *m6502_build(void);
+
+/* destroy6502() - compile the file and exectue it until the program
+ is finished */
+void m6502_destroy6502(machine_6502 *machine);
+
+/* eval_file() - Compiles and runs a file until the program is
+ finished */
+void m6502_eval_file(machine_6502 *machine, const char *filename,
+ m6502_Plotter plot, void *plotterState);
+
+/* start_eval_file() - Compile the file and execute the first
+ instruction */
+void m6502_start_eval_file(machine_6502 *machine, const char *filename,
+ m6502_Plotter plot, void *plotterState);
+
+/* XXX
+void m6502_start_eval_binary(machine_6502 *machine, Bit8 *program,
+ unsigned int proglen,
+ Plotter plot, void *plotterState);
+*/
+
+void m6502_start_eval_string(machine_6502 *machine, const char *code,
+ m6502_Plotter plot, void *plotterState);
+
+/* next_eval() - Execute the next insno of machine instructions */
+void m6502_next_eval(machine_6502 *machine, int insno);
+
+/* hexDump() - Dumps memory to output */
+void m6502_hexDump(machine_6502 *machine, Bit16 start,
+ Bit16 numbytes, FILE *output);
+
+/* Disassemble() - Prints the assembly code for the program currently
+ loaded in memory.*/
+void m6502_disassemble(machine_6502 *machine, FILE *output);
+
+/* trace() - Prints to output the current value of registers, the
+ current nmemonic, memory address and value. */
+void m6502_trace(machine_6502 *machine, FILE *output);
+
+/* save_program() - Writes a binary file of the program loaded in
+ memory. */
+/* XXX
+void save_program(machine_6502 *machine, const char *filename);
+*/
+#endif /* __ASM6502_H__ */
diff --git a/hacks/attraction.c b/hacks/attraction.c
new file mode 100644
index 0000000..4fe22c2
--- /dev/null
+++ b/hacks/attraction.c
@@ -0,0 +1,1109 @@
+/* xscreensaver, Copyright (c) 1992-2013 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* Simulation of a pair of quasi-gravitational fields, maybe sorta kinda
+ a little like the strong and weak electromagnetic forces. Derived from
+ a Lispm screensaver by John Pezaris <pz@mit.edu>. Viscosity added by
+ Philip Edward Cutone, III <pc2d+@andrew.cmu.edu>.
+
+ John sez:
+
+ The simulation started out as a purely accurate gravitational
+ simulation, but, with constant simulation step size, I quickly
+ realized the field being simulated while grossly gravitational
+ was, in fact, non-conservative. It also had the rather annoying
+ behavior of dealing very badly with colliding orbs. Therefore,
+ I implemented a negative-gravity region (with two thresholds; as
+ I read your code, you only implemented one) to prevent orbs from
+ every coming too close together, and added a viscosity factor if
+ the speed of any orb got too fast. This provides a nice stable
+ system with interesting behavior.
+
+ I had experimented with a number of fields including the van der
+ Waals force (very interesting orbiting behavior) and 1/r^3
+ gravity (not as interesting as 1/r^2). An even normal viscosity
+ (rather than the thresholded version to bleed excess energy) is
+ also not interesting. The 1/r^2, -1/r^2, -10/r^2 thresholds
+ proved not only robust but also interesting -- the orbs never
+ collided and the threshold viscosity fixed the
+ non-conservational problem.
+
+ Philip sez:
+ > An even normal viscosity (rather than the thresholded version to
+ > bleed excess energy) is also not interesting.
+
+ unless you make about 200 points.... set the viscosity to about .8
+ and drag the mouse through it. it makes a nice wave which travels
+ through the field.
+
+ And (always the troublemaker) Joe Keane <jgk@jgk.org> sez:
+
+ Despite what John sez, the field being simulated is always
+ conservative. The real problem is that it uses a simple hack,
+ computing acceleration *based only on the starting position*,
+ instead of a real differential equation solver. Thus you'll
+ always have energy coming out of nowhere, although it's most
+ blatant when balls get close together. If it were done right,
+ you wouldn't need viscosity or artificial limits on how close
+ the balls can get.
+
+ Matt <straitm@carleton.edu> sez:
+
+ Added a switch to remove the walls.
+
+ Added a switch to make the threshold viscosity optional. If
+ nomaxspeed is specified, then balls going really fast do not
+ recieve special treatment.
+
+ I've made tail mode prettier by eliminating the first erase line
+ that drew from the upper left corner to the starting position of
+ each point.
+
+ Made the balls in modes other than "balls" bounce exactly at the
+ walls. (Because the graphics for different modes are drawn
+ differently with respect to the "actual" position of the point,
+ they used to be able to run somewhat past the walls, or bounce
+ before hitting them.)
+
+ Added an option to output each ball's speed in the form of a bar
+ graph drawn on the same window as the balls. If only x or y is
+ selected, they will be represented on the appropriate axis down
+ the center of the window. If both are selected, they will both
+ be displayed along the diagonal such that the x and y bars for
+ each point start at the same place. If speed is selected, the
+ speed will be displayed down the left side. */
+
+#include <stdio.h>
+#include <math.h>
+#include "screenhack.h"
+#include "spline.h"
+
+/* The normal (and max) width for a graph bar */
+#define BAR_SIZE 11
+#define MAX_SIZE 16
+#define min(a,b) ((a)<(b)?(a):(b))
+#define max(a,b) ((a)>(b)?(a):(b))
+
+
+enum object_mode {
+ ball_mode, line_mode, polygon_mode, spline_mode, spline_filled_mode,
+ tail_mode
+};
+
+enum graph_mode {
+ graph_none, graph_x, graph_y, graph_both, graph_speed
+};
+
+struct ball {
+ double x, y;
+ double vx, vy;
+ double dx, dy;
+ double mass;
+ int size;
+ int pixel_index;
+ int hue;
+};
+
+struct state {
+ struct ball *balls;
+ double *x_vels;
+ double *y_vels;
+ double *speeds;
+ int npoints;
+ int threshold;
+ int delay;
+ int global_size;
+ int segments;
+ Bool glow_p;
+ Bool orbit_p;
+ Bool walls_p;
+ Bool maxspeed_p;
+ Bool cbounce_p;
+ XPoint *point_stack;
+ int point_stack_size, point_stack_fp;
+ XColor *colors;
+ int ncolors;
+ int fg_index;
+ int color_shift;
+ int xlim, ylim;
+ Bool no_erase_yet; /* for tail mode fix */
+ double viscosity;
+
+ int mouse_ball; /* index of ball being dragged, or 0 if none. */
+ unsigned long mouse_pixel;
+
+ enum object_mode mode;
+ enum graph_mode graph_mode;
+
+ GC draw_gc, erase_gc;
+
+ int total_ticks;
+ int color_tick;
+ spline *spl;
+};
+
+
+static void *
+attraction_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ int i;
+ XWindowAttributes xgwa;
+ XGCValues gcv;
+ int midx, midy, r, vx, vy;
+ double th;
+ Colormap cmap;
+ char *mode_str, *graph_mode_str;
+ double size_scale;
+
+ XGetWindowAttributes (dpy, window, &xgwa);
+ st->xlim = xgwa.width;
+ st->ylim = xgwa.height;
+ cmap = xgwa.colormap;
+ midx = st->xlim/2;
+ midy = st->ylim/2;
+ st->walls_p = get_boolean_resource (dpy, "walls", "Boolean");
+
+ /* if there aren't walls, don't set a limit on the radius */
+ r = get_integer_resource (dpy, "radius", "Integer");
+ if (r <= 0 || (r > min (st->xlim/2, st->ylim/2) && st->walls_p) )
+ r = min (st->xlim/2, st->ylim/2) - 50;
+
+ vx = get_integer_resource (dpy, "vx", "Integer");
+ vy = get_integer_resource (dpy, "vy", "Integer");
+
+ st->npoints = get_integer_resource (dpy, "points", "Integer");
+ if (st->npoints < 1)
+ st->npoints = 3 + (random () % 5);
+ st->balls = (struct ball *) malloc (st->npoints * sizeof (struct ball));
+
+ st->no_erase_yet = 1; /* for tail mode fix */
+
+ st->segments = get_integer_resource (dpy, "segments", "Integer");
+ if (st->segments < 0) st->segments = 1;
+
+ st->threshold = get_integer_resource (dpy, "threshold", "Integer");
+ if (st->threshold < 0) st->threshold = 0;
+
+ st->delay = get_integer_resource (dpy, "delay", "Integer");
+ if (st->delay < 0) st->delay = 0;
+
+ st->global_size = get_integer_resource (dpy, "size", "Integer");
+ if (st->global_size < 0) st->global_size = 0;
+
+ st->glow_p = get_boolean_resource (dpy, "glow", "Boolean");
+
+ st->orbit_p = get_boolean_resource (dpy, "orbit", "Boolean");
+
+ st->maxspeed_p = get_boolean_resource (dpy, "maxspeed", "Boolean");
+
+ st->cbounce_p = get_boolean_resource (dpy, "cbounce", "Boolean");
+
+ st->color_shift = get_integer_resource (dpy, "colorShift", "Integer");
+ if (st->color_shift <= 0) st->color_shift = 5;
+
+ st->viscosity = get_float_resource (dpy, "viscosity", "Float");
+
+ mode_str = get_string_resource (dpy, "mode", "Mode");
+ if (! mode_str) st->mode = ball_mode;
+ else if (!strcmp (mode_str, "balls")) st->mode = ball_mode;
+ else if (!strcmp (mode_str, "lines")) st->mode = line_mode;
+ else if (!strcmp (mode_str, "polygons")) st->mode = polygon_mode;
+ else if (!strcmp (mode_str, "tails")) st->mode = tail_mode;
+ else if (!strcmp (mode_str, "splines")) st->mode = spline_mode;
+ else if (!strcmp (mode_str, "filled-splines"))st->mode = spline_filled_mode;
+ else {
+ fprintf (stderr,
+ "%s: mode must be balls, lines, tails, polygons, splines, or\n\
+ filled-splines, not \"%s\"\n",
+ progname, mode_str);
+ exit (1);
+ }
+
+ graph_mode_str = get_string_resource (dpy, "graphmode", "Mode");
+ if (! graph_mode_str) st->graph_mode = graph_none;
+ else if (!strcmp (graph_mode_str, "x")) st->graph_mode = graph_x;
+ else if (!strcmp (graph_mode_str, "y")) st->graph_mode = graph_y;
+ else if (!strcmp (graph_mode_str, "both")) st->graph_mode = graph_both;
+ else if (!strcmp (graph_mode_str, "speed")) st->graph_mode = graph_speed;
+ else if (!strcmp (graph_mode_str, "none")) st->graph_mode = graph_none;
+ else {
+ fprintf (stderr,
+ "%s: graphmode must be speed, x, y, both, or none, not \"%s\"\n",
+ progname, graph_mode_str);
+ exit (1);
+ }
+
+ /* only allocate memory if it is needed */
+ if(st->graph_mode != graph_none)
+ {
+ if(st->graph_mode == graph_x || st->graph_mode == graph_both)
+ st->x_vels = (double *) malloc (st->npoints * sizeof (double));
+ if(st->graph_mode == graph_y || st->graph_mode == graph_both)
+ st->y_vels = (double *) malloc (st->npoints * sizeof (double));
+ if(st->graph_mode == graph_speed)
+ st->speeds = (double *) malloc (st->npoints * sizeof (double));
+ }
+
+ if (st->mode != ball_mode && st->mode != tail_mode) st->glow_p = False;
+
+ if (st->mode == polygon_mode && st->npoints < 3)
+ st->mode = line_mode;
+
+ st->ncolors = get_integer_resource (dpy, "colors", "Colors");
+ if (st->ncolors < 2) st->ncolors = 2;
+ if (st->ncolors <= 2) mono_p = True;
+ st->colors = 0;
+
+ if (!mono_p)
+ {
+ st->fg_index = 0;
+ switch (st->mode)
+ {
+ case ball_mode:
+ if (st->glow_p)
+ {
+ int H = random() % 360;
+ double S1 = 0.25;
+ double S2 = 1.00;
+ double V = frand(0.25) + 0.75;
+ st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
+ make_color_ramp (xgwa.screen, xgwa.visual, cmap,
+ H, S1, V, H, S2, V, st->colors, &st->ncolors,
+ False, True, False);
+ }
+ else
+ {
+ st->ncolors = st->npoints;
+ st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
+ make_random_colormap (xgwa.screen, xgwa.visual, cmap,
+ st->colors, &st->ncolors,
+ True, True, False, True);
+ }
+ break;
+ case line_mode:
+ case polygon_mode:
+ case spline_mode:
+ case spline_filled_mode:
+ case tail_mode:
+ st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
+ make_smooth_colormap (xgwa.screen, xgwa.visual, cmap,
+ st->colors, &st->ncolors,
+ True, False, True);
+ break;
+ default:
+ abort ();
+ }
+ }
+
+ if (!mono_p && st->ncolors <= 2)
+ {
+ if (st->colors) free (st->colors);
+ st->colors = 0;
+ mono_p = True;
+ }
+
+ st->mouse_pixel =
+ get_pixel_resource (dpy, cmap, "mouseForeground", "MouseForeground");
+ st->mouse_ball = -1;
+
+ if (st->mode != ball_mode)
+ {
+ int size = (st->segments ? st->segments : 1);
+ st->point_stack_size = size * (st->npoints + 1);
+ st->point_stack = (XPoint *) calloc (st->point_stack_size, sizeof (XPoint));
+ st->point_stack_fp = 0;
+ }
+
+ gcv.line_width = (st->mode == tail_mode
+ ? (st->global_size ? st->global_size : (MAX_SIZE * 2 / 3))
+ : 1);
+ gcv.cap_style = (st->mode == tail_mode ? CapRound : CapButt);
+
+ if (mono_p)
+ gcv.foreground = get_pixel_resource(dpy, cmap, "foreground", "Foreground");
+ else
+ gcv.foreground = st->colors[st->fg_index].pixel;
+ st->draw_gc = XCreateGC (dpy, window, GCForeground|GCLineWidth|GCCapStyle, &gcv);
+
+ gcv.foreground = get_pixel_resource(dpy, cmap, "background", "Background");
+ st->erase_gc = XCreateGC (dpy, window, GCForeground|GCLineWidth|GCCapStyle,&gcv);
+
+
+#ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (dpy, st->draw_gc, False);
+ jwxyz_XSetAntiAliasing (dpy, st->erase_gc, False);
+#endif
+
+ size_scale = 3;
+ if (xgwa.width < 100 || xgwa.height < 100) /* tiny windows */
+ size_scale = 0.75;
+
+ /* let's make the balls bigger by default */
+#define rand_size() (size_scale * (8 + (random () % 7)))
+
+ if (st->orbit_p && !st->global_size)
+ /* To orbit, all objects must be the same mass, or the math gets
+ really hairy... */
+ st->global_size = rand_size ();
+
+ RETRY_NO_ORBIT:
+ th = frand (M_PI+M_PI);
+ for (i = 0; i < st->npoints; i++)
+ {
+ int new_size = (st->global_size ? st->global_size : rand_size ());
+ st->balls [i].dx = 0;
+ st->balls [i].dy = 0;
+ st->balls [i].size = new_size;
+ st->balls [i].mass = (new_size * new_size * 10);
+ st->balls [i].x = midx + r * cos (i * ((M_PI+M_PI) / st->npoints) + th);
+ st->balls [i].y = midy + r * sin (i * ((M_PI+M_PI) / st->npoints) + th);
+ if (! st->orbit_p)
+ {
+ st->balls [i].vx = vx ? vx : ((6.0 - (random () % 11)) / 8.0);
+ st->balls [i].vy = vy ? vy : ((6.0 - (random () % 11)) / 8.0);
+ }
+ if (mono_p || st->mode != ball_mode)
+ st->balls [i].pixel_index = -1;
+ else if (st->glow_p)
+ st->balls [i].pixel_index = 0;
+ else
+ st->balls [i].pixel_index = random() % st->ncolors;
+ }
+
+ /* This lets modes where the points don't really have any size use the whole
+ window. Otherwise, since the points still have a positive size
+ assigned to them, they will be bounced somewhat early. Mass and size are
+ seperate, so this shouldn't cause problems. It's a bit kludgy, tho.
+ */
+ if(st->mode == line_mode || st->mode == spline_mode ||
+ st->mode == spline_filled_mode || st->mode == polygon_mode)
+ {
+ for(i = 1; i < st->npoints; i++)
+ {
+ st->balls[i].size = 0;
+ }
+ }
+
+ if (st->orbit_p)
+ {
+ double a = 0;
+ double v;
+ double v_mult = get_float_resource (dpy, "vMult", "Float");
+ if (v_mult == 0.0) v_mult = 1.0;
+
+ for (i = 1; i < st->npoints; i++)
+ {
+ double _2ipi_n = (2 * i * M_PI / st->npoints);
+ double x = r * cos (_2ipi_n);
+ double y = r * sin (_2ipi_n);
+ double distx = r - x;
+ double dist2 = (distx * distx) + (y * y);
+ double dist = sqrt (dist2);
+ double a1 = ((st->balls[i].mass / dist2) *
+ ((dist < st->threshold) ? -1.0 : 1.0) *
+ (distx / dist));
+ a += a1;
+ }
+ if (a < 0.0)
+ {
+ /* "domain error: forces on balls too great" */
+ fprintf (stderr, "%s: window too small for these orbit settings.\n",
+ progname);
+ st->orbit_p = False;
+ goto RETRY_NO_ORBIT;
+ }
+ v = sqrt (a * r) * v_mult;
+ for (i = 0; i < st->npoints; i++)
+ {
+ double k = ((2 * i * M_PI / st->npoints) + th);
+ st->balls [i].vx = -v * sin (k);
+ st->balls [i].vy = v * cos (k);
+ }
+ }
+
+ if (mono_p) st->glow_p = False;
+
+ XClearWindow (dpy, window);
+ return st;
+}
+
+static void
+compute_force (struct state *st, int i, double *dx_ret, double *dy_ret)
+{
+ int j;
+ double x_dist, y_dist, dist, dist2;
+ *dx_ret = 0;
+ *dy_ret = 0;
+ for (j = 0; j < st->npoints; j++)
+ {
+ if (i == j) continue;
+ x_dist = st->balls [j].x - st->balls [i].x;
+ y_dist = st->balls [j].y - st->balls [i].y;
+ dist2 = (x_dist * x_dist) + (y_dist * y_dist);
+ dist = sqrt (dist2);
+
+ if (dist > 0.1) /* the balls are not overlapping */
+ {
+ double new_acc = ((st->balls[j].mass / dist2) *
+ ((dist < st->threshold) ? -1.0 : 1.0));
+ double new_acc_dist = new_acc / dist;
+ *dx_ret += new_acc_dist * x_dist;
+ *dy_ret += new_acc_dist * y_dist;
+ }
+ else
+ { /* the balls are overlapping; move randomly */
+ *dx_ret += (frand (10.0) - 5.0);
+ *dy_ret += (frand (10.0) - 5.0);
+ }
+ }
+}
+
+
+/* Draws meters along the diagonal for the x velocity */
+static void
+draw_meter_x(Display *dpy, Window window, struct state *st, int i, int alone)
+{
+ XWindowAttributes xgwa;
+ int x1,x2,y,w1,w2,h;
+ XGetWindowAttributes (dpy, window, &xgwa);
+
+ /* set the width of the bars to use */
+ if(xgwa.height < BAR_SIZE*st->npoints)
+ {
+ y = i*(xgwa.height/st->npoints);
+ h = (xgwa.height/st->npoints) - 2;
+ }
+ else
+ {
+ y = BAR_SIZE*i;
+ h = BAR_SIZE - 2;
+ }
+
+ if(alone)
+ {
+ x1 = xgwa.width/2;
+ x2 = x1;
+ }
+ else
+ {
+ x1 = i*(h+2);
+ if(x1 < i)
+ x1 = i;
+ x2 = x1;
+ }
+
+ if(y<1) y=i;
+ if(h<1) h=1;
+
+ w1 = (int)(20*st->x_vels[i]);
+ w2 = (int)(20*st->balls[i].vx);
+ st->x_vels[i] = st->balls[i].vx;
+
+ if (w1<0) {
+ w1=-w1;
+ x1=x1-w1;
+ }
+ if (w2<0) {
+ w2=-w2;
+ x2=x2-w2;
+ }
+ XDrawRectangle(dpy,window,st->erase_gc,x1+(h+2)/2,y,w1,h);
+ XDrawRectangle(dpy,window,st->draw_gc,x2+(h+2)/2,y,w2,h);
+}
+
+/* Draws meters along the diagonal for the y velocity.
+ Is there some way to make draw_meter_x and draw_meter_y
+ one function instead of two without making them completely unreadable?
+*/
+static void
+draw_meter_y (Display *dpy, Window window, struct state *st, int i, int alone)
+{
+ XWindowAttributes xgwa;
+ int y1,y2,x,h1,h2,w;
+ XGetWindowAttributes (dpy, window, &xgwa);
+
+ if(xgwa.height < BAR_SIZE*st->npoints){ /*needs to be height still */
+ x = i*(xgwa.height/st->npoints);
+ w = (xgwa.height/st->npoints) - 2;
+ }
+ else{
+ x = BAR_SIZE*i;
+ w = BAR_SIZE - 2;
+ }
+
+ if(alone)
+ {
+ y1 = xgwa.height/2;
+ y2 = y1;
+ }
+ else
+ {
+ y1 = i*(w+2);
+ if(y1 < i)
+ y1 = i;
+ y2 = y1;
+ }
+
+ if(x < 1) x = i;
+ if(w < 1) w = 1;
+
+ h1 = (int)(20*st->y_vels[i]);
+ h2 = (int)(20*st->balls[i].vy);
+ st->y_vels[i] = st->balls[i].vy;
+
+ if (h1<0) {
+ h1=-h1;
+ y1=y1-h1;
+ }
+ if (h2<0) {
+ h2=-h2;
+ y2=y2-h2;
+ }
+ XDrawRectangle(dpy,window,st->erase_gc,x,y1+(w+2)/2,w,h1);
+ XDrawRectangle(dpy,window,st->draw_gc,x,y2+(w+2)/2,w,h2);
+}
+
+
+/* Draws meters of the total speed of the balls */
+static void
+draw_meter_speed (Display *dpy, Window window, struct state *st, int i)
+{
+ XWindowAttributes xgwa;
+ int y,x1,x2,h,w1,w2;
+ XGetWindowAttributes (dpy, window, &xgwa);
+
+ if(xgwa.height < BAR_SIZE*st->npoints)
+ {
+ y = i*(xgwa.height/st->npoints);
+ h = (xgwa.height/st->npoints) - 2;
+ }
+ else{
+ y = BAR_SIZE*i;
+ h = BAR_SIZE - 2;
+ }
+
+ x1 = 0;
+ x2 = x1;
+
+ if(y < 1) y = i;
+ if(h < 1) h = 1;
+
+ w1 = (int)(5*st->speeds[i]);
+ w2 = (int)(5*(st->balls[i].vy*st->balls[i].vy+st->balls[i].vx*st->balls[i].vx));
+ st->speeds[i] = st->balls[i].vy*st->balls[i].vy+st->balls[i].vx*st->balls[i].vx;
+
+ XDrawRectangle(dpy,window,st->erase_gc,x1,y,w1,h);
+ XDrawRectangle(dpy,window,st->draw_gc, x2,y,w2,h);
+}
+
+/* Returns the position of the mouse relative to the root window.
+ */
+static void
+query_mouse (Display *dpy, Window win, int *x, int *y)
+{
+ Window root1, child1;
+ int mouse_x, mouse_y, root_x, root_y;
+ unsigned int mask;
+ if (XQueryPointer (dpy, win, &root1, &child1,
+ &root_x, &root_y, &mouse_x, &mouse_y, &mask))
+ {
+ *x = mouse_x;
+ *y = mouse_y;
+ }
+ else
+ {
+ *x = -9999;
+ *y = -9999;
+ }
+}
+
+static unsigned long
+attraction_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int last_point_stack_fp = st->point_stack_fp;
+
+ int i, radius = st->global_size/2;
+
+ st->total_ticks++;
+
+ if(st->global_size == 0)
+ radius = (MAX_SIZE / 3);
+
+ if(st->graph_mode != graph_none)
+ {
+ if(st->graph_mode == graph_both)
+ {
+ for(i = 0; i < st->npoints; i++)
+ {
+ draw_meter_x(dpy, window, st, i, 0);
+ draw_meter_y(dpy, window, st, i, 0);
+ }
+ }
+ else if(st->graph_mode == graph_x)
+ {
+ for(i = 0; i < st->npoints; i++)
+ {
+ draw_meter_x(dpy, window, st, i, 1);
+ }
+ }
+ else if(st->graph_mode == graph_y)
+ {
+ for(i = 0; i < st->npoints; i++)
+ {
+ draw_meter_y(dpy, window, st, i, 1);
+ }
+ }
+ else if(st->graph_mode == graph_speed)
+ {
+ for(i = 0; i < st->npoints; i++)
+ {
+ draw_meter_speed(dpy, window, st, i);
+ }
+ }
+
+ }
+
+ /* compute the force of attraction/repulsion among all balls */
+ for (i = 0; i < st->npoints; i++)
+ compute_force (st, i, &st->balls[i].dx, &st->balls[i].dy);
+
+ /* move the balls according to the forces now in effect */
+ for (i = 0; i < st->npoints; i++)
+ {
+ double old_x = st->balls[i].x;
+ double old_y = st->balls[i].y;
+ double new_x, new_y;
+ int size = st->balls[i].size;
+
+ st->balls[i].vx += st->balls[i].dx;
+ st->balls[i].vy += st->balls[i].dy;
+
+ /* "don't let them get too fast: impose a terminal velocity
+ (actually, make the medium have friction)"
+ Well, what this first step really does is give the medium a
+ viscosity of .9 for balls going over the speed limit. Anyway,
+ this is now optional
+ */
+ if (fabs(st->balls[i].vx) > 10 && st->maxspeed_p)
+ {
+ st->balls[i].vx *= 0.9;
+ st->balls[i].dx = 0;
+ }
+ if (st->viscosity != 1)
+ {
+ st->balls[i].vx *= st->viscosity;
+ }
+
+ if (fabs(st->balls[i].vy) > 10 && st->maxspeed_p)
+ {
+ st->balls[i].vy *= 0.9;
+ st->balls[i].dy = 0;
+ }
+ if (st->viscosity != 1)
+ {
+ st->balls[i].vy *= st->viscosity;
+ }
+
+ st->balls[i].x += st->balls[i].vx;
+ st->balls[i].y += st->balls[i].vy;
+
+
+ /* bounce off the walls if desired
+ note: a ball is actually its upper left corner */
+ if(st->walls_p)
+ {
+ if(st->cbounce_p) /* with correct bouncing */
+ {
+ /* so long as it's out of range, keep bouncing */
+ /* limit the maximum number to bounce to 4.*/
+ int bounce_allowed = 4;
+
+ while( bounce_allowed && (
+ (st->balls[i].x >= (st->xlim - st->balls[i].size)) ||
+ (st->balls[i].y >= (st->ylim - st->balls[i].size)) ||
+ (st->balls[i].x <= 0) ||
+ (st->balls[i].y <= 0) )
+ )
+ {
+ bounce_allowed--;
+ if (st->balls[i].x >= (st->xlim - st->balls[i].size))
+ {
+ st->balls[i].x = (2*(st->xlim - st->balls[i].size) - st->balls[i].x);
+ st->balls[i].vx = -st->balls[i].vx;
+ }
+ if (st->balls[i].y >= (st->ylim - st->balls[i].size))
+ {
+ st->balls[i].y = (2*(st->ylim - st->balls[i].size) - st->balls[i].y);
+ st->balls[i].vy = -st->balls[i].vy;
+ }
+ if (st->balls[i].x <= 0)
+ {
+ st->balls[i].x = -st->balls[i].x;
+ st->balls[i].vx = -st->balls[i].vx;
+ }
+ if (st->balls[i].y <= 0)
+ {
+ st->balls[i].y = -st->balls[i].y;
+ st->balls[i].vy = -st->balls[i].vy;
+ }
+ }
+ }
+ else /* with old bouncing */
+ {
+ if (st->balls[i].x >= (st->xlim - st->balls[i].size))
+ {
+ st->balls[i].x = (st->xlim - st->balls[i].size - 1);
+ if (st->balls[i].vx > 0) /* why is this check here? */
+ st->balls[i].vx = -st->balls[i].vx;
+ }
+ if (st->balls[i].y >= (st->ylim - st->balls[i].size))
+ {
+ st->balls[i].y = (st->ylim - st->balls[i].size - 1);
+ if (st->balls[i].vy > 0)
+ st->balls[i].vy = -st->balls[i].vy;
+ }
+ if (st->balls[i].x <= 0)
+ {
+ st->balls[i].x = 0;
+ if (st->balls[i].vx < 0)
+ st->balls[i].vx = -st->balls[i].vx;
+ }
+ if (st->balls[i].y <= 0)
+ {
+ st->balls[i].y = 0;
+ if (st->balls[i].vy < 0)
+ st->balls[i].vy = -st->balls[i].vy;
+ }
+ }
+ }
+
+ if (i == st->mouse_ball)
+ {
+ int x, y;
+ query_mouse (dpy, window, &x, &y);
+ if (st->mode == ball_mode)
+ {
+ x -= st->balls[i].size / 2;
+ y -= st->balls[i].size / 2;
+ }
+
+ st->balls[i].x = x;
+ st->balls[i].y = y;
+ }
+
+ new_x = st->balls[i].x;
+ new_y = st->balls[i].y;
+
+ if (!mono_p)
+ {
+ if (st->mode == ball_mode)
+ {
+ if (st->glow_p)
+ {
+ /* make color saturation be related to particle
+ acceleration. */
+ double limit = 0.5;
+ double s, fraction;
+ double vx = st->balls [i].dx;
+ double vy = st->balls [i].dy;
+ if (vx < 0) vx = -vx;
+ if (vy < 0) vy = -vy;
+ fraction = vx + vy;
+ if (fraction > limit) fraction = limit;
+
+ s = 1 - (fraction / limit);
+ st->balls[i].pixel_index = (st->ncolors * s);
+ }
+ XSetForeground (dpy, st->draw_gc,
+ (i == st->mouse_ball
+ ? st->mouse_pixel
+ : st->colors[st->balls[i].pixel_index].pixel));
+ }
+ }
+
+ if (st->mode == ball_mode)
+ {
+ XFillArc (dpy, window, st->erase_gc, (int) old_x, (int) old_y,
+ size, size, 0, 360*64);
+ XFillArc (dpy, window, st->draw_gc, (int) new_x, (int) new_y,
+ size, size, 0, 360*64);
+ }
+ else
+ {
+ st->point_stack [st->point_stack_fp].x = new_x;
+ st->point_stack [st->point_stack_fp].y = new_y;
+ st->point_stack_fp++;
+ }
+ }
+
+ /* draw the lines or polygons after computing all points */
+ if (st->mode != ball_mode)
+ {
+ st->point_stack [st->point_stack_fp].x = st->balls [0].x; /* close the polygon */
+ st->point_stack [st->point_stack_fp].y = st->balls [0].y;
+ st->point_stack_fp++;
+ if (st->point_stack_fp == st->point_stack_size)
+ st->point_stack_fp = 0;
+ else if (st->point_stack_fp > st->point_stack_size) /* better be aligned */
+ abort ();
+ if (!mono_p)
+ {
+ if (st->color_tick++ == st->color_shift)
+ {
+ st->color_tick = 0;
+ st->fg_index = (st->fg_index + 1) % st->ncolors;
+ XSetForeground (dpy, st->draw_gc, st->colors[st->fg_index].pixel);
+ }
+ }
+ }
+
+ switch (st->mode)
+ {
+ case ball_mode:
+ break;
+ case line_mode:
+ if (st->segments > 0)
+ XDrawLines (dpy, window, st->erase_gc, st->point_stack + st->point_stack_fp,
+ st->npoints + 1, CoordModeOrigin);
+ XDrawLines (dpy, window, st->draw_gc, st->point_stack + last_point_stack_fp,
+ st->npoints + 1, CoordModeOrigin);
+ break;
+ case polygon_mode:
+ if (st->segments > 0)
+ XFillPolygon (dpy, window, st->erase_gc, st->point_stack + st->point_stack_fp,
+ st->npoints + 1, (st->npoints == 3 ? Convex : Complex),
+ CoordModeOrigin);
+ XFillPolygon (dpy, window, st->draw_gc, st->point_stack + last_point_stack_fp,
+ st->npoints + 1, (st->npoints == 3 ? Convex : Complex),
+ CoordModeOrigin);
+ break;
+ case tail_mode:
+ {
+ for (i = 0; i < st->npoints; i++)
+ {
+ int index = st->point_stack_fp + i;
+ int next_index = (index + (st->npoints + 1)) % st->point_stack_size;
+ if(st->no_erase_yet == 1)
+ {
+ if(st->total_ticks >= st->segments)
+ {
+ st->no_erase_yet = 0;
+ XDrawLine (dpy, window, st->erase_gc,
+ st->point_stack [index].x + radius,
+ st->point_stack [index].y + radius,
+ st->point_stack [next_index].x + radius,
+ st->point_stack [next_index].y + radius);
+ }
+ }
+ else
+ {
+ XDrawLine (dpy, window, st->erase_gc,
+ st->point_stack [index].x + radius,
+ st->point_stack [index].y + radius,
+ st->point_stack [next_index].x + radius,
+ st->point_stack [next_index].y + radius);
+ }
+ index = last_point_stack_fp + i;
+ next_index = (index - (st->npoints + 1)) % st->point_stack_size;
+ if (next_index < 0) next_index += st->point_stack_size;
+ if (st->point_stack [next_index].x == 0 &&
+ st->point_stack [next_index].y == 0)
+ continue;
+ XDrawLine (dpy, window, st->draw_gc,
+ st->point_stack [index].x + radius,
+ st->point_stack [index].y + radius,
+ st->point_stack [next_index].x + radius,
+ st->point_stack [next_index].y + radius);
+ }
+ }
+ break;
+ case spline_mode:
+ case spline_filled_mode:
+ {
+ if (! st->spl) st->spl = make_spline (st->npoints);
+ if (st->segments > 0)
+ {
+ for (i = 0; i < st->npoints; i++)
+ {
+ st->spl->control_x [i] = st->point_stack [st->point_stack_fp + i].x;
+ st->spl->control_y [i] = st->point_stack [st->point_stack_fp + i].y;
+ }
+ compute_closed_spline (st->spl);
+ if (st->mode == spline_filled_mode)
+ XFillPolygon (dpy, window, st->erase_gc, st->spl->points, st->spl->n_points,
+ (st->spl->n_points == 3 ? Convex : Complex),
+ CoordModeOrigin);
+ else
+ XDrawLines (dpy, window, st->erase_gc, st->spl->points, st->spl->n_points,
+ CoordModeOrigin);
+ }
+ for (i = 0; i < st->npoints; i++)
+ {
+ st->spl->control_x [i] = st->point_stack [last_point_stack_fp + i].x;
+ st->spl->control_y [i] = st->point_stack [last_point_stack_fp + i].y;
+ }
+ compute_closed_spline (st->spl);
+ if (st->mode == spline_filled_mode)
+ XFillPolygon (dpy, window, st->draw_gc, st->spl->points, st->spl->n_points,
+ (st->spl->n_points == 3 ? Convex : Complex),
+ CoordModeOrigin);
+ else
+ XDrawLines (dpy, window, st->draw_gc, st->spl->points, st->spl->n_points,
+ CoordModeOrigin);
+ }
+ break;
+ default:
+ abort ();
+ }
+
+ return st->delay;
+}
+
+static void
+attraction_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->xlim = w;
+ st->ylim = h;
+}
+
+static Bool
+attraction_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+
+ if (event->xany.type == ButtonPress)
+ {
+ int i;
+ if (st->mouse_ball != -1) /* second down-click? drop the ball. */
+ {
+ st->mouse_ball = -1;
+ return True;
+ }
+ else
+ {
+ /* When trying to pick up a ball, first look for a click directly
+ inside the ball; but if we don't find it, expand the radius
+ outward until we find something nearby.
+ */
+ int x = event->xbutton.x;
+ int y = event->xbutton.y;
+ float max = 10 * (st->global_size ? st->global_size : MAX_SIZE);
+ float step = max / 100;
+ float r2;
+ for (r2 = step; r2 < max; r2 += step)
+ {
+ for (i = 0; i < st->npoints; i++)
+ {
+ float d = ((st->balls[i].x - x) * (st->balls[i].x - x) +
+ (st->balls[i].y - y) * (st->balls[i].y - y));
+ float r = st->balls[i].size;
+ if (r2 > r) r = r2;
+ if (d < r*r)
+ {
+ st->mouse_ball = i;
+ return True;
+ }
+ }
+ }
+ }
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease) /* drop the ball */
+ {
+ st->mouse_ball = -1;
+ return True;
+ }
+
+
+
+ return False;
+}
+
+static void
+attraction_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if (st->balls) free (st->balls);
+ if (st->x_vels) free (st->x_vels);
+ if (st->y_vels) free (st->y_vels);
+ if (st->speeds) free (st->speeds);
+ if (st->point_stack) free (st->point_stack);
+ if (st->colors) free (st->colors);
+ if (st->spl) free_spline (st->spl);
+
+ free (st);
+}
+
+
+static const char *attraction_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*mode: balls",
+ "*graphmode: none",
+ "*points: 0",
+ "*size: 0",
+ "*colors: 200",
+ "*threshold: 200",
+ "*delay: 10000",
+ "*glow: false",
+ "*walls: true",
+ "*maxspeed: true",
+ "*cbounce: true",
+ "*viscosity: 1.0",
+ "*orbit: false",
+ "*colorShift: 3",
+ "*segments: 500",
+ "*vMult: 0.9",
+ "*radius: 0",
+ "*vx: 0",
+ "*vy: 0",
+ "*mouseForeground: white",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec attraction_options [] = {
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-graphmode", ".graphmode", XrmoptionSepArg, 0 },
+ { "-colors", ".colors", XrmoptionSepArg, 0 },
+ { "-points", ".points", XrmoptionSepArg, 0 },
+ { "-color-shift", ".colorShift", XrmoptionSepArg, 0 },
+ { "-threshold", ".threshold", XrmoptionSepArg, 0 },
+ { "-segments", ".segments", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-size", ".size", XrmoptionSepArg, 0 },
+ { "-radius", ".radius", XrmoptionSepArg, 0 },
+ { "-vx", ".vx", XrmoptionSepArg, 0 },
+ { "-vy", ".vy", XrmoptionSepArg, 0 },
+ { "-vmult", ".vMult", XrmoptionSepArg, 0 },
+ { "-viscosity", ".viscosity", XrmoptionSepArg, 0 },
+ { "-glow", ".glow", XrmoptionNoArg, "true" },
+ { "-noglow", ".glow", XrmoptionNoArg, "false" },
+ { "-orbit", ".orbit", XrmoptionNoArg, "true" },
+ { "-nowalls", ".walls", XrmoptionNoArg, "false" },
+ { "-walls", ".walls", XrmoptionNoArg, "true" },
+ { "-nomaxspeed", ".maxspeed", XrmoptionNoArg, "false" },
+ { "-maxspeed", ".maxspeed", XrmoptionNoArg, "true" },
+ { "-correct-bounce", ".cbounce", XrmoptionNoArg, "false" },
+ { "-fast-bounce", ".cbounce", XrmoptionNoArg, "true" },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("Attraction", attraction)
diff --git a/hacks/attraction.man b/hacks/attraction.man
new file mode 100644
index 0000000..6630355
--- /dev/null
+++ b/hacks/attraction.man
@@ -0,0 +1,214 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "14-Jun-97" "X Version 11"
+.SH NAME
+attraction - interactions of opposing forces
+.SH SYNOPSIS
+.B attraction
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-visual \fIvisual\fP] [\-points \fIint\fP] [\-threshold \fIint\fP]
+[\-mode balls | lines | polygons | splines | filled-splines | tails ]
+[\-size \fIint\fP] [\-segments \fIint\fP] [\-delay \fIusecs\fP]
+[\-color-shift \fIint\fP] [\-radius \fIint\fP]
+[\-vx \fIint\fP] [\-vy \fIint\fP] [\-glow] [\-noglow]
+[\-orbit] [\-viscosity \fIfloat\fP]
+[\-walls] [\-nowalls] [\-maxspeed] [\-nomaxspeed]
+[\-correct-bounce] [\-fast-bounce]
+[\-fps]
+.SH DESCRIPTION
+The \fIattraction\fP program has several visually different modes of
+operation, all of which are based on the interactions of a set of control
+points which attract each other up to a certain distance, and then begin
+to repel each other. The attraction/repulsion is proportional to the
+distance between any two particles.
+.SH OPTIONS
+.I attraction
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-points integer
+How many control points should be used, or 0 to select the number randomly.
+Default 0. Between 3 and 15 works best.
+.TP 8
+.B \-threshold integer
+The distance (in pixels) from each particle at which the attractive force
+becomes repulsive. Default 100.
+.TP 8
+.B \-mode "balls | lines | polygons | tails | splines | filled-splines"
+In \fIballs\fP mode (the default) the control points are drawn as filled
+circles. The larger the circle, the more massive the particle.
+
+In \fIlines\fP mode, the control points are connected by straight lines;
+the effect is something like \fIqix\fP.
+
+In \fIpolygons\fP mode, the control points are connected by straight
+lines, and filled in. This is most interesting in color.
+
+In \fIsplines\fP mode, a closed spline is interpolated from the control
+points.
+
+In \fIfilled-splines\fP mode, the splines are filled in instead of being
+outlines. This is most interesting in color.
+
+In \fItails\fP mode, the path which each particle follows is indicated
+by a worm-like trail, whose length is controlled by the \fIsegments\fP
+parameter.
+.TP 8
+.B \-size integer
+The size of the balls in pixels, or 0, meaning to select the sizes
+randomly (the default.) If this is specified, then all balls will be
+the same size. This option has an effect in all modes, since the ``size''
+of the balls controls their mass.
+.TP 8
+.B \-segments integer
+If in \fIlines\fP or \fIpolygons\fP mode, how many sets of line segments
+or polygons should be drawn. Default 500. This has no effect in \fIballs\fP
+mode. If \fIsegments\fP is 0, then no segments will ever be erased (this
+is only useful in color.)
+.TP 8
+.B \-delay microseconds
+How much of a delay should be introduced between steps of the animation.
+Default 10000, or about 0.01 seconds.
+.TP 8
+.B \-color-shift int
+If on a color display, the color of the line segments or polygons will
+cycle through the color map. This specifies how many lines will be drawn
+before a new color is chosen. (When a small number of colors are available,
+increasing this value will yield smoother transitions.) Default 3.
+This has no effect in \fIballs\fP mode.
+.TP 8
+.B \-radius
+The size in pixels of the circle on which the points are initially positioned.
+The default is slightly smaller than the size of the window.
+.TP 8
+.B \-glow
+This is consulted only in \fIballs\fP mode. If this is specified, then
+the saturation of the colors of the points will vary according to their
+current acceleration. This has the effect that the balls flare brighter
+when they are reacting to each other most strongly.
+
+In \fIglow\fP mode, all of the balls will be drawn the same (random)
+color, modulo the saturation shifts. In non-glow mode, the balls will
+each be drawn in a random color that doesn't change.
+.TP 8
+.B \-noglow
+Don't do ``glowing.'' This is the default.
+.TP 8
+.B \-vx pixels
+.TP 8
+.B \-vy pixels
+Initial velocity of the balls. This has no effect in \fB\-orbit\fP mode.
+.TP 8
+.B \-orbit
+Make the initial force on each ball be tangential to the circle on which
+they are initially placed, with the right velocity to hold them in orbit
+about each other. After a while, roundoff errors will cause the orbit
+to decay.
+.TP 8
+.B \-vmult float
+In orbit mode, the initial velocity of the balls is multiplied by this;
+a number less than 1 will make the balls pull closer together, and a larger
+number will make them move apart. The default is 0.9, meaning a slight
+inward pull.
+.TP 8
+.B \-viscosity float
+This sets the viscosity of the hypothetical fluid through which the control
+points move; the default is 1, meaning no resistance. Values higher than 1
+aren't interesting; lower values cause less motion.
+
+One interesting thing to try is
+.EX
+attraction -viscosity 0.8 -points 300 -size 10 -geometry =500x500
+.EE
+Give it a few seconds to settle down into a stable clump, and then move
+the drag the mouse through it to make "waves".
+.TP 8
+.B \-nowalls
+This will cause the balls to continue on past the edge of the
+screen or window. They will still be kept track of and can come back.
+.TP 8
+.B \-walls
+This will cause the balls to bounce when they get
+to the edge of the screen or window. This is the default behavior.
+.TP 8
+.B \-maxspeed
+Imposes a maximum speed (default). If a ball ends up going faster than
+this, it will be treated as though there were .9 viscosity until it is
+under the limit. This stops the balls from continually accelerating (which
+they have a tendency to do), but also causes balls moving very fast to
+tend to clump in the lower right corner.
+.TP 8
+.B \-nomaxspeed
+If this is specified, no maximum speed is set for the balls.
+.TP 8
+.B \-fast-bounce
+Uses the old, simple bouncing algorithm (default). This simply moves any
+ball that is out of bounds back to a wall and reverses its velocity.
+This works fine for most cases, but under some circumstances, the
+simplification can lead to annoying effects.
+.TP 8
+.B \-correct-bounce
+Uses a more intelligent bouncing algorithm. This method actually reflects
+the balls off the walls until they are within bounds. This can be slow
+if balls are bouncing a whole lot, perhaps because of -nomaxspeed.
+.TP 8
+.B \-graphmode none | x | y | both | speed
+For "x", "y", and "both", displays the given velocities of each ball as a
+bar graph in the same window as the balls. For "speed", displays the total
+speed of each ball. Default is "none".
+.BR
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1992, 1993, 1997 by Jamie Zawinski. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for any
+purpose is hereby granted without fee, provided that the above copyright
+notice appear in all copies and that both that copyright notice and this
+permission notice appear in supporting documentation. No representations are
+made about the suitability of this software for any purpose. It is provided
+"as is" without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
+
+Viscosity support by Philip Edward Cutone, III.
+
+Walls, speed limit options, new bouncing, graphs, and tail mode fix by
+Matthew Strait. 31 March 2001
diff --git a/hacks/automata.h b/hacks/automata.h
new file mode 100644
index 0000000..ad30d47
--- /dev/null
+++ b/hacks/automata.h
@@ -0,0 +1,64 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/*-
+ * automata.c - special stuff for automata modes
+ *
+ * Copyright (c) 1995 by David Bagley.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ */
+
+#define NUMSTIPPLES 11
+#define STIPPLESIZE 8
+
+static XPoint hexagonUnit[6] =
+{
+ {0, 0},
+ {1, 1},
+ {0, 2},
+ {-1, 1},
+ {-1, -1},
+ {0, -2}
+};
+
+static XPoint triangleUnit[2][3] =
+{
+ {
+ {0, 0},
+ {1, -1},
+ {0, 2}
+ },
+ {
+ {0, 0},
+ {-1, 1},
+ {0, -2}
+ }
+};
+
+
+#ifdef DO_STIPPLE
+static unsigned char stipples[NUMSTIPPLES][STIPPLESIZE] =
+{
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* white */
+ {0x11, 0x22, 0x11, 0x22, 0x11, 0x22, 0x11, 0x22}, /* grey+white | stripe */
+ {0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00}, /* spots */
+ {0x88, 0x44, 0x22, 0x11, 0x88, 0x44, 0x22, 0x11}, /* lt. / stripe */
+ {0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66}, /* | bars */
+ {0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa}, /* 50% grey */
+ {0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00}, /* - bars */
+ {0xee, 0xdd, 0xbb, 0x77, 0xee, 0xdd, 0xbb, 0x77}, /* dark \ stripe */
+ {0xff, 0x99, 0x99, 0xff, 0xff, 0x99, 0x99, 0xff}, /* spots */
+ {0xaa, 0xff, 0xff, 0x55, 0xaa, 0xff, 0xff, 0x55}, /* black+grey - stripe */
+ {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} /* black */
+};
+#endif /* DO_STIPPLE */
+
diff --git a/hacks/barcode.c b/hacks/barcode.c
new file mode 100644
index 0000000..31574bd
--- /dev/null
+++ b/hacks/barcode.c
@@ -0,0 +1,1995 @@
+/* barcode, draw some barcodes
+ * by Dan Bornstein, danfuzz@milk.com
+ * Copyright (c) 2003 Dan Bornstein. All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * See the included man page for more details.
+ */
+
+#include <math.h>
+#include <time.h>
+#include "screenhack.h"
+
+/* non-user-modifiable immutable definitions */
+
+#define FLOAT double
+
+/* random float in the range (0..1) */
+#define RAND_FLOAT_01 \
+ (((FLOAT) ((random() >> 8) & 0xffff)) / ((FLOAT) 0x10000))
+
+#define BARCODE_WIDTH (164)
+#define BARCODE_HEIGHT (69)
+#define MAX_MAG (7)
+
+
+/* simple bitmap structure */
+
+typedef struct
+{
+ int width;
+ int height;
+ int widthBytes;
+ char *buf;
+}
+Bitmap;
+
+
+
+/* the model */
+
+typedef struct
+{
+ int x; /* x coordinate of the left of the barcode */
+ int y; /* y coordinate of the left of the barcode */
+ int mag; /* magnfication factor */
+ Bitmap *bitmap; /* the bitmap */
+ char code[128]; /* the barcode string */
+ unsigned long pixel; /* the color */
+}
+Barcode;
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ /* parameters that are user configurable */
+
+ /* delay (usec) between iterations */
+ int delay;
+
+ /* width and height of the window */
+ int windowWidth;
+ int windowHeight;
+
+ Visual *visual; /* the visual to use */
+ Colormap cmap; /* the colormap of the window */
+
+ GC theGC; /* GC for drawing */
+ unsigned long fg_pixel, grid_pixel;
+ Bool button_down_p;
+ int grid_alloced_p;
+ char *strings[200];
+
+ Barcode *barcodes; /* array of barcodes */
+ int barcode_count; /* how many barcodes are currently active */
+ int barcode_max; /* the maximum number of active barcodes */
+
+ XImage *theImage; /* ginormo image for drawing */
+ Bitmap *theBitmap; /* ginormo bitmap for drawing */
+
+ enum { BC_SCROLL, BC_GRID, BC_CLOCK12, BC_CLOCK24 } mode;
+
+ int grid_w;
+ int grid_h;
+};
+
+/* a bunch of words */
+static const char *words[] =
+{
+ "abdomen",
+ "abeyance",
+ "abhorrence",
+ "abrasion",
+ "abstraction",
+ "acid",
+ "addiction",
+ "alertness",
+ "Algeria",
+ "anxiety",
+ "aorta",
+ "argyle socks",
+ "attrition",
+ "axis of evil",
+ "bamboo",
+ "bangle",
+ "bankruptcy",
+ "baptism",
+ "beer",
+ "bellicosity",
+ "bells",
+ "belly",
+ "bliss",
+ "bogosity",
+ "boobies",
+ "boobs",
+ "booty",
+ "bread",
+ "bubba",
+ "burrito",
+ "California",
+ "capybara",
+ "cardinality",
+ "caribou",
+ "carnage",
+ "children",
+ "chocolate",
+ "CLONE",
+ "cock",
+ "constriction",
+ "contrition",
+ "cop",
+ "corpse",
+ "cowboy",
+ "crabapple",
+ "craziness",
+ "cthulhu",
+ "Death",
+ "decepticon",
+ "deception",
+ "Decker",
+ "decoder",
+ "decoy",
+ "defenestration",
+ "democracy",
+ "dependency",
+ "despair",
+ "desperation",
+ "disease",
+ "disease",
+ "doberman",
+ "DOOM",
+ "dreams",
+ "dreams",
+ "drugs",
+ "easy",
+ "ebony",
+ "election",
+ "eloquence",
+ "emergency",
+ "eureka",
+ "excommunication",
+ "fat",
+ "fatherland",
+ "Faust",
+ "fear",
+ "fever",
+ "filth",
+ "flatulence",
+ "fluff",
+ "fnord",
+ "freedom",
+ "fruit",
+ "fruit",
+ "futility",
+ "gerbils",
+ "GOD",
+ "goggles",
+ "goobers",
+ "gorilla",
+ "halibut",
+ "handmaid",
+ "happiness",
+ "hate",
+ "helplessness",
+ "hemorrhoid",
+ "hermaphrodite",
+ "heroin",
+ "heroine",
+ "hope",
+ "hysteria",
+ "icepick",
+ "identity",
+ "ignorance",
+ "importance",
+ "individuality",
+ "inkling",
+ "insurrection",
+ "intoxicant",
+ "ire",
+ "irritant",
+ "jade",
+ "jaundice",
+ "Joyce",
+ "kidney stone",
+ "kitchenette",
+ "kiwi",
+ "lathe",
+ "lattice",
+ "lawyer",
+ "lemming",
+ "liquidation",
+ "lobbyist",
+ "love",
+ "lozenge",
+ "magazine",
+ "magnesium",
+ "malfunction",
+ "marmot",
+ "marshmallow",
+ "merit",
+ "merkin",
+ "mescaline",
+ "milk",
+ "mischief",
+ "mistrust",
+ "money",
+ "monkey",
+ "monkeybutter",
+ "nationalism",
+ "nature",
+ "neuron",
+ "noise",
+ "nomenclature",
+ "nutria",
+ "OBEY",
+ "ocelot",
+ "offspring",
+ "overseer",
+ "pain",
+ "pajamas",
+ "passenger",
+ "passion",
+ "Passover",
+ "peace",
+ "penance",
+ "persimmon",
+ "petticoat",
+ "pharmacist",
+ "PhD",
+ "pitchfork",
+ "plague",
+ "Poindexter",
+ "politician",
+ "pony",
+ "presidency",
+ "prison",
+ "prophecy",
+ "Prozac",
+ "punishment",
+ "punk rock",
+ "punk",
+ "pussy",
+ "quagmire",
+ "quarantine",
+ "quartz",
+ "rabies",
+ "radish",
+ "rage",
+ "readout",
+ "reality",
+ "rectum",
+ "reject",
+ "rejection",
+ "respect",
+ "revolution",
+ "roadrunner",
+ "rule",
+ "savor",
+ "scab",
+ "scalar",
+ "Scandinavia",
+ "schadenfreude",
+ "security",
+ "sediment",
+ "self worth",
+ "sickness",
+ "silicone",
+ "slack",
+ "slander",
+ "slavery",
+ "sledgehammer",
+ "smegma",
+ "smelly socks",
+ "sorrow",
+ "space program",
+ "stamen",
+ "standardization",
+ "stench",
+ "subculture",
+ "subversion",
+ "suffering",
+ "surrender",
+ "surveillance",
+ "synthesis",
+ "television",
+ "tenant",
+ "tendril",
+ "terror",
+ "terrorism",
+ "terrorist",
+ "the impossible",
+ "the unknown",
+ "toast",
+ "topography",
+ "truism",
+ "turgid",
+ "underbrush",
+ "underling",
+ "unguent",
+ "unusual",
+ "uplink",
+ "urge",
+ "valor",
+ "variance",
+ "vaudeville",
+ "vector",
+ "vegetarian",
+ "venom",
+ "verifiability",
+ "viagra",
+ "vibrator",
+ "victim",
+ "vignette",
+ "villainy",
+ "W.A.S.T.E.",
+ "wagon",
+ "waiver",
+ "warehouse",
+ "waste",
+ "waveform",
+ "whiffle ball",
+ "whorl",
+ "windmill",
+ "words",
+ "worm",
+ "worship",
+ "worship",
+ "Xanax",
+ "Xerxes",
+ "Xhosa",
+ "xylophone",
+ "yellow",
+ "yesterday",
+ "your nose",
+ "Zanzibar",
+ "zeal",
+ "zebra",
+ "zest",
+ "zinc"
+};
+
+#define WORD_COUNT (sizeof(words) / sizeof(char *))
+
+
+
+/* ----------------------------------------------------------------------------
+ * bitmap manipulation
+ */
+
+/* construct a new bitmap */
+static Bitmap *makeBitmap (int width, int height)
+{
+ Bitmap *result = malloc (sizeof (Bitmap));
+ result->width = width;
+ result->height = height;
+ result->widthBytes = (width + 7) / 8;
+ result->buf = calloc (1, height * result->widthBytes);
+ return result;
+}
+
+/* clear a bitmap */
+static void bitmapClear (Bitmap *b)
+{
+ memset (b->buf, 0, b->widthBytes * b->height);
+}
+
+#if 0
+/* free a bitmap */
+static void bitmapFree (Bitmap *b)
+{
+ free (b->buf);
+ free (b);
+}
+#endif
+
+
+/* get the byte value at the given byte-offset coordinates in the given
+ * bitmap */
+static int bitmapGetByte (Bitmap *b, int xByte, int y)
+{
+ if ((xByte < 0) ||
+ (xByte >= b->widthBytes) ||
+ (y < 0) ||
+ (y >= b->height))
+ {
+ /* out-of-range get returns 0 */
+ return 0;
+ }
+
+ return b->buf[b->widthBytes * y + xByte];
+}
+
+/* get the bit value at the given coordinates in the given bitmap */
+static int bitmapGet (Bitmap *b, int x, int y)
+{
+ int xbyte = x >> 3;
+ int xbit = x & 0x7;
+ int byteValue = bitmapGetByte (b, xbyte, y);
+
+ return (byteValue & (1 << xbit)) >> xbit;
+}
+
+/* set the bit value at the given coordinates in the given bitmap */
+static void bitmapSet (Bitmap *b, int x, int y, int value)
+{
+ int xbyte = x >> 3;
+ int xbit = x & 0x7;
+
+ if ((x < 0) ||
+ (x >= b->width) ||
+ (y < 0) ||
+ (y >= b->height))
+ {
+ /* ignore out-of-range set */
+ return;
+ }
+
+ if (value)
+ {
+ b->buf[b->widthBytes * y + xbyte] |= 1 << xbit;
+ }
+ else
+ {
+ b->buf[b->widthBytes * y + xbyte] &= ~(1 << xbit);
+ }
+}
+
+/* copy the given rectangle to the given destination from the given source. */
+static void bitmapCopyRect (Bitmap *dest, int dx, int dy,
+ Bitmap *src, int sx, int sy, int width, int height)
+{
+ int x, y;
+
+ for (y = 0; y < height; y++)
+ {
+ for (x = 0; x < width; x++)
+ {
+ bitmapSet (dest, x + dx, y + dy, bitmapGet (src, x + sx, y + sy));
+ }
+ }
+}
+
+/* draw a vertical line in the given bitmap */
+static void bitmapVlin (Bitmap *b, int x, int y1, int y2)
+{
+ while (y1 <= y2)
+ {
+ bitmapSet (b, x, y1, 1);
+ y1++;
+ }
+}
+
+/* scale a bitmap into another bitmap */
+static void bitmapScale (Bitmap *dest, Bitmap *src, int mag)
+{
+ int x, y, x2, y2;
+
+ for (y = 0; y < BARCODE_HEIGHT; y++)
+ {
+ for (x = 0; x < BARCODE_WIDTH; x++)
+ {
+ int v = bitmapGet (src, x, y);
+ for (x2 = 0; x2 < mag; x2++)
+ {
+ for (y2 = 0; y2 < mag; y2++)
+ {
+ bitmapSet (dest, x * mag + x2, y * mag + y2, v);
+ }
+ }
+ }
+ }
+}
+
+
+/* ----------------------------------------------------------------------------
+ * character generation
+ */
+
+static unsigned char font5x8Buf[] =
+{
+ 0x1e, 0x01, 0x06, 0x01, 0x1e, 0x00, 0x1e, 0x01, 0x06, 0x01, 0x1e, 0x00,
+ 0x1e, 0x01, 0x1e, 0x01, 0x1e, 0x00, 0x01, 0x00, 0x1f, 0x08, 0x04, 0x08,
+ 0x1f, 0x00, 0x11, 0x1f, 0x11, 0x00, 0x1f, 0x01, 0x01, 0x00, 0x1f, 0x04,
+ 0x0a, 0x11, 0x00, 0x01, 0x00, 0x0e, 0x11, 0x11, 0x00, 0x0e, 0x11, 0x11,
+ 0x0e, 0x00, 0x1f, 0x08, 0x04, 0x08, 0x1f, 0x00, 0x44, 0x41, 0x4e, 0x20,
+ 0x42, 0x4f, 0x52, 0x4e, 0x53, 0x54, 0x45, 0x49, 0x4e, 0x21, 0x21, 0x00,
+ 0x66, 0x6e, 0x6f, 0x72, 0x64, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x05, 0x05, 0x05, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0x0f, 0x05, 0x0f, 0x05, 0x05, 0x00,
+ 0x02, 0x0f, 0x01, 0x0f, 0x08, 0x0f, 0x04, 0x00, 0x0b, 0x0b, 0x08, 0x06,
+ 0x01, 0x0d, 0x0d, 0x00, 0x03, 0x05, 0x02, 0x05, 0x0d, 0x05, 0x0b, 0x00,
+ 0x04, 0x04, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x02, 0x02,
+ 0x02, 0x02, 0x04, 0x00, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x02, 0x00,
+ 0x00, 0x09, 0x06, 0x0f, 0x06, 0x09, 0x00, 0x00, 0x00, 0x02, 0x02, 0x07,
+ 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0x08, 0x08, 0x04, 0x06, 0x02, 0x01, 0x01, 0x00,
+ 0x0f, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0f, 0x00, 0x06, 0x04, 0x04, 0x04,
+ 0x04, 0x04, 0x0f, 0x00, 0x0f, 0x09, 0x08, 0x0f, 0x01, 0x09, 0x0f, 0x00,
+ 0x0f, 0x08, 0x08, 0x0f, 0x08, 0x08, 0x0f, 0x00, 0x09, 0x09, 0x09, 0x0f,
+ 0x08, 0x08, 0x08, 0x00, 0x0f, 0x09, 0x01, 0x0f, 0x08, 0x09, 0x0f, 0x00,
+ 0x03, 0x01, 0x01, 0x0f, 0x09, 0x09, 0x0f, 0x00, 0x0f, 0x09, 0x09, 0x0c,
+ 0x04, 0x04, 0x04, 0x00, 0x0f, 0x09, 0x09, 0x0f, 0x09, 0x09, 0x0f, 0x00,
+ 0x0f, 0x09, 0x09, 0x0f, 0x08, 0x08, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x06, 0x00,
+ 0x08, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00, 0x0f, 0x00,
+ 0x0f, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x04, 0x02, 0x01, 0x00,
+ 0x0f, 0x09, 0x08, 0x0e, 0x02, 0x00, 0x02, 0x00, 0x0f, 0x09, 0x0d, 0x0d,
+ 0x0d, 0x01, 0x0f, 0x00, 0x0f, 0x09, 0x09, 0x0f, 0x09, 0x09, 0x09, 0x00,
+ 0x07, 0x09, 0x09, 0x07, 0x09, 0x09, 0x07, 0x00, 0x0f, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x0f, 0x00, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x07, 0x00,
+ 0x0f, 0x01, 0x01, 0x0f, 0x01, 0x01, 0x0f, 0x00, 0x0f, 0x01, 0x01, 0x0f,
+ 0x01, 0x01, 0x01, 0x00, 0x0f, 0x01, 0x01, 0x0d, 0x09, 0x09, 0x0f, 0x00,
+ 0x09, 0x09, 0x09, 0x0f, 0x09, 0x09, 0x09, 0x00, 0x07, 0x02, 0x02, 0x02,
+ 0x02, 0x02, 0x07, 0x00, 0x0e, 0x04, 0x04, 0x04, 0x04, 0x05, 0x07, 0x00,
+ 0x09, 0x09, 0x09, 0x07, 0x09, 0x09, 0x09, 0x00, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x0f, 0x00, 0x09, 0x0f, 0x0f, 0x0f, 0x09, 0x09, 0x09, 0x00,
+ 0x09, 0x0b, 0x0d, 0x09, 0x09, 0x09, 0x09, 0x00, 0x0f, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x0f, 0x00, 0x0f, 0x09, 0x09, 0x0f, 0x01, 0x01, 0x01, 0x00,
+ 0x0f, 0x09, 0x09, 0x09, 0x0b, 0x05, 0x0b, 0x00, 0x07, 0x09, 0x09, 0x07,
+ 0x09, 0x09, 0x09, 0x00, 0x0f, 0x01, 0x01, 0x0f, 0x08, 0x08, 0x0f, 0x00,
+ 0x0f, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x09, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x0f, 0x00, 0x09, 0x09, 0x09, 0x09, 0x09, 0x05, 0x02, 0x00,
+ 0x09, 0x09, 0x09, 0x09, 0x0f, 0x0f, 0x09, 0x00, 0x09, 0x09, 0x05, 0x06,
+ 0x0a, 0x09, 0x09, 0x00, 0x09, 0x09, 0x09, 0x0f, 0x08, 0x08, 0x0f, 0x00,
+ 0x0f, 0x08, 0x08, 0x06, 0x01, 0x01, 0x0f, 0x00, 0x0e, 0x02, 0x02, 0x02,
+ 0x02, 0x02, 0x0e, 0x00, 0x01, 0x01, 0x02, 0x06, 0x04, 0x08, 0x08, 0x00,
+ 0x07, 0x04, 0x04, 0x04, 0x04, 0x04, 0x07, 0x00, 0x02, 0x05, 0x05, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00,
+ 0x02, 0x02, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x08,
+ 0x0f, 0x09, 0x0f, 0x00, 0x01, 0x01, 0x0f, 0x09, 0x09, 0x09, 0x0f, 0x00,
+ 0x00, 0x00, 0x0f, 0x01, 0x01, 0x01, 0x0f, 0x00, 0x08, 0x08, 0x0f, 0x09,
+ 0x09, 0x09, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x09, 0x0f, 0x01, 0x0f, 0x00,
+ 0x0e, 0x02, 0x0f, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x0f, 0x09,
+ 0x09, 0x0f, 0x08, 0x0c, 0x01, 0x01, 0x0f, 0x09, 0x09, 0x09, 0x09, 0x00,
+ 0x02, 0x00, 0x03, 0x02, 0x02, 0x02, 0x07, 0x00, 0x04, 0x00, 0x04, 0x04,
+ 0x04, 0x04, 0x05, 0x07, 0x01, 0x01, 0x09, 0x05, 0x03, 0x05, 0x09, 0x00,
+ 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x07, 0x00, 0x00, 0x00, 0x09, 0x0f,
+ 0x0f, 0x09, 0x09, 0x00, 0x00, 0x00, 0x0f, 0x09, 0x09, 0x09, 0x09, 0x00,
+ 0x00, 0x00, 0x0f, 0x09, 0x09, 0x09, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x09,
+ 0x09, 0x0f, 0x01, 0x01, 0x00, 0x00, 0x0f, 0x09, 0x09, 0x0f, 0x08, 0x08,
+ 0x00, 0x00, 0x0f, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x01,
+ 0x0f, 0x08, 0x0f, 0x00, 0x00, 0x02, 0x0f, 0x02, 0x02, 0x02, 0x0e, 0x00,
+ 0x00, 0x00, 0x09, 0x09, 0x09, 0x09, 0x0f, 0x00, 0x00, 0x00, 0x09, 0x09,
+ 0x09, 0x05, 0x02, 0x00, 0x00, 0x00, 0x09, 0x09, 0x0f, 0x0f, 0x09, 0x00,
+ 0x00, 0x00, 0x09, 0x09, 0x06, 0x09, 0x09, 0x00, 0x00, 0x00, 0x09, 0x09,
+ 0x09, 0x0f, 0x08, 0x0c, 0x00, 0x00, 0x0f, 0x08, 0x06, 0x01, 0x0f, 0x00,
+ 0x08, 0x04, 0x04, 0x02, 0x04, 0x04, 0x08, 0x00, 0x02, 0x02, 0x02, 0x02,
+ 0x02, 0x02, 0x02, 0x00, 0x01, 0x02, 0x02, 0x04, 0x02, 0x02, 0x01, 0x00,
+ 0x00, 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x00
+};
+
+static Bitmap font5x8 = { 8, 1024, 1, (char *) font5x8Buf };
+
+/* draw the given 5x8 character at the given coordinates */
+static void bitmapDrawChar5x8 (Bitmap *b, int x, int y, char c)
+{
+ bitmapCopyRect (b, x, y, &font5x8, 0, c * 8, 5, 8);
+}
+
+/* draw a string of 5x8 characters at the given coordinates */
+static void bitmapDrawString5x8 (Bitmap *b, int x, int y, char *str)
+{
+ int origx = x;
+
+ while (*str != '\0')
+ {
+ char c = *str;
+ if (c == '\n')
+ {
+ x = origx;
+ y += 8;
+ }
+ else
+ {
+ if (c < ' ')
+ {
+ c = ' ';
+ }
+
+ bitmapDrawChar5x8 (b, x, y, c);
+ x += 5;
+ }
+ str++;
+ }
+}
+
+
+
+/* ----------------------------------------------------------------------------
+ * upc/ean symbologies
+ */
+
+/* A quick lesson in UPC and EAN barcodes:
+ *
+ * Each digit consists of 2 bars and 2 spaces, taking a total width of 7
+ * times the width of the thinnest possible bar or space. There are three
+ * different possible representations for each digit, used depending on
+ * what side of a two-sided barcode the digit is used on, and to encode
+ * checksum or other information in some cases. The three forms are
+ * related. Taking as the "base" form the pattern as seen on the right-hand
+ * side of a UPC-A barcode, the other forms are the inverse of the base
+ * (that is, bar becomes space and vice versa) and the mirror image of the
+ * base. Still confused? Here's a complete table, where 0 means space and 1
+ * means bar:
+ *
+ * Left-A Left-B Right
+ * ------- ------- -------
+ * 0 0001101 0100111 1110010
+ * 1 0011001 0110011 1100110
+ * 2 0010011 0011011 1101100
+ * 3 0111101 0100001 1000010
+ * 4 0100011 0011101 1011100
+ * 5 0110001 0111001 1001110
+ * 6 0101111 0000101 1010000
+ * 7 0111011 0010001 1000100
+ * 8 0110111 0001001 1001000
+ * 9 0001011 0010111 1110100
+ *
+ * A UPC-A barcode consists of 6 patterns from Left-A on the left-hand side,
+ * 6 patterns from Right on the right-hand side, a guard pattern of 01010
+ * in the middle, and a guard pattern of 101 on each end. The 12th digit
+ * checksum is calculated as follows: Take the 1st, 3rd, ... 11th digits,
+ * sum them and multiplying by 3, and add that to the sum of the other digits.
+ * Subtract the final digit from 10, and that is the checksum digit. (If
+ * the last digit of the sum is 0, then the check digit is 0.)
+ *
+ * An EAN-13 barcode is just like a UPC-A barcode, except that the characters
+ * on the left-hand side have a pattern of Left-A and Left-B that encodes
+ * an extra first digit. Note that an EAN-13 barcode with the first digit
+ * of 0 is exactly the same as the UPC-A barcode of the rightmost 12 digits.
+ * The patterns to encode the first digit are as follows:
+ *
+ * Left-Hand
+ * Digit Position
+ * 1 2 3 4 5 6
+ * - - - - - -
+ * 0 a a a a a a
+ * 1 a a b a b b
+ * 2 a a b b a b
+ * 3 a a b b b a
+ * 4 a b a a b b
+ * 5 a b b a a b
+ * 6 a b b b a a
+ * 7 a b a b a b
+ * 8 a b a b b a
+ * 9 a b b a b a
+ *
+ * The checksum for EAN-13 is just like UPC-A, except the 2nd, 4th, ... 12th
+ * digits are multiplied by 3 instead of the other way around.
+ *
+ * An EAN-8 barcode is just like a UPC-A barcode, except there are only 4
+ * digits in each half. Unlike EAN-13, there's no nonsense about different
+ * left-hand side patterns, either.
+ *
+ * A UPC-E barcode contains 6 explicit characters between a guard of 101
+ * on the left and 010101 on the right. The explicit characters are the
+ * middle six characters of the code. The first and last characters are
+ * encoded in the parity pattern of the six characters. There are two
+ * sets of parity patterns, one to use if the first digit of the number
+ * is 0, and another if it is 1. (UPC-E barcodes may only start with a 0
+ * or 1.) The patterns are as follows:
+ *
+ * First digit 0 First digit 1
+ * Explicit Digit Explicit Digit
+ * Position Position
+ * 1 2 3 4 5 6 1 2 3 4 5 6
+ * - - - - - - - - - - - -
+ * 0 b b b a a a a a a b b b
+ * 1 b b a b a a a a b a b b
+ * 2 b b a a b a a a b b a b
+ * 3 b b a a a b a a b b b a
+ * 4 b a b b a a a b a a b b
+ * 5 b a a b b a a b b a a b
+ * 6 b a a a b b a b b b a a
+ * 7 b a b a b a a b a b a b
+ * 8 b a b a a b a b a b b a
+ * 9 b a a b a b a b b a b a
+ *
+ * (Note that the two sets are the complements of each other. Also note
+ * that the first digit 1 patterns are mostly the same as the EAN-13
+ * first digit patterns.) The UPC-E check digit (the final digit encoded in
+ * the parity pattern) is the same as the UPC-A check digit for the
+ * expanded form of the UPC-E number. The expanstion is as follows, based
+ * on the last explicit digit (the second to last digit) in the encoded
+ * number:
+ *
+ * Corresponding
+ * UPC-E form UPC-A form
+ * ---------- -------------
+ * XABCDE0Y XAB00000CDEY
+ * XABCDE1Y XAB10000CDEY
+ * XABCDE2Y XAB20000CDEY
+ * XABCDE3Y XABC00000DEY
+ * XABCDE4Y XABCD00000EY
+ * XABCDE5Y XABCDE00005Y
+ * XABCDE6Y XABCDE00006Y
+ * XABCDE7Y XABCDE00007Y
+ * XABCDE8Y XABCDE00008Y
+ * XABCDE9Y XABCDE00009Y
+ *
+ * All UPC/EAN barcodes may have an additional 2- or 5-digit supplemental
+ * code just to the right of the main barcode. The supplement starts about
+ * one digit-length (that is about 7 times the width of the thinnest bar)
+ * to the right of the main code, beginning with the guard pattern 1011.
+ * After that comes each digit, with a guard pattern of 01 between each,
+ * but not at the end. The digits are encoded using the left A and B
+ * characters to encode a parity pattern.
+ *
+ * For 2-digit supplements, the parity pattern is determined by the
+ * lower two bits of the numeric value of the code (e.g., 42 would use
+ * pattern 2):
+ *
+ * Lower 2 bits Parity Pattern
+ * ------------ --------------
+ * 0 (bin 00) a a
+ * 1 (bin 01) a b
+ * 2 (bin 10) b a
+ * 3 (bin 11) b b
+ *
+ * For 5-digit supplements, the parity pattern is calculated in a similar
+ * manner to check digit calculation: The first, third, and fifth digits
+ * are summed and multiplied by 3; the second and fourth digits are summed
+ * and multiplied by nine; the parity digit is the sum of those two numbers,
+ * modulo 10. The parity pattern is then the last five patterns from the
+ * UPC-E final digit 0 table for the corresponding digit.
+ */
+
+/* enum to indicate which pattern set to use */
+typedef enum
+{
+ UPC_LEFT_A, UPC_LEFT_B, UPC_RIGHT
+}
+UpcSet;
+
+/* the Left A patterns */
+static unsigned int upcLeftA[] = {
+ 0x0d, 0x19, 0x13, 0x3d, 0x23, 0x31, 0x2f, 0x3b, 0x37, 0x0b
+};
+
+/* the Left B patterns */
+static unsigned int upcLeftB[] = {
+ 0x27, 0x33, 0x1b, 0x21, 0x1d, 0x39, 0x05, 0x11, 0x09, 0x17
+};
+
+/* the Right patterns */
+static unsigned int upcRight[] = {
+ 0x72, 0x66, 0x6c, 0x42, 0x5c, 0x4e, 0x50, 0x44, 0x48, 0x74
+};
+
+/* the EAN-13 first-digit patterns */
+static unsigned int ean13FirstDigit[] = {
+ 0x00, 0x0b, 0x0d, 0x0e, 0x13, 0x19, 0x1c, 0x15, 0x16, 0x1a
+};
+
+/* the UPC-E last-digit patterns for first digit 0 (complement for
+ * digit 1); also used for 5-digit supplemental check patterns */
+static unsigned int upcELastDigit[] = {
+ 0x38, 0x34, 0x32, 0x31, 0x2c, 0x26, 0x23, 0x2a, 0x29, 0x25
+};
+
+/* turn a character into an int representing its digit value; return
+ * 0 for things not in the range '0'-'9' */
+static int charToDigit (char c)
+{
+ if ((c >= '0') && (c <= '9'))
+ {
+ return c - '0';
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+/* draw the given digit character at the given coordinates; a '0' is
+ * used in place of any non-digit character */
+static void drawDigitChar (struct state *st, Bitmap *b, int x, int y, char c)
+{
+ if (st->mode != BC_CLOCK24 &&
+ st->mode != BC_CLOCK12)
+ if ((c < '0') || (c > '9'))
+ c = '0';
+
+ bitmapDrawChar5x8 (b, x, y, c);
+}
+
+/* draw a upc/ean digit at the given coordinates */
+static void drawUpcEanDigit (Bitmap *upcBitmap, int x, int y1, int y2, char n,
+ UpcSet set)
+{
+ unsigned int bits;
+ int i;
+
+ n = charToDigit (n);
+ switch (set)
+ {
+ case UPC_LEFT_A:
+ bits = upcLeftA[(int) n];
+ break;
+ case UPC_LEFT_B:
+ bits = upcLeftB[(int) n];
+ break;
+ default /* case UPC_RIGHT */:
+ bits = upcRight[(int) n];
+ break;
+ }
+
+ for (i = 6; i >=0; i--)
+ {
+ if (bits & (1 << i))
+ {
+ bitmapVlin (upcBitmap, x, y1, y2);
+ }
+ x++;
+ }
+}
+
+/* report the width of the given supplemental code or 0 if it is a bad
+ * supplement form */
+static int upcEanSupplementWidth (char *digits)
+{
+ switch (strlen (digits))
+ {
+ case 2: return 28; /* 8 + 4 + 2*7 + 1*2 */
+ case 5: return 55; /* 8 + 4 + 5*7 + 4*2 */
+ default: return 0;
+ }
+}
+
+/* draw the given supplemental barcode, including the textual digits */
+static void drawUpcEanSupplementalBars (struct state *st,
+ Bitmap *upcBitmap, char *digits,
+ int x, int y, int y2, int textAbove)
+{
+ int len = strlen (digits);
+ int i;
+ int parity;
+ int textY;
+ int textX;
+
+ if (textAbove)
+ {
+ textY = y;
+ y += 8;
+ }
+ else
+ {
+ y2 -= 8;
+ textY = y2 + 2;
+ }
+
+ x += 8; /* skip the space between the main and supplemental */
+
+ switch (len)
+ {
+ case 2:
+ {
+ textX = x + 5;
+ parity = (charToDigit (digits[0]) * 10 +
+ charToDigit (digits[1])) & 0x3;
+ break;
+ }
+ case 5:
+ {
+ textX = x + 10;
+ parity =
+ ((charToDigit (digits[0]) + charToDigit (digits[2]) +
+ charToDigit (digits[4])) * 3
+ + (charToDigit (digits[1]) + charToDigit (digits[3])) * 9)
+ % 10;
+ parity = upcELastDigit[parity];
+ break;
+ }
+ default:
+ {
+ fprintf (stderr, "%s: bad supplement (%d digits)\n",
+ progname, len);
+ exit(1);
+ break;
+ }
+ }
+
+ /* header */
+ bitmapVlin (upcBitmap, x, y, y2);
+ bitmapVlin (upcBitmap, x + 2, y, y2);
+ bitmapVlin (upcBitmap, x + 3, y, y2);
+
+ for (i = 0; i < len; i++)
+ {
+ UpcSet lset =
+ (parity & (1 << (len - 1 - i))) ? UPC_LEFT_B : UPC_LEFT_A;
+ int baseX = x + 2 + i * 9;
+
+ /* separator / end of header */
+ if (i == 0)
+ {
+ bitmapVlin (upcBitmap, baseX, y, y2);
+ }
+ bitmapVlin (upcBitmap, baseX + 1, y, y2);
+
+ drawUpcEanDigit (upcBitmap,
+ baseX + 2,
+ y,
+ y2,
+ digits[i],
+ lset);
+
+ drawDigitChar (st, upcBitmap, textX + i*6, textY, digits[i]);
+ }
+}
+
+/* draw the actual barcode part of a UPC-A barcode */
+static void drawUpcABars (Bitmap *upcBitmap, char *digits, int x, int y,
+ int barY2, int guardY2)
+{
+ int i;
+
+ /* header */
+ bitmapVlin (upcBitmap, x, y, guardY2);
+ bitmapVlin (upcBitmap, x + 2, y, guardY2);
+
+ /* center marker */
+ bitmapVlin (upcBitmap, x + 46, y, guardY2);
+ bitmapVlin (upcBitmap, x + 48, y, guardY2);
+
+ /* trailer */
+ bitmapVlin (upcBitmap, x + 92, y, guardY2);
+ bitmapVlin (upcBitmap, x + 94, y, guardY2);
+
+ for (i = 0; i < 6; i++)
+ {
+ drawUpcEanDigit (upcBitmap,
+ x + 3 + i*7,
+ y,
+ (i == 0) ? guardY2 : barY2,
+ digits[i],
+ UPC_LEFT_A);
+ drawUpcEanDigit (upcBitmap,
+ x + 50 + i*7,
+ y,
+ (i == 5) ? guardY2 : barY2,
+ digits[i+6],
+ UPC_RIGHT);
+ }
+}
+
+/* make and return a full-height UPC-A barcode */
+static int makeUpcAFull (struct state *st, Bitmap *dest, char *digits, int y)
+{
+ int baseWidth = 108;
+ int baseHeight = 60;
+
+ int height = baseHeight + y;
+ int i;
+
+ bitmapClear (dest);
+ drawUpcABars (dest, digits, 6, y, height - 10, height - 4);
+
+ drawDigitChar (st, dest, 0, height - 14, digits[0]);
+
+ for (i = 0; i < 5; i++)
+ {
+ drawDigitChar (st, dest, 18 + i*7, height - 7, digits[i+1]);
+ drawDigitChar (st, dest, 57 + i*7, height - 7, digits[i+6]);
+ }
+
+ drawDigitChar (st, dest, 103, height - 14, digits[11]);
+
+ return baseWidth;
+}
+
+/* make and return a UPC-A barcode */
+static int makeUpcA (struct state *st, Bitmap *dest, char *digits, int y)
+{
+ int i;
+ unsigned int mul = 3;
+ unsigned int sum = 0;
+
+ for (i = 0; i < 11; i++)
+ {
+ sum += charToDigit (digits[i]) * mul;
+ mul ^= 2;
+ }
+
+ if (digits[11] == '?')
+ {
+ digits[11] = ((10 - (sum % 10)) % 10) + '0';
+ }
+
+ return makeUpcAFull (st, dest, digits, y);
+}
+
+/* draw the actual barcode part of a UPC-E barcode */
+static void drawUpcEBars (struct state *st,
+ Bitmap *upcBitmap, char *digits, int x, int y,
+ int barY2, int guardY2)
+{
+ int i;
+ int parityPattern = upcELastDigit[charToDigit(digits[7])];
+
+ int clockp = (st->mode == BC_CLOCK12 || st->mode == BC_CLOCK24);
+
+ if (digits[0] == '1')
+ {
+ parityPattern = ~parityPattern;
+ }
+
+ /* header */
+ bitmapVlin (upcBitmap, x, y, guardY2);
+ bitmapVlin (upcBitmap, x + 2, y, guardY2);
+
+ /* trailer */
+ bitmapVlin (upcBitmap, x + 46 + (clockp?8:0), y, guardY2);
+ bitmapVlin (upcBitmap, x + 48 + (clockp?8:0), y, guardY2);
+ bitmapVlin (upcBitmap, x + 50 + (clockp?8:0), y, guardY2);
+
+ /* clock kludge -- this draws an extra set of dividers after
+ digits 2 and 4. This makes this *not* be a valid bar code,
+ but, it looks pretty for the clock dpy.
+ */
+ if (clockp)
+ {
+ bitmapVlin (upcBitmap, x + 18, y, guardY2);
+ bitmapVlin (upcBitmap, x + 18 + 2, y, guardY2);
+
+ bitmapVlin (upcBitmap, x + 36, y, guardY2);
+ bitmapVlin (upcBitmap, x + 36 + 2, y, guardY2);
+ }
+
+ for (i = 0; i < 6; i++)
+ {
+ UpcSet lset =
+ (parityPattern & (1 << (5 - i))) ? UPC_LEFT_B : UPC_LEFT_A;
+ int off = (clockp
+ ? (i < 2 ? 0 :
+ i < 4 ? 4 : /* extra spacing for clock bars */
+ 8)
+ : 0);
+ drawUpcEanDigit (upcBitmap,
+ x + 3 + i*7 + off,
+ y,
+ barY2,
+ digits[i + 1],
+ lset);
+ }
+}
+
+/* make and return a full-height UPC-E barcode */
+static int makeUpcEFull (struct state *st, Bitmap *dest, char *digits, int y)
+{
+ int baseWidth = 64;
+ int baseHeight = 60;
+
+ int height = baseHeight + y;
+ int i;
+
+ bitmapClear (dest);
+ drawUpcEBars (st, dest, digits, 6, y, height - 10, height - 4);
+
+ drawDigitChar (st, dest, 0, height - 14, digits[0]);
+
+ for (i = 0; i < 6; i++)
+ {
+ drawDigitChar (st, dest, 11 + i*7, height - 7, digits[i+1]);
+ }
+
+ drawDigitChar (st, dest, 59, height - 14, digits[7]);
+
+ return baseWidth;
+}
+
+/* expand 8 UPC-E digits into a UPC-A number, storing into the given result
+ * array, or just store '\0' into the first element, if the form factor
+ * is incorrect; this will also calculate the check digit, if it is
+ * specified as '?' */
+static void expandToUpcADigits (char *compressed, char *expanded)
+{
+ int i;
+
+ if ((compressed[0] != '0') && (compressed[0] != '1'))
+ {
+ return;
+ }
+
+ expanded[0] = compressed[0];
+ expanded[6] = '0';
+ expanded[7] = '0';
+ expanded[11] = compressed[7];
+
+ switch (compressed[6])
+ {
+ case '0':
+ case '1':
+ case '2':
+ {
+ expanded[1] = compressed[1];
+ expanded[2] = compressed[2];
+ expanded[3] = compressed[6];
+ expanded[4] = '0';
+ expanded[5] = '0';
+ expanded[8] = compressed[3];
+ expanded[9] = compressed[4];
+ expanded[10] = compressed[5];
+ break;
+ }
+ case '3':
+ {
+ expanded[1] = compressed[1];
+ expanded[2] = compressed[2];
+ expanded[3] = compressed[3];
+ expanded[4] = '0';
+ expanded[5] = '0';
+ expanded[8] = '0';
+ expanded[9] = compressed[4];
+ expanded[10] = compressed[5];
+ break;
+ }
+ case '4':
+ {
+ expanded[1] = compressed[1];
+ expanded[2] = compressed[2];
+ expanded[3] = compressed[3];
+ expanded[4] = compressed[4];
+ expanded[5] = '0';
+ expanded[8] = '0';
+ expanded[9] = '0';
+ expanded[10] = compressed[5];
+ break;
+ }
+ default:
+ {
+ expanded[1] = compressed[1];
+ expanded[2] = compressed[2];
+ expanded[3] = compressed[3];
+ expanded[4] = compressed[4];
+ expanded[5] = compressed[5];
+ expanded[8] = '0';
+ expanded[9] = '0';
+ expanded[10] = compressed[6];
+ break;
+ }
+ }
+
+ if (expanded[11] == '?')
+ {
+ unsigned int mul = 3;
+ unsigned int sum = 0;
+
+ for (i = 0; i < 11; i++)
+ {
+ sum += charToDigit (expanded[i]) * mul;
+ mul ^= 2;
+ }
+
+ expanded[11] = ((10 - (sum % 10)) % 10) + '0';
+ }
+}
+
+/* make and return a UPC-E barcode */
+static int makeUpcE (struct state *st, Bitmap *dest, char *digits, int y)
+{
+ char expandedDigits[13];
+ char compressedDigits[9];
+
+ expandedDigits[0] = '\0';
+ compressedDigits[0] = '0';
+ strcpy (compressedDigits + 1, digits);
+
+ expandToUpcADigits (compressedDigits, expandedDigits);
+ if (expandedDigits[0] == '\0')
+ {
+ return 0;
+ }
+
+ compressedDigits[7] = expandedDigits[11];
+
+ return makeUpcEFull (st, dest, compressedDigits, y);
+}
+
+/* draw the actual barcode part of a EAN-13 barcode */
+static void drawEan13Bars (Bitmap *upcBitmap, char *digits, int x, int y,
+ int barY2, int guardY2)
+{
+ int i;
+ int leftPattern = ean13FirstDigit[charToDigit (digits[0])];
+
+ /* header */
+ bitmapVlin (upcBitmap, x, y, guardY2);
+ bitmapVlin (upcBitmap, x + 2, y, guardY2);
+
+ /* center marker */
+ bitmapVlin (upcBitmap, x + 46, y, guardY2);
+ bitmapVlin (upcBitmap, x + 48, y, guardY2);
+
+ /* trailer */
+ bitmapVlin (upcBitmap, x + 92, y, guardY2);
+ bitmapVlin (upcBitmap, x + 94, y, guardY2);
+
+ for (i = 0; i < 6; i++)
+ {
+ UpcSet lset = (leftPattern & (1 << (5 - i))) ? UPC_LEFT_B : UPC_LEFT_A;
+
+ drawUpcEanDigit (upcBitmap,
+ x + 3 + i*7,
+ y,
+ barY2,
+ digits[i+1],
+ lset);
+ drawUpcEanDigit (upcBitmap,
+ x + 50 + i*7,
+ y,
+ barY2,
+ digits[i+7],
+ UPC_RIGHT);
+ }
+}
+
+/* make and return a full-height EAN-13 barcode */
+static int makeEan13Full (struct state *st, Bitmap *dest, char *digits, int y)
+{
+ int baseWidth = 102;
+ int baseHeight = 60;
+
+ int height = baseHeight + y;
+ int i;
+
+ bitmapClear (dest);
+ drawEan13Bars (dest, digits, 6, y, height - 10, height - 4);
+
+ drawDigitChar (st, dest, 0, height - 7, digits[0]);
+
+ for (i = 0; i < 6; i++)
+ {
+ drawDigitChar (st, dest, 11 + i*7, height - 7, digits[i+1]);
+ drawDigitChar (st, dest, 57 + i*7, height - 7, digits[i+7]);
+ }
+
+ return baseWidth;
+}
+
+/* make and return an EAN-13 barcode */
+static int makeEan13 (struct state *st, Bitmap *dest, char *digits, int y)
+{
+ int i;
+ unsigned int mul = 1;
+ unsigned int sum = 0;
+
+ for (i = 0; i < 12; i++)
+ {
+ sum += charToDigit (digits[i]) * mul;
+ mul ^= 2;
+ }
+
+ if (digits[12] == '?')
+ {
+ digits[12] = ((10 - (sum % 10)) % 10) + '0';
+ }
+
+ return makeEan13Full (st, dest, digits, y);
+}
+
+/* draw the actual barcode part of an EAN-8 barcode */
+static void drawEan8Bars (Bitmap *upcBitmap, char *digits, int x, int y,
+ int barY2, int guardY2)
+{
+ int i;
+
+ /* header */
+ bitmapVlin (upcBitmap, x, y, guardY2);
+ bitmapVlin (upcBitmap, x + 2, y, guardY2);
+
+ /* center marker */
+ bitmapVlin (upcBitmap, x + 32, y, guardY2);
+ bitmapVlin (upcBitmap, x + 34, y, guardY2);
+
+ /* trailer */
+ bitmapVlin (upcBitmap, x + 64, y, guardY2);
+ bitmapVlin (upcBitmap, x + 66, y, guardY2);
+
+ for (i = 0; i < 4; i++)
+ {
+ drawUpcEanDigit (upcBitmap,
+ x + 3 + i*7,
+ y,
+ barY2,
+ digits[i],
+ UPC_LEFT_A);
+ drawUpcEanDigit (upcBitmap,
+ x + 36 + i*7,
+ y,
+ barY2,
+ digits[i+4],
+ UPC_RIGHT);
+ }
+}
+
+/* make and return a full-height EAN-8 barcode */
+static int makeEan8Full (struct state *st, Bitmap *dest, char *digits, int y)
+{
+ int baseWidth = 68;
+ int baseHeight = 60;
+
+ int height = baseHeight + y;
+ int i;
+
+ bitmapClear (dest);
+ drawEan8Bars (dest, digits, 0, y, height - 10, height - 4);
+
+ for (i = 0; i < 4; i++)
+ {
+ drawDigitChar (st, dest, 5 + i*7, height - 7, digits[i]);
+ drawDigitChar (st, dest, 37 + i*7, height - 7, digits[i+4]);
+ }
+
+ return baseWidth;
+}
+
+/* make and return an EAN-8 barcode */
+static int makeEan8 (struct state *st, Bitmap *dest, char *digits, int y)
+{
+ int i;
+ unsigned int mul = 3;
+ unsigned int sum = 0;
+
+ for (i = 0; i < 7; i++)
+ {
+ sum += charToDigit (digits[i]) * mul;
+ mul ^= 2;
+ }
+
+ if (digits[7] == '?')
+ {
+ digits[7] = ((10 - (sum % 10)) % 10) + '0';
+ }
+
+ return makeEan8Full (st, dest, digits, y);
+}
+
+/* Dispatch to the right form factor UPC/EAN barcode generator */
+static void processUpcEan (struct state *st, char *str, Bitmap *dest)
+{
+ char digits[16];
+ int digitCount = 0;
+ char supDigits[8];
+ int supDigitCount = 0;
+ char *instr = str;
+ char *banner = NULL;
+ int supplement = 0;
+ int vstart = 9;
+ int width = 0;
+
+ while ((digitCount < 15) && (supDigitCount < 7))
+ {
+ char c = *instr;
+ if (((c >= '0') && (c <= '9')) || (c == '?'))
+ {
+ if (supplement)
+ {
+ supDigits[supDigitCount] = *instr;
+ supDigitCount++;
+ }
+ else
+ {
+ digits[digitCount] = *instr;
+ digitCount++;
+ }
+ }
+ else if (c == ',')
+ {
+ supplement = 1;
+ }
+ else if (c == ':')
+ {
+ banner = instr + 1;
+ break;
+ }
+ else if (c == '\0')
+ {
+ break;
+ }
+ instr++;
+ }
+
+ digits[digitCount] = '\0';
+ supDigits[supDigitCount] = '\0';
+
+ if (supDigitCount == 0)
+ {
+ supplement = 0;
+ }
+ else if ((supDigitCount == 2) || (supDigitCount == 5))
+ {
+ supplement = upcEanSupplementWidth (supDigits);
+ }
+ else
+ {
+ fprintf (stderr, "%s: invalid supplement (must be 2 or 5 digits)\n",
+ progname);
+ exit (1);
+ }
+
+ if (banner == NULL)
+ {
+ banner = "barcode";
+ }
+
+ switch (digitCount)
+ {
+ case 7:
+ {
+ width = makeUpcE (st, dest, digits, vstart);
+ break;
+ }
+ case 8:
+ {
+ width = makeEan8 (st, dest, digits, vstart);
+ break;
+ }
+ case 12:
+ {
+ width = makeUpcA (st, dest, digits, vstart);
+ break;
+ }
+ case 13:
+ {
+ width = makeEan13 (st, dest, digits, vstart);
+ break;
+ }
+ default:
+ {
+ fprintf (stderr, "%s: bad barcode (%d digits)\n",
+ progname, digitCount);
+ exit(1);
+ }
+ }
+
+ if (supplement)
+ {
+ drawUpcEanSupplementalBars (st, dest, supDigits,
+ width,
+ vstart + 1, dest->height - 4, 1);
+ }
+
+ if (banner != NULL)
+ {
+ bitmapDrawString5x8 (dest,
+ (width + supplement -
+ ((int) strlen (banner) * 5)) / 2,
+ 0,
+ banner);
+ }
+}
+
+
+
+/* ----------------------------------------------------------------------------
+ * the screenhack
+ */
+
+/*
+ * overall setup stuff
+ */
+
+/* set up the system */
+static void setup (struct state *st)
+{
+ XWindowAttributes xgwa;
+ XGCValues gcv;
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+
+ st->visual = xgwa.visual;
+ st->cmap = xgwa.colormap;
+ st->windowWidth = xgwa.width;
+ st->windowHeight = xgwa.height;
+
+ gcv.background = get_pixel_resource (st->dpy, xgwa.colormap,
+ "background", "Background");
+ gcv.foreground = get_pixel_resource (st->dpy, xgwa.colormap,
+ "foreground", "Foreground");
+ st->fg_pixel = gcv.foreground;
+ st->theGC = XCreateGC (st->dpy, st->window, GCForeground|GCBackground, &gcv);
+
+ st->theBitmap = makeBitmap(BARCODE_WIDTH * MAX_MAG, BARCODE_HEIGHT * MAX_MAG);
+ st->theImage = XCreateImage(st->dpy, st->visual, 1, XYBitmap, 0, st->theBitmap->buf,
+ st->theBitmap->width, st->theBitmap->height, 8,
+ st->theBitmap->widthBytes);
+ st->theImage->bitmap_bit_order = LSBFirst;
+ st->theImage->byte_order = LSBFirst;
+}
+
+
+
+/*
+ * the simulation
+ */
+
+/* set up the model */
+static void setupModel (struct state *st)
+{
+ int i;
+
+ st->barcode_max = 20;
+ st->barcode_count = 0;
+ st->barcodes = malloc (sizeof (Barcode) * st->barcode_max);
+
+ for (i = 0; i < st->barcode_max; i++)
+ {
+ st->barcodes[i].bitmap = makeBitmap(BARCODE_WIDTH * MAX_MAG,
+ BARCODE_HEIGHT * MAX_MAG);
+ }
+}
+
+/* make a new barcode string */
+static void makeBarcodeString (struct state *st, char *str)
+{
+ int dig, i;
+
+ switch ((int) (RAND_FLOAT_01 * 4))
+ {
+ case 0: dig = 6; break;
+ case 1: dig = 7; break;
+ case 2: dig = 11; break;
+ default: dig = 12; break;
+ }
+
+ for (i = 0; i < dig; i++)
+ {
+ str[i] = RAND_FLOAT_01 * 10 + '0';
+ }
+
+ str[i] = '?';
+ i++;
+
+ switch ((int) (RAND_FLOAT_01 * 3))
+ {
+ case 0: dig = 0; break;
+ case 1: dig = 2; break;
+ default: dig = 5; break;
+ }
+
+ if (dig != 0)
+ {
+ str[i] = ',';
+ i++;
+ while (dig > 0)
+ {
+ str[i] = RAND_FLOAT_01 * 10 + '0';
+ i++;
+ dig--;
+ }
+ }
+
+ str[i] = ':';
+ i++;
+
+ strcpy(&str[i], words[(int) (RAND_FLOAT_01 * WORD_COUNT)]);
+}
+
+/* update the model for one iteration */
+static void scrollModel (struct state *st)
+{
+ int i;
+
+ for (i = 0; i < st->barcode_count; i++)
+ {
+ Barcode *b = &st->barcodes[i];
+ b->x--;
+ if ((b->x + BARCODE_WIDTH * b->mag) < 0)
+ {
+ /* fell off the edge */
+ if (i != (st->barcode_count - 1)) {
+ Bitmap *oldb = b->bitmap;
+ memmove (b, b + 1, (st->barcode_count - i - 1) * sizeof (Barcode));
+ st->barcodes[st->barcode_count - 1].bitmap = oldb;
+
+ XFreeColors (st->dpy, st->cmap, &b->pixel, 1, 0);
+ }
+
+ i--;
+ st->barcode_count--;
+ }
+ }
+
+ while (st->barcode_count < st->barcode_max)
+ {
+ Barcode *barcode = &st->barcodes[st->barcode_count];
+ barcode->x = (st->barcode_count == 0) ?
+ 0 :
+ (st->barcodes[st->barcode_count - 1].x +
+ st->barcodes[st->barcode_count - 1].mag * BARCODE_WIDTH);
+ barcode->x += RAND_FLOAT_01 * 100;
+ barcode->mag = RAND_FLOAT_01 * MAX_MAG;
+
+ if (st->windowWidth < 100 || st->windowHeight < 100) {
+ barcode->mag *= 0.5;
+ if (barcode->mag <= 0) barcode->mag = 1;
+ }
+
+ barcode->y =
+ RAND_FLOAT_01 * (st->windowHeight - BARCODE_HEIGHT * barcode->mag);
+ if (barcode->y < 0)
+ {
+ barcode->y = 0;
+ }
+ makeBarcodeString(st, barcode->code);
+ processUpcEan (st, barcode->code, st->theBitmap);
+ bitmapScale (barcode->bitmap, st->theBitmap, barcode->mag);
+
+ {
+ XColor c;
+ int ii, ok = 0;
+ for (ii = 0; ii < 100; ii++)
+ {
+ hsv_to_rgb (random() % 360, 1.0, 1.0, &c.red, &c.green, &c.blue);
+ ok = XAllocColor (st->dpy, st->cmap, &c);
+ if (ok) break;
+ }
+ if (!ok)
+ {
+ c.red = c.green = c.blue = 0xFFFF;
+ if (!XAllocColor (st->dpy, st->cmap, &c))
+ abort();
+ }
+ barcode->pixel = c.pixel;
+ }
+
+ st->barcode_count++;
+ }
+}
+
+/* update the model for one iteration */
+static void updateGrid (struct state *st)
+{
+ int i, x, y;
+
+ if (st->grid_w == 0 || st->grid_h == 0 ||
+ (! (random() % 400)))
+ {
+ XClearWindow (st->dpy, st->window);
+ st->grid_w = 1 + (random() % 3);
+ st->grid_h = 1 + (random() % 4);
+ }
+
+ if (!st->grid_alloced_p || (! (random() % 100)))
+ {
+ XColor c;
+ hsv_to_rgb (random() % 360, 1.0, 1.0, &c.red, &c.green, &c.blue);
+ if (st->grid_alloced_p)
+ XFreeColors (st->dpy, st->cmap, &st->grid_pixel, 1, 0);
+ XAllocColor (st->dpy, st->cmap, &c);
+ st->grid_pixel = c.pixel;
+ st->grid_alloced_p = 1;
+ }
+
+ st->barcode_count = st->grid_w * st->grid_h;
+ if (st->barcode_count > st->barcode_max) abort();
+
+ for (i = 0; i < st->barcode_max; i++)
+ {
+ Barcode *b = &st->barcodes[i];
+ b->x = b->y = 999999;
+ }
+
+ i = 0;
+ for (y = 0; y < st->grid_h; y++)
+ for (x = 0; x < st->grid_w; x++, i++)
+ {
+ Barcode *b = &st->barcodes[i];
+ int digits = 12;
+
+ int cell_w = (st->windowWidth / st->grid_w);
+ int cell_h = (st->windowHeight / st->grid_h);
+ int mag_x = cell_w / BARCODE_WIDTH;
+ int mag_y = cell_h / BARCODE_HEIGHT;
+ int BW = 108 /*BARCODE_WIDTH*/;
+ int BH = BARCODE_HEIGHT;
+
+ b->mag = (mag_x < mag_y ? mag_x : mag_y);
+
+ b->x = (x * cell_w) + ((cell_w - b->mag * BW) / 2);
+ b->y = (y * cell_h) + ((cell_h - b->mag * BH) / 2);
+ b->pixel = st->grid_pixel;
+
+ if (!st->strings[i])
+ {
+ int j;
+ char *s = malloc (digits + 10);
+ st->strings[i] = s;
+ for (j = 0; j < digits; j++)
+ s[j] = (random() % 10) + '0';
+ s[j++] = '?';
+ s[j++] = ':';
+ s[j] = 0;
+ }
+
+ /* change one digit in this barcode */
+ st->strings[i][random() % digits] = (random() % 10) + '0';
+
+ strcpy (b->code, st->strings[i]);
+ processUpcEan (st, b->code, b->bitmap);
+ }
+}
+
+
+/* update the model for one iteration.
+ This one draws a clock. By jwz. */
+static void updateClock (struct state *st)
+{
+ Barcode *b = &st->barcodes[0];
+ int BW = 76 /* BARCODE_WIDTH */;
+ int BH = BARCODE_HEIGHT;
+ int mag_x, mag_y;
+ int i;
+ time_t now = time ((time_t *) 0);
+ struct tm *tm = localtime (&now);
+ XWindowAttributes xgwa;
+ int ow = st->windowWidth;
+ int oh = st->windowHeight;
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->windowWidth = xgwa.width;
+ st->windowHeight = xgwa.height;
+
+ mag_x = st->windowWidth / BW;
+ mag_y = st->windowHeight / BH;
+
+ st->barcode_count = 1;
+
+ b->mag = (mag_x < mag_y ? mag_x : mag_y);
+
+ if (b->mag > MAX_MAG) b->mag = MAX_MAG;
+ if (b->mag < 1) b->mag = 1;
+
+ b->x = (st->windowWidth - (b->mag * BW )) / 2;
+ b->y = (st->windowHeight - (b->mag * (BH + 9))) / 2;
+ b->pixel = st->fg_pixel;
+
+ if (!st->button_down_p)
+ sprintf (b->code, "0%02d%02d%02d?:",
+ (st->mode == BC_CLOCK24
+ ? tm->tm_hour
+ : (tm->tm_hour > 12
+ ? tm->tm_hour - 12
+ : (tm->tm_hour == 0
+ ? 12
+ : tm->tm_hour))),
+ tm->tm_min,
+ tm->tm_sec);
+ else
+ sprintf (b->code, "0%02d%02d%02d?:",
+ tm->tm_year % 100, tm->tm_mon+1, tm->tm_mday);
+
+ {
+ int vstart = 9;
+ int hh = BH + vstart;
+ char expandedDigits[13];
+
+ expandedDigits[0] = '\0';
+
+ expandToUpcADigits (b->code, expandedDigits);
+ if (expandedDigits[0] != '\0')
+ b->code[7] = expandedDigits[11];
+
+ bitmapClear (st->theBitmap);
+ drawUpcEBars (st, st->theBitmap, b->code, 6, 9, 59, 65);
+ for (i = 0; i < 6; i++)
+ {
+ int off = (i < 2 ? 0 :
+ i < 4 ? 4 :
+ 8);
+ drawDigitChar (st, st->theBitmap, 11 + i*7 + off, hh - 16, b->code[i+1]);
+ }
+
+ if (!st->button_down_p)
+ {
+#if 0
+ char *days[] = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };
+ char *s = days[tm->tm_wday];
+ bitmapDrawString5x8 (st->theBitmap, (BW - strlen (s)*5) / 2, 0, s);
+#endif
+ drawDigitChar (st, st->theBitmap, 0, hh - 23, (tm->tm_hour < 12 ? 'A' : 'P'));
+ drawDigitChar (st, st->theBitmap, 68, hh - 23, 'M');
+ }
+ else
+ {
+ char s[20];
+ sprintf (s, "%03d", tm->tm_yday);
+ bitmapDrawString5x8 (st->theBitmap, (BW - strlen (s)*5) / 2, 0, s);
+ }
+ }
+
+ bitmapScale (b->bitmap, st->theBitmap, b->mag);
+
+ if (ow != st->windowWidth || oh != st->windowHeight)
+ XClearWindow (st->dpy, st->window);
+}
+
+
+
+/* render and dpy the current model */
+static void renderFrame (struct state *st)
+{
+ int i;
+
+ for (i = 0; i < st->barcode_count; i++)
+ {
+ Barcode *barcode = &st->barcodes[i];
+
+ if (barcode->x > st->windowWidth) {
+ break;
+ }
+
+ /* bitmapScale (st->theBitmap, barcode->bitmap, barcode->mag);*/
+ st->theImage->data = barcode->bitmap->buf;
+
+ XSetForeground (st->dpy, st->theGC, barcode->pixel);
+ XPutImage (st->dpy, st->window, st->theGC, st->theImage,
+ 0, 0, barcode->x, barcode->y,
+ BARCODE_WIDTH * barcode->mag,
+ BARCODE_HEIGHT * barcode->mag);
+ }
+}
+
+/* do one iteration */
+static unsigned long
+barcode_draw (Display *dpy, Window win, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ if (st->mode == BC_SCROLL)
+ scrollModel (st);
+ else if (st->mode == BC_GRID)
+ updateGrid (st);
+ else if (st->mode == BC_CLOCK12 || st->mode == BC_CLOCK24)
+ updateClock (st);
+ else
+ abort();
+
+ renderFrame (st);
+
+ return st->delay;
+}
+
+
+static Bool
+barcode_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ int clockp = (st->mode == BC_CLOCK12 || st->mode == BC_CLOCK24);
+ if (clockp && event->xany.type == ButtonPress) {
+ st->button_down_p = True;
+ return True;
+ } else if (clockp && event->xany.type == ButtonRelease) {
+ st->button_down_p = False;
+ return True;
+ } else
+ return False;
+}
+
+static void
+barcode_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->windowWidth = w;
+ st->windowHeight = h;
+}
+
+static void
+barcode_free (Display *dpy, Window window, void *closure)
+{
+}
+
+
+/* main and options and stuff */
+
+static const char *barcode_defaults [] = {
+ ".background: black",
+ ".foreground: green",
+ ".lowrez: true",
+ "*fpsSolid: true",
+ "*delay: 10000",
+ "*mode: scroll",
+ 0
+};
+
+static XrmOptionDescRec barcode_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-scroll", ".mode", XrmoptionNoArg, "scroll" },
+ { "-grid", ".mode", XrmoptionNoArg, "grid" },
+ { "-clock", ".mode", XrmoptionNoArg, "clock" },
+ { "-clock12", ".mode", XrmoptionNoArg, "clock12" },
+ { "-clock24", ".mode", XrmoptionNoArg, "clock24" },
+ { 0, 0, 0, 0 }
+};
+
+/* initialize the user-specifiable params */
+static void initParams (struct state *st)
+{
+ int problems = 0;
+ char *s;
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Delay");
+ if (st->delay < 0)
+ {
+ fprintf (stderr, "%s: delay must be at least 0\n", progname);
+ problems = 1;
+ }
+
+ s = get_string_resource (st->dpy, "mode", "Mode");
+ if (!s || !*s || !strcasecmp (s, "scroll"))
+ st->mode = BC_SCROLL;
+ else if (!strcasecmp (s, "grid"))
+ st->mode = BC_GRID;
+ else if (!strcasecmp (s, "clock") ||
+ !strcasecmp (s, "clock12"))
+ st->mode = BC_CLOCK12;
+ else if (!strcasecmp (s, "clock24"))
+ st->mode = BC_CLOCK24;
+ else
+ {
+ fprintf (stderr, "%s: unknown mode \"%s\"\n", progname, s);
+ problems = 1;
+ }
+ free (s);
+
+ if (st->mode == BC_CLOCK12 || st->mode == BC_CLOCK24)
+ st->delay = 10000; /* only update every 1/10th second */
+
+ if (problems)
+ {
+ exit (1);
+ }
+}
+
+static void *
+barcode_init (Display *dpy, Window win)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ st->dpy = dpy;
+ st->window = win;
+
+ initParams (st);
+ setup (st);
+ setupModel (st);
+ return st;
+}
+
+
+XSCREENSAVER_MODULE ("Barcode", barcode)
diff --git a/hacks/barcode.man b/hacks/barcode.man
new file mode 100644
index 0000000..9074e16
--- /dev/null
+++ b/hacks/barcode.man
@@ -0,0 +1,61 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+barcode - draws a random sequence of barcodes for the products you enjoy
+.SH SYNOPSIS
+.B barcode
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-clock]
+[\-clock24]
+[\-fps]
+.SH DESCRIPTION
+This draws a random sequence of colorful barcodes scrolling across your
+screen.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.02 seconds.).
+.TP 8
+.B \-clock
+Instead of drawing a stream of barcodes, draw a barcode-based digital clock.
+.TP 8
+.B \-clock24
+Same as \fI\-clock\fP, but display 24-hour time instead of 12-hour time.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Dan Bornstein. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Dan Bornstein <danfuzz@milk.com>
diff --git a/hacks/binaryring.c b/hacks/binaryring.c
new file mode 100644
index 0000000..3cbaec2
--- /dev/null
+++ b/hacks/binaryring.c
@@ -0,0 +1,587 @@
+/*
+ * Binary Ring
+ * Copyright (c) 2006-2014 Emilio Del Tessandoro <emilio.deltessa@gmail.com>
+ *
+ * Directly ported code from complexification.net Binary Ring art
+ * http://www.complexification.net/gallery/machines/binaryRing/appletm/BinaryRing_m.pde
+ *
+ * Binary Ring code:
+ * j.tarbell June, 2004
+ * Albuquerque, New Mexico
+ * complexification.net
+ *
+ * Directly based the hacks of:
+ *
+ * xscreensaver, Copyright (c) 1997, 1998, 2002 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include "screenhack.h"
+#include "colors.h"
+#include "hsv.h"
+
+#define ANTIALIAS 1
+#define BLACK 0
+#define WHITE 1
+
+#define swap(a, b) do { __typeof__(a) tmp; tmp = a; a = b; b = tmp; } while(0)
+#define frand1() ((((int) random() ) << 1) * 4.65661287524579692411E-10)
+#define min(a,b) ((a)<(b)?(a):(b))
+#define max(a,b) ((a)>(b)?(a):(b))
+
+/* better if signed */
+typedef unsigned long pixel_t;
+
+
+typedef struct {
+ float x, y;
+ float xx, yy;
+ float vx, vy;
+ float color;
+ int age; /* age from 0 to ageMax */
+} particle_t;
+
+
+struct state {
+ int epoch;
+ int growth_delay;
+ int ring_radius;
+ int max_age;
+ float curliness;
+ int particles_number;
+ particle_t* particles;
+
+
+ Display *display; /* variables for the X stuff */
+ Window window;
+ GC gc;
+ XGCValues gcv;
+ Visual* visual;
+ int depth;
+
+ int width;
+ int height;
+
+ Pixmap pix; /* for reshape */
+ XImage* buf; /* buffer */
+ pixel_t* buffer;
+ pixel_t colors[2];
+
+ Bool color;
+};
+
+
+
+static void point2rgb(int depth, pixel_t c, int *r, int *g, int *b)
+{
+ switch(depth) {
+ case 32:
+ case 24:
+#ifdef HAVE_JWXYZ
+ /* This program idiotically does not go through a color map, so
+ we have to hardcode in knowledge of how jwxyz.a packs pixels!
+ Fix it to go through st->colors[st->ncolors] instead!
+ */
+ *r = (c & 0x00ff0000) >> 16;
+ *g = (c & 0x0000ffff) >> 8;
+ *b = (c & 0x000000ff);
+#else
+ *g = (c & 0xff00) >> 8;
+ *r = (c & 0xff0000) >> 16;
+ *b = c & 0xff;
+#endif
+ break;
+ case 16:
+ *g = ((c >> 5) & 0x3f) << 2;
+ *r = ((c >> 11) & 0x1f) << 3;
+ *b = (c & 0x1f) << 3;
+ break;
+ case 15:
+ *g = ((c >> 5) & 0x1f) << 3;
+ *r = ((c >> 10) & 0x1f) << 3;
+ *b = (c & 0x1f) << 3;
+ break;
+ }
+}
+
+static pixel_t rgb2point(int depth, int r, int g, int b)
+{
+ pixel_t ret = 0;
+
+ switch(depth) {
+ case 32:
+ case 24:
+#ifdef HAVE_JWXYZ
+ /* This program idiotically does not go through a color map, so
+ we have to hardcode in knowledge of how jwxyz.a packs pixels!
+ Fix it to go through st->colors[st->ncolors] instead!
+ */
+ ret = 0xFF000000 | (r << 16) | (g << 8) | b;
+#else
+ ret |= (r << 16) | (g << 8) | b;
+#endif
+ break;
+ case 16:
+ ret = ((r>>3) << 11) | ((g>>2)<<5) | (b>>3);
+ break;
+ case 15:
+ ret = ((r>>3) << 10) | ((g>>3)<<5) | (b>>3);
+ break;
+ }
+
+ return ret;
+}
+
+void print_color ( struct state* st, pixel_t color );
+/* alpha blended point drawing -- this is Not Right and will likely fail on
+ * non-intel platforms as it is now, needs fixing
+ */
+
+static
+void draw_point ( struct state* st,
+ int x, int y, pixel_t myc, float a ) {
+
+ int or = 0, og = 0, ob = 0;
+ int r = 0, g = 0, b = 0;
+ int nr, ng, nb;
+ register pixel_t c;
+
+ /*or = st->buffer[ 3 * ( y * st->width + x ) + 0 ];
+ og = st->buffer[ 3 * ( y * st->width + x ) + 1 ];
+ ob = st->buffer[ 3 * ( y * st->width + x ) + 2 ];*/
+
+ c = st->buffer[ y * st->width + x ];
+ point2rgb( st->depth, c, &or, &og, &ob );
+ point2rgb( st->depth, myc, &r, &g, &b );
+
+ nr = or + (r - or) * a;
+ ng = og + (g - og) * a;
+ nb = ob + (b - ob) * a;
+
+ /*st->buffer[ 3 * ( y * st->width + x ) + 0 ] = nr;
+ st->buffer[ 3 * ( y * st->width + x ) + 1 ] = ng;
+ st->buffer[ 3 * ( y * st->width + x ) + 2 ] = nb;*/
+ c = rgb2point(st->depth, nr, ng, nb);
+ st->buffer[ y * st->width + x ] = c;
+
+ XPutPixel( st->buf, x, y, c );
+}
+
+
+
+
+void print_color ( struct state* st, pixel_t color ) {
+ int r=0, g=0, b=0;
+ point2rgb(st->depth, color, &r, &g, &b);
+ printf( "%d %d %d\n", r, g, b);
+}
+
+
+
+#if ANTIALIAS
+#define plot_(X,Y,D) do{ \
+ _dla_plot(st, (X), (Y), color, (D) * alpha); }while(0)
+
+static
+void _dla_plot(struct state* st, int x, int y, pixel_t col, float br)
+{
+ if ( ( x >= 0 && x < st->width ) && ( y >= 0 && y < st->height ) ) {
+ if ( br > 1.0f ) br = 1.0f;
+ draw_point( st, x, y, col, br );
+ }
+}
+
+#define ipart_(X) ((int)(X))
+#define round_(X) ((int)(((float)(X))+0.5))
+#define fpart_(X) (((float)(X))-(float)ipart_(X))
+#define rfpart_(X) (1.0-fpart_(X))
+
+static
+void draw_line_antialias(
+ struct state* st,
+ int x1, int y1,
+ int x2, int y2,
+ pixel_t color, float alpha )
+{
+ float dx = (float)x2 - (float)x1;
+ float dy = (float)y2 - (float)y1;
+ float gradient;
+ float xend;
+ float yend;
+ float xgap;
+ float ygap;
+ int xpxl1;
+ int ypxl1;
+ float intery;
+ float interx;
+ int xpxl2;
+ int ypxl2;
+ int x;
+ int y;
+
+ /* hard clipping, because this routine has some problems with negative coordinates */
+ /* TODO: fix the alpha for that boundary cases. Using fabs() could solve? */
+ if ( ( x1 < 0 || x1 > st->width ) ||
+ ( x2 < 0 || x2 > st->width ) ||
+ ( y1 < 0 || y1 > st->height ) ||
+ ( y2 < 0 || y2 > st->height ) )
+ return;
+
+ if ( fabs(dx) > fabs(dy) ) {
+ if ( x2 < x1 ) {
+ swap(x1, x2);
+ swap(y1, y2);
+ }
+ gradient = dy / dx;
+ xend = round_(x1);
+ yend = y1 + gradient*(xend - x1);
+ xgap = rfpart_(x1 + 0.5);
+ xpxl1 = xend;
+ ypxl1 = ipart_(yend);
+ plot_(xpxl1, ypxl1, rfpart_(yend)*xgap);
+ plot_(xpxl1, ypxl1+1, fpart_(yend)*xgap);
+ intery = yend + gradient;
+
+ xend = round_(x2);
+ yend = y2 + gradient*(xend - x2);
+ xgap = fpart_(x2+0.5);
+ xpxl2 = xend;
+ ypxl2 = ipart_(yend);
+ plot_(xpxl2, ypxl2, rfpart_(yend) * xgap);
+ plot_(xpxl2, ypxl2 + 1, fpart_(yend) * xgap);
+
+ /*if ( rfpart_(yend) * xgap < 0 || fpart_(yend) * xgap < 0)
+ printf("%f %f\n", rfpart_(yend) * xgap, fpart_(yend) * xgap);*/
+ for(x=xpxl1+1; x <= (xpxl2-1); x++) {
+ plot_(x, ipart_(intery), rfpart_(intery));
+ plot_(x, ipart_(intery) + 1, fpart_(intery));
+ /*if ( rfpart_(intery) < 0 || fpart_(intery) < 0)
+ printf("%f %f\n", rfpart_(intery), fpart_(intery));*/
+ intery += gradient;
+ }
+ } else {
+ if ( y2 < y1 ) {
+ swap(x1, x2);
+ swap(y1, y2);
+ }
+ gradient = dx / dy;
+ yend = round_(y1);
+ xend = x1 + gradient*(yend - y1);
+ ygap = rfpart_(y1 + 0.5);
+ ypxl1 = yend;
+ xpxl1 = ipart_(xend);
+ plot_(xpxl1, ypxl1, rfpart_(xend)*ygap);
+ plot_(xpxl1, ypxl1+1, fpart_(xend)*ygap);
+ interx = xend + gradient;
+
+ yend = round_(y2);
+ xend = x2 + gradient*(yend - y2);
+ ygap = fpart_(y2+0.5);
+ ypxl2 = yend;
+ xpxl2 = ipart_(xend);
+ plot_(xpxl2, ypxl2, rfpart_(xend) * ygap);
+ plot_(xpxl2, ypxl2 + 1, fpart_(xend) * ygap);
+
+ for(y=ypxl1+1; y <= (ypxl2-1); y++) {
+ plot_(ipart_(interx), y, rfpart_(interx));
+ plot_(ipart_(interx) + 1, y, fpart_(interx));
+ interx += gradient;
+ }
+ }
+}
+#undef plot_
+#undef ipart_
+#undef fpart_
+#undef round_
+#undef rfpart_
+
+#else
+
+static
+void draw_line ( struct state* st, int x0, int y0, int x1, int y1, int color, float a ) {
+ register int steep;
+ register int deltax;
+ register int deltay;
+ register int error;
+ register int ystep;
+ register int y;
+ register int x;
+
+
+ steep = abs ( y1 - y0 ) > abs ( x1 - x0 );
+ if ( steep ) { swap(x0,y0); swap(x1,y1); }
+ if ( x0 > x1 ) { swap(x0,x1); swap(y0,y1); }
+ deltax = x1 - x0;
+ deltay = abs(y1-y0);
+ error = 0;
+ y = y0;
+ ystep = y0 < y1 ? 1 : -1;
+ if ( a > 1.0f ) a = 1.0f;
+
+ for ( x = x0; x < x1; x++ ) {
+ if ( steep ) {
+ if ( ( y >= 0 && y < st->width ) && ( x >= 0 && x < st->height ) )
+ draw_point( st, y, x, color, a );
+ } else {
+ if ( ( x >= 0 && x < st->width ) && ( y >= 0 && y < st->height ) )
+ draw_point( st, x, y, color, a );
+ }
+ error += deltay;
+ if ( ( error << 1 ) > deltax ) {
+ y += ystep;
+ error -= deltax;
+ }
+ }
+}
+#endif
+
+static void create_buffers ( struct state* st, Display* display, Screen* screen, Window window, GC gc ) {
+
+ XWindowAttributes xgwa;
+ XGetWindowAttributes( display, window, &xgwa );
+
+ /* Initialize the pixmap */
+ if ( st->buf != NULL ) XFreePixmap( display, st->pix );
+
+ XSetForeground( display, gc, st->colors[BLACK] );
+ st->pix = XCreatePixmap( display, window, st->width, st->height,
+ xgwa.depth );
+ XFillRectangle( display, st->pix, gc, 0, 0, st->width, st->height);
+
+ /* Initialize the bitmap */
+ if ( st->buf != NULL ) XDestroyImage ( st->buf );
+ st->buf = XGetImage( display, st->pix, 0, 0, st->width, st->height, visual_depth(screen, st->visual), ZPixmap );
+ st->buffer = (pixel_t*) calloc(sizeof(pixel_t), st->width * st->height);
+ /*int i;
+ for ( i = 0; i < st->width * st->height; ++i ) st->buffer[i] = st->colors[BLACK];*/
+}
+
+static void init_particle ( particle_t* p, float dx, float dy, float direction, int color, int max_age ) {
+ float max_initial_velocity = 2.0f;
+ p->x = -dx;
+ p->y = -dy;
+ p->xx = 0;
+ p->yy = 0;
+ p->vx = max_initial_velocity * cos(direction);
+ p->vy = max_initial_velocity * sin(direction);
+
+ p->age = random() % max_age;
+
+ p->color = color;
+}
+
+static void clamp ( int* value, int l, int h ) {
+ if ( *value < l ) *value = l;
+ if ( *value > h ) *value = h;
+}
+
+static pixel_t next_color ( struct state* st, pixel_t current ) {
+ int r=0, g=0, b=0;
+
+ point2rgb(st->depth, current, &r, &g, &b);
+ r += random() % 5 - 2;
+ g += random() % 5 - 2;
+ b += random() % 5 - 2;
+ clamp(&r, 0, 255);
+ clamp(&g, 0, 255);
+ clamp(&b, 0, 255);
+
+ return rgb2point( st->depth, r, g, b );
+}
+
+
+static void create_particles ( struct state* st ) {
+ int i;
+ float emitx, emity;
+ float direction;
+
+ for ( i = 0; i < st->particles_number; i++ ) {
+ emitx = ( st->ring_radius * sinf( M_PI * 2 * ( (float) i / st->particles_number ) ) );
+ emity = ( st->ring_radius * cosf( M_PI * 2 * ( (float) i / st->particles_number ) ) );
+ direction = (M_PI * i) / st->particles_number;
+
+ if ( st->epoch == WHITE && st->color )
+ st->colors[WHITE] = next_color(st, st->colors[WHITE]);
+
+ init_particle(st->particles + i, emitx, emity, direction, st->colors[WHITE], st->max_age);
+ }
+}
+
+
+/* randomly move one particle and draw it */
+static void move ( particle_t* p, struct state * st ) {
+ int w = st->width / 2;
+ int h = st->height / 2;
+ float max_dv = 1.0f;
+
+ p->xx = p->x;
+ p->yy = p->y;
+ p->x += p->vx;
+ p->y += p->vy;
+ p->vx += frand1() * st->curliness * max_dv;
+ p->vy += frand1() * st->curliness * max_dv;
+
+
+#if ANTIALIAS
+ draw_line_antialias( st,
+ w+p->xx, h+p->yy, w+p->x, h+p->y, p->color, 0.15 );
+ draw_line_antialias( st,
+ w-p->xx, h+p->yy, w-p->x, h+p->y, p->color, 0.15 );
+#else
+ draw_line( st, w+p->xx, h+p->yy, w+p->x, h+p->y, p->color, 0.15 );
+ draw_line( st, w-p->xx, h+p->yy, w-p->x, h+p->y, p->color, 0.15 );
+#endif
+
+ p->age++;
+ /* if this is too old, die and reborn */
+ if ( p->age > st->max_age ) {
+ float dir = frand1() * 2 * M_PI;
+ p->x = st->ring_radius * sin(dir);
+ p->y = st->ring_radius * cos(dir);
+ p->xx = p->yy = p->vx = p->vy = 0;
+ p->age = 0;
+
+ if ( st->epoch == WHITE && st->color )
+ st->colors[WHITE] = next_color(st, st->colors[WHITE] );
+
+ p->color = st->colors[st->epoch];
+ }
+}
+
+
+
+
+/* Initialize Everything */
+static void* binaryring_init ( Display* display, Window window ) {
+ XWindowAttributes xgwa;
+
+ struct state *st = ( struct state* ) calloc ( 1, sizeof( *st ) );
+
+ XGetWindowAttributes( display, window, &xgwa );
+
+ st->epoch = WHITE;
+ st->display = display;
+ st->window = window;
+ st->particles_number = (get_integer_resource(st->display, "particles_number", "Integer"));
+ st->growth_delay = (get_integer_resource(st->display, "growth_delay", "Integer"));
+ st->ring_radius = (get_integer_resource(st->display, "ring_radius", "Integer"));
+ st->max_age = (get_integer_resource(st->display, "max_age", "Integer"));
+ st->color = get_boolean_resource(st->display, "color", "Boolean");
+ st->height = xgwa.height;
+ st->width = xgwa.width;
+ st->visual = xgwa.visual;
+ st->curliness = 0.5;
+
+
+ st->depth = visual_depth(xgwa.screen, st->visual);
+ st->colors[0] = rgb2point(st->depth, 0, 0, 0);
+ st->colors[1] = rgb2point(st->depth, 255, 255, 255);
+
+ /*describe_visual (stdout, xgwa.screen, xgwa.visual, False);*/
+
+ st->particles = malloc (st->particles_number * sizeof( particle_t ) );
+ create_particles ( st );
+
+ st->gc = XCreateGC( st->display, st->window, 0, &st->gcv );
+ create_buffers ( st, display, xgwa.screen, window, st->gc );
+
+
+ return st;
+}
+
+
+static unsigned long binaryring_draw ( Display* display, Window win, void *closure ) {
+ struct state *st = (struct state *) closure;
+ int i;
+
+ for ( i = 0; i < st->particles_number; i++ )
+ move( &(st->particles[i]), st );
+
+ /* draw the XImage in the Pixmap and the put the Pixmap on the screen */
+ XPutImage( display, st->pix, st->gc, st->buf, 0, 0, 0, 0, st->width, st->height);
+ XCopyArea( display, st->pix, win, st->gc, 0, 0, st->width, st->height, 0, 0 );
+
+ /* randomly switch ageColor periods */
+ if ( random() % 10000 > 9950 )
+ st->epoch = (st->epoch == WHITE) ? BLACK : WHITE;
+
+ return st->growth_delay;
+}
+
+
+
+static void binaryring_reshape ( Display* display, Window win, void *closure, unsigned int w, unsigned int h ) {
+ struct state *st = (struct state *) closure;
+
+ XWindowAttributes tmp;
+ XGetWindowAttributes(display, win, &tmp);
+
+ if ( tmp.height != st->height || tmp.width != st->width ) {
+ st->height = tmp.height;
+ st->width = tmp.width;
+
+
+ st->epoch = WHITE;
+ create_particles ( st );
+
+ create_buffers ( st, display, tmp.screen, win, st->gc );
+ }
+}
+
+
+/* if someone press a key switch the color */
+static Bool binaryring_event ( Display* display, Window win, void *closure, XEvent* event ) {
+ struct state *st = (struct state *) closure;
+
+ if ( (*event).xany.type == KeyPress ) {
+ st->epoch = (st->epoch == WHITE) ? BLACK : WHITE;
+ }
+
+ return False;
+}
+
+
+/* delete everything */
+static void binaryring_free ( Display* display, Window win, void *closure ) {
+ struct state *st = (struct state *) closure;
+ XWindowAttributes tmp;
+ XGetWindowAttributes(display, win, &tmp);
+
+ free( st->buffer );
+ free( st->particles );
+
+ free ( st );
+}
+
+
+/* Default resources of the program */
+static const char* binaryring_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*growth_delay: 10000",
+ "*particles_number: 5000",
+ "*ring_radius: 40",
+ "*max_age: 400",
+ "*color: True",
+ "*ignoreRotation: True",
+ 0
+};
+
+static XrmOptionDescRec binaryring_options [] = {
+ { "-particles-number", ".particles_number", XrmoptionSepArg, 0 },
+ { "-growth-delay", ".growth_delay", XrmoptionSepArg, 0 },
+ { "-ring-radius", ".ring_radius", XrmoptionSepArg, 0 },
+ { "-max-age", ".max_age", XrmoptionSepArg, 0 },
+ { "-color", ".color", XrmoptionNoArg, "True" },
+ { "-no-color", ".color", XrmoptionNoArg, "False" },
+ { 0, 0, 0, 0}
+};
+
+XSCREENSAVER_MODULE("BinaryRing", binaryring)
diff --git a/hacks/binaryring.man b/hacks/binaryring.man
new file mode 100644
index 0000000..2d44496
--- /dev/null
+++ b/hacks/binaryring.man
@@ -0,0 +1,88 @@
+.TH "Binary Ring" 1 "02-Sep-14" "X Version 11"
+.SH NAME
+binaryring - A system of path tracing particles evolves continuously from an initial creation.
+.SH SYNOPSIS
+.B binaryring
+[\-fps]
+[\-install]
+[\-noinstall]
+[\-mono]
+[\-root]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-window\-id \fIwindow\-id\fP]
+[\-color]
+[\-no\-color]
+[\-growth\-delay \fIdelayms\fP]
+[\-particle\-number \fIparticles\fP]
+[\-ring\-radius \fIradius\fP]
+.SH DESCRIPTION
+A system of path tracing particles evolves continuously from an initial circular creation.
+Ages of darkness play arbitrarily with ages of light.
+
+Ported (with some extensions) from the code by J. Tarbell at http://complexification.net
+.SH OPTIONS
+.I binaryring
+accepts the following options:
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-noinstall
+Don't install a private colormap for the window.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual
+class or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-window\-id \fIwindow\-id\fP
+Specify which window id to use.
+.TP 8
+.B \-color (Default)
+Particles have random generated colors that gradually change over time.
+.TP 8
+.B \-no\-color
+Use the original black and white visualization.
+.TP 8
+.B \-growth\-delay \fIdelayms\fP (Default: \fI10000\fP)
+Delay in ms between growth cycles. More delay, slower (but less CPU intensive).
+.TP 8
+.B \-particles\-number \fIparticles\fP (Default: \fI5000\fP)
+The number of particles in the system. With more particles the fps
+can also be affected.
+.TP 8
+.B \-ring\-radius \fIradius\fP (Default: \fI40\fP)
+The radius of the ring where the particles are born, in pixels.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global
+resources stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by J. Tarbell
+(complex@complexification.net, http://www.complexification.net).
+
+Ported to XScreensaver by Emilio Del Tessandoro (emilio.deltessa@gmail.com)
+.SH AUTHOR
+J. Tarbell <complex@complexification.net>, Jun-03
+
+Emilio Del Tessandoro <emilio.deltessa@gmail.com>, Aug-14
diff --git a/hacks/blaster.c b/hacks/blaster.c
new file mode 100644
index 0000000..a60351a
--- /dev/null
+++ b/hacks/blaster.c
@@ -0,0 +1,1191 @@
+/* -*- mode: C; tab-width: 2 -*-
+ * blaster, Copyright (c) 1999 Jonathan H. Lin <jonlin@tesuji.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Robots that move randomly and shoot lasers at each other. If the
+ * mothership is active, it will fly back and forth horizontally,
+ * firing 8 lasers in the 8 cardinal directions. The explosions are
+ * a 20 frame animation. Robots regenerate after the explosion is finished
+ * and all of its lasers have left the screen.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include "screenhack.h"
+
+struct laser_state {
+ int active;
+ int start_x,start_y;
+ int end_x, end_y;
+};
+
+struct robot_state {
+ int alive;
+ int death;
+
+ int move_style;
+ int target;
+
+ int old_x, old_y;
+ int new_x, new_y;
+
+ int radius;
+ GC robot_color;
+ GC laser_color;
+ struct laser_state *lasers;
+};
+
+struct mother_ship_state {
+ int active;
+ int death;
+ int old_x,new_x;
+ int y;
+ GC ship_color;
+ GC laser_color;
+ struct laser_state *lasers;
+};
+
+
+
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ GC r_color0, r_color1, r_color2, r_color3, r_color4, r_color5, l_color0, l_color1;
+ GC s_color;
+ GC black;
+
+ int delay;
+
+ int NUM_ROBOTS;
+ int NUM_LASERS;
+
+ int MOTHER_SHIP;
+ int MOTHER_SHIP_WIDTH;
+ int MOTHER_SHIP_HEIGHT;
+ int MOTHER_SHIP_LASER;
+ int MOTHER_SHIP_PERIOD;
+ int MOTHER_SHIP_HITS;
+
+ int LINE_MOVE_STYLE;
+ int RANDOM_MOVE_STYLE;
+ int NUM_MOVE_STYLES;
+
+ int EXPLODE_SIZE_1;
+ int EXPLODE_SIZE_2;
+ int EXPLODE_SIZE_3;
+ GC EXPLODE_COLOR_1;
+ GC EXPLODE_COLOR_2;
+
+ XArc *stars;
+ int NUM_STARS;
+ int MOVE_STARS;
+ int MOVE_STARS_X;
+ int MOVE_STARS_Y;
+ int MOVE_STARS_RANDOM;
+
+ struct mother_ship_state *mother;
+
+ struct robot_state *robots;
+
+ XWindowAttributes xgwa;
+
+ int initted;
+
+ int draw_x;
+ int draw_y;
+ int draw_z;
+};
+
+
+/* creates a new robot. It starts out on one of the edges somewhere and
+ has no initial velocity. A target is randomly picked. */
+static void make_new_robot(struct state *st, int index)
+{
+ int laser_check = 0;
+ int x=0;
+
+ for(x=0;x<st->NUM_LASERS;x++) {
+ if(st->robots[index].lasers[x].active) {
+ x=st->NUM_LASERS;
+ laser_check = 1;
+ }
+ }
+ if(laser_check==0) {
+ st->robots[index].alive=1;
+
+ st->robots[index].radius = 7+(random()%7);
+
+ st->robots[index].move_style = random()%st->NUM_MOVE_STYLES;
+ if(random()%2==0) {
+ st->robots[index].new_x=random()%(st->xgwa.width-st->robots[index].radius);
+ st->robots[index].old_x=st->robots[index].new_x;
+ if(random()%2==0) {
+ st->robots[index].new_y=0;
+ st->robots[index].old_y=0;
+ }
+ else {
+ st->robots[index].new_y=st->xgwa.height-st->robots[index].radius;
+ st->robots[index].old_y = st->robots[index].new_y;
+ }
+ }
+ else {
+ st->robots[index].new_y=random()%(st->xgwa.height-st->robots[index].radius);
+ st->robots[index].old_y = st->robots[index].new_y;
+ if(random()%2) {
+ st->robots[index].new_x=0;
+ st->robots[index].old_x=0;
+ }
+ else {
+ st->robots[index].new_x=st->xgwa.width-st->robots[index].radius;
+ st->robots[index].old_x=st->robots[index].new_x;
+ }
+ }
+
+ x=random()%6;
+ if(x==0) {
+ st->robots[index].robot_color = st->r_color0;
+ }
+ else if(x==1) {
+ st->robots[index].robot_color = st->r_color1;
+ }
+ else if(x==2) {
+ st->robots[index].robot_color = st->r_color2;
+ }
+ else if(x==3) {
+ st->robots[index].robot_color = st->r_color3;
+ }
+ else if(x==4) {
+ st->robots[index].robot_color = st->r_color4;
+ }
+ else if(x==5) {
+ st->robots[index].robot_color = st->r_color5;
+ }
+
+ if(random()%2==0) {
+ st->robots[index].laser_color = st->l_color0;
+ }
+ else {
+ st->robots[index].laser_color = st->l_color1;
+ }
+
+ if(st->NUM_ROBOTS>1) {
+ st->robots[index].target = random()%st->NUM_ROBOTS;
+ while(st->robots[index].target==index) {
+ st->robots[index].target = random()%st->NUM_ROBOTS;
+ }
+ }
+ }
+}
+
+/* moves each robot, randomly changing its direction and velocity.
+ At random a laser is shot toward that robot's target. Also at random
+ the target can change. */
+static void move_robots(struct state *st)
+{
+ int x=0;
+ int y=0;
+ int dx=0;
+ int dy=0;
+ int target_x = 0;
+ int target_y = 0;
+ double slope = 0;
+
+ for(x=0;x<st->NUM_ROBOTS;x++) {
+ if(st->robots[x].alive) {
+ if((st->robots[x].new_x == st->robots[x].old_x) && (st->robots[x].new_y == st->robots[x].old_y)) {
+ if(st->robots[x].new_x==0) {
+ st->robots[x].old_x = -((random()%3)+1);
+ }
+ else {
+ st->robots[x].old_x = st->robots[x].old_x + (random()%3)+1;
+ }
+ if(st->robots[x].new_y==0) {
+ st->robots[x].old_y = -((random()%3)+1);
+ }
+ else {
+ st->robots[x].old_y = st->robots[x].old_y + (random()%3)+1;
+ }
+ }
+ if(st->robots[x].move_style==st->LINE_MOVE_STYLE) {
+ dx = st->robots[x].new_x - st->robots[x].old_x;
+ dy = st->robots[x].new_y - st->robots[x].old_y;
+ if(dx > 3) {
+ dx = 3;
+ }
+ else if(dx < -3) {
+ dx = -3;
+ }
+ if(dy > 3) {
+ dy = 3;
+ }
+ else if(dy < -3) {
+ dy = -3;
+ }
+ st->robots[x].old_x = st->robots[x].new_x;
+ st->robots[x].old_y = st->robots[x].new_y;
+
+ st->robots[x].new_x = st->robots[x].new_x + dx;
+ st->robots[x].new_y = st->robots[x].new_y + dy;
+ }
+ else if(st->robots[x].move_style==st->RANDOM_MOVE_STYLE) {
+ dx = st->robots[x].new_x - st->robots[x].old_x;
+ dy = st->robots[x].new_y - st->robots[x].old_y;
+ y=random()%3;
+ if(y==0) {
+ dx = dx - ((random()%7)+1);
+ }
+ else if(y==1){
+ dx = dx + ((random()%7)+1);
+ }
+ else {
+ dx = (-1)*dx;
+ }
+ if(dx > 3) {
+ dx = 3;
+ }
+ else if(dx < -3) {
+ dx = -3;
+ }
+
+ y = random()%3;
+ if(y==0) {
+ dy = dy - ((random()%7)+1);
+ }
+ else if(y==1){
+ dy = dy + ((random()%7)+1);
+ }
+ else {
+ dx = (-1)*dx;
+ }
+ if(dy > 3) {
+ dy = 3;
+ }
+ else if(dy < -3) {
+ dy = -3;
+ }
+ st->robots[x].old_x = st->robots[x].new_x;
+ st->robots[x].old_y = st->robots[x].new_y;
+
+ st->robots[x].new_x = st->robots[x].new_x + dx;
+ st->robots[x].new_y = st->robots[x].new_y + dy;
+ }
+
+ /* bounds corrections */
+ if(st->robots[x].new_x >= st->xgwa.width-st->robots[x].radius) {
+ st->robots[x].new_x = st->xgwa.width - st->robots[x].radius;
+ }
+ else if(st->robots[x].new_x < 0) {
+ st->robots[x].new_x = 0;
+ }
+ if(st->robots[x].new_y >= st->xgwa.height-st->robots[x].radius) {
+ st->robots[x].new_y = st->xgwa.height - st->robots[x].radius;
+ }
+ else if(st->robots[x].new_y < 0) {
+ st->robots[x].new_y = 0;
+ }
+
+ if(random()%10==0) {
+ st->robots[x].move_style = 1;
+ }
+ else {
+ st->robots[x].move_style = 0;
+ }
+
+ if(st->NUM_ROBOTS>1) {
+ if(random()%2==0) {
+ if(random()%200==0) {
+ st->robots[x].target = random()%st->NUM_ROBOTS;
+ while(st->robots[x].target==x) {
+ st->robots[x].target = random()%st->NUM_ROBOTS;
+ }
+ for(y=0;y<st->NUM_LASERS;y++) {
+ if(st->robots[x].lasers[y].active == 0) {
+ st->robots[x].lasers[y].active = 1;
+ if(random()%2==0) {
+ if(random()%2==0) {
+ st->robots[x].lasers[y].start_x = st->robots[x].new_x+st->robots[x].radius;
+ st->robots[x].lasers[y].start_y = st->robots[x].new_y+st->robots[x].radius;
+ st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x+7;
+ st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y+7;
+ }
+ else {
+ st->robots[x].lasers[y].start_x = st->robots[x].new_x-st->robots[x].radius;
+ st->robots[x].lasers[y].start_y = st->robots[x].new_y+st->robots[x].radius;
+ st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x-7;
+ st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y+7;
+ }
+ }
+ else {
+ if(random()%2==0) {
+ st->robots[x].lasers[y].start_x = st->robots[x].new_x-st->robots[x].radius;
+ st->robots[x].lasers[y].start_y = st->robots[x].new_y-st->robots[x].radius;
+ st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x-7;
+ st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y-7;
+ }
+ else {
+ st->robots[x].lasers[y].start_x = st->robots[x].new_x+st->robots[x].radius;
+ st->robots[x].lasers[y].start_y = st->robots[x].new_y-st->robots[x].radius;
+ st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x+7;
+ st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y-7;
+ }
+ }
+ y = st->NUM_LASERS;
+ }
+ }
+ }
+ else {
+ for(y=0;y<st->NUM_LASERS;y++) {
+ if(st->robots[x].lasers[y].active==0) {
+ target_x = st->robots[st->robots[x].target].new_x;
+ target_y = st->robots[st->robots[x].target].new_y;
+ if((target_x-st->robots[x].new_x)!=0) {
+ slope = ((double)target_y-st->robots[x].new_y)/((double)(target_x-st->robots[x].new_x));
+
+ if((slope<1) && (slope>-1)) {
+ if(target_x>st->robots[x].new_x) {
+ st->robots[x].lasers[y].start_x = st->robots[x].radius;
+ st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x + 7;
+ }
+ else {
+ st->robots[x].lasers[y].start_x = -st->robots[x].radius;
+ st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x - 7;
+ }
+ st->robots[x].lasers[y].start_y = (int)(st->robots[x].lasers[y].start_x * slope);
+ st->robots[x].lasers[y].end_y = (int)(st->robots[x].lasers[y].end_x * slope);
+ }
+ else {
+ slope = (target_x-st->robots[x].new_x)/(target_y-st->robots[x].new_y);
+ if(target_y>st->robots[x].new_y) {
+ st->robots[x].lasers[y].start_y = st->robots[x].radius;
+ st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y + 7;
+ }
+ else {
+ st->robots[x].lasers[y].start_y = -st->robots[x].radius;
+ st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y - 7;
+ }
+ st->robots[x].lasers[y].start_x = (int)(st->robots[x].lasers[y].start_y * slope);;
+ st->robots[x].lasers[y].end_x = (int)(st->robots[x].lasers[y].end_y * slope);
+ }
+ st->robots[x].lasers[y].start_x = st->robots[x].lasers[y].start_x + st->robots[x].new_x;
+ st->robots[x].lasers[y].start_y = st->robots[x].lasers[y].start_y + st->robots[x].new_y;
+ st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].end_x + st->robots[x].new_x;
+ st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].end_y + st->robots[x].new_y;
+ }
+ else {
+ if(target_y > st->robots[x].new_y) {
+ st->robots[x].lasers[y].start_x = st->robots[x].new_x;
+ st->robots[x].lasers[y].start_y = st->robots[x].new_y+st->robots[x].radius;
+ st->robots[x].lasers[y].end_x = st->robots[x].new_x;
+ st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y+7;
+ }
+ else {
+ st->robots[x].lasers[y].start_x = st->robots[x].new_x;
+ st->robots[x].lasers[y].start_y = st->robots[x].new_y-st->robots[x].radius;
+ st->robots[x].lasers[y].end_x = st->robots[x].new_x;
+ st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y-7;
+ }
+ }
+
+ if((((st->robots[x].lasers[y].start_x - st->robots[x].lasers[y].end_x) > 7) ||
+ ((st->robots[x].lasers[y].end_x - st->robots[x].lasers[y].start_x) > 7)) &&
+ (((st->robots[x].lasers[y].start_y - st->robots[x].lasers[y].end_y) > 7) ||
+ ((st->robots[x].lasers[y].end_y - st->robots[x].lasers[y].start_y) > 7))) {
+ }
+ else {
+ st->robots[x].lasers[y].active = 1;
+ y = st->NUM_LASERS;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ else {
+ if(st->robots[x].death==0) {
+ make_new_robot(st,x);
+ }
+ }
+ }
+
+}
+
+/* This moves a single laser one frame. collisions with other robots or
+ the mothership is checked. */
+static void move_laser(struct state *st, int rindex, int index)
+{
+ int x=0;
+ int y=0;
+ int z=0;
+ int dx=0;
+ int dy=0;
+ struct laser_state *laser;
+ if(rindex>=0) {
+ laser = st->robots[rindex].lasers;
+ }
+ else {
+ laser = st->mother->lasers;
+ }
+ if(laser[index].active) {
+ /* collision with other robots are checked here */
+ for(x=0;x<st->NUM_ROBOTS;x++) {
+ if(x!=rindex) {
+ if(st->robots[x].alive) {
+ y = laser[index].start_x-st->robots[x].new_x;
+ if(y<0) {
+ y = st->robots[x].new_x-laser[index].start_x;
+ }
+ z = laser[index].start_y-st->robots[x].new_y;
+ if(z<0) {
+ z = st->robots[x].new_y-laser[index].start_y;
+ }
+ if((z<st->robots[x].radius-1)&&(y<st->robots[x].radius-1)) {
+ st->robots[x].alive = 0;
+ st->robots[x].death = 20;
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].old_x, st->robots[x].old_y, st->robots[x].radius, st->robots[x].radius, 0, 360*64);
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x, st->robots[x].new_y, st->robots[x].radius, st->robots[x].radius, 0, 360*64);
+ laser[index].active = 0;
+ x = st->NUM_ROBOTS;
+ }
+ else {
+ y = laser[index].end_x-st->robots[x].new_x;
+ if(y<0) {
+ y = st->robots[x].new_x-laser[index].end_x;
+ }
+ z = laser[index].end_y-st->robots[x].new_y;
+ if(z<0) {
+ z = st->robots[x].new_y-laser[index].end_y;
+ }
+ if((z<st->robots[x].radius-1)&&(y<st->robots[x].radius-1)) {
+ st->robots[x].alive = 0;
+ st->robots[x].death = 20;
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].old_x, st->robots[x].old_y, st->robots[x].radius, st->robots[x].radius, 0, 360*64);
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x, st->robots[x].new_y, st->robots[x].radius, st->robots[x].radius, 0, 360*64);
+ laser[index].active = 0;
+ x = st->NUM_ROBOTS;
+ }
+ }
+ }
+ }
+ }
+ if((st->MOTHER_SHIP)&&(rindex!=-1)) {
+ if(laser[index].active) {
+ if(st->mother->active) {
+ y = laser[index].start_x-st->mother->new_x;
+ if(y<0) {
+ y = st->mother->new_x-laser[index].start_x;
+ }
+ z = laser[index].start_y-st->mother->y;
+ if(z<0) {
+ z = st->mother->y-laser[index].start_y;
+ }
+ if((z<st->MOTHER_SHIP_HEIGHT-1)&&(y<st->MOTHER_SHIP_WIDTH-1)) {
+ laser[index].active = 0;
+ st->mother->active--;
+ }
+ else {
+ y = laser[index].end_x-st->mother->new_x;
+ if(y<0) {
+ y = st->mother->new_x-laser[index].end_x;
+ }
+ z = laser[index].end_y-st->mother->y;
+ if(z<0) {
+ z = st->mother->y-laser[index].end_y;
+ }
+ if((z<st->MOTHER_SHIP_HEIGHT-1)&&(y<st->MOTHER_SHIP_WIDTH-1)) {
+ laser[index].active = 0;
+ st->mother->active--;
+ }
+ }
+
+ if(st->mother->active==0) {
+ st->mother->death=20;
+ }
+ }
+ }
+ }
+
+ if(laser[index].active) {
+ dx = laser[index].start_x - laser[index].end_x;
+ dy = laser[index].start_y - laser[index].end_y;
+
+ laser[index].start_x = laser[index].end_x;
+ laser[index].start_y = laser[index].end_y;
+ laser[index].end_x = laser[index].end_x-dx;
+ laser[index].end_y = laser[index].end_y-dy;
+
+ if((laser[index].end_x < 0) || (laser[index].end_x >= st->xgwa.width) ||
+ (laser[index].end_y < 0) || (laser[index].end_y >= st->xgwa.height)) {
+ laser[index].active = 0;
+ }
+ }
+ }
+}
+
+/* All the robots are drawn, including the mother ship and the explosions.
+ After all the robots have been drawn, their laser banks are check and
+ the active lasers are drawn. */
+static void draw_robots(struct state *st)
+{
+ int x=0;
+ int y=0;
+
+ for(x=0;x<st->NUM_ROBOTS;x++) {
+ if(st->robots[x].alive) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].old_x, st->robots[x].old_y, st->robots[x].radius, st->robots[x].radius, 0, 360*64);
+ XFillArc(st->dpy, st->window, st->robots[x].robot_color, st->robots[x].new_x, st->robots[x].new_y, st->robots[x].radius, st->robots[x].radius, 0, 360*64);
+ }
+ else {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].old_x, st->robots[x].old_y, st->robots[x].radius, st->robots[x].radius, 0, 360*64);
+ if(st->robots[x].death) {
+ if(st->robots[x].death==20) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==18) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==17) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==15) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==14) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==13) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==12) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==11) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==10) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==9) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==8) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==7) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->robots[x].death==6) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
+ }
+ else if(st->robots[x].death==4) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
+ }
+ else if(st->robots[x].death==3) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
+ }
+ else if(st->robots[x].death==2) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(st->robots[x].radius/3), st->robots[x].new_y+(st->robots[x].radius/3), st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->robots[x].new_x+(1.7*st->robots[x].radius/2), st->robots[x].new_y+(1.7*st->robots[x].radius/2), st->EXPLODE_SIZE_3, st->EXPLODE_SIZE_3, 0, 360*64);
+ }
+ else if(st->robots[x].death==1) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->robots[x].new_x+(1.7*st->robots[x].radius/2), st->robots[x].new_y+(1.7*st->robots[x].radius/2), st->EXPLODE_SIZE_3, st->EXPLODE_SIZE_3, 0, 360*64);
+ }
+ st->robots[x].death--;
+ }
+ }
+ }
+
+ for(x=0;x<st->NUM_ROBOTS;x++) {
+ for(y=0;y<st->NUM_LASERS;y++) {
+ if(st->robots[x].lasers[y].active) {
+ if (st->black) XDrawLine(st->dpy, st->window, st->black, st->robots[x].lasers[y].start_x,
+ st->robots[x].lasers[y].start_y,
+ st->robots[x].lasers[y].end_x,
+ st->robots[x].lasers[y].end_y);
+ move_laser(st, x, y);
+ if(st->robots[x].lasers[y].active) {
+ XDrawLine(st->dpy, st->window, st->robots[x].laser_color, st->robots[x].lasers[y].start_x,
+ st->robots[x].lasers[y].start_y,
+ st->robots[x].lasers[y].end_x,
+ st->robots[x].lasers[y].end_y);
+ }
+ else {
+ if (st->black) XDrawLine(st->dpy, st->window, st->black, st->robots[x].lasers[y].start_x,
+ st->robots[x].lasers[y].start_y,
+ st->robots[x].lasers[y].end_x,
+ st->robots[x].lasers[y].end_y);
+ }
+ }
+ }
+ }
+
+ if(st->MOTHER_SHIP) {
+ if(st->mother->active) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->old_x, st->mother->y, st->MOTHER_SHIP_WIDTH, st->MOTHER_SHIP_HEIGHT, 0 , 360*64);
+ XFillArc(st->dpy, st->window, st->mother->ship_color, st->mother->new_x, st->mother->y, st->MOTHER_SHIP_WIDTH, st->MOTHER_SHIP_HEIGHT, 0 , 360*64);
+ }
+ else {
+ if(st->mother->death) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->old_x, st->mother->y, st->MOTHER_SHIP_WIDTH, st->MOTHER_SHIP_HEIGHT, 0 , 360*64);
+ if(st->mother->death==20) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==18) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==17) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==15) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==14) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==13) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==12) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==11) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==10) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==9) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==8) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==7) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_1, st->EXPLODE_SIZE_1, 0, 360*64);
+ }
+ else if(st->mother->death==6) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
+ }
+ else if(st->mother->death==4) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
+ }
+ else if(st->mother->death==3) {
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_1, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
+ }
+ else if(st->mother->death==2) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+1, st->mother->y+1, st->EXPLODE_SIZE_2, st->EXPLODE_SIZE_2, 0, 360*64);
+ XFillArc(st->dpy, st->window, st->EXPLODE_COLOR_2, st->mother->new_x+(1.7*st->MOTHER_SHIP_WIDTH/2), st->mother->y+(1.7*st->MOTHER_SHIP_HEIGHT/2), st->EXPLODE_SIZE_3, st->EXPLODE_SIZE_3, 0, 360*64);
+ }
+ else if(st->mother->death==1) {
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x+(1.7*st->MOTHER_SHIP_WIDTH/2), st->mother->y+(1.7*st->MOTHER_SHIP_HEIGHT/2), st->EXPLODE_SIZE_3, st->EXPLODE_SIZE_3, 0, 360*64);
+ }
+ st->mother->death--;
+ }
+ }
+ for(y=0;y<8;y++) {
+ if(st->mother->lasers[y].active) {
+ if (st->black) XDrawLine(st->dpy, st->window, st->black, st->mother->lasers[y].start_x,
+ st->mother->lasers[y].start_y,
+ st->mother->lasers[y].end_x,
+ st->mother->lasers[y].end_y);
+ move_laser(st, -1,y);
+ if(st->mother->lasers[y].active) {
+ XDrawLine(st->dpy, st->window, st->mother->laser_color, st->mother->lasers[y].start_x,
+ st->mother->lasers[y].start_y,
+ st->mother->lasers[y].end_x,
+ st->mother->lasers[y].end_y);
+ }
+ else {
+ if (st->black) XDrawLine(st->dpy, st->window, st->black, st->mother->lasers[y].start_x,
+ st->mother->lasers[y].start_y,
+ st->mother->lasers[y].end_x,
+ st->mother->lasers[y].end_y);
+ }
+ }
+ }
+ }
+}
+
+static void
+init_stars(struct state *st)
+{
+ if(st->NUM_STARS) {
+ if (! st->stars)
+ st->stars = (XArc *) malloc (st->NUM_STARS * sizeof(XArc));
+ for(st->draw_x=0;st->draw_x<st->NUM_STARS;st->draw_x++) {
+ st->stars[st->draw_x].x = random()%st->xgwa.width;
+ st->stars[st->draw_x].y = random()%st->xgwa.height;
+ st->stars[st->draw_x].width = random()%4 + 1;
+ st->stars[st->draw_x].height = st->stars[st->draw_x].width;
+ st->stars[st->draw_x].angle1 = 0;
+ st->stars[st->draw_x].angle2 = 360 * 64;
+ }
+ }
+}
+
+
+static unsigned long
+blaster_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ XClearWindow (dpy, window);
+#endif
+
+ if (!st->initted)
+ {
+ st->initted = 1;
+
+ st->robots = (struct robot_state *) malloc(st->NUM_ROBOTS * sizeof (struct robot_state));
+ for(st->draw_x=0;st->draw_x<st->NUM_ROBOTS;st->draw_x++) {
+ st->robots[st->draw_x].alive = 0;
+ st->robots[st->draw_x].death = 0;
+ st->robots[st->draw_x].lasers = (struct laser_state *) malloc (st->NUM_LASERS * sizeof(struct laser_state));
+ for(st->draw_y=0;st->draw_y<st->NUM_LASERS;st->draw_y++) {
+ st->robots[st->draw_x].lasers[st->draw_y].active = 0;
+ }
+ }
+
+ init_stars(st);
+ }
+
+ if(st->NUM_STARS) {
+ if(st->MOVE_STARS) {
+ if (st->black) XFillArcs(st->dpy,st->window,st->black,st->stars,st->NUM_STARS);
+ if(st->MOVE_STARS_RANDOM) {
+ st->draw_y = st->MOVE_STARS_X;
+ st->draw_z = st->MOVE_STARS_Y;
+ if(random()%167==0) {
+ st->draw_y = (-1)*st->draw_y;
+ }
+ if(random()%173==0) {
+ st->draw_z = (-1)*st->draw_z;
+ }
+ if(random()%50==0) {
+ if(random()%2) {
+ st->draw_y++;
+ if(st->draw_y>st->MOVE_STARS_RANDOM) {
+ st->draw_y = st->MOVE_STARS_RANDOM;
+ }
+ }
+ else {
+ st->draw_y--;
+ if(st->draw_y < -(st->MOVE_STARS_RANDOM)) {
+ st->draw_y = -(st->MOVE_STARS_RANDOM);
+ }
+ }
+ }
+ if(random()%50==0) {
+ if(random()%2) {
+ st->draw_z++;
+ if(st->draw_z>st->MOVE_STARS_RANDOM) {
+ st->draw_z = st->MOVE_STARS_RANDOM;
+ }
+ }
+ else {
+ st->draw_z--;
+ if(st->draw_z < -st->MOVE_STARS_RANDOM) {
+ st->draw_z = -st->MOVE_STARS_RANDOM;
+ }
+ }
+ }
+ st->MOVE_STARS_X = st->draw_y;
+ st->MOVE_STARS_Y = st->draw_z;
+ for(st->draw_x=0;st->draw_x<st->NUM_STARS;st->draw_x++) {
+ st->stars[st->draw_x].x = st->stars[st->draw_x].x + st->draw_y;
+ st->stars[st->draw_x].y = st->stars[st->draw_x].y + st->draw_z;
+ if(st->stars[st->draw_x].x<0) {
+ st->stars[st->draw_x].x = st->stars[st->draw_x].x + st->xgwa.width;
+ }
+ else if(st->stars[st->draw_x].x>st->xgwa.width) {
+ st->stars[st->draw_x].x = st->stars[st->draw_x].x - st->xgwa.width;
+ }
+ if(st->stars[st->draw_x].y<0) {
+ st->stars[st->draw_x].y = st->stars[st->draw_x].y + st->xgwa.height;
+ }
+ else if(st->stars[st->draw_x].y>st->xgwa.height) {
+ st->stars[st->draw_x].y = st->stars[st->draw_x].y - st->xgwa.height;
+ }
+ }
+ }
+ else {
+ for(st->draw_x=0;st->draw_x<st->NUM_STARS;st->draw_x++) {
+ st->stars[st->draw_x].x = st->stars[st->draw_x].x + st->MOVE_STARS_X;
+ st->stars[st->draw_x].y = st->stars[st->draw_x].y + st->MOVE_STARS_Y;
+ if(st->stars[st->draw_x].x<0) {
+ st->stars[st->draw_x].x = st->stars[st->draw_x].x + st->xgwa.width;
+ }
+ else if(st->stars[st->draw_x].x>st->xgwa.width) {
+ st->stars[st->draw_x].x = st->stars[st->draw_x].x - st->xgwa.width;
+ }
+ if(st->stars[st->draw_x].y<0) {
+ st->stars[st->draw_x].y = st->stars[st->draw_x].y + st->xgwa.height;
+ }
+ else if(st->stars[st->draw_x].y>st->xgwa.height) {
+ st->stars[st->draw_x].y = st->stars[st->draw_x].y - st->xgwa.height;
+ }
+ }
+ }
+ XFillArcs(st->dpy,st->window,st->s_color,st->stars,st->NUM_STARS);
+ }
+ else {
+ XFillArcs(st->dpy,st->window,st->s_color,st->stars,st->NUM_STARS);
+ }
+ }
+
+ if(st->MOTHER_SHIP) {
+ if(random()%st->MOTHER_SHIP_PERIOD==0) {
+ if((st->mother->active==0)&&(st->mother->death==0)) {
+ st->mother->active = st->MOTHER_SHIP_HITS;
+ st->mother->y = random()%(st->xgwa.height-7);
+ if(random()%2==0) {
+ st->mother->old_x=0;
+ st->mother->new_x=0;
+ }
+ else {
+ st->mother->old_x=st->xgwa.width-25;
+ st->mother->new_x=st->xgwa.width-25;
+ }
+ }
+ }
+ }
+ move_robots(st);
+ if(st->MOTHER_SHIP) {
+ if(st->mother->active) {
+ if(st->mother->old_x==st->mother->new_x) {
+ if(st->mother->old_x==0) {
+ st->mother->new_x=3;
+ }
+ else {
+ st->mother->new_x=st->mother->new_x-3;
+ }
+ }
+ else {
+ if(st->mother->old_x>st->mother->new_x) {
+ st->mother->old_x = st->mother->new_x;
+ st->mother->new_x = st->mother->new_x-3;
+ if(st->mother->new_x<0) {
+ st->mother->active=0;
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->old_x, st->mother->y, st->MOTHER_SHIP_WIDTH, st->MOTHER_SHIP_HEIGHT, 0 , 360*64);
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x, st->mother->y, st->MOTHER_SHIP_WIDTH, st->MOTHER_SHIP_HEIGHT, 0 , 360*64);
+ }
+ }
+ else {
+ st->mother->old_x = st->mother->new_x;
+ st->mother->new_x = st->mother->new_x+3;
+ if(st->mother->new_x>st->xgwa.width) {
+ st->mother->active=0;
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->old_x, st->mother->y, st->MOTHER_SHIP_WIDTH, st->MOTHER_SHIP_HEIGHT, 0 , 360*64);
+ if (st->black) XFillArc(st->dpy, st->window, st->black, st->mother->new_x, st->mother->y, st->MOTHER_SHIP_WIDTH, st->MOTHER_SHIP_HEIGHT, 0 , 360*64);
+ }
+ }
+ }
+ st->draw_y=0;
+ for(st->draw_x=0;st->draw_x<8;st->draw_x++) {
+ if(st->mother->lasers[st->draw_x].active) {
+ st->draw_y=1;
+ st->draw_x=8;
+ }
+ }
+ if(st->draw_y==0) {
+ for(st->draw_x=0;st->draw_x<8;st->draw_x++) {
+ st->mother->lasers[st->draw_x].active = 1;
+ st->mother->lasers[st->draw_x].start_x=st->mother->new_x+(st->MOTHER_SHIP_WIDTH/2);
+ st->mother->lasers[st->draw_x].start_y=st->mother->y+(st->MOTHER_SHIP_HEIGHT/2);
+ }
+ st->draw_y = (int)(st->MOTHER_SHIP_LASER/1.5);
+ st->mother->lasers[0].end_x=st->mother->lasers[0].start_x-st->MOTHER_SHIP_LASER;
+ st->mother->lasers[0].end_y=st->mother->lasers[0].start_y;
+ st->mother->lasers[1].end_x=st->mother->lasers[1].start_x-st->draw_y;
+ st->mother->lasers[1].end_y=st->mother->lasers[1].start_y-st->draw_y;
+ st->mother->lasers[2].end_x=st->mother->lasers[2].start_x;
+ st->mother->lasers[2].end_y=st->mother->lasers[2].start_y-st->MOTHER_SHIP_LASER;
+ st->mother->lasers[3].end_x=st->mother->lasers[3].start_x+st->draw_y;
+ st->mother->lasers[3].end_y=st->mother->lasers[3].start_y-st->draw_y;
+ st->mother->lasers[4].end_x=st->mother->lasers[4].start_x+st->MOTHER_SHIP_LASER;
+ st->mother->lasers[4].end_y=st->mother->lasers[4].start_y;
+ st->mother->lasers[5].end_x=st->mother->lasers[5].start_x+st->draw_y;
+ st->mother->lasers[5].end_y=st->mother->lasers[5].start_y+st->draw_y;
+ st->mother->lasers[6].end_x=st->mother->lasers[6].start_x;
+ st->mother->lasers[6].end_y=st->mother->lasers[6].start_y+st->MOTHER_SHIP_LASER;
+ st->mother->lasers[7].end_x=st->mother->lasers[7].start_x-st->draw_y;
+ st->mother->lasers[7].end_y=st->mother->lasers[7].start_y+st->draw_y;
+ }
+ }
+ }
+ draw_robots(st);
+
+ return st->delay;
+}
+
+static void *
+blaster_init (Display *d, Window w)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ Colormap cmap;
+ unsigned long bg;
+
+ st->dpy = d;
+ st->window = w;
+ XGetWindowAttributes(st->dpy, st->window, &st->xgwa);
+ cmap = st->xgwa.colormap;
+
+ st->NUM_ROBOTS=5;
+ st->NUM_LASERS=3;
+
+ st->MOTHER_SHIP_WIDTH=25;
+ st->MOTHER_SHIP_HEIGHT=7;
+ st->MOTHER_SHIP_LASER=15;
+ st->MOTHER_SHIP_PERIOD=150;
+ st->MOTHER_SHIP_HITS=10;
+
+ st->RANDOM_MOVE_STYLE=1;
+ st->NUM_MOVE_STYLES=2;
+
+ st->EXPLODE_SIZE_1=27;
+ st->EXPLODE_SIZE_2=19;
+ st->EXPLODE_SIZE_3=7;
+
+
+ st->delay = get_integer_resource(st->dpy, "delay", "Integer");
+ if(st->delay==0) {
+ st->delay=10000;
+ }
+ st->NUM_ROBOTS = get_integer_resource(st->dpy, "num_robots","Integer");
+ if(st->NUM_ROBOTS==0) {
+ st->NUM_ROBOTS=5;
+ }
+ st->NUM_LASERS = get_integer_resource(st->dpy, "num_lasers","Integer");
+ st->EXPLODE_SIZE_1 = get_integer_resource(st->dpy, "explode_size_1","Integer");
+ st->EXPLODE_SIZE_2 = get_integer_resource(st->dpy, "explode_size_2","Integer");
+ st->EXPLODE_SIZE_3 = get_integer_resource(st->dpy, "explode_size_3","Integer");
+
+ st->NUM_STARS = get_integer_resource(st->dpy, "num_stars","Integer");
+ if(get_boolean_resource(st->dpy, "move_stars","Boolean")) {
+ st->MOVE_STARS = 1;
+ st->MOVE_STARS_X = get_integer_resource(st->dpy, "move_stars_x","Integer");
+ st->MOVE_STARS_Y = get_integer_resource(st->dpy, "move_stars_y","Integer");
+ st->MOVE_STARS_RANDOM = get_integer_resource(st->dpy, "move_stars_random","Integer");
+ }
+ else {
+ st->MOVE_STARS = 0;
+ }
+
+
+ bg = get_pixel_resource(st->dpy, cmap, "background","Background");
+ gcv.function = GXcopy;
+
+#define make_gc(color,name) \
+ gcv.foreground = get_pixel_resource (st->dpy, cmap, (name), "Foreground"); \
+ color = XCreateGC (st->dpy, st->window, GCForeground|GCFunction, &gcv)
+
+ if(mono_p) {
+ gcv.foreground = bg;
+ st->black = XCreateGC(st->dpy, st->window, GCForeground|GCFunction, &gcv);
+ gcv.foreground = get_pixel_resource(st->dpy, cmap, "foreground", "Foreground");
+ st->r_color0 = st->r_color1 = st->r_color2 = st->r_color3 = st->r_color4 = st->r_color5 = st->l_color0 = st->l_color1 = st->s_color=
+ XCreateGC(st->dpy, st->window, GCForeground|GCFunction, &gcv);
+ if(get_boolean_resource(st->dpy, "mother_ship","Boolean")) {
+ st->MOTHER_SHIP_WIDTH=get_integer_resource(st->dpy, "mother_ship_width","Integer");
+ st->MOTHER_SHIP_HEIGHT=get_integer_resource(st->dpy, "mother_ship_height","Integer");
+ st->MOTHER_SHIP_LASER=get_integer_resource(st->dpy, "mother_ship_laser","Integer");
+ st->MOTHER_SHIP_PERIOD=get_integer_resource(st->dpy, "mother_ship_period","Integer");
+ st->MOTHER_SHIP_HITS=get_integer_resource(st->dpy, "mother_ship_hits","Integer");
+ st->MOTHER_SHIP=1;
+ st->mother = (struct mother_ship_state *) malloc(sizeof(struct mother_ship_state));
+ st->mother->lasers = (struct laser_state *) malloc(8*sizeof(struct laser_state));
+ st->mother->active = 0;
+ st->mother->death = 0;
+ st->mother->ship_color = st->r_color0;
+ st->mother->laser_color = st->r_color0;
+ }
+ }
+ else {
+ if(get_boolean_resource(st->dpy, "mother_ship","Boolean")) {
+ st->MOTHER_SHIP_WIDTH=get_integer_resource(st->dpy, "mother_ship_width","Integer");
+ st->MOTHER_SHIP_HEIGHT=get_integer_resource(st->dpy, "mother_ship_height","Integer");
+ st->MOTHER_SHIP_LASER=get_integer_resource(st->dpy, "mother_ship_laser","Integer");
+ st->MOTHER_SHIP_PERIOD=get_integer_resource(st->dpy, "mother_ship_period","Integer");
+ st->MOTHER_SHIP_HITS=get_integer_resource(st->dpy, "mother_ship_hits","Integer");
+ st->MOTHER_SHIP=1;
+ st->mother = (struct mother_ship_state *) malloc(sizeof(struct mother_ship_state));
+ st->mother->lasers = (struct laser_state *) malloc(8*sizeof(struct laser_state));
+ st->mother->active = 0;
+ st->mother->death = 0;
+ make_gc(st->mother->ship_color,"mother_ship_color0");
+ make_gc(st->mother->laser_color,"mother_ship_color1");
+ }
+
+ make_gc (st->s_color,"star_color");
+
+ make_gc (st->EXPLODE_COLOR_1,"explode_color_1");
+ make_gc (st->EXPLODE_COLOR_2,"explode_color_2");
+
+ make_gc (st->r_color0,"r_color0");
+ make_gc (st->r_color1,"r_color1");
+ make_gc (st->r_color2,"r_color2");
+ make_gc (st->r_color3,"r_color3");
+ make_gc (st->r_color4,"r_color4");
+ make_gc (st->r_color5,"r_color5");
+ make_gc (st->l_color0,"l_color0");
+ make_gc (st->l_color1,"l_color1");
+#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ st->black = 0;
+#else
+ make_gc (st->black,"background");
+#endif
+ }
+
+ return st;
+}
+
+
+static void
+blaster_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ XGetWindowAttributes (dpy, window, &st->xgwa);
+ XClearWindow (dpy, window);
+ init_stars (st);
+}
+
+static Bool
+blaster_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+blaster_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int i;
+ if (st->r_color0) XFreeGC (dpy, st->r_color0);
+ if (st->r_color1) XFreeGC (dpy, st->r_color1);
+ if (st->r_color2) XFreeGC (dpy, st->r_color2);
+ if (st->r_color3) XFreeGC (dpy, st->r_color3);
+ if (st->r_color4) XFreeGC (dpy, st->r_color4);
+ if (st->r_color5) XFreeGC (dpy, st->r_color5);
+ if (st->l_color0) XFreeGC (dpy, st->l_color0);
+ if (st->l_color1) XFreeGC (dpy, st->l_color1);
+ if (st->s_color) XFreeGC (dpy, st->s_color);
+ if (st->black) XFreeGC (dpy, st->black);
+ if (st->stars) free (st->stars);
+ if (st->mother) {
+ free (st->mother->lasers);
+ free (st->mother);
+ }
+ for (i = 0; i < st->NUM_ROBOTS; i++)
+ free (st->robots[i].lasers);
+ free (st->robots);
+ free (st);
+}
+
+
+static const char *blaster_defaults [] = {
+ ".lowrez: true",
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*r_color0: #FF00FF",
+ "*r_color1: #FFA500",
+ "*r_color2: #FFFF00",
+ "*r_color3: #FFFFFF",
+ "*r_color4: #0000FF",
+ "*r_color5: #00FFFF",
+ "*l_color0: #00FF00",
+ "*l_color1: #FF0000",
+ "*mother_ship_color0: #00008B",
+ "*mother_ship_color1: #FFFFFF",
+ "*explode_color_1: #FFFF00",
+ "*explode_color_2: #FFA500",
+ "*delay: 10000",
+ "*num_robots: 5",
+ "*num_lasers: 3",
+ "*mother_ship: false",
+ "*mother_ship_width: 25",
+ "*mother_ship_height: 7",
+ "*mother_ship_laser: 15",
+ "*mother_ship_period: 150",
+ "*mother_ship_hits: 10",
+ "*explode_size_1: 27",
+ "*explode_size_2: 19",
+ "*explode_size_3: 7",
+ "*num_stars: 50",
+ "*star_color: white",
+ "*move_stars: true",
+ "*move_stars_x: 2",
+ "*move_stars_y: 1",
+ "*move_stars_random: 0",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec blaster_options [] = {
+ /* These are the 6 robot colors */
+ { "-r_color0", ".r_color0", XrmoptionSepArg, 0 },
+ { "-r_color1", ".r_color1", XrmoptionSepArg, 0 },
+ { "-r_color2", ".r_color2", XrmoptionSepArg, 0 },
+ { "-r_color3", ".r_color3", XrmoptionSepArg, 0 },
+ { "-r_color4", ".r_color4", XrmoptionSepArg, 0 },
+ { "-r_color5", ".r_color5", XrmoptionSepArg, 0 },
+ /* These are the 2 laser colors that robots have */
+ { "-l_color0", ".l_color0", XrmoptionSepArg, 0 },
+ { "-l_color1", ".l_color1", XrmoptionSepArg, 0 },
+ /* These are the colors for the mothership and the mothership lasers */
+ { "-mother_ship_color0", ".mother_ship_color0", XrmoptionSepArg, 0},
+ { "-mother_ship_color1", ".mother_ship_color1", XrmoptionSepArg, 0},
+ /* These are the two colors of the animated explosion */
+ { "-explode_color_1", ".explode_color_1", XrmoptionSepArg, 0 },
+ { "-explode_color_2", ".explode_color_2", XrmoptionSepArg, 0 },
+ /* This is the delay in the main loop */
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ /* The number of robots and the number of lasers each robot has */
+ { "-num_robots", ".num_robots", XrmoptionSepArg, 0},
+ { "-num_lasers", ".num_lasers", XrmoptionSepArg, 0},
+ /* If this is set, a mothership will appear, otherwise no mothership */
+ { "-mother_ship", ".mother_ship", XrmoptionNoArg, "true"},
+ { "-no_mother_ship", ".mother_ship", XrmoptionNoArg, "false"},
+ /* This is the width, height, and laser length of the mothership */
+ { "-mother_ship_width", ".mother_ship_width", XrmoptionSepArg, 0},
+ { "-mother_ship_height", ".mother_ship_height", XrmoptionSepArg, 0},
+ { "-mother_ship_laser", ".mother_ship_laser", XrmoptionSepArg, 0},
+ /* This is the period which the mothership comes out, higher period==less often */
+ { "-mother_ship_period", ".mother_ship_period", XrmoptionSepArg, 0},
+ /* This is the number of hits it takes to destroy the mothership */
+ { "-mother_ship_hits", ".mother_ship_hits", XrmoptionSepArg, 0},
+ /* These are the size of the radius of the animated explosions */
+ { "-explode_size_1", ".explode_size_1", XrmoptionSepArg, 0},
+ { "-explode_size_2", ".explode_size_2", XrmoptionSepArg, 0},
+ { "-explode_size_3", ".explode_size_3", XrmoptionSepArg, 0},
+ /* This sets the number of stars in the star field, if this is set to 0, there will be no stars */
+ { "-num_stars", ".num_stars", XrmoptionSepArg, 0},
+ /* This is the color of the stars */
+ { "-star_color", ".star_color", XrmoptionSepArg, 0},
+ /* If this is true, the stars will move */
+ { "-move_stars", ".move_stars", XrmoptionNoArg, "true"},
+ /* This is the amount the stars will move in the x and y direction */
+ { "-move_stars_x", ".move_stars_x", XrmoptionSepArg, 0},
+ { "-move_stars_y", ".move_stars_y", XrmoptionSepArg, 0},
+ /* If this is non-zero, the stars will move randomly, but will not move more than this number in
+ either the x or y direction */
+ { "-move_stars_random", ".move_stars_random", XrmoptionSepArg, 0},
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Blaster", blaster)
diff --git a/hacks/blaster.man b/hacks/blaster.man
new file mode 100644
index 0000000..6ac369f
--- /dev/null
+++ b/hacks/blaster.man
@@ -0,0 +1,65 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+blaster - simulation of space combat
+.SH SYNOPSIS
+.B blaster
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-num_robots \fInumber\fP]
+[\-num_lasers \fInumber\fP]
+[\-num_stars \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Draws a simulation of flying space-combat robots (cleverly disguised as
+colored circles) doing battle in front of a moving star field.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-num_robots \fInumber\fP
+Robots. 2 - 50. Default: 5.
+.TP 8
+.B \-num_lasers \fInumber\fP
+Lasers. 1 - 100. Default: 3.
+.TP 8
+.B \-num_stars \fInumber\fP
+Stars. 5 - 200. Default: 50.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Jonathan Lin. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jonathan Lin.
diff --git a/hacks/blitspin.c b/hacks/blitspin.c
new file mode 100644
index 0000000..d27271d
--- /dev/null
+++ b/hacks/blitspin.c
@@ -0,0 +1,451 @@
+/* xscreensaver, Copyright (c) 1992-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* Rotate a bitmap using using bitblts.
+ The bitmap must be square, and must be a power of 2 in size.
+ This was translated from SmallTalk code which appeared in the
+ August 1981 issue of Byte magazine.
+
+ The input bitmap may be non-square, it is padded and centered
+ with the background color. Another way would be to subdivide
+ the bitmap into square components and rotate them independently
+ (and preferably in parallel), but I don't think that would be as
+ interesting looking.
+
+ It's too bad almost nothing uses blitter hardware these days,
+ or this might actually win.
+ */
+
+#include "screenhack.h"
+#include "pow2.h"
+#include "ximage-loader.h"
+#include <stdio.h>
+#include <time.h>
+
+#include "images/gen/som_png.h"
+
+/* Implementing this using XCopyArea doesn't work with color images on OSX.
+ This means that the Cocoa implementation of XCopyArea in jwxyz.m is
+ broken with the GXor, GXand, and/or the GXxor GC operations. This
+ probably means that (e.g.) "kCGBlendModeDarken" is not close enough
+ to being "GXand" to use for that. (It works with monochrome images,
+ just not color ones).
+
+ So, on OSX, we implement the blitter by hand. It is correct, but
+ orders of magnitude slower.
+ */
+#ifndef HAVE_JWXYZ
+# define USE_XCOPYAREA
+#endif
+
+struct state {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ int width, height, size;
+ Bool scale_up;
+ Pixmap self, temp, mask;
+# ifdef USE_XCOPYAREA
+ GC gc_set, gc_clear, gc_copy, gc_and, gc_or, gc_xor;
+# endif
+ GC gc;
+ int delay, delay2;
+ int duration;
+ Pixmap bitmap;
+ unsigned int fg, bg;
+
+ int qwad; /* fuckin' C, man... who needs namespaces? */
+ int first_time;
+ int last_w, last_h;
+
+ time_t start_time;
+ Bool loaded_p;
+ Bool load_ext_p;
+ async_load_state *img_loader;
+};
+
+static void display (struct state *, Pixmap);
+static void blitspin_init_2 (struct state *);
+
+#define copy_to(from, xoff, yoff, to, op) \
+ bitblt (st, st->from, st->to, op, 0, 0, \
+ st->size-(xoff), st->size-(yoff), (xoff), (yoff))
+
+#define copy_from(to, xoff, yoff, from, op) \
+ bitblt (st, st->from, st->to, op, (xoff), (yoff), \
+ st->size-(xoff), st->size-(yoff), 0, 0)
+
+
+#ifdef USE_XCOPYAREA
+# define bitblt(st, from, to, op, src_x, src_y, w, h, dst_x, dst_y) \
+ XCopyArea((st)->dpy, (from), (to), (st)->gc_##op, \
+ (src_x), (src_y), (w), (h), (dst_x), (dst_y))
+#else /* !USE_XCOPYAREA */
+
+# define bitblt(st, from, to, op, src_x, src_y, w, h, dst_x, dst_y) \
+ do_bitblt((st)->dpy, (from), (to), st->gc, GX##op, \
+ (src_x), (src_y), (w), (h), (dst_x), (dst_y))
+
+static void
+do_bitblt (Display *dpy, Drawable src, Drawable dst, GC gc, int op,
+ int src_x, int src_y,
+ unsigned int width, unsigned int height,
+ int dst_x, int dst_y)
+{
+ if (op == GXclear)
+ {
+ XSetForeground (dpy, gc, 0xFF000000); /* ARGB black for Cocoa */
+ XFillRectangle (dpy, dst, gc, dst_x, dst_y, width, height);
+ }
+ else if (op == GXset)
+ {
+ XSetForeground (dpy, gc, ~0L);
+ XFillRectangle (dpy, dst, gc, dst_x, dst_y, width, height);
+ }
+ else if (op == GXcopy)
+ {
+ XCopyArea (dpy, src, dst, gc, src_x, src_y, width, height, dst_x, dst_y);
+ }
+ else
+ {
+ XImage *srci = XGetImage (dpy, src, src_x, src_y, width, height,
+ ~0L, ZPixmap);
+ XImage *dsti = XGetImage (dpy, dst, dst_x, dst_y, width, height,
+ ~0L, ZPixmap);
+ unsigned long *out = (unsigned long *) dsti->data;
+ unsigned long *in = (unsigned long *) srci->data;
+ unsigned long *end = (in + (height * srci->bytes_per_line
+ / sizeof(unsigned long)));
+ switch (op)
+ {
+ case GXor: while (in < end) { *out++ |= *in++; } break;
+ case GXand: while (in < end) { *out++ &= *in++; } break;
+ case GXxor: while (in < end) { *out++ ^= *in++; } break;
+ default: abort();
+ }
+ XPutImage (dpy, dst, gc, dsti, 0, 0, dst_x, dst_y, width, height);
+ XDestroyImage (srci);
+ XDestroyImage (dsti);
+ }
+}
+
+#endif /* !USE_XCOPYAREA */
+
+
+
+static unsigned long
+blitspin_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int this_delay = st->delay;
+ int qwad;
+
+ if (st->img_loader) /* still loading */
+ {
+ st->img_loader = load_image_async_simple (st->img_loader, 0, 0, 0, 0, 0);
+
+ if (!st->img_loader) { /* just finished */
+ st->first_time = 0;
+ st->loaded_p = True;
+ st->qwad = -1;
+ st->start_time = time ((time_t *) 0);
+ blitspin_init_2 (st);
+ }
+
+ /* Rotate nothing if the very first image is not yet loaded */
+ if (! st->loaded_p)
+ return this_delay;
+ }
+
+ if (!st->img_loader &&
+ st->load_ext_p &&
+ st->start_time + st->duration < time ((time_t *) 0)) {
+ /* Start a new image loading, but keep rotating the old image
+ until the new one arrives. */
+ st->img_loader = load_image_async_simple (0, st->xgwa.screen, st->window,
+ st->bitmap, 0, 0);
+ }
+
+ if (st->qwad == -1)
+ {
+ bitblt(st, st->mask, st->mask, clear,0,0, st->size, st->size, 0,0);
+ bitblt(st, st->mask, st->mask, set, 0,0, st->size>>1, st->size>>1, 0,0);
+ st->qwad = st->size>>1;
+ }
+
+ if (st->first_time)
+ {
+ st->first_time = 0;
+ display (st, st->self);
+ return st->delay2;
+ }
+
+ /* for (st->qwad = st->size>>1; st->qwad > 0; st->qwad>>=1) */
+
+ qwad = st->qwad;
+
+ copy_to (mask, 0, 0, temp, copy); /* 1 */
+ copy_to (mask, 0, qwad, temp, or); /* 2 */
+ copy_to (self, 0, 0, temp, and); /* 3 */
+ copy_to (temp, 0, 0, self, xor); /* 4 */
+ copy_from (temp, qwad, 0, self, xor); /* 5 */
+ copy_from (self, qwad, 0, self, or); /* 6 */
+ copy_to (temp, qwad, 0, self, xor); /* 7 */
+ copy_to (self, 0, 0, temp, copy); /* 8 */
+ copy_from (temp, qwad, qwad, self, xor); /* 9 */
+ copy_to (mask, 0, 0, temp, and); /* A */
+ copy_to (temp, 0, 0, self, xor); /* B */
+ copy_to (temp, qwad, qwad, self, xor); /* C */
+ copy_from (mask, qwad>>1, qwad>>1, mask, and); /* D */
+ copy_to (mask, qwad, 0, mask, or); /* E */
+ copy_to (mask, 0, qwad, mask, or); /* F */
+ display (st, st->self);
+
+ st->qwad >>= 1;
+ if (st->qwad == 0) /* done with this round */
+ {
+ st->qwad = -1;
+ this_delay = st->delay2;
+ }
+
+ return this_delay;
+}
+
+
+static int
+blitspin_to_pow2(int n, Bool up)
+{
+ int pow2 = to_pow2 (n);
+ if (n == pow2)
+ return n;
+ else
+ return up ? pow2 : pow2 >> 1;
+}
+
+static void *
+blitspin_init (Display *d_arg, Window w_arg)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ char *bitmap_name;
+
+ st->dpy = d_arg;
+ st->window = w_arg;
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ st->fg = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ st->bg = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "background", "Background");
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ st->delay2 = get_integer_resource (st->dpy, "delay2", "Integer");
+ st->duration = get_integer_resource (st->dpy, "duration", "Seconds");
+ if (st->delay < 0) st->delay = 0;
+ if (st->delay2 < 0) st->delay2 = 0;
+ if (st->duration < 1) st->duration = 1;
+
+ st->start_time = time ((time_t *) 0);
+
+ bitmap_name = get_string_resource (st->dpy, "bitmap", "Bitmap");
+ if (! bitmap_name || !*bitmap_name)
+ bitmap_name = "(default)";
+
+ if (!strcasecmp (bitmap_name, "(default)") ||
+ !strcasecmp (bitmap_name, "default"))
+ bitmap_name = "(screen)";
+
+ if (!strcasecmp (bitmap_name, "(builtin)") ||
+ !strcasecmp (bitmap_name, "builtin"))
+ {
+ Pixmap mask = 0;
+ Pixmap pixmap = image_data_to_pixmap (st->dpy, st->window,
+ som_png, sizeof(som_png),
+ &st->width, &st->height, &mask);
+ XGCValues gcv;
+ GC gc;
+ gcv.foreground = st->bg;
+ gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ st->bitmap = XCreatePixmap (st->dpy, st->window,
+ st->xgwa.width, st->xgwa.height,
+ st->xgwa.depth);
+ XFillRectangle (st->dpy, st->bitmap, gc, 0, 0, st->width, st->height);
+ XSetClipMask (st->dpy, gc, mask);
+ XCopyArea (st->dpy, pixmap, st->bitmap, gc, 0, 0, st->width, st->height,
+ 0, 0);
+ XFreeGC (st->dpy, gc);
+ XFreePixmap (st->dpy, pixmap);
+ XFreePixmap (st->dpy, mask);
+
+ st->scale_up = True; /* definitely. */
+ st->loaded_p = True;
+ blitspin_init_2 (st);
+ }
+ else if (!strcasecmp (bitmap_name, "(screen)") ||
+ !strcasecmp (bitmap_name, "screen"))
+ {
+ st->bitmap = XCreatePixmap (st->dpy, st->window,
+ st->xgwa.width, st->xgwa.height,
+ st->xgwa.depth);
+ st->width = st->xgwa.width;
+ st->height = st->xgwa.height;
+ st->scale_up = True; /* maybe? */
+ st->load_ext_p = True;
+ st->img_loader = load_image_async_simple (0, st->xgwa.screen, st->window,
+ st->bitmap, 0, 0);
+ }
+ else
+ {
+ st->bitmap = file_to_pixmap (st->dpy, st->window, bitmap_name,
+ &st->width, &st->height, 0);
+ st->scale_up = True; /* probably? */
+ blitspin_init_2 (st);
+ }
+
+ return st;
+}
+
+
+static void
+blitspin_init_2 (struct state *st)
+{
+ XGCValues gcv;
+
+ /* make it square */
+ st->size = (st->width < st->height) ? st->height : st->width;
+ /* round up to power of 2 */
+ st->size = blitspin_to_pow2(st->size, st->scale_up);
+ { /* don't exceed screen size */
+ int s = XScreenNumberOfScreen(st->xgwa.screen);
+ int w = blitspin_to_pow2(XDisplayWidth(st->dpy, s), False);
+ int h = blitspin_to_pow2(XDisplayHeight(st->dpy, s), False);
+ if (st->size > w) st->size = w;
+ if (st->size > h) st->size = h;
+ }
+
+ if (st->self) XFreePixmap (st->dpy, st->self);
+ if (st->temp) XFreePixmap (st->dpy, st->temp);
+ if (st->mask) XFreePixmap (st->dpy, st->mask);
+
+ st->self = XCreatePixmap (st->dpy, st->window, st->size, st->size,
+ st->xgwa.depth);
+ st->temp = XCreatePixmap (st->dpy, st->window, st->size, st->size,
+ st->xgwa.depth);
+ st->mask = XCreatePixmap (st->dpy, st->window, st->size, st->size,
+ st->xgwa.depth);
+ gcv.foreground = (st->xgwa.depth == 1 ? 1 : (~0));
+
+# ifdef USE_XCOPYAREA
+# define make_gc(op) \
+ gcv.function=GX##op; \
+ if (st->gc_##op) XFreeGC (st->dpy, st->gc_##op); \
+ st->gc_##op = XCreateGC (st->dpy, st->self, GCFunction|GCForeground, &gcv)
+ make_gc(set);
+ make_gc(clear);
+ make_gc(copy);
+ make_gc(and);
+ make_gc(or);
+ make_gc(xor);
+# endif /* USE_XCOPYAREA */
+
+ gcv.foreground = gcv.background = st->bg;
+ if (st->gc) XFreeGC (st->dpy, st->gc);
+ st->gc = XCreateGC (st->dpy, st->window, GCForeground|GCBackground, &gcv);
+ /* Clear st->self to the background color (not to 0, which 'clear' does.) */
+ XFillRectangle (st->dpy, st->self, st->gc, 0, 0, st->size, st->size);
+ XSetForeground (st->dpy, st->gc, st->fg);
+
+ XCopyArea (st->dpy, st->bitmap, st->self, st->gc, 0, 0,
+ st->width, st->height,
+ (st->size - st->width) >> 1,
+ (st->size - st->height) >> 1);
+
+ st->qwad = -1;
+ st->first_time = 1;
+}
+
+static void
+display (struct state *st, Pixmap pixmap)
+{
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ if (st->xgwa.width != st->last_w ||
+ st->xgwa.height != st->last_h)
+ {
+ XClearWindow (st->dpy, st->window);
+ st->last_w = st->xgwa.width;
+ st->last_h = st->xgwa.height;
+ }
+ if (st->xgwa.depth != 1)
+ XCopyArea (st->dpy, pixmap, st->window, st->gc, 0, 0, st->size, st->size,
+ (st->xgwa.width - st->size) >> 1,
+ (st->xgwa.height - st->size) >> 1);
+ else
+ XCopyPlane (st->dpy, pixmap, st->window, st->gc, 0, 0, st->size, st->size,
+ (st->xgwa.width - st->size) >> 1,
+ (st->xgwa.height - st->size) >> 1,
+ 1);
+/*
+ XDrawRectangle (st->dpy, st->window, st->gc,
+ ((st->xgwa.width - st->size) >> 1) - 1,
+ ((st->xgwa.height - st->size) >> 1) - 1,
+ st->size+2, st->size+2);
+*/
+}
+
+static void
+blitspin_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+blitspin_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->start_time = 0;
+ return True;
+ }
+ return False;
+}
+
+static void
+blitspin_free (Display *dpy, Window window, void *closure)
+{
+}
+
+
+static const char *blitspin_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ ".fpsSolid: true",
+ "*delay: 500000",
+ "*delay2: 500000",
+ "*duration: 120",
+ "*bitmap: (default)",
+ "*geometry: 1080x1080",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec blitspin_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-delay2", ".delay2", XrmoptionSepArg, 0 },
+ { "-duration", ".duration", XrmoptionSepArg, 0 },
+ { "-bitmap", ".bitmap", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("BlitSpin", blitspin)
diff --git a/hacks/blitspin.man b/hacks/blitspin.man
new file mode 100644
index 0000000..4a221da
--- /dev/null
+++ b/hacks/blitspin.man
@@ -0,0 +1,96 @@
+.TH XScreenSaver 1 "24-Nov-97" "X Version 11"
+.SH NAME
+blitspin - rotate a bitmap in an interesting way
+.SH SYNOPSIS
+.B blitspin
+[\-display \fIhost:display.screen\fP]
+[\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root]
+[\-mono] [\-install] [\-visual \fIvisual\fP] [\-bitmap \fIfilename\fP]
+[\-delay \fIusecs\fP] [\-delay2 \fIusecs\fP] [\-duration \fIsecs\fP]
+.SH DESCRIPTION
+The \fIblitspin\fP program repeatedly rotates a bitmap by 90 degrees by
+using logical operations: the bitmap is divided into quadrants, and the
+quadrants are shifted clockwise. Then the same thing is done again with
+progressively smaller quadrants, except that all sub-quadrants of a
+given size are rotated in parallel. So this takes \fBO(16*log2(N))\fP
+blits of size NxN, with the limitation that the image must be square,
+and the size must be a power of 2.
+.SH OPTIONS
+.I blitspin
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-bitmap \fIfilename\fP
+The file name of a bitmap to rotate. It need not be square: it
+will be padded with the background color. If unspecified or the
+string \fI(default)\fP, a builtin bitmap is used.
+
+If support for the \fIXPM\fP library was enabled at compile-time,
+the specified file may be in \fIXPM\fP format as well as \fIXBM\fP, and
+thus may be a color image.
+
+The \fB*bitmapFilePath\fP resource will be searched if the bitmap
+name is not a fully-qualified pathname.
+.TP 8
+.B \-grab\-screen
+If this option is specified, then the image which is spun will be grabbed
+from the portion of the screen underlying the blitspin window, or from
+the system's video input, or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP file;
+see
+.BR xscreensaver-demo (1)
+for more details.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How long to delay between steps of the rotation process, in microseconds.
+Default is 500000, one-half second.
+.TP 8
+.B \-duration \fIseconds\fP
+How long to run before loading a new image. Default 120 seconds.
+.TP 8
+.B \-delay2 \fImicroseconds\fP
+How long to delay between each 90-degree rotation, in microseconds.
+Default is 500000, one-half second.
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver-demo (1),
+.BR xscreensaver-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 1992, 1993, 1997, 2001 by Jamie Zawinski.
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation. No
+representations are made about the suitability of this software for any
+purpose. It is provided "as is" without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 17-aug-92.
+
+Based on SmallTalk code which appeared in the August 1981 issue of Byte
+magazine.
diff --git a/hacks/bouboule.c b/hacks/bouboule.c
new file mode 100644
index 0000000..1ac0425
--- /dev/null
+++ b/hacks/bouboule.c
@@ -0,0 +1,858 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ Ported from xlockmore 4.03a12 to be a standalone program and thus usable
+ with xscreensaver by Jamie Zawinski <jwz@jwz.org> on 15-May-97.
+
+ Original copyright notice from xlock.c:
+
+ * Copyright (c) 1988-91 by Patrick J. Naughton.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ */
+
+#if 0
+static const char sccsid[] = "@(#)bouboule.c 4.00 97/01/01 xlockmore";
+#endif
+
+/*-
+ * bouboule.c (bouboule mode for xlockmore)
+ *
+ * Sort of starfield for xlockmore. I found that making a starfield for
+ * a 3D engine and thought it could be a nice lock mode. For a real starfield,
+ * I only scale the sort of sphere you see to the whole sky and clip the stars
+ * to the camera screen.
+ *
+ * Code Copyright 1996 by Jeremie PETIT (jeremie_petit@geocities.com)
+ *
+ * Use: batchcount is the number of stars.
+ * cycles is the maximum size for a star
+ *
+ * 15-May-97: jwz@jwz.org: turned into a standalone program.
+ * 04-Sep-96: Added 3d support (Henrik Theiling, theiling@coli-uni-sb.de)
+ * 20-Feb-96: Added tests so that already malloced objects are not
+ * malloced twice, thanks to the report from <mccomb@interport.net>
+ * 01-Feb-96: Patched by Jouk Jansen <joukj@alpha.chem.uva.nl> for VMS
+ * Patched by <bagleyd@bigfoot.com> for TrueColor displays
+ * 30-Jan-96: Wrote all that I wanted to.
+ *
+ * DONE: Build up a XArc list and Draw everything once with XFillArcs
+ * That idea came from looking at swarm code.
+ * DONE: Add an old arcs list for erasing.
+ * DONE: Make center of starfield SinVariable.
+ * DONE: Add some random in the sinvary() function.
+ * DONE: check time for erasing the stars with the two methods and use the
+ * better one. Note that sometimes the time difference between
+ * beginning of erasing and its end is negative! I check this, and
+ * do not use this result when it occurs. If all values are negative,
+ * the erasing will continue being done in the currently tested mode.
+ * DONE: Allow stars size customization.
+ * DONE: Make sizey be no less than half sizex or no bigger than twice sizex.
+ *
+ * IDEA: A simple check can be performed to know which stars are "behind"
+ * and which are "in front". So is possible to very simply change
+ * the drawing mode for these two sorts of stars. BUT: this would lead
+ * to a rewrite of the XArc list code because drawing should be done
+ * in two steps: "behind" stars then "in front" stars. Also, what could
+ * be the difference between the rendering of these two types of stars?
+ * IDEA: Calculate the distance of each star to the "viewer" and render the
+ * star accordingly to this distance. Same remarks as for previous
+ * ideas can be pointed out. This would even lead to reget the old stars
+ * drawing code, that has been replaced by the XFillArcs. On another
+ * hand, this would allow particular stars (own color, shape...), as
+ * far as they would be individually drawn. One should be careful to
+ * draw them according to their distance, that is not drawing a far
+ * star after a close one.
+ */
+
+#ifdef STANDALONE
+# define DEFAULTS "*count: 100 \n" \
+ "*size: 15 \n" \
+ "*delay: 20000 \n" \
+ "*ncolors: 64 \n" \
+ "*use3d: True \n" \
+ "*delta3d: 1.5 \n" \
+ "*right3d: red \n" \
+ "*left3d: blue \n" \
+ "*both3d: magenta \n" \
+ "*none3d: black \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n"
+
+# define SMOOTH_COLORS
+# define release_bouboule 0
+# define bouboule_handle_event 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+# define ENTRYPOINT /**/
+#endif /* !STANDALONE */
+
+ENTRYPOINT ModeSpecOpt bouboule_opts = {
+ 0, NULL, 0, NULL, NULL };
+
+#define USEOLDXARCS 1 /* If 1, we use old xarcs list for erasing.
+ * else we just roughly erase the window.
+ * This mainly depends on the number of stars,
+ * because when they are many, it is faster to
+ * erase the whole window than to erase each star
+ */
+
+#if HAVE_GETTIMEOFDAY
+#define ADAPT_ERASE 1 /* If 1, then we try ADAPT_CHECKS black XFillArcs,
+ * and after, ADAPT_CHECKS XFillRectangle.
+ * We check which method seems better, knowing that
+ * XFillArcs is generally visually better. So we
+ * consider that XFillArcs is still better if its time
+ * is about XFillRectangle * ADAPT_ARC_PREFERED
+ * We need gettimeofday
+ * for this... Does it exist on other systems ? Do we
+ * have to use another function for others ?
+ * This value overrides USEOLDXARCS.
+ */
+
+#ifdef USE_XVMSUTILS
+# if 0
+# include "../xvmsutils/unix_time.h"
+# else
+# include <X11/unix_time.h>
+# endif
+#endif
+
+#include <sys/time.h>
+
+#define ADAPT_CHECKS 50
+#define ADAPT_ARC_PREFERED 150 /* Maybe the value that is the most important
+ * for adapting to a system */
+#endif
+
+#define dtor(x) (((x) * M_PI) / 180.0) /* Degrees to radians */
+
+#define MINSTARS 1
+#define MINSIZE 1
+/* jwz: I think slower color changes look better */
+#define COLOR_CHANGES 50 /* How often we change colors (1 = always)
+ * This value should be tuned accordingly to
+ * the number of stars */
+#define MAX_SIZEX_SIZEY 2. /* This controls whether the sphere can be very
+ * very large and have a small height (or the
+ * opposite) or no. */
+
+#define THETACANRAND 80 /* percentage of changes for the speed of
+ * change of the 3 theta values */
+#define SIZECANRAND 80 /* percentage of changes for the speed of
+ * change of the sizex and sizey values */
+#define POSCANRAND 80 /* percentage of changes for the speed of
+ * change of the x and y values */
+/* Note that these XXXCANRAND values can be 0, that is no rand acceleration *
+ variation. */
+
+#define VARRANDALPHA (NRAND((int) (M_PI * 1000.0))/1000.0)
+#define VARRANDSTEP (M_PI/(NRAND(100)+100.0))
+#define VARRANDMIN (-70.0)
+#define VARRANDMAX 70.0
+
+#define MINZVAL 100 /* stars can come this close */
+#define SCREENZ 2000 /* this is where the screen is */
+#define MAXZVAL 10000 /* stars can go this far away */
+
+#define GETZDIFF(z) ((MI_DELTA3D(mi))*20.0*(1.0-(SCREENZ)/(z+1000)))
+#define MAXDIFF MAX(-GETZDIFF(MINZVAL),GETZDIFF(MAXZVAL))
+
+/* These values are the variation parameters of the acceleration variation *
+ of the SinVariables that are randomized. */
+
+/******************************/
+typedef struct SinVariableStruct
+/******************************/
+{
+ double alpha; /*
+ * Alpha is the current state of the sinvariable
+ * alpha should be initialized to a value between
+ * 0.0 and 2 * M_PI
+ */
+ double step; /*
+ * Speed of evolution of alpha. It should be a reasonable
+ * fraction of 2 * M_PI. This value directly influence
+ * the variable speed of variation.
+ */
+ double minimum; /* Minimum value for the variable */
+ double maximum; /* Maximum value for the variable */
+ double value; /* Current value */
+ int mayrand; /* Flag for knowing whether some randomization can be
+ * applied to the variable */
+ struct SinVariableStruct *varrand; /* Evolving Variable: the variation of
+ * alpha */
+} SinVariable;
+
+/***********************/
+typedef struct StarStruct
+/***********************/
+{
+ double x, y, z; /* Position of the star */
+ short size; /* Try to guess */
+} Star;
+
+/****************************/
+typedef struct StarFieldStruct
+/****************************/
+{
+ short width, height; /* width and height of the starfield window */
+ short max_star_size; /* Maximum radius for stars. stars radius will
+ * vary from 1 to MAX_STAR_SIZE */
+ SinVariable x; /* Evolving variables: */
+ SinVariable y; /* Center of the field on the screen */
+ SinVariable z;
+ SinVariable sizex; /* Evolving variable: half width of the field */
+ SinVariable sizey; /* Evolving variable: half height of the field */
+ SinVariable thetax; /* Evolving Variables: */
+ SinVariable thetay; /* rotation angles of the starfield */
+ SinVariable thetaz; /* around x, y and z local axis */
+ Star *star; /* List of stars */
+ XArc *xarc; /* Current List of arcs */
+ XArc *xarcleft; /* additional list for the left arcs */
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+ XArc *oldxarc; /* Old list of arcs */
+ XArc *oldxarcleft;
+#endif
+ unsigned long color; /* Current color of the starfield */
+ int colorp; /* Pointer to color of the starfield */
+ int NbStars; /* Number of stars */
+ short colorchange; /* Counter for the color change */
+#if (ADAPT_ERASE == 1)
+ short hasbeenchecked;
+ long rect_time;
+ long xarc_time;
+#endif
+} StarField;
+
+static StarField *starfield = NULL;
+
+/*********/
+static void
+sinvary(SinVariable * v)
+/*********/
+
+{
+ v->value = v->minimum +
+ (v->maximum - v->minimum) * (sin(v->alpha) + 1.0) / 2.0;
+
+ if (v->mayrand == 0)
+ v->alpha += v->step;
+ else {
+ int vaval = NRAND(100);
+
+ if (vaval <= v->mayrand)
+ sinvary(v->varrand);
+ v->alpha += (100.0 + (v->varrand->value)) * v->step / 100.0;
+ }
+
+ if (v->alpha > 2 * M_PI)
+ v->alpha -= 2 * M_PI;
+}
+
+/*************************************************/
+static void
+sininit(SinVariable * v,
+ double alpha, double step, double minimum, double maximum,
+ short int mayrand)
+{
+ v->alpha = alpha;
+ v->step = step;
+ v->minimum = minimum;
+ v->maximum = maximum;
+ v->mayrand = mayrand;
+ if (mayrand != 0) {
+ if (v->varrand == NULL)
+ v->varrand = (SinVariable *) calloc(1, sizeof (SinVariable));
+ sininit(v->varrand,
+ VARRANDALPHA,
+ VARRANDSTEP,
+ VARRANDMIN,
+ VARRANDMAX,
+ 0);
+ sinvary(v->varrand);
+ }
+ /* We calculate the values at least once for initialization */
+ sinvary(v);
+}
+
+static void
+sinfree(SinVariable * point)
+{
+ SinVariable *temp, *next;
+
+ next = point->varrand;
+ while (next) {
+ temp = next;
+ next = temp->varrand;
+ (void) free((void *) temp);
+ }
+}
+
+
+/***************/
+ENTRYPOINT void
+init_bouboule(ModeInfo * mi)
+/***************/
+
+/*-
+ * The stars init part was first inspirated from the net3d game starfield
+ * code. But net3d starfield is not really 3d starfield, and I needed real 3d,
+ * so only remains the net3d starfield initialization main idea, that is
+ * the stars distribution on a sphere (theta and omega computing)
+ */
+{
+ StarField *sp;
+ int size = MI_SIZE(mi);
+ int i;
+ double theta, omega;
+
+ if (MI_WIDTH(mi) > 2560) size *= 2; /* Retina displays */
+
+ MI_INIT (mi, starfield);
+ sp = &starfield[MI_SCREEN(mi)];
+
+ sp->width = MI_WIN_WIDTH(mi);
+ sp->height = MI_WIN_HEIGHT(mi);
+
+ /* use the right `black' pixel values: */
+ if (MI_WIN_IS_INSTALL(mi) && MI_WIN_IS_USE3D(mi)) {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_NONE_COLOR(mi));
+ XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ 0, 0, sp->width, sp->height);
+ } else
+ XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+
+ if (size < -MINSIZE)
+ sp->max_star_size = NRAND(-size - MINSIZE + 1) + MINSIZE;
+ else if (size < MINSIZE)
+ sp->max_star_size = MINSIZE;
+ else
+ sp->max_star_size = size;
+
+ sp->NbStars = MI_BATCHCOUNT(mi);
+ if (sp->NbStars < -MINSTARS) {
+ if (sp->star) {
+ (void) free((void *) sp->star);
+ sp->star = NULL;
+ }
+ if (sp->xarc) {
+ (void) free((void *) sp->xarc);
+ sp->xarc = NULL;
+ }
+ if (sp->xarcleft) {
+ (void) free((void *) sp->xarcleft);
+ sp->xarcleft = NULL;
+ }
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+ if (sp->oldxarc) {
+ (void) free((void *) sp->oldxarc);
+ sp->oldxarc = NULL;
+ }
+ if (sp->oldxarcleft) {
+ (void) free((void *) sp->oldxarcleft);
+ sp->oldxarcleft = NULL;
+ }
+#endif
+ sp->NbStars = NRAND(-sp->NbStars - MINSTARS + 1) + MINSTARS;
+ } else if (sp->NbStars < MINSTARS)
+ sp->NbStars = MINSTARS;
+
+ /* We get memory for lists of objects */
+ if (sp->star == NULL)
+ sp->star = (Star *) malloc(sp->NbStars * sizeof (Star));
+ if (sp->xarc == NULL)
+ sp->xarc = (XArc *) malloc(sp->NbStars * sizeof (XArc));
+ if (MI_WIN_IS_USE3D(mi) && sp->xarcleft == NULL)
+ sp->xarcleft = (XArc *) malloc(sp->NbStars * sizeof (XArc));
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+ if (sp->oldxarc == NULL)
+ sp->oldxarc = (XArc *) malloc(sp->NbStars * sizeof (XArc));
+ if (MI_WIN_IS_USE3D(mi) && sp->oldxarcleft == NULL)
+ sp->oldxarcleft = (XArc *) malloc(sp->NbStars * sizeof (XArc));
+#endif
+
+ {
+ /* We initialize evolving variables */
+ sininit(&sp->x,
+ NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0),
+ ((double) sp->width) / 4.0,
+ 3.0 * ((double) sp->width) / 4.0,
+ POSCANRAND);
+ sininit(&sp->y,
+ NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0),
+ ((double) sp->height) / 4.0,
+ 3.0 * ((double) sp->height) / 4.0,
+ POSCANRAND);
+
+ /* for z, we have to ensure that the bouboule does not get behind */
+ /* the eyes of the viewer. His/Her eyes are at 0. Because the */
+ /* bouboule uses the x-radius for the z-radius, too, we have to */
+ /* use the x-values. */
+ sininit(&sp->z,
+ NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0),
+ ((double) sp->width / 2.0 + MINZVAL),
+ ((double) sp->width / 2.0 + MAXZVAL),
+ POSCANRAND);
+
+
+ sininit(&sp->sizex,
+ NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0),
+ MIN(((double) sp->width) - sp->x.value,
+ sp->x.value) / 5.0,
+ MIN(((double) sp->width) - sp->x.value,
+ sp->x.value),
+ SIZECANRAND);
+
+ sininit(&sp->sizey,
+ NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0),
+ MAX(sp->sizex.value / MAX_SIZEX_SIZEY,
+ sp->sizey.maximum / 5.0),
+ MIN(sp->sizex.value * MAX_SIZEX_SIZEY,
+ MIN(((double) sp->height) -
+ sp->y.value,
+ sp->y.value)),
+ SIZECANRAND);
+
+ sininit(&sp->thetax,
+ NRAND(3142) / 1000.0, M_PI / (NRAND(200) + 200.0),
+ -M_PI, M_PI,
+ THETACANRAND);
+ sininit(&sp->thetay,
+ NRAND(3142) / 1000.0, M_PI / (NRAND(200) + 200.0),
+ -M_PI, M_PI,
+ THETACANRAND);
+ sininit(&sp->thetaz,
+ NRAND(3142) / 1000.0, M_PI / (NRAND(400) + 400.0),
+ -M_PI, M_PI,
+ THETACANRAND);
+ }
+ for (i = 0; i < sp->NbStars; i++) {
+ Star *star;
+ XArc *arc = NULL, *arcleft = NULL;
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+ XArc *oarc = NULL, *oarcleft = NULL;
+#endif
+
+ star = &(sp->star[i]);
+ arc = &(sp->xarc[i]);
+ if (MI_WIN_IS_USE3D(mi))
+ arcleft = &(sp->xarcleft[i]);
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+ oarc = &(sp->oldxarc[i]);
+ if (MI_WIN_IS_USE3D(mi))
+ oarcleft = &(sp->oldxarcleft[i]);
+#endif
+ /* Elevation and bearing of the star */
+ theta = dtor((NRAND(1800)) / 10.0 - 90.0);
+ omega = dtor((NRAND(3600)) / 10.0 - 180.0);
+
+ /* Stars coordinates in a 3D space */
+ star->x = cos(theta) * sin(omega);
+ star->y = sin(omega) * sin(theta);
+ star->z = cos(omega);
+
+ /* We set the stars size */
+ star->size = NRAND(2 * sp->max_star_size);
+ if (star->size < sp->max_star_size)
+ star->size = 0;
+ else
+ star->size -= sp->max_star_size;
+
+ /* We set default values for the XArc lists elements */
+ arc->x = arc->y = 0;
+ if (MI_WIN_IS_USE3D(mi)) {
+ arcleft->x = arcleft->y = 0;
+ }
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+ oarc->x = oarc->y = 0;
+ if (MI_WIN_IS_USE3D(mi)) {
+ oarcleft->x = oarcleft->y = 0;
+ }
+#endif
+ arc->width = 2 + star->size;
+ arc->height = 2 + star->size;
+ if (MI_WIN_IS_USE3D(mi)) {
+ arcleft->width = 2 + star->size;
+ arcleft->height = 2 + star->size;
+ }
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+ oarc->width = 2 + star->size;
+ oarc->height = 2 + star->size;
+ if (MI_WIN_IS_USE3D(mi)) {
+ oarcleft->width = 2 + star->size;
+ oarcleft->height = 2 + star->size;
+ }
+#endif
+
+ arc->angle1 = 0;
+ arc->angle2 = 360 * 64;
+ if (MI_WIN_IS_USE3D(mi)) {
+ arcleft->angle1 = 0;
+ arcleft->angle2 = 360 * 64;
+ }
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+ oarc->angle1 = 0;
+ oarc->angle2 = 360 * 64; /* ie. we draw whole disks:
+ * from 0 to 360 degrees */
+ if (MI_WIN_IS_USE3D(mi)) {
+ oarcleft->angle1 = 0;
+ oarcleft->angle2 = 360 * 64;
+ }
+#endif
+ }
+
+ if (MI_NPIXELS(mi) > 2)
+ sp->colorp = NRAND(MI_NPIXELS(mi));
+ /* We set up the starfield color */
+ if (!MI_WIN_IS_USE3D(mi) && MI_NPIXELS(mi) > 2)
+ sp->color = MI_PIXEL(mi, sp->colorp);
+ else
+ sp->color = MI_WIN_WHITE_PIXEL(mi);
+
+#if (ADAPT_ERASE == 1)
+ /* We initialize the adaptation code for screen erasing */
+ sp->hasbeenchecked = ADAPT_CHECKS * 2;
+ sp->rect_time = 0;
+ sp->xarc_time = 0;
+#endif
+}
+
+/****************/
+ENTRYPOINT void
+draw_bouboule(ModeInfo * mi)
+/****************/
+
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GC gc = MI_GC(mi);
+ StarField *sp = &starfield[MI_SCREEN(mi)];
+ int i, diff = 0;
+ double CX, CY, CZ, SX, SY, SZ;
+ Star *star;
+ XArc *arc = NULL, *arcleft = NULL;
+
+#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+#endif
+
+#if (ADAPT_ERASE == 1)
+ struct timeval tv1;
+ struct timeval tv2;
+
+#endif
+
+#if ((USEOLDXARCS == 0) || (ADAPT_ERASE == 1))
+ short x_1, y_1, x_2, y_2;
+
+ /* bounding rectangle around the old starfield,
+ * for erasing with the smallest rectangle
+ * instead of filling the whole screen */
+ int maxdiff = 0; /* maximal distance between left and right */
+
+ /* star in 3d mode, otherwise 0 */
+#endif
+
+#if ((USEOLDXARCS == 0) || (ADAPT_ERASE == 1))
+ if (MI_WIN_IS_USE3D(mi)) {
+ maxdiff = (int) MAXDIFF;
+ }
+ x_1 = (int) sp->x.value - (int) sp->sizex.value -
+ sp->max_star_size - maxdiff;
+ y_1 = (int) sp->y.value - (int) sp->sizey.value -
+ sp->max_star_size;
+ x_2 = 2 * ((int) sp->sizex.value + sp->max_star_size + maxdiff);
+ y_2 = 2 * ((int) sp->sizey.value + sp->max_star_size);
+#endif
+ /* We make variables vary. */
+ sinvary(&sp->thetax);
+ sinvary(&sp->thetay);
+ sinvary(&sp->thetaz);
+
+ sinvary(&sp->x);
+ sinvary(&sp->y);
+ if (MI_WIN_IS_USE3D(mi))
+ sinvary(&sp->z);
+
+ /* A little trick to prevent the bouboule from being
+ * bigger than the screen */
+ sp->sizex.maximum =
+ MIN(((double) sp->width) - sp->x.value,
+ sp->x.value);
+ sp->sizex.minimum = sp->sizex.maximum / 3.0;
+
+ /* Another trick to make the ball not too flat */
+ sp->sizey.minimum =
+ MAX(sp->sizex.value / MAX_SIZEX_SIZEY,
+ sp->sizey.maximum / 3.0);
+ sp->sizey.maximum =
+ MIN(sp->sizex.value * MAX_SIZEX_SIZEY,
+ MIN(((double) sp->height) - sp->y.value,
+ sp->y.value));
+
+ sinvary(&sp->sizex);
+ sinvary(&sp->sizey);
+
+ /*
+ * We calculate the rotation matrix values. We just make the
+ * rotation on the fly, without using a matrix.
+ * Star positions are recorded as unit vectors pointing in various
+ * directions. We just make them all rotate.
+ */
+ CX = cos(sp->thetax.value);
+ SX = sin(sp->thetax.value);
+ CY = cos(sp->thetay.value);
+ SY = sin(sp->thetay.value);
+ CZ = cos(sp->thetaz.value);
+ SZ = sin(sp->thetaz.value);
+
+ for (i = 0; i < sp->NbStars; i++) {
+ star = &(sp->star[i]);
+ arc = &(sp->xarc[i]);
+ if (MI_WIN_IS_USE3D(mi)) {
+ arcleft = &(sp->xarcleft[i]);
+ /* to help the eyes, the starfield is always as wide as */
+ /* deep, so .sizex.value can be used. */
+ diff = (int) GETZDIFF(sp->sizex.value *
+ ((SY * CX) * star->x + (SX) * star->y +
+ (CX * CY) * star->z) + sp->z.value);
+ }
+ arc->x = (short) ((sp->sizex.value *
+ ((CY * CZ - SX * SY * SZ) * star->x +
+ (-CX * SZ) * star->y +
+ (SY * CZ + SZ * SX * CY) * star->z) +
+ sp->x.value));
+ arc->y = (short) ((sp->sizey.value *
+ ((CY * SZ + SX * SY * CZ) * star->x +
+ (CX * CZ) * star->y +
+ (SY * SZ - SX * CY * CZ) * star->z) +
+ sp->y.value));
+
+ if (MI_WIN_IS_USE3D(mi)) {
+ arcleft->x = (short) ((sp->sizex.value *
+ ((CY * CZ - SX * SY * SZ) * star->x +
+ (-CX * SZ) * star->y +
+ (SY * CZ + SZ * SX * CY) * star->z) +
+ sp->x.value));
+ arcleft->y = (short) ((sp->sizey.value *
+ ((CY * SZ + SX * SY * CZ) * star->x +
+ (CX * CZ) * star->y +
+ (SY * SZ - SX * CY * CZ) * star->z) +
+ sp->y.value));
+ arc->x += diff;
+ arcleft->x -= diff;
+ }
+ if (star->size != 0) {
+ arc->x -= star->size;
+ arc->y -= star->size;
+ if (MI_WIN_IS_USE3D(mi)) {
+ arcleft->x -= star->size;
+ arcleft->y -= star->size;
+ }
+ }
+ }
+
+ /* First, we erase the previous starfield */
+ if (MI_WIN_IS_INSTALL(mi) && MI_WIN_IS_USE3D(mi))
+ XSetForeground(display, gc, MI_NONE_COLOR(mi));
+ else
+ XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
+
+#if (ADAPT_ERASE == 1)
+ if (sp->hasbeenchecked == 0) {
+ /* We just calculate which method is the faster and eventually free
+ * the oldxarc list */
+ if (sp->xarc_time >
+ ADAPT_ARC_PREFERED * sp->rect_time) {
+ sp->hasbeenchecked = -2; /* XFillRectangle mode */
+ (void) free((void *) sp->oldxarc);
+ sp->oldxarc = NULL;
+ if (MI_WIN_IS_USE3D(mi)) {
+ (void) free((void *) sp->oldxarcleft);
+ sp->oldxarcleft = NULL;
+ }
+ } else {
+ sp->hasbeenchecked = -1; /* XFillArcs mode */
+ }
+ }
+ if (sp->hasbeenchecked == -2) {
+ /* Erasing is done with XFillRectangle */
+ XFillRectangle(display, window, gc,
+ x_1, y_1, x_2, y_2);
+ } else if (sp->hasbeenchecked == -1) {
+ /* Erasing is done with XFillArcs */
+ XFillArcs(display, window, gc,
+ sp->oldxarc, sp->NbStars);
+ if (MI_WIN_IS_USE3D(mi))
+ XFillArcs(display, window, gc,
+ sp->oldxarcleft, sp->NbStars);
+ } else {
+ long usec;
+
+ if (sp->hasbeenchecked > ADAPT_CHECKS) {
+#ifdef GETTIMEOFDAY_TWO_ARGS
+ (void) gettimeofday(&tv1, NULL);
+#else
+ (void) gettimeofday(&tv1);
+#endif
+ XFillRectangle(display, window, gc,
+ x_1, y_1, x_2, y_2);
+#ifdef GETTIMEOFDAY_TWO_ARGS
+ (void) gettimeofday(&tv2, NULL);
+#else
+ (void) gettimeofday(&tv2);
+#endif
+ usec = (tv2.tv_sec - tv1.tv_sec) * 1000000;
+ if (usec + tv2.tv_usec - tv1.tv_usec > 0) {
+ sp->rect_time += usec + tv2.tv_usec - tv1.tv_usec;
+ sp->hasbeenchecked--;
+ }
+ } else {
+#ifdef GETTIMEOFDAY_TWO_ARGS
+ (void) gettimeofday(&tv1, NULL);
+#else
+ (void) gettimeofday(&tv1);
+#endif
+ XFillArcs(display, window, gc,
+ sp->oldxarc, sp->NbStars);
+ if (MI_WIN_IS_USE3D(mi))
+ XFillArcs(display, window, gc,
+ sp->oldxarcleft, sp->NbStars);
+#ifdef GETTIMEOFDAY_TWO_ARGS
+ (void) gettimeofday(&tv2, NULL);
+#else
+ (void) gettimeofday(&tv2);
+#endif
+ usec = (tv2.tv_sec - tv1.tv_sec) * 1000000;
+ if (usec + tv2.tv_usec - tv1.tv_usec > 0) {
+ sp->xarc_time += usec + tv2.tv_usec - tv1.tv_usec;
+ sp->hasbeenchecked--;
+ }
+ }
+ }
+#else
+#if (USEOLDXARCS == 1)
+ XFillArcs(display, window, gc,
+ sp->oldxarc, sp->NbStars);
+ if (MI_WIN_IS_USE3D(mi))
+ XFillArcs(display, window, gc,
+ sp->oldxarcleft, sp->NbStars);
+#else
+ XFillRectangle(display, window, gc,
+ x_1, y_1, x_2, y_2);
+#endif
+#endif
+
+ /* Then we draw the new one */
+ if (MI_WIN_IS_USE3D(mi)) {
+ if (MI_WIN_IS_INSTALL(mi))
+ XSetFunction(display, gc, GXor);
+ XSetForeground(display, gc, MI_RIGHT_COLOR(mi));
+ XFillArcs(display, window, gc, sp->xarc, sp->NbStars);
+ XSetForeground(display, gc, MI_LEFT_COLOR(mi));
+ XFillArcs(display, window, gc, sp->xarcleft, sp->NbStars);
+ if (MI_WIN_IS_INSTALL(mi))
+ XSetFunction(display, gc, GXcopy);
+ } else {
+ XSetForeground(display, gc, sp->color);
+ XFillArcs(display, window, gc, sp->xarc, sp->NbStars);
+ }
+
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+#if (ADAPT_ERASE == 1)
+ if (sp->hasbeenchecked >= -1) {
+ arc = sp->xarc;
+ sp->xarc = sp->oldxarc;
+ sp->oldxarc = arc;
+ if (MI_WIN_IS_USE3D(mi)) {
+ arcleft = sp->xarcleft;
+ sp->xarcleft = sp->oldxarcleft;
+ sp->oldxarcleft = arcleft;
+ }
+ }
+#else
+ arc = sp->xarc;
+ sp->xarc = sp->oldxarc;
+ sp->oldxarc = arc;
+ if (MI_WIN_IS_USE3D(mi)) {
+ arcleft = sp->xarcleft;
+ sp->xarcleft = sp->oldxarcleft;
+ sp->oldxarcleft = arcleft;
+ }
+#endif
+#endif
+
+ /* We set up the color for the next drawing */
+ if (!MI_WIN_IS_USE3D(mi) && MI_NPIXELS(mi) > 2 &&
+ (++sp->colorchange >= COLOR_CHANGES)) {
+ sp->colorchange = 0;
+ if (++sp->colorp >= MI_NPIXELS(mi))
+ sp->colorp = 0;
+ sp->color = MI_PIXEL(mi, sp->colorp);
+ }
+}
+
+ENTRYPOINT void
+free_bouboule(ModeInfo * mi)
+{
+ StarField *sp = &starfield[MI_SCREEN(mi)];
+
+ if (sp->star)
+ (void) free((void *) sp->star);
+ if (sp->xarc)
+ (void) free((void *) sp->xarc);
+ if (sp->xarcleft)
+ (void) free((void *) sp->xarcleft);
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+ if (sp->oldxarc)
+ (void) free((void *) sp->oldxarc);
+ if (sp->oldxarcleft)
+ (void) free((void *) sp->oldxarcleft);
+#endif
+ sinfree(&(sp->x));
+ sinfree(&(sp->y));
+ sinfree(&(sp->z));
+ sinfree(&(sp->sizex));
+ sinfree(&(sp->sizey));
+ sinfree(&(sp->thetax));
+ sinfree(&(sp->thetay));
+ sinfree(&(sp->thetaz));
+}
+
+ENTRYPOINT void
+reshape_bouboule(ModeInfo * mi, int width, int height)
+{
+ StarField *sp = &starfield[MI_SCREEN(mi)];
+ sp->width = width;
+ sp->height = height;
+ sininit(&sp->x,
+ sp->x.alpha, sp->x.step,
+ ((double) sp->width) / 4.0,
+ 3.0 * ((double) sp->width) / 4.0,
+ POSCANRAND);
+ sininit(&sp->y,
+ sp->y.alpha, sp->y.step,
+ ((double) sp->height) / 4.0,
+ 3.0 * ((double) sp->height) / 4.0,
+ POSCANRAND);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_bouboule(ModeInfo * mi)
+{
+ /* Do nothing, it will refresh by itself */
+}
+#endif
+
+XSCREENSAVER_MODULE ("Bouboule", bouboule)
diff --git a/hacks/bouboule.man b/hacks/bouboule.man
new file mode 100644
index 0000000..259490f
--- /dev/null
+++ b/hacks/bouboule.man
@@ -0,0 +1,80 @@
+.TH XScreenSaver 1 "15-May-97" "X Version 11"
+.SH NAME
+bouboule - draws spinning 3D blobs
+.SH SYNOPSIS
+.B bouboule
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] [\-3d]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIbouboule\fP program draws spinning 3D blobs.
+.SH OPTIONS
+.I bouboule
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 64.
+The colors used cycle through the hue, making N stops around
+the color wheel.
+.TP 8
+.B \-cycles \fIinteger\fP
+
+.TP 8
+.B \-count \fIinteger\fP
+
+.TP 8
+.B \-3d
+Do red/blue 3d separations (for 3d glasses.)
+
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1996 by Jeremie Petit.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+
+.SH AUTHOR
+Jeremie Petit <jpetit@essi.fr>, 1996.
+
+3D support by Henrik Theiling <theiling@coli-uni-sb.de>, 04-Sep-96.
+
+VMS support by Jouk Jansen <joukj@alpha.chem.uva.nl>, 01-Feb-96.
+
+TrueColor support by David Bagley <bagleyd@bigfoot.com>, 01-Feb-96.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 15-May-97.
diff --git a/hacks/boxfit.c b/hacks/boxfit.c
new file mode 100644
index 0000000..1b1d0d7
--- /dev/null
+++ b/hacks/boxfit.c
@@ -0,0 +1,561 @@
+/* xscreensaver, Copyright (c) 2005-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Boxfit -- fills space with a gradient of growing boxes or circles.
+ *
+ * Written by jwz, 21-Feb-2005.
+ *
+ * Inspired by http://www.levitated.net/daily/levBoxFitting.html
+ */
+
+#include "screenhack.h"
+#include <stdio.h>
+#include "ximage-loader.h"
+
+#define ALIVE 1
+#define CHANGED 2
+#define UNDEAD 4
+
+typedef struct {
+ unsigned long fill_color;
+ short x, y, w, h;
+ char flags;
+} box;
+
+typedef struct {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ GC gc;
+ unsigned long fg_color, bg_color;
+ int border_size;
+ int spacing;
+ int inc;
+
+ int mode;
+ Bool circles_p;
+ Bool growing_p;
+ Bool color_horiz_p;
+
+ int box_count;
+ int boxes_size;
+ int nboxes;
+ box *boxes;
+
+ XImage *image;
+ int ncolors;
+ XColor *colors;
+ int delay;
+ int countdown;
+
+ Bool done_once;
+ async_load_state *img_loader;
+ Pixmap loading_pixmap;
+
+} state;
+
+
+static void
+reset_boxes (state *st)
+{
+ st->nboxes = 0;
+ st->growing_p = True;
+ st->color_horiz_p = random() & 1;
+
+ if (st->done_once && st->colors)
+ free_colors (st->xgwa.screen, st->xgwa.colormap, st->colors, st->ncolors);
+
+ if (!st->done_once)
+ {
+ char *s = get_string_resource (st->dpy, "mode", "Mode");
+ if (!s || !*s || !strcasecmp (s, "random"))
+ st->mode = -1;
+ else if (!strcasecmp (s, "squares") || !strcasecmp (s, "square"))
+ st->mode = 0;
+ else if (!strcasecmp (s, "circles") || !strcasecmp (s, "circle"))
+ st->mode = 1;
+ else
+ {
+ fprintf (stderr,
+ "%s: mode must be random, squares, or circles, not '%s'\n",
+ progname, s);
+ exit (1);
+ }
+ }
+
+ if (st->mode == -1)
+ st->circles_p = random() & 1;
+ else
+ st->circles_p = (st->mode == 1);
+
+ st->done_once = True;
+
+ if (st->image || get_boolean_resource (st->dpy, "grab", "Boolean"))
+ {
+ if (st->image) XDestroyImage (st->image);
+ st->image = 0;
+
+ if (st->loading_pixmap) abort();
+ if (st->img_loader) abort();
+ if (!get_boolean_resource (st->dpy, "peek", "Boolean"))
+ st->loading_pixmap = XCreatePixmap (st->dpy, st->window,
+ st->xgwa.width, st->xgwa.height,
+ st->xgwa.depth);
+
+ XClearWindow (st->dpy, st->window);
+ st->img_loader = load_image_async_simple (0, st->xgwa.screen,
+ st->window,
+ (st->loading_pixmap
+ ? st->loading_pixmap
+ : st->window),
+ 0, 0);
+ }
+ else
+ {
+ st->ncolors = get_integer_resource (st->dpy, "colors", "Colors"); /* re-get */
+ if (st->ncolors < 1) st->ncolors = 1;
+ make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ st->colors, &st->ncolors, True, 0, False);
+ if (st->ncolors < 1) abort();
+ XClearWindow (st->dpy, st->window);
+ }
+}
+
+
+static void
+reshape_boxes (state *st)
+{
+ int i;
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ for (i = 0; i < st->nboxes; i++)
+ {
+ box *b = &st->boxes[i];
+ b->flags |= CHANGED;
+ }
+}
+
+static void *
+boxfit_init (Display *dpy, Window window)
+{
+ XGCValues gcv;
+ state *st = (state *) calloc (1, sizeof (*st));
+
+ st->dpy = dpy;
+ st->window = window;
+ st->delay = get_integer_resource (dpy, "delay", "Integer");
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+/* XSelectInput (dpy, window, st->xgwa.your_event_mask | ExposureMask);*/
+
+ if (! get_boolean_resource (dpy, "grab", "Boolean"))
+ {
+ st->ncolors = get_integer_resource (dpy, "colors", "Colors");
+ if (st->ncolors < 1) st->ncolors = 1;
+ st->colors = (XColor *) malloc (sizeof(XColor) * st->ncolors);
+ }
+
+ st->inc = get_integer_resource (dpy, "growBy", "GrowBy");
+ st->spacing = get_integer_resource (dpy, "spacing", "Spacing");
+ st->border_size = get_integer_resource (dpy, "borderSize", "BorderSize");
+ st->fg_color = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ st->bg_color = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "background", "Background");
+ if (st->inc < 1) st->inc = 1;
+ if (st->border_size < 0) st->border_size = 0;
+
+ gcv.line_width = st->border_size;
+ gcv.background = st->bg_color;
+ st->gc = XCreateGC (st->dpy, st->window, GCBackground|GCLineWidth, &gcv);
+
+ st->box_count = get_integer_resource (dpy, "boxCount", "BoxCount");
+ if (st->box_count < 1) st->box_count = 1;
+
+ st->nboxes = 0;
+ st->boxes_size = st->box_count * 2;
+ st->boxes = (box *) calloc (st->boxes_size, sizeof(*st->boxes));
+
+ reset_boxes (st);
+
+ reshape_boxes (st);
+ return st;
+}
+
+
+
+static Bool
+boxes_overlap_p (box *a, box *b, int pad)
+{
+ /* Two rectangles overlap if the max of the tops is less than the
+ min of the bottoms and the max of the lefts is less than the min
+ of the rights.
+ */
+# undef MAX
+# undef MIN
+# define MAX(A,B) ((A)>(B)?(A):(B))
+# define MIN(A,B) ((A)<(B)?(A):(B))
+
+ int maxleft = MAX(a->x - pad, b->x);
+ int maxtop = MAX(a->y - pad, b->y);
+ int minright = MIN(a->x + a->w + pad + pad - 1, b->x + b->w);
+ int minbot = MIN(a->y + a->h + pad + pad - 1, b->y + b->h);
+ return (maxtop < minbot && maxleft < minright);
+}
+
+
+static Bool
+circles_overlap_p (box *a, box *b, int pad)
+{
+ int ar = a->w/2; /* radius */
+ int br = b->w/2;
+ int ax = a->x + ar; /* center */
+ int ay = a->y + ar;
+ int bx = b->x + br;
+ int by = b->y + br;
+ int d2 = (((bx - ax) * (bx - ax)) + /* distance between centers squared */
+ ((by - ay) * (by - ay)));
+ int r2 = ((ar + br + pad) * /* sum of radii squared */
+ (ar + br + pad));
+ return (d2 < r2);
+}
+
+
+static Bool
+box_collides_p (state *st, box *a, int pad)
+{
+ int i;
+
+ /* collide with wall */
+ if (a->x - pad < 0 ||
+ a->y - pad < 0 ||
+ a->x + a->w + pad + pad >= st->xgwa.width ||
+ a->y + a->h + pad + pad >= st->xgwa.height)
+ return True;
+
+ /* collide with another box */
+ for (i = 0; i < st->nboxes; i++)
+ {
+ box *b = &st->boxes[i];
+ if (a != b &&
+ (st->circles_p
+ ? circles_overlap_p (a, b, pad)
+ : boxes_overlap_p (a, b, pad)))
+ return True;
+ }
+
+ return False;
+}
+
+
+static unsigned int
+grow_boxes (state *st)
+{
+ int inc2 = st->inc + st->spacing + st->border_size;
+ int i;
+ int live_count = 0;
+
+ /* check box collisions, and grow if none.
+ */
+ for (i = 0; i < st->nboxes; i++)
+ {
+ box *a = &st->boxes[i];
+ if (!(a->flags & ALIVE)) continue;
+
+ if (box_collides_p (st, a, inc2))
+ {
+ a->flags &= ~ALIVE;
+ continue;
+ }
+
+ live_count++;
+ a->x -= st->inc;
+ a->y -= st->inc;
+ a->w += st->inc + st->inc;
+ a->h += st->inc + st->inc;
+ a->flags |= CHANGED;
+ }
+
+ /* Add more boxes.
+ */
+ while (live_count < st->box_count)
+ {
+ box *a;
+ st->nboxes++;
+ if (st->boxes_size <= st->nboxes)
+ {
+ st->boxes_size = (st->boxes_size * 1.2) + st->nboxes;
+ st->boxes = (box *)
+ realloc (st->boxes, st->boxes_size * sizeof(*st->boxes));
+ if (! st->boxes)
+ {
+ fprintf (stderr, "%s: out of memory (%d boxes)\n",
+ progname, st->boxes_size);
+ exit (1);
+ }
+ }
+
+ a = &st->boxes[st->nboxes-1];
+ a->flags = CHANGED;
+
+ for (i = 0; i < 100; i++)
+ {
+ a->x = inc2 + (random() % (st->xgwa.width - inc2));
+ a->y = inc2 + (random() % (st->xgwa.height - inc2));
+ a->w = 0;
+ a->h = 0;
+
+ if (! box_collides_p (st, a, inc2))
+ {
+ a->flags |= ALIVE;
+ live_count++;
+ break;
+ }
+ }
+
+ if (! (a->flags & ALIVE) || /* too many retries; */
+ st->nboxes > 65535) /* that's about 1MB of box structs. */
+ {
+ st->nboxes--; /* go into "fade out" mode now. */
+ st->growing_p = False;
+ return 2000000; /* make customizable... */
+ }
+
+ /* Pick colors for this box */
+ if (st->image)
+ {
+ int w = st->image->width;
+ int h = st->image->height;
+ a->fill_color = XGetPixel (st->image, a->x % w, a->y % h);
+ }
+ else
+ {
+ int n = (st->color_horiz_p
+ ? (a->x * st->ncolors / st->xgwa.width)
+ : (a->y * st->ncolors / st->xgwa.height));
+ a->fill_color = st->colors [n % st->ncolors].pixel;
+ }
+ }
+
+ return st->delay;
+}
+
+
+static unsigned int
+shrink_boxes (state *st)
+{
+ int i;
+ int remaining = 0;
+
+ for (i = 0; i < st->nboxes; i++)
+ {
+ box *a = &st->boxes[i];
+
+ if (a->w <= 0 || a->h <= 0) continue;
+
+ a->x += st->inc;
+ a->y += st->inc;
+ a->w -= st->inc + st->inc;
+ a->h -= st->inc + st->inc;
+ a->flags |= CHANGED;
+ if (a->w < 0) a->w = 0;
+ if (a->h < 0) a->h = 0;
+
+ if (a->w > 0 && a->h > 0)
+ remaining++;
+ }
+
+ if (remaining == 0) {
+ reset_boxes (st);
+ return 1000000;
+ } else {
+ return st->delay;
+ }
+}
+
+
+static void
+draw_boxes (state *st)
+{
+ int i;
+ for (i = 0; i < st->nboxes; i++)
+ {
+ box *b = &st->boxes[i];
+
+ if (b->flags & UNDEAD) continue;
+ if (! (b->flags & CHANGED)) continue;
+ b->flags &= ~CHANGED;
+
+ if (!st->growing_p)
+ {
+ /* When shrinking, black out an area outside of the border
+ before re-drawing the box.
+ */
+ int margin = st->inc + st->border_size;
+
+ XSetForeground (st->dpy, st->gc, st->bg_color);
+ if (st->circles_p)
+ XFillArc (st->dpy, st->window, st->gc,
+ b->x - margin, b->y - margin,
+ b->w + (margin*2), b->h + (margin*2),
+ 0, 360*64);
+ else
+ XFillRectangle (st->dpy, st->window, st->gc,
+ b->x - margin, b->y - margin,
+ b->w + (margin*2), b->h + (margin*2));
+
+ if (b->w <= 0 || b->h <= 0)
+ b->flags |= UNDEAD; /* really very dead now */
+ }
+
+ if (b->w <= 0 || b->h <= 0) continue;
+
+ XSetForeground (st->dpy, st->gc, b->fill_color);
+
+ if (st->circles_p)
+ XFillArc (st->dpy, st->window, st->gc, b->x, b->y, b->w, b->h,
+ 0, 360*64);
+ else
+ XFillRectangle (st->dpy, st->window, st->gc, b->x, b->y, b->w, b->h);
+
+ if (st->border_size > 0)
+ {
+ unsigned int bd = (st->image
+ ? st->fg_color
+ : st->colors [(b->fill_color + st->ncolors/2)
+ % st->ncolors].pixel);
+ XSetForeground (st->dpy, st->gc, bd);
+ if (st->circles_p)
+ XDrawArc (st->dpy, st->window, st->gc, b->x, b->y, b->w, b->h,
+ 0, 360*64);
+ else
+ XDrawRectangle (st->dpy, st->window, st->gc,
+ b->x, b->y, b->w, b->h);
+ }
+ }
+}
+
+
+static unsigned long
+boxfit_draw (Display *dpy, Window window, void *closure)
+{
+ state *st = (state *) closure;
+ int delay;
+
+ if (st->img_loader) /* still loading */
+ {
+ st->img_loader = load_image_async_simple (st->img_loader, 0, 0, 0, 0, 0);
+ if (! st->img_loader) /* just finished */
+ {
+ st->image = XGetImage (st->dpy,
+ (st->loading_pixmap ? st->loading_pixmap :
+ st->window),
+ 0, 0,
+ st->xgwa.width, st->xgwa.height, ~0L,
+ ZPixmap);
+ if (st->loading_pixmap) XFreePixmap (st->dpy, st->loading_pixmap);
+ XSetWindowBackground (st->dpy, st->window, st->bg_color);
+ if (st->loading_pixmap)
+ XClearWindow (st->dpy, st->window);
+ else
+ st->countdown = 2000000;
+ st->loading_pixmap = 0;
+ }
+ return st->delay;
+ }
+
+ if (st->countdown > 0)
+ {
+ st->countdown -= st->delay;
+ if (st->countdown <= 0)
+ {
+ st->countdown = 0;
+ XClearWindow (st->dpy, st->window);
+ }
+ return st->delay;
+ }
+
+ if (st->growing_p) {
+ draw_boxes (st);
+ delay = grow_boxes (st);
+ } else {
+ delay = shrink_boxes (st);
+ draw_boxes (st);
+ }
+ return delay;
+}
+
+static void
+boxfit_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ state *st = (state *) closure;
+ reshape_boxes (st);
+}
+
+static Bool
+boxfit_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ state *st = (state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->growing_p = !st->growing_p;
+ return True;
+ }
+ return False;
+}
+
+static void
+boxfit_free (Display *dpy, Window window, void *closure)
+{
+}
+
+
+static const char *boxfit_defaults [] = {
+ ".background: black",
+ ".foreground: #444444",
+ "*fpsSolid: true",
+ "*delay: 20000",
+ "*mode: random",
+ "*colors: 64",
+ "*boxCount: 50",
+ "*growBy: 1",
+ "*spacing: 1",
+ "*borderSize: 1",
+ "*grab: False",
+ "*peek: False",
+ "*grabDesktopImages: False", /* HAVE_JWXYZ */
+ "*chooseRandomImages: True", /* HAVE_JWXYZ */
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+ "*rotateImages: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec boxfit_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-colors", ".colors", XrmoptionSepArg, 0 },
+ { "-count", ".boxCount", XrmoptionSepArg, 0 },
+ { "-growby", ".growBy", XrmoptionSepArg, 0 },
+ { "-spacing", ".spacing", XrmoptionSepArg, 0 },
+ { "-border", ".borderSize", XrmoptionSepArg, 0 },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-circles", ".mode", XrmoptionNoArg, "circles" },
+ { "-squares", ".mode", XrmoptionNoArg, "squares" },
+ { "-random", ".mode", XrmoptionNoArg, "random" },
+ { "-grab", ".grab", XrmoptionNoArg, "True" },
+ { "-no-grab", ".grab", XrmoptionNoArg, "False" },
+ { "-peek", ".peek", XrmoptionNoArg, "True" },
+ { "-no-peek", ".peek", XrmoptionNoArg, "False" },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("BoxFit", boxfit)
diff --git a/hacks/boxfit.man b/hacks/boxfit.man
new file mode 100644
index 0000000..ec157e3
--- /dev/null
+++ b/hacks/boxfit.man
@@ -0,0 +1,102 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+boxfit - fills space with a gradient of growing boxes or circles.
+.SH SYNOPSIS
+.B boxfit
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fIusecs\fP]
+[\-count \fIint\fP]
+[\-growby \fIint\fP]
+[\-spacing \fIint\fP]
+[\-border \fIint\fP]
+[\-circles | \-squares | \-random]
+[\-grab]
+[\-peek]
+[\-fps]
+.SH DESCRIPTION
+Packs the screen with growing boxes or circles, colored according to a
+horizontal or vertical gradient. The objects grow until they touch,
+then stop. When the screen is full, they shrink away and the process
+restarts.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the animation.
+Default 20000, or about 0.02 seconds.
+.TP 8
+.B \-count \fIint\fP
+How many boxes or circles to animate simultaneously; default 50.
+Smaller numbers yield larger boxes/circles.
+.TP 8
+.B \-growby \fIint\fP
+How many pixels the objects should grow by, each frame. Default 1.
+.TP 8
+.B \-spacing \fIint\fP
+How many pixels of space should be left between the objects. Default 1.
+.TP 8
+.B \-border \fIint\fP
+Thickness of the colored border around each object. Default 1.
+.TP 8
+.B \-circles\fB | \-squares\fP | \-random\fP
+Draw circles, squares, or choose randomly (the default).
+.TP 8
+.B \-grab
+Normally it colors the boxes with a horizontal or vertical gradient.
+If \fI\-grab\fP is specified, it will instead load a random image,
+and color the boxes according to the colors in that image.
+As the picture fills in, some features of the underlying image
+may become recognisable.
+
+When grabbing images, the image will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
+.TP 8
+.B \-peek
+This option says to briefly show you the underlying image before
+beginning. The default is not to show the unadulterated image at all.
+(This only has an effect when \fI\-grab\fP is used.)
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>
diff --git a/hacks/braid.c b/hacks/braid.c
new file mode 100644
index 0000000..4f5a77c
--- /dev/null
+++ b/hacks/braid.c
@@ -0,0 +1,443 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/*-
+ * braid --- random braids around a circle and then changes the color in
+ * a rotational pattern
+ */
+
+#if 0
+static const char sccsid[] = "@(#)braid.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1995 by John Neil.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 10-May-1997: Jamie Zawinski <jwz@jwz.org> compatible with xscreensaver
+ * 01-Sep-1995: color knotted components differently, J. Neil.
+ * 29-Aug-1995: Written. John Neil <neil@math.idbsu.edu>
+ */
+
+#ifdef STANDALONE
+# define MODE_braid
+# define DEFAULTS "*delay: 1000 \n" \
+ "*count: 15 \n" \
+ "*cycles: 100 \n" \
+ "*size: -7 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True" \
+
+# define UNIFORM_COLORS
+# define free_braid 0
+# define release_braid 0
+# define reshape_braid 0
+# define braid_handle_event 0
+# include "xlockmore.h"
+#else /* STANDALONE */
+# include "xlock.h"
+# define ENTRYPOINT /**/
+#endif /* STANDALONE */
+
+#ifdef MODE_braid
+
+ENTRYPOINT ModeSpecOpt braid_opts = {0, NULL, 0, NULL, NULL};
+
+#ifdef USE_MODULES
+ModStruct braid_description =
+{"braid", "init_braid", "draw_braid", (char *) NULL,
+ "refresh_braid", "init_braid", (char *) NULL, &braid_opts,
+ 1000, 15, 100, 1, 64, 1.0, "",
+ "Shows random braids and knots", 0, NULL};
+
+#endif
+
+#if defined( COLORROUND ) && defined( COLORCOMP )
+#undef COLORROUND
+#undef COLORCOMP
+#endif
+
+#if !defined( COLORROUND ) && !defined( COLORCOMP )
+#if 0
+/* to color in a circular pattern use COLORROUND */
+#define COLORROUND
+#else
+/* to color by component use COLORCOMP */
+#define COLORCOMP
+#endif
+#endif
+
+#define MAXLENGTH 50 /* the maximum length of a braid word */
+#define MINLENGTH 8 /* the minimum length of a braid word */
+#define MAXSTRANDS 15 /* the maximum number of strands in the braid */
+#define MINSTRANDS 3 /* the minimum number of strands in the braid */
+#define SPINRATE 12.0 /* the rate at which the colors spin */
+
+#define INTRAND(min,max) (NRAND((max+1)-(min))+(min))
+#define FLOATRAND(min,max) ((min)+((double) LRAND()/((double) MAXRAND))*((max)-(min)))
+
+typedef struct {
+ int linewidth;
+ int braidword[MAXLENGTH];
+ int components[MAXSTRANDS];
+ int startcomp[MAXLENGTH][MAXSTRANDS];
+ int nstrands;
+ int braidlength;
+ float startcolor;
+ int center_x;
+ int center_y;
+ float min_radius;
+ float max_radius;
+ float top, bottom, left, right;
+ int age;
+ int color_direction;
+} braidtype;
+
+static braidtype *braids = (braidtype *) NULL;
+
+static int
+applyword(braidtype * braid, int string, int position)
+{
+ int i, c;
+
+ c = string;
+ for (i = position; i < braid->braidlength; i++) {
+ if (c == ABS(braid->braidword[i]))
+ c--;
+ else if (c == ABS(braid->braidword[i]) - 1)
+ c++;
+ }
+ for (i = 0; i < position; i++) {
+ if (c == ABS(braid->braidword[i]))
+ c--;
+ else if (c == ABS(braid->braidword[i]) - 1)
+ c++;
+ }
+ return c;
+}
+
+#if 0
+static int
+applywordto(braidtype * braid, int string, int position)
+{
+ int i, c;
+
+ c = string;
+ for (i = 0; i < position; i++) {
+ if (c == ABS(braid->braidword[i])) {
+ c--;
+ } else if (c == ABS(braid->braidword[i]) - 1) {
+ c++;
+ }
+ }
+ return c;
+}
+#endif
+
+static int
+applywordbackto(braidtype * braid, int string, int position)
+{
+ int i, c;
+
+ c = string;
+ for (i = position - 1; i >= 0; i--) {
+ if (c == ABS(braid->braidword[i])) {
+ c--;
+ } else if (c == ABS(braid->braidword[i]) - 1) {
+ c++;
+ }
+ }
+ return c;
+}
+
+ENTRYPOINT void
+init_braid(ModeInfo * mi)
+{
+ braidtype *braid;
+ int used[MAXSTRANDS];
+ int i, count, comp, c;
+ float min_length;
+
+ MI_INIT (mi, braids);
+ braid = &braids[MI_SCREEN(mi)];
+
+ braid->center_x = MI_WIDTH(mi) / 2;
+ braid->center_y = MI_HEIGHT(mi) / 2;
+ braid->age = 0;
+
+ /* jwz: go in the other direction sometimes. */
+ braid->color_direction = ((LRAND() & 1) ? 1 : -1);
+
+ MI_CLEARWINDOW(mi);
+
+ min_length = (braid->center_x > braid->center_y) ?
+ braid->center_y : braid->center_x;
+ braid->min_radius = min_length * 0.30;
+ braid->max_radius = min_length * 0.90;
+
+ if (MI_COUNT(mi) < MINSTRANDS)
+ braid->nstrands = MINSTRANDS;
+ else
+ braid->nstrands = INTRAND(MINSTRANDS,
+ MAX(MIN(MIN(MAXSTRANDS, MI_COUNT(mi)),
+ (int) ((braid->max_radius - braid->min_radius) / 5.0)), MINSTRANDS));
+ braid->braidlength = INTRAND(MINLENGTH, MIN(MAXLENGTH -1, braid->nstrands * 6));
+
+ for (i = 0; i < braid->braidlength; i++) {
+ braid->braidword[i] =
+ INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3);
+ if (i > 0)
+ while (braid->braidword[i] == -braid->braidword[i - 1])
+ braid->braidword[i] = INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3);
+ }
+
+ while (braid->braidword[0] == -braid->braidword[braid->braidlength - 1])
+ braid->braidword[braid->braidlength - 1] =
+ INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3);
+
+ do {
+ (void) memset((char *) used, 0, sizeof (used));
+ count = 0;
+ for (i = 0; i < braid->braidlength; i++)
+ used[ABS(braid->braidword[i])]++;
+ for (i = 0; i < braid->nstrands; i++)
+ count += (used[i] > 0) ? 1 : 0;
+ if (count < braid->nstrands - 1) {
+ braid->braidword[braid->braidlength] =
+ INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3);
+ while (braid->braidword[braid->braidlength] ==
+ -braid->braidword[braid->braidlength - 1] &&
+ braid->braidword[0] == -braid->braidword[braid->braidlength])
+ braid->braidword[braid->braidlength] =
+ INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3);
+ braid->braidlength++;
+ }
+ } while (count < braid->nstrands - 1 && braid->braidlength < MAXLENGTH);
+
+ braid->startcolor = (MI_NPIXELS(mi) > 2) ?
+ (float) NRAND(MI_NPIXELS(mi)) : 0.0;
+ /* XSetLineAttributes (display, MI_GC(mi), 2, LineSolid, CapRound,
+ JoinRound); */
+
+ (void) memset((char *) braid->components, 0, sizeof (braid->components));
+ c = 1;
+ comp = 0;
+ braid->components[0] = 1;
+ do {
+ i = comp;
+ do {
+ i = applyword(braid, i, 0);
+ braid->components[i] = braid->components[comp];
+ } while (i != comp);
+ count = 0;
+ for (i = 0; i < braid->nstrands; i++)
+ if (braid->components[i] == 0)
+ count++;
+ if (count > 0) {
+ for (comp = 0; braid->components[comp] != 0; comp++);
+ braid->components[comp] = ++c;
+ }
+ } while (count > 0);
+
+ braid->linewidth = MI_SIZE(mi);
+
+ if (braid->linewidth < 0)
+ braid->linewidth = NRAND(-braid->linewidth) + 1;
+ if (braid->linewidth * braid->linewidth * 8 > MIN(MI_WIDTH(mi), MI_HEIGHT(mi)))
+ braid->linewidth = MIN(1, (int) sqrt((double) MIN(MI_WIDTH(mi), MI_HEIGHT(mi)) / 8));
+ for (i = 0; i < braid->nstrands; i++)
+ if (!(braid->components[i] & 1))
+ braid->components[i] *= -1;
+}
+
+ENTRYPOINT void
+draw_braid(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int num_points = 500;
+ float t_inc;
+ float theta, psi;
+ float t, r_diff;
+ int i, s;
+ float x_1, y_1, x_2, y_2, r1, r2;
+ float color, color_use = 0.0, color_inc;
+ braidtype *braid;
+
+ if (braids == NULL)
+ return;
+ braid = &braids[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+ XSetLineAttributes(display, MI_GC(mi), braid->linewidth,
+ LineSolid,
+ (braid->linewidth <= 3 ? CapButt : CapRound),
+ JoinMiter);
+
+ theta = (2.0 * M_PI) / (float) (braid->braidlength);
+ t_inc = (2.0 * M_PI) / (float) num_points;
+ color_inc = (float) MI_NPIXELS(mi) * braid->color_direction /
+ (float) num_points;
+ braid->startcolor += SPINRATE * color_inc;
+ if (((int) braid->startcolor) >= MI_NPIXELS(mi))
+ braid->startcolor = 0.0;
+
+ r_diff = (braid->max_radius - braid->min_radius) / (float) (braid->nstrands);
+
+ color = braid->startcolor;
+ psi = 0.0;
+ for (i = 0; i < braid->braidlength; i++) {
+ psi += theta;
+ for (t = 0.0; t < theta; t += t_inc) {
+#ifdef COLORROUND
+ color += color_inc;
+ if (((int) color) >= MI_NPIXELS(mi))
+ color = 0.0;
+ color_use = color;
+#endif
+ for (s = 0; s < braid->nstrands; s++) {
+ if (ABS(braid->braidword[i]) == s)
+ continue;
+ if (ABS(braid->braidword[i]) - 1 == s) {
+ /* crosSINFg */
+#ifdef COLORCOMP
+ if (MI_NPIXELS(mi) > 2) {
+ color_use = color + SPINRATE *
+ braid->components[applywordbackto(braid, s, i)] +
+ (psi + t) / 2.0 / M_PI * (float) MI_NPIXELS(mi);
+ while (((int) color_use) >= MI_NPIXELS(mi))
+ color_use -= (float) MI_NPIXELS(mi);
+ while (((int) color_use) < 0)
+ color_use += (float) MI_NPIXELS(mi);
+ }
+#endif
+#ifdef COLORROUND
+ if (MI_NPIXELS(mi) > 2) {
+ color_use += SPINRATE * color_inc;
+ while (((int) color_use) >= MI_NPIXELS(mi))
+ color_use -= (float) MI_NPIXELS(mi);
+ }
+#endif
+ r1 = braid->min_radius + r_diff * (float) (s);
+ r2 = braid->min_radius + r_diff * (float) (s + 1);
+ if (braid->braidword[i] > 0 ||
+ (FABSF(t - theta / 2.0) > theta / 7.0)) {
+ x_1 = ((0.5 * (1.0 + SINF(t / theta * M_PI - M_PI_2)) * r2 +
+ 0.5 * (1.0 + SINF((theta - t) / theta * M_PI - M_PI_2)) * r1)) *
+ COSF(t + psi) + braid->center_x;
+ y_1 = ((0.5 * (1.0 + SINF(t / theta * M_PI - M_PI_2)) * r2 +
+ 0.5 * (1.0 + SINF((theta - t) / theta * M_PI - M_PI_2)) * r1)) *
+ SINF(t + psi) + braid->center_y;
+ x_2 = ((0.5 * (1.0 + SINF((t + t_inc) / theta * M_PI - M_PI_2)) * r2 +
+ 0.5 * (1.0 + SINF((theta - t - t_inc) / theta * M_PI - M_PI_2)) * r1)) *
+ COSF(t + t_inc + psi) + braid->center_x;
+ y_2 = ((0.5 * (1.0 + SINF((t + t_inc) / theta * M_PI - M_PI_2)) * r2 +
+ 0.5 * (1.0 + SINF((theta - t - t_inc) / theta * M_PI - M_PI_2)) * r1)) *
+ SINF(t + t_inc + psi) + braid->center_y;
+ if (MI_NPIXELS(mi) > 2)
+ XSetForeground(display, MI_GC(mi), MI_PIXEL(mi, (int) color_use));
+ else
+ XSetForeground(display, MI_GC(mi), MI_WHITE_PIXEL(mi));
+
+ XDrawLine(display, window, MI_GC(mi),
+ (int) (x_1), (int) (y_1), (int) (x_2), (int) (y_2));
+ }
+#ifdef COLORCOMP
+ if (MI_NPIXELS(mi) > 2) {
+ color_use = color + SPINRATE *
+ braid->components[applywordbackto(braid, s + 1, i)] +
+ (psi + t) / 2.0 / M_PI * (float) MI_NPIXELS(mi);
+ while (((int) color_use) >= MI_NPIXELS(mi))
+ color_use -= (float) MI_NPIXELS(mi);
+ while (((int) color_use) < 0)
+ color_use += (float) MI_NPIXELS(mi);
+ }
+#endif
+ if (braid->braidword[i] < 0 ||
+ (FABSF(t - theta / 2.0) > theta / 7.0)) {
+ x_1 = ((0.5 * (1.0 + SINF(t / theta * M_PI - M_PI_2)) * r1 +
+ 0.5 * (1.0 + SINF((theta - t) / theta * M_PI - M_PI_2)) * r2)) *
+ COSF(t + psi) + braid->center_x;
+ y_1 = ((0.5 * (1.0 + SINF(t / theta * M_PI - M_PI_2)) * r1 +
+ 0.5 * (1.0 + SINF((theta - t) / theta * M_PI - M_PI_2)) * r2)) *
+ SINF(t + psi) + braid->center_y;
+ x_2 = ((0.5 * (1.0 + SINF((t + t_inc) / theta * M_PI - M_PI_2)) * r1 +
+ 0.5 * (1.0 + SINF((theta - t - t_inc) / theta * M_PI - M_PI_2)) * r2)) *
+ COSF(t + t_inc + psi) + braid->center_x;
+ y_2 = ((0.5 * (1.0 + SINF((t + t_inc) / theta * M_PI - M_PI_2)) * r1 +
+ 0.5 * (1.0 + SINF((theta - t - t_inc) / theta * M_PI - M_PI_2)) * r2)) *
+ SINF(t + t_inc + psi) + braid->center_y;
+ if (MI_NPIXELS(mi) > 2)
+ XSetForeground(display, MI_GC(mi), MI_PIXEL(mi, (int) color_use));
+ else
+ XSetForeground(display, MI_GC(mi), MI_WHITE_PIXEL(mi));
+
+ XDrawLine(display, window, MI_GC(mi),
+ (int) (x_1), (int) (y_1), (int) (x_2), (int) (y_2));
+ }
+ } else {
+ /* no crosSINFg */
+#ifdef COLORCOMP
+ if (MI_NPIXELS(mi) > 2) {
+ color_use = color + SPINRATE *
+ braid->components[applywordbackto(braid, s, i)] +
+ (psi + t) / 2.0 / M_PI * (float) MI_NPIXELS(mi);
+ while (((int) color_use) >= MI_NPIXELS(mi))
+ color_use -= (float) MI_NPIXELS(mi);
+ while (((int) color_use) < 0)
+ color_use += (float) MI_NPIXELS(mi);
+ }
+#endif
+#ifdef COLORROUND
+ if (MI_NPIXELS(mi) > 2) {
+ color_use += SPINRATE * color_inc;
+ while (((int) color_use) >= MI_NPIXELS(mi))
+ color_use -= (float) MI_NPIXELS(mi);
+ }
+#endif
+ r1 = braid->min_radius + r_diff * (float) (s);
+ x_1 = r1 * COSF(t + psi) + braid->center_x;
+ y_1 = r1 * SINF(t + psi) + braid->center_y;
+ x_2 = r1 * COSF(t + t_inc + psi) + braid->center_x;
+ y_2 = r1 * SINF(t + t_inc + psi) + braid->center_y;
+ if (MI_NPIXELS(mi) > 2)
+ XSetForeground(display, MI_GC(mi), MI_PIXEL(mi, (int) color_use));
+ else
+ XSetForeground(display, MI_GC(mi), MI_WHITE_PIXEL(mi));
+
+ XDrawLine(display, window, MI_GC(mi),
+ (int) (x_1), (int) (y_1), (int) (x_2), (int) (y_2));
+ }
+ }
+ }
+ }
+ XSetLineAttributes(display, MI_GC(mi), 1, LineSolid, CapNotLast, JoinRound);
+
+ if (++braid->age > MI_CYCLES(mi)) {
+ init_braid(mi);
+ }
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_braid(ModeInfo * mi)
+{
+ MI_CLEARWINDOW(mi);
+}
+#endif
+
+XSCREENSAVER_MODULE ("Braid", braid)
+
+#endif /* MODE_braid */
diff --git a/hacks/braid.man b/hacks/braid.man
new file mode 100644
index 0000000..28f0c4d
--- /dev/null
+++ b/hacks/braid.man
@@ -0,0 +1,69 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+braid - draws random color-cycling braids around a circle
+.SH SYNOPSIS
+.B braid
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIbraid\fP program draws random color-cycling braids around a circle.
+.SH OPTIONS
+.I braid
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 64.
+The colors used cycle through the hue, making N stops around
+the color wheel.
+.TP 8
+.B \-cycles \fIinteger\fP
+
+.TP 8
+.B \-count \fIinteger\fP
+
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1995 by John Neil.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+John Neil <neil@math.idbsu.edu>, 29-Aug-95.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/bsod.c b/hacks/bsod.c
new file mode 100644
index 0000000..ff6c359
--- /dev/null
+++ b/hacks/bsod.c
@@ -0,0 +1,6008 @@
+/* xscreensaver, Copyright (c) 1998-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Blue Screen of Death: the finest in personal computer emulation.
+ * Concept cribbed from Stephen Martin <smartin@mks.com>;
+ * this version written by jwz, 4-Jun-98.
+ * Mostly rewritten by jwz, 20-Feb-2006.
+ */
+
+
+/* To add a new mode:
+
+ - Define a function `new_os(dpy,win)' that returns a `bsod_state' struct.
+ - Draw on the window to set up its frame-zero state. This must be fast:
+ no sleeping or long loops!
+ - Populate the bsod_state structure with additional actions to take by
+ using the various BSOD_ macros. Note that you can control the delays
+ when printing text on a per-character or per-line basis.
+ - Insert your function in the `all_modes' table.
+ - Add a `doXXX' entry to `bsod_defaults'.
+ - Add fonts or colors to `bsod_defaults' if necessary.
+
+ Look at windows_31() for a simple example.
+
+ Look at linux_fsck() for a more complicated example with random behavior.
+
+ Or, you can bypass all that: look at nvidia() for a really hairy example.
+ */
+
+
+#include "screenhack.h"
+#include "ximage-loader.h"
+#include "apple2.h"
+
+#include <ctype.h>
+#include <time.h>
+
+#ifdef HAVE_XSHM_EXTENSION
+#include "xshm.h"
+#endif
+
+#ifdef HAVE_UNAME
+# include <sys/utsname.h>
+#endif /* HAVE_UNAME */
+
+#include "images/gen/amiga_png.h"
+#include "images/gen/hmac_png.h"
+#include "images/gen/osx_10_2_png.h"
+#include "images/gen/osx_10_3_png.h"
+#include "images/gen/android_png.h"
+#include "images/gen/ransomware_png.h"
+#include "images/gen/atari_png.h"
+#include "images/gen/mac_png.h"
+#include "images/gen/macbomb_png.h"
+#include "images/gen/apple_png.h"
+#include "images/gen/atm_png.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+# undef MIN
+# undef MAX
+# define MIN(A,B) ((A)<(B)?(A):(B))
+# define MAX(A,B) ((A)>(B)?(A):(B))
+
+#undef EOF
+typedef enum { EOF=0,
+ LEFT, CENTER, RIGHT,
+ LEFT_FULL, CENTER_FULL, RIGHT_FULL,
+ COLOR, INVERT, MOVETO, MARGINS,
+ CURSOR_BLOCK, CURSOR_LINE, RECT, LINE, COPY, PIXMAP, IMG, FONT,
+ PAUSE, CHAR_DELAY, LINE_DELAY,
+ LOOP, RESET, VERT_MARGINS, CROP,
+ WRAP, WORD_WRAP, TRUNCATE
+} bsod_event_type;
+
+struct bsod_event {
+ bsod_event_type type;
+ void *arg1, *arg2, *arg3, *arg4, *arg5, *arg6;
+};
+
+struct bsod_state {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ XFontStruct *font, *fontA, *fontB, *fontC;
+ unsigned long fg, bg;
+ GC gc;
+ int left_margin, right_margin; /* for text wrapping */
+ int top_margin, bottom_margin; /* for text scrolling and cropping */
+ int xoff, yoff;
+ Bool wrap_p, word_wrap_p;
+ char word_buf[80];
+ Bool scroll_p;
+ Bool crop_p; /* If True, chops off extra text vertically */
+
+ Pixmap pixmap, mask; /* Source image used by BSOD_PIXMAP */
+
+ int x, y; /* current text-drawing position */
+ int current_left; /* don't use this */
+ int last_nonwhite;
+
+ int pos; /* position in queue */
+ int queue_size;
+ struct bsod_event *queue;
+
+ unsigned long char_delay; /* delay between printing characters */
+ unsigned long line_delay; /* delay between printing lines */
+
+ Bool macx_eol_kludge;
+
+ void *closure;
+ int (*draw_cb) (struct bsod_state *);
+ void (*free_cb) (struct bsod_state *);
+
+ async_load_state *img_loader;
+};
+
+
+# if !defined(__GNUC__) && !defined(__extension__)
+ /* don't warn about "string length is greater than the length ISO C89
+ compilers are required to support" in these string constants... */
+# define __extension__ /**/
+# endif
+
+
+/* Draw text at the current position; align is LEFT, CENTER, RIGHT, or *_FULL
+ (meaning to clear the whole line margin to margin).
+ */
+#define BSOD_TEXT(bst,align,string) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = (align); \
+ (bst)->queue[(bst)->pos].arg1 = (void *) strdup (__extension__ (string)); \
+ (bst)->queue[(bst)->pos].arg2 = (bst)->queue[(bst)->pos].arg1; \
+ (bst)->queue[(bst)->pos].arg3 = (void *) 0; \
+ (bst)->pos++; \
+ } while (0)
+
+/* Flip the foreground and background colors
+ */
+#define BSOD_INVERT(bst) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = INVERT; \
+ (bst)->pos++; \
+ } while (0)
+
+/* Set the foreground and background colors to the given pixels
+ */
+#define BSOD_COLOR(bst,fg,bg) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = COLOR; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) fg; \
+ (bst)->queue[(bst)->pos].arg2 = (void *) bg; \
+ (bst)->pos++; \
+ } while (0)
+
+/* Set the position of the next text.
+ Note that this is the baseline: lower left corner of next char printed.
+ */
+#define BSOD_MOVETO(bst,x,y) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = MOVETO; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (x)); \
+ (bst)->queue[(bst)->pos].arg2 = (void *) ((long) (y)); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Delay for at least the given number of microseconds.
+ */
+#define BSOD_PAUSE(bst,usec) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = PAUSE; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (usec)); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Set the delay after each character is printed.
+ */
+#define BSOD_CHAR_DELAY(bst,usec) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = CHAR_DELAY; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (usec)); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Set the delay after each newline.
+ */
+#define BSOD_LINE_DELAY(bst,usec) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = LINE_DELAY; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) (usec); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Set the prevailing left/right margins (used when strings have
+ embedded newlines, and when centering or right-justifying text.)
+ */
+#define BSOD_MARGINS(bst,left,right) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = MARGINS; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (left)); \
+ (bst)->queue[(bst)->pos].arg2 = (void *) ((long) (right)); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Set the prevailing top/bottom margins (used when scrolling and cropping text)
+ */
+#define BSOD_VERT_MARGINS(bst,top,bottom) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = VERT_MARGINS; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (top)); \
+ (bst)->queue[(bst)->pos].arg2 = (void *) ((long) (bottom)); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Draw a blinking cursor; type is CURSOR_BLOCK or CURSOR_LINE.
+ usec is how long 1/2 of a cycle is. count is how many times to blink.
+ (You can pass a gigantic number if this is the last thing in your mode.)
+ */
+#define BSOD_CURSOR(bst,ctype,usec,count) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = (ctype); \
+ (bst)->queue[(bst)->pos].arg1 = (void *) (usec); \
+ (bst)->queue[(bst)->pos].arg2 = (void *) (count); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Draw or fill a rectangle. You can set line-width in the GC.
+ */
+#define BSOD_RECT(bst,fill,x,y,w,h) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = RECT; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (fill)); \
+ (bst)->queue[(bst)->pos].arg2 = (void *) ((long) (x)); \
+ (bst)->queue[(bst)->pos].arg3 = (void *) ((long) (y)); \
+ (bst)->queue[(bst)->pos].arg4 = (void *) ((long) (w)); \
+ (bst)->queue[(bst)->pos].arg5 = (void *) ((long) (h)); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Draw a line.
+ */
+#define BSOD_LINE(bst,x,y,x2,y2,thick) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = LINE; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (x)); \
+ (bst)->queue[(bst)->pos].arg2 = (void *) ((long) (y)); \
+ (bst)->queue[(bst)->pos].arg3 = (void *) ((long) (x2)); \
+ (bst)->queue[(bst)->pos].arg4 = (void *) ((long) (y2)); \
+ (bst)->queue[(bst)->pos].arg5 = (void *) ((long) (thick)); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Copy a rect from the window, to the window.
+ */
+#define BSOD_COPY(bst,srcx,srcy,w,h,tox,toy) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = COPY; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (srcx)); \
+ (bst)->queue[(bst)->pos].arg2 = (void *) ((long) (srcy)); \
+ (bst)->queue[(bst)->pos].arg3 = (void *) ((long) (w)); \
+ (bst)->queue[(bst)->pos].arg4 = (void *) ((long) (h)); \
+ (bst)->queue[(bst)->pos].arg5 = (void *) ((long) (tox)); \
+ (bst)->queue[(bst)->pos].arg6 = (void *) ((long) (toy)); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Copy a rect from bst->pixmap to the window.
+ */
+#define BSOD_PIXMAP(bst,srcx,srcy,w,h,tox,toy) do { \
+ BSOD_COPY(bst,srcx,srcy,w,h,tox,toy); \
+ (bst)->queue[(bst)->pos-1].type = PIXMAP; \
+ } while (0)
+
+/* Load a random image (or the desktop) onto the window.
+ */
+#define BSOD_IMG(bst) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = IMG; \
+ (bst)->pos++; \
+ } while (0)
+
+/* Switch between fonts A, B and C.
+ */
+#define BSOD_FONT(bst,n) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = FONT; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (n)); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Jump around in the state table. You can use this as the last thing
+ in your state table to repeat the last N elements forever.
+ */
+#define BSOD_LOOP(bst,off) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = LOOP; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) (off); \
+ (bst)->pos++; \
+ } while (0)
+
+/* Restart the whole thing from the beginning.
+ */
+#define BSOD_RESET(bst) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = RESET; \
+ (bst)->pos++; \
+ } while (0)
+
+/* Sets the crop state, if True, will not write text below the bottom_margin
+ */
+#define BSOD_CROP(bst, state) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = CROP; \
+ (bst)->queue[(bst)->pos].arg1 = (void *) ((long) (state)); \
+ (bst)->pos++; \
+ } while (0)
+
+#define BSOD_WRAP(bst) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = WRAP; \
+ (bst)->pos++; \
+ } while (0)
+
+#define BSOD_WORD_WRAP(bst) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = WORD_WRAP; \
+ (bst)->pos++; \
+ } while (0)
+
+#define BSOD_TRUNCATE(bst) do { \
+ ensure_queue (bst); \
+ (bst)->queue[(bst)->pos].type = TRUNCATE; \
+ (bst)->pos++; \
+ } while (0)
+
+
+static void
+ensure_queue (struct bsod_state *bst)
+{
+ int n;
+ if (bst->pos + 1 < bst->queue_size)
+ return;
+
+ n = bst->queue_size + 10;
+ if (n < 100) n *= 2;
+ n *= 1.2;
+
+ bst->queue = (struct bsod_event *)
+ realloc (bst->queue, n * sizeof(*bst->queue));
+ if (!bst->queue) abort();
+ memset (bst->queue + bst->queue_size, 0,
+ (n - bst->queue_size) * sizeof(*bst->queue));
+ bst->queue_size = n;
+}
+
+
+static void
+position_for_text (struct bsod_state *bst, const char *line)
+{
+ int max_width = 0;
+
+ const char *start = line;
+
+ if (bst->queue[bst->pos].type != LEFT &&
+ bst->queue[bst->pos].type != LEFT_FULL)
+ while (*start)
+ {
+ int dir, ascent, descent;
+ XCharStruct ov;
+ const char *end = start;
+ while (*end && *end != '\r' && *end != '\n')
+ end++;
+
+ XTextExtents (bst->font, start, end-start,
+ &dir, &ascent, &descent, &ov);
+ if (ov.width > max_width)
+ max_width = ov.width;
+ if (!*end) break;
+ start = end+1;
+ }
+
+ switch (bst->queue[bst->pos].type) {
+ case LEFT:
+ case LEFT_FULL:
+ bst->current_left = bst->left_margin + bst->xoff;
+ break;
+ case RIGHT:
+ case RIGHT_FULL:
+ bst->x = max_width - bst->right_margin - bst->xoff;
+ bst->current_left = bst->x;
+ break;
+ case CENTER:
+ case CENTER_FULL:
+ {
+ int w = (bst->xgwa.width - bst->left_margin - bst->right_margin -
+ max_width);
+ if (w < 0) w = 0;
+ bst->x = bst->left_margin + bst->xoff + (w / 2);
+ bst->current_left = bst->x;
+ break;
+ }
+ default:
+ abort();
+ }
+}
+
+
+static void
+bst_crlf (struct bsod_state *bst)
+{
+ int lh = bst->font->ascent + bst->font->descent;
+ bst->x = bst->current_left;
+ if (!bst->scroll_p ||
+ bst->y + lh < bst->xgwa.height - bst->bottom_margin - bst->yoff)
+ bst->y += lh;
+ else
+ {
+ int w = bst->xgwa.width - bst->right_margin - bst->left_margin;
+ int h = bst->xgwa.height - bst->top_margin - bst->bottom_margin;
+ XCopyArea (bst->dpy, bst->window, bst->window, bst->gc,
+ bst->left_margin + bst->xoff,
+ bst->top_margin + bst->yoff + lh,
+ w, h - lh,
+ bst->left_margin + bst->xoff,
+ bst->top_margin + bst->yoff);
+ XClearArea (bst->dpy, bst->window,
+ bst->left_margin + bst->xoff,
+ bst->top_margin + bst->yoff + h - lh, w, lh, False);
+ }
+}
+
+
+static void
+draw_char (struct bsod_state *bst, char c)
+{
+ if (!c)
+ abort();
+ else if (bst->crop_p && bst->y >=
+ (bst->xgwa.height - bst->bottom_margin - bst->yoff))
+ {
+ /* reached the bottom of the drawing area, and crop_p = True */
+ return;
+ }
+ else if (c == '\r')
+ {
+ bst->x = bst->current_left;
+ bst->last_nonwhite = bst->x;
+ }
+ else if (c == '\n')
+ {
+ if (bst->macx_eol_kludge)
+ {
+ /* Special case for the weird way OSX crashes print newlines... */
+ XDrawImageString (bst->dpy, bst->window, bst->gc,
+ bst->x, bst->y, " ", 1);
+ XDrawImageString (bst->dpy, bst->window, bst->gc,
+ bst->x,
+ bst->y + bst->font->ascent + bst->font->descent,
+ " ", 1);
+ }
+ bst_crlf (bst);
+ }
+ else if (c == '\b') /* backspace */
+ {
+ int cw = (bst->font->per_char
+ ? bst->font->per_char['n'-bst->font->min_char_or_byte2].width
+ : bst->font->min_bounds.width);
+ bst->x -= cw;
+ if (bst->x < bst->left_margin + bst->xoff)
+ bst->x = bst->left_margin + bst->xoff;
+ }
+ else
+ {
+ int dir, ascent, descent;
+ XCharStruct ov;
+ XTextExtents (bst->font, &c, 1, &dir, &ascent, &descent, &ov);
+
+ if ((bst->wrap_p || bst->word_wrap_p) &&
+ bst->x + ov.width > bst->xgwa.width - bst->right_margin - bst->xoff)
+ {
+ XCharStruct ov2;
+ int L = 0;
+
+ if (bst->word_wrap_p && *bst->word_buf)
+ {
+ L = strlen(bst->word_buf);
+ XTextExtents (bst->font, bst->word_buf, L,
+ &dir, &ascent, &descent, &ov2);
+ }
+
+ if (L) /* Erase the truncated wrapped word */
+ {
+ XSetForeground (bst->dpy, bst->gc, bst->bg);
+ XFillRectangle (bst->dpy, bst->window, bst->gc,
+ bst->last_nonwhite,
+ bst->y - bst->font->ascent,
+ ov2.width,
+ bst->font->ascent + bst->font->descent);
+ XSetForeground (bst->dpy, bst->gc, bst->fg);
+ }
+
+ bst_crlf (bst);
+
+ if (L) /* Draw wrapped partial word on the next line, no delay */
+ {
+ XDrawImageString (bst->dpy, bst->window, bst->gc,
+ bst->x, bst->y, bst->word_buf, L);
+ bst->x += ov2.width;
+ bst->last_nonwhite = bst->x;
+ }
+ }
+
+ XDrawImageString (bst->dpy, bst->window, bst->gc,
+ bst->x, bst->y, &c, 1);
+ bst->x += ov.width;
+
+ if (bst->word_wrap_p)
+ {
+ if (c == ' ' || c == '\t' || c == '\n' || c == '\r')
+ {
+ bst->word_buf[0] = 0;
+ bst->last_nonwhite = bst->x;
+ }
+ else
+ {
+ int L = strlen (bst->word_buf);
+ if (L >= sizeof(bst->word_buf)-1) abort();
+ bst->word_buf[L] = c;
+ bst->word_buf[L+1] = 0;
+ }
+ }
+ }
+}
+
+
+static long
+bsod_pop (struct bsod_state *bst)
+{
+ bsod_event_type type = bst->queue[bst->pos].type;
+
+ if (bst->draw_cb)
+ return bst->draw_cb (bst);
+
+ if (bst->pos < 0) /* already done */
+ abort();
+
+ switch (type) {
+
+ case LEFT: case LEFT_FULL:
+ case CENTER: case CENTER_FULL:
+ case RIGHT: case RIGHT_FULL:
+ {
+ const char *s = (const char *) bst->queue[bst->pos].arg2;
+ char c;
+
+ if (! *s)
+ {
+ long delay = bst->line_delay;
+ /* Reset the string back to the beginning, in case we loop. */
+ bst->queue[bst->pos].arg2 = bst->queue[bst->pos].arg1;
+ bst->queue[bst->pos].arg3 = 0;
+ bst->queue[bst->pos].type = (bsod_event_type)
+ bst->queue[bst->pos].arg4;
+ bst->pos++;
+ bst->current_left = bst->left_margin + bst->xoff;
+ return delay;
+ }
+
+ if (! bst->queue[bst->pos].arg3) /* "done once" */
+ {
+ position_for_text (bst, s);
+ bst->queue[bst->pos].arg4 = (void *) bst->queue[bst->pos].type;
+ bst->queue[bst->pos].type = LEFT;
+ bst->word_buf[0] = 0;
+ bst->last_nonwhite = bst->x;
+
+ if (type == CENTER_FULL ||
+ type == LEFT_FULL ||
+ type == RIGHT_FULL)
+ {
+ XSetForeground (bst->dpy, bst->gc, bst->bg);
+ XFillRectangle (bst->dpy, bst->window, bst->gc,
+ 0,
+ bst->y - bst->font->ascent,
+ bst->xgwa.width,
+ bst->font->ascent + bst->font->descent);
+ XSetForeground (bst->dpy, bst->gc, bst->fg);
+ }
+ }
+
+ c = *s++;
+ draw_char (bst, c);
+ bst->queue[bst->pos].arg2 = (void *) s;
+ bst->queue[bst->pos].arg3 = (void *) 1; /* "done once" */
+
+ return (c == '\r' || c == '\n'
+ ? bst->line_delay
+ : bst->char_delay);
+ }
+ case INVERT:
+ {
+ unsigned long swap = bst->fg;
+ bst->fg = bst->bg;
+ bst->bg = swap;
+ XSetForeground (bst->dpy, bst->gc, bst->fg);
+ XSetBackground (bst->dpy, bst->gc, bst->bg);
+ bst->pos++;
+ return 0;
+ }
+ case COLOR:
+ {
+ bst->fg = (unsigned long) bst->queue[bst->pos].arg1;
+ bst->bg = (unsigned long) bst->queue[bst->pos].arg2;
+ XSetForeground (bst->dpy, bst->gc, bst->fg);
+ XSetBackground (bst->dpy, bst->gc, bst->bg);
+ bst->pos++;
+ return 0;
+ }
+ case MOVETO:
+ {
+ bst->x = (long) bst->queue[bst->pos].arg1;
+ bst->y = (long) bst->queue[bst->pos].arg2;
+ bst->word_buf[0] = 0;
+ bst->last_nonwhite = bst->x;
+ bst->pos++;
+ return 0;
+ }
+ case RECT:
+ {
+ int f = (long) bst->queue[bst->pos].arg1;
+ int x = (long) bst->queue[bst->pos].arg2;
+ int y = (long) bst->queue[bst->pos].arg3;
+ int w = (long) bst->queue[bst->pos].arg4;
+ int h = (long) bst->queue[bst->pos].arg5;
+ if (f)
+ XFillRectangle (bst->dpy, bst->window, bst->gc, x, y, w, h);
+ else
+ XDrawRectangle (bst->dpy, bst->window, bst->gc, x, y, w, h);
+ bst->pos++;
+ return 0;
+ }
+ case LINE:
+ {
+ int x1 = (long) bst->queue[bst->pos].arg1;
+ int y1 = (long) bst->queue[bst->pos].arg2;
+ int x2 = (long) bst->queue[bst->pos].arg3;
+ int y2 = (long) bst->queue[bst->pos].arg4;
+ int t = (long) bst->queue[bst->pos].arg5;
+ XGCValues gcv;
+ gcv.line_width = t;
+ XChangeGC (bst->dpy, bst->gc, GCLineWidth, &gcv);
+ XDrawLine (bst->dpy, bst->window, bst->gc, x1, y1, x2, y2);
+ bst->pos++;
+ return 0;
+ }
+ case COPY:
+ case PIXMAP:
+ {
+ int srcx = (long) bst->queue[bst->pos].arg1;
+ int srcy = (long) bst->queue[bst->pos].arg2;
+ int w = (long) bst->queue[bst->pos].arg3;
+ int h = (long) bst->queue[bst->pos].arg4;
+ int tox = (long) bst->queue[bst->pos].arg5;
+ int toy = (long) bst->queue[bst->pos].arg6;
+ if (type == PIXMAP && bst->mask)
+ {
+ XSetClipMask (bst->dpy, bst->gc, bst->mask);
+ XSetClipOrigin (bst->dpy, bst->gc, tox, toy);
+ }
+ XCopyArea (bst->dpy,
+ (type == PIXMAP ? bst->pixmap : bst->window),
+ bst->window, bst->gc,
+ srcx, srcy, w, h, tox, toy);
+ if (type == PIXMAP && bst->mask)
+ XSetClipMask (bst->dpy, bst->gc, None);
+ bst->pos++;
+ return 0;
+ }
+ case IMG:
+ {
+ if (bst->img_loader) abort();
+ bst->img_loader = load_image_async_simple (0, bst->xgwa.screen,
+ bst->window, bst->window,
+ 0, 0);
+ bst->pos++;
+ return 0;
+ }
+ case FONT:
+ {
+ switch ((long) bst->queue[bst->pos].arg1) {
+ case 0: bst->font = bst->fontA; break;
+ case 1: bst->font = bst->fontB; break;
+ case 2: bst->font = bst->fontC; break;
+ default: abort(); break;
+ }
+ XSetFont (bst->dpy, bst->gc, bst->font->fid);
+ bst->pos++;
+ return 0;
+ }
+ case PAUSE:
+ {
+ long delay = (long) bst->queue[bst->pos].arg1;
+ bst->pos++;
+ return delay;
+ }
+ case CHAR_DELAY:
+ {
+ bst->char_delay = (long) bst->queue[bst->pos].arg1;
+ bst->pos++;
+ return 0;
+ }
+ case LINE_DELAY:
+ {
+ bst->line_delay = (long) bst->queue[bst->pos].arg1;
+ bst->pos++;
+ return 0;
+ }
+ case MARGINS:
+ {
+ bst->left_margin = (long) bst->queue[bst->pos].arg1;
+ bst->right_margin = (long) bst->queue[bst->pos].arg2;
+ bst->pos++;
+ return 0;
+ }
+ case VERT_MARGINS:
+ {
+ bst->top_margin = (long) bst->queue[bst->pos].arg1;
+ bst->bottom_margin = (long) bst->queue[bst->pos].arg2;
+ bst->pos++;
+ return 0;
+ }
+ case CURSOR_BLOCK:
+ case CURSOR_LINE:
+ {
+ long delay = (long) bst->queue[bst->pos].arg1;
+ long count = (long) bst->queue[bst->pos].arg2;
+ int ox = bst->x;
+
+ if (type == CURSOR_BLOCK)
+ {
+ unsigned long swap = bst->fg;
+ bst->fg = bst->bg;
+ bst->bg = swap;
+ XSetForeground (bst->dpy, bst->gc, bst->fg);
+ XSetBackground (bst->dpy, bst->gc, bst->bg);
+ draw_char (bst, ' ');
+ }
+ else
+ {
+ draw_char (bst, (count & 1 ? ' ' : '_'));
+ draw_char (bst, ' ');
+ }
+
+ bst->x = ox;
+
+ count--;
+ bst->queue[bst->pos].arg2 = (void *) count;
+ if (count <= 0)
+ bst->pos++;
+
+ return delay;
+ }
+ case WRAP:
+ bst->wrap_p = 1;
+ bst->word_wrap_p = 0;
+ bst->pos++;
+ return 0;
+
+ case WORD_WRAP:
+ bst->wrap_p = 0;
+ bst->word_wrap_p = 1;
+ bst->pos++;
+ return 0;
+
+ case TRUNCATE:
+ bst->wrap_p = 0;
+ bst->word_wrap_p = 0;
+ bst->pos++;
+ return 0;
+
+ case LOOP:
+ {
+ long off = (long) bst->queue[bst->pos].arg1;
+ bst->pos += off;
+ if (bst->pos < 0 || bst->pos >= bst->queue_size)
+ abort();
+ return 0;
+ }
+ case RESET:
+ {
+ int i;
+ for (i = 0; i < bst->queue_size; i++)
+ switch (bst->queue[i].type) {
+ case LEFT: case LEFT_FULL:
+ case CENTER: case CENTER_FULL:
+ case RIGHT: case RIGHT_FULL:
+ bst->queue[i].arg2 = bst->queue[i].arg1;
+ bst->queue[i].arg3 = 0;
+ bst->queue[i].type = (bsod_event_type) bst->queue[i].arg4;
+ break;
+ default: break;
+ }
+ bst->pos = 0;
+ return 0;
+ }
+ case CROP:
+ {
+ bst->crop_p = (long) bst->queue[bst->pos].arg1;
+ bst->pos++;
+ return 0;
+ }
+ case EOF:
+ {
+ bst->pos = -1;
+ return -1;
+ }
+ default:
+ break;
+ }
+ abort();
+}
+
+
+static struct bsod_state *
+make_bsod_state (Display *dpy, Window window,
+ const char *name, const char *class)
+{
+ XGCValues gcv;
+ struct bsod_state *bst;
+ char buf1[1024], buf2[1024];
+ char buf5[1024], buf6[1024];
+ char buf7[1024], buf8[1024];
+ const char *font1, *font3, *font4;
+
+ bst = (struct bsod_state *) calloc (1, sizeof (*bst));
+ bst->queue_size = 10;
+ bst->queue = (struct bsod_event *) calloc (bst->queue_size,
+ sizeof (*bst->queue));
+ bst->dpy = dpy;
+ bst->window = window;
+ XGetWindowAttributes (dpy, window, &bst->xgwa);
+
+ /* If the window is small, use ".font"; if big, ".bigFont". */
+ if (
+# ifdef HAVE_MOBILE
+ 1
+# else
+ bst->xgwa.height < 640
+# endif
+ )
+ {
+ sprintf (buf1, "%.100s.font", name);
+ sprintf (buf2, "%.100s.font", class);
+ }
+ else
+ {
+ sprintf (buf1, "%.100s.bigFont", name);
+ sprintf (buf2, "%.100s.bigFont", class);
+ }
+ sprintf (buf5, "%.100s.fontB", name);
+ sprintf (buf6, "%.100s.fontB", class);
+ sprintf (buf7, "%.100s.fontC", name);
+ sprintf (buf8, "%.100s.fontC", class);
+
+ font1 = get_string_resource (dpy, buf1, buf2);
+ font3 = get_string_resource (dpy, buf5, buf6);
+ font4 = get_string_resource (dpy, buf7, buf8);
+
+ /* If there was no ".mode.font" resource also look for ".font".
+ Under real X11, the wildcard does this, so this is redundant,
+ but jwxyz needs it because it doesn't implement wildcards.
+ */
+# define RES2(VAR, BUF1, BUF2) do { \
+ if (! VAR) { \
+ VAR = get_string_resource (dpy, \
+ strchr (BUF1, '.') + 1, \
+ strchr (BUF2, '.') + 1); \
+ }} while(0)
+ RES2 (font1, buf1, buf2);
+ RES2 (font3, buf5, buf6);
+ RES2 (font4, buf7, buf8);
+#undef RES2
+
+ if (font1 && *font1)
+ bst->font = load_font_retry (dpy, font1);
+
+ if (! bst->font)
+ abort();
+
+ if (font3 && *font3)
+ bst->fontB = load_font_retry (dpy, font3);
+ if (font4 && *font4)
+ bst->fontC = load_font_retry (dpy, font4);
+
+ if (! bst->fontB) bst->fontB = bst->font;
+ if (! bst->fontC) bst->fontC = bst->font;
+
+ bst->fontA = bst->font;
+
+
+ gcv.font = bst->font->fid;
+
+ sprintf (buf1, "%.100s.foreground", name);
+ sprintf (buf2, "%.100s.Foreground", class);
+ bst->fg = gcv.foreground = get_pixel_resource (dpy, bst->xgwa.colormap,
+ buf1, buf2);
+ sprintf (buf1, "%.100s.background", name);
+ sprintf (buf2, "%.100s.Background", class);
+ bst->bg = gcv.background = get_pixel_resource (dpy, bst->xgwa.colormap,
+ buf1, buf2);
+ bst->gc = XCreateGC (dpy, window, GCFont|GCForeground|GCBackground, &gcv);
+
+#ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (dpy, bst->gc, True);
+#endif
+
+# ifdef USE_IPHONE
+ /* Stupid iPhone X bezel.
+ #### This is the worst of all possible ways to do this!
+ */
+ if (bst->xgwa.width == 2436 || bst->xgwa.height == 2436) {
+ if (bst->xgwa.width > bst->xgwa.height)
+ bst->xoff = 96;
+ else
+ bst->yoff = 96;
+ }
+# endif
+
+ bst->left_margin = bst->right_margin = 10;
+ bst->x = bst->left_margin + bst->xoff;
+ bst->y = bst->font->ascent + bst->left_margin + bst->yoff;
+
+ XSetWindowBackground (dpy, window, gcv.background);
+ return bst;
+}
+
+
+static void
+free_bsod_state (struct bsod_state *bst)
+{
+ int i;
+
+ if (bst->free_cb)
+ bst->free_cb (bst);
+ if (bst->pixmap)
+ XFreePixmap(bst->dpy, bst->pixmap);
+ if (bst->mask)
+ XFreePixmap(bst->dpy, bst->mask);
+
+ XFreeFont (bst->dpy, bst->font);
+ XFreeGC (bst->dpy, bst->gc);
+
+ for (i = 0; i < bst->queue_size; i++)
+ switch (bst->queue[i].type) {
+ case LEFT: case LEFT_FULL:
+ case RIGHT: case RIGHT_FULL:
+ case CENTER: case CENTER_FULL:
+ free ((char *) bst->queue[i].arg1);
+ break;
+ default:
+ break;
+ }
+
+ free (bst->queue);
+ free (bst);
+}
+
+
+static Pixmap
+double_pixmap (Display *dpy, Visual *visual, int depth, Pixmap pixmap,
+ int pix_w, int pix_h)
+{
+ int x, y;
+ Pixmap p2 = XCreatePixmap(dpy, pixmap, pix_w*2, pix_h*2, depth);
+ XImage *i1 = XGetImage (dpy, pixmap, 0, 0, pix_w, pix_h, ~0L,
+ (depth == 1 ? XYPixmap : ZPixmap));
+ XImage *i2 = XCreateImage (dpy, visual, depth,
+ (depth == 1 ? XYPixmap : ZPixmap), 0, 0,
+ pix_w*2, pix_h*2, 8, 0);
+ XGCValues gcv;
+ GC gc = XCreateGC (dpy, p2, 0, &gcv);
+ i2->data = (char *) calloc(i2->height, i2->bytes_per_line);
+ for (y = 0; y < pix_h; y++)
+ for (x = 0; x < pix_w; x++)
+ {
+ unsigned long p = XGetPixel(i1, x, y);
+ XPutPixel(i2, x*2, y*2, p);
+ XPutPixel(i2, x*2+1, y*2, p);
+ XPutPixel(i2, x*2, y*2+1, p);
+ XPutPixel(i2, x*2+1, y*2+1, p);
+ }
+ free(i1->data); i1->data = 0;
+ XDestroyImage(i1);
+ XPutImage(dpy, p2, gc, i2, 0, 0, 0, 0, i2->width, i2->height);
+ XFreeGC (dpy, gc);
+ free(i2->data); i2->data = 0;
+ XDestroyImage(i2);
+ XFreePixmap(dpy, pixmap);
+ return p2;
+}
+
+
+/*****************************************************************************
+ *****************************************************************************/
+
+static struct bsod_state *
+windows_31 (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "windows", "Windows");
+
+ bst->xoff = bst->left_margin = bst->right_margin = 0;
+
+ BSOD_INVERT (bst);
+ BSOD_TEXT (bst, CENTER, "Windows\n");
+ BSOD_INVERT (bst);
+ BSOD_TEXT (bst, CENTER,
+ "A fatal exception 0E has occured at F0AD:42494C4C\n"
+ "the current application will be terminated.\n"
+ "\n"
+ "* Press any key to terminate the current application.\n"
+ "* Press CTRL+ALT+DELETE again to restart your computer.\n"
+ " You will lose any unsaved information in all applications.\n"
+ "\n"
+ "\n");
+ BSOD_TEXT (bst, CENTER, "Press any key to continue");
+
+ bst->y = ((bst->xgwa.height - bst->yoff -
+ ((bst->font->ascent + bst->font->descent) * 9))
+ / 2);
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+static struct bsod_state *
+vmware (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "vmware", "VMware");
+
+ unsigned long fg = bst->fg;
+ unsigned long bg = bst->bg;
+ unsigned long fg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "vmware.foreground2",
+ "vmware.foreground");
+ BSOD_COLOR (bst, fg2, bg);
+ BSOD_TEXT (bst, LEFT,
+ "VMware ESX Server [Releasebuild-98103]\n");
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_TEXT (bst, LEFT,
+ "PCPU 1 locked up. Failed to ack TLB invalidate.\n"
+ "frame=0x3a37d98 ip=0x625e94 cr2=0x0 cr3=0x40c66000 cr4=0x16c\n"
+ "es=0xffffffff ds=0xffffffff fs=0xffffffff gs=0xffffffff\n"
+ "eax=0xffffffff ebx=0xffffffff ecx=0xffffffff edx=0xffffffff\n"
+ "ebp=0x3a37ef4 esi=0xffffffff edi=0xffffffff err=-1 eflags=0xffffffff\n"
+ "*0:1037/helper1-4 1:1107/vmm0:Fagi 2:1121/vmware-vm 3:1122/mks:Franc\n"
+ "0x3a37ef4:[0x625e94]Panic+0x17 stack: 0x833ab4, 0x3a37f10, 0x3a37f48\n"
+ "0x3a37f04:[0x625e94]Panic+0x17 stack: 0x833ab4, 0x1, 0x14a03a0\n"
+ "0x3a37f48:[0x64bfa4]TLBDoInvalidate+0x38f stack: 0x3a37f54, 0x40, 0x2\n"
+ "0x3a37f70:[0x66da4d]XMapForceFlush+0x64 stack: 0x0, 0x4d3a, 0x0\n"
+ "0x3a37fac:[0x652b8b]helpFunc+0x2d2 stack: 0x1, 0x14a4580, 0x0\n"
+ "0x3a37ffc:[0x750902]CpuSched_StartWorld+0x109 stack: 0x0, 0x0, 0x0\n"
+ "0x3a38000:[0x0]blk_dev+0xfd76461f stack: 0x0, 0x0, 0x0\n"
+ "VMK uptime: 7:05:43:45.014 TSC: 1751259712918392\n"
+ "Starting coredump to disk\n");
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT, "using slot 1 of 1... ");
+ BSOD_CHAR_DELAY (bst, 300000);
+ BSOD_TEXT (bst, LEFT, "9876");
+ BSOD_CHAR_DELAY (bst, 3000000);
+ BSOD_TEXT (bst, LEFT, "66665");
+ BSOD_CHAR_DELAY (bst, 100000);
+ BSOD_TEXT (bst, LEFT, "4321");
+ BSOD_CHAR_DELAY (bst, 0);
+ BSOD_TEXT (bst, LEFT, "Disk dump successfull.\n"
+ "Waiting for Debugger (world 1037)\n"
+ "Debugger is listening on serial port ...\n");
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT, "Press Escape to enter local debugger\n");
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT, "Remote debugger activated. Local debugger no longer available.\n");
+
+/* BSOD_CURSOR (bst, CURSOR_LINE, 240000, 999999);*/
+
+/* bst->y = ((bst->xgwa.height - bst->yoff -
+ ((bst->font->ascent + bst->font->descent) * 9))
+ / 2);*/
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+
+static struct bsod_state *
+windows_nt (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "nt", "NT");
+
+ BSOD_TEXT (bst, LEFT,
+ "*** STOP: 0x0000001E (0x80000003,0x80106fc0,0x8025ea21,0xfd6829e8)\n"
+ "Unhandled Kernel exception c0000047 from fa8418b4 (8025ea21,fd6829e8)\n"
+ "\n"
+ "Dll Base Date Stamp - Name Dll Base Date Stamp - Name\n"
+ "80100000 2be154c9 - ntoskrnl.exe 80400000 2bc153b0 - hal.dll\n"
+ "80258000 2bd49628 - ncrc710.sys 8025c000 2bd49688 - SCSIPORT.SYS \n"
+ "80267000 2bd49683 - scsidisk.sys 802a6000 2bd496b9 - Fastfat.sys\n"
+ "fa800000 2bd49666 - Floppy.SYS fa810000 2bd496db - Hpfs_Rec.SYS\n"
+ "fa820000 2bd49676 - Null.SYS fa830000 2bd4965a - Beep.SYS\n"
+ "fa840000 2bdaab00 - i8042prt.SYS fa850000 2bd5a020 - SERMOUSE.SYS\n"
+ "fa860000 2bd4966f - kbdclass.SYS fa870000 2bd49671 - MOUCLASS.SYS\n"
+ "fa880000 2bd9c0be - Videoprt.SYS fa890000 2bd49638 - NCC1701E.SYS\n"
+ "fa8a0000 2bd4a4ce - Vga.SYS fa8b0000 2bd496d0 - Msfs.SYS\n"
+ "fa8c0000 2bd496c3 - Npfs.SYS fa8e0000 2bd496c9 - Ntfs.SYS\n"
+ "fa940000 2bd496df - NDIS.SYS fa930000 2bd49707 - wdlan.sys\n"
+ "fa970000 2bd49712 - TDI.SYS fa950000 2bd5a7fb - nbf.sys\n"
+ "fa980000 2bd72406 - streams.sys fa9b0000 2bd4975f - ubnb.sys\n"
+ "fa9c0000 2bd5bfd7 - usbser.sys fa9d0000 2bd4971d - netbios.sys\n"
+ "fa9e0000 2bd49678 - Parallel.sys fa9f0000 2bd4969f - serial.SYS\n"
+ "faa00000 2bd49739 - mup.sys faa40000 2bd4971f - SMBTRSUP.SYS\n"
+ "faa10000 2bd6f2a2 - srv.sys faa50000 2bd4971a - afd.sys\n"
+ "faa60000 2bd6fd80 - rdr.sys faaa0000 2bd49735 - bowser.sys\n"
+ "\n"
+ "Address dword dump Dll Base - Name\n"
+ "801afc20 80106fc0 80106fc0 00000000 00000000 80149905 : "
+ "fa840000 - i8042prt.SYS\n"
+ "801afc24 80149905 80149905 ff8e6b8c 80129c2c ff8e6b94 : "
+ "8025c000 - SCSIPORT.SYS\n"
+ "801afc2c 80129c2c 80129c2c ff8e6b94 00000000 ff8e6b94 : "
+ "80100000 - ntoskrnl.exe\n"
+ "801afc34 801240f2 80124f02 ff8e6df4 ff8e6f60 ff8e6c58 : "
+ "80100000 - ntoskrnl.exe\n"
+ "801afc54 80124f16 80124f16 ff8e6f60 ff8e6c3c 8015ac7e : "
+ "80100000 - ntoskrnl.exe\n"
+ "801afc64 8015ac7e 8015ac7e ff8e6df4 ff8e6f60 ff8e6c58 : "
+ "80100000 - ntoskrnl.exe\n"
+ "801afc70 80129bda 80129bda 00000000 80088000 80106fc0 : "
+ "80100000 - ntoskrnl.exe\n"
+ "\n"
+ "Kernel Debugger Using: COM2 (Port 0x2f8, Baud Rate 19200)\n"
+ "Restart and set the recovery options in the system control panel\n"
+ "or the /CRASHDEBUG system start option. If this message reappears,\n"
+ "contact your system administrator or technical support group."
+ );
+
+ bst->line_delay = 750;
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+static struct bsod_state *
+windows_2k (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "windows", "Windows");
+
+ BSOD_TEXT (bst, LEFT,
+ "*** STOP: 0x000000D1 (0xE1D38000,0x0000001C,0x00000000,0xF09D42DA)\n"
+ "DRIVER_IRQL_NOT_LESS_OR_EQUAL \n"
+ "\n"
+ "*** Address F09D42DA base at F09D4000, DateStamp 39f459ff - CRASHDD.SYS\n"
+ "\n"
+ "Beginning dump of physical memory\n");
+ BSOD_PAUSE (bst, 4000000);
+ BSOD_TEXT (bst, LEFT,
+ "Physical memory dump complete. Contact your system administrator or\n"
+ "technical support group.\n");
+
+ bst->left_margin = 40;
+ bst->y = (bst->font->ascent + bst->font->descent) * 10;
+ bst->line_delay = 750;
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+static struct bsod_state *
+windows_me (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "windows", "Windows");
+
+ BSOD_TEXT (bst, LEFT,
+ "Windows protection error. You need to restart your computer.\n\n"
+ "System halted.");
+ BSOD_CURSOR (bst, CURSOR_LINE, 120000, 999999);
+
+ bst->left_margin = 40;
+ bst->y = ((bst->xgwa.height - bst->yoff -
+ ((bst->font->ascent + bst->font->descent) * 3))
+ / 2);
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+static struct bsod_state *
+windows_xp (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "windows", "Windows");
+
+ BSOD_TEXT (bst, LEFT, /* From Wm. Rhodes <xscreensaver@27.org> */
+ "A problem has been detected and windows has been shut down to prevent "
+ "damage\n"
+ "to your computer.\n"
+ "\n"
+ "If this is the first time you've seen this Stop error screen,\n"
+ "restart your computer. If this screen appears again, follow\n"
+ "these steps:\n"
+ "\n"
+ "Check to be sure you have adequate disk space. If a driver is\n"
+ "identified in the Stop message, disable the driver or check\n"
+ "with the manufacturer for driver updates. Try changing video\n"
+ "adapters.\n"
+ "\n"
+ "Check with your hardware vendor for any BIOS updates. Disable\n"
+ "BIOS memory options such as caching or shadowing. If you need\n"
+ "to use Safe Mode to remove or disable components, restart your\n"
+ "computer, press F8 to select Advanced Startup Options, and then\n"
+ "select Safe Mode.\n"
+ "\n"
+ "Technical information:\n"
+ "\n"
+ "*** STOP: 0x0000007E (0xC0000005,0xF88FF190,0x0xF8975BA0,0xF89758A0)\n"
+ "\n"
+ "\n"
+ "*** EPUSBDSK.sys - Address F88FF190 base at FF88FE000, datestamp "
+ "3b9f3248\n"
+ "\n"
+ "Beginning dump of physical memory\n");
+ BSOD_PAUSE (bst, 4000000);
+ BSOD_TEXT (bst, LEFT,
+ "Physical memory dump complete.\n"
+ "Contact your system administrator or technical support group for "
+ "further\n"
+ "assistance.\n");
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+static struct bsod_state *
+windows_lh (Display *dpy, Window window)
+{
+ struct bsod_state *bst =
+ make_bsod_state (dpy, window, "windowslh", "WindowsLH");
+
+ unsigned long fg = bst->fg;
+ unsigned long bg = bst->bg;
+ unsigned long bg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "windowslh.background2",
+ "WindowsLH.Background");
+
+ /* The "RSOD" that appeared with "Windows Longhorn 5048.050401-0536_x86fre"
+ As reported by http://joi.ito.com/RedScreen.jpg
+ */
+ BSOD_COLOR (bst, bg, bg2);
+ BSOD_TEXT (bst, CENTER_FULL, "Windows Boot Error\n");
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_TEXT (bst, CENTER,
+ "\n"
+ "Windows Boot Manager has experienced a problem.\n"
+ "\n"
+ "\n"
+ " Status: 0xc000000f\n"
+ "\n"
+ "\n"
+ "\n"
+ " Info: An error occurred transferring exectuion." /* (sic) */
+ "\n"
+ "\n"
+ "\n"
+ "You can try to recover the system with the Microsoft Windows "
+ "System Recovery\n"
+ "Tools. (You might need to restart the system manually.)\n"
+ "\n"
+ "If the problem continues, please contact your system administrator "
+ "or computer\n"
+ "manufacturer.\n"
+ );
+ BSOD_MOVETO (bst, bst->left_margin + bst->xoff,
+ bst->xgwa.height - bst->yoff - bst->font->descent);
+ BSOD_COLOR (bst, bg, bg2);
+ BSOD_TEXT (bst, LEFT_FULL, " SPACE=Continue\n");
+
+ bst->y = bst->font->ascent;
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+static struct bsod_state *
+windows_10_update (Display *dpy, Window window)
+{
+ struct bsod_state *bst =
+ make_bsod_state (dpy, window, "win10", "Win10");
+ const char *fmt = "Working on updates %d%%";
+ char line1[255];
+ const char *line2 = "Don't turn off your PC. This will take a while.";
+ const char *line3 = "Your PC will restart several times.";
+ int line_height = bst->fontA->ascent + bst->fontA->descent;
+ int y1 = bst->xgwa.height / 2 - line_height * 4;
+ int y2 = bst->xgwa.height - bst->yoff - line_height * 3;
+ int pct;
+
+ /* TODO: win10_spinner.gif goes at (y - line_height * 2 - 64). */
+
+ for (pct = 0; pct < 98; pct++)
+ {
+ BSOD_MOVETO (bst, 0, y1);
+ sprintf (line1, fmt, pct);
+ BSOD_TEXT (bst, CENTER, line1);
+ BSOD_MOVETO (bst, 0, y1 + line_height);
+ BSOD_TEXT (bst, CENTER, line2);
+ BSOD_MOVETO (bst, 0, y2);
+ BSOD_TEXT (bst, CENTER, line3);
+ BSOD_PAUSE (bst, 200000 + (random() % 3000000) + (random() % 3000000));
+ }
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+static struct bsod_state *
+windows_10 (Display *dpy, Window window)
+{
+ struct bsod_state *bst =
+ make_bsod_state (dpy, window, "win10", "Win10");
+
+ int qr_width = 41;
+ int qr_height = 41;
+ static const unsigned char qr_bits[] = {
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,
+ 0x03,0x9A,0x70,0xEE,0x80,0x01,0xFB,0x22,0xAA,0xA6,0xBE,0x01,
+ 0x8B,0x8E,0x74,0xE7,0xA2,0x01,0x8B,0xEE,0x42,0xC4,0xA2,0x01,
+ 0x8B,0x42,0x6E,0xED,0xA2,0x01,0xFB,0xDA,0x63,0xA6,0xBE,0x01,
+ 0x03,0xAA,0xAA,0xAA,0x80,0x01,0xFF,0x8B,0xD8,0x9D,0xFF,0x01,
+ 0x63,0x62,0xDA,0x1B,0x98,0x01,0x6F,0x67,0x98,0x9F,0xBC,0x01,
+ 0x4F,0xCC,0x55,0x81,0x83,0x01,0xB7,0x6D,0xFF,0x68,0xB2,0x01,
+ 0xC3,0x10,0x87,0x8B,0x96,0x01,0x6F,0xB1,0x91,0x58,0x94,0x01,
+ 0xE3,0x36,0x88,0x84,0xB8,0x01,0x83,0x9B,0xFE,0x59,0xD7,0x01,
+ 0x3B,0x74,0x98,0x5C,0xB4,0x01,0x37,0x75,0xDC,0x91,0xA6,0x01,
+ 0x77,0xDE,0x01,0x54,0xBA,0x01,0xBB,0x6D,0x8B,0xB9,0xB5,0x01,
+ 0x1F,0x06,0xBD,0x9B,0xB4,0x01,0xD3,0xBD,0x91,0x19,0x84,0x01,
+ 0x0B,0x20,0xD8,0x91,0xB4,0x01,0x33,0x95,0xBC,0x0A,0xD5,0x01,
+ 0xB3,0x60,0xDC,0xD9,0xB6,0x01,0xEF,0x77,0x18,0x09,0xA4,0x01,
+ 0xA3,0xC2,0x95,0x51,0xB2,0x01,0xDF,0x63,0xDB,0xBE,0xB3,0x01,
+ 0x03,0x08,0xC9,0x09,0xF0,0x01,0xFF,0xA3,0x19,0xBD,0xFB,0x01,
+ 0x03,0x2E,0x84,0xA5,0xAA,0x01,0xFB,0x9A,0xFC,0x9B,0xBB,0x01,
+ 0x8B,0x7E,0x9C,0x1D,0xB0,0x01,0x8B,0x6E,0x58,0xA1,0xDB,0x01,
+ 0x8B,0xDA,0xD5,0x65,0xA2,0x01,0xFB,0x72,0xFB,0xE9,0xF0,0x01,
+ 0x03,0x02,0x99,0x3B,0xB3,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0x01};
+ Pixmap pixmap;
+
+ const char *lines[] = {
+ ":(\n",
+ "\n",
+ "Your PC ran into a problem and needs to restart. We're just\n",
+ "collecting some error info, and then we'll restart for you.\n",
+ "\n",
+ "\n",
+ "\n",
+ "For more information about this issue and\n",
+ "possible fixes, visit\n",
+/* "https://www.jwz.org/xscreensaver\n",*/
+ "http://youtu.be/-RjmN9RZyr4\n",
+ "\n",
+ "If you call a support person, give them this info:\n",
+ "Stop code CRITICAL_PROCESS_DIED",
+ };
+ int i, y = 0, y0 = 0;
+ int line_height0 = bst->fontB->ascent;
+ int line_height1 = bst->fontA->ascent + bst->fontA->descent;
+ int line_height2 = bst->fontC->ascent + bst->fontC->descent;
+ int line_height = line_height0;
+ int top, left0, left;
+ int stop = 60 + (random() % 39);
+
+ if (!(random() % 7))
+ return windows_10_update (dpy, window);
+
+
+ line_height1 *= 1.3;
+ line_height2 *= 1.5;
+
+ top = ((bst->xgwa.height - bst->yoff
+ - (line_height0 * 1 +
+ line_height1 * 6 +
+ line_height2 * 6))
+ / 2);
+
+ {
+ int dir, ascent, descent;
+ XCharStruct ov;
+ const char *s = lines[2];
+ XTextExtents (bst->fontA, s, strlen(s),
+ &dir, &ascent, &descent, &ov);
+ left = left0 = (bst->xgwa.width - ov.width) / 2;
+ }
+
+ pixmap = XCreatePixmapFromBitmapData (dpy, window, (char *) qr_bits,
+ qr_width, qr_height,
+ bst->fg, bst->bg, bst->xgwa.depth);
+ {
+ int n = 2;
+ if (bst->xgwa.width > 2560) n++; /* Retina displays */
+ for (i = 0; i < n; i++)
+ {
+ pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
+ pixmap, qr_width, qr_height);
+ qr_width *= 2;
+ qr_height *= 2;
+ }
+ }
+ bst->pixmap = pixmap;
+
+ y = top;
+ line_height = line_height0;
+ BSOD_FONT (bst, 1);
+ for (i = 0; i < countof(lines); i++)
+ {
+ BSOD_MOVETO (bst, left, y);
+ BSOD_TEXT (bst, LEFT, lines[i]);
+ y += line_height;
+ if (i == 0)
+ {
+ BSOD_FONT (bst, 0);
+ line_height = line_height1;
+ }
+ else if (i == 4)
+ {
+ y0 = y;
+ y += line_height / 2;
+ BSOD_PIXMAP (bst, 0, 0, qr_width, qr_height, left, y + line_height1);
+ BSOD_FONT (bst, 2);
+ line_height = line_height2;
+ left += qr_width + line_height2 / 2;
+# ifdef HAVE_MOBILE
+ y -= 14;
+# endif
+ }
+ }
+
+ left = left0;
+ BSOD_FONT (bst, 0);
+ for (i = 0; i <= stop; i++)
+ {
+ char buf[100];
+ sprintf (buf, "%d%% complete", i);
+ BSOD_MOVETO (bst, left, y0);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 85000);
+ }
+ BSOD_PAUSE (bst, 3000000);
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+static struct bsod_state *
+windows_other (Display *dpy, Window window)
+{
+ /* Lump all of the 2K-ish crashes together and select them randomly...
+ */
+ int which = (random() % 4);
+ switch (which) {
+ case 0: return windows_2k (dpy, window); break;
+ case 1: return windows_me (dpy, window); break;
+ case 2: return windows_xp (dpy, window); break;
+ case 3: return windows_lh (dpy, window); break;
+ default: abort(); break;
+ }
+}
+
+/* Windows and Apple2 ransomware.
+ */
+static struct bsod_state *apple2ransomware (Display *, Window);
+
+static struct bsod_state *
+windows_ransomware (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window,
+ "ransomware", "Ransomware");
+ char buf[1024];
+
+ int pix_w = 0, pix_h = 0;
+ Pixmap mask = 0;
+ Pixmap pixmap = image_data_to_pixmap (dpy, window,
+ ransomware_png, sizeof(ransomware_png),
+ &pix_w, &pix_h, &mask);
+ int i, n = 0;
+
+ /* Don't start the countdown from the start, advance the deadline by 3 - 30
+ hours */
+ int advance_deadline = (random() % 97200) + 10800;
+
+ time_t now = time(NULL);
+ const time_t stage1_deadline = now + 259200 - advance_deadline; /* 3 days */
+ const time_t stage2_deadline = now + 604800 - advance_deadline; /* 7 days */
+ char stage1_deadline_str[25], stage2_deadline_str[25];
+ char countdown_str[16];
+ int countdown_d, countdown_h, countdown_m, countdown_s, countdown_r;
+ int line_height = bst->font->ascent + bst->font->descent;
+ int line_height1 = bst->fontA->ascent + bst->fontA->descent;
+
+ const char *currencies[] = {
+ "Blitcoin",
+ "Bitcorn",
+ "Buttcorn",
+ "clicks",
+ "clicks",
+ "Ass Pennies",
+ "Ass Pennies",
+ "Dollary-doos",
+ "Dunning-Krugerrands",
+ "Dunning-Krugerrands",
+ "Dunning-Krugerrands",
+ "Dunning-Krugerrands",
+ "Dunning-Krugerrands",
+ "Dunning-Krugerrands",
+ "gift certificates",
+ "Creepto-Currency",
+ "secret sauce",
+ "Tribbles",
+ };
+
+ const char *currency = currencies[random() % countof(currencies)];
+
+ const char *header_quips[] = {
+ "Oops, your screens have been encrypted!",
+ "Oops, your screens have been encrypted!",
+ "Oops, your screens have been encrypted!",
+ "Oops, your screens have been encrypted!",
+ "Oops, your screen have encrypted!",
+ "Oops, you're screens have been encrypted!",
+ "Oops, your screens have been encrupted!",
+ "Oops, your screens have been encrumpet!",
+ "Oops, your screens have been encrusted!",
+ "If you don't pay this ransom, then you are a theif!",
+ "Your screen was subject to the laws of mathomatics!",
+ "Oops, your screen was shaved by Occam's Razor!",
+ "Oops, your screen was perturbated by Langford's Basilisk!",
+ "Your screen is now stored as Snapchat messages!",
+ "Oops, your screen is now stored on Betamax!",
+ "Oops, your screen is now in the clown!",
+ "Oops, your screen has been deprecated!",
+ "Oops, you're screen was seized by the FBI!",
+ "All your screen was shared with your coworkers!",
+ "All your screen are belong to us.",
+ "Well actually, your screen isn't needed anymore.",
+ "u just got popped with some 0day shit!!",
+ "M'lady,",
+ };
+
+ const char *header_quip = header_quips[random() % countof(header_quips)];
+
+ /* You got this because... */
+ const char *excuse_quips[] = {
+ "all human actions are equivalent and all are on principle doomed "
+ "to failure",
+ "you hold a diverse portfolio of cryptocurrencies",
+ "you need to get in on ransomware futures at the ground floor",
+ "your flight was overbooked",
+ "you did not apply the security update for bugs NSA keys secret from "
+ "Microsoft in your Windows(R) operating system",
+ "you are bad and you should feel bad",
+ "you used the wifi at defcon",
+ "you lack official Clown Strike[TM] threaty threat technology",
+ };
+
+ const char *excuse_quip = excuse_quips[random() % countof(excuse_quips)];
+
+ /* WELL ACTUALLY, screensavers aren't really nescessary anymore because... */
+ const char *screensaver_quips[] = {
+ "I read it on hacker news",
+ "that's official Debian policy now",
+ "that is the official policy of United Airlines",
+ "they cause global warming",
+ "they lack an eternal struggle",
+ "they lack a vapid dichotomy",
+ "those electrons could be used for gold farming instead",
+ "you can make more money in art exhibitions",
+ };
+
+ const char *screensaver_quip =
+ screensaver_quips[random() % countof(screensaver_quips)];
+
+ const char *lines[] = {
+ "*What Happened To My Computer?\n",
+ "Your important pixels are paintcrypted. All of your documents, photos, ",
+ "videos, databases, icons, dick pics are not accessible because they ",
+ "have been bitblted. Maybe you are looking for a way to get them back, ",
+ "but don't waste your time. Nobody can recover your pixels without our ",
+ "pointer motion clicker services.\n",
+ "\n",
+ "*Can I Recover My Important Dick Pix?\n",
+ "Yes. We guarantee that you can recover them safely and easily. But you ",
+ "not have much time.\n",
+ "You can expose some files for free. Try it now by pressing <The Any ",
+ "Key>.\n",
+ "But if you want to unsave all your screens, then you need to pay. ",
+ "You have only 3 days to click. After that the clicks will double. ",
+ "After 7 days your pixels will be gone forever.\n",
+ "We will have free events for cheapskates who can't pay in 6 months, ",
+ "long after all the pixels are xored.\n",
+ "\n",
+ "*How do I pay?\n",
+ "Payment is accepted in ", "[C]",
+ " only. For more information, press <About ", "[C]", ">.",
+ " Please check the current price of ", "[C]", " and buy some ", "[C]",
+ ". For more information, press <How to buy ", "[C]", ">.\n",
+ "And send the correct amount to the address specified below. After your ",
+ "payment, press <Check Payment>. Best time to check: 4-6am, Mon-Fri.\n",
+ "\n",
+ "*Why Did I Get This?\n",
+ "You got this because ", "[Q]",
+ ". Also you didn't click hard enough and now Tinkerbelle is dead.\n",
+ "\n",
+ "*But Aren't Screensavers Are Necessary?\n",
+ "WELL ACTUALLY, screensavers aren't really nescessary anymore because ",
+ "[S]", ".\n",
+ "\n",
+ "Please file complaints to @POTUS on Twitter.\n",
+ "\n"
+ "\n"
+ "\n"
+ "\n",
+ "*GREETZ TO CRASH OVERRIDE AND ALSO JOEY\n",
+ };
+
+ /* Positions of UI elements. Layout:
+
+ +---------+-+---------------------------------------+
+ | LOGO | | HEADER |
+ | | |---------------------------------------|
+ | | | NOTE TEXT |
+ | DEAD | | |
+ | LINE | | |
+ | TIMERS | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ +---------+ | |
+ | LINKS | +---------------------------------------+
+ | LINKS | | FOOTER |
+ +---------+-+---------------------------------------+
+
+ The right side of the UI maximises to available width.
+ The note text maximises to available height.
+ The logo, header and timers are anchored to the top left of the window.
+ The links and footer are anchored to the bottom left of the window.
+ The entire window is a fixed 4:3 scale, with a minimum margin around it.
+ */
+
+ /* main window text */
+ unsigned long fg = bst->fg;
+ unsigned long bg = bst->bg;
+ /* ransom note */
+ unsigned long fg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "ransomware.foreground2",
+ "Ransomware.Foreground");
+ unsigned long bg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "ransomware.background2",
+ "Ransomware.Background");
+ /* buttons */
+ unsigned long fg3 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "ransomware.foreground3",
+ "Ransomware.Foreground");
+ unsigned long bg3 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "ransomware.background3",
+ "Ransomware.Background");
+ /* links */
+ unsigned long link = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "ransomware.link",
+ "Ransomware.Foreground");
+ /* headers */
+ unsigned long theader = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "ransomware.timerheader",
+ "Ransomware.Foreground");
+ int left_column_width;
+ int right_column_width;
+ int right_column_height;
+ int stage1_countdown_y, stage2_countdown_y;
+ int margin;
+ int top_height, bottom_height;
+ int x, y;
+
+ if (bst->xgwa.width > 2560) n++; /* Retina displays */
+ for (i = 0; i < n; i++)
+ {
+ pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
+ pixmap, pix_w, pix_h);
+ mask = double_pixmap (dpy, bst->xgwa.visual, 1,
+ mask, pix_w, pix_h);
+ pix_w *= 2;
+ pix_h *= 2;
+ }
+
+ margin = line_height;
+ left_column_width = MAX (pix_w, line_height1 * 8);
+ right_column_width = MIN (line_height * 40,
+ MAX (line_height * 8,
+ bst->xgwa.width - left_column_width
+ - margin*2));
+ top_height = line_height * 2.5;
+ bottom_height = line_height * 6;
+ right_column_height = MIN (line_height * 36,
+ bst->xgwa.height - bottom_height - top_height
+ - line_height);
+
+ if ((bst->xgwa.width / 4) * 3 > bst->xgwa.height)
+ /* Wide screen: keep the big text box at 4:3, centered. */
+ right_column_height = MIN (right_column_height,
+ right_column_width * 4 / 3);
+ else if (right_column_width < line_height * 30)
+ /* Tall but narrow screen: make the text box be full height. */
+ right_column_height = (bst->xgwa.height - bottom_height - top_height
+ - line_height);
+
+ x = (bst->xgwa.width - left_column_width - right_column_width - margin) / 2;
+ y = (bst->xgwa.height - right_column_height - bottom_height) / 2;
+
+ bst->xoff = bst->left_margin = bst->right_margin = 0;
+
+ if (!(random() % 8))
+ return apple2ransomware (dpy, window);
+
+ /* Draw the main red window */
+ BSOD_INVERT (bst);
+ BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
+
+ if (pixmap) {
+ bst->pixmap = pixmap;
+ bst->mask = mask;
+ BSOD_PIXMAP (bst, 0, 0, pix_w, pix_h,
+ x + (left_column_width - pix_w) / 2,
+ y);
+ }
+
+ /* Setup deadlines */
+ strftime (stage1_deadline_str, sizeof(stage1_deadline_str),
+ "%m/%d/%Y %H:%M:%S", localtime(&stage1_deadline));
+ strftime (stage2_deadline_str, sizeof(stage1_deadline_str),
+ "%m/%d/%Y %H:%M:%S", localtime(&stage2_deadline));
+
+ BSOD_INVERT (bst);
+ /* Draw header pane */
+ BSOD_FONT (bst, 0);
+
+ BSOD_MARGINS (bst,
+ x + left_column_width + margin,
+ bst->xgwa.width -
+ (x + left_column_width + margin + right_column_width));
+ BSOD_MOVETO (bst, x + left_column_width + margin,
+ y + bst->fontA->ascent);
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_WORD_WRAP (bst);
+ BSOD_TEXT (bst, CENTER, header_quip);
+ BSOD_TRUNCATE (bst);
+
+ /* Draw left-side timers */
+ BSOD_MARGINS (bst, x, bst->xgwa.width - (x + left_column_width));
+ BSOD_MOVETO (bst, x, y + pix_h + line_height);
+ BSOD_FONT (bst, 1);
+
+ BSOD_COLOR (bst, theader, bg);
+ BSOD_TEXT (bst, CENTER, "Payment will be raised on\n");
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_TEXT (bst, CENTER, stage1_deadline_str);
+
+ stage1_countdown_y = y + pix_h + line_height + line_height1 * 3;
+ BSOD_MOVETO (bst, x, stage1_countdown_y - line_height);
+ BSOD_TEXT (bst, CENTER, "Time Left");
+
+ BSOD_COLOR (bst, theader, bg);
+ BSOD_WORD_WRAP (bst);
+ BSOD_TEXT (bst, CENTER, "\n\n\n\nYour pixels will be lost on\n");
+ BSOD_TRUNCATE (bst);
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_TEXT (bst, CENTER, stage2_deadline_str);
+
+ stage2_countdown_y = stage1_countdown_y + line_height1 * 5;
+ BSOD_MOVETO (bst, x, stage2_countdown_y - line_height);
+ BSOD_TEXT (bst, CENTER, "Time Left");
+
+ BSOD_FONT (bst, 1);
+
+ /* Draw links, but skip on small screens */
+ if (right_column_height > 425) {
+ BSOD_MOVETO (bst, x,
+ y + right_column_height + top_height + bottom_height
+ - line_height1 * 5);
+ BSOD_COLOR (bst, link, bg);
+ BSOD_TEXT (bst, LEFT, "\n");
+ BSOD_TEXT (bst, LEFT, "About ");
+ BSOD_TEXT (bst, LEFT, currency);
+ BSOD_TEXT (bst, LEFT, "\n\n"
+ "How to buy ");
+ BSOD_TEXT (bst, LEFT, currency);
+ BSOD_TEXT (bst, LEFT, "\n\n"
+ "Contact us\n");
+ }
+
+ /* Ransom note text area */
+ BSOD_COLOR (bst, bg2, fg2);
+ BSOD_RECT (bst, True,
+ x + left_column_width + margin,
+ y + top_height,
+ right_column_width,
+ right_column_height);
+ BSOD_MOVETO (bst,
+ x + left_column_width + margin + line_height / 2,
+ y + top_height + line_height + line_height / 2);
+ BSOD_MARGINS (bst,
+ x + left_column_width + margin + line_height / 2,
+ bst->xgwa.width -
+ (x + left_column_width + margin + right_column_width));
+ BSOD_VERT_MARGINS (bst,
+ y + top_height + line_height / 2,
+ bottom_height - line_height);
+ BSOD_INVERT (bst);
+
+ /* Write out the ransom note itself */
+ BSOD_CROP (bst, True);
+ BSOD_WORD_WRAP (bst);
+ for (i = 0; i < countof(lines); i++)
+ {
+ const char *s = lines[i];
+ if (!strcmp(s, "[C]")) s = currency;
+ else if (!strcmp(s, "[Q]")) s = excuse_quip;
+ else if (!strcmp(s, "[S]")) s = screensaver_quip;
+
+ if (*s == '*')
+ {
+ s++;
+ BSOD_FONT (bst, 2);
+ }
+ else
+ BSOD_FONT (bst, 0);
+
+ BSOD_TEXT (bst, LEFT, s);
+ }
+ BSOD_TRUNCATE (bst);
+ BSOD_CROP (bst, False);
+ BSOD_FONT (bst, 0);
+
+ /* Draw over any overflowing ransom text. */
+ BSOD_COLOR (bst, bg, fg);
+ BSOD_RECT (bst, True,
+ x + left_column_width + margin,
+ y + top_height + right_column_height,
+ bst->xgwa.width, bst->xgwa.height);
+ BSOD_RECT (bst, True,
+ x + left_column_width + margin + right_column_width,
+ y + top_height,
+ bst->xgwa.width, bst->xgwa.height);
+
+ /* Draw the footer */
+ BSOD_COLOR (bst, theader, bg);
+ BSOD_MOVETO (bst,
+ x + left_column_width + margin,
+ y + top_height + right_column_height + line_height * 2);
+
+ sprintf(buf, "Send $%.2f of %s to this address:\n", 101+frand(888), currency);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_COLOR (bst, fg2, bg2);
+
+ /* address, has some extra slashes in there because it's a fake address */
+ for (i = 0; i < 40; i++) {
+ const char *s =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123459789";
+ buf[i] = s[random() % strlen(s)];
+ }
+ strncpy (buf, " //", 3);
+ buf[10] = '/';
+ buf[17] = '/';
+ buf[24] = '/';
+ strcpy (buf+33, " ");
+ BSOD_TEXT (bst, LEFT, buf);
+
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_TEXT (bst, LEFT, " ");
+ BSOD_COLOR (bst, fg3, bg3);
+ BSOD_TEXT (bst, LEFT, " Copy ");
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_TEXT (bst, LEFT, "\n\n");
+
+ BSOD_COLOR (bst, fg3, bg3);
+ BSOD_TEXT (bst, LEFT, " Demogrify Screen ");
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_TEXT (bst, LEFT, " ");
+ BSOD_COLOR (bst, fg3, bg3);
+ BSOD_TEXT (bst, LEFT, " Check Payment ");
+
+
+ /* Draw countdown timers */
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_FONT (bst, 0);
+ do {
+ /* First timer */
+ BSOD_MOVETO (bst, x, stage1_countdown_y);
+ BSOD_MARGINS (bst, x, bst->xgwa.width - (x + left_column_width));
+
+ countdown_r = stage1_deadline - now;
+ countdown_s = countdown_r % 60;
+ countdown_m = (countdown_r / 60) % 60;
+ countdown_h = (countdown_r / 3600) % 24;
+ countdown_d = (countdown_r / 86400);
+
+ sprintf (countdown_str, "%02d:%02d:%02d:%02d\n",
+ countdown_d, countdown_h, countdown_m, countdown_s);
+
+ BSOD_TEXT (bst, CENTER, countdown_str);
+
+ /* Second timer */
+ BSOD_MOVETO (bst, x, stage2_countdown_y);
+
+ countdown_r = stage2_deadline - now;
+ countdown_s = countdown_r % 60;
+ countdown_m = (countdown_r / 60) % 60;
+ countdown_h = (countdown_r / 3600) % 24;
+ countdown_d = (countdown_r / 86400);
+
+ sprintf (countdown_str, "%02d:%02d:%02d:%02d\n",
+ countdown_d, countdown_h, countdown_m, countdown_s);
+
+ BSOD_TEXT (bst, CENTER, countdown_str);
+
+ BSOD_PAUSE (bst, 1000000);
+ now++;
+
+ /* While the "correct" thing to do is create enough of a script to fill the
+ * stage2_deadline, this would be 7 days of "frames", which is quite a bit
+ * of memory. Instead, only fill the buffer with 1 hour of frames, which is
+ * enough to make the point before xscreensaver cycles us.
+ */
+ } while (stage1_deadline - now > 3600);
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+/* As seen in Portal 2. By jwz.
+ */
+static struct bsod_state *
+glados (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "glaDOS", "GlaDOS");
+ const char * panicstr[] = {
+ "\n",
+ "MOLTEN CORE WARNING\n",
+ "\n",
+ "An operator error exception has occurred at FISSREAC0020093:09\n",
+ "FISSREAC0020077:14 FISSREAC0020023:17 FISSREAC0020088:22\n",
+ "neutron multiplication rate at spikevalue 99999999\n",
+ "\n",
+ "* Press any key to vent radiological emissions into atmosphere.\n",
+ "* Consult reactor core manual for instructions on proper reactor core\n",
+ "maintenance and repair.\n",
+ "\n",
+ "Press any key to continue\n",
+ };
+
+ int i;
+
+ bst->xoff = bst->left_margin = bst->right_margin = 0;
+
+ bst->y = ((bst->xgwa.height - bst->yoff -
+ ((bst->font->ascent + bst->font->descent) * countof(panicstr)))
+ / 2);
+
+ BSOD_MOVETO (bst, 0, bst->y);
+ BSOD_INVERT (bst);
+ BSOD_TEXT (bst, CENTER, "OPERATOR ERROR\n");
+ BSOD_INVERT (bst);
+ for (i = 0; i < countof(panicstr); i++)
+ BSOD_TEXT (bst, CENTER, panicstr[i]);
+ BSOD_PAUSE (bst, 1000000);
+ BSOD_INVERT (bst);
+ BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
+ BSOD_INVERT (bst);
+ BSOD_PAUSE (bst, 250000);
+ BSOD_RESET (bst);
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+
+/* SCO OpenServer 5 panic, by Tom Kelly <tom@ancilla.toronto.on.ca>
+ */
+static struct bsod_state *
+sco (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "sco", "SCO");
+
+ BSOD_TEXT (bst, LEFT,
+ "Unexpected trap in kernel mode:\n"
+ "\n"
+ "cr0 0x80010013 cr2 0x00000014 cr3 0x00000000 tlb 0x00000000\n"
+ "ss 0x00071054 uesp 0x00012055 efl 0x00080888 ipl 0x00000005\n"
+ "cs 0x00092585 eip 0x00544a4b err 0x004d4a47 trap 0x0000000E\n"
+ "eax 0x0045474b ecx 0x0042544b edx 0x57687920 ebx 0x61726520\n"
+ "esp 0x796f7520 ebp 0x72656164 esi 0x696e6720 edi 0x74686973\n"
+ "ds 0x3f000000 es 0x43494c48 fs 0x43525343 gs 0x4f4d4b53\n"
+ "\n"
+ "PANIC: k_trap - kernel mode trap type 0x0000000E\n"
+ "Trying to dump 5023 pages to dumpdev hd (1/41), 63 pages per '.'\n"
+ );
+ BSOD_CHAR_DELAY (bst, 100000);
+ BSOD_TEXT (bst, LEFT,
+ "................................................................."
+ "..............\n"
+ );
+ BSOD_CHAR_DELAY (bst, 0);
+ BSOD_TEXT (bst, LEFT,
+ "5023 pages dumped\n"
+ "\n"
+ "\n"
+ );
+ BSOD_PAUSE (bst, 2000000);
+ BSOD_TEXT (bst, LEFT,
+ "** Safe to Power Off **\n"
+ " - or -\n"
+ "** Press Any Key to Reboot **\n"
+ );
+
+ bst->y = ((bst->xgwa.height - bst->yoff -
+ ((bst->font->ascent + bst->font->descent) * 18)));
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+/* Linux (sparc) panic, by Tom Kelly <tom@ancilla.toronto.on.ca>
+ */
+static struct bsod_state *
+sparc_linux (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window,
+ "sparclinux", "SparcLinux");
+ bst->scroll_p = True;
+ bst->y = bst->xgwa.height - bst->yoff
+ - bst->font->ascent - bst->font->descent;
+
+ BSOD_TEXT (bst, LEFT,
+ "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
+ "Unable to handle kernel paging request at virtual address f0d4a000\n"
+ "tsk->mm->context = 00000014\n"
+ "tsk->mm->pgd = f26b0000\n"
+ " \\|/ ____ \\|/\n"
+ " \"@'/ ,. \\`@\"\n"
+ " /_| \\__/ |_\\\n"
+ " \\__U_/\n"
+ "gawk(22827): Oops\n"
+ "PSR: 044010c1 PC: f001c2cc NPC: f001c2d0 Y: 00000000\n"
+ "g0: 00001000 g1: fffffff7 g2: 04401086 g3: 0001eaa0\n"
+ "g4: 000207dc g5: f0130400 g6: f0d4a018 g7: 00000001\n"
+ "o0: 00000000 o1: f0d4a298 o2: 00000040 o3: f1380718\n"
+ "o4: f1380718 o5: 00000200 sp: f1b13f08 ret_pc: f001c2a0\n"
+ "l0: efffd880 l1: 00000001 l2: f0d4a230 l3: 00000014\n"
+ "l4: 0000ffff l5: f0131550 l6: f012c000 l7: f0130400\n"
+ "i0: f1b13fb0 i1: 00000001 i2: 00000002 i3: 0007c000\n"
+ "i4: f01457c0 i5: 00000004 i6: f1b13f70 i7: f0015360\n"
+ "Instruction DUMP:\n"
+ );
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+/* BSD Panic by greywolf@starwolf.com - modeled after the Linux panic above.
+ By Grey Wolf <greywolf@siteROCK.com>
+ */
+static struct bsod_state *
+bsd (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "bsd", "BSD");
+
+ const char * const panicstr[] = {
+ "panic: ifree: freeing free inode\n",
+ "panic: blkfree: freeing free block\n",
+ "panic: improbability coefficient below zero\n",
+ "panic: cgsixmmap\n",
+ "panic: crazy interrupts\n",
+ "panic: nmi\n",
+ "panic: attempted windows install\n",
+ "panic: don't\n",
+ "panic: free inode isn't\n",
+ "panic: cpu_fork: curproc\n",
+ "panic: malloc: out of space in kmem_map\n",
+ "panic: vogon starship detected\n",
+ "panic: teleport chamber: out of order\n",
+ "panic: Brain fried - core dumped\n"
+ };
+ int i, n, b;
+ char syncing[80], bbuf[5];
+
+ for (i = 0; i < sizeof(syncing); i++)
+ syncing[i] = 0;
+
+ i = (random() % (sizeof(panicstr) / sizeof(*panicstr)));
+ BSOD_TEXT (bst, LEFT, panicstr[i]);
+ BSOD_TEXT (bst, LEFT, "Syncing disks: ");
+
+ b = (random() % 40);
+ for (n = 0; (n < 20) && (b > 0); n++)
+ {
+ if (i)
+ {
+ i = (random() & 0x7);
+ b -= (random() & 0xff) % 20;
+ if (b < 0)
+ b = 0;
+ }
+ sprintf (bbuf, "%d ", b);
+ BSOD_TEXT (bst, LEFT, bbuf);
+ BSOD_PAUSE (bst, 1000000);
+ }
+
+ BSOD_TEXT (bst, LEFT, "\n");
+ BSOD_TEXT (bst, LEFT, (b ? "damn!" : "sunk!"));
+ BSOD_TEXT (bst, LEFT, "\nRebooting\n");
+
+ bst->y = ((bst->xgwa.height - bst->yoff -
+ ((bst->font->ascent + bst->font->descent) * 4)));
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+static struct bsod_state *
+amiga (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "amiga", "Amiga");
+
+ const char *guru1 ="Software failure. Press left mouse button to continue.";
+ const char *guru2 ="Guru Meditation #00000003.00C01570";
+ Pixmap pixmap = 0;
+ Pixmap mask = 0;
+ int pix_w = 0, pix_h = 0;
+ int height;
+ int lw = bst->font->ascent + bst->font->descent;
+ unsigned long fg = bst->fg;
+ unsigned long bg = bst->bg;
+
+ unsigned long bg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "amiga.background2",
+ "Amiga.Background");
+
+ bst->yoff = 0;
+ bst->top_margin = bst->bottom_margin = 0;
+
+ pixmap = image_data_to_pixmap (dpy, window,
+ amiga_png, sizeof(amiga_png),
+ &pix_w, &pix_h, &mask);
+
+ if (pixmap)
+ {
+ int i, n = 0;
+ if (MIN (bst->xgwa.width, bst->xgwa.height) > 600) n++;
+ if (bst->xgwa.width > 2560) n++; /* Retina displays */
+ for (i = 0; i < n; i++)
+ {
+ pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
+ pixmap, pix_w, pix_h);
+ mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
+ pix_w *= 2;
+ pix_h *= 2;
+ }
+ }
+
+ XSetLineAttributes (dpy, bst->gc, lw, LineSolid, CapButt, JoinMiter);
+
+ height = lw * 5;
+
+ bst->char_delay = bst->line_delay = 0;
+
+ BSOD_PAUSE (bst, 2000000);
+ BSOD_COPY (bst, 0, 0, bst->xgwa.width, bst->xgwa.height - height, 0, height);
+
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, height); /* red */
+ BSOD_COLOR (bst, bg, fg);
+ BSOD_RECT (bst, True, lw/2, lw/2, bst->xgwa.width-lw, height-lw); /* black */
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_MOVETO (bst, 0, lw*2);
+ BSOD_TEXT (bst, CENTER, guru1);
+ BSOD_MOVETO (bst, 0, lw*3.5);
+ BSOD_TEXT (bst, CENTER, guru2);
+ BSOD_PAUSE (bst, 1000000);
+
+ BSOD_COLOR (bst, bg, fg);
+ BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, height); /* black */
+ BSOD_COLOR (bst, fg, bg);
+ BSOD_MOVETO (bst, 0, lw*2);
+ BSOD_TEXT (bst, CENTER, guru1);
+ BSOD_MOVETO (bst, 0, lw*3.5);
+ BSOD_TEXT (bst, CENTER, guru2);
+ BSOD_PAUSE (bst, 1000000);
+
+ BSOD_LOOP (bst, -17);
+
+ XSetWindowBackground (dpy, window, bg2);
+ XClearWindow (dpy, window);
+ XSetWindowBackground (dpy, window, bst->bg);
+
+ if (pixmap)
+ {
+ int x = (bst->xgwa.width - pix_w) / 2;
+ int y = ((bst->xgwa.height - pix_h) / 2);
+ XSetClipMask (dpy, bst->gc, mask);
+ XSetClipOrigin (dpy, bst->gc, x, y);
+ XCopyArea (dpy, pixmap, bst->window, bst->gc, 0, 0, pix_w, pix_h, x, y);
+ XSetClipMask (dpy, bst->gc, None);
+ XFreePixmap (dpy, pixmap);
+ XFreePixmap (dpy, mask);
+ }
+
+ bst->y += lw;
+
+ return bst;
+}
+
+
+
+/* Atari ST, by Marcus Herbert <rhoenie@nobiscum.de>
+ Marcus had this to say:
+
+ Though I still have my Atari somewhere, I hardly remember
+ the meaning of the bombs. I think 9 bombs was "bus error" or
+ something like that. And you often had a few bombs displayed
+ quickly and then the next few ones coming up step by step.
+ Perhaps somebody else can tell you more about it.. its just
+ a quick hack :-}
+ */
+static struct bsod_state *
+atari (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "atari", "Atari");
+
+ int pix_w, pix_h;
+ int offset;
+ int i, x, y;
+ Pixmap mask = 0;
+ Pixmap pixmap = image_data_to_pixmap (dpy, window,
+ atari_png, sizeof(atari_png),
+ &pix_w, &pix_h, &mask);
+
+ pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
+ pixmap, pix_w, pix_h);
+ mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
+ pix_w *= 2;
+ pix_h *= 2;
+
+ offset = pix_w;
+ x = 0;
+ y = bst->xgwa.height/2;
+ if (y < 0) y = 0;
+
+ for (i = 1; i< 7; i++)
+ BSOD_COPY (bst, x, y, pix_w, pix_h, (x + (i*offset)), y);
+
+ for (; i< 10; i++)
+ {
+ BSOD_PAUSE (bst, 1000000);
+ BSOD_COPY (bst, x, y, pix_w, pix_h, (x + (i*offset)), y);
+ }
+
+ XClearWindow (dpy, window);
+ XSetClipMask (dpy, bst->gc, mask);
+ XSetClipOrigin (dpy, bst->gc, x, y);
+ XCopyArea (dpy, pixmap, window, bst->gc, 0, 0, pix_w, pix_h, x, y);
+ XSetClipMask (dpy, bst->gc, None);
+ XFreePixmap (dpy, pixmap);
+ XFreePixmap (dpy, mask);
+
+ return bst;
+}
+
+
+static struct bsod_state *
+mac (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "mac", "Mac");
+
+ int pix_w, pix_h;
+ int i;
+
+ const char *string = ("0 0 0 0 0 0 0 F\n"
+ "0 0 0 0 0 0 0 3");
+
+ Pixmap mask = 0;
+ Pixmap pixmap = image_data_to_pixmap (dpy, window,
+ mac_png, sizeof(mac_png),
+ &pix_w, &pix_h, &mask);
+ int offset = pix_h * 4;
+
+ bst->xoff = bst->left_margin = bst->right_margin = 0;
+
+ for (i = 0; i < 2; i++)
+ {
+ pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
+ pixmap, pix_w, pix_h);
+ mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
+ pix_w *= 2; pix_h *= 2;
+ }
+
+ bst->x = (bst->xgwa.width - pix_w) / 2;
+ bst->y = (((bst->xgwa.height + offset) / 2) -
+ pix_h -
+ (bst->font->ascent + bst->font->descent) * 2);
+ if (bst->y < 0) bst->y = 0;
+
+ XClearWindow (dpy, window);
+ XSetClipMask (dpy, bst->gc, mask);
+ XSetClipOrigin (dpy, bst->gc, bst->x, bst->y);
+ XCopyArea (dpy, pixmap, window, bst->gc, 0, 0, pix_w, pix_h, bst->x, bst->y);
+ XSetClipMask (dpy, bst->gc, None);
+ XFreePixmap (dpy, pixmap);
+ XFreePixmap (dpy, mask);
+
+ bst->y += offset + bst->font->ascent + bst->font->descent;
+ BSOD_TEXT (bst, CENTER, string);
+
+ return bst;
+}
+
+
+static struct bsod_state *
+macsbug (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "macsbug", "MacsBug");
+
+ __extension__
+ const char *left = (" SP \n"
+ " 04EB0A58 \n"
+ "58 00010000\n"
+ "5C 00010000\n"
+ " ........\n"
+ "60 00000000\n"
+ "64 000004EB\n"
+ " ........\n"
+ "68 0000027F\n"
+ "6C 2D980035\n"
+ " ....-..5\n"
+ "70 00000054\n"
+ "74 0173003E\n"
+ " ...T.s.>\n"
+ "78 04EBDA76\n"
+ "7C 04EBDA8E\n"
+ " .S.L.a.U\n"
+ "80 00000000\n"
+ "84 000004EB\n"
+ " ........\n"
+ "88 00010000\n"
+ "8C 00010000\n"
+ " ...{3..S\n"
+ "\n"
+ "\n"
+ " CurApName \n"
+ " Finder \n"
+ "\n"
+ " 32-bit VM \n"
+ "SR Smxnzvc0\n"
+ "D0 04EC0062\n"
+ "D1 00000053\n"
+ "D2 FFFF0100\n"
+ "D3 00010000\n"
+ "D4 00010000\n"
+ "D5 04EBDA76\n"
+ "D6 04EBDA8E\n"
+ "D7 00000001\n"
+ "\n"
+ "A0 04EBDA76\n"
+ "A1 04EBDA8E\n"
+ "A2 A0A00060\n"
+ "A3 027F2D98\n"
+ "A4 027F2E58\n"
+ "A5 04EC04F0\n"
+ "A6 04EB0A86\n"
+ "A7 04EB0A58");
+ const char *bottom = (" _A09D\n"
+ " +00884 40843714 #$0700,SR "
+ " ; A973 | A973\n"
+ " +00886 40843765 *+$0400 "
+ " | 4A1F\n"
+ " +00888 40843718 $0004(A7),([0,A7[)"
+ " ; 04E8D0AE | 66B8");
+ __extension__
+ const char * body = ("PowerPC unmapped memory exception at 003AFDAC "
+ "BowelsOfTheMemoryMgr+04F9C\n"
+ " Calling chain using A6/R1 links\n"
+ " Back chain ISA Caller\n"
+ " 00000000 PPC 28C5353C __start+00054\n"
+ " 24DB03C0 PPC 28B9258C main+0039C\n"
+ " 24DB0350 PPC 28B9210C MainEvent+00494\n"
+ " 24DB02B0 PPC 28B91B40 HandleEvent+00278\n"
+ " 24DB0250 PPC 28B83DAC DoAppleEvent+00020\n"
+ " 24DB0210 PPC FFD3E5D0 "
+ "AEProcessAppleEvent+00020\n"
+ " 24DB0132 68K 00589468\n"
+ " 24DAFF8C 68K 00589582\n"
+ " 24DAFF26 68K 00588F70\n"
+ " 24DAFEB3 PPC 00307098 "
+ "EmToNatEndMoveParams+00014\n"
+ " 24DAFE40 PPC 28B9D0B0 DoScript+001C4\n"
+ " 24DAFDD0 PPC 28B9C35C RunScript+00390\n"
+ " 24DAFC60 PPC 28BA36D4 run_perl+000E0\n"
+ " 24DAFC10 PPC 28BC2904 perl_run+002CC\n"
+ " 24DAFA80 PPC 28C18490 Perl_runops+00068\n"
+ " 24DAFA30 PPC 28BE6CC0 Perl_pp_backtick+000FC\n"
+ " 24DAF9D0 PPC 28BA48B8 Perl_my_popen+00158\n"
+ " 24DAF980 PPC 28C5395C sfclose+00378\n"
+ " 24DAF930 PPC 28BA568C free+0000C\n"
+ " 24DAF8F0 PPC 28BA6254 pool_free+001D0\n"
+ " 24DAF8A0 PPC FFD48F14 DisposePtr+00028\n"
+ " 24DAF7C9 PPC 00307098 "
+ "EmToNatEndMoveParams+00014\n"
+ " 24DAF780 PPC 003AA180 __DisposePtr+00010");
+
+ const char *s;
+ int body_lines = 1;
+
+ int char_width, line_height;
+ int col_right, row_top, row_bottom, page_right, page_bottom, body_top;
+ int xoff, yoff;
+
+ unsigned long fg = bst->fg;
+ unsigned long bg = bst->bg;
+ unsigned long bc = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "macsbug.borderColor",
+ "MacsBug.BorderColor");
+
+ bst->xoff = bst->left_margin = bst->right_margin = 0;
+
+ for (s = body; *s; s++) if (*s == '\n') body_lines++;
+
+ char_width = (bst->font->per_char
+ ? bst->font->per_char['n'-bst->font->min_char_or_byte2].width
+ : bst->font->min_bounds.width);
+ line_height = bst->font->ascent + bst->font->descent;
+
+ col_right = char_width * 12; /* number of columns in `left' */
+ page_bottom = line_height * 47; /* number of lines in `left' */
+
+ if (page_bottom > bst->xgwa.height - bst->yoff)
+ page_bottom = bst->xgwa.height - bst->yoff;
+
+ row_bottom = page_bottom - line_height;
+ row_top = row_bottom - (line_height * 4);
+ page_right = col_right + (char_width * 88);
+ body_top = row_top - (line_height * body_lines);
+
+ page_bottom += 2;
+ row_bottom += 2;
+ body_top -= 4;
+
+ if (body_top > 4)
+ body_top = 4;
+
+ xoff = (bst->xgwa.width - page_right) / 2;
+ yoff = (bst->xgwa.height - page_bottom) / 2;
+
+ if (xoff < 0) xoff = 0;
+ if (yoff < 0) yoff = 0;
+
+ BSOD_MARGINS (bst, xoff, yoff);
+
+ BSOD_COLOR (bst, bc, bg);
+ BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
+ BSOD_COLOR (bst, bg, bg);
+ BSOD_RECT (bst, True, xoff-2, yoff, page_right+4, page_bottom);
+ BSOD_COLOR (bst, fg, bg);
+
+ BSOD_MOVETO (bst, xoff, yoff + line_height);
+ BSOD_TEXT (bst, LEFT, left);
+ BSOD_MOVETO (bst, xoff+col_right, yoff + row_top + line_height);
+ BSOD_TEXT (bst, LEFT, bottom);
+
+ BSOD_RECT (bst, True, xoff + col_right, yoff, 2, page_bottom);
+ BSOD_RECT (bst, True, xoff + col_right, yoff + row_top,
+ page_right - col_right, 1);
+ BSOD_RECT (bst, True, xoff + col_right, yoff + row_bottom,
+ page_right - col_right, 1);
+ BSOD_RECT (bst, False, xoff-2, yoff, page_right+4, page_bottom);
+
+ BSOD_LINE_DELAY (bst, 500);
+ BSOD_MOVETO (bst,
+ xoff + col_right + char_width,
+ yoff + body_top + line_height);
+ BSOD_MARGINS (bst, xoff + col_right + char_width, yoff);
+ BSOD_TEXT (bst, LEFT, body);
+
+ BSOD_RECT (bst, False, xoff-2, yoff, page_right+4, page_bottom); /* again */
+
+ BSOD_RECT (bst, False,
+ xoff + col_right + (char_width/2)+2,
+ yoff + row_bottom + 2,
+ 0,
+ page_bottom - row_bottom - 4);
+
+ BSOD_PAUSE (bst, 666666);
+ BSOD_INVERT (bst);
+ BSOD_LOOP (bst, -3);
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+static struct bsod_state *
+mac1 (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "mac1", "Mac1");
+
+ int pix_w, pix_h;
+ int x, y;
+ Pixmap mask = 0;
+ Pixmap pixmap = image_data_to_pixmap (dpy, window,
+ macbomb_png, sizeof(macbomb_png),
+ &pix_w, &pix_h, &mask);
+
+ if (pixmap &&
+ pix_w < bst->xgwa.width / 2 &&
+ pix_h < bst->xgwa.height / 2)
+ {
+ int i, n = 1;
+ if (bst->xgwa.width > 2560) n++; /* Retina displays */
+ for (i = 0; i < n; i++)
+ {
+ pixmap = double_pixmap (dpy, bst->xgwa.visual,
+ bst->xgwa.depth, pixmap, pix_w, pix_h);
+ mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
+ pix_w *= 2;
+ pix_h *= 2;
+ }
+ }
+
+ x = (bst->xgwa.width - pix_w) / 2;
+ y = (bst->xgwa.height - pix_h) / 2;
+ if (y < 0) y = 0;
+
+ XClearWindow (dpy, window);
+ XSetClipMask (dpy, bst->gc, mask);
+ XSetClipOrigin (dpy, bst->gc, x, y);
+ XCopyArea (dpy, pixmap, window, bst->gc, 0, 0, pix_w, pix_h, x, y);
+ XSetClipMask (dpy, bst->gc, None);
+ XFreePixmap (dpy, mask);
+
+ return bst;
+}
+
+
+/* This is what kernel panics looked like on MacOS X 10.0 through 10.1.5.
+ In later releases, it's a graphic of a power button with text in
+ English, French, German, and Japanese overlayed transparently.
+ */
+static struct bsod_state *
+macx_10_0 (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "macx", "MacX");
+
+ XClearWindow (dpy, window);
+ XSetForeground (dpy, bst->gc,
+ get_pixel_resource (dpy, bst->xgwa.colormap,
+ "macx.textForeground",
+ "MacX.TextForeground"));
+ XSetBackground (dpy, bst->gc,
+ get_pixel_resource (dpy, bst->xgwa.colormap,
+ "macx.textBackground",
+ "MacX.TextBackground"));
+
+ {
+ Pixmap pixmap = 0;
+ Pixmap mask = 0;
+ int x, y, pix_w, pix_h;
+ pixmap = image_data_to_pixmap (dpy, window,
+ hmac_png, sizeof(hmac_png),
+ &pix_w, &pix_h, &mask);
+
+# ifdef HAVE_MOBILE
+ if (pixmap)
+ {
+ pixmap = double_pixmap (dpy, bst->xgwa.visual,
+ bst->xgwa.depth, pixmap, pix_w, pix_h);
+ mask = double_pixmap (dpy, bst->xgwa.visual,
+ 1, mask, pix_w, pix_h);
+ pix_w *= 2;
+ pix_h *= 2;
+ }
+# endif
+
+ x = (bst->xgwa.width - pix_w) / 2;
+ y = (bst->xgwa.height - pix_h) / 2;
+ if (y < 0) y = 0;
+ XSetClipMask (dpy, bst->gc, mask);
+ XSetClipOrigin (dpy, bst->gc, x, y);
+ XCopyArea (dpy, pixmap, window, bst->gc, 0, 0, pix_w, pix_h, x, y);
+ XSetClipMask (dpy, bst->gc, None);
+ XFreePixmap (dpy, pixmap);
+ XFreePixmap (dpy, mask);
+ }
+
+ bst->left_margin = 0;
+ bst->right_margin = 0;
+ bst->y = bst->font->ascent;
+ bst->macx_eol_kludge = True;
+ bst->wrap_p = True;
+
+ BSOD_PAUSE (bst, 3000000);
+ BSOD_TEXT (bst, LEFT,
+ "panic(cpu 0): Unable to find driver for this platform: "
+ "\"PowerMac 3,5\".\n"
+ "\n"
+ "backtrace: 0x0008c2f4 0x0002a7a0 0x001f0204 0x001d4e4c 0x001d4c5c "
+ "0x001a56cc 0x01d5dbc 0x001c621c 0x00037430 0x00037364\n"
+ "\n"
+ "\n"
+ "\n"
+ "No debugger configured - dumping debug information\n"
+ "\n"
+ "version string : Darwin Kernel Version 1.3:\n"
+ "Thu Mar 1 06:56:40 PST 2001; root:xnu/xnu-123.5.obj~1/RELEASE_PPC\n"
+ "\n"
+ "\n"
+ "\n"
+ "\n"
+ "DBAT0: 00000000 00000000\n"
+ "DBAT1: 00000000 00000000\n"
+ "DBAT2: 80001FFE 8000003A\n"
+ "DBAT3: 90001FFE 9000003A\n"
+ "MSR=00001030\n"
+ "backtrace: 0x0008c2f4 0x0002a7a0 0x001f0204 0x001d4e4c 0x001d4c5c "
+ "0x001a56cc 0x01d5dbc 0x001c621c 0x00037430 0x00037364\n"
+ "\n"
+ "panic: We are hanging here...\n");
+
+ return bst;
+}
+
+
+static struct bsod_state *
+macx_10_2 (Display *dpy, Window window, Bool v10_3_p)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "macx", "MacX");
+
+ Pixmap mask = 0;
+ Pixmap pixmap = 0;
+ int pix_w = 0, pix_h = 0;
+ int x, y;
+
+ if (v10_3_p)
+ pixmap = image_data_to_pixmap (dpy, window,
+ osx_10_3_png, sizeof(osx_10_3_png),
+ &pix_w, &pix_h, &mask);
+ else
+ pixmap = image_data_to_pixmap (dpy, window,
+ osx_10_2_png, sizeof(osx_10_2_png),
+ &pix_w, &pix_h, &mask);
+ if (! pixmap) abort();
+ if (! mask) abort();
+
+#if 0
+ if (bst->xgwa.height > 600) /* scale up the bitmap */
+ {
+ pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
+ pixmap, pix_w, pix_h);
+ mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
+ if (! pixmap) abort();
+ if (! mask) abort();
+ pix_w *= 2;
+ pix_h *= 2;
+ }
+#endif
+
+ BSOD_IMG (bst);
+ BSOD_PAUSE (bst, 2000000);
+
+ bst->pixmap = pixmap;
+ bst->mask = mask;
+
+ x = (bst->xgwa.width - pix_w) / 2;
+ y = ((bst->xgwa.height - pix_h) / 2);
+ BSOD_PIXMAP (bst, 0, 0, pix_w, pix_h, x, y);
+
+ return bst;
+}
+
+
+/* 2006 Mac Mini with MacOS 10.6 failing with a bad boot drive. By jwz.
+ */
+static struct bsod_state *
+mac_diskfail (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "macdisk", "Mac");
+ int cw = (bst->font->per_char
+ ? bst->font->per_char['n'-bst->font->min_char_or_byte2].width
+ : bst->font->min_bounds.width);
+ int h = bst->font->ascent + bst->font->descent;
+ int L = (bst->xgwa.width - (cw * 80)) / 2;
+ int T = (bst->xgwa.height - (h * 10)) / 2;
+
+ unsigned long fg = bst->fg;
+ unsigned long bg = bst->bg;
+ unsigned long bg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "macx.background",
+ "Mac.Background");
+ if (L < 0) L = 0;
+ if (T < 0) T = 0;
+
+ bst->wrap_p = True;
+ bst->scroll_p = True;
+
+ BSOD_COLOR(bst, bg2, bg);
+ BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
+ BSOD_PAUSE (bst, 3000000);
+
+ BSOD_COLOR(bst, bg, fg);
+ BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
+ BSOD_COLOR(bst, fg, bg);
+
+ BSOD_MARGINS (bst, L, L);
+ BSOD_MOVETO (bst, L, T);
+
+ BSOD_TEXT (bst, LEFT,
+ "efiboot loaded from device: Acpi(PNP0A03,0)/Pci*1F|2)/Ata"
+ "(Primary,Slave)/HD(Part\n"
+ "2,Sig8997E427-064E-4FE7-8CB9-F27A784B232C)\n"
+ "boot file path: \\System\\Library\\CoreServices\\boot.efi\n"
+ ".Loading kernel cache file 'System\\Library\\Caches\\"
+ "com.apple.kext.caches\\Startup\\\n"
+ "kernelcache_i386.2A14EC2C'\n"
+ "Loading 'mach_kernel'...\n"
+ );
+ BSOD_CHAR_DELAY (bst, 7000);
+ BSOD_TEXT (bst, LEFT,
+ ".....................\n"
+ );
+ BSOD_CHAR_DELAY (bst, 0);
+ BSOD_TEXT (bst, LEFT,
+ "root device uuid is 'B62181B4-6755-3C27-BFA1-49A0E053DBD6\n"
+ "Loading drivers...\n"
+ "Loading System\\Library\\Caches\\com.apple.kext.caches\\"
+ "Startup\\Extensions.mkext....\n"
+ );
+ BSOD_CHAR_DELAY (bst, 7000);
+ BSOD_TEXT (bst, LEFT,
+ "..............................................................."
+ ".................\n"
+ "..............................................................."
+ ".................\n"
+ "..............\n"
+ );
+ BSOD_INVERT (bst);
+ BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
+ BSOD_INVERT (bst);
+
+ BSOD_MARGINS (bst, 0, 0);
+ BSOD_MOVETO (bst, 0, h);
+
+ BSOD_CHAR_DELAY (bst, 0);
+ BSOD_LINE_DELAY (bst, 5000);
+ BSOD_TEXT (bst, LEFT,
+ "npvhash=4095\n"
+ "PRE enabled\n"
+ "Darwin Kernel Version 10.8.9: Tue Jun 7 16:33:36 PDT 2011;"
+ " root:xnu-1504.15.3~1/RELEASE_I386\n"
+ "vm_page_bootstrap: 508036 free pages and 16252 wired pages\n"
+ "standard timeslicing quantum is 10000 us\n"
+ "mig_table_max_displ = 73\n"
+ "AppleACPICPU: ProcessorId=0 LocalApicId=0 Enabled\n"
+ "AppleACPICPU: ProcessorId=1 LocalApicId=1 Enabled\n"
+ "calling npo_policy_init for Quarantine\n"
+ "Security policy loaded: Quaantine policy (Quarantine)\n"
+ "calling npo_policy_init for Sandbox\n"
+ "Security policy loaded: Seatbelt sandbox policy (Sandbox)\n"
+ "calling npo_policy_init for TMSafetyNet\n"
+ "Security policy loaded: Safety net for Time Machine "
+ "(TMSafetyNet)\n"
+ "Copyright (c) 1982, 1986, 1989, 1991, 1993\n"
+ "The Regents of the University of California. All rights "
+ "reserved.\n"
+ "\n"
+ "MAC Framework successfully initialized\n"
+ "using 10485 buffer headers and 4096 cluster IO buffer headers\n"
+ "IOAPIC: Version 0x20 Vectors 64:87\n"
+ "ACPI: System State [S0 S3 S4 S5] (S3)\n"
+ "PFM64 0x10000000, 0xf0000000\n"
+ "[ PCI configuration begin ]\n"
+ "PCI configuration changed (bridge=1 device=1 cardbus=0)\n"
+ "[ PCI configuration end, bridges 4 devices 17 ]\n"
+ "nbinit: done (64 MB memory set for nbuf pool)\n"
+ "rooting via boot-uuid from /chosen: "
+ "B62181B4-6755-3C27-BFA1-49A0E053DBD6\n"
+ "Waiting on <dict ID=\"0\"><key>IOProviderClass</key>"
+ "<string ID=\"1\">IOResources</string><key>IOResourceMatch</key>"
+ "<string ID=\"2\">boot-uuid-nedia</string></dict>\n"
+ "com.apple.AppleFSCCompressionTypeZlib kmod start\n"
+ "com.apple.AppleFSCCompressionTypeZlib kmod succeeded\n"
+ "AppleIntelCPUPowerManagementClient: ready\n"
+ "FireWire (OHCI) Lucent ID 5811 built-in now active, GUID "
+ "0019e3fffe97f8b4; max speed s400.\n"
+ "Got boot device = IOService:/AppleACPIPlatformExpert/PCI000/"
+ "AppleACPIPCI/SATA@1F,2/AppleAHCI/PRI202/IOAHCIDevice@0/"
+ "AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/"
+ "IOBlockStorageDriver/ST96812AS Media/IOGUIDPartitionScheme/"
+ "Customer02\n"
+ );
+ BSOD_PAUSE (bst, 1000000);
+ BSOD_TEXT (bst, LEFT,
+ "BSD root: Disk0s, major 14, minor 2\n"
+ "[Bluetooth::CSRHIDTransition] switchtoHCIMode (legacy)\n"
+ "[Bluetooth::CSRHIDTransition] transition complete.\n"
+ "CSRUSBBluetoothHCIController::setupHardware super returned 0\n"
+ );
+ BSOD_PAUSE (bst, 3000000);
+ BSOD_TEXT (bst, LEFT,
+ "disk0s2: I/O error.\n"
+ "0 [Level 3] [ReadUID 0] [Facility com.apple.system.fs] "
+ "[ErrType IO] [ErrNo 5] [IOType Read] [PBlkNum 48424] "
+ "[LBlkNum 1362] [FSLogMsgID 2009724291] [FSLogMsgOrder First]\n"
+ "0 [Level 3] [ReadUID 0] [Facility com.apple.system.fs] "
+ "[DevNode root_device] [MountPt /] [FSLogMsgID 2009724291] "
+ "[FSLogMsgOrder Last]\n"
+ "panic(cpu 0 caller 0x47f5ad): \"Process 1 exec of /sbin/launchd"
+ " failed, errno 5\\n\"0/SourceCache/xnu/xnu-1504.15.3/bsd/kern/"
+ "kern_exec.c:3145\n"
+ "Debugger called: <panic>\n"
+ "Backtrace (CPU 0), Frame : Return Address (4 potential args "
+ "on stack)\n"
+ "0x34bf3e48 : 0x21b837 (0x5dd7fc 0x34bf3e7c 0x223ce1 0x0)\n"
+ "0x34bf3e98 : 0x47f5ad (0x5cf950 0x831c08 0x5 0x0)\n"
+ "0x34bf3ef8 : 0x4696d2 (0x4800d20 0x1fe 0x45a69a0 0x80000001)\n"
+ "0x34bf3f38 : 0x48fee5 (0x46077a8 0x84baa0 0x34bf3f88 "
+ "0x34bf3f94)\n"
+ "0x34bf3f68 : 0x219432 (0x46077a8 0xffffff7f 0x0 0x227c4b)\n"
+ "0x34bf3fa8 : 0x2aacb4 (0xffffffff 0x1 0x22f8f5 0x227c4b)\n"
+ "0x34bf3fc8 : 0x2a1976 (0x0 0x0 0x2a17ab 0x4023ef0)\n"
+ "\n"
+ "BSD process name corresponding to current thread: init\n"
+ "\n"
+ "Mac OS version:\n"
+ "Not yet set\n"
+ "\n"
+ "Kernel version:\n"
+ "Darwin Kernel version 10.8.0: Tue Jun 7 16:33:36 PDT 2011; "
+ "root:xnu-1504.15-3~1/RELEASE_I386\n"
+ "System model name: Macmini1,1 (Mac-F4208EC0)\n"
+ "\n"
+ "System uptime in nanoseconds: 13239332027\n"
+ );
+ BSOD_CURSOR (bst, CURSOR_BLOCK, 500000, 999999);
+
+ XClearWindow (dpy, window);
+
+ return bst;
+}
+
+
+/* 2017 MacOS 10.12 interminable software update, by jwz.
+ */
+static struct bsod_state *
+macx_install (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "macinstall", "MacX");
+
+ int pix_w, pix_h;
+ int x, y;
+ int bw1, bh1;
+ int bw2, bh2;
+
+ unsigned long fg = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "macinstall.foreground",
+ "Mac.Foreground");
+ unsigned long bg = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "macinstall.background",
+ "Mac.Background");
+ unsigned long fg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "macinstall.barForeground",
+ "Mac.Foreground");
+ unsigned long bg2 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "macinstall.barBackground",
+ "Mac.Background");
+ char buf[1024];
+ int lh = bst->font->ascent + bst->font->descent;
+ int i, min;
+ double pct;
+
+ Pixmap mask = 0;
+ Pixmap pixmap = image_data_to_pixmap (dpy, window,
+ apple_png, sizeof(apple_png),
+ &pix_w, &pix_h, &mask);
+
+ bst->xoff = bst->left_margin = bst->right_margin = 0;
+
+ if (pixmap)
+ {
+ int i, n = 0;
+ if (bst->xgwa.width > 2560) n++; /* Retina displays */
+ for (i = 0; i < n; i++)
+ {
+ pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
+ pixmap, pix_w, pix_h);
+ mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
+ pix_w *= 2;
+ pix_h *= 2;
+ }
+ }
+
+ bst->pixmap = pixmap;
+ bst->mask = mask;
+
+ x = (bst->xgwa.width - pix_w) / 2;
+ y = (bst->xgwa.height) / 2 - pix_h;
+ if (y < 0) y = 0;
+
+ XSetLineAttributes (dpy, bst->gc, 1, LineSolid, CapRound, JoinMiter);
+
+ BSOD_COLOR(bst, bg, bg);
+ BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
+ BSOD_COLOR(bst, fg, bg);
+ BSOD_PIXMAP (bst, 0, 0, pix_w, pix_h, x, y);
+ y += pix_h * 2 - lh;
+
+ /* progress bar */
+ bw1 = pix_w * 2.5;
+ bh1 = lh * 0.66;
+ if (bh1 < 8) bh1 = 8;
+
+ x = (bst->xgwa.width - bw1) / 2;
+ BSOD_COLOR(bst, fg2, bg);
+ BSOD_LINE (bst, x, y, x + bw1, y, bh1);
+
+ bw2 = bw1 - 1;
+ bh2 = bh1 - 4;
+ BSOD_COLOR(bst, bg2, bg);
+ BSOD_LINE (bst, x+1, y, x + bw2, y, bh2);
+
+ BSOD_COLOR(bst, fg, bg);
+ BSOD_LINE (bst, x, y, x + 1, y, bh1);
+
+ pct = 5 + (random() % 40);
+ min = 5 + (random() % 40);
+
+ for (i = 0; i < 100; i++) {
+ pct += frand(0.3);
+ min += (random() % 3) - 1; /* sometimes down, mostly up */
+
+ if (pct > 90) pct = 90;
+ BSOD_RECT (bst, True, x, y - bh1/2, bw1 * pct / 100, bh1);
+
+ sprintf (buf, " Installing Software Update: about %d minutes. ", min);
+ bst->y = y + lh * 3;
+ BSOD_TEXT (bst, CENTER, buf);
+ BSOD_PAUSE (bst, 1000000);
+ }
+
+ return bst;
+}
+
+
+static struct bsod_state *
+macx (Display *dpy, Window window)
+{
+ switch (1?4:random() % 5) {
+ case 0: return macx_10_0 (dpy, window); break;
+ case 1: return macx_10_2 (dpy, window, False); break;
+ case 2: return macx_10_2 (dpy, window, True); break;
+ case 3: return mac_diskfail (dpy, window); break;
+ case 4: return macx_install (dpy, window); break;
+ default: abort();
+ }
+}
+
+
+#ifndef HAVE_JWXYZ /* #### I have no idea how to implement this without
+ real plane-masks. I don't think it would look
+ right if done with alpha-transparency... */
+/* blit damage
+ *
+ * by Martin Pool <mbp@samba.org>, Feb 2000.
+ *
+ * This is meant to look like the preferred failure mode of NCD
+ * Xterms. The parameters for choosing what to copy where might not
+ * be quite right, but it looks about ugly enough.
+ */
+static struct bsod_state *
+blitdamage (Display *dpy, Window window)
+{
+ struct bsod_state *bst =
+ make_bsod_state (dpy, window, "blitdamage", "BlitDamage");
+
+ int i;
+ int delta_x = 0, delta_y = 0;
+ int w, h;
+ int chunk_h, chunk_w;
+ int steps;
+ int src_x, src_y;
+ int x, y;
+
+ w = bst->xgwa.width;
+ h = bst->xgwa.height;
+
+ XSetPlaneMask (dpy, bst->gc, random());
+
+ steps = 50;
+ chunk_w = w / (random() % 1 + 1);
+ chunk_h = h / (random() % 1 + 1);
+ if (random() & 0x1000)
+ delta_y = random() % 600;
+ if (!delta_y || (random() & 0x2000))
+ delta_x = random() % 600;
+ src_x = 0;
+ src_y = 0;
+ x = 0;
+ y = 0;
+
+ BSOD_IMG (bst);
+ for (i = 0; i < steps; i++) {
+ if (x + chunk_w > w)
+ x -= w;
+ else
+ x += delta_x;
+
+ if (y + chunk_h > h)
+ y -= h;
+ else
+ y += delta_y;
+
+ BSOD_COPY (bst, src_x, src_y, chunk_w, chunk_h, x, y);
+ BSOD_PAUSE (bst, 1000);
+ }
+
+ return bst;
+}
+#endif /* !HAVE_JWXYZ */
+
+
+/*
+ * OS/2 panics, by Knut St. Osmundsen <bird-xscreensaver@anduin.net>
+ *
+ * All but one messages are real ones, some are from my test machines
+ * and system dumps, others are reconstructed from google results.
+ * Please, don't be to hard if the formatting of the earlier systems
+ * aren't 100% correct.
+ */
+static struct bsod_state *
+os2 (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "os2", "OS2");
+
+ __extension__
+ static const char * const os2_panics[] =
+ { /* OS/2 2.0 trap - details are bogus (CR0++). */
+ "TRAP 0002 ERRCD=0000 ERACC=**** ERLIM=********\n"
+ "EAX=7d240a58 EBX=ff202fdc ECX=00064423 EDX=00003624\n"
+ "ESI=fff3272c EDI=7d240004 EBP=00004a44 FLG=00003202\n"
+ "CS:EIP=0160:fff702a6 CSACC=c09d CSLIM=ffffffff\n"
+ "SS:ESP=0030:00004a38 SSACC=1097 SSLIM=00003fff\n"
+ "DS=0158 DSACC=c0f3 DSLIM=ffffffff CR0=fffffffb\n"
+ "ES=0158 ESACC=c0f3 ESLIM=ffffffff CR2=1a060014\n"
+ "FS=0000 FSACC=**** FSLIM=********\n"
+ "GS=0000 GSACC=**** GSLIM=********\n"
+ "\n"
+ "The system detected an internal processing error\n"
+ "at location ##0160:fff6453f - 000d:a53f\n"
+ "60000, 9084\n"
+ "\n"
+ "038600d1\n"
+ "Internal revision 6.307, 92/03/01\n"
+ "\n",
+
+ /* warp 3 (early) */
+ "TRAP 000e ERRCD=0000 ERACC=**** ERLIM=********\n"
+ "EAX=ff050c20 EBX=000000bb ECX=ffff00c1 EDx=fff379b8\n"
+ "ESI=ffe55a3c EDI=00000000 EBP=00004eb8 FLG=00013282\n"
+ "CS:EIP=0160:fff8dbb8 CSACC=c09b CSLIM=ffffffff\n"
+ "SS:EIP=0030:00004eb4 SSACC=1097 SSLIM=00003fff\n"
+ "DS=0158 DSACC=c0f3 DSLIM=ffffffff CR0=8001001b\n"
+ "ES=0158 DSACC=c0f3 DSLIM=ffffffff CR2=000000c7\n"
+ "FS=0000 FSACC=**** FSLIM=********\n"
+ "GS=0000 GSACC=**** GSLIM=********\n"
+ "\n"
+ "The system detected an internal processing error\n"
+ "at location ##0160:fff66bf0 - 000d:9bf0.\n"
+ "60000, 9084\n"
+ "\n"
+ "048600b4\n"
+ "Internal revision 8.125, 94/02/16\n"
+ "\n"
+ "The system is stopped. Record the location number of the error\n"
+ "and contact your service representative.\n",
+
+ /* warp 3 */
+ "TRAP 000e ERRCD=0002 ERACC=**** ERLIM=********\n"
+ "EAX=00000000 EBX=fdef1e0c ECX=00003824 EDX=0000edf9\n"
+ "ESI=fdf30e80 EDI=fc8b0000 EBP=00005658 FLG=00012246\n"
+ "CS:EIP=0160:fff8ada3 CSACC=c09b CSLIM=ffffffff\n"
+ "SS:ESP=0030:000055d4 SSACC=1097 SSLIM=0000480f\n"
+ "DS=0158 DSACC=c093 DSLIM=ffffffff CR0=8001001b\n"
+ "ES=0158 ESACC=c093 ESLIM=ffffffff CR2=fc8b0000\n"
+ "FS=03b8 FSACC=0093 FSLIM=00000023\n"
+ "GS=0000 GSACC=**** GSLIM=********\n"
+ "\n"
+ "The system detected an internal processing error\n"
+ "at location ##0160:fff5c364 - 000d:a364.\n"
+ "60000, 9084\n"
+ "\n"
+ "05860526\n"
+ "Internal revision 8200,94/11/07\n"
+ "\n"
+ "The system is stopped. Record all of the above information and\n"
+ "contact your service representative.\n",
+
+ /* warp 3 (late) */
+ "TRAP 000d ERRCD=2200 ERACC=1092 ERLIM=00010fff\n"
+ "EAX=0000802e EBX=fff001c8 ECX=9bd80000 EDX=00000000\n"
+ "ESI=fff09bd8 EDI=fdeb001b EBP=00000000 FLG=00012012\n"
+ "CS:EIP=0168:fff480a2 CSACC=c09b CSLIM=ffffffff\n"
+ "SS:ESP=00e8:00001f32 SSACC=0093 SSLIM=00001fff\n"
+ "DS=0940 DSACC=0093 DSLIM=00000397 CR0=8001001b\n"
+ "ES=00e8 ESACC=0093 ESLIM=00001fff CR2=15760008\n"
+ "FS=0000 FSACC=**** FSLIM=****\n"
+ "GS=0000 GSACC=**** GSLIM=****\n"
+ "\n"
+ "The system detected an internal processing error\n"
+ "at location ##0168:fff4b06e - 000e:c06e\n"
+ "60000, 9084\n"
+ "\n"
+ "06860652\n"
+ "Internal revision 8.259_uni,98/01/07\n"
+ "\n"
+ "The system is stopped. Record all of the above information and\n"
+ "contact your service representative.\n",
+
+ /* Warp 4.52+ - the official r0trap.exe from the debugging classes */
+ "Exception in module: OS2KRNL\n"
+ "TRAP 000e ERRCD=0002 ERACC=**** ERLIM=********\n"
+ "EAX=00000001 EBX=80010002 ECX=ffed4638 EDX=0003f17b\n"
+ "ESI=00000001 EDI=00000002 EBP=00005408 FLG=00012202\n"
+ "CS:EIP=0168:fff3cd2e CSACC=c09b CSLIM=ffffffff\n"
+ "SS:ESP=0030:000053ec SSACC=1097 SSLIM=000044ff\n"
+ "DS=0160 DSACC=c093 DSLIM=ffffffff CR0=8001001b\n"
+ "ES=0160 ESACC=c093 ESLIM=ffffffff CR2=00000001\n"
+ "FS=0000 FSACC=**** FSLIM=********\n"
+ "GS=0000 GSACC=**** GSLIM=********\n"
+ "\n"
+ "The system detected an internal processing error at\n"
+ "location ##0168:fff1e3f3 - 000e:c3f3.\n"
+ "60000, 9084\n"
+ "\n"
+ "068606a0\n"
+ "Internal revision 14.097_UNI\n"
+ "\n"
+ "The system is stopped. Record all of the above information and\n"
+ "contact your service representative.\n",
+
+ /* Warp 4.52+, typical JFS problem. */
+ "Exeption in module: JFS\n"
+ "TRAP 0003 ERRCD=0000 ERACC=**** ERLIM=********\n"
+ "EAX=00000000 EBX=ffffff05 ECX=00000001 EDX=f5cd8010\n"
+ "ESI=000000e6 EDI=000000e7 EBP=f9c7378e FLG=00002296\n"
+ "CS:EIP=0168:f8df3250 CSACC=c09b CSLIM=ffffffff\n"
+ "SS:ESP=1550:fdc73778 SSACC=c093 SSLIM=ffffffff\n"
+ "DS=0160 DSACC=c093 DSLIM=ffffffff CR0=80010016\n"
+ "ES=0160 ESACC=c093 DSLIM=ffffffff CR2=05318000\n"
+ "FS=03c0 FSACC=0093 DSLIM=00000023\n"
+ "GS=0160 GSACC=c093 DSLIM=ffffffff\n"
+ "\n"
+ "The system detected an internal processing error\n"
+ "at location ##0168:fff1e2ab - 000e:c2ab.\n"
+ "60000, 9084\n"
+ "\n"
+ "07860695\n"
+ "\n"
+ "Internal revision 14.100c_UNI\n"
+ "\n"
+ "The system is stopped. Record all of the above information and\n"
+ "contact your service representative.\n"
+ };
+
+ BSOD_TEXT (bst, LEFT, os2_panics[random() % countof(os2_panics)]);
+ BSOD_CURSOR (bst, CURSOR_LINE, 240000, 999999);
+
+ XClearWindow (dpy, window);
+ return bst;
+}
+
+
+/* SPARC Solaris panic. Should look pretty authentic on Solaris boxes.
+ * Anton Solovyev <solovam@earthlink.net>
+ */
+static struct bsod_state *
+sparc_solaris (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "solaris", "Solaris");
+ int i;
+
+ bst->scroll_p = True;
+ bst->wrap_p = True;
+ bst->left_margin = bst->right_margin = bst->xgwa.width * 0.07;
+ bst->top_margin = bst->bottom_margin = bst->xgwa.height * 0.07;
+ bst->y = bst->top_margin + bst->yoff + bst->font->ascent;
+
+ BSOD_IMG (bst);
+ BSOD_PAUSE (bst, 3000000);
+
+ BSOD_INVERT(bst);
+ BSOD_RECT (bst, True,
+ bst->left_margin, bst->top_margin,
+ bst->xgwa.width - bst->left_margin - bst->right_margin,
+ bst->xgwa.height - bst->top_margin - bst->bottom_margin);
+ BSOD_INVERT(bst);
+
+ BSOD_TEXT (bst, LEFT,
+ "BAD TRAP: cpu=0 type=0x31 rp=0x2a10043b5e0 addr=0xf3880 mmu_fsr=0x0\n"
+ "BAD TRAP occurred in module \"unix\" due to an illegal access to a"
+ " user address.\n"
+ "adb: trap type = 0x31\n"
+ "addr=0xf3880\n"
+ "pid=307, pc=0x100306e4, sp=0x2a10043ae81, tstate=0x4480001602,"
+ " context=0x87f\n"
+ "g1-g7: 1045b000, 32f, 10079440, 180, 300000ebde8, 0, 30000953a20\n"
+ "Begin traceback... sp = 2a10043ae81\n"
+ "Called from 100bd060, fp=2a10043af31, args=f3700 300008cc988 f3880 0"
+ " 1 300000ebde0.\n"
+ "Called from 101fe1bc, fp=2a10043b011, args=3000045a240 104465a0"
+ " 300008e47d0 300008e48fa 300008ae350 300008ae410\n"
+ "Called from 1007c520, fp=2a10043b0c1, args=300008e4878 300003596e8 0"
+ " 3000045a320 0 3000045a220\n"
+ "Called from 1007c498, fp=2a10043b171, args=1045a000 300007847f0 20"
+ " 3000045a240 1 0\n"
+ "Called from 1007972c, fp=2a10043b221, args=1 300009517c0 30000951e58 1"
+ " 300007847f0 0\n"
+ "Called from 10031e10, fp=2a10043b2d1, args=3000095b0c8 0 300009396a8"
+ " 30000953a20 0 1\n"
+ "Called from 10000bdd8, fp=ffffffff7ffff1c1, args=0 57 100131480"
+ " 100131480 10012a6e0 0\n"
+ "End traceback...\n"
+ "panic[cpu0]/thread=30000953a20: trap\n"
+ "syncing file systems...");
+
+ BSOD_PAUSE (bst, 3000000);
+
+ BSOD_TEXT (bst, LEFT, " 1 done\n");
+ BSOD_TEXT (bst, LEFT, "dumping to /dev/dsk/c0t0d0s3, offset 26935296\n");
+ BSOD_PAUSE (bst, 2000000);
+
+
+ for (i = 1; i <= 100; ++i)
+ {
+ char buf[100];
+ sprintf (buf, "\b\b\b\b\b\b\b\b\b\b\b%3d%% done", i);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 100000);
+ }
+
+ BSOD_TEXT (bst, LEFT,
+ ": 2803 pages dumped, compression ratio 2.88, dump succeeded\n");
+ BSOD_PAUSE (bst, 2000000);
+
+ BSOD_TEXT (bst, LEFT,
+ "rebooting...\n"
+ "Resetting ...");
+
+ return bst;
+}
+
+
+/* Linux panic and fsck, by jwz
+ */
+static struct bsod_state *
+linux_fsck (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "linux", "Linux");
+
+ int i;
+ const char *sysname;
+ char buf[1024];
+# ifdef HAVE_UNAME
+ struct utsname uts;
+#endif /* UNAME */
+
+ const char *linux_panic[] = {
+ " kernel: Unable to handle kernel paging request at virtual "
+ "address 0000f0ad\n",
+ " kernel: printing eip:\n",
+ " kernel: c01becd7\n",
+ " kernel: *pde = 00000000\n",
+ " kernel: Oops: 0000\n",
+ " kernel: CPU: 0\n",
+ " kernel: EIP: 0010:[<c01becd7>] Tainted: P \n",
+ " kernel: EFLAGS: 00010286\n",
+ " kernel: eax: 0000ff00 ebx: ca6b7e00 ecx: ce1d7a60 edx: ce1d7a60\n",
+ " kernel: esi: ca6b7ebc edi: 00030000 ebp: d3655ca0 esp: ca6b7e5c\n",
+ " kernel: ds: 0018 es: 0018 ss: 0018\n",
+ " kernel: Process crond (pid: 1189, stackpage=ca6b7000)\n",
+ " kernel: Stack: d3655ca0 ca6b7ebc 00030054 ca6b7e7c c01c1e5b "
+ "00000287 00000020 c01c1fbf \n",
+ "",
+ " kernel: 00005a36 000000dc 000001f4 00000000 00000000 "
+ "ce046d40 00000001 00000000 \n",
+ "", "", "",
+ " kernel: ffffffff d3655ca0 d3655b80 00030054 c01bef93 "
+ "d3655ca0 ca6b7ebc 00030054 \n",
+ "", "", "",
+ " kernel: Call Trace: [<c01c1e5b>] [<c01c1fbf>] [<c01bef93>] "
+ "[<c01bf02b>] [<c0134c4f>]\n",
+ "", "", "",
+ " kernel: [<c0142562>] [<c0114f8c>] [<c0134de3>] [<c010891b>]\n",
+ " kernel: \n",
+ " kernel: Code: 2a 00 75 08 8b 44 24 2c 85 c0 74 0c 8b 44 24 58 83 48 18 "
+ "08 \n",
+ 0
+ };
+
+ bst->scroll_p = True;
+ bst->wrap_p = True;
+ bst->left_margin = bst->right_margin = 10;
+ bst->top_margin = bst->bottom_margin = 10;
+
+ sysname = "linux";
+# ifdef HAVE_UNAME
+ {
+ char *s;
+ if (uname (&uts) >= 0)
+ sysname = uts.nodename;
+ s = strchr (sysname, '.');
+ if (s) *s = 0;
+ }
+# endif /* !HAVE_UNAME */
+
+
+ BSOD_TEXT (bst, LEFT, "waiting for X server to shut down ");
+ BSOD_PAUSE (bst, 100000);
+ BSOD_TEXT (bst, LEFT,
+ "XIO: fatal IO error 2 (broken pipe) on X server \":0.0\"\n"
+ " after 339471 requests (339471 known processed) "
+ "with 0 events remaining\n");
+ BSOD_CHAR_DELAY (bst, 300000);
+ BSOD_TEXT (bst, LEFT, ".........\n");
+ BSOD_CHAR_DELAY (bst, 0);
+ BSOD_TEXT (bst, LEFT,
+ "xinit: X server slow to shut down, sending KILL signal.\n"
+ "waiting for server to die ");
+ BSOD_CHAR_DELAY (bst, 300000);
+ BSOD_TEXT (bst, LEFT, "...\n");
+ BSOD_CHAR_DELAY (bst, 0);
+ BSOD_TEXT (bst, LEFT, "xinit: Can't kill server\n");
+ BSOD_PAUSE (bst, 2000000);
+
+ sprintf (buf, "\n%s Login: ", sysname);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 1000000);
+ BSOD_TEXT (bst, LEFT,
+ "\n\n"
+ "Parallelizing fsck version 1.22 (22-Jun-2001)\n"
+ "e2fsck 1.22, 22-Jun-2001 for EXT2 FS 0.5b, 95/08/09\n"
+ "Warning! /dev/hda1 is mounted.\n"
+ "/dev/hda1 contains a file system with errors, check forced.\n");
+ BSOD_PAUSE (bst, 1000000);
+
+ if (0 == random() % 2)
+ BSOD_TEXT (bst, LEFT,
+ "Couldn't find ext2 superblock, trying backup blocks...\n"
+ "The filesystem size (according to the superblock) is 3644739 blocks\n"
+ "The physical size of the device is 3636706 blocks\n"
+ "Either the superblock or the partition table is likely to be corrupt!\n"
+ "Abort<y>? no\n");
+ BSOD_PAUSE (bst, 1000000);
+
+ AGAIN:
+
+ BSOD_TEXT (bst, LEFT, "Pass 1: Checking inodes, blocks, and sizes\n");
+ BSOD_PAUSE (bst, 2000000);
+
+ i = (random() % 60) - 20;
+ while (--i > 0)
+ {
+ int b = random() % 0xFFFF;
+ sprintf (buf, "Deleted inode %d has zero dtime. Fix<y>? yes\n\n", b);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 1000);
+ }
+
+ i = (random() % 40) - 10;
+ if (i > 0)
+ {
+ int g = random() % 0xFFFF;
+ int b = random() % 0xFFFFFFF;
+
+ BSOD_PAUSE (bst, 1000000);
+
+ sprintf (buf, "Warning: Group %d's copy of the group descriptors "
+ "has a bad block (%d).\n", g, b);
+ BSOD_TEXT (bst, LEFT, buf);
+
+ b = random() % 0x3FFFFF;
+ while (--i > 0)
+ {
+ b += random() % 0xFFFF;
+ sprintf (buf,
+ "Error reading block %d (Attempt to read block "
+ "from filesystem resulted in short read) while doing "
+ "inode scan. Ignore error<y>?",
+ b);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 10000);
+ BSOD_TEXT (bst, LEFT, " yes\n\n");
+ }
+ }
+
+ if (0 == (random() % 10))
+ {
+ BSOD_PAUSE (bst, 1000000);
+
+ i = 3 + (random() % 10);
+ while (--i > 0)
+ {
+ BSOD_TEXT (bst, LEFT,
+ "Could not allocate 256 block(s) for inode table: "
+ "No space left on device\n");
+ BSOD_PAUSE (bst, 1000);
+ }
+ BSOD_TEXT (bst, LEFT, "Restarting e2fsck from the beginning...\n");
+ BSOD_PAUSE (bst, 2000000);
+
+ goto AGAIN;
+ }
+
+ i = (random() % 20) - 5;
+
+ if (i > 0)
+ BSOD_PAUSE (bst, 1000000);
+
+ while (--i > 0)
+ {
+ int j = 5 + (random() % 10);
+ int w = random() % 4;
+
+ while (--j > 0)
+ {
+ int b = random() % 0xFFFFF;
+ int g = random() % 0xFFF;
+
+ if (0 == (random() % 10))
+ b = 0;
+ else if (0 == (random() % 10))
+ b = -1;
+
+ if (w == 0)
+ sprintf (buf,
+ "Inode table for group %d not in group. (block %d)\n"
+ "WARNING: SEVERE DATA LOSS POSSIBLE.\n"
+ "Relocate<y>?",
+ g, b);
+ else if (w == 1)
+ sprintf (buf,
+ "Block bitmap for group %d not in group. (block %d)\n"
+ "Relocate<y>?",
+ g, b);
+ else if (w == 2)
+ sprintf (buf,
+ "Inode bitmap %d for group %d not in group.\n"
+ "Continue<y>?",
+ b, g);
+ else /* if (w == 3) */
+ sprintf (buf,
+ "Bad block %d in group %d's inode table.\n"
+ "WARNING: SEVERE DATA LOSS POSSIBLE.\n"
+ "Relocate<y>?",
+ b, g);
+
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_TEXT (bst, LEFT, " yes\n\n");
+ BSOD_PAUSE (bst, 1000);
+ }
+ }
+
+
+ if (0 == random() % 10) goto PANIC;
+ BSOD_TEXT (bst, LEFT, "Pass 2: Checking directory structure\n");
+ BSOD_PAUSE (bst, 2000000);
+
+ i = (random() % 20) - 5;
+ while (--i > 0)
+ {
+ int n = random() % 0xFFFFF;
+ int o = random() % 0xFFF;
+ sprintf (buf, "Directory inode %d, block 0, offset %d: "
+ "directory corrupted\n"
+ "Salvage<y>? ",
+ n, o);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 1000);
+ BSOD_TEXT (bst, LEFT, " yes\n\n");
+
+ if (0 == (random() % 100))
+ {
+ sprintf (buf, "Missing '.' in directory inode %d.\nFix<y>?", n);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 1000);
+ BSOD_TEXT (bst, LEFT, " yes\n\n");
+ }
+ }
+
+ if (0 == random() % 10)
+ goto PANIC;
+
+ BSOD_TEXT (bst, LEFT,
+ "Pass 3: Checking directory connectivity\n"
+ "/lost+found not found. Create? yes\n");
+ BSOD_PAUSE (bst, 2000000);
+
+ /* Unconnected directory inode 4949 (/var/spool/squid/06/???)
+ Connect to /lost+found<y>? yes
+
+ '..' in /var/spool/squid/06/08 (20351) is <The NULL inode> (0), should be
+ /var/spool/squid/06 (20350).
+ Fix<y>? yes
+
+ Unconnected directory inode 128337 (/var/spool/squid/06/???)
+ Connect to /lost+found<y>? yes
+ */
+
+
+ if (0 == random() % 10) goto PANIC;
+ BSOD_TEXT (bst, LEFT, "Pass 4: Checking reference counts\n");
+ BSOD_PAUSE (bst, 2000000);
+
+ /* Inode 2 ref count is 19, should be 20. Fix<y>? yes
+
+ Inode 4949 ref count is 3, should be 2. Fix<y>? yes
+
+ ...
+
+ Inode 128336 ref count is 3, should be 2. Fix<y>? yes
+
+ Inode 128337 ref count is 3, should be 2. Fix<y>? yes
+
+ */
+
+
+ if (0 == random() % 10) goto PANIC;
+ BSOD_TEXT (bst, LEFT, "Pass 5: Checking group summary information\n");
+ BSOD_PAUSE (bst, 2000000);
+
+ i = (random() % 200) - 50;
+ if (i > 0)
+ {
+ BSOD_TEXT (bst, LEFT, "Block bitmap differences: ");
+ while (--i > 0)
+ {
+ sprintf (buf, " %d", -(random() % 0xFFF));
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 1000);
+ }
+ BSOD_TEXT (bst, LEFT, "\nFix? yes\n\n");
+ }
+
+
+ i = (random() % 100) - 50;
+ if (i > 0)
+ {
+ BSOD_TEXT (bst, LEFT, "Inode bitmap differences: ");
+ while (--i > 0)
+ {
+ sprintf (buf, " %d", -(random() % 0xFFF));
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 1000);
+ }
+ BSOD_TEXT (bst, LEFT, "\nFix? yes\n\n");
+ }
+
+ i = (random() % 20) - 5;
+ while (--i > 0)
+ {
+ int g = random() % 0xFFFF;
+ int c = random() % 0xFFFF;
+ sprintf (buf,
+ "Free blocks count wrong for group #0 (%d, counted=%d).\nFix? ",
+ g, c);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 1000);
+ BSOD_TEXT (bst, LEFT, " yes\n\n");
+ }
+
+ PANIC:
+
+ i = 0;
+ BSOD_TEXT (bst, LEFT, "\n\n");
+ while (linux_panic[i])
+ {
+ time_t t = time ((time_t *) 0);
+ struct tm *tm = localtime (&t);
+ char prefix[100];
+
+ if (*linux_panic[i])
+ {
+ strftime (prefix, sizeof(prefix)-1, "%b %d %H:%M:%S ", tm);
+ BSOD_TEXT (bst, LEFT, prefix);
+ BSOD_TEXT (bst, LEFT, sysname);
+ BSOD_TEXT (bst, LEFT, linux_panic[i]);
+ BSOD_PAUSE (bst, 1000);
+ }
+ else
+ BSOD_PAUSE (bst, 300000);
+
+ i++;
+ }
+ BSOD_PAUSE (bst, 4000000);
+
+ XClearWindow(dpy, window);
+ return bst;
+}
+
+
+/*
+ * Linux (hppa) panic, by Stuart Brady <sdbrady@ntlworld.com>
+ * Output courtesy of M. Grabert
+ */
+static struct bsod_state *
+hppa_linux (Display *dpy, Window window)
+{
+ struct bsod_state *bst =
+ make_bsod_state (dpy, window, "hppalinux", "HPPALinux");
+
+ int i = 0;
+ const char *release, *sysname, *gccversion, *version;
+ long int linedelay = 0;
+ char ss[1024];
+# ifdef HAVE_UNAME
+ struct utsname uts;
+# endif /* UNAME */
+
+ __extension__
+ struct { long int delay; const char *string; } linux_panic[] =
+ {{ 0, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
+ "\n\n\n\n\n\n\n\n\n\n\n\n\n" },
+ { 0, "Linux version %s (root@%s) (gcc version %s) %s\n" },
+ { 4000, "FP[0] enabled: Rev 1 Model 16\n" },
+ { 10, "The 32-bit Kernel has started...\n" },
+ { -1, "Determining PDC firmware type: System Map.\n" },
+ { -1, "model 00005bb0 00000481 00000000 00000002 7778df9f 100000f0 "
+ "00000008 000000b2 000000b2\n" },
+ { -1, "vers 00000203\n" },
+ { -1, "CPUID vers 17 rev 7 (0x00000227)\n" },
+ { -1, "capabilities 0x3\n" },
+ { -1, "model 9000/785/C3000\n" },
+ { -1, "Total Memory: 1024 Mb\n" },
+ { -1, "On node 0 totalpages: 262144\n" },
+ { -1, " DMA zone: 262144 pages, LIFO batch:16\n" },
+ { -1, " Normal zone: 0 pages, LIFO batch:1\n" },
+ { -1, " HighMem zone: 0 pages, LIFO batch:1\n" },
+ { -1, "LCD display at f05d0008,f05d0000 registered\n" },
+ { -1, "Building zonelist for node : 0\n" },
+ { -1, "Kernel command line: ide=nodma root=/dev/sda3 HOME=/ ip=off "
+ "console=ttyS0 TERM=vt102 palo_kernel=2/vmlinux-2.6\n" },
+ { -1, "ide_setup: ide=nodmaIDE: Prevented DMA\n" },
+ { -1, "PID hash table entries: 16 (order 4: 128 bytes)\n" },
+ {500, "Console: colour dummy device 160x64\n" },
+ { 10, "Memory: 1034036k available\n" },
+ { -1, "Calibrating delay loop... 796.67 BogoMIPS\n" },
+ { -1, "Dentry cache hash table entries: 131072 (order: 7, 524288 "
+ "bytes)\n" },
+ { -1, "Inode-cache hash table entries: 65536 (order: 6, 262144 "
+ "bytes)\n" },
+ { -1, "Mount-cache hash table entries: 512 (order: 0, 4096 bytes)\n" },
+ { -1, "POSIX conformance testing by UNIFIX\n" },
+ { -1, "NET: Registered protocol family 16\n" },
+ { 100, "Searching for devices...\n" },
+ { 25, "Found devices:\n" },
+ { 10, "1. Astro BC Runway Port at 0xfed00000 [10] "
+ "{ 12, 0x0, 0x582, 0x0000b }\n" },
+ { -1, "2. Elroy PCI Bridge at 0xfed30000 [10/0] "
+ "{ 13, 0x0, 0x782, 0x0000a }\n" },
+ { -1, "3. Elroy PCI Bridge at 0xfed32000 [10/1] "
+ "{ 13, 0x0, 0x782, 0x0000a }\n" },
+ { -1, "4. Elroy PCI Bridge at 0xfed38000 [10/4] "
+ "{ 13, 0x0, 0x782, 0x0000a }\n" },
+ { -1, "5. Elroy PCI Bridge at 0xfed3c000 [10/6] "
+ "{ 13, 0x0, 0x782, 0x0000a }\n" },
+ { -1, "6. AllegroHigh W at 0xfffa0000 [32] "
+ "{ 0, 0x0, 0x5bb, 0x00004 }\n" },
+ { -1, "7. Memory at 0xfed10200 [49] { 1, 0x0, 0x086, 0x00009 }\n" },
+ { -1, "CPU(s): 1 x PA8500 (PCX-W) at 400.000000 MHz\n" },
+ { -1, "SBA found Astro 2.1 at 0xfed00000\n" },
+ { -1, "lba version TR2.1 (0x2) found at 0xfed30000\n" },
+ { -1, "lba version TR2.1 (0x2) found at 0xfed32000\n" },
+ { -1, "lba version TR2.1 (0x2) found at 0xfed38000\n" },
+ { -1, "lba version TR2.1 (0x2) found at 0xfed3c000\n" },
+ { 100, "SCSI subsystem initialized\n" },
+ { 10, "drivers/usb/core/usb.c: registered new driver usbfs\n" },
+ { -1, "drivers/usb/core/usb.c: registered new driver hub\n" },
+ { -1, "ikconfig 0.7 with /proc/config*\n" },
+ { -1, "Initializing Cryptographic API\n" },
+ { 250, "SuperIO: probe of 0000:00:0e.0 failed with error -1\n" },
+ { 20, "SuperIO: Found NS87560 Legacy I/O device at 0000:00:0e.1 "
+ "(IRQ 64)\n" },
+ { -1, "SuperIO: Serial port 1 at 0x3f8\n" },
+ { -1, "SuperIO: Serial port 2 at 0x2f8\n" },
+ { -1, "SuperIO: Parallel port at 0x378\n" },
+ { -1, "SuperIO: Floppy controller at 0x3f0\n" },
+ { -1, "SuperIO: ACPI at 0x7e0\n" },
+ { -1, "SuperIO: USB regulator enabled\n" },
+ { -1, "SuperIO: probe of 0000:00:0e.2 failed with error -1\n" },
+ { -1, "Soft power switch enabled, polling @ 0xf0400804.\n" },
+ { -1, "pty: 256 Unix98 ptys configured\n" },
+ { -1, "Generic RTC Driver v1.07\n" },
+ { -1, "Serial: 8250/16550 driver $" "Revision: 1.100 $ 13 ports, "
+ "IRQ sharing disabled\n" },
+ { -1, "ttyS0 at I/O 0x3f8 (irq = 0) is a 16550A\n" },
+ { -1, "ttyS1 at I/O 0x2f8 (irq = 0) is a 16550A\n" },
+ { -1, "Linux Tulip driver version 1.1.13 (May 11, 2002)\n" },
+ { 150, "tulip0: no phy info, aborting mtable build\n" },
+ { 10, "tulip0: MII transceiver #1 config 1000 status 782d "
+ "advertising 01e1.\n" },
+ { -1, "eth0: Digital DS21143 Tulip rev 65 at 0xf4008000, "
+ "00:10:83:F9:B4:34, IRQ 66.\n" },
+ { -1, "Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2\n" },
+ { -1, "ide: Assuming 33MHz system bus speed for PIO modes; "
+ "override with idebus=xx\n" },
+ { 100, "SiI680: IDE controller at PCI slot 0000:01:06.0\n" },
+ { 10, "SiI680: chipset revision 2\n" },
+ { -1, "SiI680: BASE CLOCK == 133\n" },
+ { -1, "SiI680: 100% native mode on irq 128\n" },
+ { -1, " ide0: MMIO-DMA at 0xf4800000-0xf4800007 -- "
+ "Error, MMIO ports already in use.\n" },
+ { -1, " ide1: MMIO-DMA at 0xf4800008-0xf480000f -- "
+ "Error, MMIO ports already in use.\n" },
+ { 5, "hda: TS130220A2, ATA DISK drive\n" },
+ { -1, " _______________________________\n" },
+ { -1, " < Your System ate a SPARC! Gah! >\n" },
+ { -1, " -------------------------------\n" },
+ { -1, " \\ ^__^\n" },
+ { -1, " \\ (xx)\\_______\n" },
+ { -1, " (__)\\ )\\/\\\n" },
+ { -1, " U ||----w |\n" },
+ { -1, " || ||\n" },
+ { -1, "swapper (pid 1): Breakpoint (code 0)\n" },
+ { -1, "\n" },
+ { -1, " YZrvWESTHLNXBCVMcbcbcbcbOGFRQPDI\n" },
+ { -1, "PSW: 00000000000001001111111100001111 Not tainted\n" },
+ { -1, "r00-03 4d6f6f21 1032f010 10208f34 103fc2e0\n" },
+ { -1, "r04-07 103fc230 00000001 00000001 0000000f\n" },
+ { -1, "r08-11 103454f8 000f41fa 372d3980 103ee404\n" },
+ { -1, "r12-15 3ccbf700 10344810 103ee010 f0400004\n" },
+ { -1, "r16-19 f00008c4 f000017c f0000174 00000000\n" },
+ { -1, "r20-23 fed32840 fed32800 00000000 0000000a\n" },
+ { -1, "r24-27 0000ffa0 000000ff 103fc2e0 10326010\n" },
+ { -1, "r28-31 00000000 00061a80 4ff98340 10208f34\n" },
+ { -1, "sr0-3 00000000 00000000 00000000 00000000\n" },
+ { -1, "sr4-7 00000000 00000000 00000000 00000000\n" },
+ { -1, "\n" },
+ { -1, "IASQ: 00000000 00000000 IAOQ: 00000000 00000004\n" },
+ { -1, " IIR: 00000000 ISR: 00000000 IOR: 00000000\n" },
+ { -1, " CPU: 0 CR30: 4ff98000 CR31: 1037c000\n" },
+ { -1, " ORIG_R28: 55555555\n" },
+ { -1, " IAOQ[0]: 0x0\n" },
+ { -1, " IAOQ[1]: 0x4\n" },
+ { -1, " RP(r2): probe_hwif+0x218/0x44c\n" },
+ { -1, "Kernel panic: Attempted to kill init!\n" },
+ { 0, NULL }};
+
+ bst->scroll_p = True;
+ bst->wrap_p = True;
+ bst->left_margin = bst->right_margin = 10;
+ bst->top_margin = bst->bottom_margin = 10;
+
+ release = "2.6.0-test11-pa2";
+ sysname = "hppa";
+ version = "#2 Mon Dec 8 06:09:27 GMT 2003";
+# ifdef HAVE_UNAME
+ {
+ char *s;
+ if (uname (&uts) >= 0)
+ {
+ sysname = uts.nodename;
+ if (!strcmp (uts.sysname, "Linux"))
+ {
+ release = uts.release;
+ version = uts.version;
+ }
+ }
+ s = strchr (sysname, '.');
+ if (s) *s = 0;
+ }
+# endif /* !HAVE_UNAME */
+
+# if (defined (__GNUC__) && defined (__VERSION__))
+ gccversion = __VERSION__;
+# else /* !(defined (__GNUC__) && defined (__VERSION__)) */
+ gccversion = "3.3.2 (Debian)";
+# endif /* !(defined (__GNUC__) && defined (__VERSION__)) */
+
+ /* Insert current host name into banner on line 2 */
+ {
+ snprintf (ss, 1024, linux_panic[1].string,
+ release, sysname, gccversion, version);
+ linux_panic[1].string = ss;
+ }
+
+ BSOD_PAUSE (bst, 100000);
+ while (linux_panic[i].string)
+ {
+ if (linux_panic[i].delay != -1)
+ linedelay = linux_panic[i].delay * 1000;
+ BSOD_PAUSE (bst, linedelay);
+ BSOD_TEXT (bst, LEFT, linux_panic[i].string);
+ i++;
+ }
+
+ bst->y = bst->xgwa.height - bst->yoff
+ - bst->font->ascent - bst->font->descent;
+
+ XClearWindow(dpy, window);
+ return bst;
+}
+
+
+/* VMS by jwz (text sent by Roland Barmettler <roli@barmettler.net>)
+ */
+static struct bsod_state *
+vms (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "vms", "VMS");
+
+ const char *sysname;
+ int char_delay = 0;
+ int dot_delay = 40000;
+ int chunk_delay = 500000;
+ char *s, *s1;
+ int i;
+ int arg_count;
+# ifdef HAVE_UNAME
+ struct utsname uts;
+# endif /* UNAME */
+
+ __extension__
+
+ const char *lines[] = {
+ "%CNXMAN, Lost connection to system #\n"
+ "%SHADOW-I-VOLPROC, DSA0: shadow master has changed. "
+ "Dump file WILL be written if system crashes.\n"
+ "\n",
+ "",
+
+ "%CNXMAN, Quorum lost, blocking activity\n"
+ "%CNXMAN, Timed-out lost connection to system #\n"
+ "%CNXMAN, Timed-out lost connection to system #\n"
+ "%CNXMAN, Timed-out lost connection to system #\n"
+ "%CNXMAN, Proposing reconfiguration of the VMScluster\n",
+ "",
+
+ "%CNXMAN, Removed from VMScluster system #\n"
+ "%CNXMAN, Removed from VMScluster system #\n"
+ "%CNXMAN, Removed from VMScluster system #\n"
+ "%CNXMAN, Completing VMScluster state transition\n",
+
+ "\n"
+ "**** OpenVMS (TM) Alpha Operating system V7.3-1 - BUGCHECK ****\n"
+ "\n"
+ "** Bugcheck code = 000005DC: CLUEXIT, Node voluntarily exiting "
+ "VMScluster\n"
+ "** Crash CPU: 00 Primary CPU: 00 Active CPUs: 00000001\n"
+ "** Current Process = NULL\n"
+ "** Current PSB ID = 00000001\n"
+ "** Image Name =\n"
+ "\n"
+ "** Dumping error log buffers to HBVS unit 0\n"
+ "**** Unable to dump error log buffers to remaining shadow set members\n"
+ "** Error log buffers not dumped to HBVS unit 200\n"
+ "\n"
+ "** Dumping memory to HBVS unit 0\n"
+ "**** Starting compressed selective memory dump at #...\n",
+
+ "...",
+
+ "\n"
+ "**** Memory dump complete - not all processes or global pages saved\n",
+
+ "\n"
+ "halted CPU 0\n",
+ "",
+
+ "\n"
+ "halt code = 5\n"
+ "HALT instruction executed\n"
+ "PC = ffffffff800c3884\n",
+
+ "\n"
+ "CPU 0 booting\n",
+
+ "\n"
+ "resetting all I/O buses\n"
+ "\n"
+ "\n"
+ };
+ char *args[8];
+ int ids[3];
+
+ bst->scroll_p = True;
+ bst->wrap_p = True;
+ bst->left_margin = bst->right_margin = 10;
+ bst->top_margin = bst->bottom_margin = 10;
+
+ sysname = "VMS001";
+# ifdef HAVE_UNAME
+ {
+ if (uname (&uts) >= 0)
+ sysname = uts.nodename;
+ s = strchr (sysname, '.');
+ if (s) *s = 0;
+ }
+# endif /* !HAVE_UNAME */
+
+ args[0] = malloc (strlen(sysname) + 7);
+ strcpy (args[0], sysname);
+ args[0][5] = 0;
+
+ /* Pick three numbers, 1-9, no overlaps. */
+ ids[0] = 1 + (random() % 9);
+ do { ids[1] = 1 + (random() % 9); } while (ids[1]==ids[0]);
+ do { ids[2] = 1 + (random() % 9); } while (ids[2]==ids[0] || ids[2]==ids[1]);
+
+ i = strlen(args[0])-1;
+ if (i < 6) i++;
+ args[0][i] = '0' + ids[0];
+ args[0][i+1] = 0;
+
+ for (s = args[0]; *s; s++)
+ if (isalpha(*s)) *s = toupper (*s);
+
+ args[1] = strdup (args[0]);
+ args[2] = strdup (args[0]); args[2][i] = '0' + ids[1];
+ args[3] = strdup (args[0]); args[3][i] = '0' + ids[2];
+
+ args[4] = strdup (args[1]);
+ args[5] = strdup (args[2]);
+ args[6] = strdup (args[3]);
+
+ {
+ time_t t = time ((time_t *) 0);
+ struct tm *tm = localtime (&t);
+ args[7] = malloc (30);
+ strftime (args[7], 29, "%d-%b-%Y %H:%M", tm);
+ for (s = args[7]; *s; s++)
+ if (isalpha(*s)) *s = toupper (*s);
+ }
+
+ arg_count = 0;
+ for (i = 0; i < countof(lines); i++)
+ {
+ const char *fmt = lines[i];
+ if (! strcmp (fmt, "..."))
+ {
+ int steps = 180 + (random() % 60);
+ while (--steps >= 0)
+ {
+ BSOD_TEXT (bst, LEFT, ".");
+ BSOD_PAUSE (bst, dot_delay);
+ }
+ }
+ else
+ {
+ char *fmt2 = malloc (strlen (fmt) * 2 + 1);
+ for (s = (char *) fmt, s1 = fmt2; *s; s++)
+ {
+ if (*s == '#')
+ {
+ strcpy (s1, args[arg_count++]);
+ s1 += strlen(s1);
+ }
+ else
+ *s1++ = *s;
+ }
+ *s1 = 0;
+ BSOD_CHAR_DELAY (bst, char_delay);
+ BSOD_TEXT (bst, LEFT, fmt2);
+ free (fmt2);
+ BSOD_CHAR_DELAY (bst, 0);
+ BSOD_PAUSE (bst, chunk_delay);
+ }
+ }
+
+ for (i = 0; i < countof (args); i++)
+ free (args[i]);
+
+ XClearWindow(dpy, window);
+ return bst;
+}
+
+
+/* HVX (formerly GCOS6) and TPS6 crash
+ by Brian Garratt <brian-m.garratt@bull.co.uk>
+
+ GCOS6 is a Unix-like operating system developed by Honeywell in the
+ 1970s in collaboration with MIT and AT&T (who called their version
+ UNIX). Both are very much like MULTICS which Honeywell got from GE.
+
+ HVX ("High-performance Virtual System on Unix") is an AIX application
+ which emulates GCOS6 hardware on RS6000-like machines.
+ */
+static struct bsod_state *
+hvx (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "hvx", "HVX");
+
+ bst->scroll_p = True;
+ bst->wrap_p = True;
+ bst->y = bst->xgwa.height - bst->bottom_margin - bst->yoff
+ - bst->font->ascent;
+
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT,
+ "(TP) Trap no E Effective address 00000000 Instruction D7DE\n"
+ "(TP) Registers :\n"
+ "(TP) B1 -> B7 03801B02 00000000 03880D45 038BABDB 0388AFFD"
+ " 0389B3F8 03972317\n"
+ "(TP) R1 -> R7 0001 0007 F10F 090F 0020 0106 0272\n"
+ "(TP) P I Z M1 0388A18B 3232 0000 FF00\n"
+ "(TP) Program counter is at offset 0028 from string YTPAD\n"
+ "(TP) User id of task which trapped is LT 626\n"
+ "(TP)?\n"
+ );
+ BSOD_PAUSE (bst, 1000000);
+
+ BSOD_CHAR_DELAY (bst, 100000);
+ BSOD_TEXT (bst, LEFT, " TP CLOSE ALL");
+
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT, "\n(TP)?\n");
+ BSOD_PAUSE (bst, 1000000);
+
+ BSOD_CHAR_DELAY (bst, 100000);
+ BSOD_TEXT (bst, LEFT, " TP ABORT -LT ALL");
+
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT, "\n(TP)?\n");
+ BSOD_PAUSE (bst, 1000000);
+
+ BSOD_CHAR_DELAY (bst, 100000);
+ BSOD_TEXT (bst, LEFT, " TP STOP KILL");
+
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT,
+ "\n"
+ "(TP)?\n"
+ "Core dumps initiated for selected HVX processes ...\n"
+ "Core dumps complete.\n"
+ "Fri Jul 19 15:53:09 2002\n"
+ "Live registers for cp 0:\n"
+ " P = 7de3 IW=0000 I=32 CI=30000000 S=80006013"
+ " IV=aa0 Level=13\n"
+ " R1-7 = 1f 913 13 4 8 0 0\n"
+ " B1-7 = 64e71b a93 50e 64e73c 6c2c 7000 b54\n"
+ "Memory dump starting to file /var/hvx/dp01/diag/Level2 ...\n"
+ "Memory dump complete.\n"
+ );
+
+ XClearWindow(dpy, window);
+ return bst;
+}
+
+
+/* HPUX panic, by Tobias Klausmann <klausman@schwarzvogel.de>
+ */
+static struct bsod_state *
+hpux (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "hpux", "HPUX");
+ const char *sysname;
+ char buf[2048];
+# ifdef HAVE_UNAME
+ struct utsname uts;
+# endif /* UNAME */
+
+ bst->scroll_p = True;
+ bst->y = bst->xgwa.height - bst->bottom_margin - bst->yoff
+ - bst->font->ascent;
+
+ sysname = "HPUX";
+# ifdef HAVE_UNAME
+ {
+ char *s;
+ if (uname (&uts) >= 0)
+ sysname = uts.nodename;
+ s = strchr (sysname, '.');
+ if (s) *s = 0;
+ }
+# endif /* !HAVE_UNAME */
+
+ BSOD_TEXT (bst, LEFT,
+ " "
+ " "
+ " \n");
+ sprintf (buf, "%.100s [HP Release B.11.00] (see /etc/issue)\n", sysname);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 1000000);
+ BSOD_TEXT (bst, LEFT,
+ "Console Login:\n"
+ "\n"
+ " ******* Unexpected HPMC/TOC. Processor HPA FFFFFFFF'"
+ "FFFA0000 *******\n"
+ " GENERAL REGISTERS:\n"
+ "r00/03 00000000'00000000 00000000'00000000 00000000'00000000 00000000'"
+ "006C76C0\n"
+ "r04/07 00000000'00000001 00000000'0126E328 00000000'00000000 00000000'"
+ "0122B640\n"
+ "r08/11 00000000'00000000 00000000'0198CFC0 00000000'000476FE 00000000'"
+ "00000001\n"
+ "r12/15 00000000'40013EE8 00000000'08000080 00000000'4002530C 00000000'"
+ "4002530C\n"
+ "r16/19 00000000'7F7F2A00 00000000'00000001 00000000'00000000 00000000'"
+ "00000000\n"
+ "r20/23 00000000'006C8048 00000000'00000001 00000000'00000000 00000000'"
+ "00000000\n"
+ "r24/27 00000000'00000000 00000000'00000000 00000000'00000000 00000000'"
+ "00744378\n"
+ "r28/31 00000000'00000000 00000000'007DD628 00000000'0199F2B0 00000000'"
+ "00000000\n"
+ " CONTROL REGISTERS:\n"
+ "sr0/3 00000000'0F3B4000 00000000'0C2A2000 00000000'016FF800 00000000'"
+ "00000000\n"
+ "sr4/7 00000000'00000000 00000000'016FF800 00000000'0DBF1400 00000000'"
+ "00000000\n"
+ "pcq = 00000000'00000000.00000000'00104950 00000000'00000000.00000000'"
+ "00104A14\n"
+ "isr = 00000000'10240006 ior = 00000000'67D9E220 iir = 08000240 rctr = "
+ "7FF10BB6\n"
+ "\n"
+ "pid reg cr8/cr9 00007700'0000B3A9 00000000'0000C5D8\n"
+ "pid reg cr12/cr13 00000000'00000000 00000000'00000000\n"
+ "ipsw = 000000FF'080CFF1F iva = 00000000'0002C000 sar = 3A ccr = C0\n"
+ "tr0/3 00000000'006C76C0 00000000'00000001 00000000'00000000 00000000'"
+ "7F7CE000\n"
+ "tr4/7 00000000'03790000 0000000C'4FB68340 00000000'C07EE13F 00000000'"
+ "0199F2B0\n"
+ "eiem = FFFFFFF0'FFFFFFFF eirr = 80000000'00000000 itmr = 0000000C'"
+ "4FD8EDE1\n"
+ "cr1/4 00000000'00000000 00000000'00000000 00000000'00000000 00000000'"
+ "00000000\n"
+ "cr5/7 00000000'00000000 00000000'00000000 00000000'"
+ "00000000\n"
+ " MACHINE CHECK PARAMETERS:\n"
+ "Check Type = 00000000 CPU STATE = 9E000001 Cache Check = 00000000\n"
+ "TLB Check = 00000000 Bus Check = 00000000 PIM State = ? SIU "
+ "Status = ????????\n"
+ "Assists = 00000000 Processor = 00000000\n"
+ "Slave Addr = 00000000'00000000 Master Addr = 00000000'00000000\n"
+ "\n"
+ "\n"
+ "TOC, pcsq.pcoq = 0'0.0'104950 , isr.ior = 0'10240006.0'67d9e220\n"
+ "@(#)B2352B/9245XB HP-UX (B.11.00) #1: Wed Nov 5 22:38:19 PST 1997\n"
+ "Transfer of control: (display==0xd904, flags==0x0)\n"
+ "\n"
+ "\n"
+ "\n"
+ "*** A system crash has occurred. (See the above messages for details.)\n"
+ "*** The system is now preparing to dump physical memory to disk, for use\n"
+ "*** in debugging the crash.\n"
+ "\n"
+ "*** The dump will be a SELECTIVE dump: 40 of 256 megabytes.\n"
+ "*** To change this dump type, press any key within 10 seconds.\n"
+ "*** Proceeding with selective dump.\n"
+ "\n"
+ "*** The dump may be aborted at any time by pressing ESC.\n");
+
+ {
+ int i;
+ int steps = 11;
+ int size = 40;
+ for (i = 0; i <= steps; i++)
+ {
+ if (i > steps) i = steps;
+ sprintf (buf,
+ "*** Dumping: %3d%% complete (%d of 40 MB) (device 64:0x2)\r",
+ i * 100 / steps,
+ i * size / steps);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 1500000);
+ }
+ }
+
+ BSOD_TEXT (bst, LEFT, "\n*** System rebooting.\n");
+
+ XClearWindow(dpy, window);
+ return bst;
+}
+
+
+/* IBM OS/390 aka MVS aka z/OS.
+ Text from Dan Espen <dane@mk.telcordia.com>.
+ Apparently this isn't actually a crash, just a random session...
+ But who can tell.
+ */
+static struct bsod_state *
+os390 (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "os390", "OS390");
+
+ bst->scroll_p = True;
+ bst->y = bst->xgwa.height - bst->bottom_margin - bst->yoff
+ - bst->font->ascent;
+
+ BSOD_LINE_DELAY (bst, 100000);
+ BSOD_TEXT (bst, LEFT,
+ "\n*** System rebooting.\n"
+ "* ISPF Subtask abend *\n"
+ "SPF ENDED DUE TO ERROR+\n"
+ "READY\n"
+ "\n"
+ "IEA995I SYMPTOM DUMP OUTPUT\n"
+ " USER COMPLETION CODE=0222\n"
+ " TIME=23.00.51 SEQ=03210 CPU=0000 ASID=00AE\n"
+ " PSW AT TIME OF ERROR 078D1000 859DAF18 ILC 2 INTC 0D\n"
+ " NO ACTIVE MODULE FOUND\n"
+ " NAME=UNKNOWN\n"
+ " DATA AT PSW 059DAF12 - 00181610 0A0D9180 70644710\n"
+ " AR/GR 0: 00000000/80000000 1: 00000000/800000DE\n"
+ " 2: 00000000/196504DC 3: 00000000/00037A78\n"
+ " 4: 00000000/00037B78 5: 00000000/0003351C\n"
+ " 6: 00000000/0000F0AD 7: 00000000/00012000\n"
+ " 8: 00000000/059DAF10 9: 00000000/0002D098\n"
+ " A: 00000000/059D9F10 B: 00000000/059D8F10\n"
+ " C: 00000000/859D7F10 D: 00000000/00032D60\n"
+ " E: 00000000/00033005 F: 01000002/00000041\n"
+ " END OF SYMPTOM DUMP\n"
+ "ISPS014 - ** Logical screen request failed - abend 0000DE **\n"
+ "ISPS015 - ** Contact your system programmer or dialog developer.**\n"
+ "*** ISPF Main task abend ***\n"
+ "IEA995I SYMPTOM DUMP OUTPUT\n"
+ " USER COMPLETION CODE=0222\n"
+ " TIME=23.00.52 SEQ=03211 CPU=0000 ASID=00AE\n"
+ " PSW AT TIME OF ERROR 078D1000 8585713C ILC 2 INTC 0D\n"
+ " ACTIVE LOAD MODULE ADDRESS=05855000 OFFSET=0000213C\n"
+ " NAME=ISPMAIN\n"
+ " DATA AT PSW 05857136 - 00181610 0A0D9180 D3304770\n"
+ " GR 0: 80000000 1: 800000DE\n"
+ " 2: 00015260 3: 00000038\n"
+ " 4: 00012508 5: 00000000\n"
+ " 6: 000173AC 7: FFFFFFF8\n"
+ " 8: 05858000 9: 00012CA0\n"
+ " A: 05857000 B: 05856000\n"
+ " C: 85855000 D: 00017020\n"
+ " E: 85857104 F: 00000000\n"
+ " END OF SYMPTOM DUMP\n"
+ "READY\n"
+ "***");
+ BSOD_CURSOR (bst, CURSOR_LINE, 240000, 999999);
+
+ XClearWindow(dpy, window);
+ return bst;
+}
+
+
+/* Compaq Tru64 Unix panic, by jwz as described by
+ Tobias Klausmann <klausman@schwarzvogel.de>
+ */
+static struct bsod_state *
+tru64 (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "tru64", "Tru64");
+ const char *sysname;
+ char buf[2048];
+# ifdef HAVE_UNAME
+ struct utsname uts;
+#endif /* UNAME */
+
+ bst->scroll_p = True;
+ bst->y = bst->xgwa.height - bst->bottom_margin - bst->yoff
+ - bst->font->ascent;
+
+ sysname = "127.0.0.1";
+# ifdef HAVE_UNAME
+ {
+ if (uname (&uts) >= 0)
+ sysname = uts.nodename;
+ }
+# endif /* !HAVE_UNAME */
+
+ sprintf (buf,
+ "Compaq Tru64 UNIX V5.1B (Rev. 2650) (%.100s) console\n"
+ "\n"
+ "login: ",
+ sysname);
+ BSOD_TEXT (bst, LEFT, buf);
+ BSOD_PAUSE (bst, 6000000);
+
+ BSOD_TEXT (bst, LEFT,
+ "panic (cpu 0): trap: illegal instruction\n"
+ "kernel inst fault=gentrap, ps=0x5, pc=0xfffffc0000593878, inst=0xaa\n"
+ "kernel inst fault=gentrap, ps=0x5, pc=0xfffffc0000593878, inst=0xaa\n"
+ " \n"
+ "DUMP: blocks available: 1571600\n"
+ "DUMP: blocks wanted: 100802 (partial compressed dump) [OKAY]\n"
+ "DUMP: Device Disk Blocks Available\n"
+ "DUMP: ------ ---------------------\n"
+ "DUMP: 0x1300023 1182795 - 1571597 (of 1571598) [primary swap]\n"
+ "DUMP.prom: Open: dev 0x5100041, block 2102016: SCSI 0 11 0 2 200 0 0\n"
+ "DUMP: Writing header... [1024 bytes at dev 0x1300023, block 1571598]\n"
+ "DUMP: Writing data");
+
+ {
+ int i;
+ int steps = 4 + (random() % 8);
+ BSOD_CHAR_DELAY (bst, 1000000);
+ for (i = 0; i < steps; i++)
+ BSOD_TEXT (bst, LEFT, ".");
+ BSOD_CHAR_DELAY (bst, 0);
+ sprintf (buf, "[%dMB]\n", steps);
+ BSOD_TEXT (bst, LEFT, buf);
+ }
+
+ BSOD_TEXT (bst, LEFT,
+ "DUMP: Writing header... [1024 bytes at dev 0x1300023, block 1571598]\n"
+ "DUMP: crash dump complete.\n"
+ "kernel inst fault=gentrap, ps=0x5, pc=0xfffffc0000593878, inst=0xaa\n"
+ " \n"
+ "DUMP: second crash dump skipped: 'dump_savecnt' enforced.\n");
+ BSOD_PAUSE (bst, 4000000);
+
+ BSOD_TEXT (bst, LEFT,
+ "\n"
+ "halted CPU 0\n"
+ "\n"
+ "halt code = 5\n"
+ "HALT instruction executed\n"
+ "PC = fffffc00005863b0\n");
+ BSOD_PAUSE (bst, 3000000);
+
+ BSOD_TEXT (bst, LEFT,
+ "\n"
+ "CPU 0 booting\n"
+ "\n"
+ "\n"
+ "\n");
+
+ XClearWindow(dpy, window);
+ return bst;
+}
+
+
+/* MS-DOS, by jwz
+ */
+static struct bsod_state *
+msdos (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "msdos", "MSDOS");
+
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT, "C:\\WINDOWS>");
+ BSOD_CURSOR (bst, CURSOR_LINE, 200000, 8);
+
+ BSOD_CHAR_DELAY (bst, 200000);
+ BSOD_TEXT (bst, LEFT, "dir a:");
+ BSOD_PAUSE (bst, 1000000);
+
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT, "\nNot ready reading drive A\nAbort, Retry, Fail?");
+
+ BSOD_CURSOR (bst, CURSOR_LINE, 200000, 10);
+ BSOD_CHAR_DELAY (bst, 200000);
+ BSOD_TEXT (bst, LEFT, "f");
+ BSOD_PAUSE (bst, 1000000);
+
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT,
+ "\n\n\nNot ready reading drive A\nAbort, Retry, Fail?");
+
+ BSOD_CURSOR (bst, CURSOR_LINE, 200000, 10);
+ BSOD_CHAR_DELAY (bst, 200000);
+ BSOD_TEXT (bst, LEFT, "f");
+ BSOD_PAUSE (bst, 1000000);
+
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT, "\nVolume in drive A has no label\n\n"
+ "Not ready reading drive A\nAbort, Retry, Fail?");
+
+ BSOD_CURSOR (bst, CURSOR_LINE, 200000, 12);
+ BSOD_CHAR_DELAY (bst, 200000);
+ BSOD_TEXT (bst, LEFT, "a");
+ BSOD_PAUSE (bst, 1000000);
+
+ BSOD_CHAR_DELAY (bst, 10000);
+ BSOD_TEXT (bst, LEFT, "\n\nC:\\WINDOWS>");
+
+ BSOD_CURSOR (bst, CURSOR_LINE, 200000, 999999);
+
+ XClearWindow(dpy, window);
+ return bst;
+}
+
+
+/* nvidia, by jwz.
+ *
+ * This is what happens if an Nvidia card goes into some crazy text mode.
+ * Most often seen on the second screen of a dual-head system when the
+ * proper driver isn't loaded.
+ */
+typedef struct { int fg; int bg; int bit; Bool blink; } nvcell;
+
+static void
+nvspatter (nvcell *grid, int rows, int cols, int ncolors, int nbits,
+ Bool fill_p)
+{
+ int max = rows * cols;
+ int from = fill_p ? 0 : random() % (max - 1);
+ int len = fill_p ? max : random() % (cols * 4);
+ int to = from + len;
+ int i;
+ Bool noisy = ((random() % 4) == 0);
+ Bool diag = (noisy || fill_p) ? 0 : ((random() % 4) == 0);
+
+ int fg = random() % ncolors;
+ int bg = random() % ncolors;
+ int blink = ((random() % 4) == 0);
+ int bit = (random() % nbits);
+
+ if (to > max) to = max;
+
+ if (diag)
+ {
+ int src = random() % (rows * cols);
+ int len2 = (cols / 2) - (random() % 5);
+ int j = src;
+ for (i = from; i < to; i++, j++)
+ {
+ if (j > src + len2 || j >= max)
+ j = src;
+ if (i >= max) abort();
+ if (j >= max) abort();
+ grid[j] = grid[i];
+ }
+ }
+ else
+ for (i = from; i < to; i++)
+ {
+ nvcell *cell = &grid[i];
+ cell->fg = fg;
+ cell->bg = bg;
+ cell->bit = bit;
+ cell->blink = blink;
+
+ if (noisy)
+ {
+ fg = random() % ncolors;
+ bg = random() % ncolors;
+ blink = ((random() % 8) == 0);
+ }
+ }
+}
+
+typedef struct {
+ struct bsod_state *bst;
+ GC gc1;
+ Pixmap bits[5];
+ int rows, cols;
+ int cellw, cellh;
+ nvcell *grid;
+ int ncolors;
+ unsigned long colors[256];
+ int tick;
+} nvstate;
+
+
+static void
+nvidia_free (struct bsod_state *bst)
+{
+ nvstate *nvs = (nvstate *) bst->closure;
+ int i;
+ XFreeColors (bst->dpy, bst->xgwa.colormap, nvs->colors, nvs->ncolors, 0);
+ for (i = 0; i < countof(nvs->bits); i++)
+ XFreePixmap (bst->dpy, nvs->bits[i]);
+ XFreeGC (bst->dpy, nvs->gc1);
+ free (nvs->grid);
+ free (nvs);
+}
+
+static int
+nvidia_draw (struct bsod_state *bst)
+{
+ nvstate *nvs = (nvstate *) bst->closure;
+ int x, y;
+
+ for (y = 0; y < nvs->rows; y++)
+ for (x = 0; x < nvs->cols; x++)
+ {
+ nvcell *cell = &nvs->grid[y * nvs->cols + x];
+ unsigned long fg = nvs->colors[cell->fg];
+ unsigned long bg = nvs->colors[cell->bg];
+ Bool flip = cell->blink && (nvs->tick & 1);
+ XSetForeground (bst->dpy, bst->gc, flip ? fg : bg);
+ XSetBackground (bst->dpy, bst->gc, flip ? bg : fg);
+ XCopyPlane (bst->dpy, nvs->bits[cell->bit], bst->window, bst->gc,
+ 0, 0, nvs->cellw, nvs->cellh,
+ x * nvs->cellw, y * nvs->cellh, 1L);
+ }
+
+ nvs->tick++;
+ if ((random() % 5) == 0) /* change the display */
+ nvspatter (nvs->grid, nvs->rows, nvs->cols, nvs->ncolors,
+ countof(nvs->bits), False);
+
+ return 250000;
+}
+
+
+static struct bsod_state *
+nvidia (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "nvidia", "nVidia");
+ nvstate *nvs = (nvstate *) calloc (1, sizeof (*nvs));
+
+ XGCValues gcv;
+ int i;
+
+ nvs->bst = bst;
+ bst->closure = nvs;
+ bst->draw_cb = nvidia_draw;
+ bst->free_cb = nvidia_free;
+
+ nvs->cols = 80;
+ nvs->rows = 25;
+ nvs->cellw = bst->xgwa.width / nvs->cols;
+ nvs->cellh = bst->xgwa.height / nvs->rows;
+ if (nvs->cellw < 8 || nvs->cellh < 18)
+ nvs->cellw = 8, nvs->cellh = 18;
+ nvs->cols = (bst->xgwa.width / nvs->cellw) + 1;
+ nvs->rows = (bst->xgwa.height / nvs->cellh) + 1;
+
+ nvs->grid = (nvcell *) calloc (sizeof(*nvs->grid), nvs->rows * nvs->cols);
+
+ /* Allocate colors
+ */
+ nvs->ncolors = 16;
+ for (i = 0; i < nvs->ncolors; i++)
+ {
+ XColor c;
+ c.red = random() & 0xFFFF;
+ c.green = random() & 0xFFFF;
+ c.blue = random() & 0xFFFF;
+ c.flags = DoRed|DoGreen|DoBlue;
+ XAllocColor (dpy, bst->xgwa.colormap, &c);
+ nvs->colors[i] = c.pixel;
+ }
+
+ /* Construct corrupted character bitmaps
+ */
+ for (i = 0; i < countof(nvs->bits); i++)
+ {
+ int j;
+
+ nvs->bits[i] = XCreatePixmap (dpy, window, nvs->cellw, nvs->cellh, 1);
+ if (!nvs->gc1) nvs->gc1 = XCreateGC (dpy, nvs->bits[i], 0, &gcv);
+
+ XSetForeground (dpy, nvs->gc1, 0);
+ XFillRectangle (dpy, nvs->bits[i], nvs->gc1, 0, 0,
+ nvs->cellw, nvs->cellh);
+ XSetForeground (dpy, nvs->gc1, 1);
+
+ if ((random() % 40) != 0)
+ for (j = 0; j < ((nvs->cellw * nvs->cellh) / 16); j++)
+ XFillRectangle (dpy, nvs->bits[i], nvs->gc1,
+ (random() % (nvs->cellw-2)) & ~1,
+ (random() % (nvs->cellh-2)) & ~1,
+ 2, 2);
+ }
+
+ /* Randomize the grid
+ */
+ nvspatter (nvs->grid, nvs->rows, nvs->cols, nvs->ncolors,
+ countof(nvs->bits), True);
+ for (i = 0; i < 20; i++)
+ nvspatter (nvs->grid, nvs->rows, nvs->cols, nvs->ncolors,
+ countof(nvs->bits), False);
+
+ return bst;
+}
+
+
+/*
+ * Simulate various Apple ][ crashes. The memory map encouraged many programs
+ * to use the primary hi-res video page for various storage, and the secondary
+ * hi-res page for active display. When it crashed into Applesoft or the
+ * monitor, it would revert to the primary page and you'd see memory garbage on
+ * the screen. Also, it was common for copy-protected games to use the primary
+ * text page for important code, because that made it really hard to
+ * reverse-engineer them. The result often looked like what this generates.
+ *
+ * The Apple ][ logic and video hardware is in apple2.c. The TV is emulated by
+ * analogtv.c for maximum realism
+ *
+ * Trevor Blackwell <tlb@tlb.org>
+ */
+
+static const char * const apple2_basic_errors[]={
+ "BREAK",
+ "NEXT WITHOUT FOR",
+ "SYNTAX ERROR",
+ "RETURN WITHOUT GOSUB",
+ "ILLEGAL QUANTITY",
+ "OVERFLOW",
+ "OUT OF MEMORY",
+ "BAD SUBSCRIPT ERROR",
+ "DIVISION BY ZERO",
+ "STRING TOO LONG",
+ "FORMULA TOO COMPLEX",
+ "UNDEF'D FUNCTION",
+ "OUT OF DATA"
+#if 0
+ ,
+ "DEFAULT ARGUMENTS ARE NOT ALLOWED IN DECLARATION OF FRIEND "
+ "TEMPLATE SPECIALIZATION"
+#endif
+
+};
+static const char * const apple2_dos_errors[]={
+ "VOLUME MISMATCH",
+ "I/O ERROR",
+ "DISK FULL",
+ "NO BUFFERS AVAILABLE",
+ "PROGRAM TOO LARGE",
+};
+
+static void a2controller_crash(apple2_sim_t *sim, int *stepno,
+ double *next_actiontime)
+{
+ apple2_state_t *st=sim->st;
+ char *s;
+ int i;
+
+ struct mydata {
+ int fillptr;
+ int fillbyte;
+ } *mine;
+
+ if (!sim->controller_data)
+ sim->controller_data = calloc(sizeof(struct mydata),1);
+ mine=(struct mydata *) sim->controller_data;
+
+ switch(*stepno) {
+ case 0:
+
+ a2_init_memory_active(sim);
+ sim->dec->powerup = 1000.0;
+
+ if (random()%3==0) {
+ st->gr_mode=0;
+ *next_actiontime+=0.4;
+ *stepno=100;
+ }
+ else if (random()%4==0) {
+ st->gr_mode=A2_GR_LORES;
+ if (random()%3==0) st->gr_mode |= A2_GR_FULL;
+ *next_actiontime+=0.4;
+ *stepno=100;
+ }
+ else if (random()%2==0) {
+ st->gr_mode=A2_GR_HIRES;
+ *stepno=300;
+ }
+ else {
+ st->gr_mode=A2_GR_HIRES;
+ *next_actiontime+=0.4;
+ *stepno=100;
+ }
+ break;
+
+ case 100:
+ /* An illegal instruction or a reset caused it to drop into the
+ assembly language monitor, where you could disassemble code & view
+ data in hex. */
+ if (random()%3==0) {
+ char ibytes[128];
+ char itext[128];
+ int addr=0xd000+random()%0x3000;
+ sprintf(ibytes,
+ "%02X",random()%0xff);
+ sprintf(itext,
+ "???");
+ sprintf(sim->printing_buf,
+ "\n\n"
+ "%04X: %-15s %s\n"
+ " A=%02X X=%02X Y=%02X S=%02X F=%02X\n"
+ "*",
+ addr,ibytes,itext,
+ random()%0xff, random()%0xff,
+ random()%0xff, random()%0xff,
+ random()%0xff);
+ sim->printing=sim->printing_buf;
+ a2_goto(st,23,1);
+ if (st->gr_mode) {
+ *stepno=180;
+ } else {
+ *stepno=200;
+ }
+ sim->prompt='*';
+ *next_actiontime += 2.0 + (random()%1000)*0.0002;
+ }
+ else {
+ /* Lots of programs had at least their main functionality in
+ Applesoft Basic, which had a lot of limits (memory, string
+ length, etc) and would sometimes crash unexpectedly. */
+ sprintf(sim->printing_buf,
+ "\n"
+ "\n"
+ "\n"
+ "?%s IN %d\n"
+ "\001]",
+ apple2_basic_errors[random() %
+ (sizeof(apple2_basic_errors)
+ /sizeof(char *))],
+ (1000*(random()%(random()%59+1)) +
+ 100*(random()%(random()%9+1)) +
+ 5*(random()%(random()%199+1)) +
+ 1*(random()%(random()%(random()%2+1)+1))));
+ sim->printing=sim->printing_buf;
+ a2_goto(st,23,1);
+ *stepno=110;
+ sim->prompt=']';
+ *next_actiontime += 2.0 + (random()%1000)*0.0002;
+ }
+ break;
+
+ case 110:
+ if (random()%3==0) {
+ /* This was how you reset the Basic interpreter. The sort of
+ incantation you'd have on a little piece of paper taped to the
+ side of your machine */
+ sim->typing="CALL -1370";
+ *stepno=120;
+ }
+ else if (random()%2==0) {
+ sim->typing="CATALOG\n";
+ *stepno=170;
+ }
+ else {
+ *next_actiontime+=1.0;
+ *stepno=999;
+ }
+ break;
+
+ case 120:
+ *stepno=130;
+ *next_actiontime += 0.5;
+ break;
+
+ case 130:
+ st->gr_mode=0;
+ a2_cls(st);
+ a2_goto(st,0,16);
+ for (s="APPLE ]["; *s; s++) a2_printc(st,*s);
+ a2_goto(st,23,0);
+ a2_printc(st,']');
+ *next_actiontime+=1.0;
+ *stepno=999;
+ break;
+
+ case 170:
+ if (random()%50==0) {
+ sprintf(sim->printing_buf,
+ "\nDISK VOLUME 254\n\n"
+ " A 002 HELLO\n"
+ "\n"
+ "]");
+ sim->printing=sim->printing_buf;
+ }
+ else {
+ sprintf(sim->printing_buf,"\n?%s\n]",
+ apple2_dos_errors[random()%
+ (sizeof(apple2_dos_errors) /
+ sizeof(char *))]);
+ sim->printing=sim->printing_buf;
+ }
+ *stepno=999;
+ *next_actiontime+=1.0;
+ break;
+
+ case 180:
+ if (random()%2==0) {
+ /* This was how you went back to text mode in the monitor */
+ sim->typing="FB4BG";
+ *stepno=190;
+ } else {
+ *next_actiontime+=1.0;
+ *stepno=999;
+ }
+ break;
+
+ case 190:
+ st->gr_mode=0;
+ a2_invalidate(st);
+ a2_printc(st,'\n');
+ a2_printc(st,'*');
+ *stepno=200;
+ *next_actiontime+=2.0;
+ break;
+
+ case 200:
+ /* This reset things into Basic */
+ if (random()%2==0) {
+ sim->typing="FAA6G";
+ *stepno=120;
+ }
+ else {
+ *stepno=999;
+ *next_actiontime+=sim->delay;
+ }
+ break;
+
+ case 300:
+ for (i=0; i<1500; i++) {
+ a2_poke(st, mine->fillptr, mine->fillbyte);
+ mine->fillptr++;
+ mine->fillbyte = (mine->fillbyte+1)&0xff;
+ }
+ *next_actiontime += 0.08;
+ /* When you hit c000, it changed video settings */
+ if (mine->fillptr>=0xc000) {
+ a2_invalidate(st);
+ st->gr_mode=0;
+ }
+ /* And it seemed to reset around here, I dunno why */
+ if (mine->fillptr>=0xcf00) *stepno=130;
+ break;
+
+ case 999:
+ break;
+
+ case A2CONTROLLER_FREE:
+ free(mine);
+ mine = 0;
+ break;
+ }
+}
+
+static int
+a2_draw (struct bsod_state *bst)
+{
+ apple2_sim_t *sim = (apple2_sim_t *) bst->closure;
+ if (! sim) {
+ sim = apple2_start (bst->dpy, bst->window, 9999999, a2controller_crash);
+ bst->closure = sim;
+ }
+
+ if (! apple2_one_frame (sim)) {
+ bst->closure = 0;
+ }
+
+ return 10000;
+}
+
+static void
+a2_free (struct bsod_state *bst)
+{
+ apple2_sim_t *sim = (apple2_sim_t *) bst->closure;
+ if (sim) {
+ sim->stepno = A2CONTROLLER_DONE;
+ a2_draw (bst); /* finish up */
+ if (bst->closure) abort(); /* should have been freed by now */
+ }
+}
+
+
+static struct bsod_state *
+apple2crash (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "apple2", "Apple2");
+ bst->draw_cb = a2_draw;
+ bst->free_cb = a2_free;
+ return bst;
+}
+
+
+static void
+a2controller_ransomware(apple2_sim_t *sim, int *stepno,
+ double *next_actiontime)
+{
+ apple2_state_t *st=sim->st;
+
+ struct mydata {
+ const char *str;
+ Bool bold_p;
+ } *mine;
+
+ if (!sim->controller_data)
+ sim->controller_data = calloc(sizeof(struct mydata),1);
+ mine=(struct mydata *) sim->controller_data;
+
+ switch(*stepno) {
+ case 0:
+
+ st->gr_mode |= A2_GR_FULL;
+ a2_cls(st);
+ a2_goto(st,0,16);
+ a2_prints(st, "APPLE ][");
+ a2_goto(st,2,0);
+ *stepno = 10;
+ *next_actiontime += 2;
+ break;
+
+ case 10:
+ a2_prints(st, "READY\n\n");
+ *stepno = 11;
+ *next_actiontime += 1;
+ break;
+
+ case 11:
+ a2_goto(st, 1, 0);
+ *stepno = 12;
+ mine->str =
+ ("\n"
+ " _____________________________________\n"
+ "/ \\\n"
+ "! OOPS YOUR FILES HAVE BEEN ENCRYPTED !\n"
+ "! ________________________ !\n"
+ "! ! ! !\n"
+ "! [/--\\] ! [ WHAT HAPPENED TO MY ] ! !\n"
+ "! [!] [!] ! [ COMPUTER? ] ! !\n"
+ "! [!] [!] ! ! !\n"
+ "! [######] ! [ CAN I RECOVER MY ] ! !\n"
+ "! [######] ! [ FILES? ] ! !\n"
+ "! [######] ! ! !\n"
+ "! [######] ! [ HOW DO I PAY? ] ! !\n"
+ "! ! ! !\n"
+ "! !________________________! !\n"
+ "! !\n"
+ "! BITCOIN ACCEPTED HERE !\n"
+ "\\_____________________________________/\n"
+ "\n"
+ "\n"
+ "WAITING FOR BLOCKCHAIN..@\n"
+ "\n"
+ "PLEASE INSERT NEXT FLOPPY: "
+ );
+ break;
+
+ case 12:
+ {
+ char c = *mine->str;
+ mine->str++;
+
+ if (c == 0)
+ {
+ *next_actiontime += 30;
+ *stepno = 0;
+ }
+ else if (c == '[')
+ mine->bold_p++;
+ else if (c == ']')
+ mine->bold_p--;
+ else
+ {
+ if (c == '@')
+ {
+ c = '.';
+ *next_actiontime += 2;
+ }
+
+ if (mine->bold_p)
+ c |= 0xC0;
+ a2_printc_noscroll(st, c);
+ if (c == '.')
+ *next_actiontime += 1;
+ }
+ }
+ break;
+
+ case A2CONTROLLER_FREE:
+ return;
+ }
+}
+
+
+static int
+a2_ransomware_draw (struct bsod_state *bst)
+{
+ apple2_sim_t *sim = (apple2_sim_t *) bst->closure;
+ if (! sim) {
+ sim = apple2_start (bst->dpy, bst->window, 9999999,
+ a2controller_ransomware);
+ bst->closure = sim;
+ }
+
+ if (! apple2_one_frame (sim)) {
+ bst->closure = 0;
+ }
+
+ return 10000;
+}
+
+static struct bsod_state *
+apple2ransomware (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "apple2", "Apple2");
+ bst->draw_cb = a2_ransomware_draw;
+ bst->free_cb = a2_free;
+ return bst;
+}
+
+
+
+/* A crash spotted on a cash machine circa 2006, by jwz. I didn't note
+ what model it was; probably a Tranax Mini-Bank 1000 or similar vintage.
+ */
+static struct bsod_state *
+atm (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "atm", "ATM");
+
+ int pix_w, pix_h;
+ int x, y, i = 0;
+ float scale = 0.48;
+ Pixmap mask = 0;
+ Pixmap pixmap = image_data_to_pixmap (dpy, window,
+ atm_png, sizeof(atm_png),
+ &pix_w, &pix_h, &mask);
+
+ XClearWindow (dpy, window);
+
+ while (pix_w <= bst->xgwa.width * scale &&
+ pix_h <= bst->xgwa.height * scale)
+ {
+ pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
+ pixmap, pix_w, pix_h);
+ mask = double_pixmap (dpy, bst->xgwa.visual, 1, mask, pix_w, pix_h);
+ pix_w *= 2;
+ pix_h *= 2;
+ i++;
+ }
+
+ x = (bst->xgwa.width - pix_w) / 2;
+ y = (bst->xgwa.height - pix_h) / 2;
+ if (y < 0) y = 0;
+
+ if (i > 0)
+ {
+ int j;
+ XSetForeground (dpy, bst->gc,
+ get_pixel_resource (dpy, bst->xgwa.colormap,
+ "atm.background",
+ "ATM.Background"));
+ for (j = -1; j < pix_w; j += i+1)
+ XDrawLine (bst->dpy, pixmap, bst->gc, j, 0, j, pix_h);
+ for (j = -1; j < pix_h; j += i+1)
+ XDrawLine (bst->dpy, pixmap, bst->gc, 0, j, pix_w, j);
+ }
+
+ XSetClipMask (dpy, bst->gc, mask);
+ XSetClipOrigin (dpy, bst->gc, x, y);
+ XCopyArea (dpy, pixmap, window, bst->gc, 0, 0, pix_w, pix_h, x, y);
+
+ XFreePixmap (dpy, pixmap);
+ XFreePixmap (dpy, mask);
+
+ return bst;
+}
+
+
+/* An Android phone boot loader, by jwz.
+ */
+static struct bsod_state *
+android (Display *dpy, Window window)
+{
+ struct bsod_state *bst = make_bsod_state (dpy, window, "android", "Android");
+
+ unsigned long bg = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "android.background",
+ "Android.Background");
+ unsigned long fg = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "android.foreground",
+ "Android.Foreground");
+ unsigned long c1 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "android.color1",
+ "Android.Foreground");
+ unsigned long c2 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "android.color2",
+ "Android.Foreground");
+ unsigned long c3 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "android.color3",
+ "Android.Foreground");
+ unsigned long c4 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "android.color4",
+ "Android.Foreground");
+ unsigned long c5 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "android.color5",
+ "Android.Foreground");
+ unsigned long c6 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "android.color6",
+ "Android.Foreground");
+ unsigned long c7 = get_pixel_resource (dpy, bst->xgwa.colormap,
+ "android.color7",
+ "Android.Foreground");
+
+ const char *lines0[] = {
+ "Calculating... please wait\n",
+ "osbl: 0x499DF907\n",
+ "amss: 0x73162409\n",
+ "hboot: 0xE46C3327\n",
+ "boot: 0xBA570E7A\n",
+ "recovery: 0xC8BBA213\n",
+ "system: 0x87C3B1F0\n",
+ "\n",
+ "Press power key to go back.\n",
+ };
+
+ const char *lines1[] = {
+ "Checking SD card update...\n",
+ "",
+ " SD Checking...\n",
+ " Failed to open zipfile\n",
+ " loading preload_content...\n",
+ " [Caution] Preload Content Not Found\n",
+ " loading HTCUpdateZipName image...\n",
+ "",
+ " Checking...[PG46IMG.zip]\n",
+ "Please plug off USB\n",
+ };
+
+ const char *lines2[] = {
+ " SD Checking...\n",
+ " Loading...[PK76DIAG.zip]\n",
+ " No image!\n",
+ " Loading...[PK76DIAG.nbh]\n",
+ " No image or wrong image!\n",
+ " Loading...[PK76IMG.zip]\n",
+ " No image!\n",
+ " Loading...[PK76IMG.nbh]\n",
+ " No image or wrong image!\n",
+ " Loading...[PK76IMG.tar]\n",
+ " No image!\n",
+ " Loading...[PK76IMG.aes]\n",
+ " No image!\n",
+ " Loading...[PK76IMG.enc]\n",
+ " No image!\n",
+ };
+
+ int cw = (bst->font->per_char
+ ? bst->font->per_char['n'-bst->font->min_char_or_byte2].width
+ : bst->font->min_bounds.width);
+ int line_height = bst->font->ascent + bst->font->descent;
+
+ int state = 0;
+
+ Pixmap pixmap = 0, mask = 0;
+ int pix_w = 0, pix_h = 0;
+
+ pixmap = image_data_to_pixmap (dpy, window,
+ android_png, sizeof(android_png),
+ &pix_w, &pix_h, &mask);
+ if (! pixmap) abort();
+ {
+ int i, n = 0;
+ if (bst->xgwa.width > 2560) n++; /* Retina displays */
+ for (i = 0; i < n; i++)
+ {
+ pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth,
+ pixmap, pix_w, pix_h);
+ mask = double_pixmap (dpy, bst->xgwa.visual, 1,
+ mask, pix_w, pix_h);
+ pix_w *= 2;
+ pix_h *= 2;
+ }
+ }
+ bst->pixmap = pixmap;
+ bst->mask = mask;
+
+ bst->left_margin = (bst->xgwa.width - (cw * 40)) / 2;
+ if (bst->left_margin < 0) bst->left_margin = 0;
+
+ while (1) {
+ unsigned long delay =
+ ((state == 0 ||
+ state == countof(lines0) ||
+ state == countof(lines0) + countof(lines1) ||
+ state == countof(lines0) + countof(lines1) + countof(lines2))
+ ? 10000 : 0);
+ BSOD_LINE_DELAY (bst, delay);
+
+ if (state <= countof(lines0) + countof(lines1) + countof(lines2))
+ {
+ BSOD_COLOR (bst, bg, bg);
+ BSOD_RECT (bst, True, 0, 0, bst->xgwa.width, bst->xgwa.height);
+ BSOD_COLOR (bst, bg, c1);
+ BSOD_MOVETO (bst, bst->left_margin + bst->xoff,
+ bst->top_margin + bst->yoff + line_height);
+ BSOD_TEXT (bst, LEFT, "*** UNLOCKED ***\n");
+ BSOD_COLOR (bst, c2, bg);
+ BSOD_TEXT (bst, LEFT,
+ "PRIMOU PVT SHIP S-OFF RL\n"
+ "HBOOT-1.17.0000\n"
+ "CPLD-None\n"
+ "MICROP-None\n"
+ "RADIO-3831.17.00.23_2\n"
+ "eMMC-bootmode: disabled\n"
+ "CPU-bootmode : disabled\n"
+ "HW Secure boot: enabled\n"
+ "MODEM PATH : OFF\n"
+ "May 15 2012, 10:28:15\n"
+ "\n");
+ BSOD_COLOR (bst, bg, c3);
+
+ if (pixmap)
+ {
+ int x = (bst->xgwa.width - pix_w) / 2;
+ int y = bst->xgwa.height - bst->yoff - pix_h;
+ BSOD_PIXMAP (bst, 0, 0, pix_w, pix_h, x, y);
+ }
+ }
+
+ if (state == countof(lines0) ||
+ state == countof(lines0) + countof(lines1) ||
+ state == countof(lines0) + countof(lines1) + countof(lines2))
+ {
+ BSOD_TEXT (bst, LEFT, "HBOOT USB\n");
+ BSOD_COLOR (bst, c4, bg);
+ BSOD_TEXT (bst, LEFT,
+ "\n"
+ "<VOL UP> to previous item\n"
+ "<VOL DOWN> to next item\n"
+ "<POWER> to select item\n"
+ "\n");
+ BSOD_COLOR (bst, c5, bg); BSOD_TEXT (bst, LEFT, "FASTBOOT\n");
+ BSOD_COLOR (bst, c6, bg); BSOD_TEXT (bst, LEFT, "RECOVERY\n");
+ BSOD_COLOR (bst, c7, bg); BSOD_TEXT (bst, LEFT, "FACTORY RESET\n");
+ BSOD_COLOR (bst, c3, bg); BSOD_TEXT (bst, LEFT, "SIMLOCK\n");
+ BSOD_COLOR (bst, bg, c3); BSOD_TEXT (bst, LEFT, "HBOOT USB\n");
+ BSOD_COLOR (bst, fg, bg); BSOD_TEXT (bst, LEFT, "IMAGE CRC\n");
+ BSOD_COLOR (bst, c3, bg); BSOD_TEXT (bst, LEFT, "SHOW BARCODE\n");
+ BSOD_PAUSE (bst, 3000000);
+ }
+ else if (state < countof(lines0))
+ {
+ BSOD_TEXT (bst, LEFT, "IMAGE CRC\n\n");
+ BSOD_COLOR (bst, c5, bg);
+ {
+ int i;
+ for (i = 0; i <= state; i++) {
+ const char *s = lines0[i];
+ BSOD_COLOR (bst, (strchr(s, ':') ? c7 : c3), bg);
+ BSOD_TEXT (bst, LEFT, s);
+ }
+ }
+ BSOD_PAUSE (bst, 500000);
+ if (state == countof(lines0)-1)
+ BSOD_PAUSE (bst, 2000000);
+ }
+ else if (state < countof(lines0) + countof(lines1))
+ {
+ BSOD_TEXT (bst, LEFT, "HBOOT\n\n");
+ BSOD_COLOR (bst, c5, bg);
+ {
+ int i;
+ for (i = countof(lines0); i <= state; i++) {
+ const char *s = lines1[i - countof(lines0)];
+ BSOD_COLOR (bst, (*s == ' ' ? c6 : c3), bg);
+ BSOD_TEXT (bst, LEFT, s);
+ }
+ }
+ BSOD_PAUSE (bst, 500000);
+ if (state == countof(lines0) + countof(lines1) - 1)
+ BSOD_PAUSE (bst, 2000000);
+ }
+ else if (state < countof(lines0) + countof(lines1) + countof(lines2))
+ {
+ BSOD_TEXT (bst, LEFT, "HBOOT USB\n\n");
+ BSOD_COLOR (bst, c5, bg);
+ {
+ int i;
+ for (i = countof(lines0) + countof(lines1); i <= state; i++) {
+ const char *s = lines2[i - countof(lines0) - countof(lines1)];
+ BSOD_COLOR (bst, (*s == ' ' ? c6 : c3), bg);
+ BSOD_TEXT (bst, LEFT, s);
+ }
+ }
+ BSOD_PAUSE (bst, 500000);
+ if (state == countof(lines0) + countof(lines1) + countof(lines2)-1)
+ BSOD_PAUSE (bst, 2000000);
+ }
+ else
+ break;
+
+ state++;
+ }
+
+ XClearWindow (dpy, window);
+
+ return bst;
+}
+
+
+
+
+/*****************************************************************************
+ *****************************************************************************/
+
+
+static const struct {
+ const char *name;
+ struct bsod_state * (*fn) (Display *, Window);
+} all_modes[] = {
+ { "Windows", windows_31 },
+ { "NT", windows_nt },
+ { "Win2K", windows_other },
+ { "Win10", windows_10 },
+ { "Ransomware", windows_ransomware },
+ { "Amiga", amiga },
+ { "Mac", mac },
+ { "MacsBug", macsbug },
+ { "Mac1", mac1 },
+ { "MacX", macx },
+ { "SCO", sco },
+ { "HVX", hvx },
+ { "HPPALinux", hppa_linux },
+ { "SparcLinux", sparc_linux },
+ { "BSD", bsd },
+ { "Atari", atari },
+#ifndef HAVE_JWXYZ
+ { "BlitDamage", blitdamage },
+#endif
+ { "Solaris", sparc_solaris },
+ { "Linux", linux_fsck },
+ { "HPUX", hpux },
+ { "OS390", os390 },
+ { "Tru64", tru64 },
+ { "VMS", vms },
+ { "OS2", os2 },
+ { "MSDOS", msdos },
+ { "Nvidia", nvidia },
+ { "Apple2", apple2crash },
+ { "ATM", atm },
+ { "GLaDOS", glados },
+ { "Android", android },
+ { "VMware", vmware },
+};
+
+
+struct driver_state {
+ const char *name;
+ int only, which, next_one;
+ int mode_duration;
+ int delay_remaining;
+ time_t start;
+ Bool debug_p, cycle_p;
+ struct bsod_state *bst;
+};
+
+
+static void
+hack_title (struct driver_state *dst)
+{
+# ifndef HAVE_JWXYZ
+ char *oname = 0;
+ XFetchName (dst->bst->dpy, dst->bst->window, &oname);
+ if (oname && !strncmp (oname, "BSOD: ", 6)) {
+ char *tail = oname + 4;
+ char *s = strchr (tail+1, ':');
+ char *nname;
+ if (s) tail = s;
+ nname = malloc (strlen (tail) + strlen (dst->name) + 20);
+ sprintf (nname, "BSOD: %s%s", dst->name, tail);
+ XStoreName (dst->bst->dpy, dst->bst->window, nname);
+ free (nname);
+ }
+# endif /* !HAVE_JWXYZ */
+}
+
+static void *
+bsod_init (Display *dpy, Window window)
+{
+ struct driver_state *dst = (struct driver_state *) calloc (1, sizeof(*dst));
+ char *s;
+
+ dst->mode_duration = get_integer_resource (dpy, "delay", "Integer");
+ if (dst->mode_duration < 3) dst->mode_duration = 3;
+
+ dst->debug_p = get_boolean_resource (dpy, "debug", "Boolean");
+
+ dst->only = -1;
+ dst->next_one = -1;
+ s = get_string_resource(dpy, "doOnly", "DoOnly");
+ if (s && !strcasecmp (s, "cycle"))
+ {
+ dst->which = -1;
+ dst->cycle_p = True;
+ }
+ else if (s && *s)
+ {
+ int count = countof(all_modes);
+ for (dst->only = 0; dst->only < count; dst->only++)
+ if (!strcasecmp (s, all_modes[dst->only].name))
+ break;
+ if (dst->only >= count)
+ {
+ fprintf (stderr, "%s: unknown -only mode: \"%s\"\n", progname, s);
+ dst->only = -1;
+ }
+ }
+ if (s) free (s);
+
+ dst->name = "none";
+ dst->which = -1;
+ return dst;
+}
+
+
+static unsigned long
+bsod_draw (Display *dpy, Window window, void *closure)
+{
+ struct driver_state *dst = (struct driver_state *) closure;
+ time_t now;
+ int time_left;
+
+ AGAIN:
+ now = time ((time_t *) 0);
+ time_left = dst->start + dst->mode_duration - now;
+
+ if (dst->bst && dst->bst->img_loader) /* still loading */
+ {
+ dst->bst->img_loader =
+ load_image_async_simple (dst->bst->img_loader, 0, 0, 0, 0, 0);
+ return 100000;
+ }
+
+ DELAY_NOW:
+ /* Rather than returning a multi-second delay from the draw() routine,
+ meaning "don't call us again for N seconds", we quantize that down
+ to 1/10th second intervals so that it's more responsive to
+ rotate/reshape events.
+ */
+ if (dst->delay_remaining)
+ {
+ int inc = 10000;
+ int this_delay = MIN (dst->delay_remaining, inc);
+ dst->delay_remaining = MAX (0, dst->delay_remaining - inc);
+ return this_delay;
+ }
+
+ if (! dst->bst && time_left > 0) /* run completed; wait out the delay */
+ {
+ if (dst->debug_p)
+ fprintf (stderr, "%s: %s: %d left\n", progname, dst->name, time_left);
+ dst->start = 0;
+ if (time_left > 5) time_left = 5; /* Boooored now */
+ dst->delay_remaining = 1000000 * time_left;
+ }
+
+ else if (dst->bst) /* sub-mode currently running */
+ {
+ int this_delay = -1;
+
+ if (time_left > 0)
+ this_delay = bsod_pop (dst->bst);
+
+ /* XSync (dpy, False); slows down char drawing too much on HAVE_JWXYZ */
+
+ if (this_delay == 0)
+ goto AGAIN; /* no delay, not expired: stay here */
+ else if (this_delay >= 0)
+ {
+ dst->delay_remaining = this_delay; /* return; time to sleep */
+ goto DELAY_NOW;
+ }
+ else
+ { /* sub-mode run completed or expired */
+ if (dst->debug_p)
+ fprintf (stderr, "%s: %s: done\n", progname, dst->name);
+ free_bsod_state (dst->bst);
+ dst->bst = 0;
+ return 0;
+ }
+ }
+ else /* launch a new sub-mode */
+ {
+ if (dst->next_one >= 0)
+ dst->which = dst->next_one, dst->next_one = -1;
+ else if (dst->cycle_p)
+ dst->which = (dst->which + 1) % countof(all_modes);
+ else if (dst->only >= 0)
+ dst->which = dst->only;
+ else
+ {
+ int count = countof(all_modes);
+ int *enabled = (int *) calloc (sizeof(*enabled), count + 1);
+ int nenabled = 0;
+ int i;
+
+ for (i = 0; i < count; i++)
+ {
+ char name[100], class[100];
+ sprintf (name, "do%s", all_modes[i].name);
+ sprintf (class, "Do%s", all_modes[i].name);
+ if (get_boolean_resource (dpy, name, class))
+ enabled[nenabled++] = i;
+ }
+
+ if (nenabled == 0)
+ {
+ fprintf (stderr, "%s: no display modes enabled?\n", progname);
+ /* exit (-1); */
+ dst->which = dst->only = 0;
+ }
+ else if (nenabled == 1)
+ dst->which = enabled[0];
+ else
+ {
+ i = dst->which;
+ while (i == dst->which)
+ i = enabled[random() % nenabled];
+ dst->which = i;
+ }
+ free (enabled);
+ }
+
+ if (dst->debug_p)
+ fprintf (stderr, "%s: %s: launch\n", progname,
+ all_modes[dst->which].name);
+
+ /* Run the mode setup routine...
+ */
+ if (dst->bst) abort();
+ dst->name = all_modes[dst->which].name;
+ dst->bst = all_modes[dst->which].fn (dpy, window);
+ dst->start = (dst->bst ? time ((time_t *) 0) : 0);
+
+ /* Reset the structure run state to the beginning,
+ and do some sanitization of the cursor position
+ before the first run.
+ */
+ if (dst->bst)
+ {
+ if (dst->debug_p)
+ fprintf (stderr, "%s: %s: queue size: %d (%d)\n", progname,
+ dst->name, dst->bst->pos, dst->bst->queue_size);
+
+ hack_title (dst);
+ dst->bst->pos = 0;
+ dst->bst->x = dst->bst->current_left =
+ dst->bst->left_margin + dst->bst->xoff;
+
+ if (dst->bst->y <
+ dst->bst->top_margin + dst->bst->yoff + dst->bst->font->ascent)
+ dst->bst->y =
+ dst->bst->top_margin + dst->bst->yoff + dst->bst->font->ascent;
+ }
+ }
+
+ return 0;
+}
+
+
+static void
+bsod_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct driver_state *dst = (struct driver_state *) closure;
+
+ if (dst->bst &&
+ w == dst->bst->xgwa.width &&
+ h == dst->bst->xgwa.height)
+ return;
+
+ if (dst->debug_p)
+ fprintf (stderr, "%s: %s: reshape reset\n", progname, dst->name);
+
+ /* just restart this mode and restart when the window is resized. */
+ if (dst->bst)
+ free_bsod_state (dst->bst);
+ dst->bst = 0;
+ dst->start = 0;
+ dst->delay_remaining = 0;
+ dst->next_one = dst->which;
+ dst->name = "none";
+ XClearWindow (dpy, window);
+}
+
+
+static Bool
+bsod_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct driver_state *dst = (struct driver_state *) closure;
+ Bool reset_p = False;
+
+ /* pick a new mode and restart when mouse clicked, or certain keys typed. */
+
+ if (screenhack_event_helper (dpy, window, event))
+ reset_p = True;
+
+ if (reset_p)
+ {
+ if (dst->debug_p)
+ fprintf (stderr, "%s: %s: manual reset\n", progname, dst->name);
+ if (dst->bst)
+ free_bsod_state (dst->bst);
+ dst->bst = 0;
+ dst->start = 0;
+ dst->delay_remaining = 0;
+ dst->name = "none";
+ XClearWindow (dpy, window);
+ return True;
+ }
+ else
+ return False;
+}
+
+
+static void
+bsod_free (Display *dpy, Window window, void *closure)
+{
+ struct driver_state *dst = (struct driver_state *) closure;
+ if (dst->bst)
+ free_bsod_state (dst->bst);
+ free (dst);
+}
+
+
+static const char *bsod_defaults [] = {
+ "*delay: 45",
+ "*debug: False",
+
+ "*doOnly: ",
+ "*doWindows: True",
+ "*doNT: True",
+ "*doWin2K: True",
+ "*doWin10: True",
+ "*doRansomware: True",
+ "*doAmiga: True",
+ "*doMac: True",
+ "*doMacsBug: True",
+ "*doMac1: True",
+ "*doMacX: True",
+ "*doSCO: True",
+ "*doAtari: False", /* boring */
+ "*doBSD: False", /* boring */
+ "*doLinux: True",
+ "*doSparcLinux: False", /* boring */
+ "*doHPPALinux: True",
+ "*doBlitDamage: True",
+ "*doSolaris: True",
+ "*doHPUX: True",
+ "*doTru64: True",
+ "*doApple2: True",
+ "*doOS390: True",
+ "*doVMS: True",
+ "*doHVX: True",
+ "*doMSDOS: True",
+ "*doOS2: True",
+ "*doNvidia: True",
+ "*doATM: True",
+ "*doGLaDOS: True",
+ "*doAndroid: True",
+ "*doVMware: True",
+
+ ".foreground: White",
+ ".background: Black",
+
+ ".windows.foreground: White",
+ ".windows.background: #0000AA", /* EGA color 0x01. */
+
+ ".nt.foreground: White",
+ ".nt.background: #0000AA", /* EGA color 0x01. */
+
+ ".windowslh.foreground: White",
+ ".windowslh.background: #AA0000", /* EGA color 0x04. */
+ ".windowslh.background2: #AAAAAA", /* EGA color 0x07. */
+
+ ".win10.foreground: White",
+ ".win10.background: #1070AA",
+
+ ".ransomware.foreground: White",
+ ".ransomware.background: #841212",
+ ".ransomware.foreground2: Black", /* ransom note */
+ ".ransomware.background2: White",
+ ".ransomware.foreground3: Black", /* buttons */
+ ".ransomware.background3: #AAAAAA",
+ ".ransomware.link: #7BF9F6",
+ ".ransomware.timerheader: #BDBE02",
+
+
+ ".glaDOS.foreground: White",
+ ".glaDOS.background: #0000AA", /* EGA color 0x01. */
+
+ ".amiga.foreground: #FF0000",
+ ".amiga.background: Black",
+ ".amiga.background2: White",
+
+ ".mac.foreground: #FFFFFF",
+ ".mac.background: Black",
+
+ ".atari.foreground: Black",
+ ".atari.background: White",
+
+ ".macsbug.foreground: Black",
+ ".macsbug.background: White",
+ ".macsbug.borderColor: #AAAAAA",
+
+ ".mac1.foreground: Black",
+ ".mac1.background: White",
+
+ ".macx.foreground: White",
+ ".macx.textForeground: White",
+ ".macx.textBackground: Black",
+ ".macx.background: #888888",
+
+ ".macinstall.barForeground: #C0C0C0",
+ ".macinstall.barBackground: #888888",
+
+ ".sco.foreground: White",
+ ".sco.background: Black",
+
+ ".hvx.foreground: White",
+ ".hvx.background: Black",
+
+ ".linux.foreground: White",
+ ".linux.background: Black",
+
+ ".hppalinux.foreground: White",
+ ".hppalinux.background: Black",
+
+ ".sparclinux.foreground: White",
+ ".sparclinux.background: Black",
+
+ ".bsd.foreground: #c0c0c0",
+ ".bsd.background: Black",
+
+ ".solaris.foreground: Black",
+ ".solaris.background: White",
+
+ ".hpux.foreground: White",
+ ".hpux.background: Black",
+
+ ".os390.background: Black",
+ ".os390.foreground: Red",
+
+ ".tru64.foreground: White",
+ ".tru64.background: #0000AA", /* EGA color 0x01. */
+
+ ".vms.foreground: White",
+ ".vms.background: Black",
+
+ ".msdos.foreground: White",
+ ".msdos.background: Black",
+
+ ".os2.foreground: White",
+ ".os2.background: Black",
+
+ ".atm.foreground: Black",
+ ".atm.background: #FF6600",
+
+ ".android.foreground: Black",
+ ".android.background: White",
+ ".android.color1: #AA00AA", /* violet */
+ ".android.color2: #336633", /* green1 */
+ ".android.color3: #0000FF", /* blue */
+ ".android.color4: #CC7744", /* orange */
+ ".android.color5: #99AA55", /* green2 */
+ ".android.color6: #66AA33", /* green3 */
+ ".android.color7: #FF0000", /* red */
+
+ ".vmware.foreground: White",
+ ".vmware.foreground2: Yellow",
+ ".vmware.background: #a700a8", /* purple */
+
+ "*dontClearRoot: True",
+
+ ANALOGTV_DEFAULTS
+
+#ifdef HAVE_XSHM_EXTENSION
+ "*useSHM: True",
+#endif
+
+ "*fontB: ",
+ "*fontC: ",
+
+# if defined(USE_IPHONE)
+
+ "*font: PxPlus IBM VGA8 16, Courier-Bold 14",
+ "*bigFont: ",
+
+ ".mac.font: Courier-Bold 18",
+ ".macsbug.font: Courier-Bold 8",
+ ".macx.font: Courier-Bold 14",
+ ".macdisk.font: Courier-Bold 14",
+ ".macinstall.font: Helvetica 12, Arial 12",
+ ".macinstall.bigFont: Helvetica 12, Arial 12",
+ ".msdos.font: PxPlus IBM VGA8 32, Courier-Bold 28",
+ ".nt.font: PxPlus IBM VGA8 12, Courier-Bold 10",
+ ".win10.font: Arial 12, Helvetica 12",
+ ".win10.bigFont: Arial 12, Helvetica 12",
+ ".win10.fontB: Arial 50, Helvetica 50",
+ ".win10.fontC: Arial 9, Helvetica 9",
+
+ /* The real Solaris font is ../OSX/Gallant19.bdf but I don't know how
+ to convert that to a TTF, so let's use Luxi Mono instead. */
+ ".solaris.font: Luxi Mono 12, PxPlus IBM VGA8 12, Courier Bold 12",
+
+ /* "Arial" loads "ArialMT" but "Arial Bold" does not load "Arial-BoldMT"? */
+ ".ransomware.font: Arial 11, Helvetica 11",
+ ".ransomware.fontB: Arial 9, Helvetica 9",
+ ".ransomware.fontC: Arial Bold 11, Arial-BoldMT 11, Helvetica Bold 11",
+
+# elif defined(HAVE_ANDROID)
+
+ "*font: PxPlus IBM VGA8 16",
+ "*bigFont: ",
+
+ ".mac.font: -*-courier-bold-r-*-*-*-180-*-*-m-*-*-*",
+ ".macsbug.font: -*-courier-bold-r-*-*-*-80-*-*-m-*-*-*",
+ ".macx.font: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+ ".macdisk.font: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+ ".macinstall.font: -*-helvetica-medium-r-*-*-*-120-*-*-*-*-*-*",
+ ".macinstall.bigFont: -*-helvetica-medium-r-*-*-*-120-*-*-*-*-*-*",
+ ".msdos.font: PxPlus IBM VGA8 32",
+ ".nt.font: PxPlus IBM VGA8 12",
+ ".solaris.font: Luxi Mono 12, PxPlus IBM VGA8 12, Courier Bold 12",
+
+ ".win10.font: -*-helvetica-medium-r-*-*-*-120-*-*-*-*-*-*",
+ ".win10.bigFont: -*-helvetica-medium-r-*-*-*-120-*-*-*-*-*-*",
+ ".win10.fontB: -*-helvetica-medium-r-*-*-*-500-*-*-*-*-*-*",
+ ".win10.fontC: -*-helvetica-medium-r-*-*-*-90-*-*-*-*-*-*",
+
+ ".ransomware.font: -*-helvetica-medium-r-*-*-*-100-*-*-*-*-*-*",
+ ".ransomware.fontB: -*-helvetica-medium-r-*-*-*-80-*-*-*-*-*-*",
+ ".ransomware.fontC: -*-helvetica-bold-r-*-*-*-100-*-*-*-*-*-*",
+
+# elif defined(HAVE_COCOA)
+
+ "*font: PxPlus IBM VGA8 8, Courier Bold 9",
+ "*bigFont: PxPlus IBM VGA8 32, Courier Bold 24",
+
+ ".mac.font: Monaco 10, Courier Bold 9",
+ ".mac.bigFont: Monaco 18, Courier Bold 18",
+
+ ".macsbug.font: Monaco 10, Courier Bold 9",
+ ".macsbug.bigFont: Monaco 24, Courier Bold 24",
+
+ ".macx.font: Courier Bold 9",
+ ".macx.bigFont: Courier Bold 14",
+ ".macdisk.font: Courier Bold 9",
+ ".macdisk.bigFont: Courier Bold 18",
+ ".macinstall.font: Helvetica 24, Arial 24",
+ ".macinstall.bigFont: Helvetica 24, Arial 24",
+
+ ".hvx.bigFont: PxPlus IBM VGA8 16, Courier Bold 14",
+ ".hppalinux.bigFont: PxPlus IBM VGA8 16, Courier Bold 14",
+ ".linux.bigFont: PxPlus IBM VGA8 16, Courier Bold 14",
+ ".hpux.bigFont: PxPlus IBM VGA8 16, Courier Bold 14",
+ ".msdos.font: PxPlus IBM VGA8 16, Courier Bold 14",
+ ".solaris.font: Luxi Mono 12, PxPlus IBM VGA8 12, Courier Bold 12",
+ ".solaris.bigFont: Luxi Mono 16, PxPlus IBM VGA8 16, Courier Bold 14",
+
+ ".win10.font: Arial 24, Helvetica 24",
+ ".win10.bigFont: Arial 24, Helvetica 24",
+ ".win10.fontB: Arial 100, Helvetica 100",
+ ".win10.fontC: Arial 16, Helvetica 16",
+
+ ".ransomware.font: Arial 24, Helvetica 24",
+ ".ransomware.bigFont: Arial 24, Helvetica 24",
+ ".ransomware.fontB: Arial 16, Helvetica 16",
+ ".ransomware.fontC: Arial Bold 24, Helvetica Bold 24",
+
+# else /* X11 */
+
+ "*font: 9x15bold",
+ "*bigFont: -*-courier-bold-r-*-*-*-180-*-*-m-*-*-*",
+
+ ".macsbug.font: -*-courier-medium-r-*-*-*-80-*-*-m-*-*-*",
+ ".macsbug.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+
+ ".macdisk.font: -*-courier-bold-r-*-*-*-80-*-*-m-*-*-*",
+ ".macdisk.bigFont: -*-courier-bold-r-*-*-*-100-*-*-m-*-*-*",
+ ".macinstall.font: -*-helvetica-medium-r-*-*-*-180-*-*-*-*-*-*",
+ ".macinstall.bigFont: -*-helvetica-medium-r-*-*-*-180-*-*-*-*-*-*",
+
+ ".sco.font: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+ ".hvx.font: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+ ".hppalinux.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+ ".sparclinux.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+
+ /* Some systems might have this, but I'm not sure where it comes from: */
+ /* ".bsd.font: -*-vga-normal-r-*-*-*-120-*-*-c-*-*-*", */
+ /* The fonts/misc/vga.pcf that comes with xdosemu has no XLFD name: */
+ ".bsd.font: vga",
+ ".bsd.bigFont: -*-vga-normal-r-*-*-*-220-*-*-c-*-*-*",
+
+ /* The original Solaris console font was:
+ -sun-gallant-demi-r-normal-*-*-140-*-*-c-*-*-*
+ Red Hat introduced Luxi Mono as its console font, which is similar
+ to Gallant. X.Org includes it but Debian and Fedora do not. */
+ ".solaris.font: -*-luxi mono-medium-r-normal--*-140-*-*-m-*-*-*",
+
+ ".hpux.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+ ".os390.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+ ".tru64.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+ ".vms.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+ ".msdos.bigFont: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+
+ ".win10.font: -*-helvetica-medium-r-*-*-*-180-*-*-*-*-*-*",
+ ".win10.bigFont: -*-helvetica-medium-r-*-*-*-180-*-*-*-*-*-*",
+ ".win10.fontB: -*-helvetica-medium-r-*-*-*-240-*-*-*-*-*-*",
+ ".win10.fontC: -*-helvetica-medium-r-*-*-*-140-*-*-*-*-*-*",
+
+ ".ransomware.font: -*-helvetica-medium-r-*-*-*-180-*-*-*-*-*-*",
+ ".ransomware.bigFont: -*-helvetica-medium-r-*-*-*-180-*-*-*-*-*-*",
+ ".ransomware.fontB: -*-helvetica-medium-r-*-*-*-140-*-*-*-*-*-*",
+ ".ransomware.fontC: -*-helvetica-bold-r-*-*-*-180-*-*-*-*-*-*",
+
+
+# endif /* X11 */
+
+ 0
+};
+
+static const XrmOptionDescRec bsod_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-only", ".doOnly", XrmoptionSepArg, 0 },
+ { "-debug", ".debug", XrmoptionNoArg, "True" },
+ { "-windows", ".doWindows", XrmoptionNoArg, "True" },
+ { "-no-windows", ".doWindows", XrmoptionNoArg, "False" },
+ { "-nt", ".doNT", XrmoptionNoArg, "True" },
+ { "-no-nt", ".doNT", XrmoptionNoArg, "False" },
+ { "-2k", ".doWin2K", XrmoptionNoArg, "True" },
+ { "-no-2k", ".doWin2K", XrmoptionNoArg, "False" },
+ { "-win10", ".doWin10", XrmoptionNoArg, "True" },
+ { "-no-win10", ".doWin10", XrmoptionNoArg, "False" },
+ { "-ransomware", ".doRansomware", XrmoptionNoArg, "True" },
+ { "-no-ransomware", ".doRansomware", XrmoptionNoArg, "False" },
+ { "-amiga", ".doAmiga", XrmoptionNoArg, "True" },
+ { "-no-amiga", ".doAmiga", XrmoptionNoArg, "False" },
+ { "-mac", ".doMac", XrmoptionNoArg, "True" },
+ { "-no-mac", ".doMac", XrmoptionNoArg, "False" },
+ { "-mac1", ".doMac1", XrmoptionNoArg, "True" },
+ { "-no-mac1", ".doMac1", XrmoptionNoArg, "False" },
+ { "-macx", ".doMacX", XrmoptionNoArg, "True" },
+ { "-no-macx", ".doMacX", XrmoptionNoArg, "False" },
+ { "-atari", ".doAtari", XrmoptionNoArg, "True" },
+ { "-no-atari", ".doAtari", XrmoptionNoArg, "False" },
+ { "-macsbug", ".doMacsBug", XrmoptionNoArg, "True" },
+ { "-no-macsbug", ".doMacsBug", XrmoptionNoArg, "False" },
+ { "-apple2", ".doApple2", XrmoptionNoArg, "True" },
+ { "-no-apple2", ".doApple2", XrmoptionNoArg, "False" },
+ { "-sco", ".doSCO", XrmoptionNoArg, "True" },
+ { "-no-sco", ".doSCO", XrmoptionNoArg, "False" },
+ { "-hvx", ".doHVX", XrmoptionNoArg, "True" },
+ { "-no-hvx", ".doHVX", XrmoptionNoArg, "False" },
+ { "-bsd", ".doBSD", XrmoptionNoArg, "True" },
+ { "-no-bsd", ".doBSD", XrmoptionNoArg, "False" },
+ { "-linux", ".doLinux", XrmoptionNoArg, "True" },
+ { "-no-linux", ".doLinux", XrmoptionNoArg, "False" },
+ { "-hppalinux", ".doHPPALinux", XrmoptionNoArg, "True" },
+ { "-no-hppalinux", ".doHPPALinux", XrmoptionNoArg, "False" },
+ { "-sparclinux", ".doSparcLinux", XrmoptionNoArg, "True" },
+ { "-no-sparclinux", ".doSparcLinux", XrmoptionNoArg, "False" },
+ { "-blitdamage", ".doBlitDamage", XrmoptionNoArg, "True" },
+ { "-no-blitdamage", ".doBlitDamage", XrmoptionNoArg, "False" },
+ { "-nvidia", ".doNvidia", XrmoptionNoArg, "True" },
+ { "-no-nvidia", ".doNvidia", XrmoptionNoArg, "False" },
+ { "-solaris", ".doSolaris", XrmoptionNoArg, "True" },
+ { "-no-solaris", ".doSolaris", XrmoptionNoArg, "False" },
+ { "-hpux", ".doHPUX", XrmoptionNoArg, "True" },
+ { "-no-hpux", ".doHPUX", XrmoptionNoArg, "False" },
+ { "-os390", ".doOS390", XrmoptionNoArg, "True" },
+ { "-no-os390", ".doOS390", XrmoptionNoArg, "False" },
+ { "-tru64", ".doHPUX", XrmoptionNoArg, "True" },
+ { "-no-tru64", ".doTru64", XrmoptionNoArg, "False" },
+ { "-vms", ".doVMS", XrmoptionNoArg, "True" },
+ { "-no-vms", ".doVMS", XrmoptionNoArg, "False" },
+ { "-msdos", ".doMSDOS", XrmoptionNoArg, "True" },
+ { "-no-msdos", ".doMSDOS", XrmoptionNoArg, "False" },
+ { "-os2", ".doOS2", XrmoptionNoArg, "True" },
+ { "-no-os2", ".doOS2", XrmoptionNoArg, "False" },
+ { "-atm", ".doATM", XrmoptionNoArg, "True" },
+ { "-no-atm", ".doATM", XrmoptionNoArg, "False" },
+ { "-glados", ".doGLaDOS", XrmoptionNoArg, "True" },
+ { "-no-glados", ".doGLaDOS", XrmoptionNoArg, "False" },
+ { "-android", ".doAndroid", XrmoptionNoArg, "True" },
+ { "-no-android", ".doAndroid", XrmoptionNoArg, "False" },
+ { "-vmware", ".doVMware", XrmoptionNoArg, "True" },
+ { "-no-vmware", ".doVMware", XrmoptionNoArg, "False" },
+ ANALOGTV_OPTIONS
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("BSOD", bsod)
diff --git a/hacks/bsod.man b/hacks/bsod.man
new file mode 100644
index 0000000..0043e7f
--- /dev/null
+++ b/hacks/bsod.man
@@ -0,0 +1,149 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "5-May-2004" "X Version 11"
+.SH NAME
+bsod - Blue Screen of Death emulator
+.SH SYNOPSIS
+.B bsod
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-visual \fIvisual\fP] [\-delay \fIseconds\fP]
+[\-fps]
+.SH DESCRIPTION
+The
+.I bsod
+program is the finest in personal computer emulation.
+.PP
+.I bsod
+steps through a set of screens, each one a recreation of a different failure
+mode of an operating system. Systems depicted include
+Windows 3.1, Windows 95, Windows NT, MS-DOS, AmigaDOS 1.3, Linux,
+SCO UNIX, BSD UNIX, HPUX, Solaris, Tru64, VMS, HVX/GCOS6, IBM OS/390, OS/2,
+MacOS (MacsBug, Bomb, Sad Mac, and OSX), Atari ST, Apple ][+, VMware and
+NCD X Terminals.
+.PP
+.SH OPTIONS
+.I bsod
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIdelay\fP
+The duration each crash-mode is displayed before selecting another.
+.TP 8
+.B \-only \fIwhich\fP
+Tell it to run only one mode, e.g., \fI\-only HPUX\fP.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH X RESOURCES
+Notable X resources supported include the following, which control which
+hacks are displayed and which aren't.
+.BR doWindows ,
+.BR doNT ,
+.BR doWin2K ,
+.BR doWin10 ,
+.BR doRansomware ,
+.BR doAmiga ,
+.BR doMac ,
+.BR doMac1 ,
+.BR doMacsBug ,
+.BR doMacX ,
+.BR doSCO ,
+.BR doAtari ,
+.BR doBSD ,
+.BR doLinux ,
+.BR doSparcLinux ,
+.BR doHPPALinux ,
+.BR doBlitDamage ,
+.BR doSolaris ,
+.BR doHPUX ,
+.BR doApple2 ,
+.BR doOS390 ,
+.BR doTru64 ,
+.BR doVMS ,
+.BR doMSDOS ,
+.BR doOS2 ,
+.BR doHVX ,
+.BR doVMware ,
+and
+.BR doATM .
+Each of these is a Boolean resource, they all default to true, except
+for doAtari, doBSD, doSparcLinux, and doHPPALinux, which are turned off
+by default, because they're really not all that interesting looking
+unless you're a fan of those systems.
+
+There are command-line options for all of these:
+e.g., \fI\-bsd\fP, \fI\-no-bsd\fP. (Also note the \fI\-only\fP option.)
+.SH BUGS
+Unlike the systems being simulated, \fIbsod\fP does not require a
+reboot after running.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR http://www.microsoft.com/ ,
+.BR http://www.apple.com/ ,
+.BR http://www.sco.com/ ,
+.BR http://www.kernel.org/ ,
+and
+.BR http://www.amiga.de/ .
+.SH TRADEMARKS
+Microsoft Windows, Microsoft Windows 95, and Microsoft Windows NT are all
+registered trademarks of Microsoft Corporation. Apple Macintosh is a
+registered trademark of Apple Computer. Amiga is a registered trademark of
+Amiga International, Inc. Solaris is a trademark of Sun Microsystems. HP-UX
+is a trademark of HP Hewlett Packard Group LLC. Nvidia is a tradmark of
+Nvidia Corporation. VMS is probably a trademark of Digital Equipment
+Corporation. Atari ST is probably a trademark, too, but it's hard to tell who
+owns it. SCO is probably still a trademark of somebody these days, I guess.
+Linux is a registered trademark of Linus Torvalds, but it isn't his
+fault. OS/2 is a registered trademark of International Business Machines
+Corporation. VMware is a registered trademark of VMware, Inc. Android is a
+trademark of Google LLC. GladOS is a trademark of Aperture Science
+Incorporated.
+.SH COPYRIGHT
+Copyright \(co 1998-2018 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty. No animals were harmed during the testing of
+these simulations. Always mount a scratch monkey.
+.SH AUTHOR
+Concept cribbed from Stephen Martin <smartin@mks.com>. This version is by
+Jamie Zawinski <jwz@jwz.org>, with contributions from many others.
diff --git a/hacks/bubbles-default.c b/hacks/bubbles-default.c
new file mode 100644
index 0000000..0e729d5
--- /dev/null
+++ b/hacks/bubbles-default.c
@@ -0,0 +1,154 @@
+/* bubbles_default.c - pick images for bubbles.c
+ * By Jamie Zawinski <jwz@jwz.org>, 20-Jan-98.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "bubbles.h"
+#include "yarandom.h"
+
+#ifndef NO_DEFAULT_BUBBLE
+
+# define BLOOD 0
+# include "images/gen/blood1_png.h"
+# include "images/gen/blood2_png.h"
+# include "images/gen/blood3_png.h"
+# include "images/gen/blood4_png.h"
+# include "images/gen/blood5_png.h"
+# include "images/gen/blood6_png.h"
+# include "images/gen/blood7_png.h"
+# include "images/gen/blood8_png.h"
+# include "images/gen/blood9_png.h"
+# include "images/gen/blood10_png.h"
+# include "images/gen/blood11_png.h"
+
+# define BLUE 1
+# include "images/gen/blue1_png.h"
+# include "images/gen/blue2_png.h"
+# include "images/gen/blue3_png.h"
+# include "images/gen/blue4_png.h"
+# include "images/gen/blue5_png.h"
+# include "images/gen/blue6_png.h"
+# include "images/gen/blue7_png.h"
+# include "images/gen/blue8_png.h"
+# include "images/gen/blue9_png.h"
+# include "images/gen/blue10_png.h"
+# include "images/gen/blue11_png.h"
+
+# define GLASS 2
+# include "images/gen/glass1_png.h"
+# include "images/gen/glass2_png.h"
+# include "images/gen/glass3_png.h"
+# include "images/gen/glass4_png.h"
+# include "images/gen/glass5_png.h"
+# include "images/gen/glass6_png.h"
+# include "images/gen/glass7_png.h"
+# include "images/gen/glass8_png.h"
+# include "images/gen/glass9_png.h"
+# include "images/gen/glass10_png.h"
+# include "images/gen/glass11_png.h"
+
+# define JADE 3
+# include "images/gen/jade1_png.h"
+# include "images/gen/jade2_png.h"
+# include "images/gen/jade3_png.h"
+# include "images/gen/jade4_png.h"
+# include "images/gen/jade5_png.h"
+# include "images/gen/jade6_png.h"
+# include "images/gen/jade7_png.h"
+# include "images/gen/jade8_png.h"
+# include "images/gen/jade9_png.h"
+# include "images/gen/jade10_png.h"
+# include "images/gen/jade11_png.h"
+
+# define END 4
+
+
+bubble_png default_bubbles[50];
+int num_default_bubbles;
+
+void init_default_bubbles(void)
+{
+ int i = 0;
+ switch (random() % END) {
+
+# define DEF(N,S) default_bubbles[i].png = N; default_bubbles[i].size = S; i++
+
+ case BLOOD:
+ DEF(blood1_png, sizeof(blood1_png));
+ DEF(blood2_png, sizeof(blood2_png));
+ DEF(blood3_png, sizeof(blood3_png));
+ DEF(blood4_png, sizeof(blood4_png));
+ DEF(blood5_png, sizeof(blood5_png));
+ DEF(blood6_png, sizeof(blood6_png));
+ DEF(blood7_png, sizeof(blood7_png));
+ DEF(blood8_png, sizeof(blood8_png));
+ DEF(blood9_png, sizeof(blood9_png));
+ DEF(blood10_png, sizeof(blood10_png));
+ DEF(blood11_png, sizeof(blood11_png));
+ break;
+
+ case BLUE:
+ DEF(blue1_png, sizeof(blue1_png));
+ DEF(blue2_png, sizeof(blue2_png));
+ DEF(blue3_png, sizeof(blue3_png));
+ DEF(blue4_png, sizeof(blue4_png));
+ DEF(blue5_png, sizeof(blue5_png));
+ DEF(blue6_png, sizeof(blue6_png));
+ DEF(blue7_png, sizeof(blue7_png));
+ DEF(blue8_png, sizeof(blue8_png));
+ DEF(blue9_png, sizeof(blue9_png));
+ DEF(blue10_png, sizeof(blue10_png));
+ DEF(blue11_png, sizeof(blue11_png));
+ break;
+
+ case GLASS:
+ DEF(glass1_png, sizeof(glass1_png));
+ DEF(glass2_png, sizeof(glass2_png));
+ DEF(glass3_png, sizeof(glass3_png));
+ DEF(glass4_png, sizeof(glass4_png));
+ DEF(glass5_png, sizeof(glass5_png));
+ DEF(glass6_png, sizeof(glass6_png));
+ DEF(glass7_png, sizeof(glass7_png));
+ DEF(glass8_png, sizeof(glass8_png));
+ DEF(glass9_png, sizeof(glass9_png));
+ DEF(glass10_png, sizeof(glass10_png));
+ DEF(glass11_png, sizeof(glass11_png));
+ break;
+
+ case JADE:
+ DEF(jade1_png, sizeof(jade1_png));
+ DEF(jade2_png, sizeof(jade2_png));
+ DEF(jade3_png, sizeof(jade3_png));
+ DEF(jade4_png, sizeof(jade4_png));
+ DEF(jade5_png, sizeof(jade5_png));
+ DEF(jade6_png, sizeof(jade6_png));
+ DEF(jade7_png, sizeof(jade7_png));
+ DEF(jade8_png, sizeof(jade8_png));
+ DEF(jade9_png, sizeof(jade9_png));
+ DEF(jade10_png, sizeof(jade10_png));
+ DEF(jade11_png, sizeof(jade11_png));
+ break;
+
+ default:
+ abort();
+ break;
+ }
+
+ default_bubbles[i].png = 0;
+ num_default_bubbles = i;
+}
+
+#endif /* NO_DEFAULT_BUBBLE */
diff --git a/hacks/bubbles.c b/hacks/bubbles.c
new file mode 100644
index 0000000..9cb2678
--- /dev/null
+++ b/hacks/bubbles.c
@@ -0,0 +1,1437 @@
+/* bubbles.c - frying pan / soft drink in a glass simulation */
+
+/*$Id: bubbles.c,v 1.30 2008/07/31 19:27:48 jwz Exp $*/
+
+/*
+ * Copyright (C) 1995-1996 James Macnicol
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/*
+ * I got my original inspiration for this by looking at the bottom of a
+ * frying pan while something was cooking and watching the little bubbles
+ * coming off the bottom of the pan as the oil was boiling joining together
+ * to form bigger bubbles and finally to *pop* and disappear. I had some
+ * time on my hands so I wrote this little xscreensaver module to imitate
+ * it. Now that it's done it reminds me more of the bubbles you get in
+ * a glass of fizzy soft drink.....
+ *
+ * The problem seemed to be that the position/size etc. of all the bubbles
+ * on the screen had to be remembered and searched through to find when
+ * bubbles hit each other and combined. To do this more efficiently, the
+ * window/screen is divided up into a square mesh of side length mesh_length
+ * and separate lists of bubbles contained in each cell of the mesh are
+ * kept. Only the cells in the immediate vicinity of the bubble in question
+ * are searched. This should make things more efficient although the whole
+ * thing seems to use up too much CPU, but then I'm using an ancient PC so
+ * perhaps it's not surprising .
+ * (Six months after I wrote the above I now have a Pentium with PCI graphics
+ * and things are _much_ nicer.)
+ *
+ * Author: James Macnicol
+ * Internet E-mail : j-macnicol@adfa.edu.au
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#undef DEBUG /* doesn't compile */
+
+#include <math.h>
+#include <limits.h>
+
+#ifndef VMS
+# include <sys/wait.h>
+#else /* VMS */
+# if __DECC_VER >= 50200000
+# include <sys/wait.h>
+# endif
+#endif /* VMS */
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include "screenhack.h"
+#include "yarandom.h"
+#include "bubbles.h"
+#include "ximage-loader.h"
+
+#define FANCY_BUBBLES
+
+/*
+ * Public variables
+ */
+
+static const char *bubbles_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*simple: false",
+ "*broken: false",
+ "*delay: 10000",
+ "*quiet: false",
+ "*mode: float",
+ "*trails: false",
+ "*3D: false",
+ 0
+};
+
+static XrmOptionDescRec bubbles_options [] = {
+ { "-simple", ".simple", XrmoptionNoArg, "true" },
+#ifdef FANCY_BUBBLES
+ { "-broken", ".broken", XrmoptionNoArg, "true" },
+#endif
+ { "-quiet", ".quiet", XrmoptionNoArg, "true" },
+ { "-3D", ".3D", XrmoptionNoArg, "true" },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-drop", ".mode", XrmoptionNoArg, "drop" },
+ { "-rise", ".mode", XrmoptionNoArg, "rise" },
+ { "-trails", ".trails", XrmoptionNoArg, "true" },
+ { 0, 0, 0, 0 }
+};
+
+/*
+ * Private variables
+ */
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ Bubble **mesh;
+ int mesh_length;
+ int mesh_width;
+ int mesh_height;
+ int mesh_cells;
+
+ int **adjacent_list;
+
+ int screen_width;
+ int screen_height;
+ int screen_depth;
+ unsigned int default_fg_pixel, default_bg_pixel;
+
+ int bubble_min_radius; /* For simple mode only */
+ int bubble_max_radius;
+ long *bubble_areas;
+ int *bubble_droppages;
+ GC draw_gc, erase_gc;
+
+#ifdef FANCY_BUBBLES
+ int num_bubble_pixmaps;
+ Bubble_Step **step_pixmaps;
+#endif
+
+ Bool simple;
+ Bool broken;
+ Bool quiet;
+ Bool threed;
+ Bool drop;
+ Bool trails;
+ int drop_dir;
+ int delay;
+};
+
+static int drop_bubble( struct state *st, Bubble *bb );
+
+/*
+ * To prevent forward references, some stuff is up here
+ */
+
+static long
+calc_bubble_area(struct state *st, int r)
+/* Calculate the area of a bubble of radius r */
+{
+#ifdef DEBUG
+ printf("%d %g\n", r,
+ 10.0 * PI * (double)r * (double)r * (double)r);
+#endif /* DEBUG */
+ if (st->threed)
+ return (long)(10.0 * PI * (double)r * (double)r * (double)r);
+ else
+ return (long)(10.0 * PI * (double)r * (double)r);
+}
+
+static void *
+xmalloc(size_t size)
+/* Safe malloc */
+{
+ void *ret;
+
+ if ((ret = malloc(size)) == NULL) {
+ fprintf(stderr, "%s: out of memory\n", progname);
+ exit(1);
+ }
+ return ret;
+}
+
+#ifdef DEBUG
+static void
+die_bad_bubble(Bubble *bb)
+/* This is for use with GDB */
+{
+ fprintf(stderr, "Bad bubble detected at 0x%x!\n", (int)bb);
+ exit(1);
+}
+#endif
+
+static int
+null_bubble(Bubble *bb)
+/* Returns true if the pointer passed is NULL. If not then this checks to
+see if the bubble is valid (i.e. the (x,y) position is valid and the magic
+number is set correctly. This only a sanity check for debugging and is
+turned off if DEBUG isn't set. */
+{
+ if (bb == (Bubble *)NULL)
+ return 1;
+#ifdef DEBUG
+ if ((bb->cell_index < 0) || (bb->cell_index > st->mesh_cells)) {
+ fprintf(stderr, "cell_index = %d\n", bb->cell_index);
+ die_bad_bubble(bb);
+ }
+ if (bb->magic != BUBBLE_MAGIC) {
+ fprintf(stderr, "Magic = %d\n", bb->magic);
+ die_bad_bubble(bb);
+ }
+ if (st->simple) {
+ if ((bb->x < 0) || (bb->x > st->screen_width) ||
+ (bb->y < 0) || (bb->y > st->screen_height) ||
+ (bb->radius < st->bubble_min_radius) || (bb->radius >
+ st->bubble_max_radius)) {
+ fprintf(stderr,
+ "radius = %d, x = %d, y = %d, magic = %d, cell index = %d\n",
+ bb->radius, bb->x, bb->y, bb->magic, bb->cell_index);
+ die_bad_bubble(bb);
+ }
+#ifdef FANCY_BUBBLES
+ } else {
+ if ((bb->x < 0) || (bb->x > st->screen_width) ||
+ (bb->y < 0) || (bb->y > st->screen_height) ||
+ (bb->radius < st->step_pixmaps[0]->radius) ||
+ (bb->radius > st->step_pixmaps[st->num_bubble_pixmaps-1]->radius)) {
+ fprintf(stderr,
+ "radius = %d, x = %d, y = %d, magic = %d, cell index = %d\n",
+ bb->radius, bb->x, bb->y, bb->magic, bb->cell_index);
+ die_bad_bubble(bb);
+ }
+#endif
+ }
+#endif /* DEBUG */
+ return 0;
+}
+
+#ifdef DEBUG
+static void
+print_bubble_list(Bubble *bb)
+/* Print list of where all the bubbles are. For debugging purposes only. */
+{
+ if (! null_bubble(bb)) {
+ printf(" (%d, %d) %d\n", bb->x, bb->y, bb->radius);
+ print_bubble_list(bb->next);
+ }
+}
+#endif /* DEBUG */
+
+static void
+add_bubble_to_list(Bubble **list, Bubble *bb)
+/* Take a pointer to a list of bubbles and stick bb at the head of the
+ list. */
+{
+ Bubble *head = *list;
+
+ if (null_bubble(head)) {
+ bb->prev = (Bubble *)NULL;
+ bb->next = (Bubble *)NULL;
+ } else {
+ bb->next = head;
+ bb->prev = (Bubble *)NULL;
+ head->prev = bb;
+ }
+ *list = bb;
+}
+
+
+/*
+ * Mesh stuff
+ */
+
+
+static void
+init_mesh (struct state *st)
+/* Setup the mesh of bubbles */
+{
+ int i;
+
+ st->mesh = (Bubble **)xmalloc(st->mesh_cells * sizeof(Bubble *));
+ for (i = 0; i < st->mesh_cells; i++)
+ st->mesh[i] = (Bubble *)NULL;
+}
+
+static int
+cell_to_mesh(struct state *st, int x, int y)
+/* convert cell coordinates to mesh index */
+{
+#ifdef DEBUG
+ if ((x < 0) || (y < 0)) {
+ fprintf(stderr, "cell_to_mesh: x = %d, y = %d\n", x, y);
+ exit(1);
+ }
+#endif
+ return ((st->mesh_width * y) + x);
+}
+
+static void
+mesh_to_cell(struct state *st, int mi, int *cx, int *cy)
+/* convert mesh index into cell coordinates */
+{
+ *cx = mi % st->mesh_width;
+ *cy = mi / st->mesh_width;
+}
+
+static int
+pixel_to_mesh(struct state *st, int x, int y)
+/* convert screen coordinates into mesh index */
+{
+ return cell_to_mesh(st, (x / st->mesh_length), (y / st->mesh_length));
+}
+
+static int
+verify_mesh_index(struct state *st, int x, int y)
+/* check to see if (x,y) is in the mesh */
+{
+ if ((x < 0) || (y < 0) || (x >= st->mesh_width) || (y >= st->mesh_height))
+ return (-1);
+ return (cell_to_mesh(st, x, y));
+}
+
+#ifdef DEBUG
+static void
+print_adjacents(int *adj)
+/* Print a list of the cells calculated above. For debugging only. */
+{
+ int i;
+
+ printf("(");
+ for (i = 0; i < 8; i++)
+ printf("%d ", adj[i]);
+ printf(")\n");
+}
+#endif /* DEBUG */
+
+static void
+add_to_mesh(struct state *st, Bubble *bb)
+/* Add the given bubble to the mesh by sticking it on the front of the
+list. bb is already allocated so no need to malloc() anything, just
+adjust pointers. */
+{
+#ifdef DEBUG
+ if (null_bubble(bb)) {
+ fprintf(stderr, "Bad bubble passed to add_to_mesh()!\n");
+ exit(1);
+ }
+#endif /* DEBUG */
+
+ add_bubble_to_list(&st->mesh[bb->cell_index], bb);
+}
+
+#ifdef DEBUG
+static void
+print_mesh (struct state *st)
+/* Print the contents of the mesh */
+{
+ int i;
+
+ for (i = 0; i < st->mesh_cells; i++) {
+ if (! null_bubble(st->mesh[i])) {
+ printf("Mesh cell %d\n", i);
+ print_bubble_list(st->mesh[i]);
+ }
+ }
+}
+
+static void
+valid_mesh (struct state *st)
+/* Check to see if the mesh is Okay. For debugging only. */
+{
+ int i;
+ Bubble *b;
+
+ for (i = 0; i < st->mesh_cells; i++) {
+ b = st->mesh[i];
+ while (! null_bubble(b))
+ b = b->next;
+ }
+}
+
+static int
+total_bubbles (struct state *st)
+/* Count how many bubbles there are in total. For debugging only. */
+{
+ int rv = 0;
+ int i;
+ Bubble *b;
+
+ for (i = 0; i < st->mesh_cells; i++) {
+ b = st->mesh[i];
+ while (! null_bubble(b)) {
+ rv++;
+ b = b->next;
+ }
+ }
+
+ return rv;
+}
+#endif /* DEBUG */
+
+static void
+calculate_adjacent_list (struct state *st)
+/* Calculate the list of cells adjacent to a particular cell for use
+ later. */
+{
+ int i;
+ int ix, iy;
+
+ st->adjacent_list = (int **)xmalloc(st->mesh_cells * sizeof(int *));
+ for (i = 0; i < st->mesh_cells; i++) {
+ st->adjacent_list[i] = (int *)xmalloc(9 * sizeof(int));
+ mesh_to_cell(st, i, &ix, &iy);
+ st->adjacent_list[i][0] = verify_mesh_index(st, --ix, --iy);
+ st->adjacent_list[i][1] = verify_mesh_index(st, ++ix, iy);
+ st->adjacent_list[i][2] = verify_mesh_index(st, ++ix, iy);
+ st->adjacent_list[i][3] = verify_mesh_index(st, ix, ++iy);
+ st->adjacent_list[i][4] = verify_mesh_index(st, ix, ++iy);
+ st->adjacent_list[i][5] = verify_mesh_index(st, --ix, iy);
+ st->adjacent_list[i][6] = verify_mesh_index(st, --ix, iy);
+ st->adjacent_list[i][7] = verify_mesh_index(st, ix, --iy);
+ st->adjacent_list[i][8] = i;
+ }
+}
+
+static void
+adjust_areas (struct state *st)
+/* Adjust areas of bubbles so we don't get overflow in weighted_mean() */
+{
+ double maxvalue;
+ long maxarea;
+ long factor;
+ int i;
+
+#ifdef FANCY_BUBBLES
+ if (st->simple)
+ maxarea = st->bubble_areas[st->bubble_max_radius+1];
+ else
+ maxarea = st->step_pixmaps[st->num_bubble_pixmaps]->area;
+#else /* !FANCY_BUBBLES */
+ maxarea = st->bubble_areas[st->bubble_max_radius+1];
+#endif /* !FANCY_BUBBLES */
+ maxvalue = (double)st->screen_width * 2.0 * (double)maxarea;
+ factor = (long)ceil(maxvalue / (double)LONG_MAX);
+ if (factor > 1) {
+ /* Overflow will occur in weighted_mean(). We must divide areas
+ each by factor so it will never do so. */
+#ifdef FANCY_BUBBLES
+ if (st->simple) {
+ for (i = st->bubble_min_radius; i <= st->bubble_max_radius+1; i++) {
+ st->bubble_areas[i] /= factor;
+ if (st->bubble_areas[i] == 0)
+ st->bubble_areas[i] = 1;
+ }
+ } else {
+ for (i = 0; i <= st->num_bubble_pixmaps; i++) {
+#ifdef DEBUG
+ printf("area = %ld", st->step_pixmaps[i]->area);
+#endif /* DEBUG */
+ st->step_pixmaps[i]->area /= factor;
+ if (st->step_pixmaps[i]->area == 0)
+ st->step_pixmaps[i]->area = 1;
+#ifdef DEBUG
+ printf("-> %ld\n", st->step_pixmaps[i]->area);
+#endif /* DEBUG */
+ }
+ }
+#else /* !FANCY_BUBBLES */
+ for (i = st->bubble_min_radius; i <= st->bubble_max_radius+1; i++) {
+ st->bubble_areas[i] /= factor;
+ if (st->bubble_areas[i] == 0)
+ st->bubble_areas[i] = 1;
+ }
+#endif /* !FANCY_BUBBLES */
+ }
+#ifdef DEBUG
+ printf("maxarea = %ld\n", maxarea);
+ printf("maxvalue = %g\n", maxvalue);
+ printf("LONG_MAX = %ld\n", LONG_MAX);
+ printf("factor = %ld\n", factor);
+#endif /* DEBUG */
+}
+
+/*
+ * Bubbles stuff
+ */
+
+static Bubble *
+new_bubble (struct state *st)
+/* Add a new bubble at some random position on the screen of the smallest
+size. */
+{
+ Bubble *rv = (Bubble *)xmalloc(sizeof(Bubble));
+
+ /* Can't use null_bubble() here since magic number hasn't been set */
+ if (rv == (Bubble *)NULL) {
+ fprintf(stderr, "Ran out of memory!\n");
+ exit(1);
+ }
+
+ if (st->simple) {
+ rv->radius = st->bubble_min_radius;
+ rv->area = st->bubble_areas[st->bubble_min_radius];
+#ifdef FANCY_BUBBLES
+ } else {
+ rv->step = 0;
+ rv->radius = st->step_pixmaps[0]->radius;
+ rv->area = st->step_pixmaps[0]->area;
+#endif /* FANCY_BUBBLES */
+ }
+ rv->visible = 0;
+ rv->magic = BUBBLE_MAGIC;
+ rv->x = random() % st->screen_width;
+ rv->y = random() % st->screen_height;
+ rv->cell_index = pixel_to_mesh(st, rv->x, rv->y);
+
+ return rv;
+}
+
+static void
+show_bubble(struct state *st, Bubble *bb)
+/* paint the bubble on the screen */
+{
+ if (null_bubble(bb)) {
+ fprintf(stderr, "NULL bubble passed to show_bubble\n");
+ exit(1);
+ }
+
+ if (! bb->visible) {
+ bb->visible = 1;
+
+ if (st->simple) {
+ XDrawArc(st->dpy, st->window, st->draw_gc, (bb->x - bb->radius),
+ (bb->y - bb->radius), bb->radius*2, bb->radius*2, 0,
+ 360*64);
+ } else {
+#ifdef FANCY_BUBBLES
+ XSetClipOrigin(st->dpy, st->step_pixmaps[bb->step]->draw_gc,
+ (bb->x - bb->radius),
+ (bb->y - bb->radius));
+
+ XCopyArea(st->dpy, st->step_pixmaps[bb->step]->ball, st->window,
+ st->step_pixmaps[bb->step]->draw_gc,
+ 0, 0, (bb->radius * 2),
+ (bb->radius * 2),
+ (bb->x - bb->radius),
+ (bb->y - bb->radius));
+#endif /* FANCY_BUBBLES */
+ }
+ }
+}
+
+static void
+hide_bubble(struct state *st, Bubble *bb)
+/* erase the bubble */
+{
+ if (null_bubble(bb)) {
+ fprintf(stderr, "NULL bubble passed to hide_bubble\n");
+ exit(1);
+ }
+
+ if (bb->visible) {
+ bb->visible = 0;
+
+ if (st->simple) {
+ XDrawArc(st->dpy, st->window, st->erase_gc, (bb->x - bb->radius),
+ (bb->y - bb->radius), bb->radius*2, bb->radius*2, 0,
+ 360*64);
+ } else {
+#ifdef FANCY_BUBBLES
+ if (! st->broken) {
+ XSetClipOrigin(st->dpy, st->step_pixmaps[bb->step]->erase_gc,
+ (bb->x - bb->radius), (bb->y - bb->radius));
+
+ XFillRectangle(st->dpy, st->window, st->step_pixmaps[bb->step]->erase_gc,
+ (bb->x - bb->radius),
+ (bb->y - bb->radius),
+ (bb->radius * 2),
+ (bb->radius * 2));
+ }
+#endif /* FANCY_BUBBLES */
+ }
+ }
+}
+
+static void
+delete_bubble_in_mesh(struct state *st, Bubble *bb, int keep_bubble)
+/* Delete an individual bubble, adjusting list of bubbles around it.
+ If keep_bubble is true then the bubble isn't actually deleted. We
+ use this to allow bubbles to change mesh cells without reallocating,
+ (it needs this when two bubbles collide and the centre position is
+ recalculated, and this may stray over a mesh boundary). */
+{
+ if ((!null_bubble(bb->prev)) && (!null_bubble(bb->next))) {
+ bb->prev->next = bb->next;
+ bb->next->prev = bb->prev;
+ } else if ((!null_bubble(bb->prev)) &&
+ (null_bubble(bb->next))) {
+ bb->prev->next = (Bubble *)NULL;
+ bb->next = st->mesh[bb->cell_index];
+ } else if ((null_bubble(bb->prev)) &&
+ (!null_bubble(bb->next))) {
+ bb->next->prev = (Bubble *)NULL;
+ st->mesh[bb->cell_index] = bb->next;
+ bb->next = st->mesh[bb->cell_index];
+ } else {
+ /* Only item on list */
+ st->mesh[bb->cell_index] = (Bubble *)NULL;
+ }
+ if (! keep_bubble)
+ free(bb);
+}
+
+static unsigned long
+ulongsqrint(int x)
+/* Saves ugly inline code */
+{
+ return ((unsigned long)x * (unsigned long)x);
+}
+
+static Bubble *
+get_closest_bubble(struct state *st, Bubble *bb)
+/* Find the closest bubble touching the this bubble, NULL if none are
+ touching. */
+{
+ Bubble *rv = (Bubble *)NULL;
+ Bubble *tmp;
+ unsigned long separation2, touchdist2;
+ int dx, dy;
+ unsigned long closest2 = ULONG_MAX;
+ int i;
+
+#ifdef DEBUG
+ if (null_bubble(bb)) {
+ fprintf(stderr, "NULL pointer 0x%x passed to get_closest_bubble()!",
+ (int)bb);
+ exit(1);
+ }
+#endif /* DEBUG */
+
+ for (i = 0; i < 9; i++) {
+ /* There is a bug here where bb->cell_index is negaitve.. */
+#ifdef DEBUG
+ if ((bb->cell_index < 0) || (bb->cell_index >= st->mesh_cells)) {
+ fprintf(stderr, "bb->cell_index = %d\n", bb->cell_index);
+ exit(1);
+ }
+#endif /* DEBUG */
+/* printf("%d,", bb->cell_index); */
+ if (st->adjacent_list[bb->cell_index][i] != -1) {
+ tmp = st->mesh[st->adjacent_list[bb->cell_index][i]];
+ while (! null_bubble(tmp)) {
+ if (tmp != bb) {
+ dx = tmp->x - bb->x;
+ dy = tmp->y - bb->y;
+ separation2 = ulongsqrint(dx) + ulongsqrint(dy);
+ /* Add extra leeway so circles _never_ overlap */
+ touchdist2 = ulongsqrint(tmp->radius + bb->radius + 2);
+ if ((separation2 <= touchdist2) && (separation2 <
+ closest2)) {
+ rv = tmp;
+ closest2 = separation2;
+ }
+ }
+ tmp = tmp->next;
+ }
+ }
+ }
+
+ return rv;
+}
+
+#ifdef DEBUG
+static void
+ldr_barf (struct state *st)
+{
+}
+#endif /* DEBUG */
+
+static long
+long_div_round(long num, long dem)
+{
+ long divvie, moddo;
+
+#ifdef DEBUG
+ if ((num < 0) || (dem < 0)) {
+ fprintf(stderr, "long_div_round: %ld, %ld\n", num, dem);
+ ldr_barf();
+ exit(1);
+ }
+#endif /* DEBUG */
+
+ divvie = num / dem;
+ moddo = num % dem;
+ if (moddo > (dem / 2))
+ ++divvie;
+
+#ifdef DEBUG
+ if ((divvie < 0) || (moddo < 0)) {
+ fprintf(stderr, "long_div_round: %ld, %ld\n", divvie, moddo);
+ ldr_barf();
+ exit(1);
+ }
+#endif /* DEBUG */
+
+ return divvie;
+}
+
+static int
+weighted_mean(int n1, int n2, long w1, long w2)
+/* Mean of n1 and n2 respectively weighted by weights w1 and w2. */
+{
+#ifdef DEBUG
+ if ((w1 <= 0) || (w2 <= 0)) {
+ fprintf(stderr,
+ "Bad weights passed to weighted_mean() - (%d, %d, %ld, %ld)!\n",
+ n1, n2, w1, w2);
+ exit(1);
+ }
+#endif /* DEBUG */
+ return ((int)long_div_round((long)n1 * w1 + (long)n2 * w2,
+ w1 + w2));
+}
+
+static int
+bubble_eat(struct state *st, Bubble *diner, Bubble *food)
+/* The diner eats the food. Returns true (1) if the diner still exists */
+{
+ int i;
+ int newmi;
+
+#ifdef DEBUG
+ if ((null_bubble(diner)) || (null_bubble(food))) {
+ fprintf(stderr, "Bad bubbles passed to bubble_eat()!\n");
+ exit(1);
+ }
+#endif /* DEBUG */
+
+ /* We hide the diner even in the case that it doesn't grow so that
+ if the food overlaps its boundary it is replaced. This could
+ probably be solved by letting bubbles eat others which are close
+ but not quite touching. It's probably worth it, too, since we
+ would then not have to redraw bubbles which don't change in
+ size. */
+
+ hide_bubble(st, diner);
+ hide_bubble(st, food);
+ diner->x = weighted_mean(diner->x, food->x, diner->area, food->area);
+ diner->y = weighted_mean(diner->y, food->y, diner->area, food->area);
+ newmi = pixel_to_mesh(st, diner->x, diner->y);
+ diner->area += food->area;
+ delete_bubble_in_mesh(st, food, DELETE_BUBBLE);
+
+ if (st->drop) {
+ if ((st->simple) && (diner->area > st->bubble_areas[st->bubble_max_radius])) {
+ diner->area = st->bubble_areas[st->bubble_max_radius];
+ }
+#ifdef FANCY_BUBBLES
+ if ((! st->simple) && (diner->area > st->step_pixmaps[st->num_bubble_pixmaps]->area)) {
+ diner->area = st->step_pixmaps[st->num_bubble_pixmaps]->area;
+ }
+#endif /* FANCY_BUBBLES */
+ }
+ else {
+ if ((st->simple) && (diner->area > st->bubble_areas[st->bubble_max_radius])) {
+ delete_bubble_in_mesh(st, diner, DELETE_BUBBLE);
+ return 0;
+ }
+#ifdef FANCY_BUBBLES
+ if ((! st->simple) && (diner->area >
+ st->step_pixmaps[st->num_bubble_pixmaps]->area)) {
+ delete_bubble_in_mesh(st, diner, DELETE_BUBBLE);
+ return 0;
+ }
+#endif /* FANCY_BUBBLES */
+ }
+
+ if (st->simple) {
+ if (diner->area > st->bubble_areas[diner->radius + 1]) {
+ /* Move the bubble to a new radius */
+ i = diner->radius;
+ while ((i < st->bubble_max_radius - 1) && (diner->area > st->bubble_areas[i+1]))
+ ++i;
+ diner->radius = i;
+ }
+ show_bubble(st, diner);
+#ifdef FANCY_BUBBLES
+ } else {
+ if (diner->area > st->step_pixmaps[diner->step+1]->area) {
+ i = diner->step;
+ while ((i < st->num_bubble_pixmaps - 1) && (diner->area > st->step_pixmaps[i+1]->area))
+ ++i;
+ diner->step = i;
+ diner->radius = st->step_pixmaps[diner->step]->radius;
+ }
+ show_bubble(st, diner);
+#endif /* FANCY_BUBBLES */
+ }
+
+ /* Now adjust locations and cells if need be */
+ if (newmi != diner->cell_index) {
+ delete_bubble_in_mesh(st, diner, KEEP_BUBBLE);
+ diner->cell_index = newmi;
+ add_to_mesh(st, diner);
+ }
+
+ return 1;
+}
+
+static int
+merge_bubbles(struct state *st, Bubble *b1, Bubble *b2)
+/* These two bubbles merge into one. If the first one wins out return
+1 else return 2. If there is no winner (it explodes) then return 0 */
+{
+ int b1size, b2size;
+
+ b1size = b1->area;
+ b2size = b2->area;
+
+#ifdef DEBUG
+ if ((null_bubble(b1) || null_bubble(b2))) {
+ fprintf(stderr, "NULL bubble passed to merge_bubbles()!\n");
+ exit(1);
+ }
+#endif /* DEBUG */
+
+ if (b1 == b2) {
+ hide_bubble(st, b1);
+ delete_bubble_in_mesh(st, b1, DELETE_BUBBLE);
+ return 0;
+ }
+
+ if (b1size > b2size) {
+ switch (bubble_eat(st, b1, b2)) {
+ case 0:
+ return 0;
+ break;
+ case 1:
+ return 1;
+ break;
+ default:
+ break;
+ }
+ } else if (b1size < b2size) {
+ switch (bubble_eat(st, b2, b1)) {
+ case 0:
+ return 0;
+ break;
+ case 1:
+ return 2;
+ break;
+ default:
+ break;
+ }
+ } else {
+ if ((random() % 2) == 0) {
+ switch (bubble_eat(st, b1, b2)) {
+ case 0:
+ return 0;
+ break;
+ case 1:
+ return 1;
+ break;
+ default:
+ break;
+ }
+ } else {
+ switch (bubble_eat(st, b2, b1)) {
+ case 0:
+ return 0;
+ break;
+ case 1:
+ return 2;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ fprintf(stderr, "An error occurred in merge_bubbles()\n");
+ exit(1);
+}
+
+static void
+insert_new_bubble(struct state *st, Bubble *tmp)
+/* Calculates which bubbles are eaten when a new bubble tmp is
+ inserted. This is called recursively in case when a bubble grows
+ it eats others. Careful to pick out disappearing bubbles. */
+{
+ Bubble *nextbub;
+ Bubble *touch;
+
+#ifdef DEBUG
+ if (null_bubble(tmp)) {
+ fprintf(stderr, "Bad bubble passed to insert_new_bubble()!\n");
+ exit(1);
+ }
+#endif /* DEBUG */
+
+ nextbub = tmp;
+ touch = get_closest_bubble(st, nextbub);
+ if (null_bubble(touch))
+ return;
+
+ while (1) {
+
+ /* Merge all touching bubbles */
+ while (! null_bubble(touch)) {
+ switch (merge_bubbles(st, nextbub, touch)) {
+ case 2:
+ /* touch ate nextbub and survived */
+ nextbub = touch;
+ break;
+ case 1:
+ /* nextbub ate touch and survived */
+ break;
+ case 0:
+ /* somebody ate someone else but they exploded */
+ nextbub = (Bubble *)NULL;
+ break;
+ default:
+ /* something went wrong */
+ fprintf(stderr, "Error occurred in insert_new_bubble()\n");
+ exit(1);
+ }
+
+ /* Check to see if any bubble survived. */
+ if (null_bubble(nextbub))
+ break;
+
+ /* Check to see if there are any other bubbles still in the area
+ and if we need to do this all over again for them. */
+ touch = get_closest_bubble(st, nextbub);
+ }
+
+ if (null_bubble(nextbub))
+ break;
+
+ /* Shift bubble down. Break if we run off the screen. */
+ if (st->drop) {
+ if (drop_bubble( st, nextbub ) == -1)
+ break;
+ }
+
+ /* Check to see if there are any other bubbles still in the area
+ and if we need to do this all over again for them. */
+ touch = get_closest_bubble(st, nextbub);
+ if (null_bubble(touch)) {
+ /* We also continue every so often if we're dropping and the bubble is at max size */
+ if (st->drop) {
+ if (st->simple) {
+ if ((nextbub->area >= st->bubble_areas[st->bubble_max_radius - 1]) && (random() % 2 == 0))
+ continue;
+ }
+#ifdef FANCY_BUBBLES
+ else {
+ if ((nextbub->step >= st->num_bubble_pixmaps - 1) && (random() % 2 == 0))
+ continue;
+ }
+#endif /* FANCY_BUBBLES */
+ }
+ break;
+ }
+
+ }
+}
+
+
+static void
+leave_trail(struct state *st, Bubble *bb )
+{
+ Bubble *tmp;
+
+ tmp = new_bubble(st);
+ tmp->x = bb->x;
+ tmp->y = bb->y - ((bb->radius + 10) * st->drop_dir);
+ tmp->cell_index = pixel_to_mesh(st, tmp->x, tmp->y);
+ add_to_mesh(st, tmp);
+ insert_new_bubble(st, tmp);
+ show_bubble( st, tmp );
+}
+
+
+static int
+drop_bubble( struct state *st, Bubble *bb )
+{
+ int newmi;
+
+ hide_bubble( st, bb );
+
+ if (st->simple)
+ (bb->y) += (st->bubble_droppages[bb->radius] * st->drop_dir);
+#ifdef FANCY_BUBBLES
+ else
+ (bb->y) += (st->step_pixmaps[bb->step]->droppage * st->drop_dir);
+#endif /* FANCY_BUBBLES */
+ if ((bb->y < 0) || (bb->y > st->screen_height)) {
+ delete_bubble_in_mesh( st, bb, DELETE_BUBBLE );
+ return -1;
+ }
+
+ show_bubble( st, bb );
+
+ /* Now adjust locations and cells if need be */
+ newmi = pixel_to_mesh(st, bb->x, bb->y);
+ if (newmi != bb->cell_index) {
+ delete_bubble_in_mesh(st, bb, KEEP_BUBBLE);
+ bb->cell_index = newmi;
+ add_to_mesh(st, bb);
+ }
+
+ if (st->trails) {
+ if (st->simple) {
+ if ((bb->area >= st->bubble_areas[st->bubble_max_radius - 1]) && (random() % 2 == 0))
+ leave_trail( st, bb );
+ }
+#ifdef FANCY_BUBBLES
+ else {
+ if ((bb->step >= st->num_bubble_pixmaps - 1) && (random() % 2 == 0))
+ leave_trail( st, bb );
+ }
+#endif /* FANCY_BUBBLES */
+ }
+
+ return 0;
+}
+
+
+#ifdef DEBUG
+static int
+get_length_of_bubble_list(Bubble *bb)
+{
+ Bubble *tmp = bb;
+ int rv = 0;
+
+ while (! null_bubble(tmp)) {
+ rv++;
+ tmp = tmp->next;
+ }
+
+ return rv;
+}
+#endif /* DEBUG */
+
+/*
+ * Pixmap stuff used regardless of whether file I/O is available. Must
+ * still check for XPM, though!
+ */
+
+#ifdef FANCY_BUBBLES
+
+/*
+ * Pixmaps without file I/O (but do have XPM)
+ */
+
+static void
+pixmap_sort(Bubble_Step **head, int numelems)
+/* Couldn't get qsort to work right with this so I wrote my own. This puts
+the numelems length array with first element at head into order of radius.
+*/
+{
+ Bubble_Step tmp;
+ Bubble_Step *least = 0;
+ int minradius = INT_MAX;
+ int i;
+
+ for (i = 0; i < numelems; i++) {
+ if (head[i]->radius < minradius) {
+ least = head[i];
+ minradius = head[i]->radius;
+ }
+ }
+ if (*head != least) {
+ memcpy(&tmp, least, sizeof(Bubble_Step));
+ memcpy(least, *head, sizeof(Bubble_Step));
+ memcpy(*head, &tmp, sizeof(Bubble_Step));
+ }
+
+ if (numelems > 2)
+ pixmap_sort(&head[1], numelems-1);
+}
+
+static int
+extrapolate(int i1, int i2)
+{
+ return (i2 + (i2 - i1));
+}
+
+static void
+make_pixmap_array(struct state *st, Bubble_Step *list)
+/* From a linked list of bubbles construct the array step_pixmaps */
+{
+ Bubble_Step *tmp = list;
+ int ind;
+#ifdef DEBUG
+ int prevrad = -1;
+#endif
+
+ if (list == (Bubble_Step *)NULL) {
+ fprintf(stderr, "NULL list passed to make_pixmap_array\n");
+ exit(1);
+ }
+
+ st->num_bubble_pixmaps = 1;
+ while(tmp->next != (Bubble_Step *)NULL) {
+ tmp = tmp->next;
+ ++st->num_bubble_pixmaps;
+ }
+
+ if (st->num_bubble_pixmaps < 2) {
+ fprintf(stderr, "Must be at least two bubbles in file\n");
+ exit(1);
+ }
+
+ st->step_pixmaps = (Bubble_Step **)xmalloc((st->num_bubble_pixmaps + 1) *
+ sizeof(Bubble_Step *));
+
+ /* Copy them blindly into the array for sorting. */
+ ind = 0;
+ tmp = list;
+ do {
+ st->step_pixmaps[ind++] = tmp;
+ tmp = tmp->next;
+ } while(tmp != (Bubble_Step *)NULL);
+
+ /* We make another bubble beyond the ones with pixmaps so that the final
+ bubble hangs around and doesn't pop immediately. It's radius and area
+ are found by extrapolating from the largest two bubbles with pixmaps. */
+
+ st->step_pixmaps[st->num_bubble_pixmaps] =
+ (Bubble_Step *)xmalloc(sizeof(Bubble_Step));
+ st->step_pixmaps[st->num_bubble_pixmaps]->radius = INT_MAX;
+
+ pixmap_sort(st->step_pixmaps, (st->num_bubble_pixmaps + 1));
+
+#ifdef DEBUG
+ if (st->step_pixmaps[st->num_bubble_pixmaps]->radius != INT_MAX) {
+ fprintf(stderr, "pixmap_sort() screwed up make_pixmap_array\n");
+ }
+#endif /* DEBUG */
+
+ st->step_pixmaps[st->num_bubble_pixmaps]->radius =
+ extrapolate(st->step_pixmaps[st->num_bubble_pixmaps-2]->radius,
+ st->step_pixmaps[st->num_bubble_pixmaps-1]->radius);
+ st->step_pixmaps[st->num_bubble_pixmaps]->area =
+ calc_bubble_area(st, st->step_pixmaps[st->num_bubble_pixmaps]->radius);
+
+
+#ifdef DEBUG
+ /* Now check for correct order */
+ for (ind = 0; ind < st->num_bubble_pixmaps; ind++) {
+ if (prevrad > 0) {
+ if (st->step_pixmaps[ind]->radius < prevrad) {
+ fprintf(stderr, "Pixmaps not in ascending order of radius\n");
+ exit(1);
+ }
+ }
+ prevrad = st->step_pixmaps[ind]->radius;
+ }
+#endif /* DEBUG */
+
+ /* Now populate the droppage values */
+ for (ind = 0; ind < st->num_bubble_pixmaps; ind++)
+ st->step_pixmaps[ind]->droppage = MAX_DROPPAGE * ind / st->num_bubble_pixmaps;
+}
+
+static void
+make_pixmap_from_default(struct state *st,
+ const unsigned char *png_data,
+ unsigned long data_size,
+ Bubble_Step *bl)
+/* Read pixmap data which has been compiled into the program and a pointer
+ to which has been passed.
+
+ This is virtually copied verbatim from make_pixmap_from_file() above and
+changes made to either should be propagated onwards! */
+{
+ XGCValues gcv;
+
+#ifdef DEBUG
+ if (pixmap_data == (char **)0) {
+ fprintf(stderr, "make_pixmap_from_default(): NULL passed\n");
+ exit(1);
+ }
+#endif
+
+ if (bl == (Bubble_Step *)NULL) {
+ fprintf(stderr, "NULL pointer passed to make_pixmap()\n");
+ exit(1);
+ }
+
+#ifdef FANCY_BUBBLES
+ {
+ int w, h;
+ bl->ball = image_data_to_pixmap (st->dpy, st->window, png_data, data_size,
+ &w, &h, &bl->shape_mask);
+ bl->radius = MAX(w, h) / 2;
+ bl->area = calc_bubble_area(st, bl->radius);
+ }
+#endif /* FANCY_BUBBLES */
+
+ gcv.foreground = st->default_fg_pixel;
+ gcv.function = GXcopy;
+ bl->draw_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ XSetClipMask(st->dpy, bl->draw_gc, bl->shape_mask);
+
+ gcv.foreground = st->default_bg_pixel;
+ gcv.function = GXcopy;
+ bl->erase_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ XSetClipMask(st->dpy, bl->erase_gc, bl->shape_mask);
+}
+
+static void
+default_to_pixmaps (struct state *st)
+/* Make pixmaps out of default ball data stored in bubbles_default.c */
+{
+ int i;
+ Bubble_Step *pixmap_list = (Bubble_Step *)NULL;
+ Bubble_Step *newpix, *tmppix;
+
+ init_default_bubbles();
+
+ for (i = 0; i < num_default_bubbles; i++) {
+ newpix = (Bubble_Step *)xmalloc(sizeof(Bubble_Step));
+ make_pixmap_from_default(st,
+ default_bubbles[i].png,
+ default_bubbles[i].size,
+ newpix);
+ /* Now add to list */
+ if (pixmap_list == (Bubble_Step *)NULL) {
+ pixmap_list = newpix;
+ } else {
+ tmppix = pixmap_list;
+ while (tmppix->next != (Bubble_Step *)NULL)
+ tmppix = tmppix->next;
+ tmppix->next = newpix;
+ }
+ newpix->next = (Bubble_Step *)NULL;
+ }
+
+ /* Finally construct step_pixmaps[] */
+ make_pixmap_array(st, pixmap_list);
+}
+
+#endif /* FANCY_BUBBLES */
+
+
+/*
+ * Main stuff
+ */
+
+
+static void
+get_resources(struct state *st)
+/* Get the appropriate X resources and warn about any inconsistencies. */
+{
+ Bool rise;
+ XWindowAttributes xgwa;
+ Colormap cmap;
+ char *s;
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ cmap = xgwa.colormap;
+
+ st->threed = get_boolean_resource(st->dpy, "3D", "Boolean");
+ st->quiet = get_boolean_resource(st->dpy, "quiet", "Boolean");
+ st->simple = get_boolean_resource(st->dpy, "simple", "Boolean");
+ /* Forbid rendered bubbles on monochrome displays */
+ if ((mono_p) && (! st->simple)) {
+ if (! st->quiet)
+ fprintf(stderr,
+ "Rendered bubbles not supported on monochrome displays\n");
+ st->simple = True;
+ }
+ st->delay = get_integer_resource(st->dpy, "delay", "Integer");
+
+ s = get_string_resource (st->dpy, "mode", "Mode");
+ rise = False;
+ if (!s || !*s || !strcasecmp (s, "float"))
+ ;
+ else if (!strcasecmp (s, "rise"))
+ rise = True;
+ else if (!strcasecmp (s, "drop"))
+ st->drop = True;
+ else
+ fprintf (stderr, "%s: bogus mode: \"%s\"\n", progname, s);
+
+ st->trails = get_boolean_resource(st->dpy, "trails", "Boolean");
+ st->drop_dir = (st->drop ? 1 : -1);
+ if (st->drop || rise)
+ st->drop = 1;
+
+ st->default_fg_pixel = get_pixel_resource (st->dpy,
+ cmap, "foreground", "Foreground");
+ st->default_bg_pixel = get_pixel_resource (st->dpy,
+ cmap, "background", "Background");
+
+ if (st->simple) {
+ /* This is easy */
+ st->broken = get_boolean_resource(st->dpy, "broken", "Boolean");
+ if (st->broken)
+ if (! st->quiet)
+ fprintf(stderr, "-broken not available in simple mode\n");
+ } else {
+#ifndef FANCY_BUBBLES
+ st->simple = 1;
+#else /* FANCY_BUBBLES */
+ st->broken = get_boolean_resource(st->dpy, "broken", "Boolean");
+#endif /* FANCY_BUBBLES */
+ }
+}
+
+static void *
+bubbles_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ XWindowAttributes xgwa;
+ int i;
+
+ st->dpy = dpy;
+ st->window = window;
+
+ get_resources(st);
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+
+#ifdef DEBUG
+ printf("sizof(int) on this platform is %d\n", sizeof(int));
+ printf("sizof(long) on this platform is %d\n", sizeof(long));
+#endif /* DEBUG */
+
+ st->screen_width = xgwa.width;
+ st->screen_height = xgwa.height;
+ st->screen_depth = xgwa.depth;
+
+ if (st->simple) {
+ /* These are pretty much plucked out of the air */
+ st->bubble_min_radius = (int)(0.006*(double)(MIN(st->screen_width,
+ st->screen_height)));
+ st->bubble_max_radius = (int)(0.045*(double)(MIN(st->screen_width,
+ st->screen_height)));
+ /* Some trivial values */
+ if (st->bubble_min_radius < 1)
+ st->bubble_min_radius = 1;
+ if (st->bubble_max_radius <= st->bubble_min_radius)
+ st->bubble_max_radius = st->bubble_min_radius + 1;
+
+ st->mesh_length = (2 * st->bubble_max_radius) + 3;
+
+ /* store area of each bubble of certain radius as number of 1/10s of
+ a pixel area. PI is defined in <math.h> */
+ st->bubble_areas = (long *)xmalloc((st->bubble_max_radius + 2) * sizeof(int));
+ for (i = 0; i < st->bubble_min_radius; i++)
+ st->bubble_areas[i] = 0;
+ for (i = st->bubble_min_radius; i <= (st->bubble_max_radius+1); i++)
+ st->bubble_areas[i] = calc_bubble_area(st, i);
+
+ /* Now populate the droppage values */
+ st->bubble_droppages = (int *)xmalloc((st->bubble_max_radius + 2) * sizeof(int));
+ for (i = 0; i < st->bubble_min_radius; i++)
+ st->bubble_droppages[i] = 0;
+ for (i = st->bubble_min_radius; i <= (st->bubble_max_radius+1); i++)
+ st->bubble_droppages[i] = MAX_DROPPAGE * (i - st->bubble_min_radius) / (st->bubble_max_radius - st->bubble_min_radius);
+
+ st->mesh_length = (2 * st->bubble_max_radius) + 3;
+ } else {
+#ifndef FANCY_BUBBLES
+ fprintf(stderr,
+ "Bug: simple mode code not set but FANCY_BUBBLES not defined\n");
+ exit(1);
+#else /* FANCY_BUBBLES */
+ /* Make sure all #ifdef sort of things have been taken care of in
+ get_resources(). */
+ default_to_pixmaps(st);
+
+ /* Set mesh length */
+ st->mesh_length = (2 * st->step_pixmaps[st->num_bubble_pixmaps-1]->radius) + 3;
+#endif /* FANCY_BUBBLES */
+
+ /* Am I missing something in here??? */
+ }
+
+ st->mesh_width = (st->screen_width / st->mesh_length) + 1;
+ st->mesh_height = (st->screen_height / st->mesh_length) + 1;
+ st->mesh_cells = st->mesh_width * st->mesh_height;
+ init_mesh(st);
+
+ calculate_adjacent_list(st);
+
+ adjust_areas(st);
+
+ /* Graphics contexts for simple mode */
+ if (st->simple) {
+ gcv.foreground = st->default_fg_pixel;
+ st->draw_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ gcv.foreground = st->default_bg_pixel;
+ st->erase_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ }
+
+ XClearWindow (st->dpy, st->window);
+
+# ifndef FANCY_BUBBLES
+ st->simple = True;
+# endif
+
+ return st;
+}
+
+static unsigned long
+bubbles_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int i;
+ for (i = 0; i < 5; i++)
+ {
+ Bubble *tmp = new_bubble(st);
+ add_to_mesh(st, tmp);
+ insert_new_bubble(st, tmp);
+ }
+ return st->delay;
+}
+
+
+static void
+bubbles_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+bubbles_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+bubbles_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+XSCREENSAVER_MODULE ("Bubbles", bubbles)
diff --git a/hacks/bubbles.h b/hacks/bubbles.h
new file mode 100644
index 0000000..24872e3
--- /dev/null
+++ b/hacks/bubbles.h
@@ -0,0 +1,208 @@
+/* bubbles.h - definitions for bubbles screensaver */
+
+/* $Id: bubbles.h,v 1.6 2006/02/25 20:11:57 jwz Exp $ */
+
+#ifndef _BUBBLES_H_
+#define _BUBBLES_H_
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+#else
+# include <X11/Xlib.h>
+#endif
+
+/***************************************************************************
+ * Options you might like to change to affect the program's behaviour *
+ ***************************************************************************/
+
+/*
+ * Uncommenting the following will enable support for reading bubbles from
+ * files (using the -file and -directory options to bubbles). This is
+ * disabled by default since such operations are inherently non-portable
+ * and we want the program to compile on as many systems as possible.
+ *
+ * If you uncomment this and you figure out how to get it working, please
+ * let me (J.Macnicol@student.anu.edu.au) know. Diffs against the standard
+ * distribution would be appreciated. Possible sources of problems are
+ * dirent and possibly the use of tmpnam().
+ */
+
+/* #define BUBBLES_IO */
+
+/*
+ * The following only makes sense if BUBBLES_IO above is defined.
+ *
+ * Uncomment the following if you always want to use the -file or
+ * -directory options on the command line and never to use a default bubble
+ * compiled into the program. This way you would save memory and disk space
+ * since if you do use -file or -directory only one bubble will be loaded
+ * into memory at any one time (and remember the default bubble is really
+ * uncompressed, unlike bubbles in files which can be compressed). This
+ * is disabled by default only so people running the program for the first
+ * time with no knowldege of the command line options don't get error
+ * messages ;)
+ *
+ * NOTE: You will still need to have a bubbles_default.c file, else the
+ * build sequence will fail. Well constructed bubbles_default.c files
+ * have #ifdef's which simply exclude everything else in the file at
+ * compile time. The bubblestodefault script does this.
+ */
+
+/* #define NO_DEFAULT_BUBBLE */
+
+/*
+ * This turns on any debugging messages and sanity checks. Hopefully you
+ * won't need this :) It slows things down a bit, too.
+ *
+ * NOTE: If you uncomment this you will get some messages about unused
+ * functions when you compile. You can ignore these - they refer to
+ * convenient checking routines which simply aren't called but are left
+ * in case someone wants to use them.
+ */
+
+/* #define DEBUG */
+
+/***************************************************************************
+ * Things you might need to change to get things working right *
+ ***************************************************************************/
+
+/*
+ * Name of the gzip binary. You shouldn't need to change this unless it's
+ * not in your PATH when the program is run, in which case you will need to
+ * substitute the full path here. Keep the double quotes else things won't
+ * compile!
+ */
+
+#define GZIP "gzip"
+
+/*
+ * Likewise for the Bourne shell.
+ */
+
+#define BOURNESH "sh"
+
+/*
+ * The name of the directory entry structure is different under Linux
+ * (under which this code is being developed) than other systems. The case
+ * alternate form here is that given in Kernighan & Ritchie's C book (which
+ * must be authoratitive, no?)
+ *
+ * 04/07/96 : People will have to hack this to get it working on some
+ * systems. I believe it doesn't work on SGI, for example.
+ */
+
+#ifdef _POSIX_SOURCE
+#define STRUCT_DIRENT struct dirent
+#else
+#define STRUCT_DIRENT Dirent
+#endif
+
+/*
+ * The naming of fields in struct dirent also seems to differ from system to
+ * system. This may have to be extended to make things truly portable.
+ * What we want here is the name field from a dirent struct pointed to
+ * by "dp".
+ *
+ * 04/07/96 : See above. This may need to be changed too.
+ */
+
+#ifdef _POSIX_SOURCE
+#define DIRENT_NAME dp->d_name
+#else
+#define DIRENT_NAME dp->name
+#endif
+
+/* I don't know why this isn't defined. */
+#ifdef linux
+/* apparently it is defined in recent linuxes. who knows. */
+/*extern char *tempnam(char *, char *);*/
+#endif
+
+/****************************************************************************
+ * Buffer lengths and things you probably won't need to touch *
+ ****************************************************************************/
+
+/* Maximum length of a full path name we can deal with */
+#define PATH_BUF_SIZE 1024
+
+/* Size of string passed to shell as command */
+#define COMMAND_BUF_SIZE 2500
+
+/* Size increments for read_line() buffers */
+#define READ_LINE_BUF_SIZE 24
+
+/* Maximum amount to drop a bubble */
+#define MAX_DROPPAGE 20
+
+/****************************************************************************
+ * End of options *
+ ****************************************************************************/
+
+/* Some machines define M_PI and not PI. If they don't define either, use
+own own. Really, the accuracy of this is _not_ very important. */
+#ifndef PI
+# define PI M_PI
+# ifndef M_PI
+# define M_PI 3.1415926535
+# endif
+#endif
+
+/* for delete_bubble_in_mesh() */
+#define DELETE_BUBBLE 0
+#define KEEP_BUBBLE 1
+
+/* Status codes for read_line */
+#define LINE_READ 0
+#define EOF_REACHED 1
+#define IO_ERROR 2
+
+/*
+ * Magic number for Bubble struct, in case it's trashed when debugging code
+ * (which happened to me often.... :(
+ */
+
+#define BUBBLE_MAGIC 5674
+
+/* Useful macros */
+#define MAX(A, B) ((A) > (B) ? (A) : (B))
+#define MIN(A, B) ((A) < (B) ? (A) : (B))
+
+/* How we represent bubbles */
+struct bub {
+ int radius;
+ int step; /* for rendered bubbles */
+ long area;
+ int x;
+ int y;
+ int magic;
+ int cell_index;
+ int visible;
+ struct bub *next;
+ struct bub *prev;
+};
+
+typedef struct bub Bubble;
+
+/*
+ * How we represent pixmaps of rendered bubbles. Because the range of radii
+ * available may not be continuous, we call each a step (for the lack of a
+ * better name...)
+ */
+
+struct bub_step {
+ int radius;
+ long area;
+ int droppage;
+ Pixmap ball, shape_mask;
+ GC draw_gc, erase_gc;
+ struct bub_step *next;
+};
+
+typedef struct bub_step Bubble_Step;
+
+extern void init_default_bubbles(void);
+extern int num_default_bubbles;
+typedef struct { const unsigned char *png; unsigned long size; } bubble_png;
+extern bubble_png default_bubbles[];
+
+#endif /* _BUBBLES_H_ */
diff --git a/hacks/bubbles.man b/hacks/bubbles.man
new file mode 100644
index 0000000..f9b892e
--- /dev/null
+++ b/hacks/bubbles.man
@@ -0,0 +1,140 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "14-Dec-95" "X Version 11"
+.SH NAME
+bubbles - frying pan / soft drink simulation
+.SH SYNOPSIS
+.B bubbles
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-simple] [\-broken] [\-3D] [\-rise|\-drop] [-trails]
+[\-fps]
+.SH DESCRIPTION
+\fIBubbles\fP sprays lots of little random bubbles all over the window which
+then grow until they reach their maximum size and go pop. The inspiration
+for this was watching little globules of oil on the bottom of a frying pan
+and it also looks a little like bubbles in fizzy soft drink. The default
+mode uses fancy ray-traced bubbles but there is also a mode which just draws
+circles in case the default mode is too taxing on your hardware.
+.SH OPTIONS
+Depending on how your
+.I bubbles
+was compiled, it accepts the following options:
+.TP 8
+.B \-foreground
+Colour of circles if \fI\-simple\fP mode is selected.
+.TP 8
+.B \-background
+Colour of window background.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay microseconds
+How much of a delay should be introduced between steps of the animation.
+Default 800, or about 800 microsecond. Actually, this is the delay between each
+group of 15 new bubbles since such a delay between each step results in a
+very slow animation rate.
+.TP 8
+.B \-nodelay
+Same as \fI\-delay 0\fP.
+.TP 8
+.B \-simple
+Don't use the default fancy pixmap bubbles. Just draw circles instead.
+This may give more bearable performance if your hardware wasn't made for
+this sort of thing.
+.TP 8
+.B \-broken
+Don't hide bubbles when they pop. This was a bug during development
+but the results were actually quite attractive.
+.TP 8
+.B \-3D
+Normally, the simulation is done completely in two dimensions. When a
+bubble swallows up another bubble, the areas of each are added to get
+the area of the resulting bubble. This option changes the algorithm
+to instead add volume (imagining each to be a sphere in 3D space). The
+whole thing looks more realistic but I find it attracts attention to
+the flickering of each bubble as they are move and are redrawn. Your
+mileage may vary.
+.TP 8
+.B \-quiet
+Don't print messages explaining why one or several command line options
+were ignored. This is disabled by default.
+.TP 8
+.B \-rise | \-drop
+.TP 8
+.B \-trails
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH NOTES
+If you find the pace of things too slow, remember that there is a delay
+even though you specify no \fI\-delay\fP option. Try using \fI\-nodelay\fP
+although beware of the effects of irritation of other users if you're on a
+shared system as you bleed their CPU time away.
+
+Some tools to assist in creation of new bubbles are included in the source
+distribution. These can either be loaded with the \fI\-file\fP or
+\fI\-directory\fP options (if available) or they can be used in place
+of the distributed default bubble (bubble_default.c).
+You might like to copy these scripts to a permanent location and
+use them. Read bubbles.README.
+
+Rendered bubbles are not supported on monochrome displays. I'm not
+convinced that small bubbles, even dithered properly are going to look
+like anything more than a jumble of random dots.
+.SH BUGS
+There is a delay before something appears on the screen when using
+rendered bubbles. The XPM library seems to take a \fBlong\fP time to make
+pixmaps out of raw data. This can be irritating on slower systems.
+
+The movement of the bubbles looks jerky if an incomplete set of bubbles
+is used.
+
+The hide/display algorithm could do with some work to avoid flickering
+when \fI\-nodelay\fP is set.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH DISTRIBUTION POLICY
+This work is Copyright \(co 1995, 1996 by James Macnicol. Permission
+to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided
+that the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation. No representations are made about the suitability of
+this software for any purpose. It is provided "as is" without express
+or implied warranty.
+.SH AUTHOR
+James Macnicol <james.macnicol@mailexcite.com>
diff --git a/hacks/bumps.c b/hacks/bumps.c
new file mode 100644
index 0000000..fa728e6
--- /dev/null
+++ b/hacks/bumps.c
@@ -0,0 +1,700 @@
+/* -*- mode: C; tab-width: 4 -*-
+ * Bumps, Copyright (c) 2002, 2006 Shane Smit <CodeWeaver@DigitalLoom.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Module: "bumps.c"
+ * Tab Size: 4
+ *
+ * Description:
+ * This is typical bump-mapping. The actual bump map is generated by a screen
+ * grab. The light source is represented by a spotlight of random color. This
+ * spotlight randomly traverses the bump map in a sinus pattern.
+ *
+ * Essentially, it 3D-izes your desktop, based on color intensity.
+ *
+ * Modification History:
+ * [10/01/1999] - Shane Smit: Creation
+ * [10/08/1999] - Shane Smit: Port to C. (Ick)
+ * [03/08/2002] - Shane Smit: New movement code.
+ * [09/12/2002] - Shane Smit: MIT-SHM XImages.
+ * Thanks to Kennett Galbraith <http://www.Alpha-II.com/>
+ * for code optimization.
+ * [10/09/2016] - Dave Odell: Updated for new xshm.c.
+ * Y2K compliance.
+ */
+
+
+#include <math.h>
+#include <time.h>
+#include <inttypes.h>
+#include "screenhack.h"
+#include "xshm.h"
+
+
+/* Defines: */
+/* #define VERBOSE */
+#define RANDOM() ((int) (random() & 0X7FFFFFFFL))
+
+typedef unsigned char BOOL;
+
+
+/* Globals: */
+
+static const char *bumps_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*color: random",
+ "*colorcount: 64",
+ "*delay: 30000",
+ "*duration: 120",
+ "*soften: 1",
+ "*invert: FALSE",
+#ifdef __sgi /* really, HAVE_READ_DISPLAY_EXTENSION */
+ "*visualID: Best",
+#endif
+#ifdef HAVE_XSHM_EXTENSION
+ "*useSHM: True",
+#endif /* HAVE_XSHM_EXTENSION */
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+ "*rotateImages: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec bumps_options [] = {
+ { "-color", ".color", XrmoptionSepArg, 0 },
+ { "-colorcount", ".colorcount", XrmoptionSepArg, 0 },
+ { "-duration", ".duration", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-soften", ".soften", XrmoptionSepArg, 0 },
+ { "-invert", ".invert", XrmoptionNoArg, "TRUE" },
+#ifdef HAVE_XSHM_EXTENSION
+ { "-shm", ".useSHM", XrmoptionNoArg, "True" },
+ { "-no-shm", ".useSHM", XrmoptionNoArg, "False" },
+#endif /* HAVE_XSHM_EXTENSION */
+
+ { 0, 0, 0, 0 }
+};
+
+
+/* This structure handles everything to do with the spotlight, and is designed to be
+ * a member of TBumps. */
+typedef struct
+{
+ uint8_t *aLightMap;
+ uint16_t nFalloffDiameter, nFalloffRadius;
+ uint16_t nLightDiameter, nLightRadius;
+ float nAccelX, nAccelY;
+ float nAccelMax;
+ float nVelocityX, nVelocityY;
+ float nVelocityMax;
+ float nXPos, nYPos;
+} SSpotLight;
+
+
+/* The entire program's operation is contained within this structure. */
+typedef struct
+{
+ /* XWindows specific variables. */
+ Display *dpy;
+ Window Win;
+ Screen *screen;
+ Pixmap source;
+ GC GraphicsContext;
+ XColor *xColors;
+ unsigned long *aColors;
+ XImage *pXImage;
+ XShmSegmentInfo XShmInfo;
+
+ uint8_t nColorCount; /* Number of colors used. */
+ uint8_t bytesPerPixel;
+ uint16_t iWinWidth, iWinHeight;
+ uint16_t *aBumpMap; /* The actual bump map. */
+ SSpotLight SpotLight;
+
+ int delay;
+ int duration;
+ time_t start_time;
+
+ async_load_state *img_loader;
+} SBumps;
+
+
+static void SetPalette(Display *, SBumps *, XWindowAttributes * );
+static void InitBumpMap(Display *, SBumps *, XWindowAttributes * );
+static void InitBumpMap_2(Display *, SBumps *);
+static void SoftenBumpMap( SBumps * );
+
+
+
+
+/* This function pointer will point to the appropriate PutPixel*() function below. */
+static void (*MyPutPixel)( int8_t *, uint32_t );
+
+static void PutPixel32( int8_t *pData, uint32_t pixel )
+{
+ *(uint32_t *)pData = pixel;
+}
+
+static void PutPixel24( int8_t *pData, uint32_t pixel )
+{
+ pData[ 2 ] = ( pixel & 0x00FF0000 ) >> 16;
+ pData[ 1 ] = ( pixel & 0x0000FF00 ) >> 8;
+ pData[ 0 ] = ( pixel & 0x000000FF );
+}
+
+static void PutPixel16( int8_t *pData, uint32_t pixel )
+{
+ *(uint16_t *)pData = (uint16_t)pixel;
+}
+
+static void PutPixel8( int8_t *pData, uint32_t pixel )
+{
+ *(uint8_t *)pData = (uint8_t)pixel;
+}
+
+/* Creates the light map, which is a circular image... going from black around the edges
+ * to white in the center. */
+static void CreateSpotLight( SSpotLight *pSpotLight, uint16_t iDiameter, uint16_t nColorCount )
+{
+ double nDist;
+ int16_t iDistX, iDistY;
+ uint8_t *pLOffset;
+
+ pSpotLight->nFalloffDiameter = iDiameter;
+ pSpotLight->nFalloffRadius = pSpotLight->nFalloffDiameter / 2;
+ pSpotLight->nLightDiameter = iDiameter / 2;
+ pSpotLight->nLightRadius = pSpotLight->nLightDiameter / 2;
+#ifdef VERBOSE
+ printf( "%s: Falloff Diameter: %d\n", progclass, pSpotLight->nFalloffDiameter );
+ printf( "%s: Spot Light Diameter: %d\n", progclass, pSpotLight->nLightDiameter );
+#endif
+
+ pSpotLight->aLightMap = malloc( pSpotLight->nLightDiameter * pSpotLight->nLightDiameter * sizeof(uint8_t) );
+
+ pLOffset = pSpotLight->aLightMap;
+ for( iDistY=-pSpotLight->nLightRadius; iDistY<pSpotLight->nLightRadius; ++iDistY )
+ {
+ for( iDistX=-pSpotLight->nLightRadius; iDistX<pSpotLight->nLightRadius; ++iDistX )
+ {
+ nDist = sqrt( pow( iDistX+0.5F, 2 ) + pow( iDistY+0.5F, 2 ) );
+ if( nDist / pSpotLight->nLightRadius <= 1.0f )
+ *pLOffset = (uint8_t)(nColorCount - ( ( nDist / pSpotLight->nLightRadius ) * ( nColorCount - 1 ) ));
+ else
+ *pLOffset = 0;
+
+ ++pLOffset;
+ }
+ }
+
+ /* Initialize movement variables. */
+ pSpotLight->nAccelX = 0;
+ pSpotLight->nAccelY = 0;
+ pSpotLight->nVelocityX = ( RANDOM() % 2 ) ? pSpotLight->nVelocityMax : -pSpotLight->nVelocityMax;
+ pSpotLight->nVelocityY = ( RANDOM() % 2 ) ? pSpotLight->nVelocityMax : -pSpotLight->nVelocityMax;
+}
+
+
+/* Calculates the position of the spot light on the screen. */
+static void CalcLightPos( SBumps *pBumps )
+{
+ SSpotLight *pSpotLight = &pBumps->SpotLight;
+ float nGravity;
+
+ /* X */
+ if( pSpotLight->nXPos < pSpotLight->nFalloffRadius ) nGravity = 1.0f;
+ else if( pSpotLight->nXPos > pBumps->iWinWidth - pSpotLight->nFalloffRadius ) nGravity = -1.0f;
+ else nGravity = ( ( RANDOM() % 201 ) / 100.0f ) - 1.0f;
+
+ pSpotLight->nAccelX += nGravity * ( pSpotLight->nAccelMax / 5.0f );
+ if( pSpotLight->nAccelX < -pSpotLight->nAccelMax ) pSpotLight->nAccelX = -pSpotLight->nAccelMax;
+ else if( pSpotLight->nAccelX > pSpotLight->nAccelMax ) pSpotLight->nAccelX = pSpotLight->nAccelMax;
+
+ pSpotLight->nVelocityX += pSpotLight->nAccelX;
+ if( pSpotLight->nVelocityX < -pSpotLight->nVelocityMax ) pSpotLight->nVelocityX = -pSpotLight->nVelocityMax;
+ else if( pSpotLight->nVelocityX > pSpotLight->nVelocityMax ) pSpotLight->nVelocityX = pSpotLight->nVelocityMax;
+
+ pSpotLight->nXPos += pSpotLight->nVelocityX;
+
+ /* Y */
+ if( pSpotLight->nYPos < pSpotLight->nFalloffRadius ) nGravity = 1.0f;
+ else if( pSpotLight->nYPos > pBumps->iWinHeight - pSpotLight->nFalloffRadius ) nGravity = -1.0f;
+ else nGravity = ( ( RANDOM() % 201 ) / 100.0f ) - 1.0f;
+
+ pSpotLight->nAccelY += nGravity * ( pSpotLight->nAccelMax / 5.0f );
+ if( pSpotLight->nAccelY < -pSpotLight->nAccelMax ) pSpotLight->nAccelY = -pSpotLight->nAccelMax;
+ else if( pSpotLight->nAccelY > pSpotLight->nAccelMax ) pSpotLight->nAccelY = pSpotLight->nAccelMax;
+
+ pSpotLight->nVelocityY += pSpotLight->nAccelY;
+ if( pSpotLight->nVelocityY < -pSpotLight->nVelocityMax ) pSpotLight->nVelocityY = -pSpotLight->nVelocityMax;
+ else if( pSpotLight->nVelocityY > pSpotLight->nVelocityMax ) pSpotLight->nVelocityY = pSpotLight->nVelocityMax;
+
+ pSpotLight->nYPos += pSpotLight->nVelocityY;
+}
+
+
+/* Main initialization function. */
+static void CreateBumps( SBumps *pBumps, Display *dpy, Window NewWin )
+{
+ XWindowAttributes XWinAttribs;
+ XGCValues GCValues;
+ int32_t nGCFlags;
+ uint16_t iDiameter;
+
+ /* Make size and velocity a function of window size, so it appears the same at 100x60 as it does in 3200x1200. */
+ XGetWindowAttributes( dpy, NewWin, &XWinAttribs );
+ pBumps->iWinWidth = XWinAttribs.width;
+ pBumps->iWinHeight = XWinAttribs.height;
+ pBumps->SpotLight.nXPos = XWinAttribs.width / 2.0f;
+ pBumps->SpotLight.nYPos = XWinAttribs.height / 2.0f;
+ pBumps->SpotLight.nVelocityMax = ( ( XWinAttribs.width < XWinAttribs.height ) ? XWinAttribs.width : XWinAttribs.height ) / 140.0f;
+ pBumps->SpotLight.nAccelMax = pBumps->SpotLight.nVelocityMax / 10.0f;
+ pBumps->dpy = dpy;
+ pBumps->Win = NewWin;
+ pBumps->screen = XWinAttribs.screen;
+
+ iDiameter = ( ( pBumps->iWinWidth < pBumps->iWinHeight ) ? pBumps->iWinWidth : pBumps->iWinHeight ) / 2;
+
+ /* jwz: sometimes we get tearing if this lands on the wrong bounaary;
+ constraining it to be a multiple of 8 seems to fix it. */
+ iDiameter = ((iDiameter+7)/8)*8;
+
+ pBumps->pXImage = create_xshm_image( pBumps->dpy, XWinAttribs.visual, XWinAttribs.depth,
+ ZPixmap, &pBumps->XShmInfo, iDiameter, iDiameter );
+
+ /* For speed, access the XImage data directly using my own PutPixel routine. */
+ switch( pBumps->pXImage->bits_per_pixel )
+ {
+ case 32:
+ pBumps->bytesPerPixel = 4;
+ MyPutPixel = PutPixel32;
+ break;
+
+ case 24:
+ pBumps->bytesPerPixel = 3;
+ MyPutPixel = PutPixel24;
+ break;
+
+ case 16:
+ pBumps->bytesPerPixel = 2;
+ MyPutPixel = PutPixel16;
+ break;
+
+ case 8:
+ pBumps->bytesPerPixel = 1;
+ MyPutPixel = PutPixel8;
+ break;
+
+ default:
+ fprintf( stderr, "%s: Unknown XImage depth.", progname );
+ destroy_xshm_image( pBumps->dpy, pBumps->pXImage, &pBumps->XShmInfo );
+ exit( 1 );
+ }
+
+ GCValues.function = GXcopy;
+ GCValues.subwindow_mode = IncludeInferiors;
+ nGCFlags = GCFunction;
+ if( use_subwindow_mode_p( XWinAttribs.screen, pBumps->Win ) ) /* See grabscreen.c */
+ nGCFlags |= GCSubwindowMode;
+ pBumps->GraphicsContext = XCreateGC( pBumps->dpy, pBumps->Win, nGCFlags, &GCValues );
+
+ SetPalette(dpy, pBumps, &XWinAttribs );
+ CreateSpotLight( &pBumps->SpotLight, iDiameter, pBumps->nColorCount );
+ InitBumpMap(dpy, pBumps, &XWinAttribs );
+}
+
+
+/* Creates a specialized phong shade palette. */
+static void SetPalette(Display *dpy, SBumps *pBumps, XWindowAttributes *pXWinAttribs )
+{
+ XColor BaseColor;
+ XColor Color;
+ char *sColor; /* Spotlight Color */
+ int16_t iColor;
+
+ sColor = get_string_resource(dpy, "color", "Color" );
+
+ BaseColor.red = RANDOM() % 0xFFFF;
+ BaseColor.green = RANDOM() % 0xFFFF;
+ BaseColor.blue = RANDOM() % 0xFFFF;
+
+ /* Make one color full intesity to avoid dark spotlights. */
+ switch( RANDOM() % 3 )
+ {
+ case 0: BaseColor.red = 0xFFFF; break;
+ case 1: BaseColor.green = 0xFFFF; break;
+ case 2: BaseColor.blue = 0xFFFF; break;
+ }
+
+ if( strcasecmp( sColor, "random" ) && !XParseColor( pBumps->dpy, pXWinAttribs->colormap, sColor, &BaseColor ) )
+ fprintf( stderr, "%s: color %s not found in database. Choosing random...\n", progname, sColor );
+
+#ifdef VERBOSE
+ printf( "%s: Spotlight color is <%d,%d,%d> RGB.\n", progclass, BaseColor.red, BaseColor.green, BaseColor.blue );
+#endif /* VERBOSE */
+
+ pBumps->nColorCount = get_integer_resource(dpy, "colorcount", "Integer" );
+ if( pBumps->nColorCount < 2 ) pBumps->nColorCount = 2;
+ if( pBumps->nColorCount > 128 ) pBumps->nColorCount = 128;
+
+ pBumps->aColors = malloc( pBumps->nColorCount * sizeof(unsigned long) );
+
+ /* Creates a phong shade: / BaseColor \ Index/ColorCount
+ * PhongShade = | ------------ | Index + ( 65535 - BaseColor )^
+ * \ ColorCount / */
+ pBumps->nColorCount--;
+ for( iColor=0; iColor<=pBumps->nColorCount; iColor++ )
+ {
+ Color.red = (uint16_t)( ( ( BaseColor.red / (double)pBumps->nColorCount ) * iColor ) + pow( 0xFFFF - BaseColor.red, iColor/(double)pBumps->nColorCount ) );
+ Color.green = (uint16_t)( ( ( BaseColor.green / (double)pBumps->nColorCount ) * iColor ) + pow( 0xFFFF - BaseColor.green, iColor/(double)pBumps->nColorCount ) );
+ Color.blue = (uint16_t)( ( ( BaseColor.blue / (double)pBumps->nColorCount ) * iColor ) + pow( 0xFFFF - BaseColor.blue, iColor/(double)pBumps->nColorCount ) );
+
+ if( !XAllocColor( pBumps->dpy, pXWinAttribs->colormap, &Color ) )
+ {
+ XFreeColors( pBumps->dpy, pXWinAttribs->colormap, pBumps->aColors, iColor, 0 );
+ free( pBumps->aColors );
+ pBumps->aColors = malloc( pBumps->nColorCount * sizeof(unsigned long) );
+ pBumps->nColorCount--;
+ iColor = -1;
+ }
+ else
+ pBumps->aColors[ iColor ] = Color.pixel;
+ }
+ pBumps->nColorCount++;
+
+#ifdef VERBOSE
+ printf( "%s: Allocated %d colors.\n", progclass, pBumps->nColorCount );
+#endif /* VERBOSE */
+
+ XSetWindowBackground( pBumps->dpy, pBumps->Win, pBumps->aColors[ 0 ] );
+}
+
+
+/* Grabs the current contents of the window to use an intensity-based bump map. */
+static void InitBumpMap(Display *dpy, SBumps *pBumps, XWindowAttributes *pXWinAttribs )
+{
+ pBumps->xColors = (XColor*)malloc( pBumps->iWinWidth * sizeof(XColor) );
+
+ if (pBumps->source) abort();
+ pBumps->source = XCreatePixmap(pBumps->dpy, pBumps->Win,
+ pXWinAttribs->width, pXWinAttribs->height,
+ pXWinAttribs->depth);
+ pBumps->img_loader = load_image_async_simple (0, pXWinAttribs->screen,
+ pBumps->Win, pBumps->source, 0, 0);
+}
+
+static void InitBumpMap_2(Display *dpy, SBumps *pBumps)
+{
+ XImage *pScreenImage;
+ XColor *pColor;
+ uint8_t nSoften;
+ uint16_t iWidth, iHeight;
+ uint32_t nAverager;
+ uint16_t *pBump;
+ uint16_t maxHeight;
+ double softenMultiplier = 1.0f;
+ BOOL bInvert = (BOOL)get_boolean_resource(dpy, "invert", "Boolean" );
+ XWindowAttributes XWinAttribs;
+ XGetWindowAttributes( pBumps->dpy, pBumps->Win, &XWinAttribs );
+
+ pBumps->start_time = time ((time_t *) 0);
+
+ pScreenImage = XGetImage( pBumps->dpy, pBumps->source, 0, 0,
+ pBumps->iWinWidth, pBumps->iWinHeight,
+ ~0L, ZPixmap );
+/* XFreePixmap (pBumps->dpy, pBumps->source);
+ pBumps->source = 0;*/
+
+ XSetWindowBackground( pBumps->dpy, pBumps->Win, pBumps->aColors[ 0 ] );
+ XClearWindow (pBumps->dpy, pBumps->Win);
+ XSync (pBumps->dpy, 0);
+
+ pBumps->aBumpMap = malloc( pBumps->iWinWidth * pBumps->iWinHeight * sizeof(uint16_t) );
+
+ nSoften = get_integer_resource(dpy, "soften", "Integer" );
+ while( nSoften-- )
+ softenMultiplier *= 1.0f + ( 1.0f / 3.0f ); /* Softening takes the max height down, so scale up to compensate. */
+ maxHeight = pBumps->SpotLight.nLightRadius * softenMultiplier;
+ nAverager = maxHeight ? ( 3 * 0xFFFF ) / maxHeight : 0;
+
+ pBump = pBumps->aBumpMap;
+ if( bInvert ) /* Funny, it's actually the 'else' that inverts the bump map... */
+ {
+ for( iHeight=0; iHeight<pBumps->iWinHeight; iHeight++ )
+ {
+ pColor = pBumps->xColors;
+ for( iWidth=0; iWidth<pBumps->iWinWidth; iWidth++ )
+ (pColor++)->pixel = XGetPixel( pScreenImage, iWidth, iHeight );
+
+ XQueryColors( pBumps->dpy, XWinAttribs.colormap, pBumps->xColors, pBumps->iWinWidth );
+
+ pColor = pBumps->xColors;
+ for( iWidth=pBumps->iWinWidth; iWidth; --iWidth, ++pColor, ++pBump )
+ *pBump = ( nAverager ? ( pColor->red + pColor->green + pColor->blue ) / nAverager : 0 );
+ }
+ }
+ else
+ {
+ for( iHeight=0; iHeight<pBumps->iWinHeight; iHeight++ )
+ {
+ pColor = pBumps->xColors;
+ for( iWidth=0; iWidth<pBumps->iWinWidth; iWidth++ )
+ (pColor++)->pixel = XGetPixel( pScreenImage, iWidth, iHeight );
+
+ XQueryColors( pBumps->dpy, XWinAttribs.colormap, pBumps->xColors, pBumps->iWinWidth );
+
+ pColor = pBumps->xColors;
+ for( iWidth=pBumps->iWinWidth; iWidth; --iWidth, ++pColor, ++pBump )
+ *pBump = ( maxHeight - ( nAverager ? ( pColor->red + pColor->green + pColor->blue ) / nAverager : 0 ) );
+ }
+ }
+
+ XDestroyImage( pScreenImage );
+
+ nSoften = get_integer_resource(dpy, "soften", "Integer" );
+#ifdef VERBOSE
+ if( nSoften ) printf( "%s: Softening Bump Map %d time(s)...\n", progclass, nSoften );
+#endif
+ while( nSoften-- )
+ SoftenBumpMap( pBumps );
+
+/* free( pBumps->xColors );
+ pBumps->xColors = 0;*/
+}
+
+/* Soften the bump map. This is to avoid pixelated-looking ridges.
+ * |-----|-----|-----|
+ * | 0% |12.5%| 0% | The adjacent pixels are averaged together
+ * |-----|-----|-----| first. Then than value is averaged with
+ * |12.5%| 50% |12.5%| the pixel is question. This essentially weights
+ * |-----|-----|-----| each pixel as shown on the left.
+ * | 0% |12.5%| 0% |
+ * |-----|-----|-----|
+ */
+static void SoftenBumpMap( SBumps *pBumps )
+{
+ uint16_t *pOffset, *pTOffset;
+ uint32_t nHeight;
+ uint32_t iWidth, iHeight;
+ uint16_t *aTempBuffer = malloc( pBumps->iWinWidth * pBumps->iWinHeight * sizeof(uint16_t) );
+
+ pOffset = pBumps->aBumpMap;
+ pTOffset = aTempBuffer;
+ for( iHeight=pBumps->iWinHeight; iHeight; --iHeight )
+ {
+ for( iWidth=pBumps->iWinWidth; iWidth; --iWidth, ++pOffset, ++pTOffset )
+ {
+ if( iHeight==pBumps->iWinHeight || iHeight==1 ||
+ iWidth==pBumps->iWinWidth || iWidth==1 )
+ {
+ *pTOffset = 0;
+ continue;
+ }
+
+ nHeight = pOffset[ -pBumps->iWinWidth ];
+ nHeight += pOffset[ 1 ];
+ nHeight += pOffset[ pBumps->iWinWidth ];
+ nHeight += pOffset[ -1 ];
+ nHeight >>= 2;
+ nHeight += pOffset[ 0 ];
+ nHeight >>= 1;
+ *pTOffset = nHeight;
+ }
+ }
+
+ memcpy( pBumps->aBumpMap, aTempBuffer, pBumps->iWinWidth * pBumps->iWinHeight * sizeof(uint16_t) );
+ free( aTempBuffer );
+}
+
+
+/* This is where we slap down some pixels... */
+static void Execute( SBumps *pBumps )
+{
+ int32_t nLightXPos, nLightYPos;
+ int32_t iScreenX, iScreenY;
+ int32_t iLightX, iLightY;
+ uint16_t *pBOffset;
+ int8_t *pDOffset;
+ int32_t nX, nY;
+ uint16_t nColor;
+ int32_t nLightOffsetFar = pBumps->SpotLight.nFalloffDiameter - pBumps->SpotLight.nLightRadius;
+
+ CalcLightPos( pBumps );
+
+ /* Offset to upper left hand corner. */
+ nLightXPos = pBumps->SpotLight.nXPos - pBumps->SpotLight.nFalloffRadius;
+ nLightYPos = pBumps->SpotLight.nYPos - pBumps->SpotLight.nFalloffRadius;
+
+ for( iScreenY=nLightYPos, iLightY=-pBumps->SpotLight.nLightRadius; iLightY<nLightOffsetFar; ++iScreenY, ++iLightY )
+ {
+ if( iScreenY < 0 ) continue;
+ else if( iScreenY >= pBumps->iWinHeight ) break;
+
+ /* warning: pointer targets in assignment differ in signedness
+ Should pDOffset be a int8? I can't tell. -jwz, 22-Jul-2003 */
+ pDOffset = (int8_t *) &pBumps->pXImage->data[ (iLightY+pBumps->SpotLight.nLightRadius) * pBumps->pXImage->bytes_per_line ];
+ pBOffset = pBumps->aBumpMap + ( iScreenY * pBumps->iWinWidth ) + nLightXPos;
+ for( iScreenX=nLightXPos, iLightX=-pBumps->SpotLight.nLightRadius; iLightX<nLightOffsetFar; ++iScreenX, ++iLightX, ++pBOffset, pDOffset+=pBumps->bytesPerPixel )
+ {
+ if( iScreenX < 0 ) continue;
+ else if( iScreenX >= pBumps->iWinWidth ) break;
+ else if( iScreenY == 0 || iScreenY >= pBumps->iWinHeight-2 ||
+ iScreenX == 0 || iScreenX >= pBumps->iWinWidth-2 )
+ {
+ MyPutPixel( pDOffset, pBumps->aColors[ 0 ] );
+ continue;
+ }
+
+ /* That's right folks, all the magic of bump mapping occurs in these two lines. (kinda disappointing, isn't it?) */
+ nX = ( pBOffset[ 1 ] - pBOffset[ 0 ] ) + iLightX;
+ nY = ( pBOffset[ pBumps->iWinWidth ] - pBOffset[ 0 ] ) + iLightY;
+
+ if( nX<0 || nX>=pBumps->SpotLight.nLightDiameter
+ || nY<0 || nY>=pBumps->SpotLight.nLightDiameter )
+ {
+ MyPutPixel( pDOffset, pBumps->aColors[ 0 ] );
+ continue;
+ }
+
+ nColor = pBumps->SpotLight.aLightMap[ ( nY * pBumps->SpotLight.nLightDiameter ) + nX ];
+ MyPutPixel( pDOffset, pBumps->aColors[ nColor ] );
+ }
+ }
+
+ /* Allow the spotlight to go *slightly* off the screen by clipping the XImage. */
+ iLightX = iLightY = 0; /* Use these for XImages X and Y now. */
+ nX = nY = pBumps->SpotLight.nFalloffDiameter; /* Use these for XImage width and height now. */
+ if( nLightXPos < 0 )
+ {
+ iLightX = -nLightXPos;
+ nX -= iLightX;
+ nLightXPos = 0;
+ }
+ else if( nLightXPos + nX >= pBumps->iWinWidth )
+ {
+ nX -= ( nLightXPos + nX ) - pBumps->iWinWidth;
+ }
+
+ if( nLightYPos < 0 )
+ {
+ iLightY = -nLightYPos;
+ nY -= iLightY;
+ nLightYPos = 0;
+ }
+ else if( nLightYPos + nY >= pBumps->iWinHeight )
+ {
+ nY -= ( nLightYPos + nY ) - pBumps->iWinHeight;
+ }
+
+ put_xshm_image( pBumps->dpy, pBumps->Win, pBumps->GraphicsContext, pBumps->pXImage, iLightX, iLightY, nLightXPos, nLightYPos,
+ nX, nY, &pBumps->XShmInfo);
+}
+
+
+static void DestroySpotLight( SSpotLight *pSpotLight ) { free( pSpotLight->aLightMap ); }
+
+/* Clean up */
+static void DestroyBumps( SBumps *pBumps )
+{
+ DestroySpotLight( &pBumps->SpotLight );
+ free( pBumps->aColors );
+ free( pBumps->aBumpMap );
+ destroy_xshm_image( pBumps->dpy, pBumps->pXImage, &pBumps->XShmInfo );
+}
+
+
+/* All messages to the screensaver are processed here. */
+static void *
+bumps_init (Display *dpy, Window Win)
+{
+ SBumps *Bumps = (SBumps *) calloc (1, sizeof(SBumps));
+
+#ifdef VERBOSE
+ time_t Time = time( NULL );
+ uint16_t iFrame = 0;
+#endif /* VERBOSE */
+
+ CreateBumps( Bumps, dpy, Win );
+ Bumps->delay = get_integer_resource(dpy, "delay", "Integer" );
+ Bumps->duration = get_integer_resource (dpy, "duration", "Seconds");
+ if (Bumps->delay < 0) Bumps->delay = 0;
+ if (Bumps->duration < 1) Bumps->duration = 1;
+ Bumps->start_time = time ((time_t *) 0);
+ return Bumps;
+}
+
+static unsigned long
+bumps_draw (Display *dpy, Window window, void *closure)
+{
+ SBumps *Bumps = (SBumps *) closure;
+
+ if (Bumps->img_loader) /* still loading */
+ {
+ Bumps->img_loader = load_image_async_simple (Bumps->img_loader, 0, 0, 0, 0, 0);
+ if (! Bumps->img_loader) /* just finished */
+ InitBumpMap_2(dpy, Bumps);
+ return Bumps->delay;
+ }
+
+ if (!Bumps->img_loader &&
+ Bumps->start_time + Bumps->duration < time ((time_t *) 0)) {
+ Bumps->img_loader = load_image_async_simple (0, Bumps->screen,
+ Bumps->Win, Bumps->source,
+ 0, 0);
+ }
+
+ Execute( Bumps );
+
+#ifdef VERBOSE
+ iFrame++;
+ if( Time - time( NULL ) )
+ {
+ printf( "FPS: %d\n", iFrame );
+ Time = time( NULL );
+ iFrame = 0;
+ }
+#endif /* VERBOSE */
+
+ return Bumps->delay;
+}
+
+static void
+bumps_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+bumps_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ SBumps *Bumps = (SBumps *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ Bumps->start_time = 0;
+ return True;
+ }
+
+ return False;
+}
+
+static void
+bumps_free (Display *dpy, Window window, void *closure)
+{
+ SBumps *Bumps = (SBumps *) closure;
+ DestroyBumps( Bumps );
+}
+
+
+XSCREENSAVER_MODULE ("Bumps", bumps)
+
+/* vim: ts=4
+ */
diff --git a/hacks/bumps.man b/hacks/bumps.man
new file mode 100644
index 0000000..8e47184
--- /dev/null
+++ b/hacks/bumps.man
@@ -0,0 +1,80 @@
+.TH XScreenSaver 1 "05-Apr-1999" "X Version 11"
+.SH NAME
+bumps - move distorting spotlight around desktop
+.SH SYNOPSIS
+.B bumps
+[\-display \fIhost:display.screen\fP]
+[\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP]
+[\-window]
+[\-root]
+[\-mono]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIusecs\fP]
+[\-duration \fIsecs\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIbumps\fP program takes an image and exposes small, distorted
+sections of it as if through an odd wandering spotlight beam.
+
+The image that it manipulates will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
+.SH OPTIONS
+.I bumps
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+Slow it down.
+.TP 8
+.B \-duration \fIseconds\fP
+How long to run before loading a new image. Default 120 seconds.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 1999 by Shane Smit. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH CREDITS
+Shane Smit <blackend@inconnect.com>, 8-Oct-1999.
diff --git a/hacks/ccurve.c b/hacks/ccurve.c
new file mode 100644
index 0000000..23b53e8
--- /dev/null
+++ b/hacks/ccurve.c
@@ -0,0 +1,866 @@
+/* ccurve, Copyright (c) 1998, 1999
+ * Rick Campbell <rick@campbellcentral.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ */
+
+/* Draw self-similar linear fractals including the classic ``C Curve''
+ *
+ * 16 Aug 1999 Rick Campbell <rick@campbellcentral.org>
+ * Eliminated sub-windows-with-backing-store-double-buffering crap in
+ * favor of drawing the new image in a pixmap and then splatting that on
+ * the window.
+ *
+ * 19 Dec 1998 Rick Campbell <rick@campbellcentral.org>
+ * Original version.
+ */
+
+#include <assert.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+#include "screenhack.h"
+#include "colors.h"
+#include "erase.h"
+
+#define SQRT3 (1.73205080756887729353)
+#define MAXIMUM_COLOR_COUNT (256)
+#define EPSILON (1e-5)
+
+typedef struct Position_struct
+{
+ double x;
+ double y;
+}
+Position;
+
+typedef struct Segment_struct
+{
+ double angle;
+ double length;
+}
+Segment;
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ int color_count;
+ int color_index;
+ Colormap color_map;
+ XColor colors [MAXIMUM_COLOR_COUNT];
+ int line_count;
+ int maximum_lines;
+ double plot_maximum_x;
+ double plot_maximum_y;
+ double plot_minimum_x;
+ double plot_minimum_y;
+ int total_lines;
+
+ unsigned long int background;
+ GC context;
+ Pixmap pixmap;
+ int width;
+ int height;
+ float delay;
+ float delay2;
+
+ int draw_index;
+
+ int draw_iterations;
+ double draw_maximum_x;
+ double draw_maximum_y;
+ double draw_minimum_x;
+ double draw_minimum_y;
+ int draw_segment_count;
+ Segment* draw_segments;
+ double draw_x1;
+ double draw_y1;
+ double draw_x2;
+ double draw_y2;
+};
+
+
+
+
+/* normalize alters the sequence to go from (0,0) to (1,0) */
+static void
+normalized_plot (int segment_count,
+ Segment* segments,
+ Position* points)
+{
+ double angle = 0.0;
+ double cosine = 0.0;
+ int index = 0;
+ double length = 0.0;
+ double sine = 0.0;
+ double x = 0.0;
+ double y = 0.0;
+
+ for (index = 0; index < segment_count; ++index)
+ {
+ Segment* segment = segments + index;
+ double length = segment->length;
+ double angle = segment->angle;
+
+ x += length * cos (angle);
+ y += length * sin (angle);
+ points [index].x = x;
+ points [index].y = y;
+ }
+ angle = -(atan2 (y, x));
+ cosine = cos (angle);
+ sine = sin (angle);
+ length = sqrt ((x * x) + (y * y));
+ /* rotate and scale */
+ for (index = 0; index < segment_count; ++index)
+ {
+ double temp_x = points [index].x;
+ double temp_y = points [index].y;
+ points [index].x = ((temp_x * cosine) + (temp_y * (-sine))) / length;
+ points [index].y = ((temp_x * sine) + (temp_y * cosine)) / length;
+ }
+}
+
+static void
+copy_points (int segment_count,
+ Position* source,
+ Position* target)
+{
+ int index = 0;
+
+ for (index = 0; index < segment_count; ++index)
+ {
+ target [index] = source [index];
+ }
+}
+
+static void
+realign (double x1,
+ double y1,
+ double x2,
+ double y2,
+ int segment_count,
+ Position* points)
+{
+ double angle = 0.0;
+ double cosine = 0.0;
+ double delta_x = 0.0;
+ double delta_y = 0.0;
+ int index = 0;
+ double length = 0.0;
+ double sine = 0.0;
+
+ delta_x = x2 - x1;
+ delta_y = y2 - y1;
+ angle = atan2 (delta_y, delta_x);
+ cosine = cos (angle);
+ sine = sin (angle);
+ length = sqrt ((delta_x * delta_x) + (delta_y * delta_y));
+ /* rotate, scale, then shift */
+ for (index = 0; index < segment_count; ++index)
+ {
+ double temp_x = points [index].x;
+ double temp_y = points [index].y;
+ points [index].x
+ = (length * ((temp_x * cosine) + (temp_y * (-sine)))) + x1;
+ points [index].y
+ = (length * ((temp_x * sine) + (temp_y * cosine))) + y1;
+ }
+}
+
+static Bool
+self_similar_normalized (struct state *st,
+ int iterations,
+ double x1,
+ double y1,
+ double x2,
+ double y2,
+ double maximum_x,
+ double maximum_y,
+ double minimum_x,
+ double minimum_y,
+ int segment_count,
+ Position* points)
+{
+ if (iterations == 0)
+ {
+ double delta_x = maximum_x - minimum_x;
+ double delta_y = maximum_y - minimum_y;
+ st->color_index = (int)(((double)(st->line_count * st->color_count))
+ / ((double)st->total_lines));
+ ++st->line_count;
+ XSetForeground (st->dpy, st->context, st->colors [st->color_index].pixel);
+ if (st->plot_maximum_x < x1) st->plot_maximum_x = x1;
+ if (st->plot_maximum_x < x2) st->plot_maximum_x = x2;
+ if (st->plot_maximum_y < y1) st->plot_maximum_y = y1;
+ if (st->plot_maximum_y < y2) st->plot_maximum_y = y2;
+ if (st->plot_minimum_x > x1) st->plot_minimum_x = x1;
+ if (st->plot_minimum_x > x2) st->plot_minimum_x = x2;
+ if (st->plot_minimum_y > y1) st->plot_minimum_y = y1;
+ if (st->plot_minimum_y > y2) st->plot_minimum_y = y2;
+ XDrawLine (st->dpy, st->pixmap, st->context,
+ (int)(((x1 - minimum_x) / delta_x) * st->width),
+ (int)(((maximum_y - y1) / delta_y) * st->height),
+ (int)(((x2 - minimum_x) / delta_x) * st->width),
+ (int)(((maximum_y - y2) / delta_y) * st->height));
+ }
+ else
+ {
+ int index = 0;
+ double next_x = 0.0;
+ double next_y = 0.0;
+ Position* replacement = (Position*)NULL;
+ double x = 0.0;
+ double y = 0.0;
+
+ replacement = (Position*)(malloc (segment_count * sizeof (Segment)));
+ copy_points (segment_count, points, replacement);
+ assert (fabs ((replacement [segment_count - 1].x) - 1.0) < EPSILON);
+ assert (fabs (replacement [segment_count - 1].y) < EPSILON);
+ realign (x1, y1, x2, y2, segment_count, replacement);
+ /* jwz: I don't understand what these assertions are supposed to
+ be detecting, but let's just bail on the fractal instead of
+ crashing. */
+/* assert (fabs (x2 - (replacement [segment_count - 1].x)) < EPSILON);
+ assert (fabs (y2 - (replacement [segment_count - 1].y)) < EPSILON);*/
+ if (fabs (x2 - (replacement [segment_count - 1].x)) >= EPSILON ||
+ fabs (y2 - (replacement [segment_count - 1].y)) >= EPSILON) {
+ free (replacement);
+ return False;
+ }
+ x = x1;
+ y = y1;
+ for (index = 0; index < segment_count; ++index)
+ {
+ next_x = replacement [index].x;
+ next_y = replacement [index].y;
+ if (!self_similar_normalized (st,
+ iterations - 1, x, y, next_x, next_y,
+ maximum_x, maximum_y,
+ minimum_x, minimum_y,
+ segment_count, points)) {
+ free(replacement);
+ return False;
+ }
+ x = next_x;
+ y = next_y;
+ }
+ free(replacement);
+ }
+ return True;
+}
+
+static void
+self_similar (struct state *st,
+ Pixmap pixmap,
+ GC context,
+ int width,
+ int height,
+ int iterations,
+ double x1,
+ double y1,
+ double x2,
+ double y2,
+ double maximum_x,
+ double maximum_y,
+ double minimum_x,
+ double minimum_y,
+ int segment_count,
+ Segment* segments)
+{
+ Position* points = (Position*)NULL;
+
+ points = (Position*)(malloc (segment_count * sizeof (Position)));
+ normalized_plot (segment_count, segments, points);
+ assert (fabs ((points [segment_count - 1].x) - 1.0) < EPSILON);
+ assert (fabs (points [segment_count - 1].y) < EPSILON);
+ self_similar_normalized (st, iterations,
+ x1, y1, x2, y2,
+ maximum_x, maximum_y,
+ minimum_x, minimum_y,
+ segment_count, points);
+ free((void*)points);
+}
+
+static
+double
+random_double (double base,
+ double limit,
+ double epsilon)
+{
+ double range = 0.0;
+ unsigned int steps = 0;
+
+ assert (base < limit);
+ assert (epsilon > 0.0);
+ range = limit - base;
+ steps = (unsigned int)(floor (range / epsilon));
+ return base + ((random () % steps) * epsilon);
+}
+
+static void
+select_2_pattern (Segment* segments)
+{
+ if ((random () % 2) == 0)
+ {
+ if ((random () % 2) == 0)
+ {
+ segments [0].angle = -M_PI_4;
+ segments [0].length = M_SQRT2;
+ segments [1].angle = M_PI_4;
+ segments [1].length = M_SQRT2;
+ }
+ else
+ {
+ segments [0].angle = M_PI_4;
+ segments [0].length = M_SQRT2;
+ segments [1].angle = -M_PI_4;
+ segments [1].length = M_SQRT2;
+ }
+ }
+ else
+ {
+ segments [0].angle
+ = random_double (M_PI / 6.0, M_PI / 3.0, M_PI / 180.0);
+ segments [0].length = random_double (0.25, 0.67, 0.001);
+ if ((random () % 2) == 0)
+ {
+ segments [1].angle = -(segments [0].angle);
+ segments [1].length = segments [0].length;
+ }
+ else
+ {
+ segments [1].angle = random_double ((-M_PI) / 3.0,
+ (-M_PI) / 6.0,
+ M_PI / 180.0);
+ segments [1].length = random_double (0.25, 0.67, 0.001);
+ }
+ }
+}
+
+static void
+select_3_pattern (Segment* segments)
+{
+ switch (random () % 5)
+ {
+ case 0:
+ if ((random () % 2) == 0)
+ {
+ segments [0].angle = M_PI_4;
+ segments [0].length = M_SQRT2 / 4.0;
+ segments [1].angle = -M_PI_4;
+ segments [1].length = M_SQRT2 / 2.0;
+ segments [2].angle = M_PI_4;
+ segments [2].length = M_SQRT2 / 4.0;
+ }
+ else
+ {
+ segments [0].angle = -M_PI_4;
+ segments [0].length = M_SQRT2 / 4.0;
+ segments [1].angle = M_PI_4;
+ segments [1].length = M_SQRT2 / 2.0;
+ segments [2].angle = -M_PI_4;
+ segments [2].length = M_SQRT2 / 4.0;
+ }
+ break;
+ case 1:
+ if ((random () % 2) == 0)
+ {
+ segments [0].angle = M_PI / 6.0;
+ segments [0].length = 1.0;
+ segments [1].angle = -M_PI_2;
+ segments [1].length = 1.0;
+ segments [2].angle = M_PI / 6.0;
+ segments [2].length = 1.0;
+ }
+ else
+ {
+ segments [0].angle = -M_PI / 6.0;
+ segments [0].length = 1.0;
+ segments [1].angle = M_PI_2;
+ segments [1].length = 1.0;
+ segments [2].angle = -M_PI / 6.0;
+ segments [2].length = 1.0;
+ }
+ break;
+ case 2:
+ case 3:
+ case 4:
+ segments [0].angle
+ = random_double (M_PI / 6.0, M_PI / 3.0, M_PI / 180.0);
+ segments [0].length = random_double (0.25, 0.67, 0.001);
+ segments [1].angle
+ = random_double (-M_PI / 3.0, -M_PI / 6.0, M_PI / 180.0);
+ segments [1].length = random_double (0.25, 0.67, 0.001);
+ if ((random () % 3) == 0)
+ {
+ if ((random () % 2) == 0)
+ {
+ segments [2].angle = segments [0].angle;
+ }
+ else
+ {
+ segments [2].angle = -(segments [0].angle);
+ }
+ segments [2].length = segments [0].length;
+ }
+ else
+ {
+ segments [2].angle
+ = random_double (-M_PI / 3.0, -M_PI / 6.0, M_PI / 180.0);
+ segments [2].length = random_double (0.25, 0.67, 0.001);
+ }
+ break;
+ }
+}
+
+static void
+select_4_pattern (Segment* segments)
+{
+ switch (random () % 9)
+ {
+ case 0:
+ if ((random () % 2) == 0)
+ {
+ double length = random_double (0.25, 0.50, 0.001);
+
+ segments [0].angle = 0.0;
+ segments [0].length = 0.5;
+ segments [1].angle = M_PI_2;
+ segments [1].length = length;
+ segments [2].angle = -M_PI_2;
+ segments [2].length = length;
+ segments [3].angle = 0.0;
+ segments [3].length = 0.5;
+ }
+ else
+ {
+ double length = random_double (0.25, 0.50, 0.001);
+
+ segments [0].angle = 0.0;
+ segments [0].length = 0.5;
+ segments [1].angle = -M_PI_2;
+ segments [1].length = length;
+ segments [2].angle = M_PI_2;
+ segments [2].length = length;
+ segments [3].angle = 0.0;
+ segments [3].length = 0.5;
+ }
+ break;
+ case 1:
+ if ((random () % 2) == 0)
+ {
+ segments [0].angle = 0.0;
+ segments [0].length = 0.5;
+ segments [1].angle = M_PI_2;
+ segments [1].length = 0.45;
+ segments [2].angle = -M_PI_2;
+ segments [2].length = 0.45;
+ segments [3].angle = 0.0;
+ segments [3].length = 0.5;
+ }
+ else
+ {
+ segments [0].angle = 0.0;
+ segments [0].length = 0.5;
+ segments [1].angle = -M_PI_2;
+ segments [1].length = 0.45;
+ segments [2].angle = M_PI_2;
+ segments [2].length = 0.45;
+ segments [3].angle = 0.0;
+ segments [3].length = 0.5;
+ }
+ break;
+ case 2:
+ if ((random () % 2) == 0)
+ {
+ segments [0].angle = 0.0;
+ segments [0].length = 1.0;
+ segments [1].angle = (5.0 * M_PI) / 12.0;
+ segments [1].length = 1.2;
+ segments [2].angle = (-5.0 * M_PI) / 12.0;
+ segments [2].length = 1.2;
+ segments [3].angle = 0.0;
+ segments [3].length = 1.0;
+ }
+ else
+ {
+ segments [0].angle = 0.0;
+ segments [0].length = 1.0;
+ segments [1].angle = (-5.0 * M_PI) / 12.0;
+ segments [1].length = 1.2;
+ segments [2].angle = (5.0 * M_PI) / 12.0;
+ segments [2].length = 1.2;
+ segments [3].angle = 0.0;
+ segments [3].length = 1.0;
+ }
+ break;
+ case 3:
+ if ((random () % 2) == 0)
+ {
+ double angle
+ = random_double (M_PI / 4.0,
+ M_PI_2,
+ M_PI / 180.0);
+
+ segments [0].angle = 0.0;
+ segments [0].length = 1.0;
+ segments [1].angle = angle;
+ segments [1].length = 1.2;
+ segments [2].angle = (-angle);
+ segments [2].length = 1.2;
+ segments [3].angle = 0.0;
+ segments [3].length = 1.0;
+ }
+ else
+ {
+ double angle
+ = random_double (M_PI / 4.0,
+ M_PI_2,
+ M_PI / 180.0);
+
+ segments [0].angle = 0.0;
+ segments [0].length = 1.0;
+ segments [1].angle = (-angle);
+ segments [1].length = 1.2;
+ segments [2].angle = angle;
+ segments [2].length = 1.2;
+ segments [3].angle = 0.0;
+ segments [3].length = 1.0;
+ }
+ break;
+ case 4:
+ if ((random () % 2) == 0)
+ {
+ double angle
+ = random_double (M_PI / 4.0,
+ M_PI_2,
+ M_PI / 180.0);
+
+ segments [0].angle = 0.0;
+ segments [0].length = 1.0;
+ segments [1].angle = angle;
+ segments [1].length = 1.2;
+ segments [2].angle = (-angle);
+ segments [2].length = 1.2;
+ segments [3].angle = 0.0;
+ segments [3].length = 1.0;
+ }
+ else
+ {
+ double angle
+ = random_double (M_PI / 4.0,
+ M_PI_2,
+ M_PI / 180.0);
+
+ segments [0].angle = 0.0;
+ segments [0].length = 1.0;
+ segments [1].angle = (-angle);
+ segments [1].length = 1.2;
+ segments [2].angle = angle;
+ segments [2].length = 1.2;
+ segments [3].angle = 0.0;
+ segments [3].length = 1.0;
+ }
+ break;
+ case 5:
+ if ((random () % 2) == 0)
+ {
+ double angle
+ = random_double (M_PI / 4.0,
+ M_PI_2,
+ M_PI / 180.0);
+ double length = random_double (0.25, 0.50, 0.001);
+
+ segments [0].angle = 0.0;
+ segments [0].length = 1.0;
+ segments [1].angle = angle;
+ segments [1].length = length;
+ segments [2].angle = (-angle);
+ segments [2].length = length;
+ segments [3].angle = 0.0;
+ segments [3].length = 1.0;
+ }
+ else
+ {
+ double angle
+ = random_double (M_PI / 4.0,
+ M_PI_2,
+ M_PI / 180.0);
+ double length = random_double (0.25, 0.50, 0.001);
+
+ segments [0].angle = 0.0;
+ segments [0].length = 1.0;
+ segments [1].angle = (-angle);
+ segments [1].length = length;
+ segments [2].angle = angle;
+ segments [2].length = length;
+ segments [3].angle = 0.0;
+ segments [3].length = 1.0;
+ }
+ break;
+ case 6:
+ case 7:
+ case 8:
+ segments [0].angle
+ = random_double (M_PI / 12.0, (11.0 * M_PI) / 12.0, 0.001);
+ segments [0].length = random_double (0.25, 0.50, 0.001);
+ segments [1].angle
+ = random_double (M_PI / 12.0, (11.0 * M_PI) / 12.0, 0.001);
+ segments [1].length = random_double (0.25, 0.50, 0.001);
+ if ((random () % 3) == 0)
+ {
+ segments [2].angle
+ = random_double (M_PI / 12.0, (11.0 * M_PI) / 12.0, 0.001);
+ segments [2].length = random_double (0.25, 0.50, 0.001);
+ segments [3].angle
+ = random_double (M_PI / 12.0, (11.0 * M_PI) / 12.0, 0.001);
+ segments [3].length = random_double (0.25, 0.50, 0.001);
+ }
+ else
+ {
+ if ((random () % 2) == 0)
+ {
+ segments [2].angle = -(segments [1].angle);
+ segments [2].length = segments [1].length;
+ segments [3].angle = -(segments [0].angle);
+ segments [3].length = segments [0].length;
+ }
+ else
+ {
+ segments [2].angle = segments [1].angle;
+ segments [2].length = segments [1].length;
+ segments [3].angle = segments [0].angle;
+ segments [3].length = segments [0].length;
+ }
+ }
+ break;
+ }
+}
+
+static void
+select_pattern (int segment_count,
+ Segment* segments)
+{
+ switch (segment_count)
+ {
+ case 2:
+ select_2_pattern (segments);
+ break;
+ case 3:
+ select_3_pattern (segments);
+ break;
+ case 4:
+ select_4_pattern (segments);
+ break;
+ default:
+ fprintf (stderr, "\nBad segment count, must be 2, 3, or 4.\n");
+ exit (1);
+ }
+}
+
+#define Y_START (0.5)
+
+static void *
+ccurve_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ unsigned long int black = 0;
+ int depth = 0;
+ XWindowAttributes hack_attributes;
+ XGCValues values;
+ unsigned long int white = 0;
+
+ st->dpy = dpy;
+ st->window = window;
+
+ st->delay = get_float_resource (st->dpy, "delay", "Integer");
+ st->delay2 = get_float_resource (st->dpy, "pause", "Integer");
+ st->maximum_lines = get_integer_resource (st->dpy, "limit", "Integer");
+ black = BlackPixel (st->dpy, DefaultScreen (st->dpy));
+ white = WhitePixel (st->dpy, DefaultScreen (st->dpy));
+ st->background = black;
+ XGetWindowAttributes (st->dpy, st->window, &hack_attributes);
+ st->width = hack_attributes.width;
+ st->height = hack_attributes.height;
+ depth = hack_attributes.depth;
+ st->color_map = hack_attributes.colormap;
+ st->pixmap = XCreatePixmap (st->dpy, st->window, st->width, st->height, depth);
+ values.foreground = white;
+ values.background = black;
+ st->context = XCreateGC (st->dpy, st->window, GCForeground | GCBackground,
+ &values);
+ st->color_count = MAXIMUM_COLOR_COUNT;
+ make_color_loop (hack_attributes.screen, hack_attributes.visual,
+ st->color_map,
+ 0, 1, 1,
+ 120, 1, 1,
+ 240, 1, 1,
+ st->colors, &st->color_count, True, False);
+ if (st->color_count <= 0)
+ {
+ st->color_count = 1;
+ st->colors [0].red = st->colors [0].green = st->colors [0].blue = 0xFFFF;
+ XAllocColor (st->dpy, st->color_map, &st->colors [0]);
+ }
+
+ st->draw_maximum_x = 1.20;
+ st->draw_maximum_y = 0.525;
+ st->draw_minimum_x = -0.20;
+ st->draw_minimum_y = -0.525;
+ st->draw_x2 = 1.0;
+
+ return st;
+}
+
+static unsigned long
+ccurve_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ static const int lengths [] = { 4, 4, 4, 4, 4, 3, 3, 3, 2 };
+
+ if (st->draw_index == 0)
+ {
+ st->draw_segment_count
+ = lengths [random () % (sizeof (lengths) / sizeof (int))];
+ st->draw_segments
+ = (Segment*)(malloc ((st->draw_segment_count) * sizeof (Segment)));
+ select_pattern (st->draw_segment_count, st->draw_segments);
+ st->draw_iterations = floor (log (st->maximum_lines)
+ / log (((double)(st->draw_segment_count))));
+ if ((random () % 3) != 0)
+ {
+ double factor = 0.45;
+ st->draw_x1 += random_double (-factor, factor, 0.001);
+ st->draw_y1 += random_double (-factor, factor, 0.001);
+ st->draw_x2 += random_double (-factor, factor, 0.001);
+ st->draw_y2 += random_double (-factor, factor, 0.001);
+ }
+/* background = (random () % 2) ? black : white; */
+
+ }
+
+ /* for (st->draw_index = 0; st->draw_index < st->draw_iterations; ++st->draw_index) */
+ {
+ double delta_x = 0.0;
+ double delta_y = 0.0;
+
+ XSetForeground (st->dpy, st->context, st->background);
+ XFillRectangle (st->dpy, st->pixmap, st->context, 0, 0, st->width, st->height);
+ st->line_count = 0;
+ st->total_lines = (int)(pow ((double)(st->draw_segment_count),
+ (double)st->draw_index));
+ st->plot_maximum_x = -1000.00;
+ st->plot_maximum_y = -1000.00;
+ st->plot_minimum_x = 1000.00;
+ st->plot_minimum_y = 1000.00;
+ self_similar (st, st->pixmap, st->context, st->width, st->height, st->draw_index,
+ st->draw_x1, st->draw_y1, st->draw_x2, st->draw_y2,
+ st->draw_maximum_x,
+ st->draw_maximum_y,
+ st->draw_minimum_x,
+ st->draw_minimum_y,
+ st->draw_segment_count, st->draw_segments);
+ delta_x = st->plot_maximum_x - st->plot_minimum_x;
+ delta_y = st->plot_maximum_y - st->plot_minimum_y;
+ st->draw_maximum_x = st->plot_maximum_x + (delta_x * 0.2);
+ st->draw_maximum_y = st->plot_maximum_y + (delta_y * 0.2);
+ st->draw_minimum_x = st->plot_minimum_x - (delta_x * 0.2);
+ st->draw_minimum_y = st->plot_minimum_y - (delta_y * 0.2);
+ delta_x = st->draw_maximum_x - st->draw_minimum_x;
+ delta_y = st->draw_maximum_y - st->draw_minimum_y;
+ if ((delta_y / delta_x) > (((double)st->height) / ((double)st->width)))
+ {
+ double new_delta_x
+ = (delta_y * ((double)st->width)) / ((double)st->height);
+ st->draw_minimum_x -= (new_delta_x - delta_x) / 2.0;
+ st->draw_maximum_x += (new_delta_x - delta_x) / 2.0;
+ }
+ else
+ {
+ double new_delta_y
+ = (delta_x * ((double)st->height)) / ((double)st->width);
+ st->draw_minimum_y -= (new_delta_y - delta_y) / 2.0;
+ st->draw_maximum_y += (new_delta_y - delta_y) / 2.0;
+ }
+ XCopyArea (st->dpy, st->pixmap, st->window, st->context, 0, 0, st->width, st->height,
+ 0, 0);
+ }
+ st->draw_index++;
+ /* #### mi->recursion_depth = st->draw_index; */
+
+ if (st->draw_index >= st->draw_iterations)
+ {
+ st->draw_index = 0;
+ free((void*)st->draw_segments);
+ st->draw_segments = 0;
+ return (int) (1000000 * st->delay);
+ }
+ else
+ return (int) (1000000 * st->delay2);
+}
+
+static void
+ccurve_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ XWindowAttributes xgwa;
+ st->width = w;
+ st->height = h;
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ XFreePixmap (dpy, st->pixmap);
+ st->pixmap = XCreatePixmap (st->dpy, st->window, st->width, st->height,
+ xgwa.depth);
+}
+
+static Bool
+ccurve_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->draw_index = 0;
+ return True;
+ }
+ return False;
+}
+
+static void
+ccurve_free (Display *dpy, Window window, void *closure)
+{
+}
+
+
+static const char *ccurve_defaults [] =
+{
+ ".background: black",
+ ".foreground: white",
+ ".delay: 3",
+ ".pause: 0.4",
+ ".limit: 200000",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec ccurve_options [] =
+{
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-pause", ".pause", XrmoptionSepArg, 0 },
+ { "-limit", ".limit", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("CCurve", ccurve)
diff --git a/hacks/ccurve.man b/hacks/ccurve.man
new file mode 100644
index 0000000..93b81fc
--- /dev/null
+++ b/hacks/ccurve.man
@@ -0,0 +1,60 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+ccurve - self-similar linear fractals.
+.SH SYNOPSIS
+.B ccurve
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-pause \fInumber\fP]
+[\-limit \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Generates self-similar linear fractals, including the classic ``C Curve.''
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Delay. 0 - 60. Default: 1.
+.TP 8
+.B \-pause \fInumber\fP
+Duration. 1 - 60. Default: 3.
+.TP 8
+.B \-limit \fInumber\fP
+Density. 3 - 300000. Default: 200000.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Rick Campbell. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Rick Campbell.
diff --git a/hacks/celtic.c b/hacks/celtic.c
new file mode 100644
index 0000000..890b398
--- /dev/null
+++ b/hacks/celtic.c
@@ -0,0 +1,1131 @@
+/* celtic, Copyright (c) 2006 Max Froumentin <max@lapin-bleu.net>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * A celtic pattern programme inspired by "Les Entrelacs Celtes", by
+ * Christian Mercat, Dossier Pour La Science, no. 47, april/june 2005.
+ * See <http://www.entrelacs.net/>
+ */
+
+#include <math.h>
+#include "screenhack.h"
+#include "erase.h"
+
+#define SQRT_3 1.73205080756887729352
+#undef assert
+#define assert(EXP) do { if (!((EXP))) abort(); } while(0)
+
+/*-----------------------------------------*/
+
+struct params {
+ unsigned long curve_width, shadow_width;
+ double shape1, shape2;
+ unsigned long margin;
+
+ enum graph_type { polar, tgrid, kennicott, triangle } type;
+ unsigned long edge_size;
+ unsigned long cluster_size; /* only used if type is kennicott */
+ unsigned long delay; /* controls curve drawing speed (step delay
+ * in microsecs) */
+ unsigned long nsteps; /* only if triangle: number of subdivisions along the side */
+ unsigned long nb_orbits; /* only used if type is polar */
+ unsigned long nb_nodes_per_orbit; /* only used if type is polar */
+
+ double angle; /* angle of rotation of the graph around the centre */
+};
+
+/*-----------------------------------------*/
+typedef enum direction {
+ CLOCKWISE=0, ANTICLOCKWISE=1
+} Direction;
+
+
+/*-----------------------------------------*/
+typedef struct array {
+ int nb_elements;
+ int nb_allocated_elements;
+ int increment;
+ void **elements;
+} *Array;
+
+typedef struct graph {
+ Array nodes;
+ Array edges;
+} *Graph;
+
+typedef struct edge_couple {
+ int **array;
+ int size;
+} *EdgeCouple;
+
+typedef struct pattern {
+ double shape1, shape2;
+ EdgeCouple ec;
+ Graph graph;
+ Array splines;
+ int ncolors;
+} *Pattern;
+
+struct state {
+ Display *dpy;
+ Window window;
+ eraser_state *eraser;
+
+ int ncolors;
+ XColor *colors;
+ GC gc,shadow_gc,gc_graph;
+
+ Bool showGraph;
+ Pattern pattern;
+ Graph graph;
+ XWindowAttributes xgwa;
+ int delay2;
+ int reset, force_reset;
+ double t;
+
+ struct params params;
+};
+
+
+
+
+static Array array_new(int increment)
+{
+ Array new;
+ assert(new=(Array)calloc(1,sizeof(struct array)));
+ new->nb_elements=0;
+ new->nb_allocated_elements=0;
+ new->increment=increment;
+ return new;
+}
+
+static void array_del(Array a, void (*free_element)(void*))
+{
+ int i;
+ if (free_element)
+ for (i=0;i<a->nb_elements;i++)
+ free_element(a->elements[i]);
+ free(a->elements);
+ free(a);
+}
+
+static void array_add_element(Array a, void *element)
+{
+ if (a->nb_elements == a->nb_allocated_elements) {
+ /* we must allocate more */
+ a->nb_allocated_elements+=a->increment;
+ a->elements=realloc(a->elements,a->nb_allocated_elements*sizeof(void *));
+ }
+ a->elements[a->nb_elements++]=element;
+}
+/*-----------------------------------------*/
+
+typedef struct node {
+ double x,y;
+ Array edges;
+} *Node;
+
+typedef struct edge {
+ Node node1, node2;
+ double angle1, angle2;
+} *Edge;
+
+/*-----------------------------------------*/
+/* Node functions */
+
+static Node node_new(double x, double y)
+{
+ Node new;
+ assert(new = (Node)calloc(1,sizeof(struct node)));
+ new->x=x;
+ new->y=y;
+ new->edges = array_new(10);
+ return new;
+}
+
+static void node_del(void *n)
+{ /* not Node * because the function is passed to array_del */
+ array_del(((Node)n)->edges,NULL);
+ free(n);
+}
+
+#if 0
+static void node_to_s(Node n, FILE *f)
+{
+ fprintf(f,"Node: %g %g\n",n->x,n->y);
+}
+#endif
+
+static void node_draw(struct state *st, Node n)
+{
+ XDrawArc(st->dpy,st->window,st->gc_graph,(int)rint(n->x)-5,(int)rint(n->y)-5,10,10,0,360*64);
+}
+
+static void node_add_edge(Node n, Edge e)
+{
+ array_add_element(n->edges,e);
+}
+
+
+/*-----------------------------------------*/
+/* Edge functions */
+
+static Edge edge_new(Node n1, Node n2)
+{
+ Edge new;
+ assert(new = (Edge)calloc(1,sizeof(struct edge)));
+ new->node1=n1;
+ new->node2=n2;
+ new->angle1=atan2(new->node2->y - new->node1->y, new->node2->x - new->node1->x);
+ if (new->angle1 < 0) new->angle1+=6.28;
+
+ new->angle2=atan2(new->node1->y - new->node2->y, new->node1->x - new->node2->x);
+ if (new->angle2 < 0) new->angle2+=6.28;
+ return new;
+}
+
+static void edge_del(void *e) /* not Edge * because the function is passed to array_del */
+{
+ free(e);
+}
+
+#if 0
+static void edge_to_s(Edge e, FILE *f)
+{
+ fprintf(f,"Edge: (%g, %g), (%g, %g) angles: %g, %g\n",
+ e->node1->x, e->node1->y, e->node2->x, e->node2->y,
+ e->angle1, e->angle2);
+}
+#endif
+
+static void edge_draw(struct state *st, Edge e)
+{
+ XDrawLine(st->dpy,st->window,st->gc_graph, e->node1->x, e->node1->y, e->node2->x, e->node2->y);
+}
+
+static double edge_angle(Edge e, Node n)
+{
+ /* returns the angle of the edge at Node n */
+ assert(n==e->node1 || n==e->node2);
+ if (n==e->node1) return e->angle1; else return e->angle2;
+}
+
+static Node edge_other_node(Edge e, Node n)
+{
+ assert(n==e->node1 || n==e->node2);
+ if (n==e->node1) return e->node2; else return e->node1;
+}
+
+static double edge_angle_to(Edge e, Edge e2, Node node, Direction direction)
+{
+ /* returns the absolute angle from this edge to "edge2" around
+ "node" following "direction" */
+ double a;
+
+ if (direction==CLOCKWISE)
+ a=edge_angle(e,node) - edge_angle(e2,node);
+ else
+ a=edge_angle(e2,node) - edge_angle(e,node);
+
+ if (a<0) return a+2*M_PI; else return a;
+}
+
+/*-----------------------------------------*/
+
+static Graph graph_new(struct state *st)
+{
+ Graph new;
+ assert(new = (Graph)calloc(1,sizeof(struct graph)));
+ new->nodes = array_new(100);
+ new->edges = array_new(100);
+ return new;
+}
+
+static void graph_del(Graph g)
+{
+ array_del(g->nodes, &node_del);
+ array_del(g->edges, &edge_del);
+ free(g);
+}
+
+
+static void graph_add_node(Graph g, Node n)
+{
+ array_add_element(g->nodes, n);
+}
+
+static void graph_add_edge(Graph g, Edge e)
+{
+ array_add_element(g->edges, e);
+
+ /* for each node n of e, add n to pointer e */
+ node_add_edge(e->node1, e);
+ node_add_edge(e->node2, e);
+}
+
+static Edge graph_next_edge_around(Graph g, Node n, Edge e, Direction direction)
+{
+ /* return the next edge after e around node n clockwise */
+ double angle, minangle=20;
+ Edge next_edge = e, edge;
+ int i;
+
+ for (i=0;i<n->edges->nb_elements;i++) {
+ edge=n->edges->elements[i];
+ if (edge != e) {
+ angle = edge_angle_to(e,edge,n,direction);
+ if (angle < minangle) {
+ next_edge=edge;
+ minangle=angle;
+ }
+ }
+ }
+ return next_edge;
+}
+
+#if 0
+static void graph_to_s(Graph g, FILE *f)
+{
+ int i;
+ for (i=0;i<g->nodes->nb_elements;i++)
+ node_to_s(g->nodes->elements[i],f);
+ for (i=0;i<g->edges->nb_elements;i++)
+ edge_to_s(g->edges->elements[i],f);
+}
+#endif
+
+static void graph_draw(struct state *st, Graph g)
+{
+ int i;
+
+ for (i=0;i<g->nodes->nb_elements;i++)
+ node_draw(st, g->nodes->elements[i]);
+ for (i=0;i<g->edges->nb_elements;i++)
+ edge_draw(st, g->edges->elements[i]);
+}
+
+static void graph_rotate(Graph g, double angle, int cx, int cy)
+{
+ /* rotate all the nodes of the graph around the centre */
+ int i;
+ float c=cos(angle),s=sin(angle),x,y;
+ Node n;
+ for (i=0;i<g->nodes->nb_elements;i++) {
+ n=g->nodes->elements[i];
+ x=n->x; y=n->y;
+ n->x = (x-cx)*c-(y-cy)*s + cx;
+ n->y = (x-cx)*s+(y-cy)*c + cy;
+ }
+}
+
+
+/*---------------------------*/
+
+static Graph make_polar_graph(struct state *st,
+ int xmin, int ymin, int width, int height,
+ int nbp, /* number of points on each orbit */
+ int nbo /* number of orbits */)
+ /* make a simple grid graph, with edges present or absent randomly */
+{
+ int cx = width/2+xmin, cy=height/2+ymin; /* centre */
+ int os = (width<height?width:height)/(2*nbo); /* orbit height */
+ Graph g;
+ Node *grid;
+ int o,p;
+
+ /* generate nodes */
+ assert(grid=(Node*)calloc(1+nbp*nbo,sizeof(Node)));
+ assert(g=graph_new(st));
+
+ graph_add_node(g, grid[0]=node_new((double)cx,(double)cy));
+
+ for (o=0;o<nbo;o++)
+ for (p=0;p<nbp;p++)
+ graph_add_node(g,
+ grid[1+o*nbp+p]=node_new(cx+(o+1)*os*sin(p*2*M_PI/nbp),
+ cy+(o+1)*os*cos(p*2*M_PI/nbp)));
+
+
+ /* generate edges */
+ for (o=0;o<nbo;o++)
+ for (p=0;p<nbp;p++) {
+ if (o==0) /* link first orbit nodes with centre */
+ graph_add_edge(g,edge_new(grid[1+o*nbp+p],grid[0]));
+ else /* liink orbit nodes with lower orbit */
+ graph_add_edge(g,edge_new(grid[1+o*nbp+p],grid[1+(o-1)*nbp+p]));
+ /* link along orbit */
+ graph_add_edge(g,edge_new(grid[1+o*nbp+p],
+ grid[1+o*nbp+(p+1)%nbp]));
+ }
+
+ free(grid);
+ return g;
+}
+
+
+static Graph make_grid_graph(struct state *st,
+ int xmin, int ymin, int width, int height, int step)
+ /* make a simple grid graph */
+{
+ Graph g;
+ int row,col,x,y;
+ int size=(width<height?height:width);
+
+ /* empirically, it seems there are 2 curves only if both
+ nbcol and nbrow are even, so we round them to even */
+ int nbcol=(2+size/step)/2*2, nbrow=(2+size/step)/2*2;
+
+ Node *grid;
+ assert(grid=(Node*)calloc(nbrow*nbcol,sizeof(Node)));
+ assert(g=graph_new(st));
+
+
+ /* adjust xmin and xmax so that the grid is centered */
+ xmin+=(width-(nbcol-1)*step)/2;
+ ymin+=(height-(nbrow-1)*step)/2;
+
+ /* create node grid */
+ for (row=0;row<nbrow;row++)
+ for (col=0;col<nbcol;col++) {
+ x=col*step+xmin;
+ y=row*step+ymin;
+ grid[row+col*nbrow]=node_new((double)x, (double)y);
+ graph_add_node(g, grid[row+col*nbrow]);
+ }
+
+ /* create edges */
+ for (row=0;row<nbrow;row++)
+ for (col=0;col<nbcol;col++) {
+ if (col!=nbcol-1)
+ graph_add_edge(g,edge_new(grid[row+col*nbrow],
+ grid[row+(col+1)*nbrow]));
+ if (row!=nbrow-1)
+ graph_add_edge(g,edge_new(grid[row+col*nbrow],grid[row+1+col*nbrow]));
+ if (col!=nbcol-1 && row!=nbrow-1) {
+ graph_add_edge(g,edge_new(grid[row+col*nbrow],
+ grid[row+1+(col+1)*nbrow]));
+ graph_add_edge(g,edge_new(grid[row+1+col*nbrow],
+ grid[row+(col+1)*nbrow]));
+ }
+ }
+
+ free(grid);
+
+ return g;
+}
+
+
+static Graph make_triangle_graph(struct state *st,
+ int xmin, int ymin, int width, int height, int edge_size)
+{
+ Graph g;
+ Node *grid;
+ int row,col;
+ double L=(width<height?width:height)/2.0; /* circumradius of the triangle */
+ double cx=xmin+width/2.0, cy=ymin+height/2.0; /* centre of the triangle */
+ double p2x=cx-L*SQRT_3/2.0, p2y=cy+L/2.0; /* p2 is the bottom left vertex */
+ double x,y;
+ int nsteps=3*L/(SQRT_3*edge_size);
+
+ assert(grid=(Node*)calloc((nsteps+1)*(nsteps+1),sizeof(Node)));
+ assert(g=graph_new(st));
+
+ /* create node grid */
+ for (row=0;row<=nsteps;row++)
+ for (col=0;col<=nsteps;col++)
+ if (row+col<=nsteps) {
+ x=p2x+col*L*SQRT_3/nsteps + row*L*SQRT_3/(2*nsteps);
+ y=p2y-row*3*L/(2*nsteps);
+ grid[col+row*(nsteps+1)]=node_new((double)x, (double)y);
+ graph_add_node(g, grid[col+row*(nsteps+1)]);
+ }
+
+ /* create edges */
+ for (row=0;row<nsteps;row++)
+ for (col=0;col<nsteps;col++)
+ if (row+col<nsteps) {
+ /* horizontal edges */
+ graph_add_edge(g,edge_new(grid[row+col*(nsteps+1)],grid[row+(col+1)*(nsteps+1)]));
+ /* vertical edges */
+ graph_add_edge(g,edge_new(grid[row+col*(nsteps+1)],grid[row+1+col*(nsteps+1)]));
+ /* diagonal edges */
+ graph_add_edge(g,edge_new(grid[row+1+col*(nsteps+1)],grid[row+(col+1)*(nsteps+1)]));
+ }
+
+ free(grid);
+ return g;
+
+}
+
+
+static Graph make_kennicott_graph(struct state *st,
+ int xmin, int ymin, int width, int height, int step,
+ int cluster_size)
+ /* make a graph inspired by one of the motifs from the Kennicott bible */
+ /* square grid of clusters of the shape /|\
+ * ---
+ * \|/
+ * cluster_size is the length of an edge of a cluster
+ */
+{
+ Graph g;
+ int row,col,x,y;
+ int size=width<height?height:width;
+ int nbcol=(1+size/step)/2*2, nbrow=(1+size/step)/2*2;
+ Node *grid;
+
+ /* there are 5 nodes by for each cluster */
+ assert(grid=(Node*)calloc(5*nbrow*nbcol,sizeof(Node)));
+ assert(g=graph_new(st));
+
+ /* adjust xmin and xmax so that the grid is centered */
+ xmin+=(width-(nbcol-1)*step)/2;
+ ymin+=(height-(nbrow-1)*step)/2;
+
+ /* create node grid */
+ for (row=0;row<nbrow;row++)
+ for (col=0;col<nbcol;col++) {
+ int ci=5*(row+col*nbrow);
+ x=col*step+xmin;
+ y=row*step+ymin;
+
+ /* create a cluster centred on x,y */
+ grid[ci ]=node_new((double)x, (double)y);
+ grid[ci+1]=node_new((double)(x+cluster_size), (double)y);
+ grid[ci+2]=node_new((double)x, (double)(y-cluster_size));
+ grid[ci+3]=node_new((double)(x-cluster_size), (double)y);
+ grid[ci+4]=node_new((double)x, (double)(y+cluster_size));
+
+ graph_add_node(g, grid[ci]);
+ graph_add_node(g, grid[ci+1]);
+ graph_add_node(g, grid[ci+2]);
+ graph_add_node(g, grid[ci+3]);
+ graph_add_node(g, grid[ci+4]);
+
+ /* internal edges */
+ graph_add_edge(g,edge_new(grid[ci], grid[ci+1]));
+ graph_add_edge(g,edge_new(grid[ci], grid[ci+2]));
+ graph_add_edge(g,edge_new(grid[ci], grid[ci+3]));
+ graph_add_edge(g,edge_new(grid[ci], grid[ci+4]));
+ graph_add_edge(g,edge_new(grid[ci+1], grid[ci+2]));
+ graph_add_edge(g,edge_new(grid[ci+2], grid[ci+3]));
+ graph_add_edge(g,edge_new(grid[ci+3], grid[ci+4]));
+ graph_add_edge(g,edge_new(grid[ci+4], grid[ci+1]));
+
+ }
+
+ /* create inter-cluster edges */
+ for (row=0;row<nbrow;row++)
+ for (col=0;col<nbcol;col++) {
+ if (col!=nbcol-1)
+ /* horizontal edge from edge 1 of cluster (row, col) to edge 3
+ * of cluster (row,col+1) */
+ graph_add_edge(g,edge_new(grid[5*(row+col*nbrow)+1],grid[5*(row+(col+1)*nbrow)+3]));
+ if (row!=nbrow-1)
+ /* vertical edge from edge 4 of cluster (row, col) to edge 2
+ * of cluster (row+1,col) */
+ graph_add_edge(g,edge_new(grid[5*(row+col*nbrow)+4],
+ grid[5*(row+1+col*nbrow)+2]));
+ }
+ free(grid);
+ return g;
+}
+
+/*---------------------------*/
+typedef struct spline_segment {
+ double x1,y1,x2,y2,x3,y3,x4,y4;
+} *SplineSegment;
+
+typedef struct spline {
+ Array segments; /* array of SplineSegment */
+ int color;
+} *Spline;
+
+static Spline spline_new(int color)
+{
+ Spline new=(Spline)calloc(1,sizeof(struct spline));
+ new->segments=array_new(30);
+ new->color=color;
+ return new;
+}
+
+static void spline_del(void *s)
+{
+ array_del(((Spline)s)->segments,&free);
+ free(s);
+}
+
+static void spline_add_segment(Spline s,
+ double x1, double y1, double x2, double y2,
+ double x3, double y3, double x4, double y4)
+{
+ SplineSegment ss=(SplineSegment)calloc(1,sizeof(struct spline_segment));
+ ss->x1=x1; ss->x2=x2; ss->x3=x3; ss->x4=x4;
+ ss->y1=y1; ss->y2=y2; ss->y3=y3; ss->y4=y4;
+ array_add_element(s->segments,ss);
+}
+
+#if 0
+static void spline_to_s(Spline s, FILE *f)
+{
+ int i;
+ SplineSegment ss;
+ fprintf(f,"Spline: \n");
+ for (i=0;i<s->segments->nb_elements;i++) {
+ ss=s->segments->elements[i];
+ fprintf(f," - segment %d: (%g, %g),(%g, %g),(%g, %g),(%g, %g)\n",
+ i,ss->x1,ss->y1,ss->x2,ss->y2,ss->x3,ss->y3,ss->x4,ss->y4);
+ }
+}
+#endif
+
+static void spline_value_at(Spline s, double *x, double *y, double t, int *segment)
+{
+ int si;
+ double tt;
+ SplineSegment ss;
+ si = floor(t*s->segments->nb_elements);
+ tt = t*s->segments->nb_elements - si;
+ assert(tt>=0 && tt<1);
+ ss=s->segments->elements[si];
+
+ *x = ss->x1*(1-tt)*(1-tt)*(1-tt)+3*ss->x2*tt*(1-tt)*(1-tt)+3*ss->x3*tt*tt*(1-tt)+ss->x4*tt*tt*tt;
+ *y = ss->y1*(1-tt)*(1-tt)*(1-tt)+3*ss->y2*tt*(1-tt)*(1-tt)+3*ss->y3*tt*tt*(1-tt)+ss->y4*tt*tt*tt;
+
+ *segment=si;
+}
+
+/*---------------------------*/
+
+static EdgeCouple edge_couple_new(int nb_edges) {
+ int i;
+ EdgeCouple new = (EdgeCouple)calloc(1,sizeof(struct edge_couple));
+ new->array = (int **)calloc(nb_edges, sizeof(int*));
+ new->size = nb_edges;
+
+ for (i=0;i<nb_edges;i++) {
+ new->array[i]=(int *)calloc(2,sizeof(int));
+ new->array[i][CLOCKWISE]=0;
+ new->array[i][ANTICLOCKWISE]=0;
+ }
+ return new;
+}
+
+static void edge_couple_del(EdgeCouple e)
+{
+ int i;
+ for (i=0;i<e->size;i++) free(e->array[i]);
+ free(e->array);
+ free(e);
+}
+
+/*---------------------------*/
+
+static Pattern pattern_new(struct state *st, Graph g, double shape1, double shape2)
+{
+ Pattern new;
+ assert(new=(Pattern)calloc(1,sizeof(struct pattern)));
+ new->shape1=shape1;
+ new->shape2=shape2;
+ new->graph=g;
+ new->ec=edge_couple_new(g->edges->nb_elements);
+ new->splines=array_new(10);
+ new->ncolors=st->ncolors;
+ return new;
+}
+
+static void pattern_del(Pattern p)
+{
+ edge_couple_del(p->ec);
+ array_del(p->splines,&spline_del);
+ free(p);
+}
+
+static void pattern_edge_couple_set(Pattern p, Edge e, Direction d, int value)
+{
+ int i;
+ for (i=0;i<p->graph->edges->nb_elements;i++)
+ if (p->graph->edges->elements[i]==e) {
+ p->ec->array[i][d]=value;
+ return;
+ }
+}
+
+static void pattern_draw_spline_direction(Pattern p, Spline s,
+ Node node, Edge edge1, Edge edge2,
+ Direction direction)
+{
+ double x1=(edge1->node1->x+edge1->node2->x)/2.0;
+ double y1=(edge1->node1->y+edge1->node2->y)/2.0;
+
+ /* P2 (x2,y2) is the middle point of edge1 */
+ double x4=(edge2->node1->x+edge2->node2->x)/2.0;
+ double y4=(edge2->node1->y+edge2->node2->y)/2.0;
+
+ double alpha=edge_angle_to(edge1,edge2,node,direction)*p->shape1;
+ double beta=p->shape2;
+
+ double i1x,i1y,i2x,i2y,x2,y2,x3,y3;
+
+ if (direction == ANTICLOCKWISE) {
+ /* I1 must stick out to the left of NP1 and I2 to the right of NP4 */
+ i1x = alpha*(node->y-y1)+x1;
+ i1y = -alpha*(node->x-x1)+y1;
+ i2x = -alpha*(node->y-y4)+x4;
+ i2y = alpha*(node->x-x4)+y4;
+ x2 = beta*(y1-i1y) + i1x;
+ y2 = -beta*(x1-i1x) + i1y;
+ x3 = -beta*(y4-i2y) + i2x;
+ y3 = beta*(x4-i2x) + i2y;
+ }
+ else {
+ /* I1 must stick out to the left of NP1 and I2 to the right of NP4 */
+ i1x = -alpha*(node->y-y1)+x1;
+ i1y = alpha*(node->x-x1)+y1;
+ i2x = alpha*(node->y-y4)+x4;
+ i2y = -alpha*(node->x-x4)+y4;
+ x2 = -beta*(y1-i1y) + i1x;
+ y2 = beta*(x1-i1x) + i1y;
+ x3 = beta*(y4-i2y) + i2x;
+ y3 = -beta*(x4-i2x) + i2y;
+ }
+
+ spline_add_segment(s,x1,y1,x2,y2,x3,y3,x4,y4);
+}
+
+static int pattern_next_unfilled_couple(Pattern p, Edge *e, Direction *d)
+{
+ int i;
+ for (i=0;i<p->ec->size;i++) {
+ if (p->ec->array[i][CLOCKWISE]==0) {
+ *e=p->graph->edges->elements[i];
+ *d=CLOCKWISE;
+ return 1;
+ }
+ else if (p->ec->array[i][ANTICLOCKWISE]==0) {
+ *e=p->graph->edges->elements[i];
+ *d=ANTICLOCKWISE;
+ return 1;
+ }
+ }
+ return 0;
+}
+
+static void pattern_make_curves(Pattern p)
+{
+ Edge current_edge, first_edge, next_edge;
+ Node current_node, first_node;
+ Direction current_direction, first_direction;
+ Spline s;
+
+ while (pattern_next_unfilled_couple(p, &first_edge, &first_direction)) {
+ /* start a new loop */
+ s=spline_new(random()%(p->ncolors-2)+2);
+ array_add_element(p->splines, s);
+
+ current_edge=first_edge;
+ current_node=first_node=current_edge->node1;
+ current_direction=first_direction;
+
+ do {
+ pattern_edge_couple_set(p, current_edge, current_direction, 1);
+ next_edge = graph_next_edge_around(p->graph,current_node,current_edge,current_direction);
+
+ /* add the spline segment to the spline */
+ pattern_draw_spline_direction(p,s,current_node,
+ current_edge,next_edge,current_direction);
+
+ /* cross the edge */
+ current_edge = next_edge;
+ current_node = edge_other_node(next_edge, current_node);
+ current_direction=1-current_direction;
+
+ } while (current_node!=first_node || current_edge!=first_edge || current_direction!=first_direction);
+
+ if (s->segments->nb_elements==2) /* spline is just one point: remove it */
+ p->splines->elements[p->splines->nb_elements-1]=NULL;
+
+ }
+}
+
+static void pattern_animate(struct state *st)
+{
+ Pattern p = st->pattern;
+ double t = st->t;
+ double t2;
+ double x,y,x2,y2,x3,y3,x4,y4;
+ int i,segment,unused;
+ int ticks;
+ double step=0.0001; /* TODO: set the step (or the delay) as a
+ * function of the spline length, so that
+ * drawing speed is constant
+ */
+ Spline s;
+
+ XSetLineAttributes(st->dpy,st->gc,st->params.curve_width,LineSolid,CapRound,JoinRound);
+ XSetLineAttributes(st->dpy,st->shadow_gc,st->params.shadow_width,LineSolid,CapRound,JoinRound);
+
+ for (ticks=0;ticks<100 && t<1;ticks++) {
+ for (i=0;i<p->splines->nb_elements;i++)
+ if ((s=p->splines->elements[i])) { /* skip if one-point spline */
+ spline_value_at(s, &x, &y, fmod(t,1.0),&segment);
+ spline_value_at(s, &x2, &y2, fmod(t+step,1.0),&unused);
+
+ /* look ahead for the shadow segment */
+ t2=t+step;
+ if (t2<=1.0) {
+ spline_value_at(s, &x3, &y3, fmod(t2,1.0),&unused);
+ while (t2+step<1.0 && (x3-x2)*(x3-x2)+(y3-y2)*(y3-y2) < st->params.shadow_width*st->params.shadow_width) {
+ t2+=step;
+ spline_value_at(s, &x3, &y3, fmod(t2,1.0),&unused);
+ }
+
+ spline_value_at(s, &x4, &y4, fmod(t2+step,1.0),&unused);
+
+ /* draw shadow line */
+ XDrawLine(st->dpy,st->window,st->shadow_gc,
+ (int)rint(x3),(int)rint(y3),
+ (int)rint(x4),(int)rint(y4));
+ }
+ /* draw line segment */
+ if (p->splines->nb_elements==1)
+ XSetForeground(st->dpy, st->gc, st->colors[segment%(p->ncolors-3)+2].pixel);
+ else
+ XSetForeground(st->dpy, st->gc, st->colors[s->color].pixel);
+ XDrawLine(st->dpy,st->window,st->gc,
+ (int)rint(x),(int)rint(y),
+ (int)rint(x2),(int)rint(y2));
+ }
+ t+=step;
+ }
+ st->t=t;
+
+ if (t>=1) {
+ st->reset=1;
+
+ /* at the end we redraw back to remove shadow spillage */
+ for (i=0;i<p->splines->nb_elements;i++) {
+ if ((s=p->splines->elements[i])) {
+ double offset=step;
+ XSetForeground(st->dpy, st->gc, st->colors[s->color].pixel);
+ spline_value_at(s, &x, &y, fmod(t,1.0),&unused);
+
+ spline_value_at(s, &x2, &y2, fmod(t-offset,1.0),&unused);
+
+ while ((x2-x)*(x2-x)+(y2-y)*(y2-y) < st->params.shadow_width*st->params.shadow_width) {
+ offset+=step;
+ spline_value_at(s, &x2, &y2, fmod(t-offset,1.0),&unused);
+ }
+
+ XDrawLine(st->dpy,st->window,st->gc, (int)rint(x),(int)rint(y), (int)rint(x2),(int)rint(y2));
+ }
+ }
+ }
+}
+
+/*======================================================================*/
+
+static const char *celtic_defaults[] = {
+ ".background: black",
+ ".foreground: #333333",
+ "*fpsSolid: true",
+ "*ncolors: 20",
+ "*delay: 10000",
+ "*delay2: 5",
+ "*showGraph: False",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec celtic_options[] = {
+ {"-background", ".background", XrmoptionSepArg, 0},
+ {"-foreground", ".foreground", XrmoptionSepArg, 0},
+ {"-ncolors", ".ncolors", XrmoptionSepArg, 0},
+ {"-delay", ".delay", XrmoptionSepArg, 0},
+ {"-delay2", ".delay2", XrmoptionSepArg, 0},
+ {"-graph", ".showGraph", XrmoptionNoArg, "True"},
+ {0, 0, 0, 0}
+};
+
+#if 0
+static void params_to_s(FILE *f)
+{
+ switch (st->params.type) {
+ case polar: fprintf(f,"type: polar\n");
+ fprintf(f,"nb_orbits: %ld\n",st->params.nb_orbits);
+ fprintf(f,"nb_nodes_per_orbit: %ld\n",st->params.nb_nodes_per_orbit);
+ break;
+ case tgrid: fprintf(f,"type: grid\n");
+ fprintf(f,"edge_size: %ld\n",st->params.edge_size);
+ break;
+ case triangle: fprintf(f,"type: triangle\n");
+ fprintf(f,"edge_size: %ld\n",st->params.edge_size);
+ break;
+ case kennicott:
+ fprintf(f,"type: kennicott\n");
+ fprintf(f,"edge_size: %ld\n",st->params.edge_size);
+ fprintf(f,"cluster_size: %ld\n",st->params.cluster_size);
+ break;
+ }
+
+ fprintf(f,"curve width: %ld\n",st->params.curve_width);
+ fprintf(f,"shadow width: %ld\n",st->params.shadow_width);
+ fprintf(f,"shape1: %g\n",st->params.shape1);
+ fprintf(f,"shape2: %g\n",st->params.shape2);
+ fprintf(f,"margin: %ld\n",st->params.margin);
+ fprintf(f,"angle: %g\n",st->params.angle);
+ fprintf(f,"delay: %ld\n",st->params.delay);
+}
+#endif
+
+#if 0
+static void colormap_to_s(int ncolors, XColor *colors)
+{
+ int i;
+ printf("-- colormap (%d colors):\n",st->ncolors);
+ for (i=0;i<st->ncolors;i++)
+ printf("%d: %d %d %d\n", i, st->colors[i].red, st->colors[i].green, st->colors[i].blue);
+ printf("----\n");
+}
+#endif
+
+
+static void *
+celtic_init (Display *d_arg, Window w_arg)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+
+ st->dpy=d_arg; st->window=w_arg;
+ st->showGraph=get_boolean_resource (st->dpy, "showGraph", "Boolean");
+
+ st->ncolors = get_integer_resource (st->dpy, "ncolors", "Integer");
+
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ assert(st->colors = (XColor *) calloc (st->ncolors,sizeof(XColor)));
+
+ if (get_boolean_resource(st->dpy, "mono", "Boolean"))
+ {
+ MONO:
+ st->ncolors = 1;
+ st->colors[0].pixel = get_pixel_resource(st->dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ }
+ else
+ {
+#if 0
+ make_random_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ st->colors, &st->ncolors, True, True, 0, True);
+#else
+ make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ st->colors, &st->ncolors, True, 0, True);
+#endif
+ if (st->ncolors < 2)
+ goto MONO;
+ else {
+ st->colors[0].pixel = get_pixel_resource(st->dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ st->colors[1].pixel = get_pixel_resource(st->dpy, st->xgwa.colormap,
+ "background", "Background");
+ }
+ }
+
+
+ /* graphic context for curves */
+ gcv.foreground = st->colors[0].pixel;
+ gcv.background = st->colors[1].pixel;
+ gcv.line_width = st->params.curve_width;
+ gcv.cap_style=CapRound;
+ st->gc = XCreateGC (st->dpy, st->window, GCForeground|GCBackground|GCLineWidth|GCCapStyle, &gcv);
+
+ /* graphic context for graphs */
+ gcv.foreground = st->colors[0].pixel;
+ gcv.background = st->colors[1].pixel;
+ st->gc_graph = XCreateGC (st->dpy, st->window, GCForeground|GCBackground, &gcv);
+
+ /* graphic context for shadows */
+ gcv.foreground = st->colors[1].pixel;
+ gcv.line_width = st->params.shadow_width;
+ gcv.cap_style=CapRound;
+ st->shadow_gc = XCreateGC(st->dpy, st->window, GCForeground|GCLineWidth|GCCapStyle, &gcv);
+
+ st->delay2 = 1000000 * get_integer_resource(st->dpy, "delay2", "Delay2");
+
+ return st;
+}
+
+static unsigned long
+celtic_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if (st->eraser) {
+ st->eraser = erase_window (st->dpy, st->window, st->eraser);
+ return 10000;
+ }
+
+ if (st->reset || st->force_reset) {
+ int delay = (st->force_reset ? 0 : st->delay2);
+ st->reset = 0;
+ st->force_reset = 0;
+ st->t = 1;
+
+ if (st->pattern != NULL) {
+ pattern_del(st->pattern);
+ }
+ st->pattern = NULL;
+ graph_del(st->graph);
+
+ /* recolor each time */
+ st->ncolors = get_integer_resource (st->dpy, "ncolors", "Integer");
+ if (st->ncolors > 2)
+ make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ st->colors, &st->ncolors, True, 0, True);
+
+ st->eraser = erase_window (st->dpy, st->window, st->eraser);
+ return (delay);
+ }
+
+ if (st->pattern == NULL) {
+ st->params.curve_width=random()%5+4;
+ st->params.shadow_width=st->params.curve_width+4;
+ st->params.shape1=(15+random()%15)/10.0 -1.0;
+ st->params.shape2=(15+random()%15)/10.0 -1.0;
+ st->params.edge_size=10*(random()%5)+20;
+ st->params.delay=get_integer_resource(st->dpy, "delay", "Delay");
+ st->params.angle=random()%360*2*M_PI/360;
+ st->params.margin=(random()%8)*100-600;
+
+ switch (random()%4) {
+ case 0:
+ st->params.type=tgrid;
+ st->params.shape1=(random()%1*2-1.0)*(random()%10+3)/10.0;
+ st->params.shape2=(random()%1*2-1.0)*(random()%10+3)/10.0;
+ st->params.edge_size=10*(random()%5)+50;
+ break;
+ case 1:
+ st->params.type=kennicott;
+ st->params.shape1=(random()%20)/10.0 -1.0;
+ st->params.shape2=(random()%20)/10.0 -1.0;
+ st->params.edge_size=10*(random()%3)+70;
+ st->params.cluster_size=st->params.edge_size/(3.0+random()%10)-1;
+ break;
+ case 2:
+ st->params.type=triangle;
+ st->params.edge_size=10*(random()%5)+60;
+ st->params.margin=(random()%10)*100-900;
+ break;
+ case 3:
+ st->params.type=polar;
+ st->params.nb_orbits=2+random()%10;
+ st->params.nb_nodes_per_orbit=4+random()%10;
+ break;
+ }
+
+
+/* st->params.type= polar; */
+/* st->params.nb_orbits= 5; */
+/* st->params.nb_nodes_per_orbit= 19; */
+/* st->params.curve_width= 4; */
+/* st->params.shadow_width= 8; */
+/* st->params.shape1= 0.5; */
+/* st->params.shape2= 1.3; */
+/* st->params.margin= 30; */
+/* st->params.angle= 5.21853; */
+/* st->params.delay= 10000; */
+
+
+/* params_to_s(stdout); */
+
+ /*=======================================================*/
+
+
+ switch (st->params.type) {
+ case tgrid:
+ st->graph=make_grid_graph(st, st->params.margin,st->params.margin,
+ st->xgwa.width-2*st->params.margin,
+ st->xgwa.height-2*st->params.margin,
+ st->params.edge_size);
+ break;
+ case kennicott:
+ st->graph=make_kennicott_graph(st, st->params.margin,st->params.margin,
+ st->xgwa.width-2*st->params.margin,
+ st->xgwa.height-2*st->params.margin,
+ st->params.edge_size,
+ st->params.cluster_size);
+ break;
+ case triangle:
+ st->graph=make_triangle_graph(st, st->params.margin,st->params.margin,
+ st->xgwa.width-2*st->params.margin,
+ st->xgwa.height-2*st->params.margin,
+ st->params.edge_size);
+ break;
+ case polar:
+ st->graph=make_polar_graph(st, st->params.margin,st->params.margin,
+ st->xgwa.width-2*st->params.margin,
+ st->xgwa.height-2*st->params.margin,
+ st->params.nb_nodes_per_orbit,
+ st->params.nb_orbits);
+ break;
+ default:
+ st->graph=make_grid_graph(st, st->params.margin,st->params.margin,
+ st->xgwa.width-2*st->params.margin,
+ st->xgwa.height-2*st->params.margin,
+ st->params.edge_size);
+ break;
+ }
+
+ graph_rotate(st->graph,st->params.angle,st->xgwa.width/2,st->xgwa.height/2);
+
+ if (st->showGraph)
+ graph_draw(st, st->graph);
+
+ st->pattern=pattern_new(st, st->graph, st->params.shape1, st->params.shape2);
+ pattern_make_curves(st->pattern);
+ st->t = 0.0;
+ }
+
+ pattern_animate(st);
+
+ return st->params.delay;
+}
+
+
+static void
+celtic_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+}
+
+static Bool
+celtic_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->force_reset = 1;
+ return True;
+ }
+ return False;
+}
+
+static void
+celtic_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+XSCREENSAVER_MODULE ("Celtic", celtic)
diff --git a/hacks/celtic.man b/hacks/celtic.man
new file mode 100644
index 0000000..9747cd5
--- /dev/null
+++ b/hacks/celtic.man
@@ -0,0 +1,64 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+celtic - draws celtic cross-stich patterns
+.SH SYNOPSIS
+.B ifs
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-delay2 \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-graph \fImode\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIceltic\fP program repeatedly draws random cross-stitch patterns.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000.
+.TP 8
+.B \-delay2 \fInumber\fP
+Delay between patterns, in seconds. Default: 5.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of colours to use. Default: 20.
+.TP 8
+.B \-graph
+Whether to render the underlying graph. Default: no.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Max Froumentin. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Max Froumentin <max@lapin-bleu.net>
diff --git a/hacks/check-configs.pl b/hacks/check-configs.pl
new file mode 100755
index 0000000..7a7d0bb
--- /dev/null
+++ b/hacks/check-configs.pl
@@ -0,0 +1,1243 @@
+#!/usr/bin/perl -w
+# Copyright © 2008-2017 Jamie Zawinski <jwz@jwz.org>
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+#
+# This parses the .c and .xml files and makes sure they are in sync: that
+# options are spelled the same, and that all the numbers are in sync.
+#
+# It also converts the hacks/config/ XML files into the Android XML files.
+#
+# Created: 1-Aug-2008.
+
+require 5;
+use diagnostics;
+use strict;
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my ($version) = ('$Revision: 1.26 $' =~ m/\s(\d[.\d]+)\s/s);
+
+my $verbose = 0;
+my $debug_p = 0;
+
+
+my $text_default_opts = '';
+foreach (qw(text-mode text-literal text-file text-url text-program)) {
+ my $s = $_; $s =~ s/-(.)/\U$1/g; $s =~ s/url/URL/si;
+ $text_default_opts .= "{\"-$_\", \".$s\", XrmoptionSepArg, 0},\n";
+}
+my $image_default_opts = '';
+foreach (qw(choose-random-images grab-desktop-images)) {
+ my $s = $_; $s =~ s/-(.)/\U$1/g;
+ $image_default_opts .= "{\"-$_\", \".$s\", XrmoptionSepArg, 0},\n";
+}
+my $xlockmore_default_opts = '';
+foreach (qw(count cycles delay ncolors size font)) {
+ $xlockmore_default_opts .= "{\"-$_\", \".$_\", XrmoptionSepArg, 0},\n";
+}
+$xlockmore_default_opts .=
+ "{\"-wireframe\", \".wireframe\", XrmoptionNoArg, \"true\"},\n" .
+ "{\"-3d\", \".use3d\", XrmoptionNoArg, \"true\"},\n" .
+ "{\"-no-3d\", \".use3d\", XrmoptionNoArg, \"false\"},\n";
+
+my $thread_default_opts =
+ "{\"-threads\", \".useThreads\", XrmoptionNoArg, \"True\"},\n" .
+ "{\"-no-threads\", \".useThreads\", XrmoptionNoArg, \"False\"},\n";
+
+my $analogtv_default_opts = '';
+foreach (qw(color tint brightness contrast)) {
+ $analogtv_default_opts .= "{\"-tv-$_\", \".TV$_\", XrmoptionSepArg, 0},\n";
+}
+
+$analogtv_default_opts .= $thread_default_opts;
+
+
+
+# Returns two tables:
+# - A table of the default resource values.
+# - A table of "-switch" => "resource: value", or "-switch" => "resource: %"
+#
+sub parse_src($) {
+ my ($saver) = @_;
+ my $file = lc($saver) . ".c";
+
+ # kludge...
+ $file = 'apple2-main.c' if ($file eq 'apple2.c');
+ $file = 'sproingiewrap.c' if ($file eq 'sproingies.c');
+ $file = 'b_lockglue.c' if ($file eq 'bubble3d.c');
+ $file = 'polyhedra-gl.c' if ($file eq 'polyhedra.c');
+ $file = 'companion.c' if ($file eq 'companioncube.c');
+ $file = 'rd-bomb.c' if ($file eq 'rdbomb.c');
+
+ my $ofile = $file;
+ $file = "glx/$ofile" unless (-f $file);
+ $file = "../hacks/$ofile" unless (-f $file);
+ $file = "../hacks/glx/$ofile" unless (-f $file);
+ my $body = '';
+ open (my $in, '<', $file) || error ("$ofile: $!");
+ while (<$in>) { $body .= $_; }
+ close $in;
+ $file =~ s@^.*/@@;
+
+ my $xlockmore_p = 0;
+ my $thread_p = ($body =~ m/THREAD_DEFAULTS/);
+ my $analogtv_p = ($body =~ m/ANALOGTV_DEFAULTS/);
+ my $text_p = ($body =~ m/"textclient\.h"/);
+ my $grab_p = ($body =~ m/load_image_async/);
+
+ $body =~ s@/\*.*?\*/@@gs;
+ $body =~ s@^#\s*(if|ifdef|ifndef|elif|else|endif).*$@@gm;
+ $body =~ s/(THREAD|ANALOGTV)_(DEFAULTS|OPTIONS)(_XLOCK)?//gs;
+ $body =~ s/__extension__//gs;
+
+ print STDERR "$progname: $file: defaults:\n" if ($verbose > 2);
+ my %res_to_val;
+ if ($body =~ m/_defaults\s*\[\]\s*=\s*{(.*?)}\s*;/s) {
+ foreach (split (/,\s*\n/, $1)) {
+ s/^\s*//s;
+ s/\s*$//s;
+ next if m/^0?$/s;
+ my ($key, $val) = m@^\"([^:\s]+)\s*:\s*(.*?)\s*\"$@;
+ print STDERR "$progname: $file: unparsable: $_\n" unless $key;
+ $key =~ s/^[.*]//s;
+ $res_to_val{$key} = $val;
+ print STDERR "$progname: $file: $key = $val\n" if ($verbose > 2);
+ }
+ } elsif ($body =~ m/\#\s*define\s*DEFAULTS\s*\\?\s*(.*?)\n[\n#]/s) {
+ $xlockmore_p = 1;
+ my $str = $1;
+ $str =~ s/\"\s*\\\n\s*\"//gs;
+ $str =~ m/^\s*\"(.*?)\"\s*\\?\s*$/ ||
+ error ("$file: unparsable defaults: $str");
+ $str = $1;
+ $str =~ s/\s*\\n\s*/\n/gs;
+ foreach (split (/\n/, $str)) {
+ my ($key, $val) = m@^([^:\s]+)\s*:\s*(.*?)\s*$@;
+ print STDERR "$progname: $file: unparsable: $_\n" unless $key;
+ $key =~ s/^[.*]//s;
+ $val =~ s/"\s*"\s*$//s;
+ $res_to_val{$key} = $val;
+ print STDERR "$progname: $file: $key = $val\n" if ($verbose > 2);
+ }
+
+ while ($body =~ s/^#\s*define\s+(DEF_([A-Z\d_]+))\s+\"([^\"]+)\"//m) {
+ my ($key1, $key2, $val) = ($1, lc($2), $3);
+ $key2 =~ s/_(.)/\U$1/gs; # "foo_bar" -> "fooBar"
+ $key2 =~ s/Rpm/RPM/; # kludge
+ $res_to_val{$key2} = $val;
+ print STDERR "$progname: $file: $key1 ($key2) = $val\n"
+ if ($verbose > 2);
+ }
+
+ } else {
+ error ("$file: no defaults");
+ }
+
+ $body =~ m/XSCREENSAVER_MODULE(_2)?\s*\(\s*\"([^\"]+)\"/ ||
+ error ("$file: no module name");
+ $res_to_val{progclass} = $2;
+ $res_to_val{doFPS} = 'false';
+ $res_to_val{textMode} = 'date';
+ $res_to_val{textLiteral} = '';
+ $res_to_val{textURL} =
+ 'https://en.wikipedia.org/w/index.php?title=Special:NewPages&feed=rss';
+ $res_to_val{grabDesktopImages} = 'true';
+ $res_to_val{chooseRandomImages} = 'true';
+
+ print STDERR "$progname: $file: progclass = $2\n" if ($verbose > 2);
+
+ print STDERR "$progname: $file: switches to resources:\n"
+ if ($verbose > 2);
+ my %switch_to_res;
+ $switch_to_res{'-fps'} = 'doFPS: true';
+ $switch_to_res{'-fg'} = 'foreground: %';
+ $switch_to_res{'-bg'} = 'background: %';
+ $switch_to_res{'-no-grab-desktop-images'} = 'grabDesktopImages: false';
+ $switch_to_res{'-no-choose-random-images'} = 'chooseRandomImages: false';
+
+ my ($ign, $opts) = ($body =~ m/(_options|\bopts)\s*\[\]\s*=\s*{(.*?)}\s*;/s);
+ if ($xlockmore_p || $thread_p || $analogtv_p || $opts) {
+ $opts = '' unless $opts;
+ $opts .= ",\n$text_default_opts" if ($text_p);
+ $opts .= ",\n$image_default_opts" if ($grab_p);
+ $opts .= ",\n$xlockmore_default_opts" if ($xlockmore_p);
+ $opts .= ",\n$thread_default_opts" if ($thread_p);
+ $opts .= ",\n$analogtv_default_opts" if ($analogtv_p);
+
+ foreach (split (/,\s*\n/, $opts)) {
+ s/^\s*//s;
+ s/\s*$//s;
+ next if m/^$/s;
+ next if m/^\{\s*0\s*,/s;
+ my ($switch, $res, $type, $v0, $v1, $v2) =
+ m@^ \s* { \s * \"([^\"]+)\" \s* ,
+ \s * \"([^\"]+)\" \s* ,
+ \s * ([^\s]+) \s* ,
+ \s * (\"([^\"]*)\"|([a-zA-Z\d_]+)) \s* }@xi;
+ print STDERR "$progname: $file: unparsable: $_\n" unless $switch;
+ my $val = defined($v1) ? $v1 : $v2;
+ $val = '%' if ($type eq 'XrmoptionSepArg');
+ $res =~ s/^[.*]//s;
+ $res =~ s/^[a-z\d]+\.//si;
+ $switch =~ s/^\+/-no-/s;
+
+ $val = "$res: $val";
+ if (defined ($switch_to_res{$switch})) {
+ print STDERR "$progname: $file: DUP! $switch = \"$val\"\n"
+ if ($verbose > 2);
+ } else {
+ $switch_to_res{$switch} = $val;
+ print STDERR "$progname: $file: $switch = \"$val\"\n"
+ if ($verbose > 2);
+ }
+ }
+ } else {
+ error ("$file: no options");
+ }
+
+ return (\%res_to_val, \%switch_to_res);
+}
+
+my %video_dups;
+
+# Returns a list of:
+# "resource = default value"
+# or "resource != non-default value"
+#
+# Also a hash of the simplified XML contents.
+#
+sub parse_xml($$$) {
+ my ($saver, $switch_to_res, $src_opts) = @_;
+
+ my $saver_title = undef;
+ my $gl_p = 0;
+ my $file = "config/" . lc($saver) . ".xml";
+ my $ofile = $file;
+ $file = "../hacks/$ofile" unless (-f $file);
+ my $body = '';
+ open (my $in, '<', $file) || error ("$ofile: $!");
+ while (<$in>) { $body .= $_; }
+ close $in;
+ $file =~ s@^.*/@@;
+
+ my @result = ();
+
+ $body =~ s@<xscreensaver-text\s*/?>@
+ <select id="textMode">
+ <option id="date" _label="Display the date and time"/>
+ <option id="text" _label="Display static text"
+ arg-set="-text-mode literal"/>
+ <option id="url" _label="Display the contents of a URL"
+ arg-set="-text-mode url"/>
+ </select>
+ <string id="textLiteral" _label="Text to display" arg="-text-literal %"/>
+ <string id="textURL" _label="URL to display" arg="-text-url %"/>
+ @gs;
+
+ $body =~ s@<xscreensaver-image\s*/?>@
+ <boolean id="grabDesktopImages" _label="Grab screenshots"
+ arg-unset="-no-grab-desktop-images"/>
+ <boolean id="chooseRandomImages" _label="Use photo library"
+ arg-unset="-no-choose-random-images"/>
+ @gs;
+
+ $body =~ s/<!--.*?-->/ /gsi;
+
+ $body =~ s@(<(_description)>.*?</\2>)@{ $_ = $1; s/\n/\002/gs; $_; }@gsexi;
+
+ $body =~ s/\s+/ /gs;
+ $body =~ s/</\001</gs;
+ $body =~ s/\001(<option)/$1/gs;
+
+ my $video = undef;
+
+ my @widgets = ();
+
+ print STDERR "$progname: $file: options:\n" if ($verbose > 2);
+ foreach (split (m/\001/, $body)) {
+ next if (m/^\s*$/s);
+ my ($type, $args) = m@^<([?/]?[-_a-z]+)\b\s*(.*)$@si;
+ error ("$progname: $file: unparsable: $_") unless $type;
+ next if ($type =~ m@^/@);
+
+ my $ctrl = { type => $type };
+
+ if ($type =~ m/^( [hv]group |
+ \?xml |
+ command |
+ file |
+ xscreensaver-image |
+ xscreensaver-updater
+ )/sx) {
+ $ctrl = undef;
+
+ } elsif ($type eq '_description') {
+ $args =~ s/\002/\n/gs;
+ $args =~ s@^>\s*@@s;
+ $args =~ s/^\n*|\s*$//gs;
+ $ctrl->{text} = $args;
+
+ } elsif ($type eq 'screensaver') {
+ ($saver_title) = ($args =~ m/\b_label\s*=\s*\"([^\"]+)\"/s);
+ ($gl_p) = ($args =~ m/\bgl="?yes/s);
+ my $s = $saver_title;
+ $s =~ s/\s+//gs;
+ my $val = "progclass = $s";
+ push @result, $val;
+ print STDERR "$progname: $file: name: $saver_title\n"
+ if ($verbose > 2);
+ $ctrl = undef;
+
+ } elsif ($type eq 'video') {
+ error ("$file: multiple videos") if $video;
+ ($video) = ($args =~ m/\bhref="(.*?)"/);
+ error ("$file: unparsable video") unless $video;
+ error ("$file: unparsable video URL")
+ unless ($video =~ m@^https?://www\.youtube\.com/watch\?v=[^?&]+$@s);
+ $ctrl = undef;
+
+ } elsif ($type eq 'select') {
+ $args =~ s/</\001</gs;
+ my @opts = split (/\001/, $args);
+ shift @opts;
+ my $unset_p = 0;
+ my $this_res = undef;
+ my @menu = ();
+ foreach (@opts) {
+ error ("$file: unparsable option: $_") unless (m/^<option\s/);
+
+ my %item;
+ my $opt = $_;
+ $opt =~ s@^<option\s+@@s;
+ $opt =~ s@[?/]>\s*$@@s;
+ while ($opt =~ s/^\s*([^\s]+)\s*=\s*"(.*?)"\s*(.*)/$3/s) {
+ my ($k, $v) = ($1, $2);
+ $item{$k} = $v;
+ }
+
+ error ("unparsable XML option line: $_ [$opt]") if ($opt);
+ push @menu, \%item;
+
+ my ($set) = $item{'arg-set'};
+ if ($set) {
+ my ($set2, $val) = ($set =~ m/^(.*?) (.*)$/s);
+ $set = $set2 if ($set2);
+ my ($res) = $switch_to_res->{$set};
+ error ("$file: no resource for select switch \"$set\"") unless $res;
+
+ my ($res2, $val2) = ($res =~ m/^(.*?): (.*)$/s);
+ error ("$file: unparsable select resource: $res") unless $res2;
+ $res = $res2;
+ $val = $val2 unless ($val2 eq '%');
+ $item{value} = $val;
+
+ error ("$file: mismatched resources: $res vs $this_res")
+ if (defined($this_res) && $this_res ne $res);
+ $this_res = $res;
+
+ $val = "$res != $val";
+ push @result, $val;
+ print STDERR "$progname: $file: select: $val\n" if ($verbose > 2);
+
+ } else {
+ error ("$file: multiple default options: $set") if ($unset_p);
+ $unset_p++;
+ }
+ }
+ $ctrl->{resource} = $this_res;
+ $ctrl->{default} = $src_opts->{$this_res};
+ $ctrl->{menu} = \@menu;
+
+ } else {
+
+ my $rest = $args;
+ $rest =~ s@[/?]*>\s*$@@s;
+ while ($rest =~ s/^\s*([^\s]+)\s*=\s*"(.*?)"\s*(.*)/$3/s) {
+ my ($k, $v) = ($1, $2);
+ $ctrl->{$k} = $v;
+ }
+ error ("unparsable XML line: $args [$rest]") if ($rest);
+
+ if ($type eq 'number') {
+ my ($arg) = $ctrl->{arg};
+ my ($val) = $ctrl->{default};
+ $val = '' unless defined($val);
+
+ my $switch = $arg;
+ $switch =~ s/\s+.*$//;
+ my ($res) = $switch_to_res->{$switch};
+ error ("$file: no resource for $type switch \"$arg\"") unless $res;
+
+ $res =~ s/: \%$//;
+ error ("$file: unparsable value: $res") if ($res =~ m/:/);
+ $ctrl->{resource} = $res;
+
+ $val = "$res = $val";
+ push @result, $val;
+ print STDERR "$progname: $file: number: $val\n" if ($verbose > 2);
+
+ } elsif ($type eq 'boolean') {
+ my ($set) = $ctrl->{'arg-set'};
+ my ($unset) = $ctrl->{'arg-unset'};
+ my ($arg) = $set || $unset || error ("$file: unparsable: $args");
+ my ($res) = $switch_to_res->{$arg};
+ error ("$file: no resource for boolean switch \"$arg\"") unless $res;
+
+ my ($res2, $val) = ($res =~ m/^(.*?): (.*)$/s);
+ error ("$file: unparsable boolean resource: $res") unless $res2;
+ $res = $res2;
+
+ $ctrl->{resource} = $res;
+ $ctrl->{convert} = 'invert' if ($val =~ m/off|false|no/i);
+ $ctrl->{default} = ($ctrl->{convert} ? 'true' : 'false');
+
+# $val = ($set ? "$res != $val" : "$res = $val");
+ $val = "$res != $val";
+ push @result, $val;
+ print STDERR "$progname: $file: boolean: $val\n" if ($verbose > 2);
+
+ } elsif ($type eq 'string') {
+ my ($arg) = $ctrl->{arg};
+
+ my $switch = $arg;
+ $switch =~ s/\s+.*$//;
+ my ($res) = $switch_to_res->{$switch};
+ error ("$file: no resource for $type switch \"$arg\"") unless $res;
+
+ $res =~ s/: \%$//;
+ error ("$file: unparsable value: $res") if ($res =~ m/:/);
+ $ctrl->{resource} = $res;
+ $ctrl->{default} = $src_opts->{$res};
+ my $val = "$res = %";
+ push @result, $val;
+ print STDERR "$progname: $file: string: $val\n" if ($verbose > 2);
+
+ } else {
+ error ("$file: unknown type \"$type\" for no arg");
+ }
+ }
+
+ push @widgets, $ctrl if $ctrl;
+ }
+
+# error ("$file: no video") unless $video;
+ print STDERR "\n$file: WARNING: no video\n\n" unless $video;
+
+ if ($video && $video_dups{$video} &&
+ $video_dups{$video} ne $saver_title) {
+ print STDERR "\n$file: WARNING: $saver_title: dup video with " .
+ $video_dups{$video} . "\n";
+ }
+ $video_dups{$video} = $saver_title if ($video);
+
+ return ($saver_title, $gl_p, \@result, \@widgets);
+}
+
+
+sub check_config($) {
+ my ($saver) = @_;
+
+ # kludge
+ return 0 if ($saver =~ m/(-helper)$/);
+
+ my ($src_opts, $switchmap) = parse_src ($saver);
+ my ($saver_title, $gl_p, $xml_opts, $widgets) =
+ parse_xml ($saver, $switchmap, $src_opts);
+
+ my $failures = 0;
+ foreach my $claim (@$xml_opts) {
+ my ($res, $compare, $xval) = ($claim =~ m/^(.*) (=|!=) (.*)$/s);
+ error ("$saver: unparsable xml claim: $claim") unless $compare;
+
+ my $sval = $src_opts->{$res};
+ if ($res =~ m/^TV|^text-mode/) {
+ print STDERR "$progname: $saver: OK: skipping \"$res\"\n"
+ if ($verbose > 1);
+ } elsif (!defined($sval)) {
+ print STDERR "$progname: $saver: $res: not in source\n";
+ } elsif ($claim !~ m/ = %$/s &&
+ ($compare eq '!='
+ ? $sval eq $xval
+ : $sval ne $xval)) {
+ print STDERR "$progname: $saver: " .
+ "src has \"$res = $sval\", xml has \"$claim\"\n";
+ $failures++;
+ } elsif ($verbose > 1) {
+ print STDERR "$progname: $saver: OK: \"$res = $sval\" vs \"$claim\"\n";
+ }
+ }
+
+ # Now make sure the progclass in the source and XML also matches
+ # the XCode target name.
+ #
+ my $obd = "../OSX/build/Debug";
+ if (-d $obd) {
+ my $progclass = $src_opts->{progclass};
+ $progclass = 'DNAlogo' if ($progclass eq 'DNALogo');
+ my $f = (glob("$obd/$progclass.saver*"))[0];
+ if (!$f && $progclass ne 'Flurry') {
+ print STDERR "$progname: $progclass.saver does not exist\n";
+ $failures++;
+ }
+ }
+
+ print STDERR "$progname: $saver: OK\n"
+ if ($verbose == 1 && $failures == 0);
+
+ return $failures;
+}
+
+
+# Returns true if the two files differ (by running "cmp")
+#
+sub cmp_files($$) {
+ my ($file1, $file2) = @_;
+
+ my @cmd = ("cmp", "-s", "$file1", "$file2");
+ print STDERR "$progname: executing \"" . join(" ", @cmd) . "\"\n"
+ if ($verbose > 3);
+
+ system (@cmd);
+ my $exit_value = $? >> 8;
+ my $signal_num = $? & 127;
+ my $dumped_core = $? & 128;
+
+ error ("$cmd[0]: core dumped!") if ($dumped_core);
+ error ("$cmd[0]: signal $signal_num!") if ($signal_num);
+ return $exit_value;
+}
+
+
+sub diff_files($$) {
+ my ($file1, $file2) = @_;
+
+ my @cmd = ("diff",
+ "-U1",
+# "-w",
+ "--unidirectional-new-file", "$file1", "$file2");
+ print STDERR "$progname: executing \"" . join(" ", @cmd) . "\"\n"
+ if ($verbose > 3);
+
+ system (@cmd);
+ my $exit_value = $? >> 8;
+ my $signal_num = $? & 127;
+ my $dumped_core = $? & 128;
+
+ error ("$cmd[0]: core dumped!") if ($dumped_core);
+ error ("$cmd[0]: signal $signal_num!") if ($signal_num);
+ return $exit_value;
+}
+
+
+# If the two files differ:
+# mv file2 file1
+# else
+# rm file2
+#
+sub rename_or_delete($$;$) {
+ my ($file, $file_tmp, $suffix_msg) = @_;
+
+ my $changed_p = cmp_files ($file, $file_tmp);
+
+ if ($changed_p && $debug_p) {
+ print STDOUT "\n" . ('#' x 79) . "\n";
+ diff_files ("$file", "$file_tmp");
+ $changed_p = 0;
+ }
+
+ if ($changed_p) {
+
+ if (!rename ("$file_tmp", "$file")) {
+ unlink "$file_tmp";
+ error ("mv $file_tmp $file: $!");
+ }
+ print STDERR "$progname: wrote $file" .
+ ($suffix_msg ? " $suffix_msg" : "") . "\n";
+
+ } else {
+ unlink "$file_tmp" || error ("rm $file_tmp: $!\n");
+ print STDERR "$file unchanged" .
+ ($suffix_msg ? " $suffix_msg" : "") . "\n"
+ if ($verbose);
+ print STDERR "$progname: rm $file_tmp\n" if ($verbose > 2);
+ }
+}
+
+
+# Write the given body to the file, but don't alter the file's
+# date if the new content is the same as the existing content.
+#
+sub write_file_if_changed($$;$) {
+ my ($outfile, $body, $suffix_msg) = @_;
+
+ my $file_tmp = "$outfile.tmp";
+ open (my $out, '>', $file_tmp) || error ("$file_tmp: $!");
+ (print $out $body) || error ("$file_tmp: $!");
+ close $out || error ("$file_tmp: $!");
+ rename_or_delete ($outfile, $file_tmp, $suffix_msg);
+}
+
+
+# Read the template file and splice in the @KEYWORDS@ in the hash.
+#
+sub read_template($$) {
+ my ($file, $subs) = @_;
+ my $body = '';
+ open (my $in, '<', $file) || error ("$file: $!");
+ while (<$in>) { $body .= $_; }
+ close $in;
+
+ $body =~ s@/\*.*?\*/@@gs; # omit comments
+ $body =~ s@//.*$@@gm;
+
+ foreach my $key (keys %$subs) {
+ my $val = $subs->{$key};
+ $body =~ s/@\Q$key\E@/$val/gs;
+ }
+
+ if ($body =~ m/(@[-_A-Z\d]+@)/s) {
+ error ("$file: unmatched: $1 [$body]");
+ }
+
+ $body =~ s/[ \t]+$//gm;
+ $body =~ s/(\n\n)\n+/$1/gs;
+ return $body;
+}
+
+
+# This is duplicated in OSX/update-info-plist.pl
+#
+sub munge_blurb($$$$) {
+ my ($filename, $name, $vers, $desc) = @_;
+
+ $desc =~ s/^([ \t]*\n)+//s;
+ $desc =~ s/\s*$//s;
+
+ # in case it's done already...
+ $desc =~ s@<!--.*?-->@@gs;
+ $desc =~ s/^.* version \d[^\n]*\n//s;
+ $desc =~ s/^From the XScreenSaver.*\n//m;
+ $desc =~ s@^https://www\.jwz\.org/xscreensaver.*\n@@m;
+ $desc =~
+ s/\nCopyright [^ \r\n\t]+ (\d{4})(-\d{4})? (.*)\.$/\nWritten $3; $1./s;
+ $desc =~ s/^\n+//s;
+
+ error ("$filename: description contains markup: $1")
+ if ($desc =~ m/([<>&][^<>&\s]*)/s);
+ error ("$filename: description contains ctl chars: $1")
+ if ($desc =~ m/([\000-\010\013-\037])/s);
+
+ error ("$filename: can't extract authors")
+ unless ($desc =~ m@^(.*)\nWritten by[ \t]+(.+)$@s);
+ $desc = $1;
+ my $authors = $2;
+ $desc =~ s/\s*$//s;
+
+ my $year = undef;
+ if ($authors =~ m@^(.*?)\s*[,;]\s+(\d\d\d\d)([-\s,;]+\d\d\d\d)*[.]?$@s) {
+ $authors = $1;
+ $year = $2;
+ }
+
+ error ("$filename: can't extract year") unless $year;
+ my $cyear = 1900 + ((localtime())[5]);
+ $year = "$cyear" unless $year;
+ if ($year && ! ($year =~ m/$cyear/)) {
+ $year = "$year-$cyear";
+ }
+
+ $authors =~ s/[.,;\s]+$//s;
+
+ # List me as a co-author on all of them, since I'm the one who
+ # did the OSX port, packaged it up, and built the executables.
+ #
+ my $curator = "Jamie Zawinski";
+ if (! ($authors =~ m/$curator/si)) {
+ if ($authors =~ m@^(.*?),? and (.*)$@s) {
+ $authors = "$1, $2, and $curator";
+ } else {
+ $authors .= " and $curator";
+ }
+ }
+
+ my $desc1 = ("$name, version $vers.\n\n" . # savername.xml
+ $desc . "\n" .
+ "\n" .
+ "From the XScreenSaver collection: " .
+ "https://www.jwz.org/xscreensaver/\n" .
+ "Copyright \302\251 $year by $authors.\n");
+
+ my $desc2 = ("$name $vers,\n" . # Info.plist
+ "\302\251 $year $authors.\n" .
+ #"From the XScreenSaver collection:\n" .
+ #"https://www.jwz.org/xscreensaver/\n" .
+ "\n" .
+ $desc .
+ "\n");
+
+ # unwrap lines, but only when it's obviously ok: leave blank lines,
+ # and don't unwrap if that would compress leading whitespace on a line.
+ #
+ $desc2 =~ s/^(From |https?:)/\n$1/gm;
+ 1 while ($desc2 =~ s/([^\s])[ \t]*\n([^\s])/$1 $2/gs);
+ $desc2 =~ s/\n\n(From |https?:)/\n$1/gs;
+
+ return ($desc1, $desc2);
+}
+
+
+sub build_android(@) {
+ my (@savers) = @_;
+
+ my $package = "org.jwz.xscreensaver";
+ my $project_dir = "xscreensaver";
+ my $xml_dir = "$project_dir/res/xml";
+ my $values_dir = "$project_dir/res/values";
+ my $java_dir = "$project_dir/src/org/jwz/xscreensaver/gen";
+ my $gen_dir = "gen";
+
+ my $xml_header = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
+
+ my $manifest = '';
+ my $daydream_java = '';
+ my $settings_java = '';
+ my $wallpaper_java = '';
+ my $fntable_h2 = '';
+ my $fntable_h3 = '';
+ my $arrays = '';
+ my $strings = '';
+ my %write_files;
+ my %string_dups;
+
+ my $vers;
+ {
+ my $file = "../utils/version.h";
+ my $body = '';
+ open (my $in, '<', $file) || error ("$file: $!");
+ while (<$in>) { $body .= $_; }
+ close $in;
+ ($vers) = ($body =~ m@ (\d+\.[0-9a-z]+) @s);
+ error ("$file: no version number") unless $vers;
+ }
+
+
+ foreach my $saver (@savers) {
+ next if ($saver =~ m/(-helper)$/);
+ $saver = 'rdbomb' if ($saver eq 'rd-bomb');
+
+ my ($src_opts, $switchmap) = parse_src ($saver);
+ my ($saver_title, $gl_p, $xml_opts, $widgets) =
+ parse_xml ($saver, $switchmap, $src_opts);
+
+ my $saver_class = "${saver_title}";
+ $saver_class =~ s/\s+//gs;
+ $saver_class =~ s/^([a-z])/\U$1/gs; # upcase first letter
+
+ $saver_title =~ s/(.[a-z])([A-Z\d])/$1 $2/gs; # Spaces in InterCaps
+ $saver_title =~ s/^(GL|RD)[- ]?(.)/$1 \U$2/gs; # Space after "GL"
+ $saver_title =~ s/^Apple ?2$/Apple &#x5D;&#x5B;/gs; # "Apple ]["
+ $saver_title =~ s/(m)oe(bius)/$1&#xF6;$2/gsi; # &ouml;
+ $saver_title =~ s/(moir)e/$1&#xE9;/gsi; # &eacute;
+ $saver_title =~ s/^([a-z])/\U$1/s; # "M6502" for sorting
+
+ my $settings = '';
+
+ my $localize0 = sub($$) {
+ my ($key, $string) = @_;
+ $string =~ s@([\\\"\'])@\\$1@gs; # backslashify
+ $string =~ s@\n@\\n@gs; # quote newlines
+ $key =~ s@[^a-z\d_]+@_@gsi; # illegal characters
+
+ my $old = $string_dups{$key};
+ error ("dup string: $key: \"$old\" != \"$string\"")
+ if (defined($old) && $old ne $string);
+ $string_dups{$key} = $string;
+
+ my $fmt = ($string =~ m/%/ ? ' formatted="false"' : '');
+ $strings .= "<string name=\"${key}\"$fmt>$string</string>\n"
+ unless defined($old);
+ return "\@string/$key";
+ };
+
+ $localize0->('app_name', 'XScreenSaver');
+
+ $settings .= ("<Preference\n" .
+ " android:key=\"${saver}_reset\"\n" .
+ " android:title=\"" .
+ $localize0->('reset_to_defaults', 'Reset to defaults') .
+ "\"\n" .
+ " />\n");
+
+ my $daydream_desc = '';
+ foreach my $widget (@$widgets) {
+ my $type = $widget->{type};
+ my $rsrc = $widget->{resource};
+ my $label = $widget->{_label};
+ my $def = $widget->{default};
+ my $invert_p = (($widget->{convert} || '') eq 'invert');
+
+ my $key = "${saver}_$rsrc" if $rsrc;
+
+ #### The menus don't actually have titles on X11 or Cocoa...
+ $label = $widget->{resource} unless $label;
+
+ my $localize = sub($;$) {
+ my ($string, $suf) = @_;
+ $suf = 'title' unless $suf;
+ return $localize0->("${saver}_${rsrc}_${suf}", $string);
+ };
+
+ if ($type eq 'slider' || $type eq 'spinbutton') {
+
+ my $low = $widget->{low};
+ my $high = $widget->{high};
+ my $float_p = $low =~ m/[.]/;
+ my $low_label = $widget->{'_low-label'};
+ my $high_label = $widget->{'_high-label'};
+
+ $low_label = $low unless defined($low_label);
+ $high_label = $high unless defined($high_label);
+
+ ($low, $high) = ($high, $low)
+ if (($widget->{convert} || '') eq 'invert');
+
+ $settings .=
+ ("<$package.SliderPreference\n" .
+ " android:layout=\"\@layout/slider_preference\"\n" .
+ " android:key=\"${key}\"\n" .
+ " android:title=\"" . $localize->($label) . "\"\n" .
+ " android:defaultValue=\"$def\"\n" .
+ " low=\"$low\"\n" .
+ " high=\"$high\"\n" .
+ " lowLabel=\"" . $localize->($low_label, 'low_label') . "\"\n" .
+ " highLabel=\"" . $localize->($high_label, 'high_label') . "\"\n" .
+ " integral=\"" .($float_p ? 'false' : 'true'). "\" />\n");
+
+ } elsif ($type eq 'boolean') {
+
+ my $def = ($invert_p ? 'true' : 'false');
+ $settings .=
+ ("<CheckBoxPreference\n" .
+ " android:key=\"${key}\"\n" .
+ " android:title=\"" . $localize->($label) . "\"\n" .
+ " android:defaultValue=\"$def\" />\n");
+
+ } elsif ($type eq 'select') {
+
+ $label =~ s/^(.)/\U$1/s; # upcase first letter of menu title
+ $label =~ s/[-_]/ /gs;
+ $label =~ s/([a-z])([A-Z])/$1 $2/gs;
+ $def = '' unless defined ($def);
+ $settings .=
+ ("<ListPreference\n" .
+ " android:key=\"${key}\"\n" .
+ " android:title=\"" . $localize->($label, 'menu') . "\"\n" .
+ " android:entries=\"\@array/${key}_entries\"\n" .
+ " android:defaultValue=\"$def\"\n" .
+ " android:entryValues=\"\@array/${key}_values\" />\n");
+
+ my $a1 = '';
+ foreach my $item (@{$widget->{menu}}) {
+ my $val = $item->{value};
+ if (! defined($val)) {
+ $val = $src_opts->{$widget->{resource}};
+ error ("$saver: no default resource in option menu " .
+ $item->{_label})
+ unless defined($val);
+ }
+ $val =~ s@([\\\"\'])@\\$1@gs; # backslashify
+ $a1 .= " <item>$val</item>\n";
+ }
+
+ my $a2 = '';
+ foreach my $item (@{$widget->{menu}}) {
+ my $val = $item->{value};
+ $val = $src_opts->{$widget->{resource}} unless defined($val);
+ $a2 .= (" <item>" . $localize->($item->{_label}, $val) .
+ "</item>\n");
+ }
+
+ my $fmt1 = ($a1 =~ m/%/ ? ' formatted="false"' : '');
+ my $fmt2 = ($a2 =~ m/%/ ? ' formatted="false"' : '');
+ $arrays .= ("<string-array name=\"${key}_values\"$fmt1>\n" .
+ $a1 .
+ "</string-array>\n" .
+ "<string-array name=\"${key}_entries\"$fmt2>\n" .
+ $a2 .
+ "</string-array>\n");
+
+ } elsif ($type eq 'string') {
+
+ $def =~ s/&/&amp;/gs;
+ $settings .=
+ ("<EditTextPreference\n" .
+ " android:key=\"${key}\"\n" .
+ " android:title=\"" . $localize->($label) . "\"\n" .
+ " android:defaultValue=\"$def\" />\n");
+
+ } elsif ($type eq 'file') {
+
+ } elsif ($type eq '_description') {
+
+ $type = 'description';
+ $rsrc = $type;
+ my $desc = $widget->{text};
+ (undef, $desc) = munge_blurb ($saver, $saver_title, $vers, $desc);
+
+ # Lose the Wikipedia URLs.
+ $desc =~ s@https?:.*?\b(wikipedia|mathworld)\b[^\s]+[ \t]*\n?@@gm;
+ $desc =~ s/(\n\n)\n+/$1/s;
+ $desc =~ s/\s*$/\n\n\n/s;
+
+ $daydream_desc = $desc;
+
+ my ($year) = ($daydream_desc =~ m/\b((19|20)\d\d)\b/s);
+ error ("$saver: no year") unless $year;
+ $daydream_desc =~ s/^.*?\n\n//gs;
+ $daydream_desc =~ s/\n.*$//gs;
+ $daydream_desc = "$year: $daydream_desc";
+ $daydream_desc =~ s/^(.{72}).+$/$1.../s;
+
+ $settings .=
+ ("<Preference\n" .
+ " android:icon=\"\@drawable/thumbnail\"\n" .
+ " android:key=\"${saver}_${type}\"\n" .
+# " android:selectable=\"false\"\n" .
+ " android:persistent=\"false\"\n" .
+ " android:layout=\"\@layout/preference_blurb\"\n" .
+ " android:summary=\"" . $localize->($desc) . "\">\n" .
+ " <intent android:action=\"android.intent.action.VIEW\"\n" .
+ " android:data=\"https://www.jwz.org/xscreensaver/\" />\n" .
+ "</Preference>\n");
+
+ } else {
+ error ("unhandled type: $type");
+ }
+ }
+
+ my $heading = "XScreenSaver: $saver_title";
+
+ $settings =~ s/^/ /gm;
+ $settings = ($xml_header .
+ "<PreferenceScreen xmlns:android=\"" .
+ "http://schemas.android.com/apk/res/android\"\n" .
+ " android:title=\"" .
+ $localize0->("${saver}_settings_title", $heading) . "\">\n" .
+ $settings .
+ "</PreferenceScreen>\n");
+
+ my $saver_underscore = $saver;
+ $saver_underscore =~ s/-/_/g;
+ $write_files{"$xml_dir/${saver_underscore}_settings.xml"} = $settings;
+
+ $manifest .= ("<service android:label=\"" .
+ $localize0->("${saver_underscore}_saver_title",
+ $saver_title) .
+ "\"\n" .
+ " android:summary=\"" .
+ $localize0->("${saver_underscore}_saver_desc",
+ $daydream_desc) . "\"\n" .
+ " android:name=\".gen.Daydream\$$saver_class\"\n" .
+ " android:permission=\"android.permission" .
+ ".BIND_DREAM_SERVICE\"\n" .
+ " android:exported=\"true\"\n" .
+ " android:icon=\"\@drawable/${saver_underscore}\">\n" .
+ " <intent-filter>\n" .
+ " <action android:name=\"android.service.dreams" .
+ ".DreamService\" />\n" .
+ " <category android:name=\"android.intent.category" .
+ ".DEFAULT\" />\n" .
+ " </intent-filter>\n" .
+ " <meta-data android:name=\"android.service.dream\"\n" .
+ " android:resource=\"\@xml/${saver}_dream\" />\n" .
+ "</service>\n" .
+ "<service android:label=\"" .
+ $localize0->("${saver_underscore}_saver_title",
+ $saver_title) .
+ "\"\n" .
+ " android:summary=\"" .
+ $localize0->("${saver_underscore}_saver_desc",
+ $daydream_desc) . "\"\n" .
+ " android:name=\".gen.Wallpaper\$$saver_class\"\n" .
+ " android:permission=\"android.permission" .
+ ".BIND_WALLPAPER\">\n" .
+ " <intent-filter>\n" .
+ " <action android:name=\"android.service.wallpaper" .
+ ".WallpaperService\" />\n" .
+ " <category android:name=\"android.intent.category" .
+ ".DEFAULT\" />\n" . # TODO: Is the DEFAULT category needed?
+ " </intent-filter>\n" .
+ " <meta-data android:name=\"android.service.wallpaper\"\n" .
+ " android:resource=\"\@xml/${saver}_wallpaper\" />\n" .
+ "</service>\n" .
+ "<activity android:label=\"" .
+ $localize0->("${saver}_settings_title", $heading) . "\"\n" .
+ " android:name=\"$package.gen.Settings\$$saver_class\"\n" .
+ " android:exported=\"true\">\n" .
+ "</activity>\n"
+ );
+
+ my $dream = ("<dream xmlns:android=\"" .
+ "http://schemas.android.com/apk/res/android\"\n" .
+ " android:settingsActivity=\"" .
+ "$package.gen.Settings\$$saver_class\" />\n");
+ $write_files{"$xml_dir/${saver_underscore}_dream.xml"} = $dream;
+
+ my $wallpaper = ("<wallpaper xmlns:android=\"" .
+ "http://schemas.android.com/apk/res/android\"\n" .
+ " android:settingsActivity=\"" .
+ "$package.gen.Settings\$$saver_class\"\n" .
+ " android:thumbnail=\"\@drawable/${saver_underscore}\" />\n");
+ $write_files{"$xml_dir/${saver_underscore}_wallpaper.xml"} = $wallpaper;
+
+ $daydream_java .=
+ (" public static class $saver_class extends org.jwz.xscreensaver.Daydream {\n" .
+ " }\n" .
+ "\n");
+
+ $wallpaper_java .=
+ (" public static class $saver_class extends org.jwz.xscreensaver.Wallpaper {\n" .
+ " }\n" .
+ "\n");
+
+ $settings_java .=
+ (" public static class $saver_class extends org.jwz.xscreensaver.Settings\n" .
+ " implements SharedPreferences.OnSharedPreferenceChangeListener {\n" .
+ " }\n" .
+ "\n");
+
+ $fntable_h2 .= ",\n " if $fntable_h2 ne '';
+ $fntable_h3 .= ",\n " if $fntable_h3 ne '';
+
+ $fntable_h2 .= "${saver}_xscreensaver_function_table";
+ $fntable_h3 .= "{\"${saver}\", &${saver}_xscreensaver_function_table}";
+ }
+
+ $arrays =~ s/^/ /gm;
+ $arrays = ($xml_header .
+ "<resources xmlns:xliff=\"" .
+ "urn:oasis:names:tc:xliff:document:1.2\">\n" .
+ $arrays .
+ "</resources>\n");
+
+ $strings =~ s/^/ /gm;
+ $strings = ($xml_header .
+ "<resources>\n" .
+ $strings .
+ "</resources>\n");
+
+ $manifest .= "<activity android:name=\"$package.Settings\" />\n";
+
+ $manifest .= ("<activity android:name=\"" .
+ "org.jwz.xscreensaver.Activity\"\n" .
+ " android:theme=\"\@android:style/Theme.Holo\"\n" .
+ " android:label=\"\@string/app_name\">\n" .
+ " <intent-filter>\n" .
+ " <action android:name=\"android.intent.action" .
+ ".MAIN\" />\n" .
+ " <category android:name=\"android.intent.category" .
+ ".LAUNCHER\" />\n" .
+ " </intent-filter>\n" .
+ " <intent-filter>\n" .
+ " <action android:name=\"android.intent.action" .
+ ".VIEW\" />\n" .
+ " <category android:name=\"android.intent.category" .
+ ".DEFAULT\" />\n" .
+ " <category android:name=\"android.intent.category" .
+ ".BROWSABLE\" />\n" .
+ " </intent-filter>\n" .
+ "</activity>\n");
+
+
+ $manifest .= ("<activity android:name=\"" .
+ "org.jwz.xscreensaver.TVActivity\"\n" .
+ " android:theme=\"\@android:style/Theme.Holo\"\n" .
+ " android:label=\"\@string/app_name\">\n" .
+ " <intent-filter>\n" .
+ " <action android:name=\"android.intent.action" .
+ ".MAIN\" />\n" .
+ " <category android:name=\"android.intent.category" .
+ ".LEANBACK_LAUNCHER\" />\n" .
+ " </intent-filter>\n" .
+ " <intent-filter>\n" .
+ " <action android:name=\"android.intent.action" .
+ ".VIEW\" />\n" .
+ " <category android:name=\"android.intent.category" .
+ ".DEFAULT\" />\n" .
+ " <category android:name=\"android.intent.category" .
+ ".BROWSABLE\" />\n" .
+ " </intent-filter>\n" .
+ "</activity>\n");
+
+
+
+
+ # Android wants this to be an int
+ my $versb = $vers;
+ $versb =~ s/^(\d+)\.(\d+).*$/{ $1 * 10000 + $2 * 100 }/sex;
+ $versb++ if ($versb == 53500); # Herp derp
+
+ $manifest =~ s/^/ /gm;
+ $manifest = ($xml_header .
+ "<manifest xmlns:android=\"" .
+ "http://schemas.android.com/apk/res/android\"\n" .
+ " package=\"$package\"\n" .
+ " android:versionCode=\"$versb\"\n" .
+ " android:versionName=\"$vers\">\n" .
+
+ " <uses-sdk android:minSdkVersion=\"14\"" .
+ " android:targetSdkVersion=\"19\" />\n" .
+
+ " <uses-feature android:glEsVersion=\"0x00010001\"\n" .
+ " android:required=\"true\" />\n" .
+
+ " <uses-feature android:name=\"android.software.leanback\"\n" .
+ " android:required=\"false\" />\n" .
+
+ " <uses-feature" .
+ " android:name=\"android.hardware.touchscreen\"\n" .
+ " android:required=\"false\" />\n" .
+
+ " <uses-permission android:name=\"" .
+ "android.permission.INTERNET\" />\n" .
+ " <uses-permission android:name=\"" .
+ "android.permission.READ_EXTERNAL_STORAGE\" />\n" .
+
+ " <application android:icon=\"\@drawable/thumbnail\"\n" .
+ " android:banner=\"\@drawable/thumbnail\"\n" .
+ " android:label=\"\@string/app_name\"\n" .
+ " android:name=\".App\">\n" .
+ $manifest .
+ " </application>\n" .
+ "</manifest>\n");
+
+ $daydream_java = ("package org.jwz.xscreensaver.gen;\n" .
+ "\n" .
+ "import org.jwz.xscreensaver.jwxyz;\n" .
+ "\n" .
+ "public class Daydream {\n" .
+ $daydream_java .
+ "}\n");
+
+ $wallpaper_java = ("package org.jwz.xscreensaver.gen;\n" .
+ "\n" .
+ "import org.jwz.xscreensaver.jwxyz;\n" .
+ "\n" .
+ "public class Wallpaper {\n" .
+ $wallpaper_java .
+ "}\n");
+
+ $settings_java = ("package org.jwz.xscreensaver.gen;\n" .
+ "\n" .
+ "import android.content.SharedPreferences;\n" .
+ "\n" .
+ "public class Settings {\n" .
+ $settings_java .
+ "}\n");
+
+ $write_files{"$project_dir/AndroidManifest.xml"} = $manifest;
+ $write_files{"$values_dir/settings.xml"} = $arrays;
+ $write_files{"$values_dir/strings.xml"} = $strings;
+ $write_files{"$java_dir/Daydream.java"} = $daydream_java;
+ $write_files{"$java_dir/Wallpaper.java"} = $wallpaper_java;
+ $write_files{"$java_dir/Settings.java"} = $settings_java;
+
+ my $fntable_h = ("extern struct xscreensaver_function_table\n" .
+ " " . $fntable_h2 . ";\n" .
+ "\n" .
+ "static const struct function_table_entry" .
+ " function_table[] = {\n" .
+ " " . $fntable_h3 . "\n" .
+ "};\n");
+ $write_files{"$gen_dir/function-table.h"} = $fntable_h;
+
+
+ $write_files{"$values_dir/attrs.xml"} =
+ # This file doesn't actually have any substitutions in it, so it could
+ # just be static, somewhere...
+ # SliderPreference.java refers to this via "R.styleable.SliderPreference".
+ ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" .
+ "<resources>\n" .
+ " <declare-styleable name=\"SliderPreference\">\n" .
+ " <attr name=\"android:summary\" />\n" .
+ " </declare-styleable>\n" .
+ "</resources>\n");
+
+
+ foreach my $file (sort keys %write_files) {
+ my ($dir) = ($file =~ m@^(.*)/[^/]*$@s);
+ system ("mkdir", "-p", $dir) if (! -d $dir && !$debug_p);
+ my $body = $write_files{$file};
+ $body = "// Generated by $progname\n$body"
+ if ($file =~ m/\.(java|[chm])$/s);
+ write_file_if_changed ($file, $body);
+ }
+
+ # Unlink any .xml files from a previous run that shouldn't be there:
+ # if a hack is removed from $ANDROID_HACKS in android/Makefile but
+ # the old XML files remain behind, the build blows up.
+ #
+ foreach my $dd ($xml_dir, $gen_dir, $java_dir) {
+ opendir (my $dirp, $dd) || error ("$dd: $!");
+ my @files = readdir ($dirp);
+ closedir $dirp;
+ foreach my $f (sort @files) {
+ next if ($f eq '.' || $f eq '..');
+ $f = "$dd/$f";
+ next if (defined ($write_files{$f}));
+ if ($f =~ m/_(settings|wallpaper|dream)\.xml$/s ||
+ $f =~ m/(Settings|Daydream)\.java$/s) {
+ print STDERR "$progname: rm $f\n";
+ unlink ($f) unless ($debug_p);
+ } else {
+ print STDERR "$progname: warning: unrecognised file: $f\n";
+ }
+ }
+ }
+}
+
+
+sub error($) {
+ my ($err) = @_;
+ print STDERR "$progname: $err\n";
+ exit 1;
+}
+
+sub usage() {
+ print STDERR "usage: $progname [--verbose] [--debug]" .
+ " [--build-android] files ...\n";
+ exit 1;
+}
+
+sub main() {
+ my $android_p = 0;
+ my @files = ();
+ while ($#ARGV >= 0) {
+ $_ = shift @ARGV;
+ if (m/^--?verbose$/) { $verbose++; }
+ elsif (m/^-v+$/) { $verbose += length($_)-1; }
+ elsif (m/^--?debug$/s) { $debug_p++; }
+ elsif (m/^--?build-android$/s) { $android_p++; }
+ elsif (m/^-./) { usage; }
+ else { push @files, $_; }
+# else { usage; }
+ }
+
+ usage unless ($#files >= 0);
+ my $failures = 0;
+ foreach my $file (@files) {
+ $failures += check_config ($file);
+ }
+
+ build_android (@files) if ($android_p);
+
+ exit ($failures);
+}
+
+main();
diff --git a/hacks/cloudlife.c b/hacks/cloudlife.c
new file mode 100644
index 0000000..4b65f9e
--- /dev/null
+++ b/hacks/cloudlife.c
@@ -0,0 +1,428 @@
+/* cloudlife by Don Marti <dmarti@zgp.org>
+ *
+ * Based on Conway's Life, but with one rule change to make it a better
+ * screensaver: cells have a max age.
+ *
+ * When a cell exceeds the max age, it counts as 3 for populating the next
+ * generation. This makes long-lived formations explode instead of just
+ * sitting there burning a hole in your screen.
+ *
+ * Cloudlife only draws one pixel of each cell per tick, whether the cell is
+ * alive or dead. So gliders look like little comets.
+
+ * 20 May 2003 -- now includes color cycling and a man page.
+
+ * Based on several examples from the hacks directory of:
+
+ * xscreensaver, Copyright (c) 1997, 1998, 2002 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include "screenhack.h"
+
+#ifndef MAX_WIDTH
+#include <limits.h>
+#define MAX_WIDTH SHRT_MAX
+#endif
+
+#ifdef TIME_ME
+#include <time.h>
+#endif
+
+/* this program goes faster if some functions are inline. The following is
+ * borrowed from ifs.c */
+#if !defined( __GNUC__ ) && !defined(__cplusplus) && !defined(c_plusplus)
+#undef inline
+#define inline /* */
+#endif
+
+struct field {
+ unsigned int height;
+ unsigned int width;
+ unsigned int max_age;
+ unsigned int cell_size;
+ unsigned char *cells;
+ unsigned char *new_cells;
+};
+
+struct state {
+ Display *dpy;
+ Window window;
+
+#ifdef TIME_ME
+ time_t start_time;
+#endif
+
+ unsigned int cycles;
+ unsigned int colorindex; /* which color in the colormap are we on */
+ unsigned int colortimer; /* when this reaches 0, cycle to next color */
+
+ int cycle_delay;
+ int cycle_colors;
+ int ncolors;
+ int density;
+
+ GC fgc, bgc;
+ XGCValues gcv;
+ XWindowAttributes xgwa;
+ XColor *colors;
+
+ struct field *field;
+
+ XPoint fg_points[MAX_WIDTH];
+ XPoint bg_points[MAX_WIDTH];
+};
+
+
+static void
+*xrealloc(void *p, size_t size)
+{
+ void *ret;
+ if ((ret = realloc(p, size)) == NULL) {
+ fprintf(stderr, "%s: out of memory\n", progname);
+ exit(1);
+ }
+ return ret;
+}
+
+static struct field *
+init_field(struct state *st)
+{
+ struct field *f = xrealloc(NULL, sizeof(struct field));
+ f->height = 0;
+ f->width = 0;
+ f->cell_size = get_integer_resource(st->dpy, "cellSize", "Integer");
+ f->max_age = get_integer_resource(st->dpy, "maxAge", "Integer");
+
+ if (f->max_age > 255) {
+ fprintf (stderr, "%s: max-age must be < 256 (not %d)\n", progname,
+ f->max_age);
+ exit (1);
+ }
+
+ f->cells = NULL;
+ f->new_cells = NULL;
+ return f;
+}
+
+static void
+resize_field(struct field * f, unsigned int w, unsigned int h)
+{
+ int s = w * h * sizeof(unsigned char);
+ f->width = w;
+ f->height = h;
+
+ f->cells = xrealloc(f->cells, s);
+ f->new_cells = xrealloc(f->new_cells, s);
+ memset(f->cells, 0, s);
+ memset(f->new_cells, 0, s);
+}
+
+static inline unsigned char
+*cell_at(struct field * f, unsigned int x, unsigned int y)
+{
+ return (f->cells + x * sizeof(unsigned char) +
+ y * f->width * sizeof(unsigned char));
+}
+
+static inline unsigned char
+*new_cell_at(struct field * f, unsigned int x, unsigned int y)
+{
+ return (f->new_cells + x * sizeof(unsigned char) +
+ y * f->width * sizeof(unsigned char));
+}
+
+static void
+draw_field(struct state *st, struct field * f)
+{
+ unsigned int x, y;
+ unsigned int rx, ry = 0; /* random amount to offset the dot */
+ unsigned int size = 1 << f->cell_size;
+ unsigned int mask = size - 1;
+ unsigned int fg_count, bg_count;
+
+ /* columns 0 and width-1 are off screen and not drawn. */
+ for (y = 1; y < f->height - 1; y++) {
+ fg_count = 0;
+ bg_count = 0;
+
+ /* rows 0 and height-1 are off screen and not drawn. */
+ for (x = 1; x < f->width - 1; x++) {
+ rx = random();
+ ry = rx >> f->cell_size;
+ rx &= mask;
+ ry &= mask;
+
+ if (*cell_at(f, x, y)) {
+ st->fg_points[fg_count].x = (short) x *size - rx - 1;
+ st->fg_points[fg_count].y = (short) y *size - ry - 1;
+ fg_count++;
+ } else {
+ st->bg_points[bg_count].x = (short) x *size - rx - 1;
+ st->bg_points[bg_count].y = (short) y *size - ry - 1;
+ bg_count++;
+ }
+ }
+ XDrawPoints(st->dpy, st->window, st->fgc, st->fg_points, fg_count,
+ CoordModeOrigin);
+ XDrawPoints(st->dpy, st->window, st->bgc, st->bg_points, bg_count,
+ CoordModeOrigin);
+ }
+}
+
+static inline unsigned int
+cell_value(unsigned char c, unsigned int age)
+{
+ if (!c) {
+ return 0;
+ } else if (c > age) {
+ return (3);
+ } else {
+ return (1);
+ }
+}
+
+static inline unsigned int
+is_alive(struct field * f, unsigned int x, unsigned int y)
+{
+ unsigned int count;
+ unsigned int i, j;
+ unsigned char *p;
+
+ count = 0;
+
+ for (i = x - 1; i <= x + 1; i++) {
+ for (j = y - 1; j <= y + 1; j++) {
+ if (y != j || x != i) {
+ count += cell_value(*cell_at(f, i, j), f->max_age);
+ }
+ }
+ }
+
+ p = cell_at(f, x, y);
+ if (*p) {
+ if (count == 2 || count == 3) {
+ return ((*p) + 1);
+ } else {
+ return (0);
+ }
+ } else {
+ if (count == 3) {
+ return (1);
+ } else {
+ return (0);
+ }
+ }
+}
+
+static unsigned int
+do_tick(struct field * f)
+{
+ unsigned int x, y;
+ unsigned int count = 0;
+ for (x = 1; x < f->width - 1; x++) {
+ for (y = 1; y < f->height - 1; y++) {
+ count += *new_cell_at(f, x, y) = is_alive(f, x, y);
+ }
+ }
+ memcpy(f->cells, f->new_cells, f->width * f->height *
+ sizeof(unsigned char));
+ return count;
+}
+
+
+static unsigned int
+random_cell(unsigned int p)
+{
+ int r = random() & 0xff;
+
+ if (r < p) {
+ return (1);
+ } else {
+ return (0);
+ }
+}
+
+static void
+populate_field(struct field * f, unsigned int p)
+{
+ unsigned int x, y;
+
+ for (x = 0; x < f->width; x++) {
+ for (y = 0; y < f->height; y++) {
+ *cell_at(f, x, y) = random_cell(p);
+ }
+ }
+}
+
+static void
+populate_edges(struct field * f, unsigned int p)
+{
+ unsigned int i;
+
+ for (i = f->width; i--;) {
+ *cell_at(f, i, 0) = random_cell(p);
+ *cell_at(f, i, f->height - 1) = random_cell(p);
+ }
+
+ for (i = f->height; i--;) {
+ *cell_at(f, f->width - 1, i) = random_cell(p);
+ *cell_at(f, 0, i) = random_cell(p);
+ }
+}
+
+static void *
+cloudlife_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ Bool tmp = True;
+
+ st->dpy = dpy;
+ st->window = window;
+ st->field = init_field(st);
+
+#ifdef TIME_ME
+ st->start_time = time(NULL);
+#endif
+
+ st->cycle_delay = get_integer_resource(st->dpy, "cycleDelay", "Integer");
+ st->cycle_colors = get_integer_resource(st->dpy, "cycleColors", "Integer");
+ st->ncolors = get_integer_resource(st->dpy, "ncolors", "Integer");
+ st->density = (get_integer_resource(st->dpy, "initialDensity", "Integer")
+ % 100 * 256)/100;
+
+ XGetWindowAttributes(st->dpy, st->window, &st->xgwa);
+
+ if (st->cycle_colors) {
+ st->colors = (XColor *) xrealloc(st->colors, sizeof(XColor) * (st->ncolors+1));
+ make_smooth_colormap (st->xgwa.screen, st->xgwa.visual,
+ st->xgwa.colormap, st->colors, &st->ncolors,
+ True, &tmp, True);
+ }
+
+ st->gcv.foreground = get_pixel_resource(st->dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ st->fgc = XCreateGC(st->dpy, st->window, GCForeground, &st->gcv);
+
+ st->gcv.foreground = get_pixel_resource(st->dpy, st->xgwa.colormap,
+ "background", "Background");
+ st->bgc = XCreateGC(st->dpy, st->window, GCForeground, &st->gcv);
+
+ return st;
+}
+
+static unsigned long
+cloudlife_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if (st->cycle_colors) {
+ if (st->colortimer == 0) {
+ st->colortimer = st->cycle_colors;
+ if( st->colorindex == 0 )
+ st->colorindex = st->ncolors;
+ st->colorindex--;
+ XSetForeground(st->dpy, st->fgc, st->colors[st->colorindex].pixel);
+ }
+ st->colortimer--;
+ }
+
+ XGetWindowAttributes(st->dpy, st->window, &st->xgwa);
+ if (st->field->height != st->xgwa.height / (1 << st->field->cell_size) + 2 ||
+ st->field->width != st->xgwa.width / (1 << st->field->cell_size) + 2) {
+
+ resize_field(st->field, st->xgwa.width / (1 << st->field->cell_size) + 2,
+ st->xgwa.height / (1 << st->field->cell_size) + 2);
+ populate_field(st->field, st->density);
+ }
+
+ draw_field(st, st->field);
+
+ if (do_tick(st->field) < (st->field->height + st->field->width) / 4) {
+ populate_field(st->field, st->density);
+ }
+
+ if (st->cycles % (st->field->max_age /2) == 0) {
+ populate_edges(st->field, st->density);
+ do_tick(st->field);
+ populate_edges(st->field, 0);
+ }
+
+ st->cycles++;
+
+#ifdef TIME_ME
+ if (st->cycles % st->field->max_age == 0) {
+ printf("%g s.\n",
+ ((time(NULL) - st->start_time) * 1000.0) / st->cycles);
+ }
+#endif
+
+ return (st->cycle_delay);
+}
+
+
+static void
+cloudlife_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+cloudlife_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ XClearWindow (dpy, window);
+ st->cycles = 0;
+ st->field = init_field(st);
+ return True;
+ }
+ return False;
+}
+
+static void
+cloudlife_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+static const char *cloudlife_defaults[] = {
+ ".background: black",
+ ".foreground: blue",
+ "*fpsSolid: true",
+ "*cycleDelay: 25000",
+ "*cycleColors: 2",
+ "*ncolors: 64",
+ "*maxAge: 64",
+ "*initialDensity: 30",
+ "*cellSize: 3",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec cloudlife_options[] = {
+ {"-background", ".background", XrmoptionSepArg, 0},
+ {"-foreground", ".foreground", XrmoptionSepArg, 0},
+ {"-cycle-delay", ".cycleDelay", XrmoptionSepArg, 0},
+ {"-cycle-colors", ".cycleColors", XrmoptionSepArg, 0},
+ {"-ncolors", ".ncolors", XrmoptionSepArg, 0},
+ {"-cell-size", ".cellSize", XrmoptionSepArg, 0},
+ {"-initial-density", ".initialDensity", XrmoptionSepArg, 0},
+ {"-max-age", ".maxAge", XrmoptionSepArg, 0},
+ {0, 0, 0, 0}
+};
+
+
+XSCREENSAVER_MODULE ("CloudLife", cloudlife)
diff --git a/hacks/cloudlife.man b/hacks/cloudlife.man
new file mode 100644
index 0000000..35eae12
--- /dev/null
+++ b/hacks/cloudlife.man
@@ -0,0 +1,87 @@
+.TH XScreenSaver 6 "20-May-2003" "X Version 11"
+.SH NAME
+cloudlife - a cellular automaton based on Conway's Life
+.SH SYNOPSIS
+.B cloudlife
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-cycle-delay \fImicroseconds\fP] [\-cycle-colors \fIinteger\fP][\-cell-size \fIinteger\fP] [\-initial-density \fIinteger\fP] [\-max-age \fIinteger\fP]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIcloudlife\fP program draws a cellular
+automaton based on Conway's Life, except that
+cells have a maximum age, and only one pixel per
+cell is drawn every tick.
+.SH OPTIONS
+.I cloudlife
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-cycle-delay \fIinteger\fP
+Time in microseconds to sleep between ticks. Default 25000.
+.TP 8
+.B \-cycle-colors \fIinteger\fP
+How many ticks should elapse between cycling colors. 0 to disable
+color cycling. Default 2.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 64.
+The colors are chosen randomly.
+.TP 8
+.B \-cell-size \fIinteger\fP
+Size of each cell, in powers of 2. Default 3 (8-pixel cells).
+.TP 8
+.B \-initial-density \fIinteger\fP
+Percentage of cells that are alive at start and when the
+field is repopulated. Default 30.
+.TP 8
+.B \-max-age \fIinteger\fP
+Maximum age for a cell. Default 64.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+
+Copyright \(co 2003 by Don Marti. Based on
+examples from the hacks directory of xscreensaver,
+Copyright (c) 1997, 1998, 2002 Jamie Zawinski
+<jwz@jwz.org>
+
+This man page based on the man page of sierpinski,
+Copyright \(co 1996 by Desmond Daignault.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Don Marti <dmarti@zgp.org> 20 May 2003.
+
diff --git a/hacks/compass.c b/hacks/compass.c
new file mode 100644
index 0000000..1dc1d3e
--- /dev/null
+++ b/hacks/compass.c
@@ -0,0 +1,986 @@
+/* xscreensaver, Copyright (c) 1999-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+# include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+#define countof(x) (sizeof(x)/sizeof(*(x)))
+#define ABS(x) ((x)<0?-(x):(x))
+#define MAX(x,y) ((x)<(y)?(y):(x))
+#define MIN(x,y) ((x)>(y)?(y):(x))
+#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ int delay;
+ Bool dbuf;
+ struct disc *discs[4];
+ int x, y, size, size2;
+ GC ptr_gc;
+ GC erase_gc;
+ XWindowAttributes xgwa;
+ Pixmap b, ba, bb; /* double-buffer to reduce flicker */
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ XdbeBackBuffer backb;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+};
+
+
+
+struct disc {
+ int theta; /* 0 - 360*64 */
+ int velocity;
+ int acceleration;
+ int limit;
+ GC gc;
+ void (*draw) (struct state *, Drawable, struct disc *,
+ int x, int y, int radius);
+};
+
+
+static void
+draw_letters (struct state *st, Drawable d, struct disc *disc,
+ int x, int y, int radius)
+{
+ XPoint points[50];
+ double th2 = 2 * M_PI * (disc->theta / ((double) 360*64));
+ double th;
+
+ /* W */
+
+ th = th2;
+
+ points[0].x = x + radius * 0.8 * cos(th - 0.07);
+ points[0].y = y + radius * 0.8 * sin(th - 0.07);
+
+ points[1].x = x + radius * 0.7 * cos(th - 0.05);
+ points[1].y = y + radius * 0.7 * sin(th - 0.05);
+
+ points[2].x = x + radius * 0.78 * cos(th);
+ points[2].y = y + radius * 0.78 * sin(th);
+
+ points[3].x = x + radius * 0.7 * cos(th + 0.05);
+ points[3].y = y + radius * 0.7 * sin(th + 0.05);
+
+ points[4].x = x + radius * 0.8 * cos(th + 0.07);
+ points[4].y = y + radius * 0.8 * sin(th + 0.07);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 5, CoordModeOrigin);
+
+ /* 30 (1) */
+
+ th = th2 + (2 * M_PI * 0.08333);
+
+ points[0].x = x + radius * 0.78 * cos(th - 0.13);
+ points[0].y = y + radius * 0.78 * sin(th - 0.13);
+
+ points[1].x = x + radius * 0.8 * cos(th - 0.08);
+ points[1].y = y + radius * 0.8 * sin(th - 0.08);
+
+ points[2].x = x + radius * 0.78 * cos(th - 0.03);
+ points[2].y = y + radius * 0.78 * sin(th - 0.03);
+
+ points[3].x = x + radius * 0.76 * cos(th - 0.03);
+ points[3].y = y + radius * 0.76 * sin(th - 0.03);
+
+ points[4].x = x + radius * 0.75 * cos(th - 0.08);
+ points[4].y = y + radius * 0.75 * sin(th - 0.08);
+
+ points[5].x = x + radius * 0.74 * cos(th - 0.03);
+ points[5].y = y + radius * 0.74 * sin(th - 0.03);
+
+ points[6].x = x + radius * 0.72 * cos(th - 0.03);
+ points[6].y = y + radius * 0.72 * sin(th - 0.03);
+
+ points[7].x = x + radius * 0.7 * cos(th - 0.08);
+ points[7].y = y + radius * 0.7 * sin(th - 0.08);
+
+ points[8].x = x + radius * 0.72 * cos(th - 0.13);
+ points[8].y = y + radius * 0.72 * sin(th - 0.13);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 9, CoordModeOrigin);
+
+ /* 30 (2) */
+
+ points[0].x = x + radius * 0.78 * cos(th + 0.03);
+ points[0].y = y + radius * 0.78 * sin(th + 0.03);
+
+ points[1].x = x + radius * 0.8 * cos(th + 0.08);
+ points[1].y = y + radius * 0.8 * sin(th + 0.08);
+
+ points[2].x = x + radius * 0.78 * cos(th + 0.13);
+ points[2].y = y + radius * 0.78 * sin(th + 0.13);
+
+ points[3].x = x + radius * 0.72 * cos(th + 0.13);
+ points[3].y = y + radius * 0.72 * sin(th + 0.13);
+
+ points[4].x = x + radius * 0.7 * cos(th + 0.08);
+ points[4].y = y + radius * 0.7 * sin(th + 0.08);
+
+ points[5].x = x + radius * 0.72 * cos(th + 0.03);
+ points[5].y = y + radius * 0.72 * sin(th + 0.03);
+
+ points[6] = points[0];
+
+ XDrawLines (st->dpy, d, disc->gc, points, 7, CoordModeOrigin);
+
+ /* 33 (1) */
+
+ th = th2 + (2 * M_PI * 0.16666);
+
+ points[0].x = x + radius * 0.78 * cos(th - 0.13);
+ points[0].y = y + radius * 0.78 * sin(th - 0.13);
+
+ points[1].x = x + radius * 0.8 * cos(th - 0.08);
+ points[1].y = y + radius * 0.8 * sin(th - 0.08);
+
+ points[2].x = x + radius * 0.78 * cos(th - 0.03);
+ points[2].y = y + radius * 0.78 * sin(th - 0.03);
+
+ points[3].x = x + radius * 0.76 * cos(th - 0.03);
+ points[3].y = y + radius * 0.76 * sin(th - 0.03);
+
+ points[4].x = x + radius * 0.75 * cos(th - 0.08);
+ points[4].y = y + radius * 0.75 * sin(th - 0.08);
+
+ points[5].x = x + radius * 0.74 * cos(th - 0.03);
+ points[5].y = y + radius * 0.74 * sin(th - 0.03);
+
+ points[6].x = x + radius * 0.72 * cos(th - 0.03);
+ points[6].y = y + radius * 0.72 * sin(th - 0.03);
+
+ points[7].x = x + radius * 0.7 * cos(th - 0.08);
+ points[7].y = y + radius * 0.7 * sin(th - 0.08);
+
+ points[8].x = x + radius * 0.72 * cos(th - 0.13);
+ points[8].y = y + radius * 0.72 * sin(th - 0.13);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 9, CoordModeOrigin);
+
+ /* 33 (2) */
+
+ points[0].x = x + radius * 0.78 * cos(th + 0.03);
+ points[0].y = y + radius * 0.78 * sin(th + 0.03);
+
+ points[1].x = x + radius * 0.8 * cos(th + 0.08);
+ points[1].y = y + radius * 0.8 * sin(th + 0.08);
+
+ points[2].x = x + radius * 0.78 * cos(th + 0.13);
+ points[2].y = y + radius * 0.78 * sin(th + 0.13);
+
+ points[3].x = x + radius * 0.76 * cos(th + 0.13);
+ points[3].y = y + radius * 0.76 * sin(th + 0.13);
+
+ points[4].x = x + radius * 0.75 * cos(th + 0.08);
+ points[4].y = y + radius * 0.75 * sin(th + 0.08);
+
+ points[5].x = x + radius * 0.74 * cos(th + 0.13);
+ points[5].y = y + radius * 0.74 * sin(th + 0.13);
+
+ points[6].x = x + radius * 0.72 * cos(th + 0.13);
+ points[6].y = y + radius * 0.72 * sin(th + 0.13);
+
+ points[7].x = x + radius * 0.7 * cos(th + 0.08);
+ points[7].y = y + radius * 0.7 * sin(th + 0.08);
+
+ points[8].x = x + radius * 0.72 * cos(th + 0.03);
+ points[8].y = y + radius * 0.72 * sin(th + 0.03);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 9, CoordModeOrigin);
+
+ /* N */
+
+ th = th2 + (2 * M_PI * 0.25);
+
+ points[0].x = x + radius * 0.7 * cos(th - 0.05);
+ points[0].y = y + radius * 0.7 * sin(th - 0.05);
+
+ points[1].x = x + radius * 0.8 * cos(th - 0.05);
+ points[1].y = y + radius * 0.8 * sin(th - 0.05);
+
+ points[2].x = x + radius * 0.7 * cos(th + 0.05);
+ points[2].y = y + radius * 0.7 * sin(th + 0.05);
+
+ points[3].x = x + radius * 0.8 * cos(th + 0.05);
+ points[3].y = y + radius * 0.8 * sin(th + 0.05);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 4, CoordModeOrigin);
+
+ /* 3 */
+
+ th = th2 + (2 * M_PI * 0.33333);
+
+ points[0].x = x + radius * 0.78 * cos(th - 0.05);
+ points[0].y = y + radius * 0.78 * sin(th - 0.05);
+
+ points[1].x = x + radius * 0.8 * cos(th);
+ points[1].y = y + radius * 0.8 * sin(th);
+
+ points[2].x = x + radius * 0.78 * cos(th + 0.05);
+ points[2].y = y + radius * 0.78 * sin(th + 0.05);
+
+ points[3].x = x + radius * 0.76 * cos(th + 0.05);
+ points[3].y = y + radius * 0.76 * sin(th + 0.05);
+
+ points[4].x = x + radius * 0.75 * cos(th);
+ points[4].y = y + radius * 0.75 * sin(th);
+
+ points[5].x = x + radius * 0.74 * cos(th + 0.05);
+ points[5].y = y + radius * 0.74 * sin(th + 0.05);
+
+ points[6].x = x + radius * 0.72 * cos(th + 0.05);
+ points[6].y = y + radius * 0.72 * sin(th + 0.05);
+
+ points[7].x = x + radius * 0.7 * cos(th);
+ points[7].y = y + radius * 0.7 * sin(th);
+
+ points[8].x = x + radius * 0.72 * cos(th - 0.05);
+ points[8].y = y + radius * 0.72 * sin(th - 0.05);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 9, CoordModeOrigin);
+
+ /* 6 */
+
+ th = th2 + (2 * M_PI * 0.41666);
+
+ points[0].x = x + radius * 0.78 * cos(th + 0.05);
+ points[0].y = y + radius * 0.78 * sin(th + 0.05);
+
+ points[1].x = x + radius * 0.8 * cos(th);
+ points[1].y = y + radius * 0.8 * sin(th);
+
+ points[2].x = x + radius * 0.78 * cos(th - 0.05);
+ points[2].y = y + radius * 0.78 * sin(th - 0.05);
+
+ points[3].x = x + radius * 0.72 * cos(th - 0.05);
+ points[3].y = y + radius * 0.72 * sin(th - 0.05);
+
+ points[4].x = x + radius * 0.7 * cos(th);
+ points[4].y = y + radius * 0.7 * sin(th);
+
+ points[5].x = x + radius * 0.72 * cos(th + 0.05);
+ points[5].y = y + radius * 0.72 * sin(th + 0.05);
+
+ points[6].x = x + radius * 0.74 * cos(th + 0.05);
+ points[6].y = y + radius * 0.74 * sin(th + 0.05);
+
+ points[7].x = x + radius * 0.76 * cos(th);
+ points[7].y = y + radius * 0.76 * sin(th);
+
+ points[8].x = x + radius * 0.74 * cos(th - 0.05);
+ points[8].y = y + radius * 0.74 * sin(th - 0.05);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 9, CoordModeOrigin);
+
+
+ /* E */
+
+ th = th2 + (2 * M_PI * 0.5);
+
+ points[0].x = x + radius * 0.8 * cos(th + 0.05);
+ points[0].y = y + radius * 0.8 * sin(th + 0.05);
+
+ points[1].x = x + radius * 0.8 * cos(th - 0.05);
+ points[1].y = y + radius * 0.8 * sin(th - 0.05);
+
+ points[2].x = x + radius * 0.75 * cos(th - 0.05);
+ points[2].y = y + radius * 0.75 * sin(th - 0.05);
+
+ points[3].x = x + radius * 0.75 * cos(th + 0.025);
+ points[3].y = y + radius * 0.75 * sin(th + 0.025);
+
+ points[4].x = x + radius * 0.75 * cos(th - 0.05);
+ points[4].y = y + radius * 0.75 * sin(th - 0.05);
+
+ points[5].x = x + radius * 0.7 * cos(th - 0.05);
+ points[5].y = y + radius * 0.7 * sin(th - 0.05);
+
+ points[6].x = x + radius * 0.7 * cos(th + 0.05);
+ points[6].y = y + radius * 0.7 * sin(th + 0.05);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 7, CoordModeOrigin);
+
+ /* 12 (1) */
+
+ th = th2 + (2 * M_PI * 0.58333);
+
+ points[0].x = x + radius * 0.77 * cos(th - 0.06);
+ points[0].y = y + radius * 0.77 * sin(th - 0.06);
+
+ points[1].x = x + radius * 0.8 * cos(th - 0.03);
+ points[1].y = y + radius * 0.8 * sin(th - 0.03);
+
+ points[2].x = x + radius * 0.7 * cos(th - 0.03);
+ points[2].y = y + radius * 0.7 * sin(th - 0.03);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 3, CoordModeOrigin);
+
+ /* 12 (2) */
+
+ points[0].x = x + radius * 0.78 * cos(th + 0.02);
+ points[0].y = y + radius * 0.78 * sin(th + 0.02);
+
+ points[1].x = x + radius * 0.8 * cos(th + 0.07);
+ points[1].y = y + radius * 0.8 * sin(th + 0.07);
+
+ points[2].x = x + radius * 0.78 * cos(th + 0.11);
+ points[2].y = y + radius * 0.78 * sin(th + 0.11);
+
+ points[3].x = x + radius * 0.76 * cos(th + 0.11);
+ points[3].y = y + radius * 0.76 * sin(th + 0.11);
+
+ points[4].x = x + radius * 0.74 * cos(th + 0.02);
+ points[4].y = y + radius * 0.74 * sin(th + 0.02);
+
+ points[5].x = x + radius * 0.71 * cos(th + 0.03);
+ points[5].y = y + radius * 0.71 * sin(th + 0.03);
+
+ points[6].x = x + radius * 0.7 * cos(th + 0.03);
+ points[6].y = y + radius * 0.7 * sin(th + 0.03);
+
+ points[7].x = x + radius * 0.7 * cos(th + 0.13);
+ points[7].y = y + radius * 0.7 * sin(th + 0.13);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 8, CoordModeOrigin);
+
+ /* 15 (1) */
+
+ th = th2 + (2 * M_PI * 0.66666);
+
+ points[0].x = x + radius * 0.77 * cos(th - 0.06);
+ points[0].y = y + radius * 0.77 * sin(th - 0.06);
+
+ points[1].x = x + radius * 0.8 * cos(th - 0.03);
+ points[1].y = y + radius * 0.8 * sin(th - 0.03);
+
+ points[2].x = x + radius * 0.7 * cos(th - 0.03);
+ points[2].y = y + radius * 0.7 * sin(th - 0.03);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 3, CoordModeOrigin);
+
+ /* 15 (2) */
+
+ points[0].x = x + radius * 0.8 * cos(th + 0.11);
+ points[0].y = y + radius * 0.8 * sin(th + 0.11);
+
+ points[1].x = x + radius * 0.8 * cos(th + 0.02);
+ points[1].y = y + radius * 0.8 * sin(th + 0.02);
+
+ points[2].x = x + radius * 0.76 * cos(th + 0.02);
+ points[2].y = y + radius * 0.76 * sin(th + 0.02);
+
+ points[3].x = x + radius * 0.77 * cos(th + 0.06);
+ points[3].y = y + radius * 0.77 * sin(th + 0.06);
+
+ points[4].x = x + radius * 0.76 * cos(th + 0.10);
+ points[4].y = y + radius * 0.76 * sin(th + 0.10);
+
+ points[5].x = x + radius * 0.73 * cos(th + 0.11);
+ points[5].y = y + radius * 0.73 * sin(th + 0.11);
+
+ points[6].x = x + radius * 0.72 * cos(th + 0.10);
+ points[6].y = y + radius * 0.72 * sin(th + 0.10);
+
+ points[7].x = x + radius * 0.7 * cos(th + 0.06);
+ points[7].y = y + radius * 0.7 * sin(th + 0.06);
+
+ points[8].x = x + radius * 0.72 * cos(th + 0.02);
+ points[8].y = y + radius * 0.72 * sin(th + 0.02);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 9, CoordModeOrigin);
+
+ /* S */
+
+ th = th2 + (2 * M_PI * 0.75);
+
+ points[0].x = x + radius * 0.78 * cos(th + 0.05);
+ points[0].y = y + radius * 0.78 * sin(th + 0.05);
+
+ points[1].x = x + radius * 0.8 * cos(th);
+ points[1].y = y + radius * 0.8 * sin(th);
+
+ points[2].x = x + radius * 0.78 * cos(th - 0.05);
+ points[2].y = y + radius * 0.78 * sin(th - 0.05);
+
+ points[3].x = x + radius * 0.76 * cos(th - 0.05);
+ points[3].y = y + radius * 0.76 * sin(th - 0.05);
+
+ points[4].x = x + radius * 0.74 * cos(th + 0.05);
+ points[4].y = y + radius * 0.74 * sin(th + 0.05);
+
+ points[5].x = x + radius * 0.72 * cos(th + 0.05);
+ points[5].y = y + radius * 0.72 * sin(th + 0.05);
+
+ points[6].x = x + radius * 0.7 * cos(th);
+ points[6].y = y + radius * 0.7 * sin(th);
+
+ points[7].x = x + radius * 0.72 * cos(th - 0.05);
+ points[7].y = y + radius * 0.72 * sin(th - 0.05);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 8, CoordModeOrigin);
+
+ /* 21 (1) */
+
+ th = th2 + (2 * M_PI * 0.83333);
+
+ points[0].x = x + radius * 0.78 * cos(th - 0.13);
+ points[0].y = y + radius * 0.78 * sin(th - 0.13);
+
+ points[1].x = x + radius * 0.8 * cos(th - 0.08);
+ points[1].y = y + radius * 0.8 * sin(th - 0.08);
+
+ points[2].x = x + radius * 0.78 * cos(th - 0.03);
+ points[2].y = y + radius * 0.78 * sin(th - 0.03);
+
+ points[3].x = x + radius * 0.76 * cos(th - 0.03);
+ points[3].y = y + radius * 0.76 * sin(th - 0.03);
+
+ points[4].x = x + radius * 0.74 * cos(th - 0.12);
+ points[4].y = y + radius * 0.74 * sin(th - 0.12);
+
+ points[5].x = x + radius * 0.71 * cos(th - 0.13);
+ points[5].y = y + radius * 0.71 * sin(th - 0.13);
+
+ points[6].x = x + radius * 0.7 * cos(th - 0.13);
+ points[6].y = y + radius * 0.7 * sin(th - 0.13);
+
+ points[7].x = x + radius * 0.7 * cos(th - 0.02);
+ points[7].y = y + radius * 0.7 * sin(th - 0.02);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 8, CoordModeOrigin);
+
+ /* 21 (2) */
+
+ points[0].x = x + radius * 0.77 * cos(th + 0.03);
+ points[0].y = y + radius * 0.77 * sin(th + 0.03);
+
+ points[1].x = x + radius * 0.8 * cos(th + 0.06);
+ points[1].y = y + radius * 0.8 * sin(th + 0.06);
+
+ points[2].x = x + radius * 0.7 * cos(th + 0.06);
+ points[2].y = y + radius * 0.7 * sin(th + 0.06);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 3, CoordModeOrigin);
+
+ /* 24 (1) */
+
+ th = th2 + (2 * M_PI * 0.91666);
+
+ points[0].x = x + radius * 0.78 * cos(th - 0.13);
+ points[0].y = y + radius * 0.78 * sin(th - 0.13);
+
+ points[1].x = x + radius * 0.8 * cos(th - 0.08);
+ points[1].y = y + radius * 0.8 * sin(th - 0.08);
+
+ points[2].x = x + radius * 0.78 * cos(th - 0.03);
+ points[2].y = y + radius * 0.78 * sin(th - 0.03);
+
+ points[3].x = x + radius * 0.76 * cos(th - 0.03);
+ points[3].y = y + radius * 0.76 * sin(th - 0.03);
+
+ points[4].x = x + radius * 0.74 * cos(th - 0.12);
+ points[4].y = y + radius * 0.74 * sin(th - 0.12);
+
+ points[5].x = x + radius * 0.71 * cos(th - 0.13);
+ points[5].y = y + radius * 0.71 * sin(th - 0.13);
+
+ points[6].x = x + radius * 0.7 * cos(th - 0.13);
+ points[6].y = y + radius * 0.7 * sin(th - 0.13);
+
+ points[7].x = x + radius * 0.7 * cos(th - 0.02);
+ points[7].y = y + radius * 0.7 * sin(th - 0.02);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 8, CoordModeOrigin);
+
+ /* 24 (2) */
+
+ points[0].x = x + radius * 0.69 * cos(th + 0.09);
+ points[0].y = y + radius * 0.69 * sin(th + 0.09);
+
+ points[1].x = x + radius * 0.8 * cos(th + 0.09);
+ points[1].y = y + radius * 0.8 * sin(th + 0.09);
+
+ points[2].x = x + radius * 0.72 * cos(th + 0.01);
+ points[2].y = y + radius * 0.72 * sin(th + 0.01);
+
+ points[3].x = x + radius * 0.72 * cos(th + 0.13);
+ points[3].y = y + radius * 0.72 * sin(th + 0.13);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 4, CoordModeOrigin);
+}
+
+
+static void
+draw_ticks (struct state *st, Drawable d, struct disc *disc,
+ int x, int y, int radius)
+{
+ XSegment segs[72];
+ int i;
+ double tick = (M_PI * 2) / 72;
+
+ for (i = 0; i < 72; i++)
+ {
+ int radius2 = radius;
+ double th = (i * tick) + (2 * M_PI * (disc->theta / ((double) 360*64)));
+
+ if (i % 6)
+ radius2 -= radius / 16;
+ else
+ radius2 -= radius / 8;
+
+ segs[i].x1 = x + radius * cos(th);
+ segs[i].y1 = y + radius * sin(th);
+ segs[i].x2 = x + radius2 * cos(th);
+ segs[i].y2 = y + radius2 * sin(th);
+ }
+ XDrawSegments (st->dpy, d, disc->gc, segs, countof(segs));
+
+ draw_letters (st, d, disc, x, y, radius);
+}
+
+
+static void
+draw_thin_arrow (struct state *st, Drawable d, struct disc *disc,
+ int x, int y, int radius)
+{
+ XPoint points[3];
+ double th;
+ int radius2;
+ double tick = ((M_PI * 2) / 72) * 2;
+
+ radius *= 0.9;
+ radius2 = radius - (radius / 8) * 3;
+
+ th = 2 * M_PI * (disc->theta / ((double) 360*64));
+
+ points[0].x = x + radius * cos(th); /* tip */
+ points[0].y = y + radius * sin(th);
+
+ points[1].x = x + radius2 * cos(th - tick); /* tip left */
+ points[1].y = y + radius2 * sin(th - tick);
+
+ points[2].x = x + radius2 * cos(th + tick); /* tip right */
+ points[2].y = y + radius2 * sin(th + tick);
+
+ XDrawLine (st->dpy, d, disc->gc,
+ (int) (x + radius2 * cos(th)),
+ (int) (y + radius2 * sin(th)),
+ (int) (x + -radius * cos(th)),
+ (int) (y + -radius * sin(th)));
+
+ XFillPolygon (st->dpy, d, disc->gc, points, 3, Convex, CoordModeOrigin);
+}
+
+
+static void
+draw_thick_arrow (struct state *st, Drawable d, struct disc *disc,
+ int x, int y, int radius)
+{
+ XPoint points[10];
+ double th;
+ int radius2, radius3;
+ double tick = ((M_PI * 2) / 72) * 2;
+
+ radius *= 0.9;
+ radius2 = radius - (radius / 8) * 3;
+ radius3 = radius - (radius / 8) * 2;
+ th = 2 * M_PI * (disc->theta / ((double) 360*64));
+
+ points[0].x = x + radius * cos(th); /* tip */
+ points[0].y = y + radius * sin(th);
+
+ points[1].x = x + radius2 * cos(th - tick); /* tip left */
+ points[1].y = y + radius2 * sin(th - tick);
+
+ points[2].x = x + radius2 * cos(th + tick); /* tip right */
+ points[2].y = y + radius2 * sin(th + tick);
+
+ points[3] = points[0];
+
+ XDrawLines (st->dpy, d, disc->gc, points, 4, CoordModeOrigin);
+
+ points[0].x = x + radius2 * cos(th - tick/2); /* top left */
+ points[0].y = y + radius2 * sin(th - tick/2);
+
+ points[1].x = x + -radius2 * cos(th + tick/2); /* bottom left */
+ points[1].y = y + -radius2 * sin(th + tick/2);
+
+ points[2].x = x + -radius3 * cos(th); /* bottom */
+ points[2].y = y + -radius3 * sin(th);
+
+ points[3].x = x + -radius * cos(th); /* bottom spike */
+ points[3].y = y + -radius * sin(th);
+
+ points[4] = points[2]; /* return */
+
+ points[5].x = x + -radius2 * cos(th - tick/2); /* bottom right */
+ points[5].y = y + -radius2 * sin(th - tick/2);
+
+ points[6].x = x + radius2 * cos(th + tick/2); /* top right */
+ points[6].y = y + radius2 * sin(th + tick/2);
+
+ XDrawLines (st->dpy, d, disc->gc, points, 7, CoordModeOrigin);
+}
+
+
+
+static void
+roll_disc (struct disc *disc)
+{
+ double th = disc->theta;
+ if (th < 0)
+ th = -(th + disc->velocity);
+ else
+ th = (th + disc->velocity);
+
+ if (th > (360*64))
+ th -= (360*64);
+ else if (th < 0)
+ th += (360*64);
+
+ disc->theta = (disc->theta > 0 ? th : -th);
+
+ disc->velocity += disc->acceleration;
+
+ if (disc->velocity > disc->limit ||
+ disc->velocity < -disc->limit)
+ disc->acceleration = -disc->acceleration;
+
+ /* Alter direction of rotational acceleration randomly. */
+ if (! (random() % 120))
+ disc->acceleration = -disc->acceleration;
+
+ /* Change acceleration very occasionally. */
+ if (! (random() % 200))
+ {
+ if (random() & 1)
+ disc->acceleration *= 1.2;
+ else
+ disc->acceleration *= 0.8;
+ }
+}
+
+
+static void
+init_spin (struct disc *disc)
+{
+ disc->limit = 5*64;
+ disc->theta = RAND(360*64);
+ disc->velocity = RAND(16) * RANDSIGN();
+ disc->acceleration = RAND(16) * RANDSIGN();
+}
+
+
+static void
+draw_compass (struct state *st)
+{
+ int i = 0;
+ while (st->discs[i])
+ {
+ st->discs[i]->draw (st, st->b, st->discs[i], st->x, st->y, st->size);
+ roll_disc (st->discs[i]);
+ i++;
+ }
+}
+
+static void
+draw_pointer (struct state *st)
+{
+ int radius = st->size;
+ GC dot_gc = st->discs[0]->gc;
+ XPoint points[3];
+ int size = radius * 0.1;
+
+ /* top */
+
+ points[0].x = st->x - size;
+ points[0].y = st->y - radius - size;
+
+ points[1].x = st->x + size;
+ points[1].y = st->y - radius - size;
+
+ points[2].x = st->x;
+ points[2].y = st->y - radius;
+
+ XFillPolygon (st->dpy, st->b, st->ptr_gc, points, 3, Convex, CoordModeOrigin);
+
+ /* top right */
+
+ points[0].x = st->x - (radius * 0.85);
+ points[0].y = st->y - (radius * 0.8);
+
+ points[1].x = st->x - (radius * 1.1);
+ points[1].y = st->y - (radius * 0.55);
+
+ points[2].x = st->x - (radius * 0.6);
+ points[2].y = st->y - (radius * 0.65);
+
+ XFillPolygon (st->dpy, st->b, st->ptr_gc, points, 3, Convex, CoordModeOrigin);
+
+ /* left */
+
+ points[0].x = st->x - (radius * 1.05);
+ points[0].y = st->y;
+
+ points[1].x = st->x - (radius * 1.1);
+ points[1].y = st->y - (radius * 0.025);
+
+ points[2].x = st->x - (radius * 1.1);
+ points[2].y = st->y + (radius * 0.025);
+
+ XFillPolygon (st->dpy, st->b, dot_gc, points, 3, Convex, CoordModeOrigin);
+
+ /* right */
+
+ points[0].x = st->x + (radius * 1.05);
+ points[0].y = st->y;
+
+ points[1].x = st->x + (radius * 1.1);
+ points[1].y = st->y - (radius * 0.025);
+
+ points[2].x = st->x + (radius * 1.1);
+ points[2].y = st->y + (radius * 0.025);
+
+ XFillPolygon (st->dpy, st->b, dot_gc, points, 3, Convex, CoordModeOrigin);
+
+ /* bottom */
+
+ points[0].x = st->x;
+ points[0].y = st->y + (radius * 1.05);
+
+ points[1].x = st->x - (radius * 0.025);
+ points[1].y = st->y + (radius * 1.1);
+
+ points[2].x = st->x + (radius * 0.025);
+ points[2].y = st->y + (radius * 1.1);
+
+ XFillPolygon (st->dpy, st->b, dot_gc, points, 3, Convex, CoordModeOrigin);
+
+ /* bottom left */
+
+ points[0].x = st->x + (radius * 0.74);
+ points[0].y = st->y + (radius * 0.74);
+
+ points[1].x = st->x + (radius * 0.78);
+ points[1].y = st->y + (radius * 0.75);
+
+ points[2].x = st->x + (radius * 0.75);
+ points[2].y = st->y + (radius * 0.78);
+
+ XFillPolygon (st->dpy, st->b, dot_gc, points, 3, Convex, CoordModeOrigin);
+
+ /* top left */
+
+ points[0].x = st->x + (radius * 0.74);
+ points[0].y = st->y - (radius * 0.74);
+
+ points[1].x = st->x + (radius * 0.78);
+ points[1].y = st->y - (radius * 0.75);
+
+ points[2].x = st->x + (radius * 0.75);
+ points[2].y = st->y - (radius * 0.78);
+
+ XFillPolygon (st->dpy, st->b, dot_gc, points, 3, Convex, CoordModeOrigin);
+
+ /* bottom right */
+
+ points[0].x = st->x - (radius * 0.74);
+ points[0].y = st->y + (radius * 0.74);
+
+ points[1].x = st->x - (radius * 0.78);
+ points[1].y = st->y + (radius * 0.75);
+
+ points[2].x = st->x - (radius * 0.75);
+ points[2].y = st->y + (radius * 0.78);
+
+ XFillPolygon (st->dpy, st->b, dot_gc, points, 3, Convex, CoordModeOrigin);
+}
+
+
+static void *
+compass_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ st->dpy = dpy;
+ st->window = window;
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ st->dbuf = get_boolean_resource (st->dpy, "doubleBuffer", "Boolean");
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ st->dbuf = False;
+# endif
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ st->size2 = MIN(st->xgwa.width, st->xgwa.height);
+
+ if (st->xgwa.width > st->xgwa.height * 5 || /* goofy aspect ratio */
+ st->xgwa.height > st->xgwa.width * 5)
+ st->size2 = MAX(st->xgwa.width, st->xgwa.height);
+
+ {
+ int max = 600;
+ if (st->xgwa.width > 2560) max *= 2; /* Retina displays */
+ if (st->size2 > max) st->size2 = max;
+ }
+
+ st->size = (st->size2 / 2) * 0.8;
+
+ st->x = st->xgwa.width/2;
+ st->y = st->xgwa.height/2;
+
+ if (st->dbuf)
+ {
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ st->b = st->backb = xdbe_get_backbuffer (st->dpy, st->window, XdbeUndefined);
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ if (!st->b)
+ {
+ st->x = st->size2/2;
+ st->y = st->size2/2;
+ st->ba = XCreatePixmap (st->dpy, st->window, st->size2, st->size2, st->xgwa.depth);
+ st->bb = XCreatePixmap (st->dpy, st->window, st->size2, st->size2, st->xgwa.depth);
+ st->b = st->ba;
+ }
+ }
+ else
+ {
+ st->b = st->window;
+ }
+
+ st->discs[0] = (struct disc *) calloc (1, sizeof (struct disc));
+ st->discs[1] = (struct disc *) calloc (1, sizeof (struct disc));
+ st->discs[2] = (struct disc *) calloc (1, sizeof (struct disc));
+ st->discs[3] = 0;
+
+ gcv.foreground = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ gcv.line_width = MAX(2, (st->size/60));
+ gcv.join_style = JoinBevel;
+ st->discs[0]->draw = draw_ticks;
+ st->discs[0]->gc = XCreateGC (st->dpy, st->b, GCForeground|GCLineWidth|GCJoinStyle,
+ &gcv);
+ init_spin (st->discs[0]);
+
+ gcv.foreground = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "arrow2Foreground", "Foreground");
+ gcv.line_width = MAX(4, (st->size / 30));
+ st->discs[1]->draw = draw_thick_arrow;
+ st->discs[1]->gc = XCreateGC (st->dpy, st->b, GCForeground|GCLineWidth, &gcv);
+ init_spin (st->discs[1]);
+
+ gcv.foreground = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "arrow1Foreground", "Foreground");
+ gcv.line_width = MAX(4, (st->size / 30));
+ st->discs[2]->draw = draw_thin_arrow;
+ st->discs[2]->gc = XCreateGC (st->dpy, st->b, GCForeground|GCLineWidth, &gcv);
+ init_spin (st->discs[2]);
+
+ gcv.foreground = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "pointerForeground", "Foreground");
+ st->ptr_gc = XCreateGC (st->dpy, st->b, GCForeground|GCLineWidth, &gcv);
+
+ gcv.foreground = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "background", "Background");
+ st->erase_gc = XCreateGC (st->dpy, st->b, GCForeground, &gcv);
+
+ if (st->ba) XFillRectangle (st->dpy, st->ba, st->erase_gc, 0, 0, st->size2, st->size2);
+ if (st->bb) XFillRectangle (st->dpy, st->bb, st->erase_gc, 0, 0, st->size2, st->size2);
+
+ return st;
+}
+
+static unsigned long
+compass_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ XFillRectangle (st->dpy, st->b, st->erase_gc, 0, 0, st->xgwa.width, st->xgwa.height);
+
+ draw_compass (st);
+ draw_pointer (st);
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (st->backb)
+ {
+ XdbeSwapInfo info[1];
+ info[0].swap_window = st->window;
+ info[0].swap_action = XdbeUndefined;
+ XdbeSwapBuffers (st->dpy, info, 1);
+ }
+ else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ if (st->dbuf)
+ {
+ XCopyArea (st->dpy, st->b, st->window, st->erase_gc, 0, 0,
+ st->size2, st->size2,
+ st->xgwa.width/2 - st->x,
+ st->xgwa.height/2 - st->y);
+ st->b = (st->b == st->ba ? st->bb : st->ba);
+ }
+
+ return st->delay;
+}
+
+static void
+compass_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ st->size2 = MIN(st->xgwa.width, st->xgwa.height);
+ st->x = st->xgwa.width/2;
+ st->y = st->xgwa.height/2;
+}
+
+static Bool
+compass_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+compass_free (Display *dpy, Window window, void *closure)
+{
+}
+
+
+
+static const char *compass_defaults [] = {
+ ".background: #000000",
+ ".foreground: #DDFFFF",
+ "*arrow1Foreground: #FFF66A",
+ "*arrow2Foreground: #F7D64A",
+ "*pointerForeground: #FF0000",
+ "*delay: 20000",
+ "*doubleBuffer: True",
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ "*useDBE: True",
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ 0
+};
+
+static XrmOptionDescRec compass_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-db", ".doubleBuffer", XrmoptionNoArg, "True" },
+ { "-no-db", ".doubleBuffer", XrmoptionNoArg, "False" },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("Compass", compass)
diff --git a/hacks/compass.man b/hacks/compass.man
new file mode 100644
index 0000000..8d7cc7e
--- /dev/null
+++ b/hacks/compass.man
@@ -0,0 +1,57 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+compass - draws a spinning compass.
+.SH SYNOPSIS
+.B compass
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-no-db]
+[\-fps]
+.SH DESCRIPTION
+This draws a compass, with all elements spinning about randomly, for that
+``lost and nauseous'' feeling.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-db | \-no-db
+Double Buffer. Boolean.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/compile_axp.com b/hacks/compile_axp.com
new file mode 100644
index 0000000..c50e0f9
--- /dev/null
+++ b/hacks/compile_axp.com
@@ -0,0 +1,156 @@
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ABSTRACTILE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANALOGTV.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANEMONE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANEMOTAXIS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) APOLLONIAN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) APPLE2.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) APPLE2-MAIN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ASM6502.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ATTRACTION.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BARCODE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BINARYRING.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLASTER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLITSPIN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOUBOULE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOXFIT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BRAID.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BSOD.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES-DEFAULT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUMPS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CCURVE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CELTIC.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CLOUDLIFE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) COMPASS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CORAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CRITICAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CRYSTAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CWAVES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CYNOSURE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DECAYSCREEN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DECO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DELAUNAY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DELUXE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DEMON.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DISCRETE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DISTORT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DRIFT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) EPICYCLE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ERUPTION.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) EULER2D.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FADEPLOT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FIBERLAMP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FILMLEADER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FIREWORKX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAME.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLOW.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLUIDBALLS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FONTGLIDE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FOREST.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FPS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FUZZYFLAKES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GALAXY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GLITCHPEG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GOOP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GRAV.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GREYNETIC.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HALFTONE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HALO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HELIX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HEXADROP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HOPALONG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HYPERBALL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HYPERCUBE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) IFS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) IMSMAP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) INTERAGGREGATE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) INTERFERENCE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) INTERMOMENTARY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) JUGGLE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) JULIA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) KALEIDESCOPE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) KUMPPA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LASER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LCDSCRUB.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LIGHTNING.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LISA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LISSIE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LMORPH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LOOP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) M6502.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MAZE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MEMSCROLLER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) METABALLS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOIRE2.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOIRE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOUNTAIN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MUNCH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) NERVEROT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) NOSEGUY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PACMAN_AI.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PACMAN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PACMAN_LEVEL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PEDAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENETRATE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENROSE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PETRI.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PHOSPHOR.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PIECEWISE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POLYOMINOES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PONG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POPSQUARES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PYRO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) QIX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RD-BOMB.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RECANIM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RIPPLES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROCKS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RORSCHACH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROTOR.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROTZOOMER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SCREENHACK.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SHADEBOBS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SIERPINSKI.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SLIDESCREEN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SLIP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPEEDMINE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPHERE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPIRAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPOTLIGHT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SQUIRAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) STARFISH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) STRANGE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SUBSTRATE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SWIRL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) T3D.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TESSELLIMAGE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TESTX11.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) THORNBIRD.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TRIANGLE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TRUCHET.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TWANG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) VERMICULATE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) VFEEDBACK.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) VINES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WANDER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WEBCOLLAGE-COCOA.M
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WEBCOLLAGE-HELPER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WEBCOLLAGE-HELPER-COCOA.M
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WHIRLWINDWARP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WHIRLYGIG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WORM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WORMHOLE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XANALOGTV.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XFLAME.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XIMAGE-LOADER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XJACK.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XLOCKMORE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XLYAP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XMATRIX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XRAYSWARM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XSCREENSAVER-SGIGL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XSPIROGRAPH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XSUBLIM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ZOOM.C
diff --git a/hacks/compile_decc.com b/hacks/compile_decc.com
new file mode 100644
index 0000000..c50e0f9
--- /dev/null
+++ b/hacks/compile_decc.com
@@ -0,0 +1,156 @@
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ABSTRACTILE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANALOGTV.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANEMONE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANEMOTAXIS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) APOLLONIAN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) APPLE2.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) APPLE2-MAIN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ASM6502.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ATTRACTION.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BARCODE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BINARYRING.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLASTER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLITSPIN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOUBOULE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOXFIT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BRAID.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BSOD.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES-DEFAULT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUMPS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CCURVE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CELTIC.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CLOUDLIFE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) COMPASS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CORAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CRITICAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CRYSTAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CWAVES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CYNOSURE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DECAYSCREEN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DECO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DELAUNAY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DELUXE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DEMON.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DISCRETE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DISTORT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DRIFT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) EPICYCLE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ERUPTION.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) EULER2D.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FADEPLOT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FIBERLAMP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FILMLEADER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FIREWORKX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAME.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLOW.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLUIDBALLS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FONTGLIDE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FOREST.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FPS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FUZZYFLAKES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GALAXY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GLITCHPEG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GOOP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GRAV.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GREYNETIC.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HALFTONE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HALO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HELIX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HEXADROP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HOPALONG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HYPERBALL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HYPERCUBE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) IFS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) IMSMAP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) INTERAGGREGATE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) INTERFERENCE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) INTERMOMENTARY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) JUGGLE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) JULIA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) KALEIDESCOPE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) KUMPPA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LASER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LCDSCRUB.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LIGHTNING.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LISA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LISSIE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LMORPH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LOOP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) M6502.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MAZE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MEMSCROLLER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) METABALLS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOIRE2.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOIRE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOUNTAIN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MUNCH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) NERVEROT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) NOSEGUY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PACMAN_AI.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PACMAN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PACMAN_LEVEL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PEDAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENETRATE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENROSE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PETRI.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PHOSPHOR.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PIECEWISE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POLYOMINOES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PONG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POPSQUARES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PYRO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) QIX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RD-BOMB.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RECANIM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RIPPLES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROCKS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RORSCHACH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROTOR.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROTZOOMER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SCREENHACK.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SHADEBOBS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SIERPINSKI.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SLIDESCREEN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SLIP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPEEDMINE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPHERE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPIRAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPOTLIGHT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SQUIRAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) STARFISH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) STRANGE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SUBSTRATE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SWIRL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) T3D.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TESSELLIMAGE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TESTX11.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) THORNBIRD.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TRIANGLE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TRUCHET.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TWANG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) VERMICULATE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) VFEEDBACK.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) VINES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WANDER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WEBCOLLAGE-COCOA.M
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WEBCOLLAGE-HELPER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WEBCOLLAGE-HELPER-COCOA.M
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WHIRLWINDWARP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WHIRLYGIG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WORM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WORMHOLE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XANALOGTV.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XFLAME.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XIMAGE-LOADER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XJACK.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XLOCKMORE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XLYAP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XMATRIX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XRAYSWARM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XSCREENSAVER-SGIGL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XSPIROGRAPH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XSUBLIM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ZOOM.C
diff --git a/hacks/config/README b/hacks/config/README
new file mode 100644
index 0000000..9771a89
--- /dev/null
+++ b/hacks/config/README
@@ -0,0 +1,262 @@
+
+ XScreenSaver
+
+ a screen saver and locker for the X window system
+ by Jamie Zawinski
+
+ version 5.40
+ 12-Aug-2018
+
+ https://www.jwz.org/xscreensaver/
+
+-----------------------------------------------------------------------
+
+This directory contains XML files that describe each of the screenhacks;
+the per-hack user interface is constructed based on the things in these
+files. The files are loaded at run-time by xscreensaver-demo (also
+known as "the Control Center screensaver properties capplet".)
+
+The tags and parameters used here are:
+
+-----------------------------------------------------------------------
+
+ <screensaver name="PROGRAM-NAME" _label="PRETTY NAME">
+ ...
+ </screensaver>
+
+ This encloses the whole file: all of the tags described below
+ are inside this one.
+
+-----------------------------------------------------------------------
+
+ <command arg="-SWITCH"/>
+
+ specifies that "-SWITCH" always appears on the command line.
+ You'll most often see this with "-root".
+
+-----------------------------------------------------------------------
+
+ <boolean id="SYMBOLIC NAME"
+ _label="USER VISIBLE STRING"
+ arg-set="-SWITCH-A"
+ arg-unset="-SWITCH-B"
+ />
+
+ This creates a checkbox.
+
+ "id" is currently unused, but may eventually be used for
+ letting other widgets refer to this one.
+
+ "_label" is the string printed next to the checkbox.
+
+ "arg-set" is what to insert into the command line if the
+ box is checked.
+
+ "arg-unset" is what to insert into the command line if the
+ box is unchecked.
+
+ You will probably never specify both "arg-set" and "arg-unset",
+ because the setting that is the default should insert nothing
+ into the command line (that's what makes it the default.)
+ For example:
+
+ <boolean _label="foo" arg-set="-foo" />
+
+ or if "foo" is the default, and must be explicity turned off,
+
+ <boolean _label="foo" arg-unset="-no-foo" />
+
+-----------------------------------------------------------------------
+
+ <number id="SYMBOLIC NAME"
+ type="slider"
+ arg="-SWITCH %"
+ _label="HEADING LABEL"
+ _low-label="LEFT LABEL"
+ _high-label="RIGHT LABEL"
+ low="MIN VALUE"
+ high="MAX VALUE"
+ default="DEFAULT VALUE"
+ [ convert="invert" ]
+ />
+
+ This creates a slider.
+
+ The _label is printed above the slider. The _low-label and
+ _high-label are printed to the left and right, respectively.
+
+ If any of the numbers you type has a decimal point, then
+ the range is assumed to be a floating-point value; otherwise,
+ only integral values will be used. So be careful about "1"
+ versus "1.0".
+
+ If convert="invert" is specified, then the value that the
+ user tweaks goes the other way from the value the command
+ line expects: e.g., if the slider goes from 10-20 and the
+ user picks 13, the converted value goes from 20-10 (and
+ would be 17.) This is useful for converting between the
+ concepts of "delay" and "speed".
+
+ In the "arg" string, the first occurence of "%" is replaced
+ with the numeric value, when creating the command line.
+
+-----------------------------------------------------------------------
+
+ <number id="SYMBOLIC NAME"
+ type="spinbutton"
+ arg="-SWITCH %"
+ _label="HEADING LABEL"
+ low="MIN VALUE"
+ high="MAX VALUE"
+ default="DEFAULT VALUE"
+ [ convert="invert" ]
+ />
+
+ This creates a spinbox (a text field with a number in it,
+ and up/down arrows next to it.)
+
+ Arguments are exactly like type="slider", except that
+ _low-label and _high-label are not used. Also, _label
+ appears to the left of the box, instead of above it.
+
+-----------------------------------------------------------------------
+
+ <select id="SYMBOLIC NAME">
+ <option id="SYMBOLIC NAME"
+ _label="USER VISIBLE STRING"
+ arg-set="-SWITCH"
+ />
+ [ ... more <options> ... ]
+ </select>
+
+ This creates a selection popup menu.
+
+ Options should have arg-set (arg-unset is not used here.)
+
+ One of the menu items (the default) should have no arg-set.
+
+ Each arg-set should begin with the same switch: that is,
+ all the args in a given menu should look like:
+
+ -mode one
+ -mode two
+ -mode three
+
+ and not
+
+ -this
+ -that
+ -the other
+
+-----------------------------------------------------------------------
+
+ <string id="SYMBOLIC NAME"
+ _label="USER VISIBLE STRING"
+ arg="-SWITCH %"
+ />
+
+ This creates a text entry field.
+
+-----------------------------------------------------------------------
+
+ <file id="SYMBOLIC NAME"
+ _label="USER VISIBLE STRING"
+ arg="-SWITCH %"
+ />
+
+ This creates a file entry field (a text field with a "Browse"
+ button next to it.)
+
+-----------------------------------------------------------------------
+
+ <xscreensaver-text />
+
+ This indicates that this screen saver displays text via the
+ "xscreensaver-text" program.
+
+ In the X11 version, this tag does nothing: the text-related
+ preferences are in the main Screen Saver Preferences window,
+ not in the per-display-mode preferences.
+
+ In the MacOS version, the text-related preferences appear
+ in this pane, and this tag emits those several controls.
+
+-----------------------------------------------------------------------
+
+ <xscreensaver-image />
+
+ This indicates that this screen saver displays images via the
+ "xscreensaver-getimage" program.
+
+ In the X11 version, this tag does nothing: the image-loading
+ and screen-grabbing-related preferences are in the main
+ Screen Saver Preferences window, not in the per-display-mode
+ preferences.
+
+ In the MacOS version, the image-related preferences appear
+ in this pane, and this tag emits those several controls.
+
+-----------------------------------------------------------------------
+
+ <xscreensaver-updater />
+
+ Where to position the "Check for Updates" options.
+ This is used on MacOS and ignored on X11.
+
+-----------------------------------------------------------------------
+
+ <video href="URL" />
+
+ A link to a Youtube preview of this screen saver.
+
+-----------------------------------------------------------------------
+
+ <hgroup>
+ [ ... <boolean>s ... ]
+ [ ... <number>s ... ]
+ [ ... <select>s ... ]
+ [ ... <string>s ... ]
+ [ ... <file>s ... ]
+ [ ... <vgroup>s ... ]
+ </hgroup>
+
+ A horizontal group of widgets/groups. No more than 4 widgets
+ or groups should be used in a row.
+
+-----------------------------------------------------------------------
+
+ <vgroup>
+ [ ... <boolean>s ... ]
+ [ ... <number>s ... ]
+ [ ... <select>s ... ]
+ [ ... <string>s ... ]
+ [ ... <file>s ... ]
+ [ ... <hgroup>s ... ]
+ </vgroup>
+
+ A vertical group of widgets/groups. No more than 10 widgets
+ or groups should be used in a column.
+
+ Since the default alignment of widgets is a column, the
+ <vgroup> element is only of use inside an <hgroup> element.
+
+-----------------------------------------------------------------------
+
+ <_description>
+ FREE TEXT
+ </_description>
+
+ This is the description of the hack that appears in the right
+ part of the window. Lines are wrapped; paragraphs are separated
+ by blank lines. Lines that begin with whitespace will not be
+ wrapped (see "munch.xml" for an example of why.)
+
+ Make sure you use "&lt;" instead of "<", etc. Character
+ entities are allowed; HTML (and other markup) is not.
+
+-----------------------------------------------------------------------
+
+If you are DTD-minded, you may also find the included files "xss.dtd"
+and "xss.xsd" useful.
+
+-----------------------------------------------------------------------
diff --git a/hacks/config/abstractile.xml b/hacks/config/abstractile.xml
new file mode 100644
index 0000000..c706330
--- /dev/null
+++ b/hacks/config/abstractile.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="abstractile" _label="Abstractile">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=NgSetBY6VP4"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0" high="5" default="3"/>
+
+ <number id="sleep" type="slider" arg="-sleep %"
+ _label="Linger" _low-label="0 seconds" _high-label="60 seconds"
+ low="0" high="60" default="3"/>
+
+ <select id="tile">
+ <option id="random" _label="Random tile layout"/>
+ <option id="random" _label="Flat tiles" arg-set="-tile flat"/>
+ <option id="random" _label="Thin tiles" arg-set="-tile thin"/>
+ <option id="random" _label="Outline tiles" arg-set="-tile outline"/>
+ <option id="random" _label="Block tiles" arg-set="-tile block"/>
+ <option id="random" _label="Neon tiles" arg-set="-tile neon"/>
+ <option id="random" _label="Tiled tiles" arg-set="-tile tiled"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Mosaic patterns of interlocking tiles.
+
+Written by Steve Sundstrom; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/anemone.xml b/hacks/config/anemone.xml
new file mode 100644
index 0000000..90dff7a
--- /dev/null
+++ b/hacks/config/anemone.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="anemone" _label="Anemone">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=usITxM2YJZs"/>
+
+<!--
+ -withdraw 1200
+ -turnspeed 50
+-->
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0" high="80000" default="40000"
+ convert="invert"/>
+
+ <number id="arms" type="slider" arg="-arms %"
+ _label="Arms" _low-label="Few" _high-label="Many"
+ low="2" high="500" default="128"/>
+
+ <number id="finpoints" type="slider" arg="-finpoints %"
+ _label="Tentacles" _low-label="Few" _high-label="Many"
+ low="3" high="200" default="64"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="width" type="slider" arg="-width %"
+ _label="Thickness" _low-label="Thin" _high-label="Thick"
+ low="1" high="10" default="2"/>
+
+ <number id="withdraw" type="slider" arg="-withdraw %"
+ _label="Withdraw freqency" _low-label="Often" _high-label="Rarely"
+ low="12" high="10000" default="1200"/>
+
+ <number id="turnspeed" type="slider" arg="-turnspeed %"
+ _label="Turn speed" _low-label="Slow" _high-label="Fast"
+ low="0" high="1000" default="50"/>
+
+ <!--
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="2" high="255" default="64"/>
+ -->
+
+ </vgroup>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Wiggling tentacles.
+
+Written by Gabriel Finch; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/anemotaxis.xml b/hacks/config/anemotaxis.xml
new file mode 100644
index 0000000..6c3785f
--- /dev/null
+++ b/hacks/config/anemotaxis.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="anemotaxis" _label="Anemotaxis">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=hIqmIQbQkW8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="distance" type="slider" arg="-distance %"
+ _label="Distance" _low-label="Near" _high-label="Far"
+ low="10" high="250" default="40"/>
+
+ <number id="sources" type="slider" arg="-sources %"
+ _label="Sources" _low-label="Few" _high-label="Many"
+ low="1" high="100" default="25"/>
+
+ <number id="searchers" type="slider" arg="-searchers %"
+ _label="Searchers" _low-label="Few" _high-label="Many"
+ low="1" high="100" default="25"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Searches for a source of odor in a turbulent atmosphere. The searcher
+is able to sense the odor and determine local instantaneous wind
+direction. The goal is to find the source in the shortest mean time.
+
+https://en.wikipedia.org/wiki/Anemotaxis
+
+Written by Eugene Balkovsky; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/ant.xml b/hacks/config/ant.xml
new file mode 100644
index 0000000..8bb7423
--- /dev/null
+++ b/hacks/config/ant.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="ant" _label="Ant">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=PaG7RCO4ezs"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Timeout" _low-label="Small" _high-label="Large"
+ low="0" high="800000" default="40000"/>
+
+ <hgroup>
+ <boolean id="sharpturn" _label="Sharp turns" arg-set="-sharpturn"/>
+ <boolean id="truchet" _label="Truchet lines" arg-set="-truchet"/>
+ <boolean id="eyes" _label="Draw eyes" arg-set="-eyes"/>
+ </hgroup>
+ </vgroup>
+
+ <vgroup>
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Three" _high-label="Many"
+ low="3" high="255" default="64"/>
+
+
+ <hgroup>
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Ants count" low="-20" high="20" default="-3"/>
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Ant size" low="-18" high="18" default="-12"/>
+ </hgroup>
+
+ <select id="neighbors">
+ <option id="rand" _label="Random cell shape"/>
+ <option id="three" _label="Three sided cells"
+ arg-set="-neighbors 3"/>
+ <option id="four" _label="Four sided cells"
+ arg-set="-neighbors 4"/>
+ <option id="six" _label="Six sided cells"
+ arg-set="-neighbors 6"/>
+ <option id="nine" _label="Nine sided cells"
+ arg-set="-neighbors 9"/>
+ <option id="twelve" _label="Twelve sided cells"
+ arg-set="-neighbors 12"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 4.22.
+
+A cellular automaton that is really a two-dimensional Turing machine:
+as the heads ("ants") walk along the screen, they change pixel
+values in their path. Then, as they pass over changed pixels, their
+behavior is influenced.
+
+https://en.wikipedia.org/wiki/Langton%27s_ant
+https://en.wikipedia.org/wiki/Turing_machine
+
+Written by David Bagley; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/antinspect.xml b/hacks/config/antinspect.xml
new file mode 100644
index 0000000..ee4ce7b
--- /dev/null
+++ b/hacks/config/antinspect.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="antinspect" _label="AntInspect" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Ecw9dDc0db0"/>
+
+ <number id="speed" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <boolean id="shadows" _label="Draw shadows" arg-set="-shadows"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Ants move spheres around a circle.
+
+Written by Blair Tennessy; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/antmaze.xml b/hacks/config/antmaze.xml
new file mode 100644
index 0000000..1580205
--- /dev/null
+++ b/hacks/config/antmaze.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="antmaze" _label="AntMaze" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Bwa5-n6UUj8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Ants walk around a simple maze.
+
+Written by Blair Tennessy; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/antspotlight.xml b/hacks/config/antspotlight.xml
new file mode 100644
index 0000000..fe78174
--- /dev/null
+++ b/hacks/config/antspotlight.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="antspotlight" _label="AntSpotlight" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=NYisFYtODTA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <xscreensaver-image />
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+An ant walks over an image.
+
+Written by Blair Tennessy; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/apollonian.xml b/hacks/config/apollonian.xml
new file mode 100644
index 0000000..72d0e41
--- /dev/null
+++ b/hacks/config/apollonian.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="apollonian" _label="Apollonian">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=aeWnjSROR8U"/>
+
+ <boolean id="label" _label="Draw labels" arg-unset="-no-label"/>
+
+ <boolean id="altgeom" _label="Include alternate geometries"
+ arg-unset="-no-altgeom"/>
+
+<!-- don't know what -count does -->
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Depth" _low-label="Shallow" _high-label="Deep"
+ low="1" high="20" default="20"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="2" high="255" default="64"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0" high="1000000" default="1000000"
+ convert="invert"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A fractal packing of circles with smaller circles, demonstrating
+Descartes's theorem.
+
+https://en.wikipedia.org/wiki/Apollonian_gasket
+https://en.wikipedia.org/wiki/Descartes%27_theorem
+
+Written by Allan R. Wilks and David Bagley; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/apple2.xml b/hacks/config/apple2.xml
new file mode 100644
index 0000000..4084bc9
--- /dev/null
+++ b/hacks/config/apple2.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="apple2" _label="Apple2">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=p3QZqhp67l8"/>
+
+ <hgroup>
+ <vgroup>
+ <select id="mode">
+ <option id="random" _label="Choose display mode randomly"/>
+ <option id="text" _label="Display scrolling text" arg-set="-mode text"/>
+ <option id="slideshow" _label="Display images" arg-set="-mode slideshow"/>
+ <option id="basic" _label="Run basic programs" arg-set="-mode basic"/>
+ </select>
+
+ <xscreensaver-text />
+ </vgroup>
+ <vgroup>
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="60"/>
+
+ <xscreensaver-image />
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ <xscreensaver-updater />
+ </vgroup>
+
+ <vgroup>
+ <number id="tvcolor" type="slider" arg="-tv-color %"
+ _label="Color Knob" _low-label="Low" _high-label="High"
+ low="0" high="400" default="70"/>
+ <number id="tvtint" type="slider" arg="-tv-tint %"
+ _label="Tint Knob" _low-label="Low" _high-label="High"
+ low="0" high="360" default="5"/>
+ <number id="tvbrightness" type="slider" arg="-tv-brightness %"
+ _label="Brightness Knob" _low-label="Low" _high-label="High"
+ low="-75.0" high="100.0" default="3.0"/>
+ <number id="tvcontrast" type="slider" arg="-tv-contrast %"
+ _label="Contrast Knob" _low-label="Low" _high-label="High"
+ low="0" high="500" default="150"/>
+ </vgroup>
+ </hgroup>
+
+ <_description>
+An Apple ][+ computer simulation, in all its 1979 glory. It also
+reproduces the appearance of display on a color television set of the
+period.
+
+In "Basic Programming Mode", a simulated user types in a BASIC program
+and runs it. In "Text Mode", it displays the output of a program, or
+the contents of a file or URL. In "Slideshow Mode", it chooses random
+images and displays them within the limitations of the Apple ][
+display hardware. (Six available colors in hi-res mode!)
+
+On MacOS and Linux, this program is also a fully-functional VT100
+emulator! Run it as an application instead of as a screen saver and
+you can use it as a terminal.
+
+https://en.wikipedia.org/wiki/Apple_II_series
+
+Written by Trevor Blackwell and Jamie Zawinski; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/atlantis.xml b/hacks/config/atlantis.xml
new file mode 100644
index 0000000..2e06b85
--- /dev/null
+++ b/hacks/config/atlantis.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="atlantis" _label="Atlantis" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=U78xPez5UGg"/>
+
+ <number id="sharkspeed" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="25000"
+ convert="invert"/>
+
+ <number id="whalespeed" type="slider" arg="-whalespeed %"
+ _label="Whale speed" _low-label="Slow" _high-label="Fast"
+ low="0" high="1000" default="250"/>
+
+ <number id="sharkproximity" type="slider" arg="-size %"
+ _label="Shark proximity" _low-label="Shy" _high-label="Agressive"
+ low="100" high="10000" default="6000"/>
+
+ <number id="sharkcount" type="slider" arg="-count %"
+ _label="Number of sharks" _low-label="None" _high-label="20"
+ low="0" high="20" default="4"/>
+
+ <hgroup>
+ <select id="water">
+ <option id="shimmer" _label="Shimmering water"/>
+ <option id="clear" _label="Clear water" arg-set="-no-texture"/>
+ </select>
+
+ <select id="bg">
+ <option id="flat" _label="Flat background" arg-set="-no-gradient"/>
+ <option id="gradient" _label="Gradient background"/>
+ </select>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Sharks, dolphins and whales.
+
+Written by Mark Kilgard; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/attraction.xml b/hacks/config/attraction.xml
new file mode 100644
index 0000000..b0ca4ae
--- /dev/null
+++ b/hacks/config/attraction.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="attraction" _label="Attraction">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=KAT9nkXCdms"/>
+
+ <hgroup>
+ <select id="mode">
+ <option id="balls" _label="Balls"/>
+ <option id="lines" _label="Lines" arg-set="-mode lines"/>
+ <option id="tails" _label="Tails" arg-set="-mode tails"/>
+ <option id="polygons" _label="Polygons" arg-set="-mode polygons"/>
+ <option id="splines" _label="Splines" arg-set="-mode splines"/>
+ <option id="fsplines" _label="Filled splines"
+ arg-set="-mode filled-splines"/>
+ </select>
+
+ <select id="wallmode">
+ <option id="walls" _label="Bounce off walls"/>
+ <option id="nowalls" _label="Ignore screen edges" arg-set="-nowalls"/>
+ </select>
+
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <number id="points" type="spinbutton" arg="-points %"
+ _label="Ball count" low="0" high="200" default="0"/>
+ <number id="viscosity" type="slider" arg="-viscosity %"
+ _label="Environmental viscosity"
+ _low-label="Low" _high-label="High"
+ low="0.0" high="1.0" default="1.0"
+ convert="invert"/>
+ <number id="segments" type="slider" arg="-segments %"
+ _label="Trail length" _low-label="Short" _high-label="Long"
+ low="2" high="1000" default="500"/>
+ <number id="ncolors" type="slider" arg="-colors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="200"/>
+ </vgroup>
+ <vgroup>
+ <number id="size" type="slider" arg="-size %"
+ _low-label="Ball mass" _high-label="High"
+ low="0" high="100" default="0"/>
+ <number id="threshold" type="slider" arg="-threshold %"
+ _label="Repulsion threshold"
+ _low-label="Small" _high-label="Large"
+ low="0" high="600" default="200"/>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0" high="40000" default="10000"
+ convert="invert"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="orbit" _label="Orbital mode" arg-set="-orbit"/>
+ <number id="radius" type="spinbutton" arg="-radius %"
+ _label="Radius" low="0" high="1000" default="0"/>
+ <number id="vmult" type="slider" arg="-vmult %"
+ _low-label="Outward" _high-label="Inward"
+ low="-5.0" high="5.0" default="0.9"/>
+ </hgroup>
+
+ <!-- #### -vx [?] -->
+ <!-- #### -vy [?] -->
+ <!-- #### -glow -->
+ <!-- #### -nomaxspeed -->
+ <!-- #### -correct-bounce -->
+ <!-- #### -graphmode [none] -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+
+Points attract each other up to a certain distance, and then begin to
+repel each other. The attraction/repulsion is proportional to the
+distance between any two particles, similar to the strong and weak
+nuclear forces.
+
+Written by Jamie Zawinski and John Pezaris; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/atunnel.xml b/hacks/config/atunnel.xml
new file mode 100644
index 0000000..eea3b96
--- /dev/null
+++ b/hacks/config/atunnel.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="atunnel" _label="Atunnel" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=mpCRbi3jkuc"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <boolean id="tex" _label="Textured" arg-unset="-no-texture"/>
+ <boolean id="light" _label="Lighting" arg-set="-light"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Zooming through a textured tunnel.
+
+Written by Eric Lassauge and Roman Podobedov; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/barcode.xml b/hacks/config/barcode.xml
new file mode 100644
index 0000000..76fca28
--- /dev/null
+++ b/hacks/config/barcode.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="barcode" _label="Barcode">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=gmtAySJdsfg"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <select id="mode">
+ <option id="scroll" _label="Scrolling barcodes"/>
+ <option id="scroll" _label="Barcode grid" arg-set="-mode grid"/>
+ <option id="clock12" _label="Barcode clock (AM/PM)" arg-set="-mode clock12"/>
+ <option id="clock24" _label="Barcode clock (24 hour)" arg-set="-mode clock24"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Colorful scrolling barcodes. CONSUME!
+
+The barcodes follow the UPC-A, UPC-E, EAN-8 or EAN-13 standards.
+
+https://en.wikipedia.org/wiki/Universal_Product_Code
+https://en.wikipedia.org/wiki/European_Article_Number
+
+Written by Dan Bornstein and Jamie Zawinski; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/binaryring.xml b/hacks/config/binaryring.xml
new file mode 100644
index 0000000..a96026c
--- /dev/null
+++ b/hacks/config/binaryring.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="binaryring" _label="BinaryRing">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=KPiJb0Qm1SE"/>
+
+ <number id="growth-delay" type="slider" arg="-growth-delay %"
+ _label="Growth delay" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000" />
+
+ <number id="ring-radius" type="slider" arg="-ring-radius %"
+ _label="Ring Radius" _low-label="Short" _high-label="Long"
+ low="0" high="400" default="40" />
+
+ <number id="particles-number" type="slider" arg="-particles-number %"
+ _label="Number of particles" _low-label="Few" _high-label="Lots"
+ low="500" high="20000" default="5000" />
+
+ <boolean id="color" _label="Fade with colors" arg-unset="-no-color"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A system of path tracing particles evolves continuously from an
+initial creation, alternating dark and light colors.
+
+Written by J. Tarbell and Emilio Del Tessandoro; 2014.
+ </_description>
+</screensaver>
diff --git a/hacks/config/blaster.xml b/hacks/config/blaster.xml
new file mode 100644
index 0000000..d7cb42d
--- /dev/null
+++ b/hacks/config/blaster.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="blaster" _label="Blaster">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=bp3J3si2Hr0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="num_robots" type="spinbutton" arg="-num_robots %"
+ _label="Robots" low="2" high="50" default="5"/>
+
+ <number id="num_lasers" type="spinbutton" arg="-num_lasers %"
+ _label="Lasers" low="1" high="100" default="3"/>
+
+ <number id="num_stars" type="slider" arg="-num_stars %"
+ _label="Stars" _low-label="Few" _high-label="Many"
+ low="5" high="200" default="50"/>
+
+ <!-- #### -move_stars_x [2] -->
+ <!-- #### -move_stars_y [1] -->
+ <!-- #### -move_stars_random [0] -->
+ <!-- #### -star_color [white] -->
+
+ <!-- #### -explode_size_1 [27] -->
+ <!-- #### -explode_size_2 [19] -->
+ <!-- #### -explode_size_3 [7] -->
+ <!-- #### -explode_color_1 [yellow] -->
+ <!-- #### -explode_color_2 [orange] -->
+
+ <!-- #### -r_color0 [magenta] -->
+ <!-- #### -r_color1 [orange] -->
+ <!-- #### -r_color2 [yellow] -->
+ <!-- #### -r_color3 [white] -->
+ <!-- #### -r_color4 [blue] -->
+ <!-- #### -r_color5 [cyan] -->
+ <!-- #### -l_color0 [green] -->
+ <!-- #### -l_color1 [red] -->
+
+ <!-- #### -mother_ship -->
+ <!-- #### -mother_ship_width [25] -->
+ <!-- #### -mother_ship_height [7] -->
+ <!-- #### -mother_ship_laser [15] -->
+ <!-- #### -mother_ship_period [150] -->
+ <!-- #### -mother_ship_hits [10] -->
+ <!-- #### -mother_ship_color0 [darkblue] -->
+ <!-- #### -mother_ship_color1 [white] -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Flying space-combat robots (cleverly disguised as colored circles)
+do battle in front of a moving star field.
+
+Written by Jonathan Lin; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/blinkbox.xml b/hacks/config/blinkbox.xml
new file mode 100644
index 0000000..d457df2
--- /dev/null
+++ b/hacks/config/blinkbox.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="blinkbox" _label="BlinkBox" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=lgjbHMcSd8U"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="boxsize" type="slider" arg="-boxsize %"
+ _label="Box size" _low-label="Small" _high-label="Large"
+ low="1" high="8" default="2"/>
+
+ <hgroup>
+ <boolean id="fade" _label="Fade" arg-unset="-no-fade"/>
+ <boolean id="blur" _label="Motion blur" arg-unset="-no-blur"/>
+ <boolean id="dissolve" _label="Dissolve" arg-set="-dissolve"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A motion-blurred ball bounces inside a box whose tiles only become
+visible upon impact.
+
+Written by Jeremy English; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/blitspin.xml b/hacks/config/blitspin.xml
new file mode 100644
index 0000000..df53aa7
--- /dev/null
+++ b/hacks/config/blitspin.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="blitspin" _label="BlitSpin">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=UTtcwb-UWW8"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Fuzzy rotation speed" _low-label="Slow" _high-label="Fast"
+ low="1" high="800000" default="500000"
+ convert="invert"/>
+
+ <number id="delay2" type="slider" arg="-delay2 %"
+ _label="90 degree rotation speed" _low-label="Slow" _high-label="Fast"
+ low="1" high="800000" default="500000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="120"/>
+ </vgroup>
+
+ <vgroup>
+ <!-- <file id="bitmap" _label="Bitmap to rotate" arg="-bitmap %"/> -->
+ <xscreensaver-image />
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+
+Repeatedly rotates a bitmap by 90 degrees by using logical operations:
+the bitmap is divided into quadrants, and the quadrants are shifted
+clockwise. Then the same thing is done again with progressively
+smaller quadrants, except that all sub-quadrants of a given size are
+rotated in parallel. As you watch it, the image appears to dissolve
+into static and then reconstitute itself, but rotated.
+
+Written by Jamie Zawinski; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/blocktube.xml b/hacks/config/blocktube.xml
new file mode 100644
index 0000000..85f88f9
--- /dev/null
+++ b/hacks/config/blocktube.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="blocktube" _label="BlockTube" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=L0JUBhpZlMw"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="40000"
+ convert="invert"/>
+
+ <number id="holdtime" type="slider" arg="-holdtime %"
+ _label="Color hold time" _low-label="Short" _high-label="Long"
+ low="10" high="2000" default="1000"/>
+
+ <number id="changetime" type="slider" arg="-changetime %"
+ _label="Color change time" _low-label="Short" _high-label="Long"
+ low="10" high="1000" default="200"/>
+
+ <boolean id="tex" _label="Textured" arg-unset="-no-texture"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A swirling, falling tunnel of reflective slabs. They fade from hue to hue.
+
+Written by Lars R. Damerow; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/boing.xml b/hacks/config/boing.xml
new file mode 100644
index 0000000..a36d1e2
--- /dev/null
+++ b/hacks/config/boing.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="boing" _label="Boing" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=J3KAsV31d6M"/>
+
+ <number id="size" type="slider" arg="-size %"
+ _label="Size" _low-label="Tiny" _high-label="Huge"
+ low="0.02" high="0.9" default="0.5"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="10.0" default="1.0"/>
+
+ <vgroup>
+ <hgroup>
+ <number id="meridians" type="spinbutton" arg="-meridians %"
+ _label="Meridians" low="1" high="90" default="16"/>
+ <number id="parallels" type="spinbutton" arg="-parallels %"
+ _label="Parallels" low="1" high="90" default="8"/>
+ </hgroup>
+ <hgroup>
+ <boolean id="smoothing" _label="Smoothing" arg-set="-smooth"/>
+ <boolean id="lighting" _label="Lighting" arg-set="-lighting"/>
+ <boolean id="scanlines" _label="Scanlines" arg-unset="-no-scanlines"/>
+ </hgroup>
+ <hgroup>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+ </vgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+
+A clone of the first graphics demo for the Amiga 1000, which was
+written by Dale Luck and RJ Mical during a break at the 1984 Consumer
+Electronics Show (or so the legend goes.)
+
+This looks like the original Amiga demo if you turn off "smoothing"
+and "lighting" and turn on "scanlines", and is somewhat more modern
+otherwise.
+
+https://en.wikipedia.org/wiki/Amiga#Boing_Ball
+
+Written by Jamie Zawinski; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/bouboule.xml b/hacks/config/bouboule.xml
new file mode 100644
index 0000000..b28912e
--- /dev/null
+++ b/hacks/config/bouboule.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="bouboule" _label="Bouboule">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=MdmIBmlkyFw"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of spots" _low-label="Few" _high-label="Many"
+ low="1" high="400" default="100"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <boolean id="3d" _label="Do Red/Blue 3D separation" arg-unset="-no-3d"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A deforming balloon with varying-sized spots painted on its invisible surface.
+
+Written by Jeremie Petit; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/bouncingcow.xml b/hacks/config/bouncingcow.xml
new file mode 100644
index 0000000..0e3dfe5
--- /dev/null
+++ b/hacks/config/bouncingcow.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="bouncingcow" _label="BouncingCow" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=O_b5UWhv49w"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Bounce speed" _low-label="Slow" _high-label="Fast"
+ low="0.05" high="2.0" default="1.0"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of cows" _low-label="Moo" _high-label="Herd"
+ low="1" high="9" default="1"/>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A Cow. A Trampoline. Together, they fight crime.
+
+Written by Jamie Zawinski; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/boxed.xml b/hacks/config/boxed.xml
new file mode 100644
index 0000000..b2926f0
--- /dev/null
+++ b/hacks/config/boxed.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="boxed" _label="Boxed" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=CU4QFtZm9So"/>
+
+ <hgroup>
+ <vgroup>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="15000"
+ convert="invert"/>
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.001" high="4.0" default="0.5"/>
+
+ <number id="balls" type="slider" arg="-balls %"
+ _label="Number of balls" _low-label="Few" _high-label="Lots"
+ low="3" high="40" default="20"/>
+
+ <number id="ballsize" type="slider" arg="-ballsize %"
+ _label="Ball size" _low-label="Tiny" _high-label="Huge"
+ low="1.0" high="5.0" default="3.0"/>
+
+ </vgroup>
+
+ <vgroup>
+
+ <number id="explosion" type="slider" arg="-explosion %"
+ _label="Explosion force" _low-label="Popcorn" _high-label="Nuke"
+ low="1.0" high="50.0" default="15.0"/>
+
+ <number id="decay" type="slider" arg="-decay %"
+ _label="Explosion decay" _low-label="Linger" _high-label="Pop!"
+ low="0.0" high="1.0" default="0.07"/>
+
+ <number id="momentum" type="slider" arg="-momentum %"
+ _label="Explosion momentum" _low-label="None" _high-label="Full"
+ low="0.0" high="1.0" default="0.6"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+
+ </vgroup>
+ </hgroup>
+
+
+ <xscreensaver-updater />
+
+ <_description>
+A box full of 3D bouncing balls that explode.
+
+Written by Sander van Grieken; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/boxfit.xml b/hacks/config/boxfit.xml
new file mode 100644
index 0000000..a297e13
--- /dev/null
+++ b/hacks/config/boxfit.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="boxfit" _label="BoxFit">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=8GkcbBbcwBk"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <hgroup>
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Boxes" low="1" high="1000" default="50"/>
+
+ <number id="growby" type="spinbutton" arg="-growby %"
+ _label="Grow by" low="1" high="10" default="1"/>
+ </hgroup>
+
+ <hgroup>
+ <number id="spacing" type="spinbutton" arg="-spacing %"
+ _label="Spacing" low="1" high="10" default="1"/>
+
+ <number id="border" type="spinbutton" arg="-border %"
+ _label="Border" low="1" high="10" default="1"/>
+ </hgroup>
+
+ <hgroup>
+ <select id="mode">
+ <option id="random" _label="Boxes or circles"/>
+ <option id="boxes" _label="Boxes only" arg-set="-mode squares"/>
+ <option id="circles" _label="Circles only" arg-set="-mode circles"/>
+ </select>
+
+ <select id="mode2">
+ <option id="gradient" _label="Color gradient"/>
+ <option id="image" _label="Grab images" arg-set="-grab"/>
+ </select>
+ </hgroup>
+ </vgroup>
+
+ <vgroup>
+ <xscreensaver-image />
+
+ <boolean id="peek" _label="Peek at underlying images" arg-set="-peek"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Packs the screen with growing squares or circles, colored according to
+a horizontal or vertical gradient, or according to the colors of a
+loaded image. The objects grow until they touch, then stop. When the
+screen is full, they shrink away and the process restarts.
+
+Written by Jamie Zawinski; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/braid.xml b/hacks/config/braid.xml
new file mode 100644
index 0000000..b49fa22
--- /dev/null
+++ b/hacks/config/braid.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="braid" _label="Braid">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=PUhJq56ViGM"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="1000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="0" high="500" default="100"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <hgroup>
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Number of rings" low="3" high="15" default="15"/>
+
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Line thickness" low="-20" high="20" default="-7"/>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Inter-braided concentric circles.
+
+Written by John Neil; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/bsod.xml b/hacks/config/bsod.xml
new file mode 100644
index 0000000..ef18e21
--- /dev/null
+++ b/hacks/config/bsod.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="bsod" _label="BSOD">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=YIqbMCfR3r0"/>
+
+ <hgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Duration" _low-label="5 seconds" _high-label="2 minutes"
+ low="5" high="120" default="45"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <boolean id="windows" _label="Windows 3.1" arg-unset="-no-windows"/>
+ <boolean id="nt" _label="Windows NT" arg-unset="-no-nt"/>
+ <boolean id="2k" _label="Windows 2000 " arg-unset="-no-2k"/>
+ <boolean id="win10" _label="Windows 10 " arg-unset="-no-win10"/>
+ <boolean id="msdos" _label="MS-DOS" arg-unset="-no-msdos"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="amiga" _label="AmigaDOS" arg-unset="-no-amiga"/>
+ <boolean id="glados" _label="GLaDOS" arg-unset="-no-glados"/>
+ <boolean id="android" _label="Android" arg-unset="-no-android"/>
+ <boolean id="apple2" _label="Apple ][" arg-unset="-no-apple2"/>
+ <boolean id="ransomware" _label="Ransomware" arg-unset="-no-ransomware"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="nvidia" _label="NVidia" arg-unset="-no-nvidia"/>
+ <boolean id="os2" _label="OS/2" arg-unset="-no-os2"/>
+ <boolean id="mac" _label="Sad Mac" arg-unset="-no-mac"/>
+ <boolean id="mac1" _label="Mac bomb" arg-unset="-no-mac1"/>
+ <boolean id="vmware" _label="VMware" arg-unset="-no-vmware"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="macsbug" _label="MacsBug" arg-unset="-no-macsbug"/>
+ <boolean id="atari" _label="Atari" arg-set="-atari"/>
+ <boolean id="macx" _label="MacOS X" arg-unset="-no-macx"/>
+ <boolean id="os390" _label="OS/390" arg-unset="-no-os390"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="vms" _label="VMS" arg-unset="-no-vms"/>
+ <boolean id="hvx" _label="HVX/GCOS6" arg-unset="-no-hvx"/>
+ <boolean id="blitdamage" _label="NCD X Terminal " arg-unset="-no-blitdamage"/>
+ <boolean id="atm" _label="ATM" arg-unset="-no-atm"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="bsd" _label="BSD" arg-set="-bsd"/>
+ <boolean id="linux" _label="Linux (fsck)" arg-unset="-no-linux"/>
+ <boolean id="sparclinux" _label="Linux (sparc)" arg-set="-sparclinux"/>
+ <boolean id="hppalinux" _label="Linux (hppa)" arg-unset="-no-hppalinux"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="solaris" _label="Solaris" arg-unset="-no-solaris"/>
+ <boolean id="sco" _label="SCO" arg-unset="-no-sco"/>
+ <boolean id="hpux" _label="HPUX" arg-unset="-no-hpux"/>
+ <boolean id="tru64" _label="Tru64" arg-unset="-no-tru64"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <xscreensaver-image />
+ </vgroup>
+ <xscreensaver-updater />
+ </hgroup>
+
+<!--
+ <hgroup>
+ <vgroup>
+ <number id="tvcolor" type="slider" arg="-tv-color %"
+ _label="Color Knob" _low-label="Low" _high-label="High"
+ low="0" high="400" default="70"/>
+ <number id="tvtint" type="slider" arg="-tv-tint %"
+ _label="Tint Knob" _low-label="Low" _high-label="High"
+ low="0" high="360" default="5"/>
+ </vgroup>
+ <vgroup>
+ <number id="tvbrightness" type="slider" arg="-tv-brightness %"
+ _label="Brightness Knob" _low-label="Low" _high-label="High"
+ low="-75.0" high="100.0" default="3.0"/>
+ <number id="tvcontrast" type="slider" arg="-tv-contrast %"
+ _label="Contrast Knob" _low-label="Low" _high-label="High"
+ low="0" high="500" default="150"/>
+ </vgroup>
+ </hgroup>
+-->
+
+ <_description>
+BSOD stands for "Blue Screen of Death". The finest in personal
+computer emulation, BSOD simulates popular screen savers from a
+number of less robust operating systems.
+
+https://en.wikipedia.org/wiki/Blue_Screen_of_Death
+https://en.wikipedia.org/wiki/Screen_of_death
+https://en.wikipedia.org/wiki/Guru_Meditation
+https://en.wikipedia.org/wiki/Row_of_Bombs
+https://en.wikipedia.org/wiki/Bomb_%28symbol%29
+
+Written by Jamie Zawinski; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/bubble3d.xml b/hacks/config/bubble3d.xml
new file mode 100644
index 0000000..985c394
--- /dev/null
+++ b/hacks/config/bubble3d.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="bubble3d" _label="Bubble3D" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=4vcj8sq9FO8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <boolean id="transp" _label="Transparent bubbles" arg-unset="-no-transparent"/>
+ <select id="bubblecolor">
+ <option id="random" _label="Random" />
+ <option id="Red" _label="Amber" arg-set="-color #FF0000" />
+ <option id="Green" _label="Green" arg-set="-color #00FF00" />
+ <option id="Blue" _label="Blue" arg-set="-color #0000FF" />
+ <option id="white" _label="White" arg-set="-color #FFFFFF" />
+ </select>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ <xscreensaver-updater />
+
+ <_description>
+Rising, undulating 3D bubbles, with transparency and specular reflections.
+
+Written by Richard Jones; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/bubbles.xml b/hacks/config/bubbles.xml
new file mode 100644
index 0000000..86cb132
--- /dev/null
+++ b/hacks/config/bubbles.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="bubbles" _label="Bubbles">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Mli1TjZY1YA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <boolean id="simple" _label="Draw circles instead of bubble images"
+ arg-set="-simple"/>
+
+ <boolean id="broken" _label="Don't hide bubbles when they pop"
+ arg-set="-broken"/>
+
+ <boolean id="trails" _label="Leave trails" arg-set="-trails"/>
+
+ <select id="gravity">
+ <option id="rise" _label="Bubbles rise" arg-set="-mode rise"/>
+ <option id="float" _label="Bubbles float"/>
+ <option id="drop" _label="Bubbles fall" arg-set="-mode drop"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+This simulates the kind of bubble formation that happens when water
+boils: small bubbles appear, and as they get closer to each other,
+they combine to form larger bubbles, which eventually pop.
+
+Written by James Macnicol; 1996.
+ </_description>
+</screensaver>
diff --git a/hacks/config/bumps.xml b/hacks/config/bumps.xml
new file mode 100644
index 0000000..78ee969
--- /dev/null
+++ b/hacks/config/bumps.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="bumps" _label="Bumps">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=IV7D-NYRCiU"/>
+
+ <!-- #### -degrees [360] -->
+ <!-- #### -color [random] -->
+ <!-- #### -colorcount [64] -->
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="120"/>
+
+ <!-- #### -soften [1] -->
+ <!-- #### -invert -->
+
+ <xscreensaver-image />
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A spotlight roams across an embossed version of a loaded image.
+
+Written by Shane Smit; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/cage.xml b/hacks/config/cage.xml
new file mode 100644
index 0000000..6ede618
--- /dev/null
+++ b/hacks/config/cage.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cage" _label="Cage" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=BxGHUFvI2Zo"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="25000"
+ convert="invert"/>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Escher's "Impossible Cage", a 3d analog of a moebius
+strip, and rotates it in three dimensions.
+
+https://en.wikipedia.org/wiki/Maurits_Cornelis_Escher
+
+Written by Marcelo Vianna; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/carousel.xml b/hacks/config/carousel.xml
new file mode 100644
index 0000000..6f9a79f
--- /dev/null
+++ b/hacks/config/carousel.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="carousel" _label="Carousel" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=IyqWkGVrFIY"/>
+
+ <hgroup>
+ <vgroup>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Animation speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="8.0" default="1.0"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Time until loading a new image"
+ _low-label="5 seconds" _high-label="1 minute"
+ low="5" high="60" default="20"/>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Number of images" low="1" high="20" default="7"/>
+
+ <select id="mode">
+ <option id="tiltxy" _label="Tilt in/out and left/right"/>
+ <option id="tiltx" _label="Tilt in/out only" arg-set="-tilt x"/>
+ <option id="tilty" _label="Tilt left/right only" arg-set="-tilt y"/>
+ <option id="notilt" _label="No tilting" arg-set="-tilt 0"/>
+ </select>
+
+ <boolean id="zoom" _label="Zoom in/out" arg-unset="-no-zoom"/>
+ <boolean id="titles" _label="Show file names" arg-unset="-no-titles"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-image />
+
+ <xscreensaver-updater />
+
+ <_description>
+Loads several random images, and displays them flying in a circular
+formation. The formation changes speed and direction randomly, and
+images periodically drop out to be replaced by new ones.
+
+Written by Jamie Zawinski; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/ccurve.xml b/hacks/config/ccurve.xml
new file mode 100644
index 0000000..e15138f
--- /dev/null
+++ b/hacks/config/ccurve.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="ccurve" _label="CCurve">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=zqIlWzUHOz8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Change image every" _low-label="0 seconds" _high-label="30 seconds"
+ low="0" high="30" default="3"/>
+
+ <number id="pause" type="slider" arg="-pause %"
+ _label="Animation speed" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="5.0" default="0.4" convert="invert"/>
+
+ <number id="limit" type="slider" arg="-limit %"
+ _label="Density" _low-label="Low" _high-label="High"
+ low="3" high="300000" default="200000"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Generates self-similar linear fractals, including the classic "C Curve".
+
+https://en.wikipedia.org/wiki/Levy_C_curve
+
+Written by Rick Campbell; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/celtic.xml b/hacks/config/celtic.xml
new file mode 100644
index 0000000..f84d12b
--- /dev/null
+++ b/hacks/config/celtic.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="celtic" _label="Celtic">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=PnX60AAoTdw"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="delay2" type="slider" arg="-delay2 %"
+ _label="Linger" _low-label="Short" _high-label="Long"
+ low="0" high="10" default="5"/>
+
+ <boolean id="graph" _label="Draw graph" arg-set="-graph"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Repeatedly draws random Celtic cross-stitch patterns.
+
+https://en.wikipedia.org/wiki/Celtic_knot
+https://en.wikipedia.org/wiki/Knots_and_graphs
+
+Written by Max Froumentin; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/circuit.xml b/hacks/config/circuit.xml
new file mode 100644
index 0000000..0605002
--- /dev/null
+++ b/hacks/config/circuit.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="circuit" _label="Circuit" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=tfqR1j1OQs8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-parts %"
+ _label="Parts" _low-label="One" _high-label="Lots"
+ low="1" high="30" default="10"/>
+
+ <number id="speed" type="slider" arg="-rotate-speed %"
+ _label="Rotation speed" _low-label="Slow" _high-label="Fast"
+ low="0" high="100" default="1"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+
+ <select id="render">
+ <option id="flat" _label="Flat coloring" arg-set="-no-light"/>
+ <option id="light" _label="Directional lighting"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Electronic components float around.
+
+Written by Ben Buxton; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/cityflow.xml b/hacks/config/cityflow.xml
new file mode 100644
index 0000000..61f67d9
--- /dev/null
+++ b/hacks/config/cityflow.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cityflow" _label="Cityflow" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=LJMtu-9T3U0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Boxes" _low-label="Few" _high-label="Many"
+ low="50" high="4000" default="800"/>
+
+ <number id="skew" type="slider" arg="-skew %"
+ _label="Skew"
+ _low-label="Low" _high-label="High"
+ low="0" high="45" default="12"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="wave-speed" type="slider" arg="-wave-speed %"
+ _label="Wave speed" _low-label="Slow" _high-label="Fast"
+ low="5" high="150" default="25"/>
+
+ <number id="wave-radius" type="slider" arg="-wave-radius %"
+ _label="Wave overlap"
+ _low-label="Small" _high-label="Large"
+ low="5" high="512" default="256"/>
+
+ <number id="waves" type="slider" arg="-waves %"
+ _label="Wave complexity"
+ _low-label="Low" _high-label="High"
+ low="1" high="20" default="6"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+ </hgroup>
+
+ <_description>
+Waves move across a sea of boxes. The city swells. The walls are closing in.
+
+Written by Jamie Zawinski; 2014.
+ </_description>
+</screensaver>
diff --git a/hacks/config/cloudlife.xml b/hacks/config/cloudlife.xml
new file mode 100644
index 0000000..767a8ea
--- /dev/null
+++ b/hacks/config/cloudlife.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cloudlife" _label="CloudLife">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=TkVDO3nTTsE"/>
+
+ <number id="delay" type="slider" arg="-cycle-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="25000"
+ convert="invert"/>
+
+ <number id="maxage" type="slider" arg="-max-age %"
+ _label="Max age" _low-label="Young" _high-label="Old"
+ low="2" high="255" default="64"/>
+
+ <number id="density" type="slider" arg="-initial-density %"
+ _label="Initial density" _low-label="Low" _high-label="High"
+ low="1" high="99" default="30"/>
+
+ <number id="cellsize" type="slider" arg="-cell-size %"
+ _label="Cell size" _low-label="Small" _high-label="Large"
+ low="1" high="20" default="3"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+
+Generates cloud-like formations based on a variant of Conway's Life. The
+difference is that cells have a maximum age, after which they count as
+3 for populating the next generation. This makes long-lived formations
+explode instead of just sitting there.
+
+https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life
+
+Written by Don Marti; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/companioncube.xml b/hacks/config/companioncube.xml
new file mode 100644
index 0000000..128edc5
--- /dev/null
+++ b/hacks/config/companioncube.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="companioncube" _label="CompanionCube" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Q54NVuxhGso"/>
+
+ <hgroup>
+ <vgroup>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Bounce" _low-label="Slow" _high-label="Fast"
+ low="0.05" high="2.0" default="1.0"/>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of cubes" _low-label="1" _high-label="20"
+ low="1" high="20" default="3"/>
+
+ <hgroup>
+ <vgroup>
+ <boolean id="spin" _label="Spin" arg-set="-spin"/>
+ <boolean id="wander" _label="Wander" arg-set="-wander"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The symptoms most commonly produced by Enrichment Center testing are
+superstition, perceiving inanimate objects as alive, and hallucinations.
+The Enrichment Center reminds you that the weighted companion cube will
+never threaten to stab you and, in fact, cannot speak. In the event that
+the Weighted Companion Cube does speak, the Enrichment Center urges you to
+disregard its advice.
+
+https://en.wikipedia.org/wiki/Portal_%28video_game%29
+
+Written by Jamie Zawinski; 2011.
+ </_description>
+</screensaver>
diff --git a/hacks/config/compass.xml b/hacks/config/compass.xml
new file mode 100644
index 0000000..83e0c83
--- /dev/null
+++ b/hacks/config/compass.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="compass" _label="Compass">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=IssDEcgB550"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A compass, with all elements spinning about randomly, for
+that "lost and nauseous" feeling.
+
+Written by Jamie Zawinski; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/coral.xml b/hacks/config/coral.xml
new file mode 100644
index 0000000..c722ea5
--- /dev/null
+++ b/hacks/config/coral.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="coral" _label="Coral">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=3WTSvzJcQhw"/>
+
+ <number id="delay2" type="slider" arg="-delay2 %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="1" high="500000" default="20000"
+ convert="invert"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Linger" _low-label="1 second" _high-label="1 minute"
+ low="1" high="60" default="5"/>
+
+ <number id="density" type="slider" arg="-density %"
+ _label="Density" _low-label="Sparse" _high-label="Dense"
+ low="1" high="90" default="25"
+ convert="invert"/>
+
+ <number id="seeds" type="slider" arg="-seeds %"
+ _label="Seeds" _low-label="Few" _high-label="Many"
+ low="1" high="100" default="20"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Simulates coral growth, albeit somewhat slowly.
+
+Written by Frederick Roeber; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/crackberg.xml b/hacks/config/crackberg.xml
new file mode 100644
index 0000000..dacf279
--- /dev/null
+++ b/hacks/config/crackberg.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="crackberg" _label="Crackberg" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=ej1No4EK8Rc"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="visibility" type="slider" arg="-visibility %"
+ _label="Visibility" _low-label="Mouse hole" _high-label="Eagle nest"
+ low="0.2" high="1.0" default="0.6" />
+ <number id="nsubdivs" type="slider" arg="-nsubdivs %"
+ _label="Subdivisions" _low-label="Few" _high-label="Hurt me"
+ low="2" high="9" default="4" />
+
+ <hgroup>
+ <vgroup>
+ <boolean id="flat" _label="Flat shading" arg-unset="-no-flat"/>
+ <boolean id="lit" _label="Lighting" arg-unset="-no-lit"/>
+ <boolean id="water" _label="Water" arg-unset="-no-water"/>
+ <boolean id="crack" _label="Confused" arg-unset="-no-crack"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="boring" _label="Immediate" arg-set="-boring"/>
+ <boolean id="letter" _label="Letterbox" arg-set="-letterbox"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <select id="color">
+ <option id="random" _label="Random coloration"/>
+ <option id="plain" _label="Earthy coloration" arg-set="-color plain"/>
+ <option id="ice" _label="Icy coloration" arg-set="-color ice"/>
+ <option id="magma" _label="Swampy coloration" arg-set="-color magma"/>
+ <option id="vomit" _label="Vomitous coloration" arg-set="-color vomit"/>
+ </select>
+
+ <xscreensaver-updater />
+
+ <_description>
+Flies through height maps, optionally animating the creation and
+destruction of generated tiles; tiles `grow' into place.
+
+Written by Matus Telgarsky; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/critical.xml b/hacks/config/critical.xml
new file mode 100644
index 0000000..399c569
--- /dev/null
+++ b/hacks/config/critical.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="critical" _label="Critical">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=HN2ykbM2cTk"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="3" high="255" default="64"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Draws a system of self-organizing lines. It starts out as random
+squiggles, but after a few iterations, order begins to appear.
+
+Written by Martin Pool; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/crumbler.xml b/hacks/config/crumbler.xml
new file mode 100644
index 0000000..57b1bd6
--- /dev/null
+++ b/hacks/config/crumbler.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="crumbler" _label="Crumbler" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=oERz1IPluYQ"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.05" high="2.0" default="1.0"/>
+
+ <number id="density" type="slider" arg="-density %"
+ _label="Polygons" _low-label="Few" _high-label="Many"
+ low="0.2" high="5.0" default="1.0"/>
+
+ <number id="fracture" type="slider" arg="-fracture %"
+ _label="Fractures" _low-label="Few" _high-label="Many"
+ low="0" high="20" default="0"/>
+ </vgroup>
+
+ <vgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+ </vgroup>
+ </hgroup>
+
+ <_description>
+Randomly subdivides a ball into voronoi chunks, then further subdivides
+one of the remaining pieces.
+
+https://en.wikipedia.org/wiki/Voronoi_diagram
+https://en.wikipedia.org/wiki/Convex_hull
+https://en.wikipedia.org/wiki/Quickhull
+
+Written by Jamie Zawinski; 2018.
+ </_description>
+</screensaver>
diff --git a/hacks/config/crystal.xml b/hacks/config/crystal.xml
new file mode 100644
index 0000000..ab1f1dd
--- /dev/null
+++ b/hacks/config/crystal.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="crystal" _label="Crystal">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=M27wWKGXIvw"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="60000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="100"/>
+
+ <!-- #### -maxsize -->
+ <!-- #### -shift (color cycling) -->
+
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Number of crystals" low="-5000" high="5000" default="-500"/>
+
+ <number id="nx" type="spinbutton" arg="-nx %"
+ _label="Horizontal symmetries" low="-10" high="10" default="-3"/>
+
+ <number id="ny" type="spinbutton" arg="-ny %"
+ _label="Vertical symmetries" low="-10" high="10" default="-3"/>
+
+ <hgroup>
+ <boolean id="grid" _label="Draw grid" arg-set="-grid"/>
+ <boolean id="cells" _label="Draw cell" arg-unset="-no-cell"/>
+ <boolean id="centre" _label="Center on screen" arg-set="-centre"/>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Moving polygons, similar to a kaleidoscope. See also the
+"Kaleidescope" and "GLeidescope" screen savers.
+
+https://en.wikipedia.org/wiki/Kaleidoscope
+
+Written by Jouk Jansen; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/cube21.xml b/hacks/config/cube21.xml
new file mode 100644
index 0000000..f16d7fd
--- /dev/null
+++ b/hacks/config/cube21.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cube21" _label="Cube21" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=AFtxL6--lTQ"/>
+
+ <hgroup>
+ <vgroup>
+
+ <number id="speed" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000" convert="invert"/>
+
+ <number id="cubesize" type="slider" arg="-cubesize %"
+ _label="Cube size" _low-label="Small" _high-label="Large"
+ low="0.4" high="1.0" default="0.7"/>
+
+ <number id="rotspeed" type="slider" arg="-rotspeed %"
+ _label="Rotation" _low-label="Slow" _high-label="Fast"
+ low="1.0" high="10.0" default="3.0"/>
+
+ <select id="start">
+ <option id="cube" _label="Start as cube" arg-set="-no-randomize"/>
+ <option id="shuffle" _label="Start as random shape"/>
+ </select>
+
+ <select id="colors">
+ <option id="white" _label="White" arg-set="-colormode white"/>
+ <option id="one" _label="Random color" arg-set="-colormode rnd"/>
+ <option id="se" _label="Silver edition" arg-set="-colormode se"/>
+ <option id="two" _label="Two random colors" arg-set="-colormode two"/>
+ <option id="ce" _label="Classic edition" arg-set="-colormode ce"/>
+ <option id="six" _label="Six random colors"/>
+ </select>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="spinspeed" type="slider" arg="-spinspeed %"
+ _label="Spin" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="4.0" default="1.0"/>
+
+ <number id="wanderspeed" type="slider" arg="-wanderspeed %"
+ _label="Wander" _low-label="Slow" _high-label="Fast"
+ low="0.001" high="0.1" default="0.02"/>
+
+ <number id="wait" type="slider" arg="-wait %"
+ _label="Linger" _low-label="Short" _high-label="Long"
+ low="10.0" high="100.0" default="40.0"/>
+
+ <hgroup>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="tex" _label="Outlines" arg-unset="-no-texture"/>
+ </hgroup>
+ <hgroup>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The "Cube 21" Rubik-like puzzle, also known as "Square-1".
+The rotations are chosen randomly. See also the "Rubik",
+"RubikBlocks" and "GLSnake" screen savers.
+
+https://en.wikipedia.org/wiki/Square_One_%28puzzle%29
+
+Written by Vasek Potocek; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/cubenetic.xml b/hacks/config/cubenetic.xml
new file mode 100644
index 0000000..3907214
--- /dev/null
+++ b/hacks/config/cubenetic.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cubenetic" _label="Cubenetic" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=aElbM0rZZNg"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Boxes" _low-label="Few" _high-label="Many"
+ low="1" high="20" default="5"/>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+
+ <select id="rotation">
+ <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
+ <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
+ <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
+ <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
+ <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
+ <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
+ <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
+ <option id="xyz" _label="Rotate around all three axes"/>
+ </select>
+ </hgroup>
+ </vgroup>
+
+ <vgroup>
+ <number id="wave-speed" type="slider" arg="-wave-speed %"
+ _label="Surface pattern speed" _low-label="Slow" _high-label="Fast"
+ low="5" high="150" default="80"/>
+
+ <number id="wave-radius" type="slider" arg="-wave-radius %"
+ _label="Surface pattern overlap"
+ _low-label="Small" _high-label="Large"
+ low="5" high="600" default="512"/>
+
+ <number id="waves" type="slider" arg="-waves %"
+ _label="Surface pattern complexity"
+ _low-label="Low" _high-label="High"
+ low="1" high="20" default="3"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="tex" _label="Textured" arg-unset="-no-texture"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A cubist Lavalite, sort of. A pulsating set of overlapping boxes with
+ever-changing blobby patterns undulating across their surfaces.
+
+Written by Jamie Zawinski; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/cubestack.xml b/hacks/config/cubestack.xml
new file mode 100644
index 0000000..68c550e
--- /dev/null
+++ b/hacks/config/cubestack.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cubestack" _label="CubeStack" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=rZi5yav6sRo"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Animation speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="10" default="1.0"/>
+ </vgroup>
+ <vgroup>
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Thickness" _low-label="Thin" _high-label="Thick"
+ low="0.0" high="0.5" default="0.13"/>
+
+ <number id="opacity" type="slider" arg="-opacity %"
+ _label="Opacity" _low-label="Transparent" _high-label="Opaque"
+ low="0.01" high="1.0" default="0.7"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+An endless stack of unfolding, translucent cubes.
+
+Written by Jamie Zawinski; 2016.
+ </_description>
+</screensaver>
diff --git a/hacks/config/cubestorm.xml b/hacks/config/cubestorm.xml
new file mode 100644
index 0000000..533d710
--- /dev/null
+++ b/hacks/config/cubestorm.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cubestorm" _label="CubeStorm" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=enuZbkMiqCE"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="5.0" default="1.0"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Cubes" _low-label="Few" _high-label="Many"
+ low="1" high="20" default="4"/>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="length" type="slider" arg="-length %"
+ _label="Length" _low-label="Short" _high-label="Long"
+ low="20" high="1000" default="200"/>
+
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Struts" _low-label="Thin" _high-label="Thick"
+ low="0.01" high="1.0" default="0.06"/>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+
+ </vgroup>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Boxes change shape and intersect each other, filling space.
+
+Written by Jamie Zawinski; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/cubetwist.xml b/hacks/config/cubetwist.xml
new file mode 100644
index 0000000..00f54b8
--- /dev/null
+++ b/hacks/config/cubetwist.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cubetwist" _label="CubeTwist" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=RjrtUtMEa_4"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Animation speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="10" default="1.0"/>
+ </vgroup>
+ <vgroup>
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Thickness" _low-label="Thin" _high-label="Thick"
+ low="0.0" high="0.5" default="0.0"/>
+
+ <number id="displacement" type="slider" arg="-displacement %"
+ _label="Displacement" _low-label="Tight" _high-label="Wide"
+ low="0.0" high="0.5" default="0.0"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="flat" _label="Flat shading" arg-unset="-no-flat"/>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A series of nested cubes rotate and slide recursively.
+
+Written by Jamie Zawinski; 2016.
+ </_description>
+</screensaver>
diff --git a/hacks/config/cubicgrid.xml b/hacks/config/cubicgrid.xml
new file mode 100644
index 0000000..b8a90a8
--- /dev/null
+++ b/hacks/config/cubicgrid.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cubicgrid" _label="CubicGrid" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=nOTi7gy9l-I"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000" convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.2" high="10.0" default="1.0"/>
+
+ <number id="zoom" type="slider" arg="-zoom %"
+ _label="Dot spacing" _low-label="Close" _high-label="Far"
+ low="15" high="100" default="20"/>
+
+ <boolean id="bigdots" _label="Big dots" arg-unset="-no-bigdots"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A rotating lattice of colored points.
+
+Written by Vasek Potocek; 2007.
+ </_description>
+</screensaver>
diff --git a/hacks/config/cwaves.xml b/hacks/config/cwaves.xml
new file mode 100644
index 0000000..b18f365
--- /dev/null
+++ b/hacks/config/cwaves.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cwaves" _label="CWaves">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=yOuJqiDUrpY"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="waves" type="slider" arg="-waves %"
+ _label="Complexity" _low-label="Low" _high-label="High"
+ low="1" high="100" default="15"/>
+
+ <number id="ncolors" type="slider" arg="-colors %"
+ _label="Color transitions" _low-label="Rough" _high-label="Smooth"
+ low="2" high="1000" default="600"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A field of sinusoidal colors languidly scrolls. It's relaxing.
+
+Written by Jamie Zawinski; 2007.
+ </_description>
+</screensaver>
diff --git a/hacks/config/cynosure.xml b/hacks/config/cynosure.xml
new file mode 100644
index 0000000..c81130d
--- /dev/null
+++ b/hacks/config/cynosure.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cynosure" _label="Cynosure">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=If7FOc8UnYs"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="1000000" default="500000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="2" high="255" default="128"/>
+
+ <number id="iterations" type="slider" arg="-iterations %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="2" high="200" default="100"/>
+
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Random dropshadowed rectangles pop onto the screen in lockstep.
+
+Written by Ozymandias G. Desiderata, Jamie Zawinski, and Stephen Linhart; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/dangerball.xml b/hacks/config/dangerball.xml
new file mode 100644
index 0000000..12bbac5
--- /dev/null
+++ b/hacks/config/dangerball.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="dangerball" _label="DangerBall" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=QU0aPwWwHbg"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="spikespeed" type="slider" arg="-speed %"
+ _label="Spike growth" _low-label="Slow" _high-label="Fast"
+ low="0.001" high="0.25" default="0.05"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of spikes" _low-label="Few" _high-label="Ouch"
+ low="1" high="100" default="30"/>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A spiky ball. Ouch!
+
+Written by Jamie Zawinski; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/decayscreen.xml b/hacks/config/decayscreen.xml
new file mode 100644
index 0000000..93d85b3
--- /dev/null
+++ b/hacks/config/decayscreen.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="decayscreen" _label="DecayScreen">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=dFlyRTObuDo"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="120"/>
+
+ <select id="mode">
+ <option id="random" _label="Random melt style"/>
+ <option id="random" _label="Shuffle melt" arg-set="-mode shuffle"/>
+ <option id="random" _label="Melt up" arg-set="-mode up"/>
+ <option id="random" _label="Melt down" arg-set="-mode down"/>
+ <option id="random" _label="Melt left" arg-set="-mode left"/>
+ <option id="random" _label="Melt right" arg-set="-mode right"/>
+ <option id="random" _label="Melt up, left" arg-set="-mode upleft"/>
+ <option id="random" _label="Melt up, right" arg-set="-mode upright"/>
+ <option id="random" _label="Melt down, left" arg-set="-mode downleft"/>
+ <option id="random" _label="Melt down, right" arg-set="-mode downright"/>
+ <option id="random" _label="Melt towards center" arg-set="-mode in"/>
+ <option id="random" _label="Melt away from center" arg-set="-mode out"/>
+ <option id="random" _label="Melty melt" arg-set="-mode melt"/>
+ <option id="random" _label="Stretchy melt" arg-set="-mode stretch"/>
+ <option id="random" _label="Fuzzy melt" arg-set="-mode fuzz"/>
+ </select>
+
+ <xscreensaver-image />
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Melts an image in various ways. Warning, if the effect continues after
+the screen saver is off, seek medical attention.
+
+Written by David Wald, Vivek Khera, Jamie Zawinski, and Vince Levey; 1993.
+ </_description>
+</screensaver>
diff --git a/hacks/config/deco.xml b/hacks/config/deco.xml
new file mode 100644
index 0000000..b5347cf
--- /dev/null
+++ b/hacks/config/deco.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="deco" _label="Deco">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=kfdDTv07Nhw"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Duration" _low-label="1 second" _high-label="1 minute"
+ low="1" high="60" default="5"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="minwidth" type="spinbutton" arg="-min-width %"
+ _label="Minimum width" low="1" high="100" default="20"/>
+
+ <number id="minheight" type="spinbutton" arg="-min-height %"
+ _label="Minimum height" low="1" high="100" default="20"/>
+
+ <number id="maxdepth" type="spinbutton" arg="-max-depth %"
+ _label="Maximum depth" low="1" high="40" default="12"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="smooth-colors" _label="Smooth colors" arg-set="-smooth-colors"/>
+ <boolean id="golden-ratio" _label="Golden ratio" arg-set="-golden-ratio"/>
+ <boolean id="mondrian" _label="Mondrian" arg-set="-mondrian"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Subdivides and colors rectangles randomly, for a Mondrian-esque effect.
+
+https://en.wikipedia.org/wiki/Piet_Mondrian#Paris_1919.E2.80.931938
+
+Written by Jamie Zawinski and Michael Bayne; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/deluxe.xml b/hacks/config/deluxe.xml
new file mode 100644
index 0000000..0cd4746
--- /dev/null
+++ b/hacks/config/deluxe.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="deluxe" _label="Deluxe">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=2CsKEVR3ecs"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="50000" default="10000"
+ convert="invert"/>
+
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Lines" _low-label="Thin" _high-label="Thick"
+ low="1" high="150" default="50"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Shapes" _low-label="1" _high-label="20"
+ low="1" high="20" default="5"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="20"/>
+
+ <!-- #### -speed [15] -->
+
+ <boolean id="transparent" _label="Transparency" arg-unset="-no-transparent"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Pulsing stars, circles, and lines.
+
+Written by Jamie Zawinski; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/demon.xml b/hacks/config/demon.xml
new file mode 100644
index 0000000..bd78bf1
--- /dev/null
+++ b/hacks/config/demon.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="demon" _label="Demon">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=OhHI-pIHddA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="50000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="States" _low-label="0" _high-label="20"
+ low="0" high="20" default="0"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Timeout" _low-label="Small" _high-label="Large"
+ low="0" high="800000" default="1000"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Cell size" low="-40" high="40" default="-30"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A cellular automaton that starts with a random field, and organizes
+it into stripes and spirals.
+
+https://en.wikipedia.org/wiki/Maxwell%27s_demon
+
+Written by David Bagley; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/discoball.xml b/hacks/config/discoball.xml
new file mode 100644
index 0000000..61ed94c
--- /dev/null
+++ b/hacks/config/discoball.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="discoball" _label="Discoball" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=8yd4PYJQrMw"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="5" default="1.0"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Size" _low-label="Small" _high-label="Large"
+ low="10" high="100" default="30"/>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-set="-spin"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A dusty, dented disco ball. Woop woop.
+
+Written by Jamie Zawinski; 2016.
+ </_description>
+</screensaver>
diff --git a/hacks/config/discrete.xml b/hacks/config/discrete.xml
new file mode 100644
index 0000000..01c7d4f
--- /dev/null
+++ b/hacks/config/discrete.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="discrete" _label="Discrete">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=l-yIY8vRlHA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Timeout" _low-label="Small" _high-label="Large"
+ low="100" high="10000" default="2500"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="100"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Discrete map fractal systems, including variants of Hopalong, Julia,
+and others.
+
+Written by Tim Auckland; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/distort.xml b/hacks/config/distort.xml
new file mode 100644
index 0000000..ab06ae1
--- /dev/null
+++ b/hacks/config/distort.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="distort" _label="Distort">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=ENaG3gwtukM"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="200000" default="20000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="120"/>
+
+ <!-- #### -speed [0] -->
+ <!-- #### -slow -->
+
+ <number id="radius" type="slider" arg="-radius %"
+ _label="Lens size" _low-label="Small" _high-label="Large"
+ low="0" high="1000" default="0"/>
+
+ <hgroup>
+ <number id="count" type="spinbutton" arg="-number %"
+ _label="Lens count" low="0" high="10" default="0"/>
+
+ <select id="effect">
+ <option id="normal" _label="Normal"/>
+ <option id="swamp" _label="Swamp thing" arg-set="-effect swamp"/>
+ <option id="bounce" _label="Bounce" arg-set="-effect bounce"/>
+ </select>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="reflect" _label="Reflect" arg-set="-reflect"/>
+ <boolean id="magnify" _label="Magnify" arg-set="-magnify"/>
+ <boolean id="blackhole" _label="Black hole" arg-set="-blackhole"/>
+ <boolean id="vortex" _label="Vortex" arg-set="-vortex"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-image />
+
+ <xscreensaver-updater />
+
+ <_description>
+Wandering lenses distort the screen image in various ways.
+
+Written by Jonas Munsin; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/dnalogo.xml b/hacks/config/dnalogo.xml
new file mode 100644
index 0000000..ac10f15
--- /dev/null
+++ b/hacks/config/dnalogo.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="dnalogo" _label="DNA Logo" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=B7I5A7E3SP0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame Rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="25000"
+ convert="invert"/>
+
+ <select id="mode">
+ <option id="glyph" _label="DNA Lounge logo" arg-set="-mode helix"/>
+ <option id="pizza" _label="DNA Pizza logo" arg-set="-mode pizza"/>
+ <option id="both" _label="DNA Lounge and DNA Pizza logos"/>
+<!--<option id="codeword" _label="Codeword logo" arg-set="-mode codeword"/>-->
+ </select>
+ <hgroup>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+DNA Lounge
+
+ Restaurant -- Bar -- Nightclub -- Cafe -- Est. 1985.
+
+ 375 Eleventh Street
+ San Francisco, CA
+ 94103
+
+Codeword
+
+ Restaurant -- Bar -- Nightclub -- Cafe -- Est. 2015.
+
+ 917 Folsom Street
+ San Francisco, CA
+ 94107
+
+ https://www.dnalounge.com/
+ http://www.dnapizza.com/
+ https://www.codeword-sf.com/
+
+Written by Jamie Zawinski; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/drift.xml b/hacks/config/drift.xml
new file mode 100644
index 0000000..9eda2b4
--- /dev/null
+++ b/hacks/config/drift.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="drift" _label="Drift">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=cppZgCh6U7I"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="1" high="200" default="30"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="200"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Drifting recursive fractal cosmic flames.
+
+Written by Scott Draves; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/dymaxionmap.xml b/hacks/config/dymaxionmap.xml
new file mode 100644
index 0000000..6f846c7
--- /dev/null
+++ b/hacks/config/dymaxionmap.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="dymaxionmap" _label="DymaxionMap" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=4LnO0UiccGs"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Animation speed" _low-label="Slow" _high-label="Fast"
+ low="0.05" high="10.0" default="1.0"/>
+ </vgroup>
+ <vgroup>
+
+ <hgroup>
+ <select id="map">
+ <option id="flat" _label="Flat map"/>
+ <option id="day" _label="Satellite map" arg-set="-image BUILTIN_SAT"/>
+ </select>
+
+ <!-- <file id="image" _label="Image file" arg="-image %"/> -->
+ </hgroup>
+
+ <number id="frames" type="slider" arg="-frames %"
+ _label="Day / night smoothness" _low-label="Low" _high-label="High"
+ low="24" high="1440" default="720"/>
+ </vgroup>
+ </hgroup>
+ <hgroup>
+
+ <vgroup>
+ <hgroup>
+ <boolean id="stars" _label="Stars" arg-unset="-no-stars"/>
+ <boolean id="grid" _label="Lat / Long" arg-unset="-no-grid"/>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="roll" _label="Roll" arg-unset="-no-roll"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ </vgroup>
+ </hgroup>
+
+ <_description>
+Buckminster Fuller's map of the Earth projected onto the surface of
+an unfolded icosahedron. It depicts the Earth's continents as one
+island, or nearly contiguous land masses.
+
+This screen saver animates the progression of the dusk terminator across
+the flattened globe. It includes both satellite and flat-colored map
+imagery, and can load and convert other Equirectangular-projected maps.
+
+"Dymaxion Map" and "The Fuller Projection Map" are trademarks of
+The Buckminster Fuller Institute.
+
+The original Dymaxion Map image is copyright 1982 by
+The Buckminster Fuller Institute. (This program does not use their
+imagery, only similar trigonometry.)
+
+The Dymaxion Map was covered by now-expired US Patent 2,393,676
+(Richard Buckminster Fuller, 1946).
+
+https://en.wikipedia.org/wiki/Dymaxion_map
+https://en.wikipedia.org/wiki/Buckminster_Fuller
+https://en.wikipedia.org/wiki/List_of_map_projections
+https://en.wikipedia.org/wiki/Cahill%E2%80%93Keyes_projection
+https://en.wikipedia.org/wiki/Waterman_butterfly_projection
+
+Written by Jamie Zawinski; 2016.
+ </_description>
+</screensaver>
diff --git a/hacks/config/endgame.xml b/hacks/config/endgame.xml
new file mode 100644
index 0000000..88eac22
--- /dev/null
+++ b/hacks/config/endgame.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="endgame" _label="Endgame" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=QfglC_lvUTA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <boolean id="classic" _label="Low resolution chess pieces" arg-set="-classic"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Black slips out of three mating nets, but the fourth one holds him tight!
+A brilliant composition!
+
+See also the "Queens" screen saver.
+
+https://en.wikipedia.org/wiki/Chess_endgame
+
+Written by Blair Tennessy and Jamie Zawinski; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/energystream.xml b/hacks/config/energystream.xml
new file mode 100644
index 0000000..a3c034f
--- /dev/null
+++ b/hacks/config/energystream.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="energystream" _label="EnergyStream" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=TbWZ6v5Zzk8"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="5.0" default="1.0"/>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-wander" />
+ <boolean id="spin" _label="Spin" arg-unset="-spin" />
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A flow of particles which form an energy stream.
+
+Written by Eugene Sandulenko and Konrad "Yoghurt" Zagorowicz; 2016.
+ </_description>
+</screensaver>
diff --git a/hacks/config/engine.xml b/hacks/config/engine.xml
new file mode 100644
index 0000000..5c91d28
--- /dev/null
+++ b/hacks/config/engine.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="engine" _label="Engine" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=8BL2o8QJmiA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <select id="engine">
+ <option id="random" _label="Random engine"/>
+ <option id="1" _label="Honda Insight (3 cylinders)" arg-set="-engine honda_insight"/>
+ <option id="2" _label="BMW M3 (4 cylinders)" arg-set="-engine bmw_m3"/>
+ <option id="3" _label="VW Beetle (4 cylinders, flat)" arg-set="-engine vw_beetle"/>
+ <option id="4" _label="Audi Quattro (5 cylinders)" arg-set="-engine audi_quattro"/>
+ <option id="5" _label="BMW M5 (6 cylinders)" arg-set="-engine bmw_m5"/>
+ <option id="6" _label="Subaru XT (6 cylinders, V)" arg-set="-engine subaru_xt"/>
+ <option id="7" _label="Porsche 911 (6 cylinders, flat)" arg-set="-engine porsche_911"/>
+ <option id="8" _label="Corvette Z06 (8 cylinders, V)" arg-set="-engine corvette_z06"/>
+ <option id="9" _label="Dodge Viper (10 cylinders, V)" arg-set="-engine dodge_viper"/>
+ <option id="10" _label="Jaguar XKE (12 cylinders, V)" arg-set="-engine jaguar_xke"/>
+ </select>
+
+ <boolean id="titles" _label="Show engine name" arg-set="-titles"/>
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-move"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ </hgroup>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Internal combusion engines.
+
+https://en.wikipedia.org/wiki/Internal_combustion_engine#Operation
+
+Written by Ben Buxton, Ed Beroset and Jamie Zawinski; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/epicycle.xml b/hacks/config/epicycle.xml
new file mode 100644
index 0000000..0b56922
--- /dev/null
+++ b/hacks/config/epicycle.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="epicycle" _label="Epicycle">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=rpk3zxQxaR8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-colors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="100"/>
+
+ <number id="holdtime" type="slider" arg="-holdtime %"
+ _label="Linger" _low-label="1 second" _high-label="30 seconds"
+ low="1" high="30" default="2"/>
+
+ <hgroup>
+ <number id="linewidth" type="spinbutton" arg="-linewidth %"
+ _label="Line thickness" low="1" high="50" default="4"/>
+
+ <number id="harmonics" type="spinbutton" arg="-harmonics %"
+ _label="Harmonics" low="1" high="20" default="8"/>
+ </hgroup>
+
+ <!-- #### -color0 [red] -->
+ <!-- #### -colours [100] -->
+ <!-- #### -foreground [white] -->
+ <!-- #### -min_circles [2] -->
+ <!-- #### -max_circles [10] -->
+ <!-- #### -min_speed [0.003] -->
+ <!-- #### -max_speed [0.005] -->
+ <!-- #### -timestep [1.0] -->
+ <!-- #### -divisor_poisson [0.4] -->
+ <!-- #### -size_factor_min [1.05] -->
+ <!-- #### -size_factor_max [2.05] -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A pre-heliocentric model of planetary motion.
+
+This draws the path traced out by a point on the edge of a
+circle. That circle rotates around a point on the rim of another
+circle, and so on, several times.
+
+https://en.wikipedia.org/wiki/Deferent_and_epicycle
+
+Written by James Youngman; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/eruption.xml b/hacks/config/eruption.xml
new file mode 100644
index 0000000..da778fe
--- /dev/null
+++ b/hacks/config/eruption.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="eruption" _label="Eruption">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=CQ6jDBnumT8"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Few" _high-label="Many"
+ low="16" high="256" default="256"/>
+
+ <number id="nparticles" type="slider" arg="-particles %"
+ _label="Number of particles" _low-label="Little" _high-label="Many"
+ low="100" high="2000" default="300"/>
+
+ <number id="cooloff" type="slider" arg="-cooloff %"
+ _label="Cooling factor" _low-label="Slow" _high-label="Fast"
+ low="0" high="10" default="2"/>
+ </vgroup>
+ <vgroup>
+ <number id="heat" type="slider" arg="-heat %"
+ _label="Heat" _low-label="Pleasant" _high-label="Inferno"
+ low="64" high="256" default="256"/>
+
+ <number id="gravity" type="slider" arg="-gravity %"
+ _label="Gravity" _low-label="Negative" _high-label="Positive"
+ low="-5" high="5" default="1"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="10" high="3000" default="80"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Exploding fireworks. See also the "Fireworkx", "XFlame" and "Pyro"
+screen savers.
+
+Written by W.P. van Paassen; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/esper.xml b/hacks/config/esper.xml
new file mode 100644
index 0000000..e91bb51
--- /dev/null
+++ b/hacks/config/esper.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="esper" _label="Esper" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=_er7xZd7zUU"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.2" high="20" default="1.0"/>
+
+ </vgroup>
+ <vgroup>
+
+ <boolean id="titles" _label="Show file names" arg-unset="-no-titles"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-image />
+
+ <xscreensaver-updater />
+
+ </vgroup>
+ </hgroup>
+
+ <_description>
+"Enhance 224 to 176. Pull out track right. Center in pull back. Pull
+back. Wait a minute. Go right. Stop. Enhance 57 19. Track 45 left.
+Gimme a hardcopy right there."
+
+The Esper Machine was a voice-controlled forensic device used by LAPD
+in 2019, as documented in the 1982 film, Blade Runner. It was capable
+of enhancing photographs to an extreme degree, including reconstructing
+different viewpoints within the space from the reflections on various
+objects in the photograph.
+
+Written by Jamie Zawinski; 2017.
+ </_description>
+</screensaver>
diff --git a/hacks/config/euler2d.xml b/hacks/config/euler2d.xml
new file mode 100644
index 0000000..31222e6
--- /dev/null
+++ b/hacks/config/euler2d.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="euler2d" _label="Euler2D">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=ZH1ZtfId0iA"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Particles" _low-label="Few" _high-label="Many"
+ low="2" high="5000" default="1024"/>
+
+ <number id="eulertail" type="slider" arg="-eulertail %"
+ _label="Trail length" _low-label="Short" _high-label="Long"
+ low="2" high="500" default="10"/>
+ </vgroup>
+
+ <vgroup>
+ <!--
+ <number id="eulerpower" type="slider" arg="-eulerpower %"
+ _label="Power" _low-label="Low" _high-label="High"
+ low="0.5" high="3.0" default="1.0"/>
+ -->
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="100" high="5000" default="3000"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="2" high="255" default="64"/>
+ </vgroup>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ <xscreensaver-updater />
+
+ <_description>
+Simulates two dimensional incompressible inviscid fluid flow.
+
+https://en.wikipedia.org/wiki/Euler_equations_%28fluid_dynamics%29
+https://en.wikipedia.org/wiki/Inviscid_flow
+
+Written by Stephen Montgomery-Smith; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/extrusion.xml b/hacks/config/extrusion.xml
new file mode 100644
index 0000000..97c26a8
--- /dev/null
+++ b/hacks/config/extrusion.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="extrusion" _label="Extrusion" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=eKYmqL7ndGs"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <select id="mode">
+ <option id="random" _label="Random object"/>
+ <option id="helix2" _label="Helix 2" arg-set="-name helix2"/>
+ <option id="helix3" _label="Helix 3" arg-set="-name helix3"/>
+ <option id="helix4" _label="Helix 4" arg-set="-name helix4"/>
+ <option id="joinoffset" _label="Join offset" arg-set="-name joinoffset"/>
+ <option id="screw" _label="Screw" arg-set="-name screw"/>
+ <option id="taper" _label="Taper" arg-set="-name taper"/>
+ <option id="twist" _label="Twistoid" arg-set="-name twistoid"/>
+ </select>
+
+ <select id="render">
+ <option id="flat" _label="Use flat coloring" arg-set="-no-light"/>
+ <option id="light" _label="Use lighting"/>
+ </select>
+
+ <!-- #### -texture -->
+ <!-- #### -texture_quality -->
+ <!-- #### -mipmap -->
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Various extruded shapes twist and turn inside out.
+
+Written by Linas Vepstas, David Konerding, and Jamie Zawinski; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/fadeplot.xml b/hacks/config/fadeplot.xml
new file mode 100644
index 0000000..a977c2b
--- /dev/null
+++ b/hacks/config/fadeplot.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="fadeplot" _label="FadePlot">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Cev034v37JM"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Thickness" _low-label="Thin" _high-label="Thick"
+ low="0" high="30" default="10"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Cycles" _low-label="Small" _high-label="Large"
+ low="0" high="10000" default="1500"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A waving ribbon follows a sinusoidal path.
+
+Written by Bas van Gaalen and Charles Vidal; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/fiberlamp.xml b/hacks/config/fiberlamp.xml
new file mode 100644
index 0000000..b07e863
--- /dev/null
+++ b/hacks/config/fiberlamp.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="fiberlamp" _label="Fiberlamp">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=PvYKJ-vkxE0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Fibers" _low-label="Few" _high-label="Many"
+ low="10" high="500" default="500"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Time between knocks" _low-label="Short" _high-label="Long"
+ low="100" high="10000" default="10000"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A fiber-optic lamp. Groovy.
+
+Written by Tim Auckland; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/filmleader.xml b/hacks/config/filmleader.xml
new file mode 100644
index 0000000..02b4fd7
--- /dev/null
+++ b/hacks/config/filmleader.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="filmleader" _label="FilmLeader">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Cng7hmsuLo0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="tvcolor" type="slider" arg="-tv-color %"
+ _label="Color Knob" _low-label="Low" _high-label="High"
+ low="0" high="400" default="70"/>
+ <number id="tvtint" type="slider" arg="-tv-tint %"
+ _label="Tint Knob" _low-label="Low" _high-label="High"
+ low="0" high="360" default="5"/>
+ <number id="noise" type="slider" arg="-noise %"
+ _label="Noise" _low-label="Low" _high-label="High"
+ low="0.0" high="0.2" default="0.04"/>
+ </vgroup>
+ <vgroup>
+ <number id="tvbrightness" type="slider" arg="-tv-brightness %"
+ _label="Brightness Knob" _low-label="Low" _high-label="High"
+ low="-75.0" high="100.0" default="3.0"/>
+ <number id="tvcontrast" type="slider" arg="-tv-contrast %"
+ _label="Contrast Knob" _low-label="Low" _high-label="High"
+ low="0" high="500" default="150"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Displays a looping countdown based on the SMPTE Universal Film leader
+on a simulation of an old analog television.
+
+https://en.wikipedia.org/wiki/Film_leader
+
+Written by Jamie Zawinski; 2018.
+ </_description>
+</screensaver>
diff --git a/hacks/config/fireworkx.xml b/hacks/config/fireworkx.xml
new file mode 100644
index 0000000..2c8d096
--- /dev/null
+++ b/hacks/config/fireworkx.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="fireworkx" _label="Fireworkx">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=-l9BfvnFIPM"/>
+
+ <number id="Delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="maxlife" type="slider" arg="-maxlife %"
+ _label="Activity" _low-label="Dense" _high-label="Sparse"
+ low="0" high="100" default="32"/>
+
+ <boolean id="flash" _label="Light flash" arg-unset="-no-flash"/>
+ <boolean id="shoot" _label="Shells upward" arg-set="-shoot"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Exploding fireworks. See also the "Eruption", "XFlame" and "Pyro"
+screen savers.
+
+Written by Rony B Chandran; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/flag.xml b/hacks/config/flag.xml
new file mode 100644
index 0000000..1e6cfb3
--- /dev/null
+++ b/hacks/config/flag.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="flag" _label="Flag">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=LuEC3EONzjc"/>
+
+ <string id="text" _label="Text for flag" arg="-text %"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="200000" default="50000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Timeout" _low-label="Small" _high-label="Large"
+ low="0" high="800000" default="1000"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="200"/>
+
+ <!-- #### -size [-7] -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+This draws a waving colored flag, that undulates its way around the
+screen. The flag can contain arbitrary text and images. By default,
+it displays either the current system name and OS type, or a picture
+of "Bob".
+
+Written by Charles Vidal and Jamie Zawinski; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/flame.xml b/hacks/config/flame.xml
new file mode 100644
index 0000000..8e341c6
--- /dev/null
+++ b/hacks/config/flame.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="flame" _label="Flame">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=6Pu8JKNT_Jk"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="50000"
+ convert="invert"/>
+
+ <number id="delay2" type="slider" arg="-delay2 %"
+ _label="Linger" _low-label="0 seconds" _high-label="10 seconds"
+ low="1000" high="10000000" default="2000000"/>
+
+ <number id="iterations" type="slider" arg="-iterations %"
+ _label="Number of fractals" _low-label="Few" _high-label="Many"
+ low="1" high="250" default="25"/>
+
+ <number id="points" type="slider" arg="-points %"
+ _label="Complexity" _low-label="Low" _high-label="High"
+ low="100" high="80000" default="10000"/>
+
+ <number id="ncolors" type="slider" arg="-colors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Iterative fractals.
+
+Written by Scott Draves; 1993.
+ </_description>
+</screensaver>
diff --git a/hacks/config/flipflop.xml b/hacks/config/flipflop.xml
new file mode 100644
index 0000000..7f843a3
--- /dev/null
+++ b/hacks/config/flipflop.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="flipflop" _label="FlipFlop" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=RzWRoAMFtnw"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="spin" type="slider" arg="-spin %"
+ _label="Spin" _low-label="Stopped" _high-label="Whirlwind"
+ low="0" high="3.0" default="0.1"/>
+ </vgroup>
+ <vgroup>
+
+ <select id="mode">
+ <option id="tiles" _label="Draw Tiles"/>
+ <option id="sticks" _label="Draw Sticks" arg-set="-mode sticks"/>
+ </select>
+
+ <number id="size-x" type="spinbutton" arg="-size-x %"
+ _label="Width" low="3" high="20" default="9"/>
+ <number id="size-y" type="spinbutton" arg="-size-y %"
+ _label="Depth" low="3" high="20" default="9"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <boolean id="texture" _label="Load image" arg-set="-texture" />
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ <vgroup>
+ <xscreensaver-image />
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Colored tiles swap with each other.
+
+Written by Kevin Ogden and Sergio Gutierrez; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/flipscreen3d.xml b/hacks/config/flipscreen3d.xml
new file mode 100644
index 0000000..5ed1cfb
--- /dev/null
+++ b/hacks/config/flipscreen3d.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="flipscreen3d" _label="FlipScreen3D" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=mu3iN_BSpt4"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <boolean id="rotate" _label="Rotate" arg-unset="-no-rotate"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-image />
+
+ <xscreensaver-updater />
+
+ <_description>
+Spins and deforms an image.
+
+Written by Ben Buxton and Jamie Zawinski; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/fliptext.xml b/hacks/config/fliptext.xml
new file mode 100644
index 0000000..48c7e64
--- /dev/null
+++ b/hacks/config/fliptext.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="fliptext" _label="FlipText" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=vcB-6S7Hfuk"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+ </vgroup>
+ <vgroup>
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="10.0" default="1.0"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <select id="align">
+ <option id="left" _label="Random text alignment"/>
+ <option id="left" _label="Flush left text" arg-set="-alignment left"/>
+ <option id="center" _label="Centered text" arg-set="-alignment center"/>
+ <option id="right" _label="Flush right text" arg-set="-alignment right"/>
+ </select>
+
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Font point size" low="1" high="100" default="20"/>
+
+ <number id="columns" type="spinbutton" arg="-columns %"
+ _label="Text columns" low="1" high="200" default="80"/>
+
+ <number id="lines" type="spinbutton" arg="-lines %"
+ _label="Text lines" low="1" high="99" default="8"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ <vgroup>
+ <xscreensaver-text />
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Successive pages of text flip in and out in a soothing 3D pattern.
+
+Written by Jamie Zawinski; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/flow.xml b/hacks/config/flow.xml
new file mode 100644
index 0000000..804080a
--- /dev/null
+++ b/hacks/config/flow.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="flow" _label="Flow">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=RJjbRV0FC_A"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="speed" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="Few" _high-label="Many"
+ low="10" high="5000" default="3000"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Timeout" _low-label="Small" _high-label="Large"
+ low="0" high="800000" default="10000"/>
+ </vgroup>
+ <vgroup>
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="200"/>
+
+ <number id="size" type="slider" arg="-size %"
+ _label="Length of trails" _low-label="Short" _high-label="Long"
+ low="-20" high="-2" default="-10" convert="invert"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <boolean id="rotate" _label="Rotating around attractor" arg-unset="-no-rotate"/>
+ <boolean id="ride" _label="Ride in the flow" arg-unset="-no-ride"/>
+ <boolean id="box" _label="Draw bounding box" arg-unset="-no-box"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="periodic" _label="Periodic attractors" arg-unset="-no-periodic"/>
+ <boolean id="search" _label="Search for new attractors" arg-unset="-no-search"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Strange attractors formed of flows in a 3D differential equation phase
+space. Features the popular attractors described by Lorentz,
+Roessler, Birkhoff and Duffing, and can discover entirely new
+attractors by itself.
+
+https://en.wikipedia.org/wiki/Attractor#Strange_attractor
+
+Written by Tim Auckland; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/fluidballs.xml b/hacks/config/fluidballs.xml
new file mode 100644
index 0000000..2acd92c
--- /dev/null
+++ b/hacks/config/fluidballs.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="fluidballs" _label="FluidBalls">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=5Iz9V-vOrxA"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of balls" _low-label="Few" _high-label="Many"
+ low="1" high="3000" default="300"/>
+
+ <number id="size" type="slider" arg="-size %"
+ _label="Ball size" _low-label="Small" _high-label="Large"
+ low="3" high="200" default="25"/>
+ </vgroup>
+ <vgroup>
+ <number id="gravity" type="slider" arg="-gravity %"
+ _label="Gravity" _low-label=" Freefall" _high-label="Jupiter"
+ low="0.0" high="0.1" default="0.01"/>
+
+ <number id="wind" type="slider" arg="-wind %"
+ _label="Wind" _low-label="Still" _high-label="Hurricane"
+ low="0.0" high="0.1" default="0.00"/>
+
+ <number id="elasticity" type="slider" arg="-elasticity %"
+ _label="Friction" _low-label="Clay" _high-label="Rubber"
+ low="0.2" high="1.0" default="0.97"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="random" _label="Various ball sizes" arg-unset="-no-random"/>
+ <boolean id="shake" _label="Shake box" arg-unset="-no-shake"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Models the physics of bouncing balls, or of particles in a gas or
+fluid, depending on the settings. If "Shake Box" is selected, then
+every now and then, the box will be rotated, changing which direction
+is down (in order to keep the settled balls in motion.)
+
+Written by Peter Birtles and Jamie Zawinski; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/flurry.xml b/hacks/config/flurry.xml
new file mode 100644
index 0000000..5917e32
--- /dev/null
+++ b/hacks/config/flurry.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="flurry" _label="Flurry" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=0beqUyN5ZsI"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <select id="preset">
+ <option id="classic" _label="Classic" arg-set="-preset classic"/>
+ <option id="rgb" _label="RGB" arg-set="-preset rgb"/>
+ <option id="fire" _label="Fire" arg-set="-preset fire"/>
+ <option id="water" _label="Water" arg-set="-preset water"/>
+ <option id="binary" _label="Binary" arg-set="-preset binary"/>
+ <option id="psych" _label="Psychedelic" arg-set="-preset psychedelic"/>
+ <option id="insane" _label="Insane" arg-set="-preset insane"/>
+ <option id="random" _label="Random"/>
+ </select>
+
+ <xscreensaver-updater />
+
+ <_description>
+A colourful star(fish)like flurry of particles.
+
+Written by Calum Robinson and Tobias Sargeant; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/flyingtoasters.xml b/hacks/config/flyingtoasters.xml
new file mode 100644
index 0000000..7df6459
--- /dev/null
+++ b/hacks/config/flyingtoasters.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="flyingtoasters" _label="FlyingToasters" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=mLGDvtbFvfg"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Air speed" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="8.0" default="1.0"/>
+
+ <number id="ntoasters" type="slider" arg="-ntoasters %"
+ _label="Number of toasters" _low-label="None" _high-label="Swarm"
+ low="0" high="50" default="20"/>
+
+ <number id="nslices" type="slider" arg="-nslices %"
+ _label="Number of slices" _low-label="None" _high-label="Swarm"
+ low="0" high="50" default="25"/>
+
+ <hgroup>
+ <boolean id="tex" _label="Chrome" arg-unset="-no-texture"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A fleet of 3d space-age jet-powered flying toasters (and toast!)
+Inspired by the ancient Berkeley Systems After Dark flying toasters.
+
+https://en.wikipedia.org/wiki/After_Dark_%28software%29#Flying_Toasters
+
+Written by Jamie Zawinski and Devon Dossett; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/fontglide.xml b/hacks/config/fontglide.xml
new file mode 100644
index 0000000..db437d3
--- /dev/null
+++ b/hacks/config/fontglide.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="fontglide" _label="FontGlide">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=2KCXD19FHk0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="10.0" default="1.0"/>
+
+ <number id="linger" type="slider" arg="-linger %"
+ _label="Page linger" _low-label="Brief" _high-label="Long"
+ low="0.1" high="10.0" default="1.0"/>
+
+ <select id="mode">
+ <option id="page" _label="Pages of text" arg-set="-mode page"/>
+ <option id="scroll" _label="Horizontally scrolling text" arg-set="-mode scroll"/>
+ <option id="random" _label="Random display style"/>
+ </select>
+
+ <hgroup>
+ <number id="bw" type="spinbutton" arg="-bw %"
+ _label="Font border thickness" low="0" high="8" default="2"/>
+ </hgroup>
+ </vgroup>
+
+ <vgroup>
+ <xscreensaver-text />
+ <hgroup>
+ <boolean id="trails" _label="Vapor trails" arg-set="-trails"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Puts text on the screen using large characters that glide in from the
+edges, assemble, then disperse. Alternately, it can simply scroll whole
+sentences from right to left.
+
+Written by Jamie Zawinski; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/forest.xml b/hacks/config/forest.xml
new file mode 100644
index 0000000..2e0bd41
--- /dev/null
+++ b/hacks/config/forest.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="forest" _label="Forest">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=EEK2qbAmKWs"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="3000000" default="500000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="20" default="20"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Fractal trees.
+
+Written by Peter Baumung; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/fuzzyflakes.xml b/hacks/config/fuzzyflakes.xml
new file mode 100644
index 0000000..b59517d
--- /dev/null
+++ b/hacks/config/fuzzyflakes.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="fuzzyflakes" _label="FuzzyFlakes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=NrGe3xcqAns"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="1" high="50" default="10"/>
+
+ <number id="layers" type="slider" arg="-layers %"
+ _label="Layers" _low-label="Few" _high-label="Many"
+ low="1" high="10" default="3"/>
+
+ <hgroup>
+ <boolean id="rc" _label="Random colors" arg-set="-random-colors"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <select id="color">
+ <option id="lred" _label="Red" arg-set="-color #FF0000"/>
+ <option id="pink" _label="Pink"/>
+ <option id="lyellow" _label="Yellow" arg-set="-color #FFFF00"/>
+ <option id="lgreen" _label="Green" arg-set="-color #00FF00"/>
+ <option id="lcyan" _label="Cyan" arg-set="-color #00FFFF"/>
+ <option id="lblue" _label="Blue" arg-set="-color #0000FF"/>
+ <option id="lmagenta" _label="Magenta" arg-set="-color #FF00FF"/>
+ </select>
+
+ </vgroup>
+ <vgroup>
+ <number id="arms" type="slider" arg="-arms %"
+ _label="Arms" _low-label="Few" _high-label="Many"
+ low="1" high="10" default="5"/>
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Thickness" _low-label="Thin" _high-label="Thick"
+ low="1" high="50" default="10"/>
+ <number id="bthickness" type="slider" arg="-bthickness %"
+ _label="Border thickness" _low-label="Thin" _high-label="Thick"
+ low="0" high="50" default="3"/>
+ <number id="radius" type="slider" arg="-radius %"
+ _label="Radius" _low-label="Small" _high-label="Large"
+ low="1" high="100" default="20"/>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Falling colored snowflake/flower shapes.
+
+https://en.wikipedia.org/wiki/Snowflake
+
+Written by Barry Dmytro; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/galaxy.xml b/hacks/config/galaxy.xml
new file mode 100644
index 0000000..b12d62f
--- /dev/null
+++ b/hacks/config/galaxy.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="galaxy" _label="Galaxy">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=xBprAm9w-Fo"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Count" low="-20" high="20" default="-5"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="10" high="1000" default="250"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="10" high="255" default="64"/>
+
+ <boolean id="spin" _label="Rotate viewpoint" arg-unset="-no-spin"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Spinning galaxies collide.
+
+Written by Uli Siegmund, Harald Backert, and Hubert Feyrer; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/gears.xml b/hacks/config/gears.xml
new file mode 100644
index 0000000..957fbdb
--- /dev/null
+++ b/hacks/config/gears.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="gears" _label="Gears" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=OHamiC1tcdg"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="5.0" default="1.0"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Gear count" _low-label="0" _high-label="20"
+ low="0" high="20" default="0"/>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Interlocking gears. See also the "Pinion" and "MoebiusGears" screen savers.
+
+https://en.wikipedia.org/wiki/Involute_gear
+https://en.wikipedia.org/wiki/Epicyclic_gearing
+
+Written by Jamie Zawinski; 2007.
+ </_description>
+</screensaver>
diff --git a/hacks/config/geodesic.xml b/hacks/config/geodesic.xml
new file mode 100644
index 0000000..0bc52ff
--- /dev/null
+++ b/hacks/config/geodesic.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="geodesic" _label="Geodesic" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=qulzooBLIcU"/>
+
+ <hgroup>
+ <vgroup>
+ <select id="object">
+ <option id="mesh" _label="Mesh faces"/>
+ <option id="solid" _label="Solid faces" arg-set="-mode solid"/>
+ <option id="stellated" _label="Stellated faces" arg-set="-mode stellated"/>
+ <option id="stellated2" _label="Inverse Stellated" arg-set="-mode stellated2"/>
+ <option id="wire" _label="Wireframe" arg-set="-mode wire"/>
+ <option id="random" _label="Random face style" arg-set="-mode random"/>
+ </select>
+
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </vgroup>
+
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Animation speed" _low-label="Slow" _high-label="Fast"
+ low="0.05" high="10.0" default="1.0"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Depth" _low-label="1" _high-label="8"
+ low="1" high="8" default="4"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A mesh geodesic sphere of increasing and decreasing complexity.
+
+A geodesic sphere is an icosohedron whose equilateral faces are
+sub-divided into non-equilateral triangles to more closely approximate
+a sphere.
+
+The animation shows the equilateral triangles subdivided into four
+coplanar equilateral triangles; and then inflated outward, causing the
+sub-triangles to no longer be equilateral, but to more closely
+approximate the surface of a sphere.
+
+https://en.wikipedia.org/wiki/Geodesic_dome
+https://en.wikipedia.org/wiki/Buckminster_Fuller
+
+Written by Jamie Zawinski; 2013.
+ </_description>
+</screensaver>
diff --git a/hacks/config/geodesicgears.xml b/hacks/config/geodesicgears.xml
new file mode 100644
index 0000000..813268a
--- /dev/null
+++ b/hacks/config/geodesicgears.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="geodesicgears" _label="GeodesicGears" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=gd_nTnJQ4Ps"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="timeout" type="slider" arg="-timeout %"
+ _label="Duration" _low-label="5 seconds" _high-label="2 minutes"
+ low="5" high="120" default="20"/>
+
+ <hgroup>
+ <boolean id="labels" _label="Describe gears" arg-set="-labels"/>
+ <boolean id="numbers" _label="Number gears" arg-set="-numbers"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A set of meshed gears arranged on the surface of a sphere.
+
+https://en.wikipedia.org/wiki/Geodesic_dome
+https://en.wikipedia.org/wiki/Involute_gear
+https://en.wikipedia.org/wiki/Buckminster_Fuller
+
+Written by Jamie Zawinski; 2014.
+ </_description>
+</screensaver>
diff --git a/hacks/config/gflux.xml b/hacks/config/gflux.xml
new file mode 100644
index 0000000..baced13
--- /dev/null
+++ b/hacks/config/gflux.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="gflux" _label="GFlux" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=vbRFlKH-LpA"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="wave" type="slider" arg="-speed %"
+ _label="Wave speed" _low-label="Slow" _high-label="Fast"
+ low="0" high="0.50" default="0.05"
+ convert="invert"/>
+ </vgroup>
+ <vgroup>
+ <number id="squares" type="slider" arg="-squares %"
+ _label="Mesh density" _low-label="Sparse" _high-label="Dense"
+ low="2" high="40" default="19"/>
+
+ <number id="waves" type="slider" arg="-waves %"
+ _label="Waves" _low-label="1" _high-label="10"
+ low="1" high="10" default="3"/>
+ </vgroup>
+ </hgroup>
+
+ <select id="mode">
+ <option id="wire" _label="Wire mesh" arg-set="-mode wire"/>
+ <option id="solid" _label="Flat lighting" arg-set="-mode solid"/>
+ <option id="light" _label="Directional lighting" arg-set="-mode light"/>
+ <option id="checker" _label="Checkerboard" arg-set="-mode checker"/>
+ <option id="grab" _label="Picture" />
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <!-- #### -resolution [4] -->
+ <!-- #### -flat [0] -->
+ <!-- #### -rotationx [0.01] -->
+ <!-- #### -rotationy [0.0] -->
+ <!-- #### -rotationz [0.1] -->
+ <!-- #### -waveChange [50] -->
+ <!-- #### -waveHeight [1.0] -->
+ <!-- #### -waveFreq [3.0] -->
+ <!-- #### -zoom [1.0] -->
+
+ <xscreensaver-image />
+
+ <xscreensaver-updater />
+
+ <_description>
+Undulating waves on a rotating grid.
+
+Written by Josiah Pease; 2000.
+ </_description>
+</screensaver>
diff --git a/hacks/config/glblur.xml b/hacks/config/glblur.xml
new file mode 100644
index 0000000..ffa953d
--- /dev/null
+++ b/hacks/config/glblur.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glblur" _label="GLBlur" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=wUWwQXRp8lE"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="blursize" type="slider" arg="-blursize %"
+ _label="Blur smoothness" _low-label="Sparse" _high-label="Dense"
+ low="1" high="100" default="15"/>
+
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+
+ <select id="rotation">
+ <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
+ <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
+ <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
+ <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
+ <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
+ <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
+ <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
+ <option id="xyz" _label="Rotate around all three axes"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Flowing field effects from the vapor trails around a moving object.
+
+This is done by rendering the scene into a small texture, then
+repeatedly rendering increasingly-enlarged and increasingly-transparent
+versions of that texture onto the frame buffer. As such, it's quite
+GPU-intensive: if you don't have a very good graphics card, it
+will hurt your machine bad.
+
+Written by Jamie Zawinski; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/glcells.xml b/hacks/config/glcells.xml
new file mode 100644
index 0000000..da86fe6
--- /dev/null
+++ b/hacks/config/glcells.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glcells" _label="GLCells" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=94ac7nEQyBI"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+ <number id="pause" type="slider" arg="-pause %"
+ _label="Linger" _low-label="Short" _high-label="Long"
+ low="0" high="400" default="50"/>
+ <number id="maxcells" type="slider" arg="-maxcells %"
+ _label="Max cells" _low-label="Few" _high-label="Many"
+ low="50" high="5000" default="800"/>
+ <number id="radius" type="slider" arg="-radius %"
+ _label="Cell radius" _low-label="Small" _high-label="Huge"
+ low="5" high="80" default="40"/>
+ <select id="quality">
+ <option id="q0" _label="Lowest sphere detail" arg-set="-quality 0"/>
+ <option id="q1" _label="Medium sphere detail" arg-set="-quality 1"/>
+ <option id="q2" _label="Normal sphere detail" arg-set="-quality 2"/>
+ <option id="q3" _label="More sphere detail"/>
+ <option id="q4" _label="Highest sphere detail" arg-set="-quality 4"/>
+ </select>
+ </vgroup>
+ <vgroup>
+ <number id="minfood" type="slider" arg="-minfood %"
+ _label="Min food" _low-label="Starve" _high-label="Gorge"
+ low="0" high="100" default="5"/>
+ <number id="maxfood" type="slider" arg="-maxfood %"
+ _label="Max food" _low-label="Starve" _high-label="Gorge"
+ low="10" high="100" default="20"/>
+ <number id="divideage" type="slider" arg="-divideage %"
+ _label="Cell division" _low-label="Quick" _high-label="Slow"
+ low="1" high="100" default="20"/>
+ <number id="mindist" type="slider" arg="-mindist %"
+ _label="Min distance" _low-label="Small" _high-label="Large"
+ low="1.0" high="3.0" default="1.4"/>
+ <number id="seeds" type="slider" arg="-seeds %"
+ _label="Seeds" _low-label="1" _high-label="15"
+ low="1" high="15" default="1"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="keepold" _label="Keep dead cells" arg-set="-keepold"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ <boolean id="wireframe" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Cells growing, dividing and dying on your screen. Microscopic pathos.
+
+Written by Matthias Toussaint; 2007.
+ </_description>
+</screensaver>
diff --git a/hacks/config/gleidescope.xml b/hacks/config/gleidescope.xml
new file mode 100644
index 0000000..b75bc11
--- /dev/null
+++ b/hacks/config/gleidescope.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="gleidescope" _label="Gleidescope" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=q6F-CDX6-tU"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="size" _label="Size of tube" arg="-size %"
+ type="slider" _low-label="Small" _high-label="Large"
+ low="0" high="10" default="0" />
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Image duration"
+ _low-label="10 seconds" _high-label="5 minutes"
+ low="10" high="300" default="30"/>
+
+ <hgroup>
+ <boolean id="move" _label="Move" arg-unset="-no-move"/>
+ <boolean id="rotate" _label="Rotate" arg-unset="-no-rotate"/>
+ <boolean id="zoom" _label="Zoom" arg-set="-zoom"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-image />
+
+ <xscreensaver-updater />
+
+ <_description>
+A kaleidoscope that operates on a loaded image.
+
+https://en.wikipedia.org/wiki/Kaleidoscope
+
+Written by Andrew Dean; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/glforestfire.xml b/hacks/config/glforestfire.xml
new file mode 100644
index 0000000..08f882c
--- /dev/null
+++ b/hacks/config/glforestfire.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glforestfire" _label="GLForestFire" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=_0Ff3qHUfsA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="Rain" _high-label="Huge fire"
+ low="0" high="8000" default="800"/>
+
+ <number id="trees" type="slider" arg="-trees %"
+ _label="Number of trees" _low-label="Desert" _high-label="Forest"
+ low="0" high="20" default="5"/>
+
+ <hgroup>
+ <vgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="tex" _label="Textures" arg-unset="-no-texture"/>
+ <boolean id="shadow" _label="Shadows" arg-unset="-no-shadows"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="fog" _label="Fog" arg-set="-fog"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Draws an animation of sprinkling fire-like 3D triangles in a landscape
+filled with trees.
+
+Written by Eric Lassauge; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/glhanoi.xml b/hacks/config/glhanoi.xml
new file mode 100644
index 0000000..6d9aec2
--- /dev/null
+++ b/hacks/config/glhanoi.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glhanoi" _label="GLHanoi" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=1qRCviRmsTY"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="15000" convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of disks" _low-label="0" _high-label="31"
+ default="0" low="0" high="31"/>
+
+ <number id="poles" type="slider" arg="-poles %"
+ _label="Number of poles" _low-label="0" _high-label="31"
+ default="0" low="3" high="31"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed (of smallest disks)" _low-label="1" _high-label="20"
+ default="1" low="1" high="20"/>
+
+ <number id="trails" type="slider" arg="-trails %"
+ _label="Length of disk trails" _low-label="0" _high-label="10"
+ default="2" low="0" high="10"/>
+
+ <boolean id="fog" _label="Enable fog" arg-set="-fog"/>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <boolean id="lighting" _label="Enable lighting" arg-unset="-no-light"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Solves the Towers of Hanoi puzzle. Move N disks from one pole to
+another, one disk at a time, with no disk ever resting on a disk
+smaller than itself.
+
+https://en.wikipedia.org/wiki/Tower_of_Hanoi
+
+Written by Dave Atkinson; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/glitchpeg.xml b/hacks/config/glitchpeg.xml
new file mode 100644
index 0000000..f53777c
--- /dev/null
+++ b/hacks/config/glitchpeg.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glitchpeg" _label="GlitchPEG">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Xl5vKJ65_xM"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="1 second" _high-label="10 minutes"
+ low="1" high="600" default="120"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Glitchiness" _low-label="Low" _high-label="High"
+ low="1" high="1024" default="100"/>
+
+ </vgroup>
+
+ <vgroup>
+ <xscreensaver-image />
+ <xscreensaver-updater />
+ </vgroup>
+ </hgroup>
+
+ <_description>
+Loads an image, corrupts it, and then displays the corrupted version,
+several times a second. After a while, finds a new image to corrupt.
+
+Written by Jamie Zawinski; 2018.
+ </_description>
+</screensaver>
diff --git a/hacks/config/glknots.xml b/hacks/config/glknots.xml
new file mode 100644
index 0000000..afdd296
--- /dev/null
+++ b/hacks/config/glknots.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glknots" _label="GLKnots" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=ILiYNkeEb_k"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="5.0" default="1.0"/>
+
+ <select id="rotation">
+ <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
+ <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
+ <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
+ <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
+ <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
+ <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
+ <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
+ <option id="xyz" _label="Rotate around all three axes"/>
+ </select>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="segments" type="slider" arg="-segments %"
+ _label="Resolution" _low-label="Segmented" _high-label="Smooth"
+ low="100" high="2000" default="800"/>
+
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Thickness" _low-label="Thin" _high-label="Thick"
+ low="0.05" high="1.0" default="0.3"/>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Generates some twisting 3d knot patterns. Spins 'em around.
+
+https://en.wikipedia.org/wiki/Knot_theory
+
+Written by Jamie Zawinski; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/glmatrix.xml b/hacks/config/glmatrix.xml
new file mode 100644
index 0000000..18293da
--- /dev/null
+++ b/hacks/config/glmatrix.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glmatrix" _label="GLMatrix" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=_dktSpsaCPg"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="density" type="slider" arg="-density %"
+ _label="Glyph density" _low-label="Sparse" _high-label="Dense"
+ low="0" high="100" default="20"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Glyph speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="8.0" default="1.0"/>
+
+ <select id="mode">
+ <option id="matrix" _label="Matrix encoding"/>
+ <option id="binary" _label="Binary encoding" arg-set="-mode binary"/>
+ <option id="hex" _label="Hexadecimal encoding" arg-set="-mode hex"/>
+ <option id="dna" _label="Genetic encoding" arg-set="-mode dna"/>
+ </select>
+
+ <hgroup>
+ <boolean id="fog" _label="Fog" arg-unset="-no-fog"/>
+ <boolean id="waves" _label="Waves" arg-unset="-no-waves"/>
+ <boolean id="rotate" _label="Panning" arg-unset="-no-rotate"/>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="tex" _label="Textured" arg-unset="-no-texture"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The 3D "digital rain" effect, as seen in the title sequence of "The Matrix".
+
+See also "xmatrix" for a 2D rendering of the similar effect that
+appeared on the computer monitors actually *in* the movie.
+
+https://en.wikipedia.org/wiki/Matrix_digital_rain
+
+Written by Jamie Zawinski; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/glplanet.xml b/hacks/config/glplanet.xml
new file mode 100644
index 0000000..5714b7a
--- /dev/null
+++ b/hacks/config/glplanet.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glplanet" _label="GLPlanet" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=ohcJ1bVkLZ4"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <!-- #### -no-texture -->
+
+ <file id="image" _label="Day image" arg="-image %" />
+ <file id="image2" _label="Night image" arg="-image2 %" />
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="rotate" _label="Rotate" arg-unset="-no-rotate"/>
+ <boolean id="roll" _label="Roll" arg-unset="-no-roll"/>
+ <boolean id="stars" _label="Stars" arg-unset="-no-stars"/>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The Earth, bouncing around in space, rendered with satellite imagery
+of the planet in both sunlight and darkness.
+
+If you would like it to display a different planet, any pair of
+Equirectangular-projected maps will work. The maps that come with
+"ssystem" work well.
+
+Written by David Konerding and Jamie Zawinski; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/glschool.xml b/hacks/config/glschool.xml
new file mode 100644
index 0000000..a79ce12
--- /dev/null
+++ b/hacks/config/glschool.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glschool" _label="GLSchool" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=SuMIatcSPdU"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000" convert="invert"/>
+
+ <number id="NFish" type="slider" arg="-nfish %"
+ _label="Fish count" _low-label="Few" _high-label="Lots"
+ low="5" high="500" default="100"/>
+
+ <number id="AvoidFact" type="slider" arg="-avoidfact %" _label="Avoidance" _low-label="None" _high-label="High" low="0" high="10" default="1.5"/>
+ </vgroup>
+ <vgroup>
+ <number id="MatchFact" type="slider" arg="-matchfact %" _label="Velocity matching" _low-label="None" _high-label="High" low="0" high="3" default="0.15"/>
+ <number id="CenterFact" type="slider" arg="-centerfact %" _label="Centering" _low-label="None" _high-label="High" low="0" high="1.0" default="0.1"/>
+ <number id="TargetFact" type="slider" arg="-targetfact %" _label="Goal following" _low-label="None" _high-label="High" low="0" high="400" default="80"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="fog" _label="Fog" arg-set="-fog"/>
+ <boolean id="drawgoal" _label="Draw goal" arg-set="-drawgoal"/>
+ <boolean id="drawbbox" _label="Draw bounding box" arg-unset="-no-drawbbox"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A school of fish, using the classic "Boids" algorithm by Craig Reynolds.
+
+https://en.wikipedia.org/wiki/Boids
+
+Written by David C. Lambert and Jamie Zawinski; 2006.
+ </_description>
+</screensaver>
diff --git a/hacks/config/glslideshow.xml b/hacks/config/glslideshow.xml
new file mode 100644
index 0000000..c92a6de
--- /dev/null
+++ b/hacks/config/glslideshow.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glslideshow" _label="GLSlideshow" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Hi0xUWnqBhQ"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Time until loading a new image"
+ _low-label="10 seconds" _high-label="5 minutes"
+ low="10" high="300" default="30"/>
+
+ <number id="zoom" type="slider" arg="-zoom %"
+ _label="Always show at least this much of the image"
+ _low-label="50%" _high-label="100%"
+ low="50" high="100" default="75"/>
+
+ <number id="pan" type="slider" arg="-pan %"
+ _label="Pan/zoom duration"
+ _low-label="1 second" _high-label="30 seconds"
+ low="1" high="30" default="6"/>
+
+ <number id="fade" type="slider" arg="-fade %"
+ _label="Crossfade duration"
+ _low-label="None" _high-label="30 seconds"
+ low="0" high="30" default="2"/>
+ </vgroup>
+ <vgroup>
+
+ <boolean id="letterbox" _label="Letterbox" arg-unset="-no-letterbox"/>
+ <boolean id="titles" _label="Show file names" arg-set="-titles"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-image />
+
+ <xscreensaver-updater />
+
+ </vgroup>
+ </hgroup>
+
+ <_description>
+Loads a random sequence of images and smoothly scans and zooms around
+in each, fading from pan to pan.
+
+Written by Jamie Zawinski and Mike Oliphant; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/glsnake.xml b/hacks/config/glsnake.xml
new file mode 100644
index 0000000..d73663d
--- /dev/null
+++ b/hacks/config/glsnake.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="glsnake" _label="GLSnake" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=AIqz-G0n1JU"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-statictime %"
+ _label="Duration" _low-label="1" _high-label="30 seconds"
+ low="1000" high="30000" default="5000"/>
+
+ <number id="packing" type="slider" arg="-explode %"
+ _label="Packing" _low-label="Tight" _high-label="Loose"
+ low="0.0" high="0.5" default="0.03"/>
+ </vgroup>
+ <vgroup>
+
+ <number id="angvel" type="slider" arg="-angvel %"
+ _label="Angular velocity" _low-label="Slow" _high-label="Fast"
+ low="0.05" high="5.0" default="1.0"/>
+ <number id="yangvel" type="slider" arg="-yangvel %"
+ _label="Y angular velocity" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="1.0" default="0.10"/>
+
+ <number id="zangvel" type="slider" arg="-zangvel %"
+ _label="Z angular velocity" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="1.0" default="0.14"/>
+
+ </vgroup>
+ </hgroup>
+
+
+ <hgroup>
+ <boolean id="labels" _label="Show titles" arg-set="-titles"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The "Rubik's Snake" puzzle. See also the "Rubik" and "Cube21" screen savers.
+
+https://en.wikipedia.org/wiki/Rubik%27s_Snake
+
+Written by Jamie Wilkinson, Andrew Bennetts, and Peter Aylett; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/gltext.xml b/hacks/config/gltext.xml
new file mode 100644
index 0000000..99ec92f
--- /dev/null
+++ b/hacks/config/gltext.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="gltext" _label="GLText" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=jrXa-QtY6MU"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <select id="text">
+ <option id="uname" _label="Display system information" />
+ <option id="clock" _label="Display date and time"
+ arg-set="-text '%A%n%d %b %Y%n%r'"/>
+ </select>
+
+ <hgroup>
+ <select id="facing">
+ <option id="front" _label="Always face front"/>
+ <option id="nofront" _label="Spin all the way around" arg-set="-no-front"/>
+ </select>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ </hgroup>
+
+ <select id="rotation">
+ <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
+ <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
+ <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
+ <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
+ <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
+ <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
+ <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
+ <option id="xyz" _label="Rotate around all three axes"/>
+ </select>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Displays a few lines of text spinning around in a solid 3D font.
+The text can use strftime() escape codes to display the current
+date and time.
+
+Written by Jamie Zawinski; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/goop.xml b/hacks/config/goop.xml
new file mode 100644
index 0000000..53222f8
--- /dev/null
+++ b/hacks/config/goop.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="goop" _label="Goop">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=bLMAF4Q-mGA"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="12000"
+ convert="invert"/>
+
+ <number id="torque" type="slider" arg="-torque %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.0002" high="0.0500" default="0.0075"/>
+
+ <number id="count" type="slider" arg="-planes %"
+ _label="Blobs" _low-label="Few" _high-label="Many"
+ low="1" high="50" default="12"/>
+
+ </vgroup>
+ <vgroup>
+ <number id="elasticity" type="slider" arg="-elasticity %"
+ _label="Elasticity" _low-label="Low" _high-label="High"
+ low="0.1" high="5.0" default="0.9"/>
+
+ <number id="maxv" type="slider" arg="-max-velocity %"
+ _label="Speed limit" _low-label="Low" _high-label="High"
+ low="0.1" high="3.0" default="0.5"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <select id="mode">
+ <option id="transparent" _label="Transparent blobs"/>
+ <option id="opaque" _label="Opaque blobs" arg-set="-mode opaque"/>
+ <option id="xor" _label="XOR blobs" arg-set="-mode xor"/>
+ </select>
+
+ <select id="color-mode">
+ <option id="additive" _label="Additive colors (transmitted light)"/>
+ <option id="subtractive" _label="Subtractive colors (reflected light)"
+ arg-set="-subtractive"/>
+ </select>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Amoeba-like blobs change shape as they wander around the screen.
+They are translucent, so you can see the lower blobs through the
+higher ones, and when one passes over another, their colors merge. I
+got the idea for this from a mouse pad I had once, which achieved the
+same kind of effect in real life by having several layers of plastic
+with colored oil between them.
+
+Written by Jamie Zawinski; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/grav.xml b/hacks/config/grav.xml
new file mode 100644
index 0000000..807f37d
--- /dev/null
+++ b/hacks/config/grav.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="grav" _label="Grav">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=spQRFDmDMeg"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of objects" _low-label="Few" _high-label="Many"
+ low="1" high="40" default="12"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <hgroup>
+ <boolean id="decay" _label="Orbital decay" arg-unset="-no-decay"/>
+ <boolean id="trail" _label="Object trails" arg-unset="-no-trail"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+An orbital simulation. With trails enabled, it looks kind of like a
+cloud-chamber photograph.
+
+Written by Greg Bowering; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/greynetic.xml b/hacks/config/greynetic.xml
new file mode 100644
index 0000000..cbc11a9
--- /dev/null
+++ b/hacks/config/greynetic.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="greynetic" _label="Greynetic">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=lVEi089s1_c"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="250000" default="10000"
+ convert="invert"/>
+
+ <boolean id="grey" _label="Grey" arg-set="-grey"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Colored, stippled and transparent rectangles.
+
+Written by Jamie Zawinski; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/halftone.xml b/hacks/config/halftone.xml
new file mode 100644
index 0000000..be65660
--- /dev/null
+++ b/hacks/config/halftone.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="halftone" _label="Halftone">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=K2lqgBPde4o"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000" convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Gravity points" _low-label="Few" _high-label="Many"
+ low="1" high="50" default="10"/>
+
+ <number id="size" type="slider" arg="-spacing %"
+ _label="Dot size" _low-label="Small" _high-label="Big"
+ low="2" high="50" default="14"/>
+
+ <number id="dotfill" type="slider" arg="-sizefactor %"
+ _label="Dot fill factor" _low-label="Small" _high-label="Large"
+ low="0.1" high="3" default="1.5"/>
+ </vgroup>
+ <vgroup>
+ <number id="minspeed" type="slider" arg="-minspeed %"
+ _label="Minimum speed" _low-label="Low" _high-label="High"
+ low="0.001" high="0.09" default="0.001"/>
+
+ <number id="maxspeed" type="slider" arg="-maxspeed %"
+ _label="Maximum speed" _low-label="Low" _high-label="High"
+ low="0.001" high="0.09" default="0.02"/>
+
+ <number id="minmass" type="slider" arg="-minmass %"
+ _label="Minimum mass" _low-label="Small" _high-label="Large"
+ low="0.001" high="0.09" default="0.001"/>
+
+ <number id="maxmass" type="slider" arg="-maxmass %"
+ _label="Maximum mass" _low-label="Small" _high-label="Large"
+ low="0.001" high="0.09" default="0.02"/>
+ </vgroup>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A halftone dot pattern in motion.
+
+Draws the gravity force in each point on the screen seen through a
+halftone dot pattern. The gravity force is calculated from a set of
+moving mass points. View it from a distance for best effect.
+
+https://en.wikipedia.org/wiki/Halftone
+
+Written by Peter Jaric; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/halo.xml b/hacks/config/halo.xml
new file mode 100644
index 0000000..ef947e2
--- /dev/null
+++ b/hacks/config/halo.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="halo" _label="Halo">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=K7LbfXh3LTc"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="200000" default="100000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of circles" _low-label="Few" _high-label="Many"
+ low="0" high="20" default="0"/>
+
+ <number id="ncolors" type="slider" arg="-colors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="100"/>
+
+ <select id="mode">
+ <option id="random" _label="Random mode"/>
+ <option id="seuss" _label="Seuss mode" arg-set="-mode seuss"/>
+ <option id="ramp" _label="Ramp mode" arg-set="-mode ramp"/>
+ </select>
+
+ <hgroup>
+ <boolean id="animate" _label="Animate circles" arg-set="-animate"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Circular interference patterns.
+
+https://en.wikipedia.org/wiki/Moire_pattern
+
+Written by Jamie Zawinski; 1993.
+ </_description>
+</screensaver>
diff --git a/hacks/config/helix.xml b/hacks/config/helix.xml
new file mode 100644
index 0000000..00d4525
--- /dev/null
+++ b/hacks/config/helix.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="helix" _label="Helix">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=H-mMnadnPSs"/>
+
+ <number id="delay" type="slider" arg="-subdelay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Linger" _low-label="1 second" _high-label="1 minute"
+ low="1" high="60" default="5"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Spirally string-art-ish patterns.
+
+Written by Jamie Zawinski; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/hexadrop.xml b/hacks/config/hexadrop.xml
new file mode 100644
index 0000000..8f8baef
--- /dev/null
+++ b/hacks/config/hexadrop.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="hexadrop" _label="Hexadrop">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=HMPVzQUGW-Q"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="50000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="4.0" default="1.0"/>
+
+ <number id="size" type="slider" arg="-size %"
+ _label="Tile size" _low-label="Small" _high-label="Large"
+ low="5" high="50" default="15"
+ convert="invert"/>
+ </vgroup>
+
+ <vgroup>
+ <select id="sides">
+ <option id="0" _label="Random shape"/>
+ <option id="3" _label="Triangles" arg-set="-sides 3"/>
+ <option id="4" _label="Squares" arg-set="-sides 4"/>
+ <option id="6" _label="Hexagons" arg-set="-sides 6"/>
+ <option id="5" _label="Octagons" arg-set="-sides 8"/>
+ </select>
+
+ <select id="uniform">
+ <option id="r-uniform" _label="Random speed"/>
+ <option id="uniform" _label="Uniform speed" arg-set="-uniform-speed"/>
+ <option id="no-uniform" _label="Non-uniform speed" arg-set="-no-uniform-speed"/>
+ </select>
+
+ <select id="lockstep">
+ <option id="r-lockstep" _label="Random sync"/>
+ <option id="lockstep" _label="Synchronized" arg-set="-lockstep"/>
+ <option id="no-lockstep" _label="Non-synchronized" arg-set="-no-lockstep"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A grid of hexagons or other shapes, with tiles dropping out.
+
+https://en.wikipedia.org/wiki/Tiling_by_regular_polygons
+
+Written by Jamie Zawinski; 2013.
+ </_description>
+</screensaver>
diff --git a/hacks/config/hexstrut.xml b/hacks/config/hexstrut.xml
new file mode 100644
index 0000000..0823dc8
--- /dev/null
+++ b/hacks/config/hexstrut.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="hexstrut" _label="Hexstrut" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=iOCffj3ZmgE"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="5" default="1.0"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="count" type="slider" arg="-count %"
+ _label="Hexagon Size" _low-label="Small" _high-label="Large"
+ low="2" high="80" default="20"
+ convert="invert"/>
+
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Line Thickness" _low-label="Thin" _high-label="Thick"
+ low="0.01" high="1.7" default="0.2"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A grid of hexagons composed of rotating Y-shaped struts.
+Waves of rotation and color changes randomly propagate across the plane.
+
+Written by Jamie Zawinski; 2016.
+ </_description>
+</screensaver>
diff --git a/hacks/config/hilbert.xml b/hacks/config/hilbert.xml
new file mode 100644
index 0000000..7f44aed
--- /dev/null
+++ b/hacks/config/hilbert.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="hilbert" _label="Hilbert" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=NhKmipo_Ek4"/>
+
+ <hgroup>
+ <vgroup>
+
+ <hgroup>
+ <select id="twodee">
+ <option id="random" _label="2D or 3D"/>
+ <option id="2D" _label="2D" arg-set="-mode 2d"/>
+ <option id="3D" _label="3D" arg-set="-mode 3d"/>
+ </select>
+
+ <select id="closed">
+ <option id="random" _label="Open or closed paths"/>
+ <option id="closed" _label="Closed" arg-set="-ends closed"/>
+ <option id="open" _label="Open" arg-set="-ends open"/>
+ </select>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Slow" _high-label="Fast"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.02" high="10.0" default="1.0"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="depth" type="slider" arg="-max-depth %"
+ _label="Recursion levels" _low-label="2" _high-label="10"
+ low="2" high="10" default="5"/>
+
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Line thickness" _low-label="Thin" _high-label="Thick"
+ low="0.01" high="1.0" default="0.25"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-set="-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The recursive Hilbert space-filling curve, both 2D and 3D variants.
+It incrementally animates the growth and recursion to the maximum
+depth, then unwinds it back.
+
+The Hilbert path is a single contiguous line that can fill a volume
+without crossing itself. As a data structure, Hilbert paths are
+useful because ordering along the curve preserves locality: points
+that are close together along the curve are also close together in space.
+The converse is often, but not always, true. The coloration
+reflects this.
+
+https://en.wikipedia.org/wiki/Hilbert_curve
+
+Written by Jamie Zawinski; 2011.
+ </_description>
+</screensaver>
diff --git a/hacks/config/hopalong.xml b/hacks/config/hopalong.xml
new file mode 100644
index 0000000..c3c5aad
--- /dev/null
+++ b/hacks/config/hopalong.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="hopalong" _label="Hopalong">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Ck0pKMflau0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Duration" _low-label="Small" _high-label="Large"
+ low="0" high="800000" default="2500"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="count" type="slider" arg="-count %"
+ _label="Color contrast" _low-label="Low" _high-label="High"
+ low="100" high="10000" default="1000"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="200"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <boolean id="sine" _label="Sine" arg-set="-sine"/>
+ <boolean id="martin" _label="Martin" arg-set="-martin"/>
+ <boolean id="popcorn" _label="Popcorn" arg-set="-popcorn"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="jong" _label="Jong" arg-set="-jong"/>
+ <boolean id="rr" _label="RR" arg-set="-rr"/>
+ <boolean id="ejk1" _label="EJK1" arg-set="-ejk1"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="ejk2" _label="EJK2" arg-set="-ejk2"/>
+ <boolean id="ejk3" _label="EJK3" arg-set="-ejk3"/>
+ <boolean id="ejk4" _label="EJK4" arg-set="-ejk4"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="ejk5" _label="EJK5" arg-set="-ejk5"/>
+ <boolean id="ejk6" _label="EJK6" arg-set="-ejk6"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Lacy fractal patterns based on iteration in the imaginary
+plane, from a 1986 Scientific American article. See also the
+"Discrete" screen saver.
+
+Written by Patrick Naughton; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/hydrostat.xml b/hacks/config/hydrostat.xml
new file mode 100644
index 0000000..b8b8bbe
--- /dev/null
+++ b/hacks/config/hydrostat.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="hydrostat" _label="Hydrostat" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=nn-nA18hFt0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Animation speed" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="4.0" default="1.0"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of squid" _low-label="One" _high-label="Many"
+ low="1" high="100" default="3" />
+
+ <number id="head_radius" type="slider" arg="-head-radius %"
+ _label="Head size" _low-label="Small" _high-label="Large"
+ low="10" high="100" default="60" />
+
+ <number id="tentacles" type="slider" arg="-tentacles %"
+ _label="Number of tentacles" _low-label="Few" _high-label="Many"
+ low="3" high="100" default="35" />
+
+ </vgroup>
+ <vgroup>
+
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Thickness" _low-label="Thin" _high-label="Thick"
+ low="3" high="40" default="18" />
+
+ <number id="length" type="slider" arg="-length %"
+ _label="Length of tentacles" _low-label="Short" _high-label="Long"
+ low="10" high="150" default="55" />
+
+ <number id="gravity" type="slider" arg="-gravity %"
+ _label="Gravity" _low-label="Weak" _high-label="Strong"
+ low="0" high="10.0" default="0.5" />
+
+ <number id="current" type="slider" arg="-current %"
+ _label="Current" _low-label="Weak" _high-label="Strong"
+ low="0.0" high="10.0" default="0.25" />
+
+ <number id="friction" type="slider" arg="-friction %"
+ _label="Viscosity" _low-label="Low" _high-label="High"
+ low="0.0" high="0.1" default="0.02" />
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="pulse" _label="Pulse" arg-unset="-no-pulse" />
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ <xscreensaver-updater />
+ </hgroup>
+
+ <_description>
+Wiggly squid or jellyfish with many tentacles.
+
+A muscular hydrostat is a biological structure used to move its host
+about, consisting of muscles with no skeletal support. It performs
+its hydraulic movement without fluid in a separate compartment, as in
+a hydrostatic skeleton.
+
+https://en.wikipedia.org/wiki/Muscular_hydrostat
+
+Written by Justin Windle and Jamie Zawinski; 2016.
+ </_description>
+</screensaver>
diff --git a/hacks/config/hyperball.xml b/hacks/config/hyperball.xml
new file mode 100644
index 0000000..8f674d2
--- /dev/null
+++ b/hacks/config/hyperball.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="hyperball" _label="HyperBall">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=BqOHgn0BQOc"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+
+ <number id="z" type="slider" arg="-observer-z %"
+ _label="Zoom" _low-label="Near" _high-label="Far"
+ low="1.125" high="10.0" default="3.0"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="xw" type="slider" arg="-xw %"
+ _label="XW rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="0"/>
+ <number id="xy" type="slider" arg="-xy %"
+ _label="XY rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="3"/>
+ <number id="xz" type="slider" arg="-xz %"
+ _label="XZ rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="5"/>
+ </vgroup>
+ <vgroup>
+ <number id="yw" type="slider" arg="-yw %"
+ _label="YW rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="10"/>
+ <number id="yz" type="slider" arg="-yz %"
+ _label="YZ rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="0"/>
+ <number id="zw" type="slider" arg="-zw %"
+ _label="ZW rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="0"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.10. It has been replaced by the more general "Polytopes"
+screen saver, which can display this object as well as others. The
+Polytopes "120-cell" object corresponds to this one.
+
+Hyperball is to hypercube as dodecahedron is to cube: this displays
+a 2D projection of the sequence of 3D objects which are the projections
+of the 4D analog to the dodecahedron. Technically, it is a "120 cell
+polytope".
+
+https://en.wikipedia.org/wiki/Hypercube
+https://en.wikipedia.org/wiki/Regular_polytope
+
+Written by Joe Keane; 2000.
+ </_description>
+</screensaver>
diff --git a/hacks/config/hypercube.xml b/hacks/config/hypercube.xml
new file mode 100644
index 0000000..f471230
--- /dev/null
+++ b/hacks/config/hypercube.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="hypercube" _label="HyperCube">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=tOLzz_D4-0E"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="z" type="slider" arg="-observer-z %"
+ _label="Zoom" _low-label="Near" _high-label="Far"
+ low="1.125" high="10.0" default="3.0"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="xw" type="slider" arg="-xw %"
+ _label="XW rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="0"/>
+ <number id="xy" type="slider" arg="-xy %"
+ _label="XY rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="3"/>
+ <number id="xz" type="slider" arg="-xz %"
+ _label="XZ rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="5"/>
+ </vgroup>
+ <vgroup>
+ <number id="yw" type="slider" arg="-yw %"
+ _label="YW rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="10"/>
+ <number id="yz" type="slider" arg="-yz %"
+ _label="YZ rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="0"/>
+ <number id="zw" type="slider" arg="-zw %"
+ _label="ZW rotation" _low-label="Slow" _high-label="Fast"
+ low="0" high="20" default="0"/>
+ </vgroup>
+ </hgroup>
+
+ <!-- #### -color0 [magenta] -->
+ <!-- #### -color1 [yellow] -->
+ <!-- #### -color2 [#FF9300] -->
+ <!-- #### -color3 [#FF0093] -->
+ <!-- #### -color4 [green] -->
+ <!-- #### -color5 [#8080FF] -->
+ <!-- #### -color6 [#00D0FF] -->
+ <!-- #### -color7 [#00FFD0] -->
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.10. It has been replaced by the more general "Polytopes"
+screen saver, which can display this object as well as others.
+
+This displays 2D projections of the sequence of 3D objects which are
+the projections of the 4D analog to the cube: as a square is composed
+of four lines, each touching two others; and a cube is composed of
+six squares, each touching four others; a hypercube is composed of
+eight cubes, each touching six others. To make it easier to
+visualize the rotation, it uses a different color for the edges of
+each face. Don't think about it too long, or your brain will melt.
+
+https://en.wikipedia.org/wiki/Hypercube
+https://en.wikipedia.org/wiki/Tesseract
+https://en.wikipedia.org/wiki/Regular_polytope
+
+Written by Joe Keane, Fritz Mueller, and Jamie Zawinski; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/hypertorus.xml b/hacks/config/hypertorus.xml
new file mode 100644
index 0000000..a82e090
--- /dev/null
+++ b/hacks/config/hypertorus.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="hypertorus" _label="Hypertorus" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=KJWe4G4Qa1Q"/>
+
+ <hgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="25000"
+ convert="invert"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <hgroup>
+ <select id="display-mode">
+ <option id="wire" _label="Wireframe"
+ arg-set="-mode wireframe"/>
+ <option id="surface" _label="Solid"/>
+ <option id="transparent" _label="Transparent"
+ arg-set="-mode transparent"/>
+ </select>
+
+ <select id="appearance">
+ <option id="solid" _label="Solid object"
+ arg-set="-appearance solid"/>
+ <option id="bands" _label="Transparent bands"/>
+ <option id="bands" _label="1 transparent spiral"
+ arg-set="-appearance spirals-1"/>
+ <option id="bands" _label="2 transparent spirals"
+ arg-set="-appearance spirals-2"/>
+ <option id="bands" _label="4 transparent spirals"
+ arg-set="-appearance spirals-4"/>
+ <option id="bands" _label="8 transparent spirals"
+ arg-set="-appearance spirals-8"/>
+ <option id="bands" _label="16 Transparent spirals"
+ arg-set="-appearance spirals-16"/>
+ </select>
+
+ <select id="colors">
+ <option id="twosided" _label="Two-sided" arg-set="-twosided"/>
+ <option id="colorwheel" _label="Color wheel"/>
+ </select>
+
+ <select id="projection3d">
+ <option id="perspective-3d" _label="Perspective 3D"/>
+ <option id="orthographic-3d" _label="Orthographic 3D"
+ arg-set="-orthographic-3d"/>
+ </select>
+
+ <select id="projection4d">
+ <option id="perspective-4d" _label="Perspective 4D"/>
+ <option id="orthographic-4d" _label="Orthographic 4D"
+ arg-set="-orthographic-4d"/>
+ </select>
+ </hgroup>
+
+ <hgroup>
+
+ <vgroup>
+
+ <number id="speed-wx" type="slider" arg="-speed-wx %"
+ _label="WX rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.1"/>
+
+ <number id="speed-wy" type="slider" arg="-speed-wy %"
+ _label="WY rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.3"/>
+
+ <number id="speed-wz" type="slider" arg="-speed-wz %"
+ _label="WZ rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.5"/>
+
+ </vgroup>
+
+ <vgroup>
+
+ <number id="speed-xy" type="slider" arg="-speed-xy %"
+ _label="XY rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.7"/>
+
+ <number id="speed-xz" type="slider" arg="-speed-xz %"
+ _label="XZ rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.9"/>
+
+ <number id="speed-yz" type="slider" arg="-speed-yz %"
+ _label="YZ rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="2.1"/>
+
+ </vgroup>
+
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A Clifford Torus: a torus lying on the "surface" of a 4D hypersphere.
+Inspired by Thomas Banchoff's book "Beyond the Third Dimension:
+Geometry, Computer Graphics, and Higher Dimensions", Scientific
+American Library, 1990.
+
+https://en.wikipedia.org/wiki/N-sphere
+https://en.wikipedia.org/wiki/Clifford_torus
+https://en.wikipedia.org/wiki/Regular_polytope
+
+Written by Carsten Steger; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/hypnowheel.xml b/hacks/config/hypnowheel.xml
new file mode 100644
index 0000000..ae8975c
--- /dev/null
+++ b/hacks/config/hypnowheel.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="hypnowheel" _label="Hypnowheel" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=QcJnc9EKJrI"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Slow" _high-label="Fast"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="20.0" default="1.0"/>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-set="-wander"/>
+ <boolean id="symmetric" _label="Symmetric twisting" arg-set="-symmetric"/>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="layers" type="slider" arg="-layers %"
+ _label="Layers" _low-label="1" _high-label="50"
+ low="1" high="50" default="4"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Arms" _low-label="2" _high-label="50"
+ low="2" high="50" default="13"/>
+
+ <number id="twistiness" type="slider" arg="-twistiness %"
+ _label="Twistiness" _low-label="Low" _high-label="High"
+ low="0.2" high="10.0" default="4.0"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A overlapping, translucent spiral patterns.
+The tightness of their spirals fluctuates in and out.
+
+https://en.wikipedia.org/wiki/Moire_pattern
+
+Written by Jamie Zawinski; 2008.
+ </_description>
+</screensaver>
diff --git a/hacks/config/ifs.xml b/hacks/config/ifs.xml
new file mode 100644
index 0000000..14999f4
--- /dev/null
+++ b/hacks/config/ifs.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="ifs" _label="IFS">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=0uOIrVFsECM"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="functions" type="slider" arg="-functions %"
+ _label="Number of functions" _low-label="2" _high-label="6"
+ low="2" high="6" default="3"/>
+
+ <number id="detail" type="slider" arg="-detail %"
+ _label="Detail" _low-label="Low" _high-label="High"
+ low="4" high="14" default="9"/>
+
+<!--
+ On a 2.93 gHz iMac i7, I get these rates with -delay 0:
+
+ detail 3: invisible
+ detail 4: barely visible
+ detail 5: 1000+ fps, looks like noise at -delay 0, ok at -delay 20000
+ detail 8: ~700+ fps
+ detail 9: ~400 fps
+ detail 10: ~300 fps
+ detail 11: ~100 fps
+ detail 12: ~50 fps
+ detail 13: ~17 fps
+ detail 14: ~8 fps
+ detail 15: ~2 fps
+
+ With the default -delay, CPU load only starts causing the frame rate
+ to drop below 30 fps detail 12 or higher.
+-->
+
+ <number id="colors" type="slider" arg="-colors %"
+ _label="Number of colors" _low-label="2" _high-label="Many"
+ low="2" high="255" default="200" />
+
+ <hgroup>
+ <boolean id="translate" _label="Translate" arg-unset="-no-translate"/>
+ <boolean id="scale" _label="Scale" arg-unset="-no-scale"/>
+ <boolean id="rotate" _label="Rotate" arg-unset="-no-rotate"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+
+Clouds of iterated function systems spin and collide.
+
+Note that the "Detail" parameter is exponential. Number of points
+drawn is functions^detail.
+
+https://en.wikipedia.org/wiki/Iterated_function_system
+
+Written by Chris Le Sueur and Robby Griffin; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/imsmap.xml b/hacks/config/imsmap.xml
new file mode 100644
index 0000000..f3d3cb2
--- /dev/null
+++ b/hacks/config/imsmap.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="imsmap" _label="IMSMap">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=FP8YJzFkdoQ"/>
+
+ <number id="delay2" type="slider" arg="-delay2 %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Linger" _low-label="1 Second" _high-label="1 Minute"
+ low="1" high="60" default="5"/>
+
+ <number id="iterations" type="slider" arg="-iterations %"
+ _label="Density" _low-label="Sparse" _high-label="Dense"
+ low="1" high="7" default="7"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="50"/>
+
+ <select id="mode">
+ <option id="random" _label="Random coloration"/>
+ <option id="h" _label="Hue gradients" arg-set="-mode h"/>
+ <option id="s" _label="Saturation gradients" arg-set="-mode s"/>
+ <option id="v" _label="Brightness gradients" arg-set="-mode v"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Cloud-like patterns. The idea is to take four points on the edge of
+the image, and assign each a random "elevation". Then find the point
+between them, and give it a value which is the average of the other
+four, plus some small random offset. Coloration is done based on
+elevation.
+
+Written by Juergen Nickelsen and Jamie Zawinski; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/interaggregate.xml b/hacks/config/interaggregate.xml
new file mode 100644
index 0000000..c1ce7f3
--- /dev/null
+++ b/hacks/config/interaggregate.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="interaggregate" _label="Interaggregate">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=wqPOZiuj4RI"/>
+
+ <number id="speed" type="slider" arg="-growth-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="18000" convert="invert"/>
+
+ <number id="init" type="slider" arg="-num-circles %"
+ _label="Number of discs" _low-label="Few" _high-label="Many"
+ low="50" high="400" default="100"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Pale pencil-like scribbles slowly fill the screen.
+
+A surface is filled with a hundred medium to small sized circles.
+Each circle has a different size and direction, but moves at the same
+slow rate. Displays the instantaneous intersections of the circles as
+well as the aggregate intersections of the circles.
+
+Though actually it doesn't look like circles at all!
+
+Written by Casey Reas, William Ngan, Robert Hodgin, and Jamie Zawinski; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/interference.xml b/hacks/config/interference.xml
new file mode 100644
index 0000000..969d10c
--- /dev/null
+++ b/hacks/config/interference.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="interference" _label="Interference">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=nEmvx4l1sHI"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="wspeed" type="slider" arg="-speed %"
+ _label="Wave speed" _low-label="Slow" _high-label="Fast"
+ low="1" high="100" default="30"/>
+
+ <number id="radius" type="slider" arg="-radius %"
+ _label="Wave size" _low-label="Small" _high-label="Large"
+ low="50" high="1500" default="800"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of waves" _low-label="Few" _high-label="Many"
+ low="0" high="20" default="3"/>
+
+ </vgroup>
+ <vgroup>
+ <number id="gridsize" type="slider" arg="-gridsize %"
+ _label="Magnification" _low-label="Low" _high-label="High"
+ low="1" high="20" default="2"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="192"/>
+
+ <number id="color_contrast" type="slider" arg="-color-shift %"
+ _label="Color contrast" _low-label="Low" _high-label="High"
+ low="0" high="100" default="60"/>
+
+ <number id="hue" type="slider" arg="-hue %"
+ _label="Hue" _low-label="0" _high-label="360"
+ low="0" high="360" default="0"/>
+ </vgroup>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Color field based on computing decaying sinusoidal waves.
+
+Written by Hannu Mallat; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/intermomentary.xml b/hacks/config/intermomentary.xml
new file mode 100644
index 0000000..6db1424
--- /dev/null
+++ b/hacks/config/intermomentary.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="intermomentary" _label="Intermomentary">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=pH-ykepPopw"/>
+
+ <number id="speed" type="slider" arg="-draw-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000" convert="invert"/>
+
+ <number id="init" type="slider" arg="-num-discs %"
+ _label="Number of discs" _low-label="50" _high-label="400"
+ low="50" high="400" default="85"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Blinking dots interact with each other circularly.
+
+A surface is filled with a hundred medium to small sized circles.
+Each circle has a different size and direction, but moves at the same
+slow rate. Displays the instantaneous intersections of the circles as
+well as the aggregate intersections of the circles.
+
+The circles begin with a radius of 1 pixel and slowly increase to some
+arbitrary size. Circles are drawn with small moving points along the
+perimeter. The intersections are rendered as glowing orbs. Glowing
+orbs are rendered only when a perimeter point moves past the
+intersection point.
+
+Written by Casey Reas, William Ngan, Robert Hodgin, and Jamie Zawinski; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/jigglypuff.xml b/hacks/config/jigglypuff.xml
new file mode 100644
index 0000000..832bbef
--- /dev/null
+++ b/hacks/config/jigglypuff.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="jigglypuff" _label="JigglyPuff" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=60vfs2WcDtE"/>
+
+ <hgroup>
+ <boolean id="random" _label="Randomize almost everything" arg-unset="-no-random"/>
+
+ <select id="color">
+ <option id="cycle" _label="Cycle" />
+ <option id="flowerbox" _label="Flower box" arg-set="-color flowerbox"/>
+ <option id="clownbarf" _label="Clown barf" arg-set="-color clownbarf"/>
+ <option id="chrome" _label="Chrome" arg-set="-color chrome"/>
+ </select>
+
+ <select id="start">
+ <option id="sphere" _label="Sphere" />
+ <option id="tetrahedron" _label="Tetrahedron" arg-set="-tetra"/>
+ </select>
+
+ <boolean id="wireframe" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Rotation speed" _low-label="Slow" _high-label="Fast"
+ low="50" high="1000" default="500"/>
+
+ <number id="damping" type="slider" arg="-damping %"
+ _label="Inertial damping" _low-label="Low" _high-label="High"
+ low="10" high="1000" default="500" convert="invert"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="hold" type="slider" arg="-hold %"
+ _label="Vertex-vertex force" _low-label="None" _high-label="Strong"
+ low="0" high="1000" default="800"/>
+
+ <number id="complexity" type="slider" arg="-complexity %"
+ _label="Complexity" _low-label="Low" _high-label="High"
+ low="1" high="3" default="2"/>
+
+ <number id="spherism" type="slider" arg="-spherism %"
+ _label="Sphere strength" _low-label="None" _high-label="Strong"
+ low="0" high="1000" default="75"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="distance" type="slider" arg="-distance %"
+ _label="Vertex-vertex behavior" _low-label="Expand"
+ _high-label="Collapse" low="0" high="1000" default="100"/>
+
+ <number id="spooky" type="slider" arg="-spooky %"
+ _label="Spookiness" _low-label="None" _high-label="Spoooooky"
+ low="0" high="12" default="0"/>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Quasi-spherical objects are distorted.
+
+You have a tetrahedron with tesselated faces. The vertices on these
+faces have forces on them: one proportional to the distance from the
+surface of a sphere; and one proportional to the distance from the
+neighbors. They also have inertia. The resulting effect can range
+from a shape that does nothing, to a frenetic polygon storm.
+Somewhere in between there it usually manifests as a blob that jiggles
+in a kind of disturbing manner.
+
+Written by Keith Macleod; 2003.
+ </_description>
+
+</screensaver>
+
+
+
+
+
+
+
+
diff --git a/hacks/config/jigsaw.xml b/hacks/config/jigsaw.xml
new file mode 100644
index 0000000..219a534
--- /dev/null
+++ b/hacks/config/jigsaw.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="jigsaw" _label="Jigsaw" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=T5_hiY2eEeo"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="8.0" default="1.0"/>
+ </vgroup>
+ <vgroup>
+ <number id="density" type="slider" arg="-complexity %"
+ _label="Puzzle pieces" _low-label="Few" _high-label="Many"
+ low="1.0" high="4.0" default="1.0"/>
+
+ <number id="resolution" type="slider" arg="-resolution %"
+ _label="Resolution" _low-label="Chunky" _high-label="Smooth"
+ low="50" high="300" default="100"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <xscreensaver-image />
+ </vgroup>
+ <vgroup>
+ <boolean id="wobble" _label="Tilt" arg-unset="-no-wobble"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Carves an image up into a jigsaw puzzle, shuffles it, and solves it.
+
+https://en.wikipedia.org/wiki/Jigsaw_puzzle
+https://en.wikipedia.org/wiki/Tessellation
+
+Written by Jamie Zawinski; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/juggle.xml b/hacks/config/juggle.xml
new file mode 100644
index 0000000..8c8c05a
--- /dev/null
+++ b/hacks/config/juggle.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="juggle" _label="Juggle">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=E3Ae7uQtWP0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="50" high="1000" default="200"
+ convert="invert"/>
+ </vgroup>
+ <vgroup>
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Performance length" _low-label="Short" _high-label="Long"
+ low="50" high="1000" default="1000"/>
+
+ <number id="tail" type="slider" arg="-tail %"
+ _label="Trail length" _low-label="None" _high-label="Long"
+ low="0" high="100" default="1"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <boolean id="balls" _label="Balls" arg-unset="-no-balls"/>
+ <boolean id="clubs" _label="Clubs" arg-unset="-no-clubs"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="rings" _label="Rings" arg-unset="-no-rings"/>
+ <boolean id="knives" _label="Knives" arg-unset="-no-knives"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="torches" _label="Flaming torches" arg-unset="-no-torches"/>
+ <boolean id="bballs" _label="Bowling balls" arg-unset="-no-bballs"/>
+ </vgroup>
+ </hgroup>
+
+ <boolean id="describe" _label="Print Cambridge juggling pattern descriptions" arg-unset="-no-describe"/>
+ <string id="pattern" _label="Juggle this pattern" arg="-pattern %" />
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.09. It has been replaced by the "Juggler3D" screen saver.
+
+Written by Tim Auckland; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/juggler3d.xml b/hacks/config/juggler3d.xml
new file mode 100644
index 0000000..0e136f2
--- /dev/null
+++ b/hacks/config/juggler3d.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="juggler3d" _label="Juggler3D" gl="yes">
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=TJkKaXBOvCA"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="50" high="1000" default="200"
+ convert="invert"/>
+ </vgroup>
+ <vgroup>
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Performance length" _low-label="Short" _high-label="Long"
+ low="50" high="1000" default="1000"/>
+
+ <number id="tail" type="slider" arg="-tail %"
+ _label="Trail length" _low-label="None" _high-label="Long"
+ low="0" high="100" default="1"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="balls" _label="Balls" arg-unset="-no-balls"/>
+ <boolean id="clubs" _label="Clubs" arg-unset="-no-clubs"/>
+ <boolean id="rings" _label="Rings" arg-unset="-no-rings"/>
+ <boolean id="knives" _label="Knives" arg-unset="-no-knives"/>
+<!--<boolean id="torches" _label="Flaming torches" arg-unset="-no-torches"/>-->
+ <boolean id="bballs" _label="Bowling balls" arg-unset="-no-bballs"/>
+ </hgroup>
+
+ <boolean id="describe" _label="Print Cambridge juggling pattern descriptions" arg-unset="-no-describe"/>
+ <string id="pattern" _label="Juggle this pattern" arg="-pattern %" />
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A 3D juggling stick-man, with Cambridge juggling pattern
+notation used to describe the patterns he juggles.
+
+https://en.wikipedia.org/wiki/Siteswap
+
+Written by Tim Auckland and Jamie Zawinski; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/julia.xml b/hacks/config/julia.xml
new file mode 100644
index 0000000..f648197
--- /dev/null
+++ b/hacks/config/julia.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="julia" _label="Julia">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=cA4Rgq-rmy8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="Few" _high-label="Lots"
+ low="10" high="20000" default="1000"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Iterations" _low-label="Small" _high-label="Large"
+ low="1" high="100" default="20"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="200"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+The Julia set is a close relative of the Mandelbrot set. The
+small moving dot indicates the control point from which the rest of
+the image was generated. See also the "Discrete" screen saver.
+
+https://en.wikipedia.org/wiki/Julia_set
+
+Written by Sean McCullough; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/kaleidescope.xml b/hacks/config/kaleidescope.xml
new file mode 100644
index 0000000..ccfc18f
--- /dev/null
+++ b/hacks/config/kaleidescope.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="kaleidescope" _label="Kaleidescope">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=mGplFlx1y3M"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="nsegments" type="slider" arg="-nsegments %"
+ _label="Segments" _low-label="Few" _high-label="Many"
+ low="1" high="100" default="7"/>
+
+ <number id="symmetry" type="slider" arg="-symmetry %"
+ _label="Symmetry" _low-label="3" _high-label="32"
+ low="3" high="32" default="11"/>
+
+ <number id="ntrails" type="slider" arg="-ntrails %"
+ _label="Trails" _low-label="Few" _high-label="Many"
+ low="1" high="1000" default="100"/>
+
+ <!-- #### -local_rotation [-59] -->
+ <!-- #### -global_rotation [1] -->
+ <!-- #### -spring_constant [5] -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A simple kaleidoscope made of line segments. See "GLeidescope"
+for a more sophisticated take.
+
+https://en.wikipedia.org/wiki/Kaleidoscope
+
+Written by Ron Tapia; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/kaleidocycle.xml b/hacks/config/kaleidocycle.xml
new file mode 100644
index 0000000..06228d2
--- /dev/null
+++ b/hacks/config/kaleidocycle.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="kaleidocycle" _label="Kaleidocycle" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=SJqRaCCy_vo"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="8" _high-label="64"
+ low="8" high="64" default="16"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="8.0" default="1.0"/>
+ </vgroup>
+
+ <vgroup>
+ <select id="rotation">
+ <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
+ <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
+ <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
+ <option id="z" _label="Rotate around Z axis"/>
+ <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
+ <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
+ <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
+ <option id="xyz" _label="Rotate around all three axes" arg-set="-spin XYZ"/>
+ </select>
+
+ <boolean id="wander" _label="Wander" arg-set="-wander"/>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Draw a ring composed of tetrahedra connected at the edges that twists
+and rotates toroidally.
+
+When a series of tetrahedra are joined at the edges in a loop, it is
+possible for them to rotate continously through the center without
+deforming. This only works with an even number of tetrahedra, and
+there must be eight or more, or they don't fit.
+
+Written by Jamie Zawinski; 2013.
+ </_description>
+</screensaver>
diff --git a/hacks/config/klein.xml b/hacks/config/klein.xml
new file mode 100644
index 0000000..8a93c9e
--- /dev/null
+++ b/hacks/config/klein.xml
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="klein" _label="Klein" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=c2gvyGVNG80"/>
+
+ <hgroup>
+ <select id="kleinbottle">
+ <option id="random" _label="Random shape"/>
+ <option id="figure-8" _label="Figure 8" arg-set="-klein-bottle figure-8"/>
+ <option id="squeezed-torus" _label="Squeezed torus" arg-set="-klein-bottle squeezed-torus"/>
+ <option id="lawson" _label="Lawson" arg-set="-klein-bottle lawson"/>
+ </select>
+
+ <select id="view-mode">
+ <option id="walk" _label="Random motion"/>
+ <option id="walk" _label="Walk" arg-set="-view-mode walk"/>
+ <option id="turn" _label="Turn" arg-set="-view-mode turn"/>
+ <option id="walk-turn" _label="Walk and turn" arg-set="-view-mode walk-turn"/>
+ </select>
+
+ <boolean id="orientation-marks" _label="Show orientation marks"
+ arg-set="-orientation-marks"/>
+ </hgroup>
+
+ <hgroup>
+ <select id="display-mode">
+ <option id="random" _label="Random surface"/>
+ <option id="wire" _label="Wireframe mesh" arg-set="-mode wireframe"/>
+ <option id="surface" _label="Solid surface" arg-set="-mode surface"/>
+ <option id="transparent" _label="Transparent surface" arg-set="-mode transparent"/>
+ </select>
+
+ <select id="appearance">
+ <option id="random" _label="Random pattern"/>
+ <option id="solid" _label="Solid object" arg-set="-appearance solid"/>
+ <option id="bands" _label="See-through bands" arg-set="-appearance bands"/>
+ </select>
+
+ <select id="colors">
+ <option id="random" _label="Random coloration"/>
+ <option id="twosided" _label="Two-sided" arg-set="-colors two-sided"/>
+ <option id="rainbow" _label="Rainbow colors" arg-set="-colors rainbow"/>
+ <option id="depth" _label="4d depth colors" arg-set="-colors depth"/>
+ </select>
+
+ <select id="projection3d">
+ <option id="random" _label="Random 3D"/>
+ <option id="perspective-3d" _label="Perspective 3D" arg-set="-projection-3d perspective"/>
+ <option id="orthographic-3d" _label="Orthographic 3D" arg-set="-projection-3d orthographic"/>
+ </select>
+
+ <select id="projection4d">
+ <option id="random" _label="Random 4D"/>
+ <option id="perspective-4d" _label="Perspective 4D" arg-set="-projection-4d perspective"/>
+ <option id="orthographic-4d" _label="Orthographic 4D" arg-set="-projection-4d orthographic"/>
+ </select>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <number id="speed-wx" type="slider" arg="-speed-wx %"
+ _label="WX rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.1"/>
+
+ <number id="speed-wy" type="slider" arg="-speed-wy %"
+ _label="WY rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.3"/>
+
+ <number id="speed-wz" type="slider" arg="-speed-wz %"
+ _label="WZ rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.5"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="speed-xy" type="slider" arg="-speed-xy %"
+ _label="XY rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.7"/>
+
+ <number id="speed-xz" type="slider" arg="-speed-xz %"
+ _label="XZ rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.9"/>
+
+ <number id="speed-yz" type="slider" arg="-speed-yz %"
+ _label="YZ rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="2.1"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="walk-direction" type="slider" arg="-walk-direction %"
+ _label="Walking direction"
+ _low-label="-180.0" _high-label="180.0"
+ low="-180.0" high="180.0" default="7.0"/>
+
+ <number id="walk-speed" type="slider" arg="-walk-speed %"
+ _label="Walking speed"
+ _low-label="1.0" _high-label="100.0"
+ low="1.0" high="100.0" default="20.0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A Klein bottle is the 4D analog of a moebius strip.
+
+You can walk on the surface of the bottle or rotate it in 4D or walk
+on it while it rotates in 4D. Inspired by Thomas Banchoff's book
+"Beyond the Third Dimension: Geometry, Computer Graphics, and Higher
+Dimensions", Scientific American Library, 1990.
+
+https://en.wikipedia.org/wiki/Klein_bottle
+
+Written by Carsten Steger; 2008.
+ </_description>
+</screensaver>
diff --git a/hacks/config/kumppa.xml b/hacks/config/kumppa.xml
new file mode 100644
index 0000000..85f7ee2
--- /dev/null
+++ b/hacks/config/kumppa.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="kumppa" _label="Kumppa">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=64ULSfxhkDY"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="density" type="slider" arg="-speed %"
+ _label="Density" _low-label="Low" _high-label="High"
+ low="0.0001" high="0.2" default="0.1"/>
+
+ <boolean id="random" _label="Randomize" arg-unset="-no-random"/>
+<!-- <boolean id="db" _label="Double buffer" arg-set="-db"/> -->
+
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Spiraling, spinning, and very, very fast splashes of color rush
+toward the screen.
+
+Written by Teemu Suutari; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/lament.xml b/hacks/config/lament.xml
new file mode 100644
index 0000000..7f0de9d
--- /dev/null
+++ b/hacks/config/lament.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="lament" _label="Lament" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=-TBqI4YKOKI"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <boolean id="tex" _label="Textured" arg-unset="-no-texture"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Lemarchand's Box, the Lament Configuration.
+
+Warning: occasionally opens doors.
+
+https://en.wikipedia.org/wiki/Lemarchand%27s_box
+
+Written by Jamie Zawinski; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/laser.xml b/hacks/config/laser.xml
new file mode 100644
index 0000000..4694cca
--- /dev/null
+++ b/hacks/config/laser.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="laser" _label="Laser">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=QjPEa3KDlsw"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="40000"
+ convert="invert"/>
+
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Count" low="0" high="20" default="10"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="0" high="2000" default="200"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Moving radiating lines, that look vaguely like scanning laser beams.
+(Frankie say relax.)
+
+Written by Pascal Pensa; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/lavalite.xml b/hacks/config/lavalite.xml
new file mode 100644
index 0000000..5e7d4f7
--- /dev/null
+++ b/hacks/config/lavalite.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="lavalite" _label="Lavalite" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=XKbtdHL35u0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Activity" _low-label="Sparse" _high-label="Dense"
+ low="0.001" high="0.01" default="0.003"/>
+ </vgroup>
+ <vgroup>
+ <number id="count" type="slider" arg="-count %"
+ _label="Max blobs" _low-label="1" _high-label="10"
+ low="1" high="10" default="3"/>
+
+ <number id="resolution" type="slider" arg="-resolution %"
+ _label="Resolution" _low-label="Low" _high-label="High"
+ low="10" high="120" default="40"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+
+ <hgroup>
+ <boolean id="impatient" _label="Impatient" arg-set="-impatient"/>
+ <boolean id="smooth" _label="Smooth" arg-unset="-no-smooth"/>
+ <boolean id="wander" _label="Wander" arg-set="-wander"/>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ </vgroup>
+ <vgroup>
+
+ <select id="style">
+ <option id="classic" _label="Classic Lavalite" arg-set="-style classic"/>
+ <option id="giant" _label="Giant Lavalite" arg-set="-style giant"/>
+ <option id="cone" _label="Cone Lavalite" arg-set="-style cone"/>
+ <option id="rocket" _label="Rocket Lavalite" arg-set="-style rocket"/>
+ <option id="random" _label="Random Lamp Style"/>
+ </select>
+
+ <select id="rotation">
+ <option id="no" _label="Don't Rotate" arg-set="-spin 0"/>
+ <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
+ <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
+ <option id="z" _label="Rotate around Z axis"/>
+ <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
+ <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
+ <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
+ <option id="xyz" _label="Rotate around all three axes" arg-set="-spin XYZ"/>
+ </select>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A Simulation a Lava Lite(r). Odd-shaped blobs of a mysterious
+substance are heated, slowly rise to the top of the bottle, and then
+drop back down as they cool. This simulation requires a fairly fast
+machine (both CPU and 3D performance.)
+
+"LAVA LITE(r) and the configuration of the LAVA(r) brand motion lamp are
+registered trademarks of Haggerty Enterprises, Inc. The configuration
+of the globe and base of the motion lamp are registered trademarks of
+Haggerty Enterprises, Inc. in the U.S.A. and in other countries around
+the world."
+
+https://en.wikipedia.org/wiki/Lava_lamp
+https://en.wikipedia.org/wiki/Metaballs
+https://en.wikipedia.org/wiki/Lavarand
+
+Written by Jamie Zawinski; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/lcdscrub.xml b/hacks/config/lcdscrub.xml
new file mode 100644
index 0000000..c92b125
--- /dev/null
+++ b/hacks/config/lcdscrub.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="lcdscrub" _label="LCDscrub">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=aWtHHBOkO4w"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="5000000" default="100000"
+ convert="invert"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="spread" type="spinbutton" arg="-spread %"
+ _label="Line spread" low="2" high="8192" default="8"/>
+ <number id="cycles" type="spinbutton" arg="-cycles %"
+ _label="Cycles" low="1" high="600" default="60"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="hw" _label="Horizontal white" arg-unset="-no-hw"/>
+ <boolean id="vw" _label="Vertical white" arg-unset="-no-vw"/>
+ <boolean id="dw" _label="Diagonal white" arg-unset="-no-dw"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="w" _label="Solid white" arg-unset="-no-w"/>
+ <boolean id="rgb" _label="Primary colors" arg-unset="-no-rgb"/>
+ <boolean id="hb" _label="Horizontal black" arg-unset="-no-hb"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="vb" _label="Vertical black" arg-unset="-no-vb"/>
+ <boolean id="db" _label="Diagonal black" arg-unset="-no-db"/>
+ <boolean id="b" _label="Solid black" arg-unset="-no-b"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+repairs burn-in on LCD monitors. This saver is functional,
+rather than pretty.
+
+Believe it or not, screen burn is not a thing of the past.
+It can happen to LCD screens pretty easily, even in this modern age.
+However, leaving the screen on and displaying high contrast images
+can often repair the damage. That's what this screen saver does.
+
+See also:
+http://docs.info.apple.com/article.html?artnum=88343
+http://toastycode.com/blog/2008/02/05/lcd-scrub/
+
+Inspired by the like-named program by Daniel Sandler.
+
+Written by Jamie Zawinski; 2008.
+ </_description>
+</screensaver>
diff --git a/hacks/config/lightning.xml b/hacks/config/lightning.xml
new file mode 100644
index 0000000..8e602fe
--- /dev/null
+++ b/hacks/config/lightning.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="lightning" _label="Lightning">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=lUUdHtPvp5Y"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Crackling fractal lightning bolts.
+
+Written by Keith Romberg; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/lisa.xml b/hacks/config/lisa.xml
new file mode 100644
index 0000000..d142fad
--- /dev/null
+++ b/hacks/config/lisa.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="lisa" _label="Lisa">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=AUbAuARmlnE"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="50000" default="17000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Steps" _low-label="Few" _high-label="Many"
+ low="1" high="1000" default="768"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="size" type="slider" arg="-size %"
+ _label="Size" _low-label="Small" _high-label="Large"
+ low="10" high="500" default="500"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="1" _high-label="20"
+ low="0" high="20" default="1"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Lissajous loops.
+
+https://en.wikipedia.org/wiki/Lissajous_curve
+
+Written by Caleb Cullen; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/lissie.xml b/hacks/config/lissie.xml
new file mode 100644
index 0000000..ca165a4
--- /dev/null
+++ b/hacks/config/lissie.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="lissie" _label="Lissie">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=6EBNCXcD9f0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Timeout" _low-label="Small" _high-label="Large"
+ low="0" high="80000" default="20000"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="200"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="1" _high-label="20"
+ low="0" high="20" default="1"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Size" low="-500" high="500" default="-200"/>
+ </vgroup>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Lissajous loops. This one draws the progress of circular shapes along a path.
+
+https://en.wikipedia.org/wiki/Lissajous_curve
+
+Written by Alexander Jolk; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/lmorph.xml b/hacks/config/lmorph.xml
new file mode 100644
index 0000000..f0920b3
--- /dev/null
+++ b/hacks/config/lmorph.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="lmorph" _label="LMorph">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=yMbMB7xQMkA"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="70000"
+ convert="invert"/>
+
+ <number id="points" type="slider" arg="-points %"
+ _label="Control points" _low-label="Few" _high-label="Many"
+ low="10" high="1000" default="200"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="steps" type="slider" arg="-steps %"
+ _label="Interpolation steps" _low-label="Less" _high-label="More"
+ low="100" high="500" default="150"/>
+
+ <number id="thickness" type="slider" arg="-linewidth %"
+ _label="Lines" _low-label="Thin" _high-label="Thick"
+ low="1" high="50" default="5"/>
+ </vgroup>
+ </hgroup>
+
+ <select id="type">
+ <option id="random" _label="Open and closed figures"/>
+ <option id="open" _label="Open figures" arg-set="-figtype open"/>
+ <option id="closed" _label="Closed figures" arg-set="-figtype closed"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+This generates random spline-ish line drawings and morphs between
+them.
+
+Written by Sverre H. Huseby and Glenn T. Lines; 1995.
+ </_description>
+</screensaver>
diff --git a/hacks/config/lockward.xml b/hacks/config/lockward.xml
new file mode 100644
index 0000000..1a44ddd
--- /dev/null
+++ b/hacks/config/lockward.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="lockward" _label="Lockward" gl="yes">
+
+ <command arg="-root" />
+
+ <video href="https://www.youtube.com/watch?v=MGwySGVQZ2M"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="rotateidle-min" type="slider"
+ _label="Miniumum rotator idle time"
+ _low-label="Low" _high-label="High"
+ low="500" high="10000" default="1000" arg="-rotateidle-min %" />
+
+ <number id="blinkidle-min" type="slider"
+ _label="Minimum blink idle time"
+ _low-label="Low" _high-label="High"
+ low="500" high="20000" default="1000" arg="-blinkidle-min %" />
+
+ <number id="blinkdwell-min" type="slider"
+ _label="Minimum blink dwell time"
+ _low-label="Low" _high-label="High"
+ low="50" high="1500" default="100" arg="-blinkdwell-min %" />
+
+ <hgroup>
+ <boolean id="blink"
+ _label="Blinking effects"
+ arg-unset="-no-blink" />
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="rotateidle-max" type="slider"
+ _label="Maximum rotator idle time"
+ _low-label="Low" _high-label="High"
+ low="500" high="10000" default="6000" arg="-rotateidle-max %" />
+
+ <number id="blinkidle-max" type="slider"
+ _label="Maximum blink idle time"
+ _low-label="Low" _high-label="High"
+ low="500" high="20000" default="9000" arg="-blinkidle-max %" />
+
+ <number id="blinkdwell-max" type="slider"
+ _label="Maximum blink dwell time"
+ _low-label="Low" _high-label="High"
+ low="50" high="1500" default="600" arg="-blinkdwell-max %" />
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A translucent spinning, blinking thing. Sort of a cross between the wards
+in an old combination lock and those old backlit information displays that
+animated and changed color via polarized light.
+
+Written by Leo L. Schwab; 2007.
+ </_description>
+</screensaver>
diff --git a/hacks/config/loop.xml b/hacks/config/loop.xml
new file mode 100644
index 0000000..65571c0
--- /dev/null
+++ b/hacks/config/loop.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="loop" _label="Loop">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=_kTMO7oEN8U"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="200000" default="100000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Timeout" _low-label="Small" _high-label="Large"
+ low="0" high="8000" default="1600"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="15"/>
+
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Size" low="-50" high="50" default="-12"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A cellular automaton that generates loop-shaped colonies that spawn,
+age, and eventually die.
+
+https://en.wikipedia.org/wiki/Langton%27s_loops
+
+Written by David Bagley; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/m6502.xml b/hacks/config/m6502.xml
new file mode 100644
index 0000000..5738921
--- /dev/null
+++ b/hacks/config/m6502.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="m6502" _label="m6502">
+
+ <command arg="-root" />
+
+ <video href="https://www.youtube.com/watch?v=KlDw0nYwUe4"/>
+
+ <file id="file" _label="Assembly file" arg="-file %"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="displaytime" type="slider" arg="-displaytime %"
+ _label="Display time for each program"
+ _low-label="5 seconds" _high-label="2 minutes"
+ low="5.0" high="120.0" default="30.0" />
+ <number id="tvcolor" type="slider" arg="-tv-color %"
+ _label="Color Knob" _low-label="Low" _high-label="High"
+ low="0" high="400" default="70"/>
+ <number id="tvtint" type="slider" arg="-tv-tint %"
+ _label="Tint Knob" _low-label="Low" _high-label="High"
+ low="0" high="360" default="5"/>
+ </vgroup>
+ <vgroup>
+ <number id="ips" type="slider" arg="-ips %"
+ _label="Instructions per second"
+ _low-label="500" _high-label="120000"
+ low="500" high="120000" default="15000" />
+ <number id="tvbrightness" type="slider" arg="-tv-brightness %"
+ _label="Brightness Knob" _low-label="Low" _high-label="High"
+ low="-75.0" high="100.0" default="3.0"/>
+ <number id="tvcontrast" type="slider" arg="-tv-contrast %"
+ _label="Contrast Knob" _low-label="Low" _high-label="High"
+ low="0" high="500" default="150"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Emulates a 6502 microprocessor, and runs some example programs on it.
+
+The family of 6502 chips were used throughout the 70's and 80's in
+machines such as the Atari 2600, Commodore PET, VIC20 and C64, Apple
+][, and the NES. Some example programs are included, and it can also
+read in an assembly file as input.
+
+Original JavaScript Version by Stian Soreng: http://www.6502asm.com/.
+Ported to XScreenSaver by Jeremy English.
+
+Written by Stian Soreng and Jeremy English; 2007.
+ </_description>
+</screensaver>
diff --git a/hacks/config/maze.xml b/hacks/config/maze.xml
new file mode 100644
index 0000000..83b5b92
--- /dev/null
+++ b/hacks/config/maze.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="maze" _label="Maze">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=-u4neMXIRA8"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-solve-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <select id="generator">
+ <option id="mrandom" _label="Random maze generator"/>
+ <option id="m0" _label="Depth-first backtracking maze generator"
+ arg-set="-generator 0"/>
+ <option id="m1" _label="Wall-building maze generator (Prim)"
+ arg-set="-generator 1"/>
+ <option id="m2" _label="Set-joining maze generator (Kruskal)"
+ arg-set="-generator 2"/>
+ </select>
+
+ <hgroup>
+ <select id="ignorance">
+ <option id="smart" _label="Head toward exit"/>
+ <option id="dumb" _label="Ignorant of exit direction"
+ arg-set="-ignorant"/>
+ </select>
+
+ </hgroup>
+
+ <hgroup>
+ <number id="grid-size" type="spinbutton" arg="-grid-size %"
+ _label="Grid size" low="0" high="100" default="0"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ </vgroup>
+
+ <vgroup>
+ <number id="pre-delay" type="slider" arg="-pre-delay %"
+ _label="Linger before solving"
+ _low-label="0 seconds" _high-label="10 seconds"
+ low="0" high="10000000" default="2000000"/>
+
+ <number id="post-delay" type="slider" arg="-post-delay %"
+ _label="Linger after solving"
+ _low-label="0 seconds" _high-label="10 seconds"
+ low="0" high="10000000" default="4000000"/>
+
+ <xscreensaver-updater />
+
+ </vgroup>
+ </hgroup>
+
+
+ <_description>
+Generates random mazes, with three different algorithms: Kruskal,
+Prim, and a depth-first recursive backtracker. It also solves them.
+Backtracking and look-ahead paths are displayed in different colors.
+
+https://en.wikipedia.org/wiki/Maze_generation_algorithm
+https://en.wikipedia.org/wiki/Maze_solving_algorithm
+
+Written by Martin Weiss, Dave Lemke, Jim Randell, Jamie Zawinski,
+Johannes Keukelaar, and Zack Weinberg; 1985.
+ </_description>
+</screensaver>
diff --git a/hacks/config/maze3d.xml b/hacks/config/maze3d.xml
new file mode 100755
index 0000000..ac578da
--- /dev/null
+++ b/hacks/config/maze3d.xml
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="maze3d" _label="Maze3D" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=VTAwxTVdyLc"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.02" high="4.0" default="1.0"/>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+ <hgroup>
+ <boolean id="showOverlay" _label="Show Overlay" arg-set="-overlay"/>
+ <boolean id="acid" _label="Acid" arg-set="-drop-acid"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <hgroup>
+ <number id="numRows" type="spinbutton" arg="-rows %"
+ _label="Rows" low="2" high="24" default="12"/>
+ <number id="numColumns" type="spinbutton" arg="-columns %"
+ _label="Columns" low="2" high="24" default="12"/>
+ </hgroup>
+
+<!--
+ <hgroup>
+ <file id="wallTextureFile" _label="Wall Texture" arg="-wall-texture %"/>
+ <select id="wallTextureSelect">
+ <option id="wallTextureBrickWall" _label="Brick Wall"/>
+ <option id="wallTextureWoodFloor" _label="Wood Floor"
+ arg-set="-wall-texture wood-floor"/>
+ <option id="wallTextureCeilingTiles" _label="Ceiling Tiles"
+ arg-set="-wall-texture ceiling-tiles"/>
+ <option id="wallTextureFractal1" _label="Fractal 1"
+ arg-set="-wall-texture fractal-1"/>
+ <option id="wallTextureFractal2" _label="Fractal 2"
+ arg-set="-wall-texture fractal-2"/>
+ <option id="wallTextureFractal3" _label="Fractal 3"
+ arg-set="-wall-texture fractal-3"/>
+ <option id="wallTextureFractal4" _label="Fractal 4"
+ arg-set="-wall-texture fractal-4"/>
+ </select>
+ <boolean id="dropAcidWalls" _label="Drop acid"
+ arg-set="-drop-acid-walls"/>
+ </hgroup>
+
+ <hgroup>
+ <file id="floorTextureFile" _label="Floor Texture"
+ arg="-floor-texture %"/>
+ <select id="floorTextureSelect">
+ <option id="floorTextureWoodFloor" _label="Wood Floor"/>
+ <option id="floorTextureBrickWall" _label="Brick Wall"
+ arg-set="-floor-texture brick-wall"/>
+ <option id="floorTextureCeilingTiles" _label="Ceiling Tiles"
+ arg-set="-floor-texture ceiling-tiles"/>
+ <option id="floorTextureFractal1" _label="Fractal 1"
+ arg-set="-floor-texture fractal-1"/>
+ <option id="floorTextureFractal2" _label="Fractal 2"
+ arg-set="-floor-texture fractal-2"/>
+ <option id="floorTextureFractal3" _label="Fractal 3"
+ arg-set="-floor-texture fractal-3"/>
+ <option id="floorTextureFractal4" _label="Fractal 4"
+ arg-set="-floor-texture fractal-4"/>
+ </select>
+ <boolean id="dropAcidFloor" _label="Drop acid"
+ arg-set="-drop-acid-floor"/>
+ </hgroup>
+
+ <hgroup>
+ <file id="ceilingTextureFile" _label="Ceiling Texture"
+ arg="-ceiling-texture %"/>
+ <select id="ceilingTextureSelect">
+ <option id="ceilingTextureCeilingTiles" _label="Ceiling Tiles"/>
+ <option id="ceilingTextureBrickWall" _label="Brick Wall"
+ arg-set="-ceiling-texture brick-wall"/>
+ <option id="ceilingTextureWoodFloor" _label="Wood Floor"
+ arg-set="-ceiling-texture wood-floor"/>
+ <option id="ceilingTextureFractal1" _label="Fractal 1"
+ arg-set="-ceiling-texture fractal-1"/>
+ <option id="ceilingTextureFractal2" _label="Fractal 2"
+ arg-set="-ceiling-texture fractal-2"/>
+ <option id="ceilingTextureFractal3" _label="Fractal 3"
+ arg-set="-ceiling-texture fractal-3"/>
+ <option id="ceilingTextureFractal4" _label="Fractal 4"
+ arg-set="-ceiling-texture fractal-4"/>
+ </select>
+ <boolean id="dropAcidCeiling" _label="Drop acid"
+ arg-set="-drop-acid-ceiling"/>
+ </hgroup>
+-->
+
+ <hgroup>
+ <number id="numInverters" type="spinbutton"
+ arg="-inverters %" _label="Inverters" low="0"
+ high="100" default="10"/>
+ <number id="numRats" type="spinbutton"
+ arg="-rats %" _label="Rats" low="0" high="100"
+ default="1"/>
+
+<!--
+ <vgroup>
+ <number id="numGl3dTexts" type="spinbutton"
+ arg="-gl-3d-texts %" _label="OpenGL"
+ low="0" high="100" default="3"/>
+ <number id="numGlRedbooks" type="spinbutton"
+ arg="-gl-redbooks %" _label="Redbooks"
+ low="0" high="100" default="3"/>
+ </vgroup>
+-->
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A re-creation of the 3D Maze screensaver from Windows 95.
+Written by Sudoer; 2018.
+</_description>
+</screensaver>
diff --git a/hacks/config/memscroller.xml b/hacks/config/memscroller.xml
new file mode 100644
index 0000000..ccb6c0a
--- /dev/null
+++ b/hacks/config/memscroller.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="memscroller" _label="MemScroller">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=DQJRNlTKCdA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <hgroup>
+ <select id="seedMode">
+ <option id="ram" _label="Dump memory"/>
+ <option id="random" _label="Draw random numbers" arg-set="-random"/>
+ </select>
+
+ <select id="drawMode">
+ <option id="color" _label="Draw in RGB"/>
+ <option id="mono" _label="Draw green" arg-set="-mono"/>
+ </select>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Scrolls a dump of its own memory in three windows at three different rates.
+
+Written by Jamie Zawinski; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/menger.xml b/hacks/config/menger.xml
new file mode 100644
index 0000000..760167e
--- /dev/null
+++ b/hacks/config/menger.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="menger" _label="Menger" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=qpnuNJH9cLw"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="descent" type="slider" arg="-speed %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="2" high="500" default="150"
+ convert="invert"/>
+
+ <number id="depth" type="spinbutton" arg="-depth %"
+ _label="Max depth" low="1" high="6" default="3"/>
+
+ <!-- #### -no-optimize -->
+
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+
+ <select id="rotation">
+ <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
+ <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
+ <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
+ <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
+ <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
+ <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
+ <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
+ <option id="xyz" _label="Rotate around all three axes"/>
+ </select>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+The Menger Gasket is a cube-based recursive fractal object
+analagous to the Sierpinski Tetrahedron.
+
+https://en.wikipedia.org/wiki/Menger_sponge
+https://en.wikipedia.org/wiki/Sierpinski_carpet
+
+Written by Jamie Zawinski; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/metaballs.xml b/hacks/config/metaballs.xml
new file mode 100644
index 0000000..0d1a218
--- /dev/null
+++ b/hacks/config/metaballs.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="metaballs" _label="MetaBalls">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=wcdKHCp9foY"/>
+
+ <!-- #### -color [random] -->
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="100" high="3000" default="1000"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="2" high="256" default="256"/>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Metaball count" _low-label="Two" _high-label="Many"
+ low="2" high="255" default="10"/>
+
+ <number id="radius" type="slider" arg="-radius %"
+ _label="MetaBall Radius" _low-label="Small" _high-label="Big" low="2" high="100" default="100"/>
+
+ <number id="delta" type="slider" arg="-delta %"
+ _label="MetaBall Movement" _low-label="Small" _high-label="Big" low="1" high="20" default="3"/>
+
+ </vgroup>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+2D meta-balls: overlapping and merging balls with fuzzy edges.
+
+https://en.wikipedia.org/wiki/Metaballs
+
+Written by W.P. van Paassen; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/mirrorblob.xml b/hacks/config/mirrorblob.xml
new file mode 100644
index 0000000..74b1015
--- /dev/null
+++ b/hacks/config/mirrorblob.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="mirrorblob" _label="MirrorBlob" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=o4GTO18KHe8"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="zoom" type="slider" arg="-zoom %"
+ _label="Zoom"
+ _low-label="0.1x" _high-label="3.0x"
+ low="0.1" high="3.0" default="1.0"/>
+
+ <number id="hold_time" type="slider" arg="-hold-time %"
+ _label="Time until loading a new image"
+ _low-label="5 sec" _high-label="5 min"
+ low="5.0" high="300.0" default="30.0"/>
+
+ <number id="fade_speed" type="slider" arg="-fade-time %"
+ _label="Transition duration"
+ _low-label="None" _high-label="30 sec"
+ low="0.0" high="30.0" default="5.0"/>
+ </vgroup>
+ <vgroup>
+ <number id="resolution" type="slider" arg="-resolution %"
+ _low-label="Low" _high-label="High"
+ _label="Resolution" low="4" high="50" default="30"/>
+
+ <number id="bumps" type="slider" arg="-bumps %"
+ _low-label="None" _high-label="50 bumps"
+ _label="Bumps" low="0" high="50" default="10"/>
+
+ <number id="blend" type="slider" arg="-blend %"
+ _low-label="Clear" _high-label="Opaque"
+ _label="Transparency" low="0.1" high="1.0" default="1.0"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <boolean id="walls" _label="Enable walls" arg-set="-walls"/>
+ <boolean id="colour" _label="Enable colouring" arg-set="-colour"/>
+ <boolean id="texture" _label="Enable reflected image" arg-unset="-no-texture"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="backgound" _label="Show image on background" arg-unset="-no-paint-background"/>
+ <boolean id="offset_texture" _label="Offset texture coordinates" arg-set="-offset-texture"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+
+ <vgroup>
+ <select id="render">
+ <option id="wire" _label="Wireframe" arg-set="-wire"/>
+ <option id="solid" _label="Solid surface"/>
+ </select>
+ </vgroup>
+
+ </hgroup>
+
+ <xscreensaver-image />
+ <xscreensaver-updater />
+
+ <_description>
+A wobbly blob distorts images behind it.
+
+Written by Jon Dowdall; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/mismunch.xml b/hacks/config/mismunch.xml
new file mode 100644
index 0000000..02a258f
--- /dev/null
+++ b/hacks/config/mismunch.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="mismunch" _label="Mismunch">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=aXNIYpdh8Ug"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-clear %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="1" high="200" default="65"/>
+
+ <number id="simultaneous" type="slider" arg="-simul %"
+ _label="Simultaneous squares" _low-label="One" _high-label="Many"
+ low="1" high="20" default="5"/>
+
+ <select id="mode">
+ <option id="xor" _label="XOR"/>
+ <option id="solid" _label="Solid" arg-set="-no-xor"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08. It was merged with the "Munch" screen saver.
+
+Munching errors! This is a creatively broken misimplementation of the
+classic munching squares graphics hack. See the "Munch" screen saver
+for the original.
+
+https://en.wikipedia.org/wiki/HAKMEM
+https://en.wikipedia.org/wiki/Munching_square
+
+Written by Steven Hazel; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/moebius.xml b/hacks/config/moebius.xml
new file mode 100644
index 0000000..324c527
--- /dev/null
+++ b/hacks/config/moebius.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="moebius" _label="Moebius" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=77Nib6jQrXc"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <boolean id="solid" _label="Solid floor" arg-set="-solidmoebius"/>
+ <boolean id="ants" _label="Draw ants" arg-unset="-no-ants"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+M. C. Escher's "Moebius Strip II", an image of ants walking along the
+surface of a moebius strip.
+
+https://en.wikipedia.org/wiki/Moebius_strip
+https://en.wikipedia.org/wiki/Maurits_Cornelis_Escher
+
+Written by Marcelo F. Vianna; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/moebiusgears.xml b/hacks/config/moebiusgears.xml
new file mode 100644
index 0000000..9233f91
--- /dev/null
+++ b/hacks/config/moebiusgears.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="moebiusgears" _label="MoebiusGears" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=kpT6j2-9b40"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="5.0" default="1.0"/>
+
+ <hgroup>
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Number of gears" low="13" high="99" default="17"/>
+
+ <number id="teeth" type="spinbutton" arg="-teeth %"
+ _label="Number of teeth" low="7" high="49" default="15"/>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="roll" _label="Roll" arg-unset="-no-roll"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+An interlinked loop of rotating gears. The layout of the gears
+follows the path of a moebius strip. See also the "Pinion" and
+"Gears" screen savers.
+
+https://en.wikipedia.org/wiki/Involute_gear
+https://en.wikipedia.org/wiki/Moebius_strip
+
+Written by Jamie Zawinski; 2007.
+ </_description>
+</screensaver>
diff --git a/hacks/config/moire.xml b/hacks/config/moire.xml
new file mode 100644
index 0000000..9c3f558
--- /dev/null
+++ b/hacks/config/moire.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="moire" _label="Moire">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=S50zFVcUe4s"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Duration" _low-label="1 second" _high-label="1 minute"
+ low="1" high="60" default="5"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <number id="offset" type="slider" arg="-offset %"
+ _label="Offset" _low-label="Small" _high-label="Large"
+ low="1" high="200" default="50"/>
+
+ <!-- #### -no-random -->
+
+<!-- <boolean id="shm" _label="Use shared memory" arg-unset="-no-shm"/> -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+ When the lines on the screen
+ Make more lines in between,
+ That's a moire'!
+
+https://en.wikipedia.org/wiki/Moire_pattern
+
+Written by Jamie Zawinski and Michael Bayne; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/moire2.xml b/hacks/config/moire2.xml
new file mode 100644
index 0000000..1785df3
--- /dev/null
+++ b/hacks/config/moire2.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="moire2" _label="Moire2">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=7iBNbYCo8so"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="50000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="150"/>
+
+ <number id="thickness" type="spinbutton" arg="-thickness %"
+ _label="Thickness" low="0" high="100" default="0"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Generates fields of concentric circles or ovals, and combines the
+planes with various operations. The planes are moving independently
+of one another, causing the interference lines to spray.
+
+https://en.wikipedia.org/wiki/Moire_pattern
+
+Written by Jamie Zawinski; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/molecule.xml b/hacks/config/molecule.xml
new file mode 100644
index 0000000..fe1129b
--- /dev/null
+++ b/hacks/config/molecule.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="molecule" _label="Molecule" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=D1A0tNcPL4M"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="timeout" type="slider" arg="-timeout %"
+ _label="Duration" _low-label="5 seconds" _high-label="2 minutes"
+ low="5" high="120" default="20"/>
+
+ <hgroup>
+ <vgroup>
+ <boolean id="labels" _label="Label atoms" arg-unset="-no-labels"/>
+ <boolean id="titles" _label="Describe molecule" arg-unset="-no-titles"/>
+ <boolean id="bbox" _label="Draw bounding box" arg-set="-bbox"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="atoms" _label="Draw atomic nuclei" arg-unset="-no-atoms"/>
+ <boolean id="bonds" _label="Draw atomic bonds" arg-unset="-no-bonds"/>
+ <boolean id="shells" _label="Draw electron shells" arg-unset="-no-shells"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-set="-wander"/>
+
+ <select id="rotation">
+ <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
+ <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
+ <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
+ <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
+ <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
+ <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
+ <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
+ <option id="xyz" _label="Rotate around all three axes"/>
+ </select>
+ </hgroup>
+
+ <file id="molecule" _label="PDB file or directory" arg="-molecule %"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Some interesting molecules. Several molecules are built in, and it can
+also read PDB (Protein Data Bank) files as input.
+
+https://en.wikipedia.org/wiki/Protein_Data_Bank_%28file_format%29
+
+Written by Jamie Zawinski; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/morph3d.xml b/hacks/config/morph3d.xml
new file mode 100644
index 0000000..0122fb7
--- /dev/null
+++ b/hacks/config/morph3d.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="morph3d" _label="Morph3D" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=lNtDppjOli4"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="40000"
+ convert="invert"/>
+
+ <select id="object">
+ <option id="random" _label="Random object"/>
+ <option id="tetra" _label="Tetrahedron" arg-set="-count 1"/>
+ <option id="cube" _label="Cube" arg-set="-count 2"/>
+ <option id="octa" _label="Octahedron" arg-set="-count 3"/>
+ <option id="dodeca" _label="Dodecahedron" arg-set="-count 4"/>
+ <option id="icosa" _label="Icosahedron" arg-set="-count 5"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Platonic solids that turn inside out and get spikey.
+
+https://en.wikipedia.org/wiki/Platonic_solid
+
+Written by Marcelo Vianna; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/mountain.xml b/hacks/config/mountain.xml
new file mode 100644
index 0000000..de0eb4d
--- /dev/null
+++ b/hacks/config/mountain.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="mountain" _label="Mountain">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=knqnPcZGqkA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Peaks" _low-label="One" _high-label="Lots"
+ low="1" high="100" default="30"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Generates random 3D plots that look vaguely mountainous.
+
+Written by Pascal Pensa; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/munch.xml b/hacks/config/munch.xml
new file mode 100644
index 0000000..9875838
--- /dev/null
+++ b/hacks/config/munch.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="munch" _label="Munch">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=aXNIYpdh8Ug"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-clear %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="1" high="200" default="65"/>
+
+ <number id="simultaneous" type="slider" arg="-simul %"
+ _label="Simultaneous squares" _low-label="One" _high-label="Many"
+ low="1" high="20" default="5"/>
+ </vgroup>
+ <vgroup>
+ <select id="mismunch">
+ <option id="random" _label="Munch or mismunch"/>
+ <option id="munch" _label="Munch only" arg-set="-classic"/>
+ <option id="mismunch" _label="Mismunch only" arg-set="-mismunch"/>
+ </select>
+
+ <select id="mode">
+ <option id="xor" _label="XOR"/>
+ <option id="solid" _label="Solid" arg-set="-no-xor"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ </vgroup>
+ </hgroup>
+
+ <_description>
+ DATAI 2
+ ADDB 1,2
+ ROTC 2,-22
+ XOR 1,2
+ JRST .-4
+
+As reported by HAKMEM (MIT AI Memo 239, 1972), Jackson Wright wrote
+the above PDP-1 code in 1962. That code still lives on here, some 46
+years later.
+
+In "mismunch" mode, it displays a creatively broken misimplementation
+of the classic munching squares algorithm instead.
+
+https://en.wikipedia.org/wiki/HAKMEM
+https://en.wikipedia.org/wiki/Munching_square
+
+Written by Jackson Wright, Tim Showalter, Jamie Zawinski and
+Steven Hazel; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/nerverot.xml b/hacks/config/nerverot.xml
new file mode 100644
index 0000000..ef6db85
--- /dev/null
+++ b/hacks/config/nerverot.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="nerverot" _label="NerveRot">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=oUfgDnyGqHM"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="iters" type="slider" arg="-max-iters %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="100" high="8000" default="1200"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Blot count" _low-label="Few" _high-label="Many"
+ low="1" high="1000" default="250"/>
+
+ <number id="ncolors" type="slider" arg="-colors %"
+ _label="Colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="4"/>
+ </vgroup>
+ <vgroup>
+ <number id="event" type="slider" arg="-event-chance %"
+ _label="Changes" _low-label="Seldom" _high-label="Frequent"
+ low="0.0" high="1.0" default="0.2"/>
+
+ <number id="nervous" type="slider" arg="-nervousness %"
+ _label="Nervousness" _low-label="Calm" _high-label="Spastic"
+ low="0.0" high="1.0" default="0.3"/>
+
+ <number id="mnr" type="slider" arg="-max-nerve-radius %"
+ _label="Crunchiness" _low-label="Low" _high-label="High"
+ low="0.0" high="1.0" default="0.7"/>
+
+ <number id="linewidth" type="spinbutton" arg="-line-width %"
+ _label="Line thickness" low="0" high="100" default="0"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </vgroup>
+ </hgroup>
+
+ <!-- #### -iter-amt [0.01] -->
+ <!-- #### -min-scale [0.6] -->
+ <!-- #### -max-scale [1.75] -->
+ <!-- #### -min-radius [3] -->
+ <!-- #### -max-radius [25] -->
+
+ <xscreensaver-updater />
+
+ <_description>
+Nervously vibrating squiggles.
+
+Written by Dan Bornstein; 2000.
+ </_description>
+</screensaver>
diff --git a/hacks/config/noof.xml b/hacks/config/noof.xml
new file mode 100644
index 0000000..3e2b0fc
--- /dev/null
+++ b/hacks/config/noof.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="noof" _label="Noof" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=x5DQjgYqmn0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Flowery, rotatey patterns.
+
+Written by Bill Torzewski; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/noseguy.xml b/hacks/config/noseguy.xml
new file mode 100644
index 0000000..bfc1674
--- /dev/null
+++ b/hacks/config/noseguy.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="noseguy" _label="NoseGuy">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=ONJlg9Y_TLI"/>
+
+ <xscreensaver-text />
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A little man with a big nose wanders around your screen saying things.
+
+Written by Dan Heller and Jamie Zawinski; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/pacman.xml b/hacks/config/pacman.xml
new file mode 100644
index 0000000..5ef77d5
--- /dev/null
+++ b/hacks/config/pacman.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="pacman" _label="Pacman">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=G-pdjis0ECw"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Player size" low="0" high="200" default="0"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Simulates a game of Pac-Man on a randomly-created level.
+
+https://en.wikipedia.org/wiki/Pac-Man
+
+Written by Edwin de Jong and Jamie Zawinski; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/pedal.xml b/hacks/config/pedal.xml
new file mode 100644
index 0000000..5ddb6e1
--- /dev/null
+++ b/hacks/config/pedal.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="pedal" _label="Pedal">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=VFibXcP1JH0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Duration" _low-label="1 second" _high-label="1 minute"
+ low="1" high="60" default="5"/>
+
+ <number id="lines" type="slider" arg="-maxlines %"
+ _label="Lines" _low-label="Few" _high-label="Many"
+ low="100" high="5000" default="1000"/>
+
+ <!-- #### -fadedelay [200000] -->
+ <!-- #### -foreground [white] -->
+ <!-- #### -background [black] -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+The even-odd winding rule.
+
+https://en.wikipedia.org/wiki/Even-odd_rule
+https://en.wikipedia.org/wiki/Nonzero-rule
+
+Written by Dale Moore; 1995.
+ </_description>
+</screensaver>
diff --git a/hacks/config/peepers.xml b/hacks/config/peepers.xml
new file mode 100644
index 0000000..300c389
--- /dev/null
+++ b/hacks/config/peepers.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="peepers" _label="Peepers" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=9xwPoLRKff8"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.05" high="2.0" default="1.0"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of eyes" _low-label="Few" _high-label="Many"
+ low="0" high="50" default="0"/>
+ </vgroup>
+
+ <vgroup>
+
+ <select id="mode">
+ <option id="bounce" _label="Bounce" arg-set="-mode bounce"/>
+ <option id="scroll" _label="Scroll" arg-set="-mode scroll"/>
+ <option id="random" _label="Bounce or scroll"/>
+ <option id="xeyes" _label="Grid" arg-set="-mode xeyes"/>
+ <option id="beholder" _label="Beholder" arg-set="-mode beholder"/>
+ </select>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+ </vgroup>
+ </hgroup>
+
+ <_description>
+Floating eyeballs. Anatomically correct, and they also track the pointer.
+
+Written by Jamie Zawinski; 2018.
+ </_description>
+</screensaver>
diff --git a/hacks/config/penetrate.xml b/hacks/config/penetrate.xml
new file mode 100644
index 0000000..a7f6de9
--- /dev/null
+++ b/hacks/config/penetrate.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="penetrate" _label="Penetrate">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=iuutzMOVYgI"/>
+
+ <number id="bgrowth" type="slider" arg="-bgrowth %"
+ _label="Explosions" _low-label="Slow" _high-label="Fast"
+ low="1" high="20" default="5"/>
+
+ <number id="lrate" type="slider" arg="-lrate %"
+ _label="Lasers" _low-label="Slow" _high-label="Fast"
+ low="10" high="200" default="80"
+ convert="invert"/>
+
+ <select id="mode">
+ <option id="dumb" _label="Start badly, but learn"/>
+ <option id="smart" _label="Always play well" arg-set="-smart"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Simulates (something like) the classic arcade game Missile Command.
+
+https://en.wikipedia.org/wiki/Missile_Command
+
+Written by Adam Miller; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/penrose.xml b/hacks/config/penrose.xml
new file mode 100644
index 0000000..aa70323
--- /dev/null
+++ b/hacks/config/penrose.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="penrose" _label="Penrose">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=atlkrWkbYHk"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+ </vgroup>
+ <vgroup>
+ <number id="size" type="slider" arg="-size %"
+ _label="Tile size" _low-label="Small" _high-label="Large"
+ low="1" high="100" default="40"/>
+
+ <boolean id="ammann" _label="Draw ammann lines" arg-set="-ammann"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+
+ <xscreensaver-updater />
+
+ <_description>
+Quasiperiodic tilings.
+
+In April 1997, Sir Roger Penrose, a British math professor who has
+worked with Stephen Hawking on such topics as relativity, black
+holes, and whether time has a beginning, filed a
+copyright-infringement lawsuit against the Kimberly-Clark
+Corporation, which Penrose said copied a pattern he created (a
+pattern demonstrating that "a nonrepeating pattern could exist in
+nature") for its Kleenex quilted toilet paper. Penrose said he
+doesn't like litigation but, "When it comes to the population of
+Great Britain being invited by a multinational to wipe their bottoms
+on what appears to be the work of a Knight of the Realm, then a last
+stand must be taken."
+
+As reported by News of the Weird #491, 4-Jul-1997.
+
+https://en.wikipedia.org/wiki/Penrose_tiling
+https://en.wikipedia.org/wiki/Tessellation
+
+Written by Timo Korvola; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/petri.xml b/hacks/config/petri.xml
new file mode 100644
index 0000000..eff9373
--- /dev/null
+++ b/hacks/config/petri.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="petri" _label="Petri">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=QkJ9cN0QQd8"/>
+
+ <hgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <number id="diaglim" type="slider" arg="-diaglim %"
+ _label="Colony shape" _low-label="Square" _high-label="Diamond"
+ low="1.0" high="2.0" default="1.414"
+ convert="invert"/>
+
+ <number id="anychan" type="slider" arg="-anychan %"
+ _label="Fertility" _low-label="Low" _high-label="High"
+ low="0.0" high="0.25" default="0.0015"/>
+
+ <number id="minorchan" type="slider" arg="-minorchan %"
+ _label="Offspring" _low-label="Few" _high-label="Many"
+ low="0.0" high="1.0" default="0.5"/>
+
+ <number id="instantdeathchan" type="slider" arg="-instantdeathchan %"
+ _label="Death comes" _low-label="Slowly" _high-label="Quickly"
+ low="0.0" high="1.0" default="0.2"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="minlifespeed" type="slider" arg="-minlifespeed %"
+ _label="Minimum rate of growth" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="1.0" default="0.04"/>
+
+ <number id="maxlifespeed" type="slider" arg="-maxlifespeed %"
+ _label="Maximum rate of growth" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="1.0" default="0.13"/>
+
+ <number id="mindeathspeed" type="slider" arg="-mindeathspeed %"
+ _label="Minimum rate of death" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="1.0" default="0.42"/>
+
+ <number id="maxdeathspeed" type="slider" arg="-maxdeathspeed %"
+ _label="Maximum rate of death" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="1.0" default="0.46"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="minlifespan" type="slider" arg="-minlifespan %"
+ _label="Minimum lifespan" _low-label="Short" _high-label="Long"
+ low="0" high="3000" default="500"/>
+
+ <number id="maxlifespan" type="slider" arg="-maxlifespan %"
+ _label="Maximum lifespan" _low-label="Short" _high-label="Long"
+ low="0" high="3000" default="1500"/>
+
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Cell size" low="0" high="100" default="2"/>
+
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Mold varieties" low="0" high="20" default="20"/>
+
+ </vgroup>
+ </hgroup>
+
+ <!-- #### -mem-throttle [22M] -->
+
+ <xscreensaver-updater />
+
+ <_description>
+Colonies of mold grow in a petri dish. Growing colored circles
+overlap and leave spiral interference in their wake.
+
+Written by Dan Bornstein; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/phosphor.xml b/hacks/config/phosphor.xml
new file mode 100644
index 0000000..484cf88
--- /dev/null
+++ b/hacks/config/phosphor.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="phosphor" _label="Phosphor">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=G6ZWTrl7pV0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="50000"
+ convert="invert"/>
+
+ <number id="scale" type="spinbutton" arg="-scale %"
+ _label="Font scale" low="1" high="20" default="6"/>
+
+ <number id="fade" type="slider" arg="-ticks %"
+ _label="Fade" _low-label="Slow" _high-label="Fast"
+ low="1" high="100" default="20"
+ convert="invert"/>
+
+ <select id="fg">
+ <option id="green" _label="Green" />
+ <!-- DarkOrange is probably the closest named color. -->
+ <option id="DarkOrange" _label="Amber" arg-set="-fg #ff7900" />
+ <option id="white" _label="White" arg-set="-fg white" />
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ <vgroup>
+ <xscreensaver-text />
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+An old terminal with large pixels and long-sustain phosphor.
+
+On MacOS and Linux, this program is also a fully-functional VT100
+emulator! Run it as an application instead of as a screen saver and
+you can use it as a terminal.
+
+Written by Jamie Zawinski; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/photopile.xml b/hacks/config/photopile.xml
new file mode 100644
index 0000000..a174afd
--- /dev/null
+++ b/hacks/config/photopile.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="photopile" _label="Photopile" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=snm7o95AR8E"/>
+
+ <hgroup>
+ <vgroup>
+
+ <number id="scale" type="slider" arg="-scale %"
+ _label="Image size"
+ _low-label="Small" _high-label="Large"
+ low="0.1" high="0.9" default="0.4"/>
+
+ <number id="tilt" type="slider" arg="-maxTilt %"
+ _label="Maximum angle from vertical"
+ _low-label="0 deg" _high-label="90 deg"
+ low="0" high="90" default="50"/>
+
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Number of images" low="1" high="20" default="7"/>
+
+ <boolean id="polaroid" _label="Simulate instant film" arg-unset="-no-polaroid"/>
+
+ <boolean id="clip" _label="Instant film theme" arg-unset="-no-clip"/>
+
+ <boolean id="shadows" _label="Draw drop shadows" arg-unset="-no-shadows"/>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Animation speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="8.0" default="1.0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Time until loading a new image"
+ _low-label="Short" _high-label="Long"
+ low="1" high="60" default="5"/>
+
+ <boolean id="titles" _label="Show file names" arg-unset="-no-titles"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-image />
+ <xscreensaver-updater />
+
+ <_description>
+Loads several random images, and displays them as if lying in a random pile.
+The pile is periodically reshuffled, with new images coming in and old ones
+being thrown out.
+
+Written by Jens Kilian and Jamie Zawinski; 2008.
+ </_description>
+</screensaver>
diff --git a/hacks/config/piecewise.xml b/hacks/config/piecewise.xml
new file mode 100644
index 0000000..fb6990a
--- /dev/null
+++ b/hacks/config/piecewise.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="piecewise" _label="Piecewise">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=3gQr1FxFSe0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="Few" _high-label="Many"
+ low="4" high="100" default="32"/>
+
+ <number id="colorspeed" type="slider" arg="-colorspeed %"
+ _label="Color shift" _low-label="Slow" _high-label="Fast"
+ low="0" high="100" default="10"/>
+ </vgroup>
+ <vgroup>
+
+ <number id="minradius" type="slider" arg="-minradius %"
+ _label="Minimum radius" _low-label="Small" _high-label="Large"
+ low="0.01" high="0.5" default="0.05"/>
+
+ <number id="maxradius" type="slider" arg="-maxradius %"
+ _label="Maximum radius" _low-label="Small" _high-label="Large"
+ low="0.01" high="0.5" default="0.2"/>
+ </vgroup>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Moving circles switch from visibility to invisibility at intersection points.
+
+Written by Geoffrey Irving; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/pinion.xml b/hacks/config/pinion.xml
new file mode 100644
index 0000000..edb4f0e
--- /dev/null
+++ b/hacks/config/pinion.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="pinion" _label="Pinion" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=rHY8dR1urQk"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="15000"
+ convert="invert"/>
+
+ <number id="spin" type="slider" arg="-spin %"
+ _label="Rotation speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="7.0" default="1.0"/>
+
+ <number id="scroll" type="slider" arg="-scroll %"
+ _label="Scrolling speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="8.0" default="1.0"/>
+
+ </vgroup>
+ <vgroup>
+ <number id="size" type="slider" arg="-size %"
+ _label="Gear size" _low-label="Tiny" _high-label="Huge"
+ low="0.1" high="3.0" default="1.0"/>
+
+ <number id="max-rpm" type="slider" arg="-max-rpm %"
+ _label="Max RPM" _low-label="100" _high-label="2000"
+ low="100" high="2000" default="900"/>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A gear system marches across the screen.
+See also the "Gears" and "MoebiusGears" screen savers.
+
+https://en.wikipedia.org/wiki/Involute_gear
+
+Written by Jamie Zawinski; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/pipes.xml b/hacks/config/pipes.xml
new file mode 100644
index 0000000..ba2deff
--- /dev/null
+++ b/hacks/config/pipes.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="pipes" _label="Pipes" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=UsUGENa7jvE"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Number of pipes" _low-label="One" _high-label="A hundred"
+ low="1" high="100" default="5"/>
+
+ <number id="size" type="slider" arg="-size %"
+ _label="Pipe length" _low-label="Short" _high-label="Long"
+ low="0" high="3000" default="500"/>
+
+ <number id="factory" type="slider" arg="-factory %"
+ _label="Gadgetry" _low-label="None" _high-label="Lots"
+ low="0" high="10" default="2"/>
+
+ <hgroup>
+ <boolean id="fisheye" _label="Fisheye lens" arg-unset="-no-fisheye"/>
+ <boolean id="tight" _label="Allow tight turns" arg-set="-tightturns"/>
+ <select id="style">
+ <option id="curves" _label="Curved pipes" arg-set="-count 3"/>
+ <option id="balls" _label="Ball joints" arg-set="-count 1"/>
+ <option id="fit" _label="Bolted fittings"/>
+ <option id="random" _label="Random style" arg-set="-count 0"/>
+ </select>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A growing plumbing system, with bolts and valves.
+
+Written by Marcelo Vianna and Jamie Zawinski; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/polyhedra.xml b/hacks/config/polyhedra.xml
new file mode 100644
index 0000000..0780999
--- /dev/null
+++ b/hacks/config/polyhedra.xml
@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="polyhedra" _label="Polyhedra" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=gYb-3EErLJE"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="5.0" default="1.0"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="1 second" _high-label="30 seconds"
+ low="1" high="30" default="12"/>
+
+ <select id="object">
+<option id="random" _label="Display random polyhedron"/>
+<option _label="Pentagonal prism" arg-set="-which pentagonal_prism"/>
+<option _label="Pentagonal dipyramid" arg-set="-which pentagonal_dipyramid"/>
+<option _label="Pentagonal antiprism" arg-set="-which pentagonal_antiprism"/>
+<option _label="Pentagonal deltohedron" arg-set="-which pentagonal_deltohedron"/>
+<option _label="Pentagrammic prism" arg-set="-which pentagrammic_prism"/>
+<option _label="Pentagrammic dipyramid" arg-set="-which pentagrammic_dipyramid"/>
+<option _label="Pentagrammic antiprism" arg-set="-which pentagrammic_antiprism"/>
+<option _label="Pentagrammic deltohedron" arg-set="-which pentagrammic_deltohedron"/>
+<option _label="Pentagrammic crossed antiprism" arg-set="-which pentagrammic_crossed_antiprism"/>
+<option _label="Pentagrammic concave deltohedron" arg-set="-which pentagrammic_concave_deltohedron"/>
+<option _label="Tetrahedron" arg-set="-which tetrahedron"/>
+<option _label="Truncated tetrahedron" arg-set="-which truncated_tetrahedron"/>
+<option _label="Triakistetrahedron" arg-set="-which triakistetrahedron"/>
+<option _label="Octahemioctahedron" arg-set="-which octahemioctahedron"/>
+<option _label="Octahemioctacron" arg-set="-which octahemioctacron"/>
+<option _label="Tetrahemihexahedron" arg-set="-which tetrahemihexahedron"/>
+<option _label="Tetrahemihexacron" arg-set="-which tetrahemihexacron"/>
+<option _label="Octahedron" arg-set="-which octahedron"/>
+<option _label="Cube" arg-set="-which cube"/>
+<option _label="Cuboctahedron" arg-set="-which cuboctahedron"/>
+<option _label="Rhombic dodecahedron" arg-set="-which rhombic_dodecahedron"/>
+<option _label="Truncated octahedron" arg-set="-which truncated_octahedron"/>
+<option _label="Tetrakishexahedron" arg-set="-which tetrakishexahedron"/>
+<option _label="Truncated cube" arg-set="-which truncated_cube"/>
+<option _label="Triakisoctahedron" arg-set="-which triakisoctahedron"/>
+<option _label="Rhombicuboctahedron" arg-set="-which rhombicuboctahedron"/>
+<option _label="Deltoidal icositetrahedron" arg-set="-which deltoidal_icositetrahedron"/>
+<option _label="Truncated cuboctahedron" arg-set="-which truncated_cuboctahedron"/>
+<option _label="Disdyakisdodecahedron" arg-set="-which disdyakisdodecahedron"/>
+<option _label="Snub cube" arg-set="-which snub_cube"/>
+<option _label="Pentagonal icositetrahedron" arg-set="-which pentagonal_icositetrahedron"/>
+<option _label="Small cubicuboctahedron" arg-set="-which small_cubicuboctahedron"/>
+<option _label="Small hexacronic icositetrahedron" arg-set="-which small_hexacronic_icositetrahedron"/>
+<option _label="Great cubicuboctahedron" arg-set="-which great_cubicuboctahedron"/>
+<option _label="Great hexacronic icositetrahedron" arg-set="-which great_hexacronic_icositetrahedron"/>
+<option _label="Cubohemioctahedron" arg-set="-which cubohemioctahedron"/>
+<option _label="Hexahemioctacron" arg-set="-which hexahemioctacron"/>
+<option _label="Cubitruncated cuboctahedron" arg-set="-which cubitruncated_cuboctahedron"/>
+<option _label="Tetradyakishexahedron" arg-set="-which tetradyakishexahedron"/>
+<option _label="Great rhombicuboctahedron" arg-set="-which great_rhombicuboctahedron"/>
+<option _label="Great deltoidal icositetrahedron" arg-set="-which great_deltoidal_icositetrahedron"/>
+<option _label="Small rhombihexahedron" arg-set="-which small_rhombihexahedron"/>
+<option _label="Small rhombihexacron" arg-set="-which small_rhombihexacron"/>
+<option _label="Stellated truncated hexahedron" arg-set="-which stellated_truncated_hexahedron"/>
+<option _label="Great triakisoctahedron" arg-set="-which great_triakisoctahedron"/>
+<option _label="Great truncated cuboctahedron" arg-set="-which great_truncated_cuboctahedron"/>
+<option _label="Great disdyakisdodecahedron" arg-set="-which great_disdyakisdodecahedron"/>
+<option _label="Great rhombihexahedron" arg-set="-which great_rhombihexahedron"/>
+<option _label="Great rhombihexacron" arg-set="-which great_rhombihexacron"/>
+<option _label="Icosahedron" arg-set="-which icosahedron"/>
+<option _label="Dodecahedron" arg-set="-which dodecahedron"/>
+<option _label="Icosidodecahedron" arg-set="-which icosidodecahedron"/>
+<option _label="Rhombic triacontahedron" arg-set="-which rhombic_triacontahedron"/>
+<option _label="Truncated icosahedron" arg-set="-which truncated_icosahedron"/>
+<option _label="Pentakisdodecahedron" arg-set="-which pentakisdodecahedron"/>
+<option _label="Truncated dodecahedron" arg-set="-which truncated_dodecahedron"/>
+<option _label="Triakisicosahedron" arg-set="-which triakisicosahedron"/>
+<option _label="Rhombicosidodecahedron" arg-set="-which rhombicosidodecahedron"/>
+<option _label="Deltoidal hexecontahedron" arg-set="-which deltoidal_hexecontahedron"/>
+<option _label="Truncated icosidodecahedron" arg-set="-which truncated_icosidodecahedron"/>
+<option _label="Disdyakistriacontahedron" arg-set="-which disdyakistriacontahedron"/>
+<option _label="Snub dodecahedron" arg-set="-which snub_dodecahedron"/>
+<option _label="Pentagonal hexecontahedron" arg-set="-which pentagonal_hexecontahedron"/>
+<option _label="Small ditrigonal icosidodecahedron" arg-set="-which small_ditrigonal_icosidodecahedron"/>
+<option _label="Small triambic icosahedron" arg-set="-which small_triambic_icosahedron"/>
+<option _label="Small icosicosidodecahedron" arg-set="-which small_icosicosidodecahedron"/>
+<option _label="Small icosacronic hexecontahedron" arg-set="-which small_icosacronic_hexecontahedron"/>
+<option _label="Small snub icosicosidodecahedron" arg-set="-which small_snub_icosicosidodecahedron"/>
+<option _label="Small hexagonal hexecontahedron" arg-set="-which small_hexagonal_hexecontahedron"/>
+<option _label="Small dodecicosidodecahedron" arg-set="-which small_dodecicosidodecahedron"/>
+<option _label="Small dodecacronic hexecontahedron" arg-set="-which small_dodecacronic_hexecontahedron"/>
+<option _label="Small stellated dodecahedron" arg-set="-which small_stellated_dodecahedron"/>
+<option _label="Great dodecahedron" arg-set="-which great_dodecahedron"/>
+<option _label="Great dodecadodecahedron" arg-set="-which great_dodecadodecahedron"/>
+<option _label="Medial rhombic triacontahedron" arg-set="-which medial_rhombic_triacontahedron"/>
+<option _label="Truncated great dodecahedron" arg-set="-which truncated_great_dodecahedron"/>
+<option _label="Small stellapentakisdodecahedron" arg-set="-which small_stellapentakisdodecahedron"/>
+<option _label="Rhombidodecadodecahedron" arg-set="-which rhombidodecadodecahedron"/>
+<option _label="Medial deltoidal hexecontahedron" arg-set="-which medial_deltoidal_hexecontahedron"/>
+<option _label="Small rhombidodecahedron" arg-set="-which small_rhombidodecahedron"/>
+<option _label="Small rhombidodecacron" arg-set="-which small_rhombidodecacron"/>
+<option _label="Snub dodecadodecahedron" arg-set="-which snub_dodecadodecahedron"/>
+<option _label="Medial pentagonal hexecontahedron" arg-set="-which medial_pentagonal_hexecontahedron"/>
+<option _label="Ditrigonal dodecadodecahedron" arg-set="-which ditrigonal_dodecadodecahedron"/>
+<option _label="Medial triambic icosahedron" arg-set="-which medial_triambic_icosahedron"/>
+<option _label="Great ditrigonal dodecicosidodecahedron" arg-set="-which great_ditrigonal_dodecicosidodecahedron"/>
+<option _label="Great ditrigonal dodecacronic hexecontahedron" arg-set="-which great_ditrigonal_dodecacronic_hexecontahedron"/>
+<option _label="Small ditrigonal dodecicosidodecahedron" arg-set="-which small_ditrigonal_dodecicosidodecahedron"/>
+<option _label="Small ditrigonal dodecacronic hexecontahedron" arg-set="-which small_ditrigonal_dodecacronic_hexecontahedron"/>
+<option _label="Icosidodecadodecahedron" arg-set="-which icosidodecadodecahedron"/>
+<option _label="Medial icosacronic hexecontahedron" arg-set="-which medial_icosacronic_hexecontahedron"/>
+<option _label="Icositruncated dodecadodecahedron" arg-set="-which icositruncated_dodecadodecahedron"/>
+<option _label="Tridyakisicosahedron" arg-set="-which tridyakisicosahedron"/>
+<option _label="Snub icosidodecadodecahedron" arg-set="-which snub_icosidodecadodecahedron"/>
+<option _label="Medial hexagonal hexecontahedron" arg-set="-which medial_hexagonal_hexecontahedron"/>
+<option _label="Great ditrigonal icosidodecahedron" arg-set="-which great_ditrigonal_icosidodecahedron"/>
+<option _label="Great triambic icosahedron" arg-set="-which great_triambic_icosahedron"/>
+<option _label="Great icosicosidodecahedron" arg-set="-which great_icosicosidodecahedron"/>
+<option _label="Great icosacronic hexecontahedron" arg-set="-which great_icosacronic_hexecontahedron"/>
+<option _label="Small icosihemidodecahedron" arg-set="-which small_icosihemidodecahedron"/>
+<option _label="Small icosihemidodecacron" arg-set="-which small_icosihemidodecacron"/>
+<option _label="Small dodecicosahedron" arg-set="-which small_dodecicosahedron"/>
+<option _label="Small dodecicosacron" arg-set="-which small_dodecicosacron"/>
+<option _label="Small dodecahemidodecahedron" arg-set="-which small_dodecahemidodecahedron"/>
+<option _label="Small dodecahemidodecacron" arg-set="-which small_dodecahemidodecacron"/>
+<option _label="Great stellated dodecahedron" arg-set="-which great_stellated_dodecahedron"/>
+<option _label="Great icosahedron" arg-set="-which great_icosahedron"/>
+<option _label="Great icosidodecahedron" arg-set="-which great_icosidodecahedron"/>
+<option _label="Great rhombic triacontahedron" arg-set="-which great_rhombic_triacontahedron"/>
+<option _label="Great truncated icosahedron" arg-set="-which great_truncated_icosahedron"/>
+<option _label="Great stellapentakisdodecahedron" arg-set="-which great_stellapentakisdodecahedron"/>
+<option _label="Rhombicosahedron" arg-set="-which rhombicosahedron"/>
+<option _label="Rhombicosacron" arg-set="-which rhombicosacron"/>
+<option _label="Great snub icosidodecahedron" arg-set="-which great_snub_icosidodecahedron"/>
+<option _label="Great pentagonal hexecontahedron" arg-set="-which great_pentagonal_hexecontahedron"/>
+<option _label="Small stellated truncated dodecahedron" arg-set="-which small_stellated_truncated_dodecahedron"/>
+<option _label="Great pentakisdodecahedron" arg-set="-which great_pentakisdodecahedron"/>
+<option _label="Truncated dodecadodecahedron" arg-set="-which truncated_dodecadodecahedron"/>
+<option _label="Medial disdyakistriacontahedron" arg-set="-which medial_disdyakistriacontahedron"/>
+<option _label="Inverted snub dodecadodecahedron" arg-set="-which inverted_snub_dodecadodecahedron"/>
+<option _label="Medial inverted pentagonal hexecontahedron" arg-set="-which medial_inverted_pentagonal_hexecontahedron"/>
+<option _label="Great dodecicosidodecahedron" arg-set="-which great_dodecicosidodecahedron"/>
+<option _label="Great dodecacronic hexecontahedron" arg-set="-which great_dodecacronic_hexecontahedron"/>
+<option _label="Small dodecahemicosahedron" arg-set="-which small_dodecahemicosahedron"/>
+<option _label="Small dodecahemicosacron" arg-set="-which small_dodecahemicosacron"/>
+<option _label="Great dodecicosahedron" arg-set="-which great_dodecicosahedron"/>
+<option _label="Great dodecicosacron" arg-set="-which great_dodecicosacron"/>
+<option _label="Great snub dodecicosidodecahedron" arg-set="-which great_snub_dodecicosidodecahedron"/>
+<option _label="Great hexagonal hexecontahedron" arg-set="-which great_hexagonal_hexecontahedron"/>
+<option _label="Great dodecahemicosahedron" arg-set="-which great_dodecahemicosahedron"/>
+<option _label="Great dodecahemicosacron" arg-set="-which great_dodecahemicosacron"/>
+<option _label="Great stellated truncated dodecahedron" arg-set="-which great_stellated_truncated_dodecahedron"/>
+<option _label="Great triakisicosahedron" arg-set="-which great_triakisicosahedron"/>
+<option _label="Great rhombicosidodecahedron" arg-set="-which great_rhombicosidodecahedron"/>
+<option _label="Great deltoidal hexecontahedron" arg-set="-which great_deltoidal_hexecontahedron"/>
+<option _label="Great truncated icosidodecahedron" arg-set="-which great_truncated_icosidodecahedron"/>
+<option _label="Great disdyakistriacontahedron" arg-set="-which great_disdyakistriacontahedron"/>
+<option _label="Great inverted snub icosidodecahedron" arg-set="-which great_inverted_snub_icosidodecahedron"/>
+<option _label="Great inverted pentagonal hexecontahedron" arg-set="-which great_inverted_pentagonal_hexecontahedron"/>
+<option _label="Great dodecahemidodecahedron" arg-set="-which great_dodecahemidodecahedron"/>
+<option _label="Great dodecahemidodecacron" arg-set="-which great_dodecahemidodecacron"/>
+<option _label="Great icosihemidodecahedron" arg-set="-which great_icosihemidodecahedron"/>
+<option _label="Great icosihemidodecacron" arg-set="-which great_icosihemidodecacron"/>
+<option _label="Small retrosnub icosicosidodecahedron" arg-set="-which small_retrosnub_icosicosidodecahedron"/>
+<option _label="Small hexagrammic hexecontahedron" arg-set="-which small_hexagrammic_hexecontahedron"/>
+<option _label="Great rhombidodecahedron" arg-set="-which great_rhombidodecahedron"/>
+<option _label="Great rhombidodecacron" arg-set="-which great_rhombidodecacron"/>
+<option _label="Great retrosnub icosidodecahedron" arg-set="-which great_retrosnub_icosidodecahedron"/>
+<option _label="Great pentagrammic hexecontahedron" arg-set="-which great_pentagrammic_hexecontahedron"/>
+<option _label="Great dirhombicosidodecahedron" arg-set="-which great_dirhombicosidodecahedron"/>
+<option _label="Great dirhombicosidodecacron" arg-set="-which great_dirhombicosidodecacron"/>
+<option _label="Utah teapotahedron" arg-set="-which utah_teapotahedron"/>
+ </select>
+
+ <hgroup>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ </hgroup>
+ <hgroup>
+ <boolean id="titles" _label="Show description" arg-unset="-no-titles"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The 75 uniform polyhedra and their duals, plus 5 prisms
+and antiprisms, and some information about each.
+
+https://en.wikipedia.org/wiki/Uniform_polyhedra
+https://en.wikipedia.org/wiki/Stellation
+https://en.wikipedia.org/wiki/Dual_polyhedron
+https://en.wikipedia.org/wiki/Antiprism
+
+Written by Dr. Zvi Har'El and Jamie Zawinski; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/polyominoes.xml b/hacks/config/polyominoes.xml
new file mode 100644
index 0000000..74b05f2
--- /dev/null
+++ b/hacks/config/polyominoes.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="polyominoes" _label="Polyominoes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=6j2H2gL8cws"/>
+
+ <boolean id="identical" _label="Identical pieces" arg-set="-identical"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="500" high="5000" default="2000"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="2" high="255" default="64"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Repeatedly attempts to completely fill a rectangle with
+irregularly-shaped puzzle pieces.
+
+https://en.wikipedia.org/wiki/Polyomino
+
+Written by Stephen Montgomery-Smith; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/polytopes.xml b/hacks/config/polytopes.xml
new file mode 100644
index 0000000..1e6f1f3
--- /dev/null
+++ b/hacks/config/polytopes.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="polytopes" _label="Polytopes" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=MKZQ5Q7QINM"/>
+
+ <hgroup>
+ <vgroup>
+ <select id="display-mode">
+ <option id="wire" _label="Wireframe mesh"
+ arg-set="-mode wireframe"/>
+ <option id="surface" _label="Solid surface"
+ arg-set="-mode surface"/>
+ <option id="transparent" _label="Transparent surface"/>
+ </select>
+
+ <select id="polytope">
+ <option id="random" _label="Random object"/>
+ <option id="cell-5" _label="5-cell (hyper-tetrahedron)"
+ arg-set="-polytope 5-cell"/>
+ <option id="cell-8" _label="8-cell (hypercube / tesseract)"
+ arg-set="-polytope 8-cell"/>
+ <option id="cell-16" _label="16-cell (hyper-octahedron)"
+ arg-set="-polytope 16-cell"/>
+ <option id="cell-24" _label="24-cell"
+ arg-set="-polytope 24-cell"/>
+ <option id="cell-120" _label="120-cell"
+ arg-set="-polytope 120-cell"/>
+ <option id="cell-600" _label="600-cell"
+ arg-set="-polytope 600-cell"/>
+ </select>
+
+ <select id="colors">
+ <option id="single" _label="Single color" arg-set="-single-color"/>
+ <option id="depth" _label="Colors By 4D Depth"/>
+ </select>
+
+ <select id="projection3d">
+ <option id="perspective-3d" _label="Perspective 3D"/>
+ <option id="orthographic-3d" _label="Orthographic 3D"
+ arg-set="-orthographic-3d"/>
+ </select>
+
+ <select id="projection4d">
+ <option id="perspective-4d" _label="Perspective 4D"/>
+ <option id="orthographic-4d" _label="Orthographic 4D"
+ arg-set="-orthographic-4d"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </vgroup>
+
+ <vgroup>
+ <number id="speed-wx" type="slider" arg="-speed-wx %"
+ _label="WX rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.1"/>
+
+ <number id="speed-wy" type="slider" arg="-speed-wy %"
+ _label="WY rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.3"/>
+
+ <number id="speed-wz" type="slider" arg="-speed-wz %"
+ _label="WZ rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.5"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="25000"
+ convert="invert"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="speed-xy" type="slider" arg="-speed-xy %"
+ _label="XY rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.7"/>
+
+ <number id="speed-xz" type="slider" arg="-speed-xz %"
+ _label="XZ rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.9"/>
+
+ <number id="speed-yz" type="slider" arg="-speed-yz %"
+ _label="YZ rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="2.1"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The six regular 4D polytopes rotating in 4D.
+
+Inspired by H.S.M Coxeter's book "Regular Polytopes", 3rd Edition,
+Dover Publications, Inc., 1973, and Thomas Banchoff's book "Beyond the
+Third Dimension: Geometry, Computer Graphics, and Higher Dimensions",
+Scientific American Library, 1990.
+
+https://en.wikipedia.org/wiki/Hypercube
+https://en.wikipedia.org/wiki/Tesseract
+https://en.wikipedia.org/wiki/Regular_polytope
+
+Written by Carsten Steger; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/pong.xml b/hacks/config/pong.xml
new file mode 100644
index 0000000..6ae353a
--- /dev/null
+++ b/hacks/config/pong.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="pong" _label="Pong">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=2jPmisDwwi0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Game speed" _low-label="Slow" _high-label="Fast"
+ low="1" high="20" default="6"/>
+
+ <number id="noise" type="slider" arg="-noise %"
+ _label="Noise" _low-label="Crisp" _high-label="Noisy"
+ low="0.00" high="5.00" default="0.04"/>
+
+ <hgroup>
+ <boolean id="clock" _label="Clock mode" arg-set="-clock"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+ </vgroup>
+
+ <vgroup>
+ <number id="tvbrightness" type="slider" arg="-tv-brightness %"
+ _label="Brightness Knob" _low-label="Low" _high-label="High"
+ low="-75.0" high="100.0" default="3.0"/>
+ <number id="tvcontrast" type="slider" arg="-tv-contrast %"
+ _label="Contrast Knob" _low-label="Low" _high-label="High"
+ low="0" high="500" default="150"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The 1971 Pong home video game, including artifacts of an old color TV set.
+
+In clock mode, the score keeps track of the current time.
+
+https://en.wikipedia.org/wiki/Pong
+
+Written by Jeremy English, Trevor Blackwell and Jamie Zawinski; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/popsquares.xml b/hacks/config/popsquares.xml
new file mode 100644
index 0000000..8bc519a
--- /dev/null
+++ b/hacks/config/popsquares.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="popsquares" _label="PopSquares">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=99Aweq7Nypc"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="25000"
+ convert="invert"/>
+
+ <number id="subdivision" type="spinbutton" arg="-subdivision %"
+ _label="Subdivision"
+ low="1" high="64" default="5"/>
+
+ <number id="border" type="spinbutton" arg="-border %"
+ _label="Border"
+ low="0" high="5" default="1"/>
+
+ <number id="ncolors" type="spinbutton" arg="-ncolors %"
+ _label="Number of colors" low="1" high="512" default="128"/>
+
+ <hgroup>
+ <select id="bg">
+ <option id="lred" _label="Light red" arg-set="-bg #FF0000"/>
+ <option id="lyellow" _label="Light yellow" arg-set="-bg #FFFF00"/>
+ <option id="lgreen" _label="Light green" arg-set="-bg #00FF00"/>
+ <option id="lcyan" _label="Light cyan" arg-set="-bg #00FFFF"/>
+ <option id="lblue" _label="Light blue"/>
+ <option id="lmagenta" _label="Light magenta" arg-set="-bg #FF00FF"/>
+ </select>
+
+ <select id="fg">
+ <option id="dred" _label="Dark red" arg-set="-fg #8C0000"/>
+ <option id="dyellow" _label="Dark yellow" arg-set="-fg #8C8C00"/>
+ <option id="dgreen" _label="Dark green" arg-set="-fg #008C00"/>
+ <option id="dcyan" _label="Dark cyan" arg-set="-fg #008C8C"/>
+ <option id="dblue" _label="Dark blue"/>
+ <option id="dmagenta" _label="Dark magenta" arg-set="-fg #8C008C"/>
+ </select>
+ </hgroup>
+
+ <boolean id="twitch" _label="Twitch" arg-set="-twitch"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A pop-art-ish looking grid of pulsing colors.
+
+Written by Levi Burton; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/projectiveplane.xml b/hacks/config/projectiveplane.xml
new file mode 100644
index 0000000..fa9dfb8
--- /dev/null
+++ b/hacks/config/projectiveplane.xml
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="projectiveplane" _label="ProjectivePlane" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Zg6ONPUTwUQ"/>
+
+ <hgroup>
+ <select id="display-mode">
+ <option id="random" _label="Random surface"/>
+ <option id="wire" _label="Wireframe mesh" arg-set="-mode wireframe"/>
+ <option id="surface" _label="Solid surface" arg-set="-mode surface"/>
+ <option id="transparent" _label="Transparent surface" arg-set="-mode transparent"/>
+ </select>
+
+ <select id="appearance">
+ <option id="random" _label="Random pattern"/>
+ <option id="solid" _label="Solid object" arg-set="-appearance solid"/>
+ <option id="bands" _label="Distance bands" arg-set="-appearance distance-bands"/>
+ <option id="bands" _label="Direction bands" arg-set="-appearance direction-bands"/>
+ </select>
+
+ <select id="colors">
+ <option id="random" _label="Random coloration"/>
+ <option id="twosided" _label="Two-sided" arg-set="-colors two-sided"/>
+ <option id="rainbow" _label="Distance colors" arg-set="-colors distance"/>
+ <option id="rainbow" _label="Direction colors" arg-set="-colors direction"/>
+ <option id="depth" _label="4d depth colors" arg-set="-colors depth"/>
+ </select>
+
+ <select id="projection3d">
+ <option id="random" _label="Random 3D"/>
+ <option id="perspective-3d" _label="Perspective 3D" arg-set="-projection-3d perspective"/>
+ <option id="orthographic-3d" _label="Orthographic 3D" arg-set="-projection-3d orthographic"/>
+ </select>
+
+ <select id="projection4d">
+ <option id="random" _label="Random 4D"/>
+ <option id="perspective-4d" _label="Perspective 4D" arg-set="-projection-4d perspective"/>
+ <option id="orthographic-4d" _label="Orthographic 4D" arg-set="-projection-4d orthographic"/>
+ </select>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <hgroup>
+ <number id="speed-wx" type="slider" arg="-speed-wx %"
+ _label="WX speed"
+ _low-label="-4" _high-label="4"
+ low="-4.0" high="4.0" default="1.1"/>
+ </hgroup>
+
+ <hgroup>
+ <number id="speed-wy" type="slider" arg="-speed-wy %"
+ _label="WY speed"
+ _low-label="-4" _high-label="4"
+ low="-4.0" high="4.0" default="1.3"/>
+ </hgroup>
+
+ <hgroup>
+ <number id="speed-wz" type="slider" arg="-speed-wz %"
+ _label="WZ speed"
+ _low-label="-4" _high-label="4"
+ low="-4.0" high="4.0" default="1.5"/>
+ </hgroup>
+ </vgroup>
+
+ <vgroup>
+ <hgroup>
+ <number id="speed-xy" type="slider" arg="-speed-xy %"
+ _label="XY speed"
+ _low-label="-4" _high-label="4"
+ low="-4.0" high="4.0" default="1.7"/>
+ </hgroup>
+
+ <hgroup>
+ <number id="speed-xz" type="slider" arg="-speed-xz %"
+ _label="XZ speed"
+ _low-label="-4" _high-label="4"
+ low="-4.0" high="4.0" default="1.9"/>
+ </hgroup>
+
+ <hgroup>
+ <number id="speed-yz" type="slider" arg="-speed-yz %"
+ _label="YZ speed"
+ _low-label="-4" _high-label="4"
+ low="-4.0" high="4.0" default="2.1"/>
+ </hgroup>
+ </vgroup>
+
+ <vgroup>
+ <hgroup>
+ <number id="walk-direction" type="slider" arg="-walk-direction %"
+ _label="Walk dir "
+ _low-label="-180" _high-label="180"
+ low="-180.0" high="180.0" default="83.0"/>
+ </hgroup>
+
+ <hgroup>
+ <number id="walk-speed" type="slider" arg="-walk-speed %"
+ _label="Walk speed"
+ _low-label="1" _high-label="100"
+ low="1.0" high="100.0" default="20.0"/>
+ </hgroup>
+
+ <hgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+ </hgroup>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <select id="view-mode">
+ <option id="walk" _label="Random motion"/>
+ <option id="walk" _label="Walk" arg-set="-view-mode walk"/>
+ <option id="turn" _label="Turn" arg-set="-view-mode turn"/>
+ <option id="walk-turn" _label="Walk and turn" arg-set="-view-mode walk-turn"/>
+ </select>
+
+ <boolean id="orientation-marks" _label="Show orientation marks"
+ arg-set="-orientation-marks"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+ </hgroup>
+
+
+
+ <_description>
+A 4D embedding of the real projective plane.
+
+You can walk on the surface of the real projective plane or rotate it
+in 4D or walk on it while it rotates in 4D. Inspired by Thomas
+Banchoff's book "Beyond the Third Dimension: Geometry, Computer
+Graphics, and Higher Dimensions", Scientific American Library, 1990.
+
+https://en.wikipedia.org/wiki/Real_projective_plane
+https://en.wikipedia.org/wiki/Roman_surface
+https://en.wikipedia.org/wiki/Cross_cap
+https://en.wikipedia.org/wiki/Moebius_strip
+http://mathworld.wolfram.com/RealProjectivePlane.html
+http://mathworld.wolfram.com/RomanSurface.html
+http://mathworld.wolfram.com/Cross-Cap.html
+http://mathworld.wolfram.com/MoebiusStrip.html
+
+Written by Carsten Steger; 2014.
+ </_description>
+</screensaver>
diff --git a/hacks/config/providence.xml b/hacks/config/providence.xml
new file mode 100644
index 0000000..0156dc0
--- /dev/null
+++ b/hacks/config/providence.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="providence" _label="Providence" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=bnwRPPMopWc"/>
+
+ <number id="speed" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <boolean id="eye" _label="Draw eye" arg-unset="-no-eye"/>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+"A pyramid unfinished. In the zenith an eye in a triangle, surrounded
+by a glory, proper."
+
+https://en.wikipedia.org/wiki/Eye_of_Providence
+
+Written by Blair Tennessy; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/pulsar.xml b/hacks/config/pulsar.xml
new file mode 100644
index 0000000..64be3bf
--- /dev/null
+++ b/hacks/config/pulsar.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="pulsar" _label="Pulsar" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=pR0lpvOAbUo"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="quads" type="spinbutton" arg="-quads %"
+ _label="Quad count" low="1" high="50" default="5"/>
+
+ <hgroup>
+ <vgroup>
+ <boolean id="light" _label="Enable lighting" arg-set="-light"/>
+ <boolean id="fog" _label="Enable fog" arg-set="-fog"/>
+ <boolean id="texture" _label="Enable texturing" arg-set="-texture"/>
+ <boolean id="mipmap" _label="Enable texture mipmaps" arg-set="-mipmap"/>
+ </vgroup>
+ <vgroup>
+ <boolean id="no-blend" _label="Enable blending" arg-unset="-no-blend"/>
+ <boolean id="antialias" _label="Anti-alias lines" arg-set="-antialias"/>
+ <boolean id="texture_quality" _label="Enable texture filtering"
+ arg-set="-texture_quality"/>
+ <boolean id="do_depth" _label="Enable depth buffer" arg-set="-do_depth"/>
+ </vgroup>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Intersecting planes, with alpha blending, fog, textures, and mipmaps.
+
+Written by David Konerding; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/pyro.xml b/hacks/config/pyro.xml
new file mode 100644
index 0000000..ca81c3d
--- /dev/null
+++ b/hacks/config/pyro.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="pyro" _label="Pyro">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=JJqVfnMstuw"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Slow" _high-label="Fast"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Particle density" _low-label="Sparse" _high-label="Dense"
+ low="10" high="2000" default="600"/>
+
+ <number id="launch" type="slider" arg="-frequency %"
+ _label="Launch frequency" _low-label="Seldom" _high-label="Often"
+ low="1" high="100" default="30"
+ convert="invert"/>
+
+ <number id="scatter" type="slider" arg="-scatter %"
+ _label="Explosive yield" _low-label="Low" _high-label="High"
+ low="1" high="400" default="100"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Exploding fireworks. See also the "Fireworkx", "Eruption", and
+"XFlame" screen savers.
+
+Written by Jamie Zawinski; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/qix.xml b/hacks/config/qix.xml
new file mode 100644
index 0000000..a2a4ea2
--- /dev/null
+++ b/hacks/config/qix.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="qix" _label="Qix">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=GPqDtJ0vF8U"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="segments" type="slider" arg="-segments %"
+ _label="Segments" _low-label="Few" _high-label="Many"
+ low="10" high="500" default="250"/>
+
+ <number id="spread" type="slider" arg="-spread %"
+ _label="Density" _low-label="Sparse" _high-label="Dense"
+ low="1" high="50" default="8"
+ convert="invert"/>
+
+ <number id="color_contrast" type="slider" arg="-color-shift %"
+ _label="Color contrast" _low-label="Low" _high-label="High"
+ low="0" high="25" default="3"/>
+ </vgroup>
+ <vgroup>
+ <select id="fill">
+ <option id="lines" _label="Line segments" arg-set="-hollow"/>
+ <option id="solid" _label="Solid objects"/>
+ </select>
+
+ <select id="motion">
+ <option id="linear" _label="Linear motion"/>
+ <option id="random" _label="Random motion" arg-set="-random"/>
+ </select>
+
+ <select id="color-mode">
+ <option id="additive" _label="Additive colors"/>
+ <option id="subtractive" _label="Subtractive colors"
+ arg-set="-subtractive"/>
+ </select>
+
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Count" low="0" high="20" default="4"/>
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Max size" low="200" high="1000" default="200"/>
+ <number id="poly" type="spinbutton" arg="-poly %"
+ _label="Poly corners" low="2" high="100" default="2"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="transparent" _label="Transparent" arg-unset="-non-transparent"/>
+ <boolean id="xor" _label="XOR" arg-set="-xor"/>
+ <boolean id="gravity" _label="Gravity" arg-set="-gravity"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Bounces a series of line segments around the screen, and uses
+variations on this basic motion pattern to produce all sorts of
+different presentations: line segments, filled polygons, and
+overlapping translucent areas.
+
+https://en.wikipedia.org/wiki/Qix
+
+Written by Jamie Zawinski; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/quasicrystal.xml b/hacks/config/quasicrystal.xml
new file mode 100644
index 0000000..0823c89
--- /dev/null
+++ b/hacks/config/quasicrystal.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="quasicrystal" _label="QuasiCrystal" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=JsGf65d5TfM"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="5.0" default="1.0"/>
+ </vgroup>
+ <vgroup>
+ <number id="count" type="slider" arg="-count %"
+ _label="Density" _low-label="Low" _high-label="High"
+ low="7" high="37" default="17"
+ convert="invert"/>
+
+ <number id="contrast" type="slider" arg="-contrast %"
+ _label="Contrast" _low-label="Low" _high-label="High"
+ low="0" high="100" default="30"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wander" _label="Displacement" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Rotation" arg-unset="-no-spin"/>
+ <boolean id="symmetric" _label="Symmetry" arg-unset="-no-symmetry"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A quasicrystal is a structure that is ordered but aperiodic.
+Two-dimensional quasicrystals can be generated by adding a set of
+planes where x is the sine of y. Different complex aperiodic plane
+tilings are produced depending on the period, position, and rotation
+of the component planes, and whether the rotation of the planes is
+evenly distributed around the circle (the "symmetry" option, above)
+or random.
+
+See also the "RD-Bomb", "CWaves" and "Penrose" screen savers.
+
+https://en.wikipedia.org/wiki/Quasicrystal
+
+Written by Jamie Zawinski; 2013.
+ </_description>
+</screensaver>
diff --git a/hacks/config/queens.xml b/hacks/config/queens.xml
new file mode 100644
index 0000000..aa949fd
--- /dev/null
+++ b/hacks/config/queens.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="queens" _label="Queens" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Ssy0ldFDeAs"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <hgroup>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The N-Queens problem: how to place N queens on an NxN chessboard
+such that no queen can attack a sister?
+
+See also the "Endgame" screen saver.
+
+https://en.wikipedia.org/wiki/Eight_queens_puzzle
+
+Written by Blair Tennessy and Jamie Zawinski; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/raverhoop.xml b/hacks/config/raverhoop.xml
new file mode 100644
index 0000000..4932255
--- /dev/null
+++ b/hacks/config/raverhoop.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="raverhoop" _label="RaverHoop" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=0k2sP_Imb80" />
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Colors" _low-label="1" _high-label="64"
+ low="1" high="64" default="12"/>
+
+ <number id="lights" type="slider" arg="-lights %"
+ _label="Lights" _low-label="Sparse" _high-label="Dense"
+ low="3" high="512" default="200"/>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed, motion" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="5.0" default="1.0"/>
+
+ <number id="light-speed" type="slider" arg="-light-speed %"
+ _label="Speed, lights" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="5.0" default="1.0"/>
+
+ <number id="sustain" type="slider" arg="-sustain %"
+ _label="Sustain" _low-label="Brief" _high-label="Long"
+ low="0.1" high="5.0" default="1.0"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-set="-wander"/>
+ <boolean id="spin" _label="Spin" arg-set="-spin"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Simulates an LED hula hoop in a dark room. Oontz oontz oontz.
+
+Written by Jamie Zawinski; 2016.
+ </_description>
+</screensaver>
diff --git a/hacks/config/razzledazzle.xml b/hacks/config/razzledazzle.xml
new file mode 100644
index 0000000..1af07df
--- /dev/null
+++ b/hacks/config/razzledazzle.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="razzledazzle" _label="RazzleDazzle" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=tV_70VxJFfs" />
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="10" default="1.0"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Colors" _low-label="Mono" _high-label="Many"
+ low="2" high="200" default="2"/>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="density" type="slider" arg="-density %"
+ _label="Density" _low-label="Sparse" _high-label="Dense"
+ low="1.0" high="10.0" default="5.0"/>
+
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Lines" _low-label="Thick" _high-label="Thin"
+ low="0.05" high="1.0" default="0.1"/>
+
+ <select id="object">
+ <option _label="Ship Outlines" arg-set="-mode ships"/>
+ <option _label="Flat Pattern" arg-set="-mode flat"/>
+ <option id="random" _label="Ships or flat pattern"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Generates an infinitely-scrolling sequence of dazzle camouflage patterns.
+
+Dazzle Ships, in addition to being the best album by Orchestral
+Manoeuvres in the Dark, were military vessels during World War I and
+early in World War II that were painted not to conceal but to confuse:
+with these Cubist overlapping stripes, it was very hard to estimate
+their size, range and heading. This was a big deal before the
+invention of Radar.
+
+https://en.wikipedia.org/wiki/Dazzle_camouflage
+https://en.wikipedia.org/wiki/Cubism
+https://en.wikipedia.org/wiki/Dazzle_Ships_%28album%29
+https://en.wikipedia.org/wiki/Acoustic_mirror
+https://en.wikipedia.org/wiki/Radar
+
+Written by Jamie Zawinski; 2018.
+ </_description>
+</screensaver>
diff --git a/hacks/config/rd-bomb.xml b/hacks/config/rd-bomb.xml
new file mode 100644
index 0000000..c8a656d
--- /dev/null
+++ b/hacks/config/rd-bomb.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="rd-bomb" _label="RDbomb">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=xiooDyrZSsY"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Slow" _high-label="Fast"
+ low="0" high="250000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Wander speed" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="10.0" default="0.0"/>
+
+ <number id="size" type="slider" arg="-size %"
+ _label="Fill screen" _low-label="1%" _high-label="100%"
+ low="0.01" high="1.0" default="1.0"/>
+ </vgroup>
+ <vgroup>
+ <number id="epoch" type="slider" arg="-epoch %"
+ _label="Epoch" _low-label="Small" _high-label="Large"
+ low="1000" high="300000" default="40000"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="255"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <number id="width" type="spinbutton" arg="-width %"
+ _label="X tile size" low="0" high="500" default="0"/>
+ <number id="pixheight" type="spinbutton" arg="-height %"
+ _label="Y tile size" low="0" high="500" default="0"/>
+ </vgroup>
+ <vgroup>
+ <number id="reaction" type="spinbutton" arg="-reaction %"
+ _label="Reaction" low="-1" high="2" default="-1"/>
+ <number id="diffusion" type="spinbutton" arg="-diffusion %"
+ _label="Diffusion" low="-1" high="2" default="-1"/>
+
+ <!-- #### default is wrong -->
+ <number id="radius" type="spinbutton" arg="-radius %"
+ _label="Seed radius" low="-1" high="60" default="-1"/>
+
+ </vgroup>
+
+ </hgroup>
+
+ <_description>
+Reaction-diffusion: draws a grid of growing square-like shapes that,
+once they overtake each other, react in unpredictable ways.
+
+Written by Scott Draves; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/rdbomb.xml b/hacks/config/rdbomb.xml
new file mode 120000
index 0000000..b70f7a7
--- /dev/null
+++ b/hacks/config/rdbomb.xml
@@ -0,0 +1 @@
+rd-bomb.xml \ No newline at end of file
diff --git a/hacks/config/ripples.xml b/hacks/config/ripples.xml
new file mode 100644
index 0000000..191e041
--- /dev/null
+++ b/hacks/config/ripples.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="ripples" _label="Ripples">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=w8YXAalnRzc"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="50000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="120"/>
+
+ <number id="rate" type="slider" arg="-rate %"
+ _label="Drippiness" _low-label="Drizzle" _high-label="Storm"
+ low="1" high="100" default="5"
+ convert="invert"/>
+
+ <number id="fluidity" type="slider" arg="-fluidity %"
+ _label="Fluidity" _low-label="Small drops" _high-label="Big drops"
+ low="0" high="16" default="6"
+ convert="invert"/>
+ </vgroup>
+ <vgroup>
+
+ <hgroup>
+ <boolean id="stir" _label="Moving splashes" arg-set="-stir"/>
+ <boolean id="oily" _label="Psychedelic colors" arg-set="-oily"/>
+ <boolean id="gray" _label="Grayscale" arg-set="-grayscale"/>
+ </hgroup>
+
+ <xscreensaver-image />
+
+ <number id="light" type="spinbutton" arg="-light %"
+ _label="Magic lighting effect" low="0" high="8" default="4"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ </vgroup>
+ </hgroup>
+
+ <_description>
+Rippling interference patterns reminiscent of splashing water
+distort a loaded image.
+
+Written by Tom Hammersley; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/rocks.xml b/hacks/config/rocks.xml
new file mode 100644
index 0000000..964de82
--- /dev/null
+++ b/hacks/config/rocks.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="rocks" _label="Rocks">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=7x7PMI7LFK0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="50000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="Few" _high-label="Many"
+ low="0" high="200" default="100"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Velocity" _low-label="Slow" _high-label="Fast"
+ low="1" high="100" default="100"/>
+
+ <hgroup>
+ <boolean id="rotate" _label="Rotation" arg-unset="-no-rotate"/>
+ <boolean id="steer" _label="Steering" arg-unset="-no-move"/>
+ <boolean id="3d" _label="Do Red/Blue 3D separation" arg-set="-3d"/>
+ </hgroup>
+
+ <number id="ncolors" type="slider" arg="-colors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="5"/>
+
+ <!-- #### -delta3d [1.5] -->
+ <!-- #### -left3d [Blue] -->
+ <!-- #### -right3d [Red] -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+An asteroid field zooms by.
+
+Written by Jamie Zawinski; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/romanboy.xml b/hacks/config/romanboy.xml
new file mode 100644
index 0000000..b2f6cb4
--- /dev/null
+++ b/hacks/config/romanboy.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<screensaver name="romanboy" _label="RomanBoy" gl="yes">
+
+ <video href="https://www.youtube.com/watch?v=KEW5TuPbWyg"/>
+
+ <command arg="-root"/>
+
+ <hgroup>
+ <select id="view-mode">
+ <option id="walk" _label="Random motion"/>
+ <option id="walk" _label="Walk" arg-set="-view-mode walk"/>
+ <option id="turn" _label="Turn" arg-set="-view-mode turn"/>
+ </select>
+
+ <number id="surface-order" type="spinbutton" arg="-surface-order %"
+ _label="Order of the surface" low="2" high="9" default="3"/>
+
+ <boolean id="orientation-marks" _label="Show orientation marks"
+ arg-set="-orientation-marks"/>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="deform" _label="Deform the projective plane"
+ arg-unset="-no-deform"/>
+
+ <number id="deform-speed" type="slider" arg="-deformation-speed %"
+ _label="Deformation speed"
+ _low-label="1.0" _high-label="100.0"
+ low="1.0" high="100.0" default="10.0"/>
+
+ <number id="init-deform" type="slider" arg="-initial-deformation %"
+ _label="Initial deformation"
+ _low-label="0.0" _high-label="1000.0"
+ low="0.0" high="1000.0" default="1000.0"/>
+ </hgroup>
+
+
+ <hgroup>
+
+ <vgroup>
+ <select id="display-mode">
+ <option id="random" _label="Random surface"/>
+ <option id="wire" _label="Wireframe mesh" arg-set="-mode wireframe"/>
+ <option id="surface" _label="Solid surface" arg-set="-mode surface"/>
+ <option id="transparent" _label="Transparent surface" arg-set="-mode transparent"/>
+ </select>
+
+ <select id="appearance">
+ <option id="random" _label="Random pattern"/>
+ <option id="solid" _label="Solid object" arg-set="-appearance solid"/>
+ <option id="bands" _label="Distance bands" arg-set="-appearance distance-bands"/>
+ <option id="bands" _label="Direction bands" arg-set="-appearance direction-bands"/>
+ </select>
+
+ <select id="colors">
+ <option id="random" _label="Random coloration"/>
+ <option id="twosided" _label="Two-sided" arg-set="-colors two-sided"/>
+ <option id="rainbow" _label="Distance colors" arg-set="-colors distance"/>
+ <option id="rainbow" _label="Direction colors" arg-set="-colors direction"/>
+ </select>
+
+ <select id="projection">
+ <option id="random" _label="Random Projection"/>
+ <option id="perspective" _label="Perspective" arg-set="-projection perspective"/>
+ <option id="orthographic" _label="Orthographic" arg-set="-projection orthographic"/>
+ </select>
+ </vgroup>
+
+ <vgroup>
+ <number id="speed-x" type="slider" arg="-speed-x %"
+ _label="X rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.1"/>
+
+ <number id="speed-y" type="slider" arg="-speed-y %"
+ _label="Y rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.3"/>
+
+ <number id="speed-z" type="slider" arg="-speed-z %"
+ _label="Z rotation speed"
+ _low-label="-4.0" _high-label="4.0"
+ low="-4.0" high="4.0" default="1.5"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="walk-direction" type="slider" arg="-walk-direction %"
+ _label="Walking direction"
+ _low-label="-180.0" _high-label="180.0"
+ low="-180.0" high="180.0" default="83.0"/>
+
+ <number id="walk-speed" type="slider" arg="-walk-speed %"
+ _label="Walking speed"
+ _low-label="1.0" _high-label="100.0"
+ low="1.0" high="100.0" default="20.0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+ </vgroup>
+
+ <vgroup>
+ <xscreensaver-updater />
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+
+ </hgroup>
+
+ <_description>
+A 3D immersion of the real projective plane that smoothly deforms
+between the Roman surface and the Boy surface.
+
+You can walk on the surface of the real projective plane or rotate it
+in 3D. Furthermore, it is possible to smoothly deform the real
+projective plane between the Roman surface and the Boy surface while
+turning it or walking on it. Inspired by François Apéry's book
+"Models of the Real Projective Plane", Vieweg, 1987.
+
+https://en.wikipedia.org/wiki/Boy%27s_surface
+https://en.wikipedia.org/wiki/Roman_surface
+http://mathworld.wolfram.com/BoySurface.html
+http://mathworld.wolfram.com/RomanSurface.html
+
+Written by Carsten Steger; 2014.
+ </_description>
+</screensaver>
diff --git a/hacks/config/rorschach.xml b/hacks/config/rorschach.xml
new file mode 100644
index 0000000..e4f0207
--- /dev/null
+++ b/hacks/config/rorschach.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="rorschach" _label="Rorschach">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=G1OLn4Mdk5Y"/>
+
+ <number id="iterations" type="slider" arg="-iterations %"
+ _label="Iterations" _low-label="Small" _high-label="Large"
+ low="0" high="10000" default="4000"/>
+
+ <number id="offset" type="slider" arg="-offset %"
+ _label="Offset" _low-label="Small" _high-label="Large"
+ low="0" high="50" default="7"/>
+
+ <boolean id="xsymmetry" _label="With X symmetry" arg-unset="-no-xsymmetry"/>
+ <boolean id="ysymmetry" _label="With Y symmetry" arg-set="-ysymmetry"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Linger" _low-label="1 second" _high-label="1 minute"
+ low="1" high="60" default="5"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Inkblot patterns via a reflected random walk.
+
+https://en.wikipedia.org/wiki/Rorschach_inkblot_test
+https://en.wikipedia.org/wiki/Random_walk
+
+Written by Jamie Zawinski; 1992.
+ </_description>
+</screensaver>
diff --git a/hacks/config/rotor.xml b/hacks/config/rotor.xml
new file mode 100644
index 0000000..2ffddf1
--- /dev/null
+++ b/hacks/config/rotor.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="rotor" _label="Rotor">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=HWcEvT1keDA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Length" _low-label="Short" _high-label="Long"
+ low="2" high="100" default="20"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="200"/>
+
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Count" low="0" high="20" default="4"/>
+
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Size" low="-50" high="50" default="-6"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Draws a line segment moving along a complex spiraling curve.
+
+Written by Tom Lawrence; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/rotzoomer.xml b/hacks/config/rotzoomer.xml
new file mode 100644
index 0000000..d610fcb
--- /dev/null
+++ b/hacks/config/rotzoomer.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="rotzoomer" _label="RotZoomer">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=ecl8ykLswX8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000" convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="120"/>
+
+ <number id="n" type="spinbutton" arg="-n %"
+ _label="Rectangle count" low="1" high="20" default="2"/>
+
+ <select id="mode">
+ <option id="random" _label="Random"/>
+ <option id="stationary" _label="Stationary rectangles" arg-set="-mode stationary"/>
+ <option id="move" _label="Wandering rectangles" arg-set="-mode move"/>
+ <option id="sweep" _label="Sweeping arcs" arg-set="-mode sweep"/>
+ <option id="circle" _label="Rotating discs" arg-set="-mode circle"/>
+ </select>
+
+ <boolean id="anim" _label="Animate" arg-unset="-no-anim"/>
+
+<!-- <boolean id="shm" _label="Use shared memory" arg-unset="-no-shm"/> -->
+
+ <xscreensaver-image />
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Distorts an image by rotating and scaling random sections of it.
+
+Written by Claudio Matsuoka and Jamie Zawinski; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/rubik.xml b/hacks/config/rubik.xml
new file mode 100644
index 0000000..f48668b
--- /dev/null
+++ b/hacks/config/rubik.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="rubik" _label="Rubik" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=AQdJgvyVkXU"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Count" low="-100" high="100" default="-30"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Rotation" _low-label="Slow" _high-label="Fast"
+ low="3" high="200" default="20"
+ convert="invert"/>
+
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Size" low="-20" high="20" default="-6"/>
+
+ <boolean id="shuffle" _label="Hide shuffling" arg-set="-hideshuffling"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A Rubik's Cube that repeatedly shuffles and solves itself.
+See also the "GLSnake" and "Cube21" screen savers.
+
+https://en.wikipedia.org/wiki/Rubik%27s_Cube
+
+Written by Marcelo Vianna; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/rubikblocks.xml b/hacks/config/rubikblocks.xml
new file mode 100644
index 0000000..de96caf
--- /dev/null
+++ b/hacks/config/rubikblocks.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="rubikblocks" _label="RubikBlocks" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=B2sGaRLWz-A"/>
+
+ <hgroup>
+ <vgroup>
+
+ <number id="speed" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000" convert="invert"/>
+
+ <number id="cubesize" type="slider" arg="-cubesize %"
+ _label="Cube size" _low-label="Small" _high-label="Large"
+ low="0.4" high="2.0" default="1.0"/>
+
+ <number id="rotspeed" type="slider" arg="-rotspeed %"
+ _label="Rotation" _low-label="Slow" _high-label="Fast"
+ low="1.0" high="10.0" default="3.0"/>
+
+ <select id="start">
+ <option id="cube" _label="Start as cube"/>
+ <option id="shuffle" _label="Start as random shape" arg-set="-randomize"/>
+ </select>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="spinspeed" type="slider" arg="-spinspeed %"
+ _label="Spin" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="4.0" default="0.1"/>
+
+ <number id="wanderspeed" type="slider" arg="-wanderspeed %"
+ _label="Wander" _low-label="Slow" _high-label="Fast"
+ low="0.001" high="0.1" default="0.005"/>
+
+ <number id="wait" type="slider" arg="-wait %"
+ _label="Linger" _low-label="Short" _high-label="Long"
+ low="10.0" high="100.0" default="40.0"/>
+
+ <hgroup>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="tex" _label="Outlines" arg-unset="-no-texture"/>
+ </hgroup>
+ <hgroup>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The "Rubik's Mirror Blocks" puzzle.
+See also the "Rubik", "Cube21", and "GLSnake" screen savers.
+
+https://en.wikipedia.org/wiki/Combination_puzzles#Irregular_cuboids
+
+Written by Vasek Potocek; 2009.
+ </_description>
+</screensaver>
diff --git a/hacks/config/sballs.xml b/hacks/config/sballs.xml
new file mode 100644
index 0000000..6a72def
--- /dev/null
+++ b/hacks/config/sballs.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="sballs" _label="SBalls" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=pcfqdvvPG8k"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <select id="object">
+ <option id="random" _label="Random"/>
+ <option id="tetra" _label="Tetrahedron" arg-set="-object 1"/>
+ <option id="cube" _label="Cube" arg-set="-object 2"/>
+ <option id="octa" _label="Octahedron" arg-set="-object 3"/>
+ <option id="dodeca" _label="Dodecahedron" arg-set="-object 4"/>
+ <option id="icosa" _label="Icosahedron" arg-set="-object 5"/>
+ <option id="plane" _label="Plane" arg-set="-object 6"/>
+ <option id="pyramid" _label="Pyramid" arg-set="-object 7"/>
+ <option id="star" _label="Star" arg-set="-object 8"/>
+ </select>
+
+ <boolean id="tex" _label="Textured" arg-unset="-no-texture"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Textured balls spinning like crazy.
+
+Written by Eric Lassauge; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/shadebobs.xml b/hacks/config/shadebobs.xml
new file mode 100644
index 0000000..f34c5b9
--- /dev/null
+++ b/hacks/config/shadebobs.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="shadebobs" _label="ShadeBobs">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=gJtxnQ5_8Zk"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="20000" default="10000"
+ convert="invert"/>
+
+ <!-- #### -degrees [0] -->
+ <!-- #### -color [random] -->
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="One" _high-label="Many"
+ low="1" high="20" default="4"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="0" high="100" default="10"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Oscillating oval patterns that look something like vapor trails or neon tubes.
+
+Written by Shane Smit; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/sierpinski.xml b/hacks/config/sierpinski.xml
new file mode 100644
index 0000000..3aec43d
--- /dev/null
+++ b/hacks/config/sierpinski.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="sierpinski" _label="Sierpinski">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=m0zdPWuFhjA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="1000000" default="400000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Points" _low-label="Few" _high-label="Many"
+ low="10" high="10000" default="2000"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Timeout" _low-label="Small" _high-label="Large"
+ low="0" high="1000" default="100"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+The 2D Sierpinski triangle fractal. See also the "Sierpinski3D" screen saver.
+
+https://en.wikipedia.org/wiki/Sierpinski_triangle
+
+Written by Desmond Daignault; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/sierpinski3d.xml b/hacks/config/sierpinski3d.xml
new file mode 100644
index 0000000..782fe9d
--- /dev/null
+++ b/hacks/config/sierpinski3d.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="sierpinski3d" _label="Sierpinski3D" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=TGQRLAhDLv0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="descent" type="slider" arg="-speed %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="2" high="500" default="150"
+ convert="invert"/>
+
+ <number id="depth" type="spinbutton" arg="-depth %"
+ _label="Max depth" low="1" high="6" default="5"/>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+The recursive Sierpinski tetrahedron fractal.
+
+https://en.wikipedia.org/wiki/Sierpinski_triangle#Analogs_in_higher_dimension
+
+Written by Jamie Zawinski and Tim Robinson; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/skytentacles.xml b/hacks/config/skytentacles.xml
new file mode 100644
index 0000000..e6d1b5b
--- /dev/null
+++ b/hacks/config/skytentacles.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="skytentacles" _label="SkyTentacles" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=iCjtXUSQv1A"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="count" type="slider" arg="-count %"
+ _label="Tentacles" _low-label="1" _high-label="20"
+ low="1" high="20" default="9"/>
+
+ <number id="length" type="slider" arg="-length %"
+ _label="Length" _low-label="Short" _high-label="Long"
+ low="1.0" high="20.0" default="9.0"/>
+
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Thickness" _low-label="Thin" _high-label="Thick"
+ low="0.1" high="5.0" default="1.0"/>
+
+ <number id="flexibility" type="slider" arg="-flexibility %"
+ _label="Flexibility" _low-label="Low" _high-label="High"
+ low="0.1" high="1.0" default="0.35"/>
+
+ <number id="wiggliness" type="slider" arg="-wiggliness %"
+ _label="Wiggliness" _low-label="Low" _high-label="High"
+ low="0.1" high="1.0" default="0.35"/>
+
+ </vgroup>
+
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Slow" _high-label="Fast"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="8.0" default="1.0"/>
+
+ <number id="slices" type="slider" arg="-slices %"
+ _label="X resolution" _low-label="Low" _high-label="High"
+ low="3" high="50" default="16"/>
+ <number id="segments" type="slider" arg="-segments %"
+ _label="Y resolution" _low-label="Low" _high-label="High"
+ low="2" high="50" default="24"/>
+
+ <hgroup>
+ <boolean id="skin" _label="Draw skin" arg-unset="-no-texture"/>
+ <boolean id="cel" _label="Cartoony" arg-set="-cel"/>
+ <boolean id="intersect" _label="Tentacles can intersect" arg-set="-intersect"/>
+ </hgroup>
+ <hgroup>
+ <boolean id="smooth" _label="Smooth" arg-unset="-no-smooth"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ </vgroup>
+ </hgroup>
+
+
+ <xscreensaver-updater />
+
+ <_description>
+There is a tentacled abomination in the sky. From above you it devours.
+
+Written by Jamie Zawinski; 2008.
+ </_description>
+</screensaver>
diff --git a/hacks/config/slidescreen.xml b/hacks/config/slidescreen.xml
new file mode 100644
index 0000000..3018998
--- /dev/null
+++ b/hacks/config/slidescreen.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="slidescreen" _label="SlideScreen">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=uKNE4xCdlno"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="50000"
+ convert="invert"/>
+
+ <number id="delay2" type="slider" arg="-delay2 %"
+ _label="Pause" _low-label="Short" _high-label="Long"
+ low="0" high="2000000" default="1000000"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="120"/>
+
+ <xscreensaver-image />
+
+ </vgroup>
+ <vgroup>
+ <number id="increment" type="slider" arg="-increment %"
+ _label="Slide speed" _low-label="Slow" _high-label="Fast"
+ low="1" high="30" default="10"/>
+
+ <number id="grid-size" type="slider" arg="-grid-size %"
+ _label="Cell size" _low-label="Small" _high-label="Large"
+ low="12" high="500" default="70"/>
+
+ <number id="ibw" type="spinbutton" arg="-ibw %"
+ _label="Gutter size" low="0" high="50" default="4"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ </vgroup>
+ </hgroup>
+
+ <_description>
+A variant on a "fifteen puzzle", operating on the screen or an image.
+It divides the image into a grid and randomly shuffles the squares.
+
+https://en.wikipedia.org/wiki/Fifteen_puzzle
+
+Written by Jamie Zawinski; 1994.
+ </_description>
+</screensaver>
diff --git a/hacks/config/slip.xml b/hacks/config/slip.xml
new file mode 100644
index 0000000..5a656f3
--- /dev/null
+++ b/hacks/config/slip.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="slip" _label="Slip">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=BgzNvBm4MuE"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="50000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="Few" _high-label="Many"
+ low="0" high="100" default="35"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Timeout" _low-label="Small" _high-label="Large"
+ low="0" high="100" default="50"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="200"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-image />
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A jet engine consumes the screen, then puts it through a spin cycle.
+
+Written by Scott Draves and Jamie Zawinski; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/sonar.xml b/hacks/config/sonar.xml
new file mode 100644
index 0000000..e459c51
--- /dev/null
+++ b/hacks/config/sonar.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="sonar" _label="Sonar" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=XEL8g3qbthE"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="8.0" default="1.0"/>
+
+ <select id="ping">
+ <option id="sn" _label="Ping local subnet"/>
+<!--
+ <option id="24" _label="Ping subnet/24 (254 hosts)" arg-set="-ping subnet/24"/>
+ <option id="25" _label="Ping subnet/25 (126 hosts)" arg-set="-ping subnet/25"/>
+ <option id="26" _label="Ping subnet/26 (62 hosts)" arg-set="-ping subnet/26"/>
+ <option id="27" _label="Ping subnet/27 (31 hosts)" arg-set="-ping subnet/27"/>
+ <option id="28" _label="Ping subnet/28 (14 hosts)"/>
+ <option id="29" _label="Ping subnet/29 (6 hosts)" arg-set="-ping subnet/29"/>
+ <option id="30" _label="Ping subnet/30 (2 hosts)" arg-set="-ping subnet/30"/>
+-->
+
+ <option id="ssh" _label="Ping known SSH hosts" arg-set="-ping /etc/hosts,$HOME/.ssh/known_hosts,$HOME/.ssh/known_hosts2"/>
+
+ <option id="popular" _label="Ping Google, Facebook, etc." arg-set="-ping google.com,facebook.com,twitter.com,yahoo.com,flickr.com,www.apple.com,wikipedia.org,linux.org,youtube.com,disqus.com,blogger.com,wordpress.com,tumblr.com,whitehouse.gov"/>
+
+ <option id="sim" _label="Simulation (don't ping)" arg-set="-ping simulation"/>
+ </select>
+ </vgroup>
+
+ <vgroup>
+ <number id="font" type="slider" arg="-font-size %"
+ _label="Font size" _low-label="Tiny" _high-label="Huge"
+ low="6.0" high="24.0" default="12"/>
+
+ <number id="sweep" type="slider" arg="-sweep-size %"
+ _label="Trail length" _low-label="Short" _high-label="Long"
+ low="0.02" high="0.7" default="0.3"/>
+ </vgroup>
+ </hgroup>
+
+
+ <hgroup>
+ <string id="aname" _label="Simulation team A name" arg="-team-a-name %"/>
+ <number id="acount" type="spinbutton" arg="-team-a-count %"
+ _label="A count" low="1" high="100" default="4"/>
+ </hgroup>
+
+ <hgroup>
+ <string id="bname" _label="Simulation team B name" arg="-team-b-name %"/>
+ <number id="bcount" type="spinbutton" arg="-team-b-count %"
+ _label="B count" low="1" high="100" default="4"/>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="dns" _label="Resolve host names" arg-unset="-no-dns"/>
+ <boolean id="times" _label="Show ping times" arg-unset="-no-times"/>
+ <boolean id="wobble" _label="Tilt" arg-unset="-no-wobble"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A sonar display pings (get it?) the hosts on your local network, and
+plots their distance (response time) from you. The three rings
+represent ping times of approximately 2.5, 70 and 2,000 milliseconds
+respectively.
+
+Alternately, it can run a simulation that doesn't involve hosts.
+
+https://en.wikipedia.org/wiki/Ping#History
+
+Written by Jamie Zawinski and Stephen Martin; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/speedmine.xml b/hacks/config/speedmine.xml
new file mode 100644
index 0000000..cf7b88a
--- /dev/null
+++ b/hacks/config/speedmine.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="speedmine" _label="SpeedMine">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=awOnhCxRD_c"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="velocity" type="slider" arg="-maxspeed %"
+ _label="Max velocity" _low-label="Slow" _high-label="Fast"
+ low="1" high="1000" default="700"/>
+
+ <number id="thrust" type="slider" arg="-thrust %"
+ _label="Thrust" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="4.0" default="1.0"/>
+
+ <number id="gravity" type="slider" arg="-gravity %"
+ _label="Gravity" _low-label="Low" _high-label="High"
+ low="0.0" high="25.0" default="9.8"/>
+ </vgroup>
+ <vgroup>
+
+ <select id="mode">
+ <option id="speedmine" _label="Tunnel"/>
+ <option id="speedworm" _label="Worm" arg-set="-worm"/>
+ </select>
+
+ <boolean id="terrain" _label="Rocky walls" arg-unset="-no-terrain"/>
+ <boolean id="bump" _label="Allow wall collisions" arg-unset="-no-bumps"/>
+ <boolean id="bonus" _label="Present bonuses" arg-unset="-no-bonuses"/>
+ <boolean id="xhair" _label="Display crosshair" arg-unset="-no-crosshair"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <!-- #### -vertigo [1.0] -->
+ <!-- #### -darkground [#101010] -->
+ <!-- #### -lightground [#a0a0a0] -->
+ <!-- #### -tunnelend [#000000] -->
+ <!-- #### -smoothness [6] -->
+ <!-- #### -curviness [1.0] -->
+ <!-- #### -twistiness [1.0] -->
+ <!-- #### -no-widening -->
+ <!-- #### -psychedelic -->
+
+ <xscreensaver-updater />
+
+ <_description>
+Simulates speeding down a rocky mineshaft, or a funky dancing worm.
+
+Written by Conrad Parker; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/sphere.xml b/hacks/config/sphere.xml
new file mode 100644
index 0000000..55a5d79
--- /dev/null
+++ b/hacks/config/sphere.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="sphere" _label="Sphere">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=FswhxIVXdt8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Draws shaded spheres in multiple colors.
+
+Written by Tom Duff and Jamie Zawinski; 1982, 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/spheremonics.xml b/hacks/config/spheremonics.xml
new file mode 100644
index 0000000..fc4fa92
--- /dev/null
+++ b/hacks/config/spheremonics.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="spheremonics" _label="Spheremonics" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=KrNVwyWi0io"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="5" high="1000" default="100"/>
+
+ <number id="resolution" type="slider" arg="-resolution %"
+ _label="Resolution" _low-label="Low" _high-label="High"
+ low="5" high="100" default="64"/>
+
+ </vgroup>
+ <vgroup>
+ <boolean id="wander" _label="Wander" arg-set="-wander"/>
+
+ <select id="rotation">
+ <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
+ <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
+ <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
+ <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
+ <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
+ <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
+ <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
+ <option id="xyz" _label="Rotate around all three axes"/>
+ </select>
+
+ <boolean id="smooth" _label="Smoothed lines" arg-unset="-no-smooth"/>
+ <boolean id="grid" _label="Draw grid" arg-unset="-no-grid"/>
+ <boolean id="bbox" _label="Draw bounding box" arg-set="-bbox"/>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+These closed objects are commonly called spherical harmonics,
+although they are only remotely related to the mathematical
+definition found in the solution to certain wave functions, most
+notably the eigenfunctions of angular momentum operators.
+
+https://en.wikipedia.org/wiki/Spherical_harmonics#Visualization_of_the_spherical_harmonics
+
+Written by Paul Bourke and Jamie Zawinski; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/spiral.xml b/hacks/config/spiral.xml
new file mode 100644
index 0000000..71e78c7
--- /dev/null
+++ b/hacks/config/spiral.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="spiral" _label="Spiral">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=8Ov2SxnO_Kg"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="50000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="Few" _high-label="Many"
+ low="0" high="100" default="40"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Cycles" _low-label="Low" _high-label="High"
+ low="10" high="800" default="350"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Moving circular moire patterns.
+
+Written by Peter Schmitzberger; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/splitflap.xml b/hacks/config/splitflap.xml
new file mode 100644
index 0000000..265c9b6
--- /dev/null
+++ b/hacks/config/splitflap.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="splitflap" _label="SplitFlap" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=rZOL2jyDey0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="8.0" default="1.0"/>
+
+ <number id="width" type="spinbutton" arg="-width %"
+ _label="Columns" low="1" high="120" default="22"/>
+ <number id="height" type="spinbutton" arg="-height %"
+ _label="Rows" low="1" high="40" default="8"/>
+
+ <select id="text">
+ <option id="text" _label="Display text" />
+ <option id="c12" _label="Display 12-hour clock" arg-set="-mode clock12" />
+ <option id="c24" _label="Display 24-hour clock" arg-set="-mode clock24" />
+ </select>
+
+ <select id="facing">
+ <option id="front" _label="Always face front"/>
+ <option id="nofront" _label="Spin all the way around" arg-set="-no-front"/>
+ </select>
+
+ <select id="rotation">
+ <option id="no" _label="Don't rotate" arg-set="-spin 0"/>
+ <option id="x" _label="Rotate around X axis" arg-set="-spin X"/>
+ <option id="y" _label="Rotate around Y axis" arg-set="-spin Y"/>
+ <option id="z" _label="Rotate around Z axis" arg-set="-spin Z"/>
+ <option id="xy" _label="Rotate around X and Y axes" arg-set="-spin XY"/>
+ <option id="xz" _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
+ <option id="yz" _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
+ <option id="xyz" _label="Rotate around all three axes"/>
+ </select>
+
+ </vgroup>
+
+ <vgroup>
+ <xscreensaver-text />
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+ <xscreensaver-updater />
+
+ </vgroup>
+ </hgroup>
+
+ <_description>
+Simulates a split-flap display, an old style of electromechanical
+sign as seen in airports and train stations, and commonly used in
+alarm clocks in the 1960s and 1970s.
+
+https://en.wikipedia.org/wiki/Split-flap_display
+https://en.wikipedia.org/wiki/Flip_clock
+
+Written by Jamie Zawinski; 2015.
+ </_description>
+</screensaver>
diff --git a/hacks/config/splodesic.xml b/hacks/config/splodesic.xml
new file mode 100644
index 0000000..0970fd3
--- /dev/null
+++ b/hacks/config/splodesic.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="splodesic" _label="Splodesic" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=pwpTs1pEQmM"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Eruption frequency" _low-label="Seldom" _high-label="Often"
+ low="0.01" high="5.0" default="1.0"/>
+
+ <hgroup>
+ <number id="freq" type="spinbutton" arg="-depth %"
+ _label="Depth" low="0" high="5" default="4"/>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A geodesic sphere experiences a series of eruptions.
+
+Written by Jamie Zawinski; 2016.
+ </_description>
+</screensaver>
diff --git a/hacks/config/spotlight.xml b/hacks/config/spotlight.xml
new file mode 100644
index 0000000..24bfb9a
--- /dev/null
+++ b/hacks/config/spotlight.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="spotlight" _label="Spotlight">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=av29CVh2UeM"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="120"/>
+
+ <number id="radius" type="slider" arg="-radius %"
+ _label="Spotlight size" _low-label="Small" _high-label="Large"
+ low="5" high="350" default="125"/>
+
+ <xscreensaver-image />
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+A spotlight scanning across a black screen, illuminating a loaded
+image when it passes.
+
+Written by Rick Schultz and Jamie Zawinski; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/sproingies.xml b/hacks/config/sproingies.xml
new file mode 100644
index 0000000..1d16ff0
--- /dev/null
+++ b/hacks/config/sproingies.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="sproingies" _label="Sproingies" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=fmHl17ppgc0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Sproingies" _low-label="One" _high-label="Lots"
+ low="1" high="30" default="8"/>
+
+ <hgroup>
+ <boolean id="nofall" _label="Fall off edge" arg-set="-fall"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Slinky-like creatures walk down an infinite staircase and
+occasionally explode!
+
+https://en.wikipedia.org/wiki/Slinky
+https://en.wikipedia.org/wiki/Q%2Abert
+https://en.wikipedia.org/wiki/Marble_Madness
+
+Written by Ed Mackey; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/squiral.xml b/hacks/config/squiral.xml
new file mode 100644
index 0000000..1cc7e44
--- /dev/null
+++ b/hacks/config/squiral.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="squiral" _label="Squiral">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=WPhqyM9Bb4o"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="disorder" type="slider" arg="-disorder %"
+ _label="Randomness" _low-label="Low" _high-label="High"
+ low="0.0" high="0.5" default="0.005"/>
+
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Seeds" low="0" high="200" default="0"/>
+
+ </vgroup>
+ <vgroup>
+ <number id="handedness" type="slider" arg="-handedness %"
+ _label="Handedness" _low-label="Left" _high-label="Right"
+ low="0.0" high="1.0" default="0.5"/>
+
+ <number id="fill" type="slider" arg="-fill %"
+ _label="Density" _low-label="Sparse" _high-label="Dense"
+ low="0" high="100" default="75"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="100"/>
+ </vgroup>
+ </hgroup>
+
+ <!-- #### -cycle -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Square-spiral-producing automata. The spirals grow outward until they
+hit something, then they go around it.
+
+Written by Jeff Epler; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/stairs.xml b/hacks/config/stairs.xml
new file mode 100644
index 0000000..099f963
--- /dev/null
+++ b/hacks/config/stairs.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="stairs" _label="Stairs" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Y1ceRT30qr0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Escher's infinite staircase.
+
+https://en.wikipedia.org/wiki/Maurits_Cornelis_Escher
+
+Written by Marcelo Vianna and Jamie Zawinski; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/starfish.xml b/hacks/config/starfish.xml
new file mode 100644
index 0000000..006bc00
--- /dev/null
+++ b/hacks/config/starfish.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="starfish" _label="Starfish">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=atwc7IJHuLo"/>
+
+ <select id="mode">
+ <option id="random" _label="Random"/>
+ <option id="zoom" _label="Color gradients" arg-set="-mode zoom"/>
+ <option id="blob" _label="Pulsating blob" arg-set="-mode blob"/>
+ </select>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="1 second" _high-label="30 seconds"
+ low="1" high="60" default="30"/>
+
+ <number id="thickness" type="slider" arg="-thickness %"
+ _label="Lines" _low-label="Thin" _high-label="Thick"
+ low="0" high="150" default="0"/>
+
+ <number id="ncolors" type="slider" arg="-colors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="200"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Undulating, throbbing, star-like patterns pulsate, rotate, and turn
+inside out. Another display mode uses these shapes to lay down a
+field of colors, which are then cycled. The motion is very organic.
+
+Written by Jamie Zawinski; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/starwars.xml b/hacks/config/starwars.xml
new file mode 100644
index 0000000..caa005e
--- /dev/null
+++ b/hacks/config/starwars.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="starwars" _label="StarWars" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=UUjC-6e7y_U"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _low-label=" Frame rate Low" _high-label="High"
+ low="0" high="100000" default="40000"
+ convert="invert"/>
+ <number id="steps" type="slider" arg="-steps %"
+ _low-label="Scroll speed Slow" _high-label="Fast"
+ low="1" high="100" default="35"
+ convert="invert"/>
+ <number id="spin" type="slider" arg="-spin %"
+ _low-label=" Stars speed Slow" _high-label="Fast"
+ low="0.0" high="0.2" default="0.03"/>
+
+ <xscreensaver-text />
+ </vgroup>
+
+ <vgroup>
+ <select id="align">
+ <option id="left" _label="Flush left text" arg-set="-alignment left"/>
+ <option id="center" _label="Centered text"/>
+ <option id="right" _label="Flush right text" arg-set="-alignment right"/>
+ </select>
+
+ <boolean id="wrap" _label="Wrap long lines" arg-unset="-no-wrap"/>
+ <boolean id="texture" _label="Texture-mapped font" arg-unset="-no-textures"/>
+ <boolean id="smooth" _label="Anti-aliased lines" arg-unset="-no-smooth"/>
+ <hgroup>
+ <boolean id="thick" _label="Thick lines" arg-unset="-no-thick"/>
+ <boolean id="fade" _label="Fade out" arg-unset="-no-fade"/>
+ </hgroup>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <number id="lines" type="spinbutton" arg="-lines %"
+ _label="Text lines" low="4" high="1000" default="125"/>
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Font point size" low="-1" high="10" default="-1"/>
+ <number id="columns" type="spinbutton" arg="-columns %"
+ _label="or, Text columns" low="-1" high="200" default="-1"/>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A stream of text slowly scrolling into the distance at an
+angle, over a star field, like at the beginning of the movie of the
+same name.
+
+https://en.wikipedia.org/wiki/Star_Wars_opening_crawl
+
+Written by Jamie Zawinski and Claudio Matsuoka; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/stonerview.xml b/hacks/config/stonerview.xml
new file mode 100644
index 0000000..5db55f5
--- /dev/null
+++ b/hacks/config/stonerview.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="stonerview" _label="StonerView" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=xvDK_wwnXWs"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="trans" _label="Translucent" arg-unset="-no-transparent"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Chains of colorful squares dance around each other in complex spiral
+patterns. Inspired by David Tristram's `electropaint' screen saver,
+originally written for SGI computers in the late 1980s or early 1990s.
+
+Written by Andrew Plotkin; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/strange.xml b/hacks/config/strange.xml
new file mode 100644
index 0000000..fcaeb63
--- /dev/null
+++ b/hacks/config/strange.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="strange" _label="Strange">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=F1qna7UAxC0"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="curve" type="slider" arg="-curve %"
+ _label="Curviness" _low-label="Low" _high-label="High"
+ low="1" high="50" default="10"/>
+
+ <number id="points" type="slider" arg="-points %"
+ _label="Number of points" _low-label="1k" _high-label="500k"
+ low="1000" high="500000" default="5500"/>
+
+ <number id="pointSize" type="slider" arg="-point-size %"
+ _label="Point size" _low-label="1" _high-label="8"
+ low="1" high="8" default="1"/>
+ </vgroup>
+ <vgroup>
+ <number id="zoom" type="slider" arg="-zoom %"
+ _label="Zoom" _low-label="10%" _high-label="400%"
+ low="0.1" high="4.0" default="0.9"/>
+
+ <number id="brightness" type="slider" arg="-brightness %"
+ _label="Brightness" _low-label="10%" _high-label="400%"
+ low="0.1" high="4.0" default="1.0"/>
+
+ <number id="motionBlur" type="slider" arg="-motion-blur %"
+ _label="Motion blur" _low-label="1" _high-label="10"
+ low="1.0" high="10.0" default="3.0"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="100"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Strange attractors: a swarm of dots swoops and twists around.
+
+https://en.wikipedia.org/wiki/Attractor#Strange_attractor
+
+Written by Massimino Pascal; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/substrate.xml b/hacks/config/substrate.xml
new file mode 100644
index 0000000..11e8ccc
--- /dev/null
+++ b/hacks/config/substrate.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="substrate" _label="Substrate">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=dCCVgBOVD0E"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="speed" type="slider" arg="-growth-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="18000" convert="invert"/>
+
+ <number id="maxcyc" type="slider" arg="-max-cycles %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="2000" high="25000" default="10000" />
+
+ <number id="sandg" type="slider" arg="-sand-grains %"
+ _label="Sand grains" _low-label="Few" _high-label="Lots"
+ low="16" high="128" default="64" />
+
+ <number id="curve" type="slider" arg="-circle-percent %"
+ _label="Circle percentage" _low-label="0%" _high-label="100%"
+ low="0" high="100" default="33" />
+ </vgroup>
+ <vgroup>
+ <number id="init" type="spinbutton" arg="-initial-cracks %"
+ _label="Initial cracks" low="3" high="15" default="3"/>
+
+ <boolean id="wire" _label="Wireframe only" arg-set="-wireframe" />
+
+ <boolean id="seamless" _label="Seamless mode" arg-set="-seamless" />
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Crystalline lines grow on a computational substrate. A simple
+perpendicular growth rule creates intricate city-like structures.
+
+Written by J. Tarbell and Mike Kershaw; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/superquadrics.xml b/hacks/config/superquadrics.xml
new file mode 100644
index 0000000..642125c
--- /dev/null
+++ b/hacks/config/superquadrics.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="superquadrics" _label="Superquadrics" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Mjlc7iPA1N4"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="40000"
+ convert="invert"/>
+
+ <number id="spinspeed" type="slider" arg="-spinspeed %"
+ _label="Spin speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="15.0" default="5.0"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Density" _low-label="Low" _high-label="High"
+ low="0" high="100" default="25"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="0" high="100" default="40"/>
+
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Morphing 3D shapes.
+
+Written by Ed Mackey; 1987, 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/surfaces.xml b/hacks/config/surfaces.xml
new file mode 100644
index 0000000..92a184a
--- /dev/null
+++ b/hacks/config/surfaces.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="surfaces" _label="Surfaces" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Q412lxz3fTg"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="descent" type="slider" arg="-speed %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="2" high="2000" default="300"
+ convert="invert"/>
+ </vgroup>
+
+ <vgroup>
+ <select id="surface">
+ <option id="random" _label="Random Surface"/>
+ <option id="dini" _label="Dini's Surface" arg-set="-surface dini"/>
+ <option id="enneper" _label="Enneper's Surface" arg-set="-surface enneper"/>
+ <option id="kuen" _label="Kuen Surface" arg-set="-surface kuen"/>
+ <option id="moebius" _label="Moebius Strip" arg-set="-surface moebius"/>
+ <option id="seashell" _label="Seashell" arg-set="-surface seashell"/>
+ <option id="swallow" _label="Swallowtail" arg-set="-surface swallowtail"/>
+ <option id="bohemian" _label="Bohemian Dome" arg-set="-surface bohemian"/>
+ <option id="whitney" _label="Whitney Umbrella" arg-set="-surface whitney"/>
+ <option id="pluecker" _label="Pluecker's Conoid" arg-set="-surface pluecker"/>
+ <option id="henneberg" _label="Henneberg's Surface" arg-set="-surface henneberg"/>
+ <option id="catalan" _label="Catalan's Surface" arg-set="-surface catalan"/>
+ <option id="corkscrew" _label="Corkscrew Surface" arg-set="-surface corkscrew"/>
+ </select>
+
+ <select id="mode">
+ <option id="random" _label="Random Display Mode"/>
+ <option id="points" _label="Points" arg-set="-mode points"/>
+ <option id="lines" _label="Lines" arg-set="-mode lines"/>
+ <option id="line_loop" _label="Line Loops" arg-set="-mode line-loops"/>
+ </select>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-set="-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Parametric surfaces.
+
+http://mathworld.wolfram.com/DinisSurface.html
+https://en.wikipedia.org/wiki/Enneper_surface
+http://mathworld.wolfram.com/EnnepersMinimalSurface.html
+http://mathworld.wolfram.com/KuenSurface.html
+https://en.wikipedia.org/wiki/Moebius_strip
+http://mathworld.wolfram.com/Seashell.html
+http://mathworld.wolfram.com/SwallowtailCatastrophe.html
+http://mathworld.wolfram.com/BohemianDome.html
+https://en.wikipedia.org/wiki/Whitney_umbrella
+http://mathworld.wolfram.com/PlueckersConoid.html
+http://mathworld.wolfram.com/HennebergsMinimalSurface.html
+http://mathworld.wolfram.com/CatalansSurface.html
+http://mathworld.wolfram.com/CorkscrewSurface.html
+
+Written by Andrey Mirtchovski and Carsten Steger; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/swirl.xml b/hacks/config/swirl.xml
new file mode 100644
index 0000000..199bdb7
--- /dev/null
+++ b/hacks/config/swirl.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="swirl" _label="Swirl">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=o_VRQxPCB7w"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Count" _low-label="Few" _high-label="Many"
+ low="0" high="20" default="5"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="200"/>
+
+<!-- <boolean id="shm" _label="Use shared memory" arg-unset="-no-shm"/> -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Flowing, swirly patterns.
+
+Written by M. Dobie and R. Taylor; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/t3d.xml b/hacks/config/t3d.xml
new file mode 100644
index 0000000..d1fd19b
--- /dev/null
+++ b/hacks/config/t3d.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="t3d" _label="T3D">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=5UohH7U2CAI"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="40000"
+ convert="invert"/>
+
+ <number id="move" type="slider" arg="-move %"
+ _label="Turn side-to-side" _low-label="0 deg" _high-label="90 deg"
+ low="0.0" high="3.0" default="0.5"/>
+
+ <number id="wobble" type="slider" arg="-wobble %"
+ _label="Wobbliness" _low-label="Low" _high-label="High"
+ low="0.0" high="3.0" default="2.0"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="cycle" type="slider" arg="-cycle %"
+ _label="Cycle seconds" _low-label="Low" _high-label="High"
+ low="0.0" high="60.0" default="10.0"/>
+
+ <number id="mag" type="slider" arg="-mag %"
+ _label="Magnification" _low-label="Smaller" _high-label="Bigger"
+ low="0.1" high="4.0" default="1.0"/>
+
+ <select id="mins">
+ <option id="min2" _label="Minute tick marks" arg-set="-minutes"/>
+ <option id="min5" _label="5 minute tick marks"/>
+ </select>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </vgroup>
+ </hgroup>
+
+ <!-- #### -fast [50] -->
+ <!-- #### -colcycle [?] -->
+ <!-- #### -hsvcycle [0.0] -->
+ <!-- #### -rgb [?] -->
+ <!-- #### -hsv [?] -->
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Draws a working analog clock composed of floating, throbbing bubbles.
+
+Written by Bernd Paysan; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/tangram.xml b/hacks/config/tangram.xml
new file mode 100644
index 0000000..11b8f71
--- /dev/null
+++ b/hacks/config/tangram.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="tangram" _label="Tangram" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=JgJ-OsgCCJ4"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"/>
+
+ <number id="viewing_time" type="slider" arg="-viewing_time %"
+ _label="Linger" _low-label="Brief" _high-label="Long"
+ low="0" high="30" default="5" />
+
+ <number id="x_camera_rotate" type="slider" arg="-x_camera_rotate %"
+ _label="X rotation" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="1.0" default="0.2" />
+
+ <number id="y_camera_rotate" type="slider" arg="-y_camera_rotate %"
+ _label="Y rotation" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="1.0" default="0.5" />
+
+ <number id="z_camera_rotate" type="slider" arg="-z_camera_rotate %"
+ _label="Z rotation" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="1.0" default="0" />
+
+ <hgroup>
+ <boolean id="labels" _label="Draw labels" arg-unset="-no-labels"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="rotate" _label="Rotate" arg-unset="-no-rotate"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Solves tangram puzzles.
+
+https://en.wikipedia.org/wiki/Tangram
+
+Written by Jeremy English; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/tessellimage.xml b/hacks/config/tessellimage.xml
new file mode 100644
index 0000000..f6e1a3c
--- /dev/null
+++ b/hacks/config/tessellimage.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="tessellimage" _label="Tessellimage">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=JNgybysnYU8"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="duration2" type="slider" arg="-duration2 %"
+ _label="Speed" _low-label="0.1 second" _high-label="4 seconds"
+ low="0.1" high="4.0" default="0.4"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="120"/>
+
+ <number id="depth" type="slider" arg="-max-depth %"
+ _label="Complexity" _low-label="Shallow" _high-label="Deep"
+ low="1000" high="100000" default="30000"/>
+ </vgroup>
+
+ <vgroup>
+
+ <select id="mode">
+ <option id="random" _label="Delaunay or voronoi"/>
+ <option _label="Delaunay" arg-set="-mode delaunay"/>
+ <option _label="Voronoi" arg-set="-mode voronoi"/>
+ </select>
+
+ <xscreensaver-image />
+
+ <boolean id="fill" _label="Fill screen" arg-unset="-no-fill-screen"/>
+ <boolean id="outline" _label="Outline triangles" arg-unset="-no-outline"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+ </vgroup>
+ </hgroup>
+
+ <_description>
+Converts an image to triangles using Delaunay tessellation, or to
+polygons using Voronoi tesselation, and animates the result at
+various depths.
+
+More polygons are allocated to visually complex parts of the image.
+This is accomplished by first computing the first derivative of the
+image: the distance between each pixel and its neighbors (which is
+essentially edge detection or embossing). Then the Delaunay or
+Voronoi control points are chosen by selecting those pixels whose
+distance value is above a certain threshold: those are the pixels that
+have the largest change in color/brightness.
+
+https://en.wikipedia.org/wiki/Delaunay_triangulation
+https://en.wikipedia.org/wiki/Voronoi_diagram
+https://en.wikipedia.org/wiki/Tessellation
+
+Written by Jamie Zawinski; 2014.
+ </_description>
+</screensaver>
diff --git a/hacks/config/testx11.xml b/hacks/config/testx11.xml
new file mode 100644
index 0000000..aaf85a7
--- /dev/null
+++ b/hacks/config/testx11.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<screensaver name="testx11" _label="TestX11">
+
+ <command arg="-root"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Test platform for JWXYZ - the X11 compatibility shim for OS X and iOS.
+End users shouldn't normally see this one.
+
+Written by Dave Odell; 2015.
+ </_description>
+</screensaver>
diff --git a/hacks/config/thornbird.xml b/hacks/config/thornbird.xml
new file mode 100644
index 0000000..8bbd1ab
--- /dev/null
+++ b/hacks/config/thornbird.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="thornbird" _label="Thornbird">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=rfGfPezVnac"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Points" _low-label="Few" _high-label="Many"
+ low="10" high="1000" default="100"/>
+
+ <number id="cycles" type="slider" arg="-cycles %"
+ _label="Thickness" _low-label="Thin" _high-label="Thick"
+ low="2" high="1000" default="400"/>
+
+<!--
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="2" high="255" default="64"/>
+-->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Displays a view of the "Bird in a Thornbush" fractal.
+
+Written by Tim Auckland; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/timetunnel.xml b/hacks/config/timetunnel.xml
new file mode 100644
index 0000000..caab9fc
--- /dev/null
+++ b/hacks/config/timetunnel.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="timetunnel" _label="TimeTunnel" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=GZe5rk_7TnA"/>
+
+ <number id="start" type="slider" arg="-start %"
+ _label="Start sequence time" _low-label="0 sec" _high-label="30 sec"
+ low="0.00" high="27.79" default="0.00"/>
+
+ <number id="end" type="slider" arg="-end %"
+ _label="End sequence time" _low-label="0 sec" _high-label="30 sec"
+ low="0.00" high="27.79" default="27.79"/>
+
+ <hgroup>
+ <vgroup>
+ <boolean id="logo" _label="Draw logo" arg-unset="-no-logo"/>
+ <boolean id="reverse" _label="Run backward" arg-set="-reverse"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ <vgroup>
+<!--
+ <string id="tardis" _label="Tardis image " arg="-tardis %"/>
+ <string id="head" _label="Head image " arg="-head %"/>
+ <string id="marquee" _label="Marquee image " arg="-marquee %"/>
+ <string id="tun1" _label="Tardis tunnel image " arg="-tun1 %"/>
+ <string id="tun2" _label="Middle tunnel image" arg="-tun2 %"/>
+ <string id="tun3" _label="Final tunnel image " arg="-tun3 %"/>
+-->
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+An animation similar to the title sequence of Dr. Who in the 70s.
+
+Written by Sean P. Brennan; 2005.
+ </_description>
+</screensaver>
diff --git a/hacks/config/topblock.xml b/hacks/config/topblock.xml
new file mode 100644
index 0000000..df498bc
--- /dev/null
+++ b/hacks/config/topblock.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="topblock" _label="TopBlock" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=zj0FHFJgQJ8"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="dropspeed" type="slider" arg="-dropSpeed %"
+ _label="Drop speed" _low-label="Slow" _high-label="Fast"
+ low="1" high="9" default="4"/>
+
+ <number id="size" type="slider" arg="-size %"
+ _label="Carpet size" _low-label="Small" _high-label="Large"
+ low="1" high="10" default="2"/>
+
+ <number id="spawn" type="slider" arg="-spawn %"
+ _label="Spawn likelyhood" _low-label="Low" _high-label="High"
+ low="4" high="1000" default="50"
+ convert="invert"/>
+
+ </vgroup>
+ <vgroup>
+ <number id="resolution" type="slider" arg="-resolution %"
+ _label="Polygon count" _low-label="Low" _high-label="High"
+ low="4" high="20" default="4"/>
+
+ <number id="maxColors" type="slider" arg="-maxColors %"
+ _label="Colors" _low-label="Few" _high-label="Many"
+ low="1" high="32" default="7"/>
+
+ <number id="rotatespeed" type="slider" arg="-rotateSpeed %"
+ _label="Rotation" _low-label="Slow" _high-label="Fast"
+ low="1" high="1000" default="10"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="rotate" _label="Rotate" arg-unset="-no-rotate"/>
+ <boolean id="follow" _label="Follow" arg-set="-follow"/>
+ <boolean id="blob" _label="Blob mode" arg-set="-blob"/>
+ <boolean id="override" _label="Tunnel mode" arg-set="-override"/>
+ <boolean id="carpet" _label="Carpet" arg-unset="-no-carpet"/>
+ </hgroup>
+ <hgroup>
+ <boolean id="nipples" _label="Nipples" arg-unset="-no-nipples"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Creates a 3D world with dropping blocks that build up and up.
+Written by rednuht; 2006.
+ </_description>
+</screensaver>
diff --git a/hacks/config/triangle.xml b/hacks/config/triangle.xml
new file mode 100644
index 0000000..70d9949
--- /dev/null
+++ b/hacks/config/triangle.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="triangle" _label="Triangle">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=GXrzjY-Flro"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="128"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Generates random mountain ranges using iterative subdivision of
+triangles.
+
+Written by Tobias Gloth; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/tronbit.xml b/hacks/config/tronbit.xml
new file mode 100644
index 0000000..965d333
--- /dev/null
+++ b/hacks/config/tronbit.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="tronbit" _label="TronBit" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=dIF4fodt-L8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Animation speed" _low-label="Slow" _high-label="Fast"
+ low="0.05" high="10.0" default="1.0"/>
+
+ <hgroup>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+The character "Bit" from the film, "Tron".
+
+The "yes" state is a tetrahedron; the "no" state is the second
+stellation of an icosahedron; and the idle state oscillates between
+a small triambic icosahedron and the compound of an icosahedron and
+a dodecahedron.
+
+https://en.wikipedia.org/wiki/List_of_Tron_characters#Bit
+https://en.wikipedia.org/wiki/Uniform_polyhedra
+https://en.wikipedia.org/wiki/Stellation
+
+Written by Jamie Zawinski; 2011.
+ </_description>
+</screensaver>
diff --git a/hacks/config/truchet.xml b/hacks/config/truchet.xml
new file mode 100644
index 0000000..c20a3f8
--- /dev/null
+++ b/hacks/config/truchet.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="truchet" _label="Truchet">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=hoJ23JSsUD8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="1000000" default="400000"
+ convert="invert"/>
+
+ <!-- #### -min-width [40] -->
+ <!-- #### -max-height [150] -->
+ <!-- #### -max-width [150] -->
+ <!-- #### -min-height [40] -->
+ <!-- #### -max-linewidth [25] -->
+ <!-- #### -min-linewidth [2] -->
+ <!-- #### -no-erase -->
+ <!-- #### -erase-count [25] -->
+ <!-- #### -not-square -->
+ <!-- #### -no-angles -->
+ <!-- #### -no-curves -->
+ <!-- #### -scroll -->
+ <!-- #### -scroll-overlap [400] -->
+ <!-- #### -anim-delay [100] -->
+ <!-- #### -anim-step-size [3] -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Line- and arc-based truchet patterns that tile the screen.
+
+https://en.wikipedia.org/wiki/Tessellation
+
+Written by Adrian Likins; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/twang.xml b/hacks/config/twang.xml
new file mode 100644
index 0000000..3eefded
--- /dev/null
+++ b/hacks/config/twang.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="twang" _label="Twang">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=7pxDMSduQoU"/>
+
+ <hgroup>
+ <vgroup>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="120"/>
+
+ <number id="event-chance" type="slider" arg="-event-chance %"
+ _label="Randomness" _low-label="Slow" _high-label="Jumpy"
+ low="0.0" high="0.1" default="0.01"/>
+
+ <number id="friction" type="slider" arg="-friction %"
+ _label="Friction" _low-label="Low" _high-label="High"
+ low="0.0" high="0.2" default="0.05"/>
+
+ </vgroup>
+ <vgroup>
+
+ <number id="springiness" type="slider" arg="-springiness %"
+ _label="Springiness" _low-label="Low" _high-label="High"
+ low="0.0" high="1.0" default="0.1"/>
+
+ <number id="transference" type="slider" arg="-transference %"
+ _label="Transference" _low-label="Low" _high-label="High"
+ low="0.0" high="0.1" default="0.025"/>
+
+ <number id="tile-size" type="slider" arg="-tile-size %"
+ _label="Tile size" _low-label="Small" _high-label="Large"
+ low="10" high="512" default="120"/>
+
+ <number id="border-width" type="spinbutton" arg="-border-width %"
+ _label="Border width" low="0" high="20" default="3"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-image />
+
+ <xscreensaver-updater />
+
+ <_description>
+Divides the screen into a grid, and plucks them.
+
+Written by Dan Bornstein; 2002.
+ </_description>
+</screensaver>
diff --git a/hacks/config/unicrud.xml b/hacks/config/unicrud.xml
new file mode 100644
index 0000000..327e033
--- /dev/null
+++ b/hacks/config/unicrud.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="unicrud" _label="Unicrud" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=prEzdYMZ7xA"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Animation speed" _low-label="Slow" _high-label="Fast"
+ low="0.05" high="10.0" default="1.0"/>
+
+ <hgroup>
+ <boolean id="wander" _label="Wander" arg-unset="-no-wander"/>
+ <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ <boolean id="titles" _label="Show titles" arg-unset="-no-titles"/>
+ </hgroup>
+
+ <select id="block">
+ <option _label="Display everything"/>
+ <option _label="Display Latin1" arg-set="-block Latin1,Latin_Extended-A,Latin_Extended-B,Spacing_Modifier_Letters"/>
+ <option _label="Display simple characters" arg-set="-block Latin1,Latin_Extended-A,Latin_Extended-B,Spacing_Modifier_Letters,Phonetic_Extensions,Latin_Extended_Additional,Greek_Extended,General_Punctuation,Superscripts_and_Subscripts,Currency_Symbols,Letterlike_Symbols,Number_Forms"/>
+ <option _label="Display mathematical symbols" arg-set="-block Greek_and_Coptic,Mathematical_Operators,Miscellaneous_Mathematical_Symbols-A,Supplemental_Arrows-A,Supplemental_Arrows-B,Miscellaneous_Mathematical_Symbols-B,Supplemental_Mathematical_Operators,Miscellaneous_Symbols_and_Arrows"/>
+ <option _label="Display emoticons" arg-set="-block Currency_Symbols,Miscellaneous_Technical,Box_Drawing,Geometric_Shapes,Miscellaneous_Symbols,Dingbats,Mahjong_Tiles,Domino_Tiles,Playing_Cards,Miscellaneous_Symbols_and_Pictographs,Emoticons,Ornamental_Dingbats,Transport_and_Map_Symbols,Alchemical_Symbols,Geometric_Shapes_Extended,Supplemental_Symbols_and_Pictographs,Egyptian_Hieroglyphs"/>
+ <option _label="Display hieroglyphs" arg-set="-block Egyptian_Hieroglyphs"/>
+ </select>
+
+ <xscreensaver-updater />
+
+ <_description>
+Chooses a random Unicode character and displays it full screen,
+along with some information about it.
+
+https://en.wikipedia.org/wiki/Unicode
+
+Written by Jamie Zawinski; 2016.
+ </_description>
+</screensaver>
diff --git a/hacks/config/unknownpleasures.xml b/hacks/config/unknownpleasures.xml
new file mode 100644
index 0000000..7ef79ac
--- /dev/null
+++ b/hacks/config/unknownpleasures.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="unknownpleasures" _label="UnknownPleasures" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=vuWhUxBq99E"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="30000"
+ convert="invert"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Scanlines" _low-label="Few" _high-label="Many"
+ low="3" high="200" default="80"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="3.0" default="1.0"/>
+
+ <number id="resolution" type="slider" arg="-resolution %"
+ _label="Resolution" _low-label="Low" _high-label="High"
+ low="5" high="300" default="100"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="ortho" _label="Orthographic Projection" arg-unset="-no-ortho"/>
+ <boolean id="wire" _label="Wireframe" arg-set="-wireframe"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+PSR B1919+21 (AKA CP 1919) was the first pulsar ever discovered:
+a spinning neutron star emitting a periodic lighthouse-like beacon.
+An illustration of the signal received from it was published in
+Scientific American in 1971, and later in The Cambridge Encyclopedia
+of Astronomy in 1977, where it was seen by Stephen Morris, the
+drummer of Joy Division, and was consequently appropriated by
+Peter Saville for the cover of the band's album "Unknown Pleasures".
+
+https://en.wikipedia.org/wiki/Pulsar
+https://en.wikipedia.org/wiki/PSR_B1919%2B21
+https://en.wikipedia.org/wiki/Unknown_Pleasures
+https://en.wikipedia.org/wiki/Peter_Saville_%28graphic_designer%29
+https://en.wikipedia.org/wiki/Joy_Division
+
+Written by Jamie Zawinski; 2013.
+ </_description>
+</screensaver>
diff --git a/hacks/config/vermiculate.xml b/hacks/config/vermiculate.xml
new file mode 100644
index 0000000..7d82ab0
--- /dev/null
+++ b/hacks/config/vermiculate.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="vermiculate" _label="Vermiculate">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=YSg9KY-qw5o"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="1" high="1000" default="1" />
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Squiggly worm-like paths.
+
+Written by Tyler Pierce; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/vfeedback.xml b/hacks/config/vfeedback.xml
new file mode 100644
index 0000000..2accd19
--- /dev/null
+++ b/hacks/config/vfeedback.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="vfeedback" _label="VFeedback">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=I_MkW0CW4QM"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="tvcolor" type="slider" arg="-tv-color %"
+ _label="Color Knob" _low-label="Low" _high-label="High"
+ low="0" high="400" default="70"/>
+ <number id="tvtint" type="slider" arg="-tv-tint %"
+ _label="Tint Knob" _low-label="Low" _high-label="High"
+ low="0" high="360" default="5"/>
+ <number id="noise" type="slider" arg="-noise %"
+ _label="Noise" _low-label="Low" _high-label="High"
+ low="0.0" high="0.2" default="0.02"/>
+ </vgroup>
+ <vgroup>
+ <number id="tvbrightness" type="slider" arg="-tv-brightness %"
+ _label="Brightness Knob" _low-label="Low" _high-label="High"
+ low="-75.0" high="100.0" default="1.5"/>
+ <number id="tvcontrast" type="slider" arg="-tv-contrast %"
+ _label="Contrast Knob" _low-label="Low" _high-label="High"
+ low="0" high="500" default="150"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+Simulates video feedback: pointing a video camera at an NTSC television.
+
+Written by Jamie Zawinski; 2018.
+ </_description>
+</screensaver>
diff --git a/hacks/config/vidwhacker.xml b/hacks/config/vidwhacker.xml
new file mode 100644
index 0000000..e1fade1
--- /dev/null
+++ b/hacks/config/vidwhacker.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="vidwhacker" _label="VidWhacker">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=u8esWjcR4eI"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Duration" _low-label="2 seconds" _high-label="2 minutes"
+ low="2" high="120" default="5"/>
+
+ <file id="directory" _label="Image directory" arg="-directory %"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Displays a distorted frame video.
+
+This is a shell script that grabs a frame of video from the system's
+video input, and then uses some PBM filters (chosen at random) to
+manipulate and recombine the video frame in various ways (edge
+detection, subtracting the image from a rotated version of itself,
+etc.) Then it displays that image for a few seconds, and does it
+again. This works really well if you just feed broadcast television
+into it.
+
+Written by Jamie Zawinski; 1998.
+ </_description>
+</screensaver>
diff --git a/hacks/config/vigilance.xml b/hacks/config/vigilance.xml
new file mode 100644
index 0000000..ea9962e
--- /dev/null
+++ b/hacks/config/vigilance.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="vigilance" _label="Vigilance" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=b7y35gr3WZ0"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="8.0" default="1.0"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of cameras" _low-label="One" _high-label="Lots"
+ low="1" high="30" default="5"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Security cameras keep careful track of their surroundings.
+You can trust them. Everything is completely under control.
+
+Written by Jamie Zawinski; 2017.
+ </_description>
+</screensaver>
diff --git a/hacks/config/vines.xml b/hacks/config/vines.xml
new file mode 100644
index 0000000..0299d77
--- /dev/null
+++ b/hacks/config/vines.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="vines" _label="Vines">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=IaVfFCIAUn8"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="250000" default="200000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="64"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Generates a continuous sequence of small, curvy geometric patterns.
+
+Written by Tracy Camp and David Hansen; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/voronoi.xml b/hacks/config/voronoi.xml
new file mode 100644
index 0000000..9e0ef2e
--- /dev/null
+++ b/hacks/config/voronoi.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="voronoi" _label="Voronoi" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=hD_8cBvknUM"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Slow" _high-label="Fast"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="points" type="slider" arg="-points %"
+ _label="Points" _low-label="Few" _high-label="Many"
+ low="1" high="100" default="25"/>
+
+ <number id="pointSize" type="slider" arg="-point-size %"
+ _label="Point size" _low-label="0" _high-label="50 pixels"
+ low="0" high="50" default="9"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="pointSpeed" type="slider" arg="-point-speed %"
+ _label="Wander speed" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="10.0" default="1.0"/>
+
+ <number id="pointDelay" type="slider" arg="-point-delay %"
+ _label="Insertion speed" _low-label="Slow" _high-label="Fast"
+ low="0.0" high="3.0" default="0.05"
+ convert="invert"/>
+
+ <number id="zoomSpeed" type="slider" arg="-zoom-speed %"
+ _label="Zoom speed" _low-label="Slow" _high-label="Fast"
+ low="0.1" high="10.0" default="1.0"/>
+
+ <number id="zoomDelay" type="slider" arg="-zoom-delay %"
+ _label="Zoom frequency" _low-label="0" _high-label="60 seconds"
+ low="0" high="60" default="15"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A Voronoi tessellation. Periodically zooms in and adds new points.
+The existing points also wander around.
+
+There are a set of control points on the plane, each at the center of
+a colored cell. Every pixel within that cell is closer to that cell's
+control point than to any other control point. That is what
+determines the cell's shapes.
+
+https://en.wikipedia.org/wiki/Voronoi_diagram
+https://en.wikipedia.org/wiki/Tessellation
+
+Written by Jamie Zawinski; 2007.
+ </_description>
+</screensaver>
diff --git a/hacks/config/wander.xml b/hacks/config/wander.xml
new file mode 100644
index 0000000..ad72fe8
--- /dev/null
+++ b/hacks/config/wander.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="wander" _label="Wander">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=2ZZC46Z9wJE"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="density" type="slider" arg="-density %"
+ _label="Density" _low-label="Low" _high-label="High"
+ low="1" high="30" default="2"
+ convert="invert"/>
+
+ <number id="reset" type="slider" arg="-reset %"
+ _label="Duration" _low-label="Short" _high-label="Long"
+ low="10000" high="3000000" default="2500000"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="length" type="slider" arg="-length %"
+ _label="Length" _low-label="Short" _high-label="Long"
+ low="100" high="100000" default="25000"/>
+
+ <number id="advance" type="slider" arg="-advance %"
+ _label="Color contrast" _low-label="Low" _high-label="High"
+ low="1" high="100" default="1"/>
+
+ <hgroup>
+ <boolean id="circles" _label="Draw spots" arg-set="-circles"/>
+
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Size" low="0" high="100" default="1"/>
+ </hgroup>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A colorful random-walk.
+
+https://en.wikipedia.org/wiki/Random_walk
+
+Written by Rick Campbell; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/webcollage.xml b/hacks/config/webcollage.xml
new file mode 100644
index 0000000..c26ea98
--- /dev/null
+++ b/hacks/config/webcollage.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="webcollage" _label="WebCollage">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=u8esWjcR4eI"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Delay between images" _low-label="None" _high-label="30 secs"
+ low="0" high="30" default="2"/>
+
+ <number id="timeout" type="slider" arg="-timeout %"
+ _label="Network timeout" _low-label="2 secs" _high-label="2 min"
+ low="2" high="120" default="30"/>
+ </vgroup>
+ <vgroup>
+ <number id="opacity" type="slider" arg="-opacity %"
+ _label="Image opacity" _low-label="Transparent" _high-label="Opaque"
+ low="0.1" high="1.0" default="0.85"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ </vgroup>
+ </hgroup>
+
+<!--
+ <string id="filter" _label="Per-image filter program" arg="-filter %"/>
+ <string id="filter2" _label="Overall filter program" arg="-filter2 %"/>
+ <file id="dictionary" _label="Dictionary file" arg="-dictionary %"/>
+ <file id="dir" _label="Image directory" arg="-directory %"/>
+ -->
+
+ <xscreensaver-updater />
+
+ <_description>
+This is what the Internet looks like.
+
+This creates collages out of random images from the World Wide Web.
+It finds the images by feeding random words into various search
+engines, and pulling images (or sections of images) out of the pages
+returned.
+
+WARNING: THE INTERNET SOMETIMES CONTAINS PORNOGRAPHY.
+
+The Internet being what it is, absolutely anything might show up in the
+collage including -- quite possibly -- pornography, or even nudity.
+Please act accordingly.
+
+See also https://www.jwz.org/webcollage/
+
+Written by Jamie Zawinski; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/whirlwindwarp.xml b/hacks/config/whirlwindwarp.xml
new file mode 100644
index 0000000..7cd774e
--- /dev/null
+++ b/hacks/config/whirlwindwarp.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="whirlwindwarp" _label="WhirlWindWarp">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=eWrRhSYzimY"/>
+
+ <number id="points" type="slider" arg="-points %"
+ _label="Particles" _low-label="Few" _high-label="Many"
+ low="10" high="1000" default="400"/>
+
+ <number id="tails" type="slider" arg="-tails %"
+ _label="Trail size" _low-label="Short" _high-label="Long"
+ low="1" high="50" default="8"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Floating stars are acted upon by a mixture of simple 2D
+force fields. The strength of each force field changes
+continuously, and it is also switched on and off at random.
+
+Written by Paul 'Joey' Clark; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/whirlygig.xml b/hacks/config/whirlygig.xml
new file mode 100644
index 0000000..d7842db
--- /dev/null
+++ b/hacks/config/whirlygig.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="whirlygig" _label="Whirlygig">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=Y2JTY7bssPM"/>
+
+ <hgroup>
+ <number id="whirlies" type="spinbutton" arg="-whirlies %"
+ _label="Whirlies" low="-1" high="50" default="-1"/>
+
+ <number id="lines" type="spinbutton" arg="-nlines %"
+ _label="Lines" low="-1" high="50" default="-1"/>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <number id="xspeed" type="slider" arg="-xspeed %"
+ _label="X speed" _low-label="Low" _high-label="High"
+ low="0.0" high="10.0" default="1.0"/>
+ <number id="yspeed" type="slider" arg="-yspeed %"
+ _label="Y speed" _low-label="Low" _high-label="High"
+ low="0.0" high="10.0" default="1.0"/>
+ </vgroup>
+
+ <vgroup>
+ <number id="xamplitude" type="slider" arg="-xamplitude %"
+ _label="X amplitude" _low-label="Low" _high-label="High"
+ low="0.0" high="10.0" default="1.0"/>
+ <number id="yamplitude" type="slider" arg="-yamplitude %"
+ _label="Y amplitude" _low-label="Low" _high-label="High"
+ low="0.0" high="10.0" default="1.0"/>
+ </vgroup>
+ </hgroup>
+
+
+ <!-- #### -xmode [change] -->
+
+ <hgroup>
+ <select id="xmode">
+ <option id="randomx" _label="X random" />
+ <option id="spinx" _label="X spin" arg-set="-xmode spin"/>
+ <option id="funkyx" _label="X funky" arg-set="-xmode funky"/>
+ <option id="circlex" _label="X circle" arg-set="-xmode circle"/>
+ <option id="linearx" _label="X linear" arg-set="-xmode linear"/>
+ <option id="testx" _label="X test" arg-set="-xmode test"/>
+ <option id="funx" _label="X fun" arg-set="-xmode fun"/>
+ <option id="inniex" _label="X innie" arg-set="-xmode innie"/>
+ <option id="lissajousx" _label="X lissajous" arg-set="-xmode lissajous"/>
+ </select>
+
+ <select id="ymode">
+ <option id="randomy" _label="Y random" />
+ <option id="spiny" _label="Y spin" arg-set="-ymode spin"/>
+ <option id="funkyy" _label="Y funky" arg-set="-ymode funky"/>
+ <option id="circley" _label="Y circle" arg-set="-ymode circle"/>
+ <option id="lineary" _label="Y linear" arg-set="-ymode linear"/>
+ <option id="testy" _label="Y test" arg-set="-ymode test"/>
+ <option id="funy" _label="Y fun" arg-set="-ymode fun"/>
+ <option id="inniey" _label="Y innie" arg-set="-ymode innie"/>
+ <option id="lissajousy" _label="Y lissajous" arg-set="-ymode lissajous"/>
+ </select>
+ </hgroup>
+
+ <!-- #### -speed [1] -->
+ <!-- #### -color_modifier [-1] -->
+ <!-- #### -start_time [-1] -->
+ <!-- #### -xoffset [1.0] -->
+ <!-- #### -yoffset [1.0] -->
+ <!-- #### -offset_period [1] -->
+
+ <hgroup>
+ <boolean id="trail" _label="Leave a trail" arg-set="-trail"/>
+ <boolean id="explain" _label="Explain modes" arg-set="-explain"/>
+ <boolean id="wrap" _label="Wrap the screen" arg-set="-wrap"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Zooming chains of sinusoidal spots.
+
+Written by Ashton Trey Belew; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/config/winduprobot.xml b/hacks/config/winduprobot.xml
new file mode 100644
index 0000000..0aaf78a
--- /dev/null
+++ b/hacks/config/winduprobot.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="winduprobot" _label="WindupRobot" gl="yes">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=RmpsDx9MuUM"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="speed" type="slider" arg="-speed %"
+ _label="Robot speed" _low-label="Slow" _high-label="Fast"
+ low="0.01" high="8.0" default="1.0"/>
+
+ <number id="count" type="slider" arg="-count %"
+ _label="Number of robots" _low-label="One" _high-label="Lots"
+ low="1" high="100" default="25"/>
+
+ <number id="size" type="slider" arg="-size %"
+ _label="Robot size" _low-label="Tiny" _high-label="Huge"
+ low="0.1" high="10.0" default="1.0"/>
+
+ <number id="opacity" type="slider" arg="-opacity %"
+ _label="Robot skin transparency" _low-label="Invisible" _high-label="Solid"
+ low="0.0" high="1.0" default="1.0"/>
+
+ </vgroup>
+
+ <vgroup>
+ <number id="talk" type="slider" arg="-talk %"
+ _label="Word bubbles" _low-label="Never" _high-label="Often"
+ low="0.0" high="1.0" default="0.2"/>
+
+ <xscreensaver-text />
+
+ <hgroup>
+ <boolean id="texture" _label="Chrome" arg-unset="-no-texture"/>
+ <boolean id="fade" _label="Fade opacity" arg-unset="-no-fade"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </hgroup>
+
+ </vgroup>
+
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+A swarm of wind-up toy robots wander around the table-top, bumping
+into each other. Each robot contains a mechanically accurate gear
+system inside, which you can see when the robot's shell occasionally
+fades to transparency. Also, sometimes a cartoony word bubble pops up
+above a robot, full of random text.
+
+Written by Jamie Zawinski; 2014.
+ </_description>
+</screensaver>
diff --git a/hacks/config/worm.xml b/hacks/config/worm.xml
new file mode 100644
index 0000000..9678f29
--- /dev/null
+++ b/hacks/config/worm.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="worm" _label="Worm">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=-S26J2Ja11g"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="17000"
+ convert="invert"/>
+
+ <number id="ncolors" type="slider" arg="-ncolors %"
+ _label="Number of colors" _low-label="Two" _high-label="Many"
+ low="1" high="255" default="150"/>
+
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Count" low="-100" high="100" default="-20"/>
+
+ <number id="size" type="spinbutton" arg="-size %"
+ _label="Size" low="-20" high="20" default="-3"/>
+
+ <!-- #### -cycles [10] -->
+ <!-- #### -3d -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This screen saver was removed from the XScreenSaver distribution as of
+version 5.08.
+
+Draws multicolored worms that crawl around the screen.
+
+Written by Brad Taylor, Dave Lemke, Boris Putanec, and Henrik Theiling; 1991.
+ </_description>
+</screensaver>
diff --git a/hacks/config/wormhole.xml b/hacks/config/wormhole.xml
new file mode 100644
index 0000000..387afa1
--- /dev/null
+++ b/hacks/config/wormhole.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="wormhole" _label="Wormhole">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=jGuJU8JKxlI"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="zspeed" type="slider" arg="-zspeed %"
+ _label="Star speed" _low-label="Slow" _high-label="Fast"
+ low="1" high="30" default="10"/>
+
+ <number id="stars" type="slider" arg="-stars %"
+ _label="Stars created" _low-label="Few" _high-label="Lots"
+ low="1" high="100" default="20"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Flying through a colored wormhole in space.
+
+Written by Jon Rafkind; 2004.
+ </_description>
+</screensaver>
diff --git a/hacks/config/xanalogtv.xml b/hacks/config/xanalogtv.xml
new file mode 100644
index 0000000..5064ca1
--- /dev/null
+++ b/hacks/config/xanalogtv.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="xanalogtv" _label="XAnalogTV">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=VmM1KkFsry0"/>
+
+ <hgroup>
+ <vgroup>
+ <xscreensaver-image />
+ </vgroup>
+ <vgroup>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ <boolean id="colorbars" _label="Colorbars only" arg-set="-colorbars-only"/>
+ </vgroup>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <number id="tvcolor" type="slider" arg="-tv-color %"
+ _label="Color Knob" _low-label="Low" _high-label="High"
+ low="0" high="400" default="70"/>
+ <number id="tvtint" type="slider" arg="-tv-tint %"
+ _label="Tint Knob" _low-label="Low" _high-label="High"
+ low="0" high="360" default="5"/>
+ </vgroup>
+ <vgroup>
+ <number id="tvbrightness" type="slider" arg="-tv-brightness %"
+ _label="Brightness Knob" _low-label="Low" _high-label="High"
+ low="-75.0" high="100.0" default="3.0"/>
+ <number id="tvcontrast" type="slider" arg="-tv-contrast %"
+ _label="Contrast Knob" _low-label="Low" _high-label="High"
+ low="0" high="1500" default="1000"/>
+ </vgroup>
+ </hgroup>
+
+ <xscreensaver-updater />
+
+ <_description>
+An old TV set, including artifacts like snow, bloom, distortion,
+ghosting, and hash noise. It also simulates the TV warming up. It
+will cycle through 12 channels, some with images you give it, and some
+with color bars or nothing but static.
+
+Written by Trevor Blackwell; 2003.
+ </_description>
+</screensaver>
diff --git a/hacks/config/xflame.xml b/hacks/config/xflame.xml
new file mode 100644
index 0000000..783dcab
--- /dev/null
+++ b/hacks/config/xflame.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="xflame" _label="XFlame">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=jUJiULU4i0k"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+<!-- <file id="bitmap" _label="Bitmap file" arg="-bitmap %"/> -->
+
+ <!-- #### -baseline [20] -->
+ <!-- #### -hspread [30] -->
+ <!-- #### -vspread [97] -->
+ <!-- #### -residual [99] -->
+ <!-- #### -variance [50] -->
+ <!-- #### -vartrend [20] -->
+
+ <boolean id="bloom" _label="Enable blooming" arg-unset="-no-bloom"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Pulsing fire. It can also take an arbitrary image and set it on fire too.
+
+Written by Carsten Haitzler and many others; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/xjack.xml b/hacks/config/xjack.xml
new file mode 100644
index 0000000..542d19f
--- /dev/null
+++ b/hacks/config/xjack.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="xjack" _label="XJack">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=wSOiSrEbxu4"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0" high="200000" default="50000"
+ convert="invert"/>
+
+ <!-- #### -font [] -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+This behaves schizophrenically and makes a lot of typos.
+
+Written by Jamie Zawinski; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/xlyap.xml b/hacks/config/xlyap.xml
new file mode 100644
index 0000000..1d2e176
--- /dev/null
+++ b/hacks/config/xlyap.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="xlyap" _label="XLyap">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=5MrEaXnhEPg"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="linger" type="slider" arg="-linger %"
+ _label="Linger" _low-label="Brief" _high-label="Long"
+ low="0" high="10" default="5" />
+
+ <!-- #### -builtin [-1] -->
+ <!-- #### -C [1] -->
+ <!-- #### -D [50] -->
+ <!-- #### -L -->
+ <!-- #### -M [1.0] -->
+ <!-- #### -O [0] -->
+ <!-- #### -R [] -->
+ <!-- #### -S [50] -->
+ <!-- #### -a [2.0] -->
+ <!-- #### -b [2.0] -->
+ <!-- #### -c [7] -->
+ <!-- #### -F [10101010] -->
+ <!-- #### -f [abbabaab] -->
+ <!-- #### -h [] -->
+ <!-- #### -i [0.65] -->
+ <!-- #### -m [] -->
+ <!-- #### -o [] -->
+ <!-- #### -p -->
+ <!-- #### -r [65000] -->
+ <!-- #### -s [256] -->
+ <!-- #### -v -->
+ <!-- #### -w [] -->
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+The Lyapunov exponent makes pretty fractal pictures.
+
+https://en.wikipedia.org/wiki/Lyapunov_exponent
+
+Written by Ron Record; 1997.
+ </_description>
+</screensaver>
diff --git a/hacks/config/xmatrix.xml b/hacks/config/xmatrix.xml
new file mode 100644
index 0000000..b1afe9c
--- /dev/null
+++ b/hacks/config/xmatrix.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="xmatrix" _label="XMatrix">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=dSJQHm-YoWc"/>
+
+ <hgroup>
+ <select id="size">
+ <option id="font1" _label="Small font" arg-set="-small"/>
+ <option id="font2" _label="Large font"/>
+ </select>
+
+ <select id="mode">
+ <option id="matrix" _label="Matrix encoding"/>
+ <option id="binary" _label="Binary encoding" arg-set="-mode binary"/>
+ <option id="hex" _label="Hexadecimal encoding" arg-set="-mode hex"/>
+ <option id="dna" _label="Genetic encoding" arg-set="-mode dna"/>
+ <option id="pipe" _label="Piped ASCII text" arg-set="-mode pipe"/>
+ </select>
+
+ <select id="fill">
+ <option id="both" _label="Synergistic algorithm"/>
+ <option id="top" _label="Slider algorithm" arg-set="-insert top"/>
+ <option id="bottom" _label="Expansion algorithm" arg-set="-insert bottom"/>
+ </select>
+ </hgroup>
+
+ <hgroup>
+ <boolean id="trace" _label="Run trace program" arg-unset="-no-trace"/>
+ <boolean id="knock" _label="Knock knock" arg-unset="-no-knock-knock"/>
+ <string id="phone" _label="Phone number" arg="-phone %"/>
+ </hgroup>
+
+ <hgroup>
+ <vgroup>
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="density" type="slider" arg="-density %"
+ _label="Density" _low-label="Sparse" _high-label="Full"
+ low="1" high="100" default="75"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ </vgroup>
+ <vgroup>
+ <xscreensaver-text />
+ </vgroup>
+ </hgroup>
+
+ <_description>
+The "digital rain" effect, as seen on the computer monitors in
+"The Matrix".
+
+See also "GLMatrix" for a 3D rendering of the similar effect that
+appeared in the movie's title sequence.
+
+https://en.wikipedia.org/wiki/Matrix_digital_rain
+
+Written by Jamie Zawinski; 1999.
+ </_description>
+</screensaver>
diff --git a/hacks/config/xrayswarm.xml b/hacks/config/xrayswarm.xml
new file mode 100644
index 0000000..5aaf815
--- /dev/null
+++ b/hacks/config/xrayswarm.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="xrayswarm" _label="XRaySwarm">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=e_E-k37b4Vc"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Worm-like swarms of particles with vapor trails.
+
+Written by Chris Leger; 2000.
+ </_description>
+</screensaver>
diff --git a/hacks/config/xspirograph.xml b/hacks/config/xspirograph.xml
new file mode 100644
index 0000000..6be28f0
--- /dev/null
+++ b/hacks/config/xspirograph.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="xspirograph" _label="XSpirograph">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=XWCeQqzNavY"/>
+
+ <number id="delay" type="slider" arg="-subdelay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="20000"
+ convert="invert"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Linger" _low-label="1 second" _high-label="1 minute"
+ low="1" high="60" default="5"/>
+
+ <number id="layers" type="spinbutton" arg="-layers %"
+ _label="Layers" low="1" high="10" default="2"/>
+
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+ <xscreensaver-updater />
+
+ <_description>
+Simulates that pen-in-nested-plastic-gears toy from your childhood.
+
+https://en.wikipedia.org/wiki/Spirograph
+
+Written by Rohit Singh; 2000.
+ </_description>
+</screensaver>
diff --git a/hacks/config/xss.dtd b/hacks/config/xss.dtd
new file mode 100644
index 0000000..212d53d
--- /dev/null
+++ b/hacks/config/xss.dtd
@@ -0,0 +1,109 @@
+<!-- xscreensaver, Copyright (c) 2001-2012 Jamie Zawinski <jwz@jwz.org> -->
+<!--
+ Permission to use, copy, modify, distribute, and sell this software and its
+ documentation for any purpose is hereby granted without fee, provided that
+ the above copyright notice appear in all copies and that both that
+ copyright notice and this permission notice appear in supporting
+ documentation. No representations are made about the suitability of this
+ software for any purpose. It is provided "as is" without express or
+ implied warranty.
+-->
+<!--
+This DTD validates the format of the XScreenSaver configuration files.
+
+The DTD will not be devloped further, as the .XSD style validation
+can already check more of the details of the config files.
+
+DTD written by Andrew Thompson <andrewthommo@gmail.com>
+-->
+<!-- XScreenSaver settings config file. - DTD version 1.0 -->
+<!ELEMENT screensaver
+ ((command|fullcommand)*,
+ (boolean|number|select|string|file|hgroup|vgroup|xscreensaver-text|xscreensaver-image)*,
+ _description)>
+<!ATTLIST screensaver
+ name CDATA #REQUIRED
+ _label CDATA #REQUIRED
+ gl CDATA #IMPLIED
+ >
+
+<!-- Every XScreenSaver hack has exactly one of either command or fullcommand -->
+<!ELEMENT command EMPTY>
+<!ATTLIST command
+ arg CDATA #IMPLIED
+ >
+
+<!-- Checkbox -->
+<!-- One of either arg-set or arg-unset is required -->
+<!ELEMENT boolean EMPTY>
+<!ATTLIST boolean
+ id ID #IMPLIED
+ _label CDATA #REQUIRED
+ arg-set CDATA #IMPLIED
+ arg-unset CDATA #IMPLIED
+ >
+
+<!-- Slider and Spin Button -->
+<!-- _low/high-label not required for type spinbutton -->
+<!-- arg must end with ' %' -->
+<!ELEMENT number EMPTY>
+<!ATTLIST number
+ id ID #IMPLIED
+ type (slider|spinbutton) #REQUIRED
+ _label CDATA #REQUIRED
+ _low-label CDATA #IMPLIED
+ _high-label CDATA #IMPLIED
+ arg CDATA #REQUIRED
+ low CDATA #REQUIRED
+ high CDATA #REQUIRED
+ default CDATA #REQUIRED
+ convert (invert) #IMPLIED
+ >
+
+<!-- Drop-down list -->
+<!ELEMENT select (option+)>
+<!ATTLIST select
+ id ID #IMPLIED
+ >
+
+<!-- List item -->
+<!ELEMENT option EMPTY>
+<!ATTLIST option
+ id ID #IMPLIED
+ _label CDATA #REQUIRED
+ arg-set CDATA #IMPLIED
+ >
+
+<!-- String or Textual input -->
+<!-- arg must end with ' %' -->
+<!ELEMENT string EMPTY>
+<!ATTLIST string
+ id ID #IMPLIED
+ _label CDATA #REQUIRED
+ arg CDATA #REQUIRED
+ >
+
+<!-- File browser. -->
+<!-- arg must end with ' %' -->
+<!ELEMENT file EMPTY>
+<!ATTLIST file
+ id ID #IMPLIED
+ _label CDATA #REQUIRED
+ arg CDATA #REQUIRED
+ >
+
+<!ELEMENT xscreensaver-text EMPTY>
+<!ELEMENT xscreensaver-image EMPTY>
+
+<!-- Free Text. The description of the Screen Saver. -->
+<!ELEMENT _description (#PCDATA)>
+
+<!-- Horizontal grouping element, a row of widgets.
+Unimplemented in SaverBeans as of API 0.2. -->
+<!ELEMENT hgroup ((boolean|number|select|string|file|vgroup)*)> <!-- Undocumented -->
+
+<!-- Vertical grouping element, a column of widgets.
+Since the widgets are normally arranged in a column,
+this is only of use within an hgroup.
+Unimplemented in SaverBeans as of API 0.2. -->
+<!ELEMENT vgroup ((boolean|number|select|string|file|hgroup)*)> <!-- Undocumented --> \ No newline at end of file
diff --git a/hacks/config/xss.xsd b/hacks/config/xss.xsd
new file mode 100644
index 0000000..fac1fe3
--- /dev/null
+++ b/hacks/config/xss.xsd
@@ -0,0 +1,375 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- xscreensaver, Copyright (c) 2001-2005 Jamie Zawinski <jwz@jwz.org> -->
+<!--
+ Permission to use, copy, modify, distribute, and sell this software and its
+ documentation for any purpose is hereby granted without fee, provided that
+ the above copyright notice appear in all copies and that both that
+ copyright notice and this permission notice appear in supporting
+ documentation. No representations are made about the suitability of this
+ software for any purpose. It is provided "as is" without express or
+ implied warranty.
+-->
+<!-- XScreenSaver schema version 0.5
+
+This schema validates the format of the XScreenSaver configuration files.
+
+The notices shown above, appear at the top of the source of 'demo-Gtk-conf.c'.
+Since this schema (attempts to) describe the format of the existing
+XScreenSaver configuration files, it seems appropriate to reproduce them here.
+If it is not appropriate, please ignore/remove them rather than sue me.
+
+To check a savername.xml, reference this XSD from the file and validate it at
+ http://www.w3.org/2001/03/webdata/xsv
+
+** Background
+Andrew Thompson defined a DTD based on his understanding of the
+XScreenSaver configuration files after examining the files..
+xscreensaver-4.22
+ |- hacks
+ | |- config
+ | README
+ | *.xml
+ |- driver
+ demo-Gtk-conf.c
+
+Paul Dennis generated an XSD file (xscreensaver.xsd) from the DTD.
+This is a stricter version of that XSD, with more comments and
+documentation by Andrew Thompson.
+
+Note that Andrew does not program in c, and has not had the
+opportunity to see XScreenSaver in action (he runs Windows),
+so some of the details of the schema may be incorrect. It aims
+to be cautious, and thus might be more strict than is actually
+required.
+
+** .XSD started as version 0.1
+- generated from the DTD.
+- checked parameter types
+ - mostly as xs:string, except for..
+ - ID's - checked as xs:ID.
+- provided grouping parse logic, but specified elements
+ with maxOccurs 'unbounded'
+
+** Tightened parsing in 0.2
+- The only field still defined as xs:string is the _description.
+- A substitutionArgumentType has been introduced to lock the form of
+ the arg to '-lettersandnumbers %'
+- An argumentType has been introduced to ensure other
+ arg/arg-set/arg-unset attributes begin with '-' and
+ are followed by at least one letter or number.
+- Float and integer numeric values (low/high/default) are checked as xs:decimal
+- Remaining attributes were tightened from xs:string to xs:token.
+
+** Tightened parsing in 0.3
+ * Note that no maximums at all are stated in the XScreenSaver README!
+- maxOccurs lowered from 'unbounded' to
+ - screensaver: '200' components/groups
+ - screensaver: '40' commands/fullcommands
+ - select: '100' options
+ - hgroup: '6' components/groups per row
+ - vgroup: '40' components/groups per column
+- maxLength of _description set to '2000' chars.
+
+** Changes in version 0.4 - Strict
+ After testing against the configuration files of the XScreenSaver
+ hacks, the following changes were made..
+- Added (+ _ / $) to allowable characters for substitutionArgumentType
+ & argumentType, but tightened baseType to xs:token
+- maxOccurs changed to
+ - screensaver: '200' -> '30' components/groups
+ (xmountains.xml has 24)
+ - screensaver: '40' -> '10' commands/fullcommands
+ - select: '100' -> '200' options
+ (to account for polyhedra.xml, which has 152 options!)
+ - hgroup: '6' -> '4' components/groups per row
+ (glplanet.xml has 4)
+ - vgroup: '40' -> '10' components/groups per column
+ (bsod.xml has 9)
+- maxLength of _description changed from '2000' to '3000' chars,
+ (covers the largest _description, 'jigglypuff.xml', at 852 chars,
+ 'magicrainbow.xml', at 2837 chars.)
+- introduced idType to facilitate maintenance between the
+ strict and loose schemas.
+
+** Changes in version 0.4 - Loose
+- made _label of number element optional (when using sliders, some
+ developers put what would normally appear in the _label, as a
+ prefix to _low-label instead)
+- widens the idType base type from xs:ID to xs:token. Since the ID is
+ unimplemented and will most likely remain so, it makes little
+ sense to ensure they are unique & valid ID's.
+
+** Changes in 0.5 - Strict
+- Minor typos. to 0.4 docs fixed.
+- Since both the XScreenSaver code and Saverbeans SettingsDialog
+seem tolerant to the _label of the number element missing, it is
+marked as 'optional' now, even in the strict version.
+
+** Limits: This version
+- specifies the 'arg-set'/'arg-unset' of 'boolean' as optional, whereas it
+ requires exactly one of either 'arg-set' or 'arg-unset'.
+- cannot properly distinguish between the 'slider' and 'spinbutton' types
+ of the 'number' element. As a result of that, '_low-label'/'_high-label'
+ are specified as not required, whereas they are actually undefined for
+ 'spinbutton' and required for 'slider'.
+- has no checks to ensure that 'default' values of ranges in the
+ number element fall between 'low' & 'high' values.
+- Selects can have no more than one option missing an arg-set attribute.
+- Arguments must be unique, but this schema does not check that.
+- _label is effectively optional for the slider type of the number element,
+ since this info can be preprended to the _low-label, but no checks are
+ done to ensure that the spinbutton type has the _label.
+
+** Undocumented.
+'undocumented' means that the element/feature was not mentioned in the
+official documentation of the format available in the -
+xscreensaver-4.22/hacks/config/README.
+-->
+<xs:schema
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified">
+
+ <!-- The root element of any XScreenSaver configuration file. -->
+ <xs:element name="screensaver">
+ <xs:complexType>
+ <xs:sequence>
+ <!-- Every XScreenSaver hack has exactly one of either
+ command or fullcommand, but my understanding is that
+ demo-Gtk-conf.c chains them together.
+ This specifies a maximum numner of commands. -->
+ <xs:choice minOccurs="0" maxOccurs="10">
+ <xs:element ref="command"/>
+ <xs:element ref="fullcommand"/>
+ </xs:choice>
+ <!-- A maximum number of components/groups is specified. -->
+ <xs:choice minOccurs="0" maxOccurs="30">
+ <xs:element ref="boolean"/>
+ <xs:element ref="number"/>
+ <xs:element ref="select"/>
+ <xs:element ref="string"/>
+ <xs:element ref="file"/>
+ <xs:element ref="hgroup"/>
+ <xs:element ref="vgroup"/>
+ </xs:choice>
+ <xs:element ref="_description"/>
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:token" use="required"/>
+ <xs:attribute name="_label" type="xs:token" use="required"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- Added to the command line when invoked. -->
+ <xs:element name="command">
+ <xs:complexType>
+ <xs:attribute name="arg" type="argumentType"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- Unimplemented in SaverBeans as of API 0.2.
+ Used only by cosmos.xml. Undocumented. -->
+ <xs:element name="fullcommand">
+ <xs:complexType>
+ <xs:attribute name="arg" type="argumentType"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- Checkbox -->
+ <xs:element name="boolean">
+ <xs:complexType>
+ <xs:attribute name="id" type="idType"/>
+ <xs:attribute name="_label" type="xs:token" use="required"/>
+ <!-- Exactly one of either arg-set or arg-unset is required -->
+ <xs:attribute name="arg-set" type="argumentType"/>
+ <xs:attribute name="arg-unset" type="argumentType"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- Slider and Spinbutton -->
+ <xs:element name="number">
+ <xs:complexType>
+ <xs:attribute name="id" type="idType"/>
+ <xs:attribute name="type" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:NMTOKEN">
+ <xs:enumeration value="slider"/>
+ <xs:enumeration value="spinbutton"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <!-- Listed as 'required' in the documentation, though XScreenSaver is
+ tolerant to it being left out. A number of hacks deliberately exclude it
+ for formatting purposes, and put the _label as prefix to _low-label -->
+ <xs:attribute name="_label" type="xs:token" />
+ <!-- _low/_high-label not defined for type spinbutton,
+ but required for slider -->
+ <xs:attribute name="_low-label" type="xs:token"/>
+ <xs:attribute name="_high-label" type="xs:token"/>
+ <xs:attribute name="arg" type="substitutionArgumentType" use="required"/>
+ <xs:attribute name="low" type="xs:decimal" use="required"/>
+ <xs:attribute name="high" type="xs:decimal" use="required"/>
+ <!-- Must logically fall between low and high, but not checked. -->
+ <xs:attribute name="default" type="xs:decimal" use="required"/>
+ <xs:attribute name="convert">
+ <xs:simpleType>
+ <xs:restriction base="xs:NMTOKEN">
+ <xs:enumeration value="invert"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- Drop-down list -->
+ <xs:element name="select">
+ <xs:complexType>
+ <xs:sequence>
+ <!-- A maximum number of options is specified, as a longer
+ drop down becomes kludgy and difficult to use. -->
+ <xs:element ref="option" maxOccurs="200"/>
+ </xs:sequence>
+ <xs:attribute name="id" type="idType"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- List item -->
+ <xs:element name="option">
+ <xs:complexType>
+ <xs:attribute name="id" type="idType"/>
+ <xs:attribute name="_label" type="xs:token" use="required"/>
+ <xs:attribute name="arg-set" type="argumentType"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- String or textual input -->
+ <xs:element name="string">
+ <xs:complexType>
+ <xs:attribute name="id" type="idType"/>
+ <xs:attribute name="_label" type="xs:token" use="required"/>
+ <xs:attribute name="arg" type="substitutionArgumentType" use="required"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- File browser. -->
+ <xs:element name="file">
+ <xs:complexType>
+ <xs:attribute name="id" type="idType"/>
+ <xs:attribute name="_label" type="xs:token" use="required"/>
+ <xs:attribute name="arg" type="substitutionArgumentType" use="required"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- Free Text. The description of the Screen Saver. -->
+ <xs:element name="_description">
+ <!-- The _description must contain text only, with no HTML formatting.
+
+ Character entities are also valid, which suggests that..
+ http://www.w3.org/TR/REC-html40/sgml/entities.html
+ ..are valid entities, though this, ..
+ http://www.w3.org/TR/1998/REC-html40-19980424/sgml/entities.html#h-24.4.1
+ ..may represent a safer sub-set.
+
+ The main entities you might require (none of which are allowed
+ in textual content in an XML file) are..
+ &lt; (= <)
+ &gt; (= >)
+ &amp; (= &)
+
+ XScreenSaver itself will probably* turn any URL enclosed in
+ &lt; / &gt; into a clickable link.
+
+ Conversion to an URL is unimplemented in SaverBeans as of API 0.2.
+
+ It might be possible to implement this in SaverBeans with the help of
+ BrowserLauncher, though that would require about 20Kb (AFAIR) of extra
+ classes in the core API distributable.
+
+ * This is based solely on the use of the delimiters in many of the
+ XScreenSaver hacks, but has not been investigated in any depth.
+ -->
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:maxLength value="3000"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+
+ <!-- Horizontal grouping element, a row of components or groups.
+ Unimplemented in SaverBeans as of API 0.2,
+ components inside groups do not appear. -->
+ <xs:element name="hgroup">
+ <xs:complexType>
+ <!-- A maximum number of components/groups per row is specified. -->
+ <xs:choice minOccurs="0" maxOccurs="4">
+ <xs:element ref="boolean"/>
+ <xs:element ref="number"/>
+ <xs:element ref="select"/>
+ <xs:element ref="string"/>
+ <xs:element ref="file"/>
+ <xs:element ref="vgroup"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- Vertical grouping element, a column of components or groups.
+ Since the components are normally arranged in a column,
+ this is only of use within an hgroup.
+ Unimplemented in SaverBeans as of API 0.2,
+ components inside groups do not appear. -->
+ <xs:element name="vgroup">
+ <xs:complexType>
+ <!-- A maximum number of components/groups per column is specified. -->
+ <xs:choice minOccurs="0" maxOccurs="10">
+ <xs:element ref="boolean"/>
+ <xs:element ref="number"/>
+ <xs:element ref="select"/>
+ <xs:element ref="string"/>
+ <xs:element ref="file"/>
+ <xs:element ref="hgroup"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- Checks that the command arguments (non substitution arg, as
+ well as arg-set/arg-unset) are of a logical (and restricted) form.
+ This determines that the type must start with '-', and contain at
+ least one letter, number or the other characters shown in the RegEx.
+ It is stricter than the XScreenSaver documentation suggests. -->
+ <xs:simpleType name="argumentType">
+ <xs:restriction base="xs:token">
+ <xs:minLength value="2"/>
+ <xs:pattern value="-([a-zA-Z0-9 .,;:+_$#%?/\\\-])*"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <!-- Checks that the command arguments that use substitution are of
+ a logical (and quite restricted) form. This determines that the
+ type must start with '-', contain at least one letter, number
+ or the other characters shown in the RegEx.
+ It is stricter than the XScreenSaver documentation suggests. -->
+ <xs:simpleType name="substitutionArgumentType">
+ <xs:restriction base="xs:token">
+ <xs:minLength value="4"/>
+ <xs:pattern value="-([a-zA-Z0-9.,;:+_$#%?/\\\-])* %"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <!-- idType is used to validate the ID's
+ Many ID's do not parse as type xs:ID, so this type was created to
+ allow easy maintenance between the strict and loose versions of the schema.
+ The base type should be
+ - xs:ID in the strict schema, and
+ - xs:token in the loose schema.
+ Note that the base type of xs:ID overrides the minLength value of '0'
+ -->
+ <xs:simpleType name="idType">
+ <!-- strict -->
+ <xs:restriction base="xs:ID">
+ <!-- loose -->
+ <!--
+ <xs:restriction base="xs:token">
+ -->
+ <xs:minLength value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+</xs:schema>
diff --git a/hacks/config/zoom.xml b/hacks/config/zoom.xml
new file mode 100644
index 0000000..c538bb8
--- /dev/null
+++ b/hacks/config/zoom.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="zoom" _label="Zoom">
+
+ <command arg="-root"/>
+
+ <video href="https://www.youtube.com/watch?v=LeQa9inGEKc"/>
+
+ <number id="delay" type="slider" arg="-delay %"
+ _label="Frame rate" _low-label="Low" _high-label="High"
+ low="0" high="100000" default="10000"
+ convert="invert"/>
+
+ <number id="duration" type="slider" arg="-duration %"
+ _label="Duration" _low-label="10 seconds" _high-label="10 minutes"
+ low="10" high="600" default="120"/>
+
+ <hgroup>
+ <vgroup>
+ <number id="pixwidth" type="spinbutton" arg="-pixwidth %"
+ _label="X mag" low="2" high="100" default="40" />
+ <number id="pixspacex" type="spinbutton" arg="-pixspacex %"
+ _label=" X border" low="0" high="10" default="2" />
+ <number id="lensoffsetx" type="spinbutton" arg="-lensoffsetx %"
+ _label=" X lens" low="1" high="100" default="5" />
+ </vgroup>
+ <vgroup>
+ <number id="pixheight" type="spinbutton" arg="-pixheight %"
+ _label="Y mag" low="2" high="100" default="40" />
+ <number id="pixspacey" type="spinbutton" arg="-pixspacey %"
+ _label=" Y border" low="0" high="10" default="2" />
+ <number id="lensoffsety" type="spinbutton" arg="-lensoffsety %"
+ _label=" Y lens" low="1" high="100" default="5" />
+ </vgroup>
+
+ <vgroup>
+ <boolean id="lenses" _label="Lenses" arg-unset="-no-lenses"/>
+ <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+ </vgroup>
+
+ </hgroup>
+
+ <xscreensaver-image />
+
+ <xscreensaver-updater />
+
+ <_description>
+Fatbits! Zooms in on a part of the screen and then moves around.
+With the "Lenses" option, the result is like looking through many
+overlapping lenses rather than just a simple zoom.
+
+Written by James Macnicol; 2001.
+ </_description>
+</screensaver>
diff --git a/hacks/coral.c b/hacks/coral.c
new file mode 100644
index 0000000..9cfcf50
--- /dev/null
+++ b/hacks/coral.c
@@ -0,0 +1,314 @@
+/* coral, by "Frederick G.M. Roeber" <roeber@netscape.com>, 15-jul-97.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include "screenhack.h"
+#include "colors.h"
+#include "erase.h"
+
+#define NCOLORSMAX 200
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ GC draw_gc, erase_gc;
+ unsigned int default_fg_pixel;
+ XColor colors[NCOLORSMAX];
+ int ncolors;
+ int colorindex;
+ int colorsloth;
+
+ XPoint *walkers;
+ int nwalkers;
+ int width, widthb;
+ int height;
+ int delay, delay2;
+ int max_points;
+ XPoint *pointbuf;
+
+ unsigned int *board;
+
+ int done, reset;
+ int npoints;
+ eraser_state *eraser;
+};
+
+
+#define getdot(x,y) (st->board[(y*st->widthb)+(x>>5)] & (1<<(x & 31)))
+#define setdot(x,y) (st->board[(y*st->widthb)+(x>>5)] |= (1<<(x & 31)))
+
+
+static void
+init_coral(struct state *st)
+{
+ XGCValues gcv;
+ Colormap cmap;
+ XWindowAttributes xgwa;
+ Bool writeable = False;
+ int seeds;
+ int density;
+ int i;
+
+ XClearWindow(st->dpy, st->window);
+ XGetWindowAttributes(st->dpy, st->window, &xgwa);
+ st->width = xgwa.width;
+ st->widthb = ((xgwa.width + 31) >> 5);
+ st->height = xgwa.height;
+ if (st->board) free(st->board);
+ st->board = (unsigned int *)calloc(st->widthb * xgwa.height, sizeof(unsigned int));
+ if(!st->board) exit(1);
+ cmap = xgwa.colormap;
+ if( st->ncolors ) {
+ free_colors(xgwa.screen, cmap, st->colors, st->ncolors);
+ st->ncolors = 0;
+ }
+ gcv.foreground = st->default_fg_pixel = get_pixel_resource(st->dpy, cmap, "foreground", "Foreground");
+ st->draw_gc = XCreateGC(st->dpy, st->window, GCForeground, &gcv);
+ gcv.foreground = get_pixel_resource (st->dpy, cmap, "background", "Background");
+ st->erase_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv);
+ st->ncolors = NCOLORSMAX;
+ make_uniform_colormap(xgwa.screen, xgwa.visual, cmap,
+ st->colors, &st->ncolors, True, &writeable, False);
+ if (st->ncolors <= 0) {
+ st->ncolors = 2;
+ st->colors[0].red = st->colors[0].green = st->colors[0].blue = 0;
+ st->colors[1].red = st->colors[1].green = st->colors[1].blue = 0xFFFF;
+ XAllocColor(st->dpy, cmap, &st->colors[0]);
+ XAllocColor(st->dpy, cmap, &st->colors[1]);
+ }
+ st->colorindex = random()%st->ncolors;
+
+ density = get_integer_resource(st->dpy, "density", "Integer");
+ if( density < 1 ) density = 1;
+ if( density > 100 ) density = 90; /* more like mold than coral */
+ st->nwalkers = (st->width*st->height*density)/100;
+ if (st->walkers) free(st->walkers);
+ st->walkers = (XPoint *)calloc(st->nwalkers, sizeof(XPoint));
+ if( (XPoint *)0 == st->walkers ) exit(1);
+
+ seeds = get_integer_resource(st->dpy, "seeds", "Integer");
+ if( seeds < 1 ) seeds = 1;
+ if( seeds > 1000 ) seeds = 1000;
+
+ st->colorsloth = st->nwalkers*2/st->ncolors;
+ XSetForeground(st->dpy, st->draw_gc, st->colors[st->colorindex].pixel);
+
+ if ((st->width <= 2) || (st->height <= 2)) return;
+
+ for( i = 0; i < seeds; i++ ) {
+ int x, y;
+ int max_repeat = 10;
+ do {
+ x = 1 + random() % (st->width - 2);
+ y = 1 + random() % (st->height - 2);
+ } while( getdot(x, y) && max_repeat--);
+
+ setdot((x-1), (y-1)); setdot(x, (y-1)); setdot((x+1), (y-1));
+ setdot((x-1), y ); setdot(x, y ); setdot((x+1), y );
+ setdot((x-1), (y+1)); setdot(x, (y+1)); setdot((x+1), (y+1));
+ XDrawPoint(st->dpy, st->window, st->draw_gc, x, y);
+ }
+
+ for( i = 0; i < st->nwalkers; i++ ) {
+ st->walkers[i].x = (random() % (st->width-2)) + 1;
+ st->walkers[i].y = (random() % (st->height-2)) + 1;
+ }
+}
+
+
+/* returns 2 bits of randomness (conserving calls to random()).
+ This speeds things up a little, but not a lot (5-10% or so.)
+ */
+static int
+rand_2(void)
+{
+ static int i = 0;
+ static int r = 0;
+ if (i != 0) {
+ i--;
+ } else {
+ i = 15;
+ r = random();
+ }
+
+ {
+ register int j = (r & 3);
+ r = r >> 2;
+ return j;
+ }
+}
+
+
+static int
+coral(struct state *st)
+{
+ int i = 0;
+
+ for( i = 0; i < st->nwalkers; i++ ) {
+ int x = st->walkers[i].x;
+ int y = st->walkers[i].y;
+
+ if( getdot(x, y) ) {
+
+ Bool flush = False;
+ Bool color = False;
+
+ /* XDrawPoint(dpy, window, draw_gc, x, y); */
+ st->pointbuf[st->npoints].x = x;
+ st->pointbuf[st->npoints].y = y;
+ st->npoints++;
+
+ /* Mark the surrounding area as "sticky" */
+ setdot((x-1), (y-1)); setdot(x, (y-1)); setdot((x+1), (y-1));
+ setdot((x-1), y ); setdot((x+1), y );
+ setdot((x-1), (y+1)); setdot(x, (y+1)); setdot((x+1), (y+1));
+ st->nwalkers--;
+ st->walkers[i].x = st->walkers[st->nwalkers].x;
+ st->walkers[i].y = st->walkers[st->nwalkers].y;
+ if( 0 ==
+ ((st->colorsloth ? st->nwalkers%st->colorsloth : 0)) ) {
+ color = True;
+ }
+
+ if (flush || color || 0 == st->nwalkers || st->npoints >= st->max_points) {
+ XDrawPoints(st->dpy, st->window, st->draw_gc, st->pointbuf, st->npoints,
+ CoordModeOrigin);
+ st->npoints = 0;
+ }
+
+ if (color) {
+ st->colorindex++;
+ if( st->colorindex == st->ncolors )
+ st->colorindex = 0;
+ XSetForeground(st->dpy, st->draw_gc, st->colors[st->colorindex].pixel);
+ }
+ } else {
+ /* move it a notch */
+ do {
+ switch(rand_2()) {
+ case 0:
+ if( 1 == x ) continue;
+ st->walkers[i].x--;
+ break;
+ case 1:
+ if( st->width-2 == x ) continue;
+ st->walkers[i].x++;
+ break;
+ case 2:
+ if( 1 == y ) continue;
+ st->walkers[i].y--;
+ break;
+ default: /* case 3: */
+ if( st->height-2 == y ) continue;
+ st->walkers[i].y++;
+ break;
+ /* default:
+ abort(); */
+ }
+ } while(0);
+ }
+ }
+
+ return (0 == st->nwalkers);
+}
+
+static void *
+coral_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ st->dpy = dpy;
+ st->window = window;
+ st->max_points = 200;
+ st->pointbuf = (XPoint *) calloc(sizeof(XPoint), st->max_points+2);
+ if (!st->pointbuf) exit(-1);
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ st->delay2 = get_integer_resource (st->dpy, "delay2", "Integer");
+ st->reset = 1;
+ return st;
+}
+
+
+static unsigned long
+coral_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if (st->eraser || st->done)
+ {
+ st->done = 0;
+ st->eraser = erase_window (st->dpy, st->window, st->eraser);
+ return st->delay2;
+ }
+
+ if (st->reset)
+ init_coral(st);
+ st->reset = st->done = coral(st);
+
+ return (st->reset
+ ? (st->delay * 1000000)
+ : st->delay2);
+}
+
+static void
+coral_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ init_coral(st);
+}
+
+static Bool
+coral_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->reset = 1;
+ return True;
+ }
+ return False;
+}
+
+static void
+coral_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st->pointbuf);
+ if (st->walkers) free (st->walkers);
+ if (st->board) free (st->board);
+ free (st);
+}
+
+static const char *coral_defaults[] = {
+ ".lowrez: true",
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*density: 25",
+ "*seeds: 20", /* too many for 640x480, too few for 1280x1024 */
+ "*delay: 5",
+ "*delay2: 20000",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec coral_options[] = {
+ { "-density", ".density", XrmoptionSepArg, 0 },
+ { "-seeds", ".seeds", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-delay2", ".delay2", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Coral", coral)
diff --git a/hacks/coral.man b/hacks/coral.man
new file mode 100644
index 0000000..aaa497e
--- /dev/null
+++ b/hacks/coral.man
@@ -0,0 +1,64 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+coral - simulates coral growth, albeit somewhat slowly.
+.SH SYNOPSIS
+.B coral
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay2 \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-density \fInumber\fP]
+[\-seeds \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Simulates coral growth, albeit somewhat slowly.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay2 \fInumber\fP
+Per-frame delay, in microseconds. Default: 1000 (0.001 seconds.).
+.TP 8
+.B \-delay \fInumber\fP
+Duration. 1 - 60. Default: 5.
+.TP 8
+.B \-density \fInumber\fP
+Density. 1 - 90. Default: 25.
+.TP 8
+.B \-seeds \fInumber\fP
+Seeds. 1 - 100. Default: 20.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Frederick Roeber. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Frederick Roeber.
diff --git a/hacks/critical.c b/hacks/critical.c
new file mode 100644
index 0000000..81fd0c1
--- /dev/null
+++ b/hacks/critical.c
@@ -0,0 +1,454 @@
+/* critical -- Self-organizing-criticality display hack for XScreenSaver
+ * Copyright (C) 1998, 1999, 2000 Martin Pool <mbp@humbug.org.au>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation. No representations are made
+ * about the suitability of this software for any purpose. It is
+ * provided "as is" without express or implied warranty.
+ *
+ * See `critical.man' for more information.
+ *
+ * Revision history:
+ * 13 Nov 1998: Initial version, Martin Pool <mbp@humbug.org.au>
+ * 08 Feb 2000: Change to keeping and erasing a trail, <mbp>
+ *
+ * It would be nice to draw curvy shapes rather than just straight
+ * lines, but X11 doesn't have spline primitives (?) so we'd have to
+ * do all the work ourselves */
+
+#include "screenhack.h"
+#include "erase.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+
+typedef struct {
+ int width, height; /* in cells */
+ unsigned short *cells;
+} CriticalModel;
+
+typedef struct {
+ int trail; /* length of trail */
+ int cell_size;
+} CriticalSettings;
+
+
+/* Number of screens that should be drawn before reinitializing the
+ model, and count of the number of screens done so far. */
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ int n_restart, i_restart;
+ XWindowAttributes wattr;
+ CriticalModel *model;
+ int batchcount;
+ XPoint *history; /* in cell coords */
+ long delay_usecs;
+ GC fgc, bgc;
+ XGCValues gcv;
+ CriticalSettings settings;
+
+ int d_n_colors;
+ XColor *d_colors;
+ int lines_per_color;
+ int d_i_color;
+ int d_pos;
+ int d_wrapped;
+
+ int d_i_batch;
+ eraser_state *eraser;
+
+};
+
+
+static CriticalModel * model_allocate (int w, int h);
+static void model_initialize (CriticalModel *);
+
+
+static int
+clip (int low, int val, int high)
+{
+ if (val < low)
+ return low;
+ else if (val > high)
+ return high;
+ else
+ return val;
+}
+
+
+/* Allocate an return a new simulation model datastructure.
+ */
+
+static CriticalModel *
+model_allocate (int model_w, int model_h)
+{
+ CriticalModel *mm;
+
+ mm = malloc (sizeof (CriticalModel));
+ if (!mm)
+ return 0;
+
+ mm->width = model_w;
+ mm->height = model_h;
+
+ mm->cells = malloc (sizeof (unsigned short) * model_w * model_h);
+ if (!mm->cells) {
+ free (mm);
+ return 0;
+ }
+
+ return mm;
+}
+
+
+
+/* Initialize the data model underlying the hack.
+
+ For the self-organizing criticality hack, this consists of a 2d
+ array full of random integers.
+
+ I've considered storing the data as (say) a binary tree within a 2d
+ array, to make finding the highest value faster at the expense of
+ storage space: searching the whole array on each iteration seems a
+ little inefficient. However, the screensaver doesn't seem to take
+ up many cycles as it is: presumably the search is pretty quick
+ compared to the sleeps. The current version uses less than 1% of
+ the CPU time of an AMD K6-233. Many machines running X11 at this
+ point in time seem to be memory-limited, not CPU-limited.
+
+ The root of all evil, and all that.
+*/
+
+
+static void
+model_initialize (CriticalModel *mm)
+{
+ int i;
+
+ for (i = mm->width * mm->height - 1; i >= 0; i--)
+ {
+ mm->cells[i] = (unsigned short) random ();
+ }
+}
+
+
+/* Move one step forward in the criticality simulation.
+
+ This function locates and returns in (TOP_X, TOP_Y) the location of
+ the highest-valued cell in the model. It also replaces that cell
+ and it's eight nearest neighbours with new random values.
+ Neighbours that fall off the edge of the model are simply
+ ignored. */
+static void
+model_step (CriticalModel *mm, XPoint *ptop)
+{
+ int x, y, i;
+ int dx, dy;
+ unsigned short top_value = 0;
+ int top_x = 0, top_y = 0;
+
+ /* Find the top cell */
+ top_value = 0;
+ i = 0;
+ for (y = 0; y < mm->height; y++)
+ for (x = 0; x < mm->width; x++)
+ {
+ if (mm->cells[i] >= top_value)
+ {
+ top_value = mm->cells[i];
+ top_x = x;
+ top_y = y;
+ }
+ i++;
+ }
+
+ /* Replace it and its neighbours with new random values */
+ for (dy = -1; dy <= 1; dy++)
+ {
+ int yy = top_y + dy;
+ if (yy < 0 || yy >= mm->height)
+ continue;
+
+ for (dx = -1; dx <= 1; dx++)
+ {
+ int xx = top_x + dx;
+ if (xx < 0 || xx >= mm->width)
+ continue;
+
+ mm->cells[yy * mm->width + xx] = (unsigned short) random();
+ }
+ }
+
+ ptop->x = top_x;
+ ptop->y = top_y;
+}
+
+
+/* Construct and return in COLORS and N_COLORS a new set of colors,
+ depending on the resource settings. */
+static void
+setup_colormap (struct state *st, XColor **colors, int *n_colors)
+{
+ Bool writable;
+ char const * color_scheme;
+
+ /* Make a colormap */
+ *n_colors = get_integer_resource (st->dpy, "ncolors", "Integer");
+ if (*n_colors < 3)
+ *n_colors = 3;
+
+ *colors = (XColor *) calloc (sizeof(XColor), *n_colors);
+ if (!*colors)
+ {
+ fprintf (stderr, "%s:%d: can't allocate memory for colors\n",
+ __FILE__, __LINE__);
+ return;
+ }
+
+ writable = False;
+ color_scheme = get_string_resource (st->dpy, "colorscheme", "ColorScheme");
+
+ if (!strcmp (color_scheme, "random"))
+ {
+ make_random_colormap (st->wattr.screen, st->wattr.visual,
+ st->wattr.colormap,
+ *colors, n_colors,
+ True, True, &writable, True);
+ }
+ else if (!strcmp (color_scheme, "smooth"))
+ {
+ make_smooth_colormap (st->wattr.screen, st->wattr.visual,
+ st->wattr.colormap,
+ *colors, n_colors,
+ True, &writable, True);
+ }
+ else
+ {
+ make_uniform_colormap (st->wattr.screen, st->wattr.visual,
+ st->wattr.colormap,
+ *colors, n_colors, True,
+ &writable, True);
+ }
+}
+
+
+/* Free allocated colormap created by setup_colormap. */
+static void
+free_colormap (struct state *st, XColor **colors, int n_colors)
+{
+ free_colors (st->wattr.screen, st->wattr.colormap, *colors, n_colors);
+ free (*colors);
+}
+
+
+
+/* Draw one step of the hack. Positions are cell coordinates. */
+static void
+draw_step (struct state *st, GC gc, int pos)
+{
+ int cell_size = st->settings.cell_size;
+ int half = cell_size/2;
+ int old_pos = (pos + st->settings.trail - 1) % st->settings.trail;
+
+ pos = pos % st->settings.trail;
+
+ XDrawLine (st->dpy, st->window, gc,
+ st->history[pos].x * cell_size + half,
+ st->history[pos].y * cell_size + half,
+ st->history[old_pos].x * cell_size + half,
+ st->history[old_pos].y * cell_size + half);
+}
+
+
+
+static void *
+critical_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ int model_w, model_h;
+ st->dpy = dpy;
+ st->window = window;
+
+ /* Find window attributes */
+ XGetWindowAttributes (st->dpy, st->window, &st->wattr);
+
+ st->batchcount = get_integer_resource (st->dpy, "batchcount", "Integer");
+ if (st->batchcount < 5)
+ st->batchcount = 5;
+
+ st->lines_per_color = 10;
+
+ /* For the moment the model size is just fixed -- making it vary
+ with the screen size just makes the hack boring on large
+ screens. */
+ model_w = 80;
+ st->settings.cell_size = st->wattr.width / model_w;
+ model_h = st->settings.cell_size ?
+ st->wattr.height / st->settings.cell_size : 1;
+
+ /* Construct the initial model state. */
+
+ st->settings.trail = clip(2, get_integer_resource (st->dpy, "trail", "Integer"), 1000);
+
+ st->history = calloc (st->settings.trail, sizeof (st->history[0]));
+ if (!st->history)
+ {
+ fprintf (stderr, "critical: "
+ "couldn't allocate trail history of %d cells\n",
+ st->settings.trail);
+ abort();
+ }
+
+ st->model = model_allocate (model_w, model_h);
+ if (!st->model)
+ {
+ fprintf (stderr, "critical: error preparing the model\n");
+ abort();
+ }
+
+ /* make a black gc for the background */
+ st->gcv.foreground = get_pixel_resource (st->dpy, st->wattr.colormap,
+ "background", "Background");
+ st->bgc = XCreateGC (st->dpy, st->window, GCForeground, &st->gcv);
+
+ st->fgc = XCreateGC (st->dpy, st->window, 0, &st->gcv);
+
+#ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (dpy, st->fgc, False);
+ jwxyz_XSetAntiAliasing (dpy, st->bgc, False);
+#endif
+
+ st->delay_usecs = get_integer_resource (st->dpy, "delay", "Integer");
+ st->n_restart = get_integer_resource (st->dpy, "restart", "Integer");
+
+ setup_colormap (st, &st->d_colors, &st->d_n_colors);
+ model_initialize (st->model);
+ model_step (st->model, &st->history[0]);
+ st->d_pos = 1;
+ st->d_wrapped = 0;
+ st->i_restart = 0;
+ st->d_i_batch = st->batchcount;
+
+ return st;
+}
+
+static unsigned long
+critical_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if (st->eraser) {
+ st->eraser = erase_window (st->dpy, st->window, st->eraser);
+ return st->delay_usecs;
+ }
+
+ /* for (d_i_batch = batchcount; d_i_batch; d_i_batch--) */
+ {
+ /* Set color */
+ if ((st->d_i_batch % st->lines_per_color) == 0)
+ {
+ st->d_i_color = (st->d_i_color + 1) % st->d_n_colors;
+ st->gcv.foreground = st->d_colors[st->d_i_color].pixel;
+ XChangeGC (st->dpy, st->fgc, GCForeground, &st->gcv);
+ }
+
+ assert(st->d_pos >= 0 && st->d_pos < st->settings.trail);
+ model_step (st->model, &st->history[st->d_pos]);
+
+ draw_step (st, st->fgc, st->d_pos);
+
+ /* we use the history as a ring buffer, but don't start erasing until
+ we've d_wrapped around once. */
+ if (++st->d_pos >= st->settings.trail)
+ {
+ st->d_pos -= st->settings.trail;
+ st->d_wrapped = 1;
+ }
+
+ if (st->d_wrapped)
+ {
+ draw_step (st, st->bgc, st->d_pos+1);
+ }
+
+ }
+
+ st->d_i_batch--;
+ if (st->d_i_batch < 0)
+ st->d_i_batch = st->batchcount;
+ else
+ return st->delay_usecs;
+
+ st->i_restart = (st->i_restart + 1) % st->n_restart;
+
+ if (st->i_restart == 0)
+ {
+ /* Time to start a new simulation, this one has probably got
+ to be a bit boring. */
+ free_colormap (st, &st->d_colors, st->d_n_colors);
+ setup_colormap (st, &st->d_colors, &st->d_n_colors);
+ st->eraser = erase_window (st->dpy, st->window, st->eraser);
+ model_initialize (st->model);
+ model_step (st->model, &st->history[0]);
+ st->d_pos = 1;
+ st->d_wrapped = 0;
+ st->d_i_batch = st->batchcount;
+ }
+
+ return st->delay_usecs;
+}
+
+static void
+critical_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static Bool
+critical_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+critical_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+/* Options this module understands. */
+static XrmOptionDescRec critical_options[] = {
+ { "-ncolors", ".ncolors", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-colorscheme", ".colorscheme", XrmoptionSepArg, 0 },
+ { "-restart", ".restart", XrmoptionSepArg, 0 },
+ { "-batchcount", ".batchcount", XrmoptionSepArg, 0 },
+ { "-trail", ".trail", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 } /* end */
+};
+
+
+/* Default xrm resources. */
+static const char *critical_defaults[] = {
+ ".background: black",
+ "*fpsSolid: true",
+ "*colorscheme: smooth",
+ "*delay: 10000",
+ "*ncolors: 64",
+ "*restart: 8",
+ "*batchcount: 1500",
+ "*trail: 50",
+ 0 /* end */
+};
+
+
+XSCREENSAVER_MODULE ("Critical", critical)
diff --git a/hacks/critical.man b/hacks/critical.man
new file mode 100644
index 0000000..324c116
--- /dev/null
+++ b/hacks/critical.man
@@ -0,0 +1,94 @@
+.TH XScreenSaver 1 "08 Feb 2000" "X Version 11"
+.SH NAME
+critical - Draw a system showing self-organizing criticality
+.SH SYNOPSIS
+.B critical
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIseconds\fP] [\-random \fIboolean\fP] [\-ncolors \fIint\fP] [\-offset \fIint\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIcritical\fP program displays a self-organizing critical system
+that gradually emerges from chaos.
+
+\fIcritical\fP performs a simulation on a two-dimensional array of
+integers. The array is initialized to random values. On each
+iteration, it draws a line to the array position with the greatest
+value. It then replaces that location and the eight neighboring
+locations with randomly-selected values.
+
+The lines are initially random, but over time a chaotic
+self-organizing system evolves: areas of the screen which happen to
+have lower values are less likely to be updated to new values, and so
+the line tends to avoid those areas. Eventually, the histogram of
+changes approaches the power-law curve typical of such systems.
+
+The simplest documented self-organizing system is the one-dimensional
+equivalent of \fIcritical\fP.
+
+I heard about this algorithm second-hand: apparently there was an
+article in \fIScientific American\fP describing it sometime in 1997.
+.SH OPTIONS
+.I critical
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIusecs\fP
+Number of microseconds to wait after drawing each line.
+.TP 8
+.B \-random \fIboolean\fP
+Whether to use randomly selected colours rather than a cycle around
+the colour wheel.
+.TP 8
+.B \-offset \fIinteger\fP
+The maximum random radius increment to use.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be allocated in the color ramp (note that this
+value interacts with \fIoffset\fP.)
+.TP 8
+.B \-trail \fIinteger\fP
+Length of the trail: between 5 and 100 is nice.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver-command (1)
+.BR xscreensaver-demo (1)
+.SH COPYRIGHT
+Copyright \(co 1998 by Martin Pool.
+
+Permission to use, copy, modify, distribute, and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Martin Pool <mbp@humbug.org.au>, 1998-2000. Based in part on the
+XScreenSaver code by Jamie Zawinski <jwz@jwz.org>.
diff --git a/hacks/crystal.c b/hacks/crystal.c
new file mode 100644
index 0000000..9f33529
--- /dev/null
+++ b/hacks/crystal.c
@@ -0,0 +1,1284 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* crystal --- polygons moving according to plane group rules */
+
+#if 0
+static const char sccsid[] = "@(#)crystal.c 4.12 98/09/10 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1997 by Jouk Jansen <joukj@crys.chem.uva.nl>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The author should like to be notified if changes have been made to the
+ * routine. Response will only be guaranteed when a VMS version of the
+ * program is available.
+ *
+ * A moving polygon-mode. The polygons obey 2D-planegroup symmetry.
+ *
+ * The groupings of the cells fall in 3 categories:
+ * oblique groups 1 and 2 where the angle gamma ranges from 60 to 120 degrees
+ * square groups 3 through 11 where the angle gamma is 90 degrees
+ * hexagonal groups 12 through 17 where the angle gamma is 120 degrees
+ *
+ * Revision History:
+ * 03-Dec-98: Random inversion of y-axis included to simulate hexagonal groups
+ * with an angle of 60 degrees.
+ * 10-Sep-98: new colour scheme
+ * 24-Feb-98: added option centre which turns on/off forcing the centre of
+ * the screen to be used
+ * added option maxsize which forces the dimensions to be chasen
+ * in such ua way that the largest possible part of the screen is
+ * used
+ * When only one unit cell is drawn, it is chosen at random
+ * 18-Feb-98: added support for negative numbers with -nx and -ny meaning
+ * "random" choice with given maximum
+ * added +/-grid option. If -cell is specified this option
+ * determines if one or all unit cells are drawn.
+ * -batchcount is now a parameter for all the objects on the screen
+ * instead of the number of "unique" objects
+ * The maximum size of the objects now scales with the part
+ * of the screen used.
+ * fixed "size" problem. Now very small non-vissable objects
+ * are not allowed
+ * 13-Feb-98: randomized the unit cell size
+ * runtime options -/+cell (turn on/off unit cell drawing)
+ * -nx num (number of translational symmetries in x-direction
+ * -ny num (idem y-direction but ignored for square and
+ * hexagonal space groups
+ * i.e. try xlock -mode crystal -nx 3 -ny 2
+ * Fullrandom overrules the -/+cell option.
+ * 05-Feb-98: Revision + bug repairs
+ * shows unit cell
+ * use part of the screen for unit cell
+ * in hexagonal and square groups a&b axis forced to be equal
+ * cell angle for oblique groups randomly chosen between 60 and 120
+ * bugs solved: planegroups with cell angles <> 90.0 now work properly
+ * 19-Sep-97: Added remaining hexagonal groups
+ * 12-Jun-97: Created
+ */
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 60000 \n" \
+ "*count: -500 \n" \
+ "*cycles: 200 \n" \
+ "*size: -15 \n" \
+ "*ncolors: 100 \n" \
+ "*fpsSolid: True \n" \
+ "*ignoreRotation: True \n" \
+
+# define release_crystal 0
+# define reshape_crystal 0
+# define crystal_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+# include "color.h"
+#endif /* STANDALONE */
+
+#define DEF_CELL "True" /* Draw unit cell */
+#define DEF_GRID "False" /* Draw unit all cell if DEF_CELL is True */
+#define DEF_NX "-3" /* number of unit cells in x-direction */
+#define DEF_NX1 1 /* number of unit cells in x-direction */
+#define DEF_NY "-3" /* number of unit cells in y-direction */
+#define DEF_NY1 1 /* number of unit cells in y-direction */
+#define DEF_CENTRE "False"
+#define DEF_MAXSIZE "False"
+#define DEF_CYCLE "True"
+
+#undef NRAND
+#define NRAND(n) ( (n) ? (int) (LRAND() % (n)) : 0)
+
+#define min(a,b) ((a) <= (b) ? (a) : (b))
+
+static int nx, ny;
+
+static Bool unit_cell, grid_cell, centre, maxsize, cycle_p;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-nx", "crystal.nx", XrmoptionSepArg, 0},
+ {"-ny", "crystal.ny", XrmoptionSepArg, 0},
+ {"-centre", ".crystal.centre", XrmoptionNoArg, "on"},
+ {"+centre", ".crystal.centre", XrmoptionNoArg, "off"},
+ {"-maxsize", ".crystal.maxsize", XrmoptionNoArg, "on"},
+ {"+maxsize", ".crystal.maxsize", XrmoptionNoArg, "off"},
+ {"-cell", ".crystal.cell", XrmoptionNoArg, "on"},
+ {"+cell", ".crystal.cell", XrmoptionNoArg, "off"},
+ {"-grid", ".crystal.grid", XrmoptionNoArg, "on"},
+ {"+grid", ".crystal.grid", XrmoptionNoArg, "off"},
+ {"-shift", ".crystal.shift", XrmoptionNoArg, "on"},
+ {"+shift", ".crystal.shift", XrmoptionNoArg, "off"}
+};
+
+static argtype vars[] =
+{
+ {&nx, "nx", "nx", DEF_NX, t_Int},
+ {&ny, "ny", "ny", DEF_NY, t_Int},
+ {&centre, "centre", "Centre", DEF_CENTRE, t_Bool},
+ {&maxsize, "maxsize", "Maxsize", DEF_MAXSIZE, t_Bool},
+ {&unit_cell, "cell", "Cell", DEF_CELL, t_Bool},
+ {&grid_cell, "grid", "Grid", DEF_GRID, t_Bool},
+ {&cycle_p, "shift", "Shift", DEF_CYCLE, t_Bool}
+};
+static OptionStruct desc[] =
+{
+ {"-nx num", "Number of unit cells in x-direction"},
+ {"-ny num", "Number of unit cells in y-direction"},
+ {"-/+centre", "turn on/off centering on screen"},
+ {"-/+maxsize", "turn on/off use of maximum part of screen"},
+ {"-/+cell", "turn on/off drawing of unit cell"},
+ {"-/+grid", "turn on/off drawing of grid of unit cells (if -cell is on)"},
+ {"-/+shift", "turn on/off colour cycling"}
+};
+
+ENTRYPOINT ModeSpecOpt crystal_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct crystal_description =
+{"crystal", "init_crystal", "draw_crystal", NULL,
+ "refresh_crystal", "init_crystal", "free_crystal", &crystal_opts,
+ 60000, -40, 200, -15, 64, 1.0, "",
+ "Shows polygons in 2D plane groups", 0, NULL};
+
+#endif
+
+#define DEF_NUM_ATOM 10
+
+#define DEF_SIZ_ATOM 10
+
+#define PI_RAD (M_PI / 180.0)
+
+static Bool centro[17] =
+{
+ False,
+ True,
+ False,
+ False,
+ False,
+ True,
+ True,
+ True,
+ True,
+ True,
+ True,
+ True,
+ False,
+ False,
+ False,
+ True,
+ True
+};
+
+static Bool primitive[17] =
+{
+ True,
+ True,
+ True,
+ True,
+ False,
+ True,
+ True,
+ True,
+ False,
+ True,
+ True,
+ True,
+ True,
+ True,
+ True,
+ True,
+ True
+};
+
+static short numops[34] =
+{
+ 1, 0,
+ 1, 0,
+ 9, 7,
+ 2, 0,
+ 9, 7,
+ 9, 7,
+ 4, 2,
+ 5, 3,
+ 9, 7,
+ 8, 6,
+ 10, 6,
+ 8, 4,
+ 16, 13,
+ 19, 13,
+ 16, 10,
+ 19, 13,
+ 19, 13
+};
+
+static short operation[114] =
+{
+ 1, 0, 0, 1, 0, 0,
+ -1, 0, 0, 1, 0, 1,
+ -1, 0, 0, 1, 1, 0,
+ 1, 0, 0, 1, 0, 0,
+ -1, 0, 0, 1, 1, 1,
+ 1, 0, 0, 1, 1, 1,
+ 0, -1, 1, 0, 0, 0,
+ 1, 0, 0, 1, 0, 0,
+ -1, 0, 0, 1, 0, 0,
+ 0, 1, 1, 0, 0, 0,
+ -1, 0, -1, 1, 0, 0,
+ 1, -1, 0, -1, 0, 0,
+ 0, 1, 1, 0, 0, 0,
+ 0, -1, 1, -1, 0, 0,
+ -1, 1, -1, 0, 0, 0,
+ 1, 0, 0, 1, 0, 0,
+ 0, -1, -1, 0, 0, 0,
+ -1, 1, 0, 1, 0, 0,
+ 1, 0, 1, -1, 0, 0
+};
+
+typedef struct {
+ unsigned long colour;
+ int x0, y0, velocity[2];
+ float angle, velocity_a;
+ int num_point, at_type, size_at;
+ XPoint xy[5];
+} crystalatom;
+
+typedef struct {
+ Bool painted;
+ int win_width, win_height, num_atom;
+ int planegroup, a, b, offset_w, offset_h, nx, ny;
+ float gamma;
+ crystalatom *atom;
+ GC gc;
+ Bool unit_cell, grid_cell;
+ Colormap cmap;
+ XColor *colors;
+ int ncolors;
+ Bool cycle_p, mono_p, no_colors;
+ unsigned long blackpixel, whitepixel, fg, bg;
+ int direction, invert;
+ unsigned long grid_pixel;
+ int inx, iny;
+} crystalstruct;
+
+static crystalstruct *crystals = NULL;
+
+static void
+trans_coor(XPoint * xyp, XPoint * new_xyp, int num_points,
+ float gamma)
+{
+ int i;
+
+ for (i = 0; i <= num_points; i++) {
+ new_xyp[i].x = xyp[i].x +
+ (int) (xyp[i].y * sin((gamma - 90.0) * PI_RAD));
+ new_xyp[i].y = (int) (xyp[i].y / cos((gamma - 90.0) * PI_RAD));
+ }
+}
+
+static void
+trans_coor_back(XPoint * xyp, XPoint * new_xyp,
+ int num_points, float gamma, int offset_w, int offset_h ,
+ int winheight , int invert )
+{
+ int i;
+
+ for (i = 0; i <= num_points; i++) {
+ new_xyp[i].y = (int) (xyp[i].y * cos((gamma - 90) * PI_RAD)) +
+ offset_h;
+ new_xyp[i].x = xyp[i].x - (int) (xyp[i].y * sin((gamma - 90.0)
+ * PI_RAD)) + offset_w;
+ if ( invert ) new_xyp[i].y = winheight - new_xyp[i].y;
+ }
+}
+
+static void
+crystal_setupatom(crystalatom * atom0, float gamma)
+{
+ XPoint xy[5];
+ int x0, y0;
+
+ y0 = (int) (atom0->y0 * cos((gamma - 90) * PI_RAD));
+ x0 = atom0->x0 - (int) (atom0->y0 * sin((gamma - 90.0) * PI_RAD));
+ switch (atom0->at_type) {
+ case 0: /* rectangles */
+ xy[0].x = x0 + (int) (2 * atom0->size_at *
+ cos(atom0->angle)) +
+ (int) (atom0->size_at * sin(atom0->angle));
+ xy[0].y = y0 + (int) (atom0->size_at *
+ cos(atom0->angle)) -
+ (int) (2 * atom0->size_at * sin(atom0->angle));
+ xy[1].x = x0 + (int) (2 * atom0->size_at *
+ cos(atom0->angle)) -
+ (int) (atom0->size_at * sin(atom0->angle));
+ xy[1].y = y0 - (int) (atom0->size_at *
+ cos(atom0->angle)) -
+ (int) (2 * atom0->size_at * sin(atom0->angle));
+ xy[2].x = x0 - (int) (2 * atom0->size_at *
+ cos(atom0->angle)) -
+ (int) (atom0->size_at * sin(atom0->angle));
+ xy[2].y = y0 - (int) (atom0->size_at *
+ cos(atom0->angle)) +
+ (int) (2 * atom0->size_at * sin(atom0->angle));
+ xy[3].x = x0 - (int) (2 * atom0->size_at *
+ cos(atom0->angle)) +
+ (int) (atom0->size_at * sin(atom0->angle));
+ xy[3].y = y0 + (int) (atom0->size_at *
+ cos(atom0->angle)) +
+ (int) (2 * atom0->size_at *
+ sin(atom0->angle));
+ xy[4].x = xy[0].x;
+ xy[4].y = xy[0].y;
+ trans_coor(xy, atom0->xy, 4, gamma);
+ return;
+ case 1: /* squares */
+ xy[0].x = x0 + (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) +
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[0].y = y0 + (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) -
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[1].x = x0 + (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) -
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[1].y = y0 - (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) -
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[2].x = x0 - (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) -
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[2].y = y0 - (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) +
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[3].x = x0 - (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) +
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[3].y = y0 + (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) +
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[4].x = xy[0].x;
+ xy[4].y = xy[0].y;
+ trans_coor(xy, atom0->xy, 4, gamma);
+ return;
+ case 2: /* triangles */
+ xy[0].x = x0 + (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[0].y = y0 + (int) (1.5 * atom0->size_at *
+ cos(atom0->angle));
+ xy[1].x = x0 + (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) -
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[1].y = y0 - (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) -
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[2].x = x0 - (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) -
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[2].y = y0 - (int) (1.5 * atom0->size_at *
+ cos(atom0->angle)) +
+ (int) (1.5 * atom0->size_at *
+ sin(atom0->angle));
+ xy[3].x = xy[0].x;
+ xy[3].y = xy[0].y;
+ trans_coor(xy, atom0->xy, 3, gamma);
+ return;
+ }
+}
+
+static void
+crystal_drawatom(ModeInfo * mi, crystalatom * atom0)
+{
+ crystalstruct *cryst;
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int j, k, l, m;
+
+ cryst = &crystals[MI_SCREEN(mi)];
+ for (j = numops[2 * cryst->planegroup + 1];
+ j < numops[2 * cryst->planegroup]; j++) {
+ XPoint xy[5], new_xy[5];
+ XPoint xy_1[5];
+ int xtrans, ytrans;
+
+ xtrans = operation[j * 6] * atom0->x0 + operation[j * 6 + 1] *
+ atom0->y0 + (int) (operation[j * 6 + 4] * cryst->a /
+ 2.0);
+ ytrans = operation[j * 6 + 2] * atom0->x0 + operation[j * 6 +
+ 3] * atom0->y0 + (int) (operation[j * 6 + 5] *
+ cryst->b / 2.0);
+ if (xtrans < 0) {
+ if (xtrans < -cryst->a)
+ xtrans = 2 * cryst->a;
+ else
+ xtrans = cryst->a;
+ } else if (xtrans >= cryst->a)
+ xtrans = -cryst->a;
+ else
+ xtrans = 0;
+ if (ytrans < 0)
+ ytrans = cryst->b;
+ else if (ytrans >= cryst->b)
+ ytrans = -cryst->b;
+ else
+ ytrans = 0;
+ for (k = 0; k < atom0->num_point; k++) {
+ xy[k].x = operation[j * 6] * atom0->xy[k].x +
+ operation[j * 6 + 1] *
+ atom0->xy[k].y + (int) (operation[j * 6 + 4] *
+ cryst->a / 2.0) +
+ xtrans;
+ xy[k].y = operation[j * 6 + 2] * atom0->xy[k].x +
+ operation[j * 6 + 3] *
+ atom0->xy[k].y + (int) (operation[j * 6 + 5] *
+ cryst->b / 2.0) +
+ ytrans;
+ }
+ xy[atom0->num_point].x = xy[0].x;
+ xy[atom0->num_point].y = xy[0].y;
+ for (l = 0; l < cryst->nx; l++) {
+ for (m = 0; m < cryst->ny; m++) {
+
+ for (k = 0; k <= atom0->num_point; k++) {
+ xy_1[k].x = xy[k].x + l * cryst->a;
+ xy_1[k].y = xy[k].y + m * cryst->b;
+ }
+ trans_coor_back(xy_1, new_xy, atom0->num_point,
+ cryst->gamma, cryst->offset_w,
+ cryst->offset_h ,
+ cryst->win_height,
+ cryst->invert);
+ XFillPolygon(display, window, cryst->gc, new_xy,
+ atom0->num_point, Convex, CoordModeOrigin);
+ }
+ }
+ if (centro[cryst->planegroup] == True) {
+ for (k = 0; k <= atom0->num_point; k++) {
+ xy[k].x = cryst->a - xy[k].x;
+ xy[k].y = cryst->b - xy[k].y;
+ }
+ for (l = 0; l < cryst->nx; l++) {
+ for (m = 0; m < cryst->ny; m++) {
+
+ for (k = 0; k <= atom0->num_point; k++) {
+ xy_1[k].x = xy[k].x + l * cryst->a;
+ xy_1[k].y = xy[k].y + m * cryst->b;
+ }
+ trans_coor_back(xy_1, new_xy, atom0->num_point,
+ cryst->gamma,
+ cryst->offset_w,
+ cryst->offset_h ,
+ cryst->win_height ,
+ cryst->invert);
+ XFillPolygon(display, window, cryst->gc,
+ new_xy,
+ atom0->num_point, Convex,
+ CoordModeOrigin);
+ }
+ }
+ }
+ if (primitive[cryst->planegroup] == False) {
+ if (xy[atom0->num_point].x >= (int) (cryst->a / 2.0))
+ xtrans = (int) (-cryst->a / 2.0);
+ else
+ xtrans = (int) (cryst->a / 2.0);
+ if (xy[atom0->num_point].y >= (int) (cryst->b / 2.0))
+ ytrans = (int) (-cryst->b / 2.0);
+ else
+ ytrans = (int) (cryst->b / 2.0);
+ for (k = 0; k <= atom0->num_point; k++) {
+ xy[k].x = xy[k].x + xtrans;
+ xy[k].y = xy[k].y + ytrans;
+ }
+ for (l = 0; l < cryst->nx; l++) {
+ for (m = 0; m < cryst->ny; m++) {
+
+ for (k = 0; k <= atom0->num_point; k++) {
+ xy_1[k].x = xy[k].x + l * cryst->a;
+ xy_1[k].y = xy[k].y + m * cryst->b;
+ }
+ trans_coor_back(xy_1, new_xy, atom0->num_point,
+ cryst->gamma,
+ cryst->offset_w,
+ cryst->offset_h ,
+ cryst->win_height,
+ cryst->invert);
+ XFillPolygon(display, window, cryst->gc,
+ new_xy,
+ atom0->num_point, Convex,
+ CoordModeOrigin);
+ }
+ }
+ if (centro[cryst->planegroup] == True) {
+ XPoint xy1[5];
+
+ for (k = 0; k <= atom0->num_point; k++) {
+ xy1[k].x = cryst->a - xy[k].x;
+ xy1[k].y = cryst->b - xy[k].y;
+ }
+ for (l = 0; l < cryst->nx; l++) {
+ for (m = 0; m < cryst->ny; m++) {
+
+ for (k = 0; k <= atom0->num_point; k++) {
+ xy_1[k].x = xy1[k].x + l * cryst->a;
+ xy_1[k].y = xy1[k].y + m * cryst->b;
+ }
+ trans_coor_back(xy_1, new_xy, atom0->num_point,
+ cryst->gamma,
+ cryst->offset_w,
+ cryst->offset_h ,
+ cryst->win_height,
+ cryst->invert);
+ XFillPolygon(display, window,
+ cryst->gc,
+ new_xy, atom0->num_point,
+ Convex, CoordModeOrigin);
+ }
+ }
+ }
+ }
+ }
+}
+
+ENTRYPOINT void init_crystal(ModeInfo * mi);
+
+
+ENTRYPOINT void
+draw_crystal(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ crystalstruct *cryst = &crystals[MI_SCREEN(mi)];
+ int i;
+
+#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+#endif
+
+ if (cryst->no_colors) {
+ init_crystal(mi);
+ return;
+ }
+
+ /* Moved from init_crystal because you can't draw after MI_CLEARWINDOW in
+ XScreenSaver. - Dave Odell <dmo2118@gmail.com>
+ */
+ if (cryst->unit_cell
+#ifndef HAVE_JWXYZ
+ && !cryst->painted
+#endif
+ ) {
+ int y_coor1 , y_coor2;
+
+ XSetForeground(display, cryst->gc, cryst->grid_pixel);
+ if (cryst->grid_cell) {
+ int inx, iny;
+
+ if ( cryst->invert )
+ y_coor1 = y_coor2 = cryst->win_height - cryst->offset_h;
+ else
+ y_coor1 = y_coor2 = cryst->offset_h;
+ XDrawLine(display, window, cryst->gc, cryst->offset_w,
+ y_coor1, cryst->offset_w + cryst->nx * cryst->a,
+ y_coor2);
+ if ( cryst->invert )
+ {
+ y_coor1 = cryst->win_height - cryst->offset_h;
+ y_coor2 = cryst->win_height - (int) (cryst->ny *
+ cryst->b *
+ cos((cryst->gamma - 90) * PI_RAD)) -
+ cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 = cryst->offset_h;
+ y_coor2 = (int) (cryst->ny * cryst->b *
+ cos((cryst->gamma - 90) * PI_RAD)) +
+ cryst->offset_h;
+ }
+ XDrawLine(display, window, cryst->gc, cryst->offset_w,
+ y_coor1, (int) (cryst->offset_w - cryst->ny * cryst->b *
+ sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2);
+ inx = cryst->nx;
+ for (iny = 1; iny <= cryst->ny; iny++) {
+ if ( cryst->invert )
+ {
+ y_coor1 = cryst->win_height -
+ (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+ PI_RAD)) - cryst->offset_h;
+ y_coor2 = cryst->win_height -
+ (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+ PI_RAD)) -
+ cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 = (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+ PI_RAD)) + cryst->offset_h;
+ y_coor2 = (int) (iny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) +
+ cryst->offset_h;
+ }
+ XDrawLine(display, window, cryst->gc,
+ (int) (cryst->offset_w +
+ inx * cryst->a - (int) (iny * cryst->b *
+ sin((cryst->gamma - 90) * PI_RAD))),
+ y_coor1,
+ (int) (cryst->offset_w - iny * cryst->b *
+ sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2);
+ }
+ iny = cryst->ny;
+ for (inx = 1; inx <= cryst->nx; inx++) {
+ if ( cryst->invert )
+ {
+ y_coor1 =cryst->win_height -
+ (int) (iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) - cryst->offset_h;
+ y_coor2 =cryst->win_height - cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 =(int) (iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) + cryst->offset_h;
+ y_coor2 =cryst->offset_h;
+ }
+ XDrawLine(display, window, cryst->gc,
+ (int) (cryst->offset_w +
+ inx * cryst->a - (int) (iny * cryst->b *
+ sin((cryst->gamma - 90) * PI_RAD))),
+ y_coor1,
+ cryst->offset_w + inx * cryst->a,
+ y_coor2);
+ }
+ } else {
+ if ( cryst->invert )
+ {
+ y_coor1 =cryst->win_height -
+ (int) (cryst->iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) -
+ cryst->offset_h;
+ y_coor2 =cryst->win_height -
+ (int) ( ( cryst->iny + 1 ) * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) -
+ cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 =(int) (cryst->iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) +
+ cryst->offset_h;
+ y_coor2 =(int) (( cryst->iny + 1 ) * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) +
+ cryst->offset_h;
+ }
+ XDrawLine(display, window, cryst->gc,
+ cryst->offset_w + cryst->inx * cryst->a - (int) (cryst->iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor1,
+ cryst->offset_w + (cryst->inx + 1) * cryst->a - (int) (cryst->iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor1);
+ XDrawLine(display, window, cryst->gc,
+ cryst->offset_w + cryst->inx * cryst->a - (int) (cryst->iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor1,
+ cryst->offset_w + cryst->inx * cryst->a - (int) ((cryst->iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2);
+ XDrawLine(display, window, cryst->gc,
+ cryst->offset_w + (cryst->inx + 1) * cryst->a - (int) (cryst->iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor1,
+ cryst->offset_w + (cryst->inx + 1) * cryst->a - (int) ((cryst->iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2);
+ XDrawLine(display, window, cryst->gc,
+ cryst->offset_w + cryst->inx * cryst->a - (int) ((cryst->iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2,
+ cryst->offset_w + (cryst->inx + 1) * cryst->a - (int) ((cryst->iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2);
+ }
+ }
+
+ XSetFunction(display, cryst->gc, GXxor);
+
+/* Rotate colours */
+ if (cryst->cycle_p) {
+ rotate_colors(mi->xgwa.screen, cryst->cmap,
+ cryst->colors, cryst->ncolors,
+ cryst->direction);
+ if (!(LRAND() % 1000))
+ cryst->direction = -cryst->direction;
+ }
+ for (i = 0; i < cryst->num_atom; i++) {
+ crystalatom *atom0;
+
+ atom0 = &cryst->atom[i];
+
+ if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
+ XSetForeground(display, cryst->gc, cryst->colors[atom0->colour].pixel);
+ } else {
+ XSetForeground(display, cryst->gc, atom0->colour);
+ }
+#ifndef HAVE_JWXYZ
+ if(cryst->painted)
+ crystal_drawatom(mi, atom0);
+#endif
+ atom0->velocity[0] += NRAND(3) - 1;
+ atom0->velocity[0] = MAX(-20, MIN(20, atom0->velocity[0]));
+ atom0->velocity[1] += NRAND(3) - 1;
+ atom0->velocity[1] = MAX(-20, MIN(20, atom0->velocity[1]));
+ atom0->x0 += atom0->velocity[0];
+ /*if (cryst->gamma == 90.0) { */
+ if (atom0->x0 < 0)
+ atom0->x0 += cryst->a;
+ else if (atom0->x0 >= cryst->a)
+ atom0->x0 -= cryst->a;
+ atom0->y0 += atom0->velocity[1];
+ if (atom0->y0 < 0)
+ atom0->y0 += cryst->b;
+ else if (atom0->y0 >= cryst->b)
+ atom0->y0 -= cryst->b;
+ /*} */
+ atom0->velocity_a += ((float) NRAND(1001) - 500.0) / 2000.0;
+ atom0->angle += atom0->velocity_a;
+ crystal_setupatom(atom0, cryst->gamma);
+ crystal_drawatom(mi, atom0);
+ }
+ XSetFunction(display, cryst->gc, GXcopy);
+ cryst->painted = True;
+ MI_IS_DRAWN(mi) = True;
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_crystal(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ crystalstruct *cryst = &crystals[MI_SCREEN(mi)];
+ int i;
+
+ if (!cryst->painted)
+ return;
+ MI_CLEARWINDOW(mi);
+ XSetFunction(display, cryst->gc, GXxor);
+
+ if (cryst->unit_cell) {
+ int y_coor1 , y_coor2;
+
+ if (MI_NPIXELS(mi) > 2)
+ XSetForeground(display, cryst->gc, MI_PIXEL(mi, NRAND(MI_NPIXELS(mi))));
+ else
+ XSetForeground(display, cryst->gc, MI_WHITE_PIXEL(mi));
+ if (cryst->grid_cell) {
+ int inx, iny;
+
+ if ( cryst->invert )
+ y_coor1 = y_coor2 = cryst->win_height - cryst->offset_h;
+ else
+ y_coor1 = y_coor2 = cryst->offset_h;
+ XDrawLine(display, window, cryst->gc, cryst->offset_w,
+ y_coor1, cryst->offset_w + cryst->nx * cryst->a,
+ y_coor2);
+ if ( cryst->invert )
+ {
+ y_coor1 = cryst->win_height - cryst->offset_h;
+ y_coor2 = cryst->win_height - (int) (cryst->ny *
+ cryst->b *
+ cos((cryst->gamma - 90) * PI_RAD)) -
+ cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 = cryst->offset_h;
+ y_coor2 = (int) (cryst->ny * cryst->b *
+ cos((cryst->gamma - 90) * PI_RAD)) +
+ cryst->offset_h;
+ }
+ XDrawLine(display, window, cryst->gc, cryst->offset_w,
+ y_coor1, (int) (cryst->offset_w - cryst->ny * cryst->b *
+ sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2);
+ inx = cryst->nx;
+ for (iny = 1; iny <= cryst->ny; iny++) {
+ if ( cryst->invert )
+ {
+ y_coor1 = cryst->win_height -
+ (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+ PI_RAD)) - cryst->offset_h;
+ y_coor2 = cryst->win_height -
+ (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+ PI_RAD)) -
+ cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 = (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+ PI_RAD)) + cryst->offset_h;
+ y_coor2 = (int) (iny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) +
+ cryst->offset_h;
+ }
+ XDrawLine(display, window, cryst->gc,
+ (int) (cryst->offset_w +
+ inx * cryst->a - (int) (iny * cryst->b *
+ sin((cryst->gamma - 90) * PI_RAD))),
+ y_coor1,
+ (int) (cryst->offset_w - iny * cryst->b *
+ sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2);
+ }
+ iny = cryst->ny;
+ for (inx = 1; inx <= cryst->nx; inx++) {
+ if ( cryst->invert )
+ {
+ y_coor1 =cryst->win_height -
+ (int) (iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) - cryst->offset_h;
+ y_coor2 =cryst->win_height - cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 =(int) (iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) + cryst->offset_h;
+ y_coor2 =cryst->offset_h;
+ }
+ XDrawLine(display, window, cryst->gc,
+ (int) (cryst->offset_w +
+ inx * cryst->a - (int) (iny * cryst->b *
+ sin((cryst->gamma - 90) * PI_RAD))),
+ y_coor1,
+ cryst->offset_w + inx * cryst->a,
+ y_coor2);
+ }
+ } else {
+ int inx, iny;
+
+ inx = NRAND(cryst->nx);
+ iny = NRAND(cryst->ny);
+ if ( cryst->invert )
+ {
+ y_coor1 =cryst->win_height -
+ (int) (iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) -
+ cryst->offset_h;
+ y_coor2 =cryst->win_height -
+ (int) ( ( iny + 1 ) * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) -
+ cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 =(int) (iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) +
+ cryst->offset_h;
+ y_coor2 =(int) (( iny + 1 ) * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) +
+ cryst->offset_h;
+ }
+ XDrawLine(display, window, cryst->gc,
+ cryst->offset_w + inx * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor1,
+ cryst->offset_w + (inx + 1) * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor1);
+ XDrawLine(display, window, cryst->gc,
+ cryst->offset_w + inx * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor1,
+ cryst->offset_w + inx * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2);
+ XDrawLine(display, window, cryst->gc,
+ cryst->offset_w + (inx + 1) * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor1,
+ cryst->offset_w + (inx + 1) * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2);
+ XDrawLine(display, window, cryst->gc,
+ cryst->offset_w + inx * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2,
+ cryst->offset_w + (inx + 1) * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+ y_coor2);
+ }
+ }
+ for (i = 0; i < cryst->num_atom; i++) {
+ crystalatom *atom0;
+
+ atom0 = &cryst->atom[i];
+ if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
+ XSetForeground(display, cryst->gc, cryst->colors[atom0->colour].pixel);
+ } else {
+ XSetForeground(display, cryst->gc, atom0->colour);
+ }
+ crystal_drawatom(mi, atom0);
+ }
+ XSetFunction(display, cryst->gc, GXcopy);
+}
+#endif
+
+ENTRYPOINT void
+free_crystal(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ crystalstruct *cryst = &crystals[MI_SCREEN(mi)];
+
+ if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
+ MI_WHITE_PIXEL(mi) = cryst->whitepixel;
+ MI_BLACK_PIXEL(mi) = cryst->blackpixel;
+#ifndef STANDALONE
+ MI_FG_PIXEL(mi) = cryst->fg;
+ MI_BG_PIXEL(mi) = cryst->bg;
+#endif
+ if (cryst->colors && cryst->ncolors && !cryst->no_colors)
+ free_colors(mi->xgwa.screen, cryst->cmap, cryst->colors,
+ cryst->ncolors);
+ if (cryst->colors)
+ (void) free((void *) cryst->colors);
+#if 0 /* #### wrong! -jwz */
+ XFreeColormap(display, cryst->cmap);
+#endif
+ }
+ if (cryst->gc != NULL)
+ XFreeGC(display, cryst->gc);
+ if (cryst->atom != NULL)
+ (void) free((void *) cryst->atom);
+}
+
+ENTRYPOINT void
+init_crystal(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ crystalstruct *cryst;
+ int i, max_atoms, size_atom, neqv;
+ int cell_min;
+
+#define MIN_CELL 200
+
+/* initialize */
+ MI_INIT (mi, crystals);
+ cryst = &crystals[MI_SCREEN(mi)];
+
+ if (!cryst->gc) {
+ if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
+ XColor color;
+
+#ifndef STANDALONE
+ extern char *background;
+ extern char *foreground;
+
+ cryst->fg = MI_FG_PIXEL(mi);
+ cryst->bg = MI_BG_PIXEL(mi);
+#endif
+ cryst->blackpixel = MI_BLACK_PIXEL(mi);
+ cryst->whitepixel = MI_WHITE_PIXEL(mi);
+#if 0 /* #### wrong! -jwz */
+ cryst->cmap = XCreateColormap(display, window,
+ MI_VISUAL(mi), AllocNone);
+ XSetWindowColormap(display, window, cryst->cmap);
+#else
+ cryst->cmap = mi->xgwa.colormap;
+#endif
+ (void) XParseColor(display, cryst->cmap, "black", &color);
+ (void) XAllocColor(display, cryst->cmap, &color);
+ MI_BLACK_PIXEL(mi) = color.pixel;
+ (void) XParseColor(display, cryst->cmap, "white", &color);
+ (void) XAllocColor(display, cryst->cmap, &color);
+ MI_WHITE_PIXEL(mi) = color.pixel;
+#ifndef STANDALONE
+ (void) XParseColor(display, cryst->cmap, background, &color);
+ (void) XAllocColor(display, cryst->cmap, &color);
+ MI_BG_PIXEL(mi) = color.pixel;
+ (void) XParseColor(display, cryst->cmap, foreground, &color);
+ (void) XAllocColor(display, cryst->cmap, &color);
+ MI_FG_PIXEL(mi) = color.pixel;
+#endif
+ cryst->colors = 0;
+ cryst->ncolors = 0;
+ }
+ if ((cryst->gc = XCreateGC(display, MI_WINDOW(mi),
+ (unsigned long) 0, (XGCValues *) NULL)) == None)
+ return;
+ }
+/* Clear Display */
+ MI_CLEARWINDOW(mi);
+ cryst->painted = False;
+ XSetFunction(display, cryst->gc, GXxor);
+
+
+/*Set up crystal data */
+ cryst->direction = (LRAND() & 1) ? 1 : -1;
+ if (MI_IS_FULLRANDOM(mi)) {
+ if (LRAND() & 1)
+ cryst->unit_cell = True;
+ else
+ cryst->unit_cell = False;
+ } else
+ cryst->unit_cell = unit_cell;
+ if (cryst->unit_cell) {
+ if (MI_IS_FULLRANDOM(mi)) {
+ if (LRAND() & 1)
+ cryst->grid_cell = True;
+ else
+ cryst->grid_cell = False;
+ } else
+ cryst->grid_cell = grid_cell;
+ }
+ cryst->win_width = MI_WIDTH(mi);
+ cryst->win_height = MI_HEIGHT(mi);
+ cell_min = min(cryst->win_width / 2 + 1, MIN_CELL);
+ cell_min = min(cell_min, cryst->win_height / 2 + 1);
+ cryst->planegroup = NRAND(17);
+ cryst->invert = NRAND(2);
+ if (MI_IS_VERBOSE(mi))
+ (void) fprintf(stdout, "Selected plane group no %d\n",
+ cryst->planegroup + 1);
+ if (cryst->planegroup > 11)
+ cryst->gamma = 120.0;
+ else if (cryst->planegroup < 2)
+ cryst->gamma = 60.0 + NRAND(60);
+ else
+ cryst->gamma = 90.0;
+ neqv = numops[2 * cryst->planegroup] - numops[2 * cryst->planegroup + 1];
+ if (centro[cryst->planegroup] == True)
+ neqv = 2 * neqv;
+ if (primitive[cryst->planegroup] == False)
+ neqv = 2 * neqv;
+
+
+ if (nx > 0)
+ cryst->nx = nx;
+ else if (nx < 0)
+ cryst->nx = NRAND(-nx) + 1;
+ else
+ cryst->nx = DEF_NX1;
+ if (cryst->planegroup > 8)
+ cryst->ny = cryst->nx;
+ else if (ny > 0)
+ cryst->ny = ny;
+ else if (ny < 0)
+ cryst->ny = NRAND(-ny) + 1;
+ else
+ cryst->ny = DEF_NY1;
+ neqv = neqv * cryst->nx * cryst->ny;
+
+ cryst->num_atom = MI_COUNT(mi);
+ max_atoms = MI_COUNT(mi);
+ if (cryst->num_atom == 0) {
+ cryst->num_atom = DEF_NUM_ATOM;
+ max_atoms = DEF_NUM_ATOM;
+ } else if (cryst->num_atom < 0) {
+ max_atoms = -cryst->num_atom;
+ cryst->num_atom = NRAND(-cryst->num_atom) + 1;
+ }
+ if (neqv > 1)
+ cryst->num_atom = cryst->num_atom / neqv + 1;
+
+ if (cryst->atom == NULL)
+ cryst->atom = (crystalatom *) calloc(max_atoms, sizeof (
+ crystalatom));
+
+ if (maxsize) {
+ if (cryst->planegroup < 13) {
+ cryst->gamma = 90.0;
+ cryst->offset_w = 0;
+ cryst->offset_h = 0;
+ if (cryst->planegroup < 10) {
+ cryst->b = cryst->win_height;
+ cryst->a = cryst->win_width;
+ } else {
+ cryst->b = min(cryst->win_height, cryst->win_width);
+ cryst->a = cryst->b;
+ }
+ } else {
+ cryst->gamma = 120.0;
+ cryst->a = (int) (cryst->win_width * 2.0 / 3.0);
+ cryst->b = cryst->a;
+ cryst->offset_h = (int) (cryst->b * 0.25 *
+ cos((cryst->gamma - 90) * PI_RAD));
+ cryst->offset_w = (int) (cryst->b * 0.5);
+ }
+ } else {
+ int max_repeat = 10;
+ cryst->offset_w = -1;
+ while (max_repeat-- &&
+ (cryst->offset_w < 4 || (int) (cryst->offset_w - cryst->b *
+ sin((cryst->gamma - 90) * PI_RAD)) < 4)
+ ) {
+ cryst->b = NRAND((int) (cryst->win_height / (cos((cryst->gamma - 90) *
+ PI_RAD))) - cell_min) + cell_min;
+ if (cryst->planegroup > 8)
+ cryst->a = cryst->b;
+ else
+ cryst->a = NRAND(cryst->win_width - cell_min) + cell_min;
+ cryst->offset_w = (int) ((cryst->win_width - (cryst->a - cryst->b *
+ sin((cryst->gamma - 90) *
+ PI_RAD))) / 2.0);
+ }
+ cryst->offset_h = (int) ((cryst->win_height - cryst->b * cos((
+ cryst->gamma - 90) * PI_RAD)) / 2.0);
+ if (!centre) {
+ if (cryst->offset_h > 0)
+ cryst->offset_h = NRAND(2 * cryst->offset_h);
+ cryst->offset_w = (int) (cryst->win_width - cryst->a -
+ cryst->b *
+ fabs(sin((cryst->gamma - 90) * PI_RAD)));
+ if (cryst->gamma > 90.0) {
+ if (cryst->offset_w > 0)
+ cryst->offset_w = NRAND(cryst->offset_w) +
+ (int) (cryst->b * sin((cryst->gamma - 90) * PI_RAD));
+ else
+ cryst->offset_w = (int) (cryst->b * sin((cryst->gamma - 90) *
+ PI_RAD));
+ } else if (cryst->offset_w > 0)
+ cryst->offset_w = NRAND(cryst->offset_w);
+ else
+ cryst->offset_w = 0;
+ }
+ }
+
+ size_atom = min((int) ((float) (cryst->a) / 40.) + 1,
+ (int) ((float) (cryst->b) / 40.) + 1);
+ if (MI_SIZE(mi) < size_atom) {
+ if (MI_SIZE(mi) < -size_atom)
+ size_atom = -size_atom;
+ else
+ size_atom = MI_SIZE(mi);
+ }
+ cryst->a = cryst->a / cryst->nx;
+ cryst->b = cryst->b / cryst->ny;
+ if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
+/* Set up colour map */
+ if (cryst->colors && cryst->ncolors && !cryst->no_colors)
+ free_colors(mi->xgwa.screen, cryst->cmap,
+ cryst->colors, cryst->ncolors);
+ if (cryst->colors)
+ (void) free((void *) cryst->colors);
+ cryst->colors = 0;
+ cryst->ncolors = MI_NCOLORS(mi);
+ if (cryst->ncolors < 2)
+ cryst->ncolors = 2;
+ if (cryst->ncolors <= 2)
+ cryst->mono_p = True;
+ else
+ cryst->mono_p = False;
+
+ if (cryst->mono_p)
+ cryst->colors = 0;
+ else
+ cryst->colors = (XColor *) malloc(sizeof (*cryst->colors) * (cryst->ncolors + 1));
+ cryst->cycle_p = has_writable_cells(mi->xgwa.screen, MI_VISUAL(mi));
+ if (cryst->cycle_p) {
+ if (MI_IS_FULLRANDOM(mi)) {
+ if (!NRAND(8))
+ cryst->cycle_p = False;
+ else
+ cryst->cycle_p = True;
+ } else {
+ cryst->cycle_p = cycle_p;
+ }
+ }
+ if (!cryst->mono_p) {
+ if (!(LRAND() % 10))
+ make_random_colormap(mi->xgwa.screen, MI_VISUAL(mi),
+ cryst->cmap, cryst->colors,
+ &cryst->ncolors,
+ True, True, &cryst->cycle_p, True);
+ else if (!(LRAND() % 2))
+ make_uniform_colormap(mi->xgwa.screen, MI_VISUAL(mi),
+ cryst->cmap, cryst->colors,
+ &cryst->ncolors, True,
+ &cryst->cycle_p, True);
+ else
+ make_smooth_colormap(mi->xgwa.screen, MI_VISUAL(mi),
+ cryst->cmap, cryst->colors,
+ &cryst->ncolors,
+ True, &cryst->cycle_p, True);
+ }
+#if 0 /* #### wrong! -jwz */
+ XInstallColormap(display, cryst->cmap);
+#endif
+ if (cryst->ncolors < 2) {
+ cryst->ncolors = 2;
+ cryst->no_colors = True;
+ } else
+ cryst->no_colors = False;
+ if (cryst->ncolors <= 2)
+ cryst->mono_p = True;
+
+ if (cryst->mono_p)
+ cryst->cycle_p = False;
+
+ }
+ for (i = 0; i < cryst->num_atom; i++) {
+ crystalatom *atom0;
+
+ atom0 = &cryst->atom[i];
+ if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
+ if (cryst->ncolors > 2)
+ atom0->colour = NRAND(cryst->ncolors - 2) + 2;
+ else
+ atom0->colour = 1; /* Just in case */
+ } else {
+ if (MI_NPIXELS(mi) > 2)
+ atom0->colour = MI_PIXEL(mi, NRAND(MI_NPIXELS(mi)));
+ else
+ atom0->colour = 1; /*Xor'red so WHITE may not be appropriate */
+ }
+ atom0->x0 = NRAND(cryst->a);
+ atom0->y0 = NRAND(cryst->b);
+ atom0->velocity[0] = NRAND(7) - 3;
+ atom0->velocity[1] = NRAND(7) - 3;
+ atom0->velocity_a = (NRAND(7) - 3) * PI_RAD;
+ atom0->angle = NRAND(90) * PI_RAD;
+ atom0->at_type = NRAND(3);
+ if (size_atom == 0)
+ atom0->size_at = DEF_SIZ_ATOM;
+ else if (size_atom > 0)
+ atom0->size_at = size_atom;
+ else
+ atom0->size_at = NRAND(-size_atom) + 1;
+ atom0->size_at++;
+ if (atom0->at_type == 2)
+ atom0->num_point = 3;
+ else
+ atom0->num_point = 4;
+ crystal_setupatom(atom0, cryst->gamma);
+ }
+ XSetFunction(display, cryst->gc, GXcopy);
+
+ if (MI_NPIXELS(mi) > 2)
+ cryst->grid_pixel = MI_PIXEL(mi, NRAND(MI_NPIXELS(mi)));
+ else
+ cryst->grid_pixel = MI_WHITE_PIXEL(mi);
+
+ cryst->inx = NRAND(cryst->nx);
+ cryst->iny = NRAND(cryst->ny);
+
+}
+
+XSCREENSAVER_MODULE ("Crystal", crystal)
diff --git a/hacks/crystal.man b/hacks/crystal.man
new file mode 100644
index 0000000..06bf654
--- /dev/null
+++ b/hacks/crystal.man
@@ -0,0 +1,81 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+crystal - kaleidescope.
+.SH SYNOPSIS
+.B crystal
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-grid]
+[\-no-cell]
+[\-centre]
+[\-nx \fInumber\fP]
+[\-ny \fInumber\fP]
+[\-count \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Moving polygons, similar to a kaleidescope (more like a kaleidescope than
+the hack called `kaleid,' actually.)
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-grid | \-no-grid
+Whether to draw grid.
+.TP 8
+.B \-cell | \-no-cell
+Whether to draw the cell.
+.TP 8
+.B \-centre | \-no-centre
+Whether to center on screen
+.TP 8
+.B \-nx \fInumber\fP
+Horizontal Symmetries. -10 - 10. Default: -3.
+.TP 8
+.B \-ny \fInumber\fP
+Vertical Symmetries. -10 - 10. Default: -3.
+.TP 8
+.B \-count \fInumber\fP
+Count. -5000 - 5000. Default: -500.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 60000 (0.06 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 100.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Jouk Jansen. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jouk Jansen.
diff --git a/hacks/cwaves.c b/hacks/cwaves.c
new file mode 100644
index 0000000..20dd80a
--- /dev/null
+++ b/hacks/cwaves.c
@@ -0,0 +1,212 @@
+/* xscreensaver, Copyright (c) 2007-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * cwaves -- languid sinusoidal colors.
+ */
+
+#include "screenhack.h"
+#include <stdio.h>
+#include "ximage-loader.h"
+
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+typedef struct {
+ double scale;
+ double offset;
+ double delta;
+} wave;
+
+typedef struct {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ GC gc;
+ int delay;
+ int scale;
+ int ncolors;
+ XColor *colors;
+
+ int nwaves;
+ wave *waves;
+ int debug_p;
+
+} state;
+
+
+static void *
+cwaves_init (Display *dpy, Window window)
+{
+ int i;
+ XGCValues gcv;
+ state *st = (state *) calloc (1, sizeof (*st));
+
+ st->dpy = dpy;
+ st->window = window;
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ st->debug_p = get_boolean_resource (dpy, "debug", "Boolean");
+ st->scale = get_integer_resource (dpy, "scale", "Integer");
+ if (st->scale <= 0) st->scale = 1;
+ st->ncolors = get_integer_resource (dpy, "ncolors", "Integer");
+ if (st->ncolors < 4) st->ncolors = 4;
+ st->colors = (XColor *) malloc (sizeof(*st->colors) * (st->ncolors+1));
+ make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ st->colors, &st->ncolors,
+ True, 0, False);
+
+ st->gc = XCreateGC (st->dpy, st->window, 0, &gcv);
+ st->delay = get_integer_resource (dpy, "delay", "Integer");
+
+ st->nwaves = get_integer_resource (dpy, "nwaves", "Integer");
+ st->waves = (wave *) calloc (st->nwaves, sizeof(*st->waves));
+
+ for (i = 0; i < st->nwaves; i++)
+ {
+ st->waves[i].scale = frand(0.03) + 0.005;
+ st->waves[i].offset = frand(M_PI);
+ st->waves[i].delta = (BELLRAND(2)-1) / 15.0;
+ }
+
+ return st;
+}
+
+
+static unsigned long
+cwaves_draw (Display *dpy, Window window, void *closure)
+{
+ state *st = (state *) closure;
+ int i, x;
+
+ for (i = 0; i < st->nwaves; i++)
+ st->waves[i].offset += st->waves[i].delta;
+
+ for (x = 0; x < st->xgwa.width; x += st->scale)
+ {
+ double v = 0;
+ int j;
+ for (i = 0; i < st->nwaves; i++)
+ v += cos ((x * st->waves[i].scale) - st->waves[i].offset);
+ v /= st->nwaves;
+
+ j = st->ncolors * (v/2 + 0.5);
+ if (j < 0 || j >= st->ncolors) abort();
+ XSetForeground (st->dpy, st->gc, st->colors[j].pixel);
+ XFillRectangle (st->dpy, st->window, st->gc,
+ x, 0, st->scale, st->xgwa.height);
+ }
+
+ if (st->debug_p)
+ {
+ int wh = (st->xgwa.height / (st->nwaves + 1)) * 0.9;
+ int i;
+ XSetLineAttributes (st->dpy, st->gc, 2, LineSolid, CapRound, JoinRound);
+ XSetForeground (st->dpy, st->gc, BlackPixelOfScreen (st->xgwa.screen));
+ for (i = 0; i < st->nwaves; i++)
+ {
+ int y = st->xgwa.height * i / (st->nwaves + 1);
+ int ox = -1, oy = -1;
+
+ for (x = 0; x < st->xgwa.width; x += st->scale)
+ {
+ int yy;
+ double v = 0;
+ v = cos ((x * st->waves[i].scale) - st->waves[i].offset);
+ v /= 2;
+
+ yy = y + wh/2 + (wh * v);
+ if (ox == -1)
+ ox = x, oy = yy;
+ XDrawLine (st->dpy, st->window, st->gc, ox, oy, x, yy);
+ ox = x;
+ oy = yy;
+ }
+ }
+
+ {
+ int y = st->xgwa.height * i / (st->nwaves + 1);
+ int ox = -1, oy = -1;
+
+ for (x = 0; x < st->xgwa.width; x += st->scale)
+ {
+ int yy;
+ double v = 0;
+ for (i = 0; i < st->nwaves; i++)
+ v += cos ((x * st->waves[i].scale) - st->waves[i].offset);
+ v /= st->nwaves;
+ v /= 2;
+
+ yy = y + wh/2 + (wh * v);
+ if (ox == -1)
+ ox = x, oy = yy;
+ XDrawLine (st->dpy, st->window, st->gc, ox, oy, x, yy);
+ ox = x;
+ oy = yy;
+ }
+ }
+ }
+
+ return st->delay;
+}
+
+
+static void
+cwaves_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ state *st = (state *) closure;
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+}
+
+static Bool
+cwaves_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ state *st = (state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ make_smooth_colormap (st->xgwa.screen, st->xgwa.visual,
+ st->xgwa.colormap,
+ st->colors, &st->ncolors,
+ True, 0, False);
+ return True;
+ }
+ return False;
+}
+
+static void
+cwaves_free (Display *dpy, Window window, void *closure)
+{
+}
+
+
+static const char *cwaves_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*ncolors: 600",
+ "*nwaves: 15",
+ "*scale: 2",
+ "*debug: False",
+ "*delay: 20000",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec cwaves_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-waves", ".nwaves", XrmoptionSepArg, 0 },
+ { "-colors", ".ncolors", XrmoptionSepArg, 0 },
+ { "-scale", ".scale", XrmoptionSepArg, 0 },
+ { "-debug", ".debug", XrmoptionNoArg, "True" },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("CWaves", cwaves)
diff --git a/hacks/cwaves.man b/hacks/cwaves.man
new file mode 100644
index 0000000..57f3978
--- /dev/null
+++ b/hacks/cwaves.man
@@ -0,0 +1,76 @@
+.TH XScreenSaver 1 "14-Jun-97" "X Version 11"
+.SH NAME
+cwaves - languid sinusoidal colors
+.SH SYNOPSIS
+.B cwaves
+[\-display \fIhost:display.screen\fP]
+[\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP]
+[\-window]
+[\-root]
+[\-mono]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIusecs\fP]
+[\-waves \fIint\fP]
+[\-colors \fIint\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIcwaves\fP program draws a languidly-scrolling vertical field
+of sinusoidal colors.
+.SH OPTIONS
+.I cwaves
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the animation.
+Default 20000, or about 1/50th second.
+.TP 8
+.B \-waves \fIint\fP
+How many cosines to add together. The more waves, the more complex
+the apparent motion.
+.TP 8
+.B \-colors \fIint\fP
+How many colors to use. Default 800. The more colors, the smoother the
+blending will be.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2007 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 2-Jul-2007.
diff --git a/hacks/cynosure.c b/hacks/cynosure.c
new file mode 100644
index 0000000..8b8b85b
--- /dev/null
+++ b/hacks/cynosure.c
@@ -0,0 +1,443 @@
+/* cynosure --- draw some rectangles
+ *
+ * 01-aug-96: written in Java by ozymandias G desiderata <ogd@organic.com>
+ * 25-dec-97: ported to C and XScreenSaver by Jamie Zawinski <jwz@jwz.org>
+ *
+ * Original version:
+ * http://www.organic.com/staff/ogd/java/cynosure.html
+ * http://www.organic.com/staff/ogd/java/source/cynosure/Cynosure-java.txt
+ *
+ * Original comments and copyright:
+ *
+ * Cynosure.java
+ * A Java implementation of Stephen Linhart's Cynosure screen-saver as a
+ * drop-in class.
+ *
+ * Header: /home/ogd/lib/cvs/aoaioxxysz/graphics/Cynosure.java,v 1.2 1996/08/02 02:41:21 ogd Exp
+ *
+ * ozymandias G desiderata <ogd@organic.com>
+ * Thu Aug 1 1996
+ *
+ * COPYRIGHT NOTICE
+ *
+ * Copyright 1996 ozymandias G desiderata. Title, ownership rights, and
+ * intellectual property rights in and to this software remain with
+ * ozymandias G desiderata. This software may be copied, modified,
+ * or used as long as this copyright is retained. Use this code at your
+ * own risk.
+ *
+ * Revision: 1.2
+ *
+ * Log: Cynosure.java,v
+ * Revision 1.2 1996/08/02 02:41:21 ogd
+ * Added a few more comments, fixed messed-up header.
+ *
+ * Revision 1.1.1.1 1996/08/02 02:30:45 ogd
+ * First version
+ */
+
+#include "screenhack.h"
+
+/* #define DO_STIPPLE */
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ XColor *colors;
+ int ncolors;
+
+#ifndef DO_STIPPLE
+ XColor *colors2;
+ int ncolors2;
+#endif
+
+ int fg_pixel, bg_pixel;
+ GC fg_gc, bg_gc, shadow_gc;
+
+ int curColor;
+ int curBase; /* color progression */
+ int shadowWidth;
+ int elevation; /* offset of dropshadow */
+ int sway; /* time until base color changed */
+ int timeLeft; /* until base color used */
+ int tweak; /* amount of color variance */
+ int gridSize;
+ int iterations, i, delay;
+ XWindowAttributes xgwa;
+};
+
+
+/**
+ * The smallest size for an individual cell.
+ **/
+#define MINCELLSIZE 16
+
+/**
+ * The narrowest a rectangle can be.
+ **/
+#define MINRECTSIZE 6
+
+/**
+ * Every so often genNewColor() generates a completely random
+ * color. This variable sets how frequently that happens. It's
+ * currently set to happen 1% of the time.
+ *
+ * @see #genNewColor
+ **/
+#define THRESHOLD 100 /*0.01*/
+
+static void paint(struct state *st);
+static int genNewColor(struct state *st);
+static int genConstrainedColor(struct state *st, int base, int tweak);
+static int c_tweak(struct state *st, int base, int tweak);
+
+
+static void *
+cynosure_init (Display *d, Window w)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+
+ st->dpy = d;
+ st->window = w;
+
+ st->curColor = 0;
+ st->curBase = st->curColor;
+ st->shadowWidth = get_integer_resource (st->dpy, "shadowWidth", "Integer");
+ st->elevation = get_integer_resource (st->dpy, "elevation", "Integer");
+ st->sway = get_integer_resource (st->dpy, "sway", "Integer");
+ st->tweak = get_integer_resource (st->dpy, "tweak", "Integer");
+ st->gridSize = get_integer_resource (st->dpy, "gridSize", "Integer");
+ st->timeLeft = 0;
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ st->ncolors = get_integer_resource (st->dpy, "colors", "Colors");
+ if (st->ncolors < 2) st->ncolors = 2;
+ if (st->ncolors <= 2) mono_p = True;
+
+ if (mono_p)
+ st->colors = 0;
+ else
+ st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
+
+ if (mono_p)
+ ;
+ else {
+ make_smooth_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ st->colors, &st->ncolors,
+ True, 0, True);
+ if (st->ncolors <= 2) {
+ mono_p = True;
+ st->ncolors = 2;
+ if (st->colors) free(st->colors);
+ st->colors = 0;
+ }
+ }
+
+ st->bg_pixel = get_pixel_resource(st->dpy,
+ st->xgwa.colormap, "background", "Background");
+ st->fg_pixel = get_pixel_resource(st->dpy,
+ st->xgwa.colormap, "foreground", "Foreground");
+
+ gcv.foreground = st->fg_pixel;
+ st->fg_gc = XCreateGC(st->dpy, st->window, GCForeground, &gcv);
+ gcv.foreground = st->bg_pixel;
+ st->bg_gc = XCreateGC(st->dpy, st->window, GCForeground, &gcv);
+
+#ifdef DO_STIPPLE
+ gcv.fill_style = FillStippled;
+ gcv.stipple = XCreateBitmapFromData(st->dpy, st->window, "\125\252", 8, 2);
+ st->shadow_gc = XCreateGC(st->dpy, st->window, GCForeground|GCFillStyle|GCStipple, &gcv);
+ XFreePixmap(st->dpy, gcv.stipple);
+
+#else /* !DO_STIPPLE */
+ st->shadow_gc = XCreateGC(st->dpy, st->window, GCForeground, &gcv);
+
+# ifdef HAVE_JWXYZ /* allow non-opaque alpha components in pixel values */
+ jwxyz_XSetAlphaAllowed (st->dpy, st->shadow_gc, True);
+# endif
+
+ if (st->colors)
+ {
+ int i;
+ st->ncolors2 = st->ncolors;
+ st->colors2 = (XColor *) malloc(sizeof(*st->colors2) * (st->ncolors2+1));
+
+ for (i = 0; i < st->ncolors2; i++)
+ {
+# ifdef HAVE_JWXYZ
+ /* give a non-opaque alpha to the shadow colors */
+ unsigned long pixel = st->colors[i].pixel;
+ unsigned long amask = BlackPixelOfScreen (st->xgwa.screen);
+ unsigned long a = (0x77777777 & amask);
+ pixel = (pixel & (~amask)) | a;
+ st->colors2[i].pixel = pixel;
+# else /* !HAVE_JWXYZ */
+ int h;
+ double s, v;
+ rgb_to_hsv (st->colors[i].red,
+ st->colors[i].green,
+ st->colors[i].blue,
+ &h, &s, &v);
+ v *= 0.4;
+ hsv_to_rgb (h, s, v,
+ &st->colors2[i].red,
+ &st->colors2[i].green,
+ &st->colors2[i].blue);
+ st->colors2[i].pixel = st->colors[i].pixel;
+ XAllocColor (st->dpy, st->xgwa.colormap, &st->colors2[i]);
+# endif /* !HAVE_JWXYZ */
+ }
+ }
+# endif /* !DO_STIPPLE */
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Delay");
+ st->iterations = get_integer_resource (st->dpy, "iterations", "Iterations");
+
+ return st;
+}
+
+static unsigned long
+cynosure_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ if (st->iterations > 0 && ++st->i >= st->iterations)
+ {
+ st->i = 0;
+ if (!mono_p)
+ XSetWindowBackground(st->dpy, st->window,
+ st->colors[random() % st->ncolors].pixel);
+ XClearWindow(st->dpy, st->window);
+ }
+ paint(st);
+
+ return st->delay;
+}
+
+
+/**
+ * paint adds a new layer of multicolored rectangles within a grid of
+ * randomly generated size. Each row of rectangles is the same color,
+ * but colors vary slightly from row to row. Each rectangle is placed
+ * within a regularly-sized cell, but each rectangle is sized and
+ * placed randomly within that cell.
+ *
+ * @param g the Graphics coordinate in which to draw
+ * @see #genNewColor
+ **/
+static void paint(struct state *st)
+{
+ int i;
+ int cellsWide, cellsHigh, cellWidth, cellHeight;
+ int width = st->xgwa.width;
+ int height = st->xgwa.height;
+
+ /* How many cells wide the grid is (equal to gridSize +/- (gridSize / 2))
+ */
+ cellsWide = c_tweak(st, st->gridSize, st->gridSize / 2);
+ /* How many cells high the grid is (equal to gridSize +/- (gridSize / 2))
+ */
+ cellsHigh = c_tweak(st, st->gridSize, st->gridSize / 2);
+ /* How wide each cell in the grid is */
+ cellWidth = width / cellsWide;
+ /* How tall each cell in the grid is */
+ cellHeight = height / cellsHigh;
+
+ /* Ensure that each cell is above a certain minimum size */
+
+ if (cellWidth < MINCELLSIZE) {
+ cellWidth = MINCELLSIZE;
+ cellsWide = width / cellWidth;
+ }
+
+ if (cellHeight < MINCELLSIZE) {
+ cellHeight = MINCELLSIZE;
+ cellsHigh = width / cellWidth;
+ }
+
+ /* fill the grid with randomly-generated cells */
+ for(i = 0; i < cellsHigh; i++) {
+ int j;
+
+ /* Each row is a different color, randomly generated (but constrained) */
+ if (!mono_p)
+ {
+ int c = genNewColor(st);
+ XSetForeground(st->dpy, st->fg_gc, st->colors[c].pixel);
+# ifndef DO_STIPPLE
+ if (st->colors2)
+ XSetForeground(st->dpy, st->shadow_gc, st->colors2[c].pixel);
+# endif
+ }
+
+ for(j = 0; j < cellsWide; j++) {
+ int curWidth, curHeight, curX, curY;
+
+ /* Generate a random height for a rectangle and make sure that */
+ /* it's above a certain minimum size */
+ curHeight = random() % (cellHeight - st->shadowWidth);
+ if (curHeight < MINRECTSIZE)
+ curHeight = MINRECTSIZE;
+ /* Generate a random width for a rectangle and make sure that
+ it's above a certain minimum size */
+ curWidth = random() % (cellWidth - st->shadowWidth);
+ if (curWidth < MINRECTSIZE)
+ curWidth = MINRECTSIZE;
+ /* Figure out a random place to locate the rectangle within the
+ cell */
+ curY = (i * cellHeight) + (random() % ((cellHeight - curHeight) -
+ st->shadowWidth));
+ curX = (j * cellWidth) + (random() % ((cellWidth - curWidth) -
+ st->shadowWidth));
+
+ /* Draw the shadow */
+ if (st->elevation > 0)
+ XFillRectangle(st->dpy, st->window, st->shadow_gc,
+ curX + st->elevation, curY + st->elevation,
+ curWidth, curHeight);
+
+ /* Draw the edge */
+ if (st->shadowWidth > 0)
+ XFillRectangle(st->dpy, st->window, st->bg_gc,
+ curX + st->shadowWidth, curY + st->shadowWidth,
+ curWidth, curHeight);
+
+ XFillRectangle(st->dpy, st->window, st->fg_gc, curX, curY, curWidth, curHeight);
+
+ /* Draw a 1-pixel black border around the rectangle */
+ XDrawRectangle(st->dpy, st->window, st->bg_gc, curX, curY, curWidth, curHeight);
+ }
+
+ }
+}
+
+
+/**
+ * genNewColor returns a new color, gradually mutating the colors and
+ * occasionally returning a totally random color, just for variety.
+ *
+ * @return the new color
+ **/
+static int genNewColor(struct state *st)
+{
+ /* These lines handle "sway", or the gradual random changing of */
+ /* colors. After genNewColor() has been called a given number of */
+ /* times (specified by a random permutation of the tweak variable), */
+ /* take whatever color has been most recently randomly generated and */
+ /* make it the new base color. */
+ if (st->timeLeft == 0) {
+ st->timeLeft = c_tweak(st, st->sway, st->sway / 3);
+ st->curColor = st->curBase;
+ } else {
+ st->timeLeft--;
+ }
+
+ /* If a randomly generated number is less than the threshold value,
+ produce a "sport" color value that is completely unrelated to the
+ current palette. */
+ if (0 == (random() % THRESHOLD)) {
+ return (random() % st->ncolors);
+ } else {
+ st->curBase = genConstrainedColor(st, st->curColor, st->tweak);
+ return st->curBase;
+ }
+
+}
+
+/**
+ * genConstrainedColor creates a random new color within a certain
+ * range of an existing color. Right now this works with RGB color
+ * values, but a future version of the program will most likely use HSV
+ * colors, which should generate a more pleasing progression of values.
+ *
+ * @param base the color on which the new color will be based
+ * @param tweak the amount that the new color can be tweaked
+ * @return a new constrained color
+ * @see #genNewColor
+ **/
+static int genConstrainedColor(struct state *st, int base, int tweak)
+{
+ int i = 1 + (random() % st->tweak);
+ if (random() & 1)
+ i = -i;
+ i = (base + i) % st->ncolors;
+ while (i < 0)
+ i += st->ncolors;
+ return i;
+}
+
+/**
+ * Utility function to generate a tweaked color value
+ *
+ * @param base the byte value on which the color is based
+ * @param tweak the amount the value will be skewed
+ * @see #tweak
+ * @return the tweaked byte
+ **/
+static int c_tweak(struct state *st, int base, int tweak)
+{
+ int ranTweak = (random() % (2 * tweak));
+ int n = (base + (ranTweak - tweak));
+ if (n < 0) n = -n;
+ return (n < 255 ? n : 255);
+}
+
+static void
+cynosure_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->xgwa.width = w;
+ st->xgwa.height = h;
+}
+
+static Bool
+cynosure_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->i = st->iterations;
+ return True;
+ }
+ return False;
+}
+
+static void
+cynosure_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+static const char *cynosure_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ ".lowrez: true",
+ "*fpsSolid: true",
+ "*delay: 500000",
+ "*colors: 128",
+ "*iterations: 100",
+ "*shadowWidth: 2",
+ "*elevation: 5",
+ "*sway: 30",
+ "*tweak: 20",
+ "*gridSize: 12",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec cynosure_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-ncolors", ".colors", XrmoptionSepArg, 0 },
+ { "-iterations", ".iterations", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("Cynosure", cynosure)
diff --git a/hacks/cynosure.man b/hacks/cynosure.man
new file mode 100644
index 0000000..b89eb81
--- /dev/null
+++ b/hacks/cynosure.man
@@ -0,0 +1,64 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+cynosure - gentle overlapping squares screen saver.
+.SH SYNOPSIS
+.B cynosure
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-iterations \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+A hack similar to `greynetic', but less frenetic. The first implementation
+was by Stephen Linhart; then Ozymandias G. Desiderata wrote a Java applet
+clone. That clone was discovered by Jamie Zawinski, and ported to C for
+inclusion here.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 500000 (0.50 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 128.
+.TP 8
+.B \-iterations \fInumber\fP
+Duration. 2 - 200. Default: 100.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Stephen Linhart, Ozymandias G. Desiderata, and
+Jamie Zawinski. Permission to use, copy, modify, distribute, and sell
+this software and its documentation for any purpose is hereby granted
+without fee, provided that the above copyright notice appear in all
+copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about
+the suitability of this software for any purpose. It is provided "as
+is" without express or implied warranty.
+.SH AUTHOR
+Stephen Linhart, Ozymandias G. Desiderata, and Jamie Zawinski.
diff --git a/hacks/decayscreen.c b/hacks/decayscreen.c
new file mode 100644
index 0000000..8b45af9
--- /dev/null
+++ b/hacks/decayscreen.c
@@ -0,0 +1,397 @@
+/* xscreensaver, Copyright (c) 1992-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* decayscreen
+ *
+ * Based on slidescreen program from the xscreensaver application and the
+ * decay program for Sun framebuffers. This is the comment from the decay.c
+ * file:
+
+ * decay.c
+ * find the screen bitmap for the console and make it "decay" by
+ * randomly shifting random rectangles by one pixelwidth at a time.
+ *
+ * by David Wald, 1988
+ * rewritten by Natuerlich!
+ * based on a similar "utility" on the Apollo ring at Yale.
+
+ * X version by
+ *
+ * Vivek Khera <khera@cs.duke.edu>
+ * 5-AUG-1993
+ *
+ * Hacked by jwz, 28-Nov-97 (sped up and added new motion directions)
+
+ * R. Schultz
+ * Added "melt" & "stretch" modes 28-Mar-1999
+ *
+ */
+
+#include "screenhack.h"
+#include <time.h>
+
+struct state {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ Pixmap saved;
+ int saved_w, saved_h;
+
+ int sizex, sizey;
+ int delay;
+ int duration;
+ GC gc;
+ int mode;
+ int random_p;
+ time_t start_time;
+
+ int fuzz_toggle;
+ const int *current_bias;
+
+ async_load_state *img_loader;
+};
+
+
+#define SHUFFLE 0
+#define UP 1
+#define LEFT 2
+#define RIGHT 3
+#define DOWN 4
+#define UPLEFT 5
+#define DOWNLEFT 6
+#define UPRIGHT 7
+#define DOWNRIGHT 8
+#define IN 9
+#define OUT 10
+#define MELT 11
+#define STRETCH 12
+#define FUZZ 13
+
+static void
+decayscreen_load_image (struct state *st)
+{
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->sizex = xgwa.width;
+ st->sizey = xgwa.height;
+ if (st->img_loader) abort();
+
+ st->img_loader = load_image_async_simple (0, xgwa.screen, st->window,
+ st->window, 0, 0);
+}
+
+static void *
+decayscreen_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ long gcflags;
+ unsigned long bg;
+ char *s;
+
+ st->dpy = dpy;
+ st->window = window;
+ st->random_p = 0;
+
+ s = get_string_resource(st->dpy, "mode", "Mode");
+ if (s && !strcmp(s, "shuffle")) st->mode = SHUFFLE;
+ else if (s && !strcmp(s, "up")) st->mode = UP;
+ else if (s && !strcmp(s, "left")) st->mode = LEFT;
+ else if (s && !strcmp(s, "right")) st->mode = RIGHT;
+ else if (s && !strcmp(s, "down")) st->mode = DOWN;
+ else if (s && !strcmp(s, "upleft")) st->mode = UPLEFT;
+ else if (s && !strcmp(s, "downleft")) st->mode = DOWNLEFT;
+ else if (s && !strcmp(s, "upright")) st->mode = UPRIGHT;
+ else if (s && !strcmp(s, "downright")) st->mode = DOWNRIGHT;
+ else if (s && !strcmp(s, "in")) st->mode = IN;
+ else if (s && !strcmp(s, "out")) st->mode = OUT;
+ else if (s && !strcmp(s, "melt")) st->mode = MELT;
+ else if (s && !strcmp(s, "stretch")) st->mode = STRETCH;
+ else if (s && !strcmp(s, "fuzz")) st->mode = FUZZ;
+ else {
+ if (s && *s && !!strcmp(s, "random"))
+ fprintf(stderr, "%s: unknown mode %s\n", progname, s);
+ st->random_p = 1;
+ st->mode = random() % (FUZZ+1);
+ }
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ if (st->delay < 0) st->delay = 0;
+
+ st->duration = get_integer_resource (st->dpy, "duration", "Seconds");
+ if (st->duration < 1) st->duration = 1;
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ gcv.function = GXcopy;
+ gcv.subwindow_mode = IncludeInferiors;
+ bg = get_pixel_resource (st->dpy, st->xgwa.colormap, "background", "Background");
+ gcv.foreground = bg;
+
+ gcflags = GCForeground | GCFunction;
+ if (use_subwindow_mode_p(st->xgwa.screen, st->window)) /* see grabscreen.c */
+ gcflags |= GCSubwindowMode;
+ st->gc = XCreateGC (st->dpy, st->window, gcflags, &gcv);
+
+ st->start_time = time ((time_t *) 0);
+ decayscreen_load_image (st);
+
+ return st;
+}
+
+
+/*
+ * perform one iteration of decay
+ */
+static unsigned long
+decayscreen_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int left, top, width, height, toleft, totop;
+
+#define L 101
+#define R 102
+#define U 103
+#define D 104
+ static const int no_bias[] = { L,L,L,L, R,R,R,R, U,U,U,U, D,D,D,D };
+ static const int up_bias[] = { L,L,L,L, R,R,R,R, U,U,U,U, U,U,D,D };
+ static const int down_bias[] = { L,L,L,L, R,R,R,R, U,U,D,D, D,D,D,D };
+ static const int left_bias[] = { L,L,L,L, L,L,R,R, U,U,U,U, D,D,D,D };
+ static const int right_bias[] = { L,L,R,R, R,R,R,R, U,U,U,U, D,D,D,D };
+
+ static const int upleft_bias[] = { L,L,L,L, L,R,R,R, U,U,U,U, U,D,D,D };
+ static const int downleft_bias[] = { L,L,L,L, L,R,R,R, U,U,U,D, D,D,D,D };
+ static const int upright_bias[] = { L,L,L,R, R,R,R,R, U,U,U,U, U,D,D,D };
+ static const int downright_bias[] = { L,L,L,R, R,R,R,R, U,U,U,D, D,D,D,D };
+
+ int off = 1;
+ if (st->sizex > 2560) off *= 2; /* Retina displays */
+
+ if (st->img_loader) /* still loading */
+ {
+ st->img_loader = load_image_async_simple (st->img_loader,
+ 0, 0, 0, 0, 0);
+ if (! st->img_loader) { /* just finished */
+
+ st->start_time = time ((time_t *) 0);
+ if (st->random_p)
+ st->mode = random() % (FUZZ+1);
+
+ if (st->mode == MELT || st->mode == STRETCH)
+ /* make sure screen eventually turns background color */
+ XDrawLine (st->dpy, st->window, st->gc, 0, 0, st->sizex, 0);
+
+ if (!st->saved) {
+ st->saved = XCreatePixmap (st->dpy, st->window,
+ st->sizex, st->sizey,
+ st->xgwa.depth);
+ st->saved_w = st->sizex;
+ st->saved_h = st->sizey;
+ }
+ XCopyArea (st->dpy, st->window, st->saved, st->gc, 0, 0,
+ st->sizex, st->sizey, 0, 0);
+ }
+ return st->delay;
+ }
+
+ if (!st->img_loader &&
+ st->start_time + st->duration < time ((time_t *) 0)) {
+ decayscreen_load_image (st);
+ }
+
+ switch (st->mode) {
+ case SHUFFLE: st->current_bias = no_bias; break;
+ case UP: st->current_bias = up_bias; break;
+ case LEFT: st->current_bias = left_bias; break;
+ case RIGHT: st->current_bias = right_bias; break;
+ case DOWN: st->current_bias = down_bias; break;
+ case UPLEFT: st->current_bias = upleft_bias; break;
+ case DOWNLEFT: st->current_bias = downleft_bias; break;
+ case UPRIGHT: st->current_bias = upright_bias; break;
+ case DOWNRIGHT: st->current_bias = downright_bias; break;
+ case IN: st->current_bias = no_bias; break;
+ case OUT: st->current_bias = no_bias; break;
+ case MELT: st->current_bias = no_bias; break;
+ case STRETCH: st->current_bias = no_bias; break;
+ case FUZZ: st->current_bias = no_bias; break;
+ default: abort();
+ }
+
+#define nrnd(x) ((x) ? random() % (x) : x)
+
+ if (st->mode == MELT || st->mode == STRETCH) {
+ left = nrnd(st->sizex/2);
+ top = nrnd(st->sizey);
+ width = nrnd( st->sizex/2 ) + st->sizex/2 - left;
+ height = nrnd(st->sizey - top);
+ toleft = left;
+ totop = top+off;
+
+ } else if (st->mode == FUZZ) { /* By Vince Levey <vincel@vincel.org>;
+ inspired by the "melt" mode of the
+ "scrhack" IrisGL program by Paul Haeberli
+ circa 1991. */
+ left = nrnd(st->sizex - 1);
+ top = nrnd(st->sizey - 1);
+ st->fuzz_toggle = !st->fuzz_toggle;
+ if (st->fuzz_toggle)
+ {
+ totop = top;
+ height = off;
+ toleft = nrnd(st->sizex - 1);
+ if (toleft > left)
+ {
+ width = toleft-left;
+ toleft = left;
+ left++;
+ }
+ else
+ {
+ width = left-toleft;
+ left = toleft;
+ toleft++;
+ }
+ }
+ else
+ {
+ toleft = left;
+ width = off;
+ totop = nrnd(st->sizey - 1);
+ if (totop > top)
+ {
+ height = totop-top;
+ totop = top;
+ top++;
+ }
+ else
+ {
+ height = top-totop;
+ top = totop;
+ totop++;
+ }
+ }
+
+ } else {
+
+ left = nrnd(st->sizex - 1);
+ top = nrnd(st->sizey);
+ width = nrnd(st->sizex - left);
+ height = nrnd(st->sizey - top);
+
+ toleft = left;
+ totop = top;
+ if (st->mode == IN || st->mode == OUT) {
+ int x = left+(width/2);
+ int y = top+(height/2);
+ int cx = st->sizex/2;
+ int cy = st->sizey/2;
+ if (st->mode == IN) {
+ if (x > cx && y > cy) st->current_bias = upleft_bias;
+ else if (x < cx && y > cy) st->current_bias = upright_bias;
+ else if (x < cx && y < cy) st->current_bias = downright_bias;
+ else /* (x > cx && y < cy)*/ st->current_bias = downleft_bias;
+ } else {
+ if (x > cx && y > cy) st->current_bias = downright_bias;
+ else if (x < cx && y > cy) st->current_bias = downleft_bias;
+ else if (x < cx && y < cy) st->current_bias = upleft_bias;
+ else /* (x > cx && y < cy)*/ st->current_bias = upright_bias;
+ }
+ }
+
+ switch (st->current_bias[random() % (sizeof(no_bias)/sizeof(*no_bias))]) {
+ case L: toleft = left-off; break;
+ case R: toleft = left+off; break;
+ case U: totop = top-off; break;
+ case D: totop = top+off; break;
+ default: abort(); break;
+ }
+ }
+
+ if (st->mode == STRETCH) {
+ XCopyArea (st->dpy, st->window, st->window, st->gc,
+ 0, st->sizey-top-off*2, st->sizex, top+off,
+ 0, st->sizey-top-off);
+ } else {
+ XCopyArea (st->dpy, st->window, st->window, st->gc,
+ left, top, width, height,
+ toleft, totop);
+ }
+
+#undef nrnd
+
+ return st->delay;
+}
+
+static void
+decayscreen_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ if (! st->saved) return; /* Image might not be loaded yet */
+ XClearWindow (st->dpy, st->window);
+ XCopyArea (st->dpy, st->saved, st->window, st->gc,
+ 0, 0, st->saved_w, st->saved_h,
+ ((int)w - st->saved_w) / 2,
+ ((int)h - st->saved_h) / 2);
+ st->sizex = w;
+ st->sizey = h;
+}
+
+static Bool
+decayscreen_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->start_time = 0;
+ return True;
+ }
+ return False;
+}
+
+static void
+decayscreen_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+
+static const char *decayscreen_defaults [] = {
+ ".background: Black",
+ ".foreground: Yellow",
+ "*dontClearRoot: True",
+ "*fpsSolid: True",
+
+#ifdef __sgi /* really, HAVE_READ_DISPLAY_EXTENSION */
+ "*visualID: Best",
+#endif
+
+ "*delay: 10000",
+ "*mode: random",
+ "*duration: 120",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+ "*rotateImages: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec decayscreen_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-duration", ".duration", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("DecayScreen", decayscreen)
diff --git a/hacks/decayscreen.man b/hacks/decayscreen.man
new file mode 100644
index 0000000..7b0f816
--- /dev/null
+++ b/hacks/decayscreen.man
@@ -0,0 +1,92 @@
+.TH XScreenSaver 1 "05-Apr-1999" "X Version 11"
+.SH NAME
+decayscreen - make a screen meltdown.
+.SH SYNOPSIS
+.B decayscreen
+[\-display \fIhost:display.screen\fP]
+[\-window]
+[\-root]
+[\-mono]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIusecs\fP]
+[\-duration \fIsecs\fP]
+[\-mode \fImode\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIdecayscreen\fP program creates a melting effect by randomly
+shifting rectangles around the screen.
+
+The image that it manipulates will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
+.SH OPTIONS
+.I decayscreen
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+Slow it down.
+.TP 8
+.B \-duration \fIseconds\fP
+How long to run before loading a new image. Default 120 seconds.
+.TP 8
+.B \-mode \fImode\fP
+The direction in which the image should tend to slide. Legal values are
+\fIrandom\fP (meaning pick one), \fIup\fP, \fIleft\fP, \fIright\fP,
+\fIdown\fP, \fIupleft\fP, \fIdownleft\fP, \fIupright\fP, \fIdownright\fP,
+\fIshuffle\fP (meaning prefer no particular direction), \fIin\fP (meaning
+move things toward the center), \fIout\fP (meaning move things away
+from the center), \fImelt\fP (meaning melt straight
+downward), \fIstretch\fP (meaning stretch the screen downward),
+and \fIfuzz\fP (meaning go blurry instead of melty).
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH "SEE ALSO"
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright 1992 by Vivek Khera. Permission to use, copy, modify, distribute,
+and sell this software and its documentation for any purpose is hereby granted
+without fee, provided that the above copyright notice appear in all copies and
+that both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the suitability
+of this software for any purpose. It is provided "as is" without express or
+implied warranty.
+.SH AUTHOR
+Vivek Khera <khera@cs.duke.edu>, 05-Aug-93; based on code by David Wald, 1988.
+Modified by jwz, 28-Nov-1997.
+Modified by Rick Schultz <rick@skapunx.net> 05-Apr-1999.
+Modified by Vince Levey <vincel@vincel.org> 25-Oct-2001.
diff --git a/hacks/deco.c b/hacks/deco.c
new file mode 100644
index 0000000..876badc
--- /dev/null
+++ b/hacks/deco.c
@@ -0,0 +1,339 @@
+/* xscreensaver, Copyright (c) 1997-2013 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Concept snarfed from Michael D. Bayne in
+ * http://www.go2net.com/internet/deep/1997/04/16/body.html
+ *
+ * Changes by Lars Huttar, http://www.huttar.net:
+ * - allow use of golden ratio for dividing rectangles instead of 1/2.
+ * - allow smooth colors instead of random
+ * - added line thickness setting
+ * - added "Mondrian" mode
+ * Other ideas:
+ * - allow recomputing the colormap on each new frame (especially useful
+ * when ncolors is low)
+ */
+
+#include "screenhack.h"
+#include <stdio.h>
+
+struct state {
+ XColor colors[255];
+ int ncolors;
+ int max_depth;
+ int min_height;
+ int min_width;
+ int line_width;
+ int old_line_width;
+ Bool goldenRatio;
+ Bool mondrian;
+ Bool smoothColors;
+
+ int delay;
+ XWindowAttributes xgwa;
+ GC fgc, bgc;
+ int current_color;
+};
+
+/* Golden Ratio
+ * Suppose you're dividing a rectangle of length A+B
+ * into two parts, of length A and B respectively. You want the ratio of
+ * A to B to be the same as the ratio of the whole (A+B) to A. The golden
+ * ratio (phi) is that ratio. Supposed to be visually pleasing. */
+#define PHI 1.61803
+#define PHI1 (1.0/PHI)
+#define PHI2 (1.0 - PHI1)
+
+/* copied from make_random_colormap in colors.c */
+static void
+make_mondrian_colormap (Screen *screen, Visual *visual, Colormap cmap,
+ XColor *colors, int *ncolorsP,
+ Bool allocate_p,
+ Bool *writable_pP,
+ Bool verbose_p)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ Bool wanted_writable = (allocate_p && writable_pP && *writable_pP);
+ int ncolors = 8;
+ int i;
+
+ if (*ncolorsP <= 0) return;
+
+ /* If this visual doesn't support writable cells, don't bother trying. */
+ if (wanted_writable && !has_writable_cells(screen, visual))
+ *writable_pP = False;
+
+ for (i = 0; i < ncolors; i++)
+ {
+ colors[i].flags = DoRed|DoGreen|DoBlue;
+ colors[i].red = 0;
+ colors[i].green = 0;
+ colors[i].blue = 0;
+
+ switch(i) {
+ case 0: case 1: case 2: case 3: case 7: /* white */
+ colors[i].red = 0xE800;
+ colors[i].green = 0xE800;
+ colors[i].blue = 0xE800;
+ break;
+ case 4:
+ colors[i].red = 0xCFFF; break; /* red */
+ case 5:
+ colors[i].red = 0x2000;
+ colors[i].blue = 0xCFFF; break; /* blue */
+ case 6:
+ colors[i].red = 0xDFFF; /* yellow */
+ colors[i].green = 0xCFFF; break;
+ }
+ }
+
+ if (!allocate_p)
+ return;
+
+ RETRY_NON_WRITABLE:
+ if (writable_pP && *writable_pP)
+ {
+ unsigned long *pixels = (unsigned long *)
+ malloc(sizeof(*pixels) * (ncolors + 1));
+
+ allocate_writable_colors (screen, cmap, pixels, &ncolors);
+ if (ncolors > 0)
+ for (i = 0; i < ncolors; i++)
+ colors[i].pixel = pixels[i];
+ free (pixels);
+ if (ncolors > 0)
+ XStoreColors (dpy, cmap, colors, ncolors);
+ }
+ else
+ {
+ for (i = 0; i < ncolors; i++)
+ {
+ XColor color;
+ color = colors[i];
+ if (!XAllocColor (dpy, cmap, &color))
+ break;
+ colors[i].pixel = color.pixel;
+ }
+ ncolors = i;
+ }
+
+ /* If we tried for writable cells and got none, try for non-writable. */
+ if (allocate_p && ncolors == 0 && writable_pP && *writable_pP)
+ {
+ ncolors = *ncolorsP;
+ *writable_pP = False;
+ goto RETRY_NON_WRITABLE;
+ }
+
+#if 0
+ /* I don't think we need to bother copying or linking to the complain
+ function. */
+ if (verbose_p)
+ complain(*ncolorsP, ncolors, wanted_writable,
+ wanted_writable && *writable_pP);
+#endif
+
+ *ncolorsP = ncolors;
+}
+
+static void
+mondrian_set_sizes (struct state *st, int w, int h)
+{
+ if (w > h) {
+ st->line_width = w/50;
+ st->min_height = st->min_width = w/8;
+ } else {
+ st->line_width = h/50;
+ st->min_height = st->min_width = h/8;
+ }
+}
+
+static void
+deco (Display *dpy, Window window, struct state *st,
+ int x, int y, int w, int h, int depth)
+{
+ if (((random() % st->max_depth) < depth) || (w < st->min_width) || (h < st->min_height))
+ {
+ if (!mono_p)
+ {
+ if (++st->current_color >= st->ncolors)
+ st->current_color = 0;
+ XSetForeground(dpy, st->bgc, st->colors[st->current_color].pixel);
+ }
+ XFillRectangle (dpy, window, st->bgc, x, y, w, h);
+ XDrawRectangle (dpy, window, st->fgc, x, y, w, h);
+ }
+ else
+ {
+ if ((st->goldenRatio || st->mondrian) ? (w > h) : (random() & 1))
+ { /* Divide the rectangle side-by-side */
+ int wnew = (st->goldenRatio ? (w * (random() & 1 ? PHI1 : PHI2)) : w/2);
+ deco (dpy, window, st, x, y, wnew, h, depth+1);
+ deco (dpy, window, st, x+wnew, y, w-wnew, h, depth+1);
+ }
+ else
+ { /* Divide the rectangle top-to-bottom */
+ int hnew = (st->goldenRatio ? (h * (random() & 1 ? PHI1 : PHI2)) : h/2);
+ deco (dpy, window, st, x, y, w, hnew, depth+1);
+ deco (dpy, window, st, x, y+hnew, w, h-hnew, depth+1);
+ }
+ }
+}
+
+static void *
+deco_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+
+ st->delay = get_integer_resource (dpy, "delay", "Integer");
+
+ st->smoothColors = get_boolean_resource(dpy, "smoothColors", "Boolean");
+ st->old_line_width = 1;
+
+ st->goldenRatio = get_boolean_resource (dpy, "goldenRatio", "Boolean");
+
+ st->max_depth = get_integer_resource (dpy, "maxDepth", "Integer");
+ if (st->max_depth < 1) st->max_depth = 1;
+ else if (st->max_depth > 1000) st->max_depth = 1000;
+
+ st->min_width = get_integer_resource (dpy, "minWidth", "Integer");
+ if (st->min_width < 2) st->min_width = 2;
+ st->min_height = get_integer_resource (dpy, "minHeight", "Integer");
+ if (st->min_height < 2) st->min_height = 2;
+
+ st->line_width = get_integer_resource (dpy, "lineWidth", "Integer");
+
+ XGetWindowAttributes (dpy, window, &st->xgwa);
+
+ st->ncolors = get_integer_resource (dpy, "ncolors", "Integer");
+
+ gcv.foreground = get_pixel_resource(dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ st->fgc = XCreateGC (dpy, window, GCForeground, &gcv);
+
+ gcv.foreground = get_pixel_resource(dpy, st->xgwa.colormap,
+ "background", "Background");
+ st->bgc = XCreateGC (dpy, window, GCForeground, &gcv);
+
+ if (st->ncolors <= 2)
+ mono_p = True;
+
+ if (!mono_p)
+ {
+ GC tmp = st->fgc;
+ st->fgc = st->bgc;
+ st->bgc = tmp;
+ }
+
+ st->mondrian = get_boolean_resource(dpy, "mondrian", "Boolean");
+ if (st->mondrian) {
+ /* Mondrian, if true, overrides several other options. */
+ mondrian_set_sizes(st, st->xgwa.width, st->xgwa.height);
+
+ /** set up red-yellow-blue-black-white colormap and fgc **/
+ make_mondrian_colormap(st->xgwa.screen, st->xgwa.visual,
+ st->xgwa.colormap,
+ st->colors, &st->ncolors, True, 0, True);
+
+ /** put white in several cells **/
+ /** set min-height and min-width to about 10% of total w/h **/
+ }
+ else if (st->smoothColors)
+ make_smooth_colormap (st->xgwa.screen, st->xgwa.visual,
+ st->xgwa.colormap,
+ st->colors, &st->ncolors, True, 0, True);
+ else
+ make_random_colormap (st->xgwa.screen, st->xgwa.visual,
+ st->xgwa.colormap,
+ st->colors, &st->ncolors, False, True, 0, True);
+
+ gcv.line_width = st->old_line_width = st->line_width;
+ XChangeGC(dpy, st->fgc, GCLineWidth, &gcv);
+
+ return st;
+}
+
+static unsigned long
+deco_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ XFillRectangle (dpy, window, st->bgc, 0, 0, st->xgwa.width, st->xgwa.height);
+ if (st->mondrian) {
+ mondrian_set_sizes(st, st->xgwa.width, st->xgwa.height);
+ if (st->line_width != st->old_line_width) {
+ XSetLineAttributes(dpy, st->fgc, st->line_width,
+ LineSolid, CapButt, JoinBevel);
+ st->old_line_width = st->line_width;
+ }
+ }
+ deco (dpy, window, st, 0, 0, st->xgwa.width, st->xgwa.height, 0);
+ return 1000000 * st->delay;
+}
+
+static void
+deco_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->xgwa.width = w;
+ st->xgwa.height = h;
+}
+
+static Bool
+deco_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+deco_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+
+static const char *deco_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ ".lowrez: true",
+ "*maxDepth: 12",
+ "*minWidth: 20",
+ "*minHeight: 20",
+ "*lineWidth: 1",
+ "*delay: 5",
+ "*ncolors: 64",
+ "*goldenRatio: False",
+ "*smoothColors: False",
+ "*mondrian: False",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec deco_options [] = {
+ { "-max-depth", ".maxDepth", XrmoptionSepArg, 0 },
+ { "-min-width", ".minWidth", XrmoptionSepArg, 0 },
+ { "-min-height", ".minHeight", XrmoptionSepArg, 0 },
+ { "-line-width", ".lineWidth", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-ncolors", ".ncolors", XrmoptionSepArg, 0 },
+ { "-golden-ratio", ".goldenRatio", XrmoptionNoArg, "True" },
+ { "-no-golden-ratio", ".goldenRatio", XrmoptionNoArg, "False" },
+ { "-smooth-colors", ".smoothColors",XrmoptionNoArg, "True" },
+ { "-no-smooth-colors",".smoothColors",XrmoptionNoArg, "False" },
+ { "-mondrian", ".mondrian", XrmoptionNoArg, "True" },
+ { "-no-mondrian", ".mondrian", XrmoptionNoArg, "False" },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Deco", deco)
diff --git a/hacks/deco.man b/hacks/deco.man
new file mode 100644
index 0000000..e62190c
--- /dev/null
+++ b/hacks/deco.man
@@ -0,0 +1,105 @@
+.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
+.SH NAME
+deco - draw tacky 70s basement wall panelling
+.SH SYNOPSIS
+.B deco
+[\-display \fIhost:display.screen\fP]
+[\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP]
+[\-window]
+[\-root]
+[\-mono]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIseconds\fP]
+[\-max\-depth \fIint\fP]
+[\-min\-width \fIint\fP]
+[\-min\-height \fIint\fP]
+[\-line-width \yIint\fP]
+[\-smooth\-colors]
+[\-golden\-ratio]
+[\-mondrian]
+[\-fps]
+.SH DESCRIPTION
+The \fIdeco\fP program subdivides and colors rectangles randomly.
+It looks kind of like Brady-Bunch-era rec-room wall paneling.
+(Raven says: "This screensaver is ugly enough to peel paint.")
+Can also produce more aesthetically pleasing displays via options.
+.SH OPTIONS
+.I deco
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIseconds\fP
+How long to wait before starting over. Default 5 seconds.
+.TP 8
+.B \-max\-depth \fIinteger\fP
+How deep to subdivide. Default 12.
+.TP 8
+.B \-min\-width \fIinteger\fP
+.TP 8
+.B \-min\-height \fIinteger\fP
+The size of the smallest rectangle to draw. Default 20x20.
+.TP 8
+.B \-line\-width \fIinteger\fP
+Width of lines drawn between rectangles. Default zero (minimal width).
+.TP 8
+.B \-smooth\-colors
+.TP 8
+.B \-no\-smooth\-colors
+Whether to use a smooth color palette instead of a random one.
+Less jarring. Default False.
+.TP 8
+.B \-golden\-ratio
+.TP 8
+.B \-no\-golden\-ratio
+Whether to subdivide rectangles using the golden ratio instead of 1/2.
+This ratio is supposed to be more aesthetically pleasing. Default false.
+.TP 8
+.B \-mondrian
+.TP 8
+.B \-no\-mondrian
+Whether to imitiate style of some famous paintings by Piet Mondrian.
+Overrides line-width and colormap options. Default false.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 26-Apr-97, based on code by
+Michael D. Bayne <mdb@go2net.com>. Golden ratio and
+Mondrian settings by Lars Huttar.
diff --git a/hacks/delaunay.c b/hacks/delaunay.c
new file mode 100644
index 0000000..a5ea9ae
--- /dev/null
+++ b/hacks/delaunay.c
@@ -0,0 +1,301 @@
+/* Triangulate
+ Efficient Triangulation Algorithm Suitable for Terrain Modelling
+ or
+ An Algorithm for Interpolating Irregularly-Spaced Data
+ with Applications in Terrain Modelling
+
+ Written by Paul Bourke
+ Presented at Pan Pacific Computer Conference, Beijing, China.
+ January 1989
+ Abstract
+
+ A discussion of a method that has been used with success in terrain
+ modelling to estimate the height at any point on the land surface
+ from irregularly distributed samples. The special requirements of
+ terrain modelling are discussed as well as a detailed description
+ of the algorithm and an example of its application.
+
+ http://paulbourke.net/papers/triangulate/
+ http://paulbourke.net/papers/triangulate/triangulate.c
+ */
+
+#include <stdlib.h>
+#include <math.h>
+
+#include "delaunay.h"
+
+typedef struct {
+ int p1,p2;
+} IEDGE;
+
+#define TRUE 1
+#define FALSE 0
+#define EPSILON 0.000001
+
+/*
+ Return TRUE if a point (xp,yp) is inside the circumcircle made up
+ of the points (x1,y1), (x2,y2), (x3,y3)
+ The circumcircle centre is returned in (xc,yc) and the radius r
+ NOTE: A point on the edge is inside the circumcircle
+*/
+static int
+circumcircle (double xp,double yp,
+ double x1,double y1,double x2,double y2,double x3,double y3,
+ double *xc,double *yc,double *rsqr)
+{
+ double m1,m2,mx1,mx2,my1,my2;
+ double dx,dy,drsqr;
+ double fabsy1y2 = fabs(y1-y2);
+ double fabsy2y3 = fabs(y2-y3);
+
+ /* Check for coincident points */
+ if (fabsy1y2 < EPSILON && fabsy2y3 < EPSILON)
+ return(FALSE);
+
+ if (fabsy1y2 < EPSILON) {
+ m2 = - (x3-x2) / (y3-y2);
+ mx2 = (x2 + x3) / 2.0;
+ my2 = (y2 + y3) / 2.0;
+ *xc = (x2 + x1) / 2.0;
+ *yc = m2 * (*xc - mx2) + my2;
+ } else if (fabsy2y3 < EPSILON) {
+ m1 = - (x2-x1) / (y2-y1);
+ mx1 = (x1 + x2) / 2.0;
+ my1 = (y1 + y2) / 2.0;
+ *xc = (x3 + x2) / 2.0;
+ *yc = m1 * (*xc - mx1) + my1;
+ } else {
+ m1 = - (x2-x1) / (y2-y1);
+ m2 = - (x3-x2) / (y3-y2);
+ mx1 = (x1 + x2) / 2.0;
+ mx2 = (x2 + x3) / 2.0;
+ my1 = (y1 + y2) / 2.0;
+ my2 = (y2 + y3) / 2.0;
+ *xc = (m1 * mx1 - m2 * mx2 + my2 - my1) / (m1 - m2);
+ if (fabsy1y2 > fabsy2y3) {
+ *yc = m1 * (*xc - mx1) + my1;
+ } else {
+ *yc = m2 * (*xc - mx2) + my2;
+ }
+ }
+
+ dx = x2 - *xc;
+ dy = y2 - *yc;
+ *rsqr = dx*dx + dy*dy;
+
+ dx = xp - *xc;
+ dy = yp - *yc;
+ drsqr = dx*dx + dy*dy;
+
+ /* Original
+ return((drsqr <= *rsqr) ? TRUE : FALSE);
+ Proposed by Chuck Morris */
+ return((drsqr - *rsqr) <= EPSILON ? TRUE : FALSE);
+}
+
+
+/*
+ Triangulation subroutine
+ Takes as input NV vertices in array pxyz
+ Returned is a list of ntri triangular faces in the array v
+ These triangles are arranged in a consistent clockwise order.
+ The triangle array 'v' should be malloced to 3 * nv
+ The vertex array pxyz must be big enough to hold 3 more points
+ The vertex array must be sorted in increasing x values say
+ qsort(p,nv,sizeof(XYZ),XYZCompare);
+*/
+int
+delaunay (int nv,XYZ *pxyz,ITRIANGLE *v,int *ntri)
+{
+ int *complete = NULL;
+ IEDGE *edges = NULL;
+ int nedge = 0;
+ int trimax,emax = 200;
+ int status = 0;
+
+ int inside;
+ int i,j,k;
+ double xp,yp,x1,y1,x2,y2,x3,y3,xc=0,yc=0,r=0;
+ double xmin,xmax,ymin,ymax,xmid,ymid;
+ double dx,dy,dmax;
+
+ /* Allocate memory for the completeness list, flag for each triangle */
+ trimax = 4 * nv;
+ if ((complete = malloc(trimax*sizeof(int))) == NULL) {
+ status = 1;
+ goto skip;
+ }
+
+ /* Allocate memory for the edge list */
+ if ((edges = malloc(emax*(long)sizeof(IEDGE))) == NULL) {
+ status = 2;
+ goto skip;
+ }
+
+ /*
+ Find the maximum and minimum vertex bounds.
+ This is to allow calculation of the bounding triangle
+ */
+ xmin = pxyz[0].x;
+ ymin = pxyz[0].y;
+ xmax = xmin;
+ ymax = ymin;
+ for (i=1;i<nv;i++) {
+ if (pxyz[i].x < xmin) xmin = pxyz[i].x;
+ if (pxyz[i].x > xmax) xmax = pxyz[i].x;
+ if (pxyz[i].y < ymin) ymin = pxyz[i].y;
+ if (pxyz[i].y > ymax) ymax = pxyz[i].y;
+ }
+ dx = xmax - xmin;
+ dy = ymax - ymin;
+ dmax = (dx > dy) ? dx : dy;
+ xmid = (xmax + xmin) / 2.0;
+ ymid = (ymax + ymin) / 2.0;
+
+ /*
+ Set up the supertriangle
+ This is a triangle which encompasses all the sample points.
+ The supertriangle coordinates are added to the end of the
+ vertex list. The supertriangle is the first triangle in
+ the triangle list.
+ */
+ pxyz[nv+0].x = xmid - 20 * dmax;
+ pxyz[nv+0].y = ymid - dmax;
+ pxyz[nv+0].z = 0.0;
+ pxyz[nv+1].x = xmid;
+ pxyz[nv+1].y = ymid + 20 * dmax;
+ pxyz[nv+1].z = 0.0;
+ pxyz[nv+2].x = xmid + 20 * dmax;
+ pxyz[nv+2].y = ymid - dmax;
+ pxyz[nv+2].z = 0.0;
+ v[0].p1 = nv;
+ v[0].p2 = nv+1;
+ v[0].p3 = nv+2;
+ complete[0] = FALSE;
+ *ntri = 1;
+
+ /*
+ Include each point one at a time into the existing mesh
+ */
+ for (i=0;i<nv;i++) {
+
+ xp = pxyz[i].x;
+ yp = pxyz[i].y;
+ nedge = 0;
+
+ /*
+ Set up the edge buffer.
+ If the point (xp,yp) lies inside the circumcircle then the
+ three edges of that triangle are added to the edge buffer
+ and that triangle is removed.
+ */
+ for (j=0;j<(*ntri);j++) {
+ if (complete[j])
+ continue;
+ x1 = pxyz[v[j].p1].x;
+ y1 = pxyz[v[j].p1].y;
+ x2 = pxyz[v[j].p2].x;
+ y2 = pxyz[v[j].p2].y;
+ x3 = pxyz[v[j].p3].x;
+ y3 = pxyz[v[j].p3].y;
+ inside = circumcircle(xp,yp,x1,y1,x2,y2,x3,y3,&xc,&yc,&r);
+ if (xc < xp && ((xp-xc)*(xp-xc)) > r)
+ complete[j] = TRUE;
+ if (inside) {
+ /* Check that we haven't exceeded the edge list size */
+ if (nedge+3 >= emax) {
+ emax += 100;
+ if ((edges = realloc(edges,emax*(long)sizeof(IEDGE))) == NULL) {
+ status = 3;
+ goto skip;
+ }
+ }
+ edges[nedge+0].p1 = v[j].p1;
+ edges[nedge+0].p2 = v[j].p2;
+ edges[nedge+1].p1 = v[j].p2;
+ edges[nedge+1].p2 = v[j].p3;
+ edges[nedge+2].p1 = v[j].p3;
+ edges[nedge+2].p2 = v[j].p1;
+ nedge += 3;
+ v[j] = v[(*ntri)-1];
+ complete[j] = complete[(*ntri)-1];
+ (*ntri)--;
+ j--;
+ }
+ }
+
+ /*
+ Tag multiple edges
+ Note: if all triangles are specified anticlockwise then all
+ interior edges are opposite pointing in direction.
+ */
+ for (j=0;j<nedge-1;j++) {
+ for (k=j+1;k<nedge;k++) {
+ if ((edges[j].p1 == edges[k].p2) && (edges[j].p2 == edges[k].p1)) {
+ edges[j].p1 = -1;
+ edges[j].p2 = -1;
+ edges[k].p1 = -1;
+ edges[k].p2 = -1;
+ }
+ /* Shouldn't need the following, see note above */
+ if ((edges[j].p1 == edges[k].p1) && (edges[j].p2 == edges[k].p2)) {
+ edges[j].p1 = -1;
+ edges[j].p2 = -1;
+ edges[k].p1 = -1;
+ edges[k].p2 = -1;
+ }
+ }
+ }
+
+ /*
+ Form new triangles for the current point
+ Skipping over any tagged edges.
+ All edges are arranged in clockwise order.
+ */
+ for (j=0;j<nedge;j++) {
+ if (edges[j].p1 < 0 || edges[j].p2 < 0)
+ continue;
+ if ((*ntri) >= trimax) {
+ status = 4;
+ goto skip;
+ }
+ v[*ntri].p1 = edges[j].p1;
+ v[*ntri].p2 = edges[j].p2;
+ v[*ntri].p3 = i;
+ complete[*ntri] = FALSE;
+ (*ntri)++;
+ }
+ }
+
+ /*
+ Remove triangles with supertriangle vertices
+ These are triangles which have a vertex number greater than nv
+ */
+ for (i=0;i<(*ntri);i++) {
+ if (v[i].p1 >= nv || v[i].p2 >= nv || v[i].p3 >= nv) {
+ v[i] = v[(*ntri)-1];
+ (*ntri)--;
+ i--;
+ }
+ }
+
+ skip:
+ free(edges);
+ free(complete);
+ return(status);
+}
+
+
+int
+delaunay_xyzcompare (const void *v1, const void *v2)
+{
+ const XYZ *p1,*p2;
+ p1 = v1;
+ p2 = v2;
+ if (p1->x < p2->x)
+ return(-1);
+ else if (p1->x > p2->x)
+ return(1);
+ else
+ return(0);
+}
diff --git a/hacks/delaunay.h b/hacks/delaunay.h
new file mode 100644
index 0000000..913de6d
--- /dev/null
+++ b/hacks/delaunay.h
@@ -0,0 +1,52 @@
+/* Triangulate
+ Efficient Triangulation Algorithm Suitable for Terrain Modelling
+ or
+ An Algorithm for Interpolating Irregularly-Spaced Data
+ with Applications in Terrain Modelling
+
+ Written by Paul Bourke
+ Presented at Pan Pacific Computer Conference, Beijing, China.
+ January 1989
+ Abstract
+
+ A discussion of a method that has been used with success in terrain
+ modelling to estimate the height at any point on the land surface
+ from irregularly distributed samples. The special requirements of
+ terrain modelling are discussed as well as a detailed description
+ of the algorithm and an example of its application.
+
+ http://paulbourke.net/papers/triangulate/
+ http://paulbourke.net/papers/triangulate/triangulate.c
+ */
+
+#ifndef __DELAUNAY_H__
+#define __DELAUNAY_H__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+typedef struct {
+ double x,y,z;
+} XYZ;
+
+typedef struct {
+ int p1,p2,p3;
+} ITRIANGLE;
+
+/*
+ Takes as input NV vertices in array pxyz
+ Returned is a list of ntri triangular faces in the array v
+ These triangles are arranged in a consistent clockwise order.
+ The triangle array 'v' should be malloced to 3 * nv
+ The vertex array pxyz must be big enough to hold 3 more points
+ The vertex array must be sorted in increasing x values
+ */
+extern int delaunay (int nv, XYZ *pxyz, ITRIANGLE *v, int *ntri);
+
+/* qsort(p,nv,sizeof(XYZ), delaunay_xyzcompare); */
+extern int delaunay_xyzcompare (const void *v1, const void *v2);
+
+
+#endif /* __DELAUNAY_H__ */
+
diff --git a/hacks/deluxe.c b/hacks/deluxe.c
new file mode 100644
index 0000000..694a982
--- /dev/null
+++ b/hacks/deluxe.c
@@ -0,0 +1,465 @@
+/* xscreensaver, Copyright (c) 1999-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+#include "alpha.h"
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+# include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+#define countof(x) (sizeof(x)/sizeof(*(x)))
+#define ABS(x) ((x)<0?-(x):(x))
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ Bool transparent_p;
+ int nplanes;
+ unsigned long base_pixel, *plane_masks;
+
+ int count;
+ int delay;
+ int ncolors;
+ Bool dbuf;
+ XColor *colors;
+ GC erase_gc;
+ struct throbber **throbbers;
+ XWindowAttributes xgwa;
+ Pixmap b, ba, bb; /* double-buffer to reduce flicker */
+
+# ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ Bool dbeclear_p;
+ XdbeBackBuffer backb;
+# endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+};
+
+struct throbber {
+ int x, y;
+ int size;
+ int max_size;
+ int thickness;
+ int speed;
+ int fuse;
+ GC gc;
+ void (*draw) (struct state *, Drawable, struct throbber *);
+};
+
+
+static void
+draw_star (struct state *st, Drawable w, struct throbber *t)
+{
+ XPoint points[11];
+ int x = t->x;
+ int y = t->y;
+
+ /*
+ The following constant is really:
+ sqrt(5 - sqrt(5)) / sqrt(25 - 11 * sqrt(5))
+
+ Reference: http://mathworld.wolfram.com/Pentagram.html
+ */
+ int s = t->size * 2.6180339887498985;
+ int s2 = t->size;
+ double c = M_PI * 2;
+ double o = -M_PI / 2;
+
+ points[0].x = x + s * cos(o + 0.0*c); points[0].y = y + s * sin(o + 0.0*c);
+ points[1].x = x + s2 * cos(o + 0.1*c); points[1].y = y + s2 * sin(o + 0.1*c);
+ points[2].x = x + s * cos(o + 0.2*c); points[2].y = y + s * sin(o + 0.2*c);
+ points[3].x = x + s2 * cos(o + 0.3*c); points[3].y = y + s2 * sin(o + 0.3*c);
+ points[4].x = x + s * cos(o + 0.4*c); points[4].y = y + s * sin(o + 0.4*c);
+ points[5].x = x + s2 * cos(o + 0.5*c); points[5].y = y + s2 * sin(o + 0.5*c);
+ points[6].x = x + s * cos(o + 0.6*c); points[6].y = y + s * sin(o + 0.6*c);
+ points[7].x = x + s2 * cos(o + 0.7*c); points[7].y = y + s2 * sin(o + 0.7*c);
+ points[8].x = x + s * cos(o + 0.8*c); points[8].y = y + s * sin(o + 0.8*c);
+ points[9].x = x + s2 * cos(o + 0.9*c); points[9].y = y + s2 * sin(o + 0.9*c);
+ points[10] = points[0];
+
+ XDrawLines (st->dpy, w, t->gc, points, countof(points), CoordModeOrigin);
+}
+
+static void
+draw_circle (struct state *st, Drawable w, struct throbber *t)
+{
+ XDrawArc (st->dpy, w, t->gc,
+ t->x - t->size / 2,
+ t->y - t->size / 2,
+ t->size, t->size,
+ 0, 360*64);
+}
+
+static void
+draw_hlines (struct state *st, Drawable w, struct throbber *t)
+{
+ XDrawLine (st->dpy, w, t->gc, 0,
+ t->y - t->size, t->max_size,
+ t->y - t->size);
+ XDrawLine (st->dpy, w, t->gc, 0,
+ t->y + t->size, t->max_size,
+ t->y + t->size);
+}
+
+static void
+draw_vlines (struct state *st, Drawable w, struct throbber *t)
+{
+ XDrawLine (st->dpy, w, t->gc,
+ t->x - t->size, 0,
+ t->x - t->size, t->max_size);
+ XDrawLine (st->dpy, w, t->gc,
+ t->x + t->size, 0,
+ t->x + t->size, t->max_size);
+}
+
+static void
+draw_corners (struct state *st, Drawable w, struct throbber *t)
+{
+ int s = (t->size + t->thickness) / 2;
+ XPoint points[3];
+
+ if (t->y > s)
+ {
+ points[0].x = 0; points[0].y = t->y - s;
+ points[1].x = t->x - s; points[1].y = t->y - s;
+ points[2].x = t->x - s; points[2].y = 0;
+ XDrawLines (st->dpy, w, t->gc, points, countof(points), CoordModeOrigin);
+
+ points[0].x = t->x + s; points[0].y = 0;
+ points[1].x = t->x + s; points[1].y = t->y - s;
+ points[2].x = t->max_size; points[2].y = t->y - s;
+ XDrawLines (st->dpy, w, t->gc, points, countof(points), CoordModeOrigin);
+ }
+
+ if (t->x > s)
+ {
+ points[0].x = 0; points[0].y = t->y + s;
+ points[1].x = t->x - s; points[1].y = t->y + s;
+ points[2].x = t->x - s; points[2].y = t->max_size;
+ XDrawLines (st->dpy, w, t->gc, points, countof(points), CoordModeOrigin);
+
+ points[0].x = t->x + s; points[0].y = t->max_size;
+ points[1].x = t->x + s; points[1].y = t->y + s;
+ points[2].x = t->max_size; points[2].y = t->y + s;
+ XDrawLines (st->dpy, w, t->gc, points, countof(points), CoordModeOrigin);
+ }
+}
+
+
+static struct throbber *
+make_throbber (struct state *st, Drawable d, int w, int h, unsigned long pixel)
+{
+ XGCValues gcv;
+ unsigned long flags;
+ struct throbber *t = (struct throbber *) malloc (sizeof (*t));
+ t->x = w / 2;
+ t->y = h / 2;
+ t->max_size = (w > h ? w : h);
+ t->speed = get_integer_resource (st->dpy, "speed", "Speed");
+ t->fuse = 1 + (random() % 4);
+ t->thickness = get_integer_resource (st->dpy, "thickness", "Thickness");
+
+ if (st->xgwa.width > 2560) t->thickness *= 3; /* Retina displays */
+
+ if (t->speed < 0) t->speed = -t->speed;
+ t->speed += (((random() % t->speed) / 2) - (t->speed / 2));
+ if (t->speed > 0) t->speed = -t->speed;
+
+ flags = GCForeground;
+# ifndef HAVE_JWXYZ
+ if (st->transparent_p)
+ {
+ gcv.foreground = ~0L;
+ gcv.plane_mask = st->base_pixel | st->plane_masks[random() % st->nplanes];
+ flags |= GCPlaneMask;
+ }
+ else
+# endif /* !HAVE_JWXYZ */
+ {
+ gcv.foreground = pixel;
+ }
+
+ gcv.line_width = t->thickness;
+ gcv.cap_style = CapProjecting;
+ gcv.join_style = JoinMiter;
+
+ flags |= (GCLineWidth | GCCapStyle | GCJoinStyle);
+ t->gc = XCreateGC (st->dpy, d, flags, &gcv);
+
+# ifdef HAVE_JWXYZ
+ if (st->transparent_p)
+ {
+ /* give a non-opaque alpha to the color */
+ unsigned long pixel = gcv.foreground;
+ unsigned long amask = BlackPixelOfScreen (st->xgwa.screen);
+ unsigned long a = (0xCCCCCCCC & amask);
+ pixel = (pixel & (~amask)) | a;
+
+ jwxyz_XSetAlphaAllowed (st->dpy, t->gc, True);
+ XSetForeground (st->dpy, t->gc, pixel);
+ }
+# endif /* HAVE_JWXYZ */
+
+ switch (random() % 11) {
+ case 0: case 1: case 2: case 3: t->draw = draw_star; break;
+ case 4: case 5: case 6: case 7: t->draw = draw_circle; break;
+ case 8: t->draw = draw_hlines; break;
+ case 9: t->draw = draw_vlines; break;
+ case 10: t->draw = draw_corners; break;
+ default: abort(); break;
+ }
+
+ if (t->draw == draw_circle)
+ t->max_size *= 1.5;
+
+ if (random() % 4)
+ t->size = t->max_size;
+ else
+ t->size = t->thickness, t->speed = -t->speed;
+
+ return t;
+}
+
+static int
+throb (struct state *st, Drawable window, struct throbber *t)
+{
+ t->size += t->speed;
+ if (t->size <= (t->thickness / 2))
+ {
+ t->speed = -t->speed;
+ t->size += (t->speed * 2);
+ }
+ else if (t->size > t->max_size)
+ {
+ t->speed = -t->speed;
+ t->size += (t->speed * 2);
+ t->fuse--;
+ }
+
+ if (t->fuse <= 0)
+ {
+ XFreeGC (st->dpy, t->gc);
+ memset (t, 0, sizeof(*t));
+ free (t);
+ return -1;
+ }
+ else
+ {
+ t->draw (st, window, t);
+ return 0;
+ }
+}
+
+
+static void *
+deluxe_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ int i;
+ st->dpy = dpy;
+ st->window = window;
+ st->count = get_integer_resource (st->dpy, "count", "Integer");
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ st->ncolors = get_integer_resource (st->dpy, "ncolors", "Integer");
+ st->dbuf = get_boolean_resource (st->dpy, "doubleBuffer", "Boolean");
+
+# ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ st->dbeclear_p = get_boolean_resource (st->dpy, "useDBEClear", "Boolean");
+#endif
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ st->dbuf = False;
+# endif
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ st->transparent_p = get_boolean_resource(st->dpy, "transparent", "Transparent");
+
+ st->colors = (XColor *) calloc (sizeof(*st->colors), st->ncolors);
+
+ if (get_boolean_resource(st->dpy, "mono", "Boolean"))
+ {
+ MONO:
+ st->ncolors = 1;
+ st->colors[0].pixel = get_pixel_resource(st->dpy, st->xgwa.colormap,
+ "foreground", "Foreground");
+ }
+#ifndef HAVE_JWXYZ
+ else if (st->transparent_p)
+ {
+ st->nplanes = get_integer_resource (st->dpy, "planes", "Planes");
+ if (st->nplanes <= 0)
+ st->nplanes = (random() % (st->xgwa.depth-2)) + 2;
+
+ allocate_alpha_colors (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ &st->nplanes, True, &st->plane_masks,
+ &st->base_pixel);
+ if (st->nplanes <= 1)
+ {
+# if 0
+ fprintf (stderr,
+ "%s: couldn't allocate any color planes; turning transparency off.\n",
+ progname);
+# endif
+ st->transparent_p = False;
+ goto COLOR;
+ }
+ }
+#endif /* !HAVE_JWXYZ */
+ else
+ {
+#ifndef HAVE_JWXYZ
+ COLOR:
+#endif
+ make_random_colormap (st->xgwa.screen, st->xgwa.visual, st->xgwa.colormap,
+ st->colors, &st->ncolors, True, True, 0, True);
+ if (st->ncolors < 2)
+ goto MONO;
+ }
+
+ if (st->dbuf)
+ {
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (st->dbeclear_p)
+ st->b = xdbe_get_backbuffer (st->dpy, st->window, XdbeBackground);
+ else
+ st->b = xdbe_get_backbuffer (st->dpy, st->window, XdbeUndefined);
+ st->backb = st->b;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ if (!st->b)
+ {
+ st->ba = XCreatePixmap (st->dpy, st->window, st->xgwa.width, st->xgwa.height,st->xgwa.depth);
+ st->bb = XCreatePixmap (st->dpy, st->window, st->xgwa.width, st->xgwa.height,st->xgwa.depth);
+ st->b = st->ba;
+ }
+ }
+ else
+ {
+ st->b = st->window;
+ }
+
+ st->throbbers = (struct throbber **) calloc (st->count, sizeof(struct throbber *));
+ for (i = 0; i < st->count; i++)
+ st->throbbers[i] = make_throbber (st, st->b, st->xgwa.width, st->xgwa.height,
+ st->colors[random() % st->ncolors].pixel);
+
+ gcv.foreground = get_pixel_resource (st->dpy, st->xgwa.colormap,
+ "background", "Background");
+ st->erase_gc = XCreateGC (st->dpy, st->b, GCForeground, &gcv);
+
+ if (st->ba) XFillRectangle (st->dpy, st->ba, st->erase_gc, 0, 0, st->xgwa.width, st->xgwa.height);
+ if (st->bb) XFillRectangle (st->dpy, st->bb, st->erase_gc, 0, 0, st->xgwa.width, st->xgwa.height);
+
+ return st;
+}
+
+static unsigned long
+deluxe_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int i;
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (!st->dbeclear_p || !st->backb)
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ XFillRectangle (st->dpy, st->b, st->erase_gc, 0, 0, st->xgwa.width, st->xgwa.height);
+
+ for (i = 0; i < st->count; i++)
+ if (throb (st, st->b, st->throbbers[i]) < 0)
+ st->throbbers[i] = make_throbber (st, st->b, st->xgwa.width, st->xgwa.height,
+ st->colors[random() % st->ncolors].pixel);
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (st->backb)
+ {
+ XdbeSwapInfo info[1];
+ info[0].swap_window = st->window;
+ info[0].swap_action = (st->dbeclear_p ? XdbeBackground : XdbeUndefined);
+ XdbeSwapBuffers (st->dpy, info, 1);
+ }
+ else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ if (st->dbuf)
+ {
+ XCopyArea (st->dpy, st->b, st->window, st->erase_gc, 0, 0,
+ st->xgwa.width, st->xgwa.height, 0, 0);
+ st->b = (st->b == st->ba ? st->bb : st->ba);
+ }
+
+ return st->delay;
+}
+
+static void
+deluxe_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ if (! st->dbuf) { /* #### more complicated if we have a back buffer... */
+ int i;
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ XClearWindow (dpy, window);
+ for (i = 0; i < st->count; i++)
+ if (st->throbbers[i])
+ st->throbbers[i]->fuse = 0;
+ }
+}
+
+static Bool
+deluxe_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+deluxe_free (Display *dpy, Window window, void *closure)
+{
+}
+
+
+static const char *deluxe_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*delay: 10000",
+ "*count: 5",
+ "*thickness: 50",
+ "*speed: 15",
+ "*ncolors: 20",
+ "*transparent: True",
+ "*doubleBuffer: True",
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ "*useDBE: True",
+ "*useDBEClear: True",
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec deluxe_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-thickness", ".thickness", XrmoptionSepArg, 0 },
+ { "-count", ".count", XrmoptionSepArg, 0 },
+ { "-ncolors", ".ncolors", XrmoptionSepArg, 0 },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-transparent", ".transparent", XrmoptionNoArg, "True" },
+ { "-no-transparent", ".transparent", XrmoptionNoArg, "False" },
+ { "-opaque", ".transparent", XrmoptionNoArg, "False" },
+ { "-no-opaque", ".transparent", XrmoptionNoArg, "True" },
+ { "-db", ".doubleBuffer", XrmoptionNoArg, "True" },
+ { "-no-db", ".doubleBuffer", XrmoptionNoArg, "False" },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("Deluxe", deluxe)
diff --git a/hacks/deluxe.man b/hacks/deluxe.man
new file mode 100644
index 0000000..380e7e5
--- /dev/null
+++ b/hacks/deluxe.man
@@ -0,0 +1,72 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+deluxe - pulsing sequence of stars, circles, and lines.
+.SH SYNOPSIS
+.B deluxe
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-thickness \fInumber\fP]
+[\-count \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-transparent]
+[\-no-db]
+[\-fps]
+.SH DESCRIPTION
+This draws a pulsing sequence of stars, circles, and lines.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 5000 (0.01 seconds.).
+.TP 8
+.B \-thickness \fInumber\fP
+Thickness of lines. Default: 50.
+.TP 8
+.B \-count \fInumber\fP
+Number of objects. Default: 5.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of colors. Default: 20.
+.TP 8
+.B \-transparent | \-no-transparent
+Whether to use transparency.
+.TP 8
+.B \-db | \-no-db
+Whether to double buffer.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/demon.c b/hacks/demon.c
new file mode 100644
index 0000000..0fff863
--- /dev/null
+++ b/hacks/demon.c
@@ -0,0 +1,952 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* demon --- David Griffeath's cellular automata */
+
+#if 0
+static const char sccsid[] = "@(#)demon.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1995 by David Bagley.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 10-May-1997: Compatible with xscreensaver
+ * 16-Apr-1997: -neighbors 3, 9 (not sound mathematically), 12, and 8 added
+ * 30-May-1996: Ron Hitchens <ron@idiom.com>
+ * Fixed memory management that caused leaks
+ * 14-Apr-1996: -neighbors 6 runtime-time option added
+ * 21-Aug-1995: Coded from A.K. Dewdney's "Computer Recreations", Scientific
+ * American Magazine" Aug 1989 pp 102-105. Also very similar
+ * to hodgepodge machine described in A.K. Dewdney's "Computer
+ * Recreations", Scientific American Magazine" Aug 1988
+ * pp 104-107. Also used life.c as a guide.
+ */
+
+/*-
+ * A cellular universe of 4 phases debris, droplets, defects, and demons.
+ */
+
+/*-
+ Grid Number of Neighbors
+ ---- ------------------
+ Square 4 or 8
+ Hexagon 6
+ Triangle 3, 9, or 12
+*/
+
+#ifndef HAVE_JWXYZ
+# define DO_STIPPLE
+#endif
+
+#ifdef STANDALONE
+# define MODE_demon
+# define DEFAULTS "*delay: 50000 \n" \
+ "*count: 0 \n" \
+ "*cycles: 1000 \n" \
+ "*size: -30 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n" \
+
+# define UNIFORM_COLORS
+# define release_demon 0
+# define reshape_demon 0
+# define demon_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+#include "automata.h"
+
+#ifdef MODE_demon
+
+/*-
+ * neighbors of 0 randomizes it between 3, 4, 6, 8, 9, and 12.
+ */
+#define DEF_NEIGHBORS "0" /* choose random value */
+
+static int neighbors;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-neighbors", ".demon.neighbors", XrmoptionSepArg, 0}
+};
+
+static argtype vars[] =
+{
+ {&neighbors, "neighbors", "Neighbors", DEF_NEIGHBORS, t_Int}
+};
+static OptionStruct desc[] =
+{
+ {"-neighbors num", "squares 4 or 8, hexagons 6, triangles 3, 9 or 12"}
+};
+
+ENTRYPOINT ModeSpecOpt demon_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct demon_description =
+{"demon", "init_demon", "draw_demon", (char *) NULL,
+ "refresh_demon", "init_demon", "free_demon", &demon_opts,
+ 50000, 0, 1000, -7, 64, 1.0, "",
+ "Shows Griffeath's cellular automata", 0, NULL};
+
+#endif
+
+#define DEMONBITS(n,w,h)\
+ if ((dp->pixmaps[dp->init_bits]=\
+ XCreatePixmapFromBitmapData(MI_DISPLAY(mi),window,(char *)n,w,h,1,0,1))==None){\
+ free_demon(mi); return;} else {dp->init_bits++;}
+
+#define REDRAWSTEP 2000 /* How many cells to draw per cycle */
+#define MINSTATES 2
+#define MINGRIDSIZE 5
+#define MINSIZE 4
+#define NEIGHBORKINDS 6
+
+/* Singly linked list */
+typedef struct _CellList {
+ XPoint pt;
+ struct _CellList *next;
+} CellList;
+
+typedef struct {
+ int generation;
+ int xs, ys;
+ int xb, yb;
+ int nrows, ncols;
+ int width, height;
+ int states;
+ int state;
+ int redrawing, redrawpos;
+ int *ncells;
+ CellList **cellList;
+ unsigned char *oldcell, *newcell;
+ int neighbors;
+ int init_bits;
+ GC stippledGC;
+ Pixmap pixmaps[NUMSTIPPLES - 1];
+ union {
+ XPoint hexagon[6];
+ XPoint triangle[2][3];
+ } shape;
+} demonstruct;
+
+static char plots[2][NEIGHBORKINDS] =
+{
+ {3, 4, 6, 8, 9, 12}, /* Neighborhoods */
+ {12, 16, 18, 20, 22, 24} /* Number of states */
+};
+
+static demonstruct *demons = (demonstruct *) NULL;
+
+static void
+drawcell(ModeInfo * mi, int col, int row, unsigned char state)
+{
+ demonstruct *dp = &demons[MI_SCREEN(mi)];
+ GC gc;
+
+ if (!state) {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ gc = MI_GC(mi);
+ } else if (MI_NPIXELS(mi) >= NUMSTIPPLES) {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
+ MI_PIXEL(mi, (((int) state - 1) * MI_NPIXELS(mi) /
+ (dp->states - 1)) % MI_NPIXELS(mi)));
+ gc = MI_GC(mi);
+ } else {
+ XGCValues gcv;
+#ifdef DO_STIPPLE
+ gcv.stipple = dp->pixmaps[(state - 1) % (NUMSTIPPLES - 1)];
+#endif /* DO_STIPPLE */
+ gcv.foreground = MI_WHITE_PIXEL(mi);
+ gcv.background = MI_BLACK_PIXEL(mi);
+ XChangeGC(MI_DISPLAY(mi), dp->stippledGC,
+ GCStipple | GCForeground | GCBackground, &gcv);
+ gc = dp->stippledGC;
+ }
+ if (dp->neighbors == 6) {
+ int ccol = 2 * col + !(row & 1), crow = 2 * row;
+
+ dp->shape.hexagon[0].x = dp->xb + ccol * dp->xs;
+ dp->shape.hexagon[0].y = dp->yb + crow * dp->ys;
+ if (dp->xs == 1 && dp->ys == 1)
+ XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi),
+ gc, dp->shape.hexagon[0].x, dp->shape.hexagon[0].y);
+ else
+ XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ dp->shape.hexagon, 6, Convex, CoordModePrevious);
+ } else if (dp->neighbors == 4 || dp->neighbors == 8) {
+ XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ dp->xb + dp->xs * col, dp->yb + dp->ys * row,
+ dp->xs - (dp->xs > 3), dp->ys - (dp->ys > 3));
+ } else { /* TRI */
+ int orient = (col + row) % 2; /* O left 1 right */
+
+ dp->shape.triangle[orient][0].x = dp->xb + col * dp->xs;
+ dp->shape.triangle[orient][0].y = dp->yb + row * dp->ys;
+ if (dp->xs <= 3 || dp->ys <= 3)
+ XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ ((orient) ? -1 : 1) + dp->shape.triangle[orient][0].x,
+ dp->shape.triangle[orient][0].y);
+ else {
+ if (orient)
+ dp->shape.triangle[orient][0].x += (dp->xs / 2 - 1);
+ else
+ dp->shape.triangle[orient][0].x -= (dp->xs / 2 - 1);
+ XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ dp->shape.triangle[orient], 3, Convex, CoordModePrevious);
+
+ }
+ }
+}
+
+static Bool
+addtolist(ModeInfo * mi, int col, int row, unsigned char state)
+{
+ demonstruct *dp = &demons[MI_SCREEN(mi)];
+ CellList *current;
+
+ current = dp->cellList[state];
+ if ((dp->cellList[state] = (CellList *)
+ malloc(sizeof (CellList))) == NULL) {
+ return False;
+ }
+ dp->cellList[state]->pt.x = col;
+ dp->cellList[state]->pt.y = row;
+ dp->cellList[state]->next = current;
+ dp->ncells[state]++;
+ return True;
+}
+
+
+static void
+free_state(demonstruct * dp, int state)
+{
+ CellList *current;
+
+ while (dp->cellList[state]) {
+ current = dp->cellList[state];
+ dp->cellList[state] = dp->cellList[state]->next;
+ (void) free((void *) current);
+ }
+ dp->cellList[state] = (CellList *) NULL;
+ if (dp->ncells != NULL)
+ dp->ncells[state] = 0;
+}
+
+
+static void
+free_list(demonstruct * dp)
+{
+ int state;
+
+ for (state = 0; state < dp->states; state++)
+ free_state(dp, state);
+ (void) free((void *) dp->cellList);
+ dp->cellList = (CellList **) NULL;
+}
+
+static void
+free_struct(demonstruct * dp)
+{
+ if (dp->cellList != NULL) {
+ free_list(dp);
+ }
+ if (dp->ncells != NULL) {
+ (void) free((void *) dp->ncells);
+ dp->ncells = (int *) NULL;
+ }
+ if (dp->oldcell != NULL) {
+ (void) free((void *) dp->oldcell);
+ dp->oldcell = (unsigned char *) NULL;
+ }
+ if (dp->newcell != NULL) {
+ (void) free((void *) dp->newcell);
+ dp->newcell = (unsigned char *) NULL;
+ }
+}
+
+ENTRYPOINT void
+free_demon(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ demonstruct *dp = &demons[MI_SCREEN(mi)];
+ int shade;
+
+ if (dp->stippledGC != None) {
+ XFreeGC(display, dp->stippledGC);
+ dp->stippledGC = None;
+ }
+ for (shade = 0; shade < dp->init_bits; shade++) {
+ XFreePixmap(display, dp->pixmaps[shade]);
+ }
+ dp->init_bits = 0;
+ free_struct(dp);
+}
+
+static Bool
+draw_state(ModeInfo * mi, int state)
+{
+ demonstruct *dp = &demons[MI_SCREEN(mi)];
+ GC gc;
+ XRectangle *rects;
+ CellList *current;
+
+ if (!state) {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ gc = MI_GC(mi);
+ } else if (MI_NPIXELS(mi) >= NUMSTIPPLES) {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
+ MI_PIXEL(mi, (((int) state - 1) * MI_NPIXELS(mi) /
+ (dp->states - 1)) % MI_NPIXELS(mi)));
+ gc = MI_GC(mi);
+ } else {
+ XGCValues gcv;
+
+#ifdef DO_STIPPLE
+ gcv.stipple = dp->pixmaps[(state - 1) % (NUMSTIPPLES - 1)];
+#endif /* DO_STIPPLE */
+ gcv.foreground = MI_WHITE_PIXEL(mi);
+ gcv.background = MI_BLACK_PIXEL(mi);
+ XChangeGC(MI_DISPLAY(mi), dp->stippledGC,
+ GCStipple | GCForeground | GCBackground, &gcv);
+ gc = dp->stippledGC;
+ }
+ if (dp->neighbors == 6) { /* Draw right away, slow */
+ current = dp->cellList[state];
+ while (current) {
+ int col, row, ccol, crow;
+
+ col = current->pt.x;
+ row = current->pt.y;
+ ccol = 2 * col + !(row & 1), crow = 2 * row;
+ dp->shape.hexagon[0].x = dp->xb + ccol * dp->xs;
+ dp->shape.hexagon[0].y = dp->yb + crow * dp->ys;
+ if (dp->xs == 1 && dp->ys == 1)
+ XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi),
+ gc, dp->shape.hexagon[0].x, dp->shape.hexagon[0].y);
+ else
+ XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ dp->shape.hexagon, 6, Convex, CoordModePrevious);
+ current = current->next;
+ }
+ } else if (dp->neighbors == 4 || dp->neighbors == 8) {
+ /* Take advantage of XDrawRectangles */
+ int ncells = 0;
+
+ /* Create Rectangle list from part of the cellList */
+ if ((rects = (XRectangle *) malloc(dp->ncells[state] *
+ sizeof (XRectangle))) == NULL) {
+ return False;
+ }
+ current = dp->cellList[state];
+ while (current) {
+ rects[ncells].x = dp->xb + current->pt.x * dp->xs;
+ rects[ncells].y = dp->yb + current->pt.y * dp->ys;
+ rects[ncells].width = dp->xs - (dp->xs > 3);
+ rects[ncells].height = dp->ys - (dp->ys > 3);
+ current = current->next;
+ ncells++;
+ }
+ /* Finally get to draw */
+ XFillRectangles(MI_DISPLAY(mi), MI_WINDOW(mi), gc, rects, ncells);
+ /* Free up rects list and the appropriate part of the cellList */
+ (void) free((void *) rects);
+ } else { /* TRI */
+ current = dp->cellList[state];
+ while (current) {
+ int col, row, orient;
+
+ col = current->pt.x;
+ row = current->pt.y;
+ orient = (col + row) % 2; /* O left 1 right */
+ dp->shape.triangle[orient][0].x = dp->xb + col * dp->xs;
+ dp->shape.triangle[orient][0].y = dp->yb + row * dp->ys;
+ if (dp->xs <= 3 || dp->ys <= 3)
+ XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ ((orient) ? -1 : 1) + dp->shape.triangle[orient][0].x,
+ dp->shape.triangle[orient][0].y);
+ else {
+ if (orient)
+ dp->shape.triangle[orient][0].x += (dp->xs / 2 - 1);
+ else
+ dp->shape.triangle[orient][0].x -= (dp->xs / 2 - 1);
+ XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+ dp->shape.triangle[orient], 3, Convex, CoordModePrevious);
+ }
+ current = current->next;
+ }
+ }
+ free_state(dp, state);
+ return True;
+}
+
+static void
+RandomSoup(ModeInfo * mi)
+{
+ demonstruct *dp = &demons[MI_SCREEN(mi)];
+ int row, col, mrow = 0;
+
+ for (row = 0; row < dp->nrows; ++row) {
+ for (col = 0; col < dp->ncols; ++col) {
+ dp->oldcell[col + mrow] =
+ (unsigned char) LRAND() % ((unsigned char) dp->states);
+ if (!addtolist(mi, col, row, dp->oldcell[col + mrow]))
+ return; /* sparse soup */
+ }
+ mrow += dp->ncols;
+ }
+}
+
+ENTRYPOINT void
+init_demon (ModeInfo * mi)
+{
+ int size = MI_SIZE(mi), nk;
+ demonstruct *dp;
+
+ MI_INIT (mi, demons);
+ dp = &demons[MI_SCREEN(mi)];
+
+ if (MI_WIDTH(mi) < 100 || MI_HEIGHT(mi) < 100) /* tiny window */
+ size = MIN(MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ dp->generation = 0;
+ dp->redrawing = 0;
+#ifdef DO_STIPPLE
+ if (MI_NPIXELS(mi) < NUMSTIPPLES) {
+ Window window = MI_WINDOW(mi);
+ if (dp->stippledGC == None) {
+ XGCValues gcv;
+
+ gcv.fill_style = FillOpaqueStippled;
+ if ((dp->stippledGC = XCreateGC(MI_DISPLAY(mi), window,
+ GCFillStyle, &gcv)) == None) {
+ free_demon(mi);
+ return;
+ }
+ }
+ if (dp->init_bits == 0) {
+ int i;
+
+ for (i = 1; i < NUMSTIPPLES; i++) {
+ DEMONBITS(stipples[i], STIPPLESIZE, STIPPLESIZE);
+ }
+ }
+ }
+#endif /* DO_STIPPLE */
+ free_struct(dp);
+
+#ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (MI_DISPLAY(mi), MI_GC(mi), False);
+#endif
+
+ for (nk = 0; nk < NEIGHBORKINDS; nk++) {
+ if (neighbors == plots[0][nk]) {
+ dp->neighbors = plots[0][nk];
+ break;
+ }
+ if (nk == NEIGHBORKINDS - 1) {
+ nk = NRAND(NEIGHBORKINDS);
+ dp->neighbors = plots[0][nk];
+ break;
+ }
+ }
+
+ dp->states = MI_COUNT(mi);
+ if (dp->states < -MINSTATES)
+ dp->states = NRAND(-dp->states - MINSTATES + 1) + MINSTATES;
+ else if (dp->states < MINSTATES)
+ dp->states = plots[1][nk];
+ if ((dp->cellList = (CellList **) calloc(dp->states,
+ sizeof (CellList *))) == NULL) {
+ free_demon(mi);
+ return;
+ }
+ if ((dp->ncells = (int *) calloc(dp->states, sizeof (int))) == NULL) {
+ free_demon(mi);
+ return;
+ }
+
+ dp->state = 0;
+
+ dp->width = MI_WIDTH(mi);
+ dp->height = MI_HEIGHT(mi);
+
+ if (dp->neighbors == 6) {
+ int nccols, ncrows, i;
+
+ if (dp->width < 8)
+ dp->width = 8;
+ if (dp->height < 8)
+ dp->height = 8;
+ if (size < -MINSIZE)
+ dp->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(dp->width, dp->height) /
+ MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
+ else if (size < MINSIZE) {
+ if (!size)
+ dp->ys = MAX(MINSIZE, MIN(dp->width, dp->height) / MINGRIDSIZE);
+ else
+ dp->ys = MINSIZE;
+ } else
+ dp->ys = MIN(size, MAX(MINSIZE, MIN(dp->width, dp->height) /
+ MINGRIDSIZE));
+ dp->xs = dp->ys;
+ nccols = MAX(dp->width / dp->xs - 2, 2);
+ ncrows = MAX(dp->height / dp->ys - 1, 4);
+ dp->ncols = nccols / 2;
+ dp->nrows = 2 * (ncrows / 4);
+ dp->xb = (dp->width - dp->xs * nccols) / 2 + dp->xs / 2;
+ dp->yb = (dp->height - dp->ys * (ncrows / 2) * 2) / 2 + dp->ys - 2;
+ for (i = 0; i < 6; i++) {
+ dp->shape.hexagon[i].x = (dp->xs - 1) * hexagonUnit[i].x;
+ dp->shape.hexagon[i].y = ((dp->ys - 1) * hexagonUnit[i].y / 2) * 4 / 3;
+ }
+ } else if (dp->neighbors == 4 || dp->neighbors == 8) {
+ if (size < -MINSIZE)
+ dp->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(dp->width, dp->height) /
+ MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
+ else if (size < MINSIZE) {
+ if (!size)
+ dp->ys = MAX(MINSIZE, MIN(dp->width, dp->height) / MINGRIDSIZE);
+ else
+ dp->ys = MINSIZE;
+ } else
+ dp->ys = MIN(size, MAX(MINSIZE, MIN(dp->width, dp->height) /
+ MINGRIDSIZE));
+ dp->xs = dp->ys;
+ dp->ncols = MAX(dp->width / dp->xs, 2);
+ dp->nrows = MAX(dp->height / dp->ys, 2);
+ dp->xb = (dp->width - dp->xs * dp->ncols) / 2;
+ dp->yb = (dp->height - dp->ys * dp->nrows) / 2;
+ } else { /* TRI */
+ int orient, i;
+
+ if (dp->width < 2)
+ dp->width = 2;
+ if (dp->height < 2)
+ dp->height = 2;
+ if (size < -MINSIZE)
+ dp->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(dp->width, dp->height) /
+ MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
+ else if (size < MINSIZE) {
+ if (!size)
+ dp->ys = MAX(MINSIZE, MIN(dp->width, dp->height) / MINGRIDSIZE);
+ else
+ dp->ys = MINSIZE;
+ } else
+ dp->ys = MIN(size, MAX(MINSIZE, MIN(dp->width, dp->height) /
+ MINGRIDSIZE));
+ dp->xs = (int) (1.52 * dp->ys);
+ dp->ncols = (MAX(dp->width / dp->xs - 1, 2) / 2) * 2;
+ dp->nrows = (MAX(dp->height / dp->ys - 1, 2) / 2) * 2;
+ dp->xb = (dp->width - dp->xs * dp->ncols) / 2 + dp->xs / 2;
+ dp->yb = (dp->height - dp->ys * dp->nrows) / 2 + dp->ys / 2;
+ for (orient = 0; orient < 2; orient++) {
+ for (i = 0; i < 3; i++) {
+ dp->shape.triangle[orient][i].x =
+ (dp->xs - 2) * triangleUnit[orient][i].x;
+ dp->shape.triangle[orient][i].y =
+ (dp->ys - 2) * triangleUnit[orient][i].y;
+ }
+ }
+ }
+
+ MI_CLEARWINDOW(mi);
+
+ if ((dp->oldcell = (unsigned char *)
+ malloc(dp->ncols * dp->nrows * sizeof (unsigned char))) == NULL) {
+ free_demon(mi);
+ return;
+ }
+
+ if ((dp->newcell = (unsigned char *)
+ malloc(dp->ncols * dp->nrows * sizeof (unsigned char))) == NULL) {
+ free_demon(mi);
+ return;
+ }
+
+ RandomSoup(mi);
+}
+
+ENTRYPOINT void
+draw_demon (ModeInfo * mi)
+{
+ int i, j, k, l, mj = 0, ml;
+ demonstruct *dp;
+
+ if (demons == NULL)
+ return;
+ dp = &demons[MI_SCREEN(mi)];
+ if (dp->cellList == NULL)
+ return;
+
+ MI_IS_DRAWN(mi) = True;
+ if (dp->state >= dp->states) {
+ (void) memcpy((char *) dp->newcell, (char *) dp->oldcell,
+ dp->ncols * dp->nrows * sizeof (unsigned char));
+
+ if (dp->neighbors == 6) {
+ for (j = 0; j < dp->nrows; j++) {
+ for (i = 0; i < dp->ncols; i++) {
+ /* NE */
+ if (!(j & 1))
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ else
+ k = i;
+ l = (!j) ? dp->nrows - 1 : j - 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* E */
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ ml = mj;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* SE */
+ if (!(j & 1))
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ else
+ k = i;
+ l = (j + 1 == dp->nrows) ? 0 : j + 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* SW */
+ if (j & 1)
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ else
+ k = i;
+ l = (j + 1 == dp->nrows) ? 0 : j + 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* W */
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ ml = mj;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* NW */
+ if (j & 1)
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ else
+ k = i;
+ l = (!j) ? dp->nrows - 1 : j - 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ }
+ mj += dp->ncols;
+ }
+ } else if (dp->neighbors == 4 || dp->neighbors == 8) {
+ for (j = 0; j < dp->nrows; j++) {
+ for (i = 0; i < dp->ncols; i++) {
+ /* N */
+ k = i;
+ l = (!j) ? dp->nrows - 1 : j - 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* E */
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ ml = mj;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* S */
+ k = i;
+ l = (j + 1 == dp->nrows) ? 0 : j + 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* W */
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ /*l = j;*/
+ ml = mj;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ }
+ mj += dp->ncols;
+ }
+ if (dp->neighbors == 8) {
+ mj = 0;
+ for (j = 0; j < dp->nrows; j++) {
+ for (i = 0; i < dp->ncols; i++) {
+ /* NE */
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ l = (!j) ? dp->nrows - 1 : j - 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* SE */
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ l = (j + 1 == dp->nrows) ? 0 : j + 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* SW */
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ l = (j + 1 == dp->nrows) ? 0 : j + 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* NW */
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ l = (!j) ? dp->nrows - 1 : j - 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ }
+ mj += dp->ncols;
+ }
+ }
+ } else if (dp->neighbors == 3 || dp->neighbors == 9 ||
+ dp->neighbors == 12) {
+ for (j = 0; j < dp->nrows; j++) {
+ for (i = 0; i < dp->ncols; i++) {
+ if ((i + j) % 2) { /* right */
+ /* W */
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ ml = mj;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ } else { /* left */
+ /* E */
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ ml = mj;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ }
+ /* N */
+ k = i;
+ l = (!j) ? dp->nrows - 1 : j - 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* S */
+ k = i;
+ l = (j + 1 == dp->nrows) ? 0 : j + 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ }
+ mj += dp->ncols;
+ }
+ if (dp->neighbors == 9 || dp->neighbors == 12) {
+ mj = 0;
+ for (j = 0; j < dp->nrows; j++) {
+ for (i = 0; i < dp->ncols; i++) {
+ /* NN */
+ k = i;
+ if (!j)
+ l = dp->nrows - 2;
+ else if (!(j - 1))
+ l = dp->nrows - 1;
+ else
+ l = j - 2;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* SS */
+ k = i;
+ if (j + 1 == dp->nrows)
+ l = 1;
+ else if (j + 2 == dp->nrows)
+ l = 0;
+ else
+ l = j + 2;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* NW */
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ l = (!j) ? dp->nrows - 1 : j - 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* NE */
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ l = (!j) ? dp->nrows - 1 : j - 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* SW */
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ l = (j + 1 == dp->nrows) ? 0 : j + 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* SE */
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ l = (j + 1 == dp->nrows) ? 0 : j + 1;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ }
+ mj += dp->ncols;
+ }
+ if (dp->neighbors == 12) {
+ mj = 0;
+ for (j = 0; j < dp->nrows; j++) {
+ for (i = 0; i < dp->ncols; i++) {
+ if ((i + j) % 2) { /* right */
+ /* NNW */
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ if (!j)
+ l = dp->nrows - 2;
+ else if (!(j - 1))
+ l = dp->nrows - 1;
+ else
+ l = j - 2;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* SSW */
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ if (j + 1 == dp->nrows)
+ l = 1;
+ else if (j + 2 == dp->nrows)
+ l = 0;
+ else
+ l = j + 2;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* EE */
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ /*l = j;*/
+ ml = mj;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ } else { /* left */
+ /* NNE */
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ if (!j)
+ l = dp->nrows - 2;
+ else if (!(j - 1))
+ l = dp->nrows - 1;
+ else
+ l = j - 2;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* SSE */
+ k = (i + 1 == dp->ncols) ? 0 : i + 1;
+ if (j + 1 == dp->nrows)
+ l = 1;
+ else if (j + 2 == dp->nrows)
+ l = 0;
+ else
+ l = j + 2;
+ ml = l * dp->ncols;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ /* WW */
+ k = (!i) ? dp->ncols - 1 : i - 1;
+ /*l = j;*/
+ ml = mj;
+ if (dp->oldcell[k + ml] ==
+ (int) (dp->oldcell[i + mj] + 1) % dp->states)
+ dp->newcell[i + mj] = dp->oldcell[k + ml];
+ }
+ }
+ mj += dp->ncols;
+ }
+ }
+ }
+ }
+ mj = 0;
+ for (j = 0; j < dp->nrows; j++) {
+ for (i = 0; i < dp->ncols; i++)
+ if (dp->oldcell[i + mj] != dp->newcell[i + mj]) {
+ dp->oldcell[i + mj] = dp->newcell[i + mj];
+ if (!addtolist(mi, i, j, dp->oldcell[i + mj])) {
+ free_demon(mi);
+ return;
+ }
+ }
+ mj += dp->ncols;
+ }
+ if (++dp->generation > MI_CYCLES(mi))
+ init_demon(mi);
+ dp->state = 0;
+ } else {
+ if (dp->ncells[dp->state])
+ if (!draw_state(mi, dp->state)) {
+ free_demon(mi);
+ return;
+ }
+ dp->state++;
+ }
+ if (dp->redrawing) {
+ for (i = 0; i < REDRAWSTEP; i++) {
+ if (dp->oldcell[dp->redrawpos]) {
+ drawcell(mi, dp->redrawpos % dp->ncols, dp->redrawpos / dp->ncols,
+ dp->oldcell[dp->redrawpos]);
+ }
+ if (++(dp->redrawpos) >= dp->ncols * dp->nrows) {
+ dp->redrawing = 0;
+ break;
+ }
+ }
+ }
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_demon (ModeInfo * mi)
+{
+ demonstruct *dp;
+
+ if (demons == NULL)
+ return;
+ dp = &demons[MI_SCREEN(mi)];
+
+ dp->redrawing = 1;
+ dp->redrawpos = 0;
+}
+#endif
+
+XSCREENSAVER_MODULE ("Demon", demon)
+
+#endif /* MODE_demon */
diff --git a/hacks/demon.man b/hacks/demon.man
new file mode 100644
index 0000000..43481bc
--- /dev/null
+++ b/hacks/demon.man
@@ -0,0 +1,69 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+demon - cellular automaton.
+.SH SYNOPSIS
+.B demon
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-size \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+A cellular automaton that starts with a random field, and organizes it into
+stripes and spirals.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+States. 0 - 20. Default: 0.
+.TP 8
+.B \-cycles \fInumber\fP
+Timeout. 0 - 800000. Default: 1000.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 50000 (0.05 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 64.
+.TP 8
+.B \-size \fInumber\fP
+Cell Size. -20 - 20. Default: -7.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by David Bagley. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+David Bagley.
diff --git a/hacks/discrete.c b/hacks/discrete.c
new file mode 100644
index 0000000..bfb4459
--- /dev/null
+++ b/hacks/discrete.c
@@ -0,0 +1,440 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* discrete --- chaotic mappings */
+
+#if 0
+static const char sccsid[] = "@(#)discrete.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1996 by Tim Auckland <tda10.geo@yahoo.com>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * "discrete" shows a number of fractals based on the "discrete map"
+ * type of dynamical systems. They include a different way of looking
+ * at the HOPALONG system, an inverse julia-set iteration, the "Standard
+ * Map" and the "Bird in a Thornbush" fractal.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 31-Jul-1997: Ported to xlockmore-4
+ * 08-Aug-1996: Adapted from hop.c Copyright (c) 1991 by Patrick J. Naughton.
+ */
+
+#ifdef STANDALONE
+# define MODE_discrete
+#define DEFAULTS "*delay: 20000 \n" \
+ "*count: 4096 \n" \
+ "*cycles: 2500 \n" \
+ "*ncolors: 100 \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n" \
+ "*lowrez: True \n" \
+
+# define SMOOTH_COLORS
+# define release_discrete 0
+# define discrete_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_discrete
+
+ENTRYPOINT ModeSpecOpt discrete_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+
+#ifdef USE_MODULES
+ModStruct discrete_description =
+{"discrete", "init_discrete", "draw_discrete", (char *) NULL,
+ "refresh_discrete", "init_discrete", "free_discrete", &discrete_opts,
+ 1000, 4096, 2500, 1, 64, 1.0, "",
+ "Shows various discrete maps", 0, NULL};
+
+#endif
+
+enum ftypes {
+ SQRT, BIRDIE, STANDARD, TRIG, CUBIC, HENON, AILUJ, HSHOE, DELOG
+};
+
+/*#define TEST STANDARD */
+
+#define BIASES 18
+static enum ftypes bias[BIASES] =
+{
+ STANDARD, STANDARD, STANDARD, STANDARD,
+ SQRT, SQRT, SQRT, SQRT,
+ BIRDIE, BIRDIE, BIRDIE,
+ AILUJ, AILUJ, AILUJ,
+ TRIG, TRIG,
+ CUBIC,
+ HENON,
+};
+
+typedef struct {
+ int maxx;
+ int maxy; /* max of the screen */
+ double a;
+ double b;
+ double c;
+ double d;
+ double e;
+ double i;
+ double j; /* discrete parameters */
+ double ic;
+ double jc;
+ double is;
+ double js;
+ int inc;
+ int pix;
+ enum ftypes op;
+ int count;
+ XPoint *pointBuffer; /* pointer for XDrawPoints */
+
+ int sqrt_sign, std_sign;
+
+} discretestruct;
+
+static discretestruct *discretes = (discretestruct *) NULL;
+
+ENTRYPOINT void
+init_discrete (ModeInfo * mi)
+{
+ double range;
+ discretestruct *hp;
+
+ MI_INIT (mi, discretes);
+ hp = &discretes[MI_SCREEN(mi)];
+
+ hp->maxx = MI_WIDTH(mi);
+ hp->maxy = MI_HEIGHT(mi);
+#ifdef TEST
+ hp->op = TEST;
+#else
+ hp->op = bias[LRAND() % BIASES];
+#endif
+ switch (hp->op) {
+ case HSHOE:
+ hp->ic = 0;
+ hp->jc = 0;
+ hp->is = hp->maxx / (4);
+ hp->js = hp->maxy / (4);
+ hp->a = 0.5;
+ hp->b = 0.5;
+ hp->c = 0.2;
+ hp->d = -1.25;
+ hp->e = 1;
+ hp->i = hp->j = 0.0;
+ break;
+ case DELOG:
+ hp->ic = 0.5;
+ hp->jc = 0.3;
+ hp->is = hp->maxx / 1.5;
+ hp->js = hp->maxy / 1.5;
+ hp->a = 2.176399;
+ hp->i = hp->j = 0.01;
+ break;
+ case HENON:
+ hp->jc = ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.4;
+ hp->ic = 1.3 * (1 - (hp->jc * hp->jc) / (0.4 * 0.4));
+ hp->is = hp->maxx;
+ hp->js = hp->maxy * 1.5;
+ hp->a = 1;
+ hp->b = 1.4;
+ hp->c = 0.3;
+ hp->i = hp->j = 0;
+ break;
+ case SQRT:
+ hp->ic = 0;
+ hp->jc = 0;
+ hp->is = 1;
+ hp->js = 1;
+ range = sqrt((double) hp->maxx * 2 * hp->maxx * 2 +
+ (double) hp->maxy * 2 * hp->maxy * 2) /
+ (10.0 + LRAND() % 10);
+
+ hp->a = (LRAND() / MAXRAND) * range - range / 2.0;
+ hp->b = (LRAND() / MAXRAND) * range - range / 2.0;
+ hp->c = (LRAND() / MAXRAND) * range - range / 2.0;
+ if (!(LRAND() % 2))
+ hp->c = 0.0;
+ hp->i = hp->j = 0.0;
+ break;
+ case STANDARD:
+ hp->ic = M_PI;
+ hp->jc = M_PI;
+ hp->is = hp->maxx / (M_PI * 2);
+ hp->js = hp->maxy / (M_PI * 2);
+ hp->a = 0; /* decay */
+ hp->b = (LRAND() / MAXRAND) * 2.0;
+ hp->c = 0;
+ hp->i = M_PI;
+ hp->j = M_PI;
+ break;
+ case BIRDIE:
+ hp->ic = 0;
+ hp->jc = 0;
+ hp->is = hp->maxx / 2;
+ hp->js = hp->maxy / 2;
+ hp->a = 1.99 + ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.2;
+ hp->b = 0;
+ hp->c = 0.8 + ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.1;
+ hp->i = hp->j = 0;
+ break;
+ case TRIG:
+ hp->a = 5;
+ hp->b = 0.5 + ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.3;
+ hp->ic = hp->a;
+ hp->jc = 0;
+ hp->is = hp->maxx / (hp->b * 20);
+ hp->js = hp->maxy / (hp->b * 20);
+ hp->i = hp->j = 0;
+ break;
+ case CUBIC:
+ hp->a = 2.77;
+ hp->b = 0.1 + ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.1;
+ hp->ic = 0;
+ hp->jc = 0;
+ hp->is = hp->maxx / 4;
+ hp->js = hp->maxy / 4;
+ hp->i = hp->j = 0.1;
+ break;
+ case AILUJ:
+ {
+ int i;
+ double x, y, xn, yn;
+
+ hp->ic = 0;
+ hp->jc = 0;
+ hp->is = hp->maxx / 4;
+ hp->js = hp->maxx / 4;
+ do {
+ hp->a = ((LRAND() / MAXRAND) * 2.0 - 1.0) * 1.5 - 0.5;
+ hp->b = ((LRAND() / MAXRAND) * 2.0 - 1.0) * 1.5;
+ x = y = 0;
+#define MAXITER 10
+ for (i = 0; i < MAXITER && x * x + y * y < 13; i++) { /* 'Brot calc */
+ xn = x * x - y * y + hp->a;
+ yn = 2 * x * y + hp->b;
+ x = xn;
+ y = yn;
+ }
+ } while (i < MAXITER); /* wait for a connected set */
+ hp->i = hp->j = 0.1;
+ break;
+ }
+ }
+ hp->pix = 0;
+ hp->inc = 0;
+
+ if (hp->pointBuffer == NULL) {
+ hp->pointBuffer = (XPoint *) malloc(sizeof (XPoint) * MI_COUNT(mi));
+ /* if fails will check later */
+ }
+
+ /* Clear the background. */
+ MI_CLEARWINDOW(mi);
+
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+ hp->count = 0;
+ hp->sqrt_sign = 1;
+ hp->std_sign = 1;
+}
+
+
+static void
+draw_discrete_1 (ModeInfo * mi)
+{
+ Display *dsp = MI_DISPLAY(mi);
+ Window win = MI_WINDOW(mi);
+ double oldj, oldi;
+ int count = MI_COUNT(mi);
+ int cycles = MI_CYCLES(mi);
+ int k;
+ XPoint *xp;
+ GC gc = MI_GC(mi);
+ discretestruct *hp;
+
+ if (discretes == NULL)
+ return;
+ hp = &discretes[MI_SCREEN(mi)];
+ if (hp->pointBuffer == NULL)
+ return;
+
+ k = count;
+ xp = hp->pointBuffer;
+
+ hp->inc++;
+
+ MI_IS_DRAWN(mi) = True;
+
+ if (MI_NPIXELS(mi) > 2) {
+ XSetForeground(dsp, gc, MI_PIXEL(mi, hp->pix));
+ if (++hp->pix >= MI_NPIXELS(mi))
+ hp->pix = 0;
+ }
+ while (k--) {
+ oldj = hp->j;
+ oldi = hp->i;
+ switch (hp->op) {
+ case HSHOE:
+ {
+ int i;
+
+#if 0
+ if (!k) {
+ XSetForeground(dsp, gc, MI_BLACK_PIXEL(mi));
+ XFillRectangle(dsp, win, gc, 0, 0, hp->maxx, hp->maxy);
+ XSetForeground(dsp, gc, MI_PIXEL(mi, hp->pix));
+ } else
+#endif
+#define HD
+#ifdef HD
+ if (k < count / 4) {
+ hp->i = ((double) k / count) * 8 - 1;
+ hp->j = 1;
+ } else if (k < count / 2) {
+ hp->i = 1;
+ hp->j = 3 - ((double) k / count) * 8;
+ } else if (k < 3 * count / 4) {
+ hp->i = 5 - ((double) k / count) * 8;
+ hp->j = -1;
+ } else {
+ hp->i = -1;
+ hp->j = ((double) k / count) * 8 - 7;
+ }
+ for (i = 1; i < (hp->inc % 15); i++) {
+ oldj = hp->j;
+ oldi = hp->i;
+#endif
+ hp->i = (hp->a * oldi + hp->b) * oldj;
+ hp->j = (hp->e - hp->d + hp->c * oldi) * oldj * oldj - hp->c * oldi + hp->d;
+#ifdef HD
+ }
+#endif
+ break;
+ }
+ case DELOG:
+ hp->j = oldi;
+ hp->i = hp->a * oldi * (1 - oldj);
+ break;
+ case HENON:
+ hp->i = oldj + hp->a - hp->b * oldi * oldi;
+ hp->j = hp->c * oldi;
+ break;
+ case SQRT:
+ if (k) {
+ hp->j = hp->a + hp->i;
+ hp->i = -oldj + (hp->i < 0
+ ? sqrt(fabs(hp->b * (hp->i - hp->c)))
+ : -sqrt(fabs(hp->b * (hp->i - hp->c))));
+ } else {
+ hp->i = (hp->sqrt_sign ? 1 : -1) * hp->inc * hp->maxx / cycles / 2;
+ hp->j = hp->a + hp->i;
+ hp->sqrt_sign = !hp->sqrt_sign;
+ }
+ break;
+ case STANDARD:
+ if (k) {
+ hp->j = (1 - hp->a) * oldj + hp->b * sin(oldi) + hp->a * hp->c;
+ hp->j = fmod(hp->j + 2 * M_PI, 2 * M_PI);
+ hp->i = oldi + hp->j;
+ hp->i = fmod(hp->i + 2 * M_PI, 2 * M_PI);
+ } else {
+ hp->j = M_PI + fmod((hp->std_sign ? 1 : -1) * hp->inc * 2 * M_PI / (cycles - 0.5), M_PI);
+ hp->i = M_PI;
+ hp->std_sign = !hp->std_sign;
+ }
+ break;
+ case BIRDIE:
+ hp->j = oldi;
+ hp->i = (1 - hp->c) * cos(M_PI * hp->a * oldj) + hp->c * hp->b;
+ hp->b = oldj;
+ break;
+ case TRIG:
+ {
+ double r2 = oldi * oldi + oldj * oldj;
+
+ hp->i = hp->a + hp->b * (oldi * cos(r2) - oldj * sin(r2));
+ hp->j = hp->b * (oldj * cos(r2) + oldi * sin(r2));
+ }
+ break;
+ case CUBIC:
+ hp->i = oldj;
+ hp->j = hp->a * oldj - oldj * oldj * oldj - hp->b * oldi;
+ break;
+ case AILUJ:
+ hp->i = ((LRAND() < MAXRAND / 2) ? -1 : 1) *
+ sqrt(((oldi - hp->a) +
+ sqrt((oldi - hp->a) * (oldi - hp->a) + (oldj - hp->b) * (oldj - hp->b))) / 2);
+ if (hp->i < 0.00000001 && hp->i > -0.00000001)
+ hp->i = (hp->i > 0.0) ? 0.00000001 : -0.00000001;
+ hp->j = (oldj - hp->b) / (2 * hp->i);
+ break;
+ }
+ xp->x = hp->maxx / 2 + (int) ((hp->i - hp->ic) * hp->is);
+ xp->y = hp->maxy / 2 - (int) ((hp->j - hp->jc) * hp->js);
+ xp++;
+ }
+ XDrawPoints(dsp, win, gc, hp->pointBuffer, count, CoordModeOrigin);
+}
+
+ENTRYPOINT void
+draw_discrete (ModeInfo * mi)
+{
+ discretestruct *hp = &discretes[MI_SCREEN(mi)];
+ int cycles = MI_CYCLES(mi);
+ int i;
+
+ for (i = 0; i < 10; i++) {
+ draw_discrete_1 (mi);
+ hp->count++;
+ }
+
+ if (hp->count > cycles) {
+ init_discrete(mi);
+ }
+}
+
+
+ENTRYPOINT void
+reshape_discrete(ModeInfo * mi, int width, int height)
+{
+ discretestruct *hp = &discretes[MI_SCREEN(mi)];
+ hp->maxx = width;
+ hp->maxy = height;
+ XClearWindow (MI_DISPLAY (mi), MI_WINDOW(mi));
+}
+
+ENTRYPOINT void
+free_discrete(ModeInfo * mi)
+{
+ discretestruct *hp = &discretes[MI_SCREEN(mi)];
+
+ if (hp->pointBuffer != NULL) {
+ (void) free((void *) hp->pointBuffer);
+ /* hp->pointBuffer = NULL; */
+ }
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_discrete(ModeInfo * mi)
+{
+ MI_CLEARWINDOW(mi);
+}
+#endif
+
+XSCREENSAVER_MODULE ("Discrete", discrete)
+
+#endif /* MODE_discrete */
diff --git a/hacks/discrete.man b/hacks/discrete.man
new file mode 100644
index 0000000..63e1787
--- /dev/null
+++ b/hacks/discrete.man
@@ -0,0 +1,61 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+discrete - discrete map iterative function fractal systems.
+.SH SYNOPSIS
+.B discrete
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+More ``discrete map'' systems, including new variants of Hopalong and
+Julia, and a few others.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-cycles \fInumber\fP
+Timeout. 100 - 10000. Default: 2500.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 1000 (0.001 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 100.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Tim Auckland. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Tim Auckland.
diff --git a/hacks/distort.c b/hacks/distort.c
new file mode 100644
index 0000000..ba81279
--- /dev/null
+++ b/hacks/distort.c
@@ -0,0 +1,864 @@
+/* -*- mode: C; tab-width: 4 -*-
+ * xscreensaver, Copyright (c) 1992-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* distort
+ * by Jonas Munsin (jmunsin@iki.fi) and Jamie Zawinski <jwz@jwz.org>
+ * TODO:
+ * -check the allocations in init_round_lense again, maybe make it possible again
+ * to use swamp without pre-allocating/calculating (although that
+ * makes it slower) - -swamp is memory hungry
+ * -more distortion matrices (fortunately, I'm out of ideas :)
+ * Stuff that would be cool but probably too much of a resource hog:
+ * -some kind of interpolation to avoid jaggies
+ * -large speed values leaves the image distorted
+ * program idea borrowed from a screensaver on a non-*NIX OS,
+ *
+ * 28 Sep 1999 Jonas Munsin (jmunsin@iki.fi)
+ * Added about 10x faster algortim for 8, 16 and 32 bpp (modifies pixels
+ * directly avoiding costly XPutPixle(XGetPixel()) calls, inspired by
+ * xwhirl made by horvai@clipper.ens.fr (Peter Horvai) and the XFree86
+ * Xlib sources.
+ * This piece of code is really horrible, but it works, and at the moment
+ * I don't have time or inspiration to fix something that works (knock
+ * on wood).
+ * 08 Oct 1999 Jonas Munsin (jmunsin@iki.fi)
+ * Corrected several bugs causing references beyond allocated memory.
+ * 09 Oct 2016 Dave Odell (dmo2118@gmail.com)
+ * Updated for new xshm.c.
+ */
+
+#include <math.h>
+#include <time.h>
+#include "screenhack.h"
+/*#include <X11/Xmd.h>*/
+# include "xshm.h"
+
+#define CARD32 unsigned int
+#define CARD16 unsigned short
+#define CARD8 unsigned char
+
+
+struct coo {
+ int x;
+ int y;
+ int r, r_change;
+ int xmove, ymove;
+};
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ struct coo xy_coo[10];
+
+ int delay, radius, speed, number, blackhole, vortex, magnify, reflect, slow;
+ int duration;
+ time_t start_time;
+
+ XWindowAttributes xgwa;
+ GC gc;
+ unsigned long black_pixel;
+
+ XImage *orig_map, *buffer_map;
+ unsigned long *buffer_map_cache;
+
+ int ***from;
+ int ****from_array;
+ int *fast_from;
+
+ int bpp_size;
+
+ XShmSegmentInfo shm_info;
+
+ void (*effect) (struct state *, int);
+ void (*draw) (struct state *, int);
+ void (*draw_routine) (struct state *st, XImage *, XImage *, int, int, int *);
+
+ async_load_state *img_loader;
+ Pixmap pm;
+};
+
+
+static void move_lense(struct state *, int);
+static void swamp_thing(struct state *, int);
+static void new_rnd_coo(struct state *, int);
+static void init_round_lense(struct state *st);
+static void reflect_draw(struct state *, int);
+static void plain_draw(struct state *, int);
+
+static void fast_draw_8 (struct state *st, XImage *, XImage *, int, int, int *);
+static void fast_draw_16(struct state *st, XImage *, XImage *, int, int, int *);
+static void fast_draw_32(struct state *st, XImage *, XImage *, int, int, int *);
+static void generic_draw(struct state *st, XImage *, XImage *, int, int, int *);
+
+
+static void distort_finish_loading (struct state *);
+
+static void
+distort_reset (struct state *st)
+{
+ char *s;
+ int i;
+
+ st->start_time = 0;
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ st->delay = get_integer_resource(st->dpy, "delay", "Integer");
+ st->duration = get_integer_resource (st->dpy, "duration", "Seconds");
+ st->radius = get_integer_resource(st->dpy, "radius", "Integer");
+ st->speed = get_integer_resource(st->dpy, "speed", "Integer");
+ st->number = get_integer_resource(st->dpy, "number", "Integer");
+
+ st->blackhole = get_boolean_resource(st->dpy, "blackhole", "Boolean");
+ st->vortex = get_boolean_resource(st->dpy, "vortex", "Boolean");
+ st->magnify = get_boolean_resource(st->dpy, "magnify", "Boolean");
+ st->reflect = get_boolean_resource(st->dpy, "reflect", "Boolean");
+ st->slow = get_boolean_resource(st->dpy, "slow", "Boolean");
+
+ if (st->xgwa.width > 2560) st->radius *= 3; /* Retina displays */
+
+ if (st->delay < 0) st->delay = 0;
+ if (st->duration < 1) st->duration = 1;
+
+ st->effect = NULL;
+ s = get_string_resource(st->dpy, "effect", "String");
+ if (s && !strcasecmp(s,"swamp"))
+ st->effect = &swamp_thing;
+ else if (s && !strcasecmp(s,"bounce"))
+ st->effect = &move_lense;
+ else if (s && !strcasecmp(s,"none"))
+ ;
+ else if (s && *s)
+ fprintf(stderr,"%s: bogus effect: %s\n", progname, s);
+
+ if (st->effect == NULL && st->radius == 0 && st->speed == 0 && st->number == 0
+ && !st->blackhole && !st->vortex && !st->magnify && !st->reflect) {
+/* if no cmdline options are given, randomly choose one of:
+ * -radius 125 -number 4 -speed 1 -bounce
+ * -radius 125 -number 4 -speed 1 -blackhole
+ * -radius 125 -number 4 -speed 1 -vortex
+ * -radius 125 -number 4 -speed 1 -vortex -magnify
+ * -radius 125 -number 4 -speed 1 -vortex -magnify -blackhole
+ * -radius 250 -number 1 -speed 2 -bounce
+ * -radius 250 -number 1 -speed 2 -blackhole
+ * -radius 250 -number 1 -speed 2 -vortex
+ * -radius 250 -number 1 -speed 2 -vortex -magnify
+ * -radius 250 -number 1 -speed 2 -vortex -magnify -blackhole
+ * -radius 80 -number 1 -speed 2 -reflect
+ * -radius 125 -number 3 -speed 2 -reflect
+ * jwz: not these
+ * -radius 125 -number 4 -speed 2 -swamp
+ * -radius 125 -number 4 -speed 2 -swamp -blackhole
+ * -radius 125 -number 4 -speed 2 -swamp -vortex
+ * -radius 125 -number 4 -speed 2 -swamp -vortex -magnify
+ * -radius 125 -number 4 -speed 2 -swamp -vortex -magnify -blackhole
+ */
+
+ i = (random() % 12 /* 17 */);
+
+ st->draw = &plain_draw;
+
+ switch (i) {
+ case 0:
+ st->radius=125;st->number=4;st->speed=1;
+ st->effect=&move_lense;break;
+ case 1:
+ st->radius=125;st->number=4;st->speed=1;st->blackhole=1;
+ st->effect=&move_lense;break;
+ case 2:
+ st->radius=125;st->number=4;st->speed=1;st->vortex=1;
+ st->effect=&move_lense;break;
+ case 3:
+ st->radius=125;st->number=4;st->speed=1;st->vortex=1;st->magnify=1;
+ st->effect=&move_lense;break;
+ case 4:
+ st->radius=125;st->number=4;st->speed=1;st->vortex=1;st->magnify=1;st->blackhole=1;
+ st->effect=&move_lense;break;
+ case 5:
+ st->radius=250;st->number=1;st->speed=2;
+ st->effect=&move_lense;break;
+ case 6:
+ st->radius=250;st->number=1;st->speed=2;st->blackhole=1;
+ st->effect=&move_lense;break;
+ case 7:
+ st->radius=250;st->number=1;st->speed=2;st->vortex=1;
+ st->effect=&move_lense;break;
+ case 8:
+ st->radius=250;st->number=1;st->speed=2;st->vortex=1;st->magnify=1;
+ st->effect=&move_lense;break;
+ case 9:
+ st->radius=250;st->number=1;st->speed=2;st->vortex=1;st->magnify=1;st->blackhole=1;
+ st->effect=&move_lense;break;
+
+ case 10:
+ st->radius=80;st->number=1;st->speed=2;st->reflect=1;
+ st->draw = &reflect_draw;st->effect = &move_lense;break;
+ case 11:
+ st->radius=125;st->number=4;st->speed=2;st->reflect=1;
+ st->draw = &reflect_draw;st->effect = &move_lense;break;
+
+#if 0 /* jwz: not these */
+ case 12:
+ st->radius=125;st->number=4;st->speed=2;
+ effect=&swamp_thing;break;
+ case 13:
+ st->radius=125;st->number=4;st->speed=2;st->blackhole=1;
+ effect=&swamp_thing;break;
+ case 14:
+ st->radius=125;st->number=4;st->speed=2;st->vortex=1;
+ effect=&swamp_thing;break;
+ case 15:
+ st->radius=125;st->number=4;st->speed=2;st->vortex=1;st->magnify=1;
+ effect=&swamp_thing;break;
+ case 16:
+ st->radius=125;st->number=4;st->speed=2;st->vortex=1;st->magnify=1;st->blackhole=1;
+ effect=&swamp_thing;break;
+#endif
+
+ default:
+ abort(); break;
+ }
+ }
+
+ /* never allow the radius to be too close to the min window dimension
+ */
+ if (st->radius > st->xgwa.width * 0.3) st->radius = st->xgwa.width * 0.3;
+ if (st->radius > st->xgwa.height * 0.3) st->radius = st->xgwa.height * 0.3;
+
+
+ /* -swamp mode consumes vast amounts of memory, proportional to radius --
+ so throttle radius to a small-ish value (60 => ~30MB.)
+ */
+ if (st->effect == &swamp_thing && st->radius > 60)
+ st->radius = 60;
+
+ if (st->delay < 0)
+ st->delay = 0;
+ if (st->radius <= 0)
+ st->radius = 60;
+ if (st->speed <= 0)
+ st->speed = 2;
+ if (st->number <= 0)
+ st->number=1;
+ if (st->number >= 10)
+ st->number=1;
+ if (st->effect == NULL)
+ st->effect = &move_lense;
+ if (st->reflect) {
+ st->draw = &reflect_draw;
+ st->effect = &move_lense;
+ }
+ if (st->draw == NULL)
+ st->draw = &plain_draw;
+}
+
+static void *
+distort_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ long gcflags;
+
+ st->dpy = dpy;
+ st->window = window;
+
+ distort_reset (st);
+
+ st->black_pixel = BlackPixelOfScreen( st->xgwa.screen );
+
+ gcv.function = GXcopy;
+ gcv.subwindow_mode = IncludeInferiors;
+ gcflags = GCFunction;
+ if (use_subwindow_mode_p(st->xgwa.screen, st->window)) /* see grabscreen.c */
+ gcflags |= GCSubwindowMode;
+ st->gc = XCreateGC (st->dpy, st->window, gcflags, &gcv);
+
+ /* On MacOS X11, XGetImage on a Window often gets an inexplicable BadMatch,
+ possibly due to the window manager having occluded something? It seems
+ nondeterministic. Loading the image into a pixmap instead fixes it. */
+ if (st->pm) XFreePixmap (st->dpy, st->pm);
+ st->pm = XCreatePixmap (st->dpy, st->window,
+ st->xgwa.width, st->xgwa.height, st->xgwa.depth);
+
+ st->img_loader = load_image_async_simple (0, st->xgwa.screen, st->window,
+ st->pm, 0, 0);
+ st->start_time = time ((time_t *) 0);
+ return st;
+}
+
+static void
+distort_finish_loading (struct state *st)
+{
+ int i;
+
+ st->start_time = time ((time_t *) 0);
+
+ if (! st->pm) abort();
+ XClearWindow (st->dpy, st->window);
+ XCopyArea (st->dpy, st->pm, st->window, st->gc,
+ 0, 0, st->xgwa.width, st->xgwa.height, 0, 0);
+ st->orig_map = XGetImage(st->dpy, st->pm, 0, 0,
+ st->xgwa.width, st->xgwa.height,
+ ~0L, ZPixmap);
+ st->buffer_map_cache = malloc(sizeof(unsigned long)*(2*st->radius+st->speed+2)*(2*st->radius+st->speed+2));
+
+ if (st->buffer_map_cache == NULL) {
+ perror("distort");
+ exit(EXIT_FAILURE);
+ }
+
+ st->buffer_map = create_xshm_image(st->dpy, st->xgwa.visual, st->orig_map->depth,
+ ZPixmap, &st->shm_info,
+ 2*st->radius + st->speed + 2,
+ 2*st->radius + st->speed + 2);
+
+ if ((st->buffer_map->byte_order == st->orig_map->byte_order)
+ && (st->buffer_map->depth == st->orig_map->depth)
+ && (st->buffer_map->format == ZPixmap)
+ && (st->orig_map->format == ZPixmap)
+ && !st->slow) {
+ switch (st->orig_map->bits_per_pixel) {
+ case 32:
+ st->draw_routine = &fast_draw_32;
+ st->bpp_size = sizeof(CARD32);
+ break;
+ case 16:
+ st->draw_routine = &fast_draw_16;
+ st->bpp_size = sizeof(CARD16);
+ break;
+ case 8:
+ st->draw_routine = &fast_draw_8;
+ st->bpp_size = sizeof(CARD8);
+ break;
+ default:
+ st->draw_routine = &generic_draw;
+ break;
+ }
+ } else {
+ st->draw_routine = &generic_draw;
+ }
+ init_round_lense(st);
+
+ for (i = 0; i < st->number; i++) {
+ new_rnd_coo(st,i);
+ if (st->number != 1)
+ st->xy_coo[i].r = (i*st->radius)/(st->number-1); /* "randomize" initial */
+ else
+ st->xy_coo[i].r = 0;
+ st->xy_coo[i].r_change = st->speed + (i%2)*2*(-st->speed); /* values a bit */
+ st->xy_coo[i].xmove = st->speed + (i%2)*2*(-st->speed);
+ st->xy_coo[i].ymove = st->speed + (i%2)*2*(-st->speed);
+ }
+}
+
+/* example: initializes a "see-trough" matrix */
+/* static void make_null_lense(struct state *st)
+{
+ int i, j;
+ for (i = 0; i < 2*radius+speed+2; i++) {
+ for (j = 0 ; j < 2*radius+speed+2 ; j++) {
+ from[i][j][0]=i;
+ from[i][j][1]=j;
+ }
+ }
+}
+*/
+static void convert(struct state *st)
+{
+ int *p;
+ int i, j;
+ st->fast_from = calloc(1, sizeof(int)*((st->buffer_map->bytes_per_line/st->bpp_size)*(2*st->radius+st->speed+2) + 2*st->radius+st->speed+2));
+ if (st->fast_from == NULL) {
+ perror("distort");
+ exit(EXIT_FAILURE);
+ }
+ p = st->fast_from;
+ for (i = 0; i < 2*st->radius+st->speed+2; i++) {
+ for (j = 0; j < 2*st->radius+st->speed+2; j++) {
+ *(p + i + j*st->buffer_map->bytes_per_line/st->bpp_size)
+ = st->from[i][j][0] + st->xgwa.width*st->from[i][j][1];
+ if (*(p + i + j*st->buffer_map->bytes_per_line/st->bpp_size) < 0
+ || *(p + i + j*st->buffer_map->bytes_per_line/st->bpp_size) >= st->orig_map->height*st->orig_map->width) {
+ *(p + i + j*st->buffer_map->bytes_per_line/st->bpp_size) = 0;
+ }
+ }
+ }
+}
+
+/* makes a lense with the Radius=loop and centred in
+ * the point (radius, radius)
+ */
+static void make_round_lense(struct state *st, int radius, int loop)
+{
+ int i, j;
+
+ for (i = 0; i < 2*radius+st->speed+2; i++) {
+ for(j = 0; j < ((0 == st->bpp_size) ? (2*radius+st->speed+2) : (st->buffer_map->bytes_per_line/st->bpp_size)); j++) {
+ double r, d;
+ r = sqrt ((i-radius)*(i-radius)+(j-radius)*(j-radius));
+ if (loop == 0)
+ d=0.0;
+ else
+ d=r/loop;
+
+ if (r < loop-1) {
+
+ if (st->vortex) { /* vortex-twist effect */
+ double angle;
+ /* this one-line formula for getting a nice rotation angle is borrowed
+ * (with permission) from the whirl plugin for gimp,
+ * Copyright (C) 1996 Federico Mena Quintero
+ */
+ /* 5 is just a constant used because it looks good :) */
+ angle = 5*(1-d)*(1-d);
+
+ /* Avoid atan2: DOMAIN error message */
+ if ((radius-j) == 0.0 && (radius-i) == 0.0) {
+ st->from[i][j][0] = radius + cos(angle)*r;
+ st->from[i][j][1] = radius + sin(angle)*r;
+ } else {
+ st->from[i][j][0] = radius +
+ cos(angle - atan2(radius-j, -(radius-i)))*r;
+ st->from[i][j][1] = radius +
+ sin(angle - atan2(radius-j, -(radius-i)))*r;
+ }
+ if (st->magnify) {
+ r = sin(d*M_PI_2);
+ if (st->blackhole && r != 0) /* blackhole effect */
+ r = 1/r;
+ st->from[i][j][0] = radius + (st->from[i][j][0]-radius)*r;
+ st->from[i][j][1] = radius + (st->from[i][j][1]-radius)*r;
+ }
+ } else { /* default is to magnify */
+ r = sin(d*M_PI_2);
+
+ /* raising r to different power here gives different amounts of
+ * distortion, a negative value sucks everything into a black hole
+ */
+ /* r = r*r; */
+ if (st->blackhole && r != 0) /* blackhole effect */
+ r = 1/r;
+ /* bubble effect (and blackhole) */
+ st->from[i][j][0] = radius + (i-radius)*r;
+ st->from[i][j][1] = radius + (j-radius)*r;
+ }
+ } else { /* not inside loop */
+ st->from[i][j][0] = i;
+ st->from[i][j][1] = j;
+ }
+ }
+ }
+
+ /* this is really just a quick hack to keep both the compability mode with all depths and still
+ * allow the custom optimized draw routines with the minimum amount of work */
+ if (0 != st->bpp_size) {
+ convert(st);
+ }
+}
+
+#ifndef EXIT_FAILURE
+# define EXIT_FAILURE -1
+#endif
+
+static void allocate_lense(struct state *st)
+{
+ int i, j;
+ int s = ((0 != st->bpp_size) ? (st->buffer_map->bytes_per_line/st->bpp_size) : (2*st->radius+st->speed+2));
+ /* maybe this should be redone so that from[][][] is in one block;
+ * then pointers could be used instead of arrays in some places (and
+ * maybe give a speedup - maybe also consume less memory)
+ */
+ st->from = (int ***)malloc(s*sizeof(int **));
+ if (st->from == NULL) {
+ perror("distort");
+ exit(EXIT_FAILURE);
+ }
+ for (i = 0; i < s; i++) {
+ st->from[i] = (int **)malloc((2*st->radius+st->speed+2) * sizeof(int *));
+ if (st->from[i] == NULL) {
+ perror("distort");
+ exit(EXIT_FAILURE);
+ }
+ for (j = 0; j < s; j++) {
+ st->from[i][j] = (int *)malloc(2 * sizeof(int));
+ if (st->from[i][j] == NULL) {
+ perror("distort");
+ exit(EXIT_FAILURE);
+ }
+ }
+ }
+}
+
+/* from_array in an array containing precalculated from matrices,
+ * this is a double faced mem vs speed trade, it's faster, but eats
+ * _a lot_ of mem for large radius (is there a bug here? I can't see it)
+ */
+static void init_round_lense(struct state *st)
+{
+ int k;
+
+ if (st->effect == &swamp_thing) {
+ st->from_array = (int ****)malloc((st->radius+1)*sizeof(int ***));
+ for (k=0; k <= st->radius; k++) {
+ allocate_lense(st);
+ make_round_lense(st, st->radius, k);
+ st->from_array[k] = st->from;
+ }
+ } else { /* just allocate one from[][][] */
+ allocate_lense(st);
+ make_round_lense(st, st->radius,st->radius);
+ }
+}
+
+/* If fast_draw_8, fast_draw_16 or fast_draw_32 are to be used, the following properties
+ * of the src and dest XImages must hold (otherwise the generic, slooow, method provided
+ * by X is to be used):
+ * src->byte_order == dest->byte_order
+ * src->format == ZPixmap && dest->format == ZPixmap
+ * src->depth == dest->depth == the depth the function in question asumes
+ * x and y is the coordinates in src from where to cut out the image from,
+ * distort_matrix is a precalculated array of how to distort the matrix
+ */
+
+static void fast_draw_8(struct state *st, XImage *src, XImage *dest, int x, int y, int *distort_matrix)
+{
+ CARD8 *u = (CARD8 *)dest->data;
+ CARD8 *t = (CARD8 *)src->data + x + y*src->bytes_per_line/sizeof(CARD8);
+
+ while (u < (CARD8 *)(dest->data + sizeof(CARD8)*dest->height
+ *dest->bytes_per_line/sizeof(CARD8))) {
+ *u++ = t[*distort_matrix++];
+ }
+}
+
+static void fast_draw_16(struct state *st, XImage *src, XImage *dest, int x, int y, int *distort_matrix)
+{
+ CARD16 *u = (CARD16 *)dest->data;
+ CARD16 *t = (CARD16 *)src->data + x + y*src->bytes_per_line/sizeof(CARD16);
+
+ while (u < (CARD16 *)(dest->data + sizeof(CARD16)*dest->height
+ *dest->bytes_per_line/sizeof(CARD16))) {
+ *u++ = t[*distort_matrix++];
+ }
+}
+
+static void fast_draw_32(struct state *st, XImage *src, XImage *dest, int x, int y, int *distort_matrix)
+{
+ CARD32 *u = (CARD32 *)dest->data;
+ CARD32 *t = (CARD32 *)src->data + x + y*src->bytes_per_line/sizeof(CARD32);
+
+ while (u < (CARD32 *)(dest->data + sizeof(CARD32)*dest->height
+ *dest->bytes_per_line/sizeof(CARD32))) {
+ *u++ = t[*distort_matrix++];
+ }
+}
+
+static void generic_draw(struct state *st, XImage *src, XImage *dest, int x, int y, int *distort_matrix)
+{
+ int i, j;
+ for (i = 0; i < dest->width; i++)
+ for (j = 0; j < dest->height; j++)
+ if (st->from[i][j][0] + x >= 0 &&
+ st->from[i][j][0] + x < src->width &&
+ st->from[i][j][1] + y >= 0 &&
+ st->from[i][j][1] + y < src->height)
+ XPutPixel(dest, i, j,
+ XGetPixel(src,
+ st->from[i][j][0] + x,
+ st->from[i][j][1] + y));
+}
+
+/* generate an XImage of from[][][] and draw it on the screen */
+static void plain_draw(struct state *st, int k)
+{
+ if (st->xy_coo[k].x+2*st->radius+st->speed+2 > st->orig_map->width ||
+ st->xy_coo[k].y+2*st->radius+st->speed+2 > st->orig_map->height)
+ return;
+
+ st->draw_routine(st, st->orig_map, st->buffer_map, st->xy_coo[k].x, st->xy_coo[k].y, st->fast_from);
+
+ put_xshm_image(st->dpy, st->window, st->gc, st->buffer_map, 0, 0, st->xy_coo[k].x, st->xy_coo[k].y,
+ 2*st->radius+st->speed+2, 2*st->radius+st->speed+2, &st->shm_info);
+}
+
+
+/* generate an XImage from the reflect algoritm submitted by
+ * Randy Zack <randy@acucorp.com>
+ * draw really got too big and ugly so I split it up
+ * it should be possible to use the from[][] to speed it up
+ * (once I figure out the algorithm used :)
+ */
+static void reflect_draw(struct state *st, int k)
+{
+ int i, j;
+ int cx, cy;
+ int ly, lysq, lx, ny, dist, rsq = st->radius * st->radius;
+
+ cx = cy = st->radius;
+ if (st->xy_coo[k].ymove > 0)
+ cy += st->speed;
+ if (st->xy_coo[k].xmove > 0)
+ cx += st->speed;
+
+ for(i = 0 ; i < 2*st->radius+st->speed+2; i++) {
+ ly = i - cy;
+ lysq = ly * ly;
+ ny = st->xy_coo[k].y + i;
+ if (ny >= st->orig_map->height) ny = st->orig_map->height-1;
+ for(j = 0 ; j < 2*st->radius+st->speed+2 ; j++) {
+ lx = j - cx;
+ dist = lx * lx + lysq;
+ if (dist > rsq ||
+ ly < -st->radius || ly > st->radius ||
+ lx < -st->radius || lx > st->radius)
+ XPutPixel( st->buffer_map, j, i,
+ XGetPixel( st->orig_map, st->xy_coo[k].x + j, ny ));
+ else if (dist == 0)
+ XPutPixel( st->buffer_map, j, i, st->black_pixel );
+ else {
+ int x = st->xy_coo[k].x + cx + (lx * rsq / dist);
+ int y = st->xy_coo[k].y + cy + (ly * rsq / dist);
+ if (x < 0 || x >= st->xgwa.width ||
+ y < 0 || y >= st->xgwa.height)
+ XPutPixel( st->buffer_map, j, i, st->black_pixel );
+ else
+ XPutPixel( st->buffer_map, j, i,
+ XGetPixel( st->orig_map, x, y ));
+ }
+ }
+ }
+
+ XPutImage(st->dpy, st->window, st->gc, st->buffer_map, 0, 0, st->xy_coo[k].x, st->xy_coo[k].y,
+ 2*st->radius+st->speed+2, 2*st->radius+st->speed+2);
+}
+
+/* create a new, random coordinate, that won't interfer with any other
+ * coordinates, as the drawing routines would be significantly slowed
+ * down if they were to handle serveral layers of distortions
+ */
+static void new_rnd_coo(struct state *st, int k)
+{
+ int i;
+ int loop = 0;
+
+ st->xy_coo[k].x = (random() % (st->xgwa.width-2*st->radius));
+ st->xy_coo[k].y = (random() % (st->xgwa.height-2*st->radius));
+
+ for (i = 0; i < st->number; i++) {
+ if (i != k) {
+ if ((abs(st->xy_coo[k].x - st->xy_coo[i].x) <= 2*st->radius+st->speed+2)
+ && (abs(st->xy_coo[k].y - st->xy_coo[i].y) <= 2*st->radius+st->speed+2)) {
+ st->xy_coo[k].x = (random() % (st->xgwa.width-2*st->radius));
+ st->xy_coo[k].y = (random() % (st->xgwa.height-2*st->radius));
+ i=-1; /* ugly */
+ }
+ }
+ if (loop++ > 1000) return; /* let's not get stuck */
+ }
+}
+
+/* move lens and handle bounces with walls and other lenses */
+static void move_lense(struct state *st, int k)
+{
+ int i;
+
+ if (st->xy_coo[k].x + 2*st->radius + st->speed + 2 >= st->xgwa.width)
+ st->xy_coo[k].xmove = -abs(st->xy_coo[k].xmove);
+ if (st->xy_coo[k].x <= st->speed)
+ st->xy_coo[k].xmove = abs(st->xy_coo[k].xmove);
+ if (st->xy_coo[k].y + 2*st->radius + st->speed + 2 >= st->xgwa.height)
+ st->xy_coo[k].ymove = -abs(st->xy_coo[k].ymove);
+ if (st->xy_coo[k].y <= st->speed)
+ st->xy_coo[k].ymove = abs(st->xy_coo[k].ymove);
+
+ st->xy_coo[k].x = st->xy_coo[k].x + st->xy_coo[k].xmove;
+ st->xy_coo[k].y = st->xy_coo[k].y + st->xy_coo[k].ymove;
+
+ /* bounce against othe lenses */
+ for (i = 0; i < st->number; i++) {
+ if ((i != k)
+
+/* This commented test is for rectangular lenses (not currently used) and
+ * the one used is for circular ones
+ && (abs(xy_coo[k].x - xy_coo[i].x) <= 2*radius)
+ && (abs(xy_coo[k].y - xy_coo[i].y) <= 2*radius)) { */
+
+ && ((st->xy_coo[k].x - st->xy_coo[i].x)*(st->xy_coo[k].x - st->xy_coo[i].x)
+ + (st->xy_coo[k].y - st->xy_coo[i].y)*(st->xy_coo[k].y - st->xy_coo[i].y)
+ <= 2*st->radius*2*st->radius)) {
+
+ int x, y;
+ x = st->xy_coo[k].xmove;
+ y = st->xy_coo[k].ymove;
+ st->xy_coo[k].xmove = st->xy_coo[i].xmove;
+ st->xy_coo[k].ymove = st->xy_coo[i].ymove;
+ st->xy_coo[i].xmove = x;
+ st->xy_coo[i].ymove = y;
+ }
+ }
+
+}
+
+/* make xy_coo[k] grow/shrink */
+static void swamp_thing(struct state *st, int k)
+{
+ if (st->xy_coo[k].r >= st->radius)
+ st->xy_coo[k].r_change = -abs(st->xy_coo[k].r_change);
+
+ if (st->xy_coo[k].r <= 0) {
+ st->from = st->from_array[0];
+ st->draw(st,k);
+ st->xy_coo[k].r_change = abs(st->xy_coo[k].r_change);
+ new_rnd_coo(st,k);
+ st->xy_coo[k].r=st->xy_coo[k].r_change;
+ return;
+ }
+
+ st->xy_coo[k].r = st->xy_coo[k].r + st->xy_coo[k].r_change;
+
+ if (st->xy_coo[k].r >= st->radius)
+ st->xy_coo[k].r = st->radius;
+ if (st->xy_coo[k].r <= 0)
+ st->xy_coo[k].r=0;
+
+ st->from = st->from_array[st->xy_coo[k].r];
+}
+
+
+static unsigned long
+distort_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int k;
+
+ if (st->img_loader) /* still loading */
+ {
+ st->img_loader = load_image_async_simple (st->img_loader, 0, 0, 0, 0, 0);
+ if (! st->img_loader) { /* just finished */
+ distort_finish_loading (st);
+ }
+ return st->delay;
+ }
+
+ if (!st->img_loader &&
+ st->start_time + st->duration < time ((time_t *) 0)) {
+ if (st->pm) XFreePixmap (st->dpy, st->pm);
+ st->pm = XCreatePixmap (st->dpy, st->window,
+ st->xgwa.width, st->xgwa.height, st->xgwa.depth);
+ st->img_loader = load_image_async_simple (0, st->xgwa.screen, st->window,
+ st->pm, 0, 0);
+ return st->delay;
+ }
+
+ for (k = 0; k < st->number; k++) {
+ st->effect(st,k);
+ st->draw(st,k);
+ }
+ return st->delay;
+}
+
+static void
+distort_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+ /* XClearWindow (dpy, window); */
+ /* Why doesn't this work? */
+ if (st->orig_map) /* created in distort_finish_loading, might be early */
+ XPutImage (st->dpy, st->window, st->gc, st->orig_map,
+ 0, 0, st->orig_map->width, st->orig_map->height, 0, 0);
+}
+
+static Bool
+distort_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ distort_reset(st);
+ return True;
+ }
+ return False;
+}
+
+static void
+distort_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ XFreeGC (st->dpy, st->gc);
+ if (st->pm) XFreePixmap (dpy, st->pm);
+ if (st->orig_map) XDestroyImage (st->orig_map);
+ if (st->buffer_map) destroy_xshm_image (st->dpy, st->buffer_map, &st->shm_info);
+ if (st->from) free (st->from);
+ if (st->fast_from) free (st->fast_from);
+ if (st->from_array) free (st->from_array);
+ free (st);
+}
+
+
+
+
+static const char *distort_defaults [] = {
+ "*dontClearRoot: True",
+ "*background: Black",
+ "*fpsSolid: true",
+#ifdef __sgi /* really, HAVE_READ_DISPLAY_EXTENSION */
+ "*visualID: Best",
+#endif
+
+ "*delay: 20000",
+ "*duration: 120",
+ "*radius: 0",
+ "*speed: 0",
+ "*number: 0",
+ "*slow: False",
+ "*vortex: False",
+ "*magnify: False",
+ "*reflect: False",
+ "*blackhole: False",
+ "*effect: none",
+#ifdef HAVE_XSHM_EXTENSION
+ "*useSHM: False", /* xshm turns out not to help. */
+#endif /* HAVE_XSHM_EXTENSION */
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+ "*rotateImages: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec distort_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-duration", ".duration", XrmoptionSepArg, 0 },
+ { "-radius", ".radius", XrmoptionSepArg, 0 },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-number", ".number", XrmoptionSepArg, 0 },
+
+ { "-effect", ".effect", XrmoptionSepArg, 0 },
+ { "-swamp", ".effect", XrmoptionNoArg, "swamp" },
+ { "-bounce", ".effect", XrmoptionNoArg, "bounce" },
+
+ { "-reflect", ".reflect", XrmoptionNoArg, "True" },
+ { "-vortex", ".vortex", XrmoptionNoArg, "True" },
+ { "-magnify", ".magnify", XrmoptionNoArg, "True" },
+ { "-blackhole", ".blackhole", XrmoptionNoArg, "True" },
+ { "-slow", ".slow", XrmoptionNoArg, "True" },
+#ifdef HAVE_XSHM_EXTENSION
+ { "-shm", ".useSHM", XrmoptionNoArg, "True" },
+ { "-no-shm", ".useSHM", XrmoptionNoArg, "False" },
+#endif /* HAVE_XSHM_EXTENSION */
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Distort", distort)
diff --git a/hacks/distort.man b/hacks/distort.man
new file mode 100644
index 0000000..eedb924
--- /dev/null
+++ b/hacks/distort.man
@@ -0,0 +1,137 @@
+.TH XScreenSaver 1 "17-Oct-99" "X Version 11"
+.SH NAME
+distort \- distort the content of the screen in interesting ways
+.SH SYNOPSIS
+.B distort
+[\-root] [\-window] [\-mono] [\-install] [\-noinstall] [\-visual \fIvisual\fP]
+[\-window\-id \fIwindow\-id\fP]
+[\-delay \fIusecs\fP]
+[\-duration \fIsecs\fP]
+[\-radius \fIpixels\fP]
+[\-speed \fIint\fP]
+[\-number \fIint\fP]
+[\-swamp]
+[\-bounce]
+[\-reflect]
+[\-vortex]
+[\-magnify]
+[\-blackhole]
+[\-slow]
+[\-shm] [\-no\-shm]
+[\-fps]
+.SH DESCRIPTION
+The \fIdistort\fP program takes an image and lets circular zones of
+distortion wander randomly around it, distorting what is under them.
+The mode of distortion and the overall behaviour of the zones can be
+influenced in various ways.
+
+The image that it manipulates will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
+.SH OPTIONS
+.I distort
+accepts the following options:
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-noinstall
+Don't install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual
+class or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window\-id \fIwindow\-id\fP
+Specify which window id to use.
+.TP 8
+.B \-delay \fIusecs\fP
+Specify the delay between subsequent animation frames in microseconds.
+.TP 8
+.B \-duration \fIseconds\fP
+How long to run before loading a new image. Default 120 seconds.
+.TP 8
+.B \-radius \fIpixels\fP
+Specify the radius of the distortion zone in pixels.
+.TP 8
+.B \-speed \fIint\fP
+Specify the speed at which the distortion zone moves, where 0 is slow,
+higher numbers are faster (10 is pretty fast.)
+.TP 8
+.B \-number \fIint\fP
+Specify the number of distortion zones.
+.TP 8
+.B \-swamp
+Instead of letting zones wander around, let small zones pop up like
+bubbles in a swamp and leave permanent distortion. \fBWARNING:\fP
+this option uses a \fIcolossal\fP amount of memory: keep the \fI\-radius\fP
+small when using \fI\-swamp\fP.
+.TP 8
+.B \-bounce
+Let zones wander around and bounce off the window border. This is the
+default.
+.TP 8
+.B \-reflect
+Mode of distortion that resembles reflection by a cylindrical mirror.
+.TP 8
+.B \-vortex
+Whirlpool-shaped distortion. Way cool.
+.TP 8
+.B \-magnify
+This mode of distortion looks like a magnifying glass.
+.TP 8
+.B \-blackhole
+Suck your pixels beyond the event horizon. Favourite mode of Dr
+Stephen Hawking.
+.TP 8
+.B \-slow
+Make the zone wander slower.
+.TP 8
+.B \-shm
+Use shared memory extension.
+.TP 8
+.B \-no\-shm
+Don't use shared memory extension.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 1998 by Jonas Munsin and Jamie Zawinski. Permission to use,
+copy, modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHORS
+Jonas Munsin <jmunsin@iki.fi> and Jamie Zawinski <jwz@jwz.org>.
+This manual page by Matthias Warkus <mawa@iname.com>, 17-Oct-1999.
diff --git a/hacks/drift.c b/hacks/drift.c
new file mode 100644
index 0000000..e88986b
--- /dev/null
+++ b/hacks/drift.c
@@ -0,0 +1,672 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* drift --- drifting recursive fractal cosmic flames */
+
+#if 0
+static const char sccsid[] = "@(#)drift.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1991 by Patrick J. Naughton.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 10-May-1997: Jamie Zawinski <jwz@jwz.org> compatible with xscreensaver
+ * 01-Jan-1997: Moved new flame to drift. Compile time options now run time.
+ * 01-Jun-1995: Updated by Scott Draves.
+ * 27-Jun-1991: vary number of functions used.
+ * 24-Jun-1991: fixed portability problem with integer mod (%).
+ * 06-Jun-1991: Written, received from Scott Draves <spot@cs.cmu.edu>
+ */
+
+#ifdef STANDALONE
+# define MODE_drift
+# define DEFAULTS "*delay: 10000 \n" \
+ "*count: 30 \n" \
+ "*ncolors: 200 \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n" \
+
+# define SMOOTH_COLORS
+# define release_drift 0
+# define reshape_drift 0
+# define drift_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# define ENTRYPOINT /**/
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_drift
+
+#define DEF_GROW "False" /* Grow fractals instead of animating one at a time,
+ would then be like flame */
+#define DEF_LISS "False" /* if this is defined then instead of a point
+ bouncing around in a high dimensional sphere, we
+ use lissojous figures. Only makes sense if
+ grow is false. */
+
+static Bool grow;
+static Bool liss;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-grow", ".drift.grow", XrmoptionNoArg, "on"},
+ {"+grow", ".drift.grow", XrmoptionNoArg, "off"},
+ {"-liss", ".drift.trail", XrmoptionNoArg, "on"},
+ {"+liss", ".drift.trail", XrmoptionNoArg, "off"}
+};
+static argtype vars[] =
+{
+ {&grow, "grow", "Grow", DEF_GROW, t_Bool},
+ {&liss, "trail", "Trail", DEF_LISS, t_Bool}
+};
+static OptionStruct desc[] =
+{
+ {"-/+grow", "turn on/off growing fractals, else they are animated"},
+ {"-/+liss", "turn on/off using lissojous figures to get points"}
+};
+
+ENTRYPOINT ModeSpecOpt drift_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct drift_description =
+{"drift", "init_drift", "draw_drift", (char *) NULL,
+ "refresh_drift", "init_drift", "free_drift", &drift_opts,
+ 10000, 30, 1, 1, 64, 1.0, "",
+ "Shows cosmic drifting flame fractals", 0, NULL};
+
+#endif
+
+#define MAXBATCH1 200 /* mono */
+#define MAXBATCH2 20 /* color */
+#define FUSE 10 /* discard this many initial iterations */
+#define NMAJORVARS 7
+#define MAXLEV 10
+
+typedef struct {
+ /* shape of current flame */
+ int nxforms;
+ double f[2][3][MAXLEV]; /* a bunch of non-homogeneous xforms */
+ int variation[10]; /* for each xform */
+
+ /* Animation */
+ double df[2][3][MAXLEV];
+
+ /* high-level control */
+ int mode; /* 0->slow/single 1->fast/many */
+ int nfractals; /* draw this many fractals */
+ int major_variation;
+ int fractal_len; /* pts/fractal */
+ int color;
+ int rainbow; /* more than one color per fractal
+ 1-> computed by adding dimension to fractal */
+
+ int width, height; /* of window */
+ int timer;
+
+ /* draw info about current flame */
+ int fuse; /* iterate this many before drawing */
+ int total_points; /* draw this many pts before fractal ends */
+ int npoints; /* how many we've computed but not drawn */
+ XPoint pts[MAXBATCH1]; /* here they are */
+ unsigned long pixcol;
+ /* when drawing in color, we have a buffer per color */
+ int *ncpoints;
+ XPoint *cpts;
+
+ double x, y, c;
+ int liss_time;
+ Bool grow, liss;
+
+ short lasthalf;
+ long saved_random_bits;
+ int nbits;
+
+ int erase_countdown;
+} driftstruct;
+
+static driftstruct *drifts = (driftstruct *) NULL;
+
+static short
+halfrandom(driftstruct * dp, int mv)
+{
+ unsigned long r;
+
+ if (dp->lasthalf) {
+ r = dp->lasthalf;
+ dp->lasthalf = 0;
+ } else {
+ r = LRAND();
+ dp->lasthalf = (short) (r >> 16);
+ }
+ r = r % mv;
+ return r;
+}
+
+static int
+frandom(driftstruct * dp, int n)
+{
+ int result;
+
+ if (3 > dp->nbits) {
+ dp->saved_random_bits = LRAND();
+ dp->nbits = 31;
+ }
+ switch (n) {
+ case 2:
+ result = (int) (dp->saved_random_bits & 1);
+ dp->saved_random_bits >>= 1;
+ dp->nbits -= 1;
+ return result;
+
+ case 3:
+ result = (int) (dp->saved_random_bits & 3);
+ dp->saved_random_bits >>= 2;
+ dp->nbits -= 2;
+ if (3 == result)
+ return frandom(dp, 3);
+ return result;
+
+ case 4:
+ result = (int) (dp->saved_random_bits & 3);
+ dp->saved_random_bits >>= 2;
+ dp->nbits -= 2;
+ return result;
+
+ case 5:
+ result = (int) (dp->saved_random_bits & 7);
+ dp->saved_random_bits >>= 3;
+ dp->nbits -= 3;
+ if (4 < result)
+ return frandom(dp, 5);
+ return result;
+ default:
+ (void) fprintf(stderr, "bad arg to frandom\n");
+ }
+ return 0;
+}
+
+#define DISTRIB_A (halfrandom(dp, 7000) + 9000)
+#define DISTRIB_B ((frandom(dp, 3) + 1) * (frandom(dp, 3) + 1) * 120000)
+#define LEN(x) (sizeof(x)/sizeof((x)[0]))
+
+static void
+initmode(ModeInfo * mi, int mode)
+{
+ driftstruct *dp = &drifts[MI_SCREEN(mi)];
+
+#define VARIATION_LEN 14
+
+ dp->mode = mode;
+
+ dp->major_variation = halfrandom(dp, VARIATION_LEN);
+ /* 0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, 6 */
+ dp->major_variation = ((dp->major_variation >= VARIATION_LEN >> 1) &&
+ (dp->major_variation < VARIATION_LEN - 1)) ?
+ (dp->major_variation + 1) >> 1 : dp->major_variation >> 1;
+
+ if (dp->grow) {
+ dp->rainbow = 0;
+ if (mode) {
+ if (!dp->color || halfrandom(dp, 8)) {
+ dp->nfractals = halfrandom(dp, 30) + 5;
+ dp->fractal_len = DISTRIB_A;
+ } else {
+ dp->nfractals = halfrandom(dp, 5) + 5;
+ dp->fractal_len = DISTRIB_B;
+ }
+ } else {
+ dp->rainbow = dp->color;
+ dp->nfractals = 1;
+ dp->fractal_len = DISTRIB_B;
+ }
+ } else {
+ dp->nfractals = 1;
+ dp->rainbow = dp->color;
+ dp->fractal_len = 2000000;
+ }
+ dp->fractal_len = (dp->fractal_len * MI_COUNT(mi)) / 20;
+
+ MI_CLEARWINDOW(mi);
+}
+
+static void
+pick_df_coefs(ModeInfo * mi)
+{
+ driftstruct *dp = &drifts[MI_SCREEN(mi)];
+ int i, j, k;
+ double r;
+
+ for (i = 0; i < dp->nxforms; i++) {
+
+ r = 1e-6;
+ for (j = 0; j < 2; j++)
+ for (k = 0; k < 3; k++) {
+ dp->df[j][k][i] = ((double) halfrandom(dp, 1000) / 500.0 - 1.0);
+ r += dp->df[j][k][i] * dp->df[j][k][i];
+ }
+ r = (3 + halfrandom(dp, 5)) * 0.01 / sqrt(r);
+ for (j = 0; j < 2; j++)
+ for (k = 0; k < 3; k++)
+ dp->df[j][k][i] *= r;
+ }
+}
+
+ENTRYPOINT void
+free_drift(ModeInfo * mi)
+{
+ driftstruct *dp = &drifts[MI_SCREEN(mi)];
+ if (dp->ncpoints != NULL) {
+ (void) free((void *) dp->ncpoints);
+ dp->ncpoints = (int *) NULL;
+ }
+ if (dp->cpts != NULL) {
+ (void) free((void *) dp->cpts);
+ dp->cpts = (XPoint *) NULL;
+ }
+}
+
+static void
+initfractal(ModeInfo * mi)
+{
+ driftstruct *dp = &drifts[MI_SCREEN(mi)];
+ int i, j, k;
+
+#define XFORM_LEN 9
+
+ dp->fuse = FUSE;
+ dp->total_points = 0;
+
+ if (!dp->ncpoints) {
+ if ((dp->ncpoints = (int *) malloc(sizeof (int) * MI_NCOLORS(mi))) ==
+ NULL) {
+ free_drift(mi);
+ return;
+ }
+ }
+ if (!dp->cpts) {
+ if ((dp->cpts = (XPoint *) malloc(MAXBATCH2 * sizeof (XPoint) *
+ MI_NCOLORS(mi))) == NULL) {
+ free_drift(mi);
+ return;
+ }
+ }
+
+ if (dp->rainbow)
+ for (i = 0; i < MI_NPIXELS(mi); i++)
+ dp->ncpoints[i] = 0;
+ else
+ dp->npoints = 0;
+ dp->nxforms = halfrandom(dp, XFORM_LEN);
+ /* 2, 2, 2, 3, 3, 3, 4, 4, 5 */
+ dp->nxforms = (dp->nxforms >= XFORM_LEN - 1) + dp->nxforms / 3 + 2;
+
+ dp->c = dp->x = dp->y = 0.0;
+ if (dp->liss && !halfrandom(dp, 10)) {
+ dp->liss_time = 0;
+ }
+ if (!dp->grow)
+ pick_df_coefs(mi);
+ for (i = 0; i < dp->nxforms; i++) {
+ if (NMAJORVARS == dp->major_variation)
+ dp->variation[i] = halfrandom(dp, NMAJORVARS);
+ else
+ dp->variation[i] = dp->major_variation;
+ for (j = 0; j < 2; j++)
+ for (k = 0; k < 3; k++) {
+ if (dp->liss)
+ dp->f[j][k][i] = sin(dp->liss_time * dp->df[j][k][i]);
+ else
+ dp->f[j][k][i] = ((double) halfrandom(dp, 1000) / 500.0 - 1.0);
+ }
+ }
+ if (dp->color)
+ dp->pixcol = MI_PIXEL(mi, halfrandom(dp, MI_NPIXELS(mi)));
+ else
+ dp->pixcol = MI_WHITE_PIXEL(mi);
+
+}
+
+
+ENTRYPOINT void
+init_drift(ModeInfo * mi)
+{
+ driftstruct *dp;
+
+ MI_INIT (mi, drifts);
+ dp = &drifts[MI_SCREEN(mi)];
+
+ dp->width = MI_WIDTH(mi);
+ dp->height = MI_HEIGHT(mi);
+ dp->color = MI_NPIXELS(mi) > 2;
+
+ if (MI_IS_FULLRANDOM(mi)) {
+ if (NRAND(3) == 0)
+ dp->grow = True;
+ else {
+ dp->grow = False;
+ dp->liss = (Bool) (LRAND() & 1);
+ }
+ } else {
+ dp->grow = grow;
+ if (dp->grow)
+ dp->liss = False;
+ else
+ dp->liss = liss;
+ }
+ initmode(mi, 1);
+ initfractal(mi);
+}
+
+static void
+iter(driftstruct * dp)
+{
+ int i = frandom(dp, dp->nxforms);
+ double nx, ny, nc;
+
+
+ if (i)
+ nc = (dp->c + 1.0) / 2.0;
+ else
+ nc = dp->c / 2.0;
+
+ nx = dp->f[0][0][i] * dp->x + dp->f[0][1][i] * dp->y + dp->f[0][2][i];
+ ny = dp->f[1][0][i] * dp->x + dp->f[1][1][i] * dp->y + dp->f[1][2][i];
+
+
+ switch (dp->variation[i]) {
+ case 1:
+ /* sinusoidal */
+ nx = sin(nx);
+ ny = sin(ny);
+ break;
+ case 2:
+ {
+ /* complex */
+ double r2 = nx * nx + ny * ny + 1e-6;
+
+ nx = nx / r2;
+ ny = ny / r2;
+ break;
+ }
+ case 3:
+ /* bent */
+ if (nx < 0.0)
+ nx = nx * 2.0;
+ if (ny < 0.0)
+ ny = ny / 2.0;
+ break;
+ case 4:
+ {
+ /* swirl */
+
+ double r = (nx * nx + ny * ny); /* times k here is fun */
+ double c1 = sin(r);
+ double c2 = cos(r);
+ double t = nx;
+
+ if (nx > 1e4 || nx < -1e4 || ny > 1e4 || ny < -1e4)
+ ny = 1e4;
+ else
+ ny = c2 * t + c1 * ny;
+ nx = c1 * nx - c2 * ny;
+ break;
+ }
+ case 5:
+ {
+ /* horseshoe */
+ double r, c1, c2, t;
+
+ /* Avoid atan2: DOMAIN error message */
+ if (nx == 0.0 && ny == 0.0)
+ r = 0.0;
+ else
+ r = atan2(nx, ny); /* times k here is fun */
+ c1 = sin(r);
+ c2 = cos(r);
+ t = nx;
+
+ nx = c1 * nx - c2 * ny;
+ ny = c2 * t + c1 * ny;
+ break;
+ }
+ case 6:
+ {
+ /* drape */
+ double t;
+
+ /* Avoid atan2: DOMAIN error message */
+ if (nx == 0.0 && ny == 0.0)
+ t = 0.0;
+ else
+ t = atan2(nx, ny) / M_PI;
+
+ if (nx > 1e4 || nx < -1e4 || ny > 1e4 || ny < -1e4)
+ ny = 1e4;
+ else
+ ny = sqrt(nx * nx + ny * ny) - 1.0;
+ nx = t;
+ break;
+ }
+ }
+
+#if 0
+ /* here are some others */
+ {
+ /* broken */
+ if (nx > 1.0)
+ nx = nx - 1.0;
+ if (nx < -1.0)
+ nx = nx + 1.0;
+ if (ny > 1.0)
+ ny = ny - 1.0;
+ if (ny < -1.0)
+ ny = ny + 1.0;
+ break;
+ }
+ {
+ /* complex sine */
+ double u = nx, v = ny;
+ double ev = exp(v);
+ double emv = exp(-v);
+
+ nx = (ev + emv) * sin(u) / 2.0;
+ ny = (ev - emv) * cos(u) / 2.0;
+ }
+ {
+
+ /* polynomial */
+ if (nx < 0)
+ nx = -nx * nx;
+ else
+ nx = nx * nx;
+
+ if (ny < 0)
+ ny = -ny * ny;
+ else
+ ny = ny * ny;
+ }
+ {
+ /* spherical */
+ double r = 0.5 + sqrt(nx * nx + ny * ny + 1e-6);
+
+ nx = nx / r;
+ ny = ny / r;
+ }
+ {
+ nx = atan(nx) / M_PI_2
+ ny = atan(ny) / M_PI_2
+ }
+#endif
+
+ /* how to check nan too? some machines don't have finite().
+ don't need to check ny, it'll propogate */
+ if (nx > 1e4 || nx < -1e4) {
+ nx = halfrandom(dp, 1000) / 500.0 - 1.0;
+ ny = halfrandom(dp, 1000) / 500.0 - 1.0;
+ dp->fuse = FUSE;
+ }
+ dp->x = nx;
+ dp->y = ny;
+ dp->c = nc;
+
+}
+
+static void
+draw(ModeInfo * mi, driftstruct * dp, Drawable d)
+{
+ Display *display = MI_DISPLAY(mi);
+ GC gc = MI_GC(mi);
+ double x = dp->x;
+ double y = dp->y;
+ int fixed_x, fixed_y, npix, c, n;
+
+ if (dp->fuse) {
+ dp->fuse--;
+ return;
+ }
+ if (!(x > -1.0 && x < 1.0 && y > -1.0 && y < 1.0))
+ return;
+
+ fixed_x = (int) ((dp->width / 2) * (x + 1.0));
+ fixed_y = (int) ((dp->height / 2) * (y + 1.0));
+
+ if (!dp->rainbow) {
+
+ dp->pts[dp->npoints].x = fixed_x;
+ dp->pts[dp->npoints].y = fixed_y;
+ dp->npoints++;
+ if (dp->npoints == MAXBATCH1) {
+ XSetForeground(display, gc, dp->pixcol);
+ XDrawPoints(display, d, gc, dp->pts, dp->npoints, CoordModeOrigin);
+ dp->npoints = 0;
+ }
+ } else {
+
+ npix = MI_NPIXELS(mi);
+ c = (int) (dp->c * npix);
+
+ if (c < 0)
+ c = 0;
+ if (c >= npix)
+ c = npix - 1;
+ n = dp->ncpoints[c];
+ dp->cpts[c * MAXBATCH2 + n].x = fixed_x;
+ dp->cpts[c * MAXBATCH2 + n].y = fixed_y;
+ if (++dp->ncpoints[c] == MAXBATCH2) {
+ XSetForeground(display, gc, MI_PIXEL(mi, c));
+ XDrawPoints(display, d, gc, &(dp->cpts[c * MAXBATCH2]),
+ dp->ncpoints[c], CoordModeOrigin);
+ dp->ncpoints[c] = 0;
+ }
+ }
+}
+
+static void
+draw_flush(ModeInfo * mi, driftstruct * dp, Drawable d)
+{
+ Display *display = MI_DISPLAY(mi);
+ GC gc = MI_GC(mi);
+
+ if (dp->rainbow) {
+ int npix = MI_NPIXELS(mi);
+ int i;
+
+ for (i = 0; i < npix; i++) {
+ if (dp->ncpoints[i]) {
+ XSetForeground(display, gc, MI_PIXEL(mi, i));
+ XDrawPoints(display, d, gc, &(dp->cpts[i * MAXBATCH2]),
+ dp->ncpoints[i], CoordModeOrigin);
+ dp->ncpoints[i] = 0;
+ }
+ }
+ } else {
+ if (dp->npoints)
+ XSetForeground(display, gc, dp->pixcol);
+ XDrawPoints(display, d, gc, dp->pts,
+ dp->npoints, CoordModeOrigin);
+ dp->npoints = 0;
+ }
+}
+
+
+ENTRYPOINT void
+draw_drift(ModeInfo * mi)
+{
+ Window window = MI_WINDOW(mi);
+ driftstruct *dp;
+
+ if (drifts == NULL)
+ return;
+ dp = &drifts[MI_SCREEN(mi)];
+ if (dp->ncpoints == NULL)
+ return;
+
+ if (dp->erase_countdown) {
+ if (!--dp->erase_countdown) {
+ initmode(mi, frandom(dp, 2));
+ initfractal(mi);
+ }
+ return;
+ }
+
+ MI_IS_DRAWN(mi) = True;
+ dp->timer = 3000;
+ while (dp->timer) {
+ iter(dp);
+ draw(mi, dp, window);
+ if (dp->total_points++ > dp->fractal_len) {
+ draw_flush(mi, dp, window);
+ if (0 == --dp->nfractals) {
+ dp->erase_countdown = 4 * 1000000 / MI_PAUSE(mi);
+ return;
+ }
+ initfractal(mi);
+ }
+ dp->timer--;
+ }
+ if (!dp->grow) {
+ int i, j, k;
+
+ draw_flush(mi, dp, window);
+ if (dp->liss)
+ dp->liss_time++;
+ for (i = 0; i < dp->nxforms; i++)
+ for (j = 0; j < 2; j++)
+ for (k = 0; k < 3; k++) {
+ if (dp->liss)
+ dp->f[j][k][i] = sin(dp->liss_time * dp->df[j][k][i]);
+ else {
+ double t = dp->f[j][k][i] += dp->df[j][k][i];
+
+ if (t < -1.0 || 1.0 < t)
+ dp->df[j][k][i] *= -1.0;
+ }
+ }
+ }
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_drift(ModeInfo * mi)
+{
+ MI_CLEARWINDOW(mi);
+}
+#endif
+
+XSCREENSAVER_MODULE ("Drift", drift)
+
+#endif /* MODE_drift */
diff --git a/hacks/drift.man b/hacks/drift.man
new file mode 100644
index 0000000..f0a9be8
--- /dev/null
+++ b/hacks/drift.man
@@ -0,0 +1,79 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+drift - draws drifting recursive fractal cosmic flames
+.SH SYNOPSIS
+.B drift
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-count \fIinteger\fP] [\-grow] [\-no\-grow] [\-liss] [\-no\-liss]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIdrift\fP program draws drifting recursive fractal cosmic flames
+.SH OPTIONS
+.I drift
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 200.
+The colors used cycle through the hue, making N stops around
+the color wheel.
+.TP 8
+.B \-count \fIinteger\fP
+
+.TP 8
+.B \-grow
+.TP 8
+.B \-no\-grow
+Whether fractals should grow; otherwise, they are animated.
+
+.TP 8
+.B \-liss
+.TP 8
+.B \-no\-liss
+Whether we should use lissajous figures to get points.
+
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR flame (MANSUFFIX),
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1991, 1995 by Scott Draves.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Scott Draves <spot@cs.cmu.edu>, 06-Jun-91, 01-Jun-95.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/epicycle.c b/hacks/epicycle.c
new file mode 100644
index 0000000..89fab0b
--- /dev/null
+++ b/hacks/epicycle.c
@@ -0,0 +1,794 @@
+/* epicycle --- The motion of a body with epicycles, as in the pre-Copernican
+ * cosmologies.
+ *
+ * Copyright (c) 1998 James Youngman <jay@gnu.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* Standard C headers; screenhack.h assumes that these have already
+ * been included if required -- for example, it defines M_PI if not
+ * already defined.
+ */
+#include <float.h>
+#include <math.h>
+
+
+#include "screenhack.h"
+#include "erase.h"
+
+/* MIT-SHM headers omitted; this screenhack doesn't use it */
+
+
+
+/*********************************************************/
+/******************** MAGIC CONSTANTS ********************/
+/*********************************************************/
+#define MIN_RADIUS (5) /* smallest allowable circle radius */
+#define FILL_PROPORTION (0.9) /* proportion of screen to fill by scaling. */
+/*********************************************************/
+/***************** END OF MAGIC CONSTANTS ****************/
+/*********************************************************/
+
+
+
+#define FULLCIRCLE (2.0 * M_PI) /* radians in a circle. */
+
+
+/* Some of these resource values here are hand-tuned to give a
+ * pleasing variety of interesting shapes. These are not the only
+ * good settings, but you may find you need to change some as a group
+ * to get pleasing figures.
+ */
+static const char *epicycle_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*colors: 100",
+ "*color0: red",
+ "*delay: 20000",
+ "*holdtime: 2",
+ "*lineWidth: 4",
+ "*minCircles: 2",
+ "*maxCircles: 10",
+ "*minSpeed: 0.003",
+ "*maxSpeed: 0.005",
+ "*harmonics: 8",
+ "*timestep: 1.0",
+ "*timestepCoarseFactor: 1.0", /* no option for this resource. */
+ "*divisorPoisson: 0.4",
+ "*sizeFactorMin: 1.05",
+ "*sizeFactorMax: 2.05",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+/* options passed to this program */
+static XrmOptionDescRec epicycle_options [] = {
+ { "-color0", ".color0", XrmoptionSepArg, 0 },
+ { "-colors", ".colors", XrmoptionSepArg, 0 },
+ { "-colours", ".colors", XrmoptionSepArg, 0 },
+ { "-foreground", ".foreground", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-holdtime", ".holdtime", XrmoptionSepArg, 0 },
+ { "-linewidth", ".lineWidth", XrmoptionSepArg, 0 },
+ { "-min_circles", ".minCircles", XrmoptionSepArg, 0 },
+ { "-max_circles", ".maxCircles", XrmoptionSepArg, 0 },
+ { "-min_speed", ".minSpeed", XrmoptionSepArg, 0 },
+ { "-max_speed", ".maxSpeed", XrmoptionSepArg, 0 },
+ { "-harmonics", ".harmonics", XrmoptionSepArg, 0 },
+ { "-timestep", ".timestep", XrmoptionSepArg, 0 },
+ { "-divisor_poisson",".divisorPoisson",XrmoptionSepArg, 0 },
+ { "-size_factor_min", ".sizeFactorMin", XrmoptionSepArg, 0 },
+ { "-size_factor_max", ".sizeFactorMax", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+/* Each circle is centred on a point on the rim of another circle.
+ */
+struct tagCircle
+{
+ long radius; /* in pixels */
+ double w; /* position (radians ccw from x-axis) */
+ double initial_w; /* starting position */
+ double wdot; /* rotation rate (change in w per iteration) */
+ int divisor;
+
+ struct tagCircle *pchild;
+};
+typedef struct tagCircle Circle;
+
+
+struct tagBody /* a body that moves on a system of circles. */
+{
+ int x_origin, y_origin;
+ int x, y;
+ int old_x, old_y;
+ int current_color; /* pixel index into colors[] */
+ Circle *epicycles; /* system of circles on which it moves. */
+ struct tagBody *next; /* next in list. */
+};
+typedef struct tagBody Body;
+
+
+struct state {
+ Display *dpy;
+ Window window;
+ GC color0;
+ int width, height;
+ int x_offset, y_offset;
+ int unit_pixels;
+ unsigned long bg;
+ Colormap cmap;
+ int restart;
+ double wdot_max;
+ XColor *colors;
+ int ncolors;
+ int color_shift_pos; /* how far we are towards that. */
+ double colour_cycle_rate;
+ int harmonics;
+ double divisorPoisson;
+ double sizeFactorMin;
+ double sizeFactorMax;
+ int minCircles;
+ int maxCircles;
+
+ Bool done;
+
+ long L;
+ double T, timestep, circle, timestep_coarse;
+ int delay;
+ int uncleared;
+ int holdtime;
+ int xmax, xmin, ymax, ymin;
+ Body *pb0;
+ double xtime;
+ eraser_state *eraser;
+};
+
+
+
+/* Determine the GCD of two numbers using Euclid's method. The other
+ * possible algorighm is Stein's method, but it's probably only going
+ * to be much faster on machines with no divide instruction, like the
+ * ARM and the Z80. The former is very fast anyway and the latter
+ * probably won't run X clients; in any case, this calculation is not
+ * the bulk of the computational expense of the program. I originally
+ * tried using Stein's method, but I wanted to remove the gotos. Not
+ * wanting to introduce possible bugs, I plumped for Euclid's method
+ * instead. Lastly, Euclid's algorithm is preferred to the
+ * generalisation for N inputs.
+ *
+ * See Knuth, section 4.5.2.
+ */
+static int
+gcd(int u, int v) /* Euclid's Method */
+{
+ /* If either operand of % is negative, the sign of the result is
+ * implementation-defined. See section 6.3.5 "Multiplicative
+ * Operators" of the ANSI C Standard (page 46 [LEFT HAND PAGE!] of
+ * "Annotated C Standard", Osborne, ISBN 0-07-881952-0).
+ */
+ if (u < 0) u = -u;
+ if (v < 0) v = -v;
+
+ while (0 != v)
+ {
+ int r;
+ r = u % v;
+ u = v;
+ v = r;
+ }
+ return u;
+}
+
+/* Determine the Lowest Common Multiple of two integers, using
+ * Euclid's Proposition 34, as explained in Knuth's The Art of
+ * Computer Programming, Vol 2, section 4.5.2.
+ */
+static int
+lcm(int u, int v)
+{
+ return u / gcd(u,v) * v;
+}
+
+static long
+random_radius(struct state *st, double scale)
+{
+ long r;
+
+ r = frand(scale) * st->unit_pixels/2; /* for frand() see utils/yarandom.h */
+ if (r < MIN_RADIUS)
+ r = MIN_RADIUS;
+ return r;
+}
+
+
+static long
+random_divisor(struct state *st)
+{
+ int divisor = 1;
+ int sign;
+
+ while (frand(1.0) < st->divisorPoisson && divisor <= st->harmonics)
+ {
+ ++divisor;
+ }
+ sign = (frand(1.0) < 0.5) ? +1 : -1;
+ return sign * divisor;
+}
+
+
+/* Construct a circle or die.
+ */
+static Circle *
+new_circle(struct state *st, double scale)
+{
+ Circle *p = malloc(sizeof(Circle));
+
+ p->radius = random_radius(st, scale);
+ p->w = p->initial_w = 0.0;
+ p->divisor = random_divisor(st);
+ p->wdot = st->wdot_max / p->divisor;
+ p->pchild = NULL;
+
+ return p;
+}
+
+static void delete_circle(Circle *p)
+{
+ free(p);
+}
+
+static void
+delete_circle_chain(Circle *p)
+{
+ while (p)
+ {
+ Circle *q = p->pchild;
+ delete_circle(p);
+ p = q;
+ }
+}
+
+static Circle *
+new_circle_chain(struct state *st)
+{
+ Circle *head;
+ double scale = 1.0, factor;
+ int n;
+
+ /* Parent circles are larger than their children by a factor of at
+ * least FACTOR_MIN and at most FACTOR_MAX.
+ */
+ factor = st->sizeFactorMin + frand(st->sizeFactorMax - st->sizeFactorMin);
+
+ /* There are between minCircles and maxCircles in each figure.
+ */
+ if (st->maxCircles == st->minCircles)
+ n = st->minCircles; /* Avoid division by zero. */
+ else
+ n = st->minCircles + random() % (st->maxCircles - st->minCircles);
+
+ head = NULL;
+ while (n--)
+ {
+ Circle *p = new_circle(st, scale);
+ p->pchild = head;
+ head = p;
+
+ scale /= factor;
+ }
+ return head;
+}
+
+static void
+assign_random_common_w(Circle *p)
+{
+ double w_common = frand(FULLCIRCLE); /* anywhere on the circle */
+ while (p)
+ {
+ p->initial_w = w_common;
+ p = p->pchild;
+ }
+}
+
+static Body *
+new_body(struct state *st)
+{
+ Body *p = malloc(sizeof(Body));
+ if (!p) abort();
+ p->epicycles = new_circle_chain(st);
+ p->current_color = 0; /* ?? start them all on different colors? */
+ p->next = NULL;
+ p->x = p->y = 0;
+ p->old_x = p->old_y = 0;
+ p->x_origin = p->y_origin = 0;
+
+ /* Start all the epicycles at the same w value to make it easier to
+ * figure out at what T value the cycle is closed. We don't just fix
+ * the initial W value because that makes all the patterns tend to
+ * be symmetrical about the X axis.
+ */
+ assign_random_common_w(p->epicycles);
+ return p;
+}
+
+static void
+delete_body(Body *p)
+{
+ delete_circle_chain(p->epicycles);
+ free(p);
+}
+
+
+static void
+draw_body(struct state *st, Body *pb, GC gc)
+{
+ XDrawLine(st->dpy, st->window, gc, pb->old_x, pb->old_y, pb->x, pb->y);
+}
+
+static long
+compute_divisor_lcm(Circle *p)
+{
+ long l = 1;
+
+ while (p)
+ {
+ l = lcm(l, p->divisor);
+ p = p->pchild;
+ }
+ return l;
+}
+
+
+/* move_body()
+ *
+ * Calculate the position for the body at time T. We work in double
+ * rather than int to avoid the cumulative errors that would be caused
+ * by the rounding implicit in an assignment to int.
+ */
+static void
+move_body(Body *pb, double t)
+{
+ Circle *p;
+ double x, y;
+
+ pb->old_x = pb->x;
+ pb->old_y = pb->y;
+
+ x = pb->x_origin;
+ y = pb->y_origin;
+
+ for (p=pb->epicycles; NULL != p; p=p->pchild)
+ {
+ /* angular pos = initial_pos + time * angular speed */
+ /* but this is an angular position, so modulo FULLCIRCLE. */
+ p->w = fmod(p->initial_w + (t * p->wdot), FULLCIRCLE);
+
+ x += (p->radius * cos(p->w));
+ y += (p->radius * sin(p->w));
+ }
+
+ pb->x = (int)x;
+ pb->y = (int)y;
+}
+
+static int
+colour_init(struct state *st, XWindowAttributes *pxgwa)
+{
+ XGCValues gcv;
+
+#if 0
+ int H = random() % 360; /* colour choice from attraction.c. */
+ double S1 = 0.25;
+ double S2 = 1.00;
+ double V = frand(0.25) + 0.75;
+ int line_width = 0;
+#endif
+
+ int retval = 1;
+ unsigned long valuemask = 0L;
+ unsigned long fg;
+
+ /* Free any already allocated colors...
+ */
+ if (st->colors)
+ {
+ free_colors(pxgwa->screen, st->cmap, st->colors, st->ncolors);
+ st->colors = 0;
+ st->ncolors = 0;
+ }
+
+ st->ncolors = get_integer_resource (st->dpy, "colors", "Colors");
+ if (0 == st->ncolors) /* English spelling? */
+ st->ncolors = get_integer_resource (st->dpy, "colours", "Colors");
+
+ if (st->ncolors < 2)
+ st->ncolors = 2;
+ if (st->ncolors <= 2)
+ mono_p = True;
+ st->colors = 0;
+
+ if (!mono_p)
+ {
+ st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1));
+ if (!st->colors) abort();
+
+ make_smooth_colormap (pxgwa->screen, pxgwa->visual, st->cmap,
+ st->colors, &st->ncolors,
+ True, /* allocate */
+ False, /* not writable */
+ True); /* verbose (complain about failure) */
+ if (st->ncolors <= 2)
+ {
+ if (st->colors)
+ free (st->colors);
+ st->colors = 0;
+ mono_p = True;
+ }
+ }
+
+
+ st->bg = get_pixel_resource (st->dpy, st->cmap, "background", "Background");
+
+ /* Set the line width
+ */
+ gcv.line_width = get_integer_resource (st->dpy, "lineWidth", "Integer");
+ if (gcv.line_width)
+ {
+ valuemask |= GCLineWidth;
+
+ gcv.join_style = JoinRound;
+ gcv.cap_style = CapRound;
+
+ valuemask |= (GCCapStyle | GCJoinStyle);
+ }
+
+
+ /* Set the drawing function.
+ */
+ gcv.function = GXcopy;
+ valuemask |= GCFunction;
+
+ /* Set the foreground.
+ */
+/* if (mono_p)*/
+ fg = get_pixel_resource (st->dpy, st->cmap, "foreground", "Foreground");
+/* WTF?
+else
+ fg = st->bg ^ get_pixel_resource (st->dpy, st->cmap, ("color0"), "Foreground");
+*/
+ gcv.foreground = fg;
+ valuemask |= GCForeground;
+
+ /* Actually create the GC.
+ */
+ st->color0 = XCreateGC (st->dpy, st->window, valuemask, &gcv);
+
+ return retval;
+}
+
+
+
+
+static void
+setup(struct state *st)
+{
+ XWindowAttributes xgwa;
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->cmap = xgwa.colormap;
+
+ st->width = xgwa.width;
+ st->height = xgwa.height;
+ st->x_offset = st->width / 2;
+ st->y_offset = st->height / 2;
+ st->unit_pixels = st->width < st->height ? st->width : st->height;
+
+ {
+ if (!st->done)
+ {
+ colour_init(st, &xgwa);
+ st->done = True;
+ }
+ }
+}
+
+
+static void
+color_step(struct state *st, Body *pb, double frac)
+{
+ if (!mono_p)
+ {
+ int newshift = st->ncolors * fmod(frac * st->colour_cycle_rate, 1.0);
+ if (newshift != st->color_shift_pos)
+ {
+ pb->current_color = newshift;
+ XSetForeground (st->dpy, st->color0, st->colors[pb->current_color].pixel);
+ st->color_shift_pos = newshift;
+ }
+ }
+}
+
+
+#if 0
+static long
+distance(long x1, long y1, long x2, long y2)
+{
+ long dx, dy;
+
+ dx = x2 - x1;
+ dy = y2 - y1;
+ return dx*dx + dy*dy;
+}
+
+static int poisson_irand(double p)
+{
+ int r = 1;
+ while (fabs(frand(1.0)) < p)
+ ++r;
+ return r < 1 ? 1 : r;
+}
+#endif
+
+static void
+precalculate_figure(Body *pb,
+ double this_xtime, double step,
+ int *x_max, int *y_max,
+ int *x_min, int *y_min)
+{
+ double t;
+
+ move_body(pb, 0.0); /* move once to avoid initial line from origin */
+ *x_min = *x_max = pb->x;
+ *y_min = *y_max = pb->y;
+
+ for (t=0.0; t<this_xtime; t += step)
+ {
+ move_body(pb, t); /* move once to avoid initial line from origin */
+ if (pb->x > *x_max)
+ *x_max = pb->x;
+ if (pb->x < *x_min)
+ *x_min = pb->x;
+ if (pb->y > *y_max)
+ *y_max = pb->y;
+ if (pb->y < *y_min)
+ *y_min = pb->y;
+ }
+}
+
+static int i_max(int a, int b)
+{
+ return (a>b) ? a : b;
+}
+
+static void rescale_circles(struct state *st, Body *pb,
+ int x_max, int y_max,
+ int x_min, int y_min)
+{
+ double xscale, yscale, scale;
+ double xm, ym;
+
+ x_max -= st->x_offset;
+ x_min -= st->x_offset;
+ y_max -= st->y_offset;
+ y_min -= st->y_offset;
+
+ x_max = i_max(x_max, -x_min);
+ y_max = i_max(y_max, -y_min);
+
+
+ xm = st->width / 2.0;
+ ym = st->height / 2.0;
+ if (x_max > xm)
+ xscale = xm / x_max;
+ else
+ xscale = 1.0;
+ if (y_max > ym)
+ yscale = ym / y_max;
+ else
+ yscale = 1.0;
+
+ if (xscale < yscale) /* wider than tall */
+ scale = xscale; /* ensure width fits onscreen */
+ else
+ scale = yscale; /* ensure height fits onscreen */
+
+
+ scale *= FILL_PROPORTION; /* only fill FILL_PROPORTION of screen */
+ if (scale < 1.0) /* only reduce, don't enlarge. */
+ {
+ Circle *p;
+ for (p=pb->epicycles; p; p=p->pchild)
+ {
+ p->radius *= scale;
+ }
+ }
+ else
+ {
+ printf("enlarge by x%.2f skipped...\n", scale);
+ }
+
+ if (st->width > st->height * 5 || /* window has weird aspect */
+ st->height > st->width * 5)
+ {
+ Circle *p;
+ double r = (st->width > st->height
+ ? st->width / (double) st->height
+ : st->height / (double) st->width);
+ for (p=pb->epicycles; p; p=p->pchild)
+ p->radius *= r;
+ }
+}
+
+
+/* angular speeds of the circles are harmonics of a fundamental
+ * value. That should please the Pythagoreans among you... :-)
+ */
+static double
+random_wdot_max(struct state *st)
+{
+ /* Maximum and minimum values for the choice of wdot_max. Possible
+ * epicycle speeds vary from wdot_max to (wdot_max * harmonics).
+ */
+ double minspeed, maxspeed;
+ minspeed = get_float_resource(st->dpy, "minSpeed", "Double");
+ maxspeed = get_float_resource(st->dpy, "maxSpeed", "Double");
+ return st->harmonics * (minspeed + FULLCIRCLE * frand(maxspeed-minspeed));
+}
+
+
+static void *
+epicycle_init (Display *disp, Window win)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ st->dpy = disp;
+ st->window = win;
+
+ st->holdtime = get_integer_resource (st->dpy, "holdtime", "Integer");
+
+ st->circle = FULLCIRCLE;
+
+ XClearWindow(st->dpy, st->window);
+ st->uncleared = 0;
+ st->restart = 1;
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ st->harmonics = get_integer_resource(st->dpy, "harmonics", "Integer");
+ st->divisorPoisson = get_float_resource(st->dpy, "divisorPoisson", "Double");
+
+ st->timestep = get_float_resource(st->dpy, "timestep", "Double");
+ st->timestep_coarse = st->timestep *
+ get_float_resource(st->dpy, "timestepCoarseFactor", "Double");
+
+ st->sizeFactorMin = get_float_resource(st->dpy, "sizeFactorMin", "Double");
+ st->sizeFactorMax = get_float_resource(st->dpy, "sizeFactorMax", "Double");
+
+ st->minCircles = get_integer_resource (st->dpy, "minCircles", "Integer");
+ st->maxCircles = get_integer_resource (st->dpy, "maxCircles", "Integer");
+
+ st->xtime = 0; /* is this right? */
+
+ return st;
+}
+
+static unsigned long
+epicycle_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int this_delay = st->delay;
+
+ if (st->eraser) {
+ st->eraser = erase_window (st->dpy, st->window, st->eraser);
+ return 10000;
+ }
+
+ if (st->restart)
+ {
+ setup(st);
+ st->restart = 0;
+
+ /* Flush any outstanding events; this has the side effect of
+ * reducing the number of "false restarts"; resdtarts caused by
+ * one event (e.g. ConfigureNotify) followed by another
+ * (e.g. Expose).
+ */
+
+ st->wdot_max = random_wdot_max(st);
+
+ if (st->pb0)
+ {
+ delete_body(st->pb0);
+ st->pb0 = NULL;
+ }
+ st->pb0 = new_body(st);
+ st->pb0->x_origin = st->pb0->x = st->x_offset;
+ st->pb0->y_origin = st->pb0->y = st->y_offset;
+
+ if (st->uncleared)
+ {
+ st->eraser = erase_window (st->dpy, st->window, st->eraser);
+ st->uncleared = 0;
+ }
+
+ precalculate_figure(st->pb0, st->xtime, st->timestep_coarse,
+ &st->xmax, &st->ymax, &st->xmin, &st->ymin);
+
+ rescale_circles(st, st->pb0, st->xmax, st->ymax, st->xmin, st->ymin);
+
+ move_body(st->pb0, 0.0); /* move once to avoid initial line from origin */
+ move_body(st->pb0, 0.0); /* move once to avoid initial line from origin */
+
+
+ st->T = 0.0; /* start at time zero. */
+
+ st->L = compute_divisor_lcm(st->pb0->epicycles);
+
+ st->colour_cycle_rate = labs(st->L);
+
+ st->xtime = fabs(st->L * st->circle / st->wdot_max);
+
+ if (st->colors) /* (colors==NULL) if mono_p */
+ XSetForeground (st->dpy, st->color0, st->colors[st->pb0->current_color].pixel);
+ }
+
+
+ color_step(st, st->pb0, st->T/st->xtime );
+ draw_body(st, st->pb0, st->color0);
+ st->uncleared = 1;
+
+
+ /* Check if the figure is complete...*/
+ if (st->T > st->xtime)
+ {
+ this_delay = st->holdtime * 1000000;
+ st->restart = 1; /* begin new figure. */
+ }
+
+
+
+ st->T += st->timestep;
+ move_body(st->pb0, st->T);
+
+ return this_delay;
+}
+
+static void
+epicycle_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->restart = 1;
+}
+
+static Bool
+epicycle_event (Display *dpy, Window window, void *closure, XEvent *e)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, e))
+ {
+ st->restart = 1;
+ return True;
+ }
+
+ return False;
+}
+
+static void
+epicycle_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+XSCREENSAVER_MODULE ("Epicycle", epicycle)
diff --git a/hacks/epicycle.man b/hacks/epicycle.man
new file mode 100644
index 0000000..290884f
--- /dev/null
+++ b/hacks/epicycle.man
@@ -0,0 +1,204 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
+.SH NAME
+epicycle - draws a point moving around a circle which moves around a cicle which...
+.SH SYNOPSIS
+.B epicycle
+[\-display \fIhost:display.screen\fP] [\-root] [\-window] [\-mono] [\-install] [\-noinstall] [\-visual \fIviz\fP] [\-colors \fIN\fP] [\-foreground \fIname\fP] [\-color\-shift \fIN\fP] [\-delay \fImicroseconds\fP] [\-holdtime \fIseconds\fP] [\-linewidth \fIN\fP] [\-min_circles \fIN\fP] [\-max_circles \fIN\fP] [\-min_speed \fInumber\fP] [\-max_speed \fInumber\fP] [\-harmonics \fIN\fP] [\-timestep \fInumber\fP] [\-divisor_poisson \fIprobability\fP] [\-size_factor_min \fInumber\fP] [\-size_factor_max \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+The epicycle program draws the path traced out by a point on the edge
+of a circle. That circle rotates around a point on the rim of another
+circle, and so on, several times. The random curves produced can be
+simple or complex, convex or concave, but they are always closed
+curves (they never go in indefinitely).
+
+You can configure both the way the curves are drawn and the way in
+which the random sequence of circles is generated, either with
+command-line options or X resources.
+.SH OPTIONS
+.TP 8
+.B \-display \fIhost:display.screen\fP
+Specifies which X display we should use (see the section DISPLAY NAMES in
+.BR X (1)
+for more information about this option).
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+If we're on a mono display, we have no choice.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-noinstall
+Don't install a private colormap for the window.
+.TP 8
+.B \-visual \fIviz\fP
+Specify which visual to use. Legal values are the name of a visual
+class, or the id number (decimal or hex) of a specific visual.
+Possible choices include
+
+.RS
+default, best, mono, monochrome, gray, grey, color, staticgray, staticcolor,
+truecolor, grayscale, greyscale, pseudocolor, directcolor, \fInumber\fP
+
+If a decimal or hexadecimal number is used,
+.BR XGetVisualInfo (3X)
+is consulted to obtain the required visual.
+.RE
+.TP 8
+.B \-colors \fIN\fP
+How many colors should be used (if possible). The colors are chosen
+randomly.
+.TP 8
+.B \-foreground \fIname\fP
+With
+.BR \-mono ,
+this option selects the foreground colour.
+.TP 8
+.B \-delay \fImicroseconds\fP
+Specifies the delay between drawing successive line segments of the
+path. If you do not specify
+.BR -sync ,
+some X servers may batch up several drawing operations together,
+producing a less smooth effect. This is more likely to happen
+in monochrome mode (on monochrome servers or when
+.B \-mono
+is specified).
+.TP 8
+.B \-holdtime \fIseconds\fP
+When the figure is complete,
+.I epicycle
+pauses this number of seconds.
+.TP 8
+.B \-linewidth \fIN\fP
+Width in pixels of the body's track. Specifying values greater than
+one may cause slower drawing. The fastest value is usually zero,
+meaning one pixel.
+.TP 8
+.B \-min_circles \fIN\fP
+Smallest number of epicycles in the figure.
+.TP 8
+.B \-max_circles \fIN\fP
+Largest number of epicycles in the figure.
+.TP 8
+.B \-min_speed \fInumber\fP
+Smallest possible value for the base speed of revolution of the
+epicycles. The actual speeds of the epicycles vary from this down
+to
+.IB "min_speed / harmonics" .
+.TP 8
+.B \-max_speed \fInumber\fP
+Smallest possible value for the base speed of revolution of the
+epicycles.
+.TP 8
+.B \-harmonics \fIN\fP
+Number of possible harmonics; the larger this value is, the greater
+the possible variety of possible speeds of epicycle.
+.TP 8
+.B \-timestep \fInumber\fP
+Decreasing this value will reduce the distance the body moves for
+each line segment, possibly producing a smoother figure. Increasing
+it may produce faster results.
+.TP 8
+.B \-divisor_poisson \fIprobability\fP
+Each epicycle rotates at a rate which is a factor of the base speed.
+The speed of each epicycle is the base speed divided by some integer
+between 1 and the value of the
+.B \-harmonics
+option. This integer is decided by starting at 1 and tossing
+a biased coin. For each consecutive head, the value is incremented by
+one. The integer will not be incremented above the value of the
+.B \-harmonics
+option. The argument of this option decides the bias of the coin; it
+is the probability that that coin will produce a head at any given toss.
+.TP 8
+.B \-size_factor_min \fInumber\fP
+Epicycles are always at least this factor smaller than their
+parents.
+.TP 8
+.B \-size_factor_max \fInumber\fP
+Epicycles are never more than this factor smaller than their parents.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH RESOURCES
+.EX
+Option Resource Default Value
+------ -------- -------------
+-colors .colors 100
+-delay .delay 1000
+-holdtime .holdtime 2
+-linewidth .lineWidth 4
+-min_circles .minCircles 2
+-max_circles .maxCircles 10
+-min_speed .minSpeed 0.003
+-max_speed .maxSpeed 0.005
+-harmonics .harmonics 8
+-timestep .timestep 1.0
+-divisor_poisson .divisorPoisson 0.4
+-size_factor_min .sizeFactorMin 1.05
+-size_factor_max .sizeFactorMax 2.05
+ .timestepCoarseFactor 1.0
+.EE
+Before the drawing of the figure is begun, a preliminary calculation
+of the path is done in order to scale the radii of the epicycles so
+as to fit the figure on the screen or window. For the sake of speed,
+This calculation is done with a larger timestep than the actual
+drawing. The time-step used is the value of the
+.B \-timestep
+option multiplied by the timestepCoarseFactor resource. The default
+value of 1 will almost always work fast enough and so this resource
+is not available as a command-line option.
+.SH USER INTERFACE
+The program runs mostly without user interaction. When running on the
+root window, no input is accepted. When running in its own window,
+the program will exit if mouse button 3 is pressed. If any other
+mouse button is pressed, the current figure will be abandoned and
+another will be started.
+.SH HISTORY
+The geometry of epicycles was perfected by Hipparchus of Rhodes at
+some time around 125 B.C., 185 years after the birth of Aristarchus of
+Samos, the inventor of the heliocentric universe model. Hipparchus
+applied epicycles to the Sun and the Moon. Ptolemy of Alexandria went
+on to apply them to what was then the known universe, at around 150
+A.D. Copernicus went on to apply them to the heliocentric model at
+the beginning of the sixteenth century. Johannes Kepler discovered
+that the planets actually move in elliptical orbits in about 1602.
+The inverse-square law of gravity was suggested by Boulliau in 1645.
+Isaac Newton's
+.I Principia Mathematica
+was published in 1687, and proved that Kepler's laws derived from
+Newtonian gravitation.
+.SH BUGS
+The colour selection is re-done for every figure. This may
+generate too much network traffic for this program to work well
+over slow or long links.
+.SH COPYRIGHT
+Copyright \(co 1998, James Youngman. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+James Youngman <jay@gnu.org>, April 1998.
diff --git a/hacks/eruption.c b/hacks/eruption.c
new file mode 100644
index 0000000..629cb8e
--- /dev/null
+++ b/hacks/eruption.c
@@ -0,0 +1,526 @@
+/* Eruption, Copyright (c) 2002-2003 W.P. van Paassen <peter@paassen.tmfweb.nl>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Module - "eruption.c"
+ *
+ * [02-2003] - W.P. van Paassen: Improvements, added some code of jwz from the pyro hack for a spherical distribution of the particles
+ * [01-2003] - W.P. van Paassen: Port to X for use with XScreenSaver, the shadebob hack by Shane Smit was used as a template
+ * [04-2002] - W.P. van Paassen: Creation for the Demo Effects Collection (http://demo-effects.sourceforge.net)
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+/*#define VERBOSE*/
+
+/* Slightly whacked, for better explosions
+ */
+#define PI_2000 6284
+#define SPREAD 15
+
+/*particle structure*/
+typedef struct
+{
+ short xpos, ypos, xdir, ydir;
+ unsigned char colorindex;
+ unsigned char dead;
+} PARTICLE;
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ int sin_cache[PI_2000];
+ int cos_cache[PI_2000];
+
+ PARTICLE *particles;
+ unsigned short iWinWidth, iWinHeight;
+ unsigned char **fire;
+ unsigned short nParticleCount;
+ unsigned char xdelta, ydelta, decay;
+ signed char gravity;
+ signed short heat;
+
+ int cycles, delay;
+ GC gc;
+ signed short iColorCount;
+ unsigned long *aiColorVals;
+ XImage *pImage;
+
+ int draw_i;
+};
+
+static void
+cache(struct state *st) /* jwz */
+{ /*needs to be run once. Could easily be */
+ int i; /*reimplemented to run and cache at compile-time,*/
+ double dA;
+ for (i=0; i<PI_2000; i++)
+ {
+ dA=sin(((double) (random() % (PI_2000/2)))/1000.0);
+ /*Emulation of spherical distribution*/
+ dA+=asin(frand(1.0))/M_PI_2*0.1;
+ /*Approximating the integration of the binominal, for
+ well-distributed randomness*/
+ st->cos_cache[i]=-abs((int) (cos(((double)i)/1000.0)*dA*st->ydelta));
+ st->sin_cache[i]=(int) (sin(((double)i)/1000.0)*dA*st->xdelta);
+ }
+}
+
+static void init_particle(struct state *st, PARTICLE* particle, unsigned short xcenter, unsigned short ycenter)
+{
+ int v = random() % PI_2000;
+ particle->xpos = xcenter - SPREAD + (random() % (SPREAD * 2));
+ particle->ypos = ycenter - SPREAD + (random() % (SPREAD * 2));;
+ particle->xdir = st->sin_cache[v];
+ particle->ydir = st->cos_cache[v];
+ particle->colorindex = st->iColorCount-1;
+ particle->dead = 0;
+}
+
+static void Execute( struct state *st )
+{
+ int i, j;
+ unsigned int temp;
+
+ /* move and draw particles into st->fire array */
+
+ for (i = 0; i < st->nParticleCount; i++)
+ {
+ if (!st->particles[i].dead)
+ {
+ st->particles[i].xpos += st->particles[i].xdir;
+ st->particles[i].ypos += st->particles[i].ydir;
+
+ /* is particle dead? */
+
+ if (st->particles[i].colorindex == 0)
+ {
+ st->particles[i].dead = 1;
+ continue;
+ }
+
+ if (st->particles[i].xpos < 1)
+ {
+ st->particles[i].xpos = 1;
+ st->particles[i].xdir = -st->particles[i].xdir - 4;
+ st->particles[i].colorindex = st->iColorCount;
+ }
+ else if (st->particles[i].xpos >= st->iWinWidth - 2)
+ {
+ st->particles[i].xpos = st->iWinWidth - 2;
+ if (st->particles[i].xpos < 1) st->particles[i].xpos = 1;
+ st->particles[i].xdir = -st->particles[i].xdir + 4;
+ st->particles[i].colorindex = st->iColorCount;
+ }
+
+ if (st->particles[i].ypos < 1)
+ {
+ st->particles[i].ypos = 1;
+ st->particles[i].ydir = -st->particles[i].ydir;
+ st->particles[i].colorindex = st->iColorCount;
+ }
+ else if (st->particles[i].ypos >= st->iWinHeight - 3)
+ {
+ st->particles[i].ypos = st->iWinHeight- 3;
+ if (st->particles[i].ypos < 1) st->particles[i].ypos = 1;
+ st->particles[i].ydir = (-st->particles[i].ydir >> 2) - (random() % 2);
+ st->particles[i].colorindex = st->iColorCount;
+ }
+
+
+ /* st->gravity kicks in */
+ st->particles[i].ydir += st->gravity;
+
+ /* particle cools off */
+ st->particles[i].colorindex--;
+
+ /* draw particle */
+ if (st->iWinHeight <= 2 || st->iWinWidth <= 2) continue;
+ st->fire[st->particles[i].ypos][st->particles[i].xpos] = st->particles[i].colorindex;
+ st->fire[st->particles[i].ypos][st->particles[i].xpos - 1] = st->particles[i].colorindex;
+ st->fire[st->particles[i].ypos + 1][st->particles[i].xpos] = st->particles[i].colorindex;
+ st->fire[st->particles[i].ypos - 1][st->particles[i].xpos] = st->particles[i].colorindex;
+ st->fire[st->particles[i].ypos][st->particles[i].xpos + 1] = st->particles[i].colorindex;
+ }
+ }
+
+ /* create st->fire effect */
+ for (i = 0; i < st->iWinHeight; i++)
+ {
+ for (j = 0; j < st->iWinWidth; j++)
+ {
+ if (j + 1 >= st->iWinWidth)
+ temp = 0;
+ else
+ temp = st->fire[i][j + 1];
+
+ if (j - 1 >= 0)
+ temp += st->fire[i][j - 1];
+
+ if (i - 1 >= 0)
+ {
+ temp += st->fire[i - 1][j];
+ if (j - 1 >= 0)
+ temp += st->fire[i - 1][j - 1];
+ if (j + 1 < st->iWinWidth)
+ temp += st->fire[i - 1][j + 1];
+ }
+
+ if (i + 1 < st->iWinHeight)
+ {
+ temp += st->fire[i + 1][j];
+ if (j + 1 < st->iWinWidth)
+ temp += st->fire[i + 1][j + 1];
+ if (j - 1 >= 0)
+ temp += st->fire[i + 1][j - 1];
+ }
+
+ temp >>= 3;
+
+ if (temp > st->decay)
+ {
+ temp -= st->decay;
+ }
+ else
+ temp = 0;
+
+ st->fire[i][j] = temp;
+ }
+ }
+
+ memset( st->pImage->data, 0, st->pImage->bytes_per_line * st->pImage->height );
+
+ /* draw st->fire array to screen */
+ for (i = 0; i < st->iWinHeight; ++i)
+ {
+ for (j = 0; j < st->iWinWidth; ++j)
+ {
+ if (st->fire[i][j] > 0)
+ XPutPixel( st->pImage, j, i, st->aiColorVals[ st->fire[i][j] ] );
+ }
+ }
+ XPutImage( st->dpy, st->window, st->gc, st->pImage,
+ 0,0,0,0, st->iWinWidth, st->iWinHeight );
+}
+
+static unsigned long * SetPalette(struct state *st)
+{
+ XWindowAttributes XWinAttribs;
+ XColor Color, *aColors;
+ signed short iColor;
+
+ XGetWindowAttributes( st->dpy, st->window, &XWinAttribs );
+
+ st->iColorCount = get_integer_resource(st->dpy, "ncolors", "Integer" );
+ if( st->iColorCount < 16 ) st->iColorCount = 16;
+ if( st->iColorCount > 255 ) st->iColorCount = 256;
+
+ aColors = calloc( st->iColorCount, sizeof(XColor) );
+ st->aiColorVals = calloc( st->iColorCount, sizeof(unsigned long) );
+
+ Color.red = Color.green = Color.blue = 65535 / st->iColorCount;
+
+ /* create st->fire palette */
+ for( iColor=0; iColor < st->iColorCount; iColor++ )
+ {
+ if (iColor < st->iColorCount >> 3)
+ {
+ /* black to blue */
+ aColors[iColor].red = 0;
+ aColors[iColor].green = 0;
+ aColors[iColor].blue = Color.blue * (iColor << 1);
+ }
+ else if (iColor < st->iColorCount >> 2)
+ {
+ /* blue to red */
+ signed short temp = (iColor - (st->iColorCount >> 3));
+ aColors[iColor].red = Color.red * (temp << 3);
+ aColors[iColor].green = 0;
+ aColors[iColor].blue = 16383 - Color.blue * (temp << 1);
+ }
+ else if (iColor < (st->iColorCount >> 2) + (st->iColorCount >> 3))
+ {
+ /* red to yellow */
+ signed short temp = (iColor - (st->iColorCount >> 2)) << 3;
+ aColors[iColor].red = 65535;
+ aColors[iColor].green = Color.green * temp;
+ aColors[iColor].blue = 0;
+ }
+ else if (iColor < st->iColorCount >> 1)
+ {
+ /* yellow to white */
+ signed int temp = (iColor - ((st->iColorCount >> 2) + (st->iColorCount >> 3))) << 3;
+ aColors[iColor].red = 65535;
+ aColors[iColor].green = 65535;
+ aColors[iColor].blue = Color.blue * temp;
+ }
+ else
+ {
+ /* white */
+ aColors[iColor].red = aColors[iColor].green = aColors[iColor].blue = 65535;
+ }
+
+ if( !XAllocColor( st->dpy, XWinAttribs.colormap, &aColors[ iColor ] ) )
+ {
+ /* start all over with less colors */
+ XFreeColors( st->dpy, XWinAttribs.colormap, st->aiColorVals, iColor, 0 );
+ free( aColors );
+ free( st->aiColorVals );
+ (st->iColorCount)--;
+ aColors = calloc( st->iColorCount, sizeof(XColor) );
+ st->aiColorVals = calloc( st->iColorCount, sizeof(unsigned long) );
+ iColor = -1;
+ }
+ else
+ st->aiColorVals[ iColor ] = aColors[ iColor ].pixel;
+ }
+
+ if (st->heat < st->iColorCount)
+ st->iColorCount = st->heat;
+
+ free( aColors );
+
+ XSetWindowBackground( st->dpy, st->window, st->aiColorVals[ 0 ] );
+
+ return st->aiColorVals;
+}
+
+
+static void Initialize( struct state *st )
+{
+ XGCValues gcValues;
+ XWindowAttributes XWinAttribs;
+ int /*iBitsPerPixel,*/ i;
+
+ /* Create the Image for drawing */
+ XGetWindowAttributes( st->dpy, st->window, &XWinAttribs );
+
+ /* Find the preferred bits-per-pixel. (jwz) */
+ {
+ int pfvc = 0;
+ XPixmapFormatValues *pfv = XListPixmapFormats( st->dpy, &pfvc );
+ for( i=0; i<pfvc; i++ )
+ if( pfv[ i ].depth == XWinAttribs.depth )
+ {
+ /*iBitsPerPixel = pfv[ i ].bits_per_pixel;*/
+ break;
+ }
+ if( pfv )
+ XFree (pfv);
+ }
+
+ /* Create the GC. */
+ st->gc = XCreateGC( st->dpy, st->window, 0, &gcValues );
+
+ st->pImage = XCreateImage( st->dpy, XWinAttribs.visual, XWinAttribs.depth, ZPixmap, 0, NULL,
+ XWinAttribs.width, XWinAttribs.height, BitmapPad( st->dpy ), 0 );
+ (st->pImage)->data = calloc((st->pImage)->bytes_per_line, (st->pImage)->height);
+
+ st->iWinWidth = XWinAttribs.width;
+ st->iWinHeight = XWinAttribs.height;
+
+ /* create st->fire array */
+ st->fire = calloc( st->iWinHeight, sizeof(unsigned char*));
+ for (i = 0; i < st->iWinHeight; ++i)
+ st->fire[i] = calloc( st->iWinWidth, sizeof(unsigned char));
+
+ /*create st->particles */
+ st->particles = malloc (st->nParticleCount * sizeof(PARTICLE));
+}
+
+static void *
+eruption_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XWindowAttributes XWinAttribs;
+ unsigned short sum = 0;
+#ifdef VERBOSE
+ time_t nTime = time( NULL );
+ unsigned short iFrame = 0;
+#endif /* VERBOSE */
+
+ st->dpy = dpy;
+ st->window = window;
+
+ st->nParticleCount = get_integer_resource(st->dpy, "particles", "Integer" );
+ if (st->nParticleCount < 100)
+ st->nParticleCount = 100;
+ if (st->nParticleCount > 2000)
+ st->nParticleCount = 2000;
+
+ st->decay = get_integer_resource(st->dpy, "cooloff", "Integer" );
+ if (st->decay <= 0)
+ st->decay = 0;
+ if (st->decay > 10)
+ st->decay = 10;
+
+ st->gravity = get_integer_resource(st->dpy, "gravity", "Integer" );
+ if (st->gravity < -5)
+ st->gravity = -5;
+ if (st->gravity > 5)
+ st->gravity = 5;
+
+ st->heat = get_integer_resource(st->dpy, "heat", "Integer" );
+ if (st->heat < 64)
+ st->heat = 64;
+ if (st->heat > 256)
+ st->heat = 256;
+
+#ifdef VERBOSE
+ printf( "%s: Allocated %d st->particles\n", progclass, st->nParticleCount );
+#endif /* VERBOSE */
+
+ Initialize( st );
+
+ st->ydelta = 0;
+ while (sum < (st->iWinHeight >> 1) - SPREAD)
+ {
+ st->ydelta++;
+ sum += st->ydelta;
+ }
+
+ sum = 0;
+ while (sum < (st->iWinWidth >> 3))
+ {
+ st->xdelta++;
+ sum += st->xdelta;
+ }
+
+ st->delay = get_integer_resource(st->dpy, "delay", "Integer" );
+ st->cycles = get_integer_resource(st->dpy, "cycles", "Integer" );
+
+ cache(st);
+
+ XGetWindowAttributes( st->dpy, st->window, &XWinAttribs );
+ XFreeColors( st->dpy, XWinAttribs.colormap, st->aiColorVals, st->iColorCount, 0 );
+ free( st->aiColorVals );
+ st->aiColorVals = SetPalette( st );
+ XClearWindow( st->dpy, st->window );
+ memset( st->pImage->data, 0, st->pImage->bytes_per_line * st->pImage->height );
+
+ st->draw_i = -1;
+
+ return st;
+}
+
+
+static unsigned long
+eruption_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if( st->draw_i < 0 || st->draw_i++ >= st->cycles )
+ {
+ /* compute random center */
+ unsigned short xcenter, ycenter;
+ xcenter = random() % st->iWinWidth;
+ ycenter = random() % st->iWinHeight;
+
+ for (st->draw_i = 0; st->draw_i < st->nParticleCount; st->draw_i++)
+ init_particle(st, st->particles + st->draw_i, xcenter, ycenter);
+ st->draw_i = 0;
+ }
+
+ Execute( st );
+
+#ifdef VERBOSE
+ iFrame++;
+ if( nTime - time( NULL ) )
+ {
+ printf( "%s: %d FPS\n", progclass, iFrame );
+ nTime = time( NULL );
+ iFrame = 0;
+ }
+#endif /* VERBOSE */
+
+ return st->delay;
+}
+
+
+static void
+eruption_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ XWindowAttributes XWinAttribs;
+ int i;
+
+ for (i = 0; i < st->iWinHeight; ++i)
+ free (st->fire[i]);
+
+ st->iWinWidth = w;
+ st->iWinHeight = h;
+
+ free (st->fire);
+ st->fire = calloc( st->iWinHeight, sizeof(unsigned char*));
+ for (i = 0; i < st->iWinHeight; ++i)
+ st->fire[i] = calloc( st->iWinWidth, sizeof(unsigned char));
+
+ XDestroyImage( st->pImage );
+ XGetWindowAttributes( st->dpy, st->window, &XWinAttribs );
+ st->pImage = XCreateImage( st->dpy, XWinAttribs.visual, XWinAttribs.depth, ZPixmap, 0, NULL,
+ XWinAttribs.width, XWinAttribs.height, BitmapPad( st->dpy ), 0 );
+ (st->pImage)->data = calloc((st->pImage)->bytes_per_line, (st->pImage)->height);
+
+ st->draw_i = -1;
+}
+
+static Bool
+eruption_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+eruption_free (Display *dpy, Window window, void *closure)
+{
+#if 0
+ struct state *st = (struct state *) closure;
+ XDestroyImage( st->pImage );
+ free( st->aiColorVals );
+ for (i = 0; i < st->iWinHeight; ++i)
+ free( st->fire[i] );
+ free( st->fire );
+ free( st->particles );
+#endif
+}
+
+
+static const char *eruption_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsTop: true",
+ "*cycles: 80",
+ "*ncolors: 256",
+ "*delay: 10000",
+ "*particles: 300",
+ "*cooloff: 2",
+ "*gravity: 1",
+ "*heat: 256",
+ 0
+};
+
+static XrmOptionDescRec eruption_options [] = {
+ { "-ncolors", ".ncolors", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-cycles", ".cycles", XrmoptionSepArg, 0 },
+ { "-particles", ".particles", XrmoptionSepArg, 0 },
+ { "-cooloff", ".cooloff", XrmoptionSepArg, 0 },
+ { "-gravity", ".gravity", XrmoptionSepArg, 0 },
+ { "-heat", ".heat", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("Eruption", eruption)
+
+/* End of Module - "eruption.c" */
+
diff --git a/hacks/eruption.man b/hacks/eruption.man
new file mode 100644
index 0000000..032b3bd
--- /dev/null
+++ b/hacks/eruption.man
@@ -0,0 +1,77 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+Eruption \- eruption of pieces of hot volcanic rock
+.SH SYNOPSIS
+.B Eruption
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-ncolors \fInumber\fP]
+[\-nParticles \fInumber\fP]
+[\-Heat \fInumber\fP]
+[\-Cooling \fInumber\fP]
+[\-Gravity \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+This hack creates an eruption of pieces of hot volcanic rock.
+Ported from the demo effects collection (http://demo-effects.sourceforge.net)
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 256.
+.TP 8
+.B \-particles \fInumber\fP
+Number of Particles. Default: 300.
+.TP 8
+.B \-cooloff \fInumber\fP
+Eruption Cooloff. Default: 2.
+.TP 8
+.B \-heat \fInumber\fP
+Heat of Eruption. Default: 256.
+.TP 8
+.B \-gravity \fInumber\fP
+Gravity. Default: 1.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 5000 (0.01 seconds.).
+.TP 8
+.B \-cycles \fInumber\fP
+Duration. 10 - 3000. Default: 80.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002-2003 by W.P. van Paassen. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+ suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+W.P. van Paassen
diff --git a/hacks/euler2d.c b/hacks/euler2d.c
new file mode 100644
index 0000000..d42a2bb
--- /dev/null
+++ b/hacks/euler2d.c
@@ -0,0 +1,887 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* euler2d --- 2 Dimensional Incompressible Inviscid Fluid Flow */
+
+#if 0
+static const char sccsid[] = "@(#)euler2d.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*
+ * Copyright (c) 2000 by Stephen Montgomery-Smith <stephen@math.missouri.edu>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 04-Nov-2000: Added an option eulerpower. This allows for example the
+ * quasi-geostrophic equation by setting eulerpower to 2.
+ * 01-Nov-2000: Allocation checks.
+ * 10-Sep-2000: Added optimizations, and removed subtle_perturb, by stephen.
+ * 03-Sep-2000: Changed method of solving ode to Adams-Bashforth of order 2.
+ * Previously used a rather compilcated method of order 4.
+ * This doubles the speed of the program. Also it seems
+ * to have improved numerical stability. Done by stephen.
+ * 27-Aug-2000: Added rotation of region to maximize screen fill by stephen.
+ * 05-Jun-2000: Adapted from flow.c Copyright (c) 1996 by Tim Auckland
+ * 18-Jul-1996: Adapted from swarm.c Copyright (c) 1991 by Patrick J. Naughton.
+ * 31-Aug-1990: Adapted from xswarm by Jeff Butterworth. (butterwo@ncsc.org)
+ */
+
+/*
+ * The mathematical aspects of this program are discussed in the file
+ * euler2d.tex.
+ */
+
+#ifdef STANDALONE
+# define MODE_euler2d
+# define DEFAULTS "*delay: 10000 \n" \
+ "*count: 1024 \n" \
+ "*cycles: 3000 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n" \
+
+# define SMOOTH_COLORS
+# define release_euler2d 0
+# define reshape_euler2d 0
+# define euler2d_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_euler2d
+
+#define DEF_EULERTAIL "10"
+
+#define DEBUG_POINTED_REGION 0
+
+static int tail_len;
+static int variable_boundary = 1;
+static float power = 1;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-eulertail", ".euler2d.eulertail", XrmoptionSepArg, NULL},
+ {"-eulerpower", ".euler2d.eulerpower", XrmoptionSepArg, NULL},
+};
+static argtype vars[] =
+{
+ {&tail_len, "eulertail",
+ "EulerTail", (char *) DEF_EULERTAIL, t_Int},
+ {&power, "eulerpower",
+ "EulerPower", "1", t_Float},
+};
+static OptionStruct desc[] =
+{
+ {"-eulertail len", "Length of Euler2d tails"},
+ {"-eulerpower power", "power of interaction law for points for Euler2d"},
+};
+
+ENTRYPOINT ModeSpecOpt euler2d_opts =
+{sizeof opts / sizeof opts[0], opts,
+ sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct euler2d_description = {
+ "euler2d", "init_euler2d", "draw_euler2d", (char *) NULL,
+ "refresh_euler2d", "init_euler2d", "free_euler2d", &euler2d_opts,
+ 1000, 1024, 3000, 1, 64, 1.0, "",
+ "Simulates 2D incompressible invisid fluid.", 0, NULL
+};
+
+#endif
+
+#define balance_rand(v) ((LRAND()/MAXRAND*(v))-((v)/2)) /* random around 0 */
+#define positive_rand(v) (LRAND()/MAXRAND*(v)) /* positive random */
+
+#define number_of_vortex_points 20
+
+#define n_bound_p 500
+#define deg_p 6
+
+static double delta_t;
+
+typedef struct {
+ int width;
+ int height;
+ int count;
+ double xshift,yshift,scale;
+ double xshift2,yshift2;
+ double radius;
+
+ int N;
+ int Nvortex;
+
+/* x[2i+0] = x coord for nth point
+ x[2i+1] = y coord for nth point
+ w[i] = vorticity at nth point
+*/
+ double *x;
+ double *w;
+
+ double *diffx;
+ double *olddiffx;
+ double *tempx;
+ double *tempdiffx;
+/* (xs[2i+0],xs[2i+1]) is reflection of (x[2i+0],x[2i+1]) about unit circle
+ xs[2i+0] = x[2i+0]/nx
+ xs[2i+1] = x[2i+1]/nx
+ where
+ nx = x[2i+0]*x[2i+0] + x[2i+1]*x[2i+1]
+
+ x_is_zero[i] = (nx < 1e-10)
+*/
+ double *xs;
+ short *x_is_zero;
+
+/* (p[2i+0],p[2i+1]) is image of (x[2i+0],x[2i+1]) under polynomial p.
+ mod_dp2 is |p'(z)|^2 when z = (x[2i+0],x[2i+1]).
+*/
+ double *p;
+ double *mod_dp2;
+
+/* Sometimes in our calculations we get overflow or numbers that are too big.
+ If that happens with the point x[2*i+0], x[2*i+1], we set dead[i].
+*/
+ short *dead;
+
+ XSegment *csegs;
+ int cnsegs;
+ XSegment *old_segs;
+ int *nold_segs;
+ int c_old_seg;
+ int boundary_color;
+ int hide_vortex;
+ short *lastx;
+
+ double p_coef[2*(deg_p-1)];
+ XSegment *boundary;
+
+} euler2dstruct;
+
+static euler2dstruct *euler2ds = (euler2dstruct *) NULL;
+
+/*
+ If variable_boundary == 1, then we make a variable boundary.
+ The way this is done is to map the unit disk under a
+ polynomial p, where
+ p(z) = z + c_2 z^2 + ... + c_n z^n
+ where n = deg_p. sp->p_coef contains the complex numbers
+ c_2, c_3, ... c_n.
+*/
+
+#define add(a1,a2,b1,b2) (a1)+=(b1);(a2)+=(b2)
+#define mult(a1,a2,b1,b2) temp=(a1)*(b1)-(a2)*(b2); \
+ (a2)=(a1)*(b2)+(a2)*(b1);(a1)=temp
+
+static void
+calc_p(double *p1, double *p2, double z1, double z2, double p_coef[])
+{
+ int i;
+ double temp;
+
+ *p1=0;
+ *p2=0;
+ for(i=deg_p;i>=2;i--)
+ {
+ add(*p1,*p2,p_coef[(i-2)*2],p_coef[(i-2)*2+1]);
+ mult(*p1,*p2,z1,z2);
+ }
+ add(*p1,*p2,1,0);
+ mult(*p1,*p2,z1,z2);
+}
+
+/* Calculate |p'(z)|^2 */
+static double
+calc_mod_dp2(double z1, double z2, double p_coef[])
+{
+ int i;
+ double temp,mp1,mp2;
+
+ mp1=0;
+ mp2=0;
+ for(i=deg_p;i>=2;i--)
+ {
+ add(mp1,mp2,i*p_coef[(i-2)*2],i*p_coef[(i-2)*2+1]);
+ mult(mp1,mp2,z1,z2);
+ }
+ add(mp1,mp2,1,0);
+ return mp1*mp1+mp2*mp2;
+}
+
+static void
+calc_all_p(euler2dstruct *sp)
+{
+ int i,j;
+ double temp,p1,p2,z1,z2;
+ for(j=(sp->hide_vortex?sp->Nvortex:0);j<sp->N;j++) if(!sp->dead[j])
+ {
+ p1=0;
+ p2=0;
+ z1=sp->x[2*j+0];
+ z2=sp->x[2*j+1];
+ for(i=deg_p;i>=2;i--)
+ {
+ add(p1,p2,sp->p_coef[(i-2)*2],sp->p_coef[(i-2)*2+1]);
+ mult(p1,p2,z1,z2);
+ }
+ add(p1,p2,1,0);
+ mult(p1,p2,z1,z2);
+ sp->p[2*j+0] = p1;
+ sp->p[2*j+1] = p2;
+ }
+}
+
+static void
+calc_all_mod_dp2(double *x, euler2dstruct *sp)
+{
+ int i,j;
+ double temp,mp1,mp2,z1,z2;
+ for(j=0;j<sp->N;j++) if(!sp->dead[j])
+ {
+ mp1=0;
+ mp2=0;
+ z1=x[2*j+0];
+ z2=x[2*j+1];
+ for(i=deg_p;i>=2;i--)
+ {
+ add(mp1,mp2,i*sp->p_coef[(i-2)*2],i*sp->p_coef[(i-2)*2+1]);
+ mult(mp1,mp2,z1,z2);
+ }
+ add(mp1,mp2,1,0);
+ sp->mod_dp2[j] = mp1*mp1+mp2*mp2;
+ }
+}
+
+static void
+derivs(double *x, euler2dstruct *sp)
+{
+ int i,j;
+ double u1,u2,x1,x2,xij1,xij2,nxij;
+ double nx;
+
+ if (variable_boundary)
+ calc_all_mod_dp2(sp->x,sp);
+
+ for (j=0;j<sp->Nvortex;j++) if (!sp->dead[j])
+ {
+ nx = x[2*j+0]*x[2*j+0] + x[2*j+1]*x[2*j+1];
+ if (nx < 1e-10)
+ sp->x_is_zero[j] = 1;
+ else {
+ sp->x_is_zero[j] = 0;
+ sp->xs[2*j+0] = x[2*j+0]/nx;
+ sp->xs[2*j+1] = x[2*j+1]/nx;
+ }
+ }
+
+ (void) memset(sp->diffx,0,sizeof(double)*2*sp->N);
+
+ for (i=0;i<sp->N;i++) if (!sp->dead[i])
+ {
+ x1 = x[2*i+0];
+ x2 = x[2*i+1];
+ for (j=0;j<sp->Nvortex;j++) if (!sp->dead[j])
+ {
+/*
+ Calculate the Biot-Savart kernel, that is, effect of a
+ vortex point at a = (x[2*j+0],x[2*j+1]) at the point
+ x = (x1,x2), returning the vector field in (u1,u2).
+
+ In the plane, this is given by the formula
+
+ u = (x-a)/|x-a|^2 or zero if x=a.
+
+ However, in the unit disk we have to subtract from the
+ above:
+
+ (x-as)/|x-as|^2
+
+ where as = a/|a|^2 is the reflection of a about the unit circle.
+
+ If however power != 1, then
+
+ u = (x-a)/|x-a|^(power+1) - |a|^(1-power) (x-as)/|x-as|^(power+1)
+
+*/
+
+ xij1 = x1 - x[2*j+0];
+ xij2 = x2 - x[2*j+1];
+ nxij = (power==1.0) ? xij1*xij1+xij2*xij2 : pow(xij1*xij1+xij2*xij2,(power+1)/2.0);
+
+ if(nxij >= 1e-4) {
+ u1 = xij2/nxij;
+ u2 = -xij1/nxij;
+ }
+ else
+ u1 = u2 = 0.0;
+
+ if (!sp->x_is_zero[j])
+ {
+ xij1 = x1 - sp->xs[2*j+0];
+ xij2 = x2 - sp->xs[2*j+1];
+ nxij = (power==1.0) ? xij1*xij1+xij2*xij2 : pow(xij1*xij1+xij2*xij2,(power+1)/2.0);
+
+ if (nxij < 1e-5)
+ {
+ sp->dead[i] = 1;
+ u1 = u2 = 0.0;
+ }
+ else
+ {
+ u1 -= xij2/nxij;
+ u2 += xij1/nxij;
+ }
+ }
+
+ if (!sp->dead[i])
+ {
+ sp->diffx[2*i+0] += u1*sp->w[j];
+ sp->diffx[2*i+1] += u2*sp->w[j];
+ }
+ }
+
+ if (!sp->dead[i] && variable_boundary)
+ {
+ if (sp->mod_dp2[i] < 1e-5)
+ sp->dead[i] = 1;
+ else
+ {
+ sp->diffx[2*i+0] /= sp->mod_dp2[i];
+ sp->diffx[2*i+1] /= sp->mod_dp2[i];
+ }
+ }
+ }
+}
+
+/*
+ What perturb does is effectively
+ ret = x + k,
+ where k should be of order delta_t.
+
+ We have the option to do this more subtly by mapping points x
+ in the unit disk to points y in the plane, where y = f(|x|) x,
+ with f(t) = -log(1-t)/t.
+
+ This might reduce (but does not remove) problems where particles near
+ the edge of the boundary bounce around.
+
+ But it seems to be not that effective, so for now switch it off.
+*/
+
+#define SUBTLE_PERTURB 0
+
+static void
+perturb(double ret[], double x[], double k[], euler2dstruct *sp)
+{
+ int i;
+ double x1,x2,k1,k2;
+
+#if SUBTLE_PERTURB
+ double d1,d2,t1,t2,mag,mag2,mlog1mmag,memmagdmag,xdotk;
+ for (i=0;i<sp->N;i++) if (!sp->dead[i])
+ {
+ x1 = x[2*i+0];
+ x2 = x[2*i+1];
+ k1 = k[2*i+0];
+ k2 = k[2*i+1];
+ mag2 = x1*x1 + x2*x2;
+ if (mag2 < 1e-10)
+ {
+ ret[2*i+0] = x1+k1;
+ ret[2*i+1] = x2+k2;
+ }
+ else if (mag2 > 1-1e-5)
+ sp->dead[i] = 1;
+ else
+ {
+ mag = sqrt(mag2);
+ mlog1mmag = -log(1-mag);
+ xdotk = x1*k1 + x2*k2;
+ t1 = (x1 + k1)*mlog1mmag/mag + x1*xdotk*(1.0/(1-mag)-mlog1mmag/mag)/mag/mag;
+ t2 = (x2 + k2)*mlog1mmag/mag + x2*xdotk*(1.0/(1-mag)-mlog1mmag/mag)/mag/mag;
+ mag = sqrt(t1*t1+t2*t2);
+ if (mag > 11.5 /* log(1e5) */)
+ sp->dead[i] = 1;
+ else
+ {
+ memmagdmag = (mag>1e-5) ? ((1.0-exp(-mag))/mag) : (1-mag/2.0);
+ ret[2*i+0] = t1*memmagdmag;
+ ret[2*i+1] = t2*memmagdmag;
+ }
+ }
+ if (!sp->dead[i])
+ {
+ d1 = ret[2*i+0]-x1;
+ d2 = ret[2*i+1]-x2;
+ if (d1*d1+d2*d2 > 0.1)
+ sp->dead[i] = 1;
+ }
+ }
+
+#else
+
+ for (i=0;i<sp->N;i++) if (!sp->dead[i])
+ {
+ x1 = x[2*i+0];
+ x2 = x[2*i+1];
+ k1 = k[2*i+0];
+ k2 = k[2*i+1];
+ if (k1*k1+k2*k2 > 0.1 || x1*x1+x2*x2 > 1-1e-5)
+ sp->dead[i] = 1;
+ else
+ {
+ ret[2*i+0] = x1+k1;
+ ret[2*i+1] = x2+k2;
+ }
+ }
+#endif
+}
+
+static void
+ode_solve(euler2dstruct *sp)
+{
+ int i;
+ double *temp;
+
+ if (sp->count < 1) {
+ /* midpoint method */
+ derivs(sp->x,sp);
+ (void) memcpy(sp->olddiffx,sp->diffx,sizeof(double)*2*sp->N);
+ for (i=0;i<sp->N;i++) if (!sp->dead[i]) {
+ sp->tempdiffx[2*i+0] = 0.5*delta_t*sp->diffx[2*i+0];
+ sp->tempdiffx[2*i+1] = 0.5*delta_t*sp->diffx[2*i+1];
+ }
+ perturb(sp->tempx,sp->x,sp->tempdiffx,sp);
+ derivs(sp->tempx,sp);
+ for (i=0;i<sp->N;i++) if (!sp->dead[i]) {
+ sp->tempdiffx[2*i+0] = delta_t*sp->diffx[2*i+0];
+ sp->tempdiffx[2*i+1] = delta_t*sp->diffx[2*i+1];
+ }
+ perturb(sp->x,sp->x,sp->tempdiffx,sp);
+ } else {
+ /* Adams Basforth */
+ derivs(sp->x,sp);
+ for (i=0;i<sp->N;i++) if (!sp->dead[i]) {
+ sp->tempdiffx[2*i+0] = delta_t*(1.5*sp->diffx[2*i+0] - 0.5*sp->olddiffx[2*i+0]);
+ sp->tempdiffx[2*i+1] = delta_t*(1.5*sp->diffx[2*i+1] - 0.5*sp->olddiffx[2*i+1]);
+ }
+ perturb(sp->x,sp->x,sp->tempdiffx,sp);
+ temp = sp->olddiffx;
+ sp->olddiffx = sp->diffx;
+ sp->diffx = temp;
+ }
+}
+
+#define deallocate(p,t) if (p!=NULL) {(void) free((void *) p); p=(t*)NULL; }
+#define allocate(p,t,s) if ((p=(t*)malloc(sizeof(t)*s))==NULL)\
+{free_euler2d(mi);return;}
+
+ENTRYPOINT void
+free_euler2d(ModeInfo * mi)
+{
+ euler2dstruct *sp = &euler2ds[MI_SCREEN(mi)];
+ deallocate(sp->csegs, XSegment);
+ deallocate(sp->old_segs, XSegment);
+ deallocate(sp->nold_segs, int);
+ deallocate(sp->lastx, short);
+ deallocate(sp->x, double);
+ deallocate(sp->diffx, double);
+ deallocate(sp->w, double);
+ deallocate(sp->olddiffx, double);
+ deallocate(sp->tempdiffx, double);
+ deallocate(sp->tempx, double);
+ deallocate(sp->dead, short);
+ deallocate(sp->boundary, XSegment);
+ deallocate(sp->xs, double);
+ deallocate(sp->x_is_zero, short);
+ deallocate(sp->p, double);
+ deallocate(sp->mod_dp2, double);
+}
+
+ENTRYPOINT void
+init_euler2d (ModeInfo * mi)
+{
+#define nr_rotates 18 /* how many rotations to try to fill as much of screen as possible - must be even number */
+ euler2dstruct *sp;
+ int i,k,n,np;
+ double r,theta,x,y,w;
+ double mag,xscale,yscale,p1,p2;
+ double low[nr_rotates],high[nr_rotates],pp1,pp2,pn1,pn2,angle1,angle2,tempangle,dist,scale,bestscale,temp;
+ int besti = 0;
+
+ if (power<0.5) power = 0.5;
+ if (power>3.0) power = 3.0;
+ variable_boundary &= power == 1.0;
+ delta_t = 0.001;
+ if (power>1.0) delta_t *= pow(0.1,power-1);
+
+ MI_INIT (mi, euler2ds);
+ sp = &euler2ds[MI_SCREEN(mi)];
+
+#ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (MI_DISPLAY(mi), MI_GC(mi), False);
+#endif
+
+ sp->boundary_color = NRAND(MI_NPIXELS(mi));
+ sp->hide_vortex = NRAND(4) != 0;
+
+ sp->count = 0;
+
+ sp->xshift2 = sp->yshift2 = 0;
+
+ sp->width = MI_WIDTH(mi);
+ sp->height = MI_HEIGHT(mi);
+
+ if (sp->width > sp->height * 5 || /* window has weird aspect */
+ sp->height > sp->width * 5)
+ {
+ if (sp->width > sp->height)
+ {
+ sp->height = sp->width * 0.8;
+ sp->yshift2 = -sp->height/2;
+ }
+ else
+ {
+ sp->width = sp->height * 0.8;
+ sp->xshift2 = -sp->width/2;
+ }
+ }
+
+ sp->N = MI_COUNT(mi)+number_of_vortex_points;
+ sp->Nvortex = number_of_vortex_points;
+
+ if (tail_len < 1) { /* minimum tail */
+ tail_len = 1;
+ }
+ if (tail_len > MI_CYCLES(mi)) { /* maximum tail */
+ tail_len = MI_CYCLES(mi);
+ }
+
+ /* Clear the background. */
+ MI_CLEARWINDOW(mi);
+
+ /* Allocate memory. */
+
+ if (sp->csegs == NULL) {
+ allocate(sp->csegs, XSegment, sp->N);
+ allocate(sp->old_segs, XSegment, sp->N * tail_len);
+ allocate(sp->nold_segs, int, tail_len);
+ allocate(sp->lastx, short, sp->N * 2);
+ allocate(sp->x, double, sp->N * 2);
+ allocate(sp->diffx, double, sp->N * 2);
+ allocate(sp->w, double, sp->Nvortex);
+ allocate(sp->olddiffx, double, sp->N * 2);
+ allocate(sp->tempdiffx, double, sp->N * 2);
+ allocate(sp->tempx, double, sp->N * 2);
+ allocate(sp->dead, short, sp->N);
+ allocate(sp->boundary, XSegment, n_bound_p);
+ allocate(sp->xs, double, sp->Nvortex * 2);
+ allocate(sp->x_is_zero, short, sp->Nvortex);
+ allocate(sp->p, double, sp->N * 2);
+ allocate(sp->mod_dp2, double, sp->N);
+ }
+ for (i=0;i<tail_len;i++) {
+ sp->nold_segs[i] = 0;
+ }
+ sp->c_old_seg = 0;
+ (void) memset(sp->dead,0,sp->N*sizeof(short));
+
+ if (variable_boundary)
+ {
+ /* Initialize polynomial p */
+/*
+ The polynomial p(z) = z + c_2 z^2 + ... c_n z^n needs to be
+ a bijection of the unit disk onto its image. This is achieved
+ by insisting that sum_{k=2}^n k |c_k| <= 1. Actually we set
+ the inequality to be equality (to get more interesting shapes).
+*/
+ mag = 0;
+ for(k=2;k<=deg_p;k++)
+ {
+ r = positive_rand(1.0/k);
+ theta = balance_rand(2*M_PI);
+ sp->p_coef[2*(k-2)+0]=r*cos(theta);
+ sp->p_coef[2*(k-2)+1]=r*sin(theta);
+ mag += k*r;
+ }
+ if (mag > 0.0001) for(k=2;k<=deg_p;k++)
+ {
+ sp->p_coef[2*(k-2)+0] /= mag;
+ sp->p_coef[2*(k-2)+1] /= mag;
+ }
+
+#if DEBUG_POINTED_REGION
+ for(k=2;k<=deg_p;k++){
+ sp->p_coef[2*(k-2)+0]=0;
+ sp->p_coef[2*(k-2)+1]=0;
+ }
+ sp->p_coef[2*(6-2)+0] = 1.0/6.0;
+#endif
+
+
+/* Here we figure out the best rotation of the domain so that it fills as
+ much of the screen as possible. The number of angles we look at is determined
+ by nr_rotates (we look every 180/nr_rotates degrees).
+ While we figure out the best angle to rotate, we also figure out the correct scaling factors.
+*/
+
+ for(k=0;k<nr_rotates;k++) {
+ low[k] = 1e5;
+ high[k] = -1e5;
+ }
+
+ for(k=0;k<n_bound_p;k++) {
+ calc_p(&p1,&p2,cos((double)k/(n_bound_p)*2*M_PI),sin((double)k/(n_bound_p)*2*M_PI),sp->p_coef);
+ calc_p(&pp1,&pp2,cos((double)(k-1)/(n_bound_p)*2*M_PI),sin((double)(k-1)/(n_bound_p)*2*M_PI),sp->p_coef);
+ calc_p(&pn1,&pn2,cos((double)(k+1)/(n_bound_p)*2*M_PI),sin((double)(k+1)/(n_bound_p)*2*M_PI),sp->p_coef);
+ angle1 = nr_rotates/M_PI*atan2(p2-pp2,p1-pp1)-nr_rotates/2;
+ angle2 = nr_rotates/M_PI*atan2(pn2-p2,pn1-p1)-nr_rotates/2;
+ while (angle1<0) angle1+=nr_rotates*2;
+ while (angle2<0) angle2+=nr_rotates*2;
+ if (angle1>nr_rotates*1.75 && angle2<nr_rotates*0.25) angle2+=nr_rotates*2;
+ if (angle1<nr_rotates*0.25 && angle2>nr_rotates*1.75) angle1+=nr_rotates*2;
+ if (angle2<angle1) {
+ tempangle=angle1;
+ angle1=angle2;
+ angle2=tempangle;
+ }
+ for(i=(int)floor(angle1);i<(int)ceil(angle2);i++) {
+ dist = cos((double)i*M_PI/nr_rotates)*p1 + sin((double)i*M_PI/nr_rotates)*p2;
+ if (i%(nr_rotates*2)<nr_rotates) {
+ if (dist>high[i%nr_rotates]) high[i%nr_rotates] = dist;
+ if (dist<low[i%nr_rotates]) low[i%nr_rotates] = dist;
+ }
+ else {
+ if (-dist>high[i%nr_rotates]) high[i%nr_rotates] = -dist;
+ if (-dist<low[i%nr_rotates]) low[i%nr_rotates] = -dist;
+ }
+ }
+ }
+ bestscale = 0;
+ for (i=0;i<nr_rotates;i++) {
+ xscale = (sp->width-5.0)/(high[i]-low[i]);
+ yscale = (sp->height-5.0)/(high[(i+nr_rotates/2)%nr_rotates]-low[(i+nr_rotates/2)%nr_rotates]);
+ scale = (xscale>yscale) ? yscale : xscale;
+ if (scale>bestscale) {
+ bestscale = scale;
+ besti = i;
+ }
+ }
+/* Here we do the rotation. The way we do this is to replace the
+ polynomial p(z) by a^{-1} p(a z) where a = exp(i best_angle).
+*/
+ p1 = 1;
+ p2 = 0;
+ for(k=2;k<=deg_p;k++)
+ {
+ mult(p1,p2,cos((double)besti*M_PI/nr_rotates),sin((double)besti*M_PI/nr_rotates));
+ mult(sp->p_coef[2*(k-2)+0],sp->p_coef[2*(k-2)+1],p1,p2);
+ }
+
+ sp->scale = bestscale;
+ sp->xshift = -(low[besti]+high[besti])/2.0*sp->scale+sp->width/2;
+ if (besti<nr_rotates/2)
+ sp->yshift = -(low[besti+nr_rotates/2]+high[besti+nr_rotates/2])/2.0*sp->scale+sp->height/2;
+ else
+ sp->yshift = (low[besti-nr_rotates/2]+high[besti-nr_rotates/2])/2.0*sp->scale+sp->height/2;
+
+ sp->xshift += sp->xshift2;
+ sp->yshift += sp->yshift2;
+
+/* Initialize boundary */
+
+ for(k=0;k<n_bound_p;k++)
+ {
+
+ calc_p(&p1,&p2,cos((double)k/(n_bound_p)*2*M_PI),sin((double)k/(n_bound_p)*2*M_PI),sp->p_coef);
+ sp->boundary[k].x1 = (short)(p1*sp->scale+sp->xshift);
+ sp->boundary[k].y1 = (short)(p2*sp->scale+sp->yshift);
+ }
+ for(k=1;k<n_bound_p;k++)
+ {
+ sp->boundary[k].x2 = sp->boundary[k-1].x1;
+ sp->boundary[k].y2 = sp->boundary[k-1].y1;
+ }
+ sp->boundary[0].x2 = sp->boundary[n_bound_p-1].x1;
+ sp->boundary[0].y2 = sp->boundary[n_bound_p-1].y1;
+ }
+ else
+ {
+ if (sp->width>sp->height)
+ sp->radius = sp->height/2.0-5.0;
+ else
+ sp->radius = sp->width/2.0-5.0;
+ }
+
+ /* Initialize point positions */
+
+ for (i=sp->Nvortex;i<sp->N;i++) {
+ do {
+ r = sqrt(positive_rand(1.0));
+ theta = balance_rand(2*M_PI);
+ sp->x[2*i+0]=r*cos(theta);
+ sp->x[2*i+1]=r*sin(theta);
+ /* This is to make sure the initial distribution of points is uniform */
+ } while (variable_boundary &&
+ calc_mod_dp2(sp->x[2*i+0],sp->x[2*i+1],sp->p_coef)
+ < positive_rand(4));
+ }
+
+ n = NRAND(4)+2;
+ /* number of vortex points with negative vorticity */
+ if (n%2) {
+ np = NRAND(n+1);
+ }
+ else {
+ /* if n is even make sure that np==n/2 is twice as likely
+ as the other possibilities. */
+ np = NRAND(n+2);
+ if (np==n+1) np=n/2;
+ }
+ for(k=0;k<n;k++)
+ {
+ r = sqrt(positive_rand(0.77));
+ theta = balance_rand(2*M_PI);
+ x=r*cos(theta);
+ y=r*sin(theta);
+ r = 0.02+positive_rand(0.1);
+ w = (2*(k<np)-1)*2.0/sp->Nvortex;
+ for (i=sp->Nvortex*k/n;i<sp->Nvortex*(k+1)/n;i++) {
+ theta = balance_rand(2*M_PI);
+ sp->x[2*i+0]=x + r*cos(theta);
+ sp->x[2*i+1]=y + r*sin(theta);
+ sp->w[i]=w;
+ }
+ }
+}
+
+ENTRYPOINT void
+draw_euler2d (ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GC gc = MI_GC(mi);
+ int b, col, n_non_vortex_segs;
+ euler2dstruct *sp;
+
+ MI_IS_DRAWN(mi) = True;
+
+ if (euler2ds == NULL)
+ return;
+ sp = &euler2ds[MI_SCREEN(mi)];
+ if (sp->csegs == NULL)
+ return;
+
+ ode_solve(sp);
+ if (variable_boundary)
+ calc_all_p(sp);
+
+ sp->cnsegs = 0;
+ for(b=sp->Nvortex;b<sp->N;b++) if(!sp->dead[b])
+ {
+ sp->csegs[sp->cnsegs].x1 = sp->lastx[2*b+0];
+ sp->csegs[sp->cnsegs].y1 = sp->lastx[2*b+1];
+ if (variable_boundary)
+ {
+ sp->csegs[sp->cnsegs].x2 = (short)(sp->p[2*b+0]*sp->scale+sp->xshift);
+ sp->csegs[sp->cnsegs].y2 = (short)(sp->p[2*b+1]*sp->scale+sp->yshift);
+ }
+ else
+ {
+ sp->csegs[sp->cnsegs].x2 = (short)(sp->x[2*b+0]*sp->radius+sp->width/2);
+ sp->csegs[sp->cnsegs].y2 = (short)(sp->x[2*b+1]*sp->radius+sp->height/2);
+ }
+ sp->lastx[2*b+0] = sp->csegs[sp->cnsegs].x2;
+ sp->lastx[2*b+1] = sp->csegs[sp->cnsegs].y2;
+ sp->cnsegs++;
+ }
+ n_non_vortex_segs = sp->cnsegs;
+
+ if (!sp->hide_vortex) for(b=0;b<sp->Nvortex;b++) if(!sp->dead[b])
+ {
+ sp->csegs[sp->cnsegs].x1 = sp->lastx[2*b+0];
+ sp->csegs[sp->cnsegs].y1 = sp->lastx[2*b+1];
+ if (variable_boundary)
+ {
+ sp->csegs[sp->cnsegs].x2 = (short)(sp->p[2*b+0]*sp->scale+sp->xshift);
+ sp->csegs[sp->cnsegs].y2 = (short)(sp->p[2*b+1]*sp->scale+sp->yshift);
+ }
+ else
+ {
+ sp->csegs[sp->cnsegs].x2 = (short)(sp->x[2*b+0]*sp->radius+sp->width/2);
+ sp->csegs[sp->cnsegs].y2 = (short)(sp->x[2*b+1]*sp->radius+sp->height/2);
+ }
+ sp->lastx[2*b+0] = sp->csegs[sp->cnsegs].x2;
+ sp->lastx[2*b+1] = sp->csegs[sp->cnsegs].y2;
+ sp->cnsegs++;
+ }
+
+ if (sp->count) {
+ XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
+
+ XDrawSegments(display, window, gc, sp->old_segs+sp->c_old_seg*sp->N, sp->nold_segs[sp->c_old_seg]);
+
+ if (MI_NPIXELS(mi) > 2){ /* render colour */
+ for (col = 0; col < MI_NPIXELS(mi); col++) {
+ int start = col*n_non_vortex_segs/MI_NPIXELS(mi);
+ int finish = (col+1)*n_non_vortex_segs/MI_NPIXELS(mi);
+ XSetForeground(display, gc, MI_PIXEL(mi, col));
+ XDrawSegments(display, window, gc,sp->csegs+start, finish-start);
+ }
+ if (!sp->hide_vortex) {
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+ XDrawSegments(display, window, gc,sp->csegs+n_non_vortex_segs, sp->cnsegs-n_non_vortex_segs);
+ }
+
+ } else { /* render mono */
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+ XDrawSegments(display, window, gc,
+ sp->csegs, sp->cnsegs);
+ }
+
+ if (MI_NPIXELS(mi) > 2) /* render colour */
+ XSetForeground(display, gc, MI_PIXEL(mi, sp->boundary_color));
+ else
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+ if (variable_boundary)
+ XDrawSegments(display, window, gc,
+ sp->boundary, n_bound_p);
+ else
+ XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+ sp->width/2 - (int) sp->radius - 1, sp->height/2 - (int) sp->radius -1,
+ (int) (2*sp->radius) + 2, (int) (2* sp->radius) + 2, 0, 64*360);
+
+ /* Copy to erase-list */
+ (void) memcpy(sp->old_segs+sp->c_old_seg*sp->N, sp->csegs, sp->cnsegs*sizeof(XSegment));
+ sp->nold_segs[sp->c_old_seg] = sp->cnsegs;
+ sp->c_old_seg++;
+ if (sp->c_old_seg >= tail_len)
+ sp->c_old_seg = 0;
+ }
+
+ if (++sp->count > MI_CYCLES(mi)) /* pick a new flow */
+ init_euler2d(mi);
+
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_euler2d (ModeInfo * mi)
+{
+ MI_CLEARWINDOW(mi);
+}
+#endif
+
+XSCREENSAVER_MODULE ("Euler2D", euler2d)
+
+#endif /* MODE_euler2d */
diff --git a/hacks/euler2d.man b/hacks/euler2d.man
new file mode 100644
index 0000000..ddfd619
--- /dev/null
+++ b/hacks/euler2d.man
@@ -0,0 +1,69 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+euler2d - two dimensional incompressible inviscid fluid flow.
+.SH SYNOPSIS
+.B euler2d
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-eulertail \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Simulates two dimensional incompressible inviscid fluid flow.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+Particles. 2 - 5000. Default: 1024.
+.TP 8
+.B \-eulertail \fInumber\fP
+Trail Length. 2 - 500. Default: 10.
+.TP 8
+.B \-cycles \fInumber\fP
+Duration. 100 - 5000. Default: 3000.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 64.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Stephen Montgomery-Smith. Permission to use,
+copy, modify, distribute, and sell this software and its documentation
+for any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Stephen Montgomery-Smith.
diff --git a/hacks/euler2d.tex b/hacks/euler2d.tex
new file mode 100644
index 0000000..700ad31
--- /dev/null
+++ b/hacks/euler2d.tex
@@ -0,0 +1,337 @@
+\documentclass[12pt]{article}
+
+%\usepackage{fullpage}
+\usepackage{amsmath,amssymb}
+
+\begin{document}
+
+\title{Two Dimensional Euler Simulation}
+
+\author{
+S.J. Montgomery-Smith\\
+Department of Mathematics\\
+University of Missouri\\
+Columbia, MO 65211, U.S.A.\\
+stephen@math.missouri.edu\\
+http://www.math.missouri.edu/\~{}stephen}
+
+\date{September 10, 2000}
+
+\maketitle
+
+This document describes a program I wrote to simulate the
+two dimensional Euler Equation --- a program that is part
+of the {\tt xlock} screensaver as the {\tt euler2d}
+mode. A similar explanation may also be found in the
+book by Chorin \cite{C}.
+
+\section{The Euler Equation}
+
+The Euler Equation describes the motion of an incompressible
+fluid that has no viscosity. If the fluid is contained
+in a domain $\Omega$ with boundary $\partial \Omega$, then
+the equation is in the vector field $u$ (the velocity)
+and the
+scalar field $p$ (the pressure):
+\begin{eqnarray*}
+\frac{\partial}{\partial t} u &=& -u \cdot \nabla u + \nabla p \\
+\nabla \cdot u &=& 0 \\
+u \cdot n &=& 0 \quad \text{on $\partial \Omega$}
+\end{eqnarray*}
+where $n$ is the unit normal to $\partial \Omega$.
+
+\section{Vorticity}
+
+It turns out that it can be easier write these equations
+in terms of the vorticity. In two dimensions the vorticity
+is the scalar $w = \partial u_2/\partial x - \partial u_1/\partial y$.
+The equation for vorticity becomes
+\[ \frac{\partial}{\partial t} w = -u \cdot \nabla w .\]
+A solution to this equation can be written as follows. The velocity
+$u$ causes a flow, that is, a function $\varphi(t,x)$ that tells where
+the particle initially at $x$ ends up at time $t$, that is
+\[
+\frac\partial{\partial t} \varphi(t,x)
+= u(t,\varphi(t,x)) .\]
+Then the equation
+for $w$ tells us that the vorticity is ``pushed'' around by the flow,
+that is, $w(t,\varphi(t,x)) = w(0,x)$.
+
+\section{The Biot-Savart Kernel}
+
+Now, once we have the vorticity, we can recover the velocity $u$ by
+solving the equation
+\begin{eqnarray*}
+\partial u_2/\partial x - \partial u_1/\partial y &=& w \\
+\nabla \cdot u &=& 0 \\
+u \cdot n &=& 0 \quad \text{on $\partial \Omega$}.
+\end{eqnarray*}
+This equation is solved by using a Biot-Savart kernel $K(x,y)$:
+$$ u(x) = \int_\Omega K(x,y) w(y) \, dy .$$
+The function $K$ depends upon the choice of domain. First let us consider
+the case when $\Omega$ is the whole plane (in which case the boundary
+condition $u \cdot n = 0$ is replaced by saying that $u$ decays at infinity).
+Then
+\begin{equation*}
+K(x,y) = K_1(x,y) = c \frac{(x-y)^\perp}{|x-y|^2} .
+\end{equation*}
+Here $x^\perp = (-x_2,x_1)$, and $c$ is a constant, probably something
+like $1/2\pi$. In any case we will set it to be one, which in effect
+is rescaling the time variable, so we don't need to worry about it.
+
+We can use this as a basis to find $K$ on the unit disk
+$\Omega = \Delta = \{x:|x|<1\}$. It turns out to be
+\begin{equation*}
+K_2(x,y) = K_1(x,y) - K_1(x,y^*) ,
+\end{equation*}
+where $y^* = y/|y|^2$ is called the reflection of $y$ about the
+boundary of the unit disk.
+
+Another example is if we have a bijective analytic function
+$p:\Delta \to {\mathbb C}$, and we let $\Omega = p(\Delta)$.
+(Here we think of $\Delta$ as a subset of $\mathbb C$, that is,
+we are identifying the plane with the set of complex numbers.)
+In that case we get
+\[ K_p(p(x),p(y)) = K_2(x,y)/|p'(x)|^2 .\]
+Our simulation considers the last case. Examples of such
+analytic functions include series
+$p(x) = x + \sum_{n=2}^\infty c_n x^n$, where
+$\sum_{n=2}^\infty n |c_n| \le 1$.
+(Thanks to David Ullrich for pointing this out to me.)
+
+\section{The Simulation}
+
+Now let's get to decribing the simulation. We assume a rather
+unusual initial distribution for the vorticity --- that the
+vorticity is a finite sum of dirac delta masses.
+\[ w(0,x) = \sum_{k=1}^N w_k \delta(x-x_k(0)) .\]
+Here $x_k(0)$ is the initial place where the points
+of vorticity are concentrated, with values $w_k$.
+Then at time $t$, the vorticity becomes
+\[ w(t,x) = \sum_{k=1}^N w_k \delta(x-x_k(t)) .\]
+The points of fluid $x_k(t)$ are pushed by the
+flow, that is, $x_k(t) = \varphi(t,x_k(0))$, or
+\[ \frac{\partial}{\partial t} x_k(t) = u(t,x_k(t)) .\]
+Putting this all together, we finally obtain the equations
+\[ \frac{\partial}{\partial t} x_k = \alpha_k \]
+where
+\[ \alpha_k = \sum_{l=1}^N w_l K(x_k,x_l) .\]
+This is the equation that our simulation solves.
+
+In fact, in our case, where the domain is $p(\Delta)$,
+the points are described by points
+$\tilde x_k$, where $x_k = p(\tilde x_k)$. Then
+the equations become
+\begin{eqnarray}
+\label{tildex-p1}
+\frac{\partial}{\partial t} \tilde x_k &=& \tilde\alpha_k \\
+\label{tildex-p2}
+\tilde\alpha_k &=& \frac1{|p'(\tilde x_k)|^2}
+ \sum_{l=1}^N w_l K_2(\tilde x_k,\tilde x_l) .
+\end{eqnarray}
+
+We solve this $2N$ system of equations using standard
+numerical methods, in our case, using the second order midpoint method
+for the first step, and thereafter using the second order Adams-Bashforth
+method. (See for example the book
+by Burden and Faires \cite{BF}).
+
+\section{The Program - Data Structures}
+
+The computer program solves equation (\ref{tildex-p1}), and displays
+the results on the screen, with a boundary. All the information
+for solving the equation and displaying the output is countained
+in the structure {\tt euler2dstruct}. Let us describe some of
+the fields in {\tt euler2dstruct}.
+The points $\tilde x_k$ are contained
+in {\tt double *x}: with the coordinates of
+$\tilde x_k$ being the two numbers
+{\tt x[2*k+0]}, {\tt x[2*k+1]}. The values $w_k$ are contained
+in {\tt double *w}. The total number of points is
+{\tt int N}. (But only the first {\tt int Nvortex} points
+have $w_k \ne 0$.) The coefficients of the analytic function
+(in our case a polynomial) $p$
+are contained in {\tt double p\_coef[2*(deg\_p-1)]} --- here
+{\tt deg\_p} is the degree of $p$, and the real and imaginary
+parts of the coefficient
+$c_n$ is contained in {\tt p\_coef[2*(n-2)+0]} and {\tt p\_coef[2*(n-2)+1]}.
+
+\section{Data Initialization}
+
+The program starts in the function {\tt init\_euler2d}. After allocating
+the memory for the data, and initialising some of the temporary variables
+required for the numerical solving program, it randomly assigns the
+coefficients of $p$, making sure that $\sum_{n=2}^{\tt deg\_p} n |c_n| = 1$.
+Then the program figures out how to draw the boundary, and what rescaling
+of the data is required to draw it on the screen. (This uses the
+function {\tt calc\_p} which calculates $p(x)$.)
+
+Next, it randomly assigns the initial values of $\tilde x_k$. We want
+to do this in such a way so that the points are uniformly spread over the
+domain. Let us first consider the case when the domain is the unit circle
+$\Delta$. In that case the proportion of points that we would expect
+inside the circle of radius $r$ would be proportional to $r^2$. So
+we do it as follows:
+\[ r = \sqrt{R_{0,1}},\quad \theta = R_{-\pi,\pi}, \quad
+ \tilde x_k = r (\cos \theta, \sin \theta) .\]
+Here, and in the rest of this discussion, $R_{a,b}$ is a function
+that returns a random variable uniformly distributed over the interval
+$[a,b]$.
+
+This works fine for $\Delta$, but for $p(\Delta)$, the points
+$p(\tilde x_k)$ are not uniformly distributed over $p(\Delta)$,
+but are distributed with a density proportional to
+$1/|p'(\tilde x_k)|^2$. So to restore the uniform density we need
+to reject this value of $\tilde x_k$ with probability proportional
+to $|p'(\tilde x_k)|^2$. Noticing that the condition
+$\sum_{n=2}^{\tt deg\_p} n |c_n| = 1$ implies that
+$|p'(\tilde x_k)| \le 2$, we
+do this by rejecting if $|p'(\tilde x_k)|^2 < R_{0,4}$.
+(This makes use of the function {\tt calc\_mod\_dp2} which calculates
+$|p'(x)|^2$.)
+
+\section{Solving the Equation}
+
+The main loop of the program is in the function {\tt draw\_euler2d}.
+Most of the drawing operations are contained in this function, and
+the numerical aspects are sent to the function {\tt ode\_solve}.
+But there is an aspect of this that I would like
+to discuss in the next section, and so we will look at a simple method for
+numerically solving differential equations.
+
+The Euler Method
+(nothing to do with the Euler Equation), is as
+follows. Pick a small number $h$ --- the time step (in
+the program call {\tt delta\_t}). Then we approximate
+the solution of the equation:
+\begin{equation}
+\label{method-simple}
+\tilde x_k(t+h) = \tilde x_k(t) + h \tilde\alpha_k(t) .
+\end{equation}
+The more sophisticated methods we use are variations of
+the Euler Method, and so the discussion in the following section
+still applies.
+
+In the program, the quantities $\tilde\alpha_k$, given by
+equations (\ref{tildex-p2}) are calculated by the function
+{\tt derivs}
+(which in turns calls {\tt calc\_all\_mod\_dp2} to
+calculate $|p'(\tilde x_k)|^2$ at all the points).
+
+
+\section{Subtle Perturbation}
+
+Added later: the scheme described here seems to not be that effective,
+so now it is not used.
+
+One problem using a numerical scheme such as the Euler Method occurs
+when the points $\tilde x_k$ get close to the boundary
+of $\Delta$. In that case, it is possible that the new
+points will be pushed outside of the boundary. Even if they
+are not pushed out of the boundary, they may be much closer
+or farther from the boundary than they should be.
+Our system of equations is very sensitive to how close points
+are to the boundary --- points with non-zero vorticity
+(``vortex points'') that are close to the boundary travel
+at great speed alongside the boundary, with speed that is
+inversely proportional to the distance from the boundary.
+
+A way to try to mitigate this problem is something that I call
+``subtle perturbation.''
+We map the points in
+the unit disk to points in the plane using the map
+\begin{equation*}
+F(x) = f(|x|) \frac x{|x|} ,
+\end{equation*}
+where $f:[0,1]\to[0,\infty]$ is an increasing continuous
+bijection. It turns out that a good choice is
+\begin{equation*}
+f(t) = -\log(1-t) .
+\end{equation*}
+(The reason for this is that points close to each other
+that are a distance
+about $r$ from the boundary will be pushed around so that
+their distance from each other is about multiplied by the
+derivative of $\log r$, that is, $1/r$.)
+Note that the inverse of this function is given by
+\begin{equation*}
+F^{-1}(x) = f^{-1}(|x|) \frac x{|x|} ,
+\end{equation*}
+where
+\begin{equation*}
+f^{-1}(t) = 1-e^{-t} .
+\end{equation*}
+
+So what we could do is the following: instead of working with
+the points $\tilde x_k$, we could work instead with the points
+$y_k = F(\tilde x_k)$. In effect this is what we do.
+Instead of performing the computation (\ref{method-simple}),
+we do the calculation
+\begin{equation*}
+y_k = F(\tilde x_k(t)) + h {\cal A}(\tilde x_k) \tilde\alpha_k(t)
+\end{equation*}
+where
+${\cal A}(x)$ is the matrix of partial derivatives of $F$:
+\begin{equation*}
+{\cal A}(x) =
+\frac{f(|x|)}{|x|}
+\left[
+\begin{matrix}
+1 & 0\\
+0 & 1
+\end{matrix}
+\right]
++ \frac1{|x|}
+ \left(\frac{f'(|x|)}{|x|} - \frac{f(|x|)}{|x|^2}\right)
+\left[
+\begin{matrix}
+x_{1}^2 & x_{1} x_{2}\\
+x_{1} x_{2} & x_{2}^2
+\end{matrix}
+\right],
+\end{equation*}
+and then compute
+\begin{equation*}
+\tilde x_k(t+h) = F^{-1}(y_k).
+\end{equation*}
+These calculations are done in the function {\tt perturb}, if
+the quantity {\tt SUBTLE\_PERTURB} is set.
+
+\section{Drawing the Points}
+
+As we stated earlier, most of the drawing functions are contained
+in the function {\tt draw\_euler2d}. If the variable
+{\tt hide\_vortex} is set (and the function {\tt init\_euler2d}
+will set this with probability $3/4$), then we only display
+the points $\tilde x_k$ for ${\tt Nvortex} < k \le N$. If
+{\tt hide\_vortex} is not set, then the ``vortex points''
+$\tilde x_k$ ($1 \le k \le {\tt Nvortex}$) are displayed in white.
+In fact the points $p(\tilde x_k)$ are what are put onto the screen,
+and for this we make use of the function {\tt calc\_all\_p}.
+
+\section{Addition to Program: Changing the Power Law}
+
+A later addition to the program adds an option {\tt eulerpower},
+which allows one to change the power law that describes how
+the vortex points influence other points. In effect, if this
+option is set with the value $m$, then the Biot-Savart Kernel
+is replace by
+$$ K_1(x,y) = \frac{(x-y)^\perp}{|x-y|^{m+1}}, $$
+and
+$$ K_2(x,y) = K_1(x,y) - |y|^{1-m} K_1(x,y) .$$
+So for example, setting $m=2$ corresponds to the
+quasi-geostrophic equation. (I haven't yet figured out
+what $K_p$ should be, so if $m \ne 1$ we use the unit circle
+as the boundary.)
+
+\begin{thebibliography}{9}
+
+\bibitem{BF} Richard L. Burden, J. Douglas Faires, Numerical Analysis,
+sixth edition, Brooks/Cole, 1996.
+
+\bibitem{C} Alexandre J. Chorin, Vorticity and Turbulence,
+Applied Mathematical Sciences, Vol 103, Springer Verlag, 1994.
+
+\end{thebibliography}
+
+\end{document}
diff --git a/hacks/fadeplot.c b/hacks/fadeplot.c
new file mode 100644
index 0000000..93f4719
--- /dev/null
+++ b/hacks/fadeplot.c
@@ -0,0 +1,233 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* fadeplot --- a fading plot of sine squared */
+
+#if 0
+static const char sccsid[] = "@(#)fadeplot.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Some easy plotting stuff, by Bas van Gaalen, Holland, PD
+ *
+ * Copyright (c) 1996 by Charles Vidal
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 10-May-1997: Compatible with screensaver
+ * 1996: Written by Charles Vidal based on work by Bas van Gaalen
+ */
+
+#ifdef STANDALONE
+# define MODE_fadeplot
+# define DEFAULTS "*delay: 30000 \n" \
+ "*count: 10 \n" \
+ "*cycles: 1500 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n" \
+
+# define BRIGHT_COLORS
+# define UNIFORM_COLORS
+# define release_fadeplot 0
+# define fadeplot_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_fadeplot
+
+ENTRYPOINT ModeSpecOpt fadeplot_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+
+#ifdef USE_MODULES
+ModStruct fadeplot_description =
+{"fadeplot", "init_fadeplot", "draw_fadeplot", (char *) NULL,
+ "refresh_fadeplot", "init_fadeplot", "free_fadeplot", &fadeplot_opts,
+ 30000, 10, 1500, 1, 64, 0.6, "",
+ "Shows a fading plot of sine squared", 0, NULL};
+
+#endif
+
+#define MINSTEPS 1
+
+typedef struct {
+ XPoint speed, step, factor, st;
+ int temps, maxpts, nbstep;
+ int min;
+ int width, height;
+ int pix;
+ int angles;
+ int *stab;
+ XPoint *pts;
+} fadeplotstruct;
+
+static fadeplotstruct *fadeplots = (fadeplotstruct *) NULL;
+
+ENTRYPOINT void
+free_fadeplot(ModeInfo * mi)
+{
+ fadeplotstruct *fp = &fadeplots[MI_SCREEN(mi)];
+ if (fp->pts != NULL) {
+ (void) free((void *) fp->pts);
+ fp->pts = (XPoint *) NULL;
+ }
+ if (fp->stab != NULL) {
+ (void) free((void *) fp->stab);
+ fp->stab = (int *) NULL;
+ }
+}
+
+static Bool
+initSintab(ModeInfo * mi)
+{
+ fadeplotstruct *fp = &fadeplots[MI_SCREEN(mi)];
+ int i;
+ float x;
+
+ fp->angles = NRAND(950) + 250;
+ if ((fp->stab = (int *) malloc(fp->angles * sizeof (int))) == NULL) {
+ free_fadeplot(mi);
+ return False;
+ }
+ for (i = 0; i < fp->angles; i++) {
+ x = SINF(2.0 * M_PI * i / fp->angles);
+ fp->stab[i] = (int) (x * ABS(x) * fp->min) + fp->min;
+ }
+ return True;
+}
+
+ENTRYPOINT void
+init_fadeplot (ModeInfo * mi)
+{
+ fadeplotstruct *fp;
+
+ MI_INIT (mi, fadeplots);
+ fp = &fadeplots[MI_SCREEN(mi)];
+
+ fp->width = MI_WIDTH(mi);
+ fp->height = MI_HEIGHT(mi);
+ fp->min = MAX(MIN(fp->width, fp->height) / 2, 1);
+
+ fp->speed.x = 8;
+ fp->speed.y = 10;
+ fp->step.x = 1;
+ fp->step.y = 1;
+ fp->temps = 0;
+ fp->factor.x = MAX(fp->width / (2 * fp->min), 1);
+ fp->factor.y = MAX(fp->height / (2 * fp->min), 1);
+
+ fp->nbstep = MI_COUNT(mi);
+ if (fp->nbstep < -MINSTEPS) {
+ fp->nbstep = NRAND(-fp->nbstep - MINSTEPS + 1) + MINSTEPS;
+ } else if (fp->nbstep < MINSTEPS)
+ fp->nbstep = MINSTEPS;
+
+ fp->maxpts = MI_CYCLES(mi);
+ if (fp->maxpts < 1)
+ fp->maxpts = 1;
+
+ if (fp->pts == NULL) {
+ if ((fp->pts = (XPoint *) calloc(fp->maxpts, sizeof (XPoint))) ==
+ NULL) {
+ free_fadeplot(mi);
+ return;
+ }
+ }
+ if (MI_NPIXELS(mi) > 2)
+ fp->pix = NRAND(MI_NPIXELS(mi));
+
+ if (fp->stab != NULL)
+ (void) free((void *) fp->stab);
+ if (!initSintab(mi))
+ return;
+ MI_CLEARWINDOW(mi);
+}
+
+ENTRYPOINT void
+draw_fadeplot (ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GC gc = MI_GC(mi);
+ int i, j, temp;
+ fadeplotstruct *fp;
+
+ if (fadeplots == NULL)
+ return;
+ fp = &fadeplots[MI_SCREEN(mi)];
+ if (fp->stab == NULL)
+ return;
+
+ MI_IS_DRAWN(mi) = True;
+ XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
+ XDrawPoints(display, window, gc, fp->pts, fp->maxpts, CoordModeOrigin);
+
+ if (MI_NPIXELS(mi) > 2) {
+ XSetForeground(display, gc, MI_PIXEL(mi, fp->pix));
+ if (++fp->pix >= MI_NPIXELS(mi))
+ fp->pix = 0;
+ } else
+ XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+
+ temp = 0;
+ for (j = 0; j < fp->nbstep; j++) {
+ for (i = 0; i < fp->maxpts / fp->nbstep; i++) {
+ fp->pts[temp].x =
+ fp->stab[(fp->st.x + fp->speed.x * j + i * fp->step.x) % fp->angles] *
+ fp->factor.x + fp->width / 2 - fp->min;
+ fp->pts[temp].y =
+ fp->stab[(fp->st.y + fp->speed.y * j + i * fp->step.y) % fp->angles] *
+ fp->factor.y + fp->height / 2 - fp->min;
+ temp++;
+ }
+ }
+ XDrawPoints(display, window, gc, fp->pts, temp, CoordModeOrigin);
+ fp->st.x = (fp->st.x + fp->speed.x) % fp->angles;
+ fp->st.y = (fp->st.y + fp->speed.y) % fp->angles;
+ fp->temps++;
+ if ((fp->temps % (fp->angles / 2)) == 0) {
+ fp->temps = fp->temps % fp->angles * 5;
+ if ((fp->temps % (fp->angles)) == 0)
+ fp->speed.y = (fp->speed.y + 1) % 30 + 1;
+ if ((fp->temps % (fp->angles * 2)) == 0)
+ fp->speed.x = (fp->speed.x) % 20;
+ if ((fp->temps % (fp->angles * 3)) == 0)
+ fp->step.y = (fp->step.y + 1) % 2 + 1;
+
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+ENTRYPOINT void
+reshape_fadeplot(ModeInfo * mi, int width, int height)
+{
+ fadeplotstruct *fp = &fadeplots[MI_SCREEN(mi)];
+ fp->width = width;
+ fp->height = height;
+ fp->min = MAX(MIN(fp->width, fp->height) / 2, 1);
+ fp->factor.x = MAX(fp->width / (2 * fp->min), 1);
+ fp->factor.y = MAX(fp->height / (2 * fp->min), 1);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_fadeplot (ModeInfo * mi)
+{
+}
+#endif
+
+XSCREENSAVER_MODULE ("FadePlot", fadeplot)
+
+#endif /* MODE_fadeplot */
diff --git a/hacks/fadeplot.man b/hacks/fadeplot.man
new file mode 100644
index 0000000..d525afd
--- /dev/null
+++ b/hacks/fadeplot.man
@@ -0,0 +1,65 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+fadeplot - draws a waving ribbon following a sinusoidal path.
+.SH SYNOPSIS
+.B fadeplot
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Draws what looks like a waving ribbon following a sinusoidal path.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+Count. 0 - 20. Default: 10.
+.TP 8
+.B \-cycles \fInumber\fP
+How many frames until the shape changes. Default: 1500.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of colors. Default: 64.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Bas van Gaalen and Charles Vidal. Permission to
+use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided
+that the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation. No representations are made about the suitability of
+this software for any purpose. It is provided "as is" without express
+or implied warranty.
+.SH AUTHOR
+Bas van Gaalen and Charles Vidal.
diff --git a/hacks/fiberlamp.c b/hacks/fiberlamp.c
new file mode 100644
index 0000000..580851a
--- /dev/null
+++ b/hacks/fiberlamp.c
@@ -0,0 +1,474 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* fiberlamp --- A Fiber Optic Lamp */
+
+#if 0
+static const char sccsid[] = "@(#)fiberlamp.c 5.00 2000/11/01 xlockmore";
+
+#endif
+
+/*-
+ * Copyright (c) 2005 by Tim Auckland <tda10.geo@yahoo.com>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * "fiberlamp" shows Fiber Optic Lamp. Since there is no closed-form
+ * solution to the large-amplitude cantilever equation, the flexible
+ * fiber is modeled as a set of descrete nodes.
+ *
+ * Revision History:
+ * 13-Jan-2005: Initial development.
+ */
+
+#ifdef STANDALONE
+#define MODE_fiberlamp
+#define DEFAULTS "*delay: 10000 \n" \
+ "*count: 500 \n" \
+ "*cycles: 10000 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsTop: true \n" \
+
+# define UNIFORM_COLORS
+# define release_fiberlamp 0
+# define reshape_fiberlamp 0
+# define fiberlamp_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_fiberlamp
+
+ENTRYPOINT ModeSpecOpt fiberlamp_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+
+#ifdef USE_MODULES
+ModStruct fiberlamp_description =
+{"fiberlamp", "init_fiberlamp", "draw_fiberlamp", (char *) NULL,
+ "draw_fiberlamp", "change_fiberlamp", "free_fiberlamp", &fiberlamp_opts,
+ 1000, 500, 10000, 0, 64, 1.0, "", "Shows a Fiber Optic Lamp", 0, NULL};
+
+#endif
+
+#define SPREAD (30.0) /* Angular spread at the base */
+#define SCALE (MI_WIDTH(mi)/2) /* Screen size */
+#define NODES (20L) /* Number of nodes in a fiber. Variable with range
+ 10 .. 30, if desired. High values have
+ stability problems unless you use small DT */
+
+/* Physics parameters. Tune carefully to keep realism and avoid instability*/
+#define DT (0.5) /* Time increment: Low is slow, High is less stable. */
+#define PY (0.12) /* Rigidity: Low droops, High is stiff. */
+#define DAMPING (0.055) /* Damping: Low allows oscillations, High is boring. */
+
+#undef PLAN /* Plan view (for debugging) */
+#undef CHECKCOLORWHEEL /* Plan view with no spread */
+
+#define DRAND(v) (LRAND()/MAXRAND*(v)) /* double random 0 - v */
+
+/* Length of nodes. Uniform except for shorter notes at the tips for
+ colour highlights. Sum from 0..NODES-1 should exactly 1.0 */
+#define LEN(A) ((A<NODES-3) ? 1.0/(NODES-2.5) : 0.25/(NODES-2.5))
+
+
+typedef struct {
+ double phi, phidash;
+ double eta, etadash;
+ double x;
+ double y;
+ double z;
+} nodestruct;
+
+typedef struct {
+ nodestruct *node;
+ XPoint *draw;
+} fiberstruct;
+
+typedef struct {
+ int init;
+ double psi;
+ double dpsi;
+ long count, nfibers;
+ double cx;
+ double rx, ry; /* Coordinates relative to root */
+ fiberstruct *fiber;
+ Bool dbufp;
+ Pixmap buffer; /* Double Buffer */
+ long bright, medium, dim; /* "White" colors */
+} fiberlampstruct;
+
+static fiberlampstruct *fiberlamps = (fiberlampstruct *) NULL;
+
+static void
+change_fiberlamp(ModeInfo * mi)
+{
+ fiberlampstruct *fl;
+ if (fiberlamps == NULL)
+ return;
+ fl = &fiberlamps[MI_SCREEN(mi)];
+ fl->cx = (DRAND(SCALE/4)-SCALE/8)/SCALE; /* Knock the lamp */
+ fl->count = 0; /* Reset counter */
+ if (fl->dbufp) {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ XFillRectangle(MI_DISPLAY(mi), fl->buffer, MI_GC(mi), 0, 0,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+}
+
+static void
+free_fiber(fiberlampstruct *fl)
+{
+ if (fl->fiber) {
+ int f;
+
+ for (f = 0; f < fl->nfibers; f++) {
+ fiberstruct *fs = fl->fiber + f;
+
+ if (fs->node)
+ free(fs->node);
+ if (fs->draw)
+ free(fs->draw);
+ }
+ free(fl->fiber);
+ fl->fiber = NULL;
+ }
+}
+
+ENTRYPOINT void
+free_fiberlamp(ModeInfo *mi)
+{
+ fiberlampstruct *fl = &fiberlamps[MI_SCREEN(mi)];
+ if (fl->buffer != None && fl->dbufp) {
+ XFreePixmap(MI_DISPLAY(mi), fl->buffer);
+ fl->buffer = None;
+ }
+ free_fiber(fl);
+}
+
+ENTRYPOINT void
+init_fiberlamp(ModeInfo * mi)
+{
+ fiberlampstruct *fl;
+
+ MI_INIT (mi, fiberlamps);
+ fl = &fiberlamps[MI_SCREEN(mi)];
+
+ /* Create or Resize double buffer */
+#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ fl->dbufp = False;
+#else
+ fl->dbufp = True;
+#endif
+
+ if(fl->buffer != None && fl->buffer != MI_WINDOW(mi) && fl->dbufp)
+ XFreePixmap(MI_DISPLAY(mi), fl->buffer);
+
+ if(fl->dbufp) {
+ fl->buffer = XCreatePixmap(MI_DISPLAY(mi), MI_WINDOW(mi),
+ MI_WIDTH(mi), MI_HEIGHT(mi), MI_DEPTH(mi));
+ if (fl->buffer == None) {
+ free_fiberlamp(mi);
+ return;
+ }
+ } else {
+ fl->buffer = MI_WINDOW(mi);
+ }
+
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ XFillRectangle(MI_DISPLAY(mi), fl->buffer, MI_GC(mi), 0, 0,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if(fl->init) /* Nothing else to do (probably a resize) */
+ return;
+
+ fl->init = True;
+ fl->nfibers = MI_COUNT(mi);
+ /* Allocate fibers */
+ if((fl->fiber =
+ (fiberstruct*) calloc(fl->nfibers, sizeof (fiberstruct))) == NULL) {
+ free_fiberlamp(mi);
+ return;
+ } else {
+ int f;
+ for(f = 0; f < fl->nfibers; f++) {
+ fiberstruct *fs = fl->fiber + f;
+ if((fs->node =
+ (nodestruct*) calloc(NODES, sizeof (nodestruct))) == NULL
+ ||(fs->draw =
+ (XPoint*) calloc(NODES, sizeof (XPoint))) == NULL) {
+ free_fiberlamp(mi);
+ return;
+ }
+ }
+ }
+
+ {
+ int f, i;
+ for(f = 0; f < fl->nfibers; f++) {
+ double phi = M_PI/180 * DRAND(SPREAD);
+ double eta = DRAND(2*M_PI) - M_PI;
+ for(i = 0; i < NODES; i++) {
+ nodestruct *n = &fl->fiber[f].node[i];
+ n->phi = phi;
+ n->phidash = 0;
+ n->eta = eta;
+ n->etadash = 0;
+ }
+ fl->fiber[f].node[0].etadash = 0.002/DT;
+ fl->fiber[f].node[0].y = 0;
+ fl->fiber[f].node[0].z = 0;
+ }
+
+ }
+
+ /* Set up rotation */
+ fl->psi = DRAND(2*M_PI);
+ fl->dpsi = 0.01;
+
+ /* no "NoExpose" events from XCopyArea wanted */
+ XSetGraphicsExposures(MI_DISPLAY(mi), MI_GC(mi), False);
+
+ /* Make sure we're using 'thin' lines */
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), 0, LineSolid, CapNotLast,
+ JoinMiter);
+#ifdef CHECKCOLORWHEEL
+ /* Only interested in tips, leave the rest black */
+ fl->bright = fl->medium = fl->dim = MI_BLACK_PIXEL(mi);
+#else
+ if(MI_NPIXELS(mi) > 2) {
+ /* Set up colours for the fiber bodies. Tips handled seperately */
+ XColor c, t;
+ if(XAllocNamedColor(MI_DISPLAY(mi), MI_COLORMAP(mi), "#E0E0C0", &c, &t)){
+ fl->bright = c.pixel;
+ } else {
+ fl->bright = MI_WHITE_PIXEL(mi);
+ }
+ if(XAllocNamedColor(MI_DISPLAY(mi), MI_COLORMAP(mi), "#808070", &c, &t)){
+ fl->medium = c.pixel;
+ } else {
+ fl->medium = MI_WHITE_PIXEL(mi);
+ }
+ if(XAllocNamedColor(MI_DISPLAY(mi), MI_COLORMAP(mi), "#404020", &c, &t)){
+ fl->dim = c.pixel;
+ } else {
+ fl->dim = MI_BLACK_PIXEL(mi);
+ }
+ } else {
+ fl->bright = MI_WHITE_PIXEL(mi);
+ fl->medium = MI_WHITE_PIXEL(mi);
+ fl->dim = MI_BLACK_PIXEL(mi);
+ }
+#endif
+
+ /* Clear the background. */
+ MI_CLEARWINDOW(mi);
+ change_fiberlamp(mi);
+}
+
+/* sort fibers so they get drawn back-to-front, one bubble pass is
+ enough as the order only changes slowly */
+static void
+sort_fibers(fiberlampstruct *fl)
+{
+ int i;
+
+ for(i = 1; i < fl->nfibers; i++) {
+ if (fl->fiber[i - 1].node[NODES - 1].z > fl->fiber[i].node[NODES - 1].z) {
+ fiberstruct tmp = fl->fiber[i - 1];
+ fl->fiber[i - 1] = fl->fiber[i];
+ fl->fiber[i] = tmp;
+ }
+ }
+}
+
+ENTRYPOINT void
+draw_fiberlamp (ModeInfo * mi)
+{
+ fiberlampstruct *fl;
+ int f, i;
+ int x, y;
+ int ww, hh;
+ Window unused;
+ short cx, cy;
+
+ ww = MI_WIDTH(mi);
+ hh = MI_HEIGHT(mi);
+
+ cx = MI_WIDTH(mi)/2;
+#if defined PLAN || defined CHECKCOLORWHEEL
+ cy = MI_HEIGHT(mi)/2;
+#else
+ cy = MI_HEIGHT(mi);
+#endif
+
+ if (ww > hh * 5 || /* window has weird aspect */
+ hh > ww * 5)
+ {
+ if (ww > hh)
+ {
+ hh = ww;
+ cy = hh / 4;
+ }
+ else
+ {
+ ww = hh;
+ cx = 0;
+ cy = hh*3/4;
+ }
+ }
+
+ if (fiberlamps == NULL)
+ return;
+ fl = &fiberlamps[MI_SCREEN(mi)];
+
+ fl->psi += fl->dpsi; /* turn colorwheel */
+
+ XTranslateCoordinates(MI_DISPLAY(mi), MI_WINDOW(mi),
+ RootWindow(MI_DISPLAY(mi),0/*#### MI_SCREEN(mi)*/),
+ cx, cy, &x, &y, &unused);
+ sort_fibers(fl);
+
+ for(f = 0; f < fl->nfibers; f++) {
+ fiberstruct *fs = fl->fiber + f;
+
+ fs->node[0].eta += DT*fs->node[0].etadash;
+ fs->node[0].x = fl->cx; /* Handle center movement */
+ /* Handle window move. NOTE, only x is deflected, since y doesn't
+ directly affect the physics */
+ fs->node[NODES-2].x *= 0.1*(fl->ry - y);
+ fs->node[NODES-2].x += 0.05*(fl->rx - x);
+
+ /* 2nd order diff equation */
+ for(i = 1; i < NODES; i++) {
+ nodestruct *n = fs->node+i;
+ nodestruct *p = fs->node+i-1;
+ double pload = 0;
+ double eload = 0;
+ double pstress = (n->phi - p->phi)*PY;
+ double estress = (n->eta - p->eta)*PY;
+ double dxi = n->x - p->x;
+ double dzi = n->z - p->z;
+ double li = sqrt(dxi*dxi + dzi*dzi)/LEN(i);
+ double drag = DAMPING*LEN(i)*LEN(i)*NODES*NODES;
+
+ if(li > 0) {
+ int j;
+ for(j = i+1; j < NODES; j++) {
+ nodestruct *nn = fs->node+j;
+ double dxj = nn->x - n->x;
+ double dzj = nn->z - n->z;
+
+ pload += LEN(j)*(dxi*dxj + dzi*dzj)/li; /* Radial load */
+ eload += LEN(j)*(dxi*dzj - dzi*dxj)/li; /* Transverse load */
+ /* Not a perfect simulation: in reality the transverse load
+ is only indirectly coupled to the eta deflection, but of
+ all the approaches I've tried this produces the most
+ stable model and looks the most realistic. */
+ }
+ }
+
+#ifndef CHECKCOLORWHEEL
+ n->phidash += DT*(pload - pstress - drag*n->phidash)/LEN(i);
+ n->phi += DT*n->phidash;
+#endif
+
+ n->etadash += DT*(eload - estress - drag*n->etadash)/LEN(i);
+ n->eta += DT*n->etadash;
+
+ {
+ double sp = sin(p->phi);
+ double cp = cos(p->phi);
+ double se = sin(p->eta);
+ double ce = cos(p->eta);
+
+ n->x = p->x + LEN(i-1) * ce * sp;
+ n->y = p->y - LEN(i-1) * cp;
+ n->z = p->z + LEN(i-1) * se * sp;
+ }
+
+ fs->draw[i-1].x = cx + ww/2*n->x;
+#if defined PLAN || defined CHECKCOLORWHEEL /* Plan */
+ fs->draw[i-1].y = cy + ww/2*n->z;
+#else /* Elevation */
+ fs->draw[i-1].y = cy + ww/2*n->y;
+#endif
+ }
+ MI_IS_DRAWN(mi) = True;
+
+ /* Erase: this may only be erasing an off-screen buffer, but on a
+ slow system it may still be faster than XFillRectangle() */
+ /* That's unpossible. -jwz */
+ }
+
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ XFillRectangle(MI_DISPLAY(mi), fl->buffer, MI_GC(mi),
+ 0, 0, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ for(f = 0; f < fl->nfibers; f++) {
+ fiberstruct *fs = fl->fiber + f;
+
+ {
+ double x = fs->node[1].x - fl->cx + 0.025;
+ double y = fs->node[1].z + 0.02;
+ double angle = atan2(y, x) + fl->psi;
+ long tipcolor = (int)(MI_NPIXELS(mi)*angle/(2*M_PI)) % MI_NPIXELS(mi);
+ long fibercolor;
+ long tiplen;
+
+ if (tipcolor < 0) tipcolor += MI_NPIXELS(mi);
+ tipcolor = MI_PIXEL(mi, tipcolor);
+
+ if(fs->node[1].z < 0.0) { /* Back */
+ tiplen = 2;
+ fibercolor = fl->dim;
+ }else if(fs->node[NODES-1].z < 0.7) { /* Middle */
+ tiplen = 3;
+ fibercolor = fl->medium;
+ } else { /* Front */
+ tiplen = 3;
+ fibercolor = fl->bright;
+ }
+
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), fibercolor);
+ XDrawLines(MI_DISPLAY(mi), fl->buffer, MI_GC(mi),
+ fs->draw, NODES-tiplen, CoordModeOrigin);
+
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), tipcolor);
+ XDrawLines(MI_DISPLAY(mi), fl->buffer, MI_GC(mi),
+ fs->draw+NODES-1-tiplen, tiplen, CoordModeOrigin);
+ }
+ }
+
+ /* Update the screen from the double-buffer */
+ if (fl->dbufp)
+ XCopyArea(MI_DISPLAY(mi), fl->buffer, MI_WINDOW(mi), MI_GC(mi), 0, 0,
+ MI_WIDTH(mi), MI_HEIGHT(mi), 0, 0);
+
+ fl->rx = x;
+ fl->ry = y;
+
+ if(fl->count++ > MI_CYCLES(mi)) {
+ change_fiberlamp(mi);
+ }
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_fiberlamp(ModeInfo * mi)
+{
+ MI_CLEARWINDOW(mi);
+}
+#endif
+
+XSCREENSAVER_MODULE ("Fiberlamp", fiberlamp)
+
+#endif /* MODE_fiberlamp */
diff --git a/hacks/fiberlamp.man b/hacks/fiberlamp.man
new file mode 100644
index 0000000..da0d4f4
--- /dev/null
+++ b/hacks/fiberlamp.man
@@ -0,0 +1,65 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+fiberlamp - Fiber Optic Lamp
+.SH SYNOPSIS
+.B fiberlamp
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Displays a Fiber Optic Lamp.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+Number of Fibers. 10 - 500. Default: 500.
+.TP 8
+.B \-cycles \fInumber\fP
+Number of cycles before the lamp is knocked sideways. 100 - 10000.
+Default: 10000.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 64.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Tim Auckland. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Tim Auckland.
diff --git a/hacks/filmleader.c b/hacks/filmleader.c
new file mode 100644
index 0000000..ef021e1
--- /dev/null
+++ b/hacks/filmleader.c
@@ -0,0 +1,571 @@
+/* filmleader, Copyright (c) 2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Simulate an SMPTE Universal Film Leader playing on an analog television.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include "xft.h" /* before screenhack.h */
+
+#include "screenhack.h"
+#include "analogtv.h"
+
+#include <time.h>
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+struct state {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ int w, h;
+ unsigned long bg, text_color, ring_color, trace_color;
+ XftColor xft_text_color_1, xft_text_color_2;
+
+ XftFont *font, *font2, *font3;
+ XftDraw *xftdraw;
+ Pixmap pix;
+ GC gc;
+ double start, last_time;
+ double value;
+ int stop;
+ double noise;
+ analogtv *tv;
+ analogtv_input *inp;
+ analogtv_reception rec;
+ Bool button_down_p;
+};
+
+
+static void *
+filmleader_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+
+ st->dpy = dpy;
+ st->window = window;
+ st->tv = analogtv_allocate (st->dpy, st->window);
+ analogtv_set_defaults (st->tv, "");
+ st->tv->need_clear = 1;
+ st->inp = analogtv_input_allocate();
+ analogtv_setup_sync (st->inp, 1, 0);
+ st->rec.input = st->inp;
+ st->rec.level = 2.0;
+ st->tv->use_color = 1;
+ st->rec.level = pow(frand(1.0), 3.0) * 2.0 + 0.05;
+ st->rec.ofs = random() % ANALOGTV_SIGNAL_LEN;
+ st->tv->powerup = 0;
+
+ st->rec.multipath = 0.0;
+ st->tv->color_control += frand(0.3);
+ st->noise = get_float_resource (st->dpy, "noise", "Float");
+ st->value = 18; /* Leave time for powerup */
+ st->stop = 2 + (random() % 5);
+ XGetWindowAttributes (dpy, window, &st->xgwa);
+
+ /* Let's render it into a 16:9 pixmap, since that's what most screens are
+ these days. That means the circle will be squashed on 4:3 screens. */
+ {
+ double r = 16/9.0;
+
+# ifdef HAVE_MOBILE
+ /* analogtv.c always fills whole screen on mobile, so use screen aspect. */
+ r = st->xgwa.width / (double) st->xgwa.height;
+ if (r < 1) r = 1/r;
+# endif
+
+ st->w = 712;
+ st->h = st->w / r;
+ }
+
+ if (st->xgwa.width < st->xgwa.height)
+ {
+ int swap = st->w;
+ st->w = st->h;
+ st->h = swap;
+ }
+
+ st->pix = XCreatePixmap (dpy, window,
+ st->w > st->h ? st->w : st->h,
+ st->w > st->h ? st->w : st->h,
+ st->xgwa.depth);
+ st->gc = XCreateGC (dpy, st->pix, 0, &gcv);
+
+ st->xftdraw = XftDrawCreate (dpy, st->pix, st->xgwa.visual,
+ st->xgwa.colormap);
+ st->font = load_xft_font_retry (dpy, screen_number (st->xgwa.screen),
+ get_string_resource (dpy, "numberFont",
+ "Font"));
+ st->font2 = load_xft_font_retry (dpy, screen_number (st->xgwa.screen),
+ get_string_resource (dpy, "numberFont2",
+ "Font"));
+ st->font3 = load_xft_font_retry (dpy, screen_number (st->xgwa.screen),
+ get_string_resource (dpy, "numberFont3",
+ "Font"));
+
+ st->bg = get_pixel_resource (dpy, st->xgwa.colormap,
+ "textBackground", "Background");
+ st->text_color = get_pixel_resource (dpy, st->xgwa.colormap,
+ "textColor", "Foreground");
+ st->ring_color = get_pixel_resource (dpy, st->xgwa.colormap,
+ "ringColor", "Foreground");
+ st->trace_color = get_pixel_resource (dpy, st->xgwa.colormap,
+ "traceColor", "Foreground");
+
+ XftColorAllocName (dpy, st->xgwa.visual, st->xgwa.colormap,
+ get_string_resource (dpy, "textColor", "Foreground"),
+ &st->xft_text_color_1);
+ XftColorAllocName (dpy, st->xgwa.visual, st->xgwa.colormap,
+ get_string_resource (dpy, "textBackground", "Background"),
+ &st->xft_text_color_2);
+
+ return st;
+}
+
+
+static double
+double_time (void)
+{
+ struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&now, &tzp);
+# else
+ gettimeofday(&now);
+# endif
+
+ return (now.tv_sec + ((double) now.tv_usec * 0.000001));
+}
+
+
+static unsigned long
+filmleader_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ const analogtv_reception *rec = &st->rec;
+ double then = double_time(), now, timedelta;
+ XImage *img;
+ int i, x, y, w2, h2;
+ XGlyphInfo extents;
+ int lbearing, rbearing, ascent, descent;
+ char s[20];
+ double r = 1 - (st->value - (int) st->value);
+ int ivalue = st->value;
+ XftFont *xftfont;
+ XftColor *xftcolor;
+
+ /* You may ask, why use Xft for this instead of the much simpler XDrawString?
+ Well, for some reason, XLoadQueryFont is giving me horribly-scaled bitmap
+ fonts, but Xft works properly. So perhaps in This Modern World, if one
+ expects large fonts to work, one must use Xft instead of Xlib?
+
+ Everything is terrible.
+ */
+
+ const struct { double t; int k, f; const char * const s[4]; } blurbs[] = {
+ { 9.1, 3, 1, { "PICTURE", " START", 0, 0 }},
+ { 10.0, 2, 1, { " 16", "SOUND", "START", 0 }},
+ { 10.5, 2, 1, { " 32", "SOUND", "START", 0 }},
+ { 11.6, 2, 0, { "PICTURE", "COMPANY", "SERIES", 0 }},
+ { 11.7, 2, 0, { "XSCRNSAVER", 0, 0, 0 }},
+ { 11.9, 2, 0, { "REEL No.", "PROD No.", "PLAY DATE", 0 }},
+ { 12.2, 0, 0, { " SMPTE ", "UNIVERSAL", " LEADER", 0 }},
+ { 12.3, 0, 1, { "X ", "X", "X", "X" }},
+ { 12.4, 0, 0, { " SMPTE ", "UNIVERSAL", " LEADER", 0 }},
+ { 12.5, 3, 1, { "PICTURE", 0, 0, 0 }},
+ { 12.7, 3, 1, { "HEAD", 0, 0, 0 }},
+ { 12.8, 2, 1, { "OOOO", 0, "ASPECT", "TYPE OF" }},
+ { 12.9, 2, 0, { "SOUND", 0, "RATIO", 0 }},
+ { 13.2, 1, 1, { " ", "PICTURE", 0, 0 }},
+ { 13.3, 1, 0, { "REEL No. ", "COLOR", 0, 0 }},
+ { 13.4, 1, 0, { "LENGTH ", 0, 0, "ROLL" }},
+ { 13.5, 1, 0, { "SUBJECT", 0, 0, 0 }},
+ { 13.9, 1, 1, { " \342\206\221", "SPLICE", " HERE", 0 }},
+ };
+
+ for (i = 0; i < countof(blurbs); i++)
+ {
+ if (st->value >= blurbs[i].t && st->value <= blurbs[i].t + 1/15.0)
+ {
+ int line_height;
+ int j;
+ xftfont = (blurbs[i].f == 1 ? st->font2 :
+ blurbs[i].f == 2 ? st->font : st->font3);
+
+ XSetForeground (dpy, st->gc,
+ blurbs[i].k == 3 ? st->bg : st->text_color);
+ XFillRectangle (dpy, st->pix, st->gc, 0, 0, st->w, st->h);
+ XSetForeground (dpy, st->gc,
+ blurbs[i].k == 3 ? st->text_color : st->bg);
+ xftcolor = (blurbs[i].k == 3 ?
+ &st->xft_text_color_1 : &st->xft_text_color_2);
+
+ /* The height of a string of spaces is 0... */
+ XftTextExtentsUtf8 (dpy, xftfont, (FcChar8 *) "My", 2, &extents);
+ line_height = extents.height;
+
+ XftTextExtentsUtf8 (dpy, xftfont, (FcChar8 *)
+ blurbs[i].s[0], strlen(blurbs[i].s[0]),
+ &extents);
+ lbearing = -extents.x;
+ rbearing = extents.width - extents.x;
+ ascent = extents.y;
+ descent = extents.height - extents.y;
+
+ x = (st->w - rbearing) / 2;
+ y = st->h * 0.1 + ascent;
+
+ for (j = 0; j < countof(blurbs[i].s); j++)
+ {
+ if (blurbs[i].s[j])
+ XftDrawStringUtf8 (st->xftdraw, xftcolor, xftfont, x, y,
+ (FcChar8 *) blurbs[i].s[j],
+ strlen(blurbs[i].s[j]));
+
+ y += line_height * 1.5;
+
+ if (blurbs[i].s[j])
+ {
+ XftTextExtentsUtf8 (dpy, xftfont, (FcChar8 *)
+ blurbs[i].s[0], strlen(blurbs[i].s[j]),
+ &extents);
+ lbearing = -extents.x;
+ rbearing = extents.width - extents.x;
+ ascent = extents.y;
+ descent = extents.height - extents.y;
+ }
+ }
+
+ if (blurbs[i].k == 2) /* Rotate clockwise and flip */
+ {
+ int wh = st->w < st->h ? st->w : st->h;
+ XImage *img1 = XGetImage (dpy, st->pix,
+ (st->w - wh) / 2,
+ (st->h - wh) / 2,
+ wh, wh, ~0L, ZPixmap);
+ XImage *img2 = XCreateImage (dpy, st->xgwa.visual,
+ st->xgwa.depth, ZPixmap, 0, 0,
+ wh, wh, 32, 0);
+ img2->data = malloc (img2->bytes_per_line * img2->height);
+ for (y = 0; y < wh; y++)
+ for (x = 0; x < wh; x++)
+ XPutPixel (img2, y, x, XGetPixel (img1, x, y));
+ XSetForeground (dpy, st->gc,
+ blurbs[i].k == 3 ? st->bg : st->text_color);
+ XFillRectangle (dpy, st->pix, st->gc, 0, 0, st->w, st->h);
+ XPutImage (dpy, st->pix, st->gc, img2,
+ 0, 0,
+ (st->w - wh) / 2,
+ (st->h - wh) / 2,
+ wh, wh);
+ XDestroyImage (img1);
+ XDestroyImage (img2);
+ }
+ else if (blurbs[i].k == 1) /* Flip vertically */
+ {
+ XImage *img1 = XGetImage (dpy, st->pix, 0, 0,
+ st->w, st->h, ~0L, ZPixmap);
+ XImage *img2 = XCreateImage (dpy, st->xgwa.visual,
+ st->xgwa.depth, ZPixmap, 0, 0,
+ st->w, st->h, 32, 0);
+ img2->data = malloc (img2->bytes_per_line * img2->height);
+ for (y = 0; y < img2->height; y++)
+ for (x = 0; x < img2->width; x++)
+ XPutPixel (img2, x, img2->height-y-1,
+ XGetPixel (img1, x, y));
+ XPutImage (dpy, st->pix, st->gc, img2, 0, 0, 0, 0, st->w, st->h);
+ XDestroyImage (img1);
+ XDestroyImage (img2);
+ }
+
+ goto DONE;
+ }
+ }
+
+ if (st->value < 2.0 || st->value >= 9.0) /* Black screen */
+ {
+ XSetForeground (dpy, st->gc, st->text_color);
+ XFillRectangle (dpy, st->pix, st->gc, 0, 0, st->w, st->h);
+ goto DONE;
+ }
+
+ XSetForeground (dpy, st->gc, st->bg);
+ XFillRectangle (dpy, st->pix, st->gc, 0, 0, st->w, st->h);
+
+ if (r > 1/30.0) /* Sweep line and background */
+ {
+ x = st->w/2 + st->w * cos (M_PI * 2 * r - M_PI/2);
+ y = st->h/2 + st->h * sin (M_PI * 2 * r - M_PI/2);
+
+ XSetForeground (dpy, st->gc, st->trace_color);
+ XFillArc (dpy, st->pix, st->gc,
+ -st->w, -st->h, st->w*3, st->h*3,
+ 90*64,
+ 90*64 - ((r + 0.25) * 360*64));
+
+ XSetForeground (dpy, st->gc, st->text_color);
+ XSetLineAttributes (dpy, st->gc, 1, LineSolid, CapRound, JoinRound);
+ XDrawLine (dpy, st->pix, st->gc, st->w/2, st->h/2, x, y);
+
+ XSetForeground (dpy, st->gc, st->text_color);
+ XSetLineAttributes (dpy, st->gc, 2, LineSolid, CapRound, JoinRound);
+ XDrawLine (dpy, st->pix, st->gc, st->w/2, 0, st->w/2, st->h);
+ XDrawLine (dpy, st->pix, st->gc, 0, st->h/2, st->w, st->h/2);
+ }
+
+ /* Big number */
+
+ s[0] = (char) (ivalue + '0');
+ xftfont = st->font;
+ xftcolor = &st->xft_text_color_1;
+ XftTextExtentsUtf8 (dpy, xftfont, (FcChar8 *) s, 1, &extents);
+ lbearing = -extents.x;
+ rbearing = extents.width - extents.x;
+ ascent = extents.y;
+ descent = extents.height - extents.y;
+
+ x = (st->w - (rbearing + lbearing)) / 2;
+ y = (st->h + (ascent - descent)) / 2;
+ XftDrawStringUtf8 (st->xftdraw, xftcolor, xftfont, x, y, (FcChar8 *) s, 1);
+
+ /* Annotations on 7 and 4 */
+
+ if ((st->value >= 7.75 && st->value <= 7.85) ||
+ (st->value >= 4.00 && st->value <= 4.25))
+ {
+ XSetForeground (dpy, st->gc, st->ring_color);
+ xftcolor = &st->xft_text_color_2;
+ xftfont = st->font2;
+
+ s[0] = (ivalue == 4 ? 'C' : 'M');
+ s[1] = 0;
+
+ XftTextExtentsUtf8 (dpy, xftfont, (FcChar8 *) s, strlen(s), &extents);
+ lbearing = -extents.x;
+ rbearing = extents.width - extents.x;
+ ascent = extents.y;
+ descent = extents.height - extents.y;
+
+ x = st->w * 0.1;
+ y = st->h * 0.1 + ascent;
+ XftDrawStringUtf8 (st->xftdraw, xftcolor, xftfont, x, y,
+ (FcChar8 *) s, strlen(s));
+ x = st->w * 0.9 - (rbearing + lbearing);
+ XftDrawStringUtf8 (st->xftdraw, xftcolor, xftfont, x, y,
+ (FcChar8 *) s, strlen(s));
+
+ s[0] = (ivalue == 4 ? 'F' : '3');
+ s[1] = (ivalue == 4 ? 0 : '5');
+ s[2] = 0;
+
+ XftTextExtentsUtf8 (dpy, xftfont, (FcChar8 *) s, strlen(s), &extents);
+ lbearing = -extents.x;
+ rbearing = extents.width - extents.x;
+ ascent = extents.y;
+ descent = extents.height - extents.y;
+
+ x = st->w * 0.1;
+ y = st->h * 0.95;
+ XftDrawStringUtf8 (st->xftdraw, xftcolor, xftfont, x, y,
+ (FcChar8 *) s, strlen(s));
+ x = st->w * 0.9 - (rbearing + lbearing);
+ XftDrawStringUtf8 (st->xftdraw, xftcolor, xftfont, x, y,
+ (FcChar8 *) s, strlen(s));
+ }
+
+ if (r > 1/30.0) /* Two rings around number */
+ {
+ double r2 = st->w / (double) st->h;
+ double ss = 1;
+
+ if (st->xgwa.width < st->xgwa.height)
+ ss = 0.5;
+
+ XSetForeground (dpy, st->gc, st->ring_color);
+ XSetLineAttributes (dpy, st->gc, st->w * 0.025,
+ LineSolid, CapRound, JoinRound);
+
+ w2 = st->w * 0.8 * ss / r2;
+ h2 = st->h * 0.8 * ss;
+ x = (st->w - w2) / 2;
+ y = (st->h - h2) / 2;
+ XDrawArc (dpy, st->pix, st->gc, x, y, w2, h2, 0, 360*64);
+
+ w2 = w2 * 0.8;
+ h2 = h2 * 0.8;
+ x = (st->w - w2) / 2;
+ y = (st->h - h2) / 2;
+ XDrawArc (dpy, st->pix, st->gc, x, y, w2, h2, 0, 360*64);
+ }
+
+ DONE:
+
+ img = XGetImage (dpy, st->pix, 0, 0, st->w, st->h, ~0L, ZPixmap);
+
+ analogtv_load_ximage (st->tv, st->rec.input, img, 0, 0, 0, 0, 0);
+ analogtv_reception_update (&st->rec);
+ analogtv_draw (st->tv, st->noise, &rec, 1);
+
+ XDestroyImage (img);
+
+ now = double_time();
+ timedelta = (1 / 29.97) - (now - then);
+
+ if (! st->button_down_p)
+ {
+ if (st->last_time == 0)
+ st->start = then;
+ else
+ st->value -= then - st->last_time;
+
+ if (st->value <= 0 ||
+ (r > 0.9 && st->value <= st->stop))
+ {
+ st->value = (random() % 20) ? 8.9 : 15;
+ st->stop = ((random() % 50) ? 2 : 1) + (random() % 5);
+
+ if (st->value > 9) /* Spin the knobs again */
+ {
+ st->rec.level = pow(frand(1.0), 3.0) * 2.0 + 0.05;
+ st->rec.ofs = random() % ANALOGTV_SIGNAL_LEN;
+ st->tv->color_control += frand(0.3) - 0.15;
+ }
+ }
+ }
+
+ st->tv->powerup = then - st->start;
+ st->last_time = then;
+
+ return timedelta > 0 ? timedelta * 1000000 : 0;
+}
+
+
+static void
+filmleader_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ analogtv_reconfigure (st->tv);
+ XGetWindowAttributes (dpy, window, &st->xgwa);
+
+ if ((st->w > st->h) != (st->xgwa.width > st->xgwa.height))
+ {
+ int swap = st->w;
+ st->w = st->h;
+ st->h = swap;
+ }
+}
+
+
+static Bool
+filmleader_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (event->xany.type == ButtonPress)
+ {
+ st->button_down_p = True;
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease)
+ {
+ st->button_down_p = False;
+ return True;
+ }
+ else if (screenhack_event_helper (dpy, window, event))
+ {
+ st->value = 15;
+ st->rec.level = pow(frand(1.0), 3.0) * 2.0 + 0.05;
+ st->rec.ofs = random() % ANALOGTV_SIGNAL_LEN;
+ st->tv->color_control += frand(0.3) - 0.15;
+ return True;
+ }
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c >= '2' && c <= '8')
+ {
+ st->value = (c - '0') + (st->value - (int) st->value);
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+static void
+filmleader_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ analogtv_release (st->tv);
+ XftDrawDestroy (st->xftdraw);
+ XftColorFree(dpy, st->xgwa.visual, st->xgwa.colormap, &st->xft_text_color_1);
+ XftColorFree(dpy, st->xgwa.visual, st->xgwa.colormap, &st->xft_text_color_2);
+ XFreePixmap (dpy, st->pix);
+ XFreeGC (dpy, st->gc);
+ free (st);
+}
+
+
+static const char *filmleader_defaults [] = {
+
+ ".background: #000000",
+
+# ifdef HAVE_MOBILE
+
+ "*textBackground: #444488", /* Need much higher contrast for some reason */
+ "*textColor: #000033",
+ "*ringColor: #DDDDFF",
+ "*traceColor: #222244",
+
+# else /* X11 or Cocoa */
+
+ "*textBackground: #9999DD",
+ "*textColor: #000015",
+ "*ringColor: #DDDDFF",
+ "*traceColor: #555577",
+
+# endif
+
+# ifdef USE_IPHONE
+
+ "*numberFont: Helvetica Bold 120",
+ "*numberFont2: Helvetica 36",
+ "*numberFont3: Helvetica 28",
+
+# else /* X11, Cocoa or Android */
+
+ "*numberFont: -*-helvetica-bold-r-*-*-*-1700-*-*-*-*-*-*",
+ "*numberFont2: -*-helvetica-medium-r-*-*-*-500-*-*-*-*-*-*",
+ "*numberFont3: -*-helvetica-medium-r-*-*-*-360-*-*-*-*-*-*",
+
+# endif
+
+
+ "*noise: 0.04",
+ ANALOGTV_DEFAULTS
+ "*geometry: 1280x720",
+ 0
+};
+
+static XrmOptionDescRec filmleader_options [] = {
+ { "-noise", ".noise", XrmoptionSepArg, 0 },
+ ANALOGTV_OPTIONS
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("FilmLeader", filmleader)
diff --git a/hacks/filmleader.man b/hacks/filmleader.man
new file mode 100644
index 0000000..4a98270
--- /dev/null
+++ b/hacks/filmleader.man
@@ -0,0 +1,69 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+filmleader - screen saver.
+.SH SYNOPSIS
+.B filmleader
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-tv-color \fInumber\fP]
+[\-tv-tint \fInumber\fP]
+[\-noise \fInumber\fP]
+[\-tv-brightness \fInumber\fP]
+[\-tv-contrast \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Displays a looping countdown based on the SMPTE Universal Film leader on a
+simulation of an old analog television.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-tv-color \fInumber\fP
+Color Knob. 0 - 1000. Default: 70.
+.TP 8
+.B \-tv-tint \fInumber\fP
+Tint Knob. 0 - 100. Default: 5.
+.TP 8
+.B \-noise \fInumber\fP
+Noise. 0.0 - 0.2. Default: 0.04.
+.TP 8
+.B \-tv-brightness \fInumber\fP
+Brightness Knob. 0 - 200. Default: 150.
+.TP 8
+.B \-tv-contrast \fInumber\fP
+Contrast Knob. 0 - 1500. Default: 1000.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2018 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/fireworkx.c b/hacks/fireworkx.c
new file mode 100644
index 0000000..faf3745
--- /dev/null
+++ b/hacks/fireworkx.c
@@ -0,0 +1,868 @@
+/*
+ Fireworkx 2.2 - Pyrotechnic explosions simulation,
+ an eyecandy, live animating colorful fireworks super-blasts..!
+ Copyright (GPL) 1999-2013 Rony B Chandran <ronybc@gmail.com>
+
+ From Kerala, INDIA
+ Website: http://www.ronybc.com
+
+ Permission to use, copy, modify, distribute, and sell this software and its
+ documentation for any purpose is hereby granted without fee, provided that
+ the above copyright notice appear in all copies and that both that
+ copyright notice and this permission notice appear in supporting
+ documentation. No representations are made about the suitability of this
+ software for any purpose. It is provided "as is" without express or
+ implied warranty.
+
+ 2004-OCT: ronybc: Landed on Xscreensaver..!
+ 2012-DEC: ronybc: Almost rewrite of the last version (>4 years old)
+ with SSE2 optimization, colored light flashes,
+ HSV color and many visual and speed improvements.
+
+ Additional coding:
+ ---------------------------------------------------------------------------------
+ Support for different display color modes: put_image()
+ Jean-Pierre Demailly <Jean-Pierre.Demailly@ujf-grenoble.fr>
+
+ Fixed array access problems by beating on it with a large hammer.
+ Nicholas Miell <nmiell@gmail.com>
+
+ Help 'free'ing up of memory with needed 'XSync's.
+ Renuka S <renuka@ronybc.com>
+ Rugmini R Chandran <rugmini@ronybc.com>
+\
+ */
+
+#include "screenhack.h"
+
+#ifdef __SSE2__
+# include <emmintrin.h>
+#endif
+
+#define FWXVERSION "2.2"
+
+#define WIDTH 1024 /* 888 */
+#define HEIGHT 632 /* 548 */
+#define SHELLCOUNT 4 /* FIXED NUMBER; for SSE optimization */
+#define PIXCOUNT 500 /* 500 */
+#define SHELL_LIFE_DEFAULT 32 /* 32 */
+#define SHELL_LIFE_RATIO 6 /* 6 */
+#define POWDER 5.0 /* 5.0 */
+#define FTWEAK 12 /* 12 */
+#define FLASH_ZOOM 0.8 /* 1.0 */
+#define G_ACCELERATION 0.001 /* GRAVITY */
+
+typedef struct
+{
+ unsigned int burn;
+ float x, y;
+ float xv, yv;
+} firepix;
+
+typedef struct
+{
+ unsigned int cx, cy;
+ unsigned int seq_number, life;
+ unsigned int bicolor, flies, hshift, vshift;
+ unsigned int mortar_fired, explode_y;
+ float air_drag, vshift_phase;
+ float flash_r, flash_g, flash_b;
+ unsigned int h;
+ double s, v;
+ unsigned char r, g, b;
+ firepix *fpix;
+} fireshell;
+
+struct state
+{
+ unsigned int fps_on;
+ unsigned int flash_on;
+ unsigned int shoot;
+ unsigned int verbose;
+ unsigned int width;
+ unsigned int height;
+ unsigned int fullscreen;
+ unsigned int max_shell_life;
+ unsigned int delay;
+ float flash_fade;
+ float *light_map;
+ unsigned char *palaka1;
+ unsigned char *palaka2;
+ void *mem1;
+ void *mem2;
+ fireshell *fireshell_array;
+
+ Display *dpy;
+ Window window;
+ XImage *xim;
+ GC gc;
+ XColor *colors;
+ int depth;
+ int bigendian;
+ int ncolors;
+ Bool button_down_p;
+ int deferred;
+
+};
+
+/*
+ will return zero.. divide with care.
+*/
+static unsigned int rnd(unsigned int x)
+{
+ return(random() % x);
+}
+
+static void fs_roll_rgb(fireshell *fs)
+{
+ unsigned short r, g, b;
+ hsv_to_rgb (fs->h, fs->s, fs->v, &r, &g, &b);
+ fs->r = (unsigned char) (r >> 8);
+ fs->g = (unsigned char) (g >> 8);
+ fs->b = (unsigned char) (b >> 8);
+}
+
+static void mix_colors(fireshell *fs)
+{
+ float flash;
+ fs->h = rnd(360);
+ fs->s = frand(0.4) + 0.6;
+ fs->v = 1.0;
+ fs_roll_rgb(fs);
+
+ flash = rnd(444) + 111; /* Mega Jouls ! */
+ fs->flash_r = fs->r * flash;
+ fs->flash_g = fs->g * flash;
+ fs->flash_b = fs->b * flash;
+}
+
+static void render_light_map(struct state *st, fireshell *fs)
+{
+ signed int x, y, v = 0;
+ for (y = 0, v = fs->seq_number; y < st->height; y += 2)
+ {
+ for (x = 0; x < st->width; x += 2, v += SHELLCOUNT)
+ {
+ double f;
+ f = sqrt((fs->cx - x) * (fs->cx - x) + (fs->cy - y) * (fs->cy - y)) + 4.0;
+ f = FLASH_ZOOM / f;
+ f += pow(f,0.1) * frand(0.0001); /* dither */
+ st->light_map[v] = f;
+ }
+ }
+}
+
+static void recycle(struct state *st, fireshell *fs, unsigned int x, unsigned int y)
+{
+ unsigned int n, pixlife;
+ firepix *fp = fs->fpix;
+ fs->mortar_fired = st->shoot;
+ fs->explode_y = y;
+ fs->cx = x;
+ fs->cy = st->shoot ? st->height : y ;
+ fs->life = rnd(st->max_shell_life) + (st->max_shell_life/SHELL_LIFE_RATIO);
+ fs->life += !rnd(25) ? st->max_shell_life * 5 : 0;
+ fs->air_drag = 1.0 - (float)(rnd(200)) / (10000.0 + fs->life);
+ fs->bicolor = !rnd(5) ? 120 : 0;
+ fs->flies = !rnd(10) ? 1 : 0; /* flies' motion */
+ fs->hshift = !rnd(5) ? 1 : 0; /* hue shifting */
+ fs->vshift = !rnd(10) ? 1 : 0; /* value shifting */
+ fs->vshift_phase = M_PI/2.0;
+ pixlife = rnd(fs->life) + fs->life / 10 + 1; /* ! */
+ for (n = 0; n < PIXCOUNT; n++)
+ {
+ fp->burn = rnd(pixlife) + 32;
+ fp->xv = frand(2.0) * POWDER - POWDER;
+ fp->yv = sqrt(POWDER * POWDER - fp->xv * fp->xv) * (frand(2.0) - 1.0);
+ fp->x = x;
+ fp->y = y;
+ fp++;
+ }
+ mix_colors(fs);
+ render_light_map(st, fs);
+}
+
+static void recycle_oldest(struct state *st, unsigned int x, unsigned int y)
+{
+ unsigned int n;
+ fireshell *fs, *oldest;
+ fs = oldest = st->fireshell_array;
+ for (n = 0; n < SHELLCOUNT; n++)
+ {
+ if(fs[n].life < oldest->life) oldest = &fs[n];
+ }
+ recycle(st, oldest, x, y);
+}
+
+static void rotate_hue(fireshell *fs, int dh)
+{
+ fs->h = fs->h + dh;
+ fs->s = fs->s - 0.001;
+ fs_roll_rgb(fs);
+}
+
+static void wave_value(fireshell *fs)
+{
+ fs->vshift_phase = fs->vshift_phase + 0.008;
+ fs->v = fabs(sin(fs->vshift_phase));
+ fs_roll_rgb(fs);
+}
+
+static int explode(struct state *st, fireshell *fs)
+{
+ float air_drag;
+ unsigned int n;
+ unsigned int h = st->height;
+ unsigned int w = st->width;
+ unsigned char r, g, b;
+ unsigned char *prgba;
+ unsigned char *palaka = st->palaka1;
+ firepix *fp = fs->fpix;
+ if (fs->mortar_fired)
+ {
+ if (--fs->cy == fs->explode_y)
+ {
+ fs->mortar_fired = 0;
+ mix_colors(fs);
+ render_light_map(st, fs);
+ }
+ else
+ {
+ fs->flash_r =
+ fs->flash_g =
+ fs->flash_b = 50 + (fs->cy - fs->explode_y) * 10;
+ prgba = palaka + (fs->cy * w + fs->cx + rnd(5) - 2) * 4;
+ prgba[0] = (rnd(32) + 128);
+ prgba[1] = (rnd(32) + 128);
+ prgba[2] = (rnd(32) + 128);
+ return(1);
+ }
+ }
+ if ((fs->bicolor + 1) % 50 == 0) rotate_hue(fs, 180);
+ if (fs->bicolor) --fs->bicolor;
+ if (fs->hshift) rotate_hue(fs, rnd(8));
+ if (fs->vshift) wave_value(fs);
+ if (fs->flash_r > 1.0) fs->flash_r *= st->flash_fade;
+ if (fs->flash_g > 1.0) fs->flash_g *= st->flash_fade;
+ if (fs->flash_b > 1.0) fs->flash_b *= st->flash_fade;
+ air_drag = fs->air_drag;
+ r = fs->r;
+ g = fs->g;
+ b = fs->b;
+ for (n = 0; n < PIXCOUNT; n++, fp++)
+ {
+ if (!fp->burn) continue;
+ --fp->burn;
+ if (fs->flies)
+ {
+ fp->x += fp->xv = fp->xv * air_drag + frand(0.1) - 0.05;
+ fp->y += fp->yv = fp->yv * air_drag + frand(0.1) - 0.05 + G_ACCELERATION;
+ }
+ else
+ {
+ fp->x += fp->xv = fp->xv * air_drag + frand(0.01) - 0.005;
+ fp->y += fp->yv = fp->yv * air_drag + frand(0.005) - 0.0025 + G_ACCELERATION;
+ }
+ if (fp->y > h)
+ {
+ if (rnd(5) == 3)
+ {
+ fp->yv *= -0.24;
+ fp->y = h;
+ }
+ /* touch muddy ground :) */
+ else fp->burn = 0;
+ }
+ if (fp->x < w && fp->x > 0 && fp->y < h && fp->y > 0)
+ {
+ prgba = palaka + ((int)fp->y * w + (int)fp->x) * 4;
+ prgba[0] = b;
+ prgba[1] = g;
+ prgba[2] = r;
+ }
+ }
+ return(--fs->life);
+}
+
+#ifdef __SSE2__
+
+/* SSE2 optimized versions of glow_blur() and chromo_2x2_light() */
+
+static void glow_blur(struct state *st)
+{
+ unsigned int n, nn;
+ unsigned char *ps = st->palaka1;
+ unsigned char *pd = st->palaka2;
+ unsigned char *pa = st->palaka1 - (st->width * 4);
+ unsigned char *pb = st->palaka1 + (st->width * 4);
+ __m128i xmm0, xmm1, xmm2, xmm3, xmm4;
+
+ xmm0 = _mm_setzero_si128();
+ nn = st->width * st->height * 4;
+ for (n = 0; n < nn; n+=16)
+ {
+ _mm_prefetch((const void *)&ps[n+16],_MM_HINT_T0);
+ _mm_prefetch((const void *)&pa[n+16],_MM_HINT_T0);
+ _mm_prefetch((const void *)&pb[n+16],_MM_HINT_T0);
+
+ xmm1 = _mm_load_si128((const __m128i*)&ps[n]);
+ xmm2 = xmm1;
+ xmm1 = _mm_unpacklo_epi8(xmm1,xmm0);
+ xmm2 = _mm_unpackhi_epi8(xmm2,xmm0);
+ xmm3 = _mm_loadu_si128((const __m128i*)&ps[n+4]);
+ xmm4 = xmm3;
+ xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
+ xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
+ xmm3 = _mm_slli_epi16(xmm3,3);
+ xmm4 = _mm_slli_epi16(xmm4,3);
+ xmm1 = _mm_add_epi16(xmm1,xmm3);
+ xmm2 = _mm_add_epi16(xmm2,xmm4);
+ xmm3 = _mm_loadu_si128((const __m128i*)&ps[n+8]);
+ xmm4 = xmm3;
+ xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
+ xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
+ xmm1 = _mm_add_epi16(xmm1,xmm3);
+ xmm2 = _mm_add_epi16(xmm2,xmm4);
+
+ xmm3 = _mm_load_si128((const __m128i*)&pa[n]);
+ xmm4 = xmm3;
+ xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
+ xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
+ xmm1 = _mm_add_epi16(xmm1,xmm3);
+ xmm2 = _mm_add_epi16(xmm2,xmm4);
+ xmm3 = _mm_loadu_si128((const __m128i*)&pa[n+4]);
+ xmm4 = xmm3;
+ xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
+ xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
+ xmm1 = _mm_add_epi16(xmm1,xmm3);
+ xmm2 = _mm_add_epi16(xmm2,xmm4);
+ xmm3 = _mm_loadu_si128((const __m128i*)&pa[n+8]);
+ xmm4 = xmm3;
+ xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
+ xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
+ xmm1 = _mm_add_epi16(xmm1,xmm3);
+ xmm2 = _mm_add_epi16(xmm2,xmm4);
+
+ xmm3 = _mm_load_si128((const __m128i*)&pb[n]);
+ xmm4 = xmm3;
+ xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
+ xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
+ xmm1 = _mm_add_epi16(xmm1,xmm3);
+ xmm2 = _mm_add_epi16(xmm2,xmm4);
+ xmm3 = _mm_loadu_si128((const __m128i*)&pb[n+4]);
+ xmm4 = xmm3;
+ xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
+ xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
+ xmm1 = _mm_add_epi16(xmm1,xmm3);
+ xmm2 = _mm_add_epi16(xmm2,xmm4);
+ xmm3 = _mm_loadu_si128((const __m128i*)&pb[n+8]);
+ xmm4 = xmm3;
+ xmm3 = _mm_unpacklo_epi8(xmm3,xmm0);
+ xmm4 = _mm_unpackhi_epi8(xmm4,xmm0);
+ xmm1 = _mm_add_epi16(xmm1,xmm3);
+ xmm2 = _mm_add_epi16(xmm2,xmm4);
+
+ xmm3 = xmm1;
+ xmm4 = xmm2;
+ xmm1 = _mm_srli_epi16(xmm1,4);
+ xmm2 = _mm_srli_epi16(xmm2,4);
+ xmm3 = _mm_srli_epi16(xmm3,3);
+ xmm4 = _mm_srli_epi16(xmm4,3);
+ xmm1 = _mm_packus_epi16(xmm1,xmm2);
+ xmm3 = _mm_packus_epi16(xmm3,xmm4);
+
+ _mm_storeu_si128((__m128i*)&ps[n+4], xmm1);
+ _mm_storeu_si128((__m128i*)&pd[n+4], xmm3);
+ }
+}
+
+static void chromo_2x2_light(struct state *st)
+{
+ __m128 xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6;
+ __m128i xmi4, xmi5, xmi6, xmi7;
+
+ unsigned int x, y, v = 0;
+ unsigned int nl = st->width * 4;
+ unsigned char *mem = st->palaka2;
+ fireshell *fs = st->fireshell_array;
+
+ xmm0 = _mm_setr_ps(fs[0].flash_b, fs[0].flash_g, fs[0].flash_r, 0.0);
+ xmm1 = _mm_setr_ps(fs[1].flash_b, fs[1].flash_g, fs[1].flash_r, 0.0);
+ xmm2 = _mm_setr_ps(fs[2].flash_b, fs[2].flash_g, fs[2].flash_r, 0.0);
+ xmm3 = _mm_setr_ps(fs[3].flash_b, fs[3].flash_g, fs[3].flash_r, 0.0);
+
+ for (y = st->height/2; y; y--, mem += nl)
+ {
+ for (x = st->width/4; x; x--, v += 8, mem += 16)
+ {
+ xmm4 = _mm_set1_ps(st->light_map[v+0]);
+ xmm5 = xmm0;
+ xmm5 = _mm_mul_ps(xmm5,xmm4);
+ xmm4 = _mm_set1_ps(st->light_map[v+1]);
+ xmm4 = _mm_mul_ps(xmm4,xmm1);
+ xmm5 = _mm_add_ps(xmm5,xmm4);
+ xmm4 = _mm_set1_ps(st->light_map[v+2]);
+ xmm4 = _mm_mul_ps(xmm4,xmm2);
+ xmm5 = _mm_add_ps(xmm5,xmm4);
+ xmm4 = _mm_set1_ps(st->light_map[v+3]);
+ xmm4 = _mm_mul_ps(xmm4,xmm3);
+ xmm5 = _mm_add_ps(xmm5,xmm4);
+
+ xmm4 = _mm_set1_ps(st->light_map[v+4]);
+ xmm6 = xmm0;
+ xmm6 = _mm_mul_ps(xmm6,xmm4);
+ xmm4 = _mm_set1_ps(st->light_map[v+5]);
+ xmm4 = _mm_mul_ps(xmm4,xmm1);
+ xmm6 = _mm_add_ps(xmm6,xmm4);
+ xmm4 = _mm_set1_ps(st->light_map[v+6]);
+ xmm4 = _mm_mul_ps(xmm4,xmm2);
+ xmm6 = _mm_add_ps(xmm6,xmm4);
+ xmm4 = _mm_set1_ps(st->light_map[v+7]);
+ xmm4 = _mm_mul_ps(xmm4,xmm3);
+ xmm6 = _mm_add_ps(xmm6,xmm4);
+
+ xmi6 = _mm_cvtps_epi32(xmm5);
+ xmi7 = _mm_cvtps_epi32(xmm6);
+ xmi6 = _mm_packs_epi32(xmi6,xmi6);
+ xmi7 = _mm_packs_epi32(xmi7,xmi7);
+
+ xmi4 = _mm_load_si128((const __m128i*) mem);
+ xmi5 = _mm_unpacklo_epi8(xmi5,xmi4);
+ xmi5 = _mm_srli_epi16(xmi5,8);
+ xmi4 = _mm_unpackhi_epi8(xmi4,xmi4);
+ xmi4 = _mm_srli_epi16(xmi4,8);
+ xmi5 = _mm_add_epi16(xmi5,xmi6);
+ xmi4 = _mm_add_epi16(xmi4,xmi7);
+ xmi5 = _mm_packus_epi16(xmi5,xmi4);
+ _mm_store_si128((__m128i*) mem, xmi5);
+
+ xmi4 = _mm_load_si128((const __m128i*) &mem[nl]);
+ xmi5 = _mm_unpacklo_epi8(xmi5,xmi4);
+ xmi5 = _mm_srli_epi16(xmi5,8);
+ xmi4 = _mm_unpackhi_epi8(xmi4,xmi4);
+ xmi4 = _mm_srli_epi16(xmi4,8);
+ xmi5 = _mm_add_epi16(xmi5,xmi6);
+ xmi4 = _mm_add_epi16(xmi4,xmi7);
+ xmi5 = _mm_packus_epi16(xmi5,xmi4);
+ _mm_store_si128((__m128i*) &mem[nl], xmi5);
+ }
+ }
+}
+
+#else
+
+static void glow_blur(struct state *st)
+{
+ unsigned int n, q;
+ unsigned char *pm = st->palaka1;
+ unsigned char *po = st->palaka2;
+ unsigned char *pa = pm - (st->width * 4);
+ unsigned char *pb = pm + (st->width * 4);
+ /*
+ unsigned int rgba = 0;
+ for (n = st->width*st->height*4; n; n--, pm++, pa++, pb++, po++)
+ {
+ if(++rgba > 3)
+ {
+ rgba = 0;
+ continue;
+ }
+ q = pm[0] + pm[4] * 8 + pm[8] +
+ pa[0] + pa[4] + pa[8] +
+ pb[0] + pb[4] + pb[8];
+ pm[4] = q >> 4;
+ po[4] = q > 2047 ? 255 : q >> 3;
+ }
+ --- using unrolled version ------------
+ */
+ for (n = st->width*st->height*4; n; n-=4)
+ {
+ q = pm[0] + pm[4] * 8 + pm[8] +
+ pa[0] + pa[4] + pa[8] +
+ pb[0] + pb[4] + pb[8];
+ pm[4] = q >> 4;
+ po[4] = q > 2047 ? 255 : q >> 3;
+ q = pm[1] + pm[5] * 8 + pm[9] +
+ pa[1] + pa[5] + pa[9] +
+ pb[1] + pb[5] + pb[9];
+ pm[5] = q >> 4;
+ po[5] = q > 2047 ? 255 : q >> 3;
+ q = pm[2] + pm[6] * 8 + pm[10] +
+ pa[2] + pa[6] + pa[10] +
+ pb[2] + pb[6] + pb[10];
+ pm[6] = q >> 4;
+ po[6] = q > 2047 ? 255 : q >> 3;
+
+ pm+=4, pa+=4, pb+=4, po+=4;
+ }
+}
+
+static inline unsigned char addbs(unsigned char c, unsigned int i)
+{
+ i += c;
+ return(i > 255 ? 255 : i);
+}
+
+static void chromo_2x2_light(struct state *st)
+{
+ unsigned int n, x, y, v = 0;
+ unsigned int nl = st->width * 4;
+ unsigned char *mem = st->palaka2;
+ float r, g, b;
+ float rgb[SHELLCOUNT*4];
+ fireshell *fs = st->fireshell_array;
+
+ for (n = 0, x = 0; n < SHELLCOUNT; n++, x += 4, fs++)
+ {
+ rgb[x ] = fs->flash_r;
+ rgb[x+1] = fs->flash_g;
+ rgb[x+2] = fs->flash_b;
+ }
+
+ for (y = st->height/2; y; y--)
+ {
+ for (x = st->width/2; x; x--, v += 4)
+ {
+ r = rgb[0] * st->light_map[v] + rgb[4] * st->light_map[v+1]
+ + rgb[ 8] * st->light_map[v+2] + rgb[12] * st->light_map[v+3];
+ g = rgb[1] * st->light_map[v] + rgb[5] * st->light_map[v+1]
+ + rgb[ 9] * st->light_map[v+2] + rgb[13] * st->light_map[v+3];
+ b = rgb[2] * st->light_map[v] + rgb[6] * st->light_map[v+1]
+ + rgb[10] * st->light_map[v+2] + rgb[14] * st->light_map[v+3];
+
+ mem[0] = addbs(mem[0], b);
+ mem[1] = addbs(mem[1], g);
+ mem[2] = addbs(mem[2], r);
+ mem[4] = addbs(mem[4], b);
+ mem[5] = addbs(mem[5], g);
+ mem[6] = addbs(mem[6], r);
+
+ mem += nl;
+
+ mem[0] = addbs(mem[0], b);
+ mem[1] = addbs(mem[1], g);
+ mem[2] = addbs(mem[2], r);
+ mem[4] = addbs(mem[4], b);
+ mem[5] = addbs(mem[5], g);
+ mem[6] = addbs(mem[6], r);
+
+ mem -= nl - 8;
+ }
+ mem += nl;
+ }
+}
+
+#endif
+
+static void resize(struct state *st)
+{
+ unsigned int n;
+ fireshell *fs = st->fireshell_array;
+ XWindowAttributes xwa;
+ XGetWindowAttributes (st->dpy, st->window, &xwa);
+ xwa.width -= xwa.width % 4;
+ xwa.height -= xwa.height % 2;
+ st->width = xwa.width;
+ st->height = xwa.height;
+ if (st->verbose)
+ {
+ printf("resolution: %d x %d \n",st->width,st->height);
+ }
+ XSync(st->dpy, 0);
+ if (st->xim)
+ {
+ if (st->xim->data == (char *)st->palaka2) st->xim->data = NULL;
+ XDestroyImage(st->xim);
+ XSync(st->dpy, 0);
+ free(st->mem2);
+ free(st->mem1);
+ }
+ st->xim = XCreateImage(st->dpy, xwa.visual, xwa.depth, ZPixmap, 0, 0,
+ st->width, st->height, 8, 0);
+ if (!st->xim) return;
+
+#ifdef __SSE2___ABANDONED /* causes __ERROR_use_memset_not_bzero_in_xscreensaver__ */
+ st->mem1 = _mm_malloc(((st->height + 2) * st->width + 8)*4, 16);
+ bzero(st->mem1, ((st->height + 2) * st->width + 8)*4);
+ st->mem2 = _mm_malloc(((st->height + 2) * st->width + 8)*4, 16);
+ bzero(st->mem2, ((st->height + 2) * st->width + 8)*4);
+#else
+ st->mem1 = calloc((st->height + 2) * st->width + 8, 4);
+ st->mem2 = calloc((st->height + 2) * st->width + 8, 4);
+#endif
+ st->palaka1 = (unsigned char *) st->mem1 + (st->width * 4 + 16);
+ st->palaka2 = (unsigned char *) st->mem2 + (st->width * 4 + 16);
+
+ if (xwa.depth >= 24)
+ {
+ st->xim->data = (char *)st->palaka2;
+ }
+ else
+ {
+ st->xim->data = calloc(st->height, st->xim->bytes_per_line);
+ }
+
+ if (st->light_map) free(st->light_map);
+ st->light_map = calloc((st->width * st->height * SHELLCOUNT)/4, sizeof(float));
+ for (n = 0; n < SHELLCOUNT; n++, fs++)
+ {
+ render_light_map(st, fs);
+ }
+}
+
+static void put_image(struct state *st)
+{
+ int x,y,i,j;
+ unsigned char r, g, b;
+ if (!st->xim) return;
+ i = 0;
+ j = 0;
+ if (st->depth==16)
+ {
+ if(st->bigendian)
+ for (y=0; y<st->xim->height; y++)
+ for (x=0; x<st->xim->width; x++)
+ {
+ r = st->palaka2[j++];
+ g = st->palaka2[j++];
+ b = st->palaka2[j++];
+ j++;
+ st->xim->data[i++] = (g&224)>>5 | (r&248);
+ st->xim->data[i++] = (b&248)>>3 | (g&28)<<3;
+ }
+ else
+ for (y=0; y<st->xim->height; y++)
+ for (x=0; x<st->xim->width; x++)
+ {
+ r = st->palaka2[j++];
+ g = st->palaka2[j++];
+ b = st->palaka2[j++];
+ j++;
+ st->xim->data[i++] = (b&248)>>3 | (g&28)<<3;
+ st->xim->data[i++] = (g&224)>>5 | (r&248);
+ }
+ }
+ if (st->depth==15)
+ {
+ if(st->bigendian)
+ for (y=0; y<st->xim->height; y++)
+ for (x=0; x<st->xim->width; x++)
+ {
+ r = st->palaka2[j++];
+ g = st->palaka2[j++];
+ b = st->palaka2[j++];
+ j++;
+ st->xim->data[i++] = (g&192)>>6 | (r&248)>>1;
+ st->xim->data[i++] = (b&248)>>3 | (g&56)<<2;
+ }
+ else
+ for (y=0; y<st->xim->height; y++)
+ for (x=0; x<st->xim->width; x++)
+ {
+ r = st->palaka2[j++];
+ g = st->palaka2[j++];
+ b = st->palaka2[j++];
+ j++;
+ st->xim->data[i++] = (b&248)>>3 | (g&56)<<2;
+ st->xim->data[i++] = (g&192)>>6 | (r&248)>>1;
+ }
+ }
+ if (st->depth==8)
+ {
+ for (y=0; y<st->xim->height; y++)
+ for (x=0; x<st->xim->width; x++)
+ {
+ r = st->palaka2[j++];
+ g = st->palaka2[j++];
+ b = st->palaka2[j++];
+ j++;
+ st->xim->data[i++] = (((7*g)/256)*36)+(((6*r)/256)*6)+((6*b)/256);
+ }
+ }
+ XPutImage(st->dpy,st->window,st->gc,st->xim,0,0,0,0,st->xim->width,st->xim->height);
+}
+
+static void *
+fireworkx_init (Display *dpy, Window win)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ unsigned int n;
+ Visual *vi;
+ Colormap cmap;
+ Bool writable;
+ XWindowAttributes xwa;
+ XGCValues gcv;
+ firepix *fp;
+ fireshell *fs;
+
+ st->dpy = dpy;
+ st->window = win;
+ st->xim = NULL;
+ st->flash_on = 1;
+ st->shoot = 0;
+ st->width = 0;
+ st->height = 0;
+ st->max_shell_life = SHELL_LIFE_DEFAULT;
+ st->flash_fade = 0.995;
+ st->light_map = NULL;
+ st->palaka1 = NULL;
+ st->palaka2 = NULL;
+
+ st->flash_on = get_boolean_resource(st->dpy, "flash" , "Boolean");
+ st->shoot = get_boolean_resource(st->dpy, "shoot" , "Boolean");
+ st->verbose = get_boolean_resource(st->dpy, "verbose" , "Boolean");
+ st->max_shell_life = get_integer_resource(st->dpy, "maxlife" , "Integer");
+ /* transition from xscreensaver <= 5.20 */
+ if (st->max_shell_life > 100) st->max_shell_life = 100;
+
+ st->delay = get_integer_resource(st->dpy, "delay" , "Integer");
+
+ st->max_shell_life = pow(10.0,(st->max_shell_life/50.0)+2.7);
+ if(st->max_shell_life < 1000) st->flash_fade = 0.998;
+
+ if(st->verbose)
+ {
+ printf("Fireworkx %s - Pyrotechnics explosions simulation \n", FWXVERSION);
+ printf("Copyright (GPL) 1999-2013 Rony B Chandran <ronybc@gmail.com> \n\n");
+ printf("url: http://www.ronybc.com \n\n");
+ printf("Life = %u\n", st->max_shell_life);
+#ifdef __SSE2__
+ printf("Using SSE2 optimization.\n");
+#endif
+ }
+
+ XGetWindowAttributes(st->dpy,win,&xwa);
+ st->depth = xwa.depth;
+ vi = xwa.visual;
+ cmap = xwa.colormap;
+ st->bigendian = (ImageByteOrder(st->dpy) == MSBFirst);
+
+ if(st->depth==8)
+ {
+ st->colors = (XColor *) calloc(sizeof(XColor),st->ncolors+1);
+ writable = False;
+ make_smooth_colormap(xwa.screen, vi, cmap,
+ st->colors, &st->ncolors,
+ False, &writable, True);
+ }
+ st->gc = XCreateGC(st->dpy, win, 0, &gcv);
+
+ fs = calloc(SHELLCOUNT, sizeof(fireshell));
+ fp = calloc(PIXCOUNT * SHELLCOUNT, sizeof(firepix));
+ st->fireshell_array = fs;
+
+ XGetWindowAttributes (st->dpy, st->window, &xwa);
+ st->depth = xwa.depth;
+
+ resize(st); /* initialize palakas */
+
+ for (n = 0; n < SHELLCOUNT; n++, fs++)
+ {
+ fs->seq_number = n;
+ fs->fpix = fp;
+ recycle (st, fs, rnd(st->width), rnd(st->height));
+ fp += PIXCOUNT;
+ }
+
+ return st;
+}
+
+static unsigned long
+fireworkx_draw (Display *dpy, Window win, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ fireshell *fs;
+ unsigned int n, q;
+ for (q = FTWEAK; q; q--)
+ {
+ fs = st->fireshell_array;
+ for (n = 0; n < SHELLCOUNT; n++, fs++)
+ {
+ if (!explode(st, fs))
+ {
+ if (st->button_down_p)
+ st->deferred++;
+ else
+ recycle(st, fs, rnd(st->width), rnd(st->height));
+ }
+ }
+ }
+
+ while (!st->button_down_p && st->deferred) {
+ st->deferred--;
+ recycle_oldest(st, rnd(st->width), rnd(st->height));
+ }
+
+ glow_blur(st);
+
+ if (st->flash_on)
+ {
+ chromo_2x2_light(st);
+ }
+
+ put_image(st);
+ return st->delay;
+}
+
+static void
+fireworkx_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->width = w;
+ st->height = h;
+ resize(st);
+}
+
+static Bool
+fireworkx_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (event->type == ButtonPress)
+ {
+ recycle_oldest(st, event->xbutton.x, event->xbutton.y);
+ st->button_down_p = True;
+ return True;
+ }
+ else if (event->type == ButtonRelease)
+ {
+ st->button_down_p = False;
+ return True;
+ }
+
+ return False;
+}
+
+static void
+fireworkx_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free(st->mem2);
+ free(st->mem1);
+ free(st->fireshell_array->fpix);
+ free(st->fireshell_array);
+}
+
+static const char *fireworkx_defaults [] =
+{
+ ".background: black",
+ ".foreground: white",
+ "*delay: 10000", /* never default to zero! */
+ "*maxlife: 32",
+ "*flash: True",
+ "*shoot: False",
+ "*verbose: False",
+ 0
+};
+
+static XrmOptionDescRec fireworkx_options [] =
+{
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-maxlife", ".maxlife", XrmoptionSepArg, 0 },
+ { "-no-flash", ".flash", XrmoptionNoArg, "False" },
+ { "-shoot", ".shoot", XrmoptionNoArg, "True" },
+ { "-verbose", ".verbose", XrmoptionNoArg, "True" },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("Fireworkx", fireworkx)
diff --git a/hacks/fireworkx.man b/hacks/fireworkx.man
new file mode 100644
index 0000000..05a383c
--- /dev/null
+++ b/hacks/fireworkx.man
@@ -0,0 +1,88 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+fireworkx - pyrotechnic explosions eye-candy.
+.SH SYNOPSIS
+.B fireworkx
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-verbose]
+[\-noflash]
+[\-shoot]
+[\-delay \fInumber\fP]
+[\-maxlife \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Animates explosions.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-noflash
+Turn off light flash effect. (Runs faster)
+.TP 8
+.B \-shoot
+Fire shells up using mortar.
+.TP 8
+.B \-delay \fInumber\fP
+Delay between frames. In microseconds. (Default: 10000)
+.TP 8
+.B \-maxlife \fInumber\fP
+Maximum decay period for an explosion. (Range: 0-100)
+.TP 8
+.B \-verbose
+For scientific research purposes only..!
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1999-2013 by Rony B Chandran. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+
+.br
+Written by Rony B Chandran <ronybc@gmail.com>
+.br
+
+.br
+Additional programming and support:
+.br
+--------------------------------------------------------------------
+.br
+Rugmini R Chandran <rugmini@ronybc.com>
+.br
+Renuka S <renuka@ronybc.com>
+.br
+Jean-Pierre Demailly <Jean-Pierre.Demailly@ujf-grenoble.fr>
+.br
+Nicholas Miell <nmiell@gmail.com>
+
+.SH URL
+http://www.ronybc.com
+
diff --git a/hacks/flag.c b/hacks/flag.c
new file mode 100644
index 0000000..f12c0bc
--- /dev/null
+++ b/hacks/flag.c
@@ -0,0 +1,565 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ * flag --- a waving flag
+ */
+#if 0
+static const char sccsid[] = "@(#)flag.c 4.02 97/04/01 xlockmore";
+#endif
+
+/* Copyright (c) 1996 Charles Vidal <vidalc@univ-mlv.fr>.
+ * PEtite demo X11 de charles vidal 15 05 96
+ * tourne sous Linux et SOLARIS
+ * thank's to Bas van Gaalen, Holland, PD, for his sources
+ * in pascal vous devez rajouter une ligne dans mode.c
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 22-Jan-98: jwz: made the flag wigglier; added xpm support.
+ * (I tried to do this by re-porting from xlockmore, but the
+ * current xlockmore version is completely inscrutable.)
+ * 13-May-97: jwz@jwz.org: turned into a standalone program.
+ * Made it able to animate arbitrary (runtime) text or bitmaps.
+ * 01-May-96: written.
+ */
+
+#ifdef HAVE_COCOA
+# define DEF_FONT "Monaco 15"
+#else
+# define DEF_FONT "fixed"
+#endif
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 50000 \n" \
+ "*cycles: 1000 \n" \
+ "*size: -7 \n" \
+ "*ncolors: 200 \n" \
+ "*bitmap: \n" \
+ "*font: " DEF_FONT "\n" \
+ "*text: \n" \
+ "*fpsSolid: true \n" \
+ "*lowrez: true \n" \
+
+# define BRIGHT_COLORS
+# define UNIFORM_COLORS
+# define release_flag 0
+# define reshape_flag 0
+# define flag_handle_event 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+
+#include "ximage-loader.h"
+#include "images/gen/bob_png.h"
+
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+# include "flag.h"
+#endif /* !STANDALONE */
+
+
+#ifdef HAVE_UNAME
+# include <sys/utsname.h>
+#endif /* HAVE_UNAME */
+
+#ifdef STANDALONE
+static XrmOptionDescRec opts[] =
+{
+ { "-bitmap", ".flag.bitmap", XrmoptionSepArg, 0 },
+ { "-text", ".flag.text", XrmoptionSepArg, 0 }
+};
+
+#endif /* STANDALONE */
+
+ENTRYPOINT ModeSpecOpt flag_opts = {
+#ifdef STANDALONE
+ 2, opts, 0, NULL, NULL
+#else /* !STANDALONE */
+ 0, NULL, 0, NULL, NULL
+#endif /* STANDALONE */
+};
+
+#define MINSIZE 1
+#define MAXSCALE 8
+#define MINSCALE 2
+#define MAXINITSIZE 6
+#define MININITSIZE 2
+#define MINAMP 5
+#define MAXAMP 20
+#define MAXW(fp) (MAXSCALE * (fp)->image->width + 2 * MAXAMP + (fp)->pointsize)
+#define MAXH(fp) (MAXSCALE * (fp)->image->height+ 2 * MAXAMP + (fp)->pointsize)
+#define MINW(fp) (MINSCALE * (fp)->image->width + 2 * MINAMP + (fp)->pointsize)
+#define MINH(fp) (MINSCALE * (fp)->image->height+ 2 * MINAMP + (fp)->pointsize)
+#define ANGLES 360
+
+typedef struct {
+ int samp;
+ int sofs;
+ int sidx;
+ int x_flag, y_flag;
+ int timer;
+ int initialized;
+ int stab[ANGLES];
+ Bool dbufp;
+ Pixmap cache;
+ int width, height;
+ int pointsize;
+ float size;
+ float inctaille;
+ int startcolor;
+ XImage *image;
+} flagstruct;
+
+static flagstruct *flags = NULL;
+
+static int
+random_num(int n)
+{
+ return ((int) (((float) LRAND() / MAXRAND) * (n + 1.0)));
+}
+
+static void
+initSintab(ModeInfo * mi)
+{
+ flagstruct *fp = &flags[MI_SCREEN(mi)];
+ int i;
+
+ /*-
+ * change the periodicity of the sin formula : the maximum of the
+ * periocity seem to be 16 ( 2^4 ), after the drawing isn't good looking
+ */
+ int periodicity = random_num(4);
+ int puissance = 1;
+
+ /* for (i=0;i<periodicity;i++) puissance*=2; */
+ puissance <<= periodicity;
+ for (i = 0; i < ANGLES; i++)
+ fp->stab[i] = (int) (SINF(i * puissance * M_PI / ANGLES) * fp->samp) +
+ fp->sofs;
+}
+
+static void
+affiche(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ int x, y, xp, yp;
+ flagstruct *fp = &flags[MI_SCREEN(mi)];
+
+ for (x = 0; x < fp->image->width; x++)
+ for (y = fp->image->height-1; y >= 0; y--) {
+ xp = (int) (fp->size * (float) x) +
+ fp->stab[(fp->sidx + x + y) % ANGLES];
+ yp = (int) (fp->size * (float) y) +
+ fp->stab[(fp->sidx + 4 * x + y + y) % ANGLES];
+
+ if (fp->image->depth > 1)
+ XSetForeground(display, MI_GC(mi),
+ XGetPixel(fp->image, x, y));
+ else if (XGetPixel(fp->image, x, y))
+ XSetForeground(display, MI_GC(mi), MI_WIN_BLACK_PIXEL(mi));
+ else if (MI_NPIXELS(mi) <= 2)
+ XSetForeground(display, MI_GC(mi), MI_WIN_WHITE_PIXEL(mi));
+ else
+ XSetForeground(display, MI_GC(mi),
+ MI_PIXEL(mi, (y + x + fp->sidx + fp->startcolor) % MI_NPIXELS(mi)));
+
+ if (fp->cache == MI_WINDOW(mi)) { /* not double-buffering */
+ xp += fp->x_flag;
+ yp += fp->y_flag;
+ }
+
+ if (fp->pointsize <= 1)
+ XDrawPoint(display, fp->cache, MI_GC(mi), xp, yp);
+ else if (fp->pointsize < 6)
+ XFillRectangle(display, fp->cache, MI_GC(mi), xp, yp,
+ fp->pointsize, fp->pointsize);
+ else
+ XFillArc(display, fp->cache, MI_GC(mi), xp, yp,
+ fp->pointsize, fp->pointsize, 0, 360*64);
+ }
+}
+
+#ifdef STANDALONE
+
+static void
+make_flag_bits(ModeInfo *mi)
+{
+ Display *dpy = MI_DISPLAY(mi);
+ flagstruct *fp = &flags[MI_SCREEN(mi)];
+ char *bitmap_name = get_string_resource (dpy, "bitmap", "Bitmap");
+ char *text = get_string_resource (dpy, "text", "Text");
+
+#ifdef HAVE_JWXYZ
+ bitmap_name = 0; /* #### always use default */
+#endif
+
+ /* If neither a bitmap nor text are specified, randomly select either
+ the builtin bitmap or builtin text. */
+ if ((!bitmap_name || !*bitmap_name) && (!text || !*text))
+ {
+ if (random() & 1)
+ {
+ free(bitmap_name);
+ bitmap_name = strdup("(default)");
+ }
+ else
+ {
+ free(text);
+ text = strdup("(default)");
+ }
+ }
+
+ if (bitmap_name &&
+ *bitmap_name &&
+ !!strcmp(bitmap_name, "(default)"))
+ {
+ Pixmap bitmap = 0;
+ int width = 0;
+ int height = 0;
+
+ bitmap = file_to_pixmap (dpy, MI_WINDOW (mi), bitmap_name,
+ &width, &height, 0);
+ if (bitmap)
+ {
+ fp->image = XGetImage(dpy, bitmap, 0, 0, width, height, ~0L,
+ ZPixmap);
+ XFreePixmap(dpy, bitmap);
+ }
+ }
+ else if (text && *text)
+ {
+ char *text2;
+ char *fn = get_string_resource (dpy, "font", "Font");
+ char *def_fn = "fixed";
+ char *line, *token;
+ int width, height;
+ int lines;
+ int margin = 2;
+ int fg = 1;
+ int bg = 0;
+ Pixmap bitmap;
+ XFontStruct *font;
+ XCharStruct overall;
+ XGCValues gcv;
+ GC gc;
+
+ if (!strcmp(text, "(default)"))
+ {
+# ifdef HAVE_UNAME
+ struct utsname uts;
+ if (uname (&uts) < 0)
+ {
+ text = strdup("uname() failed");
+ }
+ else
+ {
+ char *s;
+ if ((s = strchr(uts.nodename, '.')))
+ *s = 0;
+ text = (char *) malloc(strlen(uts.nodename) +
+ strlen(uts.sysname) +
+ strlen(uts.version) +
+ strlen(uts.release) + 10);
+# if defined(_AIX)
+ sprintf(text, "%s\n%s %s.%s",
+ uts.nodename, uts.sysname, uts.version, uts.release);
+# elif defined(__APPLE__) && !defined(USE_IPHONE) /* MacOS X + XDarwin */
+ {
+ const char *file =
+ "/System/Library/CoreServices/SystemVersion.plist";
+ FILE *f = fopen (file, "r");
+ char *pbv = 0, *pn = 0, *puvv = 0;
+ if (f) {
+ char *s, buf[255];
+
+ while (fgets (buf, sizeof(buf)-1, f)) {
+# define GRAB(S,V) \
+ if (strstr(buf, S)) { \
+ fgets (buf, sizeof(buf)-1, f); \
+ if ((s = strchr (buf, '>'))) V = strdup(s+1); \
+ if ((s = strchr (V, '<'))) *s = 0; \
+ }
+ GRAB ("ProductName", pn)
+ GRAB ("ProductBuildVersion", pbv)
+ GRAB ("ProductUserVisibleVersion", puvv)
+# undef GRAB
+ }
+ }
+ if (pbv)
+ sprintf (text, "%s\n%s\n%s",
+ uts.nodename, pn, puvv /*, uts.machine*/);
+ else
+ sprintf(text, "%s\n%s %s",
+ uts.nodename, uts.sysname, uts.release);
+ }
+# else
+ sprintf(text, "%s\n%s %s",
+ uts.nodename, uts.sysname, uts.release);
+# endif /* special system types */
+ }
+#else /* !HAVE_UNAME */
+# ifdef VMS
+ text = strdup(getenv("SYS$NODE"));
+# else
+ text = strdup("X\nScreen\nSaver");
+# endif
+#endif /* !HAVE_UNAME */
+ }
+
+ while (*text &&
+ (text[strlen(text)-1] == '\r' ||
+ text[strlen(text)-1] == '\n'))
+ text[strlen(text)-1] = 0;
+
+ text2 = strdup(text);
+
+ if (!fn) fn = def_fn;
+ font = load_font_retry (dpy, fn);
+
+ memset(&overall, 0, sizeof(overall));
+ token = text;
+ lines = 0;
+ while ((line = strtok(token, "\r\n")))
+ {
+ XCharStruct o2;
+ int ascent, descent, direction;
+ token = 0;
+ XTextExtents(font, line, strlen(line),
+ &direction, &ascent, &descent, &o2);
+ overall.lbearing = MAX(overall.lbearing, o2.lbearing);
+ overall.rbearing = MAX(overall.rbearing, o2.rbearing);
+ lines++;
+ }
+
+ width = overall.lbearing + overall.rbearing + margin + margin + 1;
+ height = ((font->ascent + font->descent) * lines) + margin + margin;
+
+ bitmap = XCreatePixmap(dpy, MI_WINDOW(mi), width, height, 1);
+
+ gcv.font = font->fid;
+ gcv.foreground = bg;
+ gc = XCreateGC (dpy, bitmap, (GCFont | GCForeground), &gcv);
+ XFillRectangle(dpy, bitmap, gc, 0, 0, width, height);
+ XSetForeground(dpy, gc, fg);
+
+ token = text2;
+ lines = 0;
+ while ((line = strtok(token, "\r\n")))
+ {
+ XCharStruct o2;
+ int ascent, descent, direction, xoff;
+ token = 0;
+
+ XTextExtents(font, line, strlen(line),
+ &direction, &ascent, &descent, &o2);
+ xoff = ((overall.lbearing + overall.rbearing) -
+ (o2.lbearing + o2.rbearing)) / 2;
+
+ XDrawString(dpy, bitmap, gc,
+ overall.lbearing + margin + xoff,
+ ((font->ascent * (lines + 1)) +
+ (font->descent * lines) +
+ margin),
+ line, strlen(line));
+ lines++;
+ }
+ free(text2);
+ XUnloadFont(dpy, font->fid);
+ XFree((XPointer) font);
+ XFreeGC(dpy, gc);
+
+ fp->image = XGetImage(dpy, bitmap, 0, 0, width, height, 1L, XYPixmap);
+ XFreePixmap(dpy, bitmap);
+ }
+
+
+ if (! fp->image)
+ {
+ XImage *im = image_data_to_ximage (dpy, MI_VISUAL(mi),
+ bob_png, sizeof(bob_png));
+ int x, y;
+
+ fp->image = XCreateImage (dpy, MI_VISUAL(mi), 1, XYBitmap, 0,
+ 0, im->width, im->height, 8, 0);
+ fp->image->data = malloc (fp->image->bytes_per_line * fp->image->height);
+
+ /* Convert deep image to 1 bit */
+ for (y = 0; y < im->height; y++)
+ {
+ for (x = 0; x < im->width; x++)
+ {
+ unsigned long p = XGetPixel (im, x, im->height-y-1);
+ if (! (p & 0xFF000000)) p = ~0; /* alpha -> white */
+ p = (p >> 16) & 0xFF; /* red */
+ XPutPixel (fp->image, x, y, p > 0x7F ? 0 : 1);
+ }
+ }
+ XDestroyImage (im);
+ }
+
+ if (bitmap_name)
+ free (bitmap_name);
+ if (text)
+ free (text);
+}
+
+#else /* !STANDALONE */
+
+static void
+make_flag_bits(ModeInfo *mi)
+{
+ flagstruct *fp = &flags[MI_SCREEN(mi)];
+ int x, y;
+ int w = flag_width;
+ int h = flag_height;
+ int i = 0;
+ fp->image =
+ XCreateImage(MI_DISPLAY(mi), MI_VISUAL(mi),
+ 1, XYBitmap, 0, /* dpth, fmt, offset */
+ (char *) calloc ((w+8) / 8, h), /* data */
+ w, h, 8, 0); /* w, h, pad, bpl */
+ /* Geez, what kinda goofy bit order is this?? */
+ for (x = 0; x < w; x++)
+ for (y = h-1; y >= 0; y--)
+ XPutPixel (fp->image, x, y, flag_bits[i++]);
+}
+
+#endif /* !STANDALONE */
+
+
+ENTRYPOINT void
+init_flag(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ int size = MI_SIZE(mi);
+ flagstruct *fp;
+
+ MI_INIT (mi, flags);
+ fp = &flags[MI_SCREEN(mi)];
+
+ make_flag_bits(mi);
+ if (!fp->image) abort();
+
+ fp->width = MI_WIN_WIDTH(mi);
+ fp->height = MI_WIN_HEIGHT(mi);
+
+ fp->samp = MAXAMP; /* Amplitude */
+ fp->sofs = 20; /* ???????? */
+ fp->pointsize = size;
+ if (size < -MINSIZE)
+ fp->pointsize = NRAND(-size - MINSIZE + 1) + MINSIZE;
+ if (fp->pointsize < MINSIZE ||
+ fp->width <= MAXW(fp) || fp->height <= MAXH(fp))
+ fp->pointsize = MINSIZE;
+ fp->size = MAXINITSIZE; /* Initial distance between pts */
+ fp->inctaille = 0.05;
+ fp->timer = 0;
+ fp->sidx = fp->x_flag = fp->y_flag = 0;
+
+ if (!fp->initialized) {
+ fp->dbufp = True;
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ fp->dbufp = False;
+#endif
+ fp->initialized = True;
+ if (!fp->dbufp)
+ fp->cache = MI_WINDOW(mi); /* not double-buffering */
+ else
+ if (!(fp->cache = XCreatePixmap(display, MI_WINDOW(mi),
+ MAXW(fp), MAXH(fp),
+ MI_WIN_DEPTH(mi))))
+#ifdef STANDALONE
+ exit(-1);
+#else /* !STANDALONE */
+ error("%s: catastrophe memoire\n");
+#endif /* !STANDALONE */
+ }
+ XSetForeground(display, MI_GC(mi), MI_WIN_BLACK_PIXEL(mi));
+ XFillRectangle(display, fp->cache, MI_GC(mi),
+ 0, 0, MAXW(fp), MAXH(fp));
+ /* don't want any exposure events from XCopyArea */
+ XSetGraphicsExposures(display, MI_GC(mi), False);
+ if (MI_NPIXELS(mi) > 2)
+ fp->startcolor = NRAND(MI_NPIXELS(mi));
+ if (fp->width <= MAXW(fp) || fp->height <= MAXH(fp)) {
+ fp->samp = MINAMP;
+ fp->sofs = 0;
+ fp->x_flag = random_num(fp->width - MINW(fp));
+ fp->y_flag = random_num(fp->height - MINH(fp));
+ } else {
+ fp->samp = MAXAMP;
+ fp->sofs = 20;
+ fp->x_flag = random_num(fp->width - MAXW(fp));
+ fp->y_flag = random_num(fp->height - MAXH(fp));
+ }
+
+ initSintab(mi);
+
+ XClearWindow(display, MI_WINDOW(mi));
+}
+
+ENTRYPOINT void
+draw_flag(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ flagstruct *fp = &flags[MI_SCREEN(mi)];
+
+ if (!fp->image) abort();
+ if (fp->cache == window) { /* not double-buffering */
+ XClearWindow (display, window);
+ } else if (fp->width <= MAXW(fp) || fp->height <= MAXH(fp)) {
+ fp->size = MININITSIZE;
+ /* fp->pointsize = MINPOINTSIZE; */
+ XCopyArea(display, fp->cache, window, MI_GC(mi),
+ 0, 0, MINW(fp), MINH(fp), fp->x_flag, fp->y_flag);
+ } else {
+ if ((fp->size + fp->inctaille) > MAXSCALE)
+ fp->inctaille = -fp->inctaille;
+ if ((fp->size + fp->inctaille) < MINSCALE)
+ fp->inctaille = -fp->inctaille;
+ fp->size += fp->inctaille;
+ XCopyArea(display, fp->cache, window, MI_GC(mi),
+ 0, 0, MAXW(fp), MAXH(fp), fp->x_flag, fp->y_flag);
+ }
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WIN_BLACK_PIXEL(mi));
+ XFillRectangle(display, fp->cache, MI_GC(mi),
+ 0, 0, MAXW(fp), MAXH(fp));
+ affiche(mi);
+ fp->sidx += 2;
+ fp->sidx %= (ANGLES * MI_NPIXELS(mi));
+ fp->timer++;
+ if ((MI_CYCLES(mi) > 0) && (fp->timer >= MI_CYCLES(mi)))
+ init_flag(mi);
+}
+
+ENTRYPOINT void
+free_flag(ModeInfo * mi)
+{
+ int screen = MI_SCREEN(mi);
+
+ if (flags == NULL)
+ return;
+
+ if (flags[screen].cache && flags[screen].dbufp)
+ XFreePixmap(MI_DISPLAY(mi), flags[screen].cache);
+ if (flags[screen].image)
+ XDestroyImage(flags[screen].image);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_flag(ModeInfo * mi)
+{
+ /* Do nothing, it will refresh by itself */
+}
+#endif
+
+XSCREENSAVER_MODULE ("Flag", flag)
diff --git a/hacks/flag.man b/hacks/flag.man
new file mode 100644
index 0000000..dcf93f7
--- /dev/null
+++ b/hacks/flag.man
@@ -0,0 +1,92 @@
+.TH XScreenSaver 1 "24-May-97" "X Version 11"
+.SH NAME
+flag - draws a waving flag, containing text or an image
+.SH SYNOPSIS
+.B flag
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-size \fIinteger\fP] [\-text \fIstring\fP] [\-font \fIfont\fP] [\-bitmap \fIxbm-file\fP]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIflag\fP program draws a waving flag that contains text or a bitmap.
+.SH OPTIONS
+.I flag
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 200.
+.TP 8
+.B \-cycles \fIinteger\fP
+
+.TP 8
+.B \-count \fIinteger\fP
+
+.TP 8
+.B \-size \fIinteger\fP
+How large the pixels in the flag should be, from 1 to 8.
+If this is a negative number, the pixel size is chosen randomly
+from the range 1 to -size. Default -7.
+.TP 8
+.B \-text \fItext\fP
+The text to display in the flag. Multiple lines of text are allowed;
+the lines will be displayed centered atop one another. Default: none.
+If the text is the magic string \fI"(default)"\fP, then the text used
+will be the local machine name; a newline; and the local OS version.
+.TP 8
+.B \-bitmap \fIxbm-file\fP
+The bitmap to display in the flag; this must be an XBM file (color XPMs
+are not allowed.) Default: none. If the bitmap is the magic
+string \fI"(default)"\fP, then the bitmap used will be a charming
+little picture of J. R. "Bob" Dobbs.
+
+If neither \fI\-text\fP nor \fI\-bitmap\fP are specified, then either
+the builtin text or the builtin bitmap will be chosen randomly.
+.TP 8
+.B \-font \fIfont\fP
+The font in which to draw the text; the default is
+"-*-helvetica-bold-r-*-240-*".
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1996 Charles Vidal.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+
+.SH AUTHOR
+Charles Vidal <vidalc@univ-mlv.fr>, 1996.
+
+Ability to run standalone or with \fIxscreensaver\fP, and the \-text
+and \-bitmap options, added by Jamie Zawinski <jwz@jwz.org>, 24-May-97.
diff --git a/hacks/flame.c b/hacks/flame.c
new file mode 100644
index 0000000..7b59056
--- /dev/null
+++ b/hacks/flame.c
@@ -0,0 +1,466 @@
+/* xscreensaver, Copyright (c) 1993-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* This file was ported from xlock for use in xscreensaver (and standalone)
+ * by jwz on 18-Oct-93. (And again, 11-May-97.) Original copyright reads:
+ *
+ * static char sccsid[] = "@(#)flame.c 1.4 91/09/27 XLOCK";
+ *
+ * flame.c - recursive fractal cosmic flames.
+ *
+ * Copyright (c) 1991 by Patrick J. Naughton.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Comments and additions should be sent to the author:
+ *
+ * naughton@eng.sun.com
+ *
+ * Patrick J. Naughton
+ * MS 21-14
+ * Sun Laboritories, Inc.
+ * 2550 Garcia Ave
+ * Mountain View, CA 94043
+ *
+ * Revision History:
+ * 01-Jun-95: This should look more like the original with some updates by
+ * Scott Draves.
+ * 27-Jun-91: vary number of functions used.
+ * 24-Jun-91: fixed portability problem with integer mod (%).
+ * 06-Jun-91: Written. (received from Scott Draves, spot@cs.cmu.edu).
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+#include <signal.h> /* so we can ignore SIGFPE */
+
+#define POINT_BUFFER_SIZE 10
+#define MAXLEV 4
+#define MAXKINDS 10
+
+struct state {
+ Display *dpy;
+ Window window;
+
+ double f[2][3][MAXLEV]; /* three non-homogeneous transforms */
+ int max_total;
+ int max_levels;
+ int max_points;
+ int cur_level;
+ int variation;
+ int snum;
+ int anum;
+ int num_points;
+ int total_points;
+ int pixcol;
+ int ncolors;
+ XColor *colors;
+ XPoint points [POINT_BUFFER_SIZE];
+ GC gc;
+
+ int delay, delay2;
+ int width, height;
+
+ short lasthalf;
+
+ int flame_alt;
+ int do_reset;
+};
+
+
+static short
+halfrandom (struct state *st, int mv)
+{
+ unsigned long r;
+
+ if (st->lasthalf)
+ {
+ r = st->lasthalf;
+ st->lasthalf = 0;
+ }
+ else
+ {
+ r = random ();
+ st->lasthalf = r >> 16;
+ }
+ return (r % mv);
+}
+
+static void *
+flame_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+ XWindowAttributes xgwa;
+ Colormap cmap;
+
+ st->dpy = dpy;
+ st->window = window;
+
+#if defined(SIGFPE) && defined(SIG_IGN)
+ /* No doubt a better fix would be to track down where the NaN is coming
+ from, and code around that; but this should do. Apparently most systems
+ (Linux, Solaris, Irix, ...) ignore FPE by default -- but FreeBSD dumps
+ core by default. */
+ signal (SIGFPE, SIG_IGN);
+#endif
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ st->width = xgwa.width;
+ st->height = xgwa.height;
+ cmap = xgwa.colormap;
+
+ st->max_points = get_integer_resource (st->dpy, "iterations", "Integer");
+ if (st->max_points <= 0) st->max_points = 100;
+
+ st->max_levels = st->max_points;
+
+ st->max_total = get_integer_resource (st->dpy, "points", "Integer");
+ if (st->max_total <= 0) st->max_total = 10000;
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ if (st->delay < 0) st->delay = 0;
+ st->delay2 = get_integer_resource (st->dpy, "delay2", "Integer");
+ if (st->delay2 < 0) st->delay2 = 0;
+
+ st->variation = random() % MAXKINDS;
+
+ if (mono_p)
+ st->ncolors = 0;
+ else
+ {
+ st->ncolors = get_integer_resource (st->dpy, "colors", "Integer");
+ if (st->ncolors <= 0) st->ncolors = 128;
+ st->colors = (XColor *) malloc ((st->ncolors+1) * sizeof (*st->colors));
+ make_smooth_colormap (xgwa.screen, xgwa.visual, xgwa.colormap,
+ st->colors, &st->ncolors,
+ True, 0, True);
+ if (st->ncolors <= 2)
+ mono_p = True, st->ncolors = 0;
+ }
+
+ gcv.foreground = get_pixel_resource (st->dpy, cmap, "foreground", "Foreground");
+ gcv.background = get_pixel_resource (st->dpy, cmap, "background", "Background");
+
+ if (! mono_p)
+ {
+ st->pixcol = halfrandom (st, st->ncolors);
+ gcv.foreground = (st->colors [st->pixcol].pixel);
+ }
+
+ st->gc = XCreateGC (st->dpy, st->window, GCForeground | GCBackground, &gcv);
+ return st;
+}
+
+static int
+recurse (struct state *st, double x, double y, int l, Display *dpy, Window win)
+{
+ int i;
+ double nx, ny;
+
+ if (l == st->max_levels)
+ {
+ st->total_points++;
+ if (st->total_points > st->max_total) /* how long each fractal runs */
+ return 0;
+
+ if (x > -1.0 && x < 1.0 && y > -1.0 && y < 1.0)
+ {
+ st->points[st->num_points].x = (int) ((st->width / 2) * (x + 1.0));
+ st->points[st->num_points].y = (int) ((st->height / 2) * (y + 1.0));
+ st->num_points++;
+ if (st->num_points >= POINT_BUFFER_SIZE)
+ {
+ XDrawPoints (st->dpy, win, st->gc, st->points, st->num_points, CoordModeOrigin);
+ st->num_points = 0;
+ }
+ }
+ }
+ else
+ {
+ for (i = 0; i < st->snum; i++)
+ {
+
+ /* Scale back when values get very large. Spot sez:
+ "I think this happens on HPUX. I think it's non-IEEE
+ to generate an exception instead of a silent NaN."
+ */
+ if ((fabs(x) > 1.0E5) || (fabs(y) > 1.0E5))
+ x = x / y;
+
+ nx = st->f[0][0][i] * x + st->f[0][1][i] * y + st->f[0][2][i];
+ ny = st->f[1][0][i] * x + st->f[1][1][i] * y + st->f[1][2][i];
+ if (i < st->anum)
+ {
+ switch (st->variation)
+ {
+ case 0: /* sinusoidal */
+ nx = sin(nx);
+ ny = sin(ny);
+ break;
+ case 1: /* complex */
+ {
+ double r2 = nx * nx + ny * ny + 1e-6;
+ nx = nx / r2;
+ ny = ny / r2;
+ }
+ break;
+ case 2: /* bent */
+ if (nx < 0.0)
+ nx = nx * 2.0;
+ if (ny < 0.0)
+ ny = ny / 2.0;
+ break;
+ case 3: /* swirl */
+ {
+ double r = (nx * nx + ny * ny); /* times k here is fun */
+ double c1 = sin(r);
+ double c2 = cos(r);
+ double t = nx;
+
+ if (nx > 1e4 || nx < -1e4 || ny > 1e4 || ny < -1e4)
+ ny = 1e4;
+ else
+ ny = c2 * t + c1 * ny;
+ nx = c1 * nx - c2 * ny;
+ }
+ break;
+ case 4: /* horseshoe */
+ {
+ double r, c1, c2, t;
+
+ /* Avoid atan2: DOMAIN error message */
+ if (nx == 0.0 && ny == 0.0)
+ r = 0.0;
+ else
+ r = atan2(nx, ny); /* times k here is fun */
+ c1 = sin(r);
+ c2 = cos(r);
+ t = nx;
+
+ nx = c1 * nx - c2 * ny;
+ ny = c2 * t + c1 * ny;
+ }
+ break;
+ case 5: /* drape */
+ {
+ double t;
+
+ /* Avoid atan2: DOMAIN error message */
+ if (nx == 0.0 && ny == 0.0)
+ t = 0.0;
+ else
+ t = atan2(nx, ny) / M_PI;
+
+ if (nx > 1e4 || nx < -1e4 || ny > 1e4 || ny < -1e4)
+ ny = 1e4;
+ else
+ ny = sqrt(nx * nx + ny * ny) - 1.0;
+ nx = t;
+ }
+ break;
+ case 6: /* broken */
+ if (nx > 1.0)
+ nx = nx - 1.0;
+ if (nx < -1.0)
+ nx = nx + 1.0;
+ if (ny > 1.0)
+ ny = ny - 1.0;
+ if (ny < -1.0)
+ ny = ny + 1.0;
+ break;
+ case 7: /* spherical */
+ {
+ double r = 0.5 + sqrt(nx * nx + ny * ny + 1e-6);
+
+ nx = nx / r;
+ ny = ny / r;
+ }
+ break;
+ case 8: /* */
+ nx = atan(nx) / M_PI_2;
+ ny = atan(ny) / M_PI_2;
+ break;
+/* #if 0 */ /* core dumps on some machines, why not all? */
+ case 9: /* complex sine */
+ {
+ double u = nx;
+ double v = ny;
+ double ev = exp(v);
+ double emv = exp(-v);
+
+ nx = (ev + emv) * sin(u) / 2.0;
+ ny = (ev - emv) * cos(u) / 2.0;
+ }
+ break;
+ case 10: /* polynomial */
+ if (nx < 0)
+ nx = -nx * nx;
+ else
+ nx = nx * nx;
+ if (ny < 0)
+ ny = -ny * ny;
+ else
+ ny = ny * ny;
+ break;
+/* #endif */
+ default:
+ nx = sin(nx);
+ ny = sin(ny);
+ }
+ }
+ if (!recurse (st, nx, ny, l + 1, st->dpy, win))
+ return 0;
+ }
+ }
+ return 1;
+}
+
+static unsigned long
+flame_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ int i, j, k;
+ unsigned long this_delay = st->delay;
+
+ if (st->do_reset)
+ {
+ st->do_reset = 0;
+ XClearWindow (st->dpy, st->window);
+ }
+
+ if (!(st->cur_level++ % st->max_levels))
+ {
+ st->do_reset = 1;
+ this_delay = st->delay2;
+ st->flame_alt = !st->flame_alt;
+ st->variation = random() % MAXKINDS;
+ }
+ else
+ {
+ if (st->ncolors > 2)
+ {
+ XSetForeground (st->dpy, st->gc, st->colors [st->pixcol].pixel);
+ if (--st->pixcol < 0)
+ st->pixcol = st->ncolors - 1;
+ }
+ }
+
+ /* number of functions */
+ st->snum = 2 + (st->cur_level % (MAXLEV - 1));
+
+ /* how many of them are of alternate form */
+ if (st->flame_alt)
+ st->anum = 0;
+ else
+ st->anum = halfrandom (st, st->snum) + 2;
+
+ /* 6 coefs per function */
+ for (k = 0; k < st->snum; k++)
+ {
+ for (i = 0; i < 2; i++)
+ for (j = 0; j < 3; j++)
+ st->f[i][j][k] = ((double) (random() & 1023) / 512.0 - 1.0);
+ }
+ st->num_points = 0;
+ st->total_points = 0;
+ recurse (st, 0.0, 0.0, 0, st->dpy, st->window);
+ XDrawPoints (st->dpy, st->window, st->gc, st->points, st->num_points, CoordModeOrigin);
+
+ return this_delay;
+}
+
+
+#if defined(__hpux) && defined(PLOSS)
+/* I don't understand why this is necessary, but I'm told that this program
+ does nothing at all on HP-sUX without it.
+
+ I'm further told that HPUX 11.0 doesn't define PLOSS, and works ok without
+ this section. Go figure.
+ */
+#undef random
+#undef srandom
+#include <math.h>
+int matherr(x)
+ register struct exception *x;
+{
+ if (x->type == PLOSS) return 1;
+ else return 0;
+}
+#endif /* __hpux */
+
+
+
+static const char *flame_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ "*fpsSolid: true",
+ "*colors: 64",
+ "*iterations: 25",
+ "*delay: 50000",
+ "*delay2: 2000000",
+ "*points: 10000",
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec flame_options [] = {
+ { "-colors", ".colors", XrmoptionSepArg, 0 },
+ { "-iterations", ".iterations", XrmoptionSepArg, 0 },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-delay2", ".delay2", XrmoptionSepArg, 0 },
+ { "-points", ".points", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+static void
+flame_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ st->width = w;
+ st->height = h;
+}
+
+static Bool
+flame_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (screenhack_event_helper (dpy, window, event))
+ {
+ st->do_reset = 1;
+ return True;
+ }
+ return False;
+}
+
+static void
+flame_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ free (st);
+}
+
+XSCREENSAVER_MODULE ("Flame", flame)
+
diff --git a/hacks/flame.man b/hacks/flame.man
new file mode 100644
index 0000000..dae4d1b
--- /dev/null
+++ b/hacks/flame.man
@@ -0,0 +1,74 @@
+.TH XScreenSaver 1 "13-aug-92" "X Version 11"
+.SH NAME
+flame - draw weird cosmic fractals
+.SH SYNOPSIS
+.B flame
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-colors \fIinteger\fP] [\-iterations \fIinteger\fP] [\-points \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-delay2 \fImicroseconds\fP]
+[\-fps]
+.SH DESCRIPTION
+The \fIflame\fP program generates colorful fractal displays.
+.SH OPTIONS
+.I flame
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-colors \fIinteger\fP
+How many colors should be used (if possible). Default 64.
+.TP 8
+.B \-iterations \fIinteger\fP
+How many fractals to generate. Default 25.
+.TP 8
+.B \-points \fIinteger\fP
+How many pixels to draw for each fractal. Default 10000.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How long we should wait between drawing each fractal. Default 50000,
+or about 1/20th second.
+.TP 8
+.B \-delay2 \fImicroseconds\fP
+How long we should wait before clearing the screen when each run ends.
+Default 2000000, or two seconds.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1991 by Patrick J. Naughton
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Scott Graves <spot@cs.cmu.edu>, 06-Jun-91.n
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 18-Oct-93.
diff --git a/hacks/flow.c b/hacks/flow.c
new file mode 100644
index 0000000..6dddd8e
--- /dev/null
+++ b/hacks/flow.c
@@ -0,0 +1,1211 @@
+/* -*- Mode: C; tab-width: 4; c-basic-offset: 4 -*- */
+/* flow --- flow of strange bees */
+
+#if 0
+static const char sccsid[] = "@(#)flow.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1996 by Tim Auckland <tda10.geo@yahoo.com>
+ * Incorporating some code from Stephen Davies Copyright (c) 2000
+ *
+ * Search code based on techniques described in "Strange Attractors:
+ * Creating Patterns in Chaos" by Julien C. Sprott
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * "flow" shows a variety of continuous phase-space flows around strange
+ * attractors. It includes the well-known Lorentz mask (the "Butterfly"
+ * of chaos fame), two forms of Rossler's "Folded Band" and Poincare'
+ * sections of the "Birkhoff Bagel" and Duffing's forced occilator. "flow"
+ * can now discover new attractors.
+ *
+ * Revision History:
+ *
+ * 29-Oct-2004: [TDA] Discover Attractors unknown to science.
+ * Replace 2D rendering of Periodic Attractors with a 3D
+ * 'interrupted' rendering. Replace "-/+allow2d" with "-/+periodic"
+ * Replace all ODE formulae with completely generic forms.
+ * Add '-search' option to perform background high-speed discovery
+ * for completely new attractors without impacting rendering
+ * performance.
+ * Use gaussian distribution for initial point positions and for
+ * parameter search.
+ * Add "+dbuf" option to allow Double-Buffering to be turned off on
+ * slow X servers.
+ * Remove redundant '-zoom' option. Now automatically zooms if both
+ * rotation and riding are permitted.
+ * Replace dynamic bounding box with static one pre-calculated
+ * during discovery phase.
+ * Simplify and fix bounding box clipping code. Should now be safe
+ * to run without double buffer on all XFree86 servers if desired.
+ * 12-Oct-2004: [TDA] Merge Xscreensaver and Xlockmore branches
+ * Added Chalky's orbital camera, but made the zooming work by
+ * flying the camera rather than interpolating the view transforms.
+ * Added Chalky's Bounding Box, but time-averaged the boundaries to
+ * let the lost bees escape.
+ * Added Chalky's 'view-frustrum' clipping, but only applying it to
+ * the Bounding Box. Trails make clipping less useful.
+ * Added Chalky's "-slow" and "-freeze" options for compatibility,
+ * but haven't implemented the features, since the results are ugly
+ * and make no mathematical contribution.
+ * Added Double-Buffering as a work-around for a persistent XFree86
+ * bug that left debris on the screen.
+ * 21-Mar-2003: [TDA] Trails added (XLockmore branch)
+ * 01-Nov-2000: [TDA] Allocation checks (XLockmore branch)
+ * 21-Feb-2000: [Chalky] Major hackage (Stephen Davies, chalky@null.net)
+ * (Xscreensaver branch)
+ * Forced perspective mode, added 3d box around attractor which
+ * involved coding 3d-planar-clipping against the view-frustrum
+ * thingy. Also made view alternate between piggybacking on a 'bee'
+ * to zooming around outside the attractor. Most bees slow down and
+ * stop, to make the structure of the attractor more obvious.
+* 28-Jan-1999: [TDA] Catch 'lost' bees in flow.c and disable them.
+ * (XLockmore branch)
+ * I chose to disable them rather than reinitialise them because
+ * reinitialising can produce fake attractors.
+ * This has allowed me to relax some of the parameters and initial
+ * conditions slightly to catch some of the more extreme cases. As a
+ * result you may see some bees fly away at the start - these are the ones
+ * that 'missed' the attractor. If the bee with the camera should fly
+ * away the mode will restart :-)
+ * 31-Nov-1998: [TDA] Added Duffing (what a strange day that was :) DAB)
+ * Duffing's forced oscillator has been added to the formula list and
+ * the parameters section has been updated to display it in Poincare'
+ * section.
+ * 30-Nov-1998: [TDA] Added travelling perspective option
+ * A more exciting point-of-view has been added to all autonomous flows.
+ * This views the flow as seen by a particle moving with the flow. In the
+ * metaphor of the original code, I've attached a camera to one of the
+ * trained bees!
+ * 30-Nov-1998: [TDA] Much code cleanup.
+ * 09-Apr-1997: [TDA] Ported to xlockmore-4
+ * 18-Jul-1996: Adapted from swarm.c Copyright (c) 1991 by Patrick J. Naughton.
+ * 31-Aug-1990: Adapted from xswarm by Jeff Butterworth. (butterwo@ncsc.org).
+ */
+
+#ifdef STANDALONE
+# define MODE_flow
+# define DEFAULTS "*delay: 10000 \n" \
+ "*count: 3000 \n" \
+ "*size: -10 \n" \
+ "*cycles: 10000 \n" \
+ "*ncolors: 200 \n"
+
+# define release_flow 0
+# define reshape_flow 0
+# define flow_handle_event 0
+# include "xlockmore.h" /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_flow
+
+#define DEF_ROTATE "TRUE"
+#define DEF_RIDE "TRUE"
+#define DEF_BOX "TRUE"
+#define DEF_PERIODIC "TRUE"
+#define DEF_SEARCH "TRUE"
+#define DEF_DBUF "TRUE"
+
+static Bool rotatep;
+static Bool ridep;
+static Bool boxp;
+static Bool periodicp;
+static Bool searchp;
+static Bool dbufp;
+
+static XrmOptionDescRec opts[] = {
+ {"-rotate", ".flow.rotate", XrmoptionNoArg, "on"},
+ {"+rotate", ".flow.rotate", XrmoptionNoArg, "off"},
+ {"-ride", ".flow.ride", XrmoptionNoArg, "on"},
+ {"+ride", ".flow.ride", XrmoptionNoArg, "off"},
+ {"-box", ".flow.box", XrmoptionNoArg, "on"},
+ {"+box", ".flow.box", XrmoptionNoArg, "off"},
+ {"-periodic", ".flow.periodic", XrmoptionNoArg, "on"},
+ {"+periodic", ".flow.periodic", XrmoptionNoArg, "off"},
+ {"-search", ".flow.search", XrmoptionNoArg, "on"},
+ {"+search", ".flow.search", XrmoptionNoArg, "off"},
+ {"-dbuf", ".flow.dbuf", XrmoptionNoArg, "on"},
+ {"+dbuf", ".flow.dbuf", XrmoptionNoArg, "off"},
+};
+
+static argtype vars[] = {
+ {&rotatep, "rotate", "Rotate", DEF_ROTATE, t_Bool},
+ {&ridep, "ride", "Ride", DEF_RIDE, t_Bool},
+ {&boxp, "box", "Box", DEF_BOX, t_Bool},
+ {&periodicp, "periodic", "Periodic", DEF_PERIODIC, t_Bool},
+ {&searchp, "search", "Search", DEF_SEARCH, t_Bool},
+ {&dbufp, "dbuf", "Dbuf", DEF_DBUF, t_Bool},
+};
+
+static OptionStruct desc[] = {
+ {"-/+rotate", "turn on/off rotating around attractor."},
+ {"-/+ride", "turn on/off ride in the flow."},
+ {"-/+box", "turn on/off bounding box."},
+ {"-/+periodic", "turn on/off periodic attractors."},
+ {"-/+search", "turn on/off search for new attractors."},
+ {"-/+dbuf", "turn on/off double buffering."},
+};
+
+ENTRYPOINT ModeSpecOpt flow_opts =
+{sizeof opts / sizeof opts[0], opts,
+ sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct flow_description = {
+ "flow", "init_flow", "draw_flow", NULL,
+ "refresh_flow", "init_flow", "free_flow", &flow_opts,
+ 1000, 1024, 10000, -10, 200, 1.0, "",
+ "Shows dynamic strange attractors", 0, NULL
+};
+
+#endif
+
+typedef struct { double x, y, z; } dvector;
+
+#define N_PARS 20 /* Enough for Full Cubic or Periodic Cubic */
+typedef dvector Par[N_PARS];
+enum { /* Name the parameter indices to make it easier to write
+ standard examples */
+ C,
+ X,XX,XXX,XXY,XXZ,XY,XYY,XYZ,XZ,XZZ,
+ Y,YY,YYY,YYZ,YZ,YZZ,
+ Z,ZZ,ZZZ,
+ SINY = XY /* OK to overlap in this case */
+};
+
+/* Camera target [TDA] */
+typedef enum {
+ ORBIT = 0,
+ BEE = 1
+} Chaseto;
+
+/* Macros */
+#define IX(C) ((C) * segindex + sp->cnsegs[(C)])
+#define B(t,b) (sp->p + (t) + (b) * sp->taillen)
+#define X(t,b) (B((t),(b))->x)
+#define Y(t,b) (B((t),(b))->y)
+#define Z(t,b) (B((t),(b))->z)
+#define balance_rand(v) ((LRAND()/MAXRAND*(v))-((v)/2)) /* random around 0 */
+#define LOST_IN_SPACE 2000.0
+#define INITIALSTEP 0.04
+#define EYEHEIGHT 0.005
+#define MINTRAIL 2
+#define BOX_L 36
+
+/* Points that make up the box (normalized coordinates) */
+static const double box[][3] = {
+ {1,1,1}, /* 0 */
+ {1,1,-1}, /* 1 */
+ {1,-1,-1}, /* 2 */
+ {1,-1,1}, /* 3 */
+ {-1,1,1}, /* 4 */
+ {-1,1,-1}, /* 5 */
+ {-1,-1,-1},/* 6 */
+ {-1,-1,1}, /* 7 */
+ {1, .8, .8},
+ {1, .8,-.8},
+ {1,-.8,-.8},
+ {1,-.8, .8},
+ { .8,1, .8},
+ { .8,1,-.8},
+ {-.8,1,-.8},
+ {-.8,1, .8},
+ { .8, .8,1},
+ { .8,-.8,1},
+ {-.8,-.8,1},
+ {-.8, .8,1},
+ {-1, .8, .8},
+ {-1, .8,-.8},
+ {-1,-.8,-.8},
+ {-1,-.8, .8},
+ { .8,-1, .8},
+ { .8,-1,-.8},
+ {-.8,-1,-.8},
+ {-.8,-1, .8},
+ { .8, .8,-1},
+ { .8,-.8,-1},
+ {-.8,-.8,-1},
+ {-.8, .8,-1}
+};
+
+/* Lines connecting the box dots */
+static const double lines[][2] = {
+ {0,1}, {1,2}, {2,3}, {3,0}, /* box */
+ {4,5}, {5,6}, {6,7}, {7,4},
+ {0,4}, {1,5}, {2,6}, {3,7},
+ {4+4,5+4}, {5+4,6+4}, {6+4,7+4}, {7+4,4+4},
+ {4+8,5+8}, {5+8,6+8}, {6+8,7+8}, {7+8,4+8},
+ {4+12,5+12}, {5+12,6+12}, {6+12,7+12}, {7+12,4+12},
+ {4+16,5+16}, {5+16,6+16}, {6+16,7+16}, {7+16,4+16},
+ {4+20,5+20}, {5+20,6+20}, {6+20,7+20}, {7+20,4+20},
+ {4+24,5+24}, {5+24,6+24}, {6+24,7+24}, {7+24,4+24},
+};
+
+typedef struct {
+ /* Variables used in rendering */
+ dvector cam[3]; /* camera flight path */
+ int chasetime;
+ Chaseto chaseto;
+ Pixmap buffer; /* Double Buffer */
+ dvector circle[2]; /* POV that circles around the scene */
+ dvector centre; /* centre */
+ int beecount; /* number of bees */
+ XSegment *csegs; /* bee lines */
+ int *cnsegs;
+ XSegment *old_segs; /* old bee lines */
+ int nold_segs;
+ int taillen;
+
+ /* Variables common to iterators */
+ dvector (*ODE) (Par par, double x, double y, double z);
+ dvector range; /* Initial conditions */
+ double yperiod; /* ODE's where Y is periodic. */
+
+ /* Variables used in iterating main flow */
+ Par par;
+ dvector *p; /* bee positions x[time][bee#] */
+ int count;
+ double lyap;
+ double size;
+ dvector mid; /* Effective bounding box */
+ double step;
+
+ /* second set of variables, used for parallel search */
+ Par par2;
+ dvector p2[2];
+ int count2;
+ double lyap2;
+ double size2;
+ dvector mid2;
+ double step2;
+
+} flowstruct;
+
+static flowstruct *flows = (flowstruct *) NULL;
+
+/*
+ * Private functions
+ */
+
+
+/* ODE functions */
+
+/* Generic 3D Cubic Polynomial. Includes all the Quadratics (Lorentz,
+ Rossler) and much more! */
+
+/* I considered offering a seperate 'Quadratic' option, since Cubic is
+ clearly overkill for the standard examples, but the performance
+ difference is too small to measure. The compute time is entirely
+ dominated by the XDrawSegments calls anyway. [TDA] */
+static dvector
+Cubic(Par a, double x, double y, double z)
+{
+ dvector d;
+ d.x = a[C].x + a[X].x*x + a[XX].x*x*x + a[XXX].x*x*x*x + a[XXY].x*x*x*y +
+ a[XXZ].x*x*x*z + a[XY].x*x*y + a[XYY].x*x*y*y + a[XYZ].x*x*y*z +
+ a[XZ].x*x*z + a[XZZ].x*x*z*z + a[Y].x*y + a[YY].x*y*y +
+ a[YYY].x*y*y*y + a[YYZ].x*y*y*z + a[YZ].x*y*z + a[YZZ].x*y*z*z +
+ a[Z].x*z + a[ZZ].x*z*z + a[ZZZ].x*z*z*z;
+
+ d.y = a[C].y + a[X].y*x + a[XX].y*x*x + a[XXX].y*x*x*x + a[XXY].y*x*x*y +
+ a[XXZ].y*x*x*z + a[XY].y*x*y + a[XYY].y*x*y*y + a[XYZ].y*x*y*z +
+ a[XZ].y*x*z + a[XZZ].y*x*z*z + a[Y].y*y + a[YY].y*y*y +
+ a[YYY].y*y*y*y + a[YYZ].y*y*y*z + a[YZ].y*y*z + a[YZZ].y*y*z*z +
+ a[Z].y*z + a[ZZ].y*z*z + a[ZZZ].y*z*z*z;
+
+ d.z = a[C].z + a[X].z*x + a[XX].z*x*x + a[XXX].z*x*x*x + a[XXY].z*x*x*y +
+ a[XXZ].z*x*x*z + a[XY].z*x*y + a[XYY].z*x*y*y + a[XYZ].z*x*y*z +
+ a[XZ].z*x*z + a[XZZ].z*x*z*z + a[Y].z*y + a[YY].z*y*y +
+ a[YYY].z*y*y*y + a[YYZ].z*y*y*z + a[YZ].z*y*z + a[YZZ].z*y*z*z +
+ a[Z].z*z + a[ZZ].z*z*z + a[ZZZ].z*z*z*z;
+
+ return d;
+}
+
+/* 3D Cubic in (x,z) with periodic sinusoidal forcing term in x. y is
+ the independent periodic (time) axis. This includes Birkhoff's
+ Bagel and Duffing's Attractor */
+static dvector
+Periodic(Par a, double x, double y, double z)
+{
+ dvector d;
+
+ d.x = a[C].x + a[X].x*x + a[XX].x*x*x + a[XXX].x*x*x*x +
+ a[XXZ].x*x*x*z + a[XZ].x*x*z + a[XZZ].x*x*z*z + a[Z].x*z +
+ a[ZZ].x*z*z + a[ZZZ].x*z*z*z + a[SINY].x*sin(y);
+
+ d.y = a[C].y;
+
+ d.z = a[C].z + a[X].z*x + a[XX].z*x*x + a[XXX].z*x*x*x +
+ a[XXZ].z*x*x*z + a[XZ].z*x*z + a[XZZ].z*x*z*z + a[Z].z*z +
+ a[ZZ].z*z*z + a[ZZZ].z*z*z*z;
+
+ return d;
+}
+
+/* Numerical integration of the ODE using 2nd order Runge Kutta.
+ Returns length^2 of the update, so that we can detect if the step
+ size needs reducing. */
+static double
+Iterate(dvector *p, dvector(*ODE)(Par par, double x, double y, double z),
+ Par par, double step)
+{
+ dvector k1, k2, k3;
+
+ k1 = ODE(par, p->x, p->y, p->z);
+ k1.x *= step;
+ k1.y *= step;
+ k1.z *= step;
+ k2 = ODE(par, p->x + k1.x, p->y + k1.y, p->z + k1.z);
+ k2.x *= step;
+ k2.y *= step;
+ k2.z *= step;
+ k3.x = (k1.x + k2.x) / 2.0;
+ k3.y = (k1.y + k2.y) / 2.0;
+ k3.z = (k1.z + k2.z) / 2.0;
+
+ p->x += k3.x;
+ p->y += k3.y;
+ p->z += k3.z;
+
+ return k3.x*k3.x + k3.y*k3.y + k3.z*k3.z;
+}
+
+/* Memory functions */
+
+#define deallocate(p,t) if (p!=NULL) {free(p); p=(t*)NULL; }
+#define allocate(p,t,s) if ((p=(t*)malloc(sizeof(t)*s))==NULL)\
+{free_flow(mi);return;}
+
+ENTRYPOINT void
+free_flow(ModeInfo * mi)
+{
+ flowstruct *sp = &flows[MI_SCREEN(mi)];
+ deallocate(sp->csegs, XSegment);
+ deallocate(sp->cnsegs, int);
+ deallocate(sp->old_segs, XSegment);
+ deallocate(sp->p, dvector);
+}
+
+/* Generate Gaussian random number: mean 0, "amplitude" A (actually
+ A is 3*standard deviation). */
+
+/* Note this generates a pair of gaussian variables, so it saves one
+ to give out next time it's called */
+static double
+Gauss_Rand(double A)
+{
+ static double d;
+ static Bool ready = 0;
+ if(ready) {
+ ready = 0;
+ return A/3 * d;
+ } else {
+ double x, y, w;
+ do {
+ x = 2.0 * (double)LRAND() / MAXRAND - 1.0;
+ y = 2.0 * (double)LRAND() / MAXRAND - 1.0;
+ w = x*x + y*y;
+ } while(w >= 1.0);
+
+ w = sqrt((-2 * log(w))/w);
+ ready = 1;
+ d = x * w;
+ return A/3 * y * w;
+ }
+}
+
+/* Attempt to discover new atractors by sending a pair of bees on a
+ fast trip through the new flow and computing their Lyapunov
+ exponent. Returns False if the bees fly away.
+
+ If the bees stay bounded, the new bounds and the Lyapunov exponent
+ are stored in sp and the function returns True.
+
+ Repeat invocations continue the flow and improve the accuracy of
+ the bounds and the Lyapunov exponent. Set sp->count2 to zero to
+ start a new test.
+
+ Acts on alternate variable set, so that it can be run in parallel
+ with the main flow */
+
+static Bool
+discover(ModeInfo * mi)
+{
+ flowstruct *sp;
+ double l = 0;
+ dvector dl;
+ dvector max, min;
+ double dl2, df, rs, lsum = 0, s, maxv2 = 0, v2;
+
+ int N, i, nl = 0;
+
+ if (flows == NULL)
+ return 0;
+ sp = &flows[MI_SCREEN(mi)];
+
+ if(sp->count2 == 0) {
+ /* initial conditions */
+ sp->p2[0].x = Gauss_Rand(sp->range.x);
+ sp->p2[0].y = (sp->yperiod > 0)?
+ balance_rand(sp->range.y) : Gauss_Rand(sp->range.y);
+ sp->p2[0].z = Gauss_Rand(sp->range.z);
+
+ /* 1000 steps to find an attractor */
+ /* Most cases explode out here */
+ for(N=0; N < 1000; N++){
+ Iterate(sp->p2, sp->ODE, sp->par2, sp->step2);
+ if(sp->yperiod > 0 && sp->p2[0].y > sp->yperiod)
+ sp->p2[0].y -= sp->yperiod;
+ if(fabs(sp->p2[0].x) > LOST_IN_SPACE ||
+ fabs(sp->p2[0].y) > LOST_IN_SPACE ||
+ fabs(sp->p2[0].z) > LOST_IN_SPACE) {
+ return 0;
+ }
+ sp->count2++;
+ }
+ /* Small perturbation */
+ sp->p2[1].x = sp->p2[0].x + 0.000001;
+ sp->p2[1].y = sp->p2[0].y;
+ sp->p2[1].z = sp->p2[0].z;
+ }
+
+ /* Reset bounding box */
+ max.x = min.x = sp->p2[0].x;
+ max.y = min.y = sp->p2[0].y;
+ max.z = min.z = sp->p2[0].z;
+
+ /* Compute Lyapunov Exponent */
+
+ /* (Technically, we're only estimating the largest Lyapunov
+ Exponent, but that's all we need to know to determine if we
+ have a strange attractor.) [TDA] */
+
+ /* Fly two bees close together */
+ for(N=0; N < 5000; N++){
+ for(i=0; i< 2; i++) {
+ v2 = Iterate(sp->p2+i, sp->ODE, sp->par2, sp->step2);
+ if(sp->yperiod > 0 && sp->p2[i].y > sp->yperiod)
+ sp->p2[i].y -= sp->yperiod;
+
+ if(fabs(sp->p2[i].x) > LOST_IN_SPACE ||
+ fabs(sp->p2[i].y) > LOST_IN_SPACE ||
+ fabs(sp->p2[i].z) > LOST_IN_SPACE) {
+ return 0;
+ }
+ if(v2 > maxv2) maxv2 = v2; /* Track max v^2 */
+ }
+
+ /* find bounding box */
+ if ( sp->p2[0].x < min.x ) min.x = sp->p2[0].x;
+ else if ( sp->p2[0].x > max.x ) max.x = sp->p2[0].x;
+ if ( sp->p2[0].y < min.y ) min.y = sp->p2[0].y;
+ else if ( sp->p2[0].y > max.y ) max.y = sp->p2[0].y;
+ if ( sp->p2[0].z < min.z ) min.z = sp->p2[0].z;
+ else if ( sp->p2[0].z > max.z ) max.z = sp->p2[0].z;
+
+ /* Measure how much we have to pull the two bees to prevent
+ them diverging. */
+ dl.x = sp->p2[1].x - sp->p2[0].x;
+ dl.y = sp->p2[1].y - sp->p2[0].y;
+ dl.z = sp->p2[1].z - sp->p2[0].z;
+
+ dl2 = dl.x*dl.x + dl.y*dl.y + dl.z*dl.z;
+ if(dl2 > 0) {
+ df = 1e12 * dl2;
+ rs = 1/sqrt(df);
+ sp->p2[1].x = sp->p2[0].x + rs * dl.x;
+ sp->p2[1].y = sp->p2[0].y + rs * dl.y;
+ sp->p2[1].z = sp->p2[0].z + rs * dl.z;
+ lsum = lsum + log(df);
+ nl = nl + 1;
+ l = M_LOG2E / 2 * lsum / nl / sp->step2;
+ }
+ sp->count2++;
+ }
+ /* Anything that didn't explode has a finite attractor */
+ /* If Lyapunov is negative then it probably hit a fixed point or a
+ * limit cycle. Positive Lyapunov indicates a strange attractor. */
+
+ sp->lyap2 = l;
+
+ sp->size2 = max.x - min.x;
+ s = max.y - min.y;
+ if(s > sp->size2) sp->size2 = s;
+ s = max.z - min.z;
+ if(s > sp->size2) sp->size2 = s;
+
+ sp->mid2.x = (max.x + min.x) / 2;
+ sp->mid2.y = (max.y + min.y) / 2;
+ sp->mid2.z = (max.z + min.z) / 2;
+
+ if(sqrt(maxv2) > sp->size2 * 0.2) {
+ /* Flowing too fast, reduce step size. This
+ helps to eliminate high-speed limit cycles,
+ which can show +ve Lyapunov due to integration
+ inaccuracy. */
+ sp->step2 /= 2;
+ }
+ return 1;
+}
+
+/* Sets up initial conditions for a flow without all the extra baggage
+ that goes with init_flow */
+static void
+restart_flow(ModeInfo * mi)
+{
+ flowstruct *sp;
+ int b;
+
+ if (flows == NULL)
+ return;
+ sp = &flows[MI_SCREEN(mi)];
+ sp->count = 0;
+
+ /* Re-Initialize point positions, velocities, etc. */
+ for (b = 0; b < sp->beecount; b++) {
+ X(0, b) = Gauss_Rand(sp->range.x);
+ Y(0, b) = (sp->yperiod > 0)?
+ balance_rand(sp->range.y) : Gauss_Rand(sp->range.y);
+ Z(0, b) = Gauss_Rand(sp->range.z);
+ }
+}
+
+/* Returns true if line was behind a clip plane, or it clips the line */
+/* nx,ny,nz is the normal to the plane. d is the distance from the origin */
+/* s and e are the end points of the line to be clipped */
+static int
+clip(double nx, double ny, double nz, double d, dvector *s, dvector *e)
+{
+ int front1, front2;
+ dvector w, p;
+ double t;
+
+ front1 = (nx*s->x + ny*s->y + nz*s->z >= -d);
+ front2 = (nx*e->x + ny*e->y + nz*e->z >= -d);
+ if (!front1 && !front2) return 1;
+ if (front1 && front2) return 0;
+ w.x = e->x - s->x;
+ w.y = e->y - s->y;
+ w.z = e->z - s->z;
+
+ /* Find t in line equation */
+ t = ( -d - nx*s->x - ny*s->y - nz*s->z) / ( nx*w.x + ny*w.y + nz*w.z);
+
+ p.x = s->x + w.x * t;
+ p.y = s->y + w.y * t;
+ p.z = s->z + w.z * t;
+
+ /* Move clipped point to the intersection */
+ if (front2) {
+ *s = p;
+ } else {
+ *e = p;
+ }
+ return 0;
+}
+
+/*
+ * Public functions
+ */
+
+ENTRYPOINT void
+init_flow (ModeInfo * mi)
+{
+ flowstruct *sp;
+ char *name;
+
+ MI_INIT (mi, flows);
+ sp = &flows[MI_SCREEN(mi)];
+
+ sp->count2 = 0;
+
+ sp->taillen = MI_SIZE(mi);
+ if (sp->taillen < -MINTRAIL) {
+ /* Change by sqrt so it seems more variable */
+ sp->taillen = NRAND((int)sqrt((double) (-sp->taillen - MINTRAIL + 1)));
+ sp->taillen = sp->taillen * sp->taillen + MINTRAIL;
+ } else if (sp->taillen < MINTRAIL) {
+ sp->taillen = MINTRAIL;
+ }
+
+ if(!rotatep && !ridep) rotatep = True; /* We need at least one viewpoint */
+
+ /* Start camera at Orbit or Bee */
+ if(rotatep) {
+ sp->chaseto = ORBIT;
+ } else {
+ sp->chaseto = BEE;
+ }
+ sp->chasetime = 1; /* Go directly to target */
+
+ sp->lyap = 0;
+ sp->yperiod = 0;
+ sp->step2 = INITIALSTEP;
+
+ /* Zero parameter set */
+ memset(sp->par2, 0, N_PARS * sizeof(dvector));
+
+ /* Set up standard examples */
+ switch (NRAND((periodicp) ? 5 : 3)) {
+ case 0:
+ /*
+ x' = a(y - x)
+ y' = x(b - z) - y
+ z' = xy - cz
+ */
+ name = "Lorentz";
+ sp->par2[Y].x = 10 + balance_rand(5*0); /* a */
+ sp->par2[X].x = - sp->par2[Y].x; /* -a */
+ sp->par2[X].y = 28 + balance_rand(5*0); /* b */
+ sp->par2[XZ].y = -1;
+ sp->par2[Y].y = -1;
+ sp->par2[XY].z = 1;
+ sp->par2[Z].z = - 2 + balance_rand(1*0); /* -c */
+ break;
+ case 1:
+ /*
+ x' = -(y + az)
+ y' = x + by
+ z' = c + z(x - 5.7)
+ */
+ name = "Rossler";
+ sp->par2[Y].x = -1;
+ sp->par2[Z].x = -2 + balance_rand(1); /* a */
+ sp->par2[X].y = 1;
+ sp->par2[Y].y = 0.2 + balance_rand(0.1); /* b */
+ sp->par2[C].z = 0.2 + balance_rand(0.1); /* c */
+ sp->par2[XZ].z = 1;
+ sp->par2[Z].z = -5.7;
+ break;
+ case 2:
+ /*
+ x' = -(y + az)
+ y' = x + by - cz^2
+ z' = 0.2 + z(x - 5.7)
+ */
+ name = "RosslerCone";
+ sp->par2[Y].x = -1;
+ sp->par2[Z].x = -2; /* a */
+ sp->par2[X].y = 1;
+ sp->par2[Y].y = 0.2; /* b */
+ sp->par2[ZZ].y = -0.331 + balance_rand(0.01); /* c */
+ sp->par2[C].z = 0.2;
+ sp->par2[XZ].z = 1;
+ sp->par2[Z].z = -5.7;
+ break;
+ case 3:
+ /*
+ x' = -z + b sin(y)
+ y' = c
+ z' = 0.7x + az(0.1 - x^2)
+ */
+ name = "Birkhoff";
+ sp->par2[Z].x = -1;
+ sp->par2[SINY].x = 0.35 + balance_rand(0.25); /* b */
+ sp->par2[C].y = 1.57; /* c */
+ sp->par2[X].z = 0.7;
+ sp->par2[Z].z = 1 + balance_rand(0.5); /* a/10 */
+ sp->par2[XXZ].z = -10 * sp->par2[Z].z; /* -a */
+ sp->yperiod = 2 * M_PI;
+ break;
+ default:
+ /*
+ x' = -ax - z/2 - z^3/8 + b sin(y)
+ y' = c
+ z' = 2x
+ */
+ name = "Duffing";
+ sp->par2[X].x = -0.2 + balance_rand(0.1); /* a */
+ sp->par2[Z].x = -0.5;
+ sp->par2[ZZZ].x = -0.125;
+ sp->par2[SINY].x = 27.0 + balance_rand(3.0); /* b */
+ sp->par2[C].y = 1.33; /* c */
+ sp->par2[X].z = 2;
+ sp->yperiod = 2 * M_PI;
+ break;
+
+ }
+
+ sp->range.x = 5;
+ sp->range.z = 5;
+
+ if(sp->yperiod > 0) {
+ sp->ODE = Periodic;
+ /* periodic flows show either uniform distribution or a
+ snapshot on the 'time' axis */
+ sp->range.y = NRAND(2)? sp->yperiod : 0;
+ } else {
+ sp->range.y = 5;
+ sp->ODE = Cubic;
+ }
+
+ /* Run discoverer to set up bounding box, etc. Lyapunov will
+ probably be innaccurate, since we're only running it once, but
+ we're using known strange attractors so it should be ok. */
+ discover(mi);
+ if(MI_IS_VERBOSE(mi))
+ fprintf(stdout,
+ "flow: Lyapunov exponent: %g, step: %g, size: %g (%s)\n",
+ sp->lyap2, sp->step2, sp->size2, name);
+ /* Install new params */
+ sp->lyap = sp->lyap2;
+ sp->size = sp->size2;
+ sp->mid = sp->mid2;
+ sp->step = sp->step2;
+ memcpy(sp->par, sp->par2, sizeof(sp->par2));
+
+ sp->count2 = 0; /* Reset search */
+
+ sp->beecount = MI_COUNT(mi);
+ if (!sp->beecount) {
+ sp->beecount = 1; /* The camera requires 1 or more */
+ } else if (sp->beecount < 0) { /* random variations */
+ sp->beecount = NRAND(-sp->beecount) + 1; /* Minimum 1 */
+ }
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ dbufp = False;
+# endif
+
+ if(dbufp) { /* Set up double buffer */
+ if (sp->buffer != None)
+ XFreePixmap(MI_DISPLAY(mi), sp->buffer);
+ sp->buffer = XCreatePixmap(MI_DISPLAY(mi), MI_WINDOW(mi),
+ MI_WIDTH(mi), MI_HEIGHT(mi), MI_DEPTH(mi));
+ } else {
+ sp->buffer = MI_WINDOW(mi);
+ }
+ /* no "NoExpose" events from XCopyArea wanted */
+ XSetGraphicsExposures(MI_DISPLAY(mi), MI_GC(mi), False);
+
+ /* Make sure we're using 'thin' lines */
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), 0, LineSolid, CapNotLast,
+ JoinMiter);
+
+ /* Clear the background (may be slow depending on user prefs). */
+ MI_CLEARWINDOW(mi);
+
+ /* Allocate memory. */
+ if (sp->csegs == NULL) {
+ allocate(sp->csegs, XSegment,
+ (sp->beecount + BOX_L) * MI_NPIXELS(mi) * sp->taillen);
+ allocate(sp->cnsegs, int, MI_NPIXELS(mi));
+ allocate(sp->old_segs, XSegment, (sp->beecount + BOX_L) * sp->taillen);
+ allocate(sp->p, dvector, sp->beecount * sp->taillen);
+ }
+
+ /* Initialize point positions, velocities, etc. */
+ restart_flow(mi);
+
+ /* Set up camera tail */
+ X(1, 0) = sp->cam[1].x = 0;
+ Y(1, 0) = sp->cam[1].y = 0;
+ Z(1, 0) = sp->cam[1].z = 0;
+}
+
+ENTRYPOINT void
+draw_flow (ModeInfo * mi)
+{
+ int b, i;
+ int col, begin, end;
+ double M[3][3]; /* transformation matrix */
+ flowstruct *sp = NULL;
+ int swarm = 0;
+ int segindex;
+
+ if (flows == NULL)
+ return;
+ sp = &flows[MI_SCREEN(mi)];
+ if (sp->csegs == NULL)
+ return;
+
+#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ XClearWindow (MI_DISPLAY(mi), MI_WINDOW(mi));
+#endif
+
+ /* multiplier for indexing segment arrays. Used in IX macro, etc. */
+ segindex = (sp->beecount + BOX_L) * sp->taillen;
+
+ if(searchp){
+ if(sp->count2 == 0) { /* start new search */
+ sp->step2 = INITIALSTEP;
+ /* Pick random parameters. Actual range is irrelevant
+ since parameter scale determines flow speed but not
+ structure. */
+ for(i=0; i< N_PARS; i++) {
+ sp->par2[i].x = Gauss_Rand(1.0);
+ sp->par2[i].y = Gauss_Rand(1.0);
+ sp->par2[i].z = Gauss_Rand(1.0);
+ }
+ }
+ if(!discover(mi)) { /* Flow exploded, reset. */
+ sp->count2 = 0;
+ } else {
+ if(sp->lyap2 < 0) {
+ sp->count2 = 0; /* Attractor found, but it's not strange */
+ }else if(sp->count2 > 1000000) { /* This one will do */
+ sp->count2 = 0; /* Reset search */
+ if(MI_IS_VERBOSE(mi))
+ fprintf(stdout,
+ "flow: Lyapunov exponent: %g, step: %g, size: %g (unnamed)\n",
+ sp->lyap2, sp->step2, sp->size2);
+ /* Install new params */
+ sp->lyap = sp->lyap2;
+ sp->size = sp->size2;
+ sp->mid = sp->mid2;
+ sp->step = sp->step2;
+ memcpy(sp->par, sp->par2, sizeof(sp->par2));
+
+ /* If we're allowed to zoom out, do so now, so that we
+ get a look at the new attractor. */
+ if(sp->chaseto == BEE && rotatep) {
+ sp->chaseto = ORBIT;
+ sp->chasetime = 100;
+ }
+ /* Reset initial conditions, so we don't get
+ misleading artifacts in the particle density. */
+ restart_flow(mi);
+ }
+ }
+ }
+
+ /* Reset segment buffers */
+ for (col = 0; col < MI_NPIXELS(mi); col++)
+ sp->cnsegs[col] = 0;
+
+ MI_IS_DRAWN(mi) = True;
+
+ /* Calculate circling POV [Chalky]*/
+ sp->circle[1] = sp->circle[0];
+ sp->circle[0].x = sp->size * 2 * sin(sp->count / 100.0) *
+ (-0.6 + 0.4 *cos(sp->count / 500.0)) + sp->mid.x;
+ sp->circle[0].y = sp->size * 2 * cos(sp->count / 100.0) *
+ (0.6 + 0.4 *cos(sp->count / 500.0)) + sp->mid.y;
+ sp->circle[0].z = sp->size * 2 * sin(sp->count / 421.0) + sp->mid.z;
+
+ /* Timed chase instead of Chalkie's Bistable oscillator [TDA] */
+ if(rotatep && ridep) {
+ if(sp->chaseto == BEE && NRAND(1000) == 0){
+ sp->chaseto = ORBIT;
+ sp->chasetime = 100;
+ }else if(NRAND(4000) == 0){
+ sp->chaseto = BEE;
+ sp->chasetime = 100;
+ }
+ }
+
+ /* Set up orientation matrix */
+ {
+ double x[3], p[3], x2=0, xp=0;
+ int j;
+
+ /* Chasetime is here to guarantee the camera makes it all the
+ way to the target in a finite number of steps. */
+ if(sp->chasetime > 1)
+ sp->chasetime--;
+
+ if(sp->chaseto == BEE){
+ /* Camera Head targets bee 0 */
+ sp->cam[0].x += (X(0, 0) - sp->cam[0].x)/sp->chasetime;
+ sp->cam[0].y += (Y(0, 0) - sp->cam[0].y)/sp->chasetime;
+ sp->cam[0].z += (Z(0, 0) - sp->cam[0].z)/sp->chasetime;
+
+ /* Camera Tail targets previous position of bee 0 */
+ sp->cam[1].x += (X(1, 0) - sp->cam[1].x)/sp->chasetime;
+ sp->cam[1].y += (Y(1, 0) - sp->cam[1].y)/sp->chasetime;
+ sp->cam[1].z += (Z(1, 0) - sp->cam[1].z)/sp->chasetime;
+
+ /* Camera Wing targets bee 1 */
+ sp->cam[2].x += (X(0, 1) - sp->cam[2].x)/sp->chasetime;
+ sp->cam[2].y += (Y(0, 1) - sp->cam[2].y)/sp->chasetime;
+ sp->cam[2].z += (Z(0, 1) - sp->cam[2].z)/sp->chasetime;
+ } else {
+ /* Camera Head targets Orbiter */
+ sp->cam[0].x += (sp->circle[0].x - sp->cam[0].x)/sp->chasetime;
+ sp->cam[0].y += (sp->circle[0].y - sp->cam[0].y)/sp->chasetime;
+ sp->cam[0].z += (sp->circle[0].z - sp->cam[0].z)/sp->chasetime;
+
+ /* Camera Tail targets diametrically opposite the middle
+ of the bounding box from the Orbiter */
+ sp->cam[1].x +=
+ (2*sp->circle[0].x - sp->mid.x - sp->cam[1].x)/sp->chasetime;
+ sp->cam[1].y +=
+ (2*sp->circle[0].y - sp->mid.y - sp->cam[1].y)/sp->chasetime;
+ sp->cam[1].z +=
+ (2*sp->circle[0].z - sp->mid.z - sp->cam[1].z)/sp->chasetime;
+ /* Camera Wing targets previous position of Orbiter */
+ sp->cam[2].x += (sp->circle[1].x - sp->cam[2].x)/sp->chasetime;
+ sp->cam[2].y += (sp->circle[1].y - sp->cam[2].y)/sp->chasetime;
+ sp->cam[2].z += (sp->circle[1].z - sp->cam[2].z)/sp->chasetime;
+ }
+
+ /* Viewpoint from Tail of camera */
+ sp->centre.x=sp->cam[1].x;
+ sp->centre.y=sp->cam[1].y;
+ sp->centre.z=sp->cam[1].z;
+
+ /* forward vector */
+ x[0] = sp->cam[0].x - sp->cam[1].x;
+ x[1] = sp->cam[0].y - sp->cam[1].y;
+ x[2] = sp->cam[0].z - sp->cam[1].z;
+
+ /* side */
+ p[0] = sp->cam[2].x - sp->cam[1].x;
+ p[1] = sp->cam[2].y - sp->cam[1].y;
+ p[2] = sp->cam[2].z - sp->cam[1].z;
+
+
+ /* So long as X and P don't collide, these can be used to form
+ three mutually othogonal axes: X, (X x P) x X and X x P.
+ After being normalised to unit length, these form the
+ Orientation Matrix. */
+
+ for(i=0; i<3; i++){
+ x2+= x[i]*x[i]; /* X . X */
+ xp+= x[i]*p[i]; /* X . P */
+ M[0][i] = x[i]; /* X */
+ }
+
+ for(i=0; i<3; i++) /* (X x P) x X */
+ M[1][i] = x2*p[i] - xp*x[i]; /* == (X . X) P - (X . P) X */
+
+ M[2][0] = x[1]*p[2] - x[2]*p[1]; /* X x P */
+ M[2][1] = -x[0]*p[2] + x[2]*p[0];
+ M[2][2] = x[0]*p[1] - x[1]*p[0];
+
+ /* normalise axes */
+ for(j=0; j<3; j++){
+ double A=0;
+ for(i=0; i<3; i++) A+=M[j][i]*M[j][i]; /* sum squares */
+ A=sqrt(A);
+ if(A>0)
+ for(i=0; i<3; i++) M[j][i]/=A;
+ }
+
+ if(sp->chaseto == BEE) {
+ X(0, 1)=X(0, 0)+M[1][0]*sp->step; /* adjust neighbour */
+ Y(0, 1)=Y(0, 0)+M[1][1]*sp->step;
+ Z(0, 1)=Z(0, 0)+M[1][2]*sp->step;
+ }
+ }
+
+ /* <=- Bounding Box -=> */
+ if(boxp) {
+ for (b = 0; b < BOX_L; b++) {
+
+ /* Chalky's clipping code, Only used for the box */
+ /* clipping trails is slow and of little benefit. [TDA] */
+ int p1 = lines[b][0];
+ int p2 = lines[b][1];
+ dvector A1, A2;
+ double x1=box[p1][0]* sp->size/2 + sp->mid.x - sp->centre.x;
+ double y1=box[p1][1]* sp->size/2 + sp->mid.y - sp->centre.y;
+ double z1=box[p1][2]* sp->size/2 + sp->mid.z - sp->centre.z;
+ double x2=box[p2][0]* sp->size/2 + sp->mid.x - sp->centre.x;
+ double y2=box[p2][1]* sp->size/2 + sp->mid.y - sp->centre.y;
+ double z2=box[p2][2]* sp->size/2 + sp->mid.z - sp->centre.z;
+
+ A1.x=M[0][0]*x1 + M[0][1]*y1 + M[0][2]*z1;
+ A1.y=M[1][0]*x1 + M[1][1]*y1 + M[1][2]*z1;
+ A1.z=M[2][0]*x1 + M[2][1]*y1 + M[2][2]*z1 + EYEHEIGHT * sp->size;
+ A2.x=M[0][0]*x2 + M[0][1]*y2 + M[0][2]*z2;
+ A2.y=M[1][0]*x2 + M[1][1]*y2 + M[1][2]*z2;
+ A2.z=M[2][0]*x2 + M[2][1]*y2 + M[2][2]*z2 + EYEHEIGHT * sp->size;
+
+ /* Clip in 3D before projecting down to 2D. A 2D clip
+ after projection wouldn't be able to handle lines that
+ cross x=0 */
+ if (clip(1, 0, 0,-1, &A1, &A2) || /* Screen */
+ clip(1, 2, 0, 0, &A1, &A2) || /* Left */
+ clip(1,-2, 0, 0, &A1, &A2) || /* Right */
+ clip(1,0, 2.0*MI_WIDTH(mi)/MI_HEIGHT(mi), 0, &A1, &A2)||/*UP*/
+ clip(1,0,-2.0*MI_WIDTH(mi)/MI_HEIGHT(mi), 0, &A1, &A2))/*Down*/
+ continue;
+
+ /* Colour according to bee */
+ col = b % (MI_NPIXELS(mi) - 1);
+
+ sp->csegs[IX(col)].x1 = MI_WIDTH(mi)/2 + MI_WIDTH(mi) * A1.y/A1.x;
+ sp->csegs[IX(col)].y1 = MI_HEIGHT(mi)/2 + MI_WIDTH(mi) * A1.z/A1.x;
+ sp->csegs[IX(col)].x2 = MI_WIDTH(mi)/2 + MI_WIDTH(mi) * A2.y/A2.x;
+ sp->csegs[IX(col)].y2 = MI_HEIGHT(mi)/2 + MI_WIDTH(mi) * A2.z/A2.x;
+ sp->cnsegs[col]++;
+ }
+ }
+
+ /* <=- Bees -=> */
+ for (b = 0; b < sp->beecount; b++) {
+ if(fabs(X(0, b)) > LOST_IN_SPACE ||
+ fabs(Y(0, b)) > LOST_IN_SPACE ||
+ fabs(Z(0, b)) > LOST_IN_SPACE){
+ if(sp->chaseto == BEE && b == 0){
+ /* Lost camera bee. Need to replace it since
+ rerunning init_flow could lose us a hard-won new
+ attractor. Try moving it very close to a random
+ other bee. This way we have a good chance of being
+ close to the attractor and not forming a false
+ artifact. If we've lost many bees this may need to
+ be repeated. */
+ /* Don't worry about camera wingbee. It stays close
+ to the main camera bee no matter what happens. */
+ int newb = 1 + NRAND(sp->beecount - 1);
+ X(0, 0) = X(0, newb) + 0.001;
+ Y(0, 0) = Y(0, newb);
+ Z(0, 0) = Z(0, newb);
+ if(MI_IS_VERBOSE(mi))
+ fprintf(stdout,
+ "flow: resetting lost camera near bee %d\n",
+ newb);
+ }
+ continue;
+ }
+
+ /* Age the tail. It's critical this be fast since
+ beecount*taillen can be large. */
+ memmove(B(1, b), B(0, b), (sp->taillen - 1) * sizeof(dvector));
+
+ Iterate(B(0,b), sp->ODE, sp->par, sp->step);
+
+ /* Don't show wingbee since he's not quite in the flow. */
+ if(sp->chaseto == BEE && b == 1) continue;
+
+ /* Colour according to bee */
+ col = b % (MI_NPIXELS(mi) - 1);
+
+ /* Fill the segment lists. */
+
+ begin = 0; /* begin new trail */
+ end = MIN(sp->taillen, sp->count); /* short trails at first */
+ for(i=0; i < end; i++){
+ double x = X(i,b)-sp->centre.x;
+ double y = Y(i,b)*(sp->yperiod < 0? (sp->size/sp->yperiod) :1)
+ -sp->centre.y;
+ double z = Z(i,b)-sp->centre.z;
+ double XM=M[0][0]*x + M[0][1]*y + M[0][2]*z;
+ double YM=M[1][0]*x + M[1][1]*y + M[1][2]*z;
+ double ZM=M[2][0]*x + M[2][1]*y + M[2][2]*z + EYEHEIGHT * sp->size;
+ short absx, absy;
+
+ swarm++; /* count the remaining bees */
+ if(sp->yperiod > 0 && Y(i,b) > sp->yperiod){
+ int j;
+ Y(i,b) -= sp->yperiod;
+ /* hide tail to prevent streaks in Y. Streaks in X,Z
+ are ok, they help to outline the Poincare'
+ slice. */
+ for(j = i; j < end; j++) Y(j,b) = Y(i,b);
+ /*begin = i + 1;*/
+ break;
+ }
+
+ if(XM <= 0){ /* off screen - new trail */
+ begin = i + 1;
+ continue;
+ }
+ absx = MI_WIDTH(mi)/2 + MI_WIDTH(mi) * YM/XM;
+ absy = MI_HEIGHT(mi)/2 + MI_WIDTH(mi) * ZM/XM;
+ /* Performance bottleneck */
+ if(absx <= 0 || absx >= MI_WIDTH(mi) ||
+ absy <= 0 || absy >= MI_HEIGHT(mi)) {
+ /* off screen - new trail */
+ begin = i + 1;
+ continue;
+ }
+ if(i > begin) { /* complete previous segment */
+ sp->csegs[IX(col)].x2 = absx;
+ sp->csegs[IX(col)].y2 = absy;
+ sp->cnsegs[col]++;
+ }
+
+ if(i < end -1){ /* start new segment */
+ sp->csegs[IX(col)].x1 = absx;
+ sp->csegs[IX(col)].y1 = absy;
+ }
+ }
+ }
+
+ /* Erase */
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ if (dbufp) { /* In Double Buffer case, prepare off-screen copy */
+ /* For slow systems, this can be the single biggest bottleneck
+ in the program. These systems may be better of not using
+ the double buffer. */
+ XFillRectangle(MI_DISPLAY(mi), sp->buffer, MI_GC(mi), 0, 0,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ } else { /* Otherwise, erase previous segment list directly */
+ XDrawSegments(MI_DISPLAY(mi), sp->buffer, MI_GC(mi),
+ sp->old_segs, sp->nold_segs);
+ }
+
+ /* Render */
+ if (MI_NPIXELS(mi) > 2){ /* colour */
+ int mn = 0;
+ for (col = 0; col < MI_NPIXELS(mi) - 1; col++)
+ if (sp->cnsegs[col] > 0) {
+ if(sp->cnsegs[col] > mn) mn = sp->cnsegs[col];
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_PIXEL(mi, col+1));
+ /* This is usually the biggest bottleneck on most
+ systems. The maths load is insignificant compared
+ to this. */
+ XDrawSegments(MI_DISPLAY(mi), sp->buffer, MI_GC(mi),
+ sp->csegs + col * segindex, sp->cnsegs[col]);
+ }
+ } else { /* mono handled seperately since xlockmore uses '1' for
+ mono white! */
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+ XDrawSegments(MI_DISPLAY(mi), sp->buffer, MI_GC(mi),
+ sp->csegs, sp->cnsegs[0]);
+ }
+ if (dbufp) { /* In Double Buffer case, this updates the screen */
+ XCopyArea(MI_DISPLAY(mi), sp->buffer, MI_WINDOW(mi), MI_GC(mi), 0, 0,
+ MI_WIDTH(mi), MI_HEIGHT(mi), 0, 0);
+ } else { /* Otherwise, screen is already updated. Copy segments
+ to erase-list to be erased directly next time. */
+ int c = 0;
+ for (col = 0; col < MI_NPIXELS(mi) - 1; col++) {
+ memcpy(sp->old_segs + c, sp->csegs + col * segindex,
+ sp->cnsegs[col] * sizeof(XSegment));
+ c += sp->cnsegs[col];
+ }
+ sp->nold_segs = c;
+ }
+
+ if(sp->count > 1 && swarm == 0) { /* all gone */
+ if(MI_IS_VERBOSE(mi))
+ fprintf(stdout, "flow: all gone at %d\n", sp->count);
+ init_flow(mi);
+ }
+
+ if(sp->count++ > MI_CYCLES(mi)){ /* Time's up. If we haven't
+ found anything new by now we
+ should pick a new standard
+ flow */
+ init_flow(mi);
+ }
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_flow (ModeInfo * mi)
+{
+ if(!dbufp) MI_CLEARWINDOW(mi);
+}
+#endif
+
+XSCREENSAVER_MODULE ("Flow", flow)
+
+#endif /* MODE_flow */
diff --git a/hacks/flow.man b/hacks/flow.man
new file mode 100644
index 0000000..ea3a295
--- /dev/null
+++ b/hacks/flow.man
@@ -0,0 +1,137 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+flow - strange attractors.
+.SH SYNOPSIS
+.B flow
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-periodic|\-no\-periodic]
+[\-search|\-no\-search]
+[\-rotate|\-no\-rotate]
+[\-ride|\-no\-ride]
+[\-box|\-no\-box]
+[\-dbuf|\-no\-dbuf]
+[\-ncolors \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Strange attractors formed of flows in a 3D differential equation phase
+space. Features the popular attractors described by \fBLorentz\fP,
+\fBRoessler\fP, \fBBirkhoff\fP and \fBDuffing\fP, and can discover
+entirely new attractors by itself.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+Number of particles in the flow. Default: 3000
+.TP 8
+.B \-size \fInumber\fP
+Length of particle trails. Negative values indicate
+randomness. The computational load of a given flow depends on
+(particle count) * (trail length). Default: -10
+.TP 8
+.B \-cycles \fInumber\fP
+Timeout before changing objects. 0 - 800000. Default: 10000.
+.TP 8
+.B \-periodic
+.TP 8
+.B \-no\-periodic
+turn on/off periodic attractors. These are flows in 2 dependent
+variables, with a periodic dependence on a third independent variable
+(eg time). Flow will sometimes choose to start all the particles in
+the same phase to illustrate the flow's cross-section. Default:
+on
+.TP 8
+.B \-search
+.TP 8
+.B \-no\-search
+turn on/off search for new attractors. If this is enabled, a fraction
+of the computing cycles is directed to searching a 60-dimensional
+parameter space for new strange attractors. If periodic flows are
+enabled, these can be searched too. Watch carefully - you are quite
+likely to see mathematical objects that have never been seen before,
+and since the parameters are not recorded, you'll probably never see
+them again! Default: on
+.TP 8
+.B \-rotate
+.TP 8
+.B \-no\-rotate
+turn on/off rotating around attractor. Default: on
+.TP 8
+.B \-ride
+.TP 8
+.B \-no\-ride
+turn on/off ride in the flow. Default: on
+
+If both -rotate and -ride are enabled the viewpoint will occasionally
+fly between the two views.
+.TP 8
+.B \-box
+.TP 8
+.B \-no\-box
+turn on/off bounding box. Default: on
+.TP 8
+.B \-dbuf
+.TP 8
+.B \-no\-dbuf
+turn on/off double buffering. If Flow runs slowly in full screen, but
+fast in a smaller window (eg on old graphics cards with too little
+memory), try turning this option off. Default: on
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors. Default: 200.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright (c) 1996 by Tim Auckland <Tim.Auckland@Procket.com>
+Incorporating some code from Stephen Davies Copyright (c) 2000
+
+Search code based on techniques described in "Strange Attractors:
+Creating Patterns in Chaos" by Julien C. Sprott
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+
+This file is provided AS IS with no warranties of any kind. The author
+shall have no liability with respect to the infringement of copyrights,
+trade secrets or any patents by this file or any part thereof. In no
+event will the author be liable for any lost revenue or profits or
+other special, indirect and consequential damages.
+
+Adapted from swarm.c Copyright (c) 1991 by Patrick J. Naughton.
+
+Adapted from xswarm by Jeff Butterworth. (butterwo@ncsc.org).
+.SH AUTHOR
+Tim Auckland
diff --git a/hacks/fluidballs.c b/hacks/fluidballs.c
new file mode 100644
index 0000000..9273082
--- /dev/null
+++ b/hacks/fluidballs.c
@@ -0,0 +1,852 @@
+/* fluidballs, Copyright (c) 2000 by Peter Birtles <peter@bqdesign.com.au>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Ported to X11 and xscreensaver by jwz, 27-Feb-2002.
+ *
+ * http://astronomy.swin.edu.au/~pbourke/modelling/fluid/
+ *
+ * Some physics improvements by Steven Barker <steve@blckknght.org>
+ */
+
+/* Future ideas:
+ * Specifying a distribution in the ball sizes (with a gamma curve, possibly).
+ * Brownian motion, for that extra touch of realism.
+ *
+ * It would be nice to detect when there are more balls than fit in
+ * the window, and scale the number of balls back. Useful for the
+ * xscreensaver-demo preview, which is often too tight by default.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+#include <stdio.h>
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+#include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+typedef struct {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+ int delay;
+
+ Pixmap b, ba; /* double-buffer to reduce flicker */
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ XdbeBackBuffer backb;
+ Bool dbeclear_p;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ GC draw_gc; /* most of the balls */
+ GC draw_gc2; /* the ball being dragged with the mouse */
+ GC erase_gc;
+ XColor fg;
+ XColor fg2;
+
+ int count; /* number of balls */
+ float xmin, ymin; /* rectangle of window, relative to root */
+ float xmax, ymax;
+
+ int mouse_ball; /* index of ball being dragged, or 0 if none. */
+
+ float tc; /* time constant (time-warp multiplier) */
+ float accx; /* horizontal acceleration (wind) */
+ float accy; /* vertical acceleration (gravity) */
+
+ float *vx, *vy; /* current ball velocities */
+ float *px, *py; /* current ball positions */
+ float *opx, *opy; /* previous ball positions */
+ float *r; /* ball radiuses */
+
+ float *m; /* ball mass, precalculated */
+ float e; /* coeficient of elasticity */
+ float max_radius; /* largest radius of any ball */
+
+ Bool random_sizes_p; /* Whether balls should be various sizes up to max. */
+ Bool shake_p; /* Whether to mess with gravity when things settle. */
+ Bool dbuf; /* Whether we're using double buffering. */
+ float shake_threshold;
+ int time_since_shake;
+
+ Bool fps_p; /* Whether to draw some text at the bottom. */
+ GC font_gc;
+ int font_height;
+ int font_baseline;
+ int frame_count;
+ int collision_count;
+ char fps_str[1024];
+
+ int time_tick;
+ struct timeval last_time;
+
+} b_state;
+
+
+/* Draws the frames per second string */
+static void
+draw_fps_string (b_state *state)
+{
+ XFillRectangle (state->dpy, state->b, state->erase_gc,
+ 0, state->xgwa.height - state->font_height*3 - 20,
+ state->xgwa.width, state->font_height*3 + 20);
+ XDrawImageString (state->dpy, state->b, state->font_gc,
+ 10, state->xgwa.height - state->font_height*2 -
+ state->font_baseline - 10,
+ state->fps_str, strlen(state->fps_str));
+}
+
+/* Finds the origin of the window relative to the root window, by
+ walking up the window tree until it reaches the top.
+ */
+static void
+window_origin (Display *dpy, Window window, int *x, int *y)
+{
+ XTranslateCoordinates (dpy, window, RootWindow (dpy, DefaultScreen (dpy)),
+ 0, 0, x, y, &window);
+}
+
+
+/* Queries the window position to see if the window has moved or resized.
+ We poll this instead of waiting for ConfigureNotify events, because
+ when the window manager moves the window, only one ConfigureNotify
+ comes in: at the end of the motion. If we poll, we can react to the
+ new position while the window is still being moved. (Assuming the WM
+ does OpaqueMove, of course.)
+ */
+static void
+check_window_moved (b_state *state)
+{
+ float oxmin = state->xmin;
+ float oxmax = state->xmax;
+ float oymin = state->ymin;
+ float oymax = state->ymax;
+ int wx, wy;
+ XGetWindowAttributes (state->dpy, state->window, &state->xgwa);
+ window_origin (state->dpy, state->window, &wx, &wy);
+ state->xmin = wx;
+ state->ymin = wy;
+ state->xmax = state->xmin + state->xgwa.width;
+ state->ymax = state->ymin + state->xgwa.height - (state->font_height*3) -
+ (state->font_height ? 22 : 0);
+
+ if (state->dbuf && (state->ba))
+ {
+ if (oxmax != state->xmax || oymax != state->ymax)
+ {
+ XFreePixmap (state->dpy, state->ba);
+ state->ba = XCreatePixmap (state->dpy, state->window,
+ state->xgwa.width, state->xgwa.height,
+ state->xgwa.depth);
+ XFillRectangle (state->dpy, state->ba, state->erase_gc, 0, 0,
+ state->xgwa.width, state->xgwa.height);
+ state->b = state->ba;
+ }
+ }
+ else
+ {
+ /* Only need to erase the window if the origin moved */
+ if (oxmin != state->xmin || oymin != state->ymin)
+ XClearWindow (state->dpy, state->window);
+ else if (state->fps_p && oymax != state->ymax)
+ XFillRectangle (state->dpy, state->b, state->erase_gc,
+ 0, state->xgwa.height - state->font_height*3,
+ state->xgwa.width, state->font_height*3);
+ }
+}
+
+
+/* Returns the position of the mouse relative to the root window.
+ */
+static void
+query_mouse (b_state *state, int *x, int *y)
+{
+ Window root1, child1;
+ int mouse_x, mouse_y, root_x, root_y;
+ unsigned int mask;
+ if (XQueryPointer (state->dpy, state->window, &root1, &child1,
+ &root_x, &root_y, &mouse_x, &mouse_y, &mask))
+ {
+ *x = root_x;
+ *y = root_y;
+ }
+ else
+ {
+ *x = -9999;
+ *y = -9999;
+ }
+}
+
+/* Re-pick the colors of the balls, and the mouse-ball.
+ */
+static void
+recolor (b_state *state)
+{
+ if (state->fg.flags)
+ XFreeColors (state->dpy, state->xgwa.colormap, &state->fg.pixel, 1, 0);
+ if (state->fg2.flags)
+ XFreeColors (state->dpy, state->xgwa.colormap, &state->fg2.pixel, 1, 0);
+
+ state->fg.flags = DoRed|DoGreen|DoBlue;
+ state->fg.red = 0x8888 + (random() % 0x8888);
+ state->fg.green = 0x8888 + (random() % 0x8888);
+ state->fg.blue = 0x8888 + (random() % 0x8888);
+
+ state->fg2.flags = DoRed|DoGreen|DoBlue;
+ state->fg2.red = 0x8888 + (random() % 0x8888);
+ state->fg2.green = 0x8888 + (random() % 0x8888);
+ state->fg2.blue = 0x8888 + (random() % 0x8888);
+
+ if (XAllocColor (state->dpy, state->xgwa.colormap, &state->fg))
+ XSetForeground (state->dpy, state->draw_gc, state->fg.pixel);
+
+ if (XAllocColor (state->dpy, state->xgwa.colormap, &state->fg2))
+ XSetForeground (state->dpy, state->draw_gc2, state->fg2.pixel);
+}
+
+/* Initialize the state structure and various X data.
+ */
+static void *
+fluidballs_init (Display *dpy, Window window)
+{
+ int i;
+ float extx, exty;
+ b_state *state = (b_state *) calloc (1, sizeof(*state));
+ XGCValues gcv;
+
+ state->dpy = dpy;
+ state->window = window;
+ state->delay = get_integer_resource (dpy, "delay", "Integer");
+
+ check_window_moved (state);
+
+ state->dbuf = get_boolean_resource (dpy, "doubleBuffer", "Boolean");
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ state->dbuf = False;
+# endif
+
+ if (state->dbuf)
+ {
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ state->dbeclear_p = get_boolean_resource (dpy, "useDBEClear", "Boolean");
+ if (state->dbeclear_p)
+ state->b = xdbe_get_backbuffer (dpy, window, XdbeBackground);
+ else
+ state->b = xdbe_get_backbuffer (dpy, window, XdbeUndefined);
+ state->backb = state->b;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ if (!state->b)
+ {
+ state->ba = XCreatePixmap (state->dpy, state->window,
+ state->xgwa.width, state->xgwa.height,
+ state->xgwa.depth);
+ state->b = state->ba;
+ }
+ }
+ else
+ {
+ state->b = state->window;
+ }
+
+ /* Select ButtonRelease events on the external window, if no other app has
+ already selected it (only one app can select it at a time: BadAccess. */
+#if 0
+ if (! (state->xgwa.all_event_masks & ButtonReleaseMask))
+ XSelectInput (state->dpy, state->window,
+ state->xgwa.your_event_mask | ButtonReleaseMask);
+#endif
+
+ gcv.foreground = get_pixel_resource(state->dpy, state->xgwa.colormap,
+ "foreground", "Foreground");
+ gcv.background = get_pixel_resource(state->dpy, state->xgwa.colormap,
+ "background", "Background");
+ state->draw_gc = XCreateGC (state->dpy, state->b,
+ GCForeground|GCBackground, &gcv);
+
+ gcv.foreground = get_pixel_resource(state->dpy, state->xgwa.colormap,
+ "mouseForeground", "MouseForeground");
+ state->draw_gc2 = XCreateGC (state->dpy, state->b,
+ GCForeground|GCBackground, &gcv);
+
+ gcv.foreground = gcv.background;
+ state->erase_gc = XCreateGC (state->dpy, state->b,
+ GCForeground|GCBackground, &gcv);
+
+
+ if (state->ba)
+ XFillRectangle (state->dpy, state->ba, state->erase_gc, 0, 0,
+ state->xgwa.width, state->xgwa.height);
+
+ recolor (state);
+
+ extx = state->xmax - state->xmin;
+ exty = state->ymax - state->ymin;
+
+ state->count = get_integer_resource (dpy, "count", "Count");
+ if (state->count < 1) state->count = 20;
+
+ state->max_radius = get_float_resource (dpy, "size", "Size") / 2;
+ if (state->max_radius < 1.0) state->max_radius = 1.0;
+
+ if (state->xgwa.width > 2560) state->max_radius *= 2; /* Retina displays */
+
+ if (state->xgwa.width < 100 || state->xgwa.height < 100) /* tiny window */
+ {
+ if (state->max_radius > 5)
+ state->max_radius = 5;
+ }
+
+ state->random_sizes_p = get_boolean_resource (dpy, "random", "Random");
+
+ /* If the initial window size is too small to hold all these balls,
+ make fewer of them...
+ */
+ {
+ float r = (state->random_sizes_p
+ ? state->max_radius * 0.7
+ : state->max_radius);
+ float ball_area = M_PI * r * r;
+ float balls_area = state->count * ball_area;
+ float window_area = state->xgwa.width * state->xgwa.height;
+ window_area *= 0.75; /* don't pack it completely full */
+ if (balls_area > window_area)
+ state->count = window_area / ball_area;
+ }
+
+ state->accx = get_float_resource (dpy, "wind", "Wind");
+ if (state->accx < -1.0 || state->accx > 1.0) state->accx = 0;
+
+ state->accy = get_float_resource (dpy, "gravity", "Gravity");
+ if (state->accy < -1.0 || state->accy > 1.0) state->accy = 0.01;
+
+ state->e = get_float_resource (dpy, "elasticity", "Elacitcity");
+ if (state->e < 0.2 || state->e > 1.0) state->e = 0.97;
+
+ state->tc = get_float_resource (dpy, "timeScale", "TimeScale");
+ if (state->tc <= 0 || state->tc > 10) state->tc = 1.0;
+
+ state->shake_p = get_boolean_resource (dpy, "shake", "Shake");
+ state->shake_threshold = get_float_resource (dpy, "shakeThreshold",
+ "ShakeThreshold");
+ state->time_tick = 999999;
+
+# ifdef HAVE_MOBILE /* Always obey real-world gravity */
+ state->shake_p = False;
+# endif
+
+
+ state->fps_p = get_boolean_resource (dpy, "doFPS", "DoFPS");
+ if (state->fps_p)
+ {
+ XFontStruct *font;
+ char *fontname = get_string_resource (dpy, "fpsFont", "Font");
+ if (!fontname) fontname = "-*-courier-bold-r-normal-*-180-*";
+ font = load_font_retry (dpy, fontname);
+ if (!font) abort();
+ gcv.font = font->fid;
+ gcv.foreground = get_pixel_resource(state->dpy, state->xgwa.colormap,
+ "textColor", "Foreground");
+ state->font_gc = XCreateGC(dpy, state->b,
+ GCFont|GCForeground|GCBackground, &gcv);
+ state->font_height = font->ascent + font->descent;
+ state->font_baseline = font->descent;
+ }
+
+ state->m = (float *) malloc (sizeof (*state->m) * (state->count + 1));
+ state->r = (float *) malloc (sizeof (*state->r) * (state->count + 1));
+ state->vx = (float *) malloc (sizeof (*state->vx) * (state->count + 1));
+ state->vy = (float *) malloc (sizeof (*state->vy) * (state->count + 1));
+ state->px = (float *) malloc (sizeof (*state->px) * (state->count + 1));
+ state->py = (float *) malloc (sizeof (*state->py) * (state->count + 1));
+ state->opx = (float *) malloc (sizeof (*state->opx) * (state->count + 1));
+ state->opy = (float *) malloc (sizeof (*state->opy) * (state->count + 1));
+
+ for (i=1; i<=state->count; i++)
+ {
+ state->px[i] = frand(extx) + state->xmin;
+ state->py[i] = frand(exty) + state->ymin;
+ state->vx[i] = frand(0.2) - 0.1;
+ state->vy[i] = frand(0.2) - 0.1;
+
+ state->r[i] = (state->random_sizes_p
+ ? ((0.2 + frand(0.8)) * state->max_radius)
+ : state->max_radius);
+ /*state->r[i] = pow(frand(1.0), state->sizegamma) * state->max_radius;*/
+
+ /* state->m[i] = pow(state->r[i],2) * M_PI; */
+ state->m[i] = pow(state->r[i],3) * M_PI * 1.3333;
+ }
+
+ memcpy (state->opx, state->px, sizeof (*state->opx) * (state->count + 1));
+ memcpy (state->opy, state->py, sizeof (*state->opx) * (state->count + 1));
+
+ return state;
+}
+
+
+/* Messes with gravity: permute "down" to be in a random direction.
+ */
+static void
+shake (b_state *state)
+{
+ float a = state->accx;
+ float b = state->accy;
+ int i = random() % 4;
+
+ switch (i)
+ {
+ case 0:
+ state->accx = a;
+ state->accy = b;
+ break;
+ case 1:
+ state->accx = -a;
+ state->accy = -b;
+ break;
+ case 2:
+ state->accx = b;
+ state->accy = a;
+ break;
+ case 3:
+ state->accx = -b;
+ state->accy = -a;
+ break;
+ default:
+ abort();
+ break;
+ }
+
+ state->time_since_shake = 0;
+ recolor (state);
+}
+
+
+/* Look at the current time, and update state->time_since_shake.
+ Draw the FPS display if desired.
+ */
+static void
+check_wall_clock (b_state *state, float max_d)
+{
+ state->frame_count++;
+
+ if (state->time_tick++ > 20) /* don't call gettimeofday() too often -- it's slow. */
+ {
+ struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&now, &tzp);
+# else
+ gettimeofday(&now);
+# endif
+
+ if (state->last_time.tv_sec == 0)
+ state->last_time = now;
+
+ state->time_tick = 0;
+ if (now.tv_sec == state->last_time.tv_sec)
+ return;
+
+ state->time_since_shake += (now.tv_sec - state->last_time.tv_sec);
+
+# ifdef HAVE_MOBILE /* Always obey real-world gravity */
+ {
+ float a = fabs (fabs(state->accx) > fabs(state->accy)
+ ? state->accx : state->accy);
+ int rot = current_device_rotation();
+ switch (rot) {
+ case 0: case 360: state->accx = 0; state->accy = a; break;
+ case -90: state->accx = -a; state->accy = 0; break;
+ case 90: state->accx = a; state->accy = 0; break;
+ case 180: case -180: state->accx = 0; state->accy = -a; break;
+ default: break;
+ }
+ }
+# endif /* HAVE_MOBILE */
+
+ if (state->fps_p)
+ {
+ float elapsed = ((now.tv_sec + (now.tv_usec / 1000000.0)) -
+ (state->last_time.tv_sec + (state->last_time.tv_usec / 1000000.0)));
+ float fps = state->frame_count / elapsed;
+ float cps = state->collision_count / elapsed;
+
+ sprintf (state->fps_str, "Collisions: %.3f/frame Max motion: %.3f",
+ cps/fps, max_d);
+
+ draw_fps_string(state);
+ }
+
+ state->frame_count = 0;
+ state->collision_count = 0;
+ state->last_time = now;
+ }
+}
+
+/* Erases the balls at their previous positions, and draws the new ones.
+ */
+static void
+repaint_balls (b_state *state)
+{
+ int a;
+# ifndef HAVE_JWXYZ
+ int x1a, x2a, y1a, y2a;
+# endif
+ int x1b, x2b, y1b, y2b;
+ float max_d = 0;
+
+#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ XClearWindow (state->dpy, state->b);
+#endif
+
+ for (a=1; a <= state->count; a++)
+ {
+ GC gc;
+# ifndef HAVE_JWXYZ
+ x1a = (state->opx[a] - state->r[a] - state->xmin);
+ y1a = (state->opy[a] - state->r[a] - state->ymin);
+ x2a = (state->opx[a] + state->r[a] - state->xmin);
+ y2a = (state->opy[a] + state->r[a] - state->ymin);
+# endif
+
+ x1b = (state->px[a] - state->r[a] - state->xmin);
+ y1b = (state->py[a] - state->r[a] - state->ymin);
+ x2b = (state->px[a] + state->r[a] - state->xmin);
+ y2b = (state->py[a] + state->r[a] - state->ymin);
+
+#ifndef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (!state->dbeclear_p || !state->backb)
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ {
+/* if (x1a != x1b || y1a != y1b) -- leaves turds if we optimize this */
+ {
+ gc = state->erase_gc;
+ XFillArc (state->dpy, state->b, gc,
+ x1a, y1a, x2a-x1a, y2a-y1a,
+ 0, 360*64);
+ }
+ }
+#endif /* !HAVE_JWXYZ */
+
+ if (state->mouse_ball == a)
+ gc = state->draw_gc2;
+ else
+ gc = state->draw_gc;
+
+ XFillArc (state->dpy, state->b, gc,
+ x1b, y1b, x2b-x1b, y2b-y1b,
+ 0, 360*64);
+
+ if (state->shake_p)
+ {
+ /* distance this ball moved this frame */
+ float d = ((state->px[a] - state->opx[a]) *
+ (state->px[a] - state->opx[a]) +
+ (state->py[a] - state->opy[a]) *
+ (state->py[a] - state->opy[a]));
+ if (d > max_d) max_d = d;
+ }
+
+ state->opx[a] = state->px[a];
+ state->opy[a] = state->py[a];
+ }
+
+ if (state->fps_p
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ && (state->backb ? state->dbeclear_p : 1)
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ )
+ draw_fps_string(state);
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (state->backb)
+ {
+ XdbeSwapInfo info[1];
+ info[0].swap_window = state->window;
+ info[0].swap_action = (state->dbeclear_p ? XdbeBackground : XdbeUndefined);
+ XdbeSwapBuffers (state->dpy, info, 1);
+ }
+ else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ if (state->dbuf)
+ {
+ XCopyArea (state->dpy, state->b, state->window, state->erase_gc,
+ 0, 0, state->xgwa.width, state->xgwa.height, 0, 0);
+ }
+
+ if (state->shake_p && state->time_since_shake > 5)
+ {
+ max_d /= state->max_radius;
+ if (max_d < state->shake_threshold || /* when its stable */
+ state->time_since_shake > 30) /* or when 30 secs has passed */
+ {
+ shake (state);
+ }
+ }
+
+ check_wall_clock (state, max_d);
+}
+
+
+/* Implements the laws of physics: move balls to their new positions.
+ */
+static void
+update_balls (b_state *state)
+{
+ int a, b;
+ float d, vxa, vya, vxb, vyb, dd, cdx, cdy;
+ float ma, mb, vca, vcb, dva, dvb;
+ float dee2;
+
+ check_window_moved (state);
+
+ /* If we're currently tracking the mouse, update that ball first.
+ */
+ if (state->mouse_ball != 0)
+ {
+ int mouse_x, mouse_y;
+ query_mouse (state, &mouse_x, &mouse_y);
+ state->px[state->mouse_ball] = mouse_x;
+ state->py[state->mouse_ball] = mouse_y;
+ state->vx[state->mouse_ball] =
+ (0.1 *
+ (state->px[state->mouse_ball] - state->opx[state->mouse_ball]) *
+ state->tc);
+ state->vy[state->mouse_ball] =
+ (0.1 *
+ (state->py[state->mouse_ball] - state->opy[state->mouse_ball]) *
+ state->tc);
+ }
+
+ /* For each ball, compute the influence of every other ball. */
+ for (a=1; a <= state->count - 1; a++)
+ for (b=a + 1; b <= state->count; b++)
+ {
+ d = ((state->px[a] - state->px[b]) *
+ (state->px[a] - state->px[b]) +
+ (state->py[a] - state->py[b]) *
+ (state->py[a] - state->py[b]));
+ dee2 = (state->r[a] + state->r[b]) *
+ (state->r[a] + state->r[b]);
+ if (d < dee2)
+ {
+ state->collision_count++;
+ d = sqrt(d);
+ dd = state->r[a] + state->r[b] - d;
+
+ cdx = (state->px[b] - state->px[a]) / d;
+ cdy = (state->py[b] - state->py[a]) / d;
+
+ /* Move each ball apart from the other by half the
+ * 'collision' distance.
+ */
+ state->px[a] -= 0.5 * dd * cdx;
+ state->py[a] -= 0.5 * dd * cdy;
+ state->px[b] += 0.5 * dd * cdx;
+ state->py[b] += 0.5 * dd * cdy;
+
+ ma = state->m[a];
+ mb = state->m[b];
+
+ vxa = state->vx[a];
+ vya = state->vy[a];
+ vxb = state->vx[b];
+ vyb = state->vy[b];
+
+ vca = vxa * cdx + vya * cdy; /* the component of each velocity */
+ vcb = vxb * cdx + vyb * cdy; /* along the axis of the collision */
+
+ /* elastic collison */
+ dva = (vca * (ma - mb) + vcb * 2 * mb) / (ma + mb) - vca;
+ dvb = (vcb * (mb - ma) + vca * 2 * ma) / (ma + mb) - vcb;
+
+ dva *= state->e; /* some energy lost to inelasticity */
+ dvb *= state->e;
+
+#if 0
+ dva += (frand (50) - 25) / ma; /* q: why are elves so chaotic? */
+ dvb += (frand (50) - 25) / mb; /* a: brownian motion. */
+#endif
+
+ vxa += dva * cdx;
+ vya += dva * cdy;
+ vxb += dvb * cdx;
+ vyb += dvb * cdy;
+
+ state->vx[a] = vxa;
+ state->vy[a] = vya;
+ state->vx[b] = vxb;
+ state->vy[b] = vyb;
+ }
+ }
+
+ /* Force all balls to be on screen.
+ */
+ for (a=1; a <= state->count; a++)
+ {
+ if (state->px[a] <= (state->xmin + state->r[a]))
+ {
+ state->px[a] = state->xmin + state->r[a];
+ state->vx[a] = -state->vx[a] * state->e;
+ }
+ if (state->px[a] >= (state->xmax - state->r[a]))
+ {
+ state->px[a] = state->xmax - state->r[a];
+ state->vx[a] = -state->vx[a] * state->e;
+ }
+ if (state->py[a] <= (state->ymin + state->r[a]))
+ {
+ state->py[a] = state->ymin + state->r[a];
+ state->vy[a] = -state->vy[a] * state->e;
+ }
+ if (state->py[a] >= (state->ymax - state->r[a]))
+ {
+ state->py[a] = state->ymax - state->r[a];
+ state->vy[a] = -state->vy[a] * state->e;
+ }
+ }
+
+ /* Apply gravity to all balls.
+ */
+ for (a=1; a <= state->count; a++)
+ if (a != state->mouse_ball)
+ {
+ state->vx[a] += state->accx * state->tc;
+ state->vy[a] += state->accy * state->tc;
+ state->px[a] += state->vx[a] * state->tc;
+ state->py[a] += state->vy[a] * state->tc;
+ }
+}
+
+
+/* Handle X events, specifically, allow a ball to be picked up with the mouse.
+ */
+static Bool
+fluidballs_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ b_state *state = (b_state *) closure;
+
+ if (event->xany.type == ButtonPress)
+ {
+ int i, rx, ry;
+ XTranslateCoordinates (dpy, window, RootWindow (dpy, DefaultScreen(dpy)),
+ event->xbutton.x, event->xbutton.y, &rx, &ry,
+ &window);
+
+ if (state->mouse_ball != 0) /* second down-click? drop the ball. */
+ {
+ state->mouse_ball = 0;
+ return True;
+ }
+ else
+ {
+ /* When trying to pick up a ball, first look for a click directly
+ inside the ball; but if we don't find it, expand the radius
+ outward until we find something nearby.
+ */
+ float max = state->max_radius * 4;
+ float step = max / 10;
+ float r2;
+ for (r2 = step; r2 < max; r2 += step) {
+ for (i = 1; i <= state->count; i++)
+ {
+ float d = ((state->px[i] - rx) * (state->px[i] - rx) +
+ (state->py[i] - ry) * (state->py[i] - ry));
+ float r = state->r[i];
+ if (r2 > r) r = r2;
+ if (d < r*r)
+ {
+ state->mouse_ball = i;
+ return True;
+ }
+ }
+ }
+ }
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease) /* drop the ball */
+ {
+ state->mouse_ball = 0;
+ return True;
+ }
+
+ return False;
+}
+
+static unsigned long
+fluidballs_draw (Display *dpy, Window window, void *closure)
+{
+ b_state *state = (b_state *) closure;
+ repaint_balls(state);
+ update_balls(state);
+ return state->delay;
+}
+
+static void
+fluidballs_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+}
+
+static void
+fluidballs_free (Display *dpy, Window window, void *closure)
+{
+ b_state *state = (b_state *) closure;
+ free (state);
+}
+
+
+static const char *fluidballs_defaults [] = {
+ ".background: black",
+ ".foreground: yellow",
+ ".textColor: yellow",
+ "*mouseForeground: white",
+ "*delay: 10000",
+ "*count: 300",
+ "*size: 25",
+ "*random: True",
+ "*gravity: 0.01",
+ "*wind: 0.00",
+ "*elasticity: 0.97",
+ "*timeScale: 1.0",
+ "*shake: True",
+ "*shakeThreshold: 0.015",
+ "*doubleBuffer: True",
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ "*useDBE: True",
+ "*useDBEClear: True",
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec fluidballs_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-count", ".count", XrmoptionSepArg, 0 },
+ { "-size", ".size", XrmoptionSepArg, 0 },
+ { "-count", ".count", XrmoptionSepArg, 0 },
+ { "-gravity", ".gravity", XrmoptionSepArg, 0 },
+ { "-wind", ".wind", XrmoptionSepArg, 0 },
+ { "-elasticity", ".elasticity", XrmoptionSepArg, 0 },
+ { "-shake", ".shake", XrmoptionNoArg, "True" },
+ { "-no-shake", ".shake", XrmoptionNoArg, "False" },
+ { "-random", ".random", XrmoptionNoArg, "True" },
+ { "-no-random", ".random", XrmoptionNoArg, "False" },
+ { "-nonrandom", ".random", XrmoptionNoArg, "False" },
+ { "-db", ".doubleBuffer", XrmoptionNoArg, "True" },
+ { "-no-db", ".doubleBuffer", XrmoptionNoArg, "False" },
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("FluidBalls", fluidballs)
diff --git a/hacks/fluidballs.man b/hacks/fluidballs.man
new file mode 100644
index 0000000..650fe63
--- /dev/null
+++ b/hacks/fluidballs.man
@@ -0,0 +1,90 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+fluidballs - the physics of bouncing balls.
+.SH SYNOPSIS
+.B fluidballs
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-size \fInumber\fP]
+[\-gravity \fInumber\fP]
+[\-wind \fInumber\fP]
+[\-elasticity \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-nonrandom]
+[\-no-shake]
+[\-fps]
+.SH DESCRIPTION
+Models the physics of bouncing balls, or of particles in a gas or fluid,
+depending on the settings. If "Shake Box" is selected, then every now and
+then, the box will be rotated, changing which direction is down (in order
+to keep the settled balls in motion.)
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+How many balls to display. Default: 300.
+.TP 8
+.B \-size \fInumber\fP
+Maximum size of each ball. Default: 25.
+.TP 8
+.B \-gravity \fInumber\fP
+Coefficient of gravity. Useful values are < 0.1. Default: 0.01.
+.TP 8
+.B \-wind \fInumber\fP
+Wind. Useful values are < 0.1. Default: 0.00.
+.TP 8
+.B \-elasticity \fInumber\fP
+Coefficient of elasticity. Useful values are 0.2 to 1.0. Default: 0.97.
+Lower numbers make less bouncy balls.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-nonrandom
+Make all balls be the same size.
+.TP 8
+.B \-no-nonrandom
+Make the balls be random sizes. Default.
+.TP 8
+.B \-shake | \-no-shake
+Whether to shake the box if the system seems to have settled down.
+"Shake" means "change the direction of Down."
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Peter Birtles and Jamie Zawinski. Permission to
+use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided
+that the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation. No representations are made about the suitability of
+this software for any purpose. It is provided "as is" without express
+or implied warranty.
+.SH AUTHOR
+Peter Birtles, Jamie Zawinski, and Steven Barker.
+
diff --git a/hacks/fontglide.c b/hacks/fontglide.c
new file mode 100644
index 0000000..263393a
--- /dev/null
+++ b/hacks/fontglide.c
@@ -0,0 +1,2489 @@
+/* xscreensaver, Copyright (c) 2003-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * fontglide -- reads text from a subprocess and puts it on the screen using
+ * large characters that glide in from the edges, assemble, then disperse.
+ * Requires a system with scalable fonts. (X's font handing sucks. A lot.)
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+
+/* If you turn on DEBUG, this program also masquerades as a tool for
+ debugging font metrics issues, which is probably only if interest
+ if you are doing active development on libjwxyz.a itself.
+ */
+/* #define DEBUG */
+
+#include <math.h>
+#include <time.h>
+
+#ifndef HAVE_JWXYZ
+# include <X11/Intrinsic.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include "screenhack.h"
+#include "textclient.h"
+#include "xft.h"
+#include "utf8wc.h"
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+#include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+typedef struct {
+ char *text;
+
+ int x, y; /* Position of origin of first character in word */
+
+ /* These have the same meanings as in XCharStruct: */
+ int lbearing; /* origin to leftmost pixel */
+ int rbearing; /* origin to rightmost pixel */
+ int ascent; /* origin to topmost pixel */
+ int descent; /* origin to bottommost pixel */
+ int width; /* origin to next word's origin */
+
+ int nticks, tick;
+ int start_x, start_y;
+ int target_x, target_y;
+ Pixmap pixmap, mask;
+} word;
+
+
+typedef struct {
+ int id;
+ Bool dark_p;
+ Bool move_chars_p;
+ int width;
+
+ char *font_name;
+ GC fg_gc;
+ XftFont *xftfont;
+ XftColor xftcolor_fg, xftcolor_bg;
+
+ int nwords;
+ word **words;
+
+ enum { IN, PAUSE, OUT } anim_state;
+ enum { LEFT, CENTER, RIGHT } alignment;
+ int pause_tick;
+
+} sentence;
+
+
+typedef struct {
+ Display *dpy;
+ Window window;
+ XWindowAttributes xgwa;
+
+ Pixmap b, ba; /* double-buffer to reduce flicker */
+ GC bg_gc;
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ XdbeBackBuffer backb;
+ Bool dbeclear_p;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ Bool dbuf; /* Whether we're using double buffering. */
+
+ int border_width; /* size of the font outline */
+ char *charset; /* registry and encoding for font lookups */
+ double speed; /* frame rate multiplier */
+ double linger; /* multiplier for how long to leave words on screen */
+ Bool trails_p;
+ enum { PAGE, SCROLL, CHARS } mode;
+
+ char *font_override; /* if -font was specified on the cmd line */
+
+ char buf [40]; /* this only needs to be as big as one "word". */
+ int buf_tail;
+ Bool early_p;
+ time_t start_time;
+
+ int nsentences;
+ sentence **sentences;
+ Bool spawn_p; /* whether it is time to create a new sentence */
+ int latest_sentence;
+ unsigned long frame_delay;
+ int id_tick;
+ text_data *tc;
+
+# ifdef DEBUG
+ Bool debug_p;
+ unsigned long debug_metrics_p;
+ int debug_metrics_antialiasing_p;
+ int debug_scale;
+ unsigned entering_unicode_p; /* 0 = No, 1 = Just started, 2 = in progress */
+ XFontStruct *metrics_font1;
+ XFontStruct *metrics_font2;
+ XftFont *metrics_xftfont;
+ GC label_gc;
+ char *prev_font_name;
+ char *next_font_name;
+# endif /* DEBUG */
+
+} state;
+
+
+static void drain_input (state *s);
+
+
+static int
+pick_font_size (state *s)
+{
+ double scale = s->xgwa.height / 1024.0; /* shrink for small windows */
+ int min, max, r, pixel;
+
+ min = scale * 24;
+ max = scale * 260;
+
+ if (min < 10) min = 10;
+ if (max < 30) max = 30;
+
+ r = ((max-min)/3)+1;
+
+ pixel = min + ((random() % r) + (random() % r) + (random() % r));
+
+ if (s->mode == SCROLL) /* scroll mode likes bigger fonts */
+ pixel *= 1.5;
+
+ return pixel;
+}
+
+
+#ifdef HAVE_JWXYZ
+
+static char *
+append_font_name(Display *dpy, char *dest, const XFontStruct *font)
+{
+ int i;
+ for (i = 0; i != font->n_properties; ++i) {
+ if (font->properties[i].name == XA_FONT) {
+ const char *suffix = XGetAtomName (dpy, font->properties[i].card32);
+ strcpy(dest, suffix);
+ return dest + strlen(suffix);
+ }
+ }
+
+ dest[0] = '?';
+ dest[1] = 0;
+ return dest + 1;
+
+/*
+ float s;
+ const char *n = jwxyz_nativeFontName (font->fid, &s);
+ return dest + sprintf (dest, "%s %.1f", n, s);
+ */
+}
+
+#endif
+
+
+/* Finds the set of scalable fonts on the system; picks one;
+ and loads that font in a random pixel size.
+ Returns False if something went wrong.
+ */
+static Bool
+pick_font_1 (state *s, sentence *se)
+{
+ Bool ok = False;
+ char pattern[1024];
+ char pattern2[1024];
+
+#ifndef HAVE_JWXYZ /* real Xlib */
+ char **names = 0;
+ char **names2 = 0;
+ XFontStruct *info = 0;
+ int count = 0, count2 = 0;
+ int i;
+
+ if (se->xftfont)
+ {
+ XftFontClose (s->dpy, se->xftfont);
+ XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
+ &se->xftcolor_fg);
+ XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
+ &se->xftcolor_bg);
+
+ free (se->font_name);
+ se->xftfont = 0;
+ se->font_name = 0;
+ }
+
+ if (s->font_override)
+ sprintf (pattern, "%.200s", s->font_override);
+ else
+ sprintf (pattern, "-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s",
+ "*", /* foundry */
+ "*", /* family */
+ "*", /* weight */
+ "*", /* slant */
+ "*", /* swidth */
+ "*", /* adstyle */
+ "0", /* pixel size */
+ "0", /* point size */
+ "0", /* resolution x */
+ "0", /* resolution y */
+ "p", /* spacing */
+ "0", /* avg width */
+ s->charset); /* registry + encoding */
+
+ names = XListFonts (s->dpy, pattern, 1000, &count);
+
+ if (count <= 0)
+ {
+ if (s->font_override)
+ fprintf (stderr, "%s: -font option bogus: %s\n", progname, pattern);
+ else
+ fprintf (stderr, "%s: no scalable fonts found! (pattern: %s)\n",
+ progname, pattern);
+ exit (1);
+ }
+
+ i = random() % count;
+
+ names2 = XListFontsWithInfo (s->dpy, names[i], 1000, &count2, &info);
+ if (count2 <= 0)
+ {
+# ifdef DEBUG
+ if (s->debug_p)
+ fprintf (stderr, "%s: pattern %s\n"
+ " gave unusable %s\n\n",
+ progname, pattern, names[i]);
+# endif /* DEBUG */
+ goto FAIL;
+ }
+
+ {
+ XFontStruct *font = &info[0];
+ unsigned long value = 0;
+ char *foundry=0, *family=0, *weight=0, *slant=0, *setwidth=0, *add_style=0;
+ unsigned long pixel=0, point=0, res_x=0, res_y=0;
+ char *spacing=0;
+ unsigned long avg_width=0;
+ char *registry=0, *encoding=0;
+ Atom a;
+ char *bogus = "\"?\"";
+
+# define STR(ATOM,VAR) \
+ bogus = (ATOM); \
+ a = XInternAtom (s->dpy, (ATOM), False); \
+ if (XGetFontProperty (font, a, &value)) \
+ VAR = XGetAtomName (s->dpy, value); \
+ else \
+ goto FAIL2
+
+# define INT(ATOM,VAR) \
+ bogus = (ATOM); \
+ a = XInternAtom (s->dpy, (ATOM), False); \
+ if (!XGetFontProperty (font, a, &VAR) || \
+ VAR > 9999) \
+ goto FAIL2
+
+ STR ("FOUNDRY", foundry);
+ STR ("FAMILY_NAME", family);
+ STR ("WEIGHT_NAME", weight);
+ STR ("SLANT", slant);
+ STR ("SETWIDTH_NAME", setwidth);
+ STR ("ADD_STYLE_NAME", add_style);
+ INT ("PIXEL_SIZE", pixel);
+ INT ("POINT_SIZE", point);
+ INT ("RESOLUTION_X", res_x);
+ INT ("RESOLUTION_Y", res_y);
+ STR ("SPACING", spacing);
+ INT ("AVERAGE_WIDTH", avg_width);
+ STR ("CHARSET_REGISTRY", registry);
+ STR ("CHARSET_ENCODING", encoding);
+
+#undef INT
+#undef STR
+
+ pixel = pick_font_size (s);
+
+#if 0
+ /* Occasionally change the aspect ratio of the font, by increasing
+ either the X or Y resolution (while leaving the other alone.)
+
+ #### Looks like this trick doesn't really work that well: the
+ metrics of the individual characters are ok, but the
+ overall font ascent comes out wrong (unscaled.)
+ */
+ if (! (random() % 8))
+ {
+ double n = 2.5 / 3;
+ double scale = 1 + (frand(n) + frand(n) + frand(n));
+ if (random() % 2)
+ res_x *= scale;
+ else
+ res_y *= scale;
+ }
+# endif
+
+ sprintf (pattern,
+ "-%s-%s-%s-%s-%s-%s-%ld-%s-%ld-%ld-%s-%s-%s-%s",
+ foundry, family, weight, slant, setwidth, add_style,
+ pixel, "*", /* point, */
+ res_x, res_y, spacing,
+ "*", /* avg_width */
+ registry, encoding);
+ ok = True;
+
+ FAIL2:
+ if (!ok)
+ fprintf (stderr, "%s: font has bogus %s property: %s\n",
+ progname, bogus, names[i]);
+
+ if (foundry) XFree (foundry);
+ if (family) XFree (family);
+ if (weight) XFree (weight);
+ if (slant) XFree (slant);
+ if (setwidth) XFree (setwidth);
+ if (add_style) XFree (add_style);
+ if (spacing) XFree (spacing);
+ if (registry) XFree (registry);
+ if (encoding) XFree (encoding);
+ }
+
+ FAIL:
+
+ XFreeFontInfo (names2, info, count2);
+ XFreeFontNames (names);
+
+# else /* HAVE_JWXYZ */
+
+ if (s->font_override)
+ sprintf (pattern, "%.200s", s->font_override);
+ else
+ {
+ const char *family = "random";
+ const char *weight = ((random() % 2) ? "regular" : "bold");
+ const char *slant = ((random() % 2) ? "o" : "r");
+ int size = 10 * pick_font_size (s);
+ sprintf (pattern, "*-%s-%s-%s-*-*-*-%d-*", family, weight, slant, size);
+ }
+ ok = True;
+# endif /* HAVE_JWXYZ */
+
+ if (! ok) return False;
+
+ se->xftfont = XftFontOpenXlfd (s->dpy, screen_number (s->xgwa.screen),
+ pattern);
+
+ if (! se->xftfont)
+ {
+# ifdef DEBUG
+ if (s->debug_p)
+ fprintf (stderr, "%s: unable to load font %s\n",
+ progname, pattern);
+#endif
+ return False;
+ }
+
+ strcpy (pattern2, pattern);
+# ifdef HAVE_JWXYZ
+ {
+ char *out = pattern2 + strlen(pattern2);
+ out[0] = ' ';
+ out[1] = '(';
+ out = append_font_name (s->dpy, out + 2, se->xftfont->xfont);
+ out[0] = ')';
+ out[1] = 0;
+ }
+# endif
+
+# ifdef DEBUG
+ if (s->prev_font_name) free (s->prev_font_name);
+ s->prev_font_name = s->next_font_name;
+ s->next_font_name = strdup (pattern2);
+# endif
+
+ /* Sometimes we get fonts with screwed up metrics. For example:
+ -b&h-lucida-medium-r-normal-sans-40-289-100-100-p-0-iso8859-1
+
+ When using XDrawString, XTextExtents and XTextExtents16, it is rendered
+ as a scaled-up bitmap font. The character M has rbearing 70, ascent 68
+ and width 78, which is correct for the glyph as rendered.
+
+ But when using XftDrawStringUtf8 and XftTextExtentsUtf8, it is rendered
+ at the original, smaller, un-scaled size, with rbearing 26, ascent 25
+ and... width 77!
+
+ So it's taking the *size* from the unscaled font, the *advancement* from
+ the scaled-up version, and then *not* actually scaling it up. Awesome.
+
+ So, after loading the font, measure the M, and if its advancement is more
+ than 20% larger than its rbearing, reject the font.
+
+ ------------------------------------------------------------------------
+
+ Some observations on this nonsense from Dave Odell:
+
+ 1. -*-lucidatypewriter-bold-r-normal-*-*-480-*-*-*-*-iso8859-1 normally
+ resolves to /usr/share/fonts/X11/100dpi/lutBS24-ISO8859-1.pcf.gz.
+
+ -*-lucidatypewriter-* is from the 'xfonts-100dpi' package in
+ Debian/Ubuntu. It's usually (54.46% of systems), but not always,
+ installed whenever an X.org server (57.96% of systems) is. It might
+ be a good idea for this and xfonts-75dpi to be recommended
+ dependencies of XScreenSaver in Debian, but that's neither here nor
+ there. https://qa.debian.org/popcon.php?package=xorg
+ https://qa.debian.org/popcon.php?package=xfonts-100dpi
+
+ 2. It normally resolves to the PCF font... but not always.
+
+ Fontconfig has /etc/fonts/conf.d/ (it's /opt/local/etc/fonts/conf.d/
+ with MacPorts) containing symlinks to configuration files. And both
+ Debian and Ubuntu normally has a 70-no-bitmaps.conf, installed as part
+ of the 'fontconfig-config' package. And the 70-no-bitmaps.conf
+ symlink... disables bitmap fonts.
+
+ Without bitmap fonts, I get DejaVu Sans.
+
+ 3. There's another symlink of interest here:
+ /etc/fonts/conf.d/10-scale-bitmap-fonts.conf. This adds space to the
+ right of glyphs of bitmap fonts when the requested size of the font is
+ larger than the actual bitmap font. Ubuntu and MacPorts has this one.
+
+ This specifically is causing text to have excessive character spacing.
+
+ (jwz asks: WHY WOULD ANYONE EVER WANT THIS BEHAVIOR?)
+
+ 4. Notice that I'm only talking about Debian and Ubuntu. Other distros
+ will probably have different symlinks in /etc/fonts/conf.d/. So yes,
+ this can be an issue on Linux as well as MacOS.
+ */
+ {
+ XGlyphInfo extents;
+ int rbearing, width;
+ float ratio;
+ float min = 0.8;
+
+ XftTextExtentsUtf8 (s->dpy, se->xftfont, (FcChar8 *) "M", 1, &extents);
+ rbearing = extents.width - extents.x;
+ width = extents.xOff;
+ ratio = rbearing / (float) width;
+
+# ifdef DEBUG
+ if (s->debug_p)
+ fprintf (stderr, "%s: M ratio %.2f (%d %d): %s\n", progname,
+ ratio, rbearing, width, pattern2);
+# endif
+
+ if (ratio < min && !s->font_override)
+ {
+# ifdef DEBUG
+ if (s->debug_p)
+ fprintf (stderr, "%s: skipping font with broken metrics: %s\n",
+ progname, pattern2);
+# endif
+ return False;
+ }
+ }
+
+
+# ifdef DEBUG
+ if (s->debug_p)
+ fprintf(stderr, "%s: %s\n", progname, pattern2);
+# endif /* DEBUG */
+
+ se->font_name = strdup (pattern);
+ return True;
+}
+
+
+/* Finds the set of scalable fonts on the system; picks one;
+ and loads that font in a random pixel size.
+ */
+static void
+pick_font (state *s, sentence *se)
+{
+ int i;
+ for (i = 0; i < 50; i++)
+ if (pick_font_1 (s, se))
+ return;
+ fprintf (stderr, "%s: too many font-loading failures: giving up!\n",
+ progname);
+ exit (1);
+}
+
+
+static char *unread_word_text = 0;
+
+/* Returns a newly-allocated string with one word in it, or NULL if there
+ is no complete word available.
+ */
+static char *
+get_word_text (state *s)
+{
+ const char *start = s->buf;
+ const char *end;
+ char *result = 0;
+ int lfs = 0;
+
+ drain_input (s);
+
+ /* If we just launched, and haven't had any text yet, and it has been
+ more than 2 seconds since we launched, then push out "Loading..."
+ as our first text. So if the text source is speedy, just use that.
+ But if we'd display a blank screen for a while, give 'em something
+ to see.
+ */
+ if (s->early_p &&
+ !*s->buf &&
+ !unread_word_text &&
+ s->start_time < ((time ((time_t *) 0) - 2)))
+ {
+ unread_word_text = "Loading...";
+ s->early_p = False;
+ }
+
+ if (unread_word_text)
+ {
+ result = unread_word_text;
+ unread_word_text = 0;
+ return strdup (result);
+ }
+
+ /* Skip over whitespace at the beginning of the buffer,
+ and count up how many linebreaks we see while doing so.
+ */
+ while (*start &&
+ (*start == ' ' ||
+ *start == '\t' ||
+ *start == '\r' ||
+ *start == '\n'))
+ {
+ if (*start == '\n' || (*start == '\r' && start[1] != '\n'))
+ lfs++;
+ start++;
+ }
+
+ end = start;
+
+ /* If we saw a blank line, then return NULL (treat it as a temporary "eof",
+ to trigger a sentence break here.) */
+ if (lfs >= 2)
+ goto DONE;
+
+ /* Skip forward to the end of this word (find next whitespace.) */
+ while (*end &&
+ (! (*end == ' ' ||
+ *end == '\t' ||
+ *end == '\r' ||
+ *end == '\n')))
+ end++;
+
+ /* If we have a word, allocate a string for it */
+ if (end > start)
+ {
+ result = malloc ((end - start) + 1);
+ strncpy (result, start, (end-start));
+ result [end-start] = 0;
+ }
+
+ DONE:
+
+ /* Make room in the buffer by compressing out any bytes we've processed.
+ */
+ if (end > s->buf)
+ {
+ int n = end - s->buf;
+ memmove (s->buf, end, sizeof(s->buf) - n);
+ s->buf_tail -= n;
+ }
+
+ return result;
+}
+
+
+/* Returns a 1-bit pixmap of the same size as the drawable,
+ with a 0 wherever the drawable is black.
+ */
+static Pixmap
+make_mask (Screen *screen, Visual *visual, Drawable drawable)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ unsigned long black = BlackPixelOfScreen (screen);
+ Window r;
+ int x, y;
+ unsigned int w, h, bw, d;
+ XImage *out, *in;
+ Pixmap mask;
+ GC gc;
+
+ XGetGeometry (dpy, drawable, &r, &x, &y, &w, &h, &bw, &d);
+ in = XGetImage (dpy, drawable, 0, 0, w, h, ~0L, ZPixmap);
+ out = XCreateImage (dpy, visual, 1, XYPixmap, 0, 0, w, h, 8, 0);
+ out->data = (char *) malloc (h * out->bytes_per_line);
+ for (y = 0; y < h; y++)
+ for (x = 0; x < w; x++)
+ XPutPixel (out, x, y, (black != XGetPixel (in, x, y)));
+ mask = XCreatePixmap (dpy, drawable, w, h, 1L);
+ gc = XCreateGC (dpy, mask, 0, 0);
+ XPutImage (dpy, mask, gc, out, 0, 0, 0, 0, w, h);
+ XFreeGC (dpy, gc);
+ free (in->data);
+ free (out->data);
+ in->data = out->data = 0;
+ XDestroyImage (in);
+ XDestroyImage (out);
+ return mask;
+}
+
+
+/* Gets some random text, and creates a "word" object from it.
+ */
+static word *
+new_word (state *s, sentence *se, const char *txt, Bool alloc_p)
+{
+ word *w;
+ XGlyphInfo extents;
+ int bw = s->border_width;
+
+ if (!txt)
+ return 0;
+
+ w = (word *) calloc (1, sizeof(*w));
+ XftTextExtentsUtf8 (s->dpy, se->xftfont, (FcChar8 *) txt, strlen(txt),
+ &extents);
+
+ w->lbearing = -extents.x;
+ w->rbearing = extents.width - extents.x;
+ w->ascent = extents.y;
+ w->descent = extents.height - extents.y;
+ w->width = extents.xOff;
+
+ w->lbearing -= bw;
+ w->rbearing += bw;
+ w->descent += bw;
+ w->ascent += bw;
+
+ if (s->mode == SCROLL && !alloc_p) abort();
+
+ if (alloc_p)
+ {
+ int i, j;
+ XGCValues gcv;
+ GC gc_fg, gc_bg, gc_black;
+ XftDraw *xftdraw;
+ int width = w->rbearing - w->lbearing;
+ int height = w->ascent + w->descent;
+
+ if (width <= 0) width = 1;
+ if (height <= 0) height = 1;
+
+ w->pixmap = XCreatePixmap (s->dpy, s->b, width, height, s->xgwa.depth);
+ xftdraw = XftDrawCreate (s->dpy, w->pixmap, s->xgwa.visual,
+ s->xgwa.colormap);
+
+ gcv.foreground = se->xftcolor_fg.pixel;
+ gc_fg = XCreateGC (s->dpy, w->pixmap, GCForeground, &gcv);
+
+ gcv.foreground = se->xftcolor_bg.pixel;
+ gc_bg = XCreateGC (s->dpy, w->pixmap, GCForeground, &gcv);
+
+ gcv.foreground = BlackPixelOfScreen (s->xgwa.screen);
+ gc_black = XCreateGC (s->dpy, w->pixmap, GCForeground, &gcv);
+
+ XFillRectangle (s->dpy, w->pixmap, gc_black, 0, 0, width, height);
+
+# ifdef DEBUG
+ if (s->debug_p)
+ {
+ /* bounding box (behind the characters) */
+ XDrawRectangle (s->dpy, w->pixmap, (se->dark_p ? gc_bg : gc_fg),
+ 0, 0, width-1, height-1);
+ }
+# endif /* DEBUG */
+
+ /* Draw background text for border */
+ for (i = -bw; i <= bw; i++)
+ for (j = -bw; j <= bw; j++)
+ XftDrawStringUtf8 (xftdraw, &se->xftcolor_bg, se->xftfont,
+ -w->lbearing + i, w->ascent + j,
+ (FcChar8 *) txt, strlen(txt));
+
+ /* Draw foreground text */
+ XftDrawStringUtf8 (xftdraw, &se->xftcolor_fg, se->xftfont,
+ -w->lbearing, w->ascent,
+ (FcChar8 *) txt, strlen(txt));
+
+# ifdef DEBUG
+ if (s->debug_p)
+ {
+ if (w->ascent != height)
+ {
+ /* baseline (on top of the characters) */
+ XDrawLine (s->dpy, w->pixmap, (se->dark_p ? gc_bg : gc_fg),
+ 0, w->ascent, width-1, w->ascent);
+ }
+
+ if (w->lbearing < 0)
+ {
+ /* left edge of charcell */
+ XDrawLine (s->dpy, w->pixmap, (se->dark_p ? gc_bg : gc_fg),
+ -w->lbearing, 0,
+ -w->lbearing, height-1);
+ }
+
+ if (w->rbearing != w->width)
+ {
+ /* right edge of charcell */
+ XDrawLine (s->dpy, w->pixmap, (se->dark_p ? gc_bg : gc_fg),
+ w->width - w->lbearing, 0,
+ w->width - w->lbearing, height-1);
+ }
+ }
+# endif /* DEBUG */
+
+ w->mask = make_mask (s->xgwa.screen, s->xgwa.visual, w->pixmap);
+
+ XftDrawDestroy (xftdraw);
+ XFreeGC (s->dpy, gc_fg);
+ XFreeGC (s->dpy, gc_bg);
+ XFreeGC (s->dpy, gc_black);
+ }
+
+ w->text = strdup (txt);
+ return w;
+}
+
+
+static void
+free_word (state *s, word *w)
+{
+ if (w->text) free (w->text);
+ if (w->pixmap) XFreePixmap (s->dpy, w->pixmap);
+ if (w->mask) XFreePixmap (s->dpy, w->mask);
+}
+
+
+static sentence *
+new_sentence (state *st, state *s)
+{
+ XGCValues gcv;
+ sentence *se = (sentence *) calloc (1, sizeof (*se));
+ se->fg_gc = XCreateGC (s->dpy, s->b, 0, &gcv);
+ se->anim_state = IN;
+ se->id = ++st->id_tick;
+ return se;
+}
+
+
+static void
+free_sentence (state *s, sentence *se)
+{
+ int i;
+ for (i = 0; i < se->nwords; i++)
+ free_word (s, se->words[i]);
+ if (se->words)
+ free (se->words);
+ if (se->font_name)
+ free (se->font_name);
+ if (se->fg_gc)
+ XFreeGC (s->dpy, se->fg_gc);
+
+ if (se->xftfont)
+ {
+ XftFontClose (s->dpy, se->xftfont);
+ XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
+ &se->xftcolor_fg);
+ XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
+ &se->xftcolor_bg);
+ }
+
+ free (se);
+}
+
+
+/* free the word, and put its text back at the front of the input queue,
+ to be read next time. */
+static void
+unread_word (state *s, word *w)
+{
+ if (unread_word_text)
+ abort();
+ unread_word_text = w->text;
+ w->text = 0;
+ free_word (s, w);
+}
+
+
+/* Divide each of the words in the sentence into one character words,
+ without changing the positions of those characters.
+ */
+static void
+split_words (state *s, sentence *se)
+{
+ word **words2;
+ int nwords2 = 0;
+ int i, j;
+
+ char ***word_chars = (char ***) malloc (se->nwords * sizeof(*word_chars));
+ for (i = 0; i < se->nwords; i++)
+ {
+ int L;
+ word *ow = se->words[i];
+ word_chars[i] = utf8_split (ow->text, &L);
+ nwords2 += L;
+ }
+
+ words2 = (word **) calloc (nwords2, sizeof(*words2));
+
+ for (i = 0, j = 0; i < se->nwords; i++)
+ {
+ char **chars = word_chars[i];
+ word *parent = se->words[i];
+ int x = parent->x;
+ int y = parent->y;
+ int sx = parent->start_x;
+ int sy = parent->start_y;
+ int tx = parent->target_x;
+ int ty = parent->target_y;
+ int k;
+
+ for (k = 0; chars[k]; k++)
+ {
+ char *t2 = chars[k];
+ word *w2 = new_word (s, se, t2, True);
+ words2[j++] = w2;
+
+ w2->x = x;
+ w2->y = y;
+ w2->start_x = sx;
+ w2->start_y = sy;
+ w2->target_x = tx;
+ w2->target_y = ty;
+
+ x += w2->width;
+ sx += w2->width;
+ tx += w2->width;
+ }
+
+ /* This is not invariant when kerning is involved! */
+ /* if (x != parent->x + parent->width) abort(); */
+
+ free (chars); /* but we retain its contents */
+ free_word (s, parent);
+ }
+ if (j != nwords2) abort();
+ free (word_chars);
+ free (se->words);
+
+ se->words = words2;
+ se->nwords = nwords2;
+}
+
+
+/* Set the source or destination position of the words to be somewhere
+ off screen.
+ */
+static void
+scatter_sentence (state *s, sentence *se)
+{
+ int i = 0;
+ int off = s->border_width * 4 + 2;
+
+ int flock_p = ((random() % 4) == 0);
+ int mode = (flock_p ? (random() % 12) : 0);
+
+ for (i = 0; i < se->nwords; i++)
+ {
+ word *w = se->words[i];
+ int x, y;
+ int r = (flock_p ? mode : (random() % 4));
+ int left = -(off + w->rbearing);
+ int top = -(off + w->descent);
+ int right = off - w->lbearing + s->xgwa.width;
+ int bottom = off + w->ascent + s->xgwa.height;
+
+ switch (r) {
+ /* random positions on the edges */
+ case 0: x = left; y = random() % s->xgwa.height; break;
+ case 1: x = right; y = random() % s->xgwa.height; break;
+ case 2: x = random() % s->xgwa.width; y = top; break;
+ case 3: x = random() % s->xgwa.width; y = bottom; break;
+
+ /* straight towards the edges */
+ case 4: x = left; y = w->target_y; break;
+ case 5: x = right; y = w->target_y; break;
+ case 6: x = w->target_x; y = top; break;
+ case 7: x = w->target_x; y = bottom; break;
+
+ /* corners */
+ case 8: x = left; y = top; break;
+ case 9: x = left; y = bottom; break;
+ case 10: x = right; y = top; break;
+ case 11: x = right; y = bottom; break;
+
+ default: abort(); break;
+ }
+
+ if (se->anim_state == IN)
+ {
+ w->start_x = x;
+ w->start_y = y;
+ }
+ else
+ {
+ w->start_x = w->x;
+ w->start_y = w->y;
+ w->target_x = x;
+ w->target_y = y;
+ }
+
+ w->nticks = ((100 + ((random() % 140) +
+ (random() % 140) +
+ (random() % 140)))
+ / s->speed);
+ if (w->nticks < 2)
+ w->nticks = 2;
+ w->tick = 0;
+ }
+}
+
+
+/* Set the source position of the words to be off the right side,
+ and the destination to be off the left side.
+ */
+static void
+aim_sentence (state *s, sentence *se)
+{
+ int i = 0;
+ int nticks;
+ int yoff = 0;
+
+ if (se->nwords <= 0) abort();
+
+ /* Have the sentence shift up or down a little bit; not too far, and
+ never let it fall off the top or bottom of the screen before its
+ last character has reached the left edge.
+ */
+ for (i = 0; i < 10; i++)
+ {
+ int ty = random() % (s->xgwa.height - se->words[0]->ascent);
+ yoff = ty - se->words[0]->target_y;
+ if (yoff < s->xgwa.height/3) /* this one is ok */
+ break;
+ }
+
+ for (i = 0; i < se->nwords; i++)
+ {
+ word *w = se->words[i];
+ w->start_x = w->target_x + s->xgwa.width;
+ w->target_x -= se->width;
+ w->start_y = w->target_y;
+ w->target_y += yoff;
+ }
+
+ nticks = ((se->words[0]->start_x - se->words[0]->target_x)
+ / (s->speed * 7));
+ nticks *= (frand(0.9) + frand(0.9) + frand(0.9));
+
+ if (nticks < 2)
+ nticks = 2;
+
+ for (i = 0; i < se->nwords; i++)
+ {
+ word *w = se->words[i];
+ w->nticks = nticks;
+ w->tick = 0;
+ }
+}
+
+
+/* Randomize the order of the words in the list (since that changes
+ which ones are "on top".)
+ */
+static void
+shuffle_words (state *s, sentence *se)
+{
+ int i;
+ for (i = 0; i < se->nwords-1; i++)
+ {
+ int j = i + (random() % (se->nwords - i));
+ word *swap = se->words[i];
+ se->words[i] = se->words[j];
+ se->words[j] = swap;
+ }
+}
+
+
+/* qsort comparitor */
+static int
+cmp_sentences (const void *aa, const void *bb)
+{
+ const sentence *a = *(sentence **) aa;
+ const sentence *b = *(sentence **) bb;
+ return ((a ? a->id : 999999) - (b ? b->id : 999999));
+}
+
+
+/* Sort the sentences by id, so that sentences added later are on top.
+ */
+static void
+sort_sentences (state *s)
+{
+ qsort (s->sentences, s->nsentences, sizeof(*s->sentences), cmp_sentences);
+}
+
+
+/* Re-pick the colors of the text and border
+ */
+static void
+recolor (state *s, sentence *se)
+{
+ XRenderColor fg, bg;
+
+ fg.red = (random() % 0x5555) + 0xAAAA;
+ fg.green = (random() % 0x5555) + 0xAAAA;
+ fg.blue = (random() % 0x5555) + 0xAAAA;
+ fg.alpha = 0xFFFF;
+ bg.red = (random() % 0x5555);
+ bg.green = (random() % 0x5555);
+ bg.blue = (random() % 0x5555);
+ bg.alpha = 0xFFFF;
+ se->dark_p = False;
+
+ if (random() & 1)
+ {
+ XRenderColor swap = fg; fg = bg; bg = swap;
+ se->dark_p = True;
+ }
+
+ if (se->xftfont)
+ {
+ XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
+ &se->xftcolor_fg);
+ XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
+ &se->xftcolor_bg);
+ }
+
+ XftColorAllocValue (s->dpy, s->xgwa.visual, s->xgwa.colormap, &fg,
+ &se->xftcolor_fg);
+ XftColorAllocValue (s->dpy, s->xgwa.visual, s->xgwa.colormap, &bg,
+ &se->xftcolor_bg);
+}
+
+
+static void
+align_line (state *s, sentence *se, int line_start, int x, int right)
+{
+ int off, j;
+ switch (se->alignment)
+ {
+ case LEFT: off = 0; break;
+ case CENTER: off = (right - x) / 2; break;
+ case RIGHT: off = (right - x); break;
+ default: abort(); break;
+ }
+
+ if (off != 0)
+ for (j = line_start; j < se->nwords; j++)
+ se->words[j]->target_x += off;
+}
+
+
+/* Fill the sentence with new words: in "page" mode, fills the page
+ with text; in "scroll" mode, just makes one long horizontal sentence.
+ The sentence might have *no* words in it, if no text is currently
+ available.
+ */
+static void
+populate_sentence (state *s, sentence *se)
+{
+ int i = 0;
+ int left, right, top, x, y;
+ int space = 0;
+ int line_start = 0;
+ Bool done = False;
+
+ int array_size = 100;
+
+ se->move_chars_p = (s->mode == CHARS ? True :
+ s->mode == SCROLL ? False :
+ (random() % 3) ? False : True);
+ se->alignment = (random() % 3);
+
+ recolor (s, se);
+
+ if (se->words)
+ {
+ for (i = 0; i < se->nwords; i++)
+ free_word (s, se->words[i]);
+ free (se->words);
+ }
+
+ se->words = (word **) calloc (array_size, sizeof(*se->words));
+ se->nwords = 0;
+
+ switch (s->mode)
+ {
+ case PAGE:
+ case CHARS:
+ left = random() % (s->xgwa.width / 3);
+ right = s->xgwa.width - (random() % (s->xgwa.width / 3));
+ top = random() % (s->xgwa.height * 2 / 3);
+ break;
+ case SCROLL:
+ left = 0;
+ right = s->xgwa.width;
+ top = random() % s->xgwa.height;
+ break;
+ default:
+ abort();
+ break;
+ }
+
+ x = left;
+ y = top;
+
+ while (!done)
+ {
+ char *txt = get_word_text (s);
+ word *w;
+ if (!txt)
+ {
+ if (se->nwords == 0)
+ return; /* If the stream is empty, bail. */
+ else
+ break; /* If EOF after some words, end of sentence. */
+ }
+
+ if (! se->xftfont) /* Got a word: need a font now */
+ {
+ XGlyphInfo extents;
+ pick_font (s, se);
+ if (y < se->xftfont->ascent)
+ y += se->xftfont->ascent;
+
+ /* Measure the space character to figure out how much room to
+ leave between words (since we don't actually render that.) */
+ XftTextExtentsUtf8 (s->dpy, se->xftfont, (FcChar8 *) " ", 1,
+ &extents);
+ space = extents.xOff;
+ }
+
+ w = new_word (s, se, txt, !se->move_chars_p);
+ free (txt);
+ txt = 0;
+
+ /* If we have a few words, let punctuation terminate the sentence:
+ stop gathering more words if the last word ends in a period, etc. */
+ if (se->nwords >= 4)
+ {
+ char c = w->text[strlen(w->text)-1];
+ if (c == '.' || c == '?' || c == '!')
+ done = True;
+ }
+
+ /* If the sentence is kind of long already, terminate at commas, etc. */
+ if (se->nwords >= 12)
+ {
+ char c = w->text[strlen(w->text)-1];
+ if (c == ',' || c == ';' || c == ':' || c == '-' ||
+ c == ')' || c == ']' || c == '}')
+ done = True;
+ }
+
+ if (se->nwords >= 25) /* ok that's just about enough out of you */
+ done = True;
+
+ if ((s->mode == PAGE || s->mode == CHARS) &&
+ x + w->rbearing > right) /* wrap line */
+ {
+ align_line (s, se, line_start, x, right);
+ line_start = se->nwords;
+
+ x = left;
+ y += se->xftfont->ascent + se->xftfont->descent;
+
+ /* If we're close to the bottom of the screen, stop, and
+ unread the current word. (But not if this is the first
+ word, otherwise we might just get stuck on it.)
+ */
+ if (se->nwords > 0 &&
+ y + se->xftfont->ascent + se->xftfont->descent > s->xgwa.height)
+ {
+ unread_word (s, w);
+ free (w);
+ /* done = True; */
+ break;
+ }
+ }
+
+ w->target_x = x;
+ w->target_y = y;
+
+ x += w->width + space;
+ se->width = x;
+
+ if (se->nwords >= (array_size - 1))
+ {
+ array_size += 100;
+ se->words = (word **)
+ realloc (se->words, array_size * sizeof(*se->words));
+ if (!se->words)
+ {
+ fprintf (stderr, "%s: out of memory (%d words)\n",
+ progname, array_size);
+ exit (1);
+ }
+ }
+
+ se->words[se->nwords++] = w;
+ }
+
+ se->width -= space;
+
+ switch (s->mode)
+ {
+ case PAGE:
+ case CHARS:
+ align_line (s, se, line_start, x, right);
+ if (se->move_chars_p)
+ split_words (s, se);
+ scatter_sentence (s, se);
+ shuffle_words (s, se);
+ break;
+ case SCROLL:
+ aim_sentence (s, se);
+ break;
+ default:
+ abort();
+ break;
+ }
+
+# ifdef DEBUG
+ if (s->debug_p)
+ {
+ fprintf (stderr, "%s: sentence %d:", progname, se->id);
+ for (i = 0; i < se->nwords; i++)
+ fprintf (stderr, " %s", se->words[i]->text);
+ fprintf (stderr, "\n");
+ }
+# endif /* DEBUG */
+}
+
+
+/* Render a single word object to the screen.
+ */
+static void
+draw_word (state *s, sentence *se, word *word)
+{
+ int x, y, w, h;
+ if (! word->pixmap) return;
+
+ x = word->x + word->lbearing;
+ y = word->y - word->ascent;
+ w = word->rbearing - word->lbearing;
+ h = word->ascent + word->descent;
+
+ if (x + w < 0 ||
+ y + h < 0 ||
+ x > s->xgwa.width ||
+ y > s->xgwa.height)
+ return;
+
+ XSetClipMask (s->dpy, se->fg_gc, word->mask);
+ XSetClipOrigin (s->dpy, se->fg_gc, x, y);
+ XCopyArea (s->dpy, word->pixmap, s->b, se->fg_gc,
+ 0, 0, w, h, x, y);
+}
+
+
+/* If there is room for more sentences, add one.
+ */
+static void
+more_sentences (state *s)
+{
+ int i;
+ Bool any = False;
+ for (i = 0; i < s->nsentences; i++)
+ {
+ sentence *se = s->sentences[i];
+ if (! se)
+ {
+ se = new_sentence (s, s);
+ populate_sentence (s, se);
+ if (se->nwords > 0)
+ s->spawn_p = False, any = True;
+ else
+ {
+ free_sentence (s, se);
+ se = 0;
+ }
+ s->sentences[i] = se;
+ if (se)
+ s->latest_sentence = se->id;
+ break;
+ }
+ }
+
+ if (any) sort_sentences (s);
+}
+
+
+/* Render all the words to the screen, and run the animation one step.
+ */
+static void
+draw_sentence (state *s, sentence *se)
+{
+ int i;
+ Bool moved = False;
+
+ if (! se) return;
+
+ for (i = 0; i < se->nwords; i++)
+ {
+ word *w = se->words[i];
+
+ switch (s->mode)
+ {
+ case PAGE:
+ case CHARS:
+ if (se->anim_state != PAUSE &&
+ w->tick <= w->nticks)
+ {
+ int dx = w->target_x - w->start_x;
+ int dy = w->target_y - w->start_y;
+ double r = sin (w->tick * M_PI / (2 * w->nticks));
+ w->x = w->start_x + (dx * r);
+ w->y = w->start_y + (dy * r);
+
+ w->tick++;
+ if (se->anim_state == OUT &&
+ (s->mode == PAGE || s->mode == CHARS))
+ w->tick++; /* go out faster */
+ moved = True;
+ }
+ break;
+ case SCROLL:
+ {
+ int dx = w->target_x - w->start_x;
+ int dy = w->target_y - w->start_y;
+ double r = (double) w->tick / w->nticks;
+ w->x = w->start_x + (dx * r);
+ w->y = w->start_y + (dy * r);
+ w->tick++;
+ moved = (w->tick <= w->nticks);
+
+ /* Launch a new sentence when:
+ - the front of this sentence is almost off the left edge;
+ - the end of this sentence is almost on screen.
+ - or, randomly
+ */
+ if (se->anim_state != OUT &&
+ i == 0 &&
+ se->id == s->latest_sentence)
+ {
+ Bool new_p = (w->x < (s->xgwa.width * 0.4) &&
+ w->x + se->width < (s->xgwa.width * 2.1));
+ Bool rand_p = (new_p ? 0 : !(random() % 2000));
+
+ if (new_p || rand_p)
+ {
+ se->anim_state = OUT;
+ s->spawn_p = True;
+# ifdef DEBUG
+ if (s->debug_p)
+ fprintf (stderr, "%s: OUT %d (x2 = %d%s)\n",
+ progname, se->id,
+ se->words[0]->x + se->width,
+ rand_p ? " randomly" : "");
+# endif /* DEBUG */
+ }
+ }
+ }
+ break;
+ default:
+ abort();
+ break;
+ }
+
+ draw_word (s, se, w);
+ }
+
+ if (moved && se->anim_state == PAUSE)
+ abort();
+
+ if (! moved)
+ {
+ switch (se->anim_state)
+ {
+ case IN:
+ se->anim_state = PAUSE;
+ se->pause_tick = (se->nwords * 7 * s->linger);
+ if (se->move_chars_p)
+ se->pause_tick /= 5;
+ scatter_sentence (s, se);
+ shuffle_words (s, se);
+# ifdef DEBUG
+ if (s->debug_p)
+ fprintf (stderr, "%s: PAUSE %d\n", progname, se->id);
+# endif /* DEBUG */
+ break;
+ case PAUSE:
+ if (--se->pause_tick <= 0)
+ {
+ se->anim_state = OUT;
+ s->spawn_p = True;
+# ifdef DEBUG
+ if (s->debug_p)
+ fprintf (stderr, "%s: OUT %d\n", progname, se->id);
+# endif /* DEBUG */
+ }
+ break;
+ case OUT:
+# ifdef DEBUG
+ if (s->debug_p)
+ fprintf (stderr, "%s: DEAD %d\n", progname, se->id);
+# endif /* DEBUG */
+ {
+ int j;
+ for (j = 0; j < s->nsentences; j++)
+ if (s->sentences[j] == se)
+ s->sentences[j] = 0;
+ free_sentence (s, se);
+ }
+ break;
+ default:
+ abort();
+ break;
+ }
+ }
+}
+
+
+#ifdef DEBUG /* All of this stuff is for -debug-metrics mode. */
+
+
+static Pixmap
+scale_ximage (Screen *screen, Window window, XImage *img, int scale,
+ int margin)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ int x, y;
+ unsigned width = img->width, height = img->height;
+ Pixmap p2;
+ GC gc;
+
+ p2 = XCreatePixmap (dpy, window, width*scale, height*scale, img->depth);
+ gc = XCreateGC (dpy, p2, 0, 0);
+
+ XSetForeground (dpy, gc, BlackPixelOfScreen (screen));
+ XFillRectangle (dpy, p2, gc, 0, 0, width*scale, height*scale);
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++)
+ {
+ XSetForeground (dpy, gc, XGetPixel (img, x, y));
+ XFillRectangle (dpy, p2, gc, x*scale, y*scale, scale, scale);
+ }
+
+ if (scale > 2)
+ {
+ XWindowAttributes xgwa;
+ XColor c;
+ c.red = c.green = c.blue = 0x4444;
+ c.flags = DoRed|DoGreen|DoBlue;
+ XGetWindowAttributes (dpy, window, &xgwa);
+ if (! XAllocColor (dpy, xgwa.colormap, &c)) abort();
+ XSetForeground (dpy, gc, c.pixel);
+ XDrawRectangle (dpy, p2, gc, 0, 0, width*scale-1, height*scale-1);
+ XDrawRectangle (dpy, p2, gc, margin*scale, margin*scale,
+ width*scale-1, height*scale-1);
+ for (y = 0; y <= height - 2*margin; y++)
+ XDrawLine (dpy, p2, gc,
+ margin*scale, (y+margin)*scale-1,
+ (width-margin)*scale, (y+margin)*scale-1);
+ for (x = 0; x <= width - 2*margin; x++)
+ XDrawLine (dpy, p2, gc,
+ (x+margin)*scale-1, margin*scale,
+ (x+margin)*scale-1, (height-margin)*scale);
+ XFreeColors (dpy, xgwa.colormap, &c.pixel, 1, 0);
+ }
+
+ XFreeGC (dpy, gc);
+ return p2;
+}
+
+
+static int check_edge (Display *dpy, Drawable p, GC gc,
+ unsigned msg_x, unsigned msg_y, const char *msg,
+ XImage *img,
+ unsigned x, unsigned y, unsigned dim, unsigned end)
+{
+ unsigned pt[2];
+ pt[0] = x;
+ pt[1] = y;
+ end += pt[dim];
+
+ for (;;)
+ {
+ if (pt[dim] == end)
+ {
+ XDrawString (dpy, p, gc, msg_x, msg_y, msg, strlen (msg));
+ return 1;
+ }
+
+ if (XGetPixel(img, pt[0], pt[1]) & 0xffffff)
+ break;
+
+ ++pt[dim];
+ }
+
+ return 0;
+}
+
+
+static unsigned long
+fontglide_draw_metrics (state *s)
+{
+ unsigned int margin = (s->debug_metrics_antialiasing_p ? 2 : 0);
+
+ char txt[2], utxt[3], txt2[80];
+ XChar2b *txt3 = 0;
+ const char *fn = (s->font_override ? s->font_override : "fixed");
+ char fn2[1024];
+ XCharStruct c, overall, fake_c;
+ int dir, ascent, descent;
+ int x, y;
+ XGlyphInfo extents;
+ XftColor xftcolor;
+ XftDraw *xftdraw;
+ int sc = s->debug_scale;
+ GC gc;
+ unsigned long red = 0xFFFF0000; /* so shoot me */
+ unsigned long green = 0xFF00FF00;
+ unsigned long blue = 0xFF6666FF;
+ unsigned long yellow = 0xFFFFFF00;
+ unsigned long cyan = 0xFF004040;
+ int i, j;
+ Drawable dest = s->b ? s->b : s->window;
+
+ if (sc < 1) sc = 1;
+
+ /* Self-test these macros to make sure they're symmetrical. */
+ for (i = 0; i < 1000; i++)
+ {
+ XGlyphInfo g, g2;
+ XRectangle r;
+ c.lbearing = (random()%50)-100;
+ c.rbearing = (random()%50)-100;
+ c.ascent = (random()%50)-100;
+ c.descent = (random()%50)-100;
+ c.width = (random()%50)-100;
+ XCharStruct_to_XGlyphInfo (c, g);
+ XGlyphInfo_to_XCharStruct (g, overall);
+ if (c.lbearing != overall.lbearing) abort();
+ if (c.rbearing != overall.rbearing) abort();
+ if (c.ascent != overall.ascent) abort();
+ if (c.descent != overall.descent) abort();
+ if (c.width != overall.width) abort();
+ XCharStruct_to_XGlyphInfo (overall, g2);
+ if (g.x != g2.x) abort();
+ if (g.y != g2.y) abort();
+ if (g.xOff != g2.xOff) abort();
+ if (g.yOff != g2.yOff) abort();
+ if (g.width != g2.width) abort();
+ if (g.height != g2.height) abort();
+ XCharStruct_to_XmbRectangle (overall, r);
+ XmbRectangle_to_XCharStruct (r, c, c.width);
+ if (c.lbearing != overall.lbearing) abort();
+ if (c.rbearing != overall.rbearing) abort();
+ if (c.ascent != overall.ascent) abort();
+ if (c.descent != overall.descent) abort();
+ if (c.width != overall.width) abort();
+ }
+
+ txt[0] = s->debug_metrics_p;
+ txt[1] = 0;
+
+ /* Convert Unicode code point to UTF-8. */
+ utxt[utf8_encode(s->debug_metrics_p, utxt, 4)] = 0;
+
+ txt3 = utf8_to_XChar2b (utxt, 0);
+
+ if (! s->metrics_font1)
+ s->metrics_font1 = XLoadQueryFont (s->dpy, fn);
+ if (! s->metrics_font2)
+ s->metrics_font2 = XLoadQueryFont (s->dpy, "fixed");
+ if (! s->metrics_font1)
+ s->metrics_font1 = s->metrics_font2;
+
+ gc = XCreateGC (s->dpy, dest, 0, 0);
+ XSetFont (s->dpy, gc, s->metrics_font1->fid);
+
+# if defined(HAVE_JWXYZ)
+ jwxyz_XSetAntiAliasing (s->dpy, gc, False);
+# endif
+
+ if (! s->metrics_xftfont)
+ {
+ s->metrics_xftfont =
+ XftFontOpenXlfd (s->dpy, screen_number(s->xgwa.screen), fn);
+ if (! s->metrics_xftfont)
+ {
+ const char *fn2 = "fixed";
+ s->metrics_xftfont =
+ XftFontOpenName (s->dpy, screen_number(s->xgwa.screen), fn2);
+ if (s->metrics_xftfont)
+ fn = fn2;
+ else
+ {
+ fprintf (stderr, "%s: XftFontOpen failed on \"%s\" and \"%s\"\n",
+ progname, fn, fn2);
+ exit (1);
+ }
+ }
+ }
+
+ strcpy (fn2, fn);
+# ifdef HAVE_JWXYZ
+ append_font_name (s->dpy, fn2, s->metrics_xftfont->xfont);
+# endif
+
+ xftdraw = XftDrawCreate (s->dpy, dest, s->xgwa.visual,
+ s->xgwa.colormap);
+ XftColorAllocName (s->dpy, s->xgwa.visual, s->xgwa.colormap, "white",
+ &xftcolor);
+ XftTextExtentsUtf8 (s->dpy, s->metrics_xftfont,
+ (FcChar8 *) utxt, strlen(utxt),
+ &extents);
+
+
+ XTextExtents (s->metrics_font1, txt, strlen(txt),
+ &dir, &ascent, &descent, &overall);
+ c = ((s->debug_metrics_p >= s->metrics_font1->min_char_or_byte2 &&
+ s->debug_metrics_p <= s->metrics_font1->max_char_or_byte2)
+ ? s->metrics_font1->per_char[s->debug_metrics_p -
+ s->metrics_font1->min_char_or_byte2]
+ : overall);
+
+ XSetForeground (s->dpy, gc, BlackPixelOfScreen (s->xgwa.screen));
+ XFillRectangle (s->dpy, dest, gc, 0, 0, s->xgwa.width, s->xgwa.height);
+
+ XSetForeground (s->dpy, gc, WhitePixelOfScreen (s->xgwa.screen));
+ XSetFont (s->dpy, gc, s->metrics_font2->fid);
+ XDrawString (s->dpy, dest, gc,
+ s->xgwa.width / 2,
+ s->xgwa.height - 5,
+ fn2, strlen(fn2));
+
+# ifdef HAVE_JWXYZ
+ {
+ char *name = jwxyz_unicode_character_name (
+ s->dpy, s->metrics_font1->fid, s->debug_metrics_p);
+ if (!name || !*name) name = strdup("unknown character name");
+ XDrawString (s->dpy, dest, gc,
+ 10,
+ 10 + 2 * (s->metrics_font2->ascent +
+ s->metrics_font2->descent),
+ name, strlen(name));
+ free (name);
+ }
+# endif
+
+ /* i 0, j 0: top left, XDrawString, char metrics
+ i 1, j 0: bot left, XDrawString, overall metrics, ink escape
+ i 0, j 1: top right, XftDrawStringUtf8, utf8 metrics
+ i 1, j 1: bot right, XDrawString16, 16 metrics, ink escape
+ */
+ for (j = 0; j < 2; j++) {
+ Bool xft_p = (j != 0);
+ int ww = s->xgwa.width / 2 - 20;
+ int xoff = (j == 0 ? 0 : ww + 20);
+
+ /* XDrawString only does 8-bit characters, so skip it outside Latin-1. */
+ if (s->debug_metrics_p >= 256)
+ {
+ if (!xft_p)
+ continue;
+ xoff = 0;
+ ww = s->xgwa.width;
+ }
+
+ x = (ww - overall.width) / 2;
+
+ for (i = 0; i < 2; i++)
+ {
+ XCharStruct cc;
+ int x1 = xoff + ww * 0.18;
+ int x2 = xoff + ww * 0.82;
+ int x3 = xoff + ww;
+ int pixw, pixh;
+ Pixmap p;
+
+ y = 80;
+ {
+ int h = sc * (ascent + descent);
+ int min = (ascent + descent) * 4;
+ if (h < min) h = min;
+ if (i == 1) h *= 3;
+ y += h;
+ }
+
+ memset (&fake_c, 0, sizeof(fake_c));
+
+ if (!xft_p && i == 0)
+ cc = c;
+ else if (!xft_p && i == 1)
+ cc = overall;
+ else if (xft_p && i == 0)
+ {
+ /* Measure the glyph in the Xft way */
+ XGlyphInfo extents;
+ XftTextExtentsUtf8 (s->dpy,
+ s->metrics_xftfont,
+ (FcChar8 *) utxt, strlen(utxt),
+ &extents);
+ XGlyphInfo_to_XCharStruct (extents, fake_c);
+ cc = fake_c;
+ }
+ else if (xft_p)
+ {
+ /* Measure the glyph in the 16-bit way */
+ int dir, ascent, descent;
+ XTextExtents16 (s->metrics_font1, txt3, 1, &dir, &ascent, &descent,
+ &fake_c);
+ cc = fake_c;
+ }
+
+ pixw = margin * 2 + cc.rbearing - cc.lbearing;
+ pixh = margin * 2 + cc.ascent + cc.descent;
+ p = (pixw > 0 && pixh > 0
+ ? XCreatePixmap (s->dpy, dest, pixw, pixh, s->xgwa.depth)
+ : 0);
+
+ if (p)
+ {
+ Pixmap p2;
+ GC gc2 = XCreateGC (s->dpy, p, 0, 0);
+# ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (s->dpy, gc2, False);
+# endif
+ XSetFont (s->dpy, gc2, s->metrics_font1->fid);
+ XSetForeground (s->dpy, gc2, BlackPixelOfScreen (s->xgwa.screen));
+ XFillRectangle (s->dpy, p, gc2, 0, 0, pixw, pixh);
+ XSetForeground (s->dpy, gc, WhitePixelOfScreen (s->xgwa.screen));
+ XSetForeground (s->dpy, gc2, WhitePixelOfScreen (s->xgwa.screen));
+# ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (s->dpy, gc2,
+ s->debug_metrics_antialiasing_p);
+# endif
+
+ if (xft_p && i == 0)
+ {
+ XftDraw *xftdraw2 = XftDrawCreate (s->dpy, p, s->xgwa.visual,
+ s->xgwa.colormap);
+ XftDrawStringUtf8 (xftdraw2, &xftcolor,
+ s->metrics_xftfont,
+ -cc.lbearing + margin,
+ cc.ascent + margin,
+ (FcChar8 *) utxt, strlen(utxt));
+ XftDrawDestroy (xftdraw2);
+ }
+ else if (xft_p)
+ XDrawString16 (s->dpy, p, gc2,
+ -cc.lbearing + margin,
+ cc.ascent + margin,
+ txt3, 1);
+ else
+ XDrawString (s->dpy, p, gc2,
+ -cc.lbearing + margin,
+ cc.ascent + margin,
+ txt, strlen(txt));
+
+ {
+ unsigned x2, y2;
+ XImage *img = XGetImage (s->dpy, p, 0, 0, pixw, pixh,
+ ~0L, ZPixmap);
+ XImage *img2;
+
+ if (i == 1)
+ {
+ unsigned w = pixw - margin * 2, h = pixh - margin * 2;
+
+ if (margin > 0)
+ {
+ /* Check for ink escape. */
+ unsigned long ink = 0;
+ for (y2 = 0; y2 != pixh; ++y2)
+ for (x2 = 0; x2 != pixw; ++x2)
+ {
+ /* Sloppy... */
+ if (! (x2 >= margin &&
+ x2 < pixw - margin &&
+ y2 >= margin &&
+ y2 < pixh - margin))
+ ink |= XGetPixel (img, x2, y2);
+ }
+
+ if (ink & 0xFFFFFF)
+ {
+ XSetFont (s->dpy, gc, s->metrics_font2->fid);
+ XDrawString (s->dpy, dest, gc,
+ xoff + 10, 40,
+ "Ink escape!", 11);
+ }
+ }
+
+ /* ...And wasted space. */
+ if (w && h)
+ {
+ if (check_edge (s->dpy, dest, gc, 120, 60, "left",
+ img, margin, margin, 1, h) |
+ check_edge (s->dpy, dest, gc, 160, 60, "right",
+ img, margin + w - 1, margin, 1, h) |
+ check_edge (s->dpy, dest, gc, 200, 60, "top",
+ img, margin, margin, 0, w) |
+ check_edge (s->dpy, dest, gc, 240, 60, "bottom",
+ img, margin, margin + h - 1, 0, w))
+ {
+ XSetFont (s->dpy, gc, s->metrics_font2->fid);
+ XDrawString (s->dpy, dest, gc,
+ xoff + 10, 60,
+ "Wasted space: ", 14);
+ }
+ }
+ }
+
+ if (s->debug_metrics_antialiasing_p)
+ {
+ /* Draw a dark cyan boundary around antialiased glyphs */
+ img2 = XCreateImage (s->dpy, s->xgwa.visual, img->depth,
+ ZPixmap, 0, NULL,
+ img->width, img->height,
+ img->bitmap_pad, 0);
+ img2->data = malloc (img->bytes_per_line * img->height);
+
+ for (y2 = 0; y2 != pixh; ++y2)
+ for (x2 = 0; x2 != pixw; ++x2)
+ {
+ unsigned long px = XGetPixel (img, x2, y2);
+ if ((px & 0xffffff) == 0)
+ {
+ unsigned long neighbors = 0;
+ if (x2)
+ neighbors |= XGetPixel (img, x2 - 1, y2);
+ if (x2 != pixw - 1)
+ neighbors |= XGetPixel (img, x2 + 1, y2);
+ if (y2)
+ neighbors |= XGetPixel (img, x2, y2 - 1);
+ if (y2 != pixh - 1)
+ neighbors |= XGetPixel (img, x2, y2 + 1);
+ XPutPixel (img2, x2, y2,
+ (neighbors & 0xffffff
+ ? cyan
+ : BlackPixelOfScreen (s->xgwa.screen)));
+ }
+ else
+ {
+ XPutPixel (img2, x2, y2, px);
+ }
+ }
+ }
+ else
+ {
+ img2 = img;
+ img = NULL;
+ }
+
+ p2 = scale_ximage (s->xgwa.screen, s->window, img2, sc, margin);
+ if (img)
+ XDestroyImage (img);
+ XDestroyImage (img2);
+ }
+
+ XCopyArea (s->dpy, p2, dest, gc,
+ 0, 0, sc*pixw, sc*pixh,
+ xoff + x + sc * (cc.lbearing - margin),
+ y - sc * (cc.ascent + margin));
+ XFreePixmap (s->dpy, p);
+ XFreePixmap (s->dpy, p2);
+ XFreeGC (s->dpy, gc2);
+ }
+
+ if (i == 0)
+ {
+ XSetFont (s->dpy, gc, s->metrics_font1->fid);
+ XSetForeground (s->dpy, gc, WhitePixelOfScreen (s->xgwa.screen));
+# ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (s->dpy, gc, s->debug_metrics_antialiasing_p);
+# endif
+ sprintf (txt2, "%s [XX%sXX] [%s%s%s%s]",
+ (xft_p ? utxt : txt),
+ (xft_p ? utxt : txt),
+ (xft_p ? utxt : txt),
+ (xft_p ? utxt : txt),
+ (xft_p ? utxt : txt),
+ (xft_p ? utxt : txt));
+
+ if (xft_p)
+ XftDrawStringUtf8 (xftdraw, &xftcolor,
+ s->metrics_xftfont,
+ xoff + x/2 + (sc*cc.rbearing/2) - cc.rbearing/2
+ + 40,
+ ascent + 10,
+ (FcChar8 *) txt2, strlen(txt2));
+ else
+ XDrawString (s->dpy, dest, gc,
+ xoff + x/2 + (sc*cc.rbearing/2) - cc.rbearing/2,
+ ascent + 10,
+ txt2, strlen(txt2));
+# ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (s->dpy, gc, False);
+# endif
+ XSetFont (s->dpy, gc, s->metrics_font2->fid);
+ if (xft_p)
+ {
+ char *uptr;
+ char *tptr = txt2 + sprintf(txt2, "U+%04lX", s->debug_metrics_p);
+ *tptr++ = " ?_"[s->entering_unicode_p];
+ *tptr++ = ' ';
+
+ uptr = utxt;
+ while (*uptr)
+ {
+ tptr += sprintf (tptr, "0%03o ", (unsigned char) *uptr);
+ ++uptr;
+ }
+ *tptr++ = ' ';
+ uptr = utxt;
+ while (*uptr)
+ {
+ tptr += sprintf (tptr, "%02x ", (unsigned char) *uptr);
+ ++uptr;
+ }
+ }
+ else
+ sprintf (txt2, "%c %3ld 0%03lo 0x%02lx%s",
+ (char)s->debug_metrics_p, s->debug_metrics_p,
+ s->debug_metrics_p, s->debug_metrics_p,
+ (txt[0] < s->metrics_font1->min_char_or_byte2
+ ? " *" : ""));
+ XDrawString (s->dpy, dest, gc,
+ xoff + 10, 20,
+ txt2, strlen(txt2));
+ }
+
+# ifdef HAVE_JWXYZ
+ jwxyz_XSetAntiAliasing (s->dpy, gc, True);
+# endif
+
+ {
+ const char *ss = (j == 0
+ ? (i == 0 ? "char" : "overall")
+ : (i == 0 ? "utf8" : "16 bit"));
+ XSetFont (s->dpy, gc, s->metrics_font2->fid);
+
+ XSetForeground (s->dpy, gc, red);
+
+ sprintf (txt2, "%s ascent %d", ss, ascent);
+ XDrawString (s->dpy, dest, gc,
+ xoff + 10,
+ y - sc*ascent - 2,
+ txt2, strlen(txt2));
+ XDrawLine (s->dpy, dest, gc,
+ xoff, y - sc*ascent,
+ x3, y - sc*ascent);
+
+ sprintf (txt2, "%s descent %d", ss, descent);
+ XDrawString (s->dpy, dest, gc,
+ xoff + 10,
+ y + sc*descent - 2,
+ txt2, strlen(txt2));
+ XDrawLine (s->dpy, dest, gc,
+ xoff, y + sc*descent,
+ x3, y + sc*descent);
+ }
+
+
+ /* ascent, descent, baseline */
+
+ XSetForeground (s->dpy, gc, green);
+
+ sprintf (txt2, "ascent %d", cc.ascent);
+ if (cc.ascent != 0)
+ XDrawString (s->dpy, dest, gc,
+ x1, y - sc*cc.ascent - 2,
+ txt2, strlen(txt2));
+ XDrawLine (s->dpy, dest, gc,
+ x1, y - sc*cc.ascent,
+ x2, y - sc*cc.ascent);
+
+ sprintf (txt2, "descent %d", cc.descent);
+ if (cc.descent != 0)
+ XDrawString (s->dpy, dest, gc,
+ x1, y + sc*cc.descent - 2,
+ txt2, strlen(txt2));
+ XDrawLine (s->dpy, dest, gc,
+ x1, y + sc*cc.descent,
+ x2, y + sc*cc.descent);
+
+ XSetForeground (s->dpy, gc, yellow);
+ strcpy (txt2, "baseline");
+ XDrawString (s->dpy, dest, gc,
+ x1, y - 2,
+ txt2, strlen(txt2));
+ XDrawLine (s->dpy, dest, gc, x1, y, x2, y);
+
+
+ /* origin, width */
+
+ XSetForeground (s->dpy, gc, blue);
+
+ strcpy (txt2, "origin");
+ XDrawString (s->dpy, dest, gc,
+ xoff + x + 2,
+ y + sc*descent + 50,
+ txt2, strlen(txt2));
+ XDrawLine (s->dpy, dest, gc,
+ xoff + x, y - sc*(ascent - 10),
+ xoff + x, y + sc*(descent + 10));
+
+ sprintf (txt2, "width %d", cc.width);
+ XDrawString (s->dpy, dest, gc,
+ xoff + x + sc*cc.width + 2,
+ y + sc*descent + 60,
+ txt2, strlen(txt2));
+ XDrawLine (s->dpy, dest, gc,
+ xoff + x + sc*cc.width, y - sc*(ascent - 10),
+ xoff + x + sc*cc.width, y + sc*(descent + 10));
+
+
+ /* lbearing, rbearing */
+
+ XSetForeground (s->dpy, gc, green);
+
+ sprintf (txt2, "lbearing %d", cc.lbearing);
+ XDrawString (s->dpy, dest, gc,
+ xoff + x + sc*cc.lbearing + 2,
+ y + sc * descent + 30,
+ txt2, strlen(txt2));
+ XDrawLine (s->dpy, dest, gc,
+ xoff + x + sc*cc.lbearing, y - sc*ascent,
+ xoff + x + sc*cc.lbearing, y + sc*descent + 20);
+
+ sprintf (txt2, "rbearing %d", cc.rbearing);
+ XDrawString (s->dpy, dest, gc,
+ xoff + x + sc*cc.rbearing + 2,
+ y + sc * descent + 40,
+ txt2, strlen(txt2));
+ XDrawLine (s->dpy, dest, gc,
+ xoff + x + sc*cc.rbearing, y - sc*ascent,
+ xoff + x + sc*cc.rbearing, y + sc*descent + 40);
+
+ /* y += sc * (ascent + descent) * 2; */
+ }
+ }
+
+ if (dest != s->window)
+ XCopyArea (s->dpy, dest, s->window, s->bg_gc,
+ 0, 0, s->xgwa.width, s->xgwa.height, 0, 0);
+
+ XFreeGC (s->dpy, gc);
+ XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap, &xftcolor);
+ XftDrawDestroy (xftdraw);
+ free (txt3);
+
+ return s->frame_delay;
+}
+
+# endif /* DEBUG */
+
+
+/* Render all the words to the screen, and run the animation one step.
+ Clear screen first, swap buffers after.
+ */
+static unsigned long
+fontglide_draw (Display *dpy, Window window, void *closure)
+{
+ state *s = (state *) closure;
+ int i;
+
+# ifdef DEBUG
+ if (s->debug_metrics_p)
+ return fontglide_draw_metrics (closure);
+# endif /* DEBUG */
+
+ if (s->spawn_p)
+ more_sentences (s);
+
+ if (!s->trails_p)
+ XFillRectangle (s->dpy, s->b, s->bg_gc,
+ 0, 0, s->xgwa.width, s->xgwa.height);
+
+ for (i = 0; i < s->nsentences; i++)
+ draw_sentence (s, s->sentences[i]);
+
+# ifdef DEBUG
+ if (s->debug_p && (s->prev_font_name || s->next_font_name))
+ {
+ if (! s->label_gc)
+ {
+ if (! s->metrics_font2)
+ s->metrics_font2 = XLoadQueryFont (s->dpy, "fixed");
+ s->label_gc = XCreateGC (dpy, s->b, 0, 0);
+ XSetFont (s->dpy, s->label_gc, s->metrics_font2->fid);
+ }
+ if (s->prev_font_name)
+ XDrawString (s->dpy, s->b, s->label_gc,
+ 10, 10 + s->metrics_font2->ascent,
+ s->prev_font_name, strlen(s->prev_font_name));
+ if (s->next_font_name)
+ XDrawString (s->dpy, s->b, s->label_gc,
+ 10, 10 + s->metrics_font2->ascent * 2,
+ s->next_font_name, strlen(s->next_font_name));
+ }
+# endif /* DEBUG */
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (s->backb)
+ {
+ XdbeSwapInfo info[1];
+ info[0].swap_window = s->window;
+ info[0].swap_action = (s->dbeclear_p ? XdbeBackground : XdbeUndefined);
+ XdbeSwapBuffers (s->dpy, info, 1);
+ }
+ else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ if (s->dbuf)
+ {
+ XCopyArea (s->dpy, s->b, s->window, s->bg_gc,
+ 0, 0, s->xgwa.width, s->xgwa.height, 0, 0);
+ }
+
+ return s->frame_delay;
+}
+
+
+
+/* When the subprocess has generated some output, this reads as much as it
+ can into s->buf at s->buf_tail.
+ */
+static void
+drain_input (state *s)
+{
+ while (s->buf_tail < sizeof(s->buf) - 2)
+ {
+ int c = textclient_getc (s->tc);
+ if (c > 0)
+ s->buf[s->buf_tail++] = (char) c;
+ else
+ break;
+ }
+}
+
+
+/* Window setup and resource loading */
+
+static void *
+fontglide_init (Display *dpy, Window window)
+{
+ XGCValues gcv;
+ state *s = (state *) calloc (1, sizeof(*s));
+ s->dpy = dpy;
+ s->window = window;
+ s->frame_delay = get_integer_resource (dpy, "delay", "Integer");
+
+ XGetWindowAttributes (s->dpy, s->window, &s->xgwa);
+
+ s->font_override = get_string_resource (dpy, "font", "Font");
+ if (s->font_override && (!*s->font_override || *s->font_override == '('))
+ s->font_override = 0;
+
+ s->charset = get_string_resource (dpy, "fontCharset", "FontCharset");
+ s->border_width = get_integer_resource (dpy, "fontBorderWidth", "Integer");
+ if (s->border_width < 0 || s->border_width > 20)
+ s->border_width = 1;
+
+ s->speed = get_float_resource (dpy, "speed", "Float");
+ if (s->speed <= 0 || s->speed > 200)
+ s->speed = 1;
+
+ s->linger = get_float_resource (dpy, "linger", "Float");
+ if (s->linger <= 0 || s->linger > 200)
+ s->linger = 1;
+
+ s->trails_p = get_boolean_resource (dpy, "trails", "Trails");
+
+# ifdef DEBUG
+ s->debug_p = get_boolean_resource (dpy, "debug", "Debug");
+ s->debug_metrics_p = (get_boolean_resource (dpy, "debugMetrics", "Debug")
+ ? 199 : 0);
+ s->debug_scale = 6;
+
+# ifdef HAVE_JWXYZ
+ if (s->debug_metrics_p && !s->font_override)
+ s->font_override = "Helvetica Bold 16";
+# endif
+
+# endif /* DEBUG */
+
+ s->dbuf = get_boolean_resource (dpy, "doubleBuffer", "Boolean");
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ s->dbuf = False;
+# endif
+
+# ifdef DEBUG
+ if (s->debug_metrics_p) s->trails_p = False;
+# endif /* DEBUG */
+
+ if (s->trails_p) s->dbuf = False; /* don't need it in this case */
+
+ {
+ const char *ss = get_string_resource (dpy, "mode", "Mode");
+ if (!ss || !*ss || !strcasecmp (ss, "random"))
+ s->mode = ((random() % 2) ? SCROLL : PAGE);
+ else if (!strcasecmp (ss, "scroll"))
+ s->mode = SCROLL;
+ else if (!strcasecmp (ss, "page"))
+ s->mode = PAGE;
+ else if (!strcasecmp (ss, "chars") || !strcasecmp (ss, "char"))
+ s->mode = CHARS;
+ else
+ {
+ fprintf (stderr,
+ "%s: `mode' must be `scroll', `page', or `random', not `%s'\n",
+ progname, ss);
+ }
+ }
+
+ if (s->dbuf)
+ {
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ s->dbeclear_p = get_boolean_resource (dpy, "useDBEClear", "Boolean");
+ if (s->dbeclear_p)
+ s->b = xdbe_get_backbuffer (dpy, window, XdbeBackground);
+ else
+ s->b = xdbe_get_backbuffer (dpy, window, XdbeUndefined);
+ s->backb = s->b;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+ if (!s->b)
+ {
+ s->ba = XCreatePixmap (s->dpy, s->window,
+ s->xgwa.width, s->xgwa.height,
+ s->xgwa.depth);
+ s->b = s->ba;
+ }
+ }
+ else
+ {
+ s->b = s->window;
+ }
+
+ gcv.foreground = get_pixel_resource (s->dpy, s->xgwa.colormap,
+ "background", "Background");
+ s->bg_gc = XCreateGC (s->dpy, s->b, GCForeground, &gcv);
+
+ s->nsentences = 5; /* #### */
+ s->sentences = (sentence **) calloc (s->nsentences, sizeof (sentence *));
+ s->spawn_p = True;
+
+ s->early_p = True;
+ s->start_time = time ((time_t *) 0);
+ s->tc = textclient_open (dpy);
+
+ return s;
+}
+
+
+static Bool
+fontglide_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+# ifdef DEBUG
+ state *s = (state *) closure;
+
+ if (! s->debug_metrics_p)
+ return False;
+ if (event->xany.type == KeyPress)
+ {
+ static const unsigned long max = 0x110000;
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+
+ if (s->entering_unicode_p > 0)
+ {
+ unsigned digit;
+ unsigned long new_char = 0;
+
+ if (c >= 'a' && c <= 'f')
+ digit = c + 0xa - 'a';
+ else if (c >= 'A' && c <= 'F')
+ digit = c + 0xa - 'A';
+ else if (c >= '0' && c <= '9')
+ digit = c + 0 - '0';
+ else
+ {
+ s->entering_unicode_p = 0;
+ return True;
+ }
+
+ if (s->entering_unicode_p == 1)
+ new_char = 0;
+ else if (s->entering_unicode_p == 2)
+ new_char = s->debug_metrics_p;
+
+ new_char = (new_char << 4) | digit;
+ if (new_char > 0 && new_char < max)
+ {
+ s->debug_metrics_p = new_char;
+ s->entering_unicode_p = 2;
+ }
+ else
+ s->entering_unicode_p = 0;
+ return True;
+ }
+
+ if (c == '\t')
+ s->debug_metrics_antialiasing_p ^= True;
+ else if (c == 3 || c == 27)
+ exit (0);
+ else if (c >= ' ')
+ s->debug_metrics_p = (unsigned char) c;
+ else if (keysym == XK_Left || keysym == XK_Right)
+ {
+ s->debug_metrics_p += (keysym == XK_Left ? -1 : 1);
+ if (s->debug_metrics_p >= max)
+ s->debug_metrics_p = 1;
+ else if (s->debug_metrics_p <= 0)
+ s->debug_metrics_p = max - 1;
+ return True;
+ }
+ else if (keysym == XK_Prior)
+ s->debug_metrics_p = (s->debug_metrics_p + max - 0x80) % max;
+ else if (keysym == XK_Next)
+ s->debug_metrics_p = (s->debug_metrics_p + 0x80) % max;
+ else if (keysym == XK_Up)
+ s->debug_scale++;
+ else if (keysym == XK_Down)
+ s->debug_scale = (s->debug_scale > 1 ? s->debug_scale-1 : 1);
+ else if (keysym == XK_F1)
+ s->entering_unicode_p = 1;
+ else
+ return False;
+ return True;
+ }
+# endif /* DEBUG */
+
+ return False;
+}
+
+
+static void
+fontglide_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ state *s = (state *) closure;
+ XGetWindowAttributes (s->dpy, s->window, &s->xgwa);
+
+ if (s->dbuf && s->ba)
+ {
+ XFreePixmap (s->dpy, s->ba);
+ s->ba = XCreatePixmap (s->dpy, s->window,
+ s->xgwa.width, s->xgwa.height,
+ s->xgwa.depth);
+ XFillRectangle (s->dpy, s->ba, s->bg_gc, 0, 0,
+ s->xgwa.width, s->xgwa.height);
+ s->b = s->ba;
+ }
+}
+
+static void
+fontglide_free (Display *dpy, Window window, void *closure)
+{
+ state *s = (state *) closure;
+ textclient_close (s->tc);
+
+#ifdef DEBUG
+ if (s->metrics_xftfont)
+ XftFontClose (s->dpy, s->metrics_xftfont);
+ if (s->metrics_font1)
+ XFreeFont (s->dpy, s->metrics_font1);
+ if (s->metrics_font2 && s->metrics_font1 != s->metrics_font2)
+ XFreeFont (s->dpy, s->metrics_font2);
+ if (s->prev_font_name) free (s->prev_font_name);
+ if (s->next_font_name) free (s->next_font_name);
+ if (s->label_gc) XFreeGC (dpy, s->label_gc);
+#endif
+
+ /* #### there's more to free here */
+
+ free (s);
+}
+
+
+static const char *fontglide_defaults [] = {
+ ".background: #000000",
+ ".foreground: #DDDDDD",
+ ".borderColor: #555555",
+ "*delay: 10000",
+ "*program: xscreensaver-text",
+ "*usePty: false",
+ "*mode: random",
+ ".font: (default)",
+
+ /* I'm not entirely clear on whether the charset of an XLFD has any
+ meaning when Xft is being used. */
+ "*fontCharset: iso8859-1",
+/*"*fontCharset: iso10646-1", */
+/*"*fontCharset: *-*",*/
+
+ "*fontBorderWidth: 2",
+ "*speed: 1.0",
+ "*linger: 1.0",
+ "*trails: False",
+# ifdef DEBUG
+ "*debug: False",
+ "*debugMetrics: False",
+# endif /* DEBUG */
+ "*doubleBuffer: True",
+# ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ "*useDBE: True",
+ "*useDBEClear: True",
+# endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ 0
+};
+
+static XrmOptionDescRec fontglide_options [] = {
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-scroll", ".mode", XrmoptionNoArg, "scroll" },
+ { "-page", ".mode", XrmoptionNoArg, "page" },
+ { "-random", ".mode", XrmoptionNoArg, "random" },
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-linger", ".linger", XrmoptionSepArg, 0 },
+ { "-program", ".program", XrmoptionSepArg, 0 },
+ { "-font", ".font", XrmoptionSepArg, 0 },
+ { "-fn", ".font", XrmoptionSepArg, 0 },
+ { "-bw", ".fontBorderWidth", XrmoptionSepArg, 0 },
+ { "-trails", ".trails", XrmoptionNoArg, "True" },
+ { "-no-trails", ".trails", XrmoptionNoArg, "False" },
+ { "-db", ".doubleBuffer", XrmoptionNoArg, "True" },
+ { "-no-db", ".doubleBuffer", XrmoptionNoArg, "False" },
+# ifdef DEBUG
+ { "-debug", ".debug", XrmoptionNoArg, "True" },
+ { "-debug-metrics", ".debugMetrics", XrmoptionNoArg, "True" },
+# endif /* DEBUG */
+ { 0, 0, 0, 0 }
+};
+
+
+XSCREENSAVER_MODULE ("FontGlide", fontglide)
diff --git a/hacks/fontglide.man b/hacks/fontglide.man
new file mode 100644
index 0000000..f60d20d
--- /dev/null
+++ b/hacks/fontglide.man
@@ -0,0 +1,124 @@
+.TH XScreenSaver 1 "30-Oct-99" "X Version 11"
+.SH NAME
+fontglide - characters float onto the screen to form words
+.SH SYNOPSIS
+.B fontglide
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIusecs\fP]
+[\-scroll\fP]
+[\-page\fP]
+[\-random\fP]
+[\-speed \fIfloat\fP]
+[\-linger \fIfloat\fP]
+[\-program \fIsh-command\fP]
+[\-font \fIfont-name\fP]
+[\-bw \fIint\fP]
+[\-trails]
+[\-db]
+[\-debug]
+[\-fps]
+.SH DESCRIPTION
+The \fIfontglide\fP program reads text from a subprocess and puts it on
+the screen using large characters that glide in from the edges,
+assemble, then disperse. Alternately, it can simply scroll whole
+sentences from right to left.
+.SH OPTIONS
+.I fontglide
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIusecs\fP
+The delay between steps of the animation, in microseconds: default 10000.
+.TP 8
+.B \-page
+With this option, a page full of text will glide in, and disperse.
+.TP 8
+.B \-scroll
+With this option, sentences will scroll by from right to left.
+.TP 8
+.B \-random
+The default is to pick randomly between \fI\-page\fP and \fI\-scroll\fP.
+.TP 8
+.B \-speed \fIfloat\fP
+How fast to animate; 2 means twice as fast, 0.5 means half as fast.
+Default 1.0.
+.TP 8
+.B \-linger \fIfloat\fP
+How long to leave the assembled text on the screen in \fI\-page\fP mode;
+2 means twice as long, 0.5 means half as long. Default 1.0. (The more
+words there are on the screen, the longer it lingers.)
+.TP 8
+.B \-program \fIsh-command\fP
+The command to run to generate the text to display. This option may be
+any string acceptable to /bin/sh. The program will be run at the end of
+a pipe, and any words that it prints to \fIstdout\fP will end up on
+the window. (Whitespace and line breaks are ignored.) If the program
+exits, it will be launched again after we have processed all the text
+it produced. Default:
+.BR xscreensaver-text (1).
+.TP 8
+.B \-font\fP \fIstring\fP
+The base font pattern to use when loading fonts. The default is to search
+for any Latin1 scalable proportional fonts on the system. Once a base font
+is selected, it will be loaded in a random size.
+.TP 8
+.B \-bw \fIint\fP
+How thick an outline to draw around the characters. Default 2 pixels.
+.TP 8
+.B \-trails\fP
+Leave "vapor trails" behind the moving text. Default off.
+.TP 8
+.B \-no-db\fP
+Turn off double-buffering. It may be faster, but will flicker.
+.TP 8
+.B \-debug\fP
+Draw some boxes showing character metrics, and print the name of the
+current font to stderr.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR xscreensaver (1),
+.BR xscreensaver-text (1),
+.BR fortune (1),
+.BR phosphor (MANSUFFIX),
+.BR apple2 (MANSUFFIX),
+.BR starwars (MANSUFFIX),
+.BR ljlatest (MANSUFFIX),
+.BR dadadodo (1),
+.BR webcollage (MANSUFFIX),
+.BR driftnet (1)
+.BR EtherPEG ,
+.BR EtherPeek
+.SH COPYRIGHT
+Copyright \(co 2003 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 15-Sep-2003.
diff --git a/hacks/forest.c b/hacks/forest.c
new file mode 100644
index 0000000..38a480d
--- /dev/null
+++ b/hacks/forest.c
@@ -0,0 +1,244 @@
+/* forest.c (aka xtree.c), Copyright (c) 1999
+ * Peter Baumung <unn6@rz.uni-karlsruhe.de>
+ *
+ * Most code taken from
+ * xscreensaver, Copyright (c) 1992, 1995, 1997
+ * Jamie Zawinski <jwz@netscape.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+/* ****************************** NOTE ******************************
+
+ This is not the xlockmore version of forest, but a much better
+ looking rewrite. Be careful not to delete it in a merging frenzy...
+
+ **********************************************************************
+ */
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 500000 \n" \
+ "*ncolors: 20 \n" \
+ "*fpsSolid: true \n" \
+
+# include "xlockmore.h" /* from the xscreensaver distribution */
+# define free_trees 0
+# define release_trees 0
+# define reshape_trees 0
+# define trees_handle_event 0
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+ENTRYPOINT ModeSpecOpt trees_opts = {0, NULL, 0, NULL, NULL};
+
+typedef struct {
+ int x;
+ int y;
+ int thick;
+ double size;
+ long color;
+ int toDo;
+ int pause;
+ int season;
+} treestruct;
+
+static treestruct *trees = NULL;
+
+static XColor colors[20];
+static int color;
+
+static long colorM[12] = {0xff0000, 0xff8000, 0xffff00, 0x80ff00,
+ 0x00ff00, 0x00ff80, 0x00ffff, 0x0080ff,
+ 0x0000ff, 0x8000ff, 0xff00ff, 0xff0080};
+
+static long colorV[12] = {0x0a0000, 0x0a0500, 0x0a0a00, 0x050a00,
+ 0x000a00, 0x000a05, 0x000a0a, 0x00050a,
+ 0x00000a, 0x05000a, 0x0a000a, 0x0a0005};
+
+ENTRYPOINT void
+init_trees(ModeInfo * mi)
+{
+ treestruct *tree;
+ Display *display = MI_DISPLAY(mi);
+ GC gc = MI_GC(mi);
+ int i;
+
+ if (trees == NULL) {
+
+ if (mi->npixels > 20) {
+ printf("%d colors selected. Setting limit to 20...\n", mi->npixels);
+ mi->npixels = 20;
+ }
+
+ if (mi->npixels < 4) {
+ for (i = 0; i < mi->npixels; i++) {
+ colors[i].red = 65535 * (i & 1);
+ colors[i].green = 65535 * (i & 1);
+ colors[i].blue = 65535 * (i & 1);
+ colors[i].flags = DoRed | DoGreen | DoBlue;
+ }
+ } else {
+ if (mi->npixels < 8) {
+ for (i = 0; i < mi->npixels; i++) {
+ colors[i].red = 32768 + 4096 * (i % 4);
+ colors[i].green = 32768 + 4096 * (i % 4);
+ colors[i].blue = 32768 + 4096 * (i % 4);
+ colors[i].flags = DoRed | DoGreen | DoBlue;
+ }
+ } else {
+ for (i = 0; i < mi->npixels; i++) {
+ colors[i].red = 24576 + 4096 * (i % 4);
+ colors[i].green = 10240 + 2048 * (i % 4);
+ colors[i].blue = 0;
+ colors[i].flags = DoRed | DoGreen | DoBlue;
+ }
+ }
+ }
+
+ for (i = 0; i < mi->npixels; i++)
+ if (!XAllocColor(display, mi->xgwa.colormap, &colors[i])) break;
+ color = i;
+
+ XSetForeground(display, gc, colors[1].pixel);
+ }
+
+ MI_INIT (mi, trees);
+
+ XClearWindow(display, MI_WINDOW(mi));
+ XSetLineAttributes(display, gc, 2, LineSolid, CapButt, JoinMiter);
+ tree = &trees[MI_SCREEN(mi)];
+ tree->toDo = 25;
+ tree->season = NRAND(12);
+
+ for (i = 4; i < mi->npixels; i++) {
+ int sIndex = (tree->season + (i-4) / 4) % 12;
+ long color = colorM[sIndex] - 2 * colorV[sIndex] * (i % 4);
+ colors[i].red = (color & 0xff0000) / 256;
+ colors[i].green = (color & 0x00ff00);
+ colors[i].blue = (color & 0x0000ff) * 256;
+ colors[i].flags = DoRed | DoGreen | DoBlue;
+ }
+
+ for (i = 0; i < mi->npixels; i++)
+ if (!XAllocColor(display, mi->xgwa.colormap, &colors[i])) break;
+
+ color = i;
+}
+
+static double rRand(double a, double b)
+{
+ return (a+(b-a)*NRAND(10001)/10000.0);
+}
+
+static void draw_line(ModeInfo * mi,
+ int x1, int y1, int x2, int y2,
+ double angle, int widths, int widthe)
+{
+
+ Display *display = MI_DISPLAY(mi);
+ GC gc = MI_GC(mi);
+ double sns = 0.5*widths*sin(angle + M_PI_2);
+ double css = 0.5*widths*cos(angle + M_PI_2);
+ double sne = 0.5*widthe*sin(angle + M_PI_2);
+ double cse = 0.5*widthe*cos(angle + M_PI_2);
+
+ int xs1 = (int) (x1-sns);
+ int xs2 = (int) (x1+sns);
+ int ys1 = (int) (y1-css);
+ int ys2 = (int) (y1+css);
+ int xe1 = (int) (x2-sne);
+ int xe2 = (int) (x2+sne);
+ int ye1 = (int) (y2-cse);
+ int ye2 = (int) (y2+cse);
+ int i;
+
+ for (i = 0; i < widths; i++) {
+ if (color >= 4)
+ XSetForeground(display, gc, colors[i*4/widths].pixel);
+ XDrawLine(display, MI_WINDOW(mi), gc,
+ xs1+(xs2-xs1)*i/widths, ys1+(ys2-ys1)*i/widths,
+ xe1+(xe2-xe1)*i/widths, ye1+(ye2-ye1)*i/widths);
+ }
+}
+
+static void draw_tree_rec(ModeInfo * mi, double thick, int x, int y, double angle)
+{
+ treestruct *tree = &trees[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ GC gc = MI_GC(mi);
+ int length = (24+NRAND(12))*tree->size;
+ int a = (int) (x - length*sin(angle));
+ int b = (int) (y - length*cos(angle));
+ int i;
+
+ draw_line(mi, x, y, a, b, angle, thick*tree->size, 0.68*thick*tree->size);
+
+ if (thick > 2) {
+ draw_tree_rec(mi, 0.68*thick, a, b, 0.8*angle+rRand(-0.2, 0.2));
+ if (thick < tree->thick-1) {
+ draw_tree_rec(mi, 0.68*thick, a, b, angle+rRand(0.2, 0.9));
+ draw_tree_rec(mi, 0.68*thick, (a+x)/2, (b+y)/2, angle-rRand(0.2, 0.9));
+ }
+ }
+
+ if (thick < 0.5*tree->thick) {
+ int nleaf = 12 + NRAND(4);
+ XArc leaf[16];
+ for (i = 0; i < nleaf; i++) {
+ leaf[i].x = a + (int) (tree->size * rRand(-12, 12));
+ leaf[i].y = b + (int) (tree->size * rRand(-12, 12));
+ leaf[i].width = (int) (tree->size * rRand(2, 6));
+ leaf[i].height = leaf[i].width;
+ leaf[i].angle1 = 0;
+ leaf[i].angle2 = 360 * 64;
+ }
+ if (mi->npixels >= 4)
+ XSetForeground(display, gc, colors[tree->color+NRAND(4)].pixel);
+ XFillArcs(display, MI_WINDOW(mi), gc, leaf, nleaf);
+ }
+}
+
+ENTRYPOINT void
+draw_trees(ModeInfo * mi)
+{
+ treestruct *tree = &trees[MI_SCREEN(mi)];
+ int width = MI_WIN_WIDTH(mi);
+ int height = MI_WIN_HEIGHT(mi);
+
+ if (tree->pause == 1) {
+ tree->pause--;
+ init_trees(mi);
+ } else if (tree->pause > 1) {
+ tree->pause--;
+ return;
+ } else if (--(tree->toDo) == 0) {
+ tree->pause = 6;
+ return;
+ }
+
+ tree->x = NRAND(width);
+ tree->y = (int) (1.25 * height * (1 - tree->toDo / 23.0));
+ tree->thick = rRand(7, 12);
+ tree->size = height / 480.0;
+ if (color < 8) {
+ tree->color = 0;
+ } else {
+ tree->color = 4 * (1 + NRAND(color / 4 - 1));
+ }
+
+ draw_tree_rec(mi, tree->thick, tree->x, tree->y, rRand(-0.1, 0.1));
+}
+
+
+XSCREENSAVER_MODULE_2 ("Forest", forest, trees)
diff --git a/hacks/forest.man b/hacks/forest.man
new file mode 100644
index 0000000..4447221
--- /dev/null
+++ b/hacks/forest.man
@@ -0,0 +1,62 @@
+.TH XScreenSaver 1 "27-May-97" "X Version 11"
+.SH NAME
+forest - draws a fractal forest
+.SH SYNOPSIS
+.B forest
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIforest\fP program draws a fractal forest.
+.SH OPTIONS
+.I forest
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 20.
+
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1995 by Pascal Pensa.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Pascal Pensa <pensa@aurora.unice.fr>, 1995.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 27-May-97.
diff --git a/hacks/fps.c b/hacks/fps.c
new file mode 100644
index 0000000..a24f623
--- /dev/null
+++ b/hacks/fps.c
@@ -0,0 +1,268 @@
+/* fps, Copyright (c) 2001-2018 Jamie Zawinski <jwz@jwz.org>
+ * Draw a frames-per-second display (Xlib and OpenGL).
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include <time.h>
+#include "screenhackI.h"
+#include "fpsI.h"
+
+fps_state *
+fps_init (Display *dpy, Window window)
+{
+ fps_state *st;
+ const char *font;
+ XFontStruct *f;
+ Bool top_p;
+ XWindowAttributes xgwa;
+
+ if (! get_boolean_resource (dpy, "doFPS", "DoFPS"))
+ return 0;
+
+ if (!strcasecmp (progname, "BSOD")) return 0; /* Never worked right */
+
+ top_p = get_boolean_resource (dpy, "fpsTop", "FPSTop");
+
+ st = (fps_state *) calloc (1, sizeof(*st));
+
+ st->dpy = dpy;
+ st->window = window;
+ st->clear_p = get_boolean_resource (dpy, "fpsSolid", "FPSSolid");
+
+ font = get_string_resource (dpy, "fpsFont", "Font");
+
+ if (!font)
+ font = "-*-courier-bold-r-normal-*-*-180-*-*-*-*-*-*"; /* also texfont.c */
+ f = load_font_retry (dpy, font);
+ if (!f) abort();
+
+ {
+ XGCValues gcv;
+ XGetWindowAttributes (dpy, window, &xgwa);
+ gcv.font = f->fid;
+ gcv.foreground =
+ get_pixel_resource (st->dpy, xgwa.colormap, "foreground", "Foreground");
+ st->draw_gc = XCreateGC (dpy, window, GCFont|GCForeground, &gcv);
+ gcv.foreground =
+ get_pixel_resource (st->dpy, xgwa.colormap, "background", "Background");
+ st->erase_gc = XCreateGC (dpy, window, GCFont|GCForeground, &gcv);
+ }
+
+ st->font = f;
+ st->x = 10;
+ st->y = 10;
+ if (top_p)
+ st->y = - (st->font->ascent + st->font->descent + 10);
+
+# ifdef USE_IPHONE
+ /* Don't hide the FPS display under the iPhone X bezel.
+ #### This is the worst of all possible ways to do this! But how else?
+ */
+ if (xgwa.width == 2436 || xgwa.height == 2436)
+ {
+ st->x += 48;
+ st->y += 48 * (top_p ? -1 : 1);
+ }
+# endif
+
+ strcpy (st->string, "FPS: ... ");
+
+ return st;
+}
+
+void
+fps_free (fps_state *st)
+{
+ if (st->draw_gc) XFreeGC (st->dpy, st->draw_gc);
+ if (st->erase_gc) XFreeGC (st->dpy, st->erase_gc);
+ if (st->font) XFreeFont (st->dpy, st->font);
+ free (st);
+}
+
+
+void
+fps_slept (fps_state *st, unsigned long usecs)
+{
+ st->slept += usecs;
+}
+
+
+double
+fps_compute (fps_state *st, unsigned long polys, double depth)
+{
+ if (! st) return 0; /* too early? */
+
+ /* Every N frames (where N is approximately one second's worth of frames)
+ check the wall clock. We do this because checking the wall clock is
+ a slow operation.
+ */
+ if (st->frame_count++ >= st->last_ifps)
+ {
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&st->this_frame_end, &tzp);
+# else
+ gettimeofday(&st->this_frame_end);
+# endif
+
+ if (st->prev_frame_end.tv_sec == 0)
+ st->prev_frame_end = st->this_frame_end;
+ }
+
+ /* If we've probed the wall-clock time, regenerate the string.
+ */
+ if (st->this_frame_end.tv_sec != st->prev_frame_end.tv_sec)
+ {
+ double uprev_frame_end = (st->prev_frame_end.tv_sec +
+ ((double) st->prev_frame_end.tv_usec
+ * 0.000001));
+ double uthis_frame_end = (st->this_frame_end.tv_sec +
+ ((double) st->this_frame_end.tv_usec
+ * 0.000001));
+ double fps = st->frame_count / (uthis_frame_end - uprev_frame_end);
+ double idle = (((double) st->slept * 0.000001) /
+ (uthis_frame_end - uprev_frame_end));
+ double load = 100 * (1 - idle);
+
+ if (load < 0) load = 0; /* well that's obviously nonsense... */
+
+ st->prev_frame_end = st->this_frame_end;
+ st->frame_count = 0;
+ st->slept = 0;
+ st->last_ifps = fps;
+ st->last_fps = fps;
+
+ sprintf (st->string, (polys
+ ? "FPS: %.1f \nLoad: %.1f%% "
+ : "FPS: %.1f \nLoad: %.1f%% "),
+ fps, load);
+
+ if (polys > 0)
+ {
+ const char *s = "";
+# if 0
+ if (polys >= (1024 * 1024)) polys >>= 20, s = "M";
+ else if (polys >= 2048) polys >>= 10, s = "K";
+# endif
+
+ strcat (st->string, "\nPolys: ");
+ if (polys >= 1000000)
+ sprintf (st->string + strlen(st->string), "%lu,%03lu,%03lu%s ",
+ (polys / 1000000), ((polys / 1000) % 1000),
+ (polys % 1000), s);
+ else if (polys >= 1000)
+ sprintf (st->string + strlen(st->string), "%lu,%03lu%s ",
+ (polys / 1000), (polys % 1000), s);
+ else
+ sprintf (st->string + strlen(st->string), "%lu%s ", polys, s);
+ }
+
+ if (depth >= 0.0)
+ {
+ unsigned long L = strlen (st->string);
+ char *s = st->string + L;
+ strcat (s, "\nDepth: ");
+ sprintf (s + strlen(s), "%.1f", depth);
+ L = strlen (s);
+ /* Remove trailing ".0" in case depth is not a fraction. */
+ if (s[L-2] == '.' && s[L-1] == '0')
+ s[L-2] = 0;
+ }
+ }
+
+ return st->last_fps;
+}
+
+
+
+/* Width (and optionally height) of the string in pixels.
+ */
+static int
+string_width (XFontStruct *f, const char *c, int *height_ret)
+{
+ int x = 0;
+ int max_w = 0;
+ int h = f->ascent + f->descent;
+ while (*c)
+ {
+ int cc = *((unsigned char *) c);
+ if (*c == '\n')
+ {
+ if (x > max_w) max_w = x;
+ x = 0;
+ h += f->ascent + f->descent;
+ }
+ else
+ x += (f->per_char
+ ? f->per_char[cc-f->min_char_or_byte2].width
+ : f->min_bounds.rbearing);
+ c++;
+ }
+ if (x > max_w) max_w = x;
+ if (height_ret) *height_ret = h;
+
+ return max_w;
+}
+
+
+/* This function is used only in Xlib mode. For GL mode, see glx/fps-gl.c.
+ */
+void
+fps_draw (fps_state *st)
+{
+ XWindowAttributes xgwa;
+ const char *string = st->string;
+ const char *s;
+ int x = st->x;
+ int y = st->y;
+ int lines = 1;
+ int lh = st->font->ascent + st->font->descent;
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+
+ for (s = string; *s; s++)
+ if (*s == '\n') lines++;
+
+ if (y < 0)
+ y = -y + (lines-1) * lh;
+ else
+ y = xgwa.height - y;
+
+ y -= lh * (lines-1) + st->font->descent;
+
+ /* clear the background */
+ if (st->clear_p)
+ {
+ int w, h;
+ w = string_width (st->font, string, &h);
+ XFillRectangle (st->dpy, st->window, st->erase_gc,
+ x - st->font->descent,
+ y - lh,
+ w + 2*st->font->descent,
+ h + 2*st->font->descent);
+ }
+
+ /* draw the text */
+ while (lines)
+ {
+ s = strchr (string, '\n');
+ if (! s) s = string + strlen(string);
+ XDrawString (st->dpy, st->window, st->draw_gc,
+ x, y, string, (int) (s - string));
+ string = s;
+ string++;
+ lines--;
+ y += lh;
+ }
+}
diff --git a/hacks/fps.h b/hacks/fps.h
new file mode 100644
index 0000000..d3832c1
--- /dev/null
+++ b/hacks/fps.h
@@ -0,0 +1,35 @@
+/* fps, Copyright (c) 2001-2011 Jamie Zawinski <jwz@jwz.org>
+ * Draw a frames-per-second display (Xlib and OpenGL).
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __XSCREENSAVER_FPS_H__
+# define __XSCREENSAVER_FPS_H__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+typedef struct fps_state fps_state;
+
+extern fps_state *fps_init (Display *, Window);
+extern void fps_free (fps_state *);
+extern void fps_slept (fps_state *, unsigned long usecs);
+extern double fps_compute (fps_state *, unsigned long polys, double depth);
+extern void fps_draw (fps_state *);
+
+/* Doesn't really belong here, but close enough. */
+#ifdef HAVE_MOBILE
+ extern double current_device_rotation (void);
+#else
+# define current_device_rotation() (0)
+#endif
+
+#endif /* __XSCREENSAVER_FPS_H__ */
diff --git a/hacks/fpsI.h b/hacks/fpsI.h
new file mode 100644
index 0000000..552de9c
--- /dev/null
+++ b/hacks/fpsI.h
@@ -0,0 +1,40 @@
+/* fps, Copyright (c) 2001-2014 Jamie Zawinski <jwz@jwz.org>
+ * Draw a frames-per-second display (Xlib and OpenGL).
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __XSCREENSAVER_FPSI_H__
+# define __XSCREENSAVER_FPSI_H__
+
+#include "fps.h"
+#undef HAVE_GLBITMAP
+
+
+struct fps_state {
+ Display *dpy;
+ Window window;
+ int x, y;
+ XFontStruct *font;
+ Bool clear_p;
+ char string[1024];
+
+ /* for glx/fps-gl.c */
+ void *gl_fps_data;
+
+ GC draw_gc, erase_gc;
+
+ int last_ifps;
+ double last_fps;
+ int frame_count;
+ unsigned long slept;
+ struct timeval prev_frame_end, this_frame_end;
+};
+
+#endif /* __XSCREENSAVER_FPSI_H__ */
diff --git a/hacks/fuzzyflakes.c b/hacks/fuzzyflakes.c
new file mode 100644
index 0000000..18470bc
--- /dev/null
+++ b/hacks/fuzzyflakes.c
@@ -0,0 +1,646 @@
+/* fuzzyflakes, Copyright (c) 2004
+ * Barry Dmytro <badcherry@mailc.net>
+ *
+ * ! 2004.06.10 21:05
+ * ! - Added support for resizing
+ * ! - Added a color scheme generation algorithm
+ * ! Thanks to <ZoeB> from #vegans@irc.blitzed.org
+ * ! - Added random color generation
+ * ! - Fixed errors in the xml config file
+ * ! - Cleaned up a few inconsistencies in the code
+ * ! - Changed the default color to #EFBEA5
+ *
+ * ! 2004.05.?? ??:??
+ * ! -original creation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+/* I have need of 1/3 and 2/3 constants later on */
+#define N1_3 0.3333333333
+#define N2_3 0.6666666666
+
+typedef struct _flake_var
+{
+ double Ticks;
+ double XPos, YPos;
+ double TrueX;
+ double XOffset;
+ double Angle;
+} FlakeVariable;
+
+/* Struct containing the atrributes to our flakes */
+typedef struct _flake
+{
+ Display *dpy;
+ Window window;
+
+ int Arms;
+ int Thickness;
+ int BorderThickness;
+ int Radius;
+ unsigned long BordColor;
+ unsigned long ForeColor;
+ unsigned long BackColor;
+ Bool RandomColors;
+ int Layers;
+ int Density;
+ int Delay;
+ int FallingSpeed;
+ struct _colors
+ {
+ char *Fore;
+ char *Bord;
+ char *Back;
+ } Colors;
+/* a dynamic array containing positions of all the flakes */
+ FlakeVariable ***Flakes;
+ XGCValues GCValues;
+ unsigned long GCFlags;
+ GC GCVar;
+ XWindowAttributes XGWA;
+ struct _dbevar
+ {
+ Bool dbuf;
+ Pixmap b, ba, bb;
+ } DB;
+} Flake;
+
+/*
+ *This gets the pixel resource for a color: #ffffff
+ */
+static unsigned int
+FuzzyFlakesColorResource(Flake *flake, char *Color)
+{
+ XColor color;
+
+ if (!XParseColor(flake->dpy, flake->XGWA.colormap, Color, &color))
+ {
+ fprintf(stderr, "%s: can't parse color %s", progname, Color);
+ return 0;
+ }
+ if (!XAllocColor(flake->dpy, flake->XGWA.colormap, &color))
+ {
+ fprintf(stderr, "%s: can't allocate color %s", progname, Color);
+ return 0;
+ }
+ return color.pixel;
+}
+
+/*
+ * This is a great color matching algorithm that I got from
+ * a friend of mine on #vegans@irc.blitzed.org
+ * She wrote it in PHP and I ported it over to C
+ * her site is http://beautifulfreak.net/
+ */
+static int
+FuzzyFlakesColorHelper(Flake *flake)
+{
+ unsigned int iR, iG, iB;
+ unsigned int iR0, iG0, iB0;
+ unsigned int iR1, iG1, iB1;
+ float fR, fG, fB;
+ float Max = 0, Min = 0, Lig, Sat;
+ float Hue, Hue0, Hue1;
+ float f1, f2;
+ float fR0, fG0, fB0;
+ float fR1, fG1, fB1;
+ float nR0, nG0, nB0;
+ float nR1, nG1, nB1;
+ XColor color;
+
+ /* First convert from hex to dec */
+ /* while splitting up the RGB values */
+ if (!XParseColor(flake->dpy, flake->XGWA.colormap,
+ flake->Colors.Back, &color))
+ {
+ fprintf(stderr, "%s: can't parse color %s", progname,
+ flake->Colors.Back);
+ return 1;
+ }
+ iR = color.red >> 8;
+ iG = color.green >> 8;
+ iB = color.blue >> 8;
+
+ /* Convert from int to float */
+ fR = iR;
+ fG = iG;
+ fB = iB;
+
+ /* convert from 0-255 to 0-1 */
+ fR = fR / 255;
+ fG = fG / 255;
+ fB = fB / 255;
+
+ /* work out the lightness */
+ if (fR >= fG && fR >= fB)
+ Max = fR;
+ if (fG >= fR && fG >= fB)
+ Max = fG;
+ if (fB >= fR && fB >= fG)
+ Max = fB;
+
+ if (fR <= fG && fR <= fB)
+ Min = fR;
+ if (fG <= fR && fG <= fB)
+ Min = fG;
+ if (fB <= fR && fB <= fG)
+ Min = fB;
+
+ Lig = (Max + Min) / 2;
+
+ /* work out the saturation */
+ if (Max == Min)
+ Sat = 0;
+ else
+ {
+ if (Lig < 0.5)
+ Sat = (Max - Min) / (Max + Min);
+ else
+ Sat = (Max - Min) / (2 - Max - Min);
+ }
+
+ /*
+ * if our satration is too low we won't be
+ * able to see any objects
+ */
+ if (Sat < 0.03)
+ {
+ return 1;
+ }
+
+ /* work out the hue */
+ if (fR == Max)
+ Hue = (fG - fB) / (Max - Min);
+ else if (fG == Max)
+ Hue = 2 + (fB - fR) / (Max - Min);
+ else
+ Hue = 4 + (fR - fG) / (Max - Min);
+
+ Hue = Hue / 6;
+
+ /* fine two equidistant hues */
+ Hue0 = Hue + N1_3;
+ if (Hue0 > 1)
+ Hue0 = Hue0 - 1;
+ Hue1 = Hue0 + N1_3;
+ if (Hue1 > 1)
+ Hue1 = Hue1 - 1;
+
+ /* convert the colors into hex codes */
+ if (Lig < 0.5)
+ f2 = Lig * (1 + Sat);
+ else
+ f2 = (Lig + Sat) - (Lig * Sat);
+
+ f1 = (2 * Lig) - f2;
+
+ fR0 = (Hue0 + 1) / 3;
+ fR1 = (Hue1 + 1) / 3;
+ fG0 = Hue0;
+ fG1 = Hue1;
+ fB0 = (Hue0 - 1) / 3;
+ fB1 = (Hue1 - 1) / 3;
+
+ if (fR0 < 0)
+ fR0 = fR0 + 1;
+ if (fR0 > 1)
+ fR0 = fR0 - 1;
+ if (fG0 < 0)
+ fG0 = fG0 + 1;
+ if (fG0 > 1)
+ fG0 = fG0 - 1;
+ if (fB0 < 0)
+ fB0 = fB0 + 1;
+ if (fB0 > 1)
+ fB0 = fB0 - 1;
+
+ if (fR1 < 0)
+ fR1 = fR1 + 1;
+ if (fR1 > 1)
+ fR1 = fR1 - 1;
+ if (fG1 < 0)
+ fG1 = fG1 + 1;
+ if (fG1 > 1)
+ fG1 = fG1 - 1;
+ if (fB1 < 0)
+ fB1 = fB1 + 1;
+ if (fB1 > 1)
+ fB1 = fB1 - 1;
+
+ if (6 * fR0 < 1)
+ nR0 = f1 + (f2 - f1) * 6 * fR0;
+ else if (2 * fR0 < 1)
+ nR0 = f2;
+ else if (3 * fR0 < 2)
+ nR0 = f1 + (f2 - f1) * (N2_3 - fR0) * 6;
+ else
+ nR0 = f1;
+
+ if (6 * fG0 < 1)
+ nG0 = f1 + (f2 - f1) * 6 * fG0;
+ else if (2 * fG0 < 1)
+ nG0 = f2;
+ else if (3 * fG0 < 2)
+ nG0 = f1 + (f2 - f1) * (N2_3 - fG0) * 6;
+ else
+ nG0 = f1;
+
+ if (6 * fB0 < 1)
+ nB0 = f1 + (f2 - f1) * 6 * fB0;
+ else if (2 * fB0 < 1)
+ nB0 = f2;
+ else if (3 * fB0 < 2)
+ nB0 = f1 + (f2 - f1) * (N2_3 - fB0) * 6;
+ else
+ nB0 = f1;
+
+ if (6 * fR1 < 1)
+ nR1 = f1 + (f2 - f1) * 6 * fR1;
+ else if (2 * fR1 < 1)
+ nR1 = f2;
+ else if (3 * fR1 < 2)
+ nR1 = f1 + (f2 - f1) * (N2_3 - fR1) * 6;
+ else
+ nR1 = f1;
+
+ if (6 * fG1 < 1)
+ nG1 = f1 + (f2 - f1) * 6 * fG1;
+ else if (2 * fG1 < 1)
+ nG1 = f2;
+ else if (3 * fG1 < 2)
+ nG1 = f1 + (f2 - f1) * (N2_3 - fG1) * 6;
+ else
+ nG1 = f1;
+
+ if (6 * fB1 < 1)
+ nB1 = f1 + (f2 - f1) * 6 * fB1;
+ else if (2 * fB1 < 1)
+ nB1 = f2;
+ else if (3 * fB1 < 2)
+ nB1 = f1 + (f2 - f1) * (N2_3 - fB1) * 6;
+ else
+ nB1 = f1;
+
+ /* at last convert them to a hex string */
+ iR0 = nR0 * 255;
+ iG0 = nG0 * 255;
+ iB0 = nB0 * 255;
+
+ iR1 = nR1 * 255;
+ iG1 = nG1 * 255;
+ iB1 = nB1 * 255;
+
+ flake->Colors.Fore = malloc(sizeof(unsigned char) * 8);
+ flake->Colors.Bord = malloc(sizeof(unsigned char) * 8);
+
+ sprintf(flake->Colors.Fore, "#%02X%02X%02X", iR0, iG0, iB0);
+ sprintf(flake->Colors.Bord, "#%02X%02X%02X", iR1, iG1, iB1);
+
+ return 0;
+}
+
+static void
+FuzzyFlakesInit(Flake *flake)
+{
+ int i, j;
+ XWindowAttributes xgwa;
+
+ XGetWindowAttributes(flake->dpy, flake->window, &xgwa);
+ flake->XGWA = xgwa;
+ flake->DB.b = flake->DB.ba = flake->DB.bb = 0;
+ flake->DB.dbuf = get_boolean_resource(flake->dpy, "doubleBuffer", "Boolean");
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ flake->DB.dbuf = False;
+# endif
+
+ if (flake->DB.dbuf)
+ {
+ flake->DB.ba =
+ XCreatePixmap(flake->dpy, flake->window, xgwa.width, xgwa.height, xgwa.depth);
+ flake->DB.bb =
+ XCreatePixmap(flake->dpy, flake->window, xgwa.width, xgwa.height, xgwa.depth);
+ flake->DB.b = flake->DB.ba;
+ }
+ else
+ {
+ flake->DB.b = flake->window;
+ }
+
+ flake->Arms = get_integer_resource(flake->dpy, "arms", "Integer");
+ flake->Thickness = get_integer_resource(flake->dpy, "thickness", "Integer");
+ flake->BorderThickness = get_integer_resource(flake->dpy, "bthickness", "Integer");
+ flake->Radius = get_integer_resource(flake->dpy, "radius", "Integer");
+
+ flake->Density = get_integer_resource(flake->dpy, "density", "Integer");
+ flake->Layers = get_integer_resource(flake->dpy, "layers", "Integer");
+ flake->FallingSpeed = get_integer_resource(flake->dpy, "fallingspeed", "Integer");
+ flake->Delay = get_integer_resource(flake->dpy, "delay", "Integer");
+ if (flake->RandomColors == True)
+ flake->RandomColors = get_boolean_resource(flake->dpy, "randomColors", "Boolean");
+
+ if (xgwa.width > 2560) { /* Retina displays */
+ flake->Thickness *= 2;
+ flake->BorderThickness *= 2;
+ flake->Radius *= 2;
+ flake->FallingSpeed *= 2;
+ }
+
+ if (flake->Delay < 0)
+ flake->Delay = 0;
+
+ if (!flake->Colors.Back)
+ {
+ flake->Colors.Back = get_string_resource(flake->dpy, "color", "Color");
+ if (!FuzzyFlakesColorResource(flake, flake->Colors.Back))
+ {
+ fprintf(stderr, " reverting to random\n");
+ flake->RandomColors = True;
+ }
+
+ if (flake->RandomColors)
+ {
+ if (flake->Colors.Back)
+ free(flake->Colors.Back);
+ flake->Colors.Back = malloc(sizeof(unsigned char) * 8);
+ sprintf(flake->Colors.Back, "#%X%X%X%X%X%X", random() % 16,
+ random() % 16, random() % 16, random() % 16, random() % 16,
+ random() % 16);
+ }
+
+ /*
+ * Here we establish our colormap based on what is in
+ * flake->Colors.Back
+ */
+ if (FuzzyFlakesColorHelper(flake))
+ {
+ fprintf(stderr, " reverting to random\n");
+ if (flake->Colors.Back)
+ free(flake->Colors.Back);
+ flake->Colors.Back = malloc(sizeof(unsigned char) * 8);
+ sprintf(flake->Colors.Back, "#%X%X%X%X%X%X", random() % 16,
+ random() % 16, random() % 16, random() % 16, random() % 16,
+ random() % 16);
+ FuzzyFlakesColorHelper(flake);
+ }
+
+ flake->ForeColor = FuzzyFlakesColorResource(flake, flake->Colors.Fore);
+ flake->BackColor = FuzzyFlakesColorResource(flake, flake->Colors.Back);
+ flake->BordColor = FuzzyFlakesColorResource(flake, flake->Colors.Bord);
+
+ flake->GCValues.foreground = flake->ForeColor;
+ flake->GCValues.background = flake->BackColor;
+ flake->RandomColors = False;
+ }
+
+ flake->GCValues.line_width = flake->Thickness;
+ flake->GCValues.cap_style = CapProjecting;
+ flake->GCValues.join_style = JoinMiter;
+ flake->GCFlags |= (GCLineWidth | GCCapStyle | GCJoinStyle);
+
+ flake->GCVar =
+ XCreateGC(flake->dpy, flake->window, flake->GCFlags,
+ &flake->GCValues);
+
+ flake->Density = flake->XGWA.width / 200 * flake->Density;
+ flake->Flakes = malloc(sizeof(FlakeVariable **) * flake->Layers);
+ for (i = 1; i <= flake->Layers; i++)
+ {
+ flake->Flakes[i - 1] = malloc(sizeof(FlakeVariable *) * flake->Density);
+ for (j = 0; j < flake->Density; j++)
+ {
+ flake->Flakes[i - 1][j] = malloc(sizeof(FlakeVariable));
+ flake->Flakes[i - 1][j]->XPos = random() % flake->XGWA.width;
+ flake->Flakes[i - 1][j]->YPos = random() % flake->XGWA.height;
+ flake->Flakes[i - 1][j]->Angle = random() % 360 * (M_PI / 180);
+ flake->Flakes[i - 1][j]->Ticks = random() % 360;
+ flake->Flakes[i - 1][j]->XOffset = random() % flake->XGWA.height;
+ }
+ }
+}
+
+static void
+FuzzyFlakesFreeFlake(Flake *flake)
+{
+ int i, j;
+
+ for (i = 1; i <= flake->Layers; i++)
+ {
+ for (j = 0; j < flake->Density; j++)
+ {
+ free(flake->Flakes[i - 1][j]);
+ }
+ free(flake->Flakes[i - 1]);
+ }
+
+ if (flake->DB.bb) XFreePixmap(flake->dpy, flake->DB.bb);
+ if (flake->DB.ba) XFreePixmap(flake->dpy, flake->DB.ba);
+}
+
+static void
+FuzzyFlakesMove(Flake *flake)
+{
+ int i, j;
+
+ for (i = 1; i <= flake->Layers; i++)
+ {
+ for (j = 0; j < flake->Density; j++)
+ {
+ FlakeVariable *FlakeVar;
+
+ FlakeVar = flake->Flakes[i - 1][j];
+ FlakeVar->Ticks++;
+ FlakeVar->YPos =
+ FlakeVar->YPos + ((double)flake->FallingSpeed) / 10 / i;
+ FlakeVar->TrueX =
+ (sin
+ (FlakeVar->XOffset +
+ FlakeVar->Ticks * (M_PI / 180) * ((double)flake->FallingSpeed /
+ 10))) * 10 + FlakeVar->XPos;
+ FlakeVar->Angle =
+ FlakeVar->Angle + 0.005 * ((double)flake->FallingSpeed / 10);
+ if (FlakeVar->YPos - flake->Radius > flake->XGWA.height)
+ {
+ FlakeVar->Ticks = 0;
+ FlakeVar->YPos = 0 - flake->Radius;
+ }
+ }
+ }
+}
+
+static void
+FuzzyFlakesDrawFlake(Flake *flake, int XPos, int YPos, double AngleOffset, int Layer)
+{
+ int i;
+ double x, y, Angle, Radius;
+
+ /* calculate the shrink factor debending on which layer we are drawing atm */
+ Radius = (double)(flake->Radius - Layer * 5);
+ /* draw the flake one arm at a time */
+ for (i = 1; i <= flake->Arms; i++)
+ {
+ int Diameter;
+
+ Diameter = (flake->BorderThickness * 2 + flake->Thickness) / Layer;
+ /* compute the angle of this arm of the flake */
+ Angle = ((2 * M_PI) / flake->Arms) * i + AngleOffset;
+ /* calculate the x and y dispositions for this arm */
+ y = (int)(sin(Angle) * Radius);
+ x = (int)(cos(Angle) * Radius);
+ /* draw the base for the arm */
+ flake->GCValues.line_width = Diameter;
+ XFreeGC(flake->dpy, flake->GCVar);
+ flake->GCVar =
+ XCreateGC(flake->dpy, flake->DB.b, flake->GCFlags,
+ &flake->GCValues);
+ XSetForeground(flake->dpy, flake->GCVar, flake->BordColor);
+ XDrawLine(flake->dpy, flake->DB.b, flake->GCVar, XPos, YPos,
+ XPos + x, YPos + y);
+ }
+ /* draw the flake one arm at a time */
+ for (i = 1; i <= flake->Arms; i++)
+ {
+ /* compute the angle of this arm of the flake */
+ Angle = ((2 * M_PI) / flake->Arms) * i + AngleOffset;
+ /* calculate the x and y dispositions for this arm */
+ y = (int)(sin(Angle) * Radius);
+ x = (int)(cos(Angle) * Radius);
+ /* draw the inside of the arm */
+ flake->GCValues.line_width = flake->Thickness / Layer;
+ XFreeGC(flake->dpy, flake->GCVar);
+ flake->GCVar =
+ XCreateGC(flake->dpy, flake->DB.b, flake->GCFlags,
+ &flake->GCValues);
+ XSetForeground(flake->dpy, flake->GCVar, flake->ForeColor);
+ XDrawLine(flake->dpy, flake->DB.b, flake->GCVar, XPos, YPos,
+ XPos + x, YPos + y);
+ }
+}
+
+static void
+FuzzyFlakes(Flake *flake)
+{
+ int i, j;
+
+ FuzzyFlakesMove(flake);
+ XSetForeground(flake->dpy, flake->GCVar, flake->BackColor);
+ XFillRectangle(flake->dpy, flake->DB.b, flake->GCVar, 0, 0,
+ flake->XGWA.width, flake->XGWA.height);
+ for (i = flake->Layers; i >= 1; i--)
+ {
+ for (j = 0; j < flake->Density; j++)
+ {
+ FuzzyFlakesDrawFlake(flake,
+ flake->Flakes[i - 1][j]->TrueX,
+ flake->Flakes[i - 1][j]->YPos,
+ flake->Flakes[i - 1][j]->Angle, i);
+ }
+ }
+
+}
+
+static void *
+fuzzyflakes_init (Display *dpy, Window window)
+{
+ Flake *flake = (Flake *) calloc (1, sizeof(*flake));
+ flake->dpy = dpy;
+ flake->window = window;
+
+ /* This is needed even if it is going to be set to false */
+ flake->RandomColors = True;
+
+ /* set up our colors amoung many other things */
+ FuzzyFlakesInit(flake);
+
+ return flake;
+}
+
+static unsigned long
+fuzzyflakes_draw (Display *dpy, Window window, void *closure)
+{
+ Flake *flake = (Flake *) closure;
+
+ FuzzyFlakes(flake);
+ if (flake->DB.dbuf)
+ {
+ XCopyArea(flake->dpy, flake->DB.b, flake->window,
+ flake->GCVar, 0, 0, flake->XGWA.width, flake->XGWA.height,
+ 0, 0);
+ flake->DB.b =
+ (flake->DB.b == flake->DB.ba ? flake->DB.bb : flake->DB.ba);
+ }
+
+ return flake->Delay;
+}
+
+static void
+fuzzyflakes_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ Flake *flake = (Flake *) closure;
+
+ if (flake->XGWA.width != w || flake->XGWA.height != h)
+ {
+ FuzzyFlakesFreeFlake(flake);
+ FuzzyFlakesInit(flake);
+ }
+}
+
+static Bool
+fuzzyflakes_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ return False;
+}
+
+static void
+fuzzyflakes_free (Display *dpy, Window window, void *closure)
+{
+ Flake *flake = (Flake *) closure;
+ FuzzyFlakesFreeFlake(flake);
+ free(flake);
+}
+
+
+static const char *fuzzyflakes_defaults[] = {
+ "*color: #efbea5",
+ "*arms: 5",
+ "*thickness: 10",
+ "*bthickness: 3",
+ "*radius: 20",
+ "*layers: 3",
+ "*density: 5",
+ "*fallingspeed: 10",
+ "*delay: 10000",
+ "*doubleBuffer: True",
+ "*randomColors: False",
+ 0
+};
+
+static XrmOptionDescRec fuzzyflakes_options[] = {
+ { "-color", ".color", XrmoptionSepArg, 0},
+ { "-arms", ".arms", XrmoptionSepArg, 0},
+ { "-thickness", ".thickness", XrmoptionSepArg, 0},
+ { "-bthickness", ".bthickness", XrmoptionSepArg, 0},
+ { "-radius", ".radius", XrmoptionSepArg, 0},
+ { "-layers", ".layers", XrmoptionSepArg, 0},
+ { "-density", ".density", XrmoptionSepArg, 0},
+ { "-speed", ".fallingspeed", XrmoptionSepArg, 0},
+ { "-delay", ".delay", XrmoptionSepArg, 0},
+ { "-db", ".doubleBuffer", XrmoptionNoArg, "True"},
+ { "-no-db", ".doubleBuffer", XrmoptionNoArg, "False"},
+ { "-random-colors", ".randomColors", XrmoptionNoArg, "True"},
+ { 0, 0, 0, 0}
+};
+
+
+XSCREENSAVER_MODULE ("FuzzyFlakes", fuzzyflakes)
diff --git a/hacks/fuzzyflakes.man b/hacks/fuzzyflakes.man
new file mode 100644
index 0000000..22222bd
--- /dev/null
+++ b/hacks/fuzzyflakes.man
@@ -0,0 +1,112 @@
+.TH XScreenSaver 1 "12-May-04" "X Version 11"
+.SH NAME
+fuzzyflakes - falling snowflakes/flower shapes
+.SH SYNOPSIS
+.B fuzzyflakes
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIusecs\fP]
+[\-speed \fIint\fP]
+[\-arms \fIint\fP]
+[\-thickness \fIint\fP]
+[\-bthickness \fIint\fP]
+[\-radius \fIint\fP]
+[\-layers \fIint\fP]
+[\-density \fIint\fP]
+[\-no-db]
+(\-color \fIstring\fP)
+(\-random-colors)
+[\-fps]
+.SH DESCRIPTION
+The
+.I fuzzyflakes
+program draws falling pastel colored snowflake/flower shapes.
+Inspired by the credits of the anime "Azumanga Daioh".
+.SH OPTIONS
+.I fuzzyflakes
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIusecs\fP
+The delay between steps of the animation, in microseconds. Default: 250000.
+.TP 8
+.B \-speed \fIint\fP
+How fast, 1-50. Default 10.
+.TP 8
+.B \-arms \fIint\fP
+How many arms on the flakes; default 5.
+.TP 8
+.B \-thickness \fIint\fP
+How thick to make the lines; default 10 pixels.
+.TP 8
+.B \-bthickness \fIint\fP
+How thick to make the borders; default 3 pixels.
+.TP 8
+.B \-radius \fIint\fP
+Radius of the objects; default 20 pixels.
+.TP 8
+.B \-layers \fIint\fP
+How many layers of objects; default 3.
+.TP 8
+.B \-density \fIint\fP
+Default 5.
+.TP 8
+.B \-no-db
+Disable double-buffering.
+.TP 8
+.B \-color \fIstring\fP
+The base color for the color scheme. Typed as a hexadecimal triplet
+with or with out the leading #. ie. fa4563 & #43cd12 are both acceptable.
+If the saturation of you color is too low (<0.03) the random color
+generator will kick in.
+The default color is #efbea5
+.TP 8
+.B \-random-colors
+This enables the random color generation. It is disabled by default.
+It overrides anything from -color
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2004 Barry Dmytro. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any
+purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Barry Dmytro <badcherry@mailc.net>
+.SH CREDITS
+The color generation algorithm was borrowed from a friend <ZoeB>
+from #vegans@irc.blitzed.org. Her site was [REDACTED].
+To see her original code in action visit her site.
diff --git a/hacks/galaxy.c b/hacks/galaxy.c
new file mode 100644
index 0000000..3a6e1f7
--- /dev/null
+++ b/hacks/galaxy.c
@@ -0,0 +1,451 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* galaxy --- spinning galaxies */
+/* #include<math.h>*/
+#if 0
+static const char sccsid[] = "@(#)galaxy.c 4.04 97/07/28 xlockmore";
+#endif
+
+/* Originally done by Uli Siegmund <uli@wombat.okapi.sub.org> on Amiga
+ * for EGS in Cluster
+ * Port from Cluster/EGS to C/Intuition by Harald Backert
+ * Port to X11 and incorporation into xlockmore by Hubert Feyrer
+ * <hubert.feyrer@rz.uni-regensburg.de>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 26-Aug-00: robert.nagtegaal@phil.uu.nl and roland@tschai.demon.nl:
+ * various improvements
+ * 10-May-97: jwz@jwz.org: turned into a standalone program.
+ * 18-Apr-97: Memory leak fixed by Tom Schmidt <tschmidt@micron.com>
+ * 07-Apr-97: Modified by Dave Mitchell <davem@magnet.com>
+ * 23-Oct-94: Modified by David Bagley <bagleyd@bigfoot.com>
+ * random star sizes
+ * colors change depending on velocity
+ * 10-Oct-94: Add colors by Hubert Feyer
+ * 30-Sep-94: Initial port by Hubert Feyer
+ * 09-Mar-94: VMS can generate a random number 0.0 which results in a
+ * division by zero, corrected by Jouk Jansen
+ * <joukj@crys.chem.uva.nl>
+ */
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 20000 \n" \
+ "*count: -5 \n" \
+ "*cycles: 250 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+ "*ignoreRotation: True \n" \
+ "*lowrez: True \n" \
+
+# define UNIFORM_COLORS
+# define release_galaxy 0
+# define reshape_galaxy 0
+# define galaxy_handle_event 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+static Bool tracks;
+static Bool spin;
+static Bool dbufp;
+
+#define DEF_TRACKS "True"
+#define DEF_SPIN "True"
+#define DEF_DBUF "True"
+
+static XrmOptionDescRec opts[] =
+{
+ {"-tracks", ".galaxy.tracks", XrmoptionNoArg, "on"},
+ {"+tracks", ".galaxy.tracks", XrmoptionNoArg, "off"},
+ {"-spin", ".galaxy.spin", XrmoptionNoArg, "on"},
+ {"+spin", ".galaxy.spin", XrmoptionNoArg, "off"},
+ {"-dbuf", ".galaxy.dbuf", XrmoptionNoArg, "on"},
+ {"+dbuf", ".galaxy.dbuf", XrmoptionNoArg, "off"},
+};
+
+static argtype vars[] =
+{
+ {&tracks, "tracks", "Tracks", DEF_TRACKS, t_Bool},
+ {&spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&dbufp, "dbuf", "Dbuf", DEF_DBUF, t_Bool},
+};
+
+static OptionStruct desc[] =
+{
+ {"-/+tracks", "turn on/off star tracks"},
+ {"-/+spin", "do/don't spin viewpoint"},
+ {"-/+dbuf", "turn on/off double buffering."},
+};
+
+ENTRYPOINT ModeSpecOpt galaxy_opts =
+{sizeof opts / sizeof opts[0], opts,
+ sizeof vars / sizeof vars[0], vars, desc};
+
+
+#define FLOATRAND ((double) LRAND() / ((double) MAXRAND))
+
+#if 0
+#define WRAP 1 /* Warp around edges */
+#define BOUNCE 1 /* Bounce from borders */
+#endif
+
+#define MINSIZE 1
+#define MINGALAXIES 2
+#define MAX_STARS 3000
+#define MAX_IDELTAT 50
+/* These come originally from the Cluster-version */
+#define DEFAULT_GALAXIES 3
+#define DEFAULT_STARS 1000
+#define DEFAULT_HITITERATIONS 7500
+#define DEFAULT_IDELTAT 200 /* 0.02 */
+#define EPSILON 0.00000001
+
+#define sqrt_EPSILON 0.0001
+
+#define DELTAT (MAX_IDELTAT * 0.0001)
+
+#define GALAXYRANGESIZE 0.1
+#define GALAXYMINSIZE 0.15
+#define QCONS 0.001
+
+
+#define COLORBASE 16
+/* colors per galaxy */
+/* #define COLORSTEP (NUMCOLORS/COLORBASE) */
+# define COLORSTEP (MI_NCOLORS(mi)/COLORBASE)
+
+
+typedef struct {
+ double pos[3], vel[3];
+} Star;
+
+
+typedef struct {
+ int mass;
+ int nstars;
+ Star *stars;
+ XPoint *oldpoints;
+ XPoint *newpoints;
+ double pos[3], vel[3];
+ int galcol;
+} Galaxy;
+
+typedef struct {
+ double mat[3][3]; /* Movement of stars(?) */
+ double scale; /* Scale */
+ int midx; /* Middle of screen, x */
+ int midy; /* Middle of screen, y */
+ double size; /* */
+ double diff[3]; /* */
+ Galaxy *galaxies; /* the Whole Universe */
+ int ngalaxies; /* # galaxies */
+ int f_hititerations; /* # iterations before restart */
+ int step; /* */
+ double rot_y; /* rotation of eye around center of universe, around
+y-axis*/
+ double rot_x; /* rotation of eye around center of universe, around
+x-axis */
+} unistruct;
+
+static unistruct *universes = NULL;
+
+ENTRYPOINT void
+free_galaxy(ModeInfo * mi)
+{
+ unistruct *gp = &universes[MI_SCREEN(mi)];
+ if (gp->galaxies != NULL) {
+ int i;
+
+ for (i = 0; i < gp->ngalaxies; i++) {
+ Galaxy *gt = &gp->galaxies[i];
+
+ if (gt->stars != NULL)
+ (void) free((void *) gt->stars);
+ if (gt->oldpoints != NULL)
+ (void) free((void *) gt->oldpoints);
+ if (gt->newpoints != NULL)
+ (void) free((void *) gt->newpoints);
+ }
+ (void) free((void *) gp->galaxies);
+ gp->galaxies = NULL;
+ }
+}
+
+static void
+startover(ModeInfo * mi)
+{
+ unistruct *gp = &universes[MI_SCREEN(mi)];
+ int i, j; /* more tmp */
+ double w1, w2; /* more tmp */
+ double d, v, w, h; /* yet more tmp */
+
+ gp->step = 0;
+ gp->rot_y = 0;
+ gp->rot_x = 0;
+
+ if (MI_BATCHCOUNT(mi) < -MINGALAXIES)
+ free_galaxy(mi);
+ gp->ngalaxies = MI_BATCHCOUNT(mi);
+ if (gp->ngalaxies < -MINGALAXIES)
+ gp->ngalaxies = NRAND(-gp->ngalaxies - MINGALAXIES + 1) + MINGALAXIES;
+
+ else if (gp->ngalaxies < MINGALAXIES)
+ gp->ngalaxies = MINGALAXIES;
+ if (gp->galaxies == NULL)
+ gp->galaxies = (Galaxy *) calloc(gp->ngalaxies, sizeof (Galaxy));
+
+ for (i = 0; i < gp->ngalaxies; ++i) {
+ Galaxy *gt = &gp->galaxies[i];
+ double sinw1, sinw2, cosw1, cosw2;
+
+ gt->galcol = NRAND(COLORBASE - 2);
+ if (gt->galcol > 1)
+ gt->galcol += 2; /* Mult 8; 16..31 no green stars */
+ /* Galaxies still may have some green stars but are not all green. */
+
+ if (gt->stars != NULL) {
+ (void) free((void *) gt->stars);
+ gt->stars = NULL;
+ }
+ gt->nstars = (NRAND(MAX_STARS / 2)) + MAX_STARS / 2;
+ gt->stars = (Star *) malloc(gt->nstars * sizeof (Star));
+ gt->oldpoints = (XPoint *) malloc(gt->nstars * sizeof (XPoint));
+ gt->newpoints = (XPoint *) malloc(gt->nstars * sizeof (XPoint));
+
+ w1 = 2.0 * M_PI * FLOATRAND;
+ w2 = 2.0 * M_PI * FLOATRAND;
+ sinw1 = SINF(w1);
+ sinw2 = SINF(w2);
+ cosw1 = COSF(w1);
+ cosw2 = COSF(w2);
+
+ gp->mat[0][0] = cosw2;
+ gp->mat[0][1] = -sinw1 * sinw2;
+ gp->mat[0][2] = cosw1 * sinw2;
+ gp->mat[1][0] = 0.0;
+ gp->mat[1][1] = cosw1;
+ gp->mat[1][2] = sinw1;
+ gp->mat[2][0] = -sinw2;
+ gp->mat[2][1] = -sinw1 * cosw2;
+ gp->mat[2][2] = cosw1 * cosw2;
+
+ gt->vel[0] = FLOATRAND * 2.0 - 1.0;
+ gt->vel[1] = FLOATRAND * 2.0 - 1.0;
+ gt->vel[2] = FLOATRAND * 2.0 - 1.0;
+ gt->pos[0] = -gt->vel[0] * DELTAT * gp->f_hititerations + FLOATRAND -
+0.5;
+ gt->pos[1] = -gt->vel[1] * DELTAT * gp->f_hititerations + FLOATRAND -
+0.5;
+ gt->pos[2] = -gt->vel[2] * DELTAT * gp->f_hititerations + FLOATRAND -
+0.5;
+
+ gt->mass = (int) (FLOATRAND * 1000.0) + 1;
+
+ gp->size = GALAXYRANGESIZE * FLOATRAND + GALAXYMINSIZE;
+
+ for (j = 0; j < gt->nstars; ++j) {
+ Star *st = &gt->stars[j];
+ XPoint *oldp = &gt->oldpoints[j];
+ XPoint *newp = &gt->newpoints[j];
+
+ double sinw, cosw;
+
+ w = 2.0 * M_PI * FLOATRAND;
+ sinw = SINF(w);
+ cosw = COSF(w);
+ d = FLOATRAND * gp->size;
+ h = FLOATRAND * exp(-2.0 * (d / gp->size)) / 5.0 * gp->size;
+ if (FLOATRAND < 0.5)
+ h = -h;
+ st->pos[0] = gp->mat[0][0] * d * cosw + gp->mat[1][0] * d * sinw +
+gp->mat[2][0] * h + gt->pos[0];
+ st->pos[1] = gp->mat[0][1] * d * cosw + gp->mat[1][1] * d * sinw +
+gp->mat[2][1] * h + gt->pos[1];
+ st->pos[2] = gp->mat[0][2] * d * cosw + gp->mat[1][2] * d * sinw +
+gp->mat[2][2] * h + gt->pos[2];
+
+ v = sqrt(gt->mass * QCONS / sqrt(d * d + h * h));
+ st->vel[0] = -gp->mat[0][0] * v * sinw + gp->mat[1][0] * v * cosw +
+gt->vel[0];
+ st->vel[1] = -gp->mat[0][1] * v * sinw + gp->mat[1][1] * v * cosw +
+gt->vel[1];
+ st->vel[2] = -gp->mat[0][2] * v * sinw + gp->mat[1][2] * v * cosw +
+gt->vel[2];
+
+ st->vel[0] *= DELTAT;
+ st->vel[1] *= DELTAT;
+ st->vel[2] *= DELTAT;
+
+ oldp->x = 0;
+ oldp->y = 0;
+ newp->x = 0;
+ newp->y = 0;
+ }
+
+ }
+
+ XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+
+#if 0
+ (void) printf("ngalaxies=%d, f_hititerations=%d\n", gp->ngalaxies,
+gp->f_hititerations);
+ (void) printf("f_deltat=%g\n", DELTAT);
+ (void) printf("Screen: ");
+#endif /*0 */
+}
+
+ENTRYPOINT void
+init_galaxy(ModeInfo * mi)
+{
+ unistruct *gp;
+
+ MI_INIT (mi, universes);
+ gp = &universes[MI_SCREEN(mi)];
+
+# ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ dbufp = False;
+# endif
+
+ gp->f_hititerations = MI_CYCLES(mi);
+
+ gp->scale = (double) (MI_WIN_WIDTH(mi) + MI_WIN_HEIGHT(mi)) / 8.0;
+ gp->midx = MI_WIN_WIDTH(mi) / 2;
+ gp->midy = MI_WIN_HEIGHT(mi) / 2;
+ startover(mi);
+}
+
+ENTRYPOINT void
+draw_galaxy(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GC gc = MI_GC(mi);
+ unistruct *gp = &universes[MI_SCREEN(mi)];
+ double d, eps, cox, six, cor, sir; /* tmp */
+ int i, j, k; /* more tmp */
+ XPoint *dummy = NULL;
+
+ if (! dbufp)
+ XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+
+ if(spin){
+ gp->rot_y += 0.01;
+ gp->rot_x += 0.004;
+ }
+
+ cox = COSF(gp->rot_y);
+ six = SINF(gp->rot_y);
+ cor = COSF(gp->rot_x);
+ sir = SINF(gp->rot_x);
+
+ eps = 1/(EPSILON * sqrt_EPSILON * DELTAT * DELTAT * QCONS);
+
+ for (i = 0; i < gp->ngalaxies; ++i) {
+ Galaxy *gt = &gp->galaxies[i];
+
+ for (j = 0; j < gp->galaxies[i].nstars; ++j) {
+ Star *st = &gt->stars[j];
+ XPoint *newp = &gt->newpoints[j];
+ double v0 = st->vel[0];
+ double v1 = st->vel[1];
+ double v2 = st->vel[2];
+
+ for (k = 0; k < gp->ngalaxies; ++k) {
+ Galaxy *gtk = &gp->galaxies[k];
+ double d0 = gtk->pos[0] - st->pos[0];
+ double d1 = gtk->pos[1] - st->pos[1];
+ double d2 = gtk->pos[2] - st->pos[2];
+
+ d = d0 * d0 + d1 * d1 + d2 * d2;
+ if (d > EPSILON)
+ d = gtk->mass / (d * sqrt(d)) * DELTAT * DELTAT * QCONS;
+ else
+ d = gtk->mass / (eps * sqrt(eps));
+ v0 += d0 * d;
+ v1 += d1 * d;
+ v2 += d2 * d;
+ }
+
+ st->vel[0] = v0;
+ st->vel[1] = v1;
+ st->vel[2] = v2;
+
+ st->pos[0] += v0;
+ st->pos[1] += v1;
+ st->pos[2] += v2;
+
+ newp->x = (short) (((cox * st->pos[0]) - (six * st->pos[2])) *
+ gp->scale) + gp->midx;
+ newp->y = (short) (((cor * st->pos[1]) - (sir * ((six * st->pos[0]) +
+ (cox * st->pos[2]))))
+ * gp->scale) + gp->midy;
+
+ }
+
+ for (k = i + 1; k < gp->ngalaxies; ++k) {
+ Galaxy *gtk = &gp->galaxies[k];
+ double d0 = gtk->pos[0] - gt->pos[0];
+ double d1 = gtk->pos[1] - gt->pos[1];
+ double d2 = gtk->pos[2] - gt->pos[2];
+
+ d = d0 * d0 + d1 * d1 + d2 * d2;
+ if (d > EPSILON)
+ d = 1 / (d * sqrt(d)) * DELTAT * QCONS;
+ else
+ d = 1 / (EPSILON * sqrt_EPSILON) * DELTAT * QCONS;
+
+ d0 *= d;
+ d1 *= d;
+ d2 *= d;
+ gt->vel[0] += d0 * gtk->mass;
+ gt->vel[1] += d1 * gtk->mass;
+ gt->vel[2] += d2 * gtk->mass;
+ gtk->vel[0] -= d0 * gt->mass;
+ gtk->vel[1] -= d1 * gt->mass;
+ gtk->vel[2] -= d2 * gt->mass;
+ }
+
+ gt->pos[0] += gt->vel[0] * DELTAT;
+ gt->pos[1] += gt->vel[1] * DELTAT;
+ gt->pos[2] += gt->vel[2] * DELTAT;
+
+ if (dbufp) {
+ XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
+ XDrawPoints(display, window, gc, gt->oldpoints, gt->nstars,
+ CoordModeOrigin);
+ }
+ XSetForeground(display, gc, MI_PIXEL(mi, COLORSTEP * gt->galcol));
+ XDrawPoints(display, window, gc, gt->newpoints, gt->nstars,
+ CoordModeOrigin);
+
+ dummy = gt->oldpoints;
+ gt->oldpoints = gt->newpoints;
+ gt->newpoints = dummy;
+ }
+
+ gp->step++;
+ if (gp->step > gp->f_hititerations * 4)
+ startover(mi);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_galaxy(ModeInfo * mi)
+{
+ /* Do nothing, it will refresh by itself */
+}
+#endif
+
+XSCREENSAVER_MODULE ("Galaxy", galaxy)
diff --git a/hacks/galaxy.man b/hacks/galaxy.man
new file mode 100644
index 0000000..1a2a79d
--- /dev/null
+++ b/hacks/galaxy.man
@@ -0,0 +1,87 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+galaxy - draws spinning galaxies
+.SH SYNOPSIS
+.B galaxy
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] [\-size \fIinteger\fP] [\-tracks] [\-no\-tracks] [\-spin] [\-no\-spin]
+
+[\-fps]
+.SH DESCRIPTION
+The \fIgalaxy\fP program draws spinning galaxies.
+.SH OPTIONS
+.I galaxy
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible). Default 64.
+The colors used cycle through the hue, making N stops around
+the color wheel.
+.TP 8
+.B \-cycles \fIinteger\fP
+.TP 8
+.B \-count \fIinteger\fP
+.TP 8
+.B \-size \fIinteger\fP
+.TP 8
+.B \-tracks
+.TP 8
+.B \-no\-tracks
+.TP 8
+.B \-spin
+.TP 8
+.B \-no\-spin
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1994 by Hubert Feyrer.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
+.SH AUTHOR
+Original Amiga version by Uli Siegmund <uli@wombat.okapi.sub.org>
+ for EGS in Cluster.
+
+Ported from Cluster/EGS to C/Intuition by Harald Backert.
+
+Ported to X11 and xlockmore by
+Hubert Feyrer <hubert.feyrer@rz.uni-regensburg.de>, 30-Sep-94.
+
+Modified by David Bagley <bagleyd@bigfoot.com>, 23-Oct-94.
+
+Modified by Dave Mitchell <davem@magnet.com>, 7-Apr-97.
+
+Ability to run standalone or with \fIxscreensaver\fP added by
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/glitchpeg.c b/hacks/glitchpeg.c
new file mode 100644
index 0000000..4f3b052
--- /dev/null
+++ b/hacks/glitchpeg.c
@@ -0,0 +1,440 @@
+/* glitchpeg, Copyright (c) 2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Insert errors into an image file, then display the corrupted result.
+ *
+ * This only works on X11 and MacOS because iOS and Android don't have
+ * access to the source files of images, only the decoded image data.
+ */
+
+#include "screenhack.h"
+#include "ximage-loader.h"
+
+#ifndef HAVE_JWXYZ
+# include <X11/Intrinsic.h> /* for XtInputId, etc */
+#endif
+
+#include <sys/stat.h>
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+struct state {
+ Display *dpy;
+ Window window;
+ GC gc;
+ XWindowAttributes xgwa;
+ int delay;
+ int count;
+ int duration;
+ time_t start_time;
+ unsigned char *image_data; unsigned long image_size;
+ XtInputId pipe_id;
+ FILE *pipe;
+ Bool button_down_p;
+};
+
+
+static Bool
+bigendian (void)
+{
+ union { int i; char c[sizeof(int)]; } u;
+ u.i = 1;
+ return !u.c[0];
+}
+
+
+/* Given a bitmask, returns the position and width of the field.
+ Duplicated from ximage-loader.c.
+ */
+static void
+decode_mask (unsigned long mask, unsigned long *pos_ret,
+ unsigned long *size_ret)
+{
+ int i;
+ for (i = 0; i < 32; i++)
+ if (mask & (1L << i))
+ {
+ int j = 0;
+ *pos_ret = i;
+ for (; i < 32; i++, j++)
+ if (! (mask & (1L << i)))
+ break;
+ *size_ret = j;
+ return;
+ }
+}
+
+
+/* Renders a scaled, cropped version of the RGBA XImage onto the window.
+ */
+static void
+draw_image (Display *dpy, Window window, Visual *v, GC gc,
+ int w, int h, int depth, XImage *in)
+{
+ XImage *out;
+ int x, y, w2, h2, xoff, yoff;
+ double xs, ys, s;
+
+ unsigned long crpos=0, cgpos=0, cbpos=0, capos=0; /* bitfield positions */
+ unsigned long srpos=0, sgpos=0, sbpos=0;
+ unsigned long srmsk=0, sgmsk=0, sbmsk=0;
+ unsigned long srsiz=0, sgsiz=0, sbsiz=0;
+
+# ifdef HAVE_JWXYZ
+ // BlackPixel has alpha: 0xFF000000.
+ unsigned long black = BlackPixelOfScreen (DefaultScreenOfDisplay (dpy));
+#else
+ unsigned long black = 0;
+# endif
+
+ xs = in->width / (double) w;
+ ys = in->height / (double) h;
+ s = (xs > ys ? ys : xs);
+ w2 = in->width / s;
+ h2 = in->height / s;
+ xoff = (w - w2) / 2;
+ yoff = (h - h2) / 2;
+
+ /* Create a new image in the depth and bit-order of the server. */
+ out = XCreateImage (dpy, v, depth, ZPixmap, 0, 0, w, h, 8, 0);
+ out->bitmap_bit_order = in->bitmap_bit_order;
+ out->byte_order = in->byte_order;
+
+ out->bitmap_bit_order = BitmapBitOrder (dpy);
+ out->byte_order = ImageByteOrder (dpy);
+
+ out->data = (char *) malloc (out->height * out->bytes_per_line);
+ if (!out->data) abort();
+
+ /* Find the server's color masks.
+ We could cache this and just do it once, but it's a small number
+ of instructions compared to the per-pixel operations happening next.
+ */
+ srmsk = out->red_mask;
+ sgmsk = out->green_mask;
+ sbmsk = out->blue_mask;
+
+ if (!(srmsk && sgmsk && sbmsk)) abort(); /* No server color masks? */
+
+ decode_mask (srmsk, &srpos, &srsiz);
+ decode_mask (sgmsk, &sgpos, &sgsiz);
+ decode_mask (sbmsk, &sbpos, &sbsiz);
+
+ /* 'in' is RGBA in client endianness. Convert to what the server wants. */
+ if (bigendian())
+ crpos = 24, cgpos = 16, cbpos = 8, capos = 0;
+ else
+ crpos = 0, cgpos = 8, cbpos = 16, capos = 24;
+
+ /* Iterate the destination rectangle and pull in the corresponding
+ scaled and cropped source pixel, or black. Nearest-neighbor is fine.
+ */
+ for (y = 0; y < out->height; y++)
+ {
+ int iy = (out->height - y - yoff - 1) * s;
+ for (x = 0; x < out->width; x++)
+ {
+ int ix = (x - xoff) * s;
+ unsigned long p = (ix >= 0 && ix < in->width &&
+ iy >= 0 && iy < in->height
+ ? XGetPixel (in, ix, iy)
+ : black);
+ /* unsigned char a = (p >> capos) & 0xFF; */
+ unsigned char b = (p >> cbpos) & 0xFF;
+ unsigned char g = (p >> cgpos) & 0xFF;
+ unsigned char r = (p >> crpos) & 0xFF;
+ XPutPixel (out, x, y, ((r << srpos) |
+ (g << sgpos) |
+ (b << sbpos) |
+ black));
+ }
+ }
+
+ XPutImage (dpy, window, gc, out, 0, 0, 0, 0, out->width, out->height);
+ XDestroyImage (out);
+}
+
+
+# define BACKSLASH(c) \
+ (! ((c >= 'a' && c <= 'z') || \
+ (c >= 'A' && c <= 'Z') || \
+ (c >= '0' && c <= '9') || \
+ c == '.' || c == '_' || c == '-' || c == '+' || c == '/'))
+
+/* Gets the name of an image file to load by running xscreensaver-getimage-file
+ at the end of a pipe. This can be very slow!
+ Duplicated from utils/grabclient.c
+ */
+static FILE *
+open_image_name_pipe (void)
+{
+ char *s;
+
+ /* /bin/sh on OS X 10.10 wipes out the PATH. */
+ const char *path = getenv("PATH");
+ char *cmd = s = malloc (strlen(path) * 2 + 100);
+ strcpy (s, "/bin/sh -c 'export PATH=");
+ s += strlen (s);
+ while (*path) {
+ char c = *path++;
+ if (BACKSLASH(c)) *s++ = '\\';
+ *s++ = c;
+ }
+ strcpy (s, "; ");
+ s += strlen (s);
+
+ strcpy (s, "xscreensaver-getimage-file --name --absolute");
+ s += strlen (s);
+
+ strcpy (s, "'");
+ s += strlen (s);
+
+ *s = 0;
+
+ FILE *pipe = popen (cmd, "r");
+ free (cmd);
+ return pipe;
+}
+
+
+/* Duplicated from utils/grabclient.c */
+static void
+xscreensaver_getimage_file_cb (XtPointer closure, int *source, XtInputId *id)
+{
+ /* This is not called from a signal handler, so doing stuff here is fine.
+ */
+ struct state *st = (struct state *) closure;
+ char buf[10240];
+ char *file = buf;
+ FILE *fp;
+ struct stat stat;
+ int n;
+ unsigned char *s;
+ int L;
+
+ *buf = 0;
+ fgets (buf, sizeof(buf)-1, st->pipe);
+ pclose (st->pipe);
+ st->pipe = 0;
+ XtRemoveInput (st->pipe_id);
+ st->pipe_id = 0;
+
+ /* strip trailing newline */
+ L = strlen(buf);
+ while (L > 0 && (buf[L-1] == '\r' || buf[L-1] == '\n'))
+ buf[--L] = 0;
+
+ fp = fopen (file, "r");
+ if (! fp)
+ {
+ fprintf (stderr, "%s: unable to read %s\n", progname, file);
+ return;
+ }
+
+ if (fstat (fileno (fp), &stat))
+ {
+ fprintf (stderr, "%s: %s: stat failed\n", progname, file);
+ return;
+ }
+
+ if (st->image_data) free (st->image_data);
+ st->image_size = stat.st_size;
+ st->image_data = malloc (st->image_size);
+
+ s = st->image_data;
+ do {
+ n = fread (s, 1, st->image_data + st->image_size - s, fp);
+ if (n > 0) s += n;
+ } while (n > 0);
+
+ fclose (fp);
+
+ /* fprintf (stderr, "loaded %s (%lu)\n", file, st->image_size); */
+
+ st->start_time = time((time_t *) 0);
+}
+
+
+static void *
+glitchpeg_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));
+ XGCValues gcv;
+
+ st->dpy = dpy;
+ st->window = window;
+ st->gc = XCreateGC (dpy, window, 0, &gcv);
+
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+
+ st->delay = get_integer_resource (st->dpy, "delay", "Integer");
+ if (st->delay < 1) st->delay = 1;
+
+ st->duration = get_integer_resource (st->dpy, "duration", "Integer");
+ if (st->duration < 0) st->duration = 0;
+
+ st->count = get_integer_resource (st->dpy, "count", "Integer");
+ if (st->count < 1) st->count = 1;
+
+ XClearWindow (st->dpy, st->window);
+
+ return st;
+}
+
+
+static unsigned long
+glitchpeg_draw (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+
+ if ((!st->image_data ||
+ time((time_t *) 0) >= st->start_time + st->duration) &&
+ !st->pipe)
+ {
+ /* Time to reload */
+ st->pipe = open_image_name_pipe();
+ st->pipe_id =
+ XtAppAddInput (XtDisplayToApplicationContext (dpy),
+ fileno (st->pipe),
+ (XtPointer) (XtInputReadMask | XtInputExceptMask),
+ xscreensaver_getimage_file_cb, (XtPointer) st);
+ }
+
+ if (st->image_data && !st->button_down_p)
+ {
+ int n;
+ XImage *image;
+ unsigned char *glitched = malloc (st->image_size);
+ int nn = random() % st->count;
+ if (nn <= 0) nn = 1;
+
+ memcpy (glitched, st->image_data, st->image_size);
+
+ for (n = 0; n < nn; n++)
+ {
+ int start = 255;
+ int end = st->image_size - 255;
+ int size = end - start;
+ Bool byte_p = True; /* random() % 100; */
+ if (size <= 100) break;
+ if (byte_p)
+ {
+ int i = start + (random() % size);
+ if (!(random() % 10))
+ /* Take one random byte and randomize it. */
+ glitched[i] = random() % 0xFF;
+ else
+ /* Take one random byte and add 5% to it. */
+ glitched[i] +=
+ (1 + (random() % 0x0C)) * ((random() & 1) ? 1 : -1);
+ }
+ else
+ {
+ /* Take two randomly-sized chunks of the file and swap them.
+ This tends to just destroy the image. Doesn't look good. */
+ int s2 = 2 + size * 0.05;
+ char *swap = malloc (s2);
+ int start1 = start + (random() % (size - s2));
+ int start2 = start + (random() % (size - s2));
+ memcpy (glitched + start1, swap, s2);
+ memmove (glitched + start2, glitched + start1, s2);
+ memcpy (swap, glitched + start2, s2);
+ free (swap);
+ }
+ }
+
+ image = image_data_to_ximage (dpy, st->xgwa.visual,
+ glitched, st->image_size);
+ free (glitched);
+
+ if (image) /* Might be null if decode fails */
+ {
+ draw_image (dpy, window, st->xgwa.visual, st->gc,
+ st->xgwa.width, st->xgwa.height, st->xgwa.depth,
+ image);
+ XDestroyImage (image);
+ }
+ }
+
+ return st->delay;
+}
+
+
+static void
+glitchpeg_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ struct state *st = (struct state *) closure;
+ XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+}
+
+
+static Bool
+glitchpeg_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ struct state *st = (struct state *) closure;
+ if (event->xany.type == ButtonPress)
+ {
+ st->button_down_p = True;
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease)
+ {
+ st->button_down_p = False;
+ return True;
+ }
+ else if (screenhack_event_helper (dpy, window, event))
+ {
+ st->start_time = 0; /* reload */
+ return True;
+ }
+
+ return False;
+}
+
+
+static void
+glitchpeg_free (Display *dpy, Window window, void *closure)
+{
+ struct state *st = (struct state *) closure;
+ XFreeGC (dpy, st->gc);
+ if (st->pipe_id) XtRemoveInput (st->pipe_id);
+ if (st->pipe) fclose (st->pipe);
+ if (st->image_data) free (st->image_data);
+ free (st);
+}
+
+
+static const char *glitchpeg_defaults [] = {
+ ".background: black",
+ ".foreground: white",
+ ".lowrez: True",
+ "*fpsSolid: true",
+ "*delay: 30000",
+ "*duration: 120",
+ "*count: 100",
+ "*grabDesktopImages: False", /* HAVE_JWXYZ */
+ "*chooseRandomImages: True", /* HAVE_JWXYZ */
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+ "*rotateImages: True",
+#endif
+ 0
+};
+
+static XrmOptionDescRec glitchpeg_options [] = {
+ { "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-duration", ".duration", XrmoptionSepArg, 0 },
+ { "-count", ".count", XrmoptionSepArg, 0 },
+ { 0, 0, 0, 0 }
+};
+
+XSCREENSAVER_MODULE ("GlitchPEG", glitchpeg)
diff --git a/hacks/glitchpeg.man b/hacks/glitchpeg.man
new file mode 100644
index 0000000..ca80165
--- /dev/null
+++ b/hacks/glitchpeg.man
@@ -0,0 +1,79 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+glitchpeg - glitched image screen saver.
+.SH SYNOPSIS
+.B glitchpeg
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-duration \fInumber\fP]
+[\-count \fInumber\fP]
+.SH DESCRIPTION
+Loads an image, corrupts it, and then displays the corrupted version,
+several times a second. After a while, finds a new image to corrupt.
+
+It glitches the image by altering random bytes in the compressed image
+file before de-compressing it. This creates interesting visual effects
+on JPEG files, but doesn't work well on PNG files, since PNG contains
+checksums that detect simple corruption.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
+.TP 8
+.B \-duration \fInumber\fP
+How many seconds before loading a new image. Default: 120.
+.TP 8
+.B \-count \fInumber\fP
+Number of glitches to introduce per iteration. Default: 100.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SECURITY
+Because this program is feeding intentionally-invalid data into your
+operating system's image-decoding libraries, it is possible that it
+may crash as a result of that corrupted data.
+
+That should not be possible -- but it might be.
+
+Please note that if this happens, that indicates a serious security
+bug in your system's image libraries! It likely means that your
+libraries are susceptible to buffer overflow attacks or similar, which
+can lead to remote code execution. You should report that bug to the
+maintainers of those image libraries.
+
+In the context of xscreensaver, when configured to load only local
+image files, this should not be a direct security concern: this screen
+saver crashing will not affect the xscreensaver daemon and will not
+unlock your screen.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2018 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/Makefile.in b/hacks/glx/Makefile.in
new file mode 100644
index 0000000..e3fa617
--- /dev/null
+++ b/hacks/glx/Makefile.in
@@ -0,0 +1,3473 @@
+# hacks/glx/Makefile.in --- xscreensaver, Copyright (c) 1999-2018
+# by Jamie Zawinski.
+# the `../../configure' script generates `hacks/glx/Makefile' from this file.
+
+@SET_MAKE@
+.SUFFIXES:
+.SUFFIXES: .c .o
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+top_srcdir = @top_srcdir@
+top_builddir = ..
+
+install_prefix =
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+datarootdir = @datarootdir@
+datadir = @datadir@
+mandir = @mandir@
+libexecdir = @libexecdir@
+mansuffix = 6
+manNdir = $(mandir)/man$(mansuffix)
+
+HACKDIR = @HACKDIR@
+HACK_CONF_DIR = @HACK_CONF_DIR@
+
+CC = @CC@
+CFLAGS = @CFLAGS@
+LDFLAGS = @LDFLAGS@
+DEFS = -DSTANDALONE -DUSE_GL @DEFS@
+LIBS = @LIBS@
+PERL = @PERL@
+
+DEPEND = @DEPEND@
+DEPEND_FLAGS = @DEPEND_FLAGS@
+DEPEND_DEFINES = @DEPEND_DEFINES@
+
+SHELL = /bin/sh
+INSTALL = @INSTALL@
+SUID_FLAGS = -o root -m 4755
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SETUID = @INSTALL_SETUID@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_DIRS = @INSTALL_DIRS@
+
+X_CFLAGS = @X_CFLAGS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+XMU_LIBS = @XMU_LIBS@
+XFT_LIBS = @XFT_LIBS@
+
+# Note: see comment in ../../driver/Makefile.in for explanation of X_LIBS, etc.
+#
+HACK_PRE = $(LIBS) $(X_LIBS)
+HACK_POST = $(X_PRE_LIBS) $(XFT_LIBS) -lXt -lX11 $(XMU_LIBS) -lXext $(X_EXTRA_LIBS) -lm
+HACK_POST2 = @GL_LIBS@ @HACK_LIBS@ $(HACK_POST)
+HACK_LIBS = $(HACK_PRE) @ANIM_LIBS@ $(HACK_POST2)
+PNG_LIBS = $(HACK_PRE) @PNG_LIBS@ $(HACK_POST2)
+GLE_LIBS = $(HACK_PRE) @GLE_LIBS@ @PNG_LIBS@ $(HACK_POST2)
+TEXT_LIBS = @PTY_LIBS@
+
+HACK_SRC = $(srcdir)/..
+HACK_BIN = ..
+UTILS_SRC = $(HACK_SRC)/../utils
+JWXYZ_SRC = $(HACK_SRC)/../jwxyz
+UTILS_BIN = $(HACK_BIN)/../utils
+JWXYZ_BIN = $(HACK_BIN)/../jwxyz
+
+INCLUDES_1 = -I. -I$(srcdir) -I$(UTILS_SRC) -I$(JWXYZ_SRC) -I$(HACK_SRC) -I$(HACK_BIN) -I../..
+INCLUDES = $(INCLUDES_1) @INCLUDES@
+
+UTILDIR_OBJS = $(UTILS_BIN)/colors.o $(UTILS_BIN)/grabclient.o \
+ $(UTILS_BIN)/hsv.o $(UTILS_BIN)/resources.o \
+ $(UTILS_BIN)/usleep.o $(UTILS_BIN)/visual.o \
+ $(UTILS_BIN)/xmu.o $(UTILS_BIN)/xft.o \
+ $(UTILS_BIN)/utf8wc.o $(UTILS_BIN)/logo.o \
+ $(UTILS_BIN)/visual-gl.o \
+ $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/xshm.o \
+ $(UTILS_BIN)/textclient.o $(UTILS_BIN)/async_netdb.o \
+ $(UTILS_BIN)/aligned_malloc.o $(UTILS_BIN)/thread_util.o \
+ $(UTILS_BIN)/spline.o $(UTILS_BIN)/pow2.o \
+ $(UTILS_SRC)/font-retry.c
+JWXYZ_OBJS = $(JWXYZ_BIN)/jwzgles.o
+HACKDIR_OBJS = $(HACK_BIN)/screenhack.o $(HACK_BIN)/xlockmore.o \
+ $(HACK_BIN)/fps.o $(HACK_BIN)/ximage-loader.o
+PNG = $(HACK_BIN)/ximage-loader.o
+
+SRCS = xscreensaver-gl-helper.c normals.c erase-gl.c fps-gl.c \
+ atlantis.c b_draw.c b_lockglue.c b_sphere.c bubble3d.c \
+ buildlwo.c cage.c dolphin.c gears.c lament.c lament_model.c \
+ moebius.c morph3d.c pipeobjs.c pipes.c rubik.c s1_1.c s1_2.c \
+ s1_3.c s1_4.c s1_5.c s1_6.c s1_b.c shark.c sproingies.c \
+ sproingiewrap.c stairs.c superquadrics.c swim.c whale.c \
+ xlock-gl-utils.c glplanet.c pulsar.c \
+ extrusion.c extrusion-helix2.c extrusion-helix3.c \
+ extrusion-helix4.c extrusion-joinoffset.c extrusion-screw.c \
+ extrusion-taper.c extrusion-twistoid.c sierpinski3d.c \
+ gflux.c stonerview.c stonerview-move.c stonerview-osc.c \
+ stonerview-view.c starwars.c glut_stroke.c glut_swidth.c \
+ gltext.c molecule.c dangerball.c sphere.c tube.c circuit.c \
+ menger.c engine.c flipscreen3d.c dnalogo.c \
+ grab-ximage.c glsnake.c boxed.c glforestfire.c sballs.c \
+ cubenetic.c spheremonics.c marching.c lavalite.c rotator.c \
+ trackball.c gltrackball.c queens.c endgame.c chessmodels.c \
+ glblur.c gllist.c flurry.c flurry-smoke.c flurry-spark.c \
+ flurry-star.c flurry-texture.c atunnel.c tunnel_draw.c \
+ flyingtoasters.c toaster.c toaster_base.c toaster_handle.c \
+ toaster_handle2.c toaster_jet.c toaster_knob.c \
+ toaster_slots.c toaster_wing.c toast.c toast2.c \
+ bouncingcow.c cow_face.c cow_hide.c cow_hoofs.c cow_horns.c \
+ cow_tail.c cow_udder.c glslideshow.c jigglypuff.c klein.c \
+ hypertorus.c glmatrix.c cubestorm.c glknots.c blocktube.c \
+ flipflop.c antspotlight.c polytopes.c gleidescope.c \
+ mirrorblob.c blinkbox.c noof.c polyhedra.c polyhedra-gl.c \
+ antinspect.c providence.c pinion.c involute.c boing.c \
+ texfont.c carousel.c fliptext.c antmaze.c tangram.c \
+ tangram_shapes.c crackberg.c glhanoi.c cube21.c \
+ timetunnel.c juggler3d.c topblock.c glschool.c \
+ glschool_gl.c glschool_alg.c glcells.c voronoi.c \
+ moebiusgears.c lockward.c cubicgrid.c hypnowheel.c \
+ skytentacles.c teapot.c sonar.c sonar-sim.c sonar-icmp.c \
+ jigsaw.c photopile.c dropshadow.c rubikblocks.c surfaces.c \
+ hilbert.c companion.c companion_quad.c companion_disc.c \
+ companion_heart.c tronbit.c tronbit_idle1.c tronbit_idle2.c \
+ tronbit_no.c tronbit_yes.c kaleidocycle.c \
+ quasicrystal.c unknownpleasures.c geodesic.c geodesicgears.c \
+ projectiveplane.c winduprobot.c robot.c robot-wireframe.c \
+ cityflow.c romanboy.c splitflap.c splitflap_obj.c \
+ dymaxionmap.c dymaxionmap-coords.c unicrud.c energystream.c \
+ raverhoop.c hydrostat.c discoball.c cubetwist.c cubestack.c \
+ splodesic.c hexstrut.c vigilance.c seccam.c esper.c \
+ razzledazzle.c ships.c peepers.c crumbler.c quickhull.c \
+ maze3d.c
+
+OBJS = xscreensaver-gl-helper.o normals.o erase-gl.o fps-gl.o \
+ atlantis.o b_draw.o b_lockglue.o b_sphere.o bubble3d.o \
+ buildlwo.o cage.o dolphin.o gears.o lament.o lament_model.o \
+ moebius.o morph3d.o pipeobjs.o pipes.o rubik.o s1_1.o s1_2.o \
+ s1_3.o s1_4.o s1_5.o s1_6.o s1_b.o shark.o sproingies.o \
+ sproingiewrap.o stairs.o superquadrics.o swim.o whale.o \
+ xlock-gl-utils.o glplanet.o pulsar.o \
+ extrusion.o extrusion-helix2.o extrusion-helix3.o \
+ extrusion-helix4.o extrusion-joinoffset.o extrusion-screw.o \
+ extrusion-taper.o extrusion-twistoid.o sierpinski3d.o \
+ gflux.o stonerview.o stonerview-move.o stonerview-osc.o \
+ stonerview-view.o starwars.o glut_stroke.o glut_swidth.o \
+ gltext.o molecule.o dangerball.o sphere.o tube.o circuit.o \
+ menger.o engine.o flipscreen3d.o dnalogo.o \
+ grab-ximage.o glsnake.o boxed.o glforestfire.o sballs.o \
+ cubenetic.o spheremonics.o marching.o lavalite.o rotator.o \
+ trackball.o gltrackball.o queens.o endgame.o chessmodels.o \
+ glblur.o gllist.o flurry.o flurry-smoke.o flurry-spark.o \
+ flurry-star.o flurry-texture.o atunnel.o tunnel_draw.o \
+ flyingtoasters.o toaster.o toaster_base.o toaster_handle.o \
+ toaster_handle2.o toaster_jet.o toaster_knob.o \
+ toaster_slots.o toaster_wing.o toast.o toast2.o \
+ bouncingcow.o cow_face.o cow_hide.o cow_hoofs.o cow_horns.o \
+ cow_tail.o cow_udder.o glslideshow.o jigglypuff.o klein.o \
+ hypertorus.o glmatrix.o cubestorm.o glknots.o blocktube.o \
+ flipflop.o antspotlight.o polytopes.o gleidescope.o \
+ mirrorblob.o blinkbox.o noof.o polyhedra.o polyhedra-gl.o \
+ antinspect.o providence.o pinion.o involute.o boing.o \
+ texfont.o carousel.o fliptext.o antmaze.o tangram.o \
+ tangram_shapes.o crackberg.o glhanoi.o cube21.o \
+ timetunnel.o juggler3d.o topblock.o glschool.o \
+ glschool_gl.o glschool_alg.o glcells.o voronoi.o \
+ moebiusgears.o lockward.o cubicgrid.o hypnowheel.o \
+ skytentacles.o teapot.o sonar.o sonar-sim.o sonar-icmp.o \
+ jigsaw.o photopile.o dropshadow.o rubikblocks.o surfaces.o \
+ hilbert.o companion.o companion_quad.o companion_disc.o \
+ companion_heart.o tronbit.o tronbit_idle1.o tronbit_idle2.o \
+ tronbit_no.o tronbit_yes.o kaleidocycle.o \
+ quasicrystal.o unknownpleasures.o geodesic.o geodesicgears.o \
+ projectiveplane.o winduprobot.o robot.o robot-wireframe.o \
+ cityflow.o romanboy.o splitflap.o splitflap_obj.o \
+ dymaxionmap.o dymaxionmap-coords.o unicrud.o energystream.o \
+ raverhoop.o hydrostat.o discoball.o cubetwist.o cubestack.o \
+ splodesic.o hexstrut.o vigilance.o seccam.o esper.o \
+ razzledazzle.o ships.o peepers.o crumbler.o quickhull.o \
+ maze3d.o
+
+GL_EXES = cage gears moebius pipes sproingies stairs superquadrics \
+ morph3d rubik atlantis lament bubble3d glplanet pulsar \
+ sierpinski3d gflux stonerview starwars gltext molecule \
+ dangerball circuit menger engine flipscreen3d glsnake boxed \
+ sballs cubenetic spheremonics lavalite queens \
+ endgame glblur flurry atunnel flyingtoasters bouncingcow \
+ glslideshow jigglypuff klein hypertorus glmatrix cubestorm \
+ glknots blocktube flipflop antspotlight polytopes \
+ gleidescope mirrorblob blinkbox noof polyhedra \
+ antinspect providence pinion boing carousel fliptext \
+ antmaze tangram crackberg glhanoi cube21 timetunnel \
+ juggler3d topblock glschool glcells voronoi moebiusgears \
+ lockward cubicgrid hypnowheel skytentacles jigsaw photopile \
+ rubikblocks surfaces hilbert companioncube tronbit \
+ kaleidocycle quasicrystal unknownpleasures geodesic \
+ geodesicgears projectiveplane winduprobot cityflow romanboy \
+ splitflap dymaxionmap unicrud energystream raverhoop \
+ hydrostat discoball cubetwist cubestack splodesic \
+ hexstrut vigilance esper razzledazzle peepers crumbler \
+ maze3d
+GLE_EXES = extrusion
+SUID_EXES = sonar
+GL_UTIL_EXES = xscreensaver-gl-helper
+JWZGLES_OBJS = @JWZGLES_OBJS@
+HACK_EXES_1 = @GL_EXES@ @GLE_EXES@
+HACK_EXES = $(HACK_EXES_1) @SUID_EXES@
+XSHM_OBJS = $(UTILS_BIN)/xshm.o
+GRAB_OBJS = $(UTILS_BIN)/grabclient.o grab-ximage.o $(XSHM_OBJS)
+ANIM_OBJS = recanim-gl.o
+ANIM_LIBS = @PNG_LIBS@
+EXES = @GL_UTIL_EXES@ $(HACK_EXES)
+
+RETIRED_EXES = @RETIRED_GL_EXES@
+RETIRED_GL_EXES = glforestfire
+
+FPS_OBJS = texfont.o $(HACK_BIN)/fps.o fps-gl.o @XFT_OBJS@
+HACK_OBJS = $(JWZGLES_OBJS) $(HACK_BIN)/screenhack.o @ANIM_OBJS@ \
+ $(HACK_BIN)/xlockmore.o xlock-gl-utils.o erase-gl.o \
+ ${FPS_OBJS} $(UTILS_BIN)/resources.o $(UTILS_BIN)/visual.o \
+ $(UTILS_BIN)/visual-gl.o $(UTILS_BIN)/usleep.o \
+ $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/hsv.o \
+ $(UTILS_BIN)/colors.o $(UTILS_BIN)/async_netdb.o \
+ $(UTILS_BIN)/aligned_malloc.o $(UTILS_BIN)/thread_util.o \
+ $(UTILS_BIN)/utf8wc.o $(UTILS_BIN)/pow2.o \
+ $(UTILS_BIN)/font-retry-xft.o
+
+HDRS = atlantis.h bubble3d.h buildlwo.h e_textures.h \
+ grab-ximage.h tube.h sphere.h boxed.h \
+ stonerview.h stonerview-move.h stonerview-osc.h \
+ glutstroke.h glut_roman.h glut_mroman.h marching.h \
+ rotator.h trackball.h gltrackball.h chessmodels.h \
+ chessgames.h gllist.h flurry.h tunnel_draw.h ants.h \
+ polyhedra.h normals.h texfont.h tangram_shapes.h \
+ sproingies.h extrusion.h glschool.h glschool_gl.h \
+ glschool_alg.h topblock.h involute.h teapot.h sonar.h \
+ dropshadow.h starwars.h teapot2.h dnapizza.h curlicue.h \
+ quickhull.h dymaxionmap-coords.h
+GL_MEN = atlantis.man boxed.man bubble3d.man cage.man circuit.man \
+ cubenetic.man dangerball.man engine.man extrusion.man \
+ flipscreen3d.man gears.man gflux.man \
+ glplanet.man glsnake.man gltext.man lament.man lavalite.man \
+ menger.man moebius.man molecule.man morph3d.man pipes.man \
+ pulsar.man queens.man rubik.man sballs.man sierpinski3d.man \
+ spheremonics.man sproingies.man stairs.man starwars.man \
+ stonerview.man superquadrics.man xscreensaver-gl-helper.man \
+ endgame.man flurry.man glblur.man atunnel.man \
+ flyingtoasters.man bouncingcow.man glslideshow.man \
+ jigglypuff.man klein.man hypertorus.man glmatrix.man \
+ cubestorm.man glknots.man blocktube.man flipflop.man \
+ antspotlight.man polytopes.man gleidescope.man \
+ mirrorblob.man blinkbox.man noof.man polyhedra.man \
+ antinspect.man providence.man pinion.man boing.man \
+ carousel.man fliptext.man antmaze.man tangram.man \
+ crackberg.man glhanoi.man cube21.man timetunnel.man \
+ juggler3d.man topblock.man glschool.man glcells.man \
+ voronoi.man moebiusgears.man lockward.man cubicgrid.man \
+ hypnowheel.man skytentacles.man sonar.man jigsaw.man \
+ photopile.man rubikblocks.man surfaces.man hilbert.man \
+ companioncube.man tronbit.man kaleidocycle.man \
+ quasicrystal.man unknownpleasures.man geodesic.man \
+ geodesicgears.man projectiveplane.man winduprobot.man \
+ cityflow.man romanboy.man splitflap.man dymaxionmap.man \
+ unicrud.man energystream.man raverhoop.man hydrostat.man \
+ discoball.man cubetwist.man cubestack.man splodesic.man \
+ hexstrut.man vigilance.man esper.man razzledazzle.man \
+ peepers.man crumbler.man maze3d.man
+MEN = @GL_MEN@
+RETIRED_MEN = glforestfire.man
+EXTRAS = README Makefile.in dxf2gl.pl vrml2gl.pl wfront2gl.pl \
+ molecules.sh starwars.txt zalgo.txt *.dxf
+
+TARFILES = $(SRCS) $(HDRS) $(GL_MEN) $(RETIRED_MEN) $(EXTRAS)
+
+
+default: all
+all: $(EXES) $(RETIRED_EXES)
+
+install: install-program install-xml install-man
+uninstall: uninstall-program uninstall-xml uninstall-man
+
+install-strip:
+ $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install
+
+# the hacks, in $HACKDIR
+install-program:: $(EXES)
+ @exes="$(HACK_EXES_1)" ; \
+ idir="$(install_prefix)$(HACKDIR)" ; \
+ if [ "$$exes" != "" ]; then \
+ if [ ! -d $$idir ]; then \
+ $(INSTALL_DIRS) $$idir ; \
+ fi ; \
+ for program in $$exes; do \
+ echo $(INSTALL_PROGRAM) $$program $$idir/$$program ; \
+ $(INSTALL_PROGRAM) $$program $$idir/$$program ; \
+ done ; \
+ \
+ exes="$(SUID_EXES)" ; \
+ if [ @SETUID_HACKS@ = yes ]; then \
+ sinst="$(INSTALL_SETUID)" ; \
+ else \
+ sinst="$(INSTALL_PROGRAM)" ; \
+ fi ; \
+ for program in $$exes; do \
+ echo $$sinst $$program $$idir/$$program ; \
+ if $$sinst $$program $$idir/$$program ; then \
+ true ; \
+ elif [ @SETUID_HACKS@ = yes ]; then \
+ echo $(INSTALL_PROGRAM) $$program $$idir/$$program ; \
+ if $(INSTALL_PROGRAM) $$program $$idir/$$program ; then\
+ echo "" ; \
+ echo "WARNING: unable to install $$program setuid:" \
+ "installed non-setuid instead." ; \
+ echo "" ; \
+ else \
+ exit 1 ; \
+ fi ; \
+ else \
+ exit 1 ; \
+ fi ; \
+ done ; \
+ fi
+
+
+# the xscreensaver-gl-helper program, in $bindir
+install-program:: $(EXES)
+ @exes="@GL_UTIL_EXES@" ; \
+ idir="$(install_prefix)$(bindir)" ; \
+ if [ "$$exes" != "" ]; then \
+ if [ ! -d $$idir ]; then \
+ $(INSTALL_DIRS) $$idir ; \
+ fi ; \
+ for program in $$exes; do \
+ echo $(INSTALL_PROGRAM) $$program $$idir/$$program ; \
+ $(INSTALL_PROGRAM) $$program $$idir/$$program ; \
+ done ; \
+ fi
+
+# When installing man pages, we install "foo.man" as "foo.N" and update
+# the .TH line in the installed file with one like
+#
+# .TH XScreenSaver N "V.VV (DD-MMM-YYYY)" "X Version 11"
+#
+# where N is the manual section suffix.
+#
+install-man: $(MEN)
+ @men="$(MEN)" ; \
+ U=$(UTILS_SRC)/version.h ; \
+ V=`sed -n 's/.*xscreensaver \([0-9]\.[^)]*)\).*/\1/p' < $$U` ; \
+ T=/tmp/xs$$$$.$(mansuffix) ; \
+ TH=".TH XScreenSaver $(mansuffix) \"$$V\" \"X Version 11\"" ; \
+ echo "installing man pages: $$TH" ; \
+ \
+ if [ ! -d $(install_prefix)$(manNdir) ]; then \
+ $(INSTALL_DIRS) $(install_prefix)$(manNdir) ; \
+ fi ; \
+ \
+ for man in $$men; do \
+ instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \
+ manbase=`echo $$man | sed 's/\.man$$//'` ; \
+ TH=".TH $$manbase $(mansuffix) \"$$V\" \"X Version 11\" \"XScreenSaver manual\"" ; \
+ sed -e "s/^\.TH.*/$$TH/" \
+ -e 's@(MANSUFFIX)@($(mansuffix))@g' \
+ < $(srcdir)/$$man > $$T ; \
+ echo $(INSTALL_DATA) $(srcdir)/$$man \
+ $(install_prefix)$(manNdir)/$$instname ; \
+ $(INSTALL_DATA) $$T \
+ $(install_prefix)$(manNdir)/$$instname ; \
+ done ; \
+ rm -f $$T
+
+install-xml:
+ @dest=$(install_prefix)$(HACK_CONF_DIR) ; \
+ if [ ! -d $$dest ]; then \
+ $(INSTALL_DIRS) $$dest ; \
+ fi ; \
+ src=$(srcdir)/../config ; \
+ for file in $(EXES) $(SCRIPTS) ; do \
+ if [ -f $$src/$$file.xml ]; then \
+ echo $(INSTALL_DATA) $$src/$$file.xml $$dest/$$file.xml ; \
+ $(INSTALL_DATA) $$src/$$file.xml $$dest/$$file.xml ; \
+ fi ; \
+ done
+
+# the hacks, in $HACKDIR
+uninstall-program::
+ @exes="$(HACK_EXES) $(RETIRED_EXES)" ; \
+ idir="$(install_prefix)$(HACKDIR)" ; \
+ for program in $$exes; do \
+ echo rm -f $$idir/$$program ; \
+ rm -f $$idir/$$program ; \
+ done
+
+# the xscreensaver-gl-helper program, in $bindir
+uninstall-program::
+ @exes="$(GL_UTIL_EXES)" ; \
+ idir="$(install_prefix)$(bindir)" ; \
+ for program in $$exes; do \
+ echo rm -f $$idir/$$program ; \
+ rm -f $$idir/$$program ; \
+ done
+
+uninstall-man:
+ @men="$(MEN) $(RETIRED_MEN)" ; \
+ for man in $$men; do \
+ instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \
+ echo rm -f $(install_prefix)$(manNdir)/$$instname* ; \
+ rm -f $(install_prefix)$(manNdir)/$$instname* ; \
+ done
+
+uninstall-xml:
+ @dest=$(install_prefix)$(HACK_CONF_DIR) ; \
+ for file in $(EXES) $(RETIRED_EXES) $(SCRIPTS) ; do \
+ echo rm -f $$dest/$$file.xml ; \
+ rm -f $$dest/$$file.xml ; \
+ done
+
+clean::
+ -rm -f *.o a.out core $(EXES) $(RETIRED_EXES) molecules.h
+
+distclean: clean
+ -rm -f Makefile TAGS *~ "#"*
+
+# Adds all current dependencies to Makefile
+depend:
+ $(DEPEND) -s '# DO NOT DELETE: updated by make depend' \
+ $(DEPEND_FLAGS) -- \
+ $(INCLUDES) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \
+ $(SRCS)
+
+# Adds some dependencies to Makefile.in -- not totally accurate, but pretty
+# close. This excludes dependencies on files in /usr/include, etc. It tries
+# to include only dependencies on files which are themselves a part of this
+# package.
+distdepend:: molecules.h
+ @echo updating dependencies in `pwd`/Makefile.in... ; \
+ $(DEPEND) -w 0 -f - \
+ -s '# DO NOT DELETE: updated by make distdepend' $(DEPEND_FLAGS) -- \
+ $(INCLUDES_1) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \
+ $(SRCS) 2>/dev/null | \
+ sort -d | \
+ ( \
+ awk '/^# .*Makefile.in ---/,/^# DO .*distdepend/' < Makefile.in ; \
+ sed -e '/^#.*/d' \
+ -e 's@ \./@ @g;s@ /[^ ]*@@g;/^.*:$$/d' \
+ -e 's@\.\./\.\./utils@$$(UTILS_SRC)@g' \
+ -e 's@\.\./\.\./jwxyz@$$(JWXYZ_SRC)@g' \
+ -e 's@\.\./glx/@@g' \
+ -e 's@ \.\./@ $$(HACK_SRC)/@g' \
+ -e 's@ \([^$$]\)@ $$(srcdir)/\1@g' \
+ -e 's@ $$(srcdir)/\(.*config.h\)@ \1@g' \
+ -e 's@ $$(HACK_SRC)/\(.*config.h\)@ ../\1@g' \
+ -e 's@ $$(srcdir)/\(.*molecules.h\)@ \1@g' ; \
+ echo '' \
+ ) > /tmp/distdepend.$$$$ && \
+ mv /tmp/distdepend.$$$$ Makefile.in
+
+
+TAGS: tags
+tags:
+ find $(srcdir) -name '*.[chly]' -print | xargs etags -a
+
+echo_tarfiles:
+ @echo $(TARFILES)
+
+check_men:
+ @badmen="" ; \
+ for exe in $(EXES); do \
+ if ! [ -f $(srcdir)/$$exe.man ]; then \
+ badmen="$$badmen $$exe" ; \
+ fi ; \
+ done ; \
+ if [ -n "$$badmen" ]; then \
+ echo "" ; \
+ echo "Warning: The following programs have no manuals:" ; \
+ echo "" ; \
+ for m in $$badmen ; do \
+ echo " $$m" ; \
+ done ; \
+ fi
+
+validate_xml:
+ @echo "Validating XML..." ; \
+ cd $(HACK_SRC) ; ./check-configs.pl $(GL_EXES) $(GLE_EXES) $(SUID_EXES)
+
+distdepend:: check_men validate_xml
+
+
+
+# Rules for noticing when the objects from the utils and hacks
+# directories are out of date with respect to their sources, and going
+# and building them according to the rules in their own Makefile...
+#
+$(UTILS_BIN)/colors.o: $(UTILS_SRC)/colors.c
+$(UTILS_BIN)/grabclient.o: $(UTILS_SRC)/grabclient.c
+$(UTILS_BIN)/hsv.o: $(UTILS_SRC)/hsv.c
+$(UTILS_BIN)/resources.o: $(UTILS_SRC)/resources.c
+$(UTILS_BIN)/usleep.o: $(UTILS_SRC)/usleep.c
+$(UTILS_BIN)/visual.o: $(UTILS_SRC)/visual.c
+$(UTILS_BIN)/xmu.o: $(UTILS_SRC)/xmu.c
+$(UTILS_BIN)/xft.o: $(UTILS_SRC)/xft.c
+$(UTILS_BIN)/utf8wc.o: $(UTILS_SRC)/utf8wc.c
+$(UTILS_BIN)/logo.o: $(UTILS_SRC)/logo.c
+$(UTILS_BIN)/visual-gl.o: $(UTILS_SRC)/visual-gl.c
+$(UTILS_BIN)/yarandom.o: $(UTILS_SRC)/yarandom.c
+$(UTILS_BIN)/xshm.o: $(UTILS_SRC)/xshm.c
+$(UTILS_BIN)/textclient.o: $(UTILS_SRC)/textclient.c
+$(UTILS_BIN)/async_netdb.o: $(UTILS_SRC)/async_netdb.c
+$(UTILS_BIN)/aligned_malloc.o: $(UTILS_SRC)/aligned_malloc.c
+$(UTILS_BIN)/thread_util.o: $(UTILS_SRC)/thread_util.c
+$(UTILS_BIN)/spline.o: $(UTILS_SRC)/spline.c
+$(UTILS_BIN)/pow2.o: $(UTILS_SRC)/pow2.c
+$(UTILS_BIN)/font-retry-xft.o: $(UTILS_SRC)/font-retry.c
+$(HACK_BIN)/screenhack.o: $(HACK_SRC)/screenhack.c
+$(HACK_BIN)/xlockmore.o: $(HACK_SRC)/xlockmore.c
+$(HACK_BIN)/fps.o: $(HACK_SRC)/fps.c
+
+$(UTILDIR_OBJS):
+ cd $(UTILS_BIN) ; $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)"
+$(JWXYZ_OBJS):
+ cd $(JWXYZ_BIN) ; $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)"
+$(HACKDIR_OBJS):
+ cd $(HACK_BIN) ; $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)"
+
+
+# How we build object files in this directory.
+.c.o:
+ $(CC) -c $(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) $<
+
+# Make sure the images have been packaged. This is the first one hit:
+../images/gen/wood_png.h:
+ cd ../images && $(MAKE)
+
+# How to build the "xscreensaver-gl-helper" program, that lets the daemon
+# know which visual is the right one for GL programs.
+#
+HELPER_OBJS = xscreensaver-gl-helper.o $(UTILS_BIN)/visual-gl.o \
+ $(UTILS_BIN)/visual.o $(UTILS_BIN)/resources.o
+xscreensaver-gl-helper: $(HELPER_OBJS)
+ $(CC) $(LDFLAGS) -o $@ $(HELPER_OBJS) $(LIBS) $(X_LIBS) $(HACK_POST2)
+
+
+# These hacks use a slightly-differently-compiled variant of recanim.c.
+# This is how to make the the other .o file from it.
+#
+XLM_CFLAGS=-DUSE_GL $(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS)
+recanim-gl.o: $(HACK_SRC)/recanim.c
+ $(CC) -o $@ -c $(XLM_CFLAGS) $(HACK_SRC)/recanim.c
+
+CC_HACK = $(CC) $(LDFLAGS)
+
+
+TRACK_OBJS=rotator.o trackball.o gltrackball.o
+HACK_TRACK_OBJS=$(HACK_OBJS) $(TRACK_OBJS)
+HACK_GRAB_OBJS=$(HACK_OBJS) $(GRAB_OBJS)
+HACK_TRACK_GRAB_OBJS=$(HACK_TRACK_OBJS) $(GRAB_OBJS)
+TEXT=$(UTILS_BIN)/textclient.o
+
+ATLANTIS_OBJS = $(HACK_OBJS) dolphin.o shark.o swim.o whale.o $(PNG)
+atlantis: atlantis.o $(ATLANTIS_OBJS)
+ $(CC_HACK) -o $@ $@.o $(ATLANTIS_OBJS) $(PNG_LIBS)
+
+ATUNNEL_OBJS = $(HACK_OBJS) tunnel_draw.o $(PNG)
+atunnel: atunnel.o $(ATUNNEL_OBJS)
+ $(CC_HACK) -o $@ $@.o $(ATUNNEL_OBJS) $(PNG_LIBS)
+
+cage: cage.o $(PNG) $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PNG) $(HACK_OBJS) $(PNG_LIBS)
+
+FLURRY_OBJS_1 = flurry-smoke.o flurry-spark.o flurry-star.o flurry-texture.o
+FLURRY_OBJS = $(FLURRY_OBJS_1) $(HACK_OBJS)
+
+flurry: flurry.o $(FLURRY_OBJS)
+ $(CC_HACK) -o $@ $@.o $(FLURRY_OBJS) $(HACK_LIBS) -lm
+
+GEARS_OBJS_1=normals.o involute.o
+GEARS_OBJS=$(GEARS_OBJS_1) $(HACK_TRACK_OBJS)
+gears: gears.o tube.o $(GEARS_OBJS)
+ $(CC_HACK) -o $@ $@.o tube.o $(GEARS_OBJS) $(HACK_LIBS)
+
+MOEBIUS_OBJS=sphere.o tube.o $(PNG) $(HACK_TRACK_OBJS)
+moebius: moebius.o $(MOEBIUS_OBJS)
+ $(CC_HACK) -o $@ $@.o $(MOEBIUS_OBJS) $(HACK_LIBS) $(PNG_LIBS)
+
+PIPE_OBJS=pipeobjs.o buildlwo.o sphere.o teapot.o normals.o
+pipes: pipes.o $(PIPE_OBJS) $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PIPE_OBJS) $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+superquadrics: superquadrics.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+morph3d: morph3d.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+rubik: rubik.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+stairs: stairs.o sphere.o $(PNG) $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o sphere.o $(PNG) $(HACK_TRACK_OBJS) \
+ $(HACK_LIBS) $(PNG_LIBS)
+
+SPROINGIES = sproingiewrap.o gllist.o \
+ s1_1.o s1_2.o s1_3.o s1_4.o s1_5.o s1_6.o s1_b.o
+sproingies: sproingies.o $(HACK_OBJS) $(SPROINGIES)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(SPROINGIES) $(HACK_LIBS)
+
+LAMENTOBJS = gllist.o lament_model.o $(HACK_TRACK_OBJS) $(PNG) normals.o
+lament: lament.o $(LAMENTOBJS)
+ $(CC_HACK) -o $@ $@.o $(LAMENTOBJS) $(PNG_LIBS)
+
+lament_dxf::
+ ./dxf2gl.pl --smooth --layers lament.dxf lament_model.c
+
+
+B3D_OBJS = b_sphere.o b_draw.o b_lockglue.o $(HACK_OBJS)
+bubble3d: bubble3d.o $(B3D_OBJS)
+ $(CC_HACK) -o $@ $@.o $(B3D_OBJS) $(HACK_LIBS)
+
+PLANET_OBJS=sphere.o $(PNG) $(HACK_TRACK_OBJS)
+glplanet: glplanet.o $(PLANET_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PLANET_OBJS) $(PNG_LIBS)
+
+DYMAXIOBJS=dymaxionmap-coords.o normals.o $(PLANET_OBJS)
+dymaxionmap: dymaxionmap.o $(DYMAXIOBJS)
+ $(CC_HACK) -o $@ $@.o $(DYMAXIOBJS) $(PNG_LIBS)
+
+pulsar: pulsar.o $(HACK_OBJS) $(PNG)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(PNG) $(PNG_LIBS)
+
+EXTRUSION_OBJS=extrusion.o extrusion-helix2.o extrusion-helix3.o \
+ extrusion-helix4.o extrusion-joinoffset.o extrusion-screw.o \
+ extrusion-taper.o extrusion-twistoid.o $(PNG) \
+ $(HACK_TRACK_OBJS)
+extrusion: $(EXTRUSION_OBJS)
+ $(CC_HACK) -o $@ $(EXTRUSION_OBJS) $(GLE_LIBS)
+
+sierpinski3d: sierpinski3d.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+gflux: gflux.o $(HACK_TRACK_GRAB_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_GRAB_OBJS) $(HACK_LIBS)
+
+SW_OBJS=starwars.o glut_stroke.o glut_swidth.o $(TEXT) $(HACK_OBJS)
+starwars: $(SW_OBJS)
+ $(CC_HACK) -o $@ $(SW_OBJS) $(HACK_LIBS) $(TEXT_LIBS)
+
+GLT_OBJS=gltext.o glut_stroke.o glut_swidth.o tube.o sphere.o \
+ $(TEXT) $(HACK_TRACK_OBJS)
+gltext: $(GLT_OBJS)
+ $(CC_HACK) -o $@ $(GLT_OBJS) $(HACK_LIBS) $(TEXT_LIBS)
+
+DB_OBJS=sphere.o tube.o $(HACK_TRACK_OBJS)
+dangerball: dangerball.o $(DB_OBJS)
+ $(CC_HACK) -o $@ $@.o $(DB_OBJS) $(HACK_LIBS)
+
+circuit: circuit.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+menger: menger.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+engine: engine.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+flipscreen3d: flipscreen3d.o $(HACK_TRACK_GRAB_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_GRAB_OBJS) $(HACK_LIBS)
+
+glsnake: glsnake.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+boxed: boxed.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+glforestfire: glforestfire.o $(PNG) $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PNG) $(HACK_TRACK_OBJS) $(PNG_LIBS)
+
+sballs: sballs.o $(PNG) $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PNG) $(HACK_TRACK_OBJS) $(PNG_LIBS)
+
+cubenetic: cubenetic.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+spheremonics: spheremonics.o normals.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o normals.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+LL_OBJS=marching.o $(PNG) normals.o $(HACK_TRACK_OBJS)
+lavalite: lavalite.o $(LL_OBJS)
+ $(CC_HACK) -o $@ $@.o $(LL_OBJS) $(PNG_LIBS)
+
+queens: queens.o chessmodels.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o chessmodels.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+endgame: endgame.o chessmodels.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o chessmodels.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+glblur: glblur.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+TOAST_OBJS=\
+ toaster.o toaster_base.o toaster_handle.o toaster_handle2.o \
+ toaster_jet.o toaster_knob.o toaster_slots.o toaster_wing.o \
+ toast.o toast2.o \
+ flyingtoasters.o gllist.o $(PNG) $(HACK_TRACK_OBJS)
+flyingtoasters: $(TOAST_OBJS)
+ $(CC_HACK) -o $@ $(TOAST_OBJS) $(PNG_LIBS)
+
+toaster_dxf::
+ @set -e ; \
+ for f in \
+ toaster.dxf \
+ toaster_base.dxf \
+ toaster_handle.dxf \
+ toaster_handle2.dxf \
+ toaster_jet.dxf \
+ toaster_knob.dxf \
+ toaster_slots.dxf \
+ toaster_wing.dxf \
+ toast.dxf \
+ toast2.dxf \
+ ; do \
+ f2=`echo $$f | sed 's/dxf$$/c/'` ; \
+ ./dxf2gl.pl --normalize --smooth $$f $$f2 ; \
+ done ; \
+
+COW_OBJS=\
+ cow_face.o cow_hide.o cow_hoofs.o cow_horns.o cow_tail.o cow_udder.o \
+ bouncingcow.o gllist.o $(PNG) $(HACK_TRACK_OBJS)
+bouncingcow: $(COW_OBJS)
+ $(CC_HACK) -o $@ $(COW_OBJS) $(PNG_LIBS)
+
+ROBO_OBJS=\
+ robot.o robot-wireframe.o gllist.o $(PNG) sphere.o \
+ winduprobot.o $(GEARS_OBJS_1) $(TEXT) $(HACK_TRACK_OBJS)
+winduprobot: $(ROBO_OBJS)
+ $(CC_HACK) -o $@ $(ROBO_OBJS) $(PNG_LIBS) $(TEXT_LIBS)
+
+winduprobot_dxf::
+ ./dxf2gl.pl --smooth --layers robot.dxf robot.c
+ ./dxf2gl.pl --wireframe robot-wireframe.dxf robot-wireframe.c
+
+CAM_OBJS=seccam.o gllist.o vigilance.o $(HACK_TRACK_OBJS)
+vigilance: $(CAM_OBJS)
+ $(CC_HACK) -o $@ $(CAM_OBJS) $(HACK_LIBS)
+
+seccam_dxf::
+ ./dxf2gl.pl --smooth --layers seccam.dxf seccam.c
+
+glslideshow: glslideshow.o $(HACK_GRAB_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_GRAB_OBJS) $(HACK_LIBS)
+
+jigglypuff: jigglypuff.o $(PNG) $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PNG) $(HACK_TRACK_OBJS) $(PNG_LIBS)
+
+klein: klein.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+surfaces: surfaces.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+hypertorus: hypertorus.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+projectiveplane: projectiveplane.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+romanboy: romanboy.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+glmatrix: glmatrix.o $(PNG) $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PNG) $(HACK_OBJS) $(PNG_LIBS)
+
+cubestorm: cubestorm.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+glknots: glknots.o tube.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o tube.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+blocktube: blocktube.o $(PNG) $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PNG) $(HACK_OBJS) $(PNG_LIBS)
+
+flipflop: flipflop.o $(HACK_TRACK_GRAB_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_GRAB_OBJS) $(HACK_LIBS)
+
+antspotlight: antspotlight.o sphere.o $(HACK_TRACK_GRAB_OBJS)
+ $(CC_HACK) -o $@ $@.o sphere.o $(HACK_TRACK_GRAB_OBJS) $(HACK_LIBS)
+
+polytopes: polytopes.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+STONER_OBJS=stonerview-move.o stonerview-osc.o stonerview-view.o
+stonerview: stonerview.o $(STONER_OBJS) $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(STONER_OBJS) $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+molecules.h:
+ @echo "building molecules.h from $(HACK_SRC)/images/molecules/*.pdb"; \
+ UTILS_SRC="$(UTILS_SRC)" \
+ $(srcdir)/molecules.sh molecules.h $(HACK_SRC)/images/molecules/*.pdb
+
+MOLECULE_OBJS=sphere.o tube.o $(HACK_TRACK_OBJS)
+molecule.o: molecules.h
+molecule: molecule.o $(MOLECULE_OBJS)
+ $(CC_HACK) -o $@ $@.o $(MOLECULE_OBJS) $(HACK_LIBS)
+
+gleidescope: gleidescope.o $(PNG) $(HACK_GRAB_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PNG) $(HACK_GRAB_OBJS) $(PNG_LIBS)
+
+mirrorblob: mirrorblob.o $(HACK_TRACK_GRAB_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_GRAB_OBJS) $(PNG_LIBS)
+
+blinkbox: blinkbox.o sphere.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o sphere.o $(HACK_OBJS) $(HACK_LIBS)
+
+noof: noof.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+PH_OBJS=polyhedra-gl.o normals.o teapot.o $(HACK_TRACK_OBJS)
+polyhedra: polyhedra.o $(PH_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PH_OBJS) $(HACK_LIBS)
+
+antinspect: antinspect.o sphere.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o sphere.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+providence: providence.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+pinion: pinion.o $(GEARS_OBJS)
+ $(CC_HACK) -o $@ $@.o $(GEARS_OBJS) $(HACK_LIBS)
+
+moebiusgears: moebiusgears.o $(GEARS_OBJS)
+ $(CC_HACK) -o $@ $@.o $(GEARS_OBJS) $(HACK_LIBS)
+
+boing: boing.o normals.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o normals.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+carousel: carousel.o $(HACK_TRACK_GRAB_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_GRAB_OBJS) $(HACK_LIBS)
+
+fliptext: fliptext.o $(TEXT) $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(TEXT) $(HACK_OBJS) $(HACK_LIBS) $(TEXT_LIBS)
+
+antmaze: antmaze.o sphere.o tube.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o sphere.o tube.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+TANGRAM_OBJS=tangram_shapes.o $(HACK_OBJS)
+tangram: tangram.o $(TANGRAM_OBJS)
+ $(CC_HACK) -o $@ $@.o $(TANGRAM_OBJS) $(HACK_LIBS)
+
+crackberg: crackberg.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+glhanoi: glhanoi.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+cube21: cube21.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+TIMETUNNEL_OBJS = $(PNG) $(HACK_TRACK_OBJS)
+timetunnel: timetunnel.o $(TIMETUNNEL_OBJS)
+ $(CC_HACK) -o $@ $@.o $(TIMETUNNEL_OBJS) $(PNG_LIBS)
+
+JUGG_OBJS=sphere.o tube.o $(HACK_TRACK_OBJS)
+juggler3d: juggler3d.o $(JUGG_OBJS)
+ $(CC_HACK) -o $@ $@.o $(JUGG_OBJS) $(HACK_LIBS)
+
+dnalogo: dnalogo.o tube.o sphere.o normals.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o tube.o sphere.o normals.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+topblock: topblock.o sphere.o tube.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o sphere.o tube.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+SCHOOL_OBJS=glschool.o glschool_alg.o glschool_gl.o \
+ sphere.o tube.o normals.o $(HACK_OBJS)
+glschool: $(SCHOOL_OBJS)
+ $(CC_HACK) -o $@ $(SCHOOL_OBJS) $(HACK_LIBS)
+
+glcells: glcells.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+voronoi: voronoi.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+lockward: lockward.o $(HACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS)
+
+cubicgrid: cubicgrid.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+hypnowheel: hypnowheel.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+TENTACLE_OBJS=normals.o $(PNG) $(HACK_TRACK_OBJS)
+skytentacles: skytentacles.o $(TENTACLE_OBJS)
+ $(CC_HACK) -o $@ $@.o $(TENTACLE_OBJS) $(PNG_LIBS)
+
+SONAR_OBJS=sonar-sim.o sonar-icmp.o $(HACK_TRACK_OBJS)
+sonar: sonar.o $(SONAR_OBJS)
+ $(CC_HACK) -o $@ $@.o $(SONAR_OBJS) $(HACK_LIBS)
+
+JIGSAW_OBJS=normals.o $(UTILS_BIN)/spline.o $(HACK_TRACK_GRAB_OBJS)
+jigsaw: jigsaw.o $(JIGSAW_OBJS)
+ $(CC_HACK) -o $@ $@.o $(JIGSAW_OBJS) $(HACK_LIBS)
+
+PHOTOPILE_OBJS=dropshadow.o $(HACK_GRAB_OBJS)
+photopile: photopile.o $(PHOTOPILE_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PHOTOPILE_OBJS) $(HACK_LIBS)
+
+rubikblocks: rubikblocks.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+HILB_OBJS=sphere.o tube.o $(HACK_TRACK_OBJS)
+hilbert: hilbert.o $(HILB_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HILB_OBJS) $(HACK_LIBS)
+
+CCUBE_OBJS=companion.o companion_quad.o companion_disc.o companion_heart.o \
+ gllist.o $(HACK_TRACK_OBJS)
+companioncube: $(CCUBE_OBJS)
+ $(CC_HACK) -o $@ $(CCUBE_OBJS) $(HACK_LIBS)
+
+TBIT_OBJS=tronbit.o tronbit_idle1.o tronbit_idle2.o tronbit_no.o tronbit_yes.o\
+ gllist.o $(HACK_TRACK_OBJS)
+tronbit: $(TBIT_OBJS)
+ $(CC_HACK) -o $@ $(TBIT_OBJS) $(HACK_LIBS)
+
+KALEIDOCYCLE_OBJS=kaleidocycle.o normals.o $(HACK_TRACK_OBJS)
+kaleidocycle: $(KALEIDOCYCLE_OBJS)
+ $(CC_HACK) -o $@ $(KALEIDOCYCLE_OBJS) $(HACK_LIBS)
+
+quasicrystal: quasicrystal.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+unknownpleasures: unknownpleasures.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+geodesic: geodesic.o normals.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o normals.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+geodesicgears: geodesicgears.o $(GEARS_OBJS)
+ $(CC_HACK) -o $@ $@.o $(GEARS_OBJS) $(HACK_LIBS)
+
+cityflow: cityflow.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+splitflap_dxf::
+ ./dxf2gl.pl --normalize --smooth --layers splitflap.dxf splitflap_obj.c
+
+FLAP_OBJS=splitflap_obj.o gllist.o splitflap.o $(TEXT) $(HACK_TRACK_OBJS)
+splitflap: $(FLAP_OBJS)
+ $(CC_HACK) -o $@ $(FLAP_OBJS) $(PNG_LIBS) $(TEXT_LIBS)
+
+unicrud: unicrud.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+ES_OBJS=$(PNG) $(HACK_TRACK_OBJS)
+energystream: energystream.o $(ES_OBJS)
+ $(CC_HACK) -o $@ $@.o $(ES_OBJS) $(PNG_LIBS) $(HACK_LIBS)
+
+raverhoop: raverhoop.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+HSTAT_OBJS=sphere.o normals.o $(HACK_TRACK_OBJS)
+hydrostat: hydrostat.o $(HSTAT_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HSTAT_OBJS) $(HACK_LIBS)
+
+discoball: discoball.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+cubetwist: cubetwist.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+cubestack: cubestack.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+splodesic: splodesic.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+hexstrut: hexstrut.o normals.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o normals.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+esper: esper.o $(HACK_GRAB_OBJS)
+ $(CC_HACK) -o $@ $@.o $(HACK_GRAB_OBJS) $(HACK_LIBS)
+
+ships_dxf::
+ ./dxf2gl.pl --normalize --layers ships.dxf ships.c
+
+DAZ_OBJS=ships.o gllist.o $(HACK_TRACK_OBJS)
+razzledazzle: razzledazzle.o $(DAZ_OBJS)
+ $(CC_HACK) -o $@ $@.o $(DAZ_OBJS) $(HACK_LIBS)
+
+peepers: peepers.o normals.o $(PNG) $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o normals.o $(PNG) $(PNG_LIBS) $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+crumbler: crumbler.o quickhull.o $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o quickhull.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+maze3d: maze3d.o $(PNG) $(HACK_TRACK_OBJS)
+ $(CC_HACK) -o $@ $@.o $(PNG) $(PNG_LIBS) $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+##############################################################################
+#
+# DO NOT DELETE: updated by make distdepend
+
+antinspect.o: ../../config.h
+antinspect.o: $(HACK_SRC)/fps.h
+antinspect.o: $(srcdir)/gltrackball.h
+antinspect.o: $(HACK_SRC)/recanim.h
+antinspect.o: $(HACK_SRC)/screenhackI.h
+antinspect.o: $(srcdir)/sphere.h
+antinspect.o: $(UTILS_SRC)/colors.h
+antinspect.o: $(UTILS_SRC)/erase.h
+antinspect.o: $(UTILS_SRC)/font-retry.h
+antinspect.o: $(UTILS_SRC)/grabscreen.h
+antinspect.o: $(UTILS_SRC)/hsv.h
+antinspect.o: $(UTILS_SRC)/resources.h
+antinspect.o: $(UTILS_SRC)/usleep.h
+antinspect.o: $(UTILS_SRC)/visual.h
+antinspect.o: $(UTILS_SRC)/yarandom.h
+antinspect.o: $(HACK_SRC)/xlockmoreI.h
+antinspect.o: $(HACK_SRC)/xlockmore.h
+antmaze.o: $(srcdir)/ants.h
+antmaze.o: ../../config.h
+antmaze.o: $(HACK_SRC)/fps.h
+antmaze.o: $(srcdir)/gltrackball.h
+antmaze.o: $(HACK_SRC)/recanim.h
+antmaze.o: $(srcdir)/rotator.h
+antmaze.o: $(HACK_SRC)/screenhackI.h
+antmaze.o: $(srcdir)/sphere.h
+antmaze.o: $(srcdir)/tube.h
+antmaze.o: $(UTILS_SRC)/colors.h
+antmaze.o: $(UTILS_SRC)/erase.h
+antmaze.o: $(UTILS_SRC)/font-retry.h
+antmaze.o: $(UTILS_SRC)/grabscreen.h
+antmaze.o: $(UTILS_SRC)/hsv.h
+antmaze.o: $(UTILS_SRC)/resources.h
+antmaze.o: $(UTILS_SRC)/usleep.h
+antmaze.o: $(UTILS_SRC)/visual.h
+antmaze.o: $(UTILS_SRC)/yarandom.h
+antmaze.o: $(HACK_SRC)/xlockmoreI.h
+antmaze.o: $(HACK_SRC)/xlockmore.h
+antspotlight.o: $(srcdir)/ants.h
+antspotlight.o: ../../config.h
+antspotlight.o: $(HACK_SRC)/fps.h
+antspotlight.o: $(srcdir)/gltrackball.h
+antspotlight.o: $(srcdir)/grab-ximage.h
+antspotlight.o: $(HACK_SRC)/recanim.h
+antspotlight.o: $(srcdir)/rotator.h
+antspotlight.o: $(HACK_SRC)/screenhackI.h
+antspotlight.o: $(srcdir)/sphere.h
+antspotlight.o: $(srcdir)/tube.h
+antspotlight.o: $(UTILS_SRC)/colors.h
+antspotlight.o: $(UTILS_SRC)/erase.h
+antspotlight.o: $(UTILS_SRC)/font-retry.h
+antspotlight.o: $(UTILS_SRC)/grabscreen.h
+antspotlight.o: $(UTILS_SRC)/hsv.h
+antspotlight.o: $(UTILS_SRC)/resources.h
+antspotlight.o: $(UTILS_SRC)/usleep.h
+antspotlight.o: $(UTILS_SRC)/visual.h
+antspotlight.o: $(UTILS_SRC)/yarandom.h
+antspotlight.o: $(HACK_SRC)/xlockmoreI.h
+antspotlight.o: $(HACK_SRC)/xlockmore.h
+atlantis.o: $(srcdir)/atlantis.h
+atlantis.o: ../../config.h
+atlantis.o: $(HACK_SRC)/fps.h
+atlantis.o: $(HACK_SRC)/images/gen/sea-texture_png.h
+atlantis.o: $(HACK_SRC)/recanim.h
+atlantis.o: $(HACK_SRC)/screenhackI.h
+atlantis.o: $(UTILS_SRC)/colors.h
+atlantis.o: $(UTILS_SRC)/erase.h
+atlantis.o: $(UTILS_SRC)/font-retry.h
+atlantis.o: $(UTILS_SRC)/grabscreen.h
+atlantis.o: $(UTILS_SRC)/hsv.h
+atlantis.o: $(UTILS_SRC)/resources.h
+atlantis.o: $(UTILS_SRC)/usleep.h
+atlantis.o: $(UTILS_SRC)/visual.h
+atlantis.o: $(UTILS_SRC)/yarandom.h
+atlantis.o: $(HACK_SRC)/ximage-loader.h
+atlantis.o: $(HACK_SRC)/xlockmoreI.h
+atlantis.o: $(HACK_SRC)/xlockmore.h
+atunnel.o: ../../config.h
+atunnel.o: $(HACK_SRC)/fps.h
+atunnel.o: $(HACK_SRC)/images/gen/tunnel0_png.h
+atunnel.o: $(HACK_SRC)/images/gen/tunnel1_png.h
+atunnel.o: $(HACK_SRC)/images/gen/tunnel2_png.h
+atunnel.o: $(HACK_SRC)/images/gen/tunnel3_png.h
+atunnel.o: $(HACK_SRC)/images/gen/tunnel4_png.h
+atunnel.o: $(HACK_SRC)/images/gen/tunnel5_png.h
+atunnel.o: $(HACK_SRC)/recanim.h
+atunnel.o: $(HACK_SRC)/screenhackI.h
+atunnel.o: $(srcdir)/tunnel_draw.h
+atunnel.o: $(UTILS_SRC)/colors.h
+atunnel.o: $(UTILS_SRC)/erase.h
+atunnel.o: $(UTILS_SRC)/font-retry.h
+atunnel.o: $(UTILS_SRC)/grabscreen.h
+atunnel.o: $(UTILS_SRC)/hsv.h
+atunnel.o: $(UTILS_SRC)/resources.h
+atunnel.o: $(UTILS_SRC)/usleep.h
+atunnel.o: $(UTILS_SRC)/visual.h
+atunnel.o: $(UTILS_SRC)/yarandom.h
+atunnel.o: $(HACK_SRC)/ximage-loader.h
+atunnel.o: $(HACK_SRC)/xlockmoreI.h
+atunnel.o: $(HACK_SRC)/xlockmore.h
+b_draw.o: $(srcdir)/bubble3d.h
+b_draw.o: ../../config.h
+b_draw.o: $(HACK_SRC)/fps.h
+b_draw.o: $(HACK_SRC)/recanim.h
+b_draw.o: $(HACK_SRC)/screenhackI.h
+b_draw.o: $(UTILS_SRC)/colors.h
+b_draw.o: $(UTILS_SRC)/erase.h
+b_draw.o: $(UTILS_SRC)/font-retry.h
+b_draw.o: $(UTILS_SRC)/grabscreen.h
+b_draw.o: $(UTILS_SRC)/hsv.h
+b_draw.o: $(UTILS_SRC)/resources.h
+b_draw.o: $(UTILS_SRC)/usleep.h
+b_draw.o: $(UTILS_SRC)/visual.h
+b_draw.o: $(UTILS_SRC)/yarandom.h
+b_draw.o: $(HACK_SRC)/xlockmoreI.h
+blinkbox.o: ../../config.h
+blinkbox.o: $(HACK_SRC)/fps.h
+blinkbox.o: $(HACK_SRC)/recanim.h
+blinkbox.o: $(HACK_SRC)/screenhackI.h
+blinkbox.o: $(srcdir)/sphere.h
+blinkbox.o: $(UTILS_SRC)/colors.h
+blinkbox.o: $(UTILS_SRC)/erase.h
+blinkbox.o: $(UTILS_SRC)/font-retry.h
+blinkbox.o: $(UTILS_SRC)/grabscreen.h
+blinkbox.o: $(UTILS_SRC)/hsv.h
+blinkbox.o: $(UTILS_SRC)/resources.h
+blinkbox.o: $(UTILS_SRC)/usleep.h
+blinkbox.o: $(UTILS_SRC)/visual.h
+blinkbox.o: $(UTILS_SRC)/yarandom.h
+blinkbox.o: $(HACK_SRC)/xlockmoreI.h
+blinkbox.o: $(HACK_SRC)/xlockmore.h
+b_lockglue.o: $(srcdir)/bubble3d.h
+b_lockglue.o: ../../config.h
+b_lockglue.o: $(HACK_SRC)/fps.h
+b_lockglue.o: $(HACK_SRC)/recanim.h
+b_lockglue.o: $(HACK_SRC)/screenhackI.h
+b_lockglue.o: $(UTILS_SRC)/colors.h
+b_lockglue.o: $(UTILS_SRC)/erase.h
+b_lockglue.o: $(UTILS_SRC)/font-retry.h
+b_lockglue.o: $(UTILS_SRC)/grabscreen.h
+b_lockglue.o: $(UTILS_SRC)/hsv.h
+b_lockglue.o: $(UTILS_SRC)/resources.h
+b_lockglue.o: $(UTILS_SRC)/usleep.h
+b_lockglue.o: $(UTILS_SRC)/visual.h
+b_lockglue.o: $(UTILS_SRC)/yarandom.h
+b_lockglue.o: $(HACK_SRC)/xlockmoreI.h
+b_lockglue.o: $(HACK_SRC)/xlockmore.h
+blocktube.o: ../../config.h
+blocktube.o: $(HACK_SRC)/fps.h
+blocktube.o: $(HACK_SRC)/images/gen/blocktube_png.h
+blocktube.o: $(HACK_SRC)/recanim.h
+blocktube.o: $(HACK_SRC)/screenhackI.h
+blocktube.o: $(UTILS_SRC)/colors.h
+blocktube.o: $(UTILS_SRC)/erase.h
+blocktube.o: $(UTILS_SRC)/font-retry.h
+blocktube.o: $(UTILS_SRC)/grabscreen.h
+blocktube.o: $(UTILS_SRC)/hsv.h
+blocktube.o: $(UTILS_SRC)/resources.h
+blocktube.o: $(UTILS_SRC)/usleep.h
+blocktube.o: $(UTILS_SRC)/visual.h
+blocktube.o: $(UTILS_SRC)/yarandom.h
+blocktube.o: $(HACK_SRC)/ximage-loader.h
+blocktube.o: $(HACK_SRC)/xlockmoreI.h
+blocktube.o: $(HACK_SRC)/xlockmore.h
+boing.o: ../../config.h
+boing.o: $(HACK_SRC)/fps.h
+boing.o: $(srcdir)/gltrackball.h
+boing.o: $(HACK_SRC)/recanim.h
+boing.o: $(HACK_SRC)/screenhackI.h
+boing.o: $(UTILS_SRC)/colors.h
+boing.o: $(UTILS_SRC)/erase.h
+boing.o: $(UTILS_SRC)/font-retry.h
+boing.o: $(UTILS_SRC)/grabscreen.h
+boing.o: $(UTILS_SRC)/hsv.h
+boing.o: $(UTILS_SRC)/resources.h
+boing.o: $(UTILS_SRC)/usleep.h
+boing.o: $(UTILS_SRC)/visual.h
+boing.o: $(UTILS_SRC)/yarandom.h
+boing.o: $(HACK_SRC)/xlockmoreI.h
+boing.o: $(HACK_SRC)/xlockmore.h
+bouncingcow.o: ../../config.h
+bouncingcow.o: $(HACK_SRC)/fps.h
+bouncingcow.o: $(srcdir)/gllist.h
+bouncingcow.o: $(srcdir)/gltrackball.h
+bouncingcow.o: $(HACK_SRC)/recanim.h
+bouncingcow.o: $(srcdir)/rotator.h
+bouncingcow.o: $(HACK_SRC)/screenhackI.h
+bouncingcow.o: $(UTILS_SRC)/colors.h
+bouncingcow.o: $(UTILS_SRC)/erase.h
+bouncingcow.o: $(UTILS_SRC)/font-retry.h
+bouncingcow.o: $(UTILS_SRC)/grabscreen.h
+bouncingcow.o: $(UTILS_SRC)/hsv.h
+bouncingcow.o: $(UTILS_SRC)/resources.h
+bouncingcow.o: $(UTILS_SRC)/usleep.h
+bouncingcow.o: $(UTILS_SRC)/visual.h
+bouncingcow.o: $(UTILS_SRC)/yarandom.h
+bouncingcow.o: $(HACK_SRC)/ximage-loader.h
+bouncingcow.o: $(HACK_SRC)/xlockmoreI.h
+bouncingcow.o: $(HACK_SRC)/xlockmore.h
+boxed.o: $(srcdir)/boxed.h
+boxed.o: ../../config.h
+boxed.o: $(HACK_SRC)/fps.h
+boxed.o: $(HACK_SRC)/recanim.h
+boxed.o: $(HACK_SRC)/screenhackI.h
+boxed.o: $(UTILS_SRC)/colors.h
+boxed.o: $(UTILS_SRC)/erase.h
+boxed.o: $(UTILS_SRC)/font-retry.h
+boxed.o: $(UTILS_SRC)/grabscreen.h
+boxed.o: $(UTILS_SRC)/hsv.h
+boxed.o: $(UTILS_SRC)/resources.h
+boxed.o: $(UTILS_SRC)/usleep.h
+boxed.o: $(UTILS_SRC)/visual.h
+boxed.o: $(UTILS_SRC)/yarandom.h
+boxed.o: $(HACK_SRC)/xlockmoreI.h
+boxed.o: $(HACK_SRC)/xlockmore.h
+b_sphere.o: $(srcdir)/bubble3d.h
+b_sphere.o: ../../config.h
+b_sphere.o: $(HACK_SRC)/fps.h
+b_sphere.o: $(HACK_SRC)/recanim.h
+b_sphere.o: $(HACK_SRC)/screenhackI.h
+b_sphere.o: $(UTILS_SRC)/colors.h
+b_sphere.o: $(UTILS_SRC)/erase.h
+b_sphere.o: $(UTILS_SRC)/font-retry.h
+b_sphere.o: $(UTILS_SRC)/grabscreen.h
+b_sphere.o: $(UTILS_SRC)/hsv.h
+b_sphere.o: $(UTILS_SRC)/resources.h
+b_sphere.o: $(UTILS_SRC)/usleep.h
+b_sphere.o: $(UTILS_SRC)/visual.h
+b_sphere.o: $(UTILS_SRC)/yarandom.h
+b_sphere.o: $(HACK_SRC)/xlockmoreI.h
+bubble3d.o: $(srcdir)/bubble3d.h
+bubble3d.o: ../../config.h
+bubble3d.o: $(HACK_SRC)/fps.h
+bubble3d.o: $(HACK_SRC)/recanim.h
+bubble3d.o: $(HACK_SRC)/screenhackI.h
+bubble3d.o: $(UTILS_SRC)/colors.h
+bubble3d.o: $(UTILS_SRC)/erase.h
+bubble3d.o: $(UTILS_SRC)/font-retry.h
+bubble3d.o: $(UTILS_SRC)/grabscreen.h
+bubble3d.o: $(UTILS_SRC)/hsv.h
+bubble3d.o: $(UTILS_SRC)/resources.h
+bubble3d.o: $(UTILS_SRC)/usleep.h
+bubble3d.o: $(UTILS_SRC)/visual.h
+bubble3d.o: $(UTILS_SRC)/yarandom.h
+bubble3d.o: $(HACK_SRC)/xlockmoreI.h
+buildlwo.o: $(srcdir)/buildlwo.h
+buildlwo.o: ../../config.h
+cage.o: ../../config.h
+cage.o: $(HACK_SRC)/fps.h
+cage.o: $(HACK_SRC)/images/gen/wood_png.h
+cage.o: $(HACK_SRC)/recanim.h
+cage.o: $(HACK_SRC)/screenhackI.h
+cage.o: $(UTILS_SRC)/colors.h
+cage.o: $(UTILS_SRC)/erase.h
+cage.o: $(UTILS_SRC)/font-retry.h
+cage.o: $(UTILS_SRC)/grabscreen.h
+cage.o: $(UTILS_SRC)/hsv.h
+cage.o: $(UTILS_SRC)/resources.h
+cage.o: $(UTILS_SRC)/usleep.h
+cage.o: $(UTILS_SRC)/visual.h
+cage.o: $(UTILS_SRC)/yarandom.h
+cage.o: $(HACK_SRC)/ximage-loader.h
+cage.o: $(HACK_SRC)/xlockmoreI.h
+cage.o: $(HACK_SRC)/xlockmore.h
+carousel.o: ../../config.h
+carousel.o: $(HACK_SRC)/fps.h
+carousel.o: $(srcdir)/gltrackball.h
+carousel.o: $(srcdir)/grab-ximage.h
+carousel.o: $(HACK_SRC)/recanim.h
+carousel.o: $(srcdir)/rotator.h
+carousel.o: $(HACK_SRC)/screenhackI.h
+carousel.o: $(srcdir)/texfont.h
+carousel.o: $(UTILS_SRC)/colors.h
+carousel.o: $(UTILS_SRC)/erase.h
+carousel.o: $(UTILS_SRC)/font-retry.h
+carousel.o: $(UTILS_SRC)/grabscreen.h
+carousel.o: $(UTILS_SRC)/hsv.h
+carousel.o: $(UTILS_SRC)/resources.h
+carousel.o: $(UTILS_SRC)/usleep.h
+carousel.o: $(UTILS_SRC)/visual.h
+carousel.o: $(UTILS_SRC)/yarandom.h
+carousel.o: $(HACK_SRC)/xlockmoreI.h
+carousel.o: $(HACK_SRC)/xlockmore.h
+chessmodels.o: $(srcdir)/chessmodels.h
+chessmodels.o: ../../config.h
+circuit.o: ../../config.h
+circuit.o: $(HACK_SRC)/fps.h
+circuit.o: $(HACK_SRC)/recanim.h
+circuit.o: $(HACK_SRC)/screenhackI.h
+circuit.o: $(srcdir)/texfont.h
+circuit.o: $(UTILS_SRC)/colors.h
+circuit.o: $(UTILS_SRC)/erase.h
+circuit.o: $(UTILS_SRC)/font-retry.h
+circuit.o: $(UTILS_SRC)/grabscreen.h
+circuit.o: $(UTILS_SRC)/hsv.h
+circuit.o: $(UTILS_SRC)/resources.h
+circuit.o: $(UTILS_SRC)/usleep.h
+circuit.o: $(UTILS_SRC)/visual.h
+circuit.o: $(UTILS_SRC)/yarandom.h
+circuit.o: $(HACK_SRC)/xlockmoreI.h
+circuit.o: $(HACK_SRC)/xlockmore.h
+cityflow.o: ../../config.h
+cityflow.o: $(HACK_SRC)/fps.h
+cityflow.o: $(srcdir)/gltrackball.h
+cityflow.o: $(HACK_SRC)/recanim.h
+cityflow.o: $(HACK_SRC)/screenhackI.h
+cityflow.o: $(UTILS_SRC)/colors.h
+cityflow.o: $(UTILS_SRC)/erase.h
+cityflow.o: $(UTILS_SRC)/font-retry.h
+cityflow.o: $(UTILS_SRC)/grabscreen.h
+cityflow.o: $(UTILS_SRC)/hsv.h
+cityflow.o: $(UTILS_SRC)/resources.h
+cityflow.o: $(UTILS_SRC)/usleep.h
+cityflow.o: $(UTILS_SRC)/visual.h
+cityflow.o: $(UTILS_SRC)/yarandom.h
+cityflow.o: $(HACK_SRC)/xlockmoreI.h
+cityflow.o: $(HACK_SRC)/xlockmore.h
+companion_disc.o: ../../config.h
+companion_disc.o: $(srcdir)/gllist.h
+companion_heart.o: ../../config.h
+companion_heart.o: $(srcdir)/gllist.h
+companion.o: ../../config.h
+companion.o: $(HACK_SRC)/fps.h
+companion.o: $(srcdir)/gllist.h
+companion.o: $(srcdir)/gltrackball.h
+companion.o: $(HACK_SRC)/recanim.h
+companion.o: $(srcdir)/rotator.h
+companion.o: $(HACK_SRC)/screenhackI.h
+companion.o: $(UTILS_SRC)/colors.h
+companion.o: $(UTILS_SRC)/erase.h
+companion.o: $(UTILS_SRC)/font-retry.h
+companion.o: $(UTILS_SRC)/grabscreen.h
+companion.o: $(UTILS_SRC)/hsv.h
+companion.o: $(UTILS_SRC)/resources.h
+companion.o: $(UTILS_SRC)/usleep.h
+companion.o: $(UTILS_SRC)/visual.h
+companion.o: $(UTILS_SRC)/yarandom.h
+companion.o: $(HACK_SRC)/ximage-loader.h
+companion.o: $(HACK_SRC)/xlockmoreI.h
+companion.o: $(HACK_SRC)/xlockmore.h
+companion_quad.o: ../../config.h
+companion_quad.o: $(srcdir)/gllist.h
+cow_face.o: ../../config.h
+cow_face.o: $(srcdir)/gllist.h
+cow_hide.o: ../../config.h
+cow_hide.o: $(srcdir)/gllist.h
+cow_hoofs.o: ../../config.h
+cow_hoofs.o: $(srcdir)/gllist.h
+cow_horns.o: ../../config.h
+cow_horns.o: $(srcdir)/gllist.h
+cow_tail.o: ../../config.h
+cow_tail.o: $(srcdir)/gllist.h
+cow_udder.o: ../../config.h
+cow_udder.o: $(srcdir)/gllist.h
+crackberg.o: ../../config.h
+crackberg.o: $(HACK_SRC)/fps.h
+crackberg.o: $(HACK_SRC)/recanim.h
+crackberg.o: $(HACK_SRC)/screenhackI.h
+crackberg.o: $(UTILS_SRC)/colors.h
+crackberg.o: $(UTILS_SRC)/erase.h
+crackberg.o: $(UTILS_SRC)/font-retry.h
+crackberg.o: $(UTILS_SRC)/grabscreen.h
+crackberg.o: $(UTILS_SRC)/hsv.h
+crackberg.o: $(UTILS_SRC)/resources.h
+crackberg.o: $(UTILS_SRC)/usleep.h
+crackberg.o: $(UTILS_SRC)/visual.h
+crackberg.o: $(UTILS_SRC)/yarandom.h
+crackberg.o: $(HACK_SRC)/xlockmoreI.h
+crackberg.o: $(HACK_SRC)/xlockmore.h
+crumbler.o: ../../config.h
+crumbler.o: $(HACK_SRC)/fps.h
+crumbler.o: $(srcdir)/gltrackball.h
+crumbler.o: $(srcdir)/quickhull.h
+crumbler.o: $(HACK_SRC)/recanim.h
+crumbler.o: $(srcdir)/rotator.h
+crumbler.o: $(HACK_SRC)/screenhackI.h
+crumbler.o: $(UTILS_SRC)/colors.h
+crumbler.o: $(UTILS_SRC)/erase.h
+crumbler.o: $(UTILS_SRC)/font-retry.h
+crumbler.o: $(UTILS_SRC)/grabscreen.h
+crumbler.o: $(UTILS_SRC)/hsv.h
+crumbler.o: $(UTILS_SRC)/resources.h
+crumbler.o: $(UTILS_SRC)/usleep.h
+crumbler.o: $(UTILS_SRC)/visual.h
+crumbler.o: $(UTILS_SRC)/yarandom.h
+crumbler.o: $(HACK_SRC)/xlockmoreI.h
+crumbler.o: $(HACK_SRC)/xlockmore.h
+cube21.o: ../../config.h
+cube21.o: $(HACK_SRC)/fps.h
+cube21.o: $(srcdir)/gltrackball.h
+cube21.o: $(HACK_SRC)/recanim.h
+cube21.o: $(HACK_SRC)/screenhackI.h
+cube21.o: $(UTILS_SRC)/colors.h
+cube21.o: $(UTILS_SRC)/erase.h
+cube21.o: $(UTILS_SRC)/font-retry.h
+cube21.o: $(UTILS_SRC)/grabscreen.h
+cube21.o: $(UTILS_SRC)/hsv.h
+cube21.o: $(UTILS_SRC)/resources.h
+cube21.o: $(UTILS_SRC)/usleep.h
+cube21.o: $(UTILS_SRC)/visual.h
+cube21.o: $(UTILS_SRC)/yarandom.h
+cube21.o: $(HACK_SRC)/xlockmoreI.h
+cube21.o: $(HACK_SRC)/xlockmore.h
+cubenetic.o: ../../config.h
+cubenetic.o: $(HACK_SRC)/fps.h
+cubenetic.o: $(srcdir)/gltrackball.h
+cubenetic.o: $(HACK_SRC)/recanim.h
+cubenetic.o: $(srcdir)/rotator.h
+cubenetic.o: $(HACK_SRC)/screenhackI.h
+cubenetic.o: $(UTILS_SRC)/colors.h
+cubenetic.o: $(UTILS_SRC)/erase.h
+cubenetic.o: $(UTILS_SRC)/font-retry.h
+cubenetic.o: $(UTILS_SRC)/grabscreen.h
+cubenetic.o: $(UTILS_SRC)/hsv.h
+cubenetic.o: $(UTILS_SRC)/resources.h
+cubenetic.o: $(UTILS_SRC)/usleep.h
+cubenetic.o: $(UTILS_SRC)/visual.h
+cubenetic.o: $(UTILS_SRC)/yarandom.h
+cubenetic.o: $(HACK_SRC)/xlockmoreI.h
+cubenetic.o: $(HACK_SRC)/xlockmore.h
+cubestack.o: ../../config.h
+cubestack.o: $(HACK_SRC)/fps.h
+cubestack.o: $(srcdir)/gltrackball.h
+cubestack.o: $(HACK_SRC)/recanim.h
+cubestack.o: $(srcdir)/rotator.h
+cubestack.o: $(HACK_SRC)/screenhackI.h
+cubestack.o: $(UTILS_SRC)/colors.h
+cubestack.o: $(UTILS_SRC)/erase.h
+cubestack.o: $(UTILS_SRC)/font-retry.h
+cubestack.o: $(UTILS_SRC)/grabscreen.h
+cubestack.o: $(UTILS_SRC)/hsv.h
+cubestack.o: $(UTILS_SRC)/resources.h
+cubestack.o: $(UTILS_SRC)/usleep.h
+cubestack.o: $(UTILS_SRC)/visual.h
+cubestack.o: $(UTILS_SRC)/yarandom.h
+cubestack.o: $(HACK_SRC)/xlockmoreI.h
+cubestack.o: $(HACK_SRC)/xlockmore.h
+cubestorm.o: ../../config.h
+cubestorm.o: $(HACK_SRC)/fps.h
+cubestorm.o: $(srcdir)/gltrackball.h
+cubestorm.o: $(HACK_SRC)/recanim.h
+cubestorm.o: $(srcdir)/rotator.h
+cubestorm.o: $(HACK_SRC)/screenhackI.h
+cubestorm.o: $(UTILS_SRC)/colors.h
+cubestorm.o: $(UTILS_SRC)/erase.h
+cubestorm.o: $(UTILS_SRC)/font-retry.h
+cubestorm.o: $(UTILS_SRC)/grabscreen.h
+cubestorm.o: $(UTILS_SRC)/hsv.h
+cubestorm.o: $(UTILS_SRC)/resources.h
+cubestorm.o: $(UTILS_SRC)/usleep.h
+cubestorm.o: $(UTILS_SRC)/visual.h
+cubestorm.o: $(UTILS_SRC)/yarandom.h
+cubestorm.o: $(HACK_SRC)/xlockmoreI.h
+cubestorm.o: $(HACK_SRC)/xlockmore.h
+cubetwist.o: ../../config.h
+cubetwist.o: $(HACK_SRC)/fps.h
+cubetwist.o: $(srcdir)/gltrackball.h
+cubetwist.o: $(srcdir)/normals.h
+cubetwist.o: $(HACK_SRC)/recanim.h
+cubetwist.o: $(srcdir)/rotator.h
+cubetwist.o: $(HACK_SRC)/screenhackI.h
+cubetwist.o: $(UTILS_SRC)/colors.h
+cubetwist.o: $(UTILS_SRC)/erase.h
+cubetwist.o: $(UTILS_SRC)/font-retry.h
+cubetwist.o: $(UTILS_SRC)/grabscreen.h
+cubetwist.o: $(UTILS_SRC)/hsv.h
+cubetwist.o: $(UTILS_SRC)/resources.h
+cubetwist.o: $(UTILS_SRC)/usleep.h
+cubetwist.o: $(UTILS_SRC)/visual.h
+cubetwist.o: $(UTILS_SRC)/yarandom.h
+cubetwist.o: $(HACK_SRC)/xlockmoreI.h
+cubetwist.o: $(HACK_SRC)/xlockmore.h
+cubicgrid.o: ../../config.h
+cubicgrid.o: $(HACK_SRC)/fps.h
+cubicgrid.o: $(srcdir)/gltrackball.h
+cubicgrid.o: $(HACK_SRC)/recanim.h
+cubicgrid.o: $(srcdir)/rotator.h
+cubicgrid.o: $(HACK_SRC)/screenhackI.h
+cubicgrid.o: $(UTILS_SRC)/colors.h
+cubicgrid.o: $(UTILS_SRC)/erase.h
+cubicgrid.o: $(UTILS_SRC)/font-retry.h
+cubicgrid.o: $(UTILS_SRC)/grabscreen.h
+cubicgrid.o: $(UTILS_SRC)/hsv.h
+cubicgrid.o: $(UTILS_SRC)/resources.h
+cubicgrid.o: $(UTILS_SRC)/usleep.h
+cubicgrid.o: $(UTILS_SRC)/visual.h
+cubicgrid.o: $(UTILS_SRC)/yarandom.h
+cubicgrid.o: $(HACK_SRC)/xlockmoreI.h
+cubicgrid.o: $(HACK_SRC)/xlockmore.h
+dangerball.o: ../../config.h
+dangerball.o: $(HACK_SRC)/fps.h
+dangerball.o: $(srcdir)/gltrackball.h
+dangerball.o: $(HACK_SRC)/recanim.h
+dangerball.o: $(srcdir)/rotator.h
+dangerball.o: $(HACK_SRC)/screenhackI.h
+dangerball.o: $(srcdir)/sphere.h
+dangerball.o: $(srcdir)/tube.h
+dangerball.o: $(UTILS_SRC)/colors.h
+dangerball.o: $(UTILS_SRC)/erase.h
+dangerball.o: $(UTILS_SRC)/font-retry.h
+dangerball.o: $(UTILS_SRC)/grabscreen.h
+dangerball.o: $(UTILS_SRC)/hsv.h
+dangerball.o: $(UTILS_SRC)/resources.h
+dangerball.o: $(UTILS_SRC)/usleep.h
+dangerball.o: $(UTILS_SRC)/visual.h
+dangerball.o: $(UTILS_SRC)/yarandom.h
+dangerball.o: $(HACK_SRC)/xlockmoreI.h
+dangerball.o: $(HACK_SRC)/xlockmore.h
+discoball.o: ../../config.h
+discoball.o: $(HACK_SRC)/fps.h
+discoball.o: $(srcdir)/gltrackball.h
+discoball.o: $(srcdir)/normals.h
+discoball.o: $(HACK_SRC)/recanim.h
+discoball.o: $(srcdir)/rotator.h
+discoball.o: $(HACK_SRC)/screenhackI.h
+discoball.o: $(UTILS_SRC)/colors.h
+discoball.o: $(UTILS_SRC)/erase.h
+discoball.o: $(UTILS_SRC)/font-retry.h
+discoball.o: $(UTILS_SRC)/grabscreen.h
+discoball.o: $(UTILS_SRC)/hsv.h
+discoball.o: $(UTILS_SRC)/resources.h
+discoball.o: $(UTILS_SRC)/usleep.h
+discoball.o: $(UTILS_SRC)/visual.h
+discoball.o: $(UTILS_SRC)/yarandom.h
+discoball.o: $(HACK_SRC)/xlockmoreI.h
+discoball.o: $(HACK_SRC)/xlockmore.h
+dnalogo.o: ../../config.h
+dnalogo.o: $(HACK_SRC)/fps.h
+dnalogo.o: $(srcdir)/gltrackball.h
+dnalogo.o: $(srcdir)/normals.h
+dnalogo.o: $(HACK_SRC)/recanim.h
+dnalogo.o: $(srcdir)/rotator.h
+dnalogo.o: $(HACK_SRC)/screenhackI.h
+dnalogo.o: $(srcdir)/sphere.h
+dnalogo.o: $(srcdir)/texfont.h
+dnalogo.o: $(srcdir)/tube.h
+dnalogo.o: $(UTILS_SRC)/colors.h
+dnalogo.o: $(UTILS_SRC)/erase.h
+dnalogo.o: $(UTILS_SRC)/font-retry.h
+dnalogo.o: $(UTILS_SRC)/grabscreen.h
+dnalogo.o: $(UTILS_SRC)/hsv.h
+dnalogo.o: $(UTILS_SRC)/resources.h
+dnalogo.o: $(UTILS_SRC)/usleep.h
+dnalogo.o: $(UTILS_SRC)/utf8wc.h
+dnalogo.o: $(UTILS_SRC)/visual.h
+dnalogo.o: $(UTILS_SRC)/yarandom.h
+dnalogo.o: $(HACK_SRC)/xlockmoreI.h
+dnalogo.o: $(HACK_SRC)/xlockmore.h
+dolphin.o: $(srcdir)/atlantis.h
+dolphin.o: ../../config.h
+dolphin.o: $(HACK_SRC)/fps.h
+dolphin.o: $(HACK_SRC)/recanim.h
+dolphin.o: $(HACK_SRC)/screenhackI.h
+dolphin.o: $(UTILS_SRC)/colors.h
+dolphin.o: $(UTILS_SRC)/font-retry.h
+dolphin.o: $(UTILS_SRC)/grabscreen.h
+dolphin.o: $(UTILS_SRC)/hsv.h
+dolphin.o: $(UTILS_SRC)/resources.h
+dolphin.o: $(UTILS_SRC)/usleep.h
+dolphin.o: $(UTILS_SRC)/visual.h
+dolphin.o: $(UTILS_SRC)/yarandom.h
+dropshadow.o: ../../config.h
+dropshadow.o: $(srcdir)/dropshadow.h
+dropshadow.o: $(HACK_SRC)/fps.h
+dropshadow.o: $(HACK_SRC)/recanim.h
+dropshadow.o: $(HACK_SRC)/screenhackI.h
+dropshadow.o: $(UTILS_SRC)/colors.h
+dropshadow.o: $(UTILS_SRC)/erase.h
+dropshadow.o: $(UTILS_SRC)/font-retry.h
+dropshadow.o: $(UTILS_SRC)/grabscreen.h
+dropshadow.o: $(UTILS_SRC)/hsv.h
+dropshadow.o: $(UTILS_SRC)/resources.h
+dropshadow.o: $(UTILS_SRC)/usleep.h
+dropshadow.o: $(UTILS_SRC)/visual.h
+dropshadow.o: $(UTILS_SRC)/yarandom.h
+dropshadow.o: $(HACK_SRC)/xlockmoreI.h
+dymaxionmap-coords.o: ../../config.h
+dymaxionmap-coords.o: $(srcdir)/dymaxionmap-coords.h
+dymaxionmap.o: ../../config.h
+dymaxionmap.o: $(srcdir)/dymaxionmap-coords.h
+dymaxionmap.o: $(HACK_SRC)/fps.h
+dymaxionmap.o: $(srcdir)/gltrackball.h
+dymaxionmap.o: $(HACK_SRC)/images/gen/earth_flat_png.h
+dymaxionmap.o: $(HACK_SRC)/images/gen/earth_night_png.h
+dymaxionmap.o: $(HACK_SRC)/images/gen/earth_png.h
+dymaxionmap.o: $(HACK_SRC)/images/gen/ground_png.h
+dymaxionmap.o: $(srcdir)/normals.h
+dymaxionmap.o: $(HACK_SRC)/recanim.h
+dymaxionmap.o: $(srcdir)/rotator.h
+dymaxionmap.o: $(HACK_SRC)/screenhackI.h
+dymaxionmap.o: $(srcdir)/sphere.h
+dymaxionmap.o: $(srcdir)/texfont.h
+dymaxionmap.o: $(UTILS_SRC)/colors.h
+dymaxionmap.o: $(UTILS_SRC)/erase.h
+dymaxionmap.o: $(UTILS_SRC)/font-retry.h
+dymaxionmap.o: $(UTILS_SRC)/grabscreen.h
+dymaxionmap.o: $(UTILS_SRC)/hsv.h
+dymaxionmap.o: $(UTILS_SRC)/resources.h
+dymaxionmap.o: $(UTILS_SRC)/usleep.h
+dymaxionmap.o: $(UTILS_SRC)/visual.h
+dymaxionmap.o: $(UTILS_SRC)/yarandom.h
+dymaxionmap.o: $(HACK_SRC)/ximage-loader.h
+dymaxionmap.o: $(HACK_SRC)/xlockmoreI.h
+dymaxionmap.o: $(HACK_SRC)/xlockmore.h
+endgame.o: $(srcdir)/chessgames.h
+endgame.o: $(srcdir)/chessmodels.h
+endgame.o: ../../config.h
+endgame.o: $(HACK_SRC)/fps.h
+endgame.o: $(srcdir)/gltrackball.h
+endgame.o: $(HACK_SRC)/recanim.h
+endgame.o: $(HACK_SRC)/screenhackI.h
+endgame.o: $(UTILS_SRC)/colors.h
+endgame.o: $(UTILS_SRC)/erase.h
+endgame.o: $(UTILS_SRC)/font-retry.h
+endgame.o: $(UTILS_SRC)/grabscreen.h
+endgame.o: $(UTILS_SRC)/hsv.h
+endgame.o: $(UTILS_SRC)/resources.h
+endgame.o: $(UTILS_SRC)/usleep.h
+endgame.o: $(UTILS_SRC)/visual.h
+endgame.o: $(UTILS_SRC)/yarandom.h
+endgame.o: $(HACK_SRC)/xlockmoreI.h
+endgame.o: $(HACK_SRC)/xlockmore.h
+energystream.o: ../../config.h
+energystream.o: $(HACK_SRC)/fps.h
+energystream.o: $(srcdir)/gltrackball.h
+energystream.o: $(HACK_SRC)/recanim.h
+energystream.o: $(srcdir)/rotator.h
+energystream.o: $(HACK_SRC)/screenhackI.h
+energystream.o: $(UTILS_SRC)/colors.h
+energystream.o: $(UTILS_SRC)/erase.h
+energystream.o: $(UTILS_SRC)/font-retry.h
+energystream.o: $(UTILS_SRC)/grabscreen.h
+energystream.o: $(UTILS_SRC)/hsv.h
+energystream.o: $(UTILS_SRC)/resources.h
+energystream.o: $(UTILS_SRC)/usleep.h
+energystream.o: $(UTILS_SRC)/visual.h
+energystream.o: $(UTILS_SRC)/yarandom.h
+energystream.o: $(HACK_SRC)/xlockmoreI.h
+energystream.o: $(HACK_SRC)/xlockmore.h
+engine.o: ../../config.h
+engine.o: $(HACK_SRC)/fps.h
+engine.o: $(srcdir)/gltrackball.h
+engine.o: $(HACK_SRC)/recanim.h
+engine.o: $(srcdir)/rotator.h
+engine.o: $(HACK_SRC)/screenhackI.h
+engine.o: $(srcdir)/texfont.h
+engine.o: $(UTILS_SRC)/colors.h
+engine.o: $(UTILS_SRC)/erase.h
+engine.o: $(UTILS_SRC)/font-retry.h
+engine.o: $(UTILS_SRC)/grabscreen.h
+engine.o: $(UTILS_SRC)/hsv.h
+engine.o: $(UTILS_SRC)/resources.h
+engine.o: $(UTILS_SRC)/usleep.h
+engine.o: $(UTILS_SRC)/visual.h
+engine.o: $(UTILS_SRC)/yarandom.h
+engine.o: $(HACK_SRC)/xlockmoreI.h
+engine.o: $(HACK_SRC)/xlockmore.h
+erase-gl.o: ../../config.h
+erase-gl.o: $(UTILS_SRC)/erase.h
+erase-gl.o: $(UTILS_SRC)/utils.h
+esper.o: ../../config.h
+esper.o: $(HACK_SRC)/fps.h
+esper.o: $(srcdir)/grab-ximage.h
+esper.o: $(HACK_SRC)/recanim.h
+esper.o: $(HACK_SRC)/screenhackI.h
+esper.o: $(srcdir)/texfont.h
+esper.o: $(UTILS_SRC)/colors.h
+esper.o: $(UTILS_SRC)/erase.h
+esper.o: $(UTILS_SRC)/font-retry.h
+esper.o: $(UTILS_SRC)/grabscreen.h
+esper.o: $(UTILS_SRC)/hsv.h
+esper.o: $(UTILS_SRC)/resources.h
+esper.o: $(UTILS_SRC)/usleep.h
+esper.o: $(UTILS_SRC)/visual.h
+esper.o: $(UTILS_SRC)/xshm.h
+esper.o: $(UTILS_SRC)/yarandom.h
+esper.o: $(HACK_SRC)/xlockmoreI.h
+esper.o: $(HACK_SRC)/xlockmore.h
+extrusion-helix2.o: ../../config.h
+extrusion-helix2.o: $(srcdir)/extrusion.h
+extrusion-helix3.o: ../../config.h
+extrusion-helix3.o: $(srcdir)/extrusion.h
+extrusion-helix4.o: ../../config.h
+extrusion-helix4.o: $(srcdir)/extrusion.h
+extrusion-joinoffset.o: ../../config.h
+extrusion-joinoffset.o: $(srcdir)/extrusion.h
+extrusion.o: ../../config.h
+extrusion.o: $(srcdir)/extrusion.h
+extrusion.o: $(HACK_SRC)/fps.h
+extrusion.o: $(srcdir)/gltrackball.h
+extrusion.o: $(HACK_SRC)/recanim.h
+extrusion.o: $(srcdir)/rotator.h
+extrusion.o: $(HACK_SRC)/screenhackI.h
+extrusion.o: $(UTILS_SRC)/colors.h
+extrusion.o: $(UTILS_SRC)/erase.h
+extrusion.o: $(UTILS_SRC)/font-retry.h
+extrusion.o: $(UTILS_SRC)/grabscreen.h
+extrusion.o: $(UTILS_SRC)/hsv.h
+extrusion.o: $(UTILS_SRC)/resources.h
+extrusion.o: $(UTILS_SRC)/usleep.h
+extrusion.o: $(UTILS_SRC)/visual.h
+extrusion.o: $(UTILS_SRC)/yarandom.h
+extrusion.o: $(HACK_SRC)/ximage-loader.h
+extrusion.o: $(HACK_SRC)/xlockmoreI.h
+extrusion.o: $(HACK_SRC)/xlockmore.h
+extrusion-screw.o: ../../config.h
+extrusion-screw.o: $(srcdir)/extrusion.h
+extrusion-taper.o: ../../config.h
+extrusion-taper.o: $(srcdir)/extrusion.h
+extrusion-twistoid.o: ../../config.h
+extrusion-twistoid.o: $(srcdir)/extrusion.h
+flipflop.o: ../../config.h
+flipflop.o: $(HACK_SRC)/fps.h
+flipflop.o: $(srcdir)/gltrackball.h
+flipflop.o: $(srcdir)/grab-ximage.h
+flipflop.o: $(HACK_SRC)/recanim.h
+flipflop.o: $(HACK_SRC)/screenhackI.h
+flipflop.o: $(UTILS_SRC)/colors.h
+flipflop.o: $(UTILS_SRC)/erase.h
+flipflop.o: $(UTILS_SRC)/font-retry.h
+flipflop.o: $(UTILS_SRC)/grabscreen.h
+flipflop.o: $(UTILS_SRC)/hsv.h
+flipflop.o: $(UTILS_SRC)/resources.h
+flipflop.o: $(UTILS_SRC)/usleep.h
+flipflop.o: $(UTILS_SRC)/visual.h
+flipflop.o: $(UTILS_SRC)/yarandom.h
+flipflop.o: $(HACK_SRC)/xlockmoreI.h
+flipflop.o: $(HACK_SRC)/xlockmore.h
+flipscreen3d.o: ../../config.h
+flipscreen3d.o: $(HACK_SRC)/fps.h
+flipscreen3d.o: $(srcdir)/gltrackball.h
+flipscreen3d.o: $(srcdir)/grab-ximage.h
+flipscreen3d.o: $(HACK_SRC)/recanim.h
+flipscreen3d.o: $(HACK_SRC)/screenhackI.h
+flipscreen3d.o: $(UTILS_SRC)/colors.h
+flipscreen3d.o: $(UTILS_SRC)/erase.h
+flipscreen3d.o: $(UTILS_SRC)/font-retry.h
+flipscreen3d.o: $(UTILS_SRC)/grabscreen.h
+flipscreen3d.o: $(UTILS_SRC)/hsv.h
+flipscreen3d.o: $(UTILS_SRC)/resources.h
+flipscreen3d.o: $(UTILS_SRC)/usleep.h
+flipscreen3d.o: $(UTILS_SRC)/visual.h
+flipscreen3d.o: $(UTILS_SRC)/yarandom.h
+flipscreen3d.o: $(HACK_SRC)/xlockmoreI.h
+flipscreen3d.o: $(HACK_SRC)/xlockmore.h
+fliptext.o: ../../config.h
+fliptext.o: $(HACK_SRC)/fps.h
+fliptext.o: $(HACK_SRC)/recanim.h
+fliptext.o: $(HACK_SRC)/screenhackI.h
+fliptext.o: $(srcdir)/texfont.h
+fliptext.o: $(UTILS_SRC)/colors.h
+fliptext.o: $(UTILS_SRC)/erase.h
+fliptext.o: $(UTILS_SRC)/font-retry.h
+fliptext.o: $(UTILS_SRC)/grabscreen.h
+fliptext.o: $(UTILS_SRC)/hsv.h
+fliptext.o: $(UTILS_SRC)/resources.h
+fliptext.o: $(UTILS_SRC)/textclient.h
+fliptext.o: $(UTILS_SRC)/usleep.h
+fliptext.o: $(UTILS_SRC)/visual.h
+fliptext.o: $(UTILS_SRC)/yarandom.h
+fliptext.o: $(HACK_SRC)/xlockmoreI.h
+fliptext.o: $(HACK_SRC)/xlockmore.h
+flurry.o: ../../config.h
+flurry.o: $(srcdir)/flurry.h
+flurry.o: $(HACK_SRC)/fps.h
+flurry.o: $(srcdir)/gltrackball.h
+flurry.o: $(HACK_SRC)/recanim.h
+flurry.o: $(srcdir)/rotator.h
+flurry.o: $(HACK_SRC)/screenhackI.h
+flurry.o: $(UTILS_SRC)/colors.h
+flurry.o: $(UTILS_SRC)/erase.h
+flurry.o: $(UTILS_SRC)/font-retry.h
+flurry.o: $(UTILS_SRC)/grabscreen.h
+flurry.o: $(UTILS_SRC)/hsv.h
+flurry.o: $(UTILS_SRC)/resources.h
+flurry.o: $(UTILS_SRC)/usleep.h
+flurry.o: $(UTILS_SRC)/visual.h
+flurry.o: $(UTILS_SRC)/yarandom.h
+flurry.o: $(HACK_SRC)/xlockmoreI.h
+flurry.o: $(HACK_SRC)/xlockmore.h
+flurry-smoke.o: ../../config.h
+flurry-smoke.o: $(srcdir)/flurry.h
+flurry-smoke.o: $(srcdir)/gltrackball.h
+flurry-smoke.o: $(srcdir)/rotator.h
+flurry-smoke.o: $(UTILS_SRC)/yarandom.h
+flurry-spark.o: ../../config.h
+flurry-spark.o: $(srcdir)/flurry.h
+flurry-spark.o: $(srcdir)/gltrackball.h
+flurry-spark.o: $(srcdir)/rotator.h
+flurry-spark.o: $(UTILS_SRC)/yarandom.h
+flurry-star.o: ../../config.h
+flurry-star.o: $(srcdir)/flurry.h
+flurry-star.o: $(srcdir)/gltrackball.h
+flurry-star.o: $(srcdir)/rotator.h
+flurry-star.o: $(UTILS_SRC)/yarandom.h
+flurry-texture.o: ../../config.h
+flurry-texture.o: $(srcdir)/flurry.h
+flurry-texture.o: $(srcdir)/gltrackball.h
+flurry-texture.o: $(srcdir)/rotator.h
+flurry-texture.o: $(UTILS_SRC)/yarandom.h
+flyingtoasters.o: ../../config.h
+flyingtoasters.o: $(HACK_SRC)/fps.h
+flyingtoasters.o: $(srcdir)/gllist.h
+flyingtoasters.o: $(srcdir)/gltrackball.h
+flyingtoasters.o: $(HACK_SRC)/images/gen/chromesphere_png.h
+flyingtoasters.o: $(HACK_SRC)/images/gen/toast_png.h
+flyingtoasters.o: $(HACK_SRC)/recanim.h
+flyingtoasters.o: $(HACK_SRC)/screenhackI.h
+flyingtoasters.o: $(UTILS_SRC)/colors.h
+flyingtoasters.o: $(UTILS_SRC)/erase.h
+flyingtoasters.o: $(UTILS_SRC)/font-retry.h
+flyingtoasters.o: $(UTILS_SRC)/grabscreen.h
+flyingtoasters.o: $(UTILS_SRC)/hsv.h
+flyingtoasters.o: $(UTILS_SRC)/resources.h
+flyingtoasters.o: $(UTILS_SRC)/usleep.h
+flyingtoasters.o: $(UTILS_SRC)/visual.h
+flyingtoasters.o: $(UTILS_SRC)/yarandom.h
+flyingtoasters.o: $(HACK_SRC)/ximage-loader.h
+flyingtoasters.o: $(HACK_SRC)/xlockmoreI.h
+flyingtoasters.o: $(HACK_SRC)/xlockmore.h
+fps-gl.o: ../../config.h
+fps-gl.o: $(HACK_SRC)/fpsI.h
+fps-gl.o: $(HACK_SRC)/fps.h
+fps-gl.o: $(HACK_SRC)/recanim.h
+fps-gl.o: $(HACK_SRC)/screenhackI.h
+fps-gl.o: $(srcdir)/texfont.h
+fps-gl.o: $(UTILS_SRC)/colors.h
+fps-gl.o: $(UTILS_SRC)/erase.h
+fps-gl.o: $(UTILS_SRC)/font-retry.h
+fps-gl.o: $(UTILS_SRC)/grabscreen.h
+fps-gl.o: $(UTILS_SRC)/hsv.h
+fps-gl.o: $(UTILS_SRC)/resources.h
+fps-gl.o: $(UTILS_SRC)/usleep.h
+fps-gl.o: $(UTILS_SRC)/visual.h
+fps-gl.o: $(UTILS_SRC)/yarandom.h
+fps-gl.o: $(HACK_SRC)/xlockmoreI.h
+gears.o: ../../config.h
+gears.o: $(HACK_SRC)/fps.h
+gears.o: $(srcdir)/gltrackball.h
+gears.o: $(srcdir)/involute.h
+gears.o: $(srcdir)/normals.h
+gears.o: $(HACK_SRC)/recanim.h
+gears.o: $(srcdir)/rotator.h
+gears.o: $(HACK_SRC)/screenhackI.h
+gears.o: $(srcdir)/tube.h
+gears.o: $(UTILS_SRC)/colors.h
+gears.o: $(UTILS_SRC)/erase.h
+gears.o: $(UTILS_SRC)/font-retry.h
+gears.o: $(UTILS_SRC)/grabscreen.h
+gears.o: $(UTILS_SRC)/hsv.h
+gears.o: $(UTILS_SRC)/resources.h
+gears.o: $(UTILS_SRC)/usleep.h
+gears.o: $(UTILS_SRC)/visual.h
+gears.o: $(UTILS_SRC)/yarandom.h
+gears.o: $(HACK_SRC)/xlockmoreI.h
+gears.o: $(HACK_SRC)/xlockmore.h
+geodesicgears.o: ../../config.h
+geodesicgears.o: $(HACK_SRC)/fps.h
+geodesicgears.o: $(srcdir)/gllist.h
+geodesicgears.o: $(srcdir)/gltrackball.h
+geodesicgears.o: $(srcdir)/involute.h
+geodesicgears.o: $(srcdir)/normals.h
+geodesicgears.o: $(HACK_SRC)/recanim.h
+geodesicgears.o: $(srcdir)/rotator.h
+geodesicgears.o: $(HACK_SRC)/screenhackI.h
+geodesicgears.o: $(srcdir)/texfont.h
+geodesicgears.o: $(UTILS_SRC)/colors.h
+geodesicgears.o: $(UTILS_SRC)/erase.h
+geodesicgears.o: $(UTILS_SRC)/font-retry.h
+geodesicgears.o: $(UTILS_SRC)/grabscreen.h
+geodesicgears.o: $(UTILS_SRC)/hsv.h
+geodesicgears.o: $(UTILS_SRC)/resources.h
+geodesicgears.o: $(UTILS_SRC)/usleep.h
+geodesicgears.o: $(UTILS_SRC)/visual.h
+geodesicgears.o: $(UTILS_SRC)/yarandom.h
+geodesicgears.o: $(HACK_SRC)/xlockmoreI.h
+geodesicgears.o: $(HACK_SRC)/xlockmore.h
+geodesic.o: ../../config.h
+geodesic.o: $(HACK_SRC)/fps.h
+geodesic.o: $(srcdir)/gllist.h
+geodesic.o: $(srcdir)/gltrackball.h
+geodesic.o: $(srcdir)/normals.h
+geodesic.o: $(HACK_SRC)/recanim.h
+geodesic.o: $(srcdir)/rotator.h
+geodesic.o: $(HACK_SRC)/screenhackI.h
+geodesic.o: $(UTILS_SRC)/colors.h
+geodesic.o: $(UTILS_SRC)/erase.h
+geodesic.o: $(UTILS_SRC)/font-retry.h
+geodesic.o: $(UTILS_SRC)/grabscreen.h
+geodesic.o: $(UTILS_SRC)/hsv.h
+geodesic.o: $(UTILS_SRC)/resources.h
+geodesic.o: $(UTILS_SRC)/usleep.h
+geodesic.o: $(UTILS_SRC)/visual.h
+geodesic.o: $(UTILS_SRC)/yarandom.h
+geodesic.o: $(HACK_SRC)/xlockmoreI.h
+geodesic.o: $(HACK_SRC)/xlockmore.h
+gflux.o: ../../config.h
+gflux.o: $(HACK_SRC)/fps.h
+gflux.o: $(srcdir)/gltrackball.h
+gflux.o: $(srcdir)/grab-ximage.h
+gflux.o: $(HACK_SRC)/recanim.h
+gflux.o: $(HACK_SRC)/screenhackI.h
+gflux.o: $(UTILS_SRC)/colors.h
+gflux.o: $(UTILS_SRC)/erase.h
+gflux.o: $(UTILS_SRC)/font-retry.h
+gflux.o: $(UTILS_SRC)/grabscreen.h
+gflux.o: $(UTILS_SRC)/hsv.h
+gflux.o: $(UTILS_SRC)/resources.h
+gflux.o: $(UTILS_SRC)/usleep.h
+gflux.o: $(UTILS_SRC)/visual.h
+gflux.o: $(UTILS_SRC)/yarandom.h
+gflux.o: $(HACK_SRC)/xlockmoreI.h
+gflux.o: $(HACK_SRC)/xlockmore.h
+glblur.o: ../../config.h
+glblur.o: $(HACK_SRC)/fps.h
+glblur.o: $(srcdir)/gltrackball.h
+glblur.o: $(HACK_SRC)/recanim.h
+glblur.o: $(srcdir)/rotator.h
+glblur.o: $(HACK_SRC)/screenhackI.h
+glblur.o: $(UTILS_SRC)/colors.h
+glblur.o: $(UTILS_SRC)/erase.h
+glblur.o: $(UTILS_SRC)/font-retry.h
+glblur.o: $(UTILS_SRC)/grabscreen.h
+glblur.o: $(UTILS_SRC)/hsv.h
+glblur.o: $(UTILS_SRC)/resources.h
+glblur.o: $(UTILS_SRC)/usleep.h
+glblur.o: $(UTILS_SRC)/visual.h
+glblur.o: $(UTILS_SRC)/yarandom.h
+glblur.o: $(HACK_SRC)/xlockmoreI.h
+glblur.o: $(HACK_SRC)/xlockmore.h
+glcells.o: ../../config.h
+glcells.o: $(HACK_SRC)/fps.h
+glcells.o: $(HACK_SRC)/recanim.h
+glcells.o: $(HACK_SRC)/screenhackI.h
+glcells.o: $(UTILS_SRC)/colors.h
+glcells.o: $(UTILS_SRC)/erase.h
+glcells.o: $(UTILS_SRC)/font-retry.h
+glcells.o: $(UTILS_SRC)/grabscreen.h
+glcells.o: $(UTILS_SRC)/hsv.h
+glcells.o: $(UTILS_SRC)/resources.h
+glcells.o: $(UTILS_SRC)/usleep.h
+glcells.o: $(UTILS_SRC)/visual.h
+glcells.o: $(UTILS_SRC)/yarandom.h
+glcells.o: $(HACK_SRC)/xlockmoreI.h
+glcells.o: $(HACK_SRC)/xlockmore.h
+gleidescope.o: ../../config.h
+gleidescope.o: $(HACK_SRC)/fps.h
+gleidescope.o: $(srcdir)/grab-ximage.h
+gleidescope.o: $(HACK_SRC)/recanim.h
+gleidescope.o: $(HACK_SRC)/screenhackI.h
+gleidescope.o: $(UTILS_SRC)/colors.h
+gleidescope.o: $(UTILS_SRC)/erase.h
+gleidescope.o: $(UTILS_SRC)/font-retry.h
+gleidescope.o: $(UTILS_SRC)/grabscreen.h
+gleidescope.o: $(UTILS_SRC)/hsv.h
+gleidescope.o: $(UTILS_SRC)/resources.h
+gleidescope.o: $(UTILS_SRC)/usleep.h
+gleidescope.o: $(UTILS_SRC)/visual.h
+gleidescope.o: $(UTILS_SRC)/yarandom.h
+gleidescope.o: $(HACK_SRC)/ximage-loader.h
+gleidescope.o: $(HACK_SRC)/xlockmoreI.h
+gleidescope.o: $(HACK_SRC)/xlockmore.h
+glforestfire.o: ../../config.h
+glforestfire.o: $(HACK_SRC)/fps.h
+glforestfire.o: $(srcdir)/gltrackball.h
+glforestfire.o: $(HACK_SRC)/images/gen/ground_png.h
+glforestfire.o: $(HACK_SRC)/images/gen/tree_png.h
+glforestfire.o: $(HACK_SRC)/recanim.h
+glforestfire.o: $(HACK_SRC)/screenhackI.h
+glforestfire.o: $(UTILS_SRC)/colors.h
+glforestfire.o: $(UTILS_SRC)/erase.h
+glforestfire.o: $(UTILS_SRC)/font-retry.h
+glforestfire.o: $(UTILS_SRC)/grabscreen.h
+glforestfire.o: $(UTILS_SRC)/hsv.h
+glforestfire.o: $(UTILS_SRC)/resources.h
+glforestfire.o: $(UTILS_SRC)/usleep.h
+glforestfire.o: $(UTILS_SRC)/visual.h
+glforestfire.o: $(UTILS_SRC)/yarandom.h
+glforestfire.o: $(HACK_SRC)/ximage-loader.h
+glforestfire.o: $(HACK_SRC)/xlockmoreI.h
+glforestfire.o: $(HACK_SRC)/xlockmore.h
+glhanoi.o: ../../config.h
+glhanoi.o: $(HACK_SRC)/fps.h
+glhanoi.o: $(HACK_SRC)/recanim.h
+glhanoi.o: $(srcdir)/rotator.h
+glhanoi.o: $(HACK_SRC)/screenhackI.h
+glhanoi.o: $(UTILS_SRC)/colors.h
+glhanoi.o: $(UTILS_SRC)/erase.h
+glhanoi.o: $(UTILS_SRC)/font-retry.h
+glhanoi.o: $(UTILS_SRC)/grabscreen.h
+glhanoi.o: $(UTILS_SRC)/hsv.h
+glhanoi.o: $(UTILS_SRC)/resources.h
+glhanoi.o: $(UTILS_SRC)/usleep.h
+glhanoi.o: $(UTILS_SRC)/visual.h
+glhanoi.o: $(UTILS_SRC)/yarandom.h
+glhanoi.o: $(HACK_SRC)/xlockmoreI.h
+glhanoi.o: $(HACK_SRC)/xlockmore.h
+glknots.o: ../../config.h
+glknots.o: $(HACK_SRC)/fps.h
+glknots.o: $(srcdir)/gltrackball.h
+glknots.o: $(HACK_SRC)/recanim.h
+glknots.o: $(srcdir)/rotator.h
+glknots.o: $(HACK_SRC)/screenhackI.h
+glknots.o: $(srcdir)/tube.h
+glknots.o: $(UTILS_SRC)/colors.h
+glknots.o: $(UTILS_SRC)/erase.h
+glknots.o: $(UTILS_SRC)/font-retry.h
+glknots.o: $(UTILS_SRC)/grabscreen.h
+glknots.o: $(UTILS_SRC)/hsv.h
+glknots.o: $(UTILS_SRC)/resources.h
+glknots.o: $(UTILS_SRC)/usleep.h
+glknots.o: $(UTILS_SRC)/visual.h
+glknots.o: $(UTILS_SRC)/yarandom.h
+glknots.o: $(HACK_SRC)/xlockmoreI.h
+glknots.o: $(HACK_SRC)/xlockmore.h
+gllist.o: ../../config.h
+gllist.o: $(srcdir)/gllist.h
+glmatrix.o: ../../config.h
+glmatrix.o: $(HACK_SRC)/fps.h
+glmatrix.o: $(HACK_SRC)/images/gen/matrix3_png.h
+glmatrix.o: $(HACK_SRC)/recanim.h
+glmatrix.o: $(HACK_SRC)/screenhackI.h
+glmatrix.o: $(UTILS_SRC)/colors.h
+glmatrix.o: $(UTILS_SRC)/erase.h
+glmatrix.o: $(UTILS_SRC)/font-retry.h
+glmatrix.o: $(UTILS_SRC)/grabscreen.h
+glmatrix.o: $(UTILS_SRC)/hsv.h
+glmatrix.o: $(UTILS_SRC)/resources.h
+glmatrix.o: $(UTILS_SRC)/usleep.h
+glmatrix.o: $(UTILS_SRC)/visual.h
+glmatrix.o: $(UTILS_SRC)/yarandom.h
+glmatrix.o: $(HACK_SRC)/ximage-loader.h
+glmatrix.o: $(HACK_SRC)/xlockmoreI.h
+glmatrix.o: $(HACK_SRC)/xlockmore.h
+glplanet.o: ../../config.h
+glplanet.o: $(HACK_SRC)/fps.h
+glplanet.o: $(srcdir)/gltrackball.h
+glplanet.o: $(HACK_SRC)/images/gen/earth_night_png.h
+glplanet.o: $(HACK_SRC)/images/gen/earth_png.h
+glplanet.o: $(HACK_SRC)/recanim.h
+glplanet.o: $(srcdir)/rotator.h
+glplanet.o: $(HACK_SRC)/screenhackI.h
+glplanet.o: $(srcdir)/sphere.h
+glplanet.o: $(UTILS_SRC)/colors.h
+glplanet.o: $(UTILS_SRC)/erase.h
+glplanet.o: $(UTILS_SRC)/font-retry.h
+glplanet.o: $(UTILS_SRC)/grabscreen.h
+glplanet.o: $(UTILS_SRC)/hsv.h
+glplanet.o: $(UTILS_SRC)/resources.h
+glplanet.o: $(UTILS_SRC)/usleep.h
+glplanet.o: $(UTILS_SRC)/visual.h
+glplanet.o: $(UTILS_SRC)/yarandom.h
+glplanet.o: $(HACK_SRC)/ximage-loader.h
+glplanet.o: $(HACK_SRC)/xlockmoreI.h
+glplanet.o: $(HACK_SRC)/xlockmore.h
+glschool_alg.o: ../../config.h
+glschool_alg.o: $(srcdir)/glschool_alg.h
+glschool_alg.o: $(UTILS_SRC)/yarandom.h
+glschool_gl.o: ../../config.h
+glschool_gl.o: $(srcdir)/glschool_alg.h
+glschool_gl.o: $(srcdir)/glschool_gl.h
+glschool_gl.o: $(srcdir)/sphere.h
+glschool_gl.o: $(srcdir)/tube.h
+glschool.o: ../../config.h
+glschool.o: $(HACK_SRC)/fps.h
+glschool.o: $(srcdir)/glschool_alg.h
+glschool.o: $(srcdir)/glschool_gl.h
+glschool.o: $(srcdir)/glschool.h
+glschool.o: $(HACK_SRC)/recanim.h
+glschool.o: $(HACK_SRC)/screenhackI.h
+glschool.o: $(UTILS_SRC)/colors.h
+glschool.o: $(UTILS_SRC)/erase.h
+glschool.o: $(UTILS_SRC)/font-retry.h
+glschool.o: $(UTILS_SRC)/grabscreen.h
+glschool.o: $(UTILS_SRC)/hsv.h
+glschool.o: $(UTILS_SRC)/resources.h
+glschool.o: $(UTILS_SRC)/usleep.h
+glschool.o: $(UTILS_SRC)/visual.h
+glschool.o: $(UTILS_SRC)/yarandom.h
+glschool.o: $(HACK_SRC)/xlockmoreI.h
+glschool.o: $(HACK_SRC)/xlockmore.h
+glslideshow.o: ../../config.h
+glslideshow.o: $(HACK_SRC)/fps.h
+glslideshow.o: $(srcdir)/grab-ximage.h
+glslideshow.o: $(HACK_SRC)/recanim.h
+glslideshow.o: $(HACK_SRC)/screenhackI.h
+glslideshow.o: $(srcdir)/texfont.h
+glslideshow.o: $(UTILS_SRC)/colors.h
+glslideshow.o: $(UTILS_SRC)/erase.h
+glslideshow.o: $(UTILS_SRC)/font-retry.h
+glslideshow.o: $(UTILS_SRC)/grabscreen.h
+glslideshow.o: $(UTILS_SRC)/hsv.h
+glslideshow.o: $(UTILS_SRC)/resources.h
+glslideshow.o: $(UTILS_SRC)/usleep.h
+glslideshow.o: $(UTILS_SRC)/visual.h
+glslideshow.o: $(UTILS_SRC)/yarandom.h
+glslideshow.o: $(HACK_SRC)/xlockmoreI.h
+glslideshow.o: $(HACK_SRC)/xlockmore.h
+glsnake.o: ../../config.h
+glsnake.o: $(HACK_SRC)/fps.h
+glsnake.o: $(HACK_SRC)/recanim.h
+glsnake.o: $(HACK_SRC)/screenhackI.h
+glsnake.o: $(srcdir)/texfont.h
+glsnake.o: $(UTILS_SRC)/colors.h
+glsnake.o: $(UTILS_SRC)/erase.h
+glsnake.o: $(UTILS_SRC)/font-retry.h
+glsnake.o: $(UTILS_SRC)/grabscreen.h
+glsnake.o: $(UTILS_SRC)/hsv.h
+glsnake.o: $(UTILS_SRC)/resources.h
+glsnake.o: $(UTILS_SRC)/usleep.h
+glsnake.o: $(UTILS_SRC)/visual.h
+glsnake.o: $(UTILS_SRC)/yarandom.h
+glsnake.o: $(HACK_SRC)/xlockmoreI.h
+glsnake.o: $(HACK_SRC)/xlockmore.h
+gltext.o: ../../config.h
+gltext.o: $(HACK_SRC)/fps.h
+gltext.o: $(srcdir)/gltrackball.h
+gltext.o: $(srcdir)/glut_mroman.h
+gltext.o: $(srcdir)/glut_roman.h
+gltext.o: $(srcdir)/glutstroke.h
+gltext.o: $(HACK_SRC)/recanim.h
+gltext.o: $(srcdir)/rotator.h
+gltext.o: $(HACK_SRC)/screenhackI.h
+gltext.o: $(srcdir)/sphere.h
+gltext.o: $(srcdir)/tube.h
+gltext.o: $(UTILS_SRC)/colors.h
+gltext.o: $(UTILS_SRC)/erase.h
+gltext.o: $(UTILS_SRC)/font-retry.h
+gltext.o: $(UTILS_SRC)/grabscreen.h
+gltext.o: $(UTILS_SRC)/hsv.h
+gltext.o: $(UTILS_SRC)/resources.h
+gltext.o: $(UTILS_SRC)/textclient.h
+gltext.o: $(UTILS_SRC)/usleep.h
+gltext.o: $(UTILS_SRC)/utf8wc.h
+gltext.o: $(UTILS_SRC)/visual.h
+gltext.o: $(UTILS_SRC)/yarandom.h
+gltext.o: $(HACK_SRC)/xlockmoreI.h
+gltext.o: $(HACK_SRC)/xlockmore.h
+gltrackball.o: ../../config.h
+gltrackball.o: $(srcdir)/gltrackball.h
+gltrackball.o: $(srcdir)/trackball.h
+glut_stroke.o: ../../config.h
+glut_stroke.o: $(srcdir)/glutstroke.h
+glut_swidth.o: ../../config.h
+glut_swidth.o: $(srcdir)/glutstroke.h
+grab-ximage.o: ../../config.h
+grab-ximage.o: $(srcdir)/grab-ximage.h
+grab-ximage.o: $(UTILS_SRC)/grabscreen.h
+grab-ximage.o: $(UTILS_SRC)/pow2.h
+grab-ximage.o: $(UTILS_SRC)/visual.h
+grab-ximage.o: $(UTILS_SRC)/xshm.h
+hexstrut.o: ../../config.h
+hexstrut.o: $(HACK_SRC)/fps.h
+hexstrut.o: $(srcdir)/gltrackball.h
+hexstrut.o: $(srcdir)/normals.h
+hexstrut.o: $(HACK_SRC)/recanim.h
+hexstrut.o: $(srcdir)/rotator.h
+hexstrut.o: $(HACK_SRC)/screenhackI.h
+hexstrut.o: $(UTILS_SRC)/colors.h
+hexstrut.o: $(UTILS_SRC)/erase.h
+hexstrut.o: $(UTILS_SRC)/font-retry.h
+hexstrut.o: $(UTILS_SRC)/grabscreen.h
+hexstrut.o: $(UTILS_SRC)/hsv.h
+hexstrut.o: $(UTILS_SRC)/resources.h
+hexstrut.o: $(UTILS_SRC)/usleep.h
+hexstrut.o: $(UTILS_SRC)/visual.h
+hexstrut.o: $(UTILS_SRC)/yarandom.h
+hexstrut.o: $(HACK_SRC)/xlockmoreI.h
+hexstrut.o: $(HACK_SRC)/xlockmore.h
+hilbert.o: ../../config.h
+hilbert.o: $(HACK_SRC)/fps.h
+hilbert.o: $(srcdir)/gltrackball.h
+hilbert.o: $(HACK_SRC)/recanim.h
+hilbert.o: $(srcdir)/rotator.h
+hilbert.o: $(HACK_SRC)/screenhackI.h
+hilbert.o: $(srcdir)/sphere.h
+hilbert.o: $(srcdir)/tube.h
+hilbert.o: $(UTILS_SRC)/colors.h
+hilbert.o: $(UTILS_SRC)/erase.h
+hilbert.o: $(UTILS_SRC)/font-retry.h
+hilbert.o: $(UTILS_SRC)/grabscreen.h
+hilbert.o: $(UTILS_SRC)/hsv.h
+hilbert.o: $(UTILS_SRC)/resources.h
+hilbert.o: $(UTILS_SRC)/usleep.h
+hilbert.o: $(UTILS_SRC)/visual.h
+hilbert.o: $(UTILS_SRC)/yarandom.h
+hilbert.o: $(HACK_SRC)/xlockmoreI.h
+hilbert.o: $(HACK_SRC)/xlockmore.h
+hydrostat.o: ../../config.h
+hydrostat.o: $(HACK_SRC)/fps.h
+hydrostat.o: $(srcdir)/gltrackball.h
+hydrostat.o: $(srcdir)/normals.h
+hydrostat.o: $(HACK_SRC)/recanim.h
+hydrostat.o: $(HACK_SRC)/screenhackI.h
+hydrostat.o: $(srcdir)/sphere.h
+hydrostat.o: $(UTILS_SRC)/colors.h
+hydrostat.o: $(UTILS_SRC)/erase.h
+hydrostat.o: $(UTILS_SRC)/font-retry.h
+hydrostat.o: $(UTILS_SRC)/grabscreen.h
+hydrostat.o: $(UTILS_SRC)/hsv.h
+hydrostat.o: $(UTILS_SRC)/resources.h
+hydrostat.o: $(UTILS_SRC)/usleep.h
+hydrostat.o: $(UTILS_SRC)/visual.h
+hydrostat.o: $(UTILS_SRC)/yarandom.h
+hydrostat.o: $(HACK_SRC)/xlockmoreI.h
+hydrostat.o: $(HACK_SRC)/xlockmore.h
+hypertorus.o: ../../config.h
+hypertorus.o: $(HACK_SRC)/fps.h
+hypertorus.o: $(srcdir)/gltrackball.h
+hypertorus.o: $(HACK_SRC)/recanim.h
+hypertorus.o: $(HACK_SRC)/screenhackI.h
+hypertorus.o: $(UTILS_SRC)/colors.h
+hypertorus.o: $(UTILS_SRC)/erase.h
+hypertorus.o: $(UTILS_SRC)/font-retry.h
+hypertorus.o: $(UTILS_SRC)/grabscreen.h
+hypertorus.o: $(UTILS_SRC)/hsv.h
+hypertorus.o: $(UTILS_SRC)/resources.h
+hypertorus.o: $(UTILS_SRC)/usleep.h
+hypertorus.o: $(UTILS_SRC)/visual.h
+hypertorus.o: $(UTILS_SRC)/yarandom.h
+hypertorus.o: $(HACK_SRC)/xlockmoreI.h
+hypertorus.o: $(HACK_SRC)/xlockmore.h
+hypnowheel.o: ../../config.h
+hypnowheel.o: $(HACK_SRC)/fps.h
+hypnowheel.o: $(HACK_SRC)/recanim.h
+hypnowheel.o: $(srcdir)/rotator.h
+hypnowheel.o: $(HACK_SRC)/screenhackI.h
+hypnowheel.o: $(UTILS_SRC)/colors.h
+hypnowheel.o: $(UTILS_SRC)/erase.h
+hypnowheel.o: $(UTILS_SRC)/font-retry.h
+hypnowheel.o: $(UTILS_SRC)/grabscreen.h
+hypnowheel.o: $(UTILS_SRC)/hsv.h
+hypnowheel.o: $(UTILS_SRC)/resources.h
+hypnowheel.o: $(UTILS_SRC)/usleep.h
+hypnowheel.o: $(UTILS_SRC)/visual.h
+hypnowheel.o: $(UTILS_SRC)/yarandom.h
+hypnowheel.o: $(HACK_SRC)/xlockmoreI.h
+hypnowheel.o: $(HACK_SRC)/xlockmore.h
+involute.o: ../../config.h
+involute.o: $(HACK_SRC)/fps.h
+involute.o: $(srcdir)/involute.h
+involute.o: $(srcdir)/normals.h
+involute.o: $(HACK_SRC)/recanim.h
+involute.o: $(HACK_SRC)/screenhackI.h
+involute.o: $(UTILS_SRC)/colors.h
+involute.o: $(UTILS_SRC)/font-retry.h
+involute.o: $(UTILS_SRC)/grabscreen.h
+involute.o: $(UTILS_SRC)/hsv.h
+involute.o: $(UTILS_SRC)/resources.h
+involute.o: $(UTILS_SRC)/usleep.h
+involute.o: $(UTILS_SRC)/visual.h
+involute.o: $(UTILS_SRC)/yarandom.h
+jigglypuff.o: ../../config.h
+jigglypuff.o: $(HACK_SRC)/fps.h
+jigglypuff.o: $(srcdir)/gltrackball.h
+jigglypuff.o: $(HACK_SRC)/images/gen/jigglymap_png.h
+jigglypuff.o: $(HACK_SRC)/recanim.h
+jigglypuff.o: $(HACK_SRC)/screenhackI.h
+jigglypuff.o: $(UTILS_SRC)/colors.h
+jigglypuff.o: $(UTILS_SRC)/erase.h
+jigglypuff.o: $(UTILS_SRC)/font-retry.h
+jigglypuff.o: $(UTILS_SRC)/grabscreen.h
+jigglypuff.o: $(UTILS_SRC)/hsv.h
+jigglypuff.o: $(UTILS_SRC)/resources.h
+jigglypuff.o: $(UTILS_SRC)/usleep.h
+jigglypuff.o: $(UTILS_SRC)/visual.h
+jigglypuff.o: $(UTILS_SRC)/yarandom.h
+jigglypuff.o: $(HACK_SRC)/ximage-loader.h
+jigglypuff.o: $(HACK_SRC)/xlockmoreI.h
+jigglypuff.o: $(HACK_SRC)/xlockmore.h
+jigsaw.o: ../../config.h
+jigsaw.o: $(HACK_SRC)/fps.h
+jigsaw.o: $(srcdir)/gltrackball.h
+jigsaw.o: $(srcdir)/grab-ximage.h
+jigsaw.o: $(srcdir)/normals.h
+jigsaw.o: $(HACK_SRC)/recanim.h
+jigsaw.o: $(srcdir)/rotator.h
+jigsaw.o: $(HACK_SRC)/screenhackI.h
+jigsaw.o: $(srcdir)/texfont.h
+jigsaw.o: $(UTILS_SRC)/colors.h
+jigsaw.o: $(UTILS_SRC)/erase.h
+jigsaw.o: $(UTILS_SRC)/font-retry.h
+jigsaw.o: $(UTILS_SRC)/grabscreen.h
+jigsaw.o: $(UTILS_SRC)/hsv.h
+jigsaw.o: $(UTILS_SRC)/resources.h
+jigsaw.o: $(UTILS_SRC)/spline.h
+jigsaw.o: $(UTILS_SRC)/usleep.h
+jigsaw.o: $(UTILS_SRC)/visual.h
+jigsaw.o: $(UTILS_SRC)/yarandom.h
+jigsaw.o: $(HACK_SRC)/xlockmoreI.h
+jigsaw.o: $(HACK_SRC)/xlockmore.h
+juggler3d.o: ../../config.h
+juggler3d.o: $(HACK_SRC)/fps.h
+juggler3d.o: $(srcdir)/gltrackball.h
+juggler3d.o: $(HACK_SRC)/recanim.h
+juggler3d.o: $(srcdir)/rotator.h
+juggler3d.o: $(HACK_SRC)/screenhackI.h
+juggler3d.o: $(srcdir)/sphere.h
+juggler3d.o: $(srcdir)/texfont.h
+juggler3d.o: $(srcdir)/tube.h
+juggler3d.o: $(UTILS_SRC)/colors.h
+juggler3d.o: $(UTILS_SRC)/erase.h
+juggler3d.o: $(UTILS_SRC)/font-retry.h
+juggler3d.o: $(UTILS_SRC)/grabscreen.h
+juggler3d.o: $(UTILS_SRC)/hsv.h
+juggler3d.o: $(UTILS_SRC)/resources.h
+juggler3d.o: $(UTILS_SRC)/usleep.h
+juggler3d.o: $(UTILS_SRC)/visual.h
+juggler3d.o: $(UTILS_SRC)/yarandom.h
+juggler3d.o: $(HACK_SRC)/xlockmoreI.h
+juggler3d.o: $(HACK_SRC)/xlockmore.h
+kaleidocycle.o: ../../config.h
+kaleidocycle.o: $(HACK_SRC)/fps.h
+kaleidocycle.o: $(srcdir)/gltrackball.h
+kaleidocycle.o: $(srcdir)/normals.h
+kaleidocycle.o: $(HACK_SRC)/recanim.h
+kaleidocycle.o: $(srcdir)/rotator.h
+kaleidocycle.o: $(HACK_SRC)/screenhackI.h
+kaleidocycle.o: $(UTILS_SRC)/colors.h
+kaleidocycle.o: $(UTILS_SRC)/erase.h
+kaleidocycle.o: $(UTILS_SRC)/font-retry.h
+kaleidocycle.o: $(UTILS_SRC)/grabscreen.h
+kaleidocycle.o: $(UTILS_SRC)/hsv.h
+kaleidocycle.o: $(UTILS_SRC)/resources.h
+kaleidocycle.o: $(UTILS_SRC)/usleep.h
+kaleidocycle.o: $(UTILS_SRC)/visual.h
+kaleidocycle.o: $(UTILS_SRC)/yarandom.h
+kaleidocycle.o: $(HACK_SRC)/xlockmoreI.h
+kaleidocycle.o: $(HACK_SRC)/xlockmore.h
+klein.o: ../../config.h
+klein.o: $(srcdir)/curlicue.h
+klein.o: $(HACK_SRC)/fps.h
+klein.o: $(srcdir)/gltrackball.h
+klein.o: $(HACK_SRC)/recanim.h
+klein.o: $(HACK_SRC)/screenhackI.h
+klein.o: $(UTILS_SRC)/colors.h
+klein.o: $(UTILS_SRC)/erase.h
+klein.o: $(UTILS_SRC)/font-retry.h
+klein.o: $(UTILS_SRC)/grabscreen.h
+klein.o: $(UTILS_SRC)/hsv.h
+klein.o: $(UTILS_SRC)/resources.h
+klein.o: $(UTILS_SRC)/usleep.h
+klein.o: $(UTILS_SRC)/visual.h
+klein.o: $(UTILS_SRC)/yarandom.h
+klein.o: $(HACK_SRC)/xlockmoreI.h
+klein.o: $(HACK_SRC)/xlockmore.h
+lament_model.o: ../../config.h
+lament_model.o: $(srcdir)/gllist.h
+lament.o: ../../config.h
+lament.o: $(HACK_SRC)/fps.h
+lament.o: $(srcdir)/gllist.h
+lament.o: $(srcdir)/gltrackball.h
+lament.o: $(HACK_SRC)/images/gen/lament512_png.h
+lament.o: $(srcdir)/normals.h
+lament.o: $(HACK_SRC)/recanim.h
+lament.o: $(srcdir)/rotator.h
+lament.o: $(HACK_SRC)/screenhackI.h
+lament.o: $(UTILS_SRC)/colors.h
+lament.o: $(UTILS_SRC)/erase.h
+lament.o: $(UTILS_SRC)/font-retry.h
+lament.o: $(UTILS_SRC)/grabscreen.h
+lament.o: $(UTILS_SRC)/hsv.h
+lament.o: $(UTILS_SRC)/resources.h
+lament.o: $(UTILS_SRC)/usleep.h
+lament.o: $(UTILS_SRC)/visual.h
+lament.o: $(UTILS_SRC)/yarandom.h
+lament.o: $(HACK_SRC)/ximage-loader.h
+lament.o: $(HACK_SRC)/xlockmoreI.h
+lament.o: $(HACK_SRC)/xlockmore.h
+lavalite.o: ../../config.h
+lavalite.o: $(HACK_SRC)/fps.h
+lavalite.o: $(srcdir)/gltrackball.h
+lavalite.o: $(srcdir)/marching.h
+lavalite.o: $(HACK_SRC)/recanim.h
+lavalite.o: $(srcdir)/rotator.h
+lavalite.o: $(HACK_SRC)/screenhackI.h
+lavalite.o: $(UTILS_SRC)/colors.h
+lavalite.o: $(UTILS_SRC)/erase.h
+lavalite.o: $(UTILS_SRC)/font-retry.h
+lavalite.o: $(UTILS_SRC)/grabscreen.h
+lavalite.o: $(UTILS_SRC)/hsv.h
+lavalite.o: $(UTILS_SRC)/resources.h
+lavalite.o: $(UTILS_SRC)/usleep.h
+lavalite.o: $(UTILS_SRC)/visual.h
+lavalite.o: $(UTILS_SRC)/yarandom.h
+lavalite.o: $(HACK_SRC)/ximage-loader.h
+lavalite.o: $(HACK_SRC)/xlockmoreI.h
+lavalite.o: $(HACK_SRC)/xlockmore.h
+lockward.o: ../../config.h
+lockward.o: $(HACK_SRC)/fps.h
+lockward.o: $(HACK_SRC)/recanim.h
+lockward.o: $(HACK_SRC)/screenhackI.h
+lockward.o: $(UTILS_SRC)/colors.h
+lockward.o: $(UTILS_SRC)/erase.h
+lockward.o: $(UTILS_SRC)/font-retry.h
+lockward.o: $(UTILS_SRC)/grabscreen.h
+lockward.o: $(UTILS_SRC)/hsv.h
+lockward.o: $(UTILS_SRC)/resources.h
+lockward.o: $(UTILS_SRC)/usleep.h
+lockward.o: $(UTILS_SRC)/visual.h
+lockward.o: $(UTILS_SRC)/yarandom.h
+lockward.o: $(HACK_SRC)/xlockmoreI.h
+lockward.o: $(HACK_SRC)/xlockmore.h
+marching.o: ../../config.h
+marching.o: $(srcdir)/marching.h
+marching.o: $(srcdir)/normals.h
+maze3d.o: ../../config.h
+maze3d.o: $(HACK_SRC)/fps.h
+maze3d.o: $(HACK_SRC)/images/gen/bob_png.h
+maze3d.o: $(HACK_SRC)/images/gen/brick1_png.h
+maze3d.o: $(HACK_SRC)/images/gen/brick2_png.h
+maze3d.o: $(HACK_SRC)/images/gen/logo-32_png.h
+maze3d.o: $(HACK_SRC)/images/gen/start_png.h
+maze3d.o: $(HACK_SRC)/images/gen/wood2_png.h
+maze3d.o: $(HACK_SRC)/recanim.h
+maze3d.o: $(HACK_SRC)/screenhackI.h
+maze3d.o: $(UTILS_SRC)/colors.h
+maze3d.o: $(UTILS_SRC)/erase.h
+maze3d.o: $(UTILS_SRC)/font-retry.h
+maze3d.o: $(UTILS_SRC)/grabscreen.h
+maze3d.o: $(UTILS_SRC)/hsv.h
+maze3d.o: $(UTILS_SRC)/resources.h
+maze3d.o: $(UTILS_SRC)/usleep.h
+maze3d.o: $(UTILS_SRC)/visual.h
+maze3d.o: $(UTILS_SRC)/yarandom.h
+maze3d.o: $(HACK_SRC)/ximage-loader.h
+maze3d.o: $(HACK_SRC)/xlockmoreI.h
+maze3d.o: $(HACK_SRC)/xlockmore.h
+menger.o: ../../config.h
+menger.o: $(HACK_SRC)/fps.h
+menger.o: $(srcdir)/gltrackball.h
+menger.o: $(HACK_SRC)/recanim.h
+menger.o: $(srcdir)/rotator.h
+menger.o: $(HACK_SRC)/screenhackI.h
+menger.o: $(UTILS_SRC)/colors.h
+menger.o: $(UTILS_SRC)/erase.h
+menger.o: $(UTILS_SRC)/font-retry.h
+menger.o: $(UTILS_SRC)/grabscreen.h
+menger.o: $(UTILS_SRC)/hsv.h
+menger.o: $(UTILS_SRC)/resources.h
+menger.o: $(UTILS_SRC)/usleep.h
+menger.o: $(UTILS_SRC)/visual.h
+menger.o: $(UTILS_SRC)/yarandom.h
+menger.o: $(HACK_SRC)/xlockmoreI.h
+menger.o: $(HACK_SRC)/xlockmore.h
+mirrorblob.o: ../../config.h
+mirrorblob.o: $(HACK_SRC)/fps.h
+mirrorblob.o: $(srcdir)/gltrackball.h
+mirrorblob.o: $(srcdir)/grab-ximage.h
+mirrorblob.o: $(HACK_SRC)/recanim.h
+mirrorblob.o: $(HACK_SRC)/screenhackI.h
+mirrorblob.o: $(UTILS_SRC)/colors.h
+mirrorblob.o: $(UTILS_SRC)/erase.h
+mirrorblob.o: $(UTILS_SRC)/font-retry.h
+mirrorblob.o: $(UTILS_SRC)/grabscreen.h
+mirrorblob.o: $(UTILS_SRC)/hsv.h
+mirrorblob.o: $(UTILS_SRC)/resources.h
+mirrorblob.o: $(UTILS_SRC)/usleep.h
+mirrorblob.o: $(UTILS_SRC)/visual.h
+mirrorblob.o: $(UTILS_SRC)/yarandom.h
+mirrorblob.o: $(HACK_SRC)/xlockmoreI.h
+mirrorblob.o: $(HACK_SRC)/xlockmore.h
+moebiusgears.o: ../../config.h
+moebiusgears.o: $(HACK_SRC)/fps.h
+moebiusgears.o: $(srcdir)/gltrackball.h
+moebiusgears.o: $(srcdir)/involute.h
+moebiusgears.o: $(srcdir)/normals.h
+moebiusgears.o: $(HACK_SRC)/recanim.h
+moebiusgears.o: $(srcdir)/rotator.h
+moebiusgears.o: $(HACK_SRC)/screenhackI.h
+moebiusgears.o: $(UTILS_SRC)/colors.h
+moebiusgears.o: $(UTILS_SRC)/erase.h
+moebiusgears.o: $(UTILS_SRC)/font-retry.h
+moebiusgears.o: $(UTILS_SRC)/grabscreen.h
+moebiusgears.o: $(UTILS_SRC)/hsv.h
+moebiusgears.o: $(UTILS_SRC)/resources.h
+moebiusgears.o: $(UTILS_SRC)/usleep.h
+moebiusgears.o: $(UTILS_SRC)/visual.h
+moebiusgears.o: $(UTILS_SRC)/yarandom.h
+moebiusgears.o: $(HACK_SRC)/xlockmoreI.h
+moebiusgears.o: $(HACK_SRC)/xlockmore.h
+moebius.o: ../../config.h
+moebius.o: $(HACK_SRC)/fps.h
+moebius.o: $(srcdir)/gltrackball.h
+moebius.o: $(HACK_SRC)/recanim.h
+moebius.o: $(srcdir)/rotator.h
+moebius.o: $(HACK_SRC)/screenhackI.h
+moebius.o: $(srcdir)/sphere.h
+moebius.o: $(srcdir)/tube.h
+moebius.o: $(UTILS_SRC)/colors.h
+moebius.o: $(UTILS_SRC)/erase.h
+moebius.o: $(UTILS_SRC)/font-retry.h
+moebius.o: $(UTILS_SRC)/grabscreen.h
+moebius.o: $(UTILS_SRC)/hsv.h
+moebius.o: $(UTILS_SRC)/resources.h
+moebius.o: $(UTILS_SRC)/usleep.h
+moebius.o: $(UTILS_SRC)/visual.h
+moebius.o: $(UTILS_SRC)/yarandom.h
+moebius.o: $(HACK_SRC)/xlockmoreI.h
+moebius.o: $(HACK_SRC)/xlockmore.h
+molecule.o: ../../config.h
+molecule.o: $(HACK_SRC)/fps.h
+molecule.o: $(srcdir)/gltrackball.h
+molecule.o: molecules.h
+molecule.o: $(HACK_SRC)/recanim.h
+molecule.o: $(srcdir)/rotator.h
+molecule.o: $(HACK_SRC)/screenhackI.h
+molecule.o: $(srcdir)/sphere.h
+molecule.o: $(srcdir)/texfont.h
+molecule.o: $(srcdir)/tube.h
+molecule.o: $(UTILS_SRC)/colors.h
+molecule.o: $(UTILS_SRC)/erase.h
+molecule.o: $(UTILS_SRC)/font-retry.h
+molecule.o: $(UTILS_SRC)/grabscreen.h
+molecule.o: $(UTILS_SRC)/hsv.h
+molecule.o: $(UTILS_SRC)/resources.h
+molecule.o: $(UTILS_SRC)/usleep.h
+molecule.o: $(UTILS_SRC)/visual.h
+molecule.o: $(UTILS_SRC)/yarandom.h
+molecule.o: $(HACK_SRC)/xlockmoreI.h
+molecule.o: $(HACK_SRC)/xlockmore.h
+morph3d.o: ../../config.h
+morph3d.o: $(HACK_SRC)/fps.h
+morph3d.o: $(HACK_SRC)/recanim.h
+morph3d.o: $(HACK_SRC)/screenhackI.h
+morph3d.o: $(UTILS_SRC)/colors.h
+morph3d.o: $(UTILS_SRC)/erase.h
+morph3d.o: $(UTILS_SRC)/font-retry.h
+morph3d.o: $(UTILS_SRC)/grabscreen.h
+morph3d.o: $(UTILS_SRC)/hsv.h
+morph3d.o: $(UTILS_SRC)/resources.h
+morph3d.o: $(UTILS_SRC)/usleep.h
+morph3d.o: $(UTILS_SRC)/visual.h
+morph3d.o: $(UTILS_SRC)/yarandom.h
+morph3d.o: $(HACK_SRC)/xlockmoreI.h
+morph3d.o: $(HACK_SRC)/xlockmore.h
+noof.o: ../../config.h
+noof.o: $(HACK_SRC)/fps.h
+noof.o: $(HACK_SRC)/recanim.h
+noof.o: $(HACK_SRC)/screenhackI.h
+noof.o: $(UTILS_SRC)/colors.h
+noof.o: $(UTILS_SRC)/erase.h
+noof.o: $(UTILS_SRC)/font-retry.h
+noof.o: $(UTILS_SRC)/grabscreen.h
+noof.o: $(UTILS_SRC)/hsv.h
+noof.o: $(UTILS_SRC)/pow2.h
+noof.o: $(UTILS_SRC)/resources.h
+noof.o: $(UTILS_SRC)/usleep.h
+noof.o: $(UTILS_SRC)/visual.h
+noof.o: $(UTILS_SRC)/yarandom.h
+noof.o: $(HACK_SRC)/xlockmoreI.h
+noof.o: $(HACK_SRC)/xlockmore.h
+normals.o: ../../config.h
+normals.o: $(srcdir)/normals.h
+peepers.o: ../../config.h
+peepers.o: $(HACK_SRC)/fps.h
+peepers.o: $(srcdir)/gltrackball.h
+peepers.o: $(HACK_SRC)/images/gen/iris_png.h
+peepers.o: $(HACK_SRC)/images/gen/sclera_png.h
+peepers.o: $(srcdir)/normals.h
+peepers.o: $(HACK_SRC)/recanim.h
+peepers.o: $(srcdir)/rotator.h
+peepers.o: $(HACK_SRC)/screenhackI.h
+peepers.o: $(UTILS_SRC)/colors.h
+peepers.o: $(UTILS_SRC)/erase.h
+peepers.o: $(UTILS_SRC)/font-retry.h
+peepers.o: $(UTILS_SRC)/grabscreen.h
+peepers.o: $(UTILS_SRC)/hsv.h
+peepers.o: $(UTILS_SRC)/resources.h
+peepers.o: $(UTILS_SRC)/usleep.h
+peepers.o: $(UTILS_SRC)/visual.h
+peepers.o: $(UTILS_SRC)/yarandom.h
+peepers.o: $(HACK_SRC)/ximage-loader.h
+peepers.o: $(HACK_SRC)/xlockmoreI.h
+peepers.o: $(HACK_SRC)/xlockmore.h
+photopile.o: ../../config.h
+photopile.o: $(srcdir)/dropshadow.h
+photopile.o: $(HACK_SRC)/fps.h
+photopile.o: $(srcdir)/grab-ximage.h
+photopile.o: $(HACK_SRC)/recanim.h
+photopile.o: $(HACK_SRC)/screenhackI.h
+photopile.o: $(srcdir)/texfont.h
+photopile.o: $(UTILS_SRC)/colors.h
+photopile.o: $(UTILS_SRC)/erase.h
+photopile.o: $(UTILS_SRC)/font-retry.h
+photopile.o: $(UTILS_SRC)/grabscreen.h
+photopile.o: $(UTILS_SRC)/hsv.h
+photopile.o: $(UTILS_SRC)/resources.h
+photopile.o: $(UTILS_SRC)/usleep.h
+photopile.o: $(UTILS_SRC)/visual.h
+photopile.o: $(UTILS_SRC)/yarandom.h
+photopile.o: $(HACK_SRC)/xlockmoreI.h
+photopile.o: $(HACK_SRC)/xlockmore.h
+pinion.o: ../../config.h
+pinion.o: $(HACK_SRC)/fps.h
+pinion.o: $(srcdir)/gltrackball.h
+pinion.o: $(srcdir)/involute.h
+pinion.o: $(srcdir)/normals.h
+pinion.o: $(HACK_SRC)/recanim.h
+pinion.o: $(HACK_SRC)/screenhackI.h
+pinion.o: $(srcdir)/texfont.h
+pinion.o: $(UTILS_SRC)/colors.h
+pinion.o: $(UTILS_SRC)/erase.h
+pinion.o: $(UTILS_SRC)/font-retry.h
+pinion.o: $(UTILS_SRC)/grabscreen.h
+pinion.o: $(UTILS_SRC)/hsv.h
+pinion.o: $(UTILS_SRC)/resources.h
+pinion.o: $(UTILS_SRC)/usleep.h
+pinion.o: $(UTILS_SRC)/visual.h
+pinion.o: $(UTILS_SRC)/yarandom.h
+pinion.o: $(HACK_SRC)/xlockmoreI.h
+pinion.o: $(HACK_SRC)/xlockmore.h
+pipeobjs.o: $(srcdir)/buildlwo.h
+pipeobjs.o: ../../config.h
+pipes.o: $(srcdir)/buildlwo.h
+pipes.o: ../../config.h
+pipes.o: $(HACK_SRC)/fps.h
+pipes.o: $(srcdir)/gltrackball.h
+pipes.o: $(HACK_SRC)/recanim.h
+pipes.o: $(HACK_SRC)/screenhackI.h
+pipes.o: $(srcdir)/sphere.h
+pipes.o: $(srcdir)/teapot.h
+pipes.o: $(UTILS_SRC)/colors.h
+pipes.o: $(UTILS_SRC)/erase.h
+pipes.o: $(UTILS_SRC)/font-retry.h
+pipes.o: $(UTILS_SRC)/grabscreen.h
+pipes.o: $(UTILS_SRC)/hsv.h
+pipes.o: $(UTILS_SRC)/resources.h
+pipes.o: $(UTILS_SRC)/usleep.h
+pipes.o: $(UTILS_SRC)/visual.h
+pipes.o: $(UTILS_SRC)/yarandom.h
+pipes.o: $(HACK_SRC)/xlockmoreI.h
+pipes.o: $(HACK_SRC)/xlockmore.h
+polyhedra-gl.o: ../../config.h
+polyhedra-gl.o: $(HACK_SRC)/fps.h
+polyhedra-gl.o: $(srcdir)/gltrackball.h
+polyhedra-gl.o: $(srcdir)/normals.h
+polyhedra-gl.o: $(srcdir)/polyhedra.h
+polyhedra-gl.o: $(HACK_SRC)/recanim.h
+polyhedra-gl.o: $(srcdir)/rotator.h
+polyhedra-gl.o: $(HACK_SRC)/screenhackI.h
+polyhedra-gl.o: $(srcdir)/teapot.h
+polyhedra-gl.o: $(srcdir)/texfont.h
+polyhedra-gl.o: $(UTILS_SRC)/colors.h
+polyhedra-gl.o: $(UTILS_SRC)/erase.h
+polyhedra-gl.o: $(UTILS_SRC)/font-retry.h
+polyhedra-gl.o: $(UTILS_SRC)/grabscreen.h
+polyhedra-gl.o: $(UTILS_SRC)/hsv.h
+polyhedra-gl.o: $(UTILS_SRC)/resources.h
+polyhedra-gl.o: $(UTILS_SRC)/usleep.h
+polyhedra-gl.o: $(UTILS_SRC)/visual.h
+polyhedra-gl.o: $(UTILS_SRC)/yarandom.h
+polyhedra-gl.o: $(HACK_SRC)/xlockmoreI.h
+polyhedra-gl.o: $(HACK_SRC)/xlockmore.h
+polyhedra.o: ../../config.h
+polyhedra.o: $(srcdir)/polyhedra.h
+polytopes.o: ../../config.h
+polytopes.o: $(HACK_SRC)/fps.h
+polytopes.o: $(srcdir)/gltrackball.h
+polytopes.o: $(HACK_SRC)/recanim.h
+polytopes.o: $(HACK_SRC)/screenhackI.h
+polytopes.o: $(UTILS_SRC)/colors.h
+polytopes.o: $(UTILS_SRC)/erase.h
+polytopes.o: $(UTILS_SRC)/font-retry.h
+polytopes.o: $(UTILS_SRC)/grabscreen.h
+polytopes.o: $(UTILS_SRC)/hsv.h
+polytopes.o: $(UTILS_SRC)/resources.h
+polytopes.o: $(UTILS_SRC)/usleep.h
+polytopes.o: $(UTILS_SRC)/visual.h
+polytopes.o: $(UTILS_SRC)/yarandom.h
+polytopes.o: $(HACK_SRC)/xlockmoreI.h
+polytopes.o: $(HACK_SRC)/xlockmore.h
+projectiveplane.o: ../../config.h
+projectiveplane.o: $(srcdir)/curlicue.h
+projectiveplane.o: $(HACK_SRC)/fps.h
+projectiveplane.o: $(srcdir)/gltrackball.h
+projectiveplane.o: $(HACK_SRC)/recanim.h
+projectiveplane.o: $(HACK_SRC)/screenhackI.h
+projectiveplane.o: $(UTILS_SRC)/colors.h
+projectiveplane.o: $(UTILS_SRC)/erase.h
+projectiveplane.o: $(UTILS_SRC)/font-retry.h
+projectiveplane.o: $(UTILS_SRC)/grabscreen.h
+projectiveplane.o: $(UTILS_SRC)/hsv.h
+projectiveplane.o: $(UTILS_SRC)/resources.h
+projectiveplane.o: $(UTILS_SRC)/usleep.h
+projectiveplane.o: $(UTILS_SRC)/visual.h
+projectiveplane.o: $(UTILS_SRC)/yarandom.h
+projectiveplane.o: $(HACK_SRC)/xlockmoreI.h
+projectiveplane.o: $(HACK_SRC)/xlockmore.h
+providence.o: ../../config.h
+providence.o: $(HACK_SRC)/fps.h
+providence.o: $(srcdir)/gltrackball.h
+providence.o: $(HACK_SRC)/recanim.h
+providence.o: $(HACK_SRC)/screenhackI.h
+providence.o: $(UTILS_SRC)/colors.h
+providence.o: $(UTILS_SRC)/erase.h
+providence.o: $(UTILS_SRC)/font-retry.h
+providence.o: $(UTILS_SRC)/grabscreen.h
+providence.o: $(UTILS_SRC)/hsv.h
+providence.o: $(UTILS_SRC)/resources.h
+providence.o: $(UTILS_SRC)/usleep.h
+providence.o: $(UTILS_SRC)/visual.h
+providence.o: $(UTILS_SRC)/yarandom.h
+providence.o: $(HACK_SRC)/xlockmoreI.h
+providence.o: $(HACK_SRC)/xlockmore.h
+pulsar.o: ../../config.h
+pulsar.o: $(HACK_SRC)/fps.h
+pulsar.o: $(HACK_SRC)/recanim.h
+pulsar.o: $(HACK_SRC)/screenhackI.h
+pulsar.o: $(UTILS_SRC)/colors.h
+pulsar.o: $(UTILS_SRC)/erase.h
+pulsar.o: $(UTILS_SRC)/font-retry.h
+pulsar.o: $(UTILS_SRC)/grabscreen.h
+pulsar.o: $(UTILS_SRC)/hsv.h
+pulsar.o: $(UTILS_SRC)/resources.h
+pulsar.o: $(UTILS_SRC)/usleep.h
+pulsar.o: $(UTILS_SRC)/visual.h
+pulsar.o: $(UTILS_SRC)/yarandom.h
+pulsar.o: $(HACK_SRC)/ximage-loader.h
+pulsar.o: $(HACK_SRC)/xlockmoreI.h
+pulsar.o: $(HACK_SRC)/xlockmore.h
+quasicrystal.o: ../../config.h
+quasicrystal.o: $(HACK_SRC)/fps.h
+quasicrystal.o: $(HACK_SRC)/recanim.h
+quasicrystal.o: $(srcdir)/rotator.h
+quasicrystal.o: $(HACK_SRC)/screenhackI.h
+quasicrystal.o: $(UTILS_SRC)/colors.h
+quasicrystal.o: $(UTILS_SRC)/erase.h
+quasicrystal.o: $(UTILS_SRC)/font-retry.h
+quasicrystal.o: $(UTILS_SRC)/grabscreen.h
+quasicrystal.o: $(UTILS_SRC)/hsv.h
+quasicrystal.o: $(UTILS_SRC)/resources.h
+quasicrystal.o: $(UTILS_SRC)/usleep.h
+quasicrystal.o: $(UTILS_SRC)/visual.h
+quasicrystal.o: $(UTILS_SRC)/yarandom.h
+quasicrystal.o: $(HACK_SRC)/xlockmoreI.h
+quasicrystal.o: $(HACK_SRC)/xlockmore.h
+queens.o: $(srcdir)/chessmodels.h
+queens.o: ../../config.h
+queens.o: $(HACK_SRC)/fps.h
+queens.o: $(srcdir)/gltrackball.h
+queens.o: $(HACK_SRC)/recanim.h
+queens.o: $(HACK_SRC)/screenhackI.h
+queens.o: $(UTILS_SRC)/colors.h
+queens.o: $(UTILS_SRC)/erase.h
+queens.o: $(UTILS_SRC)/font-retry.h
+queens.o: $(UTILS_SRC)/grabscreen.h
+queens.o: $(UTILS_SRC)/hsv.h
+queens.o: $(UTILS_SRC)/resources.h
+queens.o: $(UTILS_SRC)/usleep.h
+queens.o: $(UTILS_SRC)/visual.h
+queens.o: $(UTILS_SRC)/yarandom.h
+queens.o: $(HACK_SRC)/xlockmoreI.h
+queens.o: $(HACK_SRC)/xlockmore.h
+quickhull.o: ../../config.h
+quickhull.o: $(HACK_SRC)/fps.h
+quickhull.o: $(srcdir)/quickhull.h
+quickhull.o: $(HACK_SRC)/recanim.h
+quickhull.o: $(HACK_SRC)/screenhackI.h
+quickhull.o: $(UTILS_SRC)/colors.h
+quickhull.o: $(UTILS_SRC)/font-retry.h
+quickhull.o: $(UTILS_SRC)/grabscreen.h
+quickhull.o: $(UTILS_SRC)/hsv.h
+quickhull.o: $(UTILS_SRC)/resources.h
+quickhull.o: $(UTILS_SRC)/usleep.h
+quickhull.o: $(UTILS_SRC)/visual.h
+quickhull.o: $(UTILS_SRC)/yarandom.h
+raverhoop.o: ../../config.h
+raverhoop.o: $(HACK_SRC)/fps.h
+raverhoop.o: $(srcdir)/gltrackball.h
+raverhoop.o: $(HACK_SRC)/recanim.h
+raverhoop.o: $(srcdir)/rotator.h
+raverhoop.o: $(HACK_SRC)/screenhackI.h
+raverhoop.o: $(UTILS_SRC)/colors.h
+raverhoop.o: $(UTILS_SRC)/erase.h
+raverhoop.o: $(UTILS_SRC)/font-retry.h
+raverhoop.o: $(UTILS_SRC)/grabscreen.h
+raverhoop.o: $(UTILS_SRC)/hsv.h
+raverhoop.o: $(UTILS_SRC)/resources.h
+raverhoop.o: $(UTILS_SRC)/usleep.h
+raverhoop.o: $(UTILS_SRC)/visual.h
+raverhoop.o: $(UTILS_SRC)/yarandom.h
+raverhoop.o: $(HACK_SRC)/xlockmoreI.h
+raverhoop.o: $(HACK_SRC)/xlockmore.h
+razzledazzle.o: ../../config.h
+razzledazzle.o: $(HACK_SRC)/fps.h
+razzledazzle.o: $(srcdir)/gllist.h
+razzledazzle.o: $(srcdir)/normals.h
+razzledazzle.o: $(HACK_SRC)/recanim.h
+razzledazzle.o: $(HACK_SRC)/screenhackI.h
+razzledazzle.o: $(UTILS_SRC)/colors.h
+razzledazzle.o: $(UTILS_SRC)/erase.h
+razzledazzle.o: $(UTILS_SRC)/font-retry.h
+razzledazzle.o: $(UTILS_SRC)/grabscreen.h
+razzledazzle.o: $(UTILS_SRC)/hsv.h
+razzledazzle.o: $(UTILS_SRC)/resources.h
+razzledazzle.o: $(UTILS_SRC)/usleep.h
+razzledazzle.o: $(UTILS_SRC)/visual.h
+razzledazzle.o: $(UTILS_SRC)/yarandom.h
+razzledazzle.o: $(HACK_SRC)/xlockmoreI.h
+razzledazzle.o: $(HACK_SRC)/xlockmore.h
+robot.o: ../../config.h
+robot.o: $(srcdir)/gllist.h
+robot-wireframe.o: ../../config.h
+robot-wireframe.o: $(srcdir)/gllist.h
+romanboy.o: ../../config.h
+romanboy.o: $(srcdir)/curlicue.h
+romanboy.o: $(HACK_SRC)/fps.h
+romanboy.o: $(srcdir)/gltrackball.h
+romanboy.o: $(HACK_SRC)/recanim.h
+romanboy.o: $(HACK_SRC)/screenhackI.h
+romanboy.o: $(UTILS_SRC)/colors.h
+romanboy.o: $(UTILS_SRC)/erase.h
+romanboy.o: $(UTILS_SRC)/font-retry.h
+romanboy.o: $(UTILS_SRC)/grabscreen.h
+romanboy.o: $(UTILS_SRC)/hsv.h
+romanboy.o: $(UTILS_SRC)/resources.h
+romanboy.o: $(UTILS_SRC)/usleep.h
+romanboy.o: $(UTILS_SRC)/visual.h
+romanboy.o: $(UTILS_SRC)/yarandom.h
+romanboy.o: $(HACK_SRC)/xlockmoreI.h
+romanboy.o: $(HACK_SRC)/xlockmore.h
+rotator.o: ../../config.h
+rotator.o: $(srcdir)/rotator.h
+rotator.o: $(UTILS_SRC)/yarandom.h
+rubikblocks.o: ../../config.h
+rubikblocks.o: $(HACK_SRC)/fps.h
+rubikblocks.o: $(srcdir)/gltrackball.h
+rubikblocks.o: $(HACK_SRC)/recanim.h
+rubikblocks.o: $(srcdir)/rotator.h
+rubikblocks.o: $(HACK_SRC)/screenhackI.h
+rubikblocks.o: $(UTILS_SRC)/colors.h
+rubikblocks.o: $(UTILS_SRC)/erase.h
+rubikblocks.o: $(UTILS_SRC)/font-retry.h
+rubikblocks.o: $(UTILS_SRC)/grabscreen.h
+rubikblocks.o: $(UTILS_SRC)/hsv.h
+rubikblocks.o: $(UTILS_SRC)/resources.h
+rubikblocks.o: $(UTILS_SRC)/usleep.h
+rubikblocks.o: $(UTILS_SRC)/visual.h
+rubikblocks.o: $(UTILS_SRC)/yarandom.h
+rubikblocks.o: $(HACK_SRC)/xlockmoreI.h
+rubikblocks.o: $(HACK_SRC)/xlockmore.h
+rubik.o: ../../config.h
+rubik.o: $(HACK_SRC)/fps.h
+rubik.o: $(srcdir)/gltrackball.h
+rubik.o: $(HACK_SRC)/recanim.h
+rubik.o: $(HACK_SRC)/screenhackI.h
+rubik.o: $(UTILS_SRC)/colors.h
+rubik.o: $(UTILS_SRC)/erase.h
+rubik.o: $(UTILS_SRC)/font-retry.h
+rubik.o: $(UTILS_SRC)/grabscreen.h
+rubik.o: $(UTILS_SRC)/hsv.h
+rubik.o: $(UTILS_SRC)/resources.h
+rubik.o: $(UTILS_SRC)/usleep.h
+rubik.o: $(UTILS_SRC)/visual.h
+rubik.o: $(UTILS_SRC)/yarandom.h
+rubik.o: $(HACK_SRC)/xlockmoreI.h
+rubik.o: $(HACK_SRC)/xlockmore.h
+s1_1.o: ../../config.h
+s1_1.o: $(srcdir)/gllist.h
+s1_2.o: ../../config.h
+s1_2.o: $(srcdir)/gllist.h
+s1_3.o: ../../config.h
+s1_3.o: $(srcdir)/gllist.h
+s1_4.o: ../../config.h
+s1_4.o: $(srcdir)/gllist.h
+s1_5.o: ../../config.h
+s1_5.o: $(srcdir)/gllist.h
+s1_6.o: ../../config.h
+s1_6.o: $(srcdir)/gllist.h
+s1_b.o: ../../config.h
+s1_b.o: $(srcdir)/gllist.h
+sballs.o: ../../config.h
+sballs.o: $(HACK_SRC)/fps.h
+sballs.o: $(srcdir)/gltrackball.h
+sballs.o: $(HACK_SRC)/images/gen/sball-bg_png.h
+sballs.o: $(HACK_SRC)/images/gen/sball_png.h
+sballs.o: $(HACK_SRC)/recanim.h
+sballs.o: $(HACK_SRC)/screenhackI.h
+sballs.o: $(UTILS_SRC)/colors.h
+sballs.o: $(UTILS_SRC)/erase.h
+sballs.o: $(UTILS_SRC)/font-retry.h
+sballs.o: $(UTILS_SRC)/grabscreen.h
+sballs.o: $(UTILS_SRC)/hsv.h
+sballs.o: $(UTILS_SRC)/resources.h
+sballs.o: $(UTILS_SRC)/usleep.h
+sballs.o: $(UTILS_SRC)/visual.h
+sballs.o: $(UTILS_SRC)/yarandom.h
+sballs.o: $(HACK_SRC)/ximage-loader.h
+sballs.o: $(HACK_SRC)/xlockmoreI.h
+sballs.o: $(HACK_SRC)/xlockmore.h
+seccam.o: ../../config.h
+seccam.o: $(srcdir)/gllist.h
+shark.o: $(srcdir)/atlantis.h
+shark.o: ../../config.h
+shark.o: $(HACK_SRC)/fps.h
+shark.o: $(HACK_SRC)/recanim.h
+shark.o: $(HACK_SRC)/screenhackI.h
+shark.o: $(UTILS_SRC)/colors.h
+shark.o: $(UTILS_SRC)/font-retry.h
+shark.o: $(UTILS_SRC)/grabscreen.h
+shark.o: $(UTILS_SRC)/hsv.h
+shark.o: $(UTILS_SRC)/resources.h
+shark.o: $(UTILS_SRC)/usleep.h
+shark.o: $(UTILS_SRC)/visual.h
+shark.o: $(UTILS_SRC)/yarandom.h
+ships.o: ../../config.h
+ships.o: $(srcdir)/gllist.h
+sierpinski3d.o: ../../config.h
+sierpinski3d.o: $(HACK_SRC)/fps.h
+sierpinski3d.o: $(srcdir)/gltrackball.h
+sierpinski3d.o: $(HACK_SRC)/recanim.h
+sierpinski3d.o: $(srcdir)/rotator.h
+sierpinski3d.o: $(HACK_SRC)/screenhackI.h
+sierpinski3d.o: $(UTILS_SRC)/colors.h
+sierpinski3d.o: $(UTILS_SRC)/erase.h
+sierpinski3d.o: $(UTILS_SRC)/font-retry.h
+sierpinski3d.o: $(UTILS_SRC)/grabscreen.h
+sierpinski3d.o: $(UTILS_SRC)/hsv.h
+sierpinski3d.o: $(UTILS_SRC)/resources.h
+sierpinski3d.o: $(UTILS_SRC)/usleep.h
+sierpinski3d.o: $(UTILS_SRC)/visual.h
+sierpinski3d.o: $(UTILS_SRC)/yarandom.h
+sierpinski3d.o: $(HACK_SRC)/xlockmoreI.h
+sierpinski3d.o: $(HACK_SRC)/xlockmore.h
+skytentacles.o: ../../config.h
+skytentacles.o: $(HACK_SRC)/fps.h
+skytentacles.o: $(srcdir)/gltrackball.h
+skytentacles.o: $(HACK_SRC)/images/gen/scales_png.h
+skytentacles.o: $(srcdir)/normals.h
+skytentacles.o: $(HACK_SRC)/recanim.h
+skytentacles.o: $(srcdir)/rotator.h
+skytentacles.o: $(HACK_SRC)/screenhackI.h
+skytentacles.o: $(UTILS_SRC)/colors.h
+skytentacles.o: $(UTILS_SRC)/erase.h
+skytentacles.o: $(UTILS_SRC)/font-retry.h
+skytentacles.o: $(UTILS_SRC)/grabscreen.h
+skytentacles.o: $(UTILS_SRC)/hsv.h
+skytentacles.o: $(UTILS_SRC)/resources.h
+skytentacles.o: $(UTILS_SRC)/usleep.h
+skytentacles.o: $(UTILS_SRC)/visual.h
+skytentacles.o: $(UTILS_SRC)/yarandom.h
+skytentacles.o: $(HACK_SRC)/ximage-loader.h
+skytentacles.o: $(HACK_SRC)/xlockmoreI.h
+skytentacles.o: $(HACK_SRC)/xlockmore.h
+sonar-icmp.o: ../../config.h
+sonar-icmp.o: $(HACK_SRC)/fps.h
+sonar-icmp.o: $(HACK_SRC)/recanim.h
+sonar-icmp.o: $(HACK_SRC)/screenhackI.h
+sonar-icmp.o: $(srcdir)/sonar.h
+sonar-icmp.o: $(UTILS_SRC)/aligned_malloc.h
+sonar-icmp.o: $(UTILS_SRC)/async_netdb.h
+sonar-icmp.o: $(UTILS_SRC)/colors.h
+sonar-icmp.o: $(UTILS_SRC)/font-retry.h
+sonar-icmp.o: $(UTILS_SRC)/grabscreen.h
+sonar-icmp.o: $(UTILS_SRC)/hsv.h
+sonar-icmp.o: $(UTILS_SRC)/resources.h
+sonar-icmp.o: $(UTILS_SRC)/thread_util.h
+sonar-icmp.o: $(UTILS_SRC)/usleep.h
+sonar-icmp.o: $(UTILS_SRC)/version.h
+sonar-icmp.o: $(UTILS_SRC)/visual.h
+sonar-icmp.o: $(UTILS_SRC)/yarandom.h
+sonar.o: ../../config.h
+sonar.o: $(HACK_SRC)/fps.h
+sonar.o: $(srcdir)/gltrackball.h
+sonar.o: $(HACK_SRC)/recanim.h
+sonar.o: $(srcdir)/rotator.h
+sonar.o: $(HACK_SRC)/screenhackI.h
+sonar.o: $(srcdir)/sonar.h
+sonar.o: $(srcdir)/texfont.h
+sonar.o: $(UTILS_SRC)/aligned_malloc.h
+sonar.o: $(UTILS_SRC)/colors.h
+sonar.o: $(UTILS_SRC)/erase.h
+sonar.o: $(UTILS_SRC)/font-retry.h
+sonar.o: $(UTILS_SRC)/grabscreen.h
+sonar.o: $(UTILS_SRC)/hsv.h
+sonar.o: $(UTILS_SRC)/resources.h
+sonar.o: $(UTILS_SRC)/thread_util.h
+sonar.o: $(UTILS_SRC)/usleep.h
+sonar.o: $(UTILS_SRC)/visual.h
+sonar.o: $(UTILS_SRC)/yarandom.h
+sonar.o: $(HACK_SRC)/xlockmoreI.h
+sonar.o: $(HACK_SRC)/xlockmore.h
+sonar-sim.o: ../../config.h
+sonar-sim.o: $(HACK_SRC)/fps.h
+sonar-sim.o: $(HACK_SRC)/recanim.h
+sonar-sim.o: $(HACK_SRC)/screenhackI.h
+sonar-sim.o: $(srcdir)/sonar.h
+sonar-sim.o: $(UTILS_SRC)/colors.h
+sonar-sim.o: $(UTILS_SRC)/font-retry.h
+sonar-sim.o: $(UTILS_SRC)/grabscreen.h
+sonar-sim.o: $(UTILS_SRC)/hsv.h
+sonar-sim.o: $(UTILS_SRC)/resources.h
+sonar-sim.o: $(UTILS_SRC)/usleep.h
+sonar-sim.o: $(UTILS_SRC)/visual.h
+sonar-sim.o: $(UTILS_SRC)/yarandom.h
+spheremonics.o: ../../config.h
+spheremonics.o: $(HACK_SRC)/fps.h
+spheremonics.o: $(srcdir)/gltrackball.h
+spheremonics.o: $(srcdir)/normals.h
+spheremonics.o: $(HACK_SRC)/recanim.h
+spheremonics.o: $(srcdir)/rotator.h
+spheremonics.o: $(HACK_SRC)/screenhackI.h
+spheremonics.o: $(srcdir)/texfont.h
+spheremonics.o: $(UTILS_SRC)/colors.h
+spheremonics.o: $(UTILS_SRC)/erase.h
+spheremonics.o: $(UTILS_SRC)/font-retry.h
+spheremonics.o: $(UTILS_SRC)/grabscreen.h
+spheremonics.o: $(UTILS_SRC)/hsv.h
+spheremonics.o: $(UTILS_SRC)/resources.h
+spheremonics.o: $(UTILS_SRC)/usleep.h
+spheremonics.o: $(UTILS_SRC)/visual.h
+spheremonics.o: $(UTILS_SRC)/yarandom.h
+spheremonics.o: $(HACK_SRC)/xlockmoreI.h
+spheremonics.o: $(HACK_SRC)/xlockmore.h
+sphere.o: ../../config.h
+sphere.o: $(srcdir)/sphere.h
+splitflap.o: ../../config.h
+splitflap.o: $(HACK_SRC)/fps.h
+splitflap.o: $(srcdir)/gllist.h
+splitflap.o: $(srcdir)/gltrackball.h
+splitflap.o: $(HACK_SRC)/recanim.h
+splitflap.o: $(srcdir)/rotator.h
+splitflap.o: $(HACK_SRC)/screenhackI.h
+splitflap.o: $(srcdir)/texfont.h
+splitflap.o: $(UTILS_SRC)/colors.h
+splitflap.o: $(UTILS_SRC)/erase.h
+splitflap.o: $(UTILS_SRC)/font-retry.h
+splitflap.o: $(UTILS_SRC)/grabscreen.h
+splitflap.o: $(UTILS_SRC)/hsv.h
+splitflap.o: $(UTILS_SRC)/resources.h
+splitflap.o: $(UTILS_SRC)/textclient.h
+splitflap.o: $(UTILS_SRC)/usleep.h
+splitflap.o: $(UTILS_SRC)/utf8wc.h
+splitflap.o: $(UTILS_SRC)/visual.h
+splitflap.o: $(UTILS_SRC)/yarandom.h
+splitflap.o: $(HACK_SRC)/ximage-loader.h
+splitflap.o: $(HACK_SRC)/xlockmoreI.h
+splitflap.o: $(HACK_SRC)/xlockmore.h
+splitflap_obj.o: ../../config.h
+splitflap_obj.o: $(srcdir)/gllist.h
+splodesic.o: ../../config.h
+splodesic.o: $(HACK_SRC)/fps.h
+splodesic.o: $(srcdir)/gltrackball.h
+splodesic.o: $(srcdir)/normals.h
+splodesic.o: $(HACK_SRC)/recanim.h
+splodesic.o: $(srcdir)/rotator.h
+splodesic.o: $(HACK_SRC)/screenhackI.h
+splodesic.o: $(UTILS_SRC)/colors.h
+splodesic.o: $(UTILS_SRC)/erase.h
+splodesic.o: $(UTILS_SRC)/font-retry.h
+splodesic.o: $(UTILS_SRC)/grabscreen.h
+splodesic.o: $(UTILS_SRC)/hsv.h
+splodesic.o: $(UTILS_SRC)/resources.h
+splodesic.o: $(UTILS_SRC)/usleep.h
+splodesic.o: $(UTILS_SRC)/visual.h
+splodesic.o: $(UTILS_SRC)/yarandom.h
+splodesic.o: $(HACK_SRC)/xlockmoreI.h
+splodesic.o: $(HACK_SRC)/xlockmore.h
+sproingies.o: ../../config.h
+sproingies.o: $(HACK_SRC)/fps.h
+sproingies.o: $(srcdir)/gllist.h
+sproingies.o: $(HACK_SRC)/recanim.h
+sproingies.o: $(HACK_SRC)/screenhackI.h
+sproingies.o: $(srcdir)/sproingies.h
+sproingies.o: $(UTILS_SRC)/colors.h
+sproingies.o: $(UTILS_SRC)/erase.h
+sproingies.o: $(UTILS_SRC)/font-retry.h
+sproingies.o: $(UTILS_SRC)/grabscreen.h
+sproingies.o: $(UTILS_SRC)/hsv.h
+sproingies.o: $(UTILS_SRC)/resources.h
+sproingies.o: $(UTILS_SRC)/usleep.h
+sproingies.o: $(UTILS_SRC)/visual.h
+sproingies.o: $(UTILS_SRC)/yarandom.h
+sproingies.o: $(HACK_SRC)/xlockmoreI.h
+sproingiewrap.o: ../../config.h
+sproingiewrap.o: $(HACK_SRC)/fps.h
+sproingiewrap.o: $(HACK_SRC)/recanim.h
+sproingiewrap.o: $(HACK_SRC)/screenhackI.h
+sproingiewrap.o: $(srcdir)/sproingies.h
+sproingiewrap.o: $(UTILS_SRC)/colors.h
+sproingiewrap.o: $(UTILS_SRC)/erase.h
+sproingiewrap.o: $(UTILS_SRC)/font-retry.h
+sproingiewrap.o: $(UTILS_SRC)/grabscreen.h
+sproingiewrap.o: $(UTILS_SRC)/hsv.h
+sproingiewrap.o: $(UTILS_SRC)/resources.h
+sproingiewrap.o: $(UTILS_SRC)/usleep.h
+sproingiewrap.o: $(UTILS_SRC)/visual.h
+sproingiewrap.o: $(UTILS_SRC)/yarandom.h
+sproingiewrap.o: $(HACK_SRC)/xlockmoreI.h
+sproingiewrap.o: $(HACK_SRC)/xlockmore.h
+stairs.o: ../../config.h
+stairs.o: $(HACK_SRC)/fps.h
+stairs.o: $(srcdir)/gltrackball.h
+stairs.o: $(HACK_SRC)/images/gen/wood_png.h
+stairs.o: $(HACK_SRC)/recanim.h
+stairs.o: $(HACK_SRC)/screenhackI.h
+stairs.o: $(srcdir)/sphere.h
+stairs.o: $(UTILS_SRC)/colors.h
+stairs.o: $(UTILS_SRC)/erase.h
+stairs.o: $(UTILS_SRC)/font-retry.h
+stairs.o: $(UTILS_SRC)/grabscreen.h
+stairs.o: $(UTILS_SRC)/hsv.h
+stairs.o: $(UTILS_SRC)/resources.h
+stairs.o: $(UTILS_SRC)/usleep.h
+stairs.o: $(UTILS_SRC)/visual.h
+stairs.o: $(UTILS_SRC)/yarandom.h
+stairs.o: $(HACK_SRC)/ximage-loader.h
+stairs.o: $(HACK_SRC)/xlockmoreI.h
+stairs.o: $(HACK_SRC)/xlockmore.h
+starwars.o: ../../config.h
+starwars.o: $(HACK_SRC)/fps.h
+starwars.o: $(srcdir)/glut_roman.h
+starwars.o: $(srcdir)/glutstroke.h
+starwars.o: $(HACK_SRC)/recanim.h
+starwars.o: $(HACK_SRC)/screenhackI.h
+starwars.o: $(srcdir)/starwars.h
+starwars.o: $(srcdir)/texfont.h
+starwars.o: $(UTILS_SRC)/colors.h
+starwars.o: $(UTILS_SRC)/erase.h
+starwars.o: $(UTILS_SRC)/font-retry.h
+starwars.o: $(UTILS_SRC)/grabscreen.h
+starwars.o: $(UTILS_SRC)/hsv.h
+starwars.o: $(UTILS_SRC)/resources.h
+starwars.o: $(UTILS_SRC)/textclient.h
+starwars.o: $(UTILS_SRC)/usleep.h
+starwars.o: $(UTILS_SRC)/utf8wc.h
+starwars.o: $(UTILS_SRC)/visual.h
+starwars.o: $(UTILS_SRC)/yarandom.h
+starwars.o: $(HACK_SRC)/xlockmoreI.h
+starwars.o: $(HACK_SRC)/xlockmore.h
+stonerview-move.o: ../../config.h
+stonerview-move.o: $(srcdir)/stonerview.h
+stonerview-move.o: $(srcdir)/stonerview-move.h
+stonerview-move.o: $(srcdir)/stonerview-osc.h
+stonerview-move.o: $(UTILS_SRC)/yarandom.h
+stonerview.o: ../../config.h
+stonerview.o: $(HACK_SRC)/fps.h
+stonerview.o: $(srcdir)/gltrackball.h
+stonerview.o: $(HACK_SRC)/recanim.h
+stonerview.o: $(HACK_SRC)/screenhackI.h
+stonerview.o: $(srcdir)/stonerview.h
+stonerview.o: $(srcdir)/stonerview-move.h
+stonerview.o: $(srcdir)/stonerview-osc.h
+stonerview.o: $(UTILS_SRC)/colors.h
+stonerview.o: $(UTILS_SRC)/erase.h
+stonerview.o: $(UTILS_SRC)/font-retry.h
+stonerview.o: $(UTILS_SRC)/grabscreen.h
+stonerview.o: $(UTILS_SRC)/hsv.h
+stonerview.o: $(UTILS_SRC)/resources.h
+stonerview.o: $(UTILS_SRC)/usleep.h
+stonerview.o: $(UTILS_SRC)/visual.h
+stonerview.o: $(UTILS_SRC)/yarandom.h
+stonerview.o: $(HACK_SRC)/xlockmoreI.h
+stonerview.o: $(HACK_SRC)/xlockmore.h
+stonerview-osc.o: ../../config.h
+stonerview-osc.o: $(srcdir)/stonerview.h
+stonerview-osc.o: $(srcdir)/stonerview-move.h
+stonerview-osc.o: $(srcdir)/stonerview-osc.h
+stonerview-osc.o: $(UTILS_SRC)/yarandom.h
+stonerview-view.o: ../../config.h
+stonerview-view.o: $(srcdir)/stonerview.h
+stonerview-view.o: $(srcdir)/stonerview-move.h
+stonerview-view.o: $(srcdir)/stonerview-osc.h
+superquadrics.o: ../../config.h
+superquadrics.o: $(HACK_SRC)/fps.h
+superquadrics.o: $(HACK_SRC)/recanim.h
+superquadrics.o: $(HACK_SRC)/screenhackI.h
+superquadrics.o: $(UTILS_SRC)/colors.h
+superquadrics.o: $(UTILS_SRC)/erase.h
+superquadrics.o: $(UTILS_SRC)/font-retry.h
+superquadrics.o: $(UTILS_SRC)/grabscreen.h
+superquadrics.o: $(UTILS_SRC)/hsv.h
+superquadrics.o: $(UTILS_SRC)/resources.h
+superquadrics.o: $(UTILS_SRC)/usleep.h
+superquadrics.o: $(UTILS_SRC)/visual.h
+superquadrics.o: $(UTILS_SRC)/yarandom.h
+superquadrics.o: $(HACK_SRC)/xlockmoreI.h
+superquadrics.o: $(HACK_SRC)/xlockmore.h
+surfaces.o: ../../config.h
+surfaces.o: $(HACK_SRC)/fps.h
+surfaces.o: $(srcdir)/gltrackball.h
+surfaces.o: $(HACK_SRC)/recanim.h
+surfaces.o: $(srcdir)/rotator.h
+surfaces.o: $(HACK_SRC)/screenhackI.h
+surfaces.o: $(UTILS_SRC)/colors.h
+surfaces.o: $(UTILS_SRC)/erase.h
+surfaces.o: $(UTILS_SRC)/font-retry.h
+surfaces.o: $(UTILS_SRC)/grabscreen.h
+surfaces.o: $(UTILS_SRC)/hsv.h
+surfaces.o: $(UTILS_SRC)/resources.h
+surfaces.o: $(UTILS_SRC)/usleep.h
+surfaces.o: $(UTILS_SRC)/visual.h
+surfaces.o: $(UTILS_SRC)/yarandom.h
+surfaces.o: $(HACK_SRC)/xlockmoreI.h
+surfaces.o: $(HACK_SRC)/xlockmore.h
+swim.o: $(srcdir)/atlantis.h
+swim.o: ../../config.h
+swim.o: $(HACK_SRC)/fps.h
+swim.o: $(HACK_SRC)/recanim.h
+swim.o: $(HACK_SRC)/screenhackI.h
+swim.o: $(UTILS_SRC)/colors.h
+swim.o: $(UTILS_SRC)/erase.h
+swim.o: $(UTILS_SRC)/font-retry.h
+swim.o: $(UTILS_SRC)/grabscreen.h
+swim.o: $(UTILS_SRC)/hsv.h
+swim.o: $(UTILS_SRC)/resources.h
+swim.o: $(UTILS_SRC)/usleep.h
+swim.o: $(UTILS_SRC)/visual.h
+swim.o: $(UTILS_SRC)/yarandom.h
+swim.o: $(HACK_SRC)/xlockmoreI.h
+tangram.o: ../../config.h
+tangram.o: $(HACK_SRC)/fps.h
+tangram.o: $(HACK_SRC)/recanim.h
+tangram.o: $(HACK_SRC)/screenhackI.h
+tangram.o: $(srcdir)/tangram_shapes.h
+tangram.o: $(srcdir)/texfont.h
+tangram.o: $(UTILS_SRC)/colors.h
+tangram.o: $(UTILS_SRC)/erase.h
+tangram.o: $(UTILS_SRC)/font-retry.h
+tangram.o: $(UTILS_SRC)/grabscreen.h
+tangram.o: $(UTILS_SRC)/hsv.h
+tangram.o: $(UTILS_SRC)/resources.h
+tangram.o: $(UTILS_SRC)/usleep.h
+tangram.o: $(UTILS_SRC)/visual.h
+tangram.o: $(UTILS_SRC)/yarandom.h
+tangram.o: $(HACK_SRC)/xlockmoreI.h
+tangram.o: $(HACK_SRC)/xlockmore.h
+tangram_shapes.o: ../../config.h
+tangram_shapes.o: $(srcdir)/tangram_shapes.h
+teapot.o: ../../config.h
+teapot.o: $(srcdir)/teapot.h
+texfont.o: ../../config.h
+texfont.o: $(HACK_SRC)/fps.h
+texfont.o: $(srcdir)/texfont.h
+texfont.o: $(UTILS_SRC)/pow2.h
+texfont.o: $(UTILS_SRC)/resources.h
+texfont.o: $(UTILS_SRC)/xft.h
+texfont.o: $(UTILS_SRC)/xshm.h
+timetunnel.o: ../../config.h
+timetunnel.o: $(HACK_SRC)/fps.h
+timetunnel.o: $(srcdir)/gltrackball.h
+timetunnel.o: $(HACK_SRC)/images/gen/logo-180_png.h
+timetunnel.o: $(HACK_SRC)/images/gen/timetunnel0_png.h
+timetunnel.o: $(HACK_SRC)/images/gen/timetunnel1_png.h
+timetunnel.o: $(HACK_SRC)/images/gen/timetunnel2_png.h
+timetunnel.o: $(HACK_SRC)/images/gen/tunnelstar_png.h
+timetunnel.o: $(HACK_SRC)/recanim.h
+timetunnel.o: $(srcdir)/rotator.h
+timetunnel.o: $(HACK_SRC)/screenhackI.h
+timetunnel.o: $(UTILS_SRC)/colors.h
+timetunnel.o: $(UTILS_SRC)/erase.h
+timetunnel.o: $(UTILS_SRC)/font-retry.h
+timetunnel.o: $(UTILS_SRC)/grabscreen.h
+timetunnel.o: $(UTILS_SRC)/hsv.h
+timetunnel.o: $(UTILS_SRC)/resources.h
+timetunnel.o: $(UTILS_SRC)/usleep.h
+timetunnel.o: $(UTILS_SRC)/visual.h
+timetunnel.o: $(UTILS_SRC)/yarandom.h
+timetunnel.o: $(HACK_SRC)/ximage-loader.h
+timetunnel.o: $(HACK_SRC)/xlockmoreI.h
+timetunnel.o: $(HACK_SRC)/xlockmore.h
+toast2.o: ../../config.h
+toast2.o: $(srcdir)/gllist.h
+toaster_base.o: ../../config.h
+toaster_base.o: $(srcdir)/gllist.h
+toaster_handle2.o: ../../config.h
+toaster_handle2.o: $(srcdir)/gllist.h
+toaster_handle.o: ../../config.h
+toaster_handle.o: $(srcdir)/gllist.h
+toaster_jet.o: ../../config.h
+toaster_jet.o: $(srcdir)/gllist.h
+toaster_knob.o: ../../config.h
+toaster_knob.o: $(srcdir)/gllist.h
+toaster.o: ../../config.h
+toaster.o: $(srcdir)/gllist.h
+toaster_slots.o: ../../config.h
+toaster_slots.o: $(srcdir)/gllist.h
+toaster_wing.o: ../../config.h
+toaster_wing.o: $(srcdir)/gllist.h
+toast.o: ../../config.h
+toast.o: $(srcdir)/gllist.h
+topblock.o: ../../config.h
+topblock.o: $(HACK_SRC)/fps.h
+topblock.o: $(srcdir)/gltrackball.h
+topblock.o: $(HACK_SRC)/recanim.h
+topblock.o: $(HACK_SRC)/screenhackI.h
+topblock.o: $(srcdir)/sphere.h
+topblock.o: $(srcdir)/topblock.h
+topblock.o: $(srcdir)/tube.h
+topblock.o: $(UTILS_SRC)/colors.h
+topblock.o: $(UTILS_SRC)/erase.h
+topblock.o: $(UTILS_SRC)/font-retry.h
+topblock.o: $(UTILS_SRC)/grabscreen.h
+topblock.o: $(UTILS_SRC)/hsv.h
+topblock.o: $(UTILS_SRC)/resources.h
+topblock.o: $(UTILS_SRC)/usleep.h
+topblock.o: $(UTILS_SRC)/visual.h
+topblock.o: $(UTILS_SRC)/yarandom.h
+topblock.o: $(HACK_SRC)/xlockmoreI.h
+topblock.o: $(HACK_SRC)/xlockmore.h
+trackball.o: ../../config.h
+trackball.o: $(srcdir)/trackball.h
+tronbit_idle1.o: ../../config.h
+tronbit_idle1.o: $(srcdir)/gllist.h
+tronbit_idle2.o: ../../config.h
+tronbit_idle2.o: $(srcdir)/gllist.h
+tronbit_no.o: ../../config.h
+tronbit_no.o: $(srcdir)/gllist.h
+tronbit.o: ../../config.h
+tronbit.o: $(HACK_SRC)/fps.h
+tronbit.o: $(srcdir)/gllist.h
+tronbit.o: $(srcdir)/gltrackball.h
+tronbit.o: $(HACK_SRC)/recanim.h
+tronbit.o: $(srcdir)/rotator.h
+tronbit.o: $(HACK_SRC)/screenhackI.h
+tronbit.o: $(srcdir)/sphere.h
+tronbit.o: $(UTILS_SRC)/colors.h
+tronbit.o: $(UTILS_SRC)/erase.h
+tronbit.o: $(UTILS_SRC)/font-retry.h
+tronbit.o: $(UTILS_SRC)/grabscreen.h
+tronbit.o: $(UTILS_SRC)/hsv.h
+tronbit.o: $(UTILS_SRC)/resources.h
+tronbit.o: $(UTILS_SRC)/usleep.h
+tronbit.o: $(UTILS_SRC)/visual.h
+tronbit.o: $(UTILS_SRC)/yarandom.h
+tronbit.o: $(HACK_SRC)/xlockmoreI.h
+tronbit.o: $(HACK_SRC)/xlockmore.h
+tronbit_yes.o: ../../config.h
+tronbit_yes.o: $(srcdir)/gllist.h
+tube.o: ../../config.h
+tube.o: $(srcdir)/tube.h
+tunnel_draw.o: ../../config.h
+tunnel_draw.o: $(HACK_SRC)/fps.h
+tunnel_draw.o: $(HACK_SRC)/recanim.h
+tunnel_draw.o: $(HACK_SRC)/screenhackI.h
+tunnel_draw.o: $(srcdir)/tunnel_draw.h
+tunnel_draw.o: $(UTILS_SRC)/colors.h
+tunnel_draw.o: $(UTILS_SRC)/erase.h
+tunnel_draw.o: $(UTILS_SRC)/font-retry.h
+tunnel_draw.o: $(UTILS_SRC)/grabscreen.h
+tunnel_draw.o: $(UTILS_SRC)/hsv.h
+tunnel_draw.o: $(UTILS_SRC)/resources.h
+tunnel_draw.o: $(UTILS_SRC)/usleep.h
+tunnel_draw.o: $(UTILS_SRC)/visual.h
+tunnel_draw.o: $(UTILS_SRC)/yarandom.h
+tunnel_draw.o: $(HACK_SRC)/xlockmoreI.h
+unicrud.o: ../../config.h
+unicrud.o: $(HACK_SRC)/fps.h
+unicrud.o: $(srcdir)/gltrackball.h
+unicrud.o: $(HACK_SRC)/recanim.h
+unicrud.o: $(srcdir)/rotator.h
+unicrud.o: $(HACK_SRC)/screenhackI.h
+unicrud.o: $(srcdir)/texfont.h
+unicrud.o: $(UTILS_SRC)/colors.h
+unicrud.o: $(UTILS_SRC)/erase.h
+unicrud.o: $(UTILS_SRC)/font-retry.h
+unicrud.o: $(UTILS_SRC)/grabscreen.h
+unicrud.o: $(UTILS_SRC)/hsv.h
+unicrud.o: $(UTILS_SRC)/resources.h
+unicrud.o: $(UTILS_SRC)/usleep.h
+unicrud.o: $(UTILS_SRC)/utf8wc.h
+unicrud.o: $(UTILS_SRC)/visual.h
+unicrud.o: $(UTILS_SRC)/yarandom.h
+unicrud.o: $(HACK_SRC)/xlockmoreI.h
+unicrud.o: $(HACK_SRC)/xlockmore.h
+unknownpleasures.o: ../../config.h
+unknownpleasures.o: $(HACK_SRC)/fps.h
+unknownpleasures.o: $(srcdir)/gltrackball.h
+unknownpleasures.o: $(HACK_SRC)/recanim.h
+unknownpleasures.o: $(HACK_SRC)/screenhackI.h
+unknownpleasures.o: $(UTILS_SRC)/colors.h
+unknownpleasures.o: $(UTILS_SRC)/erase.h
+unknownpleasures.o: $(UTILS_SRC)/font-retry.h
+unknownpleasures.o: $(UTILS_SRC)/grabscreen.h
+unknownpleasures.o: $(UTILS_SRC)/hsv.h
+unknownpleasures.o: $(UTILS_SRC)/resources.h
+unknownpleasures.o: $(UTILS_SRC)/usleep.h
+unknownpleasures.o: $(UTILS_SRC)/visual.h
+unknownpleasures.o: $(UTILS_SRC)/yarandom.h
+unknownpleasures.o: $(HACK_SRC)/xlockmoreI.h
+unknownpleasures.o: $(HACK_SRC)/xlockmore.h
+vigilance.o: ../../config.h
+vigilance.o: $(HACK_SRC)/fps.h
+vigilance.o: $(srcdir)/gllist.h
+vigilance.o: $(srcdir)/gltrackball.h
+vigilance.o: $(srcdir)/normals.h
+vigilance.o: $(HACK_SRC)/recanim.h
+vigilance.o: $(HACK_SRC)/screenhackI.h
+vigilance.o: $(UTILS_SRC)/colors.h
+vigilance.o: $(UTILS_SRC)/erase.h
+vigilance.o: $(UTILS_SRC)/font-retry.h
+vigilance.o: $(UTILS_SRC)/grabscreen.h
+vigilance.o: $(UTILS_SRC)/hsv.h
+vigilance.o: $(UTILS_SRC)/resources.h
+vigilance.o: $(UTILS_SRC)/usleep.h
+vigilance.o: $(UTILS_SRC)/visual.h
+vigilance.o: $(UTILS_SRC)/yarandom.h
+vigilance.o: $(HACK_SRC)/ximage-loader.h
+vigilance.o: $(HACK_SRC)/xlockmoreI.h
+vigilance.o: $(HACK_SRC)/xlockmore.h
+voronoi.o: ../../config.h
+voronoi.o: $(HACK_SRC)/fps.h
+voronoi.o: $(HACK_SRC)/recanim.h
+voronoi.o: $(HACK_SRC)/screenhackI.h
+voronoi.o: $(UTILS_SRC)/colors.h
+voronoi.o: $(UTILS_SRC)/erase.h
+voronoi.o: $(UTILS_SRC)/font-retry.h
+voronoi.o: $(UTILS_SRC)/grabscreen.h
+voronoi.o: $(UTILS_SRC)/hsv.h
+voronoi.o: $(UTILS_SRC)/resources.h
+voronoi.o: $(UTILS_SRC)/usleep.h
+voronoi.o: $(UTILS_SRC)/visual.h
+voronoi.o: $(UTILS_SRC)/yarandom.h
+voronoi.o: $(HACK_SRC)/xlockmoreI.h
+voronoi.o: $(HACK_SRC)/xlockmore.h
+whale.o: $(srcdir)/atlantis.h
+whale.o: ../../config.h
+whale.o: $(HACK_SRC)/fps.h
+whale.o: $(HACK_SRC)/recanim.h
+whale.o: $(HACK_SRC)/screenhackI.h
+whale.o: $(UTILS_SRC)/colors.h
+whale.o: $(UTILS_SRC)/font-retry.h
+whale.o: $(UTILS_SRC)/grabscreen.h
+whale.o: $(UTILS_SRC)/hsv.h
+whale.o: $(UTILS_SRC)/resources.h
+whale.o: $(UTILS_SRC)/usleep.h
+whale.o: $(UTILS_SRC)/visual.h
+whale.o: $(UTILS_SRC)/yarandom.h
+winduprobot.o: ../../config.h
+winduprobot.o: $(HACK_SRC)/fps.h
+winduprobot.o: $(srcdir)/gllist.h
+winduprobot.o: $(srcdir)/gltrackball.h
+winduprobot.o: $(HACK_SRC)/images/gen/chromesphere_png.h
+winduprobot.o: $(srcdir)/involute.h
+winduprobot.o: $(HACK_SRC)/recanim.h
+winduprobot.o: $(HACK_SRC)/screenhackI.h
+winduprobot.o: $(srcdir)/sphere.h
+winduprobot.o: $(srcdir)/texfont.h
+winduprobot.o: $(UTILS_SRC)/colors.h
+winduprobot.o: $(UTILS_SRC)/erase.h
+winduprobot.o: $(UTILS_SRC)/font-retry.h
+winduprobot.o: $(UTILS_SRC)/grabscreen.h
+winduprobot.o: $(UTILS_SRC)/hsv.h
+winduprobot.o: $(UTILS_SRC)/resources.h
+winduprobot.o: $(UTILS_SRC)/textclient.h
+winduprobot.o: $(UTILS_SRC)/usleep.h
+winduprobot.o: $(UTILS_SRC)/visual.h
+winduprobot.o: $(UTILS_SRC)/yarandom.h
+winduprobot.o: $(HACK_SRC)/ximage-loader.h
+winduprobot.o: $(HACK_SRC)/xlockmoreI.h
+winduprobot.o: $(HACK_SRC)/xlockmore.h
+xlock-gl-utils.o: ../../config.h
+xlock-gl-utils.o: $(HACK_SRC)/fps.h
+xlock-gl-utils.o: $(HACK_SRC)/recanim.h
+xlock-gl-utils.o: $(HACK_SRC)/screenhackI.h
+xlock-gl-utils.o: $(srcdir)/texfont.h
+xlock-gl-utils.o: $(UTILS_SRC)/colors.h
+xlock-gl-utils.o: $(UTILS_SRC)/erase.h
+xlock-gl-utils.o: $(UTILS_SRC)/font-retry.h
+xlock-gl-utils.o: $(UTILS_SRC)/grabscreen.h
+xlock-gl-utils.o: $(UTILS_SRC)/hsv.h
+xlock-gl-utils.o: $(UTILS_SRC)/resources.h
+xlock-gl-utils.o: $(UTILS_SRC)/usleep.h
+xlock-gl-utils.o: $(UTILS_SRC)/visual.h
+xlock-gl-utils.o: $(UTILS_SRC)/yarandom.h
+xlock-gl-utils.o: $(HACK_SRC)/xlockmoreI.h
+xscreensaver-gl-helper.o: ../../config.h
+xscreensaver-gl-helper.o: $(UTILS_SRC)/utils.h
+xscreensaver-gl-helper.o: $(UTILS_SRC)/visual.h
+
diff --git a/hacks/glx/README b/hacks/glx/README
new file mode 100644
index 0000000..5142503
--- /dev/null
+++ b/hacks/glx/README
@@ -0,0 +1,10 @@
+
+This directory contains various graphics hacks that requre OpenGL. These are
+independent from the xscreensaver program (in the ../../driver/ directory)
+but some of them use the utility functions found in the ../../utils/ directory.
+
+If you have compilation problems, check the parameters in ../../config.h.
+
+If you're looking for a free implementation of the OpenGL library,
+check out <http://www.mesa3d.org/>. For general OpenGL info, see
+<http://www.opengl.org/>.
diff --git a/hacks/glx/antinspect.c b/hacks/glx/antinspect.c
new file mode 100644
index 0000000..ad3bef5
--- /dev/null
+++ b/hacks/glx/antinspect.c
@@ -0,0 +1,704 @@
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Copyright 2004 Blair Tennessy
+ * tennessy@cs.ubc.ca
+ */
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n"
+
+# define free_antinspect 0
+# define release_antinspect 0
+#include "xlockmore.h"
+#else
+#include "xlock.h"
+#endif
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+#else
+# include <X11/Xlib.h>
+# include <GL/gl.h>
+# include <GL/glu.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#include "sphere.h"
+#include "gltrackball.h"
+
+#define DEF_SHADOWS "True"
+
+static int shadows;
+
+static XrmOptionDescRec opts[] = {
+ {"-shadows", ".antinspect.shadows", XrmoptionNoArg, "on"},
+ {"+shadows", ".antinspect.shadows", XrmoptionNoArg, "off"}
+};
+
+static argtype vars[] = {
+ {&shadows, "shadows", "Shadows", DEF_SHADOWS, t_Bool}
+};
+
+static OptionStruct desc[] = {
+ {"-/+shadows", "turn on/off ant shadows"}
+};
+
+ENTRYPOINT ModeSpecOpt antinspect_opts = {sizeof opts / sizeof opts[0],
+ opts,
+ sizeof vars / sizeof vars[0],
+ vars,
+ desc};
+
+#ifdef USE_MODULES
+ModStruct antinspect_description =
+ {"antinspect", "init_antinspect", "draw_antinspect", (char *) NULL,
+ "draw_antinspect", "change_antinspect", (char *) NULL, &antinspect_opts,
+ 1000, 1, 1, 1, 4, 1.0, "",
+ "draws some ants", 0, NULL};
+#endif
+
+#define Scale4Window 0.3
+#define Scale4Iconic 0.4
+
+#define sqr(A) ((A)*(A))
+
+#ifndef Pi
+#define Pi M_PI
+#endif
+
+#define ObjAntinspectStrip 0
+#define ObjAntBody 1
+#define MaxObj 2
+
+/*************************************************************************/
+
+typedef struct {
+ GLint WindH, WindW;
+ GLfloat step;
+ GLfloat ant_position;
+ GLXContext *glx_context;
+ trackball_state *trackball;
+ Bool button_down_p;
+ int linewidth;
+ float ant_step;
+
+} antinspectstruct;
+
+static const float front_shininess[] = {60.0};
+static const float front_specular[] = {0.7, 0.7, 0.7, 1.0};
+static const float ambient[] = {0.0, 0.0, 0.0, 1.0};
+static const float diffuse[] = {1.0, 1.0, 1.0, 1.0};
+static float position0[] = {0.0, 3.0, 0.0, 1.0};
+static const float position1[] = {-1.0, -3.0, 1.0, 0.0};
+static const float lmodel_ambient[] = {0.5, 0.5, 0.5, 1.0};
+static const float lmodel_twoside[] = {GL_TRUE};
+
+static const float MaterialRed[] = {0.6, 0.0, 0.0, 1.0};
+static const float MaterialOrange[] = {1.0, 0.69, 0.00, 1.0};
+static const float MaterialGray[] = {0.2, 0.2, 0.2, 1.0};
+static const float MaterialBlack[] = {0.1, 0.1, 0.1, 0.4};
+static const float MaterialShadow[] = {0.3, 0.3, 0.3, 0.3};
+static const float MaterialGray5[] = {0.5, 0.5, 0.5, 0.3};
+static const float MaterialGray6[] = {0.6, 0.6, 0.6, 1.0};
+
+static antinspectstruct *antinspect = (antinspectstruct *) NULL;
+
+#define NUM_SCENES 2
+
+enum {X, Y, Z, W};
+enum {A, B, C, D};
+
+/* create a matrix that will project the desired shadow */
+static void shadowmatrix(GLfloat shadowMat[4][4],
+ const GLfloat groundplane[4],
+ const GLfloat lightpos[4])
+{
+ GLfloat dot;
+
+ /* find dot product between light position vector and ground plane normal */
+ dot = groundplane[X] * lightpos[X] +
+ groundplane[Y] * lightpos[Y] +
+ groundplane[Z] * lightpos[Z] +
+ groundplane[W] * lightpos[W];
+
+ shadowMat[0][0] = dot - lightpos[X] * groundplane[X];
+ shadowMat[1][0] = 0.f - lightpos[X] * groundplane[Y];
+ shadowMat[2][0] = 0.f - lightpos[X] * groundplane[Z];
+ shadowMat[3][0] = 0.f - lightpos[X] * groundplane[W];
+
+ shadowMat[X][1] = 0.f - lightpos[Y] * groundplane[X];
+ shadowMat[1][1] = dot - lightpos[Y] * groundplane[Y];
+ shadowMat[2][1] = 0.f - lightpos[Y] * groundplane[Z];
+ shadowMat[3][1] = 0.f - lightpos[Y] * groundplane[W];
+
+ shadowMat[X][2] = 0.f - lightpos[Z] * groundplane[X];
+ shadowMat[1][2] = 0.f - lightpos[Z] * groundplane[Y];
+ shadowMat[2][2] = dot - lightpos[Z] * groundplane[Z];
+ shadowMat[3][2] = 0.f - lightpos[Z] * groundplane[W];
+
+ shadowMat[X][3] = 0.f - lightpos[W] * groundplane[X];
+ shadowMat[1][3] = 0.f - lightpos[W] * groundplane[Y];
+ shadowMat[2][3] = 0.f - lightpos[W] * groundplane[Z];
+ shadowMat[3][3] = dot - lightpos[W] * groundplane[W];
+}
+
+static const GLfloat ground[4] = {0.0, 1.0, 0.0, -0.00001};
+
+/* simple filled sphere */
+static Bool mySphere(float radius)
+{
+#if 0
+ GLUquadricObj *quadObj;
+
+ if((quadObj = gluNewQuadric()) == 0)
+ return False;
+ gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
+ gluSphere(quadObj, radius, 16, 16);
+ gluDeleteQuadric(quadObj);
+#else
+ glPushMatrix();
+ glScalef (radius, radius, radius);
+ glRotatef (90, 1, 0, 0);
+ unit_sphere (16, 16, False);
+ glPopMatrix();
+#endif
+ return True;
+}
+
+/* caged sphere */
+static Bool mySphere2(float radius)
+{
+#if 0
+ GLUquadricObj *quadObj;
+
+ if((quadObj = gluNewQuadric()) == 0)
+ return False;
+ gluQuadricDrawStyle(quadObj, (GLenum) GLU_LINE);/*GLU_SILHOUETTE);*/
+ gluSphere(quadObj, radius, 16, 8);
+ gluDeleteQuadric(quadObj);
+#else
+ glPushMatrix();
+ glScalef (radius, radius, radius);
+ glRotatef (90, 1, 0, 0);
+ unit_sphere (16, 8, True);
+ glPopMatrix();
+#endif
+
+ return True;
+}
+
+/* null cone */
+static Bool myCone2(float radius)
+{
+ return True;
+}
+
+/* draw an ant */
+static Bool draw_antinspect_ant(ModeInfo *mi, antinspectstruct * mp,
+ const float *Material, int mono,
+ Bool (*sphere)(float), Bool (*cone)(float))
+{
+ float cos1 = cos(mp->ant_step);
+ float cos2 = cos(mp->ant_step + 2 * Pi / 3);
+ float cos3 = cos(mp->ant_step + 4 * Pi / 3);
+ float sin1 = sin(mp->ant_step);
+ float sin2 = sin(mp->ant_step + 2 * Pi / 3);
+ float sin3 = sin(mp->ant_step + 4 * Pi / 3);
+
+ if (mono)
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray5);
+ else
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Material);
+ glEnable(GL_CULL_FACE);
+ glPushMatrix();
+ glScalef(1, 1.3, 1);
+ if (!((*sphere)(0.18)))
+ return False;
+ glScalef(1, 1 / 1.3, 1);
+ glTranslatef(0.00, 0.30, 0.00);
+ if (!((*sphere)(0.2)))
+ return False;
+
+ glTranslatef(-0.05, 0.17, 0.05);
+ glRotatef(-90, 1, 0, 0);
+ glRotatef(-25, 0, 1, 0);
+ if (!((*cone)(0.05)))
+ return False;
+ glTranslatef(0.00, 0.10, 0.00);
+ if (!((*cone)(0.05)))
+ return False;
+ glRotatef(25, 0, 1, 0);
+ glRotatef(90, 1, 0, 0);
+
+ glScalef(1, 1.3, 1);
+ glTranslatef(0.15, -0.65, 0.05);
+ if (!((*sphere)(0.25)))
+ return False;
+ glScalef(1, 1 / 1.3, 1);
+ glPopMatrix();
+ glDisable(GL_CULL_FACE);
+
+ glDisable(GL_LIGHTING);
+
+ /* ANTENNAS */
+ glBegin(GL_LINES);
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, 0.30, 0.00);
+ glColor3fv(MaterialGray);
+ glVertex3f(0.40, 0.70, 0.40);
+ mi->polygon_count++;
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, 0.30, 0.00);
+ glColor3fv(MaterialGray);
+ glVertex3f(0.40, 0.70, -0.40);
+ mi->polygon_count++;
+ glEnd();
+ glBegin(GL_POINTS);
+ if (mono)
+ glColor3fv(MaterialGray6);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.40, 0.70, 0.40);
+ mi->polygon_count++;
+ glVertex3f(0.40, 0.70, -0.40);
+ mi->polygon_count++;
+ glEnd();
+
+ /* LEFT-FRONT ARM */
+ glBegin(GL_LINE_STRIP);
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, 0.05, 0.18);
+ glVertex3f(0.35 + 0.05 * cos1, 0.15, 0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* LEFT-CENTER ARM */
+ glBegin(GL_LINE_STRIP);
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, 0.00, 0.18);
+ glVertex3f(0.35 + 0.05 * cos2, 0.00, 0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45);
+ mi->polygon_count++;
+ glEnd();
+ mi->polygon_count++;
+
+ /* LEFT-BACK ARM */
+ glBegin(GL_LINE_STRIP);
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, -0.05, 0.18);
+ glVertex3f(0.35 + 0.05 * cos3, -0.15, 0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* RIGHT-FRONT ARM */
+ glBegin(GL_LINE_STRIP);
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, 0.05, -0.18);
+ glVertex3f(0.35 - 0.05 * sin1, 0.15, -0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* RIGHT-CENTER ARM */
+ glBegin(GL_LINE_STRIP);
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, 0.00, -0.18);
+ glVertex3f(0.35 - 0.05 * sin2, 0.00, -0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* RIGHT-BACK ARM */
+ glBegin(GL_LINE_STRIP);
+ if (mono)
+ glColor3fv(MaterialGray5);
+ else
+ glColor3fv(Material);
+ glVertex3f(0.00, -0.05, -0.18);
+ glVertex3f(0.35 - 0.05 * sin3, -0.15, -0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ glEnable(GL_LIGHTING);
+
+ return True;
+}
+
+/* only works with 3 right now */
+#define ANTCOUNT 3
+
+static const float MaterialBen[4] = {0.25, 0.30, 0.46, 1.0};
+
+static const float* antmaterial[ANTCOUNT] =
+ {MaterialRed, MaterialBen, MaterialOrange};
+static double antposition[ANTCOUNT] = {0.0, 120.0, 240.0};
+static const double antvelocity[ANTCOUNT] = {0.3, 0.3, 0.3};
+static const double antsphere[ANTCOUNT] = {1.2, 1.2, 1.2};
+
+/* permutations */
+static const double antorder[6][ANTCOUNT] = {{0, 1, 2},
+ {0, 2, 1},
+ {2, 0, 1},
+ {2, 1, 0},
+ {1, 2, 0},
+ {1, 0, 2}};
+
+/* draw the scene */
+static Bool draw_antinspect_strip(ModeInfo * mi)
+{
+ antinspectstruct *mp = &antinspect[MI_SCREEN(mi)];
+ int i, j;
+ int mono = MI_IS_MONO(mi);
+
+ int ro = (((int)antposition[1])/(360/(2*ANTCOUNT))) % (2*ANTCOUNT);
+
+ glEnable(GL_TEXTURE_2D);
+ position0[1] = 9.6;
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray5);
+ glRotatef(-30.0, 0.0, 1.0, 0.0);
+
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_BLEND);
+
+ /* render ground plane */
+ glBegin(GL_TRIANGLES);
+ glColor4fv(MaterialShadow);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialBlack);
+ glNormal3f(0.0, 1.0, 0.0);
+
+ /* middle tri */
+ glVertex3f(0.0, 0.0, -1.0);
+ glVertex3f(-sqrt(3.0)/2.0, 0.0, 0.5);
+ glVertex3f(sqrt(3.0)/2.0, 0.0, 0.5);
+ mi->polygon_count++;
+ glEnd();
+
+ /* rotate */
+ for(i = 0; i < 3; ++i) {
+ glRotatef(120.0, 0.0, 1.0, 0.0);
+ glBegin(GL_TRIANGLES);
+ glVertex3f(0.0, 0.0, 1.0 + 3.0);
+ glVertex3f(sqrt(3.0)/2.0, 0.0, -0.5 + 3.0);
+ glVertex3f(-sqrt(3.0)/2.0, 0.0, -0.5 + 3.0);
+ mi->polygon_count++;
+ glEnd();
+ }
+
+ /* first render shadows -- no depth required */
+ if(shadows) {
+ GLfloat m[4][4];
+ shadowmatrix(m, ground, position0);
+
+ glColor4fv(MaterialShadow);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialShadow);
+
+ glDisable(GL_BLEND);
+ glDisable(GL_LIGHTING);
+
+ /* display ant shadow */
+ glPushMatrix();
+ glTranslatef(0.0, 0.001, 0.0);
+ glMultMatrixf(m[0]);
+
+ for(i = 0; i < ANTCOUNT; ++i) {
+
+ /* draw ant */
+ glPushMatrix();
+
+ /* center */
+ glRotatef(antposition[i], 0.0, 1.0, 0.0);
+ glTranslatef(2.4, 0.0, 0.0);
+ glTranslatef(0.0, antsphere[i], 0.0);
+ glRotatef(90.0, 0.0, 1.0, 0.0);
+
+ /* orient ant */
+ glRotatef(10.0, 0.0, 1.0, 0.0);
+ glRotatef(40.0, 0.0, 0.0, 1.0);
+ glTranslatef(0.0, -0.8, 0.0);
+ glRotatef(180.0, 0.0, 1.0, 0.0);
+ glRotatef(90.0, 0.0, 0.0, 1.0);
+
+ /* set colour */
+ glColor4fv(MaterialShadow);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialShadow);
+
+ if(antposition[i] > 360.0)
+ antposition[i] = 0.0;
+ draw_antinspect_ant(mi, mp, MaterialShadow, mono, mySphere2, myCone2);
+
+ glDisable(GL_BLEND);
+ glDisable(GL_LIGHTING);
+
+ /* draw sphere */
+ glRotatef(-20.0, 1.0, 0.0, 0.0);
+ glRotatef(-mp->ant_step*2, 0.0, 0.0, 1.0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialShadow);
+ mySphere2(1.2);
+
+ glPopMatrix();
+ }
+
+ glPopMatrix();
+ }
+
+ glEnable(GL_LIGHTING);
+
+ /* truants */
+ for(j = 0; j < ANTCOUNT; ++j) {
+ /* determine rendering order */
+ i = antorder[ro][j];
+
+ glPushMatrix();
+
+ /* center */
+ glRotatef(antposition[i], 0.0, 1.0, 0.0);
+ glTranslatef(2.4, 0.0, 0.0);
+ glTranslatef(0.0, antsphere[i], 0.0);
+ glRotatef(90.0, 0.0, 1.0, 0.0);
+
+ /* draw ant */
+ glPushMatrix();
+ glRotatef(10.0, 0.0, 1.0, 0.0);
+ glRotatef(40.0, 0.0, 0.0, 1.0);
+ glTranslatef(0.0, -0.8, 0.0);
+ glRotatef(180.0, 0.0, 1.0, 0.0);
+ glRotatef(90.0, 0.0, 0.0, 1.0);
+ if(antposition[i] > 360.0)
+ antposition[i] = 0.0;
+ glEnable(GL_BLEND);
+ draw_antinspect_ant(mi, mp, antmaterial[i], mono, mySphere2, myCone2);
+ glDisable(GL_BLEND);
+ glPopMatrix();
+
+ /* draw sphere */
+ glRotatef(-20.0, 1.0, 0.0, 0.0);
+ glRotatef(-mp->ant_step*2, 0.0, 0.0, 1.0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mono ? MaterialGray5 : antmaterial[i]);
+ mySphere2(1.2);
+ glEnable(GL_BLEND);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialBlack);
+ mySphere(1.16);
+ glDisable(GL_BLEND);
+
+ glPopMatrix();
+
+ /* finally, evolve */
+ antposition[i] += antvelocity[i];
+ }
+
+ /* but the step size is the same! */
+ mp->ant_step += 0.2;
+
+ mp->ant_position += 1;
+ return True;
+}
+
+ENTRYPOINT void reshape_antinspect(ModeInfo * mi, int width, int height)
+{
+ double h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+ antinspectstruct *mp = &antinspect[MI_SCREEN(mi)];
+ mp->linewidth = (width / 512) + 1;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0, y, mp->WindW = (GLint) width, mp->WindH = (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ gluPerspective(45, 1/h, 7.0, 20.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLineWidth(mp->linewidth);
+ glPointSize(mp->linewidth);
+}
+
+static void pinit(void)
+{
+ glClearDepth(1.0);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT1, GL_POSITION, position1);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ glEnable(GL_NORMALIZE);
+ glFrontFace(GL_CCW);
+
+ /* antinspect */
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+ glDisable(GL_TEXTURE_2D);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+}
+
+ENTRYPOINT Bool antinspect_handle_event (ModeInfo *mi, XEvent *event)
+{
+ antinspectstruct *mp = &antinspect[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, mp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &mp->button_down_p))
+ return True;
+
+ return False;
+}
+
+ENTRYPOINT void init_antinspect(ModeInfo * mi)
+{
+ antinspectstruct *mp;
+
+ MI_INIT(mi, antinspect);
+ mp = &antinspect[MI_SCREEN(mi)];
+ mp->step = NRAND(90);
+ mp->ant_position = NRAND(90);
+ mp->trackball = gltrackball_init (False);
+
+ if ((mp->glx_context = init_GL(mi)) != NULL) {
+ reshape_antinspect(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ pinit();
+ }
+ else
+ MI_CLEARWINDOW(mi);
+
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+}
+
+ENTRYPOINT void draw_antinspect(ModeInfo * mi)
+{
+ antinspectstruct *mp;
+
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if(!antinspect)
+ return;
+ mp = &antinspect[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+
+ if(!mp->glx_context)
+ return;
+
+ glXMakeCurrent(display, window, *(mp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+
+ mi->polygon_count = 0;
+
+ /* position camera --- this works well, we can peer inside
+ the antbubble */
+ glTranslatef(0.0, 0.0, -10.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ glRotatef(o, 0, 0, 1);
+ }
+# endif
+
+ gltrackball_rotate(mp->trackball);
+ glRotatef((15.0/2.0 + 15.0*sin(mp->ant_step/100.0)), 1.0, 0.0, 0.0);
+ glRotatef(30.0, 1.0, 0.0, 0.0);
+ glRotatef(180.0, 0.0, 1.0, 0.0);
+
+ if (!draw_antinspect_strip(mi)) {
+ MI_ABORT(mi);
+ return;
+ }
+
+ glPopMatrix();
+
+ if (MI_IS_FPS(mi)) do_fps (mi);
+ glFlush();
+
+ glXSwapBuffers(display, window);
+
+ mp->step += 0.025;
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void change_antinspect(ModeInfo * mi)
+{
+ antinspectstruct *mp = &antinspect[MI_SCREEN(mi)];
+
+ if (!mp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(mp->glx_context));
+ pinit();
+}
+#endif /* !STANDALONE */
+
+
+XSCREENSAVER_MODULE ("AntInspect", antinspect)
diff --git a/hacks/glx/antinspect.man b/hacks/glx/antinspect.man
new file mode 100644
index 0000000..804d7a4
--- /dev/null
+++ b/hacks/glx/antinspect.man
@@ -0,0 +1,56 @@
+.TH XScreenSaver 1 "March 2004"
+.SH NAME
+antinspect \- ant model inspection screenhack
+.SH SYNOPSIS
+.B antinspect
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP] [\-fps]
+.SH DESCRIPTION
+The \fIantinspect\fP code displays three ant-powered balls churning in a
+circle.
+.SH OPTIONS
+.I antinspect
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-shadows
+Draw shadows on ground
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 2004 by Blair Tennessy. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Blair Tennessy <tennessy@cs.ubc.ca>, 15-March-2004.
+
diff --git a/hacks/glx/antmaze.c b/hacks/glx/antmaze.c
new file mode 100644
index 0000000..79b7e0b
--- /dev/null
+++ b/hacks/glx/antmaze.c
@@ -0,0 +1,1613 @@
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Copyright 2004 Blair Tennessy
+ * tennessy@cs.ubc.ca
+ */
+
+#if 0
+static const char sccsid[] = "@(#)antmaze.c 5.01 2001/03/01 xlockmore";
+#endif
+
+#ifdef STANDALONE
+# define MODE_antmaze
+# define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*fpsSolid: True \n"
+
+# define free_antmaze 0
+# define release_antmaze 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+#else
+# include <X11/Xlib.h>
+# include <GL/gl.h>
+# include <GL/glu.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#ifdef MODE_antmaze
+
+
+#include "sphere.h"
+#include "tube.h"
+#include "rotator.h"
+#include "gltrackball.h"
+
+#define DEF_SOLIDANTMAZE "False"
+#define DEF_NOANTS "False"
+
+static int solidantmaze;
+static int noants;
+
+static XrmOptionDescRec opts[] =
+{
+ {"-solidantmaze", ".antmaze.solidantmaze", XrmoptionNoArg, "on"},
+ {"+solidantmaze", ".antmaze.solidantmaze", XrmoptionNoArg, "off"},
+ {"-noants", ".antmaze.noants", XrmoptionNoArg, "on"},
+ {"+noants", ".antmaze.noants", XrmoptionNoArg, "off"}
+};
+static argtype vars[] =
+{
+ {&solidantmaze, "solidantmaze", "Solidantmaze", DEF_SOLIDANTMAZE, t_Bool},
+ {&noants, "noants", "Noants", DEF_NOANTS, t_Bool}
+};
+
+static OptionStruct desc[] =
+{
+ {"-/+solidantmaze", "select between a SOLID or a NET Antmaze Strip"},
+ {"-/+noants", "turn on/off walking ants"}
+};
+
+ENTRYPOINT ModeSpecOpt antmaze_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct antmaze_description =
+{"antmaze", "init_antmaze", "draw_antmaze", NULL,
+ "draw_antmaze", "change_antmaze", NULL, &antmaze_opts,
+ 1000, 1, 1, 1, 4, 1.0, "",
+ "draws some ants", 0, NULL};
+
+#endif
+
+#define Scale4Window 0.3
+#define Scale4Iconic 0.4
+
+#define sqr(A) ((A)*(A))
+
+#ifndef Pi
+#define Pi M_PI
+#endif
+
+#define ObjAntmazeStrip 0
+#define ObjAntBody 1
+#define MaxObj 2
+
+/*************************************************************************/
+
+#include "ants.h"
+
+#define ANTCOUNT 5
+#define PI 3.14157
+
+#define EPSILON 0.01
+#define BOARDSIZE 10
+#define BOARDCOUNT 2
+#define PARTS 20
+
+#define checkImageWidth 64
+#define checkImageHeight 64
+
+typedef struct {
+ GLint WindH, WindW;
+ GLfloat step;
+ GLfloat ant_position;
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ int focus;
+ int currentboard;
+
+ double antdirection[ANTCOUNT];
+ double antposition[ANTCOUNT][3];
+ int anton[ANTCOUNT];
+
+ double antvelocity[ANTCOUNT];
+ double antsize[ANTCOUNT];
+ int bposition[ANTCOUNT][2];
+ int board[BOARDCOUNT][10][10];
+
+ int part[ANTCOUNT];
+ double antpath[ANTCOUNT][PARTS][2];
+ int antpathlength[ANTCOUNT];
+
+ GLubyte checkers[checkImageWidth][checkImageHeight][3];
+
+ GLuint checktexture, brushedtexture;
+ double elevator;
+
+ double ant_step;
+ double first_ant_step;
+ int started;
+ int introduced;
+ int entroducing;
+
+ double fadeout;
+ double fadeoutspeed;
+
+ int mag;
+
+} antmazestruct;
+
+static antmazestruct *antmaze = (antmazestruct *) NULL;
+
+
+static const GLfloat MaterialRed[] = {0.6, 0.0, 0.0, 1.0};
+/*static const GLfloat MaterialMagenta[] = {0.6, 0.2, 0.5, 1.0};*/
+static const GLfloat MaterialGray8[] = {0.8, 0.8, 0.8, 1.0};
+static const GLfloat MaterialGray35[] = {0.30, 0.30, 0.30, 1.0};
+static const GLfloat MaterialGray4[] = {0.40, 0.40, 0.40, 1.0};
+static const GLfloat MaterialOrange[] = {1.0, 0.69, 0.00, 1.0};
+static const GLfloat MaterialGreen[] = {0.1, 0.4, 0.2, 1.0};
+
+/* lighting variables */
+static const GLfloat front_shininess[] = {60.0};
+static const GLfloat front_specular[] = {0.8, 0.8, 0.8, 1.0};
+static const GLfloat ambient[] = {0.1, 0.1, 0.1, 1.0};
+/*static const GLfloat ambient2[] = {0.0, 0.0, 0.0, 0.0};*/
+static const GLfloat diffuse[] = {0.8, 0.8, 0.8, 1.0};
+static const GLfloat position0[] = {1.0, 5.0, 1.0, 1.0};
+static const GLfloat position1[] = {-1.0, -5.0, 1.0, 1.0};
+/*static const GLfloat lmodel_ambient[] = {0.8, 0.8, 0.8, 1.0};*/
+/*static const GLfloat lmodel_twoside[] = {GL_TRUE};*/
+/*static const GLfloat spotlight_ambient[] = { 0.0, 0.0, 0.0, 1.0 };*/
+/*static const GLfloat spotlight_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };*/
+
+#define NUM_SCENES 2
+
+/* filled sphere */
+static Bool mySphere(float radius)
+{
+#if 0
+ GLUquadricObj *quadObj;
+
+ if((quadObj = gluNewQuadric()) == 0)
+ return False;
+ gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
+ gluSphere(quadObj, radius, 16, 16);
+ gluDeleteQuadric(quadObj);
+#else
+ glPushMatrix();
+ glScalef (radius, radius, radius);
+ glRotatef (90, 1, 0, 0);
+ unit_sphere (16, 16, False);
+ glPopMatrix();
+#endif
+ return True;
+}
+
+#if 0
+/* silhouette sphere */
+static Bool mySphere2(float radius)
+{
+ GLUquadricObj *quadObj;
+
+ if((quadObj = gluNewQuadric()) == 0)
+ return False;
+ gluQuadricDrawStyle(quadObj, (GLenum) GLU_SILHOUETTE);
+ gluSphere(quadObj, radius, 16, 8);
+ gluDeleteQuadric(quadObj);
+
+ return True;
+}
+#endif
+
+/* textured sphere */
+static Bool mySphereTex(float radius)
+{
+#if 0
+ GLUquadricObj *quadObj;
+
+ if((quadObj = gluNewQuadric()) == 0)
+ return False;
+ gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
+ gluQuadricTexture(quadObj, GL_TRUE);
+ gluQuadricNormals(quadObj, GLU_SMOOTH);
+ gluSphere(quadObj, radius, 32, 16);
+ gluDeleteQuadric(quadObj);
+#else
+ glPushMatrix();
+ glScalef (radius, radius, radius);
+ glRotatef (90, 1, 0, 0);
+ unit_sphere (32, 16, False);
+ glPopMatrix();
+#endif
+
+ return True;
+}
+
+/* filled cone */
+static Bool myCone(float radius)
+{
+#if 0
+ GLUquadricObj *quadObj;
+
+ if ((quadObj = gluNewQuadric()) == 0)
+ return False;
+ gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
+ gluCylinder(quadObj, radius, 0, radius * 2, 8, 1);
+ gluDeleteQuadric(quadObj);
+#else
+ cone (0, 0, 0,
+ 0, 0, radius * 2,
+ radius, 0,
+ 8, True, True, False);
+#endif
+ return True;
+}
+
+/* no cone */
+static Bool myCone2(float radius) { return True; }
+
+#define MATERIALS 4
+static const float *antmaterial[ANTCOUNT] =
+ {MaterialRed, MaterialGray35, MaterialGray4, MaterialOrange, MaterialGreen};
+
+static const float *materials[MATERIALS] =
+ {MaterialRed, MaterialGray35, MaterialGray4, MaterialOrange};
+
+
+static void makeCheckImage(antmazestruct *mp)
+{
+ int i, j;
+
+ for (i = 0; i < checkImageWidth; i++) {
+ for (j = 0; j < checkImageHeight; j++) {
+ if(((((i&0x8)==0)^((j&0x8)))==0)) {
+ int c = 102 + random()%32;
+ mp->checkers[i][j][0] = c;
+ mp->checkers[i][j][1] = c;
+ mp->checkers[i][j][2] = c;
+ }
+ else {
+ int c = 153 + random()%32;
+ mp->checkers[i][j][0] = c;/*153;*/
+ mp->checkers[i][j][1] = c;/*c;*//*0;*/
+ mp->checkers[i][j][2] = c;/*c;*//*0;*/
+ }
+ }
+ }
+
+ glGenTextures(1, &mp->checktexture);
+ glBindTexture(GL_TEXTURE_2D, mp->checktexture);
+
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth,
+ checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE,
+ &mp->checkers[0][0]);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+}
+
+static void makeBrushedImage(antmazestruct *mp)
+{
+ int i, j, c;
+
+ for(i = 0; i < checkImageWidth; ++i)
+ for(j = 0; j < checkImageHeight; ++j) {
+
+ c = 102+102*fabs(sin(2.0*i / Pi)*sin(2.0*j/Pi)) + random()%51;
+
+/* c = (i+j)%8==0 || (i+j+5)%8==0 ? 153 : 102; */
+
+ mp->checkers[i][j][0] = c;
+ mp->checkers[i][j][1] = c;
+ mp->checkers[i][j][2] = c;
+ }
+
+/* for (i = 0; i < checkImageWidth; i++) { */
+/* for (j = 0; j < checkImageHeight; j++) { */
+/* int c = 102 + pow((random()%1000)/1000.0, 4)*103; */
+/* checkers[i][j][0] = c; */
+/* checkers[i][j][1] = c; */
+/* checkers[i][j][2] = c; */
+/* } */
+/* } */
+
+/* /\* smooth *\/ */
+/* for (i = 0; i < checkImageWidth; i++) { */
+/* for (j = 0; j < checkImageHeight; j++) { */
+/* int a = checkers[(i+checkImageWidth+1)%checkImageWidth][j][0] + */
+/* 4*checkers[i][j][0] + checkers[(i+1)%checkImageWidth][j][0]; */
+/* a /= 6; */
+/* checkers[i][j][0] = a; */
+/* checkers[i][j][1] = a; */
+/* checkers[i][j][2] = a; */
+/* } */
+/* } */
+
+ glGenTextures(1, &mp->brushedtexture);
+ glBindTexture(GL_TEXTURE_2D, mp->brushedtexture);
+
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth,
+ checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE,
+ &mp->checkers[0][0]);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+}
+
+#if 0
+static void draw_wall(ModeInfo *mi, double x1, double z1, double x2, double z2)
+{
+ float x = fabs(x2 - x1)/2.0;
+
+ glBegin(GL_QUADS);
+
+ /* draw top */
+ glNormal3f(0.0, 1.0, 0.0);
+ glTexCoord2f(0.0, 0.0);
+ glVertex3f(x1, 1.0, z1+0.25);
+ glTexCoord2f(x, 0.0);
+ glVertex3f(x2, 1.0, z2+0.25);
+ glTexCoord2f(x, 0.25);
+ glVertex3f(x2, 1.0, z2-0.25);
+ glTexCoord2f(0.0, 0.25);
+ glVertex3f(x1, 1.0, z1-0.25);
+ mi->polygon_count++;
+
+ /* draw sides */
+ glNormal3f(0.0, 0.0, 1.0);
+ glTexCoord2f(0.0, 0.0);
+ glVertex3f(x1, 0.0, z1+0.25);
+ glTexCoord2f(x, 0.0);
+ glVertex3f(x2, 0.0, z2+0.25);
+ glTexCoord2f(x, 0.5);
+ glVertex3f(x2, 1.0, z2+0.25);
+ glTexCoord2f(0.0, 0.5);
+ glVertex3f(x1, 1.0, z1+0.25);
+ mi->polygon_count++;
+
+ glNormal3f(0.0, 0.0, -1.0);
+ glTexCoord2f(0.0, 0.0);
+ glVertex3f(x1, 0.0, z1-0.25);
+ glTexCoord2f(x, 0.0);
+ glVertex3f(x2, 0.0, z2-0.25);
+ glTexCoord2f(x, 0.5);
+ glVertex3f(x2, 1.0, z2-0.25);
+ glTexCoord2f(0.0, 0.5);
+ glVertex3f(x1, 1.0, z1-0.25);
+ mi->polygon_count++;
+
+ /* draw ends */
+ glNormal3f(1.0, 0.0, 0.0);
+ glTexCoord2f(0.0, 0.0);
+ glVertex3f(x2, 0.0, z2+0.25);
+ glTexCoord2f(0.25, 0.0);
+ glVertex3f(x2, 0.0, z2-0.25);
+ glTexCoord2f(0.25, 0.5);
+ glVertex3f(x2, 1.0, z2-0.25);
+ glTexCoord2f(0.0, 0.5);
+ glVertex3f(x2, 1.0, z2+0.25);
+ mi->polygon_count++;
+
+ glNormal3f(-1.0, 0.0, 0.0);
+ glTexCoord2f(0.0, 0.0);
+ glVertex3f(x1, 0.0, z1-0.25);
+ glTexCoord2f(0.25, 0.0);
+ glVertex3f(x1, 0.0, z1+0.25);
+ glTexCoord2f(0.25, 0.5);
+ glVertex3f(x1, 1.0, z1+0.25);
+ glTexCoord2f(0.0, 0.5);
+ glVertex3f(x1, 1.0, z1-0.25);
+ mi->polygon_count++;
+
+ glEnd();
+}
+#endif
+
+static void draw_board(ModeInfo *mi, antmazestruct *mp)
+{
+
+ int i, j;
+ double h = 0.5;
+ double stf = 0.0625;
+
+ glBindTexture(GL_TEXTURE_2D, mp->checktexture);
+
+ glBegin(GL_QUADS);
+
+ for(i = 0; i < BOARDSIZE; ++i)
+ for(j = 0; j < BOARDSIZE; ++j) {
+ if(mp->board[mp->currentboard][j][i]) {
+
+/* /\* draw top *\/ */
+/* glNormal3f(0.0, 1.0, 0.0); */
+/* glTexCoord2f(0.0 + stf, 0.0 + stf); */
+/* glVertex3f(i-0.5, h, j+0.5); */
+/* glTexCoord2f(1.0 + stf, 0.0 + stf); */
+/* glVertex3f(i+0.5, h, j+0.5); */
+/* glTexCoord2f(1.0 + stf, 1.0 + stf); */
+/* glVertex3f(i+0.5, h, j-0.5); */
+/* glTexCoord2f(0.0 + stf, 1.0 + stf); */
+/* glVertex3f(i-0.5, h, j-0.5); */
+
+ /* draw top */
+ glNormal3f(0.0, 1.0, 0.0);
+ glTexCoord2f(0.0 + stf, 0.0 + stf);
+ glVertex3f(i-0.5, h, j+0.5);
+ glTexCoord2f(1.0 + stf, 0.0 + stf);
+ glVertex3f(i+0.5, h, j+0.5);
+ glTexCoord2f(1.0 + stf, 1.0 + stf);
+ glVertex3f(i+0.5, h, j-0.5);
+ glTexCoord2f(0.0 + stf, 1.0 + stf);
+ glVertex3f(i-0.5, h, j-0.5);
+ mi->polygon_count++;
+
+ /* draw south face */
+ if(j == 9 || !mp->board[mp->currentboard][j+1][i]) {
+ glNormal3f(0.0, 0.0, 1.0);
+ glTexCoord2f(0.0 + stf, 0.0 + stf);
+ glVertex3f(i-0.5, 0.0, j+0.5);
+ glTexCoord2f(1.0 + stf, 0.0 + stf);
+ glVertex3f(i+0.5, 0.0, j+0.5);
+ glTexCoord2f(1.0 + stf, h + stf);
+ glVertex3f(i+0.5, h, j+0.5);
+ glTexCoord2f(0.0 + stf, h + stf);
+ glVertex3f(i-0.5, h, j+0.5);
+ mi->polygon_count++;
+ }
+
+ /* draw north face */
+ if(j == 0 || !mp->board[mp->currentboard][j-1][i]) {
+ glNormal3f(0.0, 0.0, -1.0);
+ glTexCoord2f(0.0 + stf, 0.0 + stf);
+ glVertex3f(i+0.5, 0.0, j-0.5);
+ glTexCoord2f(1.0 + stf, 0.0 + stf);
+ glVertex3f(i-0.5, 0.0, j-0.5);
+ glTexCoord2f(1.0 + stf, h + stf);
+ glVertex3f(i-0.5, h, j-0.5);
+ glTexCoord2f(0.0 + stf, h + stf);
+ glVertex3f(i+0.5, h, j-0.5);
+ mi->polygon_count++;
+ }
+
+ /* draw east face */
+ if(i == 9 || !mp->board[mp->currentboard][j][i+1]) {
+ glNormal3f(1.0, 0.0, 0.0);
+ glTexCoord2f(0.0 + stf, 0.0 + stf);
+ glVertex3f(i+0.5, 0.0, j+0.5);
+ glTexCoord2f(1.0 + stf, 0.0 + stf);
+ glVertex3f(i+0.5, 0.0, j-0.5);
+ glTexCoord2f(1.0 + stf, h + stf);
+ glVertex3f(i+0.5, h, j-0.5);
+ glTexCoord2f(0.0 + stf, h + stf);
+ glVertex3f(i+0.5, h, j+0.5);
+ mi->polygon_count++;
+ }
+
+ /* draw west face */
+ if(i == 0 || !mp->board[mp->currentboard][j][i-1]) {
+ glNormal3f(-1.0, 0.0, 0.0);
+ glTexCoord2f(0.0 + stf, 0.0 + stf);
+ glVertex3f(i-0.5, 0.0, j-0.5);
+ glTexCoord2f(1.0 + stf, 0.0 + stf);
+ glVertex3f(i-0.5, 0.0, j+0.5);
+ glTexCoord2f(1.0 + stf, h + stf);
+ glVertex3f(i-0.5, h, j+0.5);
+ glTexCoord2f(0.0 + stf, h + stf);
+ glVertex3f(i-0.5, h, j-0.5);
+ mi->polygon_count++;
+ }
+ }
+ else {
+ double tx = 2.0;
+ glNormal3f(0.0, 1.0, 0.0);
+ glTexCoord2f(0.0, 0.0);
+ glVertex3f(i-0.5, 0.0, j+0.5);
+ glTexCoord2f(tx, 0.0);
+ glVertex3f(i+0.5, 0.0, j+0.5);
+ glTexCoord2f(tx, tx);
+ glVertex3f(i+0.5, 0.0, j-0.5);
+ glTexCoord2f(0.0, tx);
+ glVertex3f(i-0.5, 0.0, j-0.5);
+ mi->polygon_count++;
+ }
+ }
+ glEnd();
+
+/* /\* draw elevator *\/ */
+/* glBindTexture(GL_TEXTURE_2D, brushedtexture); */
+
+/* glBegin(GL_QUADS); */
+
+/* glNormal3f(0.0, 1.0, 0.0); */
+
+/* if(pastfirst) { */
+/* /\* source *\/ */
+/* glTexCoord2f(0.0, 0.0); */
+/* glVertex3f(0.5, 0.0, BOARDSIZE - 0.5 + 0.2); */
+/* glTexCoord2f(1.0, 0.0); */
+/* glVertex3f(1.5, 0.0, BOARDSIZE - 0.5 + 0.2); */
+/* glTexCoord2f(1.0, 1.5); */
+/* glVertex3f(1.5, 0.0, BOARDSIZE + 1.0 + 0.2); */
+/* glTexCoord2f(0.0, 1.5); */
+/* glVertex3f(0.5, 0.0, BOARDSIZE + 1.0 + 0.2); */
+/* mi->polygon_count++; */
+/* } */
+
+/* /\* destination *\/ */
+/* glTexCoord2f(0.0, 0.0); */
+/* glVertex3f(BOARDSIZE - 2.5, elevator, -2.0 - 0.2); */
+/* glTexCoord2f(1.0, 0.0); */
+/* glVertex3f(BOARDSIZE - 1.5, elevator, -2.0 - 0.2); */
+/* glTexCoord2f(1.0, 1.5); */
+/* glVertex3f(BOARDSIZE - 1.5, elevator, -0.5 - 0.2); */
+/* glTexCoord2f(0.0, 1.5); */
+/* glVertex3f(BOARDSIZE - 2.5, elevator, -0.5 - 0.2); */
+/* mi->polygon_count++; */
+
+/* glEnd(); */
+
+/* for(i = 0; i < BOARDSIZE; ++i) */
+/* for(j = 0; j < BOARDSIZE; ++j) { */
+/* if(board[j][i]) { */
+
+/* /\* draw brushed boxtop *\/ */
+/* glNormal3f(0.0, 1.0, 0.0); */
+/* glTexCoord2f(0.0 + stf, 0.0 + stf); */
+/* glVertex3f(i-0.5 + stf, h+0.001, j+0.5 - stf); */
+/* glTexCoord2f(1.0 + stf, 0.0 + stf); */
+/* glVertex3f(i+0.5 - stf, h+0.001, j+0.5 - stf); */
+/* glTexCoord2f(1.0 + stf, 1.0 + stf); */
+/* glVertex3f(i+0.5 - stf, h+0.001, j-0.5 + stf); */
+/* glTexCoord2f(0.0 + stf, 1.0 + stf); */
+/* glVertex3f(i-0.5 + stf, h+0.001, j-0.5 + stf); */
+/* mi->polygon_count++; */
+/* } */
+/* } */
+
+/* glEnd(); */
+}
+
+static void build_board(antmazestruct *mp, int b)
+{
+ int i, j;
+
+ for(i = 0; i < BOARDSIZE; ++i)
+ for(j = 0; j < BOARDSIZE; ++j)
+ mp->board[b][i][j] = 1;
+
+/* for(i = 0; i < BOARDSIZE; ++i) { */
+/* board[0][i] = 1; */
+/* board[i][0] = 1; */
+/* board[BOARDSIZE-1][BOARDSIZE-i] = 1; */
+/* board[BOARDSIZE-i][BOARDSIZE-1] = 1; */
+/* } */
+
+/* board[0][BOARDSIZE-2] = 0; */
+/* board[BOARDSIZE-1][1] = 0; */
+
+
+ mp->board[b][BOARDSIZE-1][1] = 0;
+ mp->board[b][0][BOARDSIZE-2] = 0;
+
+ /* build the ant paths */
+ if(mp->currentboard == b) {
+ for(i = 0; i < ANTCOUNT; ++i) {
+ int sx = BOARDSIZE-2;
+ int sy = 1;
+
+ for(j = 0; ; ++j) {
+ mp->board[b][sx][sy] = 0;
+ mp->antpath[i][j][0] = sy - 5.0;
+ mp->antpath[i][j][1] = sx - 5.0;
+
+ if(random()%2) {
+ if(sx > 1)
+ sx -= 1;
+ else if(sy < BOARDSIZE-2)
+ sy += 1;
+ else
+ break;
+ }
+ else {
+ if(sy < BOARDSIZE-2)
+ sy += 1;
+ else if(sx > 1)
+ sx -= 1;
+ else
+ break;
+ }
+ }
+
+ ++j;
+ mp->antpath[i][j][0] = BOARDSIZE-7.0;
+ mp->antpath[i][j][1] = -7.0;
+ mp->antpathlength[i] = j;
+ }
+ }
+
+/* for(i = 0; i < 20; ++i) { */
+/* int x = 1 + random()%(BOARDSIZE-2); */
+/* int y = 1 + random()%(BOARDSIZE-2); */
+/* board[x][y] = 1; */
+/* } */
+}
+
+/* compute nearness */
+static int near(double a[2], double b[2])
+{
+ return fabs(a[0] - b[0]) < 0.5 && fabs(a[1] - b[1]) < 0.5;
+}
+
+static double sign(double d)
+{
+ return d < 0.0 ? -1.0 : 1.0;
+}
+
+static double min(double a, double b)
+{
+ return a < b ? a : b;
+}
+
+/* draw method for ant */
+static Bool draw_ant(ModeInfo *mi, antmazestruct *mp,
+ const float *Material, int mono, int shadow,
+ float ant_step, Bool (*sphere)(float), Bool (*cone)(float))
+{
+
+ float cos1 = cos(mp->ant_step);
+ float cos2 = cos(mp->ant_step + 2 * Pi / 3);
+ float cos3 = cos(mp->ant_step + 4 * Pi / 3);
+ float sin1 = sin(mp->ant_step);
+ float sin2 = sin(mp->ant_step + 2 * Pi / 3);
+ float sin3 = sin(mp->ant_step + 4 * Pi / 3);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mono ? MaterialGray5 : Material);
+
+/* glEnable(GL_CULL_FACE); */
+
+ glPushMatrix();
+ glScalef(1, 1.3, 1);
+ if(!((*sphere)(0.18)))
+ return False;
+ glScalef(1, 1 / 1.3, 1);
+ glTranslatef(0.00, 0.30, 0.00);
+ if(!((*sphere)(0.2)))
+ return False;
+
+ glTranslatef(-0.05, 0.17, 0.05);
+ glRotatef(-90, 1, 0, 0);
+ glRotatef(-25, 0, 1, 0);
+ if(!((*cone)(0.05)))
+ return False;
+ glTranslatef(0.00, 0.10, 0.00);
+ if(!((*cone)(0.05)))
+ return False;
+ glRotatef(25, 0, 1, 0);
+ glRotatef(90, 1, 0, 0);
+
+ glScalef(1, 1.3, 1);
+ glTranslatef(0.15, -0.65, 0.05);
+ if(!((*sphere)(0.25)))
+ return False;
+ glScalef(1, 1 / 1.3, 1);
+ glPopMatrix();
+
+/* glDisable(GL_CULL_FACE); */
+
+ glDisable(GL_LIGHTING);
+
+ /* ANTENNAS */
+ glBegin(GL_LINES);
+ glColor3fv(mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.30, 0.00);
+ glColor3fv(MaterialGray);
+ glVertex3f(0.40, 0.70, 0.40);
+ mi->polygon_count++;
+ glColor3fv(mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.30, 0.00);
+ glColor3fv(MaterialGray);
+ glVertex3f(0.40, 0.70, -0.40);
+ mi->polygon_count++;
+ glEnd();
+
+ if(!shadow) {
+ glBegin(GL_POINTS);
+ glColor3fv(mono ? MaterialGray6 : MaterialRed);
+ glVertex3f(0.40, 0.70, 0.40);
+ mi->polygon_count++;
+ glVertex3f(0.40, 0.70, -0.40);
+ mi->polygon_count++;
+ glEnd();
+ }
+
+ /* LEFT-FRONT ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.05, 0.18);
+ glVertex3f(0.35 + 0.05 * cos1, 0.15, 0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* LEFT-CENTER ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.00, 0.18);
+ glVertex3f(0.35 + 0.05 * cos2, 0.00, 0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* LEFT-BACK ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, -0.05, 0.18);
+ glVertex3f(0.35 + 0.05 * cos3, -0.15, 0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* RIGHT-FRONT ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.05, -0.18);
+ glVertex3f(0.35 - 0.05 * sin1, 0.15, -0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* RIGHT-CENTER ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.00, -0.18);
+ glVertex3f(0.35 - 0.05 * sin2, 0.00, -0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* RIGHT-BACK ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, -0.05, -0.18);
+ glVertex3f(0.35 - 0.05 * sin3, -0.15, -0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ if(!shadow) {
+ glBegin(GL_POINTS);
+ glColor3fv(mono ? MaterialGray8 : MaterialGray35);
+ glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45);
+ glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45);
+ glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45);
+ glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45);
+ glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45);
+ glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45);
+ mi->polygon_count += 6;
+ glEnd();
+ }
+
+ glEnable(GL_LIGHTING);
+
+ return True;
+}
+
+static Bool draw_antmaze_strip(ModeInfo * mi)
+{
+ antmazestruct *mp = &antmaze[MI_SCREEN(mi)];
+ int i;
+ int mono = MI_IS_MONO(mi);
+
+/* glMatrixMode(GL_MODELVIEW); */
+/* glLoadIdentity(); */
+/* glPushMatrix(); */
+
+ glEnable(GL_LIGHTING);
+/* glDisable(GL_BLEND); */
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+
+ /* set light */
+/* double l1 = 1.0 - (elevator < 1.0 ? elevator : 2.0 - elevator); */
+/* GLfloat df[4] = {0.8*l1, 0.8*l1, 0.8*l1, 1.0}; */
+/* glLightfv(GL_LIGHT0, GL_DIFFUSE, df); */
+/* glLightfv(GL_LIGHT1, GL_DIFFUSE, df); */
+
+ /* draw board */
+ if(mp->elevator < 1.0) {
+ glEnable(GL_TEXTURE_2D);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray6);
+ glTranslatef(-(BOARDSIZE-1)/2.0, 0.0, -(BOARDSIZE-1)/2.0);
+ draw_board(mi, mp);
+ glTranslatef(BOARDSIZE/2.0, 0.0, BOARDSIZE/2.0);
+ glDisable(GL_TEXTURE_2D);
+ }
+
+ mp->introduced--;
+
+ glTranslatef(0.0, -0.1, 0.0);
+
+ for(i = 0; i < ANTCOUNT; ++i) {
+
+/* glLightfv(GL_LIGHT0, GL_DIFFUSE, df); */
+/* glLightfv(GL_LIGHT1, GL_DIFFUSE, df); */
+
+ if(!mp->anton[i]) { continue; }
+
+ /* determine location, move to goal */
+ glPushMatrix();
+ glTranslatef(0.0, 0.01, 0.0);
+ glTranslatef(mp->antposition[i][0], mp->antposition[i][2], mp->antposition[i][1]);
+/* glScalef(1.0, 0.01, 1.0); */
+ glScalef(0.6, 0.01, 0.6);
+ glRotatef(180.0 + mp->antdirection[i]*180.0/PI, 0.0, 1.0, 0.0);
+ glRotatef(90.0, 0.0, 0.0, 1.0);
+ glDisable(GL_LIGHTING);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glColor4fv(MaterialGrayB);
+
+ glScalef(mp->antsize[i], mp->antsize[i], mp->antsize[i]);
+
+ /* slow down first ant */
+ if(i == 0 && mp->part[i] == mp->antpathlength[i])
+ draw_ant(mi, mp, MaterialGrayB, mono, 1, mp->first_ant_step, mySphere, myCone);
+ else
+ draw_ant(mi, mp, MaterialGrayB, mono, 1, mp->ant_step, mySphere, myCone);
+
+ glPopMatrix();
+
+ glDisable(GL_BLEND);
+ glEnable(GL_LIGHTING);
+
+ glPushMatrix();
+/* glTranslatef(0.0, 0.18, 0.0); */
+ glTranslatef(0.0, 0.12, 0.0);
+ glTranslatef(mp->antposition[i][0], mp->antposition[i][2], mp->antposition[i][1]);
+ glRotatef(180.0 + mp->antdirection[i]*180.0/PI, 0.0, 1.0, 0.0);
+ glRotatef(90.0, 0.0, 0.0, 1.0);
+ glScalef(0.6, 0.6, 0.6);
+
+ glScalef(mp->antsize[i], mp->antsize[i], mp->antsize[i]);
+
+/* glEnable(GL_TEXTURE_2D); */
+/* glBindTexture(GL_TEXTURE_2D, brushedtexture); */
+
+/* glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialRed); */
+
+ /* slow down first ant */
+ if(i == 0 && mp->part[i] == mp->antpathlength[i] && mp->elevator > 0.0) {
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+ draw_ant(mi, mp, antmaterial[i], mono, 1, mp->first_ant_step, mySphere, myCone);
+ }
+ else {
+/* glLightfv(GL_LIGHT0, GL_DIFFUSE, df); */
+/* glLightfv(GL_LIGHT1, GL_DIFFUSE, df); */
+
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, mp->brushedtexture);
+ draw_ant(mi, mp, antmaterial[i], mono, 1, mp->ant_step, mySphereTex, myCone);
+ glDisable(GL_TEXTURE_2D);
+ }
+
+
+/* draw_ant(mi, antmaterial[i], mono, 0, ant_step, mySphereTex, myCone); */
+/* glDisable(GL_TEXTURE_2D); */
+ glPopMatrix();
+ }
+
+/* glPopMatrix(); */
+
+/* /\* now draw overlay *\/ */
+/* glDisable(GL_LIGHTING); */
+/* glDisable(GL_BLEND); */
+
+/* /\* go to ortho mode *\/ */
+/* glMatrixMode(GL_PROJECTION); */
+/* glPushMatrix(); */
+/* glLoadIdentity(); */
+/* glOrtho(-4.0, 4.0, -3.0, 3.0, -100.0, 100.0); */
+
+/* /\* translate to corner *\/ */
+/* glTranslatef(4.0-1.2, 3.0-1.2, 0.0); */
+
+/* glDisable(GL_LIGHTING); */
+/* glEnable(GL_BLEND); */
+
+/* /\* draw the 2d board *\/ */
+/* glBegin(GL_QUADS); */
+/* { */
+/* int i, j; */
+/* double sz = 1.0; */
+/* for(i = 0; i < BOARDSIZE; ++i) */
+/* for(j = 0; j < BOARDSIZE; ++j) { */
+/* int par = board[i][j]; */
+/* glColor4f(par ? 0.4 : 0.6, */
+/* par ? 0.4 : 0.6, */
+/* par ? 0.4 : 0.6, */
+/* 0.5); */
+/* glNormal3f(0.0, 0.0, 1.0); */
+/* glVertex3f((sz*(i+1))/BOARDSIZE, (sz*(j+1))/BOARDSIZE, 0.0); */
+/* glVertex3f((sz*i)/BOARDSIZE, (sz*(j+1))/BOARDSIZE, 0.0); */
+/* glVertex3f((sz*i)/BOARDSIZE, (sz*j)/BOARDSIZE, 0.0); */
+/* glVertex3f((sz*(i+1))/BOARDSIZE, (sz*j)/BOARDSIZE, 0.0); */
+/* mi->polygon_count++; */
+/* } */
+/* } */
+/* glEnd(); */
+
+/* glPopMatrix(); */
+
+
+ /* but the step size is the same! */
+ mp->ant_step += 0.18;
+/* if(ant_step > 2*Pi) { */
+/* ant_step = 0.0; */
+/* } */
+
+ if(mp->ant_step > 5*Pi)
+ mp->started = 1;
+
+ mp->ant_position += 1;
+ return True;
+}
+#undef AntmazeDivisions
+#undef AntmazeTransversals
+
+ENTRYPOINT void reshape_antmaze(ModeInfo * mi, int width, int height)
+{
+ double h = (GLfloat) height / (GLfloat) width;
+ int size = (width / 512) + 1;
+ antmazestruct *mp = &antmaze[MI_SCREEN(mi)];
+
+ glViewport(0, 0, mp->WindW = (GLint) width, mp->WindH = (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ gluPerspective(45, 1/h, 1, 25.0);
+
+ glMatrixMode(GL_MODELVIEW);
+/* glLineWidth(3.0); */
+ glLineWidth(size);
+ glPointSize(size);
+}
+
+static void update_ants(antmazestruct *mp)
+{
+ int i;
+ GLfloat df[4];
+ df[0] = df[1] = df[2] = 0.8*mp->fadeout;
+ df[3] = 1.0;
+
+ /* fade out */
+ if(mp->fadeoutspeed < -0.00001) {
+
+ if(mp->fadeout <= 0.0) {
+ /* switch boards: rebuild old board, increment current */
+ mp->currentboard = (mp->currentboard+1)%BOARDCOUNT;
+ build_board(mp, mp->currentboard);
+ mp->fadeoutspeed = 0.02;
+ }
+
+ mp->fadeout += mp->fadeoutspeed;
+
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, df);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, df);
+ }
+
+ /* fade in */
+ if(mp->fadeoutspeed > 0.0001) {
+ mp->fadeout += mp->fadeoutspeed;
+ if(mp->fadeout >= 1.0) {
+ mp->fadeout = 1.0;
+ mp->fadeoutspeed = 0.0;
+ mp->entroducing = 12;
+ }
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, df);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, df);
+ }
+
+ for(i = 0; i < ANTCOUNT; ++i) {
+
+ if(!mp->anton[i] && mp->elevator < 1.0) {
+
+ /* turn on ant */
+ if(mp->entroducing > 0 && mp->introduced <= 0 && random()%100 == 0) {
+ mp->anton[i] = 1;
+ mp->part[i] = 0;
+ mp->antsize[i] = 0.0;
+ mp->antposition[i][0] = -4.0;
+ mp->antposition[i][1] = 5.0;
+ mp->antdirection[i] = PI/2.0;
+ mp->bposition[i][0] = 0;
+ mp->bposition[i][1] = 8;
+ mp->introduced = 300;
+ mp->entroducing--;
+ }
+
+ continue;
+ }
+
+ if(mp->part[i] == 0 && mp->antsize[i] < 1.0) {
+ mp->antsize[i] += 0.02;
+ continue;
+ }
+
+ if(mp->part[i] > mp->antpathlength[i] && mp->antsize[i] > 0.0) {
+ mp->antsize[i] -= 0.02;
+ if(mp->antvelocity[i] > 0.0) {
+ mp->antvelocity[i] -= 0.02;
+ }
+ else { mp->antvelocity[i] = 0.0; }
+
+ continue;
+ }
+
+ if(mp->part[i] > mp->antpathlength[i] && mp->antsize[i] <= 0.0) {
+ mp->antvelocity[i] = 0.02;
+
+ /* if(i != 0) { */
+ antmaterial[i] = materials[random()%MATERIALS];
+ /* } */
+
+ mp->antdirection[i] = PI/2.0;
+ mp->bposition[i][0] = 0;
+ mp->bposition[i][1] = 8;
+ mp->part[i] = 0;
+
+ mp->antsize[i] = 0.0;
+
+ mp->anton[i] = 0;
+
+ mp->antposition[i][0] = -4.0;
+ mp->antposition[i][1] = 5.0;
+
+ /* /\* reset camera *\/ */
+ /* if(i == focus) { */
+ /* started = 0; */
+ /* ant_step = 0.0; */
+ /* } */
+
+ /* check for the end */
+ if(mp->entroducing <= 0) {
+ int ao = 0, z = 0;
+ for(z = 0; z < ANTCOUNT; ++z) {
+ if(mp->anton[z]) { ao = 1; break; }
+ }
+
+ if(ao == 0) {
+ mp->fadeoutspeed = -0.02;
+ }
+ }
+
+ }
+
+ /* near goal, bend path towards next step */
+ if(near(mp->antposition[i], mp->antpath[i][mp->part[i]])) {
+
+ ++mp->part[i];
+
+/* /\* special first ant *\/ */
+/* if(i == 0 && part[i] > antpathlength[i]) { */
+/* if(fir) */
+/* first_ant_step = ant_step; */
+
+/* antvelocity[i] = 0.0; */
+/* /\* antposition[i][2] += 0.025; *\/ */
+/* elevator += 0.025; */
+
+/* /\* set light *\/ */
+/* double l1 = 1.0 - (elevator < 1.0 ? elevator : 2.0 - elevator); */
+/* GLfloat df[4] = {0.8*l1, 0.8*l1, 0.8*l1, 1.0}; */
+/* glLightfv(GL_LIGHT0, GL_DIFFUSE, df); */
+/* glLightfv(GL_LIGHT1, GL_DIFFUSE, df); */
+
+/* /\* draw next board *\/ */
+/* if(elevator > 1.0) { */
+
+/* if(makenew == 1) { */
+/* int re; */
+
+/* /\* switch boards: rebuild old board, increment current *\/ */
+/* currentboard = (currentboard+1)%BOARDCOUNT; */
+/* build_board(currentboard); */
+
+/* for(re = 1; re < ANTCOUNT; ++re) { */
+/* anton[re] = 0; */
+/* antmaterial[re] = materials[random()%MATERIALS]; */
+/* } */
+
+/* makenew = 0; */
+
+/* } */
+
+/* /\* draw the other board *\/ */
+/* glEnable(GL_TEXTURE_2D); */
+/* glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray6); */
+
+/* glPushMatrix(); */
+/* glTranslatef(-(-(BOARDSIZE-3.5)+(BOARDSIZE-1)/2.0), 0.0, */
+/* -(2.4+BOARDSIZE+(BOARDSIZE-1)/2.0)); */
+/* draw_board(mi, mp); */
+/* glPopMatrix(); */
+/* glDisable(GL_TEXTURE_2D); */
+/* } */
+/* /\* reset *\/ */
+/* if(elevator > 2.0) { */
+/* antposition[i][0] = -4.0;/\*-= -(-(BOARDSIZE-3.5)+(BOARDSIZE-1)/2.0);*\//\*= -4.0;*\/ */
+/* antposition[i][1] = 5.5;/\*-(2.4+BOARDSIZE+(BOARDSIZE-1)/2.0);*\/ */
+/* /\* antposition[i][2] = 0.15; *\/ */
+/* antdirection[i] = PI/2.0; */
+/* bposition[i][0] = 0; */
+/* bposition[i][1] = 8; */
+/* part[i] = 0; */
+/* antvelocity[i] = 0.02; */
+/* fir = 0; */
+/* antmaterial[i] = MaterialRed; */
+
+/* makenew = 1; */
+
+/* elevator = 0.0; */
+/* introduced = 200; */
+/* } */
+/* else { */
+/* part[i]--; */
+/* } */
+/* } */
+
+ }
+
+ /* move toward goal, correct ant direction if required */
+ else {
+
+ /* difference */
+ double dx = mp->antpath[i][mp->part[i]][0] - mp->antposition[i][0];
+ double dz = - mp->antpath[i][mp->part[i]][1] + mp->antposition[i][1];
+ double theta, ideal;
+
+ if(dz > EPSILON)
+ theta = atan(dz/dx);
+ else
+ theta = dx > EPSILON ? 0.0 : PI;
+
+ ideal = theta - mp->antdirection[i];
+ if(ideal < -Pi/2.0)
+ ideal += Pi;
+
+ /* compute correction */
+ {
+ double dt = sign(ideal) * min(fabs(ideal), PI/90.0);
+ mp->antdirection[i] += dt;
+ if(mp->antdirection[i] > 2.0*PI)
+ mp->antdirection[i] = 0.0;
+ }
+ }
+
+ mp->antposition[i][0] += mp->antvelocity[i] * cos(mp->antdirection[i]);
+ mp->antposition[i][1] += mp->antvelocity[i] * sin(-mp->antdirection[i]);
+ }
+}
+
+static void pinit(antmazestruct *mp)
+{
+ glClearDepth(1.0);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT1, GL_POSITION, position1);
+
+ glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.05);
+ glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.001);
+ glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.1);
+
+ glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.05);
+ glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.001);
+ glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 0.1);
+
+
+/* glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); */
+/* glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside); */
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ glEnable(GL_NORMALIZE);
+ glFrontFace(GL_CCW);
+ glCullFace(GL_BACK);
+
+ /* antmaze */
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+ glDisable(GL_TEXTURE_2D);
+
+ /* setup textures */
+ makeCheckImage(mp);
+ makeBrushedImage(mp);
+
+ build_board(mp, 0);
+ build_board(mp, 1);
+
+/* makeCheckImage(); */
+/* glPixelStorei(GL_UNPACK_ALIGNMENT, 1); */
+/* glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth, */
+/* checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, checkers); */
+/* glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); */
+/* glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); */
+
+/* glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); */
+/* glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); */
+/* glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); */
+ glEnable(GL_TEXTURE_2D);
+
+/* glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess); */
+/* glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular); */
+}
+
+#define MAX_MAGNIFICATION 10
+#define max(a, b) a < b ? b : a
+#define min(a, b) a < b ? a : b
+
+ENTRYPOINT Bool antmaze_handle_event (ModeInfo *mi, XEvent *event)
+{
+ antmazestruct *mp = &antmaze[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, mp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &mp->button_down_p))
+ return True;
+
+ if (event->xany.type == ButtonPress)
+ {
+ switch(event->xbutton.button) {
+
+ case Button3:
+ mp->focus = (mp->focus + 1) % ANTCOUNT;
+ return True;
+
+ case Button4:
+ mp->mag = max(mp->mag-1, 1);
+ return True;
+
+ case Button5:
+ mp->mag = min(mp->mag+1, MAX_MAGNIFICATION);
+ return True;
+ }
+ }
+
+ return False;
+}
+
+ENTRYPOINT void init_antmaze(ModeInfo * mi)
+{
+ double rot_speed = 0.3;
+ int i;
+
+ antmazestruct *mp;
+
+ MI_INIT(mi, antmaze);
+ mp = &antmaze[MI_SCREEN(mi)];
+ mp->step = NRAND(90);
+ mp->ant_position = NRAND(90);
+
+
+ mp->antdirection[0] = PI/2.0;
+ mp->antdirection[1] = PI/2.0;
+ mp->antdirection[2] = 0;
+ mp->antdirection[3] = PI/2.0;
+ mp->antdirection[4] = PI/2.0;
+
+ mp->antposition[0][0] = -4.0;
+ mp->antposition[0][1] = 5.0;
+ mp->antposition[0][1] = 0.15;
+
+ mp->antposition[1][0] = -4.0;
+ mp->antposition[1][1] = 3.0;
+ mp->antposition[1][1] = 0.15;
+
+ mp->antposition[2][0] = -1.0;
+ mp->antposition[2][1] = -2.0;
+ mp->antposition[2][1] = 0.15;
+
+ mp->antposition[3][0] = -3.9;
+ mp->antposition[3][1] = 6.0;
+ mp->antposition[3][1] = 0.15;
+
+ mp->antposition[4][0] = 2.0;
+ mp->antposition[4][1] = -2.0;
+ mp->antposition[4][1] = 0.15;
+
+
+
+ for (i = 0; i < ANTCOUNT; i++) {
+ mp->antvelocity[i] = 0.02;
+ mp->antsize[i] = 1.0;
+ mp->anton[i] = 0;
+ }
+
+ mp->bposition[0][0] = 0;
+ mp->bposition[0][1] = 8;
+
+ mp->bposition[1][0] = 9;
+ mp->bposition[1][1] = 1;
+
+ mp->bposition[2][0] = 1;
+ mp->bposition[2][1] = 1;
+
+ mp->bposition[3][0] = 4;
+ mp->bposition[3][1] = 8;
+
+ mp->bposition[4][0] = 2;
+ mp->bposition[4][1] = 1;
+
+ mp->part[0] = 0;
+ mp->part[1] = 1;
+ mp->part[2] = 5;
+ mp->part[3] = 1;
+ mp->part[4] = 3;
+
+ mp->introduced = 0;
+ mp->entroducing = 12;
+ mp->fadeout = 1.0;
+ mp->mag = 4.0;
+
+ mp->rot = make_rotator (rot_speed, rot_speed, rot_speed, 1, 0, True);
+ mp->trackball = gltrackball_init (False);
+
+ if ((mp->glx_context = init_GL(mi)) != NULL) {
+ reshape_antmaze(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ pinit(mp);
+ }
+ else
+ MI_CLEARWINDOW(mi);
+}
+
+static void
+device_rotate(ModeInfo *mi)
+{
+#if 0
+ GLfloat rot = current_device_rotation();
+ glRotatef(rot, 0, 0, 1);
+ if ((rot > 45 && rot < 135) ||
+ (rot < -45 && rot > -135))
+ {
+ GLfloat s = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ glScalef (1/s, s, 1);
+ }
+#endif
+}
+
+
+ENTRYPOINT void draw_antmaze(ModeInfo * mi)
+{
+ double h = (GLfloat) MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+
+ antmazestruct *mp;
+
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if(!antmaze)
+ return;
+ mp = &antmaze[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+
+ if(!mp->glx_context)
+ return;
+
+ mi->polygon_count = 0;
+ glXMakeCurrent(display, window, *(mp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /* first panel */
+ glPushMatrix();
+/* h = ((GLfloat) MI_HEIGHT(mi)/2) / (3*(GLfloat)MI_WIDTH(mi)/4); */
+ glViewport(MI_WIDTH(mi)/32, MI_HEIGHT(mi)/8, (9*MI_WIDTH(mi))/16, 3*MI_HEIGHT(mi)/4);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+/* h = (3*MI_HEIGHT(mi)/4) / (3*MI_WIDTH(mi)/4); */
+ gluPerspective(45, 1/h, 1, 25.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ device_rotate(mi);
+
+ glPushMatrix();
+
+ /* follow focused ant */
+ glTranslatef(0.0, 0.0, -mp->mag - 5.0);
+ glRotatef(20.0+5.0*sin(mp->ant_step/40.0), 1.0, 0.0, 0.0);
+/* glTranslatef(0.0, */
+/* started ? -mag : -8.0 + 4.0*fabs(sin(ant_step/10.0)), */
+/* started ? -mag : -8.0 + 4.0*fabs(sin(ant_step/10.0))); */
+
+ gltrackball_rotate(mp->trackball);
+
+ glRotatef(mp->ant_step*0.6, 0.0, 1.0, 0.0);
+
+/* glRotatef(90.0, 0.0, 0.0, 1.0); */
+
+/* glTranslatef(-antposition[0][0]-0.5, 0.0, -antposition[focus][1]); */
+ /*-elevator*/
+
+ /* sync */
+ if(!draw_antmaze_strip(mi)) {
+ MI_ABORT(mi);
+ return;
+ }
+
+ glPopMatrix();
+ glPopMatrix();
+
+ h = (GLfloat) (3*MI_HEIGHT(mi)/8) / (GLfloat) (MI_WIDTH(mi)/2);
+
+ /* draw overhead */
+ glPushMatrix();
+ glViewport((17*MI_WIDTH(mi))/32, MI_HEIGHT(mi)/2, MI_WIDTH(mi)/2, 3*MI_HEIGHT(mi)/8);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ device_rotate(mi);
+ gluPerspective(45, 1/h, 1, 25.0);
+ glMatrixMode(GL_MODELVIEW);
+
+ /* twist scene */
+ glTranslatef(0.0, 0.0, -16.0);
+ glRotatef(60.0, 1.0, 0.0, 0.0);
+ glRotatef(-15.0 + mp->ant_step/10.0, 0.0, 1.0, 0.0);
+ gltrackball_rotate(mp->trackball);
+
+ /* sync */
+ if(!draw_antmaze_strip(mi)) {
+ MI_ABORT(mi);
+ return;
+ }
+
+ glPopMatrix();
+
+ /* draw ant display */
+ glPushMatrix();
+ glViewport((5*MI_WIDTH(mi))/8, MI_HEIGHT(mi)/8, (11*MI_WIDTH(mi))/32, 3*MI_HEIGHT(mi)/8);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ device_rotate(mi);
+ gluPerspective(45, 1/h, 1, 25.0);
+ glMatrixMode(GL_MODELVIEW);
+
+ /* twist scene */
+ glTranslatef(0.0, 0.0, -1.6);
+ glRotatef(30.0, 1.0, 0.0, 0.0);
+ glRotatef(mp->ant_step, 0.0, 1.0, 0.0);
+ glRotatef(90.0, 0.0, 0.0, 1.0);
+
+/* /\* draw ant shadow *\/ */
+/* glPushMatrix(); */
+/* glScalef(1.0, 0.01, 1.0); */
+/* glRotatef(90.0, 0.0, 0.0, 1.0); */
+/* glRotatef(90.0, 0.0, 1.0, 0.0); */
+/* glDisable(GL_LIGHTING); */
+/* glColor4fv(MaterialGray6); */
+
+/* /\* slow down first ant *\/ */
+/* draw_ant(MaterialGrayB, 0, 1, first_ant_step, mySphere, myCone); */
+/* glPopMatrix(); */
+
+ /* draw ant body */
+ glEnable(GL_TEXTURE_2D);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+ glBindTexture(GL_TEXTURE_2D, mp->brushedtexture);
+ draw_ant(mi, mp, MaterialGray35, 0, 1, mp->ant_step/2.0, mySphereTex, myCone2);
+ glDisable(GL_TEXTURE_2D);
+
+ glPopMatrix();
+
+/* /\* draw overlay *\/ */
+/* glPushMatrix(); */
+
+/* /\* go to ortho mode *\/ */
+/* glViewport(MI_WIDTH(mi)/2, MI_HEIGHT(mi)/8, MI_WIDTH(mi)/2, 3*MI_HEIGHT(mi)/8); */
+
+/* glMatrixMode(GL_PROJECTION); */
+/* glLoadIdentity(); */
+
+/* glPushMatrix (); */
+/* glOrtho(-4.0, 4.0, -3.0, 3.0, -100.0, 100.0); */
+
+/* glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGrayB); */
+/* glColor4fv(MaterialGrayB); */
+
+/* glDisable(GL_LIGHTING); */
+/* glEnable(GL_BLEND); */
+
+/* glBegin(GL_QUADS); */
+/* glNormal3f(0.0, 0.0, 1.0); */
+/* glVertex3f(4.0, 3.0, 0.0); */
+/* glVertex3f(2.0, 3.0, 0.0); */
+/* glVertex3f(2.0, -3.0, 0.0); */
+/* glVertex3f(4.0, -3.0, 0.0); */
+/* mi->polygon_count++; */
+/* glEnd(); */
+
+/* glEnable(GL_LIGHTING); */
+/* glDisable(GL_BLEND); */
+
+/* glPopMatrix(); */
+/* glPopMatrix(); */
+
+ if (MI_IS_FPS(mi)) {
+ glViewport(0, 0, MI_WIDTH(mi), MI_HEIGHT(mi));
+ do_fps (mi);
+ }
+ glFlush();
+
+ glXSwapBuffers(display, window);
+
+ update_ants(mp);
+
+ mp->step += 0.025;
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void change_antmaze(ModeInfo * mi)
+{
+ antmazestruct *mp = &antmaze[MI_SCREEN(mi)];
+
+ if (!mp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(mp->glx_context));
+ pinit();
+}
+#endif /* !STANDALONE */
+
+XSCREENSAVER_MODULE ("AntMaze", antmaze)
+
+#endif
diff --git a/hacks/glx/antmaze.man b/hacks/glx/antmaze.man
new file mode 100644
index 0000000..4c4bec8
--- /dev/null
+++ b/hacks/glx/antmaze.man
@@ -0,0 +1,52 @@
+.TH XScreenSaver 1 "May 2005"
+.SH NAME
+antmaze \- ant maze walker
+.SH SYNOPSIS
+.B antmaze
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP] [\-fps]
+.SH DESCRIPTION
+The \fIantmaze\fP code displays ants finding their way through a maze.
+.SH OPTIONS
+.I antmaze
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Blair Tennessy. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Blair Tennessy <tennessy@cs.ubc.ca>, 8-May-2005.
+
diff --git a/hacks/glx/ants.h b/hacks/glx/ants.h
new file mode 100644
index 0000000..d0bef7e
--- /dev/null
+++ b/hacks/glx/ants.h
@@ -0,0 +1,45 @@
+/* ants.h -- header file containing common ant parameters
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Copyright 2003 Blair Tennessy
+*/
+
+/* static const GLfloat MaterialRed[] = {0.6, 0.0, 0.0, 1.0}; */
+/*static const GLfloat MaterialPurple[] = {0.6, 0.2, 0.5, 1.0};*/
+/*static const GLfloat MaterialOrange[] = {1.0, 0.69, 0.00, 1.0};*/
+/*static const GLfloat MaterialGreen[] = {0.1, 0.5, 0.2, 0.2};*/
+/*static const GLfloat MaterialBlue[] = {0.4, 0.4, 0.8, 1.0};*/
+/*static const GLfloat MaterialCyan[] = {0.2, 0.5, 0.7, 1.0};*/
+/*static const GLfloat MaterialYellow[] = {0.7, 0.7, 0.0, 1.0};*/
+/* static const GLfloat MaterialMagenta[] = {0.6, 0.2, 0.5, 1.0}; */
+/*static const GLfloat MaterialWhite[] = {0.7, 0.7, 0.7, 1.0};*/
+static const GLfloat MaterialGray[] = {0.2, 0.2, 0.2, 1.0};
+static const GLfloat MaterialGrayB[] = {0.1, 0.1, 0.1, 0.5};
+/*static const GLfloat MaterialGray35[] = {0.30, 0.30, 0.30, 1.0};*/
+
+static const GLfloat MaterialGray5[] = {0.5, 0.5, 0.5, 1.0};
+static const GLfloat MaterialGray6[] = {0.6, 0.6, 0.6, 1.0};
+/* static const GLfloat MaterialGray8[] = {0.8, 0.8, 0.8, 1.0};*/
+
+typedef struct {
+
+ double position[3];
+ double goal[3];
+ double velocity;
+ double direction;
+ double step;
+
+ const GLfloat *material;
+
+} Ant;
diff --git a/hacks/glx/antspotlight.c b/hacks/glx/antspotlight.c
new file mode 100644
index 0000000..55bb80c
--- /dev/null
+++ b/hacks/glx/antspotlight.c
@@ -0,0 +1,799 @@
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Copyright 2003 Blair Tennessy
+ */
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*useSHM: True \n"
+
+# define free_antspotlight 0
+# define release_antspotlight 0
+#include "xlockmore.h"
+#else
+#include "xlock.h"
+#endif
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+#else
+# include <X11/Xlib.h>
+# include <GL/gl.h>
+# include <GL/glu.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#include "sphere.h"
+#include "tube.h"
+#include "rotator.h"
+#include "gltrackball.h"
+
+ENTRYPOINT ModeSpecOpt antspotlight_opts = {
+ 0, NULL, 0, NULL, NULL
+};
+
+#ifdef USE_MODULES
+ModStruct antspotlight_description = {
+ "antspotlight", "init_antspotlight", "draw_antspotlight",
+ (char *) NULL, "draw_antspotlight", "change_antspotlight",
+ (char *) NULL, &antspotlight_opts, 1000, 1, 1, 1, 4, 1.0, "",
+ "draws an ant scoping the screen", 0, NULL
+};
+#endif
+
+#define Scale4Window 0.3
+#define Scale4Iconic 0.4
+
+#define sqr(A) ((A)*(A))
+
+#ifndef Pi
+#define Pi M_PI
+#endif
+
+#include "ants.h"
+#include "grab-ximage.h"
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ GLfloat max_tx, max_ty;
+ int mono, wire, ticks;
+ GLuint screentexture;
+
+ Ant *ant;
+ double boardsize;
+ GLfloat spot_direction[3];
+ int mag;
+
+ Bool mipmap_p;
+ Bool waiting_for_image_p;
+
+} antspotlightstruct;
+
+static antspotlightstruct *antspotlight = (antspotlightstruct *) NULL;
+
+#define NUM_SCENES 2
+
+/* draw method for ant */
+static Bool draw_ant(ModeInfo *mi, antspotlightstruct *mp,
+ const GLfloat *Material, int mono, int shadow,
+ float ant_step, Bool (*sphere)(float), Bool (*cone)(float))
+{
+
+ float cos1 = cos(ant_step);
+ float cos2 = cos(ant_step + 2 * Pi / 3);
+ float cos3 = cos(ant_step + 4 * Pi / 3);
+ float sin1 = sin(ant_step);
+ float sin2 = sin(ant_step + 2 * Pi / 3);
+ float sin3 = sin(ant_step + 4 * Pi / 3);
+
+/* Apparently this is a performance killer on many systems...
+ glEnable(GL_POLYGON_SMOOTH);
+ */
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->mono ? MaterialGray5 : Material);
+ glEnable(GL_CULL_FACE);
+ glPushMatrix();
+ glScalef(1, 1.3, 1);
+ if(!((*sphere)(0.18)))
+ return False;
+ glScalef(1, 1 / 1.3, 1);
+ glTranslatef(0.00, 0.30, 0.00);
+ if(!((*sphere)(0.2)))
+ return False;
+
+ glTranslatef(-0.05, 0.17, 0.05);
+ glRotatef(-90, 1, 0, 0);
+ glRotatef(-25, 0, 1, 0);
+ if(!((*cone)(0.05)))
+ return False;
+ glTranslatef(0.00, 0.10, 0.00);
+ if(!((*cone)(0.05)))
+ return False;
+ glRotatef(25, 0, 1, 0);
+ glRotatef(90, 1, 0, 0);
+
+ glScalef(1, 1.3, 1);
+ glTranslatef(0.15, -0.65, 0.05);
+ if(!((*sphere)(0.25)))
+ return False;
+ glScalef(1, 1 / 1.3, 1);
+ glPopMatrix();
+ glDisable(GL_CULL_FACE);
+
+ glDisable(GL_LIGHTING);
+
+ /* ANTENNAS */
+ glEnable(GL_LINE_SMOOTH);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glBegin(GL_LINES);
+ glColor3fv(mp->mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.30, 0.00);
+ glColor3fv(MaterialGray);
+ glVertex3f(0.40, 0.70, 0.40);
+ mi->polygon_count++;
+ glColor3fv(mp->mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.30, 0.00);
+ glColor3fv(MaterialGray);
+ glVertex3f(0.40, 0.70, -0.40);
+ mi->polygon_count++;
+ glEnd();
+
+ if(!shadow) {
+ glBegin(GL_POINTS);
+ glColor3fv(mp->mono ? MaterialGray6 : MaterialGray5);
+ glVertex3f(0.40, 0.70, 0.40);
+ mi->polygon_count++;
+ glVertex3f(0.40, 0.70, -0.40);
+ mi->polygon_count++;
+ glEnd();
+ }
+
+ /* LEFT-FRONT ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mp->mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.05, 0.18);
+ glVertex3f(0.35 + 0.05 * cos1, 0.15, 0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* LEFT-CENTER ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mp->mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.00, 0.18);
+ glVertex3f(0.35 + 0.05 * cos2, 0.00, 0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* LEFT-BACK ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mp->mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, -0.05, 0.18);
+ glVertex3f(0.35 + 0.05 * cos3, -0.15, 0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* RIGHT-FRONT ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mp->mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.05, -0.18);
+ glVertex3f(0.35 - 0.05 * sin1, 0.15, -0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* RIGHT-CENTER ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mp->mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, 0.00, -0.18);
+ glVertex3f(0.35 - 0.05 * sin2, 0.00, -0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ /* RIGHT-BACK ARM */
+ glBegin(GL_LINE_STRIP);
+ glColor3fv(mp->mono ? MaterialGray5 : Material);
+ glVertex3f(0.00, -0.05, -0.18);
+ glVertex3f(0.35 - 0.05 * sin3, -0.15, -0.25);
+ mi->polygon_count++;
+ glColor3fv(MaterialGray);
+ glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45);
+ mi->polygon_count++;
+ glEnd();
+
+ if(!shadow) {
+ glBegin(GL_POINTS);
+ glColor3fv(MaterialGray5);
+ glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45);
+ glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45);
+ glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45);
+ glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45);
+ glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45);
+ glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45);
+ mi->polygon_count += 6;
+ glEnd();
+ }
+
+ glEnable(GL_LIGHTING);
+
+ return True;
+}
+
+/* filled sphere */
+static Bool mySphere(float radius)
+{
+#if 0
+ GLUquadricObj *quadObj;
+
+ if((quadObj = gluNewQuadric()) == 0)
+ return False;
+
+ gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
+ gluSphere(quadObj, radius, 16, 16);
+ gluDeleteQuadric(quadObj);
+#else
+ glPushMatrix();
+ glScalef (radius, radius, radius);
+ glRotatef (90, 1, 0, 0);
+ unit_sphere (16, 16, False);
+ glPopMatrix();
+#endif
+ return True;
+}
+
+/* silhouette sphere */
+static Bool mySphere2(float radius)
+{
+#if 0
+ GLUquadricObj *quadObj;
+
+ if((quadObj = gluNewQuadric()) == 0)
+ return False;
+ gluQuadricDrawStyle(quadObj, (GLenum) GLU_LINE);
+ gluSphere(quadObj, radius, 16, 8);
+ gluDeleteQuadric(quadObj);
+#else
+ /* #### no GLU_LINE */
+ glPushMatrix();
+ glScalef (radius, radius, radius);
+ glRotatef (90, 1, 0, 0);
+ unit_sphere (16, 16, True);
+ glPopMatrix();
+#endif
+ return True;
+}
+
+/* no cone */
+static Bool myCone2(float radius) { return True; }
+
+static void draw_board(ModeInfo *mi, antspotlightstruct *mp)
+{
+ int i, j;
+ double cutoff = Pi/3.0;
+ double center[3];
+ double centertex[2];
+
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, mp->screentexture);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray6);
+
+ /* draw mesh */
+
+ /* center is roughly spotlight position */
+ center[0] = mp->ant->position[0];/* + cos(ant->direction); */
+ center[1] = 0.0;
+ center[2] = mp->ant->position[2];/* - 0.7*sin(ant->direction);*/
+
+ centertex[0] = (mp->boardsize/2.0+center[0]) * mp->max_tx / mp->boardsize;
+ centertex[1] = mp->max_ty - ((mp->boardsize/2.0+center[2]) * mp->max_ty / mp->boardsize);
+
+/* glPolygonMode(GL_FRONT, GL_LINE); */
+/* glDisable(GL_TEXTURE_2D); */
+
+ /*
+ the vertices determined here should correspond to the illuminated
+ board. ideally the code adapts vertex distribution to the
+ intensity and shape of the light.
+
+ i should be finding the intersection of the cone of light and
+ the board-plane.
+ */
+ for(i = -12; i < 12; ++i) {
+
+ double theta1, theta2;
+
+ glBegin(GL_TRIANGLE_STRIP);
+ glNormal3f(0.0, 1.0, 0.0);
+
+ glTexCoord2f(centertex[0], centertex[1]);
+ glVertex3f(center[0], 0.01, center[2]);
+
+ /* watch those constants */
+ theta1 = mp->ant->direction + i*(cutoff/8);
+ theta2 = mp->ant->direction + (i+1)*(cutoff/8);
+
+ for(j = 1; j <= 64; ++j) {
+ double point[3], tex[2];
+ /* double fj = pow(1.05, j) - 1.0;*/
+ double fj = j / 6.0;
+ point[0] = center[0] + fj*cos(theta1);
+ point[1] = 0.0;
+ point[2] = center[2] - fj*sin(theta1);
+
+ tex[0] = (mp->boardsize/2.0+point[0]) * mp->max_tx / mp->boardsize;
+ tex[1] = (mp->boardsize/2.0+point[2]) * mp->max_ty / mp->boardsize;
+
+ glTexCoord2f(tex[0], tex[1]);
+ glVertex3f(point[0], point[1], point[2]);
+
+ point[0] = center[0] + fj*cos(theta2);
+ point[1] = 0.0;
+ point[2] = center[2] - fj*sin(theta2);
+
+ tex[0] = (mp->boardsize/2.0+point[0]) * mp->max_tx / mp->boardsize;
+ tex[1] = (mp->boardsize/2.0+point[2]) * mp->max_ty / mp->boardsize;
+
+ glTexCoord2f(tex[0], tex[1]);
+ glVertex3f(point[0], point[1], point[2]);
+ mi->polygon_count++;
+ }
+
+ glEnd();
+ }
+
+ glDisable(GL_TEXTURE_2D);
+}
+
+/* return euclidean distance between two points */
+static double distance(double x[3], double y[3])
+{
+ double dx = x[0] - y[0];
+ double dz = x[2] - y[2];
+ return sqrt(dx*dx + dz*dz);
+}
+
+/* determine a new goal */
+static void find_goal(antspotlightstruct *mp)
+{
+ do {
+ mp->ant->goal[0] = random()%((int)(mp->boardsize+0.5)-2) - mp->boardsize/2.0 + 1.0;
+ mp->ant->goal[1] = 0.0;
+ mp->ant->goal[2] = random()%((int)(mp->boardsize+0.5)-2) - mp->boardsize/2.0 + 1.0;
+ }
+ while(distance(mp->ant->position, mp->ant->goal) < 2.0);
+}
+
+/* construct our ant */
+static void build_ant(antspotlightstruct *mp)
+{
+ mp->ant = (Ant *) malloc(sizeof (Ant));
+ mp->ant->position[0] = 0.0;
+ mp->ant->position[1] = 0.0;
+ mp->ant->position[2] = 0.0;
+ mp->ant->direction = 0.0;
+ mp->ant->velocity = 0.02;
+ mp->ant->material = MaterialGray5;
+ mp->ant->step = 0;
+ find_goal(mp);
+}
+
+#define EPSILON 0.01
+
+static double sign(double d)
+{
+ return d < 0.0 ? -1.0 : 1.0;
+}
+
+static double min(double a, double b)
+{
+ return a < b ? a : b;
+}
+
+/*
+static double max(double a, double b)
+{
+ return a > b ? a : b;
+}
+*/
+
+/* find a new goal and reset steps */
+static void reset_ant(antspotlightstruct *mp)
+{
+ find_goal(mp);
+}
+
+/* draw ant composed of skeleton and glass */
+static void show_ant(ModeInfo *mi, antspotlightstruct *mp)
+{
+
+ glPushMatrix();
+
+ /* move into position */
+ glTranslatef(mp->ant->position[0], 0.33, mp->ant->position[2]);
+ glRotatef(180.0 + mp->ant->direction*180.0/Pi, 0.0, 1.0, 0.0);
+ glRotatef(90.0, 0.0, 0.0, 1.0);
+
+ /* draw skeleton */
+ draw_ant(mi, mp, mp->ant->material, mp->mono, 0, mp->ant->step, mySphere2, myCone2);
+
+ /* draw glass */
+ if(!mp->wire && !mp->mono) {
+ glEnable(GL_BLEND);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGrayB);
+ glColor4fv(MaterialGrayB);
+ draw_ant(mi, mp, MaterialGrayB, mp->mono, 0, mp->ant->step, mySphere, myCone2);
+ glDisable(GL_BLEND);
+ }
+
+ glPopMatrix();
+}
+
+static void draw_antspotlight_strip(ModeInfo *mi)
+{
+ antspotlightstruct *mp = &antspotlight[MI_SCREEN(mi)];
+
+ /* compute spotlight position and direction */
+ GLfloat light1_position[4];
+
+ light1_position[0] = mp->ant->position[0] + 0.7*cos(mp->ant->direction);
+ light1_position[1] = 0.5;
+ light1_position[2] = mp->ant->position[2] - 0.7*sin(mp->ant->direction);
+ light1_position[3] = 1.0;
+
+ mp->spot_direction[0] = cos(mp->ant->direction);
+ mp->spot_direction[1] = -0.5;
+ mp->spot_direction[2] = -sin(mp->ant->direction);
+
+ glLightfv(GL_LIGHT2, GL_POSITION, light1_position);
+ glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, mp->spot_direction);
+
+ glEnable(GL_LIGHT2);
+ glDisable(GL_LIGHT0);
+ glDisable(GL_LIGHT1);
+
+ /* draw board */
+ if(mp->wire)
+ ;
+ else
+ draw_board(mi, mp);
+
+ glDisable(GL_LIGHT2);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+
+ /* now modify ant */
+ show_ant(mi, mp);
+
+ /* near goal, bend path towards next step */
+ if(distance(mp->ant->position, mp->ant->goal) < 0.2) {
+ reset_ant(mp);
+ }
+
+ if(random()%100 == 0) {
+ reset_ant(mp);
+ }
+
+
+ /* move toward goal, correct ant direction if required */
+ else {
+
+ /* difference */
+ double dx = mp->ant->goal[0] - mp->ant->position[0];
+ double dz = -(mp->ant->goal[2] - mp->ant->position[2]);
+ double theta, ideal, dt;
+
+ if(fabs(dx) > EPSILON) {
+ theta = atan(dz/dx);
+ if(dx < 0.0)
+ theta += Pi;
+ }
+ else
+ theta = dz > 0.0 ? (1.0/2.0)*Pi : (3.0/2.0)*Pi;
+
+ if(theta < 0.0)
+ theta += 2*Pi;
+
+ ideal = theta - mp->ant->direction;
+ if(ideal > Pi)
+ ideal -= 2*Pi;
+
+ /* compute correction */
+ dt = sign(ideal) * min(fabs(ideal), Pi/100.0);
+ mp->ant->direction += dt;
+ while(mp->ant->direction < 0.0)
+ mp->ant->direction += 2*Pi;
+ while(mp->ant->direction > 2*Pi)
+ mp->ant->direction -= 2*Pi;
+ }
+
+ mp->ant->position[0] += mp->ant->velocity * cos(mp->ant->direction);
+ mp->ant->position[2] += mp->ant->velocity * sin(-mp->ant->direction);
+ mp->ant->step += 10*mp->ant->velocity;
+ while(mp->ant->step > 2*Pi)
+ mp->ant->step -= 2*Pi;
+}
+
+ENTRYPOINT void reshape_antspotlight(ModeInfo * mi, int width, int height)
+{
+ double h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+ int size = 2;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0, y, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ gluPerspective(45, 1/h, 1.0, 25.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLineWidth(size);
+ glPointSize(size);
+}
+
+/* lighting variables */
+static const GLfloat front_shininess[] = {60.0};
+static const GLfloat front_specular[] = {0.8, 0.8, 0.8, 1.0};
+static const GLfloat ambient[] = {0.4, 0.4, 0.4, 1.0};
+/*static const GLfloat ambient2[] = {0.0, 0.0, 0.0, 0.0};*/
+static const GLfloat diffuse[] = {1.0, 1.0, 1.0, 1.0};
+static const GLfloat position0[] = {1.0, 5.0, 1.0, 0.0};
+static const GLfloat position1[] = {-1.0, -5.0, 1.0, 0.0};
+/*static const GLfloat lmodel_ambient[] = {0.8, 0.8, 0.8, 1.0};*/
+static const GLfloat lmodel_twoside[] = {GL_TRUE};
+static const GLfloat spotlight_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+static const GLfloat spotlight_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+
+static void pinit(void)
+{
+ glClearDepth(1.0);
+
+ /* setup twoside lighting */
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT1, GL_POSITION, position1);
+
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, spotlight_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+
+ /* setup spotlight */
+ glLightfv(GL_LIGHT2, GL_AMBIENT, spotlight_ambient);
+ glLightfv(GL_LIGHT2, GL_DIFFUSE, spotlight_diffuse);
+ glLightf(GL_LIGHT2, GL_CONSTANT_ATTENUATION, 0.1);
+ glLightf(GL_LIGHT2, GL_LINEAR_ATTENUATION, 0.05);
+ glLightf(GL_LIGHT2, GL_QUADRATIC_ATTENUATION, 0.0);
+ glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, 60.0);
+ glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, 3.0);
+
+ glEnable(GL_NORMALIZE);
+ glFrontFace(GL_CCW);
+ glCullFace(GL_BACK);
+
+ /* setup material properties */
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glShadeModel(GL_SMOOTH);
+/* glShadeModel(GL_FLAT); */
+ glEnable(GL_DEPTH_TEST);
+}
+
+#define MAX_MAGNIFICATION 10
+#define max(a, b) a < b ? b : a
+#define min(a, b) a < b ? a : b
+
+/* event handling */
+ENTRYPOINT Bool antspotlight_handle_event(ModeInfo *mi, XEvent *event)
+{
+ antspotlightstruct *mp = &antspotlight[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, mp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &mp->button_down_p))
+ return True;
+
+ if (event->xany.type == ButtonPress)
+ {
+ switch(event->xbutton.button) {
+
+ case Button1:
+ mp->button_down_p = True;
+ gltrackball_start(mp->trackball,
+ event->xbutton.x, event->xbutton.y,
+ MI_WIDTH (mi), MI_HEIGHT (mi));
+ return True;
+
+ case Button4:
+ mp->mag = max(mp->mag-1, 1);
+ return True;
+
+ case Button5:
+ mp->mag = min(mp->mag+1, MAX_MAGNIFICATION);
+ return True;
+ }
+ }
+
+ return False;
+}
+
+static void
+image_loaded_cb (const char *filename, XRectangle *geometry,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure)
+{
+ antspotlightstruct *mp = (antspotlightstruct *) closure;
+
+ mp->max_tx = (GLfloat) image_width / texture_width;
+ mp->max_ty = (GLfloat) image_height / texture_height;
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+ (mp->mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
+
+ mp->waiting_for_image_p = False;
+}
+
+
+/* get screenshot */
+static void get_snapshot(ModeInfo *modeinfo)
+{
+ antspotlightstruct *mp = &antspotlight[MI_SCREEN(modeinfo)];
+
+ if (MI_IS_WIREFRAME(modeinfo))
+ return;
+
+ mp->waiting_for_image_p = True;
+ mp->mipmap_p = True;
+ load_texture_async (modeinfo->xgwa.screen, modeinfo->window,
+ *mp->glx_context, 0, 0, mp->mipmap_p,
+ mp->screentexture, image_loaded_cb, mp);
+}
+
+
+ENTRYPOINT void init_antspotlight(ModeInfo *mi)
+{
+ double rot_speed = 0.3;
+
+ antspotlightstruct *mp;
+
+ MI_INIT(mi, antspotlight);
+ mp = &antspotlight[MI_SCREEN(mi)];
+ mp->rot = make_rotator (rot_speed, rot_speed, rot_speed, 1, 0, True);
+ mp->trackball = gltrackball_init (False);
+
+ if((mp->glx_context = init_GL(mi)) != NULL) {
+ reshape_antspotlight(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ pinit();
+ }
+ else
+ MI_CLEARWINDOW(mi);
+
+ glGenTextures(1, &mp->screentexture);
+ glBindTexture(GL_TEXTURE_2D, mp->screentexture);
+ get_snapshot(mi);
+
+ build_ant(mp);
+ mp->mono = MI_IS_MONO(mi);
+ mp->wire = MI_IS_WIREFRAME(mi);
+ mp->boardsize = 8.0;
+ mp->mag = 1;
+}
+
+ENTRYPOINT void draw_antspotlight(ModeInfo * mi)
+{
+ antspotlightstruct *mp;
+
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if(!antspotlight)
+ return;
+ mp = &antspotlight[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+
+ if(!mp->glx_context)
+ return;
+
+ mi->polygon_count = 0;
+
+ /* Just keep running before the texture has come in. */
+ /* if (mp->waiting_for_image_p) return; */
+
+ glXMakeCurrent(display, window, *(mp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ /* position camera */
+
+ /* follow focused ant */
+ glTranslatef(0.0, 0.0, -6.0 - mp->mag);
+ glRotatef(35.0, 1.0, 0.0, 0.0);
+ gltrackball_rotate(mp->trackball);
+ glTranslatef(-mp->ant->position[0], mp->ant->position[1], -mp->ant->position[2]);
+
+ /* stable position */
+/* glTranslatef(0.0, 0.0, -10.0 - mag); */
+/* gltrackball_rotate(mp->trackball); */
+/* glRotatef(40.0, 1.0, 0.0, 0.0); */
+/* glRotatef(20.0, 0.0, 1.0, 0.0); */
+
+ draw_antspotlight_strip(mi);
+
+ ++mp->ticks;
+
+ glPopMatrix();
+
+ if (MI_IS_FPS(mi)) do_fps (mi);
+ glFlush();
+
+ glXSwapBuffers(display, window);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void change_antspotlight(ModeInfo * mi)
+{
+ antspotlightstruct *mp = &antspotlight[MI_SCREEN(mi)];
+
+ if (!mp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(mp->glx_context));
+ pinit();
+}
+#endif /* !STANDALONE */
+
+XSCREENSAVER_MODULE ("AntSpotlight", antspotlight)
diff --git a/hacks/glx/antspotlight.man b/hacks/glx/antspotlight.man
new file mode 100644
index 0000000..c5f8ed7
--- /dev/null
+++ b/hacks/glx/antspotlight.man
@@ -0,0 +1,56 @@
+.TH XScreenSaver 1 "July 2003"
+.SH NAME
+antspotlight \- ant spotlight screenhack
+.SH SYNOPSIS
+.B antspotlight
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP] [\-fps]
+.SH DESCRIPTION
+The \fIantspotlight\fP code displays a single ant spotting out a screenshot.
+.SH OPTIONS
+.I antspotlight
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-delay \fImicroseconds\fP
+Per-frame delay.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Blair Tennessy. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Blair Tennessy <tennessb@unbc.ca>, 20-July-2003.
+
diff --git a/hacks/glx/atlantis.c b/hacks/glx/atlantis.c
new file mode 100644
index 0000000..04bde12
--- /dev/null
+++ b/hacks/glx/atlantis.c
@@ -0,0 +1,577 @@
+/* atlantis --- Shows moving 3D sea animals */
+
+#if 0
+static const char sccsid[] = "@(#)atlantis.c 5.08 2003/04/09 xlockmore";
+#endif
+
+/* Copyright (c) E. Lassauge, 1998. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by Mark J. Kilgard
+ * as a demo for openGL programming.
+ *
+ * Porting it to xlock was possible by comparing the original Mesa's morph3d
+ * demo with it's ported version to xlock, so thanks for Marcelo F. Vianna
+ * (look at morph3d.c) for his indirect help.
+ *
+ * Thanks goes also to Brian Paul for making it possible and inexpensive
+ * to use OpenGL at home.
+ *
+ * My e-mail address is lassauge@users.sourceforge.net
+ *
+ * Eric Lassauge (May-13-1998)
+ *
+ * REVISION HISTORY:
+ *
+ * Jamie Zawinski, 2-Apr-01: - The fishies were inside out! The back faces
+ * were being drawn, not the front faces.
+ * - Added a texture to simulate light from the
+ * surface, like in the SGI version.
+ *
+ * David A. Bagley - 98/06/17 : Add whalespeed option. Global options to
+ * initialize local variables are now:
+ * XLock.atlantis.cycles: 100 ! SharkSpeed
+ * XLock.atlantis.batchcount: 4 ! SharkNum
+ * XLock.atlantis.whalespeed: 250 ! WhaleSpeed
+ * XLock.atlantis.size: 6000 ! SharkSize
+ * Add random direction for whales/dolphins
+ *
+ * E.Lassauge - 98/06/16: Use the following global options to initialize
+ * local variables :
+ * XLock.atlantis.delay: 100 ! SharkSpeed
+ * XLock.atlantis.batchcount: 4 ! SharkNum
+ * XLock.atlantis.cycles: 250 ! WhaleSpeed
+ * XLock.atlantis.size: 6000 ! SharkSize
+ * Add support for -/+ wireframe (t'was so easy to do!)
+ *
+ * TODO :
+ * - better handling of sizes and speeds
+ * - test standalone and module modes
+ * - purify it (!)
+ */
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/**
+ * (c) Copyright 1993, 1994, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States. Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+
+#define DEF_TEXTURE "True"
+#define DEF_GRADIENT "True"
+#define DEF_WHALESPEED "250"
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 25000 \n" \
+ "*count: 4 \n" \
+ "*showFPS: False \n" \
+ "*cycles: 100 \n" \
+ "*size: 6000 \n" \
+ "*wireframe: False \n"
+# define release_atlantis 0
+# define atlantis_handle_event xlockmore_no_events
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+# include "vis.h"
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#include "atlantis.h"
+
+
+static int whalespeed;
+static int do_texture;
+static int do_gradient;
+static XrmOptionDescRec opts[] =
+{
+ {"-whalespeed", ".atlantis.whalespeed", XrmoptionSepArg, 0},
+ {"-texture", ".atlantis.texture", XrmoptionNoArg, "true"},
+ {"+texture", ".atlantis.texture", XrmoptionNoArg, "false"},
+ {"-gradient", ".atlantis.gradient", XrmoptionNoArg, "true"},
+ {"+gradient", ".atlantis.gradient", XrmoptionNoArg, "false"},
+};
+
+static argtype vars[] =
+{
+ {&whalespeed, "whalespeed", "WhaleSpeed", DEF_WHALESPEED, t_Int},
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ {&do_gradient, "gradient", "Gradient", DEF_GRADIENT, t_Bool},
+};
+
+static OptionStruct desc[] =
+{
+ {"-whalespeed num", "speed of whales and the dolphin"},
+ {"-texture", "whether to introduce water-like distortion"},
+ {"-gradient", "whether to introduce gradient-filled background"},
+};
+
+ENTRYPOINT ModeSpecOpt atlantis_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct atlantis_description =
+{"atlantis", "init_atlantis", "draw_atlantis", NULL,
+ "refresh_atlantis", "change_atlantis", "free_atlantis", &atlantis_opts,
+ 1000, NUM_SHARKS, SHARKSPEED, SHARKSIZE, 64, 1.0, "",
+ "Shows moving sharks/whales/dolphin", 0, NULL};
+
+#endif
+
+static atlantisstruct *atlantis = NULL;
+
+#include "ximage-loader.h"
+
+#include "images/gen/sea-texture_png.h"
+
+
+static void
+parse_image_data(ModeInfo *mi)
+{
+ atlantisstruct *ap = &atlantis[MI_SCREEN(mi)];
+ ap->texture = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
+ sea_texture_png,
+ sizeof(sea_texture_png));
+}
+
+static void
+InitFishs(atlantisstruct * ap)
+{
+ int i;
+
+ for (i = 0; i < ap->num_sharks; i++) {
+ ap->sharks[i].x = 70000.0 + NRAND(ap->sharksize);
+ ap->sharks[i].y = NRAND(ap->sharksize);
+ ap->sharks[i].z = NRAND(ap->sharksize);
+ ap->sharks[i].psi = NRAND(360) - 180.0;
+ ap->sharks[i].v = 1.0;
+ }
+
+ /* Random whale direction */
+ ap->whaledir = LRAND() & 1;
+
+ ap->dolph.x = 30000.0;
+ ap->dolph.y = 0.0;
+ ap->dolph.z = (float) (ap->sharksize);
+ ap->dolph.psi = (ap->whaledir) ? 90.0 : -90.0;
+ ap->dolph.theta = 0.0;
+ ap->dolph.v = 6.0;
+
+ ap->momWhale.x = 70000.0;
+ ap->momWhale.y = 0.0;
+ ap->momWhale.z = 0.0;
+ ap->momWhale.psi = (ap->whaledir) ? 90.0 : -90.0;
+ ap->momWhale.theta = 0.0;
+ ap->momWhale.v = 3.0;
+
+ ap->babyWhale.x = 60000.0;
+ ap->babyWhale.y = -2000.0;
+ ap->babyWhale.z = -2000.0;
+ ap->babyWhale.psi = (ap->whaledir) ? 90.0 : -90.0;
+ ap->babyWhale.theta = 0.0;
+ ap->babyWhale.v = 3.0;
+}
+
+static void
+Init(ModeInfo *mi)
+{
+ atlantisstruct *ap = &atlantis[MI_SCREEN(mi)];
+
+ static const float ambient[] = {0.1, 0.1, 0.1, 1.0};
+ static const float diffuse[] = {1.0, 1.0, 1.0, 1.0};
+ static const float position[] = {0.0, 1.0, 0.0, 0.0};
+ static const float mat_shininess[] = {90.0};
+ static const float mat_specular[] = {0.8, 0.8, 0.8, 1.0};
+ static const float mat_diffuse[] = {0.46, 0.66, 0.795, 1.0};
+ static const float mat_ambient[] = {0.0, 0.1, 0.2, 1.0};
+ static const float lmodel_ambient[] = {0.4, 0.4, 0.4, 1.0};
+ static const float lmodel_localviewer[] = {0.0};
+
+ float fblue = 0.0, fgreen;
+
+ glFrontFace(GL_CCW);
+
+ if (ap->wire)
+ {
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_NORMALIZE);
+ }
+ else
+ {
+ glDepthFunc(GL_LEQUAL);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_NORMALIZE);
+ glShadeModel(GL_SMOOTH);
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, lmodel_localviewer);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);
+ }
+
+ if (ap->wire || !do_texture)
+ {
+ glDisable(GL_TEXTURE_2D);
+ }
+ else
+ {
+ GLfloat scale = 0.0005;
+
+ if (!ap->texture)
+ parse_image_data (mi);
+
+ clear_gl_error();
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ ap->texture->width, ap->texture->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE,
+ ap->texture->data);
+ check_gl_error("texture");
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+# ifndef HAVE_JWZGLES
+ {
+ GLfloat s_plane[] = { 1, 0, 0, 0 };
+ GLfloat t_plane[] = { 0, 0, 1, 0 };
+ glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+ glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+ glTexGenfv(GL_S, GL_EYE_PLANE, s_plane);
+ glTexGenfv(GL_T, GL_EYE_PLANE, t_plane);
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+ }
+# endif
+ glEnable(GL_TEXTURE_2D);
+
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+ glScalef(scale, scale, 1);
+ glMatrixMode(GL_MODELVIEW);
+ }
+
+ InitFishs(ap);
+
+ /* Add a little randomness */
+ fblue = ((float) (NRAND(30)) / 100.0) + 0.70;
+ fgreen = fblue * 0.56;
+ glClearColor(0.0, fgreen, fblue, 1.0);
+}
+
+ENTRYPOINT void
+reshape_atlantis(ModeInfo * mi, int width, int height)
+{
+ double h = (GLfloat) height / (GLfloat) width;
+ atlantisstruct *ap = &atlantis[MI_SCREEN(mi)];
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0, y, ap->WinW = (GLint) width, ap->WinH = (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(400.0, 1/h, 1.0, 2000000.0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+
+/* Fill the background with a gradient -- thanks to
+ Phil Carrig <pod@internode.on.net> for figuring out
+ how to do this more efficiently!
+ */
+static void
+clear_tank (atlantisstruct * ap)
+{
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if (do_gradient && !ap->wire)
+ {
+ GLfloat top[4] = { 0.00, 0.40, 0.70, };
+ GLfloat bot[4] = { 0.00, 0.05, 0.18, };
+
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ {
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ {
+ glLoadIdentity();
+ /* glRotatef(current_device_rotation(), 0, 0, 1); */
+
+# ifndef HAVE_JWZGLES
+ glShadeModel (GL_SMOOTH);
+# endif
+ glDisable (GL_LIGHTING);
+ glBegin (GL_QUADS);
+ glColor3fv (bot);
+ glVertex3f (-1, -1, 1); glVertex3f ( 1, -1, 1);
+ glColor3fv (top);
+ glVertex3f ( 1, 1, 1); glVertex3f (-1, 1, 1);
+ glEnd();
+ glEnable (GL_LIGHTING);
+
+ /* Need to reset this because jwzgles conflates color and material */
+ glColor3f (0.0, 0.1, 0.2);
+ }
+ glPopMatrix();
+ }
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+
+ glMatrixMode(GL_MODELVIEW);
+ }
+}
+
+
+static void
+Animate(atlantisstruct * ap)
+{
+ int i;
+
+ for (i = 0; i < ap->num_sharks; i++) {
+ SharkPilot(&(ap->sharks[i]), ap->sharkspeed);
+ SharkMiss(ap, i);
+ }
+ WhalePilot(&(ap->dolph), ap->whalespeed, ap->whaledir);
+ ap->dolph.phi++;
+ WhalePilot(&(ap->momWhale), ap->whalespeed, ap->whaledir);
+ ap->momWhale.phi++;
+ WhalePilot(&(ap->babyWhale), ap->whalespeed, ap->whaledir);
+ ap->babyWhale.phi++;
+}
+
+static void
+AllDisplay(atlantisstruct * ap)
+{
+ int i;
+
+ clear_tank(ap);
+
+ for (i = 0; i < ap->num_sharks; i++) {
+ glPushMatrix();
+ FishTransform(&(ap->sharks[i]));
+ DrawShark(&(ap->sharks[i]), ap->wire);
+ glPopMatrix();
+ }
+
+ glPushMatrix();
+ FishTransform(&(ap->dolph));
+ DrawDolphin(&(ap->dolph), ap->wire);
+ glPopMatrix();
+
+ glPushMatrix();
+ FishTransform(&(ap->momWhale));
+ DrawWhale(&(ap->momWhale), ap->wire);
+ glPopMatrix();
+
+ glPushMatrix();
+ FishTransform(&(ap->babyWhale));
+ glScalef(0.45, 0.45, 0.3);
+ DrawWhale(&(ap->babyWhale), ap->wire);
+ glPopMatrix();
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ * Xlock hooks.
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+ *-----------------------------------------------------------------------------
+ * Initialize atlantis. Called each time the window changes.
+ *-----------------------------------------------------------------------------
+ */
+
+ENTRYPOINT void
+init_atlantis(ModeInfo * mi)
+{
+ int screen = MI_SCREEN(mi);
+ atlantisstruct *ap;
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ MI_INIT(mi, atlantis);
+ ap = &atlantis[screen];
+ ap->num_sharks = MI_COUNT(mi);
+ if (ap->sharks == NULL) {
+ if ((ap->sharks = (fishRec *) calloc(ap->num_sharks,
+ sizeof (fishRec))) == NULL) {
+ /* free everything up to now */
+ (void) free((void *) atlantis);
+ atlantis = NULL;
+ return;
+ }
+ }
+ ap->sharkspeed = MI_CYCLES(mi); /* has influence on the "width"
+ of the movement */
+ ap->sharksize = MI_SIZE(mi); /* has influence on the "distance"
+ of the sharks */
+ ap->whalespeed = whalespeed;
+ ap->wire = MI_IS_WIREFRAME(mi);
+
+ if (MI_IS_DEBUG(mi)) {
+ (void) fprintf(stderr,
+ "%s:\n\tnum_sharks=%d\n\tsharkspeed=%.1f\n\tsharksize=%d\n\twhalespeed=%.1f\n\twireframe=%s\n",
+ MI_NAME(mi),
+ ap->num_sharks,
+ ap->sharkspeed,
+ ap->sharksize,
+ ap->whalespeed,
+ ap->wire ? "yes" : "no"
+ );
+ }
+ if ((ap->glx_context = init_GL(mi)) != NULL) {
+
+ reshape_atlantis(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ Init(mi);
+ AllDisplay(ap);
+ glXSwapBuffers(display, window);
+
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * Called by the mainline code periodically to update the display.
+ *-----------------------------------------------------------------------------
+ */
+ENTRYPOINT void
+draw_atlantis(ModeInfo * mi)
+{
+ atlantisstruct *ap = &atlantis[MI_SCREEN(mi)];
+
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ MI_IS_DRAWN(mi) = True;
+
+ if (!ap->glx_context)
+ return;
+
+ glXMakeCurrent(display, window, *(ap->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+ AllDisplay(ap);
+ Animate(ap);
+ glPopMatrix();
+
+ if (mi->fps_p) do_fps (mi);
+ glXSwapBuffers(display, window);
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * The display is being taken away from us. Free up malloc'ed
+ * memory and X resources that we've alloc'ed.
+ *-----------------------------------------------------------------------------
+ */
+
+ENTRYPOINT void
+free_atlantis(ModeInfo * mi)
+{
+#if 0
+ atlantisstruct *ap = &atlantis[screen];
+
+ if (ap->sharks)
+ (void) free((void *) ap->sharks);
+#endif
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_atlantis(ModeInfo * mi)
+{
+}
+
+ENTRYPOINT void
+change_atlantis(ModeInfo * mi)
+{
+ atlantisstruct *ap = &atlantis[MI_SCREEN(mi)];
+
+ if (!ap->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(ap->glx_context));
+ Init(mi);
+}
+#endif /* !STANDALONE */
+
+XSCREENSAVER_MODULE ("Atlantis", atlantis)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/atlantis.h b/hacks/glx/atlantis.h
new file mode 100644
index 0000000..3b24bfa
--- /dev/null
+++ b/hacks/glx/atlantis.h
@@ -0,0 +1,133 @@
+/* atlantis --- Shows moving 3D sea animals */
+
+/* Copyright (c) E. Lassauge, 1998. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by Mark J. Kilgard
+ * as a demo for openGL programming.
+ *
+ * Porting it to xlock was possible by comparing the original Mesa's morph3d
+ * demo with it's ported version to xlock, so thanks for Marcelo F. Vianna
+ * (look at morph3d.c) for his indirect help.
+ *
+ * Thanks goes also to Brian Paul for making it possible and inexpensive
+ * to use OpenGL at home.
+ *
+ * My e-mail address is lassauge@users.sourceforge.net
+ *
+ * Eric Lassauge (May-13-1998)
+ *
+ */
+
+/**
+ * (c) Copyright 1993, 1994, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States. Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#ifdef STANDALONE
+# include <math.h>
+# include "screenhackI.h"
+# ifndef HAVE_JWXYZ
+# include <GL/gl.h>
+# include <GL/glx.h>
+# endif
+#else
+# include "xlock.h"
+#endif
+#ifdef HAVE_ANDROID
+#include <GLES/gl.h>
+#endif
+
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#define RAD 57.295
+#define RRAD 0.01745
+
+/* default values */
+#define NUM_SHARKS 4
+#define SHARKSPEED 100
+#define SHARKSIZE 6000
+
+typedef struct _fishRec {
+ float x, y, z, phi, theta, psi, v;
+ float xt, yt, zt;
+ float htail, vtail;
+ float dtheta;
+ int spurt, attack;
+ int sign;
+} fishRec;
+
+typedef struct {
+ GLint WinH, WinW;
+ GLXContext *glx_context;
+ int num_sharks;
+ float sharkspeed, whalespeed;
+ int sharksize;
+ int wire;
+ Bool whaledir;
+ fishRec *sharks;
+ fishRec momWhale;
+ fishRec babyWhale;
+ fishRec dolph;
+
+ XImage *texture; /* water distortion overlay bits */
+} atlantisstruct;
+
+extern void FishTransform(fishRec *);
+extern void WhalePilot(fishRec *, float, Bool);
+extern void SharkPilot(fishRec *, float);
+extern void SharkMiss(atlantisstruct *, int);
+extern void DrawWhale(fishRec *, int);
+extern void DrawShark(fishRec *, int);
+extern void DrawDolphin(fishRec *, int);
diff --git a/hacks/glx/atlantis.man b/hacks/glx/atlantis.man
new file mode 100644
index 0000000..0c2df5a
--- /dev/null
+++ b/hacks/glx/atlantis.man
@@ -0,0 +1,78 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+atlantis - draw swimming sharks, whales, and dolphins.
+.SH SYNOPSIS
+.B atlantis
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-whalespeed \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-size \fInumber\fP]
+[\-count \fInumber\fP]
+[\-no-texture]
+[\-gradient]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+This is xfishtank writ large: a GL animation of a number of sharks,
+dolphins, and whales. The swimming motions are great.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-whalespeed \fInumber\fP
+Whale Speed. 0 - 1000. Default: 250.
+.TP 8
+.B \-cycles \fInumber\fP
+Shark Speed. Default: 100.
+.TP 8
+.B \-size \fInumber\fP
+Shark Proximity. 100 - 10000. Default: 6000.
+.TP 8
+.B \-count \fInumber\fP
+Number of Sharks. 0 - 20. Default: 4.
+.TP 8
+.B \-texture | \-no-texture
+Whether to show shimmering water.
+.TP 8
+.B \-gradient
+Whether to draw a gradient on the background, making it darker at the bottom.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Mark Kilgard. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Mark Kilgard.
+
diff --git a/hacks/glx/atunnel.c b/hacks/glx/atunnel.c
new file mode 100644
index 0000000..f21d04f
--- /dev/null
+++ b/hacks/glx/atunnel.c
@@ -0,0 +1,317 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* atunnel --- OpenGL Advanced Tunnel Screensaver */
+
+#if 0
+static const char sccsid[] = "@(#)atunnel.c 5.13 2004/05/25 xlockmore";
+#endif
+
+/* Copyright (c) E. Lassauge, 2003-2004. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by Roman Podobedov
+ * Email: romka@ut.ee
+ * WEB: http://romka.demonews.com
+ *
+ * Eric Lassauge (May-25-2004) <lassauge@users.sourceforge.net>
+ * http://lassauge.free.fr/linux.html
+ *
+ * REVISION HISTORY:
+ *
+ * E.Lassauge - 25-May-2004:
+ * - added more texture !
+ * E.Lassauge - 16-Mar-2002:
+ * - created based on the Roman demo.
+ * - deleted all external file stuff to use xpm textures and
+ * hardcoded path point values.
+ *
+ */
+
+#ifdef STANDALONE /* xscreensaver mode */
+#define DEFAULTS "*delay: 10000 \n" \
+ "*showFPS: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define release_atunnel 0
+# define atunnel_handle_event 0
+#define MODE_atunnel
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef MODE_atunnel /* whole file */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include "tunnel_draw.h"
+
+#if defined( USE_XPM ) || defined( USE_XPMINC ) || defined(STANDALONE)
+/* USE_XPM & USE_XPMINC in xlock mode ; STANDALONE in xscreensaver mode */
+#include "ximage-loader.h"
+#define I_HAVE_XPM
+
+#include "images/gen/tunnel0_png.h"
+#include "images/gen/tunnel1_png.h"
+#include "images/gen/tunnel2_png.h"
+#include "images/gen/tunnel3_png.h"
+#include "images/gen/tunnel4_png.h"
+#include "images/gen/tunnel5_png.h"
+#endif /* HAVE_XPM */
+
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define DEF_LIGHT "True"
+#define DEF_WIRE "False"
+#define DEF_TEXTURE "True"
+
+static Bool do_light;
+static Bool do_wire;
+static Bool do_texture;
+
+static XrmOptionDescRec opts[] = {
+ {"-light", ".atunnel.light", XrmoptionNoArg, "true" },
+ {"+light", ".atunnel.light", XrmoptionNoArg, "false" },
+ {"-wireframe",".atunnel.wire", XrmoptionNoArg, "true" },
+ {"+wireframe",".atunnel.wire", XrmoptionNoArg, "false" },
+ {"-texture", ".atunnel.texture", XrmoptionNoArg, "true" },
+ {"+texture", ".atunnel.texture", XrmoptionNoArg, "false" },
+};
+
+static argtype vars[] = {
+ {&do_light, "light", "Light", DEF_LIGHT, t_Bool},
+ {&do_wire, "wire", "Wire", DEF_WIRE, t_Bool},
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+};
+
+static OptionStruct desc[] =
+{
+ {"-/+ light", "whether to do enable lighting (slower)"},
+ {"-/+ wire", "whether to do use wireframe instead of filled (faster)"},
+ {"-/+ texture", "whether to apply a texture (slower)"},
+};
+
+ENTRYPOINT ModeSpecOpt atunnel_opts = {countof(opts), opts, countof(vars), vars, desc};
+
+#ifdef USE_MODULES
+ModStruct atunnel_description =
+{"atunnel", "init_atunnel", "draw_atunnel", NULL,
+ "draw_atunnel", "init_atunnel", "free_atunnel", &atunnel_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "OpenGL advanced tunnel screensaver", 0, NULL};
+#endif
+
+/* structure for holding the screensaver data */
+typedef struct {
+ int screen_width, screen_height;
+ GLXContext *glx_context;
+ Window window;
+ struct tunnel_state *ts;
+ GLuint texture[MAX_TEXTURE]; /* texture id: GL world */
+} atunnelstruct;
+
+static atunnelstruct *Atunnel = NULL;
+
+/*=================== Load Texture =========================================*/
+static void LoadTexture(ModeInfo * mi,
+ const unsigned char *data, unsigned long size,
+ int t_num)
+{
+#if defined( I_HAVE_XPM )
+ atunnelstruct *sa = &Atunnel[MI_SCREEN(mi)];
+ XImage *teximage; /* Texture data */
+
+ if ((teximage = image_data_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi),
+ data, size))
+ == None) {
+ (void) fprintf(stderr, "Error reading the texture.\n");
+ glDeleteTextures(1, &sa->texture[t_num]);
+ do_texture = False;
+#ifdef STANDALONE
+ exit(0);
+#else
+ return;
+#endif
+ }
+
+#ifdef HAVE_GLBINDTEXTURE
+ glBindTexture(GL_TEXTURE_2D, sa->texture[t_num]);
+#endif /* HAVE_GLBINDTEXTURE */
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+ clear_gl_error();
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, teximage->width, teximage->height,
+ 0, GL_RGBA, GL_UNSIGNED_BYTE, teximage->data);
+ check_gl_error("texture");
+
+ /* Texture parameters, LINEAR scaling for better texture quality */
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ XDestroyImage(teximage);
+#else /* !I_HAVE_XPM */
+ do_texture = False;
+#endif /* !I_HAVE_XPM */
+}
+
+/*=================== Main Initialization ==================================*/
+static void Init(ModeInfo * mi)
+{
+ atunnelstruct *sa = &Atunnel[MI_SCREEN(mi)];
+ GLfloat light_ambient[] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat light_specular[] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat light_position[] = {0.0, 0.0, 1.0, 0.0};
+ GLfloat fogColor[4] = {0.8, 0.8, 0.8, 1.0};
+
+ if (do_texture)
+ {
+ glGenTextures(MAX_TEXTURE, sa->texture);
+ LoadTexture(mi, tunnel0_png, sizeof(tunnel0_png),0);
+ LoadTexture(mi, tunnel1_png, sizeof(tunnel1_png),1);
+ LoadTexture(mi, tunnel2_png, sizeof(tunnel2_png),2);
+ LoadTexture(mi, tunnel3_png, sizeof(tunnel3_png),3);
+ LoadTexture(mi, tunnel4_png, sizeof(tunnel4_png),4);
+ LoadTexture(mi, tunnel5_png, sizeof(tunnel5_png),5);
+ glEnable(GL_TEXTURE_2D);
+ }
+ sa->ts = atunnel_InitTunnel();
+
+ /* Set lighting parameters */
+ if (do_light)
+ {
+ glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
+ glLightfv(GL_LIGHT0, GL_POSITION, light_position);
+
+ /* Enable light 0 */
+ glEnable(GL_LIGHT0);
+ glDepthFunc(GL_LESS);
+
+ glEnable(GL_LIGHTING);
+ }
+
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ do_wire = 0;
+# endif
+
+ if (do_wire) {
+ glDisable(GL_NORMALIZE);
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_TEXTURE_2D);
+ glPolygonMode(GL_FRONT,GL_LINE);
+ glPolygonMode(GL_BACK,GL_LINE);
+ }
+ else
+ {
+ glEnable(GL_DEPTH_TEST);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+
+ /* Enable fog */
+ glFogi(GL_FOG_MODE, GL_EXP);
+ glFogfv(GL_FOG_COLOR, fogColor);
+ glFogf(GL_FOG_DENSITY, 0.3);
+ glEnable(GL_FOG);
+
+ /* Cull face */
+ glCullFace(GL_FRONT);
+ glEnable(GL_CULL_FACE);
+ }
+
+ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
+}
+
+
+/* Standard reshape function */
+ENTRYPOINT void
+reshape_atunnel(ModeInfo *mi, int width, int height)
+{
+ double h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 2) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0, y, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-0.1*(1/h), 0.1*(1/h), -0.1, 0.1, 0.1, 10);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+/* draw the screensaver once */
+ENTRYPOINT void draw_atunnel(ModeInfo * mi)
+{
+ atunnelstruct *sa = &Atunnel[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!sa->glx_context)
+ return;
+
+ glXMakeCurrent(display, window, *(sa->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glLoadIdentity();
+
+ atunnel_DrawTunnel(sa->ts, do_texture, do_light, sa->texture);
+ atunnel_SplashScreen(sa->ts, do_wire, do_texture, do_light);
+
+ glFlush();
+ /* manage framerate display */
+ if (MI_IS_FPS(mi)) do_fps (mi);
+ glXSwapBuffers(display, window);
+
+}
+
+
+/* xscreensaver initialization routine */
+ENTRYPOINT void init_atunnel(ModeInfo * mi)
+{
+ int screen = MI_SCREEN(mi);
+ atunnelstruct *sa;
+
+ MI_INIT(mi, Atunnel);
+ sa = &Atunnel[screen];
+
+ sa->window = MI_WINDOW(mi);
+ if ((sa->glx_context = init_GL(mi)) != NULL) {
+ reshape_atunnel(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ Init(mi);
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+
+}
+
+/* all sorts of nice cleanup code should go here! */
+ENTRYPOINT void free_atunnel(ModeInfo * mi)
+{
+#if 0
+ atunnelstruct *sa = &Atunnel[MI_SCREEN(mi)];
+ FreeTunnel(sa->ts);
+#endif
+}
+
+XSCREENSAVER_MODULE ("Atunnel", atunnel)
+
+#endif
diff --git a/hacks/glx/atunnel.man b/hacks/glx/atunnel.man
new file mode 100644
index 0000000..dc19582
--- /dev/null
+++ b/hacks/glx/atunnel.man
@@ -0,0 +1,83 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "12-Feb-03" "X Version 11"
+.SH NAME
+atunnel - hypnotic GL tunnel journey
+.SH SYNOPSIS
+.B sballs
+[\-display \fIhost:display.screen\fP] [\-window] [\-root]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP]
+[\-light] [\-no-light]
+[\-wire] [\-no-wire]
+[\-texture] [\-no-texture]
+[\-fps]
+.SH DESCRIPTION
+The \fIatunnel\fP program draws an animation of a journey in a GL tunnel.
+.SH OPTIONS
+.I sballs
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-texture
+Show a textured tunnel. This is the default.
+.TP 8
+.B \-no\-texture
+Disables texturing the animation.
+.TP 8
+.B \-wire
+Draw a wireframe rendition of the tunnel.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Eric Lassauge.
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+
+The original code for this mode was written by
+Roman Podobedov <romka@ut.ee>
+and can be found at http://romka.demonews.com
+
+.SH AUTHOR
+Roman Podobedov <romka@ut.ee>
+Eric Lassauge <lassauge@users.sourceforge.net>
diff --git a/hacks/glx/b_draw.c b/hacks/glx/b_draw.c
new file mode 100644
index 0000000..977efbe
--- /dev/null
+++ b/hacks/glx/b_draw.c
@@ -0,0 +1,239 @@
+#if 0
+static const char sccsid[] = "@(#)b_draw.c 4.11 98/06/16 xlockmore";
+#endif
+
+/*-
+ * BUBBLE3D (C) 1998 Richard W.M. Jones.
+ * b_draw.c: This code creates new bubbles, manages them and controls
+ * them as they are drawn on the screen.
+ */
+
+#include "bubble3d.h"
+
+typedef struct draw_context {
+ /* The list of bubbles currently on the screen. */
+ void **bubble_list;
+ int nr_bubbles;
+
+ /* When was the last time we created a new bubble? */
+ int bubble_count;
+
+ glb_data *d;
+
+} draw_context;
+
+void *
+glb_draw_init(void)
+{
+ draw_context *c;
+
+ GLfloat mat_specular[] =
+ {1, 1, 1, 1};
+ GLfloat mat_emission[] =
+ {0, 0, 0, 1};
+ GLfloat mat_shininess[] =
+ {100};
+ GLfloat ambient[] =
+ {0.5, 0.5, 0.5, 1.0};
+ GLfloat light_position[][4] =
+ {
+ {0, -1, 0, 0},
+ {1, 1, 0, 0},
+ {-1, 0, 1, 0}};
+ GLfloat light_diffuse[][4] =
+ {
+ {1, 1, 1, 1},
+ {1, 1, 1, 1},
+ {1, 1, 1, 1}};
+ GLfloat light_specular[][4] =
+ {
+ {1, 1, 1, 1},
+ {1, 1, 1, 1},
+ {1, 1, 1, 1}};
+
+ /* Initialize the context. */
+ c = (struct draw_context *) malloc(sizeof (struct draw_context));
+
+ if (c == 0)
+ return 0;
+ c->bubble_list = 0;
+ c->nr_bubbles = 0;
+ c->bubble_count = glb_config.create_bubbles_every;
+
+ /* Do some GL initialization. */
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, glb_config.bubble_colour);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, mat_emission);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
+
+ if (glb_config.transparent_p)
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ glEnable(GL_LIGHT2);
+
+ if (glb_config.transparent_p)
+ glEnable(GL_BLEND);
+ else
+ glEnable(GL_DEPTH_TEST);
+
+ glEnable(GL_AUTO_NORMAL);
+ glEnable(GL_NORMALIZE);
+
+ if (glb_config.transparent_p)
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
+
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_POSITION, light_position[0]);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse[0]);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular[0]);
+ glLightfv(GL_LIGHT1, GL_POSITION, light_position[1]);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse[1]);
+ glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular[1]);
+ glLightfv(GL_LIGHT2, GL_POSITION, light_position[2]);
+ glLightfv(GL_LIGHT2, GL_DIFFUSE, light_diffuse[2]);
+ glLightfv(GL_LIGHT2, GL_SPECULAR, light_specular[2]);
+
+ c->d = glb_sphere_init();
+
+ return c;
+}
+
+static void
+delete_bubble(draw_context * c, int j)
+{
+ int i;
+
+ glb_bubble_delete(c->bubble_list[j]);
+
+ for (i = j; i < c->nr_bubbles - 1; ++i)
+ c->bubble_list[i] = c->bubble_list[i + 1];
+
+ c->nr_bubbles--;
+}
+
+void
+glb_draw_end(void *cc)
+{
+ draw_context *c = (draw_context *) cc;
+ int i;
+
+ for (i = 0; i < c->nr_bubbles; ++i) {
+ delete_bubble(c, i);
+ i--;
+ }
+
+ glb_sphere_end (c->d);
+
+ (void) free((void *) c->bubble_list);
+ (void) free((void *) c);
+}
+
+static int
+create_new_bubbles(draw_context * c)
+{
+ int n, i;
+ double r = glb_drand();
+ GLfloat size, speed, scale_incr, x, y, z;
+ void *b[4];
+ void **old_bubble_list;
+
+ /* How many bubbles to make? */
+ if (r < glb_config.p_bubble_group[0])
+ n = 1;
+ else if (r < glb_config.p_bubble_group[1])
+ n = 2;
+ else if (r < glb_config.p_bubble_group[2])
+ n = 3;
+ else
+ n = 4;
+
+ /* Initial position of top-most bubble in group. */
+ x = glb_drand() * 4 - 2;
+ y = glb_config.screen_bottom;
+ z = glb_drand() * 2 - 2;
+
+ /* What size? */
+ size = glb_config.min_size
+ + glb_drand() * (glb_config.max_size - glb_config.min_size);
+
+ /* What speed? */
+ speed = glb_config.min_speed
+ + glb_drand() * (glb_config.max_speed - glb_config.min_speed);
+
+ /* Work out the scaling increment. Bubbles should increase by scale_factor
+ * as they go from bottom to top of screen.
+ */
+ scale_incr = (size * glb_config.scale_factor - size)
+ / ((glb_config.screen_top - glb_config.screen_bottom) / speed);
+
+ /* Create the bubble(s). */
+ for (i = 0; i < n; ++i) {
+ if ((b[i] = glb_bubble_new(c->d, x, y, z, size, speed, scale_incr)) == 0) {
+ /* Out of memory - recover. */
+ i--;
+ while (i >= 0)
+ glb_bubble_delete(b[i]);
+ return 0;
+ }
+ /* Create the next bubble below the last bubble. */
+ y -= size * 3;
+ }
+
+ /* Add the bubbles to the list. */
+ c->nr_bubbles += n;
+ old_bubble_list = c->bubble_list;
+ if (c->bubble_list == 0) {
+ c->bubble_list = (void **) malloc(c->nr_bubbles * sizeof (void *));
+ } else {
+ c->bubble_list = (void **) realloc(c->bubble_list,
+ c->nr_bubbles * sizeof (void *));
+ }
+
+ if (c->bubble_list == 0) {
+ /* Out of memory - recover. */
+ for (i = 0; i < n; ++i)
+ glb_bubble_delete(b[i]);
+ c->bubble_list = old_bubble_list;
+ c->nr_bubbles -= n;
+ return 0;
+ }
+ for (i = 0; i < n; ++i)
+ c->bubble_list[c->nr_bubbles - i - 1] = b[i];
+
+ return 1;
+}
+
+void
+glb_draw_step(void *cc)
+{
+ draw_context *c = (draw_context *) cc;
+ int i;
+
+ /* Consider creating a new bubble or bubbles. */
+ if (c->nr_bubbles < glb_config.max_bubbles &&
+ c->bubble_count++ > glb_config.create_bubbles_every) {
+ if (create_new_bubbles(c))
+ c->bubble_count = 0;
+ }
+ /* Clear the display. */
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /* XXX Draw the background here ... */
+
+ /* Draw all the bubbles on the display. */
+ for (i = 0; i < c->nr_bubbles; ++i) {
+ void *b = c->bubble_list[i];
+
+ glb_bubble_step(b);
+ glb_bubble_draw(c->d, b);
+
+ /* Has the bubble reached the top of the screen? */
+ if (glb_bubble_get_y(b) >= glb_config.screen_top) {
+ delete_bubble(c, i);
+ i--;
+ }
+ }
+}
diff --git a/hacks/glx/b_lockglue.c b/hacks/glx/b_lockglue.c
new file mode 100644
index 0000000..1bb1e67
--- /dev/null
+++ b/hacks/glx/b_lockglue.c
@@ -0,0 +1,240 @@
+#if 0
+static const char sccsid[] = "@(#)b_lockglue.c 4.11 98/06/16 xlockmore";
+#endif
+
+/*-
+ * BUBBLE3D (C) 1998 Richard W.M. Jones.
+ * b_lockglue.c: Glue to make this all work with xlockmore.
+ */
+
+#include "bubble3d.h"
+
+/* XXX This lot should eventually be made configurable using the
+ * options stuff below.
+ */
+struct glb_config glb_config =
+{
+ 0, /* transparent_p */
+#if GLB_SLOW_GL
+ 2, /* subdivision_depth */
+#else
+ 3, /* subdivision_depth */
+#endif
+ 5, /* nr_nudge_axes */
+ 0.01, /* nudge_angle_factor */
+ 0.20, /* nudge_factor */
+ 0.1, /* rotation_factor */
+ 8, /* create_bubbles_every */
+ 8, /* max_bubbles */
+ {0.7, 0.8, 0.9, 1.0}, /* p_bubble_group */
+ 0.5, /* max_size */
+ 0.1, /* min_size */
+ 0.03, /* max_speed */
+ 0.005, /* min_speed */
+ 1.5, /* scale_factor */
+ -4, /* screen_bottom */
+ 4, /* screen_top */
+ {0.0, 0.0, 0.7, 0.3} /* bubble_colour */
+};
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 10000 \n" \
+ "*showFPS: False \n"
+
+# define release_bubble3d 0
+# define bubble3d_handle_event xlockmore_no_events
+#include "xlockmore.h"
+#else
+#include "xlock.h"
+#include "vis.h"
+#endif
+
+#ifdef USE_GL
+
+
+#define DEF_TRANSPARENT "True"
+#define DEF_BUBBLECOLOR "random"
+
+static Bool transparent_p;
+static char *bubble_color_str;
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+static XrmOptionDescRec opts[] = {
+ { "-transparent", ".transparent", XrmoptionNoArg, "True" },
+ { "+transparent", ".transparent", XrmoptionNoArg, "False" },
+ { "-color", ".bubblecolor", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&transparent_p, "transparent", "Transparent", DEF_TRANSPARENT, t_Bool},
+ {&bubble_color_str, "bubblecolor", "BubbleColor", DEF_BUBBLECOLOR, t_String},
+};
+
+ENTRYPOINT ModeSpecOpt bubble3d_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct bubbles3d_description =
+{"bubbles3d",
+ "init_bubble3d",
+ "draw_bubble3d",
+ NULL,
+ "change_bubble3d",
+ "init_bubble3d",
+ "free_bubble3d",
+ &bubble3d_opts,
+ 1000, 1, 2, 1, 64, 1.0, "",
+ "Richard Jones's GL bubbles",
+ 0,
+ NULL
+};
+
+#endif /* USE_MODULES */
+
+struct context {
+ GLXContext *glx_context;
+ void *draw_context;
+};
+
+static struct context *contexts = 0;
+
+static void
+parse_color (ModeInfo *mi, const char *name, const char *s, GLfloat *a)
+{
+ XColor c;
+
+ if (! XParseColor (MI_DISPLAY(mi), MI_COLORMAP(mi), s, &c))
+ {
+ fprintf (stderr, "%s: can't parse %s color %s", progname, name, s);
+ exit (1);
+ }
+ a[0] = c.red / 65536.0;
+ a[1] = c.green / 65536.0;
+ a[2] = c.blue / 65536.0;
+}
+
+static void
+init_colors(ModeInfo *mi)
+{
+ if (strncasecmp(bubble_color_str, "auto", strlen("auto")) == 0) {
+ glb_config.bubble_colour[0] = ((float) (NRAND(100)) / 100.0);
+ glb_config.bubble_colour[1] = ((float) (NRAND(100)) / 100.0);
+ /* I keep more blue */
+ glb_config.bubble_colour[2] = ((float) (NRAND(50)) / 100.0) + 0.50;
+ } else if (strncasecmp(bubble_color_str, "random", strlen("random")) == 0) {
+ glb_config.bubble_colour[0] = -1.0;
+ } else {
+ parse_color(mi, "bubble", bubble_color_str, glb_config.bubble_colour);
+ }
+}
+
+static void
+init(struct context *c)
+{
+ glb_config.transparent_p = transparent_p;
+ glb_sphere_init();
+ c->draw_context = glb_draw_init();
+}
+
+ENTRYPOINT void
+reshape_bubble3d(ModeInfo *mi, int width, int height)
+{
+ double h = (GLfloat) height / (GLfloat) width;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ h = height / (GLfloat) width;
+ }
+ glViewport(0, 0, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(45, 1/h, 3, 8);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0, 0, -5);
+}
+
+static void
+do_display(struct context *c)
+{
+ glb_draw_step(c->draw_context);
+}
+
+ENTRYPOINT void
+init_bubble3d(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int screen = MI_SCREEN(mi);
+ struct context *c;
+
+ MI_INIT (mi, contexts);
+ c = &contexts[screen];
+ c->glx_context = init_GL(mi);
+ init_colors(mi);
+ if (c->glx_context != 0) {
+ init(c);
+ reshape_bubble3d(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ do_display(c);
+ glFinish();
+ glXSwapBuffers(display, window);
+ } else
+ MI_CLEARWINDOW(mi);
+}
+
+ENTRYPOINT void
+draw_bubble3d(ModeInfo * mi)
+{
+ struct context *c = &contexts[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ MI_IS_DRAWN(mi) = True;
+
+ if (!c->glx_context)
+ return;
+
+ glXMakeCurrent(display, window, *(c->glx_context));
+
+ glb_config.polygon_count = 0;
+ glPushMatrix();
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ glRotatef(o, 0, 0, 1);
+ }
+# endif
+
+ do_display(c);
+ glPopMatrix();
+ mi->polygon_count = glb_config.polygon_count;
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers(display, window);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+change_bubble3d(ModeInfo * mi)
+{
+ /* nothing */
+}
+#endif /* !STANDALONE */
+
+ENTRYPOINT void
+free_bubble3d(ModeInfo * mi)
+{
+ struct context *c = &contexts[MI_SCREEN(mi)];
+ if (c->draw_context)
+ glb_draw_end(c->draw_context);
+}
+
+XSCREENSAVER_MODULE ("Bubble3D", bubble3d)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/b_sphere.c b/hacks/glx/b_sphere.c
new file mode 100644
index 0000000..78be392
--- /dev/null
+++ b/hacks/glx/b_sphere.c
@@ -0,0 +1,219 @@
+#if 0
+static const char sccsid[] = "@(#)b_sphere.c 4.11 98/06/16 xlockmore";
+#endif
+
+/*-
+ * BUBBLE3D (C) 1998 Richard W.M. Jones.
+ * b_sphere.c: Create a list of vertices and triangles in a
+ * normalized sphere, which is then later used as the basic shape
+ * for all bubbles. This code is run once when the program starts
+ * up.
+ */
+
+#include "bubble3d.h"
+
+typedef glb_vertex vertex;
+typedef glb_triangle triangle;
+
+struct glb_data {
+
+ /* The list of vertices created. */
+ vertex *vertices;
+ int nr_vertices, nr_vertices_allocated;
+
+ /* The list of triangles created. */
+ triangle *triangles;
+ int nr_triangles, nr_triangles_allocated;
+};
+
+
+#define EPSILON GLB_VERTICES_EPSILON
+
+/* Should be taken care of already... but just in case */
+#if !defined( __GNUC__ ) && !defined(__cplusplus) && !defined(c_plusplus)
+#undef inline
+#define inline /* */
+#endif
+static inline int
+close_enough(const GLfloat * v1, const GLfloat * v2)
+{
+ return fabs((double) (v1[0] - v2[0])) <= EPSILON &&
+ fabs((double) (v1[1] - v2[1])) <= EPSILON &&
+ fabs((double) (v1[2] - v2[2])) <= EPSILON;
+}
+
+#define INCR(n) ((n == 0) ? (n = 1) : (n *= 2))
+#define INCR_ALLOCATION(a, n, t) (a = (t *) realloc (a, INCR (n) * sizeof (t)))
+
+static inline GLuint
+save_vertex(glb_data *d, const GLfloat * v)
+{
+ int i;
+
+ /* Inefficient, but we only do this a few times. Check to see if there's
+ * an existing vertex which is `close enough' to this one.
+ */
+ for (i = 0; i < d->nr_vertices; ++i)
+ if (close_enough(v, d->vertices[i]))
+ return i;
+
+ if (d->nr_vertices_allocated <= d->nr_vertices) {
+ if (d->vertices == 0) {
+ d->vertices = (vertex *) malloc(INCR(d->nr_vertices_allocated) * sizeof (vertex));
+ } else {
+ INCR_ALLOCATION(d->vertices, d->nr_vertices_allocated, vertex);
+ }
+ }
+ d->vertices[d->nr_vertices][0] = v[0];
+ d->vertices[d->nr_vertices][1] = v[1];
+ d->vertices[d->nr_vertices][2] = v[2];
+ return d->nr_vertices++;
+}
+
+static inline GLuint
+save_triangle(glb_data *d, GLuint v1, GLuint v2, GLuint v3)
+{
+ if (d->nr_triangles_allocated <= d->nr_triangles) {
+ if (d->triangles == 0) {
+ d->triangles = (triangle *) malloc(INCR(d->nr_triangles_allocated) * sizeof (triangle));
+ } else {
+ INCR_ALLOCATION(d->triangles, d->nr_triangles_allocated, triangle);
+ }
+ }
+ d->triangles[d->nr_triangles][0] = v1;
+ d->triangles[d->nr_triangles][1] = v2;
+ d->triangles[d->nr_triangles][2] = v3;
+ return d->nr_triangles++;
+}
+
+static inline void
+normalize(GLfloat v[3])
+{
+ GLfloat d = (GLfloat) sqrt((double) (v[0] * v[0] + v[1] * v[1] + v[2] * v[2]));
+
+ if (d != 0) {
+ v[0] /= d;
+ v[1] /= d;
+ v[2] /= d;
+ } else {
+ v[0] = v[1] = v[2] = 0;
+ }
+}
+
+static void
+subdivide(glb_data *d,
+ const GLfloat * v1, GLuint vi1,
+ const GLfloat * v2, GLuint vi2,
+ const GLfloat * v3, GLuint vi3,
+ int depth)
+{
+ int i;
+
+ if (depth == 0) {
+ save_triangle(d, vi1, vi2, vi3);
+ } else {
+ GLuint vi12, vi23, vi31;
+ GLfloat v12[3], v23[3], v31[3];
+
+ for (i = 0; i < 3; ++i) {
+ v12[i] = v1[i] + v2[i];
+ v23[i] = v2[i] + v3[i];
+ v31[i] = v3[i] + v1[i];
+ }
+ normalize(v12);
+ vi12 = save_vertex(d, v12);
+ normalize(v23);
+ vi23 = save_vertex(d, v23);
+ normalize(v31);
+ vi31 = save_vertex(d, v31);
+ subdivide(d, v1, vi1, v12, vi12, v31, vi31, depth - 1);
+ subdivide(d, v2, vi2, v23, vi23, v12, vi12, depth - 1);
+ subdivide(d, v3, vi3, v31, vi31, v23, vi23, depth - 1);
+ subdivide(d, v12, vi12, v23, vi23, v31, vi31, depth - 1);
+ }
+}
+
+#define ICO_X 0.525731112119133606
+#define ICO_Z 0.850650808352039932
+
+static const GLfloat vdata[12][3] =
+{
+ {-ICO_X, 0, ICO_Z},
+ {ICO_X, 0, ICO_Z},
+ {-ICO_X, 0, -ICO_Z},
+ {ICO_X, 0, -ICO_Z},
+ {0, ICO_Z, ICO_X},
+ {0, ICO_Z, -ICO_X},
+ {0, -ICO_Z, ICO_X},
+ {0, -ICO_Z, -ICO_X},
+ {ICO_Z, ICO_X, 0},
+ {-ICO_Z, ICO_X, 0},
+ {ICO_Z, -ICO_X, 0},
+ {-ICO_Z, -ICO_X, 0}
+};
+
+static const GLuint tindices[20][3] =
+{
+ {0, 4, 1},
+ {0, 9, 4},
+ {9, 5, 4},
+ {4, 5, 8},
+ {4, 8, 1},
+ {8, 10, 1},
+ {8, 3, 10},
+ {5, 3, 8},
+ {5, 2, 3},
+ {2, 7, 3},
+ {7, 10, 3},
+ {7, 6, 10},
+ {7, 11, 6},
+ {11, 0, 6},
+ {0, 1, 6},
+ {6, 1, 10},
+ {9, 0, 11},
+ {9, 11, 2},
+ {9, 2, 5},
+ {7, 2, 11}
+};
+
+/* Public interface: Create the sphere. */
+glb_data *
+glb_sphere_init(void)
+{
+ glb_data *d = (glb_data *) calloc (1, sizeof (*d));
+ int i;
+
+ for (i = 0; i < 20; ++i) {
+ subdivide(d, vdata[tindices[i][0]], save_vertex(d, vdata[tindices[i][0]]),
+ vdata[tindices[i][1]], save_vertex(d, vdata[tindices[i][1]]),
+ vdata[tindices[i][2]], save_vertex(d, vdata[tindices[i][2]]),
+ glb_config.subdivision_depth);
+ }
+
+ return d;
+}
+
+/* Return the vertices list. */
+glb_vertex *
+glb_sphere_get_vertices(glb_data *d, int *nr_vertices_ptr)
+{
+ *nr_vertices_ptr = d->nr_vertices;
+ return d->vertices;
+}
+
+/* Return the triangles list. */
+glb_triangle *
+glb_sphere_get_triangles(glb_data *d, int *nr_triangles_ptr)
+{
+ *nr_triangles_ptr = d->nr_triangles;
+ return d->triangles;
+}
+
+/* Free up memory. */
+void
+glb_sphere_end(glb_data *d)
+{
+ (void) free((void *) d->vertices);
+ (void) free((void *) d->triangles);
+ free (d);
+}
diff --git a/hacks/glx/blinkbox.c b/hacks/glx/blinkbox.c
new file mode 100644
index 0000000..f777371
--- /dev/null
+++ b/hacks/glx/blinkbox.c
@@ -0,0 +1,608 @@
+/* blinkbox, Copyright (c) 2003 Jeremy English <jenglish@myself.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* motion blur added March 2005 by John Boero <jlboero@cs.uwm.edu>
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_ball 0
+# define release_ball 0
+# define ball_handle_event xlockmore_no_events
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "sphere.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define MAX_COUNT 20
+#define ALPHA_AMT 0.05
+
+/* this should be between 1 and 8 */
+#define DEF_BOXSIZE "2"
+#define DEF_DISSOLVE "False"
+#define DEF_FADE "True"
+#define DEF_BLUR "True"
+
+
+typedef struct{
+ GLfloat x,y,z;
+} Tdpos;
+
+typedef struct{
+ int hit;
+ Tdpos pos;
+ int counter;
+ GLfloat color[3];
+ GLfloat rot[4];
+ int des_count;
+ int alpha_count;
+}Side;
+
+struct Bounding_box {
+ Tdpos top;
+ Tdpos bottom;
+};
+
+struct Ball {
+ GLfloat x;
+ GLfloat y;
+ GLfloat z;
+ int d;
+};
+
+struct bscale {
+ GLfloat wh; /*width Height*/
+ GLfloat d; /*depth*/
+};
+
+static const struct Bounding_box bbox = {{14,14,20},{-14,-14,-20}};
+
+typedef struct {
+ GLXContext *glx_context;
+
+ struct Ball ball;
+
+ struct bscale bscale;
+
+ Tdpos mo; /*motion*/
+ Tdpos moh; /*hold motion value*/
+
+ Tdpos bpos;
+
+ GLuint ballList;
+ GLuint boxList;
+ GLfloat des_amt;
+
+ /*sides*/
+ Side lside;/*Red*/
+ Side rside;/*Green*/
+ Side tside;/*Blue*/
+ Side bside;/*Orange*/
+ Side fside;/*Yellow*/
+ Side aside;/*Purple*/
+ Side *sp;
+
+} blinkboxstruct;
+
+static blinkboxstruct *blinkbox = (blinkboxstruct *) NULL;
+
+
+/* lights */
+static const float LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };
+static const float LightPosition[]= { 20.0f, 100.0f, 20.0f, 1.0f };
+
+static Bool do_dissolve;
+static Bool do_fade;
+static Bool do_blur;
+static float bscale_wh;
+
+static XrmOptionDescRec opts[] = {
+ { "-boxsize", ".boxsize", XrmoptionSepArg, 0 },
+ { "-dissolve", ".dissolve", XrmoptionNoArg, "True" },
+ { "+dissolve", ".dissolve", XrmoptionNoArg, "False" },
+ { "-fade", ".fade", XrmoptionNoArg, "True" },
+ { "+fade", ".fade", XrmoptionNoArg, "False" },
+ { "-blur", ".blur", XrmoptionNoArg, "True" },
+ { "+blur", ".blur", XrmoptionNoArg, "False" }
+
+};
+
+static argtype vars[] = {
+ {&bscale_wh, "boxsize", "Boxsize", DEF_BOXSIZE, t_Float},
+ {&do_dissolve, "dissolve", "Dissolve", DEF_DISSOLVE, t_Bool},
+ {&do_fade, "fade", "Fade", DEF_FADE, t_Bool},
+ {&do_blur, "blur", "Blur", DEF_BLUR, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt ball_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+static void
+swap(GLfloat *a, GLfloat *b)
+{
+ GLfloat t = *a;
+ *a = *b;
+ *b = t;
+}
+
+static float
+get_rand(void)
+{
+ GLfloat j = 1+(random() % 2);
+ return (j);
+}
+
+static void
+swap_mov(GLfloat *a, GLfloat *b)
+{
+ int j;
+ swap(a,b);
+ j = get_rand();
+ if (*a < 0)
+ *a = j * -1;
+ else
+ *a = j;
+}
+
+static void
+cp_b_pos(blinkboxstruct *bp, Tdpos *s_pos)
+{
+ s_pos->x = bp->ball.x;
+ s_pos->y = bp->ball.y;
+ s_pos->z = bp->ball.z;
+}
+
+static void
+hit_side(blinkboxstruct *bp)
+{
+ if ((bp->ball.x - bp->ball.d) <= bbox.bottom.x){
+ bp->lside.hit = 1;
+ bp->lside.counter = MAX_COUNT;
+ bp->lside.des_count = 1;
+ bp->lside.alpha_count = 0;
+ cp_b_pos(bp, &bp->lside.pos);
+ swap_mov(&bp->mo.x,&bp->moh.x);
+ }else
+ if ((bp->ball.x + bp->ball.d) >= bbox.top.x){
+ bp->rside.hit = 1;
+ bp->rside.counter = MAX_COUNT;
+ bp->rside.des_count = 1;
+ bp->rside.alpha_count = 0;
+ cp_b_pos(bp, &bp->rside.pos);
+ swap_mov(&bp->mo.x,&bp->moh.x);
+ }
+}
+
+static void
+hit_top_bottom(blinkboxstruct *bp)
+{
+ if ((bp->ball.y - bp->ball.d) <= bbox.bottom.y){
+ bp->bside.hit = 1;
+ bp->bside.counter = MAX_COUNT;
+ bp->bside.des_count = 1;
+ bp->bside.alpha_count = 0;
+ cp_b_pos(bp, &bp->bside.pos);
+ swap_mov(&bp->mo.y,&bp->moh.y);
+ }else
+ if ((bp->ball.y + bp->ball.d) >= bbox.top.y){
+ bp->tside.hit = 1;
+ bp->tside.counter = MAX_COUNT;
+ bp->tside.des_count = 1;
+ bp->tside.alpha_count = 0;
+ cp_b_pos(bp, &bp->tside.pos);
+ swap_mov(&bp->mo.y,&bp->moh.y);
+ }
+}
+
+static void
+hit_front_back(blinkboxstruct *bp)
+{
+ if ((bp->ball.z - bp->ball.d) <= bbox.bottom.z){
+ bp->aside.hit = 1;
+ bp->aside.counter = MAX_COUNT;
+ bp->aside.des_count = 1;
+ bp->aside.alpha_count = 0;
+ cp_b_pos(bp, &bp->aside.pos);
+ swap_mov(&bp->mo.z,&bp->moh.z);
+ }else
+ if((bp->ball.z + bp->ball.d) >= bbox.top.z){
+ bp->fside.hit = 1;
+ bp->fside.counter = MAX_COUNT;
+ bp->fside.des_count = 1;
+ bp->fside.alpha_count = 0;
+ cp_b_pos(bp, &bp->fside.pos);
+ swap_mov(&bp->mo.z,&bp->moh.z);
+ }
+}
+
+ENTRYPOINT void
+reshape_ball (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 40.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 2.0, 10.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+}
+
+static void
+unit_cube(int wire)
+{
+ glBegin((wire)?GL_LINE_LOOP:GL_QUADS);
+ glNormal3f( 0.0f, -1.0f, 0.0f);
+ glVertex3f(-1.0f, -1.0f, -1.0f);
+ glVertex3f( 1.0f, -1.0f, -1.0f);
+ glVertex3f( 1.0f, -1.0f, 1.0f);
+ glVertex3f(-1.0f, -1.0f, 1.0f);
+ glNormal3f( 0.0f, 0.0f, 1.0f);
+ glVertex3f(-1.0f, -1.0f, 1.0f);
+ glVertex3f( 1.0f, -1.0f, 1.0f);
+ glVertex3f( 1.0f, 1.0f, 1.0f);
+ glVertex3f(-1.0f, 1.0f, 1.0f);
+ glNormal3f( 0.0f, 0.0f, -1.0f);
+ glVertex3f(-1.0f, -1.0f, -1.0f);
+ glVertex3f(-1.0f, 1.0f, -1.0f);
+ glVertex3f( 1.0f, 1.0f, -1.0f);
+ glVertex3f( 1.0f, -1.0f, -1.0f);
+ glNormal3f( 1.0f, 0.0f, 0.0f);
+ glVertex3f( 1.0f, -1.0f, -1.0f);
+ glVertex3f( 1.0f, 1.0f, -1.0f);
+ glVertex3f( 1.0f, 1.0f, 1.0f);
+ glVertex3f( 1.0f, -1.0f, 1.0f);
+ glNormal3f( -1.0f, 0.0f, 0.0f);
+ glVertex3f(-1.0f, -1.0f, -1.0f);
+ glVertex3f(-1.0f, -1.0f, 1.0f);
+ glVertex3f(-1.0f, 1.0f, 1.0f);
+ glVertex3f(-1.0f, 1.0f, -1.0f);
+ glNormal3f( 1.0f, 1.0f, 0.0f);
+ glVertex3f(-1.0f, 1.0f, -1.0f);
+ glVertex3f(-1.0f, 1.0f, 1.0f);
+ glVertex3f( 1.0f, 1.0f, 1.0f);
+ glVertex3f( 1.0f, 1.0f, -1.0f);
+ glEnd();
+}
+
+ENTRYPOINT void
+init_ball (ModeInfo *mi)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ blinkboxstruct *bp;
+
+ MI_INIT (mi, blinkbox);
+ bp = &blinkbox[MI_SCREEN(mi)];
+
+ if ((bp->glx_context = init_GL(mi)) != NULL) {
+ reshape_ball(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ }
+ else
+ MI_CLEARWINDOW(mi);
+
+ bp->ball.d = 1;
+ bp->bscale.wh = bscale_wh;
+ bp->bscale.d = 0.25;
+
+ bp->mo.x = 1;
+ bp->mo.y = 1;
+ bp->mo.z = 1;
+
+ bp->moh.x = -1.0;
+ bp->moh.y = -1.5;
+ bp->moh.z = -1.5;
+
+ bp->bpos.x = 1;
+ bp->bpos.y = 1;
+ bp->bpos.z = 1;
+
+ bp->des_amt = 1;
+
+ bp->lside.counter = MAX_COUNT;
+ bp->rside.counter = MAX_COUNT;
+ bp->tside.counter = MAX_COUNT;
+ bp->bside.counter = MAX_COUNT;
+ bp->fside.counter = MAX_COUNT;
+ bp->aside.counter = MAX_COUNT;
+
+ bp->lside.color[0] = 1;
+ bp->rside.color[1] = 1;
+ bp->tside.color[2] = 1;
+
+ bp->bside.color[0] = 1;
+ bp->bside.color[1] = 0.5;
+
+ bp->fside.color[0] = 1;
+ bp->fside.color[1] = 1;
+
+ bp->aside.color[0] = 0.5;
+ bp->aside.color[2] = 1;
+
+ bp->lside.rot[0] = 90;
+ bp->rside.rot[0] = 90;
+ bp->tside.rot[0] = 90;
+ bp->bside.rot[0] = 90;
+ bp->fside.rot[0] = 90;
+ bp->aside.rot[0] = 90;
+
+ bp->lside.rot[2] = 1;
+ bp->rside.rot[2] = 1;
+ bp->tside.rot[1] = 1;
+ bp->bside.rot[1] = 1;
+ bp->fside.rot[3] = 1;
+ bp->aside.rot[3] = 1;
+
+ bp->lside.des_count = 1;
+ bp->rside.des_count = 1;
+ bp->tside.des_count = 1;
+ bp->bside.des_count = 1;
+ bp->fside.des_count = 1;
+ bp->aside.des_count = 1;
+
+ bp->lside.alpha_count = 1;
+ bp->rside.alpha_count = 1;
+ bp->tside.alpha_count = 1;
+ bp->bside.alpha_count = 1;
+ bp->fside.alpha_count = 1;
+ bp->aside.alpha_count = 1;
+
+
+#define SPHERE_SLICES 12 /* how densely to render spheres */
+#define SPHERE_STACKS 16
+
+ bp->sp = malloc(sizeof(*bp->sp));
+ if(bp->sp == NULL){
+ fprintf(stderr,"Could not allocate memory\n");
+ exit(1);
+ }
+ if( (bp->bscale.wh < 1) ||
+ (bp->bscale.wh > 8) ) {
+ fprintf(stderr,"Boxsize out of range. Using default\n");
+ bp->bscale.wh = 2;
+ }
+ if (do_dissolve){
+ bp->des_amt = bp->bscale.wh / MAX_COUNT;
+ }
+
+ reshape_ball(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ bp->ballList = glGenLists(1);
+ glNewList(bp->ballList, GL_COMPILE);
+ unit_sphere (SPHERE_STACKS, SPHERE_SLICES, wire);
+ glEndList ();
+
+ bp->boxList = glGenLists(1);
+ glNewList(bp->boxList, GL_COMPILE);
+ unit_cube(wire);
+ glEndList();
+
+ if (wire) return;
+
+ glEnable(GL_COLOR_MATERIAL);
+ glShadeModel(GL_SMOOTH);
+ glClearDepth(1.0f);
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LEQUAL);
+ glEnable(GL_LIGHTING);
+ glClearDepth(1);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
+ glLightfv(GL_LIGHT1, GL_POSITION,LightPosition);
+ glEnable(GL_LIGHT1);
+ if (do_fade || do_blur) {
+ glEnable(GL_BLEND);
+ glDisable(GL_DEPTH_TEST);
+ }
+}
+
+static void
+CheckBoxPos(blinkboxstruct *bp,
+ GLfloat bot_x, GLfloat top_x, GLfloat bot_y, GLfloat top_y)
+{
+ /*Make sure it's inside of the bounding box*/
+ bp->bpos.x = ((bp->bpos.x - bp->bscale.wh) < bot_x) ? bot_x + bp->bscale.wh : bp->bpos.x;
+ bp->bpos.x = ((bp->bpos.x + bp->bscale.wh) > top_x) ? top_x - bp->bscale.wh : bp->bpos.x;
+ bp->bpos.y = ((bp->bpos.y - bp->bscale.wh) < bot_y) ? bot_y + bp->bscale.wh : bp->bpos.y;
+ bp->bpos.y = ((bp->bpos.y + bp->bscale.wh) > top_y) ? top_y - bp->bscale.wh : bp->bpos.y;
+}
+
+ENTRYPOINT void
+draw_ball (ModeInfo *mi)
+{
+ blinkboxstruct *bp = &blinkbox[MI_SCREEN(mi)];
+
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i = 0;
+
+ if (! bp->glx_context)
+ return;
+ mi->polygon_count = 0;
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ hit_top_bottom(bp);
+ hit_front_back(bp);
+ hit_side(bp);
+
+ glRotated(0.25,0,0,1);
+ glRotated(0.25,0,1,0);
+ glRotated(0.25,1,0,0);
+
+
+ glPushMatrix();
+ glScalef(0.5,0.5,0.5);
+
+ glColor3f(1,1,1);
+ glPushMatrix();
+
+ if (!do_blur || MI_IS_WIREFRAME(mi)) {
+ glTranslatef(bp->ball.x += bp->mo.x,
+ bp->ball.y += bp->mo.y,
+ bp->ball.z += bp->mo.z);
+
+ glScalef(2,2,2);
+ glCallList(bp->ballList);
+ mi->polygon_count += SPHERE_SLICES*SPHERE_STACKS;
+
+ } else {
+
+# define blur_detail 24.0
+ float ball_alpha = 1 / blur_detail;
+
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ glTranslatef(bp->ball.x, bp->ball.y, bp->ball.z);
+
+ for (i = 0; i < blur_detail; ++i) {
+ glTranslatef(bp->mo.x / blur_detail,
+ bp->mo.y / blur_detail,
+ bp->mo.z / blur_detail);
+
+ /* comment the following line for quick but boring linear blur */
+ ball_alpha = sin((M_PI / blur_detail) * i) / blur_detail;
+
+ glColor4f(1, 1, 1, ball_alpha);
+
+ glScalef(2, 2, 2);
+ glCallList(bp->ballList);
+ mi->polygon_count += SPHERE_SLICES*SPHERE_STACKS;
+ glScalef(.5, .5, .5);
+ }
+ i = 0;
+
+ bp->ball.x += bp->mo.x;
+ bp->ball.y += bp->mo.y;
+ bp->ball.z += bp->mo.z;
+ }
+
+ glPopMatrix();
+
+ while(i < 6){
+ switch(i){
+ case 0:{
+ bp->sp = &bp->lside;
+ bp->bpos.x = bp->lside.pos.z*-1;
+ bp->bpos.y = bp->lside.pos.y;
+ bp->bpos.z = bbox.bottom.x - bp->bscale.d;
+ if (bp->sp->hit)
+ CheckBoxPos(bp, bbox.bottom.z,bbox.top.z,bbox.bottom.y,bbox.top.y);
+ break;
+ }
+ case 1:{
+ bp->sp = &bp->rside;
+ bp->bpos.x = bp->rside.pos.z*-1;
+ bp->bpos.y = bp->rside.pos.y;
+ bp->bpos.z = bbox.top.x + bp->bscale.d;
+ if (bp->sp->hit)
+ CheckBoxPos(bp, bbox.bottom.z,bbox.top.z,bbox.bottom.y,bbox.top.y);
+ break;
+ }
+ case 2:{
+ bp->sp = &bp->tside;
+ bp->bpos.x = bp->tside.pos.x;
+ bp->bpos.y = bp->tside.pos.z;
+ bp->bpos.z = bbox.bottom.y - bp->bscale.d;
+ if (bp->sp->hit)
+ CheckBoxPos(bp, bbox.bottom.x,bbox.top.x,bbox.bottom.z,bbox.top.z);
+ break;
+ }
+ case 3:{
+ bp->sp = &bp->bside;
+ bp->bpos.x = bp->bside.pos.x;
+ bp->bpos.y = bp->bside.pos.z;
+ bp->bpos.z = bbox.top.y + bp->bscale.d;
+ if (bp->sp->hit)
+ CheckBoxPos(bp, bbox.bottom.x,bbox.top.x,bbox.bottom.z,bbox.top.z);
+ break;
+ }
+ case 4:{
+ bp->sp = &bp->fside;
+ bp->bpos.x = bp->fside.pos.y;
+ bp->bpos.y = bp->fside.pos.x*-1;
+ bp->bpos.z = bbox.top.z + bp->bscale.d;
+ if (bp->sp->hit)
+ CheckBoxPos(bp, bbox.bottom.y,bbox.top.y,bbox.bottom.x,bbox.top.x);
+ break;
+ }
+ case 5:{
+ bp->sp = &bp->aside;
+ bp->bpos.x = bp->aside.pos.y;
+ bp->bpos.y = bp->aside.pos.x*-1;
+ bp->bpos.z = bbox.bottom.z + bp->bscale.d;
+ if (bp->sp->hit)
+ CheckBoxPos(bp, bbox.bottom.y,bbox.top.y,bbox.bottom.x,bbox.top.x);
+ break;
+ }
+ }
+ if(bp->sp->hit){
+ if(do_fade){
+ glColor4f(bp->sp->color[0],bp->sp->color[1],bp->sp->color[2],1-(ALPHA_AMT * bp->sp->alpha_count));
+ }else{
+ glColor3fv(bp->sp->color);
+ }
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ glPushMatrix();
+ glRotatef(bp->sp->rot[0],bp->sp->rot[1],bp->sp->rot[2],bp->sp->rot[3]);
+ glTranslatef(bp->bpos.x,bp->bpos.y,bp->bpos.z);
+ if (do_dissolve) {
+ glScalef(bp->bscale.wh-(bp->des_amt*bp->sp->des_count),bp->bscale.wh-(bp->des_amt*bp->sp->des_count),bp->bscale.d);
+ }else{
+ glScalef(bp->bscale.wh,bp->bscale.wh,bp->bscale.d);
+ }
+ glCallList(bp->boxList);
+ mi->polygon_count += 6;
+ glPopMatrix();
+ bp->sp->counter--;
+ bp->sp->des_count++;
+ bp->sp->alpha_count++;
+ if(!bp->sp->counter)
+ {
+ bp->sp->hit = 0;
+ }
+ }
+ i++;
+ }
+
+
+ glPopMatrix();
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers(dpy, window);
+
+}
+
+XSCREENSAVER_MODULE_2 ("BlinkBox", blinkbox, ball)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/blinkbox.man b/hacks/glx/blinkbox.man
new file mode 100644
index 0000000..0dc2a3f
--- /dev/null
+++ b/hacks/glx/blinkbox.man
@@ -0,0 +1,73 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+blinkbox \- shows a ball inside a box.
+.SH SYNOPSIS
+.B blinkbox
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-wireframe]
+[\-boxsize \fInumber\fP]
+[\-dissolve]
+[\-fade]
+[\-no\-blur]
+[\-fps]
+.SH DESCRIPTION
+Shows a ball contained inside of a bounding box. Colored blocks blink in
+when the ball hits the edges.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-boxsize
+Sets the size of the colored boxes. Should be between 1 and 8. Default: 2
+.TP 8
+.B \-dissolve | \-no-dissolve
+Boxes shrink instead of just vanishing.
+.TP 8
+.B \-fade | \-no-fade
+Boxes fade to transparency instead of just vanishing.
+.TP 8
+.B \-blur | \-no-blur
+Enable or disable motion blur on the ball. Default: blurry.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Jeremy English. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jeremy English. Motion blur by John Boero.
diff --git a/hacks/glx/blocktube.c b/hacks/glx/blocktube.c
new file mode 100644
index 0000000..d4a402e
--- /dev/null
+++ b/hacks/glx/blocktube.c
@@ -0,0 +1,457 @@
+/* blocktube, Copyright (c) 2003 Lars Damerow <lars@oddment.org>
+ *
+ * Based on Jamie Zawinski's original dangerball code.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEBUG 1
+
+#define DEFAULTS "*delay: 40000 \n" \
+ "*wireframe: False \n" \
+ "*showFPS: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define release_blocktube 0
+# define blocktube_handle_event xlockmore_no_events
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include <math.h>
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_HOLDTIME "1000"
+#define DEF_CHANGETIME "200"
+#define MAX_ENTITIES 1000
+#define DEF_TEXTURE "True"
+#define DEF_FOG "True"
+
+#if defined(USE_XPM) || defined(USE_XPMINC) || defined(STANDALONE)
+/* USE_XPM & USE_XPMINC in xlock mode ; HAVE_XPM in xscreensaver mode */
+#include "ximage-loader.h"
+#define I_HAVE_XPM
+
+#include "images/gen/blocktube_png.h"
+#endif /* HAVE_XPM */
+
+typedef struct {
+ int id, r, g, b;
+ GLfloat tVal;
+ int age;
+ int lifetime;
+ GLfloat position[3];
+ GLfloat angle;
+ GLfloat angularVelocity;
+} entity;
+
+typedef struct {
+ GLXContext *glx_context;
+ GLuint block_dlist;
+ int nextID;
+
+ entity entities[MAX_ENTITIES];
+ float targetR, targetG, targetB,
+ currentR, currentG, currentB,
+ deltaR, deltaG, deltaB;
+ int counter;
+ int changing;
+ GLfloat zoom;
+ GLfloat tilt;
+ GLuint envTexture;
+ XImage *texti;
+
+ GLfloat tunnelLength;
+ GLfloat tunnelWidth;
+ int polys;
+
+} blocktube_configuration;
+
+static blocktube_configuration *lps = NULL;
+
+static GLint holdtime;
+static GLint changetime;
+static int do_texture;
+static int do_fog;
+
+static XrmOptionDescRec opts[] = {
+ { "-holdtime", ".holdtime", XrmoptionSepArg, 0 },
+ { "-changetime", ".changetime", XrmoptionSepArg, 0 },
+ {"-texture", ".texture", XrmoptionNoArg, "True" },
+ {"+texture", ".texture", XrmoptionNoArg, "False" },
+ {"-fog", ".fog", XrmoptionNoArg, "True" },
+ {"+fog", ".fog", XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+ {&holdtime, "holdtime", "Hold Time", DEF_HOLDTIME, t_Int},
+ {&changetime, "changetime", "Change Time", DEF_CHANGETIME, \
+ t_Int},
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ {&do_fog, "fog", "Fog", DEF_FOG, t_Bool},
+};
+
+static OptionStruct desc[] = {
+ {"-holdtime", "how long to stay on the same color"},
+ {"-changetime", "how long it takes to fade to a new color"},
+};
+
+ENTRYPOINT ModeSpecOpt blocktube_opts = {countof(opts), opts, countof(vars), vars, desc};
+
+#ifdef USE_MODULES
+ModStruct blocktube_description =
+ {"blocktube", "init_blocktube", "draw_blocktube", (char *)NULL,
+ "draw_blocktube", "init_blocktube", "free_blocktube", &blocktube_opts,
+ 40000, 30, 1, 1, 64, 1.0, "",
+ "A shifting tunnel of reflective blocks", 0, NULL};
+#endif /* USE_MODULES */
+
+#if defined( I_HAVE_XPM )
+static Bool LoadGLTextures(ModeInfo *mi)
+{
+ blocktube_configuration *lp = &lps[MI_SCREEN(mi)];
+ Bool status;
+
+ status = True;
+ glGenTextures(1, &lp->envTexture);
+ glBindTexture(GL_TEXTURE_2D, lp->envTexture);
+ lp->texti = image_data_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi),
+ blocktube_png, sizeof(blocktube_png));
+ if (!lp->texti) {
+ status = False;
+ } else {
+ glPixelStorei(GL_UNPACK_ALIGNMENT,1);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, lp->texti->width, lp->texti->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, lp->texti->data);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+# ifndef HAVE_JWZGLES /* #### Sphere maps unimplemented */
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+# endif
+ }
+ return status;
+}
+#endif
+
+static void newTargetColor(blocktube_configuration *lp)
+{
+ int luminance = 0;
+
+ while (luminance <= 150) {
+ lp->targetR = random() % 256;
+ lp->targetG = random() % 256;
+ lp->targetB = random() % 256;
+ lp->deltaR = (lp->targetR - lp->currentR) / changetime;
+ lp->deltaG = (lp->targetG - lp->currentG) / changetime;
+ lp->deltaB = (lp->targetB - lp->currentB) / changetime;
+ luminance = 0.3 * lp->targetR + 0.59 * lp->targetG + 0.11 * lp->targetB;
+ }
+}
+
+static void randomize_entity (blocktube_configuration *lp, entity *ent)
+{
+ ent->id = lp->nextID++;
+ ent->tVal = 1 - ((float)random() / RAND_MAX / 1.5);
+ ent->age = 0;
+ ent->lifetime = 100;
+ ent->angle = random() % 360;
+ ent->angularVelocity = 0.5-((float)(random()) / RAND_MAX);
+ ent->position[0] = (float)(random()) / RAND_MAX + lp->tunnelWidth;
+ ent->position[1] = (float)(random()) / RAND_MAX * 2;
+ ent->position[2] = -(float)(random()) / RAND_MAX * lp->tunnelLength;
+}
+
+static void entityTick(blocktube_configuration *lp, entity *ent)
+{
+ ent->angle += ent->angularVelocity;
+ ent->position[2] += 0.1;
+ if (ent->position[2] > lp->zoom) {
+ ent->position[2] = -lp->tunnelLength + ((float)(random()) / RAND_MAX) * 20;
+ }
+ ent->age += 0.1;
+}
+
+static void tick(blocktube_configuration *lp)
+{
+ lp->counter--;
+ if (!lp->counter) {
+ if (!lp->changing) {
+ newTargetColor(lp);
+ lp->counter = changetime;
+ } else {
+ lp->counter = holdtime;
+ }
+ lp->changing = (!lp->changing);
+ } else {
+ if (lp->changing) {
+ lp->currentR += lp->deltaR;
+ lp->currentG += lp->deltaG;
+ lp->currentB += lp->deltaB;
+ }
+ }
+}
+
+static int cube_vertices(float x, float y, float z, int wire);
+
+ENTRYPOINT void reshape_blocktube (ModeInfo *mi, int width, int height);
+
+ENTRYPOINT void init_blocktube (ModeInfo *mi)
+{
+ int loop;
+ GLfloat fogColor[4] = {0,0,0,1};
+ blocktube_configuration *lp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT(mi, lps);
+
+ lp = &lps[MI_SCREEN(mi)];
+ lp->glx_context = init_GL(mi);
+
+ lp->zoom = 30;
+ lp->tilt = 4.5;
+ lp->tunnelLength = 200;
+ lp->tunnelWidth = 5;
+
+ if (wire) {
+ do_fog = False;
+ do_texture = False;
+ glLineWidth(2);
+ }
+
+ lp->block_dlist = glGenLists (1);
+ glNewList (lp->block_dlist, GL_COMPILE);
+ lp->polys = cube_vertices(0.15, 1.2, 5.25, wire);
+ glEndList ();
+
+#if defined( I_HAVE_XPM )
+ if (do_texture) {
+ if (!LoadGLTextures(mi)) {
+ fprintf(stderr, "%s: can't load textures!\n", progname);
+ exit(1);
+ }
+ glEnable(GL_TEXTURE_2D);
+ }
+#endif
+
+ /* kick on the fog machine */
+ if (do_fog) {
+ glEnable(GL_FOG);
+ glFogi(GL_FOG_MODE, GL_LINEAR);
+ glHint(GL_FOG_HINT, GL_NICEST);
+ glFogf(GL_FOG_START, 0);
+ glFogf(GL_FOG_END, lp->tunnelLength/1.8);
+ glFogfv(GL_FOG_COLOR, fogColor);
+ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
+ }
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glClearDepth(1.0f);
+
+ if (!do_texture && !wire) {
+ /* If there is no texture, the boxes don't show up without a light.
+ Though I don't understand why all the blocks come out gray.
+ */
+ GLfloat pos[4] = {0.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ }
+
+ lp->counter = holdtime;
+ lp->currentR = random() % 256;
+ lp->currentG = random() % 256;
+ lp->currentB = random() % 256;
+ newTargetColor(lp);
+ for (loop = 0; loop < MAX_ENTITIES; loop++)
+ {
+ randomize_entity(lp, &lp->entities[loop]);
+ }
+ reshape_blocktube(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ glFlush();
+}
+
+ENTRYPOINT void free_blocktube (ModeInfo *mi)
+{
+ blocktube_configuration *lp = &lps[MI_SCREEN(mi)];
+# if defined ( I_HAVE_XPM )
+ if (lp->glx_context) {
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(lp->glx_context));
+
+ if (lp->envTexture)
+ glDeleteTextures(1, &lp->envTexture);
+ if (lp->texti)
+ XDestroyImage(lp->texti);
+ }
+# endif
+}
+
+ENTRYPOINT void reshape_blocktube (ModeInfo *mi, int width, int height)
+{
+ blocktube_configuration *lp = &lps[MI_SCREEN(mi)];
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(lp->glx_context));
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0, y, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(45.0, 1/h, 1.0, 100.0);
+ glMatrixMode(GL_MODELVIEW);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+}
+
+static int cube_vertices(float x, float y, float z, int wire)
+{
+ int polygon_count = 0;
+ float x2, y2, z2, nv = 0.7;
+ x2 = x/2;
+ y2 = y/2;
+ z2 = z/2;
+
+ glFrontFace(GL_CW);
+
+ glNormal3f(0, 0, nv);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glTexCoord2f(0.0, 0.0); glVertex3f(-x2, y2, z2);
+ glTexCoord2f(1.0, 0.0); glVertex3f( x2, y2, z2);
+ glTexCoord2f(1.0, 1.0); glVertex3f( x2, -y2, z2);
+ glTexCoord2f(0.0, 1.0); glVertex3f(-x2, -y2, z2);
+ polygon_count++;
+ glEnd();
+
+ glNormal3f(0, 0, -nv);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glTexCoord2f(1.0, 0.0); glVertex3f(-x2, -y2, -z2);
+ glTexCoord2f(1.0, 1.0); glVertex3f( x2, -y2, -z2);
+ glTexCoord2f(0.0, 1.0); glVertex3f( x2, y2, -z2);
+ glTexCoord2f(0.0, 0.0); glVertex3f(-x2, y2, -z2);
+ polygon_count++;
+ glEnd();
+
+ glNormal3f(0, nv, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glTexCoord2f(0.0, 1.0); glVertex3f(-x2, y2, -z2);
+ glTexCoord2f(0.0, 0.0); glVertex3f( x2, y2, -z2);
+ glTexCoord2f(1.0, 0.0); glVertex3f( x2, y2, z2);
+ glTexCoord2f(1.0, 1.0); glVertex3f(-x2, y2, z2);
+ polygon_count++;
+ glEnd();
+
+ glNormal3f(0, -nv, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glTexCoord2f(1.0, 1.0); glVertex3f(-x2, -y2, -z2);
+ glTexCoord2f(0.0, 1.0); glVertex3f(-x2, -y2, z2);
+ glTexCoord2f(0.0, 0.0); glVertex3f( x2, -y2, z2);
+ glTexCoord2f(1.0, 0.0); glVertex3f( x2, -y2, -z2);
+ polygon_count++;
+ glEnd();
+
+ if (wire) return polygon_count;
+
+ glNormal3f(nv, 0, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glTexCoord2f(1.0, 0.0); glVertex3f( x2, -y2, -z2);
+ glTexCoord2f(1.0, 1.0); glVertex3f( x2, -y2, z2);
+ glTexCoord2f(0.0, 1.0); glVertex3f( x2, y2, z2);
+ glTexCoord2f(0.0, 0.0); glVertex3f( x2, y2, -z2);
+ polygon_count++;
+ glEnd();
+
+ glNormal3f(-nv, 0, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glTexCoord2f(0.0, 0.0); glVertex3f(-x2, -y2, -z2);
+ glTexCoord2f(1.0, 0.0); glVertex3f(-x2, y2, -z2);
+ glTexCoord2f(1.0, 1.0); glVertex3f(-x2, y2, z2);
+ glTexCoord2f(0.0, 1.0); glVertex3f(-x2, -y2, z2);
+ polygon_count++;
+ glEnd();
+
+ return polygon_count;
+}
+
+static void draw_block(ModeInfo *mi, entity *ent)
+{
+ blocktube_configuration *lp = &lps[MI_SCREEN(mi)];
+ glCallList (lp->block_dlist);
+ mi->polygon_count += lp->polys;
+}
+
+ENTRYPOINT void
+draw_blocktube (ModeInfo *mi)
+{
+ blocktube_configuration *lp = &lps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ entity *cEnt = NULL;
+ int loop = 0;
+
+ if (!lp->glx_context)
+ return;
+
+ mi->polygon_count = 0;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(lp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if (do_texture) {
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+ glBindTexture(GL_TEXTURE_2D, lp->envTexture);
+ }
+
+ for (loop = 0; loop < MAX_ENTITIES; loop++) {
+ cEnt = &lp->entities[loop];
+
+ glLoadIdentity();
+ glTranslatef(0.0f, 0.0f, lp->zoom);
+ glRotatef(lp->tilt, 1.0f, 0.0f, 0.0f);
+ glRotatef(cEnt->angle, 0.0f, 0.0f, 1.0f);
+ glTranslatef(cEnt->position[0], cEnt->position[1], cEnt->position[2]);
+ glColor4ub((int)(lp->currentR * cEnt->tVal),
+ (int)(lp->currentG * cEnt->tVal),
+ (int)(lp->currentB * cEnt->tVal), 255);
+ draw_block(mi, cEnt);
+ entityTick(lp, cEnt);
+ }
+ tick(lp);
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE ("BlockTube", blocktube)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/blocktube.man b/hacks/glx/blocktube.man
new file mode 100644
index 0000000..5d016e0
--- /dev/null
+++ b/hacks/glx/blocktube.man
@@ -0,0 +1,73 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+blocktube - draws a swirling, falling tunnel of reflective slabs
+.SH SYNOPSIS
+.B blocktube
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-holdtime \fInumber\fP]
+[\-changetime \fInumber\fP]
+[\-no-texture]
+[\-no-fog]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Blocktube draws a swirling, falling tunnel of reflective slabs. They fade
+from hue to hue.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 40000 (0.04 seconds.).
+.TP 8
+.B \-holdtime \fInumber\fP
+How long to stay on the same color. Default: 1000 frames.
+.TP 8
+.B \-changetime \fInumber\fP
+How long it takes to fade to a new color. Default: 200 frames.
+.TP 8
+.B \-no-texture
+Draw solid blocks intstead of reflective blocks.
+.TP 8
+.B \-no-fog
+Do not make blocks in the distance be darker.
+.TP 8
+.B \-wireframe
+Only draw outlines.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Lars Damerow. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Lars Damerow <lars@oddment.org>
diff --git a/hacks/glx/boing.c b/hacks/glx/boing.c
new file mode 100644
index 0000000..55a05f3
--- /dev/null
+++ b/hacks/glx/boing.c
@@ -0,0 +1,658 @@
+/* boing, Copyright (c) 2005-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * A clone of the Amiga 1000 "Boing" demo. This was the first graphics demo
+ * for the Amiga, written by Dale Luck and RJ Mical during a break at the 1984
+ * Consumer Electronics Show (or so the legend goes.) The boing ball was
+ * briefly the official logo of Amiga Inc., until they were bought by
+ * Commodore later that year.
+ *
+ * With no arguments, this program looks a lot like the original Amiga demo.
+ * With "-smooth -lighting", it looks... less old.
+ *
+ * The amiga version made noise when the ball hit the walls. This version
+ * does not, obviously.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define free_boing 0
+# define release_boing 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SPIN "True"
+#define DEF_LIGHTING "False"
+#define DEF_SMOOTH "False"
+#define DEF_SCANLINES "True"
+#define DEF_SPEED "1.0"
+#define DEF_BALL_SIZE "0.5"
+#define DEF_ANGLE "15"
+#define DEF_MERIDIANS "16"
+#define DEF_PARALLELS "8"
+#define DEF_TILES "12"
+#define DEF_THICKNESS "0.05"
+
+#define DEF_BALL_COLOR1 "#CC1919"
+#define DEF_BALL_COLOR2 "#F2F2F2"
+#define DEF_GRID_COLOR "#991999"
+#define DEF_SHADOW_COLOR "#303030"
+#define DEF_BACKGROUND "#8C8C8C"
+
+typedef struct { GLfloat x, y, z; } XYZ;
+
+typedef struct {
+ GLXContext *glx_context;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ GLfloat speed;
+
+ GLuint ball_list;
+ double ball_x, ball_y, ball_z, ball_th;
+ double ball_dx, ball_dy, ball_dz, ball_dth;
+ double ball_ddx, ball_ddy, ball_ddz;
+
+ GLfloat ball_color1[4], ball_color2[4], grid_color[4];
+ GLfloat bg_color[4], shadow_color[4];
+ GLfloat lightpos[4];
+
+} boing_configuration;
+
+static boing_configuration *bps = NULL;
+
+static Bool spin;
+static Bool lighting_p;
+static Bool smooth_p;
+static Bool scanlines_p;
+static GLfloat speed;
+static int angle;
+static GLfloat ball_size;
+static unsigned int meridians;
+static unsigned int parallels;
+static unsigned int tiles;
+static GLfloat thickness;
+static char *ball_color1_str, *ball_color2_str, *grid_color_str,
+ *shadow_str, *bg_str;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-lighting", ".lighting", XrmoptionNoArg, "True" },
+ { "+lighting", ".lighting", XrmoptionNoArg, "False" },
+ { "-smooth", ".smooth", XrmoptionNoArg, "True" },
+ { "+smooth", ".smooth", XrmoptionNoArg, "False" },
+ { "-scanlines", ".scanlines", XrmoptionNoArg, "True" },
+ { "+scanlines", ".scanlines", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-angle", ".angle", XrmoptionSepArg, 0 },
+ { "-size", ".ballSize", XrmoptionSepArg, 0 },
+ { "-meridians", ".meridians", XrmoptionSepArg, 0 },
+ { "-parallels", ".parallels", XrmoptionSepArg, 0 },
+ { "-tiles", ".tiles", XrmoptionSepArg, 0 },
+ { "-thickness", ".thickness", XrmoptionSepArg, 0 },
+ { "-ball-color1",".ballColor1",XrmoptionSepArg, 0 },
+ { "-ball-color2",".ballColor2",XrmoptionSepArg, 0 },
+ { "-grid-color", ".gridColor", XrmoptionSepArg, 0 },
+ { "-shadow-color",".shadowColor",XrmoptionSepArg, 0 },
+ { "-background", ".boingBackground",XrmoptionSepArg, 0 },
+ { "-bg", ".boingBackground",XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&lighting_p,"lighting", "Lighting", DEF_LIGHTING, t_Bool},
+ {&smooth_p, "smooth", "Smooth", DEF_SMOOTH, t_Bool},
+ {&scanlines_p,"scanlines","Scanlines", DEF_SCANLINES, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&angle, "angle", "Angle", DEF_ANGLE, t_Int},
+ {&ball_size, "ballSize", "BallSize", DEF_BALL_SIZE, t_Float},
+ {&meridians, "meridians", "meridians", DEF_MERIDIANS, t_Int},
+ {&parallels, "parallels", "parallels", DEF_PARALLELS, t_Int},
+ {&tiles, "tiles", "Tiles", DEF_TILES, t_Int},
+ {&thickness, "thickness", "Thickness", DEF_THICKNESS, t_Float},
+ {&ball_color1_str, "ballColor1", "BallColor1", DEF_BALL_COLOR1, t_String},
+ {&ball_color2_str, "ballColor2", "BallColor2", DEF_BALL_COLOR2, t_String},
+ {&grid_color_str, "gridColor", "GridColor", DEF_GRID_COLOR, t_String},
+ {&shadow_str, "shadowColor","ShadowColor",DEF_SHADOW_COLOR,t_String},
+ /* dammit, -background is too magic... */
+ {&bg_str, "boingBackground", "Background", DEF_BACKGROUND, t_String},
+};
+
+ENTRYPOINT ModeSpecOpt boing_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+static void
+parse_color (ModeInfo *mi, const char *name, const char *s, GLfloat *a)
+{
+ XColor c;
+ a[3] = 1.0; /* alpha */
+
+ if (! XParseColor (MI_DISPLAY(mi), MI_COLORMAP(mi), s, &c))
+ {
+ fprintf (stderr, "%s: can't parse %s color %s", progname, name, s);
+ exit (1);
+ }
+ a[0] = c.red / 65536.0;
+ a[1] = c.green / 65536.0;
+ a[2] = c.blue / 65536.0;
+}
+
+
+static void
+draw_grid (ModeInfo *mi)
+{
+ boing_configuration *bp = &bps[MI_SCREEN(mi)];
+ int x, y;
+ GLfloat t2 = (GLfloat) tiles / 2;
+ GLfloat s = 1.0 / (tiles + thickness);
+ GLfloat z = 0;
+
+ GLfloat lw = MI_HEIGHT(mi) * 0.06 * thickness;
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bp->grid_color);
+ glColor3fv (bp->grid_color);
+
+ glPushMatrix();
+ glScalef(s, s, s);
+ glTranslatef (-t2, -t2, 0);
+
+ glLineWidth (lw);
+ glBegin (GL_LINES);
+ for (y = 0; y <= tiles; y++)
+ {
+ glVertex3f (0, y, z);
+ glVertex3f (tiles, y, z);
+ /*mi->polygon_count++;*/
+ }
+ for (x = 0; x <= tiles; x++)
+ {
+ glVertex3f (x, tiles, z);
+ glVertex3f (x, 0, z);
+ /*mi->polygon_count++;*/
+ }
+
+ glEnd();
+ glPopMatrix();
+}
+
+
+static void
+draw_box (ModeInfo *mi)
+{
+ /* boing_configuration *bp = &bps[MI_SCREEN(mi)]; */
+ glPushMatrix();
+ glTranslatef (0, 0, -0.5);
+/* glFrontFace (GL_CCW);*/
+ draw_grid (mi);
+ glPopMatrix();
+
+ glPushMatrix();
+ glRotatef (90, 1, 0, 0);
+ glTranslatef (0, 0, 0.5);
+/* glFrontFace (GL_CW);*/
+ draw_grid (mi);
+ glPopMatrix();
+}
+
+
+static void
+draw_ball (ModeInfo *mi)
+{
+ boing_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int x, y;
+ int xx = meridians;
+ int yy = parallels;
+ int scale = (smooth_p ? 5 : 1);
+
+ if (lighting_p && !wire)
+ glEnable (GL_LIGHTING);
+
+ if (parallels < 3)
+ scale *= 2;
+
+ xx *= scale;
+ yy *= scale;
+
+ glFrontFace (GL_CW);
+
+ glPushMatrix();
+ glTranslatef (bp->ball_x, bp->ball_y, bp->ball_z);
+ glScalef (ball_size, ball_size, ball_size);
+ glRotatef (-angle, 0, 0, 1);
+ glRotatef (bp->ball_th, 0, 1, 0);
+
+ for (y = 0; y < yy; y++)
+ {
+ GLfloat thy0 = y * (M_PI * 2) / (yy * 2) + M_PI_2;
+ GLfloat thy1 = (y+1) * (M_PI * 2) / (yy * 2) + M_PI_2;
+
+ for (x = 0; x < xx; x++)
+ {
+ GLfloat thx0 = x * (M_PI * 2) / xx;
+ GLfloat thx1 = (x+1) * (M_PI * 2) / xx;
+ XYZ p;
+ Bool bgp = ((x/scale) & 1) ^ ((y/scale) & 1);
+
+ if (wire && bgp) continue;
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE,
+ (bgp ? bp->ball_color2 : bp->ball_color1));
+ glColor3fv (bgp ? bp->ball_color2 : bp->ball_color1);
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+
+ if (!smooth_p)
+ {
+ p.x = cos((thy0+thy1)/2) * cos((thx0+thx1)/2);
+ p.y = sin((thy0+thy1)/2);
+ p.z = cos((thy0+thy1)/2) * sin((thx0+thx1)/2);
+ glNormal3f (-p.x, -p.y, -p.z);
+ }
+
+ p.x = cos(thy0) * cos(thx0) / 2;
+ p.y = sin(thy0) / 2;
+ p.z = cos(thy0) * sin(thx0) / 2;
+ if (smooth_p)
+ glNormal3f (-p.x, -p.y, -p.z);
+ glVertex3f (p.x, p.y, p.z);
+
+ p.x = cos(thy1) * cos(thx0) / 2;
+ p.y = sin(thy1) / 2;
+ p.z = cos(thy1) * sin(thx0) / 2;
+ if (smooth_p)
+ glNormal3f (-p.x, -p.y, -p.z);
+ glVertex3f (p.x, p.y, p.z);
+
+ p.x = cos(thy1) * cos(thx1) / 2;
+ p.y = sin(thy1) / 2;
+ p.z = cos(thy1) * sin(thx1) / 2;
+ if (smooth_p)
+ glNormal3f (-p.x, -p.y, -p.z);
+ glVertex3f (p.x, p.y, p.z);
+
+ p.x = cos(thy0) * cos(thx1) / 2;
+ p.y = sin(thy0) / 2;
+ p.z = cos(thy0) * sin(thx1) / 2;
+ if (smooth_p)
+ glNormal3f (-p.x, -p.y, -p.z);
+ glVertex3f (p.x, p.y, p.z);
+
+ glEnd ();
+ mi->polygon_count++;
+ }
+ }
+
+ glPopMatrix();
+
+ if (lighting_p && !wire)
+ glDisable(GL_LIGHTING);
+}
+
+
+static void
+draw_shadow (ModeInfo *mi)
+{
+ boing_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ GLfloat xoff = 0.14;
+ GLfloat yoff = 0.07;
+ int y;
+ int yy = parallels;
+ int scale = (smooth_p ? 5 : 1);
+
+ if (lighting_p && !wire)
+ glEnable (GL_BLEND);
+
+ if (parallels < 3)
+ scale *= 2;
+
+ yy *= scale;
+
+ glPushMatrix();
+ glTranslatef (bp->ball_x + xoff, bp->ball_y + yoff, -0.49);
+ glScalef (ball_size, ball_size, ball_size);
+ glRotatef (-angle, 0, 0, 1);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bp->shadow_color);
+ glColor4fv (bp->shadow_color);
+
+ glFrontFace (GL_CCW);
+ glNormal3f (0, 0, 1);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
+ if (!wire) glVertex3f (0, 0, 0);
+
+ for (y = 0; y < yy*2+1; y++)
+ {
+ GLfloat thy0 = y * (M_PI * 2) / (yy * 2) + M_PI_2;
+ glVertex3f (cos(thy0) / 2, sin(thy0) / 2, 0);
+ mi->polygon_count++;
+ }
+
+ glEnd ();
+
+ glPopMatrix();
+
+ if (lighting_p && !wire)
+ glDisable (GL_BLEND);
+}
+
+
+static void
+draw_scanlines (ModeInfo *mi)
+{
+ /* boing_configuration *bp = &bps[MI_SCREEN(mi)]; */
+ int wire = MI_IS_WIREFRAME(mi);
+ int w = MI_WIDTH(mi);
+ int h = MI_HEIGHT(mi);
+
+ if (h <= 300) return;
+
+ if (!wire)
+ {
+ glEnable (GL_BLEND);
+ glDisable (GL_DEPTH_TEST);
+ }
+
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ {
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ {
+ int lh, ls;
+ int y;
+ glLoadIdentity();
+ glOrtho (0, w, 0, h, -1, 1);
+
+ if (h > 500) lh = 4, ls = 4;
+ else if (h > 300) lh = 2, ls = 1;
+ else lh = 1, ls = 1;
+
+ if (lh == 1)
+ glDisable (GL_BLEND);
+
+ glLineWidth (lh);
+ glColor4f (0, 0, 0, 0.3);
+
+ glBegin(GL_LINES);
+ for (y = 0; y < h; y += lh + ls)
+ {
+ glVertex3f (0, y, 0);
+ glVertex3f (w, y, 0);
+ }
+ glEnd();
+ }
+ glPopMatrix();
+ }
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+
+ if (!wire)
+ {
+ glDisable (GL_BLEND);
+ glEnable (GL_DEPTH_TEST);
+ }
+}
+
+
+
+static void
+tick_physics (ModeInfo *mi)
+{
+ boing_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat s2 = ball_size / 2;
+ GLfloat max = 0.5 - s2;
+ GLfloat min = -max;
+
+ bp->ball_th += bp->ball_dth;
+ while (bp->ball_th > 360) bp->ball_th -= 360;
+ while (bp->ball_th < 0) bp->ball_th += 360;
+
+ bp->ball_dx += bp->ball_ddx;
+ bp->ball_x += bp->ball_dx;
+ if (bp->ball_x < min) bp->ball_x = min, bp->ball_dx = -bp->ball_dx,
+ bp->ball_dth = -bp->ball_dth,
+ bp->ball_dx += (frand(bp->speed/2) - bp->speed);
+ else if (bp->ball_x > max) bp->ball_x = max, bp->ball_dx = -bp->ball_dx,
+ bp->ball_dth = -bp->ball_dth,
+ bp->ball_dx += (frand(bp->speed/2) - bp->speed);
+
+ bp->ball_dy += bp->ball_ddy;
+ bp->ball_y += bp->ball_dy;
+ if (bp->ball_y < min) bp->ball_y = min, bp->ball_dy = -bp->ball_dy;
+ else if (bp->ball_y > max) bp->ball_y = max, bp->ball_dy = -bp->ball_dy;
+
+ bp->ball_dz += bp->ball_ddz;
+ bp->ball_z += bp->ball_dz;
+ if (bp->ball_z < min) bp->ball_z = min, bp->ball_dz = -bp->ball_dz;
+ else if (bp->ball_z > max) bp->ball_z = max, bp->ball_dz = -bp->ball_dz;
+}
+
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_boing (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ h *= 4.0 / 3.0; /* Back in the caveman days we couldn't even afford
+ square pixels! */
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 3/4;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ if (height > width)
+ {
+ GLfloat s = width / (GLfloat) height;
+ glScalef (s, s, s);
+ }
+
+ gluPerspective (8.0, 1/h, 1.0, 10.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt (0.0, 0.0, 8.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+boing_handle_event (ModeInfo *mi, XEvent *event)
+{
+ boing_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_boing (ModeInfo *mi)
+{
+ boing_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ if (tiles < 1) tiles = 1;
+
+ if (smooth_p)
+ {
+ if (meridians < 1) meridians = 1;
+ if (parallels < 1) parallels = 1;
+ }
+ else
+ {
+ if (meridians < 3) meridians = 3;
+ if (parallels < 2) parallels = 2;
+ }
+
+ if (meridians > 1 && meridians & 1) meridians++; /* odd numbers look bad */
+
+
+ if (thickness <= 0) thickness = 0.001;
+ else if (thickness > 1) thickness = 1;
+
+ reshape_boing (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ parse_color (mi, "ballColor1", ball_color1_str, bp->ball_color1);
+ parse_color (mi, "ballColor2", ball_color2_str, bp->ball_color2);
+ parse_color (mi, "gridColor", grid_color_str, bp->grid_color);
+ parse_color (mi, "shadowColor", shadow_str, bp->shadow_color);
+ parse_color (mi, "background", bg_str, bp->bg_color);
+
+ bp->shadow_color[3] = 0.9;
+
+ glClearColor (bp->bg_color[0], bp->bg_color[1], bp->bg_color[2], 1);
+
+ if (!wire)
+ {
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ }
+
+ bp->lightpos[0] = 0.5;
+ bp->lightpos[1] = 0.5;
+ bp->lightpos[2] = -1;
+ bp->lightpos[3] = 0;
+
+ if (lighting_p && !wire)
+ {
+ GLfloat amb[4] = {0, 0, 0, 1};
+ GLfloat dif[4] = {1, 1, 1, 1};
+ GLfloat spc[4] = {1, 1, 1, 1};
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ bp->speed = speed / 800.0;
+
+ bp->ball_dth = (spin ? -bp->speed * 7 * 360 : 0);
+
+ bp->ball_x = 0.5 - ((ball_size/2) + frand(1-ball_size));
+ bp->ball_y = 0.2;
+ bp->ball_dx = bp->speed * 6 + frand(bp->speed);
+ bp->ball_ddy = -bp->speed;
+
+ bp->ball_dz = bp->speed * 6 + frand(bp->speed);
+
+ bp->trackball = gltrackball_init (False);
+}
+
+
+ENTRYPOINT void
+draw_boing (ModeInfo *mi)
+{
+ boing_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ mi->polygon_count = 0;
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_NORMALIZE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if (! bp->button_down_p)
+ tick_physics (mi);
+
+ glPushMatrix ();
+
+ {
+ double rot = current_device_rotation();
+ glRotatef(rot, 0, 0, 1);
+/*
+ if ((rot > 45 && rot < 135) ||
+ (rot < -45 && rot > -135))
+ {
+ GLfloat s = MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi);
+ glScalef (1/s, s, 1);
+ }
+*/
+ }
+
+ gltrackball_rotate (bp->trackball);
+
+ glLightfv (GL_LIGHT0, GL_POSITION, bp->lightpos);
+
+ glDisable (GL_CULL_FACE);
+ glDisable (GL_DEPTH_TEST);
+
+ glEnable (GL_LINE_SMOOTH);
+ glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable (GL_BLEND);
+
+ draw_box (mi);
+ draw_shadow (mi);
+
+ glEnable (GL_CULL_FACE);
+ glEnable (GL_DEPTH_TEST);
+
+ draw_ball (mi);
+ if (scanlines_p)
+ draw_scanlines (mi);
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE ("Boing", boing)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/boing.man b/hacks/glx/boing.man
new file mode 100644
index 0000000..1f00d72
--- /dev/null
+++ b/hacks/glx/boing.man
@@ -0,0 +1,105 @@
+.TH XScreenSaver 1 "30-Oct-99" "X Version 11"
+.SH NAME
+boing - draws a bouncing ball like the ancient Amiga demo
+.SH SYNOPSIS
+.B boing
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIusecs\fP]
+[\-smooth]
+[\-lighting]
+[\-scanlines]
+[\-speed]
+[\-no\-spin]
+[\-angle \fIdegrees\fP]
+[\-size \fIratio\fP]
+[\-parallels \fIn\fP]
+[\-meridians \fIn\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+The \fIboing\fP program draws a bouncing checkered ball on a grid.
+
+This is a clone of the first graphics demo for the Amiga 1000, which
+was written by Dale Luck and RJ Mical during a break at the 1984
+Consumer Electronics Show (or so the legend goes.) The boing ball was
+briefly the official logo of Amiga Inc., until they were bought by
+Commodore later that year.
+
+With no arguments, this program looks a lot like the original Amiga
+demo. With "-smooth -lighting", it looks... less old.
+.SH OPTIONS
+.I boing
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIusecs\fP
+The delay between frames of the animation, in microseconds: default 15000.
+.TP 8
+.B \-smooth
+Draw a smooth sphere instead of a faceted polyhedron.
+.TP 8
+.B \-lighting
+Do shaded lighting instead of flat colors.
+.TP 8
+.B \-scanlines
+If the window is large enough, draw horizontal lines to simulate the
+scanlines on a low resolution monitor.
+.TP 8
+.B \-speed \fIratio\fP
+Change the animation speed; 0.5 to go half as fast, 2.0 to go twice as fast.
+.TP 8
+.B \-no\-spin
+Don't rotate the ball.
+.TP 8
+.B \-angle \fIdegrees\fP
+The jaunty angle at which the ball sits. Default 15 degrees.
+.TP 8
+.B \-size \fIratio\fP
+How big the ball is; default 0.5 meaning about half the size of the window.
+.TP 8
+.B \-parallels \fIn\fP
+.B \-meridians \fIn\fP
+The pattern of rectangles on the ball. Default 8x16.
+.TP 8
+.B \-wireframe
+Look crummy.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR bsod (MANSUFFIX),
+.BR pong (MANSUFFIX),
+.BR xscreensaver (1),
+.BR X (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 19-Feb-2005.
diff --git a/hacks/glx/bouncingcow.c b/hacks/glx/bouncingcow.c
new file mode 100644
index 0000000..6f9b45d
--- /dev/null
+++ b/hacks/glx/bouncingcow.c
@@ -0,0 +1,519 @@
+/* bouncingcow, Copyright (c) 2003-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Boing, boing, boing. Cow, cow, cow.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 1 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define free_cow 0
+# define release_cow 0
+#define DEF_SPEED "1.0"
+#define DEF_TEXTURE "(none)"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+#undef RANDSIGN
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+#include "xlockmore.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include "ximage-loader.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#include "gllist.h"
+
+extern struct gllist
+ *cow_face, *cow_hide, *cow_hoofs, *cow_horns, *cow_tail, *cow_udder;
+
+static struct gllist **all_objs[] = {
+ &cow_face, &cow_hide, &cow_hoofs, &cow_horns, &cow_tail, &cow_udder
+};
+
+#define FACE 0
+#define HIDE 1
+#define HOOFS 2
+#define HORNS 3
+#define TAIL 4
+#define UDDER 5
+
+typedef struct {
+ GLfloat x, y, z;
+ GLfloat ix, iy, iz;
+ GLfloat dx, dy, dz;
+ GLfloat ddx, ddy, ddz;
+ rotator *rot;
+ Bool spinner_p;
+} floater;
+
+typedef struct {
+ GLXContext *glx_context;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ GLuint *dlists;
+ GLuint texture;
+
+ int nfloaters;
+ floater *floaters;
+
+} cow_configuration;
+
+static cow_configuration *bps = NULL;
+
+static GLfloat speed;
+static const char *do_texture;
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ {"-texture", ".texture", XrmoptionSepArg, 0 },
+ {"+texture", ".texture", XrmoptionNoArg, "(none)" },
+};
+
+static argtype vars[] = {
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_String},
+};
+
+ENTRYPOINT ModeSpecOpt cow_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+#define BOTTOM 28.0
+
+static void
+reset_floater (ModeInfo *mi, floater *f)
+{
+ cow_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ f->y = -BOTTOM;
+ f->x = f->ix;
+ f->z = f->iz;
+
+ /* Yes, I know I'm varying the force of gravity instead of varying the
+ launch velocity. That's intentional: empirical studies indicate
+ that it's way, way funnier that way. */
+
+ f->dy = 5.0;
+ f->dx = 0;
+ f->dz = 0;
+
+ /* -0.18 max -0.3 top -0.4 middle -0.6 bottom */
+ f->ddy = speed * (-0.6 + BELLRAND(0.45));
+ f->ddx = 0;
+ f->ddz = 0;
+
+ f->spinner_p = !(random() % (12 * bp->nfloaters));
+
+ if (! (random() % (30 * bp->nfloaters)))
+ {
+ f->dx = BELLRAND(1.8) * RANDSIGN();
+ f->dz = BELLRAND(1.8) * RANDSIGN();
+ }
+}
+
+
+static void
+tick_floater (ModeInfo *mi, floater *f)
+{
+ cow_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (bp->button_down_p) return;
+
+ f->dx += f->ddx;
+ f->dy += f->ddy;
+ f->dz += f->ddz;
+
+ f->x += f->dx * speed;
+ f->y += f->dy * speed;
+ f->z += f->dz * speed;
+
+ if (f->y < -BOTTOM ||
+ f->x < -BOTTOM*8 || f->x > BOTTOM*8 ||
+ f->z < -BOTTOM*8 || f->z > BOTTOM*8)
+ reset_floater (mi, f);
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_cow (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+cow_handle_event (ModeInfo *mi, XEvent *event)
+{
+ cow_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+/* Textures
+ */
+
+static Bool
+load_texture (ModeInfo *mi, const char *filename)
+{
+ Display *dpy = mi->dpy;
+ Visual *visual = mi->xgwa.visual;
+ char buf[1024];
+ XImage *image;
+
+ if (MI_IS_WIREFRAME(mi))
+ return False;
+
+ if (!filename ||
+ !*filename ||
+ !strcasecmp (filename, "(none)"))
+ {
+ glDisable (GL_TEXTURE_2D);
+ return False;
+ }
+
+ image = file_to_ximage (dpy, visual, filename);
+ if (!image) return False;
+
+ clear_gl_error();
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ image->width, image->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, image->data);
+ sprintf (buf, "texture: %.100s (%dx%d)",
+ filename, image->width, image->height);
+ check_gl_error(buf);
+
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+ glPixelStorei (GL_UNPACK_ROW_LENGTH, image->width);
+
+ return True;
+}
+
+
+ENTRYPOINT void
+init_cow (ModeInfo *mi)
+{
+ cow_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+ Bool tex_p = False;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_cow (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {0.4, 0.2, 0.4, 0.0};
+/* GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};*/
+ GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ bp->trackball = gltrackball_init (False);
+
+ bp->dlists = (GLuint *) calloc (countof(all_objs)+1, sizeof(GLuint));
+ for (i = 0; i < countof(all_objs); i++)
+ bp->dlists[i] = glGenLists (1);
+
+ tex_p = load_texture (mi, do_texture);
+ if (tex_p)
+ glBindTexture (GL_TEXTURE_2D, bp->texture);
+
+ for (i = 0; i < countof(all_objs); i++)
+ {
+ GLfloat black[4] = {0, 0, 0, 1};
+ const struct gllist *gll = *all_objs[i];
+
+ glNewList (bp->dlists[i], GL_COMPILE);
+
+ glDisable (GL_TEXTURE_2D);
+
+ if (i == HIDE)
+ {
+ GLfloat color[4] = {0.63, 0.43, 0.36, 1.00};
+ if (tex_p)
+ {
+ /* if we have a texture, make the base color be white. */
+ color[0] = color[1] = color[2] = 1.0;
+
+ glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+ glEnable(GL_TEXTURE_2D);
+
+ /* approximately line it up with ../images/earth.png */
+ glMatrixMode (GL_TEXTURE);
+ glLoadIdentity();
+ glTranslatef (0.45, 0.58, 0);
+ glScalef (0.08, 0.16, 1);
+ glRotatef (-5, 0, 0, 1);
+ glMatrixMode (GL_MODELVIEW);
+ }
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, black);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, 128);
+ }
+ else if (i == TAIL)
+ {
+ GLfloat color[4] = {0.63, 0.43, 0.36, 1.00};
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, black);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, 128);
+ }
+ else if (i == UDDER)
+ {
+ GLfloat color[4] = {1.00, 0.53, 0.53, 1.00};
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, black);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, 128);
+ }
+ else if (i == HOOFS || i == HORNS)
+ {
+ GLfloat color[4] = {0.20, 0.20, 0.20, 1.00};
+ GLfloat spec[4] = {0.30, 0.30, 0.30, 1.00};
+ GLfloat shiny = 8.0;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+ }
+ else if (i == FACE)
+ {
+ GLfloat color[4] = {0.10, 0.10, 0.10, 1.00};
+ GLfloat spec[4] = {0.10, 0.10, 0.10, 1.00};
+ GLfloat shiny = 8.0;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+ }
+ else
+ {
+ GLfloat color[4] = {1.00, 1.00, 1.00, 1.00};
+ GLfloat spec[4] = {1.00, 1.00, 1.00, 1.00};
+ GLfloat shiny = 128.0;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+ }
+
+ renderList (gll, wire);
+
+ glEndList ();
+ }
+
+ bp->nfloaters = MI_COUNT (mi);
+ bp->floaters = (floater *) calloc (bp->nfloaters, sizeof (floater));
+
+ for (i = 0; i < bp->nfloaters; i++)
+ {
+ floater *f = &bp->floaters[i];
+ f->rot = make_rotator (10.0, 0, 0,
+ 4, 0.05 * speed,
+ True);
+ if (bp->nfloaters == 2)
+ {
+ f->x = (i ? 6 : -6);
+ }
+ else if (i != 0)
+ {
+ double th = (i - 1) * M_PI*2 / (bp->nfloaters-1);
+ double r = 10;
+ f->x = r * cos(th);
+ f->z = r * sin(th);
+ }
+
+ f->ix = f->x;
+ f->iy = f->y;
+ f->iz = f->z;
+ reset_floater (mi, f);
+ }
+}
+
+
+static void
+draw_floater (ModeInfo *mi, floater *f)
+{
+ cow_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat n;
+ double x, y, z;
+
+ get_position (f->rot, &x, &y, &z, !bp->button_down_p);
+
+ glPushMatrix();
+ glTranslatef (f->x, f->y, f->z);
+
+ gltrackball_rotate (bp->trackball);
+
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ if (f->spinner_p)
+ {
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ n = 1.5;
+ if (bp->nfloaters > 99) n *= 0.05;
+ else if (bp->nfloaters > 25) n *= 0.18;
+ else if (bp->nfloaters > 9) n *= 0.3;
+ else if (bp->nfloaters > 1) n *= 0.7;
+ glScalef(n, n, n);
+
+ glCallList (bp->dlists[FACE]);
+ mi->polygon_count += (*all_objs[FACE])->points / 3;
+
+ glCallList (bp->dlists[HIDE]);
+ mi->polygon_count += (*all_objs[HIDE])->points / 3;
+
+ glCallList (bp->dlists[HOOFS]);
+ mi->polygon_count += (*all_objs[HOOFS])->points / 3;
+
+ glCallList (bp->dlists[HORNS]);
+ mi->polygon_count += (*all_objs[HORNS])->points / 3;
+
+ glCallList (bp->dlists[TAIL]);
+ mi->polygon_count += (*all_objs[TAIL])->points / 3;
+
+ glCallList (bp->dlists[UDDER]);
+ mi->polygon_count += (*all_objs[UDDER])->points / 3;
+
+ glPopMatrix();
+}
+
+
+
+ENTRYPOINT void
+draw_cow (ModeInfo *mi)
+{
+ cow_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ glRotatef(o, 0, 0, 1);
+ }
+# endif
+
+ glScalef (0.5, 0.5, 0.5);
+
+ mi->polygon_count = 0;
+
+# if 0
+ {
+ floater F;
+ F.x = F.y = F.z = 0;
+ F.dx = F.dy = F.dz = 0;
+ F.ddx = F.ddy = F.ddz = 0;
+ F.rot = make_rotator (0, 0, 0, 1, 0, False);
+ glScalef(2,2,2);
+ draw_floater (mi, &F);
+ }
+# else
+ for (i = 0; i < bp->nfloaters; i++)
+ {
+ /* "Don't kid yourself, Jimmy. If a cow ever got the chance,
+ he'd eat you and everyone you care about!"
+ -- Troy McClure in "Meat and You: Partners in Freedom"
+ */
+ floater *f = &bp->floaters[i];
+ draw_floater (mi, f);
+ tick_floater (mi, f);
+ }
+# endif
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("BouncingCow", bouncingcow, cow)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/bouncingcow.man b/hacks/glx/bouncingcow.man
new file mode 100644
index 0000000..516d1de
--- /dev/null
+++ b/hacks/glx/bouncingcow.man
@@ -0,0 +1,73 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+bouncingcow - a happy cow on a trampoline in 3D. Moo.
+.SH SYNOPSIS
+.B bouncingcow
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-count \fInumber\fP]
+[\-texture \fIfilename\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+It's very silly.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+How fast the cow bounces. Larger for faster. Default: 1.0.
+.TP 8
+.B \-count \fInumber\fP
+How many cows! Default 1.
+.TP 8
+.B \-texture \fIfilename\fP
+An image file to paint on the cow's hide.
+
+Note that on most systems, GL textures must have dimensions that are a
+power of two.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Jamie Zawinski. Moo. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+Moo. No representations are made about the suitability of this
+software for any purpose. It is provided "as is" without express or
+implied warranty. Moo.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>
+
diff --git a/hacks/glx/boxed.c b/hacks/glx/boxed.c
new file mode 100644
index 0000000..136d468
--- /dev/null
+++ b/hacks/glx/boxed.c
@@ -0,0 +1,1370 @@
+/* boxed --- 3D bouncing balls that explode */
+
+#if 0
+static const char sccsid[] = "@(#)boxed.c 0.9 01/09/26 xlockmore";
+#endif
+
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ *
+ * 2001: Written by Sander van Grieken <mailsander@gmx.net>
+ * as an OpenGL screensaver for the xscreensaver package.
+ * Lots of hardcoded values still in place. Also, there are some
+ * copy/paste leftovers from the gears hack. opts don't work.
+ *
+ * 2005: opts work. added options -balls, -ballsize, -explosion
+ *
+ * 2006: opts work. added option -decay
+ *
+ * 2008: opts work. added option -momentum
+ *
+ */
+
+#include "boxed.h"
+
+/*
+**----------------------------------------------------------------------------
+** Defines
+**----------------------------------------------------------------------------
+*/
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 15000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n"
+
+# define release_boxed 0
+# define boxed_handle_event xlockmore_no_events
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+# define DEF_SPEED "0.5"
+# define DEF_BALLS "20"
+# define DEF_BALLSIZE "3.0"
+# define DEF_EXPLOSION "15.0"
+# define DEF_DECAY "0.07"
+# define DEF_MOMENTUM "0.6"
+
+#undef countof
+#define countof(x) (int)(sizeof((x))/sizeof((*x)))
+#undef rnd
+#define rnd() (frand(1.0))
+
+static GLfloat speed; /* jwz -- overall speed factor applied to all motion */
+static int cfg_balls;
+static GLfloat cfg_ballsize;
+static GLfloat cfg_explosion;
+static GLfloat cfg_decay;
+static GLfloat cfg_momentum;
+
+
+static XrmOptionDescRec opts[] = {
+ {"-speed", ".boxed.speed", XrmoptionSepArg, 0},
+ {"-balls", ".boxed.balls", XrmoptionSepArg, 0},
+ {"-ballsize", ".boxed.ballsize", XrmoptionSepArg, 0},
+ {"-explosion", ".boxed.explosion", XrmoptionSepArg, 0},
+ {"-decay", ".boxed.decay", XrmoptionSepArg, 0},
+ {"-momentum", ".boxed.momentum", XrmoptionSepArg, 0},
+};
+
+static argtype vars[] = {
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&cfg_balls, "balls", "Balls", DEF_BALLS, t_Int},
+ {&cfg_ballsize, "ballsize", "Ball Size", DEF_BALLSIZE, t_Float},
+ {&cfg_explosion, "explosion", "Explosion", DEF_EXPLOSION, t_Float},
+ {&cfg_decay, "decay", "Explosion Decay", DEF_DECAY, t_Float},
+ {&cfg_momentum, "momentum", "Explosion Momentum", DEF_MOMENTUM, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt boxed_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+
+ModStruct boxed_description = {
+ "boxed", "init_boxed", "draw_boxed", NULL,
+ "draw_boxed", "init_boxed", "free_boxed", &boxed_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "Shows GL's boxed balls", 0, NULL};
+
+#endif
+
+#define BOOL int
+#define TRUE 1
+#define FALSE 0
+
+/* camera */
+#define CAM_HEIGHT 80.0f
+#define CAMDISTANCE_MIN 35.0
+#define CAMDISTANCE_MAX 150.0
+#define CAMDISTANCE_SPEED 1.5
+#define LOOKAT_R 30.0
+
+/* rendering the sphere */
+#define MESH_SIZE 10
+#define SPHERE_VERTICES (2+MESH_SIZE*MESH_SIZE*2)
+#define SPHERE_INDICES ((MESH_SIZE*4 + MESH_SIZE*4*(MESH_SIZE-1))*3)
+
+/*
+**-----------------------------------------------------------------------------
+** Typedefs
+**-----------------------------------------------------------------------------
+*/
+
+typedef struct {
+ GLfloat x;
+ GLfloat y;
+ GLfloat z;
+} vectorf;
+
+typedef struct {
+ vectorf loc;
+ vectorf dir;
+ vectorf color;
+ float radius;
+ BOOL bounced;
+ int offside;
+ BOOL justcreated;
+} ball;
+
+typedef struct {
+ int num_balls;
+ float ballsize;
+ float explosion;
+ ball *balls;
+} ballman;
+
+typedef struct {
+ vectorf loc;
+ vectorf dir;
+ BOOL far;
+ int gone;
+} tri;
+
+typedef struct {
+ int num_tri;
+ int lifetime;
+ float scalefac;
+ float explosion;
+ float decay;
+ float momentum;
+ vectorf color;
+ tri *tris;
+ GLint *indices;
+ vectorf *normals;
+ vectorf *vertices;
+} triman;
+
+typedef struct {
+ int numballs;
+ float ballsize;
+ float explosion;
+ float decay;
+ float momentum;
+ BOOL textures;
+ BOOL transparent;
+ float camspeed;
+} boxed_config;
+
+
+typedef struct {
+ float cam_x_speed, cam_z_speed, cam_y_speed;
+ boxed_config config;
+ float tic;
+ float camtic;
+ vectorf spherev[SPHERE_VERTICES];
+ GLint spherei[SPHERE_INDICES];
+ ballman bman;
+ triman *tman;
+ GLXContext *glx_context;
+ GLuint listobjects;
+ GLuint gllists[3];
+ int list_polys[3];
+ Window window;
+ BOOL stop;
+ char *tex1;
+} boxedstruct;
+
+#define GLL_PATTERN 0
+#define GLL_BALL 1
+#define GLL_BOX 2
+
+/*
+**----------------------------------------------------------------------------
+** Local Variables
+**----------------------------------------------------------------------------
+*/
+
+static boxedstruct *boxed = NULL;
+
+
+/*
+**----------------------------------------------------------------------------
+** Functions
+**----------------------------------------------------------------------------
+*/
+
+/*
+ * Add 2 vectors
+ */
+static inline void addvectors(vectorf *dest, vectorf *s1, vectorf *s2)
+{
+ dest->x = s1->x + s2->x;
+ dest->y = s1->y + s2->y;
+ dest->z = s1->z + s2->z;
+}
+
+/*
+ * Sub 2 vectors
+ */
+static inline void subvectors(vectorf *dest, vectorf* s1, vectorf *s2)
+{
+ dest->x = s1->x - s2->x;
+ dest->y = s1->y - s2->y;
+ dest->z = s1->z - s2->z;
+}
+
+/*
+ * Multiply vector with scalar (scale vector)
+ */
+static inline void scalevector(vectorf *dest, vectorf *source, GLfloat sc)
+{
+ dest->x = source->x * sc;
+ dest->y = source->y * sc;
+ dest->z = source->z * sc;
+}
+
+/*
+ * Copy vector
+ */
+static inline void copyvector(vectorf *dest, vectorf* source)
+{
+ dest->x = source->x;
+ dest->y = source->y;
+ dest->z = source->z;
+}
+
+
+static inline GLfloat
+dotproduct(vectorf * v1, vectorf * v2)
+{
+ return v1->x * v2->x + v1->y * v2->y + v1->z * v2->z;
+}
+
+static inline GLfloat
+squaremagnitude(vectorf * v)
+{
+ return v->x * v->x + v->y * v->y + v->z * v->z;
+}
+
+static inline GLfloat
+squaremagnitudehorz(vectorf * v)
+{
+ return v->x * v->x + v->z * v->z;
+}
+
+
+
+/*
+ * Generate the Sphere data
+ *
+ * Input:
+ */
+
+static void generatesphere(boxedstruct *gp)
+{
+ float dj = M_PI/(MESH_SIZE+1.0f);
+ float di = M_PI/MESH_SIZE;
+ int v; /* vertex offset */
+ int ind; /* indices offset */
+ int i,j,si;
+ GLfloat r_y_plane, h_y_plane;
+ vectorf *spherev;
+ GLint *spherei;
+
+ /*
+ * generate the sphere data
+ * vertices 0 and 1 are the north and south poles
+ */
+
+ spherei = gp->spherei;
+ spherev = gp->spherev;
+
+ spherev[0].x = 0.0f; spherev[0].y =1.0f; spherev[0].z = 0.0f;
+ spherev[1].x = 0.0f; spherev[1].y =-1.0f; spherev[1].z = 0.0f;
+
+ for (j=0; j<MESH_SIZE; j++) {
+ r_y_plane = (float)sin((j+1) * dj);
+ h_y_plane = (float)cos((j+1) * dj);
+ for (i=0; i<MESH_SIZE*2; i++) {
+ si = 2+i+j*MESH_SIZE*2;
+ spherev[si].y = h_y_plane;
+ spherev[si].x = (float) sin(i * di) * r_y_plane;
+ spherev[si].z = (float) cos(i * di) * r_y_plane;
+ }
+ }
+
+ /* generate indices */
+ for (i=0; i<MESH_SIZE*2; i++) {
+ spherei[3*i] = 0;
+ spherei[3*i+1] = i+2;
+ spherei[3*i+2] = i+3;
+ if (i==MESH_SIZE*2-1)
+ spherei[3*i+2] = 2;
+ }
+
+ /* the middle strips */
+ for (j=0; j<MESH_SIZE-1; j++) {
+ v = 2+j*MESH_SIZE*2;
+ ind = 3*MESH_SIZE*2 + j*6*MESH_SIZE*2;
+ for (i=0; i<MESH_SIZE*2; i++) {
+ spherei[6*i+ind] = v+i;
+ spherei[6*i+2+ind] = v+i+1;
+ spherei[6*i+1+ind] = v+i+MESH_SIZE*2;
+
+ spherei[6*i+ind+3] = v+i+MESH_SIZE*2;
+ spherei[6*i+2+ind+3] = v+i+1;
+ spherei[6*i+1+ind+3] = v+i+MESH_SIZE*2+1;
+ if (i==MESH_SIZE*2-1) {
+ spherei[6*i+2+ind] = v+i+1-2*MESH_SIZE;
+ spherei[6*i+2+ind+3] = v+i+1-2*MESH_SIZE;
+ spherei[6*i+1+ind+3] = v+i+MESH_SIZE*2+1-2*MESH_SIZE;
+ }
+ }
+ }
+
+ v = SPHERE_VERTICES-MESH_SIZE*2;
+ ind = SPHERE_INDICES-3*MESH_SIZE*2;
+ for (i=0; i<MESH_SIZE*2; i++) {
+ spherei[3*i+ind] = 1;
+ spherei[3*i+1+ind] = v+i+1;
+ spherei[3*i+2+ind] = v+i;
+ if (i==MESH_SIZE*2-1)
+ spherei[3*i+1+ind] = v;
+ }
+}
+
+
+
+
+/*
+ * create fresh ball
+ */
+
+static void createball(ball *newball)
+{
+ float r=0.0f,g=0.0f,b=0.0f;
+ newball->loc.x = 5-10*rnd();
+ newball->loc.y = 35+20*rnd();
+ newball->loc.z = 5-10*rnd();
+ newball->dir.x = (0.5f-rnd()) * speed;
+ newball->dir.y = 0.0;
+ newball->dir.z = (0.5-rnd()) * speed;
+ newball->offside = 0;
+ newball->bounced = FALSE;
+ newball->radius = cfg_ballsize;
+ while (r+g+b < 1.8f ) {
+ newball->color.x = r=rnd();
+ newball->color.y = g=rnd();
+ newball->color.z = b=rnd();
+ }
+ newball->justcreated = TRUE;
+}
+
+/* Update position of each ball */
+
+static void updateballs(ballman *bman)
+{
+ register int b,j;
+ vectorf dvect,richting,relspeed,influence;
+ GLfloat squaredist;
+
+ for (b=0;b<bman->num_balls;b++) {
+
+ GLfloat gravity = 0.30f * speed;
+
+ /* apply gravity */
+ bman->balls[b].dir.y -= gravity;
+ /* apply movement */
+ addvectors(&bman->balls[b].loc,&bman->balls[b].loc,&bman->balls[b].dir);
+ /* boundary check */
+ if (bman->balls[b].loc.y < bman->balls[b].radius) { /* ball onder bodem? (bodem @ y=0) */
+ if ((bman->balls[b].loc.x < -95.0) ||
+ (bman->balls[b].loc.x > 95.0) ||
+ (bman->balls[b].loc.z < -95.0) ||
+ (bman->balls[b].loc.z > 95.0)) {
+ if (bman->balls[b].loc.y < -2000.0)
+ createball(&bman->balls[b]);
+ } else {
+ bman->balls[b].loc.y = bman->balls[b].radius + (bman->balls[b].radius - bman->balls[b].loc.y);
+ bman->balls[b].dir.y = -bman->balls[b].dir.y;
+ if (bman->balls[b].offside) {
+ bman->balls[b].bounced = TRUE; /* temporary disable painting ball */
+ scalevector(&bman->balls[b].dir,&bman->balls[b].dir,0.80f);
+ if (squaremagnitude(&bman->balls[b].dir) < 0.08f) {
+ createball(&bman->balls[b]);
+ }
+ if (squaremagnitudehorz(&bman->balls[b].dir) < 0.005f) {
+ createball(&bman->balls[b]);
+ }
+ }
+ }
+
+ }
+ if (!bman->balls[b].offside) {
+ if (bman->balls[b].loc.x - bman->balls[b].radius < -20.0f) { /* x ondergrens */
+ if (bman->balls[b].loc.y > 41+bman->balls[b].radius) bman->balls[b].offside=1;
+ else {
+ bman->balls[b].dir.x = -bman->balls[b].dir.x;
+ bman->balls[b].loc.x = -20.0f + bman->balls[b].radius;
+ }
+ }
+ if (bman->balls[b].loc.x + bman->balls[b].radius > 20.0f) { /* x bovengrens */
+ if (bman->balls[b].loc.y > 41+bman->balls[b].radius) bman->balls[b].offside=1;
+ else {
+ bman->balls[b].dir.x = -bman->balls[b].dir.x;
+ bman->balls[b].loc.x = 20.0f - bman->balls[b].radius;
+ }
+ }
+ if (bman->balls[b].loc.z - bman->balls[b].radius < -20.0f) { /* z ondergrens */
+ if (bman->balls[b].loc.y > 41+bman->balls[b].radius) bman->balls[b].offside=1;
+ else {
+ bman->balls[b].dir.z = -bman->balls[b].dir.z;
+ bman->balls[b].loc.z = -20.0f + bman->balls[b].radius;
+ }
+ }
+ if (bman->balls[b].loc.z + bman->balls[b].radius > 20.0f) { /* z bovengrens */
+ if (bman->balls[b].loc.y > 41+bman->balls[b].radius) bman->balls[b].offside=1;
+ else {
+ bman->balls[b].dir.z = -bman->balls[b].dir.z;
+ bman->balls[b].loc.z = 20.0f - bman->balls[b].radius;
+ }
+ }
+ } /* end if !offside */
+
+ /* check voor stuiteren */
+ for (j=b+1;j<bman->num_balls;j++) {
+ squaredist = (bman->balls[b].radius * bman->balls[b].radius) + (bman->balls[j].radius * bman->balls[j].radius);
+ subvectors(&dvect,&bman->balls[b].loc,&bman->balls[j].loc);
+ if ( squaremagnitude(&dvect) < squaredist ) { /* balls b and j touch */
+ subvectors(&richting,&bman->balls[j].loc,&bman->balls[b].loc);
+ subvectors(&relspeed,&bman->balls[b].dir,&bman->balls[j].dir);
+ /* calc mutual influence direction and magnitude */
+ scalevector(&influence,&richting,(dotproduct(&richting,&relspeed)/squaremagnitude(&richting)));
+
+ subvectors(&bman->balls[b].dir,&bman->balls[b].dir,&influence);
+ addvectors(&bman->balls[j].dir,&bman->balls[j].dir,&influence);
+ addvectors(&bman->balls[b].loc,&bman->balls[b].loc,&bman->balls[b].dir);
+ addvectors(&bman->balls[j].loc,&bman->balls[j].loc,&bman->balls[j].dir);
+
+ subvectors(&dvect,&bman->balls[b].loc,&bman->balls[j].loc);
+ while (squaremagnitude(&dvect) < squaredist) {
+ addvectors(&bman->balls[b].loc,&bman->balls[b].loc,&bman->balls[b].dir);
+ addvectors(&bman->balls[j].loc,&bman->balls[j].loc,&bman->balls[j].dir);
+ subvectors(&dvect,&bman->balls[b].loc,&bman->balls[j].loc);
+ }
+ }
+ } /* end for j */
+ } /* end for b */
+}
+
+
+/*
+* explode ball into triangles
+*/
+
+static void createtrisfromball(triman* tman, vectorf *spherev, GLint *spherei, int ind_num, ball *b)
+{
+ int pos;
+ float explosion;
+ float momentum;
+ float scale;
+ register int i;
+ vectorf avgdir,dvect,mvect;
+
+ tman->scalefac = b->radius;
+ copyvector(&tman->color,&b->color);
+ explosion = 1.0f + tman->explosion * 2.0 * rnd();
+ momentum = tman->momentum;
+
+ tman->num_tri = ind_num/3;
+
+ /* reserveer geheugen voor de poly's in een bal */
+
+ tman->tris = (tri *)malloc(tman->num_tri * sizeof(tri));
+ tman->vertices = (vectorf *)malloc(ind_num * sizeof(vectorf));
+ tman->normals = (vectorf *)malloc(ind_num/3 * sizeof(vectorf));
+
+ for (i=0; i<(tman->num_tri); i++) {
+ tman->tris[i].far = FALSE;
+ tman->tris[i].gone = 0;
+ pos = i * 3;
+ /* kopieer elke poly apart naar een tri structure */
+ copyvector(&tman->vertices[pos+0],&spherev[spherei[pos+0]]);
+ copyvector(&tman->vertices[pos+1],&spherev[spherei[pos+1]]);
+ copyvector(&tman->vertices[pos+2],&spherev[spherei[pos+2]]);
+ /* Calculate average direction of shrapnel */
+ addvectors(&avgdir,&tman->vertices[pos+0],&tman->vertices[pos+1]);
+ addvectors(&avgdir,&avgdir,&tman->vertices[pos+2]);
+ scalevector(&avgdir,&avgdir,0.33333);
+
+ /* should normalize first, NYI */
+ copyvector(&tman->normals[i],&avgdir);
+
+ /* copy de lokatie */
+ addvectors(&tman->tris[i].loc,&b->loc,&avgdir);
+ /* en translate alle triangles terug naar hun eigen oorsprong */
+ tman->vertices[pos+0].x -= avgdir.x;
+ tman->vertices[pos+0].y -= avgdir.y;
+ tman->vertices[pos+0].z -= avgdir.z;
+ tman->vertices[pos+1].x -= avgdir.x;
+ tman->vertices[pos+1].y -= avgdir.y;
+ tman->vertices[pos+1].z -= avgdir.z;
+ tman->vertices[pos+2].x -= avgdir.x;
+ tman->vertices[pos+2].y -= avgdir.y;
+ tman->vertices[pos+2].z -= avgdir.z;
+ /* alwaar opschaling plaatsvindt */
+ scale = b->radius * 2;
+ scalevector(&tman->vertices[pos+0],&tman->vertices[pos+0],scale);
+ scalevector(&tman->vertices[pos+1],&tman->vertices[pos+1],scale);
+ scalevector(&tman->vertices[pos+2],&tman->vertices[pos+2],scale);
+
+ tman->vertices[pos+0].x += avgdir.x;
+ tman->vertices[pos+0].y += avgdir.y;
+ tman->vertices[pos+0].z += avgdir.z;
+ tman->vertices[pos+1].x += avgdir.x;
+ tman->vertices[pos+1].y += avgdir.y;
+ tman->vertices[pos+1].z += avgdir.z;
+ tman->vertices[pos+2].x += avgdir.x;
+ tman->vertices[pos+2].y += avgdir.y;
+ tman->vertices[pos+2].z += avgdir.z;
+
+ /* bereken nieuwe richting */
+ scalevector(&tman->tris[i].dir,&avgdir,explosion);
+ dvect.x = (0.1f - 0.2f*rnd());
+ dvect.y = (0.15f - 0.3f*rnd());
+ dvect.z = (0.1f - 0.2f*rnd());
+ addvectors(&tman->tris[i].dir,&tman->tris[i].dir,&dvect);
+
+ /* add ball's momentum to each piece of the exploded ball */
+ mvect.x = b->dir.x * momentum;
+ mvect.y = 0;
+ mvect.z = b->dir.z * momentum;
+ addvectors(&tman->tris[i].dir,&tman->tris[i].dir,&mvect);
+ }
+}
+
+
+/*
+* update position of each tri
+*/
+
+static void updatetris(triman *t)
+{
+ int b;
+ GLfloat xd,zd;
+
+ for (b=0;b<t->num_tri;b++) {
+ /* the exploded triangles disappear over time */
+ if (rnd() < t->decay) {
+ if (t->tris[b].gone == 0)
+ t->tris[b].gone = 1;
+ }
+ /* apply gravity */
+ t->tris[b].dir.y -= (0.1f * speed);
+ /* apply movement */
+ addvectors(&t->tris[b].loc,&t->tris[b].loc,&t->tris[b].dir);
+ /* boundary check */
+ if (t->tris[b].far) continue;
+ if (t->tris[b].loc.y < 0) { /* onder bodem ? */
+ if ((t->tris[b].loc.x > -95.0f) &
+ (t->tris[b].loc.x < 95.0f) &
+ (t->tris[b].loc.z > -95.0f) &
+ (t->tris[b].loc.z < 95.0f)) { /* in veld */
+ t->tris[b].dir.y = -(t->tris[b].dir.y);
+ t->tris[b].loc.y = -t->tris[b].loc.y;
+ scalevector(&t->tris[b].dir,&t->tris[b].dir,0.80f); /* dampening */
+ }
+ else {
+ t->tris[b].far = TRUE;
+ continue;
+ }
+ }
+
+ if ((t->tris[b].loc.x > -21.0f) &
+ (t->tris[b].loc.x < 21.0f) &
+ (t->tris[b].loc.z > -21.0f) &
+ (t->tris[b].loc.z < 21.0f)) { /* in box? */
+
+ xd = zd = 999.0f; /* big */
+ if ((t->tris[b].loc.x > -21.0f) &
+ (t->tris[b].loc.x < 0)) {
+ xd = t->tris[b].loc.x + 21.0f;
+ }
+ if ((t->tris[b].loc.x < 21.0f) &
+ (t->tris[b].loc.x > 0)) {
+ xd = 21.0f - t->tris[b].loc.x;
+ }
+ if ((t->tris[b].loc.z > -21.0f) &
+ (t->tris[b].loc.z < 0)) {
+ zd = t->tris[b].loc.z + 21.0f;
+ }
+ if ((t->tris[b].loc.z < 21.0f) &
+ (t->tris[b].loc.z > 0)) {
+ zd = 21.0f - t->tris[b].loc.z;
+ }
+ if (xd < zd) {
+ /* bounce x */
+ if (t->tris[b].dir.x < 0)
+ t->tris[b].loc.x += (21.0f - t->tris[b].loc.x);
+ else
+ t->tris[b].loc.x += (-21.0f - t->tris[b].loc.x);
+ t->tris[b].dir.x = -t->tris[b].dir.x;
+ } else {
+ /* bounce z */
+ if (t->tris[b].dir.z < 0)
+ t->tris[b].loc.z += (21.0f - t->tris[b].loc.z);
+ else
+ t->tris[b].loc.z += (-21.0f - t->tris[b].loc.z);
+ t->tris[b].dir.z = -t->tris[b].dir.z;
+ }
+
+ }
+ } /* end for b */
+}
+
+
+/*
+ * free memory allocated by a tri manager
+ */
+static void freetris(triman *t)
+{
+ if (!t) return;
+ if (t->tris) free(t->tris);
+ if (t->vertices) free(t->vertices);
+ if (t->normals) free(t->normals);
+ t->tris = NULL;
+ t->vertices = NULL;
+ t->normals = NULL;
+ t->num_tri = 0;
+ t->lifetime = 0;
+}
+
+
+/*
+ *load defaults in config structure
+ */
+static void setdefaultconfig(boxed_config *config)
+{
+ cfg_balls = MAX(3,MIN(40,cfg_balls));
+ cfg_ballsize = MAX(1.0f,MIN(5.0f,cfg_ballsize));
+ cfg_explosion = MAX(0.0f,MIN(50.0f,cfg_explosion));
+ cfg_decay = MAX(0.02f,MIN(0.90f,cfg_decay));
+ cfg_momentum = MAX(0.0f,MIN(1.0f,cfg_momentum));
+
+ config->numballs = cfg_balls;
+ config->textures = TRUE;
+ config->transparent = FALSE;
+ config->explosion = cfg_explosion;
+ config->decay = cfg_decay;
+ config->momentum = cfg_momentum;
+ config->ballsize = cfg_ballsize;
+ config->camspeed = 35.0f;
+}
+
+
+/*
+ * draw bottom
+ */
+static int drawfilledbox(boxedstruct *boxed, int wire)
+{
+ /* draws texture filled box,
+ top is drawn using the entire texture,
+ the sides are drawn using the edge of the texture
+ */
+ int polys = 0;
+
+ /* front */
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glTexCoord2f(0,1);
+ glVertex3f(-1.0,1.0,1.0);
+ glTexCoord2f(1,1);
+ glVertex3f(1.0,1.0,1.0);
+ glTexCoord2f(1,1);
+ glVertex3f(1.0,-1.0,1.0);
+ glTexCoord2f(0,1);
+ glVertex3f(-1.0,-1.0,1.0);
+ polys++;
+ /* rear */
+ glTexCoord2f(0,1);
+ glVertex3f(1.0,1.0,-1.0);
+ glTexCoord2f(1,1);
+ glVertex3f(-1.0,1.0,-1.0);
+ glTexCoord2f(1,1);
+ glVertex3f(-1.0,-1.0,-1.0);
+ glTexCoord2f(0,1);
+ glVertex3f(1.0,-1.0,-1.0);
+ polys++;
+ /* left */
+ glTexCoord2f(1,1);
+ glVertex3f(-1.0,1.0,1.0);
+ glTexCoord2f(1,1);
+ glVertex3f(-1.0,-1.0,1.0);
+ glTexCoord2f(0,1);
+ glVertex3f(-1.0,-1.0,-1.0);
+ glTexCoord2f(0,1);
+ glVertex3f(-1.0,1.0,-1.0);
+ polys++;
+ /* right */
+ glTexCoord2f(0,1);
+ glVertex3f(1.0,1.0,1.0);
+ glTexCoord2f(1,1);
+ glVertex3f(1.0,1.0,-1.0);
+ glTexCoord2f(1,1);
+ glVertex3f(1.0,-1.0,-1.0);
+ glTexCoord2f(0,1);
+ glVertex3f(1.0,-1.0,1.0);
+ polys++;
+ /* top */
+ glTexCoord2f(0.0,0.0);
+ glVertex3f(-1.0,1.0,1.0);
+ glTexCoord2f(0.0,1.0);
+ glVertex3f(-1.0,1.0,-1.0);
+ glTexCoord2f(1.0,1.0);
+ glVertex3f(1.0,1.0,-1.0);
+ glTexCoord2f(1.0,0.0);
+ glVertex3f(1.0,1.0,1.0);
+ polys++;
+ /* bottom */
+ glTexCoord2f(0,0);
+ glVertex3f(-1.0,-1.0,1.0);
+ glTexCoord2f(0,1);
+ glVertex3f(-1.0,-1.0,-1.0);
+ glTexCoord2f(1,1);
+ glVertex3f(1.0,-1.0,-1.0);
+ glTexCoord2f(1,0);
+ glVertex3f(1.0,-1.0,1.0);
+ polys++;
+ glEnd();
+
+ return polys;
+}
+
+
+/*
+ * Draw a box made of lines
+ */
+static int drawbox(boxedstruct *boxed)
+{
+ int polys = 0;
+ /* top */
+ glBegin(GL_LINE_STRIP);
+ glVertex3f(-1.0,1.0,1.0);
+ glVertex3f(-1.0,1.0,-1.0); polys++;
+ glVertex3f(1.0,1.0,-1.0); polys++;
+ glVertex3f(1.0,1.0,1.0); polys++;
+ glVertex3f(-1.0,1.0,1.0); polys++;
+ glEnd();
+ /* bottom */
+ glBegin(GL_LINE_STRIP);
+ glVertex3f(-1.0,-1.0,1.0);
+ glVertex3f(1.0,-1.0,1.0); polys++;
+ glVertex3f(1.0,-1.0,-1.0); polys++;
+ glVertex3f(-1.0,-1.0,-1.0); polys++;
+ glVertex3f(-1.0,-1.0,1.0); polys++;
+ glEnd();
+ /* connect top & bottom */
+ glBegin(GL_LINES);
+ glVertex3f(-1.0,1.0,1.0);
+ glVertex3f(-1.0,-1.0,1.0); polys++;
+ glVertex3f(1.0,1.0,1.0);
+ glVertex3f(1.0,-1.0,1.0); polys++;
+ glVertex3f(1.0,1.0,-1.0);
+ glVertex3f(1.0,-1.0,-1.0); polys++;
+ glVertex3f(-1.0,1.0,-1.0);
+ glVertex3f(-1.0,-1.0,-1.0); polys++;
+ glEnd();
+ return polys;
+}
+
+
+
+/*
+ * Draw ball
+ */
+static int drawball(boxedstruct *gp, ball *b, int wire)
+{
+ int polys = 0;
+ int i,pos,cnt;
+ GLint *spherei = gp->spherei;
+ vectorf *spherev = gp->spherev;
+ GLfloat col[3];
+
+ glPushMatrix();
+
+ glTranslatef(b->loc.x,b->loc.y,b->loc.z);
+ glScalef(b->radius,b->radius,b->radius);
+ glColor3f(b->color.x,b->color.y,b->color.z);
+ col[0] = b->color.x;
+ col[1] = b->color.y;
+ col[2] = b->color.z;
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, col);
+ col[0] *= 0.5;
+ col[1] *= 0.5;
+ col[2] *= 0.5;
+ glMaterialfv(GL_FRONT, GL_EMISSION,col);
+
+ if (!gp->gllists[GLL_BALL]) {
+ glNewList(gp->listobjects + GLL_BALL,GL_COMPILE);
+ glBegin(wire ? GL_LINES : GL_TRIANGLES);
+ cnt = SPHERE_INDICES/3;
+ for (i=0; i<cnt; i++) {
+ pos = i * 3;
+ glNormal3f(spherev[spherei[pos+0]].x,spherev[spherei[pos+0]].y,spherev[spherei[pos+0]].z);
+ glVertex3f(spherev[spherei[pos+0]].x,spherev[spherei[pos+0]].y,spherev[spherei[pos+0]].z);
+ glNormal3f(spherev[spherei[pos+1]].x,spherev[spherei[pos+1]].y,spherev[spherei[pos+1]].z);
+ gp->list_polys[GLL_BALL]++;
+ glVertex3f(spherev[spherei[pos+1]].x,spherev[spherei[pos+1]].y,spherev[spherei[pos+1]].z);
+ if (wire)
+ glVertex3f(spherev[spherei[pos+1]].x,spherev[spherei[pos+1]].y,spherev[spherei[pos+1]].z);
+ glNormal3f(spherev[spherei[pos+2]].x,spherev[spherei[pos+2]].y,spherev[spherei[pos+2]].z);
+ glVertex3f(spherev[spherei[pos+2]].x,spherev[spherei[pos+2]].y,spherev[spherei[pos+2]].z);
+ gp->list_polys[GLL_BALL]++;
+ }
+ glEnd();
+ glEndList();
+ gp->gllists[GLL_BALL] = 1;
+ } else {
+ glCallList(gp->listobjects + GLL_BALL);
+ polys += gp->list_polys[GLL_BALL];
+ }
+
+ glPopMatrix();
+ return polys;
+}
+
+
+/*
+ * Draw a single triangle
+ */
+static void drawtri(triman *t, int wire, int i)
+{
+ const vectorf *spherev = t->vertices + i*3;
+ const vectorf *loc = &t->tris[i].loc;
+
+ glNormal3f(t->normals[i].x,t->normals[i].y,t->normals[i].z);
+ glVertex3f(spherev[0].x+loc->x,spherev[0].y+loc->y,spherev[0].z+loc->z);
+ glVertex3f(spherev[1].x+loc->x,spherev[1].y+loc->y,spherev[1].z+loc->z);
+ if (wire)
+ glVertex3f(spherev[1].x+loc->x,spherev[1].y+loc->y,spherev[1].z+loc->z);
+ glVertex3f(spherev[2].x+loc->x,spherev[2].y+loc->y,spherev[2].z+loc->z);
+ if (wire) {
+ glVertex3f(spherev[2].x+loc->x,spherev[2].y+loc->y,spherev[2].z+loc->z);
+ glVertex3f(spherev[0].x+loc->x,spherev[0].y+loc->y,spherev[0].z+loc->z);
+ }
+}
+
+
+/*
+ * Draw all triangles in triman
+ */
+static int drawtriman(triman *t, int wire)
+{
+ int polys = 0;
+ int i;
+ GLfloat col[3];
+
+ glPushMatrix();
+ glColor3f(t->color.x,t->color.y,t->color.z);
+ col[0] = t->color.x;
+ col[1] = t->color.y;
+ col[2] = t->color.z;
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, col);
+ col[0] *= 0.3;
+ col[1] *= 0.3;
+ col[2] *= 0.3;
+ glMaterialfv(GL_FRONT, GL_EMISSION,col);
+ glBegin(wire ? GL_LINES : GL_TRIANGLES);
+
+ for (i=0; i<t->num_tri; i++) {
+ if (t->tris[i].gone > 3) { continue; }
+ if (t->tris[i].gone > 0) {
+ glColor3f(t->color.x,t->color.y,t->color.z);
+ col[0] = 1.0f;
+ col[1] = 1.0f;
+ col[2] = 1.0f;
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, col);
+ col[0] *= 0.8;
+ col[1] *= 0.8;
+ col[2] *= 0.8;
+ glMaterialfv(GL_FRONT, GL_EMISSION,col);
+
+ drawtri(t, wire, i);
+ polys++;
+
+ glColor3f(t->color.x,t->color.y,t->color.z);
+ col[0] = t->color.x;
+ col[1] = t->color.y;
+ col[2] = t->color.z;
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, col);
+ col[0] *= 0.3;
+ col[1] *= 0.3;
+ col[2] *= 0.3;
+ glMaterialfv(GL_FRONT, GL_EMISSION,col);
+
+ t->tris[i].gone++;
+ continue;
+ }
+
+ drawtri(t, wire, i);
+ polys++;
+ }
+ glEnd();
+ glPopMatrix();
+ return polys;
+}
+
+/*
+ * draw floor pattern
+ */
+static int drawpattern(boxedstruct *gp)
+{
+ int polys = 0;
+ if (!gp->gllists[GLL_PATTERN]) {
+ glNewList(gp->listobjects + GLL_PATTERN, GL_COMPILE);
+
+ glBegin(GL_LINE_STRIP);
+ glVertex3f(-25.0f, 0.0f, 35.0f);
+ glVertex3f(-15.0f, 0.0f, 35.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-5.0f, 0.0f, 25.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(5.0f, 0.0f, 25.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(15.0f, 0.0f, 35.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(25.0f, 0.0f, 35.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(35.0f, 0.0f, 25.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(35.0f, 0.0f, 15.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(25.0f, 0.0f, 5.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(25.0f, 0.0f, -5.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(35.0f, 0.0f, -15.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(35.0f, 0.0f, -25.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(25.0f, 0.0f, -35.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(15.0f, 0.0f,-35.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(5.0f, 0.0f, -25.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-5.0f, 0.0f, -25.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-15.0f, 0.0f,-35.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-25.0f, 0.0f,-35.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-35.0f, 0.0f, -25.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-35.0f, 0.0f, -15.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-25.0f, 0.0f, -5.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-25.0f, 0.0f, 5.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-35.0f, 0.0f, 15.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-35.0f, 0.0f, 25.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-25.0f, 0.0f, 35.0f); gp->list_polys[GLL_PATTERN]++;
+ glEnd();
+
+ glBegin(GL_LINE_STRIP);
+ glVertex3f(-5.0f, 0.0f, 15.0f);
+ glVertex3f(5.0f, 0.0f, 15.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(15.0f, 0.0f, 5.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(15.0f, 0.0f, -5.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(5.0f, 0.0f, -15.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-5.0f, 0.0f, -15.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-15.0f, 0.0f, -5.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-15.0f, 0.0f, 5.0f); gp->list_polys[GLL_PATTERN]++;
+ glVertex3f(-5.0f, 0.0f, 15.0f); gp->list_polys[GLL_PATTERN]++;
+ glEnd();
+
+ glEndList();
+ gp->gllists[GLL_PATTERN] = 1;
+ } else {
+ glCallList(gp->listobjects + GLL_PATTERN);
+ polys += gp->list_polys[GLL_PATTERN];
+ }
+
+ return polys;
+}
+
+
+/*
+ * main rendering loop
+ */
+static void draw(ModeInfo * mi)
+{
+ boxedstruct *gp = &boxed[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME (mi);
+ vectorf v1,v2;
+ GLfloat r;
+ int dx, dz;
+ int i;
+
+ GLfloat dgray[4] = {0.3f, 0.3f, 0.3f, 1.0f};
+ GLfloat black[4] = {0.0f, 0.0f, 0.0f, 1.0f};
+ GLfloat lblue[4] = {0.4f,0.6f,1.0f };
+
+ GLfloat l0_ambient[] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat l0_specular[] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat l0_diffuse[] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat l0_position[] = {0.0, 0.0, 0.0, 1.0}; /* w != 0 -> positional light */
+ GLfloat l1_ambient[] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat l1_specular[] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat l1_diffuse[] = {0.5, 0.5, 0.5, 1.0};
+ GLfloat l1_position[] = {0.0, 1.0, 0.0, 0.0}; /* w = 0 -> directional light */
+
+ mi->polygon_count = 0;
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity();
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ glRotatef(o, 0, 0, 1);
+ }
+# endif
+
+ gp->tic += 0.01f;
+ gp->camtic += 0.01f + 0.01f * sin(gp->tic * speed);
+
+ /* rotate camera around (0,0,0), looking at (0,0,0), up is (0,1,0) */
+ r = CAMDISTANCE_MIN + (CAMDISTANCE_MAX - CAMDISTANCE_MIN) + (CAMDISTANCE_MAX - CAMDISTANCE_MIN)*cos((gp->camtic/CAMDISTANCE_SPEED) * speed);
+ v1.x = r * sin((gp->camtic/gp->cam_x_speed) * speed);
+ v1.z = r * cos((gp->camtic/gp->cam_x_speed) * speed);
+ v1.y = CAM_HEIGHT * sin((gp->camtic/gp->cam_y_speed) * speed) + 1.02 * CAM_HEIGHT;
+
+ v2.x = LOOKAT_R * sin((gp->camtic/(gp->cam_x_speed * 5.0f)) * speed);
+ v2.z = LOOKAT_R * cos((gp->camtic/(gp->cam_x_speed * 5.0f)) * speed);
+ v2.y = (CAM_HEIGHT * sin((gp->camtic/gp->cam_y_speed) * speed) + 1.02 * CAM_HEIGHT)/10.0;
+
+ gluLookAt(v1.x,v1.y,v1.z,v2.x,v2.y,v2.x,0.0,1.0,0.0);
+
+ if (!wire) {
+ glLightfv(GL_LIGHT0, GL_AMBIENT, l0_ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, l0_diffuse);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, l0_specular);
+ glLightfv(GL_LIGHT0, GL_POSITION, l0_position);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, l1_ambient);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, l1_diffuse);
+ glLightfv(GL_LIGHT1, GL_SPECULAR, l1_specular);
+ glLightfv(GL_LIGHT1, GL_POSITION, l1_position);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+
+ glFrontFace(GL_CW);
+
+ glMaterialfv(GL_FRONT, GL_SPECULAR, black);
+ glMaterialfv(GL_FRONT, GL_EMISSION, lblue);
+ glMaterialfv(GL_FRONT,GL_AMBIENT,black);
+ glMaterialf(GL_FRONT, GL_SHININESS, 5.0);
+ }
+
+
+ /* draw ground grid */
+ /* glDisable(GL_DEPTH_TEST); */
+ glDisable(GL_LIGHTING);
+
+ glColor3f(0.1,0.1,0.6);
+ for (dx= -2; dx<3; dx++) {
+ for (dz= -2; dz<3; dz++) {
+ glPushMatrix();
+ glTranslatef(dx*30.0f, 0.0f, dz*30.0f);
+ drawpattern(gp);
+ glPopMatrix();
+ }
+ }
+
+ /* Set drawing mode for the boxes */
+ glEnable(GL_DEPTH_TEST);
+ if (!wire) glEnable(GL_TEXTURE_2D);
+ glPushMatrix();
+ glColor3f(1.0,1.0,1.0);
+ glScalef(20.0,0.25,20.0);
+ glTranslatef(0.0,2.0,0.0);
+ mi->polygon_count += drawfilledbox(gp, wire);
+ glPopMatrix();
+ glDisable(GL_TEXTURE_2D);
+
+ glPushMatrix();
+ glColor3f(0.2,0.5,0.2);
+ glScalef(20.0,20.0,0.25);
+ glTranslatef(0.0,1.0,81.0);
+ mi->polygon_count += drawbox(gp);
+ glPopMatrix();
+
+ glPushMatrix();
+ glColor3f(0.2,0.5,0.2);
+ glScalef(20.0,20.0,0.25);
+ glTranslatef(0.0,1.0,-81.0);
+ mi->polygon_count += drawbox(gp);
+ glPopMatrix();
+
+ glPushMatrix();
+ glColor3f(0.2,0.5,0.2);
+ glScalef(.25,20.0,20.0);
+ glTranslatef(-81.0,1.0,0.0);
+ mi->polygon_count += drawbox(gp);
+ glPopMatrix();
+
+ glPushMatrix();
+ glColor3f(0.2,0.5,0.2);
+ glScalef(.25,20.0,20.0);
+ glTranslatef(81.0,1.0,0.0);
+ mi->polygon_count += drawbox(gp);
+ glPopMatrix();
+
+ if (!wire) {
+ glEnable(GL_LIGHTING);
+
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, dgray);
+ glMaterialfv(GL_FRONT, GL_EMISSION, black); /* turn it off before painting the balls */
+ }
+
+ /* move the balls and shrapnel */
+ updateballs(&gp->bman);
+
+ glFrontFace(GL_CCW);
+ for (i=0;i<gp->bman.num_balls;i++) {
+ if (gp->bman.balls[i].justcreated) {
+ gp->bman.balls[i].justcreated = FALSE;
+ freetris(&gp->tman[i]);
+ }
+ if (gp->bman.balls[i].bounced) {
+ if (gp->tman[i].vertices == NULL) {
+ createtrisfromball(&gp->tman[i],gp->spherev,gp->spherei,SPHERE_INDICES,&gp->bman.balls[i]);
+ } else {
+ updatetris(&gp->tman[i]);
+ }
+ glDisable(GL_CULL_FACE);
+ mi->polygon_count += drawtriman(&gp->tman[i], wire);
+ if (!wire) glEnable(GL_CULL_FACE);
+ } else {
+ mi->polygon_count += drawball(gp, &gp->bman.balls[i], wire);
+ }
+ }
+
+ glFlush();
+}
+
+
+
+/*
+ * new window size or exposure
+ */
+ENTRYPOINT void reshape_boxed(ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0, y, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(50.0,1/h,2.0,1000.0);
+ glMatrixMode (GL_MODELVIEW);
+
+ glLineWidth(1);
+ glPointSize(1);
+}
+
+
+static void
+pinit(ModeInfo * mi)
+{
+ boxedstruct *gp = &boxed[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME (mi);
+ ballman *bman;
+ int i,texpixels;
+ char *texpixeldata;
+ char *texpixeltarget;
+
+ glShadeModel(GL_SMOOTH);
+ glClearDepth(1.0);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /* Load configuration */
+ setdefaultconfig(&gp->config);
+
+ /* give the decay parameter a better curve */
+ if (gp->config.decay <= 0.8182) { gp->config.decay = gp->config.decay / 3; }
+ else { gp->config.decay = (gp->config.decay - 0.75) * 4; }
+
+ bman = &gp->bman;
+
+ bman->balls = (ball *)malloc(gp->config.numballs * sizeof(ball));
+ bman->num_balls = gp->config.numballs;
+ bman->ballsize = gp->config.ballsize;
+ bman->explosion = gp->config.explosion;
+
+ gp->tman = (triman *)malloc(bman->num_balls * sizeof(triman));
+ memset(gp->tman,0,bman->num_balls * sizeof(triman));
+
+ for(i=0;i<bman->num_balls;i++) {
+ gp->tman[i].explosion = (float) (((int)gp->config.explosion) / 15.0f );
+ gp->tman[i].decay = gp->config.decay;
+ gp->tman[i].momentum = gp->config.momentum;
+ gp->tman[i].vertices = NULL;
+ gp->tman[i].normals = NULL;
+ gp->tman[i].tris = NULL;
+ createball(&bman->balls[i]);
+ bman->balls[i].loc.y *= rnd();
+ }
+
+ generatesphere(gp);
+
+ if (!wire) {
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_LIGHTING);
+ }
+
+ /* define cam path */
+ gp->cam_x_speed = 1.0f/((float)gp->config.camspeed/50.0 + rnd()*((float)gp->config.camspeed/50.0));
+ gp->cam_z_speed = 1.0f/((float)gp->config.camspeed/50.0 + rnd()*((float)gp->config.camspeed/50.0));
+ gp->cam_y_speed = 1.0f/((float)gp->config.camspeed/250.0 + rnd()*((float)gp->config.camspeed/250.0));
+ if (rnd() < 0.5f) gp->cam_x_speed = -gp->cam_x_speed;
+ if (rnd() < 0.5f) gp->cam_z_speed = -gp->cam_z_speed;
+
+ /* define initial cam position */
+ gp->tic = gp->camtic = rnd() * 100.0f;
+
+ /* define tex1 (bottom plate) */
+ gp->tex1 = (char *)malloc(3*width*height*sizeof(GLuint));
+ texpixels = 256*256; /*width*height;*/
+ texpixeldata = header_data;
+ texpixeltarget = gp->tex1;
+ for (i=0; i < texpixels; i++) {
+ HEADER_PIXEL(texpixeldata,texpixeltarget);
+ texpixeltarget += 3;
+ }
+
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+ clear_gl_error();
+#if 0
+ i = gluBuild2DMipmaps(GL_TEXTURE_2D, 3, 256, 256,
+ GL_RGB, GL_UNSIGNED_BYTE, gp->tex1);
+ if (i)
+ {
+ const char *s = (char *) gluErrorString (i);
+ fprintf (stderr, "%s: error mipmapping texture: %s\n",
+ progname, (s ? s : "(unknown)"));
+ exit (1);
+ }
+ check_gl_error("mipmapping");
+#else
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0,
+ GL_RGB, GL_UNSIGNED_BYTE,
+ gp->tex1);
+ check_gl_error("texture");
+#endif
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+}
+
+
+
+ENTRYPOINT void
+init_boxed(ModeInfo * mi)
+{
+ int screen = MI_SCREEN(mi);
+
+ /* Colormap cmap; */
+ /* Boolean rgba, doublebuffer, cmap_installed; */
+ boxedstruct *gp;
+
+ MI_INIT(mi, boxed);
+ gp = &boxed[screen];
+ gp->window = MI_WINDOW(mi);
+
+ if ((gp->glx_context = init_GL(mi)) != NULL) {
+ reshape_boxed(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ if (!glIsList(gp->listobjects)) {
+ gp->listobjects = glGenLists(3);
+ gp->gllists[0] = 0;
+ gp->gllists[1] = 0;
+ gp->gllists[2] = 0;
+ }
+ pinit(mi);
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+
+ENTRYPOINT void
+draw_boxed(ModeInfo * mi)
+{
+ boxedstruct *gp = &boxed[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!gp->glx_context)
+ return;
+
+ glDrawBuffer(GL_BACK);
+
+ glXMakeCurrent(display, window, *(gp->glx_context));
+ draw(mi);
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers(display, window);
+}
+
+ENTRYPOINT void
+free_boxed(ModeInfo * mi)
+{
+ boxedstruct *gp = &boxed[MI_SCREEN(mi)];
+ int i;
+
+ if (gp->glx_context) {
+ /* Display lists MUST be freed while their glXContext is current. */
+ glXMakeCurrent(MI_DISPLAY(mi), gp->window, *(gp->glx_context));
+
+ if (glIsList(gp->listobjects))
+ glDeleteLists(gp->listobjects, 3);
+
+ for (i=0;i<gp->bman.num_balls;i++) {
+ if (gp->bman.balls[i].bounced) freetris(&gp->tman[i]);
+ }
+ free (gp->bman.balls);
+ free (gp->tman);
+ free (gp->tex1);
+
+
+ }
+}
+
+
+XSCREENSAVER_MODULE ("Boxed", boxed)
+
+/*********************************************************/
+
+#endif
diff --git a/hacks/glx/boxed.h b/hacks/glx/boxed.h
new file mode 100644
index 0000000..fd9b5e1
--- /dev/null
+++ b/hacks/glx/boxed.h
@@ -0,0 +1,4116 @@
+/* GIMP header image file format (RGB-only): /home/shag/build/xscreensaver-3.33/hacks/glx/thebox.h */
+
+static unsigned int width = 256;
+static unsigned int height = 256;
+
+/* Call this macro repeatedly. After each use, the pixel data can be extracted */
+
+#define HEADER_PIXEL(data,pixel) \
+ pixel[0] = (((data[0] - 33) << 2) | ((data[1] - 33) >> 4)); \
+ pixel[1] = ((((data[1] - 33) & 0xF) << 4) | ((data[2] - 33) >> 2)); \
+ pixel[2] = ((((data[2] - 33) & 0x3) << 6) | ((data[3] - 33))); \
+ data += 4;
+
+# ifdef __GNUC__
+ __extension__ /* don't warn about "string length is greater than the length
+ ISO C89 compilers are required to support" when including
+ the following constant data... */
+# endif
+static char *header_data =
+ "!FY'\"&Q#!&M!!VM-!6Y(!&M##6Q&\"69%\"FU'!FE!!VM$!VI$!&M!!FM#!VU&!'!!"
+ "\"&M%#&M!\"6Q$\"')#!FY#\"FY%\"6Y\"\"&Y#\"6]$\"&U!\"G%!\"7%&!G)!!'-!!')!\"'=!"
+ "!G!##G5\"\"75$\"W9#!G5#!G9!!WA$#'=\"!GE#\"'A%#GI$!GI!#'A!!'E##GQ&%7Q#"
+ "#WU%#W=%\"W]#\"GY\"%WQ)%7Y\"\"H-!\"W]&\"8!$%8%#$8-&\"8%!#81%$85)#H!##H-&"
+ "$H1(#H)#\"X5#$XA%\"X9##H9#\"89#\"89!\"HA\"\"8A!\"8A!\"X=#$8E&#(I!\"8I&$HM!"
+ "#8I%\"8M!!HM#!HM!!HU!$(M($8Q)!H])!XQ!\"8Y!$(]'$(Y'$8Q(\"XY%#XQ#\"I!$"
+ "\"XY\"#Y)##)%#%(]%$Y!!#I%\"\")!%#Y!$#9%!#8]!#I%\"$)%$%HY%#HU\"$91($9-("
+ "$))$#95!%8]&!9-\"$X](\")!#!)%!%)-\"#9-$#)-&#I5\"$Y%!#)-)\"I-!#91!\"Y-\""
+ "\"(]\"$I-'#IA\"\"I-!#Y-&#)-##Y-##)1#!I-##)-#\"H]!#)5#\"Y-\"!)-!\"Y!&$)-!"
+ "#)1#\"Y%##(]!$9-)\"I)!#)1#$Y%'\"XY\"\"91#!)1!#I)\"$)%%%(]&#HY\"#(]!#I)\""
+ "&8]%!(]!\"Y!##H]%#X]!#)%##(Y&\"I)!$X]!#Y!#\"(Y\"\"HY!#Y%'\"8Y!%(]+#XQ&"
+ "\"8M#!XQ$\"Y%%\"8M!#XU!#HI\"$XQ$#XI&\"HI!#8A\"$8E\"#(5!#8A$$(A%\"8=#$(5("
+ "#X='$89##H=\"#(=!\"XA#\"(-#\"H1\"\"81!\"8-!!(5!\"X-##8!#\"H1%$(!&#X1&%X1$"
+ "#(%$\"G]\"!8%\"\"7M!\"7U!#'Y$\"7M!#7Y##GI$#WI%!'M#\"7A!\"GI\"!G9!!GI&!GE!"
+ "\"GE%!W=\"!'E#\"W!\"!G%%!W5&!G9!!W)\"\"'-#!7-'\"V]&!W1\"\"'%\"\"'%#\"&]\"!'1%"
+ "\"&Y##FQ%!&U!\"FU!\"&Q#!&I!!FU#!&Y!!6M\"!FM%!FI!!&M!!VM\"!VM\"!FI%\"6Q$"
+ "!&E#!VQ&!&E!\"FM!\"FM#!&Q!\"&I%#&I%\"&M*\"VM(!6U\"!6A\"!&I'!FM#!FM!\"6M\""
+ "!FE##FU%#V]$\"&Y#\"FY!\"F]%!F]!!V]\"!G1!\"7%\"#75(!G%!\"71$\"'-#\"'1!!G5&"
+ "!W5$!G=!\"7)\"\"G=%\"7M#\"GM'!WA\"!'A!#7A*\"7I!#7Q&#X!*$'I!#'I\"$'U(\"7U!"
+ "#7Y%!GY!#GY&\"7]!!H)!$H!+\"WY##X!'#X%'\"H1!\"()#\"H=\"\"X1(%X-(!H1!#X5!"
+ "\"H5\"$8-&%X5'\"8-!#X-'\"XE%#H=&#XA'#XA$\"XE#\"XE#\"H=!#HE%\"XI\"!HM##(I'"
+ "\"8A!#H=#\"H]!#(Q#\"8Q##(Y#!HE#\"HU!\"))%$(Y$#(Q#$H]&#X]!#X]#\"HU!!)%!"
+ "\"Y!\"#I!&$)%%$)%$#Y-#$XQ*#95!#9)!&9%($)1'!Y)!\"Y-\"#9)$%I%'#)-#\"I-!"
+ "$9)(!YA'&)-*!I%#!Y5!#Y)#%I-$$I5#\"Y1%#I)%#YA&$I1)#))#!Y5!#9-$#)1#"
+ "\"I1!\"I1!!)1$\"I-!#I1%\"Y!#\"H]!#I)%#9)!#))#$9)&#9-$$)='#Y1##I9\"!Y1$"
+ "$)-'#Y)##I-%#99$!)-!#)-&!)-'$Y-+!9-\"%9)#\"X]\"$))'\"9=#$Y)!#Y%#$Y%("
+ "!I%&#Y!##(]!$I!'#9!!%I)!!Y!\"$H]#\"9!##8I(#8]$$(Y'\"I-!$8U##(Q##8I$"
+ "$(U'!HU#$HU!#(Q!%(I)#H](#HU\"$(E(\"XM\"\"HI!\"XA#\"HE!\"(I%&(A(#HE%#XI!"
+ "#H9##8=!\"HA$$8=#!H1##(=!%(1&\"H1!#85%\"X1#\"8-!$(-#\"8-!\"X-\"\"X%#\"X%!"
+ "!H!#!H!!#8-%!'I!\"8%!\"GY%$7M)\"GM\"!'M!\"GU\"\"WU#\"WM!\"'I#\"8!!!75\"\"'I#"
+ "\"79+\"G5\"\"'5!!GA#\"'-\"#'=\"!G%!#')'\"'=,!W5$\"'-#\"G!#\"')#\"'%#\"6U#!W!\""
+ "\"6]#\"G!%#'!$!VU\"!&Q!\"&Q#\"6]$!FM!!&]##&Q'!&Q!!6M$!6M&!&I!!69\"!G!#"
+ "\"6I$!&E!!6Y\"!FI#!6M&!&M!!F='!&Q&!&M!!VE$!VI$\"&I'!6M\"\"&I#!FE!\"6E&"
+ "#&Y%\"W)(!VU\"\"G!)!FU!#V]&!G9!!79&\"G-\"\"7)$!G1!\"G-$!W5\"\"71$\"'5#\"'5!"
+ "!71\"\"'1\"!G9!!7A%\"'A#!G1&\"GI$\"'A!#7I%\"'E'#H!&\"WY#\"WM&$GU%\"']\"!GY!"
+ "!WY!$H!+#W]'\"8!!\"X!#\"'Y#\"W]!!H)##X1'#H-##(5##89\"#H-!\"81!\"89##H1&"
+ "%HE%\"8=!$(9%\"X9\"!X9!\"XA#\"HI$\"XE(#(I#$(Y*$8I(\"8I!#85!#XM!!HM!$8M&"
+ "#(Y##(Q!#XQ!#XY##8Q$#(Q#$9%%#HY%\"X]\"$H]&!H]!\"8Y!!Y5!$I!)'I!'$)!!"
+ "#9%!\"9!$%95#\"9%&#I1(#9)$\"9-#!Y%!\"Y!#\"))\"!HQ!\"I)!$91\"\"I-!#9!!$9))"
+ "!)-'\"I-!$I5##)9#\"I5$#8]!#Y)##)1##)1#\"I9!$I-##9=!\"YA%$9-%\")5%\"I)!"
+ "\"I5!$)-'$)1!\"9=#$Y5!\"Y)\"#Y5&!)A!\"Y-\"#I=!#91$#I%\"#)-#%I5!#)5##9)$"
+ "#)1&!9-\"#91$\"I1!\"I1$\"Y9\"#I)%!I-#!I-##)-#\"I-!\"Y5\"#I)\"!))$\"))\"!)%!"
+ "!X]!$)!(\"Y%#$9%\"#I%\"#I)\"$Y-'#I%#\"I!!#Y-##I%)!Y%!\"8]!#I-%#)%#$(Y'"
+ "$)%%#XY#\"I!!\"8]!#(U#\"HA$#HU\"&HQ)&(Q*\"HU!#8M$\"8M!#8Q$#8Q$$(E(\"8E#"
+ "#(A#\"HA!%85'#(=!%(=#\"H5\"#H9\"\"89!\"85!\"H-'!H5#\"8=!$85$\"8-!!X)!#'U$"
+ "\"8%!\"8!!$H!$#(1!\"(%#!GU#!WY!\"WU#\"7U!$GU#\"7Q!#GI$\"7M!\"7M#\"GI%\"GI\""
+ "#WE*\"'E#\"WA&#'A'\"'I\"!')!\"G9\"\"W5$#W-#\"'1#\"'-#!7-\"\"&Y%\"G5\"\"'!#!'%#"
+ "\"'%#\"F]'\"VY&!&Q!#&Y\"\"&U!\"&Q#!FQ!\"FQ%$VU*!&E!!FM%!VM&!VM$\"F9)\"&U)"
+ "!&M#!&Q!!&I!!&M!!6Q\"\"6]&!&A!!FQ#!VQ$!6=\"!6Y&!6M\"$6M&#FM)!FQ!\"&Q#"
+ "\"6M,\"6Y$#&]$\"V]*#FY)!F]!!G!!!&]!\"')\"!W)!\"7-&!G5!!'-!\"75#!G5!!G9!"
+ "\"'A#!G5!!GA#\"WA#\"GA)!'E!#'A\"#GU!#WM%#7M%\"7M!#WY'#7Y%\"7Y!\"GM\"#7]%"
+ "\"X)##']$\"8%!#8%$%(=&\"8%!\"8)$$X)#$()#$8%)\"8-!&X1(\"X=\"$H='$(=\"%H1&"
+ "!HE#\"X=#\"89!!X5'$8A##XI&\"8A&#(I!&(Y##HI(#(]#\"8M!#8Q$!HQ!\"HQ!$(Y'"
+ "\"XU\"#9!$$X](\"XM%#HU%\"XQ(#XU&\"8Y!#9-!#8Y$\"8Y!#I!\"\"9)#\"H]!\"8]!#8U!"
+ "$9%##X]!\"X]\"\"I%!$Y!*!I)##9-$$914\")1(#I-%#)-#!))$$)5$$Y1*#91$\"Y1%"
+ "$9=\"!Y9!\"9-#$9%)\"Y5\"&)-&$)5'\"Y%#\"I5!\"I='#)9##99$#)=##I9%\"YI!#)9#"
+ "#)9#%I9.\"II!#Y9#\")=\"\"I9!%)1($Y9$\")E\"#Y9#\"Y9\"!YA$$I9)\"I5!#95$\")5("
+ "$)1'#Y=##Y9&$I5##Y9&\")9\"#Y5##)9##9=$#9-$!Y9!$)A'\"Y-\"&9-+!)-!\"Y-\""
+ "\"I)!\"I-!#91'#))##9)$\"XY\"#9)$#9%!$H]#!I)#%I)!&I%&$9!%%I1!!X]!\"8]!"
+ "\"8]!\"I!\"$HU'!XY!\"XU\"#(Q##(U#%(U)$XE%#8I$!(U#\"8M#\"HU$#(Q!\"HM!#HU\""
+ "!XE$\"8M!\"85!!H9!\"XA\"#(=$\"X=##HI%$89##X5&\"89#!H=&#(1&\"85!\"(5\"#H-%"
+ "$(!&#H)%#(5#\"()#\"8)$!G]#\"']\"#W]'#8!##WY'$X!)#7U#\"WQ#\"7Q!\"WM##'Q!"
+ "\"7I!\"WI#\"G=\"$7E$#W5*\"'=#!G=!$75,#W='\"'5\"!79\"#71(!W%\"\"G%#\"')#\"'%#"
+ "#G%$\"7)$!'!!\"'!#\"G%\"\"&Y#!VU\"!6M\"!FQ!\"6]&!6=\"!F]#!VM$!&U#\"FQ#\"&E#"
+ "!&M#!VI$!VU*\"VU&!6M(!6Q\"\"FQ%#6M$!FQ#!FI#!VM&#6M(\"&M#\"&U#\"&M#!F]&"
+ "!FY(\"6Y$!7)\"#6U\"\"W)&!G!!\"G%##G)'!W)\"!'9!\"7-$#W5#\"'-#\"'9%!W-\"\"'=\""
+ "!'=!\"G9%#7Q##'E$\"GI#%'I'!GE#\"WQ!\"'Q\"\"WM##GY$#WY)\"7Y##8!%#X%!\"X%#"
+ "#H)$\"H%\"%(5!#'Y!$8))#7]%#H-#$81$\"H5\"#89$#(=!#85!$(5($H-$#XM&#89\""
+ "$(E%!(M!#89\"$HM'\"(E\"\"HM!!(I!\"8I!!(I$#8]$#(E#%(Q)$HQ)#XQ'$(U'#8A$"
+ "\"HI!#XY#\"8Y!#(]##9!!#8]$$)!(#Y%$$9%%$9%#%(]\"#9!!\"Y%##Y)##I-\"#8Y-"
+ "\"I1!$9-\"$)5'\"I1!#))#\"I1!!))!#9%$!I)#\"I1!%)5\"\"95##91!$)5$$I5)#95!"
+ "$9=%\"I1!\"YI\"\"I9!#99$\"I9!\"Y5\"#I=%$)9!$I=#$)='!YI!\"I9!%I='!)5!#Y9#"
+ "$I=#!)A$\"I=!#I=%#9=$\"YQ!#)=##)A#\"YA\"\"I5!#I=(#Y9&\"II!!IA#\"9=##Y5#"
+ "#)9#\"I1!\"IE!#Y9&\"YI\"#Y-&\"Y=\"\"I=!#I9%#)9##I9\"$Y1'&9A&#I1%\"I!'#)1#"
+ "\"91#\"Y1\"#Y1&$))$$I5#!I%(\"I!$\"I)!#))#$Y)!#I1\"#I%##8]$#(]!$8Y\"#Y-#"
+ "#HQ(\"XY\"\"I!!#(Y#\"Y1\"#8Y$$(Y(\"HU!\"XM\"#8U$%(I#\"XQ\"\"XY\"#(M!!HI&\"(I\""
+ "#HE#!HI!#HM(#8=$\"X=\"#XE'!(9&\"XE#$X=&#(A'\"81!\"H1!#8=$\"81$$81&#(-$"
+ "#H-%\"8%!#H))$H)\"\"8%!\"X%!#8)%\"']%#(!!\"7U!\"'E#\"WU#!GM!\"GQ\"\"7Q!#WI%"
+ "!WM$\"GA$\"WA!\"WE#!'A!\"'A#!7A\"#GA$!G5!\"G5$\"W5#!G5!!'1!\"W)$\"G5\"#&Y#"
+ "\"'%#\"'%#\"F]##6M!!F]!#6](!G!!\"FU#\"6I$!VQ\"\"FM)!&Q!!&Y!!FM#!&=#\"FM%"
+ "!6U\"!6M$!6M\"!FQ##&E%\"&M*!VM$!6Q\"\"6U(\"6M$\"6Q$\"6E\"!VM\"!FY#!VU$\"&]\""
+ "\"FI%!&U&\"'%#\"'!\"!W!\"!G!!\"W%#\"71$\"'-#\"7%$!G-!!F]!!G=!\"'-\"#GI#\"7A#"
+ "\"7=$!WI\"\"GU\"!GE#\"GU\"#'Q$\"7Y&!'Q#\"W=$#7Y%$GY#\"GY%!G]#\"H)\"\"H!\"\"(!\""
+ "\"7Y!$(%%\"8)$$H-%\"X-\"\"X%#$(-(#H1##81%\"85!#(A#\"89!#(9##H=%#(=!!H=#"
+ "\"XA%\"HE$#H=%!HI!$XQ+#(I#\"8E!#(Q#\"8M#\"XQ\"\"HI$#I%%%9%*#8Y$#(U#%)%\""
+ "\"X]%\"Y-\"\"8Y!\"I!!!Y!$#(U!\"I!!$))!!Y-!%I-+%9%&\"I)!\"I!!\"I-!$)-$#I1\""
+ "\"Y!%#)1#!91\"\"I-!#HY%\"I1!$Y-+#95!$I5&#Y=&#IA%\"I9!#Y9&#I=%\"I9!\"I9!"
+ "#9E#$)M&\"I=!!9=\"$I=#\"Y9%#Y5)$)A!$)=$#I=\"%99\"%II&#Y9##YA#$IA##Y9&"
+ "!)E!\"I5!#9A$$Y=!$9A$\"YM!#IA\"$YI&$IA%#I9\"$YA'#Y=#$)9$#9E!$9=%\"IE!"
+ "\"Y5\"\"I9!\"IQ!#I=%%9I%\"I=!#)M#\"99&!)=!#YE%#99'$I9#$Y5'#)9##)9##)1#"
+ "$I=#\")-%\"Y)\"!I1)'))'\"I-!\"I)!$9-%$)-!#H]%#9)!$I)#\"Y)\"#I!#\"I-!$)!$"
+ "#I%\"#8Y$$8U##(Q#!X]!\"X]%%H]-\"(Y\"\"H]!\"XQ\"#XQ$#(Q&%(Q)#(Q#!HQ!\"8U#"
+ "\"HQ!#XY&\"8Y!!HI&\"X=##(M#!(=!#8E%\"H9\"!H9#$()##8I$%(5&#()!#H9&!(-!"
+ "#8-%#H-%#H9##']$\"8)!\"(%##X%!\"81!!(!$$H)(!(!$\"GY)#WQ'#7U#\"7Y#!GY#"
+ "!'Q!\"WM#!'Q!\"W9#\"'E#!WE!\"GA%\"G=%\"'=#\"G9$!G1!!W5\"!7-\"#71(!W1'\"'%#"
+ "\"F]%!7%'\"&]#!6Y$\"W-&#&]'!FY!\"&Q#\"&M#\"FI%$VY%!6M*\"VM&!&M!!&M#!FM#"
+ "!&Q!!&U%!FM#!6M\"\"6M$!&I!\"&M%!&M!#&U%#&M'!7%$!FQ!\"VY&#&U%\"6Y&!W!$"
+ "!6M$!FY!!&]#\"'%%\"'1\"!G1#\"V]\"\"W1&\"W5(!G9!!G9!!79\"!'5#!'=!\"GA\"!GA#"
+ "!GE!#79\"\"WI!\"'I!#WE#\"GQ\"$'Q##7U#!GQ!\"X)\"\"7Y!\"'Y\"$'Y%!H!!\"8)!#(%$"
+ "$H-%\"(%#%(!$#X-'\"X%#\"H%!#X1$#(5#\"89#\"X9\"#XQ&\"X=#\"89!#X=!#(E#\"HE$"
+ "#HA##(E&#(M#\"XM%$(M!\"HI!$XM(#HQ%#HY%$H]&#)!#$9!+#H]\"%Y!#$(]$%I!+"
+ "\"8]!#9!!#9%!!Y)$#9-!#9-!\")%\"\"I!\"#9-$\"I-!\"I-!\"Y9\"&)9##8]!$91%#)1#"
+ "#9=$\"Y1\"#I9%#Y5##Y5&\"I5!$)='!Y1!#I1($9=(#)9#\"Y9\"\")=\"!YI!!Y=!!Y=!"
+ "#Y%$$YA&#YA\"%9E%#9=!#95!#YA##99!$)5$%Y9%$YA&%9I)$)E$%9E)#)5##9E$"
+ "#YM\"$IE%$YI$#9A!%)E!#9E!#9=!#Y=#$95%&)M\"$I5##I=!$)I$$YA&$IA%$9M!"
+ "#Y5##YA\"$9=\"#YI#$)A$#)A#$)5$&9A.$IA($)1$#9E#\"I=!!I9##)A#!95\"\"II!"
+ "\"99##Y1&!)9!\"Y!##Y=#$Y5.#))#\"(]\"\"I1!\"I5!\"9)#!Y-!$Y%*$))$\"I)$\"I)!"
+ "$)%!$I)##9!!#9!\"$HE!$(]$#8]$\"8Y!#(]##HY%\"8U#!HY!#XU&\"XU\"\"HY!\"89!"
+ "\"8M!#HI##XM'#XA&#8Q$\"XI\"!H5##(9#\"XA#!H5#$X=%\"H9%$X9#%(=#$X5&#(5&"
+ "$H1*%X%'#(-!$(-%#8)%#H-&\"8%!#()$$(!#\"8%!#X%!$']&\"WU#\"W]#\"7U!$'U#"
+ "\"WQ!!GU!#'I$!'I#\"GI\"!GM!\"'I#!'E#\"WM#!W)!#'9&!G9!#'5\"!G5#!')!!7%&"
+ "\"G-%\"W)&!79%\"')#\"7)$\"7-$#&]&\"&U!$6Y%!FQ!!W%!\"FY%!VM\"#6E\"!V]\"\"6M&"
+ "!FU#!&M#!&Q!\"6M(!6M\"!&=#!VM$\"VE(\"VM$!V]\"\"&Q#\"&U#!6U$!FM!!&Y##'%%"
+ "!G%!!W%!\"7%$!')#!')!\"G-%#'1&$'I!!G9#\"79+!75\"\"W9&\"71$\"W-&#'U\"\"7E#"
+ "!WM$!'E#!GU##7I#\"WM(!G]!\"7U!#'A\"\"X!#$7]*#X!'\"8!!\"WI##(!$#H%&!H!#"
+ "$8)$\"X)%#8-'#(5#!H5!!(=!%XE)\"89#!X9$\"H=!\"X=%#H5&\"HE!#(M#%8I'#HE#"
+ "$HY)%(E+\"8]!\"8M!#(Q#\"XY\"!HI&!8I\"$8Y&\"8I!\"HI'\"XU\"#HY%#(])#8Y$#I!#"
+ "#9!!#H]\"#I%\"\"Y-\"!))!$))!$9=%$9-)#I)\"#9-$\"I1'\"I1!%Y=(#))&$95\"#)5#"
+ "$I9)#)5)$I9)&91'\"I5!%Y=$!)='\"Y-\"$Y-!#95!%9=)$IA\"$9=%%)A(#9A!#91!"
+ "$)E#\"IA$#9E!#IE\"\"II!$9E$%)A%%)E$&IE.#)=#$)='$IA\"$)A!#9E!%IM&$)E$"
+ "$)Q#$9I\"$)=!$IA#&9I'#9I$$9I$#9I!$9M!%)A+#IE$\"IE!$IA%%9=\"$9=%$Y=$"
+ "$)I#!)E!#YQ##9E!#YE#&)A(!YA$%)A(#YA#&)A\"&9I&#IE\"$Y=!$9=(\"IA!\"Y1\""
+ "$9)\"!YA!#I9%#)%$#Y%#%95\"\"I)!$)5'\"I1!\"9%$\"I1$#Y)&#)-#$91(\"Y-%%)-%"
+ "\"8]!#99'#)%#%Y%,\"I-!$)!!#9-!#9!\"!Y!!$HY##(U#\"I!$#(Y##(Y#%(]%#XU#"
+ "#(Q#!XQ!#(Q##8I$#HQ%#8Q!#HQ\"\"XE#\"8I!#XE&\"XQ%#X9$\"XA0\"X5#$8-)!H9!"
+ "#(=!\"XE#\"X=#$(1#\"7]#!X1!#8%\"#H)$!(%!#H%&\"H!\"\"X%#$8-'\"H%\"\"7Y!$(!("
+ "\"GQ$\"7E!!H%!#WM'\"7M!#7M#!GI#!WY$\"GA#!WE!!GE!#7I(\"W=!\"G9%\"')(#71$"
+ "#G%\"!'%!\"'A'\"G1\"!G%#!'!!!G!#\"G1#!FU#!FY)#&U%!&U#!VY\"\"VQ$\"FQ%!FM*"
+ "!VM$\"FI'\"&Q#\"&M#$&M)\"6M$!VM$\"&M##&M!\"&U##VU,\"&U!\"&U#\"FU%\"&]#!FY&"
+ "#')%\"G)%!FY!$7-%\"')\"\"G1%!W1(!G5%\"G9$!'9!!G=!\"'=#!G1!!W=\"!GA!\"7I!"
+ "\"7M!$'M(\"7M!\"7I!#WQ%\"WY#$GY%$'U#!7Y\"#W]$\"X!#\"X%#$(%%\"8)!#()!!X-$"
+ "\"X-#&H9'\"H5'!H5!#H)&$8=##89$\"X9#\"X=#\"8A!%8A-#(9#\"HM!#XE##HA&\"(A\""
+ "\"8M!\"HA!!HI!#HQ%#HM&!XQ$$8U##XI#\"8Y!#XY##9%!#Y)&#HY%#9%!!X]$$9!&"
+ "$I%'#)%$%)9%$I!*$Y%!!)-!#Y1#$8](#)9#$I5,\"Y1%#I5%#95!\"I1$$95(%II&"
+ "$)A!\"I9!!)=!\"I=!\"Y5\"$9=%$IA#%9E\"#Y9#$9=+$)=$$)A$!Y=!$YI&#YA\"$Y=#"
+ "$IQ%%IE$&)I,$)I#%9I%#YM#\"II!#YI\"#)Q\"#9I!#YM\"$)I#%IQ)&)I,$9Y!%II#"
+ "#9M!#9M!%IA*%YA$%YQ!$)I#\"YM!#)=#\"IM!#9A!#YM#$9U$#IM\"%)I(%)M!#9E!"
+ "#)I&#)M##Y9#'YI*#II\"#9E!#Y=\"$)E#&9E#%YE+%YE+#9I!#9A!%IQ#%9A\"$)=!"
+ "#99!#Y1#!9=%#)9#%9=\"$)5!\"Y=\"\"Y=\"#I=%\"Y-\"!I%##)1#\"I1!%)=$#))&!(]#"
+ "\"Y1%!I-##9)$#Y-&$91(#Y))#Y)##H]\"$I)#%I!!$X]*#9)!\"X]\"!8U%$8Y\"$(Y$"
+ "\"8U!%HI%!XM!$(Q(\"8M##Y!'#(M&#(I'#(E$\"(U\"!(E!\"HE!!HI!$HA'!H=!\"8-!"
+ "$89#\"HA!#89%#(9#\"81!\"(1\"\"(-\"#(5#$8).$()(\"8%!#7U%\"8!!\"GY$\"7]!#GY&"
+ "\"GY\"\"WU##GQ&!GM#!GI#\"GM\"\"GI\"#7I%\"GE$!WA!\"'A%%'9#\"7=#$'A&\"'9#!W5\""
+ "\"79&!W-\"!G1!!W)!\"G)%!'%##G%\"\"&Y#!VY\"!&]!\"6Y$!FU!!VU\"\"&Q##6]#!FM%"
+ "!FQ!!6Q$!6M$!6Q\"!6E\"\"W!&\"VM$!&I!!VM\"\"VQ##FQ)\"6Y#!W%\"\"7!\"#7)##'!%"
+ "\"'%\"\"'1#\"G%##G-)\"71(\"W1!\"G-%\"79$!W9\"!G9!\"W=##7A#$'E(!'I!\"GU\"\"G=%"
+ "\"W=#\"7=$!GE(\"WU##'U$#'I!#8%%$W](%8)(#'Y&!(!!\"']#\"(-#%'Y$#H-##X-'"
+ "\"X9#\"(5\"#X=#\"8)(\"X=##X5'#X=!\"8=$\"8A!!HE!$XE%!HA!\"8I!$8I)$HE*#8M$"
+ "#8Q2#8Y$$XQ*$HU&\"HM!$(]'\"(U\"#(]#\"H]!\"8]!$Y!!#9%!\"I!!#)1#\"9%$$))%"
+ "#9-!#(]!#))#\"8Q!$9A(\"I5!$99($I-##)I##YE&!I1&$99(#IE$\"I9!$I9\"\"I5!"
+ "\"IQ!\"IE$#9=$#9A!%IE$!YA!$)-$$II%$IE&$YA&$IQ\"$)I!\"IM!#YI#\"II$#9A!"
+ "\"I9!#YM#%9M)#9I#\"II!#9I!#IM\"$I=##)Y#$9I!#IE\"#IM+#YU)#Y=##9Q!#9M!"
+ "#9M!#9I!\"9U#$)Q'%)U'%)Q*$)A!$YU#%9M)#9Q!%IE##9M!#9E$$IQ&$)M#%YE$"
+ "#)M%#IM!!YM$$II##YM#\"IU!$)E#%)A!$)Q$$)I'$II##9I!$IE#$9A!$II&$IE%"
+ "$9A%#YA##IE!$YE*#9=!!)A!#9A'#9=!\"I9!%99#\"95#\")1%\"I-!!Y5!#Y%'$I5)"
+ "$(Y'#91$#9)!$9-%!)!!\"95##9)!\"8Y&%9-#$)!%%)%&\"Y!\"#(]!#(]#\"9!#\"H]$"
+ "$(M%#8M$#(M#$(Q(!XQ!#(Q#\"8U!\"9!##8M$!(=!#8E%\"XI\"#(I##(='\"XA\"\"8=#"
+ "\"8A#!(=!$(9\"\"X=\"$(=\"$(1(\"X%#!8-(#H-&!H%%$8%$\"8-!\"W]#\"8%!#7Q&\"W]#"
+ "#7Y#\"WY!&'E$#7U##'Q$\"7M!\"WQ#\"'A!#7M%!WE\"!WQ\"\"79\"#G=$\"GA%\"G)!!W9\""
+ "\"GM$%7)'#'-&!'-!\"7!$!W-!\"'%#!FU!\"&U#!F]!!W!\"\"&U#\"&Q#!FU#\"FU!\"&I)"
+ "!FM!!6M\"!&]!!&=!!&M!#6M\"\"6]$$&Q'#6Y(!&U!\"&M#!F]!\"6Y#\"6Y$#'!'\"'1#"
+ "!G)!!')$!'-#\"G-%#G5'!G5#!GE!\"'=##G9\"\"W=%!GA%\"7A!!'M#\"WM!\"GA#\"GU\""
+ "$GY*\"7Y!\"WY!#7Q\"#8!%\"7]!#']!!WY&\"7U!\"7U!$(-%\"X!##H)#$(!*#H9&$X-\""
+ "#X-!#85\"#H)&\"X9#\"H5!#(='\"8E!!H9!$8A##(Q#$8M##XI&\"8=!!)!$#HI#!XQ!"
+ "$HU$\"(Y%\"XU\"!X]!#(U!$I1##I!&#)!&$))$#8]!$9%#'I%'\"I)$!I-##9)!$I9#"
+ "!Y)!!Y-!\"I1!\"I1!#))#$I5&\"I5!!I5#%I9#\"Y9%#)=&#Y9&\"II!\"I=!$I1&$YE#"
+ "$9I%')5*#9E!!YE!$IE&$IE%&YQ($IE#$YM#%)I/$9M!$YA$$IE##YM##YU\"%)U'"
+ "\"IM$$IQ)#II!%YM.#9Q!$)Y##IM!$IQ&$IU\"$)U##9Q!$IQ&#YQ##9Q!$)U#$)Q#"
+ "\"IU!$YQ##YQ#$9Q!\"II!$)M$')Q*$9I!$)M#$II%#YQ#'9I(#IU!$YY&\"Z!\"#9U!"
+ "#YQ#!YE!$)U#\"IU##9I!$YI$$9M$#9M!%IQ'$IM\"#YI#%)5!#9M!#II\"#YI#%9E)"
+ "#YE#\"IE!%9M)%9=*$99%#YI#\"YA\"$Y1!#Y=##99!#9=$\"9I&$9=%$Y5*#)9#\"Y=\""
+ "%9E)#)1#&)5##I1%$)5*%Y)\"$9-(#X]&!Y)!#(Y&#I!\"$I)'$))!$9!%#I%\"\"8]!"
+ "\"X]\"\"I%!$I!##(U&\"HU!#(U#!XY$#8U$#9!$\"8E!\"(Y.#XI'$(I!#(A!#(M!\"XE#"
+ "#(A##8=$%(=)\"X9##X9!$(1&#(5#\"89!#(1$$()%\"()%#8)%%8%#\"H!\"\"8!!$'Y%"
+ "#7]%$(-#\"7Y!#(%$#7U##WU\"#7M%#'E+\"GE\"\"GE\"!GE!\"'E#\"'9!$'=&\"'9\"#'9+"
+ "\"'E#\"W5#\"'1'\"71&!71$\"&U#\"'-!\"&Y#\"W%$\"G%!!F]!\"F]#!&]#!FU!\"&U#!6Q'"
+ "!VQ$!VM\"\"VQ*!&Q!\"6M$\"&U#\"&I!\"&U#!G!!\"&]'!V]\"\"W!&!G!!!71\"!')!!')!"
+ "\"'-\"\"'-!\"'-#!'!%\"W1##GI#!'5!!GI!!'E!\"G=%!WE)\"7=$#7I!!WM\"#'M$\"'M\""
+ "$7Y$\"GE#!X%$\"GY\"\"7]!\"8!!\"89!\"(!%#(%'\"H)\"\"8)#$X1&#X%$\"X1#\"(-($(1#"
+ "#X5!\"89##89%#85%!8=\"\"H5\"$HA!#8=$%8]#\"XE\"\"XI\"\"(I\"#XE!#(Q##HI%!HU!"
+ "\"HQ!\"8Y)!HM#\"8]!\"8U!\"X]\"$9%%%Y9!\"Y!\"$)%%$Y!'\"Y=\"$))!#Y-#$I-)\"I-!"
+ "$Y1*\"Y1\"\"95#$)1'\"I5$#95$#95$\"I9!#)9#\"I=!%)=(\"I9$#IE\"!Y-$#9A!#9I!"
+ "#I9\"#IE%\"I5!#)I#\"IM$$II&$9U$#)A#$IQ&&IM(%)M!%9E&#9Q!#YQ#$YQ'%)Q!"
+ "%9Q($YY#%9Y\"&)Q(&IM$%)Y'!YU$#YM#%)U($9U($9U$%9Q($9U!&YY%%)Y$$9U$"
+ "\"IU'\"9M#%YE!#)]#!YQ!$YM##I]!&Y]$#)Y&\"YU$$)Y##II\"#9Q!%IU&\"9Y##IY!"
+ "&9M-#YQ&$Y]&$YQ'$YQ##9Q!\"YQ!#9U!#9Q!\"YQ\"$IM&$)A-#YI\"#9Q!$II%#IM$"
+ "\")A%\"YM\"#9I!$Y=!$9E\"$)5$#YA#%)9%!YA!#9=!#9A!#99!#)A#%IY*\"I9!\"Y9\""
+ "!Y-!\"I9!&)=&!)1!!91+\"I1!#91$#I5\"#I-%$H]##9)!#))#\"I1!\"Y-\"$9%&\"I)!"
+ "$8U\"#(]#!(]!\"I%!#8U$\"8Y!#XU&#HE#$HQ&#HQ%#(Q##(M#$HI'#(I##(U##(E$"
+ "\"X=#$XA(\"8=##(9#\"(9%\"X5\"!H5#\"X5\"#89%#85$$(!(#8-*!G]#!X!$\"X%\"#8)%"
+ "\"X!#\"GY'!'U!\"7U!\"7U!!']#\"WQ#!WQ!$'U##7I!\"7E!!GE!#WA%\"'A*\"'A#!79\""
+ "\"75(\"W9#\"G5%!W5$!G=%\"7-$#')'!G)!#7)&!G-%$7!#\"&Q#\"7%$\"FY%#FU\"#FA#"
+ "!&M!!&M!!VI$#&M#\"FQ!!&M!!G%!!6U$!FU!\"&Y#\"&]#\"'!\"!F]!!G!!!W)\"#W!!"
+ "\"'-##'1&!'1!!G9!!G5!\"7A!!GI!\"7A$\"7Q#\"7A$\"W9!#7Q%\"7Q!#'U$$'Q&\"GQ\""
+ "!'M!\"7Y!\"7Y!\"7]$\"7]!\"'Y##'Y$!X%!\"X)&#8-%$(9(#8-%#H9#!(I$#85%#(E$"
+ "#89$#H=%!HA##(I#\"XA%#(A#$89!\"(I\"\"HI$!(I)\"Y!#$8Q(#HQ&&HM*#(Q#!HM!"
+ "$(Y!!Y!'#)!##X]&\"9)#$9)\"#XU#!Y%$!Y)!$)1'!X]'$91%\"I-!$Y1!\")-\"\"9%#"
+ "\")5\"$I1)#IE%#Y-&$I=)#)9#\"Y5%#Y9#\"IE$%)A%&91$#IA!#YE\"#9E!#)E##9M!"
+ "\"II!#)I#\"9E##IM\"$YE*\"9I#%YQ'#I]!$)U##9Q!#9I!#I]!#9U!%)Q$%IY)#Y=\""
+ "%IQ*%9Q($)Y#%I=#%)U'$)U#\"IY!$)Y##9U$#9U!%I]#'J!'$)Y#$9Y$$*%&$IY&"
+ "!YY!$)Q#$Z!##Z%)$I]%$YY##YY\"\"YM\"$IY&%YI!#IU\"\"IY!$)M$$9Y$\":!#'9]+"
+ "%9Y(&YU$#YI#')Q%$IU%$IU%$)U##J)!\"9E##9U#$J%%!YQ!$9E\"$IY\"$)I#\"9M#"
+ "\")I\"#9I!$YE&#9U!$9A$$I]\"#99!#YI##9E!#IE!#YA#\"IE!#9A!#Y9##I9\"!)5!"
+ "\")E%#)9##Y=&$)1'#)5##)5##))#\"I1!\"Y1\"%)I!\"I-$\"I-$$)%'#9)$\"Y%#$))$"
+ "$Y%%$I)##X]!'I%*&(]&%HY$#8Y$#(Q#\"HM$#8U$#(]&\"H]!\"(=\"#XQ##(I#\"8Y#"
+ "$(A(!(A!#8A$\"H%!#X='#H=##(9!#X=$#H5&\"X-#!(9!\"H)\"$H-*\"8!!\"8A!\"8%!"
+ "!H!#\"(!#!GY#\"W]!#WY$\"7U#\"7Q!\"WU#\"7Q!\"WM#\"G9\"\"WY##7]%\"'I#!7A$!'9!"
+ "\"'=##'I$\"75$!G5!!71\"\"'-#\"'-#!'!!\"7-$!G!!#'!%\"VU#\"&]#!FE!!F]!\"&U!"
+ "!&I!!FM#!VE&\"6Y&\"&Q#\"6=(\"'!#!F]!\"&]##'%'#6]$!W%$!7)%!G)!\"G-%\"W1#"
+ "\"'1##'5\"\"75$!'9!!G1%!G=!\"'1#$79%!GE!\"WQ#!7E\"%GU&!GE&\"'=!#X)'\"7U#"
+ "\"GQ\"#'Y$\"WQ#\"8!!\"W]#\"X1#\"(%*\"()*\"8%!#81%$X-+#H!!%(=)!85\"#H=%#(=!"
+ "#XI'#8A$!HA#\"X=\"\"8E!\"XQ\"$HM*\"XQ%\"8A!#H]\"\"8Q##XQ#\"XE#\"8U!\"8Y!\"Y-\""
+ "$H]&\"I-!#(Y!\")!##9)!#9%$\"9)&\")1\"#I)&$9)(\"Y1(#)9##))##91!!Y5!#I5\""
+ "\"I9!!Y9!\"I9!!Y=!\"II!#Y=##YA##Y9#$IA#&I=(&IE$%)E(#IA!'9E+%II##99!"
+ "!)Q!#9M!#9=!'9M'$)M$#YQ#%II#$)Q$#IM\"#J!!%YE!$)Y##IY!#IQ!$9Y$$I]&"
+ "&IY.$:)!%YM.%)M($Z!&\"Z!\"%9])$:!$$I]&$J%&%)]($:-#&)Y!$:!$#I]!$:)!"
+ "#I]!$9]$%IY*#J)!#J)!%YU!$IQ%#IY!&*!$%*-'!I]#$9U$#Y]\"#YU\"\")M%\"I]'"
+ "$)Y##Y]\"#IY!#9U!#9Y#\"YY!$9]$')Y\"$)Y#\"YQ!#9I!#9U!\"IE$%)M!#IY!$IQ&"
+ "#9Q!#)Y&#YQ#%)M($9Y$%9I%$9E%#YI#\"YM\"!9I\"#IA\"%9E\"#Y=\"$)A!\"9E&#91!"
+ "#9A!&9=&%Y=!\"I=!\"IE!#Y5##I9\"\"I9!#Y=\"#I-%\"Y-\"#91$#9%$!)5!!Y)!\"I)!"
+ "\"8U!$Y-(!Y%!$)!$\"I!!\"H]!!Y!!#XY!&HY)#)!##8U$#8Q$!(Q!#XI##HQ%#HY%"
+ "#8I$#8M(\"XI\"#XA!!8E\"#(A!#85%#X5'\"89&\"85#!(5#%(1$\"(1##H5&$8!)!(5!"
+ "#(%$#85\"\"8-!\"WQ#\"7Q!#GU$\"X%\"\"WU##WU%\"WY#$'M!#'Y$#WQ'\"WM#!G=!\"'A#"
+ "#'I'!W=\"#G1$\"79&!71\"!W%$!W1&!'-!#')\"!79\"!W%\"\"'5#!W)(#F]'\"&Y!!FU!"
+ "!7!%!FY#\"VI&!FU##&Q#!6U\"\"6Y#!F]!!F]!!6]\"\"&]\"!G%!\"'5\"#G-)!'9%\"'%#"
+ "\"G1#\"75,!W9\"!G1!!W5\"!W5\"!GQ!!GE!#7Q#\"'Q##8%*\"7U!\"WQ#\"WU#\"GY\"!WM)"
+ "\"W]#!G]!#()$\"'Q\"#(%&$(%(#H))\"(1\"\"H-!!X)!\"HA\"\"85!\"85!\"XA#\"X=##(E$"
+ "\"X=#!HA!\"8A!\"HE!\"(I%#HE%%8M'#HQ&#8M$#(U#!)!!$)%!#(I##XY&#(]#&)%*"
+ "#8]$#91!$Y%!$I!$$I%'$Y)(!Y%!#I-\"#I-%#)9##I%%#)-#%I9.#)9##)A&$I9#"
+ "\"I=!\"I9!!YE!!Y9!$YU'#9M!$IE##9=!!IA&#YM&$)I$%)E!%)A$$9A%$9M!%)Q$"
+ "%)M(%YQ$!YU!#YM)$YI*$)]&#9Q!#IY!#IU!$Y]&$9U!$)]#%*%'#IY!$IY\"#:!#"
+ "#Z!\"#Y]\"#I]!$Z!\"%)]$$9Y$$*%##J%!$Y]'$:!$%J)*&*%!$J%&&*!($9U($I]%"
+ "$:%$%*-'#YY\"#J%!$*!#$9Q!#J%!\"YQ!\"J%!$:-$#IY!%*1##J!!!*!!\"J!!$J!%"
+ "%)](#9]$#I]!$9U$%)Q!!YQ!#J)$$YM#$)Y#$9U$$IY\"%)Y!#9M!&)](#9I!$)U#"
+ "$9M!&)U$#)U##9Q#$*%##J%!\")M,$IU%$)M##YM&$YI&\")E\"\"II$$YE##YE#%)-("
+ "%)E$#IA!&9M&\"I1!\"YM\"\"I=!\"99#!)9*#9-!\"I1!#95!\"I9!#))##I)&#95$\"I)*"
+ "#(Y!!Y-!!)-!#I%##I%##I!#%)1(\"I)!$8]\"#8Q!#(U#!(U!!8U(!XQ!\"8Q!!HE#"
+ "\"8E!$HI$\"8I!\"XE(#XY#!XA!#H5&#(I##(5$!(9!#(5$$85&#H)#$X1#$8-&\"X-\""
+ "#85'!WQ'\"8!!\"X!#\"WY!#GY!\"X!#\"(%%#']$#'U'\"WM##WA'\"WM!!GQ%#'I$!GE#"
+ "$'A&\"7A$\"'=!!W%\"!G=!!WA!#W=%!G1!\"7%$!'E%!G)!!FY!!F]!\"6Y$!F]!\"6Q$"
+ "!&M'!FM!!FY!\"&U#\"&U#\"&Y\"!FU!!V]$!'!!#&]'!'%##7-#\"75&!G-!#7)#!G1!"
+ "#'5&!G-!\"GE#!WA!#7A(!GM!\"7I##GM&$'Y(\"WA!\"WQ%!GQ!!WQ$#7Y%!W]!\"7]!"
+ "!'U!#W]%\"X-##85%#()$\"85!\"(%#\"8!!#(1!$(9(!H-!\"89!\"X)#$(E'\"(=\"#XA'"
+ "\"8A#\"X=#\"HE!#XY#\"XM\"\"H9!#(I#\"(I%\"8U!#9!!#8I\"$XU$\"(]\"\"Y%##XI!%)))"
+ "#9)!$)-$$Y-$\"I-!\"Y%##)1##Y5##9=!\"I5!\"Y1\"!Y-$\")5\"$I1&#Y)&$9I%\"I9$"
+ "#)5##YI##99!#)E##IE\"#IE%!YI!$9A$#9E!$9M!\"YM\"#9U!$)A$#YQ##9A!#9U!"
+ "$9I$#)U#$9]!#II\"$99%#9]##J!!%9Q)&9Y\"$Y]'$9]$\"I]#$:!$%YI!#9U!#Z)\""
+ "\"9]\"$J!%$JA!#J!!#YY\"#Z!%$:!!\"Z%$\"YY$!Z-!$Z)##J-!$IY&#J!!%)]!%Y]'"
+ "$J!&$*%##J1!%*!#%J-%!*%!%)I%!*-$$I]\"#Y]\"#9U!$*-#\"J%!#J)!\"YY\"$*!#"
+ "$*!#$*%##J!!!YY!#J!!!YQ!$*%#$J!%$)]##J!$#J)!#)]#$)]#&:!&#IU!#YY\""
+ "%Z%+%9U\"$9U$#IU\"#IM%\"J%$#9Q#&II($9]'$9Q!$YM#$YU#$II%#9Q!#YE\"#9I!"
+ "$)=$$)A!$II&#)A&$YA$$IA\"\"I=!$YE&\"I1!#))##)9#\"))\"\"I5!\"Y-\"\"XY\"!Y-!"
+ "\"91##)-##))#\"Y-\"#)5##Y)##(Y!#9!!&Y!.\"X]\"\"I!!\"HY!#8]'$(Y'#XI'!8U%"
+ "#XQ&\"8Q!!H]!\"8Q!&(M!#H5#!HE!!8M%\"HA!#H9&\"H=\"#81%#X5'#(5!\"X-\"#8-\""
+ "$(-(\"8%!$(5&#H%&!H!#\"8!!$GY#$(!%#'U$\"WU#\"GA#\"GQ\"\"7M!#7M%\"7]!#7I%"
+ "!WU\"#'5'\"'E#!G=!\"'9\"#'9$\"'5#\"7-$#71%\"G5$\"'-!!G)!!G%!\"G%#\"FM#!FY!"
+ "\"'!##&Q$#&U'!FU!!&]!\"&Y\"!F]!!G!!\"'!#\"'-#!')#\"W)\"#7)#!G1#\"'1\"!G=!"
+ "!W9\"\"7M#\"'=#\"'Q#\"W=%#GM(\"GI#\"'E#\"WQ#!'Q!#'Q$!'E%\"7U!!'Y#\"W]#\"W]!"
+ "\"WU#!X%$\"8%!#X%'#81%%(-'#X1&\"81!$(5(%(=&#(=!\"H9!#(=##HA\"\"XQ\"%8=$"
+ "\"8E!!HM!\"8E!!89\"#(M#!XM!#(U##(Q#\"XU\"%8Y&%)!+!HY!#(E$$XU%%)!##Y1#"
+ "#)%#\"Y)\"\"X]\"!)1!#I5%$)9$\"Y1\"#Y9#!Y5!#YE%#Y5##I=%$9=%\"IM!#YQ)$)A#"
+ "#YE#%9Q)%9A\"!YA'#YI##YQ%$)U#$YA$#YM\"#YQ)%)=!'9M+$9Y!#9U!#IY!#)Y#"
+ "\"IM!!IY#%YU*#YY\"$*%'\"J!!#)]##I]!%9])#9Q!$*%#$Z!#$:!$'Z!%!J!##Z!\""
+ "#Z%&#J%!#Z%\"#J%!!Z%!%IM&$J1%#J!$\"J%!$*)#%:1!$J)\"#J1!$Z!\"#Z!\"$Z!#"
+ "#:1##I]!%Z)##J)!#Z)\"\"J!!%J)\"%Z-#$J%!#Z-\"$:-$#*5\"$:%$#J-!#I]!$*!'"
+ "%*%##J5!$:%$$:%$$*1#\"Z-!#)]##Z!\"$)]#$*%#$9U!$*5#$Z%&$)]#$)Y#$)]#"
+ "$I]%$)]#\"YU\"$9Y!$I]&%9Q(%*!!\"IQ!$IE%$9Q!%9Q($Z%#$9Q%%IQ##9I!#9I#"
+ "%II*#9=!$)I!$95%$9U!#Y5#$IA%%99##Y=#%9A#!9I)\"Y1\"$Y5*\"9M#\"I5!\")5%"
+ "#I5\"$I-'#)5#\"Y-\"#Y)&\"I%%%9!&$I)&#9!!#Y!#&(Q'\"I!!#HU%#8U$#(M##8M$"
+ "\"8Q!#8U$#XI'\"XM\"#(I#!HI!\"XA#\"XE\"!HE!#(A$#(I#\"XA#!(9'#X5&#81\"\"(1#"
+ "\"X1#!8-\"#H)%#H)%%'U\"!GI!#7Y\"\"G]\"\"W]#\"'Y%\"WU##7Q&!WE$\"7U#\"7E!$'M&"
+ "$7M&\"'M#\"'9\"!7A$#'5&\"G9\"\"71&\"W5+\"'1!!'-!\"G-\"!G-#!G)'\"'%!\"7%$#VY$"
+ "!&Q!\"W%#\"&U%\"F])!VU\"\"F]%!V]&$FU)!G%%#7)%!W1\"!G)!\"71#!G%'!W5\"\"G=#"
+ "\"G-$\"'E!!G9!\"'A#!WA\"\"'A!#GM$$'M!\"8%!#7Q(#GU&!GY!#'Y$!WU$\"7Q&$H!\""
+ "#(%$$X%#!X!!\"8)!!8-%#(5#\"89!!(5!\"X5##XI##(=#\"H=!#8A!$(=%\"XE#!(9#"
+ "\"XY%#(U##XM!\"X]\"$9!($(]!\"8M!\"HM!!HM#\")!##(]#\"I!!#Y%$$I!'!Y!!#I!%"
+ "\"I)!\"9-#$Y1!#I)\"\")=%$I1#\"Y5\"$)9!#95$%I-$#9A$#Y=#\"IE!$)I#\"I=!$9M$"
+ "\"Y=\"%)I%$9Q!#9Q!')I*\"YQ$\"9M&&)I\"#YQ\"\")Q\"$9I\"#I]!%)E$$YY#$)U#%)Y!"
+ "$)Y#%)I%#IY!$)]#%I]*$I]%$J%!$9]$#Z!\"#Y]\"#J)!$Z%&#Z%\"#Z)\"#YU\"%:)%"
+ "%*-#%:)($*-*#Z!\"#Z)\"$*)#!:)\"#J-!#Z-\"#Z-\"%*-'$:-!\"Z1!$:-!#Z1\"\"J-!"
+ "&*-'#*)\"%Z5-#J1!$:-#$:-!$*%##Z5\"$Z1&#J!!#J%!%Z-#!*-!\"*)%#Z1\"&:%%"
+ "%*)'!:-%#J)!&:5)!Z)!$Z%&#J)!#J!!%:%!#J%!#J=!#J%!$:!!#:5#$Z%&$:!$"
+ "$*%#$J!%#9U!#9]$$*!##IQ\"\"9I&$YU'%IY&#)A##IQ!$9]$%)U(#YM#&)]($)U#"
+ "#9U!%9=)\"I-!#YI#\"YQ\"$IE#!YE!#YI&\"9I#%YQ!#Y=#\")=\"\"Y=\"$)9!#)9#!)1!"
+ "#)-#$I9##I1%#)-##I-%#))#\"Y)\"\"I)!$9%%$I5&#I!%#(]##XQ'!Y%!!9-\"#X]&"
+ "\"XM\"#X]&$8I#%8M*#(M#\"HY!%(I#\"89#$8E&#(A#$(E$#H9#!H=+%HA##X1'$X5+"
+ "!H1#$(-%#GY#\"8)!#X-'\"8!!\"X!#\"7]!!G]!\"7Q!\"WU#\"GY\"\"7U$!'Q##7Q%%7I("
+ "!GM#\"WA#\"'Q\"\"7A##'9$\"7=!!GA!\"'9!\"'-!\"79$\"GA%\"71$\"6]$#&]\"#7!&\"&Y#"
+ "!FE!\"&M#!6Y\"#&Y#!F]!!F]!\"7!$!VQ\"!G!!#7)'\"'-#\"G1\"!'5$!G5#!G9!!WQ$"
+ "\"'=#\"GA##'9'\"GU\"\"GU$\"'I!!'M&\"'A!!WQ!#7U%\"W]##8!%!7U\"\"WU#\"X)#\"H-\""
+ "\"8!!!H-!\"(!##(5#\"X-##(5$#H5&\"HE!#(5&$HE*#8Q$#(I#\"8A!\"8E#!(A#$(U!"
+ "#HM&%(Q##(Q#\"8M##(U##(U#\"Y%#\"XE\"#XY&$))!#9%!#(U!!9)\"#XQ#$))$#9%$"
+ "\"I1!\"8]#$Y%'$)1$#95$#I5\"$I=&#Y9#\"IE!\"9A#%)M!$Y=#%)A(#9E!$9E%#9I!"
+ "!YE!#II!#9M!$YU&#9M!$IQ\"$)U#$IQ%%*!$$IY%$IQ&$:!!%)Y'\"IY$#Y]\"!9]&"
+ "!9U\"$9U!#J!!%:!$$J!&#Z!\"%:%!\"IY$&J%&$J))%*5#$*%##Z1\"%Z)'$Z1&\"Z)\""
+ "#Z%\"!:-)#J-!')]&$:%$#J%!!:1\"#Z)\"#J-!!Z-!'J1*$*)#$Z1&$:!!$Z-#&:1%"
+ "$J5!$:1##J5!\"*5\"%Z1&$:1!#J1!#J-$&:--$:1$#J!!&*-!\"J!!!Z-!%J-\"#Z)\""
+ "%:%!#J9!%J-\"#Z-\"#Z!\"$:%$#Z)\"#YY\"$I]\"$:1##J)!$:)!#Z%\"!*!!#Z%\"$)U'"
+ "$YU#%)Q$#Z!\"#Z%&$J%%$)]##Y]\"$9Y$$)M##:!#$*!#%)Y+&)I\"#I]!%*)$#Y=\""
+ "%)Q!$9Y$$)A#$*)#$)Q##YI##IQ%#YE#$)E$%9M%$YE'#YE\"#9-!\"IA!$95(#Y5#"
+ "$)9!!Y1!\"I9!\"Y1\"#)=#!Y=!#)-##)%$$))$%9%*$)!!#Y-##I!%#)%##(]#$8U\""
+ "&)%*#XQ!\"8Y!\"(Q%#I)%!H]!#XE&\"I!!#XE&\"8E!#89!#(I$#89%#(A##(9!#XA!"
+ "#(5!\"X)#\"81!\"X-#!H1!#H%(\"X)#$X5%\"H%!$'U#\"8!!!GY!!X%'\"GY\"$'U#\"7U!"
+ "#WI%\"7I!\"GI#\"'9#\"GE%!G9!\"G=%\"'5\"\"W9(!G1!\"G1%\"7-$#'-%#'!'#W)##'!'"
+ "!G)!!&Q!\"F]#\"&U!\"7!\"\"6](\"'!#!W)\"!G1!\"'!!!'5#!71\"\"'5!!G9!\"G9\"#'-'"
+ "#G))!'=!\"GA$\"7Q&#WE%\"WM#\"WQ##7E(\"WU!\"7U!#G]!!WQ$\"(!#\"H!!#(!$#G]!"
+ "\"8!!\"8M!\"X1#\"85+!X=&\"X=#\"X5\"$H9$\"XE\"\"XI\"#(5$#(E##XM$\"HI!$(I%#8M$"
+ "#8E$#)!#\"(I\"\"8Q#$(Y(!HY#\"HY$#X]##)!'$XU!$8]\"!Y)!#I%\"#I)%#)-#$)1!"
+ "#Y1##I5%$)5'\"I5$!9E\"#)5#\"Y-($)5!$9=\"#)M#\"9=#$YE&&9A-%YE!!IE)#9A!"
+ "#IM\"$9E\"#YA##YQ\"#YE#%YM$$)U#$)U#$9U!#IY!#YM%$:%$%Y]-#I]!%Y]#%YU("
+ "$)]#&*!!%:!!%:-(#J)!#I]!'*-!#Z9\"$:)$$J1%&J-'%J%&$9]!#J1!&*-+$*%#"
+ "#Z1%$:)$$:1##J1!$J1!\"Z1!$Z=&#:1##Z1\"%J1\"$J5%#J1!#J9!$:E##Z5\"%*5'"
+ "#J1!$*5\"%Z5&!:5\"#J5!#J5!#*9\"$:5#%*5##J-!!ZI!%:5(#J9!$Z1\"\"J1##Z-\""
+ "#J1!$Z1\"#J%!%*1##Z5\"\"J1!#Z-\"$:-!#J-!$*-'#Z5\"#Z-\"$*-#%:)!#I]!$Z%\""
+ "\"J)!#J-!$J5!&Z)+#:-#$J-\"\"J%!':-*$)]##YQ\"#J!!\"YY$$IY%$*!##9U!%IQ'"
+ "%9Q)#9Q!%I9!#YQ##IE(!YY$#9I!&)I,$9M!#YE\"!YI!#9E!%I1'&)E&#I=!#Y=#"
+ "!I9)#95$\")5\"%9-'#Y9#$9-%#)5#\"I-!#)-##))#!Y-$%)%)%I%!#I-\"\"I!!\"Y1%"
+ "\"XU\"\"HQ!$9!#\"HU!!8U\"#8U$#(U#\"XM\"!(E!#(I#$8E)#HE#\"HE!\"85!#H=\"\"X9#"
+ "!()!\"X5\"\"8)!!8-\"#H-#\"81!#8)%\"X%\"\"GY\"\"7]!\"8%##'Y$\"'Y#!W]!\"W]#\"WQ#"
+ "\"WQ##GQ!!GE#\"G=\"!7Y%\"GE%\"W=#\"'9\"#W1%!W9&\"G9%#'1&!W5\"\"7%\"#'!'\"G)%"
+ "!FI!!VY\"!G!!\"&Y!!W!$!G%!!G)!!'9#\"G-%\"G1#!W1\"!W5$!W9!\"'I!!G1!#79'"
+ "\"WA%\"'E##GI&#'A$\"7M!\"GQ\"#'Q$\"WU#\"WY##7],#(!$#X!!#8!\"#(!$\"8)!#(9!"
+ "\"8)!\"X-\"\"8-!\"(5%#X-$\"X-\"$HA$$H-$#8A%!8=\"\"(=(#HM)#8Q$\"X]\"#XU##(Q!"
+ "#(Q##(]##XY#\"8]!$XI%$(]'#H]%$X]$'9%/#I!#\"I)!\"I)!!95\"#9-!$)1'\"I5!"
+ "!Y9!#95$$9)%$99\"!Y1$\"YE\"$)I$$95\"$)A$$YA$$)E#&9E##9I$$9Q!#9M!%)E("
+ "#YQ\"&)Y,%)Q$$YY&$IU%%)I($IY%!YY!$IY(%I]*$IY)$I]\"$I]\"\"9Q#$*!#&*)!"
+ "%J%\"$:%$%J)\"$J)%%*5'%:%!#Z%\"#J)!#J5!$:-#!*-!#Z-\"$*5\"%:1)#JA!\"J1!"
+ "'J-'%J9\"#JA!#J9!$J)%$J5!#)]#%:5!$*A#%Z=#$J5!\"Z5!%J9)$JE%#JA!#J9!"
+ "$*=##*9\"\"Z%\"#Z9\"\"*1\"#J9!\"Z9!%*=#\"*1\"#JA!%:E(&*9+\"Z5!$:)!\"J%!%:1!"
+ "!:-\"#J1!!9Y%#J)!#Z5!#Z9!!Z!!#Z%\"$J1($*5##Z!\"\"Z1!!*-%%:)!#J-%!:-\""
+ "%Z5#%*)##J)!!Z)!#J-!#Z-\"#J%!$J%)#I]!#Z!\"':)&%J))$I]\"$Z!##9Y'$)Y#"
+ "#9M!#YM\"#9U!#I]!#IQ+$9M%#)Q\"%)Q!$)I##IE!$II##9Q!!IA)%IE$!)A!&)-#"
+ "#Y9#!)=!!)1$\"I-!!)1!#)-#\"Y5\"$Y5$\"Y1\"#)-#%)!\"#Y)&$Y%+$)9!\"I%!#9)!"
+ "\"I)!\"8Y!$(]$#8]!#(I$#8]$#HU%\"HQ!#(M!\"8M##HI%\"XE\"!HA!\"HE!#HE\"%8=%"
+ "\"85!!H=!!(5!#85\"$H1*#H-#$(-##81\"\"H!\"$H%(\"8)!#(!$\"7]!$H!*\"8!!\"7U!"
+ "#GM&#WU'#8%$!GI!\"GI\"\"'E!!7A\"\"GA.\"G-'\"'9\"\"G9\"$79$\"'=\"\"71$\"79#\"7!&"
+ "\"&Y!\"&Y#!&U!\"W!(\"&Y!\"'%#!'1!!W-!$'-(\"G)'\"G9$!79\"!W=\"\"7I$#'A%\"'A#"
+ "!GA!\"'9!#7I%\"7Q!\"GI#$GQ\"%'Y'$'Q!$7Y'\"GQ\"$7]$#W]%!H1!\"8%!#(%$\"(-\""
+ "#8-%#(5!\"X5#\"85!\"8=!\"X=##(9!\"XA#\"XE\"\"89!\"(I\"\"8A!#(I##HM%!XU$$(U%"
+ "\"8Q!$I!'#HU%#(U#\"I!!$(U'&)5&\"H]!$)!!!Y)!\"9-##I-%$9-+#9-!\"I-!!Y9$"
+ "#)5##99$$99%#)1##)A##9A!$IA&\")E\"%IE*#9M!$IU\"#YM#$YM&$YU'$9Q%#99!"
+ "$)Q$#9Q!$IE&%9U%#)Y\"%)U!%IY'!YM!$9]!$*!#%:)($*1#$*1#$*%#%:%(#J1!"
+ "$Z%##J)!#Z)&%:-!%YY$#Z-\"%:-!%*='!Z5!%*5'\":5\"%:5+(*9!#J5!#J)!#J1!"
+ "$*A&#JA!#J9!#Z9\"$JA!#Z5\"':1\"\"JI$$Z9\"!*9$$*M\"#ZA%\":E\"#ZA\"$J%&$J=%"
+ "$:=$&*E(#J=!\"Z=!#J9%\"Z=!&:=,#J9%$ZA\"\"ZU!#Z9\"%JM)\":5*$J9!%:=!$JA!"
+ "$J9!%:5(\":5\"!*%!%ZM\"#J5!$J5!#:5##J5!$Z5\"#Z-\"#J1!\"J1!!Z9!!*5!\"Z%!"
+ "#Z-\"#J1%\"Z-!#J-!#Z)\"&Z%!$IU\"$J)\"$J-!%*)'#Z%\"$J!&#*!&$)U#%9Y%#I]!"
+ "$)]#\"IY!!)Y!#9Q!$9]$%)U!%IQ##YE#$)E#$IM\"\"IM!#9M$$)9!$)E#\"9E#$IA#"
+ "#IA!#YE#$I=&#99$#9)$#)9)#I-(\"Y5\"%91&\"Y=+\"I-!\"I!!#9%%\"Y!#$Y%$#))#"
+ "$I)&\"H]!\"8]!$)%!!HQ!\"8Q!#(]##(Q#\"HQ!#(A!\"X=#\"8I!#HI%#8E%$(A($8A)"
+ "\"8A!\"X1#$H5*#(1$\"81!#81%#81\"\"H)%#H)##8%%$H%'#H!&#H!$#X%'\"GM\"\"WU!"
+ "#WQ'\"GQ\"\"WQ%#7E%!'Q#\"GI\"#7A%!'A!#'E'!G%!\"WM&\"'-\"\"W5%\"'1#\"'1'!W-!"
+ "\"'!#\"V]&\"G%\"!W)\"\"7)$\"7%(\"W-(\"71#!V]\"!G-#\"75(#W9\"#7=&\"7=$\"7A$!G9!"
+ "!GI!#7M%#WM'\"WU#\"WQ#\"7Y$#7Y%\"7Y!#'Q\"$WU&#8!%!H!!\"8)!#85%$8-!\"85!"
+ "\"81!\"X5\"\"85!!(9!#81\"\"XA#$H9%!HA&\"8E!$XI%#(I!#(M&!Y!$!HQ&\"(Q%!HE&"
+ "!HY!$8Y\"\"8]!\"Y%#$)1!#9%%#I!#\"I%!#))#\")-(#Y1##)1##)-#$I5#\"Y1\"\"Y%\""
+ "%)9(\"Y=\"#9M$$)A$#I=!#9A!#YE##IE$$YI'%99)#IE!$9E$#9Q$%)Q!$)I!$YI#"
+ "%YU*#J!!$)Y##9]$$IY&!YM!%YU#\"Y]$%Z5\"\"Z!%\"J!!&J)*#Z)\"#J1!#Z)\"$*)#"
+ "$Z1&#J)!#J-!\"*-\"\"J)!%*1#$:!!#*9\"$*5#&:9($J5!$:E#$J5!#Z)\"$*9##ZA!"
+ "#*=\"#ZE\"$J9!#J=!#JA!#JA!$Z=%#ZI\"%*9'%:=$$:9#$J=!$*A#$ZA&&Z5#&:E!"
+ "%*A'!:A\"$JE$$JI$$*A#(:9.%ZQ%$JQ!&*=($JA$&Z=.\"Z9!#J9!#Z=\"#Z=\"#Z9\""
+ "#Z=\"%ZE\"#JA!$J-\"$*=#%:=($*5\"#J=!#J1(#JE!#J=!#*9\"#Z5!$:5$#ZA!\"Z-!"
+ "$:9#\"J1!#:-##JE!#J1!#*-\"%J))%:)!$IQ&$J1\"%*1+%J!\"#J%$%:!\"$9Y$$IY%"
+ "\")Q\"$9]!$Z%\"#)Y-$)Y#$YM'$)]#$9Q$$IU\"#YQ#$)Q$\"J)!#9Q!#9A!$)I$$IA&"
+ "$I9#$9=%$I=#$)9$!I5#$9=%#9-$%)A\"\"I5!#Y5&%)1(#9)$\"I-!\"9-##H]\"\"I!!"
+ "#9)!#)-##I!\"#XY!%(M)#8Y!!8U\"#(]#\"9!#\"XQ\"%XE##8M$#(M##XM!!HI&$8=("
+ "!HA!\"X=#\"8=##(5#!(9$#H5&$(%(\"WY!#X-$#(-$\"X)#!H%!!H!!$'Y!\"8!!\"7Y!"
+ "#'E$\"WU!#']$#7I##WM\"\"7Q!\"WI#\"'E#\"7I)!G=(\"W9!\"G5%\"79&\"WI#\"')\"!G1!"
+ "!6]\"\"6]&\"'%#!7!\"#'))\"W-&#7%*\"'1!\"'5##W1*!W9!!W=!\"GA%\"'9\"\"GE\"!GM!"
+ "$'Y&\"WY#\"GI#$'M#\"7U!\"WY%$GM#\"'Y%#GY$\"WY#\"7]##X=$!(%!#()!\"81!#(1#"
+ "#H-##H5#!HA&\"8E!\"X=##(A##XE!%8E$!(E!\"XI\"!XI!#(I$\"HQ!#XU!#(I#%(Y\""
+ "!HU!#H]\"\"Y!##9-!\")!#&)%'#9)'!Y)$#9-!#9-!$9-%$Y=*#91$%I9$$95\"\"I9!"
+ "#9=$#Y=#%I9.$9E$\"IM!#YQ\"#YI##9=!$9M!#YM#%IQ*$YU##YI#$YY'$)U#$YY'"
+ "$)Y##YY\"#I]!#YE#&:!*\"J!$$Z!'$*%##J%!%J-\"$J-\"\"Z)%#*%#$J-%#*-\"$J-\""
+ "$*)#$:-#\"J1!#Z5\"$J9%#Z)\"%J5)#J5!#J9!&:9%#:5#\"*=\"%J1\"#J9!$JA!!:E\""
+ "$Z1&#Z=\"!Z%!#Z5\"$JE!&JA-#JA!\"ZI!#JA!#JA!$ZA\"$*=)#Z=\"%*I#$*Q\"%JE("
+ "!ZM$#ZI\"$ZI&\"ZE!#*A\"#ZQ!%ZE\"\"ZM!#ZI\"#*A\"#J=!$ZM!#ZA!#ZA!$JQ!$JQ%"
+ "#JA!#J=!$*A##ZA!#J5!&JE)#J=!$JA!#ZE\"#J1!#J9!$:!$%:E$#J9!\"Z9!#Z5!"
+ "#Z-\"!:%\"%:9!$J1\"\"Z1!$*!##Z-\"!:-%#Z-\"$:-!%Z-&&:))$:)$$:%$%*!($9]$"
+ "#)]\"&J!#%J!&$J-%$*)#$9Y!$9Y$%YM!$)U##YU\"\")Q\"!9M%#9M!$)]#%IA'#9M-"
+ "#YM\"\"9I#$YU#%)=(#9E!#Y=&\"9=##)A##9A!!9-\"#)5#\"I!!!91%\"I-!$9E%!Y)$"
+ "&)9\"#HQ\"#I!#$9!##)!##(M##9!*$(I'#I-%$(M%\"XU\"#(U&!(=!\"HQ!!8E%$(E%"
+ "!HM#!HI#\"X=\"\"X=\"\"(!##85%$8=##(=!#H-#!(9!\"H)\"\"X!!#(%$!X!$$H!%\"W]#"
+ "\"7U!\"WY!!GU!\"7Y!\"WU#!WE$\"'I!\"GE\"!GQ%\"G1$!GA!!'A$\"7M!!G)#\"W1(!G1!"
+ "\"'!%!6]%\"'%#!W)\"\"G5\"!G-#!W-!#75%#'5%\"G5%!W=$\"GA%\"'E#!'A$#'E$\"7]!"
+ "!GM#!W]\"#'E$\"WU##WY\"#W]'#7M#\"X%#$(%(#X1&!X)\"#H)#\"89!$H1'\"X)#!HA!"
+ "#(9$\"8=!$8=##8-%#H=%\"XE\"\"8E!#HI\"\"HI!$XM+$8Q)\"HI!#HU%#HU%$(Y'#I)%"
+ "\"I!!#I)\"#9)!\"I)!#9!!$9)+\"I1!#Y%$#Y)'#Y)#\"Y5\"#Y%'#Y5#\"I9!\")A%$9=!"
+ "$)E#$)I!\"9E#$)A#$)A!%IA*%YI!#9=!#IE\"#IY!!YU!$9M!$*!##YY\"#Z%\"#9Q!"
+ "\"IY!$YU#$:!$$*!##)U#\"Z%!%I]*$*)##J-!$J%!!J-#\"Z9!%JA%$9]!#Z!\"$J1!"
+ "#J1!#Z1\"&JE)%*9#%*I'#JA!$:9$!Z-!&J9\"#Z9\"#JI!#J=!$:E$#J5!\"ZA!#*A\""
+ "#ZA\"#ZQ!#JA!$:)$\"J1!#ZI\"#JE!$JE!$ZE&#JE!#JE$\"ZE!$JI$':E%$*I\"%:U'"
+ "$ZI&%*I#\"*Q\"#*]\"%:I$%*Q'$J=!#ZI\"#JM!%JE)$ZE\"#JE!\"ZE!$:Q##JA!\"ZI!"
+ "#*M\"#JE!$ZE\"%*M\"#J=!%:A(#JE!#*=\"&:E!$*=\"$:=##JA!#Z=\"%*9&#JE!#*9\""
+ "!Z9!!ZA!#J5!$Z-&\"ZE!&*)(\":1##J9!!:9\"%:1!#Z)\"$Z!\"#*-\"%:)!#J1!!YU!"
+ "#J%!#J%!\"J!!$Z!'$*%#%9U)$Y]&#9]##Y]\"#IY$\"IU#$IU%#IQ$#IU!#)Q#))U,"
+ "$9I\"%YI+$9A$\"I5!\"IA!#II!#9A!#)=##)A#\"YA\"\"I9!$9)(\"I5!\"Y1\"%Y=,!9-\""
+ "!Y9!#HQ%#91!#Y%##Y-&\"9%#$(U$#X]##X]&#(Q#!8Q\"$8Q\"\"HQ!\"XQ\"$XI+\"HM!"
+ "\"XE%\"89!!8E%\"X1#$8E&#H9&\"HI!\"(5\"#X1'#(=!!X-!\"8)!$85)\"H%!\"H!'!()!"
+ "$7M$\"W]##7U%#(%&\"WQ!$WQ+#GM&#'E$#GE&\"'A#!7A$\"GA#!GA!!75'\"G1)\"'E%"
+ "!G)!#G%\"#W%#\"71#!G-!\"71$\"W5#\"'5\"\"'I)\"'E#\"WA!!G5!!GM!\"'E!#7A!!GQ!"
+ "\"WU!\"GU\"\"7U#!7]$!GM%\"8!$\"GU\"\"X)%#X%$!H)#$89(#HE\"\"X5\"#85'\"X5#\"89!"
+ "\"(1##8I$\"XA\"\"(I%$8M#\"(A\"#HM##(M#!XM$#(A$\"8U!#95!#I%%!HY!\"X]\"#XY&"
+ "$HQ##I!\"'9%%#I%\"#9-!#91!!Y)!$)1'!I=##)5##95!%9A&#)5#$Y9'%9E\"\"I=!"
+ "\"YU$\"IE$#)9#$9U$#Y9##9Q'$IM&$IQ\"#9Q!#9U!%IY##9U!$)Y#\"IY!$Y]'#*!#"
+ "\"J%!$*!#%)]!$:!'(:%+\"Z)!#J)!#J)!$9Y!$J-%$J-!%J%\"$J5%#J1!$:5##J5!"
+ "\"Z9%\"ZE!&:9,$J5%$J=!!Z9!$*9\"\"ZE!$*9\"$:I$#ZA\"#ZI\"#ZA\"$ZE%$ZE&$*E\""
+ "%:E!#J=!!:E&\"Z=!\"ZI!#JI!$ZI%$:I##ZM!#JE!\"Z]$&:Y,#:A#$ZI!$JI!#JA!"
+ "#JE!$Z9&!ZA!!*Q!!ZI!%*9&#ZU!#ZQ!#:A##ZE!&*E($*9##:U\"#ZM!%:I'&JI!"
+ "$JE!':E1#:U#$*E\"'*U#\"Z5%#JM!$J=!#JE!#J=!#J=!\"Z=!$ZI\"#JA!#:=&\"Z-!"
+ "\"ZE!$*I\"#JE!#J5!#Z9!#Z9\"$J5%#Z5\"#J!!$JI$#J1!\"*1%#J-!#J-!$*-#!:-\""
+ "#J1!#J%!#J%!&:-)#J!!$*!##J!!$9Q!$I]&#Y]\"\"IY!%)Y!#)]#$)Y##9Q!$YQ#"
+ "$)U#$)I#$9A$#IU\"#YE\"$9I!#Y=#&)A,$)A$#)M#\"IE!\")=\"!Y)!%Y1+\"I)!\")9\""
+ "\"I-!#Y5&$)-$\"8U!#9!!#(Q!%91)!)!!$(]$\"(M\"#I!)\"HU$$HM*#(E$\"8]!!8M\""
+ "!XI!\"8Q!%8E'#8I$%XE#\"81!\"85!\"89$\"X)\"!(1!$X5%#85%!H9(\"H-\"#X%'!G]!"
+ "%']'#W]'!GU#$'Y(#7Q%\"7Q!\"'Q#\"7M!#'I%#7I%\"GA$\"GE%!W=$!G=#!'-#\"G5%"
+ "!W%\"!W%\"!7)\"!G)#\"W5%#'5$#G5&!'=!!G9!\"'=#!GI!\"'E##'A$\"'E!\"7U!#7A#"
+ "\"7Q!!GU!\"7Y!$GE#\"WY##GU&!G]!\"G]\"#(%$\"8)#$7])#(I$\"81!#8A\"#(A#$H9*"
+ "#X-'!H=!#8A%#85\"!HA!!8I\"$8Q(\"(M\"\"8Q!$HM)\"XU\"#XY#\"XY\"#(]#\"8]!$I)'"
+ "%Y!&#9%!\")!##))#\"I-!\"Y5\"$I)#\"I5!$I-&#)=##Y9&#IQ$$Y9$!YA!#9E!#YQ#"
+ "$IE&$)E$#IE\"#9U!#9M!&)Q(&9M.$)U#$IQ&$9Y$%)]!&9Y&%)]!$I]%%:!$%Z%*"
+ "$*)#$:1!#J1!#J)!&J-'\"I]!%J5%'Z-('*9%#J1!$:1#%:=!#Z=!\"J5##J9!#Z-\""
+ "\"*9\"#*5\"#ZE\"#*=\"%*9&%JA%&:A!#JI!#Z9!%:A!#JM!#ZE!%ZE*$ZE\"#ZE\"%*I#"
+ "#*I\"$:I#&:E$%JQ!':9\"#JM!$:E#%*M&#JM!#JA!%JI)#Z]!$J]$%*Q*$JM$#JA!"
+ "\"ZM!#ZM!(:M*#:M\"$:M$#:I#%JI!#ZY!#JM!#JM!'JI&#JM!$ZI&#ZE\"$JI$#JM!"
+ "#JM!#JI!$JI!#JE!%JY(%*E'$ZA\"%ZM*#JE!\"*A!\"*I\"%*A+#J=!&*9+$:A##ZA!"
+ "#:A##JE!':Q(#J1!%:E!#Z-\"$Z9&&*1!#Z9\"\"Z5!%J1-#J1!\"J)!#I]!#J%!$J-%"
+ "!Z5!#*!##J)!%Z9*\"9]&$*!'#Z%%$*!#%IY'$)Q$$IY%&IY$$IY%!Z!!#YQ##YQ#"
+ "\"II$$9M!$9M(#9Q!$IM%#YE\"!9Q\"%9E%#9A!&IE($)1!#9I#\"IE!#)9#$)='#)5#"
+ "$I9)\"Y1\"&9-*#Y%$#9%%\"I%!$9%##(Y!!)%$#(Y##XU'#Y!&\"8Y!\"8M!#8U$!HM!"
+ "$(M'\"XA#\"XU\"\"8I#\"8A!\"(5\"\"XI\"\"H9\"\"X=\"\"H)\"\"(1\"!X%'\"8-!$()(\"7]!#7Y\""
+ "#H)%$(%##H%##()$#G]!\"7Y!\"G]\"\"7Q!\"'Q#\"WI!#7Q'\"'E#\"G=%\"'A#\"G9\"!'1%"
+ "\"G-%\"'%#\"G-$!G-!\"G1$\"WM&!GE!!7A\"#'5$!WE!!WM!!7I\"\"7I!#GY!$'I)\"GA\""
+ "\"H%\"\"G]%\"W]#\"G]\"#GY##H!&%8%#\"8%!\"(-#$(9%\"81!\"X%\"#(9##X='\"8)!\"8=!"
+ "!8A\"$8A(\"81!#(I#\"(M\"#HM\"\"XU\"%8U*#8]!$8U%\"8Y#%I%+\"8]#\"HY$#9-!\"8]!"
+ "$)%%$Y)+#99$#Y)'#91!#)9#!Y5!#99$#9Q#$)M&\"I5$#9E!&)A%$Y=!#9A!$YM#"
+ "%)9(#9M!\"YI!$IU%#YQ#%*!#!YU$$)Y##IY!#IU\"#YQ#%)]'$*%#%9U)&*%!&J%#"
+ "#J%!$:%$$Z9\"$:%$(Z-&$:-##J1!#*1\"$J5!#Z9\"$J9!#ZE\"#J5!#Z9!$*=&!*=!"
+ "#J9!&*-+#JA!%:1(%JU!$JA!#Z=\"#JE!#JE!$*5##JI!#JE!#ZI!$JM%$*U\"#JM!"
+ "$:E$$JM!\"ZM!\"ZM!#J=!#ZQ!%JQ(#ZQ!#ZQ!$JQ!#ZQ!$ZI%#JM!$:U##ZY!!ZQ!"
+ "#JM!&:Q($JE%\"ZQ!&JU%\"*Q\"\":Q\"%*I#&*Q#!Z]!$:Q#%JQ)$+)\"$*Q)#ZU!\"*Q\""
+ "$:Q#%JM)$JM!$*U\"$[!&':M!%JQ!&ZM+%ZM&&:I%#ZE\"$J5!#ZY!%:E!\"Z=!\"ZE!"
+ "$*M\"$ZA%\"*A!%:A($*9\"#J9!!:=%#J-!#JE!%:9%#Z-\"$J5!$J=!#Z)\"#J=!\"Z)\""
+ "%*1''*9)#Z9!$:-$\"Z!\"\"Z)!$*%#!Z)!%:)($*!#%Z!'#J!!$IU%$YU'!Z%!#9U!"
+ "\"IU!%)Q'\"9Q##YQ##9I!#9M!$IA##IQ!$)E&!)E!#Y9##Y=#\"IM!\"I-!!I5&$Y5$"
+ "#9A!#9=*%I1$#)-##91!#91!$9!%#9!!#9!!!Y!!#8]!\"(U\"\"I!!#(Y#\"8I#\"XQ\""
+ "!(9$\"HI!\"XM\"#(I#\"HE$#(M##(=$!HE!#X1%#89%#(=!!()!$HA*#()'\"81!$(%&"
+ "\"X%!#']&\"8!!#8!$#GY$#'Y$!GU#\"GQ%\"7Q!#7M#$7I'\"'E\"!'Q#!7A%\"75#\"'E#"
+ "#')%!'-!#'5'\"W5&!G5&\"75$\"7=$\"'=#!GM!\"WE%\"'E#\"WE##7Y%\"GI#\"GQ\"#7Y#"
+ "\"X%##GY!\"7]!\"H%$$8%&#8%\"\"WY#\"H)!!X-!#H1&\"H1\"\"89!%89%\"85!\"HQ$#H=\""
+ "\"8E!!HE&$HI'\"XE#!(A!\"XE#\"HQ'\"8U!#XU&#8Y$#HI#\")!(%9%,$8]%#9%!!)-!"
+ "#))&!Y9!\"I-!$Y)(\"I!!$I5#\")5\"\"I9!!9I%$Y=!#I9\"$)I$#YE%&)E)$9I%#9I!"
+ "$IM%$*)##J!!%YQ'#*!&$IU%%9Y(%IY\"\"I]!#I]!#J%!$I]\"#J)!%:1($Z!&%:%!"
+ "%)]!#J-%%J-\"%:1(%*=+#J1!#Z)\"#Z5!$J9!#JA!#J5!#J5!#*5\"&*A+#ZA%%*A&"
+ "$Z-\"$Z9&#JA!$JI(%:E!#JE!#Z9!#ZI\"$JM!\"ZI!!*M!#JI!\"ZM!#ZU!\"*M\"%Z])"
+ "&:I!$JM!%JM!$*Q\"#JA!%*U\"#ZQ!!ZM!#Z]!#ZU!#ZU!\"ZU!**U)$*]&#ZY!\"[!!"
+ "%JQ!$[!!#ZU!#JI!%ZU)#JI!$J]!$ZQ%#ZU!#[)!'*U#$JI!$*]\"$Z]%%+)\"\"[!!"
+ "$JU!#JM!%*M\"%:Q$!*Q$%JQ!#ZU!#Z]!#:M##JM!#JM$&ZU\"$ZM\"!:Q\"#ZE!#JI!"
+ "%*I\"&:A,$J9!#JI!$Z=\"$*=#$JQ!\"ZA!#J5!#*=\"%Z1&#J9!$J9!#Z9%!*5!#J5!"
+ "#J%!#J=!#*9\"#JA!#J-!%*1'%Z)+#Z-\"\"J!!%:%(#:%##Y]\"$*!#!)]!%:%!%9Y,"
+ "#IU!#IU\"$)]#%9U%#9U!&IM$\"YM\"$9I$$YI&&Y9/#IE(#9A!$IA%%9=%\"I=!!I=#"
+ "\"I1!\"(]%$9-(#9A$#9)!\"I-!$))%#))#%I%$%)!%\"8]#$X]$\"Y%##)%##))##8Y$"
+ "$(]$%(M##8M$\"H-*!HQ!\"XI\"#(A##8A%%H=&#(E!\"8M#\"8=!\"X1\"\"X9#\"8)!\"8)!"
+ "\"X=%$()(\"X!#$8%)#']$\"H!!\"WQ#!'M!\"7Q!\"GM\"\"GY\"#7I%#7I%!W1\"!GE%!WA&"
+ "!G-!\"7=#\"G1$#'9'#'5\"\"'5#!W9&\"79#\"W1&$7E$\"GM\"#']$#WA#!GU##7Y#$8)&"
+ "$'Y#\"G]!\"W]##(!$\"(!#\"8)!\"H)!\"X-#\"X-#$(9%#(9!#H1!#X5&&(=%%(E##(A$"
+ "!HE#!XI$#(M!#8M!\"XE#$(Q!#(U#%8Q$#(Y!#(]##HU\"#XU&#(]!#I5\"\"I1!\"I5!"
+ "\"I)!#))##9-$$Y1'!)1$#I=%\"I9!#9A!%Y=(%)E!#)A#\"IE!$)E#\"IA!$9U!#YM\""
+ "%YM$#YM#$IU\"!9Q\"$)U#$*!#$:!!&)]$#Z!\"\"J%!\"Z%\"%Z%'%*%'$J-\"#Z!\"#J-!"
+ "!Z-!#*9\"'*1%#J1!#J5!$J5!!Z1!$Z9\"$:9##J=!$Z5\"#Z=!#J=!%:E!#JA!#Z=\""
+ "&:I,\"JM#\"ZE!$JM$!ZY!%*I\"$:Y#%ZQ&$ZM\"$*U\"#:Q##;%&#ZQ!#ZQ!$J]!$*Y\""
+ "%*I\"#:U#$JU$#*]\"%:U$$J]!#ZU!\"ZU%#[)!#[%!$*U\"$ZY%$*Y\"$*Y\"#[)!$JU$"
+ "$;%\"\"Z]!&[%\"\"JY#\"[!!$ZU%(J].#ZU!#*]\"%JY)\"*Y\"\"ZM!$ZY)\"ZQ!$ZY%$:Q#"
+ "#ZU!$JQ!#ZI!$+!\"$*U\"#JM!$*U\"\":]\"#*Q\"$*M\"!ZM!#ZQ!#:]\"%ZE*$JA%%ZU)"
+ "$:I#$*I\"$J9%(JI#\"*E!#ZA\"#JE!$JM!$*A\"\"JM#%JA)#ZA%#ZQ!\"*9!#:5##Z=\""
+ "\"Z5!&:5!#J9!$*%##J)!%J-\"%J5\"\"J%!%:-!$:1!$:)!#*%#%J!*$:!!#J%!&9Y&"
+ "%YY$$)Y#$)Y##IU!#YU\"#YQ#%9U%#9U!#9A!#YI##)M#$IU%$YI'$)A!$)=$#)5#"
+ "#I=!#9=$\"Y=\"!Y5$%Y5%\"9-##9!*\"H]!#Y9##)%##Y-#%Y1($)%%$(]'!HY!#(E!"
+ "#XU##8Q$\"8Q+#8M$#HQ\"#(I#\"HU$%(E#\"XA\"!(I!\"85!\"8=#\"H=!\"8=#\"8-!\"X%#"
+ "!H)!\"(!%#8%$#(!$\"8)!\"(%%#WY$!7U\"!GQ#$7M'\"7Q$\"GM%#7M&!GE!\"'9##GI$"
+ "\"7=$#'-'!W1!!79\"\"G1'\"7=#!WA$#7A##'A'#'E$\"WQ##'E'\"WQ&\"GU\"#GU!\"W]#"
+ "#']$!GU!#H!&$(%(#H)!$8%)\"X)##(A$#(1&#X9$\"(9\"$(=!$XA&#(I##(A$#XI!"
+ "!XI$#HI#\"8Y!\"8M##XQ&#(U##(U!\"XY\"#H]%$I)##9!!!8Y\"%I!(\"I)!\"I)!$Y1$"
+ "$H]#$)5'\"I1$#I1%$I9&#9I##I1%#IA%#)A##IA\"#9E!$)Y##)U\"\"IU!#YQ#$9Q!"
+ "#YE%$)U#$IQ\"$J!&#9Q!#9]'%:!\"\"IU!#J)!$J%)$*%#%9])$J)%&*-($Z-&\"J-!"
+ "#Z-\"'Z1)$J5!$J9!%*A#$J9!$J9!#J)!#J5$#J=!%:5(#JA!%J9\"%JE(#JM!#ZA!"
+ "#J9!&ZM\"\"ZI!%*Q\"#JE!#JM!&ZI\"$JQ$!K!#'+!#![!$$JU$#ZQ!#[%!#[)!#JI!"
+ "%:M(#[)!$[%%#[-!#ZY!#[!!$*Y\"$[)!$ZU%$J]$#Z]!\"*]!$:]*$[%!#[-!#ZQ!"
+ "\"ZM!$:M$%J]%&;!#$[%!#;!#&ZY.#JM!#*]\"';!,$*]\"#Z]$#Z]!\"+!\"#ZY!%Z]\""
+ "%ZU\"$*U\"'*Q+#*Q\"#JE!%K)(#*Y\"$J]!%*U'$JE$$JM!&J]!#ZQ!#J9!!ZY!$JQ$"
+ "%ZM\"$:M$\"JM$%ZE\"$:I$$:I$#J=!#J=!\"*E%$:E##JM!$JM!$*I\"#*A&#J1!$:=$"
+ "#*9\"#J9!\"J9#%:5!$JA$$J!\"%J1\"#Z-\"%J5)$:-!#J)!#J-!#Z%\"#J!!'*!0&J-\""
+ "#IU\"#J)%#IY+$IY%#YQ##J)!$9Y!#9Q!#9M!#)M#%YI(%I5!#YA#$9E(#9I!$)A#"
+ "#)A#!Y9!&99*%)5%!Y5$$Y-'\"I5!#)%#!Y1!\"I1!$9%&$(]$\"8Y!\"Y)\"\"8U##(I'"
+ "!8M($(U$#(=$\"HQ!$(E(\"8I#\"8I!#HE##(=$\"HE$\"8E!$X5,#8=%$H5\"\"8-!$(-#"
+ "#8-%!(-!\"(5'#X%'\"8!!\"8-!\"H!!\"WY!$'Y)#7]%\"7Q!\"7M!\"7M!\"7I##'E+!G=!"
+ "\"7)$\"G-$\"'1\"!'1$\"'5%#79!\"'I##'E'!7U\"$7E*\"WM##7Q#\"GY\"!7Q\"!GM!\"X!#"
+ "$H!'$X!)#(%!\"8-!\"8%!#85\"\"H1!\"81$\"(9\"$81!#(1!#8=$!HI!$8I&\"(E\"\"8I!"
+ "!HE!$8M&\"(Q\"\"XE\"#)!$\"X]\"$(Y!#H]%$(]*#H]\"#Y)#$))$#I-\"\"9-##I)&$)!("
+ "!)1$#)5#$95%!Y=!!Y=!\"I=!$YA&#IA\"$IA&#9A!#YI\"#YY\"%IQ'%)Q$#IU\"%)Y$"
+ "$YU'#IM\"#J!!\"I]$$Y]&$*!#$9]$!J%#$)Y#$:)!&*!(#Z-\"\"J!!\"Z9!$:%$$:5$"
+ "#J1!#J9!%J-\"#J=!#J9!\"J=##JE!#J5!%ZE)&:M(\"ZM!$ZM%#ZE\"$JQ(#ZI!#ZU!"
+ "%JM!&:A$&*=+%*M&&*I'$ZQ%#ZY!#[!!$JU!$+%\"$:U$#ZU!$ZM\"$:Y'#Z]!&*Y*"
+ "$Z]%$K%(\"ZY!!Z]!#;%#%K!)#*]!#Z]!%;)+#[!!#[%!$Z]%#[%!$*U\"$ZY%%;!'"
+ "&K%!!+!$$K!$#*Y%\"[!!\"[1!#[!!#+)&$:Y*$+-\"$+!\"#ZY!#[9!$;!##[!!#[)!"
+ "%K)$$ZU%\"*]!$JY!#ZU!%J],$:Y#![!!\"JQ$$*U\"':I%#ZU!\"ZU!%*I'%:]#%K!)"
+ "$ZQ%!ZU!$*Q\"&JY!%JQ$$*M\"#*M\"$JI!#JE!%*E'\"*Q!#JE!$*E\"$Z=\"\"*I\"\"ZA%"
+ "#J=$#J5!$:9##Z9\"$*1&#J1!$J5!\"J1!$*-##J=!\":-\"$:)!#*1\"$:!$$J5%$:)$"
+ "\"J!!#Z!&\"IU!$:%!#)M%&)Y%!IQ##YQ&$)Q$#)Q#$YU#\"IM$$YI&%Y1%#9E!%)5\""
+ "&)I\"!95\"#9=$#I5%#99$#)9##I9\"#Y9#!Y-!\"Y-\"$I-)#9%!#Y%$$9!&\"I1$\"8]!"
+ "\"(Y\"\"8Y!\"(]%\"HQ$#(]#!XU!#XI!#(I#\"8A!$XE\"\"8A!\"X=#%(1'\"X9\"#()!\"85!"
+ "\"89&!()#\"X!#\"G]\"\"X%#$WY!\"(%#!']!#X!\"#7Q#$'M##GQ&\"GM\"$'E!\"'E\"!W=\""
+ "!71'\"'%#!'=#!W5!\"G=\"!WQ\"!WE\"$'U($GI&\"GM'\"7M!#7M&\"GQ\"\"WY##7Q%!WY$"
+ "!(!#$8%$\"X%##(!$&(-+\"8-!$(A\"\"(%#\"HE$#85$\"X-#!HA!#8A$\"(5%#89$#8]$"
+ "\"8I!\"8A!!HQ!#(Q#\"XY\"$8M#\"X]\"\"I!!%Y!#%XY\"!Y!!#Y%&$))$#Y-&!Y1!\"91#"
+ "#9I$$I9&#)5&#Y5&#9=!#)=#!YE!\"II!#)A##9I!!YM!#9Q!%9Y%$9U$#)]##IM\""
+ "#)Y#&)Y!#Y]\"$YY&$)Q$%:%+!Z)!$J!%&*-!&J-\"$:-#&*-+$:1!$Z1&$Z5\"#*5%"
+ "%:1%#J9!#J=!#J=!#Z=\"#JA!$*A\"%*M&%*E\"&:Q,&*E$!*I$#JE!%*M*#JM!$:E#"
+ "!ZM!#Z]!$*M\"\"*Q!#ZU!$*M\"$:]##[!!$*I\"'JY*\"ZU$$*Y&#[%!&+)\"&:M!%:U$"
+ "$[!!#[!!$;%\"%[!)#;!\"$+!\"%[!&%[%)$[!&$[%!%+%&$K%$#[%!\"ZU!$+!\"$*U\""
+ "#[%)#[%!$;%\"$+)\"#[%!!ZY!$K%$$[%!$[1!%+%&#[%!$+%\"#ZU!$K1$#*]!$K%$"
+ "\";5&%;%'%JY!#[!!![!!&:]+#[!!#:]\"%;!$%ZY\"$[!&%*Y*%:Y#$*M\"%JY($K!$"
+ "&;)'&JU)&JQ%$*U\"$:M$$*M\"$:Q$$*M\"%*M&%JM!%*I'$:M'%JI!\"ZM!#ZA\"#JA!"
+ "#JA!#JA!$:=$$*9)%*='$J%&$Z-&$JI!#J9!#J1$$:1!#Z-\"%:-%!Z%!$Z)\"#J=!"
+ "%9]!#J%!#YQ##Z!(#9Q!#J1!$)]#$)]#$)U#$)Q$$IQ&\"IQ!#IQ\"#YE%#Y]\"&9=$"
+ "#9A!#9E!#I5\"%Y=,#YA\"\"Y9\"\"I5!\"I=!\")9%$)5'#Y%'$I%&#9%!$I%'#XU##(Q!"
+ "\"X]\"\"XI\"\"8Y##9!!#(E!\"HM!#XA#\"8I!\"8E#\"X=#!X=!\"8A!\"81!\"89!\"H9!#HM&"
+ "#']$#85%$X1#\"X)##(!'#8-%\"G]\"\"WY#&(%)#'Q$!GU!#7]%\"GE\"\"7Y!#7=%#'I\""
+ "$'5&#G1$!G=%!G=!!W1&\"'E#!WE\"\"GA\"\"WM#\"7=!\"'Q#\"8%!$GY*!G]%#W]'\"7]!"
+ "\"X)##8!\"!(%!$H1%#(1!\"81!\"X5%\"W]##8=$%(5#\"XE#\"H-$#8E%#(I#\"XU\"\"8Q!"
+ "\"HU!\"I!\"\"XU\"\"XE\"!X]$!XY$\"I!!$Y!'%I-!\"XY\"\"8Y!$)5!\"I)!$Y1*\"IA!#)1#"
+ "#)-#!YA!\"IE!$)-$$)I$$YE$#IE!\"9I##9Q'#)]##9I!#99!\"YU!#IY!#YU\"$)Y#"
+ "#Z!\"$)Y#%*%'\":!\"!Z!!$9Y!%Y]'#Z%\"$Z1&&*%(#J-!$:1!#J5!#JI!\":A#%*9'"
+ "#JE!%:=(%:=$$ZE&%*=&$J5!&:I,$:Q#%:M$#JI!#*E\"$JY!$*M\"#ZI!#Z]!$:I#"
+ "#ZQ!\"*Q\"%:Q$%*Q##[!!%ZY\"%*Y\"#ZQ!$+!\"$;!#$[!!$*]\"&:],%K!)%;!#\"[)!"
+ "&;)#![%!#[%!\"K!$#JY$$[)!\"+!\"&+%\"$[%!\"ZQ!$[)%\"K)#'[)\"$+1\"#[1!#[)!"
+ "\"Z]$#+)\"%;)+$+)!$+!\"$+)\"%+).#+!\"#;)\"$[)!#[%!#[)!%+-&$[%!![1!\"[%!"
+ "$+!\"$;)\"#Z]!#[%!#[%!#[1!$;)'#ZY!%K!!'K%,%Z])!*]!#JI!#Z]!#Z]!%:M'"
+ "$:]##+%!$JU!$:Q#&:Q$$ZU\"#ZE\"$JQ!$JQ($ZE%$ZM%#ZY!$JQ!#JI!#Z5\"&:E%"
+ "\"ZM!#JE!%*=*$*A#$Z=\"#Z=!#JE!#ZA\"#Z5!#*5\"&*1!!*5$%Z1#$Z9&#J-!\"J)!"
+ "#J1!#J-!#I]!$:!$#IU\"$Y]#$)U##IY!#IU!$:!!#9]$#)Y#\"I]!#9I$$)U##)9#"
+ "!YE!#YE\"#9A!#II\"!I1#\"I9!#)-#\"Y5\"\"IE!#Y!'#9-$!Y5!\"(Y($HY$#I%\"#I%\""
+ "!Y1!\"XM\"\"HY!#HM%\"8Y!!I%##XA$#(M!#8M$$8M\"#XE&\"XA\"#(A$#(A!!H9##H9#"
+ "$81)!H=!#(-!#(!$\"85!\"H)!\"W]#%8%%!7]\"\"7]#\"X!#!WQ$#WQ'\"WU#\"7]!#7I\""
+ "\"'=##79!#7=(\"'=%\"W=%\"75&\"7I!\"7M!#'Q$#WQ'\"7U!\"7U!#']$#7Y%!']!!X)$"
+ "!H)!#H)#$H-*!XA!#X-'!H5!#X!(!H9!!X1!#(I!\"HI'\"8=!\"HA!#8Q!\"8M!$(Q("
+ "%(U,#I!%#XY&#XU&#(]##9%!$9!&$X](#9%!\"I)!!)9!\"9%#!Y=!#)=&#Y-#\"I=!"
+ "#I9%\"I=$$9=%$Y9'$9E%$)E#$9I\"#9M!%)I!$IQ&&)]($)]##YY\"$IY&%9Y!$9U$"
+ "$Z!##9U$#I]!&*!!#Z1\"&J)*#Z1\"#J-$$*9\"#J1!$Z5\"#Z5\"#ZE\"#J9!#J5!%:=!"
+ "%*=##Z9\"$*A##ZE\"!ZI!!ZQ!#ZQ!#JI!#J=!\"ZU!!ZI$!ZQ!%*Q'':Q!\"ZU!':U%"
+ "!:U\"\"ZU!#ZY!#ZY!&*Y#%ZY\"(*](\";%\"%ZU)%K%!\"[!!\"[!!#[!!#[!!!:Q\"#*M\""
+ "$[)!$+-\"#K)$$K9#$[)!$;!#%+)\"$+-\"$+)\"&[-.\";-&\"+1%$+-\"%+!\"$K5$$;1#"
+ "$[-$&;-+$;-\"%[)!$+5\"%+9&$+-!$+1\"$+)\"$*Y\"$[)!#[I!%;-'$+)\"%+)&\"[1$"
+ "\"[!!$+1\"#K)#%[)%\"[5!#[!!#[!$#:]\"$*]\"$+)\"#JM!%[-&$JU!%K%!#JM!$+-&"
+ "\":]&$Z]!$J]!%:Y$\"ZY!#Z]!&ZU*%ZU\"#;%'$:I$#ZQ!$*M\"%:M$#ZY!$J]!#JM!"
+ "#ZU!#JM!$ZA%%ZA&$ZE)#:=##J9!%:=(%:=($J=!$J5!$JE%$J!%$Z1&#Z9\"$J%&"
+ "\":)#%JA)\":%#$*%#$:-#&*!!#Y]&%*%+$9Y!'YQ*#IU!$)U##)Q##IY!\"9Q##IQ!"
+ "#9Q!#YE%$IE#$YA!#)9##)A#\"IA!\"95##95$\"I5!#)5##)9##I5\"#I)&#Y-##Y!$"
+ "#9%$\"Y!#\"X]\"#8Y$#XY!!XU'#(Q#$XQ*$(Q!\"8I!#XM#$X=+\"(E\"$8A&$H=!\"85!"
+ "#85!\"X5##(1&!H%#\"(-#&()(#(%&\"X%\"\"']#\"8!!#'Y$#'Y$#7U\"\"WM#\"WQ&\"WE!"
+ "!79%\"'9!\"'E\"\"7I!#GM!\"W=(\"WM#$'Q!\"7Q!!GU!\"7Y!\"7Y!\"G]\"#7Q##W]'#GU#"
+ "#(!$#H)&\"(9\"\"X5##X5&#(5)%(=##8I%$8A&#XA'\"HE!\"8Q!!(=!\"8M#\"XM\"\"XM\""
+ "#HQ&\"Y%#\"I!$#(]##9-$#Y!$$I!&$))!#)1#$)A!#)1##Y1&!Y=!#)5##Y-##9=$"
+ "\"I=!#IA%')I\"$)E#!)U!$)I$$9M!$YM#!IQ#$YU&$IQ&$)U##II\"#Y]\"#9Q!%YU("
+ "#Z!\"!*%!$J)\"!Z1!\"J1!#J-!\"*1\"#J!$#J5!#J5!$*5#$J=!'*5(#J1!%Z9##JA!"
+ "%Z1#\"*A\"%JE(!:E\"#*I\"$JI%$*Y\"$*M\"!ZM!#JA!#Z]!#Z]!#ZQ!&*U*#ZU!$;!\""
+ "$*Y\"'JQ%$JY!#[%!#[)$#ZQ!%[!&#;!#%+!\"%Z]*#JY(&+%*%;!'#[=!&;)'#[-!"
+ "%JY%#[%!#[)!%+-&%K-$$+)!#[-!#ZY!#[-!$+-!#[-!$[-!%;E\"%+5!#[=!#+1!"
+ "#[1!\"K)#$+M!#[5!$+1\"#+1\"#[-!%K1($+1\"#[-!!;=\"$J]!'[1-%+1&%+-\"$;-&"
+ "$[5$#[%!$[)%\"[1!$K)$%;-\"&K)!&+)\"$+)!$[)%%[%&\"ZU!%:Y$#;%*$[!!%ZY\""
+ "\"Z]!%Z])'*]+$:Q#$:]#$:Q$#ZY!%;%'#*U\"$*Q\"#*Y\"#ZQ!$*Q\"$*Y\"\"ZM!!ZY!"
+ "%:I'!:I%#JI!'JA\"#JE$%:M$$*A\"!*9!#J9!#Z%&#Z5\"$J1%\"Z5+#J5$#Z-\"$:9#"
+ "#Z%\"%:1!#J9!#Z5\"\"J%!$J!\"$YY#&J!#$)]&$*%#$Y]&$9M!#IU$$9M%%YI!$)A#"
+ "$9M!#YE\"#YI\"$9E\"$)A#$)=!!YA!#9Q#$)=!\"I5$$91(#I1%\"Y1\"\"I-$\"I-!\"Y)\""
+ "\"Y)%#I-\"#)%#\"I-!#(Y##(A$$8Y%\"HU!\"8Q!!HM!#(9##(Y!\"8M!\"X=#\"81!\"8-!"
+ "#89%#X5$\"81!#()$$(9(\"7]!$X)&$8%)\"8%!\"WY%\"WI#\"WY#\"X-##WU!\"WU%\"WQ!"
+ "!W5\"\"W=*#'9$\"'A\"#'E$#G9$!GM!\"WQ##'I$#7U%#7Y%#H!$$(!+\"7]!\"W]#\"8!$"
+ "#()$$(-(#(5##(=!#H-%%H9,#85$\"H=\"#(A#\"H=!$(Q'\"8M!\"(M\"!(Q!!HQ#\"8Q!"
+ "#(Y#$(Q%!H]!\"8]!#9!!%I%'\"Y)\"$)%!#I)%\"I%!\"I-!\"99&\"I9$#99$#)I##Y=#"
+ "$)=$$)A#%)9($9Q!#YQ\"$9U$$)M##YQ#\"IU!#J%!%)E%#IY!$*!#$9]$&:)-!Z%!"
+ "$Z)#$*)&#*1\"%J-\"&*5,$:A#$ZI!$:5##J=!#J9!#JI!#Z5\"&:9!$J5!%JA)&:A!"
+ "#ZE!&JE)':I!!*A$$*M\"!*U!#JM!$*Q\"$:M#\":A\"$ZU\"#ZU!%[!&$*Y\"\"ZE!$J]!"
+ "#ZY!#Z]!#[%!$J]!\"K!'#[)!$+%\"#[%!%K%)#[)!#[-!$[5!$;-\"$+!\"#+-\"$;-\""
+ "!+)!&+1\"#;)\"&[1&#[1!\"[1!#[1!$;1\"%+9\"#K1$$[9!#[1!$+9\"#[1!&K5$\"[%!"
+ "$;A\"\";5&$;5\"$;5\"#[5!$K9#\";5\"%+5!$;-\"%+9&$[5!\"[1!#[1!$[-!$+1\"$+1\""
+ "#[1!$[%!$;9\"#[)!#[%!#[-!$[!!$;)\"'K-!#[5!$+)\"#[9!&K5,#[)!$+)&#+)\""
+ "$K9'\"ZQ$#ZY!![%!$JU!#Z]!#Z]!#[!!%*M'$*]\"#[%!$ZU%%*U&$JY!%*U'$:Q$"
+ "$*M\"\"ZM!#ZM!#JM!%ZI'%:I$&:E!%:A(%ZA\"$JE$!Z5!#JA!$*9#\"Z=!&*=+#J9!"
+ "$Z1\"$*-'#Z-\"$:-!#:)'$J)%#J%!$*%#$J%%&J%&$)]##9U!\"J%!#I]!#9U!#YQ%"
+ "$9I$%)A'%)I!#YI&$YA&#IA\"\"IA!\"9A&$91\"$)5'#Y5&\"I=!$Y1*!)-$#I!##))#"
+ "$9)%#8]'#H]\"%)!)\"I!!\"I!!%(U##(U#!(Y!#8M$\"XM\"#(I##(E#\"8=!\"H9\"\"8A#"
+ "!81\"#X=)$85)#HA+\"(5#\"8)$\"(%\"#(9!\"()\"\"8!!!X!!\"']#\"WU##WY\"\"(!%\"7Q#"
+ "#'A$!G9#\"'I!%WM+#GI'#'I%#'I&\"7E#\"'E!\"7Q$\"GQ\"#']$\"X%#\"X!#\"(%\"$()#"
+ "\"89##(1#$H9'#H1&#(9!!H=##HA&#8='\"8M!#81\"#8I%$XU+\"HQ!$HM!\"XU\"%(M#"
+ "#8U!\"9!$%9!*$))!$9!&\"I)!\"Y-($I-)#)1##I9+#I1\"#Y=\"%)Q*$)9'#YE#$)A!"
+ "#9M!#YE##9A!%)=$%)Q!#IQ!#9Q!$)Y##YI\"$)Y##9Q!%*!!$:!!#IY!&Z%$%:%!"
+ "$J)%$I]&#*)\"\"J)!$J5!#J1!#Z=!'*5%%J9)%:5!\":=\"&*=+#JA!#:A'#*A\"#JM!"
+ "\"ZE!$JQ$$:M$$JM(#ZM!#ZQ!#JQ$$*U\"\"Z]!$JU!'[-)%*Y&#Z]!#;5\"%*]&$[%%"
+ "$;-##ZU!$:U#$[)!#[)!$J]!#[)!$+5!%:]+%[))\"[1!#K5$$;)#$[-$%JY)&;)+"
+ "%[-)%+)&$+!\"$+1\"\"[%!$+9\"%;1+$+%&$[5!&[5!![1!$;)\"$+-\"#[=!%+=!%+)\""
+ "%[A%%+=%%;9\"%[9!#K5'$[-!%+9\"&;9\"%K9$$[9!'+1+'[1!&[1)%;5\"&[9!$[=$"
+ "#[5!\"[5!#[-!$[5$\";1\"#[-!#[-!$;1\"#+1\"\";-\"$K-(![-$#+-\"$[)!%K)(%Z]%"
+ "$[1$$[%!$*]\"#[%!%K!$%;-\"%K!)%K!$#Z]!$*]\"$*]\"#ZY!$ZY%$ZU%%*U\"$*U\""
+ "&:Q$#JM$&JE-$*M\"#ZI!\"ZM!#JI!%:E!#Z9\"%ZE\"#J=!\"JE$%J5)#J9!#Z5!#J1!"
+ "#*9\"%J5%#J1!#J-!\"J-!\"Z)%#J)!$:%!$*!##I]!%IQ)$)]&%I]&$:!!\")Y\"$)Q$"
+ "\"J!!#IY!#YM#\"YI\"!Y=!$Y9'#95!#)E##95!#95$\"I9!!IA#\"I9!\"91#!8]%#9%!"
+ "$I%)#I%#$HY&#(Q!!I%&#(U##XY##(Y##XU!\"HU!#XQ!!HQ!!HI!#HI&&H9*\"HA%"
+ "\"81$$(A(#(9##89%\"XE(!H=!\"X)##H!&#H))\"8%!\"X!#\"7]!!W]!\"WY#\"7U!#H!$"
+ "\"'E#%WI(!GM##'I$#GM$\"WQ&\"GQ\"#'I$!(!#%H1&\"7]!\"()##8%$#8)%\"85!$H9!"
+ "$X1(#XE!#(5$#X=!#H=#\"89!#8A!$(M'$HQ'\"8I!%HI&#8A%%HQ!!HU!%)!($HE!"
+ "\"H]!#Y)'!H]!\"Y%##))#$)-'#Y-##I)%\"9A#\"I=!\"I9!\"IA!\"I='%YE!$)M'\")E\""
+ "#YE#$IA%&9A&#9M!\"IU$#YQ\"%)U'$YY&#J5$$I]&$Z)&\")]\"\"J!!#*%#%J)\"$*)#"
+ "$*-##J)!%*%'\"J1!#*5\"#Z9\"$9]$%*='#ZI\"#Z5\"!:=\"$Z=)#JE!#*E\"#JI!#JI!"
+ "#ZE\"$K!$%*M'$:Q$$*Q\"!ZQ!$ZU\"\"Z]!!*U(#ZY!$;!#\";-\"$JY$#[!!%+!\"#[)!"
+ "$*Y\"#[!!\"+)%#[-!$+)\"#[-!#+)\"\"[-!#[!!$[)!$+1\"#[)!#[%!\";1\"%K=##+5\""
+ "$+9\"%;9''+5\"#[5!%+=\"#[9!$[9!%K9$%;=\"\"[9!$[9!$[9!%;-\"&;I&$[9!&[5*"
+ "%+=!'[E!'+1&$[A!%+5\"%+=%$[I!%+M!#[5!%;5#&[=!#[9!%;9\"$[1%$[9!%+1\""
+ "$[A!%+1!$[E!&[=)#[9!'[5&\"[5!&K1$%;%#%+9!$+-!\"[5!#[%!\";)\"$+9!&+-&"
+ "!;5)$+5\"$K-$$K!$%;%'#[!!$+-\"$[!!%J](%;!#$*Y\"#Z]!#[%!%JY!':U)#Z]!"
+ "\"ZU!#ZQ!#ZU!$*I\"#JM!#JM!$*M\"#JM!$ZI%%JI(\"ZE!$ZI\"$ZA&\"Z)!$J-)#J9!"
+ "#*9\"#J1!#:1'\"Z9!%ZE)#Z)\"&*)!#Z-\"%:5(%Z5#$9]$%9Y(%)U+$YM'$)Y##Z!&"
+ "#9Q!#)Y&#YQ)$IM%')M)#YQ##I9\"#YE\"'Y=#$Y=$\"I=!#)9##YE#\"I5!!)1!$Y1'"
+ "#)-##Y%'$I)##9%!\"Y%\"\"9%##8]$#(]##(I$#8U!#(Y!#8M!#(E$#8=%\"X=#!8E\""
+ "#(A#\"85#$(=(\"X=##85%\"X1##X-$!H1##X-'!8%\"!W]\"#8%(\"W]##7Y%\"WQ#!GU#"
+ "!7M%!WE\"\"7M!#WM'$WQ)$X%&\"7U!#'Q!\"G]$\"'I!\"GU\"\"8%&!(!$!H)!\"X-#\"8!!"
+ "!(%!!H9!#(1$\"H-\"\"H9!!HM!\"8M!\"8I!!8M\"$(E(#(Y!!HM!\"8U#\"HU!#(U#\"8]!"
+ "!Y%!#9-!$9-%$I%'#HY%\"I1!%)1(%91&#I5%\"I9!!99\"#I=%#9=!#9=!#YE#$YI'"
+ "$YY##9U!$)U#&IE+\")M\"$IU(#J%!$)U#%Z!+\"YY!#Z%\"$:%!%Z%'#Z%\"$J%%\":)\""
+ "$J5%\"*1\"!Z5!%Z9&$J9!$:-#$ZE\"$J=!%JA%#Z9\"$ZE%!ZI!!:E\"#JM!$:M##JM$"
+ "\"*M!#ZU!$:]##ZY!#ZU!$*Y\"#[!!#ZY!#:]\"%J]!&ZQ*#[!$%+!\"%[!\"#K%$#[1!"
+ "#[1!'+)+#ZY!#[)!$+-&$+-\"&;A&\"[1!%+9&$KE##[1!$+1\"#[=!$K=$#[5!%+M!"
+ "$[E!$[=!%[=!#[9!%[9%%[E!$[=!%[5%'KI$%[9%%;9\"![=!%;E\"%[=!\"[=!$[5!"
+ "%;5#%K1$&KA$$[A!#+1\"$[=!!+E!\"[9!&KA(&[=!%;I\"%+=\"![I!&K9((+1\"%[-%"
+ "$[A!$[=!'+9\"'+9&%KE$%+=\"&[5!#[9!%+5\"$[1!$+E!#[5!#+1%$K1(%[1!$;%#"
+ "#;!'%+)&#[-!\"K!#$+)\"\"[)!!*]!#ZQ!\"[%!$+)\"&+!+$JU!$J]$\";)&#ZY!(ZY+"
+ "\"ZY!%ZY\"&:Q$#ZY!&:M+$:Y##ZU!!ZM!#*=%#JE$$JI!$JA$\"Z=!\"*A\"&:A%%*='"
+ "$J-%&:5%$:9##J5!$*5\"$:=$%J-\"#J%$$Z)#$J!)$Z%#\"YY\"\"YY!#J!!\"IY!#9M!"
+ "$YQ##YU\"&)Y)$)M$%IM##YM##9I!$9M!#9I!#Y=\"#9A!#)1##99!\"I5!\"I5!\"Y1\""
+ "!)1!#I)\"#I!#\"Y%\"$9%#!(U!\"(Y%$(]'$8M#\"8M!$HU-#XQ#$(9'#HA\"\"HI!\"89!"
+ "#HM%\"HA\"\"8=!$(9'\"(9\"!H5!#H1&#85$$X-%\"X-##H-&#H-&\"7U!$W](!GQ!\"7Y!"
+ "#G1'#'E\"\"WQ#\"'M\"#7M%\"7U!#7E#$'Y(#(!$#8!$#(!&#7M#!X)\"#X)\"#H-!\"85!"
+ "%HE\"#(=$\"(5%$(A%$8A(%HA\"$(E'#(I!\"(M\"#(I#\"(M\"$)%'\"8U#$8Y)#(]#$(]'"
+ "#I!#$)%$!Y)!%9))\"9%#\"9-##)%$\"9A#\"I9!\"I-!$)5$$)E$#IA!$)E!#9Q!\")E\""
+ "#9M!#YM#$)U##IU\"$YY&$J%%#IY!#YY&#YY\"%J!##J%!#9U!!ZA!$J)\"&*-+#J1!"
+ "\"*5\"%J1)%:9($*9\"\":9#%J=\"$Z9\"#J1!%JA\"\"ZE!!ZA!$ZI&%J=%%JM!$ZM\"$*Q\""
+ "&ZQ*#ZQ!$ZA&#JI!#ZY!%:U(%*]&%Z]!$*Q\"(;!-$K!$$J]'$;%#\"Z]$\";)\"$+)-"
+ "%[5!$+-\"![-!$;-\"$+1!$K=#\";1\"\";1\"$[-%&;5'\"[5!%+9\"#+9!$[=!$[9!%[1!"
+ "$[=!)[=*&;A\"'[A!$[-!(+=\"%+M!%[=!$[=!'KE,#;A\"(+A&$;M\"%KA$\"[A!$[A!"
+ "%+A!&[A)%+E!%[A%$[=!%+9\"%KA$%+U!';1,&[=$#;E\"%K-$&+A!$[A!%K=$'+A*"
+ "\";5\"$+E!';=\"&[9!\"[A!&[=!%+I!#[9!%[=%&;E\"%+=\"&K1$&+=\"$;=\"'K-!%[5!"
+ "#K1#$[1$%;1'&K=,#+-\"$K-$\"[-!#[%!$*]\"$;%\"#[%!&+-&%+%\"$*U\"&J]!#+!\""
+ "$*U\"$JM!#*Y\"$;!\"$[%%$[!!%*Q'%JM%%JI((ZU/#JI!%*9&&JY%#:E#%:A!#JA!"
+ "!*5!%ZI*#J9!$J9!\"*5\"#J5!#J5!$:1$#J5!#J)!#Z%\"$*1\"$*-#&*!$#:)#\"J!!"
+ "')])$IQ\"')I\"\"YU%#9Q!$)9*$YM##II\"$Y=!#YA#&)=-#I5%\"Y=\"\"Y%#\"YE\"\"Y-\""
+ "\"Y5\"#)-#!91+!))'%9)&#9%!#9%!!)-$$I!&\"Y%%%)!)#(U!\"XQ%$(Q!#(U#$HI$"
+ "#89%\"XA##8A%#XE!$(5%\"H5\"\"(5#$H1$\"X1#\"H-'$8)!$8%)\"H!!\"8!!\"G]\"\"WY!"
+ "#GE)\"7M!\"8!!!H!!\"GE\"\"7]!\"WU#&'Y&\"G]!&(!,#X%\"#8%$#H%&#(-!!(9!!(9#"
+ "\"(%%\"89!\"85!$HE$\"HE$#HI&\"XM\"#(I$\"XY\"#(Q##XU&\"8A!&8Y(#(Y!\"Y%\"%I%'"
+ "&I%)#HU\"\"I)!$Y-!#I5%!Y5!#)5##))##)A#&91'$IE)#9=!$9E%#YE\"#9M!$IQ%"
+ "#YA#&)Q(#IQ\"#9U!$J!&$)Y#$YU*$Z%*%IU)$IY%$*%#\"Z)!\"J-!%J-\"#Z-\"%*1'"
+ "%Z)'%*5'%:A!#J5$!ZA!#JA!#JA!%:9$#ZM!'ZI'\"ZA!'*M'!*Y$'*Y,%:M$#ZU!"
+ "%JY!#ZU!#ZY!$+)!!ZQ!&JU%#Z]!$*Y\"#+%&$[%!\"[%!$JY!#[)!#ZQ!%+)\"#[9!"
+ "%[-&&;9+%+1\"$[9$#[1!&;5#%;5#&+5\"#;9\"%+)\"$[9!#K=#)K11%+M!![I!$[E!"
+ "%+9\"%KA$&;=&%[9!%;=\"%;A&%;M\"&;E'&[9)$[I!(+5\"$+U!'[A!&+E!';M/&;I\""
+ "![E!%+M!%;A\"$[A!%;A\"$[I!$[E!&[E%$[I!$[E$%KE#%;M\"$[I!![A!$;I&%+9\""
+ "$;E\"%;A\"#+A)'+E*&+9*$[A!&+A\"%;=\"&;A'$+=!%;='%+U!#[9!'+9\"%;I\"%[9!"
+ "!+1!#[1!$;=\"#[%!'+-\"%[-)&;-$$[1!#[-!#[%!%[1)%;-\"#[)!\"[)!$+)\"';-,"
+ "%[!\"#ZQ!&+)&$:Q$%*U'#ZQ!#ZY!#ZY!#ZQ!&JQ-$JI!$JM!#ZE\"#JI!!ZE!#Z=\""
+ "#ZQ!%:=(#:=#\"Z=%\"Z9!\"Z)\"#J5!$J1($Z5&&Z!$$*1#%:)!#J-$!*)!%:!(#YI&"
+ "$IM%#IY!\"I]!$IQ&#IU\"#9I!#IY!#J!!%)I$#IQ!\"9M##9A!!YM!!)9!#)1#$I5&"
+ "!95\"\"Y1\"#91!#)-#!))!!I!##9)!%)%&\"8M##8]$\"8I##HU\"#(M#\"Y%\"#XI#$(I$"
+ "#8=\"#8I$$HE*!(I!#(=$#X=$\"X%#\"H5\"\"X1#\"8-!!H%##H)!#7U%\"W]#\"7Q!\"(%%"
+ "%7A$$WM$\"7U!#H-!\"WI%#7Y#!()!#8!\"#7]##H!&$H-$!H1!#X-!\"8=!\"H1\"%H-$"
+ "#8=$\"8=!$X=+\"XI\"\"8I!\"8A!#(M#$HM#%HI%#(Y##HQ%\"8U!%XQ&#Y%&#9)!#I)\""
+ "#9%!#I-%#I%)#)1#\"I1!#)5##)9#\"9=#!)9!$)E!$9I%\"I9$%)I!#)I&%Y=+&99'"
+ "#I]!#YU\"#9M!$Z-&!YY!#J)!#J!!%Y]$#J%!#J)!$Z)&$:A#\":%##Z5\"\"Z%\"#Z=\""
+ "$*9\"\":1#$J=!%J9!#ZE\"#ZI!%*E'#J1!$JQ%$ZI\"#:M\"$*M\"$JI!$*I\"$*Q\"#ZU!"
+ "&JY,#ZI\"%K!$#Z]!$ZY\"%+%\"#[%!%[9$';%$#[-!$;)#%+)\"%[-&#K-$$+9\"$;1+"
+ "%K1('[9&$[5$%+5\"\";=\"$[=!%[)&\";5\"'+=*%KI#%[=!$[A!&KA(%;A\"&;U\"'+A\""
+ "%;5\"'KE($[E!%;A\"%;E\"%;E\"&;I&&[M)%+Y!$[E$%;E\"%+Y!);E($;I\"$[I!%;I\""
+ "$[I!$[E!#[E!%[I$&+I%%;M\"%;1\"$+U!%;E\"%KI#%[=$$+Q!$[9!%+I%$[E!%[I!"
+ "%[I$$[E!&KE(&KA(%+I&$;E\"%[A$$;A\"%+U!#[A!$[=!%;A\"&[=!&[=$%+1\"%[9%"
+ "&[9!$+9\"#+1\"%[5!#+-\"\"[9!$[=)$;1#\"[1!%;1'$ZU!%+!\"$;-\"#[%!%[%)\"[%!"
+ "#[-!$[-$$+%&$;%#!JU##*]\"&:Y$$*]\"#JY$\"*E\"$*Q\"\"Z=!\"JU$%J9\"$JM$$JA!"
+ "#ZQ!$*M\"!ZA!&:9!%J5\"#*!#$:=$%J1&!Z1!%Z%*%*='\"ZE!$J)%#J1!$J%%#*%#"
+ "':!\"%9]\"\"I]!$IU%#YM&#Y]\"$Y]##9Q!$)Q$\"9Q##IE\"#9E#$)E##IA!$)9*$9=%"
+ "#Y=##I1%#95$&Y1-\"Y1\"#9!\"#I!#$Y%!#Y!$#(]##(]#\"XY\"#8U$$8Q(\"I!!\"XM\""
+ "$(E(!(I$\"HE!!(E!\"X=(#8E%#85\"\"H1\"\"HA%\"X!!\"X%#!(-!#8)'#X!!#7Y%!']!"
+ "#GM$\"7E!!'U!!'U!#X%'\"7U!#H!$\"8%!#X%'#(-!\"X!##(-$!H1#\"8=#\"(-#%(9&"
+ "#8I$#X='\"XA&#XE!%HI%\"8I##8M$\"XQ\"$HM#!HU#%(M#%)!\"!H]!!)!$%9)&%9%*"
+ "\"8]!#)-#$)-'\")A%%I1$!YA$$)5!\"I5!%IA*$9U!$)=$%)E$#YI##YQ#$)I$$YY#"
+ "&)U!!)Q!#9U$&I]*$IY&$:!!$YY&$*%#%*!!\"Z)\"#Z-\"\"J--#J1!\"Z5!$J5!#Z=\""
+ "#J1!#J=!#J=!%:Q$#ZQ!$:I#&:=%$:E$$JM%%JQ$#ZQ!$JA%&JY,$*U\"$*Y\"&*]&"
+ "&JY!\"ZY!$K!$#[!!%*Y&(;5($;%\"%JY(%;1#$[-%#;-\"%K-(\";=\"#+1\"%+1!$;I\""
+ "&[5!\";9&$[5!%+1\"\"[5!&+=&%+A!%KE$$+E!&+A\"&;Q'&+9\"'[E!%;I\"$;E\"%;A\""
+ "'KE,&[M$%;I\"';A+$[I!&+Q%%KM#$+Q!$[U%%+M%$KQ#%[5)&[]$#[M$$+M!%+M!"
+ "$;M\"$[M$$+M!!+Y)#+Q!$+M!&;A/#[A!%+M%#+Q!\";]\"#[E!$+U%#[I!%+M!(,!)"
+ "%;I\"%[E!$[A!%;M\"%;Q&$[E!%+E)'[E)&;E'$[=!$+Q!%+M!%[A$$[A!$[9!%+=!"
+ "$KI#$;5&%[9$%+5\"$[9!&*Y'$[1!$;-#%+1!$+1\"%+1!$;-#$;%\"%+=&#ZU!%K1$"
+ "\"ZM!&;!,#ZY!';5#$:U#\"+%!$J]!&J]!&*U+$:U#!ZQ!':A%$*M\"\"*A\"#JE$$ZM%"
+ "#*I\"%ZI\"$ZI&!ZQ!#Z=!)*%'#Z9!#ZA!%Z5\"$*5\"#JE!#Z-\"%J-%!:-&#J!!$J%\""
+ "%*%'%*!$\"*!%!YU!#I]!$9U!#9U!%IQ&$9M%&9M#$)E!#9E!#9E!\")E\"\"Y=%!Y5!"
+ "$Y1*!)9!%95,$)1'#I-%%9-)#))&#Y%#$)!!#)5#%8]#!H]##XY#\"HU!\"HQ$#(U#"
+ "%X])!H1#\"8I#$8E#\"81!!(=!$(E(#X9'\"(A\"$81&#H1&$8-)\"X)#\"X%!\"X)##'Q$"
+ "#7M#\"'I!\"7U!#GY#\"GU\"\"WM#\"GU\"\"G]!\"H%\"\"H%'#7]%#8=%\"H5\"#(5#\"(1##89$"
+ "#8Q$\"8M!\"XE#!HM&!HI!!XQ!\"XM\"%HQ(!XU$#8Y$\"8Y!#Y%*#X]&$Y%!#I%#\"Y%%"
+ "#I-%\"I)!\"I1!!Y-$#)5#!Y9!\"IA$%)E'#Y=#$)A##9Q!#9E!#9I!%IY\"$IM\"%YY("
+ "\"YU\"\"J%!$9]'&I]#$*!#\")Q\"\"J)##I]!$*!1\"Z-%\"J1!$:1!#J-!#J1!%*9&#ZA\""
+ "%*9'$JE%$*A\"\"*Q\"#ZQ!\"ZE!%:I'$*E\"%:E$%JQ!$JI%#ZQ!&JY,#ZU!\"ZY!#ZU!"
+ "$J]!#[)%$JY!%+5\"$+%\"%+)\"$;5\"%;-#!+1$#[!!#[1!%+1&&;E\"%;5#\"[)!#[5!"
+ "&[)\"&K9$'+=*$[5!#[=!$[I!&;I\"%[A!%[=$&;I&&;E\"%[E$$;=&%+I%&+A&$+A%"
+ "%;M\"$[E$#;Q\"%+E!$;Q\"%;M&$KY#$+Q!\"+U!$+I!$+Q!$;M##[=!&[M%$+U!#;Q\""
+ "&;Y\"%+M%%;U'$<%\"$+Q!$+U!$+U%$+M!%;U&&+Q%$;I\"&[],$+]!&+=!$[U$$;U\""
+ "%+M%&+M!$KE#%[M1$;Q\"$KE##+I!'+=\"$KY'&[I$![A!&;A&#[A!#+I!%[E!$[A!"
+ "%KA$$;M\"%[9$%;A&%[E$$[9!%[=!$[A!%;=\"#[5!&K)($Z]%$[E$$[)!$;1#&+%'"
+ "';!$#Z]!!+%!$[)!#[-%&;!#$*Y&\"*U\"$:Y#&*Y\"#[!!$+!\"#ZE\"#*]\"$JE!\"ZM!"
+ "%:I'#ZA\"%*E'#JE$#JA!#Z=\"$J=!#*9\"%*9&#JE!$:5$%:-!%:-($*)#$J%\"$*)#"
+ "$:1!#J%$#IY!\"IY#$9Y!!9Y\"\"IE!$IY%#)M\"#II$$IM&!YU!'9E+#)A#$IA%#9A!"
+ "!I=&!Y9!\"Y5(#Y=&!)=$!Y)!#I9\"\"I)!$I%'$I1##I!#\"Y!##XY&#99$$HQ'\"XU\""
+ "\"8Q##(I##8M$#(A$#(E#\"H=!!H=!!X-)\"81!\"(9\"#(9&#8!$!8-\"\"H%'\"7U#\"7]!"
+ "#7Q#$7M%!'Q!\"8!!#']!#H)&#()$\"81!!(5!\"X)\"#G]!\"X-\"#(5$!H5%#85$$85&"
+ "#HA%\"8A!!(M!\"8I!$8M(#(M##8Q$!(U!#HY%!XY*#9)!\"8Y!#9!!$)%$#9)$\"IA!"
+ "$)-$#91$\"91#$IA)$Y1'!Y=!\"I=!\")=\"#)E#$9I\"!IE##IY!$YM##IY!#9Q!#Z!,"
+ "\"IE!$9Y!$J%\"$Z!#$:1!#Y]\"%:-(':%#\"J-!%*1#%Z1#\"J1!#J5!!Z9!#ZA!!ZM!"
+ "%:-!\":A\"#ZI\"\"ZI!#JA!$+)\"\"*Y!%ZQ\"!ZU!\":U\"#JM!$[!!#[%!#[!!#ZU!$+%\""
+ "%+!\"#;)\"(K%*%ZU\"#[!!$[-!$K-($[-!#+%\"#K9$!+5$#[%!'KI#%;I\"%[=(%+1\""
+ "%[I!$[A!$[A!\"[5!$[A!%+A!$+Q!$+M!$[E!$+M!&[I!#;I\"$KI#%+M!#+M!$+M!"
+ "$;M\"\"+U!$;M\"$KI'$+U!$;Y\"%+Q!$;E\"&[])%[U%%+U!\"[I$'+M!$KY#%+Q!&;I\""
+ "$;Y\"%[Y$*;I'%KQ#$[U%$+M!'+Q*%;U\"%KY#&[U%&;E\"([I!#K]#%K]#&KU#$[Q$"
+ "&[Q$$;M'$+Q!&;I+%;Q+\"[Q%%+M%\"[E!%+=&%+Q!%KM#%[I!#KE#![I!&[E)%[E!"
+ "#;E\"#;=&%;A\"&+9\"&;A\"'[=!%+I%$[9!$[9!&;9#%;1#![5!#[1!$[5(#*]\"$[%!"
+ "$J]$#[-!%+)&%[5%!+)$$ZY\"#ZU!$:]##[%!!:]*#ZY!#Z]!#ZU!\"ZY!\"ZQ!$*Q\""
+ "(JM.#JM!$JM!$ZA%#ZQ!&:I!$ZA&#J9!#Z9\"$:1!\"J-!#:1#$Z1\"#Z1\"%:-%!*-!"
+ "#J%!#J%!#J%!$)M$()]*!)U$$II##9U!$9U$%)Q$#YE#&IQ(\")I\"$IE%$9E$#Y=\""
+ "$9A$#9M$&9-.\"Y)\"#)-#\"I1!$)%!&9%.\"Y-%$)9$#H]%\"Y!#$))!\"8Y!#(Y#$(Q'"
+ "#HU%$8E##(Q#\"HM$$(E$\"H9\"\"XA\"!(=!\"X=#\"X5#$(!#\"8)!$8-#\"H%\"\"GU%\"7Y$"
+ "\"WU!!GQ%#8-%\"7Y$\"GI\"#G])#()!#8%$\"8!!!H-&#(1##85$!H9!$XM%\"X=#\"H9\""
+ "#XM!$HE*\"H5\"#(M)#XM!$8E&#(U##HU\"!(Y!#HU-#(]!\"9-##X]!$Y5*\"9A#\"9)#"
+ "$)1$#Y5##95$$IA&#)-#\"I9!#)I##9I!%YU#$)U#%II##9U!#9E!\")U%#I]!&*%$"
+ "#YU\"#9]##Z!&$*!##IY!%J1&#JA!&:-)%:1!$Z1\"\":5\"%:5!\"*5\"$J-%!Z5!#ZE!"
+ "$Z5&$JE$#*M\"#JI!$JI$$JM%#:Q\"$JQ%$ZU\"$JY$$*Y\"#[%!\"*]\"%[!&$;)\"\"K!#"
+ "!Z]!%+1&$[)%%K%!$+-\"%+-&$[1!%K)$&[5!$+9\"%[5!$[9!\"[9!$;=\"$[=!#;=\""
+ "%;M\"![9!$[A!%K5$%+M!'KI,$[I!%;E\"%[Q(#[M%$[I!\"KM'%;M&$KQ#&+M&(+Q%"
+ "\"+Q!$;I\"&KM#%+U!%+Y%&KU,%+U!%KU#%+Q!&[E%#+Q!%KY#\"+M!%+U!%+Y!%;]!"
+ "%;Y\"%[Y$\"KU#$;Y&%KY#%\\)($+Y!'KY+(+Y!%+]!%+Y!$+Y!%+Y!'<!&&+U%%<%\""
+ "%+M!'+U!(+U!&;Y'\"+U!$+Q!$+Q!%+]%&[E-$+]!\"+M!%;M\"$+M!#+U!$[A$(;I/"
+ "$[I!%;Y\"&KI,'+Q)$[=!&[A)'+A!'+A\"&[=!&[-!$[9!$;9\"%[9!#[9!%K9(\"K)$"
+ "$+1\"%;-'%[-!$[)!#:Y\"![!'$K%$%[-!';-/$[)!\"ZM!(K%&$JU!$:M$\"ZU!$:Q$"
+ "%ZM\"#ZQ!$:I$#JI!#*I\"#JA!$:E$$*A#\"Z5!$:A#$J9!%J5&%:9$#Y]\"#J1!$J-!"
+ "#J1!#Z)\"!Z%!%:)!#I]!\"Y]!$)U#$9U!\"IU$#YE#\")Q\"#YM#$9Q$$)I#$)E#%)I%"
+ "#IA\"$)=!!)=!$Y=+#Y-##9=!\"Y-(\"Y%\"$)-$\"I)'#H]\"#91!$)5!\"H]!#(Y!\"X]\""
+ "!H]!#XU!\"XM\"#(M#'8Q)\"HE!!(U##X=$#(5!#H9\"$(E%\"85!#85%!X-!\"8!!$8%)"
+ "$'U&\"7Y!!GY!\"8!!$X!)#G]$\"8-!\"H%\"!8-%!H)!$(1%\"H=!\"89!\"8-!#(I#\"8A!"
+ "$HA$#(E$$HM*$(=%$(Y'\"XQ%#XU!#(]#\"(I\"\"8U!#Y!#$)1$\"))(!8Y\"#)-#!Y5!"
+ "!I=#$I9#!)A!#Y=##YE#$I=&$)A'#YE##9I!$)M'$9M%%)Q!$YQ#!YU!$*%#$J!&"
+ "$Z-&#J%!#J!!#Z-\"$:1##J-!#J1!#J-!%J1)&Z5+%*=##JE!'*1,%ZE'&*A(#JE!"
+ "#JA!$JM!#ZQ!%JM%$JM!':M(!*I%$+5\"&*U#$ZY-!ZY!$*U\"$;%\"$;!\"%[!%#[-!"
+ "$[1!$;1\"#;-\"![1!\"[1$$[1!$[5!#[5!'+A&$[=!$[9!%;I\"$[1!%+9!$[I!&+E%"
+ "\"[E!$[I!%[E!$[9!&KI(&;Y&$+Q!'KQ,%KE'$;I\"%+Q!&KQ#%;I\"%[Q)%+U!'+U!"
+ "$+U!&+U!#[Q$#;U\"%,!!(+]!'+Y!#+U!%,%!'<!+%[U%%;]!%[Y$%[I!$;]\"%[]$"
+ "'K]#';]*\",-!$+U!(;]\"%L%#%+Q!'K]'&[U%#;Y\"&KU#%+]!%+Y!$<-\"$+I%\"+Y!"
+ "$+]!%+Y!&KY#%+Q!$KY#'+Y%$+U!%KU#&+U!!KQ#';Q\"\";Q\"$[Q%$KQ#%;M#&+M)"
+ "#+]!&[M$%[5$%[I!%;A\"%KE#%+]!';I'$[A!%K=$$[E!$+M!#[5!%K-(%+5\"#K5$"
+ "$K=#$+!&%+5!![%!$;1#%;-'#[)!![9!#[%!#[)!&JY-\"Z]!%Z]\"#JY$\"ZY!$*]\""
+ "$JU$%ZQ*#[!!$:M'&ZA+&ZM&$:M#\"ZE%#JA!$Z5\"#J9!#J5!$Z9&$Z5\"\"Z5!#Z9!"
+ "#J-!!:)\"$Z-)#J%$$:!$$YU#$)Y##9U'#IY!#J-!#IU%#Y]\"%)M(%)Q'#Y]\"#YE%"
+ "\"IU$\"IA!#I=%\"IA!%9=)#Y9##)-#%9%&\"9-#%9%'!)1!\"I-!#9-!$I-*#(]#$(I'"
+ "$(U%#(M#\"XQ\"\"8M!$(M+!XI!#HE\"#(5#\"8=#\"X1#\"XI\"$(5\"\"H1!#X1&\"8-!\"X=\""
+ "\"GY\"#(%'\"X!!!']!\"'I!\"']*\"8)!\"X-#!H-!\"H-\"\"X1&\"(9%!X9)#89%\"(E-#(Y#"
+ "#HQ%#(I#$HI'!XQ!$(I'\"H]!$HU#$)-$\"H]!#)%$$)%%!95\"#I)&#Y1&#Y1&#Y1&"
+ "\"IE!#99!#Y=&#Y=##I5%!I1##Y=##9I!%9M)#YI#$9E%$)]##YU%#IY%#)Y#%Y]+"
+ "%9]\"\"J%!#J-$\"I]!$Z5\"&Z1'$*1\"#J9!\"Z5!%:9(#*E\"#J=!#JM!#ZA\"$ZE\"#ZE\""
+ "#ZA\"#:Q#%*9##ZU%#:Q#%*Y&&:Y$#[%!$Z]%$*]\"%Z]*%;%##[)!!+)!#+-\"$+)\""
+ "\"[-!$+5\"#[1!#[1!$;=\"$K)$$[=!%[A$%[9%%[9$&K=$&+Q!%+M!$;=\"$+=%$[E!"
+ "&+E&%+I!&;I&'[M)%+M!%;M'&L!'%KQ'%KQ'$+Q!$[I!'+U%$KQ#%[U$%K]#&+]%"
+ "&;Y&&;Y\"%;Y\"&+Y!&+]!%+]!%+]!&+]!%,1!%;Y\"(+]!#;Y\"\"L)#%KY#$+]!%,%!"
+ "%,!!&[])$+Y!&;Y\"%,%!&L=&%<!!%,%!(,!.%L)\"&L!#&\\!(&<-!#;I\"*K],$;U&"
+ "%;Q\"%K]#%+]!*KY#%;Q\"$KU#%;Q\"$[I!%KY#&KY'%;U\"&\\!$%;Q\"%<%&%;Q'$+Q!"
+ "%+I)$;I\"&[E%%;M\"%;A\"&;E&#[E!%[A!%KQ#$[A!%+A!$;M#$+=!&;E'%+9\"&+9\""
+ "$[5!$K5$#[A!!+5!%K1(%*Y\"$[%!#ZY!$+)\"$[%%#[%!%ZY!%*M''+!/#[!$$*Y\""
+ "$ZU%'ZU'#JM!#ZI\"%*A'#ZI!&JM-#:E#$ZE\"#:A##ZM!%:9$#Z9!#Z)\"#Z9\"\"Z5!"
+ "$*=#\"Z5!#J-!$J9!#IY!$9Y$#IY!#)U\"!Z)!')M#&IY+#9U!#YQ##IM\"\"9A#%9I)"
+ "\"Y5%$YE#$YA'#9=$\"Y9\"\"I9!%Y-\"#91$$)%(!Y-!\"I!!#Y))#9%!$8U\"$8Q(#8]!"
+ "\"8Y!\"H]!#HM&$8E&$XY*\"HA\"#XE&\"XE\"\"XA#\"8=##(9)!H5!#H%&\"81!$H-*\"8-!"
+ "\"WY%\"WQ#\"W]#\"8!!#8%%#7U#\"H)\"%(-$#(-!#(5$#(1$$89&#H)&#(1!%(='!H9!"
+ "!XM'\"XM%\"XQ\"\"8I!\"HU!\"91,#(Y##XU)#I%#&95$%9)##H]\"\"I1!#Y1##Y1&#)5#"
+ "')M&%99)#)A&%9E)#9A!#YU\"!II#$9M%$IU%&9I&$YU#!9Y\"#YM#\"IY$%9]$!)Y!"
+ "#J-!#Y]\"#9M!#J-!&:5%$:=##*5\"$J5%\":9&$J9!$*=#$JA!#J-!#Z=!#[!!\"*U%"
+ "%ZM\"$JY$#JM'#ZQ!&ZM\"![!$#ZQ!%K!(\"[-!#Z]!$Z]%%+-\"$+%\"\"[)!!;)\"%+5\""
+ "$*Y\"%+1&$;1#$[!!&[5!(;A0$[5!#[=!%;I\"%;M#%+M!$+E!%[E$%[I$!;A\"%KI#"
+ "&[I!%+U!#KU#$+M!$;A\"$+]!%KM#&KU#%+U!&KU+(;U&&+U%%[M%&<!&&+]%%+Y!"
+ "%K]#'[])#;U&$+Y!%\\)##<!\"#<%\"%,!!&,1$&L-#&+Y!%L)\"&L1&$+M!&\\%(%,%!"
+ "#<)&&\\%$%L-\"'<!*&,%!%L!#'\\%$\",%!!<%\"$<%!%<%\"$<-!*<!&%L)\"%+Y!&+U!"
+ "#+Y!(L!'$\\)#!+]!$KY#%+U!%KY#(<)!%,)!&+M!$[U%%\\!#'+M!$[I!$[I!&[I!"
+ "$;M\"$;U&$;E\"%+M%#[I!%;I\"%;A\"&+I!&[E!%;E&%+5!';-,%[I!&+Q%%+M!'+=&"
+ "$[A!&+E&$+5\"\"[5!%+1\"&;1#$+-!%[-&%;)'&K)-$+%\"%+%&#ZY!$+!\"\"Z]!$ZY%"
+ "\"ZY!$:]#)ZU'$[!!&ZU*!ZI!$ZM\"$JM!!ZI!#ZE!$JA!%JA\"$:9##J9!\":1\"%J1)"
+ "%:5!&:%&#J%!$Z-&%J-\"#Z%\"\"J!!&*),!Z%!$IU%#9M!$IU\"%Y]+#9Q!#YM##YM#"
+ "$IE%#9E!#)I##YE#$)9'$9A+#I9%#91!!Y5!#))#$I9#\")%\"$)!!\"I)!$)!%#(]#"
+ "#XY#$9!#\"XM\"\"8M!#HM\"!HQ!\"(E\"\"8E!\"XA#\"X%!\"8E!#(=!!XA!\"H9\"$8)#$(9\""
+ "#GU(\"8!!\"8!!#(!'\"81#!GY!\"X5#$8=##81!#(5#%(9!\"X=\"$8=&#8A!#(E$\"XU\""
+ "$HI'\"8M!#HQ%\"I!!#XI&#XY&%(]%\"X]\"\"8]!$)-!%)%%\"Y!\"#I%&#9=!\"I1!$9=("
+ "$99%!Y5!\"I=!\"IA$#IY%$)I#$YM&$9I%%9M%$IU\"$)U##9U!%)Q($:1!#)U##J%!"
+ "#Z-\"$:5$$Z5\"$:%$#*1\"$JI%%:A$$*E\"#J5!#ZI!#JI!!ZA!%*M'#ZI!$:I#&:I("
+ "#ZQ!$*Y)#ZU!$*U\"!:]\"#[!!$K%$$;1##Z]!$[%!$[%!#K)##[)!$K9$$K9(%+9!"
+ "&;)'$+5!%;5\"%[=!$[9!%;5#$KQ#$[A!%[I!%K9$%+Q!%;I\"%+I!&;E\"'+A!!+M!"
+ "%+Q!$+Q!&;A+%;E\"&+Q!$KY#(;U!'KY#%+U%$<!!%+Y!&+Q!%;]\"#,%%%+]!%;]\""
+ "&+]!%<!!&,%!&L!')<)%&L%\"&+]!%,)!&,%!%\\!#&,5%%;]!%,%!%+]!#,)!%,)!"
+ "),))'L1&%L%#&L)\"%<1!&\\1#%,1!#;Y\"%L)\"&L%#$\\!$%\\)$!+]!%\\)$$+Q!%,-!"
+ "\"<!&%L5\"$<)\"%,!!(;U'%<!!&<!\"%,-!%\\!#&;U&&\\%($+Q!%KQ#%+Y!%+]!$[I("
+ "$;Q\"%;Y\"%;U\"$+Q!$+Q!\"+Q!$;I\"#[A!$[A!&+I&$[I!&KI#&;='%KA$$[A!&KE("
+ "&K9$(+=!$[9!#[9$%+-\"#[1!$[1!#[1!%;)'\"[-!\"[)!%;%'!Z]!$+-\"'K!!%+!-"
+ "!JU#&*U\"$*Y\"#Z]!$*U\"$*Q\"#JQ'%JM!#ZI!%*M'%ZE\"#Z=%#JE!$*=\"$*E\"$:=#"
+ "!*)!#Z5\"&*=$\"*=\"$:)$%:)!\"Z-%#J%!\"Y]\"$)]#!Y]!\"9U&#Y]\"$J)%\"YQ!$J!%"
+ "#9E!&9I&$9E$%)A$#IA!#)=##99$#I9\"#95'#95!!Y)!$I%##9%%#Y!##I!\"%8Y$"
+ "$(U(\"8E##(M##(M##XM'$XU'#(9'\"8Q!#(E#\"HA!#8=$\"8A!#X9/\"85!%7]+#(%$"
+ "$'Y)#GU&\"8!!\"8!!#81!\"H5\"\"7Y!\"(1\"\"85##(9!#X1'#X-'#(E##8A!!(E!\"8I#"
+ "\"8U#\"HU'#(U#$)!'\"XY%#(Y#!Y!$#Y!$#)%##9)$\"I)!#I5%$91%#Y9#\"I5!!Y9!"
+ "#)=#\"IA$')A&#Y=##YU\"%IQ#$YM&#IY!#IM(#YU&&YY!$)]#%)]($J%\"':%\"%Z)'"
+ "$*)'$:-#%I]##J5!\"*5\"%:5!$Z5&$J=!\"Z=!&*A#\"ZE!#JA$%JI)$*I\"&:U$#ZQ!"
+ "&JQ%\"[!!%JQ(\"*]\"$J]!'K!&$K%$#[!!%ZY!#K%$$[1!$+-!%[-!'[9!#[)!\"[9!"
+ "#[5!&+9&$+5%%+=\"%;=\"$[=!'+A&%[E$$;I\"&;M\"%+Q!$[E!%;I\"$+M!%+U!%+Q!"
+ "#KQ#$+Q!#;Y\")+U%%+Q!&+Y!';U+&;Y.%;]!(;]\"%,)!#,%!%,%!&,%!(\\%,'\\-,"
+ "'<!&$,)!&<%%$,%!&L)+$,)!%\\)#&L%'&,%!)\\!2$,)!%;Y\"$,%!%,1!%L-\"%\\-#"
+ "$L%#%,-!%,-%#+]!$,)!$\\-$%<9!%L-\"&,%!%L5\"%;Y\"%L5#'L)\"%L)##<%&%L)\""
+ "%,)!&,)%%,)!%;M#%L)'&;]\"$,1!)K]#%L!#&K]'%+]!$;]\"%;]!'[],&\\!$%;M\""
+ "%+]!$,!!';I\"%;U\"%;Q\"$;Q\"$KQ#$;Q\"$+M!$[E$%;I\"%[=!#[I!$[=!&;Q\"%+A!"
+ "%+9\"'+=!$;A\"$[5!#K9##;=\"%+1\"#[9!$+1%%[9)$+-\"$;-\"$+)\"#[%!%;%#&*]#"
+ "%K!)%ZY&#ZU!#[%!$:U$!K%#$ZU%$ZY%$JM%#*I\"\"*E!#:A#$JE$'*=(#J=!#J9!"
+ "#*5&$*-#$Z5&$:-$#Z-\"%*E*\"Z!!%:%!%*%'$*!#&)]%!)]!$9]!#9M#%)M$$9Q!"
+ "\"YM!\"YA%$)E$#Y-#%I=$#IA!#)A##I9%#I5\"#Y5&#Y9#\")-(#9)$$9)\"#Y1##(Y!"
+ "!Y)!#8]$#(Y#\"8Q!#XU##8E%\"XI\"#8A$#HE&!HA(\"8A#\"8E!#H9\"$H-!!X5$\"81!"
+ "!7U\"#(!$#H1(!H!#$()(#(-$\"81!!X5&#H1&#X9$\"XI\"#(A!\"HA!#XE!#XE$!HM#"
+ "\"HI!#HY($8Q#\"XY\"#H]%$H]#%I%-#99!\")!#$9))\"(]\"\"I1!!Y5!$95\"!I9#\"I=!"
+ "$)=!%9E\"#9E!#IU!%)Q$$IQ%$9Q!#9M!%IU*#J!!%J%*$9]!#*%\"%:%!'*1!%*)'"
+ "$*-#%J-&#J5!#J-!$J5!#J5!%*=#$ZE&$*A&#ZQ!$:I$&:M+#ZU!$:M#%*U\"%*A&"
+ "\"[!!':U!#ZU!#[!!$JQ!#ZY!#*Q\"%[-!![)$#[A!$K-$!Z]!$;9\"%K1(%;=&$[%!"
+ "%[E!![-!$[5!%;9\"&[E!%[=%$[E!%+E!%;I\"%;E\"%;I\"$+M!$+M!\"+U!$;Q\"&KU#"
+ "&KQ#'+Q!%;Y\"&L)#%;]!$+]!&;Q'$+Y!%,!!',!!&+]!#<%*'<-*',-%%<5!%+U!"
+ "\"<)\"%,!!&,1$'<5!(<-*%\\)$%L5#&<-!&<=!',-%&,%!(L!\"%\\-#%,-!',5$(<%!"
+ "',5$$L1'&\\1(&<=!',1)%<5!%<5!(,1-&L-\"%L-#%\\=#%\\9#%,)!(L)\"#,-!%,-!"
+ "'<9!%,)!%\\)$&,)%%,)!&L-\"%L1\"$\\%#&<%&\",5!%\\%#&\\!(%;]\"&L!'%+]!$\\)#"
+ "%KY#'+Y!)+U!%+Y!&+Y%%+U!%,)!#[I!$+Q!$KQ#$+E!$KM#%[5$![I!\"[E$#[9!"
+ "&+1&$;A\"$[A!\";E\"#K1$'[E-$[1!$[1!$+5!$+)\"#[1!#[-!$[)!$+)!#[9!#[)!"
+ "$[!!%+!\"&*]\"\"ZU!&J]%\"ZQ!#JA!%:Y$!ZM!%JM!\"ZM!\"ZI!%ZE\"#:E##ZE%%:=("
+ "#Z=!\"Z9!\"ZM!$*%##Z1\"#Z-\"#J)!$)]'%*%'#J%$$II%\"J-$!YQ(#IY!$9M(#9Q!"
+ "#9Q!#II\"$9M%\"II!\"I9$%YE($II)$99!$I-)\"95&$I-&#)-#!)!!$))$%9)&#I%#"
+ "$Y!$\"I%!\"8]!\"8U!%(Y%#(Q##(I$!XE'#(I##(E$\"X=\"\"X5#\"8M!#(9$\"85!#85$"
+ "\"()\"$GQ\"\"H%%#X-$#(-$#H-#\"(5\"#8M%\"85!#8I$$89##8A$$HE'$85##(='!XM$"
+ "#(M!\"HU!#(I!#9!$#8U$!Y)!#I%%%I1$\"I%!#95!#Y-&$)A'\"I5$\"IA!\"IE!%)9("
+ "#YE\"%9Q\"!YE$#9Q!&9M##YQ#$IQ%#YY\"#IY!$9]$#IY!$:!$%*%'#IU(\"*)\"#Z)\""
+ "$*-#$ZE&$ZI\"$Z9&#J9!$J=!$J=!#JA!%JQ!&*E+#JI!&ZM&$*Q\"#ZE!#*M\"$*Y\""
+ "$JI!#JQ$$+-\"$+-\"$K!$#[%!&;%+#+-\"#[)%#[-!$K%$'+)'\"[5!$[=!%[9$'[5!"
+ "%K=$#+5\"#;=\"$[1!#[I!&+E&&[M%%+I*%+I&\"[E!\"[E!\"[M$#+M!%+U!';Y\"&[U("
+ "&+Y!%;]\"%+Y!&+Y!%+M!(L9!$<!!&\\%#\"\\-$%\\%$&K]'&<!\"%<)!&<1!%\\=#%<%\""
+ "&<9!%,-!&L9&&<1%$LA\"%L-#$,1%&\\1(%L-/&L-\"%<5!$<1%(L9/&+U!$\\9#)<%!"
+ "*<-!&,5$',5)%,%!$,1!'L5'&<5!%L5\"&,5(&\\1(%\\1#%,%!&,9$%<1!\"L1#&<1!"
+ "&L-#$,-!'\\=\"%<1!%<A!%L1\"&L1'&<1!$<!\"&L)\"$<%\"),!%$,)!',%!\",!!(L!0"
+ "',!)&,!%&[M)'+Y)%K]#%[I$#;Y\"&+U!%[U%$+Q!);U&#[E!$[U$$+M!&;Y\"%[M$"
+ "&[A!$[A!'[E!$[I!(;5(%+=\"#[A!$[9!%;5'&K!%#[-!$K9$%;5\"$KA''+5\"\"K1#"
+ "#[5!$;)#$*Q\"!*]%#[)%$JU$!*Q!#:U#$:Q#$JM,#JM!#*M\"$*M\"%ZE\"%ZE&$:A("
+ "#Z=%$JA!$J9!$*9#$:9##Z-\"#J-$$Y]&%:-!#Z)\"$Z%&#J%!\"I]#!YY!$9Y!!9Q\""
+ "\"YM\"$9I$!II#!9I\"#)U)$)E#$9A$%9=##Y9&\"IA!$YA$#95!\"Y1\"#))#$9!(#9!!"
+ "#I%##Y)#$9!##8Y$$X]+#)%#\"8Y#$HI*\"8M!#XM&#(I#\"8A!!H-#$(A\"$(9\"#(%$"
+ "#8!##(%$\"H=!\"X-\"\"8-!#H5#$(5%#(9$\"X9\"#(M##8A%!XA$#(A!$(E\"!HI#\"HM!"
+ "$XQ!\"HU!\"HQ!#9-$\"X]\"#8]'#H]\"$Y9'!Y1!#I5%#91$%)-+\"I=*\"IA!#)M\"#9A!"
+ "#9E!#YE##9I!$)M$#IY(!YI!#9U!#I]!#Y]\"#9]$&*!,#J5!%*1'#J!!%*)$%*1+"
+ "#J1!#J5!#J5!%J9)#ZI\"$Z=%$:=##ZQ!'*E(!ZQ!%:E(#JI!$*]\"$JE$$JQ$%+%&"
+ "$JM$\"[%!&ZU&$:U'#[!!$JY$$[)!!+%!&;!/&[1)$;)#![5!&;9'$[5!'+A*%+=\""
+ "#K=$&+5&&+9&%;E\"&[E!(+Q!'KY'$[I!$[E$&KQ(%;U+$L!#';Q'$;U\"&KQ(%[M$"
+ "%,!!%,!!%;]\"(\\%(%K]#$,-!$L!#%,)!%\\%$%,)!'\\),$,)!%,%!(\\11%<%!$\\-$"
+ "$,1!&L9'%,1!&,1$&L5*%<9!%\\9#'<9!#,9!%L5\"$<E!#\\=($L5''\\5#*,%.%L1\""
+ "%<9!%,%!!,1!*,9-(\\9(%<!\"%<9!#\\5#%<1&#\\5#&\\)((,)-%,)!%,5%%<9!%<9!"
+ "$,5!%L=\"%<5!%<=!%,1!$,5!%,-!%L)\"%L-\"&,-$%,)!%L1'\"<-\"#,%!%\\%$(<-!"
+ "$\\%$%;]\"!,!!$\\1#&[]#'L!,#<%\"(,%)$+U!'+U%#[U$%[U($+M!&;M'#+A%$[M$"
+ "%;M\"$[I$$[=!&KQ#%[A%'[E)$;=\"%+9!%[9!%;A\"%[5$%K-$\"[1!#[)!$+-!'[9!"
+ "#ZM!\";%\"#Z]!$Z]%$+)!$:Y#\"[1!$*]\"$*U\"$*]\"$JA!&:M$#ZU!#JI!#JE$#JE!"
+ "%JA)#ZI!$J5!#J=!#Z5\"%*E'%:1!%J-*$J1\"%Z!'$Z)&\"J!+$:%$#IY$#9Q!%9]("
+ "\"IY##IQ\"#9M!#YM#$)M#%Y9\"\"I=!#Y=#!Y=!%)I($)-'\"Y-\"#Y1&!H]!!I)#\"I-!"
+ "#9%'#9-!%(I\"$H])#HY%#(U##(I!\"8Y!#(I#\"8A!#X9$$89)\"8I##H=\"\"X)#!H=!"
+ "\"X)#\"H-!\"H%\"\"X%##85!\"X9##H5&#85%\"XI($(A!!(=##(I'\"HE!#HM%#HQ%$HE'"
+ "$(U'#8Y$\"Y%\"\"X]%&9!($)!$\"I)!#9-$#8]$#Y9)#Y5#%9I&#)A#\"IE!#9A$%YI!"
+ "$)M$$9U(\"9Q#$II&#9U!#YY\"%)U(#9Y#&*!+\"YQ\"$)]##I]!%*)#%*-##Z1\"$J1\""
+ "%:5!#J-!#JI!#*=\"$J5%#J=!':=&\"Z=!&*I+#JE!#JI!$*Y\"#ZU!#ZY!%JU!$+!\""
+ "%:U+#[!!&Z]\"#[%!#;1\"%+)&#[-!$[1$%+=%%;%'*+1+$[=!$[9!%[E$%[5$&;M'"
+ "';E+%;E\"'+E&%+Q!%[=$$+M!\";A\"$;A\"$+Q!%KI#%;Y\"%<!\"%+Y!'[Y$%,!!%KU#"
+ "'<)!'L%+%\\!##<5!'L%+%,)!%,)!\"<%\"%K]#%L-#(L1&%,-!&,)!',5(',)%%<9!"
+ "%,)!&\\5#\",1!%<A!%<A!%<5!'L-\"%\\5#&<9!%,1!&<9%&L9\"%<9!%<9!'\\-##<5!"
+ "%<=!%<A!%L=\"%,A$&L9\"%<=!&<A!'<9!%<1&#\\9$%<5!%L9\"%<A!',I)%<5!&<5!"
+ "&,9$$,5!&\\9(&<-*%,5$&<5!#<1\"#\\1$*L5!*,-)'<1!&,)%%<)%'L1\"'<)!&[]$"
+ "&<!\"%,%!&L5''L%,#<%\"'+]!%;]!*,%*%,)!%\\%$&+Y%#<!\"%+U!&;Y&%[M)#;U\""
+ "%+E&$+U!$[I!%+Y!%[U$\"+M!([=&%KE$#[9!'+A\"%[5$%K1$#[5!#[1!$;-#$[)%"
+ "$+1!$[5%(+=\"%Z]\"$[!&\"[)!$;!#$*Y\"$*]\"\"ZM!#Z]!#ZQ!#:Q\"$ZA\"%*M&$JE("
+ "#ZA\"\"ZI!\"Z9!#:9##:=#$*1\"#Z5\"#J9!#J)!!ZA!#J-!$*)#$*!#\"J!!$:%$#)Y\""
+ "%)U!#Y]&$9M%\"IQ!\"II!\"I5$#IU!#9I!#9I!#I=\"\"YI!\"9=##I1(#95!#)1##Y=#"
+ "!Y)$$9%#\"8Y!\"8I!$(]!!(U!\"8U#\"8Q!$(Q'\"XQ\"#XM&#85%%(A&$(A\"!8=\"!H9&"
+ "!8!%\"H%!\"X1\"#H-%\"X5#$8=&#X5&\"X=#$(=!%8E$!XI!#8I%\"8Q!$(M\"#XI!\"(U%"
+ "!Y%!\"I!\"#(]!\"Y%#$Y)!!9)\"#I)&\"9-#$91(#)A&\"I5!#)9&!IA#!Y=!#9M#%9E)"
+ "#YA#%95##9Q!!)Q'!YU!%IU##IY!$J!%#Z!\"\"Z!!$J5%$J5!\":-##J)!$Z1&&Z5'"
+ "#J)!$Z9&\"*E\"!:A\"#JA!\"ZE$%ZI\"$ZI%#ZI\"#JM!#ZQ!$*Y\"!*E!$ZM\"$*]\"$*]\""
+ "%*]\"%J]!$*]\"#;%#%+)&#+-\"$+9&$K1$%;5&\";E\"$+9\"$[9!%K5$#[=!&+1\"%+5\""
+ "#;I\"$[E!\"[I$'[I!$;U\"$[Q%#[Q$%+Q%%;U\"&;M##;Y\"%<!\"$,!!&[]#%KY##,!!"
+ "',!!)L9%%L%#'<)!$[]$$<-\"%,%!#,-!%,-!\",5%'<1!%<1!'L9\"%L)\"&<9%),5-"
+ "$,5!&<5!'\\9(%<A!&<9*%<=!&\\9($<)!%<=!%<=!%L=\"$LA\"'\\=(%<E!#,)!&<E!"
+ "%<1!(<E$\",A!'\\A\"'\\=,'<=!(LI.%LE\"&<M!$,9%%L5\"&,=$&<5!%<=!',9$%<=!"
+ "#<9!$<1!$,9!&<I!%<9!'<1*%<5!%L5\"&\\-($L-#&L)\"\"L1#%<5!$,-!%<9!'\\-("
+ "%L1\"%,-!%L5\"&\\%(%KY#&<)&\",9!&L%''+])&+]%%;]\"%+Q!#+Y!$+Y!&+])#;Q\""
+ "$+U!&[]$$;M#%K=#&+5\"$[E!&[E!&[=%&[9!$+=!$[-!%+9\"%+1\")+5'%;5\"$[1!"
+ "#[-!#[),\"[%!#Z]!#[%!#[!!#[!!%JY(#Z]!$K%($ZU%%*Q\"&JQ!%JQ!#*]\"$J=!"
+ "$ZQ!!ZI!&JA\"#*=%\"*=!#J9!#J=!%:5!\"Z5!$J-%#J-$&*)!#Z!\"#Z!)%*%##I]!"
+ "$9M!&IQ##9U!#)M\"$9E$#9M!%IQ#$)E!$99\"$YA!#9=$\"I=!$91(#95!\"91#\"I5!"
+ "!I%#\"X]\"$9%#\"Y!#%I!$#I!&\"XQ\"\"XU\"!H=!\"8M!$(I!#(I##(=$\"XA\"!H=!#X=#"
+ "#H!&\"(1\"#()$\"85!\"8A#\"H5$!X9&!(A!!H9(\"XE##XE&#(I#\"85!\"XQ%$(U(#8I\""
+ "#I-\"\"I%!$)!'#8U!%)!#\"I9!!)1!!I%#\"I1!\"9-#&Y5#!YA!\"YE%#IA\"#IA!\"II$"
+ "$)E!\")E\"#YE#$IQ)%)U'&II+$IY%$*!#$YU&$*!#!*-!$J)!#J1!%*5#&*5$\":1)"
+ "\"Z5!$*=\"#Z=\"$JM%&*=(\":A\"$ZM\"%ZI*%*M\"%*Q\"$JU!#JI!#JE!$+-\"%J]!%+!\""
+ "#ZY!$[1!%[)%#;%\"$[-%&;5\"%;5&\";=\"$[9!%;5#%K-(%KI##[I!#;I\"%+M!%[E$"
+ "$[I!$[A!%+E!%;U&$+Y!'KQ#%+U!'+M!%<!\"%;]!&+]%%,!!&;]&$+]!%,%!&L%'"
+ "([]$%,)%$L!#'<)!%L-\"#,-!\",1!%,1!',-$&,1$(,A-)LA*%L5##,5!&<9!&L9\""
+ "$,9!'<)!%\\E#&\\=(%L9\"%L=\"&<9!!<=\"&LM&%LE\"&<A&%<A!%\\A#%<A&'<=!+<E."
+ "%LI!#,E!#,A!(LM/%<9!&,M$%L1\"',A($<E!&\\1,'<A*'LA&$,A!%LA\"%L='%,1!"
+ "$L=\"#,9!%,-!%L=\"&<=!\",9%%,9$$<I!#,9!(L9&&L5+'<=)$\\A#%,%!'L1\"(<%!"
+ "%L-\"&,)!$,!!%\\%#&\\)'&L)'',%!&<)%%<!!$L!#%+]!&,!%%,!!&;Y'%+Q!'+U%"
+ "&+M!'+A&$[Q%#[I!$[M$&+I&%;Q\"(+U)&KI(%+E!([E$!+-!&+=&&;9#(K)%#[5!"
+ "$K!(#[-!$;-\"#+1\"#ZY!$;%#&J],#[%!#[!!#*]\"\"ZY!$:Q#%;!'%:E$#JM$#ZM!"
+ "%*I\"$:1$%*1#$JA%#J=!$:=#$J9!$J5!\"Z=!$Z1&$J9!$*-#$:-!!J!#!IY&#IU\""
+ "#IY!$IY&$)U#!YU!%IM*!YE!#9A!'IA&$)U#$YA##Y=##Y1&#I1%\"Y5\"\"I1!\")E+"
+ "!Y-!#I)&#))#!)%$$9)%$H])$9!&#Y!&\"8Y!\"I!!#(M#!HI##HE\"\"8A!#(M!$8=&"
+ "#(1'%85+#(-!\"8-!$85&\"8=!\"X=#\"X9#$(9%#(E!#8I%#HU\"#HQ\"#(Q#\"8U!#(]&"
+ "#(U#!9%\"#9!!%)!)\"Y)\"$I5##Y-&$91(#IE!\"IE!#)9#!YA!$9A\"%IM*$)I!\"9I&"
+ "#9M!#)M\"$9Q$!IQ&$)]#$:-#\"IU!#Y]\"$*%##J)!$J%&$Z1&#*9\"#*1\"$:9#\":9\""
+ "\"ZE!%*=&&*E+#JE!#ZE\"$*M\"\"ZE!#ZI!&J])#ZU!$ZY\"#:U\"\"ZY!$*Y%&J]-%[%)"
+ "#ZY!$[%%$[)!%[-)$+5\"\"[-!$K5$%;-#%+9!$[5!&;A\"#[A!'+A*'[E!&KE,%KQ#"
+ "$+M!$+M!$;M\"#;I\"%[Y$&;U&%+]!\"K]#%+]!$+]!%;Y\"$+U!&K]##,9!%+]!%L!#"
+ "$<)\"&,)!),1$'\\-,&L!'\"\\1$%L1\"%<5!&L5'$L5\"$,5!%\\1(%\\5#'<E%&LA&&\\E#"
+ "(LM%&\\=(&\\Q\"%\\A,%LI\"%<A!%<A!'<A*$<I!'<=&'LE!%LE&&\\E#%LE\"&,I$%<E!"
+ "%<I!%LA\"&LA&&<E!',I#&\\E''LE!$,=!%\\I##LA#%L=\"%<I!'LE&&,E#%<I!'LA+"
+ "&,=$%<A!(\\E!(LA/'<=*$\\=#%<9!%LM!&\\='%<=!'<5!%\\9#%LE!&\\1#%<5!&,I$"
+ ")<)&%,1!$L1\"%,)!&<-&%,)!&<1*%L)\"'[](%,1!!,!!%+U!'+]!&<)%'\\!#&+Y!"
+ "$+Q!&[U(%+I!$+U!$KY'%+M!)+E*$[I!';I\"'+M!%+1\"&;A'%KA#$[E!&KI'&+A\""
+ "%;1#$[-!$+1\"#[%!#[)!%K%!#[%!%[%)$*Y\"%J],$JY$&JY)%ZI'$:U#$JM!%JQ!"
+ "$*Q\"&:M!$:E$#ZE\"%ZI*#J=!\"Z=!%:E($:-$#Z=!#:1#%:A$$:-!$:)!%*%'#J!!"
+ "$:1!#J!!#YY\"#IY!#YQ%&IQ'$)E$\"9I#$YE&$)E$$YA'#9A!\")9%\"Y9\"\"I1!#Y1#"
+ "#9-!\")-%\"I-!%(I&\"8]!#))#\"Y!&$XY$#(M##)%#\"HU!!XM$\"HE!\"HA\"#(I#\"8A#"
+ "$8!)#X5'\"X1##X5&$8A(\"X1##8E\"\"8E!#XE!\"8M!#(I$#H=&$H]'#H]%#X]#\"8Q!"
+ "#(]#$Y!!\"I%$#9!!#I%%#Y-&#I1%#I5%\"95#\"I9$#99!$)9$#YA\"&IQ(#9I!%)Q("
+ "$9Q$$:%$#I]!#9U!#Y]\"$I]%$:!$$Z1&#Y]\"%Z1*\"Z5!#:1#$J=!$Z=\"#Z5!#Z5!"
+ "!ZI(&*=$!ZQ!%ZA&#JI!$:Q#$ZM%$*]\"#ZU!$:I$$JY!&+%\"\"Z]!\"ZY!#ZU!$Z]%"
+ "%;%'$+-!$[A!$[1!![1!#[E!%+9\"$[1!%[A(&[A!'[I!$[M)'KM,\"[I!%+Q!&+Y!"
+ "\";E\"$KQ#$+Q!&[U(%;U\"#+Y!%+Y!%<!\"(<%%%+M!%,!!&+]!&L-#%;Y\"%<5%&<5!"
+ "',1)(<1%(\\-(%<9!$L)#%,1!!<5&%\\=#%<9!&<9!#,9!#,1!%<E!'\\9#(,A#%<A!"
+ "%,=%&\\A#\"<M\"&<I!$<E!#\\=##LE\"$LI\"%,Q#&\\9(',U(&LI&&LI&&\\E'%<I!$<Q!"
+ "%<9!&LM!%<M!'LI!&<]$&LI&%\\U\"%\\A#%,=%%LM\"%LI!%LM!%<9!%<M!%LE\"'<9!"
+ "%<I!%<A%'<M$(,I-&<5%&\\E\"%<I!#LE#&<1!(<5!(<1!$<E!#,=!$,9!&L9&%<5!"
+ "(<1!%,5$%,1!'<1!%<5!%,1!&,-%%\\)#%\\)#$\\)$%<%\"%<%!&\\)('+Y!)<)%&;Y\""
+ "&;Y'%;M\"&+U!%+U!\"[M%$+Q!#[A!&+M!&KE($[I!%;E\"%;=&$;=\"#[9!%;9#&+A\""
+ "'+-*%+5&#[1!#K5#!+-!$:]#$+)!'ZY\"%Z]\"%+%\"#Z]%#Z]!$Z]%$ZU!$JU!#JI!"
+ "$J9%#JM!$*E\"#ZA\"$*A\"#JA!#*A\"$:9#$J5%#J=!%*1'$*1##J-!#J-!#J%!%Z%#"
+ "!)]!#:)#$)]#$)]#$)U##Z)\"&IY##9A!%)=(#9A!#99!$IA%#Y=&\"I1!#)9#\")5\""
+ "#95!#I!%#I)(!I)#$9%&%9!##8]$\"8M!#(U##XI'$)!(!8M\"#(I!\"8U#\"HE!\"X=("
+ "\"8!!\"H=$#8%%\"X5#$X=+\"8=!#HA\"#XA##(E$\"XI\"\"8Y!$(U%\"8]!!HU!$8Y(%I%'"
+ "\"Y!#!9-\"#Y)#!)!!\"I!\"\"I1!#9-$!YA!#)5##Y=&#YA\"#9A'&)E)$)I#\"YM%#IM\""
+ "#9M!%YU(#YY\"%)E$#J!!$)U#$J)%#YY\"#Z)\"#J-!#:-#$:1##J1(#J9!!:9%$J9!"
+ "%*9*$JE!\"*9\"\"ZI%!:I\"%ZU)%:U#\"ZY!$*Y\"$;!#![-!#[!!$ZU!$;!#$[)!![9!"
+ "&K5(#[-!%[1*$+5\"$[5!%[9%%;E\"&+M!%[9!%KA#&;I&%;I\"%[U%&+M)%+Q%&+])"
+ "!+Q%%;M\"';Y*'KY+%KU#'L!,&+]!&,%!%\\!$$<%!%,1!%<!&%,-!%+Y!'<9%&<9%"
+ "&<1!$<-!'[])$,5!'<1!%L-#%<=!$<9%%<=!%<=!'<9!%<9!%<A!&LI&%\\9#\"<I\""
+ "%<M!'LQ!&,E#%LI\"&\\Y!%LE\"$\\I#(<E%$<E!',U#%<M!%<M!'\\Q+%LE\"%LE\"$<M!"
+ "$<E!&<M!&\\M0%LM\"',Q#%\\Q\"$LM\"&<I!%<Q!&LY&'\\M'#,I!&<U$&\\M\"'<Q$%<I!"
+ "%<I!%LI\"%L=\"%<A!%LE\"$<M!!<M\"'<M%(,A#%L5#&<M!&<A!%<A!%<A!%,-!%L=&"
+ "&<9%$L9\"'<-!&L5&'L)\"$,)!\"L1#&L-\"(,%%'<1!$,1!$,)!$+]!&,%!$;]\"%<%\""
+ "&<-!%<%\"%+]!$;Y\"%;Y\"&[U-#+Q!$[Q%&;M\"%[E$%+U!%[=!\";=\"#[A!$[=!#[E$"
+ "%;9\"%+A!&[9!&[1!#[1!$+1\"$[-$$+-\"$[%%$[!!%*]\"#Z]!#J]$#J]$%ZI*#Z]!"
+ "#*]\"%JE%$[-$&*I+#Z9\"#JI!#ZE!$J=!'ZA#&*E$$JA$&*-+#J1!$:-!#J%!!Z%!"
+ "#J%!$:%$#I]!$9Y$#IU\"\"IU!$YY'%)Q!#YI##YI%$IE%#)5#\"I=!\"I=!%95&\"Y5\""
+ "!YI!\"I1!#I!&#I%%\"9%##(Y#$(]'!(]!\"Y%\"#HI#$(Q'\"Y)\"#(M#\"8I!#XA&#HA("
+ "$(!&#(1&\"X5#\"XA\"#89$#(5$\"89!\"HE!#HI##(I##(U!\"XE\"$8U%!HY!\"Y%\"#I%("
+ "#9!!\"8Y!\"Y1\"\"I1!\"H]$#95$\"I5!\"I=!$IA&$I5&#9A!%)M(&)5,%9U($IU%!YU!"
+ "%YU(#9Y#%9Y!#Y]%#Z!\"$II##*%\"#J)!#*-\"!*1!\"J1!%Z5&\"ZE!$J9!$JQ%$*A&"
+ "#ZA!$*A##J5!#JE!&JM\"%*Q'$JU!#*Y!%:Y$#Z]!#[)!$[%!$;%\"\"K)$$+)\"#[5!"
+ "$+!\"#[1!&+9*'+=&%+5\"%+=!$[=!%[M%\"[A!%;E\"';E\"&[I)$KY#\"[9!$[Q$$+Q!"
+ "$KU#%;U*$[Y$&KY#&+]%%;U\"%+Y!%+]!$<%\"&\\)#&,)!%\\1#%,)!%L%'&,A$&L%'"
+ "(,5)%<5!%L-#%<9!$\\-$#\\1#%\\=#%<=!\"LI#!,A%%LA\"&<E!$,=!&<M!%LI\"$\\E#"
+ "&\\I+#LI#%<I!&<E!(,M,(<=)&\\U\"$LU!%LM\"&\\M\"$\\M''<E)%<E!%<Q!%<U!%<Q!"
+ "%<]!%\\U\"%LY!%<=!%LQ!&\\M#&LQ&%<M!%<Q!$LU!%\\Q\"(<M$$<U!%\\Q\"',Q('L]!"
+ "&,A$&,U#)<U#%\\A#&\\M\"$LI\"%\\I#%LA\"&<E!&,I$%LA\"&\\5#%<A!%LE!&<-&#<5\""
+ "&<)!%<9!%L5\"'L=+$<5!%<5!&<9!'\\1,&,!%%L=+%,)!$,!!$,)!&L!'%,%!%L!#"
+ "!,!!$[I!%;M\"%,-!\"K]#$+U!!;U\"$+U!$;U\"$+M!\"[Q$%+I!%+5!%KE$#;A\"&;I&"
+ "&+5\"$;9&'[1*%+5!#[5!&+-\"%[-!#[-!$+)\"$[)!#;%\"!ZM!\"[)!%K%!&ZY.%*M#"
+ "%JY)#ZQ!\"ZM!#*I\"$ZM%$ZE&#JE!#Z9\"#J-!%:A#%*1'#J5!$J-\"#J-!#*-\"\"J%!"
+ "$:!!$*%'$:-##Z!\"!IY'%Y]+&9M&$YM##9M!&YY!!YM$#)E#\"I9!%)=$#9I!\"Y9\""
+ "\"YA\"\"I-!#I1\"#I-%\"Y)\"$)1$#Y5#\"I!%#HI%\"I!!\"X]\"!XY!#XM#\"8M!!XM!#XA$"
+ "#(1#$81$#HA%#XA!\"8)!\"XM\"#H=##XM'\"8A!\"8Y!\"XQ(#XU#$8U\"\"I!!#8U$!Y!!"
+ "$)1$$))!#8]!\"I9!$YM#!)=!%95##9=$#9E#&9A#%I1$\"YI%'9U'#Y9#$)Y##YM\""
+ "$)U#$)Y##YQ#%YM$$Z!#%:%%$:)!%Z)#$*-#$Z1\"%Z5&$*5\"$J5!$ZI!#J9!#J9!"
+ "!ZE$\"ZI!$*5##ZQ!&*9##J]$#ZU!\"*]\"%JY$&JY!#[!!#[%!%+%\"!;1&#[-!#[%!"
+ "$+5\"\"[1!%[1!%+9!([I$'+=*&+Q!&K=(&[A)%KU#$+M!$+Q!$;A\"\";Y\"#;]\"!+U!"
+ "%;Y\"$L%#%+]!$[I!&,!-%+]!&KI($\\)$&[])&\\!-&,5($<-%%L5&%L1\"$,!!$\\9#"
+ "&,1$\",)!&L9!)\\=\"%<=!'LM*&<9%$<I!#,A!%<A!%<E!%<E!$\\I#'LM+%<I!%LE\""
+ "&<M!&\\I\"$LE'#,I!(LU*%<I!&\\I'%\\I'&LU!(,],#\\U#$<U!)<Q#%,U#%\\Y\"%\\Y#"
+ "%<U!(<U)%LY!!<U\"%]!\"$LU\"%M-!$\\U(&,M$%<Q!&M!!&,M#%<U!#,U!%<Q!%\\Q\""
+ "%<I!&LY!)LQ*\"<M\"'<I$),M'%<U!#\\I#$<I!%LI\"&\\I'$\\E#&L9&%<E!)\\=\"#,5!"
+ "',A#',A$%\\E#$,5!!,5!%<9!%<9!%<-!&,)!(\\5,%,1!',1%'L-&&K]'&L)\"%L!#"
+ "$\\%#%,)!(<5!&,!)&+])%[Q$%+]!%;U\"%KM'%+Q)\"+Q!\"+M!&+I%#;I&%+5\"%;E\""
+ "$[=$\"[9!%;5#&[E!%+)\"$K5$%;5&#[))%K-($;-'$;%#!;)\"#Z]!\":]*#ZU!#ZY!"
+ "%ZU&#ZU!%:M$\"ZY!$*A\"$JM!\":=\"$ZA\"%J9%\":E&#ZA\"#Z9\"#J5!$:1!&Z9($Z5\""
+ "$J-\"#:%#$J!%#J!$#)]##*!##YQ##9Q!$9Y$#9I!#9I!#YI%$IA&#IA\"!)=!\"I%!"
+ "\"I5!\"Y1\"#91$$Y-'!I!&!I!#&X]!$))!!HY!\"8U!#HU%#8U$\"XQ\"\"HI$#XE&#XA$"
+ "\"81#\"81!!HE&\"8=##89$\"X9#\"XM\"#(I#%HE+\"8E!#(U##8Q$!XY$#(]#$I%$$IA#"
+ "#I!#!))!#9!%\"I5$\")=\"#Y=#$9E\"\"9=#$9=\"%9A(%II&#)Q##9Q!%IE#$)M#\"J)$"
+ "%IY&#YI%$J)%#J!!$*5#%:)!%*)$%*-'%Z9\"#Z-)$:5#$JA$%Z=&$:='$:E#\"ZI!"
+ "$ZI&#ZE\"$:U$#JM!#ZQ!\"JQ*&:Y$#[5!#[%!%;!+\"[!$#ZY!#;)\"\"+-%%K-$\"[1!"
+ "%[5)%+1\"%[9)'+A&$[A!$;A\"%;=&%KE#%;E\"&;M'$+M!$,!!$;Q&&KQ'%;I\"%[I!"
+ "&+Q!%+]!$KY#'<-!#<!\"(L%0(<)*%,%!';Q'&<-!#;Y\"%\\5##\\5#%<5!%<9!&,9$"
+ "&<9%%<=!%,1!&<=&&\\A'%LA\"%LI!\",E!%<=!$\\E#$<I!#,I%$<E!&<M!%\\Q\"*<M)"
+ "%<Q!%LM!&<I%%\\=#&\\Q&&,U)%<]!%<I!%\\U\"',Q#%<I!%\\Y\"$<Y!$LQ\"%<]!#,Y)"
+ "(,],&]!!%<Y!%LM\")LY2%M%!&-!$%<]!&,Y#&<Q$%<U!'LQ!%\\Y#&\\U\"%<I!'L]!"
+ "&<U%%LU!$<Q!&\\Q&'\\Q\"'<Q)%\\]\"!,M!',E('LI*%<U!%<I%%LI\"%<Q!&LM&&<A%"
+ "%<A!'<A!%,-!$,=!%<U!$<E&%\\)##,9!',5(%<5!$\\5((,9(%<=!%L)\"&L-'$\\),"
+ "%<5!&<%&%\\!$%,!!&+Y!&[](*<-%$;Y\"%,!!&+U!$,!!&;U\"$+M!$[I!%;I\"%[5!"
+ "%K9$%+A!$[9!(+E.$[=$%[1!$;1\"#;5\"%+)&$[-$\"[-!#[1!%ZU\"\"[!!#Z]!#Z]!"
+ "$JM%%:M$&*E+#ZY!!ZU!#ZQ!$JE%$:E$\"*A!(J=#%:M$$:M$$J5!#JA!#J1$%:1!"
+ "$:-##J-!$Z)#$)Y##Z!\"#9A!#Z%&%IY*'YU&%YI!#9M!#9E!#IU!$I5&#99!$9=!"
+ "$9-%#95'!91%\"I9!#)-#\"I)!%9%&$)!!$(]*!(]#$HM'#XI#!(Q!#(E$$(M'\"HE!"
+ "$89)\"(5##(5$\"85!$8A&#8A$\"XE+!(M!\"HI!#HM##XU&!8Y%#(Y##XY/#(]!#9)!"
+ "\"8]!#I)\"\"Y5\"!)1!#95$#)M#\"I5!\"I=!\"IA!\"II!%9I\"%YI!#)E##J!!$)Y##IQ\""
+ "#J!!#J-!\"Z!%#J%!$9Y$%9]$#:1#$J1\"#J1!$J5!&:=!\":A#%:=($*A\"!JI#$ZA&"
+ "#*I\"%*U'#ZQ!$*M\"#[%!#ZY!$*Y\"$JU$%K!($[%!![%!%+%\"![-!$+)\"$+-\"&;1+"
+ "\"+1!%;=\"!+=!$[9!'KA$#[A!%;E\"$[I$$;I\"$+U!$[M$\"[A!%+U!$+U!$+Y!&KE("
+ "'L!\"%,!!%\\-#%\\-(&,%!'L-&%<5!%L9\"'L5!'\\-#$\\5#%L5#&,5$(\\5(&+]%%L=\""
+ "%L-#%<=!$<A!$\\I#'LE&(,I,&<A!'\\E#&<E!'LI!%\\5(%\\A#$,9!#,Q$&,Q#&LU!"
+ "$<Y!'<I$&LU&$L]\"%<]!%<]!$\\]#$LY\"&]!\"',]#%\\]\"&M!!\"<Y\"'<])$L]!&\\Q\""
+ "&<M!\",U!'L]!&,Q#(])!&M!!%<]!%\\Y\"']!&%<]!$=)!%<Y!%<U!(<U-$<Y!&,Y#"
+ "%M!!%\\M'%<U!%LM\"&,Y#&<U$%LY!%<M!),M-%,U$'\\]!'\\='%]!\"'\\A''LE+'<A%"
+ "),I,(\\I!$\\A##\\9#'<=)$,1!$L9&&<1%%<A!'LE!$\\5#%L5#&L-\"&<-%$,)!%L-\""
+ "%<)!&<1!%<%!%L)\"$[I!%,!!$K]#'KU0$K]+)KU-&;U\"#[I!%KQ'$+M!&;I\"%[E!"
+ "%+M!'+=!%[A!$[=!&+=\"$[9!$[=!&[5!%;9&#;=\"$;-\"%+)\"$[-!%;!$#[%!$J]!"
+ "\"ZY!$JY!$ZM\"#JI!$:Y'$ZM%\"ZE!\"ZE!#ZQ!$:=#$:=#%:=(#Z=!#J9!%J5!!*1!"
+ "#J1(\":-##J)!#:1#%:-%\"Z)\"$9Y$#I=!$9U!$YM'$IE&$9I$#9A!#9Q!\"IE!\"YA%"
+ "%9A(\"Y9\"\"Y5\"$Y1'\")%\"#9)$$X]'#Y-##9!\"$(Y(\"X]\"$9!%\"(U\"\"8U!\"8M!\"XE#"
+ "!(5$\"XI%%(=##H=&\"XE#\"XI\"!XI$!8U\"!(]!$XU%\"8]!#(Y&\"X]\"&)!$\"8U!#9)!"
+ "\"91#!I%##I1\"$)1$%)5%#)9##9='$)A#!YI!#9I!#YI\"$9M$$YQ#&)Q%#YQ#%)Y'"
+ "%IM#\"J%!%J-)\"J)!$J%\"#J1!\")U\"#J5$%J5\"#Z9\"#J5!#JI!\"JE'#ZI\"&*Q'&*E$"
+ "#ZI%#ZY!#ZQ!$+)!#ZY!$+)\"$*]\"$*]\"#[!!#Z]!#[)!#[-!$[-!$;1#&+5&&K)("
+ "&K5$$[9!&+=&&;A'&+E&(;A\"#[A!\"[E!$+M!$+M!$+Q!%+U!&+Y%';Q')<!*'L!\""
+ "%L)#'<-!#L%#%L-\"&,1$&<-!$<)\"%\\A'%<9!&L5\"&\\5('<9!$L-#&\\A($,=!%LA\""
+ "(\\A0$<A!!,E!#LQ'%\\M#%\\A#%<I!',E(%<M!&\\Q'%<I!&LM&(,Y,&,]#$<U!'<Q)"
+ "%\\U\"#,Y!%<]!%\\Y#%<Y%&\\]&#LU\"%M!!%\\U#%]!\"$]%\"&]5!%<Y%%,Y$']%+',]'"
+ "%])\"&\\]!']!'%M!!#,U!%M!!&<Q%&])'$M%&&M!!'=-(%<]!',]''LY!&]-'$<])"
+ "&=)$&L]&%<Y!%LY!&,Y#&,U(&<U%%<I!%LU&&\\Y'%LE\"$]-\"%LQ!)LM*$LM\"$<M!"
+ "%LI\"$<E!&\\I#%<A!&,M$%<A%%<A!%\\=#%<5!%<=!'L9+%\\9#%\\9#&\\-(',9)%,)!"
+ "&L-#%,-!%,!!'L%+&L%\"%,!!$+U!&<-*%K]#';]*(+])%+Q!';Q+%KY#$+M!#+Y!"
+ "%;I\"%;I\"%+M!$KA$$[A!#;=\"$;A\"%+-&![5!$+9!\"[-!\"K-#'K!1#ZY!$K!$#;!#"
+ "#[%!%ZQ*%JY!#ZU!#ZQ!#JI!#ZQ!%:U'$Z9\"$JE%#JA!$ZA%#Z=!$*5#(J-,\"J1!"
+ "%:1!#*5\"#Z)\"$:%$$*)#&*)%#Y]\"#9M!$*%#$)Y#&YQ\"$IE\"%)I($)A#&Y1)#9A!"
+ "\"95#!99\"$)5$!)1*#)1#!Y%$\"I%!#Y%#$I!'#9%%!HY!%)%+#XU&\"8Q!#HQ&\"(E("
+ "$85)!(5!$HA$$X5+$8E#$HI!\"8E!#HM&!XU'#(Y!\"HE$$X]$#Y!'#8Y!%9%&$9%#"
+ "#))#\"9-#\"I=!\"I5!#95$#I9%$)5$#IA\"$IA%$YA'&)Y$\"YU!$9M$\"Z!\"#IY!!Y]!"
+ "#J%!$*!#$9]$%:%%#J%!#J5!#J1!\":5\"!*1!%*1##ZA\"$JE$#JA!#*E\"#ZU!$:M$"
+ "$:]#$ZY\"&*I$#ZQ!\"*Y!$Z]%$J]$$;)\"#+)!$;-\"#Z]!$+-!\";1\"$K5$%+%\"$[1!"
+ "$[E!%;=\"'K=($[=!%+Q!%[I(&;I\"$+M!#+Q!$;U\"&[U$%[U%#,!!%K]#%,%!%,)!"
+ "),-$%,!!',9)$,!!&\\-(%,-)%,-!$,5!)L5!#,1!%<A!%<9!$<A!&<=&+,9(%LE\""
+ "&<I%%LE\"&<U%&<9!%<I!&,Q#%LI\"',5('\\Q'&,U#$LQ\"&,U#(\\U!%<Q!),Y0$<Q!"
+ "&,]##\\]#%<]!$<U!&LU!&M)!%\\Y#%M!!%<]!%\\]\"&M!!$=!%%M)!(M-$%M%!%]!\""
+ "%M%!(=%(%M%!&=%$(M-)(,U'%=%$%M-!&M!&&M%!%M!!%LU!'=!$%<U!(=!#$M!\""
+ "(-!'%<]!'=-(']%+$<]!&L]&%]!\"$LY!#=%!&<M%%\\U'%<U!%<U!'\\A#&,M$%<E!"
+ "%LM\"%LE\"#\\I#$,9!(LE+&\\A'%\\U\"$\\A#&<9%$,=!$,9!&\\A'&L9\"'L5\"%<5!$<-\""
+ "%L1#%\\)#%,)!'<)%$K]#$,!!%L-'#,!!%;I\"%+]!&+Y%'+Y%$[Q%$KQ#$;M\"%;M&"
+ "#+Y!$[I!$;I\"%[A!&+1\"%K5$&+9&'+5+%;5\"$[9!#[1!'+-\"#+-!%+-\"#[-!%;!$"
+ "'*]'%JY!!:Y&$;5\"#ZU!$JY!#ZQ!#J9!&:I($*9\"#*A\"&:9%#J5!'JE\"$J9%\":5\""
+ "#Z5%#Z)\"&*)!%:%!%:)(%*!(#Z!\"$)]#$*!##YU%!IU#$YE##YM#$)I!#9E!#I1\""
+ "#9=!#)=#$I5)\"91##IA!%I-(#))#!)!!%9-##I!#\"I)!\"I!!!(U'!(U!#(M#!HI+"
+ "\"X9\"%(=##H=&\"X=\"#XE##(M#$(M%\"HQ!$(M'!(A##(U!#HQ%\"Y)\"#Y%$$95\"#H]%"
+ "#)-#$)!('9M.!)E!$)9*\"I=!$)A#$)5!$)M#$9I%#YU\"#YQ##9Q!$9U!#YY\"$*!#"
+ "#J!!#*%#\"I]!\"J)!#J-!#:)#\"*1\"#Z5!%Z9*%JU!$:A#\"ZA!$*E\"#ZA%#J=!#JM!"
+ "%*U&\"*M\"$*]\"$*Y\"#K)#$;!\"&+1*%Z]!#+1\"#+=!![-!$+1\"$[5%#K9$%[9!%[=$"
+ "&K9,)[A!&[E%%[E!#+U!'[Q$%KM,#+M!#;M\"&,%!%+]!&K]'%K]#%,%!&,%!),1("
+ "%+Y!%+U!$<!!%<)!%<1&%,-!%<E!%<5!%,!!'<9!(L=!&<=!$L5\"&\\I\"#,9!$LE\""
+ "'<9%%<M!%L9\"),M#%LM!%,U$&LY!&<M%%\\U\"%LU!&<U$%<Y!&<Y$(M!%&,]#&-!#"
+ "*M!$%\\U\"%M%!%M%!&<M!$M!\"(=!-%M%!'-1\"--!*%<Y!%]%\"&M)%),]&']%!%M1!"
+ "&=-$(M9$&=)$%M1!%<Y!)]5$&]!'\"=5!&]5!%M%!(=-#%])\"'M)%$]1\"$LU\"'=%)"
+ "%--$&\\Y&%M!!&M!%'-!,&LY!%M!!&,]#$LY\"%M-!%\\Y\"%,]$$LU\"&<I!(,Q('\\Q!"
+ "\"\\E$%,Q#%LM\"#<M&%\\U\"'<5*&,E#)\\M!$<M!$\\A(&,9$#,5!%L=\"'L=&%LA\"%<5!"
+ "'<1*&\\=(&\\=(%+]!#,)!%+]!%L-\"',5)%,!!(\\-($+Y!&+Y%&+Y!%+]!$+U!',!."
+ "$+M!'+M*%KE#$;E\"%;A\"'[I$#K1#$[E!![I!$K1$%[5!$;1\"'+-\"\"[)!!K)#$[%!"
+ "%*]\"$+%\"\"ZA!#*Y\"#ZU!%:U'\"JQ##ZU!$JE!$JI$#JE!#JA!\"Z=!&:=%#J-!$:9$"
+ "#*1\"$:%!!:5\"$:%!#J%!(J-)&9Q#\"9]#%9Y($YE-!YU!#9Q$\"YQ\"$YI##YA##IE\""
+ "%YE'#)=##)9##)-#%95#\"Y-\"!Y-!\"Y%##9%$#9-!#)%$\"8]!\"8A!#(U#!XM!\"8U!"
+ "\"89$\"81$\"X9\"#XM&$8I&\"8I!\"8M!#(Q#\"HY!#I%\"!HQ&\"Y)\"#XU##I)\"#I)%!)9$"
+ "#I1%#91$\"I9!\"IA$\"Y1\"&YQ$#)9##YA#$YM&%)Q!$YQ'$)Y#$YU&$)Y#$9]'!)]!"
+ "'YU-#J%!$:)!$Z1&$:%$\"Z1!%:9(#Z9\"\"ZE!#:='\":E#$J9%#JM!$ZY%$JM(#ZQ!"
+ "$:U'&ZU.&*Y'#ZY!\"J]##+!\"#[%!&ZY\"#K)#'JU%&K1,%[1)&[5)'+5+%[=$#[-!"
+ "%KA$'[E!%+5\"%;]\"!+M%$+M%#+Q!%;U\"%+Q!%;Y.%,%!&;U+\",-!%,%!%,-!&L%\""
+ "&<-!%<-!%L1#%<9!#,)%(<A*&<1!',)%%<E!%\\=#(,=-$LA\"'LE!%<I!#,E!&\\Q\""
+ "&LI&&,M$%LM\"%\\Q\"*<5/'\\U,$\\Q#$<U%'\\Y+%<Y!%<Y!%<Y!&,]#%\\]&&\\Y\"%M!!"
+ "'<Y$&\\U\"&=%$$=%!%M%!%M%!$]%\"#M)\"'])!&M)!%M-!(])%*=!\"&]-'&]5&&]!'"
+ "%M-!'--\"#M)\"$M)&#==!#=%!&]9!%M!!!-%!%M!!%M1!&=)$(]!!$]%#'M1*%])\""
+ "%]%\"#-%$&-%$%M5!$=)!'=%(&,U)\"=!\"#=%!%M!!%<]!%<]!%\\Y\"%\\Y#%\\Y\"#<M!"
+ "%<Y!$<E!'<E*#,I!&\\A#%\\Y#&\\E\"%\\I#&,E##\\I(%,5)%LA\"%<9!&<A!#,9!%\\=#"
+ "%<%%&<5!%,1!',A(%,)!%<=!#<9&%L)\"%,%!%L%'$,!!';]\"+\\!(%L)\"!+U!$KU#"
+ "#+Q!$;E\"$+M!%;I\"&+E%);U\"&;A&&+5\"%[5$\"K9#&[!)&[A%%+-&$+-\"![9!(K)&"
+ "#[)!$ZU%#Z]!&Z]\"$*Y\"#ZU!$:U$$*U\"$:M##JI!%ZI\"#ZE\"#:A#$J=%%:9!\"Z5%"
+ "%Z5\"!Z-!$J-)$Z%\"\"Z)\"#Z%\"#J)!%)]'$*!##J%!\"J%+#J%!#YQ#$Y9!#II\"&)M%"
+ "#9A!#I5\"#I5%!)5!\"Y1\"\"YM!\"Y%%\")%\"$9)($Y!\"#9!!#9!!$9!\"\"HU!\"HU!#(Q!"
+ "\"89!$(=(#8A'\"HQ!\"XI\"\"8M#\"8M!#XQ##XQ&$8I(#(Y#!X]!!Y)!$)%$#))##I%\""
+ "%95,\"IA!#Y9#\"I9!#)=#$)A#$9E!#9I!#99!$IM%#9Q!%YU.')Y)#9U!$Z%##IY!"
+ "&*%$$J)\"#J)!#J-!&:5,%JI!%:E!%:9(#J=!$*Q%#ZU!\"*A\"#ZI!%ZM*%*Y&$J]$"
+ "#ZY!%+%&%:]##Z]!$[%!%K%$#[-!$K1$$;)#%;-#$;-\"$[9!%+A!&K9(%+1\"%;A\""
+ "&[9!%+=!$[M(([M%%+M!$+Q!(;I\"%[U$$+Y!#,!!%KY##,!%%+]!&\\%(&L%'%,-!"
+ "%,-!#<5\"%<9!#L5#(,9#&L1\"%L9\"&<E!$\\=#%\\=(%L=/%LI!&L=\"%<I!(LM*),M#"
+ "&\\I'&LQ!'LI!(\\Q0\"<M!%<U!#,Y!%LY!%<Y!(]!!&\\]&&M!!&\\]!(]!&%=%$&-)#"
+ "%M%!!-)!%<]!%M)!%M%!(-)'$=)%*=-''=9#&]1!#=-!*=-1%]-!'-1\"(-)\"\"]-$"
+ "%M5&']1*&=E$&=1$%=5$%]-!'-1'(=!$%M)!+-5%$=!!)--!'])!$=%!&M-!%]-\""
+ "&--(%M1!$])\"%M-&%M%&&-1#&-%#'])!%M!!&<]$(<]($M!\"$=%!%,U#%\\M#%<M!"
+ "%\\]\"',U(%<M!(LQ!%<]!(,Q,%<M!%<Y!%<A!%<A!',Q#%\\9#'<A!'\\A,%L1\"%<9!"
+ "'L=!$,A!%<5!%L-#&<%%(\\)#&<-&%\\)$&L)'&L%'%+Y!',!!%KU#$+Q!%;U\"#<!\""
+ "#[U(';Q\"$+M!$;Q\"%;I\"&;=#%;E\"%+A%#[=!%[A!![I!%[5!';5'$+1\"#[-!$K)("
+ "%+)&%;%##Z]!!;!\"#Z]!$JY$%:U#%:M(%:Y$$ZQ%$:M##J=!#ZE\"!ZA!%*=#%*9'"
+ "#*=\"\"J1!!:5\"$Z=\"#J)!$:-#!Z%!#IQ\"#I]$'9Y#!)M$$IY%#IY!#9U!$Y='%)Q$"
+ "$)U#$IA%\"I=!#)1#\"I9!\"Y9\"\"I%!!Y-!\"Y)\"$I)#$Y-!$Y!(#XU'$8Y%#8U$#8Q$"
+ "\"X5#\"HA\"\"(E(#XI$$HI*!XI$%(]\"$XY!#XY&\"XQ\"\"X]\"#H]\"#9%!#9)!\"Y9\"$9)%"
+ "#Y-##)5#\"Y9\"\"9A##)A##Y1#\"YE\"#YI##99!&9Q&#9U!%)U!\"J)#%Y]+$J!%#:-*"
+ "#YY\"#Z)\"\"Z5!%:1($:5#&*5($Z9\"#Z9!#*I\"$Z=%#JI!$JE$#*U\"$:I#$*Q\"#*U\""
+ "$*Y\"$*Y\"$[)%$;!#$J]!#[%!#[)!&+1\"$K9#%K=(%[5!%+9\"!;5\"%K=#$[A!#[A!"
+ "&[I!)+Q!'[E2#[=!%;]\"%+]!%L!#%;Y\"$+]!$L!#$,!!$,-!$<%\")L)+%<5!%L5\""
+ "%,-!#L-#&,5)$,A%%,-!%L-\"%<=!%<9%%\\A#%<E!&L]!%\\A#(LY)%LU&%<U!$<Q!"
+ "%LY!%,Q$&LU!%<E!&<Y%$<U!&L]%\"<Y!'-!'%,Y-']%0&]!\"']-!&=%$$])#'-)'"
+ "%]-\"'-%#&-)#(--+%M-!*]=$'=-)%M1!'-1'%M=!'-%\"&]1!$=5!$=-!*M1'%M)!"
+ "%]1\"'-9\"&]5+'=9('-5\"#M5!%]1\"&-!#'==(&M5%%]-\"&=%$%M-!%]1\"'-9\"&==$"
+ "%M-!%M9!%]-\"%]-\"&-)((\\Y/%M)!%=)$&M!!(=%(%]%\"&-!$&M!!%\\]\"',]'%]5\""
+ "%M%!&LU!']%!$<Q!%<Y!'LI+%<U!),M'%LI!&LM&#,Q%%<5!',9$%,1%$\\I'&\\='"
+ "%<=!&<A&&LI&#,1!'<5!#,1!%+]!#,-!%,%!'<-!',%*'+Y!%K]#%,%!%,!!'K]'"
+ "$+Y!%;Q*$[Q$%;Q&$[M$$[E!\"+M!%+5\"&+9*%;E\"%K=($[A!#[5!\";1\"$+)!&[1%"
+ "#[-!$K-$$;%\"#[)!![!!#Z]!'+!.%JU!#*Q\"#ZI\"#JM!$ZI\"$JE!\"ZA!$ZE\"%*5'"
+ "%J9%$:1!#J1!\"*1\"\"J-!\"J%!#J!!#Z%&$*%##IU\"#9A!#9U!!YU!#IU\"#YQ#%)E%"
+ "#IE!#9I!$)9$#I=\"#)9#!Y5!#91$#)-#\")1\"#Y)&#Y!#%)%)!HY#\"8M!!H]#\"HQ$"
+ "#X='\"8=!\"8E##8I(\"X]\"\"9%#\"XQ%#(Y#\"HY$!HU&#)!#$Y%!!)!!\"XY\"#9-!$)=!"
+ "%I5.#)=##9)!#Y1##9M!#YE#$YI$()I+\")M\"%9M\"$IQ&!YY!!Z!!$IY&#J%!$Z%&"
+ "#J)!%:%!#J-!#J=!%Z5##J9!#J=!#*=\"#ZA\"#*A\"%JI!$*I\"$JQ%$[1,\"ZU!#ZU!"
+ "$*Y\"$J]$$[!!#Z]!#[!!![)!#[1!\"[%!$K1$$K5+%;9\"$[5!%;A\"&;=&%+E&$[E!"
+ "%+Y!$[E!%;E\"%K]'&<-!%+Q!%,!!'KY+&KU#'<)%'+]!%+Y!$\\)$%,)!&KQ(%L1'"
+ "(<1.',5('L1\"&L9'&<=*(L=!%,9%%<E!!\\E$#,E%&LI&%<I!&<E%'LQ&#,Q!&<U$"
+ "%<U!&L]!*LY)%M!!%<Y!&M!&']!!*-)&'M%*&-%$)<]#&-!$(-),&])&#=%&&-%#"
+ "%M-!&-1#%]=!$=1!'=1$&MA$&=5$'-5'&=%-$-5$)-5!(]5%'-A\"']5!$M=!%M5!"
+ "&]5!&]1&&]9&%M-!&-1#'-!#&]5!$=5!%M9!\"-5!)=5'&=5$%M5&&M5%&=1$%M1!"
+ "%]1\"'-9'(]5.%]5!$=1!%=%$(-)\"#]%,'--#&])&)M-)'-!(%]!\"$=-!%M)!%]-\""
+ "\"<Q!#\\](%<]!&M!!',Q('<U$%<M!'\\I+%<Q!$\\Q#(\\U!%<M!$,A!#,Q$(L=!%<=!"
+ "&LE!&<=!%<=!%L=\"(L5/$\\A#&L%'&<1!&,-$%,)!$<!\"&,%%(,!!%,%!&+Q)#;Y\""
+ "'+Y%%KU#)+]*$KA$%+M!![I!%+M!%[A!$;A\"%;A\"%;I\"#[1!$[A!$+5\"$+1\"%;5\""
+ "%K-(#[-!\"[!!%[%!#JY$\"Z]!\"ZU!\"ZU$$ZE\"#ZQ!%:]'#ZE\"#ZA!#ZA!%*A&#Z=\""
+ "#ZE%$*-##Z5\"$:9$&*E(#Z-\"$J)\"$)]#%:!%#J%!%IY*$9]!%)U!#9]'#9Q!#YA#"
+ "$)I!$IE#$)Q$#9=!#)9##)=##)5#$9)(\"Y!\"\"9%##9!%$)1$$HY#\"I)!\"8Y##HY%"
+ "#XI!\"X-#$(Q(\"8I##(E##XQ&#HY%#HY%#9!!!Y%!#H]\"!I%#!)-!%9)'#)9#!Y5!"
+ "$)5$$)1$#)=#$)=$#Y-##9E!#YQ#%)Q!#9M!$YY'%)U!#YM#$I]%$*%##J!!!YU!"
+ "\"Z)\"&*-$#Z%\"#J5!$J5!$*1-$J-!#JE!#JE!#JE!$ZA\"%JQ!%ZQ\"$*Q\"\":U\"%*]&"
+ "$K!$$;!\"#+!\"#+!\"&+)+#;%#%[-)$[1%$+5!%+=\"%;-\"$[=!$[A!$[E!%+A%#KE#"
+ "%+I!'KM(![I!$+Q!';Y\"%;Y\"%,%!&<!\"(<1%&<)%&<%%$,-!%L-\"$,-!&<-!&,)%"
+ "%<9!$,)!'L9\"%L-\"$\\E#\"<M&%<A!%\\E#$LI&%<U!(,I,\"M-\"),U,$<Q!%<U!%<Q!"
+ "&-)#'<]#(LY%%<Q!%<Q!$<U!%\\Q#%<]!$=!!$=%!(M%)%M%!'M)%(M-.&--#&=1)"
+ "%M-!&M1%&M5%%M-!&-9\"%MA!$=5!%M5!&==$&]A!&M=$%M9!*]=$&]-&\"M=\"&M9$"
+ "%M9!!-1!(MA(%M5!%]9'(-9'%=A$'-='%-9$(==\"&M9$&]E%&]9!&M-!%M-!&L]!"
+ "%M5!&-5#&-9\"']1!%M1!'-1\"&M1%%<]!']-!%]-\"$=1!'<U)&])&&=%-%]%\"%M9!"
+ "(]!!&LU!&-%(!]!$(]!+%<Y!'<U)',U#%\\U#%<U!%<E!%\\U\"%<Y!#LA\"%<E!%<A!"
+ "%<=!'\\=('<=)%<A!$\\-#&<1!%\\A#&<-&%<A!%<)!%,-%%,)!&<)%&+Y!%+]!%<%\""
+ "%+U!%+Y!#[E!$KU#$+Q!%[U(%;9\"&;A\"%+=!\"[=!'K5$$+=!$[9$%;9\"%+5&#[=!"
+ "$[-$#[-!#K9#'*Y'$[)!#ZQ!#Z]!#Z]!#ZU!%ZE\"#ZU!$JU$$:Q$%JM!#ZA\"$JA!"
+ "#ZQ!#Z9\"#Z1\"#:5#%:9!\"J%!$:%$#I]!#J-!#J!!#:)#!YY!&9U##YY\"\"IU!#9E$"
+ "$)U##YE#%9=*#YA\"#I=\"#Y9&!Y9*\"I5!$YA#\"Y-\"\"I-!\"I%%&9!.$(]'#X]!\"8Q!"
+ "!X9!#(I!$XA+#8=$#8M%\"XQ\"$XA\"#8]$$HU)\"I!!$)1$\"Y-\"\"I1$$)1$!Y9!\"Y5\""
+ "!9E\"!YE!$IE\"%IA##YE##IA\"$)=$!YM!%)U(\"IU!$9U!%*)#%Y]#%:-!$*%##:)#"
+ "#J1!#*5\"#*1\"$:-$$*!#%:E!$ZA%$ZA\"%:E!#JM(&*A'%*I'$:=$$*Q\"$*U\"#ZU!"
+ "%Z]\"&+%\"$*Y\"#[1!#;1\"%+-\"%;='$K-($+5\"#[9$$+=%%+5\"\"[A!&[9!&+Q!%KE$"
+ "$;=\"$KI##KQ#%[U$%+]!#+]!'L%\"%+U!%\\)#$<)\"%,!!(\\)1'\\-,&<9%'LA&&<1%"
+ "&L9&&,1%&,9$'LE!),E#%<A!$LM\"%<I!%\\M#&,M##<I!%<Q!%<I!%\\Q\"%<Q!%\\]'"
+ "',Q($<U!\"-)!'-)\"\"=!&&-)#&-1'$=)!&]-!&M-%&]-&%])\"&M=$%M1!&=1$(MQ\""
+ "!-5!%]-!'-1'']9!$]=\"%]A!%M5!%-9#%M1!&=5$)M=-&=A$#M1\"(M=-&-=\"%MA!"
+ "%M5%(M=#&M=$%M5!&-=\"(=5''==#&-U\"'-=\"&M=%#M=\"'-A\"&M9$&M=%$M=!%]I!"
+ "$=5!)-9+%M=!(=1-&M1%&-5#%M1!%M5!%M1!'--\"&--#']%+%M%!$M)!%M)!$<U!"
+ "&]5!#,]$&M!!)<]-%<]!%M-%%<Y!%,U#&\\M'#L]\"(,M#'\\5#&LM&&<Q$'LE&%<I!"
+ "%<I%(LE+%<9!(\\A\"%\\I#&L9\"&<5!%\\1#&,-%%,1!$,=!%\\)$&<%!&;M\"'L%,&[Q)"
+ "$K]#%K]#%<%\"(K]'#;]\"\"KI#!+A!#[E!([5*$[E!$[A!#[=!%[9!'+9\"%[9$#+5\""
+ "$;-\"$+5\"$K)+#K)##[)!$[!!$*Y\"#Z]!$+%\"$*U\"$JM$#JM!#ZA\"#JI!'JM%%:5$"
+ "#ZQ!%*='#J=!$J=!$J1\"#J%!\"Z=!&*)%&*)!#9U#$*%#%IY\"%IY#$YU&&)Q%#YE#"
+ "!9Q\"%IQ#%YE!\"YI!#Y=##Y=##99$!YE!!Y!!%9-##)%&$Y)$$99%#I%\"\"XI\"#8Y!"
+ "%8Q$$HE*#8I$\"8Q!#HQ%!Y!)$(U$!H]!#HM&%I%!#9%!\"I)!$Y-*#95!$))!!Y5!"
+ "!Y9!#IQ$#Y=#%9U(\"IE!#YI\"%YQ!$IU%#Y]\"$)Y#&)U%!Y]($Z!'\"I]!#J)!#J%!"
+ "$Z-\"\"J1!#J-!$J9!%:9+%*1#$*Q\"$JE$$JE!#ZI\"$JM%\"ZM$\"+!\"$;!#\"*Y\"\"J]#"
+ "$*]\"$+9!\"[%!!+)!%[-&$K5#$[1!&*]\"$[1!&KA(%[A$'+=*%;M\"$[I$#+M!#+M!"
+ "%,%!%[M$%+]!%+Y!&+Y!);U\"#,!!&L%\"%+Q!'K]'%,1!&<1!(<5!%<5%%<1!&<-%"
+ "(LE!&<5!$,9!%L9\"&\\A'#LA#%<E!$\\A#&<I!'LQ!#LQ#%\\U\"'<Q$)M!.%<M!$\\]#"
+ "&<A!%M!!(=!-&]%'%M!!']5!&--#&M%!&=-$(-='%M-!#M-\"%M)!'-5\"$=1!%MA!"
+ "%]I!$M9!(=5'$=9!$M9!'-=\"%M=!&]5!'-9\"&-=#)MA-']=%'=E,%]A!&]Q!\"-5!"
+ "&]A%%MA!&]9&%MA!%MA!$MQ!'-A\"&-A##=Q!'MA$%MA!)]A3'-9\")-A/']5&%]E!"
+ "&-1#&]E!%M=!%M9!%M5!%]Q!%ME!\"MA\"&]5!%M9!'-1\"'M1*'LY*&--#(=-'&=)$"
+ "$]-\"$\\]#'--\"&,Y#']!!'<]$&-!$\"<Q+%M%!%\\Y##,Q!&,U,$,=!&LQ!&\\A'%,U#"
+ "&\\Y\"%LA\"&<A&%<E!%<A!%<=&(,9#&<9!%,=$%<1!'L5*%L-\"&L%\"'<)%(<%&%;]\""
+ "(+]%%,!!%KY#'KU#&+U%%+M!%+Q!%;M#(+M!&+I)$[I!&+A\"%K=#%+=!$[-!$+9*"
+ "$;1#%+1&#[-!$;)\"$[!!#[%!$K!$%*]\"(*U,$ZY%$JY$$ZU!$*M\"(*E)$*I\"#ZI\""
+ "#ZA%%:5!#Z9\"\"Z=$#J-!$J1(#Z-\"&Z9##Z)%$*1#\":%#$*%#$:-$$)Y#$*)#%YI!"
+ "$)A!\"Y9\"#9E!#IA%#YA#%)9+\"I-!\"I5!&Y1)%9)##)9#\"99#%9%$!Y!\"$HY'\"8]!"
+ "$8Q##XI'#8M$%HQ+#XQ&#8U!#8]$\"H]$#Y%##9%!\"Y%\"#))#$9-\"$I1&#)1#\"Y9%"
+ "$)=$%I5!\"IE!#IE\"$)]#(9M(#YI\"$IQ\"')Q'#9U!#I]!\"Z%%!*!!#J%!$:%!%*1'"
+ "$Z-&#J9!#J5%#Z5\"$JE%'*A(\"ZA!%ZM*$*I\"%ZU\"%JQ!#ZI\"#:U\"$:Y#'J]*#[%!"
+ "$JQ$%;1\"%ZU\"$+)\"#+)\"%K1$&K9$%[9!$[9!$[9!%K=#&+E%%[E$%+I%$+M!%+]%"
+ "%K]#%+U!&<!&(KQ0%;]\"%L!'',!)'+Y!',9$%L)\"&<-!&<5!&<-&%<9!%L5\"&\\5#"
+ "%L=\"%<I!'LE!&<E%%LE\"',M(&<M!',E('LQ&'\\Q\"'-!'%\\Y\"%<M!*-!''LU*&-%#"
+ "#,]!']!!%<]!'M1$%])\")-%!(-1,%M)!$=1!&M%%%M)!$MM!&==$%==$'=9#%M1!"
+ "$]9\"#=9!&M=$&]%'&ME$(-A!*-I*#=A!$MA!$M9!&=M$%]I!&=E$%]9!%MA!(-I!"
+ "$ME!&MI$%ME!%ME!'-I'&-],'-=\"$ME!$=9$%]I!%ME!&-A#*MI'$MI!#==!%M9!"
+ "'-I&\"]A##M9\"&M1*%MA!&-=#)=1\"&==$$M5&%]-\"']5&&--#(M1.&-9\")=11'M1)"
+ "(-1!&-)#(=%#%])\"&-!#'=!$&M!!%<]!(LU)%M)!%M!!%])\"(]%%'<Q)%<M!%L=\""
+ "',]'$\\M#%<M!%,1!%LA\"$,A!%<=!'L9\"%<5!%,)!#<-\"%<=!#<-!&\\%#%,-!#,%!"
+ "%<5!$,-!',!!$+Y!&<%%%+U!'+]%$+M!#[I!%+=\"&;A\"%+M!$[A!&K1$$[9!'+=\""
+ "$+1\"#[)!#[-!$;-#$+-!#+)\"#JM!#[-!#ZY!#JI!$*M\"$*Y\"%JA%%:M'#ZI\"$*E\""
+ "#ZE!#ZA!$JE%$:9$#Z5\"#*9\"$:)$$*5&#J!!#J%!#I]!$Z)&$*%#\"IU!$9U!$IU\""
+ "#9Q!#9M!$YQ#\"YA\"'9A'$Y='#9=!\"I5!\")9\"\"I!!%)1%\"Y5\"$)%$#Y%$$)1$#8Y$"
+ "#(E!#(I!!HI!#HQ)!Y!\"#HY%\"XY%#X]!\"8Y!\"H]!#9)!\"Y1\"$91\"!Y-'$)-!$I)*"
+ "#Y1#$9=%#YI##9I!&)U($9]$#YQ#\"IQ!#Y]&%YY'#YU%#J!$%Z)'!*%!#Y]\"#J9!"
+ "#J9!#*=\"$*9##Z9%#Z1\"\"ZA!%ZE\"':I)$JM$#JM!$*Q\"$*U\"%J]!$J]!$ZU%#[)!"
+ "#[-!$[5$#[5!$[5!#+)\"%+1\"%+=!![9!&[=!&[I)$[9!$[-!%[I$#[I!$;I\"\"[I!"
+ "'[U)%+Y!&;M\"&+]!%+Q!&KQ,&,%!%,%!%\\)'%L-\"%<5!%,1!&<I%&,5%&<9!%<9!"
+ "%LA\"%<M!\",E!'=!)%<9!%<M!&\\M\"%<]!+L5+%<Y!\",Q!'<I$$<Y!&,]#&=))%LY!"
+ "'=!)(M%.'=)(%]%\"$,]$']%*%]-\"&-9\"%M1!%])\"&=9$%MA%$=9!%M9!%M5&&-=#"
+ "(-=&$-9$'=A((]=$)=I!'-I!!-E!%ME!'MI)$=1!&MM$%]M!%M9!'=I((=Y!%ME!"
+ "%]I!(-I!%ME!%ME!&]E!$MM!$MQ!%]I!'=I('-I!)-Q*%]Q!'=E(%MA!%]M!%MA!"
+ "%]E!)=E!&-9\"$=1!'=A(&MA$+=91']1!'-5'']1&&M9%&-E\"&-I\"$]=\"(--,%<]!"
+ "'-1\"%M1!%]-\"#]!$'])!%M%!&]%'(-!''=!$%<]!%<]!%\\Q\"&LY!%<E!'=!$(,M,"
+ "'<M$)\\M&%LI\"&<M!&L=&&<=&#,)!%<E!&\\9#&,=$%<=!&L5\"%,1!%L-\"%,1!%\\%$"
+ "'<-%)+Y%&,!%#+Y!%[Q$&+Q!&+Q!%+Q!$KM##+M!$[I!%+M!$KA$\"[E!%[=!\"[9!"
+ "%[5!&[5!#[)!$[5!\"[%!%[)!$K)$\"[1!#*Y!$;)\"$ZY\"#JE!%K!$$ZM%$ZM!\"ZI!"
+ "%*I*#JA!#Z=\"$JI!#J-!#J9!#*-\"$:!!#Z-\"&*),\"J)$#J!!!YY$#9Q!$9M!#IQ\""
+ "!IQ)#99!#I=\"#IM\"%9A(!Y9$#)5#\"I9!#Y%$\"Y9\"\"91#\"Y-\"#)-#&9)!$95%#H]%"
+ "#(E!\"XM\"\"XQ\"!HE&\"8U#\"8]!\"XY\"%H]$$(]'#9!!%8]#\"I%!#)A&#)5#$)=!$IE&"
+ "#9=!%I5'$IE&%9M\"%)M$%)Q($)M$%)U'\"I]!%9])!Z%$$J%&$J%&$J)\"$*)#$*1\""
+ "#J9!&*5,%Z9*#JA!&:=!$JQ%\"ZE!#JA!&ZI#$JI%#ZM!'JY%#Z]!$;)\"$;!#&[%!"
+ "%+%\"\"+!\"#[5!#[-!#[1!$[5!$[9!&+=\"&[=)&[=-%[I$$+Q!#+U!$[Q%$+Q!&;U&"
+ "$+Q!%+Y!&L%#$[Y$%+]!%L%#$,)!'+]%%L-\"%,%!(L1&&<5!%L9\"$<5!%<A!&<A!"
+ "%<I!%\\Y#&\\I'%LE!%LM\"'LM+%=%$&LU&&LU!%LQ!%<U!%<Y!%\\]\"%<Y!%M%!%<]!"
+ "$<Y!%M)!)M-)'M-$$]5\"%M5!)=5\"&]5!%M1&$=5!']9+%M1!&]A&%]Q!,M=1%ME!"
+ ")-=%%]A!%]Q!%-Q#%MA!&-A#)-A!&]9!%]M!%]I!%]I!%]M!&]Q!'-U!%]M!&]M!"
+ "#=U!$MM!%ME*%]M!'MI)&]5!%]M!'=Q(%MA!&=M#'-M&%M=!%]I!%]I!%=I$&-U!"
+ "%M9!%ME!%M=!$MM!'M=)%MA!%M9!#]Q#'=E\"%M9!%MA!'=9(%]9!%]5\"&=-$%M-!"
+ "&]-!&]1!'=-)%M-!']1*&=%$#,]!%M%!(-%\"%M!!#=!!(--!'L]!&<Q$#,Y$%\\U\""
+ "%<]!$,I$%<E!&<I!#,I!%LA\"%<A!&<A!%<=!&<E!'\\A'%<9!'L%+%,1!',)%&,5$"
+ "%,)!&,%%%\\!#%,!!'+]%%K]##+Y%%+U!#+]!$+I!%KM+%[A%%KQ#%[A!%KA#(+=&"
+ "\"+5!#[5!#K-#\"[-!\"[-!$+)!#Z]!#[)!#+%!$*U\"$*Y\"#ZQ!#Z]!#JM!#ZE\"#ZQ!"
+ "'ZE($:E$%*A&\"Z=!#Z9\"#Z%\"%:5!$J5%\"*5%\"I]!&*%+#:-#\"IY!#YY\"$)Y##IM!"
+ "'IM,':%&$)E##IE(%IE$$I5#$9A\"!Y=!\"I9$$)9!!Y1$#)-##))##I%##9%!$I-'"
+ "\"81!#HM\"#(Q##(U#\"X]\"%9)#%XY&!(U!&I5\"\"I)!\"99&!I5##Y)'%YA!$99($9=("
+ "#9A!%)I%#YA\"#YE##IE!$)E!#YY\"#J%!#Y]%&*-%%:!!#J1!$:%!%:5!#J-!$:1!"
+ "#J!!\"*9!$J=!#Z9\"$JA$$ZQ\"%JI!$ZM\"#ZY,&:Q(%:U$$K%$#K%'%J]!%;)'!;%\""
+ "%[1!#K1#$[5!$+9\"'+I*\"+1!$K=#&+A&&[A$$[I!%[I!%;I\"\"[=!$[]$&[M)%<!!"
+ "%;Y\"&[I!'KY''+Y!&\\-(%<)!&,)!%<)%'L5*&\\9#%<%\"%L9\"(<%!%\\=#&<A%%LM!"
+ "%\\Y\"(,U,'\\I\"&,M#%\\Q\"%<=!%LM\"%-!$)\\Q!&L]!%]%\"']%!%]5\"&M%&%]%\"%M)!"
+ "&]1&&M-%%--$&--#%-1$&])'&=)$%]%\"&M9%#=I!%MA!']E*$]M\"&ME$']1!(-E!"
+ "#=E!%ME!%M1!&]M!%]I!']5!%]M!%]M!$=9!&-M\"%ME!$MQ!%]Q!'=]'%]M!%=Q$"
+ "(]Q.&-U!&==$&]I!%]M!%]Q!(-I+&]M!%]M!'-Y!%]Q!(-Q!*-I$#MM!%]Q!%]U!"
+ "&]M!%]I!%]U!%]I!%M=!%ME!&]M!%ME!$=9*)-A!&-A\"%]5\"%=E$&M=%%=A$%M9!"
+ "&=5$%]5!#=!!'-)\"\"-%!%M5!%]1\"&=%$(-),&=%$%M!!$=!!&,]#(<]-)\\Q!%<Q!"
+ "'<Q.#LM&&LQ!%\\Q\"$<M!%LI\"(LE!(<9.&\\='%<=!%<A!%L9\"'<)&\"L1#%L)#'<)&"
+ "'L9\"'\\),',%));M\"#;Q\"%;Y\"'+Y)',!!&;Q'&+Y!#[I!%[I!$;I&![E!#[A!%;I\""
+ "(+M&%+A%#[-!%K5(%[5!$;-&\"[)!#[1!#;%#$*]\"$Z]%!ZY!&:Y'#ZQ!$ZM%%JM%"
+ "$ZI%#*E\"#ZA!#JA!#ZA\"#J9$$:-#$*1#%*-'$*-#$*)#%J%*#)U#$)Y#%)]$#I]!"
+ "$9]$#IQ\"$Z!&#Y=##9=!$YA'$YI#\"I9!\"I5!$))$\"I1!$91(#)=#\"I5!$))$#Y)#"
+ "!(5)!HM!#8M$\"H]!\"I%!#XU&!9-\"!Y%!$I%##))#$)='$Y-$!)5$#I9%\"I9!$)-$"
+ "!YA!%YE+%YE%#9M!#9M!$9U$#9U!$)Y#!Z)!%:%+#:%#&*%,#J-!$*)'%:5$#J5!"
+ "%:9%%J9%#Z=\"#JM!\"JE*#J=!$ZI\"\"Z]!!ZQ!$JU!%*I##ZU!#ZQ!$+%\"#[-!%;)'"
+ "$K)'&+-\"$[1!&;)'%;1\"$;E\"%+=!%[I$&+A\"%;I\"&;I\"&+M!\"+Y!%+Q%&;U\"%KY#"
+ "%K]##KY#'L!#%\\1#%\\)$&+U!'\\5(#\\9$$,-!%,-!&<9%&<9!&LA&&,9)%<9!&<=%"
+ "&\\I\"%<E!$<I!&,Y#$\\Q#&LU&\",]!(\\U/#\\]#&\\E#%M!!%M!!&M%!%]!\"%M)!)=%'"
+ "&]1!$=)!%]A!']=+&=)$%M1!'M9$$MA!)]E()-=0'-=!#MI+#=A!&-A#&]E!%ME!"
+ "%ME!%M=!\"-I!%]A!&]M!'MM(\"-M!%]Q!#-M$'-Q&']E$%]Q!'-U&'-Y!'-U!&]Y%"
+ "\"-U!%]U!%]U!'-Y&%]]!&MU$%]Q!'MY)%]U!%]U!%]U!(=]!']Q.%]Q!%]U!#=M!"
+ "%ME!%]I!)=I''-I&%]I!(-I!(]E$%M9!%]M!&]Q!$MM*(-I!$MA!$M=!&]=&%M1!"
+ "%]=!$=1!(]5.&]5&%])\"'-)\"%M-!%]-!)<Y(#=9%%]!\"&L]%$=%!&L]!%M!!%<Y!"
+ "%,Y$'-!'*LQ)&<Q%$<I!)\\I!%<I!&,E$',A(%<A!%<A!%,)!&<9%$,=%!L5#\",-!"
+ "'<-%%,%!%,%!%+Q!&,!!%;]\"&L%'%;Y\"&KU#$KU#([=!$KM#&[Y,(;A''+E&$[A!"
+ "%+=!';-(&K9(&K9$$K5##K9(#[%!$;-+#[!!$K%$#[!!$J]!&ZU*$+!\"$JQ$%ZM\""
+ "$*Q\"#JI!%:E(&:E$$*9\"%Z9#%:A!\"Z5!$:1$$J-%#Z)\"$)]'%*)'#J!!%:)!\"YU\""
+ "#YM\"#9M!#IQ!#II\"%)Q($YE'#)A##I=%#II$#)9##95!\"I-!\"9-##I-%\"Y%\"#9)!"
+ "!HA##XQ&#XU)\"XU\"#HU%\"9!##I%#%I)'#Y)##9-$#9-$#9)$#IE!#9A$$I=&%IA*"
+ "#9M!$9M%$95%&IE$#9Q!#YU\"#IY!$)U##I]!$:!$!J1#\"9]##J-!$J)%#JA!!Z5!"
+ "%*5'&Z9'#JE!#J=!&:U$#JI!#JE!$JQ%\"Z]!#Z]!#[-!#Z]!$+5%$K)$\"[!!%K-$"
+ "#+)\"$+9!%[-!&+5\"$[5!%+-\"$KA'%;A\"!+A!#;I*&[]$%+U!&+Q!&;Y&%+U!&[M)"
+ "%[]$'<%.$L1\"&<)!%\\-#$<-\"&<5%%<5!&,5$%\\=#%<9!&,=$&<A%%,1!%<5!&<I!"
+ "&<M!&<9!(,Q#%<Q!\",U!(LU)&\\U\"&-)#%<]!%<Y!%M%!(=!$']!!)=!1'M-$$<]!"
+ "&-A#(--,%]1!*==+%M5!%]9!%M=!%]E!'=9()-A!\"-=!$=5!&-I'%MA!#=M!%]M!"
+ ")-M$%]I!&-U!&]M!$MM!%^!!%]M!&]U%%-Y\"&>%#&]A&$]Y!%]Y!'=U(&-U!$MY!"
+ "%]Y!'MY#%^!!%^%%%]]!%]Y!(-Y+%N)%%^!!&-Y!$MU!%]U!$>%%(-Q+%]U!$MU!"
+ "%]M!#MY!%]M!&]M!#=E!%]Q!(=I,%M=!&N!$%]Q!&]E!&]E!&=A$#MA!&-A\"'-=\""
+ "(=1(&M9%$=9!&]1!%]=!%M1!&=1$']-!'M)%%]9!&M)!'M%$%]%\"$=!!%<Y!&M!%"
+ "#LU\"%<Y!',Y('LQ&(<Q)%<Y!%<I!#LE\"(<E.%,E$)<=*%L=\"&<9%%,9$&\\-(&<-*"
+ "$<-!%L)#%<1!%<%!&L5+%+U!$,%!&[Y(%+Y%&KU#';M+![A!\"+M!%;=\"$KE#$+A!"
+ "&[1*&+=!%+=\"#K-$&;9'!+1,#[-!'+1/#[)!';%(%*]&#JI!#JY$#Z]!%JU!#ZU!"
+ "\"*I\"$JM%!:E\"$J=!#Z9\"#Z9\"#J9!$:)$#J-!#Z1\"%:-!#Z1\"%*1'\"IY!$J%&#9Y$"
+ "$YY##9U!$YQ#&9M-$)U#$)I!#Y=&\"Y=\"$9=(%)5%#)5##9)$#)-#$I))\"Y!\"#I!\""
+ "!HM##HQ(#(Y&!XY!%X]+#XY&#I!\"%X],\"Y!#\"I-$$)1$#91$\"9)#%)9(\"IA!$)=$"
+ "#YE\"$)=$#9Q!&9I#$IQ%$IU%%)Y$$*%#%*%'$*!##J-!%J-\"#Z-\"\"*1\"#J5!%Z1#"
+ "\"*9!#J=$#ZA\"$:E##J=!\"*M!$*M\"$JQ$#ZU!#ZY!#Z]!#ZY!$;!#%*]\"&[-.#K-#"
+ "%[1!&+1&%;5&%;A\"$[=!$[9!&;A&)+E&\"+Q!%;A\"\"[E$$+Q!%+U!%,)!&KA(&,!)"
+ "%\\!#%\\%$%,-!&,5)%L-\"'<=)',I)%\\5#%L5\"&<5!'<E%%L=\"%L5\"\"\\9#&LI&&<M!"
+ "%<]!%<Q!%<Q!&LM*%<U!(\\Y&%LM\"%=!$(])!%M-!%]%\"&M%&&=)$'=-(%M5!$M1&"
+ "$]%#$M-!&]9!'=5(\"-=!'-9\"&=I#&=A$%]E!&=E$*=E!%MM%%]Q!%]]!+=U$&]=!"
+ "%]Q!(-E!%]I!%]M!&M]$'-U!%]Q!%]Y!#]Y\"(=Y!%^%!'MY)%]I!(>!!%^%!%]]!"
+ "'-]!&]Q!&N!$&MU$&=]#%]M!%]]!(-]%$N%!%]]!(-Y+%]Y!%^%!)]Y(\"-Y!(-Q!"
+ "%]U+%]Y!%]]!&=Q#&-Q\"'-U!)-U%%]Q!&]M!*=M+&M=$'=A($ME!%]Q!&]E!#]E#"
+ "'-E!$MA!'==(*=5+(]=$$]5\"&-=#)-E+&]I!']-*%]5!\"M1\"&M1%(])/%M1!&-!#"
+ "%<]!%<Y!%]!\")L])&\\I'*LQ/%LM\"&<I!#,I!%<I!#<-!%<A!%<A!%<%\"(,9#'<9!"
+ "%LI\"%,-!\"<)\"$L-#%,%!',%!&L%'%K]#&+Y!%+Y!%+U!!+Q!$KQ##[I!'[]#%;E\""
+ "%[=!#[=!$[9%%[9!$+9!#[1!#[-!%[E!$[)!%K%!#:]#%K%$$:Q#$JY$#ZU!$JI$"
+ "#ZI!':U!$JM$!:E\"#J=!#ZA!%Z9*#J=!&ZA'#JA!#Z5\"$Z)&$*%#!Z%!#I]!$Z1*"
+ "$)Y##9Q$#9Y$%)]'#9A!$9E\"#YI#$)A$$Y='%9E&!Y9!%9=\"#)A#\"I%!#9)!%))%"
+ "!HI!$8I&!(U!#HI&$))*#9%!%I%(%I9.!I!%$I-)#)5#&9-$\"I1!#)=#$)A##9I'"
+ "$YE&$)I!\"YM!#9Q!$)]##YQ#$)Y##Y]\"#Z!%%:%(#J1!#Z9!\"J-!$:-!$:1!%:9("
+ "$J5!#JA!%ZA)$JE%$:E$\"ZM!#ZQ!$:U+\"ZM!$*]\"#[!!$K%'$;%#&[-%#[)!&K)-"
+ "![)!![5!%+5\"%;9#'+=\"%[9%)KQ#';U+([U$%+A!%[Q)%;M\"%+U!(+]%%+]!%+]!"
+ "%K]#%,%!&,1$%\\9#%,1!$,5!$<-\"&,5$%L5#%\\=#%\\A#$,A!%LI\"',Q#&LE&#,U%"
+ "%<I!%<I!'\\]&$<]!%\\Q\"%M!!&LU!&M!!&]-'&]!!%]5\"%--($]-\"%M5!$M1!%M1!"
+ "%M)*&=9$%]5!%M9!%M9!&MI$&M5$#=I!%]M!%]M!$M=!(=Y!&=U#']M$$MU!&=Q#"
+ "#=Q!\"-U!&]Q!#=Q!)MY!)-]/&-Y\"%]Q!%]Q!\"-Y!%^!!&=]('-]!&>%(%^-!(=Y!"
+ "&-]!$^!!'-M''>)''.!%$N!!'.!!'.!+&>%#&-Y\"&-]!%]]!#]]\"$N%!%^!!%^%!"
+ "%=Y$'-Y!%]M!%]Q!$M]!'-U&(>%!&]A!\"-Q!%=E$%]I!%ME!%M=!%=I$)=I!'-1'"
+ "%M9!%MA!%]-\"#=9!(M=$&]9&%]9!'-5'&]A!%]1\"%M%*(M-$'\\]&%])\"$=)!%<]!"
+ "%M5!'<E)&LY!'LU!%\\U\"(\\Q/&<M!%LM!%LI!%<A%%LI\"&<=&\",9!%<=!$L1\"&<5!"
+ "'LI*(,9##,)!$<)!%\\)$#L!'%,!!&<-&\"+Y!(;Y!%;Y\"$+Q!!+Q!%KY'$[I!&KI#"
+ "#+M!&[E!&;=&#[5!%;5\"&[=!%[1!!;%\"$+%\"%[)!#[-!$+)\"$+5&$;)\"%K%($*E\""
+ "$*U\"$;!#$:I#$:E$&*A'$J=!#J1!!Z9!$Z1&#Z1\"#Z5\"#J9!'J%$#Z)\"$IY%$9U$"
+ "#Y]\"%9U(&)U%\"IQ!#IM\"$)A$#9E!#IA\"#I=\"$)1'\"Y9+%)5+\"I5!\"I!!\")-\"!)!!"
+ "\"HQ!#(M!#(Y#&(])$8]\"\"))\"$)%(!I!%#I)%#Y=&#9-!!91%\"IA$!Y-!\"I1!%9E%"
+ "#YI#&9M\"$J%%#9A!#YQ\"%9U%\"9])#*!##J!!&J-'#Z%\"$:5$\"Z)\"#J5!\"*=\"#Z9\""
+ "#J=!&:A!%:E!$ZA\"#ZQ!#JM!#:Q\"#JA!#ZQ!#Z]!$+!\"$[!&$+%\"#[)!$;1#$+=!"
+ "$+1\"%[5!$[9!&+=!';U&%;5#$[=!%;M\"%;A'$;Y\"&+Q!';I\"*;]'%+U!%;Y\"\"+U!"
+ "&,%!',)$%,)!%,-!%L5\"'<5!#\\9$'\\5(%<A!',A$&<A!'LQ!%LM!%<M!(,M,%LY!"
+ "&,E(%<Y!%<Y!'\\A\"'<Y)%M!!$L]!%M!!&]-&'=%)&LU!$=1!']%!'--'']5!&=)$"
+ "(MU-%M)!&==$#=A!%M1!'=E(&==$%]U!$MM!#]Q#&=Q#&]Q%(-Q!%]]!%]U!'-U!"
+ "&=M$%]Y!$N!!%^!!&=]#&-]!$MY!%^%!(>)!!^!)%^)!&.!!'-]!&-U\"'N-\"%^!!"
+ "&.!!%^-!'.%!%]Y!$N)!'-Y!$N!!$N!!)]U)%]]!&]]%#>!!%^-!%^!!'^-$$MY!"
+ "%]Y!#=Y!%]Y!%^!!%]M!'.!!%]Y!%]Y!$M]!*MY!%]Q!%]Q!$=9!$MQ!&]E!&]I!"
+ "%]Y!&-=#'=E\"#]9#%M5!&=9$#=A!&=9)\"=9!)--!\"-)!#=)!#M%\"(M%$#=5!\"-)!"
+ "%=!$&M!%&M!!&\\Y'&LY&%,U#$,M)%<U!%<U!$<Q!&,I#%<E!+<=#%<A!%<I!%\\A#"
+ "&L5&$,5!#<)\"#\\1$)L)\"%,)%$\\1$#,)!(+Y!&KY'$<)\"$[Y$$;M\"%KQ#$;M'%;M#"
+ "%[1%&[9!$[A!$[-!%[-!$[5!\"[9!%+1&%[)&&+)+$K!'%:Q$$;!\"&*]#%*Y&&K!!"
+ "$JY!$:I$#JM!':E!#ZQ!%:A!\"ZE(%JE)#J9!#J9$#Z5\"#Z)\"&Z)##Z%\"!Z%!$:!("
+ "$J!%$)U##9U#&Y](#IE!$IA%%)I%$IE##)E##)1##Y9#\")5\"$I1)#)5##9-$$HY)"
+ "!HM!!(M!#I!(\"X]\"\"8U!#Y9&$))$#)%#\"IA!#Y1#\"Y=\"%IE-%)=!#9A!#Y=##Y5#"
+ "#9A!!YU!$YU#$9Y$#I]!$:!$%9])#J!!$*!##Z1\"$*)&#J!!#JE!$Z5\"#Z9\"!ZE!"
+ "%*A##Z=!$*E)#ZI\"'ZM+\"ZQ!%JY!&*Y'$JY$#Z]!$;!##[%!$[!!!+)!'+1+$+!\""
+ "%[1!\"[9!&+-\"%;=&%[A!&+E!&[E%\"+M!$[Q%$+U!#;U&$[Q(%<!\"%+]!%,!!%<!\""
+ "#<%\"&,!%%L5#%,)!#\\1#%<5!%<9!%L9\"%<=!%<A!*,=((,I)'<I%$LY\"&<M%&,U#"
+ "(<Q.$=!!$\\]#%L]!%]-!$L]\"%]5\"%M-!%<]!%M1!&]-+%M5&%M-!$M5!'-9\"&]A&"
+ "%M=!']9%#MA\"&MM$(=E(&-U!$MM!&]Q!$MM!%]M!$=Y%#=U!%]U!$]Q!%]Y!&-U!"
+ "'-Y&!-Q!&-]\"'-M&'.%%%]Y!&>!-%^!!(M]'%^!!%^%!!.-&%^)!%^%!#>%!&^%%"
+ "&.9!%^!!$N-%%^%!$N%!%.9\"$M]!%^!!'.%!%]]!%^%!%^%!'N%('.%&%]Y!$>1$"
+ "*^!!%]]!']])%.!(&-U!(=]!%^%!)>!*)-U*%]Q!%]M!&=U#%]Q!%^!!%]M!$MM!"
+ "%]I!%ME!'-=!']E$\"-E!'=A(&-E\")=9!%M-!&])&%M5!%M%!%]1\"(-1+%]!\"&=)$"
+ "'<Y)%M!!&=!$(LY%)<Y(&LU!&<U%%<Q!&,U#$<M!%<M!&,=$%L9\"&<A&&,1%%<E%"
+ "%L1#',1)%\\1#)<1*%L-#$,)!&\\%(#L%#%,!%$+]!%[I!$;U\"%<!!$[M%%+M!$[I!"
+ "$[I!\"[E!(K1$$[=!&+5&&[1&$;)#%[-)$[-%%K-(#[)!$[)!$Z]%#ZQ!!*Y!%JY!"
+ "%ZQ&%*Q#%:M$%JI!$:E$#JI!#ZA\"%ZE\"\"J9##Z=!$*9\"!J-'$Z-&&Z)$#J!!\"J%!"
+ "#I]!$9M$#)Q\"#YM#$)U##YM\"#II($)E'#9A!#9M!\"I=!$99(\"8]!\")!#%)-\"#I)\""
+ "#8Q$\"HQ$#(U#$8U#$8U#%)))#91$#9-$\"Y-(#)-##)9#!Y-!\"9A)#Y9##YE#$9I%"
+ "#IM!$)Y#$)Y#%)A'%J!#\"YU%$*)#\"IU!%:9($:)$#Z-\"#Z5\"\"J1!#JA!$:9$#J1!"
+ "$JA!#JA!$JI$#JM!$*Y\"#:I#!ZU!'ZY.'[%2$J]$$JU$$K%$$;-#%[5!\"[9!$[=!"
+ "%K=$%;%#$[=!$[9!&KA$%;Q\"%[E!'+A\"#;I\"'KU#%+Y%#+Q!'+Y)&\\)'%,%!'L)#"
+ "%<)!%<5!#;U\"%,1!%L5#&<9!%L=\"*,5)%\\A#(LM!&<E%%L9\"#LI\"%\\Y\"%LM\"%<U!"
+ "%<Y!%<Y!%]!\"%M!!(-!\"%])\")]1*&])&&M-%(-1,&M5%%M1*%M-!$MI!%M=!(==("
+ "&]=!%MA!&]E!%MA!&]M!&]I!(]Q)$]M\"(-I!)=U!(-U!$MQ!%]]!%MQ%(=Y!(^%."
+ "#>1!'-]!%^!+%]Y!%]Q!!.5!&>!#(>%!*^!!&.=!%^!!'.)!%^)!%^)!&>)\"%^!!"
+ "&.5!%^5&$^5!%^-!#>%!%^)!%^-!%^)!,N)**.%)'.%&%^!!#^)\"&.)&*.%#%]U&"
+ "&N!$\"-]!&>1\"%^)!%]Y!%]]!&.5!%]]!#MY+%MY%*-Y)%^%!&=Q(%]U!%]Q!%]I!"
+ "&-9\"%]M!&]A!&]E!\"-A!(-=!(]A)%]I!&-=\"*-I4&M5$%M5!&-E\"%\\]&']-!$]!'"
+ "'-)\"%]%\"$=!!&=!$)-!\"(\\Y!%<Y!%M!!&<M!%\\Q''<U)#,M!'LM+%L5\"',A(%<I!"
+ "%L5#%\\9#'<A%%L1\"&<1!%<=!&L-\"'<-*%\\!$%L-\"'+]))+U!$,!!'KU'$KU##[I!"
+ "$[I!&;M#%;I\"&KM'$[A!%[9!$;1##K5($+5!#[%!$*]\"#:]\"$;)\"';%$!*Y!#ZY!"
+ "\"ZY%#*]\"$JE%\"*Q\"$*Q\"#JE!\"Z=!$ZA&$J9!'*9!$:-!%:1!$Z)\"$:-!!Z%$#9U!"
+ "&Z!!$)]#\"J!!#9U##9U!$)M#!YE!\"IQ!#YE#$)A!\"Y=\"#)9##I5\"\"Y!#!Y!!#I-%"
+ "$(Q'#8Y$$(Y'\"HU!#XY##XU!\"Y!\"\"Y!#\"I1!#Y=&\"I9!\"YE\"#9E!#IA!$)M##9M!"
+ "#)Q#$9M!!YQ!#)U&!IQ#$*!#%:!(!Z%!\"J)!$:%!!:%%$:1!#Z5!#J5!$Z=\"#:A#"
+ "#JA!$JI!#JI!'*Q$%JQ!%[!\"$JU!$ZQ\"$*]\"%:]'%;%'%+5\"$K5$#+!\"$+1\"$;5\""
+ "$K9#%;=\"#[9!$[A!%+A!&KI'$[M$&+Q!&KQ#%,!!&;Q\"%;Y&$;]\"&<!\"$K]#&+Y!"
+ "&<)!%<A!(L1\"\",5!%,1!$<E!$L=\"'\\E\"&<E%&LQ!%LE\"'L]!%LQ!$<U)%<E!%<Y!"
+ "(L]$&=!$']!!%\\Q\"&]%!%M-!#M)\"&M!%&=%$'=5$&-5,'-5''ME)%]=!%-=#'-A'"
+ "(-=!&]E!&]Q!%]A!$MM!%ME!'=]'%]Q!&=Q(%]Y!)>!%&=]#'-Y!#=]!&M]$$N%!"
+ "%^!!%]]!'-Y!(>)!'^!)'.-!%^-!&N1#%]]!&>1\"%^)!)>-%'.!!%^1!&.9!$N-!"
+ "&.=!'>)'%^-!%^)!&.-!'-]!'>5&(=]!%^!!'>-!'>9!%^1!&N1$&N)#%^%!'>5!"
+ "$N)!(>%!%^%!'-Y!$N!!%^%!'.-!%]Y!'-]!%]]!'-Y!%]]!%]Q!&-U\"%^!!#]1#"
+ "(]I$%]M!\"-U!%MM%(-I!&]E!&]A!%MA!$MQ!&]=!%-5#%]=+&M5$(MA$&M-!\"M5\""
+ "'=%)$]5\"'M%*%M!!#\\](%LU!%]!\"&LM!$<E!#\\Q#%<A!%\\U#&<Y%$LE\"&<E%&L9\""
+ "'<=&%\\5(%<9!&L1&%,1!(\\-#%,5$%,)!&,!%%,)!%,%!)KQ(&+U%%;M\"$K9$%+U%"
+ "&;M+&KI$%;M#$[A!&;A'$;A\")K5)#K5$#[1!$[!!#[%%&+-\"&K%)#[!!![!!$J]$"
+ "$ZU!\"ZI!!:Q\"#ZU!#Z1%#ZI!#JA!&*A+#ZE\"#J9!$Z1&#J1!#J-!%*)$%Z%#$)Y#"
+ "%I])$)]#$9Y!#9U!\")Q\"#9M!$)M#$YI'#9U!#YA#%99&$I-#\"I9!\"I1!\"I5!\"I)!"
+ "$8U##(Q##I%&!HY!#9!!!I1#\"HY!!))!$)1'!)5!#)-#\"I=!$9=\"%)=$&IE!#YE#"
+ "#YM#()I.!IU#$YY'#Z!%!Z)!#Y]\"#I]!%:%(#J-!%*1#(*5!#J=!#Z9\"\"ZA!#JA!"
+ "#Z=\"#J=!![!!(ZI(#ZQ!%*Y&$:U#'[-&$+!\"#[!!#[%!$ZY\"$*Y\"$*]\"%;5'%[5!"
+ "%;9*&[=!%;A\"$[E!$[E!%+A!$KQ#&+Q!&[I(\"+Y!$;U\"%K]#',%!%L)#%+Y!%<5!"
+ "%\\5#%L1\"%<A!$\\9#%L-#%<5!'<A!&,M$%<M!%L=\"$LM\"%LU!&LM&$LU\"&<Y%$<M!"
+ "&L]&$\\I#%M)!(=%(%<Y!(-)'%]-!(=1')-9+%M=!#=9!&-9\"#=9!'-=!&]A!&ME$"
+ "$ME!$MM!&-A\"$MM!\"-Q!%]Q!%]U!%]Q!$MU!']Y$&N%$%^!!&-]'#>!!$N!!%^!!"
+ "%.%\"'^)$'-U!%^)!&.%!'.)!'.)!%^-!%]]!%^)!'.1!&^5%'^1)'>1!#>-!%^1!"
+ "&>1($N-!(.9*'.1!).1#)^9,&>%#(.1%(^--'>1'&^5*&.5!#>!!#N-!(^)#$N1!"
+ "(^-#'.)!\".!!#N)&&^)%'>9!'.!!'.)%%]]!(>%+%^!!&]]%'.!!'N%#&-U!$ME!"
+ "&=Q#$MQ!$MQ!&]Q%%]I!%]Q!&-=\"$MI!#=I!(-A!$]-\"&M9$$-1$&]1!)=-\"$]1#"
+ ")--&%M-!&=)$'M)$(\\Y!'-!,&=)$%\\Y#&=%$*<Y#%<M!',U#%<E!%L]!'LE!&\\A("
+ "&\\A($L9\"%<9!%,!!&,5$&\\9#&L9\"%<%!%,)!%,%!&<!&%+M!%+Y!&;]\"&KU#(+Q!"
+ "$[M(%;E\"!+]%%[I!'[A%%+=\"%+9!$+5\"![E!%K1$![-!$+5\"%+%\"$;)##[1!&:]+"
+ "$*U&&*]\"$:U$%JM)&:E!$*U\"#ZE\"%:=!\"*=%\"J1!&:5!\"J-!\"J1!%:9!$:)!%:)!"
+ "!Z!!$)]##Z%\"#IY!%IU#%YU#$II#%)Q'#Y9#\"9E#$Y=!\"I=!%I9*#Y5#&9A&#91!"
+ "!(I!\"8Y!$(]$#9!!$9-%#9)$!Y)!#9-$#)1##91!#9='!YA!#IA\"\"IE!%)I($II&"
+ "$)M$#9Q!#IY!%I]&#J!!\"Z!\"#IU%#Z)\"$J)%$:!$$*1#!Z5!$*1&(*9%#J-!$JA$"
+ "#ZA\"$:I##ZQ!$JQ!#ZU!#ZU!$*Y\"\"[!!&K!!#[%!$+)!\"[-!#[)!&;-$$[5!#[1!"
+ "#;I\"$[A!&[9!#[9!%+A!$[I$$KQ#$KQ#%;]!&,-%&L)'&+M!(L%,%;]\"$,)!(,%%"
+ "(,1$%,1!$,5!'<5%$L=''<1*&<A!$<E!%<9!&\\M\"*<Q-%<Q%&-!$#=%!%M%!),]\""
+ "%]-!&M!!$-)$&M)!#=)!%M1!&M-*'M)%'=5((-5')-90'-A\"%]A''-A'%]I!$MM!"
+ "%]I!%]M!%ME!'MY#&]Q!&-A#&-U!%^!*'-]!%]U!'M])&]]%%]Q!#>%!$]Y!&N%$"
+ "%^%!(>)!'.)!%^-!%^-!%^%!&.9!$N1!%^)!'.%!&N1$$^5!&>)\"'>5!%^-!&.5!"
+ "'^E#%]]!)^5&&.5!(N9!&.9!$^A!,^1*%^1!'.)&&>5\"&>1\"$^5!&>=\"&N)$%^1!"
+ "'>1!%^-!%^-%&.9!%^)!'.)!%>)$'^1$&^!%&>!#$N!!$N!!%]Y!#=]!$MY!&>!#"
+ "&]M%&-Y\"'-U&'=E((-Q%%]M!&-I\"&]E+'ME(%MA!%]5\"&MA$&=1)(=9#%]%'&-1#"
+ "%MA!&M-!%M%!&=5((M!%$<]!&M!!'L]!%<U!&<]$%<U!%LQ!%<M!%LE\"%\\Q#%<A!"
+ "%<A!%<=!#,5!'\\1##\\5#%<9!%L1#$\\%##,-!%\\%$&,!!%+Y!'[]-&+M!$[Q)%;U&"
+ "%+M%%+M!(KM('[M-$[A$$;Y\"'+I&%[E!$+9\"'[1%'+-'$+%\"$K)$%;%'$;%##ZY!"
+ "#JY$$*]\"&*U+&ZQ*#JE!%JI(#JE!#*A\"#JI!#Z=\"$:9##Z-\"!Z1!%Z-'$Z)\"$Z%*"
+ "$*1##J!!%I]#%J!\"&)U%$Y]#$9M%#9M!%YI$#YE\"#YA#%9=##9=!\"95&\"I5!#Y5&"
+ "\"8]!\"8]!#HY%!(U!%)1%$I!'\"I1!#I1\"#Y5##I9%\"95##Y=\"#9A!&9A#$)I##9M!"
+ "%IQ)#I]!%IU\"#YY\"\"I]!!J%#\"Z%\"#J)!$J-%$J5)#J1!':1\"$:9$$:=#!ZI(%ZE'"
+ "#ZQ!&ZM*#JM!&*U'$Z]%%*Q'\"Z]!'J]-\"[!!\"[1$!;)\"$+%\"#[1!!+5(%K=$%;-#"
+ "%K=$)K5*&+Q!%;U\"'KQ(\"[E!%;U&&\\!(%+Y!'+]%$[I!%\\!#%,%!%\\-(%<!\"%,-!"
+ "\",1!$,5!%\\=#!<9&&\\E($\\A#%<E!\"<I!(,A-%<M!%\\Q,%M!!%M%!%<Q!$,A!'-%\""
+ "%M!!%M)!&]9+$=%!&--'&]=&'M5)#=9!']9+$M1!&==$%ME!%MA!#M9\"(MA#%]I!"
+ "%]M!)-Y%$]U!%]Q!%]Q!%]U!%]Y!#=]!%]Y!*.-)'^!$&N-$%^-!$N)!%>-#'.)%"
+ "%^-!%^)!(>-!&.9!%^1!&.9!%^!!&.5!&N-#\">5!&>5-&.=!&.9!).9)&.9!&.9!"
+ "$^E!&.A!%.=\"&.9!%^1!&N9#&NA#'>9!&N-##N9!%^1!'^9)%^)!&.9!*NI$'.-!"
+ "'>5!%^-!(>)&&^-%%^-!%^-!(N9!&>%#%^1!(^)\"%]]!)=M,%^)!)=Y%%]]!&N!$"
+ "\"^!#%]M!%^%!%]M!'-U!%MA!(-M!(=I!%]M!(=U!%MA!\"-=*'M5$%==$%ME!%]5'"
+ "%M1!%M1!%M-!%=%$%M)!%=-$$-!)&M%%(,Y,%\\Y\"&LU!%<M!&\\M\"',Q($\\A#%\\E#"
+ "(LE&(LA!%<A!&LI+$,9!$,-!%L5#%,-!%L-\"%,-!%;]\"&,!%&K]'$;Y\"*,-$';U\""
+ "%+Q!'+Q*&KM#$[I!\"[I$#[M$%+5\"%;=\"&K5$$+9\"#[!!#+5\"#K)##+-!$+)\"$+!\""
+ "$JQ%':]$#Z]!\"ZQ!$:M*%*E\"#JI!%Z=&$ZA&$:='$:9$#JI!$:-!#J-!$J-%#J)!"
+ "#Z-\"%:%!$I]%\"YY!$IU%%:-!%IU#\"IM!%YI$%9M%\"9A#$95%\"Y9\"\"I1!\"Y9\"#)-#"
+ "#(Q#\"8]#$8Y\"\"9!$#I%\"$))$$95(\"I5!#9A$$Y9$#Y9&#9E!\"I=!$9E\"#YI&#)M#"
+ "#)U#\"IM!#IY!#I]!&*!!\"J%!#Z%\"$J)\"$Z-&!J1'%J1%&:9!#JI!(*I,\"ZA!$:=#"
+ "$JA$$JI!$:M#$*Q\"$JM!$J]!#:]#$K=#&[!\"%+-)&K),#[!!$[1$$[9%%[9!'K=$"
+ "%;A\"$[A!%+U!$[I!$+M!$+U!$KU#%+Y!$;]\"%<!\"%<)!%L-\"!,-!%+Y!',-%%<5!"
+ "$,5!%<=!%<9!\"<=\"&<-&%<Q!#LE\"%LI\"$,A!%\\Q\"&,I#&]!\"&]!\"&,](&LY&'=%$"
+ "$L]!']!!%]%\"%]-!%M)!&=E$(-=!%ME!%M-!&M=$&=E#&MA)'=U'(-E!!-A!%]M!"
+ "&]I!%]U!%]U!#=Q!\".!!)]U#%]Y!&MQ$'>!!&^-%)N%!%^-!)N%&&^-%$.!$(>-%"
+ "(^)($^!!%^1!'.%!\".-!&.5!$^5!&.I!(>-!&.5!&.9!&.5!&.=!%^)!&.=!&.=!"
+ "$^E!&.M!'.1!&.=!'.1%&.5!#N=!&.=!&.9!&.=!%N9$&.9!'>M&#NA!$^5&*.9\""
+ "&.9!(.9%(^-(%^-!%^1!&N-#$^5!'.-!+.A,&>)\"%^%!%^%!%]M!%^-!'N)('-U!"
+ "(=]!'MY-%^!!(MY\"%]Y!%]I!+-M#(-M+(=U&(-=!&]M!(MQ,&MA$'ME(']=/%M1!"
+ "'M5*(-1'']5&'--\"&M=$$=1!%M)!%])\"$<]!%<Y!&-!#&\\U'%LQ!&<M!%<I!$,=%"
+ "&LY!'LA&&<A%%<=!%<5!%L5\"%<1!&<1!\",)!%,)!$,-!$<-!&<!\"&+]!$<%\"$+U!"
+ "'KQ#!;I\"$[E!%;I\"'[A%$[=!%[A%%;9\"%+9!$[5!\";5\"%+A%$K%$$K!$#Z]!$*U\""
+ "%J])#ZY!$ZQ\"%JQ!$ZU\"#JI!\"JY+$JU!$J5!$Z9\"$:9$!ZA!\"*A\"$J1%#Z-\"&*)!"
+ "#J%!#I]!#J!!#J%!#YQ##9U!$)M'$)M#$)I!\"9M#$9E%')9*\"IA!#I)\"$Y9*%)-\""
+ "#HQ\"$Y%+#)-#%(]\"\"Y%\"!9=\"\"I1!#)!$#I5\"#9-'$)M&$YE&#YA##91!%)Y($9M$"
+ "%)Q'#Z%\"$9Y$\"Z%!$Z!#&:%%#Z)\"$:%$#Z!\"$:1$!Z1!%*=#%JA\"$*Q\"\"ZA!$*E'"
+ "#JI!\"ZU!$JU!$ZI!$*Y\"$J]$#*]\"#Z]!\"+!!([)&$[5!%+-&'+5\"&+-&%+1&%;M\""
+ "%[A!([A*!;=*$[I!%;I&$;U\"&;U'%+Q!#K]#'<)!'<!&#<!\"'\\),&L-\"%;Y\"!<-&"
+ "%<A!&,A$%<=!%<E!$<=!'\\Q,$LQ\"&\\M\"&LU&%<U!'LU!%<]!&LY&'-!(%<]!'M)*"
+ "&\\]&&=)$#=9!&M!%%]-!%M-!$-9$$M9&$-=$&]E!%]I!$ME!%M5!']E$(]I.%]M!"
+ "(-Q!#>!!%]Q!#=Q!%]Y!%]]!#>-!%^)!!>-\"$N)%#>)!(=Y!(>-!'>1&%^-!&N%$"
+ "'N9(&.9!%^1!&.=!&.5!&.9!)^Q&&>5\"(NA,)>=/&.=!&.5!$^=!$^A!&.A!(NA!"
+ "&.A!&.A!'N=\"\">A!&.=!&^A$&.U!&.=!(N5!'NI'&^A$%N=$&.A!(N=!%>-$$^9!"
+ "&.9!$^5!&.I!+N9*&.5!&>5\"&.5!$>1$%^)!%^-!%^-!(N!!$N%!%^%!%^%!&.!!"
+ "!.!%'=]\")M]!'-Y!%]U!$MU!&MQ$(-M!%]M!%]M!%]I!(]E.$MA!'M=$#=5!%MA!"
+ "&M=)#=5!%M1!%]5\"'M-*(-)\"&M%%$=1!(\\]!%\\]\"&,]#&L]!%<M!%\\Q\"&-!$%]%\""
+ "%LM\"%<E!'LA+%<=!'<=!%<=!%L5#%\\9#%<%\"&L5'#<=&$,%!%L!'%+Y!%;]\"%;U\""
+ "&KQ#%;M\"$;I\"$[Q$$[E!%;=\"%+Q!%+=\"&K5$$[5!#[5!$;1##+)\"$[1!#;%\"%:Y#"
+ "$J]'%;!'$JY!$J]$$*Y\"\":U&!:I\"&:E!$ZM%#JA!#ZA!#JE$\"*1%$Z-&&YY!%J-)"
+ "#YY\"#J-!$J!%#)]#$9U$#9U!\"YE\"$II&#YM\"#YI#%9M%\"IA!$95(#99$!9=\"$91("
+ "\"8]#\"8I!&)1-#HU\"!9)\"#9!$\"I1!!I9#\"IE!#I=%#IA\"!IA#&9E&&)I\"$IM\"#9Q!"
+ "#J!!$YU'$)Y#$9M!#J%!\":!##Z-\"$J5!#J%!#J5!$ZE&#J-!&JI!$ZA%#ZQ!#J9!"
+ "&ZM&$ZI%$:Q##JU'\"Z]!$*Y\"$+!\"%:]##K)$#+%!\"[-!#[-!%+5\");9(&;A'%[A$"
+ "$[E!%;=\"&[E!$;Y\"$+Q!&+U!#+U%(+I.%[]$%,)!&L%#$<%&&L1\"%L1+%<5!%L)\""
+ "'<5!%,9$%<=!%<=!%<E%#,I!%LI\"%\\I#&LQ!%\\U\"&\\U'$<Y!&<Y%%M!!&]!!&]%'"
+ "%-)($=)!&M-%)-)!(=5\"&-E\"&]9!)=A'%MA!%MA!&M9$%]M!&]I!(>!!#M]!(-Q!"
+ "(-U*&-Y\"%^)!(=]!$M]!%^!!)=U0&>!\"%^%!%^-!%^)!'M](%^-!(N1!(.-*%^1!"
+ ").9)'>9!'^9#'>5&(>%!(N=!'NM'&N9#*.A''NA''>A!'>9!(NM!&.E!&>E\"(^='"
+ "'>E&#^M'&.9!).E#*.M!&.Q!'>A!&.E!\">M!&.E!&.]!&>A!&.=!#^A\"&.A!&.E!"
+ "&.=!#>=%&>=\"&.9!(>1!&.=!&.5!'>9!&.5!(>1%&>-')N10%^%!&N)$&.)!#>1!"
+ ")>)%%>%#(-U!(=Y&$MQ!(=U'%^%!%]Q!$MM!&MQ$%M1&)=M!*-=$&]E!%M9*$]E\""
+ "%=9$#=A!%M9!$<]!%]-\"(=5-#=1!$=%!(M%$%LU!'--\"&]!!%LM\"%\\U\"%<A!%<M!"
+ "%LI\"&<M%'LE&&,9$(\\90&,)!$LE\"$,5!(<9%$,1!#,)!%\\5#%,!!%<!!%L)#%;M\""
+ "%;M\"&L!'%+Y!%;M'&[I($[A!%KM#$[-!$[A!&+9!$[5!\";-\"#[1!$[-!#[)!%K!!"
+ "#*]\"$*]\"#:Y\"$ZY\"#Z]!$*Q\"%*M##Z=\"$JA$%:A!':9&$*M&$J1\"#Z=)#*1\"&*5("
+ "$Z)&#*%##*!#%*-'$IY&$)Y#$YU'$)I##YM\"#YI##YI#&IA$')=##91!$)I#\"I1!"
+ "#XU&#I)\"#91!$Y%!#I)&%I-+#)1#!Y!!\"I9!\"I='$)A$#9E!%)E!$9I$\"IQ!$J!%"
+ "\"IU!$:)!$:!'%J%)#Z5\"$)Y##J)!\"Z%\"%*-$!:9\"\"Z9!#*9\"$JA!\"ZA!'*A$%JI!"
+ "$JQ!\"ZY!#ZY!\"JY$$;!\"$ZY\"#+%%$K-$$K)$#+%\"#[9!%[9!\"[I!'K5)&[5!$+A!"
+ "%;E&%[I!&[I$%;Q'&KU,%KI''+Y%%;]!)K]\"%L!#%<%\"&\\)#&,-$%<A!%<5!&<9!"
+ "%\\M'%<=!%,=(%,1!%LE\"(<M$$,A!'LQ!%<Q!&\\U\"&\\Y&%\\Y#&M%&%M%!$M%!%])\""
+ "%M)!'-%#'-5\"%]1\"%M5!%M9!&-=#%MA!&]A!%MA!%]Q!%ME!&]M!&=E$%]Q!%]U!"
+ "&MM$%]Y!%]]!%]]!(>!&%^!&%^%!%^)!'.)!%^1!$N%!*^!!'.1!%^1!$^=!%^1!"
+ "$^E!&.E&&.=!&.5!#NA!'>9!'>E!&.5!%>U\")NQ0%^A*&NQ\"'.I%(^M'(NI!'.=%"
+ "(>I+&.I&&.A!&.M!&^I)&.E!)^E!&.A!'>I,'>A!&.=!$^E!&.E!&>I!%.Q'(NI&"
+ "'>A!&.A!&.=!&.=!$^E&&.9!#^5\"'N9'#>-!%^)!$N1!%^-!&>!\"%^)!)N)&'.%!"
+ "$N!!'.)!%ME!$]M!$MY!)-Y)$M]!(=Y!%]Q!']Y))-A+$MQ!&]=!'ME)$ME!(-=!"
+ "$MA!*=9!%M9%#M9\"&M%!%]-\"%M)!%]=!&-%$']%!%-%$'=!)%\\]\"%<Q!(,Q(%<Q!"
+ "%M!&&<=%(\\E0%<A!\",A!%<=!%<9!'<-!%,1!%L5\"&,)!&\\)'%L%#%L!#&[Y$$+M!"
+ "%+]!(+I!&;Y+$+U!%+Q!%+Y!%+E!%;A\"$+5\"%+9\"#K=$\"[=$#[)!$[%%#;-\"$JY!"
+ "#:M#\"[%!#[)!#;%##JI!#ZQ!#ZI!$*Q\"$JM!$JY$$Z)&#J9!#JE!$Z1\"#J1!#J9!"
+ "$J9!$J%!#*%#!J!#!YQ!!YU!#Z%\"$9]$%IQ*#YI##IM\"#IE\"#9A$$Y5'#I9%#)))"
+ "$(]*#H]\"$(Y$#91$#(U##I%%\"I1!\"I5!#99$\"Y5(#IM!#YE#$)I#&9I'$)A##9Q#"
+ "#)Y##YY\"#YQ)$:-##*!\"#Z)\"#J1!#Z)\"\"J1!!*1%%J9)\"J%!%JI!#J9!%:M$!ZQ!"
+ "&:Q($ZE\"#ZU!$*Y\"%*]\"%*]\"&*Q'%+)\"#[)!%+9!\"[1!#[I!\";9\"%[9!'+=\"(;=0"
+ "$;E\"![I!'KM($[Q%$+Q!%+U!&+]%%+]!%<!\"%,!!%\\%(%L)\"&L1&&,1%%<=!%<=!"
+ "&,)!&<=&&<A!%<E!%LI!&\\M\"%LM!&<M!*,U'&LY!%<Q!!-%%%LY!&\\]&'-)\"#M1\""
+ "&]1!%M-!&=1$)-9!&]9&#=A!*-=+*]A('-='%M9!%]]!%]M!%]Q!&MY$%-Y#%]U!"
+ "'.!%(M]-'-Y!%^!!'-U!&.=!%^-!'.)!&.%!&^-%%^)!'>1'$^I!&.5!&.A!$>)$"
+ "(.5*&.=!&>E'&.A!&NA#'>E!'NA''>=!'^I\"(^A\"'.I%#NI!&.I!+^M#'NM'$^M!"
+ "%^M%*.A'&.M!'>M!&.I!&.M!&.M!&^I$\">M!'>E!'>I!&.M!&NI()^I,$^E!(^E'"
+ "&>E!#NI!\">E!)^A!'>E!%^1!&.=!&>5\"#N5!'>5!%N5$&.9!(.A*'^5)#^1'&.)!"
+ "'>-'%^1!$N%!'N!)'.!!$M]!&-Y'*MY&&]M%#ME\"%]I!%]I!%]I!%M=!'-Y&$MI!"
+ "&-=#'-5\"%M9!%M5!\"M=#']-*%]9&$=)!'-%#&M-%&\\Y&&L]&$\\]#$=!!&\\U&%<I!"
+ "%<M!&\\Q\"%<I!',E(%L=\"&<=&!,9!%<9!%,%!\"L1#&\\1(&L1'$<!!&<%%&;]!'[Y-"
+ "%;Q\"*[M%'KQ#$+U!!;=*%;I\"#[=!#;A\"$;=\"#;I\"';9\"%+9\"$[1!%+-&#[)!$*]%"
+ "%ZU)%[1!%:]##+)!#ZU!#JM!$ZI\"$*Q\"!*I!#JA!(*A%#J5!\"Z5!%JA\"$J5!#J-!"
+ "$*-#$I]&&*-($J!!#IY!%)]!$)M#$YQ#$IQ&$IM&$)I$#9A!\"I=$\"9=#\"YM!\"9)#"
+ "$H]##8Y!#(Y!\"I1!#9-$#91!#95$$)9!#9A!#Y9#\")E\"$9E%#9I!%9U!#9E!#J)!"
+ "#J1!$)Y##YQ\"&)Y!!J5&#J)!!*-!#Z9\"#J5!#J=!$Z1&$:=$#Z=\"&ZA+#JI!$*I&"
+ "#ZU!%*Y*#ZU!'+%.#:Y\"$:U$%+%&'J]%$+-!%;9&#[5!%[5!#[=!([=!\"[=!%;E\""
+ "%KU#%[I!$KE#$[I$$+Q!%+]!&;U'&KY'&,!!%,%!$;Y\"&L5'$L5\"&<-!%L%#&<1!"
+ "'<=!$LM\"$\\M#&,E#%<E!%\\M#%\\Q\"&L]!',U##,Y!&L]%\"-%!'L]!)=!-%M-!&M)!"
+ "']-!'-1\"'--\"&-9\")M=-%]9&#=A!!-U!&]5!&MQ$%]Y!&MQ$(=Y!&-]!$MY!%]Y!"
+ ")>!0&]Y%%^%!%>%#(>1!'>1,%^)!*N-%&.5!%^)!'.1!+.5'#^9\"&^9%$.A#'.=%"
+ "'>Q!&^A$&>=\"'.A&(>A+&.M!%.9\"&.=&&.M!#NM!&.I!&.Q!&.I&&.Q!$_)!\"^Q#"
+ ").Q-&?!!(NM!'>Q!&^I$'^U\"'>M!&.]!#^Q!'>U!).I.(N=!&.M!'>I&)^I!'>I!"
+ "&^I$(NA!)^A!&.M&&^9$'^9#&.A!&.I!$^=!'>5!'>5!'>9!%N-%&.5!&.5!&>1\""
+ "'>-&'-Y&#^)\"$^!&'.!!'.!&&-]\"&]=!'=Y'&-Y\"%]Q!&=M#%]Q!%ME!$MA!%ME!"
+ "%]M!%]E!&M9$%M9!(-E!'-1'&=1$%M-&'])!%M%!&M)!%])\"&L]!$=!!),]!%\\U\""
+ "%LM!%<M!%<I!&<E!&\\E'$\\Q#%<E!$,9!%,-!%,1!%,-!%L-##\\5$'<-*#+]!%<!\""
+ "%+]!%+Y!'L!\"'+M*#KU#%;U\"#;M\"\";E&%[A!(+=\"&[5!$[A!&;-'\"[=!#[%!%[!&"
+ "#ZU!\"ZY!$Z]!\"[!!#ZU!#ZQ!%ZU*%:A!%JI!%ZE\"#ZA%$*=\"#*9\"$J=%$J=%#J5!"
+ "#J)!\"Z5!\"Y]%!)]$$9]$&J!*#I]!&9M#!YU!#YM##YI\"$)E!%YE!%)E%%)),\"Y9\""
+ "\"I%!#X]#\"I%!\"I-!\"I%!\"IE$#)5#$)='!)=!#Y=##)1#$IE#\"YE\"%)I!\"IQ!$YQ#"
+ "\"IY!#I]!\"J!!#Z)\"#Z%\"#J%!#J-!$:1!#Z1\"\"Z9!#J=!#J=!$*E\"$JE!!*E($*M\""
+ "%*Q\"\"JY$![!!\"J]#%*]&$+%&#[)!*[)'#[1!&[5-#[5!&;E\"'[9!%+=\"%K=$&KA("
+ "$[I!%;M\"&+M%%;Y\"$;U\"(;E\"&,%%#K]#$[M%#,%%&,!%&\\9#%L1'%<5!'L9&$LA\""
+ "%L=\"%<A!%<A!(,U,%<Y!',I(#,Q!'<U-&,Y#&,M#'-)#$=-!$=%!%])\"%]-!%M-!"
+ "%=-*(M5)&-9\"*-A+%]1'$ME!%ME!%M9!%ME!&MQ$'-M'%ME!%]Q!#>%!%]Q!'M])"
+ "%^!!%]U!\"^!#$N1!'-]+$>)$'.-!'.1!&>1\"&.%!&^9%)^=!(.5$$^=!&.A!&.Q!"
+ "$^E!&.E!$^Q!&.Q!(^Q!'^I#&.A!(>M*$^M!'^E#+NY.\">U!'NM''>Q!(N]&(>U$"
+ "(>U%&.U&&.Y!'.]$(/)().I#(>Y*(^U'&.U!'>I!&.Q!(>U/&.Q!&.I!)^I!&.M!"
+ "&>I!$^A!*.M!#>=%&>I!&NM#$.A#*^E%'>9!(NA!'.=%&.9!(NA!&.=&&>-\"&N1$"
+ "(.1*#^-\"&.-!%]]!)>)*'^!)%^1!#>1!%]Q!%]Y!(-M!&]I!'-A!#=M!$MM!%M=!"
+ ",]E!']9+$MM!#M5\")-9!%M5!(]5$)--!'=-$&]-'%M)!%-9#%M)!&]!'%]%\"(LU%"
+ "'LU!&,U#$LM\"(<I)%<E!&<A%&<)%&<=!*<9)&,5$$,1!%,)!%K]##,%!%L-\"%,%!"
+ "([U-%[Y$&,!)'+Q!$KQ#$;I\"%KE'*;E'%[5!%KE$&[9!%+=\"\";1\"%[1)!;-)\"K)$"
+ "$;%#$K%$#[%!%+!\"$JU!#JQ$\"ZM!$*M\"'ZI##ZA!&*=+&Z9'#J=!#JA!&*5+%:=$"
+ "\"J-!#J-!#9U!$)]##J%!&)]($YY#%9Q%\"II$\"9A#$9I$#9=!%)I+\"IE!#9=$\"I=!"
+ "!(]!#9-!\"Y)\"\"I)!\"I-!\"9-#\")A\"\"IE!\"IA!\"IE!!9Q\"&9M\"$)Y#$9Q!$9Q$%YQ("
+ "#J!!\"J1!#Z!\"$J1!$IY\"#Z-\"%*-'\"*-\"#Z5!#ZA\"#J9!\"ZI!$*E\"#*I\"!Z](%*Y'"
+ "\"ZU$$JY!$+%\"$[)%\"*Y\"&+!'#+%\"&;)$#+1\"$[-$'[5&%;5\"&;='%KU#'+E&&[I!"
+ ")+I&%[M%%;U'&KU#&+Y!$;]\"%KU#%L)#%,!!%\\)#%,-!$,-!%<5!&,1%#<9\"'\\A\""
+ "&L=&$,9!%\\E#(,I-!,I!$LQ\"#\\U#&L]%',Y#&L]!$=%*&M%!%=%%%]-\"%M!!']%!"
+ "%]1!&==$(-1\"&-=\"&MA$#MA!%ME!'MI)%-Q#%ME!%]]!#=Q!$N!!)>%/%]]!*^%!"
+ "!-M!&.%!$N1!$^9&(>)!'>)'%^1!&.1!\"N1'(N9+$^9!(^1-(>5+&.A!'NE''.I%"
+ "&NE#&NI\"&^=$&.Q!&>Y!&>Y!&NQ\"*.Q'&^U)$^Y!'^]\"&^Y#'NM!'>=!&.U!'NY'"
+ "'NY!(^U!*.Y'&.U!&.Q!'^Y\"&.Y!%/!!+>U'!.U!'>E&&>Q!).U''.Q%&.E!$^M!"
+ "'>M!(^Q!&NI#(>M%'.Q%&.A!#^E\"&.A!$^5!)^Q&$^=!'>-&$^A!$N)!'>5!&^5%"
+ "&.5!%^1!).-$'.)%%^)!%^-!'N5(%^!!%-]#$MQ!'-Y!'-U!'-M&'-M!%ME!'-M'"
+ "%]A!%]I!&-M\"%MA!%M=!%M5&\"-1%&-=#%M-!'\\M'$=)!&<]$%M!!(,U#%<Y!(,U#"
+ "%<I!&LY!&\\E\"%LI!%<E!%,=%%<=!&L=!&<-%%L5\"&L5\"%L5\"&<E!%<!!&+]!%<!!"
+ "'+]!#+]!$[A!$K]#&;Q&&[M-\";I\"'[A!$[E!'+A&$[9!&+9\"$[1!$K)$$;1\"$+)!"
+ "#+)\"%[!)#[!!$*]\"$JY!%*M&#JE!%*U&#JM!$*Y&$JI!$:1$#J5!\"Z9!#Z5\"#*1\""
+ "$J-%$J-%#J-!!Z!!#YM#$)]#\"YY\"#)U##9U!&)](#9I#\"YE(\"I9!#IE\"!YA!!Y9$"
+ "!9!\"$I!&#))##)-&\")-\"#9-!#I9\"\")9\"#IA\"#Y=##IA\"&)I,$)I$$)Q$#9U!#9U$"
+ "#)Y\"$*!##J%!%:5!#Z)\"#J-!\"J1!$Z5\"$:9##Z9%$J=!\"Z=!#J=!#JI!&ZA##ZI!"
+ "#ZY!$ZU!$Z]%%*]*%*Y&$[%%%K-$$+)\"$+9!%K)$%[5$#[9!#;=\"#+=)%+M!#[E!"
+ "$KU#$,!!%+Y!%;Y\"%<%\"&;]\"&\\!(#L%#%L)#%<-!',-)'L1+#\\5#%L5\"'<9!%\\9#"
+ "%<I!$<I!%<I!(,I#'LY!'<U)&L]!%<Y!$<]!%M%!&]!\"%M%!$])#&-1#%]1\"&=)$"
+ "&-5#'M9)%M9!&]A!%M=!&-E,%ME!$MU!#=Q!)MU,&]E!&=U#(=Y!(=]!'^!))>!%"
+ "%^%!).1$'>)'%^-!&>!##N=!$^5!'>1&(.9*#NI!%N=$&.9!$^A!#N9!&>E!*NM4"
+ "&.A!&.Q!&.M!#^=\"$^Q!#NE!(^Q!)O%#$^Q!&^U#&.Y!'NY!'^Y\"&.Y!&.Y!*>]-"
+ "'_)(*.]!&.]!&.]!&?%!*?!(&.U!&?!!$^U!\"^Y#&.Y!*?!!&.U!&.]!&N]\"&.I&"
+ "&.]!&.Q!'>U!&.M!&.M!'>I&%.Q!'>A!&.I!&NI\"&>A!&.A!(NA!%^)!&.A!'N-\""
+ "#>-!$N%!%>-$&N-#%^%!&.5!%]]!%^!!$N!!']])%]Y!%]M!)-]%#=Q!%]]!&MY$"
+ "%-=($MI!$M9!&-A\"%]5\"&-A\"&-A#%M-!%]1\"'--#$]%\"%M%!'\\M\"%M)!$,Y$'L]%"
+ "%LU!&\\Q&%<Q!$\\M#%LI\"%LE\"%<=!&L=!%<M!%<9!&<5%&\\1#%\\%#'L5!&,!%%,%!"
+ "',!!$+Q!&[E(%+]!%+Q!#[I!)+M*(K9$&[A)%[=!$[I!%K=$'[5%$;=\"#+1\"$K1$"
+ "&K)!$K!$#[)!\"*]\"$+!&$*Y\"\"[!!$JU!$ZU)#JM$#ZQ!#JA!#J=!%:9%&*=(#Z%\""
+ "%J1&#*9%&*)(!*1$%:%($YY#$9Y$$)U##9Q!%9M%#9M!$Y='#YE#$YA&#)5##99$"
+ "\"I!\"$HQ'\"I=$#))#!I1&\"Y1\"!Y9$\"Y5\"#91!$)A$$)=$$9I%#II\"$IQ&%Z)'$Y]#"
+ "#9]'\"J!!%J!&#J)!#J5!$:%!#J5!$J9!#J9!#JE!$ZE&#:Q#$JE$#JE!!ZM!'*Q/"
+ "!*U!%JY!%*Q\"&K%!%+%\"#[!!$+)\"$+-!$K5#!+%!&;=\"$[=!&[I,$[A!&+E%%KI#"
+ "%+M!&;E&%;U\"$+U!%KY#%K]#%,%!$<)!$\\)#&\\5(&\\1(&L)#$,5!&\\1(&,I$'\\A,"
+ "%LE!(<M.&,I$%<U!&,Y#%<U!&L]&)--!'L]!%\\U#%M%!%M-!&M9*$]1\"']1*&M)%"
+ "$MA!'ME$$]9\"%MA!&ME$'-I!#MQ!&]M!'=Q\"&=I#%]U!%.%\"(>!!%]]!%^-!%]]!"
+ "(>!!$>)%%N5%'^-)'>1&!.9!$N1!'>9&(.=$&.I!&.=!%^A&&.I!&.E!&.E!&.E!"
+ "(NM,'>=&&NQ\"(>A+&?!!)^U,&.U!&?1!*^Y$$.Q#-_-+$^]!&?!!&.]!&.]!&.]!"
+ "&?!!$_!!'O-!&^Y#&?-!(_%!'O-!&?!!'^]'%^]%$_!!%N]$*.]!&.Y!&?!!&.Y!"
+ "(^U!$^U!(^Y!'NQ'*NQ##.Q)*.M!&.I&(.E)*NA0&.I!&.=!$^9!(^-\"%^1!&^9%"
+ "&.=!&.9!#N9!$N1!%.9\"+^)+%^)!&.%!%^!!&N-)'.!%&=]#$MQ!&-]!(-U!&=E$"
+ "'-A'%]I!(]A$%MA!&-=\"#=-!&-E\"$]9'']1*#=A!%]-\"%-1$#M%\"%<U!&--#&<Q%"
+ "'\\Q+'\\]&%<Q!#\\M#%<A!&<A&%LE\"$LA\"&LE&#L=#%,1!(,5(&,1$$L%#\"\\)$%+Q!"
+ "#[Y$'\\%,#<!\"&+M!$,!!\"[Q%$+Q!)+M!&[=)'[A%$+1\"%+=\"&+=\"!+5!$;1\"%;1\""
+ "#[1!#[)!#K1'#ZU!%*U&$Z]%#ZU!#ZQ!#JM!$:M$\"ZE!$:Q#%:5(#Z=!%:)!%JM)"
+ "#J9!#:-&#J)!#Z%\"$:!$$YY'$IM&%9Y)$9U!\")Q\"&IQ.#9=!#IQ!$9M$#9A!#I=%"
+ "$)%$$)!!\"I)!#)1#$)%!!)1'#I=%#Y9&$IA%$IE##Y9#\"IE!%IM#$YY#$9I$&9Q'"
+ "\"Y]$#)]\"$Y]'#J-!%JA)#J1$$Z5&$:1!#ZA\"%JA)!*M!%*E+'ZM+$JM!$JE%$*M\""
+ "#ZQ!#Z]!\"K!$&+)\"&ZY\"$K)$\"*Y\"#[5!#[1!$[)!%K=#%+5\"%[M)%+Q!%;I\"%;A\""
+ "$+M!$;I\"([M)$+Y!%K]#&;].%,%!&,%!&\\5($+]!#<5%%<9!%\\5#%<=!%<A!%,9)"
+ "%<=!%LI\"%<I!&<E!#,Q!%<U!'<Y)%LQ!&=-$\"-%!%M-!%M)!%]-!%M-!%M5!%M1!"
+ "%]5\"%==$$M=+&-E\"%]]!$M=!\"-U!'-Y!&MQ$&.!!'MY#%]]!%M]%%>!$'.1!&N-$"
+ "%^%!#^!\"&.5!$N1!)>5*&>E\"&.A!&.=!%^1!'.=%$^M!&NA#).I\"&.M!&.U!)^M1"
+ "'>Q+'>Q&(.U)&.M!&.Q!$_%!&>]!&.Y!&N]\"&.Y!'O!!&_!)&?!!(_!!&?-!#O1!"
+ "'_)(&O!\"'N]!'?%%&_9\"&O%\"&?!!&.]!&_!#%O!#$.Y#'/!*%_%$&.Q!'N]!&.]!"
+ ").]-+NU'*.U!&.Y&&.Y!%>Q#$^Y!&_!#'NI!'>I!&NI\")NA%&.E!'^)*(.A$(.=$"
+ "&.9!&N-#'>9!&^1%%^)!#>-!&>)\"\">!!%^)!%]]!%]]!%.!\"%]Y!(-U%(=Y!%]]!"
+ "%ME!%]I!+M5'%M9!#M9!(==\"&-5#%M5!&-9\"%]I!&]=!%M%!,M=&'LM!(]!!&\\]&"
+ "&<Y$%\\U\"%<E!$\\I'$<M!#,M!',I(&\\E\"$LA\"'L9\"%\\=#\",5!&,5%%<1!!L!#&\\%("
+ "(<%!%,!!$+Y!%+Y!#KU#%+Q!!;I\"$[I!%+M!([A*%KA#%+M!$[-!%[5!%;1'\"Z]$"
+ "$+-\"$JY!%;)#$;!#!*]!%Z]%%*U'$*U\"\"ZY!'*M$$*=##JE!$*A\"%:=(\"J9$#J1!"
+ "#J1!$J-%\"*1\"$:)!'*%-$Z!\"$:!$&Y],$)U#$)Q$$9M!%)I$#9I#$9A$$YE#$)A#"
+ "&)1#\"Y%#\"Y-\"\"I5!!Y9!\"I1!\"II!!9A\"#YA##YE#!YU!!YM!$)Q#&)Q%#)M#&IY'"
+ "#Z!\"$9Y!#J%$$*%##J5!$:!!\"ZE!#Z5\"$Z9\"#ZA!&:9!#ZI\"$:I$#ZI\"$ZM\"!:Q\""
+ "#*]!#ZU!#Z]!%*]\"$;%\"$+!\"#[1$%K9$$[5!%K9$#[9!%K=($[I!\";A\"%+U!$;M#"
+ "$+U!%[M$%,%!#;Y\"';M#%+]!#\\!$%\\)$%,%!'<9*\",=!%<5!%L5#&<1!(LA!&\\M'"
+ "$,A%&,M(%LM\"%\\Q#$\\U#%<]!%\\]\"'L]!%<]!%M!!$]-\"$M-!']-!&M1%&]1&&M9$"
+ "%M5!(]9.%ME!%M=!$MI!'-]&%]U!'-U!%]Q!#]M\"(=Y!*MY!'.!%&.)!%^!!#N%&"
+ "'.%!%^-!%^-!&^5%&.=!'>9!'^=(+NE4$.I#&.E&'^M\"'^=(!>I''>M&#^Q\"'NY!"
+ "&.Y!&.]!$_!!&.Y!&.]!'^U(&^Y#&NU\"'O!'!/!!&.]!&?!!%/-!(_)!&?%!*>Y3"
+ "&?%!&?%!$_)!'O)!*_%#%_%%&?)!'/)$&/9%&?)!'O1!'O)!&?!!&O!\"&?!!&^]#"
+ "%/-!&.]!'>Q!&.Q!'NY!*.U!*^M**.M2)?!('NE!#NE!&.I!$^A!'^E\"#NA!&N=#"
+ ")>=/'.=&$^9!'.!!#>1!%>-$'>-!&N%$$N)!%^-!$^%!%^!!%]Y!%]M!%]Q!%]Q!"
+ "'MM.%]M!&-I\"#=E!&]A%%M9!&-=\"$]9\"&-A\"(=1#\"M-#(])&&=9$%M%!'\\Y!%M%!"
+ "%\\]\"$L]\"%LQ!&LM&%,]#%<M!$<M!$\\E#%<A%$<E!&L1'%<5!%<%\"%,%!%\\%#$,!%"
+ "%,%!%+Y!(;U+%;M\"&+Y%%KY'#;Q\"$KI#%+I%%+M!&K=(&KU'#[9!&[9!&+)+%;1\""
+ "'+)'$+)!%;%#$;!\"#Z]($+!\"!*Y!$*U\"\"ZM%\"JQ##JI!%:E$#ZA\"$*A\"'*9$%:5%"
+ "#J9!\":-\"#J5!$J1%#J1!%*!$$:-'$9Y$$9U!$9]!$9Y!%9Q\"#YQ%#IE$$)I#\"IA!"
+ "#I%#\"9-##)-#%I)!$Y5'!Y9!%9A,#9E!#YI#$9E!$)E#!Y=!%YQ$$YU'$9I%$)Y#"
+ "!Y]!\"YY\"#*%\"#9U!$J)%%:-!#JA!#J-!&ZM+#:9#\"ZA!#ZA\"#ZE\"#ZE\"\"JQ$#JM!"
+ "#ZQ!![5!#[!!%+!*$[%%'[)&#[)!$+1\"%+5\"$K9#!;=&&[=!%;5#$;M\"&KI($;I\""
+ "$KU#(;U\"%+M!%+]%%KU#%+]!%<%\"$,)!%L-\"$,5!$,5!%<=!%L9\"%<E!\"<=\"#LE\""
+ "%<Q!%<M!%<Q!%]%\"(LU%%<Y!&\\U\"%M!!%M)!&M!%&])&%M)!(-A!&-9\"&]1!&-%$"
+ "&-=\"%]A!$=A$'-A\"&MI$(]M$%]M!$MU!(M]-&]I*'=M#'>!!'=U''^%)'.%!%^%!"
+ "%^-!'>)'%^-!(^)(&.)'&.=!&.5!\"N5\"\">I!$^A!$^I!$^E!&>A')NY$&.Q!+NU!"
+ "\">U!)>Y)%^A&).U-(_%!&.]!'/5$&.Q!$_%!&?)!&?%!&O-!&?!!#O-!&?)!$_)!"
+ "(_%!&_)#&?-!#O!!&?)!&?)!&?%!(/A!*?)!'O),(_)!(>Y*'_%((^U!#O%!+>Q!"
+ "(O!%(_%!%?%\"&.]!&.]!&?!!'.M%&>U!$^U!'NM'\">M!*NM)'>I!(^Q!&.E!-NA&"
+ "%>=(&.A!&.9!%N5%&>5\"%^1!$>-$%^)!%^-!'.!!#>)!,>!)&=]#$]Y!&=E#$MM!"
+ "(=Y&&=U#\"MU\"#=I!'-I&&]=!&-A\"(]A$%]5!%M5!%]5\"(--'&=)$\"-%!(LQ!%]!\""
+ "&LY!&<Y$%\\U#'\\U\"#,Q!%<M!(LI%%<E!(\\=(%,1!&<E!'<5!%L5\"%L1\"%<%!$,)!"
+ "'\\%,&KY##,!!%L%#(+Q!%+Y!$+Y!%[Q)%[E$$[E!$[A!&+=!%;-\"#[9!#[5!&[=%"
+ "#+-\"\"[)!%K)$%[)!&+!&$Z]%$K!$#*U\"#ZQ!![!!#ZM%\"*U\"!ZE!#ZE%#J=!!*9!"
+ "\"J5#(:1'\"Z%$#Z)\"%J)\"\"Z!!%9]%$:)!#)Y#$)Q'&IY.%9M\"#YE\"#IA!$)A$#Y5#"
+ "%9)&#))#\"Y-\"\"I!!\"Y=\"\"I9!#99$$)=$#9A!$)Q$$IQ%$IE&#IQ!#YQ\"#9Y#\"I]!"
+ "$:1$(:%.#J)!%Z1#\"*1\"#J%!#J1!%Z=##*=\"$*9#$:E#$JQ!#ZU!%JQ%$*M\"$ZQ!"
+ "%:Q$#ZU!#[!!![!!#[)!#[-!$+%\"#[9!$[5!%+9!%+=\"%;I\"%;E\"&[I$#;M##KM#"
+ "(;U&&K]+&[Y$%,!!&+U%',)%&,)%%,)!#,-!',1%)\\%-&<9!%<9!%<=!&,E#&,E("
+ "$LM\"%<M!&=)$&M%!'<U)&<Y$',Q(%M1&%]%\"'-1'$]5'&]5!(=5\"%]5\"$])#(==\""
+ "$]A\"%]I!'-Q&$M=!$MM!']M)\"-Y!&-U!%]U!(-Y%(N!!$MU!%^-!'.-!$N1!$N-!"
+ "&^1%)^5,&.5!&.9!&.=!\"^=(#N9!$^E&'>5&&.Q!&.Y!&.M!&.Q!+>A'$^Q!&.U!"
+ "(^Y!)^U,'>U!&?)!'N]'#N]!(_%!$_)!&NU\"&.]!'O)'&?%!&?5!&?1!'/9$%/5!"
+ "&_-#$^]!%/5!'_A''O-!&?1!'/1$'/5$*_1)+O-!&?-!%/-!'O)!&?)!)?5\")?%("
+ "$O!%*O!/&?%!&.]!'O!!%/!!$^Y!'>U!'.Y$'NY!(^Q!&.M!$^M!&>1\"&.E!+>M!"
+ "&>A\"&.9!&.9!&>=\"&.5!&.-!&.9!&N-)(.1*'.-!&>%\"&]]%%]Y!%]]!'>!')^!("
+ "(-M!%]Q!$]M!%]I!\"-E!#MA!'-1'%M=!%M9!%=-$&=1$(=1('=!)%]%\"%M%!'=%("
+ "']!!%LU!%M!!*<A-%LU!&,I#'<I)%<A!%<U!*<=)'L-\"&<E*%<5!&\\-(%,!!%L)\""
+ "%L)\"$,%%$,)!&<!&%KU#%,!!&[Q-$+M!%[Q%';I+%;E\"$[5!%KA#\"[5!%[5!&+1&"
+ "\"[)!%K9(%K-(![)!#[!!#;!\"'*Y'#ZU!$ZQ\"$:E'#J=!#ZI\"$J9!$*E\"#ZE\"\"Z=!"
+ "%:1$#:9'#J-!%J)&#Z%\"$:%$$*!#$I]\"%)Y!#IU$$9Q$#9A!#9I!$9A%#I=%$)=!"
+ "'(U)$Y)%$))'#)9##)E#\"99##9=$$)=$#YA#$II\"%9=)&)U,%9Y&&)U%!)Q!$I]%"
+ "\"Z-!&:%)\"J%'#J%!$:)$!Z1!\"Z9!$Z9&#J9!':I)$:E#$JA%%*M'%JQ!$ZY%\"Z]!"
+ "#Z]!#ZY!%+)\"%K!!\"[-!%+1&#[5!\"[5!)+5+$[E!%KA$%[A%'[A!'+E\"%;M'%+U!"
+ "$;Y\"%,%!%,%!%+]!#,!!&,!%(,%.&<-!&<-%$KY#%<5!&\\5#$,A!%LA\"%LA\"#\\Y#"
+ "%\\U\"%LI+!\\A$\"<U\"%<U!%LM!'M!*%M%!&,Y,#=)!%M1!&-A\"$M5!#M1'%]='%M9!"
+ "%M=!%]A!&]M!'=M(%]M!'-U&%]Q!'-Y!&-Y'&-Y!%^-!'^%$%^)!$^5!%^)!%>1#"
+ "&.5!&N5#&.9!'.I/&.A!&.=!%.I!&.E!%NI$#^M!&.E!'NU!&.Y!&^A$&.Y!#>Y%"
+ "'N]''^]!&.M!%O%#&?%!$O5$%/-!&?)!(_!!%/-!)/5-%/-!&?1!'O)!#O1!&?1!"
+ "$?1#*_-)&?-!&_1#(?))'_1!&O-\"*?1'&?!!*?5''O1!&?9!(O9$&?%!'?)%&?)!"
+ "'/)$#NY!&?5!&?!!&.U!,/)/'O%!'/!$&.Y!&.Q!&.M!(NQ&&.M!'O!!(.E)&^E)"
+ "&.=!&.A!&N=#&.=!'^5#&.5!(^1-%^1!$.-#$N)!&MU$&]]%%.!\")M]!%]]!(=],"
+ "#=Q!%MQ$%]Q!\"-Q!%ME!%MA!%ME!$M=!%M9!&-=\"%]=!$]=\"%]5!#=)!'])+#]%#"
+ "&M!%(]%!)\\Y!&LQ!%LM\"%\\Q\"$<E!%\\I#&LE&',A(&\\E(%\\9#&<A%&\\5#%<9!%,-!"
+ "%,-!'+]!&L!#%,!!%+Y!%+Y!&+U!&[Q)$;M\"%[E!(+=&'K=$'+=\"$[1!'[9!%+1*"
+ "$+9\"#[1!\"[)!#[%!%+!&%:A!#ZQ!$:Y#\"*]!&ZM##ZI%#ZQ!\"Z9!#JI!%:5!#J9$"
+ "!Z5!#J%!#J1!$J9%\"J)!#J!!$:)$$)]#\"IY!&)]$#YM#\"YM!!YI!$)A!#I9\"\"9I#"
+ "$H]&#I%%\"I-!!Y-!#)5#!)9!#)=&#9A!#YE)\"YA\"%)E'#)Q&$IQ%#9U!$Z!&#I]!"
+ "\"*!\"&:%&#J%!%J5)!Z=!%:5!%Z9*$:M#'*=%#J9!#ZA!%*I\"%*Y'$*Q\"#ZQ!$*]\""
+ "$ZY)\"*]!$[%!![!(\"[)!$+-!$+9%%[5$$[5!$;M\"%+=!%K1$$[E!&;I\"$;E\"!+]%"
+ "\"+U!%+M!(+]!#+]%%L%#&<%&$L1#)L-!#,%!'L5\"%<A!&<=&%<=!%<A!&\\A(%LE\""
+ "%<M!&<U$%<U!'<Q)$,Y)',](&<]$',]'%])\"*==&%M1!%M5!(=M,#M-\"&]=&'=I#"
+ "%]E&%ME!%]U!%]A!%M9!%]U!%]U!'.%%%^!!$N!!&-]\"&>%\"'.%&'N-('>1''.1!"
+ "%^)!)^9&&>9\"\">=!'>=!'>E!&.E!#^5\"&^Q#\">Y!'.Y%#NM!->Y*'^Y\"#NY!&.U!"
+ "$_%!&?!!%/5!&?1!#O)!&?)!&.Y!&/)&'_-(&?-!)/1!(?1$&_5\")/1!(/=\"(O5*"
+ "&O%\"&?A+%/1'%/5!&?9!&?5!)?5(&O)\"&?5!&?A!&?5!&?9!&?9!#O)!&?)!)/-!"
+ "&?)!)/)''/!$&?-!'NY!(_%!&?!!)/!-'>Q!$^Y&&.M!&?!!&.U!).A#'NM'(NI!"
+ "&.A!&.I!%N=$+>9((N5!'.A%&.5!%.-\"'.1%%^-!&>%#&=Y#%^%!*^!''-]!%]I!"
+ "%]Q!'>%'&-Q\"$MM!%]M!&M5%$=9!%]I!&-9\"&-E\"'=5(&-)#&-A\"%M5!&]5!%]-\""
+ "&-%#']%&%<Y!!,Y!),Q#$LY\"%LM\"&LY!'\\M\"*<%+&L9'&,I$%<9!&L)'$,-!&,-$"
+ "&,)!#L!#',!!%,!!&[])%;]\"&+Y%$[Q$%;I&%[M%%+E!%[=%&;A&&+=&&K=($;5\""
+ "%[!&#[)!%;)'#[%!$;!\"&;-$#Z]!\"ZU!$K!$!ZM!#ZU!$JI$&*U\"#JA!&J=*\"Z9!"
+ "$*1\"#JM!#Z5\"#J1!$J1%%9])%J!#\"YQ\"%J%*$Z)&$)Q#%)Q$$9U!$)A'#9E!%)A'"
+ "\"I%!\"Y%#!)-!\"I1!$9E!!Y9!$9A($IA%#Y1#$IE%\"YE\"\"YQ!$9U$$)Y##9U!$)]#"
+ "#J)!\"Z%\"$:-$%:-)%*)##J9!#ZA\"$*A\"$*A#$ZA\"#ZE\"%:I$%JM)%ZU!%:U##ZY!"
+ "(J]&![!$$[)!!+)!#[%!#[9!%;1\"%[1!%K%!$[=!$;E\"%KE#%;Q\"!;Y&#[I!%;M'"
+ "$+Q!%;Y\"%+Y!%+]!$\\)#$<)&%L)#$<%\"%L-\"#<5\"%,1!%,-!$<A!#,E!%<M&&<M%"
+ "(LU/&<M!%<Q!\"<Y!%M!!'-!('-!'%<Q!$])\"&M)!,-9$%M-!(]9$%]9''M=$&]A!"
+ "%]I!$ME!$MI!&-M\"\"-Q%%]U!#=Y!*-])%]Y!%^)!$N%!(>%&$^1!$N%!%^1!\">5!"
+ "\"N)\"&.5!&>9\"&.A!&.I!$^E!&.Q!&.Q!&.I!'NY!$^U!&^U$(^U!(^Y!(_)!&.]!"
+ "#NU!&N]\"&.]!&O1!%/5!&?-!*/!!&?=!%?1\"%/1!'O9&%_9*&?1!*?9!&?9!%/-!"
+ "&O1!%/=!)O9\"'/-$&O5!'_5'&_9\"&?E!&_M\"#OA!&_5#&?-!,_5&&?!!'O1!)_A*"
+ "&?5!(_-+'O)!&?)!%O)#'?-%&?!!%_!$\">]!&?)!&.Y!#NU!'>U!&.M!'>I&&.M!"
+ "&.I!'.E+&.A!&.A!&.9!&.A!$N1!#N=!'.1!%^-!'^))'.)!\"-Q!&>%#%]]!&.!!"
+ "$MU!\".%!'-A\"%]Q!%-M#']=%'-E''=A(%M=!&-9\"$]1\"%M5!(])/+M%3%M%!%]!\""
+ ")=='%]!\"\",M!%\\E##\\U#$\\E#%<M!&L]&%LI\"&LE!%<A!&\\A#%<9!$L=\"'L5&%L-\""
+ "&<A%%,)!&L1\"&+]%%L1\"&;U\"(+Y!';]!$+Q!%KI'$[I!'+=*%;A\"%;M\"%K1,%;5\""
+ "&+1&&+-.\"K)##+5!!:U\"%JY$#[!!%;!$#ZQ!&JM!%:M$#JI!\"Z=$$:M#$JQ!$*=#"
+ "#ZI\"&ZI\"#Z1&$:1'\"J1!#J)!$:!!#I]!$)Q##YY\"#Z!\"$)I##*!##9E!$9A%#9A!"
+ "#Y-#\"))\"\"91#\"I9!!YE!#Y9&#I5\"$95%$II#\")A\"#YU\"#:-&%YM(#)Y)\"I]!#Z)\""
+ "#J!!%*%##J5!#J-!$J-%\"Z9!$:=#$JM!#JA!&:=(&*M'&ZE'#*I\"$*M\"$:U$$[)!"
+ "$Z]%#:Q#%+%&#[-!#;-\"%;5#!;1\"#;9\"$[=!$+1\"$[I!%[E$#[A!$+Q!%KE'$<%!"
+ "$+U%&KU#&,!!)<!!\",)!&<)!%K]#&,!%&L-'&LI&%<9%(,I,'<A*(\\Q!),A(%<M!"
+ "%<Q!*,Q'%<E!),]\"%<M!(-!-%M!!#=9!)-9!%=-)'-1'&==(&]=!&-A\"*MI'&-I("
+ "%MA!&ME$&MQ$(-M+'-M'%^-!$MY!&-]!&.=!'-M&'.)!%^-!%^)!(.5*&.5!&.9!"
+ "$N-!&N5#&.I!&.=!$^9!'.I%%.M!&.Y!&.U!'>U!#NU!(>]$$_%!'?!%'.]/#O%!"
+ "&?-!&?)!&O)!#O1!\"?9!&?=!&O1(&?1!'?=%&_5\"&O=')/E!&?5!&?5!(/M!&?=!"
+ "%/=!&?A!'?=%&O=!'O=&&?=!&?9!)/A,&?=!)?=(%/9!&?9!&_9)(OA+'/1$&?)!"
+ "&?1!&?=!)/-!#O-!(?))%/-!$/%-&?%!&.U!#O)!#O!!(^]!&.I!'.Q*(.Q$&.U!"
+ "&.I!&.I!&>E!'.-%&.=!&.9!(N9!%^-!'NA!$>5)*N)%%]Y!'.-!(>%!)M]!%^!!"
+ "'MY#$]]&%]U!&=Q#%]M!$=E$\"-I!#=A!%]A!%M=!+M=!%]I!(-1+'-)\"'])+'--'"
+ "%]-!%M!&\"<]\"',Q#$\\I#'<=!$\\I#%LQ!\",I!%LI\"%\\A#%L=\"$,=!&<1!%L5'&LA\""
+ "%,!!%\\)##<1\"#+Y!&+]!'+Y!&L!'%[E!$[E!%+]%%;E\"%[E$'KE($[=!$[5!&[M-"
+ "#[1!%;5\"%+%\"$;5\"%[%%%;!$#[%!#[!!$:Q$#JI!\"JM##ZA\"%ZI*\"ZE!%*=&$JE("
+ "\"Z9!$J9!$J5!#J%!$*!##J1!%I]\"#J!!%:%(#)M#%9]%#9Q!$9M%#YM##IE\"#I=!"
+ "%I)(\"Y1\"%I5*%)-%&9A*$Y=#\"II!%IA##9A!#II!#YI#%9U%$)Y##IY!$:-#$IU\""
+ "$:5$#J-!$J1%#Z)\"#J-!#J%!\"Z9!#Z=\"\"ZA!%ZQ&%*Q'$ZM\"$:I$'ZU\"!:A\"#[!!"
+ "\"Z]!#[!!#[%!#[%!![9!$+=!$+5!%[9!&+M%%+A%&;A&![I!$[I!'+M!$K]#';U+"
+ "%KM#&+]!&\\%#$,%!%<9!$<)\"',5-%\\9#%LM\"'<5*&LA\"%\\A##,5!$LA\"$LA\"&\\Q&"
+ "%<E!&\\Y&%\\U##,]!&,]#%<Y!%<]!'-1\"(=1(%]5\"&M5$%M-!(=9,$MA&%M9!%]M!"
+ "%]I!%]Q!%]Q!%ME!'-U!%]Y!%^!!%^)!&]Y%'>)'%^%!%^!!%^1!\">-!(>%!\".1!"
+ "&^9$&.I!&NE#%^I%'>E&&.M!&>M!$^Q!%>]\"%>U((.Y)'O!!&.U!&.]!&?)!&?-!"
+ "&?-!#O)!&?)!$_!!)/%!)/E!&?5!%/9!#O=!&?9!&?E!&?=!&_E\"&?=!%/E!&_M("
+ "&_A\"&OE!'_A!'/U#&?5!'?E$(O9$)_A#&?9!&?A!&_A\"&?=!)?-.&?9!&?=!&?5!"
+ "&_%#'?5%&?1!(/1)&?1!'O)!&?)!&O%\"$.Y##/1$&.]!'>E!$^Y!&.U!)NU/\">]!"
+ "*.M!&.Q!&.I!&^I$&.M!(.A*(^-.&.A!'N5'&.=!&>%(&.-!\".%!%^!!&-]\")]]("
+ "$MY!']Y%&-U\"'-U!']M*%]I!&-I\"%ME!%ME!$]-\"%M=!#=5!%]5\"'M-.%]1\"&M%!"
+ "%]!\"'-!'%L]!%M%!'M!*$<U!&LQ&'\\I\"'\\I\"&<I!%<A!\",A!#,=!$\\A#%<=!%L5\""
+ "',-$%<%&%,%!&;Q/#,%!(;]\"&L!'%;]\"&KQ+$;M\"%+U!$;E*&[A$$[9!$+=&%+E!"
+ "$+1\"%+1\"#[9!%;)#%K)$#+!\"#ZY!#ZI\"%JQ)#ZU!$*A\"#ZI!#Z9\"#JE!!ZA!\"*E!"
+ "!*=!#J=!$:5$$:%$&J-&\"J-!#J%$$*!#$)]##)Y\"#YQ##IU!#9E!$)I#$IE&$I=\""
+ "!Y)!\"Y-\"#Y=&#)%)#Y9#!)=!&99*#IE%%)A'$9E\"%)Y!#J!!$)U#%)U$$J)\"#J!!"
+ "#IU\"#:)#$J1\"':1\"&:5!&:=,$*5\"$JA!\"ZA!#JE!%ZQ*$*M\"$*M\"$*E\"#ZY!#*U\""
+ "#*Y\"#ZU!#[%!%+%\"';5(#[5!$[5%%[=!&[=!$[5!&[I!%;E\"%+E!$KM#$+Q!%+U!"
+ "%+]!&+M&&\\%($<%\"%<!!%L)\"%L1\"#,1%%L-\"%L-\"%L9\"&L=!%,1!%LI!%\\M#%<M!"
+ "&<M!$<U&'=!$%<Y!&M%&%M)!'])&%\\Y#&-A\"']9+'=5#%=M$&-=#(M=)%MA!&-E\""
+ "%ME!!-E&%^!!%]U!%]M!&]U%!-]!%]]!%=Y)(=Y!%^-!'>A!'.)&&.5!$^9!&.9!"
+ "&.9!(^A!)^E!&.I!&.U!&.A!&^U#'.Y$#^I\"&?!!'NY!'.]%%/-!&?)!'O%''O)!"
+ "'O-!(_)!&?-!)?1))?5!'_9!&?E!)?I!&?=!#O1!&/E%'/A##OA!)?E'*OA!*_U("
+ "&OI')_A*'_E!)/9!#OA!(/A!+_E!'_I!)/A!*O=!'_A!&_=\"%/=!&?=!&?-!'/9$"
+ "#O9!'?5*%?5\",_1&&_1)'>Y&'/-$&O-!&.Y!&?)!$_%!'>]&$^M!$^]!&.U!+.Q,"
+ "&.U!(NI!)^I&&.Y!&.E!(.A)&.9!&.9!'>1&'N%\"%^1!$N)!%N-%'.%!\".1!'.!!"
+ "&=M$%^-!&]Q%'-]!%]U!#=E!(-M%&=E#$ME!)MA-(=I,%M9!'=9('=1-$=-!']5!"
+ "%-=#%M)!'-!(%<]!&LY&$<U!%\\Q\"%,U)$LM\"&\\U\"$<I!%LA\"%<=!&L9&#<!\"&,1%"
+ "&<1!$\\-(&L)'#<%\"&+]%%+Y!%[Y$%+U!#[E!%[E!#+9!#[I!%[=!%;=&%;=\"(+9\""
+ "&[5%$[9$#[-!$;=\"#[%!#[-!%K!!\"+!\"%JQ$&[%!%JY)$ZA&$*M\"#ZI\"#ZE\"$J5!"
+ "#J9!#*1\"#J=!$:1!#J5%!Z)!%IY&\"YQ\"%9],%:)%%IU\"$)Y#%9A\"\"II!$Y1'\"9E#"
+ "\"I-!#Y=&#)9#!Y9!$Y9'#YE#&YQ!#YE\"#95!#)I##)Q#!)Q$&9U-$IE%$*!&#Z%\""
+ "$:%$$J9%\"*%\"#*=\"$J5!#J9!$J=%!ZA!#JA!\"ZI!$:I'%JE!#ZQ!#[!!#ZU!$*Y&"
+ "&+!&#[%!#[)!&+5&%K%!$[1($[=!$+9\"%+5\"%KE#%KI#%;E\"&+M*!KU#&KQ#\";I\""
+ "%+U%%+]!&\\!(%,!!&,)!&L-\"&,1%%<9!&L5&&<9!$,=!&<=!&\\E,%LI\"%<M!+\\Y*"
+ "'<])*,U,%<I!%=%%$=!!&M%%%M1!#]!$&-1#(]9$$=1!(M5.)M9-\"-1!%]A&(=I!"
+ "#MM!%]Q!!=Y'*MU!&-Y!'-Y!%^!!(.%%'.)!$N-!%>-$&N=#'N5').5/*^A%(>5+"
+ "(^A-(^E-$>1*&.=!&^M$#^E\"&.Q!(NU&(N]+&NY'\"NU!*_!#&.]!&?-!&_)#&?-!"
+ "(_1,&O1!&?-!&?=!&?=!&O9!&?=+%?A!%/=!&?E!'_A!*_Y!'_A!*O=!*_E(&OI!"
+ "&_I\"+_=!'?I$&?E!%/]!&OI!'_I!&OU!)/E!&?A!*OE!'_E!-?I!#O=!'_A!'_A!"
+ "#O=!&O-\"&OQ!&/Q$)/5!&?=!&?)!&?E!%/)!%/%!$_!!&.]!&.]!&?%!(/)('>U!"
+ "(^Q!'_!(*>U\"&.M!&>E!)^E!(>A&'.5&'>=&'.I*(N5,&.5!%^%!$>)*%^)!'^%)"
+ "\".!!'.!!%^!!\"-U!&]M!%]Q!&=Q(#=I!$=9!%MA!$M=!$]9\"'-9\"%]M!$]1\"']-!"
+ "%M%!'M)$*-!!$L]\"&,Y(%-%$%\\U\"%\\Y\"%LM\"&<I%&\\I\"%\\A#$L=\"&<A%&LA&#L1#"
+ "%\\%#$,)!$<1%$,)!\"KY#&KI#&[I!%+U!$+Q!#+Q!&+M)&;I\"&;E\"&[I!%KQ#(;9#"
+ "%+5&$+1\"$+-!$;)#%+!\"!+-!$;%'\";!*$*Y\"#ZU!\"JQ$'*Q,!Z=!&:9%#JA!%:5$"
+ "#JI!$:1##*5\"!*1$#J-!!*5$$*%#$9]$#9U!$9Y$&)]!#9A!#91!#YA\"%YM+#9A!"
+ "!Y1!!)1!\"I-!&Y)&#Y9##IE$()=(%9=##)M&&YU!$9Q$#)U##J!!%)Y$$*%#$J9!"
+ "#YY\"#J1$$J-%#Z-\"%*1##J%!%J5)%*9&%JE!#J9!%*E\"#ZQ!$*Q\"#ZU!$:Y*%+)\""
+ "$JQ!#[!!#[-!$[1!%+1&#[I!(+5'&+5\"&+=**;=(%[I!$KE#&KU+)+M&)[I!$;Y&"
+ "&+Y!$+]!%;]!%,!!%,-!&,1%$,A!',1)%<5!%<A!&,=$#LE\"%LE\"',I)$L=\"&<M!"
+ "&LM&',Y#&,]#%]-\"']!!$M%!'-!'&M-!%M5!'M5)'-%-%M=!&-=\"\"M1\"$ME!(]I."
+ "%]I!%]M!\".!!(]M$(M]')MI(%]Y!&N)#(>!!&N5#%^-!%^)!#N=!$^E!&.A!&.I&"
+ "(NE&'^A('NM''^Y('^U(&.Q!(NA,'N]!&?-!'O!!&?1!&?-!&?1!&N]\"&_%#)/=!"
+ "&?5!!O9#$_%!&?9!%/9!)/5!&?=!%/Q!*OA!*/E%*/E+*OM!,_E+#OE!&OI!%O=#"
+ "&OM!'_Q!&OM!'_M'(_E+(/Q!&_=\"'OM%\"?E!'/M#&?E!'_I!)/9!)/E!'_I!'_I&"
+ "&_I\")/=,(?9)&_9\"\"OE!'_5'&O)!(/=(&?-!'_!!)O%#$_%!$_!&&N]\"&>]!&.U!"
+ "'NY!&.Q!&.M!$>Q$&.M!(NM!%^1!%^-!%^%!&N9#&>-\"'N1('^-#%^5&).-$%^!!"
+ "'-U!&]]%$MY!'=Y((=Y!%]U!!-I!%]I!!-E!'=U\"&]=!!]A$']5!%M5!'-%#\"--!"
+ "(])&&-%$%M!!&\\]&&-!($<Y!&LU!&<M!&,U#&<5%#<E!&,A(%\\=('<=!&<9!'<5!"
+ "#,5!$,)!(L1\"%<%\"%L%#%<%\"$[I!%+Q!%+U!$KQ#$;M#%[I!&KQ#%;1\"*K9%&+I&"
+ "#[9!![9!$[=,%K)$&;-'&:]+$[!!\"+!\"%*A&%*Q\"%JQ!\"*E\"#JE!%*E'$JE$#ZA%"
+ "$ZE%#J5%$:1!#Z-\"#J%!$:)!%*)'$:9$%:!$%I]\"#Z1\"#9M!%9M%$9M%%)I!&YE/"
+ "#I-%#Y)#&)A(#)-##)9#\"I=$\"99##)E#%IM&&)U($)=$$9U($IY\"#IY!#Z5!'Z!("
+ "#I]!#J-!!Z)!$:1!$:=#':1&#Z=\"$*A\"#JE!!ZI$&:Q,#ZM!$*I&#ZQ!$*]\"#Z]!"
+ "&K-)&+%\"%+)&\"ZU!#[E!$;)&$[9!%;1#&;=&%+U!%;I\"&KU#$KQ#'+Q!&[U($+U%"
+ "&,!!$,-!%,!!&\\)'&L)\"$<-!%<5!%L5\"%<=!%<A!%<=!%<E!&\\M+%\\M#%LU!$LU!"
+ "&LQ&%<U!)M-$%M!!']1&&=5$%M)!#]-'$=5!*=9+%M9!%]=!)-Y*%ME!&]I!%ME!"
+ "$]I\"*>!%$MQ!&MY$%]U!$MU!&-Q'-N%.&M]$'.-!$N1!&>5\")^9'&.9!)>5%&.M!"
+ "&.E!(.M)&.M!&.Q!&.U!&.U!$^M!(NI!'N]'(?!)&?%!&?%!'?)%&?-!'/-$+O1'"
+ "(?5#&?5!&?A!'O5!&?=!'/E#+OI%+_E!&_E(%/I!&OM!&OQ!&OI!&O]!)?M!&OQ!"
+ "&OI!%/E!&OU!!/Q!*OM''_U!&OU!&OQ!&OM!)OM\")OM((_I+&OI!'_E!'_A!\"?5!"
+ "*?E&&?9!&OM!&?=!'?9%!/5!&?%!&?)!&?-!&?E!#O)!'?-%'_-'&.]!(/)(&.Y!"
+ "'^U(&.Q!&.Q!'>M!(NE!&.I!&>-\"+NQ-\">I!(^='(.=$$^A!+>E!(>-&#>)!)>%+"
+ "#^!\"&-]!&>!\"'MQ#%]Q!&]M!%]M!%ME!)=I!$=9!%ME!&-9#$M=!&M)!%<])&M-!"
+ "%M)!&]5!',Q#%=%$%\\]\"%\\]\"(-!-'LI+&<M!'\\M&&<M%%<E!%\\5#'\\M+$L1'&<5!"
+ "&\\1#%L)\"'<)!'KU#$,%!%,!!%+]!%+U%&;U+$[I$';M\"%+I%([A%$[A!&;='#[5!"
+ "%;9&%;E&#[)!$+5\"#[-!$K!$\"[!!#*]!$:Y'&JY!$JQ$$JY!$JA!#JA!#ZE%%:A("
+ "':=%$J=!#J5!#J%!\"Z5!!*%$$J)%$:!$#J!!$I]%#Z)\"')U%$9Q!$IA##IU\"#YE#"
+ "\"9)#\"Y1\"!)%$#I-%#Y9#%Y9+%IA'!IA#!YI!#9Q!#IQ\"%:)+$YU'%I])$*%#$I]\""
+ "#J)!$*%#$:-$#Z5\"\":5&#Z5\"&*1$%ZA\"%JI%$:I$#ZU!$*Q\"$*U\"'*]#$;!##Z]!"
+ "$[!&\";%\"%+)\"![-!#[=!$[1!$[A(#[1!#[A!)KQ#%+=\"%;I\"%[I(\"[E!$KU#'+]%"
+ "&<!!%+Q!)\\%(#+Y!&\\9#(L1&%L9\"&<1!%\\9#'<=!%LA\"$,A!#LE\"&<]$%<Y!%<U)"
+ "',U(&,U($=!!&]!\"%M-%#=%!%]1!'M1)&-9\"&=5$$=5!%M9!%MA!&MI$(=I1%]I!"
+ "$MM!)=Y!%ME!#=Y!%]M!'.)%(>%!%^)!$^9!$N-!'^9#&.9!$^9!&.=!$^A!&.E!"
+ "&.M!&.U!$^M!&^Q#&.M!&?1&&.M!&N]\"&?!!&?!!&?)'&?)!'O%!'O-&&?%!,O9%"
+ "'O)!#O9!(_=%'OA&#OA!'_=!&OM!&?E!%/E!&OI!&OM!'?]$'_M!%_U#&_U\"&OI!"
+ "#_M!-/Y,&OM!&OY!'/U)&_U\"(OM$%_M#(?Q)&/U$'_Q!&OY!&OI!#_Q!%/=!*_A\""
+ "'_E!(/A\"$/Q\"&?=!&OE!&?9!&?9!'?-%%/1!&?5!,?A\"'O)&'O%!$_)!._!1&.Y!"
+ "#.U)&.Q!$^Q!&.Q!%^M%&.Q!&.A!&^=$&NM\"(N=!%^1!(>5&'.-*$]U''.-!&=]#"
+ "$N-!%]U!'-Y!%]Y!'-U!%^!!&-U\"%]M!%]I!']E$%]A!&M=$&M9%(]%*$M5!%M-!"
+ "(M1)%]-!&=-$&\\]!%<Q!%,Y$%LY!%LU!)<A2%\\Q\"\"<E\"&\\I\"&LA\"#<9\")L9!'L5\""
+ "&L1\"'<-%%,-!'<)!%<%!&<-!%K]##+M!&+]!$+M!%[M$';E\"%+=!\"+E!%+E!\"[=!"
+ "$[9$%[-!$+9\"$+9\"%+%&%;=&#+!!$K%$#JY(%ZY\"(Z]/%*Y\"&*M$\"ZI!$ZE\"$*A\""
+ "#Z5)(J5$#Z%\"\"J1$#J-!#J%!#J)!#J)!$J%&\"Z!$%)Y!#9U!#YM\"#YQ#\"YM\"$)E#"
+ "$I!&#9)$#Y=&\"Y5\"\"IM!$YI&#I5%%Y=$$9I$$IM)#9U'#9U!$YY'\":-##Y]\"$)]#"
+ "#J%!!Y]!\"J-!%:-!$Z5&#*9\"$JI!#JI$%:E+$ZQ\"#JA!%*I#$*U\"$*U\"$:Y'$;!#"
+ "$[!!#Z]!&:Y'%+5&%;1'$+1!$[I!%[=%&+A\"$[E!(+Y-#[=!#+M!%;I\"(KU#&+Y%"
+ "$+Q!(;U\"!\\)$#+]!$<-\"&\\1($,5!%L5''<)%',E(%\\A#&,E$&\\]\"%LM\"(LI/(<=."
+ "%\\U\"'LQ/%<U!$=!!&\\Y\"(])&%]-\"%=1$%M5!%M9!&]=+&]A!,M=,%M=!*MI,)MM\""
+ "'-U!%]U!'-Q'%]]!%^%!'=Y''>5!&N)$%^-!%^1!&>1\"&.9!'>9&'>A!&^Q#'>I!"
+ "%.I!&.M!&.E!+>U!&.E!&.U!(_!&&.U!'_!\"\"N]!$^]!#O%!'O1!&?1!'O1!)/5!"
+ "&?5!'_E!'_=!)?M!'_E!'_A!)_I*'_Q!&OI!%/E!'/9#+_Q&&?E!\"OM!&OU!)_Q#"
+ "!/]!&P-!&OY!&P)!(/]!)?I!'_Y!)/M,(/]!&OU!&OU!(_Q$&OY!(_U+'_M!(?=)"
+ "%/=!-/M&)/=!&OA!%?=!'O=&&OI!'O1!'O%!'/5$(O9*&?1!(/-)&?!!&?%!&.Q!"
+ "&.Q!'^Y'(NE!$^Q!&.M!%.Q!+^M)&NI#'NA'&.=!'>9!&^9$&^5%(>A+%^-!%^)!"
+ "$^%!%^!!%]]!&]U*&N)#&-U'%=I$'-U!%M9!*=A&#=A!&]A&(=9,'M5)&M5%'M5)"
+ "%]%\"%]!\")-1&'-%\"$<U!$\\]#%LY!%\\I#'<Q)$LQ\")<U2%LE!&L=!%LE\"-<5/&\\1#"
+ "$LA&&,-%)L-!%\\)$$,%!(K]'&;U&#<%\"%[U$(+Q&$;I\"&KM'%;I\"%+A%%;A\"#[9!"
+ "%+5\"%[5!&+1&\"[-!#;%#$+)!';)(#[!!%+)&&:E!#ZU!$JQ!!ZQ!\":M\"$:I$#JI!"
+ "$Z=\"#:=#$Z9\"$:1!%*!!#Z-\"%:1!$*%&&Z!(%Z%##IM\"#9M!\"9U)#YM\"$II%#I9\""
+ "$IA#$Y5*\"IE$!Y=!\"IA!%9-)#)A#\"II!#9I!$9M!#)E#$9Y!#IQ!%)Y($:)$$Z%*"
+ "%J))%:)(#Z5\"&J5-#Z9\"&*A(#J5!$JA%#J5!\"*M\"$JA!':Q!!ZM!%JY)$[-!%;!#"
+ "%;%'#[)$'K)-#[%!$+-!%K1$$[A!![=!&+A\"$[I!'KA(%+I%$+Y!#+U!%+U!$;M#"
+ "&+]%&K]#'<9%$<)!&\\-(%<9!$,5!%<5!&<=!$<E!$,A!&LE!'<I%#LQ\"%<Q!&-%$"
+ "&LY&(])**-%!%M!!&--#%])\"#=-!(M1.%]5\"&]E&$M=!&]A&%]Y!'MQ#$ME!&]M!"
+ "%]U!&-Y!!]Y$&N-#%]Y!#>!!'>9!'>5!'^-#'N1\"'>5+&NE#$^I!&.A!'>A&'^E#"
+ "&.I!#^E!%>M\"*NY\"(NA,&.U!'O!!$^]!&?%!&?%!'O)!&?9!&?1&'_A''O5!)?9!"
+ ")/=!'?=$)/A!*OM!&?5!#/I#(OI$)/E!)?M!&OI!$/U(&_U!&OU!'_Y!%_Y#'_U!"
+ "&OI!+?]*&P!!%/]!%0!!(/]!&O]!&_Y!'/]\"(OY*(/Q')?U!$/U\"#_M!\"_I\")OQ\""
+ "'_U!(?E)%/I!'_E!&OM!&?=!+OA7$_Q%*O=!'?-+(?1#&?1!$/1\"&?=!&?%!'O)!"
+ "(^M-&?!!#NU!&.U!&.]!(>I+'>U!(NI!&>I!&>E\"%^)!&.!!&.I!%^-!%^!!'.)!"
+ "(>!!'.%!$N1!%]Y!)-]*%]Y!']Q$%]Q!&]M!%]U!%ME!'-=\"%M=!&-5#%-5#&=12"
+ "(M)$%M)!$M-!(]%!%-!$&-%$%L]!'LQ!%<M!&\\Y!',I#',=(%<A!%<A!',9)$<Q&"
+ "$<5&%,1!&L-#\",)!&,)!&;U'%;M&%+U!';U\"&+Y%%+Q!#[E!%[E!%[E$&+A&&KE$"
+ "#K9$%+1&#+1\"#ZQ!#[5!\";%&$+%\"#[!!$K)$$JY$$*U\"#ZQ!#ZM!\"ZQ!#ZE\"\"ZE!"
+ "%:9(%:9!%:1!$*5\"#J1$#J1!#Z)\"%J%*\":!-!Y]!#J!!$YQ'#9Q!#IM$%YI$$9I!"
+ "\"I)!$Y-$#I5\"%)5(#)9#$9A$#Y5&#IM!#YE\"#YI#&IQ'$:%$$)Y#%*%'$Z!&$:%$"
+ "\"J%!#Z-\"\"*9!#Z1\"$:9#%:9!$Z=\"\"Z9!$JE!$ZM%#:M#%JQ!#Z]!\"JY$$J]!$;-\""
+ "#[!!\"[)!'+-\"#[)!%+1*%+9\"$[9!%+=\"%+I!&KE#&;I&!;I&$KM##+]!$[I!%[]$"
+ "%+Y!'+]%%<%\"%<!\"(,1$'L1\"'L5&',=#&<=%)<A-%LI!&LA\"&,A$&<M%),Q'']!!"
+ "%LY!#,]!#=-!&M!!&LY!)=9'#M1\"#M5\"&=-)&]9!$=5!&MA$&=E#%]I!#=I!#=Q!"
+ "%]Q!#-Y%$MY!%]Y!&.5!%^)!'.)*%^%!'>1&'^1)(N5!'>A!&>A\"%.I\"&.I!&.]!"
+ "(NI!%>I()NQ*(>I%$^Y!(_!,&/!&&.]!)/-(&?)!$_%!'/1$'^]!%/5!'O1!'O9&"
+ ")_A/)/A!-?1)+/E#&OI!&OM!$/Y!'OU%&_Q\"&P!!\"?U!#_]!'?Y$&OU!(/]!#_]!"
+ ")/],(_Y$'@!#%`1\"&P)!%0!!&P%!&O]!&OU!'/]/'/Y#&OU!&OY!&OU!'P!%(/]'"
+ "#_M!%/]!'_E!(/I!'_=!&?=!%/A!&?A!'O1!&?5!&?1!&?A!%/-!&?)!&?%!'>Q&"
+ "%NM$+N]'(NM!'>A!'>Q!'>M!&.E!&>Q!'>E&+^=+&.=!%N1$%N9$(>-!&N-#$^9!"
+ "&^)%'>!\"%^!!%]U!$MY!%]U!$MY!%]Q!%]Q!%]I!%ME!%]I!#]E#%M1*%M5!']-*"
+ "'-9'']-!'])+%M1!'=))'<Q)&,Y#$LU\"%<Q!%<Q!(<I$%LI!#,E!'L9!%<=!(L5&"
+ "%\\9(',1$&,=$%,)!&,1%&,!!&,%%#,!!&+Y!%<!\"&KQ(#+M!%[I!$[E!%;E\"&[Q$"
+ "$[9!%[5!%;5\"![1$$[-$$[!%%:Y$#K!$&:Y$$;!\"#ZI\"$JM%#JM!$:I'$ZE&$:E#"
+ "#ZA!$*5\"%*E'\"Z5!#J1%$*-#$J)%%Z%'#*!&$)]#&)Y$#IQ\"$IQ%$9M!&9M&!YI!"
+ "#Y-&\"Y1\"\"Y1%\"Y9\"%9A#$9A!%Y1(#YM#%9I%$)Q#!)U!$IQ)#YU\"#IY!$Z!'\"J!!"
+ "#J%!#J)!$J-%\"Z5!#J1!#J=!%:A!%JE%#:M#%ZI*$ZY\"#*Q\"%ZU\"%:Y'#JM!%+!\""
+ "%+1&%[)!$;=\"\"[1!#[9!&KE$&+9&';=#$KA'%+E!!+M!&;Q'$+M!$;U\"&+Y!\";U\""
+ "'L),!<%&%;]\"&,)!\",)!%L5\"%L1#$,5!!LE#%<5!%<E!&\\I'#LM#%<M!&<I!&LU!"
+ "&<Y%%\\U#%]%\"&]%'$LY\"(=-#&-1#&-9\"'-1\"%M9!&]=+%MA!%]A!$MI!&]A!%MA!"
+ "#>%!%]U!#MM!%]]!&-U!%^%!)N)1(>)!'.%!&.=!&.9!&.=!'>E!&>A!&.Q!$^I!"
+ "&NA##NY!,.]$&.M!&.U!&.U!&?)!$_%!'O)!&_1\"&?1!'O1!(/9(%?9\")/=!&?=!"
+ "&OI!'_E!*_E\"%/M!'OI%(_Q$'OM%&_U\")/U,&OU!&OY!&_]!&O]!&OY!)P-!(@!\""
+ ",@%!&OQ!(0!!'`!,-`1!(?]\"'_U!'0-\")@!!(O]))OU.&`%'&_Y!'@!$&_U!&/Q%"
+ "'_Q!&_M\"#_E!%/M!,/E!'_9!&?1!\"?1!%/9!&?9!&_5#)/1!&O)!&?-!$_)!&?%!"
+ "&O!\"&.Y!*?%!&.Q!&^U$\">Y!$^M!'^Q\"&>M!$^=!&>A!&.9!(NI!$^5!*.-.&.)'"
+ "%]Y!&^-%%^!!$M]!\".%!%]A!%]U!$MQ!%]M!&]I%%M5!%]I!'==#&-A\"%-=$(-A!"
+ "'-1'#M-\"$=%!$]%#&,]#%<]!%LQ!%\\Q\"&<Q$',U#%,=%$,=!),E($<I!%<=!$L=\""
+ "'<5.&<=%$,%!%<5!&,%!&<%&&+Y%%K]##+Y!'+Y!$;Q\"#[E!$KA$$[E!%;E\"&+M!"
+ "%;1\"#;-\"%+9\"\";-\"\"[!!$;-\"\"[!!'+%'$J]!\"ZQ!$:Q'$ZM\"$JA$!ZE!#J=!$ZM%"
+ "!*A$\"JA##J5!%*A'%9]($Z)&$J)\"#9Q!#Z!&$I]&#*!##9U!#*)&$)M#%9M%$II)"
+ "#9-$%I=-\"I5!\"Y%#\"9E##)=#$IE#$)Y#$9]!%)Q($Y]##YY\"#I]!#I]!#J!!$J-("
+ "%Z)*$:-!$Z1&#J9!#J5!%:9%$JA$#ZQ!%JU!$:A(%*E\"'*Q$$*U\"$;!\"\"ZY!$*]\""
+ "%;%'![-!#[-!!;1\"%;5\"';=#$[5)%[A!%+5\"$+Q!\";5\"$+M!#[A!%KY#%[]$%;U\""
+ "%,!%%<5!&\\%$&<-!%,1!%<9!'<-*(\\A0%L1#%<A!&\\E'&,I#%,Q$&-!#'<I%%L]!"
+ "%M-!\"LU#%]%\"$M!\"%M)!&L]&&]1!%M5!'=1(#]I\"(M=)#MY!$ME!%ME!'-M!%]U!"
+ "'-I'$MY!%-]#(>)!%]Y!'N-(#>)!'>5!$N1!'^-#'N9'&.9!%^1!&.E!#NU!&.M!"
+ "&NI#%>Q\"#NY!*.U!(^]1!/%!(?!$&?5!&_1\"&?1!&_1\"'_5'&?=!&?-!+_=!(?9)"
+ "'O-!'_A!*/M$%OE#(OM$(?M\"'_Y!)?Y!(@!\"&OU!-0-#%O]\")@-&(0)!*`)!,@-'"
+ ")`%)&P%!(0!!'_U!(@%!)P-!(/]!(0%!(OQ#,@!!)@!!&O]!&P1!&O]!%/Y!&OU'"
+ "%/]!&/Q%&OM!)?M'&OI!,?E/'_E!\"?Q!'_=!&?A!&O1!*O=-%?1\"%?!($_)!(/1)"
+ "&O!\"&.]!&.]!$^Y!&NU\",NQ!&.]!'N]!'>M!&.E!\">A!&.5!%^-!%^)!&.-!%^)!"
+ "%>1#$N)!&.%!&.)!'-Y!%]U!)=Y&%^!!&]A!$MI!']9%'-U!$MA!%M=%%M9!&M5%"
+ "'-9,&-A\"%]-!#=%!&,M#%M!!%<]!&,Y#',Y##LI\"%<I!'LI!%<9!%\\A#&\\=('<9%"
+ "#\\-(%L1#%<1!%,!!%,!!(L-\"%+U!$+]!$[Y($KY##[E!#+Y!%+M!&;M\"';I+%;M#"
+ "%;5#&[=)![A!#[1!#[-!$[)%#[%!&:]+$*]\"$ZY%#[%!$*Q\"$JM$#ZY!!ZA!#J9!"
+ "#ZA\"#Z5\"#Z9!$9]!$:=##J-!#J)!#Z!\"%)Y$$)]##IU$#YY\"$)U#$9I%#99!$)M$"
+ "$))$#I1%\"Y5\"!I1##)%$!YM!#II!$)Y##Z!\"!)I!$YY'#:)##I]!\"J!!$J)%#Z%\""
+ "\"IU!!Z)!$J1\"$Z5&%ZE\"$Z)&$:='$*Q&$:9$#JM!&ZQ&$:U#%*M&#;!&$;%\"$[%!"
+ "$K!$$+-\"#[5!$K)'$+5\"$[A!'+A*%+E!%KE$&+I!%[I$$[E!$;Q\"';Y+%;]\"'L)\""
+ "$K]'%+]!&+Y!%,-!'L-\"'\\5(%,1!$L9\"&LI&%<A!%<M!$\\E##,M!%<E!&,Y#'LU!"
+ "%]1\"%\\]&%<Q!&LM&'-)#\"-1!']-&(M)$%M9!&-=\"%]Q!%ME*&=I(&]M!'-Q&%]I!"
+ "%]I!%ME!&]]%%.!\")]]\"(>-!%^)!(>1+*^1%&>5\").93#NA!'^A(&.Y!$^I!)^E!"
+ "'NQ'%NY$*.Q!$^Y!&.]!(NQ&%?%\",O),'/-$&?!!&_5\"'_E!(?%*)/5!'_5'&?=!"
+ "&?E!(/9(&OI!)/Q&&OM!&_Y!(/Q-)_Y.)?]!&P!!(0!!,?Y4(09!'_I!(@!\"(09!"
+ "(0-!(0)!+0-!(@)!-`)!)@!!(0)!(P9\"(0-!)0%%)P)!(@!\"%0!!&OY!&O]!&OY!"
+ "(_Q+-OY!&OI!$?M#$OE$(/E!*OI!'?=%'_I&%OM\"&O9!#OA!&?1!(/=((/%#'_)!"
+ "$^Y!&.Q!&?%!$^U!'>U!&.Q!&NQ\"'>M!&.9!&^Q$$^A!&>=\"%.9\"&.5!&>5\"%^1!"
+ ",.%-&N1##>!!\".!!&-]'&-]!&]U%'-]!&-M\"&=I#'=I('=E\"&]A!%M=!&M9$%M-!"
+ "&]1!&]1+%M%!%M%!*-%&%M)!)-!,%<Y!%]-\"%,Q$%<M!\"<9\"\"<M\"%<=!&LA\"#\\9$"
+ "&<=!&,5$%,1!&L1\"&,)%%\\-#(L!\"%<%!#[Y$%+U!$[Q$&+M!(;I&&+I&%[E!$[A!"
+ "%[=!&+E%$+5!$+1\"#[-!#+)\"$[%%%;!'%:]#%JU)\"ZI!#[!!'*I$%JM!$*I\"&*Q*"
+ "#ZA!$JU!$*=\"#J5!#JE!#Z-)$*!#$YY#$*!##Z1&!*!!$9]$#I]!$YE'$9M$\"YE\""
+ "$)-'!I1##)E#\"I9!#I-\"#9A!\")E\"&)E,$9I$#YM##J%!\"J)!%Y]#%YQ*#J)!%*-'"
+ "$Z5&#J-!$J1%#J1!#J=!%*1#&:E$$JM!#J9!$JM!$*Q\"\"ZU!&JY!%J]%$J]!'J]%"
+ "#[)!#[%,#[1!#+-\"%;9#%[=$$[5!(;A0&KE#%+M!%+M!%+M!$;Q\"%+U!%;Y\"%;]\""
+ "%<)!'L!#&<)%'<-!%,-!&,E$$<%\"%<M!'L1'%<A!(,U($,A!&<M!&LY&'LU!$=%!"
+ "#M!\"'--#']!!%]%\"%M5!%]-\"&M-!&-9\"%]5\"$M=!%]I!%]M!%]E!%]Q!(=Q!&-U\""
+ "&-]\"%]Y!%]]!(>)!%^%!'N5(%^-!%^-!(>)!&.=!&^9%'^=#&.5!&NM\"&.=!&.U!"
+ "&.I!+>U!&^Q#&.]!#^]!&_)(&?)!$O1$'O)!&?1!'/=#'O5!(/5((?=#*OA!'_I!"
+ "(?I#%?I!)?I!'_Q!%/]!'_Q!%@%!(?M\"'P%$(/]!(0)!$0)!(0)!\"@!!)@!!(09!"
+ "(0-!/?Y)(@A!(0-!(0%!+@-),@-!)01%)@!!)P)!+@-/#`%!*?Y,'_Y!'?U$(_]+"
+ "&O]!)O].)?Y'\"?Q!&OI!&OI!'_Q!)?Q!&?A!&?=!&?-!&?-!%_5$&?1!&O-\"'_)!"
+ "&?5&&?!!&.]!&.I!\">]!$^Q!&.Q!&.M!'.=%'>U&&.=!$^=!\"N=\"&.9!%^-!&>5\""
+ "&.5!%>-$%^!!$N%!&]]%%]Q!$MY!(=U!!-Q!&]M!%ME!)-=!&]A!&]A&&-E\"$=A$"
+ "%M1!%M-!%]5\"$<]!$=%!%\\]\"%\\Q\"%LY!&\\]&'LI*%<M!%<E!%<5!'\\9#&LA\"%L=\""
+ "%<=!%,1!&L)#$,-!%,%!%;]\"&<!\"&+]!%+U!$[I!$[Q$&K-$&;Q&#[9!$[E!%+A!"
+ "#;=\"![=!#[=!&+5*#[)!!;-\"$K%$$*]\"#[1!!*]%\"*]\"#ZU!$*Q\"!ZI!$JQ!%:E("
+ "%*E'!Z1!$J=!$J5%#Z=\"#J-$#Z%\"!:!\"#IQ%$:)!$)Y#%IY&#9U!#IQ(#)I\"#9M!"
+ "$9A(#9)!#99!#I9%!Y1!$IA##IE!$)I#$)U##)M#$YU#')U&$)]#%I]*\"IY!%Z)'"
+ "#J-$%:1!!*9!$*1\"#J=!%:=!\"ZE!$:5$):I+&JI-\"ZQ$$+!\"\"ZY!\"ZY!#[%!#[!!"
+ "$[%!$+-\"';)'$+)\"$+1!%KI#\";9\"%;A\"#[A!\"[I!$+M!\";=*#;U\"%+U!%,!!&[M$"
+ "%<!\"&,%%#\\-#(,1($,-!&,5%%LA\"\",5!%<A!%LA\"%,-!&<E%&<I!#,Q!%<Y!),Q'"
+ "&<Y$&\\]\"%]%\"$=)!'-%\"'=-()M9(&M5$&M9$)-A!%M9!$N!!'-9'&]M!$MQ!%]]!"
+ "%]Q!%]Y!%^!!%>!$%^%!%^-!$N%!'.)!%^-!&.9!$^I!'NE!(>E%'>A&)^I!&.I!"
+ "&.U!&>I!'^Y'*.Y!&?!!'O!!$_)!&O)!(O5%'/-)*?5,&?9!'_=!*OI!!/A!)/A'"
+ "(?E#&OI!&OQ!(_9%!/U!%OY('`!&&P!!(0!!(`!$(0!!(@!!(05!(0-!-0)1&01$"
+ "#`1!\"@1!'01\"(01!(01!(/]!(P)\"*`%!&`-!*0-**P-,'0)\"(_U%(@%!+/]!)@!!"
+ "&O]!*/U+(/Y'%/U!&OQ!'_]&&?=!'_M!%/I!#_I!&_A\"&?9!&?5!&?1!&?1!#O-!"
+ "+_)(\"?%&$_!!'N]!&^U#'NU'&>I!&>M!#NI!&.E!$^E!&.A!'.A&)^9!)N1!#N9!"
+ "%^)!'.-!%^%!&.%!$N!!$M]!$]M\"%]U!'MI)(-E&%M5!%]M!&MA$&-=\"$=9!%]5\""
+ ")MA(']1/%M1!%M5!#M%\"&,]#%-!$&L]&$\\Q#$LA\"'<I$$<I!%<9!'LE!%\\A#%\\=#"
+ "$\\I#%,1!&<1%'<)!&,)!%,%!&,!!%+Y!%;Y\"&[U(#+I%$+Q!%+]%$+M!&;E'$[I!"
+ "$+=%(;%)$+5\"\"[5!&K-)$;)#&+%&$;!+$*]\"(J].'JY!#*M\"%JA%\"ZM!#ZI\"\"ZI!"
+ "#JI!$*Q\"$Z=&%J5&%*1#$*5#$Z-&'*))\"Z!!%*!($Y]&$IQ&#J!$%)Q$$)M#!YI!"
+ "!)1$#)9#\"Y9\"\"I9!#99!%YA%#Y5##YI\"#9U!$9Q(!)U!$9Q($)]#\"Y]\"&*%$#J!!"
+ "$*5##Z-\"%J5\"#J5!#Z1\"$:I$!Z=!%:I$#JA!$*M\"\"ZQ!!JE&#[-!#;%##+!!#[!!"
+ "$+%\"!;)\"%K)$%[1)([5!$[9$$[=!\"[-!%+=!%+Q!$KM##+M!$+Y!&[M%'+]!&<%%"
+ "%,!!%<!\"'<)&%L-\"%+])$L5\"%\\=##,A!&<E!$LE\"&<E!'LE!(LI+'LU!$\\M#%<]!"
+ "(,]#%M!!&<Y)(])!$=5!(-)'&-E\"'M-%&-=\"&M5$'M9$%]=!%=A$%]M!%]Q!(-Q!"
+ "'-Y!%]Y!%]]!&>)\"(^)(%^%%'^-#$^5!%^-!(>1!&.=!)^9''>A!&.I!&.M!%.Q!"
+ "*^U5'.Y$(^Y!#NY!%/%!)?!#(?-#&?-!%/1!&_1##/5$&?9!&?=!)/A!&?9!&OQ!"
+ "&?E!&OM!&?9!'/Y\"&OM!&OQ!+0!!*0)0#?]$&P%!'@1#&P-!(09!&`9!(01!)`-("
+ "&P1!)@A%'`-%#`5!%`5#&`5!%@%!)@A%+01!(0-!)P-!,@9&+0!!%@1!%@%!(0!!"
+ "%?]!(0!!*OY&&_U!&P!!&?A!)_I*&?E!'_=!)OA.(_5&&?5!&?%!&O1('_A!&N]\""
+ "*/!2\"?=!*>]''O%!&.Y!(/%('^Y\"#NQ!$N=%-.E0#NA!&>=\"(.%*&.A!&.9!'>5!"
+ "&^!%&N)#%^)!&.5!%]Y!$]Y!&]Y*&-U!(-Q%%]M!%]Q!&=A($MA!(]A/%]='(-9'"
+ "'-5'$]1\"%M-!%M1!(M%$&-%#&M!%'LY!&,U#%LQ!$<M!'\\Q\"%\\I#)<E$',=('\\=\""
+ "%\\5#$L5#$,-!%,-!%<1!%,%!%<%\"%;]\"'L%#%,!!%+U!!;Q\"$[M$%KI'$;I\"$[A!"
+ "$[A!$[)!%K-(#;-&\"+1!$;)#\"ZM(%JY)$[!%%K!!$JY!$*U\"$*U\"%ZQ\"%JU!!:A\""
+ "$ZA\"%J9!&*9+#Z5\"%*1##J-!%:9$%*)'#J%!#J!'%:-(&:!)$YM##IY$$)M#\"YQ\""
+ "\"Y=\"\"9%$!)9!#Y9&#Y=#$IA#\"YE\"$9M!\")E%$YM#\"I]!'YU)$:%!#J%!#Z%%\"9]\""
+ "%*%+$J9!#:1##J5%#J=!#J=!#ZA\"$*E\"#JA!#JI!%+)&$JI!%J]!%K!!$;!#$[!!"
+ "%[%%%K1(!+1!$[-!#[5!%;5\"$[A!'[A!$;M\"$;A\"#[M)(;Q+%+U!#;Y\"(+Y!'KU#"
+ "%;]\"%+]!%;U\"%+]!%,1!%<5!&L9!&\\E##,9!%<Q!%LI\"',M)'<U$%<Q!%<U!%\\Y\""
+ "%L]!']!&&,]#'-)'\"M5#,=%1(=5#)M1.#==!&]I!%MA!(=E!'-I'%-Y(%]Q!%]U!"
+ "'=Y''-]!&.!'&-Y\"%^)!%^-!!^-$'>5&&N5#&.9&!.=!(NA&)>A$&.E!&.Q!(NM!"
+ "'>Q!'.U%'^]\"&.U!'O!!(_%&&O-!'_-!&?9!#_9!\"?=!#_-!*_9))?I!)?E')?M'"
+ "&?E!'/U#&P!!-?E'(/]!\"_]((/]!+@)/)0%%(@)!(09!)@1&+`11&01$)P1!'P5$"
+ "+P90(05!&`9!'@A)(09!&`5!&`9!%P5!'05\"#`5!,P5!)01%&P-!(0%!)P)!(0%!"
+ "(0!!(0-&&OU!&OU!&OU!'_I!&_I\"\"?Q!%/U!'_A!#OA!&O=!&O9!%/5!'/1$)_)*"
+ ")/5!'^]\"#O!!'N]!'.]%'?%&*>E)&.Y!&.I!&NI\"&.=!\"^A#(N=!&.A!&.5!&^9$"
+ "&.5!&N1#(>)+).-)%^!!%^!!(-M+'=I(#]U#%]M!%=A$)-9+)=M!&-A\"(MI-!==\""
+ ")\\]%#=1!%M)!%LY!\"=!\"%,Y,',U#$L]\"%<U!'LU*&<Q%&<M!&,M$$<E!$<M!$L=#"
+ "',I#'\\5,'\\1#%L1\"%<5!&L%'%,%!%,!!'+M%#;M\"\"KU#$;Q\"'+U!(KI#%;A\"%[9!"
+ "$[=!%;9\"%;9&&[!.!+-!$K-$$[)!$;%##[1!#Z]!#JI!%ZU*\"J]##ZQ!#JI!#ZQ!"
+ "&ZI##:A#%*1'$JA$%*=##Z=!#J-!#Z-\"#J%!&:%)$J!%$9U!#9U!\"YQ!\"YI%\"9M#"
+ "#)1##91!#)=#!)9!$)=$\"IA!#YE#$9I%#9E!$)Q##IU!#IY!#J!!$9]$%J%\"$9]$"
+ "#J-!#J1!%Z1##ZE\"#J=!#Z5\"#*E\"&:E!!ZI!$ZY!\":Q\"%*U'\"ZY!#*]\"$[!&#[1!"
+ "$;)\"#[-!![9!%+)\"#K9#%[A$$[=!$[I!&+A&(;I&\"+M!#;M\"$+Q!%,!%%+]%%L)#"
+ "%,%!'\\%#%<%\"%,)!#L-##L5#%\\9#$,9!&LA\"%LM\"#,I!$\\M,#\\M((<Q.$<Q!%\\]\""
+ "%M!!(,],$M!\"&])&'])&\"==!%M-!+=-'(=A\"'=M\"$]9\"&-I\"*==&%]M!']Q)(-M!"
+ "$]Q\"'MU)'.!%%^!!%^!!$N-!%^1!&.5!&.9!(NE,,.I%(.A)'NE'&NE#(.M#&.I!"
+ ").U-&.Y!(_!!'>]&'O!'$^]!$_)!&?-!&?5!(/A('?E$&?=!'_=!(?I#&/E%&OI'"
+ "&OM!+/Y)\"OU''OY%)/Y&&O]!(0%!'P)$(0!!.@A/&P%!*0-#&P-!$`A$&`9!'01\""
+ "%@9!&`9!\"P-'&`5!(05!&`5!!0=!(`9#&`9!&`9!&`5!)`5((0-!&P!!(0)!'_U!"
+ ",/]!&O]!&_]!)?]'%/U!&OQ!'?I$&OI!'_E!'_E!%/9!&?=!&?9!(_)!&?-!&?%!"
+ "$^]!'/%$%/5!(^]!#NU!(NY&&.]!'O!!\">Q!&.]!&.A!&NA#&N=#&>=')^9!&.5!"
+ "(.5*%>-(&>-\"&.!!\"-]!(>!,$MY!&MU$%]U!&=M#&-Q\"'MA$$MI!'M=$&-E\"&-9\""
+ "%M-!*=1,$]1\"%=)%%]%''=%$$<]!(<U$%<Y!&<Y%',Q(%<Y!&L5&%\\E#%<9!&<1!"
+ "%<9!'\\-(&<5!%,1!%L)\"%[Y$\"<%\"',!%%;Y\"%L)#\"+U!$;Q\"#+Y!(KE(%;I\"$[=!"
+ "(+9.%;M\"&;)'#[5!#[-%#+-!%[)!#Z]!&[1!%+%\"\"ZM!%JY!&*Q'%:M'%*A&%:I("
+ "#ZE\"$*5\"$Z9\"#Z5\"\"J5#\"J1!#J)!\"J)!%:%(%)Y($9M$$)]#$IM%!YQ$#9Q!#YE#"
+ "#)5&\"Y)\"!Y5!$99%$9A%#YI##9A!')U\"#IY!#YQ#%)M$$)Y#$)Y#$*)#!Y]$'J)$"
+ "#J)!#J5!!Z)!#J1!#J=!#*Q\"!ZI!#*9\"%JI)$:Q$\"ZQ!$*I\"!:M\"%:]'#[%!#Z]!"
+ "%[)!\";)\"\";=\"$[%!#;5&%+1!%[E$'+A*\";5\"&[I($K]#&;U*%[U$#KY#\"<!\"%+U!"
+ "%<!\"&<-!%,-!'<1*%L5#%,-!&,=$%<9!%<M!%L=\"%\\E#%<Q!%\\I'%LU!%<U!$<]!"
+ "#]!$%<Y!%M%!'-)\"'=1#$=1!)]=)%]E!$]9\"(M=$'=E#&]E!%]M!%]Q!'MU)%]Y!"
+ "#=Y!'-]!&-],%^%!#>)!%^-!%^)!)>-%&.9!'.M%*.U!%^1!$^E!&.I!&.U!%.Q!"
+ "'>U!&>A!$?!#$^]&&?%!'?!&%NY#&?-!&?)'&?5!&?5!&?9!&?E!)/E!#`!!!/M!"
+ "(/Q('?M$&OU!'/Y#(/]!&OU!(0!!(`!$)0%%)_]))P5!(0)!'P1$'01\")P=!&`A!"
+ "(@=!(@A!+0A')`A!*@A*(PI!&`-!&`=')0=*'@1#(P5\"(@1!&P1!(0)!)@!!(P)\""
+ ")`%\"(_Y$%/U!(0!!'_U!&OM!$/U\"&OQ!&?A!'_=!&?A!&?9!'O5!(O5$&?-!&?1!"
+ "&O-!&?!!&.Y!%>]($_%!&?%!%NQ))>Q#(NM!&.M!$^9!'>I!$^A&(.=$(.9*%^%!"
+ "%^1!&>%#(^92&>1\"%^%!(>!!(-M0+-U#(>!!%M=!%]M!&=I#%-=#$]=\"$M=!%MA!"
+ "&-=\"'-A\"&-=#)M!.*-%!'-%\"'-!'\"<Q\"'\\]&%\\U\"*\\M!%LM\"'<I%#<A!!,A!%L9\""
+ "%<=!',=(%<=!'L%+%L-\"'<)!%L)#$<!\"'\\!-%+M!%[I!%+Q%$;M\"$[I$&;M'&;A\""
+ "%K=($[9!%+=\"#[=!%[1%$*Y\"$+5%%;!'$+!\"\"J]$&JU%$JU$#JM!$ZQ%%:I(\"*E\""
+ "#JA!\"Z=!\"Z=!$JA!#ZI!#J)!\"J)!#J)!$*)##Y]\"$I]&$)Y#$IQ,%IM&#YM#$I5&"
+ "#)1#\"I5!$I9#$IM)$91%\")E\"$9Q!#YQ#$*-#'9Q($YU&%IQ'!)]!$J!%$Y]##J)!"
+ "$Z5\"#Z1\"':I)#J9!$J9%$ZA\"#*5\"!*M!#JI!$*U\"#ZQ!%;)'#J]$&J]!#*Y\"':Y)"
+ "#[!!$;=\"$+=!%+-\"&K1$%;1#&;5'&+A&([I-$;I\"%+Q%%KI(%;U\"%[M%',!)#+Q!"
+ "$,)!'\\9'%,-!(<1*%L1#$,1!&<9%%<A!%<A!%\\9#%<I!$LQ\"%<U!%<U!&LY!&LU!"
+ "&=))%M%!&-1'%M)!%M)!$M1!&-A\"%M5!%]I!&-A\"'-E!%M9!(MU-%]]!(=Y&%-Y\""
+ "%]Q!#=M!%^!!&.5!%^1!(.1*&>5\"&.5!&.9!&.I!&.Q!&NI().U\"&>E!(N=!&.Y!"
+ ")O!*(N]+&^]#&.Y!\"?)!$_!!'O1&&?5!&O)!&?9!'_9!&O=!(OE$)?Q!%/M&&OM!"
+ "*OQ!&OU!(/Q!%/]!'?]#)/]%(0!!(09!-`9'*@1+(`5#'P1$)P1-%@=!(@=!(@=!"
+ "&`A!'`I%(@Q!(@E!*PM*)@E%&`A!)`Q!(@A!&`Y!&`=!'PA*(01!)`%)(01!(`=#"
+ "(0)!'_Y!#_Q!)/Y&#_I!(?]('_Y&&OM!#_M!(?M\"&?A!(_=&#/9)&?9!&?5!&?1&"
+ "'O-!%/-!&?%!'NY'&NY\"*?!!*>U\"'.U%$^E!&.I!(.E)'>A!&.A!$N1!(>9+(^-#"
+ "#N!!$N-!'.)!(>!!&^!%$M]!&=I#%]Y!%^!!$=U%%]M!%]I!*]Q!'=E(\"])$$=5!"
+ "&-9\"%]1!&LY!$M9!'M%%%=%%&=!$%M%!&M!%%<I!%<Q!%LM\"%LI\"%<U!%LI!'\\=("
+ ")L9!&<1%$<1!%L1#&<-&&<%%$,%!%+]!&+Y!#+Y!$KQ#%;]!#[A!%[E$%+M!$[1%"
+ "%;9\"'+1*'+E*#;A\"$;-\"\"[-!%K1$#[-!$+%\"%+)&#ZY!\"ZU!%*M'$*]\"&:M%$*A#"
+ "!*9!$:E#%*=&\"Z=!$:1##Z1\"#J-!#J)!#J%!#Z!\"$9]$&YY,%)Y!%IE'$IM\"#IE!"
+ "#)-##)9#\"I9$$I=#$)A$$I9&$IA#%)I!%IQ*$)Y'\"IE$%IY)%Y]$#J)!&*%!&*-$"
+ "#Z-\"%*-#$Z=\"$:=$$ZM\"#ZI\"#ZE%\"ZQ!$:I##*M,$JY!%*Q\"$JY!&:Y$$+!\"#[!!"
+ "$:]#([-.$+1!#[%!%KE(%[=!$;5\"&[-%#[E!%;I\"$+M!!+Q!&[U($+M!#K]##<!\""
+ "$,%!%,)!%,-!%,1!%<A!(<5/%L5#%\\9#$\\A#(<E)',I#$<M!&<Q$$<Y!%<Y!#\\U#"
+ "%M-!&-%$'M5*&M)!%])\"&-1#%]1!)M92$MM!%M9!&]E!%-Q('-Y!$MQ!%]Y!#=I!"
+ "'-Y!'.%%&.=!%^%!).).&.1!&^=$$^5!'N='%^1!).I\"&.I!&.=!$^M!$^U!(^U'"
+ ").Y!)^Y0(?-#*>]'&?5!(_)!'O)'&?!!%O-#&?9!(?9*%/E&)OE\"'_E!(?I\"'_=!"
+ "%/U!(`%*%/]!+`)%&P)!(0)!+P96,@)!+0-!(0--'P5$)`9.'05\",P=!(@=!(`I\""
+ "+@E')`A!&`Q!+@A!)0I$#0U#&`9!(@E!(@I!+01!&`9!&`A!#`5!+`%2(0-!(/]!"
+ "(0)!)P%!&P%!(/]!#_]!#`%!$?Q#&OI!&?A!'_E!*?9&(_I%&OA!'O5&*?5!'/1$"
+ "&?-!).U\"&?%!'/!$#N]!%NY.&.]&$^Q!'>Q&#NI!&.A!'>E!&>A!&^1%&.5!'>9!"
+ "%^%!%^-!$>)%%.)\").!%'^%*)M]!%]I!%-U#&]M!&]M%']I$&MQ$&]A&*-=%$]9\""
+ "%M9+(-%,$]1\"']%!&]-&#\\]#&\\Q\"$\\E#'\\Y+',U#&<Y$#LM#'L1&*<U##,9!)<A%"
+ ",LA*#,1!\",1!$<-\"%,1!';Y&%<%\"&,!!%;]!$;Y\"&[U$%+Y!!+M%$[I$%[M%%[A$"
+ "%+9\"(+A*$+9%&+=\"#[-!%[-&#+!\"\"[)!$[-%#Z](#:A#\"[)!#Z]!$ZM\"$*A\"%JQ!"
+ "$JE$&:A($JA!&:5%&Z9#$J%\"$:1!#Z%\"#J%!&9M&$)M$$)]##9U!$)M$&)M%$9U$"
+ "\"I1!\")5\"&)9\"\"I9!#)A)%YE$#9Q!$9E$$YM##Y]\"$YA'%Z%'$Y]#%:%$#Z%%\"J-!"
+ "!*9!!Z)!#Z5\"%:!,#J=!$K!$$JI$#ZQ!#J5!!*Q!#ZI\"$*Q\"$*]\"&JU!#ZY!%;9&"
+ "#[5!%K%$#+5!$;E\"#+A!%+A&&+A&$[I!%;E\"\";I\"$+M!$;I\"&KM'$KY'&,%!',!!"
+ "%,)!#,)!&,-$$L1\"&<5!'<5!#\\-,)<1!#<-!%LM\"(LA!',M-+<Q)&<Y%%LI\"%LI\""
+ "%]9!'M%%&])!'=-)&L]!%]1!%]M!#M5!']=+%]E!(-E!&-E\"']U)&]M!%]U!'.%!"
+ "%]]!&.!!(-Q!).%*'.)%&N=#&^A$#NE!(N5&&.9!&>A!&.E!'>A!&.M&'^U($^A!"
+ "$^U!&.]!$>]$&.Y!&?=!&?)!&O-!'O9&)/A&'O1!&?E!&?A!+?=+&_I\"&OM!#OE!"
+ "&P!!%_U)'O]%)P)'#`%!(0%!&P%!+@-\"&P1!#`1!,P5!(`1#(@=!(@A!+@]!(`A#"
+ "(@E!*PM$)`M!&`E!%@M&(@I!'P9*'0E((@E!*PE+&`9!*@9#%@A!,@-!(P-)(0-!"
+ "+P)1,@)!(0!!'_]&(/E!&OM!%_U)&_M\"&?A!'_Q&'_E!&_A\"&O=!'O=&#O5!%/5!"
+ "\"?9!#O!!)_%%*O-!(^U!$_!!&.Q!%>Q($^=!&.E!$^Y!(NE!&N-$&.A!&.I!'.5&"
+ "$N%!%^)!)>-*)>%0(-U+&N!$%^%!%^!!'=Q\"#]Q##=M!%]I!'=A#&M=%'-5'$=5!"
+ "%M5+%M1!&=-$$=-!%])\"$=5!'<])&])&%M!!$<U!&\\Q\"%\\U\"!LI#),M,%<Q!&L)\""
+ "%<9!&,)%(<5*$L=#&\\-,%<!\"&L%\"#,%!$+Q!%L1\"%+U!%[I!#[E!%;I\"%KI#%[A$"
+ "#K5'$[=!%[I$$+5\"$+9\"%*Q'#;)\"#[!!&K!,%Z]%$:Y#%ZU\"$*Q\"&ZQ\"#:I##ZE\""
+ "#ZQ!#Z9!$Z=&#ZA\"$J5!%J%&#Z-\"!*)$%:))#Z!\"%)]!#9]'%9U)%)Q$#9U!\"IM!"
+ "\")1%#95!$)9'\"I5!#9A!%IA&'YI&$)E!%)I!#II!#YQ#$9Y$#Z)\"#J%!$Z%##J)!"
+ "#J-%!Z1!$J1%!*1!#*5\"#ZA\"&:=%#JI!$*A&$:M$%ZQ\"&:U$%K!!$ZY%$;!\"(K1*"
+ "![)!&[5-'+1\"&[5!&[9!%[=!&[A)$[1!&+E%&[Q)#+Q!&+M!%+Y!%;Q\"&,)!);Y+"
+ "#,)!$\\)#%\\!#&,)%%<A!&<1!)<A)%<=!%\\9#$\\E#(LA+(L]%$<Q!%LU!$<Q)%<Y!"
+ "&]%'&-%#&M)!%M-!(]1%)]13#==!'=5(&-9#'=A##=E!$MI!%]M!#=M!'-U!%ME!"
+ "(.!%&N!)(N%,'.)!'.)!&>1\"*^-!$^5!&.I!&.=!&.9!*.I-#^I\"&.M!'>Q!).U\""
+ "&.]!'O!')/!-&.Q!'/9##O-!'O-!'O1&&.]!'_9!&?A!&?E!(?M\"&OM!$/Y\"%OQ\""
+ "&P-!%/9!%/Y&&_]!*@!$(0-!(0%!)P9!(01!&`9!(09&)`9(+P5*(09!)`I!(@I!"
+ "&`M!)`E!*0]!'@Y\",@M%(@I!%@M!(@A!#`9!(@Q!+@=/&`M!(`A#&`9!(@1!(0-!"
+ "*0)))@%&%/]!'_Q!+?Y#)OU!&OU!&OQ!&_M\"&OE!&OE!&?A!)/='$OE$*/1+)/9!"
+ "&?5!$O1%'/%$)/%!&?!!$^]!&?)!#O!!%.U!&.Q!$^E!).I.$^A!&N1#&N1$%N1$"
+ "&.%!$^I!&.)!&.9!'.%!'.!%%]Q!$MU!&-U!%]U!'=M\"'-Y!)-9&(-A!'=5##M9\""
+ "%])\"&M1%#=-!&]-!%M)!%]%\"%]!\"%M!!&\\Y!#<U!&LY!%<I!&,Y(&<E!%L9\"$,=!"
+ "$<=!'\\E,(L5/%<1&%<5!',))%;]\"%L)\"&[]$%KU#&KQ#$+Y!$[M$%[I!'+=\"&;Q\""
+ "'K=(%;I\"%;9\"%;9'&;9'$+5\"#[1!%K%)$K%$%Z]%$*]\"\"ZU!#ZQ!#Z]!#JE!$ZU%"
+ "!*E!$*A\"&*1'#ZA!$*-#$J1!\"J)!#J-%&*)+$J%%$9]!$)Y#\"Z)\"#9Q!\")M\"%)M!"
+ "!Y)!%Y5(!)9!\"I1!%IY-#9E$%)I%$9M%#9Q!#YM#$YU'\"IE!\")Y\"#J)!%Y]+#J)!"
+ "$:-#\"Z5!$:9#&*1!#ZI\"#ZA!#:E#$*U\"#JM!#ZQ!$:Q#!*]!$ZY%%J]!!+!!#;!\""
+ "&+-*%;-##;9\"!K5#'+=!%+9\"#[A$([9!#[E!&;I&';M\"$+M!%KM#%+Y!',9)%+Y!"
+ "$\\1($,%!$<-!&,-%%L5\"$<-\"&<M!)L=&&<I%%<A!',M)%<E!%<Q!%]%\"',I(%M!!"
+ "%LI\"',M)#]!'%-%$%M5!']9%%M5!&]5!&]9&$MQ*&-E\"&-U!$MU%%]U!&-Q\"%]Y!"
+ "%]M!'^1#%^%!#=]!%^)!(>)+(>A%&.5!%.A!'>5!'>9&#NA!*>I\"&.M!$^I!(^U!"
+ "(_%!&?!!)/!($_%+'O%'&?9!&_1\")/5!'?-%&?1!\"?=!&?9!'_E!'OM%&OM!&OQ!"
+ ")_Y\"&OY!&_]!&P)!(0!!*_Y!%@)!\"@-!(0-!%@5!&`9!&`I!,0E$)PI&&`A!(@E!"
+ "(@M!)0I$+0Q,(@]!&`Q!+`Q\"(@]!*@I)(@M!&09#&`M!+PM/(05!(P1)(01!(@-!"
+ ".P)$'_Y!(/]!&OQ!&OY!(?]/&OQ!&OQ!'_M!)_E/+_E,&?A!&?=!&?5!'O!!&_5#"
+ ")/-!'/)$(/%((_!!&O%\"&?!!'>Q!&.I!&^M)&.U!'>E&'>M!&.A!&.I!'NA'&>5\""
+ "(N1,'.-*(>-!*>%*,.%-%]Q!%^!!'=U\"'-U!(-U*(=Y!'=I()=E1$MA!'-=!&M9$"
+ "'M5$$]A\"&]1&&M-!&]-!'M%%\"-%!'-%''LY%),Q'#,M!&,I#%\\A#$LA\"&,I$&\\9("
+ "%L=\"%\\=#%<5!%,1!$,5!%+Q!%,)!%<!\"%;]\"&;M\"%;Q'#KE#$+U!%KU#';Q/\"[A!"
+ "%[E!#;9\"%;9+%+1&$[=!$+1\"$*]\"$+%&%;!#\"ZY!#ZY!$K)$#ZA\"#JQ$#JI!#ZU!"
+ "\"ZE!$*E\"%*5'\"*5!#Z=\"$J1%\"J1##Z-\"\"J-!$9Y$#Y]\"#9U!%:-)#YQ\"$Z!\"%Y=$"
+ "$))'&)9#\"I%!\"I5!$IM\"$I=#$IE\"$)I!#II$$IU%\"IU$#9Q!$*!#\"J)!$:%!#J%!"
+ "#Z-\"#Z)\"#J!!#J=!#ZA\"%J=)#JE!':I!\"Z=!%:Y'#ZM%%*Y&&;!+&;)##[%!$[1%"
+ "%K)(%+5\"#;)\"(;5#\"[=$$KM#%[A%#[5!&KA##[9!%;I&#+U!%\\!#%<!\"%KY##L)#"
+ "%,%!&+]))\\-(&<1!&LA\"',5)\",9!%\\A#'L1\"%LA\"%LI\"%<M!%LA\"),Q'%M%!%M!!"
+ "%M1!\",Y!&M)!$]-'%])\"$]9\"%M5!%=9)%M9!%MA!&=E#&-A#%]Q!%]Q!&MY$)MY1"
+ "&^%%'-Q''>9!%^)!'-]!%^!!&>1\"&.5!&N9#&>-\"#N=!&.=!%>=#(NQ,'^Q(#NU!"
+ "$.Y#$^]!&?!!&O)\")O!)(/)(&?-!%/9!&?=!&?9!&?5!$_5*+?5+&OI!*_M(*@!%"
+ "\"?U!&OY!&P)!&`-!/0!!)P%!(0%!&P-!(/]!(`=#(`9#%@=!(@I!(@E!,@U+&`U!"
+ "*0U!*`Q+(@Q!)0Y#)`Q!+@I!/`Q!(`E\"(@I!)@E%*PY*(P-\"&`9!%@9!(01!(`-$"
+ ")?]&(@)!(O]#&P-!&P%!&P%!&O]!&?U%&/E%'_M!'_E!&/A%#O9!*OA!)?=('O1!"
+ ")_-%%/1!'_1''?!&+O!!(/%\"%^I%\">Q!$^U!'>E!$^I!%.E\"'NA'$^=!&.=!#>1!"
+ "$^-!&^-%%^-!%^%!#>%!$N!!%]]!(>-!%]U!'-Q&(-M!%=I$'ME$(-=!'-5'$=-%"
+ "%M-!&=5$%M1!%])\"&M-!&=)$',U##,U!*\\Y*$<Y!&LQ!%LE\"$<I!%<E!#LE\"%<=&"
+ "$,5!!L9#%<1!$,9!&<)%%L)\"%;U\"%L)\")<%.'KY#%KU#$+Q!#[=!&[I!&[I!#[I!"
+ "#[=!$[=!&K9(#[5!#K1'$;-\"\"[)!#+%\"\";!&#[1!$Z]%#ZU!$JU!#JI!#ZU!%:A#"
+ "%*I'#:E#$*5##J%!#J=!#J1!#Z-\"#J9!\"J-!#J%!%9U\"$*%#\"9M#%IQ##YM##IE$"
+ "\"Y1\"\"II!#I1%\"I5!\"YE\"%)A(#)I#$IM&#II!%)Q!'YY%#IY!$YY##IY!$IQ&#Z)%"
+ "$J1%#Z9!%*9&#Z5%#J=!\"ZE!%:E$$JM!#JI!%:Q'#Z]!%JM!%:Y'$*]\"$[%!$;%\""
+ "'K))'+-\"%K1($+1!%+A!%[=!%+=\"$[E!$[=!(;E/\"[9!$+Y!#+U!&[I$&L)\"%<%\""
+ "#,%!&L-\"%,)!%\\A(&<9!&<9!#<5\"%L=\"#,E!#,I!'\\A'$<M!),M\"%\\U\"%\\Y##,Y!"
+ "$=!!%M%!'-1\")-9+%]-\")M5#$=9!'-9'%]I!(-=!%ME!&]A!'MM(&]Q%&]Q!!]U$"
+ "#-].#>!*'.-!&^5$(>)!$^1&(.1*'.-!&^5%'>A!&.A!'^E\"&.A!&.Q!'>U!'NU,"
+ "&.Y!&?!!(?!)&?)!%/1'#O)!#_1!\"?-!'/!$&?9!%/=!&?E!%/A!&OI!'OM%)OI)"
+ "#_U!'O]%)?]!$P%#(/]!(0-!(0)!(05!+01!&`5!,P9!%@5!&`A!(PI!*0I\"(@M!"
+ ")PQ&(@U!+@Y!+P]!(@]!)PY%-@]\")`M!)`E')`I!&`=!%@A!%@9!#`9!)01$(01!"
+ "(P)\")P%!(0!!(/]!+@!0&OY!&OU!*OM!#OE!)_Q)&OM!'_=!'/=#'_9!+O1!\"?1!"
+ "(>]*)?)()_-1'/9$&?%!&_!)&.Y!'?)%&NY\"&.M!)^E!$^I!'^=)(N5!'>=!&.=!"
+ "%N5%&.5!%^!!%N5%'.%!%^!!%]]!#-Y$)-=!'-M&#]M(&=E$&]E&&M=%'-E'%M9!"
+ "&M%&&M5*%M%!']-!%M)!%<U!&L]%&L]&%<]!$<Q!&\\M#%\\I#&\\I'&<E%$\\A#(LI!"
+ "&<9%$L9#%<5!%<5!%<=!$,5!#<%\"%,!!%[U$#+U!%+Q!(,!!$[I!&[E%$[E!#[E!"
+ "$[5!#;9\"&[5!#[9$&[1%';-/$;1&$J]!#[!!#:]##Z]!$J]!#Z]!$ZM\"%:I($JE%"
+ "$:E##Z=\"#JM!%*5#$:5##JI!%J-*#Y]\"$J-%\"J!##9M!&)U,%9A&!YQ!$II&#)1#"
+ "\"I5!\"95#$Y=$\"I)!#9A!#9E!$9=%\"YM\"$YU'$IQ%')U%$9Y!$9]$$*!##J%!#J5!"
+ "$Z9&#J9!#J5!#JI!#ZA!$*A\"&:E!$*Q\"#JI!%ZM\"%ZQ*'*U,%:U$\"[%!#ZY!%+)\""
+ "$;%##[5!$+1!\"[1!%[=%(K=(';A,&[E%&+E&'+I%$;M\"%KQ#$,!!$KY#%;Q\"&;]\""
+ "$,)!$<)\"%,)!'<9!$\\M#%L1#(,=-$<=&%<A!$L9\"%LM!#<=&#,M!%\\U#'LA!%L]*"
+ "&M!&%M%!%]5\"$=5!%M-!&-9#%M5!%]I!%M=!%=A$%]I!'=9(%]M!%]U!'.!!%]Y!"
+ "(M]-&]Q!%^!!'.)!&>1\"&>!\"%^-!(^M'(.9$'>A!'N='*N5+&.I!'NM''>Q!%^U%"
+ "+>Y-'O!!&O-\"%_!$(/%#(_!!'/1$(/1\"&?9!$?1#&OI!)_A#'_M!(_I%&OM!&P!!"
+ "(OY*&P-!%?]'*_]!(0)!%0!!,@)!)@5&%@-!(05!%@=!&`E!(09!(@E!'@I\")`A!"
+ "(@I!)`U!&`U!*@E)(@M!.@]!*`]+(@M!/P=!&`M!,`A!(@=!)P=!&`5!+05!)P-'"
+ "(P)\"*P%,*`!-&P!!&O]!&OY!%OU\"&?E!&OM!*OM!(_Q$./A%&OA!&?9!&?9!&?1!"
+ "&?1!&O)!*O)($_!!)?%.&>]!'NY!&>U'&.Q!&^Q$&.I!(.U##N=!$^=!&.A!(N1'"
+ "#NA!%^1!%^-!$MY!(=Y!%^!!%]]!%-Y\")=Q!(=M'%ME!)=I!&M=$%MA!&-=#(=9,"
+ "&]5&%]5!+])4*-1%%]-\")=%\"$=!!&\\Y!%<U!&-)#'LQ!(\\U!#,E!&,E#%<E!&<=!"
+ "#<=!$,5!$,5!'\\1#%L-#&,%%$<%\"&,!!&<!!%+Y!%+U!$;]\"%+1&#;A\"\"[E!(+=!"
+ "$;M\"$[=!&+9&&[%&$[1$\"[-!#[%!%K%$$*U\"#ZY!$*Y\"#ZQ!$:M$%:I$\"Z5!#ZE\""
+ "$JE!#ZA\"\"Z=!#Z9\"\"ZA!$J-%#Z-\"$:%$&J%+\"I]#$)Y#&9])#IM!#IY!'IY$#IE\""
+ "!Y!!\")9\"$)1'$)E$$9I%#YE\"%IE##YA\"#9U!$)Y#\"I]!%)Y$#:1#%Z1*$*%##J)!"
+ "$J)\"#J1!$J=!\"Z9!%:5!#J=!%*I\"':Q$!*M!#JE!%ZE*$:]#&[!*\"ZU!#Z]!'+1+"
+ "$[-!$+-!#+5!#[5!%K9(%;=\"&KA#%[A!$[1!%;I&%+Y!';E+#KY+%+U!$+]!&,!%"
+ "$<1!%K]#\"L-'$<-\"%<9!&<Q$%<=!%LE\"%<A!'LE&&<Q$&,M#%LM\"%<M!#,Y!&L]&"
+ "&M%!&=%$)])%&]-&&M-%%]5\"(=9,#=9%&]A!(-A+%M=!%^)!&=M#&-U!&>!#(=Y!"
+ "&MU%%]M!\">5!'>)!&^-%%^)!&.9!'.)!&.9!'^=#$^=!'>E&'>I!&.A!'.U*&N]\""
+ "%O!)&.]!%O-#+O%!&.Q!'O%!&_5\"&?-!(O5*%/-!&?=!&?9!#OE!&OM!&OM!)?Q'"
+ ")?Y!&OY!*@)+'?Y$&OY!&OQ!(/]!(P-\"&`5!&`5!%`)#&`A!(@A!(@I!&`E!(@I!"
+ "(@A!(@Q!*0U!)0M#(@E!)`M!&`Q!%@Q!(@E!)P5')0E$&`=!,@1-&`5!#`!!(@)("
+ "(0!!(0%!&OY!(P))%@)!&P!!&OM!&O]!\"_U\"%/A!(/M!&OA!%/=!'_9'*O5-%/1!"
+ "&?)!(_-&$_%!&?%!&.Y!&>Y!&?%!&?!!$^Q!)>M.#^M\"&.M!&.=!$^=!%N=$&.5!"
+ "&.9!'^%)(.-%%>1#%^!!)M]!%]Y!$M]!&]]%%]U!%]Y!'-A\"%ME!$ME!#=9!$=1!"
+ "%,]#&M5*']5!#,]!%M1!&-!$&=%$&,]#$<Y!'\\I+',]#%<Q!)<I$&<M!',=((\\=("
+ "%<9!%<=!%,-!&<9%%L5#\",)!#\\5#%<%!'K]+$+Y!&KQ($;I\"%+E)%+M!'[I$&KA("
+ "(+A&&;U\"$[9!$;5'$+1!$+-\"%K1$$[%%#[!!$+)\"#JM!%:U$$Z=\"$*U\"#ZA\"#JE!"
+ "#JE!%ZA\"$*=)%*A&#J=!$:)!#J-!#*5&$J%%%Z!*&9U'$9Y!#IU!#IQ!#YI#\"IM!"
+ "#)1#$)5'#)9#\"I!!#9A!#)=&$9I$$)M##9M!#9U!#J!!#YY\"\"9Y##IY!$Z1&#Z1\""
+ "#J-!$*1##*9\"#Z9!#*9\"#ZQ!%JE%#JM!%Z5##JE!\"ZU!#ZU!\"ZY!#JQ$$[!%\";%&"
+ "$[)!&[-!%[1!$+5%&KE$$[=!'KA,&;A&*;M,(;I\"$KU#!+Q!%+M!%+Y!$+Y!%KY#"
+ "%,%!$,)!%,1!%L1\"%,)!%<9!&,9$&<=&)<A)%<E%%<]!&,Q#'\\Q\"'\\]!'LY&&]!'"
+ "$M!\"%M%!'\\Y!%--(']1!$=1!'=9(%M5!$M=!%MA!&=A$(MI#%]M!&]Q!#=Q!%]U!"
+ "&>!\"$^)!*>!%%^)!&.=!'.-!'.-!'>E!'>=!%^1!&.=!'^I-'.I%'.Q%#NU!&.U!"
+ "&^Y#*.]1$_!!&O1!&.Y!(_%'&O-\")/-!&?5!!/5!&?A!'?9*'_E!%/I!&OM!)?Q-"
+ "'?M*&?E!&/M%%/Q!(0)!(`)$,@-!)P)!'P1$%`1\"&`9!&`I!(@=!(PA!+0I-(@E!"
+ ")`M!(@M!+@Q'(@Q!(PQ!(@Q!(@M!&`=!)PQ&#`9!$@9\"&`=!(09!%@5!&P1!\"`-\""
+ "(0%!(0%!(`%$&OY!&OM!&OU!*/U+&OQ!&O]!&?=!)?E(&?A!&?E!#/9#%O5#&?)!"
+ "'_-'%/-!&.Y!\"NY!$_!!,/%#%NY#&.U!#^Q!&.I!).A($^E!%.Q!(NA,&N9#'>=!"
+ "(^!)$N!!%^)!%^1!&-U!%]Y!%^!!%]U!'-Q'(MQ\"%]I!&]Q!%ME!%M=%&]A!*-=/"
+ "&=5$(M1.%]5\"&=-$%M)!%]%\"%<U!%\\Y#$LU\"&<Q%%\\U\"&LQ&%<I!%LE\"%<=!'<=)"
+ "&,5(%LA\"$L9\"&\\1#%\\-#$L)'%<%\"#<)\"&;]\"&+M%\"+]!$;Q\"#[M(%;E\"&[=!%[A$"
+ "(;U'%[=!$[9!%+9&\"[1!#[-!&;)#%+!\"#[!!$Z]%%JI!%*I#'ZQ+&:](#JI!#*I)"
+ "\"ZE!$:A($JA!$Z9\"$*5##Z5\"#Z-\"\"J%!#:)'\"J)!$9]$#9I!#I]!&9Q&#YM#&9I-"
+ "$99(#Y)#\"I9!#99!#)5&#9I!%YI+%)U$#IY!$J!%%*!!&:)\"$)Q$\"J-!$Z5)#*1\""
+ "&*-$#J=!#J5!!Z9!\"Z=!$JA!$JQ!$ZE\"#JI!#ZM!%[!%$*Y\"%ZY%&J]$#[%!#[%!"
+ "#[%!#ZY!$*]\"#[)!#K9$&;5#$[=!%KA#&KE,#;U\"$;I\"$[]$&KU'&+Y%&\\%#%\\%$"
+ "&<1!&,)!%,-!&\\=##LA\"'<=!%<A!$,=!%LA\"%LE\"&<U$#\\I#$<Y!%<U!&\\U&&M%&"
+ "%<U!#=%!%]1!#]%#$=-!'-5'&-1#&-A\"'-A'$ME!&]E!(-E!$MM*(-U!#=Y!%]Q!"
+ "%]U!'.!!$N)!#>-!$^5!%^%!'>-&$N-!'^5)%^=&'>9!$^E!#^I\"#NM!(NE!+^U4"
+ "*NI$(.Q#$>Y$&^Q##O!!(_-,&?-!#O-!%/-'&?A!&?=!#OE!'_I!'/I#'OU%%/A!"
+ "(/M(&OU!&OY!'_U!(0%!(P)\"(@)!-0)2)P9&(01!'`5%(@1'&`9!)P9!(@M!(@=!"
+ "(@U!)`I!*0M((`M\"*@I#(@E!&`E!)`E'#`M!,0A2+@1)'@5#&`A!)@!!)P1'(0-!"
+ "'`)&+/U\"&P!!'P-$)?]!*_M4'_M!&OM!'OE&)?M-(_9%&OA!'_9!%/1!&?)!)/A!"
+ "&?5!&?)!\"?)!#O%!#N]!&?!!&.Y!&^M$&.Q!'>M+&^E$'.E%&.9!'>=!&^9$$^5!"
+ "%^-!*^)!'>)!\"-]!&^5$'.!!(=]!'-Q&%]M!$MI!&]=!#=I!)-E+#]I\"'=E\"%M=!"
+ "$=9!(=9\"%]!\"%M%!']-!&M)!&]!\"%M!!'<]$(,Y#$<Q!'\\A#$LA\"$,A!%<=!&LI&"
+ "%,1!$<E!&<5%&L1\"#,1!%+]!&\\%#%+Y!$;]\"%+Y!%;I\"$+U%&;Y\"%[A%&;E&$[9!"
+ "%[-!%;A\"';A'&[-!#[5!$[%!\";%\"$[%!!ZY!#+!\"$*]\"%JM!%*Q&%JE!#JM!%*E'"
+ "&*9+'JM\"$J5!#Z9\"#J5!#J1!#Z%\"#IQ!#Z%\"$:!!#9M!%)]!%)Y'$)]#$9M!#9M!"
+ "#)1#\"I5!#YQ#&)A(#YI#%Y9%$YM'#YM)#Y=##IM!#)U0\"9]#$)U#!Y]!%:1($:!!"
+ "%JA\"#J1!$J=%#J9!#*E\"\"ZA!#JE!$*E\"%JQ!#ZM!%ZQ\"!JY##ZY!#Z]!!;%\"$+-\""
+ "#[5!%[-)#[A!$[5$$;=\"%;=*$[E$&[A!%+M!%;I\"$+M!&+Q%%+Q!#KU#([]-&,!."
+ "$\\!$%L)\"&<-!%,-!%<=!)<!!%<5!\"<M\"&<A%%<I!&<M!\"-!!&<Q%%\\Y''=%($<]!"
+ "%M5!'=)(!-!!&M)!(-1,$=1!%M9!%]1\"$==$%M=!&=U#$MM!&]M!#=E!'-U!&]]%"
+ "#=M!'=]!'.!!%]Y!'=Y\"&.5!)N-!'.)%&.9!&^=$(>A&&NM\"&NI\"$^Y!$^Q!&.U!"
+ "$NU%(^Y!'O%'&?!!#O%!&?)!'O5!*O-(+_9!%/1!%/I!#?A%)OA\"&/=%'?M$&_M\""
+ "&OU!&_Y!&P1!&`%!(/]!)@)&)P%!)0)%(0)!)P1!&`5!%@I!)`A!)`=')@5%(@E!"
+ "(@E!(PI!(@U!(@I!(@A'*0=)(01!(@E!'P5$(09!%@A!'09!&P1!(@1((P-\")01$"
+ "(0-!,@%!)P!'&O]!%OI\"&OU!,OQ*&OM!%/I!)?I'&?=&'_I!*O=3&O=!)/5!&_1#"
+ "$_)!(/)#%/1!'/!$&.Q!'NY!$^U!'>U!%^Q%&.M!(>M+'.A%&.I!'.9&'>9!$^=!"
+ "%^-!#N=!%]]!(>)!'-Y!(N!-%]]!%]Y!(=Y,*MQ,&MY$&-I\"$-A$&]I!&]5&%M9!"
+ "'M5*#]-#&M5$)\\Y!(=5''-)\"&=1.%<]!&\\Y+&LU!(,U(*-!!$\\I#)<E.%<U!%LA\""
+ "\",=!(L-!#L-'%,1%',1$)\\-#\";Y\"',!!%+Y!&;Q\"$+]!\"+Q!%;M&%;I\"&;E\"!K9#"
+ "%;A\"%K=$\"[=!%[5!#[5!%;1'';E+$+)!%+1!#Z]!!ZY!#ZU!#ZY!#JM!\":I#$Z=%"
+ "#ZY!$*A&%:=!%Z5'$J9%#J1!#J%!#*5\"$*%#!Z5!$:!'$)Y#%IU##)Q#$IM%#IY!"
+ "\"91#!Y5!!Y9'#9E!$IE%%IE##II!#9I!#IU!#YY\"$)U#$9Y!$J%%!J!#$IQ\"!Z)!"
+ "#:-#$J1!%Z5&%J9\"$J9!%ZA\"#Z=%\"ZI!#JE!$JE!$*Q\"$*U\"![!!$[!%\"ZQ!#+%\""
+ "$+)!#[5!#K1$#+-\"&+A\"%;1\"&+A\"&+=\"$[Q%&+I!';U'%[E)%;]\"%;Y'%K]#&,!!"
+ "\",)!&<%&'<1!%,-!%<5!&L5&$LA\"$\\1#%<A!&<E%&LE&'\\M&$<E!%LU!%\\Q#&M-%"
+ "%]-\"%<Y!%]%\"'M!*&=-$$-1$%M5!'M9$%MA!%]Q!(-M!&M])%MA!&=U-%]M!&N))"
+ "\".!!'MY#'>!\"%^%!%^)!%>-#'>5!&.5!%^-!(NA!'>9!'>I!%.I!&.M!'^U'&.Q!"
+ "'_!('.]*(^],$^U!(O-*&_=\"&O-\"&?1!#OA!(_1+)/A!&?9!#OA!'_I!&OU!&OY!"
+ "'_Q!&OM!#_Y!&P%!&OQ!)/Y%(0!!(01!'@1#(01!(P%\"%@-!'0=!%@=!(09!$@E\""
+ "&`5!(@E!(@E!*PE+(@A!)`M!(@=!(@A'\"@A!&`=!'@=#+05!)P-!(05!(0-!)@%&"
+ "&OU!/0!!)0%%%/]!&OU!&OU!(_U%#_]!)?I!)/A!*_5)&_Q\"'_9!&O5!'?5%&/-%"
+ "'O5!'?)%'O1!&?%!&.M!&.A!&.Q!#^Q!$^M!$^M!#NI!&>M!'>E!&.=!&>=\"(>Q%"
+ "&.)!%^)!%^%!'.-!%^!!'N%()M]!%]Y!%]Q!&-U!%MA!&]E!']5!%MA!'M-*)==!"
+ "%]1\"%M-!$]1\"%M%!#,Y!&-%#']-*(,Y,%M!!%\\U#%LM!#<M!%LE!%<A!%LA\")<=$"
+ "!L9#'L5'%<1!&L1&'L1+%,%!),)%&L!##\\)#%+M!&KU#$KQ#\"+M!$[I!$[I$$[9!"
+ "%+A!%[1%%[A)%+9\"![=!%[))#[)!%;%##Z]!$JY$$:Q#$:U#\":M\"$*M\"\"ZY!$*M\""
+ "#J=!$:I##:A##Z5\"\":5\"#J-!\"J-!#JA!!Z%!$*!#\"IU!#)U\"!YY!#)M##9M!$)=$"
+ "$)1$$)1'%9=%#I=\"#IA!#9=!#9A!#YI\"\"YM!#9A!\"II$#IQ!%:%$#Y]\"%J-&$:1!"
+ "$:%!#J=!'J1'$Z9\"#ZQ!$:1#%*M'&*E##ZM!$:9##ZY!&;!#%J]!#[!!$*]\"$[%)"
+ "&[%&$+%\"\";1\"$+A!'[-&$K=$$[1!%+9!$KE#$[I!#+M!$;Q\"'+M!#KU#&<!&%,)!"
+ "&<1!%\\)$$,-!'<!&#,!!'\\5($<-&$\\=#%<A!\",M!&<I!$\\=#(LQ!$<U!%LY&%-!$"
+ "(=!)$]-\"#=!!&,]#%=%*%M1!%]-\"%M5!&]A%$=9!&]A!'=A(#=E!%]Q!&MU$#=M!"
+ "&]Y%$N!!%]Y!$N%!(N5&&.9!&>1\"'N1()^91&.E!)>E$&.E!&.I!'>9!&.M!&.U!"
+ "$^E!&.Y!&.]!&?5!(?-)&?-!$_)!%/1!$?1#&?=!$_)!&?E!%_E$+OA%%/Q!'/Q#"
+ "(_Q%&OQ!'_U&&O]!(/]!(0!!&`)!(@%!)P)!)0-%)P5!&`5!(P5)'/Y\")PA&&`9!"
+ "&`=!(`A#(@9'#`A!(@=!(@A!(P=\"&`=!(09!#`9!)@9%(05!&`=!(05!(0%!+01!"
+ "(0%!)@!&&OY!&P-!&OU!(OQ*)?Q!*OM!)/I,'_5!%/9!(/=\"*?9!(/5(%/1!&?1!"
+ "&?A!#NQ!&.U!'O!'&.U!(.Y)$_!!$^I!%>A#$^I!'>E&&>E!&.A!$^5!&.1!$>-$"
+ "#>1!'.1!%N)*%^-!#=Y!%]]!$MU!'-U!\"MU''=U'&N-$#=I!)=5\"&-A(%]I!$]A\""
+ "&M)!%MA!%MA!%=)$%M)!%]!\"#=)!%<]!%<U)&<U%%<Q!',Q-'<Q)%<E!#,A!%LI\""
+ "&,9$%LI\"%L1\"'[]$$,-!'L),$L!#%<!!&;Y''L%,%+U%$KQ#%+M!%;A\"$[5%$KA$"
+ "$[-%$[E!#+1\"$+=!%+1&$K)$#[!!#[)!#Z]!#ZY!%*Y'$*U&!*Q!$*Q\"#JI!\"ZE!"
+ "&JA*#Z9\"$Z)&#Z9\"%J9\"%Z)#\":-#\"Z%\"#)M#$J-%%J!#%YY(#IU!&:%\"%9U%%9I)"
+ "#9=$\"X]\"\")9\"#Y=&#9A!$)A!#IE%#YI#\"IM!#9U!%)U($IY&'I](#Y]\"$J%&#J)!"
+ "#:-##JA!%Z5&#Z9!#Z1\"%J5\"#*9\"%*E'$ZU%$*M\"&[!*#ZQ!$*Y\"$*]\"#ZQ!$;-#"
+ "\";1\"&K9($K5$#[1!#+1!'K9$#+=!&+A\"'+E.$[I!$+Y!$+Q!%+M!&KY'%;]!%,!!"
+ "(+Y!&<-!%,%!$\\-$&,1%%<5!$L5\"%,=%&<M!$<=!%LA&(<M$&,]##,U!&LY!&-%$"
+ "']%!&-%$%<Y!%M1!$-9$)--!%M)!$=9$%M1&&]=&$ME!$MY!#=A!%]M!$MQ!%]Q!"
+ "#]Y\"%M])$MU!'^-#(>)!'N-\"%^1!$N1!&.9!'>=!&>=\"$^E!&>E\"&.]!&.M!$_!!"
+ "'>M!$.Y\"&.]!'NY!&?!!&?!!%?5\"#O-!&?=!&?5!$?=#)/=!&?A!'_A!)OI('_I'"
+ "*OM!%/Q!&?E!&_Y!(/]!%?]!(@!!'_Y!)P)!)0-%+P5*)@1&&P)!*P)2(P9\"*050"
+ "&`9!(P=\"%@9!&`9!&`A!(`9#&`E!(`5#&`9!!0A!(@-!&P1!)P%!)P-!%@%!(0%!"
+ "&P!!&O]!&OM!)_Y\")?U!&OU!%/M!#_M!)/E!*OI!'OE&'_=!(O9*%/5!$_)!#_-!"
+ "%/1!&_%(#O-!#O%!(/!(&^Q#$^Y!+NY'&^U$+NQ(&.=!#NI!&.9!&.=!&^E$&.-!"
+ "'>1!%^!!'.=&&-]!&.!!$N)!%]Q!'=I(%]Q!%]M!%]M&&]M+$MA!&-E\"$=1!&M9$"
+ "(-)'%])\"%M-!%M1!$])#&M!&&,]#%])\"'\\Y!%<U!(LM&%<E!&\\I'%LE\"(LA&&LA!"
+ "&,9$&,-$&<1!%L)#'\\),$,!)%,!%'+Y!&+M%%KU#%+U!\"[A(%+=&$[I!$[E!#;A\""
+ "$[I!';9(%+5\"&K=$%:]'([1\"$JY!\"[%!$+!\"%[!!$*]\"'ZQ/$JI$$ZM%\"ZI!%:E$"
+ "$*-##J=!\"Z5!%Z9*#Z9\"%:A(#J-!$Z%&$:!!#J!!%)]$&)I%$:%$\"YQ!$IQ&%YM("
+ "\"Y-\"%95&\"Y=\"\"YA\"#91!$Y9'$IE%%9M%$99%\"IM!%Y]+#*!\"#YU\"#J!!%J-%#J)!"
+ "$:-##*5\"$:%$#J5!$JM!#JA!$:E#$:M$$JI$#ZQ!#JM!#ZU!#ZY!#[)!'*Y'!;1\""
+ "$;-\"#[%!#[9!%+5&%;5\"%;9\"%[=%$[1!$[A!$[I!$;M\"$+M!%;U\"'KY+&+]%%,!!"
+ "%;M\"',!!&<!!%,-!*L!'%\\=#%<5!%<=!%<U!&\\Q\"%LI\"#LQ#&<Q)%\\U#(<U$#,U!"
+ "%]!\"'LY!&=)$&M%%)])*%M1!%M5!&-A\"#M=&(-A!$MI!(-E!%M=!%]I!&MQ$'MU-"
+ "']Y$'=Y-%^%!&^%*%^)!%^-!'>A!#NA!&N5#$^9!&.=!&.E!&>I!$^Q!&^M$\">Q!"
+ "'_%!'O%!(O!%#^E\"&?!!*?)!&?)!)/%((O)*&?9!&/1%%?1\"&OI!'_E!)/E!(OE$"
+ "&OM!#_Q!#_Y!&P!!%?U!&O]!)@!!'_Y!)P).&P1!&P1!(0-!)01$(05!'@-#%@=!"
+ "(09!#`9!&0E#&P1!&`9!(09!)P5!(`5#*`)!(P1\"+01!,`-)*P%%)P)!-`%!+0)("
+ "(0%!&P%!(OY*(O]#&OU!'_I'&O5(&?E!'_E!\"?9!'/E)&?=!(?A)&?9!)?5.$_-&"
+ "#O-!&?!!$_%!&.Y!\"NY\"$.Y\"*>M((.Q)&.I!&NI#&.M!'>E&#NI!)^A!%^1!#>-!"
+ "\".1!%^)!%N-%'N)#&^%%!]]$%]U!%]Y!&MQ$&=M#)]]\"#=E!%MA!%=A$']=%&-A\""
+ "&M-!%M=!%=!*'])!&M%&%M!!&<U%$<Y!\"<U!%\\U\"#LQ#!LI#'L5+&\\E\"%<E%(\\=\""
+ "$,9!%\\E((L1'&<1!$L)#%,-!&+]%%<!!(KU#%+Y!%;Y\"&KM+#[M%%[I!%;E\"%+A&"
+ "&+=!'K5(%;5#%;5##[1!#[-!#K)$$+-\"#[-!!*Q!#Z]!&*M+%*Q\"!ZM!!ZI!\"ZM!"
+ "\"Z9!$*=#%*5##*1&#Z5\"$*%##*5\"#YQ\"%I]#$:!!$)]#\"IY*#YM##IQ!$)M$\"I5!"
+ "#I5%$Y5*#I9(\"Y9\"$)9$\"YE%\"II!!YY$$)E$#9U!%IU&#)I#':%&$:-$$*%##J1!"
+ "\"*5\"#J1!\"J1!#Z9\"&:=,$JA!$:A#$*E'$JU$%:A!$:Q#&JU)%JY!(+%'%;!'$J]$"
+ "$+)\"\"[)!\"[1!![%!%[5!%+M!%+=\"&;=''[E$&+M%!;U\"$;Q\"$+M!&+]!&[]#&+]!"
+ "&L!'%<%!)<-%%<-%&<!!'L1\"$\\9('<9!$,A!&\\E'\",M!&,Y#(<=.%LQ&%<U!\",Y!"
+ "#L]\"&]!\"%<Y!'=-(&-%#%M1!&-=#%]M!%]I!&-=\"+MA&'-E''ME)%]M!%]Q!'MI("
+ "\".-!%^!!&]]%%^)!'N-\"%^1!%^1!%^A&#N5!&.E!'.A%\".1!&NI#&.I!&>E!&.Q!"
+ "'>Q&'>U!&?!!&.U!\"?!!)?!\"&?)!&?1!&?1!&?9!&?-!$O)$'_=!'_E!%?A!$/U("
+ "&_U!&O]!'_M!&OU!'/Y#'_Q!&O]!'0!\"(/]!(0!!(`-$(01!)/Y&&P%!,@1!(0-!"
+ "&`9!&`5!(0-'#0-#&P1!(P5)&@1%+P=0(01!)PE&(`-$*`)!*`)!&P%!(@1'*_Y!"
+ "%/]!&OU!'/]\"&OI!&OQ!\"?U!&?9!)?I!'?I$)/A!'_=!&_A\"\"?5!&^]#&?-!&.Y!"
+ "(/=.#O%!'O%!&_-#(.Y)&NU\"&.Q!$^M!&>Q!%NI$'>E!&.A!'>9!'^9#)>5%&.9!"
+ "$^A!$M]!#N)!\".%!'>!\"(M]'%^-!&MU$%^!!']M*%ME!#=E!%MA!&]=!%-=#%M9!"
+ "&]5!%]1\"%M1!(--+*M%$']!!*-%!(\\Y&%\\Y#'\\Q+%<I!&LU!%LI!'<E*$,=!%L5\""
+ "&<)&%<=!%,1!';U&$+]!&;]!(,%.%+]!%;]\"&+Y%%L)\"$[I$$[M$\"+U%%+=\"%;9\""
+ "%;M\"%+=\"%;9\"&+5&%[1!&[5!#[!!$+)!&+!+%*Y&\"ZY!%*A'$*Q\"':A%#ZI\"#J9!"
+ "$ZA\"#*=\"$J9!#J5!$J5!\"Z9!!*-!\"IY!#Z%\"#J!$#9U!$9Q%#YM#$IQ%'9M'$)I!"
+ "\"I-!\"95#$I5&&)5)$9A(#9I!#YM#$YA'#YM##YI#%)Y!!)Y!$Y]#%Z-#!*-$#J-!"
+ "$*1\"$:-!#J-%$J9!%:5!#Z=($:E#':E)$ZI)!ZM!#JM!$JY$\"JY##[)!#[!!![!$"
+ "&+)\"$;)#$+)!#[9!&JY!$[9!(;I&'[A!%[E!%;Q\"&KM($+]!%+Y!'[U$%+Y!%KY#"
+ "'<-!$\\!$%\\)##\\1$%,1!&<5!&<A&'\\9#$LA\"&<E%$\\Y#&LA&&<M!&LY!$<E!#,Y$"
+ "$L]!&M!!%M%!(=-(\"]%$%]1!%=I(\"-5!&-9#%M=!#]=(&]I%%]Y!%]U!%]I!%]U!"
+ "&=I#(>%!%]Y!#=]!$N%!&N1#%^-!&.1!$.9#)N%!&.=!%^=%'>E!$^I!$.U\"$^M!"
+ "'NU'$^U!'.Y%$^]!'O!!&O%\")/-!&O)\"'O-&#O5!'/!$(O9*$/9\"(O=**O=!)/E!"
+ "'?I$#_Y!&P!!%/Q!\"_U\"(/U'&`!!(/]!+05!(0%!'@)#)P)!*`%!)P1!(@-!&P1!"
+ ",@-!(P)#*@1++01!%@1!%`1)(0-!(01!(`-#(P5\"&OY!(01!(`%$(P-\")?U!&OQ!"
+ "&O]!&O]!&_U!&OQ!%/Q!&OM!)OA)*_M-(OA$&?E!%/9'&O-\"'O5!(O9$#O-!&?)!"
+ "$_%!&.Y!&?!!)?%('NE!'>A!$^U!&.M!&.E!(.I$'>E!&.Q!&.=!(>A+(>1!&.9!"
+ "*N-%%^-!&.%!\".-!%^!&%]Y!$MY!(]U#&>!#']E*&-I0%MA!%M-!'M5$&=9$%-9$"
+ ")]93%M-!%M%!$=%!&,]#%M!!%<Y!',Y#(<U-',Q#&LQ&%<I!#<E&$L=\"%\\A#$,5!"
+ "!,A!%<-!$<-!%<5!%,)!%\\)#%<!!%+]%#+U%&+U%%;U\"$KU#\"[I!&+Y%%KE#%+Q!"
+ "$;=\"&K9$$+5\"%+)\"#[-!#[)!$[)!#[!!$;!\"%:]$$*Q\"%ZQ*$*I\"#ZY!\"ZE!#Z9\""
+ "\"*A!%Z=#%*1'#J5!$:1'!*9!$Z)#$*-#$Z%\"#I]!\"I]!$IY\"#9I!#9Q!#IY!!YE!"
+ "#Y1#\"I1!\"I5!!)=!$I=#\"9A#$I=*$9I$#9M!&IQ.$9Y!$IQ%%J!)$Z!&#J%$$J-\""
+ "\"J)!#J-!!Z%!%:5!!:9\"#*9\"$:U$$ZE\"#JE!#ZQ!&JQ*#+)\"\"ZY!%+!&#[-!#[)!"
+ "#Z]!#+%!\"[-!%[5!$KE#$K=#%+5\"&[=!$[E!%;I\"&KM,'+M!!+Q%&;Y&%+Y!'[]$"
+ "$+]!&L-'%L)\"&\\-()L5+%<5!%<-!',9)%<E!&\\9(%<=!%\\I#%<M!(<Q$&LQ&&\\Y'"
+ "%<Y!&LQ!%\\U\"'M)*%M)!&]-&*-!!(=5,%M9!&]=!&]E!&]E!&=E##==!'-I&%]I!"
+ "'MY#%]Y!%]Y!#>!!'>%'&.)!'.-!'>)''-]&&.5!&N=#&.=!&.A!%^=&'NI''>M!"
+ "&.Q!&.I!&?!!&>Y!&?%!)O!$&?%!$_)!%?-\"%/1!&?9!&?5!'_M&(/=(&?A!)/E!"
+ ",?E\")_U\"*_Y!'OI%&_U!)?U!&?E!'?]#&OY!(0%!&OY!+01!,`)#)`-\"$`-%,@-!"
+ "&`5!)P)!&`=!+@5('`1,.@-6(@-!,0-&'@)#(0)!*P)%'_U!+O]$(0!!\"?Q!(P!)"
+ "!/E!'0!\"&OQ!&OU!%/M!%O]\"\"_E\"'OE&'?I$'?=$&?9!%/5!%O5#&O1!'O)&&.]!"
+ "&?%!(?!$(^]!&_!#%.Y!&.Y!'NQ'&.Y!#NE!&^A$&.A!$^=!(>A+&.9!&.9!#NA!"
+ "'.)!'.%&$N)!(=],&-Y!'-Y&&-]\"'=U(%]Q!%^!!%]I!&=I$\"]A#'-='%M9!%M-!"
+ "'=%(&-)#'=5$*-)!%M%!&=!$%,U)&<]$%LM&%\\Q#',M#$LI\"&,I#\"<1\"\"L=#'<=%"
+ "%<9!&<5!%\\1#%,%!%K]#%,%%%<)!%;]&#,!!%;U\"$+U!\"[I(\";=\"%[A%%[E!\";A\""
+ "%KA#$K=$%+1\"&+1*'+-/%[))$[-$#ZY!#J]$&JY!$*U\"#ZU!$*I&$ZA\"$K!$#J9!"
+ "\"ZA!%Z=#%Z9\"$J5%&:1!%:-(\"J!!#J%!%J-&#J!!%*%$%YY#$)M##YU\"#9A!&9I*"
+ "#Y-#\"I5!$)='\")%\"#9=!!IA##Y=#\"II$$9I$\"IQ!#)]&#IM%$9]$%:!$$Z-&#J%!"
+ "#*%\"#J-!%J5\"#J9!#JE!$*=\"#JI!#:M#$JM%\"ZQ!#[!!%:]'#*Y\"$[!)\"Z]!\"ZU!"
+ "![1!#K5#%K1$&+%'%K9($[=!%;A\"%K=#&[I!';I\"\"KQ#$+M!$+Q!'L!#$;Y\"%+U!"
+ "'[Q-%<%\"&,%)&L1&&\\1(&<5%#<1!%\\%,&<=!%\\A#%LI\"&,Q#&\\M\"%<I!%\\U\"'\\Q&"
+ "$L]\"%M!!&M%!'-)\"&])&%]%\"'=5(%M)!$]9\"%M=!%]A!)=E!%]I!&=Q(%]Q!'MU)"
+ "%]Q!&-Y')>%%%^%!$N%!%^)!'^-$&N1#&.)!&^5%&^%%&.=!'NM'(>E+'>I!&NI("
+ "(^Q!(>I%&.Y!&.Y!(^Y!'_!!&?!!'/))%^Y%'_A!#O1!&?=!&?=&&O=!(?=**/5+"
+ "(/E!#_M!&OE'&OQ!)?I!&OQ!'OM%&OU!&O]!%?]!)@%&*_Y!%@%!*`%!)P-!(0)!"
+ "*@1$(/]!\"@9!&P-!*`1&,@)!(0-!&P!!)P%!*`%!&/]$(/]!*@!%&_I\"(/]!#_Y'"
+ "\"?]!%/U!&OQ!*_Q(&_I\"%/I!'/E*(_A%&?A!&?=!&?9!'O5!&?1!)/-!(?-)\"?)!"
+ "'/%$*/!!&.U!&>]!&.Q!'NY'&>Q!'.M%&>Y!&.E!#NI!&.9!'>9!&.%!&.=!'>-!"
+ "%^-!'.%%'.%%$N!!%]Y!%]E!&MU$$MM!(-U*+-I)$MI!%ME!%ME!#=5!%-5$&-1#"
+ "&-=\"&M5%%=)%#=%!(-)\"%M!!'-!(%\\Q\"#LE\"&LQ&$<I!%<U!(\\A0'\\I&'<=&$L9&"
+ "(\\=,&<)*$,1!'<)!%L%'\"<1\"%\\%#%+Q!%+U!%;U\"$KY#)+M!$[I!%[I!%;U&%+A!"
+ "$+=&$;5\"\"[=!\"[!!#[!!&;-(%;%'#Z]!%:]'#ZY!$K%'$*Y\"&*Q'&JI*&*A(#:M#"
+ "$J5!#Z=!$:9#$J5!#Z)\"\"Z9!$*1\"%)]!#9U!#J%$%)]'\"9U#\"I]!$9Q!%9M%#I9\""
+ "#)1#$(]$\"Y5\"#YI#&91'#YA#$9Q!#9Q##YM#&9Q*%YU+$Y]#$)]##J%!#J!!%:1$"
+ "$Z)\"#*5\"\"J1!#J5!#J-!$*)#%ZA*$JE!'+!/%JA%$:E$!ZU!#ZU!&[!&$J]!$[-!"
+ "$K!$$+)\"#;9\"$;1\"#+5\"$[%!$[-!%;A\"'K9$#[A!$[E!$[Q%$;Q'&;U'%;Y\"&;]\""
+ "!+Y%%\\)#$<%!%\\%$&L1\"%,1!&L)#%<9!$,=!$<)\"%L=\"%\\I##,E!&<M!(\\U&&,Y#"
+ "$<U!*-%&%M!!']%+%M)!%M1!&=1$&M)!%M9!%]Q!*MA,%]I!%]Q!%]Q!$MM!%]I!"
+ ").!%%^%!%]]!#>!!%N%%\".%!&-U!'.!!&^1%&NE#&.9!'.=&&.A!&.E!)^E&(.Q$"
+ "+>M!'NQ!&.M!&NY\"&?!!#N]!&?!!'/-$(_)!'O-&%O1#+/%%&?5!#O=!$/E\"*OA!"
+ "'_A!(?U\"&?E!'_E!&OU!&OQ!%/U!#_M!$@!\"'_Y!&O]!\"@%&&`-!&P)&#_]!(0!!"
+ "(0%!(0%!(0!!&/U$&P1!*0%*(0!!)P%!(01!+/]((0%!&`!!(/]!&OY&%?]!!/]!"
+ "&OY!$OU$&_M\"&OQ!%/E!)/A!+/A#%O9#&_9)&?5!&?-!&?5!&/-&$_%!&O)(&?%!"
+ "(/!.&.Q!&.]!&>Y!&.]!&.Q!&.M!).I\"'>I!&.I!&.A!#N=!).=#$N1!#>)!&.=!"
+ "'>9!%^%!%^%!&]]%%]Q!%]U!#]]\"$MQ!$]E,#=U!&]A!$MQ!%ME!%M5!#-9$%M)!"
+ "%M1!$]9')M)2&=)$#=)!&<]$%<]!&,I#&<U$'LU!'L]!&<A%&\\E\"%<I!&<E%&<9!"
+ "%<5!%\\A#%,%!'<-!#L)#%,!!$+U!\"[M$$KY'%;U\"\"+Q!$KM#%+U!&+E&%;E\"$+1%"
+ "$[E!&+9*#[E!$;)#$+-)#[!!#[%!!+!$$*]\"#[%!$:M'#ZI!$ZM%!ZY!#JI!!ZU!"
+ "$:E##J5('*9)%J1\"$J1%&*-%#J!!%*)'$*%#%)Y''*1-\"J)##)Q%#9Q!$*!#$II%"
+ "#9)'\")5\"#Y=#\")=\"$9=%$Y='\"9M##YI&#IY!%I]&!YQ!#*!#\"IU$#YQ#&J!#$*-#"
+ "$J=!#Z-%$:)(#Z-\"$J9!$*M\"$:=#$Z5\"#JE!\"ZI!%:M+$*A\"%J]!#ZU!$Z]%#+!%"
+ "$*U\"\"[!!%;-'#+1\"$[I!&K1(&K9('[=!%+E!%;M\"%[I$$[I!&+U!&[U)$<%\"&,!!"
+ "%,!!(,)-$<)\"%<%\"#<)\"&,1%(<1*%<9!%<=!&<A%%,9%'LE!$LU\"'<Q)%<Q!$<M!"
+ "$=!!#<]!%M!!'=%$%M%!%M-%%])\"&=1$&]A!$M=+&=E$&-A#&=A$&]E!%]I!$MQ!"
+ "'.!%)=Y!&]M!(-]*%^!!&.)!'N-(&>!#&N-$%^-%\".%!&.=!&.5!%N=$&^=$&.E!"
+ "&.Q!&.Q!).]-'^U().Y!(^]!$^]!&?!!&?%!&?-!&_-#&O1!'O%!'_5''O-!%O-#"
+ "&_A\"*/U+&?E!&OI!'OE&&OQ!(/]!%/]!&_U!&OU!&OY!&OQ!&OY!*0!#)?]!&OY!"
+ ")`!))@!!)?]!(/]!)P%!%`%#)?]')@!!(_Y$&O]!,P!0*?Y1&_Y!&OY!&_Q!(/Y'"
+ "&OU!&OI!\"?I!&OQ!'_9''_9!&?E!%/=!&_1\"&_5#+?1%&^]#&?-!&?)!*?1!&?%!"
+ "'.]%'O%!'NY!*N]\"'.Y%&.M!(^Q!$.M##NE!&.A!'>A!#NE!&.5!&>E\"'^-#%^)!"
+ "%^1!%.1')M],%]]!#^!\"(=Y!&]M!%]I!%]M!$MI!&]E!)-Q*%M1!%M5!)-5&%]5!"
+ "#=1!$=-!'-1''])!'-!(%<]!%\\]\"&LU!%<Q!%]%\"%<=!$,9)$<M!%<A!$L=\"$,=!"
+ "#<-\"$,A!&<)&%L1\"%L)\"(<%/$<!\"%KY#%+Y!&+U!&+Q!#KU#&[E!$[E!&KA(#[=!"
+ "%+9\"'+=&$+5\"$;1\"%K1((+)'$;%#$+!\"\"ZY!$JY!#ZU!#ZQ!$*M\"\"*I!\":E\"$ZU%"
+ "#:E#$:M'#*=\"\"J1#\"J!$#J-!$:%!#Z)\"&Y]!')Q'$9M!$)U##IU\"\"IQ!\"IY!#YI#"
+ "\"Y=\"%95&\"I9!#Y9&$YQ#$)I!$9M!#YM#%IQ'%IU-$)M$!IU##IY!\"9]#$)]##J!!"
+ "$J)\"#Z1\"#Z1\"$:1#$Z9\"!*9$\"Z=!$:=##JI!$ZE\"%*I\"$*U\"%[)!#ZQ!!ZQ!&+!*"
+ "&[%&#[1!%[1)\"[=!\"+%!$[5!%;5\"%+=\"$;A\"%;I\"%KI');M+$+Q!#+U!%+Q!%<!\""
+ "',))*+Y%&,%!$\\)#%,-!%,-!%\\5#%L-#%<1&&<A%%<E!%<I!&\\M'%L5&&<M!#LY\""
+ "#<M!%\\]\"$LU\"#=)!%<U!\"-5!']9+%]1!%]A'%M1!&-=#$]5'#=I!&]Q!%-]#%]M!"
+ "'-M'%]U!%]]!%]Y!%^!%%>%#)^)!%.)\"$^9!%^1!%N5%&>E\"(NA!&.A!&.E!\"^E#"
+ "'>M!$^M!&.Q!'>M!*NU.\"_)\"*.]!(^U!,/%/'?)%'_-(%/=!&?5!'/9#&?9!&?9!"
+ "*OA!&?A!%/E!&?A!&OM!)OU.'OE%'?M$#_I!,?Q\"'_U!&P!!\"?Y!\"?Y!*/]#&O]!"
+ "(O]*(?](&P!!(0%!(0!!'@!#*OM!)P!!&O]!'P%$*OU2&OY!&OY!&OU!'@!##_Q!"
+ "*OQ&&OI!%OM\")/A!(/E!&_Q!#OA!'O5!'/A#*?)!&?-!&O-\"&>Y!&?%!&_1\"(/!("
+ "(_%!%.Q!'NY!&^M$(NQ+(>I*(NM!&NI#)^E!%^1!)N%!%^)!&.5!(>%!&>5''>-'"
+ ")=Y!'.)!%^!!&.%!'MU#$]M!%]U!%]U!&-I\"%]I!&-E\"'-A!$M=!%MA!&=5$'M=$"
+ "%]5\"&=-)$<]!%M9!%<Y!(,]\"$<Y!%M!!&<Q$%<M!%L9\"&<=&%<E!\"\\=$%<=!$,A!"
+ "'<5%%<5!%L!#%;Y\"&L%')<!%&;]\"$<)!%+U!$+U!$[Q$$KM#%;5\"%+9\"#KA#&[E!"
+ "#[9!'K=-%+1!#[1!&+%\"\"[)!#[-$\"[)!#+!\"$ZY%%+%&$ZQ!$JE!#*A%#JE!#Z=\""
+ "#JM$!JA'#J=!#ZA\"!:-\"#J%!#Z-\"\"J%!#J%!&YY(!Y]!\"YU%#YQ#!)E!\"YI($)I!"
+ "#99!\")%\"#95$\"I9!%9=&#9A$#YE#\")A\"#IQ\"%9M%#)Q\"&YQ$%:!!%I])$Z!'#Z%\""
+ "$:-#$*-&#J1!#J=!#J5!%J5)&:=,#*E%\"Z5!$*M\"%JU$&*U'%:U($+!\"\"ZY!%;)#"
+ "#[1!#[-!$+-!$[-!%+1\"&+5&%+=\"$[9!'+1\"%+A!$+I!$+M!'+Y!#+U!$,!!#+Y!"
+ "%+]!%[](!,-%&\\-(%\\%$%<)!%L5\"#<=\"%L=\"&<Q$%<]!%LE\"'LI*&\\M'%LE\"$\\U#"
+ "&LY!'<I)%<U!%]%\"%M)!'=9#%-%$&=-$&-E\"(-1!%M=!&-A\"$ME!(-I!']I*%]M!"
+ "&-M\"'-]!&-]!%]Y!&.!!%]Y!(>)!$N-!(>)%%^1!'>5!'>-'&.A!'>I!)^A!$^=!"
+ "&.Q!&.M!&.M!&?!!&.Q!&?%!&?!!#O!!&?!!'?1*#O-!&?)!#/5$)/5!'?1*&O9'"
+ "(_M0(/=\"&?A!)?E!)_9*'/I#&OI!&_M\"#_Q!(/]!*_U!'_Y!)?U-&P!!(0-'(/]!"
+ "'?Q$$?]\"&O]!'P)$(/]!'@!$+OU+&OY!&O]!'OQ%&O]!&OY!'_U!)?I!&OQ!(OM*"
+ "+/I)+OA+&?=!)?E('_E!%/=!&_=\"%_=$*/5%&?1!'?)%&?-!(O)0'O!!&?)!'.]$"
+ "&>]!&N]\"&^U#$^M!$^Q!&NE#'O!!*.E2&.Y!'>A!'N=,%^-!&.5!%^1!'.1!).)*"
+ "%.!\"(^-#']Y$%]]!%^%!'-U!%]Q!&=Q#&]A!'MI))-A+%=A$(==\"$=5!%]-\"%]1\""
+ "$=1!&-5#%-)(\"])$&M!%$L]\"%<U!%,U$$<M!(,Y\"$<A!)\\I+%LA\"#LI#%,-!%,-!"
+ "'<%&%,1!$<-!'\\-##<!*#,!!#,%!%,%!'+]!&[U(&+U%$[Q%%[I!&+U%$[5!%[I!"
+ "$+9\"$[A!&+1\"$[1!![%!$;)\"#[%!!Z]!#Z]!$JE($*Q\"$*Q\"%JM%$:M$%JE%#ZA!"
+ "#ZA!#JM!\"*1\"$JA$#ZI\"%:5!#Z%\"&J%#$I]\"$)]#%)]$$YY'#IY!!I]##9I!$IU%"
+ "\"I%!!)%'$)9!$)9!#9A$#)=#$9A!$9E!#II!$YM&#YM#$II#%IY'#IY!$)M#!*%!"
+ "#:%'#J-!#Z-\"%*1'&ZI'$J1%#J=!%*A&$*U\"#ZQ!\"*Q!#JI!#:U\"\"*Y\"$[!!$[!!"
+ "#[!%&[!&&K)!$K1$$;)#&;A'&[5!%[=!%+E!%[A!%[U$&+I)$+I)&+Y!%;U\"$[Y$"
+ "&[M)%;]\"),%%#,)!#,-!&<1!%<=!\",5!&<9%)<=2$,=!%<E!&<=!&,U#%\\Y\"&,I$"
+ "&LY!$=!!&=!$%M)!%<U!%M9!'-1'%=5$%M)!%M9!%]A!)]E)%ME%%]I!'-Q!%ME!"
+ "&=M#&=Q#']Y$'=]'(>%!(N!()N%!%^)!'N%.(.1*%^1!'>9!(NA!$^I!'>E&%>E#"
+ "$^I&(.M)&^Y#(NU&(NQ+#>I%*?1!&^]#&?!!&.]!&?1!&N]\"%/=!'?)%&?5!'O)'"
+ "&?5!*?9')/=!&?A!'_A!'_E!*O],&?=!'_Q!'_I!)/Q,&OI!%?Q!(0-!&OY!'/M#"
+ "!0!!)?U!,OY*&OU!'_Y!(_Q+(?Q\"$/U!%/U!&OY!&_I\"&OQ!&OQ!$OE$'_I&#_9!"
+ "%/=!'_I!'_M!-/A'&OA'(/A!&?9!&_5\"&?9!&?1!&?-!&?-!&.]!$_!!&O!\"$^Y!"
+ "$^]!'?%&&>Q'&^U$'.M%$^M!)>M#(NI!)^E&&.A!&.=!(N9&&.5!&.9!%^)!&N%$"
+ "&N1#%^!!&-]!&M])%]Y!(>!!+=U*%]I!#]I#%]I!%MA!'-A!&-=#$]9\"$M1!%M)!"
+ "&M)%$=1!&-%$%<Q!%M-!%M-!%\\Y##LU\"\"LU#%\\U#(\\I\"%<=&$<=!%<A!&<Q$%<A!"
+ "%<5!&L1&&<%!'<)!&,%!'[U%#;]&\"+Q!%+Y!\"+M!$[I$$[M%&+A&$[5!%[A$$[I!"
+ "&;5\"%;!'#[1!#[1!$;)#![1!#;%&$+!\"$JU!\"ZY!$K!$%*M\"$JM$!*E$$JA!%JM("
+ "#J=!#*9\"#*9\"$J5!#:1##J-!!J)#$*!##J!!$)]'$IU%$Z%\"#II(\")I\"#9Q!\"IE!"
+ "#9)!\"I-$#Y-&#YI%#YE&$99%\"YA%#9A!\"I=!#YE#%IM&&IU$$9Y!&9])$)Y#$J)!"
+ "\"J-!!*%!$Z-&$*9&%:-!#ZA\"#Z=!':A)$:A#%:5!#JI!#JI!#ZU!$*Y\"%*U&\"Z]!"
+ "#:]\"#[%!$+5\"$;-#&+1&#+5\"$[5!#[E!$[I$#[A!$[E!%[5!\"+M!$+Q!$+Q!',)%"
+ "%,%!%,%!&,%%%,!!&<)%%,)!&,1$#,-!#\\9(%L9\"$LE\"&<M)%<1!&,E(%\\]\"#,]!"
+ "&<U$',U#$=%!*<Y#%]!\"&M)!%M!!%M1!%M1!&==$&-=#%]I!%MA!%MA!%]M!%]M!"
+ "'-U!&-]!%]Q!)=Y&%]Q!'.!!%^!!%^)!%^1!\">-!&N-$'.)!'>9!(^=!$^5!'^A("
+ "'>A!&.E!$^Q!%>Y\"(^Q!'>U!&>Y!&.]!'O!!#_!!$_)!#O9!&O)!&?)!)O9#&?1!"
+ "&?9!&?5!%OM\"'/=#&?E!)/=!'_E!'_A!(O=$*OI!%?M!'?M$%/=!'?Y$&OQ!(/Q("
+ "(_U+&OU!&_U\"#OY%&OI'&?A!&_U!#`!&(_Q%&OQ!&OQ!&OM!&OI!'_I!%_I*)/E!"
+ "&?E!%OA#)?9!&?=!\"?Q!+/5*&?5!#O5!&?1!&?-!(?-/'O)&&?)!&?!!&?!!&.]!"
+ "'.]$(.U#&.Q!(^Q'&.M!&.I!&NI#&^U)&NI#&.=!$^9!'N9'&.5!%^-!&>-\"$N!!"
+ "+.)(&>!\"$N%!%]]!%]U!%]U!(-Q%&-Y\"%ME!\"]E#$MA!%]1\"(=9\"'M=$&=5$%]A!"
+ "'--#%M!!&-%$'<]$$\\U((LY*',Y#%\\Q\"*,U&%LM\"%<M!&,M#'<A!&L=\"$\\-#',9)"
+ "&<1!&KY'&,1$#,)!%+M!'<1!%,%!%+Y!&;U&$+Q!$;M\"%+I%%;M#&K-$&[I!'[=%"
+ "%[9!#[-!#[5!%K1$%J]!#[)!\"[!$$J]$$JQ%$ZU%%:Q$$JM$%*E'%JA)$JE!'*=("
+ "#J=!#ZA\"\"Z5!#JA!\"Z)!%:%(%Z)##J%!#J!!!Y]!#IY!%)U$\"9M)#9E!#9I!%)E$"
+ "#I-%#9%$$9A%\"I5*!I9&\"YA%$Y='$YI&#IA!\"YE\"$)Q$#IY!#IY!$*%#$*!#$:!$"
+ "\"J%!#J)!#J-!!Z1!$:)!#JE!#JI!#J9!%:Y#$*I\"%ZM*$ZI&#*E&$ZY\"$Z]%#ZQ!"
+ "#[!!#[)!%[)!#[-!$[-!#[1!%[9!)[E!#+Q!%;A\"%KQ#%+E!$;M\"$+]!'L%#%+]!"
+ "(+]%&L)'%,%!%L5#);]'\",%!%,1!$,)!&,5%%,A$%\\=#%<E!%<I!$,E%#,M!$<I!"
+ "(-%''LE&%<Y!$M!&%-%$&M)!$])\"%M5!$=9!&-5#'-9\"'=9(&ME)'=E\"%]I!$MI!"
+ "%]M!(-U%&]U*\"-Y!&]]%%]]!$MY!'>!!*.!$'.%!&N1$\"^)#)>9/&.9!$^=!&.A!"
+ "&^=$&^I$%N]#&N=#(^U!$^Y!'>M!&.Y!$^]!$_)!&_)#&O!\"&?)!$/!\"%/-!'_A!"
+ "(/5)#OA&'_9!'_=!'?=$#OA!(O9$&?=!'_E!*_E)&?9!&OQ!)?M!&?E!*/M+&OM'"
+ "%/I!'_Q!%/U!'OQ%'0%)&OQ!&_U\"(/E(&OU!&OY!&OM!\"_I\"(?I#'/E#'_E!'_E!"
+ ")/A&&?A!'?E$&?=!&?9!&?E!&?9!&/A%&?1!%/=!&?)!%/1!&>Q!$_!!&.]!'>M&"
+ "&^Y#&.U!&.Q!'O)!&.E!&.I!'NE!$^M!'^9)'^1#&.9!%.5\"%^1!(N-!%^)!%]]!"
+ ")=Q,%^!!&=]#&]Q!%]Q!\"=Q!%]M!(]I$(M9)$MA!%M=!&]=!%M9!%M)!&=1$%M)!"
+ "(-)\"'=-)\"M-\"),]\"%L]&#,Q!$<U!),Q($<M!&\\I+%<M!(,=-)<E3&<=!',9(&L-'"
+ "%L1#(\\-(&,)%&<-!',))$<!!%+]!%;Y\"$+U!#+Q!$KY#%;A\"'[E$&KA(%[=!&[9*"
+ "%+%\"\"[5!$[%%#[1!#[-!&+%+$[!&$*Y\"$JY$%*U&#:U#%ZQ*&:Y,$JI$$*=\"'*A#"
+ "$*M\"$J9!$J5!!*%$#J5$#Z)\"$)]##9Q!$)]#$IY%%9Y(%9M\"#YQ\"$IM%\"Y=%%YE!"
+ "%I)!\"I5!#I5\"#9A$\"9E##)E##95!&9M#!)Y!%9M%#IQ\"#YU\"$9Y!')]0%*%$$Y]&"
+ "#)]#$*)##:5#'J1.%:1(#J%!&:=!#JA!#ZE!#J1%!JA##*E\"\"JQ#$*U%$JY!$*]\""
+ "$*U\"$[5%$+5\"#;5\"%Z]\"$+-!$+5\"%;5\"%+E!$;E\"%[E!%;A\"$[I!$;Q\"%[U%&[Y)"
+ "&KY'%;]\"%\\!#%<%\"$<%!$\\)$&L)\"%<5!(<A%%\\=#%L1\"%\\9#!LE#%<I!%<I!$<Q!"
+ "%<]!%,Y-$=%!&-!((<U)'L]!%M)!(=-#$=)!$=5%'=5##==!&]A!(-=!(]E/&]E!"
+ "'=A(%]Q!$MU!%]U!$MY!&-]\"'N!($N%!(.%%%^-!%^)!%^1!%]Y!)>I/%^9&&.A!"
+ "&.A!&.E!*^Q+&.U!&.Q!&.M!$^=!&.Y!'.U%&.]!&_!#$_%!(?%*'O-!&?-''?%&"
+ "+?5+(O5*&?A!&?5!(/%(&?A!&?=!'?E$'_A!&/E%(/I!'_E'&OQ!)OE\"&_9.&OM!"
+ "&OM!&OI!&OM!%/U!&OQ!%OM)&_U\"%/M!'_I!$?I#&OU!&?E!%?E!&?A!'_E!)OM\""
+ "%/=!'_A!%/A&&?1!&?5!'O5!%/-!$_)!&?1!%_-$#O!!'/!$&?!!&?%!&.M!$_%!"
+ "\"_%#(.M)&.Q!'>M!'^E#'.Q%'>A!&>A\"&NA#&^=$&.A!&.5!(>-&&>)\"'>5!'.A&"
+ "%^!!%>%#&-Y!&]Y%(=I'%]I!%]I!*MI!%]I!&]E%%]5!%M=!'M5$&-1#%M1!&]5!"
+ "(=9'%M%&%M1!']!&%L]!%\\U\"%<Q!%<Q!&<Q%%<5!&,E#$<A!&<9%&,E-\",1!%,1!"
+ "%,1!'<)!',!)&\\!#(<)!%,!!%+Q!&,!)\"+U!'KQ'$[M$$[9!&;E\"%+M!(;='&K9("
+ "%+-\"!+1!$+1\"#+-\"#[)!$;%#\"[!!#:M#$ZU\"\"ZU!#ZQ!$*M\"#*I\"#ZE\"#ZI!%:I$"
+ "#*=\"$*5##*5\"#J1!%:%(#J%!$:1!%Z1#\")]%$IY&$)Y##9M!%9Y&#YM#%)E(%)E("
+ "!Y)$\"I-!$I9#\"I9!\"I9!$I%#$I=&#9A$#9I!%)M$$9Q!$:%!%)=%$9Y$\"J!!#Z!\""
+ "!:%&&*)(#J-!&:5)%*9##:9##*=\"!*1!\"ZA!$*A##JI!$JM%$*Q\"%JQ!&:I$!Z]!"
+ "\"[!!#[%!%+%&#K)$\"[-!\"[1!$[5!$[9!$[5%%;A\"%+M!$;E\"#[I$%[E!#[Q(&<!\""
+ "%+Y!%;]\"'<!*%,1!%,)!'<%%&L1&%,)!%<5!(<9%%<A!&\\I\"#<=\"'LM!&\\E#&M!%"
+ "&<Q$&<U$&,]#']-&$L]+$]%\"%<]!(--\"&])'&--#'--'&-9\"%M=!&MA$'-Q&&]Q!"
+ "%]Q!&]E!&]M*)=U!)=Y!%]Y!$N%!'.%!%^%!%^)!$^-!)N1!(>-%&.9!%^-!(N=!"
+ "&.A!&.Q!&^=$)^Y+&.M!%.E\"&.M!%>A#'.Y%'NY!'N]!'?!%&?%!)?%(&O)!'O-!"
+ "-_),*/1+&_=\"&?5!$?9#'_=!'_=!'_=!&?=!'OA&%OA#)?E'\"_E\",?E6)?I!)?U!"
+ "&/I0'_9!&OI!&OM!(/]!&OM!'_M&)/I,'_M!*O=!&OQ!*OE!#O1!&?A!&?A!&?1!"
+ "'_=!(_5&*?=&&?1!&?-!$/-\"&?-!'?9%&.]!&?%!)O%$#O!!(.U)&.]!&.U!$^U!"
+ "&.U!#NU!&.Q!&.E!'>9!$^M!(>A+&.=!(>A+&.9!'.E%%^1!$N!!'.)!(>)!%^%!"
+ "'.!!#-])#>-!&MU%$MQ!&=E$%-]#%]M!']E*(-A!'-='&]9!&=1$&]1!%]5\"$=-!"
+ "%]%\"(M9.!=5\"%<U!%=%)&\\U&&<=&(]!!%\\I#&\\Q\"&LE!%<A!&,=(%<5!%<5!'<9%"
+ "&,1%%,-!%,-!$,%!%+]!&<)&$,%!&[U)$KU##<%\"$+M!$KI#&;=#$;A\"#;I&$[A!"
+ "$+5\"%K5$#;-\"#[)%\"Z]!%[%%$[!!#Z]!&JY,$+%\"#ZQ!$JA$%:A##ZE\"$J9!#J=!"
+ "$*=\"#*1%\"Z=!$*1##J-!$:)!\"Z%\"#I]!$*%#&9Y)#YQ##9M#$9U!!)M$\"IE!$9E%"
+ "\"I)!&I-(#Y1##I9%\"Y-\"\"I5!\"IA!$)9!#9I!%)I!$)M$\"IE$#IU!#YY)#YY\"$J!\""
+ "\"*)%\"J)!$:1$$Z)&$:1'$J5!#J-!$JI$$*M\"\"ZE!#JI!#*Q\"%*Q'#;!#$JM$#Z]!"
+ "%+1\"&+!&$+%\"#[)!%;-'#K!$$+1\"$+9\"';9,%+I!&+I%$[E!%[A!$;I\"%;U&#+]!"
+ "%L%''KY+%,1!(<%/%,%!&,!!%L-\"&,-$%\\1#%<=!%<A!&L=&&LI!%<Y!&LQ&'\\Q+"
+ "&<I!%LQ&%M-!%<]!&\\]&&]%''L]!&])&(<Y-']1&&==$$=9!'==#&-=#(-=!%]I!"
+ "$]I\"&MM$)MM!#=]!'M](\"MY'$MY!%^!!%^)!%^)!'.)!'.-!%^1!'.1!'>9!%^)!"
+ "$^5!%.E\"&.A!'>A!(.Q#&^Q$&^U#'.Y%&^U#%NY#&.M!&.]!(>U*'O)&(.])&/)&"
+ ")O-#'O!!%O1#&?)!'O5!'?1%'_=!)/9!&_5#&?9!&?E!#O-!'_9!'_E!-/A&)/E!"
+ "'_E!(_U$'_I!'_E!&OM!*OE!(OE$'_=!'O1!+/A0&OI!&O9!&?=!%/-!(_9%&?9!"
+ "%/1!)_5$+/5$'O)!(?1$)/1-*_1\"'O%'&?!!$_)!*.]2'N]!'>Q&&.Q!(_)!&.Q!"
+ "&.M!&NQ\"(NI!'NE''>E&&NA#$^=!\"^=#&.9!\"NA\"'.1!'.)!%^1!'-]!$N%!%^%!"
+ "%]Y!%]U!\">!!%]Q!%]Q!%]Q!$MA!&]E!(-=!&]A%)-5!']9*&=5$%M)!%M!!$])\""
+ "%]1\"%\\]\")\\]!',Y#'<Y$'LU!',9('\\]+%<M!%L9\"'LE!&<A!&<-!'L=!%<1%%L=\""
+ "$<-\"%L%#%L)'$,%!#,!!';Y!&+M!&[I!%K]'\"+M!&[I!$[9!';M'';A+$[5!(;9#"
+ "$[1!\"[1!&[1*#[5$%+%\"'J])%[))%Z]%%JY!$*Y\"#ZY!!ZM!%JI%#JE!$JE%#Z=!"
+ "%*5#%*5'\"ZE!#J1!#J)!#J-!\"J!$$Y]#$)]#\")Q\"&)I%$YM#%9M,#IU!#IE\"&)E)"
+ "#9)!\"I)!\"Y9\"!Y5!#91!!)5!\"9A##IA\"#9A!$)I##YM##9U!$9]$\"Y]\"#I]!!)]$"
+ "#:9#$:)(\"J%!%Z1*%*%$$:5$%Z9\"#JA!#ZA\"':E!#JM!!ZY!$JQ$!ZU!%:U'#ZY!"
+ "!ZY!$K!$$+%\"$[)%$K9$\"[1!#[=$%+9!%[A$\"[)!&[A)&+E%$[I!$+M!%\\!$%;U\""
+ "%+]!&,!%&;Q\"%<!!&+]!%L1\"%+Y!(L1!)\\9\"&<=!%L=\"),E##,A!%LI\"%LI\"%<Y!"
+ "%\\M#%<Y!)M%)'LU!(,Y'%M!!&M%!%]-\"%L]!%M1!%M-&$MA!%M9!%]I!(]A*#=E!"
+ "%]I!$-Y##=M!(-Q!&^%%%N%%$]]!&>!\"%^)!%]U!'.)!&^-*'N)\"'.-!&.=!'N5("
+ "&.=!'.1%(NA!'N='&>A\"$^M!&.A!&.Q!&.Y!'^U(#NQ!&.]!#^]!'_1('O%!)_)0"
+ "$_)!&/1%&?-!'O1!&?5!\"?=!&/5*'?=$)?A!&?9!&?=!%/A!&O5!&?=!&?E!'OA&"
+ "%/M!&_A\"'?Q$&?A!#OA!&?=!%/A!)/A!'?=$\"?=!&?=!(?=)'/E#&O9!&?9!&?5!"
+ "&?5!%/A!&_1\"&?1!(O-*'?)%'?%%'O%!'_)!(O!+&?!!*N])'.]$$^U!&^U$&.]!"
+ "'>A!$^Q!&.=!&.E!'>I!'.I%&.9!&.I!$N1!&.1!'N1('>9!$M]!$N%!&>!\"(N!-"
+ "\"]Y#%]U!&>%#\"-Q!%]M!&-9#&]]%)-A&%MA!%]=!&-9\"&=9$%]5!(-E!&\\Y\"%<Y!"
+ "%]1!&M!&&,]#&,]#',](&LU!#,Q!'LU!%<I!'LI!$<9!$,=!(<5%'<9*',9$#,5!"
+ "&,%!%<%\"$,!!(<!+&\\!(#,%!%+U!%+U!$[=$$;M\"%;A\"'+A!$[E!'[=.%[=$$;5\""
+ "\"[5!'[1*$+)!#[%!$+)!#ZU!$*]\"!*U!#ZU!&ZI##ZY!%ZU)#JM!\"ZA!$:E$$:I$"
+ "%:9!\"ZA!&:1!#*50#Z1\"#Z-\"$*%#%)]'%J-\"#YY\"#9U!#I]!%9A##9I!%IE&#9E!"
+ "#))#\"I-!\"I-!#)1#\"I9!!)9!#9I!$9A$$)I#%9I&$YM#$)Q*$IU%$*!##J1!$:!$"
+ "#IY!#Y]\"%:)!$J-\"#J)$%J!&#JI!#J=!\"*I\"$Z=\"%JE(!ZQ!$JM!%:Q(%*U&$ZY\""
+ "*+%,#[-!&Z]\"$+%\"$+)\"\"[)!\"[1!%[E!$[9!&+=!$+9\"%[E$$[=!$+Y!$;Y\"'K]+"
+ "&;U'$;U\"&;]*#;]\"(;]!%,)!',-%%\\1#%<9!%\\=#'\\%,%<9!'\\A\"%<E!&,I#&,E$"
+ "&L]!'<Y)$,Q$']!!%<Y!&L]!$M!!%-)$&M-!&=)$'-9'$]5'%]9''MA)&MA$$]M\""
+ "%ME!%]I!%]Q!$MY!%^!!(]Y-&=Q#(M]\"%]Y%'^5#%^)!'>5!%^)!'.1!&N5(&.9!"
+ "'>9!(^=!'>=!&.E!&^A$&.E!(NE!&.M!&.U!&.U!$_%!'>M!&?!!(?!$&?!!(_%!"
+ "&?%!'/)$-/5!%/-!&?-!+?-+'_9!'?-%&?1!&?-!&_9\"'_A!&?5!&?-!!/)!+_=!"
+ "&_5#'_)((?=*&?=!(OA0'?A%(_=+*_=\"*/A1)/5!&?9!(?9*&?=!&_9\"#O1!'O5!"
+ "'?)%&?9!'/%$\"?-!&?%!\"?)!(?%)'O%!)?!(&.Y!(_!!&.]!'>A!$^Y!(>U%&.Y!"
+ "&^U#&.I!&.I!$>M)&.A!(>=&&>9\"'.-!&^1%'.1!'-]&$N1!%N5$(N5!%^!!%^!!"
+ "$N!!%]]!%]I!%]Y!%]M!'MQ$&=E#&]A!)-A+&MQ$%M9!#MA&&-9\"%M-!\"M!'%])\""
+ "%\\Y#$]1\"#=!!&,U#%<U!$\\U#%<Q!%<Q!%<5!&\\=(%LI&'\\=\"$,5!'\\9,'<5!#<1!"
+ "'\\-#%,)!%,)!*<%!%;U\"$\\!$%KQ'%+U!$+M!$+M!&[I!%KE$'[I!$[A!#[9!'K=$"
+ "\"[5!#[-!\"[=!$;%\"%+%&#ZU!%ZY&$*]\"&*I.&JM%$ZI\"#:M\"%*='#*E\"\":I)$J9!"
+ "!*9!\"Z)\"$*9##Z-\"\"J)!#I]!\"J!!$YY#$I]%$IY\"#9U!&Z!$#IU!\"IE!%)Q!$)1$"
+ "!Y%!$I1)#))#\"I%!#9-!#9E#%Y=$#Y=#$)E$#IM\"!YM!#YU\"%9U%%IY'$YY#$Y]&"
+ "#IQ\"#I]!\"J)!#Z-\"%:1(%J5)&*%!\"Z9!%JI!#J=!&*M+#JM!':M%$*U\"%ZU%#JM!"
+ "(;%$$;!\"&;!(#[1!$K!$#[)!%[1!#;5\"(K=$(;=\"\"[I!$[E!&KI#$;M\"$+M!#KQ#"
+ "$+U!';Y+%<!\"&;Y!&<5!%<1!%,1!&L9\"&,1%&L5\"%\\9#&<A!$L9\"&L9&$,A!%<E!"
+ "%<M!%<E!&LU&%<Y!&]%!&M!%'L]!%<U!%M%!']=+%]1!%M1!#-9$(-9+$]9\"#=A!"
+ "#=E!%]I&%]I!%]M!%]Y!(]U.(-U!'M])&>!\"&>)\"%^!!(>!!&.=!$N-!'>5!%^1!"
+ "&.M!'>9+&.=!'>=+$^E!%.Q!(^A2&NM\"(NM!&.Q!&.M!%/!!(^]!&.M!(>]*&.Y!"
+ "&.U!&?9!%/1!)/1!$_)!&?-!#^U!$_)!&_9\"'O1!&?5!)?5.&?-!&?A!#O9!'_E!"
+ "%/-!#O9!(?9#&?1!'_9!#O9!&_5\"(?A#%O9)'_1''_=!'?%&'_1'%/I!&?1!'/5$"
+ "&?-!)?-\"(?))'O)!&_%#'?-%)_!0&O%\"'N]!#O!!$_!!&>U!*^U*&?!!&NM#'^M("
+ "$^M!'^E(!.E!&.A!$^9!%N5%%^)%$N%!#>!!(>-!$N-!%^%!(.-*(N!!%^%!'-]!"
+ "%^!!%-U#%]Q!'-Q&&]M!&-I\"%ME!$MA!&-A\"%M9!'-9'#M5\"%M1!'])+%]-\"(--!"
+ ")=%\"'=!)%<]!$<M!%M%!&<U%%<M!&,M$%<I!%<E!&,M$+,I,'<-!(<9!&<)%%\\!#"
+ "%<5!$,-!(K]'%,)!%+Y!$[A!%;]!%+I!$;Q\"!+M%%KE#&KI($[A!&[=!'+=*%;5\""
+ "\"[5!#[-!$K)$$[)%#[%!\"[!!$:M$#ZY!%JQ!%*I#&JM)#JI!\"ZI!#JE!#J=!#Z=\""
+ "&J1#$J5!#J-!\"Z%\"$*)#\"*1!$I]%&*!$\"YE%%J!&\")Y%#9Q!$IA%#Y9#\")E%#YA&"
+ "$9%&#))#\"Y%&')1+&95!#)1##Y=##YA##YI\"#9I!#9A!%IQ)#9Q$$9U!#IY!\"*!\""
+ "\"J!'&Z%!#*=\"\":-#'J=&$J)\"#*9\"!Z9!#Z5\"%JM!&*E#$:E#%JM(#JM!#ZU!#ZY!"
+ "$+!\"$;)#%;%'$[-%$;%#\"[%!#+!\"#[=!%+9\"$[E!%K1$&[A!%;I\"%[I!!KM#$+Q!"
+ "%+M!%+Y!%L%#',!!%L!##,%!%,1!%\\-#&<9!%<5!$<9!$L=#$\\A#%<5!'\\I')<9)"
+ "%<M!%\\U#)<U2'<Y$%<Y!%M-!&M-!%M%!(-),&M-%%M1!&]1&&-)#!-9!(-=+'M9$"
+ "&=A$%MA!$ME!&MU$)=Q!$MU!&]Q!%]Y!'.!!(.!%#>%!%^%!$N%!%^-!(>)!&>1\""
+ "'>9!$^5!'^=((^=\"(N=!\">E!&.M!&.I!&.9!&.M!&.M!&>Q!#NU!+.Y1%NY)$^]!"
+ "$_!!'O)&#O)!\">]!'O1&&?-!#O)!&.Y!)/-!&?=!&?%!'_I!'O1!%/5!(O5$'O1!"
+ "&?1!'_5!*O5-%/A!&?5!%/5!'O5&%/5!'_9!'O5&%/-!&?1!$_5&&?1!%/9!&?%!"
+ ")/%(&?1!$_)!&?)!#N]!'/!$&.M!&?!!&.Q!'>]&$^Q!).Y!'>U!(.E$&.A!'>Q!"
+ "+>=\"&.A!&.=!&.A!'NI'&.9!&^9%&>)('.)!&N9#&.-!%^%!$N%!'>)!\"-]!'MM("
+ "'=U\"%]U!%]Q!\"-I!'MM(%]U!%ME!']=*$M=!%]5!$=-!&]9&'-1''M-$%M9!%M!!"
+ "%M-!']!+%L]!'<Q)$\\U#(\\I'\"\\M#$<I!%<5!'\\I\"%LE!%<=!(\\9\"%,)!\",%!%,-!"
+ "%,-%#<1\"%\\!((L%\"$K]#%<!\"%+U!%KQ#$+Q!&+=&![E!%+=\"%K=($[9!$[9!$KA#"
+ "$;1\"$+-\"#[)!%;%'$+!\"$Z]-![!!'JU%#ZU!&:Q($*A\"%J9&\"ZU!#JE!!ZE$&*9#"
+ "!Z5!$:%$$:-!$:1##J-!#Z)\"$9Y$%:-%#YQ#')]&#YE##)E#$IU%#IY!$)A$$9Q!"
+ "#I%\"\"Y)\"\"91#\"I-!\"Y9\"\"I9!!YA!#Y=#\"I5$$)Q#$)U#%)M($IE)$)Y##IQ\"$YQ'"
+ "$*!#$J)%!*1$&:1\"\"Z-!$:1!\"Z5!%*=&$:5##J=!#JE!%:Q(#ZU!\"Z=!$:Q$#*U\""
+ "%JQ!$JY!\"K)#%K!($+)&$[-!#[)%\"[A!%K9$%KA$$;I\"%KA$#[I$';I&&+M!$[I!"
+ "([Q)%+Q!&+Y!'K]#%[]$!L%#%<1!&<5!&<=%&<=!%L5\"',5$$\\9#'<A*&\\E\"%\\M#"
+ "&<M%$LA\"%<Q!%,U#'M!/',]'#,])#=%!$]%#%M)!\"--!%]1\"&]1&$]1#%M=!(=A'"
+ "(=I!&]E%%M9!(-M&%]M!%]M!%]U!)>%%)M]!$M]!&M]$!-]*%^%!&>-\"%.-\"&^5$"
+ "&N1#&.E!)>9*(>-!&.9!&.I!!>E\"&.=!&>I!'>I!(^Y!&.I!'NY'$^Y!(_!'&.Q!"
+ "$NU%$_!!&>U!$_!!$_)!%O)#'O-&#O)!&?-!&?-!&?-!&?9!'_1('/-)(_!!&?-!"
+ "'O1!%/5!'O-&&?-'%/-!'O5&\"O9!'_1!&_1#&?)!)/%(&?1!&O)\"'NY!'_-'&?%!"
+ "'_1(&?!!&?%!&?)!&O1!'N]!&.]!&.U!(?!)&>U!).Y!(>U*)^I!&NM\"'^U'+NI("
+ "$^E!(NA!(N=!&.9!$^9!&.9!&.5!&>1\"%^-!'>)'%]Q!%^1!'M])%^!!%.9\"#>!!"
+ "'-U!%ME!#]I\"&]M!)M9#'ME.&]A!%M1!\"-1!%M9!%]5\"'-1'%]5!&=)$#=)!&M%!"
+ "%M%!'-)'(,Y,&,Y#(,Q1#,I%%<M!#LE\"&<E%),A#%<9!%<5!&<A!%\\9#%[]$#<)\""
+ "%<)!$\\%$%<!!%+U!%+Y!&+]%$[I!#[A!$;M\"$[E!\";E\"#[A!$[5!#[9$$[9!$;-#"
+ "$+1&%+!&&+-\"\"[5!$ZU!#ZU!%*M'#ZQ!$:U$%JQ%$:Q$%*I#&*E$\"ZE!#J9!#J=!"
+ "#J1!#J-!$Z-*%*%#&:)%%:%(#J)!$9]!$9Y$$9U(%9Q($IM%\"I9!#9=!%)=%&9A#"
+ "#9)!$))!#)-#\"I1!!91\"#I9\"#IU!\"I=!#I=\"#9E$$YE'#IQ\"#YM%#9U!$:!$#Z!\""
+ "%J5)\"J1!#J!!#J5!#:)#%:)!%J9)#:=##Z=!#JA!\"ZA!%JI!\"ZQ!$:=#(:Q)$*U\""
+ "#[!!$[!!$[!%#[%$$+9\"\";5\"$+-\"%+)\"%K1$'K9)%[5!%+M!%[I!&KQ'$;A\"$;M#"
+ "$+Y!%+]!&;Y'$+]!%,!!)<1*%,)!%<)!'<)!%,1!%<5!),=2',5$#<=\"&<A&'\\Q'"
+ "%LA\"&LY!#,]!&LU!%-!$%\\]\"$<]!',]#&M%%&M1%$M-!%M5!']!!#==!'=5$%M1!"
+ "%M5!&-9#(=M!%ME!(]I$&]M!&MY$&]]%%^%!$M]!(N!''N!)).%*%^-!).1)%^%!"
+ "&>%\"&.5!#N5!$^E!&.=!!.9!&^A$'>I!&.=!&.M!&.U&&NM\"&.]!&?!!&.Q!&.]!"
+ "&.U!'>U!\"O%!$_!!$/%\"'O%!&O-\"&?-!\"?)!'_!('O!!'O)!&?1!+?!1&?-!$O5)"
+ "$_)!)/1!&?A!(?5/'O-!#O5!%/5!*?)!'O)!'>Q!*_-))/5!&?)!'?)%'O)''O%!"
+ "&?5!(^Q!&.Y!'^Y''>U!&?!!'>Q!,.Y5&.U!%^M**>Q\"&.M!#^M\"&.M!'N='&.I!"
+ "'.1!&NE##NE!&.9!&.5!$^9!%^1!$N!!$N-!(>!&'.%%$N)!%^!!*>!)'=Y\"%]U!"
+ "%]M!&-U!&-I\"\"MI+%]Q!%M1%(]9.$-Q$%M9!&]5&\"-)!%]1\"&]-'%<Y!#M)\")<Y("
+ "$<Q!%=!%']%*%<U!$<Y!),I#%<I!%LE\"$LE\")LE!&,=$%L9\"$,9!&<1!$,-!%L=\""
+ "\",-!#L!'#,%!&[U)&<!&&;]!$+U!$[I!$+M!%<!\"%;E\"%+=\"%;5#$[=!&+=!%+1&"
+ "!+-!#[%!$*Y\"%K1$$+!\")J]/%:Y##ZQ!&JU!$ZM!\"ZU!#ZI\"$:Q#$JA%#J9!$J9%"
+ "$J5!%Z%'#J)!#J-!!:%\"\"Z%!$IQ\"$:!$!IU##9U!#YQ#$YM&$9I(#YE#%)Y'#99!"
+ "%9!$%9))\"Y-\"!I1##95$\"I5!$IA##I5\"\"IM!$IE&#YQ##IU!%)U$$9Y!$9Y!$:!$"
+ "$Y]'$J%!$9Q!$:%!%:-!$:%!$:)$%JI,$*A&$:I#\"J1!$JE!#ZU!$JM%$JY$#JM!"
+ "$+%\"$;!#!;!\"$:Y#$;!#&;)$$+-\"$;1\"(+5\"&K1$$[=!&+E%$[A!\"KE#&[I!\"[I!"
+ "%\\%(#,!!'K]'([]$%,%!&KY'&L%\"&,)!!<)\"&\\1#%<5!',M)),=-&,9$%<E%$,E%"
+ "%<A!%L=\")LU$(\\U/%<U!'\\M'&\\]\"#M!\"&=-$&]!!'])*\"=9!%M5!#=1!%M9!(=9,"
+ "(=E'%M9!$ME!)MI(%]M!&-M\"&-M\"$=Q$%MQ$'MU))=U&#.!$'.%!'N%\"%^)!(.-%"
+ "%^)!%^-!&.5!'^M(&.M!(>9+!.9!&.9!&.E!&NE#+.E,&.E!&.M!&.Q!&>Q!&.Y!"
+ "&^U$$_!!&?)!&?)!&?-!&.U!$_!!&?!!&.Q!&.M!&^])'O-!&O)!'O9&'O)!'O)!"
+ "'O)!#NU&&?5!(_)!(?))&?!!&?1!&O1!&?=!&?%!(?-#&?%!&?%!'.]*)?)\"'?!&"
+ "'.Y$#O%!$_!!&?!!'.U%&.Y!$NI%&.Y!&.Y!$^Y!'>M!'>M!'^I#&>E'(NE&&.E!"
+ "$^A!'>=!&.E!&>E\"%^%!(>1%'>-&'.-!'>)'(>)&%]U!$.)#%^!!%]Y!'MM$'-]!"
+ "&-A\"'-I'%]Q!%]I!&=A$(-A!$]='&-9#(-A+)]E#&M%!&=)$%M)!%M%!',],%<]!"
+ "&M-!(<M)%LU!&LY!#,Q!%<=!#,E!%<Q!$,A!%<9*&L5\")<1*#LA\"%L5\"%<=!%L1\""
+ "%+])(\\!$$+U!';Q\"'+Y!'[M$$+Q!$+M!%;I\"&+E&&+A&%;A\"$[9$$[9!&+%\"#[5!"
+ "$[-!$[)!$[%!%+!*$+!\"#ZY!%K%!$*A#$*U\"$:I$#J9!#JA!\"ZA!#JM!\"Z=!$*9#"
+ "\"Z5!$:-!#J)%$J%\"#)Y##Y]\"%YU!$J!%$IU\"$9U$%9Y&#9I!#YI\"%)E%!YI!!YM!"
+ "&)9)$99(#9)!\"I-!\"I1!\"95&\"I=!!IA##YE##I=!'9I'$)M$$)Y'$YE$#IU!#IY!"
+ "#I]!\"J%!')]&#J)!#J%!#Z9\"$J5!$Z1&\"Z9!#*=\"#JE!\"ZI!#ZE\"%:Q(#ZQ!$[)!"
+ "#[!!$[!&#Z]!\"ZY!%;%'&+1*$[-)$[)!%;5&$[9!([9!\"[9!#[A!%+5\"%+M!$+M!"
+ "$+Q!);M,%[U$$+]!',!)$,!!$<!\"&\\-#%,-!%,!!$<%\"'<9!&LI&%<=!$,=!$,A!"
+ "#,=!'LQ!%LM!&,I$%\\U#&<Y%&]!!%<]!&M1%%<U!#=)!\"-5!#,Y!'M)*'-5'#==!"
+ "&==$&]1!%]M!$MI!\"]I$#=A!%]M!%]]!%]]!(M](\"-Y!'-]!%^)!'N%()N%!&>1\""
+ "'.-!%^=%&.5!#N5!#>)!%^)!'N1(&.A!&.9!&.M!#NE!&>E\"(^M!&.I!'>U!'.Q%"
+ "&>I!&.U!).U'(_%!'NY!\">Y!).Y'&?%!&?)!&N]\"&.Y!&O%\"\"?)!+/%+&?%!*O%."
+ "'O)''O)!\"_1\"+O!!&?)!%/-!&?%!)/-!'O1!&?-!)/%-%?%\"'^Y(%/-!&O)\"(_!!"
+ "(?!)\"O%!&.Y!'NY!'_!!&.Q!*.Q!&.U!'.E%&>M''NY!'^=('>E!$^E!&.I!%^)!"
+ "\">=!$^9!'>9!&.5!%^1!&^!%&>-\"(.9%#>!!'.!!+-]\"%]]!%]Y!(=]!'-Y!%ME!"
+ "%]M!%]Q!(]I)%M=!&]M!']5%&]=!$]9\"']9%%M1!%]1\"&M-%%]!\"%M%!%M!!%<]!"
+ ")-)0%\\Q\"$<U&%LM\"&<M%&<E%$\\E#%<9!&LM!&<A&&,9$'\\%-%<5!%L-\"%,-!%L)\""
+ "&KY#&;Q''+])&+Y%#+U!&+Y%$+=!$;]\"$[I!%;=\"%[A!%K=#\";9\"%+5!\"[5!#+1\""
+ "&;%#$+)\"$[!&&K)!$*Q\"$:Q$$*Y\"#ZQ!\"ZM!#*Y\"%JI!%*Q'#JM!#J9$$Z9&%*9&"
+ "#Z5\"#9U$$*)&$Z)&'J%#$*%#%*!#$IQ%#I]!#J%!#YQ#!YM!!YA!$)E#!YE$$YM#"
+ "$Y%%#Y!$!Y-$#I-%%I)%#)5##)5#$I=\"$YA!#9=!$YA&%)I(#9M!#9U!$IU\"%)U$"
+ "$9Y$$:!(#Z!\"#J)!$:)$$*-#%Z1#\"Z5!#J5!#J9!$J=!\"*=\"#ZU!#JM!#JM!%JQ("
+ "$ZU%$*]\"\"ZY!\"[!!%*Y'$;!\"#;-&%K5($KA$&;5#%K9$$;=\"%[=!%KA#%KU#%;I\""
+ "$;I\"%,!!%\\!$&,)!%K]#'+]%&+Y%&<=%%,)!%,-%*<1%'L%+$,=$%\\A##<)\"#LA#"
+ ")\\E0(LQ/'<M)&<Q$#LQ\"']!!$<Y!%<]!&-9\"%M%!%M%!&])'%M)!%M1!'-5'%M5!"
+ "%]9&&-=\"&=M$%]E!'=E\"(MI-(=E!(-I!$MQ!%^-!'.!%%]Y!)M]!&.5!(.!%#N9!"
+ "(.-%%^-!%^1!$N1!$^5!&.9!&.5!'N=\"'.=%)NA%'.M%'.1!'.I%&.I!&.M!'>A!"
+ "&.U!&.E!(?!)'>U&\">Q!&.U!'NY!&?%!%.M!*>]'&>Y!&.]!#O!!&?)!%O)#'.]$"
+ "&?!!'O)''O%!'O!!&_%#)^U,'^]!&?!!&/)&$.Y##NY!&O%\"%O%#\">Q!,.]*\"N]!"
+ "&?!!'/1$&.]!(_)!$.U\"$^Q!'>U&$^M!&.U!&.E!&^M$#NI!&.9!&.A!&.=!$^=!"
+ "#N9!$^9!&.5!'.-!*.))%^1!'>9!%^%!$>5$%.!\"$MY!$M]!$M]!%]U!(-Q!&]Q!"
+ "'-U!%M9!$ME!&=I(%MA!%]1!%]-\"%]1\"#\\](&M%*'--\"%]%\"']%*%]%\"&L]&%M!!"
+ "%M!!&<U$&,Q#$LQ\"&<I!'LI!#,E!$\\5#%<I!$,=!&L1'&<5!&<9%%;Y\"%,-!#,=!"
+ "&,)!%<!\"&+Y!%;Y\"&L%#\"[E!$;M\"%;A\"#[9!%+E!$K=#%K1$%[9!$+-\"$K)$$K%$"
+ ");-$#;-\"!+%!![!$#Z]!$+!\"#ZU!$JM!#ZY!$*Q\"#JI!#*Y\"#Z9\"!Z=$#J1!%:5$"
+ "#*1\"#Z1\"%Z-'$J-%$:!$$:!!$)Y'$)Y##YQ##9Q!%Y=$#YM#$9I$!YE!\"IA!\"I=!"
+ "#I!%#9!\"\"I)!\"I=!\"I=!#9E#%)5+#)Q#%Y=$#9E!$YE'#9I!$)I#%II#$Z!#$IM%"
+ "\"IQ!#YI#%*!#$J%&#Z!\"#IY!!Z5!#JA!$J-\"%*9'#J=!$*Q\"%JQ!!:A\"!:E%#JE!"
+ "$[)!%*Y'$J]!#[!!%:U(%JY)$;1\"#[-!#[1!#[1!$[E!%[=$%KE$&[E!$[A!'[I!"
+ "#+Q!#+Y!#+]!%+]!%+Y!%+]!$,)!&<)*$\\%$&<1!&,1%(L1+&<A!%<=!&<)!&<A!"
+ "&<I%'<I$)\\E'&,Q#$LY!%LY!%LY!(M).*,U\"&-%#%<Y!(<]-'-5\"&]5/&-1'%]5!"
+ "%M5!&=M(%M=!&]A%%]I!'=M#%]I!&]Q!%]Q!'-M&%MA!']M)%M])&N5#%]]!%N1$"
+ "%^)%'.)!%^1!%^)!'.!!)^5!%^1!&.E!'.A%&.9!(NI&&.=!$^E!&N9#&.I!(NI&"
+ "&.M!+^I#&.A!'NY!&.U!(.M)#NU!&>Y!&.Y!*.Y,&.]!&?!!'O!').].#NU!&.]!"
+ "#_!!'_!(&?1!(^Y''O%!(_!&&?!!&_!#&N]\"*.],'N]!&.Y!#N]!'.Q%&>Y!'.Y%"
+ "'>U!'>U!'NQ!&.Q!)>Y)&>A\"&.M!&.I!$^I!&.E!(^E-&.A!&>E!&N5#(>=%'.=%"
+ "'.%!&.5!$^E!$N1!%^-!%^)!%^%!$N%!$^!!$M]!%]]!']Y)'-U!&]]%%]U!%M5!"
+ "&-A#%]I!%ME!)]Q-$-=$%M=!'-9'%M5!&-1'&M5%&=9$&=-$(=%(&]!\"%M%&(,Y("
+ "(<Y)'<U)&,E$%<U!'LQ%%\\U\"%<E!&,5(%LA\"&<9%%L1\"%,1!%,-!%L)\"&<-!$,%!"
+ "(\\%(%KY#&;Y&'+Y!$[U$$[Y$&+M)'+E*$K=#'KE,$[9!&[=)&KE('[5*&+5&%K1("
+ "\"[9!#+5!#[)!%+!&#Z]!$*Q\"#ZU!!ZE!#JE!#Z=\"$JE!%*E'!*I$#Z1\"#JI!%:5!"
+ "#J1!#J)!#Z)\"!Z!!#IY!#I]!$)Y##Z!\"\"YQ%$YQ##9U!&)I\"$)E$#91!\"II!#)I#"
+ "#XU!\"I%!#Y!'!Y=!#9)$#Y5&#)-&\"I9!\"IA!$Y5'#IM\"\"Y]\"#9M##J%!%*!'#I]!"
+ "&9Y)#9]#$*%#%)Q!$*)#$)U'#J1!#J5!#J)!#Z=!#*A\"&:9(#*M\"\"Z=!%JU!\"ZI!"
+ "$*E&$+%\"#:Q\"$;%#$*U)#[%$$K)$$[9!#[9!&;1#%K1(%K9,#+5\"#[A$%;A\"'+Q*"
+ "![=!$+U!%[Y(%+Q!&+E%%K]#'L)\"%,)!(<1%&,)!&<1%&L-#%L-\"%,1!%L=\"&<E%"
+ "\"<I\"%LA\"%,1!(,Y#',Q(%\\U#%<]!#,U!$=!!',]#'M%%#=)!&-!#%M)!%M5!)-10"
+ "&-1#&=E#%]=!&-U\"%M=!%]M!)-9!&MI$%MA!'-U!&]]*%]Y!(N!'&M]$%N5%'>!\""
+ "(N),%^%!$N%!$^9!'N-\"$^5!*.=('>5!'.-!&>)\"&.=!&.A!)^Q,(NM!#N=!&.I!"
+ "#NA!'>=!&.U!&.A!(>M+'>E!(NU+'^U\"&>Q!'>U!(?!$&.Y!'O%!)>Y##NY!\"?-!"
+ "'O)&&>U!&.Y!$^]!&?%!&?!!#N]!'>]&(^Y!'^Y'&.U!(>U%&.U!'NY-+>M3'>I!"
+ "%>Y\"&.I&&^Q#\">I!&.Q!&.]!&.I!&.U!'NM!&.M!&.5!&.5!(>M+&.5!'>9!\">5!"
+ "&.5!&.=!%^-!$^9!'.)!'.)!$N%!%^%!(-Y*'-]!$ME!'-U&&]Y*%]]!']M$%M=!"
+ "(=I!#]E#'-A!&]I%&MA$&=-$%M5!$=%%%M9!\"--!%<Y%(]%!&L]!'-!#$M!\"&<Y%"
+ "&-)(&LA&&]%+$\\I#&<I!%L1#%<A!%<1%'<=!%<A!$,)!%,1!&<)!#\\1((\\)'%<%!"
+ "$+]!%<!!([Y$';E\"$;M#$+]!\"[A$&[E(#[-!$[E!%[E!\";=\"$[5!#[5!%;1\"#[1!"
+ "\";)\"#[!!$[1!&:U$%:U'%:]$%*Y'#*9&#JI!\"*]\"%:E$#JA(#*=\"#Z)\"&:9)$J9!"
+ "$J=!#Z-\"#J-!%J-\"&Z-'$:!!%:!%#I]!%9M)&II(%9I\"%)A'\"I9!$)A$#)M\"\"IA!"
+ "#Y)'#9%!\"I-!\"9)&\"I-!\"Y1\"#I1%#Y5&\"9=##99!%9E&#YI&!YQ!#9M!$J!%$*!#"
+ "#YY\"$9]$!:!\"$Z!#%:!!%:)!\":-\"$J1%%J5)#J)!%*M\"$:E$#JI!\"ZI!\"ZI!%JY%"
+ "\"[!!#ZU!\"ZY!$+!\"\"*]\"\";5\"$;)\"%K5(%;5\"#[A!'[1!%[5!#+M!%[=!$[E!%[E$"
+ "&[M%#+Y!$+Q!#+U!'KY'%;Q\"'L%'#,!!#;]\"%,1!(,!)%L9\"&\\-(%\\A#&LE&%L5\""
+ "&<E!&,I#'\\Q\"#,Q!',A#%\\Y\"\",Y!&M!%(=!$%<Q!%<]!$=!!&=)$'-='$]!#)=%\""
+ "%M)!%M5!&]5!$=9!&-A\"#=A!%]A!$=9!$MQ!&]M!%]Q!'-U!&-Y\"'-]&%^%!&]Y%"
+ "%]]!&=]#$MY!$MY!%^%!\".)%#>!!&.5!$N1!'.9&$^9!&.=!$N)!&.I!&.E!&.=!"
+ "&.M!&>1\"&>I!&.Q!!.M!'/!$(N=!'>U!&.]!'>Q&'>Q!&>]!#NM!&.Q!&NM#'^Y'"
+ "&.]!&.]!(^Y!(>Q*(NQ+(^Y!&O)!*NY#'>M!&>M!&.Q!&.M!&^U#*^Y*'>Q&&.A!"
+ "&.Q!&.Q!\">U!&.I!&^-%'.I%#^E!&.I!'>5!%^1!'.9&'>5!\">E!(>)&&N5#$^5!"
+ "&N)$&.=!&^-%'>9!&.5!#>%!).)*#>%!%^!!&^%%%]Y!'-U!&-Q\"$MQ!%]Q!%-=$"
+ "$ME!$M-!)-A&&-=\"%]9!&=A$%M!!)=A0&=-$%<Y!%<]!(-%\"#=!!'L]!%\\Q\"&<Y$"
+ "&\\U&$<I!%<I!&<M!%\\9#%LE\"'<=!)\\A+&<5!'<A!%L9\"%L1\"%;]!%\\-#%,%!%K]#"
+ "&;]!'+]!%;Y\"([U)$;I\"#;Y\"([I%#[I!%;E\"';A'&+=!$+)&%K9(#[1!%+)&\"[=!"
+ "$[)%$;-\"$+!\"#:]\"\";%)#*M\"!:U\"#JI!#ZQ!&*E(#:E#%JQ%%:9!$JE!$J5%#Z1\""
+ "#J-!$:5##J)!$J%\"&:-&#Y]\"\"II$#YU\"#9Q!!YM$%)M!!II#$9A%$)=$!II#\"Y9\""
+ "#9%$#I%##I!\"!))!$Y-!'95+%91)%I9'$95($9I$$YA'#9E!#YI##YM#$)U##Z-\""
+ "#YY&\"I]!%)Y$\"*%\"#J!!!J%*%*!!#Z-%#J9!#JM!\"J)!#Z=!#JE!#JE!&:=%$*M\""
+ "%JM%$;!\"$K-$#Z]!$*]\"$*U\"#[!!#[-!#[-!\"[5$%Z]%%[)&%+A!%+5\"%;A\"#KI#"
+ "&[E%$KM#'+U!%[Q$$KY#%+U!$[]$'+]!$,%!$<)\"%<%\"&L)'&,=$&\\5(&<1!$<1!"
+ "'\\A\"(LA!&\\E\"%<I!&,I#&<=!%LI!%LM\"#-%$&-!#%<]%'<Y-&-%$(])&'-)''=1("
+ "&=1$(=1#(=9\"(-9&$]5'']5%#=I!$=E$$]M\"%]M!%]U!&MM$)=U!%]U!'-Y!)N!&"
+ "'>!!%^%!#^5\"%^%!\".)!%^%!&^-%'>1'$N1!%N5%&N=#%^-!%^1!(NA!#NA!$^=!"
+ "&.5!&.A!'>E!&>E!'>I!&.M!&>I!&.M!'>M!(_)!)NQ%&.U!&^Q##NQ!&.U!&.Y!"
+ "'.Y%'.]$&.I!&.I!&.U!#O%!&.U!&_%#,>I&&.I!&.Q!&.Q!(.Q$&>Q!&.Q!)^Q&"
+ "#NM!(NI&&.=!(.M)#NI!&^Q#&NA#!N9#)^A!#N9!&>9\"%.9\")^=!'N)('N5(&.1!"
+ "&N-)&^-%%^)!%^%!%^!!$N!!+>%)&>!#*-Y$&-]\"'.!!\"-Q!%=M$%]M!%ME!']A*"
+ "&-9#%MA!&-A#%]5\"&]9!(=9'$=1!%]!'$])\"#=%!$<]!$M!\"(<Q)\",]!%M!!(,U,"
+ "#<]!#\\U#&<E!&<I%$<M!!,A!$L=#%L1\"$,9!%<1!'\\5($<-\"&\\%($,!%%,%!%+U!"
+ "%L!'%+Y!([Y-$+Y!%;M\"#KU#$;E\"&;Y!&+M%$K=$%[)!#[1!#[1!$;%\"%+)\"$K)$"
+ "&+)&&K!$#Z]!$*U\"#[%!#ZQ!$*Q\"!*M!#*E\"#JA!#ZE%&JA\"$:=$#J9!$JE%$*1\""
+ "#J!!\"9]#$Z!&$*%##IY!!*!$\"YY!$9]$%9Q\"$YY##IY!%)E$$YU)#9=!$9A(\"Y1%"
+ "#I-%$)%!#8U!#))##91$$I5&!Y5!\"I=!!)5!#YA#$YM#$9I%%YI($)I''9M+&IU."
+ "#IY!#9Y'#J%!%Z)##*!&#YU\"#J!!%Z1*#JA!%*9#!*9!$*M\"%JE%'ZM#%ZE\"$ZU\""
+ "#ZQ!%JI)#J]$\"ZY!%J]!&K%(&[)\"$K-$#+5\"%;)'#ZU!$[5!$K9'%[A!#[A$#[A!"
+ "%;M#%KI#$;M#!+Q!%<!!&+Y!\"[]$'[](#,)!%,)!$<%!%L-#$L1\"&\\1#%<9!$LA&"
+ "'\\Q'#,A)&<-!&<M!#,I!%LI\"%<I!%<A!',Q(%LU!&L]&$L]\"']%+%M%!%M)!)-1!"
+ "&M%&#=1!%M9!']9!)M=\"#=1!'-I'$MQ!'-U!&]I!&]I!\"=]&%M=!&MQ$(=Y''M])"
+ "%]Q!%^%!&N!$%^%!$N!!%^!!&.-!&.%&#>)!(^-.'>1&%^-!&.9!)^=!&.5!&.5!"
+ "$^I!$^A!'>A!#^E!&.Q!&.Q!)NU%'>I&$^I!&.M!%NM$%.M'&.M!'>Q!&.E!&.M!"
+ "'>Q!&^=$&^M)&.E!&>Q!&NQ\"$^Q!#NQ!&.Y!(NI!'>M+*.M!&.M!'NQ'%.Q!$^M!"
+ "\">E!'>I!(^E-(^I'&.I!'^=)&.A!$^=!&^=*%^-!&.9!&.5!'>5!*^5&$N)!%^-!"
+ "(.9*&MY$%^1!'N!#(MY(%]U!%]]!$MQ!%]Y!&MY$$MU!&-]!%]M!'-Y!%ME!$ME!"
+ "%MA!%M=!$M1*)=I!%]5!&])&&=9$']1!%M)!%]-!'=%)%\\U\"%M-!%<=!',I(&LU!"
+ "&\\Q\"%<U!%<M!%<A!'<=*&<=!&<-!&<E!&L9\"%,1!&<1!(,-$$<-\"%+U!&,!!(,!!"
+ "%+Y!\";Y\"%;M\"$[Q$#;M'#KE#$;M+&;=&%+5\"%+1!!+=$&+5*$+1!$+1\"#+5\"$[-!"
+ "$;-\"#ZY!$[!&!ZY!$*U\"$:U*%JY!#JA!\"ZM!$ZQ\"#JA!$JE!$*1\"#Z9\"$J5!#J1!"
+ "#J-!\"J-!#*)\"$*!*#Y])\"YY$#I]!#YU%#IQ!$)Q'$II)#YE#$IE&#Y-#\"I9!#YA\""
+ "\"8]!#HY\"#9-!\"I%!\")%\"#9-$\"I1!#)9#!Y9!!)E!#9A!%)I!%)A%$)M#!YQ!\"II!"
+ "#IU!%:)%(*!*$IY&!YY!\"IU!\"J)!&*),\"*1!&:5!%J9)#Z1\"$JA!#JI!#JI!%*E'"
+ "\"ZI!$:E$$*A\"#[%!#JI!![)!%;%'\"Z]!#ZU!%+=%$+1\"$;9\"%KI#$[1!\"[9!%+1\""
+ "$[=!\"[I!&;U\"$,!!&+U!'<)%%[I$&,%!#L!#%,)!%<A!%<)!&L)\"#<5!%,=%&L=&"
+ "'\\=\"%,-%$,A%(L=&$<I!%\\M#&\\I'%<U!&M%!#LU\"%<U!&L]&%M!!&]9!!]%$&])&"
+ "#]!''M1*%M5!%]-\"\"-9!&ME$%=E$%M=!&]Q%#MQ!'=9-(]M$$MY!*-Q$%=Q$&=M$"
+ "%]Y!%]]!%^!!(>!!$N%!'.-!&-]!&>!\"%>-#%>)$)>9%%^1!%.5\"#N9!&.=!&>A\""
+ "&.9!&.A,&NA#&>A\"'NI'&.9!&>Q!#NE!&NI\"'>I!'>I!#NE!)>I$&.Q!&.M!&>I'"
+ "&.]!)^I!(.M$(.I)&.M!)>M$&.A!'^Q\"&>Q!&.M!&NI\"&N5#&.I!(.I$&NI\"'.A%"
+ ").M3&.E!#>A%#NA!&>=\"%^-!*^A&)>9%&.9!'.-!#N1&$N1!&^5$%^)!%^-!\">)!"
+ "(N)'&.%!%^%!$N!!#=]!%^!!$MU!%]U!)=]%%]Q!%]E!$=9!&-A\"&]I%%MA!%M=!"
+ "&M9%']I$(-50&]5!'=5($-1$%M-!'-)#$M)!'M%%&M%&%]!\"%<]!%])\"&]5!$LQ\""
+ "$L=\"%LQ!&LE&%LE\"%<A!(<1!',I#'L5+'<5*%,1!&<9!&,)%%L)#%,%!%,%!&L%'"
+ "&+Y%&+]%%KU#$;U\"#+M!&+Y!%[E$#KA#%;5#%;E\"([9!&;5+%K1(%[)!#+)\"%+-\""
+ "$[%!$[!!\":]\"'ZY'$:I$#ZQ!#ZI\"#ZU!%*A'%*A#%*A'$ZM%#J9!$Z5\"!Z5!$J-%"
+ "$JA%%*%'\"Z%\"#J5!$9]!$IY&$)U#%)]'%)Y$$9M$%9I)#)I\"$YA!!Y9!#Y)##95$"
+ "\"Y!\"$)-'$9%#\"Y%\"#9)$\"Y-%%I%(#)9##9-$#99!$)=$$)E##YE\"$)M$$9I$$9Q!"
+ "&9U'%9U)#J)!#J)!$*%#$:%!#J5!#Z-\"!Z9!%:9!%J1\"#J=!\"Z5!#*A\"\"ZM!$JE%"
+ "\"JM#$*E&$*I&\"ZU!#[!!$JY$#[%!#Z]!\"[%!#[-!$[1!\";1\"&;9'%[=%$[5!%+=\""
+ "&K9(&[I!$[=!$+M!$+U!#KY'&,!!$+Q!$+Q!(L%'%<%\"&\\)#%,-!&,-$%,1!$,1!"
+ "&<9!$LA\"'LA&$\\=#$<Q!&\\Y!$<M!#,Q!)<Q)%\\U#$<U!\",]!',]'#]!#(M%*'M)$"
+ "&LY&%M-!$=1!&]5!(=5'&-=\"&]1!&-A##=A!$]E\"#=E!%]I!%]M!&=E#'-]!'.!!"
+ "%-Y\"%-M#&MU)']])'>!!$N%!%^%!%^-!(>%!#>!!%^)!&.5!%^)!'>A!%^%!'>A&"
+ "%.5\"&.=!&.A!(>I+&.=!&.=!'NA\"(NA!#NI!&^I)$^E!&^E$%.E!*>I\"&.Q!&>E\""
+ "&.U!&.I!&.I!&.Y!(^U!#>I%&.I!#.M)*NA*&.I!%^1!&.E!&.A!%NE$$^E!'NA\""
+ "&>E!*N9+&.=!(>E+%^=&'N='&.5!&>1\"&.=!&.5!$^9!'N1((>-!&.-!(>!,\".)!"
+ "%N%*&.%!#>-!$M]!%]]!%]]!%]Y!'-U!$MM!%]Q!&]M+$MI!%ME!%]I!%MA!%MA!"
+ "(=E\"%M9%&M1%'-5'%M-!&]1!%M!!%])''-%''=!$%M%!%<Q!',Y#&LM&\",E!%LQ&"
+ "&,M$(LA!%<I!&,I#&,=$%\\A#%\\9($\\)$'<=%#<1\"%L1\"&,)!',)%$<%\"%[]$%[U$"
+ "%;U\"%;M\"%;Q'%;Q\"%+Q!$[I!([I%';9,'K9$%[9!%+%\"%[E!\"[1!\"[-!%[-!$[!!"
+ "$+!\"%J])!*Y!\"ZY!#ZY!#[!!#JI$#JI$#JE!#*9\"#JE!!:Y)#J=!$:1'$J1\"&:--"
+ "#J)!$*%&#J-!$:!$%:)!!Z!(%9I\"$IY)$)M$#9E!$II%#YI##YA\"!Y=!#Y=&#))#"
+ "$Y!%\"(U\"$(Y$#9%!\"Y)\"#)-#\"I)!#)9#\"9=#\")1\"#YA\"$)5$#YE\"!)I!#IY!#J%!"
+ "#II\"#Z!%\"J!!%)Y(\"J)!$:%(#Z)%$Z1&%:1!$J5%$:)$&:9)#J=!!ZA!#*=\"!ZI!"
+ "#ZQ!#JE!%JQ)$*U\"\"JY$#ZY!#[!!#*]!$+5!$*]\"%KA#!+)$#[%!$;=\"%;A\"$[9!"
+ "$[A!%[=!&+I%#[E!$+Q!#;Q&%KM+)+])&;Q\"'K]'&<-!#L5#%,)!$L1\"%<A!$L-#"
+ "+\\),&L%\"&<A%%LA\"&\\E(#LE\"$<I!(,Y\"'LQ!&,Q#&<Q%$]%\"%<U!%<U!%]1\"%M%!"
+ "&])&*--!&--#'=1$%M9!\"M9#&]9+%=E)&]E%&=A$$ME!&]I!'=I\"#=U!)=U!%]Q!"
+ "$MY!%]U!'-Y&%]]!*>!%(N!\"%^)!%^1!(]]-%^!!(>%!%]]!'.1!%^-!&.)!&.5!"
+ "(.E)&N9#'>9!&.9!&.A!'>A!)N10'.=%&.U!&>E!'^E\"&.I!&>E\"&.M!'^5#&.I!"
+ "$^=!&.E!&NI#(NE!&.E!(.E*(NM!'N=!&.E!&.M!(^M-'>A!'>E,#NA!(.A$&N=#"
+ "(N=,(N=!(>=&&.=!(>1!&.5!'>A!&.5!%.1\"&.5!&.-!&.9!%]Y!%^-!%.-\"'.%!"
+ "(=]!&>!\"'-Y!%]Q!)=Q0(N-'(-M!'=Q\"'-E!&=I$%]E!'MI(%M=!'-9\"\"ME\"$]9\""
+ "&-9\"$=5!&M5%$=1!&-%#$M=!'=)(%]!'\"=)!'=!$\"]-$%M%!\"L]#&,]#'LQ&*,U!"
+ "%<I!%<U)%<5!&,E#!,9!$,1!(\\9\"&,%%'<1%%,-!%<%\"#L%#'<-!&K]'#,)!%+Q!"
+ "'KU(&L!'%+Q%$[M$%+]!#[5!$[A!&;9'%K=$$[E!$K=$#[9!$[-!%+)\"%K)$$+)!"
+ "#[!!&J]!#ZY!#Z=\"%:Q$#ZQ!%ZM\"&:I(#J=!#ZA!#J=!#Z-\"$*=&#J=!#J-!\"J-!"
+ "$:)!&J%#(*!*#9M!&:!,!J1##YI\"$)Q#$9Q!#IM$%9=*#I1\"#9=!!Y9!#)9##95$"
+ "#(]##(]#%)!%$9%%!HU!\"I-!!Y1!#)-#$91%#99!#9=!$IA#$)A#$)E#$YM#%YU*"
+ "$9Q%#9M!%)Q$#)Y\"#J%!#)I%%*1'\"Z%!$J1\"$J9%#Z1\"#J9!%Z9*$*A\"$ZE\"%JI!"
+ "%ZI\"#JM!%JY(&ZQ\"#ZY!#J]$\"ZU!%ZU&#[%!#+1\"#[%!$K1$#[5!$[-!%;9#$[=!"
+ "%+A!%;I\"&+E%&+E!%;]&&[Y,#+]!&+M!&,%%(K]'%,%!#,%!%L-\"&<!\"%,-!$<1%"
+ "%,%!%<5!&L=\"%L=\"&\\E\"$LM\"\",E!%LE\"'LQ!'LQ&&\\]\"%\\Y\"#,Y!%<]!&M!!&L]%"
+ "%M-!#=)!&M)!(=-('-1')-5&%M9!&]9!#=A!&-A\"(=9\"%]M!%]I!\"MI\"#=M!&=Y#"
+ "\"-M!&.%!%-M#%]Q!+=]$%]U!&-U\"%^%!%^)!%]Q!$N1!%^%!%^-!%^-!$^%!&N1#"
+ "&.9!%^-!$^9!(N9!'>A!(^).(N9!&.A!%>%#&.5!'>E&&.9!)>=$%N5%$^5!&.M!"
+ "%^A*&.A!&.=!&.=!&.A!\">=!&.=!'NA\"'>A!+>A(&^A$$^=!'^=($^E!&.=!%^9+"
+ "*>=#'.1!(>5+$^5!*.=('.-!%^-!%^1!%.1\"$>!%'>-&\".1!%^%!%^!!%.%\"$M]!"
+ "(.%%&=]#'.%!'=Y(%]M!&]Q!'-U!%]I!'MI)%]I!&=M$#=M!&-A#%]5!$==%#=A!"
+ "%M9!&-%$)]1*%]-\"%M5&%M%!(-)\"(=-('-%#&M!&%<E!%<Y!%\\U'%\\Q\"&<=%'LU%"
+ "&LQ!&<E!&\\E'&<9!&,1%#,)!%<9!&,1%'<9%'<5%&,-%$<)!\"+Y!(+Q!'[]$%[U%"
+ "&KI(!KQ'#[9!%KU#$[E!%KM#%;A\"$;A\"%[1!%;E\"(+-#%+1&$K5$%+A%#[!!#[-!"
+ "'*]'&+%\"$ZY%%ZU\"$ZU%\"Z9!$J9!!*I!%:I$$:A#$:1#$*A#&J-\"#Z1\"#Z-\"#Z-\""
+ "\"J%!\"IY!%J%&$*!#$*%#%IY\"&IA!#II!$)M#$)Y##I=!#)A#$)='#)9##)5#!Y1$"
+ "$HY&#HY\"#XU!$))%#Y5#\"I!!%(]&#I)(\"I9!#Y9&\"I=!$)5$$)M$$)A$#9I!%YI!"
+ "#9E!#*!\"$9]!%9U)#J!!#)]&$*!##Z-\"%J5)!*1%$Z5\"&*-%#ZA!#:E##ZA!$ZI!"
+ "#JA!$*M\"#:U##ZU%%:U'!*Y!#Z]!#[!!#[!!$J]!![-!%[1!![!!$+=!%;=\"%;9\""
+ "$[I!(+A!&+M!%KI#$+M%%+M%$[E!$[I!%K]#%;]!%L!#!,)!#L!#\",!!$\\1#%,1!"
+ "%<1!*<9$%<=!%LM\"%<A!!,E%)\\I&%LA\"&,M#&\\U'&,U#&,]#%LY&'<M$&]1&%M!!"
+ "&M-%%M%!$<]!&]1!&LY!%M5+%-=((-=!#M9\"&=-$'-A\"'-=\"#==!']9!'==(&=M$"
+ "(-M+%ME!%^)!%]U!+MU%%]]!'^!$%]]!%^)!)N!!)^)'(>)!(>%!%^-!(.-*&.-!"
+ "&.=!*.E'\">5!%^1!&N1#'.1!&.1!%^-!&>9\"&.A!&^=$'>E!&.9!(>A+$^M!(NA!"
+ "$^5!&.A!'>9!'>9!&.9!%^%!$N9&$^=!'>5!$^=!&.=!&.A!'.=%&.9!&.9!&^I$"
+ "#N5!&.5!%N1*%^1!$N-!'>)'\".-!&N-#&.E!(>)+&^)%%^%!&N%$%^!!&^!%%]]!"
+ "'-]&%]Y!&-Y!&-Y!'-U!(-Q!$MM!%]I!#=I!&]M!&M9%&ME$&M9%&]I%'-9'%]=!"
+ "%]5!$M=!)-1&%M-!&=!$#=!!%M%!%=!%%L]!'<]#$<U*&<M!%<U!#,Q!%<M!&LM!"
+ "\",M!\"<I!%<A!$,A!$,9!&,5%%,1!'<1*#\\=#%<!!'L-+%,!!&<%%%+]!';E&);M'"
+ "%[U%$;Y&'+M!&;I\"#[A!%[A-%[=$$[I!%+=!$+9!#KA'%+-\"%;1\"#[)!#;9\"$K!$"
+ "%ZY*'*Y##[%!%ZU&\"ZQ!$*Q\"&ZI'#ZE!!*U$$JA!#J=$#Z%\"#J-!$J-!$:-!#J)!"
+ "#J-!#J)!$IQ&#I]!#IY!$IQ&#9M!&)M\"$)M&#I=\"#)A#$I=##9=$\"Y=%$91(!Y9!"
+ "\"(U\"\"I!!!H]!%(]\"#I%\"\"Y-\"\"I5!\"I=!#Y9#\"Y9\"\")9%%I9#\"I9!$9Q%%)I!#9M!"
+ "$9I%%:))$Z%&#9I#'9U+#J!!#*-\"$)Y##Z%\"#J%!$J5!%J9)$Z-\"$J=!\":A\"\"ZE!"
+ "#ZI!$JE%$JM$#ZU!$*]\"#ZY!$[!!%K!)$*]\"$[!!$K!$![-!!*]!%;=&&+)\"';9+"
+ "%;=\"&[A$%+E%%KQ#%[I(&KM'(+Q.$+U!$;Y\"';U+#K]#%,!!%,%!$,)!%,1!%L-\""
+ "',-$&,-%$L=\"%L9\"&\\A#%<A!#LI\"\",]!#,A!%<M&!-!!%<Q!'<U)%<Y!&]5!%<M!"
+ "'<])(=-'&=)$&=-$&]1!%M9!%M9!']5!\"-=!*=5!%M=!'-I'&ME$%]M!&-9\"%=E$"
+ "(]U.%]M!#=Q!(=Y!&MQ$&]I!%]]!$MY!$M]%%]I!&.!!%>)#$=U%).%$'.-!&>)("
+ "%^)!%^)!&.9!$^9!)>9%'.-%'.)%$N5%#>1!(N9!(N5!&.E!&^9$&.=!'NI''>9!"
+ "'N5()>1*$^=!&>9\"#N5!%N9$&.5!(N9!,>A,'>5!&.9!&.A!(N5!#N5!\"^1#\".1!"
+ "&>5\"&.A!%^%!%N1$(NA!(^-#$^%!'^)*)N%&#M]!)>%*&.-!\"N!\"(MU-%]]!%]Q!"
+ "&-Y!%]U!%]U!%]Q!%]Q!$MI!&MU$\"-I!(MQ($MI!$MQ!&]Q%%=A$%]5\"'-9'&M=$"
+ "$-1$&M-!%]5\"&-%$(])!%M)!&-!(&LU!%<]!%<Y!%\\U#)LU/&LU&%<M!%LM\"',=("
+ "#<=!$<A*&<5!*<A-%<9!$\\A#$\\-$$,-!$,%!!,!!#+U!$<!\"&+]%%L!,(+Y!%[U$"
+ "%+Q%\"[I$&;I\"%+I!%+Q!&+A\"%+=\"%[5!%+1\"$[5%%K1$&+-\"$[)!$+)\"$+!\"#[!!"
+ "&J]-$JY!$J]!$JQ!#JQ($*M\"\"ZA!&:M,&*I##ZA%$J9!#Z%\"\"J1!'J5##Z)\"!J)&"
+ "#IY!%*!!$)]##9Q!$9E$#9U!$)U#\"9M##9E!%YI+!IA&#99!$)9$#)1#%)%&\")1%"
+ "\"8U!#(U!\"I!\"#Y1##Y%##Y-)\"I-!%9%#\"I-!\"YE\"%91&$I=\"#Y=#\"9E##YQ#$9Q!"
+ "#9M!%)U!#YU)#IY!$)Y##J!!#*5\"#IQ\"(J!,#:-##J!!$Z5&#Z=\"%:=!%:9!#ZQ!"
+ "$:E#%JI!$JM$$:M$#ZU!':U$&*Q'#:]#$;!#&+9*!;-&$[1%$[5$&;-(#[)!&+9&"
+ "#[=!$[A!\"[A!$[A!#[I(%+A!$;Y\"\"+I!%[U)%;Y\"%+]!$+Y!'\\!$&\\%$%,)!%,-!"
+ "',9$&<9*#L9#&<9%%<=!%<=!%LI!$\\E#&,M$&<I!(<M$$<Q!%<M!'LQ%%LM\"&\\]&"
+ "&M!!%M!!'-%#%M-!(-9&$=5!&M5%%M-!%M5!%]%\"%MA!!MA#&-=#(-=!%MA!%MA!"
+ "%]I!'MQ((-I&#=M!%]Q!%]U!'-U!(]Y##=Y!%]U!(=]!'.!!&>%\"&>%\"%^%!%.%\""
+ "\".!!%^1!$^9!(N9!'>1'#>)!&N1#'.9&'.1!&N1#*.93%^)!$N1!%^1!'.1*'>5!"
+ "%^1!&N-$&.5!&>I!#N1!&.5!&^9$&.A!&.5!&.5!(N-'&.5!'>1''.1!).1)'.1!"
+ "%^-!%^)!%.1\"(N5,&N5))N!!&.5!$N%!%^%!&>%#(]]-'M])%]]!%]]!&-Y!(]Q("
+ "&^%%%ME!(]I)$MY!'=]!'MA$%M1!%ME!(-A!%MA!&-9\"&-9\"'M1*%M9!%ME*$M5!"
+ "%M=!&]-&%<]!%M-!'=%)\"\\E$+-!+'LQ!#=!!%\\]\"&LU!#LQ#'<M%&,I#%<I!%<5!"
+ "%<I!%L=\"%<=!(,9)&<5%&,A$%<1!&,1%%<!\"%<%\"&,)%%L%''+]!&[Y$$[I!$KU'"
+ "&;Q+$;M\"%;I\"%[E!#+5%%[9%'[=*%+-\"(+A/#;1\"%K-$$+)!%+-&&[%&$+)\"$*]\""
+ "#*I)%JU!#ZQ!!ZQ!$JQ!#JI'$ZE)$JA%$J9!#Z1\"#Z)\"%Z5\"%*1'#Z-\"$:)(#Z!\""
+ "#J!!#J-!$9]$$YM'#9U!#IY!#)M\"#IM\"&9='%9A##I5\"$II##)M%#I5%\"I-!\"I1!"
+ "$8Y&&HI*\"H]!\"(]\"$)%$#9!%\"I-!$Y1$#I=%#))&#Y1##)=##IM!\")A%#YE##YI%"
+ "#9M!!9I\"#YM##J%!$)]#%)]'%9](#J)!$J!\"%*-'\"Z)\"$J%%'I]$%*9&\"J=##ZI!"
+ "\":E\"%*I'%:A$%Z9\"$ZA\"$JM!$JY!#Z]!$[!)%*Y*$J]$#[)!#K9$%[=$\"[E$%[9!"
+ "&[9!#[=!';9#$[E!#[9!'KU#%;M&\"[Q%%;M#%;Y\"(\\!$%,!!%<!\"%K]'&\\5-&,-$"
+ "$<-%%,)!&,9)%,1!'<E%*<1*%LM!%,5)%<E!$<M!&LM*%<M!%\\]\"$L]\"&\\U\"%\\Y#"
+ "%\\Y\"'-!(%<U!$M%!&-%$(]%*'M5)'-1'(M-$$=9!&-9\"&M9%&MU%(=M,&-A\"#=M!"
+ "%M=!$]I\"(-M&%MA!(-A!(MM('-Q&#=A!'-U&&=M$%-Y\"(=Y,'-Y!$MU!$N!!%^!!"
+ "%^%!'.)*).5$$N1!&>%#&>)\"&^5%%^-!&>-\"%^-!&N-#'^!$(>1!'^-#'.)!\".1!"
+ "%^1!'NA''^)*'>5!&.5!%^1!&N)#'.1!$N1%%^)!$^5!&.9!\">E!$N-!-N-(&.5!"
+ "%^1!#^)\"'.)&&N-$'.-%%^)!%^1!(N!'\"-]!!.%!%]Q!&-]!$MY!)MI,$MY!%^!!"
+ "&-]\"#MA!$MM!%]M!%]M!&-I\"%]M!&=I$$MU!'-A\"'M=)&-9\"%]E!&-1,'=)($=-!"
+ "'M-$&M!&%M)!%]5\"#=%!%<]!(=%$%M!!%<]!%\\U#&LU!&LM*'<9!%<I%$,A!%\\=#"
+ "%<A!',=#%<9!'L5&%<E!%;]\"%,1!&[]$'L5!&,!%'<%*%L%#&[Y)'+Y!%;Q\"%+]%"
+ "';U!%KU#%[E$#[E!%+A!%;E\"%[=$&;5\"$[5%$+1\"'K-!#+!!$K!$&;)'$J]$&JQ!"
+ "!ZM!&JY,$*Q\"#ZQ!#JI!%JI!#JE!%*A&$:9$$:-!$*5\"%*1'$J1(#J-!#*-\"#*%&"
+ "#YY\"!Z!!%*!!#9U##IU!&)](\"IM!%IQ)#9U!%Y=,#I=\"!)I!\"I=!\"I5!#IE%%)-("
+ "#8Y'$HY##HY\"#)%#$)!$#9%!\"Y)\"#9-!!Y1!\"Y)\"#IM!\"Y5\"\"95#$YA&%YQ$%Y9("
+ "#YI##9M!#IQ$\"YU%$)U*#Z-\"\"J!!#9Y$%J-\"#J1!\"Z9!%*1'#Z5!%*=#$J9%!ZA!"
+ "#J9!#ZE\"#ZI!#Z1\"#ZI\"#ZI!\"Z]!#Z]!#Z]!$+%\"%;%'$+)!#[)!#[-!%K9($+5!"
+ "&;-$%[=!$[E!%;M\"$[E!%[=!#[I!&+Q%$+Q!$;U\"%<%\"&K]'#,%%%\\!#%\\%#&,)!"
+ "&L1\"%,-!%,)!&L5'%L1\"(L=!$,=!#<9\"%L=\"$\\E($<I&),U\"%L]!%LM\"%<Q!$<Y!"
+ "$<U%\",]!#M!'$=!!(M=.%])\"%L]!&M)!%M)!$=1!%M5!$=%!$M!\"#-1$&=A$#]I\""
+ "%ME!%ME!)]Q(%ME!\"-I!#]E#'-M&%]Q!'=U'#=U!%]Y!&-Y!&]Q!\"-Y!&]]%$N)!"
+ "&>!\"%^!!%.)\"$>-$)>!%%^-!(>!!'.)!#^%\"'.%!%^1!'>=!(^%(%^)!%^-!$^%!"
+ "(N%,%^%!&>1\"%^1!&N)$&.9!(>-!%^)!$N1!&N)#*^1!).1$%^-!#>-!&.)!(>)%"
+ "%^%!,>9'(^%#'-Y!).%$$.%#%^!!(>!!&-Y!%]]!(=U!%]Y!&MY$$]U&%^)!'.!&"
+ "&=I($MI!%]M!$ME!#=U!&]E!%M=!$MA!$-=$']5!%M9!'=Q\"%]5\"%M-!%M1!$]9\""
+ "$])\"#=%!%<]!%<Q!%M!!$M%!&L]!'-!'%<Y%&<Q%'\\E#%<I!%\\A((\\E'%<E!%LA\""
+ "$<5!%<9!',=-$,%%%L1#&\\-(&<1!&[])%,%!&\\!$%,%!&+]%(+]%&+I!%+Q!#[I!"
+ "$+M!'[M%%+M!$KA#%+=\"&+U%&[A)%[-!$;=\"%;-'%+1&#[)!$+)\"%+!\"#ZQ!%JU!"
+ "!*Q!&JU!#JI!#ZM!#ZE!$*Q\"#:9##ZQ!%J=!$J9!#J5!\"Z%\"#Z5!#Z)\"$9]!#*%&"
+ "!9]\"$9]!$YU*%)Q'\"9=#$9U$#9M!%9I)$)E$#99$\"I=!#99$!)='\"95#\"Y-\"$Y-$"
+ "#HQ\"#(U##8Y$!)%!$Y!!#9%!\"I%$$)9!#I-\"#Y1&\"I5!#)1##))&$Y9'$)E#$YI$"
+ "$YA$#YI##YQ##IU\"&IQ*$*-#%Z%##I]!#J-!\"Z)%!Z-!#J1!#J5!'*-!!Z5!#J9!"
+ "$J9!$JU$$Z=\"#ZE!#JM!$ZU%\"ZU$$ZU%#Z]!$[5!%*Q\"$[%%#[-!$ZY%%K1(\"[5+"
+ "%[=%\"[5!%+9\"\"[9!%+U!%;E\"$[A!%+E%(K]'%+U!%+]!%+U!&[]#%+M!%\\%$%L)#"
+ "&L)'%,-!$\\!$$\\1#&L5&%<9!%<E!%L=\"#LE#%<E!*,E\"#<E!%<M!(,I#&LI+%<U!"
+ "#,M!%\\U#%<]!%-1$']!!&=)$&=-$$-)$%M5!\"=I!%=1$&M1%#M5\"#=M!*=5'']1!"
+ "(=5#%]A!%ME!&-A#%]I!$]I\"$MM!$MQ!&]Q!\"-Q!%]U!&N!$'-Y!&-Q\"%.)(%]]!"
+ "&-Y\"%^%!'=Y'%^!!#>!!%^)!(^%#'.%!$N)!%^-!%^)!'>-'%^-!&^)%$N-!&.5!"
+ "#>)!&.)'&.5!%^%!$N!!$N)!%^%!'^-$%^-!$N-!%^-!$N)!&N5(%]]!%]U!%^1!"
+ "%^)!'.%!'.!&*^!!'>!''.)!%]U!$]Q!&-Y!%M]%*.!)&]Y%'.%&%]Q!'-Q'%]I!"
+ "\"-I!#=E!%]A!$M=!$ME!%M9!%-A('M1)$-A$']9!*-5&%M5!#=)%\"-1!%--$%]%\""
+ "'=)$%]%\"$=-!',]'&LQ&&\\Q&%M-!%\\U#$,M)%LM\"&LQ!%LQ!%,A$%<Q!'\\E+\",E!"
+ "#<5\"%\\9#'L%,$<5!%L=\"%,5%%L5#&+]%%\\!#$;U''[]#%K]##;U\"%+U!#;M\"&+E*"
+ "%[I,%K1$#+M!&+A\"&;A&%+-\"$K5#$[5!#[%!!;-&$[!!#ZY!%;5&$;!#![%!$JU!"
+ "$JY$#:U##JA!%Z=&%:I$\"ZE!&ZE*#J=!%J=)$J1%%:9!$*1##J!!#Z%\"$J%!#*!#"
+ "$:!+$)Q#%)U$%)U(%9Q(\"IM$%)A$$9I%$)=$$)I!#I1(%YA+$I-##)-##Y=&$9I("
+ "$XU$!(U!#(Y#\"9!#$)-'#9!!#(U!#)-##I)\"$9-\"#Y-&\"Y9\"#I=%$I=&#9M!$IA#"
+ "\"II!$)=$$9Q!\"9I#$IU%!YY$$*!##J!$!)]!%:1!#Z-\"$:=##:9&$J9!#Z9\"\"J=#"
+ "#ZA\"#ZA!$ZI\"#JE!#JI!$J]!#*U\"'JU%#ZU!$[!!'+%'#[9!$+%\"$+)\"#[9$!;1\""
+ "&K1$%;5\"%+9!%[9!#;A\"%+M!%KI#%+Y!%+=\"#;Q\"#+U!%+Y!%+Y!$+U%\",)!&,!%"
+ "%,!%%L)\"$<-\"%L)\"\",1!)<5%%\\=#&<=%&\\9#'<5!#LE\"&<9!%<M!'LI!%\\Q\"%<]!"
+ "%\\Y#&LY!%<U!&M%%(\\Y&&]!'(]%!']%!(M9$$]1'&]-!%M1!$=1!&-9#%M9!$=5!"
+ "%M=!,-E(%M=!(-E!%]M!%]U!)=I!$MU!$MY!#=M!(=U'$]Q\"'=]'&M]$'-U!\"-Y!"
+ "%]M!%]U!%]]!%]]!'=]!\"-Y!*^!!%^!!!-Y!#>)!$N%!'.%!&>-\"%^%!%^%!%^%!"
+ "%^1!%^-!&^!%'N='%^%!#^)\"(^))$N%!&N)#'.!!(>)!+>%)'.)%(N5!%-]\"%^-!"
+ "(N!(&>!#'-]!%]Q!)M]2'.!%%]Q!&MY$(=Y!%=Y)$]M!'=I((-Q!+-M('=M#(-M!"
+ "%]U!\"MQ\"(]E/%ME!%MA!%MA!%M=!(MA.%M1!&]5!$--$&--#%M)!'=%$%]-''--#"
+ "%\\Y\"%-5#%M!!%M!!'<Y)#LY\"%<U!'<=%%<I!$LI\"%\\Q\"&<I%&,E$%LA\"%<=!$,=!"
+ "&,A$%L5\"#,1!$+]!%\\-#%\\)$&L5\"(,%)$;]\"%K]#&;]!%+Y!&+U%$KQ#$+M!%+M!"
+ "%[I$$;M\"(;M#&+=&&+5&&+9!$[5$$+1\"#[-!#[!!$+)&%[5!$[!!%*]\"$J]!%JY!"
+ "%ZY%$JU!#JM!#[!!%K!(#ZQ!$:A#$:5#!*=$&J=-$J=!#J5!#Z%\"#J1!#J)!%*!'"
+ "$Y]#$9Y(#I]!$IU%\"YQ$$)Q#%IA&#IE!#9M!#Y5#!9-%\"I1!\"Y5\"$9-(#9-!!Y!!"
+ "\"8Q##XI!#(Y&#(U!\"I%!#8M$$9%#\"I)$#99'#I1%!Y1!#I1\"$I9#$)5$#I9\"#YE\""
+ "$)Q##IM!#IE!$9U!\"IU!#J!!%IU'#J%!$YY##IU!&*)$$:-!#:-#!J=#\"J1!\"*5\""
+ "#Z9\"%ZA&'*E$$*A#!ZM!#ZQ!%:I(%JU!$*Q\"#Z]!%+-&$[!!\"[%!#[%!$;-'$+1!"
+ "#K5$$KA$&[9!$+E%%+E%\"[A!&[=$#[5$%;M\"#;Q\"!+I!%<!!&<)&&<%%$[]$%;E\""
+ ")L%'%\\)$%K]#%<%\"#\\)#'L9+&\\5,&\\1('LI*$<M!$<E!*\\E&$,I$%LI\"%<I!$LU!"
+ "&,]#$<Q!'LY*'\\Y+',]'%]!\"#=!!']%!%M%!$=1!%M-!%])\"']9%&]5!'=-((==("
+ "&=M$'M=$&-E\"&M5%&]=!(-I!%ME!&]I!%ME!'ME$$MM!&]M!$M]!%]Q!'-]!%]]!"
+ "$MQ&%]Y!'-Y&.]]0'-]!%]]!&.!!#.!%'.!%$MU!%]]!%]]!%]Y!%^!!\".!!'>!'"
+ "%^1!%]Q!%^%!&MY)%^%!$N%!%^%!%^)!(^!#(.!%%]U!)MU'&.)!(.%%%]Y!%]Y!"
+ "&=]#(=]!%]]!%]Y!$M]!%]U!$]]!&=U#&]Q!%]Q!%]U!&=M$$MU!%]M!'=A#$MI!"
+ "\"-Y!$MI!&]M!&]E!$ME!&MA$$=9!&-E\"%M1!'=1#&-5#&=)$*M1'%M)!%]!\"%--$"
+ "$M!\"'L]!'<]$$,]$%<]!&<U$%<M!%\\I'&\\I\"&,I$&LM&&,E#&<9%&<A%'\\=#&<-!"
+ "',A(%<A!',1)$,%!%<!\"&,)!%<!!%,-!%KY#%,!%'+Y%%+U!$+Q!%;I\"#+M!$+I!"
+ "#;I\"$[9!%+)\"#[=!$[9!&[5%$+-\"$+)\"$;-#!;)\"#+)\"#[!!%K!(%*]\"\"JY'%ZY\""
+ "$*U%\"ZQ!#:I##ZI\"%*]\"%JA!#J=!#J9!%*9'$:-$$Z5&#J=!$Z)\"#YY\"\"Z!!&I]+"
+ "#J)%$)]#$)U##9Q!#9I!%9M)$9I$#9A'#9E!\"IA!%)A'!)5!#Y9#\"99&\"Y)\"\"I)!"
+ "%(M\"\"8Q!#(M!#HY%!XI'#I!\"#I%\"#))&$I),$Y-$#))##Y1#$)5'#9I#$9U$#9A!"
+ "$II#$)E$$IM\"&9M*$)]#\"YY\"$)Y##9Q!$:5$'9Y#$Z5\"\"Z9!#Z%\"$*1\"#Z5\"&*5,"
+ "%Z-&$ZE%#JA!%*M\"$*M-#J=!$JQ$\"Z]!#ZU!$J]!#ZU!#+!\"$*]\"$+1\"\";%\"$K1$"
+ "#[1!$+5\"#+Q!&K=$%[=!\"[A!$[E!$[E!%;=\"\"+U!$;Q\"&\\!,%+U!'L!\"%,%!%;I\""
+ "%+Y!(,).$<-\"&<-&$\\-$\",5!%<9!&L%+&L9!'<E%\"<E\"&<9%%<=!&,E#&LI&&\\Y&"
+ "%LM\"(,Q#&<Y%(\\Q!%LY!$L]!%])\"%M!!%M%!$=)%%])\"%M-!(-=0'-)\"']1*&]9!"
+ "%]!\"&==$)-A!%ME!'=A($MA!#=A!#=5!(=I!%]I!%ME!#]M\"%]M!$MM!'=Q\"%]Y!"
+ "(>)!%]U!%]U!%]U!&-Y!&.!'%]]!%]U!$MU!'-Y!(=]!%^!!%]]!$M]!'N)#%>)$"
+ "'N!)#>!!'^-#'-]!&>!#%^!!%^)!'>!\"&^!%'>!''.!!%]]!%]M!%=]$)-]%#=]!"
+ "%^!!)]]-%]]!'-Y&(-Q!!-]%&=I#%]Q!%]Q!'=Q(&=I#(-Q!#=I!&=M#']M)&]E!"
+ "%MA!(-E!&]9!&-9#&]9!%]E!%]1\"&-9#$]1\"%]-!'M-*$MI!%M%!(-)!&M-!%M%!"
+ "%\\]\"(L]%$-!$$<U!$L]\"%<E!&<Q$%<Q!%LM\"'LM!%<5%&LI&&<9%(\\M&%\\=#%<5!"
+ "%<5!%\\1#%,1!(L-!$,-!%<!\"&+]%';]*%+Y!$[I!$+U!%+]!$+U!$+M)%+A!#[E!"
+ "$[I!&KE#&[A!$[=!$[)!%+=\"%+1\"#+1&\"JU$%;%'#[!!%:U##:Q#$*Y\"$JI%$*U\""
+ "#ZQ!#JE!\"Z5!$*A##J5!'*=%%:=$$Z)&#J1!\"*A!#I]!$Z-&$J!&%Z%'#J!!$IM%"
+ "%9Y\"%9Q%#IU\"\"IQ!#II%#)I\"#YE#!)A$\"9A#$)9$#)%#\"Y9\"%I1'\"I-!\"I)!#9!!"
+ "#8M%#HQ%%8U*#8E\"#)!##(U#!)!!\"I!!#9)!!)1!$)%!\"9-&#95$$9-%#9=$#YA#"
+ "$IE&$)I#\"YQ$#9M!#IY!%J!)$IY%%9I\"$*!#$*%##J%!#*)&!:1\"%:-!$Z5&$*5#"
+ "#J1!#Z5\"#ZI!\"Z]!$:M#'ZE(\"ZI!%ZU*%ZY)#ZY!%+%&'+%#$[!&#[)!!ZY!%[))"
+ "#[-!%+=%$;5\"';5(\"K=#&+1&%+1\"%[E!%+M!&;5\"#KM'$+Q!%+U!%KU#'KY#%+]!"
+ "&,%)$,%!&[]$&\\!$%L-\"$,-%#<5&(,%%%<9!&<9%&LA&$,A-%<=!%<9!&<A!%<A!"
+ "%M!!',Q((LQ!%M!!%<M!$\\Q'&L]&%]%\"',]#%M%!&M-!%-)($=%!%M5!$]1\"!-)!"
+ "&M%!'-5\"\"-9!$M9!)=E!&-A\"%]A!&]A!%ME!'=E(%]E!&=Y-&]9!(-Q!&MU%'MY)"
+ "#]Q#(MY(&M]$$-Q$%]U!%]U!'-U!%M=!%]Y!%]Y!'N!#%]Y!'-Q'']])(-]%'.%!"
+ "(N!!%]]!#=]!%]]!(-]%'>)!%^!!$]]!#=Q!%]]!'-Q!%]Y!$MY!&]Y%'.!!&=Y#"
+ "'-U!%]M!%]U!%=Y$%]Q!$]Q'%]M!'=Y'&-M,&-M\"%ME!%-I#']A%#=I!$MI/&ME$"
+ "&MA$#=A!(=5,&=E#'-9'&]E!'-5''-=!!=1\"(M1$&])&%M)!'M%%$=%!%M!!'--#"
+ "#,]!%<M!%<Y!%\\U\"&\\Q'%<M!(\\M!&LI&%<I!%LM\"&<=!&LA&&<=!%<=!%L5#(<5/"
+ "%L5#(,!!#<9\"$KY#%<-%%,!!$+]!&+U!!+M!';I\"#+M!$[Q$%+]!&+I%\"[=!$[A!"
+ "%;A\"&KE#&[-!%[-!$[5%#[5!#[-%%+)&!+%$#;9\"#*]%%Z]*$+%\"$*Y\"&JU)$JI!"
+ "#JM!$ZI!#JI!$JE!!ZA!#Z%\"$*=#&*1!\"J-!$J9!#J-!#J9!#J%!%J%)#Z!\"#I]!"
+ "$*!#&9U#$IQ%$)Y#')M.#YM##I9\"&)5#\"Y=\"#9=$$9=\"$Y1!\"I1!!Y9$#I)%&Y!'"
+ "\"8M#!HM#\"X]\"#HU%!8Y%\"H]!#9!'$)!!#)-##9%!#I-%#Y=&#)A#!)A!!YA!&IA'"
+ "#YE\"'YM-#95$!Y]!#IY!%YY+$)U#%)](#IU$$:!'#J-!#:9#%J-&%*1#$J5!\"Z5!"
+ "%:9!$Z5\"%:=(\"ZA!#JM!%JI!':E!$*E\"$+%\"%:U##JE!$;%#'+!/'+5\"&ZY\"&;%#"
+ "$+!\"#[1!#[%!';5'%[=!$[=!%+A!%K5$$[=!%KI##[=!%;M\"%+M!%[Y$!+I!(+Y*"
+ "%+]!&\\!$$\\)#%,%!%,)!%,1!$<I*%<%!&L5''L%'%<=!#<5\"'<I$'L5'$LM\"&LM&"
+ "%\\M'%<Q!(\\Q&$,Q$(\\Q,%<]!%M!!'-!''=%)%M!!&=-$&=1$'-1'(\\]!$M%!\"--!"
+ "%]1\"&M1%&M9%!]-$%M9!$=9!&-A#(-I!&]1!'==#&]E!&-I\"%MA!$MI!%]I!(=I'"
+ "&]M!']Y$&=Q((-Q!%]]!%]M!%]Q!%]U!$MY!&-Y!'-U!&MY$(M9.$MY!&-Y!(=Y!"
+ "&=Y#)-Y/&]Y%%-U#&M]$%^%!#.!%%]Y!%]Q!%^!!&MU$$MQ!&]Q!(-M!&-U\"%]U!"
+ "%]Y!%]U!%]M!'MM$%]M!&-M\"(=E')-=%'MM((-Q+&]M!%]I!%]U!$=9!%-=$#==!"
+ "'-=,&]9!)]9$)]5)&]=&&M9$$M1&$=%!&]9!&=-$&--#%M)!%M%!%<]!$<]!%\\]\""
+ "%LY!%\\]\"#<M!&,Y#(\\M&(\\Y!&LI&#LI#%LI\"$LA\"&,E#%LI\"&,=$&,5$%,A$%,1!"
+ "%<=!+,).%L)\"&L%\"#;Y\"$,!!'[Y-#+Y!&;Y\"%KU'&;U&$+M!$KM#$+9\"%[E!#;E\""
+ "%+I!%[A!$[5!%[1!%;-'$+5\"$;1\"$K1$#Z]!&K!$%K!$%:Y#$[!%$:M'#ZQ!$ZM\""
+ "#ZU!#JE!%*E'%JE%#JA!!:5\"\"Z9!$*1\"!J-##J1!%*)'!Z%(&Z).!Y]!#*%\"%)Q$"
+ "%9U%#YM##)Q#!IM#\"IM$$YE$$YI&#9E!#)-##9=$#95!#)1#\"Y%\"#Y1&\"Y%\"#Y%&"
+ "\"8U#\"XU\"#(U!\"8Q!\"HI'\"HY!\"I-$$9!&$)9$#XY&!)-$!Y%$!I5#\"I=$#99$$)=$"
+ "#II$%IE$$9I%#9Q!#YI#$)I!#YQ%$9U!#J!!%:!(#J%!$*%#$*1##J5!$*1\"#ZU!"
+ "#Z=\"#ZA!#:='#ZA\"#:=##JI!#J9%$:M#$JQ!&*U#$JY!!ZY!$+)!%+!&!*]$$+-\""
+ "$+)\"%[-&$[1%$+5!$[1!%[9!%+=!$[A!%KE$$+M!#;I\"#;A\"$+Q!$;Q\"%;Y\"%+U!"
+ "%;]\"',)$%,%!%<-!%,)!%<)!',-)%<1!)<5*&L9&),5)#<9\"%L-\"'LU!'<A!%\\Q\""
+ "%\\=#&,I$!,=!&,Q#&\\M\"%<U!'<U)(\\Y!%<U!&LQ&%M%!']!'&-%#$MA!$=%!&-)#"
+ "%M1!&M%!$=5!%M1!%M5!$-A$&M5%$MA!#=9!&==$%MA!%]M!%]1\"%-=$%ME!%-A("
+ "%MA!'.!!&-M\"'-I''MI)&=M#'MM((-Q!)-]%)=Q!&]Q!%]U!%]U!%]U!%MU%(MU\""
+ "%]Y!%]]!%]Q!%]U!#=U!%]U!%]U!%]U!$MU%%]U!%]Y!%M=!%-9$%]M!%]U!$MQ!"
+ "\"-M!%]I!*MQ0%]M!%MA!#=E!'-U!)=Q!%ME!%M1!%MA!$]U''M=$&M9%&-E\"'=A("
+ "%M9!&-=\"&]A!$-!)&=1$$]1\"'-)#%<Y!%M)!&=)$%M-!)-!'%M!!&-%#&=!$(L]$"
+ "%<]!%\\Y\"%\\I#!,Q!(\\E'%<=!&LE&'\\E\"'LM!\"<E\"&,=$%L5#'<9!%<A&&<-!&<1!"
+ "%L1\"$[U%$+]!%\\!#$,!!%K]'%K]#%+Y!$;Q\"\"+I%#+Q!%;M'&[U((+E*&+A\"$[=!"
+ "#[I!$[9!$[A!'+5*$JY!#[)!$+)\"![)!&+)\"$[%!'K-!$*]\"$*Y\"\"Z]$$JQ$$JQ!"
+ "\"ZM!$J=!#Z=\"$*A##J=!#*5\"%*9#$J5%\"J-!%J1%#J)!%J%\"#J)!$YY'%)]!%9Y)"
+ "#YU\"$IQ%$YQ##9M!#YM\"\"I=!#I=\"#91!%I1!$99(\"Y1\"!)A!#)9#\"I!!#9%!$)!$"
+ "\"XI\"#HQ%#XE#\"HU$#(Y##8]$\"(Y\"%Y!\"#I)\"#I%##I%#\"I%!\"I1!#I5\"$)9'#)=#"
+ "&9M&%)M!$9E$\"IM!!YM!#IQ\"#9M!!YM!&)Y($)]#$*%#%J%&#J)!\":5#!YY!'*9)"
+ "$J9!\"Z9!#Z5!%*A''ZA+#ZQ!\"ZI!$*M\"$JM$#ZQ!#ZU!&Z]%#Z]!#ZU!%+%&)+),"
+ "\"[)!#[-$$K1$$;1#$[5!(;9,&;9#&+5\"%;A&%KA#&+9&';A'$+M!$,!!'[I($+M!"
+ "%+Q!&+]!'+]%%<%\"&+Q!)<1!%L)\"%<-!&L-''L5'&<=!%L=\"'<9*&,5$$<M!#,A!"
+ "%<I!%<M!&<5!%\\E#%<M!%<Q!%<Y!&,Y#%L]!*<M#&\\Y\"#M!\"%M!!%M%!'-1''=)("
+ "$])\"'M-$$=9!'ME$#=-&%]9&&]1!(]5.'=9#&M9%%-=$#==!&-A\"']A%'-A!%MA!"
+ "$ME!%]I!%]U!%]I!%]I&(=E'%]M!%]Q!%]M!%]M!$MQ!&>!\"']Q$%]I!(-Q!#=Q%"
+ "$MM!%]Q!$MQ!&MU%&]Q!'-]!#=E!%]M!&]Q!(-Q%$MY!&MI$(=M!%]I!#=]!&]E%"
+ "%]Q!\"-U!*>!4'=I(&]Q!$MA!%]M!)=A+%]5\"(-E!&=M$&-1#(=9-%-5(%]9!'==("
+ "'=5#%]5\"%]1!*-1*%]%\"(]5$$=)!%]-\"#M%\"%M!!%M-!&L]!&LQ&(,],'-)'&LY!"
+ "'M%$%LE\"&\\Q'&<M!(,I,&,E#)<E.&<9%&\\Y&%<9!'<1*%<9!$,5!%,-!$<1%$,1%"
+ "%L!#(<5%%,%!$;Y\"&K]'%,%!&,!!#+U%'[Q%$[A$&+M!&KU'';I\"&;M\"%+A!%;E\""
+ "%+=\"$[E!%[A(%+5!#[1!#[A!#[5!#[9!$+)!(+!'#Z]!%JY!#[!!#JI!&JU!$*M*"
+ "\"ZE!#ZE\"#Z=\"\"*A\"#J=!\"Z9!&:9!#Z5\"#J-!&:)%\"9]&$:!$%J)\"\"I]!!YY*#9Y$"
+ "$)Q$#YI#\"9M#$II&!YI!\"II'%)M$#)1##I=(\"95#\"91#$)=$#I!#!9)\"#XY#$(U$"
+ "\"8I!\"8M!#(I#\"8U!$8U&!HU!#(]##(]!\"I-!%99)\"I%!#Y-&%))%\"I1!#99!\"I=!"
+ "#YE\"%IA#\"IM$#IQ!!YM!#I]!#YQ##9U!#IY!$9U$#YU\"#J!!#J%!$J1\"%:%%#J1!"
+ "%Z9*%:1!\"Z9!#J=!#ZQ!$*E\"#JI!%*I'$:U$\"ZM!!:U\"#[!!&*Y\"$;%##[!!%;-'"
+ "!+%!%+)&';)#\"[!!%[5)(K1!%+1\")+A&%;E\"$[=!'[I!$[E!$KA##KE#!+Q!$[U$"
+ "%[I!%+Y!%+Y!%<%\"&<=!%,%!%,)!$,)%%,-!$<1&$L1\"%\\5#%L)\"&,1%)L=!$LA\""
+ "%\\E(&,E#%LI\"#,M!$,Q-%LQ!'<Q$&\\U'',Q#(<Y-$,A!&<]$&,]#&-%#&-!#$M%!"
+ "*]%/(]%*'--'$-)$&]1!%M)!)=%\"#M9\"'=1.%MA!'-9'#=U!'--#%M5!'==(%MA!"
+ "(-='%-A,&=I('MM$%]M!%ME!(-M!%ME!%]I!%]I!&MI$\"-A!'=M\"&]M!'-I&%]M!"
+ "'=M#$MM!\"-I!(=M,&MM$%]Q!%ME!&-U!#-E$&M]$%]Q!(]M.$M]!%]I!&]E!']I%"
+ "$ME+&]M!%]I!$M9!&]A!$MA&#=1!%M9!$M9!(-A!'-='&--(%M5!%M1!)-5!&=9$"
+ "&M-!'M5$'-1'&])'%M1!&--#&=)$'-%\"&M%!%<]!',Y(%]!\"%\\Y#%]!\"$<Y!%LU!"
+ "#,U!%<M!%\\M#%<A!&LA\")<A)&,E$$,A$(L5!&<9%$<E!%LA\"$L9\"&,-%%,-!\",)%"
+ "%,)!'L%'\",)!%[M%&+]!%;U\"%KU#'KM'%+Y!%[Y(%;M''+M!\"[I!$[A!&+Q!$[5!"
+ "$+=!&[9)%;9&%+1&#[5!\"[)!%K!(\"[1!#[%!$*]%$*U\"\";%\"#ZY!\"ZQ!$JA!%ZM\""
+ "%:5!%:=$$*M\"#:9#\"Z9!%:5(#Z5\"#Z1\"\":1&$J)\"#J!!%*!$#Z!\"$:)$&J1*#9U!"
+ "%IU&#9Q!#9M!$9E$%YE!$)E#$I9&$YA*#I9\"\"I-!\"I1$\"9-#\"I-!%9%)#9%!\"HU!"
+ "!(E&$8I)\"(I\"$XY*\"8Q!#(Y#\"(Y\"!H]##XQ##9!'\"I)!#I5%\"I1!!9%%\")1\"%Y5."
+ "\"I=!#9A!%)A'#95!#IA%\"IU!#9E!$II&$)Y##IY!$Y]&\"IQ!$J)!#J)!&*-''*-)"
+ "#J9!$J=!\"J)!#ZA\"#J=!#JA!#Z=!#JI!%JQ!$:M$#Z=!$ZU\"%ZU&%*]\"$Z])#ZY!"
+ "#;%##[)!%J](%+!&$;=\"$K1$%[5!\"[1!#;=&&;=\"&+E&$[A!&KA($+M!%+I)'+Y-"
+ "&;U&%L!#%+U!%L)#%+M!%,!!$\\!(%L!,'<!&$<)\"$,1!%<5!&\\%#',9$%LA\"'<=!"
+ "%<A!&<=!',M(&LM&%\\Y\"(L]$&\\M'%LQ!%<U!'LM.&\\Y\"(,Y\"%<I!&,U#$=)!&]!'"
+ "&]%''-)'%M-!%M)!&]!'&--,(-1!(=9\"%]1\"%M1!%M=!%M9!)=5\"$=5!&]=!%]=!"
+ "%=9$(]5.%]I!'M=$%]5'*=9!&]E!*M=\"'=E\"(-E!%M9!#=Q!)]I(*-I*)-I0%]M!"
+ "%MA!&-E\"(-M!$MI!\"-A!%]I!'MI)&-Q\"'-I'%]M!%]Q!%]E!(-I!$=E*(M9.&]5!"
+ "%MA!(-E!&=A$%MA!&]I!(-E!(M1)&-Q\"%M=!%]5\"#=)!%M5!(-E!&-5#$=1*'=1("
+ "&]9!%M-!'-1\"&=%$&=%$']%&&=)$%<Y!$<]!$LY\"&-!$%,U#$<]!&LU!'LY&&LY!"
+ "%\\M#%<Q!%LI\"(LI!%<5!',I)#\\A#$<I!%L9\"$\\1(%<5!%<5!&<A!&<1!%\\%$%\\1#"
+ "%<%!%+Y!$L!#&KU'%+]!#KY'%+Y%$;Q\"$;E\"$;M#&;A'&+A\"&+E%$[A!'+=&&[A!"
+ "%;9\"$;=\"\"[-!$+-\"%;-#$K-$![%!!+!$#Z]!#[)!%K%!#Z]!$:I##ZQ!$ZM%\"ZI!"
+ "#*Q\"$JA!%Z=&$JI%'*=%#J1%$J5!#Z-\"#:-#$Z5\"$:%$$J!&%9]\"%9Y%\"IU#!)Y!"
+ "%9I\"#YM\"#9M!#IE!$)E##9A!#I5%#I=%#)1#\"Y1\"#I1%!Y-!$I!$%8]##)%'\"8Y!"
+ "#(A#\"XM%!HM##HQ&#HI%#HQ%\"8]!!Y!!\"I=!!Y)!$9)\"\"I-!#9-$#I-%#99$!Y9!"
+ "\"I1!$9=%#9A!#9E!$9M!#IM!%YQ$&)](#9U!$9Y!&Z)$$Z!&#*%#\"J%!\":)\"$:)!"
+ "#*5\"&:5)$*5##Z9\"#J=!!ZA!$:E'#JE!%:E!#JI!#ZQ!$*U\"$K)$#ZY!$K!$&K!!"
+ "#[!!$*Y\"$[)!%+5!$K5$\"[-$$K=#%[A%%+9\"%;=\"&+A\"'+Y!%+M!$;A\"$+I!'+U*"
+ "%+U!%,!!&KY#%+]!$,!!%,!!#L1#%,%!%,-!%,)!&,-$%LE\"%L)##,1!#,9!%\\9#"
+ "$\\M#$<A!'L=+&\\E\"&,I#(\\E!#LI#'L=+&]%!%,Q$%<U!%<U!&<Y)%]!\"'\\]&%\\]\""
+ "&-5#%M!!&-%##,]%'=)-$=)!%M-!$]1\"%M1!%M9!&=9$'ME)'-A\"(]5%%-9$%M-!"
+ "\"M9'&M=$'=9(&]=&&-=\"'-A'\"-A!$=M$%MA!$MA!(]E.%M9!&-M'%MA!%]Q!%]M!"
+ "#=E!'=Y\"'-E!$MI!%]I!%ME!\"-E!(-9'%]I!$]E\"%ME!&-M(#=E!%M=!'==(&M9$"
+ "'M9$$ME!%M=!%]=!$M=!'-E!#=A!%-9#%M5!(=9#&-=\"&-=\"%M)&$M5!'-1'$M)'"
+ "%]-\"%])\"%M5!%]-!(-%\"#=!&'M)$&L]!(,U'&\\U&%<Y!&LU**M%$&LQ!&<Q$&,Q#"
+ "!,Q!$<Y!%LE!&LY&'<9*%<9!%<=!&<1!%<5!&<=!&<1!&<1!%L-\"&,!!%,)!#+]!"
+ "%<%!%,!!$;]\"$+U!&;M#'+U*#[I!%+Q!$[Y$%KA#%K9$&+A&%KA$$[E!%;9#$[5!"
+ "\"[9!&[5!$K-$$[-!$;%#&ZY.#:Q#$*]\"$JY!#[!!#ZE!%:A!%ZQ%$JM!$ZI!#J5!"
+ "%:A($*A\"#J1!#Z9\"(*5&#J=!#Z-\"$JA!#J)!$J%\"#IU$#J)!#I]!$YY)$IY&\"YA%"
+ "#YQ\"$YI*$9I(#)E##9A$$Y='\"II!\"I5!\"9-##)!$\"I-!$Y1!%)%)$)-$#9!\"\"H]!"
+ "&XU$\"8E!\"(E\"#(M##XY&#(U#\"8U!$8Q&%8]*#8Y!#XY!\"I%!\"I1!!9-\"\"I1!\"II!"
+ "\"99#!Y9!()9%'IA-#9E!%)9(&9M&$)Q$$YY&$IU%#9U!#)]\"&*%$#J%!$Z!'!Z)!"
+ "#J%!#Z9!#J=!#J9!%Z9'#J=!#J=!#ZA\"\"ZI!\"ZI!$*M\"(*I%\"ZU$%JU!$*U\"%+!\""
+ "#;%\"#[%!\"*Y)%;-\"$+)\"#[1!![1!%+=!$[A!'[9!%;A\"'+A.$KI'\"+5!$[I!$KI#"
+ "%;Q&\"\\!$%;I\"%<%\"&,%!&+]!#,!!'L!'),)-%\\9#%\\!$'<-%%<1!%,1!%<5!$,=$"
+ "&<9%$,9!&<A!&<=%%<I!%LE!&<I%%LI!'LI*&LQ!%<M!'<U)$LQ\"%L]!&\\Q&%<]!"
+ "%L]&%M!!&,U($=%*'-%#%<]!$]1\"&M)!$=%!&M9$'])&'-5'%-1$%M=!%M1!%]-\""
+ "%]5\"$M=!&]1&%=I$&]I%%M=!%ME!&-9#%M5!\"M=\"%]=&&=E#$MA!%]=!#==!&]E!"
+ "&]A&#=M!%MA!&MQ$%M=!%]M!%]Q!$MA!#]Q(%MA!&=A$%-=$'-A'#]9##M9!&]9!"
+ "&]=!#==!&-=#']9!&]5&(=9\"&M1%)--1(-9&&M1%(M=#$-5$&]!\"&--#&])''-1\""
+ "'-)'(-%\"'=)$%<U!%M)!$=)!$]%\"(,]'#LM&',Q#%\\Q\"%\\]\"%<Q!%<M!%\\Q#%<M!"
+ "%<A!&<E!%LI\"%<A!&\\E(%<1!%L9\"%,=%!,5!$<-\"&,5$)<-%&,)!%<1!'\\=,$L!#"
+ "%,)!%,)!%+Y!(+]%&+I%%[I!#+U!%;I&%[I$%;A\"%;E\"%;M\"&[9!\"[E!$[9!%[5!"
+ "&[9!$+5\"\"[1!&+-\"#[%!\"[%!$;!##JI!#*U\"%*Y\"$ZY%#ZY!&:I!#JE!&*E(%JE)"
+ "$JE$#Z=\"!ZI!#J1!!Z%!#J5!$:-!#J-!#J1!#J%$&9]&%*1+#9U!$)Y#$9U$\"IE!"
+ "%YI!$9M$&IE'#99$$)I#!)5!!I1&#)5##I1\"%)9%#)-##)-#%HY$#9!!\"I!!!8]%"
+ "!HE##(M!#HI%!XM!!HQ!!HQ&\"8M!#HE&\"I%!$)!%#9-!#I)%#95!%9))\"I1$#)5#"
+ "#9=$#Y=#\")9\"#IA!\"YE%#YE##9U!%IQ)#9M!!YU!%J)&$YY#%J!#\"IQ'#Z!\"!Z)$"
+ "$*-#\"*9!#:1#$:5$$*9##J=!&:A!#JM!#ZE\"!*Y!\"ZI!$*M\"#ZQ!#:U\"&JY%%;)#"
+ "$*U\"$[!!#[!!%K)(#[)!$+-\"$+-\"#[5!%+1\"$[E!#[5!$[)!%[A!'+E*#[I!%;M\""
+ "$+M!$;Q\"$[5!%+U!&;U\"%+U!%+]!%L!#%\\%($<%\"%\\)#)\\!)&<1!%,1!&,9$%L5&"
+ "'L9+$\\A#$L=&%\\E#%L-#%L=\"(\\A'%<I!',=('<A!%LM!(LY$%\\U#%M%!*<]#%])\""
+ "&LY!%M)!%<]%&=)$&-)#$=)!)=%'&LY&&=9)%])\")M-#%]-\")--+#=1!%]1\"%]-\""
+ "'--\"&]1!%]5\"'=5(%<]!(M9)%M-&&=9$'MA$%]=!(==\"&]9!$=5!$M=!&]=&%MI%"
+ "&]A%%]=+(M=#%M9!$M=!(]=$%M=!(M=.$]9\"&-=#%]M!']5!%M=!%MA!'-Q&&-=\""
+ "&=5$$=9!$=9!']5!%]=&&]5!$=1!%]5\"%M5!$=9!+=-&&M)!%--$%M!!)-)0%M1!"
+ "'M)*&-%-%M%!(-!'#L]\"#,]!&LY!)LQ%&<=%'\\Y!%\\M'&<U$&,Y#&,M$&LQ!&LI&"
+ ")<9%%<E!%<=!)<A.%<=!%LA\"&,)!&<5!&<)!&L9'$,5!'L%'%L)\"$+Y!)<%!';]!"
+ "%,)!#,!!%,!!&[A!(+U%$+I!$,)!$+M!%[I!&[E(&[1&%+1\"%+=%%K!$%[)!%J]!"
+ "$;-#$;-\"#[)!#+!!#[%!#[-!#*]\"$ZU%%;!'#[!!#ZU!!ZE!\"*M\"$:M#$*=\"%ZA#"
+ "$*=##Z=\"$:1!\":5#\"Z-%%J1\"$J)\"#J-$#J)!\"Z%\"\"Z!$$IY\"$9Y$!YY!%*!'$9Q%"
+ "#9I!&)M%$)9!\"I=!%YM(\"I=!!)5$#I9%#Y1#%(Y%%9)#\"Y-%#9%!$H]&!(]!!XQ!"
+ "\"HA\"&8E%$8M&%HM+#HM##H]\"\"HY!$8Y%\"I!!\"8]!#)!##XY##(]##9-$\"I-!\"I-!"
+ "\"I5!\"Y5\"#II!%Y=,$Y9$\"IQ!&II!#YM#$)U#$9U$%)U!%)Y$$)]#$*%#$*)##J%!"
+ "$*)##Z-\"#J5!#ZM!$Z=&#J1!\"Z5!#Z=\"%:A##JE!%*M#\"JU#$*U%#JM!$JY$$:Y#"
+ "#Z]!#ZY!%+=!$ZY%#[)$#[1!%J]!#[=!#[=!%[=$#;1\"%KA$#[1!$[A!&KI''KE("
+ "$[E!%[M)$+Q!$KQ#$[U%'L%\"%[U$%[U$#\\!$%<!!%\\-##\\-#%\\)#%,9$(L1\"%,-!"
+ "%L9\"%<-!#<9\"%<A!%<9!%LA&&<A%&,M#$LA\"%L1#%LI\"(LI!&LQ&%\\Q\"\"\\M#'\\U!"
+ "%\\Y#&LY!&LQ*%<]!%<]!$=!!&M!!%M-!%M)!'-%\"&]1&&M!%&=)$$]-\"%]-!&]5!"
+ ")=1'']5%&--#&]-!*]5)$=5!'M1*&=1$$M%!%M5!']5+&-9\"']9+&=A$(=5(&]5!"
+ "(M-)&=1$%]I!$]5\"\"M=#'-9'&-A\"%M=!#==!'-9\"#]9#$=-!)]A$%M9!*MA\"(=)-"
+ "%]5\"&]-&&]Q!%]1\"%M1!)]=$%M)!$]%\"%M-!&M-!'--\"%,Y$%M)!'=)-'--\"&-%$"
+ "%M!!%]!\"%\\Q\"'LY%&<Q)',Y#&,Y#%\\U#',U#',Q#(LQ*',M)\"<M\"%<I!%<I!&<E!"
+ "%<A!%<Y!%\\=#%\\=#&,9$&\\-((\\5,%,1!'L-&#<-\"!,)!&\\)#&<!&%\\!#&,-$%+Q%"
+ "%[Y$%+Y!%+M!$+U!$+M!!;M\"#+=!$+M!%;M#&;Q'\"[A!$[5!$;A\"#[5!%+1\"';9\""
+ "#[)!#[-!$[)!$[%!#ZU!';!0&:]'$+!&%J])\":E\"#ZU!$JM!#JM!#ZU!&*E$#ZI!"
+ "$ZE)%JA%#JA!$J%!#J5!#Z-\"$:!!$Z%#&)],%*%*$9U$\"YY!\"IY!$)I#$9Q%%YE'"
+ "\"IM!$9E$$I9&$9A!$)='\"I9!$95%#I1\"#)1##I1\"\"Y%\"%Y%\"$8U\"$H]#\"9%##8U$"
+ "\"H=\"#8=%#XE$!HE!\"HM!#X]#\"8Q!!HM!!8E\"#(U##9!%\"I!\"\"Y)(\")1\"$)1!\"Y%#"
+ "!)=!&9=$\"I9$%)=(#)Q##9E!$9I%$YM'%9Q%$:!!#9M!$9Y$$9]!$IU%%J%)#Z%\""
+ "#J-!%:-!#Y]\"!Z-!$J5!%:A!#J1!$:1!#J=!$Z5\"$*Y\"$ZQ\"$JM!(:U%#[!!#JM!"
+ "#J]$&;!(#[1!#[%!$;%#&;)$\"+)!#K-$$+1\"%;A\"%+E!%K1$%+=\"%K9$$+A!$+M!"
+ "%;M\"%+M!%+M!$+Q!$[I!&;Y\"%+Q!%[](#+]!'\\)($,)!%,%!%\\%#%<)&*L%'&<5!"
+ "%\\5#%L5#',1$&<)%&,9$%LA\"',A(%<M!%<E!&<E!'<A!'\\I\"%<Q!'L=+\",I!%=!*"
+ "'\\M'*,Q,%\\U\"'<Q$',]'&=!$%M1!%<]!&]!'$=%!&-!#%]%\"&]1!&=)$']1%'=-$"
+ "(]-%&-)'&=1$%]1!%]1\"']9!\"-1!&M-!%M5!%M5!%MA!)M5(&=5.*==0&]9&%M1!"
+ "%M)!&M5$*]5.%MI%$=1!%M1!&]9!%M5!(=1'(]5*%]5\"'-5'\"M9\"&M5%'M-%%M9!"
+ "#=1!%M5!$]5\"%M1!&-1#&=-$%M-!&-)#&,]#'-%#(]9*$M!''\\Q+&,Q,%\\U#&\\]\""
+ ")<]-&M)%%\\Y\"$LY\"%<Y!)LU3%<Q%%\\Q\"%<Q!%<E!$<M!)<A$(,E-'LE&(<9%&<A%"
+ "%\\9#%<=!%L=\"%<9!'<1%&<1!%<=!&,1$'<1!%L)\"%<%\"&,%%&,!!&,%!%K]#&<-!"
+ "%;Y\"$KQ#%;]\"!;E\"(;Q\"#+I%&;E&%+5\"&+9&\"[E!$[=!$[9!$[A!#[5!#[1!%+)&"
+ "%K%!$K5#%+)\"%*]\"$+!\"%JY$&:U$$;%\"#ZY!$JQ%#JE!$JA!$JQ!%JE(#JA!#J=!"
+ "%Z5*!Z9!#J%!#J9!#J)%$J1%'Z)-$:1$$9]$#9Q#%I]&$:!!#YU\"$)I##II!$9]!"
+ "!IA##9I!#9I'%)=(%Y=(#Y9##)=#\"8]!\"Y%%$Y5*#I9%%9!#%I!(#)!#$(Y(#8Q!"
+ "#(-$#(E!\"X9(\"XE#\"HE!#HM%%XU&$(U!#XY)#X]&\"X]%#I%#$I)'$)%!#))#\"I5!"
+ "#I%#$)5'\"IA!!I=##9E!#IU!%IA#!YA!\"9M#&YY,$IY\"$J%%$9Y!&*-'$Z1&$9]$"
+ "$J%%#Z)\"$J)%#J5!%*9&$:1!$*9\"&J9*$J5!%:=!%:E(#ZI!$JQ$$JI!$:M#$ZU)"
+ "\"ZY!$:Y#\"*]%&+!*$[!!$*]\"%*Y\"$+)!%+%&#[1!#[5!%;9#%[1!'[=)#[9!'+A\""
+ "%+A!&[=!$[U$#KM'#+Q!$+U!$+M!%[Y$$,!!%,%!&,!!%,%!#,%!#<1\"$+]!&[]$"
+ "&<-!&;]\"%,1!(<9!%L9\"&L9!(,A##,1!%<A!'\\=#%<I!',I#(\\I!),M'%LY!\"LM#"
+ "$\\Q#)\\Q4%\\Y\"#LU\"\",Q!&<Y$(<]##LU\"%<]!%M-!&M!!%M)!$M%&#-%%%M%!$=-!"
+ "\"M)\"&=)$%M)!%]!\"%M5!$-5$%M5!#=1!'-1\"#=1!%M-!#=1!(-9+%M1%$=1!%M1!"
+ "#=1!(-1,(,Y(&-1#%-5$%M5!%M9!%=)%%]5\"%M9!%M1!)-9!%M9!%M9!*-1!'M1*"
+ "'M5$&=-$&M9$&=%$(M!.%M-!(-9+'-!(%L]!$=%!&=)$%M!!']!'&L]%%<U!$<]!"
+ "&]1!%\\U\"%M!!%LU&$LU\"%,Q)%,Q)\",Y!'LM!%<M!)<M)%\\I#&,M$#\\=#%LI!%<=!"
+ "(\\-#%<9!&<9!$<I!\"L5+%LE\"$<-!%<9!$,1!%L)\"%L!#%\\-#%+]%%KU#%,%!$,!!"
+ "'+U-%+U!&+M&&;M\"%+U%$[I!%[E$%K=#&;E\"$[=!&[9%#[9!&;5'$+1\"$+5!#[A!"
+ "#[5!#[%!%;-\"$+)!#Z]!&:Q($JY$%ZU\"$:Q$$*Q\"#JM!%ZM*$:Q##J1!#J=!\"ZA!"
+ "#Z9\"#J5!$IY\"%:1!$*)##I]!!:%\"%Z)##J!!$:)$$)Y#!IU&!9Q\"#IQ\"$IE&#99!"
+ "%9E\"\"IY!#9A!#I=%\"IA!#Y1)#)1&\"Y9\"$)%!\"I!!$9%%&Y%#\"XY\"!8U%\"HY$#XM&"
+ "\"8E!\"(E\"#8=%!XE!\"HI!%(M,!8U\"#H]\"!XM!$HY#$8M&#I!#%)%(#Y%$$I%&\"I9'"
+ "$95%$)5$\"I9!!))$#)A##9=!#9=!#Y9#\")I%$9M!#)Q#%)U'#9U!#I]!%9],\"J!!"
+ "$:%$\"Z%\"%:-($*5\"#Z5\"%:5!#J9!%JQ!#Z=\"#JA!$ZE%&*E#%ZI&%JM!$:M'$ZY\""
+ "#:Y#%+!\"&*U\"#*]!#[!!#ZY!&[1&$[)!$[%!!+1!%+=&$[9!$;5\"%;1\"![1!%[5!"
+ "%+Q!$[9!'[M%$;U\"$+E!&+Q!!+M%%;I\"#KM')+Y))+])%,)!%,!!%\\!$%,-!%L)\""
+ "%,)!%L5\"&\\1(#<1\"%<5!#,=!%L9\"$,9!%<E!&<A&&<A!%L5\"%<E!%<I!%<U!$<Y!"
+ "%LA\"%LQ!&,I#(LM/%<A!$LU\"&\\Y&*<]($LY!%L]!%<Y!&<]$%LI\"&LU!']%+'=%$"
+ "%]-\"%L]*'M%%$--$%-)($=!!&-%$&--#$=%!']-!%M-&'=-$$=-!(M-$%]-\"&--#"
+ "'--\"%M%!%M%!'-!#%M-!%M-!'-1'']-*(=--&M%!%M%!%]-\"&M%&%M-!%M!!&M)%"
+ "'M)%%M)!(-!\"%M-!%M!!$=!!%M)!'M-*&-%#&-!#%]%\"%<]!'=%)$<M!#L]\"%<Y!"
+ "%<U!'LY*&LU!%\\U\"%<U!$<U!%\\U\"']%!&LE&%<9!&LE&&<M%%\\9#*L9*$\\5#(LI%"
+ "&<9!%<9!'<1!%L-#%L-\"%<-!%,-!'L)#$,)!%L%#%\\!#$,-!&L%'$+U!'[M-%+M!"
+ "'+Q*$KQ#%+Q!$[I!'+U)%;=\"&;I\"&+A&#[=$&;E&%;9&%;1\"!;)\"$+)\"%+%&$Z]-"
+ "%+)\"%K%!$*Q*#Z]!$[1!#*]\"%ZI*$JQ!':Q!#JM!$:M##ZI\"$:U#$:E$#ZI\"#J=!"
+ "&*1$$J5%\"*1\"#ZA\"$J%(!Z)!$*)##J%!%9])$9Y!#Y]\"!IU##)Q#\"YE\"%9](\"YQ!"
+ "$9E%#9E$!Y5!!)=!#)9#\"Y5\"$Y-*#XU!\"I1!#H]\"#9)!#(U!\"8U#$(Y'\"8Q!#XQ#"
+ "\"H9!$X=(#(M#\"8I!\"HE$#(=&#XE##8Q'\"8I!\"8Y!#8]$$I-'&I!)\"I%%\"Y)\"\"Y-%"
+ "$)!'#91$#Y5&#Y5&#Y)##Y=\"$I5&\")5\"%I=#\"IU!#II%#YA\"$YU##J)!%J-\"%J!#"
+ "#J!!$:%$#J!!#J%!#J-!$J-%#J5(%*5#$*=#'JA\"#JA!$JA%&:E!#JI$#*M\"#ZQ!"
+ "$ZU\"#ZQ!!ZU!'J]!#+!\"\"+!\"%+!.%K)$%[9$#[-!%[1!$K1$&+A&$[%!$[=!'+A\""
+ "&[A)%;E&&KE$$[I!$+I!#KQ##;U\"$;U\"%+E%%+M!';Y*%+U!%\\)(#+]!%L-\"&<%&"
+ "'\\!-'<-!&<-%&\\1#'L-\"%<5!$L9\"%<5!&<5!%\\=#%L9\"%<1!$\\A#%LA\"%<=!#LA\""
+ "&\\I\"'LM+%<M!%<M!%\\Q\"&\\5(&<M!&<U%%M%!%<Y!$LY\"&L]&%L]!'L]*(=)-&]!!"
+ "%]!\"'=%)%M!!%M1!%]%\"%M%!&-%$%]-!(--\"%M-!&]1&&]1!$M)!%M)!'M%$&=1$"
+ "%M1!%M-!\"--!%])\"#--$%]-\"%M-!&M!*#M)\"&-)#(])*&-!$%M)!(,],\"--!'-%\""
+ "&M)!&--#*-)+&-%$&]!!%M1!%M)!%\\]\"%M)!&\\Y&'-1\"%\\]\"&LY&'<M)%<Y!$<Q!"
+ "&<U%%<E!%LI!&,U#'<Q)$<Q!%\\I#'<M%#<E!&\\I\"$,=!%<I!%<=!%<A!$LA\"#,9!"
+ "(L-&$\\5#(L-'%L1\"%,)!&,5%$,!!',!%%L1#&L%'&;]\"&;]\"%,)!%+Y!&[Y)$[I$"
+ "%+Q!%;M&';M\"&;M\"%;E\"(;I&$[E!&+9\"$[=!$[1!$+5\"%+9&\"[9!$;%##K1#!+5!"
+ "%+!\"$:Q#$*]\"#[!!%JY!%;)'$JU$#:E#$*Q\"$ZE&#JI!%:A$&*A#\"Z=!!ZE($*9\""
+ "#Z5\"#J5!$*1#':A!%J5)#Z%\"$*!##Z!\"$)]&%IY*%IE$&)]($)E##9M!#YI#%9M)"
+ "#IA\"#9M!!)=!()I'#Y5#\")1\"\"I)$$)A'\"I)!#I%#$)!%!))!\"9%##8U$\"HQ$\"XM\""
+ "!(=!\"81!#H=\"\"8E!#(E!\"XM\"\"(9*\"8Q!$H]#$H])#XQ$#Y!&#I%##Y)#$8]\"#9)!"
+ "\"I-!\"I1!\"Y)\"#95$#Y9#\"IA!#9E!%YM$\"9A#$)=!#YI#%)Y!#IY!!YY!$9]$\"I]#"
+ "$YQ##Z)\"%:1!\"Z)!#J-!%:1!!Z9!\"Z5!#J-!#JI!#ZA\"%ZM\"#JI$#JI!#*I\"#ZU!"
+ "$*Y\"&ZU*%*U'%ZU)!+!!#[-!%[!&$+%&$;%\"#[5!#[-!#[1!$[5%&[5!%K=#'[A!"
+ "&K=(%+A!%+9\"'KE('[I!%+E&#KM##[E!#[I!%;Y\"%+Y!$[Y$&KY'#\\!$%<!\"&L!#"
+ "&L%'%<9!%\\!$$,-!%L!'#,1!&<5%$L=\"%L1\"$<9!%L='',=#%<E!&,E##,E!&<E!"
+ "%<=!#LI\"%<E!+LM*%<M!(LM!$<E!%\\Q\"%\\U\"%<U!&LU!',Y(&\\Q\"&]5!)-1!(\\Y!"
+ "&,]#%]!\"&\\]\"&]!'\"M!#&M!&$<Y!%M)!'-)\"%M-!\"M%\"%\\Y\"%M%!%M1!$=5!'-)\""
+ "%]9&%M)!%=!$%M5!%M%!%]-\"%M-!(])%']!!%M%!(=%(&]-&%<]!#M%\"%]%\"\"])$"
+ "&]-&$=!!$\\]#%]1!%M)!%M!!&-%$%M)!%\\Y\"&M!!'-!-&LY&%LQ!&LU!%\\U\"'LQ%"
+ "$\\I#)\\Q&'LM*#,A!&\\Q'#\\Y#%<E!&L=\"%,Q$&<5%',A-%<=!\"<A\"&<=%)<1!(,9-"
+ "(LA!%,1!%,1!%,-!$<)\"%,%!'<%!$KY'';Y+&,!!'+Y!&<!\"%+Y!%\\5#$+Q!&KQ+"
+ "$+Q!#[E!%;I\"';M+%[A!#;I\"\"[9!#[=!&+A\"%;5#$+)\")[1*$+-\"#[-!$+1\"$Z]%"
+ "&+!*\"K!$#[!!#ZU!#Z]!$ZE\"':U)\"ZI!#JI!#J5!%*A#$:Q##JE!%:A#%:1)!J9'"
+ "$J)!$J9!#J-!\"J1!#:%##)]#%*!!#)]#$YY#$9Q(#Z%\"#IU!#9Q!%YQ+\"YU\"#)Q#"
+ "#9A$\"Y9\"!)A!\"I5'#I5%#91$\"Y)\"!Y1!%)!($9)%\"Y!\"#8M$$HU)#HQ\"\"8Q!\"8I#"
+ "\"85!\"8A!#(=#\"8=!!(E!\"89!!HI!\"XM%#8Q!\"8Y!!(Y$!I))\"8M!#I!%$I%*$))!"
+ "\"I9!#Y!$$)1'\"I5!$Y9!!Y9!%)=(\")Q\"$IQ%$YM#\"IM$$YI$#YM#$9]!$)Y#$I]&"
+ "%YM!'*1-$)Y#'*)%$J%&\"Z9!#Z-\"\"J)!#Z%\"$*9)#J5!':!'#J=$$Z=)#J-!#JM!"
+ "&*M+!Z=!#ZQ!&*Y#\"ZY!#Z]!&JY)$;!\"%+%&\"[%!#[!!#K-$%+1&%+5!$[5!'[E!"
+ "$[9!#[=!!+9!%;Q\"%[A!&;M'';A,#+I!#[9!'+Q*%[U%%;M\"%+Y!);Y+#K]#&<!\""
+ "',%%'<!+%+M!&L%\"',%*%L-\"%,1!%<1%'<1!(<5!$,9!%<)!&<9!%,1!%<A!$,9!"
+ "#,I!$<E!',A(\"\\I#),M\"%LM\"&<Q$'-!'%<=!&<Q$%<U!%<Y!$\\Q#',](%<I!%L]!"
+ "#,Q!$<]!']%!'L]*'\\]&%M!!%<M!']A%%<U!%M!!'-!#&=!$&LU!%]%\"%M!!%M)!"
+ "%=)%']!!%M%!(=!-&M%!&M%%&L]!$<U!$]%##-%$(-%\"+=5+#]%$&M)!%,U$']5+"
+ "%L]!(\\]!&L]%$<]!%M!!%\\]\"*,U'&,Q-%L]!&LU&)LQ*#,Y!%<M!&LQ!&<A&*<U)"
+ "'\\M+$L9\"&,I$'L]!%<A!&LI!(,Q((\\A\"%<A!%<%\"&,9$',=#%<M!'<1%%<5!&,-$"
+ "&,1%&,-)%,=$%<5!%<)!%;]!#,%!%,!!$+]!%<!\"%+Y!&[Y$%[U$&+Q!\"[E!$;=\""
+ "'+A\"%KQ#$+U!%;E\"%[A$&K=($[E!&[9!&[A!![A!#[1!$[)!%+%\"#[!$#[-!$K!$"
+ "\"J]#%JY!#ZU!$Z]%#*]!#ZI!#JE!%ZU%#JQ$#ZA!#ZA!#JA!\":=\"!Z9!$:1!#Z9\""
+ "$*1\"\"Z=!#Z%\"&J%##J%!#J!!%I]##J!!#YU\"$)U#$YU&#9Q!%IM&#YA#$9I%\"I=!"
+ "#9=!\"YA\"#Y9#$)!$%Y1(\"I5!\"Y%%#)1#$Y!'!Y!!%8]-$HU)\"8U!#(]#!(M#%(Q,"
+ "!H5!#(9$#X='\"X)&\"8=$\"HE$#8Q!\"8M&\"8A!\"8U!\"8U!#(Y##8]$#I!&#XY##I%#"
+ "\"I)!#(Q!#91!$))$#9)'\"Y5%!)=!$I9\"#99!#9E!#IM\"'9I+&*%$$IU%%)U$#)]#"
+ "$J!\"$:!$$:!$$Y]&#J-!$JA!!:1\"$:)$#*5\"\"Z9!%JI!#*U\"#JA!#J1!$:M$$*=&"
+ "#ZM!$*U\"#ZQ!#Z]!#ZY!&J]!$[!!$+!\"$+!&([1\"#[5!$[-!$K5#$K5$#[9!%;E\""
+ "%+9!$+9\"&[=$%KA#%KA#';=\"#[I!%KM('+M!$KQ'#;U\"%;U\"%+U!&;Y\"%,!!#[]$"
+ "%<!\"%,!!$<-\"'L)\"$<-\"$,1!!<)\"$,-!&L1'&,5$%<5!'<1*\",5!%,1!%<=!#,=!"
+ "$,9!&<M%(,],&<=&#,E!$<I!%\\Q\"',M#%<I!$LU+%,Q$&\\E(%<]!(LM/(LY$'\\U&"
+ "$<U!(,]1\"LY'#,Y!$<Y!%,]$%<])%M%!',]')<Y('=-($<]!$])\"%M!!\"M=\"!-!!"
+ "&=)$&LY&$=!!%]%\"$]!#(<Q-%]!'%]!\"%]-!\"M!'&-%$&\\Y&%<]!&M!%&<]$'\\]&"
+ "\"=!!%<Y!%<Y!'L]!%=!%%LY!%<Q!%<Y!%<U!#\\M#%LM\"%\\Q#(LU)&LM!(LM!'<Y)"
+ "&\\=#',M#&\\E'%LA\"$,=%$L=\"&<9%$L9\"%<=!%LM\"&<9!%<9!&L9&'<=!&\\1#%\\=#"
+ "&,-$$L-#%\\)#(,!!'<-*\"+Y!&+]%'L%+';]+&;Y&%[M%'KU##[Q%$+M!$K9#'[M$"
+ "%[M%&[E$%[E!$;=\"%K=$$[1!%+-\"$[)!$K5$#[)!$;=&#[1!%+)&#[%!#ZY!\"ZY%"
+ "#[%!#ZY!&:Y(#ZQ!$JQ!#ZQ!$*M\"%:E$#ZE\"$*E\"#*E\"#J=!#J9!#Z=%#Z5!$J1\""
+ "$*)##*%\"!Z)!&:-,$Z!&!Z!!#I]!$)U##I]!%9M)#9Q!$9U$$)U#$)Q#$YE*$I=&"
+ "$)I'#)1#!YA'#99$#I1%\"Y%##))#!I%(#(Y!#9!!#8]$#I!%#HE#\"XE\"\"(Y%\"XM\""
+ "\"(!\"\"8-!!(E##X='#H1!$XA($8I#$XQ$$(M\"#(E!\"XM-#I)%!HY!#8Q$\"Y!#$9!%"
+ "!))!#Y)'\"I%!$I1)\"I5!\"I=!\"I)!\"I1!#9M!%IE##YM\"\"IA!#9M!&II+#YM#%YU#"
+ "#I]!$9Y$!Y]!$)]#!Z%!#Z)\"!Z1!!:%\"#Z-\"#*5\"&*5#$*=#$JA$\"ZA!#:M\"$*Q\""
+ "\"ZU!\"ZI!#ZQ!$JI!%*I*$*Y\"!*M!$;!\"#[%!$+-!%;%'$K%$![5!#[-!#[1!$;5\""
+ "%;1#&K5($[=!';9(%;A\"%K=##;E.%[E$\"[I!$+M!#[M,&+Q%%+U!%+U!%<%!%\\!#"
+ "&\\%($,!!$,!!&<)&%L1\"&,%!$,5!%,-!%<1!'L1&&,1%%<5!',I(#\\5$#,5!%<A!"
+ "%<U!%<=!%<=!(LA!%LE\"#,I!$<I!%<Q!)<M$&<I%%LQ&%<Q!\"<=!%\\Q#',Q#%\\Y#"
+ "%\\Q\"'LU/\",U!%LU!%LU!%]!'&M!!'<]$#<Y!#,]!$L]\"(=%#%\\]\"%LE\"$]!#&<U%"
+ "%<]!&<]$(\\]/&,Y#$<U!#,]!%LU!#=!!%\\Y#(<]-&-1(%LU&%LE\"#,Y!%]!'%<U!"
+ "%<Y%&-!$&\\U\"$LM\"&LU!%<U!\"<U\"%\\Q#&<Q%&<Q%%<M!),Q'#,U!'\\I&$<I!(,I,"
+ "&\\E\"%LE\"&\\E,%\\A#'<E))\\A&'L9\"%<E!#<9\"%<A!%L9\"%L9\"%,A$%L1\"&<1%%;]!"
+ "%,)!#<%\"(<%!%,!!'L!,%L!#$KU#$+Y!%KU##[U$%KU#$;M#\"+Q!#[I!&+I%&;I&"
+ "%;E\"%+M!#KA#';9##[=!%;9#%;9\"%;9#\"[1!&+1&#[1!$+)\"%J])#[1!$[!%$*]\""
+ "%[)!$Z]%#ZQ!%*U\"\"ZE!!*M!#ZI\"!ZM!'ZA/$*A#$:5$#*I\"#J=!#J5!\"J1!#J-!"
+ "&J1*#J)!#Z1\"#Y]\"\"Z)\"%I]#!YY!$9Y$$I]%#IU\"#IY!$IU\"#IE\"#YA##YE##)5#"
+ "!I5&#)9#\"I5!#)1#\"I5$#9-!#9)!\"Y%\"#9!!#(]#\"I!!$XQ(#HU%\"HQ!\"XQ\"\"HI$"
+ "\"GY\"\"8)!\"HE!\"8=&#8=$#H=#\"XI\"!HI!#(M#\"8M!#8M$\"8U!#XU&\"I!!!9!\"#X]#"
+ "$I%)!Y)!\"I-!\"Y1\"\"Y-\"\"I5!$)=$#)A#\"Y9\"%9=%#YI&#9I!$)M##9I!%I]&#9M!"
+ "%9Y)$IQ%$Y]&#9Q!#Z!\"#J)!$:-!#J1!%*1#$:-#$I]\"$:)!$*5##J1%#JE!#*E\""
+ "#JE!#JI$$ZA\"&ZU\"#*I\"$*U\"$*Y\"$*]\"%*]&'[!&'+)+$[1$(K!2$K-($[1%%+1&"
+ "$+5\"&+5\"$[5!%K=$%KE#%[M$%[A$#[E!*KI($[I!#+Q!$+Q!%+Q%%KU#%KU#$+Y!"
+ "&[Y(#+]!'<)&(<!+$;]\"%\\%$'L5*$L)#%<1!&,-%&,-%&<1!$<5%&L%\"&<9%',9)"
+ "%<9!#\\=#$L9*$\\=#$LA\"*,A('<E%&\\E(%<M!$LI\"&]!\"%<A!%\\M#%\\U\"%<M!&LM&"
+ "&LQ!&LM!%<U!%<]!$<]!$<Y!&\\U\"&<E!%\\Q\"%\\U\"%<U!#\\]#%<]!&\\Y\"&LU&(\\]+"
+ "'\\Y!%\\U\"%<U!%,U#\",]!'\\U&%<Y!&<Q%$M!!(LY.%M!!%<Y!'\\Q''\\U\"%<U!&LU!"
+ "(<]-*\\U/)LM*%\\Q\"(,U(&LQ&#<Q!+,Q'%\\Q\"#,U!&,E#%LA\"%<E!&<I!(\\A\"%LE\""
+ "$<E!$,A!#,A!'LE/(\\=0&,1%(<=*&L1\"&<1!&\\5#%\\1#%,1!%<9!&<-!(<-!%K]#"
+ "%,)!'L%+&<-%%[Y$%;M\"&+]%'+]!&;Y\"#;M'&+U!$;A\"$;E\"&+A\"&;M\"&;I\"&+M!"
+ "$[A!%[A!%;)#%+)\"&[=!&[5!'K-!#[-!$*]\"#[-!$[-)#[1!!;%\"#[%!$J]!\"ZU!"
+ "$*Y\"\"*Q\"&*Q'$*U\"%*A'#*=\"&*A+%:Q$\":A#%J1\"\"Z=$#J5!#Z-\"\"J1!$:9##Z-\""
+ "#J%!\"*1\"\"J-!#J!!%Z!'$)Y#$)Y##IQ!$)M#&IM$#YI#%Y=$#9E!$YA'#Y9##Y5&"
+ "%)E(#I9\"%9-*\"I1!\"9-&#I1%#Y9#\")!\"\"I!\"#(Y#%8Y!\"HA\"\"HE!\"(Y%#(Q&$8I)"
+ "#X5!$X)#$89#\"H=\"!HE!\"XM\"\"8I#\"(I\"#(M##XM##(Q!$HU#\"8Y!!HY!\"I!!$8Y&"
+ "#)%#$(Y!#8]$\"9-&$I1##)1#\"I5!\"I9!#95$!YI!#9E!\"IE$$IE)%)Q!%)U(#9Y$"
+ "#IU\"#Z)\"#I]!$:%$#J!!#J1!$YY#$:5$#J)!':A%#J5!&:1)!Z9!#JA!#J9!#ZA%"
+ "$JA%!ZE!\"ZU!#JI!#JI!%ZI\"$:U$$JY!$:Y#$J]$&[!\"$+-!#ZY!\"[!!&K1$$;-#"
+ "#[-!%+-\");5(%[5!(+M%%KA$&+I!)+5\"'+A\"%;I\"&KM'$KA#$+M!$;]&$+Q!%;Q\""
+ "$+U!$+Y!'+U!&+]%&,!!&[U$$,)!$L1\"&,5%',))%,1!%\\-(&L9\"%<1!%,1!%L1'"
+ "%<5!&,9$'<9!$L9##<1\"%\\9#$<E!&<E!%<E&%LE!$,9!%<U!%\\I#(LM&'LU!(<I$"
+ "%<M!'LE!%LM\"%\\U\"&<M%%LI\"&,M$%<Q)%<E!%\\Q#%\\]\"%\\Q\"&\\Y!&\\M\"&\\]&&<U$"
+ "%LQ!$\\Q#&<Y$%<M!%\\Q\"%<Q!&<]$&\\U&#,Y!%<U!)-!\"&]!\"%LU!$<Q!'\\I\"'<Q)"
+ "%\\Q\"'<]#%,Q#),=-#LE\"&<M%%<I!(,I)&LI!\"\\M$%\\Q\"%<E!%<Q!&,M#&LA\"&\\A#"
+ "!LA#(\\A'%,1!&<=!$,1!(<5%'<5%'\\E\"%,1!(L1\"&<5!&\\)#%,-!%,))%,)!%,!!"
+ "%+Y!'L%\"%<!\"&<%%$+]!&+Q!$+U!&+Y%$KQ'$;Y\"$KQ#$KQ#%;M&$[I!#[E!%+M!"
+ "$+9\"'K-%$+=%$+9!$+9!#+9!$+1\"%;5'%+)&%;)'#[%!!;-&%;!'#Z]!$[!!%*]\""
+ "#ZU!$*Y%#JI!%JM!%:U'%JU!#JA!!:A\"#*A\"$Z=\"\"J1!$:E$#*E%$J1\"#Z-\"$Z)\""
+ "$Z)&$)Y#%J)&%)]($:!$!YY!#9U'#IU\"!YY!$IM\"%YA+$)M$$IM\"#9A!#)1##Y9#"
+ "!Y9!\"I1!#I9\"#Y-#\"Y9\"#I%#$(]$#HQ\"#9)!#8]!#XE'#(U##(Y#\"8Y#\"8Q!$(I'"
+ "\"81##H1&!H%#$X5##89\"\"X=\"\"HE!\"8E!\"XE\"#(M)\"XQ\"!HU!#(Q#&I)/\"8]!\"I)$"
+ "#9!!#I%\"\"Y%\"#)-#$)-$\"I5!#)9#\"Y9\"\"I9!!)9!#YE##9I!\"YI\"#9I$$9M$'9E$"
+ "#)U)!YQ!#IU!%*-#%*!!$*!#$:%$#Z)\"%J)\"\"Z%%%*!!\"Z5!%Z9*$Z9\"&:5!#ZQ!"
+ "'*M'#ZA!$JI$$*U\"\"ZM($:Y##ZU!#[!!$*Y\"$*U\"$JU!#[!!$;!\"%*]\"%JY!$[)!"
+ "#[)!$[!&![=!$[5!&[9!$[5!*+=+)[I*&KI(&KA$%[A!$[E!#[E!&+I*#[E!$KQ#"
+ "'+Q!%+U!%;Y\"%KY#$[I!%K]#%,!%&<%%%L-\"%,!!%<%\"%\\%$%,)!&<-!%,1!$,1!"
+ "(,)-$,-!%LA\"%,1!'<-%%\\=#(LA&(L9&#,=!$,A!&LA&(,M#&\\E(%<E!&,A$%<I!"
+ "'<I)'<I$'\\M!&<I!&<Y$*,M#&<M%$\\M#%<I!&<I%&,U#&<E%%<M!(,Q#%\\Q\"%\\Q\""
+ "%LE!&L]%%<U!%\\Y\"$<I!%M)!'\\U\"$<Y!%<U!%\\]\"$<Y!%]!\"$L]\"(,M#$\\M#%,I$"
+ "&<M!\",=!#LI#%\\I(%<I!%\\Q\"%<I!%\\E(%<E!%\\E#%<9!&<9!%L=\"&<=!%,=$%LA\""
+ "',M)%\\9##<=\"%<9!&<=&%<9!%<5!%<5!%L%#(L-\"'L=&%L5\"&,)%',%*'<%%(KU#"
+ "%<%\"%+Y!),-$'+]!%;]\"%+M!&+Q!#;]\"%;I&%<!\"$;I\"&;A&%;E\"&+9\")KA$&;A'"
+ "&[9)'+9*\"[9$&;9\"%;E\"$;)\"%K-$$K-$$[)!\"[)!$+1\"#ZY!#ZQ!$:Y#![!!%*U&"
+ "$:]##JE!#JI!&JQ!#JI!$JE!$:A#$:9##JA!&:9!#J1!$:5$#J=$#J-!&:5!%*!$"
+ "#J1!#Z!\"\"J!$#I]!#9U!#9]#%)U!$)M$#YI##II$#I]!$)E!$)9$!YA!\"I9!#)9#"
+ "$Y1$#I%\"#)-#\"I!!\"Y)\"&)%'!Y!!\"8]!!Y)!!Y!!#(U!#(Q#$(U%\"HY!\"8I!#X5&"
+ "#8-\"#81%\"X=#$(5&\"X)\"$8=&!(A!$85)!XY$!HI!$(M(#(Q#\"8Q##HU%\"XY\"$(Q%"
+ "\"X]%#(U!\"H]!\"9)&#9)!\"XY\"#9-$\"Y%\"!Y9!$)-'#YM\"#IA!&II($9M!#YE\"$IE,"
+ "#YQ#$)M$#9U!&)]!%IM*$9Q%$J%%$9U$\"J1$$Z)&$*9\"\"J-$#J-!#Z9\"$*=\"\"Z9!"
+ "$ZI)$JA%$J=%$:E$$*M\"#JE!#ZQ!#ZQ!$J]$#*Q\"$*Y\"#ZQ!#;!##+-\"$;!\"#+)\""
+ "![-!%+)&#;9\"$[1!%KA$%K1($[9!%[=!$[=!&[A!%[9!![E!%+A!&KI$$+Y!&[M-"
+ "$;Q&%+U!%[M%%+Y!#+]%&+Q!$;U\"$L!#&+]%'L%\"%\\%(%<!!%,)!$L)#%<=!%\\E'"
+ "%<5!'\\E'%<1!#,I!%,)!%\\=#%<9!\"\\=$$<-%%<=!(,%*%<A!%LA\"%\\=#&<E!&<E!"
+ "%L9\"%LM\"%LI\"&=!$%\\Q\"$LI&&LI&'<A)$LM\"%,Q$%<M!%LE\"%<Y!&<M!%<Q!%<M!"
+ "%\\Y\"%<Y!\"<M\"%<U!(\\E\"%LI&'LM!%<M!'LM!%<M!%\\=#$<U!#,9!&\\M\"%<I!$<I!"
+ "&LU&(,I#%<E!&LI&(<9!$,A!%\\A#&,E$',I)#\\)'%\\E#$,A!%\\9#&LE&'<=!%<=!"
+ "&L9+%<9!%<5!&\\5(%,1!&,))&<%&%<9!$+]!$,)!',%%%L)\"$,%!&,1$',))'L!\""
+ "&;]\"$;E&&K]+$[I!$;M\"'KQ#!;Q\"$+Y!&+U)%+=\"&;I&#[E!%[M)%;A\"\"[5!%+I&"
+ "(+=&%+9\"%[%)#[1!$[)!#[5!#K5$$+!\"#[%$$;%#%;-'&K5$$:]#!JY#\"Z]!%ZQ&"
+ "#JM!#JA!%:I$%ZI'$*E\"$:=##Z=%$JI%%*9'&:M!$:1!$JA$$J-%#J-!#J-!$J)%"
+ "\"J%!#)]\"#9U!#IY!$)U#\"I]!#YQ\"#9I#$YQ#$IE##9A!#YA#$)I#!)=$\"I)!!Y5!"
+ "#I-%\"I!%\"I-!\"Y!\"!Y%!$91\"#))&\"H]$\"8U!#(I#\"8Q!%(E&\"XE##HI%#8E%\"8A!"
+ "#(-$$(-#$(9%#89\"#(9$\"8)!#(=$#HE#\"X=#\"8U!\"HQ!$(M!\"XE\"!XU!\"8]&#X]&"
+ "#Y!&#I!\"$Y!'\"Y%\"\"95##)5&#91!#95$#9)$#9=$$I-#\"YA\"#YE#\"IU!$9I!$9U$"
+ "(YU'()Q+#9M!\"YY$#J%!!*!!\"YU\"#Z-&%J%\"#J!!$*!#\"J1!#J)!$Z5\"\"Z9!#J-!"
+ "#J=!#*A\"#*A&%JM!!ZI!$*Q&$:Q#\":Y\"$:U$#ZU!#[)!#Z]!$ZY%#Z]!$*]\"#[!!"
+ "#*]\"$+!\"$[5%#+1%$;1\"#[5!%K=$%;9\"'[=*$[=!&;E'%;U\"$[E!$[I!'[I-$<!\""
+ "';M\"$+Q!$KA$#;M&$+U!$[A!'+Y!&+]-\"+]!%+Y%$,!!%,)!$,%!%\\%#%,%!&<)!"
+ "%,-!'<-!&,!!%\\E#%,-!$L5\"$,9!%,1!%<5!&LM&\"\\A#$LA\"%<I!%<9!%<5!#LA\""
+ "$<1!$LE\"',E(%<E!%\\I#)\\M&%LI\"%LE!&\\A(%L=\"'\\5,%<E!%<A!&,I#)<I)$<I&"
+ "%\\A#&-!$%\\Q\"%LI\"&<I%'<M.%\\Q\"%LI\"#,I!%<M!#LI#&LE&',E#%LI!'\\9'&<E!"
+ "&,U#%<E!'<5!',9$&<A*&L=!'<A%\"<A\"&<A&&L=&$<1!(,9#%,-!%<9!',5-%<5!"
+ "',E#'<1!%<1!&,1%$L=\"%,1!)\\-#%+U!&+Q!%,!!%L5\"%,%!%<%!'L%,&+]!&;]+"
+ "%;M\"%+Y!$KQ#%+U!&;Y\"%[Q$$[A$$[]$%;I\"%[E!&[E!#[I!&;E&$[=!%+A&\"[9!"
+ "%[5!&+1*%+1\"![1!#[-!$+-\"#[!!%JY!%[-)$+%&$[!%$;)\"!ZY!&:I!%*Q*#ZU!"
+ "$JM!$*M\"%*I\"#ZQ!#JE!%*A'!*9!$Z%&&:=,#*5\"\"J1!!:9\"$I]\"%J-\"#I]!$*%#"
+ "$Z)&&)]%\"Y]!'Y])#YQ#&9U#()Q.%IQ#')=+#Y=#$)9!%)A($)I&#)9#!Y5!!H]!"
+ "\"Y1\"#I1%\"I-!#Y))#I%\"#I%#\"HU$#(M#\"(]\"%8U##XI'\"(M(\"8I!#(U!#(E!\"8=#"
+ "\"8)!\"H)!\"(-\"#H5#\"XA#\"89!\"8=#!(Y!$HI*#HE\"$XU*#X]&#(Q#$8Q(!XY!#(M#"
+ "\"8]!\"HU!#9!$$Y!$#))#\"Y1\"#)5##9-$\"I9!$95(!Y9$\"I9!%YA.%)A\"$)E#$9M!"
+ "!YY!')E-$)A$#IU!#9U!%9]($:!$$9]!#:1#$Z-\"#J)$\"Z-!$*-#%:=+#J5!#J5!"
+ "!Z=!#J=!%ZI*#JI!\"ZE!#ZI\"$JM$%ZE\"$JQ!$*U\"$*U\"$*Y\"$*]\"#Z]!#[%!$;!#"
+ "%+%&#[)!!;)&'[)&$[1$#;9\"#[9!'[=%%K9($[=!\"[=!'+A.$[I!%;E\"&;E\"%;]!"
+ "$[I!\";M\"$+M!$+Q!$+U!&+I%%,%!&\\-(%+]!%K]#'KY#%<%\"&<%%%[]$#L%#&L!'"
+ "$,1!$+U!%,)!%<=!$,1!$,1!&,%*#<5\"&<5%&<5!%\\9#$,=$&L9'%<9!(LA&&LE!"
+ "%<E!#LM\"$<E!&LA&#LA#%LA\"%LE\"%\\A(#,E!'LE!%\\M#$<E!%<A!%<9!&,E#&,I#"
+ "%<I!%<5!&<5!%<U!'LE!&LM!$<E!$LI\"%<A!'<Y$&,E$%,=('<M)'<E))<E)%<A!"
+ "%<A!$,A!&\\E'%<A!%LA\"%L)\"%L='$LI\"%<=!'<A*%<5!%<=!&,1$%L-\"$L1\"%L9\""
+ "&<5!(LA/%\\)$%,-!'<1*&,)%%L)\"%L1\"',%!$,-!%+Y!%,1!'[])%+]%';U\"%+U!"
+ "%L!#%+I!&;U\"#[M%)KI,$;A\"%+M!&K9($[A!$[E!'K5$#KE#%+=\"%+=\"%[-!%[9!"
+ "$;5\"$K5$#[1!![-!%+)\"$;)\"%[)!$[!!$K1$$*]\"#[-!#Z]!#ZQ!%JI!$*Q\"$JM("
+ "#ZI\"$ZI\"#:E'$JQ!$ZI%\"Z=!\"Z=!\"Z9($J%!#J1!$J%\"\"Z!\"#J)!$*)##J!!%9Y&"
+ "#)]#$Z!\"#IY!\":%\"\"IM!#IQ!#9M!$II)#9A!'9E$#Y=##I=\"\"Y9\"!Y9!\"I)!\"Y-\""
+ "\"I!\"\"91#$Y)$#9-!#(]##(]#$))'#95$#(U#$(M\"#HE%!8E\"$8E&\"XE#\"8A!#(A$"
+ "#(%$\"H)\"\"X)%%89$#H5&#(5!!H9!$(=!#XA!#XI!#(E$$(U$$8Q(!(U!#8U$#(U#"
+ "#(Y#\"I-!#9!$#Y1##9%!!Y1!#I1(\"Y5\"$I=#!I=##9=$\"I9$$IE%$)9$$)A!$II%"
+ "#IE\"$9Y$%9I)%*!(#9U!$*!'$)]#$:!$&Z5#$*%#$9]!\"Z9!#J1!#Z-\"$J9%#Z-\""
+ "#J9!$*5#$JE!#JE!#JE!#Z1\"&ZU*#JM!#*M\"%*E'#Z]!$;%##+!!%*M&#Z]!$;!#"
+ "$K!$$+%\"#[)!#+%!#[)!\"[1!$K9#%;-\"%;5'#[-!%[9!$[=!%;A\"$[1!%;A\"%KA#"
+ "(+I.';M+&+I!#[E!#[I!!+M%'[Q$);U\"%;Y\"'+I!&,%%&+]!(+Y-%,)!%[]$%L)\""
+ "%L!#'\\!$&L-\"%L)'&<1!&<1%&\\1(%LA\"&,5$%<5!'\\1#$<5%%L9\"$,1%%\\5#%<9!"
+ "\"\\E#%,=%$L9#%<=!'<=%%<9!%<M!&<9!&\\E\"#<A!%<E!(,M-&<I%'LM!%<A!(L=!"
+ "%\\9#&LE&#<=!$LA\"%<9!'<A!$LM\"'\\=\"(\\=\"%\\A#%\\A#%<9!&LE&'<=)%<A!%LA\""
+ "%,1!%LI!&<=!(LU)%L9\"%\\9#&<E%&,9$%\\=#%<5!#,9)$,=!'\\M\"%<1!&L%'&LE&"
+ "&,-)&<1!$+]!\"<)\"$,-!%L)\"$<-\"%L-\"$;]\"&K]#)[]#&+M!%+Y!$+Y!$+Y!%+A!"
+ "$,%!$KQ#\",)!%+M%$;=\"%+I!&+Q%'+E\"';E\"%;1\"%+A&%+5\"$[A!$[I!%;!$%;5#"
+ "\";1\"\"K1##K!$$;1\"\"[!!%+%\"$+!\"&*U+$Z]%$:Q#$JY$\"ZQ!%ZY!&JQ!#JM!$ZI\""
+ "%J9\"#JI!#Z=\"(JY*$JA!$*E\"$ZA\"\"J9'$JA!#J-!$Z9\"#J%!#J)!$)Y#$:!$%)]("
+ "#J!!#)]\"$)U#$)U##)U#()].%YY$&YQ,#9A!$)A#!YQ'!)5!#)1#\"IA!\"I-!$Y9'"
+ "$Y!!#I)%$Y%$\"I%!\"HQ$!X]!#HQ\"\"8U!$(U$#(M#\"8M!\"XU\"!8A\"$(A!$(5(#85\""
+ "\"8%$#(1##(1!\"X%##(9$%(5'\"85!#X=$\"H=\"\"H9!#(Q&\"XI\"\"(M\"\"(Q\"#(M#$8U)"
+ "$XY*\"8Y#\"I!!#(]!#9!!\"Y).$)5!\"Y!#\"I9!!Y5!\"I9!#)A&!9A%!)A!#IA\"$)M#"
+ "$YI&$IQ%#IQ\"&II(%Z!$#J!!#YY\"$IM&%*!$#Z%\"#9U!#J)!#)]#\"J-!#J1!$*9&"
+ "%J5%#:9#%:-!#JI!$JA$#JI!$:I##ZU!!*M!#JM!%JQ!$*U\"%JU!#Z]!![!!%;%'"
+ "\"[!!#Z]!&K),%+)\"$K)$#[)!#[1!%+A&$KM#&[5!$[5!&+I&(K=$%[9!%[I!$;E\""
+ "%KA$%+A!%+I!'+E\"$;U\"$+M!$+M!$+M!&;Q\"%;Y\"%+]!%\\!$%,!!(;]&%;]!%;]&"
+ "'L!#&,1$%,%!%+Q!$K]'%<)!$,%!',9($,1!$L1#$\\-$&L9'&<-!%,1!%<=!(<1*"
+ "$\\1#%L9'%<5!'<9%&<=&&,5$%L1\"$,-!&L9!&<A!$LE\"%<A!&\\1(%,=$$,=!\",A!"
+ "%<=!(LE!'\\=,&<=&%<A!&<E%$L9#(,=#%<=!%<=!%\\9('\\-#(<9%&,=)%,-!'<9*"
+ "'<-*%<9!%<9!&<5%$L9\"$,1!&,9(%\\9#(<5/'<9*(\\E&$L1\"'L=+&\\)(%,-!%L-\""
+ "$<)\"&L)\"%,!!&L!''<%*%<%\"&+Y%%,!!'<%%%<!\"#+]!%+Y!%+Y!#+Y!%K]##+E!"
+ "&;Y*$+Y!$[M%%+=\"&[=!%;E\"%+Q!%+=\"%+=\"%+=\"#[=!(;%(([=!%K5(%[=!$[-!"
+ "%+1&![-!#+-!$K%$%;%'#Z]!%;)'#ZY!$ZQ\"&*Y'#ZQ!%*I#$*M\"$JI!$ZU%#Z=!"
+ "$JE$%*M&#J-!#J1!&J=\"#J9!$*5##J1!$J-\"#Z-\"#I]!\"J1!$J!&#*!##Z!\"%*%'"
+ "\"IQ!\"IQ!$IY\"#J!!%)M!%9M%!)M!#9E!\")=%$)=!$I1##99'#)5#$Y9!#)1)#95!"
+ "#)%$#9)$\"I%!#9!!#X]##HY%#HY\"\"I!!!XQ$$(A!!8E\"#(I#\"8A!\"8I!\"X=\"#H=#"
+ "$(%(#']$\"X%#\"H)!#(1$\"81!!H5%#H5#\"8=!#XA'$HE!#8I%#89%$8M##XQ#%XY#"
+ "#8U$#(Y)#Y!&\"8Y!$8Y%$9!&$I!*\"I1$$I1)\"YA\"#9A!\"I5!#I9\"%)E($)=$#)M#"
+ "\"IE!#)Q\"#9M!#IU!$9M!!*!!$)]#&)U%#)U#$*!#$9Q!&*%,#J)!#Z)\"#Z-\"#J1!"
+ "#J=!$J=%\"Z9!%:=%$*A\"\"ZA!&JA\"%:I'#ZQ!&*U+\":E\"$:M$\"*U!$JU!#[!!%ZU\""
+ "'K!!%JY)!;%&#[!!$+)\"$+%\"%[-!\"+!\"$+5\"$+%&$+5\"&+1&(+9+%[=$#[A!#[A!"
+ "'[9.$[I!%KI#%+M!$+Q!\"[E!$+M!$+U!);M/$+U!%,!!%;E\"&[],%+Y!%+]!'+]%"
+ ")+])%\\)'';Y/%<%\"&L%#',%!)\\),%L%#%,!!%\\)$&L-'%\\)#%L-\")<1/%L=\"%L)\""
+ "'L1\"%\\)#%<A!$L5\"%\\1#%L1\"%<=!'<9!(<-%$,9!%<5!',9)%LA\"&\\=#\",9!$<=!"
+ "&L5\"%<=!'LA+%<=!&,=$%<A!)\\94%L5\"'\\A,(<9%&<=&%,1!%<9!$L9&%<=!%<5!"
+ "%<9!%<9!&L1'(<5!%\\I#&<=*$\\-$\",9!%\\!#%,1!&L%\"&<1!'L5\"%,%!&\\)(%,-!"
+ "$,%!$,%!&<-*#L%''<-*',!!&;]\"&K]#%\\!('L!'&<)!&;U&#+Q!%;M#$;]\"$;U\""
+ "%;U'%KM'%+=!&+A\"%+E&&;A+'+A\"&;E''[E$\"[A!$[A!%;9*$;E&%[1!$[5%%+-\""
+ "#+-\"$[)%$;1#&[1)#ZU!'JY!$JQ!#:U\"!ZY!\"ZY!#JA!%J=\"#JI!&:9!%JI)$ZI\""
+ "#Z5\"$JU$#Z9!$:I$!*)!'*9(#J-!#J5!#Z-\"$*)##J)!#J)$$9U!$:!$$Y]#!)]!"
+ "\"IQ!\"YY!$)Q#$YM#$)=!$IU%#9A!%9M\"!I5##9=$\"I=!#95$!Y5!$)9'!Y-!#)5#"
+ "#Y%'$(Q!$8Y%%(Y\"\"8]!\"X]\"\"8U#\"8I!#8Y$$8I#$H=$\"HA$#H5#!HI##(=#\"89!"
+ "#8!$\"H-\"!X)!\"X)#$H1+\"X1\"\"89!\"XA\"$X1\"#(E#!(A##XI!\"HI!#HI&#HQ&#XQ$"
+ "$8]%%9%-\"X]\"$H]#\"8]!#(]#&9)(#Y)&\"Y-\"\"I-!#91$!Y9!\"I9!#Y1&$Y=#\")I\""
+ "\"IA!$9E$$)M&$)M#$IQ)%IQ#%IU)$I]&%)U'$9]$#YQ\"\"J9'#J-!#*=\"#J-!$:5#"
+ "$J9!#J-!%J1\"\"ZE!%:1$#ZI%#J5!$JE!!ZA!$*=\"#JM!%:U$\"ZQ!!JU##JU+%*Y'"
+ "#ZU!$:]'\";)\"#;-\"$;%\"$J]$#[)!#+1\"#+-!#[5!#K1$'+1&%+9&$+=*%+=\"&[=!"
+ "(K=$#[A!$[A!$;I\"&+E%$+I!&KM($+Y!%+M!\"[I!#+E!$,)!%;Q\"%+Q!&KY'%KE#"
+ "$<%!%<!\"%+Y!&\\5#&<!\"%<!!'[],#,!!&,%%'<)!%,)!%\\!$%K]#%L-#$\\)#*,9-"
+ "&,!%%,1!%,1!%L-\"$,=!&<5!'\\1(%L9\"$+]!&,5$%\\5#%<5!&\\E\"%L)\"%<9!'LE!"
+ "%LI\"%<I!'<)!(\\5-%<=!&<9%$,9!%<5!$,1!*L9+$,5!%<9!%L9'$\\5#&,5$%L5\""
+ "%L1#%,-!%<1!$L1\"'L5\"$<1*$,5!&<-!$<-\"\",)!$,5!%,)!%<!\"%,)!%\\)#&,!%"
+ "(;Y&%,!!%<!!%<%%';Y+%<!\"\"+]!%+Y!&+U!%+Y!&+U!%[U$$+M!#<!\"$[M$\"[Y$"
+ "%;=*(+M*$[I!%+=!![Y$%KE##[5!%+9!$[9!&[1!%[-!(;1(%K5(%+1\"%K)$#[5!"
+ "#[-!#[)!$+)\"#Z]!#ZY!#ZY!$*Y\"$*M\"#*U%#ZU!$ZU%#Z=\"$:9#%*I'$JE$$:=#"
+ "$ZA&\"Z9!%*=&#J9!$Z5&#J5!#J1!#ZA\"$*5\"$:)!#J%!#Z%\"$*!#$)]#&:!\"&IU#"
+ "$IQ\"%IA*\"YU!$9M!$9I$!Y=!%YI+$Y='\"Y9\"\"9=##)=#\"I)!\"91##I5(#)1#$Y!!"
+ "$Y5'$9!%!I%#$X](\"8]!%(U(#XY&$(]$#X='\"8Q!!HM#!XA!#H=&%H=#\"H=$#XE#"
+ "\"8!!#X%'$()(\"X%#\"81#!(-!#H-##X5!#H5&\"8=!\"(-\"\"X=&#HE%\"XI\"\"8E!\"HQ!"
+ "#(Q#&(U$#8]$#HQ%\"I!!#9!!#I!##91!$Y-!\"Y=\"#Y-&!95($I9#\")9\"$)9$#9=!"
+ "#YA&%IA$#9A!#9M$$)M$#9Q$#9Q!%IU\"&IQ.$:!!!Y]$%:))$:%$!YY!#Z)\"#Z-\""
+ "#J5!$J1%#Z5\"#*5\"$JA$\"ZA!$Z=%#*A\"&ZA&%:E!%:E($:9##:M\"#ZQ!$[!!#*U\""
+ "$J]!$ZU%#[!!#ZQ!$;%*#[%!%+-&%+)\"$[1!![-!!;-\"%;1\"&+A&&[E(%;9\"%;='"
+ "$;=\"';1(#K=$)KI$\"[E!&;E\"&;5#%+M!$[A!#+M!#[I!$+Q!$[Q$%[U$%;Q\"&+U%"
+ "%,!%%;Y\"&L!#%+]!%,%!%<!\"$;Y\"%,)!&+]!#<%\"%L)\"%,!!%L-\"%,!!%L)\"#\\9#"
+ "%L-\"%L-#'L-&&L1'$,)!$L1\"%,1!%L5\"#<1\"'L-\"#L)+%L1\"&<-%%L5#&L1+!<!\""
+ "'L5!#\\5#&\\1($,5!&<9%',5$',5$%,1!'L1\"(,).&<1!(\\1#%L)\"#,1!&L5\"$,1!"
+ "'<=!%L5\"%<%\"%\\-#%,-!%\\-(%<)!#,=!%L)#&<5!&K]'%<%\"&L%\"!,9!&KY#',%!"
+ "%,!!',!)$;]\"&\\%(&+U!#+]!'K]+$+U!%+M!%+Q!%+U!&KE(#[E!%[M$&+A&%KI#"
+ "%KQ#$[E!&[A)'+1+%+M!&KA#%[A!%K=#&[A)%[1!$+5\"%+9\"$+-!$[9%#+1\"$+-\""
+ "$K!+$K%$$*Y\"#Z]!!ZQ!$Z]%$JY!\"ZU!!*]!#JE!$ZI\"%J=)&*I$$*A\"#JM!$ZA\""
+ "#JA!#ZI\"#Z1\"!:5\"%:-(%J1\"#J-!$*1#\"Y]\"$9]!%*!$\")]\"\")Y\"#Y]\"\")Y\"#9U!"
+ "%II*$YM&#9U!#II!#YI##9A!$IE%%YE$\"I=!!)A!\"I5$#95$%Y)&!I%#!))!#X]#"
+ "$)5!#9!!\"X]\"$(Y!%HY.#(U##8Q'$(M\"#(M#\"8I!\"8A!#(A$#H=#$(=%!XA$\"X1#"
+ "\"GY\"%(%$#GY!\"G]%\"H1!$8))\"X)#\"85!#81%$89#$(=!$XA+!(A!#XE&!HU#$HM)"
+ "$HY#!HM#!(U!$(Y!!X]!%I!!#9!!$I%$#)5&#9)!#)-##)-#$I5#\"II'$99%!I=&"
+ "$)A$#II!%)E(#IA\"$YE$#YE##IQ!#9U!$Z!'#YI\"#9I!\"Z%\"%*!!%:%(%Z%##J)!"
+ "%:-)#J1!#J1!$*M\"%:5!%*5##Z=\"$*5\"!ZU!#JE!#:=#$:I##ZE\"$+%\"$:U$$JM!"
+ "$JU!!ZU(%JU!$J]$#Z]!#ZU!%:]'$+-!$[1%\"[)!$;=\"#[)!![)'#;1\"#[5!%[1%"
+ "%K9$%;9\"%;1#$K='&;A'%[A!%;M\"%KI'';I\"%KU#&[E)#;M\"#+M!$;Q\"#+Y!&;U."
+ "%+Y!%;Y\"$+Y!%+Y!%+Y!%[]$'+Y!(<!+%,!!$L9#$L!'#L!'&+]!'<)!(,!%%,%!"
+ "%L%#&,)%#<)\"$L)#'<-*$<-!&,%!&<-%&+]!',-%&<-!&<-!%,-!%,!!$,1!&\\%("
+ "%,1%&<1!$,-!%\\1#'<5*&,1$',))#L5#%,-!%,)!&<1!&<=&%L-\"$,-!%L-#%<-!"
+ "%L-\"%,-!$L-''L1&%,1!&,!%%,)!%L)\"%\\%#%<%!&L!'%<%\"$\\%#&<-!*+])&+M%"
+ "\";]\"';Y*#,%!&+Y!%KU'%+U!(;U+%KU'$+Q!$;]\"$+U)%+M!$[I!%[E!&;I\"%;E\""
+ "%;5#$[A!%[M$';Q/$[=!#K9#%;9#%;5\"!KE#%+1\"'+1\"%[-)$[)%$[)!%+)\"$+%\""
+ "%+!&#[!%$J]!%ZY\"$JU!\"ZY!#ZU!$*U&$*Q&#*Q\"$JI%\"JI$#J9!#:E'%ZI*$*=#"
+ "#JI$#:-##J5!!*5($*1\"$:!$(*)\"\"*9\"!)]!$)]##:!##)]\"#Z)\"!YY$#IE\"#Z!\""
+ "$YQ#%II#$)I$#YI\"#9E!#YQ#%IE#$IA(\"I-!\"Y5\"%IM&#9-'\"I9!!Y)!#9)$#(]!"
+ "#Y)##(]#\"9%#$XY%#8Y!\"8]!#X]!\"8M!\"8M!#HQ%\"HU!\"XA\"\"H9!$81&\"85!%(A#"
+ "#']$$']##()$!H%!\"X)\"\"H%\"\"8-!\"X)#\"89!$(=%\"X9\"#(Q#$(A%%(E#\"XE\"#XE'"
+ "$XQ+%XQ)\"XU\"$)!!#(Q##I%&#I!#$I1##I%\"!I5)\"Y-\"$9-%!I5#!Y5$#Y5&$)-$"
+ "\"I9!#)A&#)1#$)E#$9M!#YM#$IM&#9M!$)I$$IU\"#)U#$)Y##J)!%*!(&Z%$%:1!"
+ "#:)##Z!\"$:)!$:1!#Z%&#J1!$:-!%JI!%J=)\"ZQ!#ZA!$*I\"%*I\"$JI!#ZU!#[!!"
+ "$*]\"#ZU!%ZY*!Z]!\"+!\"#Z]!%+%&#[!!$[%!#+%\"%+1\"&K)(#K-$#[9!&;)+![1!"
+ "#[5!';9,$[I!%K=#%[=!%[=%$[A!&;M'%+E!%[E!%;Y\"%+Y!&+M*&[M$#+M!&;I*"
+ "%KI'%K]##[I!%+Y!$[A!%+U!&KY'([]-%;]!$;]\"#,)!&<-%&,!!&L!'$;Y\"&;Y!"
+ "&;U&&;]!$<)!(<!+'<-!%[]$&L)\"$,)!&L)#$<-\"&,)!%+Y!%,1!%L-\"$,-!%L9\""
+ "%<5!%,!!(<!*&,-%'L1\"%,5%&\\-((<-!%\\-#&L%'&\\1#&,-$%L)#!K]'$+]!$,)!"
+ "%,%!(<)%'<1!%\\%$$K]#&;]\"%<)!%<-!&,!!$+Q!%,)!%,!!&;Y!%+]!%+]!$;U\""
+ "$KY#',!!%+U!\"+U!%+M!#L%'%;U&$+Q!$+Q!&;U&&+E!$[I!$[=$#;E\"$[=!$[E!"
+ "'[U$$;=\"%[A%%[9$%;5\"\"K9##[1!#K5#%+1\"%[9!$[-!#[)!#[)!#Z]!#JY$$*U\""
+ "$;!\"%;-+$J]!%ZY\"#*M\"%*Q\"#*]\"\"ZQ!$JI!$ZI\"#ZY!$*Y\"#JE!#JA!%JM!\"*=!"
+ "&Z=+!Z5!#:5#%Z1*%JA\"\":1#$J!(#Z%\"#I]!#YU\"\"*%\"$Z)#$II%#IU\"$J!!&)M!"
+ "#IM!#IE\"$YI'#9Q!\"I=!#)A##9E!#99$$IA#\"I=!!I-#$I5)\"I)!%9)$$I%&#(Y#"
+ "%I!(\"8]!\"HU!#(]#\"Y!%\"H]$#(I#\"H]!#8A$#(E!#8I%#(=#\"89!\"H9$\"8%!$HA'"
+ "\"7Y!\"WA!!(!#\"X!##H)&\"8)!!WU$\"81!#8-%\"X9##8%(#H=%#H5&!8I\"\"8E#\"8=#"
+ "\"XE%\"8Q##8U$\"8Q!$(]'#(Y#\"X]\"\"X]\"#I)%$I)#\")1\"\"I%!!Y)$$91(\"I1!$)I!"
+ "$Y9*#)=##9M!$)M$#Y9#\"9E#%)M!#YM#$)U##9Y'%II'%9Y%#*!\"$)]#$9Q%!*%!"
+ "#I]!!Z)!\"Z!\"$:-#\"J1!\"J1!$JA!#Z=\"$*=\"\"Z9!#:E##J1!$*E\"$*Q\"%*I\"$ZM\""
+ "!ZQ!#ZQ!$J]!$JU!\"ZY!%;)+$;!\"$+!\"$+%\"#[%!#+%\"$K)$$+5\"\"K-$#[5!%;-#"
+ "\";%\"$K5$$[1!%[E$&;5'&+-\"$[=!%[9%&[A$%[=%&+E!#KE#'+I*&;=&%;E\"$;I\""
+ "\"+I)#[I!$+Q!';Q'&+U%%+Q!%[]$&+U!%+Y!$;U\"&KY#&K]'#\\!$&K]'&K]'%;Y\""
+ "%,!!$\\!$$+]!&;]\"$<)\"(,%*&\\1(%L-#'\\%#&+U!&<1!&\\%(&,-$&,%!'<-!%,%!"
+ "',)%%,1!%,)!&,%!%,)!%[Q%%<)!%<5!(,=-&,5%#,)!&,%!%,%!&<%%$<%\"%,%!"
+ "%\\9#%L5#&+]!%\\!#%+Y!%;]\"$<%\"%L!'#,!!&;Q&%,!!%L5##+Y!%KY''+Y!%[U%"
+ "%+Q!&+Q)$+U!$+M!\";Y\"&KQ#$+M!#[=!&[Q)&+M!%+M!#[I$'+-\"%[A%#[A$$[1!"
+ "$[A!$[=!%K1$$+9%$[)!$K='%+A&![A$$[9!'K-!$[)!!Z]!%+9!\"[%!#K)#$;5\""
+ "$+)\"$K!$$*Y\"&+)\"$JM$$ZU%#JA!%:E+#JE!#JI!#JA!&:A!$J9!#Z5\"#Z=\"$J=!"
+ "\":5\"#J9!!Z1!%J5!#Z-\"%9U\"#J)!\"Z-%#*)\"#9Q!$J%&#YY\"#)U&$)U##IQ\"%)U!"
+ "#9M!%YI(#YE#$IA\"\"9A##9-$\"I5!#)5#\"I-!#9=$!I=&\"Y)\"#I%#$Y%'$HY&!H]&"
+ "\"H]!!XY$$HY'!8Q\"!(M!$(M%\"XI\"$(U$\"8E#\"X9%\"8E(#X=!\"H9$\"81&!X1'!H1#"
+ "\"7]!\"W]!\"W]#$(!#$(%($(%(\"H)!#X=$%X5!#(A#\"85!\"H9!$(A(\"89#\"(5#\"HE$"
+ "\"HI!#(U#\"8M!#(Y##HQ&\"8Y!\"8Y!#(I##Y9#%)-\"#Y%##I)%!9!(#95!$I1#\"I5!"
+ "$I9\"$Y9$\"IA!!Y1!#91!$)M#$)U#$9M!#IM%$Y]##)U\"$YU##9U!%)M($9]$#IU!"
+ "\"J!!%:%(#*%##Z9\"$J1\"$J-\"#Z=\"$J5!&*9#$:1#&:=!$:9#%*A&#JA!$:I$$:A#"
+ "$ZM\"!ZU!%*A&$*U\"#ZY!$*U\"#ZY!!ZY!#Z]!$+)\"%+)&!;%\"#;1&&+5\"$[1%#[)!"
+ "&+9&$K5$#[1!$[5!%[5%$[=$'[9*%+=\"$;=\"%+=\"%[A$\"[=!';E+'KI$$[E!%;I\""
+ "$[E!$+Q!!+I!$;I\"$;Q\"%KI(#+Q!#,)!%+]!%[U(#+U!%KY#&+Y!#[E!%+Y!)L!\""
+ "&[]#%;]!!K]''+Y!',%!%L%'%L)#&<-!%,!!%,!!(+Y!%<%!&\\-#&+Y%%<5!%,!!"
+ "$,%!%,-!&<%%%+Y!%,%!$<%!%,!!$K]#%<1!',%)$,%!%+]!'<%*%<%\"',!.&<)%"
+ "&<1!#,!!&+]%'<-*&[])$<!&%\\%#(+]%%;Q\"%+Q!%+Y!$\\!$%+Y!#+Y!'KU#&;Y'"
+ "$KY#$;U\"&+Q!#;M&#L!#%+M!%KA#%KE#$;M#&+5\"%[I!#[I!%[A%(K=$%+-\"$[=!"
+ "$[9!&;E&%+5\"$;A\"#K1#\"[1!%;-#$;-#%+!&#[1!$Z]%#[%!$:M##[%!$JU!&*]&"
+ "$ZY\"'Z]\"$ZM\"\":Q&$*]\"$*U\"$JM!#:A#$JQ%#J=!$:9$%:A(#J=!%J9%\"JA#\"J-!"
+ "#Z5\"$*5\"#Z1\"\"J%!#Z=\"$J%\"$J1%#J)!$Y]#$9Q!#Y]\"%Z%*#IE\"\"YM!$YQ#$)M#"
+ "#YQ#%IE$$9I%$YE##I=\"\"Y9\"\"I9!#I9%\"I=!$Y5$\"Y%#\"I-!%)1\"!)%!!)-!!H]!"
+ "\"8Y!\"8Y!\"8M!#8]$\"8]!\"8M&\"8Y!\"XE\"#(A$#(A!#(9!\"85!&89,#(5#\"H1!#89$"
+ "#H%&\"WY#!7]\"#X)!\"7]&!H%!\"8)!%(-*\"81!\"X1#\"H9\"\"X1#$X5##(E$\"XA#\"8Q#"
+ "\"8M##(I##HM#\"HQ!\"8Q#\"8U!%(Y\"!HU##HY%#XY#$I%$!Y)!\"Y%\"#I-\"$9))\"I5!"
+ "#9E##9A$\"YA(!Y1!#9A$$9E%\"II!\"9M##IM\"&)Y,#9]$%)Y+$)U#$J)%#I]!#Y]&"
+ "$9]$!*-!#Z%\"%Z)#\"ZA!$:-$%:-!#Z5\"\"J%!#J9!#JE!#JM!#JA!#Z=\"%Z5.*:I'"
+ "#ZI\"$ZM%#ZY!#ZE\"$:M+#ZU!%ZU)%ZY\"$*]%#Z]$#[)!%+!\"\"[%!%K%!&+!*%K%!"
+ "$:]##;-\"#[1!#[-!%[5!%[5!$[5!&[=)&;9'%+=\"$;)\"'+A!\";E\"'+)\"'+E\"&+M!"
+ "#[5$&;I&(;A#%;Q\"%[I$$[M$&+M!\";Q\"$L!#'[I!&+U%&;U'%KU#(+Q%%[M$%+Y!"
+ "&+Y%&+]%'[U)%+U!&K]'&+]!%+]!%+]!&[](%+]!&,!!%K]##,!!$L!#)<!+'<9%"
+ "'<!&#<!&$L1\"&,!!',%*%+]!%+]!)<%&&L%'&,%!&KY#%,!!&<-!%\\!$$[Y$\";Q\""
+ "%;]!&+]!%;Y\"\"K]#%+Y!%;Y\"%;Y&#[Y$%;]!$;U\"\"+Y!&;]\"%<!\"![=!$[U$%[Q("
+ "$;]\"&KM(#+Q!$[I!%KM#$[A!%[I!&KM#$;E\"&;I\"$[5('+A\"$[A!#[-!%;9#(+A&"
+ "\"[5!%+5&$;9\"#[1!$;)\"#;-\"$JY$$[%)#[)!$[)!'+%'&K%,#:Y\"%JU)$J]$$*]\""
+ "$*Y\"#ZU!#ZA\"$ZQ!#JI!&:E!!*Q!&:I%#J9!$*A#!*1!#*9\"$*9##:5##:)##Z9\""
+ "#*1\"\"9]\"!Z5!\"Z!\"$J%&%Z9##J!$$9]$&*%$%Z-#%9U%#9U!\"YY\"#9U!#9M!#9A!"
+ "#)E##9A!$99%#9A!#)A##9=$#9)!\"I1!!Y9'#9!!\"I%!#)%##Y!$$)-$#(]##)%#"
+ "#X]##HU%#8Y$#(Q##H=#!H]!\"XE#!H5##8M%\"8E!#H9#\"H=!\"89!#X-'\"X-#\"WY#"
+ "%'U*\"7U!\"X!##7]%\"H!'!H!!\"WY!\"X1#\"X-#$85$$8)$#H)##(9&\"H=\"%(=)#8E'"
+ "#X='#XI#$8M##(E$\"8U!!HM)\"Y!##(Y##)!#\"8])!I%##9%!\"I!!\"Y=\"$)5'$I1)"
+ "#Y5#\"Y1\"\"I=!\"I9!&9='\"Y=\"!IE&#IE%#YM#%YM$!9U)\")M(!YU!\"YQ\"&YQ%\"I]$"
+ "$9]$$Z)##J)!#J)!&*)!#*-&!Z1!%:9(&:5,%JA%$Z5&%*=&$:5##ZE!#J=!!ZM!"
+ "&:=!%:I(#:Q\"%ZM\"#ZQ!#ZA!$J]$#[%!$*U\"#[!!%:]$$[-!$K)$';%$%K-$&[%*"
+ "&+-\"![)!$K5$$[-!$;%#'+1&$[5!#[5!![=!'K9,#[1!%+9\"$[9!%;M#$[A!%[A%"
+ "%KI##[E!'KQ#'KA$$[E!$[E!#L!#$;M\"$+M!%+E!$KQ#%;Q'$,!!$+9\"&KU'%+Q!"
+ "%\\)#&+U!&KY+#+Y!%,!!(+Y*'KY,&;Y\"%+U!%L%#$+Y!#;Y\"%;]!#[]$';]*$;Q\""
+ "*+U%%+Y!%,%!&KQ#%+Q!&KU#$+Q!&,!%&K]'&,!!\";]\"%+]!%+]!'K]'%,)!%+]!"
+ "%+Y!&;Y\"&;Y&'+U*$;U'$KU#%K]#'KU'$[M$%+Q!#KQ#\"+]!$[M%#[A!$+M!'+M%"
+ "&+M!%+Q!$[Y$&+I!$[E!&[E!*;E'(+A&'K9$$[9!&;A\"%K=#!;A\"%;9'%+5\"%+I)"
+ "$+5\"%+1!#+!%!+-!\";-\"'J]%![-!#[%!$*Q\"%K%!$*]%!*]!%+%&#Z]!%*Y&$ZY\""
+ "%ZU\"#ZU%$:U$%:I$!ZM!#JM!#ZI\"$*=##JA!#JA!$Z=\"$*5\"#J9!$:%$#J%!#J-!"
+ "#J-!$J-\"%J-\"#J%!$)Q#\":%\"#J!'$Y])%*!!$9M$$9U!$*!##)Q#$9U$\"IM!#IE$"
+ "#YI#$I1##)A&#)5#\"Y=(!Y9!\"I1!%I5*\"I-!\"I)!#Y)'$)%!#(Y!\"Y!\"$)!(#(Q#"
+ "!HM!\"X]\"$8I#!H9#\"XI%\"XI\"#(Q#&HE*#(-$#X9*#H=##X1&!H!!#(%$\"X-\"\"X-\""
+ "\"GM\"\"'U#\"7Y!\"WY#\"W]#!7U%\"H%%\"G]!&85,!H1)#(1$\"H=\"#(5#\"8=!\"HE'!XA!"
+ "#HA\"!(U!$XA%\"8=!#8Q!\"8Q!#(U##(U!#(Q#\"8I#\"Y%\"#X]#$(]$&9!(\"I%!\"Y%\""
+ "$Y-$$91(\"X]\"#I5%%99##IA%#)9#%)E'!YA!$)I$$9Q%$IM&#YQ\"\"YU%$)U#&IY+"
+ "#:!##Z!\"$*!##*%#%J!)#*-&#J-!#Z-\"$J1%$:1$$J=!$Z9&#JE!\"ZI!#J9!#JA!"
+ "#ZA\"#JA!%ZI*#J=!%ZQ\"\"ZY!&JY!%ZQ\"#ZQ!$:Y#%*U'$J]$&Z]\"!Z]!&[!&#;)\""
+ "#ZY!%+!\"#[%!#K)#![)!%;!#$;-&%+1&#[5!#K)'&+5&&+9&(+%/$[=!&[1)$[=!"
+ "&KA(%[A!$KA##[9!&;E'#;E\"$[E!$[A!$+Y!&;Y&$+]!%;U'\"[I$$KU'$+]!#;U\""
+ "$K]#$;U\"%+M!%+U!';E'';Y!$+U!%+U!#,!!$;U\"#+U!%,%!$,!%&[Y$$+U!%[U("
+ "';Y+*+Y*\"<!\"$KY#%,!!%;Y\"%KY#%K]#%+Y!%;Y\"\"<!\"'+U!)+]!\"+]!&KU#\"[U$"
+ "&+U!&+]%(+U)'+]%$[I!$[I!&+M!$+Q!#[=!$+M!%[Q)\"[I$$KA$(+Q.$[I!%[U$"
+ "&KE#&KA($[5!\"[E!&[=)$[-!)+I/$[A!$[=!$+9\"'+9&$[9!#[5!%K9(%[)!#+1\""
+ "#K-$\"+-%%[%)#Z]!%[)!%;-##+-%$+-\"%:]'$[!!$*]\"\"ZU!#ZY!$*Y\"$*]\"%ZU%"
+ "$JQ!\"ZM!&*I.%*I\"%*M\"\"ZE!$:E$$*A\"#JA!#Z5\"!Z=!$*)#$*=#$Z5\"#Z-\"$Z-&"
+ "$*!#$Z)&#J%!$:!$$:!!%IY##)]&#IQ\"$:)$%:!%%IQ##YI%!IM#$9Q$%9I\"$9M%"
+ "&II!$I=&#)E&!Y9!$)5$\"I5'$Y1*!Y-!\"I)!!)1!#(Y!$9!%\"I!'#8]$#)%##Y!'"
+ "\"8Q!$8M(!(U!#HI&#(I!\"H9\"\"8=!#(E!#(=$\"89!\"X1\"$W]+!H9##8)%!X!$\"X%!"
+ "#7Q%$'Y(\"7U!$']##G]&#W]$\"X!#$X9\"#X)'\"(!##(1#$85)!H5!\"85!\"89#\"8=!"
+ "#8A$#(=##HI%\"(I\"\"XM\"#(I#\"8E!\"8U!!HY!#)!##8]'\"I1!#(U#\"I%!\")1%#Y)#"
+ "\"X]\"#9-$\"9)1\"95##Y5#$I=&$9=\"#YE\"&IE!$YE&#9I!#9I!#YM#\"YU$$)U##YQ\""
+ "#9U!':)*%Y]'%*!!$*%#%:!\"\"J)!#J-!&:A)#Z9\"#:1#%:1!$Z9\"#JE!%:A,#J9!"
+ "%:A!#ZA\"#JA!%JI!$*Q\"$:Q*#:Q\"&*M'&*Y+#ZQ!$:U$!*Y!$*Y\"#Z]!%+%\"#[%!"
+ "';!$#[)%$;)#$K5$&;)'#[1!%[-%$+-\"$[%!%[5!!+1$%;5&&;)$$[A!%+1\"'K9)"
+ "%[=$$[I!![U(#[5!&+A!';I'&+=\"&+A\"$[E!#[I!&;A\"%;E\"&+M!\"+]!$[M$%KM'"
+ "$+M!\"[E!\"KQ#&;]&!KI#%+Q!$+Q!#[E!$+U!&;U&%;I\"%KU#$[I$!+U!#[Y$%+]!"
+ "&;M#\";E\"%<!\"([](%;U\"'KM'\"+M!$K]#%;]!%+Y!%+Q!%KQ#$[I!);I+%;Q\"%+I%"
+ "$+U!#[I!$+Q!'+Y%$+Q!$+M!$;M\"%KM(%KE0!+M!\"[E!&+Q!#;E\"%+M!$;E\"%+A!"
+ "'KE,%;A\"$[A!%;A\"#[9!$+=!&+A\"&[1%([-&$;=\"%;1\"%K)$%;9&$+1\"$;5\"$+1!"
+ "$K-$$;-\"!+1$%+)&#[)!$;-&#[!!$+!\"%ZU&\"Z]!#:M##ZY!%JQ!$ZU%#ZQ!#ZQ!"
+ "$ZM%$JM!$JI%#ZI\"$JE!#JE$#JE$$:E##ZA\"&JI*$Z9\"$:5##*5&#J-!$J5!#J)!"
+ "'*)!#Z%\"#Z%\"$Z1&!YY!#YE#$9]$%YQ!#YM\"#YQ##)M\"#9Q!$9A$#II!#IA!$IA%"
+ "#IA!$99(#)5#\"I1!#Y9#\"Y%##))#\"I!!#9)!#I%\"#8Y!\"9)#\"X]\"#(M#\"8Y!\"8I!"
+ "$HY$$(E'#XM!%(A)\"8A#\"8A!#XE'\"8=!#(1##H!!\"89!#X1'#X5$#WM)\"H1\"#(5#"
+ "#GM$$'Y)\"GU\"\"'Q#\"7]!#W]$\"H%$#X!$#(-'\"8)!!H=!\"X-#\"(-#\"X5#$8E)$H=$"
+ "\"8)!$XE($(E(#(E#\"XA#\"H]!$XY%#8]$\"(I\"\"8U!#XU!!Y!!#9!!#9)!#I1%#))#"
+ "#Y-#$)1'\"II!#9)!\"II!#Y9#$)='!YY$%)I!&Y-&#YE\"$Y=!$)I#!)5!#IU\"$Y]*"
+ "#)Q&#9A!$IU%#I]!#J!$%:!%%:1$$Z)&#Z)\"%:A(!Z1!%J1\"#J5!$:9##J9!%J1\""
+ "#:-##ZA!%JE!&J=*#JI!$:I##JE!!*M!$*E\"#JM!#JQ$$:U##ZQ!$:Y##ZY!$*]\""
+ "#Z]!!ZU!#[!!&;E+$K!$\"[5!$[-!&+1\"![5!%[-!&[=%#[%!#[5!$+5\"%;)#%[E!"
+ "\"[=!(+=!\";=\"%[9%%+9\"%;U'$[A!&+E%'[5&#[A$$+E!%[E!%;A\"&KA##;E\"&[I$"
+ "$[I$#;]\"&+M%&+Q*$+Q!$[I$$KQ#$+M!$+]!&K]+&KQ'\"K]#$+Q!'+U.$KY#$KQ#"
+ "%KQ#&+Y!#KQ#$;]\"&+Q!$+Y!#+Q!$;Q\"&;M\"$;Q\"#[A!%[I$&+Q1$[I$$KM#$[5$"
+ "$[U%$+U!%[Q(#[I!$+Q!$;Y\"%+A%#[I!%;I.$[E!![=!\"[E!&;1(%+Q%%+9\"%+U!"
+ "#+I!'[A!$[A!&+=\"#[5!&[9!%K9$%+1\"#[9!\"[=!$K9$$+1!%K1$%+)\"%[)!#[1!"
+ "\"K-$$[%!#+%\"%[)&%:Y'!K!#&+1&#[%!$*M\"$JY$%ZY&%K!)$*Q\"$JU$%ZQ\"$JA$"
+ "%ZY&%JQ(#ZE%#*E\"$J5(#ZA!$*9&\"ZM!%:-%$J9($J1\"#J-!$J1!#Z-\"#J)%#J!!"
+ "\"J)!&*-+#J-!$*%##IY!#*%##)E##YY\"#YQ\"\"IM!\"IQ!%II##YM##IE\"%9Q(!Y5!"
+ "#9=$#YE)#95$\")5%\"I1!\"I)!\"Y)\"!HY!#I)\"#I%\"$(Y!#(]#\"8Y!\"8U#\"Y!#!HQ!"
+ "#XQ#\"8M!#HM%#(Q#\"XE\"#(A$!(9#\"89#\"X5#!H5#$8-!%())!(-##X%!\"8%!\"7]!"
+ "\"7I!\"WM##'Q'#X)'!X!\"\"X!#\"GY\"\"']%$(%(\"8!#\"8)!\"89!!(5#\"X-##(%$$85#"
+ "#(A##H=#\"XA#\"H=!\"8I!\"8U!\"HM!!HQ##XQ'#(U#\"8Y!!H]#!9!\"#Y!##Y9##9%%"
+ "!)%!%)-&#)9#%)1%#Y9#$)9!\"YI\"$9I$$)U##YI\"#YA##)M\"\"II$#)A##YI\"$YQ#"
+ "$9U!%)U!#Y]\"#Y]\"#)Y##J%!#J!!&:%-#J%!$*)&#Z%%%:-!%Z9\"#J9!$*5\"%*9&"
+ "#J1!$*A##J=!%:E!#JI!!*E!'ZI'#JI!%JI-\"JQ#%JQ!$:Q$$:U#%:U$#ZY!\"ZI!"
+ "%*]&#+)\"$:]#%+!\"'K)%&Z]*';%(#[9!#[)!%[-%#[-)%;)'$K5#%[!&$+1\"&[5*"
+ "#+9!([-&$[-!#[9$#[=!%[=!&;1'$[E!%;A\"%;A\"$[A!%+9\"&;I\"%;E\"$[E$\"[=$"
+ "#;9\"$+U!%;I\"&+I)&KM''+M%%;E\"$+M!$+M!\"+M!$+M!#+]!$+M!&;I\"\"+M!$+M!"
+ "%[M$%+E%%;=&#+U!$<%\"$;E\"%;E\"$;M\"%+E%#;M\"$+M!';I+$+M!$+M!$+M!&[A$"
+ "([I%'+U*&+M!\"[I!%+1\"%[I$%+1\"%+E!%+E!&;E'#K=#%KA#(;=##[I!#[A!$KE#"
+ "&KE$$+E!';1,\"[9!$[=!&K5($[)!$[5%%K1(&+=&\"K1#\"[)!$+-!%[-&&[)-$;)'"
+ "$J]!#+!\"!Z]!%K!!\";%\"'*]/%[))#JI!$;!#\"ZY!#ZY!%*Q'\"ZM!#Z=(#:M##ZI!"
+ "\"ZE%\"Z9%#ZI!$*9#$JA!$J9!#Z9!#Z5\"%*1#$*I&#J%!#J=!#Z)\"&:)\"\"Z%\"#:-#"
+ "%*!(#)Q#$)Y#\"Y]!$)I$#9Q!#9U!$IE#\"IA!%9I\"#IQ\"#Y5#%9M\"$9A%\"IA!$IE\""
+ "$Y5$\")1\"%9I)\")1\"#))#\"I-!!))!$Y%'$)5$#Y)##X]!\"8])\"I!$\"8M!#(I#%(U+"
+ "$XM$#HM%\"HI!\"HE!#(I'!(=!#89%$8A#\"89!!H5#\"X1##8-(\"81!\"8E#\"X%#\"X!#"
+ "\"'A\"%7U#$'Y)!GQ&$'U#!GY!\"W]#\"WQ!!(-!\"7]!#8%%#()$#H!$\"X-#!X1!#H9#"
+ "%X9'#(=#$X9(\"XI\"\"8M##(I#\"HI!#HM\"\"HA%\"HU!\"(]\"$HM)#8Q$#(]&#I!\"!)%!"
+ "$9%%#))##95!#I)&$95($95%\"Y9\"$95%#I=!$IA#&)5,!YA!\"95##9I!#IM!%)Q'"
+ "!YQ!#Z!\"%IU''9Y+#J!!#J!!#J!!\"I]##I]!%:)%\"Z-!$:-#\"J)!$Z5&#*9\"!Z=!"
+ "#J9!#J=!$J9!#Z=!\"Z=!#ZQ!#Z9\"\"*M!$*Q\"#ZQ!#ZI\"&:M!!ZQ$\"ZE!#JI!#ZY!"
+ "\"*Y\"\"JY$&*]'$+-\"$[!%$:U##[!!%[))#[%!#[9!%;)'\"[)!$;-##[E!%+1&&;1#"
+ "#[5!$;1\"$[5!%;5##[=!%+A!%[5$$;A\"%+E!$[5!%;=\"(K=$&[A)#;M#%;A\"\";Q\""
+ "'[E))+5+\"[E!$+E!&[-!&[E!&KM(#[E!(KE($[9!'[I!&+9&%[E!$[E!%KQ#&;M\""
+ "$[I!'+U*%+M*&;Q'#[E!&;M#$[I!%+Y!%KI#'+I*%;M\"#[Q$%;I\"$[I$$[I!$;E\""
+ "$[I!$;E\"(+I.$[I!%[I$#[E!$[I!'KA(%+E!$[A!$[E!$[=!%+=\"%;=\"![=!'+9\""
+ "$[9!%[1!#[1!%[5%\"K!$%[5$$+M!#[1!\"[1!\"K)#%+1&(+1'#[)!&;%,#[%!#[%!"
+ "\"[-!#+!\"\"ZQ!$ZY%#*Y,#:Y#%*I\"!*Q!$*Q\"#ZU!%*Q##ZU!#JQ$$*M\"#JI!#*Q\""
+ "\"*Q\"\":A\"#ZA\"$ZA%#Z=!\"Z=!&*9,$Z5&#J%!$J1%$:)$%*)'$*%#$Z)#$*)#\"Z-!"
+ "\"IQ$$Y]*#IY!\"J-$&9U-\")U%$9Q!%YM$#YY\"%)M$#YY\"$IE#$)A!#IA!\"Y=\"#Y5&"
+ "#)5##I5%#I1%#I!#\"H]!\"I%!#I%##Y)##(U!#X]##(]##(Q#\"HY!\"XQ\"\"XQ%#(E!"
+ "$8Q($(I$\"HE!#8A%!X9!\"XI\"#X5$\"89#\"X5\"\"81!#(-,!8-\"#(-!\"H5*#8!\"#7]#"
+ "#7A#\"G=\"\"GI#\"7M$\"WQ#\"7U!!7Y\"\"8)!\"W]#\"7Y#\"8%!\"89$\"H1!\"X%%#(5$!H9#"
+ "\"X9\"\"H9!#HA%\"XU\"#(A$#HE\"#(I#\"I)$#8I%#XI&$(U'\"8U!\"8U#!)!!!(I!#Y-#"
+ "#I%\"#HU\"!))!\"Y-\"#)1&\"Y%\"!Y5!$Y9$#)=#!)=$#YM##9=!\"YE\"%IQ#%)E%#YM\""
+ "$IA#\"IQ!$)U#$)U#\"YQ!\"9Y&$9]'$9]$$J!%%)](':!&#J)!#Z1\"$Z1\"!Z-!&:5!"
+ "#J1!%:5!#J9!\"Z=!$ZA%#JA!#Z1\"\"ZE!$JI$#ZI\"#JI!$*Q\"#JM!%*U'#*E\"#*U%"
+ "#ZY!#ZU!%J]!#:Y'#Z]!#Z]!$[5!$[!!$Z]!#[%!#[!!#ZY!#*U)#[-!%K)($K-$"
+ "$[1!$;1\"#[%!![1!$+5\"$;=\"%;)#%+=!$;=\"&K%,&+=\"&+1\"%+=%&;E\"$[=!%;A\""
+ "$[E!&;A'$[I!$[=!$[A!$[A!#[I!%[=!%+I!%+E!$[I!#;=\"$;E\"%KA$$;E\"$[E!"
+ "\"[I!$[E!$;9\"&+E&%KI##;M#$[A!%<!\"%KE$%;A&%;E\"%;E\"#[E!%[I$$[A!'[I("
+ "%;E\"&K5($+A)$+1!'[I$\"[A!%KA$$[1!&+=&%K5$&+=\"&;9'$[=!$[5!%;=\"'+5&"
+ "#[9!&[9!\"[)!%+-*%+1\"$;1\"$;-#$+-\"$K)'$+-!#+)\"$+%\"#[%!%K%$%[!)$[!!"
+ "$;%##Z]!#Z]!$*]\"%ZY&\"*U%#ZY!$:Q$#[-!#:U##ZQ!!*M!#ZI\"$:I#\"*A\"#ZE!"
+ "\"*I\"$ZA&#J=$#J=!#*9\"#J-!\"Z=!$Z-#!*1!!Z%!$*%*%Z!*$*%#$:-#$IQ&&*%!"
+ "%*!(!YI!$I]\"%YU$%IY&#IU\"$9M%$9M$$9I%$)E$$IE%$IA#$IA&#))##Y=&\"Y9\""
+ "#))##I1%$)1!\"I1!!)%'#Y%##I-\"%Y%\"#XY#!9!\"#(Y!#(U#%HU%!HE!#(U##(A!"
+ "!(5!#(A##(M#!(I!#(A!#(9!!H9#\"XM\"#85\"#(-$\"X%##H))\"H)!#8!%!WY!\"WU%"
+ "\"'E#\"'I!$WI!\"WQ#\"7Y!#7U#\"7U!\"7]$#W]'\"H!\"\"X!#!H%#!()!$(-\"\"8)!\"H5\""
+ "\"H5!#H9(#(9!\"H=!#8A$$8I)\"HE'\"8I#\"(U%#(]#%HQ($8](#8U'#(U#%Y)%\"8U!"
+ "#I!#$Y!%\"I-!!I!%\"I-!!)-'#)=##9!$#Y=##YI#$YE#&9A#$I1##9E!#II!&II$"
+ "#YM##Y=##)Q#&)Y!#)I#!YY!#YY\"#)]##J!!%J!&$J%&%*!'\"J)!$Z)&$*A\"\"J)!"
+ "#J1!$:-!!ZE!$J9%$:9#%JA)#J)!#ZE%!ZA$$J=!$J=%%*I#$ZI%%ZI\"#ZM%$JM!"
+ "#ZQ!#ZU!$+!\"$+%&$J]$%*Y&!*]!$;-\"#[!!$:Y'%*]&$[!%#ZU!#[%%%[1!#ZY!"
+ "%;!'$[9%#*]%![1!%K5(#[)!#;E\"&+%\"$[-$%;1'#[9$%K=#$K9$$[=!&J]!&K9("
+ "$[=$%[9!&KE$&[A$%[=$%[A$&[A!%;A\"$[9!&;E'%KE#%;1\"\"[A!#[A!'+A*\"+M!"
+ "$[=!$[E!&[I$%;E\"&;I&\"[)!%;Q\"%;A\"$[=!%;A\"%;E\"&;='$+A!%[=%%[=!%+Q!"
+ "$[I!'+=\"$[A!%+9\"$[=!&+A&(+=\"$K9#$+9\"(;1(%;)#'K9)%+5!$[5!$;1#%;5'"
+ "$+)\"#[5!#[-%#[-!![-$$[-!#[-!#K)##[),$J]$$;%\"#[!!#ZU!#+1-%[%&$+%\""
+ "$+%\"#JI!#JQ$\"*Y!!*]$#Z=\"'K!!$:Q$%JY$$JM!$*I\"$JA!\"JE'\"Z9!\":A\"#J=!"
+ "#J9!#Z=\"$*9\"#J9!%J%*#ZA!#:1#\"Z5!$Y]'!*%!\"J%!#Z)\"!:%\"!*!!&*%!$)U#"
+ "#YM#$*%#%)E'$9](#9Q!$YM'%9M)#9A!#IE!%IE#$)E!$IA&\"IA!\"YM\"#YA#!I)#"
+ "#I1%#91$\"I%!!)-!\"I1!$)!$#HY\"#)%$!(Q#!XU!\"HQ!$XM\"#(M#\"8U!#(M#\"(I\""
+ "#H9&\"HQ!\"XA#\"XA%$X1&#W]$\"H5\"\"X)##8-%\"7Y!#H)%$H5*#()$$8!$\"H%\"!H!#"
+ "!GA#\"WE!!WA$\"7Q!!GI!\"'Q\"#GU##W]$$'Y##H!#\"'U##(%'$(%#\"()##H)$$(1\""
+ "!H%!\"X5#$X)+\"85!\"H9!#(A$%(E&$HE'#HQ(\"HQ!$HU)$(Q'\"HU$#9!$\"8]#\")-\""
+ "%8U,#)%'%I%!#I%#\"Y-%$)-$#)1##)=&!I9##)5##)9#\"II!&)=&$9=%$IY\"$9A\""
+ "%II##YM##9U!$9M!&9Q#%:!($9Q!#IY!%:1(%)Y$$*!##J%!!*%!#Z1\"%Z)*\"ZA!"
+ "#J-!\"J1!$JA$%ZE\"$*5#$Z9\"\"Z=!%ZA#!ZM!#Z=\"'JE&#JI!!*I$!*=(#JI!(JY*"
+ "#ZQ!$*U\"$[!!#ZY!#ZU!#ZY!%ZU*!*E!#*]\"\"*M\"$*]\"%ZU)&+%\"\"ZY!$+-\"&;)'"
+ "\"[)!!;)\"#;)\"$K)$#K-$#[-!%+1&%[-!&[5-$+5\"$K=#\"[5!&+1&$[A!$K5#'KE("
+ "%;5\")+9+%[5!$+9\"#+-\"$;E\"%[=!#[A!%[A!%+=!%+=\"&+=&$[=!$[9!%[=!$[I!"
+ "&+A&%[I$%+M!%;A\"&KA($KA#$[I!&[9!$[=!%;E\"&+=\"%+=\"$+=)#[=!%K5$![E!"
+ "&K9$&+9&&;5'$KE+%+9!%;9\"#K=();A,$[9)$[)!$ZY%&+9\"$[5$$[E$%K-(%[1%"
+ "#[!!$[-!#+)%$[-!$K!(#[%!#[)!![9!';%$$+%\"$K%$$JU!$:U$%J]!#:M*$JY$"
+ "$J]!#+!%$:M#\"Z]!$ZU%$ZU\"%JE%#JM!!:I\"%*I\"$ZM)#JI!$ZA&#J5!$*E\"#J=!"
+ "#JE!&*=+#Z-\"$Z1\"#Z1\"'*),#J-!#J)!\"J%!#J)!#:%'$:%$!Z%!$J%%#I]!$9Y$"
+ "#IQ\"#9U$\"9Q##YM&#YI\"$)E$\"9I#$YE&$IE&$)A$$9I$$IA%#9A$#)9#%9-,\"9)&"
+ "#I)%\"I%!!Y!!\"I)!$9!#\"I%!%(Y\"\"8]!\"8Y!#(]##HQ%#(M##(]#\"(M\"$HI'$(E%"
+ "\"XE\"\"8A!!HE)#(9&#(5##85$\"H1!\"85!\"X-#\"8A#\"H%!$H%%\"7M!#G]!\"7Y!\"GA\""
+ "#'A)!G5!!'E%#GI'!GU!#'U$\"7Q!\"GU\"\"X%#$7Y)#WQ(\"8)!!H%%\"7Q!\"7]!\"X)#"
+ "#(1!\"8-!#XA!#(=$\"8=$\"H=!#XI&#(A$$(E$$HE!#(Y##8M!$XU'$)!$\"8I!$)%("
+ "$I-'\"I!!%(U&#9%!\"I)!#HY\"\"I%!$I1)\"I%!\"I)!$)A!!)=!#)=##Y=##99!#9I!"
+ "#YM%$)U#\"IY!%)M($)A$!YQ!%)Y($J%%#YM%#J%!%)]'$*!##J!!\"J%!$:)!#Z)\""
+ "#J)!\"Z1!$Z5\"%J-&%*=&#Z1\"\"Z5!':A!#Z=\"#J=!#JE!#ZU!%J5\"#JI!!*E!$:M#"
+ "$*Q\"\"ZI!\"JE'%ZQ-#ZU!%K!$#ZY!#ZQ!%JY!#ZY!#[!!%+!\"%Z]\"&+!\"$[!&#[!!"
+ "#+%\"#[%!$*]\"$K%$$;)\"#[!!%[-!%K-$#[)!#[-!%;5\"%[1%%;-'#[5!%;5&![1!"
+ "$;5\"\"[5$%+5\"&+E%$[5!$[9!%+9\"([)+%+9\"#[9!$K9$$[1!%[9%%K=$#[-!#;=\""
+ "$[=!&;9''KE#%+9\"';=#%;1#%+5\"%+1\"([A!%;5#$J]!$;5\"$+9\"$;A\"%[9%&;9\""
+ "$[1!%[9%&;1($[A!#[5!$K5$%[9%$K5#$;-'%+)\"%;!$$[A!#[-!&[-&&K-)!;5&"
+ "#[)!$[1%#[)!$K9$#[%!#[%!$[%!(JQ.$+!\"#[!!%JY!\"[%!\"*Y\"\"ZU!$;!\"#[!!"
+ "$JM%%:M'#ZE%\"ZI!#ZQ!$:M$$:M#$Z=%$:M$#ZE!\"JE$#Z9\"#JI!&Z9##J=!#J)!"
+ "$Z9\"#J1!#Z5\"\"J1!!Z1!#J5!$Z9&#Z1\"\"J)!\"9Y&$9]$#YU&$9]$$I]%$9Y$#IU("
+ "%9I\"\"9Q##YQ%$YM#%)U($9E$%II#%YA+#9A!#9=!$IA)%)5%#I5%\")5\"#Y=\"$)9'"
+ "\"Y-\"#Y)'\"9)#$I9\"$Y!!$X]!#)%#$(]$\"8Q##(]#\"(U(#8Q$\"XQ\"\"8E!#HE#$8E#"
+ "#(A#\"X=##X9!#8!##85%#H1&#8%\"\"89!\"X%\"#']!\"H)!!H)!!H!!$']%\"WQ#\"7U!"
+ "\"'I\"!WA\"#WA*\"WM#\"'I!\"7M!\"WI!$7U\"\"7]!#'Y$\"8)!\"G]$\"H!\"\"8%!\"8)!!X-!"
+ "#']$\"X)##(5$\"X5##8-%#(A$\"H=\"#(I##HE#$(M'$8I%\"8Q!#8I$#(M##HU\"\"I!!"
+ "$XY$\"HQ!!HY!#8]!%(](\"I1!\"I-!\"I)!#95!\"Y1\"#I%#!Y5$\"9A#\"YM!%I=*#YA\""
+ "%)I(%9Q)$)Q$$II&\"IM!#9Q!\")A\"$Y=#$)M$!YY!!)U!%I]&#J!!$Z!\"#Z!\"&*-$"
+ "&:)\"%:1(&Z-'#J)!#J1!$J5!\":)&$*5\"#Z=\"%*A'#J=!&J=\"$:9##Z1\"%JM!#ZA\""
+ "#JM!%JM!#ZE!&*]\"#*A\"$ZQ%$*Q\"\"ZY!'*U'$*M\"&*Y'\"ZY!$+!\"$J]$#[!!#[!!"
+ "%*]\"%ZY\"$[!&%JY!$[9!$+!\"$[1$#[1!$;%#$+)!#K)'#[!%#[-!#K-#';=\"\"K9'"
+ "$[1!![-(%[5!#K=#$[5$#[-!$+A!&+5\"$[5!&+5&'+E!&+1\"$[5!$[=!$+=!%;E\""
+ "&KE($[9!(+-\"&;E*$[E!%[9!$[9!%[-!%+9\"%[5$'K-!$;1#(:])';9#$[=)$K-$"
+ "$;1#$;M##[I!$+5!&[1!%;-\"$[5$$+1!%[1!$[1!$[-%%K!)#Z]!!+%!%+)\"$[)!"
+ "%[)!$K%$%K%$#+1\"%K!)%Z]%!+!!$[-!$J]$#+!\"(*]#%*E'%K!$#ZQ!\"ZY!#ZU!"
+ "#ZU!$*Q\"$:M##ZM!$JI!$:I$#ZI\"\"ZE$#ZE\"#ZU!#*I\"#ZA%$J1(&*9($JA$#J5!"
+ "#J5!$J1\"\"Z5!$*!#!Z%!#J%!#J!$$J!\"#Z!\"#IY!$9]$#J%!$)]##IY!$)]##9U!"
+ "#IU(#)E#!9M\"#9A!#9M!#YM\"\"YE%\"I5!#)=#$I=*\"I9!#91!\"I5!!Y%!#95$$)!\""
+ "$)-!$99\"#9%!$8U%!I!##(Y#\"8U!!XY$$(]*\"8Q!#HQ+\"XE\"#8E%#(E!$(E$\"(9\""
+ "\"8M!#(=!\"X9\"\"H5\"$85)\"81!\"H%\"\"X)%#H)#\"X%#$8!!$G]'!W]$#WM\"\"7U!\"7Y!"
+ "\"WM!\"'=#\"'I!#'M&#'I$\"7M!\"7U!\"WI#\"GU\"\"X!!#GY'\"G]\"!H!!\"8)!$8%$!()#"
+ "!H)!\"H-!$()\"\"81!\"81&\"89!\"H=!\"85!\"8A#\"X=%\"XA\"\"XE#\"(]%#8Y'#H=%\"8U!"
+ "%8Y#\"XY\"#8]$\"X]\"!I!##XU!\"9)#!)-!!Y1!\"9=#\"I5!!Y5!\"I9!#)5&#)-&#)9#"
+ "#YE&%I=##IM\"%IE*#IM!#9I!#9U!#IY!%IU&#)]##9U!$II&#9U!#Z%\"\":!&%)Q$"
+ "$)Y'%*)$%:)%#Z-\"$:%!$Z1&%*1#&:5%\":5#%J5%&*A'&J=\"&:5)$ZI%#JE$#JA!"
+ "$ZI%%:U##JM!$ZI&#ZY!$J]!$*Q\"\"*Y!&JE!$*U\"#ZY!#ZU!#ZU!#Z]%#ZY!$*M\""
+ "#[%!$ZU\"$JY$#ZY!#[!!&J])&;-'#[)!#Z]!\"JU##[-!$K1$$:Y##K)$$[-!\"[-!"
+ "$[5$$[9%%+-&![5!#[9!#[!!$[1!$+5\"#[9!%;1'#[=!#[-!$;9\"![5!$[1!#[9!"
+ "$+1\"$+5!$[5!$K5$$+5\"%;5\"%+=&#[9!$+5\"#[=!%K1(\";)\"&[1%$+1%#[)!%+1\""
+ "%+)&#[5!$+5%';1(#+1!#[)!%;='$;=\"%;%#%+%\"$+)\"$[!%$+9!#+)!$[9!#[!!"
+ "&+!+$[!!#[!!%JQ!#ZU!$[1!#;%#%*]\"$*Y\"#[-!$ZQ\"%*U&!*M%!ZM!%*Q#!*U!"
+ "#JA!$JI%%ZQ\"$ZI%#JI!$JE!$*E\"#J=!#ZI!%:A!&:A%#ZA!#Z9!$JI$'*-)%:5$"
+ "#J1!%*1'$J-\"$Z)&\"J-!$Z=\"!YY!&:%\"\"*!\"#)Y&\"9]#$*%#\"IU!#9E!')Q%$9Q%"
+ "#9Q!#9M!#9I!$IQ%#9=!%YA($I=&%IA'\"I=!!Y5!$)-'\"YA\"$)1$#I)%#)5&\"8]!"
+ "\"I)!%)1(#(]!#8U$\"Y!##(U!\"8Y!#8U$$HQ#\"HQ!$8M)!XI!\"8M!$8E)\"XA##85%"
+ "\"8=!%(9#\"H5\"#X1'$81$\"X-#\"8=!!'Y($H!(\"']\"#8!%!G]#!'I!\"WU#\"WQ#\"7Y#"
+ "#75%#75(!GE!!W=\"\"GQ$\"WI##GA'\"7M(\"7Q!!WU'#GY&#W]'\"G]$\"WU#!H5!$8%$"
+ "$(%##8%%$8-!!H9!%(=)#81%#H9#\"(1\"$HA)\"H=!#85$\"XI\"\"HI!\"XM\"\"Y)%$HQ'"
+ "$8U(\"Y!\"\"8Y!\"H]!\"H]!%I)$$9%#\"Y!#!Y)!&)9,\"I5$\"Y1\"$)-$!(]!#95$\"I5!"
+ "\"IE!$)A$#IA%%IM##IU\"#9I!&)I)$:!$!9M%$II\"%)U$!YY!\"J!!\"Y]$#)]\"#Z!\""
+ "$*)##Y]\"$J5!!:)\"$9]$\"Z5!!Z-!#*9\"#*I\"\"Z5!$J5!$*E&#Z9!&*='%ZI\"$Z9\""
+ "#JA!$J=!#JI!&:E!$:Q#$J=%$JQ!$JQ!#J=!$JQ%#*U\"#ZQ!\"ZU$%:Q(&Z]\"#ZQ!"
+ "$ZU%#ZY!#ZY!%Z]*&J]$#[)!#+!0#;)\"$+!\"$[%!\"[%!#[)!#[%%%+)\"$K5$'K!)"
+ "%;5'#+1%\"[-!%[1!#[-!$K!$!+-!#[1!&+-&#[-!#[-!$[-!%+-&$+-\"$K-$\"K-#"
+ "#Z]%#;)&$[-!#;1\"$[-!#K1##[1!)K1.$[5!$[9!$[1!#[1!%;)'#[%!$JU$%[M$"
+ "$;)\"$;1\"%+-&![9!\"*]\"&;)'$;)\"#[-!#[)!$[!!%[1!$[1!$[)!\"[%!&Z]\"%JY!"
+ "$Z]%#[)%$*]\"#[-!#Z]!$JY$#[%!!ZQ!#ZU!#[%$$ZU%&*M'\"ZY!'ZM'\"ZE!$:M$"
+ "%:M'!ZQ$$:I##J1!\"*E\"%*E'$:A##J1!#J=!%*='$J9%#Z1\"%:1!$J1!#*1\"$:9$"
+ "$Z=%&Z-'!:-\"$Z))$J!%&J1#%J!#!9Q\"$YY'\"J!$#YY\"%9M%#I]!$)I#%9Q\"#II\""
+ "$9U$$9I\"$)E#$)I#%)U'#9=!!I=&\"Y=\"\"I9!#99$#9-$!I1#\")=\"#I-%#9-!\"Y-\""
+ "$9-%$)!%$9%&\"8]!#8Y$!HY!#XU'!HQ##(Q##(M#%(I#\"(I\"$X5##(A#$XA&!(1!"
+ "\"89!#X1&\"8=##X1'#H1&$89+\"8-!!X%!$(%(!7M$#']$\"7Y!\"WY#\"7U!$8!)#GY'"
+ "$&]'!G=!\"G=#!WA\"\"GE#!'E!\"GI\"$G](\"GA\"\"7U!!H)!$'M#\"GI#\"GU\"#(!!#X%$"
+ "#X-!#())$H-$\"H%\"!X5$#89%%X5$\"89!#(=!\"(A\"\"(A\"\"XE%#(=!#8I!%(M&$8Q)"
+ "#8M$#(U!!I)#$HU&$8]%#9%%\"8]!\"9%#&I!&\"Y1\"#Y-&\"Y-\"!Y=!#99!#9E!!99\""
+ "\"99#\"Y=%!YA!\")A\"%YI!$)Q#(9U$#9M!#IY!\"IQ!%YQ!$9Y!$)U#\"Y]!%IY#$9Y!"
+ "$YY&#I]!!:%\"#J5!#J5!$J=!#*-\"$J9!\"J1!$*1#$Z5&$Z9\"!ZE!#J=!$J-\"$JA%"
+ "&:9!#*1\"#ZE\"#ZA\"%:E$$JA$#:Q#&JM\"'*Q'#JI!#[!!$[!!$JA%%*Q'$JU!#ZY!"
+ "#ZU!#ZY%\"Z]!#ZY!$JY($Z]%#Z]!%*Y'#ZY!&:],\"+!\"$;!\"$:Y##[%!#K%$#[%!"
+ "$;5\"%+%\"#[)!(;)(':]$#Z]!$+)!$;5&$+%\"$+5\"$+5\"#[!!\";5\"#[9!$+-\"$+-\""
+ "#Z]!%;-#$+%\"#[-!%K%!![1!#+-&&[).#[1$$[5!\"[)!$+1!$[9!![-!*+%,&+-\""
+ "#[)!$+)\"'+)\"\"[1!$K!(\"ZU$#[%!$K%$&+)+%+%\"%K!(!*]!$K!$\"Z]!#ZY!\"[%!"
+ "#Z]$!;%\"\"[!!%:Y$$JY!&K!!%*]\"#Z]!$:U#$JM!$JE!#*Q%%JQ$$*M\"$JE%#ZI!"
+ "#JA!'*=!#ZA\"#ZI!!Z=!\"ZE!#JA!#J=!%:9!!:9\"#*-\"&Z5.$:=#&ZA+$*1\"$J))"
+ "$*-#$*)#%9](%Z)*$*!*$J!%$*!'$Z!#\"J!!$YY#!)I!!)]!$)Q#$)U##IM$%)Y$"
+ "%I=+#YE#\"IE$#99!#YE#\"I=!%)M(\"I5!#95!!II#\"I1!#9-!#9%%\"HQ!$Y%'\")%\""
+ "#9!\"$)%'\"HU$#(Y#\"H]$\"XQ%#HI&!HQ&\"8M!#XA'#(I$$XE!!HA&\"XA#\"X=##X1&"
+ "\"85!\"85!\"(1\"%8--!(9!\"8)!\"X%#\"7]!!H!!\"7U!$GA&!8!\"#'Y$$'](\"WQ#\"7Y!"
+ "!'1!\"79!!'9#!WA\"#'A'!'M!\"WE*\"'A!#GM!!'U!\"WU##'Y\"\"WY-#X!(%(!$$GY#"
+ "\"X%##(-$$X)&\"X-#$(%(\"H)\"&8E\"\"(1\"#8A\"!(=!!HE&\"XA#\"XE##HE\"#X=!#X]&"
+ "&8U+!HU!$(]$#(I##(U#!Y%!#Y!'#8Q!#I%#$)-!!)1!$Y)!!)!!!Y1!#99!\"I-!"
+ "#)A#$IA#$Y5$$9A%#9E!#Y9##9E!#IE!#9I!&)A,#9Q!$)]#\"IM!#IU!$9I%$IY%"
+ "#J!$#YI#%Z)##YY&%J1&#J!!\"J-!#Z1\"#Z)\"#Z-\"$:-!#:--%:!!$*)##JA!\"ZA!"
+ "!*9!#*=\"%:=!%*A'#:A-%:=!#ZI\"!*E!#JI!#JA!#JE!$*U\"$*Q\"\"*M\"$*Q\"%:U'"
+ "$JM$%*U\"#Z]!'+!#%JI!$*Q\"$;)#%JY!'*Y$#Z]!#+)\"\"ZU!$+%\"#[!!%*]\"$*Q\""
+ "\":Y\"&ZU*$;1##[)!#[5!$;1\"$*U\"$;!\"\"[!!$K%'#[1!%;%'%K%$$[%%$*M\"%[1!"
+ "$K)$'*Y'$:U$\"+-!%[%%#+!\"$K)$$+-\"%K)(#;5\"#[)!$[5%$[1!%[%&#Z]!$*Y\""
+ "$[%!$[)!';!$%+%\"#[!%#[!!$[!&%;!'\"*Q!$+!&\"*]\"#ZY!#Z]!\"[!!$J]!\"ZU!"
+ "%JU!$:Y#$*U\"\"ZU!$*]\"\"ZY!$*Q\"$JQ!#*Q\"#ZM!%*M&$JA!!:I%$K!$\":M&#ZE\""
+ "#JE!#:A#$*I\"%JI(!Z=!#J=!\"ZA!#*9\"$Z9\"$J-%$:5#$:1#$:E$#J5!\"Z=!%9])"
+ "$:)$$*1#$)]##YY\"#*!#%)]'$Z%\"$9Y!#J!!#YU\"#J!!#IU\"#YM##)U#!YI$%)I("
+ "\"I]!$)E*$I9&$9=%\"I=!!YA!#9I!#)5##)-#$I1#\"X]%\"I-!#9-!%)%\"#I%\"#I!\""
+ "#9!\"!HY&!(]!\"8Y#\"XY\"#HY%$8Q&\"HY!$8I##(I#\"XI\"\"8A!\"HE!$H='$XA(#H9#"
+ "#X9!#(1&\"(-##(1#\"X5#!(!!#X)$!GY!\"G]%\"G]\"\"W]#\"7U!\"7I!\"WQ#\"7M!#'I!"
+ "!'1!!71$\"79!\"GA#!W9\"\"7A&!GE!$'A$\"GE%\"GA\"#'Q$#GA'\"WU#\"7]!!'Q&\"WY!"
+ "!H%#$()(#81!$H1*\"X-#\"81!\"H-!\"8)!$89)\"81!\"8=!#8A$$(E%#HE#\"8Q!!HI!"
+ "\"8M!\"8U!$(Q%%(Y&\"8U!!HY!#H]%!H]##9!\"#9%!#I%\"#9)!\"I1!!Y-!#))#%)9!"
+ "\"I5!#Y9&\"I9!$)E'#9E!$9A+\"IA!$)U#$)A##)M#$)M#$)I#$)E!%IQ#!Y]!%)U!"
+ "\"YQ%#J!!$)]#$*)##I]!$Z%&&:1\"$J%%#J)%#J9!#J-!$J5!!:1\"$*%#$:1##ZE!"
+ "%J9!%:9(#Z9!#Z=\"$JI!#J-!#JA!$*E\"\"ZE!#Z=\"!J1#!*E!#*I&&:Q$$:M$\"ZM!"
+ "%*U'':I!#ZQ!#Z]!\"Z]!\"ZM!#ZU!$:Q$#ZY!&:U$!+!$$JY$#ZU!$*]\"$JQ!#+%\""
+ "#:]\"&K!$#[%$#[!!%J]($+%\"#ZY!&JY,#K!$#[%!$;%#$+)\"%+%&\"[%!%[1!%;%'"
+ "%+%&&[%!$[-!\"[-!$;%##[)!#ZQ!$+%&#[%!%;%'#Z]!#[)%#[%!\"K-$%:Y$$;!\""
+ "#[9!$[!%#JM!$;%\"#[!!&;!#%ZY\"$Z])$:U'$K%$#Z]!%*Y\"&ZU'#K%$#ZQ!$ZU\""
+ "%:E($ZI&$*M\"$*Q\"$*M\"#*Q\"#JI!\"ZM!#ZQ!!*M!&:=!#*E\"#ZE\"%JM)!ZA!$*A\""
+ "#JA!#*A\"\"Z9(#J=!#Z1\"$*E\"\"Z9!#Z5!#Z5\"%*%#$:1!%J1)$*)'\"J)!#*1\"$J)%"
+ "$:1#%)U!#J!$$:!!&*-+$:)$$IU)\"IU!$)U##YM\"#IA!#YM#$9I$#9Q!#YI#%9I)"
+ "$IM\"#IA%&)A,#9=$\"I1!$9A%#)9#!I1##Y9##)5#!Y-!!Y-!#(Y!#H]\"$8Y%$(]$"
+ "\"8]!\"HY!\"8U#$8U(#8Y$#(M##XQ$%8I'#XI!#8I%#XA$\"X=##8E$#(=#$(E'\"H5\""
+ "\"XA#\"81+\"8-!%()!\"8%!#X-$#H!&\"X!#\"W]%#GY)\"WM!\"X%#\"WU#!WQ$!WE!\"GI#"
+ "\"79$$7-\"\"'1#\"79\"#'A$!GA!\"G9\"\"'I#\"GI#\"GI##7M%#7U#$(%(#7Q\"\"H!\"\"7]!"
+ "#'E!#X!$%']!$7]'\"X)#\"X5&\"X9##H1##X5&\"89!#(9#\"8M!$HE$\"X5#$8E)#HI\""
+ "$HI'\"HY*\"XI\"#8I%$(Q%$(]!#(U&#(Y#\"8]!%9!*#9%!#(]!\"I)!\"IE!#91$$Y)("
+ "#91!#9)!!95\"\")E(\"Y1\"!YE!#YA##Y9#$9A%#IM%%)I+#9Q!#9M!$YM##IY!%IU&"
+ "$IY&#IY!#Y]\"#YU\"#Y]\"!Z)!$Z%#$*)#%Z%'\":%##J-!%:-!#J)!#J-!#Z1\"$:1!"
+ "(*-*#Z)\"%JA!&J9\"#Z9\"#Z9\"%*=#$JI%!*A$$:Q$#ZQ!$JM$#JE!\"*I!$JI!#JE$"
+ "&:=!#JI!#J=!#JM$#*I\"$*Q\"&*Q'%*M#%*Y&\":]\"#ZQ!$:U##ZY!#ZY!$ZY!$ZU\""
+ "%*Y'\"[!!\"JY$#[!!$[%!\"J]##*Y!$*Q\"%+!&!K%#&J]!#[!!$ZY\"#+!\"!+!!#[!!"
+ "$[!)#[-!\"[1!$Z]!%;%'#Z]!\"K!$$J]'#[!!%;!'#[!!%:]'![5!$K!(#*]%\"[-!"
+ "$Z]%\"ZM!$:]#%+-)\";%&&Z]\"#;!\"\"ZY!%ZQ\"#[!!$*Y\"&*U'$:U$%ZU%$K)$\"ZY!"
+ "#ZA!#JU$\":Q\"$*M\"$ZM%$JY!#JM!%*I\"%*I*%:=$$JQ!#ZM!%:E$#JE!$JA!#J9!"
+ "#J-!#J1!#Z)\"%*5#$JA!#Z5\"#J)!$J9!$*1\"$:-##*-\"$*1\"$Z)&$J%%#J)!#J!!"
+ "$Z!##IY!#J!!#9Y#$)U#$Z!&$)U##IU\"#)I#%9Q(#9E!#9E!#9I!$9I%&IA$%YA("
+ "!)=!\"I9!!IQ#\"I9!$95\"!Y-$\"I-!!Y1!!)5!#91$#Y)#%I)($9-\"#I!##(]!%(Y\""
+ "%(Y%&(]-$HU$#(I!$H]#!HM!\"8I!#XE$\"XE\"#(A!#(E##(=!\"85!#X9'!H9!$H-%"
+ "!89\"\"X1%!GU!$8-)\"X)&#H-##'Y'#7](#7Y%$W]&\"7U&!7U\"!WI!\"WI!\"GE#\"7=$"
+ "#W9%!G)!\"'9#\"GE$\"G5\"!W=!\"WQ&#G-\"\"GA#\"GM\"$'Q##'I%#7]#$'Y&#WU$$'Y%"
+ "\"7Y!!H5#\"8!!#7]%\"H-!#H5&$89)\"8)$#X1'!XA!$(9\"#(=$%(1$\"HA$\"HA!\"XQ\""
+ "$(A%$HI##XM'#HQ\"%8U)#XM'#XU#\"8Y!%8Q'#H]%$(U$$8Y%#))#\"I!\"#X]&$)-'"
+ "!)1!#I)%!Y5!#95!#I9%$Y='#9I#%IE*%IA$&)E,#9I!%YM!%9I%$)M##9M!#YQ#"
+ "\"YQ\"$9U$')U*&9M#&)Y$#9U!%9])&*%$#J-!$*%#\":%\"#Z%\"':5)\"*=!'*1!#:1#"
+ "\"J1!\"*1\"'J9/#*5%#J9!#J5!#J=!$:=$#J=!!Z=!$*=\"\"ZE!#Z5!$ZA\"':I)$*5#"
+ "!ZA(#JI!#ZY!#ZQ!$ZA\"%*M\"#ZU!!JU'#JI!%:Y$#ZQ!#ZU!&JM)$*U\"#*U\"%ZI'"
+ "$JI%$JY!$[%!'JY%$ZY%#*Y\"\":I#%K%$$+!\"#[%!#ZU!$*]\"\"JY#$*]\"#:Y#$ZY\""
+ "!*]$$*]\"#ZY!#Z]!#ZY!$[%%$:]##Z]!#Z]!#[!!$:M$$K!$$J]!#Z]!#ZU!#:]#"
+ "#ZY!!:Q\"&:Q$$Z]%#ZY!%ZU-$ZU%$:Y#$JU$$JQ!&ZY\"%:]''JQ&#JM!%;!##ZQ!"
+ "#JA!$J=!#JI!\"Z9!#JI'$:Q##JE!#J9!%ZE)#JE!$*5\"#JA!#ZA\"%JE(!ZA!#Z1\""
+ "$J=%&:-\"#ZA\"#J5!!Z5!$*1#\"J1!#J-!\"J)!&*-%$*)#$Z=&#J9!#Y]\"$*!#$)Q$"
+ "$Y]&#J!!#9U!$I]&\"YU($9U*%II#$IQ%#9M!#9M#$)I$&YQ(&9E-!YE!#9I$#)M&"
+ "$I=*\"I9!#Y=#\"I=!!Y=!$I-#\"I-!&Y--#)!#$I)*#9!!#I%#$Y)'#(U!$91\"#HU\""
+ "\"HU!#XU&\"Y)+#XA$\"XM\"$8A#%(E&\"8I!$(E'\"8A!%8=$#H=&#(5!\"X%#\"(1#\"(5#"
+ "\"8)!\"WY!\"8-!\"H1'\"8%!#X!'#7M&\"7Y!\"7M!#'Y$#WU\"#'M$!WM!\"GA#\"WE#\"7A#"
+ "\"'-!!GA#\"'9#\"7!$\"WE!\"'9\"#'=%!GI!#'I&\"GE$\"GM\"\"WM#\"'I!\"WE##GY)\"7]!"
+ "#7Q%\"X!#\"H%\"#H!$#X%'\"8)!\"H%'\"X-\"!H5!\"8!##X5$$(9%\"X%##X=$\"HA\"#8I%"
+ "\"(Q%#(9#\"8I!!(Y&\"HQ!\"H]$\"8U!\"XU\"#XY!\"8Q!#(]##Y!$\"))%$)!$%I)'\"I-!"
+ "!Y-!!I9&#)5#!Y9!#)5#$99(!Y9!#I=\"!I=&$)9'')A.#9E!#II+$)I&$9Q%$9Q$"
+ "\"IQ$!)Y!#9U$$)Y##YY\"%)Q$$:)!&Y]$$)]#$:-##9U!#Z%\"$J%%#Z)\"#J)!%:-)"
+ "$Z-&#Z-\"#:1#\"J1'#JE!#J5!$*5\"#J9!#J=!%:=(#Z=\"#JA!#Z9!$*5##Z=%#JE!"
+ "\"ZA!\"ZM!%*M\"#ZI!#JE!&*Q'%*Q#%ZU&$*U\"$ZI%\"Z]!#ZQ!#ZU!%*Y\"!ZY!$:Q#"
+ "\"ZU!%ZU!$*U\"#Z]!#:Q'%JY)%*M'#JY$%:Y$$J]$%+!&#JM!$;%##Z]!$ZY%\"Z]!"
+ "$JY$#*Y\"$*Y\"$[!&%:U'$*U\"$ZY\"#[)!$JU$#Z]!#[)!$JY!\"JY'$*Y&%JU!%;!'"
+ "$K!$\"ZU!#ZU!\"ZI!%JY%\"[!!#*=\"%ZQ%$*Y\"#JI!%:U(#ZQ!#JE$$:M#$ZE\"$JM%"
+ "\"*E!$ZM!\"ZI!%*Q##ZE\"!ZY'#*I\"#JI!$:-##JA!$*A\"&JA*$J=!$*E\"$Z9\"$J9%"
+ "#J=!#:9#%J)\"#J!!!Z1!$:-!#Z)\"#Z1\"\"*)\"!Z!!%IY&$:%!\"J)$$:%$&J)#$9U$"
+ "$I])$J!($*%'$9]!#Y]&!99%$YQ'#YY\"$YI&%YI!$)=!#9E!$I1##I9\"$YI'\")=\""
+ "%9=#\"I1!#)5#$I%&#9)$#9%$!Y)!\"I1!#I)%#9%!!9!%$(Q!\"8]!\"8]!#X]&\"XU\""
+ "$8M&\"8Q!\"8Q!#XM!\"HA!#HI#$(E(#(=#!(A#\"H5!#(=$\"(-\"#H-)\"85!#81%\"X-%"
+ "\"X)#\"X)\"\"8%!\"H!'\"G]\"#8!%\"X!#\"H!\"\"7E!\"GM\"\"7M!\"7M!\"X!#\"'E#\"'A\"\"'A#"
+ "\"71\"\"'-#\"7=$\"7%&!G5!\"79$\"W9&!G=%\"GE%#7E(\"G1%\"WI!#WM'\"WM##'A%#'I\""
+ "#X!\"\"WY#\"7]!#(!$\"X!#\"8%!\"X!!\"8)!\"X=#\"8)!\"X9\"\"X9#\"8=!#(9#$(9'\"8I#"
+ "#8A$#(A#\"HA\"\"HI!#(A'#(=$\"8U##(U##HU\"\"HY!$(]*\"8Y!\"HY!%9!*#X]!\"Y)\""
+ "!Y)!#Y-#\"I9!\"Y-%#)-#$)E'$I5##99!#)=#\"YI!#9I!#II!#9=!#YE#\"IM!$II%"
+ "$99%$IE\"#IM\"$YM#\"I]!#IQ\"!)Y'%J%&#I]!#9]$#J!!$J)!#*%\"%*%'#YY\"#Z%\""
+ "#J)!#Z-\"#Z!\"$J-%$*5#$Z1&#J)!#:5#\"J1!#J5!!*1!$:5##J=!%ZE)$JA%#J=!"
+ "$:A#&:A%#:A#!*E$%ZE&$J=!%*M&#ZQ!#ZI\"$JE!%:Q$%ZI&&*M'$:Q#$JY$$JQ!"
+ "#ZU!\"ZQ!$*Q\"#ZU!#ZU!&:Q,$ZU\"(:Y)!ZY!#ZU!$*U\"$:U#$*U\"#ZY!#*Q%#ZQ!"
+ "$:U$!+%!%Z]!\"*]%$ZU)&JU!#ZY!(:I%\"K%#%ZY!%Z]*%ZY%$:Q##ZU!$:I$$ZU\""
+ "#*Q\"$ZQ\"%JQ!%*M&#JM!$*Y\"\"[%!'Z9$%ZU\"%*I\"&ZM.$JE$%*M&$:M#\"ZQ!$JU!"
+ "$ZU%#*A\"%:9!$*Q\"&JE!':A!\":A&$:=#%:=%'J=*#JA!$:5'%*9'\"Z9!&:-!#Z5\""
+ "#:9##J5!#J-!%:)!#J-!%*-##J!!!Z1!$9]!#:!#$J%%#J!$$Y]#%Z)#$9Y!$)U#"
+ "$IM&$*!#$)U#$YM'#9Q!$)Q##YQ\"&)I)$YI$#YE#!Y5!\"I5!!Y=!#I=%$Y=!\"Y=\""
+ "#I9\"%I9-%91,%91#\"I1!#I!%#))#%I-!!Y!\"$))$\"8U!$8I&\"8Y!\"8M##(U##8U$"
+ "!XQ$\"XQ\"#(I##(I!#8Q$!HA!\"8I!\"XA#$HM)$(9+\"H5!\"X=#\"8E&#X1$\"X-##8%%"
+ "$8))\"8%!#H%&\"X!#\"7]!$8!!\"WY!\"WU!%'A(\"7Q!\"7Y!\"GI#\"7I$#7M'$7E$!GA!"
+ "\"'9!\"7-$\"G)\"!W9($7%!!GM!!G9!!W5+\"')\"\"'1\"\"GE%#GA$\"'9#\"7U!#'Q$\"7Q!"
+ "#7]%\"WY#\"7]!\"X!#\"X!#$WI#!H-%#X%'#8!#\"8-!\"81!#(1'\"89#%8-*\"X5#$H1\""
+ "\"8E!#8=%!HA!\"XI\"#8A\"\"HU$\"8M!\"HQ!\"8Q#\"8Q##(Y##8U$\"8]!#9-!$9!&#I5\""
+ "#I%##))##I)%\"Y-%\"I1!#)1#\"I9!\"Y1\"\"9=##99!#)=#$Y=#'YE&!99%#99!%YI+"
+ "%IQ)$IM%$9E\"#YQ#%)Q$#9U!#YY\"#9I!$IU\"%YY$$)U'&9U&$)Y#%J!\"#Z-\"$9Q!"
+ "&*)!$J)%%*1'#Z-\"\"J-!#J-!#J1!%*1'#J)!#Z=\"#J5!$*=\"\"Z9!#:9#$*)##:=#"
+ "\"Z1!!*5!$*A\"':A)$J5%$J9!#ZQ!%:I$%ZE\"$:A##ZE!$JA%#JI!':U%%JI!#JM!"
+ "%ZM\"#ZE\"\"ZM!\"ZI!%Z]\"#Z]!$J]$\"ZQ!$*Q&$ZU!$ZQ!$:Q##ZQ!%*I#$:Q$#ZA!"
+ "&:Q(#ZU%#ZQ!%:U#&:Q($ZU%$:M#\"Z]!\"ZI!%+!&\"ZQ!$JQ%$JI!#JM!&:U$#ZQ!"
+ "&JU!%JE%%:I$\":Q\"\"JQ#$:U##ZA\"#ZU!$JA$$:E#$*A\"$ZU\"!*=!$Z1\"%*I#\":I#"
+ "$*I\"#ZI\"%:A$!:A\"\"Z9!#J=!!*=$#JI!#JA!#Z5!#Z5\"#*5\"$JA$&J5*%:5(%*E+"
+ "$:1!$*)#$:1!#Z-\"%:1$$:-#$9]!$)]#%)Y'#*!#\"YU\"#Y]\"$)]#$9Y!#YM\"#9I!"
+ "#YM#$I]($9U!$9]!#I]!%YM$#9I!$)Q$$)A##YA#$II%#99!#)9##99$#9A!\"I1!"
+ "\"I5!#I1%#91!\"9)#\"I-!!91(\"I!!!I9##9!!!Y!$#8]'#HY%$(]-#XU&%HU+%HQ%"
+ "#HY%#HM&\"XA#\"XA+\"XE##(I##HI%!X=$\"XA#\"XE\"\"H)!\"8-!\"X9\"!8-%\"H5\"\"X%%"
+ "!H!!!H!!\"7U$\"X!##7Q&\"H!\"\"7Q!!'I#\"7Y!\"WM!\"7=$\"'Y(!G=!!GA#\"GA$\"79$"
+ "!W)!\"7=#\"G)!\"'-#!W-$\"W5#\"75#\"'1#!G=!!W=!!'A%\"'E##7M%!7Y\"#7M%\"WM#"
+ "\"7E!\"GQ\"#W]$!WY\"#H!!#8!%$8!$\"8!!!H!!\"H!\"#H)##X-$\"H-!\"H5\"$X1%#(='"
+ "\"XI\"\"XM\"\"XA#$8E)#HE%!HQ!#(M##XE#%8M##XU!\"8U#%8Y!\"8Q!#HY%\"HY!$8Y\""
+ "#)%$#9)!\"I%!\"Y-\"#)-#\"Y%#$)='\"II$#)5#\"Y9\"\"Y9%$)='#Y=\"$)E##Y=&#9M!"
+ "$YE'#9E$#IQ!!9I(#)M#\"IU!#9U!\"YQ!$)M#%YM+$IM&%)Q$%J%*#I]!&*!!$:!!"
+ "#*!#&J%'#I]!$*)#\"J)!#J)!$J-%#Z-\"#J9!#J!!\"IY!$J5)&:5!#J5$&:9%%:9%"
+ "!*=!$*9#$*=#%*9#$Z=)$Z9\"$*A&%*=&#JE!$:A#\"ZA!#J9!$JE!#ZI\"!ZE!#:I'"
+ "%:=($JI!\"*I\"#*I\"$:I$$JM!%JM)%ZQ\"$:M#\"JM'$ZU%#J9!$JY$%ZI*%JI($JM!"
+ "%ZI*\"*E!#ZE%#JM!$J=%\"ZE!\"ZI!!:I\"#ZM!$*=\"&ZU-%ZQ*%:M(&:M!#ZU!$:I#"
+ "'Z]'%JU$#JI!#*I\"$J9%$Z=\"#ZI!$*I\"#*E\"$:I$$*I\"%JA%#*E\"#JA!#JA!\"ZA!"
+ "#JA$$*5&$Z=&%*='#J=!%*=&$*A\"#J9!!*9!%*5##Z5\"#J5!#J1!%ZA)%:1!#J)!"
+ "#J%!\"J)!$Z=\"$Z!#%*%'\"J%!\"Z)!$Z!#!J!#$*!#'I]$#II!$*!#$YA'%9Y%$9U!"
+ "%YM(#IE!$YM*#)I\"#YI\"!YI!$99%$9M$&I)(#9E!%)=\"$9A+#)=#$9A%#)1#\"I5!"
+ "\"I-!\"I-!\"))\"\"91#$)-'$)%$$9%##HY\"#)%#$8]%!HY!#(]!\"(]\"#HU%#(M#\"XE#"
+ "%XI/#XI!#(I$$(E'#(]!$8A)#H-%#X1%\"()#\"XA#!(9!\"X1#\"8-!\"()\"!H1!$(%("
+ "\"7Q(\"X!#\"X%#!H!!\"7U!#7Y\"\"7Q!\"GE\"\"7M!!'M&$GI%\"'E#\"'A#!G9!!W=\"!79\""
+ "!G!!#'!'\"')\"!G-!\"'-#\"'1\"\"G9\"!'5#\"'=#!W9\"\"GI$!G=*!GE!$']#\"7E$\"WI#"
+ "$7Q*\"7Q!#'M$#GY&\"WY#\"8!!\"X%(#8!%\"(!%!H%!#H)$\"8%!#(1$#(1##(9$!HE!"
+ "#H9#\"89!\"H9\"$(A%\"(A\"%(E&!XQ'$HM&!HQ!!XU$$8Q#!(Y#!)!!!8]%\"Y!%#8U'"
+ "#9!!$Y!$#Y)##Y)##9)$!)-!\"I1!!Y1!\"I-!#)I#%9%&!Y5$\"IE!#99$$)5$!9Q%"
+ "$9E\"$9A$$)=$&YI,%)9($)Y#%)A'\"9I#%)Q!$IU%$IQ\"#Z)\"#IY!$)Y#$I]&#9U!"
+ "#J!!$J-%$J!!#Z%\"$9U!#J)!$J1\"'J)$#J-!\"J-!#J=!$:1##Z1)#ZE%#J5!#J5%"
+ "\"J1!$JA!$*5\"%:)(#Z9\"$Z=&#*9\"#J=!\"ZQ$#JA!#JI!#J=!$:Q#$J=!$*E\"#JE!"
+ "&*E(#JA!#*E\"!ZQ!%:9($*I&#JI!#JE!!ZI!#ZU!$:E#\":I#$*M\"#JE!#ZI\"$JM!"
+ "#ZE\"#JM!$JA!%*I\"$JI%\"ZQ/&J=\"#ZE\"\"ZI!#JI!#JE!$*I\"%JM!#*E\"#*I\"#*I\""
+ "%*U\"$:Q$#JM!$:M#\"ZA$%*Q&#JE!%*A##JE!%JE-$ZA\"#JI!%:A$$ZA%#J1!!Z=!"
+ "#*A\"\"*9%#*1%#*-\"#Z1\"#*9\"#:)##:5#\"Z5!#*9&%J5)\"J1!$:-#\"*)\"\"J-!\"*%\""
+ "#Z)&$J1%#Z%\"%J-)\"J)!%J!\"#9Q!%)]!$*!#%)Y!#J)$#9U!!9U\"#YQ##9=$#IU\""
+ "#9M!#9M!!YM!#YA&!YE!\"IM!#YA#$)5$#Y=##9=$%I-'\"I5!$I5#\"IE!\"91&#91'"
+ "\"I!!\"I-!$8]\"#Y%&$)!!#91!#8]!$(Y($X]*\"XE#!XY!\"XQ\"!I!#!(Y!#HQ&#(M)"
+ "%H=.\"8I#!8Q%#HE&\"8A!#XA#\"H9\"\"(9%\"X5\"#(1&\"(1\"$X%%\"X-#\"()#\"7Q!\"X!#"
+ "$(!+\"'U#\"7Y$\"X)#!GU##WM'\"WQ#\"7Q##7I#\"WM#\"'A#!GA!\"WA%!G9!#'='\"')#"
+ "\"'!#!G1#\"W5%#'5$\"')!\"'1!\"'1'#'A'\"W5#!G9!!79\"!W5\"\"'A#\"'M#$'9)!GM!"
+ "\"7M!\"'Q##'U)#GY!\"7Y!#'Y$\"X%#\"8!!!7]%\"81!\"8!!!()!#(-'!(-!\"7]#\"X5#"
+ "#(9##(=##81\"\"81!#(A$#XE#!HQ!#HI%\"HI!#HM%\"HQ!!HU!\"8U!#(Q!\"8Y!\"8U#"
+ "\"8U!$9!%#I%#$9)%#9-!#9)!#9-!%8Y-$)1!#)1#$)A!#)9#\"I=!#Y9##YA##)=#"
+ "%)E!\"I=!$)A#')I\"$9Q%#II\"#IY!$)M$#)I##9Q!!IM#$)U#')U-\")Y\"$)Y#$9Y$"
+ "#J%!%)]'$*!#$9Y$#IY$#J%!$)]##Z%\"%:)%#J-!#J-!'*9!$J%&%:-%'*1!#Z1\""
+ "$Z-##Z-\"$J=%$*1#$*5##JA!$Z=&&*9$\"Z5!$Z=\"#Z5\"$Z=%#*A\"%*-'#JA!%ZA)"
+ "#ZA\"$ZA%$*I\"#Z9\"!ZE!!*I$#*M\"#JA!%*E\"!:5\"$JE(#Z5\"#*I\"$:E$%JM!%:E$"
+ "$:I#!:M%$JI!%JI!$JA!#JI!#ZQ!\"Z]!#J=!#ZU!$*=#$JI!#J=!#*=\"$JE%#*Q\""
+ "#JA!$JA!$JA$$:I##ZQ!#:E#$*=\"%JA!$*1##:Q##ZM%#ZA\"$JA%!ZE!#J9!\"*9\""
+ "#J1!\"Z9!&*-$#Z5\"#J9!%:5!$:1$#J-!%:1!\"J-!$:5$&*-%#Z1\"#J-!#J)!%J!&"
+ "$J%!#Z%%$J!&$YY#$J!\"%9U(\"Z!%%9Y%#J!!%)M!\"IU!$9U!#IM!&)Q,#)M\"#9Q!"
+ "\"IA!\"IM*%9U)\"YE\"#9I!$)A!#9A!$)9!%YA+#99$%IE##)5#\"I5!#)1#\"Y1\"!Y)!"
+ "$Y-(\"Y)\"$9%\"$)5!#H]\"\"I!!$H])#H]+&X]-\"8Y#\"XU\"\"XM\"\"8Q!!HI!#8M%#XM$"
+ "#XQ!#(A$!X5!\"89!\"8=!#X1&!H9&\"85!!H9!$X-##(-$#()!\"8!!\"8%!$8)$!G]!"
+ "$7Y$\"7Y!\"'E!!'M!\"7Q$$7Q$#'M$!GE!\"'M#\"75!!G=!#'I'\"'=%#'A'!W5\"\"'9%"
+ "\"&]!!FU#\"G%%\"'%#!'!##'-'!W5\"!G-!\"'5\"\"71$\"79$!G1!!'9%!W=!\"GE$\"'=!"
+ "!GI!#7E##7Q&\"GQ\"\"7U!!WY!#7Y%\"H)\"\"7]!\"8%!\"X%##H)#!H)!#85%#8=%\"H5!"
+ "\"85!#(=#\"(A%$XA\"\"8E!%(A!%(E)$HE'#8=$#(I$\"(I\"#9!!\"XM\"\"XU%#(U#\"XU("
+ "!XY$#8Y'\"8]!\"Y!\"%9%'$9)&$I)##))#$)-$#)1#&)-)!Y1'\"I-!!91\"#Y5&#)5#"
+ "#I=%%Y5(%)A%#Y5#$9M%$)E!$II&%)I(%)M('9M$#II!%)Q(\"YM!$)U#$YY&#9Q!"
+ "\"9]#!YY!#)]#'*!!%*!'#J!!%:)!%*%'#J)!#IY!&:)\"#J%!$:-!\"*-%#J-!$*)#"
+ "&Z-$#J1!#J1!#ZA!#*5%%J5%#J5!#Z5!#Z9\"%:9%#*A\"&*9+$:9$$ZE&#ZE\"#ZM!"
+ "$Z-&#J9!'J='#J=!$Z=\"#J=!%JM)$J=!#Z=!#JA!\"ZE!$*A#%*=#&:1)#J5!#JA!"
+ "$JA$$JI!$ZE\"#JE!\"ZE!&:=,#JE!'ZE+#Z=\"%ZM\"!ZA$$J1%!ZI$\"Z9!\"ZA!$ZM\""
+ "$JE!$ZE)#ZE!\"ZA!%*-'#JA!\"Z=!$J-%%*E#\"Z=!#J5%$*9##JA!&*9$$J9%#J5!"
+ "#9]#!:A\"#J9!\"J1!!Z%!\"ZA!#J-!\"Z)\"%Z9\"#J)!#J)!#Z)\"#J)!#J!!%:-!%*%'"
+ "\":!#$Z!#%*)'#9Q!&:!,$I]\"$Y]#\"IY!$)U##9U!#IE\"#IQ!%YM!!Y=!$9M(%)I("
+ "$)9$#IE!$II&$99\"$)E!#Y=#!)I'#Y)#!Y)!\"I9$#95$!)1!!)9!#9-!#)1##))#"
+ "#9)$#I%##9-!$HU'#)!#\"X]\"!H]##XQ#!H]&#(Y##XQ'\"XQ\"#HM#!(I##(=!\"8E!"
+ "%8E$$8A)\"89!\"X=#$X1#\"85!#X5$$H%(\"X1#\"8)!#()$\"H)\"!8!\"\"X%##7]\"$8%$"
+ "\"WY##WY'\"7Q!!GQ!\"WQ##7M%#7M%#'E$!GE#\"GA\"!WA\"\"W=(!'9!\"7I$\"71*#6]#"
+ "#V]&!VY$!W)\"#FY%\"G!%\"G)%#W1(!W%$\"W5#\"'1#\"W9$!G9!#'1$\"'A#!GA!\"'A#"
+ "#'E$#'=%!GM!$W]&#H%!\"7U!\"WU#!GY!$7]!!WU!\"7Y!\"X)#\"81!#H)!!(1&$']\""
+ "\"X1#$(-#\"X9#\"H=\"\"(='\"X=\"#HA\"#(A#\"XE\"\"8M!#H=&\"XM\"#(Q#$XQ!\"HQ!\"HU!"
+ "#)%#\"8Y##9%'$9!%#(Y!#9!!#9%!#I!\"\"I)!\"I9!#I-\"\"Y1%#)1#$Y5'#95$\"I5!"
+ "#)9##9E'#)A#$YI&#9I##Y=##YE#!YE!$)M#%)I(#9M!%)M!%9=%$)M##YQ\"$YE'"
+ "\"IQ!$YY#$9U!%)Y+#J1!#I]!#I]!#Z9\"!)]!#Z%\"#J)!$)Y#$:%!%:1%#J!!$:!!"
+ "%:-!'*))$:-$&J!'\"J1!$*1\"!*%$&:=%$J5!#J1!#J=!!*9!#J9!(:9&%Z1'#J9!"
+ "#ZI!#J9!\"*5\"#JA!$J9%#Z-\"$Z=&$:5$#JA!#ZE\"%*%##Z9\"$Z1&':A!\"Z9!%*Y'"
+ "$:Q##JA!\"ZA!$JA!#Z9!#JA!\":M\"#JE!#J9!#J9!&J=\"$:1!%J=)&*='#Z=\"$J=!"
+ "\"Z=$#Z=\"$JE!#J1!\"Z9!$J9%\"JA#$J9!#J5!%:)!$ZA%\"Z9!\"J5#%Z5*$Z5\"%:1)"
+ "#J1!$Z=&\"J1!\"*-!#Z)\"#J5!#J%!#J)!!*)!%Z)'!J!#\":!##I]!&)]$$I]&%Z!*"
+ "#Z%\"%)U'$IQ%%*!!%YU$$9Q%$)Q##IY!#9Q!#IE\"$Z%##II!#YM#\"YY\"#)U\"%Y9%"
+ "#I9\"$)1'\"I=!%YA+!)I!#)=#\"Y9\"\"I9!\")9\"\"I5!#)%#$Y1*$)--\"I-$\"I)!#))&"
+ "#(]!$(Y!%I!$!(U&\"HU!\"8Y!\"H]'#(U#\"Y-\"#X]##XM&\"XE\"#(I!#(E$\"XI\"\"X1#"
+ "\"HA!\"8E!\"8=!#89$#(5#\"H-%\"85&\"X9#\"X1#\"X)##(5$!(%!!X)$$(!#\"WY#\"7Y!"
+ "\"WU##7I%\"WQ#!'U!$'](#'Y$#'Q+\"'A,\"7E$$'9*!G=!\"7=$!'9!!'%!!G-!!G)!"
+ "!&]!#7!%\"VQ&!G!#!W-(\"&]%#'-&\"'-#\"'-#!W1$!'5!\"'=#\"'E%\"7E$!G=!!GI%"
+ "\"GA%#WY'\"'A!#'M!\"GQ\"#GE&#WQ%\"8!!#W]$!8%\"\"']%\"8!!\"8-!\"8)&\"X)\"\"(%#"
+ "\"XA&#H-##H9&\"X5\"#(5!$H=!\"X-\"\"XQ\"$8E##XU!#(I$\"8I!#HY%\"HQ!#8Y$#(Q#"
+ "$HU'#(Y##I!&#9-!$)!%#I!\"#X]##))#$)%!\"I)!#))#\"I!!\"X]\"#I1\"\"I1!#Y5&"
+ "!Y5!!Y9$#)5&!)=!\"I=!#YA#$I=&\"II!#9E!%9M%#YE##I9\"\"9I##II\"%)U$#YQ#"
+ "$9Q$$IM\"'9U#%)]'$Y]##9U!$9]$\"*!($I]%#Z)\"$9Q%#Y]\"%*5#&*%(%*!##J%!"
+ "%)]!\"J)!#*%&\"*-%#Z-\"#*9\"$J5!#Z-\"$J9%#J1!#:9&#J=!#J5!#J1!#ZE\"$Z5\""
+ "$*1##J5!$J=(#Z9!!*5!%*9##J9!!Z9!$J9!$Z5&&*9#%J)\"$Z9\"#J5!#*5\"$:=$"
+ "%*='#Z=\"#JA!#:9#$:M$#*A\"%JA)$JA!#J=!#J5!$*=\"$:=##ZA\"$*9#\"Z9!!Z=!"
+ "$J1%$*9#&J9)$*9\"%:=!%J)&#ZE!#J9!\"Z%\"$ZA\"$Z5&#Z5\"#J1!#J1!#Z1\"#Z1%"
+ "!:-\"$J1\"#J-!#J%!#J)!#J)!#J%!!9Y\"#J)!#J%!$Z%&#J!!$I]\"$)U##)]#$9]!"
+ "$I]%$*!##YQ\"#)Y\"\"YY!#I]!$IQ&#9U!$)Q#$)U#&IM(#9I!#IQ\"$YI&#9Q!#IA\""
+ "#)A##YA\"#II%$I=#!Y-!$Y9'\")=%\")5\"\"I=!$9A!%(]%$Y1!$I-&\"I%!#9%!$I%'"
+ "#I!&\"8Y!\"I)!\"H]*!HY#\"X]\"#HM&#XQ'#(U##HM#!HY!#(A#\"8Q!!HE&#HE(!(=#"
+ "!H=#\"8=!#85%\"85!\"85!#H)%#81%\"X1#\"X!!\"8)!\"H%!#8!'\"8=!#7]'\"X%##GY#"
+ "\"7]!\"GQ,\"7Q$\"GI#\"GA\"!GE#!G=!!'A!#WA%!'=#\"'9\"\"G9$#7E#!W-\"!G%!#'=$"
+ "\"G)#\"6U$!F]#!'1#\"6U$\"&]#!G)!\"7-$!G%!#G1\"#75#!G=!#G9!!W5\"#'=$!G9#"
+ "#'E'\"GI##'A$!GQ!$GI#!GE!\"GQ\"#WE\"!'Y!!W]!#(%$\"GU\"\"H!\"%(%*\"8%!\"89$"
+ "\"X!#!(5!$(1&$(5%#X)'#XE&\"81!\"XA&#HA#\"XE\"#(A$$8E)!XE'#(M##(M!#HQ&"
+ "!(Q$!(M#\"HU!#(U#$8Y\"#(]#\"8]!$)!$$H]&#9%!#Y9&!Y9!#)-##)-##I9%\"Y1\""
+ "#95$!)9!\"I5!\"I9!!Y9!\"Y=\"$I-&#I=\"#YA\"%9E\"&II(%II-%9A($II%\"IM!\"IA!"
+ "#)Q##IY!$)Q##IY!#I]!%YM$$IM\"%)]('9Y#$*!&%9Y%#I]!%:%%#J-!#IY!'*%("
+ "!:%\"%J))&*!!#J)!\":-\"!Z%!#J%!\"J1!#J-!\"J%!#Z5\"#ZA\"$*%#!:1%$:1$\"J-!"
+ "#J9!$JE%&*1$#J5!#*5\"\"Z5!$*5#$J5!$:5#%:5%#*5\"$:9$%*9#%:1!%:E$&*A+"
+ "#J9!\"*9\"#Z=!$J-\"$:M$#J9!\"ZA!&:5!#J-!%:9$#*1\"%*9##J1!%:5%$J%\"\"ZA!"
+ "$*=#%Z5*\":9*#J-!#ZQ!\"J-!#J1!\"J1!$:)!&*1!#J5!#JI!\"J)!$J9!#J-!$:%!"
+ "%J-%$*)#\"I]!$*-#$Z)\"$*%##Z-\"\"I]$$*!#\"IY!!Z%$#9U!!IU#\"I]!$)Y#$)]#"
+ "%*%'$I]%#9U!#)U%%IQ#$)U##9E!$9Q($)]##9U!$)1$%YI($)E!%IE&#YA##9A!"
+ "$91%#9=$%)I%'99/$Y5'$I1)#95$\"I)!!)-!\"I-!\"Y)%\"I1$$))'\"8U!#XY!$I!'"
+ "$(Q(#Y%$#(Y!#(I$#XQ#\"HU!!HU&#8U$$XM+#8M$#(M#\"XE\"!(E!\"85!!(A!#HI&"
+ "\"8=!\"X=\"$8-)\"X9\"\"H1\"\"8-!%X-,\"8)$!H5&$X%&#8!##']$\"H!!!X!\"$(!(\"WA#"
+ "#7Q'$7Q&\"WQ#\"W=!\"GQ\"!GE##GI!#G9)\"7=!!G=!\"WA!\"'1#\"G1$\"W%&#7-(!G%%"
+ "\"&Q!!VU\"#&Y%!&Y!#7!$\"G!%\"V]#\"7%$#G1)$'-+\"G=%\"'1\"!GA!!79\"\"GA'\"W9#"
+ "#'A$\"7=$!GE!#G-'#7A#\"7M!#WQ'\"WU##GU&$8!!\"GY\"%G]'\"8)!\"X!#\"X!#\"'U\""
+ "\"8-!#H-&\"X1\"\"X1#%(1,#85%\"89!#89%\"X=#\"XI\"!(A!\"89!#(9!#HQ%#XI&\"8M!"
+ "#(Y##)!##XQ'\"HI!!8=\"$Y)$#)%#\"8Q##HY%$Y!%\"Y%\"%I-!\"I1!!Y!!#I)%\"9-#"
+ "\")9\"#)1##)5#!YA!#99!%Y9$$)E&$9=(%9=#$9A$\")E%%)E$#9E!#YE##9Q!#YE#"
+ "#9M!$Y='#9Q!#IY!$9Y'$YY&$9U$#IU\"$YU'$YM&!IU#\"I]!#YY\"$Z)&\"IY!$)]#"
+ "#YQ\"%:-)$*!'!*%!!YY!$*)&\"J1!$J-!$:-!#J-!%*!!#*-\"$*-#!)]!!*)!#Z-\""
+ "$J9!#J!!#Z5\"#J1!#J1!&Z1'\"J1!#Z5\"$Z1&\"J1!%Z1*\"*=\"$*=#$J5!#*5\"$J5!"
+ "$:1!#J-$#Z5!$J5!\"Z5!#Z1\"#*-\"#J=!#J1!%*9&&*5($J5!$:5$#J5(#J)!&:1%"
+ "#Z5!%Z)#%*9#$J5%$:5#$Z=%$:%$#Z)\"#*)&#*9\"#*-\"#J-!$:)$#Z)\"#J9!$)]#"
+ "&*%!#Z%\"$:%!\"J%!$II&\"YY!$Z!&&)],\"Z5!$*!#$Y]##J-!#J)!$9Y$%IU#%I])"
+ "#J%!$Y]&$)E!#9M!$YM&#9M!#YM#!)I!$IM%#YE\"#IE\"#9E!%9A\"#I=!$I5#\"Y9\""
+ "#I=!%YM+%)9%\"Y5\"#)9&\"9-)#95!#Y1##I)%$Y)!!)-!$9!\"#8]!#H]\"\"9!$!Y!!"
+ "#9!!!(I!#(U#\"XU(#(Q#!HI#!8A\"\"HE$!(I!#HE&\"8=!\"HA!$8A)\"8=!\"X=#\"X9%"
+ "!(9)\"H1\"%H5&$81!$8%)#X)'#8)\"#']$$H%*\"X)#\"7]!#G]##'Y$#H)!\"WY##GY&"
+ "#GQ$\"7M!!7I'\"GI#!'E*!WA+$'A#!W5\"\"'I!\"G=%!75\"\"W=#\"'=\"!W-$!G-%\"7%$"
+ "\"FU%!FM!!6Y\"\"&Y#!VU&!'!!!F]!\"V](\"G)\"#7)#!G5%\"')%!'1!!W5$!'9##W=#"
+ "\"'=\"!G5!\"7A!#WE%\"WM#\"GE#\"7M!\"WM#\"GM\"\"WQ!!GY#\"WY#\"81!$8!!\"GU\"!X%\""
+ "#(%$#()!\"81!$(9'\"X-&\"H1\"#89$\"H5!%HM(#H=\"#8=%$H9*#8A$\"XE\"$8I&$(U'"
+ "#XM!#(=#\"HY!#(]##H]\"$(U$\"8Y##)!#\"9!##(]#&)!#\"(U\"#Y%$#))##91$!Y)$"
+ "#9)!\"I)!#95$\"Y5\"!)5!#Y9&$)1'%9A\"#)5#$YI&\")A%$)A##YI\"#9M!#)E##9=!"
+ "$)Y##YA#\"9]##YM\"$)Q$#YA#$*!#$YY#&:!,$9U$&)M%$9Q(#YU\"$Z%#$9U!\"Y]\""
+ "#Z%%\":)#$)Q'!Z%!%*%'&Z!/#*%\"%:%($*%##YY\"#I]!%Z1*$:-#&*1(\"Z5!%J-%"
+ "%:)!$:1!#J5!$*)##J!!&*-+$J5%'*-!#J!!$J9%#*1\"#J1!!Z9!$:-!%J1)\"I]!"
+ "#*1\"$:%!#J5!\"*)\"':-&#Z1\"#Z1%%:-!#J5!#Z1\"#J-!#J-!%J1%%:5$$J-%$Z5&"
+ "$:=#$:-!$JA!$Z1\"$J)%$J-\"$:1#$J)%#Z)%%:1!$J%\"!Z)!$:)$#I]!#J!'$)U#"
+ "$J1%%J!&#:!#$:!!%J%*$)Q$%J!)#Y]\"&9U\"$*%##9M&#)M#%:!$#9Q!#9I##9U!"
+ "$)E#&9I'#9Q'#YE#&YI%\"9M#$IU\"%)I$!YI!$9E%\"Y-\"$)I$%IA'\"Y1\"%))\"\"I9!"
+ "#9)!$)Q'\"Y5%#95!!I=#\")-%$Y9!#))#\"I1!#X]##Y%##I!\"%9!'#8Y$\"Y5\"#8Y$"
+ "#8]$!HU!#HU%#(Q#$HQ##XU##XM!\"8I!#8M$#XA&$(A\"#(Q#\"X5\"\"HE)\"X9#\"HI!"
+ "%(='$(-(\"H%\"\"H-!\"X-&#(!$\"X1\"#H)$\"8!!\"X!#\"WU#$'Y#!H%#\"7U&$'Q&#'E$"
+ "#GM$\"'I!!GI#\"'I!\"W9%\"'A#!75\"#'9$#G9$#W5(!G1!!G1!!G-!\"G%\"#F])\"G1%"
+ "\"6Y$!&I!!&Q#\"&Y#!6U$\"6M\"$&U\"\"7)$\"7)$#G='!W%\"\"W-&\"'1\"!G1!\"'A#\"75#"
+ "\"75$\"'-#\"'A##7A#\"WE#!GI#!WM\"\"7U(\"WY#\"GI\"%8!(\"W]##GY$#H!!\"7]!\"H!\""
+ "\"X9(\"G]\"\"H)\"#H)##(-!\"81!\"8)!#89%\"X9#%89'#8A$#(=$\"(E\"$8A)\"8U!#(M!"
+ "$8I#\"HI$\"XY\"#(Y##(Q!\"8Q!\"HI!#8Y!\"I)!#8]$#8]$\"I!!#9!\"$Y%($I1&#95!"
+ "#9)$$I1)$Y!!\"9)##Y1&\")1(\"I9!\")E\"#)9##I1\"$)9!$)9'%I9'#YA\"#99!#9A!"
+ "$9E%$YE'$)I$&)I%#YM##)U\"$9M$!)E!!IM##9Q!!YY!$9U$$Z)##)Q#$YY'%J%&"
+ "!YE!%)U!\"IY#$IQ\"#IY$%IY*$J1)$:1##J%!&Z-$%J!&%J%*#J%!$J%!#J!!\"J%!"
+ "#J)$#J%!#Y]\"#J-!&:)\"#:)##J)!%*)'$J9%%:-!$Z-&$*5\"\"Z%!\"*-\"\"J1!%Z5&"
+ "%Z-&\"J)!#*%#%:5%#J)!$:-##J1!$*-#'Z)(\"Z5!#Z%\"\"J-!#Z1\"#Z5\"#J-!#J5!"
+ "%J!##I]!#J1$$:)$%Z)##J)!%*-#$*1\"!:A\"$9]$$:9$$:%$$)Y##IU!$*)##J!!"
+ "#)U#&*%+$Y]'#Z%&%9U(\"9Y&#9Q!$YU#&9U-$)I!\")Y($IU%$)M$&IQ$#9M!#)=#"
+ "$)Q$!)1!#95!$)I#\"9I#$YA&$IE\"#9E!#9Q!#YA#%9=%#Y9##)9##I1\"$)1$\"I=!"
+ "#)5##91!#Y1#\"I-!#91$#Y)#$9%&\"I-!$9%#\"I5$#9!!\"Y!\"\"8]#\"H]!$(Y(\"(U%"
+ "!HM!$(I%#(U##XU#$(U(#(E$\"HI$\"89!\"8Q!\"(A\"\"XA#\"XA#\"XA#\"H1\"\"X1##H9&"
+ "\"(1#!H)##81\"\"X%##X1'\"G]\"\"']%\"X%!$7]!\"G]!\"X)\"#'Y$\"7Q!\"GE\"$'U#\"'M#"
+ "\"'E!#WI'\"'E!\"'Q#!W=\"!G=!!'=#!W=\"!W1!\"'5\"$'1&\"G-!#W)%#G))\"F]#\"&]'"
+ "\"6M&\"6M\"\"6Y&!VU\"\"G!%!FM!\"W!&\"6]&$7)#\"'%#!'5!!W)+!7)\"\"'=#!W1$!75$"
+ "!G9!\"'9\"#'A%#GI)!7Q\"!'I!#'U$\"'Q\"\"'I!\"GI\"$'I%$'U!#7Q\"$'Y(#7]\"\"GY\""
+ "$8!!#(!$\"8%!$X!##'Y$\"H!\"!(1!\"81!\"X5\"#X9!$H9'#H9&\"8=!#XA##XE*\"8E!"
+ "\"8I!#HI&#XE##HM%\"8M!\"XI\"\"HU!#XY#\"8U!#9!\"$H])#X]&\"8]!#9%!!XY!#I!#"
+ "#9%!$))!!Y)'$Y-$#95!\"9-#\"I1!#Y!&!)=$#I=%\"YI%!I5&$Y=*\"YE\"%91&#9E!"
+ "#YM#$IA&%9=#%YI$$)Q#!YA!%IE#\"YQ%$IE%$YY##)M#!YU!#YM#$IU%\"IU!%9M\""
+ "\")U(%IY#$9Q%&:!&$9Y!$IY&#IY!!Z)!$:%!%*!#\")]%\"J!!&9U##J!!$I]%!Z%!"
+ "$*%#%:%!%*%'\"9Y##Z%%$)U##J)!$*1\"#J)!#Y]\"%J!\"#J)!%*-$\"Z)\"%:))#J)!"
+ "#J!!&:)!#*)\"$:5##J%!!J)#\"*%\"#J1!\"J%!$:!$$:1##J)!$J!\"%Z5*&:-\"%*%'"
+ "!*%!#J%!$*%'&J%##Z!\"%*1#$*)##J!!#J!!#J!!$:%!$*!##J!!&9Y&$YY'#J%!"
+ "\"I]!!)Y$$)I$%9U%$)Y#\"YY\"$YQ#\"IU!%)U!$)I&#9Q!\"9Q##YM#$)Q##YM&#9M$"
+ "$YI$$9I$\"IA!%YE+#)A#$9=%&)E,#)M#$)=$#YA&!YE!\"I5!\"I=!\"I1$\"Y-\"\"I1!"
+ "#)!##I)%#)-#!I-#$9))!95\"%)-&$XQ(\"Y!##Y!'$H]##8]$!(M!$XQ$$8U##8E%"
+ "!(Y!#8Y$#(I#\"XQ\"\"8Q!#(I!\"XE#%8I!\"H=!#8A%#(9!\"X5##(-$#(9##(=!#(1$"
+ "#X1'%8E!\"8!!#()$#H%##H%&\"X)\"\"8!!#()!!X!$\"WU#$'Q!\"GI#\"WY#$7M)\"7M!"
+ "\"7A#\"'E!!79\"#'A'#W9'$79)!G5##'5\"\"'1#!75\"\"'-\"\"75$\"V]&\"'1\"\"G%%!W-\""
+ "#6I&!FU!!&E!!G!!!VU\"!VY\"!VY\"!FY#!G1!!G!!!W%$#7)'!VU\"\"G)%$'-$#71("
+ "\"GA'!G=#!GI!\"7A!#WY$!GA!$WE%!GI##'='\"7M!!'Q#\"7Q!\"7U!#WU%\"WY#\"G]\""
+ "#8%\"\"X%#\"7Y!#7U%#(1$!H)!\"H-\"$H-'\"H1!#(5!!H!!\"X5\"\"85!#(=#!89%!XA!"
+ "\"X9#\"HA$#(I$#HI%#(M#\"XM\"!XE)#8U$\"8Y!#(Y#\"XU\"#(U#$)%'#8Y'\"Y!#%(]\""
+ "$Y)'$Y%'#I)%#I)&#Y)&\"I-!$9=(%99&\"95#\"Y1\"\"I5!#)-#\"Y5\"#I9%\"Y9\"#)9#"
+ "!Y=!$)5$$)A$#IA\"%YQ*&)M,%IE##YI\"#9A!$YM#$YM'$YM'$9Y!#YU&\"IM!\"YY!"
+ "$)U#%II*#9Y'%)I$!)U$!Z!!$Z!\"\"IY!!Y]!!:!\"#9]'$9U$$Z-\"\"I]!$9Y($9]("
+ "':)1$Z!#$IY&#*!#!Y]!$J!\"$9]$$J%\"%9]!&YU!$Z!&$:%!$)]#%J%&#I]$$*%#"
+ "\":!\"#J%!!*%!$:%!%:!%$:%!&J).$:%$#Z%\"%YY+#J%$\":)##YQ\"#J%!#9U!#:%#"
+ "#J!!$Z!'#Z!\"%:%!$Y]'%:%!#Z!\"!Y]!$)]#&I]+$J-%$I]&#I]!$Z)##IU\"#9Q!"
+ "#YY\"$)]#$)U##9U!#IY!#9U!$YU#!YQ!#YI%%YU!%)Q$#YQ#\"IM!$YQ*$)E!$YI$"
+ "\"I=$%I9*#95!$Y1$#I=\"\"IA$!)=!\"95&!Y1!#I9%\"9=#\")5%#)9##95$%I1!#Y%&"
+ "!)-$#9%!#Y)&\"I5$#I%#!XY!#8U!\"(U\"$(Q'\"X]%\"8]!#8M$$I!)\"HQ!#(U#!XM$"
+ "\"XE\"#(M##(M&#(I#!(=!\"HQ!#HA%#8I$#(=#$(='$(9\"\"89#!H9#$85&$8=!!H-#"
+ "#X)'\"8-#$(9(#H%&\"8)!\"X!#\"G]%#WY%\"GY\"!GQ!\"7Y##'Y!\"GQ\"\"WM#\"WI!\"GI#"
+ "\"WA&!W5!\"'E#!W1!\"79!$W='#W5&\"G1$\"G)\"\"&Y#\"7)$!W%&#6U$\"G!#\"'%#\"'!*"
+ "!FM%\"6I\"!VM\"!FQ%!6U\"!&U#\"6Y$\"G)*!F]!!7%\"!G1#\"W%&!G!!\"G-#\"'5!!7%\""
+ "\"71\"\"G=%\"79#\"'9\"!'=##'='!GA!\"GM\"!'I#!WI!!'Q!\"GM%\"WQ#\"WM#!GI!\"7]!"
+ "\"G]$#'Y$$W])\"X-\"#(-$#X)'#']$\"8-!!(-!!85\"\"(1%\"85!$X1#\"8=!#81\"\"X5#"
+ "#(9#!XA!\"HE!$H=)\"(Y\"\"(5\"#8M%\"8M!#(U#$(U%#Y!$#(U#!HY#\"X]\"#8]$\"X]\""
+ "\"Y!#$XU'$95%#9!%\"Y!##(]&$9!##)9##I%##91!\"Y1\"#95$\"I5!#Y)#\")5%\"IA!"
+ "\"IA!$9M(#YU&%I=+#IA%$9=%#I=!#YE##9E!\"9A#$9]$#YE\"\"YQ(#Y=##9E!#9U!"
+ "(:%'#YM#&J--$Y]##9Q!%)E$#YU\"#9M!$YI&#IY!$9]'#)Y#&9Y&\"IQ!$9U!$Y]'"
+ "#I]!$*!*%I]&#)]#&I]##I]!!IQ##J%!#J!!#Y]\"$*1##YM#!J!'$9M!$:%$$J!%"
+ "$:5$\"IU!#J!!$*!#\"Z-%$:%!#*!##J!!$)U#$Z!&$Z%&#Z%&\"IQ!#I]!$Z!'$Z)#"
+ "#J5!#Y]%$IU\"$*!##IY!#J-!%)Y'%9M\"&:%&#I]!\"9M#$9Y!$YY&#IY!$9U!#Z!\""
+ "$)U#%YU##YQ##YE#$)Q$$9M%#IM$#9M!#9=!$)M$\"IE!!YM!#9I!$)E!$YA!#99!"
+ "!IA##YM#$)E!\"9=#\"I=!\"Y=\"\"YE\"\"Y)\"!Y1!$)5!$91%\"91#%)1(#Y-&\"I-!#I5%"
+ "\"8]!\"Y)\"\"Y%\"#I%\"%X]%$)%%#H]\"#HM&$(Y$\"8Q&#8Y$\"8U!\"8U#!HE#\"8Q!#8M%"
+ "#(M#!HU!#XI$$(I$#8E$\"XA\"\"8=!\"(=%$81$\"X9#!H1!\"H5\"#(9##(1$\"8-$\"81!"
+ "#H1#\"H%\"\"G]\"#8%%#H-&#(!$\"W]#!'U!\"G]!\"'E!$WM$$'U&#W=(\"GU\"#GQ!\"WE#"
+ "\"7=$!7A'!'9!!G-!!7-'!75$!W1!!')!\"'-#!W1\"#G%%#G!\"\"G%)!G!!\"FY%\"&]!"
+ "!&Q!!&Y#!VM$#6M%!FQ#\"6]#!FU##FY'!G!#!FQ#$'))!'%!!'!#!G%!!75$!G1!"
+ "\"W1$!W1!!'-!#GM)#'=%!GE!!GA!!'I#!GE!!GE%\"'I!#'E\"#7Q%%GQ'\"'U\"$GU+"
+ "!GY!\"'I\"\"8!!\"X!!!'U!\"8%##(!'#()$$()#$(-#\"X9\"\"(1\"\"X5\"\"X5#\"8A!\"85!"
+ "\"89!$81)\"8I!#8E%$HE'#(A#$8E##(M#$HM&$8Q#\"XU\"!(Y&\"8Y!#8U$\"8Q#\"I!\""
+ "$H])#)!##8]$$)%$#9%!#I%\"%I)(!Y1!!Y)!#Y)&!)5!\"I)!#Y-#\"I1!\"9=##Y5&"
+ "#95!#))##YE#\"9=##Y=#&)-##YQ\"$)1$!Y='#9=!#YE##YA#$YM'#9I!#9A!%)E!"
+ "\"IA!#IM!%)M(#YM#$IQ%$)Y##)Q#$IY%$9M$#J)!$)U#$IQ\"$)U##9Q##IY!%9I&"
+ "\"IY#$)Y#$9Y$$)Y#%YY'&)]!$Y]*$YY#!Z!!#9Y#$9]$#I]!#I]!#Z!&#Y]\"&:%&"
+ "$*!#$)U#$:)!\"Z)!#)]##9U!#YQ%\"YY!%9]%#I]!%Z%#$9]$%Y]#%)M$#J)!#J)!"
+ "&Y]!#9]$#IY!\"IY!$YY#$I]%%*%$%IU#%IQ#!Y]!!)U!$9U!$IQ%$9U$#YY\"&YY!"
+ "$YQ'#II\"#9I!#9M!$)I$&II!#IQ!$II#$)I$\"IE!#Y=#$IA##IA!$)E##Y-#(9Q+"
+ "%95)$I5&\"95#%I5.#I9%#)=#\"I!!\"I5'\"I1!\")-\"!)-!#91!#I!&\"I1!$9)(#)9#"
+ "\"I-!$9%#$I%&$(Y'\"Y%&\"XY\"\"H]!\"HY!\"H]!#HU%&HU)!HQ!#(I##(Q#!HI)\"8Q!"
+ "#(I&$8I##(A#\"H9!#(E#\"8A!!H%!#81%#X='$(%%\"85!\"X1##X1$$(-%#H5)!H1!"
+ "\"7Y!\"81!\"WY!\"H!$#8-\"#8!%$'U!!7I\"\"G]$\"7M!#'Y$#'A!#GM&\"WM#\"'9%\"WE%"
+ "\"'M\"!GA#\"W9##G5&\"'E#!GA!\"G1'\"75!!'%!#G)$!7-\"\"'!#!&]#\"&]!!6]\"#FY'"
+ "!FM#!6Y$!6M\"!G)!!&Q!!7%&!FU!\"&U#\"VY&\"&]#!FY#\"6]$\"')%!G!!\"W)&#75#"
+ "\"7%$\"7-&\"'1#!W=(\"WI!!G1!!GA!\"GA%#'=\"\"'=#\"'E!\"7A!\"WY!\"WM#\"X%##'U+"
+ "!GU%\"WY#\"WU#\"G]\"%H!,#8-\"#H)!$8!!$G]%%8)%%H-$#(-$\"X5\"\"X5##(-$#X5!"
+ "$(9\"$(=\"\"89!!H5##XE&\"8A!$XE+%(U&\"XM%\"8I#\"XM\"%)!,!HM##HM\"#(Y#$Y%'"
+ "#9)$#(5$#(U#!8Y\"$(Y$%8Y#&Y)$#I%#\"Y1(\"Y)\"#I)\"#)9#\"Y5\"$Y9!#I1%\"Y)\""
+ "#)5#\"I1$%99##)9##9=$#9-!\"9=#!Y=!#9=!\"9A#$)A*$IA##Y5#\"IQ!!YI!#YE\""
+ "$9I!$IA&$9Y!%9M\"$91%#9M!#YE\"#9U!#9Y#$IQ&#IQ\"#)U#&)Q%$YQ#%)]('YU&"
+ "\"IY!%)U'$J)%%IU)#IE%$9Y$$9Y$$)Y#%IY##9Q!#9Q!\"9Y##IY!$YY##YY)$YY&"
+ "$)Y#%9U)\"I]##9I!$9]!&)Y%#)Y#%)Q'#)Y&$I](#YU\"#IY!&IY$$)]##J!!#)Y#"
+ "$)U#(9]+&9U&$IY\"#9U!!)U!$YU&\"YU!&9U\"$9Q%#9I!$:%$$9Y$%9M%!YI!%IQ*"
+ "%II#$IQ\"#IM%')Q*&)Q($)I#!YQ$&I=!$)9$#YI\"#99!%9=%$)A$\"IA!$Y=$!)='"
+ "\"I9!#)9#\"99##)=##9)!\"I5!%I1(\"I-!#I)&\"Y1%#9%$#)-#\"9)#\"Y%#\"(]\"#I%#"
+ "%(])$XQ(#(Y!#9!$\"Y1\"\"Y!##XY##(Y#!HU!$Y%($8Q)$HY##(A!#(M#\"HA\"\"8M&"
+ "$(9(#HM&!HA&#XA'\"HA!#(=!\"(5#$(1#\"H5$\"85!\"X9%\"X-#\"X%#!X!\"\"X!#$X%+"
+ "\"H%!!(!!#']&\"W]!$7Y'#WY!\"'U\"\"GM\"#7Q%$WM&#'A$#7I#\"7E#\"'E!!WA$!W9\""
+ "!G=!\"79)\"79$\"75$!71\"\"'%#\"G!!\"W)&!V]\"\"G)%!G1!!7!\"\"FM!!&U#!FU%!VU\""
+ "\"FM%\"FM'!6M&\"&I%!FM#\"VU&!FQ)\"FU%!FU#\"6U$\"&Q!\"'!\"#&]'!G!%\"'%\"#79!"
+ "!G)!!G-%#G1)!G)!#79'\"71$#79%\"'I#\"WE!#W5'\"WE&\"'E\"#'Q$\"7M!\"GM'\"7Q$"
+ "#'U$$8))!GI#\"WM#\"GY\"\"H%!!GY!$H!(%(5'\"8%!\"H)\"\"(%'#8-%$81&#H1##H5&"
+ "$(1#\"H9'$H9!#8=%\"X=%#H9&$H1'#(I!\"(I\"#(I!#XY#\"8M##HQ%#8U$\"8U!#(U#"
+ "#(I#\"HY$\"HQ!\"HY!#(]!\"I!\"\"Y%&\"8U!&)5&#9-!$I%'$Y%$#))##)1#\"I1!$)5!"
+ "\"I1!#)5##)1##)A#\"Y5\"\"I9$$I-'&)90#)-##)1##9I#!YA!\"Y1\"#IE!$)9$\"9A#"
+ "#Y=#&)I,#9U!$)E!\"IM$\"II!%9A)#)A#$)M$&9I'$)E!#YM\"%)M$%IQ#$IU%#YQ#"
+ "#YQ\"!)A!$)A$$9Q!\"Z%!%)U($)U#\"IU!#IY!$Y]#$)]##)M##9I!\")U\"$9U$#YM#"
+ "%)U$%)Y'#)M#\")U\"$Y]'$)U#%IU'$9U$$I])%9U\"#9M!$9Q!$)]##)Q#%YU#$)U#"
+ "$*!&\"YU\"$9Y$$9Q%$IM&#YQ\"#IU!$YQ#$YM&$)M##9A!$9Q!%9Q%&)M)#9A!%)I!"
+ "$9Y!&IM$#)M#$9M!$9I$#)M#$)E$#91!#YA\"#IA!\"Y-\"\"9=##)5#\")5\"#)5#\"I9!"
+ "#)E#%9=-#I9\"#I=%#)I#\"Y9\"$I)*#I-%#Y1##Y-&\"Y-\"$Y!.#HY\"#91!$X]!#I!\""
+ "#9!!#8Q$#(]#$8]%#8]!$8M#\"8U&!)!$!HI!#HQ%#(M#\"XI\"!HA!\"XE#\"XE#$8E\""
+ "#8A$%8A$\"81!\"8=!#H9&#X9$\"(5\"#85%\"(5#\"(1\"\"X-#\"X1%$X)##(%$\"8!$\"G]$"
+ "\"(!#\"7]!\"WY#\"W]##(!$!GI%$GQ*\"'I\"#GM&$7A%#WE\"\"G=#\"7M)\"'A#!'A#\"'=#"
+ "\"G1-\"W=&!G=%\"'1\"!W1\"!')#\"G1$\"G%!\"7%!!FY#!W!\"#&]%!V]\"\"F]%\"&U#!'!!"
+ "!6]\"#&M$!6Y\"!6I\"\"6M$\"&M#\"&M#\"6U$\"F]+!FY!!FY&#'!'!F]!#&U%\"'%#!'1#"
+ "!G)'\"G)$\"'1#\"G)#\"'9#\"'1#!G=!!79\"!G1#\"'E#\"'A#\"7I##7A'\"WI#$'I#!'I!"
+ "$'Q!!G=!#X%!\"GQ\"#WQ\"\"W]##'Y$!']$\"'Y%#X%$\"X)#\"8)&#X)'$(!(!(%$\"X%\""
+ "\"XE\"\"X5##(5#\"X9#\"X9##HA#\"XA#\"X5\"\"XE#\"(M%\"XE\"$HM'\"XM\"!HY!\"8M##HU\""
+ "#(M!#(M#!HU!#(]##I%\"\"(](\"9!##H]%#Y%$$)!$#I%#$)-!$9)\"#)%##))#\"95&"
+ "$9)(\"I9!\"Y9\"\"IM'\"I1!\"I5!\"I5!#)5##)1#\"I9!#Y9&\"I-!\"I=!#9A$\")=\"$IQ&"
+ "#YA##9I$$)9!$9E%#YI#$9=%#9M!$)E#$YM#$9A%&)M\"$9M$#)M#$)U#!II&$YQ#"
+ "$YQ'$YU'#99!$9M!#IU!$)U##)M#$9Q$#9Q$%IY'#9M!$)E##9Q!#)Q#$)]#%9M)"
+ "'*!&!YE!#Y]\"%)E(#9Q!$9Q!&YQ/%YQ'$9Q$%9U)#9U!%*!!$IQ\"$YU&$YQ#$9E!"
+ "$YE'!IY##IY!$9A%$YM&$9I(#9M!$I])$)I#&IM+#Y9#$YE&#9I!$II)$II%#9A!"
+ "\"YE%$9E%$9E(%9E)%YE$&)E,$9A'#9A!%)=(#Y=#%IM##)A#\"IE!'95(#I=%#Y=&"
+ "\"I5!$)5$!Y9$#91$#)1#%)1+!Y1$\"Y-\"#9%$\"I)$&(]$!9%($9%##I%#$I%'#(]!"
+ "!XM$#X]&\"XQ\"&8M\"!(U&#8U'$HU)#(M##(]#%(M&!XM'\"HA!#(M#!(Q!\"XQ\"\"8A!"
+ "\"HA$\"XE##89%#(5!#()$#(A#!H-%#(1#\"81!$(-#!X)!\"()#\"X%#!H%#$X!$!WM\""
+ "#8!$#8!'#'Y$#7Y#!'M#\"WI!#']$\"WM##'M$\"'E\"#7M#!'I&\"GE$\"G=%\"'=#\"G9$"
+ "\"W5##7!#\"'1#\"79\"!'-!!G%#\"7!$!G1!\"W1&\"&]\"!VU\"!7!\"!FU#\"&]#!FU!\"&Y#"
+ "\"FM'!FM#!6U'!FM#!FU#!FQ#\"FQ%\"VM#!&Q#!FU#\"6E$\"6U!!'%!\"')#\"&]\"#')\""
+ "#'%'\"W9%\"G)%!7-\"$7-(\"'1\"\"75#!W1$\"G='!G5#\"7Q!!GE!#7E(\"GE\"!GI!#GI&"
+ "!'Q&#GM$#'Q$$']%\"7Q!#7U#\"8!!#'Y$!H!#$(!+#()!#W]%%(!(#()&\"H)\"!H-#"
+ "\"X-\"\"X1\"\"H5%\"XE#\"X9##H-%\"X=\"#(E$#8M$#H1##8I$#H9\"\"XI\"\"XY\"#HU%#HM#"
+ "#XQ!$HU&\"XQ\"#Y!'\"HU!\"I5!#Y-#$)!'\"XY\"#9%$\"Y!#%Y!)%(](#8]$\"I)!\"I-!"
+ "$)-'#I!%#99!\"Y9\"#9-$#91!\"I1!\"I1!\"I5!%)9!\"I)!$YA!\"I=!$I9&#I=!#I=!"
+ "#9I$%)-+&95'#95!#9A!$9A%#9A!$II##9E!&)E,&YI)#Y9#$YE'$9I$$YQ##YM#"
+ "&)Y!$YI#$9Y$%)M!!II&$IM%$)U#%9U)$)U#%IQ&#9M#$:!!#)M#\"IM!#)I#!YM!"
+ "$)U##IQ\"'IE)%IU&#9I!$9Q$#)U##YY\"$II#%IM##)M\"$9M$&IM!#9M##IM\"#IM!"
+ "#9I!#YM##9U#%)M($YI'%YI$#YE%$)M$#YI##)I##9M!&)E%#9A!$II##Y=\"#IY!"
+ "$II##9I!%YE!%)E!\"Y9%$)5!$9=(\"Y1%\"Y9%\"9=#$)9!\"I9$\"95#\"I9!!)!!#99$"
+ "#(]##I9%\"9-#$Y!!!Y%!$9-\"$I-#\"Y-\"$8]%$Y!!#9!!#X]#$8Y\"#(U!$Y!$!HQ!"
+ "$HY*\"XY\"$8U\"%HU($XQ$#HQ)#(U##(I!#8A$!HI!\"XI\"\"XQ\"%(M\"#(M##HE&%89!"
+ "\"8A#$(9%\"X1##X5$#X1&#(1$!H=#\"X-##(-!!X9$\"8)!\"X%#\"8%!#H!!\"X%#\"H!!"
+ "\"GY\"\"WY##7M%!GE!#'M$\"X!#\"G=)\"'=\"\"GE\"!GE!\"7E##W5%$'E##'A)#G1)!G9!"
+ "#G9(\"W9#!W1$#W-&!G-!!VY\"\"'%#\"W1!\"W!$!FY!!F]!\"'!)\"FY##&U%\"6Q&#F9'"
+ "";
diff --git a/hacks/glx/boxed.man b/hacks/glx/boxed.man
new file mode 100644
index 0000000..4233446
--- /dev/null
+++ b/hacks/glx/boxed.man
@@ -0,0 +1,56 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+boxed - draws a box full of 3D bouncing balls that explode.
+.SH SYNOPSIS
+.B boxed
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Draws a box full of 3D bouncing balls that explode.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Sander van Grieken. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Sander van Grieken.
diff --git a/hacks/glx/bubble3d.c b/hacks/glx/bubble3d.c
new file mode 100644
index 0000000..9cd2afc
--- /dev/null
+++ b/hacks/glx/bubble3d.c
@@ -0,0 +1,281 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* bubble3d.c - 3D bubbles */
+
+#if 0
+static const char sccsid[] = "@(#)bubble3d.c 4.11 98/06/16 xlockmore";
+#endif
+
+/*-
+ * BUBBLE3D (C) 1998 Richard W.M. Jones.
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 16-Jun-98: Written.
+ *
+ * bubble.c: This code is responsible for creating and managing
+ * bubbles over their lifetime.
+ * The bubbles may be drawn inside out.
+ */
+
+#include "bubble3d.h"
+
+typedef struct bubble {
+ GLfloat *contributions; /* List of contributions from each
+ * nudge to each vertex. This list has
+ * length nr_vertices * nr_nudge_axes.
+ */
+ GLfloat x, y, z; /* (x,y,z) location of the bubble. */
+ GLfloat scale; /* Scaling factor applied to bubble. */
+ GLfloat y_incr, scale_incr; /* Change in y and scale each frame. */
+ GLfloat rotx, roty, rotz; /* Current rotation. */
+ GLfloat rotx_incr, roty_incr, rotz_incr; /* Amount by which we increase
+ * rotation each step.
+ */
+ GLfloat *nudge_angle; /* Current angle (radians) of each
+ * nudge. This list has length nr_nudge_axes.
+ */
+ GLfloat *nudge_angle_incr; /* Amount by which we increase each nudge
+ * angle in each frame.
+ */
+ GLfloat color[4];
+} bubble;
+
+/* Should be taken care of already... but just in case */
+#if !defined( __GNUC__ ) && !defined(__cplusplus) && !defined(c_plusplus)
+#undef inline
+#define inline /* */
+#endif
+static inline void
+normalize(GLfloat v[3])
+{
+ GLfloat d = (GLfloat) sqrt((double) (v[0] * v[0] + v[1] * v[1] +
+ v[2] * v[2]));
+
+ if (d != 0) {
+ v[0] /= d;
+ v[1] /= d;
+ v[2] /= d;
+ } else {
+ v[0] = v[1] = v[2] = 0;
+ }
+}
+
+static inline GLfloat
+dotprod(GLfloat * v1, GLfloat * v2)
+{
+ return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];
+}
+
+static inline GLfloat
+max(GLfloat a, GLfloat b)
+{
+ return a > b ? a : b;
+}
+
+/* Create a new bubble. */
+void *
+glb_bubble_new(glb_data *d, GLfloat x, GLfloat y, GLfloat z, GLfloat scale,
+ GLfloat y_incr, GLfloat scale_incr)
+{
+ int i, j;
+
+ /* GLfloat axes [glb_config.nr_nudge_axes][3]; */
+ GLfloat axes[5][3]; /* HARD CODED for SunCC */
+ int nr_vertices;
+ glb_vertex *vertices = glb_sphere_get_vertices(d, &nr_vertices);
+
+ bubble *b = (bubble *) malloc(sizeof *b);
+
+ if (b == 0)
+ return 0;
+
+ if (glb_config.bubble_colour[0] == -1.0) {
+ b->color[0] = ((float) (NRAND(100)) / 100.0);
+ b->color[1] = ((float) (NRAND(100)) / 100.0);
+ b->color[2] = ((float) (NRAND(100)) / 100.0);
+ } else {
+ b->color[0] = glb_config.bubble_colour[0];
+ b->color[1] = glb_config.bubble_colour[1];
+ b->color[2] = glb_config.bubble_colour[2];
+ }
+ b->color[3] = glb_config.bubble_colour[3];
+
+
+ b->contributions = (GLfloat *) malloc(sizeof (GLfloat) * nr_vertices *
+ glb_config.nr_nudge_axes);
+ if (b->contributions == 0) {
+ (void) free((void *) b);
+ return 0;
+ }
+ b->nudge_angle = (GLfloat *) malloc(sizeof (GLfloat) * glb_config.nr_nudge_axes);
+ if (b->nudge_angle == 0) {
+ (void) free((void *) b->contributions);
+ (void) free((void *) b);
+ return 0;
+ }
+ b->nudge_angle_incr = (GLfloat *) malloc(sizeof (GLfloat) * glb_config.nr_nudge_axes);
+ if (b->nudge_angle_incr == 0) {
+ (void) free((void *) b->nudge_angle);
+ (void) free((void *) b->contributions);
+ (void) free((void *) b);
+ return 0;
+ }
+ /* Initialize primitive elements. */
+ b->x = x;
+ b->y = y;
+ b->z = z;
+ b->scale = scale;
+ b->y_incr = y_incr;
+ b->scale_incr = scale_incr;
+ b->rotx = b->roty = b->rotz = 0;
+ b->rotx_incr = glb_drand() * glb_config.rotation_factor * 2
+ - glb_config.rotation_factor;
+ b->roty_incr = glb_drand() * glb_config.rotation_factor * 2
+ - glb_config.rotation_factor;
+ b->rotz_incr = glb_drand() * glb_config.rotation_factor * 2
+ - glb_config.rotation_factor;
+
+ /* Initialize the nudge angle arrays. */
+ for (i = 0; i < glb_config.nr_nudge_axes; ++i) {
+ b->nudge_angle[i] = 0;
+ b->nudge_angle_incr[i] = glb_drand() * glb_config.nudge_angle_factor;
+ }
+
+ /* Choose some random nudge axes. */
+ for (i = 0; i < glb_config.nr_nudge_axes; ++i) {
+ axes[i][0] = glb_drand() * 2 - 1;
+ axes[i][1] = glb_drand() * 2 - 1;
+ axes[i][2] = glb_drand() * 2 - 1;
+ normalize(axes[i]);
+ }
+
+ /* Calculate the contribution that each nudge axis has on each vertex. */
+ for (i = 0; i < nr_vertices; ++i)
+ for (j = 0; j < glb_config.nr_nudge_axes; ++j)
+ b->contributions[i * glb_config.nr_nudge_axes + j]
+ = max(0, dotprod(vertices[i], axes[j]));
+
+ return (void *) b;
+}
+
+/* Delete a bubble and free up all memory. */
+void
+glb_bubble_delete(void *bb)
+{
+ bubble *b = (bubble *) bb;
+
+ if (b != NULL) {
+ if (b->nudge_angle_incr) {
+ (void) free((void *) b->nudge_angle_incr);
+ b->nudge_angle_incr = NULL;
+ }
+ if (b->nudge_angle) {
+ (void) free((void *) b->nudge_angle);
+ b->nudge_angle = NULL;
+ }
+ if (b->contributions) {
+ (void) free((void *) b->contributions);
+ b->contributions = NULL;
+ }
+ (void) free((void *) b);
+ b = NULL;
+ }
+}
+
+/* Rotate and wobble a bubble by a single step. */
+void
+glb_bubble_step(void *bb)
+{
+ int i;
+ bubble *b = (bubble *) bb;
+
+ /* Update the rotation. */
+ b->rotx += b->rotx_incr;
+ b->roty += b->roty_incr;
+ b->rotz += b->rotz_incr;
+
+ /* Update the nudge angles. */
+ for (i = 0; i < glb_config.nr_nudge_axes; ++i)
+ b->nudge_angle[i] += b->nudge_angle_incr[i];
+
+ /* Move it upwards & outwards. */
+ b->y += b->y_incr;
+ b->scale += b->scale_incr;
+}
+
+/* Draw a bubble. */
+void
+glb_bubble_draw(glb_data *d, void *bb)
+{
+ int i, j;
+ bubble *b = (bubble *) bb;
+ int nr_vertices;
+ glb_vertex *vertices = glb_sphere_get_vertices(d, &nr_vertices);
+ int nr_triangles;
+ glb_triangle *triangles = glb_sphere_get_triangles(d, &nr_triangles);
+ glb_vertex *new_vertices;
+
+ new_vertices = (glb_vertex *) malloc(sizeof (glb_vertex) * nr_vertices);
+ /* Calculate the vertices of this bubble, factoring in each nudge axis. */
+ for (i = 0; i < nr_vertices; ++i) {
+ GLfloat s = 0;
+
+ for (j = 0; j < glb_config.nr_nudge_axes; ++j)
+ s += ((GLfloat) cos((double) (b->nudge_angle[j])) *
+ glb_config.nudge_factor - glb_config.nudge_factor / 2) *
+ b->contributions[i * glb_config.nr_nudge_axes + j];
+
+ new_vertices[i][0] = vertices[i][0] * (s + 1);
+ new_vertices[i][1] = vertices[i][1] * (s + 1);
+ new_vertices[i][2] = vertices[i][2] * (s + 1);
+ }
+
+ glPushMatrix();
+
+ /* Apply translation, rotation and scalings. */
+ glTranslatef(b->x, b->y, b->z);
+
+ glRotatef(b->rotx, 1, 0, 0);
+ glRotatef(b->roty, 0, 1, 0);
+ glRotatef(b->rotz, 0, 0, 1);
+
+ glScalef(b->scale, b->scale, b->scale);
+
+ /* Draw the bubble. */
+ glFrontFace(GL_CW);
+ glBegin(GL_TRIANGLES);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, b->color);
+
+ for (i = 0; i < nr_triangles; ++i) {
+ glNormal3fv(new_vertices[triangles[i][0]]);
+ glVertex3fv(new_vertices[triangles[i][0]]);
+ glNormal3fv(new_vertices[triangles[i][1]]);
+ glVertex3fv(new_vertices[triangles[i][1]]);
+ glNormal3fv(new_vertices[triangles[i][2]]);
+ glVertex3fv(new_vertices[triangles[i][2]]);
+ }
+ glEnd();
+ glPopMatrix();
+ (void) free((void *) new_vertices);
+ glb_config.polygon_count += nr_triangles;
+}
+
+/* Return y value. */
+GLfloat
+glb_bubble_get_y(void *bb)
+{
+ bubble *b = (bubble *) bb;
+
+ return b->y;
+}
diff --git a/hacks/glx/bubble3d.h b/hacks/glx/bubble3d.h
new file mode 100644
index 0000000..92ccbbd
--- /dev/null
+++ b/hacks/glx/bubble3d.h
@@ -0,0 +1,100 @@
+/* GLBUBBLES (C) 1998 Richard W.M. Jones. */
+
+#ifndef __bubbles3d_h__
+#define __bubbles3d_h__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#ifdef STANDALONE
+# include <math.h>
+# include "xlockmoreI.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#if !defined(HAVE_JWXYZ) && !defined(HAVE_JWZGLES)
+# include <GL/gl.h>
+# include <GL/glu.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+/* Static configuration. */
+#define GLB_SLOW_GL 0 /* Set this if you have a slow GL
+ * implementation. If you have an accelerated
+ * graphics card, set this to 0.
+ */
+#define GLB_VERTICES_EPSILON 0.0005 /* How close are identical vertices? */
+
+/* Configuration structure. */
+struct glb_config {
+ int transparent_p; /* Whether to use alpha blending */
+
+ int subdivision_depth; /* Controls how many triangles are in
+ * each bubble. 2 and 3 are good values.
+ */
+ int nr_nudge_axes; /* Number of directions in which each
+ * bubble gets stretched. Values between
+ * 3 and 7 seem to produce good results.
+ */
+ GLfloat nudge_angle_factor; /* Max. amount of rotation in nudge angles.
+ * Controls the amount of `wobble' we see,
+ * and 0.3 seems to work well.
+ */
+ GLfloat nudge_factor; /* Max. displacement of any single nudge.
+ * Controls the amount of the wobble. Depends
+ * on NR_NUDGE_AXES, and must not exceed
+ * 1 / NR_NUDGE_AXES. 0.1 is good.
+ */
+ GLfloat rotation_factor; /* Max. amount by which bubbles rotate. */
+ int create_bubbles_every; /* How often to create new bubbles. */
+ int max_bubbles; /* Max. number of bubbles to create. */
+ double p_bubble_group[4]; /* Probabilities of creating 1, 2, 3, 4
+ * bubbles in a group. Cumulative.
+ */
+ GLfloat max_size; /* Max. size. */
+ GLfloat min_size; /* Min. size of bubbles. */
+ GLfloat max_speed; /* Max. speed. */
+ GLfloat min_speed; /* Min. speed of bubbles. */
+ GLfloat scale_factor; /* Factor by which bubbles scale from bottom
+ * of screen to top. 1.5 - 2.0 are OK.
+ */
+ GLfloat screen_bottom; /* Bottom of screen. */
+ GLfloat screen_top; /* Top of screen. */
+ GLfloat bubble_colour[4]; /* Colour of the bubbles. */
+
+ int polygon_count;
+};
+
+extern struct glb_config glb_config;
+
+#define glb_drand() ((double)LRAND() / (double)MAXRAND)
+
+/*-- From glb_sphere.c. --*/
+typedef struct glb_data glb_data;
+typedef GLfloat glb_vertex[3];
+typedef GLuint glb_triangle[3];
+extern glb_data * glb_sphere_init(void);
+extern glb_vertex *glb_sphere_get_vertices(glb_data *, int *nr_vertices);
+extern glb_triangle *glb_sphere_get_triangles(glb_data *, int *nr_triangles);
+extern void glb_sphere_end(glb_data *);
+
+/*-- From glb_bubble.c. --*/
+extern void *glb_bubble_new(glb_data *d,
+ GLfloat x, GLfloat y, GLfloat z, GLfloat scale,
+ GLfloat y_incr, GLfloat scale_incr);
+extern void glb_bubble_delete(void *);
+extern void glb_bubble_step(void *);
+extern void glb_bubble_draw(glb_data *d, void *);
+extern GLfloat glb_bubble_get_y(void *);
+
+/*-- From glb_draw.c. --*/
+extern void *glb_draw_init(void);
+extern void glb_draw_step(void *);
+extern void glb_draw_end(void *);
+
+#endif /* __bubbles3d_h__ */
diff --git a/hacks/glx/bubble3d.man b/hacks/glx/bubble3d.man
new file mode 100644
index 0000000..f847e12
--- /dev/null
+++ b/hacks/glx/bubble3d.man
@@ -0,0 +1,62 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+bubble3d - 3d rising bubbles.
+.SH SYNOPSIS
+.B bubble3d
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-transparent]
+[\-color \fIcolor\fP]
+[\-fps]
+.SH DESCRIPTION
+Draws a stream of rising, undulating 3D bubbles, rising toward the top of
+the screen, with nice specular reflections.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-transparent
+Draw transparent bubbles instead of solid ones.
+.TP 8
+.B \-color \fIcolor\fP
+Draw bubbles of the specified color. "Random" means a different color
+for each bubble.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 15000 (0.015 seconds.).
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Richard Jones. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Richard Jones.
diff --git a/hacks/glx/buildlwo.c b/hacks/glx/buildlwo.c
new file mode 100644
index 0000000..c20c9e2
--- /dev/null
+++ b/hacks/glx/buildlwo.c
@@ -0,0 +1,96 @@
+
+#if 0
+static const char sccsid[] = "@(#)buildlwo.c 4.02 97/04/20 xlockmore";
+#endif
+
+/*-
+ * buildlwo.c: Lightwave Object Display List Builder for OpenGL
+ *
+ * This module can be called by any GL mode wishing to use
+ * objects created in NewTek's Lightwave 3D. The objects must
+ * first be converted to C source with my converter "lw2ogl".
+ * If other people are interested in this, I will put up a
+ * web page for it at http://www.netaxs.com/~emackey/lw2ogl/
+ *
+ * by Ed Mackey, 4/19/97
+ *
+ */
+
+#ifndef STANDALONE
+#include "xlock.h"
+#endif
+
+#ifdef USE_GL
+
+#include "buildlwo.h"
+
+GLuint
+BuildLWO(int wireframe, const struct lwo *object)
+{
+ GLuint dl_num;
+ const GLfloat *pnts, *normals, *grab;
+ const unsigned short int *pols;
+ GLfloat three[3];
+ int p, num_pnts = 0;
+
+ dl_num = glGenLists(1);
+ if (!dl_num)
+ return (0);
+
+ pnts = object->pnts;
+ normals = object->normals;
+ pols = object->pols;
+
+ glNewList(dl_num, GL_COMPILE);
+
+ if (!pols) {
+ num_pnts = object->num_pnts;
+ glBegin(GL_POINTS);
+ for (p = 0; p < num_pnts; ++p) {
+ three[0] = *(pnts++);
+ three[1] = *(pnts++);
+ three[2] = *(pnts++);
+ glVertex3fv(three);
+ }
+ glEnd();
+ } else
+ for (;;) {
+ if (num_pnts <= 0) {
+ num_pnts = *pols + 2;
+ if (num_pnts < 3)
+ break;
+ if (num_pnts == 3) {
+ glBegin(GL_POINTS);
+ } else if (num_pnts == 4) {
+ glBegin(GL_LINES);
+ } else {
+ three[0] = *(normals++);
+ three[1] = *(normals++);
+ three[2] = *(normals++);
+ glNormal3fv(three);
+ if (wireframe)
+ glBegin(GL_LINE_LOOP);
+ else
+ glBegin(GL_POLYGON);
+ }
+ } else if (num_pnts == 1) {
+ glEnd();
+ } else {
+ grab = pnts + ((int) (*pols) * 3);
+ three[0] = *(grab++);
+ three[1] = *(grab++);
+ three[2] = *(grab);
+ glVertex3fv(three);
+ }
+ --num_pnts;
+ ++pols;
+ }
+
+ glEndList();
+
+ return (dl_num);
+}
+
+#endif /* USE_GL */
+
+/* End of buildlwo.c */
diff --git a/hacks/glx/buildlwo.h b/hacks/glx/buildlwo.h
new file mode 100644
index 0000000..b7fbbd9
--- /dev/null
+++ b/hacks/glx/buildlwo.h
@@ -0,0 +1,43 @@
+/*-
+ * buildlwo.h: Header file for Lightwave Object Display List Builder
+ * for OpenGL
+ *
+ * by Ed Mackey, 4/19/97
+ *
+ */
+
+#ifndef __BUILD_LWO_H__
+#define __BUILD_LWO_H__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#ifdef STANDALONE
+# ifndef HAVE_JWXYZ
+# include <GL/gl.h>
+# endif
+#endif
+
+#ifdef HAVE_ANDROID
+# include <GLES/gl.h>
+#endif
+
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+struct lwo {
+ int num_pnts;
+ const GLfloat *pnts;
+ const GLfloat *normals;
+ const unsigned short int *pols;
+ const GLfloat *smoothnormals;
+};
+
+GLuint BuildLWO(int wireframe, const struct lwo *object);
+
+#endif
+
+/* End of buildlwo.h */
diff --git a/hacks/glx/cage.c b/hacks/glx/cage.c
new file mode 100644
index 0000000..66f48aa
--- /dev/null
+++ b/hacks/glx/cage.c
@@ -0,0 +1,480 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* cage --- the Impossible Cage, an Escher like scene. */
+
+#if 0
+static const char sccsid[] = "@(#)cage.c 5.01 2001/03/01 xlockmore";
+#endif
+
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The RotateAroundU() routine was adapted from the book
+ * "Computer Graphics Principles and Practice
+ * Foley - vanDam - Feiner - Hughes
+ * Second Edition" Pag. 227, exercise 5.15.
+ *
+ * This mode shows some interesting scenes that are impossible OR very
+ * wierd to build in the real universe. Much of the scenes are inspirated
+ * on Mauritz Cornelis Escher's works which derivated the mode's name.
+ * M.C. Escher (1898-1972) was a dutch artist and many people prefer to
+ * say he was a mathematician.
+ *
+ * Thanks goes to Brian Paul for making it possible and inexpensive to use
+ * OpenGL at home.
+ *
+ * Since I'm not a native English speaker, my apologies for any grammatical
+ * mistakes.
+ *
+ * My e-mail address is
+ * mfvianna@centroin.com.br
+ *
+ * Marcelo F. Vianna (Jun-01-1997)
+ *
+ * Revision History:
+ * 05-Apr-2002: Removed all gllist uses (fix some bug with nvidia driver)
+ * 01-Mar-2001: Added FPS stuff E.Lassauge <lassauge@mail.dotcom.fr>
+ * 01-Nov-2000: Allocation checks
+ * 01-Jan-1998: Mode separated from escher and renamed
+ * 08-Jun-1997: New scene implemented: "Impossible Cage" based in a M.C.
+ * Escher's painting with the same name (quite similar). The
+ * first GL mode to use texture mapping.
+ * The "Impossible Cage" scene doesn't use DEPTH BUFFER, the
+ * wood planks are drawn consistently using GL_CULL_FACE, and
+ * the painter's algorithm is used to sort the planks.
+ * Marcelo F. Vianna.
+ * 07-Jun-1997: Speed ups in Moebius Strip using GL_CULL_FACE.
+ * Marcelo F. Vianna.
+ * 03-Jun-1997: Initial Release (Only one scene: "Moebius Strip")
+ * The Moebius Strip scene was inspirated in a M.C. Escher's
+ * painting named Moebius Strip II in wich ants walk across a
+ * Moebius Strip path, sometimes meeting each other and sometimes
+ * being in "opposite faces" (note that the moebius strip has
+ * only one face and one edge).
+ * Marcelo F. Vianna.
+ */
+
+/*-
+ * Texture mapping is only available on RGBA contexts, Mono and color index
+ * visuals DO NOT support texture mapping in OpenGL.
+ *
+ * BUT Mesa do implements RGBA contexts in pseudo color visuals, so texture
+ * mapping shuld work on PseudoColor, DirectColor, TrueColor using Mesa. Mono
+ * is not officially supported for both OpenGL and Mesa, but seems to not crash
+ * Mesa.
+ *
+ * In real OpenGL, PseudoColor DO NOT support texture map (as far as I know).
+ */
+
+#ifdef STANDALONE
+# define MODE_cage
+# define DEFAULTS "*delay: 25000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_cage 0
+# define release_cage 0
+# define cage_handle_event xlockmore_no_events
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef MODE_cage
+
+#if 0
+#include "e_textures.h"
+#else
+#include "ximage-loader.h"
+#include "images/gen/wood_png.h"
+#endif
+
+ENTRYPOINT ModeSpecOpt cage_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+
+#ifdef USE_MODULES
+ModStruct cage_description =
+{"cage", "init_cage", "draw_cage", NULL,
+ "draw_cage", "change_cage", (char *) NULL, &cage_opts,
+ 25000, 1, 1, 1, 1.0, 4, "",
+ "Shows the Impossible Cage, an Escher-like GL scene", 0, NULL};
+
+#endif
+
+#define Scale4Window 0.3
+#define Scale4Iconic 0.4
+
+#define sqr(A) ((A)*(A))
+
+#ifndef Pi
+#define Pi M_PI
+#endif
+
+#define ObjWoodPlank 0
+#define MaxObj 1
+
+/*************************************************************************/
+
+typedef struct {
+ GLint WindH, WindW;
+ GLfloat step;
+ GLXContext *glx_context;
+} cagestruct;
+
+static const float front_shininess[] = {60.0};
+static const float front_specular[] = {0.7, 0.7, 0.7, 1.0};
+static const float ambient[] = {0.0, 0.0, 0.0, 1.0};
+static const float diffuse[] = {1.0, 1.0, 1.0, 1.0};
+static const float position0[] = {1.0, 1.0, 1.0, 0.0};
+static const float position1[] = {-1.0, -1.0, 1.0, 0.0};
+static const float lmodel_ambient[] = {0.5, 0.5, 0.5, 1.0};
+static const float lmodel_twoside[] = {GL_TRUE};
+
+static const float MaterialWhite[] = {0.7, 0.7, 0.7, 1.0};
+
+static cagestruct *cage = (cagestruct *) NULL;
+
+#define PlankWidth 3.0
+#define PlankHeight 0.35
+#define PlankThickness 0.15
+
+static Bool
+draw_woodplank(ModeInfo *mi, cagestruct * cp, int wire)
+{
+ glBegin(wire ? GL_LINES : GL_QUADS);
+ glNormal3f(0, 0, 1);
+ glTexCoord2f(0, 0);
+ glVertex3f(-PlankWidth, -PlankHeight, PlankThickness);
+ glTexCoord2f(1, 0);
+ glVertex3f(PlankWidth, -PlankHeight, PlankThickness);
+ glTexCoord2f(1, 1);
+ glVertex3f(PlankWidth, PlankHeight, PlankThickness);
+ glTexCoord2f(0, 1);
+ glVertex3f(-PlankWidth, PlankHeight, PlankThickness);
+ mi->polygon_count++;
+ glNormal3f(0, 0, -1);
+ glTexCoord2f(0, 0);
+ glVertex3f(-PlankWidth, PlankHeight, -PlankThickness);
+ glTexCoord2f(1, 0);
+ glVertex3f(PlankWidth, PlankHeight, -PlankThickness);
+ glTexCoord2f(1, 1);
+ glVertex3f(PlankWidth, -PlankHeight, -PlankThickness);
+ glTexCoord2f(0, 1);
+ glVertex3f(-PlankWidth, -PlankHeight, -PlankThickness);
+ mi->polygon_count++;
+ glNormal3f(0, 1, 0);
+ glTexCoord2f(0, 0);
+ glVertex3f(-PlankWidth, PlankHeight, PlankThickness);
+ glTexCoord2f(1, 0);
+ glVertex3f(PlankWidth, PlankHeight, PlankThickness);
+ glTexCoord2f(1, 1);
+ glVertex3f(PlankWidth, PlankHeight, -PlankThickness);
+ glTexCoord2f(0, 1);
+ glVertex3f(-PlankWidth, PlankHeight, -PlankThickness);
+ mi->polygon_count++;
+ glNormal3f(0, -1, 0);
+ glTexCoord2f(0, 0);
+ glVertex3f(-PlankWidth, -PlankHeight, -PlankThickness);
+ glTexCoord2f(1, 0);
+ glVertex3f(PlankWidth, -PlankHeight, -PlankThickness);
+ glTexCoord2f(1, 1);
+ glVertex3f(PlankWidth, -PlankHeight, PlankThickness);
+ glTexCoord2f(0, 1);
+ glVertex3f(-PlankWidth, -PlankHeight, PlankThickness);
+ mi->polygon_count++;
+ glNormal3f(1, 0, 0);
+ glTexCoord2f(0, 0);
+ glVertex3f(PlankWidth, -PlankHeight, PlankThickness);
+ glTexCoord2f(1, 0);
+ glVertex3f(PlankWidth, -PlankHeight, -PlankThickness);
+ glTexCoord2f(1, 1);
+ glVertex3f(PlankWidth, PlankHeight, -PlankThickness);
+ glTexCoord2f(0, 1);
+ glVertex3f(PlankWidth, PlankHeight, PlankThickness);
+ mi->polygon_count++;
+ glNormal3f(-1, 0, 0);
+ glTexCoord2f(0, 0);
+ glVertex3f(-PlankWidth, PlankHeight, PlankThickness);
+ glTexCoord2f(1, 0);
+ glVertex3f(-PlankWidth, PlankHeight, -PlankThickness);
+ glTexCoord2f(1, 1);
+ glVertex3f(-PlankWidth, -PlankHeight, -PlankThickness);
+ glTexCoord2f(0, 1);
+ glVertex3f(-PlankWidth, -PlankHeight, PlankThickness);
+ mi->polygon_count++;
+ glEnd();
+
+ return True;
+}
+
+static Bool
+draw_impossiblecage(ModeInfo *mi, cagestruct * cp, int wire)
+{
+ glPushMatrix();
+ glRotatef(90, 0, 1, 0);
+ glTranslatef(0.0, PlankHeight - PlankWidth, -PlankThickness - PlankWidth);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(90, 0, 0, 1);
+ glTranslatef(0.0, PlankHeight - PlankWidth, PlankWidth - PlankThickness);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(90, 0, 1, 0);
+ glTranslatef(0.0, PlankWidth - PlankHeight, -PlankThickness - PlankWidth);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ glPushMatrix();
+ glTranslatef(0.0, PlankWidth - PlankHeight, 3 * PlankThickness - PlankWidth);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(90, 0, 0, 1);
+ glTranslatef(0.0, PlankWidth - PlankHeight, PlankWidth - PlankThickness);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ glPushMatrix();
+ glTranslatef(0.0, PlankWidth - PlankHeight, PlankWidth - 3 * PlankThickness);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ glPushMatrix();
+ glTranslatef(0.0, PlankHeight - PlankWidth, 3 * PlankThickness - PlankWidth);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(90, 0, 0, 1);
+ glTranslatef(0.0, PlankHeight - PlankWidth, PlankThickness - PlankWidth);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ glPushMatrix();
+ glTranslatef(0.0, PlankHeight - PlankWidth, PlankWidth - 3 * PlankThickness);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(90, 0, 1, 0);
+ glTranslatef(0.0, PlankHeight - PlankWidth, PlankWidth + PlankThickness);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(90, 0, 0, 1);
+ glTranslatef(0.0, PlankWidth - PlankHeight, PlankThickness - PlankWidth);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(90, 0, 1, 0);
+ glTranslatef(0.0, PlankWidth - PlankHeight, PlankWidth + PlankThickness);
+ if (!draw_woodplank(mi, cp, wire))
+ return False;
+ glPopMatrix();
+ return True;
+}
+
+static void
+reshape_cage(ModeInfo * mi, int width, int height)
+{
+ cagestruct *cp = &cage[MI_SCREEN(mi)];
+ int i;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ }
+
+ glViewport(0, y, cp->WindW = (GLint) width, cp->WindH = (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 15.0);
+ glMatrixMode(GL_MODELVIEW);
+ i = width / 512 + 1;
+ glLineWidth(i);
+ glPointSize(i);
+}
+
+static void
+pinit(ModeInfo *mi)
+{
+ /* int status; */
+
+ if (MI_IS_WIREFRAME(mi))
+ return;
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT1, GL_POSITION, position1);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ glEnable(GL_NORMALIZE);
+ glFrontFace(GL_CCW);
+ glCullFace(GL_BACK);
+
+ /* cage */
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite);
+ glShadeModel(GL_FLAT);
+ glDisable(GL_DEPTH_TEST);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_CULL_FACE);
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+#if 0
+ clear_gl_error();
+ if (MI_IS_MONO(mi))
+ status = 0;
+ else
+ status = gluBuild2DMipmaps(GL_TEXTURE_2D, 3,
+ WoodTextureWidth, WoodTextureHeight,
+ GL_RGB, GL_UNSIGNED_BYTE, WoodTextureData);
+ if (status)
+ {
+ const char *s = (char *) gluErrorString (status);
+ fprintf (stderr, "%s: error mipmapping texture: %s\n",
+ progname, (s ? s : "(unknown)"));
+ exit (1);
+ }
+ check_gl_error("mipmapping");
+#else
+ {
+ XImage *img = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
+ wood_png, sizeof(wood_png));
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ img->width, img->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, img->data);
+ check_gl_error("texture");
+ XDestroyImage (img);
+ }
+#endif
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+}
+
+ENTRYPOINT void
+init_cage (ModeInfo * mi)
+{
+ cagestruct *cp;
+
+ MI_INIT (mi, cage);
+ cp = &cage[MI_SCREEN(mi)];
+
+ cp->step = NRAND(90);
+ if ((cp->glx_context = init_GL(mi)) != NULL) {
+
+ reshape_cage(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ pinit(mi);
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+ENTRYPOINT void
+draw_cage (ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ cagestruct *cp;
+
+ if (cage == NULL)
+ return;
+ cp = &cage[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+ if (!cp->glx_context)
+ return;
+
+ mi->polygon_count = 0;
+ glXMakeCurrent(display, window, *(cp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+ glTranslatef(0.0, 0.0, -10.0);
+
+ if (!MI_IS_ICONIC(mi)) {
+ glScalef(Scale4Window * cp->WindH / cp->WindW, Scale4Window, Scale4Window);
+ } else {
+ glScalef(Scale4Iconic * cp->WindH / cp->WindW, Scale4Iconic, Scale4Iconic);
+ }
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ if (o != 0 && o != 180 && o != -180) {
+ glScalef (1/h, h, 1/h); /* #### not quite right */
+ h = 1.7;
+ glScalef (h, h, h);
+ }
+ }
+# endif
+
+ /* cage */
+ glRotatef(cp->step * 100, 0, 0, 1);
+ glRotatef(25 + cos(cp->step * 5) * 6, 1, 0, 0);
+ glRotatef(204.5 - sin(cp->step * 5) * 8, 0, 1, 0);
+ if (!draw_impossiblecage(mi, cp, MI_IS_WIREFRAME(mi))) {
+ MI_ABORT(mi);
+ return;
+ }
+
+ glPopMatrix();
+ if (MI_IS_FPS(mi)) do_fps (mi);
+ glFlush();
+
+ glXSwapBuffers(display, window);
+
+ cp->step += 0.025;
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void
+change_cage (ModeInfo * mi)
+{
+ cagestruct *cp = &cage[MI_SCREEN(mi)];
+
+ if (!cp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(cp->glx_context));
+ pinit(mi);
+}
+#endif /* !STANDALONE */
+
+XSCREENSAVER_MODULE ("Cage", cage)
+
+#endif
diff --git a/hacks/glx/cage.man b/hacks/glx/cage.man
new file mode 100644
index 0000000..dc5595b
--- /dev/null
+++ b/hacks/glx/cage.man
@@ -0,0 +1,61 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+cage - Escher's impossible cage, for xscreensaver.
+.SH SYNOPSIS
+.B cage
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-mono]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+This draws Escher's "Impossible Cage", a 3d analog of a moebius strip,
+and rotates it in three dimensions.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 25000 (0.03 seconds.).
+.TP 8
+.B \-mono
+Render solid instead of textured.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of textured.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Marcelo Vianna. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Marcelo Vianna.
diff --git a/hacks/glx/carousel.c b/hacks/glx/carousel.c
new file mode 100644
index 0000000..863b1a5
--- /dev/null
+++ b/hacks/glx/carousel.c
@@ -0,0 +1,941 @@
+/* carousel, Copyright (c) 2005-2018 Jamie Zawinski <jwz@jwz.org>
+ * Loads a sequence of images and rotates them around.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Created: 21-Feb-2005
+ */
+
+#if defined(HAVE_COCOA) || defined(HAVE_ANDROID)
+# define DEF_FONT "OCR A Std 48, Lucida Console 48, Monaco 48"
+#elif 0 /* real X11, XQueryFont() */
+# define DEF_FONT "-*-helvetica-bold-r-normal-*-*-480-*-*-*-*-*-*"
+#else /* real X11, load_font_retry() */
+# define DEF_FONT "-*-ocr a std-medium-r-*-*-*-480-*-*-m-*-*-*"
+#endif
+
+#define DEF_TITLE_FONT "-*-helvetica-bold-r-normal-*-*-480-*-*-*-*-*-*"
+
+#define DEFAULTS "*count: 7 \n" \
+ "*delay: 10000 \n" \
+ "*wireframe: False \n" \
+ "*showFPS: False \n" \
+ "*fpsSolid: True \n" \
+ "*useSHM: True \n" \
+ "*font: " DEF_FONT "\n" \
+ "*titleFont: " DEF_TITLE_FONT "\n" \
+ "*desktopGrabber: xscreensaver-getimage -no-desktop %s\n" \
+ "*grabDesktopImages: False \n" \
+ "*chooseRandomImages: True \n"
+
+# define free_carousel 0
+# define release_carousel 0
+# include "xlockmore.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#ifdef USE_GL
+
+# define DEF_SPEED "1.0"
+# define DEF_DURATION "20"
+# define DEF_TITLES "True"
+# define DEF_ZOOM "True"
+# define DEF_TILT "XY"
+# define DEF_MIPMAP "True"
+# define DEF_DEBUG "False"
+
+#include "rotator.h"
+#include "gltrackball.h"
+#include "grab-ximage.h"
+#include "texfont.h"
+
+# ifndef HAVE_JWXYZ
+# include <X11/Intrinsic.h> /* for XrmDatabase in -debug mode */
+# endif
+
+/* Should be in <GL/glext.h> */
+# ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT
+# define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
+# endif
+# ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
+# define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
+# endif
+
+typedef struct {
+ double x, y, w, h;
+} rect;
+
+typedef enum { EARLY, NORMAL, LOADING, OUT, IN, DEAD } fade_mode;
+static int fade_ticks = 60;
+
+typedef struct {
+ char *title; /* the filename of this image */
+ int w, h; /* size in pixels of the image */
+ int tw, th; /* size in pixels of the texture */
+ XRectangle geom; /* where in the image the bits are */
+ GLuint texid;
+} image;
+
+typedef struct {
+ ModeInfo *mi;
+ image current, loading;
+ GLfloat r, theta; /* radius and rotation on the tube */
+ rotator *rot; /* for zoomery */
+ Bool from_top_p; /* whether this image drops in or rises up */
+ time_t expires; /* when this image should be replaced */
+ fade_mode mode; /* in/out animation state */
+ int mode_tick;
+ Bool loaded_p; /* whether background load is done */
+} image_frame;
+
+
+typedef struct {
+ GLXContext *glx_context;
+ GLfloat anisotropic;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+ time_t button_down_time;
+
+ int nframes; /* how many frames are loaded */
+ int frames_size;
+ image_frame **frames; /* pointers to the frames */
+
+ Bool awaiting_first_images_p;
+ int loads_in_progress;
+
+ texture_font_data *texfont, *titlefont;
+
+ fade_mode mode;
+ int mode_tick;
+
+ int loading_sw, loading_sh;
+
+ time_t last_time, now;
+ int draw_tick;
+
+} carousel_state;
+
+static carousel_state *sss = NULL;
+
+
+/* Command-line arguments
+ */
+static GLfloat speed; /* animation speed scale factor */
+static int duration; /* reload images after this long */
+static Bool mipmap_p; /* Use mipmaps instead of single textures. */
+static Bool titles_p; /* Display image titles. */
+static Bool zoom_p; /* Throb the images in and out as they spin. */
+static char *tilt_str;
+static Bool tilt_x_p; /* Tilt axis towards the viewer */
+static Bool tilt_y_p; /* Tilt axis side to side */
+static Bool debug_p; /* Be loud and do weird things. */
+
+
+static XrmOptionDescRec opts[] = {
+ {"-zoom", ".zoom", XrmoptionNoArg, "True" },
+ {"-no-zoom", ".zoom", XrmoptionNoArg, "False" },
+ {"-tilt", ".tilt", XrmoptionSepArg, 0 },
+ {"-no-tilt", ".tilt", XrmoptionNoArg, "" },
+ {"-titles", ".titles", XrmoptionNoArg, "True" },
+ {"-no-titles", ".titles", XrmoptionNoArg, "False" },
+ {"-mipmaps", ".mipmap", XrmoptionNoArg, "True" },
+ {"-no-mipmaps", ".mipmap", XrmoptionNoArg, "False" },
+ {"-duration", ".duration", XrmoptionSepArg, 0 },
+ {"-debug", ".debug", XrmoptionNoArg, "True" },
+ {"-font", ".font", XrmoptionSepArg, 0 },
+ {"-speed", ".speed", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ { &mipmap_p, "mipmap", "Mipmap", DEF_MIPMAP, t_Bool},
+ { &debug_p, "debug", "Debug", DEF_DEBUG, t_Bool},
+ { &titles_p, "titles", "Titles", DEF_TITLES, t_Bool},
+ { &zoom_p, "zoom", "Zoom", DEF_ZOOM, t_Bool},
+ { &tilt_str, "tilt", "Tilt", DEF_TILT, t_String},
+ { &speed, "speed", "Speed", DEF_SPEED, t_Float},
+ { &duration, "duration", "Duration", DEF_DURATION, t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt carousel_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Allocates a frame structure and stores it in the list.
+ */
+static image_frame *
+alloc_frame (ModeInfo *mi)
+{
+ carousel_state *ss = &sss[MI_SCREEN(mi)];
+ image_frame *frame = (image_frame *) calloc (1, sizeof (*frame));
+
+ frame->mi = mi;
+ frame->mode = EARLY;
+ frame->rot = make_rotator (0, 0, 0, 0, 0.04 * frand(1.0) * speed, False);
+
+ glGenTextures (1, &frame->current.texid);
+ glGenTextures (1, &frame->loading.texid);
+ if (frame->current.texid <= 0) abort();
+ if (frame->loading.texid <= 0) abort();
+
+ if (ss->frames_size <= ss->nframes)
+ {
+ ss->frames_size = (ss->frames_size * 1.2) + ss->nframes;
+ ss->frames = (image_frame **)
+ realloc (ss->frames, ss->frames_size * sizeof(*ss->frames));
+ if (! ss->frames)
+ {
+ fprintf (stderr, "%s: out of memory (%d images)\n",
+ progname, ss->frames_size);
+ exit (1);
+ }
+ }
+
+ ss->frames[ss->nframes++] = frame;
+
+ return frame;
+}
+
+
+static void image_loaded_cb (const char *filename, XRectangle *geom,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure);
+
+
+/* Load a new file into the given image struct.
+ */
+static void
+load_image (ModeInfo *mi, image_frame *frame)
+{
+ carousel_state *ss = &sss[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+
+ if (debug_p && !wire && frame->current.w != 0)
+ fprintf (stderr, "%s: dropped %4d x %-4d %4d x %-4d \"%s\"\n",
+ progname,
+ frame->current.geom.width,
+ frame->current.geom.height,
+ frame->current.tw, frame->current.th,
+ (frame->current.title ? frame->current.title : "(null)"));
+
+ switch (frame->mode)
+ {
+ case EARLY: break;
+ case NORMAL: frame->mode = LOADING; break;
+ default: abort();
+ }
+
+ ss->loads_in_progress++;
+
+ if (wire)
+ image_loaded_cb (0, 0, 0, 0, 0, 0, frame);
+ else
+ {
+ int w = (MI_WIDTH(mi) / 2) - 1;
+ int h = (MI_HEIGHT(mi) / 2) - 1;
+ if (w <= 10) w = 10;
+ if (h <= 10) h = 10;
+
+ if (w > h * 5) { /* tiny window: use 16:9 boxes */
+ h = w * 9/16;
+ }
+
+ load_texture_async (mi->xgwa.screen, mi->window, *ss->glx_context, w, h,
+ mipmap_p, frame->loading.texid,
+ image_loaded_cb, frame);
+ }
+}
+
+
+/* Callback that tells us that the texture has been loaded.
+ */
+static void
+image_loaded_cb (const char *filename, XRectangle *geom,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure)
+{
+ image_frame *frame = (image_frame *) closure;
+ ModeInfo *mi = frame->mi;
+ carousel_state *ss = &sss[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+
+ if (wire)
+ {
+ frame->loading.w = MI_WIDTH (mi) * (0.5 + frand (1.0));
+ frame->loading.h = MI_HEIGHT (mi);
+ frame->loading.geom.width = frame->loading.w;
+ frame->loading.geom.height = frame->loading.h;
+ goto DONE;
+ }
+
+ if (image_width == 0 || image_height == 0)
+ exit (1);
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+ mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR);
+
+ if (ss->anisotropic >= 1.0)
+ glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
+ ss->anisotropic);
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+ frame->loading.w = image_width;
+ frame->loading.h = image_height;
+ frame->loading.tw = texture_width;
+ frame->loading.th = texture_height;
+ frame->loading.geom = *geom;
+
+ if (frame->loading.title)
+ free (frame->loading.title);
+ frame->loading.title = (filename ? strdup (filename) : 0);
+
+ /* xscreensaver-getimage returns paths relative to the image directory
+ now, so leave the sub-directory part in. Unless it's an absolute path.
+ */
+ if (frame->loading.title && frame->loading.title[0] == '/')
+ { /* strip filename to part after last /. */
+ char *s = strrchr (frame->loading.title, '/');
+ if (s) strcpy (frame->loading.title, s+1);
+ }
+
+ if (debug_p)
+ fprintf (stderr, "%s: loaded %4d x %-4d %4d x %-4d \"%s\"\n",
+ progname,
+ frame->loading.geom.width,
+ frame->loading.geom.height,
+ frame->loading.tw, frame->loading.th,
+ (frame->loading.title ? frame->loading.title : "(null)"));
+
+ DONE:
+
+ frame->loaded_p = True;
+
+ if (ss->loads_in_progress <= 0) abort();
+ ss->loads_in_progress--;
+
+ /* This image expires N seconds after it finished loading. */
+ frame->expires = time((time_t *) 0) + (duration * MI_COUNT(mi));
+
+ switch (frame->mode)
+ {
+ case EARLY: /* part of the initial batch of images */
+ {
+ image swap = frame->current;
+ frame->current = frame->loading;
+ frame->loading = swap;
+ }
+ break;
+ case LOADING: /* start dropping the old image out */
+ {
+ frame->mode = OUT;
+ frame->mode_tick = fade_ticks / speed;
+ frame->from_top_p = random() & 1;
+ }
+ break;
+ default:
+ abort();
+ }
+}
+
+
+static void loading_msg (ModeInfo *mi, int n);
+
+static Bool
+load_initial_images (ModeInfo *mi)
+{
+ carousel_state *ss = &sss[MI_SCREEN(mi)];
+ int i;
+ Bool all_loaded_p = True;
+ for (i = 0; i < ss->nframes; i++)
+ if (! ss->frames[i]->loaded_p)
+ all_loaded_p = False;
+
+ if (all_loaded_p)
+ {
+ if (ss->nframes < MI_COUNT (mi))
+ {
+ /* The frames currently on the list are fully loaded.
+ Start the next one loading. (We run the image loader
+ asynchronously, but we load them one at a time.)
+ */
+ load_image (mi, alloc_frame (mi));
+ }
+ else
+ {
+ /* The first batch of images are now all loaded!
+ Stagger the expire times so that they don't all drop out at once.
+ */
+ time_t now = time((time_t *) 0);
+ int i;
+
+ for (i = 0; i < ss->nframes; i++)
+ {
+ image_frame *frame = ss->frames[i];
+ frame->r = 1.0;
+ frame->theta = i * 360.0 / ss->nframes;
+ frame->expires = now + (duration * (i + 1));
+ frame->mode = NORMAL;
+ }
+
+ /* Instead of always going clockwise, shuffle the expire times
+ of the frames so that they drop out in a random order.
+ */
+ for (i = 0; i < ss->nframes; i++)
+ {
+ image_frame *frame1 = ss->frames[i];
+ image_frame *frame2 = ss->frames[random() % ss->nframes];
+ time_t swap = frame1->expires;
+ frame1->expires = frame2->expires;
+ frame2->expires = swap;
+ }
+
+ ss->awaiting_first_images_p = False;
+ }
+ }
+
+ loading_msg (mi, ss->nframes-1);
+
+ return !ss->awaiting_first_images_p;
+}
+
+
+ENTRYPOINT void
+reshape_carousel (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (60.0, 1/h, 1.0, 8.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 2.6,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+carousel_handle_event (ModeInfo *mi, XEvent *event)
+{
+ carousel_state *ss = &sss[MI_SCREEN(mi)];
+
+ if (event->xany.type == ButtonPress &&
+ event->xbutton.button == Button1)
+ {
+ if (! ss->button_down_p)
+ ss->button_down_time = time((time_t *) 0);
+ }
+ else if (event->xany.type == ButtonRelease &&
+ event->xbutton.button == Button1)
+ {
+ if (ss->button_down_p)
+ {
+ /* Add the time the mouse was held to the expire times of all
+ frames, so that mouse-dragging doesn't count against
+ image expiration.
+ */
+ int secs = time((time_t *) 0) - ss->button_down_time;
+ int i;
+ for (i = 0; i < ss->nframes; i++)
+ ss->frames[i]->expires += secs;
+ }
+ }
+
+ if (gltrackball_event_handler (event, ss->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &ss->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ int i = random() % ss->nframes;
+ ss->frames[i]->expires = 0;
+ return True;
+ }
+
+ return False;
+}
+
+
+/* Kludge to add "-v" to invocation of "xscreensaver-getimage" in -debug mode
+ */
+static void
+hack_resources (Display *dpy)
+{
+# ifndef HAVE_JWXYZ
+ char *res = "desktopGrabber";
+ char *val = get_string_resource (dpy, res, "DesktopGrabber");
+ char buf1[255];
+ char buf2[255];
+ XrmValue value;
+ XrmDatabase db = XtDatabase (dpy);
+ sprintf (buf1, "%.100s.%.100s", progname, res);
+ sprintf (buf2, "%.200s -v", val);
+ value.addr = buf2;
+ value.size = strlen(buf2);
+ XrmPutResource (&db, buf1, "String", &value);
+# endif /* !HAVE_JWXYZ */
+}
+
+
+static void
+loading_msg (ModeInfo *mi, int n)
+{
+ carousel_state *ss = &sss[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ char text[100];
+
+ if (wire) return;
+
+ if (n == 0)
+ sprintf (text, "Loading images...");
+ else
+ sprintf (text, "Loading images... (%d%%)",
+ (int) (n * 100 / MI_COUNT(mi)));
+
+ if (ss->loading_sw == 0)
+ {
+ /* only do this once, so that the string doesn't move. */
+ XCharStruct e;
+ texture_string_metrics (ss->titlefont, text, &e, 0, 0);
+ ss->loading_sw = e.width;
+ ss->loading_sh = e.ascent + e.descent;
+ }
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glLoadIdentity();
+
+/*
+ {
+ double rot = current_device_rotation();
+ glRotatef(rot, 0, 0, 1);
+ if ((rot > 45 && rot < 135) ||
+ (rot < -45 && rot > -135))
+ {
+ GLfloat s = MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi);
+ glScalef (s, 1/s, 1);
+ }
+ }
+*/
+
+# ifdef HAVE_MOBILE
+ if (MI_WIDTH(mi) < MI_HEIGHT(mi)) /* portrait orientation */
+ {
+ GLfloat s = (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi));
+ glScalef (s, s, s);
+ glTranslatef(-s/2, 0, 0);
+ }
+# endif
+
+ glOrtho(0, MI_WIDTH(mi), 0, MI_HEIGHT(mi), -1, 1);
+ glTranslatef ((MI_WIDTH(mi) - ss->loading_sw) / 2,
+ (MI_HEIGHT(mi) - ss->loading_sh) / 2,
+ 0);
+ glColor3f (1, 1, 0);
+ glEnable (GL_TEXTURE_2D);
+ glDisable (GL_DEPTH_TEST);
+ print_texture_string (ss->titlefont, text);
+ glEnable (GL_DEPTH_TEST);
+ glPopMatrix();
+
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+
+ glMatrixMode(GL_MODELVIEW);
+
+ glFinish();
+ glXSwapBuffers (MI_DISPLAY (mi), MI_WINDOW(mi));
+}
+
+
+ENTRYPOINT void
+init_carousel (ModeInfo *mi)
+{
+ int screen = MI_SCREEN(mi);
+ carousel_state *ss;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, sss);
+ ss = &sss[screen];
+
+ if ((ss->glx_context = init_GL(mi)) != NULL) {
+ reshape_carousel (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+
+ if (!tilt_str || !*tilt_str)
+ ;
+ else if (!strcasecmp (tilt_str, "0"))
+ ;
+ else if (!strcasecmp (tilt_str, "X"))
+ tilt_x_p = 1;
+ else if (!strcasecmp (tilt_str, "Y"))
+ tilt_y_p = 1;
+ else if (!strcasecmp (tilt_str, "XY"))
+ tilt_x_p = tilt_y_p = 1;
+ else
+ {
+ fprintf (stderr, "%s: tilt must be 'X', 'Y', 'XY' or '', not '%s'\n",
+ progname, tilt_str);
+ exit (1);
+ }
+
+ {
+ double spin_speed = speed * 0.2; /* rotation of tube around axis */
+ double spin_accel = speed * 0.1;
+ double wander_speed = speed * 0.001; /* tilting of axis */
+
+ spin_speed *= 0.9 + frand(0.2);
+ wander_speed *= 0.9 + frand(0.2);
+
+ ss->rot = make_rotator (spin_speed, spin_speed, spin_speed,
+ spin_accel, wander_speed, True);
+
+ ss->trackball = gltrackball_init (False);
+ }
+
+ if (strstr ((char *) glGetString(GL_EXTENSIONS),
+ "GL_EXT_texture_filter_anisotropic"))
+ glGetFloatv (GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &ss->anisotropic);
+ else
+ ss->anisotropic = 0.0;
+
+ glDisable (GL_LIGHTING);
+ glEnable (GL_DEPTH_TEST);
+ glDisable (GL_CULL_FACE);
+
+ if (! wire)
+ {
+ glShadeModel (GL_SMOOTH);
+ glEnable (GL_LINE_SMOOTH);
+ /* This gives us a transparent diagonal slice through each image! */
+ /* glEnable (GL_POLYGON_SMOOTH); */
+ glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable (GL_ALPHA_TEST);
+
+ glEnable (GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset (1.0, 1.0);
+
+ }
+
+ ss->texfont = load_texture_font (MI_DISPLAY(mi), "font");
+ ss->titlefont = load_texture_font (MI_DISPLAY(mi), "titleFont");
+
+ if (debug_p)
+ hack_resources (MI_DISPLAY (mi));
+
+ ss->nframes = 0;
+ ss->frames_size = 10;
+ ss->frames = (image_frame **)
+ calloc (1, ss->frames_size * sizeof(*ss->frames));
+
+ ss->mode = IN;
+ ss->mode_tick = fade_ticks / speed;
+
+ ss->awaiting_first_images_p = True;
+}
+
+
+static void
+draw_frame (ModeInfo *mi, image_frame *frame, time_t now, Bool body_p)
+{
+ carousel_state *ss = &sss[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+
+ GLfloat texw = frame->current.geom.width / (GLfloat) frame->current.tw;
+ GLfloat texh = frame->current.geom.height / (GLfloat) frame->current.th;
+ GLfloat texx1 = frame->current.geom.x / (GLfloat) frame->current.tw;
+ GLfloat texy1 = frame->current.geom.y / (GLfloat) frame->current.th;
+ GLfloat texx2 = texx1 + texw;
+ GLfloat texy2 = texy1 + texh;
+ GLfloat aspect = ((GLfloat) frame->current.geom.height /
+ (GLfloat) frame->current.geom.width);
+
+ glBindTexture (GL_TEXTURE_2D, frame->current.texid);
+
+ glPushMatrix();
+
+ /* Position this image on the wheel.
+ */
+ glRotatef (frame->theta, 0, 1, 0);
+ glTranslatef (0, 0, frame->r);
+
+ /* Scale down the image so that all N frames fit on the wheel
+ without bumping in to each other.
+ */
+ {
+ GLfloat t, s;
+ switch (ss->nframes)
+ {
+ case 1: t = -1.0; s = 1.7; break;
+ case 2: t = -0.8; s = 1.6; break;
+ case 3: t = -0.4; s = 1.5; break;
+ case 4: t = -0.2; s = 1.3; break;
+ default: t = 0.0; s = 6.0 / ss->nframes; break;
+ }
+ glTranslatef (0, 0, t);
+ glScalef (s, s, s);
+ }
+
+ /* Center this image on the wheel plane.
+ */
+ glTranslatef (-0.5, -(aspect/2), 0);
+
+ /* Move as per the "zoom in and out" setting.
+ */
+ if (zoom_p)
+ {
+ double x, y, z;
+ /* Only use the Z component of the rotator for in/out position. */
+ get_position (frame->rot, &x, &y, &z, !ss->button_down_p);
+ glTranslatef (0, 0, z/2);
+ }
+
+ /* Compute the "drop in and out" state.
+ */
+ switch (frame->mode)
+ {
+ case EARLY:
+ abort();
+ break;
+ case NORMAL:
+ if (!ss->button_down_p &&
+ now >= frame->expires &&
+ ss->loads_in_progress == 0) /* only load one at a time */
+ load_image (mi, frame);
+ break;
+ case LOADING:
+ break;
+ case OUT:
+ if (--frame->mode_tick <= 0) {
+ image swap = frame->current;
+ frame->current = frame->loading;
+ frame->loading = swap;
+
+ frame->mode = IN;
+ frame->mode_tick = fade_ticks / speed;
+ }
+ break;
+ case IN:
+ if (--frame->mode_tick <= 0)
+ frame->mode = NORMAL;
+ break;
+ default:
+ abort();
+ }
+
+ /* Now translate for current in/out state.
+ */
+ if (frame->mode == OUT || frame->mode == IN)
+ {
+ GLfloat t = (frame->mode == OUT
+ ? frame->mode_tick / (fade_ticks / speed)
+ : (((fade_ticks / speed) - frame->mode_tick + 1) /
+ (fade_ticks / speed)));
+ t = 5 * (1 - t);
+ if (frame->from_top_p) t = -t;
+ glTranslatef (0, t, 0);
+ }
+
+ if (body_p) /* Draw the image quad. */
+ {
+ if (! wire)
+ {
+ glColor3f (1, 1, 1);
+ glNormal3f (0, 0, 1);
+ glEnable (GL_TEXTURE_2D);
+ glBegin (GL_QUADS);
+ glNormal3f (0, 0, 1);
+ glTexCoord2f (texx1, texy2); glVertex3f (0, 0, 0);
+ glTexCoord2f (texx2, texy2); glVertex3f (1, 0, 0);
+ glTexCoord2f (texx2, texy1); glVertex3f (1, aspect, 0);
+ glTexCoord2f (texx1, texy1); glVertex3f (0, aspect, 0);
+ glEnd();
+ }
+
+ /* Draw a box around it.
+ */
+ glLineWidth (2.0);
+ glColor3f (0.5, 0.5, 0.5);
+ glDisable (GL_TEXTURE_2D);
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (0, 0, 0);
+ glVertex3f (1, 0, 0);
+ glVertex3f (1, aspect, 0);
+ glVertex3f (0, aspect, 0);
+ glEnd();
+
+ }
+ else /* Draw a title under the image. */
+ {
+ XCharStruct e;
+ int sw, sh;
+ GLfloat scale = 0.05;
+ char *title = frame->current.title ? frame->current.title : "(untitled)";
+ texture_string_metrics (ss->texfont, title, &e, 0, 0);
+ sw = e.width;
+ sh = e.ascent + e.descent;
+
+ glTranslatef (0, -scale, 0);
+
+ scale /= sh;
+ glScalef (scale, scale, scale);
+
+ glTranslatef (((1/scale) - sw) / 2, 0, 0);
+ glColor3f (1, 1, 1);
+
+ if (!wire)
+ {
+ glEnable (GL_TEXTURE_2D);
+ print_texture_string (ss->texfont, title);
+ }
+ else
+ {
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (0, 0, 0);
+ glVertex3f (sw, 0, 0);
+ glVertex3f (sw, sh, 0);
+ glVertex3f (0, sh, 0);
+ glEnd();
+ }
+ }
+
+ glPopMatrix();
+}
+
+
+ENTRYPOINT void
+draw_carousel (ModeInfo *mi)
+{
+ carousel_state *ss = &sss[MI_SCREEN(mi)];
+ int i;
+
+ if (!ss->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(ss->glx_context));
+
+ if (ss->awaiting_first_images_p)
+ if (!load_initial_images (mi))
+ return;
+
+ /* Only check the wall clock every 10 frames */
+ {
+ if (ss->now == 0 || ss->draw_tick++ > 10)
+ {
+ ss->now = time((time_t *) 0);
+ if (ss->last_time == 0) ss->last_time = ss->now;
+ ss->draw_tick = 0;
+ }
+ }
+
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+
+ /* Run the startup "un-shrink" animation.
+ */
+ switch (ss->mode)
+ {
+ case IN:
+ if (--ss->mode_tick <= 0)
+ {
+ ss->mode = NORMAL;
+ ss->last_time = time((time_t *) 0);
+ }
+ break;
+ case NORMAL:
+ break;
+ default:
+ abort();
+ }
+
+
+ /* Scale as per the startup "un-shrink" animation.
+ */
+ if (ss->mode != NORMAL)
+ {
+ GLfloat s = (ss->mode == OUT
+ ? ss->mode_tick / (fade_ticks / speed)
+ : (((fade_ticks / speed) - ss->mode_tick + 1) /
+ (fade_ticks / speed)));
+ glScalef (s, s, s);
+ }
+
+ /* Rotate and tilt as per the user, and the motion modeller.
+ */
+ {
+ double x, y, z;
+ gltrackball_rotate (ss->trackball);
+
+ /* Tilt the tube up or down by up to 30 degrees */
+ get_position (ss->rot, &x, &y, &z, !ss->button_down_p);
+ if (tilt_x_p)
+ glRotatef (15 - (x * 30), 1, 0, 0);
+ if (tilt_y_p)
+ glRotatef (7 - (y * 14), 0, 0, 1);
+
+ /* Only use the Y component of the rotator. */
+ get_rotation (ss->rot, &x, &y, &z, !ss->button_down_p);
+ glRotatef (y * 360, 0, 1, 0);
+ }
+
+ /* First draw each image, then draw the titles. GL insists that you
+ draw back-to-front in order to make alpha blending work properly,
+ so we need to draw all of the 100% opaque images before drawing
+ any of the not-100%-opaque titles.
+ */
+ for (i = 0; i < ss->nframes; i++)
+ draw_frame (mi, ss->frames[i], ss->now, True);
+ if (titles_p)
+ for (i = 0; i < ss->nframes; i++)
+ draw_frame (mi, ss->frames[i], ss->now, False);
+
+ glPopMatrix();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers (MI_DISPLAY (mi), MI_WINDOW(mi));
+}
+
+XSCREENSAVER_MODULE ("Carousel", carousel)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/carousel.man b/hacks/glx/carousel.man
new file mode 100644
index 0000000..d5c9e43
--- /dev/null
+++ b/hacks/glx/carousel.man
@@ -0,0 +1,109 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+carousel - displays multiple images rotating in a circular formation
+.SH SYNOPSIS
+.B carousel
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fIint\fP]
+[\-zoom | \-no\-zoom]
+[\-tilt \fIXY\fP]
+[\-titles | \-no\-titles]
+[\-font \fIfont\fP]
+[\-speed \fIratio\fP]
+[\-duration \fIseconds\fP]
+[\-fps]
+[\-debug]
+[\-wireframe]
+.SH DESCRIPTION
+Loads several random images, and displays them flying in a circular
+formation. The circle changes speed and direction randomly, tilts on
+its axis, and the images move in and out.
+
+This program requires a good video card capable of supporting large
+textures.
+
+To specify the directory that images are loaded from, run
+.BR xscreensaver-demo (1)
+and click on the "Advanced" tab.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fIint\fP
+How many images to display. Default 7.
+.TP 8
+.B \-zoom \fB| \-no\-zoom\fP
+Whether the images should move in and out (toward and away from the
+axis of rotation). Default true.
+.TP 8
+.B \-tilt \fIXY\fP \fB| \-no\-tilt\fP
+Whether the axis of rotation should tilt, and how. \fB-tilt X\fP
+means that it will tilt toward and away from the viewer.
+\fB-tilt Y\fP means that it will tilt to the left and right of the
+screen. \fB-tilt XY\fP (the default) means it will do both.
+.TP 8
+.B \-titles \fB| \-no\-titles\fP
+Whether to display the file names of the images beneath them. Default: yes.
+.TP 8
+.B \-font \fIfont-name\fP
+The font to use for titles. Note that the size of the font affects
+the clarity of the characters, not their size (it is auto-scaled.)
+.TP 8
+.B \-duration \fIseconds\fP
+Every \fIduration\fP seconds, one of the images will be replaced
+with a new one. Default 20 seconds.
+.TP 8
+.B \-speed \fIratio\fP
+Speed up or slow down the animation. 0.5 means half as fast as the
+default; 2.0 means twice as fast.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-debug
+Prints debugging info to stderr.
+.TP 8
+.B \-wireframe
+Another debug mode.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver-demo (1)
+.BR xscreensaver-getimage (1)
+.BR xscreensaver (1)
+.BR glslideshow (MANSUFFIX)
+.BR photopile (MANSUFFIX)
+.SH COPYRIGHT
+Copyright \(co 2005 by Jamie Zawinski.
+
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/chessgames.h b/hacks/glx/chessgames.h
new file mode 100644
index 0000000..28f5c57
--- /dev/null
+++ b/hacks/glx/chessgames.h
@@ -0,0 +1,343 @@
+/*
+ * endgame -- plays through a chess game ending. enjoy.
+ *
+ * Copyright (C) 2002 Blair Tennessy (tennessy@cs.ubc.ca)
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __CHESSGAMES_H__
+#define __CHESSGAMES_H__
+
+/** structure for a chess game */
+typedef struct {
+
+ /** original board configuration */
+ int board[BOARDSIZE][BOARDSIZE];
+
+ /** total moves */
+ int movecount;
+
+ /**
+ moves in game. this is a slight hack: moves are encoded in
+ integer pairs (x,y). the first pair, _from_, determines the
+ piece to move. the second pair, _to_, determines where to move.
+
+ in case _to_ is held by another piece, that piece is taken.
+ (see drawTakePiece(), draw_chess())
+
+ in case the move promotes a pawn, we assume a queening.
+ (see drawMovingPiece())
+
+ what's lacking?
+ castling, en passant, under-promotions.
+ */
+ int moves[40][4];
+} ChessGame;
+
+#define GAMES 7
+static ChessGame games[GAMES] = {
+
+ /**
+ game 1:
+
+ E. N. Somov-Nasimovitsch
+ White to play and win.
+
+ "Zadachi I Etiudi"
+ 1928
+ */
+ {
+ {
+ { 0, 0, 0, 0, 0, BKING, 0, 0},
+ { BPAWN, 0, BPAWN, 0, BPAWN, 0, 0, 0},
+ { 0, 0, BPAWN, 0, BPAWN, 0, 0, KNIGHT},
+ { PAWN, 0, ROOK, 0, 0, 0, 0, 0},
+ { PAWN, 0, 0, 0, KING, PAWN, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { BPAWN, 0, 0, 0, 0, 0, 0, PAWN},
+ { BBISHOP,0, 0, 0, 0, 0, 0, 0},
+ },
+
+ 24,
+
+ {
+ {3, 2, 6, 2},
+ {7, 0, 6, 1},
+ {6, 2, 6, 6},
+ {0, 5, 0, 4},
+ {6, 6, 0, 6},
+ {0, 4, 1, 3},
+ {2, 7, 1, 5},
+ {2, 2, 3, 2},
+ {0, 6, 0, 3},
+ {1, 3, 2, 2},
+ {0, 3, 6, 3},
+ {3, 2, 4, 2}, /* pawn to bishop 5 */
+ {1, 5, 0, 3}, /* check */
+ {2, 2, 3, 2},
+ {0, 3, 2, 4}, /* takes pawn */
+ {3, 2, 2, 2},
+ {2, 4, 0, 3},
+ {2, 2, 3, 2},
+ {6, 3, 6, 1}, /* rook takes bishop */
+ {6, 0, 7, 0},
+ {6, 1, 3, 1},
+ {3, 2, 2, 3},
+ {3, 1, 3, 3},
+ {0, 0, 2, 3},
+ }
+ },
+
+ /**
+ game 2:
+
+ K. A. L. Kubbel
+ White to play and win.
+
+ "Chess in the USSR"
+ 1936
+ */
+ {
+ {
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, BPAWN},
+ { 0, 0, 0, 0, BPAWN, KING, 0, BKING},
+ { 0, 0, 0, 0, 0, ROOK, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { 0,BBISHOP, 0, 0, BROOK, 0, PAWN, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0,BISHOP, 0, 0},
+ },
+
+ 10,
+
+ {
+ {3, 5, 6, 5},
+ {5, 1, 7, 3},
+ {6, 5, 6, 7}, /* check */
+ {7, 3, 3, 7},
+ {7, 5, 6, 4},
+ {5, 4, 6, 4},
+ {5, 6, 4, 6}, /* ! */
+ {6, 4, 6, 7},
+ {4, 6, 3, 6},
+ {0, 0, 2, 7}
+ }
+ },
+
+ /**
+ game 3:
+
+ J. Hasek
+ White to play and win.
+
+ "Le Strategie"
+ 1929
+ */
+ {
+ {
+ { 0, 0, 0, KNIGHT, 0, 0, 0, KNIGHT},
+ { 0, KING, BPAWN, BPAWN, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { 0, BKING, 0, 0, 0, 0, 0, 0},
+ { 0, PAWN, 0, 0, 0, BPAWN, 0, 0},
+ { PAWN, 0, PAWN, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ },
+
+ 11,
+
+ {
+ {0, 3, 2, 2},
+ {1, 3, 2, 2},
+ {0, 7, 2, 6},
+ {4, 5, 5, 5},
+ {2, 6, 3, 4},
+ {5, 5, 6, 5},
+ {3, 4, 5, 3}, /* ! */
+ {6, 5, 7, 5},
+ {5, 3, 6, 1},
+ {0, 0, 0, 0}, /* mull it over... */
+ {0, 0, 3, 1}
+ }
+ },
+
+ /**
+ game 4:
+
+ M.B. Newman
+ White to play and win.
+
+ "Chess Amateur"
+ 1913
+ */
+ {
+ {
+ { 0, 0, 0, 0, BQUEEN, 0, 0, 0},
+ {BKNIGHT, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, PAWN},
+ { BKING, 0, BISHOP, 0, KNIGHT, 0, 0, 0},
+ { PAWN, 0, 0, 0, KNIGHT, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { KING, 0, 0, 0, 0, 0, 0, 0},
+ },
+
+ 15,
+
+ {
+ {4, 2, 3, 1},
+ {0, 4, 3, 1}, /* queen wins bishop */
+ {4, 4, 5, 2},
+ {4, 0, 5, 0}, /* king takes pawn */
+ {5, 2, 3, 1}, /* knight takes queen, check */
+ {1, 0, 3, 1}, /* knight takes knight */
+ {3, 7, 2, 7}, /* pawn advances */
+ {3, 1, 2, 3},
+ {5, 4, 4, 2},
+ {2, 3, 4, 2},
+ {2, 7, 1, 7}, /* pawn advances */
+ {4, 2, 2, 3},
+ {1, 7, 0, 7},
+ {0, 0, 0, 0},
+ {0, 0, 5, 0}
+ }
+ },
+
+ /**
+ game 5:
+
+ V.A. Korolikov
+ White to play and win
+
+ First Prize - "Truda"
+ 1935
+ */
+ {
+ {
+ { 0, 0, BISHOP, 0, 0, 0, 0, 0},
+ { BPAWN, ROOK, 0, 0, 0, 0, 0, 0},
+ { 0, 0, BPAWN, PAWN, 0, BKING, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, KING, BBISHOP},
+ { 0, 0, 0, 0, BPAWN, 0, PAWN, 0},
+ { 0, 0, 0, 0, 0, BPAWN, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ },
+
+ 21,
+
+ {
+ {2, 3, 1, 3}, /* pawn to q7 */
+ {2, 5, 1, 4}, /* cover with king */
+ {1, 1, 0, 1},
+ {4, 7, 5, 6}, /* bishop takes pawn */
+ {0, 1, 0, 0}, /* r - r8 */
+ {6, 5, 7, 5}, /* queened */
+ {1, 3, 0, 3}, /* white pawn promoted */
+ {1, 4, 0, 3}, /* king takes queen */
+ {0, 2, 2, 0}, /* discovered check */
+ {5, 6, 0, 1}, /* pull back bishop */
+ {2, 0, 7, 5}, /* bishop takes queen */
+ {0, 3, 1, 2},
+ {7, 5, 2, 0}, /* save rook */
+ {5, 4, 6, 4},
+ {2, 0, 6, 4}, /* bishop takes pawn */
+ {1, 2, 1, 1}, /* king moves in */
+ {6, 4, 5, 5},
+ {1, 1, 0, 0},
+ {5, 5, 2, 2},
+ {0, 0, 0, 0},
+ {0, 0, 0, 0}
+ }
+ },
+
+ /**
+ game 6:
+
+ T.B. Gorgiev
+ White to play and win
+
+ First Prize - "64"
+ 1929
+ */
+ {
+ {
+ { 0, 0, 0, 0, 0, 0, KNIGHT, 0},
+ { BKNIGHT, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, BKING, BKNIGHT, 0, 0, 0},
+ { KING, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, KNIGHT, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, BISHOP, 0, 0, 0},
+ },
+
+ 13,
+
+ {
+ {3, 0, 2, 1}, /* king on move */
+ {1, 0, 0, 2}, /* check */
+ {2, 1, 1, 1},
+ {0, 2, 1, 4}, /* knight moves on */
+ {7, 4, 5, 6}, /* bishop puts king in check */
+ {2, 3, 1, 3}, /* king moves back */
+ {0, 6, 2, 5}, /* knight moves in, check */
+ {1, 3, 0, 3}, /* king moves back queen */
+ {5, 6, 1, 2}, /* bishop - b7 ch!! */
+ {2, 4, 1, 2}, /* black knight takes bishop */
+ {4, 6, 3, 4}, /* knight to k5 */
+ {0, 0, 0, 0}, /* mate */
+ {0, 0, 0, 0}
+ }
+ },
+
+ /**
+ game 7:
+
+ K. A. L. Kubbel
+ White to play and win
+
+ "Schachmatny Listok"
+ 1922
+ */
+ {
+ {
+ { 0, KNIGHT, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ { KING, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, 0, BKING, 0, 0, 0, 0},
+ { 0, 0, 0, BPAWN, 0, 0, 0, BISHOP},
+ { BPAWN, 0, 0, 0, 0, 0, 0, 0},
+ { 0, 0, PAWN, PAWN, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 0, 0, 0, 0},
+ },
+
+ 12,
+
+ {
+ {0, 1, 2, 2}, /* kt-b6 */
+ {3, 3, 2, 2}, /* k x kt */
+ {4, 7, 2, 5}, /* b-b6 */
+ {2, 2, 3, 3}, /* king back to original position */
+ {6, 3, 5, 3}, /* p-q3! */
+ {5, 0, 6, 0}, /* p-r7 */
+ {6, 2, 4, 2}, /* p-b4ch */
+ {3, 3, 3, 2}, /* king moves, black cannot capture in passing */
+ {2, 0, 1, 1}, /* k-kt7! */
+ {6, 0, 7, 0}, /* promo */
+ {2, 5, 1, 4}, /* mate */
+ {0, 0, 3, 2},
+ }
+ },
+};
+
+#endif /* __CHESSGAMES_H__ */
diff --git a/hacks/glx/chessmodels.c b/hacks/glx/chessmodels.c
new file mode 100644
index 0000000..7dd7eca
--- /dev/null
+++ b/hacks/glx/chessmodels.c
@@ -0,0 +1,1738 @@
+/*
+ * models for the xss chess screensavers
+ * hacked from:
+ *
+ * glChess - A 3D chess interface
+ *
+ * Copyright (C) 2006 John-Paul Gignac <jjgignac@users.sf.net>
+ *
+ * Copyright (C) 2002 Robert Ancell <bob27@users.sourceforge.net>
+ * Michael Duelli <duelli@users.sourceforge.net>
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* chessmodels.c: Contains the code for piece model creation */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include <math.h>
+#include <stdlib.h>
+
+#ifndef HAVE_JWXYZ
+# include <GL/glx.h>
+# include <GL/gl.h>
+#endif
+
+#ifdef HAVE_ANDROID
+#include <GLES/gl.h>
+#define Bool int
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#include "chessmodels.h"
+
+/* End of Data */
+#define ENDOFDATA 65535
+
+/* Section headers */
+#define SPIN 65534
+#define VERTICES 65533
+#define QUADS 65532
+#define TRIANGLES 65531
+#define POLARQUADSTRIP 65530
+#define QUADSTRIP 65529
+
+/* Special spin-related commands */
+#define SEAM 65528
+#define PATTERN 65527
+#define STEPUP 65526
+#define STEPDOWN 65525
+#define SETBACKREF 65524
+#define BACKREF 65523
+
+static unsigned short classic_pawn_data[] = {
+ SPIN,16,
+ 350,0,SEAM,350,200,SEAM,250,300,SEAM,250,400,SEAM,150,600,SEAM,100,880,
+ SEAM,180,880,SEAM,100,920,SEAM,200,1160,SEAM,100,1340,0,1340,
+ ENDOFDATA
+};
+
+static unsigned short classic_rook_data[] = {
+ SPIN,16,
+ 380,0,SEAM,380,200,SEAM,260,500,SEAM,200,1020,SEAM,280,1020,SEAM,280,1360,SEAM,220,1360,SEAM,220,1300,0,1300,
+ ENDOFDATA
+};
+
+static unsigned short classic_knight_data[] = {
+ SPIN,16,
+ 410,0,SEAM,410,200,SEAM,200,360,SEAM,200,480,260,580,
+
+ VERTICES,
+ 260,580,260, -260,580,260, -260,580,-80, 260,580,-80, 80,1620,400,
+ 100,1680,340, -100,1680,340, -80,1620,400, 100,1680,340, 100,1680,300,
+ -100,1680,300, -100,1680,340, 100,1680,300, 50,1680,160, -50,1680,160,
+ -100,1680,300, 50,1680,160, 100,1680,20, -100,1680,20, -50,1680,160,
+ 100,1680,20, 100,1680,-20, -100,1680,-20, -100,1680,20, 100,1680,-20,
+ 40,1680,-110, -40,1680,-110, -100,1680,-20, 40,1680,-110,
+ 100,1680,-200, -100,1680,-200, -40,1680,-110, 100,1680,-200,
+ 100,1680,-440, -100,1680,-440, -100,1680,-200, -100,1680,-440,
+ 100,1680,-440, 100,1500,-440, -100,1500,-440, -100,1500,-440,
+ 100,1500,-440, 55,1480,-280, -55,1480,-280, -100,1680,300, -50,1680,160,
+ -100,1400,130, -120,1380,240, -50,1680,160, -80,1680,20, -120,1380,20,
+ -100,1400,130, -83,1660,20, -80,1680,20, -100,1680,-20, -100,1660,-38,
+ -120,1380,20, -88,1620,20, -100,1620,-74, -120,1360,-20, -120,1360,-20,
+ -100,1620,-74, -100,1580,-110, -60,1400,-140, -100,1680,-200,
+ -55,1480,-280, -60,1400,-140, -100,1580,-110, -100,1680,-200,
+ -100,1680,-440, -100,1500,-440, -55,1480,-280, 100,1680,300,
+ 120,1380,240, 100,1400,130, 50,1680,160, 50,1680,160, 100,1400,130,
+ 120,1380,20, 80,1680,20, 83,1660,20, 100,1660,-38, 100,1680,-20,
+ 80,1680,20, 120,1380,20, 120,1360,-20, 100,1620,-74, 88,1620,20,
+ 120,1360,-20, 60,1400,-140, 100,1580,-110, 100,1620,-74, 100,1680,-200,
+ 100,1580,-110, 60,1400,-140, 55,1480,-280, 100,1680,-200, 55,1480,-280,
+ 100,1500,-440, 100,1680,-440, 88,1620,20, 100,1620,-74, 80,1640,-56,
+ 61,1640,20, 61,1640,20, 80,1640,-56, 100,1660,-38, 83,1660,20,
+ -88,1620,20, -61,1640,20, -80,1640,-56, -100,1620,-74, -61,1640,20,
+ -83,1660,20, -100,1660,-38, -80,1640,-56, 35,1780,-80, 35,1780,-440,
+ -35,1780,-440, -35,1780,-80, 35,1780,-80, 35,1680,-80, 35,1680,-440,
+ 35,1780,-440, -35,1780,-80, -35,1780,-440, -35,1680,-440, -35,1680,-80,
+ 35,1780,-80, -35,1780,-80, -35,1680,-80, 35,1680,-80, 35,1780,-440,
+ 35,1680,-440, -35,1680,-440, -35,1780,-440, -100,1400,130, -120,1380,20,
+ 120,1380,20, 100,1400,130, -100,1400,130, 100,1400,130, 120,1380,240,
+ -120,1380,240, -260,580,-80, -55,1480,-280, 0,1500,-360, 0,780,-400,
+ 260,580,-80, 0,780,-400, 0,1500,-360, 55,1480,-280, -50,1380,40,
+ -200,880,400, 200,880,400, 50,1380,40, -200,880,400, -260,580,260,
+ 260,580,260, 200,880,400, -50,1380,40, -140,1220,-40, -260,580,260,
+ -200,880,400, -140,1220,-40, -114,1220,-222, -260,580,-80, -260,580,260,
+ -55,1480,-280, -114,1220,-222, -140,1220,-40, -60,1400,-140,
+ 50,1380,40, 200,880,400, 260,580,260, 140,1220,-40, 140,1220,-40,
+ 260,580,260, 260,580,-80, 114,1220,-222, 55,1480,-280, 60,1400,-140,
+ 140,1220,-40, 114,1220,-222, 260,580,-80, 144,580,-260, 0,780,-400,
+ 144,580,-260, -144,580,-260, 0,780,-400, -260,580,-80, 0,780,-400,
+ -144,580,-260, 0,1400,400, 80,1620,400, -80,1620,400, 0,1400,400,
+ -80,1620,400, -120,1380,240, -120,1380,240, -80,1620,400, -100,1680,340,
+ -120,1380,240, -100,1680,340, -100,1680,300, 0,1400,400, 120,1380,240,
+ 80,1620,400, 120,1380,240, 100,1680,340, 80,1620,400, 120,1380,240,
+ 100,1680,300, 100,1680,340, 0,1400,400, -120,1380,240, 120,1380,240,
+ -60,1400,-140, -140,1220,-40, -45,1380,-20, -45,1380,-20, -140,1220,-40,
+ -50,1380,40, 60,1400,-140, 45,1380,-20, 140,1220,-40, 45,1380,-20,
+ 50,1380,40, 140,1220,-40, 60,1400,-140, 120,1360,-20, 45,1380,-20,
+ 50,1380,40, 45,1380,-20, 120,1360,-20, 50,1380,40, 120,1360,-20,
+ 120,1380,20, -60,1400,-140, -45,1380,-20, -120,1360,-20, -50,1380,40,
+ -120,1360,-20, -45,1380,-20, -50,1380,40, -120,1380,20, -120,1360,-20,
+ 88,1620,20, 61,1640,20, 83,1660,20, 100,1620,-74, 100,1660,-38,
+ 80,1640,-56, -88,1620,20, -83,1660,20, -61,1640,20, -100,1620,-74,
+ -80,1640,-56, -100,1660,-38, -40,1680,-110, -100,1680,-200,
+ -100,1580,-110, -100,1680,-20, -40,1680,-110, -100,1580,-110,
+ 40,1680,-110, 100,1580,-110, 100,1680,-200, 100,1680,-20, 100,1580,-110,
+ 40,1680,-110,
+
+ QUADS, 0,1,2,3, 4,5,6,7, 8,9,10,11, 12,13,14,15, 16,17,18,19,
+ 20,21,22,23, 24,25,26,27, 28,29,30,31, 32,33,34,35, 36,37,38,39,
+ 40,41,42,43, 44,45,46,47, 48,49,50,51, 52,53,54,55, 56,57,58,59,
+ 60,61,62,63, 64,65,66,67, 68,69,70,71, 72,73,74,75, 76,77,78,79,
+ 80,81,82,83, 84,85,86,87, 88,89,90,91, 92,93,94,95, 96,97,98,99,
+ 100,101,102,103, 104,105,106,107, 108,109,110,111, 112,113,114,115,
+ 116,117,118,119, 120,121,122,123, 124,125,126,127, 128,129,130,131,
+ 132,133,134,135, 136,137,138,139, 140,141,142,143, 144,145,146,147,
+ 148,149,150,151, 152,153,154,155, 156,157,158,159, 160,161,162,163,
+ 164,165,166,167, 168,169,170,171, 172,173,174,175, 176,177,178,179,
+ 180,181,182,183,
+
+ TRIANGLES, 184,185,186, 187,188,189, 190,191,192, 193,194,195,
+ 196,197,198, 199,200,201, 202,203,204, 205,206,207, 208,209,210,
+ 211,212,213, 214,215,216, 217,218,219, 220,221,222, 223,224,225,
+ 226,227,228, 229,230,231, 232,233,234, 235,236,237, 238,239,240,
+ 241,242,243, 244,245,246, 247,248,249, 250,251,252, 253,254,255,
+ 256,257,258, 259,260,261, 262,263,264, 265,266,267, 268,269,270,
+
+ ENDOFDATA
+};
+
+static unsigned short classic_bishop_data[] = {
+ SPIN,16,
+ 400,0,SEAM,400,200,SEAM,250,300,SEAM,250,400,SEAM,150,700,SEAM,120,940,
+ SEAM,250,940,SEAM,170,1100,SEAM,170,1220,SEAM,220,1320,SEAM,220,1480,
+ SEAM,100,1600,SEAM,80,1700,SEAM,120,1770,SEAM,80,1840,0,1840,
+ ENDOFDATA
+};
+
+static unsigned short classic_queen_data[] = {
+ SPIN,16,
+ 480,0,SEAM,480,220,SEAM,340,400,SEAM,340,500,SEAM,180,800,SEAM,140,1180,
+ SEAM,290,1180,SEAM,180,1360,SEAM,180,1520,SEAM,200,1780,SEAM,270,1920,
+ SEAM,240,2000,SEAM,170,2000,SEAM,95,2080,SEAM,70,2080,SEAM,90,2140,
+ SEAM,70,2200,0,2200,
+ ENDOFDATA
+};
+
+static unsigned short classic_king_data[] = {
+ SPIN,16,
+ 500,0,SEAM,500,200,SEAM,350,300,SEAM,350,460,SEAM,200,760,SEAM,140,1260,
+ SEAM,300,1260,SEAM,200,1460,SEAM,200,1560,SEAM,280,1910,SEAM,160,1970,
+ SEAM,160,2010,0,2010,
+
+ VERTICES,
+ -30,2010,35, 30,2010,35, 30,2310,35, -30,2310,35, -90,2110,35,
+ -30,2110,35, -30,2210,35, -90,2210,35, 90,2110,35, 90,2210,35,
+ 30,2210,35, 30,2110,35, 30,2010,-35, -30,2010,-35, -30,2310,-35,
+ 30,2310,-35, -30,2110,-35, -90,2110,-35, -90,2210,-35, -30,2210,-35,
+ 30,2110,-35, 30,2210,-35, 90,2210,-35, 90,2110,-35, -90,2110,35,
+ -90,2210,35, -90,2210,-35, -90,2110,-35, -30,2010,35, -30,2110,35,
+ -30,2110,-35, -30,2010,-35, -30,2210,30, -30,2310,30, -30,2310,-30,
+ -30,2210,-30, 90,2110,-35, 90,2210,-35, 90,2210,35, 90,2110,35,
+ 30,2010,-35, 30,2110,-35, 30,2110,35, 30,2010,35, 30,2210,-35,
+ 30,2310,-35, 30,2310,35, 30,2210,35, -90,2210,-35, -90,2210,35,
+ -30,2210,35, -30,2210,-35, 30,2210,-35, 30,2210,35, 90,2210,35,
+ 90,2210,-35, -30,2310,-35, -30,2310,35, 30,2310,35, 30,2310,-35,
+
+ QUADS, 0,1,2,3, 4,5,6,7, 8,9,10,11, 12,13,14,15, 16,17,18,19,
+ 20,21,22,23, 24,25,26,27, 28,29,30,31, 32,33,34,35, 36,37,38,39,
+ 40,41,42,43, 44,45,46,47, 48,49,50,51, 52,53,54,55, 56,57,58,59,
+
+ ENDOFDATA
+};
+
+static unsigned short knight_data[] = {
+ VERTICES, SETBACKREF,0, 7910,8863,0, 7790,8863,1326, 7433,8863,2611,
+ 6850,8863,3817, 6059,8863,4907, 5084,8863,5847, 3955,8863,6611,
+ 2705,8863,7173, 1373,8863,7517, 0,8863,7633, -1373,8863,7517,
+ -2705,8863,7173, -3955,8863,6611, -5084,8863,5847, -6059,8863,4907,
+ -6850,8863,3817, -7433,8863,2611, -7790,8863,1326, -7910,8863,0,
+ -7790,8863,-1326, -7433,8863,-2611, -6850,8863,-3817,
+ -6059,8863,-4907, -5066,8863,-5896, -3955,8863,-6611,
+ -2705,8863,-7173, -1373,8863,-7517, 0,8863,-7633, 1373,8863,-7517,
+ 2705,8863,-7173, 3955,8863,-6611, 5066,8863,-5896, 6059,8863,-4907,
+ 6850,8863,-3817, 7433,8863,-2611, 7790,8863,-1326, -1183,11744,7939,
+ -1183,12003,7939, -1183,14019,6547, -1183,16307,5288,
+ -1183,16555,5281, -1183,20128,2191, -1134,20304,2131,
+ -1183,20516,2156, -1417,21874,1842, -1417,23109,2185,
+ -1417,23961,3121, -1417,24001,4252, 0,23917,5637, -1418,23893,5418,
+ -1151,23389,6664, -1151,23501,6906, -1151,23806,6987,
+ -1151,24102,6987, -1151,24209,7189, -1151,24371,7513,
+ -1151,24605,7715, -1151,24939,7674, -1313,25568,7149,
+ -1313,25695,7149, -1598,26707,7610, 0,26837,7841, 0,27354,8076,
+ -1598,27262,7839, -1598,27842,7723, 0,27919,7998, 0,28449,7606,
+ -1598,28309,7303, -1302,28414,6723, 0,28544,6980, 0,28540,6197,
+ -1187,28523,5990, -1304,28447,4204, -1158,28789,1627,
+ -561,28931,-1220, -357,29608,-1244, -357,30527,-1441,
+ -357,31249,-1837, -357,31511,-2627, -357,31511,-3484,
+ -357,31118,-4143, -357,30264,-4538, -436,29406,-5256, 0,29409,-5243,
+ -2207,29018,-6763, -914,28658,-6964, 0,26292,-7237, -1305,26324,-7143,
+ -806,23401,-6784, -812,20723,-6228, -796,16757,-6210,
+ -1559,24934,7435, -1566,24633,7460, -1531,24429,7334,
+ -1475,24293,7131, -1440,24203,7004, -1372,23935,7015,
+ -1364,23606,6868, -1389,23515,6705, -1687,28010,6952,
+ -1687,27926,7343, -1687,27629,7491, -1687,27324,7552,
+ -1687,27032,7432, -1687,26791,7148, -1642,27135,7165,
+ -1642,27254,7304, -1642,27397,7364, -1642,27546,7334,
+ -1642,27693,7261, -1642,27737,7088, -1611,10591,8159,
+ -888,9327,-8560, -4491,13292,1032, -3840,15084,786, -3412,17397,397,
+ -2937,20005,-35, -5108,11669,1240, -6344,10251,1395, -6345,10246,1248,
+ -5109,11664,1092, -2964,20022,-132, -3413,17393,250, -3841,15079,638,
+ -4491,13288,885, -3743,13207,-535, -3085,15092,-710, -2727,17642,-878,
+ -2569,20636,-797, -4348,11575,-324, -5584,10108,-169,
+ -5403,10079,-1732, -4167,11644,-1888, -2465,20842,-2651,
+ -2522,18130,-2392, -2905,15407,-2077, -3562,13227,-1951,
+ -3901,13568,-3294, -3243,15993,-3519, -2861,18863,-3735,
+ -2776,22447,-4309, -4486,11792,-3132, -5783,9930,-2931,
+ -5783,9930,-3054, -4486,11792,-3255, -2776,22438,-4430,
+ -2861,18863,-3858, -3243,15993,-3641, -3901,13568,-3417,
+ -6199,9466,4558, -5766,10642,5726, -5228,11829,6090, -4801,12891,6048,
+ -4155,14560,5246, -3546,16847,3719, -3334,17643,2937,
+ -2860,20062,1230, -4822,12054,7102, -5325,10909,7208,
+ -5732,9938,6026, -4026,14701,5522, -2852,20170,1447, -3319,17801,3175,
+ -3538,16955,3935, -4090,13256,1679, -2874,20073,676, -3706,15083,1464,
+ -3301,17348,1117, -5931,10206,1996, -4695,11624,1840,
+ -4445,11658,2844, -5681,10240,3000, -3074,17398,2202,
+ -3456,15117,2468, -3840,13290,2683, -4642,13358,4019,
+ -4257,15194,3908, -6017,10188,3746, -5237,11714,4039,
+ -5621,11218,5077, -5026,12862,5058, -5134,10861,-3154,
+ -4193,12680,-3336, -2832,20609,-4118, -3052,17428,-3750,
+ -3572,14780,-3529, -3579,14774,-3623, -3059,17422,-3843,
+ -2839,20596,-4211, -4200,12674,-3429, -5141,10855,-3248,
+ -3908,13562,-3510, -3250,15987,-3735, -2868,18857,-3952,
+ -4492,11786,-3348, -5789,9924,-3148, -4817,11321,-3298,
+ -5465,10389,-3198, -4054,13118,-3470, -4346,12230,-3389,
+ -2853,19681,-4056, -2825,21511,-4367, -3155,16705,-3789,
+ -2963,18140,-3897, -3744,14168,-3567, -3415,15381,-3679,
+ -845,13482,-6604, -945,10997,-7893, -981,11110,-7735,
+ -859,13469,-6526, -899,9307,-8439, -813,16486,-6146, -832,20681,-6100,
+ -826,23358,-6656, -882,10149,-8148, -913,12323,-7139,
+ -822,14910,-6353, -817,18235,-6210, -827,21937,-6382,
+ -846,21937,-6341, -841,14912,-6313, -931,12326,-7098,
+ -901,10152,-8107, -844,23359,-6615, -851,20681,-6059,
+ -831,16487,-6105, -919,9307,-8399, -869,13482,-6492, -999,11113,-7694,
+ -860,9726,-8255, -942,10578,-7958, -962,11715,-7413, -900,12896,-6796,
+ -863,14065,-6404, -818,15760,-6221, -828,17367,-6171,
+ -854,19800,-5994, -848,21309,-6200, -843,22566,-6482,
+ -3407,15409,-3785, -3736,14196,-3673, -2911,18365,-4048,
+ -3147,16733,-3895, -2726,21608,-4455, -2808,19905,-4191,
+ -4338,12259,-3495, -4046,13146,-3576, -5457,10418,-3304,
+ -4809,11349,-3404, -4484,11815,-3454, -2715,22288,-4534,
+ -2832,19035,-4066, -3242,16015,-3841, -3900,13590,-3616,
+ -5133,10883,-3354, -4171,12742,-3524, -2803,20773,-4339,
+ -3051,17450,-3949, -3571,14803,-3729, -4979,11072,-3368,
+ -5619,10185,-3279, -4119,12924,-3556, -4411,12037,-3475,
+ -2801,20363,-4269, -2721,21826,-4489, -3099,17092,-3922,
+ -2887,18618,-4038, -3653,14499,-3701, -3325,15712,-3813,
+ -3489,15106,-3757, -3818,13893,-3645, -3011,17758,-3971,
+ -3194,16374,-3868, -2755,21085,-4385, -2815,19494,-4139,
+ -4265,12481,-3515, -3973,13368,-3596, -5304,10595,-3318,
+ -4664,11477,-3407, -5441,10207,-3361, -5350,10338,-3375,
+ -5139,10672,-3428, -5058,10742,-3431, -4831,11101,-3457,
+ -4742,11228,-3470, -4516,11559,-3504, -4423,11693,-3518,
+ -4277,12079,-3558, -4232,12180,-3571, -4138,12522,-3597,
+ -4094,12603,-3609, -3979,12935,-3675, -3943,13043,-3671,
+ -3852,13383,-3699, -3813,13496,-3705, -3692,13947,-3767,
+ -3653,14073,-3790, -3506,14587,-3772, -3467,14685,-3777,
+ -3349,15192,-3888, -3308,15317,-3887, -3162,15800,-3957,
+ -3119,15954,-3961, -3009,16528,-3946, -3002,16637,-3937,
+ -2914,17260,-4014, -2909,17347,-4006, -2834,17893,-4049,
+ -2813,18060,-4060, -2760,18849,-4232, -2746,18968,-4242,
+ -850,22569,-6438, -855,21313,-6156, -861,19804,-5949,
+ -834,17371,-6127, -824,15765,-6176, -869,14070,-6360,
+ -906,12901,-6751, -968,11720,-7368, -948,10645,-7895, -865,9731,-8211,
+ -1006,11164,-7630, -875,13487,-6447, -926,9310,-8354,
+ -837,16490,-6061, -857,20684,-6015, -867,23379,-6515,
+ -907,10157,-8062, -937,12331,-7053, -847,14917,-6268,
+ -842,18236,-6111, -852,21941,-6297, -885,9891,-8156, -985,10905,-7724,
+ -947,11969,-7255, -885,13125,-6649, -858,14493,-6314,
+ -839,16049,-6111, -836,17735,-6083, -859,20244,-5982,
+ -891,21559,-6157, -848,22883,-6508, -851,22255,-6367,
+ -856,20999,-6085, -867,19042,-6000, -836,16930,-6094,
+ -835,15341,-6222, -880,13646,-6405, -916,12540,-6953,
+ -981,11337,-7564, -927,10370,-7988, -932,9518,-8285, -931,9583,-8174,
+ -863,9671,-8145, -892,9982,-8037, -903,10075,-7996, -952,10454,-7865,
+ -961,10550,-7832, -1008,10963,-7617, -1018,11105,-7567,
+ -996,11458,-7405, -992,11582,-7342, -972,12080,-7057,
+ -968,12210,-6984, -935,12620,-6792, -931,12759,-6714,
+ -914,13199,-6441, -910,13346,-6359, -915,13767,-6194,
+ -910,13941,-6175, -890,14633,-6107, -886,14783,-6091,
+ -864,15476,-6035, -859,15645,-6017, -870,16062,-5957,
+ -873,16231,-5936, -853,17048,-5965, -861,17185,-5974,
+ -879,17812,-5997, -885,17961,-5997, -851,18486,-6138,
+ -865,18526,-5933, -872,18761,-5875, -870,19337,-5971,
+ -864,19470,-5784, -937,19590,-5786, -833,19023,-6126,
+ -851,20344,-5894, -851,20576,-5912, -855,21086,-5973,
+ -854,21224,-6003, -871,21651,-6070, -852,21853,-6116,
+ -850,22332,-6224, -849,22490,-6259, -831,22924,-6338,
+ -834,23240,-6364, -2743,19661,-4287, -2740,19863,-4312,
+ -2723,20501,-4469, -2705,20711,-4503, -2661,21262,-4565,
+ -2658,21427,-4593, -2687,22088,-4631, -2695,22209,-4643,
+ -2774,23170,-4392, -2633,23103,-4527, -2681,22439,-4516,
+ -2656,22665,-4573, -2552,22727,-4653, -2534,23015,-4628,
+ -2607,23397,-4556, -2759,23681,-4398, -2740,24136,-4370,
+ -2610,24100,-4580, -2412,24481,-5089, -2671,24389,-4569,
+ -2397,24935,-5652, -2562,25022,-5528, -939,23708,-6566,
+ -1009,24359,-6776, -1095,24912,-6886, -1049,24117,-6493,
+ -990,23894,-6415, -2290,23837,-4814, -2312,23612,-4723,
+ -2183,24804,-5574, -2191,24632,-5391, -1156,24771,-6650,
+ -1154,24624,-6586, -1104,24526,-6656, -1281,9161,-8432,
+ -2524,9161,-8046, -3691,9161,-7572, -4745,9161,-6945,
+ -5662,9127,-6096, -3697,9192,-7581, -2531,9192,-8056,
+ -4753,9183,-6951, -5664,9161,-6101, -5664,9185,-6101,
+ -4753,9207,-6951, -2531,9216,-8055, -3697,9216,-7581,
+ -3684,9232,-7560, -2518,9232,-8034, -4740,9223,-6930,
+ -5651,9200,-6080, -2828,20259,1366, -2798,20256,1187, -2820,20237,692,
+ -2843,20292,-25, -2874,20473,735, -2975,20508,90, -2474,20772,-759,
+ -2660,20879,-691, -2471,21553,-1445, -2498,22175,-1940,
+ -2471,24346,-2830, -2556,22373,-1903, -2528,21595,-1351,
+ -2493,24314,-2936, -2576,22239,-2123, -2548,21461,-1571,
+ -2823,20635,1307, -2741,20503,1328, -1490,23972,5392,
+ -1489,24080,4226, -1489,24040,3095, -1489,23188,2159,
+ -1489,21953,1816, -2479,22156,182, -1515,23830,2117, -1605,24415,3131,
+ -1599,24460,4263, -1580,24357,5431, -1448,23885,6743,
+ -1252,24770,5442, -1271,24873,4274, -1277,24828,3142,
+ -1389,24618,2016, -1479,24733,1993, -1301,25010,3165,
+ -1295,25055,4297, -1391,24890,5460, -1512,25216,5507,
+ -1602,25353,4317, -1608,25308,3186, -1979,23458,-29, -1320,25312,1928,
+ -1495,25055,546, -2438,25790,-488, -1605,25585,5599, -1583,26793,6150,
+ -1850,26272,4298, -1578,27435,7117, -1658,27625,6884,
+ -1671,27398,6846, -1678,27176,6937, -1715,27784,6626,
+ -1744,27323,6551, -1753,26904,6776, -1884,28809,-1688,
+ -1555,28655,1620, -1658,28252,4204, -1581,28263,5997,
+ -1567,28312,6790, -1935,27827,4220, -1818,28249,1603,
+ -1570,27742,6195, -1532,27288,6120, -2038,27074,4245, -1418,28416,228,
+ -413,30264,-4539, -424,31094,-4152, -418,31478,-3497,
+ -410,31453,-2653, -410,31190,-1863, -410,30468,-1467,
+ -410,29550,-1270, -411,31041,-1902, -448,31253,-2696,
+ -449,31323,-3466, -425,31182,-3496, -411,31060,-2738,
+ -387,30899,-1932, -316,30806,-1957, -335,30952,-2766,
+ -353,31089,-3521, -322,31007,-3540, -303,30871,-2786,
+ -284,30725,-1976, -304,30630,-1993, -323,30776,-2802,
+ -342,30912,-3557, -396,30843,-3565, -378,30707,-2811,
+ -358,30561,-2001, -414,30477,-2013, -433,30623,-2822,
+ -452,30759,-3576, -474,30560,-3616, -456,30424,-2861,
+ -436,30278,-2052, -349,30194,-2077, -368,30340,-2886,
+ -386,30477,-3641, -309,30389,-3665, -291,30253,-2911,
+ -271,30107,-2102, -267,29996,-2124, -286,30142,-2933,
+ -305,30278,-3688, -376,30179,-3700, -357,30043,-2945,
+ -338,29897,-2136, -420,29789,-2150, -439,29935,-2959,
+ -458,30071,-3713, -500,29883,-3751, -463,29601,-2187,
+ -470,30974,-4049, -462,30153,-4391, -466,30563,-4220,
+ -410,30009,-1368, -725,29372,-3225, -677,29335,-5130,
+ -908,29205,-3300, -632,29533,-4803, -2587,28768,-3408,
+ -2730,28611,-3456, -2404,28568,-6916, -2413,28849,-6612,
+ -1904,26715,1801, -1394,25919,831, -2224,27270,-3994,
+ -2730,28438,-3011, -2587,28570,-2864, -2826,28152,-3163,
+ -2476,28668,-6523, -2476,28433,-6776, -2787,28338,-3507,
+ -2216,27658,-3972, -2207,27950,-5907, -2311,28216,-6128,
+ -2320,27876,-3971, -2311,28118,-6301, -2311,27845,-6252,
+ -2320,27703,-3749, -2320,27084,-3798, -2320,26986,-4070,
+ -2698,26705,-4014, -2557,26974,-3547, -2557,27739,-3485,
+ -2572,27738,-6362, -2436,28204,-6533, -2436,28421,-6303,
+ -2556,28092,-3822, -2431,28142,-6975, -2544,27863,-6726,
+ -2266,28229,-1686, -1939,28156,-1065, -2569,27943,-2270,
+ -2381,27545,-1682, -2799,27594,-3104, -2750,27866,-2738,
+ -2539,27578,-6309, -2720,26853,-3133, -2788,26461,-3776,
+ -1061,27543,-7078, -1780,27941,135, -1859,27747,-527, -1756,27784,691,
+ -1855,27001,736, -1950,26711,19, -1964,27006,-630, -2342,26955,-1898,
+ -2595,25515,-3113, -2147,27855,132, -2126,27722,601, -2213,27691,-428,
+ -2210,27061,639, -2290,26816,34, -2302,27065,-515, -2347,27680,100,
+ -2335,27602,376, -2386,27584,-229, -2385,27213,398, -2432,27069,42,
+ -2439,27215,-281, -2481,27452,103, -1786,24263,399, -2278,24851,-562,
+ -2372,25143,-1163, 7383,9172,0, 7270,9172,-1487, 6937,9172,-2929,
+ 6393,9172,-4281, 1282,9172,-8433, 0,9172,-8563, 1301,9439,8159,
+ 2371,9313,7844, 3857,9286,7355, 4477,9172,6559, 5704,9174,5179,
+ 6393,9172,4281, 6937,9172,2929, 7270,9172,1487, -7270,9172,-1487,
+ -6937,9172,-2929, -6393,9172,-4281, -1282,9172,-8433, 0,9339,8274,
+ -1301,9439,8159, -2371,9313,7844, -3857,9286,7355, -4477,9172,6559,
+ -5704,9174,5179, -6393,9172,4281, -6937,9172,2929, -7270,9172,1487,
+ -796,9467,8260, 0,9503,8356, 0,9667,8438, -796,9666,8325,
+ -807,10584,8327, -7383,9172,0, 796,9467,8260, 796,9666,8325,
+ 807,10584,8327, 0,10584,8457, 0,11744,8130, 1183,11744,7939,
+ 1183,12003,7939, 0,12003,8130, 0,14019,6737, 1183,14019,6547,
+ 1183,16307,5288, 0,16307,5479, 0,16555,5472, 1183,16555,5281,
+ 1183,20128,2191, 0,20128,2382, 0,20304,2322, 1134,20304,2131,
+ 1183,20516,2156, 0,20516,2346, 0,21898,2060, 1417,21874,1842,
+ 1417,23109,2185, 0,23133,2404, 0,23985,3339, 1417,23961,3121,
+ 1417,24001,4252, 0,24025,4470, 1418,23893,5418, 1151,23389,6664,
+ 0,23394,6882, 0,23506,7125, 1151,23501,6906, 1151,23806,6987,
+ 0,23811,7205, 0,24107,7205, 1151,24102,6987, 1151,24209,7189,
+ 0,24213,7407, 0,24376,7731, 1151,24371,7513, 1151,24605,7715,
+ 0,24610,7933, 0,24944,7892, 1151,24939,7674, 1313,25568,7149,
+ 0,25562,7367, 0,25689,7367, 1313,25695,7149, 1598,26707,7610,
+ 1598,27262,7839, 1598,27842,7723, 1598,28309,7303, 1302,28414,6723,
+ 1187,28523,5990, 1304,28447,4204, 0,28469,4435, 0,28654,1893,
+ 1158,28789,1627, 561,28931,-1220, 0,29310,-864, 0,29574,-1062,
+ 357,29608,-1244, 357,30527,-1441, 0,30496,-1259, 0,31221,-1655,
+ 357,31249,-1837, 357,31511,-2627, 0,31485,-2445, 0,31485,-3302,
+ 357,31511,-3484, 357,31118,-4143, 0,31089,-3961, 0,30233,-4356,
+ 357,30264,-4538, 436,29406,-5256, 0,29018,-6407, 2207,29018,-6763,
+ 914,28658,-6964, 0,28472,-7040, 1305,26324,-7143, 806,23401,-6784,
+ 0,23246,-6890, 0,20735,-6319, 812,20723,-6228, 796,16757,-6210,
+ 0,17171,-6133, 1559,24934,7435, 1566,24633,7460, 1531,24429,7334,
+ 1475,24293,7131, 1440,24203,7004, 1372,23935,7015, 1364,23606,6868,
+ 1389,23515,6705, 1687,28010,6952, 1687,27926,7343, 1687,27629,7491,
+ 1687,27324,7552, 1687,27032,7432, 1687,26791,7148, 1642,27135,7165,
+ 1642,27254,7304, 1642,27397,7364, 1642,27546,7334, 1642,27693,7261,
+ 1642,27737,7088, 1611,10591,8159, 888,9327,-8560, 4491,13292,1032,
+ 3840,15084,786, 3412,17397,397, 2937,20005,-35, 5108,11669,1240,
+ 6344,10251,1395, 6345,10246,1248, 5109,11664,1092, 2964,20022,-132,
+ 3413,17393,250, 3841,15079,638, 4491,13288,885, 3743,13207,-535,
+ 3085,15092,-710, 2727,17642,-878, 2569,20636,-797, 4348,11575,-324,
+ 5584,10108,-169, 5403,10079,-1732, 4167,11644,-1888,
+ 2465,20842,-2651, 2522,18130,-2392, 2905,15407,-2077,
+ 3562,13227,-1951, 3901,13568,-3294, 3243,15993,-3519,
+ 2861,18863,-3735, 2776,22447,-4309, 4486,11792,-3132, 5783,9930,-2931,
+ 5783,9930,-3054, 4486,11792,-3255, 2776,22438,-4430, 2861,18863,-3858,
+ 3243,15993,-3641, 3901,13568,-3417, 6199,9466,4558, 5766,10642,5726,
+ 5228,11829,6090, 4801,12891,6048, 4155,14560,5246, 3546,16847,3719,
+ 3334,17643,2937, 2860,20062,1230, 4822,12054,7102, 5325,10909,7208,
+ 5732,9938,6026, 4026,14701,5522, 2852,20170,1447, 3319,17801,3175,
+ 3538,16955,3935, 4090,13256,1679, 2874,20073,676, 3706,15083,1464,
+ 3301,17348,1117, 5931,10206,1996, 4695,11624,1840, 4445,11658,2844,
+ 5681,10240,3000, 3074,17398,2202, 3456,15117,2468, 3840,13290,2683,
+ 4642,13358,4019, 4257,15194,3908, 6017,10188,3746, 5237,11714,4039,
+ 5621,11218,5077, 5026,12862,5058, 5134,10861,-3154, 4193,12680,-3336,
+ 2832,20609,-4118, 3052,17428,-3750, 3572,14780,-3529,
+ 3579,14774,-3623, 3059,17422,-3843, 2839,20596,-4211,
+ 4200,12674,-3429, 5141,10855,-3248, 3908,13562,-3510,
+ 3250,15987,-3735, 2868,18857,-3952, 4492,11786,-3348, 5789,9924,-3148,
+ 4817,11321,-3298, 5465,10389,-3198, 4054,13118,-3470,
+ 4346,12230,-3389, 2853,19681,-4056, 2825,21511,-4367,
+ 3155,16705,-3789, 2963,18140,-3897, 3744,14168,-3567,
+ 3415,15381,-3679, 0,14037,-6616, 845,13482,-6604, 945,10997,-7893,
+ 0,11066,-7866, 981,11110,-7735, 859,13469,-6526, 899,9307,-8439,
+ 813,16486,-6146, 832,20681,-6100, 826,23358,-6656, 882,10149,-8148,
+ 913,12323,-7139, 822,14910,-6353, 817,18235,-6210, 827,21937,-6382,
+ 846,21937,-6341, 841,14912,-6313, 931,12326,-7098, 901,10152,-8107,
+ 844,23359,-6615, 851,20681,-6059, 831,16487,-6105, 919,9307,-8399,
+ 869,13482,-6492, 999,11113,-7694, 860,9726,-8255, 942,10578,-7958,
+ 962,11715,-7413, 900,12896,-6796, 863,14065,-6404, 818,15760,-6221,
+ 828,17367,-6171, 854,19800,-5994, 848,21309,-6200, 843,22566,-6482,
+ 3407,15409,-3785, 3736,14196,-3673, 2911,18365,-4048,
+ 3147,16733,-3895, 2726,21608,-4455, 2808,19905,-4191,
+ 4338,12259,-3495, 4046,13146,-3576, 5457,10418,-3304,
+ 4809,11349,-3404, 4484,11815,-3454, 2715,22288,-4534,
+ 2832,19035,-4066, 3242,16015,-3841, 3900,13590,-3616,
+ 5133,10883,-3354, 4171,12742,-3524, 2803,20773,-4339,
+ 3051,17450,-3949, 3571,14803,-3729, 4979,11072,-3368,
+ 5619,10185,-3279, 4119,12924,-3556, 4411,12037,-3475,
+ 2801,20363,-4269, 2721,21826,-4489, 3099,17092,-3922,
+ 2887,18618,-4038, 3653,14499,-3701, 3325,15712,-3813,
+ 3489,15106,-3757, 3818,13893,-3645, 3011,17758,-3971,
+ 3194,16374,-3868, 2755,21085,-4385, 2815,19494,-4139,
+ 4265,12481,-3515, 3973,13368,-3596, 5304,10595,-3318,
+ 4664,11477,-3407, 5441,10207,-3361, 5350,10338,-3375,
+ 5139,10672,-3428, 5058,10742,-3431, 4831,11101,-3457,
+ 4742,11228,-3470, 4516,11559,-3504, 4423,11693,-3518,
+ 4277,12079,-3558, 4232,12180,-3571, 4138,12522,-3597,
+ 4094,12603,-3609, 3979,12935,-3675, 3943,13043,-3671,
+ 3852,13383,-3699, 3813,13496,-3705, 3692,13947,-3767,
+ 3653,14073,-3790, 3506,14587,-3772, 3467,14685,-3777,
+ 3349,15192,-3888, 3308,15317,-3887, 3162,15800,-3957,
+ 3119,15954,-3961, 3009,16528,-3946, 3002,16637,-3937,
+ 2914,17260,-4014, 2909,17347,-4006, 2834,17893,-4049,
+ 2813,18060,-4060, 2760,18849,-4232, 2746,18968,-4242, 850,22569,-6438,
+ 855,21313,-6156, 860,19804,-5949, 834,17371,-6127, 824,15765,-6176,
+ 869,14070,-6360, 906,12901,-6751, 968,11720,-7368, 948,10645,-7895,
+ 865,9731,-8211, 1006,11164,-7630, 875,13487,-6447, 926,9310,-8354,
+ 837,16490,-6061, 857,20684,-6015, 867,23379,-6515, 907,10157,-8062,
+ 937,12331,-7053, 847,14917,-6268, 842,18236,-6111, 852,21941,-6297,
+ 885,9891,-8156, 985,10905,-7724, 947,11969,-7255, 885,13125,-6649,
+ 858,14493,-6314, 839,16049,-6111, 836,17735,-6083, 859,20244,-5982,
+ 891,21559,-6157, 848,22883,-6508, 851,22255,-6367, 856,20999,-6085,
+ 867,19042,-6000, 836,16930,-6094, 835,15341,-6222, 880,13646,-6405,
+ 916,12540,-6953, 981,11337,-7564, 927,10370,-7988, 932,9518,-8285,
+ 931,9583,-8174, 863,9671,-8145, 892,9982,-8037, 903,10075,-7996,
+ 952,10454,-7865, 961,10550,-7832, 1008,10963,-7617, 1018,11105,-7567,
+ 996,11458,-7405, 992,11582,-7342, 972,12080,-7057, 968,12210,-6984,
+ 935,12620,-6792, 931,12759,-6714, 914,13199,-6441, 910,13346,-6359,
+ 915,13767,-6194, 910,13941,-6175, 890,14633,-6107, 886,14783,-6091,
+ 864,15476,-6035, 859,15645,-6017, 870,16062,-5957, 873,16231,-5936,
+ 853,17048,-5965, 861,17185,-5974, 879,17812,-5997, 885,17961,-5997,
+ 851,18486,-6138, 865,18526,-5933, 872,18761,-5875, 870,19337,-5971,
+ 864,19470,-5784, 937,19590,-5786, 833,19023,-6126, 851,20344,-5894,
+ 851,20576,-5912, 855,21086,-5973, 854,21224,-6003, 871,21651,-6070,
+ 852,21853,-6116, 850,22332,-6224, 849,22490,-6259, 831,22924,-6338,
+ 834,23240,-6364, 2743,19661,-4287, 2740,19863,-4312, 2723,20501,-4469,
+ 2705,20711,-4503, 2661,21262,-4565, 2658,21427,-4593,
+ 2687,22088,-4631, 2695,22209,-4643, 2774,23170,-4392,
+ 2633,23103,-4527, 2681,22439,-4516, 2656,22665,-4573,
+ 2552,22727,-4653, 2534,23015,-4628, 2607,23397,-4556,
+ 2759,23681,-4398, 2740,24136,-4370, 2610,24100,-4580,
+ 2412,24481,-5089, 2671,24389,-4569, 2397,24935,-5652,
+ 2562,25022,-5528, 939,23708,-6566, 1009,24359,-6776, 1095,24912,-6886,
+ 1049,24117,-6493, 990,23894,-6415, 2290,23837,-4814, 2312,23612,-4723,
+ 2183,24804,-5574, 2191,24632,-5391, 1156,24771,-6650,
+ 1154,24624,-6586, 1104,24526,-6656, 0,9161,-8562, 1281,9161,-8432,
+ 2524,9161,-8046, 3691,9161,-7572, 4745,9161,-6945, 5662,9127,-6096,
+ 3697,9192,-7581, 2531,9192,-8056, 4753,9183,-6951, 5664,9161,-6101,
+ 5664,9185,-6101, 4753,9207,-6951, 2531,9216,-8055, 3697,9216,-7581,
+ 3684,9232,-7560, 2518,9232,-8034, 4740,9223,-6930, 5651,9200,-6080,
+ 2828,20259,1366, 2798,20256,1187, 2820,20237,692, 2843,20292,-25,
+ 2874,20473,735, 2975,20508,90, 2474,20772,-759, 2660,20879,-691,
+ 2471,21553,-1445, 2498,22175,-1940, 2471,24346,-2830,
+ 2556,22373,-1903, 2528,21595,-1351, 2493,24314,-2936,
+ 2576,22239,-2123, 2548,21461,-1571, 2823,20635,1307, 2741,20503,1328,
+ 1490,23972,5392, 1489,24080,4226, 1489,24040,3095, 1489,23188,2159,
+ 1489,21953,1816, 2479,22156,182, 1515,23830,2117, 1605,24415,3131,
+ 1599,24460,4263, 1580,24357,5431, 1448,23885,6743, 1252,24770,5442,
+ 1271,24873,4274, 1277,24828,3142, 1389,24618,2016, 1479,24733,1993,
+ 1301,25010,3165, 1295,25055,4297, 1391,24890,5460, 1512,25216,5507,
+ 1602,25353,4317, 1608,25308,3186, 1979,23458,-29, 1320,25312,1928,
+ 1495,25055,546, 2438,25790,-488, 1605,25585,5599, 1583,26793,6150,
+ 1850,26272,4298, 1578,27435,7117, 1658,27625,6884, 1671,27398,6846,
+ 1678,27176,6937, 1715,27784,6626, 1744,27323,6551, 1753,26904,6776,
+ 1884,28809,-1688, 1555,28655,1620, 1658,28252,4204, 1581,28263,5997,
+ 1567,28312,6790, 1935,27827,4220, 1818,28249,1603, 1570,27742,6195,
+ 1532,27288,6120, 2038,27074,4245, 1418,28416,228, 413,30264,-4539,
+ 424,31094,-4152, 418,31478,-3497, 410,31453,-2653, 410,31190,-1863,
+ 410,30468,-1467, 410,29550,-1270, 411,31041,-1902, 448,31253,-2696,
+ 449,31323,-3466, 425,31182,-3496, 411,31060,-2738, 387,30899,-1932,
+ 316,30806,-1957, 335,30952,-2766, 353,31089,-3521, 322,31007,-3540,
+ 303,30871,-2786, 284,30725,-1976, 304,30630,-1993, 323,30776,-2802,
+ 342,30912,-3557, 396,30843,-3565, 378,30707,-2811, 358,30561,-2001,
+ 414,30477,-2013, 433,30623,-2822, 452,30759,-3576, 474,30560,-3616,
+ 456,30424,-2861, 436,30278,-2052, 349,30194,-2077, 368,30340,-2886,
+ 386,30477,-3641, 309,30389,-3665, 291,30253,-2911, 271,30107,-2102,
+ 267,29996,-2124, 286,30142,-2933, 305,30278,-3688, 376,30179,-3700,
+ 357,30043,-2945, 338,29897,-2136, 420,29789,-2150, 439,29935,-2959,
+ 458,30071,-3713, 500,29883,-3751, 463,29601,-2187, 470,30974,-4049,
+ 462,30153,-4391, 466,30563,-4220, 410,30009,-1368, 725,29372,-3225,
+ 677,29335,-5130, 908,29205,-3300, 632,29533,-4803, 2587,28768,-3408,
+ 2730,28611,-3456, 2404,28568,-6916, 2413,28849,-6612,
+ 1904,26715,1801, 1394,25919,831, 2224,27270,-3994, 2730,28438,-3011,
+ 2587,28570,-2864, 2826,28152,-3163, 2476,28668,-6523,
+ 2476,28433,-6776, 2787,28338,-3507, 2216,27658,-3972,
+ 2207,27950,-5907, 2311,28216,-6128, 2320,27876,-3971,
+ 2311,28118,-6301, 2311,27845,-6252, 2320,27703,-3749,
+ 2320,27084,-3798, 2320,26986,-4070, 2698,26705,-4014,
+ 2557,26974,-3547, 2557,27739,-3485, 2572,27738,-6362,
+ 2436,28204,-6533, 2436,28421,-6303, 2556,28092,-3822,
+ 2431,28142,-6975, 2544,27863,-6726, 2266,28229,-1686,
+ 1939,28156,-1065, 2569,27943,-2270, 2381,27545,-1682,
+ 2799,27594,-3104, 2750,27866,-2738, 2539,27578,-6309,
+ 2720,26853,-3133, 2788,26461,-3776, 1061,27543,-7078, 1780,27941,135,
+ 1859,27747,-527, 1756,27784,691, 1855,27001,736, 1950,26711,19,
+ 1964,27006,-630, 2342,26955,-1898, 2595,25515,-3113, 2147,27855,132,
+ 2126,27722,601, 2213,27691,-428, 2210,27061,639, 2290,26816,34,
+ 2302,27065,-515, 2347,27680,100, 2335,27602,376, 2386,27584,-229,
+ 2385,27213,398, 2432,27069,42, 2439,27215,-281, 2481,27452,103,
+ 1786,24263,399, 2278,24851,-562, 2372,25143,-1163, -2567,23141,-2607,
+ -2513,23156,-2494, 2513,23156,-2494, 2567,23141,-2607,
+
+ TRIANGLES, 657,656,159, 100,506,99, 1003,900,995, 1048,1009,901,
+ 1051,901,1009, 1070,1073,1071, 1070,803,808, 1071,1077,1070,
+ 1072,1006,1073, 1072,808,915, 1073,808,1072, 1077,1071,1076,
+ 1078,1283,1127, 1081,1078,1079, 1081,1079,1080, 1083,1082,1086,
+ 1083,747,1274, 1084,888,1085, 1085,878,1086, 1085,1086,1095,
+ 1086,747,1083, 1093,1095,1086, 1094,1095,1093, 658,657,149,
+ 1101,637,32, 1103,638,1108, 1105,637,1101, 1106,637,1105,
+ 1108,638,1111, 111,36,158, 111,653,665, 111,665,36, 1110,858,1112,
+ 1111,988,1110, 1111,638,891, 1111,891,988, 1112,858,1113,
+ 1113,637,1106, 1117,779,784, 112,214,207, 112,651,210, 1124,1297,1154,
+ 1125,1123,1128, 1125,1302,1154, 1127,1077,1078, 1129,791,796,
+ 1130,1118,1137, 1136,1130,1137, 1137,1118,1119, 1137,1119,1121,
+ 1137,1121,1126, 1142,758,759, 1142,759,760, 1142,760,761,
+ 1147,1146,1154, 1150,755,756, 1150,756,757, 1154,1302,1124,
+ 1155,1147,1154, 1155,1297,1156, 1155,1154,1297, 1156,1240,1155,
+ 1156,1298,1157, 1157,1240,1156, 1157,1299,1273, 1157,1282,1281,
+ 1158,1151,1152, 1161,768,1164, 1162,773,1161, 1162,1161,1163,
+ 1163,1161,1164, 1165,1172,762, 1168,726,1178, 1168,1267,1266,
+ 1169,1178,725, 1171,1172,1165, 1171,720,1172, 1171,1165,1175,
+ 1178,1169,1174, 1178,1174,1278, 1179,1229,1228, 118,660,168,
+ 1180,1229,1179, 1185,726,1226, 1186,1183,1184, 1186,1184,1191,
+ 119,660,118, 1191,1184,1192, 1192,1184,1197, 1197,1184,1198,
+ 1198,1184,1203, 1203,1184,1204, 121,116,451, 1210,1209,1230,
+ 1215,1210,1230, 1216,1215,1230, 1221,1216,1230, 1222,1185,1226,
+ 1222,1221,1230, 1223,1222,1226, 1224,1223,1225, 1225,1223,1226,
+ 1226,726,1231, 1227,1188,1189, 1227,1189,1194, 1227,1194,1195,
+ 1227,1195,1200, 1227,1200,1201, 1227,1201,1206, 1228,1224,1225,
+ 1228,1225,1234, 1229,1207,1212, 1229,1212,1213, 1229,1213,1218,
+ 1229,1218,1219, 1229,1219,1224, 1229,1180,1227, 1229,1224,1228,
+ 1230,729,1185, 1230,1185,1222, 1231,1225,1226, 1232,1179,1234,
+ 1233,744,1232, 1234,1179,1228, 1234,1225,1231, 1235,744,1233,
+ 1237,744,1238, 1239,1155,1240, 1240,1157,1239, 1243,1168,1266,
+ 1248,1241,1249, 1250,1249,1252, 1252,1249,1253, 1254,1248,1251,
+ 1256,1241,1255, 1259,1244,1270, 1264,745,1237, 1265,1260,1272,
+ 1267,1168,1178, 1267,1178,1277, 1269,1282,1270, 1270,1282,1273,
+ 1271,1268,1269, 1271,1269,1270, 1273,1283,1274, 1274,1078,1081,
+ 1274,1081,1083, 1274,747,1275, 1275,745,1264, 1275,1264,1265,
+ 1275,1265,1272, 1275,1272,1274, 1276,1178,1278, 1277,1178,1276,
+ 1280,1157,1281, 1281,1269,1277, 1282,1157,1273, 1282,1269,1281,
+ 1283,1078,1274, 1292,1290,1296, 1295,1292,1296, 1296,1290,1291,
+ 1296,1291,1293, 1296,1293,1294, 1296,1294,1295, 1297,1298,1156,
+ 1297,1124,1298, 1298,1124,1299, 1299,1124,1273, 1299,1157,1298,
+ 660,659,168, 133,128,463, 137,182,141, 138,185,137, 139,184,138,
+ 140,183,139, 141,181,142, 141,182,144, 142,181,143, 143,649,142,
+ 143,197,195, 144,196,181, 144,199,194, 145,183,140, 145,201,183,
+ 145,140,405, 146,184,139, 146,139,183, 146,203,184, 147,185,138,
+ 147,138,184, 147,205,185, 148,198,182, 148,137,185, 149,657,159,
+ 150,149,159, 151,150,157, 152,151,157, 153,152,157, 157,150,158,
+ 157,38,160, 157,37,38, 158,150,159, 160,153,157, 160,39,163,
+ 160,38,39, 162,41,161, 163,39,40, 168,659,171, 172,155,156,
+ 176,153,154, 176,154,155, 177,658,149, 179,149,150, 179,150,151,
+ 180,152,153, 181,197,143, 181,141,144, 181,196,190, 182,199,144,
+ 182,137,148, 182,198,189, 183,200,146, 184,202,147, 185,204,148,
+ 186,204,185, 186,267,204, 186,185,205, 187,202,184, 187,265,202,
+ 187,184,203, 188,200,183, 188,263,200, 188,183,201, 189,275,199,
+ 189,261,255, 190,277,197, 190,259,254, 191,276,198, 191,148,204,
+ 192,205,147, 192,147,202, 192,268,205, 193,203,146, 193,146,200,
+ 193,266,203, 194,278,196, 194,262,249, 196,259,190, 196,144,194,
+ 196,278,248, 197,181,190, 197,260,195, 197,277,247, 198,261,189,
+ 198,148,191, 198,276,246, 199,182,189, 199,262,194, 199,275,245,
+ 200,274,193, 201,273,188, 202,272,192, 203,271,187, 204,270,191,
+ 205,269,186, 206,215,209, 206,216,90, 207,215,206, 207,214,208,
+ 208,231,215, 208,230,228, 209,233,216, 209,232,227, 210,229,214,
+ 210,651,226, 211,235,217, 211,234,225, 212,237,218, 212,236,224,
+ 212,386,236, 213,238,223, 213,421,88, 214,230,208, 214,112,210,
+ 214,229,222, 215,207,208, 215,232,209, 215,231,221, 216,206,209,
+ 216,234,211, 216,233,220, 217,90,211, 217,386,212, 218,89,212,
+ 218,238,213, 218,237,219, 219,342,238, 219,340,331, 220,346,234,
+ 220,336,329, 221,348,232, 221,334,328, 222,350,230, 222,332,327,
+ 223,341,326, 224,343,237, 224,339,325, 225,345,235, 225,337,324,
+ 226,351,229, 226,651,445, 227,347,233, 227,335,322, 228,349,231,
+ 228,333,321, 229,332,222, 229,210,226, 229,351,320, 230,214,222,
+ 230,333,228, 230,350,319, 231,334,221, 231,208,228, 231,349,318,
+ 232,215,221, 232,335,227, 232,348,317, 233,336,220, 233,209,227,
+ 233,347,316, 234,216,220, 234,337,225, 234,346,315, 235,211,225,
+ 235,345,314, 236,339,224, 236,383,313, 236,344,383, 237,340,219,
+ 237,212,224, 237,343,312, 238,218,219, 238,341,223, 238,342,311,
+ 239,269,205, 239,205,268, 240,270,204, 240,204,267, 241,271,203,
+ 241,203,266, 242,272,202, 242,202,265, 243,273,201, 243,201,264,
+ 244,274,200, 244,200,263, 250,145,407, 251,266,193, 251,193,274,
+ 252,268,192, 252,192,272, 253,191,270, 256,263,188, 256,188,273,
+ 257,265,187, 257,187,271, 258,267,186, 258,186,269, 259,196,248,
+ 22,650,435, 260,197,247, 261,198,246, 262,199,245, 21,650,22,
+ 275,189,255, 276,191,253, 277,190,254, 278,194,249, 323,226,445,
+ 330,217,235, 330,235,338, 332,229,320, 333,230,319, 334,231,318,
+ 335,232,317, 336,233,316, 337,234,315, 338,235,314, 339,236,313,
+ 664,653,661, 340,237,312, 341,238,311, 342,219,331, 343,224,325,
+ 344,236,386, 345,225,324, 346,220,329, 347,227,322, 348,221,328,
+ 349,228,321, 665,653,664, 350,222,327, 351,226,323, 380,217,330,
+ 405,408,145, 405,412,406, 406,408,405, 407,145,408, 408,341,407,
+ 411,406,412, 413,412,461, 414,413,416, 415,414,416, 416,413,608,
+ 418,87,421, 418,416,608, 419,223,326, 420,213,223, 420,223,419,
+ 421,417,418, 421,213,420, 421,430,428, 421,87,88, 428,430,429,
+ 430,421,420, 435,650,439, 439,650,440, 440,650,447, 442,651,437,
+ 444,195,323, 444,323,445, 445,651,442, 446,195,444, 447,650,195,
+ 447,195,446, 453,452,471, 455,453,471, 460,455,471, 461,617,413,
+ 462,457,459, 465,43,44, 471,452,464, 471,464,470, 486,485,492,
+ 488,458,1301, 488,631,458, 488,1301,459, 488,480,481, 488,481,489,
+ 489,574,490, 490,631,489, 490,574,491, 490,632,631, 491,632,490,
+ 495,105,106, 495,106,107, 495,107,108, 495,108,109, 495,109,110,
+ 495,110,496, 497,495,496, 498,105,495, 498,495,497, 499,506,505,
+ 505,68,71, 506,68,505, 506,67,68, 508,503,512, 509,499,505,
+ 512,74,502, 512,502,601, 513,563,514, 518,517,520, 518,564,76,
+ 519,75,564, 519,74,75, 523,522,561, 525,518,520, 526,518,525,
+ 528,523,561, 529,528,561, 531,518,526, 532,518,531, 534,529,561,
+ 535,534,561, 537,518,532, 538,518,537, 540,535,561, 546,541,563,
+ 547,546,563, 552,547,563, 553,552,563, 556,519,564, 558,553,563,
+ 559,557,558, 559,558,562, 560,74,519, 560,519,556, 560,556,557,
+ 560,557,559, 560,559,565, 561,514,563, 562,563,513, 562,558,563,
+ 562,513,568, 564,543,544, 564,544,549, 564,549,550, 564,550,555,
+ 564,555,556, 565,74,560, 565,559,568, 566,84,567, 567,84,569,
+ 568,559,562, 568,513,566, 571,85,598, 571,84,85, 572,84,571,
+ 573,491,574, 574,489,573, 583,575,582, 585,582,588, 586,583,584,
+ 587,583,586, 589,575,590, 598,85,609, 599,598,609, 653,111,654,
+ 600,601,502, 600,502,577, 603,602,605, 604,578,593, 604,616,603,
+ 604,603,605, 606,594,599, 606,599,609, 607,633,491, 607,616,604,
+ 607,491,616, 607,458,633, 608,87,418, 608,617,607, 608,606,609,
+ 608,413,617, 609,87,608, 609,86,87, 610,512,611, 611,512,601,
+ 611,603,615, 612,508,512, 612,512,610, 615,616,491, 615,491,614,
+ 615,603,616, 625,624,630, 627,625,630, 628,627,630, 629,628,630,
+ 630,624,626, 630,626,629, 631,488,489, 632,458,631, 632,491,633,
+ 633,458,632, 639,651,112, 641,774,640, 32,637,33, 667,640,668,
+ 668,640,669, 669,640,774, 67,506,100, 672,669,774, 676,673,820,
+ 677,676,823, 680,677,826, 688,685,1131, 712,711,754, 720,719,1172,
+ 721,720,1171, 725,1178,726, 729,726,1185, 729,1230,730, 73,512,503,
+ 730,1230,1184, 74,512,73, 743,82,83, 745,744,1237, 745,743,744,
+ 745,1275,746, 746,85,743, 746,743,745, 746,609,85, 746,1275,86,
+ 747,86,1275, 748,747,1086, 748,883,751, 748,1086,878, 751,882,752,
+ 752,881,870, 76,564,75, 762,1172,763, 763,1172,719, 769,768,1161,
+ 770,769,1161, 771,770,1161, 772,771,1161, 773,772,1161, 774,641,642,
+ 775,638,639, 781,647,782, 655,654,111, 800,848,801, 801,847,802,
+ 801,848,810, 802,846,803, 802,847,809, 803,846,808, 804,845,800,
+ 805,844,804, 805,636,806, 806,844,805, 806,860,844, 807,845,804,
+ 807,804,844, 807,862,845, 808,1073,1070, 809,863,846, 809,866,856,
+ 810,865,847, 810,868,855, 811,800,845, 811,867,848, 812,644,645,
+ 812,645,840, 813,812,842, 814,813,842, 816,815,843, 817,816,839,
+ 818,817,839, 819,818,835, 820,813,814, 820,814,815, 820,815,816,
+ 820,816,823, 821,672,774, 821,813,820, 822,642,643, 822,643,644,
+ 822,644,812, 822,812,813, 822,813,821, 823,676,820, 824,681,825,
+ 826,677,823, 83,742,743, 831,646,647, 831,647,781, 834,646,831,
+ 844,859,807, 845,861,811, 846,864,808, 846,802,809, 846,863,851,
+ 847,866,809, 847,801,810, 847,865,850, 848,868,810, 848,800,811,
+ 848,867,849, 849,934,868, 849,932,923, 85,84,743, 850,936,866,
+ 850,930,922, 851,938,864, 851,928,921, 852,861,845, 852,926,861,
+ 852,845,862, 853,859,844, 853,924,859, 853,844,860, 854,811,861,
+ 854,935,867, 855,937,865, 855,933,917, 856,939,863, 856,931,916,
+ 857,862,807, 857,807,859, 857,927,862, 858,637,1113, 858,860,806,
+ 858,925,860, 859,943,857, 86,609,746, 860,942,853, 861,941,854,
+ 862,940,852, 863,928,851, 863,809,856, 863,939,909, 864,846,851,
+ 864,938,908, 865,930,850, 865,810,855, 865,937,907, 866,847,850,
+ 866,931,856, 866,936,906, 867,932,849, 867,811,854, 867,935,905,
+ 868,848,849, 868,933,855, 868,934,904, 870,880,871, 871,879,775,
+ 873,879,871, 873,895,879, 873,871,880, 874,880,870, 874,897,880,
+ 874,870,881, 875,638,775, 875,775,879, 876,881,752, 876,899,881,
+ 876,752,882, 877,882,751, 877,1051,882, 877,751,883, 878,883,748,
+ 878,903,883, 879,894,875, 88,218,213, 880,896,873, 881,898,874,
+ 882,900,876, 883,902,877, 884,902,883, 884,1005,902, 884,883,903,
+ 885,898,881, 885,1001,898, 885,881,899, 886,896,880, 886,999,896,
+ 886,880,897, 887,894,879, 887,997,894, 887,879,895, 888,878,1085,
+ 888,903,878, 888,1006,903, 889,901,877, 889,1004,901, 889,877,902,
+ 89,217,212, 89,218,88, 890,899,876, 890,1002,899, 890,876,900,
+ 891,638,875, 891,875,894, 892,897,874, 892,1000,897, 892,874,898,
+ 893,895,873, 893,998,895, 893,873,896, 894,1016,891, 895,1015,887,
+ 896,1014,893, 897,1013,886, 898,1012,892, 899,1011,885, 656,655,159,
+ 90,216,211, 90,217,89, 900,1010,890, 900,882,995, 901,1051,877,
+ 902,1008,889, 903,1007,884, 91,57,58, 910,940,862, 910,862,927,
+ 911,941,861, 911,861,926, 912,942,860, 912,860,925, 913,943,859,
+ 913,859,924, 914,927,857, 914,857,943, 918,854,941, 919,924,853,
+ 919,853,942, 920,926,852, 920,852,940, 928,863,909, 929,864,908,
+ 93,92,484, 930,865,907, 931,866,906, 932,867,905, 933,868,904,
+ 934,849,923, 935,854,918, 936,850,922, 937,855,917, 938,851,921,
+ 939,856,916, 94,93,484, 96,95,476, 97,96,476, 976,903,1006,
+ 976,1007,903, 977,902,1005, 977,1008,902, 978,901,1004, 978,1048,901,
+ 979,900,1003, 979,1010,900, 98,97,476, 980,899,1002, 980,1011,899,
+ 981,898,1001, 981,1012,898, 982,897,1000, 982,1013,897, 983,1014,896,
+ 983,896,999, 984,1015,895, 984,895,998, 985,1016,894, 985,894,997,
+ 986,893,1014, 986,998,893, 987,892,1012, 987,1000,892, 988,891,1016,
+ 988,858,1110, 989,890,1010, 989,1002,890, 99,506,499, 990,889,1008,
+ 990,1004,889, 991,888,1084, 991,1006,888, 992,887,1015, 992,997,887,
+ 993,886,1013, 993,999,886, 994,885,1011, 994,1001,885, 995,882,1045,
+ 996,884,1007, 996,1005,884,
+
+ QUADS, 648,666,130,131, 648,649,20,19, 657,658,15,14,
+ 1000,987,1032,1031, 1001,994,1036,1035, 1002,989,1040,1039,
+ 1003,995,1044,1043, 1004,990,1053,1052, 1005,996,1057,1056,
+ 1006,991,1061,1060, 1007,976,1059,1058, 1008,977,1055,1054,
+ 1009,906,973,1047, 101,64,67,100, 1010,979,1042,1041,
+ 1011,980,1038,1037, 1012,981,1034,1033, 1013,982,1030,1029,
+ 1014,983,1026,1025, 1015,984,1022,1021, 1016,985,1018,1017,
+ 102,63,64,101, 103,60,63,102, 104,59,60,103, 1045,882,1051,1009,
+ 1045,1009,1047,1046, 1048,978,1050,1049, 105,104,103,106,
+ 106,103,102,107, 1061,991,1071,1075, 1062,939,1004,1052,
+ 1062,1052,1053,1063, 1063,909,939,1062, 1064,928,1008,1054,
+ 1064,1054,1055,1065, 1065,921,928,1064, 1066,938,1005,1056,
+ 1066,1056,1057,1067, 1067,908,938,1066, 1068,929,1007,1058,
+ 1068,1058,1059,1069, 1069,915,929,1068, 107,102,101,108,
+ 1071,991,1084,1076, 1072,915,976,1006, 1073,1006,1060,1074,
+ 1074,1060,1061,1075, 1075,1071,1073,1074, 1078,1077,1076,1079,
+ 108,101,100,109, 1080,1079,1085,1095, 1081,1080,1082,1083,
+ 1082,1080,1092,1091, 1084,1085,1087,1088, 1085,1079,1089,1087,
+ 1086,1082,1091,1093, 1088,1087,1089,1090, 1089,1079,1076,1090,
+ 109,100,99,110, 1090,1076,1084,1088, 1092,1080,1095,1094,
+ 1093,1091,1092,1094, 1096,27,26,431, 1097,638,1103,1098,
+ 658,659,16,15, 110,99,499,496, 1100,1099,1102,1104,
+ 1101,1100,1104,1105, 1102,1099,1098,1103, 1106,1105,1104,1107,
+ 1107,1104,1102,1109, 1109,1102,1103,1108, 1110,1109,1108,1111,
+ 1112,1107,1109,1110, 1113,1106,1107,1112, 1115,819,828,1116,
+ 1117,784,791,1120, 1118,1116,1117,1119, 1119,1117,1120,1121,
+ 1120,791,1129,1122, 1121,1120,1122,1126, 1122,1123,1125,1126,
+ 1126,1125,1154,1137, 1127,1124,1302,1303, 1128,1123,1122,1129,
+ 1128,803,1070,1303, 1129,796,803,1128, 113,114,123,124,
+ 1130,1115,1116,1118, 1131,1114,1115,1130, 1132,1133,1140,1141,
+ 1133,1134,1139,1140, 1134,1135,1138,1139, 1136,688,1131,1130,
+ 1138,1135,1136,1137, 1138,1137,1154,1146, 1139,1138,1146,1145,
+ 114,115,122,123, 1140,1139,1145,1144, 1141,1140,1144,1143,
+ 1142,761,1132,1141, 1143,758,1142,1141, 1143,1144,1149,1150,
+ 1144,1145,1148,1149, 1145,1146,1147,1148, 1148,1147,1155,1153,
+ 1149,1148,1153,1152, 115,116,121,122, 115,114,166,167,
+ 1150,757,758,1143, 1150,1149,1152,1151, 1151,754,755,1150,
+ 1158,712,754,1151, 1158,1152,1160,1159, 1160,1152,1153,1155,
+ 1160,1155,1239,1177, 1165,762,773,1162, 1165,1162,1163,1166,
+ 1166,1163,1164,1167, 1167,1159,1176,1166, 1169,1170,1173,1174,
+ 1173,1170,1171,1175, 1174,1173,1177,1239, 1175,1165,1166,1176,
+ 1176,1159,1160,1177, 1177,1173,1175,1176, 1182,1183,1186,1187,
+ 1187,1186,1191,1190, 1188,1181,1182,1187, 1189,1188,1187,1190,
+ 119,118,117,120, 1190,1191,1192,1193, 1193,1192,1197,1196,
+ 1194,1189,1190,1193, 1195,1194,1193,1196, 1196,1197,1198,1199,
+ 1199,1198,1203,1202, 659,660,17,16, 659,658,177,171, 120,117,113,124,
+ 1200,1195,1196,1199, 1201,1200,1199,1202, 1202,1203,1204,1205,
+ 1204,1184,1230,1209, 1205,1204,1209,1208, 1206,1201,1202,1205,
+ 1207,1206,1205,1208, 1208,1209,1210,1211, 1211,1210,1215,1214,
+ 1212,1207,1208,1211, 1213,1212,1211,1214, 1214,1215,1216,1217,
+ 1217,1216,1221,1220, 1218,1213,1214,1217, 1219,1218,1217,1220,
+ 122,121,128,127, 1220,1221,1222,1223, 1224,1219,1220,1223,
+ 1227,1180,1181,1188, 1227,1206,1207,1229, 123,122,127,126,
+ 1231,726,1168,1233, 1233,1168,1243,1235, 1234,1231,1233,1232,
+ 1236,1235,1243,1242, 1236,1242,1244,1247, 1237,1238,1245,1246,
+ 1238,744,1235,1236, 1239,1157,1280,1279, 124,123,126,125,
+ 1244,1242,1271,1270, 1245,1238,1236,1247, 1246,1245,1262,1261,
+ 1247,1244,1259,1263, 1249,1241,1256,1253, 125,126,135,136,
+ 1251,1248,1249,1250, 1251,1250,1262,1263, 1254,1251,1263,1259,
+ 1255,1241,1248,1254, 1257,1256,1255,1258, 1258,1255,1254,1259,
+ 126,127,134,135, 1260,1253,1256,1257, 1261,1252,1253,1260,
+ 1262,1250,1252,1261, 1262,1245,1247,1263, 1264,1237,1246,1265,
+ 1265,1246,1261,1260, 1268,1243,1266,1269, 1269,1266,1267,1277,
+ 127,128,133,134, 1271,1242,1243,1268, 1272,1260,1257,1274,
+ 1273,1258,1259,1270, 1273,1124,1127,1283, 1274,1257,1258,1273,
+ 1278,1174,1239,1279, 128,121,451,454, 1284,1276,1278,1285,
+ 1285,1278,1279,1287, 1286,1277,1276,1284, 1287,1279,1280,1288,
+ 1288,1280,1281,1289, 1289,1281,1277,1286, 129,120,124,125,
+ 1290,1284,1285,1291, 1291,1285,1287,1293, 1292,1286,1284,1290,
+ 1293,1287,1288,1294, 1294,1288,1289,1295, 1295,1289,1286,1292,
+ 660,666,18,17, 130,666,660,119, 130,119,120,129, 1301,458,461,1300,
+ 1301,1300,462,459, 1303,1070,1077,1127, 1303,1302,1125,1128,
+ 131,130,129,132, 132,129,125,136, 134,133,140,139, 135,134,139,138,
+ 136,135,138,137, 140,133,463,462, 141,132,136,137, 142,131,132,141,
+ 154,153,160,163, 158,36,37,157, 159,655,111,158, 161,156,155,162,
+ 161,41,42,448, 162,155,154,163, 163,40,41,162, 164,113,117,169,
+ 164,169,170,174, 165,116,115,167, 165,156,449,450, 166,114,113,164,
+ 167,166,173,172, 169,117,118,168, 170,169,168,171, 172,156,165,167,
+ 173,166,164,174, 174,170,178,175, 175,178,179,180, 176,155,172,173,
+ 176,173,174,175, 177,149,179,178, 178,170,171,177, 179,151,152,180,
+ 180,153,176,175, 649,648,131,142, 649,650,21,20, 201,145,250,264,
+ 206,90,753,869, 207,206,869,872, 263,256,400,399, 264,250,404,403,
+ 265,257,306,305, 266,251,310,309, 267,258,298,297, 268,252,302,301,
+ 269,239,300,299, 270,240,296,295, 271,241,308,307, 272,242,304,303,
+ 273,243,402,401, 274,244,398,397, 279,260,247,280, 280,247,320,353,
+ 281,277,254,282, 282,254,327,355, 283,259,248,284, 284,248,319,357,
+ 285,278,249,286, 286,249,321,359, 287,262,245,288, 288,245,318,361,
+ 289,275,255,290, 19,18,666,648, 290,255,328,363, 291,261,246,292,
+ 292,246,317,365, 293,276,253,294, 294,253,322,367, 296,240,316,369,
+ 298,258,329,371, 650,649,143,195, 300,239,315,373, 302,252,324,375,
+ 304,242,314,377, 306,257,330,379, 308,241,344,382, 661,653,652,662,
+ 310,251,313,385, 311,250,407,341, 312,256,273,340, 313,251,274,339,
+ 314,242,265,338, 315,239,268,337, 316,240,267,336, 317,246,276,335,
+ 318,245,275,334, 319,248,278,333, 662,667,668,663, 320,247,277,332,
+ 321,249,262,349, 322,253,270,347, 323,195,260,351, 324,252,272,345,
+ 325,244,263,343, 327,254,259,350, 328,255,261,348, 329,258,269,346,
+ 663,668,669,670, 330,257,271,380, 331,243,264,342, 332,277,281,354,
+ 333,278,285,358, 334,275,289,362, 335,276,293,366, 336,267,297,370,
+ 337,268,301,374, 338,265,305,378, 339,274,397,387, 664,661,662,663,
+ 340,273,401,391, 342,264,403,393, 343,263,399,389, 344,241,266,383,
+ 345,272,303,376, 346,269,299,372, 347,270,295,368, 348,261,291,364,
+ 349,262,287,360, 665,664,663,670, 350,259,283,356, 351,260,279,352,
+ 352,279,280,353, 353,320,351,352, 354,281,282,355, 355,327,332,354,
+ 356,283,284,357, 357,319,350,356, 358,285,286,359, 359,321,333,358,
+ 36,665,670,671, 360,287,288,361, 361,318,349,360, 362,289,290,363,
+ 363,328,334,362, 364,291,292,365, 365,317,348,364, 366,293,294,367,
+ 367,322,335,366, 368,295,296,369, 369,316,347,368, 37,36,671,674,
+ 370,297,298,371, 371,329,336,370, 372,299,300,373, 373,315,346,372,
+ 374,301,302,375, 375,324,337,374, 376,303,304,377, 377,314,345,376,
+ 378,305,306,379, 379,330,338,378, 38,37,674,675, 380,271,307,381,
+ 381,307,308,382, 382,344,380,381, 383,266,309,384, 384,309,310,385,
+ 385,313,383,384, 386,217,380,344, 388,325,339,387, 388,387,397,398,
+ 39,38,675,678, 390,312,343,389, 390,389,399,400, 392,331,340,391,
+ 392,391,401,402, 394,311,342,393, 394,393,403,404, 395,341,408,409,
+ 396,326,341,395, 396,395,409,410, 398,244,325,388, 40,39,678,679,
+ 400,256,312,390, 402,243,331,392, 404,250,311,394, 405,140,462,1300,
+ 406,326,396,410, 408,406,410,409, 41,40,679,682, 411,412,413,414,
+ 411,414,424,425, 412,405,1300,461, 417,415,416,418, 419,326,406,411,
+ 419,411,425,423, 42,41,682,683, 420,414,415,430, 422,420,419,423,
+ 424,414,420,422, 424,422,423,425, 426,417,421,428, 427,415,417,426,
+ 427,426,428,429, 43,42,683,686, 430,415,427,429, 431,651,639,1096,
+ 431,26,25,432, 432,25,24,433, 432,433,436,437, 433,24,23,434,
+ 434,23,22,435, 436,433,434,438, 436,438,441,443, 437,651,431,432,
+ 437,436,443,442, 438,434,435,439, 438,439,440,441, 44,43,686,687,
+ 441,440,447,446, 442,443,444,445, 443,441,446,444, 448,42,43,465,
+ 449,156,161,448, 449,448,465,464, 45,44,687,690, 450,449,464,452,
+ 451,116,165,450, 451,450,452,453, 454,451,453,455, 456,454,455,460,
+ 456,457,462,463, 459,457,456,460, 46,45,690,691, 461,458,607,617,
+ 463,128,454,456, 465,44,470,464, 466,98,476,475, 466,49,50,98,
+ 467,47,49,466, 468,46,47,467, 469,45,46,468, 47,46,691,694,
+ 470,44,45,469, 470,469,472,471, 472,469,468,473, 473,468,467,474,
+ 474,467,466,475, 476,95,477,475, 478,474,475,477, 479,473,474,478,
+ 48,695,696,697, 480,472,473,479, 481,480,479,482, 482,479,478,483,
+ 483,478,477,484, 486,483,484,485, 487,482,483,486, 487,486,494,489,
+ 488,459,460,471, 488,471,472,480, 489,481,482,487, 49,47,694,48,
+ 492,58,59,493, 493,59,104,501, 494,486,492,493, 494,493,510,511,
+ 497,496,499,500, 498,497,500,501, 652,640,667,662, 652,653,10,9,
+ 50,49,48,697, 500,499,509,510, 501,104,105,498, 502,74,565,567,
+ 504,72,73,503, 505,71,72,504, 505,504,507,509, 507,504,503,508,
+ 509,507,511,510, 51,50,697,698, 510,493,501,500, 511,507,508,573,
+ 513,81,82,566, 514,80,81,513, 515,79,80,514, 515,514,561,522,
+ 516,78,79,515, 516,515,522,521, 517,77,78,516, 518,76,77,517,
+ 52,51,698,701, 520,517,516,521, 521,522,523,524, 524,523,528,527,
+ 525,520,521,524, 526,525,524,527, 527,528,529,530, 53,52,701,702,
+ 530,529,534,533, 531,526,527,530, 532,531,530,533, 533,534,535,536,
+ 536,535,540,539, 537,532,533,536, 538,537,536,539, 539,540,541,542,
+ 54,53,702,705, 541,540,561,563, 542,541,546,545, 543,538,539,542,
+ 544,543,542,545, 545,546,547,548, 548,547,552,551, 549,544,545,548,
+ 55,54,705,706, 550,549,548,551, 551,552,553,554, 554,553,558,557,
+ 555,550,551,554, 556,555,554,557, 56,55,706,709, 564,518,538,543,
+ 566,82,743,84, 567,565,568,566, 569,84,572,570, 57,56,709,710,
+ 570,572,579,581, 573,489,494,511, 573,508,612,613, 577,502,567,569,
+ 577,569,570,576, 577,576,605,602, 578,576,570,581, 579,572,571,580,
+ 58,57,710,713, 580,571,598,599, 581,579,596,597, 582,575,589,588,
+ 583,582,585,584, 586,584,596,595, 587,586,595,594, 588,589,592,593,
+ 589,590,591,592, 59,58,713,714, 590,575,583,587, 590,587,594,591,
+ 591,594,606,608, 592,591,608,607, 593,578,581,597, 593,592,607,604,
+ 595,580,599,594, 596,579,580,595, 596,584,585,597, 597,585,588,593,
+ 653,654,11,10, 60,59,714,61, 600,577,602,603, 601,600,603,611,
+ 605,576,578,604, 61,716,717,62, 610,611,620,618, 611,615,623,620,
+ 612,610,618,619, 613,612,619,621, 614,491,573,613, 614,613,621,622,
+ 615,614,622,623, 618,620,626,624, 619,618,624,625, 62,717,718,65,
+ 620,623,629,626, 621,619,625,627, 622,621,627,628, 623,622,628,629,
+ 63,60,61,62, 639,638,1097,1096, 64,63,62,65, 647,634,793,782,
+ 1,647,646,2, 2,646,645,3, 65,718,719,66, 3,645,644,4, 4,644,643,5,
+ 5,643,642,6, 6,642,641,7, 7,641,640,8, 8,640,652,9, 28,27,1096,1097,
+ 29,28,1097,1098, 66,719,720,69, 30,29,1098,1099, 31,30,1099,1100,
+ 32,31,1100,1101, 33,637,636,34, 34,636,635,35, 35,635,634,0,
+ 0,634,647,1, 67,64,65,66, 670,669,672,671, 671,672,673,674,
+ 673,672,821,820, 674,673,676,675, 675,676,677,678, 678,677,680,679,
+ 679,680,681,682, 68,67,66,69, 681,680,826,825, 682,681,684,683,
+ 683,684,685,686, 684,681,824,1114, 685,684,1114,1131,
+ 686,685,688,687, 687,688,689,690, 689,688,1136,1135, 69,720,721,70,
+ 690,689,692,691, 691,692,693,694, 692,689,1135,1134,
+ 693,692,1134,1133, 694,693,695,48, 695,693,1133,1132,
+ 696,695,1132,761, 697,696,699,698, 698,699,700,701, 699,696,761,760,
+ 654,655,12,11, 70,721,722,723, 700,699,760,759, 701,700,703,702,
+ 702,703,704,705, 703,700,759,758, 704,703,758,757, 705,704,707,706,
+ 706,707,708,709, 707,704,757,756, 708,707,756,755, 709,708,711,710,
+ 71,68,69,70, 710,711,712,713, 711,708,755,754, 713,712,715,714,
+ 714,715,716,61, 715,712,1158,1159, 716,715,767,766, 717,716,766,765,
+ 718,717,765,764, 719,718,764,763, 72,71,70,723, 722,721,1171,1170,
+ 723,722,725,724, 724,725,726,727, 725,722,1170,1169, 727,726,729,728,
+ 728,729,730,731, 73,72,723,724, 731,730,733,732, 732,733,734,735,
+ 733,730,1184,1183, 734,733,1183,1182, 735,734,737,736,
+ 736,737,738,739, 737,734,1182,1181, 738,737,1181,1180,
+ 739,738,741,740, 74,73,724,727, 740,741,742,83, 741,738,1180,1179,
+ 742,741,1179,1232, 743,742,1232,744, 749,748,751,750, 75,74,727,728,
+ 750,751,752,753, 753,752,870,869, 76,75,728,731, 762,763,772,773,
+ 763,764,771,772, 764,765,770,771, 765,766,769,770, 766,767,768,769,
+ 767,715,1159,1167, 768,767,1167,1164, 77,76,731,732, 774,642,822,821,
+ 775,639,872,871, 776,780,783,787, 776,777,829,827, 778,779,828,830,
+ 78,77,732,735, 780,781,782,783, 780,776,827,832, 781,780,832,831,
+ 783,782,793,792, 784,779,778,785, 785,778,777,786, 786,777,776,787,
+ 787,783,792,788, 788,792,795,799, 789,786,787,788, 79,78,735,736,
+ 790,785,786,789, 791,784,785,790, 792,793,794,795, 793,634,635,794,
+ 794,635,636,805, 795,794,805,804, 796,791,790,797, 797,790,789,798,
+ 798,789,788,799, 799,795,804,800, 655,656,13,12, 80,79,736,739,
+ 801,798,799,800, 802,797,798,801, 803,796,797,802, 806,636,637,858,
+ 81,80,739,740, 815,814,842,843, 817,818,825,826, 818,819,824,825,
+ 82,81,740,83, 823,816,817,826, 824,819,1115,1114, 827,829,836,837,
+ 828,779,1117,1116, 828,819,835,830, 829,777,778,830, 831,832,833,834,
+ 833,832,827,837, 834,833,841,840, 835,818,839,836, 836,829,830,835,
+ 837,836,839,838, 839,816,843,838, 840,645,646,834, 841,833,837,838,
+ 842,812,840,841, 842,841,838,843, 86,747,748,749, 869,870,871,872,
+ 872,639,112,207, 88,87,86,749, 89,88,749,750, 656,657,14,13,
+ 90,89,750,753, 91,58,492,485, 910,927,952,953, 911,926,956,957,
+ 912,925,944,945, 913,924,948,949, 914,943,950,951, 915,808,864,929,
+ 918,941,958,959, 919,942,946,947, 92,91,485,484, 92,56,57,91,
+ 920,940,954,955, 924,919,992,1015, 925,858,988,1016, 926,920,993,1013,
+ 927,914,986,1014, 928,909,990,1008, 929,908,996,1007, 93,55,56,92,
+ 930,907,979,1003, 931,906,1009,1048, 932,905,981,1001,
+ 933,904,980,1002, 934,923,994,1011, 935,918,987,1012,
+ 936,922,995,1045, 937,917,989,1010, 938,921,977,1005,
+ 939,916,978,1004, 94,54,55,93, 940,910,983,999, 941,911,982,1000,
+ 942,912,985,997, 943,913,984,998, 944,925,1016,1017,
+ 945,944,1017,1018, 946,942,997,1019, 947,946,1019,1020,
+ 948,924,1015,1021, 949,948,1021,1022, 95,94,484,477, 95,53,54,94,
+ 950,943,998,1023, 951,950,1023,1024, 952,927,1014,1025,
+ 953,952,1025,1026, 954,940,999,1027, 955,954,1027,1028,
+ 956,926,1013,1029, 957,956,1029,1030, 958,941,1000,1031,
+ 959,958,1031,1032, 96,52,53,95, 960,935,1012,1033, 961,960,1033,1034,
+ 961,905,935,960, 962,932,1001,1035, 963,962,1035,1036,
+ 963,923,932,962, 964,934,1011,1037, 965,964,1037,1038,
+ 965,904,934,964, 966,933,1002,1039, 967,966,1039,1040,
+ 967,917,933,966, 968,937,1010,1041, 969,968,1041,1042,
+ 969,907,937,968, 97,51,52,96, 970,930,1003,1043, 971,970,1043,1044,
+ 971,922,930,970, 972,936,1045,1046, 973,972,1046,1047,
+ 973,906,936,972, 974,931,1048,1049, 975,974,1049,1050,
+ 975,916,931,974, 976,915,1069,1059, 977,921,1065,1055,
+ 978,916,975,1050, 979,907,969,1042, 98,50,51,97, 980,904,965,1038,
+ 981,905,961,1034, 982,911,957,1030, 983,910,953,1026,
+ 984,913,949,1022, 985,912,945,1018, 986,914,951,1024,
+ 987,918,959,1032, 989,917,967,1040, 990,909,1063,1053,
+ 992,919,947,1020, 993,920,955,1028, 994,923,963,1036,
+ 995,922,971,1044, 996,908,1067,1057, 997,992,1020,1019,
+ 998,986,1024,1023, 999,993,1028,1027,
+
+ /* The base of the knight */
+ SPIN,18,
+ 9510,0, 9510,756, SEAM, 9134,1129, 9447,1487,
+ 9447,1951, 9103,2371, STEPDOWN, 8211,3083,
+ 7167,4242, 6662,5664, 7040,7142, STEPUP, SEAM, 7935,8560,
+ STEPUP, BACKREF,0,
+
+ ENDOFDATA
+};
+
+static unsigned short bishop_data[] = {
+ VERTICES, SETBACKREF,0, 5233,26960,0, 5154,26960,909, 4918,26960,1790,
+ 4532,26960,2617, 4009,26960,3364, 3364,26960,4009, 2617,26960,4532,
+ 1790,26960,4918, 909,26960,5154, 0,26833,5233, -909,26960,5154,
+ -1790,26960,4918, -2617,26960,4532, -3364,26960,4009,
+ -4009,26960,3364, -4532,26960,2617, -4918,26960,1790,
+ -5154,26960,909, -5233,26960,0, -5154,26960,-909, -4918,26960,-1790,
+ -4532,26960,-2617, -4009,26960,-3364, -3364,26960,-4009,
+ -2617,26960,-4532, -1790,26960,-4918, -909,26960,-5154, 0,26833,-5233,
+ 909,26960,-5154, 1790,26960,-4918, 2617,26960,-4532, 3364,26960,-4009,
+ 4009,26960,-3364, 4532,26960,-2617, 4918,26960,-1790, 5154,26960,-909,
+ SETBACKREF,1, 3812,31178,0, 3765,31144,729, 3624,31040,1435,
+ 3395,30872,2153, 3084,30642,2820, 2701,30360,3389, 2076,29899,4102,
+ 1492,30015,4340, 845,30033,4442, 0,30044,4511, -657,30063,4443,
+ -1481,30081,4214, -2190,30081,3884, -2830,30081,3435,
+ -3383,30081,2883, -3831,30081,2242, -4162,30081,1534,
+ -4364,30081,779, -4432,30081,0, -4364,30081,-779, -4162,30081,-1534,
+ -3831,30081,-2242, -3383,30081,-2883, -2830,30081,-3435,
+ -2190,30081,-3884, -1481,30081,-4214, -657,30063,-4443, 0,30044,-4511,
+ 845,30033,-4442, 1492,30015,-4340, 2076,29899,-4102, 2701,30360,-3388,
+ 3084,30642,-2820, 3395,30872,-2153, 3624,31040,-1435, 3765,31144,-729,
+ 240,28546,-4957, 884,29021,-4784, 1490,29467,-4537, 2076,29899,-4102,
+ 2701,30360,-3388, 3084,30642,-2820, 3395,30872,-2153,
+ 3624,31040,-1435, 3765,31144,-729, 2177,28477,4637, 1021,27605,5037,
+ 1021,27605,-5042, 2170,28478,-4644, 0,26833,-5233, 0,26833,5233,
+ -3153,28619,-3758, 240,28546,4957, 884,29021,4784, 2076,29899,4102,
+ 2701,30360,3389, 3084,30642,2820, 3395,30872,2153, 3624,31040,1435,
+ 3765,31144,729, -719,28582,4883, 4863,28569,977, 4560,28569,1925,
+ 4064,28569,2815, 3465,28569,3723, 2622,28569,4448, 2621,28583,-4401,
+ 3473,28588,-3691, 4064,28569,-2815, 4560,28569,-1925, 4863,28569,-977,
+ 4965,28569,0, -1678,28619,4610, -3153,28619,3758, -2453,28619,4248,
+ -4248,28619,2453, -3758,28619,3153, -4831,28619,852, -4906,28619,0,
+ -4831,28619,-852, -4610,28619,-1678, -4248,28619,-2453,
+ -3758,28619,-3153, -1678,28619,-4610, -2453,28619,-4248,
+ -644,27895,5037, -644,27895,-5037, -4610,28619,1678, -719,28582,-4883,
+ 2170,28478,-4644, 1021,27605,-5042, 1021,27605,5037, 2177,28477,4637,
+ 0,26833,-5233, 0,26833,5233, -644,27895,-5037, -644,27895,5037,
+ -644,27895,5037, -644,27895,-5037, 1490,29467,-4537, 884,29021,-4784,
+ 240,28546,-4957, 240,28546,4957, 884,29021,4784, 3812,31178,0,
+ 4349,30116,-867, 4197,30001,-1705, 3948,29813,-2492, 3610,29558,-3203,
+ 3193,29244,-3817, 2711,28880,-4315, 4349,30116,-867, 4197,30001,-1705,
+ 3948,29813,-2492, 3610,29558,-3203, 3193,29244,-3817,
+ 2711,28880,-4315, 1608,28047,-4906, 1608,28047,4901, 2711,28880,4310,
+ 3193,29244,3812, 3610,29558,3198, 3948,29813,2487, 4197,30001,1701,
+ 4349,30116,862, 4401,30155,-176, 1490,29467,4537, 1490,29467,4537,
+ 4401,30155,-176, 4349,30116,862, 4197,30001,1701, 3948,29813,2487,
+ 3610,29558,3198, 3193,29244,3812, 2711,28880,4310, 1608,28047,4901,
+ 1608,28047,-4906,
+
+ TRIANGLES, 8,127,9, 7,128,154, 2,98,3, 121,96,10, 121,10,9, 121,138,96,
+ 122,27,26, 27,126,28, 66,135,65, 162,42,43, 165,164,141, 80,140,95,
+ 103,151,150, 102,125,152, 101,155,128, 100,157,156, 124,137,122,
+ 33,105,34, 29,153,125, 26,124,122,
+
+ QUADS, 22,118,87,23, 21,117,118,22, 20,116,117,21, 19,115,116,20,
+ 18,114,115,19, 17,113,114,18, 16,123,113,17, 15,111,123,16, 14,112,111,15,
+ 13,109,112,14, 12,110,109,13, 11,108,110,12, 7,154,127,8, 110,108,47,48,
+ 135,136,64,65, 136,137,63,64, 138,139,44,45, 139,162,43,44, 109,110,48,49,
+ 147,161,107,106, 166,165,141,142, 167,166,142,143, 168,167,143,144,
+ 169,168,144,145, 112,109,49,50, 170,169,145,146, 171,81,84,172,
+ 111,112,50,51, 72,88,133,134, 73,89,88,72, 74,163,89,73, 75,90,163,74,
+ 76,91,90,75, 77,92,91,76, 78,93,92,77, 79,94,93,78, 80,95,94,79,
+ 81,170,146,84, 82,171,172,83, 86,82,83,85, 130,129,131,132, 123,111,51,52,
+ 113,123,52,53, 114,113,53,54, 115,114,54,55, 116,115,55,56, 117,116,56,57,
+ 118,117,57,58, 87,118,58,59, 120,87,59,60, 119,120,60,61, 107,161,160,97,
+ 106,107,0,35, 105,148,147,106, 105,106,35,34, 104,149,148,105,
+ 104,105,33,32, 103,150,149,104, 103,104,32,31, 102,152,151,103,
+ 102,103,31,30, 101,128,7,6, 100,101,6,5, 100,156,155,101, 99,100,5,4,
+ 99,158,157,100, 98,99,4,3, 98,159,158,99, 97,98,2,1, 97,160,159,98,
+ 96,108,11,10, 96,138,45,46, 124,119,61,62, 47,108,96,46, 63,137,124,62,
+ 0,107,97,1, 29,125,102,30, 28,126,153,29, 25,119,124,26, 24,120,119,25,
+ 23,87,120,24,
+
+ /* Everything above the slit */
+ SPIN,18,
+ 8870,0,8870,731,SEAM,8519,1091,8811,1438,8811,1886,8626,2292,
+ STEPDOWN,6989,2980,5927,4133,5548,5735,
+ STEPUP,5388,7642,5228,7807,STEPDOWN,4427,8149,4057,8434,
+ 3493,9185,2816,13524,SEAM,2690,18532,5301,18690,
+ STEPUP,6810,19005,6861,19277,6804,19625,STEPDOWN,6502,19845,
+ SEAM,4305,20394,STEPUP,4796,20522,4924,20759,4778,20979,
+ STEPDOWN,SEAM,3727,21207,SEAM,3726,22181,STEPUP,SEAM,4546,22705,
+ SEAM,3846,23385,4718,24227,5226,25516,STEPUP,BACKREF,0,
+
+ /* Everything below the slit */
+ SPIN,36,
+ BACKREF,1,STEPDOWN,3548,31590,STEPDOWN,2724,32633,SEAM,1581,33500,
+ 2013,33901,STEPUP,2281,34500,2281,34936,STEPDOWN,1947,35372,
+ STEPDOWN,1233,35734,STEPDOWN,0,35891,
+
+ ENDOFDATA
+};
+
+static unsigned short king_data[] = {
+ SPIN,20,
+ 11378,0,11378,856,SEAM,10928,1152,
+ 11302,1684,11302,2209,11065,2684,
+ STEPDOWN,8964,3490,7603,4841,7116,6717,
+ STEPUP,6911,8950,6705,9144,STEPDOWN,5678,9545,5204,9878,
+ 4481,10758,3696,14808,SEAM,3065,26979,
+ 5813,27155,STEPUP,7145,27507,7424,27812,7352,28288,7131,28533,
+ 5477,28882,5397,29010,5406,29363,4903,29934,
+ STEPDOWN,SEAM,3944,30227,
+ SEAM,3974,31478,4703,31849,STEPUP,4832,32092,4756,32370,
+ SEAM,3975,32620,6899,39055,6877,39351,2833,39514,
+ 2786,39612,2786,39807,2734,39856,STEPDOWN,STEPDOWN,2590,39905,0,39969,
+ /* The cross */
+ SETBACKREF,0,
+ QUADSTRIP,-1613,39866,0,-1543,39866,702,-1651,40481,0,-1580,40590,702,
+ -1531,40917,0,-1465,41008,702,
+ QUADSTRIP,-1531,40917,0,-1465,41008,702,-2956,41104,0,-2829,41187,702,
+ -3075,41520,0,-2943,41585,702,-3075,43849,0,-2943,43805,702,
+ -2862,44347,0,-2739,44282,702,-1116,44636,0,-1068,44554,702,
+ QUADSTRIP,-1116,44636,0,-1068,44554,702,-1102,45692,0,-1054,45576,702,
+ -973,45829,0,-973,45747,702,973,45829,0,973,45747,702,1102,45692,0,
+ 1054,45576,702,1116,44636,0,1068,44554,702,
+ QUADSTRIP,1116,44636,0,1068,44554,702,2862,44347,0,2739,44282,702,
+ 3075,43849,0,2943,43805,702,3075,41520,0,2943,41585,702,2956,41104,0,
+ 2829,41187,702,1531,40917,0,1465,41008,702,
+ QUADSTRIP,1531,40917,0,1465,41008,702,1651,40481,0,1580,40590,702,
+ 1613,39866,0,1543,39866,702,
+ QUADSTRIP,-1543,39866,702,1543,39866,702,-1580,40590,702,
+ 1580,40590,702,-1465,41008,702,1465,41008,702,-2829,41187,702,
+ 2829,41187,702,-2943,41585,702,2943,41585,702,-2943,43805,702,
+ 2943,43805,702,-2739,44282,702,2739,44282,702,-1068,44554,702,
+ 1068,44554,702,-1054,45576,702,1054,45576,702,-973,45747,702,
+ 973,45747,702,
+ QUADSTRIP,-1543,39866,-702,BACKREF,0,0,-1580,40590,-702,BACKREF,0,2,
+ -1465,41008,-702,BACKREF,0,4,
+ QUADSTRIP,-1465,41008,-702,BACKREF,0,6,-2829,41187,-702,BACKREF,0,8,
+ -2943,41585,-702,BACKREF,0,10,-2943,43805,-702,BACKREF,0,12,
+ -2739,44282,-702,BACKREF,0,14,-1068,44554,-702,BACKREF,0,16,
+ QUADSTRIP,-1068,44554,-702,BACKREF,0,18,-1054,45576,-702,
+ BACKREF,0,20,-973,45747,-702,BACKREF,0,22,973,45747,-702,BACKREF,0,24,
+ 1054,45576,-702,BACKREF,0,26,1068,44554,-702,BACKREF,0,28,
+ QUADSTRIP,1068,44554,-702,BACKREF,0,30,2739,44282,-702,
+ BACKREF,0,32,2943,43805,-702,BACKREF,0,34,2943,41585,-702,BACKREF,0,36,
+ 2829,41187,-702,BACKREF,0,38,1465,41008,-702,BACKREF,0,40,
+ QUADSTRIP,1465,41008,-702,BACKREF,0,42,1580,40590,-702,
+ BACKREF,0,44,1543,39866,-702,BACKREF,0,46,
+ QUADSTRIP,1543,39866,-702,-1543,39866,-702,1580,40590,-702,
+ -1580,40590,-702,1465,41008,-702,-1465,41008,-702,2829,41187,-702,
+ -2829,41187,-702,2943,41585,-702,-2943,41585,-702,2943,43805,-702,
+ -2943,43805,-702,2739,44282,-702,-2739,44282,-702,1068,44554,-702,
+ -1068,44554,-702,1054,45576,-702,-1054,45576,-702,973,45747,-702,
+ -973,45747,-702,
+ ENDOFDATA
+};
+
+static unsigned short queen_data[] = {
+ SPIN,24,
+ 11092,0,11092,914,SEAM,10653,1284,
+ 11018,1798,11018,2358,10787,2866,
+ STEPDOWN,8739,3726,7412,5168,6937,7171,
+ STEPUP,6737,9556,6537,9762,STEPDOWN,5536,10191,5073,10546,
+ 4368,11485,3678,15137,SEAM,3259,26879,
+ 5966,27091,STEPUP,7332,27515,7619,27882,7545,28455,7317,28751,
+ 5654,29177,5538,29326,5542,29982,5377,30278,
+ STEPDOWN,SEAM,4194,30585,
+ SEAM,4226,31822,5002,32218,STEPUP,5139,32477,5058,32774,
+ SEAM,4227,33040,STEPDOWN,4421,34778,5042,36612,5874,38429,
+ STEPUP,SEAM,PATTERN,3,6018,39660,6018,39660,6804,39977,
+ SEAM,PATTERN,3,5015,41139,5015,41139,5673,41460,
+ SEAM,4349,40044,
+ STEPDOWN,SEAM,1381,41188,
+ 1396,42332,STEPDOWN,1082,43072,481,43476,0,43543,
+ ENDOFDATA
+};
+
+static unsigned short pawn_data[] = {
+ SPIN,16,
+ 7395,0,7395,609,
+ SEAM,7102,910,7345,1199,7345,1572,7191,1910,
+ STEPDOWN,5826,2484,4941,3446,4625,4781,
+ STEPUP,4492,6371,4358,6508,
+ STEPDOWN,3691,6794,2912,7657,2473,10091,
+ SEAM,2100,15344,
+ STEPUP,4518,15697,4695,15900,4649,16218,4509,16382,
+ STEPDOWN,SEAM,3150,16755,STEPUP,3858,17678,4303,18752,4455,19905,
+ 4303,21058,3858,22132,
+ STEPDOWN,3150,23055,2227,23763,STEPDOWN,1153,24208,0,24360,
+ ENDOFDATA
+};
+
+static unsigned short rook_data[] = {
+ SPIN,20,
+ 9374,0,9374,756,SEAM,9003,1062,9311,1487,
+ 9311,1951,9116,2371,8521,3083,6701,5807,SEAM,6009,7595,
+ 6167,7812,6138,8066,5926,8460,5216,12608,
+ SEAM,4883,21434,
+ SEAM,5140,21608,
+ SEAM,5176,22792,
+ SEAM,5953,23030,
+/* SEAM,PATTERN,5,6103,26819,6143,27971,6143,27971,6143,27971,6103,26819, */
+/* SEAM,PATTERN,5, 5020,26819,5053,27971,5053,27971,5053,27971, 5020,26819, */
+ SETBACKREF,0,
+ 6103,26819,
+
+ SETBACKREF,1,
+ SPIN,20,
+ 5020,26819,5020,26114,4906,25858,0,25666,
+
+ POLARQUADSTRIP,20,BACKREF,0,1,1,6143,27971,BACKREF,0,2,2,6143,27971,
+ BACKREF,0,3,3,6143,27971,BACKREF,0,4,4,6143,27971,
+ POLARQUADSTRIP,20,BACKREF,0,6,6,6143,27971,BACKREF,0,7,7,6143,27971,
+ BACKREF,0,8,8,6143,27971,BACKREF,0,9,9,6143,27971,
+ POLARQUADSTRIP,20,BACKREF,0,11,11,6143,27971,BACKREF,0,12,12,6143,27971,
+ BACKREF,0,13,13,6143,27971,BACKREF,0,14,14,6143,27971,
+ POLARQUADSTRIP,20,BACKREF,0,16,16,6143,27971,BACKREF,0,17,17,6143,27971,
+ BACKREF,0,18,18,6143,27971,BACKREF,0,19,19,6143,27971,
+
+ POLARQUADSTRIP,20,1,5053,27971,BACKREF,1,1,2,5053,27971,BACKREF,1,2,
+ 3,5053,27971,BACKREF,1,3,4,5053,27971,BACKREF,1,4,
+ POLARQUADSTRIP,20,6,5053,27971,BACKREF,1,6,7,5053,27971,BACKREF,1,7,
+ 8,5053,27971,BACKREF,1,8,9,5053,27971,BACKREF,1,9,
+ POLARQUADSTRIP,20,11,5053,27971,BACKREF,1,11,12,5053,27971,BACKREF,1,12,
+ 13,5053,27971,BACKREF,1,13,14,5053,27971,BACKREF,1,14,
+ POLARQUADSTRIP,20,16,5053,27971,BACKREF,1,16,17,5053,27971,BACKREF,1,17,
+ 18,5053,27971,BACKREF,1,18,19,5053,27971,BACKREF,1,19,
+
+ POLARQUADSTRIP,20,1,5020,26819,1,6103,26819,
+ 0,5020,26819,0,6103,26819,19,5020,26819,19,6103,26819,
+ POLARQUADSTRIP,20,6,5020,26819,6,6103,26819,
+ 5,5020,26819,5,6103,26819,4,5020,26819,4,6103,26819,
+ POLARQUADSTRIP,20,11,5020,26819,11,6103,26819,
+ 10,5020,26819,10,6103,26819,9,5020,26819,9,6103,26819,
+ POLARQUADSTRIP,20,16,5020,26819,16,6103,26819,
+ 15,5020,26819,15,6103,26819,14,5020,26819,14,6103,26819,
+
+ POLARQUADSTRIP,20,1,5053,27971,1,6143,27971,1,5020,26819,1,6103,26819,
+ POLARQUADSTRIP,20,4,5020,26819,4,6103,26819,4,5053,27971,4,6143,27971,
+ POLARQUADSTRIP,20,6,5053,27971,6,6143,27971,6,5020,26819,6,6103,26819,
+ POLARQUADSTRIP,20,9,5020,26819,9,6103,26819,9,5053,27971,9,6143,27971,
+ POLARQUADSTRIP,20,11,5053,27971,11,6143,27971,11,5020,26819,11,6103,26819,
+ POLARQUADSTRIP,20,14,5020,26819,14,6103,26819,14,5053,27971,14,6143,27971,
+ POLARQUADSTRIP,20,16,5053,27971,16,6143,27971,16,5020,26819,16,6103,26819,
+ POLARQUADSTRIP,20,19,5020,26819,19,6103,26819,19,5053,27971,19,6143,27971,
+
+ POLARQUADSTRIP,20,1,6143,27971,1,5053,27971,2,6143,27971,2,5053,27971,
+ 3,6143,27971,3,5053,27971,4,6143,27971,4,5053,27971,
+ POLARQUADSTRIP,20,6,6143,27971,6,5053,27971,7,6143,27971,7,5053,27971,
+ 8,6143,27971,8,5053,27971,9,6143,27971,9,5053,27971,
+ POLARQUADSTRIP,20,11,6143,27971,11,5053,27971,12,6143,27971,12,5053,27971,
+ 13,6143,27971,13,5053,27971,14,6143,27971,14,5053,27971,
+ POLARQUADSTRIP,20,16,6143,27971,16,5053,27971,17,6143,27971,17,5053,27971,
+ 18,6143,27971,18,5053,27971,19,6143,27971,19,5053,27971,
+
+ ENDOFDATA
+};
+
+static double piece_size;
+
+static int
+enumerate_ring_vertices( int steps, unsigned short *data, void *h,
+ void (*process_vertex)(void *h,double x,double y,double z))
+{
+ int patlen = 1,i;
+ unsigned short *pts = data;
+ double dtheta = M_PI * 2 / steps;
+
+ if( data[0] == PATTERN) {
+ patlen = data[1];
+ pts += 2;
+ }
+
+ if( pts[0] == 0) steps = 1;
+
+ for( i=0; i < steps; i++) {
+ double r = pts[(i % patlen)*2] * piece_size;
+ double y = pts[(i % patlen)*2+1] * piece_size;
+ double theta = dtheta * i;
+
+ process_vertex( h, r * cos(theta), y, r * sin(theta));
+ }
+
+ return pts + patlen * 2 - data;
+}
+
+static void
+enumerate_vertices( unsigned short *data, void *h,
+ void (*process_vertex)(void *h,double x,double y,double z))
+{
+ while(1) {
+ if( data[0] == SPIN) {
+ int steps;
+ steps = data[1];
+ data += 2;
+
+ while(data[0] <= SEAM) {
+ if( data[0] == SETBACKREF || data[0] == BACKREF) {
+ data += 2;
+ continue;
+ } else if( data[0] == STEPUP) {
+ steps *= 2;
+ data++;
+ continue;
+ } else if( data[0] == STEPDOWN) {
+ steps /= 2;
+ data++;
+ continue;
+ } else if( data[0] == SEAM) {
+ data ++;
+ /* Visit seam vertices twice */
+ enumerate_ring_vertices( steps, data,
+ h, process_vertex);
+ data += enumerate_ring_vertices( steps, data,
+ h, process_vertex);
+ } else {
+ data += enumerate_ring_vertices( steps, data,
+ h, process_vertex);
+ }
+ }
+ } else if( data[0] == POLARQUADSTRIP) {
+ int steps = data[1];
+ double dtheta;
+ data += 2;
+
+ dtheta = M_PI * 2 / steps;
+
+ while(data[0] <= SEAM) {
+ if( data[0] != BACKREF) {
+ double theta = dtheta * data[0];
+ double r = data[1] * piece_size;
+ double y = data[2] * piece_size;
+ process_vertex( h, r * cos(theta), y, r * sin(theta));
+ }
+ data += 3;
+ }
+ } else if( data[0] == QUADSTRIP || data[0] == VERTICES) {
+ data ++;
+
+ while(data[0] <= SEAM) {
+ if( data[0] == SETBACKREF) {
+ data += 2;
+ continue;
+ }
+
+ if( data[0] != BACKREF) {
+ double x = (signed short)data[0] * piece_size;
+ double y = data[1] * piece_size;
+ double z = (signed short)data[2] * piece_size;
+ process_vertex( h, x, y, z);
+ }
+ data += 3;
+ }
+ } else if( data[0] == QUADS || data[0] == TRIANGLES) {
+ data ++;
+ while( data[0] <= SEAM) data++;
+ } else {
+ break;
+ }
+ }
+}
+
+static void
+enumerate_ring_faces( int basevertex, int steps,
+ int prevbase, int prevsteps, void *h, int *count_ret,
+ void (*process_face)(void *h,int v1,int v2,int v3,int v4))
+{
+ int i,j;
+
+ if( steps == 1) {
+ for( i=0; i < prevsteps; i++) {
+ process_face( h,
+ basevertex,
+ prevbase + i,
+ prevbase + (i ? i-1 : prevsteps-1),
+ -1);
+ if (count_ret) (*count_ret)++;
+ }
+ } else if( steps == prevsteps) {
+ for( i=0; i < steps; i++) {
+ process_face( h,
+ basevertex + i,
+ prevbase + i,
+ prevbase + (i ? i-1 : steps-1),
+ basevertex + (i ? i-1 : steps-1));
+ if (count_ret) (*count_ret)++;
+ }
+ } else {
+ j = 0;
+ for( i=0;; i++) {
+ while( j < prevsteps && steps*(1+2*j) < prevsteps*(1+2*i)) {
+ process_face( h,
+ basevertex + (i%steps),
+ prevbase + ((j+1)%prevsteps),
+ prevbase + j,
+ -1);
+ if (count_ret) (*count_ret)++;
+ j++;
+ }
+ if( i == steps) break;
+ process_face( h,
+ basevertex + i,
+ basevertex + ((i+1)%steps),
+ prevbase + (j%prevsteps),
+ -1);
+ if (count_ret) (*count_ret)++;
+ }
+ }
+}
+
+static void
+enumerate_faces( unsigned short *data, void *h, int *count_ret,
+ void (*process_face)(void *h,int v1,int v2,int v3,int v4))
+{
+ int basevertex = 0, startofvertices = 0;
+ int backrefs[5];
+
+ while(1) {
+ if( data[0] == SPIN) {
+ int steps;
+ int prevsteps = -1,prevbase = 0;
+
+ steps = data[1];
+ data += 2;
+
+ while( data[0] <= SEAM) {
+ if( data[0] == SETBACKREF) {
+ backrefs[data[1]] = basevertex;
+ data += 2;
+ continue;
+ }
+
+ if( data[0] == STEPUP) {
+ steps *= 2;
+ data++;
+ continue;
+ } else if( data[0] == STEPDOWN) {
+ steps /= 2;
+ data++;
+ continue;
+ }
+
+ if( data[0] == BACKREF) {
+ if( prevsteps != -1) {
+ enumerate_ring_faces( backrefs[data[1]], steps,
+ prevbase, prevsteps, h,
+ count_ret, process_face);
+ }
+
+ prevbase = backrefs[data[1]];
+ data += 2;
+ } else {
+ int isseam = 0;
+ if( data[0] == SEAM) {
+ isseam = 1;
+ data++;
+ }
+
+ if( data[0] == PATTERN) {
+ data += 2 + data[1]*2;
+ } else {
+ if( data[0] == 0) steps = 1;
+ data += 2;
+ }
+
+ if( prevsteps != -1) {
+ enumerate_ring_faces( basevertex, steps,
+ prevbase, prevsteps, h,
+ count_ret, process_face);
+ }
+
+ if( isseam) basevertex += steps;
+ prevbase = basevertex;
+ basevertex += steps;
+ }
+
+ prevsteps = steps;
+ }
+ } else if( data[0] == POLARQUADSTRIP || data[0] == QUADSTRIP) {
+ int v0=-1,v1=0,v2,v3;
+ if( data[0] == POLARQUADSTRIP) data += 2;
+ else data ++;
+ while(data[0] <= SEAM) {
+ if( data[0] == BACKREF) {
+ v2 = backrefs[data[1]]+data[2];
+ } else {
+ v2 = basevertex;
+ basevertex++;
+ }
+ if( data[3] == BACKREF) {
+ v3 = backrefs[data[4]]+data[5];
+ } else {
+ v3 = basevertex;
+ basevertex++;
+ }
+ data += 6;
+ if( v0 != -1) {
+ process_face( h, v0, v1, v3, v2);
+ if (count_ret) (*count_ret)++;
+ }
+ v0 = v2;
+ v1 = v3;
+ }
+ } else if( data[0] == VERTICES) {
+ data ++;
+ startofvertices = basevertex;
+ while( data[0] <= SEAM) {
+ if( data[0] == SETBACKREF) {
+ backrefs[data[1]] = basevertex;
+ data += 2;
+ continue;
+ }
+ data += 3;
+ basevertex ++;
+ }
+ } else if( data[0] == QUADS) {
+ data ++;
+ while( data[0] <= SEAM) {
+ process_face( h,
+ data[0] + startofvertices,
+ data[1] + startofvertices,
+ data[2] + startofvertices,
+ data[3] + startofvertices);
+ if (count_ret) (*count_ret)++;
+ data += 4;
+ }
+ } else if( data[0] == TRIANGLES) {
+ data ++;
+ while( data[0] <= SEAM) {
+ process_face( h,
+ data[0] + startofvertices,
+ data[1] + startofvertices,
+ data[2] + startofvertices, -1);
+ if (count_ret) (*count_ret)++;
+ data += 3;
+ }
+ } else {
+ break;
+ }
+ }
+}
+
+static void
+normalize( float v[3]) {
+ float d = sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
+
+ if( d == 0.0) {
+ /* The direction is undefined - normalize it anyway */
+ v[0] = 1.0;
+ v[1] = 0.0;
+ v[2] = 0.0;
+ return;
+ }
+
+ v[0] /= d;
+ v[1] /= d;
+ v[2] /= d;
+}
+
+static void
+normcrossprod( float v1[3], float v2[3], float out[3])
+{
+ out[0] = v1[1] * v2[2] - v1[2] * v2[1];
+ out[1] = v1[2] * v2[0] - v1[0] * v2[2];
+ out[2] = v1[0] * v2[1] - v1[1] * v2[0];
+ normalize( out);
+}
+
+#define vectordiff(v1,v2,out) \
+ ((out)[0] = (v1)[0] - (v2)[0], \
+ (out)[1] = (v1)[1] - (v2)[1], \
+ (out)[2] = (v1)[2] - (v2)[2])
+
+#define vectoradd(v1,v2) \
+ ((v1)[0] += (v2)[0], \
+ (v1)[1] += (v2)[1], \
+ (v1)[2] += (v2)[2])
+
+static int numverts;
+static float *vertices;
+static float *normals;
+
+static void
+count_vertex( void *dummy, double x, double y, double z)
+{
+ numverts++;
+}
+
+static void
+add_normal( void *dummy, int v1, int v2, int v3, int v4)
+{
+ float surfnormal[3],d1[3],d2[3];
+
+ if( v4 == -1) {
+ vectordiff( vertices + 3 * v2, vertices + 3 * v1, d1);
+ vectordiff( vertices + 3 * v3, vertices + 3 * v1, d2);
+ normcrossprod( d1, d2, surfnormal);
+ vectoradd( normals + 3 * v1, surfnormal);
+ vectoradd( normals + 3 * v2, surfnormal);
+ vectoradd( normals + 3 * v3, surfnormal);
+ } else {
+ vectordiff( vertices + 3 * v2, vertices + 3 * v1, d1);
+ vectordiff( vertices + 3 * v4, vertices + 3 * v1, d2);
+ normcrossprod( d1, d2, surfnormal);
+ vectoradd( normals + 3 * v1, surfnormal);
+ vectordiff( vertices + 3 * v3, vertices + 3 * v2, d1);
+ vectordiff( vertices + 3 * v1, vertices + 3 * v2, d2);
+ normcrossprod( d1, d2, surfnormal);
+ vectoradd( normals + 3 * v2, surfnormal);
+ vectordiff( vertices + 3 * v4, vertices + 3 * v3, d1);
+ vectordiff( vertices + 3 * v2, vertices + 3 * v3, d2);
+ normcrossprod( d1, d2, surfnormal);
+ vectoradd( normals + 3 * v3, surfnormal);
+ vectordiff( vertices + 3 * v1, vertices + 3 * v4, d1);
+ vectordiff( vertices + 3 * v3, vertices + 3 * v4, d2);
+ normcrossprod( d1, d2, surfnormal);
+ vectoradd( normals + 3 * v4, surfnormal);
+ }
+}
+
+static void
+collect_vertex( void *curvert, double x, double y, double z)
+{
+ (*(float**)curvert)[0] = x;
+ (*(float**)curvert)[1] = y;
+ (*(float**)curvert)[2] = z;
+ (*(float**)curvert) += 3;
+}
+
+static void
+draw_face( void *dummy, int v1, int v2, int v3, int v4)
+{
+ glBegin( v4 == -1 ? GL_TRIANGLES : GL_QUADS);
+ glNormal3f( normals[v1*3], normals[v1*3+1], normals[v1*3+2]);
+ glVertex3f( vertices[v1*3], vertices[v1*3+1], vertices[v1*3+2]);
+ glNormal3f( normals[v2*3], normals[v2*3+1], normals[v2*3+2]);
+ glVertex3f( vertices[v2*3], vertices[v2*3+1], vertices[v2*3+2]);
+ glNormal3f( normals[v3*3], normals[v3*3+1], normals[v3*3+2]);
+ glVertex3f( vertices[v3*3], vertices[v3*3+1], vertices[v3*3+2]);
+ if( v4 != -1) {
+ glNormal3f( normals[v4*3], normals[v4*3+1], normals[v4*3+2]);
+ glVertex3f( vertices[v4*3], vertices[v4*3+1], vertices[v4*3+2]);
+ }
+ glEnd();
+}
+
+static int
+draw_piece( unsigned short *piece_data)
+{
+ int i;
+ float *curvert;
+ int count = 0;
+
+ /* Count how many vertices this piece has */
+ enumerate_vertices( piece_data, NULL, count_vertex);
+
+ /* Allocate memory for the vertices and for the vertex normals */
+ vertices = malloc( sizeof(float) * 3 * numverts);
+ normals = malloc( sizeof(float) * 3 * numverts);
+ if( !vertices || !normals) exit(1);
+
+ /* Collect the vertex coordinates */
+ curvert = vertices;
+ enumerate_vertices( piece_data, &curvert, collect_vertex);
+
+ /* Zero out the normals */
+ for( i=0; i < numverts * 3; i++) {
+ normals[i] = 0.0;
+ }
+
+ /* Add up all the face normals at each vertex */
+ enumerate_faces( piece_data, NULL, NULL, add_normal);
+
+ /* Normalize the vertex normals */
+ for( i=0; i < numverts; i++) {
+ normalize( normals + i * 3);
+ }
+
+ /* Now draw the faces */
+ enumerate_faces( piece_data, NULL, &count, draw_face);
+
+ free( normals);
+ free( vertices);
+
+ if (count <= 1) abort();
+ return count;
+}
+
+void chessmodels_gen_lists( int classic, int poly_count[PIECES]) {
+
+ Bool queen_only_p = classic < 0;
+ if (classic < 0) classic = 0;
+
+ piece_size = classic ? 0.095 / 100 : 0.3 / 8192;
+
+ glGenLists (20); /* this is horrible! List numbers are hardcoded! */
+
+ glNewList(QUEEN, GL_COMPILE);
+ poly_count[QUEEN] = draw_piece( classic ? classic_queen_data : queen_data);
+ glEndList();
+
+ if (queen_only_p) return;
+
+ glNewList(KING, GL_COMPILE);
+ poly_count[KING] = draw_piece( classic ? classic_king_data : king_data);
+ glEndList();
+
+ glNewList(BISHOP, GL_COMPILE);
+ poly_count[BISHOP] = draw_piece( classic ? classic_bishop_data : bishop_data);
+ glEndList();
+
+ glNewList(KNIGHT, GL_COMPILE);
+ poly_count[KNIGHT] = draw_piece( classic ? classic_knight_data : knight_data);
+ glEndList();
+
+ glNewList(ROOK, GL_COMPILE);
+ poly_count[ROOK] = draw_piece( classic ? classic_rook_data : rook_data);
+ glEndList();
+
+ glNewList(PAWN, GL_COMPILE);
+ poly_count[PAWN] = draw_piece( classic ? classic_pawn_data : pawn_data);
+ glEndList();
+}
diff --git a/hacks/glx/chessmodels.h b/hacks/glx/chessmodels.h
new file mode 100644
index 0000000..6e41e22
--- /dev/null
+++ b/hacks/glx/chessmodels.h
@@ -0,0 +1,44 @@
+/*
+ * models for the xss chess screensavers
+ * hacked from:
+ *
+ * glChess - A 3D chess interface
+ *
+ * Copyright (C) 2006 John-Paul Gignac <jjgignac@users.sf.net>
+ *
+ * Copyright (C) 2002 Robert Ancell <bob27@users.sourceforge.net>
+ * Michael Duelli <duelli@users.sourceforge.net>
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ugggggggly */
+#define PIECES 7
+#define NONE 0
+#define KING 1
+#define QUEEN 2
+#define BISHOP 3
+#define KNIGHT 4
+#define ROOK 5
+#define PAWN 6
+#define BKING 8
+#define BQUEEN 9
+#define BBISHOP 10
+#define BKNIGHT 11
+#define BROOK 12
+#define BPAWN 13
+
+extern void chessmodels_gen_lists( int classic, int poly_count[PIECES]);
+
diff --git a/hacks/glx/circuit.c b/hacks/glx/circuit.c
new file mode 100644
index 0000000..744e4b6
--- /dev/null
+++ b/hacks/glx/circuit.c
@@ -0,0 +1,2094 @@
+/*
+ * circuit - Random electronic components floating around
+ *
+ * version 1.4
+ *
+ * Since version 1.1: added to-220 transistor, added fuse
+ * Since version 1.2: random display digits, LED improvements (flickering)
+ * Since version 1.3: ICs look better, font textures, improved normals to
+ * eliminate segmenting on curved surfaces, speedups
+ * Since version 1.4: Added RCA connector, 3.5mm connector, slide switch,
+ * surface mount, to-92 markings. Fixed ~5min crash.
+ * Better LED illumination. Other minor changes.
+ *
+ * Copyright (C) 2001-2015 Ben Buxton (bb@cactii.net)
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* Written over a few days in a (successful) bid to learn GL coding
+ *
+ * -seven option is dedicated to all the Slarkeners
+ *
+ * This hack uses lookup tables for sin, cos and tan - it can do a lot
+ */
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*suppressRotationAnimation: True\n" \
+ "*componentFont: -*-courier-bold-r-normal-*-*-140-*-*-*-*-*-*"
+
+# define release_circuit 0
+# define circuit_handle_event xlockmore_no_events
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#define DEF_SPIN "True"
+#define DEF_SEVEN "False"
+#define DEF_PARTS "10"
+#define DEF_ROTATESPEED "1"
+#define DEF_LIGHT "True"
+
+/* lifted from lament.c */
+#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+
+#ifdef USE_GL
+
+#include "texfont.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+static int maxparts;
+static int rotatespeed;
+static int spin;
+static int uselight;
+static int seven;
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+static XrmOptionDescRec opts[] = {
+ {"-parts", ".circuit.parts", XrmoptionSepArg, 0 },
+ {"-rotate-speed", ".circuit.rotatespeed", XrmoptionSepArg, 0 },
+ {"+spin", ".circuit.spin", XrmoptionNoArg, "false" },
+ {"-spin", ".circuit.spin", XrmoptionNoArg, "true" },
+ {"+light", ".circuit.light", XrmoptionNoArg, "false" },
+ {"-light", ".circuit.light", XrmoptionNoArg, "true" },
+ {"+seven", ".circuit.seven", XrmoptionNoArg, "false" },
+ {"-seven", ".circuit.seven", XrmoptionNoArg, "true" },
+};
+
+static argtype vars[] = {
+ {&maxparts, "parts", "Parts", DEF_PARTS, t_Int},
+ {&rotatespeed, "rotatespeed", "Rotatespeed", DEF_ROTATESPEED, t_Int},
+ {&spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&uselight, "light", "Light", DEF_LIGHT, t_Bool},
+ {&seven, "seven", "Seven", DEF_SEVEN, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt circuit_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct circuit_description =
+{"circuit", "init_circuit", "draw_circuit", NULL,
+ "draw_circuit", "init_circuit", "free_circuit", &circuit_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "Flying electronic components", 0, NULL};
+
+#endif
+
+#define MAX_COMPONENTS 400
+#define MOVE_MULT 0.02
+
+static float f_rand(void)
+{
+ return ((float)RAND(10000)/(float)10000);
+}
+
+#define RAND_RANGE(min, max) ((min) + (max - min) * f_rand())
+
+/* Represents a band on a resistor/diode/etc */
+typedef struct {
+ float pos; /* relative position from start/previous band */
+ GLfloat r, g, b; /* colour of the band */
+ float len; /* length as a fraction of total length */
+} Band;
+
+typedef struct {
+ Band *b1, *b2, *b3, *b4; /* bands */
+ int b[4];
+} Resistor;
+
+typedef struct {
+ Band *band;
+ GLfloat r, g, b; /* body colour */
+} Diode;
+
+static const char * const transistortypes[] = {
+ "TIP2955",
+ "TIP32C",
+ "LM 350T",
+ "IRF730",
+ "ULN2577",
+ "7805T",
+ "7912T",
+ "TIP120",
+ "2N6401",
+ "BD239",
+ "2SC1590",
+ "MRF485",
+ "SC141D"
+};
+
+static const char * const to92types[] = {
+ "C\n548",
+ "C\n848",
+ "74\nL05",
+ "C\n858",
+ "BC\n212L",
+ "BC\n640",
+ "BC\n337",
+ "BC\n338",
+ "S817",
+ "78\nL12",
+ "TL\n431",
+ "LM\n35DZ",
+};
+
+static const char * const smctypes[] = {
+ "1M-",
+ "1K",
+ "1F",
+ "B10",
+ "S14",
+ "Q3",
+ "4A"
+};
+
+typedef struct {
+ int type; /* package type. 0 = to-92, 1 = to-220 */
+ const char *text;
+} Transistor;
+
+typedef struct {
+ GLfloat r,g,b; /* LED colour */
+ int light; /* are we the light source? */
+} LED;
+
+typedef struct {
+ int type; /* 0 = electro, 1 = ceramic */
+ float width; /* width of an electro/ceramic */
+ float length; /* length of an electro */
+} Capacitor;
+
+/* 3.5 mm plug */
+typedef struct {
+ int blah;
+} ThreeFive;
+
+/* slide switch */
+typedef struct {
+ int position;
+} Switch;
+
+typedef struct {
+ int pins;
+ const char *val;
+} ICTypes;
+
+static const ICTypes ictypes[] = {
+ {8, "NE 555"},
+ {8, "LM 386N"},
+ {8, "ADC0831"},
+ {8, "LM 383T"},
+ {8, "TL071"},
+ {8, "LM 311"},
+ {8, "LM393"},
+ {8, "LM 3909"},
+
+ {14, "LM 380N"},
+ {14, "NE 556"},
+ {14, "TL074"},
+ {14, "LM324"},
+ {14, "LM339"},
+ {14, "MC1488"},
+ {14, "MC1489"},
+ {14, "LM1877-9"},
+ {14, "4011"},
+ {14, "4017"},
+ {14, "4013"},
+ {14, "4024"},
+ {14, "4066"},
+
+ {16, "4076"},
+ {16, "4049"},
+ {16, "4094"},
+ {16, "4043"},
+ {16, "4510"},
+ {16, "4511"},
+ {16, "4035"},
+ {16, "RS232"},
+ {16, "MC1800"},
+ {16, "ULN2081"},
+ {16, "UDN2953"},
+
+ {24, "ISD1416P"},
+ {24, "4515"},
+ {24, "TMS6264L"},
+ {24, "MC146818"}
+};
+
+typedef struct {
+ int type; /* 0 = DIL, 1 = flat square */
+ int pins;
+ char text[100];
+} IC;
+
+/* 7 segment display */
+
+typedef struct {
+ int value; /* displayed number */
+} Disp;
+
+typedef struct {
+ GLfloat l, w;
+} Fuse;
+
+typedef struct {
+ GLfloat l, w;
+ int col;
+} RCA;
+
+typedef struct {
+ GLfloat x, y, z; /* current co-ordinates */
+ GLfloat dx, dy, dz; /* current direction */
+ GLfloat rotx, roty, rotz; /* rotation vector */
+ GLfloat drot; /* rotation velocity (degrees per frame) */
+ int norm; /* Normalize this component (for shine) */
+ int rdeg; /* current rotation degrees */
+ int angle; /* angle about the z axis */
+ int alpha; /* 0 if not a transparent component */
+ int type; /* 0 = resistor, 1 = diode, 2 = transistor, 3 = LED, 4 = cap, 5=IC,
+ 6 = 7 seg disp */
+ void * c; /* pointer to the component */
+} Component;
+
+/* standard colour codes */
+
+static const GLfloat colorcodes [12][3] = {
+ {0.0,0.0,0.0}, /* black 0 */
+ {0.49,0.25,0.08}, /* brown 1 */
+ {1.0,0.0,0.0}, /* red 2 */
+ {1.0,0.5,0.0}, /* orange 3 */
+ {1.0,1.0,0.0}, /* yellow 4 */
+ {0.0,1.0,0.0}, /* green 5 */
+ {0.0,0.5,1.0}, /* blue 6 */
+ {0.7,0.2,1.0}, /* violet 7 */
+ {0.5,0.5,0.5}, /* grey 8 */
+ {1.0,1.0,1.0}, /* white 9 */
+ {0.66,0.56,0.2}, /* gold 10 */
+ {0.8,0.8,0.8}, /* silver 11 */
+};
+
+/* base values for components - we can multiply by 0 - 1M */
+static const int values [9][2] = {
+ {1,0},
+ {2,2},
+ {3,3},
+ {4,7},
+ {5,6},
+ {6,8},
+ {7,5},
+ {8,2},
+ {9,1}
+};
+
+typedef struct {
+ GLXContext *glx_context;
+ Window window;
+
+ int XMAX, YMAX;
+ int win_w, win_h;
+
+ /* one lucky led gets to be a light source , unless -no-light*/
+ int light;
+ int lighton;
+
+ /* stores refs to textures */
+ int s_refs[50];
+
+ GLfloat viewer[3];
+ GLfloat lightpos[4];
+
+ float sin_table[720];
+ float cos_table[720];
+ float tan_table[720];
+
+ Component *components[MAX_COMPONENTS];
+ int band_list[12];
+ int band_list_polys[12];
+
+ GLfloat grid_col[3], grid_col2[3];
+
+ int display_i;
+ GLfloat rotate_angle;
+
+ texture_font_data *font;
+ char *font_strings[50]; /* max of 40 textures */
+ int font_w[50], font_h[50];
+ int font_init;
+
+ GLfloat draw_sx, draw_sy; /* bright spot co-ords */
+ int draw_sdir; /* 0 = left-right, 1 = right-left, 2 = up->dn, 3 = dn->up */
+ int draw_s; /* if spot is enabled */
+ float draw_ds; /* speed of spot */
+
+} Circuit;
+
+static Circuit *circuit = NULL;
+
+
+static int DrawResistor(Circuit *, Resistor *);
+static int DrawDiode(Circuit *, Diode *);
+static int DrawTransistor(Circuit *, Transistor *);
+static int DrawLED(Circuit *, LED *);
+static int DrawIC(Circuit *, IC *);
+static int DrawCapacitor(Circuit *, Capacitor *);
+static int DrawDisp(Circuit *, Disp *);
+static int DrawFuse(Circuit *, Fuse *);
+static int DrawRCA(Circuit *, RCA *);
+static int DrawThreeFive(Circuit *, ThreeFive *);
+static int DrawSwitch(Circuit *, Switch *);
+
+static void reorder(Component *[]);
+static int circle(Circuit *, float, int,int);
+static int bandedCylinder(Circuit *,
+ float, float , GLfloat, GLfloat , GLfloat,
+ Band **, int);
+static int Rect(GLfloat , GLfloat , GLfloat, GLfloat , GLfloat ,GLfloat);
+static int ICLeg(GLfloat, GLfloat, GLfloat, int);
+static int HoledRectangle(Circuit *ci,
+ GLfloat, GLfloat, GLfloat, GLfloat, int);
+static Resistor *NewResistor(void);
+static Diode *NewDiode(void);
+static Transistor *NewTransistor(ModeInfo *);
+static LED * NewLED(Circuit *);
+static Capacitor *NewCapacitor(Circuit *);
+static IC* NewIC(ModeInfo *);
+static Disp* NewDisp(Circuit *);
+static Fuse *NewFuse(Circuit *);
+static RCA *NewRCA(Circuit *);
+static ThreeFive *NewThreeFive(Circuit *);
+static Switch *NewSwitch(Circuit *);
+
+/* we use trig tables to speed things up - 200 calls to sin()
+ in one frame can be a bit harsh..
+*/
+
+static void make_tables(Circuit *ci)
+{
+int i;
+float f;
+
+ f = 360 / (M_PI * 2);
+ for (i = 0 ; i < 720 ; i++) {
+ ci->sin_table[i] = sin(i/f);
+ }
+ for (i = 0 ; i < 720 ; i++) {
+ ci->cos_table[i] = cos(i/f);
+ }
+ for (i = 0 ; i < 720 ; i++) {
+ ci->tan_table[i] = tan(i/f);
+ }
+}
+
+
+static int createCylinder (Circuit *ci,
+ float length, float radius, int endcaps, int half)
+{
+ int polys = 0;
+ int a; /* current angle around cylinder */
+ int angle, norm;
+ float z1, y1, z2, y2,ex;
+ int nsegs;
+
+ glPushMatrix();
+ nsegs = radius*MAX(ci->win_w, ci->win_h)/20;
+ nsegs = MAX(nsegs, 4);
+ if (nsegs % 2)
+ nsegs += 1;
+ angle = (half) ? (180 - 90/nsegs) : 374;
+ z1 = radius; y1 = 0;
+ glBegin(GL_QUADS);
+ for (a = 0 ; a <= angle ; a+= angle/nsegs) {
+ y2=radius*(float)ci->sin_table[(int)a];
+ z2=radius*(float)ci->cos_table[(int)a];
+ glNormal3f(0, y1, z1);
+ glVertex3f(0,y1,z1);
+ glVertex3f(length,y1,z1);
+ glNormal3f(0, y2, z2);
+ glVertex3f(length,y2,z2);
+ glVertex3f(0,y2,z2);
+ polys++;
+ z1=z2;
+ y1=y2;
+ }
+ glEnd();
+ if (half) {
+ glBegin(GL_POLYGON);
+ glNormal3f(0, 1, 0);
+ glVertex3f(0, 0, radius);
+ glVertex3f(length, 0, radius);
+ glVertex3f(length, 0, 0 - radius);
+ glVertex3f(0, 0, 0 - radius);
+ polys++;
+ glEnd();
+ }
+ if (endcaps) {
+ for(ex = 0 ; ex <= length ; ex += length) {
+ z1 = radius; y1 = 0;
+ norm = (ex == length) ? 1 : -1;
+ glBegin(GL_TRIANGLES);
+ glNormal3f(norm, 0, 0);
+ for (a = 0 ; a <= angle ; a+= angle/nsegs) {
+ y2=radius*(float)ci->sin_table[(int)a];
+ z2=radius*(float)ci->cos_table[(int)a];
+ glVertex3f(ex,0, 0);
+ glVertex3f(ex,y1,z1);
+ glVertex3f(ex,y2,z2);
+ polys++;
+ z1=z2;
+ y1=y2;
+ }
+ glEnd();
+ }
+ }
+ glPopMatrix();
+ return polys;
+}
+
+static int circle(Circuit *ci, float radius, int segments, int half)
+{
+ int polys = 0;
+ float x1 = 0, x2 = 0;
+ float y1 = 0, y2 = 0;
+ int i, t, s;
+
+ if (half) {
+ t = 270; s = 90;
+ x1 = radius, y1 = 0;
+ } else {
+ t = 360, s = 0;
+ }
+ glBegin(GL_TRIANGLES);
+ glNormal3f(1, 0, 0);
+ for(i=s;i<=t;i+=10)
+ {
+ float angle=i;
+ x2=radius*(float)ci->cos_table[(int)angle];
+ y2=radius*(float)ci->sin_table[(int)angle];
+ glVertex3f(0,0,0);
+ glVertex3f(0,y1,x1);
+ glVertex3f(0,y2,x2);
+ polys++;
+ x1=x2;
+ y1=y2;
+ }
+ glEnd();
+ return polys;
+}
+
+static int wire(Circuit *ci, float len)
+{
+ int polys = 0;
+ GLfloat col[] = {0.3, 0.3, 0.3, 1.0};
+ GLfloat spec[] = {0.9, 0.9, 0.9, 1.0};
+ GLfloat nospec[] = {0.4, 0.4, 0.4, 1.0};
+ GLfloat shin = 30;
+ int n;
+
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+ glMaterialfv(GL_FRONT, GL_SHININESS, &shin);
+ n = glIsEnabled(GL_NORMALIZE);
+ if (!n) glEnable(GL_NORMALIZE);
+ polys += createCylinder(ci, len, 0.05, 1, 0);
+ if (!n) glDisable(GL_NORMALIZE);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, nospec);
+ return polys;
+}
+
+static int sphere(Circuit *ci, GLfloat r, float stacks, float slices,
+ int startstack, int endstack, int startslice,
+ int endslice)
+{
+ int polys = 0;
+ GLfloat d, d1, dr, dr1, Dr, Dr1, D, D1, z1, z2, y1, y2, Y1, Z1, Y2, Z2;
+ int a, a1, b, b1, c0, c1;
+ GLfloat step, sstep;
+
+ step = 180/stacks;
+ sstep = 360/slices;
+ a1 = startstack * step;
+ b1 = startslice * sstep;
+ y1 = z1 = Y1 = Z1 = 0;
+ c0 = (endslice / slices) * 360;
+ c1 = (endstack/stacks)*180;
+ glBegin(GL_QUADS);
+ for (a = startstack * step ; a <= c1 ; a+= step) {
+ d=ci->sin_table[a];
+ d1=ci->sin_table[a1];
+ D=ci->cos_table[a];
+ D1=ci->cos_table[a1];
+ dr = d * r;
+ dr1 = d1 * r;
+ Dr = D * r;
+ Dr1 = D1 * r;
+ for (b = b1 ; b <= c0 ; b+= sstep) {
+ y2=dr*ci->sin_table[b];
+ z2=dr*ci->cos_table[b];
+ Y2=dr1*ci->sin_table[b];
+ Z2=dr1*ci->cos_table[b];
+ glNormal3f(Dr, y1, z1);
+ glVertex3f(Dr,y1,z1);
+ glNormal3f(Dr, y2, z2);
+ glVertex3f(Dr,y2,z2);
+ glNormal3f(Dr1, Y2, Z2);
+ glVertex3f(Dr1,Y2,Z2);
+ glNormal3f(Dr1, Y1, Z1);
+ glVertex3f(Dr1,Y1,Z1);
+ polys++;
+ z1=z2;
+ y1=y2;
+ Z1=Z2;
+ Y1=Y2;
+ }
+ a1 = a;
+ }
+ glEnd();
+ return polys;
+}
+
+static int DrawComponent(Circuit *ci, Component *c, unsigned long *polysP)
+{
+ int polys = *polysP;
+ int ret = 0; /* return 1 if component is freed */
+
+ glPushMatrix();
+ glTranslatef(c->x, c->y, c->z);
+ if (c->angle > 0) {
+ glRotatef(c->angle, c->rotx, c->roty, c->rotz);
+ }
+ if (spin) {
+ glRotatef(c->rdeg, c->rotx, c->roty, c->rotz);
+ c->rdeg += c->drot;
+ }
+
+ if (c->norm)
+ glEnable(GL_NORMALIZE);
+ else
+ glDisable(GL_NORMALIZE);
+
+ /* call object draw routine here */
+ if (c->type == 0) {
+ polys += DrawResistor(ci, c->c);
+ } else if (c->type == 1) {
+ polys += DrawDiode(ci, c->c);
+ } else if (c->type == 2) {
+ polys += DrawTransistor(ci, c->c);
+ } else if (c->type == 3) {
+ if (((LED *)c->c)->light && ci->light) {
+ GLfloat lp[] = {0.1, 0, 0, 1};
+ glEnable(GL_LIGHT1);
+ glLightfv(GL_LIGHT1, GL_POSITION, lp);
+ }
+ polys += DrawLED(ci, c->c);
+ } else if (c->type == 4) {
+ polys += DrawCapacitor(ci, c->c);
+ } else if (c->type == 5) {
+ polys += DrawIC(ci, c->c);
+ } else if (c->type == 6) {
+ polys += DrawDisp(ci, c->c);
+ } else if (c->type == 7) {
+ polys += DrawFuse(ci, c->c);
+ } else if (c->type == 8) {
+ polys += DrawRCA(ci, c->c);
+ } else if (c->type == 9) {
+ polys += DrawThreeFive(ci, c->c);
+ } else if (c->type == 10) {
+ polys += DrawSwitch(ci, c->c);
+ }
+ c->x += c->dx * MOVE_MULT;
+ c->y += c->dy * MOVE_MULT;
+ if (c->x > ci->XMAX/2 || c->x < 0 - ci->XMAX/2 ||
+ c->y > ci->YMAX/2 || c->y < 0 - ci->YMAX/2) {
+ if (c->type == 3 && ((LED *)c->c)->light && ci->light) {
+ glDisable(GL_LIGHT1);
+ ci->light = 0; ci->lighton = 0;
+ }
+ if (c->type == 1)
+ free(((Diode *)c->c)->band); /* remember to free diode band */
+ free(c->c);
+ ret = 1;
+ }
+
+ glPopMatrix();
+ glDisable(GL_NORMALIZE);
+ *polysP = polys;
+ return ret;
+}
+
+/* draw a resistor */
+
+static int DrawResistor(Circuit *ci, Resistor *r)
+{
+ int polys = 0;
+ int i;
+ GLfloat col[] = {0.74, 0.62, 0.46, 1.0};
+ GLfloat spec[] = {0.8, 0.8, 0.8, 1.0};
+ GLfloat shine = 30;
+
+ glTranslatef(-4, 0, 0);
+ polys += wire(ci, 3);
+ glTranslatef(3, 0, 0);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+ glMaterialfv(GL_FRONT, GL_SHININESS, &shine);
+ polys += createCylinder(ci, 1.8, 0.4, 1, 0);
+ glPushMatrix();
+ for (i = 0 ; i < 4 ; i++) {
+ glTranslatef(0.35, 0, 0);
+ glCallList(ci->band_list[r->b[i]]);
+ polys += ci->band_list_polys[r->b[i]];
+ }
+ glPopMatrix();
+ glTranslatef(1.8, 0, 0);
+ polys += wire(ci, 3);
+ return polys;
+}
+
+static int DrawRCA(Circuit *ci, RCA *rca)
+{
+ int polys = 0;
+ GLfloat col[] = {0.6, 0.6, 0.6, 1.0}; /* metal */
+ GLfloat red[] = {1.0, 0.0, 0.0, 1.0}; /* red */
+ GLfloat white[] = {1.0, 1.0, 1.0, 1.0}; /* white */
+ GLfloat spec[] = {1, 1, 1, 1}; /* glass */
+
+ glPushMatrix();
+ glTranslatef(0.3, 0, 0);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ glMateriali(GL_FRONT, GL_SHININESS, 40);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+ polys += createCylinder(ci, 0.7, 0.45, 0, 0);
+ glTranslatef(0.4, 0, 0);
+ polys += createCylinder(ci, 0.9, 0.15, 1, 0);
+ glTranslatef(-1.9, 0, 0);
+ glMateriali(GL_FRONT, GL_SHININESS, 20);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, rca->col ? white : red);
+ polys += createCylinder(ci, 1.5, 0.6, 1, 0);
+ glTranslatef(-0.9, 0, 0);
+ polys += createCylinder(ci, 0.9, 0.25, 0, 0);
+ glTranslatef(0.1, 0, 0);
+ polys += createCylinder(ci, 0.2, 0.3, 0, 0);
+ glTranslatef(0.3, 0, 0);
+ polys += createCylinder(ci, 0.2, 0.3, 1, 0);
+ glTranslatef(0.3, 0, 0);
+ polys += createCylinder(ci, 0.2, 0.3, 1, 0);
+ glPopMatrix();
+ return polys;
+}
+
+static int DrawSwitch(Circuit *ci, Switch *f)
+{
+ int polys = 0;
+ GLfloat col[] = {0.6, 0.6, 0.6, 0}; /* metal */
+ GLfloat dark[] = {0.1, 0.1, 0.1, 1.0}; /* dark */
+ GLfloat brown[] = {0.69, 0.32, 0, 1.0}; /* brown */
+ GLfloat spec[] = {0.9, 0.9, 0.9, 1}; /* shiny */
+
+ glPushMatrix();
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, col);
+ glMaterialfv(GL_FRONT, GL_AMBIENT, dark);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+ glMateriali(GL_FRONT, GL_SHININESS, 90);
+ polys += Rect(-0.25, 0, 0, 1.5, 0.5, 0.75);
+/* polys += Rect(-0.5, 0.5, 0, 2, 0.1, 0.75); */
+ glPushMatrix();
+ glRotatef(90, 1, 0, 0);
+ glTranslatef(-0.5, -0.4, -0.4);
+ polys += HoledRectangle(ci, 0.5, 0.75, 0.1, 0.15, 8);
+ glTranslatef(2, 0, 0);
+ polys += HoledRectangle(ci, 0.5, 0.75, 0.1, 0.15, 8);
+ glPopMatrix();
+ polys += Rect(0.1, -0.4, -0.25, 0.1, 0.4, 0.05);
+ polys += Rect(0.5, -0.4, -0.25, 0.1, 0.4, 0.05);
+ polys += Rect(0.9, -0.4, -0.25, 0.1, 0.4, 0.05);
+ polys += Rect(0.1, -0.4, -0.5, 0.1, 0.4, 0.05);
+ polys += Rect(0.5, -0.4, -0.5, 0.1, 0.4, 0.05);
+ polys += Rect(0.9, -0.4, -0.5, 0.1, 0.4, 0.05);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, dark);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+ polys += Rect(0, 0.5, -0.1, 1, 0.05, 0.5);
+ polys += Rect(0, 0.6, -0.1, 0.5, 0.6, 0.5);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, brown);
+ polys += Rect(-0.2, -0.01, -0.1, 1.4, 0.1, 0.55);
+ glPopMatrix();
+ return polys;
+}
+
+
+static int DrawFuse(Circuit *ci, Fuse *f)
+{
+ int polys = 0;
+ GLfloat col[] = {0.5, 0.5, 0.5, 1.0}; /* endcaps */
+ GLfloat glass[] = {0.4, 0.4, 0.4, 0.3}; /* glass */
+ GLfloat spec[] = {1, 1, 1, 1}; /* glass */
+
+ glPushMatrix();
+ glTranslatef(-1.8, 0, 0);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+ glMateriali(GL_FRONT, GL_SHININESS, 40);
+ polys += createCylinder(ci, 0.8, 0.45, 1, 0);
+ glTranslatef(0.8, 0, 0);
+ glEnable(GL_BLEND);
+ glDepthMask(GL_FALSE);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, glass);
+ glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 40);
+ polys += createCylinder(ci, 2, 0.4, 0, 0);
+ polys += createCylinder(ci, 2, 0.3, 0, 0);
+ glDisable(GL_BLEND);
+ glDepthMask(GL_TRUE);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ glMateriali(GL_FRONT, GL_SHININESS, 40);
+ glBegin(GL_LINES);
+ glVertex3f(0, 0, 0);
+ glVertex3f(2, 0. ,0);
+ glEnd();
+ glTranslatef(2, 0, 0);
+ polys += createCylinder(ci, 0.8, 0.45, 1, 0);
+ glPopMatrix();
+ return polys;
+}
+
+
+static int DrawCapacitor(Circuit *ci, Capacitor *c)
+{
+ int polys = 0;
+ GLfloat col[] = {0, 0, 0, 0};
+ GLfloat spec[] = {0.8, 0.8, 0.8, 0};
+ GLfloat brown[] = {0.84, 0.5, 0};
+ GLfloat shine = 40;
+
+ glPushMatrix();
+ if (c->type) {
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, brown);
+ polys += sphere(ci, c->width, 15, 15, 0, 4 ,0, 15);
+ glTranslatef(1.35*c->width, 0, 0);
+ polys += sphere(ci, c->width, 15, 15, 11, 15, 0, 15);
+ glRotatef(90, 0, 0, 1);
+ glTranslatef(0, 0.7*c->width, 0.3*c->width);
+ polys += wire(ci, 3*c->width);
+ glTranslatef(0, 0, -0.6*c->width);
+ polys += wire(ci, 3*c->width);
+ } else {
+ glTranslatef(0-c->length*2, 0, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, &shine);
+ glBegin(GL_POLYGON);
+ glVertex3f(0, 0.82*c->width, -0.1);
+ glVertex3f(3*c->length, 0.82*c->width, -0.1);
+ glVertex3f(3*c->length, 0.82*c->width, 0.1);
+ glVertex3f(0, 0.82*c->width, 0.1);
+ glEnd();
+ col[0] = 0.0;
+ col[1] = 0.2;
+ col[2] = 0.9;
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
+ glEnable(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(1.0, 1.0);
+ polys += createCylinder(ci, 3.0*c->length, 0.8*c->width, 1, 0);
+ glDisable(GL_POLYGON_OFFSET_FILL);
+ col[0] = 0.7;
+ col[1] = 0.7;
+ col[2] = 0.7;
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
+ polys += circle(ci, 0.6*c->width, 30, 0);
+ col[0] = 0;
+ col[1] = 0;
+ col[2] = 0;
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
+ glTranslatef(3.0*c->length, 0.0, 0);
+ polys += circle(ci, 0.6*c->width, 30, 0);
+ glTranslatef(0, 0.4*c->width, 0);
+ polys += wire(ci, 3*c->length);
+ glTranslatef(0.0, -0.8*c->width, 0);
+ polys += wire(ci, 3.3*c->length);
+ }
+ glPopMatrix();
+ return polys;
+}
+
+static int DrawLED(Circuit *ci, LED *l)
+{
+ int polys = 0;
+ GLfloat col[] = {0, 0, 0, 0.6};
+ GLfloat black[] = {0, 0, 0, 0.6};
+
+ col[0] = l->r; col[1] = l->g; col[2] = l->b;
+ if (l->light && ci->light) {
+ GLfloat dir[] = {-1, 0, 0};
+ glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, dir);
+ if (!ci->lighton) {
+ glLightfv(GL_LIGHT1, GL_SPECULAR, col);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, black);
+ col[0] /= 1.5; col[1] /= 1.5; col[2] /= 1.5;
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, col);
+ glLighti(GL_LIGHT1, GL_SPOT_CUTOFF, (GLint) 90);
+ glLighti(GL_LIGHT1, GL_CONSTANT_ATTENUATION, (GLfloat)1);
+ glLighti(GL_LIGHT1, GL_LINEAR_ATTENUATION, (GLfloat)0);
+ glLighti(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, (GLfloat)0);
+ glLighti(GL_LIGHT1, GL_SPOT_EXPONENT, (GLint) 20);
+ ci->lighton = 1;
+ }
+ }
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, col);
+ /* no transparency when LED is lit */
+ if (!l->light) {
+ glEnable(GL_BLEND);
+ glDepthMask(GL_FALSE);
+ glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
+ }
+ glTranslatef(-0.9, 0, 0);
+ polys += createCylinder(ci, 1.2, 0.3, 0, 0);
+ if (l->light && ci->light) {
+ glDisable(GL_LIGHTING);
+ glColor3fv(col);
+ }
+ polys += sphere(ci, 0.3, 7, 7, 3, 7, 0, 7);
+ if (l->light && ci->light) {
+ glEnable(GL_LIGHTING);
+ } else {
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ }
+
+ glTranslatef(1.2, 0, 0);
+ polys += createCylinder(ci, 0.1, 0.38, 1, 0);
+ glTranslatef(-0.3, 0.15, 0);
+ polys += wire(ci, 3);
+ glTranslatef(0, -0.3, 0);
+ polys += wire(ci, 3.3);
+ if (random() % 50 == 25) {
+ if (l->light) {
+ l->light = 0; ci->light = 0; ci->lighton = 0;
+ glDisable(GL_LIGHT1);
+ } else if (!ci->light) {
+ l->light = 1;
+ ci->light = 1;
+ }
+ }
+ return polys;
+}
+
+
+static int DrawThreeFive(Circuit *ci, ThreeFive *d)
+{
+ int polys = 0;
+ GLfloat shine = 40;
+ GLfloat const dark[] = {0.3, 0.3, 0.3, 0};
+ GLfloat const light[] = {0.6, 0.6, 0.6, 0};
+ GLfloat const cream[] = {0.8, 0.8, 0.6, 0};
+ GLfloat const spec[] = {0.7, 0.7, 0.7, 0};
+
+ glPushMatrix();
+ glMaterialfv(GL_FRONT, GL_SHININESS, &shine);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cream);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+
+ glTranslatef(-2.0, 0, 0);
+ polys += createCylinder(ci, 0.7, 0.2, 0, 0);
+ glTranslatef(0.7, 0, 0);
+ polys += createCylinder(ci, 1.3, 0.4, 1, 0);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, light);
+ glTranslatef(1.3, 0, 0);
+ polys += createCylinder(ci, 1.3, 0.2, 0, 0);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, dark);
+ glTranslatef(0.65, 0, 0);
+ polys += createCylinder(ci, 0.15, 0.21, 0, 0);
+ glTranslatef(0.3, 0, 0);
+ polys += createCylinder(ci, 0.15, 0.21, 0, 0);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, light);
+ glTranslatef(0.4, 0, 0);
+ polys += sphere(ci, 0.23, 7, 7, 0, 5, 0, 7);
+
+ glPopMatrix();
+ return polys;
+}
+
+static int DrawDiode(Circuit *ci, Diode *d)
+{
+ int polys = 0;
+ GLfloat shine = 40;
+ GLfloat col[] = {0.3, 0.3, 0.3, 0};
+ GLfloat spec[] = {0.7, 0.7, 0.7, 0};
+
+ glPushMatrix();
+ glMaterialfv(GL_FRONT, GL_SHININESS, &shine);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+ glTranslatef(-4, 0, 0);
+ polys += wire(ci, 3);
+ glTranslatef(3, 0, 0);
+ polys += bandedCylinder(ci, 0.3, 1.5, d->r, d->g, d->b, &(d->band), 1);
+ glTranslatef(1.5, 0, 0);
+ polys += wire(ci, 3);
+ glPopMatrix();
+ return polys;
+}
+
+static int Rect(GLfloat x, GLfloat y, GLfloat z, GLfloat w, GLfloat h,
+ GLfloat t)
+{
+ int polys = 0;
+ GLfloat yh;
+ GLfloat xw;
+ GLfloat zt;
+
+ yh = y+h; xw = x+w; zt = z - t;
+
+ glBegin(GL_QUADS); /* front */
+ glNormal3f(0, 0, 1);
+ glVertex3f(x, y, z);
+ glVertex3f(x, yh, z);
+ glVertex3f(xw, yh, z);
+ glVertex3f(xw, y, z);
+ polys++;
+ /* back */
+ glNormal3f(0, 0, -1);
+ glVertex3f(x, y, zt);
+ glVertex3f(x, yh, zt);
+ glVertex3f(xw, yh, zt);
+ glVertex3f(xw, y, zt);
+ polys++;
+ /* top */
+ glNormal3f(0, 1, 0);
+ glVertex3f(x, yh, z);
+ glVertex3f(x, yh, zt);
+ glVertex3f(xw, yh, zt);
+ glVertex3f(xw, yh, z);
+ polys++;
+ /* bottom */
+ glNormal3f(0, -1, 0);
+ glVertex3f(x, y, z);
+ glVertex3f(x, y, zt);
+ glVertex3f(xw, y, zt);
+ glVertex3f(xw, y, z);
+ polys++;
+ /* left */
+ glNormal3f(-1, 0, 0);
+ glVertex3f(x, y, z);
+ glVertex3f(x, y, zt);
+ glVertex3f(x, yh, zt);
+ glVertex3f(x, yh, z);
+ polys++;
+ /* right */
+ glNormal3f(1, 0, 0);
+ glVertex3f(xw, y, z);
+ glVertex3f(xw, y, zt);
+ glVertex3f(xw, yh, zt);
+ glVertex3f(xw, yh, z);
+ polys++;
+ glEnd();
+ return polys;
+}
+
+/* IC pins */
+
+static int ICLeg(GLfloat x, GLfloat y, GLfloat z, int dir)
+{
+ int polys = 0;
+ if (dir) {
+ polys += Rect(x-0.1, y, z, 0.1, 0.1, 0.02);
+ polys += Rect(x-0.1, y, z, 0.02, 0.1, 0.1);
+ polys += Rect(x-0.1, y+0.03, z-0.1, 0.02, 0.05, 0.3);
+ } else {
+ polys += Rect(x, y, z, 0.1, 0.1, 0.02);
+ polys += Rect(x+0.8*0.1, y, z, 0.02, 0.1, 0.1);
+ polys += Rect(x+0.8*0.1, y+0.03, z-0.1, 0.02, 0.05, 0.3);
+ }
+ return polys;
+}
+
+
+static int DrawIC(Circuit *ci, IC *c)
+{
+ int polys = 0;
+ GLfloat w, h, d;
+ int z;
+ GLfloat col[] = {0.1, 0.1, 0.1, 0};
+ GLfloat col2[] = {0.2, 0.2, 0.2, 0};
+ GLfloat spec[] = {0.6, 0.6, 0.6, 0};
+ GLfloat shine = 40;
+ GLfloat lspec[] = {0.6, 0.6, 0.6, 0};
+ GLfloat lcol[] = {0.4, 0.4, 0.4, 0};
+ GLfloat lshine = 40;
+
+ glPushMatrix();
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glMaterialfv(GL_FRONT, GL_SHININESS, &shine);
+ switch(c->pins) {
+ case 8:
+ w = 1.0; h = 1.5;
+ break;
+ case 14:
+ w = 1.0; h = 3;
+ break;
+ case 16:
+ w = 1.0; h = 3;
+ break;
+ case 24:
+ default:
+ w = 1.5; h = 3.5;
+ break;
+ }
+ w = w/2; h = h/2;
+ glEnable(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(1.0, 1.0);
+ glBegin(GL_QUADS);
+ glNormal3f(0, 0, 1);
+ glVertex3f(w, h, 0.1);
+ glVertex3f(w, -h, 0.1);
+ glVertex3f(-w, -h, 0.1);
+ glVertex3f(-w, h, 0.1);
+ polys++;
+ glNormal3f(0, 0, -1);
+ glVertex3f(w, h, -0.1);
+ glVertex3f(w, -h, -0.1);
+ glVertex3f(-w, -h, -0.1);
+ glVertex3f(-w, h, -0.1);
+ polys++;
+ glNormal3f(1, 0, 0);
+ glVertex3f(w, h, -0.1);
+ glVertex3f(w, -h, -0.1);
+ glVertex3f(w, -h, 0.1);
+ glVertex3f(w, h, 0.1);
+ polys++;
+ glNormal3f(0, -1, 0);
+ glVertex3f(w, -h, -0.1);
+ glVertex3f(w, -h, 0.1);
+ glVertex3f(-w, -h, 0.1);
+ glVertex3f(-w, -h, -0.1);
+ polys++;
+ glNormal3f(-1, 0, 0);
+ glVertex3f(-w, h, -0.1);
+ glVertex3f(-w, h, 0.1);
+ glVertex3f(-w, -h, 0.1);
+ glVertex3f(-w, -h, -0.1);
+ polys++;
+ glNormal3f(0, -1, 0);
+ glVertex3f(-w, h, -0.1);
+ glVertex3f(w, h, -0.1);
+ glVertex3f(w, h, 0.1);
+ glVertex3f(-w, h, 0.1);
+ polys++;
+ glEnd();
+ glDisable(GL_POLYGON_OFFSET_FILL);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+
+ {
+ GLfloat texfg[] = {0.7, 0.7, 0.7, 1.0};
+ GLfloat s = 0.015;
+ XCharStruct e;
+ texture_string_metrics (ci->font, c->text, &e, 0, 0);
+
+ glPushMatrix();
+ glTranslatef (0, 0, 0.1);
+ glRotatef (90, 0, 0, 1);
+ glScalef (s, s, s);
+ glTranslatef (-w/2, 0, 0);
+ glColor4fv (texfg);
+ print_texture_string (ci->font, c->text);
+ glPopMatrix();
+ }
+
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_BLEND);
+ d = (h*2-0.1) / c->pins;
+ d*=2;
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, lcol);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, lspec);
+ glMaterialfv(GL_FRONT, GL_SHININESS, &lshine);
+ for (z = 0 ; z < c->pins/2 ; z++) {
+ polys += ICLeg(w, -h + z*d + d/2, 0, 0);
+ }
+ for (z = 0 ; z < c->pins/2 ; z++) {
+ polys += ICLeg(-w, -h + z*d + d/2, 0, 1);
+ }
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col2);
+ glTranslatef(-w+0.3, h-0.3, 0.1);
+ glRotatef(90, 0, 1, 0);
+ polys += circle(ci, 0.1, 7, 0);
+ glPopMatrix();
+ return polys;
+}
+
+static int DrawDisp(Circuit *ci, Disp *d)
+{
+ int polys = 0;
+ GLfloat col[] = {0.8, 0.8, 0.8, 1.0}; /* body colour */
+ GLfloat front[] = {0.2, 0.2, 0.2, 1.0}; /* front colour */
+ GLfloat on[] = {0.9, 0, 0, 1}; /* 'on' segment */
+ GLfloat off[] = {0.3, 0, 0, 1}; /* 'off' segment */
+ int i, j, k;
+ GLfloat x, y; /* for the pins */
+ GLfloat spec[] = {0.6, 0.6, 0.6, 0};
+ GLfloat lcol[] = {0.4, 0.4, 0.4, 0};
+ GLfloat shine = 40;
+ static const GLfloat vdata_h[6][2] = {
+ {0, 0},
+ {0.1, 0.1},
+ {0.9, 0.1},
+ {1, 0},
+ {0.9, -0.1},
+ {0.1, -0.1}
+ };
+ static const GLfloat vdata_v[6][2] = {
+ {0.27, 0},
+ {0.35, -0.1},
+ {0.2, -0.9},
+ {0.1, -1},
+ {0, -0.9},
+ {0.15, -0.15}
+ };
+
+ static const GLfloat seg_start[7][2] = {
+ {0.55, 2.26},
+ {1.35, 2.26},
+ {1.2, 1.27},
+ {0.25, 0.25},
+ {0.06, 1.25},
+ {0.25, 2.25},
+ {0.39, 1.24}
+ };
+
+ static const int nums[10][7] = {
+ {1, 1, 1, 1, 1, 1, 0}, /* 0 */
+ {0, 1, 1, 0, 0, 0, 0}, /* 1 */
+ {1, 1, 0, 1, 1, 0, 1}, /* 2 */
+ {1, 1, 1, 1, 0, 0, 1}, /* 3 */
+ {0, 1, 1, 0, 0, 1, 1}, /* 4 */
+ {1, 0, 1, 1, 0, 1, 1}, /* 5 */
+ {1, 0, 1, 1, 1, 1, 1}, /* 6 */
+ {1, 1, 1, 0, 0, 0, 0}, /* 7 */
+ {1, 1, 1, 1, 1, 1, 1}, /* 8 */
+ {1, 1, 1, 0, 0, 1, 1} /* 9 */
+ };
+
+ glTranslatef(-0.9, -1.8, 0);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ polys += Rect(0, 0, -0.01, 1.8, 2.6, 0.7);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, front);
+ glBegin(GL_QUADS);
+ glVertex2f(-0.05, -0.05);
+ glVertex2f(-0.05, 2.65);
+ glVertex2f(1.85, 2.65);
+ glVertex2f(1.85, -0.05);
+ polys++;
+ glEnd();
+ glDisable(GL_LIGHTING); /* lit segments dont need light */
+ if (!seven && (random() % 30) == 19) { /* randomly change value */
+ d->value = random() % 10;
+ }
+ for (j = 0 ; j < 7 ; j++) { /* draw the segments */
+ GLfloat xx[6], yy[6];
+ if (nums[d->value][j])
+ glColor3fv(on);
+ else
+ glColor3fv(off);
+ for (k = 0 ; k < 6 ; k++) {
+ if (j == 0 || j == 3 || j == 6) {
+ xx[k] = seg_start[j][0] + vdata_h[k][0];
+ yy[k] = seg_start[j][1] + vdata_h[k][1];
+ } else {
+ xx[k] = seg_start[j][0] + vdata_v[k][0];
+ yy[k] = seg_start[j][1] + vdata_v[k][1];
+ }
+ }
+ glBegin(GL_POLYGON);
+ for(i = 0 ; i < 6 ; i++) {
+ glVertex3f(xx[i], yy[i], 0.01);
+ }
+ polys++;
+ glEnd();
+ }
+ glColor3fv(on);
+ glPointSize(4);
+ glBegin(GL_POINTS);
+ glVertex3f(1.5, 0.2, 0.01);
+ polys++;
+ glEnd();
+ glEnable(GL_LIGHTING);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, lcol);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+ glMaterialfv(GL_FRONT, GL_SHININESS, &shine);
+ for (x = 0.35 ; x <= 1.5 ; x+= 1.15) {
+ for ( y = 0.2 ; y <= 2.4 ; y += 0.3) {
+ polys += ICLeg(x, y, -0.7, 1);
+ }
+ }
+ return polys;
+}
+
+static int HoledRectangle(Circuit *ci,
+ GLfloat w, GLfloat h, GLfloat d, GLfloat radius,
+ int p)
+{
+ int polys = 0;
+ int step, a;
+ GLfloat x1, y1, x2, y2;
+ GLfloat yr, yr1, xr, xr1, side, side1;
+ GLfloat nx, ny;
+
+ step = 360 / p;
+ x1 = radius; y1 = 0;
+ xr1 = w/2; yr1 = 0;
+ side = w/2;
+ side1 = h/2;
+ glBegin(GL_QUADS);
+ for (a = 0 ; a <= 360 ; a+= step) {
+ y2=radius*(float)ci->sin_table[(int)a];
+ x2=radius*(float)ci->cos_table[(int)a];
+
+ if (a < 45 || a > 315) {
+ xr = side;
+ yr = side1 * ci->tan_table[a];
+ nx = 1; ny = 0;
+ } else if (a <= 135 || a >= 225) {
+ xr = side/ci->tan_table[a];
+ if (a >= 225) {
+ yr = -side1;
+ xr = 0 - xr;
+ nx = 0; ny = -1;
+ } else {
+ yr = side1;
+ nx = 0; ny = 1;
+ }
+ } else {
+ xr = -side;
+ yr = -side1 * ci->tan_table[a];
+ nx = -1; ny = 0;
+ }
+
+ glNormal3f(-x1, -y1, 0); /* cylinder */
+ glVertex3f(x1,y1,0);
+ glVertex3f(x1,y1,-d);
+ glVertex3f(x2,y2,-d);
+ glVertex3f(x2,y2,0);
+ polys++;
+
+ glNormal3f(0, 0, 1); /* front face */
+ glVertex3f(x1,y1,0);
+ glVertex3f(xr1, yr1, 0);
+ glVertex3f(xr, yr, 0);
+ glVertex3f(x2, y2, 0);
+ polys++;
+
+ glNormal3f(nx, ny, 0); /* side */
+ glVertex3f(xr, yr, 0);
+ glVertex3f(xr, yr, -d);
+ glVertex3f(xr1, yr1, -d);
+ glVertex3f(xr1, yr1, 0);
+ polys++;
+
+ glNormal3f(0, 0, -1); /* back */
+ glVertex3f(xr, yr, -d);
+ glVertex3f(x2, y2, -d);
+ glVertex3f(x1, y1, -d);
+ glVertex3f(xr1, yr1, -d);
+ polys++;
+
+ x1=x2;
+ y1=y2;
+ xr1 = xr; yr1 = yr;
+ }
+ glEnd();
+ return polys;
+}
+
+static int DrawTransistor(Circuit *ci, Transistor *t)
+{
+ int polys = 0;
+ GLfloat col[] = {0.3, 0.3, 0.3, 1.0};
+ GLfloat spec[] = {0.9, 0.9, 0.9, 1.0};
+ GLfloat nospec[] = {0.4, 0.4, 0.4, 1.0};
+ GLfloat shin = 30;
+
+ glPushMatrix();
+ glMaterialfv(GL_FRONT, GL_SHININESS, &shin);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, col);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ if (t->type == 1) { /* TO-92 style */
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, col);
+ glRotatef(90, 0, 1, 0);
+ glRotatef(90, 0, 0, 1);
+ polys += createCylinder(ci, 1.0, 0.4, 1, 1);
+ polys += Rect(0, -0.2, 0.4, 1, 0.2, 0.8);
+/* Draw the markings */
+
+ {
+ GLfloat texfg[] = {0.7, 0.7, 0.7, 1.0};
+ GLfloat s = 0.015;
+ XCharStruct e;
+ int w;
+ texture_string_metrics (ci->font, t->text, &e, 0, 0);
+ w = e.width;
+ glPushMatrix();
+ glRotatef (90, 1, 0, 0);
+ glTranslatef (0.5, -0.05, 0.21);
+ glScalef (s, s, s);
+ glTranslatef (-w/2, 0, 0);
+ glColor4fv (texfg);
+ print_texture_string (ci->font, t->text);
+ glPopMatrix();
+ }
+
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_BLEND);
+ glDepthMask(GL_TRUE);
+ glTranslatef(-2, 0, -0.2);
+ polys += wire(ci, 2);
+ glTranslatef(0, 0, 0.2);
+ polys += wire(ci, 2);
+ glTranslatef(0, 0, 0.2);
+ polys += wire(ci, 2);
+ } else if (t->type == 0) { /* TO-220 Style */
+ polys += Rect(0, 0, 0, 1.5, 1.5, 0.5);
+ {
+ GLfloat texfg[] = {0.7, 0.7, 0.7, 1.0};
+ GLfloat s = 0.015;
+ XCharStruct e;
+ int w;
+ texture_string_metrics (ci->font, t->text, &e, 0, 0);
+ w = e.width;
+ glPushMatrix();
+ glTranslatef (0.75, 0.75, 0.01);
+ glScalef (s, s, s);
+ glTranslatef (-w/2, 0, 0);
+ glColor4fv (texfg);
+ print_texture_string (ci->font, t->text);
+ glPopMatrix();
+ }
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_BLEND);
+ glDepthMask(GL_TRUE);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+ glMaterialfv(GL_FRONT, GL_SHININESS, &shin);
+ polys += Rect(0, 0, -0.5, 1.5, 1.5, 0.30);
+ if (!glIsEnabled(GL_NORMALIZE)) glEnable(GL_NORMALIZE);
+ glTranslatef(0.75, 1.875, -0.55);
+ polys += HoledRectangle(ci, 1.5, 0.75, 0.25, 0.2, 8);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, nospec);
+ glTranslatef(-0.375, -1.875, 0);
+ glRotatef(90, 0, 0, -1);
+ polys += wire(ci, 2);
+ glTranslatef(0, 0.375, 0);
+ polys += wire(ci, 2);
+ glTranslatef(0, 0.375, 0);
+ polys += wire(ci, 2);
+ } else { /* SMC transistor */
+/* Draw the body */
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, col);
+ glTranslatef(-0.5, -0.25, 0.1);
+ polys += Rect(0, 0, 0, 1, 0.5, 0.2);
+/* Draw the markings */
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glDepthMask(GL_FALSE);
+ glBegin (GL_QUADS);
+ glNormal3f(0, 0, 1);
+ glTexCoord2f(0, 1);
+ glVertex3f(0.2, 0, 0.01);
+ glTexCoord2f(1, 1);
+ glVertex3f(0.8, 0, 0.01);
+ glTexCoord2f(1, 0);
+ glVertex3f(0.8, 0.5, 0.01);
+ glTexCoord2f(0, 0);
+ glVertex3f(0.2, 0.5, 0.01);
+ polys++;
+ glEnd();
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_BLEND);
+ glDepthMask(GL_TRUE);
+/* Now draw the legs */
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+ glMaterialfv(GL_FRONT, GL_SHININESS, &shin);
+ polys += Rect(0.25, -0.1, -0.05, 0.1, 0.1, 0.2);
+ polys += Rect(0.75, -0.1, -0.05, 0.1, 0.1, 0.2);
+ polys += Rect(0.5, 0.5, -0.05, 0.1, 0.1, 0.2);
+ polys += Rect(0.25, -0.2, -0.2, 0.1, 0.15, 0.1);
+ polys += Rect(0.75, -0.2, -0.2, 0.1, 0.15, 0.1);
+ polys += Rect(0.5, 0.5, -0.2, 0.1, 0.15, 0.1);
+ }
+ glPopMatrix();
+ return polys;
+}
+
+static Component * NewComponent(ModeInfo *mi)
+{
+ Circuit *ci = &circuit[MI_SCREEN(mi)];
+ Component *c;
+ float rnd;
+
+ c = malloc(sizeof(Component));
+ c->angle = RAND_RANGE(0,360);
+ rnd = f_rand();
+ if (rnd < 0.25) { /* come from the top */
+ c->y = ci->YMAX/2;
+ c->x = RAND_RANGE(0, ci->XMAX) - ci->XMAX/2;
+ if (c->x > 0)
+ c->dx = 0 - RAND_RANGE(0.5, 2);
+ else
+ c->dx = RAND_RANGE(0.5, 2);
+ c->dy = 0 - RAND_RANGE(0.5, 2);
+ } else if (rnd < 0.5) { /* come from the bottom */
+ c->y = 0 - ci->YMAX/2;
+ c->x = RAND_RANGE(0, ci->XMAX) - ci->XMAX/2;
+ if (c->x > 0)
+ c->dx = 0 - RAND_RANGE(0.5, 2);
+ else
+ c->dx = RAND_RANGE(0.5, 2);
+ c->dy = RAND_RANGE(0.5, 2);
+ } else if (rnd < 0.75) { /* come from the left */
+ c->x = 0 - ci->XMAX/2;
+ c->y = RAND_RANGE(0, ci->YMAX) - ci->YMAX/2;
+ c->dx = RAND_RANGE(0.5, 2);
+ if (c->y > 0)
+ c->dy = 0 - RAND_RANGE(0.5, 2);
+ else
+ c->dy = RAND_RANGE(0.5, 2);
+ } else { /* come from the right */
+ c->x = ci->XMAX/2;
+ c->y = RAND_RANGE(0, ci->YMAX) - ci->YMAX/2;
+ c->dx = 0 - RAND_RANGE(0.5, 2);
+ if (c->y > 0)
+ c->dy = 0 - RAND_RANGE(0.5, 2);
+ else
+ c->dy = RAND_RANGE(0.5, 2);
+ }
+ c->z = RAND_RANGE(0, 7) - 9;
+ c->rotx = f_rand();
+ c->roty = f_rand();
+ c->rotz = f_rand();
+ c->drot = f_rand() * 3;
+ c->rdeg = 0;
+ c->dz = f_rand()*2 - 1;
+ c->norm = 0;
+ c->alpha = 0; /* explicitly set to 1 later */
+ rnd = random() % 11;
+ if (rnd < 1) {
+ c->c = NewResistor();
+ c->type = 0;
+ if (f_rand() < 0.4)
+ c->norm = 1; /* some resistors shine */
+ } else if (rnd < 2) {
+ c->c = NewDiode();
+ if (f_rand() < 0.4)
+ c->norm = 1; /* some diodes shine */
+ c->type = 1;
+ } else if (rnd < 3) {
+ c->c = NewTransistor(mi);
+ c->norm = 1;
+ c->type = 2;
+ } else if (rnd < 4) {
+ c->c = NewCapacitor(ci);
+ c->norm = 1;
+ c->type = 4;
+ } else if (rnd < 5) {
+ c->c = NewIC(mi);
+ c->type = 5;
+ c->norm = 1;
+ } else if (rnd < 6) {
+ c->c = NewLED(ci);
+ c->type = 3;
+ c->norm = 1;
+ c->alpha = 1;
+ } else if (rnd < 7) {
+ c->c = NewFuse(ci);
+ c->norm = 1;
+ c->type = 7;
+ c->alpha = 1;
+ } else if (rnd < 8) {
+ c->c = NewRCA(ci);
+ c->norm = 1;
+ c->type = 8;
+ } else if (rnd < 9) {
+ c->c = NewThreeFive(ci);
+ c->norm = 1;
+ c->type = 9;
+ } else if (rnd < 10) {
+ c->c = NewSwitch(ci);
+ c->norm = 1;
+ c->type = 10;
+ } else {
+ c->c = NewDisp(ci);
+ c->type = 6;
+ }
+ return c;
+}
+
+static Transistor *NewTransistor(ModeInfo *mi)
+{
+ Transistor *t;
+
+ t = malloc(sizeof(Transistor));
+ t->type = (random() % 3);
+ if (t->type == 0) {
+ t->text = transistortypes[random() % countof(transistortypes)];
+ } else if (t->type == 2) {
+ t->text = smctypes[random() % countof(smctypes)];
+ } else if (t->type == 1) {
+ t->text = to92types[random() % countof(to92types)];
+ }
+ return t;
+}
+
+static Capacitor *NewCapacitor(Circuit *ci)
+{
+ Capacitor *c;
+
+ c = malloc(sizeof(Capacitor));
+ c->type = (f_rand() < 0.5);
+ if (!c->type) {
+ c->length = RAND_RANGE(0.5, 1);
+ c->width = RAND_RANGE(0.5, 1);
+ } else {
+ c->width = RAND_RANGE(0.3, 1);
+ }
+ return c;
+}
+
+/* 7 segment display */
+
+static Disp *NewDisp(Circuit *ci)
+{
+ Disp *d;
+
+ d = malloc(sizeof(Disp));
+ if (seven)
+ d->value = 7;
+ else
+ d->value = RAND_RANGE(0, 10);
+ return d;
+}
+
+
+static IC *NewIC(ModeInfo *mi)
+{
+ IC *c;
+ int pins;
+ const char *val;
+ int types[countof(ictypes)], i, n = 0;
+
+ c = malloc(sizeof(IC));
+ c->type = 0;
+ switch((int)RAND_RANGE(0,4)) {
+ case 0:
+ pins = 8;
+ break;
+ case 1:
+ pins = 14;
+ break;
+ case 2:
+ pins = 16;
+ break;
+ case 3:
+ default:
+ pins = 24;
+ break;
+ }
+ for (i = 0 ; i < countof(ictypes) ; i++) {
+ if (ictypes[i].pins == pins) {
+ types[n] = i;
+ n++;
+ }
+ }
+
+ if (n > countof(types)) abort();
+ val = ictypes[types[random() % n]].val;
+ sprintf(c->text, "%s\n%02d%02d", val,
+ (int)RAND_RANGE(80, 100), (int)RAND_RANGE(1,53));
+ c->pins = pins;
+ return c;
+}
+
+static LED *NewLED(Circuit *ci)
+{
+ LED *l;
+ float r;
+
+ l = malloc(sizeof(LED));
+ r = f_rand();
+ l->light = 0;
+ if (!ci->light && (f_rand() < 0.4)) {
+ ci->light = 1;
+ l->light = 1;
+ }
+ if (r < 0.2) {
+ l->r = 0.9; l->g = 0; l->b = 0;
+ } else if (r < 0.4) {
+ l->r = 0.3; l->g = 0.9; l->b = 0;
+ } else if (r < 0.6) {
+ l->r = 0.8; l->g = 0.9; l->b = 0;
+ } else if (r < 0.8) {
+ l->r = 0.0; l->g = 0.2; l->b = 0.8;
+ } else {
+ l->r = 0.9, l->g = 0.55, l->b = 0;
+ }
+ return l;
+}
+
+static Fuse *NewFuse(Circuit *ci)
+{
+ Fuse *f;
+
+ f = malloc(sizeof(Fuse));
+ return f;
+}
+
+static RCA *NewRCA(Circuit *ci)
+{
+ RCA *r;
+
+ r = malloc(sizeof(RCA));
+ r->col = (random() % 10 < 5);
+ return r;
+}
+
+static ThreeFive *NewThreeFive(Circuit *ci)
+{
+ ThreeFive *r;
+
+ r = malloc(sizeof(ThreeFive));
+ return r;
+}
+
+static Switch *NewSwitch(Circuit *ci)
+{
+ Switch *s;
+
+ s = malloc(sizeof(Switch));
+ s->position = 0;
+ return s;
+}
+
+static Diode *NewDiode(void)
+{
+ Band *b;
+ Diode *ret;
+
+ ret = malloc(sizeof(Diode));
+ b = malloc(sizeof(Band));
+ b->pos = 0.8;
+ b->len = 0.1;
+ if (f_rand() < 0.5) {
+ b->r = 1;
+ b->g = 1;
+ b->b = 1;
+ ret->r = 0.7; ret->g = 0.1 ; ret->b = 0.1;
+ } else {
+ b->r = 1;
+ b->g = 1;
+ b->b = 1;
+ ret->r = 0.2; ret->g = 0.2 ; ret->b = 0.2;
+ }
+ ret->band = b;
+ return ret;
+}
+
+
+static Resistor * NewResistor(void)
+{
+ int v, m, t; /* value, multiplier, tolerance */
+ Resistor *ret;
+
+ v = RAND(9);
+ m = RAND(5);
+ t = (RAND(10) < 5) ? 10 : 11;
+ ret = malloc(sizeof(Resistor));
+
+ if (seven) {
+ ret->b[0] = ret->b[1] = ret->b[2] = 7;
+ } else {
+ ret->b[0] = values[v][0];
+ ret->b[1] = values[v][1];
+ ret->b[2] = m;
+ }
+ ret->b[3] = t;
+
+ return ret;
+}
+
+static void makebandlist(Circuit *ci)
+{
+ int i;
+ GLfloat col[] = {0,0,0,0};
+ GLfloat spec[] = {0.8,0.8,0.8,0};
+ GLfloat shine = 40;
+
+ for (i = 0 ; i < 12 ; i++) {
+ ci->band_list[i] = glGenLists(1);
+ glNewList(ci->band_list[i], GL_COMPILE);
+ col[0] = colorcodes[i][0];
+ col[1] = colorcodes[i][1];
+ col[2] = colorcodes[i][2];
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, &shine);
+ ci->band_list_polys[i] = createCylinder(ci, 0.1, 0.42, 0, 0);
+ glEndList();
+ }
+}
+
+
+static int bandedCylinder(Circuit *ci,
+ float radius, float l,
+ GLfloat r, GLfloat g, GLfloat bl,
+ Band **b, int nbands)
+{
+ int polys = 0;
+ int n; /* band number */
+ GLfloat col[] = {0,0,0,0};
+
+ col[0] = r; col[1] = g; col[2] = bl;
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ polys += createCylinder(ci, l, radius, 1, 0); /* body */
+ for (n = 0 ; n < nbands ; n++) {
+ glPushMatrix();
+ glTranslatef(b[n]->pos*l, 0, 0);
+ col[0] = b[n]->r; col[1] = b[n]->g; col[2] = b[n]->b;
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
+ polys += createCylinder(ci, b[n]->len*l, radius*1.05, 0, 0); /* band */
+ glPopMatrix();
+ }
+ return polys;
+}
+
+static int drawgrid(Circuit *ci)
+{
+ int polys = 0;
+ GLfloat x, y;
+ GLfloat col3[] = {0, 0.8, 0};
+
+ if (!ci->draw_s) {
+ if (f_rand() < ((rotatespeed > 0) ? 0.05 : 0.01)) {
+ ci->draw_sdir = RAND_RANGE(0, 4);
+ ci->draw_ds = RAND_RANGE(0.4, 0.8);
+ switch (ci->draw_sdir) {
+ case 0:
+ ci->draw_sx = -ci->XMAX/2;
+ ci->draw_sy = ((int)RAND_RANGE(0, ci->YMAX/2))*2 - ci->YMAX/2;
+ break;
+ case 1:
+ ci->draw_sx = ci->XMAX/2;
+ ci->draw_sy = ((int)RAND_RANGE(0, ci->YMAX/2))*2 - ci->YMAX/2;
+ break;
+ case 2:
+ ci->draw_sy = ci->YMAX/2;
+ ci->draw_sx = ((int)RAND_RANGE(0, ci->XMAX/2))*2 - ci->XMAX/2;
+ break;
+ case 3:
+ ci->draw_sy = -ci->YMAX/2;
+ ci->draw_sx = ((int)RAND_RANGE(0, ci->XMAX/2))*2 - ci->XMAX/2;
+ break;
+ }
+ ci->draw_s = 1;
+ }
+ } else if (rotatespeed <= 0) {
+ if (ci->grid_col[1] < 0.25) {
+ ci->grid_col[1] += 0.025; ci->grid_col[2] += 0.005;
+ ci->grid_col2[1] += 0.015 ; ci->grid_col2[2] += 0.005;
+ }
+ }
+
+ glDisable(GL_LIGHTING);
+ if (ci->draw_s) {
+ glColor3fv(col3);
+ glPushMatrix();
+ glTranslatef(ci->draw_sx, ci->draw_sy, -10);
+ polys += sphere(ci, 0.1, 10, 10, 0, 10, 0, 10);
+ if (ci->draw_sdir == 0)
+ glTranslatef(-ci->draw_ds, 0, 0);
+ if (ci->draw_sdir == 1)
+ glTranslatef(ci->draw_ds, 0, 0);
+ if (ci->draw_sdir == 2)
+ glTranslatef(0, ci->draw_ds, 0);
+ if (ci->draw_sdir == 3)
+ glTranslatef(0, -ci->draw_ds, 0);
+ polys += sphere(ci, 0.05, 10, 10, 0, 10, 0, 10);
+ glPopMatrix();
+ if (ci->draw_sdir == 0) {
+ ci->draw_sx += ci->draw_ds;
+ if (ci->draw_sx > ci->XMAX/2)
+ ci->draw_s = 0;
+ }
+ if (ci->draw_sdir == 1) {
+ ci->draw_sx -= ci->draw_ds;
+ if (ci->draw_sx < -ci->XMAX/2)
+ ci->draw_s = 0;
+ }
+ if (ci->draw_sdir == 2) {
+ ci->draw_sy -= ci->draw_ds;
+ if (ci->draw_sy < ci->YMAX/2)
+ ci->draw_s = 0;
+ }
+ if (ci->draw_sdir == 3) {
+ ci->draw_sy += ci->draw_ds;
+ if (ci->draw_sy > ci->YMAX/2)
+ ci->draw_s = 0;
+ }
+ } else if (rotatespeed <= 0) {
+ if (ci->grid_col[1] > 0) {
+ ci->grid_col[1] -= 0.0025; ci->grid_col[2] -= 0.0005;
+ ci->grid_col2[1] -= 0.0015 ; ci->grid_col2[2] -= 0.0005;
+ }
+ }
+ for (x = -ci->XMAX/2 ; x <= ci->XMAX/2 ; x+= 2) {
+ glColor3fv(ci->grid_col);
+ glBegin(GL_LINES);
+ glVertex3f(x, ci->YMAX/2, -10);
+ glVertex3f(x, -ci->YMAX/2, -10);
+ glColor3fv(ci->grid_col2);
+ glVertex3f(x-0.02, ci->YMAX/2, -10);
+ glVertex3f(x-0.02, -ci->YMAX/2, -10);
+ glVertex3f(x+0.02, ci->YMAX/2, -10);
+ glVertex3f(x+0.02, -ci->YMAX/2, -10);
+ glEnd();
+ }
+ for (y = -ci->YMAX/2 ; y <= ci->YMAX/2 ; y+= 2) {
+ glColor3fv(ci->grid_col);
+ glBegin(GL_LINES);
+ glVertex3f(-ci->XMAX/2, y, -10);
+ glVertex3f(ci->XMAX/2, y, -10);
+ glColor3fv(ci->grid_col2);
+ glVertex3f(-ci->XMAX/2, y-0.02, -10);
+ glVertex3f(ci->XMAX/2, y-0.02, -10);
+ glVertex3f(-ci->XMAX/2, y+0.02, -10);
+ glVertex3f(ci->XMAX/2, y+0.02, -10);
+ glEnd();
+ }
+ glEnable(GL_LIGHTING);
+ return polys;
+}
+
+static void display(ModeInfo *mi)
+{
+ Circuit *ci = &circuit[MI_SCREEN(mi)];
+ GLfloat light_sp[] = {0.8, 0.8, 0.8, 1.0};
+ GLfloat black[] = {0, 0, 0, 1.0};
+ int j;
+
+ mi->polygon_count = 0;
+
+ if (ci->display_i == 0) {
+ for (ci->display_i = 0 ; ci->display_i < maxparts ; ci->display_i++) {
+ ci->components[ci->display_i] = NULL;
+ }
+ }
+ glEnable(GL_LIGHTING);
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity();
+ gluLookAt(ci->viewer[0], ci->viewer[1], ci->viewer[2],
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+ glPushMatrix();
+ glRotatef(ci->rotate_angle, 0, 0, 1);
+ ci->rotate_angle += 0.01 * (float)rotatespeed;
+ if (ci->rotate_angle >= 360) ci->rotate_angle = 0;
+
+ glLightfv(GL_LIGHT0, GL_POSITION, ci->lightpos);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, light_sp);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, light_sp);
+ glLighti(GL_LIGHT0, GL_CONSTANT_ATTENUATION, (GLfloat)1);
+ glLighti(GL_LIGHT0, GL_LINEAR_ATTENUATION, (GLfloat)0.5);
+ glLighti(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, (GLfloat)0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (h, h, h);
+ h = 2;
+ glScalef (h, h, h);
+ }
+# endif
+
+ mi->polygon_count += drawgrid(ci);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, light_sp);
+ if (f_rand() < 0.05) {
+ for (j = 0 ; j < maxparts ; j++) {
+ if (ci->components[j] == NULL) {
+ ci->components[j] = NewComponent(mi);
+ j = maxparts;
+ }
+ }
+ reorder(&ci->components[0]);
+ }
+ for (j = 0 ; j < maxparts ; j++) {
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, black);
+ glMaterialfv(GL_FRONT, GL_EMISSION, black);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, black);
+ if (ci->components[j] != NULL) {
+ if (DrawComponent(ci, ci->components[j], &mi->polygon_count)) {
+ free(ci->components[j]); ci->components[j] = NULL;
+ }
+ }
+ }
+ glPopMatrix();
+ glFlush();
+}
+
+/* ensure transparent components are at the end */
+static void reorder(Component *c[])
+{
+ int i, j, k;
+ Component *c1[MAX_COMPONENTS];
+ Component *c2[MAX_COMPONENTS];
+
+ j = 0;
+ for (i = 0 ; i < maxparts ; i++) { /* clear old matrix */
+ c1[i] = NULL;
+ c2[i] = NULL;
+ }
+ for (i = 0 ; i < maxparts ; i++) {
+ if (c[i] == NULL) continue;
+ if (c[i]->alpha) { /* transparent parts go to c1 */
+ c1[j] = c[i];
+ j++;
+ } else { /* opaque parts go to c2 */
+ c2[i] = c[i];
+ }
+ }
+ for (i = 0 ; i < maxparts ; i++) { /* clear old matrix */
+ c[i] = NULL;
+ }
+ k = 0;
+ for (i = 0 ; i < maxparts ; i++) { /* insert opaque part */
+ if (c2[i] != NULL) {
+ c[k] = c2[i];
+ k++;
+ }
+ }
+ for (i = 0 ; i < j ; i++) { /* insert transparent parts */
+ c[k] = c1[i];
+ k++;
+ }
+}
+
+ENTRYPOINT void reshape_circuit(ModeInfo *mi, int width, int height)
+{
+ Circuit *ci = &circuit[MI_SCREEN(mi)];
+ int y = 0;
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0,y,(GLint)width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-1.0,1.0,-h,h,1.5,35.0);
+ glMatrixMode(GL_MODELVIEW);
+ ci->win_h = height;
+ ci->win_w = width;
+ ci->YMAX = ci->XMAX * h;
+}
+
+
+ENTRYPOINT void init_circuit(ModeInfo *mi)
+{
+int screen = MI_SCREEN(mi);
+Circuit *ci;
+
+ MI_INIT(mi, circuit);
+ ci = &circuit[screen];
+ ci->window = MI_WINDOW(mi);
+
+ ci->XMAX = ci->YMAX = 50;
+ ci->viewer[2] = 14;
+ ci->lightpos[0] = 7;
+ ci->lightpos[1] = 7;
+ ci->lightpos[2] = 15;
+ ci->lightpos[3] = 1;
+
+ ci->grid_col[1] = 0.25;
+ ci->grid_col[2] = 0.05;
+ ci->grid_col2[1] = 0.125;
+ ci->grid_col2[2] = 0.05;
+
+ ci->font = load_texture_font (MI_DISPLAY(mi), "componentFont");
+
+ if (maxparts >= MAX_COMPONENTS)
+ maxparts = MAX_COMPONENTS-1;
+
+ if ((ci->glx_context = init_GL(mi)) != NULL) {
+ reshape_circuit(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+ if (uselight == 0)
+ ci->light = 1;
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ make_tables(ci);
+ makebandlist(ci);
+
+}
+
+ENTRYPOINT void draw_circuit(ModeInfo *mi)
+{
+ Circuit *ci = &circuit[MI_SCREEN(mi)];
+ Window w = MI_WINDOW(mi);
+ Display *disp = MI_DISPLAY(mi);
+
+ if (!ci->glx_context)
+ return;
+
+ glXMakeCurrent(disp, w, *(ci->glx_context));
+
+ display(mi);
+
+ if(mi->fps_p) do_fps(mi);
+ glFinish();
+ glXSwapBuffers(disp, w);
+}
+
+ENTRYPOINT void free_circuit(ModeInfo *mi)
+{
+ Circuit *ci = &circuit[MI_SCREEN(mi)];
+ if (ci->font)
+ free_texture_font (ci->font);
+ FreeAllGL(mi);
+}
+
+XSCREENSAVER_MODULE ("Circuit", circuit)
+
+#endif
diff --git a/hacks/glx/circuit.man b/hacks/glx/circuit.man
new file mode 100644
index 0000000..794f97b
--- /dev/null
+++ b/hacks/glx/circuit.man
@@ -0,0 +1,72 @@
+.TH XScreenSaver 1 "5-May-2004" "X Version 11"
+.SH NAME
+circuit - animates a number of 3D electronic components.
+.SH SYNOPSIS
+.B circuit
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-parts \fInumber\fP]
+[\-no-spin]
+[\-rotate]
+[\-speed \fInumber\fP]
+[\-no-light]
+[\-fps]
+.SH DESCRIPTION
+Animates a number of 3D electronic components.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-parts \fInumber\fP
+Number of parts. Default: 10.
+.TP 8
+.B \-spin | \-no-spin
+Whether the objects should spin.
+.TP 8
+.B \-rotate | \-no-rotate
+Whether the scene should spin.
+.TP 8
+.B \-speed \fInumber\fP
+Rotation speed, 0 - 100. Default: 1.
+.TP 8
+.B \-light | \-no-light
+Whether to us lighting, or flat coloring.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Ben Buxton. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Ben Buxton.
diff --git a/hacks/glx/cityflow.c b/hacks/glx/cityflow.c
new file mode 100644
index 0000000..2b3bd4f
--- /dev/null
+++ b/hacks/glx/cityflow.c
@@ -0,0 +1,545 @@
+/* cityflow, Copyright (c) 2014-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*count: 800 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define free_cube 0
+# define release_cube 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SKEW "12"
+
+#define DEF_WAVES "6"
+#define DEF_WAVE_SPEED "25"
+#define DEF_WAVE_RADIUS "256"
+static int texture_size = 512;
+
+typedef struct {
+ GLfloat x, y, z;
+ GLfloat w, h, d;
+ GLfloat cth, sth;
+} cube;
+
+typedef struct {
+ int x, y;
+ double xth, yth;
+} wave_src;
+
+typedef struct {
+ int nwaves;
+ int radius;
+ int speed;
+ wave_src *srcs;
+ int *heights;
+} waves;
+
+
+typedef struct {
+ GLXContext *glx_context;
+ trackball_state *trackball;
+ Bool button_down_p;
+ GLuint cube_list;
+ int cube_polys;
+ int ncubes;
+ cube *cubes;
+ waves *waves;
+ GLfloat min_x, max_x, min_y, max_y;
+ int texture_width, texture_height;
+ int ncolors;
+ XColor *colors;
+
+} cube_configuration;
+
+static cube_configuration *ccs = NULL;
+
+static int wave_count;
+static int wave_speed;
+static int wave_radius;
+static int skew;
+
+static XrmOptionDescRec opts[] = {
+ {"-waves", ".waves", XrmoptionSepArg, 0 },
+ {"-wave-speed", ".waveSpeed", XrmoptionSepArg, 0 },
+ {"-wave-radius", ".waveRadius", XrmoptionSepArg, 0 },
+ {"-skew", ".skew", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&wave_count, "waves", "Waves", DEF_WAVES, t_Int},
+ {&wave_speed, "waveSpeed", "WaveSpeed", DEF_WAVE_SPEED, t_Int},
+ {&wave_radius,"waveRadius","WaveRadius", DEF_WAVE_RADIUS,t_Int},
+ {&skew, "skew", "Skew", DEF_SKEW,t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt cube_opts = {
+ countof(opts), opts, countof(vars), vars, NULL};
+
+
+ENTRYPOINT void
+reshape_cube (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 2) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ /* For this one it's really important to minimize the distance between
+ near and far. */
+ gluPerspective (30, 1/h, 10, 50);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+static void
+reset_colors (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ make_smooth_colormap (0, 0, 0,
+ cc->colors, &cc->ncolors,
+ False, 0, False);
+ if (! MI_IS_WIREFRAME(mi))
+ glClearColor (cc->colors[0].red / 65536.0,
+ cc->colors[0].green / 65536.0,
+ cc->colors[0].blue / 65536.0,
+ 1);
+}
+
+
+static void
+tweak_cubes (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ int i;
+ for (i = 0; i < cc->ncubes; i++)
+ {
+ cube *cube = &cc->cubes[i];
+ cube->x += (frand(2)-1)*0.01;
+ cube->y += (frand(2)-1)*0.01;
+ cube->z += (frand(2)-1)*0.01;
+ }
+}
+
+
+ENTRYPOINT Bool
+cube_handle_event (ModeInfo *mi, XEvent *event)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+
+ /* Neutralize any vertical motion */
+ GLfloat rot = current_device_rotation();
+ Bool rotp = ((rot > 45 && rot < 135) ||
+ (rot < -45 && rot > -135));
+
+ if (event->xany.type == ButtonPress ||
+ event->xany.type == ButtonRelease)
+ {
+ if (rotp)
+ event->xbutton.x = MI_WIDTH(mi) / 2;
+ else
+ event->xbutton.y = MI_HEIGHT(mi) / 2;
+ }
+ else if (event->xany.type == MotionNotify)
+ {
+ if (rotp)
+ event->xmotion.x = MI_WIDTH(mi) / 2;
+ else
+ event->xmotion.y = MI_HEIGHT(mi) / 2;
+ }
+
+ if (gltrackball_event_handler (event, cc->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &cc->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ reset_colors (mi);
+ tweak_cubes (mi);
+ gltrackball_reset (cc->trackball, 0, 0);
+ return True;
+ }
+
+ return False;
+}
+
+
+/* Waves.
+ Adapted from ../hacks/interference.c by Hannu Mallat.
+ */
+
+static void
+init_wave (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ waves *ww;
+ int i;
+ cc->waves = ww = (waves *) calloc (sizeof(*cc->waves), 1);
+ ww->nwaves = wave_count;
+ ww->radius = wave_radius;
+ ww->speed = wave_speed;
+ ww->heights = (int *) calloc (sizeof(*ww->heights), ww->radius);
+ ww->srcs = (wave_src *) calloc (sizeof(*ww->srcs), ww->nwaves);
+
+ for (i = 0; i < ww->radius; i++)
+ {
+ float max = (cc->ncolors * (ww->radius - i) / (float) ww->radius);
+ ww->heights[i] = ((max + max * cos(i / 50.0)) / 2.0);
+ }
+
+ for (i = 0; i < ww->nwaves; i++)
+ {
+ ww->srcs[i].xth = frand(2.0) * M_PI;
+ ww->srcs[i].yth = frand(2.0) * M_PI;
+ }
+
+ cc->texture_width = texture_size;
+ cc->texture_height = texture_size;
+}
+
+
+static int
+interference_point (cube_configuration *cc, int x, int y)
+{
+ /* Compute the effect of the waves on a pixel. */
+
+ waves *ww = cc->waves;
+ int result = 0;
+ int i;
+ for (i = 0; i < ww->nwaves; i++)
+ {
+ int dx = x - ww->srcs[i].x;
+ int dy = y - ww->srcs[i].y;
+ int dist = sqrt (dx*dx + dy*dy);
+ result += (dist >= ww->radius ? 0 : ww->heights[dist]);
+ }
+ result *= 0.4;
+ if (result > 255) result = 255;
+ return result;
+}
+
+
+static void
+interference (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ waves *ww = cc->waves;
+ int i;
+
+ /* Move the wave origins around
+ */
+ for (i = 0; i < ww->nwaves; i++)
+ {
+ ww->srcs[i].xth += (ww->speed / 1000.0);
+ if (ww->srcs[i].xth > 2*M_PI)
+ ww->srcs[i].xth -= 2*M_PI;
+ ww->srcs[i].yth += (ww->speed / 1000.0);
+ if (ww->srcs[i].yth > 2*M_PI)
+ ww->srcs[i].yth -= 2*M_PI;
+
+ ww->srcs[i].x = (cc->texture_width/2 +
+ (cos (ww->srcs[i].xth) *
+ cc->texture_width / 2));
+ ww->srcs[i].y = (cc->texture_height/2 +
+ (cos (ww->srcs[i].yth) *
+ cc->texture_height / 2));
+ }
+}
+
+
+/* qsort comparator for sorting cubes by y position */
+static int
+cmp_cubes (const void *aa, const void *bb)
+{
+ const cube *a = (cube *) aa;
+ const cube *b = (cube *) bb;
+ return ((int) (b->y * 10000) -
+ (int) (a->y * 10000));
+}
+
+
+ENTRYPOINT void
+init_cube (ModeInfo *mi)
+{
+ int i;
+ cube_configuration *cc;
+
+ MI_INIT (mi, ccs);
+
+ cc = &ccs[MI_SCREEN(mi)];
+
+ if ((cc->glx_context = init_GL(mi)) != NULL) {
+ reshape_cube (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+
+ cc->trackball = gltrackball_init (False);
+
+ cc->ncolors = 256;
+ cc->colors = (XColor *) calloc(cc->ncolors, sizeof(XColor));
+
+ reset_colors (mi);
+ init_wave (mi);
+
+ cc->ncubes = MI_COUNT (mi);
+
+ if (cc->ncubes < 1) cc->ncubes = 1;
+
+ cc->cubes = (cube *) calloc (sizeof(cube), cc->ncubes);
+ for (i = 0; i < cc->ncubes; i++)
+ {
+ /* Set the size to roughly cover a 2x2 square on average. */
+ GLfloat scale = 1.8 / sqrt (cc->ncubes);
+ cube *cube = &cc->cubes[i];
+ double th = -(skew ? frand(skew) : 0) * M_PI / 180;
+
+ cube->x = (frand(1)-0.5);
+ cube->y = (frand(1)-0.5);
+
+ cube->z = frand(0.12);
+ cube->cth = cos(th);
+ cube->sth = sin(th);
+
+ cube->w = scale * (frand(1) + 0.2);
+ cube->d = scale * (frand(1) + 0.2);
+
+ if (cube->x < cc->min_x) cc->min_x = cube->x;
+ if (cube->y < cc->min_y) cc->min_y = cube->y;
+ if (cube->x > cc->max_x) cc->max_x = cube->x;
+ if (cube->y > cc->max_y) cc->max_y = cube->y;
+ }
+
+ /* Sorting by depth improves frame rate slightly. With 6000 polygons we get:
+ 3.9 FPS unsorted;
+ 3.1 FPS back to front;
+ 4.3 FPS front to back.
+ */
+ qsort (cc->cubes, cc->ncubes, sizeof(*cc->cubes), cmp_cubes);
+}
+
+
+static void
+animate_cubes (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ int i;
+ for (i = 0; i < cc->ncubes; i++)
+ {
+ cube *cube = &cc->cubes[i];
+ GLfloat fx = (cube->x - cc->min_x) / (cc->max_x - cc->min_x);
+ GLfloat fy = (cube->y - cc->min_y) / (cc->max_y - cc->min_y);
+ int x = (int) (cc->texture_width * fx) % cc->texture_width;
+ int y = (int) (cc->texture_height * fy) % cc->texture_height;
+ unsigned char v = interference_point (cc, x, y);
+ cube->h = cube->z + (v / 256.0 / 2.5) + 0.1;
+ }
+}
+
+
+ENTRYPOINT void
+draw_cube (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i;
+
+ if (!cc->glx_context)
+ return;
+
+ mi->polygon_count = 0;
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(cc->glx_context));
+
+ interference (mi);
+ animate_cubes (mi);
+
+ glShadeModel(GL_FLAT);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+ /* glEnable (GL_POLYGON_OFFSET_FILL); */
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ glRotatef(current_device_rotation(), 0, 0, 1);
+ gltrackball_rotate (cc->trackball);
+ glRotatef (-180, 1, 0, 0);
+
+ {
+ GLfloat s = 15;
+ glScalef (s, s, s);
+ }
+ glRotatef (-90, 1, 0, 0);
+
+ glTranslatef (-0.18, 0, -0.18);
+ glRotatef (37, 1, 0, 0);
+ glRotatef (20, 0, 0, 1);
+
+ glScalef (2.1, 2.1, 2.1);
+
+ /* Position lights after device rotation. */
+ if (!wire)
+ {
+ static const GLfloat pos[4] = {0.0, 0.25, -1.0, 0.0};
+ static const GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+ static const GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ }
+
+ glBegin (wire ? GL_LINES : GL_QUADS);
+
+ for (i = 0; i < cc->ncubes; i++)
+ {
+ cube *cube = &cc->cubes[i];
+ GLfloat cth = cube->cth;
+ GLfloat sth = cube->sth;
+ GLfloat x = cth*cube->x + sth*cube->y;
+ GLfloat y = -sth*cube->x + cth*cube->y;
+ GLfloat w = cube->w/2;
+ GLfloat h = cube->h/2;
+ GLfloat d = cube->d/2;
+ GLfloat bottom = 5;
+
+ GLfloat xw = cth*w, xd = sth*d;
+ GLfloat yw = -sth*w, yd = cth*d;
+
+ GLfloat color[4];
+ int c = cube->h * cc->ncolors * 0.7;
+ c %= cc->ncolors;
+
+ color[0] = cc->colors[c].red / 65536.0;
+ color[1] = cc->colors[c].green / 65536.0;
+ color[2] = cc->colors[c].blue / 65536.0;
+ color[3] = 1.0;
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+
+ /* Putting this in a display list makes no performance difference. */
+
+ if (! wire)
+ {
+ glNormal3f (0, 0, -1); /* top */
+ glVertex3f (x+xw+xd, y+yw+yd, -h);
+ glVertex3f (x+xw-xd, y+yw-yd, -h);
+ glVertex3f (x-xw-xd, y-yw-yd, -h);
+ glVertex3f (x-xw+xd, y-yw+yd, -h);
+ mi->polygon_count++;
+
+ glNormal3f (sth, cth, 0); /* front */
+ glVertex3f (x+xw+xd, y+yw+yd, bottom);
+ glVertex3f (x+xw+xd, y+yw+yd, -h);
+ glVertex3f (x-xw+xd, y-yw+yd, -h);
+ glVertex3f (x-xw+xd, y-yw+yd, bottom);
+ mi->polygon_count++;
+
+ glNormal3f (cth, -sth, 0); /* right */
+ glVertex3f (x+xw-xd, y+yw-yd, -h);
+ glVertex3f (x+xw+xd, y+yw+yd, -h);
+ glVertex3f (x+xw+xd, y+yw+yd, bottom);
+ glVertex3f (x+xw-xd, y+yw-yd, bottom);
+ mi->polygon_count++;
+
+# if 0 /* Omitting these makes no performance difference. */
+
+ glNormal3f (-cth, sth, 0); /* left */
+ glVertex3f (x-xw+xd, y-yw+yd, -h);
+ glVertex3f (x-xw-xd, y-yw-yd, -h);
+ glVertex3f (x-xw-xd, y-yw-yd, bottom);
+ glVertex3f (x-xw+xd, y-yw+yd, bottom);
+ mi->polygon_count++;
+
+ glNormal3f (-sth, -cth, 0); /* back */
+ glVertex3f (x-xw-xd, y-yw-yd, bottom);
+ glVertex3f (x-xw-xd, y-yw-yd, -h);
+ glVertex3f (x+xw-xd, y+yw-yd, -h);
+ glVertex3f (x+xw-xd, y+yw-yd, bottom);
+ mi->polygon_count++;
+# endif
+ }
+ else
+ {
+ glNormal3f (0, 0, -1); /* top */
+ glVertex3f (x+xw+xd, y+yw+yd, -h);
+ glVertex3f (x+xw-xd, y+yw-yd, -h);
+
+ glVertex3f (x+xw-xd, y+yw-yd, -h);
+ glVertex3f (x-xw-xd, y-yw-yd, -h);
+
+ glVertex3f (x-xw-xd, y-yw-yd, -h);
+ glVertex3f (x-xw+xd, y-yw+yd, -h);
+
+ glVertex3f (x-xw+xd, y-yw+yd, -h);
+ glVertex3f (x+xw+xd, y+yw+yd, -h);
+ mi->polygon_count++;
+ }
+ }
+ glEnd();
+
+ glPolygonOffset (0, 0);
+
+# if 0
+ glDisable(GL_DEPTH_TEST); /* Outline the playfield */
+ glColor3f(1,1,1);
+ glBegin(GL_LINE_LOOP);
+ glVertex3f (-0.5, -0.5, 0);
+ glVertex3f (-0.5, 0.5, 0);
+ glVertex3f ( 0.5, 0.5, 0);
+ glVertex3f ( 0.5, -0.5, 0);
+ glEnd();
+# endif
+
+ glPopMatrix();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+
+XSCREENSAVER_MODULE_2 ("Cityflow", cityflow, cube)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/cityflow.man b/hacks/glx/cityflow.man
new file mode 100644
index 0000000..eabcdc2
--- /dev/null
+++ b/hacks/glx/cityflow.man
@@ -0,0 +1,77 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+cityflow - waves of boxes.
+.SH SYNOPSIS
+.B cityflow
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-count \fInumber\fP]
+[\-wave-speed \fInumber\fP]
+[\-wave-radius \fInumber\fP]
+[\-waves \fInumber\fP]
+[\-skew \fInumber\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Waves move across a sea of boxes. The city swells. The walls are closing
+in.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds).
+.TP 8
+.B \-count \fInumber\fP
+Boxes. 50 - 4000. Default: 800.
+.TP 8
+.B \-wave-speed \fInumber\fP
+Wave speed. 5 - 150. Default: 25.
+.TP 8
+.B \-wave-radius \fInumber\fP
+Wave overlap. 5 - 512. Default: 256.
+.TP 8
+.B \-waves \fInumber\fP
+Wave complexity. 1 - 20. Default: 6.
+.TP 8
+.B \-skew \fInumber\fP
+Skew. 0 - 45. Default: 12.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2012 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/companion.c b/hacks/glx/companion.c
new file mode 100644
index 0000000..3c004a5
--- /dev/null
+++ b/hacks/glx/companion.c
@@ -0,0 +1,592 @@
+/* companioncube, Copyright (c) 2011-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* The symptoms most commonly produced by Enrichment Center testing are
+ superstition, perceiving inanimate objects as alive, and hallucinations.
+ The Enrichment Center reminds you that the weighted companion cube will
+ never threaten to stab you and, in fact, cannot speak. In the event that
+ the Weighted Companion Cube does speak, the Enrichment Center urges you to
+ disregard its advice.
+ */
+
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*count: 3 \n" \
+ "*wireframe: False \n" \
+
+/* #define DEBUG */
+
+
+# define free_cube 0
+# define release_cube 0
+#define DEF_SPEED "1.0"
+#define DEF_SPIN "False"
+#define DEF_WANDER "False"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+#undef RANDSIGN
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+#include "xlockmore.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include "ximage-loader.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#include "gllist.h"
+
+extern const struct gllist *companion_quad, *companion_disc, *companion_heart;
+static const struct gllist * const *all_objs[] = {
+ &companion_quad, &companion_disc, &companion_heart
+};
+#define BASE_QUAD 0
+#define BASE_DISC 1
+#define BASE_HEART 2
+#define FULL_CUBE 3
+
+#define SPEED_SCALE 0.2
+
+typedef struct {
+ GLfloat x, y, z;
+ GLfloat ix, iy, iz;
+ GLfloat dx, dy, dz;
+ GLfloat ddx, ddy, ddz;
+ GLfloat zr;
+ rotator *rot;
+ Bool spinner_p;
+} floater;
+
+typedef struct {
+ GLXContext *glx_context;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ GLuint *dlists;
+ int cube_polys;
+
+ int nfloaters;
+ floater *floaters;
+
+} cube_configuration;
+
+static cube_configuration *bps = NULL;
+
+static GLfloat speed;
+static Bool do_spin;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt cube_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+#define BOTTOM 28.0
+
+static void
+reset_floater (ModeInfo *mi, floater *f)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ f->y = -BOTTOM;
+ f->x = f->ix;
+ f->z = f->iz;
+
+ /* Yes, I know I'm varying the force of gravity instead of varying the
+ launch velocity. That's intentional: empirical studies indicate
+ that it's way, way funnier that way. */
+
+ f->dy = 5.0;
+ f->dx = 0;
+ f->dz = 0;
+
+ /* -0.18 max -0.3 top -0.4 middle -0.6 bottom */
+ f->ddy = speed * SPEED_SCALE * (-0.6 + BELLRAND(0.45));
+ f->ddx = 0;
+ f->ddz = 0;
+
+ if (do_spin || do_wander)
+ f->spinner_p = 0;
+ else
+ f->spinner_p = !(random() % (3 * bp->nfloaters));
+
+ if (! (random() % (30 * bp->nfloaters)))
+ {
+ f->dx = BELLRAND(1.8) * RANDSIGN();
+ f->dz = BELLRAND(1.8) * RANDSIGN();
+ }
+
+ f->zr = frand(180);
+ if (do_spin || do_wander)
+ {
+ f->y = 0;
+ if (bp->nfloaters > 2)
+ f->y += frand(3.0) * RANDSIGN();
+ }
+}
+
+
+static void
+tick_floater (ModeInfo *mi, floater *f)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (bp->button_down_p) return;
+
+ if (do_spin || do_wander) return;
+
+ f->dx += f->ddx;
+ f->dy += f->ddy;
+ f->dz += f->ddz;
+
+ f->x += f->dx * speed * SPEED_SCALE;
+ f->y += f->dy * speed * SPEED_SCALE;
+ f->z += f->dz * speed * SPEED_SCALE;
+
+ if (f->y < -BOTTOM ||
+ f->x < -BOTTOM*8 || f->x > BOTTOM*8 ||
+ f->z < -BOTTOM*8 || f->z > BOTTOM*8)
+ reset_floater (mi, f);
+}
+
+
+
+
+
+static int
+build_corner (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat s;
+ const struct gllist *gll = *all_objs[BASE_QUAD];
+
+ glPushMatrix();
+ glTranslatef (-0.5, -0.5, -0.5);
+ s = 0.659;
+ glScalef (s, s, s);
+
+ glRotatef (180, 0, 1, 0);
+ glRotatef (180, 0, 0, 1);
+ glTranslatef (-0.12, -1.64, 0.12);
+ glCallList (bp->dlists[BASE_QUAD]);
+ glPopMatrix();
+
+ return gll->points / 3;
+}
+
+
+static int
+build_face (ModeInfo *mi)
+{
+ int polys = 0;
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ GLfloat s;
+ const struct gllist *gll;
+
+ GLfloat base_color[4] = {0.53, 0.60, 0.66, 1.00};
+ GLfloat heart_color[4] = {0.92, 0.67, 1.00, 1.00};
+ GLfloat disc_color[4] = {0.75, 0.92, 1.00, 1.00};
+ GLfloat corner_color[4] = {0.75, 0.92, 1.00, 1.00};
+
+ if (!wire)
+ {
+ GLfloat w = 0.010;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, base_color);
+ glPushMatrix();
+ glNormal3f (0, 0, -1);
+ glTranslatef (-0.5, -0.5, -0.5);
+
+ glBegin(GL_QUADS);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, 0.5-w, 0);
+ glVertex3f (0.5-w, 0.5-w, 0);
+ glVertex3f (0.5-w, 0, 0);
+
+ glVertex3f (0.5+w, 0, 0);
+ glVertex3f (0.5+w, 0.5-w, 0);
+ glVertex3f (1, 0.5-w, 0);
+ glVertex3f (1, 0, 0);
+
+ glVertex3f (0, 0.5+w, 0);
+ glVertex3f (0, 1, 0);
+ glVertex3f (0.5-w, 1, 0);
+ glVertex3f (0.5-w, 0.5+w, 0);
+
+ glVertex3f (0.5+w, 0.5+w, 0);
+ glVertex3f (0.5+w, 1, 0);
+ glVertex3f (1, 1, 0);
+ glVertex3f (1, 0.5+w, 0);
+ glEnd();
+
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, heart_color);
+
+ glNormal3f (0, -1, 0);
+ glBegin(GL_QUADS);
+ glVertex3f (0, 0.5+w, 0);
+ glVertex3f (1, 0.5+w, 0);
+ glVertex3f (1, 0.5+w, w);
+ glVertex3f (0, 0.5+w, w);
+ glEnd();
+
+ glNormal3f (0, 1, 0);
+ glBegin(GL_QUADS);
+ glVertex3f (0, 0.5-w, w);
+ glVertex3f (1, 0.5-w, w);
+ glVertex3f (1, 0.5-w, 0);
+ glVertex3f (0, 0.5-w, 0);
+ glEnd();
+
+ glNormal3f (-1, 0, 0);
+ glBegin(GL_QUADS);
+ glVertex3f (0.5+w, 0, w);
+ glVertex3f (0.5+w, 1, w);
+ glVertex3f (0.5+w, 1, 0);
+ glVertex3f (0.5+w, 0, 0);
+ glEnd();
+
+ glNormal3f (1, 0, 0);
+ glBegin(GL_QUADS);
+ glVertex3f (0.5-w, 0, 0);
+ glVertex3f (0.5-w, 1, 0);
+ glVertex3f (0.5-w, 1, w);
+ glVertex3f (0.5-w, 0, w);
+ glEnd();
+
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, heart_color);
+
+ glNormal3f (0, 0, -1);
+ glTranslatef (0, 0, w);
+ glBegin(GL_QUADS);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, 1, 0);
+ glVertex3f (1, 1, 0);
+ glVertex3f (1, 0, 0);
+ glEnd();
+
+ glPopMatrix();
+ }
+
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, corner_color);
+
+ glPushMatrix();
+ polys += build_corner (mi); glRotatef (90, 0, 0, 1);
+ polys += build_corner (mi); glRotatef (90, 0, 0, 1);
+ polys += build_corner (mi); glRotatef (90, 0, 0, 1);
+ polys += build_corner (mi);
+
+ glRotatef (90, 0, 0, 1);
+ glTranslatef (0.585, -0.585, -0.5655);
+
+ s = 10.5;
+ glScalef (s, s, s);
+ glRotatef (180, 0, 1, 0);
+
+ if (! wire)
+ {
+ gll = *all_objs[BASE_HEART];
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, heart_color);
+ glCallList (bp->dlists[BASE_HEART]);
+ polys += gll->points / 3;
+ }
+
+ gll = *all_objs[BASE_DISC];
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, disc_color);
+ glCallList (bp->dlists[BASE_DISC]);
+ polys += gll->points / 3;
+
+ glPopMatrix();
+ return polys;
+}
+
+
+static int
+build_cube (ModeInfo *mi)
+{
+ int polys = 0;
+ glPushMatrix();
+ polys += build_face (mi); glRotatef (90, 0, 1, 0);
+ polys += build_face (mi); glRotatef (90, 0, 1, 0);
+ polys += build_face (mi); glRotatef (90, 0, 1, 0);
+ polys += build_face (mi); glRotatef (90, 1, 0, 0);
+ polys += build_face (mi); glRotatef (180,1, 0, 0);
+ polys += build_face (mi);
+ glPopMatrix();
+ return polys;
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_cube (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+cube_handle_event (ModeInfo *mi, XEvent *event)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_cube (ModeInfo *mi)
+{
+ cube_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_cube (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {0.7, 0.2, 0.4, 0.0};
+/* GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};*/
+ GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ bp->trackball = gltrackball_init (False);
+
+ bp->dlists = (GLuint *) calloc (countof(all_objs)+2, sizeof(GLuint));
+ for (i = 0; i < countof(all_objs)+1; i++)
+ bp->dlists[i] = glGenLists (1);
+
+ for (i = 0; i < countof(all_objs); i++)
+ {
+ const struct gllist *gll = *all_objs[i];
+ glNewList (bp->dlists[i], GL_COMPILE);
+ renderList (gll, wire);
+ glEndList ();
+ }
+
+ glNewList (bp->dlists[i], GL_COMPILE);
+ bp->cube_polys = build_cube (mi);
+ glEndList ();
+
+
+ bp->nfloaters = MI_COUNT (mi);
+ bp->floaters = (floater *) calloc (bp->nfloaters, sizeof (floater));
+
+ for (i = 0; i < bp->nfloaters; i++)
+ {
+ floater *f = &bp->floaters[i];
+ double spin_speed = do_spin ? 0.7 : 10;
+ double wander_speed = do_wander ? 0.02 : 0.05 * speed * SPEED_SCALE;
+ double spin_accel = 0.5;
+ f->rot = make_rotator (spin_speed, spin_speed, spin_speed,
+ spin_accel,
+ wander_speed,
+ True);
+ if (bp->nfloaters == 2)
+ {
+ f->x = (i ? 2 : -2);
+ }
+ else if (i != 0)
+ {
+ double th = (i - 1) * M_PI*2 / (bp->nfloaters-1);
+ double r = 3;
+ f->x = r * cos(th);
+ f->z = r * sin(th);
+ }
+
+ f->ix = f->x;
+ f->iy = f->y;
+ f->iz = f->z;
+ reset_floater (mi, f);
+ }
+}
+
+
+static void
+draw_floater (ModeInfo *mi, floater *f)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat n;
+ double x, y, z;
+
+ get_position (f->rot, &x, &y, &z, !bp->button_down_p);
+
+ glPushMatrix();
+ glTranslatef (f->x, f->y, f->z);
+
+ if (do_wander)
+ glTranslatef (x, y, z);
+
+ if (do_spin)
+ get_rotation (f->rot, &x, &y, &z, !bp->button_down_p);
+
+ if (do_spin || f->spinner_p)
+ {
+ glRotatef (x * 360, 1, 0, 0);
+ glRotatef (y * 360, 0, 1, 0);
+ glRotatef (z * 360, 0, 0, 1);
+ }
+ else
+ {
+ glRotatef (f->zr * 360, 0, 1, 0);
+ }
+
+ n = 1.5;
+ if (bp->nfloaters > 99) n *= 0.05;
+ else if (bp->nfloaters > 25) n *= 0.18;
+ else if (bp->nfloaters > 9) n *= 0.3;
+ else if (bp->nfloaters > 1) n *= 0.7;
+
+ n *= 2;
+
+ if ((do_spin || do_wander) && bp->nfloaters > 1)
+ n *= 0.7;
+
+ glScalef(n, n, n);
+
+ glCallList (bp->dlists[FULL_CUBE]);
+ mi->polygon_count += bp->cube_polys;
+/* build_cube (mi);*/
+
+ glPopMatrix();
+}
+
+
+
+ENTRYPOINT void
+draw_cube (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+ gltrackball_rotate (bp->trackball);
+
+ glScalef (2, 2, 2);
+
+ mi->polygon_count = 0;
+
+# if 0
+ {
+ floater F;
+ F.x = F.y = F.z = 0;
+ F.dx = F.dy = F.dz = 0;
+ F.ddx = F.ddy = F.ddz = 0;
+ F.rot = make_rotator (0, 0, 0, 1, 0, False);
+ glRotatef (45, 0, 1, 0);
+ draw_floater (mi, &F);
+ }
+# else
+ for (i = 0; i < bp->nfloaters; i++)
+ {
+ floater *f = &bp->floaters[i];
+ draw_floater (mi, f);
+ tick_floater (mi, f);
+ }
+# endif
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("CompanionCube", companioncube, cube)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/companion_disc.c b/hacks/glx/companion_disc.c
new file mode 100644
index 0000000..b2f1830
--- /dev/null
+++ b/hacks/glx/companion_disc.c
@@ -0,0 +1,9593 @@
+#include "gllist.h"
+static const float data[]={
+ -0.904813,-0.425773,0.005552,0.040192,0.048501,-0.006167,
+ -0.902569,-0.424717,0.070606,0.040194,0.048502,-0.006013,
+ -0.927456,-0.367206,0.070606,0.039761,0.049501,-0.006013,
+ -0.904813,-0.425773,0.005552,0.040192,0.048501,-0.006167,
+ -0.927456,-0.367206,0.070606,0.039761,0.049501,-0.006013,
+ -0.929762,-0.368119,0.005552,0.03976,0.049501,-0.006167,
+ -0.876293,-0.481746,0.005552,0.040687,0.04753,-0.006167,
+ -0.87412,-0.480551,0.070606,0.040688,0.047531,-0.006013,
+ -0.902569,-0.424717,0.070606,0.040194,0.048502,-0.006013,
+ -0.876293,-0.481746,0.005552,0.040687,0.04753,-0.006167,
+ -0.902569,-0.424717,0.070606,0.040194,0.048502,-0.006013,
+ -0.904813,-0.425773,0.005552,0.040192,0.048501,-0.006167,
+ -0.844315,-0.535819,0.005552,0.041241,0.046592,-0.006167,
+ -0.842221,-0.53449,0.070606,0.041243,0.046593,-0.006013,
+ -0.87412,-0.480551,0.070606,0.040688,0.047531,-0.006013,
+ -0.844315,-0.535819,0.005552,0.041241,0.046592,-0.006167,
+ -0.87412,-0.480551,0.070606,0.040688,0.047531,-0.006013,
+ -0.876293,-0.481746,0.005552,0.040687,0.04753,-0.006167,
+ -0.809005,-0.587776,0.005552,0.041854,0.045691,-0.006167,
+ -0.806998,-0.586318,0.070606,0.041855,0.045692,-0.006013,
+ -0.842221,-0.53449,0.070606,0.041243,0.046593,-0.006013,
+ -0.809005,-0.587776,0.005552,0.041854,0.045691,-0.006167,
+ -0.842221,-0.53449,0.070606,0.041243,0.046593,-0.006013,
+ -0.844315,-0.535819,0.005552,0.041241,0.046592,-0.006167,
+ -0.770501,-0.637414,0.005552,0.042522,0.04483,-0.006167,
+ -0.76859,-0.635833,0.070606,0.042523,0.044831,-0.006013,
+ -0.806998,-0.586318,0.070606,0.041855,0.045692,-0.006013,
+ -0.770501,-0.637414,0.005552,0.042522,0.04483,-0.006167,
+ -0.806998,-0.586318,0.070606,0.041855,0.045692,-0.006013,
+ -0.809005,-0.587776,0.005552,0.041854,0.045691,-0.006167,
+ -0.728957,-0.684537,0.005552,0.043242,0.044013,-0.006167,
+ -0.727149,-0.682839,0.070606,0.043243,0.044014,-0.006013,
+ -0.76859,-0.635833,0.070606,0.042523,0.044831,-0.006013,
+ -0.728957,-0.684537,0.005552,0.043242,0.044013,-0.006167,
+ -0.76859,-0.635833,0.070606,0.042523,0.044831,-0.006013,
+ -0.770501,-0.637414,0.005552,0.042522,0.04483,-0.006167,
+ -0.684537,-0.728957,0.005552,0.044013,0.043242,-0.006167,
+ -0.682839,-0.727149,0.070606,0.044014,0.043243,-0.006013,
+ -0.727149,-0.682839,0.070606,0.043243,0.044014,-0.006013,
+ -0.684537,-0.728957,0.005552,0.044013,0.043242,-0.006167,
+ -0.727149,-0.682839,0.070606,0.043243,0.044014,-0.006013,
+ -0.728957,-0.684537,0.005552,0.043242,0.044013,-0.006167,
+ -0.637414,-0.770501,0.005552,0.04483,0.042522,-0.006167,
+ -0.635833,-0.76859,0.070606,0.044831,0.042523,-0.006013,
+ -0.682839,-0.727149,0.070606,0.044014,0.043243,-0.006013,
+ -0.637414,-0.770501,0.005552,0.04483,0.042522,-0.006167,
+ -0.682839,-0.727149,0.070606,0.044014,0.043243,-0.006013,
+ -0.684537,-0.728957,0.005552,0.044013,0.043242,-0.006167,
+ -0.587776,-0.809005,0.005552,0.045691,0.041854,-0.006167,
+ -0.586318,-0.806998,0.070606,0.045692,0.041855,-0.006013,
+ -0.635833,-0.76859,0.070606,0.044831,0.042523,-0.006013,
+ -0.587776,-0.809005,0.005552,0.045691,0.041854,-0.006167,
+ -0.635833,-0.76859,0.070606,0.044831,0.042523,-0.006013,
+ -0.637414,-0.770501,0.005552,0.04483,0.042522,-0.006167,
+ -0.535819,-0.844315,0.005552,0.046592,0.041241,-0.006167,
+ -0.53449,-0.842221,0.070606,0.046593,0.041243,-0.006013,
+ -0.586318,-0.806998,0.070606,0.045692,0.041855,-0.006013,
+ -0.535819,-0.844315,0.005552,0.046592,0.041241,-0.006167,
+ -0.586318,-0.806998,0.070606,0.045692,0.041855,-0.006013,
+ -0.587776,-0.809005,0.005552,0.045691,0.041854,-0.006167,
+ -0.481746,-0.876293,0.005552,0.04753,0.040687,-0.006167,
+ -0.480551,-0.87412,0.070606,0.047531,0.040688,-0.006013,
+ -0.53449,-0.842221,0.070606,0.046593,0.041243,-0.006013,
+ -0.481746,-0.876293,0.005552,0.04753,0.040687,-0.006167,
+ -0.53449,-0.842221,0.070606,0.046593,0.041243,-0.006013,
+ -0.535819,-0.844315,0.005552,0.046592,0.041241,-0.006167,
+ -0.425773,-0.904813,0.005552,0.048501,0.040192,-0.006167,
+ -0.424717,-0.902569,0.070606,0.048502,0.040194,-0.006013,
+ -0.480551,-0.87412,0.070606,0.047531,0.040688,-0.006013,
+ -0.425773,-0.904813,0.005552,0.048501,0.040192,-0.006167,
+ -0.480551,-0.87412,0.070606,0.047531,0.040688,-0.006013,
+ -0.481746,-0.876293,0.005552,0.04753,0.040687,-0.006167,
+ -0.368119,-0.929762,0.005552,0.049501,0.03976,-0.006167,
+ -0.367206,-0.927456,0.070606,0.049501,0.039761,-0.006013,
+ -0.424717,-0.902569,0.070606,0.048502,0.040194,-0.006013,
+ -0.368119,-0.929762,0.005552,0.049501,0.03976,-0.006167,
+ -0.424717,-0.902569,0.070606,0.048502,0.040194,-0.006013,
+ -0.425773,-0.904813,0.005552,0.048501,0.040192,-0.006167,
+ -0.309012,-0.951042,0.005552,0.050526,0.03939,-0.006167,
+ -0.308246,-0.948683,0.070606,0.050526,0.039392,-0.006013,
+ -0.367206,-0.927456,0.070606,0.049501,0.039761,-0.006013,
+ -0.309012,-0.951042,0.005552,0.050526,0.03939,-0.006167,
+ -0.367206,-0.927456,0.070606,0.049501,0.039761,-0.006013,
+ -0.368119,-0.929762,0.005552,0.049501,0.03976,-0.006167,
+ -0.248686,-0.968568,0.005552,0.051572,0.039087,-0.006167,
+ -0.248069,-0.966166,0.070606,0.051572,0.039088,-0.006013,
+ -0.308246,-0.948683,0.070606,0.050526,0.039392,-0.006013,
+ -0.248686,-0.968568,0.005552,0.051572,0.039087,-0.006167,
+ -0.308246,-0.948683,0.070606,0.050526,0.039392,-0.006013,
+ -0.309012,-0.951042,0.005552,0.050526,0.03939,-0.006167,
+ -0.187378,-0.982272,0.005552,0.052635,0.038849,-0.006167,
+ -0.186914,-0.979836,0.070606,0.052636,0.03885,-0.006013,
+ -0.248069,-0.966166,0.070606,0.051572,0.039088,-0.006013,
+ -0.187378,-0.982272,0.005552,0.052635,0.038849,-0.006167,
+ -0.248069,-0.966166,0.070606,0.051572,0.039088,-0.006013,
+ -0.248686,-0.968568,0.005552,0.051572,0.039087,-0.006167,
+ -0.125331,-0.992099,0.005552,0.053712,0.038678,-0.006167,
+ -0.12502,-0.989639,0.070606,0.053712,0.03868,-0.006013,
+ -0.186914,-0.979836,0.070606,0.052636,0.03885,-0.006013,
+ -0.125331,-0.992099,0.005552,0.053712,0.038678,-0.006167,
+ -0.186914,-0.979836,0.070606,0.052636,0.03885,-0.006013,
+ -0.187378,-0.982272,0.005552,0.052635,0.038849,-0.006167,
+ -0.07324,-0.997287,0.007402,0.054796,0.038576,-0.006167,
+ -0.062634,-0.995536,0.070606,0.054796,0.038577,-0.006013,
+ -0.12502,-0.989639,0.070606,0.053712,0.03868,-0.006013,
+ -0.07324,-0.997287,0.007402,0.054796,0.038576,-0.006167,
+ -0.12502,-0.989639,0.070606,0.053712,0.03868,-0.006013,
+ -0.125331,-0.992099,0.005552,0.053712,0.038678,-0.006167,
+ 0,-0.999938,0.011104,0.055885,0.038542,-0.006167,
+ 0,-0.997504,0.070606,0.055885,0.038543,-0.006013,
+ -0.062634,-0.995536,0.070606,0.054796,0.038577,-0.006013,
+ 0,-0.999938,0.011104,0.055885,0.038542,-0.006167,
+ -0.062634,-0.995536,0.070606,0.054796,0.038577,-0.006013,
+ -0.07324,-0.997287,0.007402,0.054796,0.038576,-0.006167,
+ 0.07324,-0.997287,0.007402,0.056974,0.038576,-0.006167,
+ 0.062634,-0.995536,0.070606,0.056974,0.038577,-0.006013,
+ 0,-0.997504,0.070606,0.055885,0.038543,-0.006013,
+ 0.07324,-0.997287,0.007402,0.056974,0.038576,-0.006167,
+ 0,-0.997504,0.070606,0.055885,0.038543,-0.006013,
+ 0,-0.999938,0.011104,0.055885,0.038542,-0.006167,
+ 0.125331,-0.992099,0.005552,0.058059,0.038678,-0.006167,
+ 0.12502,-0.989639,0.070606,0.058059,0.03868,-0.006013,
+ 0.062634,-0.995536,0.070606,0.056974,0.038577,-0.006013,
+ 0.125331,-0.992099,0.005552,0.058059,0.038678,-0.006167,
+ 0.062634,-0.995536,0.070606,0.056974,0.038577,-0.006013,
+ 0.07324,-0.997287,0.007402,0.056974,0.038576,-0.006167,
+ 0.187378,-0.982272,0.005552,0.059135,0.038849,-0.006167,
+ 0.186914,-0.979836,0.070606,0.059135,0.03885,-0.006013,
+ 0.12502,-0.989639,0.070606,0.058059,0.03868,-0.006013,
+ 0.187378,-0.982272,0.005552,0.059135,0.038849,-0.006167,
+ 0.12502,-0.989639,0.070606,0.058059,0.03868,-0.006013,
+ 0.125331,-0.992099,0.005552,0.058059,0.038678,-0.006167,
+ 0.248686,-0.968568,0.005552,0.060198,0.039087,-0.006167,
+ 0.248069,-0.966166,0.070606,0.060198,0.039088,-0.006013,
+ 0.186914,-0.979836,0.070606,0.059135,0.03885,-0.006013,
+ 0.248686,-0.968568,0.005552,0.060198,0.039087,-0.006167,
+ 0.186914,-0.979836,0.070606,0.059135,0.03885,-0.006013,
+ 0.187378,-0.982272,0.005552,0.059135,0.038849,-0.006167,
+ 0.309012,-0.951042,0.005552,0.061245,0.03939,-0.006167,
+ 0.308246,-0.948683,0.070606,0.061244,0.039392,-0.006013,
+ 0.248069,-0.966166,0.070606,0.060198,0.039088,-0.006013,
+ 0.309012,-0.951042,0.005552,0.061245,0.03939,-0.006167,
+ 0.248069,-0.966166,0.070606,0.060198,0.039088,-0.006013,
+ 0.248686,-0.968568,0.005552,0.060198,0.039087,-0.006167,
+ 0.368119,-0.929762,0.005552,0.06227,0.03976,-0.006167,
+ 0.367206,-0.927456,0.070606,0.062269,0.039761,-0.006013,
+ 0.308246,-0.948683,0.070606,0.061244,0.039392,-0.006013,
+ 0.368119,-0.929762,0.005552,0.06227,0.03976,-0.006167,
+ 0.308246,-0.948683,0.070606,0.061244,0.039392,-0.006013,
+ 0.309012,-0.951042,0.005552,0.061245,0.03939,-0.006167,
+ 0.425773,-0.904813,0.005552,0.06327,0.040192,-0.006167,
+ 0.424717,-0.902569,0.070606,0.063269,0.040194,-0.006013,
+ 0.367206,-0.927456,0.070606,0.062269,0.039761,-0.006013,
+ 0.425773,-0.904813,0.005552,0.06327,0.040192,-0.006167,
+ 0.367206,-0.927456,0.070606,0.062269,0.039761,-0.006013,
+ 0.368119,-0.929762,0.005552,0.06227,0.03976,-0.006167,
+ 0.481746,-0.876293,0.005552,0.064241,0.040687,-0.006167,
+ 0.480551,-0.87412,0.070606,0.06424,0.040688,-0.006013,
+ 0.424717,-0.902569,0.070606,0.063269,0.040194,-0.006013,
+ 0.481746,-0.876293,0.005552,0.064241,0.040687,-0.006167,
+ 0.424717,-0.902569,0.070606,0.063269,0.040194,-0.006013,
+ 0.425773,-0.904813,0.005552,0.06327,0.040192,-0.006167,
+ 0.535819,-0.844315,0.005552,0.065178,0.041241,-0.006167,
+ 0.53449,-0.842221,0.070606,0.065178,0.041243,-0.006013,
+ 0.480551,-0.87412,0.070606,0.06424,0.040688,-0.006013,
+ 0.535819,-0.844315,0.005552,0.065178,0.041241,-0.006167,
+ 0.480551,-0.87412,0.070606,0.06424,0.040688,-0.006013,
+ 0.481746,-0.876293,0.005552,0.064241,0.040687,-0.006167,
+ 0.587776,-0.809005,0.005552,0.06608,0.041854,-0.006167,
+ 0.586318,-0.806998,0.070606,0.066079,0.041855,-0.006013,
+ 0.53449,-0.842221,0.070606,0.065178,0.041243,-0.006013,
+ 0.587776,-0.809005,0.005552,0.06608,0.041854,-0.006167,
+ 0.53449,-0.842221,0.070606,0.065178,0.041243,-0.006013,
+ 0.535819,-0.844315,0.005552,0.065178,0.041241,-0.006167,
+ 0.637414,-0.770501,0.005552,0.066941,0.042522,-0.006167,
+ 0.635833,-0.76859,0.070606,0.06694,0.042523,-0.006013,
+ 0.586318,-0.806998,0.070606,0.066079,0.041855,-0.006013,
+ 0.637414,-0.770501,0.005552,0.066941,0.042522,-0.006167,
+ 0.586318,-0.806998,0.070606,0.066079,0.041855,-0.006013,
+ 0.587776,-0.809005,0.005552,0.06608,0.041854,-0.006167,
+ 0.684537,-0.728957,0.005552,0.067758,0.043242,-0.006167,
+ 0.682839,-0.727149,0.070606,0.067757,0.043243,-0.006013,
+ 0.635833,-0.76859,0.070606,0.06694,0.042523,-0.006013,
+ 0.684537,-0.728957,0.005552,0.067758,0.043242,-0.006167,
+ 0.635833,-0.76859,0.070606,0.06694,0.042523,-0.006013,
+ 0.637414,-0.770501,0.005552,0.066941,0.042522,-0.006167,
+ 0.728957,-0.684537,0.005552,0.068528,0.044013,-0.006167,
+ 0.727149,-0.682839,0.070606,0.068527,0.044014,-0.006013,
+ 0.682839,-0.727149,0.070606,0.067757,0.043243,-0.006013,
+ 0.728957,-0.684537,0.005552,0.068528,0.044013,-0.006167,
+ 0.682839,-0.727149,0.070606,0.067757,0.043243,-0.006013,
+ 0.684537,-0.728957,0.005552,0.067758,0.043242,-0.006167,
+ 0.770501,-0.637414,0.005552,0.069249,0.04483,-0.006167,
+ 0.76859,-0.635833,0.070606,0.069247,0.044831,-0.006013,
+ 0.727149,-0.682839,0.070606,0.068527,0.044014,-0.006013,
+ 0.770501,-0.637414,0.005552,0.069249,0.04483,-0.006167,
+ 0.727149,-0.682839,0.070606,0.068527,0.044014,-0.006013,
+ 0.728957,-0.684537,0.005552,0.068528,0.044013,-0.006167,
+ 0.809005,-0.587776,0.005552,0.069917,0.045691,-0.006167,
+ 0.806998,-0.586318,0.070606,0.069915,0.045692,-0.006013,
+ 0.76859,-0.635833,0.070606,0.069247,0.044831,-0.006013,
+ 0.809005,-0.587776,0.005552,0.069917,0.045691,-0.006167,
+ 0.76859,-0.635833,0.070606,0.069247,0.044831,-0.006013,
+ 0.770501,-0.637414,0.005552,0.069249,0.04483,-0.006167,
+ 0.844315,-0.535819,0.005552,0.070529,0.046592,-0.006167,
+ 0.842221,-0.53449,0.070606,0.070528,0.046593,-0.006013,
+ 0.806998,-0.586318,0.070606,0.069915,0.045692,-0.006013,
+ 0.844315,-0.535819,0.005552,0.070529,0.046592,-0.006167,
+ 0.806998,-0.586318,0.070606,0.069915,0.045692,-0.006013,
+ 0.809005,-0.587776,0.005552,0.069917,0.045691,-0.006167,
+ 0.876293,-0.481746,0.005552,0.071084,0.04753,-0.006167,
+ 0.87412,-0.480551,0.070606,0.071082,0.047531,-0.006013,
+ 0.842221,-0.53449,0.070606,0.070528,0.046593,-0.006013,
+ 0.876293,-0.481746,0.005552,0.071084,0.04753,-0.006167,
+ 0.842221,-0.53449,0.070606,0.070528,0.046593,-0.006013,
+ 0.844315,-0.535819,0.005552,0.070529,0.046592,-0.006167,
+ 0.904813,-0.425773,0.005552,0.071578,0.048501,-0.006167,
+ 0.902569,-0.424717,0.070606,0.071577,0.048502,-0.006013,
+ 0.87412,-0.480551,0.070606,0.071082,0.047531,-0.006013,
+ 0.904813,-0.425773,0.005552,0.071578,0.048501,-0.006167,
+ 0.87412,-0.480551,0.070606,0.071082,0.047531,-0.006013,
+ 0.876293,-0.481746,0.005552,0.071084,0.04753,-0.006167,
+ 0.929762,-0.368119,0.005552,0.072011,0.049501,-0.006167,
+ 0.927456,-0.367206,0.070606,0.07201,0.049501,-0.006013,
+ 0.902569,-0.424717,0.070606,0.071577,0.048502,-0.006013,
+ 0.929762,-0.368119,0.005552,0.072011,0.049501,-0.006167,
+ 0.902569,-0.424717,0.070606,0.071577,0.048502,-0.006013,
+ 0.904813,-0.425773,0.005552,0.071578,0.048501,-0.006167,
+ 0.951042,-0.309012,0.005552,0.07238,0.050526,-0.006167,
+ 0.948683,-0.308246,0.070606,0.072379,0.050526,-0.006013,
+ 0.927456,-0.367206,0.070606,0.07201,0.049501,-0.006013,
+ 0.951042,-0.309012,0.005552,0.07238,0.050526,-0.006167,
+ 0.927456,-0.367206,0.070606,0.07201,0.049501,-0.006013,
+ 0.929762,-0.368119,0.005552,0.072011,0.049501,-0.006167,
+ 0.968568,-0.248686,0.005552,0.072684,0.051572,-0.006167,
+ 0.966166,-0.248069,0.070606,0.072682,0.051572,-0.006013,
+ 0.948683,-0.308246,0.070606,0.072379,0.050526,-0.006013,
+ 0.968568,-0.248686,0.005552,0.072684,0.051572,-0.006167,
+ 0.948683,-0.308246,0.070606,0.072379,0.050526,-0.006013,
+ 0.951042,-0.309012,0.005552,0.07238,0.050526,-0.006167,
+ 0.982272,-0.187378,0.005552,0.072922,0.052635,-0.006167,
+ 0.979836,-0.186914,0.070606,0.07292,0.052636,-0.006013,
+ 0.966166,-0.248069,0.070606,0.072682,0.051572,-0.006013,
+ 0.982272,-0.187378,0.005552,0.072922,0.052635,-0.006167,
+ 0.966166,-0.248069,0.070606,0.072682,0.051572,-0.006013,
+ 0.968568,-0.248686,0.005552,0.072684,0.051572,-0.006167,
+ 0.992099,-0.125331,0.005552,0.073092,0.053712,-0.006167,
+ 0.989639,-0.12502,0.070606,0.073091,0.053712,-0.006013,
+ 0.979836,-0.186914,0.070606,0.07292,0.052636,-0.006013,
+ 0.992099,-0.125331,0.005552,0.073092,0.053712,-0.006167,
+ 0.979836,-0.186914,0.070606,0.07292,0.052636,-0.006013,
+ 0.982272,-0.187378,0.005552,0.072922,0.052635,-0.006167,
+ 0.997287,-0.07324,0.007402,0.073195,0.054796,-0.006167,
+ 0.995536,-0.062634,0.070606,0.073193,0.054796,-0.006013,
+ 0.989639,-0.12502,0.070606,0.073091,0.053712,-0.006013,
+ 0.997287,-0.07324,0.007402,0.073195,0.054796,-0.006167,
+ 0.989639,-0.12502,0.070606,0.073091,0.053712,-0.006013,
+ 0.992099,-0.125331,0.005552,0.073092,0.053712,-0.006167,
+ 0.999938,0,0.011104,0.073229,0.055885,-0.006167,
+ 0.997504,0,0.070606,0.073227,0.055885,-0.006013,
+ 0.995536,-0.062634,0.070606,0.073193,0.054796,-0.006013,
+ 0.999938,0,0.011104,0.073229,0.055885,-0.006167,
+ 0.995536,-0.062634,0.070606,0.073193,0.054796,-0.006013,
+ 0.997287,-0.07324,0.007402,0.073195,0.054796,-0.006167,
+ 0.997287,0.07324,0.007402,0.073195,0.056974,-0.006167,
+ 0.995536,0.062634,0.070606,0.073193,0.056974,-0.006013,
+ 0.997504,0,0.070606,0.073227,0.055885,-0.006013,
+ 0.997287,0.07324,0.007402,0.073195,0.056974,-0.006167,
+ 0.997504,0,0.070606,0.073227,0.055885,-0.006013,
+ 0.999938,0,0.011104,0.073229,0.055885,-0.006167,
+ 0.992099,0.125331,0.005552,0.073092,0.058059,-0.006167,
+ 0.989639,0.12502,0.070606,0.073091,0.058059,-0.006013,
+ 0.995536,0.062634,0.070606,0.073193,0.056974,-0.006013,
+ 0.992099,0.125331,0.005552,0.073092,0.058059,-0.006167,
+ 0.995536,0.062634,0.070606,0.073193,0.056974,-0.006013,
+ 0.997287,0.07324,0.007402,0.073195,0.056974,-0.006167,
+ 0.982272,0.187378,0.005552,0.072922,0.059135,-0.006167,
+ 0.979836,0.186914,0.070606,0.07292,0.059135,-0.006013,
+ 0.989639,0.12502,0.070606,0.073091,0.058059,-0.006013,
+ 0.982272,0.187378,0.005552,0.072922,0.059135,-0.006167,
+ 0.989639,0.12502,0.070606,0.073091,0.058059,-0.006013,
+ 0.992099,0.125331,0.005552,0.073092,0.058059,-0.006167,
+ 0.968568,0.248686,0.005552,0.072684,0.060198,-0.006167,
+ 0.966166,0.248069,0.070606,0.072682,0.060198,-0.006013,
+ 0.979836,0.186914,0.070606,0.07292,0.059135,-0.006013,
+ 0.968568,0.248686,0.005552,0.072684,0.060198,-0.006167,
+ 0.979836,0.186914,0.070606,0.07292,0.059135,-0.006013,
+ 0.982272,0.187378,0.005552,0.072922,0.059135,-0.006167,
+ 0.951042,0.309012,0.005552,0.07238,0.061245,-0.006167,
+ 0.948683,0.308246,0.070606,0.072379,0.061244,-0.006013,
+ 0.966166,0.248069,0.070606,0.072682,0.060198,-0.006013,
+ 0.951042,0.309012,0.005552,0.07238,0.061245,-0.006167,
+ 0.966166,0.248069,0.070606,0.072682,0.060198,-0.006013,
+ 0.968568,0.248686,0.005552,0.072684,0.060198,-0.006167,
+ 0.929762,0.368119,0.005552,0.072011,0.06227,-0.006167,
+ 0.927456,0.367206,0.070606,0.07201,0.062269,-0.006013,
+ 0.948683,0.308246,0.070606,0.072379,0.061244,-0.006013,
+ 0.929762,0.368119,0.005552,0.072011,0.06227,-0.006167,
+ 0.948683,0.308246,0.070606,0.072379,0.061244,-0.006013,
+ 0.951042,0.309012,0.005552,0.07238,0.061245,-0.006167,
+ 0.904813,0.425773,0.005552,0.071578,0.06327,-0.006167,
+ 0.902569,0.424717,0.070606,0.071577,0.063269,-0.006013,
+ 0.927456,0.367206,0.070606,0.07201,0.062269,-0.006013,
+ 0.904813,0.425773,0.005552,0.071578,0.06327,-0.006167,
+ 0.927456,0.367206,0.070606,0.07201,0.062269,-0.006013,
+ 0.929762,0.368119,0.005552,0.072011,0.06227,-0.006167,
+ 0.876293,0.481746,0.005552,0.071084,0.064241,-0.006167,
+ 0.87412,0.480551,0.070606,0.071082,0.06424,-0.006013,
+ 0.902569,0.424717,0.070606,0.071577,0.063269,-0.006013,
+ 0.876293,0.481746,0.005552,0.071084,0.064241,-0.006167,
+ 0.902569,0.424717,0.070606,0.071577,0.063269,-0.006013,
+ 0.904813,0.425773,0.005552,0.071578,0.06327,-0.006167,
+ 0.844315,0.535819,0.005552,0.070529,0.065178,-0.006167,
+ 0.842221,0.53449,0.070606,0.070528,0.065178,-0.006013,
+ 0.87412,0.480551,0.070606,0.071082,0.06424,-0.006013,
+ 0.844315,0.535819,0.005552,0.070529,0.065178,-0.006167,
+ 0.87412,0.480551,0.070606,0.071082,0.06424,-0.006013,
+ 0.876293,0.481746,0.005552,0.071084,0.064241,-0.006167,
+ 0.809005,0.587776,0.005552,0.069917,0.06608,-0.006167,
+ 0.806998,0.586318,0.070606,0.069915,0.066079,-0.006013,
+ 0.842221,0.53449,0.070606,0.070528,0.065178,-0.006013,
+ 0.809005,0.587776,0.005552,0.069917,0.06608,-0.006167,
+ 0.842221,0.53449,0.070606,0.070528,0.065178,-0.006013,
+ 0.844315,0.535819,0.005552,0.070529,0.065178,-0.006167,
+ 0.770501,0.637414,0.005552,0.069249,0.066941,-0.006167,
+ 0.76859,0.635833,0.070606,0.069247,0.06694,-0.006013,
+ 0.806998,0.586318,0.070606,0.069915,0.066079,-0.006013,
+ 0.770501,0.637414,0.005552,0.069249,0.066941,-0.006167,
+ 0.806998,0.586318,0.070606,0.069915,0.066079,-0.006013,
+ 0.809005,0.587776,0.005552,0.069917,0.06608,-0.006167,
+ 0.728957,0.684537,0.005552,0.068528,0.067758,-0.006167,
+ 0.727149,0.682839,0.070606,0.068527,0.067757,-0.006013,
+ 0.76859,0.635833,0.070606,0.069247,0.06694,-0.006013,
+ 0.728957,0.684537,0.005552,0.068528,0.067758,-0.006167,
+ 0.76859,0.635833,0.070606,0.069247,0.06694,-0.006013,
+ 0.770501,0.637414,0.005552,0.069249,0.066941,-0.006167,
+ 0.684537,0.728957,0.005552,0.067758,0.068528,-0.006167,
+ 0.682839,0.727149,0.070606,0.067757,0.068527,-0.006013,
+ 0.727149,0.682839,0.070606,0.068527,0.067757,-0.006013,
+ 0.684537,0.728957,0.005552,0.067758,0.068528,-0.006167,
+ 0.727149,0.682839,0.070606,0.068527,0.067757,-0.006013,
+ 0.728957,0.684537,0.005552,0.068528,0.067758,-0.006167,
+ 0.637414,0.770501,0.005552,0.066941,0.069249,-0.006167,
+ 0.635833,0.76859,0.070606,0.06694,0.069247,-0.006013,
+ 0.682839,0.727149,0.070606,0.067757,0.068527,-0.006013,
+ 0.637414,0.770501,0.005552,0.066941,0.069249,-0.006167,
+ 0.682839,0.727149,0.070606,0.067757,0.068527,-0.006013,
+ 0.684537,0.728957,0.005552,0.067758,0.068528,-0.006167,
+ 0.587776,0.809005,0.005552,0.06608,0.069917,-0.006167,
+ 0.586318,0.806998,0.070606,0.066079,0.069915,-0.006013,
+ 0.635833,0.76859,0.070606,0.06694,0.069247,-0.006013,
+ 0.587776,0.809005,0.005552,0.06608,0.069917,-0.006167,
+ 0.635833,0.76859,0.070606,0.06694,0.069247,-0.006013,
+ 0.637414,0.770501,0.005552,0.066941,0.069249,-0.006167,
+ 0.535819,0.844315,0.005552,0.065178,0.070529,-0.006167,
+ 0.53449,0.842221,0.070606,0.065178,0.070528,-0.006013,
+ 0.586318,0.806998,0.070606,0.066079,0.069915,-0.006013,
+ 0.535819,0.844315,0.005552,0.065178,0.070529,-0.006167,
+ 0.586318,0.806998,0.070606,0.066079,0.069915,-0.006013,
+ 0.587776,0.809005,0.005552,0.06608,0.069917,-0.006167,
+ 0.481746,0.876293,0.005552,0.064241,0.071084,-0.006167,
+ 0.480551,0.87412,0.070606,0.06424,0.071082,-0.006013,
+ 0.53449,0.842221,0.070606,0.065178,0.070528,-0.006013,
+ 0.481746,0.876293,0.005552,0.064241,0.071084,-0.006167,
+ 0.53449,0.842221,0.070606,0.065178,0.070528,-0.006013,
+ 0.535819,0.844315,0.005552,0.065178,0.070529,-0.006167,
+ 0.425773,0.904813,0.005552,0.06327,0.071578,-0.006167,
+ 0.424717,0.902569,0.070606,0.063269,0.071577,-0.006013,
+ 0.480551,0.87412,0.070606,0.06424,0.071082,-0.006013,
+ 0.425773,0.904813,0.005552,0.06327,0.071578,-0.006167,
+ 0.480551,0.87412,0.070606,0.06424,0.071082,-0.006013,
+ 0.481746,0.876293,0.005552,0.064241,0.071084,-0.006167,
+ 0.368119,0.929762,0.005552,0.06227,0.072011,-0.006167,
+ 0.367206,0.927456,0.070606,0.062269,0.07201,-0.006013,
+ 0.424717,0.902569,0.070606,0.063269,0.071577,-0.006013,
+ 0.368119,0.929762,0.005552,0.06227,0.072011,-0.006167,
+ 0.424717,0.902569,0.070606,0.063269,0.071577,-0.006013,
+ 0.425773,0.904813,0.005552,0.06327,0.071578,-0.006167,
+ 0.309012,0.951042,0.005552,0.061245,0.07238,-0.006167,
+ 0.308246,0.948683,0.070606,0.061244,0.072379,-0.006013,
+ 0.367206,0.927456,0.070606,0.062269,0.07201,-0.006013,
+ 0.309012,0.951042,0.005552,0.061245,0.07238,-0.006167,
+ 0.367206,0.927456,0.070606,0.062269,0.07201,-0.006013,
+ 0.368119,0.929762,0.005552,0.06227,0.072011,-0.006167,
+ 0.248686,0.968568,0.005552,0.060198,0.072684,-0.006167,
+ 0.248069,0.966166,0.070606,0.060198,0.072682,-0.006013,
+ 0.308246,0.948683,0.070606,0.061244,0.072379,-0.006013,
+ 0.248686,0.968568,0.005552,0.060198,0.072684,-0.006167,
+ 0.308246,0.948683,0.070606,0.061244,0.072379,-0.006013,
+ 0.309012,0.951042,0.005552,0.061245,0.07238,-0.006167,
+ 0.187378,0.982272,0.005552,0.059135,0.072922,-0.006167,
+ 0.186914,0.979836,0.070606,0.059135,0.07292,-0.006013,
+ 0.248069,0.966166,0.070606,0.060198,0.072682,-0.006013,
+ 0.187378,0.982272,0.005552,0.059135,0.072922,-0.006167,
+ 0.248069,0.966166,0.070606,0.060198,0.072682,-0.006013,
+ 0.248686,0.968568,0.005552,0.060198,0.072684,-0.006167,
+ 0.125331,0.992099,0.005552,0.058059,0.073092,-0.006167,
+ 0.12502,0.989639,0.070606,0.058059,0.073091,-0.006013,
+ 0.186914,0.979836,0.070606,0.059135,0.07292,-0.006013,
+ 0.125331,0.992099,0.005552,0.058059,0.073092,-0.006167,
+ 0.186914,0.979836,0.070606,0.059135,0.07292,-0.006013,
+ 0.187378,0.982272,0.005552,0.059135,0.072922,-0.006167,
+ 0.07324,0.997287,0.007402,0.056974,0.073195,-0.006167,
+ 0.062634,0.995536,0.070606,0.056974,0.073193,-0.006013,
+ 0.12502,0.989639,0.070606,0.058059,0.073091,-0.006013,
+ 0.07324,0.997287,0.007402,0.056974,0.073195,-0.006167,
+ 0.12502,0.989639,0.070606,0.058059,0.073091,-0.006013,
+ 0.125331,0.992099,0.005552,0.058059,0.073092,-0.006167,
+ 0,0.999938,0.011104,0.055885,0.073229,-0.006167,
+ 0,0.997504,0.070606,0.055885,0.073227,-0.006013,
+ 0.062634,0.995536,0.070606,0.056974,0.073193,-0.006013,
+ 0,0.999938,0.011104,0.055885,0.073229,-0.006167,
+ 0.062634,0.995536,0.070606,0.056974,0.073193,-0.006013,
+ 0.07324,0.997287,0.007402,0.056974,0.073195,-0.006167,
+ -0.07324,0.997287,0.007402,0.054796,0.073195,-0.006167,
+ -0.062634,0.995536,0.070606,0.054796,0.073193,-0.006013,
+ 0,0.997504,0.070606,0.055885,0.073227,-0.006013,
+ -0.07324,0.997287,0.007402,0.054796,0.073195,-0.006167,
+ 0,0.997504,0.070606,0.055885,0.073227,-0.006013,
+ 0,0.999938,0.011104,0.055885,0.073229,-0.006167,
+ -0.125331,0.992099,0.005552,0.053712,0.073092,-0.006167,
+ -0.12502,0.989639,0.070606,0.053712,0.073091,-0.006013,
+ -0.062634,0.995536,0.070606,0.054796,0.073193,-0.006013,
+ -0.125331,0.992099,0.005552,0.053712,0.073092,-0.006167,
+ -0.062634,0.995536,0.070606,0.054796,0.073193,-0.006013,
+ -0.07324,0.997287,0.007402,0.054796,0.073195,-0.006167,
+ -0.187378,0.982272,0.005552,0.052635,0.072922,-0.006167,
+ -0.186914,0.979836,0.070606,0.052636,0.07292,-0.006013,
+ -0.12502,0.989639,0.070606,0.053712,0.073091,-0.006013,
+ -0.187378,0.982272,0.005552,0.052635,0.072922,-0.006167,
+ -0.12502,0.989639,0.070606,0.053712,0.073091,-0.006013,
+ -0.125331,0.992099,0.005552,0.053712,0.073092,-0.006167,
+ -0.248686,0.968568,0.005552,0.051572,0.072684,-0.006167,
+ -0.248069,0.966166,0.070606,0.051572,0.072682,-0.006013,
+ -0.186914,0.979836,0.070606,0.052636,0.07292,-0.006013,
+ -0.248686,0.968568,0.005552,0.051572,0.072684,-0.006167,
+ -0.186914,0.979836,0.070606,0.052636,0.07292,-0.006013,
+ -0.187378,0.982272,0.005552,0.052635,0.072922,-0.006167,
+ -0.309012,0.951042,0.005552,0.050526,0.07238,-0.006167,
+ -0.308246,0.948683,0.070606,0.050526,0.072379,-0.006013,
+ -0.248069,0.966166,0.070606,0.051572,0.072682,-0.006013,
+ -0.309012,0.951042,0.005552,0.050526,0.07238,-0.006167,
+ -0.248069,0.966166,0.070606,0.051572,0.072682,-0.006013,
+ -0.248686,0.968568,0.005552,0.051572,0.072684,-0.006167,
+ -0.368119,0.929762,0.005552,0.049501,0.072011,-0.006167,
+ -0.367206,0.927456,0.070606,0.049501,0.07201,-0.006013,
+ -0.308246,0.948683,0.070606,0.050526,0.072379,-0.006013,
+ -0.368119,0.929762,0.005552,0.049501,0.072011,-0.006167,
+ -0.308246,0.948683,0.070606,0.050526,0.072379,-0.006013,
+ -0.309012,0.951042,0.005552,0.050526,0.07238,-0.006167,
+ -0.425773,0.904813,0.005552,0.048501,0.071578,-0.006167,
+ -0.424717,0.902569,0.070606,0.048502,0.071577,-0.006013,
+ -0.367206,0.927456,0.070606,0.049501,0.07201,-0.006013,
+ -0.425773,0.904813,0.005552,0.048501,0.071578,-0.006167,
+ -0.367206,0.927456,0.070606,0.049501,0.07201,-0.006013,
+ -0.368119,0.929762,0.005552,0.049501,0.072011,-0.006167,
+ -0.481746,0.876293,0.005552,0.04753,0.071084,-0.006167,
+ -0.480551,0.87412,0.070606,0.047531,0.071082,-0.006013,
+ -0.424717,0.902569,0.070606,0.048502,0.071577,-0.006013,
+ -0.481746,0.876293,0.005552,0.04753,0.071084,-0.006167,
+ -0.424717,0.902569,0.070606,0.048502,0.071577,-0.006013,
+ -0.425773,0.904813,0.005552,0.048501,0.071578,-0.006167,
+ -0.535819,0.844315,0.005552,0.046592,0.070529,-0.006167,
+ -0.53449,0.842221,0.070606,0.046593,0.070528,-0.006013,
+ -0.480551,0.87412,0.070606,0.047531,0.071082,-0.006013,
+ -0.535819,0.844315,0.005552,0.046592,0.070529,-0.006167,
+ -0.480551,0.87412,0.070606,0.047531,0.071082,-0.006013,
+ -0.481746,0.876293,0.005552,0.04753,0.071084,-0.006167,
+ -0.587776,0.809005,0.005552,0.045691,0.069917,-0.006167,
+ -0.586318,0.806998,0.070606,0.045692,0.069915,-0.006013,
+ -0.53449,0.842221,0.070606,0.046593,0.070528,-0.006013,
+ -0.587776,0.809005,0.005552,0.045691,0.069917,-0.006167,
+ -0.53449,0.842221,0.070606,0.046593,0.070528,-0.006013,
+ -0.535819,0.844315,0.005552,0.046592,0.070529,-0.006167,
+ -0.637414,0.770501,0.005552,0.04483,0.069249,-0.006167,
+ -0.635833,0.76859,0.070606,0.044831,0.069247,-0.006013,
+ -0.586318,0.806998,0.070606,0.045692,0.069915,-0.006013,
+ -0.637414,0.770501,0.005552,0.04483,0.069249,-0.006167,
+ -0.586318,0.806998,0.070606,0.045692,0.069915,-0.006013,
+ -0.587776,0.809005,0.005552,0.045691,0.069917,-0.006167,
+ -0.684537,0.728957,0.005552,0.044013,0.068528,-0.006167,
+ -0.682839,0.727149,0.070606,0.044014,0.068527,-0.006013,
+ -0.635833,0.76859,0.070606,0.044831,0.069247,-0.006013,
+ -0.684537,0.728957,0.005552,0.044013,0.068528,-0.006167,
+ -0.635833,0.76859,0.070606,0.044831,0.069247,-0.006013,
+ -0.637414,0.770501,0.005552,0.04483,0.069249,-0.006167,
+ -0.728957,0.684537,0.005552,0.043242,0.067758,-0.006167,
+ -0.727149,0.682839,0.070606,0.043243,0.067757,-0.006013,
+ -0.682839,0.727149,0.070606,0.044014,0.068527,-0.006013,
+ -0.728957,0.684537,0.005552,0.043242,0.067758,-0.006167,
+ -0.682839,0.727149,0.070606,0.044014,0.068527,-0.006013,
+ -0.684537,0.728957,0.005552,0.044013,0.068528,-0.006167,
+ -0.770501,0.637414,0.005552,0.042522,0.066941,-0.006167,
+ -0.76859,0.635833,0.070606,0.042523,0.06694,-0.006013,
+ -0.727149,0.682839,0.070606,0.043243,0.067757,-0.006013,
+ -0.770501,0.637414,0.005552,0.042522,0.066941,-0.006167,
+ -0.727149,0.682839,0.070606,0.043243,0.067757,-0.006013,
+ -0.728957,0.684537,0.005552,0.043242,0.067758,-0.006167,
+ -0.809005,0.587776,0.005552,0.041854,0.06608,-0.006167,
+ -0.806998,0.586318,0.070606,0.041855,0.066079,-0.006013,
+ -0.76859,0.635833,0.070606,0.042523,0.06694,-0.006013,
+ -0.809005,0.587776,0.005552,0.041854,0.06608,-0.006167,
+ -0.76859,0.635833,0.070606,0.042523,0.06694,-0.006013,
+ -0.770501,0.637414,0.005552,0.042522,0.066941,-0.006167,
+ -0.844315,0.535819,0.005552,0.041241,0.065178,-0.006167,
+ -0.842221,0.53449,0.070606,0.041243,0.065178,-0.006013,
+ -0.806998,0.586318,0.070606,0.041855,0.066079,-0.006013,
+ -0.844315,0.535819,0.005552,0.041241,0.065178,-0.006167,
+ -0.806998,0.586318,0.070606,0.041855,0.066079,-0.006013,
+ -0.809005,0.587776,0.005552,0.041854,0.06608,-0.006167,
+ -0.876293,0.481746,0.005552,0.040687,0.064241,-0.006167,
+ -0.87412,0.480551,0.070606,0.040688,0.06424,-0.006013,
+ -0.842221,0.53449,0.070606,0.041243,0.065178,-0.006013,
+ -0.876293,0.481746,0.005552,0.040687,0.064241,-0.006167,
+ -0.842221,0.53449,0.070606,0.041243,0.065178,-0.006013,
+ -0.844315,0.535819,0.005552,0.041241,0.065178,-0.006167,
+ -0.904813,0.425773,0.005552,0.040192,0.06327,-0.006167,
+ -0.902569,0.424717,0.070606,0.040194,0.063269,-0.006013,
+ -0.87412,0.480551,0.070606,0.040688,0.06424,-0.006013,
+ -0.904813,0.425773,0.005552,0.040192,0.06327,-0.006167,
+ -0.87412,0.480551,0.070606,0.040688,0.06424,-0.006013,
+ -0.876293,0.481746,0.005552,0.040687,0.064241,-0.006167,
+ -0.929762,0.368119,0.005552,0.03976,0.06227,-0.006167,
+ -0.927456,0.367206,0.070606,0.039761,0.062269,-0.006013,
+ -0.902569,0.424717,0.070606,0.040194,0.063269,-0.006013,
+ -0.929762,0.368119,0.005552,0.03976,0.06227,-0.006167,
+ -0.902569,0.424717,0.070606,0.040194,0.063269,-0.006013,
+ -0.904813,0.425773,0.005552,0.040192,0.06327,-0.006167,
+ -0.951042,0.309012,0.005552,0.03939,0.061245,-0.006167,
+ -0.948683,0.308246,0.070606,0.039392,0.061244,-0.006013,
+ -0.927456,0.367206,0.070606,0.039761,0.062269,-0.006013,
+ -0.951042,0.309012,0.005552,0.03939,0.061245,-0.006167,
+ -0.927456,0.367206,0.070606,0.039761,0.062269,-0.006013,
+ -0.929762,0.368119,0.005552,0.03976,0.06227,-0.006167,
+ -0.968568,0.248686,0.005552,0.039087,0.060198,-0.006167,
+ -0.966166,0.248069,0.070606,0.039088,0.060198,-0.006013,
+ -0.948683,0.308246,0.070606,0.039392,0.061244,-0.006013,
+ -0.968568,0.248686,0.005552,0.039087,0.060198,-0.006167,
+ -0.948683,0.308246,0.070606,0.039392,0.061244,-0.006013,
+ -0.951042,0.309012,0.005552,0.03939,0.061245,-0.006167,
+ -0.982272,0.187378,0.005552,0.038849,0.059135,-0.006167,
+ -0.979836,0.186914,0.070606,0.03885,0.059135,-0.006013,
+ -0.966166,0.248069,0.070606,0.039088,0.060198,-0.006013,
+ -0.982272,0.187378,0.005552,0.038849,0.059135,-0.006167,
+ -0.966166,0.248069,0.070606,0.039088,0.060198,-0.006013,
+ -0.968568,0.248686,0.005552,0.039087,0.060198,-0.006167,
+ -0.992099,0.125331,0.005552,0.038678,0.058059,-0.006167,
+ -0.989639,0.12502,0.070606,0.03868,0.058059,-0.006013,
+ -0.979836,0.186914,0.070606,0.03885,0.059135,-0.006013,
+ -0.992099,0.125331,0.005552,0.038678,0.058059,-0.006167,
+ -0.979836,0.186914,0.070606,0.03885,0.059135,-0.006013,
+ -0.982272,0.187378,0.005552,0.038849,0.059135,-0.006167,
+ -0.997287,0.07324,0.007402,0.038576,0.056974,-0.006167,
+ -0.995536,0.062634,0.070606,0.038577,0.056974,-0.006013,
+ -0.989639,0.12502,0.070606,0.03868,0.058059,-0.006013,
+ -0.997287,0.07324,0.007402,0.038576,0.056974,-0.006167,
+ -0.989639,0.12502,0.070606,0.03868,0.058059,-0.006013,
+ -0.992099,0.125331,0.005552,0.038678,0.058059,-0.006167,
+ -0.999938,0,0.011104,0.038542,0.055885,-0.006167,
+ -0.997504,0,0.070606,0.038543,0.055885,-0.006013,
+ -0.995536,0.062634,0.070606,0.038577,0.056974,-0.006013,
+ -0.999938,0,0.011104,0.038542,0.055885,-0.006167,
+ -0.995536,0.062634,0.070606,0.038577,0.056974,-0.006013,
+ -0.997287,0.07324,0.007402,0.038576,0.056974,-0.006167,
+ -0.997287,-0.07324,0.007402,0.038576,0.054796,-0.006167,
+ -0.995536,-0.062634,0.070606,0.038577,0.054796,-0.006013,
+ -0.997504,0,0.070606,0.038543,0.055885,-0.006013,
+ -0.997287,-0.07324,0.007402,0.038576,0.054796,-0.006167,
+ -0.997504,0,0.070606,0.038543,0.055885,-0.006013,
+ -0.999938,0,0.011104,0.038542,0.055885,-0.006167,
+ -0.992099,-0.125331,0.005552,0.038678,0.053712,-0.006167,
+ -0.989639,-0.12502,0.070606,0.03868,0.053712,-0.006013,
+ -0.995536,-0.062634,0.070606,0.038577,0.054796,-0.006013,
+ -0.992099,-0.125331,0.005552,0.038678,0.053712,-0.006167,
+ -0.995536,-0.062634,0.070606,0.038577,0.054796,-0.006013,
+ -0.997287,-0.07324,0.007402,0.038576,0.054796,-0.006167,
+ -0.982272,-0.187378,0.005552,0.038849,0.052635,-0.006167,
+ -0.979836,-0.186914,0.070606,0.03885,0.052636,-0.006013,
+ -0.989639,-0.12502,0.070606,0.03868,0.053712,-0.006013,
+ -0.982272,-0.187378,0.005552,0.038849,0.052635,-0.006167,
+ -0.989639,-0.12502,0.070606,0.03868,0.053712,-0.006013,
+ -0.992099,-0.125331,0.005552,0.038678,0.053712,-0.006167,
+ -0.968568,-0.248686,0.005552,0.039087,0.051572,-0.006167,
+ -0.966166,-0.248069,0.070606,0.039088,0.051572,-0.006013,
+ -0.979836,-0.186914,0.070606,0.03885,0.052636,-0.006013,
+ -0.968568,-0.248686,0.005552,0.039087,0.051572,-0.006167,
+ -0.979836,-0.186914,0.070606,0.03885,0.052636,-0.006013,
+ -0.982272,-0.187378,0.005552,0.038849,0.052635,-0.006167,
+ -0.951042,-0.309012,0.005552,0.03939,0.050526,-0.006167,
+ -0.948683,-0.308246,0.070606,0.039392,0.050526,-0.006013,
+ -0.966166,-0.248069,0.070606,0.039088,0.051572,-0.006013,
+ -0.951042,-0.309012,0.005552,0.03939,0.050526,-0.006167,
+ -0.966166,-0.248069,0.070606,0.039088,0.051572,-0.006013,
+ -0.968568,-0.248686,0.005552,0.039087,0.051572,-0.006167,
+ -0.929762,-0.368119,0.005552,0.03976,0.049501,-0.006167,
+ -0.927456,-0.367206,0.070606,0.039761,0.049501,-0.006013,
+ -0.948683,-0.308246,0.070606,0.039392,0.050526,-0.006013,
+ -0.929762,-0.368119,0.005552,0.03976,0.049501,-0.006167,
+ -0.948683,-0.308246,0.070606,0.039392,0.050526,-0.006013,
+ -0.951042,-0.309012,0.005552,0.03939,0.050526,-0.006167,
+ -0.927456,-0.367206,0.070606,0.039761,0.049501,-0.006013,
+ -0.913082,-0.361515,0.18865,0.03978,0.049509,-0.005861,
+ -0.93398,-0.303468,0.18865,0.039411,0.050532,-0.005861,
+ -0.927456,-0.367206,0.070606,0.039761,0.049501,-0.006013,
+ -0.93398,-0.303468,0.18865,0.039411,0.050532,-0.005861,
+ -0.948683,-0.308246,0.070606,0.039392,0.050526,-0.006013,
+ -0.902569,-0.424717,0.070606,0.040194,0.048502,-0.006013,
+ -0.88858,-0.418134,0.18865,0.040212,0.04851,-0.005861,
+ -0.913082,-0.361515,0.18865,0.03978,0.049509,-0.005861,
+ -0.902569,-0.424717,0.070606,0.040194,0.048502,-0.006013,
+ -0.913082,-0.361515,0.18865,0.03978,0.049509,-0.005861,
+ -0.927456,-0.367206,0.070606,0.039761,0.049501,-0.006013,
+ -0.87412,-0.480551,0.070606,0.040688,0.047531,-0.006013,
+ -0.860572,-0.473103,0.18865,0.040706,0.04754,-0.005861,
+ -0.88858,-0.418134,0.18865,0.040212,0.04851,-0.005861,
+ -0.87412,-0.480551,0.070606,0.040688,0.047531,-0.006013,
+ -0.88858,-0.418134,0.18865,0.040212,0.04851,-0.005861,
+ -0.902569,-0.424717,0.070606,0.040194,0.048502,-0.006013,
+ -0.842221,-0.53449,0.070606,0.041243,0.046593,-0.006013,
+ -0.829167,-0.526206,0.18865,0.04126,0.046604,-0.005861,
+ -0.860572,-0.473103,0.18865,0.040706,0.04754,-0.005861,
+ -0.842221,-0.53449,0.070606,0.041243,0.046593,-0.006013,
+ -0.860572,-0.473103,0.18865,0.040706,0.04754,-0.005861,
+ -0.87412,-0.480551,0.070606,0.040688,0.047531,-0.006013,
+ -0.806998,-0.586318,0.070606,0.041855,0.045692,-0.006013,
+ -0.794491,-0.577231,0.18865,0.041871,0.045704,-0.005861,
+ -0.829167,-0.526206,0.18865,0.04126,0.046604,-0.005861,
+ -0.806998,-0.586318,0.070606,0.041855,0.045692,-0.006013,
+ -0.829167,-0.526206,0.18865,0.04126,0.046604,-0.005861,
+ -0.842221,-0.53449,0.070606,0.041243,0.046593,-0.006013,
+ -0.76859,-0.635833,0.070606,0.042523,0.044831,-0.006013,
+ -0.756678,-0.625979,0.18865,0.042538,0.044844,-0.005861,
+ -0.794491,-0.577231,0.18865,0.041871,0.045704,-0.005861,
+ -0.76859,-0.635833,0.070606,0.042523,0.044831,-0.006013,
+ -0.794491,-0.577231,0.18865,0.041871,0.045704,-0.005861,
+ -0.806998,-0.586318,0.070606,0.041855,0.045692,-0.006013,
+ -0.727149,-0.682839,0.070606,0.043243,0.044014,-0.006013,
+ -0.715879,-0.672256,0.18865,0.043258,0.044028,-0.005861,
+ -0.756678,-0.625979,0.18865,0.042538,0.044844,-0.005861,
+ -0.727149,-0.682839,0.070606,0.043243,0.044014,-0.006013,
+ -0.756678,-0.625979,0.18865,0.042538,0.044844,-0.005861,
+ -0.76859,-0.635833,0.070606,0.042523,0.044831,-0.006013,
+ -0.682839,-0.727149,0.070606,0.044014,0.043243,-0.006013,
+ -0.672256,-0.715879,0.18865,0.044028,0.043258,-0.005861,
+ -0.715879,-0.672256,0.18865,0.043258,0.044028,-0.005861,
+ -0.682839,-0.727149,0.070606,0.044014,0.043243,-0.006013,
+ -0.715879,-0.672256,0.18865,0.043258,0.044028,-0.005861,
+ -0.727149,-0.682839,0.070606,0.043243,0.044014,-0.006013,
+ -0.635833,-0.76859,0.070606,0.044831,0.042523,-0.006013,
+ -0.625979,-0.756678,0.18865,0.044844,0.042538,-0.005861,
+ -0.672256,-0.715879,0.18865,0.044028,0.043258,-0.005861,
+ -0.635833,-0.76859,0.070606,0.044831,0.042523,-0.006013,
+ -0.672256,-0.715879,0.18865,0.044028,0.043258,-0.005861,
+ -0.682839,-0.727149,0.070606,0.044014,0.043243,-0.006013,
+ -0.586318,-0.806998,0.070606,0.045692,0.041855,-0.006013,
+ -0.577231,-0.794491,0.18865,0.045704,0.041871,-0.005861,
+ -0.625979,-0.756678,0.18865,0.044844,0.042538,-0.005861,
+ -0.586318,-0.806998,0.070606,0.045692,0.041855,-0.006013,
+ -0.625979,-0.756678,0.18865,0.044844,0.042538,-0.005861,
+ -0.635833,-0.76859,0.070606,0.044831,0.042523,-0.006013,
+ -0.53449,-0.842221,0.070606,0.046593,0.041243,-0.006013,
+ -0.526206,-0.829167,0.18865,0.046604,0.04126,-0.005861,
+ -0.577231,-0.794491,0.18865,0.045704,0.041871,-0.005861,
+ -0.53449,-0.842221,0.070606,0.046593,0.041243,-0.006013,
+ -0.577231,-0.794491,0.18865,0.045704,0.041871,-0.005861,
+ -0.586318,-0.806998,0.070606,0.045692,0.041855,-0.006013,
+ -0.480551,-0.87412,0.070606,0.047531,0.040688,-0.006013,
+ -0.473103,-0.860572,0.18865,0.04754,0.040706,-0.005861,
+ -0.526206,-0.829167,0.18865,0.046604,0.04126,-0.005861,
+ -0.480551,-0.87412,0.070606,0.047531,0.040688,-0.006013,
+ -0.526206,-0.829167,0.18865,0.046604,0.04126,-0.005861,
+ -0.53449,-0.842221,0.070606,0.046593,0.041243,-0.006013,
+ -0.424717,-0.902569,0.070606,0.048502,0.040194,-0.006013,
+ -0.418134,-0.88858,0.18865,0.04851,0.040212,-0.005861,
+ -0.473103,-0.860572,0.18865,0.04754,0.040706,-0.005861,
+ -0.424717,-0.902569,0.070606,0.048502,0.040194,-0.006013,
+ -0.473103,-0.860572,0.18865,0.04754,0.040706,-0.005861,
+ -0.480551,-0.87412,0.070606,0.047531,0.040688,-0.006013,
+ -0.367206,-0.927456,0.070606,0.049501,0.039761,-0.006013,
+ -0.361515,-0.913082,0.18865,0.049509,0.03978,-0.005861,
+ -0.418134,-0.88858,0.18865,0.04851,0.040212,-0.005861,
+ -0.367206,-0.927456,0.070606,0.049501,0.039761,-0.006013,
+ -0.418134,-0.88858,0.18865,0.04851,0.040212,-0.005861,
+ -0.424717,-0.902569,0.070606,0.048502,0.040194,-0.006013,
+ -0.308246,-0.948683,0.070606,0.050526,0.039392,-0.006013,
+ -0.303468,-0.93398,0.18865,0.050532,0.039411,-0.005861,
+ -0.361515,-0.913082,0.18865,0.049509,0.03978,-0.005861,
+ -0.308246,-0.948683,0.070606,0.050526,0.039392,-0.006013,
+ -0.361515,-0.913082,0.18865,0.049509,0.03978,-0.005861,
+ -0.367206,-0.927456,0.070606,0.049501,0.039761,-0.006013,
+ -0.248069,-0.966166,0.070606,0.051572,0.039088,-0.006013,
+ -0.244224,-0.951192,0.18865,0.051578,0.039107,-0.005861,
+ -0.303468,-0.93398,0.18865,0.050532,0.039411,-0.005861,
+ -0.248069,-0.966166,0.070606,0.051572,0.039088,-0.006013,
+ -0.303468,-0.93398,0.18865,0.050532,0.039411,-0.005861,
+ -0.308246,-0.948683,0.070606,0.050526,0.039392,-0.006013,
+ -0.186914,-0.979836,0.070606,0.052636,0.03885,-0.006013,
+ -0.184017,-0.96465,0.18865,0.05264,0.03887,-0.005861,
+ -0.244224,-0.951192,0.18865,0.051578,0.039107,-0.005861,
+ -0.186914,-0.979836,0.070606,0.052636,0.03885,-0.006013,
+ -0.244224,-0.951192,0.18865,0.051578,0.039107,-0.005861,
+ -0.248069,-0.966166,0.070606,0.051572,0.039088,-0.006013,
+ -0.12502,-0.989639,0.070606,0.053712,0.03868,-0.006013,
+ -0.123083,-0.974301,0.18865,0.053714,0.0387,-0.005861,
+ -0.184017,-0.96465,0.18865,0.05264,0.03887,-0.005861,
+ -0.12502,-0.989639,0.070606,0.053712,0.03868,-0.006013,
+ -0.184017,-0.96465,0.18865,0.05264,0.03887,-0.005861,
+ -0.186914,-0.979836,0.070606,0.052636,0.03885,-0.006013,
+ -0.062634,-0.995536,0.070606,0.054796,0.038577,-0.006013,
+ -0.061663,-0.980106,0.18865,0.054798,0.038597,-0.005861,
+ -0.123083,-0.974301,0.18865,0.053714,0.0387,-0.005861,
+ -0.062634,-0.995536,0.070606,0.054796,0.038577,-0.006013,
+ -0.123083,-0.974301,0.18865,0.053714,0.0387,-0.005861,
+ -0.12502,-0.989639,0.070606,0.053712,0.03868,-0.006013,
+ 0,-0.997504,0.070606,0.055885,0.038543,-0.006013,
+ 0,-0.982044,0.18865,0.055885,0.038563,-0.005861,
+ -0.061663,-0.980106,0.18865,0.054798,0.038597,-0.005861,
+ 0,-0.997504,0.070606,0.055885,0.038543,-0.006013,
+ -0.061663,-0.980106,0.18865,0.054798,0.038597,-0.005861,
+ -0.062634,-0.995536,0.070606,0.054796,0.038577,-0.006013,
+ 0.062634,-0.995536,0.070606,0.056974,0.038577,-0.006013,
+ 0.061663,-0.980106,0.18865,0.056973,0.038597,-0.005861,
+ 0,-0.982044,0.18865,0.055885,0.038563,-0.005861,
+ 0.062634,-0.995536,0.070606,0.056974,0.038577,-0.006013,
+ 0,-0.982044,0.18865,0.055885,0.038563,-0.005861,
+ 0,-0.997504,0.070606,0.055885,0.038543,-0.006013,
+ 0.12502,-0.989639,0.070606,0.058059,0.03868,-0.006013,
+ 0.123083,-0.974301,0.18865,0.058056,0.0387,-0.005861,
+ 0.061663,-0.980106,0.18865,0.056973,0.038597,-0.005861,
+ 0.12502,-0.989639,0.070606,0.058059,0.03868,-0.006013,
+ 0.061663,-0.980106,0.18865,0.056973,0.038597,-0.005861,
+ 0.062634,-0.995536,0.070606,0.056974,0.038577,-0.006013,
+ 0.186914,-0.979836,0.070606,0.059135,0.03885,-0.006013,
+ 0.184017,-0.96465,0.18865,0.059131,0.03887,-0.005861,
+ 0.123083,-0.974301,0.18865,0.058056,0.0387,-0.005861,
+ 0.186914,-0.979836,0.070606,0.059135,0.03885,-0.006013,
+ 0.123083,-0.974301,0.18865,0.058056,0.0387,-0.005861,
+ 0.12502,-0.989639,0.070606,0.058059,0.03868,-0.006013,
+ 0.248069,-0.966166,0.070606,0.060198,0.039088,-0.006013,
+ 0.244224,-0.951192,0.18865,0.060193,0.039107,-0.005861,
+ 0.184017,-0.96465,0.18865,0.059131,0.03887,-0.005861,
+ 0.248069,-0.966166,0.070606,0.060198,0.039088,-0.006013,
+ 0.184017,-0.96465,0.18865,0.059131,0.03887,-0.005861,
+ 0.186914,-0.979836,0.070606,0.059135,0.03885,-0.006013,
+ 0.308246,-0.948683,0.070606,0.061244,0.039392,-0.006013,
+ 0.303468,-0.93398,0.18865,0.061238,0.039411,-0.005861,
+ 0.244224,-0.951192,0.18865,0.060193,0.039107,-0.005861,
+ 0.308246,-0.948683,0.070606,0.061244,0.039392,-0.006013,
+ 0.244224,-0.951192,0.18865,0.060193,0.039107,-0.005861,
+ 0.248069,-0.966166,0.070606,0.060198,0.039088,-0.006013,
+ 0.367206,-0.927456,0.070606,0.062269,0.039761,-0.006013,
+ 0.361515,-0.913082,0.18865,0.062262,0.03978,-0.005861,
+ 0.303468,-0.93398,0.18865,0.061238,0.039411,-0.005861,
+ 0.367206,-0.927456,0.070606,0.062269,0.039761,-0.006013,
+ 0.303468,-0.93398,0.18865,0.061238,0.039411,-0.005861,
+ 0.308246,-0.948683,0.070606,0.061244,0.039392,-0.006013,
+ 0.424717,-0.902569,0.070606,0.063269,0.040194,-0.006013,
+ 0.418134,-0.88858,0.18865,0.063261,0.040212,-0.005861,
+ 0.361515,-0.913082,0.18865,0.062262,0.03978,-0.005861,
+ 0.424717,-0.902569,0.070606,0.063269,0.040194,-0.006013,
+ 0.361515,-0.913082,0.18865,0.062262,0.03978,-0.005861,
+ 0.367206,-0.927456,0.070606,0.062269,0.039761,-0.006013,
+ 0.480551,-0.87412,0.070606,0.06424,0.040688,-0.006013,
+ 0.473103,-0.860572,0.18865,0.06423,0.040706,-0.005861,
+ 0.418134,-0.88858,0.18865,0.063261,0.040212,-0.005861,
+ 0.480551,-0.87412,0.070606,0.06424,0.040688,-0.006013,
+ 0.418134,-0.88858,0.18865,0.063261,0.040212,-0.005861,
+ 0.424717,-0.902569,0.070606,0.063269,0.040194,-0.006013,
+ 0.53449,-0.842221,0.070606,0.065178,0.041243,-0.006013,
+ 0.526206,-0.829167,0.18865,0.065167,0.04126,-0.005861,
+ 0.473103,-0.860572,0.18865,0.06423,0.040706,-0.005861,
+ 0.53449,-0.842221,0.070606,0.065178,0.041243,-0.006013,
+ 0.473103,-0.860572,0.18865,0.06423,0.040706,-0.005861,
+ 0.480551,-0.87412,0.070606,0.06424,0.040688,-0.006013,
+ 0.586318,-0.806998,0.070606,0.066079,0.041855,-0.006013,
+ 0.577231,-0.794491,0.18865,0.066067,0.041871,-0.005861,
+ 0.526206,-0.829167,0.18865,0.065167,0.04126,-0.005861,
+ 0.586318,-0.806998,0.070606,0.066079,0.041855,-0.006013,
+ 0.526206,-0.829167,0.18865,0.065167,0.04126,-0.005861,
+ 0.53449,-0.842221,0.070606,0.065178,0.041243,-0.006013,
+ 0.635833,-0.76859,0.070606,0.06694,0.042523,-0.006013,
+ 0.625979,-0.756678,0.18865,0.066927,0.042538,-0.005861,
+ 0.577231,-0.794491,0.18865,0.066067,0.041871,-0.005861,
+ 0.635833,-0.76859,0.070606,0.06694,0.042523,-0.006013,
+ 0.577231,-0.794491,0.18865,0.066067,0.041871,-0.005861,
+ 0.586318,-0.806998,0.070606,0.066079,0.041855,-0.006013,
+ 0.682839,-0.727149,0.070606,0.067757,0.043243,-0.006013,
+ 0.672256,-0.715879,0.18865,0.067743,0.043258,-0.005861,
+ 0.625979,-0.756678,0.18865,0.066927,0.042538,-0.005861,
+ 0.682839,-0.727149,0.070606,0.067757,0.043243,-0.006013,
+ 0.625979,-0.756678,0.18865,0.066927,0.042538,-0.005861,
+ 0.635833,-0.76859,0.070606,0.06694,0.042523,-0.006013,
+ 0.727149,-0.682839,0.070606,0.068527,0.044014,-0.006013,
+ 0.715879,-0.672256,0.18865,0.068512,0.044028,-0.005861,
+ 0.672256,-0.715879,0.18865,0.067743,0.043258,-0.005861,
+ 0.727149,-0.682839,0.070606,0.068527,0.044014,-0.006013,
+ 0.672256,-0.715879,0.18865,0.067743,0.043258,-0.005861,
+ 0.682839,-0.727149,0.070606,0.067757,0.043243,-0.006013,
+ 0.76859,-0.635833,0.070606,0.069247,0.044831,-0.006013,
+ 0.756678,-0.625979,0.18865,0.069232,0.044844,-0.005861,
+ 0.715879,-0.672256,0.18865,0.068512,0.044028,-0.005861,
+ 0.76859,-0.635833,0.070606,0.069247,0.044831,-0.006013,
+ 0.715879,-0.672256,0.18865,0.068512,0.044028,-0.005861,
+ 0.727149,-0.682839,0.070606,0.068527,0.044014,-0.006013,
+ 0.806998,-0.586318,0.070606,0.069915,0.045692,-0.006013,
+ 0.794491,-0.577231,0.18865,0.069899,0.045704,-0.005861,
+ 0.756678,-0.625979,0.18865,0.069232,0.044844,-0.005861,
+ 0.806998,-0.586318,0.070606,0.069915,0.045692,-0.006013,
+ 0.756678,-0.625979,0.18865,0.069232,0.044844,-0.005861,
+ 0.76859,-0.635833,0.070606,0.069247,0.044831,-0.006013,
+ 0.842221,-0.53449,0.070606,0.070528,0.046593,-0.006013,
+ 0.829167,-0.526206,0.18865,0.070511,0.046604,-0.005861,
+ 0.794491,-0.577231,0.18865,0.069899,0.045704,-0.005861,
+ 0.842221,-0.53449,0.070606,0.070528,0.046593,-0.006013,
+ 0.794491,-0.577231,0.18865,0.069899,0.045704,-0.005861,
+ 0.806998,-0.586318,0.070606,0.069915,0.045692,-0.006013,
+ 0.87412,-0.480551,0.070606,0.071082,0.047531,-0.006013,
+ 0.860572,-0.473103,0.18865,0.071065,0.04754,-0.005861,
+ 0.829167,-0.526206,0.18865,0.070511,0.046604,-0.005861,
+ 0.87412,-0.480551,0.070606,0.071082,0.047531,-0.006013,
+ 0.829167,-0.526206,0.18865,0.070511,0.046604,-0.005861,
+ 0.842221,-0.53449,0.070606,0.070528,0.046593,-0.006013,
+ 0.902569,-0.424717,0.070606,0.071577,0.048502,-0.006013,
+ 0.88858,-0.418134,0.18865,0.071559,0.04851,-0.005861,
+ 0.860572,-0.473103,0.18865,0.071065,0.04754,-0.005861,
+ 0.902569,-0.424717,0.070606,0.071577,0.048502,-0.006013,
+ 0.860572,-0.473103,0.18865,0.071065,0.04754,-0.005861,
+ 0.87412,-0.480551,0.070606,0.071082,0.047531,-0.006013,
+ 0.927456,-0.367206,0.070606,0.07201,0.049501,-0.006013,
+ 0.913082,-0.361515,0.18865,0.071991,0.049509,-0.005861,
+ 0.88858,-0.418134,0.18865,0.071559,0.04851,-0.005861,
+ 0.927456,-0.367206,0.070606,0.07201,0.049501,-0.006013,
+ 0.88858,-0.418134,0.18865,0.071559,0.04851,-0.005861,
+ 0.902569,-0.424717,0.070606,0.071577,0.048502,-0.006013,
+ 0.948683,-0.308246,0.070606,0.072379,0.050526,-0.006013,
+ 0.93398,-0.303468,0.18865,0.07236,0.050532,-0.005861,
+ 0.913082,-0.361515,0.18865,0.071991,0.049509,-0.005861,
+ 0.948683,-0.308246,0.070606,0.072379,0.050526,-0.006013,
+ 0.913082,-0.361515,0.18865,0.071991,0.049509,-0.005861,
+ 0.927456,-0.367206,0.070606,0.07201,0.049501,-0.006013,
+ 0.966166,-0.248069,0.070606,0.072682,0.051572,-0.006013,
+ 0.951192,-0.244224,0.18865,0.072663,0.051578,-0.005861,
+ 0.93398,-0.303468,0.18865,0.07236,0.050532,-0.005861,
+ 0.966166,-0.248069,0.070606,0.072682,0.051572,-0.006013,
+ 0.93398,-0.303468,0.18865,0.07236,0.050532,-0.005861,
+ 0.948683,-0.308246,0.070606,0.072379,0.050526,-0.006013,
+ 0.979836,-0.186914,0.070606,0.07292,0.052636,-0.006013,
+ 0.96465,-0.184017,0.18865,0.072901,0.05264,-0.005861,
+ 0.951192,-0.244224,0.18865,0.072663,0.051578,-0.005861,
+ 0.979836,-0.186914,0.070606,0.07292,0.052636,-0.006013,
+ 0.951192,-0.244224,0.18865,0.072663,0.051578,-0.005861,
+ 0.966166,-0.248069,0.070606,0.072682,0.051572,-0.006013,
+ 0.989639,-0.12502,0.070606,0.073091,0.053712,-0.006013,
+ 0.974301,-0.123083,0.18865,0.073071,0.053714,-0.005861,
+ 0.96465,-0.184017,0.18865,0.072901,0.05264,-0.005861,
+ 0.989639,-0.12502,0.070606,0.073091,0.053712,-0.006013,
+ 0.96465,-0.184017,0.18865,0.072901,0.05264,-0.005861,
+ 0.979836,-0.186914,0.070606,0.07292,0.052636,-0.006013,
+ 0.995536,-0.062634,0.070606,0.073193,0.054796,-0.006013,
+ 0.980106,-0.061663,0.18865,0.073173,0.054798,-0.005861,
+ 0.974301,-0.123083,0.18865,0.073071,0.053714,-0.005861,
+ 0.995536,-0.062634,0.070606,0.073193,0.054796,-0.006013,
+ 0.974301,-0.123083,0.18865,0.073071,0.053714,-0.005861,
+ 0.989639,-0.12502,0.070606,0.073091,0.053712,-0.006013,
+ 0.997504,0,0.070606,0.073227,0.055885,-0.006013,
+ 0.982044,0,0.18865,0.073207,0.055885,-0.005861,
+ 0.980106,-0.061663,0.18865,0.073173,0.054798,-0.005861,
+ 0.997504,0,0.070606,0.073227,0.055885,-0.006013,
+ 0.980106,-0.061663,0.18865,0.073173,0.054798,-0.005861,
+ 0.995536,-0.062634,0.070606,0.073193,0.054796,-0.006013,
+ 0.995536,0.062634,0.070606,0.073193,0.056974,-0.006013,
+ 0.980106,0.061663,0.18865,0.073173,0.056973,-0.005861,
+ 0.982044,0,0.18865,0.073207,0.055885,-0.005861,
+ 0.995536,0.062634,0.070606,0.073193,0.056974,-0.006013,
+ 0.982044,0,0.18865,0.073207,0.055885,-0.005861,
+ 0.997504,0,0.070606,0.073227,0.055885,-0.006013,
+ 0.989639,0.12502,0.070606,0.073091,0.058059,-0.006013,
+ 0.974301,0.123083,0.18865,0.073071,0.058056,-0.005861,
+ 0.980106,0.061663,0.18865,0.073173,0.056973,-0.005861,
+ 0.989639,0.12502,0.070606,0.073091,0.058059,-0.006013,
+ 0.980106,0.061663,0.18865,0.073173,0.056973,-0.005861,
+ 0.995536,0.062634,0.070606,0.073193,0.056974,-0.006013,
+ 0.979836,0.186914,0.070606,0.07292,0.059135,-0.006013,
+ 0.96465,0.184017,0.18865,0.072901,0.059131,-0.005861,
+ 0.974301,0.123083,0.18865,0.073071,0.058056,-0.005861,
+ 0.979836,0.186914,0.070606,0.07292,0.059135,-0.006013,
+ 0.974301,0.123083,0.18865,0.073071,0.058056,-0.005861,
+ 0.989639,0.12502,0.070606,0.073091,0.058059,-0.006013,
+ 0.966166,0.248069,0.070606,0.072682,0.060198,-0.006013,
+ 0.951192,0.244224,0.18865,0.072663,0.060193,-0.005861,
+ 0.96465,0.184017,0.18865,0.072901,0.059131,-0.005861,
+ 0.966166,0.248069,0.070606,0.072682,0.060198,-0.006013,
+ 0.96465,0.184017,0.18865,0.072901,0.059131,-0.005861,
+ 0.979836,0.186914,0.070606,0.07292,0.059135,-0.006013,
+ 0.948683,0.308246,0.070606,0.072379,0.061244,-0.006013,
+ 0.93398,0.303468,0.18865,0.07236,0.061238,-0.005861,
+ 0.951192,0.244224,0.18865,0.072663,0.060193,-0.005861,
+ 0.948683,0.308246,0.070606,0.072379,0.061244,-0.006013,
+ 0.951192,0.244224,0.18865,0.072663,0.060193,-0.005861,
+ 0.966166,0.248069,0.070606,0.072682,0.060198,-0.006013,
+ 0.927456,0.367206,0.070606,0.07201,0.062269,-0.006013,
+ 0.913082,0.361515,0.18865,0.071991,0.062262,-0.005861,
+ 0.93398,0.303468,0.18865,0.07236,0.061238,-0.005861,
+ 0.927456,0.367206,0.070606,0.07201,0.062269,-0.006013,
+ 0.93398,0.303468,0.18865,0.07236,0.061238,-0.005861,
+ 0.948683,0.308246,0.070606,0.072379,0.061244,-0.006013,
+ 0.902569,0.424717,0.070606,0.071577,0.063269,-0.006013,
+ 0.88858,0.418134,0.18865,0.071559,0.063261,-0.005861,
+ 0.913082,0.361515,0.18865,0.071991,0.062262,-0.005861,
+ 0.902569,0.424717,0.070606,0.071577,0.063269,-0.006013,
+ 0.913082,0.361515,0.18865,0.071991,0.062262,-0.005861,
+ 0.927456,0.367206,0.070606,0.07201,0.062269,-0.006013,
+ 0.87412,0.480551,0.070606,0.071082,0.06424,-0.006013,
+ 0.860572,0.473103,0.18865,0.071065,0.06423,-0.005861,
+ 0.88858,0.418134,0.18865,0.071559,0.063261,-0.005861,
+ 0.87412,0.480551,0.070606,0.071082,0.06424,-0.006013,
+ 0.88858,0.418134,0.18865,0.071559,0.063261,-0.005861,
+ 0.902569,0.424717,0.070606,0.071577,0.063269,-0.006013,
+ 0.842221,0.53449,0.070606,0.070528,0.065178,-0.006013,
+ 0.829167,0.526206,0.18865,0.070511,0.065167,-0.005861,
+ 0.860572,0.473103,0.18865,0.071065,0.06423,-0.005861,
+ 0.842221,0.53449,0.070606,0.070528,0.065178,-0.006013,
+ 0.860572,0.473103,0.18865,0.071065,0.06423,-0.005861,
+ 0.87412,0.480551,0.070606,0.071082,0.06424,-0.006013,
+ 0.806998,0.586318,0.070606,0.069915,0.066079,-0.006013,
+ 0.794491,0.577231,0.18865,0.069899,0.066067,-0.005861,
+ 0.829167,0.526206,0.18865,0.070511,0.065167,-0.005861,
+ 0.806998,0.586318,0.070606,0.069915,0.066079,-0.006013,
+ 0.829167,0.526206,0.18865,0.070511,0.065167,-0.005861,
+ 0.842221,0.53449,0.070606,0.070528,0.065178,-0.006013,
+ 0.76859,0.635833,0.070606,0.069247,0.06694,-0.006013,
+ 0.756678,0.625979,0.18865,0.069232,0.066927,-0.005861,
+ 0.794491,0.577231,0.18865,0.069899,0.066067,-0.005861,
+ 0.76859,0.635833,0.070606,0.069247,0.06694,-0.006013,
+ 0.794491,0.577231,0.18865,0.069899,0.066067,-0.005861,
+ 0.806998,0.586318,0.070606,0.069915,0.066079,-0.006013,
+ 0.727149,0.682839,0.070606,0.068527,0.067757,-0.006013,
+ 0.715879,0.672256,0.18865,0.068512,0.067743,-0.005861,
+ 0.756678,0.625979,0.18865,0.069232,0.066927,-0.005861,
+ 0.727149,0.682839,0.070606,0.068527,0.067757,-0.006013,
+ 0.756678,0.625979,0.18865,0.069232,0.066927,-0.005861,
+ 0.76859,0.635833,0.070606,0.069247,0.06694,-0.006013,
+ 0.682839,0.727149,0.070606,0.067757,0.068527,-0.006013,
+ 0.672256,0.715879,0.18865,0.067743,0.068512,-0.005861,
+ 0.715879,0.672256,0.18865,0.068512,0.067743,-0.005861,
+ 0.682839,0.727149,0.070606,0.067757,0.068527,-0.006013,
+ 0.715879,0.672256,0.18865,0.068512,0.067743,-0.005861,
+ 0.727149,0.682839,0.070606,0.068527,0.067757,-0.006013,
+ 0.635833,0.76859,0.070606,0.06694,0.069247,-0.006013,
+ 0.625979,0.756678,0.18865,0.066927,0.069232,-0.005861,
+ 0.672256,0.715879,0.18865,0.067743,0.068512,-0.005861,
+ 0.635833,0.76859,0.070606,0.06694,0.069247,-0.006013,
+ 0.672256,0.715879,0.18865,0.067743,0.068512,-0.005861,
+ 0.682839,0.727149,0.070606,0.067757,0.068527,-0.006013,
+ 0.586318,0.806998,0.070606,0.066079,0.069915,-0.006013,
+ 0.577231,0.794491,0.18865,0.066067,0.069899,-0.005861,
+ 0.625979,0.756678,0.18865,0.066927,0.069232,-0.005861,
+ 0.586318,0.806998,0.070606,0.066079,0.069915,-0.006013,
+ 0.625979,0.756678,0.18865,0.066927,0.069232,-0.005861,
+ 0.635833,0.76859,0.070606,0.06694,0.069247,-0.006013,
+ 0.53449,0.842221,0.070606,0.065178,0.070528,-0.006013,
+ 0.526206,0.829167,0.18865,0.065167,0.070511,-0.005861,
+ 0.577231,0.794491,0.18865,0.066067,0.069899,-0.005861,
+ 0.53449,0.842221,0.070606,0.065178,0.070528,-0.006013,
+ 0.577231,0.794491,0.18865,0.066067,0.069899,-0.005861,
+ 0.586318,0.806998,0.070606,0.066079,0.069915,-0.006013,
+ 0.480551,0.87412,0.070606,0.06424,0.071082,-0.006013,
+ 0.473103,0.860572,0.18865,0.06423,0.071065,-0.005861,
+ 0.526206,0.829167,0.18865,0.065167,0.070511,-0.005861,
+ 0.480551,0.87412,0.070606,0.06424,0.071082,-0.006013,
+ 0.526206,0.829167,0.18865,0.065167,0.070511,-0.005861,
+ 0.53449,0.842221,0.070606,0.065178,0.070528,-0.006013,
+ 0.424717,0.902569,0.070606,0.063269,0.071577,-0.006013,
+ 0.418134,0.88858,0.18865,0.063261,0.071559,-0.005861,
+ 0.473103,0.860572,0.18865,0.06423,0.071065,-0.005861,
+ 0.424717,0.902569,0.070606,0.063269,0.071577,-0.006013,
+ 0.473103,0.860572,0.18865,0.06423,0.071065,-0.005861,
+ 0.480551,0.87412,0.070606,0.06424,0.071082,-0.006013,
+ 0.367206,0.927456,0.070606,0.062269,0.07201,-0.006013,
+ 0.361515,0.913082,0.18865,0.062262,0.071991,-0.005861,
+ 0.418134,0.88858,0.18865,0.063261,0.071559,-0.005861,
+ 0.367206,0.927456,0.070606,0.062269,0.07201,-0.006013,
+ 0.418134,0.88858,0.18865,0.063261,0.071559,-0.005861,
+ 0.424717,0.902569,0.070606,0.063269,0.071577,-0.006013,
+ 0.308246,0.948683,0.070606,0.061244,0.072379,-0.006013,
+ 0.303468,0.93398,0.18865,0.061238,0.07236,-0.005861,
+ 0.361515,0.913082,0.18865,0.062262,0.071991,-0.005861,
+ 0.308246,0.948683,0.070606,0.061244,0.072379,-0.006013,
+ 0.361515,0.913082,0.18865,0.062262,0.071991,-0.005861,
+ 0.367206,0.927456,0.070606,0.062269,0.07201,-0.006013,
+ 0.248069,0.966166,0.070606,0.060198,0.072682,-0.006013,
+ 0.244224,0.951192,0.18865,0.060193,0.072663,-0.005861,
+ 0.303468,0.93398,0.18865,0.061238,0.07236,-0.005861,
+ 0.248069,0.966166,0.070606,0.060198,0.072682,-0.006013,
+ 0.303468,0.93398,0.18865,0.061238,0.07236,-0.005861,
+ 0.308246,0.948683,0.070606,0.061244,0.072379,-0.006013,
+ 0.186914,0.979836,0.070606,0.059135,0.07292,-0.006013,
+ 0.184017,0.96465,0.18865,0.059131,0.072901,-0.005861,
+ 0.244224,0.951192,0.18865,0.060193,0.072663,-0.005861,
+ 0.186914,0.979836,0.070606,0.059135,0.07292,-0.006013,
+ 0.244224,0.951192,0.18865,0.060193,0.072663,-0.005861,
+ 0.248069,0.966166,0.070606,0.060198,0.072682,-0.006013,
+ 0.12502,0.989639,0.070606,0.058059,0.073091,-0.006013,
+ 0.123083,0.974301,0.18865,0.058056,0.073071,-0.005861,
+ 0.184017,0.96465,0.18865,0.059131,0.072901,-0.005861,
+ 0.12502,0.989639,0.070606,0.058059,0.073091,-0.006013,
+ 0.184017,0.96465,0.18865,0.059131,0.072901,-0.005861,
+ 0.186914,0.979836,0.070606,0.059135,0.07292,-0.006013,
+ 0.062634,0.995536,0.070606,0.056974,0.073193,-0.006013,
+ 0.061663,0.980106,0.18865,0.056973,0.073173,-0.005861,
+ 0.123083,0.974301,0.18865,0.058056,0.073071,-0.005861,
+ 0.062634,0.995536,0.070606,0.056974,0.073193,-0.006013,
+ 0.123083,0.974301,0.18865,0.058056,0.073071,-0.005861,
+ 0.12502,0.989639,0.070606,0.058059,0.073091,-0.006013,
+ 0,0.997504,0.070606,0.055885,0.073227,-0.006013,
+ 0,0.982044,0.18865,0.055885,0.073207,-0.005861,
+ 0.061663,0.980106,0.18865,0.056973,0.073173,-0.005861,
+ 0,0.997504,0.070606,0.055885,0.073227,-0.006013,
+ 0.061663,0.980106,0.18865,0.056973,0.073173,-0.005861,
+ 0.062634,0.995536,0.070606,0.056974,0.073193,-0.006013,
+ -0.062634,0.995536,0.070606,0.054796,0.073193,-0.006013,
+ -0.061663,0.980106,0.18865,0.054798,0.073173,-0.005861,
+ 0,0.982044,0.18865,0.055885,0.073207,-0.005861,
+ -0.062634,0.995536,0.070606,0.054796,0.073193,-0.006013,
+ 0,0.982044,0.18865,0.055885,0.073207,-0.005861,
+ 0,0.997504,0.070606,0.055885,0.073227,-0.006013,
+ -0.12502,0.989639,0.070606,0.053712,0.073091,-0.006013,
+ -0.123083,0.974301,0.18865,0.053714,0.073071,-0.005861,
+ -0.061663,0.980106,0.18865,0.054798,0.073173,-0.005861,
+ -0.12502,0.989639,0.070606,0.053712,0.073091,-0.006013,
+ -0.061663,0.980106,0.18865,0.054798,0.073173,-0.005861,
+ -0.062634,0.995536,0.070606,0.054796,0.073193,-0.006013,
+ -0.186914,0.979836,0.070606,0.052636,0.07292,-0.006013,
+ -0.184017,0.96465,0.18865,0.05264,0.072901,-0.005861,
+ -0.123083,0.974301,0.18865,0.053714,0.073071,-0.005861,
+ -0.186914,0.979836,0.070606,0.052636,0.07292,-0.006013,
+ -0.123083,0.974301,0.18865,0.053714,0.073071,-0.005861,
+ -0.12502,0.989639,0.070606,0.053712,0.073091,-0.006013,
+ -0.248069,0.966166,0.070606,0.051572,0.072682,-0.006013,
+ -0.244224,0.951192,0.18865,0.051578,0.072663,-0.005861,
+ -0.184017,0.96465,0.18865,0.05264,0.072901,-0.005861,
+ -0.248069,0.966166,0.070606,0.051572,0.072682,-0.006013,
+ -0.184017,0.96465,0.18865,0.05264,0.072901,-0.005861,
+ -0.186914,0.979836,0.070606,0.052636,0.07292,-0.006013,
+ -0.308246,0.948683,0.070606,0.050526,0.072379,-0.006013,
+ -0.303468,0.93398,0.18865,0.050532,0.07236,-0.005861,
+ -0.244224,0.951192,0.18865,0.051578,0.072663,-0.005861,
+ -0.308246,0.948683,0.070606,0.050526,0.072379,-0.006013,
+ -0.244224,0.951192,0.18865,0.051578,0.072663,-0.005861,
+ -0.248069,0.966166,0.070606,0.051572,0.072682,-0.006013,
+ -0.367206,0.927456,0.070606,0.049501,0.07201,-0.006013,
+ -0.361515,0.913082,0.18865,0.049509,0.071991,-0.005861,
+ -0.303468,0.93398,0.18865,0.050532,0.07236,-0.005861,
+ -0.367206,0.927456,0.070606,0.049501,0.07201,-0.006013,
+ -0.303468,0.93398,0.18865,0.050532,0.07236,-0.005861,
+ -0.308246,0.948683,0.070606,0.050526,0.072379,-0.006013,
+ -0.424717,0.902569,0.070606,0.048502,0.071577,-0.006013,
+ -0.418134,0.88858,0.18865,0.04851,0.071559,-0.005861,
+ -0.361515,0.913082,0.18865,0.049509,0.071991,-0.005861,
+ -0.424717,0.902569,0.070606,0.048502,0.071577,-0.006013,
+ -0.361515,0.913082,0.18865,0.049509,0.071991,-0.005861,
+ -0.367206,0.927456,0.070606,0.049501,0.07201,-0.006013,
+ -0.480551,0.87412,0.070606,0.047531,0.071082,-0.006013,
+ -0.473103,0.860572,0.18865,0.04754,0.071065,-0.005861,
+ -0.418134,0.88858,0.18865,0.04851,0.071559,-0.005861,
+ -0.480551,0.87412,0.070606,0.047531,0.071082,-0.006013,
+ -0.418134,0.88858,0.18865,0.04851,0.071559,-0.005861,
+ -0.424717,0.902569,0.070606,0.048502,0.071577,-0.006013,
+ -0.53449,0.842221,0.070606,0.046593,0.070528,-0.006013,
+ -0.526206,0.829167,0.18865,0.046604,0.070511,-0.005861,
+ -0.473103,0.860572,0.18865,0.04754,0.071065,-0.005861,
+ -0.53449,0.842221,0.070606,0.046593,0.070528,-0.006013,
+ -0.473103,0.860572,0.18865,0.04754,0.071065,-0.005861,
+ -0.480551,0.87412,0.070606,0.047531,0.071082,-0.006013,
+ -0.586318,0.806998,0.070606,0.045692,0.069915,-0.006013,
+ -0.577231,0.794491,0.18865,0.045704,0.069899,-0.005861,
+ -0.526206,0.829167,0.18865,0.046604,0.070511,-0.005861,
+ -0.586318,0.806998,0.070606,0.045692,0.069915,-0.006013,
+ -0.526206,0.829167,0.18865,0.046604,0.070511,-0.005861,
+ -0.53449,0.842221,0.070606,0.046593,0.070528,-0.006013,
+ -0.635833,0.76859,0.070606,0.044831,0.069247,-0.006013,
+ -0.625979,0.756678,0.18865,0.044844,0.069232,-0.005861,
+ -0.577231,0.794491,0.18865,0.045704,0.069899,-0.005861,
+ -0.635833,0.76859,0.070606,0.044831,0.069247,-0.006013,
+ -0.577231,0.794491,0.18865,0.045704,0.069899,-0.005861,
+ -0.586318,0.806998,0.070606,0.045692,0.069915,-0.006013,
+ -0.682839,0.727149,0.070606,0.044014,0.068527,-0.006013,
+ -0.672256,0.715879,0.18865,0.044028,0.068512,-0.005861,
+ -0.625979,0.756678,0.18865,0.044844,0.069232,-0.005861,
+ -0.682839,0.727149,0.070606,0.044014,0.068527,-0.006013,
+ -0.625979,0.756678,0.18865,0.044844,0.069232,-0.005861,
+ -0.635833,0.76859,0.070606,0.044831,0.069247,-0.006013,
+ -0.727149,0.682839,0.070606,0.043243,0.067757,-0.006013,
+ -0.715879,0.672256,0.18865,0.043258,0.067743,-0.005861,
+ -0.672256,0.715879,0.18865,0.044028,0.068512,-0.005861,
+ -0.727149,0.682839,0.070606,0.043243,0.067757,-0.006013,
+ -0.672256,0.715879,0.18865,0.044028,0.068512,-0.005861,
+ -0.682839,0.727149,0.070606,0.044014,0.068527,-0.006013,
+ -0.76859,0.635833,0.070606,0.042523,0.06694,-0.006013,
+ -0.756678,0.625979,0.18865,0.042538,0.066927,-0.005861,
+ -0.715879,0.672256,0.18865,0.043258,0.067743,-0.005861,
+ -0.76859,0.635833,0.070606,0.042523,0.06694,-0.006013,
+ -0.715879,0.672256,0.18865,0.043258,0.067743,-0.005861,
+ -0.727149,0.682839,0.070606,0.043243,0.067757,-0.006013,
+ -0.806998,0.586318,0.070606,0.041855,0.066079,-0.006013,
+ -0.794491,0.577231,0.18865,0.041871,0.066067,-0.005861,
+ -0.756678,0.625979,0.18865,0.042538,0.066927,-0.005861,
+ -0.806998,0.586318,0.070606,0.041855,0.066079,-0.006013,
+ -0.756678,0.625979,0.18865,0.042538,0.066927,-0.005861,
+ -0.76859,0.635833,0.070606,0.042523,0.06694,-0.006013,
+ -0.842221,0.53449,0.070606,0.041243,0.065178,-0.006013,
+ -0.829167,0.526206,0.18865,0.04126,0.065167,-0.005861,
+ -0.794491,0.577231,0.18865,0.041871,0.066067,-0.005861,
+ -0.842221,0.53449,0.070606,0.041243,0.065178,-0.006013,
+ -0.794491,0.577231,0.18865,0.041871,0.066067,-0.005861,
+ -0.806998,0.586318,0.070606,0.041855,0.066079,-0.006013,
+ -0.87412,0.480551,0.070606,0.040688,0.06424,-0.006013,
+ -0.860572,0.473103,0.18865,0.040706,0.06423,-0.005861,
+ -0.829167,0.526206,0.18865,0.04126,0.065167,-0.005861,
+ -0.87412,0.480551,0.070606,0.040688,0.06424,-0.006013,
+ -0.829167,0.526206,0.18865,0.04126,0.065167,-0.005861,
+ -0.842221,0.53449,0.070606,0.041243,0.065178,-0.006013,
+ -0.902569,0.424717,0.070606,0.040194,0.063269,-0.006013,
+ -0.88858,0.418134,0.18865,0.040212,0.063261,-0.005861,
+ -0.860572,0.473103,0.18865,0.040706,0.06423,-0.005861,
+ -0.902569,0.424717,0.070606,0.040194,0.063269,-0.006013,
+ -0.860572,0.473103,0.18865,0.040706,0.06423,-0.005861,
+ -0.87412,0.480551,0.070606,0.040688,0.06424,-0.006013,
+ -0.927456,0.367206,0.070606,0.039761,0.062269,-0.006013,
+ -0.913082,0.361515,0.18865,0.03978,0.062262,-0.005861,
+ -0.88858,0.418134,0.18865,0.040212,0.063261,-0.005861,
+ -0.927456,0.367206,0.070606,0.039761,0.062269,-0.006013,
+ -0.88858,0.418134,0.18865,0.040212,0.063261,-0.005861,
+ -0.902569,0.424717,0.070606,0.040194,0.063269,-0.006013,
+ -0.948683,0.308246,0.070606,0.039392,0.061244,-0.006013,
+ -0.93398,0.303468,0.18865,0.039411,0.061238,-0.005861,
+ -0.913082,0.361515,0.18865,0.03978,0.062262,-0.005861,
+ -0.948683,0.308246,0.070606,0.039392,0.061244,-0.006013,
+ -0.913082,0.361515,0.18865,0.03978,0.062262,-0.005861,
+ -0.927456,0.367206,0.070606,0.039761,0.062269,-0.006013,
+ -0.966166,0.248069,0.070606,0.039088,0.060198,-0.006013,
+ -0.951192,0.244224,0.18865,0.039107,0.060193,-0.005861,
+ -0.93398,0.303468,0.18865,0.039411,0.061238,-0.005861,
+ -0.966166,0.248069,0.070606,0.039088,0.060198,-0.006013,
+ -0.93398,0.303468,0.18865,0.039411,0.061238,-0.005861,
+ -0.948683,0.308246,0.070606,0.039392,0.061244,-0.006013,
+ -0.979836,0.186914,0.070606,0.03885,0.059135,-0.006013,
+ -0.96465,0.184017,0.18865,0.03887,0.059131,-0.005861,
+ -0.951192,0.244224,0.18865,0.039107,0.060193,-0.005861,
+ -0.979836,0.186914,0.070606,0.03885,0.059135,-0.006013,
+ -0.951192,0.244224,0.18865,0.039107,0.060193,-0.005861,
+ -0.966166,0.248069,0.070606,0.039088,0.060198,-0.006013,
+ -0.989639,0.12502,0.070606,0.03868,0.058059,-0.006013,
+ -0.974301,0.123083,0.18865,0.0387,0.058056,-0.005861,
+ -0.96465,0.184017,0.18865,0.03887,0.059131,-0.005861,
+ -0.989639,0.12502,0.070606,0.03868,0.058059,-0.006013,
+ -0.96465,0.184017,0.18865,0.03887,0.059131,-0.005861,
+ -0.979836,0.186914,0.070606,0.03885,0.059135,-0.006013,
+ -0.995536,0.062634,0.070606,0.038577,0.056974,-0.006013,
+ -0.980106,0.061663,0.18865,0.038597,0.056973,-0.005861,
+ -0.974301,0.123083,0.18865,0.0387,0.058056,-0.005861,
+ -0.995536,0.062634,0.070606,0.038577,0.056974,-0.006013,
+ -0.974301,0.123083,0.18865,0.0387,0.058056,-0.005861,
+ -0.989639,0.12502,0.070606,0.03868,0.058059,-0.006013,
+ -0.997504,0,0.070606,0.038543,0.055885,-0.006013,
+ -0.982044,0,0.18865,0.038563,0.055885,-0.005861,
+ -0.980106,0.061663,0.18865,0.038597,0.056973,-0.005861,
+ -0.997504,0,0.070606,0.038543,0.055885,-0.006013,
+ -0.980106,0.061663,0.18865,0.038597,0.056973,-0.005861,
+ -0.995536,0.062634,0.070606,0.038577,0.056974,-0.006013,
+ -0.995536,-0.062634,0.070606,0.038577,0.054796,-0.006013,
+ -0.980106,-0.061663,0.18865,0.038597,0.054798,-0.005861,
+ -0.982044,0,0.18865,0.038563,0.055885,-0.005861,
+ -0.995536,-0.062634,0.070606,0.038577,0.054796,-0.006013,
+ -0.982044,0,0.18865,0.038563,0.055885,-0.005861,
+ -0.997504,0,0.070606,0.038543,0.055885,-0.006013,
+ -0.989639,-0.12502,0.070606,0.03868,0.053712,-0.006013,
+ -0.974301,-0.123083,0.18865,0.0387,0.053714,-0.005861,
+ -0.980106,-0.061663,0.18865,0.038597,0.054798,-0.005861,
+ -0.989639,-0.12502,0.070606,0.03868,0.053712,-0.006013,
+ -0.980106,-0.061663,0.18865,0.038597,0.054798,-0.005861,
+ -0.995536,-0.062634,0.070606,0.038577,0.054796,-0.006013,
+ -0.979836,-0.186914,0.070606,0.03885,0.052636,-0.006013,
+ -0.96465,-0.184017,0.18865,0.03887,0.05264,-0.005861,
+ -0.974301,-0.123083,0.18865,0.0387,0.053714,-0.005861,
+ -0.979836,-0.186914,0.070606,0.03885,0.052636,-0.006013,
+ -0.974301,-0.123083,0.18865,0.0387,0.053714,-0.005861,
+ -0.989639,-0.12502,0.070606,0.03868,0.053712,-0.006013,
+ -0.966166,-0.248069,0.070606,0.039088,0.051572,-0.006013,
+ -0.951192,-0.244224,0.18865,0.039107,0.051578,-0.005861,
+ -0.96465,-0.184017,0.18865,0.03887,0.05264,-0.005861,
+ -0.966166,-0.248069,0.070606,0.039088,0.051572,-0.006013,
+ -0.96465,-0.184017,0.18865,0.03887,0.05264,-0.005861,
+ -0.979836,-0.186914,0.070606,0.03885,0.052636,-0.006013,
+ -0.948683,-0.308246,0.070606,0.039392,0.050526,-0.006013,
+ -0.93398,-0.303468,0.18865,0.039411,0.050532,-0.005861,
+ -0.951192,-0.244224,0.18865,0.039107,0.051578,-0.005861,
+ -0.948683,-0.308246,0.070606,0.039392,0.050526,-0.006013,
+ -0.951192,-0.244224,0.18865,0.039107,0.051578,-0.005861,
+ -0.966166,-0.248069,0.070606,0.039088,0.051572,-0.006013,
+ -0.93398,-0.303468,0.18865,0.039411,0.050532,-0.005861,
+ -0.906039,-0.29439,0.304021,0.039447,0.050544,-0.005713,
+ -0.922736,-0.236918,0.304021,0.039144,0.051587,-0.005713,
+ -0.93398,-0.303468,0.18865,0.039411,0.050532,-0.005861,
+ -0.922736,-0.236918,0.304021,0.039144,0.051587,-0.005713,
+ -0.951192,-0.244224,0.18865,0.039107,0.051578,-0.005861,
+ -0.913082,-0.361515,0.18865,0.03978,0.049509,-0.005861,
+ -0.885766,-0.3507,0.304021,0.039815,0.049522,-0.005713,
+ -0.906039,-0.29439,0.304021,0.039447,0.050544,-0.005713,
+ -0.913082,-0.361515,0.18865,0.03978,0.049509,-0.005861,
+ -0.906039,-0.29439,0.304021,0.039447,0.050544,-0.005713,
+ -0.93398,-0.303468,0.18865,0.039411,0.050532,-0.005861,
+ -0.88858,-0.418134,0.18865,0.040212,0.04851,-0.005861,
+ -0.861997,-0.405625,0.304021,0.040246,0.048526,-0.005713,
+ -0.885766,-0.3507,0.304021,0.039815,0.049522,-0.005713,
+ -0.88858,-0.418134,0.18865,0.040212,0.04851,-0.005861,
+ -0.885766,-0.3507,0.304021,0.039815,0.049522,-0.005713,
+ -0.913082,-0.361515,0.18865,0.03978,0.049509,-0.005861,
+ -0.860572,-0.473103,0.18865,0.040706,0.04754,-0.005861,
+ -0.834827,-0.45895,0.304021,0.040739,0.047559,-0.005713,
+ -0.861997,-0.405625,0.304021,0.040246,0.048526,-0.005713,
+ -0.860572,-0.473103,0.18865,0.040706,0.04754,-0.005861,
+ -0.861997,-0.405625,0.304021,0.040246,0.048526,-0.005713,
+ -0.88858,-0.418134,0.18865,0.040212,0.04851,-0.005861,
+ -0.829167,-0.526206,0.18865,0.04126,0.046604,-0.005861,
+ -0.804362,-0.510464,0.304021,0.041292,0.046624,-0.005713,
+ -0.834827,-0.45895,0.304021,0.040739,0.047559,-0.005713,
+ -0.829167,-0.526206,0.18865,0.04126,0.046604,-0.005861,
+ -0.834827,-0.45895,0.304021,0.040739,0.047559,-0.005713,
+ -0.860572,-0.473103,0.18865,0.040706,0.04754,-0.005861,
+ -0.794491,-0.577231,0.18865,0.041871,0.045704,-0.005861,
+ -0.770723,-0.559963,0.304021,0.041902,0.045726,-0.005713,
+ -0.804362,-0.510464,0.304021,0.041292,0.046624,-0.005713,
+ -0.794491,-0.577231,0.18865,0.041871,0.045704,-0.005861,
+ -0.804362,-0.510464,0.304021,0.041292,0.046624,-0.005713,
+ -0.829167,-0.526206,0.18865,0.04126,0.046604,-0.005861,
+ -0.756678,-0.625979,0.18865,0.042538,0.044844,-0.005861,
+ -0.734041,-0.607252,0.304021,0.042568,0.044868,-0.005713,
+ -0.770723,-0.559963,0.304021,0.041902,0.045726,-0.005713,
+ -0.756678,-0.625979,0.18865,0.042538,0.044844,-0.005861,
+ -0.770723,-0.559963,0.304021,0.041902,0.045726,-0.005713,
+ -0.794491,-0.577231,0.18865,0.041871,0.045704,-0.005861,
+ -0.715879,-0.672256,0.18865,0.043258,0.044028,-0.005861,
+ -0.694463,-0.652144,0.304021,0.043286,0.044053,-0.005713,
+ -0.734041,-0.607252,0.304021,0.042568,0.044868,-0.005713,
+ -0.715879,-0.672256,0.18865,0.043258,0.044028,-0.005861,
+ -0.734041,-0.607252,0.304021,0.042568,0.044868,-0.005713,
+ -0.756678,-0.625979,0.18865,0.042538,0.044844,-0.005861,
+ -0.672256,-0.715879,0.18865,0.044028,0.043258,-0.005861,
+ -0.652144,-0.694463,0.304021,0.044053,0.043286,-0.005713,
+ -0.694463,-0.652144,0.304021,0.043286,0.044053,-0.005713,
+ -0.672256,-0.715879,0.18865,0.044028,0.043258,-0.005861,
+ -0.694463,-0.652144,0.304021,0.043286,0.044053,-0.005713,
+ -0.715879,-0.672256,0.18865,0.043258,0.044028,-0.005861,
+ -0.625979,-0.756678,0.18865,0.044844,0.042538,-0.005861,
+ -0.607252,-0.734041,0.304021,0.044868,0.042568,-0.005713,
+ -0.652144,-0.694463,0.304021,0.044053,0.043286,-0.005713,
+ -0.625979,-0.756678,0.18865,0.044844,0.042538,-0.005861,
+ -0.652144,-0.694463,0.304021,0.044053,0.043286,-0.005713,
+ -0.672256,-0.715879,0.18865,0.044028,0.043258,-0.005861,
+ -0.577231,-0.794491,0.18865,0.045704,0.041871,-0.005861,
+ -0.559963,-0.770723,0.304021,0.045726,0.041902,-0.005713,
+ -0.607252,-0.734041,0.304021,0.044868,0.042568,-0.005713,
+ -0.577231,-0.794491,0.18865,0.045704,0.041871,-0.005861,
+ -0.607252,-0.734041,0.304021,0.044868,0.042568,-0.005713,
+ -0.625979,-0.756678,0.18865,0.044844,0.042538,-0.005861,
+ -0.526206,-0.829167,0.18865,0.046604,0.04126,-0.005861,
+ -0.510464,-0.804362,0.304021,0.046624,0.041292,-0.005713,
+ -0.559963,-0.770723,0.304021,0.045726,0.041902,-0.005713,
+ -0.526206,-0.829167,0.18865,0.046604,0.04126,-0.005861,
+ -0.559963,-0.770723,0.304021,0.045726,0.041902,-0.005713,
+ -0.577231,-0.794491,0.18865,0.045704,0.041871,-0.005861,
+ -0.473103,-0.860572,0.18865,0.04754,0.040706,-0.005861,
+ -0.45895,-0.834827,0.304021,0.047559,0.040739,-0.005713,
+ -0.510464,-0.804362,0.304021,0.046624,0.041292,-0.005713,
+ -0.473103,-0.860572,0.18865,0.04754,0.040706,-0.005861,
+ -0.510464,-0.804362,0.304021,0.046624,0.041292,-0.005713,
+ -0.526206,-0.829167,0.18865,0.046604,0.04126,-0.005861,
+ -0.418134,-0.88858,0.18865,0.04851,0.040212,-0.005861,
+ -0.405625,-0.861997,0.304021,0.048526,0.040246,-0.005713,
+ -0.45895,-0.834827,0.304021,0.047559,0.040739,-0.005713,
+ -0.418134,-0.88858,0.18865,0.04851,0.040212,-0.005861,
+ -0.45895,-0.834827,0.304021,0.047559,0.040739,-0.005713,
+ -0.473103,-0.860572,0.18865,0.04754,0.040706,-0.005861,
+ -0.361515,-0.913082,0.18865,0.049509,0.03978,-0.005861,
+ -0.3507,-0.885766,0.304021,0.049522,0.039815,-0.005713,
+ -0.405625,-0.861997,0.304021,0.048526,0.040246,-0.005713,
+ -0.361515,-0.913082,0.18865,0.049509,0.03978,-0.005861,
+ -0.405625,-0.861997,0.304021,0.048526,0.040246,-0.005713,
+ -0.418134,-0.88858,0.18865,0.04851,0.040212,-0.005861,
+ -0.303468,-0.93398,0.18865,0.050532,0.039411,-0.005861,
+ -0.29439,-0.906039,0.304021,0.050544,0.039447,-0.005713,
+ -0.3507,-0.885766,0.304021,0.049522,0.039815,-0.005713,
+ -0.303468,-0.93398,0.18865,0.050532,0.039411,-0.005861,
+ -0.3507,-0.885766,0.304021,0.049522,0.039815,-0.005713,
+ -0.361515,-0.913082,0.18865,0.049509,0.03978,-0.005861,
+ -0.244224,-0.951192,0.18865,0.051578,0.039107,-0.005861,
+ -0.236918,-0.922736,0.304021,0.051587,0.039144,-0.005713,
+ -0.29439,-0.906039,0.304021,0.050544,0.039447,-0.005713,
+ -0.244224,-0.951192,0.18865,0.051578,0.039107,-0.005861,
+ -0.29439,-0.906039,0.304021,0.050544,0.039447,-0.005713,
+ -0.303468,-0.93398,0.18865,0.050532,0.039411,-0.005861,
+ -0.184017,-0.96465,0.18865,0.05264,0.03887,-0.005861,
+ -0.178512,-0.935791,0.304021,0.052646,0.038907,-0.005713,
+ -0.236918,-0.922736,0.304021,0.051587,0.039144,-0.005713,
+ -0.184017,-0.96465,0.18865,0.05264,0.03887,-0.005861,
+ -0.236918,-0.922736,0.304021,0.051587,0.039144,-0.005713,
+ -0.244224,-0.951192,0.18865,0.051578,0.039107,-0.005861,
+ -0.123083,-0.974301,0.18865,0.053714,0.0387,-0.005861,
+ -0.119401,-0.945153,0.304021,0.053719,0.038737,-0.005713,
+ -0.178512,-0.935791,0.304021,0.052646,0.038907,-0.005713,
+ -0.123083,-0.974301,0.18865,0.053714,0.0387,-0.005861,
+ -0.178512,-0.935791,0.304021,0.052646,0.038907,-0.005713,
+ -0.184017,-0.96465,0.18865,0.05264,0.03887,-0.005861,
+ -0.061663,-0.980106,0.18865,0.054798,0.038597,-0.005861,
+ -0.059818,-0.950786,0.304021,0.0548,0.038635,-0.005713,
+ -0.119401,-0.945153,0.304021,0.053719,0.038737,-0.005713,
+ -0.061663,-0.980106,0.18865,0.054798,0.038597,-0.005861,
+ -0.119401,-0.945153,0.304021,0.053719,0.038737,-0.005713,
+ -0.123083,-0.974301,0.18865,0.053714,0.0387,-0.005861,
+ 0,-0.982044,0.18865,0.055885,0.038563,-0.005861,
+ 0,-0.952665,0.304021,0.055885,0.038601,-0.005713,
+ -0.059818,-0.950786,0.304021,0.0548,0.038635,-0.005713,
+ 0,-0.982044,0.18865,0.055885,0.038563,-0.005861,
+ -0.059818,-0.950786,0.304021,0.0548,0.038635,-0.005713,
+ -0.061663,-0.980106,0.18865,0.054798,0.038597,-0.005861,
+ 0.061663,-0.980106,0.18865,0.056973,0.038597,-0.005861,
+ 0.059818,-0.950786,0.304021,0.056971,0.038635,-0.005713,
+ 0,-0.952665,0.304021,0.055885,0.038601,-0.005713,
+ 0.061663,-0.980106,0.18865,0.056973,0.038597,-0.005861,
+ 0,-0.952665,0.304021,0.055885,0.038601,-0.005713,
+ 0,-0.982044,0.18865,0.055885,0.038563,-0.005861,
+ 0.123083,-0.974301,0.18865,0.058056,0.0387,-0.005861,
+ 0.119401,-0.945153,0.304021,0.058052,0.038737,-0.005713,
+ 0.059818,-0.950786,0.304021,0.056971,0.038635,-0.005713,
+ 0.123083,-0.974301,0.18865,0.058056,0.0387,-0.005861,
+ 0.059818,-0.950786,0.304021,0.056971,0.038635,-0.005713,
+ 0.061663,-0.980106,0.18865,0.056973,0.038597,-0.005861,
+ 0.184017,-0.96465,0.18865,0.059131,0.03887,-0.005861,
+ 0.178512,-0.935791,0.304021,0.059124,0.038907,-0.005713,
+ 0.119401,-0.945153,0.304021,0.058052,0.038737,-0.005713,
+ 0.184017,-0.96465,0.18865,0.059131,0.03887,-0.005861,
+ 0.119401,-0.945153,0.304021,0.058052,0.038737,-0.005713,
+ 0.123083,-0.974301,0.18865,0.058056,0.0387,-0.005861,
+ 0.244224,-0.951192,0.18865,0.060193,0.039107,-0.005861,
+ 0.236918,-0.922736,0.304021,0.060184,0.039144,-0.005713,
+ 0.178512,-0.935791,0.304021,0.059124,0.038907,-0.005713,
+ 0.244224,-0.951192,0.18865,0.060193,0.039107,-0.005861,
+ 0.178512,-0.935791,0.304021,0.059124,0.038907,-0.005713,
+ 0.184017,-0.96465,0.18865,0.059131,0.03887,-0.005861,
+ 0.303468,-0.93398,0.18865,0.061238,0.039411,-0.005861,
+ 0.29439,-0.906039,0.304021,0.061226,0.039447,-0.005713,
+ 0.236918,-0.922736,0.304021,0.060184,0.039144,-0.005713,
+ 0.303468,-0.93398,0.18865,0.061238,0.039411,-0.005861,
+ 0.236918,-0.922736,0.304021,0.060184,0.039144,-0.005713,
+ 0.244224,-0.951192,0.18865,0.060193,0.039107,-0.005861,
+ 0.361515,-0.913082,0.18865,0.062262,0.03978,-0.005861,
+ 0.3507,-0.885766,0.304021,0.062248,0.039815,-0.005713,
+ 0.29439,-0.906039,0.304021,0.061226,0.039447,-0.005713,
+ 0.361515,-0.913082,0.18865,0.062262,0.03978,-0.005861,
+ 0.29439,-0.906039,0.304021,0.061226,0.039447,-0.005713,
+ 0.303468,-0.93398,0.18865,0.061238,0.039411,-0.005861,
+ 0.418134,-0.88858,0.18865,0.063261,0.040212,-0.005861,
+ 0.405625,-0.861997,0.304021,0.063245,0.040246,-0.005713,
+ 0.3507,-0.885766,0.304021,0.062248,0.039815,-0.005713,
+ 0.418134,-0.88858,0.18865,0.063261,0.040212,-0.005861,
+ 0.3507,-0.885766,0.304021,0.062248,0.039815,-0.005713,
+ 0.361515,-0.913082,0.18865,0.062262,0.03978,-0.005861,
+ 0.473103,-0.860572,0.18865,0.06423,0.040706,-0.005861,
+ 0.45895,-0.834827,0.304021,0.064212,0.040739,-0.005713,
+ 0.405625,-0.861997,0.304021,0.063245,0.040246,-0.005713,
+ 0.473103,-0.860572,0.18865,0.06423,0.040706,-0.005861,
+ 0.405625,-0.861997,0.304021,0.063245,0.040246,-0.005713,
+ 0.418134,-0.88858,0.18865,0.063261,0.040212,-0.005861,
+ 0.526206,-0.829167,0.18865,0.065167,0.04126,-0.005861,
+ 0.510464,-0.804362,0.304021,0.065147,0.041292,-0.005713,
+ 0.45895,-0.834827,0.304021,0.064212,0.040739,-0.005713,
+ 0.526206,-0.829167,0.18865,0.065167,0.04126,-0.005861,
+ 0.45895,-0.834827,0.304021,0.064212,0.040739,-0.005713,
+ 0.473103,-0.860572,0.18865,0.06423,0.040706,-0.005861,
+ 0.577231,-0.794491,0.18865,0.066067,0.041871,-0.005861,
+ 0.559963,-0.770723,0.304021,0.066045,0.041902,-0.005713,
+ 0.510464,-0.804362,0.304021,0.065147,0.041292,-0.005713,
+ 0.577231,-0.794491,0.18865,0.066067,0.041871,-0.005861,
+ 0.510464,-0.804362,0.304021,0.065147,0.041292,-0.005713,
+ 0.526206,-0.829167,0.18865,0.065167,0.04126,-0.005861,
+ 0.625979,-0.756678,0.18865,0.066927,0.042538,-0.005861,
+ 0.607252,-0.734041,0.304021,0.066903,0.042568,-0.005713,
+ 0.559963,-0.770723,0.304021,0.066045,0.041902,-0.005713,
+ 0.625979,-0.756678,0.18865,0.066927,0.042538,-0.005861,
+ 0.559963,-0.770723,0.304021,0.066045,0.041902,-0.005713,
+ 0.577231,-0.794491,0.18865,0.066067,0.041871,-0.005861,
+ 0.672256,-0.715879,0.18865,0.067743,0.043258,-0.005861,
+ 0.652144,-0.694463,0.304021,0.067717,0.043286,-0.005713,
+ 0.607252,-0.734041,0.304021,0.066903,0.042568,-0.005713,
+ 0.672256,-0.715879,0.18865,0.067743,0.043258,-0.005861,
+ 0.607252,-0.734041,0.304021,0.066903,0.042568,-0.005713,
+ 0.625979,-0.756678,0.18865,0.066927,0.042538,-0.005861,
+ 0.715879,-0.672256,0.18865,0.068512,0.044028,-0.005861,
+ 0.694463,-0.652144,0.304021,0.068485,0.044053,-0.005713,
+ 0.652144,-0.694463,0.304021,0.067717,0.043286,-0.005713,
+ 0.715879,-0.672256,0.18865,0.068512,0.044028,-0.005861,
+ 0.652144,-0.694463,0.304021,0.067717,0.043286,-0.005713,
+ 0.672256,-0.715879,0.18865,0.067743,0.043258,-0.005861,
+ 0.756678,-0.625979,0.18865,0.069232,0.044844,-0.005861,
+ 0.734041,-0.607252,0.304021,0.069203,0.044868,-0.005713,
+ 0.694463,-0.652144,0.304021,0.068485,0.044053,-0.005713,
+ 0.756678,-0.625979,0.18865,0.069232,0.044844,-0.005861,
+ 0.694463,-0.652144,0.304021,0.068485,0.044053,-0.005713,
+ 0.715879,-0.672256,0.18865,0.068512,0.044028,-0.005861,
+ 0.794491,-0.577231,0.18865,0.069899,0.045704,-0.005861,
+ 0.770723,-0.559963,0.304021,0.069869,0.045726,-0.005713,
+ 0.734041,-0.607252,0.304021,0.069203,0.044868,-0.005713,
+ 0.794491,-0.577231,0.18865,0.069899,0.045704,-0.005861,
+ 0.734041,-0.607252,0.304021,0.069203,0.044868,-0.005713,
+ 0.756678,-0.625979,0.18865,0.069232,0.044844,-0.005861,
+ 0.829167,-0.526206,0.18865,0.070511,0.046604,-0.005861,
+ 0.804362,-0.510464,0.304021,0.070479,0.046624,-0.005713,
+ 0.770723,-0.559963,0.304021,0.069869,0.045726,-0.005713,
+ 0.829167,-0.526206,0.18865,0.070511,0.046604,-0.005861,
+ 0.770723,-0.559963,0.304021,0.069869,0.045726,-0.005713,
+ 0.794491,-0.577231,0.18865,0.069899,0.045704,-0.005861,
+ 0.860572,-0.473103,0.18865,0.071065,0.04754,-0.005861,
+ 0.834827,-0.45895,0.304021,0.071032,0.047559,-0.005713,
+ 0.804362,-0.510464,0.304021,0.070479,0.046624,-0.005713,
+ 0.860572,-0.473103,0.18865,0.071065,0.04754,-0.005861,
+ 0.804362,-0.510464,0.304021,0.070479,0.046624,-0.005713,
+ 0.829167,-0.526206,0.18865,0.070511,0.046604,-0.005861,
+ 0.88858,-0.418134,0.18865,0.071559,0.04851,-0.005861,
+ 0.861997,-0.405625,0.304021,0.071525,0.048526,-0.005713,
+ 0.834827,-0.45895,0.304021,0.071032,0.047559,-0.005713,
+ 0.88858,-0.418134,0.18865,0.071559,0.04851,-0.005861,
+ 0.834827,-0.45895,0.304021,0.071032,0.047559,-0.005713,
+ 0.860572,-0.473103,0.18865,0.071065,0.04754,-0.005861,
+ 0.913082,-0.361515,0.18865,0.071991,0.049509,-0.005861,
+ 0.885766,-0.3507,0.304021,0.071956,0.049522,-0.005713,
+ 0.861997,-0.405625,0.304021,0.071525,0.048526,-0.005713,
+ 0.913082,-0.361515,0.18865,0.071991,0.049509,-0.005861,
+ 0.861997,-0.405625,0.304021,0.071525,0.048526,-0.005713,
+ 0.88858,-0.418134,0.18865,0.071559,0.04851,-0.005861,
+ 0.93398,-0.303468,0.18865,0.07236,0.050532,-0.005861,
+ 0.906039,-0.29439,0.304021,0.072324,0.050544,-0.005713,
+ 0.885766,-0.3507,0.304021,0.071956,0.049522,-0.005713,
+ 0.93398,-0.303468,0.18865,0.07236,0.050532,-0.005861,
+ 0.885766,-0.3507,0.304021,0.071956,0.049522,-0.005713,
+ 0.913082,-0.361515,0.18865,0.071991,0.049509,-0.005861,
+ 0.951192,-0.244224,0.18865,0.072663,0.051578,-0.005861,
+ 0.922736,-0.236918,0.304021,0.072627,0.051587,-0.005713,
+ 0.906039,-0.29439,0.304021,0.072324,0.050544,-0.005713,
+ 0.951192,-0.244224,0.18865,0.072663,0.051578,-0.005861,
+ 0.906039,-0.29439,0.304021,0.072324,0.050544,-0.005713,
+ 0.93398,-0.303468,0.18865,0.07236,0.050532,-0.005861,
+ 0.96465,-0.184017,0.18865,0.072901,0.05264,-0.005861,
+ 0.935791,-0.178512,0.304021,0.072863,0.052646,-0.005713,
+ 0.922736,-0.236918,0.304021,0.072627,0.051587,-0.005713,
+ 0.96465,-0.184017,0.18865,0.072901,0.05264,-0.005861,
+ 0.922736,-0.236918,0.304021,0.072627,0.051587,-0.005713,
+ 0.951192,-0.244224,0.18865,0.072663,0.051578,-0.005861,
+ 0.974301,-0.123083,0.18865,0.073071,0.053714,-0.005861,
+ 0.945153,-0.119401,0.304021,0.073033,0.053719,-0.005713,
+ 0.935791,-0.178512,0.304021,0.072863,0.052646,-0.005713,
+ 0.974301,-0.123083,0.18865,0.073071,0.053714,-0.005861,
+ 0.935791,-0.178512,0.304021,0.072863,0.052646,-0.005713,
+ 0.96465,-0.184017,0.18865,0.072901,0.05264,-0.005861,
+ 0.980106,-0.061663,0.18865,0.073173,0.054798,-0.005861,
+ 0.950786,-0.059818,0.304021,0.073135,0.0548,-0.005713,
+ 0.945153,-0.119401,0.304021,0.073033,0.053719,-0.005713,
+ 0.980106,-0.061663,0.18865,0.073173,0.054798,-0.005861,
+ 0.945153,-0.119401,0.304021,0.073033,0.053719,-0.005713,
+ 0.974301,-0.123083,0.18865,0.073071,0.053714,-0.005861,
+ 0.982044,0,0.18865,0.073207,0.055885,-0.005861,
+ 0.952665,0,0.304021,0.073169,0.055885,-0.005713,
+ 0.950786,-0.059818,0.304021,0.073135,0.0548,-0.005713,
+ 0.982044,0,0.18865,0.073207,0.055885,-0.005861,
+ 0.950786,-0.059818,0.304021,0.073135,0.0548,-0.005713,
+ 0.980106,-0.061663,0.18865,0.073173,0.054798,-0.005861,
+ 0.980106,0.061663,0.18865,0.073173,0.056973,-0.005861,
+ 0.950786,0.059818,0.304021,0.073135,0.056971,-0.005713,
+ 0.952665,0,0.304021,0.073169,0.055885,-0.005713,
+ 0.980106,0.061663,0.18865,0.073173,0.056973,-0.005861,
+ 0.952665,0,0.304021,0.073169,0.055885,-0.005713,
+ 0.982044,0,0.18865,0.073207,0.055885,-0.005861,
+ 0.974301,0.123083,0.18865,0.073071,0.058056,-0.005861,
+ 0.945153,0.119401,0.304021,0.073033,0.058052,-0.005713,
+ 0.950786,0.059818,0.304021,0.073135,0.056971,-0.005713,
+ 0.974301,0.123083,0.18865,0.073071,0.058056,-0.005861,
+ 0.950786,0.059818,0.304021,0.073135,0.056971,-0.005713,
+ 0.980106,0.061663,0.18865,0.073173,0.056973,-0.005861,
+ 0.96465,0.184017,0.18865,0.072901,0.059131,-0.005861,
+ 0.935791,0.178512,0.304021,0.072863,0.059124,-0.005713,
+ 0.945153,0.119401,0.304021,0.073033,0.058052,-0.005713,
+ 0.96465,0.184017,0.18865,0.072901,0.059131,-0.005861,
+ 0.945153,0.119401,0.304021,0.073033,0.058052,-0.005713,
+ 0.974301,0.123083,0.18865,0.073071,0.058056,-0.005861,
+ 0.951192,0.244224,0.18865,0.072663,0.060193,-0.005861,
+ 0.922736,0.236918,0.304021,0.072627,0.060184,-0.005713,
+ 0.935791,0.178512,0.304021,0.072863,0.059124,-0.005713,
+ 0.951192,0.244224,0.18865,0.072663,0.060193,-0.005861,
+ 0.935791,0.178512,0.304021,0.072863,0.059124,-0.005713,
+ 0.96465,0.184017,0.18865,0.072901,0.059131,-0.005861,
+ 0.93398,0.303468,0.18865,0.07236,0.061238,-0.005861,
+ 0.906039,0.29439,0.304021,0.072324,0.061226,-0.005713,
+ 0.922736,0.236918,0.304021,0.072627,0.060184,-0.005713,
+ 0.93398,0.303468,0.18865,0.07236,0.061238,-0.005861,
+ 0.922736,0.236918,0.304021,0.072627,0.060184,-0.005713,
+ 0.951192,0.244224,0.18865,0.072663,0.060193,-0.005861,
+ 0.913082,0.361515,0.18865,0.071991,0.062262,-0.005861,
+ 0.885766,0.3507,0.304021,0.071956,0.062248,-0.005713,
+ 0.906039,0.29439,0.304021,0.072324,0.061226,-0.005713,
+ 0.913082,0.361515,0.18865,0.071991,0.062262,-0.005861,
+ 0.906039,0.29439,0.304021,0.072324,0.061226,-0.005713,
+ 0.93398,0.303468,0.18865,0.07236,0.061238,-0.005861,
+ 0.88858,0.418134,0.18865,0.071559,0.063261,-0.005861,
+ 0.861997,0.405625,0.304021,0.071525,0.063245,-0.005713,
+ 0.885766,0.3507,0.304021,0.071956,0.062248,-0.005713,
+ 0.88858,0.418134,0.18865,0.071559,0.063261,-0.005861,
+ 0.885766,0.3507,0.304021,0.071956,0.062248,-0.005713,
+ 0.913082,0.361515,0.18865,0.071991,0.062262,-0.005861,
+ 0.860572,0.473103,0.18865,0.071065,0.06423,-0.005861,
+ 0.834827,0.45895,0.304021,0.071032,0.064212,-0.005713,
+ 0.861997,0.405625,0.304021,0.071525,0.063245,-0.005713,
+ 0.860572,0.473103,0.18865,0.071065,0.06423,-0.005861,
+ 0.861997,0.405625,0.304021,0.071525,0.063245,-0.005713,
+ 0.88858,0.418134,0.18865,0.071559,0.063261,-0.005861,
+ 0.829167,0.526206,0.18865,0.070511,0.065167,-0.005861,
+ 0.804362,0.510464,0.304021,0.070479,0.065147,-0.005713,
+ 0.834827,0.45895,0.304021,0.071032,0.064212,-0.005713,
+ 0.829167,0.526206,0.18865,0.070511,0.065167,-0.005861,
+ 0.834827,0.45895,0.304021,0.071032,0.064212,-0.005713,
+ 0.860572,0.473103,0.18865,0.071065,0.06423,-0.005861,
+ 0.794491,0.577231,0.18865,0.069899,0.066067,-0.005861,
+ 0.770723,0.559963,0.304021,0.069869,0.066045,-0.005713,
+ 0.804362,0.510464,0.304021,0.070479,0.065147,-0.005713,
+ 0.794491,0.577231,0.18865,0.069899,0.066067,-0.005861,
+ 0.804362,0.510464,0.304021,0.070479,0.065147,-0.005713,
+ 0.829167,0.526206,0.18865,0.070511,0.065167,-0.005861,
+ 0.756678,0.625979,0.18865,0.069232,0.066927,-0.005861,
+ 0.734041,0.607252,0.304021,0.069203,0.066903,-0.005713,
+ 0.770723,0.559963,0.304021,0.069869,0.066045,-0.005713,
+ 0.756678,0.625979,0.18865,0.069232,0.066927,-0.005861,
+ 0.770723,0.559963,0.304021,0.069869,0.066045,-0.005713,
+ 0.794491,0.577231,0.18865,0.069899,0.066067,-0.005861,
+ 0.715879,0.672256,0.18865,0.068512,0.067743,-0.005861,
+ 0.694463,0.652144,0.304021,0.068485,0.067717,-0.005713,
+ 0.734041,0.607252,0.304021,0.069203,0.066903,-0.005713,
+ 0.715879,0.672256,0.18865,0.068512,0.067743,-0.005861,
+ 0.734041,0.607252,0.304021,0.069203,0.066903,-0.005713,
+ 0.756678,0.625979,0.18865,0.069232,0.066927,-0.005861,
+ 0.672256,0.715879,0.18865,0.067743,0.068512,-0.005861,
+ 0.652144,0.694463,0.304021,0.067717,0.068485,-0.005713,
+ 0.694463,0.652144,0.304021,0.068485,0.067717,-0.005713,
+ 0.672256,0.715879,0.18865,0.067743,0.068512,-0.005861,
+ 0.694463,0.652144,0.304021,0.068485,0.067717,-0.005713,
+ 0.715879,0.672256,0.18865,0.068512,0.067743,-0.005861,
+ 0.625979,0.756678,0.18865,0.066927,0.069232,-0.005861,
+ 0.607252,0.734041,0.304021,0.066903,0.069203,-0.005713,
+ 0.652144,0.694463,0.304021,0.067717,0.068485,-0.005713,
+ 0.625979,0.756678,0.18865,0.066927,0.069232,-0.005861,
+ 0.652144,0.694463,0.304021,0.067717,0.068485,-0.005713,
+ 0.672256,0.715879,0.18865,0.067743,0.068512,-0.005861,
+ 0.577231,0.794491,0.18865,0.066067,0.069899,-0.005861,
+ 0.559963,0.770723,0.304021,0.066045,0.069869,-0.005713,
+ 0.607252,0.734041,0.304021,0.066903,0.069203,-0.005713,
+ 0.577231,0.794491,0.18865,0.066067,0.069899,-0.005861,
+ 0.607252,0.734041,0.304021,0.066903,0.069203,-0.005713,
+ 0.625979,0.756678,0.18865,0.066927,0.069232,-0.005861,
+ 0.526206,0.829167,0.18865,0.065167,0.070511,-0.005861,
+ 0.510464,0.804362,0.304021,0.065147,0.070479,-0.005713,
+ 0.559963,0.770723,0.304021,0.066045,0.069869,-0.005713,
+ 0.526206,0.829167,0.18865,0.065167,0.070511,-0.005861,
+ 0.559963,0.770723,0.304021,0.066045,0.069869,-0.005713,
+ 0.577231,0.794491,0.18865,0.066067,0.069899,-0.005861,
+ 0.473103,0.860572,0.18865,0.06423,0.071065,-0.005861,
+ 0.45895,0.834827,0.304021,0.064212,0.071032,-0.005713,
+ 0.510464,0.804362,0.304021,0.065147,0.070479,-0.005713,
+ 0.473103,0.860572,0.18865,0.06423,0.071065,-0.005861,
+ 0.510464,0.804362,0.304021,0.065147,0.070479,-0.005713,
+ 0.526206,0.829167,0.18865,0.065167,0.070511,-0.005861,
+ 0.418134,0.88858,0.18865,0.063261,0.071559,-0.005861,
+ 0.405625,0.861997,0.304021,0.063245,0.071525,-0.005713,
+ 0.45895,0.834827,0.304021,0.064212,0.071032,-0.005713,
+ 0.418134,0.88858,0.18865,0.063261,0.071559,-0.005861,
+ 0.45895,0.834827,0.304021,0.064212,0.071032,-0.005713,
+ 0.473103,0.860572,0.18865,0.06423,0.071065,-0.005861,
+ 0.361515,0.913082,0.18865,0.062262,0.071991,-0.005861,
+ 0.3507,0.885766,0.304021,0.062248,0.071956,-0.005713,
+ 0.405625,0.861997,0.304021,0.063245,0.071525,-0.005713,
+ 0.361515,0.913082,0.18865,0.062262,0.071991,-0.005861,
+ 0.405625,0.861997,0.304021,0.063245,0.071525,-0.005713,
+ 0.418134,0.88858,0.18865,0.063261,0.071559,-0.005861,
+ 0.303468,0.93398,0.18865,0.061238,0.07236,-0.005861,
+ 0.29439,0.906039,0.304021,0.061226,0.072324,-0.005713,
+ 0.3507,0.885766,0.304021,0.062248,0.071956,-0.005713,
+ 0.303468,0.93398,0.18865,0.061238,0.07236,-0.005861,
+ 0.3507,0.885766,0.304021,0.062248,0.071956,-0.005713,
+ 0.361515,0.913082,0.18865,0.062262,0.071991,-0.005861,
+ 0.244224,0.951192,0.18865,0.060193,0.072663,-0.005861,
+ 0.236918,0.922736,0.304021,0.060184,0.072627,-0.005713,
+ 0.29439,0.906039,0.304021,0.061226,0.072324,-0.005713,
+ 0.244224,0.951192,0.18865,0.060193,0.072663,-0.005861,
+ 0.29439,0.906039,0.304021,0.061226,0.072324,-0.005713,
+ 0.303468,0.93398,0.18865,0.061238,0.07236,-0.005861,
+ 0.184017,0.96465,0.18865,0.059131,0.072901,-0.005861,
+ 0.178512,0.935791,0.304021,0.059124,0.072863,-0.005713,
+ 0.236918,0.922736,0.304021,0.060184,0.072627,-0.005713,
+ 0.184017,0.96465,0.18865,0.059131,0.072901,-0.005861,
+ 0.236918,0.922736,0.304021,0.060184,0.072627,-0.005713,
+ 0.244224,0.951192,0.18865,0.060193,0.072663,-0.005861,
+ 0.123083,0.974301,0.18865,0.058056,0.073071,-0.005861,
+ 0.119401,0.945153,0.304021,0.058052,0.073033,-0.005713,
+ 0.178512,0.935791,0.304021,0.059124,0.072863,-0.005713,
+ 0.123083,0.974301,0.18865,0.058056,0.073071,-0.005861,
+ 0.178512,0.935791,0.304021,0.059124,0.072863,-0.005713,
+ 0.184017,0.96465,0.18865,0.059131,0.072901,-0.005861,
+ 0.061663,0.980106,0.18865,0.056973,0.073173,-0.005861,
+ 0.059818,0.950786,0.304021,0.056971,0.073135,-0.005713,
+ 0.119401,0.945153,0.304021,0.058052,0.073033,-0.005713,
+ 0.061663,0.980106,0.18865,0.056973,0.073173,-0.005861,
+ 0.119401,0.945153,0.304021,0.058052,0.073033,-0.005713,
+ 0.123083,0.974301,0.18865,0.058056,0.073071,-0.005861,
+ 0,0.982044,0.18865,0.055885,0.073207,-0.005861,
+ 0,0.952665,0.304021,0.055885,0.073169,-0.005713,
+ 0.059818,0.950786,0.304021,0.056971,0.073135,-0.005713,
+ 0,0.982044,0.18865,0.055885,0.073207,-0.005861,
+ 0.059818,0.950786,0.304021,0.056971,0.073135,-0.005713,
+ 0.061663,0.980106,0.18865,0.056973,0.073173,-0.005861,
+ -0.061663,0.980106,0.18865,0.054798,0.073173,-0.005861,
+ -0.059818,0.950786,0.304021,0.0548,0.073135,-0.005713,
+ 0,0.952665,0.304021,0.055885,0.073169,-0.005713,
+ -0.061663,0.980106,0.18865,0.054798,0.073173,-0.005861,
+ 0,0.952665,0.304021,0.055885,0.073169,-0.005713,
+ 0,0.982044,0.18865,0.055885,0.073207,-0.005861,
+ -0.123083,0.974301,0.18865,0.053714,0.073071,-0.005861,
+ -0.119401,0.945153,0.304021,0.053719,0.073033,-0.005713,
+ -0.059818,0.950786,0.304021,0.0548,0.073135,-0.005713,
+ -0.123083,0.974301,0.18865,0.053714,0.073071,-0.005861,
+ -0.059818,0.950786,0.304021,0.0548,0.073135,-0.005713,
+ -0.061663,0.980106,0.18865,0.054798,0.073173,-0.005861,
+ -0.184017,0.96465,0.18865,0.05264,0.072901,-0.005861,
+ -0.178512,0.935791,0.304021,0.052646,0.072863,-0.005713,
+ -0.119401,0.945153,0.304021,0.053719,0.073033,-0.005713,
+ -0.184017,0.96465,0.18865,0.05264,0.072901,-0.005861,
+ -0.119401,0.945153,0.304021,0.053719,0.073033,-0.005713,
+ -0.123083,0.974301,0.18865,0.053714,0.073071,-0.005861,
+ -0.244224,0.951192,0.18865,0.051578,0.072663,-0.005861,
+ -0.236918,0.922736,0.304021,0.051587,0.072627,-0.005713,
+ -0.178512,0.935791,0.304021,0.052646,0.072863,-0.005713,
+ -0.244224,0.951192,0.18865,0.051578,0.072663,-0.005861,
+ -0.178512,0.935791,0.304021,0.052646,0.072863,-0.005713,
+ -0.184017,0.96465,0.18865,0.05264,0.072901,-0.005861,
+ -0.303468,0.93398,0.18865,0.050532,0.07236,-0.005861,
+ -0.29439,0.906039,0.304021,0.050544,0.072324,-0.005713,
+ -0.236918,0.922736,0.304021,0.051587,0.072627,-0.005713,
+ -0.303468,0.93398,0.18865,0.050532,0.07236,-0.005861,
+ -0.236918,0.922736,0.304021,0.051587,0.072627,-0.005713,
+ -0.244224,0.951192,0.18865,0.051578,0.072663,-0.005861,
+ -0.361515,0.913082,0.18865,0.049509,0.071991,-0.005861,
+ -0.3507,0.885766,0.304021,0.049522,0.071956,-0.005713,
+ -0.29439,0.906039,0.304021,0.050544,0.072324,-0.005713,
+ -0.361515,0.913082,0.18865,0.049509,0.071991,-0.005861,
+ -0.29439,0.906039,0.304021,0.050544,0.072324,-0.005713,
+ -0.303468,0.93398,0.18865,0.050532,0.07236,-0.005861,
+ -0.418134,0.88858,0.18865,0.04851,0.071559,-0.005861,
+ -0.405625,0.861997,0.304021,0.048526,0.071525,-0.005713,
+ -0.3507,0.885766,0.304021,0.049522,0.071956,-0.005713,
+ -0.418134,0.88858,0.18865,0.04851,0.071559,-0.005861,
+ -0.3507,0.885766,0.304021,0.049522,0.071956,-0.005713,
+ -0.361515,0.913082,0.18865,0.049509,0.071991,-0.005861,
+ -0.473103,0.860572,0.18865,0.04754,0.071065,-0.005861,
+ -0.45895,0.834827,0.304021,0.047559,0.071032,-0.005713,
+ -0.405625,0.861997,0.304021,0.048526,0.071525,-0.005713,
+ -0.473103,0.860572,0.18865,0.04754,0.071065,-0.005861,
+ -0.405625,0.861997,0.304021,0.048526,0.071525,-0.005713,
+ -0.418134,0.88858,0.18865,0.04851,0.071559,-0.005861,
+ -0.526206,0.829167,0.18865,0.046604,0.070511,-0.005861,
+ -0.510464,0.804362,0.304021,0.046624,0.070479,-0.005713,
+ -0.45895,0.834827,0.304021,0.047559,0.071032,-0.005713,
+ -0.526206,0.829167,0.18865,0.046604,0.070511,-0.005861,
+ -0.45895,0.834827,0.304021,0.047559,0.071032,-0.005713,
+ -0.473103,0.860572,0.18865,0.04754,0.071065,-0.005861,
+ -0.577231,0.794491,0.18865,0.045704,0.069899,-0.005861,
+ -0.559963,0.770723,0.304021,0.045726,0.069869,-0.005713,
+ -0.510464,0.804362,0.304021,0.046624,0.070479,-0.005713,
+ -0.577231,0.794491,0.18865,0.045704,0.069899,-0.005861,
+ -0.510464,0.804362,0.304021,0.046624,0.070479,-0.005713,
+ -0.526206,0.829167,0.18865,0.046604,0.070511,-0.005861,
+ -0.625979,0.756678,0.18865,0.044844,0.069232,-0.005861,
+ -0.607252,0.734041,0.304021,0.044868,0.069203,-0.005713,
+ -0.559963,0.770723,0.304021,0.045726,0.069869,-0.005713,
+ -0.625979,0.756678,0.18865,0.044844,0.069232,-0.005861,
+ -0.559963,0.770723,0.304021,0.045726,0.069869,-0.005713,
+ -0.577231,0.794491,0.18865,0.045704,0.069899,-0.005861,
+ -0.672256,0.715879,0.18865,0.044028,0.068512,-0.005861,
+ -0.652144,0.694463,0.304021,0.044053,0.068485,-0.005713,
+ -0.607252,0.734041,0.304021,0.044868,0.069203,-0.005713,
+ -0.672256,0.715879,0.18865,0.044028,0.068512,-0.005861,
+ -0.607252,0.734041,0.304021,0.044868,0.069203,-0.005713,
+ -0.625979,0.756678,0.18865,0.044844,0.069232,-0.005861,
+ -0.715879,0.672256,0.18865,0.043258,0.067743,-0.005861,
+ -0.694463,0.652144,0.304021,0.043286,0.067717,-0.005713,
+ -0.652144,0.694463,0.304021,0.044053,0.068485,-0.005713,
+ -0.715879,0.672256,0.18865,0.043258,0.067743,-0.005861,
+ -0.652144,0.694463,0.304021,0.044053,0.068485,-0.005713,
+ -0.672256,0.715879,0.18865,0.044028,0.068512,-0.005861,
+ -0.756678,0.625979,0.18865,0.042538,0.066927,-0.005861,
+ -0.734041,0.607252,0.304021,0.042568,0.066903,-0.005713,
+ -0.694463,0.652144,0.304021,0.043286,0.067717,-0.005713,
+ -0.756678,0.625979,0.18865,0.042538,0.066927,-0.005861,
+ -0.694463,0.652144,0.304021,0.043286,0.067717,-0.005713,
+ -0.715879,0.672256,0.18865,0.043258,0.067743,-0.005861,
+ -0.794491,0.577231,0.18865,0.041871,0.066067,-0.005861,
+ -0.770723,0.559963,0.304021,0.041902,0.066045,-0.005713,
+ -0.734041,0.607252,0.304021,0.042568,0.066903,-0.005713,
+ -0.794491,0.577231,0.18865,0.041871,0.066067,-0.005861,
+ -0.734041,0.607252,0.304021,0.042568,0.066903,-0.005713,
+ -0.756678,0.625979,0.18865,0.042538,0.066927,-0.005861,
+ -0.829167,0.526206,0.18865,0.04126,0.065167,-0.005861,
+ -0.804362,0.510464,0.304021,0.041292,0.065147,-0.005713,
+ -0.770723,0.559963,0.304021,0.041902,0.066045,-0.005713,
+ -0.829167,0.526206,0.18865,0.04126,0.065167,-0.005861,
+ -0.770723,0.559963,0.304021,0.041902,0.066045,-0.005713,
+ -0.794491,0.577231,0.18865,0.041871,0.066067,-0.005861,
+ -0.860572,0.473103,0.18865,0.040706,0.06423,-0.005861,
+ -0.834827,0.45895,0.304021,0.040739,0.064212,-0.005713,
+ -0.804362,0.510464,0.304021,0.041292,0.065147,-0.005713,
+ -0.860572,0.473103,0.18865,0.040706,0.06423,-0.005861,
+ -0.804362,0.510464,0.304021,0.041292,0.065147,-0.005713,
+ -0.829167,0.526206,0.18865,0.04126,0.065167,-0.005861,
+ -0.88858,0.418134,0.18865,0.040212,0.063261,-0.005861,
+ -0.861997,0.405625,0.304021,0.040246,0.063245,-0.005713,
+ -0.834827,0.45895,0.304021,0.040739,0.064212,-0.005713,
+ -0.88858,0.418134,0.18865,0.040212,0.063261,-0.005861,
+ -0.834827,0.45895,0.304021,0.040739,0.064212,-0.005713,
+ -0.860572,0.473103,0.18865,0.040706,0.06423,-0.005861,
+ -0.913082,0.361515,0.18865,0.03978,0.062262,-0.005861,
+ -0.885766,0.3507,0.304021,0.039815,0.062248,-0.005713,
+ -0.861997,0.405625,0.304021,0.040246,0.063245,-0.005713,
+ -0.913082,0.361515,0.18865,0.03978,0.062262,-0.005861,
+ -0.861997,0.405625,0.304021,0.040246,0.063245,-0.005713,
+ -0.88858,0.418134,0.18865,0.040212,0.063261,-0.005861,
+ -0.93398,0.303468,0.18865,0.039411,0.061238,-0.005861,
+ -0.906039,0.29439,0.304021,0.039447,0.061226,-0.005713,
+ -0.885766,0.3507,0.304021,0.039815,0.062248,-0.005713,
+ -0.93398,0.303468,0.18865,0.039411,0.061238,-0.005861,
+ -0.885766,0.3507,0.304021,0.039815,0.062248,-0.005713,
+ -0.913082,0.361515,0.18865,0.03978,0.062262,-0.005861,
+ -0.951192,0.244224,0.18865,0.039107,0.060193,-0.005861,
+ -0.922736,0.236918,0.304021,0.039144,0.060184,-0.005713,
+ -0.906039,0.29439,0.304021,0.039447,0.061226,-0.005713,
+ -0.951192,0.244224,0.18865,0.039107,0.060193,-0.005861,
+ -0.906039,0.29439,0.304021,0.039447,0.061226,-0.005713,
+ -0.93398,0.303468,0.18865,0.039411,0.061238,-0.005861,
+ -0.96465,0.184017,0.18865,0.03887,0.059131,-0.005861,
+ -0.935791,0.178512,0.304021,0.038907,0.059124,-0.005713,
+ -0.922736,0.236918,0.304021,0.039144,0.060184,-0.005713,
+ -0.96465,0.184017,0.18865,0.03887,0.059131,-0.005861,
+ -0.922736,0.236918,0.304021,0.039144,0.060184,-0.005713,
+ -0.951192,0.244224,0.18865,0.039107,0.060193,-0.005861,
+ -0.974301,0.123083,0.18865,0.0387,0.058056,-0.005861,
+ -0.945153,0.119401,0.304021,0.038737,0.058052,-0.005713,
+ -0.935791,0.178512,0.304021,0.038907,0.059124,-0.005713,
+ -0.974301,0.123083,0.18865,0.0387,0.058056,-0.005861,
+ -0.935791,0.178512,0.304021,0.038907,0.059124,-0.005713,
+ -0.96465,0.184017,0.18865,0.03887,0.059131,-0.005861,
+ -0.980106,0.061663,0.18865,0.038597,0.056973,-0.005861,
+ -0.950786,0.059818,0.304021,0.038635,0.056971,-0.005713,
+ -0.945153,0.119401,0.304021,0.038737,0.058052,-0.005713,
+ -0.980106,0.061663,0.18865,0.038597,0.056973,-0.005861,
+ -0.945153,0.119401,0.304021,0.038737,0.058052,-0.005713,
+ -0.974301,0.123083,0.18865,0.0387,0.058056,-0.005861,
+ -0.982044,0,0.18865,0.038563,0.055885,-0.005861,
+ -0.952665,0,0.304021,0.038601,0.055885,-0.005713,
+ -0.950786,0.059818,0.304021,0.038635,0.056971,-0.005713,
+ -0.982044,0,0.18865,0.038563,0.055885,-0.005861,
+ -0.950786,0.059818,0.304021,0.038635,0.056971,-0.005713,
+ -0.980106,0.061663,0.18865,0.038597,0.056973,-0.005861,
+ -0.980106,-0.061663,0.18865,0.038597,0.054798,-0.005861,
+ -0.950786,-0.059818,0.304021,0.038635,0.0548,-0.005713,
+ -0.952665,0,0.304021,0.038601,0.055885,-0.005713,
+ -0.980106,-0.061663,0.18865,0.038597,0.054798,-0.005861,
+ -0.952665,0,0.304021,0.038601,0.055885,-0.005713,
+ -0.982044,0,0.18865,0.038563,0.055885,-0.005861,
+ -0.974301,-0.123083,0.18865,0.0387,0.053714,-0.005861,
+ -0.945153,-0.119401,0.304021,0.038737,0.053719,-0.005713,
+ -0.950786,-0.059818,0.304021,0.038635,0.0548,-0.005713,
+ -0.974301,-0.123083,0.18865,0.0387,0.053714,-0.005861,
+ -0.950786,-0.059818,0.304021,0.038635,0.0548,-0.005713,
+ -0.980106,-0.061663,0.18865,0.038597,0.054798,-0.005861,
+ -0.96465,-0.184017,0.18865,0.03887,0.05264,-0.005861,
+ -0.935791,-0.178512,0.304021,0.038907,0.052646,-0.005713,
+ -0.945153,-0.119401,0.304021,0.038737,0.053719,-0.005713,
+ -0.96465,-0.184017,0.18865,0.03887,0.05264,-0.005861,
+ -0.945153,-0.119401,0.304021,0.038737,0.053719,-0.005713,
+ -0.974301,-0.123083,0.18865,0.0387,0.053714,-0.005861,
+ -0.951192,-0.244224,0.18865,0.039107,0.051578,-0.005861,
+ -0.922736,-0.236918,0.304021,0.039144,0.051587,-0.005713,
+ -0.935791,-0.178512,0.304021,0.038907,0.052646,-0.005713,
+ -0.951192,-0.244224,0.18865,0.039107,0.051578,-0.005861,
+ -0.935791,-0.178512,0.304021,0.038907,0.052646,-0.005713,
+ -0.96465,-0.184017,0.18865,0.03887,0.05264,-0.005861,
+ -0.922736,-0.236918,0.304021,0.039144,0.051587,-0.005713,
+ -0.881202,-0.226254,0.415082,0.039198,0.051601,-0.00557,
+ -0.893669,-0.170477,0.415082,0.038961,0.052657,-0.00557,
+ -0.922736,-0.236918,0.304021,0.039144,0.051587,-0.005713,
+ -0.893669,-0.170477,0.415082,0.038961,0.052657,-0.00557,
+ -0.935791,-0.178512,0.304021,0.038907,0.052646,-0.005713,
+ -0.906039,-0.29439,0.304021,0.039447,0.050544,-0.005713,
+ -0.865256,-0.281139,0.415082,0.0395,0.050561,-0.00557,
+ -0.881202,-0.226254,0.415082,0.039198,0.051601,-0.00557,
+ -0.906039,-0.29439,0.304021,0.039447,0.050544,-0.005713,
+ -0.881202,-0.226254,0.415082,0.039198,0.051601,-0.00557,
+ -0.922736,-0.236918,0.304021,0.039144,0.051587,-0.005713,
+ -0.885766,-0.3507,0.304021,0.039815,0.049522,-0.005713,
+ -0.845896,-0.334914,0.415082,0.039866,0.049543,-0.00557,
+ -0.865256,-0.281139,0.415082,0.0395,0.050561,-0.00557,
+ -0.885766,-0.3507,0.304021,0.039815,0.049522,-0.005713,
+ -0.865256,-0.281139,0.415082,0.0395,0.050561,-0.00557,
+ -0.906039,-0.29439,0.304021,0.039447,0.050544,-0.005713,
+ -0.861997,-0.405625,0.304021,0.040246,0.048526,-0.005713,
+ -0.823197,-0.387367,0.415082,0.040296,0.048549,-0.00557,
+ -0.845896,-0.334914,0.415082,0.039866,0.049543,-0.00557,
+ -0.861997,-0.405625,0.304021,0.040246,0.048526,-0.005713,
+ -0.845896,-0.334914,0.415082,0.039866,0.049543,-0.00557,
+ -0.885766,-0.3507,0.304021,0.039815,0.049522,-0.005713,
+ -0.834827,-0.45895,0.304021,0.040739,0.047559,-0.005713,
+ -0.79725,-0.438292,0.415082,0.040787,0.047585,-0.00557,
+ -0.823197,-0.387367,0.415082,0.040296,0.048549,-0.00557,
+ -0.834827,-0.45895,0.304021,0.040739,0.047559,-0.005713,
+ -0.823197,-0.387367,0.415082,0.040296,0.048549,-0.00557,
+ -0.861997,-0.405625,0.304021,0.040246,0.048526,-0.005713,
+ -0.804362,-0.510464,0.304021,0.041292,0.046624,-0.005713,
+ -0.768156,-0.487487,0.415082,0.041338,0.046653,-0.00557,
+ -0.79725,-0.438292,0.415082,0.040787,0.047585,-0.00557,
+ -0.804362,-0.510464,0.304021,0.041292,0.046624,-0.005713,
+ -0.79725,-0.438292,0.415082,0.040787,0.047585,-0.00557,
+ -0.834827,-0.45895,0.304021,0.040739,0.047559,-0.005713,
+ -0.770723,-0.559963,0.304021,0.041902,0.045726,-0.005713,
+ -0.736031,-0.534758,0.415082,0.041947,0.045758,-0.00557,
+ -0.768156,-0.487487,0.415082,0.041338,0.046653,-0.00557,
+ -0.770723,-0.559963,0.304021,0.041902,0.045726,-0.005713,
+ -0.768156,-0.487487,0.415082,0.041338,0.046653,-0.00557,
+ -0.804362,-0.510464,0.304021,0.041292,0.046624,-0.005713,
+ -0.734041,-0.607252,0.304021,0.042568,0.044868,-0.005713,
+ -0.701001,-0.579918,0.415082,0.04261,0.044903,-0.00557,
+ -0.736031,-0.534758,0.415082,0.041947,0.045758,-0.00557,
+ -0.734041,-0.607252,0.304021,0.042568,0.044868,-0.005713,
+ -0.736031,-0.534758,0.415082,0.041947,0.045758,-0.00557,
+ -0.770723,-0.559963,0.304021,0.041902,0.045726,-0.005713,
+ -0.694463,-0.652144,0.304021,0.043286,0.044053,-0.005713,
+ -0.663204,-0.62279,0.415082,0.043326,0.044091,-0.00557,
+ -0.701001,-0.579918,0.415082,0.04261,0.044903,-0.00557,
+ -0.694463,-0.652144,0.304021,0.043286,0.044053,-0.005713,
+ -0.701001,-0.579918,0.415082,0.04261,0.044903,-0.00557,
+ -0.734041,-0.607252,0.304021,0.042568,0.044868,-0.005713,
+ -0.652144,-0.694463,0.304021,0.044053,0.043286,-0.005713,
+ -0.62279,-0.663204,0.415082,0.044091,0.043326,-0.00557,
+ -0.663204,-0.62279,0.415082,0.043326,0.044091,-0.00557,
+ -0.652144,-0.694463,0.304021,0.044053,0.043286,-0.005713,
+ -0.663204,-0.62279,0.415082,0.043326,0.044091,-0.00557,
+ -0.694463,-0.652144,0.304021,0.043286,0.044053,-0.005713,
+ -0.607252,-0.734041,0.304021,0.044868,0.042568,-0.005713,
+ -0.579918,-0.701001,0.415082,0.044903,0.04261,-0.00557,
+ -0.62279,-0.663204,0.415082,0.044091,0.043326,-0.00557,
+ -0.607252,-0.734041,0.304021,0.044868,0.042568,-0.005713,
+ -0.62279,-0.663204,0.415082,0.044091,0.043326,-0.00557,
+ -0.652144,-0.694463,0.304021,0.044053,0.043286,-0.005713,
+ -0.559963,-0.770723,0.304021,0.045726,0.041902,-0.005713,
+ -0.534758,-0.736031,0.415082,0.045758,0.041947,-0.00557,
+ -0.579918,-0.701001,0.415082,0.044903,0.04261,-0.00557,
+ -0.559963,-0.770723,0.304021,0.045726,0.041902,-0.005713,
+ -0.579918,-0.701001,0.415082,0.044903,0.04261,-0.00557,
+ -0.607252,-0.734041,0.304021,0.044868,0.042568,-0.005713,
+ -0.510464,-0.804362,0.304021,0.046624,0.041292,-0.005713,
+ -0.487487,-0.768156,0.415082,0.046653,0.041338,-0.00557,
+ -0.534758,-0.736031,0.415082,0.045758,0.041947,-0.00557,
+ -0.510464,-0.804362,0.304021,0.046624,0.041292,-0.005713,
+ -0.534758,-0.736031,0.415082,0.045758,0.041947,-0.00557,
+ -0.559963,-0.770723,0.304021,0.045726,0.041902,-0.005713,
+ -0.45895,-0.834827,0.304021,0.047559,0.040739,-0.005713,
+ -0.438292,-0.79725,0.415082,0.047585,0.040787,-0.00557,
+ -0.487487,-0.768156,0.415082,0.046653,0.041338,-0.00557,
+ -0.45895,-0.834827,0.304021,0.047559,0.040739,-0.005713,
+ -0.487487,-0.768156,0.415082,0.046653,0.041338,-0.00557,
+ -0.510464,-0.804362,0.304021,0.046624,0.041292,-0.005713,
+ -0.405625,-0.861997,0.304021,0.048526,0.040246,-0.005713,
+ -0.387367,-0.823197,0.415082,0.048549,0.040296,-0.00557,
+ -0.438292,-0.79725,0.415082,0.047585,0.040787,-0.00557,
+ -0.405625,-0.861997,0.304021,0.048526,0.040246,-0.005713,
+ -0.438292,-0.79725,0.415082,0.047585,0.040787,-0.00557,
+ -0.45895,-0.834827,0.304021,0.047559,0.040739,-0.005713,
+ -0.3507,-0.885766,0.304021,0.049522,0.039815,-0.005713,
+ -0.334914,-0.845896,0.415082,0.049543,0.039866,-0.00557,
+ -0.387367,-0.823197,0.415082,0.048549,0.040296,-0.00557,
+ -0.3507,-0.885766,0.304021,0.049522,0.039815,-0.005713,
+ -0.387367,-0.823197,0.415082,0.048549,0.040296,-0.00557,
+ -0.405625,-0.861997,0.304021,0.048526,0.040246,-0.005713,
+ -0.29439,-0.906039,0.304021,0.050544,0.039447,-0.005713,
+ -0.281139,-0.865256,0.415082,0.050561,0.0395,-0.00557,
+ -0.334914,-0.845896,0.415082,0.049543,0.039866,-0.00557,
+ -0.29439,-0.906039,0.304021,0.050544,0.039447,-0.005713,
+ -0.334914,-0.845896,0.415082,0.049543,0.039866,-0.00557,
+ -0.3507,-0.885766,0.304021,0.049522,0.039815,-0.005713,
+ -0.236918,-0.922736,0.304021,0.051587,0.039144,-0.005713,
+ -0.226254,-0.881202,0.415082,0.051601,0.039198,-0.00557,
+ -0.281139,-0.865256,0.415082,0.050561,0.0395,-0.00557,
+ -0.236918,-0.922736,0.304021,0.051587,0.039144,-0.005713,
+ -0.281139,-0.865256,0.415082,0.050561,0.0395,-0.00557,
+ -0.29439,-0.906039,0.304021,0.050544,0.039447,-0.005713,
+ -0.178512,-0.935791,0.304021,0.052646,0.038907,-0.005713,
+ -0.170477,-0.893669,0.415082,0.052657,0.038961,-0.00557,
+ -0.226254,-0.881202,0.415082,0.051601,0.039198,-0.00557,
+ -0.178512,-0.935791,0.304021,0.052646,0.038907,-0.005713,
+ -0.226254,-0.881202,0.415082,0.051601,0.039198,-0.00557,
+ -0.236918,-0.922736,0.304021,0.051587,0.039144,-0.005713,
+ -0.119401,-0.945153,0.304021,0.053719,0.038737,-0.005713,
+ -0.114026,-0.90261,0.415082,0.053726,0.038792,-0.00557,
+ -0.170477,-0.893669,0.415082,0.052657,0.038961,-0.00557,
+ -0.119401,-0.945153,0.304021,0.053719,0.038737,-0.005713,
+ -0.170477,-0.893669,0.415082,0.052657,0.038961,-0.00557,
+ -0.178512,-0.935791,0.304021,0.052646,0.038907,-0.005713,
+ -0.059818,-0.950786,0.304021,0.0548,0.038635,-0.005713,
+ -0.057126,-0.907989,0.415082,0.054803,0.03869,-0.00557,
+ -0.114026,-0.90261,0.415082,0.053726,0.038792,-0.00557,
+ -0.059818,-0.950786,0.304021,0.0548,0.038635,-0.005713,
+ -0.114026,-0.90261,0.415082,0.053726,0.038792,-0.00557,
+ -0.119401,-0.945153,0.304021,0.053719,0.038737,-0.005713,
+ 0,-0.952665,0.304021,0.055885,0.038601,-0.005713,
+ 0,-0.909784,0.415082,0.055885,0.038656,-0.00557,
+ -0.057126,-0.907989,0.415082,0.054803,0.03869,-0.00557,
+ 0,-0.952665,0.304021,0.055885,0.038601,-0.005713,
+ -0.057126,-0.907989,0.415082,0.054803,0.03869,-0.00557,
+ -0.059818,-0.950786,0.304021,0.0548,0.038635,-0.005713,
+ 0.059818,-0.950786,0.304021,0.056971,0.038635,-0.005713,
+ 0.057126,-0.907989,0.415082,0.056967,0.03869,-0.00557,
+ 0,-0.909784,0.415082,0.055885,0.038656,-0.00557,
+ 0.059818,-0.950786,0.304021,0.056971,0.038635,-0.005713,
+ 0,-0.909784,0.415082,0.055885,0.038656,-0.00557,
+ 0,-0.952665,0.304021,0.055885,0.038601,-0.005713,
+ 0.119401,-0.945153,0.304021,0.058052,0.038737,-0.005713,
+ 0.114026,-0.90261,0.415082,0.058045,0.038792,-0.00557,
+ 0.057126,-0.907989,0.415082,0.056967,0.03869,-0.00557,
+ 0.119401,-0.945153,0.304021,0.058052,0.038737,-0.005713,
+ 0.057126,-0.907989,0.415082,0.056967,0.03869,-0.00557,
+ 0.059818,-0.950786,0.304021,0.056971,0.038635,-0.005713,
+ 0.178512,-0.935791,0.304021,0.059124,0.038907,-0.005713,
+ 0.170477,-0.893669,0.415082,0.059114,0.038961,-0.00557,
+ 0.114026,-0.90261,0.415082,0.058045,0.038792,-0.00557,
+ 0.178512,-0.935791,0.304021,0.059124,0.038907,-0.005713,
+ 0.114026,-0.90261,0.415082,0.058045,0.038792,-0.00557,
+ 0.119401,-0.945153,0.304021,0.058052,0.038737,-0.005713,
+ 0.236918,-0.922736,0.304021,0.060184,0.039144,-0.005713,
+ 0.226254,-0.881202,0.415082,0.06017,0.039198,-0.00557,
+ 0.170477,-0.893669,0.415082,0.059114,0.038961,-0.00557,
+ 0.236918,-0.922736,0.304021,0.060184,0.039144,-0.005713,
+ 0.170477,-0.893669,0.415082,0.059114,0.038961,-0.00557,
+ 0.178512,-0.935791,0.304021,0.059124,0.038907,-0.005713,
+ 0.29439,-0.906039,0.304021,0.061226,0.039447,-0.005713,
+ 0.281139,-0.865256,0.415082,0.061209,0.0395,-0.00557,
+ 0.226254,-0.881202,0.415082,0.06017,0.039198,-0.00557,
+ 0.29439,-0.906039,0.304021,0.061226,0.039447,-0.005713,
+ 0.226254,-0.881202,0.415082,0.06017,0.039198,-0.00557,
+ 0.236918,-0.922736,0.304021,0.060184,0.039144,-0.005713,
+ 0.3507,-0.885766,0.304021,0.062248,0.039815,-0.005713,
+ 0.334914,-0.845896,0.415082,0.062228,0.039866,-0.00557,
+ 0.281139,-0.865256,0.415082,0.061209,0.0395,-0.00557,
+ 0.3507,-0.885766,0.304021,0.062248,0.039815,-0.005713,
+ 0.281139,-0.865256,0.415082,0.061209,0.0395,-0.00557,
+ 0.29439,-0.906039,0.304021,0.061226,0.039447,-0.005713,
+ 0.405625,-0.861997,0.304021,0.063245,0.040246,-0.005713,
+ 0.387367,-0.823197,0.415082,0.063221,0.040296,-0.00557,
+ 0.334914,-0.845896,0.415082,0.062228,0.039866,-0.00557,
+ 0.405625,-0.861997,0.304021,0.063245,0.040246,-0.005713,
+ 0.334914,-0.845896,0.415082,0.062228,0.039866,-0.00557,
+ 0.3507,-0.885766,0.304021,0.062248,0.039815,-0.005713,
+ 0.45895,-0.834827,0.304021,0.064212,0.040739,-0.005713,
+ 0.438292,-0.79725,0.415082,0.064185,0.040787,-0.00557,
+ 0.387367,-0.823197,0.415082,0.063221,0.040296,-0.00557,
+ 0.45895,-0.834827,0.304021,0.064212,0.040739,-0.005713,
+ 0.387367,-0.823197,0.415082,0.063221,0.040296,-0.00557,
+ 0.405625,-0.861997,0.304021,0.063245,0.040246,-0.005713,
+ 0.510464,-0.804362,0.304021,0.065147,0.041292,-0.005713,
+ 0.487487,-0.768156,0.415082,0.065117,0.041338,-0.00557,
+ 0.438292,-0.79725,0.415082,0.064185,0.040787,-0.00557,
+ 0.510464,-0.804362,0.304021,0.065147,0.041292,-0.005713,
+ 0.438292,-0.79725,0.415082,0.064185,0.040787,-0.00557,
+ 0.45895,-0.834827,0.304021,0.064212,0.040739,-0.005713,
+ 0.559963,-0.770723,0.304021,0.066045,0.041902,-0.005713,
+ 0.534758,-0.736031,0.415082,0.066012,0.041947,-0.00557,
+ 0.487487,-0.768156,0.415082,0.065117,0.041338,-0.00557,
+ 0.559963,-0.770723,0.304021,0.066045,0.041902,-0.005713,
+ 0.487487,-0.768156,0.415082,0.065117,0.041338,-0.00557,
+ 0.510464,-0.804362,0.304021,0.065147,0.041292,-0.005713,
+ 0.607252,-0.734041,0.304021,0.066903,0.042568,-0.005713,
+ 0.579918,-0.701001,0.415082,0.066868,0.04261,-0.00557,
+ 0.534758,-0.736031,0.415082,0.066012,0.041947,-0.00557,
+ 0.607252,-0.734041,0.304021,0.066903,0.042568,-0.005713,
+ 0.534758,-0.736031,0.415082,0.066012,0.041947,-0.00557,
+ 0.559963,-0.770723,0.304021,0.066045,0.041902,-0.005713,
+ 0.652144,-0.694463,0.304021,0.067717,0.043286,-0.005713,
+ 0.62279,-0.663204,0.415082,0.067679,0.043326,-0.00557,
+ 0.579918,-0.701001,0.415082,0.066868,0.04261,-0.00557,
+ 0.652144,-0.694463,0.304021,0.067717,0.043286,-0.005713,
+ 0.579918,-0.701001,0.415082,0.066868,0.04261,-0.00557,
+ 0.607252,-0.734041,0.304021,0.066903,0.042568,-0.005713,
+ 0.694463,-0.652144,0.304021,0.068485,0.044053,-0.005713,
+ 0.663204,-0.62279,0.415082,0.068445,0.044091,-0.00557,
+ 0.62279,-0.663204,0.415082,0.067679,0.043326,-0.00557,
+ 0.694463,-0.652144,0.304021,0.068485,0.044053,-0.005713,
+ 0.62279,-0.663204,0.415082,0.067679,0.043326,-0.00557,
+ 0.652144,-0.694463,0.304021,0.067717,0.043286,-0.005713,
+ 0.734041,-0.607252,0.304021,0.069203,0.044868,-0.005713,
+ 0.701001,-0.579918,0.415082,0.069161,0.044903,-0.00557,
+ 0.663204,-0.62279,0.415082,0.068445,0.044091,-0.00557,
+ 0.734041,-0.607252,0.304021,0.069203,0.044868,-0.005713,
+ 0.663204,-0.62279,0.415082,0.068445,0.044091,-0.00557,
+ 0.694463,-0.652144,0.304021,0.068485,0.044053,-0.005713,
+ 0.770723,-0.559963,0.304021,0.069869,0.045726,-0.005713,
+ 0.736031,-0.534758,0.415082,0.069824,0.045758,-0.00557,
+ 0.701001,-0.579918,0.415082,0.069161,0.044903,-0.00557,
+ 0.770723,-0.559963,0.304021,0.069869,0.045726,-0.005713,
+ 0.701001,-0.579918,0.415082,0.069161,0.044903,-0.00557,
+ 0.734041,-0.607252,0.304021,0.069203,0.044868,-0.005713,
+ 0.804362,-0.510464,0.304021,0.070479,0.046624,-0.005713,
+ 0.768156,-0.487487,0.415082,0.070432,0.046653,-0.00557,
+ 0.736031,-0.534758,0.415082,0.069824,0.045758,-0.00557,
+ 0.804362,-0.510464,0.304021,0.070479,0.046624,-0.005713,
+ 0.736031,-0.534758,0.415082,0.069824,0.045758,-0.00557,
+ 0.770723,-0.559963,0.304021,0.069869,0.045726,-0.005713,
+ 0.834827,-0.45895,0.304021,0.071032,0.047559,-0.005713,
+ 0.79725,-0.438292,0.415082,0.070983,0.047585,-0.00557,
+ 0.768156,-0.487487,0.415082,0.070432,0.046653,-0.00557,
+ 0.834827,-0.45895,0.304021,0.071032,0.047559,-0.005713,
+ 0.768156,-0.487487,0.415082,0.070432,0.046653,-0.00557,
+ 0.804362,-0.510464,0.304021,0.070479,0.046624,-0.005713,
+ 0.861997,-0.405625,0.304021,0.071525,0.048526,-0.005713,
+ 0.823197,-0.387367,0.415082,0.071475,0.048549,-0.00557,
+ 0.79725,-0.438292,0.415082,0.070983,0.047585,-0.00557,
+ 0.861997,-0.405625,0.304021,0.071525,0.048526,-0.005713,
+ 0.79725,-0.438292,0.415082,0.070983,0.047585,-0.00557,
+ 0.834827,-0.45895,0.304021,0.071032,0.047559,-0.005713,
+ 0.885766,-0.3507,0.304021,0.071956,0.049522,-0.005713,
+ 0.845896,-0.334914,0.415082,0.071905,0.049543,-0.00557,
+ 0.823197,-0.387367,0.415082,0.071475,0.048549,-0.00557,
+ 0.885766,-0.3507,0.304021,0.071956,0.049522,-0.005713,
+ 0.823197,-0.387367,0.415082,0.071475,0.048549,-0.00557,
+ 0.861997,-0.405625,0.304021,0.071525,0.048526,-0.005713,
+ 0.906039,-0.29439,0.304021,0.072324,0.050544,-0.005713,
+ 0.865256,-0.281139,0.415082,0.072271,0.050561,-0.00557,
+ 0.845896,-0.334914,0.415082,0.071905,0.049543,-0.00557,
+ 0.906039,-0.29439,0.304021,0.072324,0.050544,-0.005713,
+ 0.845896,-0.334914,0.415082,0.071905,0.049543,-0.00557,
+ 0.885766,-0.3507,0.304021,0.071956,0.049522,-0.005713,
+ 0.922736,-0.236918,0.304021,0.072627,0.051587,-0.005713,
+ 0.881202,-0.226254,0.415082,0.072573,0.051601,-0.00557,
+ 0.865256,-0.281139,0.415082,0.072271,0.050561,-0.00557,
+ 0.922736,-0.236918,0.304021,0.072627,0.051587,-0.005713,
+ 0.865256,-0.281139,0.415082,0.072271,0.050561,-0.00557,
+ 0.906039,-0.29439,0.304021,0.072324,0.050544,-0.005713,
+ 0.935791,-0.178512,0.304021,0.072863,0.052646,-0.005713,
+ 0.893669,-0.170477,0.415082,0.072809,0.052657,-0.00557,
+ 0.881202,-0.226254,0.415082,0.072573,0.051601,-0.00557,
+ 0.935791,-0.178512,0.304021,0.072863,0.052646,-0.005713,
+ 0.881202,-0.226254,0.415082,0.072573,0.051601,-0.00557,
+ 0.922736,-0.236918,0.304021,0.072627,0.051587,-0.005713,
+ 0.945153,-0.119401,0.304021,0.073033,0.053719,-0.005713,
+ 0.90261,-0.114026,0.415082,0.072978,0.053726,-0.00557,
+ 0.893669,-0.170477,0.415082,0.072809,0.052657,-0.00557,
+ 0.945153,-0.119401,0.304021,0.073033,0.053719,-0.005713,
+ 0.893669,-0.170477,0.415082,0.072809,0.052657,-0.00557,
+ 0.935791,-0.178512,0.304021,0.072863,0.052646,-0.005713,
+ 0.950786,-0.059818,0.304021,0.073135,0.0548,-0.005713,
+ 0.907989,-0.057126,0.415082,0.07308,0.054803,-0.00557,
+ 0.90261,-0.114026,0.415082,0.072978,0.053726,-0.00557,
+ 0.950786,-0.059818,0.304021,0.073135,0.0548,-0.005713,
+ 0.90261,-0.114026,0.415082,0.072978,0.053726,-0.00557,
+ 0.945153,-0.119401,0.304021,0.073033,0.053719,-0.005713,
+ 0.952665,0,0.304021,0.073169,0.055885,-0.005713,
+ 0.909784,0,0.415082,0.073114,0.055885,-0.00557,
+ 0.907989,-0.057126,0.415082,0.07308,0.054803,-0.00557,
+ 0.952665,0,0.304021,0.073169,0.055885,-0.005713,
+ 0.907989,-0.057126,0.415082,0.07308,0.054803,-0.00557,
+ 0.950786,-0.059818,0.304021,0.073135,0.0548,-0.005713,
+ 0.950786,0.059818,0.304021,0.073135,0.056971,-0.005713,
+ 0.907989,0.057126,0.415082,0.07308,0.056967,-0.00557,
+ 0.909784,0,0.415082,0.073114,0.055885,-0.00557,
+ 0.950786,0.059818,0.304021,0.073135,0.056971,-0.005713,
+ 0.909784,0,0.415082,0.073114,0.055885,-0.00557,
+ 0.952665,0,0.304021,0.073169,0.055885,-0.005713,
+ 0.945153,0.119401,0.304021,0.073033,0.058052,-0.005713,
+ 0.90261,0.114026,0.415082,0.072978,0.058045,-0.00557,
+ 0.907989,0.057126,0.415082,0.07308,0.056967,-0.00557,
+ 0.945153,0.119401,0.304021,0.073033,0.058052,-0.005713,
+ 0.907989,0.057126,0.415082,0.07308,0.056967,-0.00557,
+ 0.950786,0.059818,0.304021,0.073135,0.056971,-0.005713,
+ 0.935791,0.178512,0.304021,0.072863,0.059124,-0.005713,
+ 0.893669,0.170477,0.415082,0.072809,0.059114,-0.00557,
+ 0.90261,0.114026,0.415082,0.072978,0.058045,-0.00557,
+ 0.935791,0.178512,0.304021,0.072863,0.059124,-0.005713,
+ 0.90261,0.114026,0.415082,0.072978,0.058045,-0.00557,
+ 0.945153,0.119401,0.304021,0.073033,0.058052,-0.005713,
+ 0.922736,0.236918,0.304021,0.072627,0.060184,-0.005713,
+ 0.881202,0.226254,0.415082,0.072573,0.06017,-0.00557,
+ 0.893669,0.170477,0.415082,0.072809,0.059114,-0.00557,
+ 0.922736,0.236918,0.304021,0.072627,0.060184,-0.005713,
+ 0.893669,0.170477,0.415082,0.072809,0.059114,-0.00557,
+ 0.935791,0.178512,0.304021,0.072863,0.059124,-0.005713,
+ 0.906039,0.29439,0.304021,0.072324,0.061226,-0.005713,
+ 0.865256,0.281139,0.415082,0.072271,0.061209,-0.00557,
+ 0.881202,0.226254,0.415082,0.072573,0.06017,-0.00557,
+ 0.906039,0.29439,0.304021,0.072324,0.061226,-0.005713,
+ 0.881202,0.226254,0.415082,0.072573,0.06017,-0.00557,
+ 0.922736,0.236918,0.304021,0.072627,0.060184,-0.005713,
+ 0.885766,0.3507,0.304021,0.071956,0.062248,-0.005713,
+ 0.845896,0.334914,0.415082,0.071905,0.062228,-0.00557,
+ 0.865256,0.281139,0.415082,0.072271,0.061209,-0.00557,
+ 0.885766,0.3507,0.304021,0.071956,0.062248,-0.005713,
+ 0.865256,0.281139,0.415082,0.072271,0.061209,-0.00557,
+ 0.906039,0.29439,0.304021,0.072324,0.061226,-0.005713,
+ 0.861997,0.405625,0.304021,0.071525,0.063245,-0.005713,
+ 0.823197,0.387367,0.415082,0.071475,0.063221,-0.00557,
+ 0.845896,0.334914,0.415082,0.071905,0.062228,-0.00557,
+ 0.861997,0.405625,0.304021,0.071525,0.063245,-0.005713,
+ 0.845896,0.334914,0.415082,0.071905,0.062228,-0.00557,
+ 0.885766,0.3507,0.304021,0.071956,0.062248,-0.005713,
+ 0.834827,0.45895,0.304021,0.071032,0.064212,-0.005713,
+ 0.79725,0.438292,0.415082,0.070983,0.064185,-0.00557,
+ 0.823197,0.387367,0.415082,0.071475,0.063221,-0.00557,
+ 0.834827,0.45895,0.304021,0.071032,0.064212,-0.005713,
+ 0.823197,0.387367,0.415082,0.071475,0.063221,-0.00557,
+ 0.861997,0.405625,0.304021,0.071525,0.063245,-0.005713,
+ 0.804362,0.510464,0.304021,0.070479,0.065147,-0.005713,
+ 0.768156,0.487487,0.415082,0.070432,0.065117,-0.00557,
+ 0.79725,0.438292,0.415082,0.070983,0.064185,-0.00557,
+ 0.804362,0.510464,0.304021,0.070479,0.065147,-0.005713,
+ 0.79725,0.438292,0.415082,0.070983,0.064185,-0.00557,
+ 0.834827,0.45895,0.304021,0.071032,0.064212,-0.005713,
+ 0.770723,0.559963,0.304021,0.069869,0.066045,-0.005713,
+ 0.736031,0.534758,0.415082,0.069824,0.066012,-0.00557,
+ 0.768156,0.487487,0.415082,0.070432,0.065117,-0.00557,
+ 0.770723,0.559963,0.304021,0.069869,0.066045,-0.005713,
+ 0.768156,0.487487,0.415082,0.070432,0.065117,-0.00557,
+ 0.804362,0.510464,0.304021,0.070479,0.065147,-0.005713,
+ 0.734041,0.607252,0.304021,0.069203,0.066903,-0.005713,
+ 0.701001,0.579918,0.415082,0.069161,0.066868,-0.00557,
+ 0.736031,0.534758,0.415082,0.069824,0.066012,-0.00557,
+ 0.734041,0.607252,0.304021,0.069203,0.066903,-0.005713,
+ 0.736031,0.534758,0.415082,0.069824,0.066012,-0.00557,
+ 0.770723,0.559963,0.304021,0.069869,0.066045,-0.005713,
+ 0.694463,0.652144,0.304021,0.068485,0.067717,-0.005713,
+ 0.663204,0.62279,0.415082,0.068445,0.067679,-0.00557,
+ 0.701001,0.579918,0.415082,0.069161,0.066868,-0.00557,
+ 0.694463,0.652144,0.304021,0.068485,0.067717,-0.005713,
+ 0.701001,0.579918,0.415082,0.069161,0.066868,-0.00557,
+ 0.734041,0.607252,0.304021,0.069203,0.066903,-0.005713,
+ 0.652144,0.694463,0.304021,0.067717,0.068485,-0.005713,
+ 0.62279,0.663204,0.415082,0.067679,0.068445,-0.00557,
+ 0.663204,0.62279,0.415082,0.068445,0.067679,-0.00557,
+ 0.652144,0.694463,0.304021,0.067717,0.068485,-0.005713,
+ 0.663204,0.62279,0.415082,0.068445,0.067679,-0.00557,
+ 0.694463,0.652144,0.304021,0.068485,0.067717,-0.005713,
+ 0.607252,0.734041,0.304021,0.066903,0.069203,-0.005713,
+ 0.579918,0.701001,0.415082,0.066868,0.069161,-0.00557,
+ 0.62279,0.663204,0.415082,0.067679,0.068445,-0.00557,
+ 0.607252,0.734041,0.304021,0.066903,0.069203,-0.005713,
+ 0.62279,0.663204,0.415082,0.067679,0.068445,-0.00557,
+ 0.652144,0.694463,0.304021,0.067717,0.068485,-0.005713,
+ 0.559963,0.770723,0.304021,0.066045,0.069869,-0.005713,
+ 0.534758,0.736031,0.415082,0.066012,0.069824,-0.00557,
+ 0.579918,0.701001,0.415082,0.066868,0.069161,-0.00557,
+ 0.559963,0.770723,0.304021,0.066045,0.069869,-0.005713,
+ 0.579918,0.701001,0.415082,0.066868,0.069161,-0.00557,
+ 0.607252,0.734041,0.304021,0.066903,0.069203,-0.005713,
+ 0.510464,0.804362,0.304021,0.065147,0.070479,-0.005713,
+ 0.487487,0.768156,0.415082,0.065117,0.070432,-0.00557,
+ 0.534758,0.736031,0.415082,0.066012,0.069824,-0.00557,
+ 0.510464,0.804362,0.304021,0.065147,0.070479,-0.005713,
+ 0.534758,0.736031,0.415082,0.066012,0.069824,-0.00557,
+ 0.559963,0.770723,0.304021,0.066045,0.069869,-0.005713,
+ 0.45895,0.834827,0.304021,0.064212,0.071032,-0.005713,
+ 0.438292,0.79725,0.415082,0.064185,0.070983,-0.00557,
+ 0.487487,0.768156,0.415082,0.065117,0.070432,-0.00557,
+ 0.45895,0.834827,0.304021,0.064212,0.071032,-0.005713,
+ 0.487487,0.768156,0.415082,0.065117,0.070432,-0.00557,
+ 0.510464,0.804362,0.304021,0.065147,0.070479,-0.005713,
+ 0.405625,0.861997,0.304021,0.063245,0.071525,-0.005713,
+ 0.387367,0.823197,0.415082,0.063221,0.071475,-0.00557,
+ 0.438292,0.79725,0.415082,0.064185,0.070983,-0.00557,
+ 0.405625,0.861997,0.304021,0.063245,0.071525,-0.005713,
+ 0.438292,0.79725,0.415082,0.064185,0.070983,-0.00557,
+ 0.45895,0.834827,0.304021,0.064212,0.071032,-0.005713,
+ 0.3507,0.885766,0.304021,0.062248,0.071956,-0.005713,
+ 0.334914,0.845896,0.415082,0.062228,0.071905,-0.00557,
+ 0.387367,0.823197,0.415082,0.063221,0.071475,-0.00557,
+ 0.3507,0.885766,0.304021,0.062248,0.071956,-0.005713,
+ 0.387367,0.823197,0.415082,0.063221,0.071475,-0.00557,
+ 0.405625,0.861997,0.304021,0.063245,0.071525,-0.005713,
+ 0.29439,0.906039,0.304021,0.061226,0.072324,-0.005713,
+ 0.281139,0.865256,0.415082,0.061209,0.072271,-0.00557,
+ 0.334914,0.845896,0.415082,0.062228,0.071905,-0.00557,
+ 0.29439,0.906039,0.304021,0.061226,0.072324,-0.005713,
+ 0.334914,0.845896,0.415082,0.062228,0.071905,-0.00557,
+ 0.3507,0.885766,0.304021,0.062248,0.071956,-0.005713,
+ 0.236918,0.922736,0.304021,0.060184,0.072627,-0.005713,
+ 0.226254,0.881202,0.415082,0.06017,0.072573,-0.00557,
+ 0.281139,0.865256,0.415082,0.061209,0.072271,-0.00557,
+ 0.236918,0.922736,0.304021,0.060184,0.072627,-0.005713,
+ 0.281139,0.865256,0.415082,0.061209,0.072271,-0.00557,
+ 0.29439,0.906039,0.304021,0.061226,0.072324,-0.005713,
+ 0.178512,0.935791,0.304021,0.059124,0.072863,-0.005713,
+ 0.170477,0.893669,0.415082,0.059114,0.072809,-0.00557,
+ 0.226254,0.881202,0.415082,0.06017,0.072573,-0.00557,
+ 0.178512,0.935791,0.304021,0.059124,0.072863,-0.005713,
+ 0.226254,0.881202,0.415082,0.06017,0.072573,-0.00557,
+ 0.236918,0.922736,0.304021,0.060184,0.072627,-0.005713,
+ 0.119401,0.945153,0.304021,0.058052,0.073033,-0.005713,
+ 0.114026,0.90261,0.415082,0.058045,0.072978,-0.00557,
+ 0.170477,0.893669,0.415082,0.059114,0.072809,-0.00557,
+ 0.119401,0.945153,0.304021,0.058052,0.073033,-0.005713,
+ 0.170477,0.893669,0.415082,0.059114,0.072809,-0.00557,
+ 0.178512,0.935791,0.304021,0.059124,0.072863,-0.005713,
+ 0.059818,0.950786,0.304021,0.056971,0.073135,-0.005713,
+ 0.057126,0.907989,0.415082,0.056967,0.07308,-0.00557,
+ 0.114026,0.90261,0.415082,0.058045,0.072978,-0.00557,
+ 0.059818,0.950786,0.304021,0.056971,0.073135,-0.005713,
+ 0.114026,0.90261,0.415082,0.058045,0.072978,-0.00557,
+ 0.119401,0.945153,0.304021,0.058052,0.073033,-0.005713,
+ 0,0.952665,0.304021,0.055885,0.073169,-0.005713,
+ 0,0.909784,0.415082,0.055885,0.073114,-0.00557,
+ 0.057126,0.907989,0.415082,0.056967,0.07308,-0.00557,
+ 0,0.952665,0.304021,0.055885,0.073169,-0.005713,
+ 0.057126,0.907989,0.415082,0.056967,0.07308,-0.00557,
+ 0.059818,0.950786,0.304021,0.056971,0.073135,-0.005713,
+ -0.059818,0.950786,0.304021,0.0548,0.073135,-0.005713,
+ -0.057126,0.907989,0.415082,0.054803,0.07308,-0.00557,
+ 0,0.909784,0.415082,0.055885,0.073114,-0.00557,
+ -0.059818,0.950786,0.304021,0.0548,0.073135,-0.005713,
+ 0,0.909784,0.415082,0.055885,0.073114,-0.00557,
+ 0,0.952665,0.304021,0.055885,0.073169,-0.005713,
+ -0.119401,0.945153,0.304021,0.053719,0.073033,-0.005713,
+ -0.114026,0.90261,0.415082,0.053726,0.072978,-0.00557,
+ -0.057126,0.907989,0.415082,0.054803,0.07308,-0.00557,
+ -0.119401,0.945153,0.304021,0.053719,0.073033,-0.005713,
+ -0.057126,0.907989,0.415082,0.054803,0.07308,-0.00557,
+ -0.059818,0.950786,0.304021,0.0548,0.073135,-0.005713,
+ -0.178512,0.935791,0.304021,0.052646,0.072863,-0.005713,
+ -0.170477,0.893669,0.415082,0.052657,0.072809,-0.00557,
+ -0.114026,0.90261,0.415082,0.053726,0.072978,-0.00557,
+ -0.178512,0.935791,0.304021,0.052646,0.072863,-0.005713,
+ -0.114026,0.90261,0.415082,0.053726,0.072978,-0.00557,
+ -0.119401,0.945153,0.304021,0.053719,0.073033,-0.005713,
+ -0.236918,0.922736,0.304021,0.051587,0.072627,-0.005713,
+ -0.226254,0.881202,0.415082,0.051601,0.072573,-0.00557,
+ -0.170477,0.893669,0.415082,0.052657,0.072809,-0.00557,
+ -0.236918,0.922736,0.304021,0.051587,0.072627,-0.005713,
+ -0.170477,0.893669,0.415082,0.052657,0.072809,-0.00557,
+ -0.178512,0.935791,0.304021,0.052646,0.072863,-0.005713,
+ -0.29439,0.906039,0.304021,0.050544,0.072324,-0.005713,
+ -0.281139,0.865256,0.415082,0.050561,0.072271,-0.00557,
+ -0.226254,0.881202,0.415082,0.051601,0.072573,-0.00557,
+ -0.29439,0.906039,0.304021,0.050544,0.072324,-0.005713,
+ -0.226254,0.881202,0.415082,0.051601,0.072573,-0.00557,
+ -0.236918,0.922736,0.304021,0.051587,0.072627,-0.005713,
+ -0.3507,0.885766,0.304021,0.049522,0.071956,-0.005713,
+ -0.334914,0.845896,0.415082,0.049543,0.071905,-0.00557,
+ -0.281139,0.865256,0.415082,0.050561,0.072271,-0.00557,
+ -0.3507,0.885766,0.304021,0.049522,0.071956,-0.005713,
+ -0.281139,0.865256,0.415082,0.050561,0.072271,-0.00557,
+ -0.29439,0.906039,0.304021,0.050544,0.072324,-0.005713,
+ -0.405625,0.861997,0.304021,0.048526,0.071525,-0.005713,
+ -0.387367,0.823197,0.415082,0.048549,0.071475,-0.00557,
+ -0.334914,0.845896,0.415082,0.049543,0.071905,-0.00557,
+ -0.405625,0.861997,0.304021,0.048526,0.071525,-0.005713,
+ -0.334914,0.845896,0.415082,0.049543,0.071905,-0.00557,
+ -0.3507,0.885766,0.304021,0.049522,0.071956,-0.005713,
+ -0.45895,0.834827,0.304021,0.047559,0.071032,-0.005713,
+ -0.438292,0.79725,0.415082,0.047585,0.070983,-0.00557,
+ -0.387367,0.823197,0.415082,0.048549,0.071475,-0.00557,
+ -0.45895,0.834827,0.304021,0.047559,0.071032,-0.005713,
+ -0.387367,0.823197,0.415082,0.048549,0.071475,-0.00557,
+ -0.405625,0.861997,0.304021,0.048526,0.071525,-0.005713,
+ -0.510464,0.804362,0.304021,0.046624,0.070479,-0.005713,
+ -0.487487,0.768156,0.415082,0.046653,0.070432,-0.00557,
+ -0.438292,0.79725,0.415082,0.047585,0.070983,-0.00557,
+ -0.510464,0.804362,0.304021,0.046624,0.070479,-0.005713,
+ -0.438292,0.79725,0.415082,0.047585,0.070983,-0.00557,
+ -0.45895,0.834827,0.304021,0.047559,0.071032,-0.005713,
+ -0.559963,0.770723,0.304021,0.045726,0.069869,-0.005713,
+ -0.534758,0.736031,0.415082,0.045758,0.069824,-0.00557,
+ -0.487487,0.768156,0.415082,0.046653,0.070432,-0.00557,
+ -0.559963,0.770723,0.304021,0.045726,0.069869,-0.005713,
+ -0.487487,0.768156,0.415082,0.046653,0.070432,-0.00557,
+ -0.510464,0.804362,0.304021,0.046624,0.070479,-0.005713,
+ -0.607252,0.734041,0.304021,0.044868,0.069203,-0.005713,
+ -0.579918,0.701001,0.415082,0.044903,0.069161,-0.00557,
+ -0.534758,0.736031,0.415082,0.045758,0.069824,-0.00557,
+ -0.607252,0.734041,0.304021,0.044868,0.069203,-0.005713,
+ -0.534758,0.736031,0.415082,0.045758,0.069824,-0.00557,
+ -0.559963,0.770723,0.304021,0.045726,0.069869,-0.005713,
+ -0.652144,0.694463,0.304021,0.044053,0.068485,-0.005713,
+ -0.62279,0.663204,0.415082,0.044091,0.068445,-0.00557,
+ -0.579918,0.701001,0.415082,0.044903,0.069161,-0.00557,
+ -0.652144,0.694463,0.304021,0.044053,0.068485,-0.005713,
+ -0.579918,0.701001,0.415082,0.044903,0.069161,-0.00557,
+ -0.607252,0.734041,0.304021,0.044868,0.069203,-0.005713,
+ -0.694463,0.652144,0.304021,0.043286,0.067717,-0.005713,
+ -0.663204,0.62279,0.415082,0.043326,0.067679,-0.00557,
+ -0.62279,0.663204,0.415082,0.044091,0.068445,-0.00557,
+ -0.694463,0.652144,0.304021,0.043286,0.067717,-0.005713,
+ -0.62279,0.663204,0.415082,0.044091,0.068445,-0.00557,
+ -0.652144,0.694463,0.304021,0.044053,0.068485,-0.005713,
+ -0.734041,0.607252,0.304021,0.042568,0.066903,-0.005713,
+ -0.701001,0.579918,0.415082,0.04261,0.066868,-0.00557,
+ -0.663204,0.62279,0.415082,0.043326,0.067679,-0.00557,
+ -0.734041,0.607252,0.304021,0.042568,0.066903,-0.005713,
+ -0.663204,0.62279,0.415082,0.043326,0.067679,-0.00557,
+ -0.694463,0.652144,0.304021,0.043286,0.067717,-0.005713,
+ -0.770723,0.559963,0.304021,0.041902,0.066045,-0.005713,
+ -0.736031,0.534758,0.415082,0.041947,0.066012,-0.00557,
+ -0.701001,0.579918,0.415082,0.04261,0.066868,-0.00557,
+ -0.770723,0.559963,0.304021,0.041902,0.066045,-0.005713,
+ -0.701001,0.579918,0.415082,0.04261,0.066868,-0.00557,
+ -0.734041,0.607252,0.304021,0.042568,0.066903,-0.005713,
+ -0.804362,0.510464,0.304021,0.041292,0.065147,-0.005713,
+ -0.768156,0.487487,0.415082,0.041338,0.065117,-0.00557,
+ -0.736031,0.534758,0.415082,0.041947,0.066012,-0.00557,
+ -0.804362,0.510464,0.304021,0.041292,0.065147,-0.005713,
+ -0.736031,0.534758,0.415082,0.041947,0.066012,-0.00557,
+ -0.770723,0.559963,0.304021,0.041902,0.066045,-0.005713,
+ -0.834827,0.45895,0.304021,0.040739,0.064212,-0.005713,
+ -0.79725,0.438292,0.415082,0.040787,0.064185,-0.00557,
+ -0.768156,0.487487,0.415082,0.041338,0.065117,-0.00557,
+ -0.834827,0.45895,0.304021,0.040739,0.064212,-0.005713,
+ -0.768156,0.487487,0.415082,0.041338,0.065117,-0.00557,
+ -0.804362,0.510464,0.304021,0.041292,0.065147,-0.005713,
+ -0.861997,0.405625,0.304021,0.040246,0.063245,-0.005713,
+ -0.823197,0.387367,0.415082,0.040296,0.063221,-0.00557,
+ -0.79725,0.438292,0.415082,0.040787,0.064185,-0.00557,
+ -0.861997,0.405625,0.304021,0.040246,0.063245,-0.005713,
+ -0.79725,0.438292,0.415082,0.040787,0.064185,-0.00557,
+ -0.834827,0.45895,0.304021,0.040739,0.064212,-0.005713,
+ -0.885766,0.3507,0.304021,0.039815,0.062248,-0.005713,
+ -0.845896,0.334914,0.415082,0.039866,0.062228,-0.00557,
+ -0.823197,0.387367,0.415082,0.040296,0.063221,-0.00557,
+ -0.885766,0.3507,0.304021,0.039815,0.062248,-0.005713,
+ -0.823197,0.387367,0.415082,0.040296,0.063221,-0.00557,
+ -0.861997,0.405625,0.304021,0.040246,0.063245,-0.005713,
+ -0.906039,0.29439,0.304021,0.039447,0.061226,-0.005713,
+ -0.865256,0.281139,0.415082,0.0395,0.061209,-0.00557,
+ -0.845896,0.334914,0.415082,0.039866,0.062228,-0.00557,
+ -0.906039,0.29439,0.304021,0.039447,0.061226,-0.005713,
+ -0.845896,0.334914,0.415082,0.039866,0.062228,-0.00557,
+ -0.885766,0.3507,0.304021,0.039815,0.062248,-0.005713,
+ -0.922736,0.236918,0.304021,0.039144,0.060184,-0.005713,
+ -0.881202,0.226254,0.415082,0.039198,0.06017,-0.00557,
+ -0.865256,0.281139,0.415082,0.0395,0.061209,-0.00557,
+ -0.922736,0.236918,0.304021,0.039144,0.060184,-0.005713,
+ -0.865256,0.281139,0.415082,0.0395,0.061209,-0.00557,
+ -0.906039,0.29439,0.304021,0.039447,0.061226,-0.005713,
+ -0.935791,0.178512,0.304021,0.038907,0.059124,-0.005713,
+ -0.893669,0.170477,0.415082,0.038961,0.059114,-0.00557,
+ -0.881202,0.226254,0.415082,0.039198,0.06017,-0.00557,
+ -0.935791,0.178512,0.304021,0.038907,0.059124,-0.005713,
+ -0.881202,0.226254,0.415082,0.039198,0.06017,-0.00557,
+ -0.922736,0.236918,0.304021,0.039144,0.060184,-0.005713,
+ -0.945153,0.119401,0.304021,0.038737,0.058052,-0.005713,
+ -0.90261,0.114026,0.415082,0.038792,0.058045,-0.00557,
+ -0.893669,0.170477,0.415082,0.038961,0.059114,-0.00557,
+ -0.945153,0.119401,0.304021,0.038737,0.058052,-0.005713,
+ -0.893669,0.170477,0.415082,0.038961,0.059114,-0.00557,
+ -0.935791,0.178512,0.304021,0.038907,0.059124,-0.005713,
+ -0.950786,0.059818,0.304021,0.038635,0.056971,-0.005713,
+ -0.907989,0.057126,0.415082,0.03869,0.056967,-0.00557,
+ -0.90261,0.114026,0.415082,0.038792,0.058045,-0.00557,
+ -0.950786,0.059818,0.304021,0.038635,0.056971,-0.005713,
+ -0.90261,0.114026,0.415082,0.038792,0.058045,-0.00557,
+ -0.945153,0.119401,0.304021,0.038737,0.058052,-0.005713,
+ -0.952665,0,0.304021,0.038601,0.055885,-0.005713,
+ -0.909784,0,0.415082,0.038656,0.055885,-0.00557,
+ -0.907989,0.057126,0.415082,0.03869,0.056967,-0.00557,
+ -0.952665,0,0.304021,0.038601,0.055885,-0.005713,
+ -0.907989,0.057126,0.415082,0.03869,0.056967,-0.00557,
+ -0.950786,0.059818,0.304021,0.038635,0.056971,-0.005713,
+ -0.950786,-0.059818,0.304021,0.038635,0.0548,-0.005713,
+ -0.907989,-0.057126,0.415082,0.03869,0.054803,-0.00557,
+ -0.909784,0,0.415082,0.038656,0.055885,-0.00557,
+ -0.950786,-0.059818,0.304021,0.038635,0.0548,-0.005713,
+ -0.909784,0,0.415082,0.038656,0.055885,-0.00557,
+ -0.952665,0,0.304021,0.038601,0.055885,-0.005713,
+ -0.945153,-0.119401,0.304021,0.038737,0.053719,-0.005713,
+ -0.90261,-0.114026,0.415082,0.038792,0.053726,-0.00557,
+ -0.907989,-0.057126,0.415082,0.03869,0.054803,-0.00557,
+ -0.945153,-0.119401,0.304021,0.038737,0.053719,-0.005713,
+ -0.907989,-0.057126,0.415082,0.03869,0.054803,-0.00557,
+ -0.950786,-0.059818,0.304021,0.038635,0.0548,-0.005713,
+ -0.935791,-0.178512,0.304021,0.038907,0.052646,-0.005713,
+ -0.893669,-0.170477,0.415082,0.038961,0.052657,-0.00557,
+ -0.90261,-0.114026,0.415082,0.038792,0.053726,-0.00557,
+ -0.935791,-0.178512,0.304021,0.038907,0.052646,-0.005713,
+ -0.90261,-0.114026,0.415082,0.038792,0.053726,-0.00557,
+ -0.945153,-0.119401,0.304021,0.038737,0.053719,-0.005713,
+ -0.893669,-0.170477,0.415082,0.038961,0.052657,-0.00557,
+ -0.838881,-0.160025,0.52026,0.039032,0.05267,-0.005434,
+ -0.847274,-0.107036,0.52026,0.038863,0.053735,-0.005434,
+ -0.893669,-0.170477,0.415082,0.038961,0.052657,-0.00557,
+ -0.847274,-0.107036,0.52026,0.038863,0.053735,-0.005434,
+ -0.90261,-0.114026,0.415082,0.038792,0.053726,-0.00557,
+ -0.881202,-0.226254,0.415082,0.039198,0.051601,-0.00557,
+ -0.827178,-0.212383,0.52026,0.039267,0.051619,-0.005434,
+ -0.838881,-0.160025,0.52026,0.039032,0.05267,-0.005434,
+ -0.881202,-0.226254,0.415082,0.039198,0.051601,-0.00557,
+ -0.838881,-0.160025,0.52026,0.039032,0.05267,-0.005434,
+ -0.893669,-0.170477,0.415082,0.038961,0.052657,-0.00557,
+ -0.865256,-0.281139,0.415082,0.0395,0.050561,-0.00557,
+ -0.81221,-0.263903,0.52026,0.039568,0.050584,-0.005434,
+ -0.827178,-0.212383,0.52026,0.039267,0.051619,-0.005434,
+ -0.865256,-0.281139,0.415082,0.0395,0.050561,-0.00557,
+ -0.827178,-0.212383,0.52026,0.039267,0.051619,-0.005434,
+ -0.881202,-0.226254,0.415082,0.039198,0.051601,-0.00557,
+ -0.845896,-0.334914,0.415082,0.039866,0.049543,-0.00557,
+ -0.794037,-0.314381,0.52026,0.039933,0.049569,-0.005434,
+ -0.81221,-0.263903,0.52026,0.039568,0.050584,-0.005434,
+ -0.845896,-0.334914,0.415082,0.039866,0.049543,-0.00557,
+ -0.81221,-0.263903,0.52026,0.039568,0.050584,-0.005434,
+ -0.865256,-0.281139,0.415082,0.0395,0.050561,-0.00557,
+ -0.823197,-0.387367,0.415082,0.040296,0.048549,-0.00557,
+ -0.77273,-0.363619,0.52026,0.040361,0.04858,-0.005434,
+ -0.794037,-0.314381,0.52026,0.039933,0.049569,-0.005434,
+ -0.823197,-0.387367,0.415082,0.040296,0.048549,-0.00557,
+ -0.794037,-0.314381,0.52026,0.039933,0.049569,-0.005434,
+ -0.845896,-0.334914,0.415082,0.039866,0.049543,-0.00557,
+ -0.79725,-0.438292,0.415082,0.040787,0.047585,-0.00557,
+ -0.748373,-0.411421,0.52026,0.04085,0.04762,-0.005434,
+ -0.77273,-0.363619,0.52026,0.040361,0.04858,-0.005434,
+ -0.79725,-0.438292,0.415082,0.040787,0.047585,-0.00557,
+ -0.77273,-0.363619,0.52026,0.040361,0.04858,-0.005434,
+ -0.823197,-0.387367,0.415082,0.040296,0.048549,-0.00557,
+ -0.768156,-0.487487,0.415082,0.041338,0.046653,-0.00557,
+ -0.721063,-0.4576,0.52026,0.041399,0.046692,-0.005434,
+ -0.748373,-0.411421,0.52026,0.04085,0.04762,-0.005434,
+ -0.768156,-0.487487,0.415082,0.041338,0.046653,-0.00557,
+ -0.748373,-0.411421,0.52026,0.04085,0.04762,-0.005434,
+ -0.79725,-0.438292,0.415082,0.040787,0.047585,-0.00557,
+ -0.736031,-0.534758,0.415082,0.041947,0.045758,-0.00557,
+ -0.690907,-0.501973,0.52026,0.042005,0.045801,-0.005434,
+ -0.721063,-0.4576,0.52026,0.041399,0.046692,-0.005434,
+ -0.736031,-0.534758,0.415082,0.041947,0.045758,-0.00557,
+ -0.721063,-0.4576,0.52026,0.041399,0.046692,-0.005434,
+ -0.768156,-0.487487,0.415082,0.041338,0.046653,-0.00557,
+ -0.701001,-0.579918,0.415082,0.04261,0.044903,-0.00557,
+ -0.658024,-0.544365,0.52026,0.042666,0.044949,-0.005434,
+ -0.690907,-0.501973,0.52026,0.042005,0.045801,-0.005434,
+ -0.701001,-0.579918,0.415082,0.04261,0.044903,-0.00557,
+ -0.690907,-0.501973,0.52026,0.042005,0.045801,-0.005434,
+ -0.736031,-0.534758,0.415082,0.041947,0.045758,-0.00557,
+ -0.663204,-0.62279,0.415082,0.043326,0.044091,-0.00557,
+ -0.622545,-0.584609,0.52026,0.043378,0.04414,-0.005434,
+ -0.658024,-0.544365,0.52026,0.042666,0.044949,-0.005434,
+ -0.663204,-0.62279,0.415082,0.043326,0.044091,-0.00557,
+ -0.658024,-0.544365,0.52026,0.042666,0.044949,-0.005434,
+ -0.701001,-0.579918,0.415082,0.04261,0.044903,-0.00557,
+ -0.62279,-0.663204,0.415082,0.044091,0.043326,-0.00557,
+ -0.584609,-0.622545,0.52026,0.04414,0.043378,-0.005434,
+ -0.622545,-0.584609,0.52026,0.043378,0.04414,-0.005434,
+ -0.62279,-0.663204,0.415082,0.044091,0.043326,-0.00557,
+ -0.622545,-0.584609,0.52026,0.043378,0.04414,-0.005434,
+ -0.663204,-0.62279,0.415082,0.043326,0.044091,-0.00557,
+ -0.579918,-0.701001,0.415082,0.044903,0.04261,-0.00557,
+ -0.544365,-0.658024,0.52026,0.044949,0.042666,-0.005434,
+ -0.584609,-0.622545,0.52026,0.04414,0.043378,-0.005434,
+ -0.579918,-0.701001,0.415082,0.044903,0.04261,-0.00557,
+ -0.584609,-0.622545,0.52026,0.04414,0.043378,-0.005434,
+ -0.62279,-0.663204,0.415082,0.044091,0.043326,-0.00557,
+ -0.534758,-0.736031,0.415082,0.045758,0.041947,-0.00557,
+ -0.501973,-0.690907,0.52026,0.045801,0.042005,-0.005434,
+ -0.544365,-0.658024,0.52026,0.044949,0.042666,-0.005434,
+ -0.534758,-0.736031,0.415082,0.045758,0.041947,-0.00557,
+ -0.544365,-0.658024,0.52026,0.044949,0.042666,-0.005434,
+ -0.579918,-0.701001,0.415082,0.044903,0.04261,-0.00557,
+ -0.487487,-0.768156,0.415082,0.046653,0.041338,-0.00557,
+ -0.4576,-0.721063,0.52026,0.046692,0.041399,-0.005434,
+ -0.501973,-0.690907,0.52026,0.045801,0.042005,-0.005434,
+ -0.487487,-0.768156,0.415082,0.046653,0.041338,-0.00557,
+ -0.501973,-0.690907,0.52026,0.045801,0.042005,-0.005434,
+ -0.534758,-0.736031,0.415082,0.045758,0.041947,-0.00557,
+ -0.438292,-0.79725,0.415082,0.047585,0.040787,-0.00557,
+ -0.411421,-0.748373,0.52026,0.04762,0.04085,-0.005434,
+ -0.4576,-0.721063,0.52026,0.046692,0.041399,-0.005434,
+ -0.438292,-0.79725,0.415082,0.047585,0.040787,-0.00557,
+ -0.4576,-0.721063,0.52026,0.046692,0.041399,-0.005434,
+ -0.487487,-0.768156,0.415082,0.046653,0.041338,-0.00557,
+ -0.387367,-0.823197,0.415082,0.048549,0.040296,-0.00557,
+ -0.363619,-0.77273,0.52026,0.04858,0.040361,-0.005434,
+ -0.411421,-0.748373,0.52026,0.04762,0.04085,-0.005434,
+ -0.387367,-0.823197,0.415082,0.048549,0.040296,-0.00557,
+ -0.411421,-0.748373,0.52026,0.04762,0.04085,-0.005434,
+ -0.438292,-0.79725,0.415082,0.047585,0.040787,-0.00557,
+ -0.334914,-0.845896,0.415082,0.049543,0.039866,-0.00557,
+ -0.314381,-0.794037,0.52026,0.049569,0.039933,-0.005434,
+ -0.363619,-0.77273,0.52026,0.04858,0.040361,-0.005434,
+ -0.334914,-0.845896,0.415082,0.049543,0.039866,-0.00557,
+ -0.363619,-0.77273,0.52026,0.04858,0.040361,-0.005434,
+ -0.387367,-0.823197,0.415082,0.048549,0.040296,-0.00557,
+ -0.281139,-0.865256,0.415082,0.050561,0.0395,-0.00557,
+ -0.263903,-0.81221,0.52026,0.050584,0.039568,-0.005434,
+ -0.314381,-0.794037,0.52026,0.049569,0.039933,-0.005434,
+ -0.281139,-0.865256,0.415082,0.050561,0.0395,-0.00557,
+ -0.314381,-0.794037,0.52026,0.049569,0.039933,-0.005434,
+ -0.334914,-0.845896,0.415082,0.049543,0.039866,-0.00557,
+ -0.226254,-0.881202,0.415082,0.051601,0.039198,-0.00557,
+ -0.212383,-0.827178,0.52026,0.051619,0.039267,-0.005434,
+ -0.263903,-0.81221,0.52026,0.050584,0.039568,-0.005434,
+ -0.226254,-0.881202,0.415082,0.051601,0.039198,-0.00557,
+ -0.263903,-0.81221,0.52026,0.050584,0.039568,-0.005434,
+ -0.281139,-0.865256,0.415082,0.050561,0.0395,-0.00557,
+ -0.170477,-0.893669,0.415082,0.052657,0.038961,-0.00557,
+ -0.160025,-0.838881,0.52026,0.05267,0.039032,-0.005434,
+ -0.212383,-0.827178,0.52026,0.051619,0.039267,-0.005434,
+ -0.170477,-0.893669,0.415082,0.052657,0.038961,-0.00557,
+ -0.212383,-0.827178,0.52026,0.051619,0.039267,-0.005434,
+ -0.226254,-0.881202,0.415082,0.051601,0.039198,-0.00557,
+ -0.114026,-0.90261,0.415082,0.053726,0.038792,-0.00557,
+ -0.107036,-0.847274,0.52026,0.053735,0.038863,-0.005434,
+ -0.160025,-0.838881,0.52026,0.05267,0.039032,-0.005434,
+ -0.114026,-0.90261,0.415082,0.053726,0.038792,-0.00557,
+ -0.160025,-0.838881,0.52026,0.05267,0.039032,-0.005434,
+ -0.170477,-0.893669,0.415082,0.052657,0.038961,-0.00557,
+ -0.057126,-0.907989,0.415082,0.054803,0.03869,-0.00557,
+ -0.053624,-0.852323,0.52026,0.054808,0.038762,-0.005434,
+ -0.107036,-0.847274,0.52026,0.053735,0.038863,-0.005434,
+ -0.057126,-0.907989,0.415082,0.054803,0.03869,-0.00557,
+ -0.107036,-0.847274,0.52026,0.053735,0.038863,-0.005434,
+ -0.114026,-0.90261,0.415082,0.053726,0.038792,-0.00557,
+ 0,-0.909784,0.415082,0.055885,0.038656,-0.00557,
+ 0,-0.854008,0.52026,0.055885,0.038728,-0.005434,
+ -0.053624,-0.852323,0.52026,0.054808,0.038762,-0.005434,
+ 0,-0.909784,0.415082,0.055885,0.038656,-0.00557,
+ -0.053624,-0.852323,0.52026,0.054808,0.038762,-0.005434,
+ -0.057126,-0.907989,0.415082,0.054803,0.03869,-0.00557,
+ 0.057126,-0.907989,0.415082,0.056967,0.03869,-0.00557,
+ 0.053624,-0.852323,0.52026,0.056963,0.038762,-0.005434,
+ 0,-0.854008,0.52026,0.055885,0.038728,-0.005434,
+ 0.057126,-0.907989,0.415082,0.056967,0.03869,-0.00557,
+ 0,-0.854008,0.52026,0.055885,0.038728,-0.005434,
+ 0,-0.909784,0.415082,0.055885,0.038656,-0.00557,
+ 0.114026,-0.90261,0.415082,0.058045,0.038792,-0.00557,
+ 0.107036,-0.847274,0.52026,0.058036,0.038863,-0.005434,
+ 0.053624,-0.852323,0.52026,0.056963,0.038762,-0.005434,
+ 0.114026,-0.90261,0.415082,0.058045,0.038792,-0.00557,
+ 0.053624,-0.852323,0.52026,0.056963,0.038762,-0.005434,
+ 0.057126,-0.907989,0.415082,0.056967,0.03869,-0.00557,
+ 0.170477,-0.893669,0.415082,0.059114,0.038961,-0.00557,
+ 0.160025,-0.838881,0.52026,0.0591,0.039032,-0.005434,
+ 0.107036,-0.847274,0.52026,0.058036,0.038863,-0.005434,
+ 0.170477,-0.893669,0.415082,0.059114,0.038961,-0.00557,
+ 0.107036,-0.847274,0.52026,0.058036,0.038863,-0.005434,
+ 0.114026,-0.90261,0.415082,0.058045,0.038792,-0.00557,
+ 0.226254,-0.881202,0.415082,0.06017,0.039198,-0.00557,
+ 0.212383,-0.827178,0.52026,0.060152,0.039267,-0.005434,
+ 0.160025,-0.838881,0.52026,0.0591,0.039032,-0.005434,
+ 0.226254,-0.881202,0.415082,0.06017,0.039198,-0.00557,
+ 0.160025,-0.838881,0.52026,0.0591,0.039032,-0.005434,
+ 0.170477,-0.893669,0.415082,0.059114,0.038961,-0.00557,
+ 0.281139,-0.865256,0.415082,0.061209,0.0395,-0.00557,
+ 0.263903,-0.81221,0.52026,0.061187,0.039568,-0.005434,
+ 0.212383,-0.827178,0.52026,0.060152,0.039267,-0.005434,
+ 0.281139,-0.865256,0.415082,0.061209,0.0395,-0.00557,
+ 0.212383,-0.827178,0.52026,0.060152,0.039267,-0.005434,
+ 0.226254,-0.881202,0.415082,0.06017,0.039198,-0.00557,
+ 0.334914,-0.845896,0.415082,0.062228,0.039866,-0.00557,
+ 0.314381,-0.794037,0.52026,0.062201,0.039933,-0.005434,
+ 0.263903,-0.81221,0.52026,0.061187,0.039568,-0.005434,
+ 0.334914,-0.845896,0.415082,0.062228,0.039866,-0.00557,
+ 0.263903,-0.81221,0.52026,0.061187,0.039568,-0.005434,
+ 0.281139,-0.865256,0.415082,0.061209,0.0395,-0.00557,
+ 0.387367,-0.823197,0.415082,0.063221,0.040296,-0.00557,
+ 0.363619,-0.77273,0.52026,0.06319,0.040361,-0.005434,
+ 0.314381,-0.794037,0.52026,0.062201,0.039933,-0.005434,
+ 0.387367,-0.823197,0.415082,0.063221,0.040296,-0.00557,
+ 0.314381,-0.794037,0.52026,0.062201,0.039933,-0.005434,
+ 0.334914,-0.845896,0.415082,0.062228,0.039866,-0.00557,
+ 0.438292,-0.79725,0.415082,0.064185,0.040787,-0.00557,
+ 0.411421,-0.748373,0.52026,0.064151,0.04085,-0.005434,
+ 0.363619,-0.77273,0.52026,0.06319,0.040361,-0.005434,
+ 0.438292,-0.79725,0.415082,0.064185,0.040787,-0.00557,
+ 0.363619,-0.77273,0.52026,0.06319,0.040361,-0.005434,
+ 0.387367,-0.823197,0.415082,0.063221,0.040296,-0.00557,
+ 0.487487,-0.768156,0.415082,0.065117,0.041338,-0.00557,
+ 0.4576,-0.721063,0.52026,0.065079,0.041399,-0.005434,
+ 0.411421,-0.748373,0.52026,0.064151,0.04085,-0.005434,
+ 0.487487,-0.768156,0.415082,0.065117,0.041338,-0.00557,
+ 0.411421,-0.748373,0.52026,0.064151,0.04085,-0.005434,
+ 0.438292,-0.79725,0.415082,0.064185,0.040787,-0.00557,
+ 0.534758,-0.736031,0.415082,0.066012,0.041947,-0.00557,
+ 0.501973,-0.690907,0.52026,0.06597,0.042005,-0.005434,
+ 0.4576,-0.721063,0.52026,0.065079,0.041399,-0.005434,
+ 0.534758,-0.736031,0.415082,0.066012,0.041947,-0.00557,
+ 0.4576,-0.721063,0.52026,0.065079,0.041399,-0.005434,
+ 0.487487,-0.768156,0.415082,0.065117,0.041338,-0.00557,
+ 0.579918,-0.701001,0.415082,0.066868,0.04261,-0.00557,
+ 0.544365,-0.658024,0.52026,0.066822,0.042666,-0.005434,
+ 0.501973,-0.690907,0.52026,0.06597,0.042005,-0.005434,
+ 0.579918,-0.701001,0.415082,0.066868,0.04261,-0.00557,
+ 0.501973,-0.690907,0.52026,0.06597,0.042005,-0.005434,
+ 0.534758,-0.736031,0.415082,0.066012,0.041947,-0.00557,
+ 0.62279,-0.663204,0.415082,0.067679,0.043326,-0.00557,
+ 0.584609,-0.622545,0.52026,0.06763,0.043378,-0.005434,
+ 0.544365,-0.658024,0.52026,0.066822,0.042666,-0.005434,
+ 0.62279,-0.663204,0.415082,0.067679,0.043326,-0.00557,
+ 0.544365,-0.658024,0.52026,0.066822,0.042666,-0.005434,
+ 0.579918,-0.701001,0.415082,0.066868,0.04261,-0.00557,
+ 0.663204,-0.62279,0.415082,0.068445,0.044091,-0.00557,
+ 0.622545,-0.584609,0.52026,0.068392,0.04414,-0.005434,
+ 0.584609,-0.622545,0.52026,0.06763,0.043378,-0.005434,
+ 0.663204,-0.62279,0.415082,0.068445,0.044091,-0.00557,
+ 0.584609,-0.622545,0.52026,0.06763,0.043378,-0.005434,
+ 0.62279,-0.663204,0.415082,0.067679,0.043326,-0.00557,
+ 0.701001,-0.579918,0.415082,0.069161,0.044903,-0.00557,
+ 0.658024,-0.544365,0.52026,0.069105,0.044949,-0.005434,
+ 0.622545,-0.584609,0.52026,0.068392,0.04414,-0.005434,
+ 0.701001,-0.579918,0.415082,0.069161,0.044903,-0.00557,
+ 0.622545,-0.584609,0.52026,0.068392,0.04414,-0.005434,
+ 0.663204,-0.62279,0.415082,0.068445,0.044091,-0.00557,
+ 0.736031,-0.534758,0.415082,0.069824,0.045758,-0.00557,
+ 0.690907,-0.501973,0.52026,0.069766,0.045801,-0.005434,
+ 0.658024,-0.544365,0.52026,0.069105,0.044949,-0.005434,
+ 0.736031,-0.534758,0.415082,0.069824,0.045758,-0.00557,
+ 0.658024,-0.544365,0.52026,0.069105,0.044949,-0.005434,
+ 0.701001,-0.579918,0.415082,0.069161,0.044903,-0.00557,
+ 0.768156,-0.487487,0.415082,0.070432,0.046653,-0.00557,
+ 0.721063,-0.4576,0.52026,0.070372,0.046692,-0.005434,
+ 0.690907,-0.501973,0.52026,0.069766,0.045801,-0.005434,
+ 0.768156,-0.487487,0.415082,0.070432,0.046653,-0.00557,
+ 0.690907,-0.501973,0.52026,0.069766,0.045801,-0.005434,
+ 0.736031,-0.534758,0.415082,0.069824,0.045758,-0.00557,
+ 0.79725,-0.438292,0.415082,0.070983,0.047585,-0.00557,
+ 0.748373,-0.411421,0.52026,0.07092,0.04762,-0.005434,
+ 0.721063,-0.4576,0.52026,0.070372,0.046692,-0.005434,
+ 0.79725,-0.438292,0.415082,0.070983,0.047585,-0.00557,
+ 0.721063,-0.4576,0.52026,0.070372,0.046692,-0.005434,
+ 0.768156,-0.487487,0.415082,0.070432,0.046653,-0.00557,
+ 0.823197,-0.387367,0.415082,0.071475,0.048549,-0.00557,
+ 0.77273,-0.363619,0.52026,0.07141,0.04858,-0.005434,
+ 0.748373,-0.411421,0.52026,0.07092,0.04762,-0.005434,
+ 0.823197,-0.387367,0.415082,0.071475,0.048549,-0.00557,
+ 0.748373,-0.411421,0.52026,0.07092,0.04762,-0.005434,
+ 0.79725,-0.438292,0.415082,0.070983,0.047585,-0.00557,
+ 0.845896,-0.334914,0.415082,0.071905,0.049543,-0.00557,
+ 0.794037,-0.314381,0.52026,0.071838,0.049569,-0.005434,
+ 0.77273,-0.363619,0.52026,0.07141,0.04858,-0.005434,
+ 0.845896,-0.334914,0.415082,0.071905,0.049543,-0.00557,
+ 0.77273,-0.363619,0.52026,0.07141,0.04858,-0.005434,
+ 0.823197,-0.387367,0.415082,0.071475,0.048549,-0.00557,
+ 0.865256,-0.281139,0.415082,0.072271,0.050561,-0.00557,
+ 0.81221,-0.263903,0.52026,0.072203,0.050584,-0.005434,
+ 0.794037,-0.314381,0.52026,0.071838,0.049569,-0.005434,
+ 0.865256,-0.281139,0.415082,0.072271,0.050561,-0.00557,
+ 0.794037,-0.314381,0.52026,0.071838,0.049569,-0.005434,
+ 0.845896,-0.334914,0.415082,0.071905,0.049543,-0.00557,
+ 0.881202,-0.226254,0.415082,0.072573,0.051601,-0.00557,
+ 0.827178,-0.212383,0.52026,0.072503,0.051619,-0.005434,
+ 0.81221,-0.263903,0.52026,0.072203,0.050584,-0.005434,
+ 0.881202,-0.226254,0.415082,0.072573,0.051601,-0.00557,
+ 0.81221,-0.263903,0.52026,0.072203,0.050584,-0.005434,
+ 0.865256,-0.281139,0.415082,0.072271,0.050561,-0.00557,
+ 0.893669,-0.170477,0.415082,0.072809,0.052657,-0.00557,
+ 0.838881,-0.160025,0.52026,0.072739,0.05267,-0.005434,
+ 0.827178,-0.212383,0.52026,0.072503,0.051619,-0.005434,
+ 0.893669,-0.170477,0.415082,0.072809,0.052657,-0.00557,
+ 0.827178,-0.212383,0.52026,0.072503,0.051619,-0.005434,
+ 0.881202,-0.226254,0.415082,0.072573,0.051601,-0.00557,
+ 0.90261,-0.114026,0.415082,0.072978,0.053726,-0.00557,
+ 0.847274,-0.107036,0.52026,0.072907,0.053735,-0.005434,
+ 0.838881,-0.160025,0.52026,0.072739,0.05267,-0.005434,
+ 0.90261,-0.114026,0.415082,0.072978,0.053726,-0.00557,
+ 0.838881,-0.160025,0.52026,0.072739,0.05267,-0.005434,
+ 0.893669,-0.170477,0.415082,0.072809,0.052657,-0.00557,
+ 0.907989,-0.057126,0.415082,0.07308,0.054803,-0.00557,
+ 0.852323,-0.053624,0.52026,0.073009,0.054808,-0.005434,
+ 0.847274,-0.107036,0.52026,0.072907,0.053735,-0.005434,
+ 0.907989,-0.057126,0.415082,0.07308,0.054803,-0.00557,
+ 0.847274,-0.107036,0.52026,0.072907,0.053735,-0.005434,
+ 0.90261,-0.114026,0.415082,0.072978,0.053726,-0.00557,
+ 0.909784,0,0.415082,0.073114,0.055885,-0.00557,
+ 0.854008,0,0.52026,0.073042,0.055885,-0.005434,
+ 0.852323,-0.053624,0.52026,0.073009,0.054808,-0.005434,
+ 0.909784,0,0.415082,0.073114,0.055885,-0.00557,
+ 0.852323,-0.053624,0.52026,0.073009,0.054808,-0.005434,
+ 0.907989,-0.057126,0.415082,0.07308,0.054803,-0.00557,
+ 0.907989,0.057126,0.415082,0.07308,0.056967,-0.00557,
+ 0.852323,0.053624,0.52026,0.073009,0.056963,-0.005434,
+ 0.854008,0,0.52026,0.073042,0.055885,-0.005434,
+ 0.907989,0.057126,0.415082,0.07308,0.056967,-0.00557,
+ 0.854008,0,0.52026,0.073042,0.055885,-0.005434,
+ 0.909784,0,0.415082,0.073114,0.055885,-0.00557,
+ 0.90261,0.114026,0.415082,0.072978,0.058045,-0.00557,
+ 0.847274,0.107036,0.52026,0.072907,0.058036,-0.005434,
+ 0.852323,0.053624,0.52026,0.073009,0.056963,-0.005434,
+ 0.90261,0.114026,0.415082,0.072978,0.058045,-0.00557,
+ 0.852323,0.053624,0.52026,0.073009,0.056963,-0.005434,
+ 0.907989,0.057126,0.415082,0.07308,0.056967,-0.00557,
+ 0.893669,0.170477,0.415082,0.072809,0.059114,-0.00557,
+ 0.838881,0.160025,0.52026,0.072739,0.0591,-0.005434,
+ 0.847274,0.107036,0.52026,0.072907,0.058036,-0.005434,
+ 0.893669,0.170477,0.415082,0.072809,0.059114,-0.00557,
+ 0.847274,0.107036,0.52026,0.072907,0.058036,-0.005434,
+ 0.90261,0.114026,0.415082,0.072978,0.058045,-0.00557,
+ 0.881202,0.226254,0.415082,0.072573,0.06017,-0.00557,
+ 0.827178,0.212383,0.52026,0.072503,0.060152,-0.005434,
+ 0.838881,0.160025,0.52026,0.072739,0.0591,-0.005434,
+ 0.881202,0.226254,0.415082,0.072573,0.06017,-0.00557,
+ 0.838881,0.160025,0.52026,0.072739,0.0591,-0.005434,
+ 0.893669,0.170477,0.415082,0.072809,0.059114,-0.00557,
+ 0.865256,0.281139,0.415082,0.072271,0.061209,-0.00557,
+ 0.81221,0.263903,0.52026,0.072203,0.061187,-0.005434,
+ 0.827178,0.212383,0.52026,0.072503,0.060152,-0.005434,
+ 0.865256,0.281139,0.415082,0.072271,0.061209,-0.00557,
+ 0.827178,0.212383,0.52026,0.072503,0.060152,-0.005434,
+ 0.881202,0.226254,0.415082,0.072573,0.06017,-0.00557,
+ 0.845896,0.334914,0.415082,0.071905,0.062228,-0.00557,
+ 0.794037,0.314381,0.52026,0.071838,0.062201,-0.005434,
+ 0.81221,0.263903,0.52026,0.072203,0.061187,-0.005434,
+ 0.845896,0.334914,0.415082,0.071905,0.062228,-0.00557,
+ 0.81221,0.263903,0.52026,0.072203,0.061187,-0.005434,
+ 0.865256,0.281139,0.415082,0.072271,0.061209,-0.00557,
+ 0.823197,0.387367,0.415082,0.071475,0.063221,-0.00557,
+ 0.77273,0.363619,0.52026,0.07141,0.06319,-0.005434,
+ 0.794037,0.314381,0.52026,0.071838,0.062201,-0.005434,
+ 0.823197,0.387367,0.415082,0.071475,0.063221,-0.00557,
+ 0.794037,0.314381,0.52026,0.071838,0.062201,-0.005434,
+ 0.845896,0.334914,0.415082,0.071905,0.062228,-0.00557,
+ 0.79725,0.438292,0.415082,0.070983,0.064185,-0.00557,
+ 0.748373,0.411421,0.52026,0.07092,0.064151,-0.005434,
+ 0.77273,0.363619,0.52026,0.07141,0.06319,-0.005434,
+ 0.79725,0.438292,0.415082,0.070983,0.064185,-0.00557,
+ 0.77273,0.363619,0.52026,0.07141,0.06319,-0.005434,
+ 0.823197,0.387367,0.415082,0.071475,0.063221,-0.00557,
+ 0.768156,0.487487,0.415082,0.070432,0.065117,-0.00557,
+ 0.721063,0.4576,0.52026,0.070372,0.065079,-0.005434,
+ 0.748373,0.411421,0.52026,0.07092,0.064151,-0.005434,
+ 0.768156,0.487487,0.415082,0.070432,0.065117,-0.00557,
+ 0.748373,0.411421,0.52026,0.07092,0.064151,-0.005434,
+ 0.79725,0.438292,0.415082,0.070983,0.064185,-0.00557,
+ 0.736031,0.534758,0.415082,0.069824,0.066012,-0.00557,
+ 0.690907,0.501973,0.52026,0.069766,0.06597,-0.005434,
+ 0.721063,0.4576,0.52026,0.070372,0.065079,-0.005434,
+ 0.736031,0.534758,0.415082,0.069824,0.066012,-0.00557,
+ 0.721063,0.4576,0.52026,0.070372,0.065079,-0.005434,
+ 0.768156,0.487487,0.415082,0.070432,0.065117,-0.00557,
+ 0.701001,0.579918,0.415082,0.069161,0.066868,-0.00557,
+ 0.658024,0.544365,0.52026,0.069105,0.066822,-0.005434,
+ 0.690907,0.501973,0.52026,0.069766,0.06597,-0.005434,
+ 0.701001,0.579918,0.415082,0.069161,0.066868,-0.00557,
+ 0.690907,0.501973,0.52026,0.069766,0.06597,-0.005434,
+ 0.736031,0.534758,0.415082,0.069824,0.066012,-0.00557,
+ 0.663204,0.62279,0.415082,0.068445,0.067679,-0.00557,
+ 0.622545,0.584609,0.52026,0.068392,0.06763,-0.005434,
+ 0.658024,0.544365,0.52026,0.069105,0.066822,-0.005434,
+ 0.663204,0.62279,0.415082,0.068445,0.067679,-0.00557,
+ 0.658024,0.544365,0.52026,0.069105,0.066822,-0.005434,
+ 0.701001,0.579918,0.415082,0.069161,0.066868,-0.00557,
+ 0.62279,0.663204,0.415082,0.067679,0.068445,-0.00557,
+ 0.584609,0.622545,0.52026,0.06763,0.068392,-0.005434,
+ 0.622545,0.584609,0.52026,0.068392,0.06763,-0.005434,
+ 0.62279,0.663204,0.415082,0.067679,0.068445,-0.00557,
+ 0.622545,0.584609,0.52026,0.068392,0.06763,-0.005434,
+ 0.663204,0.62279,0.415082,0.068445,0.067679,-0.00557,
+ 0.579918,0.701001,0.415082,0.066868,0.069161,-0.00557,
+ 0.544365,0.658024,0.52026,0.066822,0.069105,-0.005434,
+ 0.584609,0.622545,0.52026,0.06763,0.068392,-0.005434,
+ 0.579918,0.701001,0.415082,0.066868,0.069161,-0.00557,
+ 0.584609,0.622545,0.52026,0.06763,0.068392,-0.005434,
+ 0.62279,0.663204,0.415082,0.067679,0.068445,-0.00557,
+ 0.534758,0.736031,0.415082,0.066012,0.069824,-0.00557,
+ 0.501973,0.690907,0.52026,0.06597,0.069766,-0.005434,
+ 0.544365,0.658024,0.52026,0.066822,0.069105,-0.005434,
+ 0.534758,0.736031,0.415082,0.066012,0.069824,-0.00557,
+ 0.544365,0.658024,0.52026,0.066822,0.069105,-0.005434,
+ 0.579918,0.701001,0.415082,0.066868,0.069161,-0.00557,
+ 0.487487,0.768156,0.415082,0.065117,0.070432,-0.00557,
+ 0.4576,0.721063,0.52026,0.065079,0.070372,-0.005434,
+ 0.501973,0.690907,0.52026,0.06597,0.069766,-0.005434,
+ 0.487487,0.768156,0.415082,0.065117,0.070432,-0.00557,
+ 0.501973,0.690907,0.52026,0.06597,0.069766,-0.005434,
+ 0.534758,0.736031,0.415082,0.066012,0.069824,-0.00557,
+ 0.438292,0.79725,0.415082,0.064185,0.070983,-0.00557,
+ 0.411421,0.748373,0.52026,0.064151,0.07092,-0.005434,
+ 0.4576,0.721063,0.52026,0.065079,0.070372,-0.005434,
+ 0.438292,0.79725,0.415082,0.064185,0.070983,-0.00557,
+ 0.4576,0.721063,0.52026,0.065079,0.070372,-0.005434,
+ 0.487487,0.768156,0.415082,0.065117,0.070432,-0.00557,
+ 0.387367,0.823197,0.415082,0.063221,0.071475,-0.00557,
+ 0.363619,0.77273,0.52026,0.06319,0.07141,-0.005434,
+ 0.411421,0.748373,0.52026,0.064151,0.07092,-0.005434,
+ 0.387367,0.823197,0.415082,0.063221,0.071475,-0.00557,
+ 0.411421,0.748373,0.52026,0.064151,0.07092,-0.005434,
+ 0.438292,0.79725,0.415082,0.064185,0.070983,-0.00557,
+ 0.334914,0.845896,0.415082,0.062228,0.071905,-0.00557,
+ 0.314381,0.794037,0.52026,0.062201,0.071838,-0.005434,
+ 0.363619,0.77273,0.52026,0.06319,0.07141,-0.005434,
+ 0.334914,0.845896,0.415082,0.062228,0.071905,-0.00557,
+ 0.363619,0.77273,0.52026,0.06319,0.07141,-0.005434,
+ 0.387367,0.823197,0.415082,0.063221,0.071475,-0.00557,
+ 0.281139,0.865256,0.415082,0.061209,0.072271,-0.00557,
+ 0.263903,0.81221,0.52026,0.061187,0.072203,-0.005434,
+ 0.314381,0.794037,0.52026,0.062201,0.071838,-0.005434,
+ 0.281139,0.865256,0.415082,0.061209,0.072271,-0.00557,
+ 0.314381,0.794037,0.52026,0.062201,0.071838,-0.005434,
+ 0.334914,0.845896,0.415082,0.062228,0.071905,-0.00557,
+ 0.226254,0.881202,0.415082,0.06017,0.072573,-0.00557,
+ 0.212383,0.827178,0.52026,0.060152,0.072503,-0.005434,
+ 0.263903,0.81221,0.52026,0.061187,0.072203,-0.005434,
+ 0.226254,0.881202,0.415082,0.06017,0.072573,-0.00557,
+ 0.263903,0.81221,0.52026,0.061187,0.072203,-0.005434,
+ 0.281139,0.865256,0.415082,0.061209,0.072271,-0.00557,
+ 0.170477,0.893669,0.415082,0.059114,0.072809,-0.00557,
+ 0.160025,0.838881,0.52026,0.0591,0.072739,-0.005434,
+ 0.212383,0.827178,0.52026,0.060152,0.072503,-0.005434,
+ 0.170477,0.893669,0.415082,0.059114,0.072809,-0.00557,
+ 0.212383,0.827178,0.52026,0.060152,0.072503,-0.005434,
+ 0.226254,0.881202,0.415082,0.06017,0.072573,-0.00557,
+ 0.114026,0.90261,0.415082,0.058045,0.072978,-0.00557,
+ 0.107036,0.847274,0.52026,0.058036,0.072907,-0.005434,
+ 0.160025,0.838881,0.52026,0.0591,0.072739,-0.005434,
+ 0.114026,0.90261,0.415082,0.058045,0.072978,-0.00557,
+ 0.160025,0.838881,0.52026,0.0591,0.072739,-0.005434,
+ 0.170477,0.893669,0.415082,0.059114,0.072809,-0.00557,
+ 0.057126,0.907989,0.415082,0.056967,0.07308,-0.00557,
+ 0.053624,0.852323,0.52026,0.056963,0.073009,-0.005434,
+ 0.107036,0.847274,0.52026,0.058036,0.072907,-0.005434,
+ 0.057126,0.907989,0.415082,0.056967,0.07308,-0.00557,
+ 0.107036,0.847274,0.52026,0.058036,0.072907,-0.005434,
+ 0.114026,0.90261,0.415082,0.058045,0.072978,-0.00557,
+ 0,0.909784,0.415082,0.055885,0.073114,-0.00557,
+ 0,0.854008,0.52026,0.055885,0.073042,-0.005434,
+ 0.053624,0.852323,0.52026,0.056963,0.073009,-0.005434,
+ 0,0.909784,0.415082,0.055885,0.073114,-0.00557,
+ 0.053624,0.852323,0.52026,0.056963,0.073009,-0.005434,
+ 0.057126,0.907989,0.415082,0.056967,0.07308,-0.00557,
+ -0.057126,0.907989,0.415082,0.054803,0.07308,-0.00557,
+ -0.053624,0.852323,0.52026,0.054808,0.073009,-0.005434,
+ 0,0.854008,0.52026,0.055885,0.073042,-0.005434,
+ -0.057126,0.907989,0.415082,0.054803,0.07308,-0.00557,
+ 0,0.854008,0.52026,0.055885,0.073042,-0.005434,
+ 0,0.909784,0.415082,0.055885,0.073114,-0.00557,
+ -0.114026,0.90261,0.415082,0.053726,0.072978,-0.00557,
+ -0.107036,0.847274,0.52026,0.053735,0.072907,-0.005434,
+ -0.053624,0.852323,0.52026,0.054808,0.073009,-0.005434,
+ -0.114026,0.90261,0.415082,0.053726,0.072978,-0.00557,
+ -0.053624,0.852323,0.52026,0.054808,0.073009,-0.005434,
+ -0.057126,0.907989,0.415082,0.054803,0.07308,-0.00557,
+ -0.170477,0.893669,0.415082,0.052657,0.072809,-0.00557,
+ -0.160025,0.838881,0.52026,0.05267,0.072739,-0.005434,
+ -0.107036,0.847274,0.52026,0.053735,0.072907,-0.005434,
+ -0.170477,0.893669,0.415082,0.052657,0.072809,-0.00557,
+ -0.107036,0.847274,0.52026,0.053735,0.072907,-0.005434,
+ -0.114026,0.90261,0.415082,0.053726,0.072978,-0.00557,
+ -0.226254,0.881202,0.415082,0.051601,0.072573,-0.00557,
+ -0.212383,0.827178,0.52026,0.051619,0.072503,-0.005434,
+ -0.160025,0.838881,0.52026,0.05267,0.072739,-0.005434,
+ -0.226254,0.881202,0.415082,0.051601,0.072573,-0.00557,
+ -0.160025,0.838881,0.52026,0.05267,0.072739,-0.005434,
+ -0.170477,0.893669,0.415082,0.052657,0.072809,-0.00557,
+ -0.281139,0.865256,0.415082,0.050561,0.072271,-0.00557,
+ -0.263903,0.81221,0.52026,0.050584,0.072203,-0.005434,
+ -0.212383,0.827178,0.52026,0.051619,0.072503,-0.005434,
+ -0.281139,0.865256,0.415082,0.050561,0.072271,-0.00557,
+ -0.212383,0.827178,0.52026,0.051619,0.072503,-0.005434,
+ -0.226254,0.881202,0.415082,0.051601,0.072573,-0.00557,
+ -0.334914,0.845896,0.415082,0.049543,0.071905,-0.00557,
+ -0.314381,0.794037,0.52026,0.049569,0.071838,-0.005434,
+ -0.263903,0.81221,0.52026,0.050584,0.072203,-0.005434,
+ -0.334914,0.845896,0.415082,0.049543,0.071905,-0.00557,
+ -0.263903,0.81221,0.52026,0.050584,0.072203,-0.005434,
+ -0.281139,0.865256,0.415082,0.050561,0.072271,-0.00557,
+ -0.387367,0.823197,0.415082,0.048549,0.071475,-0.00557,
+ -0.363619,0.77273,0.52026,0.04858,0.07141,-0.005434,
+ -0.314381,0.794037,0.52026,0.049569,0.071838,-0.005434,
+ -0.387367,0.823197,0.415082,0.048549,0.071475,-0.00557,
+ -0.314381,0.794037,0.52026,0.049569,0.071838,-0.005434,
+ -0.334914,0.845896,0.415082,0.049543,0.071905,-0.00557,
+ -0.438292,0.79725,0.415082,0.047585,0.070983,-0.00557,
+ -0.411421,0.748373,0.52026,0.04762,0.07092,-0.005434,
+ -0.363619,0.77273,0.52026,0.04858,0.07141,-0.005434,
+ -0.438292,0.79725,0.415082,0.047585,0.070983,-0.00557,
+ -0.363619,0.77273,0.52026,0.04858,0.07141,-0.005434,
+ -0.387367,0.823197,0.415082,0.048549,0.071475,-0.00557,
+ -0.487487,0.768156,0.415082,0.046653,0.070432,-0.00557,
+ -0.4576,0.721063,0.52026,0.046692,0.070372,-0.005434,
+ -0.411421,0.748373,0.52026,0.04762,0.07092,-0.005434,
+ -0.487487,0.768156,0.415082,0.046653,0.070432,-0.00557,
+ -0.411421,0.748373,0.52026,0.04762,0.07092,-0.005434,
+ -0.438292,0.79725,0.415082,0.047585,0.070983,-0.00557,
+ -0.534758,0.736031,0.415082,0.045758,0.069824,-0.00557,
+ -0.501973,0.690907,0.52026,0.045801,0.069766,-0.005434,
+ -0.4576,0.721063,0.52026,0.046692,0.070372,-0.005434,
+ -0.534758,0.736031,0.415082,0.045758,0.069824,-0.00557,
+ -0.4576,0.721063,0.52026,0.046692,0.070372,-0.005434,
+ -0.487487,0.768156,0.415082,0.046653,0.070432,-0.00557,
+ -0.579918,0.701001,0.415082,0.044903,0.069161,-0.00557,
+ -0.544365,0.658024,0.52026,0.044949,0.069105,-0.005434,
+ -0.501973,0.690907,0.52026,0.045801,0.069766,-0.005434,
+ -0.579918,0.701001,0.415082,0.044903,0.069161,-0.00557,
+ -0.501973,0.690907,0.52026,0.045801,0.069766,-0.005434,
+ -0.534758,0.736031,0.415082,0.045758,0.069824,-0.00557,
+ -0.62279,0.663204,0.415082,0.044091,0.068445,-0.00557,
+ -0.584609,0.622545,0.52026,0.04414,0.068392,-0.005434,
+ -0.544365,0.658024,0.52026,0.044949,0.069105,-0.005434,
+ -0.62279,0.663204,0.415082,0.044091,0.068445,-0.00557,
+ -0.544365,0.658024,0.52026,0.044949,0.069105,-0.005434,
+ -0.579918,0.701001,0.415082,0.044903,0.069161,-0.00557,
+ -0.663204,0.62279,0.415082,0.043326,0.067679,-0.00557,
+ -0.622545,0.584609,0.52026,0.043378,0.06763,-0.005434,
+ -0.584609,0.622545,0.52026,0.04414,0.068392,-0.005434,
+ -0.663204,0.62279,0.415082,0.043326,0.067679,-0.00557,
+ -0.584609,0.622545,0.52026,0.04414,0.068392,-0.005434,
+ -0.62279,0.663204,0.415082,0.044091,0.068445,-0.00557,
+ -0.701001,0.579918,0.415082,0.04261,0.066868,-0.00557,
+ -0.658024,0.544365,0.52026,0.042666,0.066822,-0.005434,
+ -0.622545,0.584609,0.52026,0.043378,0.06763,-0.005434,
+ -0.701001,0.579918,0.415082,0.04261,0.066868,-0.00557,
+ -0.622545,0.584609,0.52026,0.043378,0.06763,-0.005434,
+ -0.663204,0.62279,0.415082,0.043326,0.067679,-0.00557,
+ -0.736031,0.534758,0.415082,0.041947,0.066012,-0.00557,
+ -0.690907,0.501973,0.52026,0.042005,0.06597,-0.005434,
+ -0.658024,0.544365,0.52026,0.042666,0.066822,-0.005434,
+ -0.736031,0.534758,0.415082,0.041947,0.066012,-0.00557,
+ -0.658024,0.544365,0.52026,0.042666,0.066822,-0.005434,
+ -0.701001,0.579918,0.415082,0.04261,0.066868,-0.00557,
+ -0.768156,0.487487,0.415082,0.041338,0.065117,-0.00557,
+ -0.721063,0.4576,0.52026,0.041399,0.065079,-0.005434,
+ -0.690907,0.501973,0.52026,0.042005,0.06597,-0.005434,
+ -0.768156,0.487487,0.415082,0.041338,0.065117,-0.00557,
+ -0.690907,0.501973,0.52026,0.042005,0.06597,-0.005434,
+ -0.736031,0.534758,0.415082,0.041947,0.066012,-0.00557,
+ -0.79725,0.438292,0.415082,0.040787,0.064185,-0.00557,
+ -0.748373,0.411421,0.52026,0.04085,0.064151,-0.005434,
+ -0.721063,0.4576,0.52026,0.041399,0.065079,-0.005434,
+ -0.79725,0.438292,0.415082,0.040787,0.064185,-0.00557,
+ -0.721063,0.4576,0.52026,0.041399,0.065079,-0.005434,
+ -0.768156,0.487487,0.415082,0.041338,0.065117,-0.00557,
+ -0.823197,0.387367,0.415082,0.040296,0.063221,-0.00557,
+ -0.77273,0.363619,0.52026,0.040361,0.06319,-0.005434,
+ -0.748373,0.411421,0.52026,0.04085,0.064151,-0.005434,
+ -0.823197,0.387367,0.415082,0.040296,0.063221,-0.00557,
+ -0.748373,0.411421,0.52026,0.04085,0.064151,-0.005434,
+ -0.79725,0.438292,0.415082,0.040787,0.064185,-0.00557,
+ -0.845896,0.334914,0.415082,0.039866,0.062228,-0.00557,
+ -0.794037,0.314381,0.52026,0.039933,0.062201,-0.005434,
+ -0.77273,0.363619,0.52026,0.040361,0.06319,-0.005434,
+ -0.845896,0.334914,0.415082,0.039866,0.062228,-0.00557,
+ -0.77273,0.363619,0.52026,0.040361,0.06319,-0.005434,
+ -0.823197,0.387367,0.415082,0.040296,0.063221,-0.00557,
+ -0.865256,0.281139,0.415082,0.0395,0.061209,-0.00557,
+ -0.81221,0.263903,0.52026,0.039568,0.061187,-0.005434,
+ -0.794037,0.314381,0.52026,0.039933,0.062201,-0.005434,
+ -0.865256,0.281139,0.415082,0.0395,0.061209,-0.00557,
+ -0.794037,0.314381,0.52026,0.039933,0.062201,-0.005434,
+ -0.845896,0.334914,0.415082,0.039866,0.062228,-0.00557,
+ -0.881202,0.226254,0.415082,0.039198,0.06017,-0.00557,
+ -0.827178,0.212383,0.52026,0.039267,0.060152,-0.005434,
+ -0.81221,0.263903,0.52026,0.039568,0.061187,-0.005434,
+ -0.881202,0.226254,0.415082,0.039198,0.06017,-0.00557,
+ -0.81221,0.263903,0.52026,0.039568,0.061187,-0.005434,
+ -0.865256,0.281139,0.415082,0.0395,0.061209,-0.00557,
+ -0.893669,0.170477,0.415082,0.038961,0.059114,-0.00557,
+ -0.838881,0.160025,0.52026,0.039032,0.0591,-0.005434,
+ -0.827178,0.212383,0.52026,0.039267,0.060152,-0.005434,
+ -0.893669,0.170477,0.415082,0.038961,0.059114,-0.00557,
+ -0.827178,0.212383,0.52026,0.039267,0.060152,-0.005434,
+ -0.881202,0.226254,0.415082,0.039198,0.06017,-0.00557,
+ -0.90261,0.114026,0.415082,0.038792,0.058045,-0.00557,
+ -0.847274,0.107036,0.52026,0.038863,0.058036,-0.005434,
+ -0.838881,0.160025,0.52026,0.039032,0.0591,-0.005434,
+ -0.90261,0.114026,0.415082,0.038792,0.058045,-0.00557,
+ -0.838881,0.160025,0.52026,0.039032,0.0591,-0.005434,
+ -0.893669,0.170477,0.415082,0.038961,0.059114,-0.00557,
+ -0.907989,0.057126,0.415082,0.03869,0.056967,-0.00557,
+ -0.852323,0.053624,0.52026,0.038762,0.056963,-0.005434,
+ -0.847274,0.107036,0.52026,0.038863,0.058036,-0.005434,
+ -0.907989,0.057126,0.415082,0.03869,0.056967,-0.00557,
+ -0.847274,0.107036,0.52026,0.038863,0.058036,-0.005434,
+ -0.90261,0.114026,0.415082,0.038792,0.058045,-0.00557,
+ -0.909784,0,0.415082,0.038656,0.055885,-0.00557,
+ -0.854008,0,0.52026,0.038728,0.055885,-0.005434,
+ -0.852323,0.053624,0.52026,0.038762,0.056963,-0.005434,
+ -0.909784,0,0.415082,0.038656,0.055885,-0.00557,
+ -0.852323,0.053624,0.52026,0.038762,0.056963,-0.005434,
+ -0.907989,0.057126,0.415082,0.03869,0.056967,-0.00557,
+ -0.907989,-0.057126,0.415082,0.03869,0.054803,-0.00557,
+ -0.852323,-0.053624,0.52026,0.038762,0.054808,-0.005434,
+ -0.854008,0,0.52026,0.038728,0.055885,-0.005434,
+ -0.907989,-0.057126,0.415082,0.03869,0.054803,-0.00557,
+ -0.854008,0,0.52026,0.038728,0.055885,-0.005434,
+ -0.909784,0,0.415082,0.038656,0.055885,-0.00557,
+ -0.90261,-0.114026,0.415082,0.038792,0.053726,-0.00557,
+ -0.847274,-0.107036,0.52026,0.038863,0.053735,-0.005434,
+ -0.852323,-0.053624,0.52026,0.038762,0.054808,-0.005434,
+ -0.90261,-0.114026,0.415082,0.038792,0.053726,-0.00557,
+ -0.852323,-0.053624,0.52026,0.038762,0.054808,-0.005434,
+ -0.907989,-0.057126,0.415082,0.03869,0.054803,-0.00557,
+ -0.847274,-0.107036,0.52026,0.038863,0.053735,-0.005434,
+ -0.779929,-0.098528,0.618064,0.03895,0.053746,-0.005308,
+ -0.784577,-0.049361,0.618064,0.038849,0.054813,-0.005308,
+ -0.847274,-0.107036,0.52026,0.038863,0.053735,-0.005434,
+ -0.784577,-0.049361,0.618064,0.038849,0.054813,-0.005308,
+ -0.852323,-0.053624,0.52026,0.038762,0.054808,-0.005434,
+ -0.838881,-0.160025,0.52026,0.039032,0.05267,-0.005434,
+ -0.772203,-0.147306,0.618064,0.039118,0.052687,-0.005308,
+ -0.779929,-0.098528,0.618064,0.03895,0.053746,-0.005308,
+ -0.838881,-0.160025,0.52026,0.039032,0.05267,-0.005434,
+ -0.779929,-0.098528,0.618064,0.03895,0.053746,-0.005308,
+ -0.847274,-0.107036,0.52026,0.038863,0.053735,-0.005434,
+ -0.827178,-0.212383,0.52026,0.039267,0.051619,-0.005434,
+ -0.76143,-0.195502,0.618064,0.039352,0.05164,-0.005308,
+ -0.772203,-0.147306,0.618064,0.039118,0.052687,-0.005308,
+ -0.827178,-0.212383,0.52026,0.039267,0.051619,-0.005434,
+ -0.772203,-0.147306,0.618064,0.039118,0.052687,-0.005308,
+ -0.838881,-0.160025,0.52026,0.039032,0.05267,-0.005434,
+ -0.81221,-0.263903,0.52026,0.039568,0.050584,-0.005434,
+ -0.747652,-0.242927,0.618064,0.039651,0.05061,-0.005308,
+ -0.76143,-0.195502,0.618064,0.039352,0.05164,-0.005308,
+ -0.81221,-0.263903,0.52026,0.039568,0.050584,-0.005434,
+ -0.76143,-0.195502,0.618064,0.039352,0.05164,-0.005308,
+ -0.827178,-0.212383,0.52026,0.039267,0.051619,-0.005434,
+ -0.794037,-0.314381,0.52026,0.039933,0.049569,-0.005434,
+ -0.730923,-0.289393,0.618064,0.040014,0.049601,-0.005308,
+ -0.747652,-0.242927,0.618064,0.039651,0.05061,-0.005308,
+ -0.794037,-0.314381,0.52026,0.039933,0.049569,-0.005434,
+ -0.747652,-0.242927,0.618064,0.039651,0.05061,-0.005308,
+ -0.81221,-0.263903,0.52026,0.039568,0.050584,-0.005434,
+ -0.77273,-0.363619,0.52026,0.040361,0.04858,-0.005434,
+ -0.71131,-0.334717,0.618064,0.04044,0.048617,-0.005308,
+ -0.730923,-0.289393,0.618064,0.040014,0.049601,-0.005308,
+ -0.77273,-0.363619,0.52026,0.040361,0.04858,-0.005434,
+ -0.730923,-0.289393,0.618064,0.040014,0.049601,-0.005308,
+ -0.794037,-0.314381,0.52026,0.039933,0.049569,-0.005434,
+ -0.748373,-0.411421,0.52026,0.04085,0.04762,-0.005434,
+ -0.688889,-0.37872,0.618064,0.040927,0.047662,-0.005308,
+ -0.71131,-0.334717,0.618064,0.04044,0.048617,-0.005308,
+ -0.748373,-0.411421,0.52026,0.04085,0.04762,-0.005434,
+ -0.71131,-0.334717,0.618064,0.04044,0.048617,-0.005308,
+ -0.77273,-0.363619,0.52026,0.040361,0.04858,-0.005434,
+ -0.721063,-0.4576,0.52026,0.041399,0.046692,-0.005434,
+ -0.66375,-0.421228,0.618064,0.041473,0.046739,-0.005308,
+ -0.688889,-0.37872,0.618064,0.040927,0.047662,-0.005308,
+ -0.721063,-0.4576,0.52026,0.041399,0.046692,-0.005434,
+ -0.688889,-0.37872,0.618064,0.040927,0.047662,-0.005308,
+ -0.748373,-0.411421,0.52026,0.04085,0.04762,-0.005434,
+ -0.690907,-0.501973,0.52026,0.042005,0.045801,-0.005434,
+ -0.635991,-0.462074,0.618064,0.042076,0.045852,-0.005308,
+ -0.66375,-0.421228,0.618064,0.041473,0.046739,-0.005308,
+ -0.690907,-0.501973,0.52026,0.042005,0.045801,-0.005434,
+ -0.66375,-0.421228,0.618064,0.041473,0.046739,-0.005308,
+ -0.721063,-0.4576,0.52026,0.041399,0.046692,-0.005434,
+ -0.658024,-0.544365,0.52026,0.042666,0.044949,-0.005434,
+ -0.605722,-0.501097,0.618064,0.042733,0.045005,-0.005308,
+ -0.635991,-0.462074,0.618064,0.042076,0.045852,-0.005308,
+ -0.658024,-0.544365,0.52026,0.042666,0.044949,-0.005434,
+ -0.635991,-0.462074,0.618064,0.042076,0.045852,-0.005308,
+ -0.690907,-0.501973,0.52026,0.042005,0.045801,-0.005434,
+ -0.622545,-0.584609,0.52026,0.043378,0.04414,-0.005434,
+ -0.573062,-0.538141,0.618064,0.043442,0.0442,-0.005308,
+ -0.605722,-0.501097,0.618064,0.042733,0.045005,-0.005308,
+ -0.622545,-0.584609,0.52026,0.043378,0.04414,-0.005434,
+ -0.605722,-0.501097,0.618064,0.042733,0.045005,-0.005308,
+ -0.658024,-0.544365,0.52026,0.042666,0.044949,-0.005434,
+ -0.584609,-0.622545,0.52026,0.04414,0.043378,-0.005434,
+ -0.538141,-0.573062,0.618064,0.0442,0.043442,-0.005308,
+ -0.573062,-0.538141,0.618064,0.043442,0.0442,-0.005308,
+ -0.584609,-0.622545,0.52026,0.04414,0.043378,-0.005434,
+ -0.573062,-0.538141,0.618064,0.043442,0.0442,-0.005308,
+ -0.622545,-0.584609,0.52026,0.043378,0.04414,-0.005434,
+ -0.544365,-0.658024,0.52026,0.044949,0.042666,-0.005434,
+ -0.501097,-0.605722,0.618064,0.045005,0.042733,-0.005308,
+ -0.538141,-0.573062,0.618064,0.0442,0.043442,-0.005308,
+ -0.544365,-0.658024,0.52026,0.044949,0.042666,-0.005434,
+ -0.538141,-0.573062,0.618064,0.0442,0.043442,-0.005308,
+ -0.584609,-0.622545,0.52026,0.04414,0.043378,-0.005434,
+ -0.501973,-0.690907,0.52026,0.045801,0.042005,-0.005434,
+ -0.462074,-0.635991,0.618064,0.045852,0.042076,-0.005308,
+ -0.501097,-0.605722,0.618064,0.045005,0.042733,-0.005308,
+ -0.501973,-0.690907,0.52026,0.045801,0.042005,-0.005434,
+ -0.501097,-0.605722,0.618064,0.045005,0.042733,-0.005308,
+ -0.544365,-0.658024,0.52026,0.044949,0.042666,-0.005434,
+ -0.4576,-0.721063,0.52026,0.046692,0.041399,-0.005434,
+ -0.421228,-0.66375,0.618064,0.046739,0.041473,-0.005308,
+ -0.462074,-0.635991,0.618064,0.045852,0.042076,-0.005308,
+ -0.4576,-0.721063,0.52026,0.046692,0.041399,-0.005434,
+ -0.462074,-0.635991,0.618064,0.045852,0.042076,-0.005308,
+ -0.501973,-0.690907,0.52026,0.045801,0.042005,-0.005434,
+ -0.411421,-0.748373,0.52026,0.04762,0.04085,-0.005434,
+ -0.37872,-0.688889,0.618064,0.047662,0.040927,-0.005308,
+ -0.421228,-0.66375,0.618064,0.046739,0.041473,-0.005308,
+ -0.411421,-0.748373,0.52026,0.04762,0.04085,-0.005434,
+ -0.421228,-0.66375,0.618064,0.046739,0.041473,-0.005308,
+ -0.4576,-0.721063,0.52026,0.046692,0.041399,-0.005434,
+ -0.363619,-0.77273,0.52026,0.04858,0.040361,-0.005434,
+ -0.334717,-0.71131,0.618064,0.048617,0.04044,-0.005308,
+ -0.37872,-0.688889,0.618064,0.047662,0.040927,-0.005308,
+ -0.363619,-0.77273,0.52026,0.04858,0.040361,-0.005434,
+ -0.37872,-0.688889,0.618064,0.047662,0.040927,-0.005308,
+ -0.411421,-0.748373,0.52026,0.04762,0.04085,-0.005434,
+ -0.314381,-0.794037,0.52026,0.049569,0.039933,-0.005434,
+ -0.289393,-0.730923,0.618064,0.049601,0.040014,-0.005308,
+ -0.334717,-0.71131,0.618064,0.048617,0.04044,-0.005308,
+ -0.314381,-0.794037,0.52026,0.049569,0.039933,-0.005434,
+ -0.334717,-0.71131,0.618064,0.048617,0.04044,-0.005308,
+ -0.363619,-0.77273,0.52026,0.04858,0.040361,-0.005434,
+ -0.263903,-0.81221,0.52026,0.050584,0.039568,-0.005434,
+ -0.242927,-0.747652,0.618064,0.05061,0.039651,-0.005308,
+ -0.289393,-0.730923,0.618064,0.049601,0.040014,-0.005308,
+ -0.263903,-0.81221,0.52026,0.050584,0.039568,-0.005434,
+ -0.289393,-0.730923,0.618064,0.049601,0.040014,-0.005308,
+ -0.314381,-0.794037,0.52026,0.049569,0.039933,-0.005434,
+ -0.212383,-0.827178,0.52026,0.051619,0.039267,-0.005434,
+ -0.195502,-0.76143,0.618064,0.05164,0.039352,-0.005308,
+ -0.242927,-0.747652,0.618064,0.05061,0.039651,-0.005308,
+ -0.212383,-0.827178,0.52026,0.051619,0.039267,-0.005434,
+ -0.242927,-0.747652,0.618064,0.05061,0.039651,-0.005308,
+ -0.263903,-0.81221,0.52026,0.050584,0.039568,-0.005434,
+ -0.160025,-0.838881,0.52026,0.05267,0.039032,-0.005434,
+ -0.147306,-0.772203,0.618064,0.052687,0.039118,-0.005308,
+ -0.195502,-0.76143,0.618064,0.05164,0.039352,-0.005308,
+ -0.160025,-0.838881,0.52026,0.05267,0.039032,-0.005434,
+ -0.195502,-0.76143,0.618064,0.05164,0.039352,-0.005308,
+ -0.212383,-0.827178,0.52026,0.051619,0.039267,-0.005434,
+ -0.107036,-0.847274,0.52026,0.053735,0.038863,-0.005434,
+ -0.098528,-0.779929,0.618064,0.053746,0.03895,-0.005308,
+ -0.147306,-0.772203,0.618064,0.052687,0.039118,-0.005308,
+ -0.107036,-0.847274,0.52026,0.053735,0.038863,-0.005434,
+ -0.147306,-0.772203,0.618064,0.052687,0.039118,-0.005308,
+ -0.160025,-0.838881,0.52026,0.05267,0.039032,-0.005434,
+ -0.053624,-0.852323,0.52026,0.054808,0.038762,-0.005434,
+ -0.049361,-0.784577,0.618064,0.054813,0.038849,-0.005308,
+ -0.098528,-0.779929,0.618064,0.053746,0.03895,-0.005308,
+ -0.053624,-0.852323,0.52026,0.054808,0.038762,-0.005434,
+ -0.098528,-0.779929,0.618064,0.053746,0.03895,-0.005308,
+ -0.107036,-0.847274,0.52026,0.053735,0.038863,-0.005434,
+ 0,-0.854008,0.52026,0.055885,0.038728,-0.005434,
+ 0,-0.786128,0.618064,0.055885,0.038816,-0.005308,
+ -0.049361,-0.784577,0.618064,0.054813,0.038849,-0.005308,
+ 0,-0.854008,0.52026,0.055885,0.038728,-0.005434,
+ -0.049361,-0.784577,0.618064,0.054813,0.038849,-0.005308,
+ -0.053624,-0.852323,0.52026,0.054808,0.038762,-0.005434,
+ 0.053624,-0.852323,0.52026,0.056963,0.038762,-0.005434,
+ 0.049361,-0.784577,0.618064,0.056957,0.038849,-0.005308,
+ 0,-0.786128,0.618064,0.055885,0.038816,-0.005308,
+ 0.053624,-0.852323,0.52026,0.056963,0.038762,-0.005434,
+ 0,-0.786128,0.618064,0.055885,0.038816,-0.005308,
+ 0,-0.854008,0.52026,0.055885,0.038728,-0.005434,
+ 0.107036,-0.847274,0.52026,0.058036,0.038863,-0.005434,
+ 0.098528,-0.779929,0.618064,0.058025,0.03895,-0.005308,
+ 0.049361,-0.784577,0.618064,0.056957,0.038849,-0.005308,
+ 0.107036,-0.847274,0.52026,0.058036,0.038863,-0.005434,
+ 0.049361,-0.784577,0.618064,0.056957,0.038849,-0.005308,
+ 0.053624,-0.852323,0.52026,0.056963,0.038762,-0.005434,
+ 0.160025,-0.838881,0.52026,0.0591,0.039032,-0.005434,
+ 0.147306,-0.772203,0.618064,0.059084,0.039118,-0.005308,
+ 0.098528,-0.779929,0.618064,0.058025,0.03895,-0.005308,
+ 0.160025,-0.838881,0.52026,0.0591,0.039032,-0.005434,
+ 0.098528,-0.779929,0.618064,0.058025,0.03895,-0.005308,
+ 0.107036,-0.847274,0.52026,0.058036,0.038863,-0.005434,
+ 0.212383,-0.827178,0.52026,0.060152,0.039267,-0.005434,
+ 0.195502,-0.76143,0.618064,0.06013,0.039352,-0.005308,
+ 0.147306,-0.772203,0.618064,0.059084,0.039118,-0.005308,
+ 0.212383,-0.827178,0.52026,0.060152,0.039267,-0.005434,
+ 0.147306,-0.772203,0.618064,0.059084,0.039118,-0.005308,
+ 0.160025,-0.838881,0.52026,0.0591,0.039032,-0.005434,
+ 0.263903,-0.81221,0.52026,0.061187,0.039568,-0.005434,
+ 0.242927,-0.747652,0.618064,0.06116,0.039651,-0.005308,
+ 0.195502,-0.76143,0.618064,0.06013,0.039352,-0.005308,
+ 0.263903,-0.81221,0.52026,0.061187,0.039568,-0.005434,
+ 0.195502,-0.76143,0.618064,0.06013,0.039352,-0.005308,
+ 0.212383,-0.827178,0.52026,0.060152,0.039267,-0.005434,
+ 0.314381,-0.794037,0.52026,0.062201,0.039933,-0.005434,
+ 0.289393,-0.730923,0.618064,0.062169,0.040014,-0.005308,
+ 0.242927,-0.747652,0.618064,0.06116,0.039651,-0.005308,
+ 0.314381,-0.794037,0.52026,0.062201,0.039933,-0.005434,
+ 0.242927,-0.747652,0.618064,0.06116,0.039651,-0.005308,
+ 0.263903,-0.81221,0.52026,0.061187,0.039568,-0.005434,
+ 0.363619,-0.77273,0.52026,0.06319,0.040361,-0.005434,
+ 0.334717,-0.71131,0.618064,0.063153,0.04044,-0.005308,
+ 0.289393,-0.730923,0.618064,0.062169,0.040014,-0.005308,
+ 0.363619,-0.77273,0.52026,0.06319,0.040361,-0.005434,
+ 0.289393,-0.730923,0.618064,0.062169,0.040014,-0.005308,
+ 0.314381,-0.794037,0.52026,0.062201,0.039933,-0.005434,
+ 0.411421,-0.748373,0.52026,0.064151,0.04085,-0.005434,
+ 0.37872,-0.688889,0.618064,0.064109,0.040927,-0.005308,
+ 0.334717,-0.71131,0.618064,0.063153,0.04044,-0.005308,
+ 0.411421,-0.748373,0.52026,0.064151,0.04085,-0.005434,
+ 0.334717,-0.71131,0.618064,0.063153,0.04044,-0.005308,
+ 0.363619,-0.77273,0.52026,0.06319,0.040361,-0.005434,
+ 0.4576,-0.721063,0.52026,0.065079,0.041399,-0.005434,
+ 0.421228,-0.66375,0.618064,0.065032,0.041473,-0.005308,
+ 0.37872,-0.688889,0.618064,0.064109,0.040927,-0.005308,
+ 0.4576,-0.721063,0.52026,0.065079,0.041399,-0.005434,
+ 0.37872,-0.688889,0.618064,0.064109,0.040927,-0.005308,
+ 0.411421,-0.748373,0.52026,0.064151,0.04085,-0.005434,
+ 0.501973,-0.690907,0.52026,0.06597,0.042005,-0.005434,
+ 0.462074,-0.635991,0.618064,0.065919,0.042076,-0.005308,
+ 0.421228,-0.66375,0.618064,0.065032,0.041473,-0.005308,
+ 0.501973,-0.690907,0.52026,0.06597,0.042005,-0.005434,
+ 0.421228,-0.66375,0.618064,0.065032,0.041473,-0.005308,
+ 0.4576,-0.721063,0.52026,0.065079,0.041399,-0.005434,
+ 0.544365,-0.658024,0.52026,0.066822,0.042666,-0.005434,
+ 0.501097,-0.605722,0.618064,0.066766,0.042733,-0.005308,
+ 0.462074,-0.635991,0.618064,0.065919,0.042076,-0.005308,
+ 0.544365,-0.658024,0.52026,0.066822,0.042666,-0.005434,
+ 0.462074,-0.635991,0.618064,0.065919,0.042076,-0.005308,
+ 0.501973,-0.690907,0.52026,0.06597,0.042005,-0.005434,
+ 0.584609,-0.622545,0.52026,0.06763,0.043378,-0.005434,
+ 0.538141,-0.573062,0.618064,0.06757,0.043442,-0.005308,
+ 0.501097,-0.605722,0.618064,0.066766,0.042733,-0.005308,
+ 0.584609,-0.622545,0.52026,0.06763,0.043378,-0.005434,
+ 0.501097,-0.605722,0.618064,0.066766,0.042733,-0.005308,
+ 0.544365,-0.658024,0.52026,0.066822,0.042666,-0.005434,
+ 0.622545,-0.584609,0.52026,0.068392,0.04414,-0.005434,
+ 0.573062,-0.538141,0.618064,0.068329,0.0442,-0.005308,
+ 0.538141,-0.573062,0.618064,0.06757,0.043442,-0.005308,
+ 0.622545,-0.584609,0.52026,0.068392,0.04414,-0.005434,
+ 0.538141,-0.573062,0.618064,0.06757,0.043442,-0.005308,
+ 0.584609,-0.622545,0.52026,0.06763,0.043378,-0.005434,
+ 0.658024,-0.544365,0.52026,0.069105,0.044949,-0.005434,
+ 0.605722,-0.501097,0.618064,0.069038,0.045005,-0.005308,
+ 0.573062,-0.538141,0.618064,0.068329,0.0442,-0.005308,
+ 0.658024,-0.544365,0.52026,0.069105,0.044949,-0.005434,
+ 0.573062,-0.538141,0.618064,0.068329,0.0442,-0.005308,
+ 0.622545,-0.584609,0.52026,0.068392,0.04414,-0.005434,
+ 0.690907,-0.501973,0.52026,0.069766,0.045801,-0.005434,
+ 0.635991,-0.462074,0.618064,0.069695,0.045852,-0.005308,
+ 0.605722,-0.501097,0.618064,0.069038,0.045005,-0.005308,
+ 0.690907,-0.501973,0.52026,0.069766,0.045801,-0.005434,
+ 0.605722,-0.501097,0.618064,0.069038,0.045005,-0.005308,
+ 0.658024,-0.544365,0.52026,0.069105,0.044949,-0.005434,
+ 0.721063,-0.4576,0.52026,0.070372,0.046692,-0.005434,
+ 0.66375,-0.421228,0.618064,0.070298,0.046739,-0.005308,
+ 0.635991,-0.462074,0.618064,0.069695,0.045852,-0.005308,
+ 0.721063,-0.4576,0.52026,0.070372,0.046692,-0.005434,
+ 0.635991,-0.462074,0.618064,0.069695,0.045852,-0.005308,
+ 0.690907,-0.501973,0.52026,0.069766,0.045801,-0.005434,
+ 0.748373,-0.411421,0.52026,0.07092,0.04762,-0.005434,
+ 0.688889,-0.37872,0.618064,0.070844,0.047662,-0.005308,
+ 0.66375,-0.421228,0.618064,0.070298,0.046739,-0.005308,
+ 0.748373,-0.411421,0.52026,0.07092,0.04762,-0.005434,
+ 0.66375,-0.421228,0.618064,0.070298,0.046739,-0.005308,
+ 0.721063,-0.4576,0.52026,0.070372,0.046692,-0.005434,
+ 0.77273,-0.363619,0.52026,0.07141,0.04858,-0.005434,
+ 0.71131,-0.334717,0.618064,0.07133,0.048617,-0.005308,
+ 0.688889,-0.37872,0.618064,0.070844,0.047662,-0.005308,
+ 0.77273,-0.363619,0.52026,0.07141,0.04858,-0.005434,
+ 0.688889,-0.37872,0.618064,0.070844,0.047662,-0.005308,
+ 0.748373,-0.411421,0.52026,0.07092,0.04762,-0.005434,
+ 0.794037,-0.314381,0.52026,0.071838,0.049569,-0.005434,
+ 0.730923,-0.289393,0.618064,0.071756,0.049601,-0.005308,
+ 0.71131,-0.334717,0.618064,0.07133,0.048617,-0.005308,
+ 0.794037,-0.314381,0.52026,0.071838,0.049569,-0.005434,
+ 0.71131,-0.334717,0.618064,0.07133,0.048617,-0.005308,
+ 0.77273,-0.363619,0.52026,0.07141,0.04858,-0.005434,
+ 0.81221,-0.263903,0.52026,0.072203,0.050584,-0.005434,
+ 0.747652,-0.242927,0.618064,0.07212,0.05061,-0.005308,
+ 0.730923,-0.289393,0.618064,0.071756,0.049601,-0.005308,
+ 0.81221,-0.263903,0.52026,0.072203,0.050584,-0.005434,
+ 0.730923,-0.289393,0.618064,0.071756,0.049601,-0.005308,
+ 0.794037,-0.314381,0.52026,0.071838,0.049569,-0.005434,
+ 0.827178,-0.212383,0.52026,0.072503,0.051619,-0.005434,
+ 0.76143,-0.195502,0.618064,0.072419,0.05164,-0.005308,
+ 0.747652,-0.242927,0.618064,0.07212,0.05061,-0.005308,
+ 0.827178,-0.212383,0.52026,0.072503,0.051619,-0.005434,
+ 0.747652,-0.242927,0.618064,0.07212,0.05061,-0.005308,
+ 0.81221,-0.263903,0.52026,0.072203,0.050584,-0.005434,
+ 0.838881,-0.160025,0.52026,0.072739,0.05267,-0.005434,
+ 0.772203,-0.147306,0.618064,0.072653,0.052687,-0.005308,
+ 0.76143,-0.195502,0.618064,0.072419,0.05164,-0.005308,
+ 0.838881,-0.160025,0.52026,0.072739,0.05267,-0.005434,
+ 0.76143,-0.195502,0.618064,0.072419,0.05164,-0.005308,
+ 0.827178,-0.212383,0.52026,0.072503,0.051619,-0.005434,
+ 0.847274,-0.107036,0.52026,0.072907,0.053735,-0.005434,
+ 0.779929,-0.098528,0.618064,0.07282,0.053746,-0.005308,
+ 0.772203,-0.147306,0.618064,0.072653,0.052687,-0.005308,
+ 0.847274,-0.107036,0.52026,0.072907,0.053735,-0.005434,
+ 0.772203,-0.147306,0.618064,0.072653,0.052687,-0.005308,
+ 0.838881,-0.160025,0.52026,0.072739,0.05267,-0.005434,
+ 0.852323,-0.053624,0.52026,0.073009,0.054808,-0.005434,
+ 0.784577,-0.049361,0.618064,0.072921,0.054813,-0.005308,
+ 0.779929,-0.098528,0.618064,0.07282,0.053746,-0.005308,
+ 0.852323,-0.053624,0.52026,0.073009,0.054808,-0.005434,
+ 0.779929,-0.098528,0.618064,0.07282,0.053746,-0.005308,
+ 0.847274,-0.107036,0.52026,0.072907,0.053735,-0.005434,
+ 0.854008,0,0.52026,0.073042,0.055885,-0.005434,
+ 0.786128,0,0.618064,0.072955,0.055885,-0.005308,
+ 0.784577,-0.049361,0.618064,0.072921,0.054813,-0.005308,
+ 0.854008,0,0.52026,0.073042,0.055885,-0.005434,
+ 0.784577,-0.049361,0.618064,0.072921,0.054813,-0.005308,
+ 0.852323,-0.053624,0.52026,0.073009,0.054808,-0.005434,
+ 0.852323,0.053624,0.52026,0.073009,0.056963,-0.005434,
+ 0.784577,0.049361,0.618064,0.072921,0.056957,-0.005308,
+ 0.786128,0,0.618064,0.072955,0.055885,-0.005308,
+ 0.852323,0.053624,0.52026,0.073009,0.056963,-0.005434,
+ 0.786128,0,0.618064,0.072955,0.055885,-0.005308,
+ 0.854008,0,0.52026,0.073042,0.055885,-0.005434,
+ 0.847274,0.107036,0.52026,0.072907,0.058036,-0.005434,
+ 0.779929,0.098528,0.618064,0.07282,0.058025,-0.005308,
+ 0.784577,0.049361,0.618064,0.072921,0.056957,-0.005308,
+ 0.847274,0.107036,0.52026,0.072907,0.058036,-0.005434,
+ 0.784577,0.049361,0.618064,0.072921,0.056957,-0.005308,
+ 0.852323,0.053624,0.52026,0.073009,0.056963,-0.005434,
+ 0.838881,0.160025,0.52026,0.072739,0.0591,-0.005434,
+ 0.772203,0.147306,0.618064,0.072653,0.059084,-0.005308,
+ 0.779929,0.098528,0.618064,0.07282,0.058025,-0.005308,
+ 0.838881,0.160025,0.52026,0.072739,0.0591,-0.005434,
+ 0.779929,0.098528,0.618064,0.07282,0.058025,-0.005308,
+ 0.847274,0.107036,0.52026,0.072907,0.058036,-0.005434,
+ 0.827178,0.212383,0.52026,0.072503,0.060152,-0.005434,
+ 0.76143,0.195502,0.618064,0.072419,0.06013,-0.005308,
+ 0.772203,0.147306,0.618064,0.072653,0.059084,-0.005308,
+ 0.827178,0.212383,0.52026,0.072503,0.060152,-0.005434,
+ 0.772203,0.147306,0.618064,0.072653,0.059084,-0.005308,
+ 0.838881,0.160025,0.52026,0.072739,0.0591,-0.005434,
+ 0.81221,0.263903,0.52026,0.072203,0.061187,-0.005434,
+ 0.747652,0.242927,0.618064,0.07212,0.06116,-0.005308,
+ 0.76143,0.195502,0.618064,0.072419,0.06013,-0.005308,
+ 0.81221,0.263903,0.52026,0.072203,0.061187,-0.005434,
+ 0.76143,0.195502,0.618064,0.072419,0.06013,-0.005308,
+ 0.827178,0.212383,0.52026,0.072503,0.060152,-0.005434,
+ 0.794037,0.314381,0.52026,0.071838,0.062201,-0.005434,
+ 0.730923,0.289393,0.618064,0.071756,0.062169,-0.005308,
+ 0.747652,0.242927,0.618064,0.07212,0.06116,-0.005308,
+ 0.794037,0.314381,0.52026,0.071838,0.062201,-0.005434,
+ 0.747652,0.242927,0.618064,0.07212,0.06116,-0.005308,
+ 0.81221,0.263903,0.52026,0.072203,0.061187,-0.005434,
+ 0.77273,0.363619,0.52026,0.07141,0.06319,-0.005434,
+ 0.71131,0.334717,0.618064,0.07133,0.063153,-0.005308,
+ 0.730923,0.289393,0.618064,0.071756,0.062169,-0.005308,
+ 0.77273,0.363619,0.52026,0.07141,0.06319,-0.005434,
+ 0.730923,0.289393,0.618064,0.071756,0.062169,-0.005308,
+ 0.794037,0.314381,0.52026,0.071838,0.062201,-0.005434,
+ 0.748373,0.411421,0.52026,0.07092,0.064151,-0.005434,
+ 0.688889,0.37872,0.618064,0.070844,0.064109,-0.005308,
+ 0.71131,0.334717,0.618064,0.07133,0.063153,-0.005308,
+ 0.748373,0.411421,0.52026,0.07092,0.064151,-0.005434,
+ 0.71131,0.334717,0.618064,0.07133,0.063153,-0.005308,
+ 0.77273,0.363619,0.52026,0.07141,0.06319,-0.005434,
+ 0.721063,0.4576,0.52026,0.070372,0.065079,-0.005434,
+ 0.66375,0.421228,0.618064,0.070298,0.065032,-0.005308,
+ 0.688889,0.37872,0.618064,0.070844,0.064109,-0.005308,
+ 0.721063,0.4576,0.52026,0.070372,0.065079,-0.005434,
+ 0.688889,0.37872,0.618064,0.070844,0.064109,-0.005308,
+ 0.748373,0.411421,0.52026,0.07092,0.064151,-0.005434,
+ 0.690907,0.501973,0.52026,0.069766,0.06597,-0.005434,
+ 0.635991,0.462074,0.618064,0.069695,0.065919,-0.005308,
+ 0.66375,0.421228,0.618064,0.070298,0.065032,-0.005308,
+ 0.690907,0.501973,0.52026,0.069766,0.06597,-0.005434,
+ 0.66375,0.421228,0.618064,0.070298,0.065032,-0.005308,
+ 0.721063,0.4576,0.52026,0.070372,0.065079,-0.005434,
+ 0.658024,0.544365,0.52026,0.069105,0.066822,-0.005434,
+ 0.605722,0.501097,0.618064,0.069038,0.066766,-0.005308,
+ 0.635991,0.462074,0.618064,0.069695,0.065919,-0.005308,
+ 0.658024,0.544365,0.52026,0.069105,0.066822,-0.005434,
+ 0.635991,0.462074,0.618064,0.069695,0.065919,-0.005308,
+ 0.690907,0.501973,0.52026,0.069766,0.06597,-0.005434,
+ 0.622545,0.584609,0.52026,0.068392,0.06763,-0.005434,
+ 0.573062,0.538141,0.618064,0.068329,0.06757,-0.005308,
+ 0.605722,0.501097,0.618064,0.069038,0.066766,-0.005308,
+ 0.622545,0.584609,0.52026,0.068392,0.06763,-0.005434,
+ 0.605722,0.501097,0.618064,0.069038,0.066766,-0.005308,
+ 0.658024,0.544365,0.52026,0.069105,0.066822,-0.005434,
+ 0.584609,0.622545,0.52026,0.06763,0.068392,-0.005434,
+ 0.538141,0.573062,0.618064,0.06757,0.068329,-0.005308,
+ 0.573062,0.538141,0.618064,0.068329,0.06757,-0.005308,
+ 0.584609,0.622545,0.52026,0.06763,0.068392,-0.005434,
+ 0.573062,0.538141,0.618064,0.068329,0.06757,-0.005308,
+ 0.622545,0.584609,0.52026,0.068392,0.06763,-0.005434,
+ 0.544365,0.658024,0.52026,0.066822,0.069105,-0.005434,
+ 0.501097,0.605722,0.618064,0.066766,0.069038,-0.005308,
+ 0.538141,0.573062,0.618064,0.06757,0.068329,-0.005308,
+ 0.544365,0.658024,0.52026,0.066822,0.069105,-0.005434,
+ 0.538141,0.573062,0.618064,0.06757,0.068329,-0.005308,
+ 0.584609,0.622545,0.52026,0.06763,0.068392,-0.005434,
+ 0.501973,0.690907,0.52026,0.06597,0.069766,-0.005434,
+ 0.462074,0.635991,0.618064,0.065919,0.069695,-0.005308,
+ 0.501097,0.605722,0.618064,0.066766,0.069038,-0.005308,
+ 0.501973,0.690907,0.52026,0.06597,0.069766,-0.005434,
+ 0.501097,0.605722,0.618064,0.066766,0.069038,-0.005308,
+ 0.544365,0.658024,0.52026,0.066822,0.069105,-0.005434,
+ 0.4576,0.721063,0.52026,0.065079,0.070372,-0.005434,
+ 0.421228,0.66375,0.618064,0.065032,0.070298,-0.005308,
+ 0.462074,0.635991,0.618064,0.065919,0.069695,-0.005308,
+ 0.4576,0.721063,0.52026,0.065079,0.070372,-0.005434,
+ 0.462074,0.635991,0.618064,0.065919,0.069695,-0.005308,
+ 0.501973,0.690907,0.52026,0.06597,0.069766,-0.005434,
+ 0.411421,0.748373,0.52026,0.064151,0.07092,-0.005434,
+ 0.37872,0.688889,0.618064,0.064109,0.070844,-0.005308,
+ 0.421228,0.66375,0.618064,0.065032,0.070298,-0.005308,
+ 0.411421,0.748373,0.52026,0.064151,0.07092,-0.005434,
+ 0.421228,0.66375,0.618064,0.065032,0.070298,-0.005308,
+ 0.4576,0.721063,0.52026,0.065079,0.070372,-0.005434,
+ 0.363619,0.77273,0.52026,0.06319,0.07141,-0.005434,
+ 0.334717,0.71131,0.618064,0.063153,0.07133,-0.005308,
+ 0.37872,0.688889,0.618064,0.064109,0.070844,-0.005308,
+ 0.363619,0.77273,0.52026,0.06319,0.07141,-0.005434,
+ 0.37872,0.688889,0.618064,0.064109,0.070844,-0.005308,
+ 0.411421,0.748373,0.52026,0.064151,0.07092,-0.005434,
+ 0.314381,0.794037,0.52026,0.062201,0.071838,-0.005434,
+ 0.289393,0.730923,0.618064,0.062169,0.071756,-0.005308,
+ 0.334717,0.71131,0.618064,0.063153,0.07133,-0.005308,
+ 0.314381,0.794037,0.52026,0.062201,0.071838,-0.005434,
+ 0.334717,0.71131,0.618064,0.063153,0.07133,-0.005308,
+ 0.363619,0.77273,0.52026,0.06319,0.07141,-0.005434,
+ 0.263903,0.81221,0.52026,0.061187,0.072203,-0.005434,
+ 0.242927,0.747652,0.618064,0.06116,0.07212,-0.005308,
+ 0.289393,0.730923,0.618064,0.062169,0.071756,-0.005308,
+ 0.263903,0.81221,0.52026,0.061187,0.072203,-0.005434,
+ 0.289393,0.730923,0.618064,0.062169,0.071756,-0.005308,
+ 0.314381,0.794037,0.52026,0.062201,0.071838,-0.005434,
+ 0.212383,0.827178,0.52026,0.060152,0.072503,-0.005434,
+ 0.195502,0.76143,0.618064,0.06013,0.072419,-0.005308,
+ 0.242927,0.747652,0.618064,0.06116,0.07212,-0.005308,
+ 0.212383,0.827178,0.52026,0.060152,0.072503,-0.005434,
+ 0.242927,0.747652,0.618064,0.06116,0.07212,-0.005308,
+ 0.263903,0.81221,0.52026,0.061187,0.072203,-0.005434,
+ 0.160025,0.838881,0.52026,0.0591,0.072739,-0.005434,
+ 0.147306,0.772203,0.618064,0.059084,0.072653,-0.005308,
+ 0.195502,0.76143,0.618064,0.06013,0.072419,-0.005308,
+ 0.160025,0.838881,0.52026,0.0591,0.072739,-0.005434,
+ 0.195502,0.76143,0.618064,0.06013,0.072419,-0.005308,
+ 0.212383,0.827178,0.52026,0.060152,0.072503,-0.005434,
+ 0.107036,0.847274,0.52026,0.058036,0.072907,-0.005434,
+ 0.098528,0.779929,0.618064,0.058025,0.07282,-0.005308,
+ 0.147306,0.772203,0.618064,0.059084,0.072653,-0.005308,
+ 0.107036,0.847274,0.52026,0.058036,0.072907,-0.005434,
+ 0.147306,0.772203,0.618064,0.059084,0.072653,-0.005308,
+ 0.160025,0.838881,0.52026,0.0591,0.072739,-0.005434,
+ 0.053624,0.852323,0.52026,0.056963,0.073009,-0.005434,
+ 0.049361,0.784577,0.618064,0.056957,0.072921,-0.005308,
+ 0.098528,0.779929,0.618064,0.058025,0.07282,-0.005308,
+ 0.053624,0.852323,0.52026,0.056963,0.073009,-0.005434,
+ 0.098528,0.779929,0.618064,0.058025,0.07282,-0.005308,
+ 0.107036,0.847274,0.52026,0.058036,0.072907,-0.005434,
+ 0,0.854008,0.52026,0.055885,0.073042,-0.005434,
+ 0,0.786128,0.618064,0.055885,0.072955,-0.005308,
+ 0.049361,0.784577,0.618064,0.056957,0.072921,-0.005308,
+ 0,0.854008,0.52026,0.055885,0.073042,-0.005434,
+ 0.049361,0.784577,0.618064,0.056957,0.072921,-0.005308,
+ 0.053624,0.852323,0.52026,0.056963,0.073009,-0.005434,
+ -0.053624,0.852323,0.52026,0.054808,0.073009,-0.005434,
+ -0.049361,0.784577,0.618064,0.054813,0.072921,-0.005308,
+ 0,0.786128,0.618064,0.055885,0.072955,-0.005308,
+ -0.053624,0.852323,0.52026,0.054808,0.073009,-0.005434,
+ 0,0.786128,0.618064,0.055885,0.072955,-0.005308,
+ 0,0.854008,0.52026,0.055885,0.073042,-0.005434,
+ -0.107036,0.847274,0.52026,0.053735,0.072907,-0.005434,
+ -0.098528,0.779929,0.618064,0.053746,0.07282,-0.005308,
+ -0.049361,0.784577,0.618064,0.054813,0.072921,-0.005308,
+ -0.107036,0.847274,0.52026,0.053735,0.072907,-0.005434,
+ -0.049361,0.784577,0.618064,0.054813,0.072921,-0.005308,
+ -0.053624,0.852323,0.52026,0.054808,0.073009,-0.005434,
+ -0.160025,0.838881,0.52026,0.05267,0.072739,-0.005434,
+ -0.147306,0.772203,0.618064,0.052687,0.072653,-0.005308,
+ -0.098528,0.779929,0.618064,0.053746,0.07282,-0.005308,
+ -0.160025,0.838881,0.52026,0.05267,0.072739,-0.005434,
+ -0.098528,0.779929,0.618064,0.053746,0.07282,-0.005308,
+ -0.107036,0.847274,0.52026,0.053735,0.072907,-0.005434,
+ -0.212383,0.827178,0.52026,0.051619,0.072503,-0.005434,
+ -0.195502,0.76143,0.618064,0.05164,0.072419,-0.005308,
+ -0.147306,0.772203,0.618064,0.052687,0.072653,-0.005308,
+ -0.212383,0.827178,0.52026,0.051619,0.072503,-0.005434,
+ -0.147306,0.772203,0.618064,0.052687,0.072653,-0.005308,
+ -0.160025,0.838881,0.52026,0.05267,0.072739,-0.005434,
+ -0.263903,0.81221,0.52026,0.050584,0.072203,-0.005434,
+ -0.242927,0.747652,0.618064,0.05061,0.07212,-0.005308,
+ -0.195502,0.76143,0.618064,0.05164,0.072419,-0.005308,
+ -0.263903,0.81221,0.52026,0.050584,0.072203,-0.005434,
+ -0.195502,0.76143,0.618064,0.05164,0.072419,-0.005308,
+ -0.212383,0.827178,0.52026,0.051619,0.072503,-0.005434,
+ -0.314381,0.794037,0.52026,0.049569,0.071838,-0.005434,
+ -0.289393,0.730923,0.618064,0.049601,0.071756,-0.005308,
+ -0.242927,0.747652,0.618064,0.05061,0.07212,-0.005308,
+ -0.314381,0.794037,0.52026,0.049569,0.071838,-0.005434,
+ -0.242927,0.747652,0.618064,0.05061,0.07212,-0.005308,
+ -0.263903,0.81221,0.52026,0.050584,0.072203,-0.005434,
+ -0.363619,0.77273,0.52026,0.04858,0.07141,-0.005434,
+ -0.334717,0.71131,0.618064,0.048617,0.07133,-0.005308,
+ -0.289393,0.730923,0.618064,0.049601,0.071756,-0.005308,
+ -0.363619,0.77273,0.52026,0.04858,0.07141,-0.005434,
+ -0.289393,0.730923,0.618064,0.049601,0.071756,-0.005308,
+ -0.314381,0.794037,0.52026,0.049569,0.071838,-0.005434,
+ -0.411421,0.748373,0.52026,0.04762,0.07092,-0.005434,
+ -0.37872,0.688889,0.618064,0.047662,0.070844,-0.005308,
+ -0.334717,0.71131,0.618064,0.048617,0.07133,-0.005308,
+ -0.411421,0.748373,0.52026,0.04762,0.07092,-0.005434,
+ -0.334717,0.71131,0.618064,0.048617,0.07133,-0.005308,
+ -0.363619,0.77273,0.52026,0.04858,0.07141,-0.005434,
+ -0.4576,0.721063,0.52026,0.046692,0.070372,-0.005434,
+ -0.421228,0.66375,0.618064,0.046739,0.070298,-0.005308,
+ -0.37872,0.688889,0.618064,0.047662,0.070844,-0.005308,
+ -0.4576,0.721063,0.52026,0.046692,0.070372,-0.005434,
+ -0.37872,0.688889,0.618064,0.047662,0.070844,-0.005308,
+ -0.411421,0.748373,0.52026,0.04762,0.07092,-0.005434,
+ -0.501973,0.690907,0.52026,0.045801,0.069766,-0.005434,
+ -0.462074,0.635991,0.618064,0.045852,0.069695,-0.005308,
+ -0.421228,0.66375,0.618064,0.046739,0.070298,-0.005308,
+ -0.501973,0.690907,0.52026,0.045801,0.069766,-0.005434,
+ -0.421228,0.66375,0.618064,0.046739,0.070298,-0.005308,
+ -0.4576,0.721063,0.52026,0.046692,0.070372,-0.005434,
+ -0.544365,0.658024,0.52026,0.044949,0.069105,-0.005434,
+ -0.501097,0.605722,0.618064,0.045005,0.069038,-0.005308,
+ -0.462074,0.635991,0.618064,0.045852,0.069695,-0.005308,
+ -0.544365,0.658024,0.52026,0.044949,0.069105,-0.005434,
+ -0.462074,0.635991,0.618064,0.045852,0.069695,-0.005308,
+ -0.501973,0.690907,0.52026,0.045801,0.069766,-0.005434,
+ -0.584609,0.622545,0.52026,0.04414,0.068392,-0.005434,
+ -0.538141,0.573062,0.618064,0.0442,0.068329,-0.005308,
+ -0.501097,0.605722,0.618064,0.045005,0.069038,-0.005308,
+ -0.584609,0.622545,0.52026,0.04414,0.068392,-0.005434,
+ -0.501097,0.605722,0.618064,0.045005,0.069038,-0.005308,
+ -0.544365,0.658024,0.52026,0.044949,0.069105,-0.005434,
+ -0.622545,0.584609,0.52026,0.043378,0.06763,-0.005434,
+ -0.573062,0.538141,0.618064,0.043442,0.06757,-0.005308,
+ -0.538141,0.573062,0.618064,0.0442,0.068329,-0.005308,
+ -0.622545,0.584609,0.52026,0.043378,0.06763,-0.005434,
+ -0.538141,0.573062,0.618064,0.0442,0.068329,-0.005308,
+ -0.584609,0.622545,0.52026,0.04414,0.068392,-0.005434,
+ -0.658024,0.544365,0.52026,0.042666,0.066822,-0.005434,
+ -0.605722,0.501097,0.618064,0.042733,0.066766,-0.005308,
+ -0.573062,0.538141,0.618064,0.043442,0.06757,-0.005308,
+ -0.658024,0.544365,0.52026,0.042666,0.066822,-0.005434,
+ -0.573062,0.538141,0.618064,0.043442,0.06757,-0.005308,
+ -0.622545,0.584609,0.52026,0.043378,0.06763,-0.005434,
+ -0.690907,0.501973,0.52026,0.042005,0.06597,-0.005434,
+ -0.635991,0.462074,0.618064,0.042076,0.065919,-0.005308,
+ -0.605722,0.501097,0.618064,0.042733,0.066766,-0.005308,
+ -0.690907,0.501973,0.52026,0.042005,0.06597,-0.005434,
+ -0.605722,0.501097,0.618064,0.042733,0.066766,-0.005308,
+ -0.658024,0.544365,0.52026,0.042666,0.066822,-0.005434,
+ -0.721063,0.4576,0.52026,0.041399,0.065079,-0.005434,
+ -0.66375,0.421228,0.618064,0.041473,0.065032,-0.005308,
+ -0.635991,0.462074,0.618064,0.042076,0.065919,-0.005308,
+ -0.721063,0.4576,0.52026,0.041399,0.065079,-0.005434,
+ -0.635991,0.462074,0.618064,0.042076,0.065919,-0.005308,
+ -0.690907,0.501973,0.52026,0.042005,0.06597,-0.005434,
+ -0.748373,0.411421,0.52026,0.04085,0.064151,-0.005434,
+ -0.688889,0.37872,0.618064,0.040927,0.064109,-0.005308,
+ -0.66375,0.421228,0.618064,0.041473,0.065032,-0.005308,
+ -0.748373,0.411421,0.52026,0.04085,0.064151,-0.005434,
+ -0.66375,0.421228,0.618064,0.041473,0.065032,-0.005308,
+ -0.721063,0.4576,0.52026,0.041399,0.065079,-0.005434,
+ -0.77273,0.363619,0.52026,0.040361,0.06319,-0.005434,
+ -0.71131,0.334717,0.618064,0.04044,0.063153,-0.005308,
+ -0.688889,0.37872,0.618064,0.040927,0.064109,-0.005308,
+ -0.77273,0.363619,0.52026,0.040361,0.06319,-0.005434,
+ -0.688889,0.37872,0.618064,0.040927,0.064109,-0.005308,
+ -0.748373,0.411421,0.52026,0.04085,0.064151,-0.005434,
+ -0.794037,0.314381,0.52026,0.039933,0.062201,-0.005434,
+ -0.730923,0.289393,0.618064,0.040014,0.062169,-0.005308,
+ -0.71131,0.334717,0.618064,0.04044,0.063153,-0.005308,
+ -0.794037,0.314381,0.52026,0.039933,0.062201,-0.005434,
+ -0.71131,0.334717,0.618064,0.04044,0.063153,-0.005308,
+ -0.77273,0.363619,0.52026,0.040361,0.06319,-0.005434,
+ -0.81221,0.263903,0.52026,0.039568,0.061187,-0.005434,
+ -0.747652,0.242927,0.618064,0.039651,0.06116,-0.005308,
+ -0.730923,0.289393,0.618064,0.040014,0.062169,-0.005308,
+ -0.81221,0.263903,0.52026,0.039568,0.061187,-0.005434,
+ -0.730923,0.289393,0.618064,0.040014,0.062169,-0.005308,
+ -0.794037,0.314381,0.52026,0.039933,0.062201,-0.005434,
+ -0.827178,0.212383,0.52026,0.039267,0.060152,-0.005434,
+ -0.76143,0.195502,0.618064,0.039352,0.06013,-0.005308,
+ -0.747652,0.242927,0.618064,0.039651,0.06116,-0.005308,
+ -0.827178,0.212383,0.52026,0.039267,0.060152,-0.005434,
+ -0.747652,0.242927,0.618064,0.039651,0.06116,-0.005308,
+ -0.81221,0.263903,0.52026,0.039568,0.061187,-0.005434,
+ -0.838881,0.160025,0.52026,0.039032,0.0591,-0.005434,
+ -0.772203,0.147306,0.618064,0.039118,0.059084,-0.005308,
+ -0.76143,0.195502,0.618064,0.039352,0.06013,-0.005308,
+ -0.838881,0.160025,0.52026,0.039032,0.0591,-0.005434,
+ -0.76143,0.195502,0.618064,0.039352,0.06013,-0.005308,
+ -0.827178,0.212383,0.52026,0.039267,0.060152,-0.005434,
+ -0.847274,0.107036,0.52026,0.038863,0.058036,-0.005434,
+ -0.779929,0.098528,0.618064,0.03895,0.058025,-0.005308,
+ -0.772203,0.147306,0.618064,0.039118,0.059084,-0.005308,
+ -0.847274,0.107036,0.52026,0.038863,0.058036,-0.005434,
+ -0.772203,0.147306,0.618064,0.039118,0.059084,-0.005308,
+ -0.838881,0.160025,0.52026,0.039032,0.0591,-0.005434,
+ -0.852323,0.053624,0.52026,0.038762,0.056963,-0.005434,
+ -0.784577,0.049361,0.618064,0.038849,0.056957,-0.005308,
+ -0.779929,0.098528,0.618064,0.03895,0.058025,-0.005308,
+ -0.852323,0.053624,0.52026,0.038762,0.056963,-0.005434,
+ -0.779929,0.098528,0.618064,0.03895,0.058025,-0.005308,
+ -0.847274,0.107036,0.52026,0.038863,0.058036,-0.005434,
+ -0.854008,0,0.52026,0.038728,0.055885,-0.005434,
+ -0.786128,0,0.618064,0.038816,0.055885,-0.005308,
+ -0.784577,0.049361,0.618064,0.038849,0.056957,-0.005308,
+ -0.854008,0,0.52026,0.038728,0.055885,-0.005434,
+ -0.784577,0.049361,0.618064,0.038849,0.056957,-0.005308,
+ -0.852323,0.053624,0.52026,0.038762,0.056963,-0.005434,
+ -0.852323,-0.053624,0.52026,0.038762,0.054808,-0.005434,
+ -0.784577,-0.049361,0.618064,0.038849,0.054813,-0.005308,
+ -0.786128,0,0.618064,0.038816,0.055885,-0.005308,
+ -0.852323,-0.053624,0.52026,0.038762,0.054808,-0.005434,
+ -0.786128,0,0.618064,0.038816,0.055885,-0.005308,
+ -0.854008,0,0.52026,0.038728,0.055885,-0.005434,
+ -0.784577,-0.049361,0.618064,0.038849,0.054813,-0.005308,
+ -0.70571,-0.0444,0.707108,0.038951,0.05482,-0.005193,
+ -0.707106,0,0.707108,0.038917,0.055885,-0.005193,
+ -0.784577,-0.049361,0.618064,0.038849,0.054813,-0.005308,
+ -0.707106,0,0.707108,0.038917,0.055885,-0.005193,
+ -0.786128,0,0.618064,0.038816,0.055885,-0.005308,
+ -0.779929,-0.098528,0.618064,0.03895,0.053746,-0.005308,
+ -0.70153,-0.088624,0.707108,0.039051,0.053759,-0.005193,
+ -0.70571,-0.0444,0.707108,0.038951,0.05482,-0.005193,
+ -0.779929,-0.098528,0.618064,0.03895,0.053746,-0.005308,
+ -0.70571,-0.0444,0.707108,0.038951,0.05482,-0.005193,
+ -0.784577,-0.049361,0.618064,0.038849,0.054813,-0.005308,
+ -0.772203,-0.147306,0.618064,0.039118,0.052687,-0.005308,
+ -0.694581,-0.132498,0.707108,0.039218,0.052706,-0.005193,
+ -0.70153,-0.088624,0.707108,0.039051,0.053759,-0.005193,
+ -0.772203,-0.147306,0.618064,0.039118,0.052687,-0.005308,
+ -0.70153,-0.088624,0.707108,0.039051,0.053759,-0.005193,
+ -0.779929,-0.098528,0.618064,0.03895,0.053746,-0.005308,
+ -0.76143,-0.195502,0.618064,0.039352,0.05164,-0.005308,
+ -0.684891,-0.17585,0.707108,0.03945,0.051666,-0.005193,
+ -0.694581,-0.132498,0.707108,0.039218,0.052706,-0.005193,
+ -0.76143,-0.195502,0.618064,0.039352,0.05164,-0.005308,
+ -0.694581,-0.132498,0.707108,0.039218,0.052706,-0.005193,
+ -0.772203,-0.147306,0.618064,0.039118,0.052687,-0.005308,
+ -0.747652,-0.242927,0.618064,0.039651,0.05061,-0.005308,
+ -0.672497,-0.218508,0.707108,0.039748,0.050642,-0.005193,
+ -0.684891,-0.17585,0.707108,0.03945,0.051666,-0.005193,
+ -0.747652,-0.242927,0.618064,0.039651,0.05061,-0.005308,
+ -0.684891,-0.17585,0.707108,0.03945,0.051666,-0.005193,
+ -0.76143,-0.195502,0.618064,0.039352,0.05164,-0.005308,
+ -0.730923,-0.289393,0.618064,0.040014,0.049601,-0.005308,
+ -0.65745,-0.260303,0.707108,0.040109,0.049639,-0.005193,
+ -0.672497,-0.218508,0.707108,0.039748,0.050642,-0.005193,
+ -0.730923,-0.289393,0.618064,0.040014,0.049601,-0.005308,
+ -0.672497,-0.218508,0.707108,0.039748,0.050642,-0.005193,
+ -0.747652,-0.242927,0.618064,0.039651,0.05061,-0.005308,
+ -0.71131,-0.334717,0.618064,0.04044,0.048617,-0.005308,
+ -0.639808,-0.301071,0.707108,0.040532,0.048661,-0.005193,
+ -0.65745,-0.260303,0.707108,0.040109,0.049639,-0.005193,
+ -0.71131,-0.334717,0.618064,0.04044,0.048617,-0.005308,
+ -0.65745,-0.260303,0.707108,0.040109,0.049639,-0.005193,
+ -0.730923,-0.289393,0.618064,0.040014,0.049601,-0.005308,
+ -0.688889,-0.37872,0.618064,0.040927,0.047662,-0.005308,
+ -0.619641,-0.340651,0.707108,0.041016,0.047711,-0.005193,
+ -0.639808,-0.301071,0.707108,0.040532,0.048661,-0.005193,
+ -0.688889,-0.37872,0.618064,0.040927,0.047662,-0.005308,
+ -0.639808,-0.301071,0.707108,0.040532,0.048661,-0.005193,
+ -0.71131,-0.334717,0.618064,0.04044,0.048617,-0.005308,
+ -0.66375,-0.421228,0.618064,0.041473,0.046739,-0.005308,
+ -0.597029,-0.378886,0.707108,0.041559,0.046793,-0.005193,
+ -0.619641,-0.340651,0.707108,0.041016,0.047711,-0.005193,
+ -0.66375,-0.421228,0.618064,0.041473,0.046739,-0.005308,
+ -0.619641,-0.340651,0.707108,0.041016,0.047711,-0.005193,
+ -0.688889,-0.37872,0.618064,0.040927,0.047662,-0.005308,
+ -0.635991,-0.462074,0.618064,0.042076,0.045852,-0.005308,
+ -0.57206,-0.415626,0.707108,0.042158,0.045912,-0.005193,
+ -0.597029,-0.378886,0.707108,0.041559,0.046793,-0.005193,
+ -0.635991,-0.462074,0.618064,0.042076,0.045852,-0.005308,
+ -0.597029,-0.378886,0.707108,0.041559,0.046793,-0.005193,
+ -0.66375,-0.421228,0.618064,0.041473,0.046739,-0.005308,
+ -0.605722,-0.501097,0.618064,0.042733,0.045005,-0.005308,
+ -0.544834,-0.450726,0.707108,0.042811,0.04507,-0.005193,
+ -0.57206,-0.415626,0.707108,0.042158,0.045912,-0.005193,
+ -0.605722,-0.501097,0.618064,0.042733,0.045005,-0.005308,
+ -0.57206,-0.415626,0.707108,0.042158,0.045912,-0.005193,
+ -0.635991,-0.462074,0.618064,0.042076,0.045852,-0.005308,
+ -0.573062,-0.538141,0.618064,0.043442,0.0442,-0.005308,
+ -0.515458,-0.484047,0.707108,0.043516,0.04427,-0.005193,
+ -0.544834,-0.450726,0.707108,0.042811,0.04507,-0.005193,
+ -0.573062,-0.538141,0.618064,0.043442,0.0442,-0.005308,
+ -0.544834,-0.450726,0.707108,0.042811,0.04507,-0.005193,
+ -0.605722,-0.501097,0.618064,0.042733,0.045005,-0.005308,
+ -0.538141,-0.573062,0.618064,0.0442,0.043442,-0.005308,
+ -0.484047,-0.515458,0.707108,0.04427,0.043516,-0.005193,
+ -0.515458,-0.484047,0.707108,0.043516,0.04427,-0.005193,
+ -0.538141,-0.573062,0.618064,0.0442,0.043442,-0.005308,
+ -0.515458,-0.484047,0.707108,0.043516,0.04427,-0.005193,
+ -0.573062,-0.538141,0.618064,0.043442,0.0442,-0.005308,
+ -0.501097,-0.605722,0.618064,0.045005,0.042733,-0.005308,
+ -0.450726,-0.544834,0.707108,0.04507,0.042811,-0.005193,
+ -0.484047,-0.515458,0.707108,0.04427,0.043516,-0.005193,
+ -0.501097,-0.605722,0.618064,0.045005,0.042733,-0.005308,
+ -0.484047,-0.515458,0.707108,0.04427,0.043516,-0.005193,
+ -0.538141,-0.573062,0.618064,0.0442,0.043442,-0.005308,
+ -0.462074,-0.635991,0.618064,0.045852,0.042076,-0.005308,
+ -0.415626,-0.57206,0.707108,0.045912,0.042158,-0.005193,
+ -0.450726,-0.544834,0.707108,0.04507,0.042811,-0.005193,
+ -0.462074,-0.635991,0.618064,0.045852,0.042076,-0.005308,
+ -0.450726,-0.544834,0.707108,0.04507,0.042811,-0.005193,
+ -0.501097,-0.605722,0.618064,0.045005,0.042733,-0.005308,
+ -0.421228,-0.66375,0.618064,0.046739,0.041473,-0.005308,
+ -0.378886,-0.597029,0.707108,0.046793,0.041559,-0.005193,
+ -0.415626,-0.57206,0.707108,0.045912,0.042158,-0.005193,
+ -0.421228,-0.66375,0.618064,0.046739,0.041473,-0.005308,
+ -0.415626,-0.57206,0.707108,0.045912,0.042158,-0.005193,
+ -0.462074,-0.635991,0.618064,0.045852,0.042076,-0.005308,
+ -0.37872,-0.688889,0.618064,0.047662,0.040927,-0.005308,
+ -0.340651,-0.619641,0.707108,0.047711,0.041016,-0.005193,
+ -0.378886,-0.597029,0.707108,0.046793,0.041559,-0.005193,
+ -0.37872,-0.688889,0.618064,0.047662,0.040927,-0.005308,
+ -0.378886,-0.597029,0.707108,0.046793,0.041559,-0.005193,
+ -0.421228,-0.66375,0.618064,0.046739,0.041473,-0.005308,
+ -0.334717,-0.71131,0.618064,0.048617,0.04044,-0.005308,
+ -0.301071,-0.639808,0.707108,0.048661,0.040532,-0.005193,
+ -0.340651,-0.619641,0.707108,0.047711,0.041016,-0.005193,
+ -0.334717,-0.71131,0.618064,0.048617,0.04044,-0.005308,
+ -0.340651,-0.619641,0.707108,0.047711,0.041016,-0.005193,
+ -0.37872,-0.688889,0.618064,0.047662,0.040927,-0.005308,
+ -0.289393,-0.730923,0.618064,0.049601,0.040014,-0.005308,
+ -0.260303,-0.65745,0.707108,0.049639,0.040109,-0.005193,
+ -0.301071,-0.639808,0.707108,0.048661,0.040532,-0.005193,
+ -0.289393,-0.730923,0.618064,0.049601,0.040014,-0.005308,
+ -0.301071,-0.639808,0.707108,0.048661,0.040532,-0.005193,
+ -0.334717,-0.71131,0.618064,0.048617,0.04044,-0.005308,
+ -0.242927,-0.747652,0.618064,0.05061,0.039651,-0.005308,
+ -0.218508,-0.672497,0.707108,0.050642,0.039748,-0.005193,
+ -0.260303,-0.65745,0.707108,0.049639,0.040109,-0.005193,
+ -0.242927,-0.747652,0.618064,0.05061,0.039651,-0.005308,
+ -0.260303,-0.65745,0.707108,0.049639,0.040109,-0.005193,
+ -0.289393,-0.730923,0.618064,0.049601,0.040014,-0.005308,
+ -0.195502,-0.76143,0.618064,0.05164,0.039352,-0.005308,
+ -0.17585,-0.684891,0.707108,0.051666,0.03945,-0.005193,
+ -0.218508,-0.672497,0.707108,0.050642,0.039748,-0.005193,
+ -0.195502,-0.76143,0.618064,0.05164,0.039352,-0.005308,
+ -0.218508,-0.672497,0.707108,0.050642,0.039748,-0.005193,
+ -0.242927,-0.747652,0.618064,0.05061,0.039651,-0.005308,
+ -0.147306,-0.772203,0.618064,0.052687,0.039118,-0.005308,
+ -0.132498,-0.694581,0.707108,0.052706,0.039218,-0.005193,
+ -0.17585,-0.684891,0.707108,0.051666,0.03945,-0.005193,
+ -0.147306,-0.772203,0.618064,0.052687,0.039118,-0.005308,
+ -0.17585,-0.684891,0.707108,0.051666,0.03945,-0.005193,
+ -0.195502,-0.76143,0.618064,0.05164,0.039352,-0.005308,
+ -0.098528,-0.779929,0.618064,0.053746,0.03895,-0.005308,
+ -0.088624,-0.70153,0.707108,0.053759,0.039051,-0.005193,
+ -0.132498,-0.694581,0.707108,0.052706,0.039218,-0.005193,
+ -0.098528,-0.779929,0.618064,0.053746,0.03895,-0.005308,
+ -0.132498,-0.694581,0.707108,0.052706,0.039218,-0.005193,
+ -0.147306,-0.772203,0.618064,0.052687,0.039118,-0.005308,
+ -0.049361,-0.784577,0.618064,0.054813,0.038849,-0.005308,
+ -0.0444,-0.70571,0.707108,0.05482,0.038951,-0.005193,
+ -0.088624,-0.70153,0.707108,0.053759,0.039051,-0.005193,
+ -0.049361,-0.784577,0.618064,0.054813,0.038849,-0.005308,
+ -0.088624,-0.70153,0.707108,0.053759,0.039051,-0.005193,
+ -0.098528,-0.779929,0.618064,0.053746,0.03895,-0.005308,
+ 0,-0.786128,0.618064,0.055885,0.038816,-0.005308,
+ 0,-0.707106,0.707108,0.055885,0.038917,-0.005193,
+ -0.0444,-0.70571,0.707108,0.05482,0.038951,-0.005193,
+ 0,-0.786128,0.618064,0.055885,0.038816,-0.005308,
+ -0.0444,-0.70571,0.707108,0.05482,0.038951,-0.005193,
+ -0.049361,-0.784577,0.618064,0.054813,0.038849,-0.005308,
+ 0.049361,-0.784577,0.618064,0.056957,0.038849,-0.005308,
+ 0.0444,-0.70571,0.707108,0.056951,0.038951,-0.005193,
+ 0,-0.707106,0.707108,0.055885,0.038917,-0.005193,
+ 0.049361,-0.784577,0.618064,0.056957,0.038849,-0.005308,
+ 0,-0.707106,0.707108,0.055885,0.038917,-0.005193,
+ 0,-0.786128,0.618064,0.055885,0.038816,-0.005308,
+ 0.098528,-0.779929,0.618064,0.058025,0.03895,-0.005308,
+ 0.088624,-0.70153,0.707108,0.058012,0.039051,-0.005193,
+ 0.0444,-0.70571,0.707108,0.056951,0.038951,-0.005193,
+ 0.098528,-0.779929,0.618064,0.058025,0.03895,-0.005308,
+ 0.0444,-0.70571,0.707108,0.056951,0.038951,-0.005193,
+ 0.049361,-0.784577,0.618064,0.056957,0.038849,-0.005308,
+ 0.147306,-0.772203,0.618064,0.059084,0.039118,-0.005308,
+ 0.132498,-0.694581,0.707108,0.059065,0.039218,-0.005193,
+ 0.088624,-0.70153,0.707108,0.058012,0.039051,-0.005193,
+ 0.147306,-0.772203,0.618064,0.059084,0.039118,-0.005308,
+ 0.088624,-0.70153,0.707108,0.058012,0.039051,-0.005193,
+ 0.098528,-0.779929,0.618064,0.058025,0.03895,-0.005308,
+ 0.195502,-0.76143,0.618064,0.06013,0.039352,-0.005308,
+ 0.17585,-0.684891,0.707108,0.060105,0.03945,-0.005193,
+ 0.132498,-0.694581,0.707108,0.059065,0.039218,-0.005193,
+ 0.195502,-0.76143,0.618064,0.06013,0.039352,-0.005308,
+ 0.132498,-0.694581,0.707108,0.059065,0.039218,-0.005193,
+ 0.147306,-0.772203,0.618064,0.059084,0.039118,-0.005308,
+ 0.242927,-0.747652,0.618064,0.06116,0.039651,-0.005308,
+ 0.218508,-0.672497,0.707108,0.061129,0.039748,-0.005193,
+ 0.17585,-0.684891,0.707108,0.060105,0.03945,-0.005193,
+ 0.242927,-0.747652,0.618064,0.06116,0.039651,-0.005308,
+ 0.17585,-0.684891,0.707108,0.060105,0.03945,-0.005193,
+ 0.195502,-0.76143,0.618064,0.06013,0.039352,-0.005308,
+ 0.289393,-0.730923,0.618064,0.062169,0.040014,-0.005308,
+ 0.260303,-0.65745,0.707108,0.062132,0.040109,-0.005193,
+ 0.218508,-0.672497,0.707108,0.061129,0.039748,-0.005193,
+ 0.289393,-0.730923,0.618064,0.062169,0.040014,-0.005308,
+ 0.218508,-0.672497,0.707108,0.061129,0.039748,-0.005193,
+ 0.242927,-0.747652,0.618064,0.06116,0.039651,-0.005308,
+ 0.334717,-0.71131,0.618064,0.063153,0.04044,-0.005308,
+ 0.301071,-0.639808,0.707108,0.06311,0.040532,-0.005193,
+ 0.260303,-0.65745,0.707108,0.062132,0.040109,-0.005193,
+ 0.334717,-0.71131,0.618064,0.063153,0.04044,-0.005308,
+ 0.260303,-0.65745,0.707108,0.062132,0.040109,-0.005193,
+ 0.289393,-0.730923,0.618064,0.062169,0.040014,-0.005308,
+ 0.37872,-0.688889,0.618064,0.064109,0.040927,-0.005308,
+ 0.340651,-0.619641,0.707108,0.06406,0.041016,-0.005193,
+ 0.301071,-0.639808,0.707108,0.06311,0.040532,-0.005193,
+ 0.37872,-0.688889,0.618064,0.064109,0.040927,-0.005308,
+ 0.301071,-0.639808,0.707108,0.06311,0.040532,-0.005193,
+ 0.334717,-0.71131,0.618064,0.063153,0.04044,-0.005308,
+ 0.421228,-0.66375,0.618064,0.065032,0.041473,-0.005308,
+ 0.378886,-0.597029,0.707108,0.064977,0.041559,-0.005193,
+ 0.340651,-0.619641,0.707108,0.06406,0.041016,-0.005193,
+ 0.421228,-0.66375,0.618064,0.065032,0.041473,-0.005308,
+ 0.340651,-0.619641,0.707108,0.06406,0.041016,-0.005193,
+ 0.37872,-0.688889,0.618064,0.064109,0.040927,-0.005308,
+ 0.462074,-0.635991,0.618064,0.065919,0.042076,-0.005308,
+ 0.415626,-0.57206,0.707108,0.065859,0.042158,-0.005193,
+ 0.378886,-0.597029,0.707108,0.064977,0.041559,-0.005193,
+ 0.462074,-0.635991,0.618064,0.065919,0.042076,-0.005308,
+ 0.378886,-0.597029,0.707108,0.064977,0.041559,-0.005193,
+ 0.421228,-0.66375,0.618064,0.065032,0.041473,-0.005308,
+ 0.501097,-0.605722,0.618064,0.066766,0.042733,-0.005308,
+ 0.450726,-0.544834,0.707108,0.066701,0.042811,-0.005193,
+ 0.415626,-0.57206,0.707108,0.065859,0.042158,-0.005193,
+ 0.501097,-0.605722,0.618064,0.066766,0.042733,-0.005308,
+ 0.415626,-0.57206,0.707108,0.065859,0.042158,-0.005193,
+ 0.462074,-0.635991,0.618064,0.065919,0.042076,-0.005308,
+ 0.538141,-0.573062,0.618064,0.06757,0.043442,-0.005308,
+ 0.484047,-0.515458,0.707108,0.067501,0.043516,-0.005193,
+ 0.450726,-0.544834,0.707108,0.066701,0.042811,-0.005193,
+ 0.538141,-0.573062,0.618064,0.06757,0.043442,-0.005308,
+ 0.450726,-0.544834,0.707108,0.066701,0.042811,-0.005193,
+ 0.501097,-0.605722,0.618064,0.066766,0.042733,-0.005308,
+ 0.573062,-0.538141,0.618064,0.068329,0.0442,-0.005308,
+ 0.515458,-0.484047,0.707108,0.068254,0.04427,-0.005193,
+ 0.484047,-0.515458,0.707108,0.067501,0.043516,-0.005193,
+ 0.573062,-0.538141,0.618064,0.068329,0.0442,-0.005308,
+ 0.484047,-0.515458,0.707108,0.067501,0.043516,-0.005193,
+ 0.538141,-0.573062,0.618064,0.06757,0.043442,-0.005308,
+ 0.605722,-0.501097,0.618064,0.069038,0.045005,-0.005308,
+ 0.544834,-0.450726,0.707108,0.068959,0.04507,-0.005193,
+ 0.515458,-0.484047,0.707108,0.068254,0.04427,-0.005193,
+ 0.605722,-0.501097,0.618064,0.069038,0.045005,-0.005308,
+ 0.515458,-0.484047,0.707108,0.068254,0.04427,-0.005193,
+ 0.573062,-0.538141,0.618064,0.068329,0.0442,-0.005308,
+ 0.635991,-0.462074,0.618064,0.069695,0.045852,-0.005308,
+ 0.57206,-0.415626,0.707108,0.069613,0.045912,-0.005193,
+ 0.544834,-0.450726,0.707108,0.068959,0.04507,-0.005193,
+ 0.635991,-0.462074,0.618064,0.069695,0.045852,-0.005308,
+ 0.544834,-0.450726,0.707108,0.068959,0.04507,-0.005193,
+ 0.605722,-0.501097,0.618064,0.069038,0.045005,-0.005308,
+ 0.66375,-0.421228,0.618064,0.070298,0.046739,-0.005308,
+ 0.597029,-0.378886,0.707108,0.070212,0.046793,-0.005193,
+ 0.57206,-0.415626,0.707108,0.069613,0.045912,-0.005193,
+ 0.66375,-0.421228,0.618064,0.070298,0.046739,-0.005308,
+ 0.57206,-0.415626,0.707108,0.069613,0.045912,-0.005193,
+ 0.635991,-0.462074,0.618064,0.069695,0.045852,-0.005308,
+ 0.688889,-0.37872,0.618064,0.070844,0.047662,-0.005308,
+ 0.619641,-0.340651,0.707108,0.070754,0.047711,-0.005193,
+ 0.597029,-0.378886,0.707108,0.070212,0.046793,-0.005193,
+ 0.688889,-0.37872,0.618064,0.070844,0.047662,-0.005308,
+ 0.597029,-0.378886,0.707108,0.070212,0.046793,-0.005193,
+ 0.66375,-0.421228,0.618064,0.070298,0.046739,-0.005308,
+ 0.71131,-0.334717,0.618064,0.07133,0.048617,-0.005308,
+ 0.639808,-0.301071,0.707108,0.071238,0.048661,-0.005193,
+ 0.619641,-0.340651,0.707108,0.070754,0.047711,-0.005193,
+ 0.71131,-0.334717,0.618064,0.07133,0.048617,-0.005308,
+ 0.619641,-0.340651,0.707108,0.070754,0.047711,-0.005193,
+ 0.688889,-0.37872,0.618064,0.070844,0.047662,-0.005308,
+ 0.730923,-0.289393,0.618064,0.071756,0.049601,-0.005308,
+ 0.65745,-0.260303,0.707108,0.071662,0.049639,-0.005193,
+ 0.639808,-0.301071,0.707108,0.071238,0.048661,-0.005193,
+ 0.730923,-0.289393,0.618064,0.071756,0.049601,-0.005308,
+ 0.639808,-0.301071,0.707108,0.071238,0.048661,-0.005193,
+ 0.71131,-0.334717,0.618064,0.07133,0.048617,-0.005308,
+ 0.747652,-0.242927,0.618064,0.07212,0.05061,-0.005308,
+ 0.672497,-0.218508,0.707108,0.072023,0.050642,-0.005193,
+ 0.65745,-0.260303,0.707108,0.071662,0.049639,-0.005193,
+ 0.747652,-0.242927,0.618064,0.07212,0.05061,-0.005308,
+ 0.65745,-0.260303,0.707108,0.071662,0.049639,-0.005193,
+ 0.730923,-0.289393,0.618064,0.071756,0.049601,-0.005308,
+ 0.76143,-0.195502,0.618064,0.072419,0.05164,-0.005308,
+ 0.684891,-0.17585,0.707108,0.07232,0.051666,-0.005193,
+ 0.672497,-0.218508,0.707108,0.072023,0.050642,-0.005193,
+ 0.76143,-0.195502,0.618064,0.072419,0.05164,-0.005308,
+ 0.672497,-0.218508,0.707108,0.072023,0.050642,-0.005193,
+ 0.747652,-0.242927,0.618064,0.07212,0.05061,-0.005308,
+ 0.772203,-0.147306,0.618064,0.072653,0.052687,-0.005308,
+ 0.694581,-0.132498,0.707108,0.072553,0.052706,-0.005193,
+ 0.684891,-0.17585,0.707108,0.07232,0.051666,-0.005193,
+ 0.772203,-0.147306,0.618064,0.072653,0.052687,-0.005308,
+ 0.684891,-0.17585,0.707108,0.07232,0.051666,-0.005193,
+ 0.76143,-0.195502,0.618064,0.072419,0.05164,-0.005308,
+ 0.779929,-0.098528,0.618064,0.07282,0.053746,-0.005308,
+ 0.70153,-0.088624,0.707108,0.072719,0.053759,-0.005193,
+ 0.694581,-0.132498,0.707108,0.072553,0.052706,-0.005193,
+ 0.779929,-0.098528,0.618064,0.07282,0.053746,-0.005308,
+ 0.694581,-0.132498,0.707108,0.072553,0.052706,-0.005193,
+ 0.772203,-0.147306,0.618064,0.072653,0.052687,-0.005308,
+ 0.784577,-0.049361,0.618064,0.072921,0.054813,-0.005308,
+ 0.70571,-0.0444,0.707108,0.07282,0.05482,-0.005193,
+ 0.70153,-0.088624,0.707108,0.072719,0.053759,-0.005193,
+ 0.784577,-0.049361,0.618064,0.072921,0.054813,-0.005308,
+ 0.70153,-0.088624,0.707108,0.072719,0.053759,-0.005193,
+ 0.779929,-0.098528,0.618064,0.07282,0.053746,-0.005308,
+ 0.786128,0,0.618064,0.072955,0.055885,-0.005308,
+ 0.707106,0,0.707108,0.072853,0.055885,-0.005193,
+ 0.70571,-0.0444,0.707108,0.07282,0.05482,-0.005193,
+ 0.786128,0,0.618064,0.072955,0.055885,-0.005308,
+ 0.70571,-0.0444,0.707108,0.07282,0.05482,-0.005193,
+ 0.784577,-0.049361,0.618064,0.072921,0.054813,-0.005308,
+ 0.784577,0.049361,0.618064,0.072921,0.056957,-0.005308,
+ 0.70571,0.0444,0.707108,0.07282,0.056951,-0.005193,
+ 0.707106,0,0.707108,0.072853,0.055885,-0.005193,
+ 0.784577,0.049361,0.618064,0.072921,0.056957,-0.005308,
+ 0.707106,0,0.707108,0.072853,0.055885,-0.005193,
+ 0.786128,0,0.618064,0.072955,0.055885,-0.005308,
+ 0.779929,0.098528,0.618064,0.07282,0.058025,-0.005308,
+ 0.70153,0.088624,0.707108,0.072719,0.058012,-0.005193,
+ 0.70571,0.0444,0.707108,0.07282,0.056951,-0.005193,
+ 0.779929,0.098528,0.618064,0.07282,0.058025,-0.005308,
+ 0.70571,0.0444,0.707108,0.07282,0.056951,-0.005193,
+ 0.784577,0.049361,0.618064,0.072921,0.056957,-0.005308,
+ 0.772203,0.147306,0.618064,0.072653,0.059084,-0.005308,
+ 0.694581,0.132498,0.707108,0.072553,0.059065,-0.005193,
+ 0.70153,0.088624,0.707108,0.072719,0.058012,-0.005193,
+ 0.772203,0.147306,0.618064,0.072653,0.059084,-0.005308,
+ 0.70153,0.088624,0.707108,0.072719,0.058012,-0.005193,
+ 0.779929,0.098528,0.618064,0.07282,0.058025,-0.005308,
+ 0.76143,0.195502,0.618064,0.072419,0.06013,-0.005308,
+ 0.684891,0.17585,0.707108,0.07232,0.060105,-0.005193,
+ 0.694581,0.132498,0.707108,0.072553,0.059065,-0.005193,
+ 0.76143,0.195502,0.618064,0.072419,0.06013,-0.005308,
+ 0.694581,0.132498,0.707108,0.072553,0.059065,-0.005193,
+ 0.772203,0.147306,0.618064,0.072653,0.059084,-0.005308,
+ 0.747652,0.242927,0.618064,0.07212,0.06116,-0.005308,
+ 0.672497,0.218508,0.707108,0.072023,0.061129,-0.005193,
+ 0.684891,0.17585,0.707108,0.07232,0.060105,-0.005193,
+ 0.747652,0.242927,0.618064,0.07212,0.06116,-0.005308,
+ 0.684891,0.17585,0.707108,0.07232,0.060105,-0.005193,
+ 0.76143,0.195502,0.618064,0.072419,0.06013,-0.005308,
+ 0.730923,0.289393,0.618064,0.071756,0.062169,-0.005308,
+ 0.65745,0.260303,0.707108,0.071662,0.062132,-0.005193,
+ 0.672497,0.218508,0.707108,0.072023,0.061129,-0.005193,
+ 0.730923,0.289393,0.618064,0.071756,0.062169,-0.005308,
+ 0.672497,0.218508,0.707108,0.072023,0.061129,-0.005193,
+ 0.747652,0.242927,0.618064,0.07212,0.06116,-0.005308,
+ 0.71131,0.334717,0.618064,0.07133,0.063153,-0.005308,
+ 0.639808,0.301071,0.707108,0.071238,0.06311,-0.005193,
+ 0.65745,0.260303,0.707108,0.071662,0.062132,-0.005193,
+ 0.71131,0.334717,0.618064,0.07133,0.063153,-0.005308,
+ 0.65745,0.260303,0.707108,0.071662,0.062132,-0.005193,
+ 0.730923,0.289393,0.618064,0.071756,0.062169,-0.005308,
+ 0.688889,0.37872,0.618064,0.070844,0.064109,-0.005308,
+ 0.619641,0.340651,0.707108,0.070754,0.06406,-0.005193,
+ 0.639808,0.301071,0.707108,0.071238,0.06311,-0.005193,
+ 0.688889,0.37872,0.618064,0.070844,0.064109,-0.005308,
+ 0.639808,0.301071,0.707108,0.071238,0.06311,-0.005193,
+ 0.71131,0.334717,0.618064,0.07133,0.063153,-0.005308,
+ 0.66375,0.421228,0.618064,0.070298,0.065032,-0.005308,
+ 0.597029,0.378886,0.707108,0.070212,0.064977,-0.005193,
+ 0.619641,0.340651,0.707108,0.070754,0.06406,-0.005193,
+ 0.66375,0.421228,0.618064,0.070298,0.065032,-0.005308,
+ 0.619641,0.340651,0.707108,0.070754,0.06406,-0.005193,
+ 0.688889,0.37872,0.618064,0.070844,0.064109,-0.005308,
+ 0.635991,0.462074,0.618064,0.069695,0.065919,-0.005308,
+ 0.57206,0.415626,0.707108,0.069613,0.065859,-0.005193,
+ 0.597029,0.378886,0.707108,0.070212,0.064977,-0.005193,
+ 0.635991,0.462074,0.618064,0.069695,0.065919,-0.005308,
+ 0.597029,0.378886,0.707108,0.070212,0.064977,-0.005193,
+ 0.66375,0.421228,0.618064,0.070298,0.065032,-0.005308,
+ 0.605722,0.501097,0.618064,0.069038,0.066766,-0.005308,
+ 0.544834,0.450726,0.707108,0.068959,0.066701,-0.005193,
+ 0.57206,0.415626,0.707108,0.069613,0.065859,-0.005193,
+ 0.605722,0.501097,0.618064,0.069038,0.066766,-0.005308,
+ 0.57206,0.415626,0.707108,0.069613,0.065859,-0.005193,
+ 0.635991,0.462074,0.618064,0.069695,0.065919,-0.005308,
+ 0.573062,0.538141,0.618064,0.068329,0.06757,-0.005308,
+ 0.515458,0.484047,0.707108,0.068254,0.067501,-0.005193,
+ 0.544834,0.450726,0.707108,0.068959,0.066701,-0.005193,
+ 0.573062,0.538141,0.618064,0.068329,0.06757,-0.005308,
+ 0.544834,0.450726,0.707108,0.068959,0.066701,-0.005193,
+ 0.605722,0.501097,0.618064,0.069038,0.066766,-0.005308,
+ 0.538141,0.573062,0.618064,0.06757,0.068329,-0.005308,
+ 0.484047,0.515458,0.707108,0.067501,0.068254,-0.005193,
+ 0.515458,0.484047,0.707108,0.068254,0.067501,-0.005193,
+ 0.538141,0.573062,0.618064,0.06757,0.068329,-0.005308,
+ 0.515458,0.484047,0.707108,0.068254,0.067501,-0.005193,
+ 0.573062,0.538141,0.618064,0.068329,0.06757,-0.005308,
+ 0.501097,0.605722,0.618064,0.066766,0.069038,-0.005308,
+ 0.450726,0.544834,0.707108,0.066701,0.068959,-0.005193,
+ 0.484047,0.515458,0.707108,0.067501,0.068254,-0.005193,
+ 0.501097,0.605722,0.618064,0.066766,0.069038,-0.005308,
+ 0.484047,0.515458,0.707108,0.067501,0.068254,-0.005193,
+ 0.538141,0.573062,0.618064,0.06757,0.068329,-0.005308,
+ 0.462074,0.635991,0.618064,0.065919,0.069695,-0.005308,
+ 0.415626,0.57206,0.707108,0.065859,0.069613,-0.005193,
+ 0.450726,0.544834,0.707108,0.066701,0.068959,-0.005193,
+ 0.462074,0.635991,0.618064,0.065919,0.069695,-0.005308,
+ 0.450726,0.544834,0.707108,0.066701,0.068959,-0.005193,
+ 0.501097,0.605722,0.618064,0.066766,0.069038,-0.005308,
+ 0.421228,0.66375,0.618064,0.065032,0.070298,-0.005308,
+ 0.378886,0.597029,0.707108,0.064977,0.070212,-0.005193,
+ 0.415626,0.57206,0.707108,0.065859,0.069613,-0.005193,
+ 0.421228,0.66375,0.618064,0.065032,0.070298,-0.005308,
+ 0.415626,0.57206,0.707108,0.065859,0.069613,-0.005193,
+ 0.462074,0.635991,0.618064,0.065919,0.069695,-0.005308,
+ 0.37872,0.688889,0.618064,0.064109,0.070844,-0.005308,
+ 0.340651,0.619641,0.707108,0.06406,0.070754,-0.005193,
+ 0.378886,0.597029,0.707108,0.064977,0.070212,-0.005193,
+ 0.37872,0.688889,0.618064,0.064109,0.070844,-0.005308,
+ 0.378886,0.597029,0.707108,0.064977,0.070212,-0.005193,
+ 0.421228,0.66375,0.618064,0.065032,0.070298,-0.005308,
+ 0.334717,0.71131,0.618064,0.063153,0.07133,-0.005308,
+ 0.301071,0.639808,0.707108,0.06311,0.071238,-0.005193,
+ 0.340651,0.619641,0.707108,0.06406,0.070754,-0.005193,
+ 0.334717,0.71131,0.618064,0.063153,0.07133,-0.005308,
+ 0.340651,0.619641,0.707108,0.06406,0.070754,-0.005193,
+ 0.37872,0.688889,0.618064,0.064109,0.070844,-0.005308,
+ 0.289393,0.730923,0.618064,0.062169,0.071756,-0.005308,
+ 0.260303,0.65745,0.707108,0.062132,0.071662,-0.005193,
+ 0.301071,0.639808,0.707108,0.06311,0.071238,-0.005193,
+ 0.289393,0.730923,0.618064,0.062169,0.071756,-0.005308,
+ 0.301071,0.639808,0.707108,0.06311,0.071238,-0.005193,
+ 0.334717,0.71131,0.618064,0.063153,0.07133,-0.005308,
+ 0.242927,0.747652,0.618064,0.06116,0.07212,-0.005308,
+ 0.218508,0.672497,0.707108,0.061129,0.072023,-0.005193,
+ 0.260303,0.65745,0.707108,0.062132,0.071662,-0.005193,
+ 0.242927,0.747652,0.618064,0.06116,0.07212,-0.005308,
+ 0.260303,0.65745,0.707108,0.062132,0.071662,-0.005193,
+ 0.289393,0.730923,0.618064,0.062169,0.071756,-0.005308,
+ 0.195502,0.76143,0.618064,0.06013,0.072419,-0.005308,
+ 0.17585,0.684891,0.707108,0.060105,0.07232,-0.005193,
+ 0.218508,0.672497,0.707108,0.061129,0.072023,-0.005193,
+ 0.195502,0.76143,0.618064,0.06013,0.072419,-0.005308,
+ 0.218508,0.672497,0.707108,0.061129,0.072023,-0.005193,
+ 0.242927,0.747652,0.618064,0.06116,0.07212,-0.005308,
+ 0.147306,0.772203,0.618064,0.059084,0.072653,-0.005308,
+ 0.132498,0.694581,0.707108,0.059065,0.072553,-0.005193,
+ 0.17585,0.684891,0.707108,0.060105,0.07232,-0.005193,
+ 0.147306,0.772203,0.618064,0.059084,0.072653,-0.005308,
+ 0.17585,0.684891,0.707108,0.060105,0.07232,-0.005193,
+ 0.195502,0.76143,0.618064,0.06013,0.072419,-0.005308,
+ 0.098528,0.779929,0.618064,0.058025,0.07282,-0.005308,
+ 0.088624,0.70153,0.707108,0.058012,0.072719,-0.005193,
+ 0.132498,0.694581,0.707108,0.059065,0.072553,-0.005193,
+ 0.098528,0.779929,0.618064,0.058025,0.07282,-0.005308,
+ 0.132498,0.694581,0.707108,0.059065,0.072553,-0.005193,
+ 0.147306,0.772203,0.618064,0.059084,0.072653,-0.005308,
+ 0.049361,0.784577,0.618064,0.056957,0.072921,-0.005308,
+ 0.0444,0.70571,0.707108,0.056951,0.07282,-0.005193,
+ 0.088624,0.70153,0.707108,0.058012,0.072719,-0.005193,
+ 0.049361,0.784577,0.618064,0.056957,0.072921,-0.005308,
+ 0.088624,0.70153,0.707108,0.058012,0.072719,-0.005193,
+ 0.098528,0.779929,0.618064,0.058025,0.07282,-0.005308,
+ 0,0.786128,0.618064,0.055885,0.072955,-0.005308,
+ 0,0.707106,0.707108,0.055885,0.072853,-0.005193,
+ 0.0444,0.70571,0.707108,0.056951,0.07282,-0.005193,
+ 0,0.786128,0.618064,0.055885,0.072955,-0.005308,
+ 0.0444,0.70571,0.707108,0.056951,0.07282,-0.005193,
+ 0.049361,0.784577,0.618064,0.056957,0.072921,-0.005308,
+ -0.049361,0.784577,0.618064,0.054813,0.072921,-0.005308,
+ -0.0444,0.70571,0.707108,0.05482,0.07282,-0.005193,
+ 0,0.707106,0.707108,0.055885,0.072853,-0.005193,
+ -0.049361,0.784577,0.618064,0.054813,0.072921,-0.005308,
+ 0,0.707106,0.707108,0.055885,0.072853,-0.005193,
+ 0,0.786128,0.618064,0.055885,0.072955,-0.005308,
+ -0.098528,0.779929,0.618064,0.053746,0.07282,-0.005308,
+ -0.088624,0.70153,0.707108,0.053759,0.072719,-0.005193,
+ -0.0444,0.70571,0.707108,0.05482,0.07282,-0.005193,
+ -0.098528,0.779929,0.618064,0.053746,0.07282,-0.005308,
+ -0.0444,0.70571,0.707108,0.05482,0.07282,-0.005193,
+ -0.049361,0.784577,0.618064,0.054813,0.072921,-0.005308,
+ -0.147306,0.772203,0.618064,0.052687,0.072653,-0.005308,
+ -0.132498,0.694581,0.707108,0.052706,0.072553,-0.005193,
+ -0.088624,0.70153,0.707108,0.053759,0.072719,-0.005193,
+ -0.147306,0.772203,0.618064,0.052687,0.072653,-0.005308,
+ -0.088624,0.70153,0.707108,0.053759,0.072719,-0.005193,
+ -0.098528,0.779929,0.618064,0.053746,0.07282,-0.005308,
+ -0.195502,0.76143,0.618064,0.05164,0.072419,-0.005308,
+ -0.17585,0.684891,0.707108,0.051666,0.07232,-0.005193,
+ -0.132498,0.694581,0.707108,0.052706,0.072553,-0.005193,
+ -0.195502,0.76143,0.618064,0.05164,0.072419,-0.005308,
+ -0.132498,0.694581,0.707108,0.052706,0.072553,-0.005193,
+ -0.147306,0.772203,0.618064,0.052687,0.072653,-0.005308,
+ -0.242927,0.747652,0.618064,0.05061,0.07212,-0.005308,
+ -0.218508,0.672497,0.707108,0.050642,0.072023,-0.005193,
+ -0.17585,0.684891,0.707108,0.051666,0.07232,-0.005193,
+ -0.242927,0.747652,0.618064,0.05061,0.07212,-0.005308,
+ -0.17585,0.684891,0.707108,0.051666,0.07232,-0.005193,
+ -0.195502,0.76143,0.618064,0.05164,0.072419,-0.005308,
+ -0.289393,0.730923,0.618064,0.049601,0.071756,-0.005308,
+ -0.260303,0.65745,0.707108,0.049639,0.071662,-0.005193,
+ -0.218508,0.672497,0.707108,0.050642,0.072023,-0.005193,
+ -0.289393,0.730923,0.618064,0.049601,0.071756,-0.005308,
+ -0.218508,0.672497,0.707108,0.050642,0.072023,-0.005193,
+ -0.242927,0.747652,0.618064,0.05061,0.07212,-0.005308,
+ -0.334717,0.71131,0.618064,0.048617,0.07133,-0.005308,
+ -0.301071,0.639808,0.707108,0.048661,0.071238,-0.005193,
+ -0.260303,0.65745,0.707108,0.049639,0.071662,-0.005193,
+ -0.334717,0.71131,0.618064,0.048617,0.07133,-0.005308,
+ -0.260303,0.65745,0.707108,0.049639,0.071662,-0.005193,
+ -0.289393,0.730923,0.618064,0.049601,0.071756,-0.005308,
+ -0.37872,0.688889,0.618064,0.047662,0.070844,-0.005308,
+ -0.340651,0.619641,0.707108,0.047711,0.070754,-0.005193,
+ -0.301071,0.639808,0.707108,0.048661,0.071238,-0.005193,
+ -0.37872,0.688889,0.618064,0.047662,0.070844,-0.005308,
+ -0.301071,0.639808,0.707108,0.048661,0.071238,-0.005193,
+ -0.334717,0.71131,0.618064,0.048617,0.07133,-0.005308,
+ -0.421228,0.66375,0.618064,0.046739,0.070298,-0.005308,
+ -0.378886,0.597029,0.707108,0.046793,0.070212,-0.005193,
+ -0.340651,0.619641,0.707108,0.047711,0.070754,-0.005193,
+ -0.421228,0.66375,0.618064,0.046739,0.070298,-0.005308,
+ -0.340651,0.619641,0.707108,0.047711,0.070754,-0.005193,
+ -0.37872,0.688889,0.618064,0.047662,0.070844,-0.005308,
+ -0.462074,0.635991,0.618064,0.045852,0.069695,-0.005308,
+ -0.415626,0.57206,0.707108,0.045912,0.069613,-0.005193,
+ -0.378886,0.597029,0.707108,0.046793,0.070212,-0.005193,
+ -0.462074,0.635991,0.618064,0.045852,0.069695,-0.005308,
+ -0.378886,0.597029,0.707108,0.046793,0.070212,-0.005193,
+ -0.421228,0.66375,0.618064,0.046739,0.070298,-0.005308,
+ -0.501097,0.605722,0.618064,0.045005,0.069038,-0.005308,
+ -0.450726,0.544834,0.707108,0.04507,0.068959,-0.005193,
+ -0.415626,0.57206,0.707108,0.045912,0.069613,-0.005193,
+ -0.501097,0.605722,0.618064,0.045005,0.069038,-0.005308,
+ -0.415626,0.57206,0.707108,0.045912,0.069613,-0.005193,
+ -0.462074,0.635991,0.618064,0.045852,0.069695,-0.005308,
+ -0.538141,0.573062,0.618064,0.0442,0.068329,-0.005308,
+ -0.484047,0.515458,0.707108,0.04427,0.068254,-0.005193,
+ -0.450726,0.544834,0.707108,0.04507,0.068959,-0.005193,
+ -0.538141,0.573062,0.618064,0.0442,0.068329,-0.005308,
+ -0.450726,0.544834,0.707108,0.04507,0.068959,-0.005193,
+ -0.501097,0.605722,0.618064,0.045005,0.069038,-0.005308,
+ -0.573062,0.538141,0.618064,0.043442,0.06757,-0.005308,
+ -0.515458,0.484047,0.707108,0.043516,0.067501,-0.005193,
+ -0.484047,0.515458,0.707108,0.04427,0.068254,-0.005193,
+ -0.573062,0.538141,0.618064,0.043442,0.06757,-0.005308,
+ -0.484047,0.515458,0.707108,0.04427,0.068254,-0.005193,
+ -0.538141,0.573062,0.618064,0.0442,0.068329,-0.005308,
+ -0.605722,0.501097,0.618064,0.042733,0.066766,-0.005308,
+ -0.544834,0.450726,0.707108,0.042811,0.066701,-0.005193,
+ -0.515458,0.484047,0.707108,0.043516,0.067501,-0.005193,
+ -0.605722,0.501097,0.618064,0.042733,0.066766,-0.005308,
+ -0.515458,0.484047,0.707108,0.043516,0.067501,-0.005193,
+ -0.573062,0.538141,0.618064,0.043442,0.06757,-0.005308,
+ -0.635991,0.462074,0.618064,0.042076,0.065919,-0.005308,
+ -0.57206,0.415626,0.707108,0.042158,0.065859,-0.005193,
+ -0.544834,0.450726,0.707108,0.042811,0.066701,-0.005193,
+ -0.635991,0.462074,0.618064,0.042076,0.065919,-0.005308,
+ -0.544834,0.450726,0.707108,0.042811,0.066701,-0.005193,
+ -0.605722,0.501097,0.618064,0.042733,0.066766,-0.005308,
+ -0.66375,0.421228,0.618064,0.041473,0.065032,-0.005308,
+ -0.597029,0.378886,0.707108,0.041559,0.064977,-0.005193,
+ -0.57206,0.415626,0.707108,0.042158,0.065859,-0.005193,
+ -0.66375,0.421228,0.618064,0.041473,0.065032,-0.005308,
+ -0.57206,0.415626,0.707108,0.042158,0.065859,-0.005193,
+ -0.635991,0.462074,0.618064,0.042076,0.065919,-0.005308,
+ -0.688889,0.37872,0.618064,0.040927,0.064109,-0.005308,
+ -0.619641,0.340651,0.707108,0.041016,0.06406,-0.005193,
+ -0.597029,0.378886,0.707108,0.041559,0.064977,-0.005193,
+ -0.688889,0.37872,0.618064,0.040927,0.064109,-0.005308,
+ -0.597029,0.378886,0.707108,0.041559,0.064977,-0.005193,
+ -0.66375,0.421228,0.618064,0.041473,0.065032,-0.005308,
+ -0.71131,0.334717,0.618064,0.04044,0.063153,-0.005308,
+ -0.639808,0.301071,0.707108,0.040532,0.06311,-0.005193,
+ -0.619641,0.340651,0.707108,0.041016,0.06406,-0.005193,
+ -0.71131,0.334717,0.618064,0.04044,0.063153,-0.005308,
+ -0.619641,0.340651,0.707108,0.041016,0.06406,-0.005193,
+ -0.688889,0.37872,0.618064,0.040927,0.064109,-0.005308,
+ -0.730923,0.289393,0.618064,0.040014,0.062169,-0.005308,
+ -0.65745,0.260303,0.707108,0.040109,0.062132,-0.005193,
+ -0.639808,0.301071,0.707108,0.040532,0.06311,-0.005193,
+ -0.730923,0.289393,0.618064,0.040014,0.062169,-0.005308,
+ -0.639808,0.301071,0.707108,0.040532,0.06311,-0.005193,
+ -0.71131,0.334717,0.618064,0.04044,0.063153,-0.005308,
+ -0.747652,0.242927,0.618064,0.039651,0.06116,-0.005308,
+ -0.672497,0.218508,0.707108,0.039748,0.061129,-0.005193,
+ -0.65745,0.260303,0.707108,0.040109,0.062132,-0.005193,
+ -0.747652,0.242927,0.618064,0.039651,0.06116,-0.005308,
+ -0.65745,0.260303,0.707108,0.040109,0.062132,-0.005193,
+ -0.730923,0.289393,0.618064,0.040014,0.062169,-0.005308,
+ -0.76143,0.195502,0.618064,0.039352,0.06013,-0.005308,
+ -0.684891,0.17585,0.707108,0.03945,0.060105,-0.005193,
+ -0.672497,0.218508,0.707108,0.039748,0.061129,-0.005193,
+ -0.76143,0.195502,0.618064,0.039352,0.06013,-0.005308,
+ -0.672497,0.218508,0.707108,0.039748,0.061129,-0.005193,
+ -0.747652,0.242927,0.618064,0.039651,0.06116,-0.005308,
+ -0.772203,0.147306,0.618064,0.039118,0.059084,-0.005308,
+ -0.694581,0.132498,0.707108,0.039218,0.059065,-0.005193,
+ -0.684891,0.17585,0.707108,0.03945,0.060105,-0.005193,
+ -0.772203,0.147306,0.618064,0.039118,0.059084,-0.005308,
+ -0.684891,0.17585,0.707108,0.03945,0.060105,-0.005193,
+ -0.76143,0.195502,0.618064,0.039352,0.06013,-0.005308,
+ -0.779929,0.098528,0.618064,0.03895,0.058025,-0.005308,
+ -0.70153,0.088624,0.707108,0.039051,0.058012,-0.005193,
+ -0.694581,0.132498,0.707108,0.039218,0.059065,-0.005193,
+ -0.779929,0.098528,0.618064,0.03895,0.058025,-0.005308,
+ -0.694581,0.132498,0.707108,0.039218,0.059065,-0.005193,
+ -0.772203,0.147306,0.618064,0.039118,0.059084,-0.005308,
+ -0.784577,0.049361,0.618064,0.038849,0.056957,-0.005308,
+ -0.70571,0.0444,0.707108,0.038951,0.056951,-0.005193,
+ -0.70153,0.088624,0.707108,0.039051,0.058012,-0.005193,
+ -0.784577,0.049361,0.618064,0.038849,0.056957,-0.005308,
+ -0.70153,0.088624,0.707108,0.039051,0.058012,-0.005193,
+ -0.779929,0.098528,0.618064,0.03895,0.058025,-0.005308,
+ -0.786128,0,0.618064,0.038816,0.055885,-0.005308,
+ -0.707106,0,0.707108,0.038917,0.055885,-0.005193,
+ -0.70571,0.0444,0.707108,0.038951,0.056951,-0.005193,
+ -0.786128,0,0.618064,0.038816,0.055885,-0.005308,
+ -0.70571,0.0444,0.707108,0.038951,0.056951,-0.005193,
+ -0.784577,0.049361,0.618064,0.038849,0.056957,-0.005308,
+ -0.707106,0,0.707108,0.038917,0.055885,-0.005193,
+ -0.618061,0,0.78613,0.039032,0.055885,-0.005092,
+ -0.616842,0.038808,0.78613,0.039065,0.056943,-0.005092,
+ -0.707106,0,0.707108,0.038917,0.055885,-0.005193,
+ -0.616842,0.038808,0.78613,0.039065,0.056943,-0.005092,
+ -0.70571,0.0444,0.707108,0.038951,0.056951,-0.005193,
+ -0.70571,-0.0444,0.707108,0.038951,0.05482,-0.005193,
+ -0.616842,-0.038808,0.78613,0.039065,0.054827,-0.005092,
+ -0.618061,0,0.78613,0.039032,0.055885,-0.005092,
+ -0.70571,-0.0444,0.707108,0.038951,0.05482,-0.005193,
+ -0.618061,0,0.78613,0.039032,0.055885,-0.005092,
+ -0.707106,0,0.707108,0.038917,0.055885,-0.005193,
+ -0.70153,-0.088624,0.707108,0.039051,0.053759,-0.005193,
+ -0.613188,-0.077464,0.78613,0.039165,0.053773,-0.005092,
+ -0.616842,-0.038808,0.78613,0.039065,0.054827,-0.005092,
+ -0.70153,-0.088624,0.707108,0.039051,0.053759,-0.005193,
+ -0.616842,-0.038808,0.78613,0.039065,0.054827,-0.005092,
+ -0.70571,-0.0444,0.707108,0.038951,0.05482,-0.005193,
+ -0.694581,-0.132498,0.707108,0.039218,0.052706,-0.005193,
+ -0.607114,-0.115813,0.78613,0.039331,0.052727,-0.005092,
+ -0.613188,-0.077464,0.78613,0.039165,0.053773,-0.005092,
+ -0.694581,-0.132498,0.707108,0.039218,0.052706,-0.005193,
+ -0.613188,-0.077464,0.78613,0.039165,0.053773,-0.005092,
+ -0.70153,-0.088624,0.707108,0.039051,0.053759,-0.005193,
+ -0.684891,-0.17585,0.707108,0.03945,0.051666,-0.005193,
+ -0.598644,-0.153706,0.78613,0.039562,0.051694,-0.005092,
+ -0.607114,-0.115813,0.78613,0.039331,0.052727,-0.005092,
+ -0.684891,-0.17585,0.707108,0.03945,0.051666,-0.005193,
+ -0.607114,-0.115813,0.78613,0.039331,0.052727,-0.005092,
+ -0.694581,-0.132498,0.707108,0.039218,0.052706,-0.005193,
+ -0.672497,-0.218508,0.707108,0.039748,0.050642,-0.005193,
+ -0.587811,-0.190991,0.78613,0.039857,0.050677,-0.005092,
+ -0.598644,-0.153706,0.78613,0.039562,0.051694,-0.005092,
+ -0.672497,-0.218508,0.707108,0.039748,0.050642,-0.005193,
+ -0.598644,-0.153706,0.78613,0.039562,0.051694,-0.005092,
+ -0.684891,-0.17585,0.707108,0.03945,0.051666,-0.005193,
+ -0.65745,-0.260303,0.707108,0.040109,0.049639,-0.005193,
+ -0.574659,-0.227524,0.78613,0.040215,0.049681,-0.005092,
+ -0.587811,-0.190991,0.78613,0.039857,0.050677,-0.005092,
+ -0.65745,-0.260303,0.707108,0.040109,0.049639,-0.005193,
+ -0.587811,-0.190991,0.78613,0.039857,0.050677,-0.005092,
+ -0.672497,-0.218508,0.707108,0.039748,0.050642,-0.005193,
+ -0.639808,-0.301071,0.707108,0.040532,0.048661,-0.005193,
+ -0.559239,-0.263158,0.78613,0.040636,0.048709,-0.005092,
+ -0.574659,-0.227524,0.78613,0.040215,0.049681,-0.005092,
+ -0.639808,-0.301071,0.707108,0.040532,0.048661,-0.005193,
+ -0.574659,-0.227524,0.78613,0.040215,0.049681,-0.005092,
+ -0.65745,-0.260303,0.707108,0.040109,0.049639,-0.005193,
+ -0.619641,-0.340651,0.707108,0.041016,0.047711,-0.005193,
+ -0.541611,-0.297753,0.78613,0.041117,0.047766,-0.005092,
+ -0.559239,-0.263158,0.78613,0.040636,0.048709,-0.005092,
+ -0.619641,-0.340651,0.707108,0.041016,0.047711,-0.005193,
+ -0.559239,-0.263158,0.78613,0.040636,0.048709,-0.005092,
+ -0.639808,-0.301071,0.707108,0.040532,0.048661,-0.005193,
+ -0.597029,-0.378886,0.707108,0.041559,0.046793,-0.005193,
+ -0.521846,-0.331174,0.78613,0.041656,0.046855,-0.005092,
+ -0.541611,-0.297753,0.78613,0.041117,0.047766,-0.005092,
+ -0.597029,-0.378886,0.707108,0.041559,0.046793,-0.005193,
+ -0.541611,-0.297753,0.78613,0.041117,0.047766,-0.005092,
+ -0.619641,-0.340651,0.707108,0.041016,0.047711,-0.005193,
+ -0.57206,-0.415626,0.707108,0.042158,0.045912,-0.005193,
+ -0.500022,-0.363287,0.78613,0.042251,0.045979,-0.005092,
+ -0.521846,-0.331174,0.78613,0.041656,0.046855,-0.005092,
+ -0.57206,-0.415626,0.707108,0.042158,0.045912,-0.005193,
+ -0.521846,-0.331174,0.78613,0.041656,0.046855,-0.005092,
+ -0.597029,-0.378886,0.707108,0.041559,0.046793,-0.005193,
+ -0.544834,-0.450726,0.707108,0.042811,0.04507,-0.005193,
+ -0.476224,-0.393967,0.78613,0.0429,0.045143,-0.005092,
+ -0.500022,-0.363287,0.78613,0.042251,0.045979,-0.005092,
+ -0.544834,-0.450726,0.707108,0.042811,0.04507,-0.005193,
+ -0.500022,-0.363287,0.78613,0.042251,0.045979,-0.005092,
+ -0.57206,-0.415626,0.707108,0.042158,0.045912,-0.005193,
+ -0.515458,-0.484047,0.707108,0.043516,0.04427,-0.005193,
+ -0.450547,-0.423092,0.78613,0.0436,0.044348,-0.005092,
+ -0.476224,-0.393967,0.78613,0.0429,0.045143,-0.005092,
+ -0.515458,-0.484047,0.707108,0.043516,0.04427,-0.005193,
+ -0.476224,-0.393967,0.78613,0.0429,0.045143,-0.005092,
+ -0.544834,-0.450726,0.707108,0.042811,0.04507,-0.005193,
+ -0.484047,-0.515458,0.707108,0.04427,0.043516,-0.005193,
+ -0.423092,-0.450547,0.78613,0.044348,0.0436,-0.005092,
+ -0.450547,-0.423092,0.78613,0.0436,0.044348,-0.005092,
+ -0.484047,-0.515458,0.707108,0.04427,0.043516,-0.005193,
+ -0.450547,-0.423092,0.78613,0.0436,0.044348,-0.005092,
+ -0.515458,-0.484047,0.707108,0.043516,0.04427,-0.005193,
+ -0.450726,-0.544834,0.707108,0.04507,0.042811,-0.005193,
+ -0.393967,-0.476224,0.78613,0.045143,0.0429,-0.005092,
+ -0.423092,-0.450547,0.78613,0.044348,0.0436,-0.005092,
+ -0.450726,-0.544834,0.707108,0.04507,0.042811,-0.005193,
+ -0.423092,-0.450547,0.78613,0.044348,0.0436,-0.005092,
+ -0.484047,-0.515458,0.707108,0.04427,0.043516,-0.005193,
+ -0.415626,-0.57206,0.707108,0.045912,0.042158,-0.005193,
+ -0.363287,-0.500022,0.78613,0.045979,0.042251,-0.005092,
+ -0.393967,-0.476224,0.78613,0.045143,0.0429,-0.005092,
+ -0.415626,-0.57206,0.707108,0.045912,0.042158,-0.005193,
+ -0.393967,-0.476224,0.78613,0.045143,0.0429,-0.005092,
+ -0.450726,-0.544834,0.707108,0.04507,0.042811,-0.005193,
+ -0.378886,-0.597029,0.707108,0.046793,0.041559,-0.005193,
+ -0.331174,-0.521846,0.78613,0.046855,0.041656,-0.005092,
+ -0.363287,-0.500022,0.78613,0.045979,0.042251,-0.005092,
+ -0.378886,-0.597029,0.707108,0.046793,0.041559,-0.005193,
+ -0.363287,-0.500022,0.78613,0.045979,0.042251,-0.005092,
+ -0.415626,-0.57206,0.707108,0.045912,0.042158,-0.005193,
+ -0.340651,-0.619641,0.707108,0.047711,0.041016,-0.005193,
+ -0.297753,-0.541611,0.78613,0.047766,0.041117,-0.005092,
+ -0.331174,-0.521846,0.78613,0.046855,0.041656,-0.005092,
+ -0.340651,-0.619641,0.707108,0.047711,0.041016,-0.005193,
+ -0.331174,-0.521846,0.78613,0.046855,0.041656,-0.005092,
+ -0.378886,-0.597029,0.707108,0.046793,0.041559,-0.005193,
+ -0.301071,-0.639808,0.707108,0.048661,0.040532,-0.005193,
+ -0.263158,-0.559239,0.78613,0.048709,0.040636,-0.005092,
+ -0.297753,-0.541611,0.78613,0.047766,0.041117,-0.005092,
+ -0.301071,-0.639808,0.707108,0.048661,0.040532,-0.005193,
+ -0.297753,-0.541611,0.78613,0.047766,0.041117,-0.005092,
+ -0.340651,-0.619641,0.707108,0.047711,0.041016,-0.005193,
+ -0.260303,-0.65745,0.707108,0.049639,0.040109,-0.005193,
+ -0.227524,-0.574659,0.78613,0.049681,0.040215,-0.005092,
+ -0.263158,-0.559239,0.78613,0.048709,0.040636,-0.005092,
+ -0.260303,-0.65745,0.707108,0.049639,0.040109,-0.005193,
+ -0.263158,-0.559239,0.78613,0.048709,0.040636,-0.005092,
+ -0.301071,-0.639808,0.707108,0.048661,0.040532,-0.005193,
+ -0.218508,-0.672497,0.707108,0.050642,0.039748,-0.005193,
+ -0.190991,-0.587811,0.78613,0.050677,0.039857,-0.005092,
+ -0.227524,-0.574659,0.78613,0.049681,0.040215,-0.005092,
+ -0.218508,-0.672497,0.707108,0.050642,0.039748,-0.005193,
+ -0.227524,-0.574659,0.78613,0.049681,0.040215,-0.005092,
+ -0.260303,-0.65745,0.707108,0.049639,0.040109,-0.005193,
+ -0.17585,-0.684891,0.707108,0.051666,0.03945,-0.005193,
+ -0.153706,-0.598644,0.78613,0.051694,0.039562,-0.005092,
+ -0.190991,-0.587811,0.78613,0.050677,0.039857,-0.005092,
+ -0.17585,-0.684891,0.707108,0.051666,0.03945,-0.005193,
+ -0.190991,-0.587811,0.78613,0.050677,0.039857,-0.005092,
+ -0.218508,-0.672497,0.707108,0.050642,0.039748,-0.005193,
+ -0.132498,-0.694581,0.707108,0.052706,0.039218,-0.005193,
+ -0.115813,-0.607114,0.78613,0.052727,0.039331,-0.005092,
+ -0.153706,-0.598644,0.78613,0.051694,0.039562,-0.005092,
+ -0.132498,-0.694581,0.707108,0.052706,0.039218,-0.005193,
+ -0.153706,-0.598644,0.78613,0.051694,0.039562,-0.005092,
+ -0.17585,-0.684891,0.707108,0.051666,0.03945,-0.005193,
+ -0.088624,-0.70153,0.707108,0.053759,0.039051,-0.005193,
+ -0.077464,-0.613188,0.78613,0.053773,0.039165,-0.005092,
+ -0.115813,-0.607114,0.78613,0.052727,0.039331,-0.005092,
+ -0.088624,-0.70153,0.707108,0.053759,0.039051,-0.005193,
+ -0.115813,-0.607114,0.78613,0.052727,0.039331,-0.005092,
+ -0.132498,-0.694581,0.707108,0.052706,0.039218,-0.005193,
+ -0.0444,-0.70571,0.707108,0.05482,0.038951,-0.005193,
+ -0.038808,-0.616842,0.78613,0.054827,0.039065,-0.005092,
+ -0.077464,-0.613188,0.78613,0.053773,0.039165,-0.005092,
+ -0.0444,-0.70571,0.707108,0.05482,0.038951,-0.005193,
+ -0.077464,-0.613188,0.78613,0.053773,0.039165,-0.005092,
+ -0.088624,-0.70153,0.707108,0.053759,0.039051,-0.005193,
+ 0,-0.707106,0.707108,0.055885,0.038917,-0.005193,
+ 0,-0.618061,0.78613,0.055885,0.039032,-0.005092,
+ -0.038808,-0.616842,0.78613,0.054827,0.039065,-0.005092,
+ 0,-0.707106,0.707108,0.055885,0.038917,-0.005193,
+ -0.038808,-0.616842,0.78613,0.054827,0.039065,-0.005092,
+ -0.0444,-0.70571,0.707108,0.05482,0.038951,-0.005193,
+ 0.0444,-0.70571,0.707108,0.056951,0.038951,-0.005193,
+ 0.038808,-0.616842,0.78613,0.056943,0.039065,-0.005092,
+ 0,-0.618061,0.78613,0.055885,0.039032,-0.005092,
+ 0.0444,-0.70571,0.707108,0.056951,0.038951,-0.005193,
+ 0,-0.618061,0.78613,0.055885,0.039032,-0.005092,
+ 0,-0.707106,0.707108,0.055885,0.038917,-0.005193,
+ 0.088624,-0.70153,0.707108,0.058012,0.039051,-0.005193,
+ 0.077464,-0.613188,0.78613,0.057998,0.039165,-0.005092,
+ 0.038808,-0.616842,0.78613,0.056943,0.039065,-0.005092,
+ 0.088624,-0.70153,0.707108,0.058012,0.039051,-0.005193,
+ 0.038808,-0.616842,0.78613,0.056943,0.039065,-0.005092,
+ 0.0444,-0.70571,0.707108,0.056951,0.038951,-0.005193,
+ 0.132498,-0.694581,0.707108,0.059065,0.039218,-0.005193,
+ 0.115813,-0.607114,0.78613,0.059043,0.039331,-0.005092,
+ 0.077464,-0.613188,0.78613,0.057998,0.039165,-0.005092,
+ 0.132498,-0.694581,0.707108,0.059065,0.039218,-0.005193,
+ 0.077464,-0.613188,0.78613,0.057998,0.039165,-0.005092,
+ 0.088624,-0.70153,0.707108,0.058012,0.039051,-0.005193,
+ 0.17585,-0.684891,0.707108,0.060105,0.03945,-0.005193,
+ 0.153706,-0.598644,0.78613,0.060077,0.039562,-0.005092,
+ 0.115813,-0.607114,0.78613,0.059043,0.039331,-0.005092,
+ 0.17585,-0.684891,0.707108,0.060105,0.03945,-0.005193,
+ 0.115813,-0.607114,0.78613,0.059043,0.039331,-0.005092,
+ 0.132498,-0.694581,0.707108,0.059065,0.039218,-0.005193,
+ 0.218508,-0.672497,0.707108,0.061129,0.039748,-0.005193,
+ 0.190991,-0.587811,0.78613,0.061093,0.039857,-0.005092,
+ 0.153706,-0.598644,0.78613,0.060077,0.039562,-0.005092,
+ 0.218508,-0.672497,0.707108,0.061129,0.039748,-0.005193,
+ 0.153706,-0.598644,0.78613,0.060077,0.039562,-0.005092,
+ 0.17585,-0.684891,0.707108,0.060105,0.03945,-0.005193,
+ 0.260303,-0.65745,0.707108,0.062132,0.040109,-0.005193,
+ 0.227524,-0.574659,0.78613,0.062089,0.040215,-0.005092,
+ 0.190991,-0.587811,0.78613,0.061093,0.039857,-0.005092,
+ 0.260303,-0.65745,0.707108,0.062132,0.040109,-0.005193,
+ 0.190991,-0.587811,0.78613,0.061093,0.039857,-0.005092,
+ 0.218508,-0.672497,0.707108,0.061129,0.039748,-0.005193,
+ 0.301071,-0.639808,0.707108,0.06311,0.040532,-0.005193,
+ 0.263158,-0.559239,0.78613,0.063061,0.040636,-0.005092,
+ 0.227524,-0.574659,0.78613,0.062089,0.040215,-0.005092,
+ 0.301071,-0.639808,0.707108,0.06311,0.040532,-0.005193,
+ 0.227524,-0.574659,0.78613,0.062089,0.040215,-0.005092,
+ 0.260303,-0.65745,0.707108,0.062132,0.040109,-0.005193,
+ 0.340651,-0.619641,0.707108,0.06406,0.041016,-0.005193,
+ 0.297753,-0.541611,0.78613,0.064004,0.041117,-0.005092,
+ 0.263158,-0.559239,0.78613,0.063061,0.040636,-0.005092,
+ 0.340651,-0.619641,0.707108,0.06406,0.041016,-0.005193,
+ 0.263158,-0.559239,0.78613,0.063061,0.040636,-0.005092,
+ 0.301071,-0.639808,0.707108,0.06311,0.040532,-0.005193,
+ 0.378886,-0.597029,0.707108,0.064977,0.041559,-0.005193,
+ 0.331174,-0.521846,0.78613,0.064916,0.041656,-0.005092,
+ 0.297753,-0.541611,0.78613,0.064004,0.041117,-0.005092,
+ 0.378886,-0.597029,0.707108,0.064977,0.041559,-0.005193,
+ 0.297753,-0.541611,0.78613,0.064004,0.041117,-0.005092,
+ 0.340651,-0.619641,0.707108,0.06406,0.041016,-0.005193,
+ 0.415626,-0.57206,0.707108,0.065859,0.042158,-0.005193,
+ 0.363287,-0.500022,0.78613,0.065791,0.042251,-0.005092,
+ 0.331174,-0.521846,0.78613,0.064916,0.041656,-0.005092,
+ 0.415626,-0.57206,0.707108,0.065859,0.042158,-0.005193,
+ 0.331174,-0.521846,0.78613,0.064916,0.041656,-0.005092,
+ 0.378886,-0.597029,0.707108,0.064977,0.041559,-0.005193,
+ 0.450726,-0.544834,0.707108,0.066701,0.042811,-0.005193,
+ 0.393967,-0.476224,0.78613,0.066628,0.0429,-0.005092,
+ 0.363287,-0.500022,0.78613,0.065791,0.042251,-0.005092,
+ 0.450726,-0.544834,0.707108,0.066701,0.042811,-0.005193,
+ 0.363287,-0.500022,0.78613,0.065791,0.042251,-0.005092,
+ 0.415626,-0.57206,0.707108,0.065859,0.042158,-0.005193,
+ 0.484047,-0.515458,0.707108,0.067501,0.043516,-0.005193,
+ 0.423092,-0.450547,0.78613,0.067422,0.0436,-0.005092,
+ 0.393967,-0.476224,0.78613,0.066628,0.0429,-0.005092,
+ 0.484047,-0.515458,0.707108,0.067501,0.043516,-0.005193,
+ 0.393967,-0.476224,0.78613,0.066628,0.0429,-0.005092,
+ 0.450726,-0.544834,0.707108,0.066701,0.042811,-0.005193,
+ 0.515458,-0.484047,0.707108,0.068254,0.04427,-0.005193,
+ 0.450547,-0.423092,0.78613,0.068171,0.044348,-0.005092,
+ 0.423092,-0.450547,0.78613,0.067422,0.0436,-0.005092,
+ 0.515458,-0.484047,0.707108,0.068254,0.04427,-0.005193,
+ 0.423092,-0.450547,0.78613,0.067422,0.0436,-0.005092,
+ 0.484047,-0.515458,0.707108,0.067501,0.043516,-0.005193,
+ 0.544834,-0.450726,0.707108,0.068959,0.04507,-0.005193,
+ 0.476224,-0.393967,0.78613,0.068871,0.045143,-0.005092,
+ 0.450547,-0.423092,0.78613,0.068171,0.044348,-0.005092,
+ 0.544834,-0.450726,0.707108,0.068959,0.04507,-0.005193,
+ 0.450547,-0.423092,0.78613,0.068171,0.044348,-0.005092,
+ 0.515458,-0.484047,0.707108,0.068254,0.04427,-0.005193,
+ 0.57206,-0.415626,0.707108,0.069613,0.045912,-0.005193,
+ 0.500022,-0.363287,0.78613,0.06952,0.045979,-0.005092,
+ 0.476224,-0.393967,0.78613,0.068871,0.045143,-0.005092,
+ 0.57206,-0.415626,0.707108,0.069613,0.045912,-0.005193,
+ 0.476224,-0.393967,0.78613,0.068871,0.045143,-0.005092,
+ 0.544834,-0.450726,0.707108,0.068959,0.04507,-0.005193,
+ 0.597029,-0.378886,0.707108,0.070212,0.046793,-0.005193,
+ 0.521846,-0.331174,0.78613,0.070115,0.046855,-0.005092,
+ 0.500022,-0.363287,0.78613,0.06952,0.045979,-0.005092,
+ 0.597029,-0.378886,0.707108,0.070212,0.046793,-0.005193,
+ 0.500022,-0.363287,0.78613,0.06952,0.045979,-0.005092,
+ 0.57206,-0.415626,0.707108,0.069613,0.045912,-0.005193,
+ 0.619641,-0.340651,0.707108,0.070754,0.047711,-0.005193,
+ 0.541611,-0.297753,0.78613,0.070654,0.047766,-0.005092,
+ 0.521846,-0.331174,0.78613,0.070115,0.046855,-0.005092,
+ 0.619641,-0.340651,0.707108,0.070754,0.047711,-0.005193,
+ 0.521846,-0.331174,0.78613,0.070115,0.046855,-0.005092,
+ 0.597029,-0.378886,0.707108,0.070212,0.046793,-0.005193,
+ 0.639808,-0.301071,0.707108,0.071238,0.048661,-0.005193,
+ 0.559239,-0.263158,0.78613,0.071135,0.048709,-0.005092,
+ 0.541611,-0.297753,0.78613,0.070654,0.047766,-0.005092,
+ 0.639808,-0.301071,0.707108,0.071238,0.048661,-0.005193,
+ 0.541611,-0.297753,0.78613,0.070654,0.047766,-0.005092,
+ 0.619641,-0.340651,0.707108,0.070754,0.047711,-0.005193,
+ 0.65745,-0.260303,0.707108,0.071662,0.049639,-0.005193,
+ 0.574659,-0.227524,0.78613,0.071555,0.049681,-0.005092,
+ 0.559239,-0.263158,0.78613,0.071135,0.048709,-0.005092,
+ 0.65745,-0.260303,0.707108,0.071662,0.049639,-0.005193,
+ 0.559239,-0.263158,0.78613,0.071135,0.048709,-0.005092,
+ 0.639808,-0.301071,0.707108,0.071238,0.048661,-0.005193,
+ 0.672497,-0.218508,0.707108,0.072023,0.050642,-0.005193,
+ 0.587811,-0.190991,0.78613,0.071914,0.050677,-0.005092,
+ 0.574659,-0.227524,0.78613,0.071555,0.049681,-0.005092,
+ 0.672497,-0.218508,0.707108,0.072023,0.050642,-0.005193,
+ 0.574659,-0.227524,0.78613,0.071555,0.049681,-0.005092,
+ 0.65745,-0.260303,0.707108,0.071662,0.049639,-0.005193,
+ 0.684891,-0.17585,0.707108,0.07232,0.051666,-0.005193,
+ 0.598644,-0.153706,0.78613,0.072209,0.051694,-0.005092,
+ 0.587811,-0.190991,0.78613,0.071914,0.050677,-0.005092,
+ 0.684891,-0.17585,0.707108,0.07232,0.051666,-0.005193,
+ 0.587811,-0.190991,0.78613,0.071914,0.050677,-0.005092,
+ 0.672497,-0.218508,0.707108,0.072023,0.050642,-0.005193,
+ 0.694581,-0.132498,0.707108,0.072553,0.052706,-0.005193,
+ 0.607114,-0.115813,0.78613,0.07244,0.052727,-0.005092,
+ 0.598644,-0.153706,0.78613,0.072209,0.051694,-0.005092,
+ 0.694581,-0.132498,0.707108,0.072553,0.052706,-0.005193,
+ 0.598644,-0.153706,0.78613,0.072209,0.051694,-0.005092,
+ 0.684891,-0.17585,0.707108,0.07232,0.051666,-0.005193,
+ 0.70153,-0.088624,0.707108,0.072719,0.053759,-0.005193,
+ 0.613188,-0.077464,0.78613,0.072606,0.053773,-0.005092,
+ 0.607114,-0.115813,0.78613,0.07244,0.052727,-0.005092,
+ 0.70153,-0.088624,0.707108,0.072719,0.053759,-0.005193,
+ 0.607114,-0.115813,0.78613,0.07244,0.052727,-0.005092,
+ 0.694581,-0.132498,0.707108,0.072553,0.052706,-0.005193,
+ 0.70571,-0.0444,0.707108,0.07282,0.05482,-0.005193,
+ 0.616842,-0.038808,0.78613,0.072705,0.054827,-0.005092,
+ 0.613188,-0.077464,0.78613,0.072606,0.053773,-0.005092,
+ 0.70571,-0.0444,0.707108,0.07282,0.05482,-0.005193,
+ 0.613188,-0.077464,0.78613,0.072606,0.053773,-0.005092,
+ 0.70153,-0.088624,0.707108,0.072719,0.053759,-0.005193,
+ 0.707106,0,0.707108,0.072853,0.055885,-0.005193,
+ 0.618061,0,0.78613,0.072739,0.055885,-0.005092,
+ 0.616842,-0.038808,0.78613,0.072705,0.054827,-0.005092,
+ 0.707106,0,0.707108,0.072853,0.055885,-0.005193,
+ 0.616842,-0.038808,0.78613,0.072705,0.054827,-0.005092,
+ 0.70571,-0.0444,0.707108,0.07282,0.05482,-0.005193,
+ 0.70571,0.0444,0.707108,0.07282,0.056951,-0.005193,
+ 0.616842,0.038808,0.78613,0.072705,0.056943,-0.005092,
+ 0.618061,0,0.78613,0.072739,0.055885,-0.005092,
+ 0.70571,0.0444,0.707108,0.07282,0.056951,-0.005193,
+ 0.618061,0,0.78613,0.072739,0.055885,-0.005092,
+ 0.707106,0,0.707108,0.072853,0.055885,-0.005193,
+ 0.70153,0.088624,0.707108,0.072719,0.058012,-0.005193,
+ 0.613188,0.077464,0.78613,0.072606,0.057998,-0.005092,
+ 0.616842,0.038808,0.78613,0.072705,0.056943,-0.005092,
+ 0.70153,0.088624,0.707108,0.072719,0.058012,-0.005193,
+ 0.616842,0.038808,0.78613,0.072705,0.056943,-0.005092,
+ 0.70571,0.0444,0.707108,0.07282,0.056951,-0.005193,
+ 0.694581,0.132498,0.707108,0.072553,0.059065,-0.005193,
+ 0.607114,0.115813,0.78613,0.07244,0.059043,-0.005092,
+ 0.613188,0.077464,0.78613,0.072606,0.057998,-0.005092,
+ 0.694581,0.132498,0.707108,0.072553,0.059065,-0.005193,
+ 0.613188,0.077464,0.78613,0.072606,0.057998,-0.005092,
+ 0.70153,0.088624,0.707108,0.072719,0.058012,-0.005193,
+ 0.684891,0.17585,0.707108,0.07232,0.060105,-0.005193,
+ 0.598644,0.153706,0.78613,0.072209,0.060077,-0.005092,
+ 0.607114,0.115813,0.78613,0.07244,0.059043,-0.005092,
+ 0.684891,0.17585,0.707108,0.07232,0.060105,-0.005193,
+ 0.607114,0.115813,0.78613,0.07244,0.059043,-0.005092,
+ 0.694581,0.132498,0.707108,0.072553,0.059065,-0.005193,
+ 0.672497,0.218508,0.707108,0.072023,0.061129,-0.005193,
+ 0.587811,0.190991,0.78613,0.071914,0.061093,-0.005092,
+ 0.598644,0.153706,0.78613,0.072209,0.060077,-0.005092,
+ 0.672497,0.218508,0.707108,0.072023,0.061129,-0.005193,
+ 0.598644,0.153706,0.78613,0.072209,0.060077,-0.005092,
+ 0.684891,0.17585,0.707108,0.07232,0.060105,-0.005193,
+ 0.65745,0.260303,0.707108,0.071662,0.062132,-0.005193,
+ 0.574659,0.227524,0.78613,0.071555,0.062089,-0.005092,
+ 0.587811,0.190991,0.78613,0.071914,0.061093,-0.005092,
+ 0.65745,0.260303,0.707108,0.071662,0.062132,-0.005193,
+ 0.587811,0.190991,0.78613,0.071914,0.061093,-0.005092,
+ 0.672497,0.218508,0.707108,0.072023,0.061129,-0.005193,
+ 0.639808,0.301071,0.707108,0.071238,0.06311,-0.005193,
+ 0.559239,0.263158,0.78613,0.071135,0.063061,-0.005092,
+ 0.574659,0.227524,0.78613,0.071555,0.062089,-0.005092,
+ 0.639808,0.301071,0.707108,0.071238,0.06311,-0.005193,
+ 0.574659,0.227524,0.78613,0.071555,0.062089,-0.005092,
+ 0.65745,0.260303,0.707108,0.071662,0.062132,-0.005193,
+ 0.619641,0.340651,0.707108,0.070754,0.06406,-0.005193,
+ 0.541611,0.297753,0.78613,0.070654,0.064004,-0.005092,
+ 0.559239,0.263158,0.78613,0.071135,0.063061,-0.005092,
+ 0.619641,0.340651,0.707108,0.070754,0.06406,-0.005193,
+ 0.559239,0.263158,0.78613,0.071135,0.063061,-0.005092,
+ 0.639808,0.301071,0.707108,0.071238,0.06311,-0.005193,
+ 0.597029,0.378886,0.707108,0.070212,0.064977,-0.005193,
+ 0.521846,0.331174,0.78613,0.070115,0.064916,-0.005092,
+ 0.541611,0.297753,0.78613,0.070654,0.064004,-0.005092,
+ 0.597029,0.378886,0.707108,0.070212,0.064977,-0.005193,
+ 0.541611,0.297753,0.78613,0.070654,0.064004,-0.005092,
+ 0.619641,0.340651,0.707108,0.070754,0.06406,-0.005193,
+ 0.57206,0.415626,0.707108,0.069613,0.065859,-0.005193,
+ 0.500022,0.363287,0.78613,0.06952,0.065791,-0.005092,
+ 0.521846,0.331174,0.78613,0.070115,0.064916,-0.005092,
+ 0.57206,0.415626,0.707108,0.069613,0.065859,-0.005193,
+ 0.521846,0.331174,0.78613,0.070115,0.064916,-0.005092,
+ 0.597029,0.378886,0.707108,0.070212,0.064977,-0.005193,
+ 0.544834,0.450726,0.707108,0.068959,0.066701,-0.005193,
+ 0.476224,0.393967,0.78613,0.068871,0.066628,-0.005092,
+ 0.500022,0.363287,0.78613,0.06952,0.065791,-0.005092,
+ 0.544834,0.450726,0.707108,0.068959,0.066701,-0.005193,
+ 0.500022,0.363287,0.78613,0.06952,0.065791,-0.005092,
+ 0.57206,0.415626,0.707108,0.069613,0.065859,-0.005193,
+ 0.515458,0.484047,0.707108,0.068254,0.067501,-0.005193,
+ 0.450547,0.423092,0.78613,0.068171,0.067422,-0.005092,
+ 0.476224,0.393967,0.78613,0.068871,0.066628,-0.005092,
+ 0.515458,0.484047,0.707108,0.068254,0.067501,-0.005193,
+ 0.476224,0.393967,0.78613,0.068871,0.066628,-0.005092,
+ 0.544834,0.450726,0.707108,0.068959,0.066701,-0.005193,
+ 0.484047,0.515458,0.707108,0.067501,0.068254,-0.005193,
+ 0.423092,0.450547,0.78613,0.067422,0.068171,-0.005092,
+ 0.450547,0.423092,0.78613,0.068171,0.067422,-0.005092,
+ 0.484047,0.515458,0.707108,0.067501,0.068254,-0.005193,
+ 0.450547,0.423092,0.78613,0.068171,0.067422,-0.005092,
+ 0.515458,0.484047,0.707108,0.068254,0.067501,-0.005193,
+ 0.450726,0.544834,0.707108,0.066701,0.068959,-0.005193,
+ 0.393967,0.476224,0.78613,0.066628,0.068871,-0.005092,
+ 0.423092,0.450547,0.78613,0.067422,0.068171,-0.005092,
+ 0.450726,0.544834,0.707108,0.066701,0.068959,-0.005193,
+ 0.423092,0.450547,0.78613,0.067422,0.068171,-0.005092,
+ 0.484047,0.515458,0.707108,0.067501,0.068254,-0.005193,
+ 0.415626,0.57206,0.707108,0.065859,0.069613,-0.005193,
+ 0.363287,0.500022,0.78613,0.065791,0.06952,-0.005092,
+ 0.393967,0.476224,0.78613,0.066628,0.068871,-0.005092,
+ 0.415626,0.57206,0.707108,0.065859,0.069613,-0.005193,
+ 0.393967,0.476224,0.78613,0.066628,0.068871,-0.005092,
+ 0.450726,0.544834,0.707108,0.066701,0.068959,-0.005193,
+ 0.378886,0.597029,0.707108,0.064977,0.070212,-0.005193,
+ 0.331174,0.521846,0.78613,0.064916,0.070115,-0.005092,
+ 0.363287,0.500022,0.78613,0.065791,0.06952,-0.005092,
+ 0.378886,0.597029,0.707108,0.064977,0.070212,-0.005193,
+ 0.363287,0.500022,0.78613,0.065791,0.06952,-0.005092,
+ 0.415626,0.57206,0.707108,0.065859,0.069613,-0.005193,
+ 0.340651,0.619641,0.707108,0.06406,0.070754,-0.005193,
+ 0.297753,0.541611,0.78613,0.064004,0.070654,-0.005092,
+ 0.331174,0.521846,0.78613,0.064916,0.070115,-0.005092,
+ 0.340651,0.619641,0.707108,0.06406,0.070754,-0.005193,
+ 0.331174,0.521846,0.78613,0.064916,0.070115,-0.005092,
+ 0.378886,0.597029,0.707108,0.064977,0.070212,-0.005193,
+ 0.301071,0.639808,0.707108,0.06311,0.071238,-0.005193,
+ 0.263158,0.559239,0.78613,0.063061,0.071135,-0.005092,
+ 0.297753,0.541611,0.78613,0.064004,0.070654,-0.005092,
+ 0.301071,0.639808,0.707108,0.06311,0.071238,-0.005193,
+ 0.297753,0.541611,0.78613,0.064004,0.070654,-0.005092,
+ 0.340651,0.619641,0.707108,0.06406,0.070754,-0.005193,
+ 0.260303,0.65745,0.707108,0.062132,0.071662,-0.005193,
+ 0.227524,0.574659,0.78613,0.062089,0.071555,-0.005092,
+ 0.263158,0.559239,0.78613,0.063061,0.071135,-0.005092,
+ 0.260303,0.65745,0.707108,0.062132,0.071662,-0.005193,
+ 0.263158,0.559239,0.78613,0.063061,0.071135,-0.005092,
+ 0.301071,0.639808,0.707108,0.06311,0.071238,-0.005193,
+ 0.218508,0.672497,0.707108,0.061129,0.072023,-0.005193,
+ 0.190991,0.587811,0.78613,0.061093,0.071914,-0.005092,
+ 0.227524,0.574659,0.78613,0.062089,0.071555,-0.005092,
+ 0.218508,0.672497,0.707108,0.061129,0.072023,-0.005193,
+ 0.227524,0.574659,0.78613,0.062089,0.071555,-0.005092,
+ 0.260303,0.65745,0.707108,0.062132,0.071662,-0.005193,
+ 0.17585,0.684891,0.707108,0.060105,0.07232,-0.005193,
+ 0.153706,0.598644,0.78613,0.060077,0.072209,-0.005092,
+ 0.190991,0.587811,0.78613,0.061093,0.071914,-0.005092,
+ 0.17585,0.684891,0.707108,0.060105,0.07232,-0.005193,
+ 0.190991,0.587811,0.78613,0.061093,0.071914,-0.005092,
+ 0.218508,0.672497,0.707108,0.061129,0.072023,-0.005193,
+ 0.132498,0.694581,0.707108,0.059065,0.072553,-0.005193,
+ 0.115813,0.607114,0.78613,0.059043,0.07244,-0.005092,
+ 0.153706,0.598644,0.78613,0.060077,0.072209,-0.005092,
+ 0.132498,0.694581,0.707108,0.059065,0.072553,-0.005193,
+ 0.153706,0.598644,0.78613,0.060077,0.072209,-0.005092,
+ 0.17585,0.684891,0.707108,0.060105,0.07232,-0.005193,
+ 0.088624,0.70153,0.707108,0.058012,0.072719,-0.005193,
+ 0.077464,0.613188,0.78613,0.057998,0.072606,-0.005092,
+ 0.115813,0.607114,0.78613,0.059043,0.07244,-0.005092,
+ 0.088624,0.70153,0.707108,0.058012,0.072719,-0.005193,
+ 0.115813,0.607114,0.78613,0.059043,0.07244,-0.005092,
+ 0.132498,0.694581,0.707108,0.059065,0.072553,-0.005193,
+ 0.0444,0.70571,0.707108,0.056951,0.07282,-0.005193,
+ 0.038808,0.616842,0.78613,0.056943,0.072705,-0.005092,
+ 0.077464,0.613188,0.78613,0.057998,0.072606,-0.005092,
+ 0.0444,0.70571,0.707108,0.056951,0.07282,-0.005193,
+ 0.077464,0.613188,0.78613,0.057998,0.072606,-0.005092,
+ 0.088624,0.70153,0.707108,0.058012,0.072719,-0.005193,
+ 0,0.707106,0.707108,0.055885,0.072853,-0.005193,
+ 0,0.618061,0.78613,0.055885,0.072739,-0.005092,
+ 0.038808,0.616842,0.78613,0.056943,0.072705,-0.005092,
+ 0,0.707106,0.707108,0.055885,0.072853,-0.005193,
+ 0.038808,0.616842,0.78613,0.056943,0.072705,-0.005092,
+ 0.0444,0.70571,0.707108,0.056951,0.07282,-0.005193,
+ -0.0444,0.70571,0.707108,0.05482,0.07282,-0.005193,
+ -0.038808,0.616842,0.78613,0.054827,0.072705,-0.005092,
+ 0,0.618061,0.78613,0.055885,0.072739,-0.005092,
+ -0.0444,0.70571,0.707108,0.05482,0.07282,-0.005193,
+ 0,0.618061,0.78613,0.055885,0.072739,-0.005092,
+ 0,0.707106,0.707108,0.055885,0.072853,-0.005193,
+ -0.088624,0.70153,0.707108,0.053759,0.072719,-0.005193,
+ -0.077464,0.613188,0.78613,0.053773,0.072606,-0.005092,
+ -0.038808,0.616842,0.78613,0.054827,0.072705,-0.005092,
+ -0.088624,0.70153,0.707108,0.053759,0.072719,-0.005193,
+ -0.038808,0.616842,0.78613,0.054827,0.072705,-0.005092,
+ -0.0444,0.70571,0.707108,0.05482,0.07282,-0.005193,
+ -0.132498,0.694581,0.707108,0.052706,0.072553,-0.005193,
+ -0.115813,0.607114,0.78613,0.052727,0.07244,-0.005092,
+ -0.077464,0.613188,0.78613,0.053773,0.072606,-0.005092,
+ -0.132498,0.694581,0.707108,0.052706,0.072553,-0.005193,
+ -0.077464,0.613188,0.78613,0.053773,0.072606,-0.005092,
+ -0.088624,0.70153,0.707108,0.053759,0.072719,-0.005193,
+ -0.17585,0.684891,0.707108,0.051666,0.07232,-0.005193,
+ -0.153706,0.598644,0.78613,0.051694,0.072209,-0.005092,
+ -0.115813,0.607114,0.78613,0.052727,0.07244,-0.005092,
+ -0.17585,0.684891,0.707108,0.051666,0.07232,-0.005193,
+ -0.115813,0.607114,0.78613,0.052727,0.07244,-0.005092,
+ -0.132498,0.694581,0.707108,0.052706,0.072553,-0.005193,
+ -0.218508,0.672497,0.707108,0.050642,0.072023,-0.005193,
+ -0.190991,0.587811,0.78613,0.050677,0.071914,-0.005092,
+ -0.153706,0.598644,0.78613,0.051694,0.072209,-0.005092,
+ -0.218508,0.672497,0.707108,0.050642,0.072023,-0.005193,
+ -0.153706,0.598644,0.78613,0.051694,0.072209,-0.005092,
+ -0.17585,0.684891,0.707108,0.051666,0.07232,-0.005193,
+ -0.260303,0.65745,0.707108,0.049639,0.071662,-0.005193,
+ -0.227524,0.574659,0.78613,0.049681,0.071555,-0.005092,
+ -0.190991,0.587811,0.78613,0.050677,0.071914,-0.005092,
+ -0.260303,0.65745,0.707108,0.049639,0.071662,-0.005193,
+ -0.190991,0.587811,0.78613,0.050677,0.071914,-0.005092,
+ -0.218508,0.672497,0.707108,0.050642,0.072023,-0.005193,
+ -0.301071,0.639808,0.707108,0.048661,0.071238,-0.005193,
+ -0.263158,0.559239,0.78613,0.048709,0.071135,-0.005092,
+ -0.227524,0.574659,0.78613,0.049681,0.071555,-0.005092,
+ -0.301071,0.639808,0.707108,0.048661,0.071238,-0.005193,
+ -0.227524,0.574659,0.78613,0.049681,0.071555,-0.005092,
+ -0.260303,0.65745,0.707108,0.049639,0.071662,-0.005193,
+ -0.340651,0.619641,0.707108,0.047711,0.070754,-0.005193,
+ -0.297753,0.541611,0.78613,0.047766,0.070654,-0.005092,
+ -0.263158,0.559239,0.78613,0.048709,0.071135,-0.005092,
+ -0.340651,0.619641,0.707108,0.047711,0.070754,-0.005193,
+ -0.263158,0.559239,0.78613,0.048709,0.071135,-0.005092,
+ -0.301071,0.639808,0.707108,0.048661,0.071238,-0.005193,
+ -0.378886,0.597029,0.707108,0.046793,0.070212,-0.005193,
+ -0.331174,0.521846,0.78613,0.046855,0.070115,-0.005092,
+ -0.297753,0.541611,0.78613,0.047766,0.070654,-0.005092,
+ -0.378886,0.597029,0.707108,0.046793,0.070212,-0.005193,
+ -0.297753,0.541611,0.78613,0.047766,0.070654,-0.005092,
+ -0.340651,0.619641,0.707108,0.047711,0.070754,-0.005193,
+ -0.415626,0.57206,0.707108,0.045912,0.069613,-0.005193,
+ -0.363287,0.500022,0.78613,0.045979,0.06952,-0.005092,
+ -0.331174,0.521846,0.78613,0.046855,0.070115,-0.005092,
+ -0.415626,0.57206,0.707108,0.045912,0.069613,-0.005193,
+ -0.331174,0.521846,0.78613,0.046855,0.070115,-0.005092,
+ -0.378886,0.597029,0.707108,0.046793,0.070212,-0.005193,
+ -0.450726,0.544834,0.707108,0.04507,0.068959,-0.005193,
+ -0.393967,0.476224,0.78613,0.045143,0.068871,-0.005092,
+ -0.363287,0.500022,0.78613,0.045979,0.06952,-0.005092,
+ -0.450726,0.544834,0.707108,0.04507,0.068959,-0.005193,
+ -0.363287,0.500022,0.78613,0.045979,0.06952,-0.005092,
+ -0.415626,0.57206,0.707108,0.045912,0.069613,-0.005193,
+ -0.484047,0.515458,0.707108,0.04427,0.068254,-0.005193,
+ -0.423092,0.450547,0.78613,0.044348,0.068171,-0.005092,
+ -0.393967,0.476224,0.78613,0.045143,0.068871,-0.005092,
+ -0.484047,0.515458,0.707108,0.04427,0.068254,-0.005193,
+ -0.393967,0.476224,0.78613,0.045143,0.068871,-0.005092,
+ -0.450726,0.544834,0.707108,0.04507,0.068959,-0.005193,
+ -0.515458,0.484047,0.707108,0.043516,0.067501,-0.005193,
+ -0.450547,0.423092,0.78613,0.0436,0.067422,-0.005092,
+ -0.423092,0.450547,0.78613,0.044348,0.068171,-0.005092,
+ -0.515458,0.484047,0.707108,0.043516,0.067501,-0.005193,
+ -0.423092,0.450547,0.78613,0.044348,0.068171,-0.005092,
+ -0.484047,0.515458,0.707108,0.04427,0.068254,-0.005193,
+ -0.544834,0.450726,0.707108,0.042811,0.066701,-0.005193,
+ -0.476224,0.393967,0.78613,0.0429,0.066628,-0.005092,
+ -0.450547,0.423092,0.78613,0.0436,0.067422,-0.005092,
+ -0.544834,0.450726,0.707108,0.042811,0.066701,-0.005193,
+ -0.450547,0.423092,0.78613,0.0436,0.067422,-0.005092,
+ -0.515458,0.484047,0.707108,0.043516,0.067501,-0.005193,
+ -0.57206,0.415626,0.707108,0.042158,0.065859,-0.005193,
+ -0.500022,0.363287,0.78613,0.042251,0.065791,-0.005092,
+ -0.476224,0.393967,0.78613,0.0429,0.066628,-0.005092,
+ -0.57206,0.415626,0.707108,0.042158,0.065859,-0.005193,
+ -0.476224,0.393967,0.78613,0.0429,0.066628,-0.005092,
+ -0.544834,0.450726,0.707108,0.042811,0.066701,-0.005193,
+ -0.597029,0.378886,0.707108,0.041559,0.064977,-0.005193,
+ -0.521846,0.331174,0.78613,0.041656,0.064916,-0.005092,
+ -0.500022,0.363287,0.78613,0.042251,0.065791,-0.005092,
+ -0.597029,0.378886,0.707108,0.041559,0.064977,-0.005193,
+ -0.500022,0.363287,0.78613,0.042251,0.065791,-0.005092,
+ -0.57206,0.415626,0.707108,0.042158,0.065859,-0.005193,
+ -0.619641,0.340651,0.707108,0.041016,0.06406,-0.005193,
+ -0.541611,0.297753,0.78613,0.041117,0.064004,-0.005092,
+ -0.521846,0.331174,0.78613,0.041656,0.064916,-0.005092,
+ -0.619641,0.340651,0.707108,0.041016,0.06406,-0.005193,
+ -0.521846,0.331174,0.78613,0.041656,0.064916,-0.005092,
+ -0.597029,0.378886,0.707108,0.041559,0.064977,-0.005193,
+ -0.639808,0.301071,0.707108,0.040532,0.06311,-0.005193,
+ -0.559239,0.263158,0.78613,0.040636,0.063061,-0.005092,
+ -0.541611,0.297753,0.78613,0.041117,0.064004,-0.005092,
+ -0.639808,0.301071,0.707108,0.040532,0.06311,-0.005193,
+ -0.541611,0.297753,0.78613,0.041117,0.064004,-0.005092,
+ -0.619641,0.340651,0.707108,0.041016,0.06406,-0.005193,
+ -0.65745,0.260303,0.707108,0.040109,0.062132,-0.005193,
+ -0.574659,0.227524,0.78613,0.040215,0.062089,-0.005092,
+ -0.559239,0.263158,0.78613,0.040636,0.063061,-0.005092,
+ -0.65745,0.260303,0.707108,0.040109,0.062132,-0.005193,
+ -0.559239,0.263158,0.78613,0.040636,0.063061,-0.005092,
+ -0.639808,0.301071,0.707108,0.040532,0.06311,-0.005193,
+ -0.672497,0.218508,0.707108,0.039748,0.061129,-0.005193,
+ -0.587811,0.190991,0.78613,0.039857,0.061093,-0.005092,
+ -0.574659,0.227524,0.78613,0.040215,0.062089,-0.005092,
+ -0.672497,0.218508,0.707108,0.039748,0.061129,-0.005193,
+ -0.574659,0.227524,0.78613,0.040215,0.062089,-0.005092,
+ -0.65745,0.260303,0.707108,0.040109,0.062132,-0.005193,
+ -0.684891,0.17585,0.707108,0.03945,0.060105,-0.005193,
+ -0.598644,0.153706,0.78613,0.039562,0.060077,-0.005092,
+ -0.587811,0.190991,0.78613,0.039857,0.061093,-0.005092,
+ -0.684891,0.17585,0.707108,0.03945,0.060105,-0.005193,
+ -0.587811,0.190991,0.78613,0.039857,0.061093,-0.005092,
+ -0.672497,0.218508,0.707108,0.039748,0.061129,-0.005193,
+ -0.694581,0.132498,0.707108,0.039218,0.059065,-0.005193,
+ -0.607114,0.115813,0.78613,0.039331,0.059043,-0.005092,
+ -0.598644,0.153706,0.78613,0.039562,0.060077,-0.005092,
+ -0.694581,0.132498,0.707108,0.039218,0.059065,-0.005193,
+ -0.598644,0.153706,0.78613,0.039562,0.060077,-0.005092,
+ -0.684891,0.17585,0.707108,0.03945,0.060105,-0.005193,
+ -0.70153,0.088624,0.707108,0.039051,0.058012,-0.005193,
+ -0.613188,0.077464,0.78613,0.039165,0.057998,-0.005092,
+ -0.607114,0.115813,0.78613,0.039331,0.059043,-0.005092,
+ -0.70153,0.088624,0.707108,0.039051,0.058012,-0.005193,
+ -0.607114,0.115813,0.78613,0.039331,0.059043,-0.005092,
+ -0.694581,0.132498,0.707108,0.039218,0.059065,-0.005193,
+ -0.70571,0.0444,0.707108,0.038951,0.056951,-0.005193,
+ -0.616842,0.038808,0.78613,0.039065,0.056943,-0.005092,
+ -0.613188,0.077464,0.78613,0.039165,0.057998,-0.005092,
+ -0.70571,0.0444,0.707108,0.038951,0.056951,-0.005193,
+ -0.613188,0.077464,0.78613,0.039165,0.057998,-0.005092,
+ -0.70153,0.088624,0.707108,0.039051,0.058012,-0.005193,
+ -0.616842,0.038808,0.78613,0.039065,0.056943,-0.005092,
+ -0.519231,0.032667,0.85401,0.039191,0.056936,-0.005004,
+ -0.516155,0.065205,0.85401,0.03929,0.057982,-0.005004,
+ -0.616842,0.038808,0.78613,0.039065,0.056943,-0.005092,
+ -0.516155,0.065205,0.85401,0.03929,0.057982,-0.005004,
+ -0.613188,0.077464,0.78613,0.039165,0.057998,-0.005092,
+ -0.618061,0,0.78613,0.039032,0.055885,-0.005092,
+ -0.520257,0,0.85401,0.039158,0.055885,-0.005004,
+ -0.519231,0.032667,0.85401,0.039191,0.056936,-0.005004,
+ -0.618061,0,0.78613,0.039032,0.055885,-0.005092,
+ -0.519231,0.032667,0.85401,0.039191,0.056936,-0.005004,
+ -0.616842,0.038808,0.78613,0.039065,0.056943,-0.005092,
+ -0.616842,-0.038808,0.78613,0.039065,0.054827,-0.005092,
+ -0.519231,-0.032667,0.85401,0.039191,0.054835,-0.005004,
+ -0.520257,0,0.85401,0.039158,0.055885,-0.005004,
+ -0.616842,-0.038808,0.78613,0.039065,0.054827,-0.005092,
+ -0.520257,0,0.85401,0.039158,0.055885,-0.005004,
+ -0.618061,0,0.78613,0.039032,0.055885,-0.005092,
+ -0.613188,-0.077464,0.78613,0.039165,0.053773,-0.005092,
+ -0.516155,-0.065205,0.85401,0.03929,0.053789,-0.005004,
+ -0.519231,-0.032667,0.85401,0.039191,0.054835,-0.005004,
+ -0.613188,-0.077464,0.78613,0.039165,0.053773,-0.005092,
+ -0.519231,-0.032667,0.85401,0.039191,0.054835,-0.005004,
+ -0.616842,-0.038808,0.78613,0.039065,0.054827,-0.005092,
+ -0.607114,-0.115813,0.78613,0.039331,0.052727,-0.005092,
+ -0.511042,-0.097487,0.85401,0.039454,0.052751,-0.005004,
+ -0.516155,-0.065205,0.85401,0.03929,0.053789,-0.005004,
+ -0.607114,-0.115813,0.78613,0.039331,0.052727,-0.005092,
+ -0.516155,-0.065205,0.85401,0.03929,0.053789,-0.005004,
+ -0.613188,-0.077464,0.78613,0.039165,0.053773,-0.005092,
+ -0.598644,-0.153706,0.78613,0.039562,0.051694,-0.005092,
+ -0.503912,-0.129383,0.85401,0.039684,0.051725,-0.005004,
+ -0.511042,-0.097487,0.85401,0.039454,0.052751,-0.005004,
+ -0.598644,-0.153706,0.78613,0.039562,0.051694,-0.005092,
+ -0.511042,-0.097487,0.85401,0.039454,0.052751,-0.005004,
+ -0.607114,-0.115813,0.78613,0.039331,0.052727,-0.005092,
+ -0.587811,-0.190991,0.78613,0.039857,0.050677,-0.005092,
+ -0.494794,-0.160768,0.85401,0.039977,0.050716,-0.005004,
+ -0.503912,-0.129383,0.85401,0.039684,0.051725,-0.005004,
+ -0.587811,-0.190991,0.78613,0.039857,0.050677,-0.005092,
+ -0.503912,-0.129383,0.85401,0.039684,0.051725,-0.005004,
+ -0.598644,-0.153706,0.78613,0.039562,0.051694,-0.005092,
+ -0.574659,-0.227524,0.78613,0.040215,0.049681,-0.005092,
+ -0.483723,-0.191519,0.85401,0.040333,0.049728,-0.005004,
+ -0.494794,-0.160768,0.85401,0.039977,0.050716,-0.005004,
+ -0.574659,-0.227524,0.78613,0.040215,0.049681,-0.005092,
+ -0.494794,-0.160768,0.85401,0.039977,0.050716,-0.005004,
+ -0.587811,-0.190991,0.78613,0.039857,0.050677,-0.005092,
+ -0.559239,-0.263158,0.78613,0.040636,0.048709,-0.005092,
+ -0.470743,-0.221515,0.85401,0.04075,0.048763,-0.005004,
+ -0.483723,-0.191519,0.85401,0.040333,0.049728,-0.005004,
+ -0.559239,-0.263158,0.78613,0.040636,0.048709,-0.005092,
+ -0.483723,-0.191519,0.85401,0.040333,0.049728,-0.005004,
+ -0.574659,-0.227524,0.78613,0.040215,0.049681,-0.005092,
+ -0.541611,-0.297753,0.78613,0.041117,0.047766,-0.005092,
+ -0.455905,-0.250636,0.85401,0.041227,0.047827,-0.005004,
+ -0.470743,-0.221515,0.85401,0.04075,0.048763,-0.005004,
+ -0.541611,-0.297753,0.78613,0.041117,0.047766,-0.005092,
+ -0.470743,-0.221515,0.85401,0.04075,0.048763,-0.005004,
+ -0.559239,-0.263158,0.78613,0.040636,0.048709,-0.005092,
+ -0.521846,-0.331174,0.78613,0.041656,0.046855,-0.005092,
+ -0.439268,-0.278768,0.85401,0.041762,0.046922,-0.005004,
+ -0.455905,-0.250636,0.85401,0.041227,0.047827,-0.005004,
+ -0.521846,-0.331174,0.78613,0.041656,0.046855,-0.005092,
+ -0.455905,-0.250636,0.85401,0.041227,0.047827,-0.005004,
+ -0.541611,-0.297753,0.78613,0.041117,0.047766,-0.005092,
+ -0.500022,-0.363287,0.78613,0.042251,0.045979,-0.005092,
+ -0.420897,-0.3058,0.85401,0.042353,0.046053,-0.005004,
+ -0.439268,-0.278768,0.85401,0.041762,0.046922,-0.005004,
+ -0.500022,-0.363287,0.78613,0.042251,0.045979,-0.005092,
+ -0.439268,-0.278768,0.85401,0.041762,0.046922,-0.005004,
+ -0.521846,-0.331174,0.78613,0.041656,0.046855,-0.005092,
+ -0.476224,-0.393967,0.78613,0.0429,0.045143,-0.005092,
+ -0.400865,-0.331624,0.85401,0.042997,0.045223,-0.005004,
+ -0.420897,-0.3058,0.85401,0.042353,0.046053,-0.005004,
+ -0.476224,-0.393967,0.78613,0.0429,0.045143,-0.005092,
+ -0.420897,-0.3058,0.85401,0.042353,0.046053,-0.005004,
+ -0.500022,-0.363287,0.78613,0.042251,0.045979,-0.005092,
+ -0.450547,-0.423092,0.78613,0.0436,0.044348,-0.005092,
+ -0.379251,-0.356141,0.85401,0.043692,0.044435,-0.005004,
+ -0.400865,-0.331624,0.85401,0.042997,0.045223,-0.005004,
+ -0.450547,-0.423092,0.78613,0.0436,0.044348,-0.005092,
+ -0.400865,-0.331624,0.85401,0.042997,0.045223,-0.005004,
+ -0.476224,-0.393967,0.78613,0.0429,0.045143,-0.005092,
+ -0.423092,-0.450547,0.78613,0.044348,0.0436,-0.005092,
+ -0.356141,-0.379251,0.85401,0.044435,0.043692,-0.005004,
+ -0.379251,-0.356141,0.85401,0.043692,0.044435,-0.005004,
+ -0.423092,-0.450547,0.78613,0.044348,0.0436,-0.005092,
+ -0.379251,-0.356141,0.85401,0.043692,0.044435,-0.005004,
+ -0.450547,-0.423092,0.78613,0.0436,0.044348,-0.005092,
+ -0.393967,-0.476224,0.78613,0.045143,0.0429,-0.005092,
+ -0.331624,-0.400865,0.85401,0.045223,0.042997,-0.005004,
+ -0.356141,-0.379251,0.85401,0.044435,0.043692,-0.005004,
+ -0.393967,-0.476224,0.78613,0.045143,0.0429,-0.005092,
+ -0.356141,-0.379251,0.85401,0.044435,0.043692,-0.005004,
+ -0.423092,-0.450547,0.78613,0.044348,0.0436,-0.005092,
+ -0.363287,-0.500022,0.78613,0.045979,0.042251,-0.005092,
+ -0.3058,-0.420897,0.85401,0.046053,0.042353,-0.005004,
+ -0.331624,-0.400865,0.85401,0.045223,0.042997,-0.005004,
+ -0.363287,-0.500022,0.78613,0.045979,0.042251,-0.005092,
+ -0.331624,-0.400865,0.85401,0.045223,0.042997,-0.005004,
+ -0.393967,-0.476224,0.78613,0.045143,0.0429,-0.005092,
+ -0.331174,-0.521846,0.78613,0.046855,0.041656,-0.005092,
+ -0.278768,-0.439268,0.85401,0.046922,0.041762,-0.005004,
+ -0.3058,-0.420897,0.85401,0.046053,0.042353,-0.005004,
+ -0.331174,-0.521846,0.78613,0.046855,0.041656,-0.005092,
+ -0.3058,-0.420897,0.85401,0.046053,0.042353,-0.005004,
+ -0.363287,-0.500022,0.78613,0.045979,0.042251,-0.005092,
+ -0.297753,-0.541611,0.78613,0.047766,0.041117,-0.005092,
+ -0.250636,-0.455905,0.85401,0.047827,0.041227,-0.005004,
+ -0.278768,-0.439268,0.85401,0.046922,0.041762,-0.005004,
+ -0.297753,-0.541611,0.78613,0.047766,0.041117,-0.005092,
+ -0.278768,-0.439268,0.85401,0.046922,0.041762,-0.005004,
+ -0.331174,-0.521846,0.78613,0.046855,0.041656,-0.005092,
+ -0.263158,-0.559239,0.78613,0.048709,0.040636,-0.005092,
+ -0.221515,-0.470743,0.85401,0.048763,0.04075,-0.005004,
+ -0.250636,-0.455905,0.85401,0.047827,0.041227,-0.005004,
+ -0.263158,-0.559239,0.78613,0.048709,0.040636,-0.005092,
+ -0.250636,-0.455905,0.85401,0.047827,0.041227,-0.005004,
+ -0.297753,-0.541611,0.78613,0.047766,0.041117,-0.005092,
+ -0.227524,-0.574659,0.78613,0.049681,0.040215,-0.005092,
+ -0.191519,-0.483723,0.85401,0.049728,0.040333,-0.005004,
+ -0.221515,-0.470743,0.85401,0.048763,0.04075,-0.005004,
+ -0.227524,-0.574659,0.78613,0.049681,0.040215,-0.005092,
+ -0.221515,-0.470743,0.85401,0.048763,0.04075,-0.005004,
+ -0.263158,-0.559239,0.78613,0.048709,0.040636,-0.005092,
+ -0.190991,-0.587811,0.78613,0.050677,0.039857,-0.005092,
+ -0.160768,-0.494794,0.85401,0.050716,0.039977,-0.005004,
+ -0.191519,-0.483723,0.85401,0.049728,0.040333,-0.005004,
+ -0.190991,-0.587811,0.78613,0.050677,0.039857,-0.005092,
+ -0.191519,-0.483723,0.85401,0.049728,0.040333,-0.005004,
+ -0.227524,-0.574659,0.78613,0.049681,0.040215,-0.005092,
+ -0.153706,-0.598644,0.78613,0.051694,0.039562,-0.005092,
+ -0.129383,-0.503912,0.85401,0.051725,0.039684,-0.005004,
+ -0.160768,-0.494794,0.85401,0.050716,0.039977,-0.005004,
+ -0.153706,-0.598644,0.78613,0.051694,0.039562,-0.005092,
+ -0.160768,-0.494794,0.85401,0.050716,0.039977,-0.005004,
+ -0.190991,-0.587811,0.78613,0.050677,0.039857,-0.005092,
+ -0.115813,-0.607114,0.78613,0.052727,0.039331,-0.005092,
+ -0.097487,-0.511042,0.85401,0.052751,0.039454,-0.005004,
+ -0.129383,-0.503912,0.85401,0.051725,0.039684,-0.005004,
+ -0.115813,-0.607114,0.78613,0.052727,0.039331,-0.005092,
+ -0.129383,-0.503912,0.85401,0.051725,0.039684,-0.005004,
+ -0.153706,-0.598644,0.78613,0.051694,0.039562,-0.005092,
+ -0.077464,-0.613188,0.78613,0.053773,0.039165,-0.005092,
+ -0.065205,-0.516155,0.85401,0.053789,0.03929,-0.005004,
+ -0.097487,-0.511042,0.85401,0.052751,0.039454,-0.005004,
+ -0.077464,-0.613188,0.78613,0.053773,0.039165,-0.005092,
+ -0.097487,-0.511042,0.85401,0.052751,0.039454,-0.005004,
+ -0.115813,-0.607114,0.78613,0.052727,0.039331,-0.005092,
+ -0.038808,-0.616842,0.78613,0.054827,0.039065,-0.005092,
+ -0.032667,-0.519231,0.85401,0.054835,0.039191,-0.005004,
+ -0.065205,-0.516155,0.85401,0.053789,0.03929,-0.005004,
+ -0.038808,-0.616842,0.78613,0.054827,0.039065,-0.005092,
+ -0.065205,-0.516155,0.85401,0.053789,0.03929,-0.005004,
+ -0.077464,-0.613188,0.78613,0.053773,0.039165,-0.005092,
+ 0,-0.618061,0.78613,0.055885,0.039032,-0.005092,
+ 0,-0.520257,0.85401,0.055885,0.039158,-0.005004,
+ -0.032667,-0.519231,0.85401,0.054835,0.039191,-0.005004,
+ 0,-0.618061,0.78613,0.055885,0.039032,-0.005092,
+ -0.032667,-0.519231,0.85401,0.054835,0.039191,-0.005004,
+ -0.038808,-0.616842,0.78613,0.054827,0.039065,-0.005092,
+ 0.038808,-0.616842,0.78613,0.056943,0.039065,-0.005092,
+ 0.032667,-0.519231,0.85401,0.056936,0.039191,-0.005004,
+ 0,-0.520257,0.85401,0.055885,0.039158,-0.005004,
+ 0.038808,-0.616842,0.78613,0.056943,0.039065,-0.005092,
+ 0,-0.520257,0.85401,0.055885,0.039158,-0.005004,
+ 0,-0.618061,0.78613,0.055885,0.039032,-0.005092,
+ 0.077464,-0.613188,0.78613,0.057998,0.039165,-0.005092,
+ 0.065205,-0.516155,0.85401,0.057982,0.03929,-0.005004,
+ 0.032667,-0.519231,0.85401,0.056936,0.039191,-0.005004,
+ 0.077464,-0.613188,0.78613,0.057998,0.039165,-0.005092,
+ 0.032667,-0.519231,0.85401,0.056936,0.039191,-0.005004,
+ 0.038808,-0.616842,0.78613,0.056943,0.039065,-0.005092,
+ 0.115813,-0.607114,0.78613,0.059043,0.039331,-0.005092,
+ 0.097487,-0.511042,0.85401,0.05902,0.039454,-0.005004,
+ 0.065205,-0.516155,0.85401,0.057982,0.03929,-0.005004,
+ 0.115813,-0.607114,0.78613,0.059043,0.039331,-0.005092,
+ 0.065205,-0.516155,0.85401,0.057982,0.03929,-0.005004,
+ 0.077464,-0.613188,0.78613,0.057998,0.039165,-0.005092,
+ 0.153706,-0.598644,0.78613,0.060077,0.039562,-0.005092,
+ 0.129383,-0.503912,0.85401,0.060045,0.039684,-0.005004,
+ 0.097487,-0.511042,0.85401,0.05902,0.039454,-0.005004,
+ 0.153706,-0.598644,0.78613,0.060077,0.039562,-0.005092,
+ 0.097487,-0.511042,0.85401,0.05902,0.039454,-0.005004,
+ 0.115813,-0.607114,0.78613,0.059043,0.039331,-0.005092,
+ 0.190991,-0.587811,0.78613,0.061093,0.039857,-0.005092,
+ 0.160768,-0.494794,0.85401,0.061054,0.039977,-0.005004,
+ 0.129383,-0.503912,0.85401,0.060045,0.039684,-0.005004,
+ 0.190991,-0.587811,0.78613,0.061093,0.039857,-0.005092,
+ 0.129383,-0.503912,0.85401,0.060045,0.039684,-0.005004,
+ 0.153706,-0.598644,0.78613,0.060077,0.039562,-0.005092,
+ 0.227524,-0.574659,0.78613,0.062089,0.040215,-0.005092,
+ 0.191519,-0.483723,0.85401,0.062043,0.040333,-0.005004,
+ 0.160768,-0.494794,0.85401,0.061054,0.039977,-0.005004,
+ 0.227524,-0.574659,0.78613,0.062089,0.040215,-0.005092,
+ 0.160768,-0.494794,0.85401,0.061054,0.039977,-0.005004,
+ 0.190991,-0.587811,0.78613,0.061093,0.039857,-0.005092,
+ 0.263158,-0.559239,0.78613,0.063061,0.040636,-0.005092,
+ 0.221515,-0.470743,0.85401,0.063007,0.04075,-0.005004,
+ 0.191519,-0.483723,0.85401,0.062043,0.040333,-0.005004,
+ 0.263158,-0.559239,0.78613,0.063061,0.040636,-0.005092,
+ 0.191519,-0.483723,0.85401,0.062043,0.040333,-0.005004,
+ 0.227524,-0.574659,0.78613,0.062089,0.040215,-0.005092,
+ 0.297753,-0.541611,0.78613,0.064004,0.041117,-0.005092,
+ 0.250636,-0.455905,0.85401,0.063944,0.041227,-0.005004,
+ 0.221515,-0.470743,0.85401,0.063007,0.04075,-0.005004,
+ 0.297753,-0.541611,0.78613,0.064004,0.041117,-0.005092,
+ 0.221515,-0.470743,0.85401,0.063007,0.04075,-0.005004,
+ 0.263158,-0.559239,0.78613,0.063061,0.040636,-0.005092,
+ 0.331174,-0.521846,0.78613,0.064916,0.041656,-0.005092,
+ 0.278768,-0.439268,0.85401,0.064848,0.041762,-0.005004,
+ 0.250636,-0.455905,0.85401,0.063944,0.041227,-0.005004,
+ 0.331174,-0.521846,0.78613,0.064916,0.041656,-0.005092,
+ 0.250636,-0.455905,0.85401,0.063944,0.041227,-0.005004,
+ 0.297753,-0.541611,0.78613,0.064004,0.041117,-0.005092,
+ 0.363287,-0.500022,0.78613,0.065791,0.042251,-0.005092,
+ 0.3058,-0.420897,0.85401,0.065717,0.042353,-0.005004,
+ 0.278768,-0.439268,0.85401,0.064848,0.041762,-0.005004,
+ 0.363287,-0.500022,0.78613,0.065791,0.042251,-0.005092,
+ 0.278768,-0.439268,0.85401,0.064848,0.041762,-0.005004,
+ 0.331174,-0.521846,0.78613,0.064916,0.041656,-0.005092,
+ 0.393967,-0.476224,0.78613,0.066628,0.0429,-0.005092,
+ 0.331624,-0.400865,0.85401,0.066548,0.042997,-0.005004,
+ 0.3058,-0.420897,0.85401,0.065717,0.042353,-0.005004,
+ 0.393967,-0.476224,0.78613,0.066628,0.0429,-0.005092,
+ 0.3058,-0.420897,0.85401,0.065717,0.042353,-0.005004,
+ 0.363287,-0.500022,0.78613,0.065791,0.042251,-0.005092,
+ 0.423092,-0.450547,0.78613,0.067422,0.0436,-0.005092,
+ 0.356141,-0.379251,0.85401,0.067336,0.043692,-0.005004,
+ 0.331624,-0.400865,0.85401,0.066548,0.042997,-0.005004,
+ 0.423092,-0.450547,0.78613,0.067422,0.0436,-0.005092,
+ 0.331624,-0.400865,0.85401,0.066548,0.042997,-0.005004,
+ 0.393967,-0.476224,0.78613,0.066628,0.0429,-0.005092,
+ 0.450547,-0.423092,0.78613,0.068171,0.044348,-0.005092,
+ 0.379251,-0.356141,0.85401,0.068079,0.044435,-0.005004,
+ 0.356141,-0.379251,0.85401,0.067336,0.043692,-0.005004,
+ 0.450547,-0.423092,0.78613,0.068171,0.044348,-0.005092,
+ 0.356141,-0.379251,0.85401,0.067336,0.043692,-0.005004,
+ 0.423092,-0.450547,0.78613,0.067422,0.0436,-0.005092,
+ 0.476224,-0.393967,0.78613,0.068871,0.045143,-0.005092,
+ 0.400865,-0.331624,0.85401,0.068774,0.045223,-0.005004,
+ 0.379251,-0.356141,0.85401,0.068079,0.044435,-0.005004,
+ 0.476224,-0.393967,0.78613,0.068871,0.045143,-0.005092,
+ 0.379251,-0.356141,0.85401,0.068079,0.044435,-0.005004,
+ 0.450547,-0.423092,0.78613,0.068171,0.044348,-0.005092,
+ 0.500022,-0.363287,0.78613,0.06952,0.045979,-0.005092,
+ 0.420897,-0.3058,0.85401,0.069418,0.046053,-0.005004,
+ 0.400865,-0.331624,0.85401,0.068774,0.045223,-0.005004,
+ 0.500022,-0.363287,0.78613,0.06952,0.045979,-0.005092,
+ 0.400865,-0.331624,0.85401,0.068774,0.045223,-0.005004,
+ 0.476224,-0.393967,0.78613,0.068871,0.045143,-0.005092,
+ 0.521846,-0.331174,0.78613,0.070115,0.046855,-0.005092,
+ 0.439268,-0.278768,0.85401,0.070009,0.046922,-0.005004,
+ 0.420897,-0.3058,0.85401,0.069418,0.046053,-0.005004,
+ 0.521846,-0.331174,0.78613,0.070115,0.046855,-0.005092,
+ 0.420897,-0.3058,0.85401,0.069418,0.046053,-0.005004,
+ 0.500022,-0.363287,0.78613,0.06952,0.045979,-0.005092,
+ 0.541611,-0.297753,0.78613,0.070654,0.047766,-0.005092,
+ 0.455905,-0.250636,0.85401,0.070543,0.047827,-0.005004,
+ 0.439268,-0.278768,0.85401,0.070009,0.046922,-0.005004,
+ 0.541611,-0.297753,0.78613,0.070654,0.047766,-0.005092,
+ 0.439268,-0.278768,0.85401,0.070009,0.046922,-0.005004,
+ 0.521846,-0.331174,0.78613,0.070115,0.046855,-0.005092,
+ 0.559239,-0.263158,0.78613,0.071135,0.048709,-0.005092,
+ 0.470743,-0.221515,0.85401,0.071021,0.048763,-0.005004,
+ 0.455905,-0.250636,0.85401,0.070543,0.047827,-0.005004,
+ 0.559239,-0.263158,0.78613,0.071135,0.048709,-0.005092,
+ 0.455905,-0.250636,0.85401,0.070543,0.047827,-0.005004,
+ 0.541611,-0.297753,0.78613,0.070654,0.047766,-0.005092,
+ 0.574659,-0.227524,0.78613,0.071555,0.049681,-0.005092,
+ 0.483723,-0.191519,0.85401,0.071438,0.049728,-0.005004,
+ 0.470743,-0.221515,0.85401,0.071021,0.048763,-0.005004,
+ 0.574659,-0.227524,0.78613,0.071555,0.049681,-0.005092,
+ 0.470743,-0.221515,0.85401,0.071021,0.048763,-0.005004,
+ 0.559239,-0.263158,0.78613,0.071135,0.048709,-0.005092,
+ 0.587811,-0.190991,0.78613,0.071914,0.050677,-0.005092,
+ 0.494794,-0.160768,0.85401,0.071794,0.050716,-0.005004,
+ 0.483723,-0.191519,0.85401,0.071438,0.049728,-0.005004,
+ 0.587811,-0.190991,0.78613,0.071914,0.050677,-0.005092,
+ 0.483723,-0.191519,0.85401,0.071438,0.049728,-0.005004,
+ 0.574659,-0.227524,0.78613,0.071555,0.049681,-0.005092,
+ 0.598644,-0.153706,0.78613,0.072209,0.051694,-0.005092,
+ 0.503912,-0.129383,0.85401,0.072087,0.051725,-0.005004,
+ 0.494794,-0.160768,0.85401,0.071794,0.050716,-0.005004,
+ 0.598644,-0.153706,0.78613,0.072209,0.051694,-0.005092,
+ 0.494794,-0.160768,0.85401,0.071794,0.050716,-0.005004,
+ 0.587811,-0.190991,0.78613,0.071914,0.050677,-0.005092,
+ 0.607114,-0.115813,0.78613,0.07244,0.052727,-0.005092,
+ 0.511042,-0.097487,0.85401,0.072316,0.052751,-0.005004,
+ 0.503912,-0.129383,0.85401,0.072087,0.051725,-0.005004,
+ 0.607114,-0.115813,0.78613,0.07244,0.052727,-0.005092,
+ 0.503912,-0.129383,0.85401,0.072087,0.051725,-0.005004,
+ 0.598644,-0.153706,0.78613,0.072209,0.051694,-0.005092,
+ 0.613188,-0.077464,0.78613,0.072606,0.053773,-0.005092,
+ 0.516155,-0.065205,0.85401,0.072481,0.053789,-0.005004,
+ 0.511042,-0.097487,0.85401,0.072316,0.052751,-0.005004,
+ 0.613188,-0.077464,0.78613,0.072606,0.053773,-0.005092,
+ 0.511042,-0.097487,0.85401,0.072316,0.052751,-0.005004,
+ 0.607114,-0.115813,0.78613,0.07244,0.052727,-0.005092,
+ 0.616842,-0.038808,0.78613,0.072705,0.054827,-0.005092,
+ 0.519231,-0.032667,0.85401,0.07258,0.054835,-0.005004,
+ 0.516155,-0.065205,0.85401,0.072481,0.053789,-0.005004,
+ 0.616842,-0.038808,0.78613,0.072705,0.054827,-0.005092,
+ 0.516155,-0.065205,0.85401,0.072481,0.053789,-0.005004,
+ 0.613188,-0.077464,0.78613,0.072606,0.053773,-0.005092,
+ 0.618061,0,0.78613,0.072739,0.055885,-0.005092,
+ 0.520257,0,0.85401,0.072613,0.055885,-0.005004,
+ 0.519231,-0.032667,0.85401,0.07258,0.054835,-0.005004,
+ 0.618061,0,0.78613,0.072739,0.055885,-0.005092,
+ 0.519231,-0.032667,0.85401,0.07258,0.054835,-0.005004,
+ 0.616842,-0.038808,0.78613,0.072705,0.054827,-0.005092,
+ 0.616842,0.038808,0.78613,0.072705,0.056943,-0.005092,
+ 0.519231,0.032667,0.85401,0.07258,0.056936,-0.005004,
+ 0.520257,0,0.85401,0.072613,0.055885,-0.005004,
+ 0.616842,0.038808,0.78613,0.072705,0.056943,-0.005092,
+ 0.520257,0,0.85401,0.072613,0.055885,-0.005004,
+ 0.618061,0,0.78613,0.072739,0.055885,-0.005092,
+ 0.613188,0.077464,0.78613,0.072606,0.057998,-0.005092,
+ 0.516155,0.065205,0.85401,0.072481,0.057982,-0.005004,
+ 0.519231,0.032667,0.85401,0.07258,0.056936,-0.005004,
+ 0.613188,0.077464,0.78613,0.072606,0.057998,-0.005092,
+ 0.519231,0.032667,0.85401,0.07258,0.056936,-0.005004,
+ 0.616842,0.038808,0.78613,0.072705,0.056943,-0.005092,
+ 0.607114,0.115813,0.78613,0.07244,0.059043,-0.005092,
+ 0.511042,0.097487,0.85401,0.072316,0.05902,-0.005004,
+ 0.516155,0.065205,0.85401,0.072481,0.057982,-0.005004,
+ 0.607114,0.115813,0.78613,0.07244,0.059043,-0.005092,
+ 0.516155,0.065205,0.85401,0.072481,0.057982,-0.005004,
+ 0.613188,0.077464,0.78613,0.072606,0.057998,-0.005092,
+ 0.598644,0.153706,0.78613,0.072209,0.060077,-0.005092,
+ 0.503912,0.129383,0.85401,0.072087,0.060045,-0.005004,
+ 0.511042,0.097487,0.85401,0.072316,0.05902,-0.005004,
+ 0.598644,0.153706,0.78613,0.072209,0.060077,-0.005092,
+ 0.511042,0.097487,0.85401,0.072316,0.05902,-0.005004,
+ 0.607114,0.115813,0.78613,0.07244,0.059043,-0.005092,
+ 0.587811,0.190991,0.78613,0.071914,0.061093,-0.005092,
+ 0.494794,0.160768,0.85401,0.071794,0.061054,-0.005004,
+ 0.503912,0.129383,0.85401,0.072087,0.060045,-0.005004,
+ 0.587811,0.190991,0.78613,0.071914,0.061093,-0.005092,
+ 0.503912,0.129383,0.85401,0.072087,0.060045,-0.005004,
+ 0.598644,0.153706,0.78613,0.072209,0.060077,-0.005092,
+ 0.574659,0.227524,0.78613,0.071555,0.062089,-0.005092,
+ 0.483723,0.191519,0.85401,0.071438,0.062043,-0.005004,
+ 0.494794,0.160768,0.85401,0.071794,0.061054,-0.005004,
+ 0.574659,0.227524,0.78613,0.071555,0.062089,-0.005092,
+ 0.494794,0.160768,0.85401,0.071794,0.061054,-0.005004,
+ 0.587811,0.190991,0.78613,0.071914,0.061093,-0.005092,
+ 0.559239,0.263158,0.78613,0.071135,0.063061,-0.005092,
+ 0.470743,0.221515,0.85401,0.071021,0.063007,-0.005004,
+ 0.483723,0.191519,0.85401,0.071438,0.062043,-0.005004,
+ 0.559239,0.263158,0.78613,0.071135,0.063061,-0.005092,
+ 0.483723,0.191519,0.85401,0.071438,0.062043,-0.005004,
+ 0.574659,0.227524,0.78613,0.071555,0.062089,-0.005092,
+ 0.541611,0.297753,0.78613,0.070654,0.064004,-0.005092,
+ 0.455905,0.250636,0.85401,0.070543,0.063944,-0.005004,
+ 0.470743,0.221515,0.85401,0.071021,0.063007,-0.005004,
+ 0.541611,0.297753,0.78613,0.070654,0.064004,-0.005092,
+ 0.470743,0.221515,0.85401,0.071021,0.063007,-0.005004,
+ 0.559239,0.263158,0.78613,0.071135,0.063061,-0.005092,
+ 0.521846,0.331174,0.78613,0.070115,0.064916,-0.005092,
+ 0.439268,0.278768,0.85401,0.070009,0.064848,-0.005004,
+ 0.455905,0.250636,0.85401,0.070543,0.063944,-0.005004,
+ 0.521846,0.331174,0.78613,0.070115,0.064916,-0.005092,
+ 0.455905,0.250636,0.85401,0.070543,0.063944,-0.005004,
+ 0.541611,0.297753,0.78613,0.070654,0.064004,-0.005092,
+ 0.500022,0.363287,0.78613,0.06952,0.065791,-0.005092,
+ 0.420897,0.3058,0.85401,0.069418,0.065717,-0.005004,
+ 0.439268,0.278768,0.85401,0.070009,0.064848,-0.005004,
+ 0.500022,0.363287,0.78613,0.06952,0.065791,-0.005092,
+ 0.439268,0.278768,0.85401,0.070009,0.064848,-0.005004,
+ 0.521846,0.331174,0.78613,0.070115,0.064916,-0.005092,
+ 0.476224,0.393967,0.78613,0.068871,0.066628,-0.005092,
+ 0.400865,0.331624,0.85401,0.068774,0.066548,-0.005004,
+ 0.420897,0.3058,0.85401,0.069418,0.065717,-0.005004,
+ 0.476224,0.393967,0.78613,0.068871,0.066628,-0.005092,
+ 0.420897,0.3058,0.85401,0.069418,0.065717,-0.005004,
+ 0.500022,0.363287,0.78613,0.06952,0.065791,-0.005092,
+ 0.450547,0.423092,0.78613,0.068171,0.067422,-0.005092,
+ 0.379251,0.356141,0.85401,0.068079,0.067336,-0.005004,
+ 0.400865,0.331624,0.85401,0.068774,0.066548,-0.005004,
+ 0.450547,0.423092,0.78613,0.068171,0.067422,-0.005092,
+ 0.400865,0.331624,0.85401,0.068774,0.066548,-0.005004,
+ 0.476224,0.393967,0.78613,0.068871,0.066628,-0.005092,
+ 0.423092,0.450547,0.78613,0.067422,0.068171,-0.005092,
+ 0.356141,0.379251,0.85401,0.067336,0.068079,-0.005004,
+ 0.379251,0.356141,0.85401,0.068079,0.067336,-0.005004,
+ 0.423092,0.450547,0.78613,0.067422,0.068171,-0.005092,
+ 0.379251,0.356141,0.85401,0.068079,0.067336,-0.005004,
+ 0.450547,0.423092,0.78613,0.068171,0.067422,-0.005092,
+ 0.393967,0.476224,0.78613,0.066628,0.068871,-0.005092,
+ 0.331624,0.400865,0.85401,0.066548,0.068774,-0.005004,
+ 0.356141,0.379251,0.85401,0.067336,0.068079,-0.005004,
+ 0.393967,0.476224,0.78613,0.066628,0.068871,-0.005092,
+ 0.356141,0.379251,0.85401,0.067336,0.068079,-0.005004,
+ 0.423092,0.450547,0.78613,0.067422,0.068171,-0.005092,
+ 0.363287,0.500022,0.78613,0.065791,0.06952,-0.005092,
+ 0.3058,0.420897,0.85401,0.065717,0.069418,-0.005004,
+ 0.331624,0.400865,0.85401,0.066548,0.068774,-0.005004,
+ 0.363287,0.500022,0.78613,0.065791,0.06952,-0.005092,
+ 0.331624,0.400865,0.85401,0.066548,0.068774,-0.005004,
+ 0.393967,0.476224,0.78613,0.066628,0.068871,-0.005092,
+ 0.331174,0.521846,0.78613,0.064916,0.070115,-0.005092,
+ 0.278768,0.439268,0.85401,0.064848,0.070009,-0.005004,
+ 0.3058,0.420897,0.85401,0.065717,0.069418,-0.005004,
+ 0.331174,0.521846,0.78613,0.064916,0.070115,-0.005092,
+ 0.3058,0.420897,0.85401,0.065717,0.069418,-0.005004,
+ 0.363287,0.500022,0.78613,0.065791,0.06952,-0.005092,
+ 0.297753,0.541611,0.78613,0.064004,0.070654,-0.005092,
+ 0.250636,0.455905,0.85401,0.063944,0.070543,-0.005004,
+ 0.278768,0.439268,0.85401,0.064848,0.070009,-0.005004,
+ 0.297753,0.541611,0.78613,0.064004,0.070654,-0.005092,
+ 0.278768,0.439268,0.85401,0.064848,0.070009,-0.005004,
+ 0.331174,0.521846,0.78613,0.064916,0.070115,-0.005092,
+ 0.263158,0.559239,0.78613,0.063061,0.071135,-0.005092,
+ 0.221515,0.470743,0.85401,0.063007,0.071021,-0.005004,
+ 0.250636,0.455905,0.85401,0.063944,0.070543,-0.005004,
+ 0.263158,0.559239,0.78613,0.063061,0.071135,-0.005092,
+ 0.250636,0.455905,0.85401,0.063944,0.070543,-0.005004,
+ 0.297753,0.541611,0.78613,0.064004,0.070654,-0.005092,
+ 0.227524,0.574659,0.78613,0.062089,0.071555,-0.005092,
+ 0.191519,0.483723,0.85401,0.062043,0.071438,-0.005004,
+ 0.221515,0.470743,0.85401,0.063007,0.071021,-0.005004,
+ 0.227524,0.574659,0.78613,0.062089,0.071555,-0.005092,
+ 0.221515,0.470743,0.85401,0.063007,0.071021,-0.005004,
+ 0.263158,0.559239,0.78613,0.063061,0.071135,-0.005092,
+ 0.190991,0.587811,0.78613,0.061093,0.071914,-0.005092,
+ 0.160768,0.494794,0.85401,0.061054,0.071794,-0.005004,
+ 0.191519,0.483723,0.85401,0.062043,0.071438,-0.005004,
+ 0.190991,0.587811,0.78613,0.061093,0.071914,-0.005092,
+ 0.191519,0.483723,0.85401,0.062043,0.071438,-0.005004,
+ 0.227524,0.574659,0.78613,0.062089,0.071555,-0.005092,
+ 0.153706,0.598644,0.78613,0.060077,0.072209,-0.005092,
+ 0.129383,0.503912,0.85401,0.060045,0.072087,-0.005004,
+ 0.160768,0.494794,0.85401,0.061054,0.071794,-0.005004,
+ 0.153706,0.598644,0.78613,0.060077,0.072209,-0.005092,
+ 0.160768,0.494794,0.85401,0.061054,0.071794,-0.005004,
+ 0.190991,0.587811,0.78613,0.061093,0.071914,-0.005092,
+ 0.115813,0.607114,0.78613,0.059043,0.07244,-0.005092,
+ 0.097487,0.511042,0.85401,0.05902,0.072316,-0.005004,
+ 0.129383,0.503912,0.85401,0.060045,0.072087,-0.005004,
+ 0.115813,0.607114,0.78613,0.059043,0.07244,-0.005092,
+ 0.129383,0.503912,0.85401,0.060045,0.072087,-0.005004,
+ 0.153706,0.598644,0.78613,0.060077,0.072209,-0.005092,
+ 0.077464,0.613188,0.78613,0.057998,0.072606,-0.005092,
+ 0.065205,0.516155,0.85401,0.057982,0.072481,-0.005004,
+ 0.097487,0.511042,0.85401,0.05902,0.072316,-0.005004,
+ 0.077464,0.613188,0.78613,0.057998,0.072606,-0.005092,
+ 0.097487,0.511042,0.85401,0.05902,0.072316,-0.005004,
+ 0.115813,0.607114,0.78613,0.059043,0.07244,-0.005092,
+ 0.038808,0.616842,0.78613,0.056943,0.072705,-0.005092,
+ 0.032667,0.519231,0.85401,0.056936,0.07258,-0.005004,
+ 0.065205,0.516155,0.85401,0.057982,0.072481,-0.005004,
+ 0.038808,0.616842,0.78613,0.056943,0.072705,-0.005092,
+ 0.065205,0.516155,0.85401,0.057982,0.072481,-0.005004,
+ 0.077464,0.613188,0.78613,0.057998,0.072606,-0.005092,
+ 0,0.618061,0.78613,0.055885,0.072739,-0.005092,
+ 0,0.520257,0.85401,0.055885,0.072613,-0.005004,
+ 0.032667,0.519231,0.85401,0.056936,0.07258,-0.005004,
+ 0,0.618061,0.78613,0.055885,0.072739,-0.005092,
+ 0.032667,0.519231,0.85401,0.056936,0.07258,-0.005004,
+ 0.038808,0.616842,0.78613,0.056943,0.072705,-0.005092,
+ -0.038808,0.616842,0.78613,0.054827,0.072705,-0.005092,
+ -0.032667,0.519231,0.85401,0.054835,0.07258,-0.005004,
+ 0,0.520257,0.85401,0.055885,0.072613,-0.005004,
+ -0.038808,0.616842,0.78613,0.054827,0.072705,-0.005092,
+ 0,0.520257,0.85401,0.055885,0.072613,-0.005004,
+ 0,0.618061,0.78613,0.055885,0.072739,-0.005092,
+ -0.077464,0.613188,0.78613,0.053773,0.072606,-0.005092,
+ -0.065205,0.516155,0.85401,0.053789,0.072481,-0.005004,
+ -0.032667,0.519231,0.85401,0.054835,0.07258,-0.005004,
+ -0.077464,0.613188,0.78613,0.053773,0.072606,-0.005092,
+ -0.032667,0.519231,0.85401,0.054835,0.07258,-0.005004,
+ -0.038808,0.616842,0.78613,0.054827,0.072705,-0.005092,
+ -0.115813,0.607114,0.78613,0.052727,0.07244,-0.005092,
+ -0.097487,0.511042,0.85401,0.052751,0.072316,-0.005004,
+ -0.065205,0.516155,0.85401,0.053789,0.072481,-0.005004,
+ -0.115813,0.607114,0.78613,0.052727,0.07244,-0.005092,
+ -0.065205,0.516155,0.85401,0.053789,0.072481,-0.005004,
+ -0.077464,0.613188,0.78613,0.053773,0.072606,-0.005092,
+ -0.153706,0.598644,0.78613,0.051694,0.072209,-0.005092,
+ -0.129383,0.503912,0.85401,0.051725,0.072087,-0.005004,
+ -0.097487,0.511042,0.85401,0.052751,0.072316,-0.005004,
+ -0.153706,0.598644,0.78613,0.051694,0.072209,-0.005092,
+ -0.097487,0.511042,0.85401,0.052751,0.072316,-0.005004,
+ -0.115813,0.607114,0.78613,0.052727,0.07244,-0.005092,
+ -0.190991,0.587811,0.78613,0.050677,0.071914,-0.005092,
+ -0.160768,0.494794,0.85401,0.050716,0.071794,-0.005004,
+ -0.129383,0.503912,0.85401,0.051725,0.072087,-0.005004,
+ -0.190991,0.587811,0.78613,0.050677,0.071914,-0.005092,
+ -0.129383,0.503912,0.85401,0.051725,0.072087,-0.005004,
+ -0.153706,0.598644,0.78613,0.051694,0.072209,-0.005092,
+ -0.227524,0.574659,0.78613,0.049681,0.071555,-0.005092,
+ -0.191519,0.483723,0.85401,0.049728,0.071438,-0.005004,
+ -0.160768,0.494794,0.85401,0.050716,0.071794,-0.005004,
+ -0.227524,0.574659,0.78613,0.049681,0.071555,-0.005092,
+ -0.160768,0.494794,0.85401,0.050716,0.071794,-0.005004,
+ -0.190991,0.587811,0.78613,0.050677,0.071914,-0.005092,
+ -0.263158,0.559239,0.78613,0.048709,0.071135,-0.005092,
+ -0.221515,0.470743,0.85401,0.048763,0.071021,-0.005004,
+ -0.191519,0.483723,0.85401,0.049728,0.071438,-0.005004,
+ -0.263158,0.559239,0.78613,0.048709,0.071135,-0.005092,
+ -0.191519,0.483723,0.85401,0.049728,0.071438,-0.005004,
+ -0.227524,0.574659,0.78613,0.049681,0.071555,-0.005092,
+ -0.297753,0.541611,0.78613,0.047766,0.070654,-0.005092,
+ -0.250636,0.455905,0.85401,0.047827,0.070543,-0.005004,
+ -0.221515,0.470743,0.85401,0.048763,0.071021,-0.005004,
+ -0.297753,0.541611,0.78613,0.047766,0.070654,-0.005092,
+ -0.221515,0.470743,0.85401,0.048763,0.071021,-0.005004,
+ -0.263158,0.559239,0.78613,0.048709,0.071135,-0.005092,
+ -0.331174,0.521846,0.78613,0.046855,0.070115,-0.005092,
+ -0.278768,0.439268,0.85401,0.046922,0.070009,-0.005004,
+ -0.250636,0.455905,0.85401,0.047827,0.070543,-0.005004,
+ -0.331174,0.521846,0.78613,0.046855,0.070115,-0.005092,
+ -0.250636,0.455905,0.85401,0.047827,0.070543,-0.005004,
+ -0.297753,0.541611,0.78613,0.047766,0.070654,-0.005092,
+ -0.363287,0.500022,0.78613,0.045979,0.06952,-0.005092,
+ -0.3058,0.420897,0.85401,0.046053,0.069418,-0.005004,
+ -0.278768,0.439268,0.85401,0.046922,0.070009,-0.005004,
+ -0.363287,0.500022,0.78613,0.045979,0.06952,-0.005092,
+ -0.278768,0.439268,0.85401,0.046922,0.070009,-0.005004,
+ -0.331174,0.521846,0.78613,0.046855,0.070115,-0.005092,
+ -0.393967,0.476224,0.78613,0.045143,0.068871,-0.005092,
+ -0.331624,0.400865,0.85401,0.045223,0.068774,-0.005004,
+ -0.3058,0.420897,0.85401,0.046053,0.069418,-0.005004,
+ -0.393967,0.476224,0.78613,0.045143,0.068871,-0.005092,
+ -0.3058,0.420897,0.85401,0.046053,0.069418,-0.005004,
+ -0.363287,0.500022,0.78613,0.045979,0.06952,-0.005092,
+ -0.423092,0.450547,0.78613,0.044348,0.068171,-0.005092,
+ -0.356141,0.379251,0.85401,0.044435,0.068079,-0.005004,
+ -0.331624,0.400865,0.85401,0.045223,0.068774,-0.005004,
+ -0.423092,0.450547,0.78613,0.044348,0.068171,-0.005092,
+ -0.331624,0.400865,0.85401,0.045223,0.068774,-0.005004,
+ -0.393967,0.476224,0.78613,0.045143,0.068871,-0.005092,
+ -0.450547,0.423092,0.78613,0.0436,0.067422,-0.005092,
+ -0.379251,0.356141,0.85401,0.043692,0.067336,-0.005004,
+ -0.356141,0.379251,0.85401,0.044435,0.068079,-0.005004,
+ -0.450547,0.423092,0.78613,0.0436,0.067422,-0.005092,
+ -0.356141,0.379251,0.85401,0.044435,0.068079,-0.005004,
+ -0.423092,0.450547,0.78613,0.044348,0.068171,-0.005092,
+ -0.476224,0.393967,0.78613,0.0429,0.066628,-0.005092,
+ -0.400865,0.331624,0.85401,0.042997,0.066548,-0.005004,
+ -0.379251,0.356141,0.85401,0.043692,0.067336,-0.005004,
+ -0.476224,0.393967,0.78613,0.0429,0.066628,-0.005092,
+ -0.379251,0.356141,0.85401,0.043692,0.067336,-0.005004,
+ -0.450547,0.423092,0.78613,0.0436,0.067422,-0.005092,
+ -0.500022,0.363287,0.78613,0.042251,0.065791,-0.005092,
+ -0.420897,0.3058,0.85401,0.042353,0.065717,-0.005004,
+ -0.400865,0.331624,0.85401,0.042997,0.066548,-0.005004,
+ -0.500022,0.363287,0.78613,0.042251,0.065791,-0.005092,
+ -0.400865,0.331624,0.85401,0.042997,0.066548,-0.005004,
+ -0.476224,0.393967,0.78613,0.0429,0.066628,-0.005092,
+ -0.521846,0.331174,0.78613,0.041656,0.064916,-0.005092,
+ -0.439268,0.278768,0.85401,0.041762,0.064848,-0.005004,
+ -0.420897,0.3058,0.85401,0.042353,0.065717,-0.005004,
+ -0.521846,0.331174,0.78613,0.041656,0.064916,-0.005092,
+ -0.420897,0.3058,0.85401,0.042353,0.065717,-0.005004,
+ -0.500022,0.363287,0.78613,0.042251,0.065791,-0.005092,
+ -0.541611,0.297753,0.78613,0.041117,0.064004,-0.005092,
+ -0.455905,0.250636,0.85401,0.041227,0.063944,-0.005004,
+ -0.439268,0.278768,0.85401,0.041762,0.064848,-0.005004,
+ -0.541611,0.297753,0.78613,0.041117,0.064004,-0.005092,
+ -0.439268,0.278768,0.85401,0.041762,0.064848,-0.005004,
+ -0.521846,0.331174,0.78613,0.041656,0.064916,-0.005092,
+ -0.559239,0.263158,0.78613,0.040636,0.063061,-0.005092,
+ -0.470743,0.221515,0.85401,0.04075,0.063007,-0.005004,
+ -0.455905,0.250636,0.85401,0.041227,0.063944,-0.005004,
+ -0.559239,0.263158,0.78613,0.040636,0.063061,-0.005092,
+ -0.455905,0.250636,0.85401,0.041227,0.063944,-0.005004,
+ -0.541611,0.297753,0.78613,0.041117,0.064004,-0.005092,
+ -0.574659,0.227524,0.78613,0.040215,0.062089,-0.005092,
+ -0.483723,0.191519,0.85401,0.040333,0.062043,-0.005004,
+ -0.470743,0.221515,0.85401,0.04075,0.063007,-0.005004,
+ -0.574659,0.227524,0.78613,0.040215,0.062089,-0.005092,
+ -0.470743,0.221515,0.85401,0.04075,0.063007,-0.005004,
+ -0.559239,0.263158,0.78613,0.040636,0.063061,-0.005092,
+ -0.587811,0.190991,0.78613,0.039857,0.061093,-0.005092,
+ -0.494794,0.160768,0.85401,0.039977,0.061054,-0.005004,
+ -0.483723,0.191519,0.85401,0.040333,0.062043,-0.005004,
+ -0.587811,0.190991,0.78613,0.039857,0.061093,-0.005092,
+ -0.483723,0.191519,0.85401,0.040333,0.062043,-0.005004,
+ -0.574659,0.227524,0.78613,0.040215,0.062089,-0.005092,
+ -0.598644,0.153706,0.78613,0.039562,0.060077,-0.005092,
+ -0.503912,0.129383,0.85401,0.039684,0.060045,-0.005004,
+ -0.494794,0.160768,0.85401,0.039977,0.061054,-0.005004,
+ -0.598644,0.153706,0.78613,0.039562,0.060077,-0.005092,
+ -0.494794,0.160768,0.85401,0.039977,0.061054,-0.005004,
+ -0.587811,0.190991,0.78613,0.039857,0.061093,-0.005092,
+ -0.607114,0.115813,0.78613,0.039331,0.059043,-0.005092,
+ -0.511042,0.097487,0.85401,0.039454,0.05902,-0.005004,
+ -0.503912,0.129383,0.85401,0.039684,0.060045,-0.005004,
+ -0.607114,0.115813,0.78613,0.039331,0.059043,-0.005092,
+ -0.503912,0.129383,0.85401,0.039684,0.060045,-0.005004,
+ -0.598644,0.153706,0.78613,0.039562,0.060077,-0.005092,
+ -0.613188,0.077464,0.78613,0.039165,0.057998,-0.005092,
+ -0.516155,0.065205,0.85401,0.03929,0.057982,-0.005004,
+ -0.511042,0.097487,0.85401,0.039454,0.05902,-0.005004,
+ -0.613188,0.077464,0.78613,0.039165,0.057998,-0.005092,
+ -0.511042,0.097487,0.85401,0.039454,0.05902,-0.005004,
+ -0.607114,0.115813,0.78613,0.039331,0.059043,-0.005092,
+ -0.516155,0.065205,0.85401,0.03929,0.057982,-0.005004,
+ -0.411806,0.052023,0.909785,0.039424,0.057965,-0.004932,
+ -0.407727,0.077778,0.909785,0.039587,0.058994,-0.004932,
+ -0.516155,0.065205,0.85401,0.03929,0.057982,-0.005004,
+ -0.407727,0.077778,0.909785,0.039587,0.058994,-0.004932,
+ -0.511042,0.097487,0.85401,0.039454,0.05902,-0.005004,
+ -0.519231,0.032667,0.85401,0.039191,0.056936,-0.005004,
+ -0.41426,0.026063,0.909785,0.039326,0.056927,-0.004932,
+ -0.411806,0.052023,0.909785,0.039424,0.057965,-0.004932,
+ -0.519231,0.032667,0.85401,0.039191,0.056936,-0.005004,
+ -0.411806,0.052023,0.909785,0.039424,0.057965,-0.004932,
+ -0.516155,0.065205,0.85401,0.03929,0.057982,-0.005004,
+ -0.520257,0,0.85401,0.039158,0.055885,-0.005004,
+ -0.415079,0,0.909785,0.039294,0.055885,-0.004932,
+ -0.41426,0.026063,0.909785,0.039326,0.056927,-0.004932,
+ -0.520257,0,0.85401,0.039158,0.055885,-0.005004,
+ -0.41426,0.026063,0.909785,0.039326,0.056927,-0.004932,
+ -0.519231,0.032667,0.85401,0.039191,0.056936,-0.005004,
+ -0.519231,-0.032667,0.85401,0.039191,0.054835,-0.005004,
+ -0.41426,-0.026063,0.909785,0.039326,0.054844,-0.004932,
+ -0.415079,0,0.909785,0.039294,0.055885,-0.004932,
+ -0.519231,-0.032667,0.85401,0.039191,0.054835,-0.005004,
+ -0.415079,0,0.909785,0.039294,0.055885,-0.004932,
+ -0.520257,0,0.85401,0.039158,0.055885,-0.005004,
+ -0.516155,-0.065205,0.85401,0.03929,0.053789,-0.005004,
+ -0.411806,-0.052023,0.909785,0.039424,0.053806,-0.004932,
+ -0.41426,-0.026063,0.909785,0.039326,0.054844,-0.004932,
+ -0.516155,-0.065205,0.85401,0.03929,0.053789,-0.005004,
+ -0.41426,-0.026063,0.909785,0.039326,0.054844,-0.004932,
+ -0.519231,-0.032667,0.85401,0.039191,0.054835,-0.005004,
+ -0.511042,-0.097487,0.85401,0.039454,0.052751,-0.005004,
+ -0.407727,-0.077778,0.909785,0.039587,0.052776,-0.004932,
+ -0.411806,-0.052023,0.909785,0.039424,0.053806,-0.004932,
+ -0.511042,-0.097487,0.85401,0.039454,0.052751,-0.005004,
+ -0.411806,-0.052023,0.909785,0.039424,0.053806,-0.004932,
+ -0.516155,-0.065205,0.85401,0.03929,0.053789,-0.005004,
+ -0.503912,-0.129383,0.85401,0.039684,0.051725,-0.005004,
+ -0.402039,-0.103226,0.909785,0.039815,0.051759,-0.004932,
+ -0.407727,-0.077778,0.909785,0.039587,0.052776,-0.004932,
+ -0.503912,-0.129383,0.85401,0.039684,0.051725,-0.005004,
+ -0.407727,-0.077778,0.909785,0.039587,0.052776,-0.004932,
+ -0.511042,-0.097487,0.85401,0.039454,0.052751,-0.005004,
+ -0.494794,-0.160768,0.85401,0.039977,0.050716,-0.005004,
+ -0.394764,-0.128267,0.909785,0.040106,0.050758,-0.004932,
+ -0.402039,-0.103226,0.909785,0.039815,0.051759,-0.004932,
+ -0.494794,-0.160768,0.85401,0.039977,0.050716,-0.005004,
+ -0.402039,-0.103226,0.909785,0.039815,0.051759,-0.004932,
+ -0.503912,-0.129383,0.85401,0.039684,0.051725,-0.005004,
+ -0.483723,-0.191519,0.85401,0.040333,0.049728,-0.005004,
+ -0.385931,-0.152801,0.909785,0.040459,0.049777,-0.004932,
+ -0.394764,-0.128267,0.909785,0.040106,0.050758,-0.004932,
+ -0.483723,-0.191519,0.85401,0.040333,0.049728,-0.005004,
+ -0.394764,-0.128267,0.909785,0.040106,0.050758,-0.004932,
+ -0.494794,-0.160768,0.85401,0.039977,0.050716,-0.005004,
+ -0.470743,-0.221515,0.85401,0.04075,0.048763,-0.005004,
+ -0.375575,-0.176732,0.909785,0.040873,0.048821,-0.004932,
+ -0.385931,-0.152801,0.909785,0.040459,0.049777,-0.004932,
+ -0.470743,-0.221515,0.85401,0.04075,0.048763,-0.005004,
+ -0.385931,-0.152801,0.909785,0.040459,0.049777,-0.004932,
+ -0.483723,-0.191519,0.85401,0.040333,0.049728,-0.005004,
+ -0.455905,-0.250636,0.85401,0.041227,0.047827,-0.005004,
+ -0.363737,-0.199966,0.909785,0.041346,0.047892,-0.004932,
+ -0.375575,-0.176732,0.909785,0.040873,0.048821,-0.004932,
+ -0.455905,-0.250636,0.85401,0.041227,0.047827,-0.005004,
+ -0.375575,-0.176732,0.909785,0.040873,0.048821,-0.004932,
+ -0.470743,-0.221515,0.85401,0.04075,0.048763,-0.005004,
+ -0.439268,-0.278768,0.85401,0.041762,0.046922,-0.005004,
+ -0.350463,-0.222411,0.909785,0.041876,0.046995,-0.004932,
+ -0.363737,-0.199966,0.909785,0.041346,0.047892,-0.004932,
+ -0.439268,-0.278768,0.85401,0.041762,0.046922,-0.005004,
+ -0.363737,-0.199966,0.909785,0.041346,0.047892,-0.004932,
+ -0.455905,-0.250636,0.85401,0.041227,0.047827,-0.005004,
+ -0.420897,-0.3058,0.85401,0.042353,0.046053,-0.005004,
+ -0.335806,-0.243978,0.909785,0.042462,0.046133,-0.004932,
+ -0.350463,-0.222411,0.909785,0.041876,0.046995,-0.004932,
+ -0.420897,-0.3058,0.85401,0.042353,0.046053,-0.005004,
+ -0.350463,-0.222411,0.909785,0.041876,0.046995,-0.004932,
+ -0.439268,-0.278768,0.85401,0.041762,0.046922,-0.005004,
+ -0.400865,-0.331624,0.85401,0.042997,0.045223,-0.005004,
+ -0.319824,-0.264582,0.909785,0.043101,0.045309,-0.004932,
+ -0.335806,-0.243978,0.909785,0.042462,0.046133,-0.004932,
+ -0.400865,-0.331624,0.85401,0.042997,0.045223,-0.005004,
+ -0.335806,-0.243978,0.909785,0.042462,0.046133,-0.004932,
+ -0.420897,-0.3058,0.85401,0.042353,0.046053,-0.005004,
+ -0.379251,-0.356141,0.85401,0.043692,0.044435,-0.005004,
+ -0.30258,-0.284141,0.909785,0.04379,0.044527,-0.004932,
+ -0.319824,-0.264582,0.909785,0.043101,0.045309,-0.004932,
+ -0.379251,-0.356141,0.85401,0.043692,0.044435,-0.005004,
+ -0.319824,-0.264582,0.909785,0.043101,0.045309,-0.004932,
+ -0.400865,-0.331624,0.85401,0.042997,0.045223,-0.005004,
+ -0.356141,-0.379251,0.85401,0.044435,0.043692,-0.005004,
+ -0.284141,-0.30258,0.909785,0.044527,0.04379,-0.004932,
+ -0.30258,-0.284141,0.909785,0.04379,0.044527,-0.004932,
+ -0.356141,-0.379251,0.85401,0.044435,0.043692,-0.005004,
+ -0.30258,-0.284141,0.909785,0.04379,0.044527,-0.004932,
+ -0.379251,-0.356141,0.85401,0.043692,0.044435,-0.005004,
+ -0.331624,-0.400865,0.85401,0.045223,0.042997,-0.005004,
+ -0.264582,-0.319824,0.909785,0.045309,0.043101,-0.004932,
+ -0.284141,-0.30258,0.909785,0.044527,0.04379,-0.004932,
+ -0.331624,-0.400865,0.85401,0.045223,0.042997,-0.005004,
+ -0.284141,-0.30258,0.909785,0.044527,0.04379,-0.004932,
+ -0.356141,-0.379251,0.85401,0.044435,0.043692,-0.005004,
+ -0.3058,-0.420897,0.85401,0.046053,0.042353,-0.005004,
+ -0.243978,-0.335806,0.909785,0.046133,0.042462,-0.004932,
+ -0.264582,-0.319824,0.909785,0.045309,0.043101,-0.004932,
+ -0.3058,-0.420897,0.85401,0.046053,0.042353,-0.005004,
+ -0.264582,-0.319824,0.909785,0.045309,0.043101,-0.004932,
+ -0.331624,-0.400865,0.85401,0.045223,0.042997,-0.005004,
+ -0.278768,-0.439268,0.85401,0.046922,0.041762,-0.005004,
+ -0.222411,-0.350463,0.909785,0.046995,0.041876,-0.004932,
+ -0.243978,-0.335806,0.909785,0.046133,0.042462,-0.004932,
+ -0.278768,-0.439268,0.85401,0.046922,0.041762,-0.005004,
+ -0.243978,-0.335806,0.909785,0.046133,0.042462,-0.004932,
+ -0.3058,-0.420897,0.85401,0.046053,0.042353,-0.005004,
+ -0.250636,-0.455905,0.85401,0.047827,0.041227,-0.005004,
+ -0.199966,-0.363737,0.909785,0.047892,0.041346,-0.004932,
+ -0.222411,-0.350463,0.909785,0.046995,0.041876,-0.004932,
+ -0.250636,-0.455905,0.85401,0.047827,0.041227,-0.005004,
+ -0.222411,-0.350463,0.909785,0.046995,0.041876,-0.004932,
+ -0.278768,-0.439268,0.85401,0.046922,0.041762,-0.005004,
+ -0.221515,-0.470743,0.85401,0.048763,0.04075,-0.005004,
+ -0.176732,-0.375575,0.909785,0.048821,0.040873,-0.004932,
+ -0.199966,-0.363737,0.909785,0.047892,0.041346,-0.004932,
+ -0.221515,-0.470743,0.85401,0.048763,0.04075,-0.005004,
+ -0.199966,-0.363737,0.909785,0.047892,0.041346,-0.004932,
+ -0.250636,-0.455905,0.85401,0.047827,0.041227,-0.005004,
+ -0.191519,-0.483723,0.85401,0.049728,0.040333,-0.005004,
+ -0.152801,-0.385931,0.909785,0.049777,0.040459,-0.004932,
+ -0.176732,-0.375575,0.909785,0.048821,0.040873,-0.004932,
+ -0.191519,-0.483723,0.85401,0.049728,0.040333,-0.005004,
+ -0.176732,-0.375575,0.909785,0.048821,0.040873,-0.004932,
+ -0.221515,-0.470743,0.85401,0.048763,0.04075,-0.005004,
+ -0.160768,-0.494794,0.85401,0.050716,0.039977,-0.005004,
+ -0.128267,-0.394764,0.909785,0.050758,0.040106,-0.004932,
+ -0.152801,-0.385931,0.909785,0.049777,0.040459,-0.004932,
+ -0.160768,-0.494794,0.85401,0.050716,0.039977,-0.005004,
+ -0.152801,-0.385931,0.909785,0.049777,0.040459,-0.004932,
+ -0.191519,-0.483723,0.85401,0.049728,0.040333,-0.005004,
+ -0.129383,-0.503912,0.85401,0.051725,0.039684,-0.005004,
+ -0.103226,-0.402039,0.909785,0.051759,0.039815,-0.004932,
+ -0.128267,-0.394764,0.909785,0.050758,0.040106,-0.004932,
+ -0.129383,-0.503912,0.85401,0.051725,0.039684,-0.005004,
+ -0.128267,-0.394764,0.909785,0.050758,0.040106,-0.004932,
+ -0.160768,-0.494794,0.85401,0.050716,0.039977,-0.005004,
+ -0.097487,-0.511042,0.85401,0.052751,0.039454,-0.005004,
+ -0.077778,-0.407727,0.909785,0.052776,0.039587,-0.004932,
+ -0.103226,-0.402039,0.909785,0.051759,0.039815,-0.004932,
+ -0.097487,-0.511042,0.85401,0.052751,0.039454,-0.005004,
+ -0.103226,-0.402039,0.909785,0.051759,0.039815,-0.004932,
+ -0.129383,-0.503912,0.85401,0.051725,0.039684,-0.005004,
+ -0.065205,-0.516155,0.85401,0.053789,0.03929,-0.005004,
+ -0.052023,-0.411806,0.909785,0.053806,0.039424,-0.004932,
+ -0.077778,-0.407727,0.909785,0.052776,0.039587,-0.004932,
+ -0.065205,-0.516155,0.85401,0.053789,0.03929,-0.005004,
+ -0.077778,-0.407727,0.909785,0.052776,0.039587,-0.004932,
+ -0.097487,-0.511042,0.85401,0.052751,0.039454,-0.005004,
+ -0.032667,-0.519231,0.85401,0.054835,0.039191,-0.005004,
+ -0.026063,-0.41426,0.909785,0.054844,0.039326,-0.004932,
+ -0.052023,-0.411806,0.909785,0.053806,0.039424,-0.004932,
+ -0.032667,-0.519231,0.85401,0.054835,0.039191,-0.005004,
+ -0.052023,-0.411806,0.909785,0.053806,0.039424,-0.004932,
+ -0.065205,-0.516155,0.85401,0.053789,0.03929,-0.005004,
+ 0,-0.520257,0.85401,0.055885,0.039158,-0.005004,
+ 0,-0.415079,0.909785,0.055885,0.039294,-0.004932,
+ -0.026063,-0.41426,0.909785,0.054844,0.039326,-0.004932,
+ 0,-0.520257,0.85401,0.055885,0.039158,-0.005004,
+ -0.026063,-0.41426,0.909785,0.054844,0.039326,-0.004932,
+ -0.032667,-0.519231,0.85401,0.054835,0.039191,-0.005004,
+ 0.032667,-0.519231,0.85401,0.056936,0.039191,-0.005004,
+ 0.026063,-0.41426,0.909785,0.056927,0.039326,-0.004932,
+ 0,-0.415079,0.909785,0.055885,0.039294,-0.004932,
+ 0.032667,-0.519231,0.85401,0.056936,0.039191,-0.005004,
+ 0,-0.415079,0.909785,0.055885,0.039294,-0.004932,
+ 0,-0.520257,0.85401,0.055885,0.039158,-0.005004,
+ 0.065205,-0.516155,0.85401,0.057982,0.03929,-0.005004,
+ 0.052023,-0.411806,0.909785,0.057965,0.039424,-0.004932,
+ 0.026063,-0.41426,0.909785,0.056927,0.039326,-0.004932,
+ 0.065205,-0.516155,0.85401,0.057982,0.03929,-0.005004,
+ 0.026063,-0.41426,0.909785,0.056927,0.039326,-0.004932,
+ 0.032667,-0.519231,0.85401,0.056936,0.039191,-0.005004,
+ 0.097487,-0.511042,0.85401,0.05902,0.039454,-0.005004,
+ 0.077778,-0.407727,0.909785,0.058994,0.039587,-0.004932,
+ 0.052023,-0.411806,0.909785,0.057965,0.039424,-0.004932,
+ 0.097487,-0.511042,0.85401,0.05902,0.039454,-0.005004,
+ 0.052023,-0.411806,0.909785,0.057965,0.039424,-0.004932,
+ 0.065205,-0.516155,0.85401,0.057982,0.03929,-0.005004,
+ 0.129383,-0.503912,0.85401,0.060045,0.039684,-0.005004,
+ 0.103226,-0.402039,0.909785,0.060012,0.039815,-0.004932,
+ 0.077778,-0.407727,0.909785,0.058994,0.039587,-0.004932,
+ 0.129383,-0.503912,0.85401,0.060045,0.039684,-0.005004,
+ 0.077778,-0.407727,0.909785,0.058994,0.039587,-0.004932,
+ 0.097487,-0.511042,0.85401,0.05902,0.039454,-0.005004,
+ 0.160768,-0.494794,0.85401,0.061054,0.039977,-0.005004,
+ 0.128267,-0.394764,0.909785,0.061012,0.040106,-0.004932,
+ 0.103226,-0.402039,0.909785,0.060012,0.039815,-0.004932,
+ 0.160768,-0.494794,0.85401,0.061054,0.039977,-0.005004,
+ 0.103226,-0.402039,0.909785,0.060012,0.039815,-0.004932,
+ 0.129383,-0.503912,0.85401,0.060045,0.039684,-0.005004,
+ 0.191519,-0.483723,0.85401,0.062043,0.040333,-0.005004,
+ 0.152801,-0.385931,0.909785,0.061993,0.040459,-0.004932,
+ 0.128267,-0.394764,0.909785,0.061012,0.040106,-0.004932,
+ 0.191519,-0.483723,0.85401,0.062043,0.040333,-0.005004,
+ 0.128267,-0.394764,0.909785,0.061012,0.040106,-0.004932,
+ 0.160768,-0.494794,0.85401,0.061054,0.039977,-0.005004,
+ 0.221515,-0.470743,0.85401,0.063007,0.04075,-0.005004,
+ 0.176732,-0.375575,0.909785,0.06295,0.040873,-0.004932,
+ 0.152801,-0.385931,0.909785,0.061993,0.040459,-0.004932,
+ 0.221515,-0.470743,0.85401,0.063007,0.04075,-0.005004,
+ 0.152801,-0.385931,0.909785,0.061993,0.040459,-0.004932,
+ 0.191519,-0.483723,0.85401,0.062043,0.040333,-0.005004,
+ 0.250636,-0.455905,0.85401,0.063944,0.041227,-0.005004,
+ 0.199966,-0.363737,0.909785,0.063878,0.041346,-0.004932,
+ 0.176732,-0.375575,0.909785,0.06295,0.040873,-0.004932,
+ 0.250636,-0.455905,0.85401,0.063944,0.041227,-0.005004,
+ 0.176732,-0.375575,0.909785,0.06295,0.040873,-0.004932,
+ 0.221515,-0.470743,0.85401,0.063007,0.04075,-0.005004,
+ 0.278768,-0.439268,0.85401,0.064848,0.041762,-0.005004,
+ 0.222411,-0.350463,0.909785,0.064776,0.041876,-0.004932,
+ 0.199966,-0.363737,0.909785,0.063878,0.041346,-0.004932,
+ 0.278768,-0.439268,0.85401,0.064848,0.041762,-0.005004,
+ 0.199966,-0.363737,0.909785,0.063878,0.041346,-0.004932,
+ 0.250636,-0.455905,0.85401,0.063944,0.041227,-0.005004,
+ 0.3058,-0.420897,0.85401,0.065717,0.042353,-0.005004,
+ 0.243978,-0.335806,0.909785,0.065638,0.042462,-0.004932,
+ 0.222411,-0.350463,0.909785,0.064776,0.041876,-0.004932,
+ 0.3058,-0.420897,0.85401,0.065717,0.042353,-0.005004,
+ 0.222411,-0.350463,0.909785,0.064776,0.041876,-0.004932,
+ 0.278768,-0.439268,0.85401,0.064848,0.041762,-0.005004,
+ 0.331624,-0.400865,0.85401,0.066548,0.042997,-0.005004,
+ 0.264582,-0.319824,0.909785,0.066461,0.043101,-0.004932,
+ 0.243978,-0.335806,0.909785,0.065638,0.042462,-0.004932,
+ 0.331624,-0.400865,0.85401,0.066548,0.042997,-0.005004,
+ 0.243978,-0.335806,0.909785,0.065638,0.042462,-0.004932,
+ 0.3058,-0.420897,0.85401,0.065717,0.042353,-0.005004,
+ 0.356141,-0.379251,0.85401,0.067336,0.043692,-0.005004,
+ 0.284141,-0.30258,0.909785,0.067243,0.04379,-0.004932,
+ 0.264582,-0.319824,0.909785,0.066461,0.043101,-0.004932,
+ 0.356141,-0.379251,0.85401,0.067336,0.043692,-0.005004,
+ 0.264582,-0.319824,0.909785,0.066461,0.043101,-0.004932,
+ 0.331624,-0.400865,0.85401,0.066548,0.042997,-0.005004,
+ 0.379251,-0.356141,0.85401,0.068079,0.044435,-0.005004,
+ 0.30258,-0.284141,0.909785,0.06798,0.044527,-0.004932,
+ 0.284141,-0.30258,0.909785,0.067243,0.04379,-0.004932,
+ 0.379251,-0.356141,0.85401,0.068079,0.044435,-0.005004,
+ 0.284141,-0.30258,0.909785,0.067243,0.04379,-0.004932,
+ 0.356141,-0.379251,0.85401,0.067336,0.043692,-0.005004,
+ 0.400865,-0.331624,0.85401,0.068774,0.045223,-0.005004,
+ 0.319824,-0.264582,0.909785,0.06867,0.045309,-0.004932,
+ 0.30258,-0.284141,0.909785,0.06798,0.044527,-0.004932,
+ 0.400865,-0.331624,0.85401,0.068774,0.045223,-0.005004,
+ 0.30258,-0.284141,0.909785,0.06798,0.044527,-0.004932,
+ 0.379251,-0.356141,0.85401,0.068079,0.044435,-0.005004,
+ 0.420897,-0.3058,0.85401,0.069418,0.046053,-0.005004,
+ 0.335806,-0.243978,0.909785,0.069308,0.046133,-0.004932,
+ 0.319824,-0.264582,0.909785,0.06867,0.045309,-0.004932,
+ 0.420897,-0.3058,0.85401,0.069418,0.046053,-0.005004,
+ 0.319824,-0.264582,0.909785,0.06867,0.045309,-0.004932,
+ 0.400865,-0.331624,0.85401,0.068774,0.045223,-0.005004,
+ 0.439268,-0.278768,0.85401,0.070009,0.046922,-0.005004,
+ 0.350463,-0.222411,0.909785,0.069894,0.046995,-0.004932,
+ 0.335806,-0.243978,0.909785,0.069308,0.046133,-0.004932,
+ 0.439268,-0.278768,0.85401,0.070009,0.046922,-0.005004,
+ 0.335806,-0.243978,0.909785,0.069308,0.046133,-0.004932,
+ 0.420897,-0.3058,0.85401,0.069418,0.046053,-0.005004,
+ 0.455905,-0.250636,0.85401,0.070543,0.047827,-0.005004,
+ 0.363737,-0.199966,0.909785,0.070425,0.047892,-0.004932,
+ 0.350463,-0.222411,0.909785,0.069894,0.046995,-0.004932,
+ 0.455905,-0.250636,0.85401,0.070543,0.047827,-0.005004,
+ 0.350463,-0.222411,0.909785,0.069894,0.046995,-0.004932,
+ 0.439268,-0.278768,0.85401,0.070009,0.046922,-0.005004,
+ 0.470743,-0.221515,0.85401,0.071021,0.048763,-0.005004,
+ 0.375575,-0.176732,0.909785,0.070898,0.048821,-0.004932,
+ 0.363737,-0.199966,0.909785,0.070425,0.047892,-0.004932,
+ 0.470743,-0.221515,0.85401,0.071021,0.048763,-0.005004,
+ 0.363737,-0.199966,0.909785,0.070425,0.047892,-0.004932,
+ 0.455905,-0.250636,0.85401,0.070543,0.047827,-0.005004,
+ 0.483723,-0.191519,0.85401,0.071438,0.049728,-0.005004,
+ 0.385931,-0.152801,0.909785,0.071312,0.049777,-0.004932,
+ 0.375575,-0.176732,0.909785,0.070898,0.048821,-0.004932,
+ 0.483723,-0.191519,0.85401,0.071438,0.049728,-0.005004,
+ 0.375575,-0.176732,0.909785,0.070898,0.048821,-0.004932,
+ 0.470743,-0.221515,0.85401,0.071021,0.048763,-0.005004,
+ 0.494794,-0.160768,0.85401,0.071794,0.050716,-0.005004,
+ 0.394764,-0.128267,0.909785,0.071665,0.050758,-0.004932,
+ 0.385931,-0.152801,0.909785,0.071312,0.049777,-0.004932,
+ 0.494794,-0.160768,0.85401,0.071794,0.050716,-0.005004,
+ 0.385931,-0.152801,0.909785,0.071312,0.049777,-0.004932,
+ 0.483723,-0.191519,0.85401,0.071438,0.049728,-0.005004,
+ 0.503912,-0.129383,0.85401,0.072087,0.051725,-0.005004,
+ 0.402039,-0.103226,0.909785,0.071956,0.051759,-0.004932,
+ 0.394764,-0.128267,0.909785,0.071665,0.050758,-0.004932,
+ 0.503912,-0.129383,0.85401,0.072087,0.051725,-0.005004,
+ 0.394764,-0.128267,0.909785,0.071665,0.050758,-0.004932,
+ 0.494794,-0.160768,0.85401,0.071794,0.050716,-0.005004,
+ 0.511042,-0.097487,0.85401,0.072316,0.052751,-0.005004,
+ 0.407727,-0.077778,0.909785,0.072183,0.052776,-0.004932,
+ 0.402039,-0.103226,0.909785,0.071956,0.051759,-0.004932,
+ 0.511042,-0.097487,0.85401,0.072316,0.052751,-0.005004,
+ 0.402039,-0.103226,0.909785,0.071956,0.051759,-0.004932,
+ 0.503912,-0.129383,0.85401,0.072087,0.051725,-0.005004,
+ 0.516155,-0.065205,0.85401,0.072481,0.053789,-0.005004,
+ 0.411806,-0.052023,0.909785,0.072346,0.053806,-0.004932,
+ 0.407727,-0.077778,0.909785,0.072183,0.052776,-0.004932,
+ 0.516155,-0.065205,0.85401,0.072481,0.053789,-0.005004,
+ 0.407727,-0.077778,0.909785,0.072183,0.052776,-0.004932,
+ 0.511042,-0.097487,0.85401,0.072316,0.052751,-0.005004,
+ 0.519231,-0.032667,0.85401,0.07258,0.054835,-0.005004,
+ 0.41426,-0.026063,0.909785,0.072444,0.054844,-0.004932,
+ 0.411806,-0.052023,0.909785,0.072346,0.053806,-0.004932,
+ 0.519231,-0.032667,0.85401,0.07258,0.054835,-0.005004,
+ 0.411806,-0.052023,0.909785,0.072346,0.053806,-0.004932,
+ 0.516155,-0.065205,0.85401,0.072481,0.053789,-0.005004,
+ 0.520257,0,0.85401,0.072613,0.055885,-0.005004,
+ 0.415079,0,0.909785,0.072477,0.055885,-0.004932,
+ 0.41426,-0.026063,0.909785,0.072444,0.054844,-0.004932,
+ 0.520257,0,0.85401,0.072613,0.055885,-0.005004,
+ 0.41426,-0.026063,0.909785,0.072444,0.054844,-0.004932,
+ 0.519231,-0.032667,0.85401,0.07258,0.054835,-0.005004,
+ 0.519231,0.032667,0.85401,0.07258,0.056936,-0.005004,
+ 0.41426,0.026063,0.909785,0.072444,0.056927,-0.004932,
+ 0.415079,0,0.909785,0.072477,0.055885,-0.004932,
+ 0.519231,0.032667,0.85401,0.07258,0.056936,-0.005004,
+ 0.415079,0,0.909785,0.072477,0.055885,-0.004932,
+ 0.520257,0,0.85401,0.072613,0.055885,-0.005004,
+ 0.516155,0.065205,0.85401,0.072481,0.057982,-0.005004,
+ 0.411806,0.052023,0.909785,0.072346,0.057965,-0.004932,
+ 0.41426,0.026063,0.909785,0.072444,0.056927,-0.004932,
+ 0.516155,0.065205,0.85401,0.072481,0.057982,-0.005004,
+ 0.41426,0.026063,0.909785,0.072444,0.056927,-0.004932,
+ 0.519231,0.032667,0.85401,0.07258,0.056936,-0.005004,
+ 0.511042,0.097487,0.85401,0.072316,0.05902,-0.005004,
+ 0.407727,0.077778,0.909785,0.072183,0.058994,-0.004932,
+ 0.411806,0.052023,0.909785,0.072346,0.057965,-0.004932,
+ 0.511042,0.097487,0.85401,0.072316,0.05902,-0.005004,
+ 0.411806,0.052023,0.909785,0.072346,0.057965,-0.004932,
+ 0.516155,0.065205,0.85401,0.072481,0.057982,-0.005004,
+ 0.503912,0.129383,0.85401,0.072087,0.060045,-0.005004,
+ 0.402039,0.103226,0.909785,0.071956,0.060012,-0.004932,
+ 0.407727,0.077778,0.909785,0.072183,0.058994,-0.004932,
+ 0.503912,0.129383,0.85401,0.072087,0.060045,-0.005004,
+ 0.407727,0.077778,0.909785,0.072183,0.058994,-0.004932,
+ 0.511042,0.097487,0.85401,0.072316,0.05902,-0.005004,
+ 0.494794,0.160768,0.85401,0.071794,0.061054,-0.005004,
+ 0.394764,0.128267,0.909785,0.071665,0.061012,-0.004932,
+ 0.402039,0.103226,0.909785,0.071956,0.060012,-0.004932,
+ 0.494794,0.160768,0.85401,0.071794,0.061054,-0.005004,
+ 0.402039,0.103226,0.909785,0.071956,0.060012,-0.004932,
+ 0.503912,0.129383,0.85401,0.072087,0.060045,-0.005004,
+ 0.483723,0.191519,0.85401,0.071438,0.062043,-0.005004,
+ 0.385931,0.152801,0.909785,0.071312,0.061993,-0.004932,
+ 0.394764,0.128267,0.909785,0.071665,0.061012,-0.004932,
+ 0.483723,0.191519,0.85401,0.071438,0.062043,-0.005004,
+ 0.394764,0.128267,0.909785,0.071665,0.061012,-0.004932,
+ 0.494794,0.160768,0.85401,0.071794,0.061054,-0.005004,
+ 0.470743,0.221515,0.85401,0.071021,0.063007,-0.005004,
+ 0.375575,0.176732,0.909785,0.070898,0.06295,-0.004932,
+ 0.385931,0.152801,0.909785,0.071312,0.061993,-0.004932,
+ 0.470743,0.221515,0.85401,0.071021,0.063007,-0.005004,
+ 0.385931,0.152801,0.909785,0.071312,0.061993,-0.004932,
+ 0.483723,0.191519,0.85401,0.071438,0.062043,-0.005004,
+ 0.455905,0.250636,0.85401,0.070543,0.063944,-0.005004,
+ 0.363737,0.199966,0.909785,0.070425,0.063878,-0.004932,
+ 0.375575,0.176732,0.909785,0.070898,0.06295,-0.004932,
+ 0.455905,0.250636,0.85401,0.070543,0.063944,-0.005004,
+ 0.375575,0.176732,0.909785,0.070898,0.06295,-0.004932,
+ 0.470743,0.221515,0.85401,0.071021,0.063007,-0.005004,
+ 0.439268,0.278768,0.85401,0.070009,0.064848,-0.005004,
+ 0.350463,0.222411,0.909785,0.069894,0.064776,-0.004932,
+ 0.363737,0.199966,0.909785,0.070425,0.063878,-0.004932,
+ 0.439268,0.278768,0.85401,0.070009,0.064848,-0.005004,
+ 0.363737,0.199966,0.909785,0.070425,0.063878,-0.004932,
+ 0.455905,0.250636,0.85401,0.070543,0.063944,-0.005004,
+ 0.420897,0.3058,0.85401,0.069418,0.065717,-0.005004,
+ 0.335806,0.243978,0.909785,0.069308,0.065638,-0.004932,
+ 0.350463,0.222411,0.909785,0.069894,0.064776,-0.004932,
+ 0.420897,0.3058,0.85401,0.069418,0.065717,-0.005004,
+ 0.350463,0.222411,0.909785,0.069894,0.064776,-0.004932,
+ 0.439268,0.278768,0.85401,0.070009,0.064848,-0.005004,
+ 0.400865,0.331624,0.85401,0.068774,0.066548,-0.005004,
+ 0.319824,0.264582,0.909785,0.06867,0.066461,-0.004932,
+ 0.335806,0.243978,0.909785,0.069308,0.065638,-0.004932,
+ 0.400865,0.331624,0.85401,0.068774,0.066548,-0.005004,
+ 0.335806,0.243978,0.909785,0.069308,0.065638,-0.004932,
+ 0.420897,0.3058,0.85401,0.069418,0.065717,-0.005004,
+ 0.379251,0.356141,0.85401,0.068079,0.067336,-0.005004,
+ 0.30258,0.284141,0.909785,0.06798,0.067243,-0.004932,
+ 0.319824,0.264582,0.909785,0.06867,0.066461,-0.004932,
+ 0.379251,0.356141,0.85401,0.068079,0.067336,-0.005004,
+ 0.319824,0.264582,0.909785,0.06867,0.066461,-0.004932,
+ 0.400865,0.331624,0.85401,0.068774,0.066548,-0.005004,
+ 0.356141,0.379251,0.85401,0.067336,0.068079,-0.005004,
+ 0.284141,0.30258,0.909785,0.067243,0.06798,-0.004932,
+ 0.30258,0.284141,0.909785,0.06798,0.067243,-0.004932,
+ 0.356141,0.379251,0.85401,0.067336,0.068079,-0.005004,
+ 0.30258,0.284141,0.909785,0.06798,0.067243,-0.004932,
+ 0.379251,0.356141,0.85401,0.068079,0.067336,-0.005004,
+ 0.331624,0.400865,0.85401,0.066548,0.068774,-0.005004,
+ 0.264582,0.319824,0.909785,0.066461,0.06867,-0.004932,
+ 0.284141,0.30258,0.909785,0.067243,0.06798,-0.004932,
+ 0.331624,0.400865,0.85401,0.066548,0.068774,-0.005004,
+ 0.284141,0.30258,0.909785,0.067243,0.06798,-0.004932,
+ 0.356141,0.379251,0.85401,0.067336,0.068079,-0.005004,
+ 0.3058,0.420897,0.85401,0.065717,0.069418,-0.005004,
+ 0.243978,0.335806,0.909785,0.065638,0.069308,-0.004932,
+ 0.264582,0.319824,0.909785,0.066461,0.06867,-0.004932,
+ 0.3058,0.420897,0.85401,0.065717,0.069418,-0.005004,
+ 0.264582,0.319824,0.909785,0.066461,0.06867,-0.004932,
+ 0.331624,0.400865,0.85401,0.066548,0.068774,-0.005004,
+ 0.278768,0.439268,0.85401,0.064848,0.070009,-0.005004,
+ 0.222411,0.350463,0.909785,0.064776,0.069894,-0.004932,
+ 0.243978,0.335806,0.909785,0.065638,0.069308,-0.004932,
+ 0.278768,0.439268,0.85401,0.064848,0.070009,-0.005004,
+ 0.243978,0.335806,0.909785,0.065638,0.069308,-0.004932,
+ 0.3058,0.420897,0.85401,0.065717,0.069418,-0.005004,
+ 0.250636,0.455905,0.85401,0.063944,0.070543,-0.005004,
+ 0.199966,0.363737,0.909785,0.063878,0.070425,-0.004932,
+ 0.222411,0.350463,0.909785,0.064776,0.069894,-0.004932,
+ 0.250636,0.455905,0.85401,0.063944,0.070543,-0.005004,
+ 0.222411,0.350463,0.909785,0.064776,0.069894,-0.004932,
+ 0.278768,0.439268,0.85401,0.064848,0.070009,-0.005004,
+ 0.221515,0.470743,0.85401,0.063007,0.071021,-0.005004,
+ 0.176732,0.375575,0.909785,0.06295,0.070898,-0.004932,
+ 0.199966,0.363737,0.909785,0.063878,0.070425,-0.004932,
+ 0.221515,0.470743,0.85401,0.063007,0.071021,-0.005004,
+ 0.199966,0.363737,0.909785,0.063878,0.070425,-0.004932,
+ 0.250636,0.455905,0.85401,0.063944,0.070543,-0.005004,
+ 0.191519,0.483723,0.85401,0.062043,0.071438,-0.005004,
+ 0.152801,0.385931,0.909785,0.061993,0.071312,-0.004932,
+ 0.176732,0.375575,0.909785,0.06295,0.070898,-0.004932,
+ 0.191519,0.483723,0.85401,0.062043,0.071438,-0.005004,
+ 0.176732,0.375575,0.909785,0.06295,0.070898,-0.004932,
+ 0.221515,0.470743,0.85401,0.063007,0.071021,-0.005004,
+ 0.160768,0.494794,0.85401,0.061054,0.071794,-0.005004,
+ 0.128267,0.394764,0.909785,0.061012,0.071665,-0.004932,
+ 0.152801,0.385931,0.909785,0.061993,0.071312,-0.004932,
+ 0.160768,0.494794,0.85401,0.061054,0.071794,-0.005004,
+ 0.152801,0.385931,0.909785,0.061993,0.071312,-0.004932,
+ 0.191519,0.483723,0.85401,0.062043,0.071438,-0.005004,
+ 0.129383,0.503912,0.85401,0.060045,0.072087,-0.005004,
+ 0.103226,0.402039,0.909785,0.060012,0.071956,-0.004932,
+ 0.128267,0.394764,0.909785,0.061012,0.071665,-0.004932,
+ 0.129383,0.503912,0.85401,0.060045,0.072087,-0.005004,
+ 0.128267,0.394764,0.909785,0.061012,0.071665,-0.004932,
+ 0.160768,0.494794,0.85401,0.061054,0.071794,-0.005004,
+ 0.097487,0.511042,0.85401,0.05902,0.072316,-0.005004,
+ 0.077778,0.407727,0.909785,0.058994,0.072183,-0.004932,
+ 0.103226,0.402039,0.909785,0.060012,0.071956,-0.004932,
+ 0.097487,0.511042,0.85401,0.05902,0.072316,-0.005004,
+ 0.103226,0.402039,0.909785,0.060012,0.071956,-0.004932,
+ 0.129383,0.503912,0.85401,0.060045,0.072087,-0.005004,
+ 0.065205,0.516155,0.85401,0.057982,0.072481,-0.005004,
+ 0.052023,0.411806,0.909785,0.057965,0.072346,-0.004932,
+ 0.077778,0.407727,0.909785,0.058994,0.072183,-0.004932,
+ 0.065205,0.516155,0.85401,0.057982,0.072481,-0.005004,
+ 0.077778,0.407727,0.909785,0.058994,0.072183,-0.004932,
+ 0.097487,0.511042,0.85401,0.05902,0.072316,-0.005004,
+ 0.032667,0.519231,0.85401,0.056936,0.07258,-0.005004,
+ 0.026063,0.41426,0.909785,0.056927,0.072444,-0.004932,
+ 0.052023,0.411806,0.909785,0.057965,0.072346,-0.004932,
+ 0.032667,0.519231,0.85401,0.056936,0.07258,-0.005004,
+ 0.052023,0.411806,0.909785,0.057965,0.072346,-0.004932,
+ 0.065205,0.516155,0.85401,0.057982,0.072481,-0.005004,
+ 0,0.520257,0.85401,0.055885,0.072613,-0.005004,
+ 0,0.415079,0.909785,0.055885,0.072477,-0.004932,
+ 0.026063,0.41426,0.909785,0.056927,0.072444,-0.004932,
+ 0,0.520257,0.85401,0.055885,0.072613,-0.005004,
+ 0.026063,0.41426,0.909785,0.056927,0.072444,-0.004932,
+ 0.032667,0.519231,0.85401,0.056936,0.07258,-0.005004,
+ -0.032667,0.519231,0.85401,0.054835,0.07258,-0.005004,
+ -0.026063,0.41426,0.909785,0.054844,0.072444,-0.004932,
+ 0,0.415079,0.909785,0.055885,0.072477,-0.004932,
+ -0.032667,0.519231,0.85401,0.054835,0.07258,-0.005004,
+ 0,0.415079,0.909785,0.055885,0.072477,-0.004932,
+ 0,0.520257,0.85401,0.055885,0.072613,-0.005004,
+ -0.065205,0.516155,0.85401,0.053789,0.072481,-0.005004,
+ -0.052023,0.411806,0.909785,0.053806,0.072346,-0.004932,
+ -0.026063,0.41426,0.909785,0.054844,0.072444,-0.004932,
+ -0.065205,0.516155,0.85401,0.053789,0.072481,-0.005004,
+ -0.026063,0.41426,0.909785,0.054844,0.072444,-0.004932,
+ -0.032667,0.519231,0.85401,0.054835,0.07258,-0.005004,
+ -0.097487,0.511042,0.85401,0.052751,0.072316,-0.005004,
+ -0.077778,0.407727,0.909785,0.052776,0.072183,-0.004932,
+ -0.052023,0.411806,0.909785,0.053806,0.072346,-0.004932,
+ -0.097487,0.511042,0.85401,0.052751,0.072316,-0.005004,
+ -0.052023,0.411806,0.909785,0.053806,0.072346,-0.004932,
+ -0.065205,0.516155,0.85401,0.053789,0.072481,-0.005004,
+ -0.129383,0.503912,0.85401,0.051725,0.072087,-0.005004,
+ -0.103226,0.402039,0.909785,0.051759,0.071956,-0.004932,
+ -0.077778,0.407727,0.909785,0.052776,0.072183,-0.004932,
+ -0.129383,0.503912,0.85401,0.051725,0.072087,-0.005004,
+ -0.077778,0.407727,0.909785,0.052776,0.072183,-0.004932,
+ -0.097487,0.511042,0.85401,0.052751,0.072316,-0.005004,
+ -0.160768,0.494794,0.85401,0.050716,0.071794,-0.005004,
+ -0.128267,0.394764,0.909785,0.050758,0.071665,-0.004932,
+ -0.103226,0.402039,0.909785,0.051759,0.071956,-0.004932,
+ -0.160768,0.494794,0.85401,0.050716,0.071794,-0.005004,
+ -0.103226,0.402039,0.909785,0.051759,0.071956,-0.004932,
+ -0.129383,0.503912,0.85401,0.051725,0.072087,-0.005004,
+ -0.191519,0.483723,0.85401,0.049728,0.071438,-0.005004,
+ -0.152801,0.385931,0.909785,0.049777,0.071312,-0.004932,
+ -0.128267,0.394764,0.909785,0.050758,0.071665,-0.004932,
+ -0.191519,0.483723,0.85401,0.049728,0.071438,-0.005004,
+ -0.128267,0.394764,0.909785,0.050758,0.071665,-0.004932,
+ -0.160768,0.494794,0.85401,0.050716,0.071794,-0.005004,
+ -0.221515,0.470743,0.85401,0.048763,0.071021,-0.005004,
+ -0.176732,0.375575,0.909785,0.048821,0.070898,-0.004932,
+ -0.152801,0.385931,0.909785,0.049777,0.071312,-0.004932,
+ -0.221515,0.470743,0.85401,0.048763,0.071021,-0.005004,
+ -0.152801,0.385931,0.909785,0.049777,0.071312,-0.004932,
+ -0.191519,0.483723,0.85401,0.049728,0.071438,-0.005004,
+ -0.250636,0.455905,0.85401,0.047827,0.070543,-0.005004,
+ -0.199966,0.363737,0.909785,0.047892,0.070425,-0.004932,
+ -0.176732,0.375575,0.909785,0.048821,0.070898,-0.004932,
+ -0.250636,0.455905,0.85401,0.047827,0.070543,-0.005004,
+ -0.176732,0.375575,0.909785,0.048821,0.070898,-0.004932,
+ -0.221515,0.470743,0.85401,0.048763,0.071021,-0.005004,
+ -0.278768,0.439268,0.85401,0.046922,0.070009,-0.005004,
+ -0.222411,0.350463,0.909785,0.046995,0.069894,-0.004932,
+ -0.199966,0.363737,0.909785,0.047892,0.070425,-0.004932,
+ -0.278768,0.439268,0.85401,0.046922,0.070009,-0.005004,
+ -0.199966,0.363737,0.909785,0.047892,0.070425,-0.004932,
+ -0.250636,0.455905,0.85401,0.047827,0.070543,-0.005004,
+ -0.3058,0.420897,0.85401,0.046053,0.069418,-0.005004,
+ -0.243978,0.335806,0.909785,0.046133,0.069308,-0.004932,
+ -0.222411,0.350463,0.909785,0.046995,0.069894,-0.004932,
+ -0.3058,0.420897,0.85401,0.046053,0.069418,-0.005004,
+ -0.222411,0.350463,0.909785,0.046995,0.069894,-0.004932,
+ -0.278768,0.439268,0.85401,0.046922,0.070009,-0.005004,
+ -0.331624,0.400865,0.85401,0.045223,0.068774,-0.005004,
+ -0.264582,0.319824,0.909785,0.045309,0.06867,-0.004932,
+ -0.243978,0.335806,0.909785,0.046133,0.069308,-0.004932,
+ -0.331624,0.400865,0.85401,0.045223,0.068774,-0.005004,
+ -0.243978,0.335806,0.909785,0.046133,0.069308,-0.004932,
+ -0.3058,0.420897,0.85401,0.046053,0.069418,-0.005004,
+ -0.356141,0.379251,0.85401,0.044435,0.068079,-0.005004,
+ -0.284141,0.30258,0.909785,0.044527,0.06798,-0.004932,
+ -0.264582,0.319824,0.909785,0.045309,0.06867,-0.004932,
+ -0.356141,0.379251,0.85401,0.044435,0.068079,-0.005004,
+ -0.264582,0.319824,0.909785,0.045309,0.06867,-0.004932,
+ -0.331624,0.400865,0.85401,0.045223,0.068774,-0.005004,
+ -0.379251,0.356141,0.85401,0.043692,0.067336,-0.005004,
+ -0.30258,0.284141,0.909785,0.04379,0.067243,-0.004932,
+ -0.284141,0.30258,0.909785,0.044527,0.06798,-0.004932,
+ -0.379251,0.356141,0.85401,0.043692,0.067336,-0.005004,
+ -0.284141,0.30258,0.909785,0.044527,0.06798,-0.004932,
+ -0.356141,0.379251,0.85401,0.044435,0.068079,-0.005004,
+ -0.400865,0.331624,0.85401,0.042997,0.066548,-0.005004,
+ -0.319824,0.264582,0.909785,0.043101,0.066461,-0.004932,
+ -0.30258,0.284141,0.909785,0.04379,0.067243,-0.004932,
+ -0.400865,0.331624,0.85401,0.042997,0.066548,-0.005004,
+ -0.30258,0.284141,0.909785,0.04379,0.067243,-0.004932,
+ -0.379251,0.356141,0.85401,0.043692,0.067336,-0.005004,
+ -0.420897,0.3058,0.85401,0.042353,0.065717,-0.005004,
+ -0.335806,0.243978,0.909785,0.042462,0.065638,-0.004932,
+ -0.319824,0.264582,0.909785,0.043101,0.066461,-0.004932,
+ -0.420897,0.3058,0.85401,0.042353,0.065717,-0.005004,
+ -0.319824,0.264582,0.909785,0.043101,0.066461,-0.004932,
+ -0.400865,0.331624,0.85401,0.042997,0.066548,-0.005004,
+ -0.439268,0.278768,0.85401,0.041762,0.064848,-0.005004,
+ -0.350463,0.222411,0.909785,0.041876,0.064776,-0.004932,
+ -0.335806,0.243978,0.909785,0.042462,0.065638,-0.004932,
+ -0.439268,0.278768,0.85401,0.041762,0.064848,-0.005004,
+ -0.335806,0.243978,0.909785,0.042462,0.065638,-0.004932,
+ -0.420897,0.3058,0.85401,0.042353,0.065717,-0.005004,
+ -0.455905,0.250636,0.85401,0.041227,0.063944,-0.005004,
+ -0.363737,0.199966,0.909785,0.041346,0.063878,-0.004932,
+ -0.350463,0.222411,0.909785,0.041876,0.064776,-0.004932,
+ -0.455905,0.250636,0.85401,0.041227,0.063944,-0.005004,
+ -0.350463,0.222411,0.909785,0.041876,0.064776,-0.004932,
+ -0.439268,0.278768,0.85401,0.041762,0.064848,-0.005004,
+ -0.470743,0.221515,0.85401,0.04075,0.063007,-0.005004,
+ -0.375575,0.176732,0.909785,0.040873,0.06295,-0.004932,
+ -0.363737,0.199966,0.909785,0.041346,0.063878,-0.004932,
+ -0.470743,0.221515,0.85401,0.04075,0.063007,-0.005004,
+ -0.363737,0.199966,0.909785,0.041346,0.063878,-0.004932,
+ -0.455905,0.250636,0.85401,0.041227,0.063944,-0.005004,
+ -0.483723,0.191519,0.85401,0.040333,0.062043,-0.005004,
+ -0.385931,0.152801,0.909785,0.040459,0.061993,-0.004932,
+ -0.375575,0.176732,0.909785,0.040873,0.06295,-0.004932,
+ -0.483723,0.191519,0.85401,0.040333,0.062043,-0.005004,
+ -0.375575,0.176732,0.909785,0.040873,0.06295,-0.004932,
+ -0.470743,0.221515,0.85401,0.04075,0.063007,-0.005004,
+ -0.494794,0.160768,0.85401,0.039977,0.061054,-0.005004,
+ -0.394764,0.128267,0.909785,0.040106,0.061012,-0.004932,
+ -0.385931,0.152801,0.909785,0.040459,0.061993,-0.004932,
+ -0.494794,0.160768,0.85401,0.039977,0.061054,-0.005004,
+ -0.385931,0.152801,0.909785,0.040459,0.061993,-0.004932,
+ -0.483723,0.191519,0.85401,0.040333,0.062043,-0.005004,
+ -0.503912,0.129383,0.85401,0.039684,0.060045,-0.005004,
+ -0.402039,0.103226,0.909785,0.039815,0.060012,-0.004932,
+ -0.394764,0.128267,0.909785,0.040106,0.061012,-0.004932,
+ -0.503912,0.129383,0.85401,0.039684,0.060045,-0.005004,
+ -0.394764,0.128267,0.909785,0.040106,0.061012,-0.004932,
+ -0.494794,0.160768,0.85401,0.039977,0.061054,-0.005004,
+ -0.511042,0.097487,0.85401,0.039454,0.05902,-0.005004,
+ -0.407727,0.077778,0.909785,0.039587,0.058994,-0.004932,
+ -0.402039,0.103226,0.909785,0.039815,0.060012,-0.004932,
+ -0.511042,0.097487,0.85401,0.039454,0.05902,-0.005004,
+ -0.402039,0.103226,0.909785,0.039815,0.060012,-0.004932,
+ -0.503912,0.129383,0.85401,0.039684,0.060045,-0.005004,
+ -0.407727,0.077778,0.909785,0.039587,0.058994,-0.004932,
+ -0.298634,0.056967,0.952666,0.039728,0.058967,-0.004877,
+ -0.294467,0.075606,0.952666,0.039953,0.059976,-0.004877,
+ -0.407727,0.077778,0.909785,0.039587,0.058994,-0.004932,
+ -0.294467,0.075606,0.952666,0.039953,0.059976,-0.004877,
+ -0.402039,0.103226,0.909785,0.039815,0.060012,-0.004932,
+ -0.411806,0.052023,0.909785,0.039424,0.057965,-0.004932,
+ -0.301621,0.038104,0.952666,0.039566,0.057947,-0.004877,
+ -0.298634,0.056967,0.952666,0.039728,0.058967,-0.004877,
+ -0.411806,0.052023,0.909785,0.039424,0.057965,-0.004932,
+ -0.298634,0.056967,0.952666,0.039728,0.058967,-0.004877,
+ -0.407727,0.077778,0.909785,0.039587,0.058994,-0.004932,
+ -0.41426,0.026063,0.909785,0.039326,0.056927,-0.004932,
+ -0.303419,0.019089,0.952666,0.039469,0.056918,-0.004877,
+ -0.301621,0.038104,0.952666,0.039566,0.057947,-0.004877,
+ -0.41426,0.026063,0.909785,0.039326,0.056927,-0.004932,
+ -0.301621,0.038104,0.952666,0.039566,0.057947,-0.004877,
+ -0.411806,0.052023,0.909785,0.039424,0.057965,-0.004932,
+ -0.415079,0,0.909785,0.039294,0.055885,-0.004932,
+ -0.304019,0,0.952666,0.039437,0.055885,-0.004877,
+ -0.303419,0.019089,0.952666,0.039469,0.056918,-0.004877,
+ -0.415079,0,0.909785,0.039294,0.055885,-0.004932,
+ -0.303419,0.019089,0.952666,0.039469,0.056918,-0.004877,
+ -0.41426,0.026063,0.909785,0.039326,0.056927,-0.004932,
+ -0.41426,-0.026063,0.909785,0.039326,0.054844,-0.004932,
+ -0.303419,-0.019089,0.952666,0.039469,0.054852,-0.004877,
+ -0.304019,0,0.952666,0.039437,0.055885,-0.004877,
+ -0.41426,-0.026063,0.909785,0.039326,0.054844,-0.004932,
+ -0.304019,0,0.952666,0.039437,0.055885,-0.004877,
+ -0.415079,0,0.909785,0.039294,0.055885,-0.004932,
+ -0.411806,-0.052023,0.909785,0.039424,0.053806,-0.004932,
+ -0.301621,-0.038104,0.952666,0.039566,0.053824,-0.004877,
+ -0.303419,-0.019089,0.952666,0.039469,0.054852,-0.004877,
+ -0.411806,-0.052023,0.909785,0.039424,0.053806,-0.004932,
+ -0.303419,-0.019089,0.952666,0.039469,0.054852,-0.004877,
+ -0.41426,-0.026063,0.909785,0.039326,0.054844,-0.004932,
+ -0.407727,-0.077778,0.909785,0.039587,0.052776,-0.004932,
+ -0.298634,-0.056967,0.952666,0.039728,0.052803,-0.004877,
+ -0.301621,-0.038104,0.952666,0.039566,0.053824,-0.004877,
+ -0.407727,-0.077778,0.909785,0.039587,0.052776,-0.004932,
+ -0.301621,-0.038104,0.952666,0.039566,0.053824,-0.004877,
+ -0.411806,-0.052023,0.909785,0.039424,0.053806,-0.004932,
+ -0.402039,-0.103226,0.909785,0.039815,0.051759,-0.004932,
+ -0.294467,-0.075606,0.952666,0.039953,0.051795,-0.004877,
+ -0.298634,-0.056967,0.952666,0.039728,0.052803,-0.004877,
+ -0.402039,-0.103226,0.909785,0.039815,0.051759,-0.004932,
+ -0.298634,-0.056967,0.952666,0.039728,0.052803,-0.004877,
+ -0.407727,-0.077778,0.909785,0.039587,0.052776,-0.004932,
+ -0.394764,-0.128267,0.909785,0.040106,0.050758,-0.004932,
+ -0.289139,-0.093947,0.952666,0.040242,0.050802,-0.004877,
+ -0.294467,-0.075606,0.952666,0.039953,0.051795,-0.004877,
+ -0.394764,-0.128267,0.909785,0.040106,0.050758,-0.004932,
+ -0.294467,-0.075606,0.952666,0.039953,0.051795,-0.004877,
+ -0.402039,-0.103226,0.909785,0.039815,0.051759,-0.004932,
+ -0.385931,-0.152801,0.909785,0.040459,0.049777,-0.004932,
+ -0.282669,-0.111917,0.952666,0.040592,0.04983,-0.004877,
+ -0.289139,-0.093947,0.952666,0.040242,0.050802,-0.004877,
+ -0.385931,-0.152801,0.909785,0.040459,0.049777,-0.004932,
+ -0.289139,-0.093947,0.952666,0.040242,0.050802,-0.004877,
+ -0.394764,-0.128267,0.909785,0.040106,0.050758,-0.004932,
+ -0.375575,-0.176732,0.909785,0.040873,0.048821,-0.004932,
+ -0.275084,-0.129445,0.952666,0.041002,0.048882,-0.004877,
+ -0.282669,-0.111917,0.952666,0.040592,0.04983,-0.004877,
+ -0.375575,-0.176732,0.909785,0.040873,0.048821,-0.004932,
+ -0.282669,-0.111917,0.952666,0.040592,0.04983,-0.004877,
+ -0.385931,-0.152801,0.909785,0.040459,0.049777,-0.004932,
+ -0.363737,-0.199966,0.909785,0.041346,0.047892,-0.004932,
+ -0.266414,-0.146462,0.952666,0.041471,0.047961,-0.004877,
+ -0.275084,-0.129445,0.952666,0.041002,0.048882,-0.004877,
+ -0.363737,-0.199966,0.909785,0.041346,0.047892,-0.004932,
+ -0.275084,-0.129445,0.952666,0.041002,0.048882,-0.004877,
+ -0.375575,-0.176732,0.909785,0.040873,0.048821,-0.004932,
+ -0.350463,-0.222411,0.909785,0.041876,0.046995,-0.004932,
+ -0.256692,-0.162901,0.952666,0.041997,0.047072,-0.004877,
+ -0.266414,-0.146462,0.952666,0.041471,0.047961,-0.004877,
+ -0.350463,-0.222411,0.909785,0.041876,0.046995,-0.004932,
+ -0.266414,-0.146462,0.952666,0.041471,0.047961,-0.004877,
+ -0.363737,-0.199966,0.909785,0.041346,0.047892,-0.004932,
+ -0.335806,-0.243978,0.909785,0.042462,0.046133,-0.004932,
+ -0.245956,-0.178698,0.952666,0.042578,0.046217,-0.004877,
+ -0.256692,-0.162901,0.952666,0.041997,0.047072,-0.004877,
+ -0.335806,-0.243978,0.909785,0.042462,0.046133,-0.004932,
+ -0.256692,-0.162901,0.952666,0.041997,0.047072,-0.004877,
+ -0.350463,-0.222411,0.909785,0.041876,0.046995,-0.004932,
+ -0.319824,-0.264582,0.909785,0.043101,0.045309,-0.004932,
+ -0.23425,-0.193789,0.952666,0.043211,0.0454,-0.004877,
+ -0.245956,-0.178698,0.952666,0.042578,0.046217,-0.004877,
+ -0.319824,-0.264582,0.909785,0.043101,0.045309,-0.004932,
+ -0.245956,-0.178698,0.952666,0.042578,0.046217,-0.004877,
+ -0.335806,-0.243978,0.909785,0.042462,0.046133,-0.004932,
+ -0.30258,-0.284141,0.909785,0.04379,0.044527,-0.004932,
+ -0.22162,-0.208115,0.952666,0.043895,0.044625,-0.004877,
+ -0.23425,-0.193789,0.952666,0.043211,0.0454,-0.004877,
+ -0.30258,-0.284141,0.909785,0.04379,0.044527,-0.004932,
+ -0.23425,-0.193789,0.952666,0.043211,0.0454,-0.004877,
+ -0.319824,-0.264582,0.909785,0.043101,0.045309,-0.004932,
+ -0.284141,-0.30258,0.909785,0.044527,0.04379,-0.004932,
+ -0.208115,-0.22162,0.952666,0.044625,0.043895,-0.004877,
+ -0.22162,-0.208115,0.952666,0.043895,0.044625,-0.004877,
+ -0.284141,-0.30258,0.909785,0.044527,0.04379,-0.004932,
+ -0.22162,-0.208115,0.952666,0.043895,0.044625,-0.004877,
+ -0.30258,-0.284141,0.909785,0.04379,0.044527,-0.004932,
+ -0.264582,-0.319824,0.909785,0.045309,0.043101,-0.004932,
+ -0.193789,-0.23425,0.952666,0.0454,0.043211,-0.004877,
+ -0.208115,-0.22162,0.952666,0.044625,0.043895,-0.004877,
+ -0.264582,-0.319824,0.909785,0.045309,0.043101,-0.004932,
+ -0.208115,-0.22162,0.952666,0.044625,0.043895,-0.004877,
+ -0.284141,-0.30258,0.909785,0.044527,0.04379,-0.004932,
+ -0.243978,-0.335806,0.909785,0.046133,0.042462,-0.004932,
+ -0.178698,-0.245956,0.952666,0.046217,0.042578,-0.004877,
+ -0.193789,-0.23425,0.952666,0.0454,0.043211,-0.004877,
+ -0.243978,-0.335806,0.909785,0.046133,0.042462,-0.004932,
+ -0.193789,-0.23425,0.952666,0.0454,0.043211,-0.004877,
+ -0.264582,-0.319824,0.909785,0.045309,0.043101,-0.004932,
+ -0.222411,-0.350463,0.909785,0.046995,0.041876,-0.004932,
+ -0.162901,-0.256692,0.952666,0.047072,0.041997,-0.004877,
+ -0.178698,-0.245956,0.952666,0.046217,0.042578,-0.004877,
+ -0.222411,-0.350463,0.909785,0.046995,0.041876,-0.004932,
+ -0.178698,-0.245956,0.952666,0.046217,0.042578,-0.004877,
+ -0.243978,-0.335806,0.909785,0.046133,0.042462,-0.004932,
+ -0.199966,-0.363737,0.909785,0.047892,0.041346,-0.004932,
+ -0.146462,-0.266414,0.952666,0.047961,0.041471,-0.004877,
+ -0.162901,-0.256692,0.952666,0.047072,0.041997,-0.004877,
+ -0.199966,-0.363737,0.909785,0.047892,0.041346,-0.004932,
+ -0.162901,-0.256692,0.952666,0.047072,0.041997,-0.004877,
+ -0.222411,-0.350463,0.909785,0.046995,0.041876,-0.004932,
+ -0.176732,-0.375575,0.909785,0.048821,0.040873,-0.004932,
+ -0.129445,-0.275084,0.952666,0.048882,0.041002,-0.004877,
+ -0.146462,-0.266414,0.952666,0.047961,0.041471,-0.004877,
+ -0.176732,-0.375575,0.909785,0.048821,0.040873,-0.004932,
+ -0.146462,-0.266414,0.952666,0.047961,0.041471,-0.004877,
+ -0.199966,-0.363737,0.909785,0.047892,0.041346,-0.004932,
+ -0.152801,-0.385931,0.909785,0.049777,0.040459,-0.004932,
+ -0.111917,-0.282669,0.952666,0.04983,0.040592,-0.004877,
+ -0.129445,-0.275084,0.952666,0.048882,0.041002,-0.004877,
+ -0.152801,-0.385931,0.909785,0.049777,0.040459,-0.004932,
+ -0.129445,-0.275084,0.952666,0.048882,0.041002,-0.004877,
+ -0.176732,-0.375575,0.909785,0.048821,0.040873,-0.004932,
+ -0.128267,-0.394764,0.909785,0.050758,0.040106,-0.004932,
+ -0.093947,-0.289139,0.952666,0.050802,0.040242,-0.004877,
+ -0.111917,-0.282669,0.952666,0.04983,0.040592,-0.004877,
+ -0.128267,-0.394764,0.909785,0.050758,0.040106,-0.004932,
+ -0.111917,-0.282669,0.952666,0.04983,0.040592,-0.004877,
+ -0.152801,-0.385931,0.909785,0.049777,0.040459,-0.004932,
+ -0.103226,-0.402039,0.909785,0.051759,0.039815,-0.004932,
+ -0.075606,-0.294467,0.952666,0.051795,0.039953,-0.004877,
+ -0.093947,-0.289139,0.952666,0.050802,0.040242,-0.004877,
+ -0.103226,-0.402039,0.909785,0.051759,0.039815,-0.004932,
+ -0.093947,-0.289139,0.952666,0.050802,0.040242,-0.004877,
+ -0.128267,-0.394764,0.909785,0.050758,0.040106,-0.004932,
+ -0.077778,-0.407727,0.909785,0.052776,0.039587,-0.004932,
+ -0.056967,-0.298634,0.952666,0.052803,0.039728,-0.004877,
+ -0.075606,-0.294467,0.952666,0.051795,0.039953,-0.004877,
+ -0.077778,-0.407727,0.909785,0.052776,0.039587,-0.004932,
+ -0.075606,-0.294467,0.952666,0.051795,0.039953,-0.004877,
+ -0.103226,-0.402039,0.909785,0.051759,0.039815,-0.004932,
+ -0.052023,-0.411806,0.909785,0.053806,0.039424,-0.004932,
+ -0.038104,-0.301621,0.952666,0.053824,0.039566,-0.004877,
+ -0.056967,-0.298634,0.952666,0.052803,0.039728,-0.004877,
+ -0.052023,-0.411806,0.909785,0.053806,0.039424,-0.004932,
+ -0.056967,-0.298634,0.952666,0.052803,0.039728,-0.004877,
+ -0.077778,-0.407727,0.909785,0.052776,0.039587,-0.004932,
+ -0.026063,-0.41426,0.909785,0.054844,0.039326,-0.004932,
+ -0.019089,-0.303419,0.952666,0.054852,0.039469,-0.004877,
+ -0.038104,-0.301621,0.952666,0.053824,0.039566,-0.004877,
+ -0.026063,-0.41426,0.909785,0.054844,0.039326,-0.004932,
+ -0.038104,-0.301621,0.952666,0.053824,0.039566,-0.004877,
+ -0.052023,-0.411806,0.909785,0.053806,0.039424,-0.004932,
+ 0,-0.415079,0.909785,0.055885,0.039294,-0.004932,
+ 0,-0.304019,0.952666,0.055885,0.039437,-0.004877,
+ -0.019089,-0.303419,0.952666,0.054852,0.039469,-0.004877,
+ 0,-0.415079,0.909785,0.055885,0.039294,-0.004932,
+ -0.019089,-0.303419,0.952666,0.054852,0.039469,-0.004877,
+ -0.026063,-0.41426,0.909785,0.054844,0.039326,-0.004932,
+ 0.026063,-0.41426,0.909785,0.056927,0.039326,-0.004932,
+ 0.019089,-0.303419,0.952666,0.056918,0.039469,-0.004877,
+ 0,-0.304019,0.952666,0.055885,0.039437,-0.004877,
+ 0.026063,-0.41426,0.909785,0.056927,0.039326,-0.004932,
+ 0,-0.304019,0.952666,0.055885,0.039437,-0.004877,
+ 0,-0.415079,0.909785,0.055885,0.039294,-0.004932,
+ 0.052023,-0.411806,0.909785,0.057965,0.039424,-0.004932,
+ 0.038104,-0.301621,0.952666,0.057947,0.039566,-0.004877,
+ 0.019089,-0.303419,0.952666,0.056918,0.039469,-0.004877,
+ 0.052023,-0.411806,0.909785,0.057965,0.039424,-0.004932,
+ 0.019089,-0.303419,0.952666,0.056918,0.039469,-0.004877,
+ 0.026063,-0.41426,0.909785,0.056927,0.039326,-0.004932,
+ 0.077778,-0.407727,0.909785,0.058994,0.039587,-0.004932,
+ 0.056967,-0.298634,0.952666,0.058967,0.039728,-0.004877,
+ 0.038104,-0.301621,0.952666,0.057947,0.039566,-0.004877,
+ 0.077778,-0.407727,0.909785,0.058994,0.039587,-0.004932,
+ 0.038104,-0.301621,0.952666,0.057947,0.039566,-0.004877,
+ 0.052023,-0.411806,0.909785,0.057965,0.039424,-0.004932,
+ 0.103226,-0.402039,0.909785,0.060012,0.039815,-0.004932,
+ 0.075606,-0.294467,0.952666,0.059976,0.039953,-0.004877,
+ 0.056967,-0.298634,0.952666,0.058967,0.039728,-0.004877,
+ 0.103226,-0.402039,0.909785,0.060012,0.039815,-0.004932,
+ 0.056967,-0.298634,0.952666,0.058967,0.039728,-0.004877,
+ 0.077778,-0.407727,0.909785,0.058994,0.039587,-0.004932,
+ 0.128267,-0.394764,0.909785,0.061012,0.040106,-0.004932,
+ 0.093947,-0.289139,0.952666,0.060968,0.040242,-0.004877,
+ 0.075606,-0.294467,0.952666,0.059976,0.039953,-0.004877,
+ 0.128267,-0.394764,0.909785,0.061012,0.040106,-0.004932,
+ 0.075606,-0.294467,0.952666,0.059976,0.039953,-0.004877,
+ 0.103226,-0.402039,0.909785,0.060012,0.039815,-0.004932,
+ 0.152801,-0.385931,0.909785,0.061993,0.040459,-0.004932,
+ 0.111917,-0.282669,0.952666,0.061941,0.040592,-0.004877,
+ 0.093947,-0.289139,0.952666,0.060968,0.040242,-0.004877,
+ 0.152801,-0.385931,0.909785,0.061993,0.040459,-0.004932,
+ 0.093947,-0.289139,0.952666,0.060968,0.040242,-0.004877,
+ 0.128267,-0.394764,0.909785,0.061012,0.040106,-0.004932,
+ 0.176732,-0.375575,0.909785,0.06295,0.040873,-0.004932,
+ 0.129445,-0.275084,0.952666,0.062889,0.041002,-0.004877,
+ 0.111917,-0.282669,0.952666,0.061941,0.040592,-0.004877,
+ 0.176732,-0.375575,0.909785,0.06295,0.040873,-0.004932,
+ 0.111917,-0.282669,0.952666,0.061941,0.040592,-0.004877,
+ 0.152801,-0.385931,0.909785,0.061993,0.040459,-0.004932,
+ 0.199966,-0.363737,0.909785,0.063878,0.041346,-0.004932,
+ 0.146462,-0.266414,0.952666,0.063809,0.041471,-0.004877,
+ 0.129445,-0.275084,0.952666,0.062889,0.041002,-0.004877,
+ 0.199966,-0.363737,0.909785,0.063878,0.041346,-0.004932,
+ 0.129445,-0.275084,0.952666,0.062889,0.041002,-0.004877,
+ 0.176732,-0.375575,0.909785,0.06295,0.040873,-0.004932,
+ 0.222411,-0.350463,0.909785,0.064776,0.041876,-0.004932,
+ 0.162901,-0.256692,0.952666,0.064699,0.041997,-0.004877,
+ 0.146462,-0.266414,0.952666,0.063809,0.041471,-0.004877,
+ 0.222411,-0.350463,0.909785,0.064776,0.041876,-0.004932,
+ 0.146462,-0.266414,0.952666,0.063809,0.041471,-0.004877,
+ 0.199966,-0.363737,0.909785,0.063878,0.041346,-0.004932,
+ 0.243978,-0.335806,0.909785,0.065638,0.042462,-0.004932,
+ 0.178698,-0.245956,0.952666,0.065554,0.042578,-0.004877,
+ 0.162901,-0.256692,0.952666,0.064699,0.041997,-0.004877,
+ 0.243978,-0.335806,0.909785,0.065638,0.042462,-0.004932,
+ 0.162901,-0.256692,0.952666,0.064699,0.041997,-0.004877,
+ 0.222411,-0.350463,0.909785,0.064776,0.041876,-0.004932,
+ 0.264582,-0.319824,0.909785,0.066461,0.043101,-0.004932,
+ 0.193789,-0.23425,0.952666,0.06637,0.043211,-0.004877,
+ 0.178698,-0.245956,0.952666,0.065554,0.042578,-0.004877,
+ 0.264582,-0.319824,0.909785,0.066461,0.043101,-0.004932,
+ 0.178698,-0.245956,0.952666,0.065554,0.042578,-0.004877,
+ 0.243978,-0.335806,0.909785,0.065638,0.042462,-0.004932,
+ 0.284141,-0.30258,0.909785,0.067243,0.04379,-0.004932,
+ 0.208115,-0.22162,0.952666,0.067145,0.043895,-0.004877,
+ 0.193789,-0.23425,0.952666,0.06637,0.043211,-0.004877,
+ 0.284141,-0.30258,0.909785,0.067243,0.04379,-0.004932,
+ 0.193789,-0.23425,0.952666,0.06637,0.043211,-0.004877,
+ 0.264582,-0.319824,0.909785,0.066461,0.043101,-0.004932,
+ 0.30258,-0.284141,0.909785,0.06798,0.044527,-0.004932,
+ 0.22162,-0.208115,0.952666,0.067876,0.044625,-0.004877,
+ 0.208115,-0.22162,0.952666,0.067145,0.043895,-0.004877,
+ 0.30258,-0.284141,0.909785,0.06798,0.044527,-0.004932,
+ 0.208115,-0.22162,0.952666,0.067145,0.043895,-0.004877,
+ 0.284141,-0.30258,0.909785,0.067243,0.04379,-0.004932,
+ 0.319824,-0.264582,0.909785,0.06867,0.045309,-0.004932,
+ 0.23425,-0.193789,0.952666,0.068559,0.0454,-0.004877,
+ 0.22162,-0.208115,0.952666,0.067876,0.044625,-0.004877,
+ 0.319824,-0.264582,0.909785,0.06867,0.045309,-0.004932,
+ 0.22162,-0.208115,0.952666,0.067876,0.044625,-0.004877,
+ 0.30258,-0.284141,0.909785,0.06798,0.044527,-0.004932,
+ 0.335806,-0.243978,0.909785,0.069308,0.046133,-0.004932,
+ 0.245956,-0.178698,0.952666,0.069193,0.046217,-0.004877,
+ 0.23425,-0.193789,0.952666,0.068559,0.0454,-0.004877,
+ 0.335806,-0.243978,0.909785,0.069308,0.046133,-0.004932,
+ 0.23425,-0.193789,0.952666,0.068559,0.0454,-0.004877,
+ 0.319824,-0.264582,0.909785,0.06867,0.045309,-0.004932,
+ 0.350463,-0.222411,0.909785,0.069894,0.046995,-0.004932,
+ 0.256692,-0.162901,0.952666,0.069773,0.047072,-0.004877,
+ 0.245956,-0.178698,0.952666,0.069193,0.046217,-0.004877,
+ 0.350463,-0.222411,0.909785,0.069894,0.046995,-0.004932,
+ 0.245956,-0.178698,0.952666,0.069193,0.046217,-0.004877,
+ 0.335806,-0.243978,0.909785,0.069308,0.046133,-0.004932,
+ 0.363737,-0.199966,0.909785,0.070425,0.047892,-0.004932,
+ 0.266414,-0.146462,0.952666,0.070299,0.047961,-0.004877,
+ 0.256692,-0.162901,0.952666,0.069773,0.047072,-0.004877,
+ 0.363737,-0.199966,0.909785,0.070425,0.047892,-0.004932,
+ 0.256692,-0.162901,0.952666,0.069773,0.047072,-0.004877,
+ 0.350463,-0.222411,0.909785,0.069894,0.046995,-0.004932,
+ 0.375575,-0.176732,0.909785,0.070898,0.048821,-0.004932,
+ 0.275084,-0.129445,0.952666,0.070769,0.048882,-0.004877,
+ 0.266414,-0.146462,0.952666,0.070299,0.047961,-0.004877,
+ 0.375575,-0.176732,0.909785,0.070898,0.048821,-0.004932,
+ 0.266414,-0.146462,0.952666,0.070299,0.047961,-0.004877,
+ 0.363737,-0.199966,0.909785,0.070425,0.047892,-0.004932,
+ 0.385931,-0.152801,0.909785,0.071312,0.049777,-0.004932,
+ 0.282669,-0.111917,0.952666,0.071179,0.04983,-0.004877,
+ 0.275084,-0.129445,0.952666,0.070769,0.048882,-0.004877,
+ 0.385931,-0.152801,0.909785,0.071312,0.049777,-0.004932,
+ 0.275084,-0.129445,0.952666,0.070769,0.048882,-0.004877,
+ 0.375575,-0.176732,0.909785,0.070898,0.048821,-0.004932,
+ 0.394764,-0.128267,0.909785,0.071665,0.050758,-0.004932,
+ 0.289139,-0.093947,0.952666,0.071529,0.050802,-0.004877,
+ 0.282669,-0.111917,0.952666,0.071179,0.04983,-0.004877,
+ 0.394764,-0.128267,0.909785,0.071665,0.050758,-0.004932,
+ 0.282669,-0.111917,0.952666,0.071179,0.04983,-0.004877,
+ 0.385931,-0.152801,0.909785,0.071312,0.049777,-0.004932,
+ 0.402039,-0.103226,0.909785,0.071956,0.051759,-0.004932,
+ 0.294467,-0.075606,0.952666,0.071817,0.051795,-0.004877,
+ 0.289139,-0.093947,0.952666,0.071529,0.050802,-0.004877,
+ 0.402039,-0.103226,0.909785,0.071956,0.051759,-0.004932,
+ 0.289139,-0.093947,0.952666,0.071529,0.050802,-0.004877,
+ 0.394764,-0.128267,0.909785,0.071665,0.050758,-0.004932,
+ 0.407727,-0.077778,0.909785,0.072183,0.052776,-0.004932,
+ 0.298634,-0.056967,0.952666,0.072043,0.052803,-0.004877,
+ 0.294467,-0.075606,0.952666,0.071817,0.051795,-0.004877,
+ 0.407727,-0.077778,0.909785,0.072183,0.052776,-0.004932,
+ 0.294467,-0.075606,0.952666,0.071817,0.051795,-0.004877,
+ 0.402039,-0.103226,0.909785,0.071956,0.051759,-0.004932,
+ 0.411806,-0.052023,0.909785,0.072346,0.053806,-0.004932,
+ 0.301621,-0.038104,0.952666,0.072204,0.053824,-0.004877,
+ 0.298634,-0.056967,0.952666,0.072043,0.052803,-0.004877,
+ 0.411806,-0.052023,0.909785,0.072346,0.053806,-0.004932,
+ 0.298634,-0.056967,0.952666,0.072043,0.052803,-0.004877,
+ 0.407727,-0.077778,0.909785,0.072183,0.052776,-0.004932,
+ 0.41426,-0.026063,0.909785,0.072444,0.054844,-0.004932,
+ 0.303419,-0.019089,0.952666,0.072302,0.054852,-0.004877,
+ 0.301621,-0.038104,0.952666,0.072204,0.053824,-0.004877,
+ 0.41426,-0.026063,0.909785,0.072444,0.054844,-0.004932,
+ 0.301621,-0.038104,0.952666,0.072204,0.053824,-0.004877,
+ 0.411806,-0.052023,0.909785,0.072346,0.053806,-0.004932,
+ 0.415079,0,0.909785,0.072477,0.055885,-0.004932,
+ 0.304019,0,0.952666,0.072334,0.055885,-0.004877,
+ 0.303419,-0.019089,0.952666,0.072302,0.054852,-0.004877,
+ 0.415079,0,0.909785,0.072477,0.055885,-0.004932,
+ 0.303419,-0.019089,0.952666,0.072302,0.054852,-0.004877,
+ 0.41426,-0.026063,0.909785,0.072444,0.054844,-0.004932,
+ 0.41426,0.026063,0.909785,0.072444,0.056927,-0.004932,
+ 0.303419,0.019089,0.952666,0.072302,0.056918,-0.004877,
+ 0.304019,0,0.952666,0.072334,0.055885,-0.004877,
+ 0.41426,0.026063,0.909785,0.072444,0.056927,-0.004932,
+ 0.304019,0,0.952666,0.072334,0.055885,-0.004877,
+ 0.415079,0,0.909785,0.072477,0.055885,-0.004932,
+ 0.411806,0.052023,0.909785,0.072346,0.057965,-0.004932,
+ 0.301621,0.038104,0.952666,0.072204,0.057947,-0.004877,
+ 0.303419,0.019089,0.952666,0.072302,0.056918,-0.004877,
+ 0.411806,0.052023,0.909785,0.072346,0.057965,-0.004932,
+ 0.303419,0.019089,0.952666,0.072302,0.056918,-0.004877,
+ 0.41426,0.026063,0.909785,0.072444,0.056927,-0.004932,
+ 0.407727,0.077778,0.909785,0.072183,0.058994,-0.004932,
+ 0.298634,0.056967,0.952666,0.072043,0.058967,-0.004877,
+ 0.301621,0.038104,0.952666,0.072204,0.057947,-0.004877,
+ 0.407727,0.077778,0.909785,0.072183,0.058994,-0.004932,
+ 0.301621,0.038104,0.952666,0.072204,0.057947,-0.004877,
+ 0.411806,0.052023,0.909785,0.072346,0.057965,-0.004932,
+ 0.402039,0.103226,0.909785,0.071956,0.060012,-0.004932,
+ 0.294467,0.075606,0.952666,0.071817,0.059976,-0.004877,
+ 0.298634,0.056967,0.952666,0.072043,0.058967,-0.004877,
+ 0.402039,0.103226,0.909785,0.071956,0.060012,-0.004932,
+ 0.298634,0.056967,0.952666,0.072043,0.058967,-0.004877,
+ 0.407727,0.077778,0.909785,0.072183,0.058994,-0.004932,
+ 0.394764,0.128267,0.909785,0.071665,0.061012,-0.004932,
+ 0.289139,0.093947,0.952666,0.071529,0.060968,-0.004877,
+ 0.294467,0.075606,0.952666,0.071817,0.059976,-0.004877,
+ 0.394764,0.128267,0.909785,0.071665,0.061012,-0.004932,
+ 0.294467,0.075606,0.952666,0.071817,0.059976,-0.004877,
+ 0.402039,0.103226,0.909785,0.071956,0.060012,-0.004932,
+ 0.385931,0.152801,0.909785,0.071312,0.061993,-0.004932,
+ 0.282669,0.111917,0.952666,0.071179,0.061941,-0.004877,
+ 0.289139,0.093947,0.952666,0.071529,0.060968,-0.004877,
+ 0.385931,0.152801,0.909785,0.071312,0.061993,-0.004932,
+ 0.289139,0.093947,0.952666,0.071529,0.060968,-0.004877,
+ 0.394764,0.128267,0.909785,0.071665,0.061012,-0.004932,
+ 0.375575,0.176732,0.909785,0.070898,0.06295,-0.004932,
+ 0.275084,0.129445,0.952666,0.070769,0.062889,-0.004877,
+ 0.282669,0.111917,0.952666,0.071179,0.061941,-0.004877,
+ 0.375575,0.176732,0.909785,0.070898,0.06295,-0.004932,
+ 0.282669,0.111917,0.952666,0.071179,0.061941,-0.004877,
+ 0.385931,0.152801,0.909785,0.071312,0.061993,-0.004932,
+ 0.363737,0.199966,0.909785,0.070425,0.063878,-0.004932,
+ 0.266414,0.146462,0.952666,0.070299,0.063809,-0.004877,
+ 0.275084,0.129445,0.952666,0.070769,0.062889,-0.004877,
+ 0.363737,0.199966,0.909785,0.070425,0.063878,-0.004932,
+ 0.275084,0.129445,0.952666,0.070769,0.062889,-0.004877,
+ 0.375575,0.176732,0.909785,0.070898,0.06295,-0.004932,
+ 0.350463,0.222411,0.909785,0.069894,0.064776,-0.004932,
+ 0.256692,0.162901,0.952666,0.069773,0.064699,-0.004877,
+ 0.266414,0.146462,0.952666,0.070299,0.063809,-0.004877,
+ 0.350463,0.222411,0.909785,0.069894,0.064776,-0.004932,
+ 0.266414,0.146462,0.952666,0.070299,0.063809,-0.004877,
+ 0.363737,0.199966,0.909785,0.070425,0.063878,-0.004932,
+ 0.335806,0.243978,0.909785,0.069308,0.065638,-0.004932,
+ 0.245956,0.178698,0.952666,0.069193,0.065554,-0.004877,
+ 0.256692,0.162901,0.952666,0.069773,0.064699,-0.004877,
+ 0.335806,0.243978,0.909785,0.069308,0.065638,-0.004932,
+ 0.256692,0.162901,0.952666,0.069773,0.064699,-0.004877,
+ 0.350463,0.222411,0.909785,0.069894,0.064776,-0.004932,
+ 0.319824,0.264582,0.909785,0.06867,0.066461,-0.004932,
+ 0.23425,0.193789,0.952666,0.068559,0.06637,-0.004877,
+ 0.245956,0.178698,0.952666,0.069193,0.065554,-0.004877,
+ 0.319824,0.264582,0.909785,0.06867,0.066461,-0.004932,
+ 0.245956,0.178698,0.952666,0.069193,0.065554,-0.004877,
+ 0.335806,0.243978,0.909785,0.069308,0.065638,-0.004932,
+ 0.30258,0.284141,0.909785,0.06798,0.067243,-0.004932,
+ 0.22162,0.208115,0.952666,0.067876,0.067145,-0.004877,
+ 0.23425,0.193789,0.952666,0.068559,0.06637,-0.004877,
+ 0.30258,0.284141,0.909785,0.06798,0.067243,-0.004932,
+ 0.23425,0.193789,0.952666,0.068559,0.06637,-0.004877,
+ 0.319824,0.264582,0.909785,0.06867,0.066461,-0.004932,
+ 0.284141,0.30258,0.909785,0.067243,0.06798,-0.004932,
+ 0.208115,0.22162,0.952666,0.067145,0.067876,-0.004877,
+ 0.22162,0.208115,0.952666,0.067876,0.067145,-0.004877,
+ 0.284141,0.30258,0.909785,0.067243,0.06798,-0.004932,
+ 0.22162,0.208115,0.952666,0.067876,0.067145,-0.004877,
+ 0.30258,0.284141,0.909785,0.06798,0.067243,-0.004932,
+ 0.264582,0.319824,0.909785,0.066461,0.06867,-0.004932,
+ 0.193789,0.23425,0.952666,0.06637,0.068559,-0.004877,
+ 0.208115,0.22162,0.952666,0.067145,0.067876,-0.004877,
+ 0.264582,0.319824,0.909785,0.066461,0.06867,-0.004932,
+ 0.208115,0.22162,0.952666,0.067145,0.067876,-0.004877,
+ 0.284141,0.30258,0.909785,0.067243,0.06798,-0.004932,
+ 0.243978,0.335806,0.909785,0.065638,0.069308,-0.004932,
+ 0.178698,0.245956,0.952666,0.065554,0.069193,-0.004877,
+ 0.193789,0.23425,0.952666,0.06637,0.068559,-0.004877,
+ 0.243978,0.335806,0.909785,0.065638,0.069308,-0.004932,
+ 0.193789,0.23425,0.952666,0.06637,0.068559,-0.004877,
+ 0.264582,0.319824,0.909785,0.066461,0.06867,-0.004932,
+ 0.222411,0.350463,0.909785,0.064776,0.069894,-0.004932,
+ 0.162901,0.256692,0.952666,0.064699,0.069773,-0.004877,
+ 0.178698,0.245956,0.952666,0.065554,0.069193,-0.004877,
+ 0.222411,0.350463,0.909785,0.064776,0.069894,-0.004932,
+ 0.178698,0.245956,0.952666,0.065554,0.069193,-0.004877,
+ 0.243978,0.335806,0.909785,0.065638,0.069308,-0.004932,
+ 0.199966,0.363737,0.909785,0.063878,0.070425,-0.004932,
+ 0.146462,0.266414,0.952666,0.063809,0.070299,-0.004877,
+ 0.162901,0.256692,0.952666,0.064699,0.069773,-0.004877,
+ 0.199966,0.363737,0.909785,0.063878,0.070425,-0.004932,
+ 0.162901,0.256692,0.952666,0.064699,0.069773,-0.004877,
+ 0.222411,0.350463,0.909785,0.064776,0.069894,-0.004932,
+ 0.176732,0.375575,0.909785,0.06295,0.070898,-0.004932,
+ 0.129445,0.275084,0.952666,0.062889,0.070769,-0.004877,
+ 0.146462,0.266414,0.952666,0.063809,0.070299,-0.004877,
+ 0.176732,0.375575,0.909785,0.06295,0.070898,-0.004932,
+ 0.146462,0.266414,0.952666,0.063809,0.070299,-0.004877,
+ 0.199966,0.363737,0.909785,0.063878,0.070425,-0.004932,
+ 0.152801,0.385931,0.909785,0.061993,0.071312,-0.004932,
+ 0.111917,0.282669,0.952666,0.061941,0.071179,-0.004877,
+ 0.129445,0.275084,0.952666,0.062889,0.070769,-0.004877,
+ 0.152801,0.385931,0.909785,0.061993,0.071312,-0.004932,
+ 0.129445,0.275084,0.952666,0.062889,0.070769,-0.004877,
+ 0.176732,0.375575,0.909785,0.06295,0.070898,-0.004932,
+ 0.128267,0.394764,0.909785,0.061012,0.071665,-0.004932,
+ 0.093947,0.289139,0.952666,0.060968,0.071529,-0.004877,
+ 0.111917,0.282669,0.952666,0.061941,0.071179,-0.004877,
+ 0.128267,0.394764,0.909785,0.061012,0.071665,-0.004932,
+ 0.111917,0.282669,0.952666,0.061941,0.071179,-0.004877,
+ 0.152801,0.385931,0.909785,0.061993,0.071312,-0.004932,
+ 0.103226,0.402039,0.909785,0.060012,0.071956,-0.004932,
+ 0.075606,0.294467,0.952666,0.059976,0.071817,-0.004877,
+ 0.093947,0.289139,0.952666,0.060968,0.071529,-0.004877,
+ 0.103226,0.402039,0.909785,0.060012,0.071956,-0.004932,
+ 0.093947,0.289139,0.952666,0.060968,0.071529,-0.004877,
+ 0.128267,0.394764,0.909785,0.061012,0.071665,-0.004932,
+ 0.077778,0.407727,0.909785,0.058994,0.072183,-0.004932,
+ 0.056967,0.298634,0.952666,0.058967,0.072043,-0.004877,
+ 0.075606,0.294467,0.952666,0.059976,0.071817,-0.004877,
+ 0.077778,0.407727,0.909785,0.058994,0.072183,-0.004932,
+ 0.075606,0.294467,0.952666,0.059976,0.071817,-0.004877,
+ 0.103226,0.402039,0.909785,0.060012,0.071956,-0.004932,
+ 0.052023,0.411806,0.909785,0.057965,0.072346,-0.004932,
+ 0.038104,0.301621,0.952666,0.057947,0.072204,-0.004877,
+ 0.056967,0.298634,0.952666,0.058967,0.072043,-0.004877,
+ 0.052023,0.411806,0.909785,0.057965,0.072346,-0.004932,
+ 0.056967,0.298634,0.952666,0.058967,0.072043,-0.004877,
+ 0.077778,0.407727,0.909785,0.058994,0.072183,-0.004932,
+ 0.026063,0.41426,0.909785,0.056927,0.072444,-0.004932,
+ 0.019089,0.303419,0.952666,0.056918,0.072302,-0.004877,
+ 0.038104,0.301621,0.952666,0.057947,0.072204,-0.004877,
+ 0.026063,0.41426,0.909785,0.056927,0.072444,-0.004932,
+ 0.038104,0.301621,0.952666,0.057947,0.072204,-0.004877,
+ 0.052023,0.411806,0.909785,0.057965,0.072346,-0.004932,
+ 0,0.415079,0.909785,0.055885,0.072477,-0.004932,
+ 0,0.304019,0.952666,0.055885,0.072334,-0.004877,
+ 0.019089,0.303419,0.952666,0.056918,0.072302,-0.004877,
+ 0,0.415079,0.909785,0.055885,0.072477,-0.004932,
+ 0.019089,0.303419,0.952666,0.056918,0.072302,-0.004877,
+ 0.026063,0.41426,0.909785,0.056927,0.072444,-0.004932,
+ -0.026063,0.41426,0.909785,0.054844,0.072444,-0.004932,
+ -0.019089,0.303419,0.952666,0.054852,0.072302,-0.004877,
+ 0,0.304019,0.952666,0.055885,0.072334,-0.004877,
+ -0.026063,0.41426,0.909785,0.054844,0.072444,-0.004932,
+ 0,0.304019,0.952666,0.055885,0.072334,-0.004877,
+ 0,0.415079,0.909785,0.055885,0.072477,-0.004932,
+ -0.052023,0.411806,0.909785,0.053806,0.072346,-0.004932,
+ -0.038104,0.301621,0.952666,0.053824,0.072204,-0.004877,
+ -0.019089,0.303419,0.952666,0.054852,0.072302,-0.004877,
+ -0.052023,0.411806,0.909785,0.053806,0.072346,-0.004932,
+ -0.019089,0.303419,0.952666,0.054852,0.072302,-0.004877,
+ -0.026063,0.41426,0.909785,0.054844,0.072444,-0.004932,
+ -0.077778,0.407727,0.909785,0.052776,0.072183,-0.004932,
+ -0.056967,0.298634,0.952666,0.052803,0.072043,-0.004877,
+ -0.038104,0.301621,0.952666,0.053824,0.072204,-0.004877,
+ -0.077778,0.407727,0.909785,0.052776,0.072183,-0.004932,
+ -0.038104,0.301621,0.952666,0.053824,0.072204,-0.004877,
+ -0.052023,0.411806,0.909785,0.053806,0.072346,-0.004932,
+ -0.103226,0.402039,0.909785,0.051759,0.071956,-0.004932,
+ -0.075606,0.294467,0.952666,0.051795,0.071817,-0.004877,
+ -0.056967,0.298634,0.952666,0.052803,0.072043,-0.004877,
+ -0.103226,0.402039,0.909785,0.051759,0.071956,-0.004932,
+ -0.056967,0.298634,0.952666,0.052803,0.072043,-0.004877,
+ -0.077778,0.407727,0.909785,0.052776,0.072183,-0.004932,
+ -0.128267,0.394764,0.909785,0.050758,0.071665,-0.004932,
+ -0.093947,0.289139,0.952666,0.050802,0.071529,-0.004877,
+ -0.075606,0.294467,0.952666,0.051795,0.071817,-0.004877,
+ -0.128267,0.394764,0.909785,0.050758,0.071665,-0.004932,
+ -0.075606,0.294467,0.952666,0.051795,0.071817,-0.004877,
+ -0.103226,0.402039,0.909785,0.051759,0.071956,-0.004932,
+ -0.152801,0.385931,0.909785,0.049777,0.071312,-0.004932,
+ -0.111917,0.282669,0.952666,0.04983,0.071179,-0.004877,
+ -0.093947,0.289139,0.952666,0.050802,0.071529,-0.004877,
+ -0.152801,0.385931,0.909785,0.049777,0.071312,-0.004932,
+ -0.093947,0.289139,0.952666,0.050802,0.071529,-0.004877,
+ -0.128267,0.394764,0.909785,0.050758,0.071665,-0.004932,
+ -0.176732,0.375575,0.909785,0.048821,0.070898,-0.004932,
+ -0.129445,0.275084,0.952666,0.048882,0.070769,-0.004877,
+ -0.111917,0.282669,0.952666,0.04983,0.071179,-0.004877,
+ -0.176732,0.375575,0.909785,0.048821,0.070898,-0.004932,
+ -0.111917,0.282669,0.952666,0.04983,0.071179,-0.004877,
+ -0.152801,0.385931,0.909785,0.049777,0.071312,-0.004932,
+ -0.199966,0.363737,0.909785,0.047892,0.070425,-0.004932,
+ -0.146462,0.266414,0.952666,0.047961,0.070299,-0.004877,
+ -0.129445,0.275084,0.952666,0.048882,0.070769,-0.004877,
+ -0.199966,0.363737,0.909785,0.047892,0.070425,-0.004932,
+ -0.129445,0.275084,0.952666,0.048882,0.070769,-0.004877,
+ -0.176732,0.375575,0.909785,0.048821,0.070898,-0.004932,
+ -0.222411,0.350463,0.909785,0.046995,0.069894,-0.004932,
+ -0.162901,0.256692,0.952666,0.047072,0.069773,-0.004877,
+ -0.146462,0.266414,0.952666,0.047961,0.070299,-0.004877,
+ -0.222411,0.350463,0.909785,0.046995,0.069894,-0.004932,
+ -0.146462,0.266414,0.952666,0.047961,0.070299,-0.004877,
+ -0.199966,0.363737,0.909785,0.047892,0.070425,-0.004932,
+ -0.243978,0.335806,0.909785,0.046133,0.069308,-0.004932,
+ -0.178698,0.245956,0.952666,0.046217,0.069193,-0.004877,
+ -0.162901,0.256692,0.952666,0.047072,0.069773,-0.004877,
+ -0.243978,0.335806,0.909785,0.046133,0.069308,-0.004932,
+ -0.162901,0.256692,0.952666,0.047072,0.069773,-0.004877,
+ -0.222411,0.350463,0.909785,0.046995,0.069894,-0.004932,
+ -0.264582,0.319824,0.909785,0.045309,0.06867,-0.004932,
+ -0.193789,0.23425,0.952666,0.0454,0.068559,-0.004877,
+ -0.178698,0.245956,0.952666,0.046217,0.069193,-0.004877,
+ -0.264582,0.319824,0.909785,0.045309,0.06867,-0.004932,
+ -0.178698,0.245956,0.952666,0.046217,0.069193,-0.004877,
+ -0.243978,0.335806,0.909785,0.046133,0.069308,-0.004932,
+ -0.284141,0.30258,0.909785,0.044527,0.06798,-0.004932,
+ -0.208115,0.22162,0.952666,0.044625,0.067876,-0.004877,
+ -0.193789,0.23425,0.952666,0.0454,0.068559,-0.004877,
+ -0.284141,0.30258,0.909785,0.044527,0.06798,-0.004932,
+ -0.193789,0.23425,0.952666,0.0454,0.068559,-0.004877,
+ -0.264582,0.319824,0.909785,0.045309,0.06867,-0.004932,
+ -0.30258,0.284141,0.909785,0.04379,0.067243,-0.004932,
+ -0.22162,0.208115,0.952666,0.043895,0.067145,-0.004877,
+ -0.208115,0.22162,0.952666,0.044625,0.067876,-0.004877,
+ -0.30258,0.284141,0.909785,0.04379,0.067243,-0.004932,
+ -0.208115,0.22162,0.952666,0.044625,0.067876,-0.004877,
+ -0.284141,0.30258,0.909785,0.044527,0.06798,-0.004932,
+ -0.319824,0.264582,0.909785,0.043101,0.066461,-0.004932,
+ -0.23425,0.193789,0.952666,0.043211,0.06637,-0.004877,
+ -0.22162,0.208115,0.952666,0.043895,0.067145,-0.004877,
+ -0.319824,0.264582,0.909785,0.043101,0.066461,-0.004932,
+ -0.22162,0.208115,0.952666,0.043895,0.067145,-0.004877,
+ -0.30258,0.284141,0.909785,0.04379,0.067243,-0.004932,
+ -0.335806,0.243978,0.909785,0.042462,0.065638,-0.004932,
+ -0.245956,0.178698,0.952666,0.042578,0.065554,-0.004877,
+ -0.23425,0.193789,0.952666,0.043211,0.06637,-0.004877,
+ -0.335806,0.243978,0.909785,0.042462,0.065638,-0.004932,
+ -0.23425,0.193789,0.952666,0.043211,0.06637,-0.004877,
+ -0.319824,0.264582,0.909785,0.043101,0.066461,-0.004932,
+ -0.350463,0.222411,0.909785,0.041876,0.064776,-0.004932,
+ -0.256692,0.162901,0.952666,0.041997,0.064699,-0.004877,
+ -0.245956,0.178698,0.952666,0.042578,0.065554,-0.004877,
+ -0.350463,0.222411,0.909785,0.041876,0.064776,-0.004932,
+ -0.245956,0.178698,0.952666,0.042578,0.065554,-0.004877,
+ -0.335806,0.243978,0.909785,0.042462,0.065638,-0.004932,
+ -0.363737,0.199966,0.909785,0.041346,0.063878,-0.004932,
+ -0.266414,0.146462,0.952666,0.041471,0.063809,-0.004877,
+ -0.256692,0.162901,0.952666,0.041997,0.064699,-0.004877,
+ -0.363737,0.199966,0.909785,0.041346,0.063878,-0.004932,
+ -0.256692,0.162901,0.952666,0.041997,0.064699,-0.004877,
+ -0.350463,0.222411,0.909785,0.041876,0.064776,-0.004932,
+ -0.375575,0.176732,0.909785,0.040873,0.06295,-0.004932,
+ -0.275084,0.129445,0.952666,0.041002,0.062889,-0.004877,
+ -0.266414,0.146462,0.952666,0.041471,0.063809,-0.004877,
+ -0.375575,0.176732,0.909785,0.040873,0.06295,-0.004932,
+ -0.266414,0.146462,0.952666,0.041471,0.063809,-0.004877,
+ -0.363737,0.199966,0.909785,0.041346,0.063878,-0.004932,
+ -0.385931,0.152801,0.909785,0.040459,0.061993,-0.004932,
+ -0.282669,0.111917,0.952666,0.040592,0.061941,-0.004877,
+ -0.275084,0.129445,0.952666,0.041002,0.062889,-0.004877,
+ -0.385931,0.152801,0.909785,0.040459,0.061993,-0.004932,
+ -0.275084,0.129445,0.952666,0.041002,0.062889,-0.004877,
+ -0.375575,0.176732,0.909785,0.040873,0.06295,-0.004932,
+ -0.394764,0.128267,0.909785,0.040106,0.061012,-0.004932,
+ -0.289139,0.093947,0.952666,0.040242,0.060968,-0.004877,
+ -0.282669,0.111917,0.952666,0.040592,0.061941,-0.004877,
+ -0.394764,0.128267,0.909785,0.040106,0.061012,-0.004932,
+ -0.282669,0.111917,0.952666,0.040592,0.061941,-0.004877,
+ -0.385931,0.152801,0.909785,0.040459,0.061993,-0.004932,
+ -0.402039,0.103226,0.909785,0.039815,0.060012,-0.004932,
+ -0.294467,0.075606,0.952666,0.039953,0.059976,-0.004877,
+ -0.289139,0.093947,0.952666,0.040242,0.060968,-0.004877,
+ -0.402039,0.103226,0.909785,0.039815,0.060012,-0.004932,
+ -0.289139,0.093947,0.952666,0.040242,0.060968,-0.004877,
+ -0.394764,0.128267,0.909785,0.040106,0.061012,-0.004932,
+ -0.294467,0.075606,0.952666,0.039953,0.059976,-0.004877,
+ -0.182722,0.046915,0.982045,0.040097,0.059939,-0.004839,
+ -0.179416,0.058296,0.982045,0.040383,0.060922,-0.004839,
+ -0.294467,0.075606,0.952666,0.039953,0.059976,-0.004877,
+ -0.179416,0.058296,0.982045,0.040383,0.060922,-0.004839,
+ -0.289139,0.093947,0.952666,0.040242,0.060968,-0.004877,
+ -0.298634,0.056967,0.952666,0.039728,0.058967,-0.004877,
+ -0.185308,0.035349,0.982045,0.039874,0.05894,-0.004839,
+ -0.182722,0.046915,0.982045,0.040097,0.059939,-0.004839,
+ -0.298634,0.056967,0.952666,0.039728,0.058967,-0.004877,
+ -0.182722,0.046915,0.982045,0.040097,0.059939,-0.004839,
+ -0.294467,0.075606,0.952666,0.039953,0.059976,-0.004877,
+ -0.301621,0.038104,0.952666,0.039566,0.057947,-0.004877,
+ -0.187162,0.023644,0.982045,0.039714,0.057928,-0.004839,
+ -0.185308,0.035349,0.982045,0.039874,0.05894,-0.004839,
+ -0.301621,0.038104,0.952666,0.039566,0.057947,-0.004877,
+ -0.185308,0.035349,0.982045,0.039874,0.05894,-0.004839,
+ -0.298634,0.056967,0.952666,0.039728,0.058967,-0.004877,
+ -0.303419,0.019089,0.952666,0.039469,0.056918,-0.004877,
+ -0.188277,0.011845,0.982045,0.039617,0.056909,-0.004839,
+ -0.187162,0.023644,0.982045,0.039714,0.057928,-0.004839,
+ -0.303419,0.019089,0.952666,0.039469,0.056918,-0.004877,
+ -0.187162,0.023644,0.982045,0.039714,0.057928,-0.004839,
+ -0.301621,0.038104,0.952666,0.039566,0.057947,-0.004877,
+ -0.304019,0,0.952666,0.039437,0.055885,-0.004877,
+ -0.188649,0,0.982045,0.039585,0.055885,-0.004839,
+ -0.188277,0.011845,0.982045,0.039617,0.056909,-0.004839,
+ -0.304019,0,0.952666,0.039437,0.055885,-0.004877,
+ -0.188277,0.011845,0.982045,0.039617,0.056909,-0.004839,
+ -0.303419,0.019089,0.952666,0.039469,0.056918,-0.004877,
+ -0.303419,-0.019089,0.952666,0.039469,0.054852,-0.004877,
+ -0.188277,-0.011845,0.982045,0.039617,0.054862,-0.004839,
+ -0.188649,0,0.982045,0.039585,0.055885,-0.004839,
+ -0.303419,-0.019089,0.952666,0.039469,0.054852,-0.004877,
+ -0.188649,0,0.982045,0.039585,0.055885,-0.004839,
+ -0.304019,0,0.952666,0.039437,0.055885,-0.004877,
+ -0.301621,-0.038104,0.952666,0.039566,0.053824,-0.004877,
+ -0.187162,-0.023644,0.982045,0.039714,0.053842,-0.004839,
+ -0.188277,-0.011845,0.982045,0.039617,0.054862,-0.004839,
+ -0.301621,-0.038104,0.952666,0.039566,0.053824,-0.004877,
+ -0.188277,-0.011845,0.982045,0.039617,0.054862,-0.004839,
+ -0.303419,-0.019089,0.952666,0.039469,0.054852,-0.004877,
+ -0.298634,-0.056967,0.952666,0.039728,0.052803,-0.004877,
+ -0.185308,-0.035349,0.982045,0.039874,0.052831,-0.004839,
+ -0.187162,-0.023644,0.982045,0.039714,0.053842,-0.004839,
+ -0.298634,-0.056967,0.952666,0.039728,0.052803,-0.004877,
+ -0.187162,-0.023644,0.982045,0.039714,0.053842,-0.004839,
+ -0.301621,-0.038104,0.952666,0.039566,0.053824,-0.004877,
+ -0.294467,-0.075606,0.952666,0.039953,0.051795,-0.004877,
+ -0.182722,-0.046915,0.982045,0.040097,0.051832,-0.004839,
+ -0.185308,-0.035349,0.982045,0.039874,0.052831,-0.004839,
+ -0.294467,-0.075606,0.952666,0.039953,0.051795,-0.004877,
+ -0.185308,-0.035349,0.982045,0.039874,0.052831,-0.004839,
+ -0.298634,-0.056967,0.952666,0.039728,0.052803,-0.004877,
+ -0.289139,-0.093947,0.952666,0.040242,0.050802,-0.004877,
+ -0.179416,-0.058296,0.982045,0.040383,0.050848,-0.004839,
+ -0.182722,-0.046915,0.982045,0.040097,0.051832,-0.004839,
+ -0.289139,-0.093947,0.952666,0.040242,0.050802,-0.004877,
+ -0.182722,-0.046915,0.982045,0.040097,0.051832,-0.004839,
+ -0.294467,-0.075606,0.952666,0.039953,0.051795,-0.004877,
+ -0.282669,-0.111917,0.952666,0.040592,0.04983,-0.004877,
+ -0.175402,-0.069446,0.982045,0.04073,0.049885,-0.004839,
+ -0.179416,-0.058296,0.982045,0.040383,0.050848,-0.004839,
+ -0.282669,-0.111917,0.952666,0.040592,0.04983,-0.004877,
+ -0.179416,-0.058296,0.982045,0.040383,0.050848,-0.004839,
+ -0.289139,-0.093947,0.952666,0.040242,0.050802,-0.004877,
+ -0.275084,-0.129445,0.952666,0.041002,0.048882,-0.004877,
+ -0.170695,-0.080323,0.982045,0.041136,0.048945,-0.004839,
+ -0.175402,-0.069446,0.982045,0.04073,0.049885,-0.004839,
+ -0.275084,-0.129445,0.952666,0.041002,0.048882,-0.004877,
+ -0.175402,-0.069446,0.982045,0.04073,0.049885,-0.004839,
+ -0.282669,-0.111917,0.952666,0.040592,0.04983,-0.004877,
+ -0.266414,-0.146462,0.952666,0.041471,0.047961,-0.004877,
+ -0.165314,-0.090882,0.982045,0.041601,0.048033,-0.004839,
+ -0.170695,-0.080323,0.982045,0.041136,0.048945,-0.004839,
+ -0.266414,-0.146462,0.952666,0.041471,0.047961,-0.004877,
+ -0.170695,-0.080323,0.982045,0.041136,0.048945,-0.004839,
+ -0.275084,-0.129445,0.952666,0.041002,0.048882,-0.004877,
+ -0.256692,-0.162901,0.952666,0.041997,0.047072,-0.004877,
+ -0.159282,-0.101083,0.982045,0.042123,0.047151,-0.004839,
+ -0.165314,-0.090882,0.982045,0.041601,0.048033,-0.004839,
+ -0.256692,-0.162901,0.952666,0.041997,0.047072,-0.004877,
+ -0.165314,-0.090882,0.982045,0.041601,0.048033,-0.004839,
+ -0.266414,-0.146462,0.952666,0.041471,0.047961,-0.004877,
+ -0.245956,-0.178698,0.952666,0.042578,0.046217,-0.004877,
+ -0.15262,-0.110885,0.982045,0.042698,0.046304,-0.004839,
+ -0.159282,-0.101083,0.982045,0.042123,0.047151,-0.004839,
+ -0.245956,-0.178698,0.952666,0.042578,0.046217,-0.004877,
+ -0.159282,-0.101083,0.982045,0.042123,0.047151,-0.004839,
+ -0.256692,-0.162901,0.952666,0.041997,0.047072,-0.004877,
+ -0.23425,-0.193789,0.952666,0.043211,0.0454,-0.004877,
+ -0.145357,-0.120249,0.982045,0.043326,0.045495,-0.004839,
+ -0.15262,-0.110885,0.982045,0.042698,0.046304,-0.004839,
+ -0.23425,-0.193789,0.952666,0.043211,0.0454,-0.004877,
+ -0.15262,-0.110885,0.982045,0.042698,0.046304,-0.004839,
+ -0.245956,-0.178698,0.952666,0.042578,0.046217,-0.004877,
+ -0.22162,-0.208115,0.952666,0.043895,0.044625,-0.004877,
+ -0.137519,-0.129139,0.982045,0.044003,0.044727,-0.004839,
+ -0.145357,-0.120249,0.982045,0.043326,0.045495,-0.004839,
+ -0.22162,-0.208115,0.952666,0.043895,0.044625,-0.004877,
+ -0.145357,-0.120249,0.982045,0.043326,0.045495,-0.004839,
+ -0.23425,-0.193789,0.952666,0.043211,0.0454,-0.004877,
+ -0.208115,-0.22162,0.952666,0.044625,0.043895,-0.004877,
+ -0.129139,-0.137519,0.982045,0.044727,0.044003,-0.004839,
+ -0.137519,-0.129139,0.982045,0.044003,0.044727,-0.004839,
+ -0.208115,-0.22162,0.952666,0.044625,0.043895,-0.004877,
+ -0.137519,-0.129139,0.982045,0.044003,0.044727,-0.004839,
+ -0.22162,-0.208115,0.952666,0.043895,0.044625,-0.004877,
+ -0.193789,-0.23425,0.952666,0.0454,0.043211,-0.004877,
+ -0.120249,-0.145357,0.982045,0.045495,0.043326,-0.004839,
+ -0.129139,-0.137519,0.982045,0.044727,0.044003,-0.004839,
+ -0.193789,-0.23425,0.952666,0.0454,0.043211,-0.004877,
+ -0.129139,-0.137519,0.982045,0.044727,0.044003,-0.004839,
+ -0.208115,-0.22162,0.952666,0.044625,0.043895,-0.004877,
+ -0.178698,-0.245956,0.952666,0.046217,0.042578,-0.004877,
+ -0.110885,-0.15262,0.982045,0.046304,0.042698,-0.004839,
+ -0.120249,-0.145357,0.982045,0.045495,0.043326,-0.004839,
+ -0.178698,-0.245956,0.952666,0.046217,0.042578,-0.004877,
+ -0.120249,-0.145357,0.982045,0.045495,0.043326,-0.004839,
+ -0.193789,-0.23425,0.952666,0.0454,0.043211,-0.004877,
+ -0.162901,-0.256692,0.952666,0.047072,0.041997,-0.004877,
+ -0.101083,-0.159282,0.982045,0.047151,0.042123,-0.004839,
+ -0.110885,-0.15262,0.982045,0.046304,0.042698,-0.004839,
+ -0.162901,-0.256692,0.952666,0.047072,0.041997,-0.004877,
+ -0.110885,-0.15262,0.982045,0.046304,0.042698,-0.004839,
+ -0.178698,-0.245956,0.952666,0.046217,0.042578,-0.004877,
+ -0.146462,-0.266414,0.952666,0.047961,0.041471,-0.004877,
+ -0.090882,-0.165314,0.982045,0.048033,0.041601,-0.004839,
+ -0.101083,-0.159282,0.982045,0.047151,0.042123,-0.004839,
+ -0.146462,-0.266414,0.952666,0.047961,0.041471,-0.004877,
+ -0.101083,-0.159282,0.982045,0.047151,0.042123,-0.004839,
+ -0.162901,-0.256692,0.952666,0.047072,0.041997,-0.004877,
+ -0.129445,-0.275084,0.952666,0.048882,0.041002,-0.004877,
+ -0.080323,-0.170695,0.982045,0.048945,0.041136,-0.004839,
+ -0.090882,-0.165314,0.982045,0.048033,0.041601,-0.004839,
+ -0.129445,-0.275084,0.952666,0.048882,0.041002,-0.004877,
+ -0.090882,-0.165314,0.982045,0.048033,0.041601,-0.004839,
+ -0.146462,-0.266414,0.952666,0.047961,0.041471,-0.004877,
+ -0.111917,-0.282669,0.952666,0.04983,0.040592,-0.004877,
+ -0.069446,-0.175402,0.982045,0.049885,0.04073,-0.004839,
+ -0.080323,-0.170695,0.982045,0.048945,0.041136,-0.004839,
+ -0.111917,-0.282669,0.952666,0.04983,0.040592,-0.004877,
+ -0.080323,-0.170695,0.982045,0.048945,0.041136,-0.004839,
+ -0.129445,-0.275084,0.952666,0.048882,0.041002,-0.004877,
+ -0.093947,-0.289139,0.952666,0.050802,0.040242,-0.004877,
+ -0.058296,-0.179416,0.982045,0.050848,0.040383,-0.004839,
+ -0.069446,-0.175402,0.982045,0.049885,0.04073,-0.004839,
+ -0.093947,-0.289139,0.952666,0.050802,0.040242,-0.004877,
+ -0.069446,-0.175402,0.982045,0.049885,0.04073,-0.004839,
+ -0.111917,-0.282669,0.952666,0.04983,0.040592,-0.004877,
+ -0.075606,-0.294467,0.952666,0.051795,0.039953,-0.004877,
+ -0.046915,-0.182722,0.982045,0.051832,0.040097,-0.004839,
+ -0.058296,-0.179416,0.982045,0.050848,0.040383,-0.004839,
+ -0.075606,-0.294467,0.952666,0.051795,0.039953,-0.004877,
+ -0.058296,-0.179416,0.982045,0.050848,0.040383,-0.004839,
+ -0.093947,-0.289139,0.952666,0.050802,0.040242,-0.004877,
+ -0.056967,-0.298634,0.952666,0.052803,0.039728,-0.004877,
+ -0.035349,-0.185308,0.982045,0.052831,0.039874,-0.004839,
+ -0.046915,-0.182722,0.982045,0.051832,0.040097,-0.004839,
+ -0.056967,-0.298634,0.952666,0.052803,0.039728,-0.004877,
+ -0.046915,-0.182722,0.982045,0.051832,0.040097,-0.004839,
+ -0.075606,-0.294467,0.952666,0.051795,0.039953,-0.004877,
+ -0.038104,-0.301621,0.952666,0.053824,0.039566,-0.004877,
+ -0.023644,-0.187162,0.982045,0.053842,0.039714,-0.004839,
+ -0.035349,-0.185308,0.982045,0.052831,0.039874,-0.004839,
+ -0.038104,-0.301621,0.952666,0.053824,0.039566,-0.004877,
+ -0.035349,-0.185308,0.982045,0.052831,0.039874,-0.004839,
+ -0.056967,-0.298634,0.952666,0.052803,0.039728,-0.004877,
+ -0.019089,-0.303419,0.952666,0.054852,0.039469,-0.004877,
+ -0.011845,-0.188277,0.982045,0.054862,0.039617,-0.004839,
+ -0.023644,-0.187162,0.982045,0.053842,0.039714,-0.004839,
+ -0.019089,-0.303419,0.952666,0.054852,0.039469,-0.004877,
+ -0.023644,-0.187162,0.982045,0.053842,0.039714,-0.004839,
+ -0.038104,-0.301621,0.952666,0.053824,0.039566,-0.004877,
+ 0,-0.304019,0.952666,0.055885,0.039437,-0.004877,
+ 0,-0.188649,0.982045,0.055885,0.039585,-0.004839,
+ -0.011845,-0.188277,0.982045,0.054862,0.039617,-0.004839,
+ 0,-0.304019,0.952666,0.055885,0.039437,-0.004877,
+ -0.011845,-0.188277,0.982045,0.054862,0.039617,-0.004839,
+ -0.019089,-0.303419,0.952666,0.054852,0.039469,-0.004877,
+ 0.019089,-0.303419,0.952666,0.056918,0.039469,-0.004877,
+ 0.011845,-0.188277,0.982045,0.056909,0.039617,-0.004839,
+ 0,-0.188649,0.982045,0.055885,0.039585,-0.004839,
+ 0.019089,-0.303419,0.952666,0.056918,0.039469,-0.004877,
+ 0,-0.188649,0.982045,0.055885,0.039585,-0.004839,
+ 0,-0.304019,0.952666,0.055885,0.039437,-0.004877,
+ 0.038104,-0.301621,0.952666,0.057947,0.039566,-0.004877,
+ 0.023644,-0.187162,0.982045,0.057928,0.039714,-0.004839,
+ 0.011845,-0.188277,0.982045,0.056909,0.039617,-0.004839,
+ 0.038104,-0.301621,0.952666,0.057947,0.039566,-0.004877,
+ 0.011845,-0.188277,0.982045,0.056909,0.039617,-0.004839,
+ 0.019089,-0.303419,0.952666,0.056918,0.039469,-0.004877,
+ 0.056967,-0.298634,0.952666,0.058967,0.039728,-0.004877,
+ 0.035349,-0.185308,0.982045,0.05894,0.039874,-0.004839,
+ 0.023644,-0.187162,0.982045,0.057928,0.039714,-0.004839,
+ 0.056967,-0.298634,0.952666,0.058967,0.039728,-0.004877,
+ 0.023644,-0.187162,0.982045,0.057928,0.039714,-0.004839,
+ 0.038104,-0.301621,0.952666,0.057947,0.039566,-0.004877,
+ 0.075606,-0.294467,0.952666,0.059976,0.039953,-0.004877,
+ 0.046915,-0.182722,0.982045,0.059939,0.040097,-0.004839,
+ 0.035349,-0.185308,0.982045,0.05894,0.039874,-0.004839,
+ 0.075606,-0.294467,0.952666,0.059976,0.039953,-0.004877,
+ 0.035349,-0.185308,0.982045,0.05894,0.039874,-0.004839,
+ 0.056967,-0.298634,0.952666,0.058967,0.039728,-0.004877,
+ 0.093947,-0.289139,0.952666,0.060968,0.040242,-0.004877,
+ 0.058296,-0.179416,0.982045,0.060922,0.040383,-0.004839,
+ 0.046915,-0.182722,0.982045,0.059939,0.040097,-0.004839,
+ 0.093947,-0.289139,0.952666,0.060968,0.040242,-0.004877,
+ 0.046915,-0.182722,0.982045,0.059939,0.040097,-0.004839,
+ 0.075606,-0.294467,0.952666,0.059976,0.039953,-0.004877,
+ 0.111917,-0.282669,0.952666,0.061941,0.040592,-0.004877,
+ 0.069446,-0.175402,0.982045,0.061886,0.04073,-0.004839,
+ 0.058296,-0.179416,0.982045,0.060922,0.040383,-0.004839,
+ 0.111917,-0.282669,0.952666,0.061941,0.040592,-0.004877,
+ 0.058296,-0.179416,0.982045,0.060922,0.040383,-0.004839,
+ 0.093947,-0.289139,0.952666,0.060968,0.040242,-0.004877,
+ 0.129445,-0.275084,0.952666,0.062889,0.041002,-0.004877,
+ 0.080323,-0.170695,0.982045,0.062825,0.041136,-0.004839,
+ 0.069446,-0.175402,0.982045,0.061886,0.04073,-0.004839,
+ 0.129445,-0.275084,0.952666,0.062889,0.041002,-0.004877,
+ 0.069446,-0.175402,0.982045,0.061886,0.04073,-0.004839,
+ 0.111917,-0.282669,0.952666,0.061941,0.040592,-0.004877,
+ 0.146462,-0.266414,0.952666,0.063809,0.041471,-0.004877,
+ 0.090882,-0.165314,0.982045,0.063738,0.041601,-0.004839,
+ 0.080323,-0.170695,0.982045,0.062825,0.041136,-0.004839,
+ 0.146462,-0.266414,0.952666,0.063809,0.041471,-0.004877,
+ 0.080323,-0.170695,0.982045,0.062825,0.041136,-0.004839,
+ 0.129445,-0.275084,0.952666,0.062889,0.041002,-0.004877,
+ 0.162901,-0.256692,0.952666,0.064699,0.041997,-0.004877,
+ 0.101083,-0.159282,0.982045,0.064619,0.042123,-0.004839,
+ 0.090882,-0.165314,0.982045,0.063738,0.041601,-0.004839,
+ 0.162901,-0.256692,0.952666,0.064699,0.041997,-0.004877,
+ 0.090882,-0.165314,0.982045,0.063738,0.041601,-0.004839,
+ 0.146462,-0.266414,0.952666,0.063809,0.041471,-0.004877,
+ 0.178698,-0.245956,0.952666,0.065554,0.042578,-0.004877,
+ 0.110885,-0.15262,0.982045,0.065466,0.042698,-0.004839,
+ 0.101083,-0.159282,0.982045,0.064619,0.042123,-0.004839,
+ 0.178698,-0.245956,0.952666,0.065554,0.042578,-0.004877,
+ 0.101083,-0.159282,0.982045,0.064619,0.042123,-0.004839,
+ 0.162901,-0.256692,0.952666,0.064699,0.041997,-0.004877,
+ 0.193789,-0.23425,0.952666,0.06637,0.043211,-0.004877,
+ 0.120249,-0.145357,0.982045,0.066275,0.043326,-0.004839,
+ 0.110885,-0.15262,0.982045,0.065466,0.042698,-0.004839,
+ 0.193789,-0.23425,0.952666,0.06637,0.043211,-0.004877,
+ 0.110885,-0.15262,0.982045,0.065466,0.042698,-0.004839,
+ 0.178698,-0.245956,0.952666,0.065554,0.042578,-0.004877,
+ 0.208115,-0.22162,0.952666,0.067145,0.043895,-0.004877,
+ 0.129139,-0.137519,0.982045,0.067043,0.044003,-0.004839,
+ 0.120249,-0.145357,0.982045,0.066275,0.043326,-0.004839,
+ 0.208115,-0.22162,0.952666,0.067145,0.043895,-0.004877,
+ 0.120249,-0.145357,0.982045,0.066275,0.043326,-0.004839,
+ 0.193789,-0.23425,0.952666,0.06637,0.043211,-0.004877,
+ 0.22162,-0.208115,0.952666,0.067876,0.044625,-0.004877,
+ 0.137519,-0.129139,0.982045,0.067768,0.044727,-0.004839,
+ 0.129139,-0.137519,0.982045,0.067043,0.044003,-0.004839,
+ 0.22162,-0.208115,0.952666,0.067876,0.044625,-0.004877,
+ 0.129139,-0.137519,0.982045,0.067043,0.044003,-0.004839,
+ 0.208115,-0.22162,0.952666,0.067145,0.043895,-0.004877,
+ 0.23425,-0.193789,0.952666,0.068559,0.0454,-0.004877,
+ 0.145357,-0.120249,0.982045,0.068445,0.045495,-0.004839,
+ 0.137519,-0.129139,0.982045,0.067768,0.044727,-0.004839,
+ 0.23425,-0.193789,0.952666,0.068559,0.0454,-0.004877,
+ 0.137519,-0.129139,0.982045,0.067768,0.044727,-0.004839,
+ 0.22162,-0.208115,0.952666,0.067876,0.044625,-0.004877,
+ 0.245956,-0.178698,0.952666,0.069193,0.046217,-0.004877,
+ 0.15262,-0.110885,0.982045,0.069072,0.046304,-0.004839,
+ 0.145357,-0.120249,0.982045,0.068445,0.045495,-0.004839,
+ 0.245956,-0.178698,0.952666,0.069193,0.046217,-0.004877,
+ 0.145357,-0.120249,0.982045,0.068445,0.045495,-0.004839,
+ 0.23425,-0.193789,0.952666,0.068559,0.0454,-0.004877,
+ 0.256692,-0.162901,0.952666,0.069773,0.047072,-0.004877,
+ 0.159282,-0.101083,0.982045,0.069648,0.047151,-0.004839,
+ 0.15262,-0.110885,0.982045,0.069072,0.046304,-0.004839,
+ 0.256692,-0.162901,0.952666,0.069773,0.047072,-0.004877,
+ 0.15262,-0.110885,0.982045,0.069072,0.046304,-0.004839,
+ 0.245956,-0.178698,0.952666,0.069193,0.046217,-0.004877,
+ 0.266414,-0.146462,0.952666,0.070299,0.047961,-0.004877,
+ 0.165314,-0.090882,0.982045,0.070169,0.048033,-0.004839,
+ 0.159282,-0.101083,0.982045,0.069648,0.047151,-0.004839,
+ 0.266414,-0.146462,0.952666,0.070299,0.047961,-0.004877,
+ 0.159282,-0.101083,0.982045,0.069648,0.047151,-0.004839,
+ 0.256692,-0.162901,0.952666,0.069773,0.047072,-0.004877,
+ 0.275084,-0.129445,0.952666,0.070769,0.048882,-0.004877,
+ 0.170695,-0.080323,0.982045,0.070634,0.048945,-0.004839,
+ 0.165314,-0.090882,0.982045,0.070169,0.048033,-0.004839,
+ 0.275084,-0.129445,0.952666,0.070769,0.048882,-0.004877,
+ 0.165314,-0.090882,0.982045,0.070169,0.048033,-0.004839,
+ 0.266414,-0.146462,0.952666,0.070299,0.047961,-0.004877,
+ 0.282669,-0.111917,0.952666,0.071179,0.04983,-0.004877,
+ 0.175402,-0.069446,0.982045,0.071041,0.049885,-0.004839,
+ 0.170695,-0.080323,0.982045,0.070634,0.048945,-0.004839,
+ 0.282669,-0.111917,0.952666,0.071179,0.04983,-0.004877,
+ 0.170695,-0.080323,0.982045,0.070634,0.048945,-0.004839,
+ 0.275084,-0.129445,0.952666,0.070769,0.048882,-0.004877,
+ 0.289139,-0.093947,0.952666,0.071529,0.050802,-0.004877,
+ 0.179416,-0.058296,0.982045,0.071388,0.050848,-0.004839,
+ 0.175402,-0.069446,0.982045,0.071041,0.049885,-0.004839,
+ 0.289139,-0.093947,0.952666,0.071529,0.050802,-0.004877,
+ 0.175402,-0.069446,0.982045,0.071041,0.049885,-0.004839,
+ 0.282669,-0.111917,0.952666,0.071179,0.04983,-0.004877,
+ 0.294467,-0.075606,0.952666,0.071817,0.051795,-0.004877,
+ 0.182722,-0.046915,0.982045,0.071673,0.051832,-0.004839,
+ 0.179416,-0.058296,0.982045,0.071388,0.050848,-0.004839,
+ 0.294467,-0.075606,0.952666,0.071817,0.051795,-0.004877,
+ 0.179416,-0.058296,0.982045,0.071388,0.050848,-0.004839,
+ 0.289139,-0.093947,0.952666,0.071529,0.050802,-0.004877,
+ 0.298634,-0.056967,0.952666,0.072043,0.052803,-0.004877,
+ 0.185308,-0.035349,0.982045,0.071897,0.052831,-0.004839,
+ 0.182722,-0.046915,0.982045,0.071673,0.051832,-0.004839,
+ 0.298634,-0.056967,0.952666,0.072043,0.052803,-0.004877,
+ 0.182722,-0.046915,0.982045,0.071673,0.051832,-0.004839,
+ 0.294467,-0.075606,0.952666,0.071817,0.051795,-0.004877,
+ 0.301621,-0.038104,0.952666,0.072204,0.053824,-0.004877,
+ 0.187162,-0.023644,0.982045,0.072057,0.053842,-0.004839,
+ 0.185308,-0.035349,0.982045,0.071897,0.052831,-0.004839,
+ 0.301621,-0.038104,0.952666,0.072204,0.053824,-0.004877,
+ 0.185308,-0.035349,0.982045,0.071897,0.052831,-0.004839,
+ 0.298634,-0.056967,0.952666,0.072043,0.052803,-0.004877,
+ 0.303419,-0.019089,0.952666,0.072302,0.054852,-0.004877,
+ 0.188277,-0.011845,0.982045,0.072153,0.054862,-0.004839,
+ 0.187162,-0.023644,0.982045,0.072057,0.053842,-0.004839,
+ 0.303419,-0.019089,0.952666,0.072302,0.054852,-0.004877,
+ 0.187162,-0.023644,0.982045,0.072057,0.053842,-0.004839,
+ 0.301621,-0.038104,0.952666,0.072204,0.053824,-0.004877,
+ 0.304019,0,0.952666,0.072334,0.055885,-0.004877,
+ 0.188649,0,0.982045,0.072186,0.055885,-0.004839,
+ 0.188277,-0.011845,0.982045,0.072153,0.054862,-0.004839,
+ 0.304019,0,0.952666,0.072334,0.055885,-0.004877,
+ 0.188277,-0.011845,0.982045,0.072153,0.054862,-0.004839,
+ 0.303419,-0.019089,0.952666,0.072302,0.054852,-0.004877,
+ 0.303419,0.019089,0.952666,0.072302,0.056918,-0.004877,
+ 0.188277,0.011845,0.982045,0.072153,0.056909,-0.004839,
+ 0.188649,0,0.982045,0.072186,0.055885,-0.004839,
+ 0.303419,0.019089,0.952666,0.072302,0.056918,-0.004877,
+ 0.188649,0,0.982045,0.072186,0.055885,-0.004839,
+ 0.304019,0,0.952666,0.072334,0.055885,-0.004877,
+ 0.301621,0.038104,0.952666,0.072204,0.057947,-0.004877,
+ 0.187162,0.023644,0.982045,0.072057,0.057928,-0.004839,
+ 0.188277,0.011845,0.982045,0.072153,0.056909,-0.004839,
+ 0.301621,0.038104,0.952666,0.072204,0.057947,-0.004877,
+ 0.188277,0.011845,0.982045,0.072153,0.056909,-0.004839,
+ 0.303419,0.019089,0.952666,0.072302,0.056918,-0.004877,
+ 0.298634,0.056967,0.952666,0.072043,0.058967,-0.004877,
+ 0.185308,0.035349,0.982045,0.071897,0.05894,-0.004839,
+ 0.187162,0.023644,0.982045,0.072057,0.057928,-0.004839,
+ 0.298634,0.056967,0.952666,0.072043,0.058967,-0.004877,
+ 0.187162,0.023644,0.982045,0.072057,0.057928,-0.004839,
+ 0.301621,0.038104,0.952666,0.072204,0.057947,-0.004877,
+ 0.294467,0.075606,0.952666,0.071817,0.059976,-0.004877,
+ 0.182722,0.046915,0.982045,0.071673,0.059939,-0.004839,
+ 0.185308,0.035349,0.982045,0.071897,0.05894,-0.004839,
+ 0.294467,0.075606,0.952666,0.071817,0.059976,-0.004877,
+ 0.185308,0.035349,0.982045,0.071897,0.05894,-0.004839,
+ 0.298634,0.056967,0.952666,0.072043,0.058967,-0.004877,
+ 0.289139,0.093947,0.952666,0.071529,0.060968,-0.004877,
+ 0.179416,0.058296,0.982045,0.071388,0.060922,-0.004839,
+ 0.182722,0.046915,0.982045,0.071673,0.059939,-0.004839,
+ 0.289139,0.093947,0.952666,0.071529,0.060968,-0.004877,
+ 0.182722,0.046915,0.982045,0.071673,0.059939,-0.004839,
+ 0.294467,0.075606,0.952666,0.071817,0.059976,-0.004877,
+ 0.282669,0.111917,0.952666,0.071179,0.061941,-0.004877,
+ 0.175402,0.069446,0.982045,0.071041,0.061886,-0.004839,
+ 0.179416,0.058296,0.982045,0.071388,0.060922,-0.004839,
+ 0.282669,0.111917,0.952666,0.071179,0.061941,-0.004877,
+ 0.179416,0.058296,0.982045,0.071388,0.060922,-0.004839,
+ 0.289139,0.093947,0.952666,0.071529,0.060968,-0.004877,
+ 0.275084,0.129445,0.952666,0.070769,0.062889,-0.004877,
+ 0.170695,0.080323,0.982045,0.070634,0.062825,-0.004839,
+ 0.175402,0.069446,0.982045,0.071041,0.061886,-0.004839,
+ 0.275084,0.129445,0.952666,0.070769,0.062889,-0.004877,
+ 0.175402,0.069446,0.982045,0.071041,0.061886,-0.004839,
+ 0.282669,0.111917,0.952666,0.071179,0.061941,-0.004877,
+ 0.266414,0.146462,0.952666,0.070299,0.063809,-0.004877,
+ 0.165314,0.090882,0.982045,0.070169,0.063738,-0.004839,
+ 0.170695,0.080323,0.982045,0.070634,0.062825,-0.004839,
+ 0.266414,0.146462,0.952666,0.070299,0.063809,-0.004877,
+ 0.170695,0.080323,0.982045,0.070634,0.062825,-0.004839,
+ 0.275084,0.129445,0.952666,0.070769,0.062889,-0.004877,
+ 0.256692,0.162901,0.952666,0.069773,0.064699,-0.004877,
+ 0.159282,0.101083,0.982045,0.069648,0.064619,-0.004839,
+ 0.165314,0.090882,0.982045,0.070169,0.063738,-0.004839,
+ 0.256692,0.162901,0.952666,0.069773,0.064699,-0.004877,
+ 0.165314,0.090882,0.982045,0.070169,0.063738,-0.004839,
+ 0.266414,0.146462,0.952666,0.070299,0.063809,-0.004877,
+ 0.245956,0.178698,0.952666,0.069193,0.065554,-0.004877,
+ 0.15262,0.110885,0.982045,0.069072,0.065466,-0.004839,
+ 0.159282,0.101083,0.982045,0.069648,0.064619,-0.004839,
+ 0.245956,0.178698,0.952666,0.069193,0.065554,-0.004877,
+ 0.159282,0.101083,0.982045,0.069648,0.064619,-0.004839,
+ 0.256692,0.162901,0.952666,0.069773,0.064699,-0.004877,
+ 0.23425,0.193789,0.952666,0.068559,0.06637,-0.004877,
+ 0.145357,0.120249,0.982045,0.068445,0.066275,-0.004839,
+ 0.15262,0.110885,0.982045,0.069072,0.065466,-0.004839,
+ 0.23425,0.193789,0.952666,0.068559,0.06637,-0.004877,
+ 0.15262,0.110885,0.982045,0.069072,0.065466,-0.004839,
+ 0.245956,0.178698,0.952666,0.069193,0.065554,-0.004877,
+ 0.22162,0.208115,0.952666,0.067876,0.067145,-0.004877,
+ 0.137519,0.129139,0.982045,0.067768,0.067043,-0.004839,
+ 0.145357,0.120249,0.982045,0.068445,0.066275,-0.004839,
+ 0.22162,0.208115,0.952666,0.067876,0.067145,-0.004877,
+ 0.145357,0.120249,0.982045,0.068445,0.066275,-0.004839,
+ 0.23425,0.193789,0.952666,0.068559,0.06637,-0.004877,
+ 0.208115,0.22162,0.952666,0.067145,0.067876,-0.004877,
+ 0.129139,0.137519,0.982045,0.067043,0.067768,-0.004839,
+ 0.137519,0.129139,0.982045,0.067768,0.067043,-0.004839,
+ 0.208115,0.22162,0.952666,0.067145,0.067876,-0.004877,
+ 0.137519,0.129139,0.982045,0.067768,0.067043,-0.004839,
+ 0.22162,0.208115,0.952666,0.067876,0.067145,-0.004877,
+ 0.193789,0.23425,0.952666,0.06637,0.068559,-0.004877,
+ 0.120249,0.145357,0.982045,0.066275,0.068445,-0.004839,
+ 0.129139,0.137519,0.982045,0.067043,0.067768,-0.004839,
+ 0.193789,0.23425,0.952666,0.06637,0.068559,-0.004877,
+ 0.129139,0.137519,0.982045,0.067043,0.067768,-0.004839,
+ 0.208115,0.22162,0.952666,0.067145,0.067876,-0.004877,
+ 0.178698,0.245956,0.952666,0.065554,0.069193,-0.004877,
+ 0.110885,0.15262,0.982045,0.065466,0.069072,-0.004839,
+ 0.120249,0.145357,0.982045,0.066275,0.068445,-0.004839,
+ 0.178698,0.245956,0.952666,0.065554,0.069193,-0.004877,
+ 0.120249,0.145357,0.982045,0.066275,0.068445,-0.004839,
+ 0.193789,0.23425,0.952666,0.06637,0.068559,-0.004877,
+ 0.162901,0.256692,0.952666,0.064699,0.069773,-0.004877,
+ 0.101083,0.159282,0.982045,0.064619,0.069648,-0.004839,
+ 0.110885,0.15262,0.982045,0.065466,0.069072,-0.004839,
+ 0.162901,0.256692,0.952666,0.064699,0.069773,-0.004877,
+ 0.110885,0.15262,0.982045,0.065466,0.069072,-0.004839,
+ 0.178698,0.245956,0.952666,0.065554,0.069193,-0.004877,
+ 0.146462,0.266414,0.952666,0.063809,0.070299,-0.004877,
+ 0.090882,0.165314,0.982045,0.063738,0.070169,-0.004839,
+ 0.101083,0.159282,0.982045,0.064619,0.069648,-0.004839,
+ 0.146462,0.266414,0.952666,0.063809,0.070299,-0.004877,
+ 0.101083,0.159282,0.982045,0.064619,0.069648,-0.004839,
+ 0.162901,0.256692,0.952666,0.064699,0.069773,-0.004877,
+ 0.129445,0.275084,0.952666,0.062889,0.070769,-0.004877,
+ 0.080323,0.170695,0.982045,0.062825,0.070634,-0.004839,
+ 0.090882,0.165314,0.982045,0.063738,0.070169,-0.004839,
+ 0.129445,0.275084,0.952666,0.062889,0.070769,-0.004877,
+ 0.090882,0.165314,0.982045,0.063738,0.070169,-0.004839,
+ 0.146462,0.266414,0.952666,0.063809,0.070299,-0.004877,
+ 0.111917,0.282669,0.952666,0.061941,0.071179,-0.004877,
+ 0.069446,0.175402,0.982045,0.061886,0.071041,-0.004839,
+ 0.080323,0.170695,0.982045,0.062825,0.070634,-0.004839,
+ 0.111917,0.282669,0.952666,0.061941,0.071179,-0.004877,
+ 0.080323,0.170695,0.982045,0.062825,0.070634,-0.004839,
+ 0.129445,0.275084,0.952666,0.062889,0.070769,-0.004877,
+ 0.093947,0.289139,0.952666,0.060968,0.071529,-0.004877,
+ 0.058296,0.179416,0.982045,0.060922,0.071388,-0.004839,
+ 0.069446,0.175402,0.982045,0.061886,0.071041,-0.004839,
+ 0.093947,0.289139,0.952666,0.060968,0.071529,-0.004877,
+ 0.069446,0.175402,0.982045,0.061886,0.071041,-0.004839,
+ 0.111917,0.282669,0.952666,0.061941,0.071179,-0.004877,
+ 0.075606,0.294467,0.952666,0.059976,0.071817,-0.004877,
+ 0.046915,0.182722,0.982045,0.059939,0.071673,-0.004839,
+ 0.058296,0.179416,0.982045,0.060922,0.071388,-0.004839,
+ 0.075606,0.294467,0.952666,0.059976,0.071817,-0.004877,
+ 0.058296,0.179416,0.982045,0.060922,0.071388,-0.004839,
+ 0.093947,0.289139,0.952666,0.060968,0.071529,-0.004877,
+ 0.056967,0.298634,0.952666,0.058967,0.072043,-0.004877,
+ 0.035349,0.185308,0.982045,0.05894,0.071897,-0.004839,
+ 0.046915,0.182722,0.982045,0.059939,0.071673,-0.004839,
+ 0.056967,0.298634,0.952666,0.058967,0.072043,-0.004877,
+ 0.046915,0.182722,0.982045,0.059939,0.071673,-0.004839,
+ 0.075606,0.294467,0.952666,0.059976,0.071817,-0.004877,
+ 0.038104,0.301621,0.952666,0.057947,0.072204,-0.004877,
+ 0.023644,0.187162,0.982045,0.057928,0.072057,-0.004839,
+ 0.035349,0.185308,0.982045,0.05894,0.071897,-0.004839,
+ 0.038104,0.301621,0.952666,0.057947,0.072204,-0.004877,
+ 0.035349,0.185308,0.982045,0.05894,0.071897,-0.004839,
+ 0.056967,0.298634,0.952666,0.058967,0.072043,-0.004877,
+ 0.019089,0.303419,0.952666,0.056918,0.072302,-0.004877,
+ 0.011845,0.188277,0.982045,0.056909,0.072153,-0.004839,
+ 0.023644,0.187162,0.982045,0.057928,0.072057,-0.004839,
+ 0.019089,0.303419,0.952666,0.056918,0.072302,-0.004877,
+ 0.023644,0.187162,0.982045,0.057928,0.072057,-0.004839,
+ 0.038104,0.301621,0.952666,0.057947,0.072204,-0.004877,
+ 0,0.304019,0.952666,0.055885,0.072334,-0.004877,
+ 0,0.188649,0.982045,0.055885,0.072186,-0.004839,
+ 0.011845,0.188277,0.982045,0.056909,0.072153,-0.004839,
+ 0,0.304019,0.952666,0.055885,0.072334,-0.004877,
+ 0.011845,0.188277,0.982045,0.056909,0.072153,-0.004839,
+ 0.019089,0.303419,0.952666,0.056918,0.072302,-0.004877,
+ -0.019089,0.303419,0.952666,0.054852,0.072302,-0.004877,
+ -0.011845,0.188277,0.982045,0.054862,0.072153,-0.004839,
+ 0,0.188649,0.982045,0.055885,0.072186,-0.004839,
+ -0.019089,0.303419,0.952666,0.054852,0.072302,-0.004877,
+ 0,0.188649,0.982045,0.055885,0.072186,-0.004839,
+ 0,0.304019,0.952666,0.055885,0.072334,-0.004877,
+ -0.038104,0.301621,0.952666,0.053824,0.072204,-0.004877,
+ -0.023644,0.187162,0.982045,0.053842,0.072057,-0.004839,
+ -0.011845,0.188277,0.982045,0.054862,0.072153,-0.004839,
+ -0.038104,0.301621,0.952666,0.053824,0.072204,-0.004877,
+ -0.011845,0.188277,0.982045,0.054862,0.072153,-0.004839,
+ -0.019089,0.303419,0.952666,0.054852,0.072302,-0.004877,
+ -0.056967,0.298634,0.952666,0.052803,0.072043,-0.004877,
+ -0.035349,0.185308,0.982045,0.052831,0.071897,-0.004839,
+ -0.023644,0.187162,0.982045,0.053842,0.072057,-0.004839,
+ -0.056967,0.298634,0.952666,0.052803,0.072043,-0.004877,
+ -0.023644,0.187162,0.982045,0.053842,0.072057,-0.004839,
+ -0.038104,0.301621,0.952666,0.053824,0.072204,-0.004877,
+ -0.075606,0.294467,0.952666,0.051795,0.071817,-0.004877,
+ -0.046915,0.182722,0.982045,0.051832,0.071673,-0.004839,
+ -0.035349,0.185308,0.982045,0.052831,0.071897,-0.004839,
+ -0.075606,0.294467,0.952666,0.051795,0.071817,-0.004877,
+ -0.035349,0.185308,0.982045,0.052831,0.071897,-0.004839,
+ -0.056967,0.298634,0.952666,0.052803,0.072043,-0.004877,
+ -0.093947,0.289139,0.952666,0.050802,0.071529,-0.004877,
+ -0.058296,0.179416,0.982045,0.050848,0.071388,-0.004839,
+ -0.046915,0.182722,0.982045,0.051832,0.071673,-0.004839,
+ -0.093947,0.289139,0.952666,0.050802,0.071529,-0.004877,
+ -0.046915,0.182722,0.982045,0.051832,0.071673,-0.004839,
+ -0.075606,0.294467,0.952666,0.051795,0.071817,-0.004877,
+ -0.111917,0.282669,0.952666,0.04983,0.071179,-0.004877,
+ -0.069446,0.175402,0.982045,0.049885,0.071041,-0.004839,
+ -0.058296,0.179416,0.982045,0.050848,0.071388,-0.004839,
+ -0.111917,0.282669,0.952666,0.04983,0.071179,-0.004877,
+ -0.058296,0.179416,0.982045,0.050848,0.071388,-0.004839,
+ -0.093947,0.289139,0.952666,0.050802,0.071529,-0.004877,
+ -0.129445,0.275084,0.952666,0.048882,0.070769,-0.004877,
+ -0.080323,0.170695,0.982045,0.048945,0.070634,-0.004839,
+ -0.069446,0.175402,0.982045,0.049885,0.071041,-0.004839,
+ -0.129445,0.275084,0.952666,0.048882,0.070769,-0.004877,
+ -0.069446,0.175402,0.982045,0.049885,0.071041,-0.004839,
+ -0.111917,0.282669,0.952666,0.04983,0.071179,-0.004877,
+ -0.146462,0.266414,0.952666,0.047961,0.070299,-0.004877,
+ -0.090882,0.165314,0.982045,0.048033,0.070169,-0.004839,
+ -0.080323,0.170695,0.982045,0.048945,0.070634,-0.004839,
+ -0.146462,0.266414,0.952666,0.047961,0.070299,-0.004877,
+ -0.080323,0.170695,0.982045,0.048945,0.070634,-0.004839,
+ -0.129445,0.275084,0.952666,0.048882,0.070769,-0.004877,
+ -0.162901,0.256692,0.952666,0.047072,0.069773,-0.004877,
+ -0.101083,0.159282,0.982045,0.047151,0.069648,-0.004839,
+ -0.090882,0.165314,0.982045,0.048033,0.070169,-0.004839,
+ -0.162901,0.256692,0.952666,0.047072,0.069773,-0.004877,
+ -0.090882,0.165314,0.982045,0.048033,0.070169,-0.004839,
+ -0.146462,0.266414,0.952666,0.047961,0.070299,-0.004877,
+ -0.178698,0.245956,0.952666,0.046217,0.069193,-0.004877,
+ -0.110885,0.15262,0.982045,0.046304,0.069072,-0.004839,
+ -0.101083,0.159282,0.982045,0.047151,0.069648,-0.004839,
+ -0.178698,0.245956,0.952666,0.046217,0.069193,-0.004877,
+ -0.101083,0.159282,0.982045,0.047151,0.069648,-0.004839,
+ -0.162901,0.256692,0.952666,0.047072,0.069773,-0.004877,
+ -0.193789,0.23425,0.952666,0.0454,0.068559,-0.004877,
+ -0.120249,0.145357,0.982045,0.045495,0.068445,-0.004839,
+ -0.110885,0.15262,0.982045,0.046304,0.069072,-0.004839,
+ -0.193789,0.23425,0.952666,0.0454,0.068559,-0.004877,
+ -0.110885,0.15262,0.982045,0.046304,0.069072,-0.004839,
+ -0.178698,0.245956,0.952666,0.046217,0.069193,-0.004877,
+ -0.208115,0.22162,0.952666,0.044625,0.067876,-0.004877,
+ -0.129139,0.137519,0.982045,0.044727,0.067768,-0.004839,
+ -0.120249,0.145357,0.982045,0.045495,0.068445,-0.004839,
+ -0.208115,0.22162,0.952666,0.044625,0.067876,-0.004877,
+ -0.120249,0.145357,0.982045,0.045495,0.068445,-0.004839,
+ -0.193789,0.23425,0.952666,0.0454,0.068559,-0.004877,
+ -0.22162,0.208115,0.952666,0.043895,0.067145,-0.004877,
+ -0.137519,0.129139,0.982045,0.044003,0.067043,-0.004839,
+ -0.129139,0.137519,0.982045,0.044727,0.067768,-0.004839,
+ -0.22162,0.208115,0.952666,0.043895,0.067145,-0.004877,
+ -0.129139,0.137519,0.982045,0.044727,0.067768,-0.004839,
+ -0.208115,0.22162,0.952666,0.044625,0.067876,-0.004877,
+ -0.23425,0.193789,0.952666,0.043211,0.06637,-0.004877,
+ -0.145357,0.120249,0.982045,0.043326,0.066275,-0.004839,
+ -0.137519,0.129139,0.982045,0.044003,0.067043,-0.004839,
+ -0.23425,0.193789,0.952666,0.043211,0.06637,-0.004877,
+ -0.137519,0.129139,0.982045,0.044003,0.067043,-0.004839,
+ -0.22162,0.208115,0.952666,0.043895,0.067145,-0.004877,
+ -0.245956,0.178698,0.952666,0.042578,0.065554,-0.004877,
+ -0.15262,0.110885,0.982045,0.042698,0.065466,-0.004839,
+ -0.145357,0.120249,0.982045,0.043326,0.066275,-0.004839,
+ -0.245956,0.178698,0.952666,0.042578,0.065554,-0.004877,
+ -0.145357,0.120249,0.982045,0.043326,0.066275,-0.004839,
+ -0.23425,0.193789,0.952666,0.043211,0.06637,-0.004877,
+ -0.256692,0.162901,0.952666,0.041997,0.064699,-0.004877,
+ -0.159282,0.101083,0.982045,0.042123,0.064619,-0.004839,
+ -0.15262,0.110885,0.982045,0.042698,0.065466,-0.004839,
+ -0.256692,0.162901,0.952666,0.041997,0.064699,-0.004877,
+ -0.15262,0.110885,0.982045,0.042698,0.065466,-0.004839,
+ -0.245956,0.178698,0.952666,0.042578,0.065554,-0.004877,
+ -0.266414,0.146462,0.952666,0.041471,0.063809,-0.004877,
+ -0.165314,0.090882,0.982045,0.041601,0.063738,-0.004839,
+ -0.159282,0.101083,0.982045,0.042123,0.064619,-0.004839,
+ -0.266414,0.146462,0.952666,0.041471,0.063809,-0.004877,
+ -0.159282,0.101083,0.982045,0.042123,0.064619,-0.004839,
+ -0.256692,0.162901,0.952666,0.041997,0.064699,-0.004877,
+ -0.275084,0.129445,0.952666,0.041002,0.062889,-0.004877,
+ -0.170695,0.080323,0.982045,0.041136,0.062825,-0.004839,
+ -0.165314,0.090882,0.982045,0.041601,0.063738,-0.004839,
+ -0.275084,0.129445,0.952666,0.041002,0.062889,-0.004877,
+ -0.165314,0.090882,0.982045,0.041601,0.063738,-0.004839,
+ -0.266414,0.146462,0.952666,0.041471,0.063809,-0.004877,
+ -0.282669,0.111917,0.952666,0.040592,0.061941,-0.004877,
+ -0.175402,0.069446,0.982045,0.04073,0.061886,-0.004839,
+ -0.170695,0.080323,0.982045,0.041136,0.062825,-0.004839,
+ -0.282669,0.111917,0.952666,0.040592,0.061941,-0.004877,
+ -0.170695,0.080323,0.982045,0.041136,0.062825,-0.004839,
+ -0.275084,0.129445,0.952666,0.041002,0.062889,-0.004877,
+ -0.289139,0.093947,0.952666,0.040242,0.060968,-0.004877,
+ -0.179416,0.058296,0.982045,0.040383,0.060922,-0.004839,
+ -0.175402,0.069446,0.982045,0.04073,0.061886,-0.004839,
+ -0.289139,0.093947,0.952666,0.040242,0.060968,-0.004877,
+ -0.175402,0.069446,0.982045,0.04073,0.061886,-0.004839,
+ -0.282669,0.111917,0.952666,0.040592,0.061941,-0.004877,
+ -0.179416,0.058296,0.982045,0.040383,0.060922,-0.004839,
+ -0.06715,0.021818,0.997504,0.040528,0.060875,-0.004819,
+ -0.065648,0.025992,0.997504,0.040871,0.06183,-0.004819,
+ -0.179416,0.058296,0.982045,0.040383,0.060922,-0.004839,
+ -0.065648,0.025992,0.997504,0.040871,0.06183,-0.004819,
+ -0.175402,0.069446,0.982045,0.04073,0.061886,-0.004839,
+ -0.182722,0.046915,0.982045,0.040097,0.059939,-0.004839,
+ -0.068388,0.017559,0.997504,0.040245,0.059901,-0.004819,
+ -0.06715,0.021818,0.997504,0.040528,0.060875,-0.004819,
+ -0.182722,0.046915,0.982045,0.040097,0.059939,-0.004839,
+ -0.06715,0.021818,0.997504,0.040528,0.060875,-0.004819,
+ -0.179416,0.058296,0.982045,0.040383,0.060922,-0.004839,
+ -0.185308,0.035349,0.982045,0.039874,0.05894,-0.004839,
+ -0.069355,0.01323,0.997504,0.040023,0.058911,-0.004819,
+ -0.068388,0.017559,0.997504,0.040245,0.059901,-0.004819,
+ -0.185308,0.035349,0.982045,0.039874,0.05894,-0.004839,
+ -0.068388,0.017559,0.997504,0.040245,0.059901,-0.004819,
+ -0.182722,0.046915,0.982045,0.040097,0.059939,-0.004839,
+ -0.187162,0.023644,0.982045,0.039714,0.057928,-0.004839,
+ -0.070049,0.008849,0.997504,0.039865,0.057909,-0.004819,
+ -0.069355,0.01323,0.997504,0.040023,0.058911,-0.004819,
+ -0.187162,0.023644,0.982045,0.039714,0.057928,-0.004839,
+ -0.069355,0.01323,0.997504,0.040023,0.058911,-0.004819,
+ -0.185308,0.035349,0.982045,0.039874,0.05894,-0.004839,
+ -0.188277,0.011845,0.982045,0.039617,0.056909,-0.004839,
+ -0.070467,0.004433,0.997504,0.039769,0.056899,-0.004819,
+ -0.070049,0.008849,0.997504,0.039865,0.057909,-0.004819,
+ -0.188277,0.011845,0.982045,0.039617,0.056909,-0.004839,
+ -0.070049,0.008849,0.997504,0.039865,0.057909,-0.004819,
+ -0.187162,0.023644,0.982045,0.039714,0.057928,-0.004839,
+ -0.188649,0,0.982045,0.039585,0.055885,-0.004839,
+ -0.070606,0,0.997504,0.039737,0.055885,-0.004819,
+ -0.070467,0.004433,0.997504,0.039769,0.056899,-0.004819,
+ -0.188649,0,0.982045,0.039585,0.055885,-0.004839,
+ -0.070467,0.004433,0.997504,0.039769,0.056899,-0.004819,
+ -0.188277,0.011845,0.982045,0.039617,0.056909,-0.004839,
+ -0.188277,-0.011845,0.982045,0.039617,0.054862,-0.004839,
+ -0.070467,-0.004433,0.997504,0.039769,0.054871,-0.004819,
+ -0.070606,0,0.997504,0.039737,0.055885,-0.004819,
+ -0.188277,-0.011845,0.982045,0.039617,0.054862,-0.004839,
+ -0.070606,0,0.997504,0.039737,0.055885,-0.004819,
+ -0.188649,0,0.982045,0.039585,0.055885,-0.004839,
+ -0.187162,-0.023644,0.982045,0.039714,0.053842,-0.004839,
+ -0.070049,-0.008849,0.997504,0.039865,0.053861,-0.004819,
+ -0.070467,-0.004433,0.997504,0.039769,0.054871,-0.004819,
+ -0.187162,-0.023644,0.982045,0.039714,0.053842,-0.004839,
+ -0.070467,-0.004433,0.997504,0.039769,0.054871,-0.004819,
+ -0.188277,-0.011845,0.982045,0.039617,0.054862,-0.004839,
+ -0.185308,-0.035349,0.982045,0.039874,0.052831,-0.004839,
+ -0.069355,-0.01323,0.997504,0.040023,0.052859,-0.004819,
+ -0.070049,-0.008849,0.997504,0.039865,0.053861,-0.004819,
+ -0.185308,-0.035349,0.982045,0.039874,0.052831,-0.004839,
+ -0.070049,-0.008849,0.997504,0.039865,0.053861,-0.004819,
+ -0.187162,-0.023644,0.982045,0.039714,0.053842,-0.004839,
+ -0.182722,-0.046915,0.982045,0.040097,0.051832,-0.004839,
+ -0.068388,-0.017559,0.997504,0.040245,0.051869,-0.004819,
+ -0.069355,-0.01323,0.997504,0.040023,0.052859,-0.004819,
+ -0.182722,-0.046915,0.982045,0.040097,0.051832,-0.004839,
+ -0.069355,-0.01323,0.997504,0.040023,0.052859,-0.004819,
+ -0.185308,-0.035349,0.982045,0.039874,0.052831,-0.004839,
+ -0.179416,-0.058296,0.982045,0.040383,0.050848,-0.004839,
+ -0.06715,-0.021818,0.997504,0.040528,0.050895,-0.004819,
+ -0.068388,-0.017559,0.997504,0.040245,0.051869,-0.004819,
+ -0.179416,-0.058296,0.982045,0.040383,0.050848,-0.004839,
+ -0.068388,-0.017559,0.997504,0.040245,0.051869,-0.004819,
+ -0.182722,-0.046915,0.982045,0.040097,0.051832,-0.004839,
+ -0.175402,-0.069446,0.982045,0.04073,0.049885,-0.004839,
+ -0.065648,-0.025992,0.997504,0.040871,0.049941,-0.004819,
+ -0.06715,-0.021818,0.997504,0.040528,0.050895,-0.004819,
+ -0.175402,-0.069446,0.982045,0.04073,0.049885,-0.004839,
+ -0.06715,-0.021818,0.997504,0.040528,0.050895,-0.004819,
+ -0.179416,-0.058296,0.982045,0.040383,0.050848,-0.004839,
+ -0.170695,-0.080323,0.982045,0.041136,0.048945,-0.004839,
+ -0.063886,-0.030062,0.997504,0.041274,0.04901,-0.004819,
+ -0.065648,-0.025992,0.997504,0.040871,0.049941,-0.004819,
+ -0.170695,-0.080323,0.982045,0.041136,0.048945,-0.004839,
+ -0.065648,-0.025992,0.997504,0.040871,0.049941,-0.004819,
+ -0.175402,-0.069446,0.982045,0.04073,0.049885,-0.004839,
+ -0.165314,-0.090882,0.982045,0.041601,0.048033,-0.004839,
+ -0.061872,-0.034015,0.997504,0.041735,0.048106,-0.004819,
+ -0.063886,-0.030062,0.997504,0.041274,0.04901,-0.004819,
+ -0.165314,-0.090882,0.982045,0.041601,0.048033,-0.004839,
+ -0.063886,-0.030062,0.997504,0.041274,0.04901,-0.004819,
+ -0.170695,-0.080323,0.982045,0.041136,0.048945,-0.004839,
+ -0.159282,-0.101083,0.982045,0.042123,0.047151,-0.004839,
+ -0.059614,-0.037832,0.997504,0.042251,0.047233,-0.004819,
+ -0.061872,-0.034015,0.997504,0.041735,0.048106,-0.004819,
+ -0.159282,-0.101083,0.982045,0.042123,0.047151,-0.004839,
+ -0.061872,-0.034015,0.997504,0.041735,0.048106,-0.004819,
+ -0.165314,-0.090882,0.982045,0.041601,0.048033,-0.004839,
+ -0.15262,-0.110885,0.982045,0.042698,0.046304,-0.004839,
+ -0.057121,-0.041501,0.997504,0.042821,0.046394,-0.004819,
+ -0.059614,-0.037832,0.997504,0.042251,0.047233,-0.004819,
+ -0.15262,-0.110885,0.982045,0.042698,0.046304,-0.004839,
+ -0.059614,-0.037832,0.997504,0.042251,0.047233,-0.004819,
+ -0.159282,-0.101083,0.982045,0.042123,0.047151,-0.004839,
+ -0.145357,-0.120249,0.982045,0.043326,0.045495,-0.004839,
+ -0.054403,-0.045006,0.997504,0.043443,0.045592,-0.004819,
+ -0.057121,-0.041501,0.997504,0.042821,0.046394,-0.004819,
+ -0.145357,-0.120249,0.982045,0.043326,0.045495,-0.004839,
+ -0.057121,-0.041501,0.997504,0.042821,0.046394,-0.004819,
+ -0.15262,-0.110885,0.982045,0.042698,0.046304,-0.004839,
+ -0.137519,-0.129139,0.982045,0.044003,0.044727,-0.004839,
+ -0.051469,-0.048333,0.997504,0.044114,0.044831,-0.004819,
+ -0.054403,-0.045006,0.997504,0.043443,0.045592,-0.004819,
+ -0.137519,-0.129139,0.982045,0.044003,0.044727,-0.004839,
+ -0.054403,-0.045006,0.997504,0.043443,0.045592,-0.004819,
+ -0.145357,-0.120249,0.982045,0.043326,0.045495,-0.004839,
+ -0.129139,-0.137519,0.982045,0.044727,0.044003,-0.004839,
+ -0.048333,-0.051469,0.997504,0.044831,0.044114,-0.004819,
+ -0.051469,-0.048333,0.997504,0.044114,0.044831,-0.004819,
+ -0.129139,-0.137519,0.982045,0.044727,0.044003,-0.004839,
+ -0.051469,-0.048333,0.997504,0.044114,0.044831,-0.004819,
+ -0.137519,-0.129139,0.982045,0.044003,0.044727,-0.004839,
+ -0.120249,-0.145357,0.982045,0.045495,0.043326,-0.004839,
+ -0.045006,-0.054403,0.997504,0.045592,0.043443,-0.004819,
+ -0.048333,-0.051469,0.997504,0.044831,0.044114,-0.004819,
+ -0.120249,-0.145357,0.982045,0.045495,0.043326,-0.004839,
+ -0.048333,-0.051469,0.997504,0.044831,0.044114,-0.004819,
+ -0.129139,-0.137519,0.982045,0.044727,0.044003,-0.004839,
+ -0.110885,-0.15262,0.982045,0.046304,0.042698,-0.004839,
+ -0.041501,-0.057121,0.997504,0.046394,0.042821,-0.004819,
+ -0.045006,-0.054403,0.997504,0.045592,0.043443,-0.004819,
+ -0.110885,-0.15262,0.982045,0.046304,0.042698,-0.004839,
+ -0.045006,-0.054403,0.997504,0.045592,0.043443,-0.004819,
+ -0.120249,-0.145357,0.982045,0.045495,0.043326,-0.004839,
+ -0.101083,-0.159282,0.982045,0.047151,0.042123,-0.004839,
+ -0.037832,-0.059614,0.997504,0.047233,0.042251,-0.004819,
+ -0.041501,-0.057121,0.997504,0.046394,0.042821,-0.004819,
+ -0.101083,-0.159282,0.982045,0.047151,0.042123,-0.004839,
+ -0.041501,-0.057121,0.997504,0.046394,0.042821,-0.004819,
+ -0.110885,-0.15262,0.982045,0.046304,0.042698,-0.004839,
+ -0.090882,-0.165314,0.982045,0.048033,0.041601,-0.004839,
+ -0.034015,-0.061872,0.997504,0.048106,0.041735,-0.004819,
+ -0.037832,-0.059614,0.997504,0.047233,0.042251,-0.004819,
+ -0.090882,-0.165314,0.982045,0.048033,0.041601,-0.004839,
+ -0.037832,-0.059614,0.997504,0.047233,0.042251,-0.004819,
+ -0.101083,-0.159282,0.982045,0.047151,0.042123,-0.004839,
+ -0.080323,-0.170695,0.982045,0.048945,0.041136,-0.004839,
+ -0.030062,-0.063886,0.997504,0.04901,0.041274,-0.004819,
+ -0.034015,-0.061872,0.997504,0.048106,0.041735,-0.004819,
+ -0.080323,-0.170695,0.982045,0.048945,0.041136,-0.004839,
+ -0.034015,-0.061872,0.997504,0.048106,0.041735,-0.004819,
+ -0.090882,-0.165314,0.982045,0.048033,0.041601,-0.004839,
+ -0.069446,-0.175402,0.982045,0.049885,0.04073,-0.004839,
+ -0.025992,-0.065648,0.997504,0.049941,0.040871,-0.004819,
+ -0.030062,-0.063886,0.997504,0.04901,0.041274,-0.004819,
+ -0.069446,-0.175402,0.982045,0.049885,0.04073,-0.004839,
+ -0.030062,-0.063886,0.997504,0.04901,0.041274,-0.004819,
+ -0.080323,-0.170695,0.982045,0.048945,0.041136,-0.004839,
+ -0.058296,-0.179416,0.982045,0.050848,0.040383,-0.004839,
+ -0.021818,-0.06715,0.997504,0.050895,0.040528,-0.004819,
+ -0.025992,-0.065648,0.997504,0.049941,0.040871,-0.004819,
+ -0.058296,-0.179416,0.982045,0.050848,0.040383,-0.004839,
+ -0.025992,-0.065648,0.997504,0.049941,0.040871,-0.004819,
+ -0.069446,-0.175402,0.982045,0.049885,0.04073,-0.004839,
+ -0.046915,-0.182722,0.982045,0.051832,0.040097,-0.004839,
+ -0.017559,-0.068388,0.997504,0.051869,0.040245,-0.004819,
+ -0.021818,-0.06715,0.997504,0.050895,0.040528,-0.004819,
+ -0.046915,-0.182722,0.982045,0.051832,0.040097,-0.004839,
+ -0.021818,-0.06715,0.997504,0.050895,0.040528,-0.004819,
+ -0.058296,-0.179416,0.982045,0.050848,0.040383,-0.004839,
+ -0.035349,-0.185308,0.982045,0.052831,0.039874,-0.004839,
+ -0.01323,-0.069355,0.997504,0.052859,0.040023,-0.004819,
+ -0.017559,-0.068388,0.997504,0.051869,0.040245,-0.004819,
+ -0.035349,-0.185308,0.982045,0.052831,0.039874,-0.004839,
+ -0.017559,-0.068388,0.997504,0.051869,0.040245,-0.004819,
+ -0.046915,-0.182722,0.982045,0.051832,0.040097,-0.004839,
+ -0.023644,-0.187162,0.982045,0.053842,0.039714,-0.004839,
+ -0.008849,-0.070049,0.997504,0.053861,0.039865,-0.004819,
+ -0.01323,-0.069355,0.997504,0.052859,0.040023,-0.004819,
+ -0.023644,-0.187162,0.982045,0.053842,0.039714,-0.004839,
+ -0.01323,-0.069355,0.997504,0.052859,0.040023,-0.004819,
+ -0.035349,-0.185308,0.982045,0.052831,0.039874,-0.004839,
+ -0.011845,-0.188277,0.982045,0.054862,0.039617,-0.004839,
+ -0.004433,-0.070467,0.997504,0.054871,0.039769,-0.004819,
+ -0.008849,-0.070049,0.997504,0.053861,0.039865,-0.004819,
+ -0.011845,-0.188277,0.982045,0.054862,0.039617,-0.004839,
+ -0.008849,-0.070049,0.997504,0.053861,0.039865,-0.004819,
+ -0.023644,-0.187162,0.982045,0.053842,0.039714,-0.004839,
+ 0,-0.188649,0.982045,0.055885,0.039585,-0.004839,
+ 0,-0.070606,0.997504,0.055885,0.039737,-0.004819,
+ -0.004433,-0.070467,0.997504,0.054871,0.039769,-0.004819,
+ 0,-0.188649,0.982045,0.055885,0.039585,-0.004839,
+ -0.004433,-0.070467,0.997504,0.054871,0.039769,-0.004819,
+ -0.011845,-0.188277,0.982045,0.054862,0.039617,-0.004839,
+ 0.011845,-0.188277,0.982045,0.056909,0.039617,-0.004839,
+ 0.004433,-0.070467,0.997504,0.056899,0.039769,-0.004819,
+ 0,-0.070606,0.997504,0.055885,0.039737,-0.004819,
+ 0.011845,-0.188277,0.982045,0.056909,0.039617,-0.004839,
+ 0,-0.070606,0.997504,0.055885,0.039737,-0.004819,
+ 0,-0.188649,0.982045,0.055885,0.039585,-0.004839,
+ 0.023644,-0.187162,0.982045,0.057928,0.039714,-0.004839,
+ 0.008849,-0.070049,0.997504,0.057909,0.039865,-0.004819,
+ 0.004433,-0.070467,0.997504,0.056899,0.039769,-0.004819,
+ 0.023644,-0.187162,0.982045,0.057928,0.039714,-0.004839,
+ 0.004433,-0.070467,0.997504,0.056899,0.039769,-0.004819,
+ 0.011845,-0.188277,0.982045,0.056909,0.039617,-0.004839,
+ 0.035349,-0.185308,0.982045,0.05894,0.039874,-0.004839,
+ 0.01323,-0.069355,0.997504,0.058911,0.040023,-0.004819,
+ 0.008849,-0.070049,0.997504,0.057909,0.039865,-0.004819,
+ 0.035349,-0.185308,0.982045,0.05894,0.039874,-0.004839,
+ 0.008849,-0.070049,0.997504,0.057909,0.039865,-0.004819,
+ 0.023644,-0.187162,0.982045,0.057928,0.039714,-0.004839,
+ 0.046915,-0.182722,0.982045,0.059939,0.040097,-0.004839,
+ 0.017559,-0.068388,0.997504,0.059901,0.040245,-0.004819,
+ 0.01323,-0.069355,0.997504,0.058911,0.040023,-0.004819,
+ 0.046915,-0.182722,0.982045,0.059939,0.040097,-0.004839,
+ 0.01323,-0.069355,0.997504,0.058911,0.040023,-0.004819,
+ 0.035349,-0.185308,0.982045,0.05894,0.039874,-0.004839,
+ 0.058296,-0.179416,0.982045,0.060922,0.040383,-0.004839,
+ 0.021818,-0.06715,0.997504,0.060875,0.040528,-0.004819,
+ 0.017559,-0.068388,0.997504,0.059901,0.040245,-0.004819,
+ 0.058296,-0.179416,0.982045,0.060922,0.040383,-0.004839,
+ 0.017559,-0.068388,0.997504,0.059901,0.040245,-0.004819,
+ 0.046915,-0.182722,0.982045,0.059939,0.040097,-0.004839,
+ 0.069446,-0.175402,0.982045,0.061886,0.04073,-0.004839,
+ 0.025992,-0.065648,0.997504,0.06183,0.040871,-0.004819,
+ 0.021818,-0.06715,0.997504,0.060875,0.040528,-0.004819,
+ 0.069446,-0.175402,0.982045,0.061886,0.04073,-0.004839,
+ 0.021818,-0.06715,0.997504,0.060875,0.040528,-0.004819,
+ 0.058296,-0.179416,0.982045,0.060922,0.040383,-0.004839,
+ 0.080323,-0.170695,0.982045,0.062825,0.041136,-0.004839,
+ 0.030062,-0.063886,0.997504,0.062761,0.041274,-0.004819,
+ 0.025992,-0.065648,0.997504,0.06183,0.040871,-0.004819,
+ 0.080323,-0.170695,0.982045,0.062825,0.041136,-0.004839,
+ 0.025992,-0.065648,0.997504,0.06183,0.040871,-0.004819,
+ 0.069446,-0.175402,0.982045,0.061886,0.04073,-0.004839,
+ 0.090882,-0.165314,0.982045,0.063738,0.041601,-0.004839,
+ 0.034015,-0.061872,0.997504,0.063665,0.041735,-0.004819,
+ 0.030062,-0.063886,0.997504,0.062761,0.041274,-0.004819,
+ 0.090882,-0.165314,0.982045,0.063738,0.041601,-0.004839,
+ 0.030062,-0.063886,0.997504,0.062761,0.041274,-0.004819,
+ 0.080323,-0.170695,0.982045,0.062825,0.041136,-0.004839,
+ 0.101083,-0.159282,0.982045,0.064619,0.042123,-0.004839,
+ 0.037832,-0.059614,0.997504,0.064538,0.042251,-0.004819,
+ 0.034015,-0.061872,0.997504,0.063665,0.041735,-0.004819,
+ 0.101083,-0.159282,0.982045,0.064619,0.042123,-0.004839,
+ 0.034015,-0.061872,0.997504,0.063665,0.041735,-0.004819,
+ 0.090882,-0.165314,0.982045,0.063738,0.041601,-0.004839,
+ 0.110885,-0.15262,0.982045,0.065466,0.042698,-0.004839,
+ 0.041501,-0.057121,0.997504,0.065377,0.042821,-0.004819,
+ 0.037832,-0.059614,0.997504,0.064538,0.042251,-0.004819,
+ 0.110885,-0.15262,0.982045,0.065466,0.042698,-0.004839,
+ 0.037832,-0.059614,0.997504,0.064538,0.042251,-0.004819,
+ 0.101083,-0.159282,0.982045,0.064619,0.042123,-0.004839,
+ 0.120249,-0.145357,0.982045,0.066275,0.043326,-0.004839,
+ 0.045006,-0.054403,0.997504,0.066178,0.043443,-0.004819,
+ 0.041501,-0.057121,0.997504,0.065377,0.042821,-0.004819,
+ 0.120249,-0.145357,0.982045,0.066275,0.043326,-0.004839,
+ 0.041501,-0.057121,0.997504,0.065377,0.042821,-0.004819,
+ 0.110885,-0.15262,0.982045,0.065466,0.042698,-0.004839,
+ 0.129139,-0.137519,0.982045,0.067043,0.044003,-0.004839,
+ 0.048333,-0.051469,0.997504,0.066939,0.044114,-0.004819,
+ 0.045006,-0.054403,0.997504,0.066178,0.043443,-0.004819,
+ 0.129139,-0.137519,0.982045,0.067043,0.044003,-0.004839,
+ 0.045006,-0.054403,0.997504,0.066178,0.043443,-0.004819,
+ 0.120249,-0.145357,0.982045,0.066275,0.043326,-0.004839,
+ 0.137519,-0.129139,0.982045,0.067768,0.044727,-0.004839,
+ 0.051469,-0.048333,0.997504,0.067657,0.044831,-0.004819,
+ 0.048333,-0.051469,0.997504,0.066939,0.044114,-0.004819,
+ 0.137519,-0.129139,0.982045,0.067768,0.044727,-0.004839,
+ 0.048333,-0.051469,0.997504,0.066939,0.044114,-0.004819,
+ 0.129139,-0.137519,0.982045,0.067043,0.044003,-0.004839,
+ 0.145357,-0.120249,0.982045,0.068445,0.045495,-0.004839,
+ 0.054403,-0.045006,0.997504,0.068328,0.045592,-0.004819,
+ 0.051469,-0.048333,0.997504,0.067657,0.044831,-0.004819,
+ 0.145357,-0.120249,0.982045,0.068445,0.045495,-0.004839,
+ 0.051469,-0.048333,0.997504,0.067657,0.044831,-0.004819,
+ 0.137519,-0.129139,0.982045,0.067768,0.044727,-0.004839,
+ 0.15262,-0.110885,0.982045,0.069072,0.046304,-0.004839,
+ 0.057121,-0.041501,0.997504,0.068949,0.046394,-0.004819,
+ 0.054403,-0.045006,0.997504,0.068328,0.045592,-0.004819,
+ 0.15262,-0.110885,0.982045,0.069072,0.046304,-0.004839,
+ 0.054403,-0.045006,0.997504,0.068328,0.045592,-0.004819,
+ 0.145357,-0.120249,0.982045,0.068445,0.045495,-0.004839,
+ 0.159282,-0.101083,0.982045,0.069648,0.047151,-0.004839,
+ 0.059614,-0.037832,0.997504,0.06952,0.047233,-0.004819,
+ 0.057121,-0.041501,0.997504,0.068949,0.046394,-0.004819,
+ 0.159282,-0.101083,0.982045,0.069648,0.047151,-0.004839,
+ 0.057121,-0.041501,0.997504,0.068949,0.046394,-0.004819,
+ 0.15262,-0.110885,0.982045,0.069072,0.046304,-0.004839,
+ 0.165314,-0.090882,0.982045,0.070169,0.048033,-0.004839,
+ 0.061872,-0.034015,0.997504,0.070036,0.048106,-0.004819,
+ 0.059614,-0.037832,0.997504,0.06952,0.047233,-0.004819,
+ 0.165314,-0.090882,0.982045,0.070169,0.048033,-0.004839,
+ 0.059614,-0.037832,0.997504,0.06952,0.047233,-0.004819,
+ 0.159282,-0.101083,0.982045,0.069648,0.047151,-0.004839,
+ 0.170695,-0.080323,0.982045,0.070634,0.048945,-0.004839,
+ 0.063886,-0.030062,0.997504,0.070497,0.04901,-0.004819,
+ 0.061872,-0.034015,0.997504,0.070036,0.048106,-0.004819,
+ 0.170695,-0.080323,0.982045,0.070634,0.048945,-0.004839,
+ 0.061872,-0.034015,0.997504,0.070036,0.048106,-0.004819,
+ 0.165314,-0.090882,0.982045,0.070169,0.048033,-0.004839,
+ 0.175402,-0.069446,0.982045,0.071041,0.049885,-0.004839,
+ 0.065648,-0.025992,0.997504,0.070899,0.049941,-0.004819,
+ 0.063886,-0.030062,0.997504,0.070497,0.04901,-0.004819,
+ 0.175402,-0.069446,0.982045,0.071041,0.049885,-0.004839,
+ 0.063886,-0.030062,0.997504,0.070497,0.04901,-0.004819,
+ 0.170695,-0.080323,0.982045,0.070634,0.048945,-0.004839,
+ 0.179416,-0.058296,0.982045,0.071388,0.050848,-0.004839,
+ 0.06715,-0.021818,0.997504,0.071243,0.050895,-0.004819,
+ 0.065648,-0.025992,0.997504,0.070899,0.049941,-0.004819,
+ 0.179416,-0.058296,0.982045,0.071388,0.050848,-0.004839,
+ 0.065648,-0.025992,0.997504,0.070899,0.049941,-0.004819,
+ 0.175402,-0.069446,0.982045,0.071041,0.049885,-0.004839,
+ 0.182722,-0.046915,0.982045,0.071673,0.051832,-0.004839,
+ 0.068388,-0.017559,0.997504,0.071526,0.051869,-0.004819,
+ 0.06715,-0.021818,0.997504,0.071243,0.050895,-0.004819,
+ 0.182722,-0.046915,0.982045,0.071673,0.051832,-0.004839,
+ 0.06715,-0.021818,0.997504,0.071243,0.050895,-0.004819,
+ 0.179416,-0.058296,0.982045,0.071388,0.050848,-0.004839,
+ 0.185308,-0.035349,0.982045,0.071897,0.052831,-0.004839,
+ 0.069355,-0.01323,0.997504,0.071747,0.052859,-0.004819,
+ 0.068388,-0.017559,0.997504,0.071526,0.051869,-0.004819,
+ 0.185308,-0.035349,0.982045,0.071897,0.052831,-0.004839,
+ 0.068388,-0.017559,0.997504,0.071526,0.051869,-0.004819,
+ 0.182722,-0.046915,0.982045,0.071673,0.051832,-0.004839,
+ 0.187162,-0.023644,0.982045,0.072057,0.053842,-0.004839,
+ 0.070049,-0.008849,0.997504,0.071906,0.053861,-0.004819,
+ 0.069355,-0.01323,0.997504,0.071747,0.052859,-0.004819,
+ 0.187162,-0.023644,0.982045,0.072057,0.053842,-0.004839,
+ 0.069355,-0.01323,0.997504,0.071747,0.052859,-0.004819,
+ 0.185308,-0.035349,0.982045,0.071897,0.052831,-0.004839,
+ 0.188277,-0.011845,0.982045,0.072153,0.054862,-0.004839,
+ 0.070467,-0.004433,0.997504,0.072001,0.054871,-0.004819,
+ 0.070049,-0.008849,0.997504,0.071906,0.053861,-0.004819,
+ 0.188277,-0.011845,0.982045,0.072153,0.054862,-0.004839,
+ 0.070049,-0.008849,0.997504,0.071906,0.053861,-0.004819,
+ 0.187162,-0.023644,0.982045,0.072057,0.053842,-0.004839,
+ 0.188649,0,0.982045,0.072186,0.055885,-0.004839,
+ 0.070606,0,0.997504,0.072033,0.055885,-0.004819,
+ 0.070467,-0.004433,0.997504,0.072001,0.054871,-0.004819,
+ 0.188649,0,0.982045,0.072186,0.055885,-0.004839,
+ 0.070467,-0.004433,0.997504,0.072001,0.054871,-0.004819,
+ 0.188277,-0.011845,0.982045,0.072153,0.054862,-0.004839,
+ 0.188277,0.011845,0.982045,0.072153,0.056909,-0.004839,
+ 0.070467,0.004433,0.997504,0.072001,0.056899,-0.004819,
+ 0.070606,0,0.997504,0.072033,0.055885,-0.004819,
+ 0.188277,0.011845,0.982045,0.072153,0.056909,-0.004839,
+ 0.070606,0,0.997504,0.072033,0.055885,-0.004819,
+ 0.188649,0,0.982045,0.072186,0.055885,-0.004839,
+ 0.187162,0.023644,0.982045,0.072057,0.057928,-0.004839,
+ 0.070049,0.008849,0.997504,0.071906,0.057909,-0.004819,
+ 0.070467,0.004433,0.997504,0.072001,0.056899,-0.004819,
+ 0.187162,0.023644,0.982045,0.072057,0.057928,-0.004839,
+ 0.070467,0.004433,0.997504,0.072001,0.056899,-0.004819,
+ 0.188277,0.011845,0.982045,0.072153,0.056909,-0.004839,
+ 0.185308,0.035349,0.982045,0.071897,0.05894,-0.004839,
+ 0.069355,0.01323,0.997504,0.071747,0.058911,-0.004819,
+ 0.070049,0.008849,0.997504,0.071906,0.057909,-0.004819,
+ 0.185308,0.035349,0.982045,0.071897,0.05894,-0.004839,
+ 0.070049,0.008849,0.997504,0.071906,0.057909,-0.004819,
+ 0.187162,0.023644,0.982045,0.072057,0.057928,-0.004839,
+ 0.182722,0.046915,0.982045,0.071673,0.059939,-0.004839,
+ 0.068388,0.017559,0.997504,0.071526,0.059901,-0.004819,
+ 0.069355,0.01323,0.997504,0.071747,0.058911,-0.004819,
+ 0.182722,0.046915,0.982045,0.071673,0.059939,-0.004839,
+ 0.069355,0.01323,0.997504,0.071747,0.058911,-0.004819,
+ 0.185308,0.035349,0.982045,0.071897,0.05894,-0.004839,
+ 0.179416,0.058296,0.982045,0.071388,0.060922,-0.004839,
+ 0.06715,0.021818,0.997504,0.071243,0.060875,-0.004819,
+ 0.068388,0.017559,0.997504,0.071526,0.059901,-0.004819,
+ 0.179416,0.058296,0.982045,0.071388,0.060922,-0.004839,
+ 0.068388,0.017559,0.997504,0.071526,0.059901,-0.004819,
+ 0.182722,0.046915,0.982045,0.071673,0.059939,-0.004839,
+ 0.175402,0.069446,0.982045,0.071041,0.061886,-0.004839,
+ 0.065648,0.025992,0.997504,0.070899,0.06183,-0.004819,
+ 0.06715,0.021818,0.997504,0.071243,0.060875,-0.004819,
+ 0.175402,0.069446,0.982045,0.071041,0.061886,-0.004839,
+ 0.06715,0.021818,0.997504,0.071243,0.060875,-0.004819,
+ 0.179416,0.058296,0.982045,0.071388,0.060922,-0.004839,
+ 0.170695,0.080323,0.982045,0.070634,0.062825,-0.004839,
+ 0.063886,0.030062,0.997504,0.070497,0.062761,-0.004819,
+ 0.065648,0.025992,0.997504,0.070899,0.06183,-0.004819,
+ 0.170695,0.080323,0.982045,0.070634,0.062825,-0.004839,
+ 0.065648,0.025992,0.997504,0.070899,0.06183,-0.004819,
+ 0.175402,0.069446,0.982045,0.071041,0.061886,-0.004839,
+ 0.165314,0.090882,0.982045,0.070169,0.063738,-0.004839,
+ 0.061872,0.034015,0.997504,0.070036,0.063665,-0.004819,
+ 0.063886,0.030062,0.997504,0.070497,0.062761,-0.004819,
+ 0.165314,0.090882,0.982045,0.070169,0.063738,-0.004839,
+ 0.063886,0.030062,0.997504,0.070497,0.062761,-0.004819,
+ 0.170695,0.080323,0.982045,0.070634,0.062825,-0.004839,
+ 0.159282,0.101083,0.982045,0.069648,0.064619,-0.004839,
+ 0.059614,0.037832,0.997504,0.06952,0.064538,-0.004819,
+ 0.061872,0.034015,0.997504,0.070036,0.063665,-0.004819,
+ 0.159282,0.101083,0.982045,0.069648,0.064619,-0.004839,
+ 0.061872,0.034015,0.997504,0.070036,0.063665,-0.004819,
+ 0.165314,0.090882,0.982045,0.070169,0.063738,-0.004839,
+ 0.15262,0.110885,0.982045,0.069072,0.065466,-0.004839,
+ 0.057121,0.041501,0.997504,0.068949,0.065377,-0.004819,
+ 0.059614,0.037832,0.997504,0.06952,0.064538,-0.004819,
+ 0.15262,0.110885,0.982045,0.069072,0.065466,-0.004839,
+ 0.059614,0.037832,0.997504,0.06952,0.064538,-0.004819,
+ 0.159282,0.101083,0.982045,0.069648,0.064619,-0.004839,
+ 0.145357,0.120249,0.982045,0.068445,0.066275,-0.004839,
+ 0.054403,0.045006,0.997504,0.068328,0.066178,-0.004819,
+ 0.057121,0.041501,0.997504,0.068949,0.065377,-0.004819,
+ 0.145357,0.120249,0.982045,0.068445,0.066275,-0.004839,
+ 0.057121,0.041501,0.997504,0.068949,0.065377,-0.004819,
+ 0.15262,0.110885,0.982045,0.069072,0.065466,-0.004839,
+ 0.137519,0.129139,0.982045,0.067768,0.067043,-0.004839,
+ 0.051469,0.048333,0.997504,0.067657,0.066939,-0.004819,
+ 0.054403,0.045006,0.997504,0.068328,0.066178,-0.004819,
+ 0.137519,0.129139,0.982045,0.067768,0.067043,-0.004839,
+ 0.054403,0.045006,0.997504,0.068328,0.066178,-0.004819,
+ 0.145357,0.120249,0.982045,0.068445,0.066275,-0.004839,
+ 0.129139,0.137519,0.982045,0.067043,0.067768,-0.004839,
+ 0.048333,0.051469,0.997504,0.066939,0.067657,-0.004819,
+ 0.051469,0.048333,0.997504,0.067657,0.066939,-0.004819,
+ 0.129139,0.137519,0.982045,0.067043,0.067768,-0.004839,
+ 0.051469,0.048333,0.997504,0.067657,0.066939,-0.004819,
+ 0.137519,0.129139,0.982045,0.067768,0.067043,-0.004839,
+ 0.120249,0.145357,0.982045,0.066275,0.068445,-0.004839,
+ 0.045006,0.054403,0.997504,0.066178,0.068328,-0.004819,
+ 0.048333,0.051469,0.997504,0.066939,0.067657,-0.004819,
+ 0.120249,0.145357,0.982045,0.066275,0.068445,-0.004839,
+ 0.048333,0.051469,0.997504,0.066939,0.067657,-0.004819,
+ 0.129139,0.137519,0.982045,0.067043,0.067768,-0.004839,
+ 0.110885,0.15262,0.982045,0.065466,0.069072,-0.004839,
+ 0.041501,0.057121,0.997504,0.065377,0.068949,-0.004819,
+ 0.045006,0.054403,0.997504,0.066178,0.068328,-0.004819,
+ 0.110885,0.15262,0.982045,0.065466,0.069072,-0.004839,
+ 0.045006,0.054403,0.997504,0.066178,0.068328,-0.004819,
+ 0.120249,0.145357,0.982045,0.066275,0.068445,-0.004839,
+ 0.101083,0.159282,0.982045,0.064619,0.069648,-0.004839,
+ 0.037832,0.059614,0.997504,0.064538,0.06952,-0.004819,
+ 0.041501,0.057121,0.997504,0.065377,0.068949,-0.004819,
+ 0.101083,0.159282,0.982045,0.064619,0.069648,-0.004839,
+ 0.041501,0.057121,0.997504,0.065377,0.068949,-0.004819,
+ 0.110885,0.15262,0.982045,0.065466,0.069072,-0.004839,
+ 0.090882,0.165314,0.982045,0.063738,0.070169,-0.004839,
+ 0.034015,0.061872,0.997504,0.063665,0.070036,-0.004819,
+ 0.037832,0.059614,0.997504,0.064538,0.06952,-0.004819,
+ 0.090882,0.165314,0.982045,0.063738,0.070169,-0.004839,
+ 0.037832,0.059614,0.997504,0.064538,0.06952,-0.004819,
+ 0.101083,0.159282,0.982045,0.064619,0.069648,-0.004839,
+ 0.080323,0.170695,0.982045,0.062825,0.070634,-0.004839,
+ 0.030062,0.063886,0.997504,0.062761,0.070497,-0.004819,
+ 0.034015,0.061872,0.997504,0.063665,0.070036,-0.004819,
+ 0.080323,0.170695,0.982045,0.062825,0.070634,-0.004839,
+ 0.034015,0.061872,0.997504,0.063665,0.070036,-0.004819,
+ 0.090882,0.165314,0.982045,0.063738,0.070169,-0.004839,
+ 0.069446,0.175402,0.982045,0.061886,0.071041,-0.004839,
+ 0.025992,0.065648,0.997504,0.06183,0.070899,-0.004819,
+ 0.030062,0.063886,0.997504,0.062761,0.070497,-0.004819,
+ 0.069446,0.175402,0.982045,0.061886,0.071041,-0.004839,
+ 0.030062,0.063886,0.997504,0.062761,0.070497,-0.004819,
+ 0.080323,0.170695,0.982045,0.062825,0.070634,-0.004839,
+ 0.058296,0.179416,0.982045,0.060922,0.071388,-0.004839,
+ 0.021818,0.06715,0.997504,0.060875,0.071243,-0.004819,
+ 0.025992,0.065648,0.997504,0.06183,0.070899,-0.004819,
+ 0.058296,0.179416,0.982045,0.060922,0.071388,-0.004839,
+ 0.025992,0.065648,0.997504,0.06183,0.070899,-0.004819,
+ 0.069446,0.175402,0.982045,0.061886,0.071041,-0.004839,
+ 0.046915,0.182722,0.982045,0.059939,0.071673,-0.004839,
+ 0.017559,0.068388,0.997504,0.059901,0.071526,-0.004819,
+ 0.021818,0.06715,0.997504,0.060875,0.071243,-0.004819,
+ 0.046915,0.182722,0.982045,0.059939,0.071673,-0.004839,
+ 0.021818,0.06715,0.997504,0.060875,0.071243,-0.004819,
+ 0.058296,0.179416,0.982045,0.060922,0.071388,-0.004839,
+ 0.035349,0.185308,0.982045,0.05894,0.071897,-0.004839,
+ 0.01323,0.069355,0.997504,0.058911,0.071747,-0.004819,
+ 0.017559,0.068388,0.997504,0.059901,0.071526,-0.004819,
+ 0.035349,0.185308,0.982045,0.05894,0.071897,-0.004839,
+ 0.017559,0.068388,0.997504,0.059901,0.071526,-0.004819,
+ 0.046915,0.182722,0.982045,0.059939,0.071673,-0.004839,
+ 0.023644,0.187162,0.982045,0.057928,0.072057,-0.004839,
+ 0.008849,0.070049,0.997504,0.057909,0.071906,-0.004819,
+ 0.01323,0.069355,0.997504,0.058911,0.071747,-0.004819,
+ 0.023644,0.187162,0.982045,0.057928,0.072057,-0.004839,
+ 0.01323,0.069355,0.997504,0.058911,0.071747,-0.004819,
+ 0.035349,0.185308,0.982045,0.05894,0.071897,-0.004839,
+ 0.011845,0.188277,0.982045,0.056909,0.072153,-0.004839,
+ 0.004433,0.070467,0.997504,0.056899,0.072001,-0.004819,
+ 0.008849,0.070049,0.997504,0.057909,0.071906,-0.004819,
+ 0.011845,0.188277,0.982045,0.056909,0.072153,-0.004839,
+ 0.008849,0.070049,0.997504,0.057909,0.071906,-0.004819,
+ 0.023644,0.187162,0.982045,0.057928,0.072057,-0.004839,
+ 0,0.188649,0.982045,0.055885,0.072186,-0.004839,
+ 0,0.070606,0.997504,0.055885,0.072033,-0.004819,
+ 0.004433,0.070467,0.997504,0.056899,0.072001,-0.004819,
+ 0,0.188649,0.982045,0.055885,0.072186,-0.004839,
+ 0.004433,0.070467,0.997504,0.056899,0.072001,-0.004819,
+ 0.011845,0.188277,0.982045,0.056909,0.072153,-0.004839,
+ -0.011845,0.188277,0.982045,0.054862,0.072153,-0.004839,
+ -0.004433,0.070467,0.997504,0.054871,0.072001,-0.004819,
+ 0,0.070606,0.997504,0.055885,0.072033,-0.004819,
+ -0.011845,0.188277,0.982045,0.054862,0.072153,-0.004839,
+ 0,0.070606,0.997504,0.055885,0.072033,-0.004819,
+ 0,0.188649,0.982045,0.055885,0.072186,-0.004839,
+ -0.023644,0.187162,0.982045,0.053842,0.072057,-0.004839,
+ -0.008849,0.070049,0.997504,0.053861,0.071906,-0.004819,
+ -0.004433,0.070467,0.997504,0.054871,0.072001,-0.004819,
+ -0.023644,0.187162,0.982045,0.053842,0.072057,-0.004839,
+ -0.004433,0.070467,0.997504,0.054871,0.072001,-0.004819,
+ -0.011845,0.188277,0.982045,0.054862,0.072153,-0.004839,
+ -0.035349,0.185308,0.982045,0.052831,0.071897,-0.004839,
+ -0.01323,0.069355,0.997504,0.052859,0.071747,-0.004819,
+ -0.008849,0.070049,0.997504,0.053861,0.071906,-0.004819,
+ -0.035349,0.185308,0.982045,0.052831,0.071897,-0.004839,
+ -0.008849,0.070049,0.997504,0.053861,0.071906,-0.004819,
+ -0.023644,0.187162,0.982045,0.053842,0.072057,-0.004839,
+ -0.046915,0.182722,0.982045,0.051832,0.071673,-0.004839,
+ -0.017559,0.068388,0.997504,0.051869,0.071526,-0.004819,
+ -0.01323,0.069355,0.997504,0.052859,0.071747,-0.004819,
+ -0.046915,0.182722,0.982045,0.051832,0.071673,-0.004839,
+ -0.01323,0.069355,0.997504,0.052859,0.071747,-0.004819,
+ -0.035349,0.185308,0.982045,0.052831,0.071897,-0.004839,
+ -0.058296,0.179416,0.982045,0.050848,0.071388,-0.004839,
+ -0.021818,0.06715,0.997504,0.050895,0.071243,-0.004819,
+ -0.017559,0.068388,0.997504,0.051869,0.071526,-0.004819,
+ -0.058296,0.179416,0.982045,0.050848,0.071388,-0.004839,
+ -0.017559,0.068388,0.997504,0.051869,0.071526,-0.004819,
+ -0.046915,0.182722,0.982045,0.051832,0.071673,-0.004839,
+ -0.069446,0.175402,0.982045,0.049885,0.071041,-0.004839,
+ -0.025992,0.065648,0.997504,0.049941,0.070899,-0.004819,
+ -0.021818,0.06715,0.997504,0.050895,0.071243,-0.004819,
+ -0.069446,0.175402,0.982045,0.049885,0.071041,-0.004839,
+ -0.021818,0.06715,0.997504,0.050895,0.071243,-0.004819,
+ -0.058296,0.179416,0.982045,0.050848,0.071388,-0.004839,
+ -0.080323,0.170695,0.982045,0.048945,0.070634,-0.004839,
+ -0.030062,0.063886,0.997504,0.04901,0.070497,-0.004819,
+ -0.025992,0.065648,0.997504,0.049941,0.070899,-0.004819,
+ -0.080323,0.170695,0.982045,0.048945,0.070634,-0.004839,
+ -0.025992,0.065648,0.997504,0.049941,0.070899,-0.004819,
+ -0.069446,0.175402,0.982045,0.049885,0.071041,-0.004839,
+ -0.090882,0.165314,0.982045,0.048033,0.070169,-0.004839,
+ -0.034015,0.061872,0.997504,0.048106,0.070036,-0.004819,
+ -0.030062,0.063886,0.997504,0.04901,0.070497,-0.004819,
+ -0.090882,0.165314,0.982045,0.048033,0.070169,-0.004839,
+ -0.030062,0.063886,0.997504,0.04901,0.070497,-0.004819,
+ -0.080323,0.170695,0.982045,0.048945,0.070634,-0.004839,
+ -0.101083,0.159282,0.982045,0.047151,0.069648,-0.004839,
+ -0.037832,0.059614,0.997504,0.047233,0.06952,-0.004819,
+ -0.034015,0.061872,0.997504,0.048106,0.070036,-0.004819,
+ -0.101083,0.159282,0.982045,0.047151,0.069648,-0.004839,
+ -0.034015,0.061872,0.997504,0.048106,0.070036,-0.004819,
+ -0.090882,0.165314,0.982045,0.048033,0.070169,-0.004839,
+ -0.110885,0.15262,0.982045,0.046304,0.069072,-0.004839,
+ -0.041501,0.057121,0.997504,0.046394,0.068949,-0.004819,
+ -0.037832,0.059614,0.997504,0.047233,0.06952,-0.004819,
+ -0.110885,0.15262,0.982045,0.046304,0.069072,-0.004839,
+ -0.037832,0.059614,0.997504,0.047233,0.06952,-0.004819,
+ -0.101083,0.159282,0.982045,0.047151,0.069648,-0.004839,
+ -0.120249,0.145357,0.982045,0.045495,0.068445,-0.004839,
+ -0.045006,0.054403,0.997504,0.045592,0.068328,-0.004819,
+ -0.041501,0.057121,0.997504,0.046394,0.068949,-0.004819,
+ -0.120249,0.145357,0.982045,0.045495,0.068445,-0.004839,
+ -0.041501,0.057121,0.997504,0.046394,0.068949,-0.004819,
+ -0.110885,0.15262,0.982045,0.046304,0.069072,-0.004839,
+ -0.129139,0.137519,0.982045,0.044727,0.067768,-0.004839,
+ -0.048333,0.051469,0.997504,0.044831,0.067657,-0.004819,
+ -0.045006,0.054403,0.997504,0.045592,0.068328,-0.004819,
+ -0.129139,0.137519,0.982045,0.044727,0.067768,-0.004839,
+ -0.045006,0.054403,0.997504,0.045592,0.068328,-0.004819,
+ -0.120249,0.145357,0.982045,0.045495,0.068445,-0.004839,
+ -0.137519,0.129139,0.982045,0.044003,0.067043,-0.004839,
+ -0.051469,0.048333,0.997504,0.044114,0.066939,-0.004819,
+ -0.048333,0.051469,0.997504,0.044831,0.067657,-0.004819,
+ -0.137519,0.129139,0.982045,0.044003,0.067043,-0.004839,
+ -0.048333,0.051469,0.997504,0.044831,0.067657,-0.004819,
+ -0.129139,0.137519,0.982045,0.044727,0.067768,-0.004839,
+ -0.145357,0.120249,0.982045,0.043326,0.066275,-0.004839,
+ -0.054403,0.045006,0.997504,0.043443,0.066178,-0.004819,
+ -0.051469,0.048333,0.997504,0.044114,0.066939,-0.004819,
+ -0.145357,0.120249,0.982045,0.043326,0.066275,-0.004839,
+ -0.051469,0.048333,0.997504,0.044114,0.066939,-0.004819,
+ -0.137519,0.129139,0.982045,0.044003,0.067043,-0.004839,
+ -0.15262,0.110885,0.982045,0.042698,0.065466,-0.004839,
+ -0.057121,0.041501,0.997504,0.042821,0.065377,-0.004819,
+ -0.054403,0.045006,0.997504,0.043443,0.066178,-0.004819,
+ -0.15262,0.110885,0.982045,0.042698,0.065466,-0.004839,
+ -0.054403,0.045006,0.997504,0.043443,0.066178,-0.004819,
+ -0.145357,0.120249,0.982045,0.043326,0.066275,-0.004839,
+ -0.159282,0.101083,0.982045,0.042123,0.064619,-0.004839,
+ -0.059614,0.037832,0.997504,0.042251,0.064538,-0.004819,
+ -0.057121,0.041501,0.997504,0.042821,0.065377,-0.004819,
+ -0.159282,0.101083,0.982045,0.042123,0.064619,-0.004839,
+ -0.057121,0.041501,0.997504,0.042821,0.065377,-0.004819,
+ -0.15262,0.110885,0.982045,0.042698,0.065466,-0.004839,
+ -0.165314,0.090882,0.982045,0.041601,0.063738,-0.004839,
+ -0.061872,0.034015,0.997504,0.041735,0.063665,-0.004819,
+ -0.059614,0.037832,0.997504,0.042251,0.064538,-0.004819,
+ -0.165314,0.090882,0.982045,0.041601,0.063738,-0.004839,
+ -0.059614,0.037832,0.997504,0.042251,0.064538,-0.004819,
+ -0.159282,0.101083,0.982045,0.042123,0.064619,-0.004839,
+ -0.170695,0.080323,0.982045,0.041136,0.062825,-0.004839,
+ -0.063886,0.030062,0.997504,0.041274,0.062761,-0.004819,
+ -0.061872,0.034015,0.997504,0.041735,0.063665,-0.004819,
+ -0.170695,0.080323,0.982045,0.041136,0.062825,-0.004839,
+ -0.061872,0.034015,0.997504,0.041735,0.063665,-0.004819,
+ -0.165314,0.090882,0.982045,0.041601,0.063738,-0.004839,
+ -0.175402,0.069446,0.982045,0.04073,0.061886,-0.004839,
+ -0.065648,0.025992,0.997504,0.040871,0.06183,-0.004819,
+ -0.063886,0.030062,0.997504,0.041274,0.062761,-0.004819,
+ -0.175402,0.069446,0.982045,0.04073,0.061886,-0.004839,
+ -0.063886,0.030062,0.997504,0.041274,0.062761,-0.004819,
+ -0.170695,0.080323,0.982045,0.041136,0.062825,-0.004839,
+ -0.065648,0.025992,0.997504,0.040871,0.06183,-0.004819,
+ -0.006883,0.002725,0.999973,0.041014,0.061773,-0.004818,
+ -0.006698,0.003152,0.999973,0.041413,0.062696,-0.004818,
+ -0.065648,0.025992,0.997504,0.040871,0.06183,-0.004819,
+ -0.006698,0.003152,0.999973,0.041413,0.062696,-0.004818,
+ -0.063886,0.030062,0.997504,0.041274,0.062761,-0.004819,
+ -0.06715,0.021818,0.997504,0.040528,0.060875,-0.004819,
+ -0.00704,0.002287,0.999973,0.040673,0.060828,-0.004818,
+ -0.006883,0.002725,0.999973,0.041014,0.061773,-0.004818,
+ -0.06715,0.021818,0.997504,0.040528,0.060875,-0.004819,
+ -0.006883,0.002725,0.999973,0.041014,0.061773,-0.004818,
+ -0.065648,0.025992,0.997504,0.040871,0.06183,-0.004819,
+ -0.068388,0.017559,0.997504,0.040245,0.059901,-0.004819,
+ -0.00717,0.001841,0.999973,0.040393,0.059863,-0.004818,
+ -0.00704,0.002287,0.999973,0.040673,0.060828,-0.004818,
+ -0.068388,0.017559,0.997504,0.040245,0.059901,-0.004819,
+ -0.00704,0.002287,0.999973,0.040673,0.060828,-0.004818,
+ -0.06715,0.021818,0.997504,0.040528,0.060875,-0.004819,
+ -0.069355,0.01323,0.997504,0.040023,0.058911,-0.004819,
+ -0.007271,0.001387,0.999973,0.040174,0.058882,-0.004818,
+ -0.00717,0.001841,0.999973,0.040393,0.059863,-0.004818,
+ -0.069355,0.01323,0.997504,0.040023,0.058911,-0.004819,
+ -0.00717,0.001841,0.999973,0.040393,0.059863,-0.004818,
+ -0.068388,0.017559,0.997504,0.040245,0.059901,-0.004819,
+ -0.070049,0.008849,0.997504,0.039865,0.057909,-0.004819,
+ -0.007344,0.000928,0.999973,0.040017,0.05789,-0.004818,
+ -0.007271,0.001387,0.999973,0.040174,0.058882,-0.004818,
+ -0.070049,0.008849,0.997504,0.039865,0.057909,-0.004819,
+ -0.007271,0.001387,0.999973,0.040174,0.058882,-0.004818,
+ -0.069355,0.01323,0.997504,0.040023,0.058911,-0.004819,
+ -0.070467,0.004433,0.997504,0.039769,0.056899,-0.004819,
+ -0.007388,0.000465,0.999973,0.039922,0.05689,-0.004818,
+ -0.007344,0.000928,0.999973,0.040017,0.05789,-0.004818,
+ -0.070467,0.004433,0.997504,0.039769,0.056899,-0.004819,
+ -0.007344,0.000928,0.999973,0.040017,0.05789,-0.004818,
+ -0.070049,0.008849,0.997504,0.039865,0.057909,-0.004819,
+ -0.070606,0,0.997504,0.039737,0.055885,-0.004819,
+ -0.007402,0,0.999973,0.039891,0.055885,-0.004818,
+ -0.007388,0.000465,0.999973,0.039922,0.05689,-0.004818,
+ -0.070606,0,0.997504,0.039737,0.055885,-0.004819,
+ -0.007388,0.000465,0.999973,0.039922,0.05689,-0.004818,
+ -0.070467,0.004433,0.997504,0.039769,0.056899,-0.004819,
+ -0.070467,-0.004433,0.997504,0.039769,0.054871,-0.004819,
+ -0.007388,-0.000465,0.999973,0.039922,0.054881,-0.004818,
+ -0.007402,0,0.999973,0.039891,0.055885,-0.004818,
+ -0.070467,-0.004433,0.997504,0.039769,0.054871,-0.004819,
+ -0.007402,0,0.999973,0.039891,0.055885,-0.004818,
+ -0.070606,0,0.997504,0.039737,0.055885,-0.004819,
+ -0.070049,-0.008849,0.997504,0.039865,0.053861,-0.004819,
+ -0.007344,-0.000928,0.999973,0.040017,0.053881,-0.004818,
+ -0.007388,-0.000465,0.999973,0.039922,0.054881,-0.004818,
+ -0.070049,-0.008849,0.997504,0.039865,0.053861,-0.004819,
+ -0.007388,-0.000465,0.999973,0.039922,0.054881,-0.004818,
+ -0.070467,-0.004433,0.997504,0.039769,0.054871,-0.004819,
+ -0.069355,-0.01323,0.997504,0.040023,0.052859,-0.004819,
+ -0.007271,-0.001387,0.999973,0.040174,0.052888,-0.004818,
+ -0.007344,-0.000928,0.999973,0.040017,0.053881,-0.004818,
+ -0.069355,-0.01323,0.997504,0.040023,0.052859,-0.004819,
+ -0.007344,-0.000928,0.999973,0.040017,0.053881,-0.004818,
+ -0.070049,-0.008849,0.997504,0.039865,0.053861,-0.004819,
+ -0.068388,-0.017559,0.997504,0.040245,0.051869,-0.004819,
+ -0.00717,-0.001841,0.999973,0.040393,0.051908,-0.004818,
+ -0.007271,-0.001387,0.999973,0.040174,0.052888,-0.004818,
+ -0.068388,-0.017559,0.997504,0.040245,0.051869,-0.004819,
+ -0.007271,-0.001387,0.999973,0.040174,0.052888,-0.004818,
+ -0.069355,-0.01323,0.997504,0.040023,0.052859,-0.004819,
+ -0.06715,-0.021818,0.997504,0.040528,0.050895,-0.004819,
+ -0.00704,-0.002287,0.999973,0.040673,0.050943,-0.004818,
+ -0.00717,-0.001841,0.999973,0.040393,0.051908,-0.004818,
+ -0.06715,-0.021818,0.997504,0.040528,0.050895,-0.004819,
+ -0.00717,-0.001841,0.999973,0.040393,0.051908,-0.004818,
+ -0.068388,-0.017559,0.997504,0.040245,0.051869,-0.004819,
+ -0.065648,-0.025992,0.997504,0.040871,0.049941,-0.004819,
+ -0.006883,-0.002725,0.999973,0.041014,0.049997,-0.004818,
+ -0.00704,-0.002287,0.999973,0.040673,0.050943,-0.004818,
+ -0.065648,-0.025992,0.997504,0.040871,0.049941,-0.004819,
+ -0.00704,-0.002287,0.999973,0.040673,0.050943,-0.004818,
+ -0.06715,-0.021818,0.997504,0.040528,0.050895,-0.004819,
+ -0.063886,-0.030062,0.997504,0.041274,0.04901,-0.004819,
+ -0.006698,-0.003152,0.999973,0.041413,0.049075,-0.004818,
+ -0.006883,-0.002725,0.999973,0.041014,0.049997,-0.004818,
+ -0.063886,-0.030062,0.997504,0.041274,0.04901,-0.004819,
+ -0.006883,-0.002725,0.999973,0.041014,0.049997,-0.004818,
+ -0.065648,-0.025992,0.997504,0.040871,0.049941,-0.004819,
+ -0.061872,-0.034015,0.997504,0.041735,0.048106,-0.004819,
+ -0.006487,-0.003566,0.999973,0.041869,0.04818,-0.004818,
+ -0.006698,-0.003152,0.999973,0.041413,0.049075,-0.004818,
+ -0.061872,-0.034015,0.997504,0.041735,0.048106,-0.004819,
+ -0.006698,-0.003152,0.999973,0.041413,0.049075,-0.004818,
+ -0.063886,-0.030062,0.997504,0.041274,0.04901,-0.004819,
+ -0.059614,-0.037832,0.997504,0.042251,0.047233,-0.004819,
+ -0.00625,-0.003966,0.999973,0.042381,0.047315,-0.004818,
+ -0.006487,-0.003566,0.999973,0.041869,0.04818,-0.004818,
+ -0.059614,-0.037832,0.997504,0.042251,0.047233,-0.004819,
+ -0.006487,-0.003566,0.999973,0.041869,0.04818,-0.004818,
+ -0.061872,-0.034015,0.997504,0.041735,0.048106,-0.004819,
+ -0.057121,-0.041501,0.997504,0.042821,0.046394,-0.004819,
+ -0.005989,-0.004351,0.999973,0.042945,0.046484,-0.004818,
+ -0.00625,-0.003966,0.999973,0.042381,0.047315,-0.004818,
+ -0.057121,-0.041501,0.997504,0.042821,0.046394,-0.004819,
+ -0.00625,-0.003966,0.999973,0.042381,0.047315,-0.004818,
+ -0.059614,-0.037832,0.997504,0.042251,0.047233,-0.004819,
+ -0.054403,-0.045006,0.997504,0.043443,0.045592,-0.004819,
+ -0.005704,-0.004718,0.999973,0.043561,0.04569,-0.004818,
+ -0.005989,-0.004351,0.999973,0.042945,0.046484,-0.004818,
+ -0.054403,-0.045006,0.997504,0.043443,0.045592,-0.004819,
+ -0.005989,-0.004351,0.999973,0.042945,0.046484,-0.004818,
+ -0.057121,-0.041501,0.997504,0.042821,0.046394,-0.004819,
+ -0.051469,-0.048333,0.997504,0.044114,0.044831,-0.004819,
+ -0.005396,-0.005067,0.999973,0.044226,0.044936,-0.004818,
+ -0.005704,-0.004718,0.999973,0.043561,0.04569,-0.004818,
+ -0.051469,-0.048333,0.997504,0.044114,0.044831,-0.004819,
+ -0.005704,-0.004718,0.999973,0.043561,0.04569,-0.004818,
+ -0.054403,-0.045006,0.997504,0.043443,0.045592,-0.004819,
+ -0.048333,-0.051469,0.997504,0.044831,0.044114,-0.004819,
+ -0.005067,-0.005396,0.999973,0.044936,0.044226,-0.004818,
+ -0.005396,-0.005067,0.999973,0.044226,0.044936,-0.004818,
+ -0.048333,-0.051469,0.997504,0.044831,0.044114,-0.004819,
+ -0.005396,-0.005067,0.999973,0.044226,0.044936,-0.004818,
+ -0.051469,-0.048333,0.997504,0.044114,0.044831,-0.004819,
+ -0.045006,-0.054403,0.997504,0.045592,0.043443,-0.004819,
+ -0.004718,-0.005704,0.999973,0.04569,0.043561,-0.004818,
+ -0.005067,-0.005396,0.999973,0.044936,0.044226,-0.004818,
+ -0.045006,-0.054403,0.997504,0.045592,0.043443,-0.004819,
+ -0.005067,-0.005396,0.999973,0.044936,0.044226,-0.004818,
+ -0.048333,-0.051469,0.997504,0.044831,0.044114,-0.004819,
+ -0.041501,-0.057121,0.997504,0.046394,0.042821,-0.004819,
+ -0.004351,-0.005989,0.999973,0.046484,0.042945,-0.004818,
+ -0.004718,-0.005704,0.999973,0.04569,0.043561,-0.004818,
+ -0.041501,-0.057121,0.997504,0.046394,0.042821,-0.004819,
+ -0.004718,-0.005704,0.999973,0.04569,0.043561,-0.004818,
+ -0.045006,-0.054403,0.997504,0.045592,0.043443,-0.004819,
+ -0.037832,-0.059614,0.997504,0.047233,0.042251,-0.004819,
+ -0.003966,-0.00625,0.999973,0.047315,0.042381,-0.004818,
+ -0.004351,-0.005989,0.999973,0.046484,0.042945,-0.004818,
+ -0.037832,-0.059614,0.997504,0.047233,0.042251,-0.004819,
+ -0.004351,-0.005989,0.999973,0.046484,0.042945,-0.004818,
+ -0.041501,-0.057121,0.997504,0.046394,0.042821,-0.004819,
+ -0.034015,-0.061872,0.997504,0.048106,0.041735,-0.004819,
+ -0.003566,-0.006487,0.999973,0.04818,0.041869,-0.004818,
+ -0.003966,-0.00625,0.999973,0.047315,0.042381,-0.004818,
+ -0.034015,-0.061872,0.997504,0.048106,0.041735,-0.004819,
+ -0.003966,-0.00625,0.999973,0.047315,0.042381,-0.004818,
+ -0.037832,-0.059614,0.997504,0.047233,0.042251,-0.004819,
+ -0.030062,-0.063886,0.997504,0.04901,0.041274,-0.004819,
+ -0.003152,-0.006698,0.999973,0.049075,0.041413,-0.004818,
+ -0.003566,-0.006487,0.999973,0.04818,0.041869,-0.004818,
+ -0.030062,-0.063886,0.997504,0.04901,0.041274,-0.004819,
+ -0.003566,-0.006487,0.999973,0.04818,0.041869,-0.004818,
+ -0.034015,-0.061872,0.997504,0.048106,0.041735,-0.004819,
+ -0.025992,-0.065648,0.997504,0.049941,0.040871,-0.004819,
+ -0.002725,-0.006883,0.999973,0.049997,0.041014,-0.004818,
+ -0.003152,-0.006698,0.999973,0.049075,0.041413,-0.004818,
+ -0.025992,-0.065648,0.997504,0.049941,0.040871,-0.004819,
+ -0.003152,-0.006698,0.999973,0.049075,0.041413,-0.004818,
+ -0.030062,-0.063886,0.997504,0.04901,0.041274,-0.004819,
+ -0.021818,-0.06715,0.997504,0.050895,0.040528,-0.004819,
+ -0.002287,-0.00704,0.999973,0.050943,0.040673,-0.004818,
+ -0.002725,-0.006883,0.999973,0.049997,0.041014,-0.004818,
+ -0.021818,-0.06715,0.997504,0.050895,0.040528,-0.004819,
+ -0.002725,-0.006883,0.999973,0.049997,0.041014,-0.004818,
+ -0.025992,-0.065648,0.997504,0.049941,0.040871,-0.004819,
+ -0.017559,-0.068388,0.997504,0.051869,0.040245,-0.004819,
+ -0.001841,-0.00717,0.999973,0.051908,0.040393,-0.004818,
+ -0.002287,-0.00704,0.999973,0.050943,0.040673,-0.004818,
+ -0.017559,-0.068388,0.997504,0.051869,0.040245,-0.004819,
+ -0.002287,-0.00704,0.999973,0.050943,0.040673,-0.004818,
+ -0.021818,-0.06715,0.997504,0.050895,0.040528,-0.004819,
+ -0.01323,-0.069355,0.997504,0.052859,0.040023,-0.004819,
+ -0.001387,-0.007271,0.999973,0.052888,0.040174,-0.004818,
+ -0.001841,-0.00717,0.999973,0.051908,0.040393,-0.004818,
+ -0.01323,-0.069355,0.997504,0.052859,0.040023,-0.004819,
+ -0.001841,-0.00717,0.999973,0.051908,0.040393,-0.004818,
+ -0.017559,-0.068388,0.997504,0.051869,0.040245,-0.004819,
+ -0.008849,-0.070049,0.997504,0.053861,0.039865,-0.004819,
+ -0.000928,-0.007344,0.999973,0.053881,0.040017,-0.004818,
+ -0.001387,-0.007271,0.999973,0.052888,0.040174,-0.004818,
+ -0.008849,-0.070049,0.997504,0.053861,0.039865,-0.004819,
+ -0.001387,-0.007271,0.999973,0.052888,0.040174,-0.004818,
+ -0.01323,-0.069355,0.997504,0.052859,0.040023,-0.004819,
+ -0.004433,-0.070467,0.997504,0.054871,0.039769,-0.004819,
+ -0.000465,-0.007388,0.999973,0.054881,0.039922,-0.004818,
+ -0.000928,-0.007344,0.999973,0.053881,0.040017,-0.004818,
+ -0.004433,-0.070467,0.997504,0.054871,0.039769,-0.004819,
+ -0.000928,-0.007344,0.999973,0.053881,0.040017,-0.004818,
+ -0.008849,-0.070049,0.997504,0.053861,0.039865,-0.004819,
+ 0,-0.070606,0.997504,0.055885,0.039737,-0.004819,
+ 0,-0.007402,0.999973,0.055885,0.039891,-0.004818,
+ -0.000465,-0.007388,0.999973,0.054881,0.039922,-0.004818,
+ 0,-0.070606,0.997504,0.055885,0.039737,-0.004819,
+ -0.000465,-0.007388,0.999973,0.054881,0.039922,-0.004818,
+ -0.004433,-0.070467,0.997504,0.054871,0.039769,-0.004819,
+ 0.004433,-0.070467,0.997504,0.056899,0.039769,-0.004819,
+ 0.000465,-0.007388,0.999973,0.05689,0.039922,-0.004818,
+ 0,-0.007402,0.999973,0.055885,0.039891,-0.004818,
+ 0.004433,-0.070467,0.997504,0.056899,0.039769,-0.004819,
+ 0,-0.007402,0.999973,0.055885,0.039891,-0.004818,
+ 0,-0.070606,0.997504,0.055885,0.039737,-0.004819,
+ 0.008849,-0.070049,0.997504,0.057909,0.039865,-0.004819,
+ 0.000928,-0.007344,0.999973,0.05789,0.040017,-0.004818,
+ 0.000465,-0.007388,0.999973,0.05689,0.039922,-0.004818,
+ 0.008849,-0.070049,0.997504,0.057909,0.039865,-0.004819,
+ 0.000465,-0.007388,0.999973,0.05689,0.039922,-0.004818,
+ 0.004433,-0.070467,0.997504,0.056899,0.039769,-0.004819,
+ 0.01323,-0.069355,0.997504,0.058911,0.040023,-0.004819,
+ 0.001387,-0.007271,0.999973,0.058882,0.040174,-0.004818,
+ 0.000928,-0.007344,0.999973,0.05789,0.040017,-0.004818,
+ 0.01323,-0.069355,0.997504,0.058911,0.040023,-0.004819,
+ 0.000928,-0.007344,0.999973,0.05789,0.040017,-0.004818,
+ 0.008849,-0.070049,0.997504,0.057909,0.039865,-0.004819,
+ 0.017559,-0.068388,0.997504,0.059901,0.040245,-0.004819,
+ 0.001841,-0.00717,0.999973,0.059863,0.040393,-0.004818,
+ 0.001387,-0.007271,0.999973,0.058882,0.040174,-0.004818,
+ 0.017559,-0.068388,0.997504,0.059901,0.040245,-0.004819,
+ 0.001387,-0.007271,0.999973,0.058882,0.040174,-0.004818,
+ 0.01323,-0.069355,0.997504,0.058911,0.040023,-0.004819,
+ 0.021818,-0.06715,0.997504,0.060875,0.040528,-0.004819,
+ 0.002287,-0.00704,0.999973,0.060828,0.040673,-0.004818,
+ 0.001841,-0.00717,0.999973,0.059863,0.040393,-0.004818,
+ 0.021818,-0.06715,0.997504,0.060875,0.040528,-0.004819,
+ 0.001841,-0.00717,0.999973,0.059863,0.040393,-0.004818,
+ 0.017559,-0.068388,0.997504,0.059901,0.040245,-0.004819,
+ 0.025992,-0.065648,0.997504,0.06183,0.040871,-0.004819,
+ 0.002725,-0.006883,0.999973,0.061773,0.041014,-0.004818,
+ 0.002287,-0.00704,0.999973,0.060828,0.040673,-0.004818,
+ 0.025992,-0.065648,0.997504,0.06183,0.040871,-0.004819,
+ 0.002287,-0.00704,0.999973,0.060828,0.040673,-0.004818,
+ 0.021818,-0.06715,0.997504,0.060875,0.040528,-0.004819,
+ 0.030062,-0.063886,0.997504,0.062761,0.041274,-0.004819,
+ 0.003152,-0.006698,0.999973,0.062696,0.041413,-0.004818,
+ 0.002725,-0.006883,0.999973,0.061773,0.041014,-0.004818,
+ 0.030062,-0.063886,0.997504,0.062761,0.041274,-0.004819,
+ 0.002725,-0.006883,0.999973,0.061773,0.041014,-0.004818,
+ 0.025992,-0.065648,0.997504,0.06183,0.040871,-0.004819,
+ 0.034015,-0.061872,0.997504,0.063665,0.041735,-0.004819,
+ 0.003566,-0.006487,0.999973,0.063591,0.041869,-0.004818,
+ 0.003152,-0.006698,0.999973,0.062696,0.041413,-0.004818,
+ 0.034015,-0.061872,0.997504,0.063665,0.041735,-0.004819,
+ 0.003152,-0.006698,0.999973,0.062696,0.041413,-0.004818,
+ 0.030062,-0.063886,0.997504,0.062761,0.041274,-0.004819,
+ 0.037832,-0.059614,0.997504,0.064538,0.042251,-0.004819,
+ 0.003966,-0.00625,0.999973,0.064456,0.042381,-0.004818,
+ 0.003566,-0.006487,0.999973,0.063591,0.041869,-0.004818,
+ 0.037832,-0.059614,0.997504,0.064538,0.042251,-0.004819,
+ 0.003566,-0.006487,0.999973,0.063591,0.041869,-0.004818,
+ 0.034015,-0.061872,0.997504,0.063665,0.041735,-0.004819,
+ 0.041501,-0.057121,0.997504,0.065377,0.042821,-0.004819,
+ 0.004351,-0.005989,0.999973,0.065287,0.042945,-0.004818,
+ 0.003966,-0.00625,0.999973,0.064456,0.042381,-0.004818,
+ 0.041501,-0.057121,0.997504,0.065377,0.042821,-0.004819,
+ 0.003966,-0.00625,0.999973,0.064456,0.042381,-0.004818,
+ 0.037832,-0.059614,0.997504,0.064538,0.042251,-0.004819,
+ 0.045006,-0.054403,0.997504,0.066178,0.043443,-0.004819,
+ 0.004718,-0.005704,0.999973,0.066081,0.043561,-0.004818,
+ 0.004351,-0.005989,0.999973,0.065287,0.042945,-0.004818,
+ 0.045006,-0.054403,0.997504,0.066178,0.043443,-0.004819,
+ 0.004351,-0.005989,0.999973,0.065287,0.042945,-0.004818,
+ 0.041501,-0.057121,0.997504,0.065377,0.042821,-0.004819,
+ 0.048333,-0.051469,0.997504,0.066939,0.044114,-0.004819,
+ 0.005067,-0.005396,0.999973,0.066834,0.044226,-0.004818,
+ 0.004718,-0.005704,0.999973,0.066081,0.043561,-0.004818,
+ 0.048333,-0.051469,0.997504,0.066939,0.044114,-0.004819,
+ 0.004718,-0.005704,0.999973,0.066081,0.043561,-0.004818,
+ 0.045006,-0.054403,0.997504,0.066178,0.043443,-0.004819,
+ 0.051469,-0.048333,0.997504,0.067657,0.044831,-0.004819,
+ 0.005396,-0.005067,0.999973,0.067545,0.044936,-0.004818,
+ 0.005067,-0.005396,0.999973,0.066834,0.044226,-0.004818,
+ 0.051469,-0.048333,0.997504,0.067657,0.044831,-0.004819,
+ 0.005067,-0.005396,0.999973,0.066834,0.044226,-0.004818,
+ 0.048333,-0.051469,0.997504,0.066939,0.044114,-0.004819,
+ 0.054403,-0.045006,0.997504,0.068328,0.045592,-0.004819,
+ 0.005704,-0.004718,0.999973,0.06821,0.04569,-0.004818,
+ 0.005396,-0.005067,0.999973,0.067545,0.044936,-0.004818,
+ 0.054403,-0.045006,0.997504,0.068328,0.045592,-0.004819,
+ 0.005396,-0.005067,0.999973,0.067545,0.044936,-0.004818,
+ 0.051469,-0.048333,0.997504,0.067657,0.044831,-0.004819,
+ 0.057121,-0.041501,0.997504,0.068949,0.046394,-0.004819,
+ 0.005989,-0.004351,0.999973,0.068825,0.046484,-0.004818,
+ 0.005704,-0.004718,0.999973,0.06821,0.04569,-0.004818,
+ 0.057121,-0.041501,0.997504,0.068949,0.046394,-0.004819,
+ 0.005704,-0.004718,0.999973,0.06821,0.04569,-0.004818,
+ 0.054403,-0.045006,0.997504,0.068328,0.045592,-0.004819,
+ 0.059614,-0.037832,0.997504,0.06952,0.047233,-0.004819,
+ 0.00625,-0.003966,0.999973,0.06939,0.047315,-0.004818,
+ 0.005989,-0.004351,0.999973,0.068825,0.046484,-0.004818,
+ 0.059614,-0.037832,0.997504,0.06952,0.047233,-0.004819,
+ 0.005989,-0.004351,0.999973,0.068825,0.046484,-0.004818,
+ 0.057121,-0.041501,0.997504,0.068949,0.046394,-0.004819,
+ 0.061872,-0.034015,0.997504,0.070036,0.048106,-0.004819,
+ 0.006487,-0.003566,0.999973,0.069902,0.04818,-0.004818,
+ 0.00625,-0.003966,0.999973,0.06939,0.047315,-0.004818,
+ 0.061872,-0.034015,0.997504,0.070036,0.048106,-0.004819,
+ 0.00625,-0.003966,0.999973,0.06939,0.047315,-0.004818,
+ 0.059614,-0.037832,0.997504,0.06952,0.047233,-0.004819,
+ 0.063886,-0.030062,0.997504,0.070497,0.04901,-0.004819,
+ 0.006698,-0.003152,0.999973,0.070358,0.049075,-0.004818,
+ 0.006487,-0.003566,0.999973,0.069902,0.04818,-0.004818,
+ 0.063886,-0.030062,0.997504,0.070497,0.04901,-0.004819,
+ 0.006487,-0.003566,0.999973,0.069902,0.04818,-0.004818,
+ 0.061872,-0.034015,0.997504,0.070036,0.048106,-0.004819,
+ 0.065648,-0.025992,0.997504,0.070899,0.049941,-0.004819,
+ 0.006883,-0.002725,0.999973,0.070757,0.049997,-0.004818,
+ 0.006698,-0.003152,0.999973,0.070358,0.049075,-0.004818,
+ 0.065648,-0.025992,0.997504,0.070899,0.049941,-0.004819,
+ 0.006698,-0.003152,0.999973,0.070358,0.049075,-0.004818,
+ 0.063886,-0.030062,0.997504,0.070497,0.04901,-0.004819,
+ 0.06715,-0.021818,0.997504,0.071243,0.050895,-0.004819,
+ 0.00704,-0.002287,0.999973,0.071097,0.050943,-0.004818,
+ 0.006883,-0.002725,0.999973,0.070757,0.049997,-0.004818,
+ 0.06715,-0.021818,0.997504,0.071243,0.050895,-0.004819,
+ 0.006883,-0.002725,0.999973,0.070757,0.049997,-0.004818,
+ 0.065648,-0.025992,0.997504,0.070899,0.049941,-0.004819,
+ 0.068388,-0.017559,0.997504,0.071526,0.051869,-0.004819,
+ 0.00717,-0.001841,0.999973,0.071377,0.051908,-0.004818,
+ 0.00704,-0.002287,0.999973,0.071097,0.050943,-0.004818,
+ 0.068388,-0.017559,0.997504,0.071526,0.051869,-0.004819,
+ 0.00704,-0.002287,0.999973,0.071097,0.050943,-0.004818,
+ 0.06715,-0.021818,0.997504,0.071243,0.050895,-0.004819,
+ 0.069355,-0.01323,0.997504,0.071747,0.052859,-0.004819,
+ 0.007271,-0.001387,0.999973,0.071597,0.052888,-0.004818,
+ 0.00717,-0.001841,0.999973,0.071377,0.051908,-0.004818,
+ 0.069355,-0.01323,0.997504,0.071747,0.052859,-0.004819,
+ 0.00717,-0.001841,0.999973,0.071377,0.051908,-0.004818,
+ 0.068388,-0.017559,0.997504,0.071526,0.051869,-0.004819,
+ 0.070049,-0.008849,0.997504,0.071906,0.053861,-0.004819,
+ 0.007344,-0.000928,0.999973,0.071754,0.053881,-0.004818,
+ 0.007271,-0.001387,0.999973,0.071597,0.052888,-0.004818,
+ 0.070049,-0.008849,0.997504,0.071906,0.053861,-0.004819,
+ 0.007271,-0.001387,0.999973,0.071597,0.052888,-0.004818,
+ 0.069355,-0.01323,0.997504,0.071747,0.052859,-0.004819,
+ 0.070467,-0.004433,0.997504,0.072001,0.054871,-0.004819,
+ 0.007388,-0.000465,0.999973,0.071848,0.054881,-0.004818,
+ 0.007344,-0.000928,0.999973,0.071754,0.053881,-0.004818,
+ 0.070467,-0.004433,0.997504,0.072001,0.054871,-0.004819,
+ 0.007344,-0.000928,0.999973,0.071754,0.053881,-0.004818,
+ 0.070049,-0.008849,0.997504,0.071906,0.053861,-0.004819,
+ 0.070606,0,0.997504,0.072033,0.055885,-0.004819,
+ 0.007402,0,0.999973,0.07188,0.055885,-0.004818,
+ 0.007388,-0.000465,0.999973,0.071848,0.054881,-0.004818,
+ 0.070606,0,0.997504,0.072033,0.055885,-0.004819,
+ 0.007388,-0.000465,0.999973,0.071848,0.054881,-0.004818,
+ 0.070467,-0.004433,0.997504,0.072001,0.054871,-0.004819,
+ 0.070467,0.004433,0.997504,0.072001,0.056899,-0.004819,
+ 0.007388,0.000465,0.999973,0.071848,0.05689,-0.004818,
+ 0.007402,0,0.999973,0.07188,0.055885,-0.004818,
+ 0.070467,0.004433,0.997504,0.072001,0.056899,-0.004819,
+ 0.007402,0,0.999973,0.07188,0.055885,-0.004818,
+ 0.070606,0,0.997504,0.072033,0.055885,-0.004819,
+ 0.070049,0.008849,0.997504,0.071906,0.057909,-0.004819,
+ 0.007344,0.000928,0.999973,0.071754,0.05789,-0.004818,
+ 0.007388,0.000465,0.999973,0.071848,0.05689,-0.004818,
+ 0.070049,0.008849,0.997504,0.071906,0.057909,-0.004819,
+ 0.007388,0.000465,0.999973,0.071848,0.05689,-0.004818,
+ 0.070467,0.004433,0.997504,0.072001,0.056899,-0.004819,
+ 0.069355,0.01323,0.997504,0.071747,0.058911,-0.004819,
+ 0.007271,0.001387,0.999973,0.071597,0.058882,-0.004818,
+ 0.007344,0.000928,0.999973,0.071754,0.05789,-0.004818,
+ 0.069355,0.01323,0.997504,0.071747,0.058911,-0.004819,
+ 0.007344,0.000928,0.999973,0.071754,0.05789,-0.004818,
+ 0.070049,0.008849,0.997504,0.071906,0.057909,-0.004819,
+ 0.068388,0.017559,0.997504,0.071526,0.059901,-0.004819,
+ 0.00717,0.001841,0.999973,0.071377,0.059863,-0.004818,
+ 0.007271,0.001387,0.999973,0.071597,0.058882,-0.004818,
+ 0.068388,0.017559,0.997504,0.071526,0.059901,-0.004819,
+ 0.007271,0.001387,0.999973,0.071597,0.058882,-0.004818,
+ 0.069355,0.01323,0.997504,0.071747,0.058911,-0.004819,
+ 0.06715,0.021818,0.997504,0.071243,0.060875,-0.004819,
+ 0.00704,0.002287,0.999973,0.071097,0.060828,-0.004818,
+ 0.00717,0.001841,0.999973,0.071377,0.059863,-0.004818,
+ 0.06715,0.021818,0.997504,0.071243,0.060875,-0.004819,
+ 0.00717,0.001841,0.999973,0.071377,0.059863,-0.004818,
+ 0.068388,0.017559,0.997504,0.071526,0.059901,-0.004819,
+ 0.065648,0.025992,0.997504,0.070899,0.06183,-0.004819,
+ 0.006883,0.002725,0.999973,0.070757,0.061773,-0.004818,
+ 0.00704,0.002287,0.999973,0.071097,0.060828,-0.004818,
+ 0.065648,0.025992,0.997504,0.070899,0.06183,-0.004819,
+ 0.00704,0.002287,0.999973,0.071097,0.060828,-0.004818,
+ 0.06715,0.021818,0.997504,0.071243,0.060875,-0.004819,
+ 0.063886,0.030062,0.997504,0.070497,0.062761,-0.004819,
+ 0.006698,0.003152,0.999973,0.070358,0.062696,-0.004818,
+ 0.006883,0.002725,0.999973,0.070757,0.061773,-0.004818,
+ 0.063886,0.030062,0.997504,0.070497,0.062761,-0.004819,
+ 0.006883,0.002725,0.999973,0.070757,0.061773,-0.004818,
+ 0.065648,0.025992,0.997504,0.070899,0.06183,-0.004819,
+ 0.061872,0.034015,0.997504,0.070036,0.063665,-0.004819,
+ 0.006487,0.003566,0.999973,0.069902,0.063591,-0.004818,
+ 0.006698,0.003152,0.999973,0.070358,0.062696,-0.004818,
+ 0.061872,0.034015,0.997504,0.070036,0.063665,-0.004819,
+ 0.006698,0.003152,0.999973,0.070358,0.062696,-0.004818,
+ 0.063886,0.030062,0.997504,0.070497,0.062761,-0.004819,
+ 0.059614,0.037832,0.997504,0.06952,0.064538,-0.004819,
+ 0.00625,0.003966,0.999973,0.06939,0.064456,-0.004818,
+ 0.006487,0.003566,0.999973,0.069902,0.063591,-0.004818,
+ 0.059614,0.037832,0.997504,0.06952,0.064538,-0.004819,
+ 0.006487,0.003566,0.999973,0.069902,0.063591,-0.004818,
+ 0.061872,0.034015,0.997504,0.070036,0.063665,-0.004819,
+ 0.057121,0.041501,0.997504,0.068949,0.065377,-0.004819,
+ 0.005989,0.004351,0.999973,0.068825,0.065287,-0.004818,
+ 0.00625,0.003966,0.999973,0.06939,0.064456,-0.004818,
+ 0.057121,0.041501,0.997504,0.068949,0.065377,-0.004819,
+ 0.00625,0.003966,0.999973,0.06939,0.064456,-0.004818,
+ 0.059614,0.037832,0.997504,0.06952,0.064538,-0.004819,
+ 0.054403,0.045006,0.997504,0.068328,0.066178,-0.004819,
+ 0.005704,0.004718,0.999973,0.06821,0.066081,-0.004818,
+ 0.005989,0.004351,0.999973,0.068825,0.065287,-0.004818,
+ 0.054403,0.045006,0.997504,0.068328,0.066178,-0.004819,
+ 0.005989,0.004351,0.999973,0.068825,0.065287,-0.004818,
+ 0.057121,0.041501,0.997504,0.068949,0.065377,-0.004819,
+ 0.051469,0.048333,0.997504,0.067657,0.066939,-0.004819,
+ 0.005396,0.005067,0.999973,0.067545,0.066834,-0.004818,
+ 0.005704,0.004718,0.999973,0.06821,0.066081,-0.004818,
+ 0.051469,0.048333,0.997504,0.067657,0.066939,-0.004819,
+ 0.005704,0.004718,0.999973,0.06821,0.066081,-0.004818,
+ 0.054403,0.045006,0.997504,0.068328,0.066178,-0.004819,
+ 0.048333,0.051469,0.997504,0.066939,0.067657,-0.004819,
+ 0.005067,0.005396,0.999973,0.066834,0.067545,-0.004818,
+ 0.005396,0.005067,0.999973,0.067545,0.066834,-0.004818,
+ 0.048333,0.051469,0.997504,0.066939,0.067657,-0.004819,
+ 0.005396,0.005067,0.999973,0.067545,0.066834,-0.004818,
+ 0.051469,0.048333,0.997504,0.067657,0.066939,-0.004819,
+ 0.045006,0.054403,0.997504,0.066178,0.068328,-0.004819,
+ 0.004718,0.005704,0.999973,0.066081,0.06821,-0.004818,
+ 0.005067,0.005396,0.999973,0.066834,0.067545,-0.004818,
+ 0.045006,0.054403,0.997504,0.066178,0.068328,-0.004819,
+ 0.005067,0.005396,0.999973,0.066834,0.067545,-0.004818,
+ 0.048333,0.051469,0.997504,0.066939,0.067657,-0.004819,
+ 0.041501,0.057121,0.997504,0.065377,0.068949,-0.004819,
+ 0.004351,0.005989,0.999973,0.065287,0.068825,-0.004818,
+ 0.004718,0.005704,0.999973,0.066081,0.06821,-0.004818,
+ 0.041501,0.057121,0.997504,0.065377,0.068949,-0.004819,
+ 0.004718,0.005704,0.999973,0.066081,0.06821,-0.004818,
+ 0.045006,0.054403,0.997504,0.066178,0.068328,-0.004819,
+ 0.037832,0.059614,0.997504,0.064538,0.06952,-0.004819,
+ 0.003966,0.00625,0.999973,0.064456,0.06939,-0.004818,
+ 0.004351,0.005989,0.999973,0.065287,0.068825,-0.004818,
+ 0.037832,0.059614,0.997504,0.064538,0.06952,-0.004819,
+ 0.004351,0.005989,0.999973,0.065287,0.068825,-0.004818,
+ 0.041501,0.057121,0.997504,0.065377,0.068949,-0.004819,
+ 0.034015,0.061872,0.997504,0.063665,0.070036,-0.004819,
+ 0.003566,0.006487,0.999973,0.063591,0.069902,-0.004818,
+ 0.003966,0.00625,0.999973,0.064456,0.06939,-0.004818,
+ 0.034015,0.061872,0.997504,0.063665,0.070036,-0.004819,
+ 0.003966,0.00625,0.999973,0.064456,0.06939,-0.004818,
+ 0.037832,0.059614,0.997504,0.064538,0.06952,-0.004819,
+ 0.030062,0.063886,0.997504,0.062761,0.070497,-0.004819,
+ 0.003152,0.006698,0.999973,0.062696,0.070358,-0.004818,
+ 0.003566,0.006487,0.999973,0.063591,0.069902,-0.004818,
+ 0.030062,0.063886,0.997504,0.062761,0.070497,-0.004819,
+ 0.003566,0.006487,0.999973,0.063591,0.069902,-0.004818,
+ 0.034015,0.061872,0.997504,0.063665,0.070036,-0.004819,
+ 0.025992,0.065648,0.997504,0.06183,0.070899,-0.004819,
+ 0.002725,0.006883,0.999973,0.061773,0.070757,-0.004818,
+ 0.003152,0.006698,0.999973,0.062696,0.070358,-0.004818,
+ 0.025992,0.065648,0.997504,0.06183,0.070899,-0.004819,
+ 0.003152,0.006698,0.999973,0.062696,0.070358,-0.004818,
+ 0.030062,0.063886,0.997504,0.062761,0.070497,-0.004819,
+ 0.021818,0.06715,0.997504,0.060875,0.071243,-0.004819,
+ 0.002287,0.00704,0.999973,0.060828,0.071097,-0.004818,
+ 0.002725,0.006883,0.999973,0.061773,0.070757,-0.004818,
+ 0.021818,0.06715,0.997504,0.060875,0.071243,-0.004819,
+ 0.002725,0.006883,0.999973,0.061773,0.070757,-0.004818,
+ 0.025992,0.065648,0.997504,0.06183,0.070899,-0.004819,
+ 0.017559,0.068388,0.997504,0.059901,0.071526,-0.004819,
+ 0.001841,0.00717,0.999973,0.059863,0.071377,-0.004818,
+ 0.002287,0.00704,0.999973,0.060828,0.071097,-0.004818,
+ 0.017559,0.068388,0.997504,0.059901,0.071526,-0.004819,
+ 0.002287,0.00704,0.999973,0.060828,0.071097,-0.004818,
+ 0.021818,0.06715,0.997504,0.060875,0.071243,-0.004819,
+ 0.01323,0.069355,0.997504,0.058911,0.071747,-0.004819,
+ 0.001387,0.007271,0.999973,0.058882,0.071597,-0.004818,
+ 0.001841,0.00717,0.999973,0.059863,0.071377,-0.004818,
+ 0.01323,0.069355,0.997504,0.058911,0.071747,-0.004819,
+ 0.001841,0.00717,0.999973,0.059863,0.071377,-0.004818,
+ 0.017559,0.068388,0.997504,0.059901,0.071526,-0.004819,
+ 0.008849,0.070049,0.997504,0.057909,0.071906,-0.004819,
+ 0.000928,0.007344,0.999973,0.05789,0.071754,-0.004818,
+ 0.001387,0.007271,0.999973,0.058882,0.071597,-0.004818,
+ 0.008849,0.070049,0.997504,0.057909,0.071906,-0.004819,
+ 0.001387,0.007271,0.999973,0.058882,0.071597,-0.004818,
+ 0.01323,0.069355,0.997504,0.058911,0.071747,-0.004819,
+ 0.004433,0.070467,0.997504,0.056899,0.072001,-0.004819,
+ 0.000465,0.007388,0.999973,0.05689,0.071848,-0.004818,
+ 0.000928,0.007344,0.999973,0.05789,0.071754,-0.004818,
+ 0.004433,0.070467,0.997504,0.056899,0.072001,-0.004819,
+ 0.000928,0.007344,0.999973,0.05789,0.071754,-0.004818,
+ 0.008849,0.070049,0.997504,0.057909,0.071906,-0.004819,
+ 0,0.070606,0.997504,0.055885,0.072033,-0.004819,
+ 0,0.007402,0.999973,0.055885,0.07188,-0.004818,
+ 0.000465,0.007388,0.999973,0.05689,0.071848,-0.004818,
+ 0,0.070606,0.997504,0.055885,0.072033,-0.004819,
+ 0.000465,0.007388,0.999973,0.05689,0.071848,-0.004818,
+ 0.004433,0.070467,0.997504,0.056899,0.072001,-0.004819,
+ -0.004433,0.070467,0.997504,0.054871,0.072001,-0.004819,
+ -0.000465,0.007388,0.999973,0.054881,0.071848,-0.004818,
+ 0,0.007402,0.999973,0.055885,0.07188,-0.004818,
+ -0.004433,0.070467,0.997504,0.054871,0.072001,-0.004819,
+ 0,0.007402,0.999973,0.055885,0.07188,-0.004818,
+ 0,0.070606,0.997504,0.055885,0.072033,-0.004819,
+ -0.008849,0.070049,0.997504,0.053861,0.071906,-0.004819,
+ -0.000928,0.007344,0.999973,0.053881,0.071754,-0.004818,
+ -0.000465,0.007388,0.999973,0.054881,0.071848,-0.004818,
+ -0.008849,0.070049,0.997504,0.053861,0.071906,-0.004819,
+ -0.000465,0.007388,0.999973,0.054881,0.071848,-0.004818,
+ -0.004433,0.070467,0.997504,0.054871,0.072001,-0.004819,
+ -0.01323,0.069355,0.997504,0.052859,0.071747,-0.004819,
+ -0.001387,0.007271,0.999973,0.052888,0.071597,-0.004818,
+ -0.000928,0.007344,0.999973,0.053881,0.071754,-0.004818,
+ -0.01323,0.069355,0.997504,0.052859,0.071747,-0.004819,
+ -0.000928,0.007344,0.999973,0.053881,0.071754,-0.004818,
+ -0.008849,0.070049,0.997504,0.053861,0.071906,-0.004819,
+ -0.017559,0.068388,0.997504,0.051869,0.071526,-0.004819,
+ -0.001841,0.00717,0.999973,0.051908,0.071377,-0.004818,
+ -0.001387,0.007271,0.999973,0.052888,0.071597,-0.004818,
+ -0.017559,0.068388,0.997504,0.051869,0.071526,-0.004819,
+ -0.001387,0.007271,0.999973,0.052888,0.071597,-0.004818,
+ -0.01323,0.069355,0.997504,0.052859,0.071747,-0.004819,
+ -0.021818,0.06715,0.997504,0.050895,0.071243,-0.004819,
+ -0.002287,0.00704,0.999973,0.050943,0.071097,-0.004818,
+ -0.001841,0.00717,0.999973,0.051908,0.071377,-0.004818,
+ -0.021818,0.06715,0.997504,0.050895,0.071243,-0.004819,
+ -0.001841,0.00717,0.999973,0.051908,0.071377,-0.004818,
+ -0.017559,0.068388,0.997504,0.051869,0.071526,-0.004819,
+ -0.025992,0.065648,0.997504,0.049941,0.070899,-0.004819,
+ -0.002725,0.006883,0.999973,0.049997,0.070757,-0.004818,
+ -0.002287,0.00704,0.999973,0.050943,0.071097,-0.004818,
+ -0.025992,0.065648,0.997504,0.049941,0.070899,-0.004819,
+ -0.002287,0.00704,0.999973,0.050943,0.071097,-0.004818,
+ -0.021818,0.06715,0.997504,0.050895,0.071243,-0.004819,
+ -0.030062,0.063886,0.997504,0.04901,0.070497,-0.004819,
+ -0.003152,0.006698,0.999973,0.049075,0.070358,-0.004818,
+ -0.002725,0.006883,0.999973,0.049997,0.070757,-0.004818,
+ -0.030062,0.063886,0.997504,0.04901,0.070497,-0.004819,
+ -0.002725,0.006883,0.999973,0.049997,0.070757,-0.004818,
+ -0.025992,0.065648,0.997504,0.049941,0.070899,-0.004819,
+ -0.034015,0.061872,0.997504,0.048106,0.070036,-0.004819,
+ -0.003566,0.006487,0.999973,0.04818,0.069902,-0.004818,
+ -0.003152,0.006698,0.999973,0.049075,0.070358,-0.004818,
+ -0.034015,0.061872,0.997504,0.048106,0.070036,-0.004819,
+ -0.003152,0.006698,0.999973,0.049075,0.070358,-0.004818,
+ -0.030062,0.063886,0.997504,0.04901,0.070497,-0.004819,
+ -0.037832,0.059614,0.997504,0.047233,0.06952,-0.004819,
+ -0.003966,0.00625,0.999973,0.047315,0.06939,-0.004818,
+ -0.003566,0.006487,0.999973,0.04818,0.069902,-0.004818,
+ -0.037832,0.059614,0.997504,0.047233,0.06952,-0.004819,
+ -0.003566,0.006487,0.999973,0.04818,0.069902,-0.004818,
+ -0.034015,0.061872,0.997504,0.048106,0.070036,-0.004819,
+ -0.041501,0.057121,0.997504,0.046394,0.068949,-0.004819,
+ -0.004351,0.005989,0.999973,0.046484,0.068825,-0.004818,
+ -0.003966,0.00625,0.999973,0.047315,0.06939,-0.004818,
+ -0.041501,0.057121,0.997504,0.046394,0.068949,-0.004819,
+ -0.003966,0.00625,0.999973,0.047315,0.06939,-0.004818,
+ -0.037832,0.059614,0.997504,0.047233,0.06952,-0.004819,
+ -0.045006,0.054403,0.997504,0.045592,0.068328,-0.004819,
+ -0.004718,0.005704,0.999973,0.04569,0.06821,-0.004818,
+ -0.004351,0.005989,0.999973,0.046484,0.068825,-0.004818,
+ -0.045006,0.054403,0.997504,0.045592,0.068328,-0.004819,
+ -0.004351,0.005989,0.999973,0.046484,0.068825,-0.004818,
+ -0.041501,0.057121,0.997504,0.046394,0.068949,-0.004819,
+ -0.048333,0.051469,0.997504,0.044831,0.067657,-0.004819,
+ -0.005067,0.005396,0.999973,0.044936,0.067545,-0.004818,
+ -0.004718,0.005704,0.999973,0.04569,0.06821,-0.004818,
+ -0.048333,0.051469,0.997504,0.044831,0.067657,-0.004819,
+ -0.004718,0.005704,0.999973,0.04569,0.06821,-0.004818,
+ -0.045006,0.054403,0.997504,0.045592,0.068328,-0.004819,
+ -0.051469,0.048333,0.997504,0.044114,0.066939,-0.004819,
+ -0.005396,0.005067,0.999973,0.044226,0.066834,-0.004818,
+ -0.005067,0.005396,0.999973,0.044936,0.067545,-0.004818,
+ -0.051469,0.048333,0.997504,0.044114,0.066939,-0.004819,
+ -0.005067,0.005396,0.999973,0.044936,0.067545,-0.004818,
+ -0.048333,0.051469,0.997504,0.044831,0.067657,-0.004819,
+ -0.054403,0.045006,0.997504,0.043443,0.066178,-0.004819,
+ -0.005704,0.004718,0.999973,0.043561,0.066081,-0.004818,
+ -0.005396,0.005067,0.999973,0.044226,0.066834,-0.004818,
+ -0.054403,0.045006,0.997504,0.043443,0.066178,-0.004819,
+ -0.005396,0.005067,0.999973,0.044226,0.066834,-0.004818,
+ -0.051469,0.048333,0.997504,0.044114,0.066939,-0.004819,
+ -0.057121,0.041501,0.997504,0.042821,0.065377,-0.004819,
+ -0.005989,0.004351,0.999973,0.042945,0.065287,-0.004818,
+ -0.005704,0.004718,0.999973,0.043561,0.066081,-0.004818,
+ -0.057121,0.041501,0.997504,0.042821,0.065377,-0.004819,
+ -0.005704,0.004718,0.999973,0.043561,0.066081,-0.004818,
+ -0.054403,0.045006,0.997504,0.043443,0.066178,-0.004819,
+ -0.059614,0.037832,0.997504,0.042251,0.064538,-0.004819,
+ -0.00625,0.003966,0.999973,0.042381,0.064456,-0.004818,
+ -0.005989,0.004351,0.999973,0.042945,0.065287,-0.004818,
+ -0.059614,0.037832,0.997504,0.042251,0.064538,-0.004819,
+ -0.005989,0.004351,0.999973,0.042945,0.065287,-0.004818,
+ -0.057121,0.041501,0.997504,0.042821,0.065377,-0.004819,
+ -0.061872,0.034015,0.997504,0.041735,0.063665,-0.004819,
+ -0.006487,0.003566,0.999973,0.041869,0.063591,-0.004818,
+ -0.00625,0.003966,0.999973,0.042381,0.064456,-0.004818,
+ -0.061872,0.034015,0.997504,0.041735,0.063665,-0.004819,
+ -0.00625,0.003966,0.999973,0.042381,0.064456,-0.004818,
+ -0.059614,0.037832,0.997504,0.042251,0.064538,-0.004819,
+ -0.063886,0.030062,0.997504,0.041274,0.062761,-0.004819,
+ -0.006698,0.003152,0.999973,0.041413,0.062696,-0.004818,
+ -0.006487,0.003566,0.999973,0.041869,0.063591,-0.004818,
+ -0.063886,0.030062,0.997504,0.041274,0.062761,-0.004819,
+ -0.006487,0.003566,0.999973,0.041869,0.063591,-0.004818,
+ -0.061872,0.034015,0.997504,0.041735,0.063665,-0.004819,
+ -0.006698,0.003152,0.999973,0.041413,0.062696,-0.004818,
+ 0,0,1,0.044613,0.063997,-0.004818,
+ -0.006487,0.003566,0.999973,0.041869,0.063591,-0.004818,
+ -0.006698,0.003152,0.999973,0.041413,0.062696,-0.004818,
+ 0,0,1,0.043898,0.062655,-0.004818,
+ 0,0,1,0.044613,0.063997,-0.004818,
+ -0.006883,0.002725,0.999973,0.041014,0.061773,-0.004818,
+ 0,0,1,0.043898,0.062655,-0.004818,
+ -0.006698,0.003152,0.999973,0.041413,0.062696,-0.004818,
+ -0.006883,0.002725,0.999973,0.041014,0.061773,-0.004818,
+ 0,0,1,0.043489,0.061186,-0.004818,
+ 0,0,1,0.043898,0.062655,-0.004818,
+ -0.00704,0.002287,0.999973,0.040673,0.060828,-0.004818,
+ 0,0,1,0.043489,0.061186,-0.004818,
+ -0.006883,0.002725,0.999973,0.041014,0.061773,-0.004818,
+ -0.00717,0.001841,0.999973,0.040393,0.059863,-0.004818,
+ 0,0,1,0.043489,0.061186,-0.004818,
+ -0.00704,0.002287,0.999973,0.040673,0.060828,-0.004818,
+ -0.00717,0.001841,0.999973,0.040393,0.059863,-0.004818,
+ 0,0,1,0.043409,0.05966,-0.004818,
+ 0,0,1,0.043489,0.061186,-0.004818,
+ -0.007271,0.001387,0.999973,0.040174,0.058882,-0.004818,
+ 0,0,1,0.043409,0.05966,-0.004818,
+ -0.00717,0.001841,0.999973,0.040393,0.059863,-0.004818,
+ -0.007271,0.001387,0.999973,0.040174,0.058882,-0.004818,
+ 0,0,1,0.043472,0.058741,-0.004818,
+ 0,0,1,0.043409,0.05966,-0.004818,
+ -0.007344,0.000928,0.999973,0.040017,0.05789,-0.004818,
+ 0,0,1,0.043472,0.058741,-0.004818,
+ -0.007271,0.001387,0.999973,0.040174,0.058882,-0.004818,
+ -0.007344,0.000928,0.999973,0.040017,0.05789,-0.004818,
+ 0,0,1,0.04361,0.057831,-0.004818,
+ 0,0,1,0.043472,0.058741,-0.004818,
+ -0.007344,0.000928,0.999973,0.040017,0.05789,-0.004818,
+ 0,0,1,0.043821,0.056936,-0.004818,
+ 0,0,1,0.04361,0.057831,-0.004818,
+ -0.007388,0.000465,0.999973,0.039922,0.05689,-0.004818,
+ 0,0,1,0.043821,0.056936,-0.004818,
+ -0.007344,0.000928,0.999973,0.040017,0.05789,-0.004818,
+ -0.007388,0.000465,0.999973,0.039922,0.05689,-0.004818,
+ 0,0,1,0.044105,0.056061,-0.004818,
+ 0,0,1,0.043821,0.056936,-0.004818,
+ -0.007402,0,0.999973,0.039891,0.055885,-0.004818,
+ 0,0,1,0.044105,0.056061,-0.004818,
+ -0.007388,0.000465,0.999973,0.039922,0.05689,-0.004818,
+ -0.007402,0,0.999973,0.039891,0.055885,-0.004818,
+ 0,0,1,0.044458,0.055214,-0.004818,
+ 0,0,1,0.044105,0.056061,-0.004818,
+ -0.007388,-0.000465,0.999973,0.039922,0.054881,-0.004818,
+ 0,0,1,0.044458,0.055214,-0.004818,
+ -0.007402,0,0.999973,0.039891,0.055885,-0.004818,
+ -0.007388,-0.000465,0.999973,0.039922,0.054881,-0.004818,
+ 0,0,1,0.044879,0.054399,-0.004818,
+ 0,0,1,0.044458,0.055214,-0.004818,
+ -0.007344,-0.000928,0.999973,0.040017,0.053881,-0.004818,
+ 0,0,1,0.044879,0.054399,-0.004818,
+ -0.007388,-0.000465,0.999973,0.039922,0.054881,-0.004818,
+ -0.007344,-0.000928,0.999973,0.040017,0.053881,-0.004818,
+ 0,0,1,0.045365,0.053623,-0.004818,
+ 0,0,1,0.044879,0.054399,-0.004818,
+ -0.007344,-0.000928,0.999973,0.040017,0.053881,-0.004818,
+ 0,0,1,0.045912,0.05289,-0.004818,
+ 0,0,1,0.045365,0.053623,-0.004818,
+ -0.007271,-0.001387,0.999973,0.040174,0.052888,-0.004818,
+ 0,0,1,0.045912,0.05289,-0.004818,
+ -0.007344,-0.000928,0.999973,0.040017,0.053881,-0.004818,
+ -0.007271,-0.001387,0.999973,0.040174,0.052888,-0.004818,
+ 0,0,1,0.046517,0.052206,-0.004818,
+ 0,0,1,0.045912,0.05289,-0.004818,
+ -0.00717,-0.001841,0.999973,0.040393,0.051908,-0.004818,
+ 0,0,1,0.046517,0.052206,-0.004818,
+ -0.007271,-0.001387,0.999973,0.040174,0.052888,-0.004818,
+ -0.00717,-0.001841,0.999973,0.040393,0.051908,-0.004818,
+ 0,0,1,0.047175,0.051576,-0.004818,
+ 0,0,1,0.046517,0.052206,-0.004818,
+ -0.00717,-0.001841,0.999973,0.040393,0.051908,-0.004818,
+ 0,0,1,0.047882,0.051003,-0.004818,
+ 0,0,1,0.047175,0.051576,-0.004818,
+ -0.00704,-0.002287,0.999973,0.040673,0.050943,-0.004818,
+ 0,0,1,0.047882,0.051003,-0.004818,
+ -0.00717,-0.001841,0.999973,0.040393,0.051908,-0.004818,
+ -0.00704,-0.002287,0.999973,0.040673,0.050943,-0.004818,
+ 0,0,1,0.048634,0.050493,-0.004818,
+ 0,0,1,0.047882,0.051003,-0.004818,
+ -0.00704,-0.002287,0.999973,0.040673,0.050943,-0.004818,
+ 0,0,1,0.049354,0.050026,-0.004818,
+ 0,0,1,0.048634,0.050493,-0.004818,
+ -0.006883,-0.002725,0.999973,0.041014,0.049997,-0.004818,
+ 0,0,1,0.049354,0.050026,-0.004818,
+ -0.00704,-0.002287,0.999973,0.040673,0.050943,-0.004818,
+ -0.006883,-0.002725,0.999973,0.041014,0.049997,-0.004818,
+ 0,0,1,0.050057,0.049532,-0.004818,
+ 0,0,1,0.049354,0.050026,-0.004818,
+ -0.006698,-0.003152,0.999973,0.041413,0.049075,-0.004818,
+ 0,0,1,0.050057,0.049532,-0.004818,
+ -0.006883,-0.002725,0.999973,0.041014,0.049997,-0.004818,
+ -0.006698,-0.003152,0.999973,0.041413,0.049075,-0.004818,
+ 0,0,1,0.050741,0.049011,-0.004818,
+ 0,0,1,0.050057,0.049532,-0.004818,
+ -0.006698,-0.003152,0.999973,0.041413,0.049075,-0.004818,
+ 0,0,1,0.051404,0.048464,-0.004818,
+ 0,0,1,0.050741,0.049011,-0.004818,
+ -0.006487,-0.003566,0.999973,0.041869,0.04818,-0.004818,
+ 0,0,1,0.051404,0.048464,-0.004818,
+ -0.006698,-0.003152,0.999973,0.041413,0.049075,-0.004818,
+ -0.006487,-0.003566,0.999973,0.041869,0.04818,-0.004818,
+ 0,0,1,0.052047,0.047891,-0.004818,
+ 0,0,1,0.051404,0.048464,-0.004818,
+ -0.00625,-0.003966,0.999973,0.042381,0.047315,-0.004818,
+ 0,0,1,0.052047,0.047891,-0.004818,
+ -0.006487,-0.003566,0.999973,0.041869,0.04818,-0.004818,
+ -0.00625,-0.003966,0.999973,0.042381,0.047315,-0.004818,
+ 0,0,1,0.052668,0.047293,-0.004818,
+ 0,0,1,0.052047,0.047891,-0.004818,
+ -0.00625,-0.003966,0.999973,0.042381,0.047315,-0.004818,
+ 0,0,1,0.053266,0.046673,-0.004818,
+ 0,0,1,0.052668,0.047293,-0.004818,
+ -0.005989,-0.004351,0.999973,0.042945,0.046484,-0.004818,
+ 0,0,1,0.053266,0.046673,-0.004818,
+ -0.00625,-0.003966,0.999973,0.042381,0.047315,-0.004818,
+ -0.005989,-0.004351,0.999973,0.042945,0.046484,-0.004818,
+ 0,0,1,0.05384,0.046029,-0.004818,
+ 0,0,1,0.053266,0.046673,-0.004818,
+ -0.005704,-0.004718,0.999973,0.043561,0.04569,-0.004818,
+ 0,0,1,0.05384,0.046029,-0.004818,
+ -0.005989,-0.004351,0.999973,0.042945,0.046484,-0.004818,
+ -0.005704,-0.004718,0.999973,0.043561,0.04569,-0.004818,
+ 0,0,1,0.05439,0.045363,-0.004818,
+ 0,0,1,0.05384,0.046029,-0.004818,
+ -0.005396,-0.005067,0.999973,0.044226,0.044936,-0.004818,
+ 0,0,1,0.05439,0.045363,-0.004818,
+ -0.005704,-0.004718,0.999973,0.043561,0.04569,-0.004818,
+ -0.005396,-0.005067,0.999973,0.044226,0.044936,-0.004818,
+ 0,0,1,0.054915,0.044676,-0.004818,
+ 0,0,1,0.05439,0.045363,-0.004818,
+ -0.005067,-0.005396,0.999973,0.044936,0.044226,-0.004818,
+ 0,0,1,0.054915,0.044676,-0.004818,
+ -0.005396,-0.005067,0.999973,0.044226,0.044936,-0.004818,
+ -0.005067,-0.005396,0.999973,0.044936,0.044226,-0.004818,
+ 0,0,1,0.055414,0.04397,-0.004818,
+ 0,0,1,0.054915,0.044676,-0.004818,
+ -0.004718,-0.005704,0.999973,0.04569,0.043561,-0.004818,
+ 0,0,1,0.055414,0.04397,-0.004818,
+ -0.005067,-0.005396,0.999973,0.044936,0.044226,-0.004818,
+ -0.004718,-0.005704,0.999973,0.04569,0.043561,-0.004818,
+ 0,0,1,0.055885,0.043244,-0.004818,
+ 0,0,1,0.055414,0.04397,-0.004818,
+ -0.004718,-0.005704,0.999973,0.04569,0.043561,-0.004818,
+ 0.004351,-0.005989,0.999973,0.065287,0.042945,-0.004818,
+ 0,0,1,0.055885,0.043244,-0.004818,
+ -0.004351,-0.005989,0.999973,0.046484,0.042945,-0.004818,
+ 0.004351,-0.005989,0.999973,0.065287,0.042945,-0.004818,
+ -0.004718,-0.005704,0.999973,0.04569,0.043561,-0.004818,
+ -0.004351,-0.005989,0.999973,0.046484,0.042945,-0.004818,
+ 0.003966,-0.00625,0.999973,0.064456,0.042381,-0.004818,
+ 0.004351,-0.005989,0.999973,0.065287,0.042945,-0.004818,
+ -0.003966,-0.00625,0.999973,0.047315,0.042381,-0.004818,
+ 0.003966,-0.00625,0.999973,0.064456,0.042381,-0.004818,
+ -0.004351,-0.005989,0.999973,0.046484,0.042945,-0.004818,
+ -0.003966,-0.00625,0.999973,0.047315,0.042381,-0.004818,
+ 0.003566,-0.006487,0.999973,0.063591,0.041869,-0.004818,
+ 0.003966,-0.00625,0.999973,0.064456,0.042381,-0.004818,
+ -0.003566,-0.006487,0.999973,0.04818,0.041869,-0.004818,
+ 0.003566,-0.006487,0.999973,0.063591,0.041869,-0.004818,
+ -0.003966,-0.00625,0.999973,0.047315,0.042381,-0.004818,
+ -0.003566,-0.006487,0.999973,0.04818,0.041869,-0.004818,
+ 0.003152,-0.006698,0.999973,0.062696,0.041413,-0.004818,
+ 0.003566,-0.006487,0.999973,0.063591,0.041869,-0.004818,
+ -0.003152,-0.006698,0.999973,0.049075,0.041413,-0.004818,
+ 0.003152,-0.006698,0.999973,0.062696,0.041413,-0.004818,
+ -0.003566,-0.006487,0.999973,0.04818,0.041869,-0.004818,
+ -0.003152,-0.006698,0.999973,0.049075,0.041413,-0.004818,
+ 0.002725,-0.006883,0.999973,0.061773,0.041014,-0.004818,
+ 0.003152,-0.006698,0.999973,0.062696,0.041413,-0.004818,
+ -0.002725,-0.006883,0.999973,0.049997,0.041014,-0.004818,
+ 0.002725,-0.006883,0.999973,0.061773,0.041014,-0.004818,
+ -0.003152,-0.006698,0.999973,0.049075,0.041413,-0.004818,
+ -0.002725,-0.006883,0.999973,0.049997,0.041014,-0.004818,
+ 0.002287,-0.00704,0.999973,0.060828,0.040673,-0.004818,
+ 0.002725,-0.006883,0.999973,0.061773,0.041014,-0.004818,
+ -0.002287,-0.00704,0.999973,0.050943,0.040673,-0.004818,
+ 0.002287,-0.00704,0.999973,0.060828,0.040673,-0.004818,
+ -0.002725,-0.006883,0.999973,0.049997,0.041014,-0.004818,
+ -0.002287,-0.00704,0.999973,0.050943,0.040673,-0.004818,
+ 0.001841,-0.00717,0.999973,0.059863,0.040393,-0.004818,
+ 0.002287,-0.00704,0.999973,0.060828,0.040673,-0.004818,
+ -0.001841,-0.00717,0.999973,0.051908,0.040393,-0.004818,
+ 0.001841,-0.00717,0.999973,0.059863,0.040393,-0.004818,
+ -0.002287,-0.00704,0.999973,0.050943,0.040673,-0.004818,
+ -0.001841,-0.00717,0.999973,0.051908,0.040393,-0.004818,
+ 0.001387,-0.007271,0.999973,0.058882,0.040174,-0.004818,
+ 0.001841,-0.00717,0.999973,0.059863,0.040393,-0.004818,
+ -0.001387,-0.007271,0.999973,0.052888,0.040174,-0.004818,
+ 0.001387,-0.007271,0.999973,0.058882,0.040174,-0.004818,
+ -0.001841,-0.00717,0.999973,0.051908,0.040393,-0.004818,
+ -0.001387,-0.007271,0.999973,0.052888,0.040174,-0.004818,
+ 0.000928,-0.007344,0.999973,0.05789,0.040017,-0.004818,
+ 0.001387,-0.007271,0.999973,0.058882,0.040174,-0.004818,
+ -0.000928,-0.007344,0.999973,0.053881,0.040017,-0.004818,
+ 0.000928,-0.007344,0.999973,0.05789,0.040017,-0.004818,
+ -0.001387,-0.007271,0.999973,0.052888,0.040174,-0.004818,
+ -0.000928,-0.007344,0.999973,0.053881,0.040017,-0.004818,
+ 0.000465,-0.007388,0.999973,0.05689,0.039922,-0.004818,
+ 0.000928,-0.007344,0.999973,0.05789,0.040017,-0.004818,
+ -0.000465,-0.007388,0.999973,0.054881,0.039922,-0.004818,
+ 0.000465,-0.007388,0.999973,0.05689,0.039922,-0.004818,
+ -0.000928,-0.007344,0.999973,0.053881,0.040017,-0.004818,
+ 0.000465,-0.007388,0.999973,0.05689,0.039922,-0.004818,
+ -0.000465,-0.007388,0.999973,0.054881,0.039922,-0.004818,
+ 0,-0.007402,0.999973,0.055885,0.039891,-0.004818,
+ 0.004718,-0.005704,0.999973,0.066081,0.043561,-0.004818,
+ 0,0,1,0.055885,0.043244,-0.004818,
+ 0.004351,-0.005989,0.999973,0.065287,0.042945,-0.004818,
+ 0,0,1,0.055885,0.043244,-0.004818,
+ 0.004718,-0.005704,0.999973,0.066081,0.043561,-0.004818,
+ 0,0,1,0.056357,0.04397,-0.004818,
+ 0,0,1,0.056357,0.04397,-0.004818,
+ 0.004718,-0.005704,0.999973,0.066081,0.043561,-0.004818,
+ 0.005067,-0.005396,0.999973,0.066834,0.044226,-0.004818,
+ 0,0,1,0.056357,0.04397,-0.004818,
+ 0.005067,-0.005396,0.999973,0.066834,0.044226,-0.004818,
+ 0,0,1,0.056856,0.044676,-0.004818,
+ 0,0,1,0.056856,0.044676,-0.004818,
+ 0.005067,-0.005396,0.999973,0.066834,0.044226,-0.004818,
+ 0.005396,-0.005067,0.999973,0.067545,0.044936,-0.004818,
+ 0,0,1,0.056856,0.044676,-0.004818,
+ 0.005396,-0.005067,0.999973,0.067545,0.044936,-0.004818,
+ 0,0,1,0.05738,0.045363,-0.004818,
+ 0,0,1,0.05738,0.045363,-0.004818,
+ 0.005396,-0.005067,0.999973,0.067545,0.044936,-0.004818,
+ 0.005704,-0.004718,0.999973,0.06821,0.04569,-0.004818,
+ 0,0,1,0.05738,0.045363,-0.004818,
+ 0.005704,-0.004718,0.999973,0.06821,0.04569,-0.004818,
+ 0,0,1,0.05793,0.046029,-0.004818,
+ 0,0,1,0.05793,0.046029,-0.004818,
+ 0.005704,-0.004718,0.999973,0.06821,0.04569,-0.004818,
+ 0.005989,-0.004351,0.999973,0.068825,0.046484,-0.004818,
+ 0,0,1,0.05793,0.046029,-0.004818,
+ 0.005989,-0.004351,0.999973,0.068825,0.046484,-0.004818,
+ 0,0,1,0.058505,0.046673,-0.004818,
+ 0,0,1,0.058505,0.046673,-0.004818,
+ 0.005989,-0.004351,0.999973,0.068825,0.046484,-0.004818,
+ 0.00625,-0.003966,0.999973,0.06939,0.047315,-0.004818,
+ 0,0,1,0.058505,0.046673,-0.004818,
+ 0.00625,-0.003966,0.999973,0.06939,0.047315,-0.004818,
+ 0,0,1,0.059103,0.047293,-0.004818,
+ 0,0,1,0.059103,0.047293,-0.004818,
+ 0.00625,-0.003966,0.999973,0.06939,0.047315,-0.004818,
+ 0,0,1,0.059724,0.047891,-0.004818,
+ 0,0,1,0.059724,0.047891,-0.004818,
+ 0.00625,-0.003966,0.999973,0.06939,0.047315,-0.004818,
+ 0.006487,-0.003566,0.999973,0.069902,0.04818,-0.004818,
+ 0,0,1,0.059724,0.047891,-0.004818,
+ 0.006487,-0.003566,0.999973,0.069902,0.04818,-0.004818,
+ 0,0,1,0.060366,0.048464,-0.004818,
+ 0,0,1,0.060366,0.048464,-0.004818,
+ 0.006487,-0.003566,0.999973,0.069902,0.04818,-0.004818,
+ 0.006698,-0.003152,0.999973,0.070358,0.049075,-0.004818,
+ 0,0,1,0.060366,0.048464,-0.004818,
+ 0.006698,-0.003152,0.999973,0.070358,0.049075,-0.004818,
+ 0,0,1,0.06103,0.049011,-0.004818,
+ 0,0,1,0.06103,0.049011,-0.004818,
+ 0.006698,-0.003152,0.999973,0.070358,0.049075,-0.004818,
+ 0,0,1,0.061714,0.049532,-0.004818,
+ 0,0,1,0.061714,0.049532,-0.004818,
+ 0.006698,-0.003152,0.999973,0.070358,0.049075,-0.004818,
+ 0.006883,-0.002725,0.999973,0.070757,0.049997,-0.004818,
+ 0,0,1,0.061714,0.049532,-0.004818,
+ 0.006883,-0.002725,0.999973,0.070757,0.049997,-0.004818,
+ 0,0,1,0.062416,0.050026,-0.004818,
+ 0,0,1,0.062416,0.050026,-0.004818,
+ 0.006883,-0.002725,0.999973,0.070757,0.049997,-0.004818,
+ 0.00704,-0.002287,0.999973,0.071097,0.050943,-0.004818,
+ 0,0,1,0.062416,0.050026,-0.004818,
+ 0.00704,-0.002287,0.999973,0.071097,0.050943,-0.004818,
+ 0,0,1,0.063137,0.050493,-0.004818,
+ 0,0,1,0.063137,0.050493,-0.004818,
+ 0.00704,-0.002287,0.999973,0.071097,0.050943,-0.004818,
+ 0,0,1,0.063888,0.051003,-0.004818,
+ 0,0,1,0.063888,0.051003,-0.004818,
+ 0.00704,-0.002287,0.999973,0.071097,0.050943,-0.004818,
+ 0.00717,-0.001841,0.999973,0.071377,0.051908,-0.004818,
+ 0,0,1,0.063888,0.051003,-0.004818,
+ 0.00717,-0.001841,0.999973,0.071377,0.051908,-0.004818,
+ 0,0,1,0.064596,0.051576,-0.004818,
+ 0,0,1,0.064596,0.051576,-0.004818,
+ 0.00717,-0.001841,0.999973,0.071377,0.051908,-0.004818,
+ 0,0,1,0.065254,0.052206,-0.004818,
+ 0,0,1,0.065254,0.052206,-0.004818,
+ 0.00717,-0.001841,0.999973,0.071377,0.051908,-0.004818,
+ 0.007271,-0.001387,0.999973,0.071597,0.052888,-0.004818,
+ 0,0,1,0.065254,0.052206,-0.004818,
+ 0.007271,-0.001387,0.999973,0.071597,0.052888,-0.004818,
+ 0,0,1,0.065859,0.05289,-0.004818,
+ 0,0,1,0.065859,0.05289,-0.004818,
+ 0.007271,-0.001387,0.999973,0.071597,0.052888,-0.004818,
+ 0.007344,-0.000928,0.999973,0.071754,0.053881,-0.004818,
+ 0,0,1,0.065859,0.05289,-0.004818,
+ 0.007344,-0.000928,0.999973,0.071754,0.053881,-0.004818,
+ 0,0,1,0.066406,0.053623,-0.004818,
+ 0,0,1,0.066406,0.053623,-0.004818,
+ 0.007344,-0.000928,0.999973,0.071754,0.053881,-0.004818,
+ 0,0,1,0.066892,0.054399,-0.004818,
+ 0,0,1,0.066892,0.054399,-0.004818,
+ 0.007344,-0.000928,0.999973,0.071754,0.053881,-0.004818,
+ 0.007388,-0.000465,0.999973,0.071848,0.054881,-0.004818,
+ 0,0,1,0.066892,0.054399,-0.004818,
+ 0.007388,-0.000465,0.999973,0.071848,0.054881,-0.004818,
+ 0,0,1,0.067313,0.055214,-0.004818,
+ 0,0,1,0.067313,0.055214,-0.004818,
+ 0.007388,-0.000465,0.999973,0.071848,0.054881,-0.004818,
+ 0.007402,0,0.999973,0.07188,0.055885,-0.004818,
+ 0,0,1,0.067313,0.055214,-0.004818,
+ 0.007402,0,0.999973,0.07188,0.055885,-0.004818,
+ 0,0,1,0.067666,0.056061,-0.004818,
+ 0,0,1,0.067666,0.056061,-0.004818,
+ 0.007402,0,0.999973,0.07188,0.055885,-0.004818,
+ 0.007388,0.000465,0.999973,0.071848,0.05689,-0.004818,
+ 0,0,1,0.067666,0.056061,-0.004818,
+ 0.007388,0.000465,0.999973,0.071848,0.05689,-0.004818,
+ 0,0,1,0.067949,0.056936,-0.004818,
+ 0,0,1,0.067949,0.056936,-0.004818,
+ 0.007388,0.000465,0.999973,0.071848,0.05689,-0.004818,
+ 0.007344,0.000928,0.999973,0.071754,0.05789,-0.004818,
+ 0,0,1,0.067949,0.056936,-0.004818,
+ 0.007344,0.000928,0.999973,0.071754,0.05789,-0.004818,
+ 0,0,1,0.068161,0.057831,-0.004818,
+ 0,0,1,0.068161,0.057831,-0.004818,
+ 0.007344,0.000928,0.999973,0.071754,0.05789,-0.004818,
+ 0,0,1,0.068298,0.058741,-0.004818,
+ 0,0,1,0.068298,0.058741,-0.004818,
+ 0.007344,0.000928,0.999973,0.071754,0.05789,-0.004818,
+ 0.007271,0.001387,0.999973,0.071597,0.058882,-0.004818,
+ 0,0,1,0.068298,0.058741,-0.004818,
+ 0.007271,0.001387,0.999973,0.071597,0.058882,-0.004818,
+ 0,0,1,0.068362,0.05966,-0.004818,
+ 0,0,1,0.068362,0.05966,-0.004818,
+ 0.007271,0.001387,0.999973,0.071597,0.058882,-0.004818,
+ 0.00717,0.001841,0.999973,0.071377,0.059863,-0.004818,
+ 0,0,1,0.068362,0.05966,-0.004818,
+ 0.00717,0.001841,0.999973,0.071377,0.059863,-0.004818,
+ 0,0,1,0.068281,0.061186,-0.004818,
+ 0,0,1,0.068281,0.061186,-0.004818,
+ 0.00717,0.001841,0.999973,0.071377,0.059863,-0.004818,
+ 0.00704,0.002287,0.999973,0.071097,0.060828,-0.004818,
+ 0,0,1,0.068281,0.061186,-0.004818,
+ 0.00704,0.002287,0.999973,0.071097,0.060828,-0.004818,
+ 0.006883,0.002725,0.999973,0.070757,0.061773,-0.004818,
+ 0,0,1,0.068281,0.061186,-0.004818,
+ 0.006883,0.002725,0.999973,0.070757,0.061773,-0.004818,
+ 0,0,1,0.067873,0.062655,-0.004818,
+ 0,0,1,0.067873,0.062655,-0.004818,
+ 0.006883,0.002725,0.999973,0.070757,0.061773,-0.004818,
+ 0.006698,0.003152,0.999973,0.070358,0.062696,-0.004818,
+ 0,0,1,0.067873,0.062655,-0.004818,
+ 0.006698,0.003152,0.999973,0.070358,0.062696,-0.004818,
+ 0,0,1,0.067158,0.063997,-0.004818,
+ 0,0,1,0.067158,0.063997,-0.004818,
+ 0.006698,0.003152,0.999973,0.070358,0.062696,-0.004818,
+ 0.006487,0.003566,0.999973,0.069902,0.063591,-0.004818,
+ 0,0,1,0.067158,0.063997,-0.004818,
+ 0.006487,0.003566,0.999973,0.069902,0.063591,-0.004818,
+ 0.00625,0.003966,0.999973,0.06939,0.064456,-0.004818,
+ 0,0,1,0.067158,0.063997,-0.004818,
+ 0.00625,0.003966,0.999973,0.06939,0.064456,-0.004818,
+ 0,0,1,0.06617,0.065145,-0.004818,
+ 0,0,1,0.06617,0.065145,-0.004818,
+ 0.00625,0.003966,0.999973,0.06939,0.064456,-0.004818,
+ 0.005989,0.004351,0.999973,0.068825,0.065287,-0.004818,
+ 0,0,1,0.06617,0.065145,-0.004818,
+ 0.005989,0.004351,0.999973,0.068825,0.065287,-0.004818,
+ 0,0,1,0.064959,0.066043,-0.004818,
+ 0,0,1,0.064959,0.066043,-0.004818,
+ 0.005989,0.004351,0.999973,0.068825,0.065287,-0.004818,
+ 0.005704,0.004718,0.999973,0.06821,0.066081,-0.004818,
+ 0,0,1,0.064959,0.066043,-0.004818,
+ 0.005704,0.004718,0.999973,0.06821,0.066081,-0.004818,
+ 0,0,1,0.063583,0.066646,-0.004818,
+ 0,0,1,0.063583,0.066646,-0.004818,
+ 0.005704,0.004718,0.999973,0.06821,0.066081,-0.004818,
+ 0.005396,0.005067,0.999973,0.067545,0.066834,-0.004818,
+ 0,0,1,0.063583,0.066646,-0.004818,
+ 0.005396,0.005067,0.999973,0.067545,0.066834,-0.004818,
+ 0,0,1,0.06211,0.066926,-0.004818,
+ 0,0,1,0.06211,0.066926,-0.004818,
+ 0.005396,0.005067,0.999973,0.067545,0.066834,-0.004818,
+ 0.005067,0.005396,0.999973,0.066834,0.067545,-0.004818,
+ 0,0,1,0.06211,0.066926,-0.004818,
+ 0.005067,0.005396,0.999973,0.066834,0.067545,-0.004818,
+ -0.005067,0.005396,0.999973,0.044936,0.067545,-0.004818,
+ -0.005067,0.005396,0.999973,0.044936,0.067545,-0.004818,
+ 0.005067,0.005396,0.999973,0.066834,0.067545,-0.004818,
+ -0.004718,0.005704,0.999973,0.04569,0.06821,-0.004818,
+ -0.004718,0.005704,0.999973,0.04569,0.06821,-0.004818,
+ 0.005067,0.005396,0.999973,0.066834,0.067545,-0.004818,
+ 0.004718,0.005704,0.999973,0.066081,0.06821,-0.004818,
+ -0.004718,0.005704,0.999973,0.04569,0.06821,-0.004818,
+ 0.004718,0.005704,0.999973,0.066081,0.06821,-0.004818,
+ -0.004351,0.005989,0.999973,0.046484,0.068825,-0.004818,
+ -0.004351,0.005989,0.999973,0.046484,0.068825,-0.004818,
+ 0.004718,0.005704,0.999973,0.066081,0.06821,-0.004818,
+ 0.004351,0.005989,0.999973,0.065287,0.068825,-0.004818,
+ -0.004351,0.005989,0.999973,0.046484,0.068825,-0.004818,
+ 0.004351,0.005989,0.999973,0.065287,0.068825,-0.004818,
+ -0.003966,0.00625,0.999973,0.047315,0.06939,-0.004818,
+ -0.003966,0.00625,0.999973,0.047315,0.06939,-0.004818,
+ 0.004351,0.005989,0.999973,0.065287,0.068825,-0.004818,
+ 0.003966,0.00625,0.999973,0.064456,0.06939,-0.004818,
+ -0.003966,0.00625,0.999973,0.047315,0.06939,-0.004818,
+ 0.003966,0.00625,0.999973,0.064456,0.06939,-0.004818,
+ -0.003566,0.006487,0.999973,0.04818,0.069902,-0.004818,
+ -0.003566,0.006487,0.999973,0.04818,0.069902,-0.004818,
+ 0.003966,0.00625,0.999973,0.064456,0.06939,-0.004818,
+ 0.003566,0.006487,0.999973,0.063591,0.069902,-0.004818,
+ -0.003566,0.006487,0.999973,0.04818,0.069902,-0.004818,
+ 0.003566,0.006487,0.999973,0.063591,0.069902,-0.004818,
+ 0.003152,0.006698,0.999973,0.062696,0.070358,-0.004818,
+ -0.003566,0.006487,0.999973,0.04818,0.069902,-0.004818,
+ 0.003152,0.006698,0.999973,0.062696,0.070358,-0.004818,
+ -0.003152,0.006698,0.999973,0.049075,0.070358,-0.004818,
+ -0.003152,0.006698,0.999973,0.049075,0.070358,-0.004818,
+ 0.003152,0.006698,0.999973,0.062696,0.070358,-0.004818,
+ -0.002725,0.006883,0.999973,0.049997,0.070757,-0.004818,
+ -0.002725,0.006883,0.999973,0.049997,0.070757,-0.004818,
+ 0.003152,0.006698,0.999973,0.062696,0.070358,-0.004818,
+ 0.002725,0.006883,0.999973,0.061773,0.070757,-0.004818,
+ -0.002725,0.006883,0.999973,0.049997,0.070757,-0.004818,
+ 0.002725,0.006883,0.999973,0.061773,0.070757,-0.004818,
+ -0.002287,0.00704,0.999973,0.050943,0.071097,-0.004818,
+ -0.002287,0.00704,0.999973,0.050943,0.071097,-0.004818,
+ 0.002725,0.006883,0.999973,0.061773,0.070757,-0.004818,
+ 0.002287,0.00704,0.999973,0.060828,0.071097,-0.004818,
+ -0.002287,0.00704,0.999973,0.050943,0.071097,-0.004818,
+ 0.002287,0.00704,0.999973,0.060828,0.071097,-0.004818,
+ -0.001841,0.00717,0.999973,0.051908,0.071377,-0.004818,
+ -0.001841,0.00717,0.999973,0.051908,0.071377,-0.004818,
+ 0.002287,0.00704,0.999973,0.060828,0.071097,-0.004818,
+ 0.001841,0.00717,0.999973,0.059863,0.071377,-0.004818,
+ -0.001841,0.00717,0.999973,0.051908,0.071377,-0.004818,
+ 0.001841,0.00717,0.999973,0.059863,0.071377,-0.004818,
+ 0.001387,0.007271,0.999973,0.058882,0.071597,-0.004818,
+ -0.001841,0.00717,0.999973,0.051908,0.071377,-0.004818,
+ 0.001387,0.007271,0.999973,0.058882,0.071597,-0.004818,
+ -0.001387,0.007271,0.999973,0.052888,0.071597,-0.004818,
+ -0.001387,0.007271,0.999973,0.052888,0.071597,-0.004818,
+ 0.001387,0.007271,0.999973,0.058882,0.071597,-0.004818,
+ -0.000928,0.007344,0.999973,0.053881,0.071754,-0.004818,
+ -0.000928,0.007344,0.999973,0.053881,0.071754,-0.004818,
+ 0.001387,0.007271,0.999973,0.058882,0.071597,-0.004818,
+ 0.000928,0.007344,0.999973,0.05789,0.071754,-0.004818,
+ -0.000928,0.007344,0.999973,0.053881,0.071754,-0.004818,
+ 0.000928,0.007344,0.999973,0.05789,0.071754,-0.004818,
+ -0.000465,0.007388,0.999973,0.054881,0.071848,-0.004818,
+ -0.000465,0.007388,0.999973,0.054881,0.071848,-0.004818,
+ 0.000928,0.007344,0.999973,0.05789,0.071754,-0.004818,
+ 0.000465,0.007388,0.999973,0.05689,0.071848,-0.004818,
+ -0.000465,0.007388,0.999973,0.054881,0.071848,-0.004818,
+ 0.000465,0.007388,0.999973,0.05689,0.071848,-0.004818,
+ 0,0.007402,0.999973,0.055885,0.07188,-0.004818,
+ -0.005067,0.005396,0.999973,0.044936,0.067545,-0.004818,
+ 0,0,1,0.04966,0.066926,-0.004818,
+ 0,0,1,0.06211,0.066926,-0.004818,
+ -0.005396,0.005067,0.999973,0.044226,0.066834,-0.004818,
+ 0,0,1,0.04966,0.066926,-0.004818,
+ -0.005067,0.005396,0.999973,0.044936,0.067545,-0.004818,
+ -0.005396,0.005067,0.999973,0.044226,0.066834,-0.004818,
+ 0,0,1,0.048188,0.066646,-0.004818,
+ 0,0,1,0.04966,0.066926,-0.004818,
+ -0.005704,0.004718,0.999973,0.043561,0.066081,-0.004818,
+ 0,0,1,0.048188,0.066646,-0.004818,
+ -0.005396,0.005067,0.999973,0.044226,0.066834,-0.004818,
+ -0.005704,0.004718,0.999973,0.043561,0.066081,-0.004818,
+ 0,0,1,0.046812,0.066043,-0.004818,
+ 0,0,1,0.048188,0.066646,-0.004818,
+ -0.005989,0.004351,0.999973,0.042945,0.065287,-0.004818,
+ 0,0,1,0.046812,0.066043,-0.004818,
+ -0.005704,0.004718,0.999973,0.043561,0.066081,-0.004818,
+ -0.005989,0.004351,0.999973,0.042945,0.065287,-0.004818,
+ 0,0,1,0.0456,0.065145,-0.004818,
+ 0,0,1,0.046812,0.066043,-0.004818,
+ -0.00625,0.003966,0.999973,0.042381,0.064456,-0.004818,
+ 0,0,1,0.0456,0.065145,-0.004818,
+ -0.005989,0.004351,0.999973,0.042945,0.065287,-0.004818,
+ -0.00625,0.003966,0.999973,0.042381,0.064456,-0.004818,
+ 0,0,1,0.044613,0.063997,-0.004818,
+ 0,0,1,0.0456,0.065145,-0.004818,
+ -0.006487,0.003566,0.999973,0.041869,0.063591,-0.004818,
+ 0,0,1,0.044613,0.063997,-0.004818,
+ -0.00625,0.003966,0.999973,0.042381,0.064456,-0.004818,
+ 0,0,1,0.04966,0.066926,-0.004818,
+ 0,0,1,0.060613,0.066867,-0.004818,
+ 0,0,1,0.06211,0.066926,-0.004818,
+ 0,0,1,0.051157,0.066867,-0.004818,
+ 0,0,1,0.060613,0.066867,-0.004818,
+ 0,0,1,0.04966,0.066926,-0.004818,
+ 0,0,1,0.051157,0.066867,-0.004818,
+ 0,0,1,0.059165,0.066474,-0.004818,
+ 0,0,1,0.060613,0.066867,-0.004818,
+ 0,0,1,0.052605,0.066474,-0.004818,
+ 0,0,1,0.059165,0.066474,-0.004818,
+ 0,0,1,0.051157,0.066867,-0.004818,
+ 0,0,1,0.052605,0.066474,-0.004818,
+ 0,0,1,0.057837,0.065766,-0.004818,
+ 0,0,1,0.059165,0.066474,-0.004818,
+ 0,0,1,0.053934,0.065766,-0.004818,
+ 0,0,1,0.057837,0.065766,-0.004818,
+ 0,0,1,0.052605,0.066474,-0.004818,
+ 0,0,1,0.053934,0.065766,-0.004818,
+ 0,0,1,0.056739,0.064761,-0.004818,
+ 0,0,1,0.057837,0.065766,-0.004818,
+ 0,0,1,0.055031,0.064761,-0.004818,
+ 0,0,1,0.056739,0.064761,-0.004818,
+ 0,0,1,0.053934,0.065766,-0.004818,
+ 0,0,1,0.056739,0.064761,-0.004818,
+ 0,0,1,0.055031,0.064761,-0.004818,
+ 0,0,1,0.055885,0.063727,-0.004818,
+ -0.929776,-0.368125,0,0.03976,0.049501,-0.007708,
+ -0.929762,-0.368119,0.005552,0.03976,0.049501,-0.006167,
+ -0.951042,-0.309012,0.005552,0.03939,0.050526,-0.006167,
+ -0.929776,-0.368125,0,0.03976,0.049501,-0.007708,
+ -0.951042,-0.309012,0.005552,0.03939,0.050526,-0.006167,
+ -0.951057,-0.309017,0,0.03939,0.050526,-0.007708,
+ -0.904827,-0.425779,0,0.040192,0.048501,-0.007708,
+ -0.904813,-0.425773,0.005552,0.040192,0.048501,-0.006167,
+ -0.929762,-0.368119,0.005552,0.03976,0.049501,-0.006167,
+ -0.904827,-0.425779,0,0.040192,0.048501,-0.007708,
+ -0.929762,-0.368119,0.005552,0.03976,0.049501,-0.006167,
+ -0.929776,-0.368125,0,0.03976,0.049501,-0.007708,
+ -0.876307,-0.481754,0,0.040687,0.04753,-0.007708,
+ -0.876293,-0.481746,0.005552,0.040687,0.04753,-0.006167,
+ -0.904813,-0.425773,0.005552,0.040192,0.048501,-0.006167,
+ -0.876307,-0.481754,0,0.040687,0.04753,-0.007708,
+ -0.904813,-0.425773,0.005552,0.040192,0.048501,-0.006167,
+ -0.904827,-0.425779,0,0.040192,0.048501,-0.007708,
+ -0.844328,-0.535827,0,0.041241,0.046592,-0.007708,
+ -0.844315,-0.535819,0.005552,0.041241,0.046592,-0.006167,
+ -0.876293,-0.481746,0.005552,0.040687,0.04753,-0.006167,
+ -0.844328,-0.535827,0,0.041241,0.046592,-0.007708,
+ -0.876293,-0.481746,0.005552,0.040687,0.04753,-0.006167,
+ -0.876307,-0.481754,0,0.040687,0.04753,-0.007708,
+ -0.844328,-0.535827,0,0.041241,0.046592,-0.007708,
+ -0.876307,-0.481754,0,0.040687,0.04753,-0.007708,
+ -0.860742,-0.509041,0,0.040845,0.047263,-0.007708,
+ -0.844328,-0.535827,0,0.041241,0.046592,-0.007708,
+ -0.860742,-0.509041,0,0.040845,0.047263,-0.007708,
+ -0.860742,-0.509041,0,0.040904,0.047163,-0.007708,
+ -0.809017,-0.587785,0,0.041854,0.045691,-0.007708,
+ -0.809005,-0.587776,0.005552,0.041854,0.045691,-0.006167,
+ -0.844315,-0.535819,0.005552,0.041241,0.046592,-0.006167,
+ -0.809017,-0.587785,0,0.041854,0.045691,-0.007708,
+ -0.844315,-0.535819,0.005552,0.041241,0.046592,-0.006167,
+ -0.844328,-0.535827,0,0.041241,0.046592,-0.007708,
+ -0.770513,-0.637424,0,0.042522,0.04483,-0.007708,
+ -0.770501,-0.637414,0.005552,0.042522,0.04483,-0.006167,
+ -0.809005,-0.587776,0.005552,0.041854,0.045691,-0.006167,
+ -0.770513,-0.637424,0,0.042522,0.04483,-0.007708,
+ -0.809005,-0.587776,0.005552,0.041854,0.045691,-0.006167,
+ -0.809017,-0.587785,0,0.041854,0.045691,-0.007708,
+ -0.728969,-0.684547,0,0.043242,0.044013,-0.007708,
+ -0.728957,-0.684537,0.005552,0.043242,0.044013,-0.006167,
+ -0.770501,-0.637414,0.005552,0.042522,0.04483,-0.006167,
+ -0.728969,-0.684547,0,0.043242,0.044013,-0.007708,
+ -0.770501,-0.637414,0.005552,0.042522,0.04483,-0.006167,
+ -0.770513,-0.637424,0,0.042522,0.04483,-0.007708,
+ -0.684547,-0.728969,0,0.044013,0.043242,-0.007708,
+ -0.684537,-0.728957,0.005552,0.044013,0.043242,-0.006167,
+ -0.728957,-0.684537,0.005552,0.043242,0.044013,-0.006167,
+ -0.684547,-0.728969,0,0.044013,0.043242,-0.007708,
+ -0.728957,-0.684537,0.005552,0.043242,0.044013,-0.006167,
+ -0.728969,-0.684547,0,0.043242,0.044013,-0.007708,
+ -0.684547,-0.728969,0,0.044013,0.043242,-0.007708,
+ -0.728969,-0.684547,0,0.043242,0.044013,-0.007708,
+ -0.707107,-0.707107,0,0.043581,0.043673,-0.007708,
+ -0.684547,-0.728969,0,0.044013,0.043242,-0.007708,
+ -0.707107,-0.707107,0,0.043581,0.043673,-0.007708,
+ -0.707107,-0.707107,0,0.043673,0.043581,-0.007708,
+ -0.637424,-0.770513,0,0.04483,0.042522,-0.007708,
+ -0.637414,-0.770501,0.005552,0.04483,0.042522,-0.006167,
+ -0.684537,-0.728957,0.005552,0.044013,0.043242,-0.006167,
+ -0.637424,-0.770513,0,0.04483,0.042522,-0.007708,
+ -0.684537,-0.728957,0.005552,0.044013,0.043242,-0.006167,
+ -0.684547,-0.728969,0,0.044013,0.043242,-0.007708,
+ -0.587785,-0.809017,0,0.045691,0.041854,-0.007708,
+ -0.587776,-0.809005,0.005552,0.045691,0.041854,-0.006167,
+ -0.637414,-0.770501,0.005552,0.04483,0.042522,-0.006167,
+ -0.587785,-0.809017,0,0.045691,0.041854,-0.007708,
+ -0.637414,-0.770501,0.005552,0.04483,0.042522,-0.006167,
+ -0.637424,-0.770513,0,0.04483,0.042522,-0.007708,
+ -0.535827,-0.844328,0,0.046592,0.041241,-0.007708,
+ -0.535819,-0.844315,0.005552,0.046592,0.041241,-0.006167,
+ -0.587776,-0.809005,0.005552,0.045691,0.041854,-0.006167,
+ -0.535827,-0.844328,0,0.046592,0.041241,-0.007708,
+ -0.587776,-0.809005,0.005552,0.045691,0.041854,-0.006167,
+ -0.587785,-0.809017,0,0.045691,0.041854,-0.007708,
+ -0.481754,-0.876307,0,0.04753,0.040687,-0.007708,
+ -0.481746,-0.876293,0.005552,0.04753,0.040687,-0.006167,
+ -0.535819,-0.844315,0.005552,0.046592,0.041241,-0.006167,
+ -0.481754,-0.876307,0,0.04753,0.040687,-0.007708,
+ -0.535819,-0.844315,0.005552,0.046592,0.041241,-0.006167,
+ -0.535827,-0.844328,0,0.046592,0.041241,-0.007708,
+ -0.481754,-0.876307,0,0.04753,0.040687,-0.007708,
+ -0.535827,-0.844328,0,0.046592,0.041241,-0.007708,
+ -0.509041,-0.860742,0,0.047163,0.040904,-0.007708,
+ -0.481754,-0.876307,0,0.04753,0.040687,-0.007708,
+ -0.509041,-0.860742,0,0.047163,0.040904,-0.007708,
+ -0.509041,-0.860742,0,0.047263,0.040845,-0.007708,
+ -0.425779,-0.904827,0,0.048501,0.040192,-0.007708,
+ -0.425773,-0.904813,0.005552,0.048501,0.040192,-0.006167,
+ -0.481746,-0.876293,0.005552,0.04753,0.040687,-0.006167,
+ -0.425779,-0.904827,0,0.048501,0.040192,-0.007708,
+ -0.481746,-0.876293,0.005552,0.04753,0.040687,-0.006167,
+ -0.481754,-0.876307,0,0.04753,0.040687,-0.007708,
+ -0.368125,-0.929776,0,0.049501,0.03976,-0.007708,
+ -0.368119,-0.929762,0.005552,0.049501,0.03976,-0.006167,
+ -0.425773,-0.904813,0.005552,0.048501,0.040192,-0.006167,
+ -0.368125,-0.929776,0,0.049501,0.03976,-0.007708,
+ -0.425773,-0.904813,0.005552,0.048501,0.040192,-0.006167,
+ -0.425779,-0.904827,0,0.048501,0.040192,-0.007708,
+ -0.309017,-0.951057,0,0.050526,0.03939,-0.007708,
+ -0.309012,-0.951042,0.005552,0.050526,0.03939,-0.006167,
+ -0.368119,-0.929762,0.005552,0.049501,0.03976,-0.006167,
+ -0.309017,-0.951057,0,0.050526,0.03939,-0.007708,
+ -0.368119,-0.929762,0.005552,0.049501,0.03976,-0.006167,
+ -0.368125,-0.929776,0,0.049501,0.03976,-0.007708,
+ -0.24869,-0.968583,0,0.051572,0.039087,-0.007708,
+ -0.248686,-0.968568,0.005552,0.051572,0.039087,-0.006167,
+ -0.309012,-0.951042,0.005552,0.050526,0.03939,-0.006167,
+ -0.24869,-0.968583,0,0.051572,0.039087,-0.007708,
+ -0.309012,-0.951042,0.005552,0.050526,0.03939,-0.006167,
+ -0.309017,-0.951057,0,0.050526,0.03939,-0.007708,
+ -0.24869,-0.968583,0,0.051572,0.039087,-0.007708,
+ -0.309017,-0.951057,0,0.050526,0.03939,-0.007708,
+ -0.278991,-0.960294,0,0.051356,0.039149,-0.007708,
+ -0.24869,-0.968583,0,0.051572,0.039087,-0.007708,
+ -0.278991,-0.960294,0,0.051356,0.039149,-0.007708,
+ -0.278991,-0.960294,0,0.051428,0.039128,-0.007708,
+ -0.187381,-0.982287,0,0.052635,0.038849,-0.007708,
+ -0.187378,-0.982272,0.005552,0.052635,0.038849,-0.006167,
+ -0.248686,-0.968568,0.005552,0.051572,0.039087,-0.006167,
+ -0.187381,-0.982287,0,0.052635,0.038849,-0.007708,
+ -0.248686,-0.968568,0.005552,0.051572,0.039087,-0.006167,
+ -0.24869,-0.968583,0,0.051572,0.039087,-0.007708,
+ -0.125333,-0.992115,0,0.053712,0.038678,-0.007708,
+ -0.125331,-0.992099,0.005552,0.053712,0.038678,-0.006167,
+ -0.187378,-0.982272,0.005552,0.052635,0.038849,-0.006167,
+ -0.125333,-0.992115,0,0.053712,0.038678,-0.007708,
+ -0.187378,-0.982272,0.005552,0.052635,0.038849,-0.006167,
+ -0.187381,-0.982287,0,0.052635,0.038849,-0.007708,
+ -0.094108,-0.995562,0,0.054796,0.038576,-0.007708,
+ -0.07324,-0.997287,0.007402,0.054796,0.038576,-0.006167,
+ -0.125331,-0.992099,0.005552,0.053712,0.038678,-0.006167,
+ -0.094108,-0.995562,0,0.054796,0.038576,-0.007708,
+ -0.125331,-0.992099,0.005552,0.053712,0.038678,-0.006167,
+ -0.125333,-0.992115,0,0.053712,0.038678,-0.007708,
+ -0.951057,-0.309017,0,0.03939,0.050526,-0.007708,
+ -0.951042,-0.309012,0.005552,0.03939,0.050526,-0.006167,
+ -0.968568,-0.248686,0.005552,0.039087,0.051572,-0.006167,
+ -0.951057,-0.309017,0,0.03939,0.050526,-0.007708,
+ -0.968568,-0.248686,0.005552,0.039087,0.051572,-0.006167,
+ -0.968583,-0.24869,0,0.039087,0.051572,-0.007708,
+ -0.951057,-0.309017,0,0.03939,0.050526,-0.007708,
+ -0.968583,-0.24869,0,0.039087,0.051572,-0.007708,
+ -0.960294,-0.278991,0,0.039128,0.051428,-0.007708,
+ -0.951057,-0.309017,0,0.03939,0.050526,-0.007708,
+ -0.960294,-0.278991,0,0.039128,0.051428,-0.007708,
+ -0.960294,-0.278991,0,0.039149,0.051356,-0.007708,
+ -0.968583,-0.24869,0,0.039087,0.051572,-0.007708,
+ -0.968568,-0.248686,0.005552,0.039087,0.051572,-0.006167,
+ -0.982272,-0.187378,0.005552,0.038849,0.052635,-0.006167,
+ -0.968583,-0.24869,0,0.039087,0.051572,-0.007708,
+ -0.982272,-0.187378,0.005552,0.038849,0.052635,-0.006167,
+ -0.982287,-0.187381,0,0.038849,0.052635,-0.007708,
+ -0.982287,-0.187381,0,0.038849,0.052635,-0.007708,
+ -0.982272,-0.187378,0.005552,0.038849,0.052635,-0.006167,
+ -0.992099,-0.125331,0.005552,0.038678,0.053712,-0.006167,
+ -0.982287,-0.187381,0,0.038849,0.052635,-0.007708,
+ -0.992099,-0.125331,0.005552,0.038678,0.053712,-0.006167,
+ -0.992115,-0.125333,0,0.038678,0.053712,-0.007708,
+ -0.992115,-0.125333,0,0.038678,0.053712,-0.007708,
+ -0.992099,-0.125331,0.005552,0.038678,0.053712,-0.006167,
+ -0.997287,-0.07324,0.007402,0.038576,0.054796,-0.006167,
+ -0.992115,-0.125333,0,0.038678,0.053712,-0.007708,
+ -0.997287,-0.07324,0.007402,0.038576,0.054796,-0.006167,
+ -0.995562,-0.094108,0,0.038576,0.054796,-0.007708,
+ -0.995562,0.094108,0,0.038576,0.056974,-0.007708,
+ -0.997287,0.07324,0.007402,0.038576,0.056974,-0.006167,
+ -0.992099,0.125331,0.005552,0.038678,0.058059,-0.006167,
+ -0.995562,0.094108,0,0.038576,0.056974,-0.007708,
+ -0.992099,0.125331,0.005552,0.038678,0.058059,-0.006167,
+ -0.992115,0.125333,0,0.038678,0.058059,-0.007708,
+ -0.992115,0.125333,0,0.038678,0.058059,-0.007708,
+ -0.992099,0.125331,0.005552,0.038678,0.058059,-0.006167,
+ -0.982272,0.187378,0.005552,0.038849,0.059135,-0.006167,
+ -0.992115,0.125333,0,0.038678,0.058059,-0.007708,
+ -0.982272,0.187378,0.005552,0.038849,0.059135,-0.006167,
+ -0.982287,0.187381,0,0.038849,0.059135,-0.007708,
+ -0.982287,0.187381,0,0.038849,0.059135,-0.007708,
+ -0.982272,0.187378,0.005552,0.038849,0.059135,-0.006167,
+ -0.968568,0.248686,0.005552,0.039087,0.060198,-0.006167,
+ -0.982287,0.187381,0,0.038849,0.059135,-0.007708,
+ -0.968568,0.248686,0.005552,0.039087,0.060198,-0.006167,
+ -0.968583,0.24869,0,0.039087,0.060198,-0.007708,
+ -0.968583,0.24869,0,0.039087,0.060198,-0.007708,
+ -0.968568,0.248686,0.005552,0.039087,0.060198,-0.006167,
+ -0.951042,0.309012,0.005552,0.03939,0.061245,-0.006167,
+ -0.968583,0.24869,0,0.039087,0.060198,-0.007708,
+ -0.951042,0.309012,0.005552,0.03939,0.061245,-0.006167,
+ -0.951057,0.309017,0,0.03939,0.061245,-0.007708,
+ -0.968583,0.24869,0,0.039087,0.060198,-0.007708,
+ -0.951057,0.309017,0,0.03939,0.061245,-0.007708,
+ -0.960294,0.278991,0,0.039149,0.060414,-0.007708,
+ -0.968583,0.24869,0,0.039087,0.060198,-0.007708,
+ -0.960294,0.278991,0,0.039149,0.060414,-0.007708,
+ -0.960294,0.278991,0,0.039128,0.060343,-0.007708,
+ -0.951057,0.309017,0,0.03939,0.061245,-0.007708,
+ -0.951042,0.309012,0.005552,0.03939,0.061245,-0.006167,
+ -0.929762,0.368119,0.005552,0.03976,0.06227,-0.006167,
+ -0.951057,0.309017,0,0.03939,0.061245,-0.007708,
+ -0.929762,0.368119,0.005552,0.03976,0.06227,-0.006167,
+ -0.929776,0.368125,0,0.03976,0.06227,-0.007708,
+ -0.929776,0.368125,0,0.03976,0.06227,-0.007708,
+ -0.929762,0.368119,0.005552,0.03976,0.06227,-0.006167,
+ -0.904813,0.425773,0.005552,0.040192,0.06327,-0.006167,
+ -0.929776,0.368125,0,0.03976,0.06227,-0.007708,
+ -0.904813,0.425773,0.005552,0.040192,0.06327,-0.006167,
+ -0.904827,0.425779,0,0.040192,0.06327,-0.007708,
+ -0.904827,0.425779,0,0.040192,0.06327,-0.007708,
+ -0.904813,0.425773,0.005552,0.040192,0.06327,-0.006167,
+ -0.876293,0.481746,0.005552,0.040687,0.064241,-0.006167,
+ -0.904827,0.425779,0,0.040192,0.06327,-0.007708,
+ -0.876293,0.481746,0.005552,0.040687,0.064241,-0.006167,
+ -0.876307,0.481754,0,0.040687,0.064241,-0.007708,
+ -0.876307,0.481754,0,0.040687,0.064241,-0.007708,
+ -0.876293,0.481746,0.005552,0.040687,0.064241,-0.006167,
+ -0.844315,0.535819,0.005552,0.041241,0.065178,-0.006167,
+ -0.876307,0.481754,0,0.040687,0.064241,-0.007708,
+ -0.844315,0.535819,0.005552,0.041241,0.065178,-0.006167,
+ -0.844328,0.535827,0,0.041241,0.065178,-0.007708,
+ -0.876307,0.481754,0,0.040687,0.064241,-0.007708,
+ -0.844328,0.535827,0,0.041241,0.065178,-0.007708,
+ -0.860742,0.509041,0,0.040904,0.064607,-0.007708,
+ -0.876307,0.481754,0,0.040687,0.064241,-0.007708,
+ -0.860742,0.509041,0,0.040904,0.064607,-0.007708,
+ -0.860742,0.509041,0,0.040845,0.064507,-0.007708,
+ -0.844328,0.535827,0,0.041241,0.065178,-0.007708,
+ -0.844315,0.535819,0.005552,0.041241,0.065178,-0.006167,
+ -0.809005,0.587776,0.005552,0.041854,0.06608,-0.006167,
+ -0.844328,0.535827,0,0.041241,0.065178,-0.007708,
+ -0.809005,0.587776,0.005552,0.041854,0.06608,-0.006167,
+ -0.809017,0.587785,0,0.041854,0.06608,-0.007708,
+ -0.809017,0.587785,0,0.041854,0.06608,-0.007708,
+ -0.809005,0.587776,0.005552,0.041854,0.06608,-0.006167,
+ -0.770501,0.637414,0.005552,0.042522,0.066941,-0.006167,
+ -0.809017,0.587785,0,0.041854,0.06608,-0.007708,
+ -0.770501,0.637414,0.005552,0.042522,0.066941,-0.006167,
+ -0.770513,0.637424,0,0.042522,0.066941,-0.007708,
+ -0.770513,0.637424,0,0.042522,0.066941,-0.007708,
+ -0.770501,0.637414,0.005552,0.042522,0.066941,-0.006167,
+ -0.728957,0.684537,0.005552,0.043242,0.067758,-0.006167,
+ -0.770513,0.637424,0,0.042522,0.066941,-0.007708,
+ -0.728957,0.684537,0.005552,0.043242,0.067758,-0.006167,
+ -0.728969,0.684547,0,0.043242,0.067758,-0.007708,
+ -0.728969,0.684547,0,0.043242,0.067758,-0.007708,
+ -0.728957,0.684537,0.005552,0.043242,0.067758,-0.006167,
+ -0.684537,0.728957,0.005552,0.044013,0.068528,-0.006167,
+ -0.728969,0.684547,0,0.043242,0.067758,-0.007708,
+ -0.684537,0.728957,0.005552,0.044013,0.068528,-0.006167,
+ -0.684547,0.728969,0,0.044013,0.068528,-0.007708,
+ -0.728969,0.684547,0,0.043242,0.067758,-0.007708,
+ -0.684547,0.728969,0,0.044013,0.068528,-0.007708,
+ -0.707107,0.707107,0,0.043673,0.068189,-0.007708,
+ -0.728969,0.684547,0,0.043242,0.067758,-0.007708,
+ -0.707107,0.707107,0,0.043673,0.068189,-0.007708,
+ -0.707107,0.707107,0,0.043581,0.068097,-0.007708,
+ -0.684547,0.728969,0,0.044013,0.068528,-0.007708,
+ -0.684537,0.728957,0.005552,0.044013,0.068528,-0.006167,
+ -0.637414,0.770501,0.005552,0.04483,0.069249,-0.006167,
+ -0.684547,0.728969,0,0.044013,0.068528,-0.007708,
+ -0.637414,0.770501,0.005552,0.04483,0.069249,-0.006167,
+ -0.637424,0.770513,0,0.04483,0.069249,-0.007708,
+ -0.637424,0.770513,0,0.04483,0.069249,-0.007708,
+ -0.637414,0.770501,0.005552,0.04483,0.069249,-0.006167,
+ -0.587776,0.809005,0.005552,0.045691,0.069917,-0.006167,
+ -0.637424,0.770513,0,0.04483,0.069249,-0.007708,
+ -0.587776,0.809005,0.005552,0.045691,0.069917,-0.006167,
+ -0.587785,0.809017,0,0.045691,0.069917,-0.007708,
+ -0.587785,0.809017,0,0.045691,0.069917,-0.007708,
+ -0.587776,0.809005,0.005552,0.045691,0.069917,-0.006167,
+ -0.535819,0.844315,0.005552,0.046592,0.070529,-0.006167,
+ -0.587785,0.809017,0,0.045691,0.069917,-0.007708,
+ -0.535819,0.844315,0.005552,0.046592,0.070529,-0.006167,
+ -0.535827,0.844328,0,0.046592,0.070529,-0.007708,
+ -0.535827,0.844328,0,0.046592,0.070529,-0.007708,
+ -0.535819,0.844315,0.005552,0.046592,0.070529,-0.006167,
+ -0.481746,0.876293,0.005552,0.04753,0.071084,-0.006167,
+ -0.535827,0.844328,0,0.046592,0.070529,-0.007708,
+ -0.481746,0.876293,0.005552,0.04753,0.071084,-0.006167,
+ -0.481754,0.876307,0,0.04753,0.071084,-0.007708,
+ -0.535827,0.844328,0,0.046592,0.070529,-0.007708,
+ -0.481754,0.876307,0,0.04753,0.071084,-0.007708,
+ -0.509041,0.860742,0,0.047263,0.070926,-0.007708,
+ -0.535827,0.844328,0,0.046592,0.070529,-0.007708,
+ -0.509041,0.860742,0,0.047263,0.070926,-0.007708,
+ -0.509041,0.860742,0,0.047163,0.070867,-0.007708,
+ -0.481754,0.876307,0,0.04753,0.071084,-0.007708,
+ -0.481746,0.876293,0.005552,0.04753,0.071084,-0.006167,
+ -0.425773,0.904813,0.005552,0.048501,0.071578,-0.006167,
+ -0.481754,0.876307,0,0.04753,0.071084,-0.007708,
+ -0.425773,0.904813,0.005552,0.048501,0.071578,-0.006167,
+ -0.425779,0.904827,0,0.048501,0.071578,-0.007708,
+ -0.425779,0.904827,0,0.048501,0.071578,-0.007708,
+ -0.425773,0.904813,0.005552,0.048501,0.071578,-0.006167,
+ -0.368119,0.929762,0.005552,0.049501,0.072011,-0.006167,
+ -0.425779,0.904827,0,0.048501,0.071578,-0.007708,
+ -0.368119,0.929762,0.005552,0.049501,0.072011,-0.006167,
+ -0.368125,0.929776,0,0.049501,0.072011,-0.007708,
+ -0.368125,0.929776,0,0.049501,0.072011,-0.007708,
+ -0.368119,0.929762,0.005552,0.049501,0.072011,-0.006167,
+ -0.309012,0.951042,0.005552,0.050526,0.07238,-0.006167,
+ -0.368125,0.929776,0,0.049501,0.072011,-0.007708,
+ -0.309012,0.951042,0.005552,0.050526,0.07238,-0.006167,
+ -0.309017,0.951057,0,0.050526,0.07238,-0.007708,
+ -0.309017,0.951057,0,0.050526,0.07238,-0.007708,
+ -0.309012,0.951042,0.005552,0.050526,0.07238,-0.006167,
+ -0.248686,0.968568,0.005552,0.051572,0.072684,-0.006167,
+ -0.309017,0.951057,0,0.050526,0.07238,-0.007708,
+ -0.248686,0.968568,0.005552,0.051572,0.072684,-0.006167,
+ -0.24869,0.968583,0,0.051572,0.072684,-0.007708,
+ -0.309017,0.951057,0,0.050526,0.07238,-0.007708,
+ -0.24869,0.968583,0,0.051572,0.072684,-0.007708,
+ -0.278991,0.960294,0,0.051428,0.072642,-0.007708,
+ -0.309017,0.951057,0,0.050526,0.07238,-0.007708,
+ -0.278991,0.960294,0,0.051428,0.072642,-0.007708,
+ -0.278991,0.960294,0,0.051356,0.072621,-0.007708,
+ -0.24869,0.968583,0,0.051572,0.072684,-0.007708,
+ -0.248686,0.968568,0.005552,0.051572,0.072684,-0.006167,
+ -0.187378,0.982272,0.005552,0.052635,0.072922,-0.006167,
+ -0.24869,0.968583,0,0.051572,0.072684,-0.007708,
+ -0.187378,0.982272,0.005552,0.052635,0.072922,-0.006167,
+ -0.187381,0.982287,0,0.052635,0.072922,-0.007708,
+ -0.187381,0.982287,0,0.052635,0.072922,-0.007708,
+ -0.187378,0.982272,0.005552,0.052635,0.072922,-0.006167,
+ -0.125331,0.992099,0.005552,0.053712,0.073092,-0.006167,
+ -0.187381,0.982287,0,0.052635,0.072922,-0.007708,
+ -0.125331,0.992099,0.005552,0.053712,0.073092,-0.006167,
+ -0.125333,0.992115,0,0.053712,0.073092,-0.007708,
+ -0.125333,0.992115,0,0.053712,0.073092,-0.007708,
+ -0.125331,0.992099,0.005552,0.053712,0.073092,-0.006167,
+ -0.07324,0.997287,0.007402,0.054796,0.073195,-0.006167,
+ -0.125333,0.992115,0,0.053712,0.073092,-0.007708,
+ -0.07324,0.997287,0.007402,0.054796,0.073195,-0.006167,
+ -0.094108,0.995562,0,0.054796,0.073195,-0.007708,
+ 0.094108,0.995562,0,0.056974,0.073195,-0.007708,
+ 0.07324,0.997287,0.007402,0.056974,0.073195,-0.006167,
+ 0.125331,0.992099,0.005552,0.058059,0.073092,-0.006167,
+ 0.094108,0.995562,0,0.056974,0.073195,-0.007708,
+ 0.125331,0.992099,0.005552,0.058059,0.073092,-0.006167,
+ 0.125333,0.992115,0,0.058059,0.073092,-0.007708,
+ 0.125333,0.992115,0,0.058059,0.073092,-0.007708,
+ 0.125331,0.992099,0.005552,0.058059,0.073092,-0.006167,
+ 0.187378,0.982272,0.005552,0.059135,0.072922,-0.006167,
+ 0.125333,0.992115,0,0.058059,0.073092,-0.007708,
+ 0.187378,0.982272,0.005552,0.059135,0.072922,-0.006167,
+ 0.187381,0.982287,0,0.059135,0.072922,-0.007708,
+ 0.187381,0.982287,0,0.059135,0.072922,-0.007708,
+ 0.187378,0.982272,0.005552,0.059135,0.072922,-0.006167,
+ 0.248686,0.968568,0.005552,0.060198,0.072684,-0.006167,
+ 0.187381,0.982287,0,0.059135,0.072922,-0.007708,
+ 0.248686,0.968568,0.005552,0.060198,0.072684,-0.006167,
+ 0.24869,0.968583,0,0.060198,0.072684,-0.007708,
+ 0.24869,0.968583,0,0.060198,0.072684,-0.007708,
+ 0.248686,0.968568,0.005552,0.060198,0.072684,-0.006167,
+ 0.309012,0.951042,0.005552,0.061245,0.07238,-0.006167,
+ 0.24869,0.968583,0,0.060198,0.072684,-0.007708,
+ 0.309012,0.951042,0.005552,0.061245,0.07238,-0.006167,
+ 0.309017,0.951057,0,0.061245,0.07238,-0.007708,
+ 0.24869,0.968583,0,0.060198,0.072684,-0.007708,
+ 0.309017,0.951057,0,0.061245,0.07238,-0.007708,
+ 0.278991,0.960294,0,0.060414,0.072621,-0.007708,
+ 0.24869,0.968583,0,0.060198,0.072684,-0.007708,
+ 0.278991,0.960294,0,0.060414,0.072621,-0.007708,
+ 0.278991,0.960294,0,0.060343,0.072642,-0.007708,
+ 0.309017,0.951057,0,0.061245,0.07238,-0.007708,
+ 0.309012,0.951042,0.005552,0.061245,0.07238,-0.006167,
+ 0.368119,0.929762,0.005552,0.06227,0.072011,-0.006167,
+ 0.309017,0.951057,0,0.061245,0.07238,-0.007708,
+ 0.368119,0.929762,0.005552,0.06227,0.072011,-0.006167,
+ 0.368125,0.929776,0,0.06227,0.072011,-0.007708,
+ 0.368125,0.929776,0,0.06227,0.072011,-0.007708,
+ 0.368119,0.929762,0.005552,0.06227,0.072011,-0.006167,
+ 0.425773,0.904813,0.005552,0.06327,0.071578,-0.006167,
+ 0.368125,0.929776,0,0.06227,0.072011,-0.007708,
+ 0.425773,0.904813,0.005552,0.06327,0.071578,-0.006167,
+ 0.425779,0.904827,0,0.06327,0.071578,-0.007708,
+ 0.425779,0.904827,0,0.06327,0.071578,-0.007708,
+ 0.425773,0.904813,0.005552,0.06327,0.071578,-0.006167,
+ 0.481746,0.876293,0.005552,0.064241,0.071084,-0.006167,
+ 0.425779,0.904827,0,0.06327,0.071578,-0.007708,
+ 0.481746,0.876293,0.005552,0.064241,0.071084,-0.006167,
+ 0.481754,0.876307,0,0.064241,0.071084,-0.007708,
+ 0.481754,0.876307,0,0.064241,0.071084,-0.007708,
+ 0.481746,0.876293,0.005552,0.064241,0.071084,-0.006167,
+ 0.535819,0.844315,0.005552,0.065178,0.070529,-0.006167,
+ 0.481754,0.876307,0,0.064241,0.071084,-0.007708,
+ 0.535819,0.844315,0.005552,0.065178,0.070529,-0.006167,
+ 0.535827,0.844328,0,0.065178,0.070529,-0.007708,
+ 0.481754,0.876307,0,0.064241,0.071084,-0.007708,
+ 0.535827,0.844328,0,0.065178,0.070529,-0.007708,
+ 0.509041,0.860742,0,0.064607,0.070867,-0.007708,
+ 0.481754,0.876307,0,0.064241,0.071084,-0.007708,
+ 0.509041,0.860742,0,0.064607,0.070867,-0.007708,
+ 0.509041,0.860742,0,0.064507,0.070926,-0.007708,
+ 0.535827,0.844328,0,0.065178,0.070529,-0.007708,
+ 0.535819,0.844315,0.005552,0.065178,0.070529,-0.006167,
+ 0.587776,0.809005,0.005552,0.06608,0.069917,-0.006167,
+ 0.535827,0.844328,0,0.065178,0.070529,-0.007708,
+ 0.587776,0.809005,0.005552,0.06608,0.069917,-0.006167,
+ 0.587785,0.809017,0,0.06608,0.069917,-0.007708,
+ 0.587785,0.809017,0,0.06608,0.069917,-0.007708,
+ 0.587776,0.809005,0.005552,0.06608,0.069917,-0.006167,
+ 0.637414,0.770501,0.005552,0.066941,0.069249,-0.006167,
+ 0.587785,0.809017,0,0.06608,0.069917,-0.007708,
+ 0.637414,0.770501,0.005552,0.066941,0.069249,-0.006167,
+ 0.637424,0.770513,0,0.066941,0.069249,-0.007708,
+ 0.637424,0.770513,0,0.066941,0.069249,-0.007708,
+ 0.637414,0.770501,0.005552,0.066941,0.069249,-0.006167,
+ 0.684537,0.728957,0.005552,0.067758,0.068528,-0.006167,
+ 0.637424,0.770513,0,0.066941,0.069249,-0.007708,
+ 0.684537,0.728957,0.005552,0.067758,0.068528,-0.006167,
+ 0.684547,0.728969,0,0.067758,0.068528,-0.007708,
+ 0.684547,0.728969,0,0.067758,0.068528,-0.007708,
+ 0.684537,0.728957,0.005552,0.067758,0.068528,-0.006167,
+ 0.728957,0.684537,0.005552,0.068528,0.067758,-0.006167,
+ 0.684547,0.728969,0,0.067758,0.068528,-0.007708,
+ 0.728957,0.684537,0.005552,0.068528,0.067758,-0.006167,
+ 0.728969,0.684547,0,0.068528,0.067758,-0.007708,
+ 0.684547,0.728969,0,0.067758,0.068528,-0.007708,
+ 0.728969,0.684547,0,0.068528,0.067758,-0.007708,
+ 0.707107,0.707107,0,0.068189,0.068097,-0.007708,
+ 0.684547,0.728969,0,0.067758,0.068528,-0.007708,
+ 0.707107,0.707107,0,0.068189,0.068097,-0.007708,
+ 0.707107,0.707107,0,0.068097,0.068189,-0.007708,
+ 0.728969,0.684547,0,0.068528,0.067758,-0.007708,
+ 0.728957,0.684537,0.005552,0.068528,0.067758,-0.006167,
+ 0.770501,0.637414,0.005552,0.069249,0.066941,-0.006167,
+ 0.728969,0.684547,0,0.068528,0.067758,-0.007708,
+ 0.770501,0.637414,0.005552,0.069249,0.066941,-0.006167,
+ 0.770513,0.637424,0,0.069249,0.066941,-0.007708,
+ 0.770513,0.637424,0,0.069249,0.066941,-0.007708,
+ 0.770501,0.637414,0.005552,0.069249,0.066941,-0.006167,
+ 0.809005,0.587776,0.005552,0.069917,0.06608,-0.006167,
+ 0.770513,0.637424,0,0.069249,0.066941,-0.007708,
+ 0.809005,0.587776,0.005552,0.069917,0.06608,-0.006167,
+ 0.809017,0.587785,0,0.069917,0.06608,-0.007708,
+ 0.809017,0.587785,0,0.069917,0.06608,-0.007708,
+ 0.809005,0.587776,0.005552,0.069917,0.06608,-0.006167,
+ 0.844315,0.535819,0.005552,0.070529,0.065178,-0.006167,
+ 0.809017,0.587785,0,0.069917,0.06608,-0.007708,
+ 0.844315,0.535819,0.005552,0.070529,0.065178,-0.006167,
+ 0.844328,0.535827,0,0.070529,0.065178,-0.007708,
+ 0.844328,0.535827,0,0.070529,0.065178,-0.007708,
+ 0.844315,0.535819,0.005552,0.070529,0.065178,-0.006167,
+ 0.876293,0.481746,0.005552,0.071084,0.064241,-0.006167,
+ 0.844328,0.535827,0,0.070529,0.065178,-0.007708,
+ 0.876293,0.481746,0.005552,0.071084,0.064241,-0.006167,
+ 0.876307,0.481754,0,0.071084,0.064241,-0.007708,
+ 0.844328,0.535827,0,0.070529,0.065178,-0.007708,
+ 0.876307,0.481754,0,0.071084,0.064241,-0.007708,
+ 0.860742,0.509041,0,0.070926,0.064507,-0.007708,
+ 0.844328,0.535827,0,0.070529,0.065178,-0.007708,
+ 0.860742,0.509041,0,0.070926,0.064507,-0.007708,
+ 0.860742,0.509041,0,0.070867,0.064607,-0.007708,
+ 0.876307,0.481754,0,0.071084,0.064241,-0.007708,
+ 0.876293,0.481746,0.005552,0.071084,0.064241,-0.006167,
+ 0.904813,0.425773,0.005552,0.071578,0.06327,-0.006167,
+ 0.876307,0.481754,0,0.071084,0.064241,-0.007708,
+ 0.904813,0.425773,0.005552,0.071578,0.06327,-0.006167,
+ 0.904827,0.425779,0,0.071578,0.06327,-0.007708,
+ 0.904827,0.425779,0,0.071578,0.06327,-0.007708,
+ 0.904813,0.425773,0.005552,0.071578,0.06327,-0.006167,
+ 0.929762,0.368119,0.005552,0.072011,0.06227,-0.006167,
+ 0.904827,0.425779,0,0.071578,0.06327,-0.007708,
+ 0.929762,0.368119,0.005552,0.072011,0.06227,-0.006167,
+ 0.929776,0.368125,0,0.072011,0.06227,-0.007708,
+ 0.929776,0.368125,0,0.072011,0.06227,-0.007708,
+ 0.929762,0.368119,0.005552,0.072011,0.06227,-0.006167,
+ 0.951042,0.309012,0.005552,0.07238,0.061245,-0.006167,
+ 0.929776,0.368125,0,0.072011,0.06227,-0.007708,
+ 0.951042,0.309012,0.005552,0.07238,0.061245,-0.006167,
+ 0.951057,0.309017,0,0.07238,0.061245,-0.007708,
+ 0.951057,0.309017,0,0.07238,0.061245,-0.007708,
+ 0.951042,0.309012,0.005552,0.07238,0.061245,-0.006167,
+ 0.968568,0.248686,0.005552,0.072684,0.060198,-0.006167,
+ 0.951057,0.309017,0,0.07238,0.061245,-0.007708,
+ 0.968568,0.248686,0.005552,0.072684,0.060198,-0.006167,
+ 0.968583,0.24869,0,0.072684,0.060198,-0.007708,
+ 0.951057,0.309017,0,0.07238,0.061245,-0.007708,
+ 0.968583,0.24869,0,0.072684,0.060198,-0.007708,
+ 0.960294,0.278991,0,0.072642,0.060343,-0.007708,
+ 0.951057,0.309017,0,0.07238,0.061245,-0.007708,
+ 0.960294,0.278991,0,0.072642,0.060343,-0.007708,
+ 0.960294,0.278991,0,0.072621,0.060414,-0.007708,
+ 0.968583,0.24869,0,0.072684,0.060198,-0.007708,
+ 0.968568,0.248686,0.005552,0.072684,0.060198,-0.006167,
+ 0.982272,0.187378,0.005552,0.072922,0.059135,-0.006167,
+ 0.968583,0.24869,0,0.072684,0.060198,-0.007708,
+ 0.982272,0.187378,0.005552,0.072922,0.059135,-0.006167,
+ 0.982287,0.187381,0,0.072922,0.059135,-0.007708,
+ 0.982287,0.187381,0,0.072922,0.059135,-0.007708,
+ 0.982272,0.187378,0.005552,0.072922,0.059135,-0.006167,
+ 0.992099,0.125331,0.005552,0.073092,0.058059,-0.006167,
+ 0.982287,0.187381,0,0.072922,0.059135,-0.007708,
+ 0.992099,0.125331,0.005552,0.073092,0.058059,-0.006167,
+ 0.992115,0.125333,0,0.073092,0.058059,-0.007708,
+ 0.992115,0.125333,0,0.073092,0.058059,-0.007708,
+ 0.992099,0.125331,0.005552,0.073092,0.058059,-0.006167,
+ 0.997287,0.07324,0.007402,0.073195,0.056974,-0.006167,
+ 0.992115,0.125333,0,0.073092,0.058059,-0.007708,
+ 0.997287,0.07324,0.007402,0.073195,0.056974,-0.006167,
+ 0.995562,0.094108,0,0.073195,0.056974,-0.007708,
+ 0.995562,-0.094108,0,0.073195,0.054796,-0.007708,
+ 0.997287,-0.07324,0.007402,0.073195,0.054796,-0.006167,
+ 0.992099,-0.125331,0.005552,0.073092,0.053712,-0.006167,
+ 0.995562,-0.094108,0,0.073195,0.054796,-0.007708,
+ 0.992099,-0.125331,0.005552,0.073092,0.053712,-0.006167,
+ 0.992115,-0.125333,0,0.073092,0.053712,-0.007708,
+ 0.992115,-0.125333,0,0.073092,0.053712,-0.007708,
+ 0.992099,-0.125331,0.005552,0.073092,0.053712,-0.006167,
+ 0.982272,-0.187378,0.005552,0.072922,0.052635,-0.006167,
+ 0.992115,-0.125333,0,0.073092,0.053712,-0.007708,
+ 0.982272,-0.187378,0.005552,0.072922,0.052635,-0.006167,
+ 0.982287,-0.187381,0,0.072922,0.052635,-0.007708,
+ 0.982287,-0.187381,0,0.072922,0.052635,-0.007708,
+ 0.982272,-0.187378,0.005552,0.072922,0.052635,-0.006167,
+ 0.968568,-0.248686,0.005552,0.072684,0.051572,-0.006167,
+ 0.982287,-0.187381,0,0.072922,0.052635,-0.007708,
+ 0.968568,-0.248686,0.005552,0.072684,0.051572,-0.006167,
+ 0.968583,-0.24869,0,0.072684,0.051572,-0.007708,
+ 0.968583,-0.24869,0,0.072684,0.051572,-0.007708,
+ 0.968568,-0.248686,0.005552,0.072684,0.051572,-0.006167,
+ 0.951042,-0.309012,0.005552,0.07238,0.050526,-0.006167,
+ 0.968583,-0.24869,0,0.072684,0.051572,-0.007708,
+ 0.951042,-0.309012,0.005552,0.07238,0.050526,-0.006167,
+ 0.951057,-0.309017,0,0.07238,0.050526,-0.007708,
+ 0.968583,-0.24869,0,0.072684,0.051572,-0.007708,
+ 0.951057,-0.309017,0,0.07238,0.050526,-0.007708,
+ 0.960294,-0.278991,0,0.072621,0.051356,-0.007708,
+ 0.968583,-0.24869,0,0.072684,0.051572,-0.007708,
+ 0.960294,-0.278991,0,0.072621,0.051356,-0.007708,
+ 0.960294,-0.278991,0,0.072642,0.051428,-0.007708,
+ 0.951057,-0.309017,0,0.07238,0.050526,-0.007708,
+ 0.951042,-0.309012,0.005552,0.07238,0.050526,-0.006167,
+ 0.929762,-0.368119,0.005552,0.072011,0.049501,-0.006167,
+ 0.951057,-0.309017,0,0.07238,0.050526,-0.007708,
+ 0.929762,-0.368119,0.005552,0.072011,0.049501,-0.006167,
+ 0.929776,-0.368125,0,0.072011,0.049501,-0.007708,
+ 0.929776,-0.368125,0,0.072011,0.049501,-0.007708,
+ 0.929762,-0.368119,0.005552,0.072011,0.049501,-0.006167,
+ 0.904813,-0.425773,0.005552,0.071578,0.048501,-0.006167,
+ 0.929776,-0.368125,0,0.072011,0.049501,-0.007708,
+ 0.904813,-0.425773,0.005552,0.071578,0.048501,-0.006167,
+ 0.904827,-0.425779,0,0.071578,0.048501,-0.007708,
+ 0.904827,-0.425779,0,0.071578,0.048501,-0.007708,
+ 0.904813,-0.425773,0.005552,0.071578,0.048501,-0.006167,
+ 0.876293,-0.481746,0.005552,0.071084,0.04753,-0.006167,
+ 0.904827,-0.425779,0,0.071578,0.048501,-0.007708,
+ 0.876293,-0.481746,0.005552,0.071084,0.04753,-0.006167,
+ 0.876307,-0.481754,0,0.071084,0.04753,-0.007708,
+ 0.876307,-0.481754,0,0.071084,0.04753,-0.007708,
+ 0.876293,-0.481746,0.005552,0.071084,0.04753,-0.006167,
+ 0.844315,-0.535819,0.005552,0.070529,0.046592,-0.006167,
+ 0.876307,-0.481754,0,0.071084,0.04753,-0.007708,
+ 0.844315,-0.535819,0.005552,0.070529,0.046592,-0.006167,
+ 0.844328,-0.535827,0,0.070529,0.046592,-0.007708,
+ 0.876307,-0.481754,0,0.071084,0.04753,-0.007708,
+ 0.844328,-0.535827,0,0.070529,0.046592,-0.007708,
+ 0.860742,-0.509041,0,0.070867,0.047163,-0.007708,
+ 0.876307,-0.481754,0,0.071084,0.04753,-0.007708,
+ 0.860742,-0.509041,0,0.070867,0.047163,-0.007708,
+ 0.860742,-0.509041,0,0.070926,0.047263,-0.007708,
+ 0.844328,-0.535827,0,0.070529,0.046592,-0.007708,
+ 0.844315,-0.535819,0.005552,0.070529,0.046592,-0.006167,
+ 0.809005,-0.587776,0.005552,0.069917,0.045691,-0.006167,
+ 0.844328,-0.535827,0,0.070529,0.046592,-0.007708,
+ 0.809005,-0.587776,0.005552,0.069917,0.045691,-0.006167,
+ 0.809017,-0.587785,0,0.069917,0.045691,-0.007708,
+ 0.809017,-0.587785,0,0.069917,0.045691,-0.007708,
+ 0.809005,-0.587776,0.005552,0.069917,0.045691,-0.006167,
+ 0.770501,-0.637414,0.005552,0.069249,0.04483,-0.006167,
+ 0.809017,-0.587785,0,0.069917,0.045691,-0.007708,
+ 0.770501,-0.637414,0.005552,0.069249,0.04483,-0.006167,
+ 0.770513,-0.637424,0,0.069249,0.04483,-0.007708,
+ 0.770513,-0.637424,0,0.069249,0.04483,-0.007708,
+ 0.770501,-0.637414,0.005552,0.069249,0.04483,-0.006167,
+ 0.728957,-0.684537,0.005552,0.068528,0.044013,-0.006167,
+ 0.770513,-0.637424,0,0.069249,0.04483,-0.007708,
+ 0.728957,-0.684537,0.005552,0.068528,0.044013,-0.006167,
+ 0.728969,-0.684547,0,0.068528,0.044013,-0.007708,
+ 0.728969,-0.684547,0,0.068528,0.044013,-0.007708,
+ 0.728957,-0.684537,0.005552,0.068528,0.044013,-0.006167,
+ 0.684537,-0.728957,0.005552,0.067758,0.043242,-0.006167,
+ 0.728969,-0.684547,0,0.068528,0.044013,-0.007708,
+ 0.684537,-0.728957,0.005552,0.067758,0.043242,-0.006167,
+ 0.684547,-0.728969,0,0.067758,0.043242,-0.007708,
+ 0.728969,-0.684547,0,0.068528,0.044013,-0.007708,
+ 0.684547,-0.728969,0,0.067758,0.043242,-0.007708,
+ 0.707107,-0.707107,0,0.068097,0.043581,-0.007708,
+ 0.728969,-0.684547,0,0.068528,0.044013,-0.007708,
+ 0.707107,-0.707107,0,0.068097,0.043581,-0.007708,
+ 0.707107,-0.707107,0,0.068189,0.043673,-0.007708,
+ 0.684547,-0.728969,0,0.067758,0.043242,-0.007708,
+ 0.684537,-0.728957,0.005552,0.067758,0.043242,-0.006167,
+ 0.637414,-0.770501,0.005552,0.066941,0.042522,-0.006167,
+ 0.684547,-0.728969,0,0.067758,0.043242,-0.007708,
+ 0.637414,-0.770501,0.005552,0.066941,0.042522,-0.006167,
+ 0.637424,-0.770513,0,0.066941,0.042522,-0.007708,
+ 0.637424,-0.770513,0,0.066941,0.042522,-0.007708,
+ 0.637414,-0.770501,0.005552,0.066941,0.042522,-0.006167,
+ 0.587776,-0.809005,0.005552,0.06608,0.041854,-0.006167,
+ 0.637424,-0.770513,0,0.066941,0.042522,-0.007708,
+ 0.587776,-0.809005,0.005552,0.06608,0.041854,-0.006167,
+ 0.587785,-0.809017,0,0.06608,0.041854,-0.007708,
+ 0.587785,-0.809017,0,0.06608,0.041854,-0.007708,
+ 0.587776,-0.809005,0.005552,0.06608,0.041854,-0.006167,
+ 0.535819,-0.844315,0.005552,0.065178,0.041241,-0.006167,
+ 0.587785,-0.809017,0,0.06608,0.041854,-0.007708,
+ 0.535819,-0.844315,0.005552,0.065178,0.041241,-0.006167,
+ 0.535827,-0.844328,0,0.065178,0.041241,-0.007708,
+ 0.535827,-0.844328,0,0.065178,0.041241,-0.007708,
+ 0.535819,-0.844315,0.005552,0.065178,0.041241,-0.006167,
+ 0.481746,-0.876293,0.005552,0.064241,0.040687,-0.006167,
+ 0.535827,-0.844328,0,0.065178,0.041241,-0.007708,
+ 0.481746,-0.876293,0.005552,0.064241,0.040687,-0.006167,
+ 0.481754,-0.876307,0,0.064241,0.040687,-0.007708,
+ 0.535827,-0.844328,0,0.065178,0.041241,-0.007708,
+ 0.481754,-0.876307,0,0.064241,0.040687,-0.007708,
+ 0.509041,-0.860742,0,0.064507,0.040845,-0.007708,
+ 0.535827,-0.844328,0,0.065178,0.041241,-0.007708,
+ 0.509041,-0.860742,0,0.064507,0.040845,-0.007708,
+ 0.509041,-0.860742,0,0.064607,0.040904,-0.007708,
+ 0.481754,-0.876307,0,0.064241,0.040687,-0.007708,
+ 0.481746,-0.876293,0.005552,0.064241,0.040687,-0.006167,
+ 0.425773,-0.904813,0.005552,0.06327,0.040192,-0.006167,
+ 0.481754,-0.876307,0,0.064241,0.040687,-0.007708,
+ 0.425773,-0.904813,0.005552,0.06327,0.040192,-0.006167,
+ 0.425779,-0.904827,0,0.06327,0.040192,-0.007708,
+ 0.425779,-0.904827,0,0.06327,0.040192,-0.007708,
+ 0.425773,-0.904813,0.005552,0.06327,0.040192,-0.006167,
+ 0.368119,-0.929762,0.005552,0.06227,0.03976,-0.006167,
+ 0.425779,-0.904827,0,0.06327,0.040192,-0.007708,
+ 0.368119,-0.929762,0.005552,0.06227,0.03976,-0.006167,
+ 0.368125,-0.929776,0,0.06227,0.03976,-0.007708,
+ 0.368125,-0.929776,0,0.06227,0.03976,-0.007708,
+ 0.368119,-0.929762,0.005552,0.06227,0.03976,-0.006167,
+ 0.309012,-0.951042,0.005552,0.061245,0.03939,-0.006167,
+ 0.368125,-0.929776,0,0.06227,0.03976,-0.007708,
+ 0.309012,-0.951042,0.005552,0.061245,0.03939,-0.006167,
+ 0.309017,-0.951057,0,0.061245,0.03939,-0.007708,
+ 0.309017,-0.951057,0,0.061245,0.03939,-0.007708,
+ 0.309012,-0.951042,0.005552,0.061245,0.03939,-0.006167,
+ 0.248686,-0.968568,0.005552,0.060198,0.039087,-0.006167,
+ 0.309017,-0.951057,0,0.061245,0.03939,-0.007708,
+ 0.248686,-0.968568,0.005552,0.060198,0.039087,-0.006167,
+ 0.24869,-0.968583,0,0.060198,0.039087,-0.007708,
+ 0.309017,-0.951057,0,0.061245,0.03939,-0.007708,
+ 0.24869,-0.968583,0,0.060198,0.039087,-0.007708,
+ 0.278991,-0.960294,0,0.060343,0.039128,-0.007708,
+ 0.309017,-0.951057,0,0.061245,0.03939,-0.007708,
+ 0.278991,-0.960294,0,0.060343,0.039128,-0.007708,
+ 0.278991,-0.960294,0,0.060414,0.039149,-0.007708,
+ 0.24869,-0.968583,0,0.060198,0.039087,-0.007708,
+ 0.248686,-0.968568,0.005552,0.060198,0.039087,-0.006167,
+ 0.187378,-0.982272,0.005552,0.059135,0.038849,-0.006167,
+ 0.24869,-0.968583,0,0.060198,0.039087,-0.007708,
+ 0.187378,-0.982272,0.005552,0.059135,0.038849,-0.006167,
+ 0.187381,-0.982287,0,0.059135,0.038849,-0.007708,
+ 0.187381,-0.982287,0,0.059135,0.038849,-0.007708,
+ 0.187378,-0.982272,0.005552,0.059135,0.038849,-0.006167,
+ 0.125331,-0.992099,0.005552,0.058059,0.038678,-0.006167,
+ 0.187381,-0.982287,0,0.059135,0.038849,-0.007708,
+ 0.125331,-0.992099,0.005552,0.058059,0.038678,-0.006167,
+ 0.125333,-0.992115,0,0.058059,0.038678,-0.007708,
+ 0.125333,-0.992115,0,0.058059,0.038678,-0.007708,
+ 0.125331,-0.992099,0.005552,0.058059,0.038678,-0.006167,
+ 0.07324,-0.997287,0.007402,0.056974,0.038576,-0.006167,
+ 0.125333,-0.992115,0,0.058059,0.038678,-0.007708,
+ 0.07324,-0.997287,0.007402,0.056974,0.038576,-0.006167,
+ 0.094108,-0.995562,0,0.056974,0.038576,-0.007708
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,9588,data,NULL};
+const struct gllist *companion_disc=&frame;
diff --git a/hacks/glx/companion_heart.c b/hacks/glx/companion_heart.c
new file mode 100644
index 0000000..1786a62
--- /dev/null
+++ b/hacks/glx/companion_heart.c
@@ -0,0 +1,653 @@
+#include "gllist.h"
+static const float data[]={
+ -0.126112,-0.516835,0.846745,0.062716,0.065295,-0.005781,
+ -0.233173,-0.466563,0.853199,0.063951,0.064804,-0.005781,
+ -0.169323,-0.502195,0.848015,0.063583,0.066646,-0.004818,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.055116,0.063504,-0.005781,
+ 0,0,1,0.054127,0.064391,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.054127,0.064391,-0.005781,
+ 0,0,1,0.052967,0.065039,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.052967,0.065039,-0.005781,
+ 0,0,1,0.051693,0.065415,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.051693,0.065415,-0.005781,
+ 0,0,1,0.050367,0.065502,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.050367,0.065502,-0.005781,
+ 0,0,1,0.049054,0.065295,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.049054,0.065295,-0.005781,
+ 0,0,1,0.04782,0.064804,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.04782,0.064804,-0.005781,
+ 0,0,1,0.046724,0.064053,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.046724,0.064053,-0.005781,
+ 0,0,1,0.04582,0.063079,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.04582,0.063079,-0.005781,
+ 0,0,1,0.045152,0.06193,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.045152,0.06193,-0.005781,
+ 0,0,1,0.044754,0.060662,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.044754,0.060662,-0.005781,
+ 0,0,1,0.044645,0.059338,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.044645,0.059338,-0.005781,
+ 0,0,1,0.044702,0.058527,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.044702,0.058527,-0.005781,
+ 0,0,1,0.044827,0.057723,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.044827,0.057723,-0.005781,
+ 0,0,1,0.045017,0.056932,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.045017,0.056932,-0.005781,
+ 0,0,1,0.045272,0.05616,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.045272,0.05616,-0.005781,
+ 0,0,1,0.04559,0.055411,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.04559,0.055411,-0.005781,
+ 0,0,1,0.04597,0.054691,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.04597,0.054691,-0.005781,
+ 0,0,1,0.046407,0.054006,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.046407,0.054006,-0.005781,
+ 0,0,1,0.0469,0.053359,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.0469,0.053359,-0.005781,
+ 0,0,1,0.047445,0.052755,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.047445,0.052755,-0.005781,
+ 0,0,1,0.048038,0.052198,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.048038,0.052198,-0.005781,
+ 0,0,1,0.048675,0.051693,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.048675,0.051693,-0.005781,
+ 0,0,1,0.049352,0.051241,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.049352,0.051241,-0.005781,
+ 0,0,1,0.050001,0.050829,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.050001,0.050829,-0.005781,
+ 0,0,1,0.050634,0.050393,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.050634,0.050393,-0.005781,
+ 0,0,1,0.05125,0.049933,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.05125,0.049933,-0.005781,
+ 0,0,1,0.051848,0.049449,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.051848,0.049449,-0.005781,
+ 0,0,1,0.052427,0.048943,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.052427,0.048943,-0.005781,
+ 0,0,1,0.052987,0.048416,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.052987,0.048416,-0.005781,
+ 0,0,1,0.053525,0.047867,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.053525,0.047867,-0.005781,
+ 0,0,1,0.054043,0.047299,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.054043,0.047299,-0.005781,
+ 0,0,1,0.054538,0.046711,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.054538,0.046711,-0.005781,
+ 0,0,1,0.055011,0.046104,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.055011,0.046104,-0.005781,
+ 0,0,1,0.05546,0.04548,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.05546,0.04548,-0.005781,
+ 0,0,1,0.055885,0.044839,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.055885,0.044839,-0.005781,
+ 0,0,1,0.05631,0.04548,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.05631,0.04548,-0.005781,
+ 0,0,1,0.05676,0.046104,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.05676,0.046104,-0.005781,
+ 0,0,1,0.057232,0.046711,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.057232,0.046711,-0.005781,
+ 0,0,1,0.057728,0.047299,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.057728,0.047299,-0.005781,
+ 0,0,1,0.058245,0.047867,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.058245,0.047867,-0.005781,
+ 0,0,1,0.058784,0.048416,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.058784,0.048416,-0.005781,
+ 0,0,1,0.059343,0.048943,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.059343,0.048943,-0.005781,
+ 0,0,1,0.059922,0.049449,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.059922,0.049449,-0.005781,
+ 0,0,1,0.06052,0.049933,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.06052,0.049933,-0.005781,
+ 0,0,1,0.061136,0.050393,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.061136,0.050393,-0.005781,
+ 0,0,1,0.061769,0.050829,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.061769,0.050829,-0.005781,
+ 0,0,1,0.062418,0.051241,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.062418,0.051241,-0.005781,
+ 0,0,1,0.063095,0.051693,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.063095,0.051693,-0.005781,
+ 0,0,1,0.063732,0.052198,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.063732,0.052198,-0.005781,
+ 0,0,1,0.064326,0.052755,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.064326,0.052755,-0.005781,
+ 0,0,1,0.06487,0.053359,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.06487,0.053359,-0.005781,
+ 0,0,1,0.065363,0.054006,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.065363,0.054006,-0.005781,
+ 0,0,1,0.065801,0.054691,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.065801,0.054691,-0.005781,
+ 0,0,1,0.06618,0.055411,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.06618,0.055411,-0.005781,
+ 0,0,1,0.066498,0.05616,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.066498,0.05616,-0.005781,
+ 0,0,1,0.066754,0.056932,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.066754,0.056932,-0.005781,
+ 0,0,1,0.066944,0.057723,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.066944,0.057723,-0.005781,
+ 0,0,1,0.067068,0.058527,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.067068,0.058527,-0.005781,
+ 0,0,1,0.067125,0.059338,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.067125,0.059338,-0.005781,
+ 0,0,1,0.067016,0.060662,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.067016,0.060662,-0.005781,
+ 0,0,1,0.066618,0.06193,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.066618,0.06193,-0.005781,
+ 0,0,1,0.065951,0.063079,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.065951,0.063079,-0.005781,
+ 0,0,1,0.065047,0.064053,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.065047,0.064053,-0.005781,
+ 0,0,1,0.063951,0.064804,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.063951,0.064804,-0.005781,
+ 0,0,1,0.062716,0.065295,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.062716,0.065295,-0.005781,
+ 0,0,1,0.061404,0.065502,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.061404,0.065502,-0.005781,
+ 0,0,1,0.060078,0.065415,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.060078,0.065415,-0.005781,
+ 0,0,1,0.058804,0.065039,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.058804,0.065039,-0.005781,
+ 0,0,1,0.057644,0.064391,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.057644,0.064391,-0.005781,
+ 0,0,1,0.056655,0.063504,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.056655,0.063504,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.055885,0.06242,-0.005781,
+ 0,0,1,0.055116,0.063504,-0.005781,
+ 0.600355,0.41774,0.681958,0.05546,0.04548,-0.005781,
+ 0.611328,0.411243,0.676134,0.055414,0.04397,-0.004818,
+ 0.619748,0.407106,0.670953,0.055885,0.044839,-0.005781,
+ 0.611328,0.411243,0.676134,0.055414,0.04397,-0.004818,
+ 0.600355,0.41774,0.681958,0.05546,0.04548,-0.005781,
+ 0.583861,0.425853,0.691199,0.054915,0.044676,-0.004818,
+ 0.573435,0.432324,0.695894,0.055011,0.046104,-0.005781,
+ 0.583861,0.425853,0.691199,0.054915,0.044676,-0.004818,
+ 0.600355,0.41774,0.681958,0.05546,0.04548,-0.005781,
+ 0.583861,0.425853,0.691199,0.054915,0.044676,-0.004818,
+ 0.573435,0.432324,0.695894,0.055011,0.046104,-0.005781,
+ 0.557839,0.440321,0.703515,0.05439,0.045363,-0.004818,
+ 0.547914,0.446817,0.707209,0.054538,0.046711,-0.005781,
+ 0.557839,0.440321,0.703515,0.05439,0.045363,-0.004818,
+ 0.573435,0.432324,0.695894,0.055011,0.046104,-0.005781,
+ 0.557839,0.440321,0.703515,0.05439,0.045363,-0.004818,
+ 0.547914,0.446817,0.707209,0.054538,0.046711,-0.005781,
+ 0.528358,0.458036,0.714871,0.05384,0.046029,-0.004818,
+ 0.525024,0.459644,0.716294,0.054043,0.047299,-0.005781,
+ 0.528358,0.458036,0.714871,0.05384,0.046029,-0.004818,
+ 0.547914,0.446817,0.707209,0.054538,0.046711,-0.005781,
+ 0.525024,0.459644,0.716294,0.054043,0.047299,-0.005781,
+ 0.507344,0.470385,0.722039,0.053525,0.047867,-0.005781,
+ 0.528358,0.458036,0.714871,0.05384,0.046029,-0.004818,
+ 0.502587,0.474851,0.722443,0.053266,0.046673,-0.004818,
+ 0.528358,0.458036,0.714871,0.05384,0.046029,-0.004818,
+ 0.507344,0.470385,0.722039,0.053525,0.047867,-0.005781,
+ 0.507344,0.470385,0.722039,0.053525,0.047867,-0.005781,
+ 0.484849,0.48521,0.727662,0.052987,0.048416,-0.005781,
+ 0.502587,0.474851,0.722443,0.053266,0.046673,-0.004818,
+ 0.480277,0.489774,0.727637,0.052668,0.047293,-0.004818,
+ 0.502587,0.474851,0.722443,0.053266,0.046673,-0.004818,
+ 0.484849,0.48521,0.727662,0.052987,0.048416,-0.005781,
+ 0.484849,0.48521,0.727662,0.052987,0.048416,-0.005781,
+ 0.463202,0.500363,0.731492,0.052427,0.048943,-0.005781,
+ 0.480277,0.489774,0.727637,0.052668,0.047293,-0.004818,
+ 0.458764,0.50505,0.731068,0.052047,0.047891,-0.004818,
+ 0.480277,0.489774,0.727637,0.052668,0.047293,-0.004818,
+ 0.463202,0.500363,0.731492,0.052427,0.048943,-0.005781,
+ 0.463202,0.500363,0.731492,0.052427,0.048943,-0.005781,
+ 0.442255,0.515933,0.733637,0.051848,0.049449,-0.005781,
+ 0.458764,0.50505,0.731068,0.052047,0.047891,-0.004818,
+ 0.437903,0.520767,0.732832,0.051404,0.048464,-0.004818,
+ 0.458764,0.50505,0.731068,0.052047,0.047891,-0.004818,
+ 0.442255,0.515933,0.733637,0.051848,0.049449,-0.005781,
+ 0.442255,0.515933,0.733637,0.051848,0.049449,-0.005781,
+ 0.419718,0.534563,0.733539,0.05125,0.049933,-0.005781,
+ 0.437903,0.520767,0.732832,0.051404,0.048464,-0.004818,
+ 0.42249,0.532759,0.73326,0.050741,0.049011,-0.004818,
+ 0.437903,0.520767,0.732832,0.051404,0.048464,-0.004818,
+ 0.419718,0.534563,0.733539,0.05125,0.049933,-0.005781,
+ 0.42249,0.532759,0.73326,0.050741,0.049011,-0.004818,
+ 0.419718,0.534563,0.733539,0.05125,0.049933,-0.005781,
+ 0.403677,0.547538,0.732971,0.050057,0.049532,-0.004818,
+ 0.395847,0.555175,0.731496,0.050634,0.050393,-0.005781,
+ 0.403677,0.547538,0.732971,0.050057,0.049532,-0.004818,
+ 0.419718,0.534563,0.733539,0.05125,0.049933,-0.005781,
+ 0.403677,0.547538,0.732971,0.050057,0.049532,-0.004818,
+ 0.395847,0.555175,0.731496,0.050634,0.050393,-0.005781,
+ 0.38391,0.564835,0.730462,0.049354,0.050026,-0.004818,
+ 0.376177,0.572732,0.728333,0.050001,0.050829,-0.005781,
+ 0.38391,0.564835,0.730462,0.049354,0.050026,-0.004818,
+ 0.395847,0.555175,0.731496,0.050634,0.050393,-0.005781,
+ 0.38391,0.564835,0.730462,0.049354,0.050026,-0.004818,
+ 0.376177,0.572732,0.728333,0.050001,0.050829,-0.005781,
+ 0.375296,0.574093,0.727715,0.048634,0.050493,-0.004818,
+ 0.378691,0.573667,0.726291,0.049352,0.051241,-0.005781,
+ 0.375296,0.574093,0.727715,0.048634,0.050493,-0.004818,
+ 0.376177,0.572732,0.728333,0.050001,0.050829,-0.005781,
+ 0.375296,0.574093,0.727715,0.048634,0.050493,-0.004818,
+ 0.378691,0.573667,0.726291,0.049352,0.051241,-0.005781,
+ 0.405711,0.551851,0.728601,0.047882,0.051003,-0.004818,
+ 0.403275,0.554082,0.72826,0.048675,0.051693,-0.005781,
+ 0.405711,0.551851,0.728601,0.047882,0.051003,-0.004818,
+ 0.378691,0.573667,0.726291,0.049352,0.051241,-0.005781,
+ 0.403275,0.554082,0.72826,0.048675,0.051693,-0.005781,
+ 0.439698,0.520339,0.732061,0.048038,0.052198,-0.005781,
+ 0.405711,0.551851,0.728601,0.047882,0.051003,-0.004818,
+ 0.455156,0.505988,0.732672,0.047175,0.051576,-0.004818,
+ 0.405711,0.551851,0.728601,0.047882,0.051003,-0.004818,
+ 0.439698,0.520339,0.732061,0.048038,0.052198,-0.005781,
+ 0.439698,0.520339,0.732061,0.048038,0.052198,-0.005781,
+ 0.478388,0.479119,0.735928,0.047445,0.052755,-0.005781,
+ 0.455156,0.505988,0.732672,0.047175,0.051576,-0.004818,
+ 0.492434,0.463571,0.736621,0.046517,0.052206,-0.004818,
+ 0.455156,0.505988,0.732672,0.047175,0.051576,-0.004818,
+ 0.478388,0.479119,0.735928,0.047445,0.052755,-0.005781,
+ 0.478388,0.479119,0.735928,0.047445,0.052755,-0.005781,
+ 0.513034,0.434953,0.740008,0.0469,0.053359,-0.005781,
+ 0.492434,0.463571,0.736621,0.046517,0.052206,-0.004818,
+ 0.525496,0.418365,0.740827,0.045912,0.05289,-0.004818,
+ 0.492434,0.463571,0.736621,0.046517,0.052206,-0.004818,
+ 0.513034,0.434953,0.740008,0.0469,0.053359,-0.005781,
+ 0.513034,0.434953,0.740008,0.0469,0.053359,-0.005781,
+ 0.543337,0.388194,0.744372,0.046407,0.054006,-0.005781,
+ 0.525496,0.418365,0.740827,0.045912,0.05289,-0.004818,
+ 0.554068,0.370754,0.745352,0.045365,0.053623,-0.004818,
+ 0.525496,0.418365,0.740827,0.045912,0.05289,-0.004818,
+ 0.543337,0.388194,0.744372,0.046407,0.054006,-0.005781,
+ 0.543337,0.388194,0.744372,0.046407,0.054006,-0.005781,
+ 0.569031,0.339242,0.749078,0.04597,0.054691,-0.005781,
+ 0.554068,0.370754,0.745352,0.045365,0.053623,-0.004818,
+ 0.577912,0.321162,0.750248,0.044879,0.054399,-0.004818,
+ 0.554068,0.370754,0.745352,0.045365,0.053623,-0.004818,
+ 0.569031,0.339242,0.749078,0.04597,0.054691,-0.005781,
+ 0.569031,0.339242,0.749078,0.04597,0.054691,-0.005781,
+ 0.589896,0.288542,0.754166,0.04559,0.055411,-0.005781,
+ 0.577912,0.321162,0.750248,0.044879,0.054399,-0.004818,
+ 0.596848,0.270049,0.755544,0.044458,0.055214,-0.004818,
+ 0.577912,0.321162,0.750248,0.044879,0.054399,-0.004818,
+ 0.589896,0.288542,0.754166,0.04559,0.055411,-0.005781,
+ 0.589896,0.288542,0.754166,0.04559,0.055411,-0.005781,
+ 0.60577,0.236571,0.759656,0.045272,0.05616,-0.005781,
+ 0.596848,0.270049,0.755544,0.044458,0.055214,-0.004818,
+ 0.610753,0.217903,0.761249,0.044105,0.056061,-0.004818,
+ 0.596848,0.270049,0.755544,0.044458,0.055214,-0.004818,
+ 0.60577,0.236571,0.759656,0.045272,0.05616,-0.005781,
+ 0.60577,0.236571,0.759656,0.045272,0.05616,-0.005781,
+ 0.616557,0.183837,0.765546,0.045017,0.056932,-0.005781,
+ 0.610753,0.217903,0.761249,0.044105,0.056061,-0.004818,
+ 0.619574,0.165232,0.767351,0.043821,0.056936,-0.004818,
+ 0.610753,0.217903,0.761249,0.044105,0.056061,-0.004818,
+ 0.616557,0.183837,0.765546,0.045017,0.056932,-0.005781,
+ 0.616557,0.183837,0.765546,0.045017,0.056932,-0.005781,
+ 0.622238,0.13086,0.771813,0.044827,0.057723,-0.005781,
+ 0.619574,0.165232,0.767351,0.043821,0.056936,-0.004818,
+ 0.623333,0.112547,0.773815,0.04361,0.057831,-0.004818,
+ 0.619574,0.165232,0.767351,0.043821,0.056936,-0.004818,
+ 0.622238,0.13086,0.771813,0.044827,0.057723,-0.005781,
+ 0.622238,0.13086,0.771813,0.044827,0.057723,-0.005781,
+ 0.622921,0.078006,0.778386,0.044702,0.058527,-0.005781,
+ 0.623333,0.112547,0.773815,0.04361,0.057831,-0.004818,
+ 0.622674,0.06887,0.779444,0.043472,0.058741,-0.004818,
+ 0.623333,0.112547,0.773815,0.04361,0.057831,-0.004818,
+ 0.622921,0.078006,0.778386,0.044702,0.058527,-0.005781,
+ 0.615482,0.005518,0.788132,0.043409,0.05966,-0.004818,
+ 0.622674,0.06887,0.779444,0.043472,0.058741,-0.004818,
+ 0.622921,0.078006,0.778386,0.044702,0.058527,-0.005781,
+ 0.615482,0.005518,0.788132,0.043409,0.05966,-0.004818,
+ 0.622921,0.078006,0.778386,0.044702,0.058527,-0.005781,
+ 0.608032,-0.012608,0.793813,0.044645,0.059338,-0.005781,
+ 0.615482,0.005518,0.788132,0.043409,0.05966,-0.004818,
+ 0.608032,-0.012608,0.793813,0.044645,0.059338,-0.005781,
+ 0.587334,-0.078712,0.805508,0.043489,0.061186,-0.004818,
+ 0.563271,-0.124273,0.816873,0.044754,0.060662,-0.005781,
+ 0.587334,-0.078712,0.805508,0.043489,0.061186,-0.004818,
+ 0.608032,-0.012608,0.793813,0.044645,0.059338,-0.005781,
+ 0.587334,-0.078712,0.805508,0.043489,0.061186,-0.004818,
+ 0.563271,-0.124273,0.816873,0.044754,0.060662,-0.005781,
+ 0.528554,-0.194938,0.826214,0.043898,0.062655,-0.004818,
+ 0.498136,-0.2337,0.835012,0.045152,0.06193,-0.005781,
+ 0.528554,-0.194938,0.826214,0.043898,0.062655,-0.004818,
+ 0.563271,-0.124273,0.816873,0.044754,0.060662,-0.005781,
+ 0.528554,-0.194938,0.826214,0.043898,0.062655,-0.004818,
+ 0.498136,-0.2337,0.835012,0.045152,0.06193,-0.005781,
+ 0.454671,-0.294294,0.840634,0.044613,0.063997,-0.004818,
+ 0.419714,-0.3263,0.846976,0.04582,0.063079,-0.005781,
+ 0.454671,-0.294294,0.840634,0.044613,0.063997,-0.004818,
+ 0.498136,-0.2337,0.835012,0.045152,0.06193,-0.005781,
+ 0.454671,-0.294294,0.840634,0.044613,0.063997,-0.004818,
+ 0.419714,-0.3263,0.846976,0.04582,0.063079,-0.005781,
+ 0.369159,-0.377727,0.849143,0.0456,0.065145,-0.004818,
+ 0.33096,-0.403408,0.853069,0.046724,0.064053,-0.005781,
+ 0.369159,-0.377727,0.849143,0.0456,0.065145,-0.004818,
+ 0.419714,-0.3263,0.846976,0.04582,0.063079,-0.005781,
+ 0.369159,-0.377727,0.849143,0.0456,0.065145,-0.004818,
+ 0.33096,-0.403408,0.853069,0.046724,0.064053,-0.005781,
+ 0.273921,-0.44663,0.851756,0.046812,0.066043,-0.004818,
+ 0.233173,-0.466563,0.853199,0.04782,0.064804,-0.005781,
+ 0.273921,-0.44663,0.851756,0.046812,0.066043,-0.004818,
+ 0.33096,-0.403408,0.853069,0.046724,0.064053,-0.005781,
+ 0.273921,-0.44663,0.851756,0.046812,0.066043,-0.004818,
+ 0.233173,-0.466563,0.853199,0.04782,0.064804,-0.005781,
+ 0.169323,-0.502195,0.848015,0.048188,0.066646,-0.004818,
+ 0.126112,-0.516835,0.846745,0.049054,0.065295,-0.005781,
+ 0.169323,-0.502195,0.848015,0.048188,0.066646,-0.004818,
+ 0.233173,-0.466563,0.853199,0.04782,0.064804,-0.005781,
+ 0.169323,-0.502195,0.848015,0.048188,0.066646,-0.004818,
+ 0.126112,-0.516835,0.846745,0.049054,0.065295,-0.005781,
+ 0.054393,-0.544766,0.836822,0.04966,0.066926,-0.004818,
+ 0.00829,-0.554159,0.832369,0.050367,0.065502,-0.005781,
+ 0.054393,-0.544766,0.836822,0.04966,0.066926,-0.004818,
+ 0.126112,-0.516835,0.846745,0.049054,0.065295,-0.005781,
+ 0.054393,-0.544766,0.836822,0.04966,0.066926,-0.004818,
+ 0.00829,-0.554159,0.832369,0.050367,0.065502,-0.005781,
+ -0.072758,-0.573144,0.816219,0.051157,0.066867,-0.004818,
+ -0.12248,-0.576612,0.807785,0.051693,0.065415,-0.005781,
+ -0.072758,-0.573144,0.816219,0.051157,0.066867,-0.004818,
+ 0.00829,-0.554159,0.832369,0.050367,0.065502,-0.005781,
+ -0.072758,-0.573144,0.816219,0.051157,0.066867,-0.004818,
+ -0.12248,-0.576612,0.807785,0.051693,0.065415,-0.005781,
+ -0.241161,-0.582165,0.776482,0.052605,0.066474,-0.004818,
+ -0.248853,-0.582215,0.774014,0.052967,0.065039,-0.005781,
+ -0.241161,-0.582165,0.776482,0.052605,0.066474,-0.004818,
+ -0.12248,-0.576612,0.807785,0.051693,0.065415,-0.005781,
+ -0.248853,-0.582215,0.774014,0.052967,0.065039,-0.005781,
+ -0.375277,-0.56983,0.731068,0.054127,0.064391,-0.005781,
+ -0.241161,-0.582165,0.776482,0.052605,0.066474,-0.004818,
+ -0.434459,-0.558606,0.706544,0.053934,0.065766,-0.004818,
+ -0.241161,-0.582165,0.776482,0.052605,0.066474,-0.004818,
+ -0.375277,-0.56983,0.731068,0.054127,0.064391,-0.005781,
+ -0.375277,-0.56983,0.731068,0.054127,0.064391,-0.005781,
+ -0.563066,-0.515371,0.646025,0.055116,0.063504,-0.005781,
+ -0.434459,-0.558606,0.706544,0.053934,0.065766,-0.004818,
+ -0.558162,-0.527957,0.640091,0.055031,0.064761,-0.004818,
+ -0.434459,-0.558606,0.706544,0.053934,0.065766,-0.004818,
+ -0.563066,-0.515371,0.646025,0.055116,0.063504,-0.005781,
+ -0.558162,-0.527957,0.640091,0.055031,0.064761,-0.004818,
+ -0.563066,-0.515371,0.646025,0.055116,0.063504,-0.005781,
+ -0.627283,-0.480953,0.612536,0.055885,0.063727,-0.004818,
+ -0.641198,-0.455323,0.617694,0.055885,0.06242,-0.005781,
+ -0.627283,-0.480953,0.612536,0.055885,0.063727,-0.004818,
+ -0.563066,-0.515371,0.646025,0.055116,0.063504,-0.005781,
+ 0.641198,-0.455323,0.617694,0.055885,0.06242,-0.005781,
+ 0.584317,-0.505368,0.634963,0.056655,0.063504,-0.005781,
+ 0.627283,-0.480953,0.612536,0.055885,0.063727,-0.004818,
+ 0.53575,-0.534369,0.653775,0.056739,0.064761,-0.004818,
+ 0.627283,-0.480953,0.612536,0.055885,0.063727,-0.004818,
+ 0.584317,-0.505368,0.634963,0.056655,0.063504,-0.005781,
+ 0.584317,-0.505368,0.634963,0.056655,0.063504,-0.005781,
+ 0.438876,-0.557947,0.704332,0.057644,0.064391,-0.005781,
+ 0.53575,-0.534369,0.653775,0.056739,0.064761,-0.004818,
+ 0.377865,-0.569077,0.730322,0.057837,0.065766,-0.004818,
+ 0.53575,-0.534369,0.653775,0.056739,0.064761,-0.004818,
+ 0.438876,-0.557947,0.704332,0.057644,0.064391,-0.005781,
+ 0.438876,-0.557947,0.704332,0.057644,0.064391,-0.005781,
+ 0.267975,-0.579599,0.769581,0.058804,0.065039,-0.005781,
+ 0.377865,-0.569077,0.730322,0.057837,0.065766,-0.004818,
+ 0.214084,-0.583805,0.78316,0.059165,0.066474,-0.004818,
+ 0.377865,-0.569077,0.730322,0.057837,0.065766,-0.004818,
+ 0.267975,-0.579599,0.769581,0.058804,0.065039,-0.005781,
+ 0.267975,-0.579599,0.769581,0.058804,0.065039,-0.005781,
+ 0.12248,-0.576612,0.807785,0.060078,0.065415,-0.005781,
+ 0.214084,-0.583805,0.78316,0.059165,0.066474,-0.004818,
+ 0.072758,-0.573144,0.816219,0.060613,0.066867,-0.004818,
+ 0.214084,-0.583805,0.78316,0.059165,0.066474,-0.004818,
+ 0.12248,-0.576612,0.807785,0.060078,0.065415,-0.005781,
+ 0.12248,-0.576612,0.807785,0.060078,0.065415,-0.005781,
+ -0.00829,-0.554159,0.832369,0.061404,0.065502,-0.005781,
+ 0.072758,-0.573144,0.816219,0.060613,0.066867,-0.004818,
+ -0.054393,-0.544766,0.836822,0.06211,0.066926,-0.004818,
+ 0.072758,-0.573144,0.816219,0.060613,0.066867,-0.004818,
+ -0.00829,-0.554159,0.832369,0.061404,0.065502,-0.005781,
+ -0.00829,-0.554159,0.832369,0.061404,0.065502,-0.005781,
+ -0.126112,-0.516835,0.846745,0.062716,0.065295,-0.005781,
+ -0.054393,-0.544766,0.836822,0.06211,0.066926,-0.004818,
+ -0.169323,-0.502195,0.848015,0.063583,0.066646,-0.004818,
+ -0.054393,-0.544766,0.836822,0.06211,0.066926,-0.004818,
+ -0.126112,-0.516835,0.846745,0.062716,0.065295,-0.005781,
+ 0.622274,0.404734,0.670049,0.055885,0.043244,-0.004818,
+ 0.619748,0.407106,0.670953,0.055885,0.044839,-0.005781,
+ 0.611328,0.411243,0.676134,0.055414,0.04397,-0.004818,
+ -0.622274,0.404734,0.670049,0.055885,0.043244,-0.004818,
+ -0.611328,0.411243,0.676134,0.056357,0.04397,-0.004818,
+ -0.619748,0.407106,0.670953,0.055885,0.044839,-0.005781,
+ -0.600355,0.41774,0.681958,0.05631,0.04548,-0.005781,
+ -0.619748,0.407106,0.670953,0.055885,0.044839,-0.005781,
+ -0.611328,0.411243,0.676134,0.056357,0.04397,-0.004818,
+ -0.611328,0.411243,0.676134,0.056357,0.04397,-0.004818,
+ -0.583861,0.425853,0.691199,0.056856,0.044676,-0.004818,
+ -0.600355,0.41774,0.681958,0.05631,0.04548,-0.005781,
+ -0.573435,0.432324,0.695894,0.05676,0.046104,-0.005781,
+ -0.600355,0.41774,0.681958,0.05631,0.04548,-0.005781,
+ -0.583861,0.425853,0.691199,0.056856,0.044676,-0.004818,
+ -0.583861,0.425853,0.691199,0.056856,0.044676,-0.004818,
+ -0.557839,0.440321,0.703515,0.05738,0.045363,-0.004818,
+ -0.573435,0.432324,0.695894,0.05676,0.046104,-0.005781,
+ -0.547914,0.446817,0.707209,0.057232,0.046711,-0.005781,
+ -0.573435,0.432324,0.695894,0.05676,0.046104,-0.005781,
+ -0.557839,0.440321,0.703515,0.05738,0.045363,-0.004818,
+ -0.557839,0.440321,0.703515,0.05738,0.045363,-0.004818,
+ -0.528358,0.458036,0.714871,0.05793,0.046029,-0.004818,
+ -0.547914,0.446817,0.707209,0.057232,0.046711,-0.005781,
+ -0.525024,0.459644,0.716294,0.057728,0.047299,-0.005781,
+ -0.547914,0.446817,0.707209,0.057232,0.046711,-0.005781,
+ -0.528358,0.458036,0.714871,0.05793,0.046029,-0.004818,
+ -0.525024,0.459644,0.716294,0.057728,0.047299,-0.005781,
+ -0.528358,0.458036,0.714871,0.05793,0.046029,-0.004818,
+ -0.507344,0.470385,0.722039,0.058245,0.047867,-0.005781,
+ -0.502587,0.474851,0.722443,0.058505,0.046673,-0.004818,
+ -0.507344,0.470385,0.722039,0.058245,0.047867,-0.005781,
+ -0.528358,0.458036,0.714871,0.05793,0.046029,-0.004818,
+ -0.507344,0.470385,0.722039,0.058245,0.047867,-0.005781,
+ -0.502587,0.474851,0.722443,0.058505,0.046673,-0.004818,
+ -0.484849,0.48521,0.727662,0.058784,0.048416,-0.005781,
+ -0.480277,0.489774,0.727637,0.059103,0.047293,-0.004818,
+ -0.484849,0.48521,0.727662,0.058784,0.048416,-0.005781,
+ -0.502587,0.474851,0.722443,0.058505,0.046673,-0.004818,
+ -0.484849,0.48521,0.727662,0.058784,0.048416,-0.005781,
+ -0.480277,0.489774,0.727637,0.059103,0.047293,-0.004818,
+ -0.463202,0.500363,0.731492,0.059343,0.048943,-0.005781,
+ -0.458764,0.50505,0.731068,0.059724,0.047891,-0.004818,
+ -0.463202,0.500363,0.731492,0.059343,0.048943,-0.005781,
+ -0.480277,0.489774,0.727637,0.059103,0.047293,-0.004818,
+ -0.463202,0.500363,0.731492,0.059343,0.048943,-0.005781,
+ -0.458764,0.50505,0.731068,0.059724,0.047891,-0.004818,
+ -0.442255,0.515933,0.733637,0.059922,0.049449,-0.005781,
+ -0.437903,0.520767,0.732832,0.060366,0.048464,-0.004818,
+ -0.442255,0.515933,0.733637,0.059922,0.049449,-0.005781,
+ -0.458764,0.50505,0.731068,0.059724,0.047891,-0.004818,
+ -0.442255,0.515933,0.733637,0.059922,0.049449,-0.005781,
+ -0.437903,0.520767,0.732832,0.060366,0.048464,-0.004818,
+ -0.421867,0.532005,0.734165,0.06052,0.049933,-0.005781,
+ -0.417553,0.537009,0.732987,0.06103,0.049011,-0.004818,
+ -0.421867,0.532005,0.734165,0.06052,0.049933,-0.005781,
+ -0.437903,0.520767,0.732832,0.060366,0.048464,-0.004818,
+ -0.421867,0.532005,0.734165,0.06052,0.049933,-0.005781,
+ -0.417553,0.537009,0.732987,0.06103,0.049011,-0.004818,
+ -0.401898,0.548661,0.73311,0.061136,0.050393,-0.005781,
+ -0.397577,0.553859,0.731555,0.061714,0.049532,-0.004818,
+ -0.401898,0.548661,0.73311,0.061136,0.050393,-0.005781,
+ -0.417553,0.537009,0.732987,0.06103,0.049011,-0.004818,
+ -0.401898,0.548661,0.73311,0.061136,0.050393,-0.005781,
+ -0.397577,0.553859,0.731555,0.061714,0.049532,-0.004818,
+ -0.382209,0.565977,0.730469,0.061769,0.050829,-0.005781,
+ -0.377837,0.571394,0.728525,0.062416,0.050026,-0.004818,
+ -0.382209,0.565977,0.730469,0.061769,0.050829,-0.005781,
+ -0.397577,0.553859,0.731555,0.061714,0.049532,-0.004818,
+ -0.382209,0.565977,0.730469,0.061769,0.050829,-0.005781,
+ -0.377837,0.571394,0.728525,0.062416,0.050026,-0.004818,
+ -0.37698,0.573856,0.727032,0.062418,0.051241,-0.005781,
+ -0.379372,0.571846,0.727371,0.063137,0.050493,-0.004818,
+ -0.37698,0.573856,0.727032,0.062418,0.051241,-0.005781,
+ -0.377837,0.571394,0.728525,0.062416,0.050026,-0.004818,
+ -0.379372,0.571846,0.727371,0.063137,0.050493,-0.004818,
+ -0.405711,0.551851,0.728601,0.063888,0.051003,-0.004818,
+ -0.37698,0.573856,0.727032,0.062418,0.051241,-0.005781,
+ -0.403275,0.554082,0.72826,0.063095,0.051693,-0.005781,
+ -0.37698,0.573856,0.727032,0.062418,0.051241,-0.005781,
+ -0.405711,0.551851,0.728601,0.063888,0.051003,-0.004818,
+ -0.403275,0.554082,0.72826,0.063095,0.051693,-0.005781,
+ -0.405711,0.551851,0.728601,0.063888,0.051003,-0.004818,
+ -0.439698,0.520339,0.732061,0.063732,0.052198,-0.005781,
+ -0.455156,0.505988,0.732672,0.064596,0.051576,-0.004818,
+ -0.439698,0.520339,0.732061,0.063732,0.052198,-0.005781,
+ -0.405711,0.551851,0.728601,0.063888,0.051003,-0.004818,
+ -0.439698,0.520339,0.732061,0.063732,0.052198,-0.005781,
+ -0.455156,0.505988,0.732672,0.064596,0.051576,-0.004818,
+ -0.478388,0.479119,0.735928,0.064326,0.052755,-0.005781,
+ -0.492434,0.463571,0.736621,0.065254,0.052206,-0.004818,
+ -0.478388,0.479119,0.735928,0.064326,0.052755,-0.005781,
+ -0.455156,0.505988,0.732672,0.064596,0.051576,-0.004818,
+ -0.478388,0.479119,0.735928,0.064326,0.052755,-0.005781,
+ -0.492434,0.463571,0.736621,0.065254,0.052206,-0.004818,
+ -0.513034,0.434953,0.740008,0.06487,0.053359,-0.005781,
+ -0.525496,0.418365,0.740827,0.065859,0.05289,-0.004818,
+ -0.513034,0.434953,0.740008,0.06487,0.053359,-0.005781,
+ -0.492434,0.463571,0.736621,0.065254,0.052206,-0.004818,
+ -0.513034,0.434953,0.740008,0.06487,0.053359,-0.005781,
+ -0.525496,0.418365,0.740827,0.065859,0.05289,-0.004818,
+ -0.543337,0.388194,0.744372,0.065363,0.054006,-0.005781,
+ -0.554068,0.370754,0.745352,0.066406,0.053623,-0.004818,
+ -0.543337,0.388194,0.744372,0.065363,0.054006,-0.005781,
+ -0.525496,0.418365,0.740827,0.065859,0.05289,-0.004818,
+ -0.543337,0.388194,0.744372,0.065363,0.054006,-0.005781,
+ -0.554068,0.370754,0.745352,0.066406,0.053623,-0.004818,
+ -0.569031,0.339242,0.749078,0.065801,0.054691,-0.005781,
+ -0.577912,0.321162,0.750248,0.066892,0.054399,-0.004818,
+ -0.569031,0.339242,0.749078,0.065801,0.054691,-0.005781,
+ -0.554068,0.370754,0.745352,0.066406,0.053623,-0.004818,
+ -0.569031,0.339242,0.749078,0.065801,0.054691,-0.005781,
+ -0.577912,0.321162,0.750248,0.066892,0.054399,-0.004818,
+ -0.589896,0.288542,0.754166,0.06618,0.055411,-0.005781,
+ -0.596848,0.270049,0.755544,0.067313,0.055214,-0.004818,
+ -0.589896,0.288542,0.754166,0.06618,0.055411,-0.005781,
+ -0.577912,0.321162,0.750248,0.066892,0.054399,-0.004818,
+ -0.589896,0.288542,0.754166,0.06618,0.055411,-0.005781,
+ -0.596848,0.270049,0.755544,0.067313,0.055214,-0.004818,
+ -0.60577,0.236571,0.759656,0.066498,0.05616,-0.005781,
+ -0.610753,0.217903,0.761249,0.067666,0.056061,-0.004818,
+ -0.60577,0.236571,0.759656,0.066498,0.05616,-0.005781,
+ -0.596848,0.270049,0.755544,0.067313,0.055214,-0.004818,
+ -0.60577,0.236571,0.759656,0.066498,0.05616,-0.005781,
+ -0.610753,0.217903,0.761249,0.067666,0.056061,-0.004818,
+ -0.616557,0.183837,0.765546,0.066754,0.056932,-0.005781,
+ -0.619574,0.165232,0.767351,0.067949,0.056936,-0.004818,
+ -0.616557,0.183837,0.765546,0.066754,0.056932,-0.005781,
+ -0.610753,0.217903,0.761249,0.067666,0.056061,-0.004818,
+ -0.616557,0.183837,0.765546,0.066754,0.056932,-0.005781,
+ -0.619574,0.165232,0.767351,0.067949,0.056936,-0.004818,
+ -0.622238,0.13086,0.771813,0.066944,0.057723,-0.005781,
+ -0.623333,0.112547,0.773815,0.068161,0.057831,-0.004818,
+ -0.622238,0.13086,0.771813,0.066944,0.057723,-0.005781,
+ -0.619574,0.165232,0.767351,0.067949,0.056936,-0.004818,
+ -0.622238,0.13086,0.771813,0.066944,0.057723,-0.005781,
+ -0.623333,0.112547,0.773815,0.068161,0.057831,-0.004818,
+ -0.622921,0.078006,0.778386,0.067068,0.058527,-0.005781,
+ -0.622674,0.06887,0.779444,0.068298,0.058741,-0.004818,
+ -0.622921,0.078006,0.778386,0.067068,0.058527,-0.005781,
+ -0.623333,0.112547,0.773815,0.068161,0.057831,-0.004818,
+ -0.622921,0.078006,0.778386,0.067068,0.058527,-0.005781,
+ -0.622674,0.06887,0.779444,0.068298,0.058741,-0.004818,
+ -0.615482,0.005518,0.788132,0.068362,0.05966,-0.004818,
+ -0.622921,0.078006,0.778386,0.067068,0.058527,-0.005781,
+ -0.615482,0.005518,0.788132,0.068362,0.05966,-0.004818,
+ -0.608032,-0.012608,0.793813,0.067125,0.059338,-0.005781,
+ -0.615482,0.005518,0.788132,0.068362,0.05966,-0.004818,
+ -0.587334,-0.078712,0.805508,0.068281,0.061186,-0.004818,
+ -0.608032,-0.012608,0.793813,0.067125,0.059338,-0.005781,
+ -0.563271,-0.124273,0.816873,0.067016,0.060662,-0.005781,
+ -0.608032,-0.012608,0.793813,0.067125,0.059338,-0.005781,
+ -0.587334,-0.078712,0.805508,0.068281,0.061186,-0.004818,
+ -0.587334,-0.078712,0.805508,0.068281,0.061186,-0.004818,
+ -0.528554,-0.194938,0.826214,0.067873,0.062655,-0.004818,
+ -0.563271,-0.124273,0.816873,0.067016,0.060662,-0.005781,
+ -0.498136,-0.2337,0.835012,0.066618,0.06193,-0.005781,
+ -0.563271,-0.124273,0.816873,0.067016,0.060662,-0.005781,
+ -0.528554,-0.194938,0.826214,0.067873,0.062655,-0.004818,
+ -0.528554,-0.194938,0.826214,0.067873,0.062655,-0.004818,
+ -0.454671,-0.294294,0.840634,0.067158,0.063997,-0.004818,
+ -0.498136,-0.2337,0.835012,0.066618,0.06193,-0.005781,
+ -0.419714,-0.3263,0.846976,0.065951,0.063079,-0.005781,
+ -0.498136,-0.2337,0.835012,0.066618,0.06193,-0.005781,
+ -0.454671,-0.294294,0.840634,0.067158,0.063997,-0.004818,
+ -0.454671,-0.294294,0.840634,0.067158,0.063997,-0.004818,
+ -0.369159,-0.377727,0.849143,0.06617,0.065145,-0.004818,
+ -0.419714,-0.3263,0.846976,0.065951,0.063079,-0.005781,
+ -0.33096,-0.403408,0.853069,0.065047,0.064053,-0.005781,
+ -0.419714,-0.3263,0.846976,0.065951,0.063079,-0.005781,
+ -0.369159,-0.377727,0.849143,0.06617,0.065145,-0.004818,
+ -0.369159,-0.377727,0.849143,0.06617,0.065145,-0.004818,
+ -0.273921,-0.44663,0.851756,0.064959,0.066043,-0.004818,
+ -0.33096,-0.403408,0.853069,0.065047,0.064053,-0.005781,
+ -0.233173,-0.466563,0.853199,0.063951,0.064804,-0.005781,
+ -0.33096,-0.403408,0.853069,0.065047,0.064053,-0.005781,
+ -0.273921,-0.44663,0.851756,0.064959,0.066043,-0.004818,
+ -0.273921,-0.44663,0.851756,0.064959,0.066043,-0.004818,
+ -0.169323,-0.502195,0.848015,0.063583,0.066646,-0.004818,
+ -0.233173,-0.466563,0.853199,0.063951,0.064804,-0.005781
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,648,data,NULL};
+const struct gllist *companion_heart=&frame;
diff --git a/hacks/glx/companion_quad.c b/hacks/glx/companion_quad.c
new file mode 100644
index 0000000..3cfd230
--- /dev/null
+++ b/hacks/glx/companion_quad.c
@@ -0,0 +1,389 @@
+#include "gllist.h"
+static const float data[]={
+ 0.11097,0.464834,-0.878416,0.79903,1.636364,-0.247442,
+ 0.138522,0.464654,-0.87459,0.773415,1.636364,-0.251499,
+ 0.138522,0.464654,-0.87459,0.775033,1.681818,-0.227094,
+ 0.11097,0.464834,-0.878416,0.79903,1.636364,-0.247442,
+ 0.138522,0.464654,-0.87459,0.775033,1.681818,-0.227094,
+ 0.11097,0.464834,-0.878416,0.796039,1.681818,-0.223767,
+ -0.917485,0.21303,-0.335916,0.757576,1.636364,-0.208242,
+ -0.917485,0.21303,-0.335916,0.757576,1.681818,-0.179415,
+ -0.917485,0.21303,-0.335916,0.775033,1.681818,-0.227094,
+ -0.917485,0.21303,-0.335916,0.757576,1.636364,-0.208242,
+ -0.917485,0.21303,-0.335916,0.775033,1.681818,-0.227094,
+ -0.917485,0.21303,-0.335916,0.773415,1.636364,-0.251499,
+ -1,0,0,0.757576,1.636364,-0.208242,
+ -1,0,0,0.757576,1.636364,-0.121212,
+ -1,0,0,0.757576,1.549333,-0.121212,
+ -1,0,0,0.757576,1.636364,-0.208242,
+ -1,0,0,0.757576,1.549333,-0.121212,
+ -1,0,0,0.757576,1.578161,-0.075758,
+ -1,0,0,0.757576,1.636364,-0.208242,
+ -1,0,0,0.757576,1.578161,-0.075758,
+ -1,0,0,0.757576,1.636364,-0.075758,
+ -1,0,0,0.757576,1.636364,-0.208242,
+ -1,0,0,0.757576,1.636364,-0.075758,
+ -1,0,0,0.757576,1.681818,-0.121212,
+ -1,0,0,0.757576,1.636364,-0.208242,
+ -1,0,0,0.757576,1.681818,-0.121212,
+ -1,0,0,0.757576,1.681818,-0.179415,
+ -0.917485,-0.335916,0.21303,0.757576,1.578161,-0.075758,
+ -0.917485,-0.335916,0.21303,0.757576,1.549333,-0.121212,
+ -0.917485,-0.335916,0.21303,0.773415,1.506076,-0.121212,
+ -0.917485,-0.335916,0.21303,0.757576,1.578161,-0.075758,
+ -0.917485,-0.335916,0.21303,0.773415,1.506076,-0.121212,
+ -0.917485,-0.335916,0.21303,0.775033,1.530482,-0.075758,
+ 0.138522,-0.87459,0.464654,0.773415,1.506076,-0.121212,
+ 0.11097,-0.878416,0.464834,0.79903,1.510133,-0.121212,
+ 0.11097,-0.878416,0.464834,0.796039,1.533809,-0.075758,
+ 0.138522,-0.87459,0.464654,0.773415,1.506076,-0.121212,
+ 0.11097,-0.878416,0.464834,0.796039,1.533809,-0.075758,
+ 0.138522,-0.87459,0.464654,0.775033,1.530482,-0.075758,
+ 0.11097,-0.878416,0.464834,0.796039,1.533809,-0.075758,
+ 0.11097,-0.878416,0.464834,0.79903,1.510133,-0.121212,
+ 0.055595,-0.883651,0.464834,0.83883,1.513897,-0.121212,
+ 0.11097,-0.878416,0.464834,0.796039,1.533809,-0.075758,
+ 0.055595,-0.883651,0.464834,0.83883,1.513897,-0.121212,
+ 0.055595,-0.883651,0.464834,0.837333,1.537712,-0.075758,
+ 0.055595,-0.883651,0.464834,0.837333,1.537712,-0.075758,
+ 0.055595,-0.883651,0.464834,0.83883,1.513897,-0.121212,
+ 0,-0.885398,0.464834,0.878788,1.515152,-0.121212,
+ 0.055595,-0.883651,0.464834,0.837333,1.537712,-0.075758,
+ 0,-0.885398,0.464834,0.878788,1.515152,-0.121212,
+ 0,-0.885398,0.464834,0.878788,1.539015,-0.075758,
+ -0.055595,-0.883651,0.464834,0.918745,1.513897,-0.121212,
+ -0.055595,-0.883651,0.464834,0.920242,1.537712,-0.075758,
+ 0,-0.885398,0.464834,0.878788,1.539015,-0.075758,
+ -0.055595,-0.883651,0.464834,0.918745,1.513897,-0.121212,
+ 0,-0.885398,0.464834,0.878788,1.539015,-0.075758,
+ 0,-0.885398,0.464834,0.878788,1.515152,-0.121212,
+ -0.11097,-0.878416,0.464834,0.958545,1.510133,-0.121212,
+ -0.11097,-0.878416,0.464834,0.961536,1.533809,-0.075758,
+ -0.055595,-0.883651,0.464834,0.920242,1.537712,-0.075758,
+ -0.11097,-0.878416,0.464834,0.958545,1.510133,-0.121212,
+ -0.055595,-0.883651,0.464834,0.920242,1.537712,-0.075758,
+ -0.055595,-0.883651,0.464834,0.918745,1.513897,-0.121212,
+ -0.11097,-0.878416,0.464834,0.958545,1.510133,-0.121212,
+ -0.138522,-0.87459,0.464654,0.984161,1.506076,-0.121212,
+ -0.138522,-0.87459,0.464654,0.982542,1.530482,-0.075758,
+ -0.11097,-0.878416,0.464834,0.958545,1.510133,-0.121212,
+ -0.138522,-0.87459,0.464654,0.982542,1.530482,-0.075758,
+ -0.11097,-0.878416,0.464834,0.961536,1.533809,-0.075758,
+ 0.917485,-0.335916,0.21303,1,1.549333,-0.121212,
+ 0.917485,-0.335916,0.21303,1,1.578161,-0.075758,
+ 0.917485,-0.335916,0.21303,0.982542,1.530482,-0.075758,
+ 0.917485,-0.335916,0.21303,1,1.549333,-0.121212,
+ 0.917485,-0.335916,0.21303,0.982542,1.530482,-0.075758,
+ 0.917485,-0.335916,0.21303,0.984161,1.506076,-0.121212,
+ 1,0,0,1,1.636364,-0.121212,
+ 1,0,0,1,1.636364,-0.208242,
+ 1,0,0,1,1.681818,-0.179415,
+ 1,0,0,1,1.636364,-0.121212,
+ 1,0,0,1,1.681818,-0.179415,
+ 1,0,0,1,1.681818,-0.121212,
+ 1,0,0,1,1.636364,-0.121212,
+ 1,0,0,1,1.681818,-0.121212,
+ 1,0,0,1,1.636364,-0.075758,
+ 1,0,0,1,1.636364,-0.121212,
+ 1,0,0,1,1.636364,-0.075758,
+ 1,0,0,1,1.578161,-0.075758,
+ 1,0,0,1,1.636364,-0.121212,
+ 1,0,0,1,1.578161,-0.075758,
+ 1,0,0,1,1.549333,-0.121212,
+ 0.917485,0.21303,-0.335916,1,1.681818,-0.179415,
+ 0.917485,0.21303,-0.335916,1,1.636364,-0.208242,
+ 0.917485,0.21303,-0.335916,0.984161,1.636364,-0.251499,
+ 0.917485,0.21303,-0.335916,1,1.681818,-0.179415,
+ 0.917485,0.21303,-0.335916,0.984161,1.636364,-0.251499,
+ 0.917485,0.21303,-0.335916,0.982542,1.681818,-0.227094,
+ -0.138522,0.464654,-0.87459,0.984161,1.636364,-0.251499,
+ -0.11097,0.464834,-0.878416,0.958545,1.636364,-0.247442,
+ -0.11097,0.464834,-0.878416,0.961536,1.681818,-0.223767,
+ -0.138522,0.464654,-0.87459,0.984161,1.636364,-0.251499,
+ -0.11097,0.464834,-0.878416,0.961536,1.681818,-0.223767,
+ -0.138522,0.464654,-0.87459,0.982542,1.681818,-0.227094,
+ -0.11097,0.464834,-0.878416,0.961536,1.681818,-0.223767,
+ -0.11097,0.464834,-0.878416,0.958545,1.636364,-0.247442,
+ -0.055595,0.464834,-0.883651,0.918745,1.636364,-0.24368,
+ -0.11097,0.464834,-0.878416,0.961536,1.681818,-0.223767,
+ -0.055595,0.464834,-0.883651,0.918745,1.636364,-0.24368,
+ -0.055595,0.464834,-0.883651,0.920242,1.681818,-0.219863,
+ -0.055595,0.464834,-0.883651,0.920242,1.681818,-0.219863,
+ -0.055595,0.464834,-0.883651,0.918745,1.636364,-0.24368,
+ 0,0.464834,-0.885398,0.878788,1.636364,-0.242424,
+ -0.055595,0.464834,-0.883651,0.920242,1.681818,-0.219863,
+ 0,0.464834,-0.885398,0.878788,1.636364,-0.242424,
+ 0,0.464834,-0.885398,0.878788,1.681818,-0.218561,
+ 0.055595,0.464834,-0.883651,0.83883,1.636364,-0.24368,
+ 0.055595,0.464834,-0.883651,0.837333,1.681818,-0.219863,
+ 0,0.464834,-0.885398,0.878788,1.681818,-0.218561,
+ 0.055595,0.464834,-0.883651,0.83883,1.636364,-0.24368,
+ 0,0.464834,-0.885398,0.878788,1.681818,-0.218561,
+ 0,0.464834,-0.885398,0.878788,1.636364,-0.242424,
+ 0.11097,0.464834,-0.878416,0.79903,1.636364,-0.247442,
+ 0.11097,0.464834,-0.878416,0.796039,1.681818,-0.223767,
+ 0.055595,0.464834,-0.883651,0.837333,1.681818,-0.219863,
+ 0.11097,0.464834,-0.878416,0.79903,1.636364,-0.247442,
+ 0.055595,0.464834,-0.883651,0.837333,1.681818,-0.219863,
+ 0.055595,0.464834,-0.883651,0.83883,1.636364,-0.24368,
+ 0,1,0,0.920242,1.681818,-0.219863,
+ 0,1,0,0.878788,1.681818,-0.218561,
+ 0,1,0,0.837333,1.681818,-0.219863,
+ 0,1,0,0.920242,1.681818,-0.219863,
+ 0,1,0,0.837333,1.681818,-0.219863,
+ 0,1,0,0.796039,1.681818,-0.223767,
+ 0,1,0,0.920242,1.681818,-0.219863,
+ 0,1,0,0.796039,1.681818,-0.223767,
+ 0,1,0,0.775033,1.681818,-0.227094,
+ 0,1,0,0.920242,1.681818,-0.219863,
+ 0,1,0,0.775033,1.681818,-0.227094,
+ 0,1,0,0.757576,1.681818,-0.179415,
+ 0,1,0,0.920242,1.681818,-0.219863,
+ 0,1,0,0.757576,1.681818,-0.179415,
+ 0,1,0,0.757576,1.681818,-0.121212,
+ 0,1,0,0.920242,1.681818,-0.219863,
+ 0,1,0,0.757576,1.681818,-0.121212,
+ 0,1,0,1,1.681818,-0.121212,
+ 0,1,0,0.920242,1.681818,-0.219863,
+ 0,1,0,1,1.681818,-0.121212,
+ 0,1,0,1,1.681818,-0.179415,
+ 0,1,0,0.920242,1.681818,-0.219863,
+ 0,1,0,1,1.681818,-0.179415,
+ 0,1,0,0.982542,1.681818,-0.227094,
+ 0,1,0,0.920242,1.681818,-0.219863,
+ 0,1,0,0.982542,1.681818,-0.227094,
+ 0,1,0,0.961536,1.681818,-0.223767,
+ 0,0.707107,0.707107,0.757576,1.681818,-0.121212,
+ 0,0.707107,0.707107,0.757576,1.636364,-0.075758,
+ 0,0.707107,0.707107,1,1.636364,-0.075758,
+ 0,0.707107,0.707107,0.757576,1.681818,-0.121212,
+ 0,0.707107,0.707107,1,1.636364,-0.075758,
+ 0,0.707107,0.707107,1,1.681818,-0.121212,
+ 0,0,1,1,1.578161,-0.075758,
+ 0,0,1,1,1.636364,-0.075758,
+ 0,0,1,0.757576,1.636364,-0.075758,
+ 0,0,1,1,1.578161,-0.075758,
+ 0,0,1,0.757576,1.636364,-0.075758,
+ 0,0,1,0.757576,1.578161,-0.075758,
+ 0,0,1,1,1.578161,-0.075758,
+ 0,0,1,0.757576,1.578161,-0.075758,
+ 0,0,1,0.775033,1.530482,-0.075758,
+ 0,0,1,1,1.578161,-0.075758,
+ 0,0,1,0.775033,1.530482,-0.075758,
+ 0,0,1,0.796039,1.533809,-0.075758,
+ 0,0,1,1,1.578161,-0.075758,
+ 0,0,1,0.796039,1.533809,-0.075758,
+ 0,0,1,0.837333,1.537712,-0.075758,
+ 0,0,1,1,1.578161,-0.075758,
+ 0,0,1,0.837333,1.537712,-0.075758,
+ 0,0,1,0.878788,1.539015,-0.075758,
+ 0,0,1,1,1.578161,-0.075758,
+ 0,0,1,0.878788,1.539015,-0.075758,
+ 0,0,1,0.920242,1.537712,-0.075758,
+ 0,0,1,1,1.578161,-0.075758,
+ 0,0,1,0.920242,1.537712,-0.075758,
+ 0,0,1,0.961536,1.533809,-0.075758,
+ 0,0,1,1,1.578161,-0.075758,
+ 0,0,1,0.961536,1.533809,-0.075758,
+ 0,0,1,0.982542,1.530482,-0.075758,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.121212,1.125055,0,
+ 0,0,1,0.223833,1.125055,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.223833,1.125055,0,
+ 0,0,1,0.227944,1.136476,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.227944,1.136476,0,
+ 0,0,1,0.245409,1.176833,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.245409,1.176833,0,
+ 0,0,1,0.265373,1.216015,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.265373,1.216015,0,
+ 0,0,1,0.287758,1.253867,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.287758,1.253867,0,
+ 0,0,1,0.312476,1.290236,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.312476,1.290236,0,
+ 0,0,1,0.339427,1.324985,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.339427,1.324985,0,
+ 0,0,1,0.368509,1.35797,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.368509,1.35797,0,
+ 0,0,1,0.399606,1.389067,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.399606,1.389067,0,
+ 0,0,1,0.432591,1.418148,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.432591,1.418148,0,
+ 0,0,1,0.467339,1.4451,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.467339,1.4451,0,
+ 0,0,1,0.503709,1.469818,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.503709,1.469818,0,
+ 0,0,1,0.541561,1.492203,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.541561,1.492203,0,
+ 0,0,1,0.580742,1.512167,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.580742,1.512167,0,
+ 0,0,1,0.6211,1.52963,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.6211,1.52963,0,
+ 0,0,1,0.632521,1.533742,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.632521,1.533742,0,
+ 0,0,1,0.632521,1.636364,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.632521,1.636364,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.121212,1.636364,0,
+ 0,0,1,0.121212,1.125055,0,
+ 0.645427,-0.606097,0.464834,0.4149,1.314409,-0.121212,
+ 0.645427,-0.606097,0.464834,0.368509,1.35797,0,
+ 0.682211,-0.564374,0.464834,0.339427,1.324985,0,
+ 0.645427,-0.606097,0.464834,0.4149,1.314409,-0.121212,
+ 0.682211,-0.564374,0.464834,0.339427,1.324985,0,
+ 0.682211,-0.564374,0.464834,0.388461,1.284421,-0.121212,
+ 0.645427,-0.606097,0.464834,0.368509,1.35797,0,
+ 0.645427,-0.606097,0.464834,0.4149,1.314409,-0.121212,
+ 0.606097,-0.645427,0.464834,0.443167,1.342676,-0.121212,
+ 0.645427,-0.606097,0.464834,0.368509,1.35797,0,
+ 0.606097,-0.645427,0.464834,0.443167,1.342676,-0.121212,
+ 0.606097,-0.645427,0.464834,0.399606,1.389067,0,
+ 0.606097,-0.645427,0.464834,0.399606,1.389067,0,
+ 0.606097,-0.645427,0.464834,0.443167,1.342676,-0.121212,
+ 0.564374,-0.682211,0.464834,0.473155,1.369115,-0.121212,
+ 0.606097,-0.645427,0.464834,0.399606,1.389067,0,
+ 0.564374,-0.682211,0.464834,0.473155,1.369115,-0.121212,
+ 0.564374,-0.682211,0.464834,0.432591,1.418148,0,
+ 0.564374,-0.682211,0.464834,0.432591,1.418148,0,
+ 0.564374,-0.682211,0.464834,0.473155,1.369115,-0.121212,
+ 0.520424,-0.716302,0.464834,0.504742,1.393618,-0.121212,
+ 0.564374,-0.682211,0.464834,0.432591,1.418148,0,
+ 0.520424,-0.716302,0.464834,0.504742,1.393618,-0.121212,
+ 0.520424,-0.716302,0.464834,0.467339,1.4451,0,
+ 0.520424,-0.716302,0.464834,0.467339,1.4451,0,
+ 0.520424,-0.716302,0.464834,0.504742,1.393618,-0.121212,
+ 0.47442,-0.747566,0.464834,0.537806,1.416088,-0.121212,
+ 0.520424,-0.716302,0.464834,0.467339,1.4451,0,
+ 0.47442,-0.747566,0.464834,0.537806,1.416088,-0.121212,
+ 0.47442,-0.747566,0.464834,0.503709,1.469818,0,
+ 0.47442,-0.747566,0.464834,0.503709,1.469818,0,
+ 0.47442,-0.747566,0.464834,0.537806,1.416088,-0.121212,
+ 0.426544,-0.77588,0.464834,0.572218,1.436436,-0.121212,
+ 0.47442,-0.747566,0.464834,0.503709,1.469818,0,
+ 0.426544,-0.77588,0.464834,0.572218,1.436436,-0.121212,
+ 0.426544,-0.77588,0.464834,0.541561,1.492203,0,
+ 0.426544,-0.77588,0.464834,0.541561,1.492203,0,
+ 0.426544,-0.77588,0.464834,0.572218,1.436436,-0.121212,
+ 0.376984,-0.801132,0.464834,0.607836,1.454588,-0.121212,
+ 0.426544,-0.77588,0.464834,0.541561,1.492203,0,
+ 0.376984,-0.801132,0.464834,0.607836,1.454588,-0.121212,
+ 0.376984,-0.801132,0.464834,0.580742,1.512167,0,
+ 0.376984,-0.801132,0.464834,0.580742,1.512167,0,
+ 0.376984,-0.801132,0.464834,0.607836,1.454588,-0.121212,
+ 0.325937,-0.823222,0.464834,0.644527,1.470464,-0.121212,
+ 0.376984,-0.801132,0.464834,0.580742,1.512167,0,
+ 0.325937,-0.823222,0.464834,0.644527,1.470464,-0.121212,
+ 0.325937,-0.823222,0.464834,0.6211,1.52963,0,
+ 0.29995,-0.833143,0.464654,0.632521,1.533742,0,
+ 0.325937,-0.823222,0.464834,0.6211,1.52963,0,
+ 0.325937,-0.823222,0.464834,0.644527,1.470464,-0.121212,
+ 0.29995,-0.833143,0.464654,0.632521,1.533742,0,
+ 0.325937,-0.823222,0.464834,0.644527,1.470464,-0.121212,
+ 0.273603,-0.842063,0.464834,0.682139,1.484006,-0.121212,
+ 0.29995,-0.833143,0.464654,0.632521,1.533742,0,
+ 0.273603,-0.842063,0.464834,0.682139,1.484006,-0.121212,
+ 0.273603,-0.842063,0.464834,0.67563,1.504045,-0.081077,
+ 0.273603,-0.842063,0.464834,0.67563,1.504045,-0.081077,
+ 0.273603,-0.842063,0.464834,0.682139,1.484006,-0.121212,
+ 0.247044,-0.850333,0.464654,0.69697,1.488315,-0.121212,
+ 0.882948,0,0.469472,0.632521,1.636364,0,
+ 0.882948,0,0.469472,0.632521,1.533742,0,
+ 0.882948,0,0.469472,0.67563,1.504045,-0.081077,
+ 0.882948,0,0.469472,0.632521,1.636364,0,
+ 0.882948,0,0.469472,0.67563,1.504045,-0.081077,
+ 0.882948,0,0.469472,0.69697,1.488315,-0.121212,
+ 0.882948,0,0.469472,0.632521,1.636364,0,
+ 0.882948,0,0.469472,0.69697,1.488315,-0.121212,
+ 0.882948,0,0.469472,0.69697,1.636364,-0.121212,
+ 0.799251,0.424969,0.424969,0.69697,1.636364,-0.121212,
+ 0.799251,0.424969,0.424969,0.632521,1.757576,-0.121212,
+ 0.799251,0.424969,0.424969,0.632521,1.636364,0,
+ 0,0.707107,0.707107,0.632521,1.757576,-0.121212,
+ 0,0.707107,0.707107,0.121212,1.757576,-0.121212,
+ 0,0.707107,0.707107,0.121212,1.636364,0,
+ 0,0.707107,0.707107,0.632521,1.757576,-0.121212,
+ 0,0.707107,0.707107,0.121212,1.636364,0,
+ 0,0.707107,0.707107,0.632521,1.636364,0,
+ -0.57735,0.57735,0.57735,0.121212,1.757576,-0.121212,
+ -0.57735,0.57735,0.57735,0,1.636364,-0.121212,
+ -0.57735,0.57735,0.57735,0.121212,1.636364,0,
+ -0.707107,0,0.707107,0,1.636364,-0.121212,
+ -0.707107,0,0.707107,0,1.125055,-0.121212,
+ -0.707107,0,0.707107,0.121212,1.125055,0,
+ -0.707107,0,0.707107,0,1.636364,-0.121212,
+ -0.707107,0,0.707107,0.121212,1.125055,0,
+ -0.707107,0,0.707107,0.121212,1.636364,0,
+ -0.424969,-0.799251,0.424969,0,1.125055,-0.121212,
+ -0.424969,-0.799251,0.424969,0.121212,1.060606,-0.121212,
+ -0.424969,-0.799251,0.424969,0.121212,1.125055,0,
+ 0,-0.882948,0.469472,0.223833,1.125055,0,
+ 0,-0.882948,0.469472,0.121212,1.125055,0,
+ 0,-0.882948,0.469472,0.121212,1.060606,-0.121212,
+ 0,-0.882948,0.469472,0.223833,1.125055,0,
+ 0,-0.882948,0.469472,0.121212,1.060606,-0.121212,
+ 0,-0.882948,0.469472,0.269262,1.060606,-0.121212,
+ 0,-0.882948,0.469472,0.223833,1.125055,0,
+ 0,-0.882948,0.469472,0.269262,1.060606,-0.121212,
+ 0,-0.882948,0.469472,0.25353,1.081945,-0.081077,
+ 0.842063,-0.273603,0.464834,0.27357,1.075436,-0.121212,
+ 0.842063,-0.273603,0.464834,0.25353,1.081945,-0.081077,
+ 0.850333,-0.247044,0.464654,0.269262,1.060606,-0.121212,
+ 0.823222,-0.325937,0.464834,0.227944,1.136476,0,
+ 0.833143,-0.29995,0.464654,0.223833,1.125055,0,
+ 0.842063,-0.273603,0.464834,0.25353,1.081945,-0.081077,
+ 0.823222,-0.325937,0.464834,0.227944,1.136476,0,
+ 0.842063,-0.273603,0.464834,0.25353,1.081945,-0.081077,
+ 0.842063,-0.273603,0.464834,0.27357,1.075436,-0.121212,
+ 0.823222,-0.325937,0.464834,0.227944,1.136476,0,
+ 0.842063,-0.273603,0.464834,0.27357,1.075436,-0.121212,
+ 0.823222,-0.325937,0.464834,0.287112,1.113048,-0.121212,
+ 0.801132,-0.376984,0.464834,0.302989,1.149739,-0.121212,
+ 0.801132,-0.376984,0.464834,0.245409,1.176833,0,
+ 0.823222,-0.325937,0.464834,0.227944,1.136476,0,
+ 0.801132,-0.376984,0.464834,0.302989,1.149739,-0.121212,
+ 0.823222,-0.325937,0.464834,0.227944,1.136476,0,
+ 0.823222,-0.325937,0.464834,0.287112,1.113048,-0.121212,
+ 0.77588,-0.426544,0.464834,0.321139,1.185358,-0.121212,
+ 0.77588,-0.426544,0.464834,0.265373,1.216015,0,
+ 0.801132,-0.376984,0.464834,0.245409,1.176833,0,
+ 0.77588,-0.426544,0.464834,0.321139,1.185358,-0.121212,
+ 0.801132,-0.376984,0.464834,0.245409,1.176833,0,
+ 0.801132,-0.376984,0.464834,0.302989,1.149739,-0.121212,
+ 0.747566,-0.47442,0.464834,0.341488,1.21977,-0.121212,
+ 0.747566,-0.47442,0.464834,0.287758,1.253867,0,
+ 0.77588,-0.426544,0.464834,0.265373,1.216015,0,
+ 0.747566,-0.47442,0.464834,0.341488,1.21977,-0.121212,
+ 0.77588,-0.426544,0.464834,0.265373,1.216015,0,
+ 0.77588,-0.426544,0.464834,0.321139,1.185358,-0.121212,
+ 0.716302,-0.520424,0.464834,0.363958,1.252833,-0.121212,
+ 0.716302,-0.520424,0.464834,0.312476,1.290236,0,
+ 0.747566,-0.47442,0.464834,0.287758,1.253867,0,
+ 0.716302,-0.520424,0.464834,0.363958,1.252833,-0.121212,
+ 0.747566,-0.47442,0.464834,0.287758,1.253867,0,
+ 0.747566,-0.47442,0.464834,0.341488,1.21977,-0.121212,
+ 0.682211,-0.564374,0.464834,0.388461,1.284421,-0.121212,
+ 0.682211,-0.564374,0.464834,0.339427,1.324985,0,
+ 0.716302,-0.520424,0.464834,0.312476,1.290236,0,
+ 0.682211,-0.564374,0.464834,0.388461,1.284421,-0.121212,
+ 0.716302,-0.520424,0.464834,0.312476,1.290236,0,
+ 0.716302,-0.520424,0.464834,0.363958,1.252833,-0.121212
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,384,data,NULL};
+const struct gllist *companion_quad=&frame;
diff --git a/hacks/glx/companioncube.man b/hacks/glx/companioncube.man
new file mode 100644
index 0000000..e15b15e
--- /dev/null
+++ b/hacks/glx/companioncube.man
@@ -0,0 +1,85 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+companioncube - a vital aparatus.
+.SH SYNOPSIS
+.B companioncube
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fIratio\fP]
+[\-spin]
+[\-wander]
+[\-count \fInumber\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+The symptoms most commonly produced by Enrichment Center testing are
+superstition, perceiving inanimate objects as alive, and hallucinations.
+The Enrichment Center reminds you that the weighted companion cube will
+never threaten to stab you and, in fact, cannot speak. In the event that
+the Weighted Companion Cube does speak, the Enrichment Center urges you to
+disregard its advice.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+How fast the animation should run.
+Less than 1 for slower, greater than 1 for faster.
+.TP 8
+.B \-count \fInumber\fP
+How many cubes. Default 3.
+.TP 8
+.B \-spin
+.B \-no\-spin
+Instead of bouncing, float and spin.
+.TP 8
+.B \-wander
+.B \-no\-wander
+Instead of bouncing, float and drift.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR tronbit (1),
+.BR lament (1),
+.BR dangerball (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2011 by Jamie Zawinski. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Jamie Zawinski, with apologies to the fine folks at Valve Software
+and Aperture Science.
diff --git a/hacks/glx/cow_face.c b/hacks/glx/cow_face.c
new file mode 100644
index 0000000..e57d2bb
--- /dev/null
+++ b/hacks/glx/cow_face.c
@@ -0,0 +1,341 @@
+#include "gllist.h"
+static const float data[]={
+ 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
+ 0.133638,0.26732,-0.954296,4.925394,1.955229,-0.618837,
+ 0.555353,0.50765,-0.658692,4.953739,1.95258,-0.592256,
+ 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
+ 0.555353,0.50765,-0.658692,4.953739,1.95258,-0.592256,
+ 0.823157,0.134624,-0.551625,4.971872,1.924079,-0.586026,
+ 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
+ 0.823157,0.134624,-0.551625,4.971872,1.924079,-0.586026,
+ 0.774925,-0.116115,-0.621296,4.953403,1.907939,-0.605609,
+ 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
+ 0.774925,-0.116115,-0.621296,4.953403,1.907939,-0.605609,
+ 0.546619,0.025491,-0.836994,4.925499,1.917814,-0.613413,
+ 0.872792,-0.115436,-0.474246,4.973133,1.992779,-0.533466,
+ 0.412833,-0.156453,-0.897269,5.001903,1.914398,-0.486724,
+ 0.823157,0.134624,-0.551625,4.971872,1.924079,-0.586026,
+ 0.872792,-0.115436,-0.474246,4.973133,1.992779,-0.533466,
+ 0.823157,0.134624,-0.551625,4.971872,1.924079,-0.586026,
+ 0.555353,0.50765,-0.658692,4.953739,1.95258,-0.592256,
+ 0.823157,0.134624,-0.551625,4.971872,1.924079,-0.586026,
+ 0.412833,-0.156453,-0.897269,5.001903,1.914398,-0.486724,
+ 0.108828,-0.182644,-0.977137,4.982364,1.8733,-0.53619,
+ 0.823157,0.134624,-0.551625,4.971872,1.924079,-0.586026,
+ 0.108828,-0.182644,-0.977137,4.982364,1.8733,-0.53619,
+ 0.774925,-0.116115,-0.621296,4.953403,1.907939,-0.605609,
+ 0.774925,-0.116115,-0.621296,4.953403,1.907939,-0.605609,
+ 0.108828,-0.182644,-0.977137,4.982364,1.8733,-0.53619,
+ 0.746476,-0.187741,-0.638379,4.926194,1.859813,-0.582137,
+ 0.546619,0.025491,-0.836994,4.925499,1.917814,-0.613413,
+ 0.774925,-0.116115,-0.621296,4.953403,1.907939,-0.605609,
+ 0.746476,-0.187741,-0.638379,4.926194,1.859813,-0.582137,
+ 0.546619,0.025491,-0.836994,4.925499,1.917814,-0.613413,
+ 0.746476,-0.187741,-0.638379,4.926194,1.859813,-0.582137,
+ 0.897742,-0.15037,-0.414063,4.852578,1.889721,-0.605031,
+ 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
+ 0.546619,0.025491,-0.836994,4.925499,1.917814,-0.613413,
+ 0.897742,-0.15037,-0.414063,4.852578,1.889721,-0.605031,
+ 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
+ 0.897742,-0.15037,-0.414063,4.852578,1.889721,-0.605031,
+ 0.544735,0.449335,-0.708069,4.824747,1.946835,-0.626358,
+ 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
+ 0.544735,0.449335,-0.708069,4.824747,1.946835,-0.626358,
+ 0.721999,0.398917,-0.565316,4.861611,2.001639,-0.621913,
+ 0.711192,0.127662,-0.69131,4.935561,2.016016,-0.5857,
+ 0.872792,-0.115436,-0.474246,4.973133,1.992779,-0.533466,
+ 0.555353,0.50765,-0.658692,4.953739,1.95258,-0.592256,
+ 0.711192,0.127662,-0.69131,4.935561,2.016016,-0.5857,
+ 0.555353,0.50765,-0.658692,4.953739,1.95258,-0.592256,
+ 0.133638,0.26732,-0.954296,4.925394,1.955229,-0.618837,
+ 0.909103,0.416568,-0.001454,5.908782,1.066916,0.001121,
+ 0.535268,0.844682,0.000171,5.871947,1.021428,0.001102,
+ -0.091049,-0.145989,-0.985087,5.897758,1.009309,-0.080583,
+ 0.909103,0.416568,-0.001454,5.908782,1.066916,0.001121,
+ -0.091049,-0.145989,-0.985087,5.897758,1.009309,-0.080583,
+ 0.054456,-0.320459,-0.945696,5.934596,1.054796,-0.077039,
+ 0.054456,-0.320459,-0.945696,5.934596,1.054796,-0.077039,
+ -0.091049,-0.145989,-0.985087,5.897758,1.009309,-0.080583,
+ -0.126433,-0.433465,-0.892257,5.87863,0.986485,-0.128292,
+ 0.054456,-0.320459,-0.945696,5.934596,1.054796,-0.077039,
+ -0.126433,-0.433465,-0.892257,5.87863,0.986485,-0.128292,
+ 0.169576,-0.140705,-0.975421,5.923808,1.025283,-0.153084,
+ 0.169576,-0.140705,-0.975421,5.923808,1.025283,-0.153084,
+ -0.126433,-0.433465,-0.892257,5.87863,0.986485,-0.128292,
+ 0.256335,-0.2349,-0.937611,5.757506,0.9579,-0.210732,
+ 0.169576,-0.140705,-0.975421,5.923808,1.025283,-0.153084,
+ 0.256335,-0.2349,-0.937611,5.757506,0.9579,-0.210732,
+ 0.120494,-0.516376,-0.847843,5.85775,0.997026,-0.236768,
+ 0.396941,-0.593504,-0.700137,5.755282,1.004149,-0.307505,
+ 0.120494,-0.516376,-0.847843,5.85775,0.997026,-0.236768,
+ 0.256335,-0.2349,-0.937611,5.757506,0.9579,-0.210732,
+ 0.396941,-0.593504,-0.700137,5.755282,1.004149,-0.307505,
+ 0.256335,-0.2349,-0.937611,5.757506,0.9579,-0.210732,
+ 0.204472,-0.587725,-0.782797,5.674999,0.950754,-0.22796,
+ 0.485455,-0.874253,0.003847,5.895899,1.18273,-0.164705,
+ 0.223936,-0.919046,-0.324355,5.959462,1.157227,-0.187097,
+ 0.051115,-0.906355,-0.419414,5.912147,1.117911,-0.254197,
+ 0.035706,-0.99787,-0.054588,5.849792,1.19348,-0.181047,
+ 0.485455,-0.874253,0.003847,5.895899,1.18273,-0.164705,
+ 0.051115,-0.906355,-0.419414,5.912147,1.117911,-0.254197,
+ 0.035706,-0.99787,-0.054588,5.849792,1.19348,-0.181047,
+ 0.051115,-0.906355,-0.419414,5.912147,1.117911,-0.254197,
+ 0.161367,-0.802085,-0.574996,5.837875,1.141493,-0.305184,
+ -0.034221,-0.995012,-0.093703,5.803425,1.260787,-0.210002,
+ 0.064626,-0.99783,0.012619,5.840665,1.221942,-0.187128,
+ 0.218068,-0.756332,-0.616772,5.77341,1.225861,-0.323025,
+ -0.034221,-0.995012,-0.093703,5.803425,1.260787,-0.210002,
+ 0.218068,-0.756332,-0.616772,5.77341,1.225861,-0.323025,
+ 0.725751,-0.657941,-0.200998,5.764774,1.279824,-0.308562,
+ -0.034221,-0.995012,-0.093703,5.803425,1.260787,-0.210002,
+ 0.725751,-0.657941,-0.200998,5.764774,1.279824,-0.308562,
+ 0.188634,-0.17518,-0.966297,5.783731,1.341471,-0.28459,
+ -0.034221,-0.995012,-0.093703,5.803425,1.260787,-0.210002,
+ 0.188634,-0.17518,-0.966297,5.783731,1.341471,-0.28459,
+ 0.244568,-0.04472,-0.9686,5.847989,1.311569,-0.261476,
+ -0.034221,-0.995012,-0.093703,5.803425,1.260787,-0.210002,
+ 0.244568,-0.04472,-0.9686,5.847989,1.311569,-0.261476,
+ 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
+ -0.034221,-0.995012,-0.093703,5.803425,1.260787,-0.210002,
+ 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
+ 0.064626,-0.99783,0.012619,5.840665,1.221942,-0.187128,
+ 0.064626,-0.99783,0.012619,5.840665,1.221942,-0.187128,
+ 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
+ 0.035706,-0.99787,-0.054588,5.849792,1.19348,-0.181047,
+ 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
+ -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
+ 0.485455,-0.874253,0.003847,5.895899,1.18273,-0.164705,
+ 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
+ 0.485455,-0.874253,0.003847,5.895899,1.18273,-0.164705,
+ 0.035706,-0.99787,-0.054588,5.849792,1.19348,-0.181047,
+ 0.173726,-0.983856,0.042973,5.672385,1.007694,-0.341778,
+ 0.396941,-0.593504,-0.700137,5.755282,1.004149,-0.307505,
+ 0.204472,-0.587725,-0.782797,5.674999,0.950754,-0.22796,
+ 0.173726,-0.983856,0.042973,5.672385,1.007694,-0.341778,
+ 0.204472,-0.587725,-0.782797,5.674999,0.950754,-0.22796,
+ -0.007021,-0.990239,-0.139206,5.573803,0.952578,-0.243886,
+ 0.148862,-0.934725,-0.322692,5.580727,0.99933,-0.349867,
+ 0.173726,-0.983856,0.042973,5.672385,1.007694,-0.341778,
+ -0.007021,-0.990239,-0.139206,5.573803,0.952578,-0.243886,
+ 0.148862,-0.934725,-0.322692,5.580727,0.99933,-0.349867,
+ -0.007021,-0.990239,-0.139206,5.573803,0.952578,-0.243886,
+ 0.241652,-0.897637,-0.368581,5.535184,0.98018,-0.341257,
+ -0.007021,-0.990239,-0.139206,5.573803,0.952578,-0.243886,
+ 0.204472,-0.587725,-0.782797,5.674999,0.950754,-0.22796,
+ -0.045194,-0.595739,-0.801906,5.638369,0.904402,-0.222548,
+ -0.007021,-0.990239,-0.139206,5.573803,0.952578,-0.243886,
+ -0.045194,-0.595739,-0.801906,5.638369,0.904402,-0.222548,
+ -0.016623,-0.697515,-0.716378,5.546347,0.916044,-0.246782,
+ 0.204472,-0.587725,-0.782797,5.674999,0.950754,-0.22796,
+ 0.256335,-0.2349,-0.937611,5.757506,0.9579,-0.210732,
+ -0.105003,-0.636187,-0.764356,5.748613,0.92049,-0.205099,
+ 0.204472,-0.587725,-0.782797,5.674999,0.950754,-0.22796,
+ -0.105003,-0.636187,-0.764356,5.748613,0.92049,-0.205099,
+ -0.045194,-0.595739,-0.801906,5.638369,0.904402,-0.222548,
+ -0.126433,-0.433465,-0.892257,5.87863,0.986485,-0.128292,
+ -0.106359,-0.394397,-0.912764,5.851404,0.929008,-0.105362,
+ -0.105003,-0.636187,-0.764356,5.748613,0.92049,-0.205099,
+ -0.126433,-0.433465,-0.892257,5.87863,0.986485,-0.128292,
+ -0.105003,-0.636187,-0.764356,5.748613,0.92049,-0.205099,
+ 0.256335,-0.2349,-0.937611,5.757506,0.9579,-0.210732,
+ 0.535268,0.844682,0.000171,5.871947,1.021428,0.001102,
+ 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
+ -0.091049,-0.145989,-0.985087,5.897758,1.009309,-0.080583,
+ -0.091049,-0.145989,-0.985087,5.897758,1.009309,-0.080583,
+ 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
+ -0.106359,-0.394397,-0.912764,5.851404,0.929008,-0.105362,
+ -0.091049,-0.145989,-0.985087,5.897758,1.009309,-0.080583,
+ -0.106359,-0.394397,-0.912764,5.851404,0.929008,-0.105362,
+ -0.126433,-0.433465,-0.892257,5.87863,0.986485,-0.128292,
+ -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
+ 0.223936,-0.919046,-0.324355,5.959462,1.157227,-0.187097,
+ 0.485455,-0.874253,0.003847,5.895899,1.18273,-0.164705,
+ 0.161367,-0.802085,-0.574996,5.837875,1.141493,-0.305184,
+ 0.218068,-0.756332,-0.616772,5.77341,1.225861,-0.323025,
+ 0.064626,-0.99783,0.012619,5.840665,1.221942,-0.187128,
+ 0.161367,-0.802085,-0.574996,5.837875,1.141493,-0.305184,
+ 0.064626,-0.99783,0.012619,5.840665,1.221942,-0.187128,
+ 0.035706,-0.99787,-0.054588,5.849792,1.19348,-0.181047,
+ 0.241652,-0.897637,-0.368581,5.535184,0.98018,-0.341257,
+ -0.007021,-0.990239,-0.139206,5.573803,0.952578,-0.243886,
+ -0.016623,-0.697515,-0.716378,5.546347,0.916044,-0.246782,
+ 0.241652,-0.897637,-0.368581,5.535184,0.98018,-0.341257,
+ -0.016623,-0.697515,-0.716378,5.546347,0.916044,-0.246782,
+ 0.241049,-0.626018,-0.741618,5.480649,0.941387,-0.316248,
+ 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
+ 0.721999,0.398917,-0.565316,4.861611,2.001639,-0.621913,
+ 0.711192,0.127662,-0.69131,4.935561,2.016016,-0.5857,
+ 0.193291,-0.074799,-0.978286,4.897808,1.946794,-0.628057,
+ 0.711192,0.127662,-0.69131,4.935561,2.016016,-0.5857,
+ 0.133638,0.26732,-0.954296,4.925394,1.955229,-0.618837,
+ 0.347878,0.028988,0.937092,4.925499,1.917814,0.613413,
+ 0.458202,0.052175,0.887316,4.953403,1.907939,0.605609,
+ 0.444094,0.036127,0.895251,4.971872,1.924079,0.586026,
+ 0.347878,0.028988,0.937092,4.925499,1.917814,0.613413,
+ 0.444094,0.036127,0.895251,4.971872,1.924079,0.586026,
+ 0.328548,0.219459,0.918637,4.953739,1.95258,0.592256,
+ 0.347878,0.028988,0.937092,4.925499,1.917814,0.613413,
+ 0.328548,0.219459,0.918637,4.953739,1.95258,0.592256,
+ 0.719268,0.159442,0.676189,4.925394,1.955229,0.618837,
+ 0.347878,0.028988,0.937092,4.925499,1.917814,0.613413,
+ 0.719268,0.159442,0.676189,4.925394,1.955229,0.618837,
+ 0.561013,0.750789,0.348684,4.897808,1.946794,0.628057,
+ 0.328548,0.219459,0.918637,4.953739,1.95258,0.592256,
+ 0.444094,0.036127,0.895251,4.971872,1.924079,0.586026,
+ 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
+ 0.328548,0.219459,0.918637,4.953739,1.95258,0.592256,
+ 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
+ 0.282492,0.026081,0.958915,4.973133,1.992779,0.533466,
+ 0.458202,0.052175,0.887316,4.953403,1.907939,0.605609,
+ 0.362705,0.428702,0.827442,4.982364,1.8733,0.53619,
+ 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
+ 0.458202,0.052175,0.887316,4.953403,1.907939,0.605609,
+ 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
+ 0.444094,0.036127,0.895251,4.971872,1.924079,0.586026,
+ 0.332757,0.286207,0.898531,4.926194,1.859813,0.582137,
+ 0.362705,0.428702,0.827442,4.982364,1.8733,0.53619,
+ 0.458202,0.052175,0.887316,4.953403,1.907939,0.605609,
+ 0.302716,0.058971,0.951255,4.852578,1.889721,0.605031,
+ 0.332757,0.286207,0.898531,4.926194,1.859813,0.582137,
+ 0.458202,0.052175,0.887316,4.953403,1.907939,0.605609,
+ 0.302716,0.058971,0.951255,4.852578,1.889721,0.605031,
+ 0.458202,0.052175,0.887316,4.953403,1.907939,0.605609,
+ 0.347878,0.028988,0.937092,4.925499,1.917814,0.613413,
+ 0.347794,0.132396,0.928176,4.824747,1.946835,0.626358,
+ 0.302716,0.058971,0.951255,4.852578,1.889721,0.605031,
+ 0.347878,0.028988,0.937092,4.925499,1.917814,0.613413,
+ 0.347794,0.132396,0.928176,4.824747,1.946835,0.626358,
+ 0.347878,0.028988,0.937092,4.925499,1.917814,0.613413,
+ 0.561013,0.750789,0.348684,4.897808,1.946794,0.628057,
+ 0.36359,0.089346,0.927264,4.861611,2.001639,0.621913,
+ 0.347794,0.132396,0.928176,4.824747,1.946835,0.626358,
+ 0.561013,0.750789,0.348684,4.897808,1.946794,0.628057,
+ 0.719268,0.159442,0.676189,4.925394,1.955229,0.618837,
+ 0.328548,0.219459,0.918637,4.953739,1.95258,0.592256,
+ 0.282492,0.026081,0.958915,4.973133,1.992779,0.533466,
+ 0.719268,0.159442,0.676189,4.925394,1.955229,0.618837,
+ 0.282492,0.026081,0.958915,4.973133,1.992779,0.533466,
+ 0.361081,-0.056526,0.93082,4.935561,2.016016,0.5857,
+ 0.800967,0.453079,-0.391371,5.934596,1.054796,0.077039,
+ 0.054059,0.926072,-0.373455,5.897758,1.009309,0.080583,
+ 0.535268,0.844682,0.000171,5.871947,1.021428,0.001102,
+ 0.800967,0.453079,-0.391371,5.934596,1.054796,0.077039,
+ 0.535268,0.844682,0.000171,5.871947,1.021428,0.001102,
+ 0.909103,0.416568,-0.001454,5.908782,1.066916,0.001121,
+ 0.693689,0.317887,-0.646331,5.923808,1.025283,0.153084,
+ 0.329366,0.742755,-0.582952,5.87863,0.986485,0.128292,
+ 0.054059,0.926072,-0.373455,5.897758,1.009309,0.080583,
+ 0.693689,0.317887,-0.646331,5.923808,1.025283,0.153084,
+ 0.054059,0.926072,-0.373455,5.897758,1.009309,0.080583,
+ 0.800967,0.453079,-0.391371,5.934596,1.054796,0.077039,
+ -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
+ 0.971427,0.045661,-0.232906,5.757506,0.9579,0.210732,
+ 0.329366,0.742755,-0.582952,5.87863,0.986485,0.128292,
+ -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
+ 0.329366,0.742755,-0.582952,5.87863,0.986485,0.128292,
+ 0.693689,0.317887,-0.646331,5.923808,1.025283,0.153084,
+ 0.850248,-0.122854,-0.511845,5.674999,0.950754,0.22796,
+ 0.971427,0.045661,-0.232906,5.757506,0.9579,0.210732,
+ -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
+ 0.850248,-0.122854,-0.511845,5.674999,0.950754,0.22796,
+ -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
+ 0.104327,0.725166,-0.680625,5.755282,1.004149,0.307505,
+ 0.811896,0.498733,0.303464,5.912147,1.117911,0.254197,
+ 0.969409,0.243854,0.027951,5.959462,1.157227,0.187097,
+ 0.169215,-0.167065,-0.971317,5.895899,1.18273,0.164705,
+ 0.603382,-0.138832,-0.785275,5.837875,1.141493,0.305184,
+ 0.811896,0.498733,0.303464,5.912147,1.117911,0.254197,
+ 0.169215,-0.167065,-0.971317,5.895899,1.18273,0.164705,
+ 0.603382,-0.138832,-0.785275,5.837875,1.141493,0.305184,
+ 0.169215,-0.167065,-0.971317,5.895899,1.18273,0.164705,
+ 0.054838,0.68532,-0.726174,5.849792,1.19348,0.181047,
+ 0.104604,0.236958,-0.965872,5.764774,1.279824,0.308562,
+ 0.335985,-0.093512,-0.937214,5.77341,1.225861,0.323025,
+ -0.071389,0.260053,-0.962952,5.840665,1.221942,0.187128,
+ 0.104604,0.236958,-0.965872,5.764774,1.279824,0.308562,
+ -0.071389,0.260053,-0.962952,5.840665,1.221942,0.187128,
+ -0.026478,0.945923,-0.323309,5.803425,1.260787,0.210002,
+ -0.0511,0.977083,-0.206633,5.783731,1.341471,0.28459,
+ 0.104604,0.236958,-0.965872,5.764774,1.279824,0.308562,
+ -0.026478,0.945923,-0.323309,5.803425,1.260787,0.210002,
+ 0.481644,0.842268,-0.242082,5.847989,1.311569,0.261476,
+ -0.0511,0.977083,-0.206633,5.783731,1.341471,0.28459,
+ -0.026478,0.945923,-0.323309,5.803425,1.260787,0.210002,
+ -0.071389,0.260053,-0.962952,5.840665,1.221942,0.187128,
+ 0.794567,0.588129,-0.15089,5.931474,1.233483,0.215613,
+ 0.481644,0.842268,-0.242082,5.847989,1.311569,0.261476,
+ -0.071389,0.260053,-0.962952,5.840665,1.221942,0.187128,
+ 0.481644,0.842268,-0.242082,5.847989,1.311569,0.261476,
+ -0.026478,0.945923,-0.323309,5.803425,1.260787,0.210002,
+ 0.054838,0.68532,-0.726174,5.849792,1.19348,0.181047,
+ 0.794567,0.588129,-0.15089,5.931474,1.233483,0.215613,
+ -0.071389,0.260053,-0.962952,5.840665,1.221942,0.187128,
+ 0.054838,0.68532,-0.726174,5.849792,1.19348,0.181047,
+ 0.169215,-0.167065,-0.971317,5.895899,1.18273,0.164705,
+ 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
+ 0.054838,0.68532,-0.726174,5.849792,1.19348,0.181047,
+ 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
+ 0.794567,0.588129,-0.15089,5.931474,1.233483,0.215613,
+ -0.03479,0.696668,-0.716549,5.573803,0.952578,0.243886,
+ 0.850248,-0.122854,-0.511845,5.674999,0.950754,0.22796,
+ 0.104327,0.725166,-0.680625,5.755282,1.004149,0.307505,
+ -0.03479,0.696668,-0.716549,5.573803,0.952578,0.243886,
+ 0.104327,0.725166,-0.680625,5.755282,1.004149,0.307505,
+ -0.011269,-0.268801,-0.96313,5.672385,1.007694,0.341778,
+ -0.03479,0.696668,-0.716549,5.573803,0.952578,0.243886,
+ -0.011269,-0.268801,-0.96313,5.672385,1.007694,0.341778,
+ -0.01139,0.953897,-0.299918,5.580727,0.99933,0.349867,
+ -0.151742,0.274295,-0.949598,5.535184,0.98018,0.341257,
+ -0.03479,0.696668,-0.716549,5.573803,0.952578,0.243886,
+ -0.01139,0.953897,-0.299918,5.580727,0.99933,0.349867,
+ 0.176955,-0.903058,0.391373,5.546347,0.916044,0.246782,
+ 0.571342,-0.680689,-0.45851,5.638369,0.904402,0.222548,
+ 0.850248,-0.122854,-0.511845,5.674999,0.950754,0.22796,
+ 0.176955,-0.903058,0.391373,5.546347,0.916044,0.246782,
+ 0.850248,-0.122854,-0.511845,5.674999,0.950754,0.22796,
+ -0.03479,0.696668,-0.716549,5.573803,0.952578,0.243886,
+ 0.571342,-0.680689,-0.45851,5.638369,0.904402,0.222548,
+ 0.388502,-0.6643,-0.63857,5.748613,0.92049,0.205099,
+ 0.971427,0.045661,-0.232906,5.757506,0.9579,0.210732,
+ 0.571342,-0.680689,-0.45851,5.638369,0.904402,0.222548,
+ 0.971427,0.045661,-0.232906,5.757506,0.9579,0.210732,
+ 0.850248,-0.122854,-0.511845,5.674999,0.950754,0.22796,
+ 0.971427,0.045661,-0.232906,5.757506,0.9579,0.210732,
+ 0.388502,-0.6643,-0.63857,5.748613,0.92049,0.205099,
+ 0.20994,-0.930128,0.301309,5.851404,0.929008,0.105362,
+ 0.971427,0.045661,-0.232906,5.757506,0.9579,0.210732,
+ 0.20994,-0.930128,0.301309,5.851404,0.929008,0.105362,
+ 0.329366,0.742755,-0.582952,5.87863,0.986485,0.128292,
+ 0.054059,0.926072,-0.373455,5.897758,1.009309,0.080583,
+ 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
+ 0.535268,0.844682,0.000171,5.871947,1.021428,0.001102,
+ 0.329366,0.742755,-0.582952,5.87863,0.986485,0.128292,
+ 0.20994,-0.930128,0.301309,5.851404,0.929008,0.105362,
+ 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
+ 0.329366,0.742755,-0.582952,5.87863,0.986485,0.128292,
+ 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
+ 0.054059,0.926072,-0.373455,5.897758,1.009309,0.080583,
+ 0.169215,-0.167065,-0.971317,5.895899,1.18273,0.164705,
+ 0.969409,0.243854,0.027951,5.959462,1.157227,0.187097,
+ 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
+ 0.054838,0.68532,-0.726174,5.849792,1.19348,0.181047,
+ -0.071389,0.260053,-0.962952,5.840665,1.221942,0.187128,
+ 0.335985,-0.093512,-0.937214,5.77341,1.225861,0.323025,
+ 0.054838,0.68532,-0.726174,5.849792,1.19348,0.181047,
+ 0.335985,-0.093512,-0.937214,5.77341,1.225861,0.323025,
+ 0.603382,-0.138832,-0.785275,5.837875,1.141493,0.305184,
+ 0.083641,-0.81989,0.566378,5.480649,0.941387,0.316248,
+ 0.176955,-0.903058,0.391373,5.546347,0.916044,0.246782,
+ -0.03479,0.696668,-0.716549,5.573803,0.952578,0.243886,
+ 0.083641,-0.81989,0.566378,5.480649,0.941387,0.316248,
+ -0.03479,0.696668,-0.716549,5.573803,0.952578,0.243886,
+ -0.151742,0.274295,-0.949598,5.535184,0.98018,0.341257,
+ 0.719268,0.159442,0.676189,4.925394,1.955229,0.618837,
+ 0.361081,-0.056526,0.93082,4.935561,2.016016,0.5857,
+ 0.36359,0.089346,0.927264,4.861611,2.001639,0.621913,
+ 0.719268,0.159442,0.676189,4.925394,1.955229,0.618837,
+ 0.36359,0.089346,0.927264,4.861611,2.001639,0.621913,
+ 0.561013,0.750789,0.348684,4.897808,1.946794,0.628057
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,336,data,NULL};
+const struct gllist *cow_face=&frame;
diff --git a/hacks/glx/cow_hide.c b/hacks/glx/cow_hide.c
new file mode 100644
index 0000000..3728eef
--- /dev/null
+++ b/hacks/glx/cow_hide.c
@@ -0,0 +1,13055 @@
+#include "gllist.h"
+static const float data[]={
+ -0.012663,0.029084,-0.999497,2.229345,-0.992723,-0.862826,
+ -0.096144,-0.182414,-0.97851,2.292449,-0.871852,-0.8824,
+ 0.795625,-0.129968,-0.591684,2.410367,-0.777999,-0.841105,
+ -0.012663,0.029084,-0.999497,2.229345,-0.992723,-0.862826,
+ 0.795625,-0.129968,-0.591684,2.410367,-0.777999,-0.841105,
+ -0.200187,-0.124247,-0.971848,2.407309,-0.97498,-0.805091,
+ -0.200187,-0.124247,-0.971848,2.407309,-0.97498,-0.805091,
+ 0.795625,-0.129968,-0.591684,2.410367,-0.777999,-0.841105,
+ 0.908163,-0.140074,-0.394486,2.5392,-0.727778,-0.750475,
+ -0.200187,-0.124247,-0.971848,2.407309,-0.97498,-0.805091,
+ 0.908163,-0.140074,-0.394486,2.5392,-0.727778,-0.750475,
+ 0.023112,-0.187685,-0.981957,2.520417,-0.954785,-0.739445,
+ 0.023112,-0.187685,-0.981957,2.520417,-0.954785,-0.739445,
+ 0.908163,-0.140074,-0.394486,2.5392,-0.727778,-0.750475,
+ 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
+ 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
+ 0.709718,-0.453838,-0.538824,2.669281,-0.930664,-0.557166,
+ 0.4379,-0.250054,-0.863549,2.514167,-1.077721,-0.706614,
+ 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
+ 0.4379,-0.250054,-0.863549,2.514167,-1.077721,-0.706614,
+ 0.023112,-0.187685,-0.981957,2.520417,-0.954785,-0.739445,
+ 0.023112,-0.187685,-0.981957,2.520417,-0.954785,-0.739445,
+ 0.4379,-0.250054,-0.863549,2.514167,-1.077721,-0.706614,
+ 0.6483,-0.171023,-0.741928,2.386465,-1.116066,-0.761367,
+ 0.023112,-0.187685,-0.981957,2.520417,-0.954785,-0.739445,
+ 0.6483,-0.171023,-0.741928,2.386465,-1.116066,-0.761367,
+ -0.200187,-0.124247,-0.971848,2.407309,-0.97498,-0.805091,
+ -0.200187,-0.124247,-0.971848,2.407309,-0.97498,-0.805091,
+ 0.6483,-0.171023,-0.741928,2.386465,-1.116066,-0.761367,
+ 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
+ -0.200187,-0.124247,-0.971848,2.407309,-0.97498,-0.805091,
+ 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
+ -0.012663,0.029084,-0.999497,2.229345,-0.992723,-0.862826,
+ 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
+ 0.6483,-0.171023,-0.741928,2.386465,-1.116066,-0.761367,
+ 0.71475,-0.118625,-0.689246,2.354287,-1.193746,-0.735189,
+ 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
+ 0.71475,-0.118625,-0.689246,2.354287,-1.193746,-0.735189,
+ 0.608407,-0.244593,-0.754993,2.158051,-1.209613,-0.783941,
+ 0.608407,-0.244593,-0.754993,2.158051,-1.209613,-0.783941,
+ 0.71475,-0.118625,-0.689246,2.354287,-1.193746,-0.735189,
+ 0.370396,-0.365961,-0.853744,2.318787,-1.29409,-0.673863,
+ 0.608407,-0.244593,-0.754993,2.158051,-1.209613,-0.783941,
+ 0.370396,-0.365961,-0.853744,2.318787,-1.29409,-0.673863,
+ 0.727678,-0.414895,-0.546211,2.126237,-1.330172,-0.721011,
+ 0.727678,-0.414895,-0.546211,2.126237,-1.330172,-0.721011,
+ 0.370396,-0.365961,-0.853744,2.318787,-1.29409,-0.673863,
+ 0.324748,-0.466051,-0.823003,2.274533,-1.433487,-0.567366,
+ 0.324748,-0.466051,-0.823003,2.274533,-1.433487,-0.567366,
+ 0.370396,-0.365961,-0.853744,2.318787,-1.29409,-0.673863,
+ 0.727708,-0.453484,-0.514581,2.486533,-1.274971,-0.627822,
+ 0.324748,-0.466051,-0.823003,2.274533,-1.433487,-0.567366,
+ 0.727708,-0.453484,-0.514581,2.486533,-1.274971,-0.627822,
+ 0.287759,-0.574148,-0.766517,2.45706,-1.400958,-0.539866,
+ 0.287759,-0.574148,-0.766517,2.45706,-1.400958,-0.539866,
+ 0.727708,-0.453484,-0.514581,2.486533,-1.274971,-0.627822,
+ 0.677632,-0.514013,-0.525933,2.549322,-1.335209,-0.535156,
+ 0.677632,-0.514013,-0.525933,2.549322,-1.335209,-0.535156,
+ 0.727708,-0.453484,-0.514581,2.486533,-1.274971,-0.627822,
+ 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
+ 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
+ 0.727708,-0.453484,-0.514581,2.486533,-1.274971,-0.627822,
+ 0.478274,-0.500384,-0.721713,2.510841,-1.158786,-0.678057,
+ 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
+ 0.478274,-0.500384,-0.721713,2.510841,-1.158786,-0.678057,
+ 0.245892,-0.489895,-0.836385,2.670253,-1.108365,-0.544018,
+ 0.478274,-0.500384,-0.721713,2.510841,-1.158786,-0.678057,
+ 0.727708,-0.453484,-0.514581,2.486533,-1.274971,-0.627822,
+ 0.370396,-0.365961,-0.853744,2.318787,-1.29409,-0.673863,
+ 0.478274,-0.500384,-0.721713,2.510841,-1.158786,-0.678057,
+ 0.370396,-0.365961,-0.853744,2.318787,-1.29409,-0.673863,
+ 0.71475,-0.118625,-0.689246,2.354287,-1.193746,-0.735189,
+ 0.71475,-0.118625,-0.689246,2.354287,-1.193746,-0.735189,
+ 0.6483,-0.171023,-0.741928,2.386465,-1.116066,-0.761367,
+ 0.4379,-0.250054,-0.863549,2.514167,-1.077721,-0.706614,
+ 0.71475,-0.118625,-0.689246,2.354287,-1.193746,-0.735189,
+ 0.4379,-0.250054,-0.863549,2.514167,-1.077721,-0.706614,
+ 0.478274,-0.500384,-0.721713,2.510841,-1.158786,-0.678057,
+ 0.478274,-0.500384,-0.721713,2.510841,-1.158786,-0.678057,
+ 0.4379,-0.250054,-0.863549,2.514167,-1.077721,-0.706614,
+ 0.709718,-0.453838,-0.538824,2.669281,-0.930664,-0.557166,
+ 0.478274,-0.500384,-0.721713,2.510841,-1.158786,-0.678057,
+ 0.709718,-0.453838,-0.538824,2.669281,-0.930664,-0.557166,
+ 0.245892,-0.489895,-0.836385,2.670253,-1.108365,-0.544018,
+ 0.709718,-0.453838,-0.538824,2.669281,-0.930664,-0.557166,
+ 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
+ 0.430574,-0.353967,-0.830249,2.710721,-0.830091,-0.532493,
+ 0.245892,-0.489895,-0.836385,2.670253,-1.108365,-0.544018,
+ 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
+ 0.543412,-0.359347,-0.758665,2.757946,-1.099958,-0.471684,
+ 0.543412,-0.359347,-0.758665,2.757946,-1.099958,-0.471684,
+ 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
+ 0.245892,-0.489895,-0.836385,2.670253,-1.108365,-0.544018,
+ 0.543412,-0.359347,-0.758665,2.757946,-1.099958,-0.471684,
+ 0.663699,-0.195183,-0.722085,2.847364,-1.103812,-0.402301,
+ 0.675576,-0.202498,-0.708937,2.803736,-1.255869,-0.438328,
+ 0.543412,-0.359347,-0.758665,2.757946,-1.099958,-0.471684,
+ 0.675576,-0.202498,-0.708937,2.803736,-1.255869,-0.438328,
+ 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
+ 0.663699,-0.195183,-0.722085,2.847364,-1.103812,-0.402301,
+ 0.543412,-0.359347,-0.758665,2.757946,-1.099958,-0.471684,
+ 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
+ 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
+ 0.675576,-0.202498,-0.708937,2.803736,-1.255869,-0.438328,
+ 0.655995,-0.105886,-0.747301,2.740886,-1.339225,-0.463604,
+ 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
+ 0.655995,-0.105886,-0.747301,2.740886,-1.339225,-0.463604,
+ 0.594643,-0.107364,-0.796789,2.663024,-1.440487,-0.478149,
+ 0.290845,-0.56858,-0.769497,2.61797,-1.235597,-0.520238,
+ 0.594643,-0.107364,-0.796789,2.663024,-1.440487,-0.478149,
+ 0.677632,-0.514013,-0.525933,2.549322,-1.335209,-0.535156,
+ 0.677632,-0.514013,-0.525933,2.549322,-1.335209,-0.535156,
+ 0.594643,-0.107364,-0.796789,2.663024,-1.440487,-0.478149,
+ 0.648132,-0.027411,-0.761034,2.515314,-1.507063,-0.483275,
+ 0.677632,-0.514013,-0.525933,2.549322,-1.335209,-0.535156,
+ 0.648132,-0.027411,-0.761034,2.515314,-1.507063,-0.483275,
+ 0.287759,-0.574148,-0.766517,2.45706,-1.400958,-0.539866,
+ 0.287759,-0.574148,-0.766517,2.45706,-1.400958,-0.539866,
+ 0.648132,-0.027411,-0.761034,2.515314,-1.507063,-0.483275,
+ 0.58512,-0.108234,-0.803692,2.422296,-1.510915,-0.494169,
+ 0.287759,-0.574148,-0.766517,2.45706,-1.400958,-0.539866,
+ 0.58512,-0.108234,-0.803692,2.422296,-1.510915,-0.494169,
+ 0.518786,-0.204527,-0.830078,2.249663,-1.492705,-0.53127,
+ 0.287759,-0.574148,-0.766517,2.45706,-1.400958,-0.539866,
+ 0.518786,-0.204527,-0.830078,2.249663,-1.492705,-0.53127,
+ 0.324748,-0.466051,-0.823003,2.274533,-1.433487,-0.567366,
+ 0.324748,-0.466051,-0.823003,2.274533,-1.433487,-0.567366,
+ 0.518786,-0.204527,-0.830078,2.249663,-1.492705,-0.53127,
+ 0.437631,-0.408484,-0.801012,2.0796,-1.473377,-0.654997,
+ 0.324748,-0.466051,-0.823003,2.274533,-1.433487,-0.567366,
+ 0.437631,-0.408484,-0.801012,2.0796,-1.473377,-0.654997,
+ 0.727678,-0.414895,-0.546211,2.126237,-1.330172,-0.721011,
+ 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
+ 0.189478,-0.558571,-0.807525,2.960118,-0.941827,-0.284743,
+ 0.112446,-0.61866,-0.77757,2.928787,-1.107467,-0.312054,
+ 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
+ 0.112446,-0.61866,-0.77757,2.928787,-1.107467,-0.312054,
+ 0.663699,-0.195183,-0.722085,2.847364,-1.103812,-0.402301,
+ 0.663699,-0.195183,-0.722085,2.847364,-1.103812,-0.402301,
+ 0.112446,-0.61866,-0.77757,2.928787,-1.107467,-0.312054,
+ 0.276661,-0.626708,-0.728489,2.893096,-1.302168,-0.332049,
+ 0.663699,-0.195183,-0.722085,2.847364,-1.103812,-0.402301,
+ 0.276661,-0.626708,-0.728489,2.893096,-1.302168,-0.332049,
+ 0.675576,-0.202498,-0.708937,2.803736,-1.255869,-0.438328,
+ 0.675576,-0.202498,-0.708937,2.803736,-1.255869,-0.438328,
+ 0.276661,-0.626708,-0.728489,2.893096,-1.302168,-0.332049,
+ 0.690473,-0.61586,-0.379425,2.824356,-1.407256,-0.355013,
+ 0.675576,-0.202498,-0.708937,2.803736,-1.255869,-0.438328,
+ 0.690473,-0.61586,-0.379425,2.824356,-1.407256,-0.355013,
+ 0.655995,-0.105886,-0.747301,2.740886,-1.339225,-0.463604,
+ 0.690473,-0.61586,-0.379425,2.824356,-1.407256,-0.355013,
+ 0.883063,-0.251635,-0.396079,2.721135,-1.520418,-0.362378,
+ 0.594643,-0.107364,-0.796789,2.663024,-1.440487,-0.478149,
+ 0.594643,-0.107364,-0.796789,2.663024,-1.440487,-0.478149,
+ 0.883063,-0.251635,-0.396079,2.721135,-1.520418,-0.362378,
+ 0.918784,-0.122699,-0.375208,2.545261,-1.5933,-0.38631,
+ 0.594643,-0.107364,-0.796789,2.663024,-1.440487,-0.478149,
+ 0.918784,-0.122699,-0.375208,2.545261,-1.5933,-0.38631,
+ 0.648132,-0.027411,-0.761034,2.515314,-1.507063,-0.483275,
+ 0.648132,-0.027411,-0.761034,2.515314,-1.507063,-0.483275,
+ 0.918784,-0.122699,-0.375208,2.545261,-1.5933,-0.38631,
+ 0.876436,-0.293555,-0.381688,2.396607,-1.593239,-0.389972,
+ 0.648132,-0.027411,-0.761034,2.515314,-1.507063,-0.483275,
+ 0.876436,-0.293555,-0.381688,2.396607,-1.593239,-0.389972,
+ 0.58512,-0.108234,-0.803692,2.422296,-1.510915,-0.494169,
+ 0.58512,-0.108234,-0.803692,2.422296,-1.510915,-0.494169,
+ 0.876436,-0.293555,-0.381688,2.396607,-1.593239,-0.389972,
+ 0.728904,-0.519576,-0.445802,2.243492,-1.584783,-0.431143,
+ 0.58512,-0.108234,-0.803692,2.422296,-1.510915,-0.494169,
+ 0.728904,-0.519576,-0.445802,2.243492,-1.584783,-0.431143,
+ 0.518786,-0.204527,-0.830078,2.249663,-1.492705,-0.53127,
+ 0.518786,-0.204527,-0.830078,2.249663,-1.492705,-0.53127,
+ 0.728904,-0.519576,-0.445802,2.243492,-1.584783,-0.431143,
+ 0.552828,-0.750794,-0.36151,2.0482,-1.581983,-0.555832,
+ 0.518786,-0.204527,-0.830078,2.249663,-1.492705,-0.53127,
+ 0.552828,-0.750794,-0.36151,2.0482,-1.581983,-0.555832,
+ 0.437631,-0.408484,-0.801012,2.0796,-1.473377,-0.654997,
+ 0.189478,-0.558571,-0.807525,2.960118,-0.941827,-0.284743,
+ -0.334515,0.94239,0,2.970902,-0.959664,0,
+ 0.820584,-0.571526,0,2.931756,-1.129655,0,
+ 0.189478,-0.558571,-0.807525,2.960118,-0.941827,-0.284743,
+ 0.820584,-0.571526,0,2.931756,-1.129655,0,
+ 0.112446,-0.61866,-0.77757,2.928787,-1.107467,-0.312054,
+ 0.112446,-0.61866,-0.77757,2.928787,-1.107467,-0.312054,
+ 0.820584,-0.571526,0,2.931756,-1.129655,0,
+ -0.255632,0.966774,0,2.896234,-1.31956,0,
+ 0.112446,-0.61866,-0.77757,2.928787,-1.107467,-0.312054,
+ -0.255632,0.966774,0,2.896234,-1.31956,0,
+ 0.276661,-0.626708,-0.728489,2.893096,-1.302168,-0.332049,
+ 0.276661,-0.626708,-0.728489,2.893096,-1.302168,-0.332049,
+ -0.255632,0.966774,0,2.896234,-1.31956,0,
+ 0.826305,-0.563222,0,2.821376,-1.431534,0,
+ 0.276661,-0.626708,-0.728489,2.893096,-1.302168,-0.332049,
+ 0.826305,-0.563222,0,2.821376,-1.431534,0,
+ 0.690473,-0.61586,-0.379425,2.824356,-1.407256,-0.355013,
+ 0.690473,-0.61586,-0.379425,2.824356,-1.407256,-0.355013,
+ 0.826305,-0.563222,0,2.821376,-1.431534,0,
+ -0.133012,0.991114,0,2.706963,-1.528854,0,
+ 0.690473,-0.61586,-0.379425,2.824356,-1.407256,-0.355013,
+ -0.133012,0.991114,0,2.706963,-1.528854,0,
+ 0.883063,-0.251635,-0.396079,2.721135,-1.520418,-0.362378,
+ 0.883063,-0.251635,-0.396079,2.721135,-1.520418,-0.362378,
+ -0.133012,0.991114,0,2.706963,-1.528854,0,
+ 0.815341,-0.578981,0,2.534227,-1.617078,0,
+ 0.883063,-0.251635,-0.396079,2.721135,-1.520418,-0.362378,
+ 0.815341,-0.578981,0,2.534227,-1.617078,0,
+ 0.918784,-0.122699,-0.375208,2.545261,-1.5933,-0.38631,
+ 0.918784,-0.122699,-0.375208,2.545261,-1.5933,-0.38631,
+ 0.815341,-0.578981,0,2.534227,-1.617078,0,
+ -0.144073,0.989567,0,2.348182,-1.624595,0,
+ 0.918784,-0.122699,-0.375208,2.545261,-1.5933,-0.38631,
+ -0.144073,0.989567,0,2.348182,-1.624595,0,
+ 0.876436,-0.293555,-0.381688,2.396607,-1.593239,-0.389972,
+ 0.876436,-0.293555,-0.381688,2.396607,-1.593239,-0.389972,
+ -0.144073,0.989567,0,2.348182,-1.624595,0,
+ -0.073566,0.99729,0,2.167167,-1.596326,0,
+ 0.876436,-0.293555,-0.381688,2.396607,-1.593239,-0.389972,
+ -0.073566,0.99729,0,2.167167,-1.596326,0,
+ 0.728904,-0.519576,-0.445802,2.243492,-1.584783,-0.431143,
+ 0.728904,-0.519576,-0.445802,2.243492,-1.584783,-0.431143,
+ -0.073566,0.99729,0,2.167167,-1.596326,0,
+ -0.034649,0.9994,0,1.920432,-1.567396,0,
+ 0.728904,-0.519576,-0.445802,2.243492,-1.584783,-0.431143,
+ -0.034649,0.9994,0,1.920432,-1.567396,0,
+ 0.552828,-0.750794,-0.36151,2.0482,-1.581983,-0.555832,
+ 0.226413,-0.89822,-0.376747,2.881063,-0.493146,-0.521968,
+ 0.763734,0.228435,-0.603761,2.736198,-0.346225,-0.659345,
+ 0.016767,-0.927537,-0.373356,2.835437,-0.231101,-0.57789,
+ 0.016767,-0.927537,-0.373356,2.835437,-0.231101,-0.57789,
+ 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
+ 0.226413,-0.89822,-0.376747,2.881063,-0.493146,-0.521968,
+ 0.226413,-0.89822,-0.376747,2.881063,-0.493146,-0.521968,
+ 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
+ 0.08136,-0.929085,-0.360806,2.910769,-0.638444,-0.431191,
+ 0.08136,-0.929085,-0.360806,2.910769,-0.638444,-0.431191,
+ 0.295093,-0.940225,-0.16999,2.82554,-0.567578,-0.552597,
+ 0.226413,-0.89822,-0.376747,2.881063,-0.493146,-0.521968,
+ 0.226413,-0.89822,-0.376747,2.881063,-0.493146,-0.521968,
+ 0.295093,-0.940225,-0.16999,2.82554,-0.567578,-0.552597,
+ 0.769758,0.095155,-0.631204,2.688131,-0.517509,-0.672975,
+ 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
+ 0.908163,-0.140074,-0.394486,2.5392,-0.727778,-0.750475,
+ 0.771881,-0.100912,-0.627707,2.647368,-0.61155,-0.669485,
+ 0.771881,-0.100912,-0.627707,2.647368,-0.61155,-0.669485,
+ 0.908163,-0.140074,-0.394486,2.5392,-0.727778,-0.750475,
+ 0.907314,0.09913,-0.4086,2.618307,-0.549092,-0.805491,
+ 0.907314,0.09913,-0.4086,2.618307,-0.549092,-0.805491,
+ 0.769758,0.095155,-0.631204,2.688131,-0.517509,-0.672975,
+ 0.771881,-0.100912,-0.627707,2.647368,-0.61155,-0.669485,
+ 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
+ 0.295093,-0.940225,-0.16999,2.82554,-0.567578,-0.552597,
+ 0.08136,-0.929085,-0.360806,2.910769,-0.638444,-0.431191,
+ 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
+ 0.08136,-0.929085,-0.360806,2.910769,-0.638444,-0.431191,
+ 0.430574,-0.353967,-0.830249,2.710721,-0.830091,-0.532493,
+ 0.430574,-0.353967,-0.830249,2.710721,-0.830091,-0.532493,
+ 0.08136,-0.929085,-0.360806,2.910769,-0.638444,-0.431191,
+ 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
+ 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
+ 0.08136,-0.929085,-0.360806,2.910769,-0.638444,-0.431191,
+ 0.676544,-0.141883,-0.722604,2.993075,-0.708434,-0.342596,
+ 0.676544,-0.141883,-0.722604,2.993075,-0.708434,-0.342596,
+ 0.667276,-0.159228,-0.727591,3.045715,-0.767786,-0.261741,
+ 0.189478,-0.558571,-0.807525,2.960118,-0.941827,-0.284743,
+ 0.676544,-0.141883,-0.722604,2.993075,-0.708434,-0.342596,
+ 0.189478,-0.558571,-0.807525,2.960118,-0.941827,-0.284743,
+ 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
+ 0.189478,-0.558571,-0.807525,2.960118,-0.941827,-0.284743,
+ 0.667276,-0.159228,-0.727591,3.045715,-0.767786,-0.261741,
+ 0.942695,-0.333657,0,3.065544,-0.788768,0,
+ 0.189478,-0.558571,-0.807525,2.960118,-0.941827,-0.284743,
+ 0.942695,-0.333657,0,3.065544,-0.788768,0,
+ -0.334515,0.94239,0,2.970902,-0.959664,0,
+ 0.942695,-0.333657,0,3.065544,-0.788768,0,
+ 0.667276,-0.159228,-0.727591,3.045715,-0.767786,-0.261741,
+ 0.533629,-0.162705,-0.82992,3.107533,-0.691019,-0.264602,
+ 0.942695,-0.333657,0,3.065544,-0.788768,0,
+ 0.533629,-0.162705,-0.82992,3.107533,-0.691019,-0.264602,
+ -0.476715,0.879058,0,3.118124,-0.703925,0,
+ 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
+ 0.245892,-0.489895,-0.836385,2.670253,-1.108365,-0.544018,
+ 0.709718,-0.453838,-0.538824,2.669281,-0.930664,-0.557166,
+ 0.430574,-0.353967,-0.830249,2.710721,-0.830091,-0.532493,
+ 0.539192,-0.226204,-0.811236,2.857666,-0.930625,-0.391195,
+ 0.709718,-0.453838,-0.538824,2.669281,-0.930664,-0.557166,
+ 0.771881,-0.100912,-0.627707,2.647368,-0.61155,-0.669485,
+ 0.769758,0.095155,-0.631204,2.688131,-0.517509,-0.672975,
+ 0.295093,-0.940225,-0.16999,2.82554,-0.567578,-0.552597,
+ 0.720876,-0.356662,-0.594247,2.637655,-0.768176,-0.637039,
+ 0.771881,-0.100912,-0.627707,2.647368,-0.61155,-0.669485,
+ 0.295093,-0.940225,-0.16999,2.82554,-0.567578,-0.552597,
+ 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
+ 0.449624,0.075438,-0.890027,3.053144,-0.609681,-0.326931,
+ 0.676544,-0.141883,-0.722604,2.993075,-0.708434,-0.342596,
+ 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
+ 0.676544,-0.141883,-0.722604,2.993075,-0.708434,-0.342596,
+ 0.08136,-0.929085,-0.360806,2.910769,-0.638444,-0.431191,
+ 0.676544,-0.141883,-0.722604,2.993075,-0.708434,-0.342596,
+ 0.449624,0.075438,-0.890027,3.053144,-0.609681,-0.326931,
+ 0.533629,-0.162705,-0.82992,3.107533,-0.691019,-0.264602,
+ 0.676544,-0.141883,-0.722604,2.993075,-0.708434,-0.342596,
+ 0.533629,-0.162705,-0.82992,3.107533,-0.691019,-0.264602,
+ 0.667276,-0.159228,-0.727591,3.045715,-0.767786,-0.261741,
+ -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
+ -0.11636,-0.749063,-0.6522,-1.091175,-1.70712,-0.727242,
+ 0.162276,-0.745105,-0.646905,-1.226563,-1.655159,-0.687343,
+ -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
+ 0.162276,-0.745105,-0.646905,-1.226563,-1.655159,-0.687343,
+ 0.215155,-0.464575,-0.858999,-1.200688,-1.577575,-0.799188,
+ 0.215155,-0.464575,-0.858999,-1.200688,-1.577575,-0.799188,
+ 0.162276,-0.745105,-0.646905,-1.226563,-1.655159,-0.687343,
+ -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
+ 0.162276,-0.745105,-0.646905,-1.226563,-1.655159,-0.687343,
+ -0.11636,-0.749063,-0.6522,-1.091175,-1.70712,-0.727242,
+ -0.351476,-0.711504,-0.608463,-1.089642,-1.757196,-0.685154,
+ 0.162276,-0.745105,-0.646905,-1.226563,-1.655159,-0.687343,
+ -0.351476,-0.711504,-0.608463,-1.089642,-1.757196,-0.685154,
+ -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
+ -0.11636,-0.749063,-0.6522,-1.091175,-1.70712,-0.727242,
+ -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
+ -0.231653,-0.530839,-0.815198,-0.972089,-1.774507,-0.76857,
+ -0.231653,-0.530839,-0.815198,-0.972089,-1.774507,-0.76857,
+ -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
+ -0.468954,-0.586277,-0.660577,-0.812845,-1.785424,-0.768511,
+ -0.468954,-0.586277,-0.660577,-0.812845,-1.785424,-0.768511,
+ -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
+ 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
+ -0.468954,-0.586277,-0.660577,-0.812845,-1.785424,-0.768511,
+ 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
+ -0.150892,-0.83775,-0.524792,-0.680046,-1.768325,-0.81908,
+ -0.150892,-0.83775,-0.524792,-0.680046,-1.768325,-0.81908,
+ 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
+ 0.100949,-0.548551,-0.830001,-0.564074,-1.789401,-0.803191,
+ 0.100949,-0.548551,-0.830001,-0.564074,-1.789401,-0.803191,
+ 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
+ -0.4144,-0.844957,-0.338113,-0.422877,-1.7512,-0.823423,
+ -0.4144,-0.844957,-0.338113,-0.422877,-1.7512,-0.823423,
+ 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
+ 0.33122,-0.270106,-0.904067,-0.063012,-1.583021,-0.865082,
+ -0.4144,-0.844957,-0.338113,-0.422877,-1.7512,-0.823423,
+ 0.33122,-0.270106,-0.904067,-0.063012,-1.583021,-0.865082,
+ 0.327725,-0.489439,-0.808112,-0.07847,-1.688266,-0.80023,
+ -0.4144,-0.844957,-0.338113,-0.422877,-1.7512,-0.823423,
+ 0.327725,-0.489439,-0.808112,-0.07847,-1.688266,-0.80023,
+ 0.291858,-0.681117,-0.67149,-0.094135,-1.769086,-0.556924,
+ -0.4144,-0.844957,-0.338113,-0.422877,-1.7512,-0.823423,
+ 0.291858,-0.681117,-0.67149,-0.094135,-1.769086,-0.556924,
+ 0.068777,-0.757383,-0.649339,-0.543078,-1.810473,-0.563825,
+ 0.068777,-0.757383,-0.649339,-0.543078,-1.810473,-0.563825,
+ 0.100949,-0.548551,-0.830001,-0.564074,-1.789401,-0.803191,
+ -0.4144,-0.844957,-0.338113,-0.422877,-1.7512,-0.823423,
+ 0.100949,-0.548551,-0.830001,-0.564074,-1.789401,-0.803191,
+ 0.068777,-0.757383,-0.649339,-0.543078,-1.810473,-0.563825,
+ -0.150892,-0.83775,-0.524792,-0.680046,-1.768325,-0.81908,
+ -0.150892,-0.83775,-0.524792,-0.680046,-1.768325,-0.81908,
+ 0.068777,-0.757383,-0.649339,-0.543078,-1.810473,-0.563825,
+ -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
+ -0.150892,-0.83775,-0.524792,-0.680046,-1.768325,-0.81908,
+ -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
+ -0.468954,-0.586277,-0.660577,-0.812845,-1.785424,-0.768511,
+ -0.351476,-0.711504,-0.608463,-1.089642,-1.757196,-0.685154,
+ -0.11636,-0.749063,-0.6522,-1.091175,-1.70712,-0.727242,
+ -0.231653,-0.530839,-0.815198,-0.972089,-1.774507,-0.76857,
+ -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
+ -0.351476,-0.711504,-0.608463,-1.089642,-1.757196,-0.685154,
+ -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
+ -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
+ -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
+ -0.176655,-0.950799,-0.254508,-1.108758,-1.770749,-0.473033,
+ -0.176655,-0.950799,-0.254508,-1.108758,-1.770749,-0.473033,
+ -0.079302,-0.84299,-0.532051,-1.305099,-1.70846,-0.48423,
+ -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
+ -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
+ -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
+ 0.162276,-0.745105,-0.646905,-1.226563,-1.655159,-0.687343,
+ -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
+ -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
+ -0.094238,-0.851252,-0.516225,-1.397474,-1.693815,-0.570541,
+ -0.53858,-0.616299,-0.57455,-1.386502,-1.718441,-0.350823,
+ -0.171647,-0.971664,-0.162499,-1.406693,-1.697325,-0.450399,
+ -0.079302,-0.84299,-0.532051,-1.305099,-1.70846,-0.48423,
+ -0.53858,-0.616299,-0.57455,-1.386502,-1.718441,-0.350823,
+ -0.079302,-0.84299,-0.532051,-1.305099,-1.70846,-0.48423,
+ -0.040019,-0.929968,-0.365457,-0.972514,-1.822778,-0.372649,
+ -0.040019,-0.929968,-0.365457,-0.972514,-1.822778,-0.372649,
+ -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
+ 0.068777,-0.757383,-0.649339,-0.543078,-1.810473,-0.563825,
+ -0.040019,-0.929968,-0.365457,-0.972514,-1.822778,-0.372649,
+ 0.068777,-0.757383,-0.649339,-0.543078,-1.810473,-0.563825,
+ 0.023352,-0.872807,-0.487506,-0.523838,-1.850065,-0.388007,
+ 0.023352,-0.872807,-0.487506,-0.523838,-1.850065,-0.388007,
+ 0.068777,-0.757383,-0.649339,-0.543078,-1.810473,-0.563825,
+ 0.291858,-0.681117,-0.67149,-0.094135,-1.769086,-0.556924,
+ 0.023352,-0.872807,-0.487506,-0.523838,-1.850065,-0.388007,
+ 0.291858,-0.681117,-0.67149,-0.094135,-1.769086,-0.556924,
+ 0.248915,-0.807091,-0.535392,-0.112666,-1.806584,-0.383324,
+ 0.248915,-0.807091,-0.535392,-0.112666,-1.806584,-0.383324,
+ 0.291858,-0.681117,-0.67149,-0.094135,-1.769086,-0.556924,
+ 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
+ 0.248915,-0.807091,-0.535392,-0.112666,-1.806584,-0.383324,
+ 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
+ 0.383978,-0.566345,-0.729256,0.480235,-1.631521,-0.401961,
+ 0.383978,-0.566345,-0.729256,0.480235,-1.631521,-0.401961,
+ 0.226963,-0.973903,0,0.44655,-1.67295,0,
+ -0.084764,-0.996401,0,-0.155114,-1.828285,0,
+ 0.383978,-0.566345,-0.729256,0.480235,-1.631521,-0.401961,
+ -0.084764,-0.996401,0,-0.155114,-1.828285,0,
+ 0.248915,-0.807091,-0.535392,-0.112666,-1.806584,-0.383324,
+ 0.248915,-0.807091,-0.535392,-0.112666,-1.806584,-0.383324,
+ -0.084764,-0.996401,0,-0.155114,-1.828285,0,
+ 0.854132,-0.520056,0,-0.530369,-1.860806,0,
+ 0.248915,-0.807091,-0.535392,-0.112666,-1.806584,-0.383324,
+ 0.854132,-0.520056,0,-0.530369,-1.860806,0,
+ 0.023352,-0.872807,-0.487506,-0.523838,-1.850065,-0.388007,
+ 0.023352,-0.872807,-0.487506,-0.523838,-1.850065,-0.388007,
+ 0.854132,-0.520056,0,-0.530369,-1.860806,0,
+ 0.113474,-0.993541,0,-0.956007,-1.825728,0,
+ 0.023352,-0.872807,-0.487506,-0.523838,-1.850065,-0.388007,
+ 0.113474,-0.993541,0,-0.956007,-1.825728,0,
+ -0.040019,-0.929968,-0.365457,-0.972514,-1.822778,-0.372649,
+ -0.040019,-0.929968,-0.365457,-0.972514,-1.822778,-0.372649,
+ 0.113474,-0.993541,0,-0.956007,-1.825728,0,
+ 0.011286,0.999936,0,-1.395728,-1.723811,0,
+ -0.040019,-0.929968,-0.365457,-0.972514,-1.822778,-0.372649,
+ 0.011286,0.999936,0,-1.395728,-1.723811,0,
+ -0.53858,-0.616299,-0.57455,-1.386502,-1.718441,-0.350823,
+ -0.351476,-0.711504,-0.608463,-1.089642,-1.757196,-0.685154,
+ -0.231653,-0.530839,-0.815198,-0.972089,-1.774507,-0.76857,
+ -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
+ -0.468954,-0.586277,-0.660577,-0.812845,-1.785424,-0.768511,
+ -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
+ -0.231653,-0.530839,-0.815198,-0.972089,-1.774507,-0.76857,
+ -0.024032,-0.835976,0.54824,1.734568,-2.965876,-0.986396,
+ -0.246054,-0.154918,-0.956796,1.718315,-2.775468,-0.921796,
+ -0.069043,-0.157333,-0.985129,1.771416,-2.769024,-0.9461,
+ -0.024032,-0.835976,0.54824,1.734568,-2.965876,-0.986396,
+ -0.069043,-0.157333,-0.985129,1.771416,-2.769024,-0.9461,
+ -0.044013,0.340434,-0.939238,1.806371,-2.949735,-0.984058,
+ -0.1083,-0.048546,0.992932,1.911792,-2.895773,-0.950117,
+ 0.820312,-0.193024,-0.538358,1.880971,-2.733242,-0.8902,
+ 0.186476,0.252953,-0.949337,1.960643,-2.71286,-0.90089,
+ -0.1083,-0.048546,0.992932,1.911792,-2.895773,-0.950117,
+ 0.186476,0.252953,-0.949337,1.960643,-2.71286,-0.90089,
+ 0.43768,-0.823149,0.361748,2.021366,-2.881725,-0.945561,
+ 0.43768,-0.823149,0.361748,2.021366,-2.881725,-0.945561,
+ 0.186476,0.252953,-0.949337,1.960643,-2.71286,-0.90089,
+ -0.247433,-0.24804,-0.936618,1.994078,-2.713047,-0.824553,
+ 0.43768,-0.823149,0.361748,2.021366,-2.881725,-0.945561,
+ -0.247433,-0.24804,-0.936618,1.994078,-2.713047,-0.824553,
+ -0.671694,-0.023528,-0.740455,2.057496,-2.887282,-0.844225,
+ -0.024032,-0.835976,0.54824,1.734568,-2.965876,-0.986396,
+ -0.044013,0.340434,-0.939238,1.806371,-2.949735,-0.984058,
+ -0.088841,0.02472,-0.995739,1.735077,-3.022732,-0.972751,
+ -0.088841,0.02472,-0.995739,1.735077,-3.022732,-0.972751,
+ 0.57446,0.218241,-0.788902,1.802387,-3.089615,-0.961851,
+ 0.526213,0.349004,-0.775433,1.721745,-3.116887,-0.979111,
+ 0.526213,0.349004,-0.775433,1.721745,-3.116887,-0.979111,
+ 0.57446,0.218241,-0.788902,1.802387,-3.089615,-0.961851,
+ 0.926951,0.366239,0.081429,1.811797,-3.135641,-0.933096,
+ 0.43768,-0.823149,0.361748,2.021366,-2.881725,-0.945561,
+ -0.671694,-0.023528,-0.740455,2.057496,-2.887282,-0.844225,
+ 0.672893,0.661099,-0.331908,2.113587,-3.011851,-0.851648,
+ 0.43768,-0.823149,0.361748,2.021366,-2.881725,-0.945561,
+ 0.672893,0.661099,-0.331908,2.113587,-3.011851,-0.851648,
+ -0.541077,0.245809,-0.804247,2.091539,-3.032437,-0.947029,
+ -0.1083,-0.048546,0.992932,1.911792,-2.895773,-0.950117,
+ -0.496829,-0.096649,-0.86245,1.848272,-2.92726,-0.996966,
+ -0.845931,-0.255219,0.468256,1.830669,-2.736121,-0.903313,
+ -0.1083,-0.048546,0.992932,1.911792,-2.895773,-0.950117,
+ -0.845931,-0.255219,0.468256,1.830669,-2.736121,-0.903313,
+ 0.820312,-0.193024,-0.538358,1.880971,-2.733242,-0.8902,
+ -0.044013,0.340434,-0.939238,1.806371,-2.949735,-0.984058,
+ -0.069043,-0.157333,-0.985129,1.771416,-2.769024,-0.9461,
+ -0.845931,-0.255219,0.468256,1.830669,-2.736121,-0.903313,
+ -0.044013,0.340434,-0.939238,1.806371,-2.949735,-0.984058,
+ -0.845931,-0.255219,0.468256,1.830669,-2.736121,-0.903313,
+ -0.496829,-0.096649,-0.86245,1.848272,-2.92726,-0.996966,
+ -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
+ -0.088841,0.02472,-0.995739,1.735077,-3.022732,-0.972751,
+ 0.526213,0.349004,-0.775433,1.721745,-3.116887,-0.979111,
+ -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
+ 0.526213,0.349004,-0.775433,1.721745,-3.116887,-0.979111,
+ -0.874488,-0.088621,-0.476882,1.709173,-3.133145,-0.80794,
+ -0.874488,-0.088621,-0.476882,1.709173,-3.133145,-0.80794,
+ 0.526213,0.349004,-0.775433,1.721745,-3.116887,-0.979111,
+ 0.926951,0.366239,0.081429,1.811797,-3.135641,-0.933096,
+ -0.874488,-0.088621,-0.476882,1.709173,-3.133145,-0.80794,
+ 0.926951,0.366239,0.081429,1.811797,-3.135641,-0.933096,
+ -0.783521,-0.393963,-0.480508,1.806407,-3.173343,-0.834455,
+ -0.967491,-0.143323,0.208372,1.741854,-3.114181,-0.700705,
+ -0.874488,-0.088621,-0.476882,1.709173,-3.133145,-0.80794,
+ -0.783521,-0.393963,-0.480508,1.806407,-3.173343,-0.834455,
+ -0.967491,-0.143323,0.208372,1.741854,-3.114181,-0.700705,
+ -0.783521,-0.393963,-0.480508,1.806407,-3.173343,-0.834455,
+ -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
+ -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
+ -0.874488,-0.088621,-0.476882,1.709173,-3.133145,-0.80794,
+ -0.967491,-0.143323,0.208372,1.741854,-3.114181,-0.700705,
+ -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
+ -0.967491,-0.143323,0.208372,1.741854,-3.114181,-0.700705,
+ -0.343436,-0.507052,0.790537,1.776024,-2.980086,-0.707575,
+ -0.343436,-0.507052,0.790537,1.776024,-2.980086,-0.707575,
+ 0.056398,-0.684481,0.726846,1.736425,-2.743683,-0.736866,
+ 0.21689,-0.976039,0.017487,1.700797,-2.794792,-0.82425,
+ -0.343436,-0.507052,0.790537,1.776024,-2.980086,-0.707575,
+ 0.21689,-0.976039,0.017487,1.700797,-2.794792,-0.82425,
+ -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
+ 0.43768,-0.823149,0.361748,2.021366,-2.881725,-0.945561,
+ -0.541077,0.245809,-0.804247,2.091539,-3.032437,-0.947029,
+ 0.872426,0.488735,0.003222,1.980621,-3.043895,-0.964237,
+ 0.43768,-0.823149,0.361748,2.021366,-2.881725,-0.945561,
+ 0.872426,0.488735,0.003222,1.980621,-3.043895,-0.964237,
+ -0.1083,-0.048546,0.992932,1.911792,-2.895773,-0.950117,
+ 0.872426,0.488735,0.003222,1.980621,-3.043895,-0.964237,
+ -0.069765,-0.126006,0.989573,1.898573,-3.068274,-0.994338,
+ -0.496829,-0.096649,-0.86245,1.848272,-2.92726,-0.996966,
+ 0.872426,0.488735,0.003222,1.980621,-3.043895,-0.964237,
+ -0.496829,-0.096649,-0.86245,1.848272,-2.92726,-0.996966,
+ -0.1083,-0.048546,0.992932,1.911792,-2.895773,-0.950117,
+ -0.496829,-0.096649,-0.86245,1.848272,-2.92726,-0.996966,
+ -0.069765,-0.126006,0.989573,1.898573,-3.068274,-0.994338,
+ 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
+ -0.496829,-0.096649,-0.86245,1.848272,-2.92726,-0.996966,
+ 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
+ -0.044013,0.340434,-0.939238,1.806371,-2.949735,-0.984058,
+ 0.57446,0.218241,-0.788902,1.802387,-3.089615,-0.961851,
+ 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
+ 0.926951,0.366239,0.081429,1.811797,-3.135641,-0.933096,
+ -0.088841,0.02472,-0.995739,1.735077,-3.022732,-0.972751,
+ -0.044013,0.340434,-0.939238,1.806371,-2.949735,-0.984058,
+ 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
+ -0.088841,0.02472,-0.995739,1.735077,-3.022732,-0.972751,
+ 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
+ 0.57446,0.218241,-0.788902,1.802387,-3.089615,-0.961851,
+ -0.088841,0.02472,-0.995739,1.735077,-3.022732,-0.972751,
+ -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
+ -0.024032,-0.835976,0.54824,1.734568,-2.965876,-0.986396,
+ 0.672893,0.661099,-0.331908,2.113587,-3.011851,-0.851648,
+ -0.671694,-0.023528,-0.740455,2.057496,-2.887282,-0.844225,
+ -0.990285,-0.10079,0.095796,2.001343,-2.847715,-0.762517,
+ 0.672893,0.661099,-0.331908,2.113587,-3.011851,-0.851648,
+ -0.990285,-0.10079,0.095796,2.001343,-2.847715,-0.762517,
+ -0.701253,0.091018,0.707079,2.07369,-3.020848,-0.782654,
+ -0.967491,-0.143323,0.208372,1.741854,-3.114181,-0.700705,
+ -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
+ 0.963394,-0.268066,-0.003702,1.857471,-2.950722,-0.669988,
+ -0.967491,-0.143323,0.208372,1.741854,-3.114181,-0.700705,
+ 0.963394,-0.268066,-0.003702,1.857471,-2.950722,-0.669988,
+ -0.343436,-0.507052,0.790537,1.776024,-2.980086,-0.707575,
+ -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
+ 0.714275,0.465374,0.522723,1.998099,-3.039955,-0.718855,
+ 0.81992,-0.126246,0.558385,1.945632,-2.87671,-0.703118,
+ -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
+ 0.81992,-0.126246,0.558385,1.945632,-2.87671,-0.703118,
+ 0.963394,-0.268066,-0.003702,1.857471,-2.950722,-0.669988,
+ 0.714275,0.465374,0.522723,1.998099,-3.039955,-0.718855,
+ -0.701253,0.091018,0.707079,2.07369,-3.020848,-0.782654,
+ -0.990285,-0.10079,0.095796,2.001343,-2.847715,-0.762517,
+ 0.714275,0.465374,0.522723,1.998099,-3.039955,-0.718855,
+ -0.990285,-0.10079,0.095796,2.001343,-2.847715,-0.762517,
+ 0.81992,-0.126246,0.558385,1.945632,-2.87671,-0.703118,
+ 0.963394,-0.268066,-0.003702,1.857471,-2.950722,-0.669988,
+ 0.81992,-0.126246,0.558385,1.945632,-2.87671,-0.703118,
+ 0.751149,0.43192,0.49922,1.884318,-2.724404,-0.701999,
+ 0.963394,-0.268066,-0.003702,1.857471,-2.950722,-0.669988,
+ 0.751149,0.43192,0.49922,1.884318,-2.724404,-0.701999,
+ 0.975634,-0.187232,0.114377,1.841282,-2.716008,-0.708009,
+ 0.751149,0.43192,0.49922,1.884318,-2.724404,-0.701999,
+ 0.81992,-0.126246,0.558385,1.945632,-2.87671,-0.703118,
+ -0.990285,-0.10079,0.095796,2.001343,-2.847715,-0.762517,
+ 0.751149,0.43192,0.49922,1.884318,-2.724404,-0.701999,
+ -0.990285,-0.10079,0.095796,2.001343,-2.847715,-0.762517,
+ -0.062994,-0.00854,0.997977,1.972647,-2.728848,-0.772496,
+ -0.343436,-0.507052,0.790537,1.776024,-2.980086,-0.707575,
+ 0.963394,-0.268066,-0.003702,1.857471,-2.950722,-0.669988,
+ 0.975634,-0.187232,0.114377,1.841282,-2.716008,-0.708009,
+ -0.343436,-0.507052,0.790537,1.776024,-2.980086,-0.707575,
+ 0.975634,-0.187232,0.114377,1.841282,-2.716008,-0.708009,
+ 0.056398,-0.684481,0.726846,1.736425,-2.743683,-0.736866,
+ 0.137764,-0.289893,-0.947092,-2.591357,-1.510845,-0.88547,
+ 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
+ 0.26198,0.048424,0.963858,-2.837147,-1.791733,-0.921563,
+ 0.137764,-0.289893,-0.947092,-2.591357,-1.510845,-0.88547,
+ 0.26198,0.048424,0.963858,-2.837147,-1.791733,-0.921563,
+ 0.79444,0.150524,0.588394,-2.687162,-1.539807,-0.988048,
+ 0.79444,0.150524,0.588394,-2.687162,-1.539807,-0.988048,
+ 0.26198,0.048424,0.963858,-2.837147,-1.791733,-0.921563,
+ 0.24139,0.178826,0.953809,-2.918293,-1.904184,-1.004659,
+ 0.79444,0.150524,0.588394,-2.687162,-1.539807,-0.988048,
+ 0.24139,0.178826,0.953809,-2.918293,-1.904184,-1.004659,
+ -0.15812,-0.033626,-0.986847,-2.765069,-1.561164,-1.084313,
+ -0.15812,-0.033626,-0.986847,-2.765069,-1.561164,-1.084313,
+ 0.24139,0.178826,0.953809,-2.918293,-1.904184,-1.004659,
+ 0.247956,0.087485,0.964813,-3.010917,-1.884498,-1.08351,
+ -0.15812,-0.033626,-0.986847,-2.765069,-1.561164,-1.084313,
+ 0.247956,0.087485,0.964813,-3.010917,-1.884498,-1.08351,
+ -0.234266,0.044111,-0.971171,-2.862576,-1.546894,-1.117139,
+ -0.234266,0.044111,-0.971171,-2.862576,-1.546894,-1.117139,
+ 0.247956,0.087485,0.964813,-3.010917,-1.884498,-1.08351,
+ 0.81802,-0.47123,-0.329827,-3.117476,-1.866892,-1.108034,
+ -0.234266,0.044111,-0.971171,-2.862576,-1.546894,-1.117139,
+ 0.81802,-0.47123,-0.329827,-3.117476,-1.866892,-1.108034,
+ 0.726897,-0.546446,-0.415953,-2.955052,-1.49684,-1.128812,
+ 0.726897,-0.546446,-0.415953,-2.955052,-1.49684,-1.128812,
+ 0.81802,-0.47123,-0.329827,-3.117476,-1.866892,-1.108034,
+ 0.776291,-0.374868,-0.5068,-3.23261,-1.834299,-1.087832,
+ 0.726897,-0.546446,-0.415953,-2.955052,-1.49684,-1.128812,
+ 0.776291,-0.374868,-0.5068,-3.23261,-1.834299,-1.087832,
+ -0.390861,0.032481,-0.919876,-3.063133,-1.440555,-1.090926,
+ -0.086361,-0.084973,-0.992634,-3.36599,-1.48517,-0.888076,
+ -0.424393,0.057227,-0.903668,-3.49052,-1.760417,-0.903104,
+ -0.51975,0.138222,-0.843063,-3.498521,-1.762078,-0.762472,
+ -0.086361,-0.084973,-0.992634,-3.36599,-1.48517,-0.888076,
+ -0.51975,0.138222,-0.843063,-3.498521,-1.762078,-0.762472,
+ -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
+ -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
+ -0.782249,0.198377,-0.590536,-3.335942,-1.365685,-0.72459,
+ -0.811102,-0.12903,-0.570495,-3.319817,-1.365015,-0.886015,
+ -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
+ -0.811102,-0.12903,-0.570495,-3.319817,-1.365015,-0.886015,
+ -0.086361,-0.084973,-0.992634,-3.36599,-1.48517,-0.888076,
+ -0.775358,0.344514,-0.529274,-3.078699,-2.553982,-1.046834,
+ -0.440199,0.219838,-0.870572,-3.162498,-2.556375,-1.058409,
+ -0.820357,0.160676,-0.548815,-3.177824,-2.279173,-1.04758,
+ -0.775358,0.344514,-0.529274,-3.078699,-2.553982,-1.046834,
+ -0.820357,0.160676,-0.548815,-3.177824,-2.279173,-1.04758,
+ -0.906134,0.012265,0.422812,-3.068444,-2.260195,-1.03507,
+ -0.906134,0.012265,0.422812,-3.068444,-2.260195,-1.03507,
+ -0.820357,0.160676,-0.548815,-3.177824,-2.279173,-1.04758,
+ 0.000667,0.002295,-0.999997,-3.169489,-2.110039,-1.076796,
+ -0.906134,0.012265,0.422812,-3.068444,-2.260195,-1.03507,
+ 0.000667,0.002295,-0.999997,-3.169489,-2.110039,-1.076796,
+ 0.461464,-0.003303,-0.887153,-3.047974,-2.109628,-1.063497,
+ 0.461464,-0.003303,-0.887153,-3.047974,-2.109628,-1.063497,
+ 0.000667,0.002295,-0.999997,-3.169489,-2.110039,-1.076796,
+ 0.81802,-0.47123,-0.329827,-3.117476,-1.866892,-1.108034,
+ 0.461464,-0.003303,-0.887153,-3.047974,-2.109628,-1.063497,
+ 0.81802,-0.47123,-0.329827,-3.117476,-1.866892,-1.108034,
+ 0.247956,0.087485,0.964813,-3.010917,-1.884498,-1.08351,
+ -0.820357,0.160676,-0.548815,-3.177824,-2.279173,-1.04758,
+ -0.156447,-0.088128,-0.983747,-3.207447,-2.103206,-1.071366,
+ 0.000667,0.002295,-0.999997,-3.169489,-2.110039,-1.076796,
+ 0.000667,0.002295,-0.999997,-3.169489,-2.110039,-1.076796,
+ -0.156447,-0.088128,-0.983747,-3.207447,-2.103206,-1.071366,
+ 0.776291,-0.374868,-0.5068,-3.23261,-1.834299,-1.087832,
+ 0.000667,0.002295,-0.999997,-3.169489,-2.110039,-1.076796,
+ 0.776291,-0.374868,-0.5068,-3.23261,-1.834299,-1.087832,
+ 0.81802,-0.47123,-0.329827,-3.117476,-1.866892,-1.108034,
+ -0.440199,0.219838,-0.870572,-3.162498,-2.556375,-1.058409,
+ 0.433219,-0.09361,-0.896414,-3.251541,-2.56405,-1.023627,
+ -0.019303,-0.142974,-0.989538,-3.281816,-2.305055,-1.001878,
+ -0.440199,0.219838,-0.870572,-3.162498,-2.556375,-1.058409,
+ -0.019303,-0.142974,-0.989538,-3.281816,-2.305055,-1.001878,
+ -0.820357,0.160676,-0.548815,-3.177824,-2.279173,-1.04758,
+ -0.820357,0.160676,-0.548815,-3.177824,-2.279173,-1.04758,
+ -0.019303,-0.142974,-0.989538,-3.281816,-2.305055,-1.001878,
+ 0.422569,-0.18743,-0.886739,-3.327526,-2.075729,-1.005328,
+ -0.820357,0.160676,-0.548815,-3.177824,-2.279173,-1.04758,
+ 0.422569,-0.18743,-0.886739,-3.327526,-2.075729,-1.005328,
+ -0.156447,-0.088128,-0.983747,-3.207447,-2.103206,-1.071366,
+ -0.156447,-0.088128,-0.983747,-3.207447,-2.103206,-1.071366,
+ 0.422569,-0.18743,-0.886739,-3.327526,-2.075729,-1.005328,
+ 0.356923,-0.210291,-0.910156,-3.357996,-1.811803,-0.975625,
+ -0.156447,-0.088128,-0.983747,-3.207447,-2.103206,-1.071366,
+ 0.356923,-0.210291,-0.910156,-3.357996,-1.811803,-0.975625,
+ 0.776291,-0.374868,-0.5068,-3.23261,-1.834299,-1.087832,
+ 0.433219,-0.09361,-0.896414,-3.251541,-2.56405,-1.023627,
+ -0.354049,-0.10839,-0.928925,-3.347304,-2.573628,-0.955211,
+ -0.35872,0.092902,-0.928811,-3.389388,-2.305625,-0.950348,
+ 0.433219,-0.09361,-0.896414,-3.251541,-2.56405,-1.023627,
+ -0.35872,0.092902,-0.928811,-3.389388,-2.305625,-0.950348,
+ -0.019303,-0.142974,-0.989538,-3.281816,-2.305055,-1.001878,
+ -0.019303,-0.142974,-0.989538,-3.281816,-2.305055,-1.001878,
+ -0.35872,0.092902,-0.928811,-3.389388,-2.305625,-0.950348,
+ -0.453746,-0.057149,-0.889297,-3.451965,-2.077314,-0.931974,
+ -0.019303,-0.142974,-0.989538,-3.281816,-2.305055,-1.001878,
+ -0.453746,-0.057149,-0.889297,-3.451965,-2.077314,-0.931974,
+ 0.422569,-0.18743,-0.886739,-3.327526,-2.075729,-1.005328,
+ 0.422569,-0.18743,-0.886739,-3.327526,-2.075729,-1.005328,
+ -0.453746,-0.057149,-0.889297,-3.451965,-2.077314,-0.931974,
+ -0.424393,0.057227,-0.903668,-3.49052,-1.760417,-0.903104,
+ 0.422569,-0.18743,-0.886739,-3.327526,-2.075729,-1.005328,
+ -0.424393,0.057227,-0.903668,-3.49052,-1.760417,-0.903104,
+ 0.356923,-0.210291,-0.910156,-3.357996,-1.811803,-0.975625,
+ -0.501053,-0.05946,-0.863371,-3.022819,-2.52224,-0.979148,
+ -0.775358,0.344514,-0.529274,-3.078699,-2.553982,-1.046834,
+ -0.906134,0.012265,0.422812,-3.068444,-2.260195,-1.03507,
+ -0.501053,-0.05946,-0.863371,-3.022819,-2.52224,-0.979148,
+ -0.906134,0.012265,0.422812,-3.068444,-2.260195,-1.03507,
+ -0.779685,0.025369,-0.625657,-3.007483,-2.270712,-0.984279,
+ -0.779685,0.025369,-0.625657,-3.007483,-2.270712,-0.984279,
+ -0.906134,0.012265,0.422812,-3.068444,-2.260195,-1.03507,
+ 0.461464,-0.003303,-0.887153,-3.047974,-2.109628,-1.063497,
+ -0.779685,0.025369,-0.625657,-3.007483,-2.270712,-0.984279,
+ 0.461464,-0.003303,-0.887153,-3.047974,-2.109628,-1.063497,
+ -0.765488,-0.115048,-0.633082,-2.969687,-2.097941,-0.982836,
+ -0.765488,-0.115048,-0.633082,-2.969687,-2.097941,-0.982836,
+ 0.461464,-0.003303,-0.887153,-3.047974,-2.109628,-1.063497,
+ 0.247956,0.087485,0.964813,-3.010917,-1.884498,-1.08351,
+ -0.765488,-0.115048,-0.633082,-2.969687,-2.097941,-0.982836,
+ 0.247956,0.087485,0.964813,-3.010917,-1.884498,-1.08351,
+ 0.24139,0.178826,0.953809,-2.918293,-1.904184,-1.004659,
+ -0.807765,-0.096776,-0.581507,-2.892438,-1.95081,-0.87812,
+ 0.24139,0.178826,0.953809,-2.918293,-1.904184,-1.004659,
+ 0.26198,0.048424,0.963858,-2.837147,-1.791733,-0.921563,
+ 0.24139,0.178826,0.953809,-2.918293,-1.904184,-1.004659,
+ -0.807765,-0.096776,-0.581507,-2.892438,-1.95081,-0.87812,
+ 0.937141,-0.149709,-0.315204,-2.981187,-2.142718,-0.858353,
+ 0.24139,0.178826,0.953809,-2.918293,-1.904184,-1.004659,
+ 0.937141,-0.149709,-0.315204,-2.981187,-2.142718,-0.858353,
+ -0.765488,-0.115048,-0.633082,-2.969687,-2.097941,-0.982836,
+ -0.765488,-0.115048,-0.633082,-2.969687,-2.097941,-0.982836,
+ 0.937141,-0.149709,-0.315204,-2.981187,-2.142718,-0.858353,
+ 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
+ -0.765488,-0.115048,-0.633082,-2.969687,-2.097941,-0.982836,
+ 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
+ -0.779685,0.025369,-0.625657,-3.007483,-2.270712,-0.984279,
+ -0.779685,0.025369,-0.625657,-3.007483,-2.270712,-0.984279,
+ 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
+ 0.886562,-0.46255,-0.007485,-3.04661,-2.510881,-0.900772,
+ -0.779685,0.025369,-0.625657,-3.007483,-2.270712,-0.984279,
+ 0.886562,-0.46255,-0.007485,-3.04661,-2.510881,-0.900772,
+ -0.501053,-0.05946,-0.863371,-3.022819,-2.52224,-0.979148,
+ -0.807765,-0.096776,-0.581507,-2.892438,-1.95081,-0.87812,
+ 0.982106,-0.010346,-0.188044,-2.964215,-1.978727,-0.776572,
+ 0.567578,-0.469833,0.6761,-3.040398,-2.156239,-0.808208,
+ -0.807765,-0.096776,-0.581507,-2.892438,-1.95081,-0.87812,
+ 0.567578,-0.469833,0.6761,-3.040398,-2.156239,-0.808208,
+ 0.937141,-0.149709,-0.315204,-2.981187,-2.142718,-0.858353,
+ 0.937141,-0.149709,-0.315204,-2.981187,-2.142718,-0.858353,
+ 0.567578,-0.469833,0.6761,-3.040398,-2.156239,-0.808208,
+ 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
+ 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
+ 0.567578,-0.469833,0.6761,-3.040398,-2.156239,-0.808208,
+ 0.890357,-0.340018,0.302742,-3.120761,-2.15777,-0.766432,
+ 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
+ 0.890357,-0.340018,0.302742,-3.120761,-2.15777,-0.766432,
+ 0.773659,-0.235087,0.588375,-3.144012,-2.333635,-0.829994,
+ 0.982106,-0.010346,-0.188044,-2.964215,-1.978727,-0.776572,
+ 0.789099,-0.039289,0.613008,-3.066022,-1.953125,-0.719516,
+ 0.890357,-0.340018,0.302742,-3.120761,-2.15777,-0.766432,
+ 0.982106,-0.010346,-0.188044,-2.964215,-1.978727,-0.776572,
+ 0.890357,-0.340018,0.302742,-3.120761,-2.15777,-0.766432,
+ 0.567578,-0.469833,0.6761,-3.040398,-2.156239,-0.808208,
+ 0.789099,-0.039289,0.613008,-3.066022,-1.953125,-0.719516,
+ 0.230893,-0.309688,0.922378,-3.211005,-1.850398,-0.700723,
+ 0.257818,-0.230014,0.938415,-3.253309,-2.137354,-0.760713,
+ 0.789099,-0.039289,0.613008,-3.066022,-1.953125,-0.719516,
+ 0.257818,-0.230014,0.938415,-3.253309,-2.137354,-0.760713,
+ 0.890357,-0.340018,0.302742,-3.120761,-2.15777,-0.766432,
+ 0.890357,-0.340018,0.302742,-3.120761,-2.15777,-0.766432,
+ 0.257818,-0.230014,0.938415,-3.253309,-2.137354,-0.760713,
+ 0.148388,-0.325205,0.933929,-3.235873,-2.335338,-0.820588,
+ 0.890357,-0.340018,0.302742,-3.120761,-2.15777,-0.766432,
+ 0.148388,-0.325205,0.933929,-3.235873,-2.335338,-0.820588,
+ 0.773659,-0.235087,0.588375,-3.144012,-2.333635,-0.829994,
+ 0.773659,-0.235087,0.588375,-3.144012,-2.333635,-0.829994,
+ 0.148388,-0.325205,0.933929,-3.235873,-2.335338,-0.820588,
+ -0.215783,-0.895808,0.388544,-3.240554,-2.555467,-0.856262,
+ 0.773659,-0.235087,0.588375,-3.144012,-2.333635,-0.829994,
+ -0.215783,-0.895808,0.388544,-3.240554,-2.555467,-0.856262,
+ -0.065687,-0.249194,0.966223,-3.132772,-2.528669,-0.848639,
+ 0.515412,-0.714946,0.472444,-3.304804,-1.582192,-0.643445,
+ -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
+ -0.51975,0.138222,-0.843063,-3.498521,-1.762078,-0.762472,
+ 0.515412,-0.714946,0.472444,-3.304804,-1.582192,-0.643445,
+ -0.51975,0.138222,-0.843063,-3.498521,-1.762078,-0.762472,
+ -0.050511,-0.258376,0.964723,-3.381262,-1.828189,-0.697034,
+ -0.050511,-0.258376,0.964723,-3.381262,-1.828189,-0.697034,
+ 0.230893,-0.309688,0.922378,-3.211005,-1.850398,-0.700723,
+ -0.012978,-0.998326,0.056357,-3.139394,-1.687482,-0.638546,
+ -0.050511,-0.258376,0.964723,-3.381262,-1.828189,-0.697034,
+ -0.012978,-0.998326,0.056357,-3.139394,-1.687482,-0.638546,
+ 0.515412,-0.714946,0.472444,-3.304804,-1.582192,-0.643445,
+ 0.230893,-0.309688,0.922378,-3.211005,-1.850398,-0.700723,
+ -0.050511,-0.258376,0.964723,-3.381262,-1.828189,-0.697034,
+ -0.042094,-0.220101,0.974568,-3.422698,-2.070796,-0.773898,
+ 0.230893,-0.309688,0.922378,-3.211005,-1.850398,-0.700723,
+ -0.042094,-0.220101,0.974568,-3.422698,-2.070796,-0.773898,
+ 0.257818,-0.230014,0.938415,-3.253309,-2.137354,-0.760713,
+ 0.257818,-0.230014,0.938415,-3.253309,-2.137354,-0.760713,
+ -0.042094,-0.220101,0.974568,-3.422698,-2.070796,-0.773898,
+ -0.085416,-0.081635,0.992995,-3.339489,-2.328145,-0.827572,
+ 0.257818,-0.230014,0.938415,-3.253309,-2.137354,-0.760713,
+ -0.085416,-0.081635,0.992995,-3.339489,-2.328145,-0.827572,
+ 0.148388,-0.325205,0.933929,-3.235873,-2.335338,-0.820588,
+ 0.148388,-0.325205,0.933929,-3.235873,-2.335338,-0.820588,
+ -0.085416,-0.081635,0.992995,-3.339489,-2.328145,-0.827572,
+ 0.255431,-0.055528,0.965231,-3.297886,-2.54902,-0.861657,
+ 0.148388,-0.325205,0.933929,-3.235873,-2.335338,-0.820588,
+ 0.255431,-0.055528,0.965231,-3.297886,-2.54902,-0.861657,
+ -0.215783,-0.895808,0.388544,-3.240554,-2.555467,-0.856262,
+ -0.050511,-0.258376,0.964723,-3.381262,-1.828189,-0.697034,
+ -0.51975,0.138222,-0.843063,-3.498521,-1.762078,-0.762472,
+ -0.348227,-0.192528,0.917426,-3.463753,-2.079892,-0.844667,
+ -0.050511,-0.258376,0.964723,-3.381262,-1.828189,-0.697034,
+ -0.348227,-0.192528,0.917426,-3.463753,-2.079892,-0.844667,
+ -0.042094,-0.220101,0.974568,-3.422698,-2.070796,-0.773898,
+ -0.042094,-0.220101,0.974568,-3.422698,-2.070796,-0.773898,
+ -0.348227,-0.192528,0.917426,-3.463753,-2.079892,-0.844667,
+ -0.401279,-0.250965,0.880904,-3.412068,-2.356105,-0.865813,
+ -0.042094,-0.220101,0.974568,-3.422698,-2.070796,-0.773898,
+ -0.401279,-0.250965,0.880904,-3.412068,-2.356105,-0.865813,
+ -0.085416,-0.081635,0.992995,-3.339489,-2.328145,-0.827572,
+ -0.085416,-0.081635,0.992995,-3.339489,-2.328145,-0.827572,
+ -0.401279,-0.250965,0.880904,-3.412068,-2.356105,-0.865813,
+ -0.326843,-0.236652,0.91497,-3.372066,-2.569159,-0.904785,
+ -0.085416,-0.081635,0.992995,-3.339489,-2.328145,-0.827572,
+ -0.326843,-0.236652,0.91497,-3.372066,-2.569159,-0.904785,
+ 0.255431,-0.055528,0.965231,-3.297886,-2.54902,-0.861657,
+ -0.348227,-0.192528,0.917426,-3.463753,-2.079892,-0.844667,
+ -0.453746,-0.057149,-0.889297,-3.451965,-2.077314,-0.931974,
+ -0.35872,0.092902,-0.928811,-3.389388,-2.305625,-0.950348,
+ -0.348227,-0.192528,0.917426,-3.463753,-2.079892,-0.844667,
+ -0.35872,0.092902,-0.928811,-3.389388,-2.305625,-0.950348,
+ -0.401279,-0.250965,0.880904,-3.412068,-2.356105,-0.865813,
+ -0.401279,-0.250965,0.880904,-3.412068,-2.356105,-0.865813,
+ -0.35872,0.092902,-0.928811,-3.389388,-2.305625,-0.950348,
+ -0.354049,-0.10839,-0.928925,-3.347304,-2.573628,-0.955211,
+ -0.401279,-0.250965,0.880904,-3.412068,-2.356105,-0.865813,
+ -0.354049,-0.10839,-0.928925,-3.347304,-2.573628,-0.955211,
+ -0.326843,-0.236652,0.91497,-3.372066,-2.569159,-0.904785,
+ -0.51975,0.138222,-0.843063,-3.498521,-1.762078,-0.762472,
+ -0.424393,0.057227,-0.903668,-3.49052,-1.760417,-0.903104,
+ -0.453746,-0.057149,-0.889297,-3.451965,-2.077314,-0.931974,
+ -0.51975,0.138222,-0.843063,-3.498521,-1.762078,-0.762472,
+ -0.453746,-0.057149,-0.889297,-3.451965,-2.077314,-0.931974,
+ -0.348227,-0.192528,0.917426,-3.463753,-2.079892,-0.844667,
+ 0.356923,-0.210291,-0.910156,-3.357996,-1.811803,-0.975625,
+ -0.424393,0.057227,-0.903668,-3.49052,-1.760417,-0.903104,
+ -0.086361,-0.084973,-0.992634,-3.36599,-1.48517,-0.888076,
+ 0.356923,-0.210291,-0.910156,-3.357996,-1.811803,-0.975625,
+ -0.086361,-0.084973,-0.992634,-3.36599,-1.48517,-0.888076,
+ -0.032036,-0.072305,-0.996868,-3.342096,-1.533989,-0.921628,
+ -0.587844,-0.244917,-0.771009,1.953911,-2.462233,-0.830594,
+ 0.985192,-0.12583,0.116459,1.930747,-2.463535,-0.894743,
+ 0.996811,-0.048518,0.063355,1.98533,-2.221319,-0.893145,
+ -0.587844,-0.244917,-0.771009,1.953911,-2.462233,-0.830594,
+ 0.996811,-0.048518,0.063355,1.98533,-2.221319,-0.893145,
+ -0.845196,-0.27877,-0.455994,2.02453,-2.195334,-0.811284,
+ -0.845196,-0.27877,-0.455994,2.02453,-2.195334,-0.811284,
+ 0.996811,-0.048518,0.063355,1.98533,-2.221319,-0.893145,
+ 0.957938,-0.285979,-0.023877,2.013095,-2.051912,-0.911043,
+ -0.845196,-0.27877,-0.455994,2.02453,-2.195334,-0.811284,
+ 0.957938,-0.285979,-0.023877,2.013095,-2.051912,-0.911043,
+ -0.732521,-0.474279,-0.488336,2.047696,-2.050138,-0.814712,
+ -0.732521,-0.474279,-0.488336,2.047696,-2.050138,-0.814712,
+ 0.957938,-0.285979,-0.023877,2.013095,-2.051912,-0.911043,
+ -0.274087,0.000043,0.961705,2.021591,-1.755289,-0.912093,
+ -0.732521,-0.474279,-0.488336,2.047696,-2.050138,-0.814712,
+ -0.274087,0.000043,0.961705,2.021591,-1.755289,-0.912093,
+ 0.972392,0.232654,-0.018037,2.053108,-1.738285,-0.824853,
+ 0.972392,0.232654,-0.018037,2.053108,-1.738285,-0.824853,
+ -0.274087,0.000043,0.961705,2.021591,-1.755289,-0.912093,
+ 0.74023,-0.090866,-0.666185,2.036036,-1.57908,-0.967151,
+ 0.972392,0.232654,-0.018037,2.053108,-1.738285,-0.824853,
+ 0.74023,-0.090866,-0.666185,2.036036,-1.57908,-0.967151,
+ 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
+ -0.176356,-0.113876,-0.977717,1.678986,-2.513137,-0.891745,
+ -0.051713,-0.100832,-0.993559,1.737623,-2.485017,-0.918334,
+ -0.069043,-0.157333,-0.985129,1.771416,-2.769024,-0.9461,
+ -0.176356,-0.113876,-0.977717,1.678986,-2.513137,-0.891745,
+ -0.069043,-0.157333,-0.985129,1.771416,-2.769024,-0.9461,
+ -0.246054,-0.154918,-0.956796,1.718315,-2.775468,-0.921796,
+ -0.136917,-0.20176,-0.969818,1.648793,-2.280014,-0.929365,
+ 0.039,-0.185675,-0.981837,1.710406,-2.272223,-0.954296,
+ -0.051713,-0.100832,-0.993559,1.737623,-2.485017,-0.918334,
+ -0.136917,-0.20176,-0.969818,1.648793,-2.280014,-0.929365,
+ -0.051713,-0.100832,-0.993559,1.737623,-2.485017,-0.918334,
+ -0.176356,-0.113876,-0.977717,1.678986,-2.513137,-0.891745,
+ -0.17902,-0.308668,-0.934171,1.6249,-2.087301,-0.963391,
+ 0.109483,-0.310605,-0.944213,1.720031,-2.105568,-0.971354,
+ 0.039,-0.185675,-0.981837,1.710406,-2.272223,-0.954296,
+ -0.17902,-0.308668,-0.934171,1.6249,-2.087301,-0.963391,
+ 0.039,-0.185675,-0.981837,1.710406,-2.272223,-0.954296,
+ -0.136917,-0.20176,-0.969818,1.648793,-2.280014,-0.929365,
+ -0.739347,0.031953,-0.672566,1.572979,-1.827591,-0.985823,
+ -0.09542,0.162222,-0.98213,1.717145,-1.80953,-1.004092,
+ 0.109483,-0.310605,-0.944213,1.720031,-2.105568,-0.971354,
+ -0.739347,0.031953,-0.672566,1.572979,-1.827591,-0.985823,
+ 0.109483,-0.310605,-0.944213,1.720031,-2.105568,-0.971354,
+ -0.17902,-0.308668,-0.934171,1.6249,-2.087301,-0.963391,
+ -0.652584,-0.147678,-0.743186,1.54175,-1.643613,-1.01419,
+ -0.211092,-0.082708,-0.973961,1.650318,-1.645881,-1.053347,
+ -0.09542,0.162222,-0.98213,1.717145,-1.80953,-1.004092,
+ -0.652584,-0.147678,-0.743186,1.54175,-1.643613,-1.01419,
+ -0.09542,0.162222,-0.98213,1.717145,-1.80953,-1.004092,
+ -0.739347,0.031953,-0.672566,1.572979,-1.827591,-0.985823,
+ -0.4008,-0.167777,-0.900672,1.586321,-2.273752,-0.880969,
+ -0.136917,-0.20176,-0.969818,1.648793,-2.280014,-0.929365,
+ -0.176356,-0.113876,-0.977717,1.678986,-2.513137,-0.891745,
+ -0.4008,-0.167777,-0.900672,1.586321,-2.273752,-0.880969,
+ -0.176356,-0.113876,-0.977717,1.678986,-2.513137,-0.891745,
+ -0.483189,-0.207332,-0.850613,1.655948,-2.520927,-0.844269,
+ -0.417424,-0.199203,-0.886609,1.529305,-2.092083,-0.887353,
+ -0.17902,-0.308668,-0.934171,1.6249,-2.087301,-0.963391,
+ -0.136917,-0.20176,-0.969818,1.648793,-2.280014,-0.929365,
+ -0.417424,-0.199203,-0.886609,1.529305,-2.092083,-0.887353,
+ -0.136917,-0.20176,-0.969818,1.648793,-2.280014,-0.929365,
+ -0.4008,-0.167777,-0.900672,1.586321,-2.273752,-0.880969,
+ -0.521685,-0.261319,-0.812131,1.508714,-1.808578,-0.934359,
+ -0.739347,0.031953,-0.672566,1.572979,-1.827591,-0.985823,
+ -0.17902,-0.308668,-0.934171,1.6249,-2.087301,-0.963391,
+ -0.521685,-0.261319,-0.812131,1.508714,-1.808578,-0.934359,
+ -0.17902,-0.308668,-0.934171,1.6249,-2.087301,-0.963391,
+ -0.417424,-0.199203,-0.886609,1.529305,-2.092083,-0.887353,
+ -0.970971,-0.219011,-0.096178,1.480629,-1.640132,-0.953447,
+ -0.652584,-0.147678,-0.743186,1.54175,-1.643613,-1.01419,
+ -0.739347,0.031953,-0.672566,1.572979,-1.827591,-0.985823,
+ -0.970971,-0.219011,-0.096178,1.480629,-1.640132,-0.953447,
+ -0.739347,0.031953,-0.672566,1.572979,-1.827591,-0.985823,
+ -0.521685,-0.261319,-0.812131,1.508714,-1.808578,-0.934359,
+ -0.883058,-0.239959,-0.403273,1.60129,-2.267132,-0.787696,
+ -0.4008,-0.167777,-0.900672,1.586321,-2.273752,-0.880969,
+ -0.483189,-0.207332,-0.850613,1.655948,-2.520927,-0.844269,
+ -0.883058,-0.239959,-0.403273,1.60129,-2.267132,-0.787696,
+ -0.483189,-0.207332,-0.850613,1.655948,-2.520927,-0.844269,
+ -0.912869,-0.285577,-0.291747,1.663494,-2.485963,-0.790773,
+ -0.872722,-0.174901,-0.455813,1.544087,-2.080722,-0.786432,
+ -0.417424,-0.199203,-0.886609,1.529305,-2.092083,-0.887353,
+ -0.4008,-0.167777,-0.900672,1.586321,-2.273752,-0.880969,
+ -0.872722,-0.174901,-0.455813,1.544087,-2.080722,-0.786432,
+ -0.4008,-0.167777,-0.900672,1.586321,-2.273752,-0.880969,
+ -0.883058,-0.239959,-0.403273,1.60129,-2.267132,-0.787696,
+ -0.874358,-0.225285,-0.429819,1.473886,-1.818947,-0.799576,
+ -0.521685,-0.261319,-0.812131,1.508714,-1.808578,-0.934359,
+ -0.417424,-0.199203,-0.886609,1.529305,-2.092083,-0.887353,
+ -0.874358,-0.225285,-0.429819,1.473886,-1.818947,-0.799576,
+ -0.417424,-0.199203,-0.886609,1.529305,-2.092083,-0.887353,
+ -0.872722,-0.174901,-0.455813,1.544087,-2.080722,-0.786432,
+ -0.794709,-0.185222,0.578041,1.451825,-1.576856,-0.702758,
+ -0.970971,-0.219011,-0.096178,1.480629,-1.640132,-0.953447,
+ -0.521685,-0.261319,-0.812131,1.508714,-1.808578,-0.934359,
+ -0.794709,-0.185222,0.578041,1.451825,-1.576856,-0.702758,
+ -0.521685,-0.261319,-0.812131,1.508714,-1.808578,-0.934359,
+ -0.874358,-0.225285,-0.429819,1.473886,-1.818947,-0.799576,
+ -0.898389,-0.217201,0.381735,1.677597,-2.237953,-0.696318,
+ -0.883058,-0.239959,-0.403273,1.60129,-2.267132,-0.787696,
+ -0.912869,-0.285577,-0.291747,1.663494,-2.485963,-0.790773,
+ -0.898389,-0.217201,0.381735,1.677597,-2.237953,-0.696318,
+ -0.912869,-0.285577,-0.291747,1.663494,-2.485963,-0.790773,
+ -0.887036,-0.210048,0.411154,1.756349,-2.446399,-0.705428,
+ -0.819257,-0.566976,-0.085772,1.643403,-2.076583,-0.689565,
+ -0.872722,-0.174901,-0.455813,1.544087,-2.080722,-0.786432,
+ -0.883058,-0.239959,-0.403273,1.60129,-2.267132,-0.787696,
+ -0.819257,-0.566976,-0.085772,1.643403,-2.076583,-0.689565,
+ -0.883058,-0.239959,-0.403273,1.60129,-2.267132,-0.787696,
+ -0.898389,-0.217201,0.381735,1.677597,-2.237953,-0.696318,
+ 0.193853,0.161608,-0.967628,1.596751,-1.722028,-0.684655,
+ -0.874358,-0.225285,-0.429819,1.473886,-1.818947,-0.799576,
+ -0.872722,-0.174901,-0.455813,1.544087,-2.080722,-0.786432,
+ 0.193853,0.161608,-0.967628,1.596751,-1.722028,-0.684655,
+ -0.872722,-0.174901,-0.455813,1.544087,-2.080722,-0.786432,
+ -0.819257,-0.566976,-0.085772,1.643403,-2.076583,-0.689565,
+ -0.493424,-0.165611,0.853877,1.599889,-1.595526,-0.623185,
+ -0.794709,-0.185222,0.578041,1.451825,-1.576856,-0.702758,
+ -0.874358,-0.225285,-0.429819,1.473886,-1.818947,-0.799576,
+ -0.493424,-0.165611,0.853877,1.599889,-1.595526,-0.623185,
+ -0.874358,-0.225285,-0.429819,1.473886,-1.818947,-0.799576,
+ 0.193853,0.161608,-0.967628,1.596751,-1.722028,-0.684655,
+ 0.985192,-0.12583,0.116459,1.930747,-2.463535,-0.894743,
+ -0.587844,-0.244917,-0.771009,1.953911,-2.462233,-0.830594,
+ -0.247433,-0.24804,-0.936618,1.994078,-2.713047,-0.824553,
+ 0.985192,-0.12583,0.116459,1.930747,-2.463535,-0.894743,
+ -0.247433,-0.24804,-0.936618,1.994078,-2.713047,-0.824553,
+ 0.186476,0.252953,-0.949337,1.960643,-2.71286,-0.90089,
+ 0.843062,-0.10517,-0.527433,1.864064,-2.469953,-0.935601,
+ 0.985192,-0.12583,0.116459,1.930747,-2.463535,-0.894743,
+ 0.186476,0.252953,-0.949337,1.960643,-2.71286,-0.90089,
+ 0.843062,-0.10517,-0.527433,1.864064,-2.469953,-0.935601,
+ 0.186476,0.252953,-0.949337,1.960643,-2.71286,-0.90089,
+ 0.820312,-0.193024,-0.538358,1.880971,-2.733242,-0.8902,
+ 0.159615,0.129847,-0.978602,1.941767,-1.759457,-0.997454,
+ 0.290478,-0.146424,-0.945612,1.937009,-1.625419,-1.026843,
+ 0.74023,-0.090866,-0.666185,2.036036,-1.57908,-0.967151,
+ 0.159615,0.129847,-0.978602,1.941767,-1.759457,-0.997454,
+ 0.74023,-0.090866,-0.666185,2.036036,-1.57908,-0.967151,
+ -0.274087,0.000043,0.961705,2.021591,-1.755289,-0.912093,
+ 0.830793,-0.244757,-0.499878,1.918641,-2.083654,-1.001275,
+ 0.159615,0.129847,-0.978602,1.941767,-1.759457,-0.997454,
+ -0.274087,0.000043,0.961705,2.021591,-1.755289,-0.912093,
+ 0.830793,-0.244757,-0.499878,1.918641,-2.083654,-1.001275,
+ -0.274087,0.000043,0.961705,2.021591,-1.755289,-0.912093,
+ 0.957938,-0.285979,-0.023877,2.013095,-2.051912,-0.911043,
+ 0.846555,-0.103661,-0.52211,1.90637,-2.282284,-0.964887,
+ 0.996811,-0.048518,0.063355,1.98533,-2.221319,-0.893145,
+ 0.985192,-0.12583,0.116459,1.930747,-2.463535,-0.894743,
+ 0.846555,-0.103661,-0.52211,1.90637,-2.282284,-0.964887,
+ 0.985192,-0.12583,0.116459,1.930747,-2.463535,-0.894743,
+ 0.843062,-0.10517,-0.527433,1.864064,-2.469953,-0.935601,
+ 0.846555,-0.103661,-0.52211,1.90637,-2.282284,-0.964887,
+ 0.830793,-0.244757,-0.499878,1.918641,-2.083654,-1.001275,
+ 0.957938,-0.285979,-0.023877,2.013095,-2.051912,-0.911043,
+ 0.846555,-0.103661,-0.52211,1.90637,-2.282284,-0.964887,
+ 0.957938,-0.285979,-0.023877,2.013095,-2.051912,-0.911043,
+ 0.996811,-0.048518,0.063355,1.98533,-2.221319,-0.893145,
+ -0.069043,-0.157333,-0.985129,1.771416,-2.769024,-0.9461,
+ -0.051713,-0.100832,-0.993559,1.737623,-2.485017,-0.918334,
+ 0.407719,-0.190267,-0.893064,1.801127,-2.48469,-0.938593,
+ -0.069043,-0.157333,-0.985129,1.771416,-2.769024,-0.9461,
+ 0.407719,-0.190267,-0.893064,1.801127,-2.48469,-0.938593,
+ -0.845931,-0.255219,0.468256,1.830669,-2.736121,-0.903313,
+ 0.407719,-0.190267,-0.893064,1.801127,-2.48469,-0.938593,
+ 0.843062,-0.10517,-0.527433,1.864064,-2.469953,-0.935601,
+ 0.820312,-0.193024,-0.538358,1.880971,-2.733242,-0.8902,
+ 0.407719,-0.190267,-0.893064,1.801127,-2.48469,-0.938593,
+ 0.820312,-0.193024,-0.538358,1.880971,-2.733242,-0.8902,
+ -0.845931,-0.255219,0.468256,1.830669,-2.736121,-0.903313,
+ -0.09542,0.162222,-0.98213,1.717145,-1.80953,-1.004092,
+ -0.211092,-0.082708,-0.973961,1.650318,-1.645881,-1.053347,
+ 0.051664,-0.122235,-0.991156,1.804927,-1.581954,-1.089198,
+ -0.09542,0.162222,-0.98213,1.717145,-1.80953,-1.004092,
+ 0.051664,-0.122235,-0.991156,1.804927,-1.581954,-1.089198,
+ 0.473622,-0.284001,-0.833682,1.818846,-1.756976,-1.023593,
+ 0.109483,-0.310605,-0.944213,1.720031,-2.105568,-0.971354,
+ -0.09542,0.162222,-0.98213,1.717145,-1.80953,-1.004092,
+ 0.473622,-0.284001,-0.833682,1.818846,-1.756976,-1.023593,
+ 0.109483,-0.310605,-0.944213,1.720031,-2.105568,-0.971354,
+ 0.473622,-0.284001,-0.833682,1.818846,-1.756976,-1.023593,
+ 0.459595,-0.144347,-0.87632,1.839224,-2.109267,-0.998351,
+ 0.039,-0.185675,-0.981837,1.710406,-2.272223,-0.954296,
+ 0.109483,-0.310605,-0.944213,1.720031,-2.105568,-0.971354,
+ 0.459595,-0.144347,-0.87632,1.839224,-2.109267,-0.998351,
+ 0.039,-0.185675,-0.981837,1.710406,-2.272223,-0.954296,
+ 0.459595,-0.144347,-0.87632,1.839224,-2.109267,-0.998351,
+ 0.431429,-0.109339,-0.895497,1.818266,-2.313852,-0.968652,
+ -0.051713,-0.100832,-0.993559,1.737623,-2.485017,-0.918334,
+ 0.039,-0.185675,-0.981837,1.710406,-2.272223,-0.954296,
+ 0.431429,-0.109339,-0.895497,1.818266,-2.313852,-0.968652,
+ -0.051713,-0.100832,-0.993559,1.737623,-2.485017,-0.918334,
+ 0.431429,-0.109339,-0.895497,1.818266,-2.313852,-0.968652,
+ 0.407719,-0.190267,-0.893064,1.801127,-2.48469,-0.938593,
+ 0.473622,-0.284001,-0.833682,1.818846,-1.756976,-1.023593,
+ 0.051664,-0.122235,-0.991156,1.804927,-1.581954,-1.089198,
+ 0.290478,-0.146424,-0.945612,1.937009,-1.625419,-1.026843,
+ 0.473622,-0.284001,-0.833682,1.818846,-1.756976,-1.023593,
+ 0.290478,-0.146424,-0.945612,1.937009,-1.625419,-1.026843,
+ 0.159615,0.129847,-0.978602,1.941767,-1.759457,-0.997454,
+ 0.459595,-0.144347,-0.87632,1.839224,-2.109267,-0.998351,
+ 0.473622,-0.284001,-0.833682,1.818846,-1.756976,-1.023593,
+ 0.159615,0.129847,-0.978602,1.941767,-1.759457,-0.997454,
+ 0.459595,-0.144347,-0.87632,1.839224,-2.109267,-0.998351,
+ 0.159615,0.129847,-0.978602,1.941767,-1.759457,-0.997454,
+ 0.830793,-0.244757,-0.499878,1.918641,-2.083654,-1.001275,
+ 0.431429,-0.109339,-0.895497,1.818266,-2.313852,-0.968652,
+ 0.459595,-0.144347,-0.87632,1.839224,-2.109267,-0.998351,
+ 0.830793,-0.244757,-0.499878,1.918641,-2.083654,-1.001275,
+ 0.431429,-0.109339,-0.895497,1.818266,-2.313852,-0.968652,
+ 0.830793,-0.244757,-0.499878,1.918641,-2.083654,-1.001275,
+ 0.846555,-0.103661,-0.52211,1.90637,-2.282284,-0.964887,
+ 0.407719,-0.190267,-0.893064,1.801127,-2.48469,-0.938593,
+ 0.431429,-0.109339,-0.895497,1.818266,-2.313852,-0.968652,
+ 0.846555,-0.103661,-0.52211,1.90637,-2.282284,-0.964887,
+ 0.407719,-0.190267,-0.893064,1.801127,-2.48469,-0.938593,
+ 0.846555,-0.103661,-0.52211,1.90637,-2.282284,-0.964887,
+ 0.843062,-0.10517,-0.527433,1.864064,-2.469953,-0.935601,
+ 0.975634,-0.187232,0.114377,1.841282,-2.716008,-0.708009,
+ -0.887036,-0.210048,0.411154,1.756349,-2.446399,-0.705428,
+ -0.912869,-0.285577,-0.291747,1.663494,-2.485963,-0.790773,
+ 0.975634,-0.187232,0.114377,1.841282,-2.716008,-0.708009,
+ -0.912869,-0.285577,-0.291747,1.663494,-2.485963,-0.790773,
+ 0.056398,-0.684481,0.726846,1.736425,-2.743683,-0.736866,
+ -0.382074,-0.25681,0.887732,1.740323,-1.67983,-0.664098,
+ -0.217942,-0.897186,0.384134,1.721211,-1.590185,-0.601932,
+ -0.493424,-0.165611,0.853877,1.599889,-1.595526,-0.623185,
+ -0.382074,-0.25681,0.887732,1.740323,-1.67983,-0.664098,
+ -0.493424,-0.165611,0.853877,1.599889,-1.595526,-0.623185,
+ 0.193853,0.161608,-0.967628,1.596751,-1.722028,-0.684655,
+ -0.53197,-0.108751,0.839751,1.747671,-2.067518,-0.638841,
+ -0.382074,-0.25681,0.887732,1.740323,-1.67983,-0.664098,
+ 0.193853,0.161608,-0.967628,1.596751,-1.722028,-0.684655,
+ -0.53197,-0.108751,0.839751,1.747671,-2.067518,-0.638841,
+ 0.193853,0.161608,-0.967628,1.596751,-1.722028,-0.684655,
+ -0.819257,-0.566976,-0.085772,1.643403,-2.076583,-0.689565,
+ -0.570406,-0.192005,0.798606,1.772999,-2.230292,-0.64494,
+ -0.53197,-0.108751,0.839751,1.747671,-2.067518,-0.638841,
+ -0.819257,-0.566976,-0.085772,1.643403,-2.076583,-0.689565,
+ -0.570406,-0.192005,0.798606,1.772999,-2.230292,-0.64494,
+ -0.819257,-0.566976,-0.085772,1.643403,-2.076583,-0.689565,
+ -0.898389,-0.217201,0.381735,1.677597,-2.237953,-0.696318,
+ -0.912869,-0.285577,-0.291747,1.663494,-2.485963,-0.790773,
+ -0.483189,-0.207332,-0.850613,1.655948,-2.520927,-0.844269,
+ 0.21689,-0.976039,0.017487,1.700797,-2.794792,-0.82425,
+ -0.912869,-0.285577,-0.291747,1.663494,-2.485963,-0.790773,
+ 0.21689,-0.976039,0.017487,1.700797,-2.794792,-0.82425,
+ 0.056398,-0.684481,0.726846,1.736425,-2.743683,-0.736866,
+ -0.671694,-0.023528,-0.740455,2.057496,-2.887282,-0.844225,
+ -0.247433,-0.24804,-0.936618,1.994078,-2.713047,-0.824553,
+ -0.062994,-0.00854,0.997977,1.972647,-2.728848,-0.772496,
+ -0.671694,-0.023528,-0.740455,2.057496,-2.887282,-0.844225,
+ -0.062994,-0.00854,0.997977,1.972647,-2.728848,-0.772496,
+ -0.990285,-0.10079,0.095796,2.001343,-2.847715,-0.762517,
+ 0.601229,-0.111152,0.791308,1.828658,-2.477348,-0.67347,
+ 0.751149,0.43192,0.49922,1.884318,-2.724404,-0.701999,
+ -0.062994,-0.00854,0.997977,1.972647,-2.728848,-0.772496,
+ 0.601229,-0.111152,0.791308,1.828658,-2.477348,-0.67347,
+ -0.062994,-0.00854,0.997977,1.972647,-2.728848,-0.772496,
+ -0.943599,-0.160394,0.289646,1.947264,-2.443232,-0.732587,
+ -0.570406,-0.192005,0.798606,1.772999,-2.230292,-0.64494,
+ 0.601229,-0.111152,0.791308,1.828658,-2.477348,-0.67347,
+ -0.943599,-0.160394,0.289646,1.947264,-2.443232,-0.732587,
+ -0.570406,-0.192005,0.798606,1.772999,-2.230292,-0.64494,
+ -0.943599,-0.160394,0.289646,1.947264,-2.443232,-0.732587,
+ -0.363523,-0.150625,0.919327,1.921881,-2.157616,-0.692678,
+ 0.601229,-0.111152,0.791308,1.828658,-2.477348,-0.67347,
+ -0.887036,-0.210048,0.411154,1.756349,-2.446399,-0.705428,
+ 0.975634,-0.187232,0.114377,1.841282,-2.716008,-0.708009,
+ 0.601229,-0.111152,0.791308,1.828658,-2.477348,-0.67347,
+ 0.975634,-0.187232,0.114377,1.841282,-2.716008,-0.708009,
+ 0.751149,0.43192,0.49922,1.884318,-2.724404,-0.701999,
+ 0.601229,-0.111152,0.791308,1.828658,-2.477348,-0.67347,
+ -0.570406,-0.192005,0.798606,1.772999,-2.230292,-0.64494,
+ -0.898389,-0.217201,0.381735,1.677597,-2.237953,-0.696318,
+ 0.601229,-0.111152,0.791308,1.828658,-2.477348,-0.67347,
+ -0.898389,-0.217201,0.381735,1.677597,-2.237953,-0.696318,
+ -0.887036,-0.210048,0.411154,1.756349,-2.446399,-0.705428,
+ -0.587844,-0.244917,-0.771009,1.953911,-2.462233,-0.830594,
+ -0.943599,-0.160394,0.289646,1.947264,-2.443232,-0.732587,
+ -0.062994,-0.00854,0.997977,1.972647,-2.728848,-0.772496,
+ -0.587844,-0.244917,-0.771009,1.953911,-2.462233,-0.830594,
+ -0.062994,-0.00854,0.997977,1.972647,-2.728848,-0.772496,
+ -0.247433,-0.24804,-0.936618,1.994078,-2.713047,-0.824553,
+ -0.924461,-0.213386,0.315973,1.991892,-1.7484,-0.65277,
+ -0.084936,-0.226589,0.97028,1.963153,-1.588839,-0.612861,
+ -0.217942,-0.897186,0.384134,1.721211,-1.590185,-0.601932,
+ -0.924461,-0.213386,0.315973,1.991892,-1.7484,-0.65277,
+ -0.217942,-0.897186,0.384134,1.721211,-1.590185,-0.601932,
+ -0.382074,-0.25681,0.887732,1.740323,-1.67983,-0.664098,
+ -0.914496,-0.253608,0.315247,1.945206,-2.015769,-0.672724,
+ -0.924461,-0.213386,0.315973,1.991892,-1.7484,-0.65277,
+ -0.382074,-0.25681,0.887732,1.740323,-1.67983,-0.664098,
+ -0.914496,-0.253608,0.315247,1.945206,-2.015769,-0.672724,
+ -0.382074,-0.25681,0.887732,1.740323,-1.67983,-0.664098,
+ -0.53197,-0.108751,0.839751,1.747671,-2.067518,-0.638841,
+ 0.972392,0.232654,-0.018037,2.053108,-1.738285,-0.824853,
+ 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
+ -0.084936,-0.226589,0.97028,1.963153,-1.588839,-0.612861,
+ 0.972392,0.232654,-0.018037,2.053108,-1.738285,-0.824853,
+ -0.084936,-0.226589,0.97028,1.963153,-1.588839,-0.612861,
+ -0.924461,-0.213386,0.315973,1.991892,-1.7484,-0.65277,
+ -0.732521,-0.474279,-0.488336,2.047696,-2.050138,-0.814712,
+ 0.972392,0.232654,-0.018037,2.053108,-1.738285,-0.824853,
+ -0.924461,-0.213386,0.315973,1.991892,-1.7484,-0.65277,
+ -0.732521,-0.474279,-0.488336,2.047696,-2.050138,-0.814712,
+ -0.924461,-0.213386,0.315973,1.991892,-1.7484,-0.65277,
+ -0.914496,-0.253608,0.315247,1.945206,-2.015769,-0.672724,
+ -0.845196,-0.27877,-0.455994,2.02453,-2.195334,-0.811284,
+ -0.732521,-0.474279,-0.488336,2.047696,-2.050138,-0.814712,
+ -0.914496,-0.253608,0.315247,1.945206,-2.015769,-0.672724,
+ -0.845196,-0.27877,-0.455994,2.02453,-2.195334,-0.811284,
+ -0.914496,-0.253608,0.315247,1.945206,-2.015769,-0.672724,
+ -0.363523,-0.150625,0.919327,1.921881,-2.157616,-0.692678,
+ -0.587844,-0.244917,-0.771009,1.953911,-2.462233,-0.830594,
+ -0.845196,-0.27877,-0.455994,2.02453,-2.195334,-0.811284,
+ -0.363523,-0.150625,0.919327,1.921881,-2.157616,-0.692678,
+ -0.587844,-0.244917,-0.771009,1.953911,-2.462233,-0.830594,
+ -0.363523,-0.150625,0.919327,1.921881,-2.157616,-0.692678,
+ -0.943599,-0.160394,0.289646,1.947264,-2.443232,-0.732587,
+ -0.239734,-0.173966,-0.955125,2.111557,-1.376942,-0.89657,
+ -0.157802,-0.148625,-0.976222,2.141273,-1.234642,-0.941254,
+ 0.608407,-0.244593,-0.754993,2.158051,-1.209613,-0.783941,
+ -0.239734,-0.173966,-0.955125,2.111557,-1.376942,-0.89657,
+ 0.608407,-0.244593,-0.754993,2.158051,-1.209613,-0.783941,
+ 0.727678,-0.414895,-0.546211,2.126237,-1.330172,-0.721011,
+ -0.498756,-0.2241,-0.83727,2.071448,-1.410118,-1.006192,
+ -0.329905,-0.225598,-0.916661,2.099566,-1.259996,-1.055763,
+ -0.157802,-0.148625,-0.976222,2.141273,-1.234642,-0.941254,
+ -0.498756,-0.2241,-0.83727,2.071448,-1.410118,-1.006192,
+ -0.157802,-0.148625,-0.976222,2.141273,-1.234642,-0.941254,
+ -0.239734,-0.173966,-0.955125,2.111557,-1.376942,-0.89657,
+ -0.759627,-0.28527,-0.584455,1.974215,-1.469208,-1.068951,
+ -0.661097,-0.258238,-0.70446,1.966698,-1.22816,-1.153716,
+ -0.329905,-0.225598,-0.916661,2.099566,-1.259996,-1.055763,
+ -0.759627,-0.28527,-0.584455,1.974215,-1.469208,-1.068951,
+ -0.329905,-0.225598,-0.916661,2.099566,-1.259996,-1.055763,
+ -0.498756,-0.2241,-0.83727,2.071448,-1.410118,-1.006192,
+ -0.672688,-0.442616,-0.592944,1.801794,-1.465464,-1.129277,
+ -0.632119,-0.359381,-0.686491,1.805207,-1.268427,-1.165317,
+ -0.661097,-0.258238,-0.70446,1.966698,-1.22816,-1.153716,
+ -0.672688,-0.442616,-0.592944,1.801794,-1.465464,-1.129277,
+ -0.661097,-0.258238,-0.70446,1.966698,-1.22816,-1.153716,
+ -0.759627,-0.28527,-0.584455,1.974215,-1.469208,-1.068951,
+ 0.954473,-0.270031,-0.126745,1.612396,-1.485728,-1.099731,
+ 0.942118,-0.292663,-0.163592,1.601721,-1.262359,-1.14142,
+ -0.632119,-0.359381,-0.686491,1.805207,-1.268427,-1.165317,
+ 0.954473,-0.270031,-0.126745,1.612396,-1.485728,-1.099731,
+ -0.632119,-0.359381,-0.686491,1.805207,-1.268427,-1.165317,
+ -0.672688,-0.442616,-0.592944,1.801794,-1.465464,-1.129277,
+ 0.80128,-0.303744,-0.515451,1.5167,-1.45305,-1.068516,
+ 0.772916,-0.305378,-0.556189,1.49748,-1.283201,-1.088258,
+ 0.942118,-0.292663,-0.163592,1.601721,-1.262359,-1.14142,
+ 0.80128,-0.303744,-0.515451,1.5167,-1.45305,-1.068516,
+ 0.942118,-0.292663,-0.163592,1.601721,-1.262359,-1.14142,
+ 0.954473,-0.270031,-0.126745,1.612396,-1.485728,-1.099731,
+ 0.441315,-0.29978,-0.845797,1.454817,-1.430228,-0.976569,
+ 0.38578,-0.259547,-0.88533,1.430817,-1.301205,-1.024924,
+ 0.772916,-0.305378,-0.556189,1.49748,-1.283201,-1.088258,
+ 0.441315,-0.29978,-0.845797,1.454817,-1.430228,-0.976569,
+ 0.772916,-0.305378,-0.556189,1.49748,-1.283201,-1.088258,
+ 0.80128,-0.303744,-0.515451,1.5167,-1.45305,-1.068516,
+ 0.080262,-0.270606,-0.959339,1.328862,-1.352627,-0.758733,
+ 0.02992,-0.202031,-0.978922,1.348219,-1.282064,-0.845204,
+ 0.38578,-0.259547,-0.88533,1.430817,-1.301205,-1.024924,
+ 0.080262,-0.270606,-0.959339,1.328862,-1.352627,-0.758733,
+ 0.38578,-0.259547,-0.88533,1.430817,-1.301205,-1.024924,
+ 0.441315,-0.29978,-0.845797,1.454817,-1.430228,-0.976569,
+ -0.157802,-0.148625,-0.976222,2.141273,-1.234642,-0.941254,
+ -0.019419,-0.11596,-0.993064,2.17745,-1.127765,-0.974416,
+ 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
+ -0.157802,-0.148625,-0.976222,2.141273,-1.234642,-0.941254,
+ 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
+ 0.608407,-0.244593,-0.754993,2.158051,-1.209613,-0.783941,
+ -0.329905,-0.225598,-0.916661,2.099566,-1.259996,-1.055763,
+ -0.182029,-0.190207,-0.964721,2.148553,-1.103067,-1.06541,
+ -0.019419,-0.11596,-0.993064,2.17745,-1.127765,-0.974416,
+ -0.329905,-0.225598,-0.916661,2.099566,-1.259996,-1.055763,
+ -0.019419,-0.11596,-0.993064,2.17745,-1.127765,-0.974416,
+ -0.157802,-0.148625,-0.976222,2.141273,-1.234642,-0.941254,
+ -0.661097,-0.258238,-0.70446,1.966698,-1.22816,-1.153716,
+ -0.571338,-0.120921,-0.811758,2.024692,-1.074646,-1.172465,
+ -0.182029,-0.190207,-0.964721,2.148553,-1.103067,-1.06541,
+ -0.661097,-0.258238,-0.70446,1.966698,-1.22816,-1.153716,
+ -0.182029,-0.190207,-0.964721,2.148553,-1.103067,-1.06541,
+ -0.329905,-0.225598,-0.916661,2.099566,-1.259996,-1.055763,
+ -0.632119,-0.359381,-0.686491,1.805207,-1.268427,-1.165317,
+ -0.587909,-0.233166,-0.774594,1.838895,-1.087204,-1.201408,
+ -0.571338,-0.120921,-0.811758,2.024692,-1.074646,-1.172465,
+ -0.632119,-0.359381,-0.686491,1.805207,-1.268427,-1.165317,
+ -0.571338,-0.120921,-0.811758,2.024692,-1.074646,-1.172465,
+ -0.661097,-0.258238,-0.70446,1.966698,-1.22816,-1.153716,
+ 0.942118,-0.292663,-0.163592,1.601721,-1.262359,-1.14142,
+ 0.924702,-0.311562,-0.218757,1.645819,-1.087442,-1.173773,
+ -0.587909,-0.233166,-0.774594,1.838895,-1.087204,-1.201408,
+ 0.942118,-0.292663,-0.163592,1.601721,-1.262359,-1.14142,
+ -0.587909,-0.233166,-0.774594,1.838895,-1.087204,-1.201408,
+ -0.632119,-0.359381,-0.686491,1.805207,-1.268427,-1.165317,
+ 0.772916,-0.305378,-0.556189,1.49748,-1.283201,-1.088258,
+ 0.73827,-0.277136,-0.614942,1.524407,-1.125312,-1.142248,
+ 0.924702,-0.311562,-0.218757,1.645819,-1.087442,-1.173773,
+ 0.772916,-0.305378,-0.556189,1.49748,-1.283201,-1.088258,
+ 0.924702,-0.311562,-0.218757,1.645819,-1.087442,-1.173773,
+ 0.942118,-0.292663,-0.163592,1.601721,-1.262359,-1.14142,
+ 0.38578,-0.259547,-0.88533,1.430817,-1.301205,-1.024924,
+ 0.366416,-0.175098,-0.913827,1.438439,-1.148029,-1.098069,
+ 0.73827,-0.277136,-0.614942,1.524407,-1.125312,-1.142248,
+ 0.38578,-0.259547,-0.88533,1.430817,-1.301205,-1.024924,
+ 0.73827,-0.277136,-0.614942,1.524407,-1.125312,-1.142248,
+ 0.772916,-0.305378,-0.556189,1.49748,-1.283201,-1.088258,
+ 0.02992,-0.202031,-0.978922,1.348219,-1.282064,-0.845204,
+ 0.023392,-0.110333,-0.993619,1.310865,-1.136322,-0.914838,
+ 0.366416,-0.175098,-0.913827,1.438439,-1.148029,-1.098069,
+ 0.02992,-0.202031,-0.978922,1.348219,-1.282064,-0.845204,
+ 0.366416,-0.175098,-0.913827,1.438439,-1.148029,-1.098069,
+ 0.38578,-0.259547,-0.88533,1.430817,-1.301205,-1.024924,
+ 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
+ 0.437631,-0.408484,-0.801012,2.0796,-1.473377,-0.654997,
+ 0.552828,-0.750794,-0.36151,2.0482,-1.581983,-0.555832,
+ 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
+ 0.552828,-0.750794,-0.36151,2.0482,-1.581983,-0.555832,
+ -0.084936,-0.226589,0.97028,1.963153,-1.588839,-0.612861,
+ 0.051664,-0.122235,-0.991156,1.804927,-1.581954,-1.089198,
+ -0.211092,-0.082708,-0.973961,1.650318,-1.645881,-1.053347,
+ 0.954473,-0.270031,-0.126745,1.612396,-1.485728,-1.099731,
+ 0.051664,-0.122235,-0.991156,1.804927,-1.581954,-1.089198,
+ 0.954473,-0.270031,-0.126745,1.612396,-1.485728,-1.099731,
+ -0.672688,-0.442616,-0.592944,1.801794,-1.465464,-1.129277,
+ 0.290478,-0.146424,-0.945612,1.937009,-1.625419,-1.026843,
+ 0.051664,-0.122235,-0.991156,1.804927,-1.581954,-1.089198,
+ -0.672688,-0.442616,-0.592944,1.801794,-1.465464,-1.129277,
+ 0.290478,-0.146424,-0.945612,1.937009,-1.625419,-1.026843,
+ -0.672688,-0.442616,-0.592944,1.801794,-1.465464,-1.129277,
+ -0.759627,-0.28527,-0.584455,1.974215,-1.469208,-1.068951,
+ 0.74023,-0.090866,-0.666185,2.036036,-1.57908,-0.967151,
+ 0.290478,-0.146424,-0.945612,1.937009,-1.625419,-1.026843,
+ -0.759627,-0.28527,-0.584455,1.974215,-1.469208,-1.068951,
+ 0.74023,-0.090866,-0.666185,2.036036,-1.57908,-0.967151,
+ -0.759627,-0.28527,-0.584455,1.974215,-1.469208,-1.068951,
+ -0.498756,-0.2241,-0.83727,2.071448,-1.410118,-1.006192,
+ 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
+ 0.74023,-0.090866,-0.666185,2.036036,-1.57908,-0.967151,
+ -0.498756,-0.2241,-0.83727,2.071448,-1.410118,-1.006192,
+ 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
+ -0.498756,-0.2241,-0.83727,2.071448,-1.410118,-1.006192,
+ -0.239734,-0.173966,-0.955125,2.111557,-1.376942,-0.89657,
+ 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
+ -0.239734,-0.173966,-0.955125,2.111557,-1.376942,-0.89657,
+ 0.727678,-0.414895,-0.546211,2.126237,-1.330172,-0.721011,
+ 0.999491,-0.02584,-0.01873,2.059844,-1.561331,-0.858957,
+ 0.727678,-0.414895,-0.546211,2.126237,-1.330172,-0.721011,
+ 0.437631,-0.408484,-0.801012,2.0796,-1.473377,-0.654997,
+ 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
+ -0.019419,-0.11596,-0.993064,2.17745,-1.127765,-0.974416,
+ -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
+ 0.70745,-0.193334,-0.679806,2.180012,-1.130557,-0.821812,
+ -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
+ -0.012663,0.029084,-0.999497,2.229345,-0.992723,-0.862826,
+ -0.587909,-0.233166,-0.774594,1.838895,-1.087204,-1.201408,
+ 0.924702,-0.311562,-0.218757,1.645819,-1.087442,-1.173773,
+ 0.859237,-0.17312,-0.481395,1.635139,-0.965221,-1.184968,
+ -0.587909,-0.233166,-0.774594,1.838895,-1.087204,-1.201408,
+ 0.859237,-0.17312,-0.481395,1.635139,-0.965221,-1.184968,
+ -0.942755,-0.29871,0.148273,1.867657,-0.920633,-1.206933,
+ -0.571338,-0.120921,-0.811758,2.024692,-1.074646,-1.172465,
+ -0.587909,-0.233166,-0.774594,1.838895,-1.087204,-1.201408,
+ -0.942755,-0.29871,0.148273,1.867657,-0.920633,-1.206933,
+ -0.571338,-0.120921,-0.811758,2.024692,-1.074646,-1.172465,
+ -0.942755,-0.29871,0.148273,1.867657,-0.920633,-1.206933,
+ -0.965506,-0.176768,0.191185,2.058189,-0.931238,-1.163518,
+ -0.182029,-0.190207,-0.964721,2.148553,-1.103067,-1.06541,
+ -0.571338,-0.120921,-0.811758,2.024692,-1.074646,-1.172465,
+ -0.965506,-0.176768,0.191185,2.058189,-0.931238,-1.163518,
+ -0.182029,-0.190207,-0.964721,2.148553,-1.103067,-1.06541,
+ -0.965506,-0.176768,0.191185,2.058189,-0.931238,-1.163518,
+ -0.809154,0.004832,-0.587577,2.158585,-0.955809,-1.113647,
+ -0.019419,-0.11596,-0.993064,2.17745,-1.127765,-0.974416,
+ -0.182029,-0.190207,-0.964721,2.148553,-1.103067,-1.06541,
+ -0.809154,0.004832,-0.587577,2.158585,-0.955809,-1.113647,
+ -0.019419,-0.11596,-0.993064,2.17745,-1.127765,-0.974416,
+ -0.809154,0.004832,-0.587577,2.158585,-0.955809,-1.113647,
+ -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
+ 0.080262,-0.270606,-0.959339,1.328862,-1.352627,-0.758733,
+ 0.441315,-0.29978,-0.845797,1.454817,-1.430228,-0.976569,
+ -0.970971,-0.219011,-0.096178,1.480629,-1.640132,-0.953447,
+ 0.080262,-0.270606,-0.959339,1.328862,-1.352627,-0.758733,
+ -0.970971,-0.219011,-0.096178,1.480629,-1.640132,-0.953447,
+ -0.794709,-0.185222,0.578041,1.451825,-1.576856,-0.702758,
+ 0.045651,-0.004499,-0.998947,1.337875,-0.945716,-1.021299,
+ 0.419396,-0.035927,-0.907092,1.428883,-0.98669,-1.133905,
+ 0.366416,-0.175098,-0.913827,1.438439,-1.148029,-1.098069,
+ 0.045651,-0.004499,-0.998947,1.337875,-0.945716,-1.021299,
+ 0.366416,-0.175098,-0.913827,1.438439,-1.148029,-1.098069,
+ 0.023392,-0.110333,-0.993619,1.310865,-1.136322,-0.914838,
+ 0.80128,-0.303744,-0.515451,1.5167,-1.45305,-1.068516,
+ 0.954473,-0.270031,-0.126745,1.612396,-1.485728,-1.099731,
+ -0.211092,-0.082708,-0.973961,1.650318,-1.645881,-1.053347,
+ 0.80128,-0.303744,-0.515451,1.5167,-1.45305,-1.068516,
+ -0.211092,-0.082708,-0.973961,1.650318,-1.645881,-1.053347,
+ -0.652584,-0.147678,-0.743186,1.54175,-1.643613,-1.01419,
+ 0.441315,-0.29978,-0.845797,1.454817,-1.430228,-0.976569,
+ 0.80128,-0.303744,-0.515451,1.5167,-1.45305,-1.068516,
+ -0.652584,-0.147678,-0.743186,1.54175,-1.643613,-1.01419,
+ 0.441315,-0.29978,-0.845797,1.454817,-1.430228,-0.976569,
+ -0.652584,-0.147678,-0.743186,1.54175,-1.643613,-1.01419,
+ -0.970971,-0.219011,-0.096178,1.480629,-1.640132,-0.953447,
+ 0.714393,-0.109998,-0.691045,1.536037,-0.985876,-1.185597,
+ 0.859237,-0.17312,-0.481395,1.635139,-0.965221,-1.184968,
+ 0.924702,-0.311562,-0.218757,1.645819,-1.087442,-1.173773,
+ 0.714393,-0.109998,-0.691045,1.536037,-0.985876,-1.185597,
+ 0.924702,-0.311562,-0.218757,1.645819,-1.087442,-1.173773,
+ 0.73827,-0.277136,-0.614942,1.524407,-1.125312,-1.142248,
+ 0.419396,-0.035927,-0.907092,1.428883,-0.98669,-1.133905,
+ 0.714393,-0.109998,-0.691045,1.536037,-0.985876,-1.185597,
+ 0.73827,-0.277136,-0.614942,1.524407,-1.125312,-1.142248,
+ 0.419396,-0.035927,-0.907092,1.428883,-0.98669,-1.133905,
+ 0.73827,-0.277136,-0.614942,1.524407,-1.125312,-1.142248,
+ 0.366416,-0.175098,-0.913827,1.438439,-1.148029,-1.098069,
+ 0.261393,-0.399072,-0.878872,3.233975,2.059193,-0.072431,
+ 0.441787,-0.375177,-0.814903,3.009101,1.971604,-0.03422,
+ 0.889638,-0.392482,0.233458,2.985371,1.982663,0,
+ 0.261393,-0.399072,-0.878872,3.233975,2.059193,-0.072431,
+ 0.889638,-0.392482,0.233458,2.985371,1.982663,0,
+ -0.861251,0.383698,-0.333202,3.247406,2.073333,0,
+ 0.428291,-0.499911,-0.752765,3.252224,2.026347,-0.148215,
+ 0.483908,-0.405185,-0.775667,3.036361,1.913989,-0.169838,
+ 0.441787,-0.375177,-0.814903,3.009101,1.971604,-0.03422,
+ 0.428291,-0.499911,-0.752765,3.252224,2.026347,-0.148215,
+ 0.441787,-0.375177,-0.814903,3.009101,1.971604,-0.03422,
+ 0.261393,-0.399072,-0.878872,3.233975,2.059193,-0.072431,
+ 0.454048,-0.464454,-0.760344,3.276333,1.863773,-0.294266,
+ 0.482381,-0.398126,-0.780259,3.058366,1.773346,-0.297337,
+ 0.483908,-0.405185,-0.775667,3.036361,1.913989,-0.169838,
+ 0.454048,-0.464454,-0.760344,3.276333,1.863773,-0.294266,
+ 0.483908,-0.405185,-0.775667,3.036361,1.913989,-0.169838,
+ 0.428291,-0.499911,-0.752765,3.252224,2.026347,-0.148215,
+ 0.673211,-0.58089,-0.457551,3.337545,1.748927,-0.34021,
+ 0.702554,-0.570096,-0.42592,3.086666,1.632991,-0.338863,
+ 0.482381,-0.398126,-0.780259,3.058366,1.773346,-0.297337,
+ 0.673211,-0.58089,-0.457551,3.337545,1.748927,-0.34021,
+ 0.482381,-0.398126,-0.780259,3.058366,1.773346,-0.297337,
+ 0.454048,-0.464454,-0.760344,3.276333,1.863773,-0.294266,
+ -0.384424,0.863444,-0.326623,3.377233,1.5878,-0.400781,
+ -0.317114,0.866865,-0.384686,3.115383,1.49239,-0.380228,
+ 0.702554,-0.570096,-0.42592,3.086666,1.632991,-0.338863,
+ -0.384424,0.863444,-0.326623,3.377233,1.5878,-0.400781,
+ 0.702554,-0.570096,-0.42592,3.086666,1.632991,-0.338863,
+ 0.673211,-0.58089,-0.457551,3.337545,1.748927,-0.34021,
+ -0.354832,0.724971,-0.590348,3.47341,1.366149,-0.454658,
+ -0.273708,0.760234,-0.589175,3.163181,1.209972,-0.462438,
+ -0.317114,0.866865,-0.384686,3.115383,1.49239,-0.380228,
+ -0.354832,0.724971,-0.590348,3.47341,1.366149,-0.454658,
+ -0.317114,0.866865,-0.384686,3.115383,1.49239,-0.380228,
+ -0.384424,0.863444,-0.326623,3.377233,1.5878,-0.400781,
+ -0.270788,0.46353,-0.84369,3.528445,1.060127,-0.489443,
+ -0.158888,0.47696,-0.864444,3.189664,0.907503,-0.500122,
+ -0.273708,0.760234,-0.589175,3.163181,1.209972,-0.462438,
+ -0.270788,0.46353,-0.84369,3.528445,1.060127,-0.489443,
+ -0.273708,0.760234,-0.589175,3.163181,1.209972,-0.462438,
+ -0.354832,0.724971,-0.590348,3.47341,1.366149,-0.454658,
+ -0.203969,0.261593,-0.94338,3.559394,0.706516,-0.452535,
+ -0.095989,0.297871,-0.949768,3.280681,0.510802,-0.499434,
+ -0.158888,0.47696,-0.864444,3.189664,0.907503,-0.500122,
+ -0.203969,0.261593,-0.94338,3.559394,0.706516,-0.452535,
+ -0.158888,0.47696,-0.864444,3.189664,0.907503,-0.500122,
+ -0.270788,0.46353,-0.84369,3.528445,1.060127,-0.489443,
+ -0.175197,0.22468,-0.958553,3.61965,0.472046,-0.391742,
+ -0.078774,0.27578,-0.957987,3.321825,0.26669,-0.46575,
+ -0.095989,0.297871,-0.949768,3.280681,0.510802,-0.499434,
+ -0.175197,0.22468,-0.958553,3.61965,0.472046,-0.391742,
+ -0.095989,0.297871,-0.949768,3.280681,0.510802,-0.499434,
+ -0.203969,0.261593,-0.94338,3.559394,0.706516,-0.452535,
+ -0.128537,0.152973,-0.979835,3.641195,0.407454,-0.362198,
+ -0.027323,0.180938,-0.983115,3.36004,0.165487,-0.412685,
+ -0.078774,0.27578,-0.957987,3.321825,0.26669,-0.46575,
+ -0.128537,0.152973,-0.979835,3.641195,0.407454,-0.362198,
+ -0.078774,0.27578,-0.957987,3.321825,0.26669,-0.46575,
+ -0.175197,0.22468,-0.958553,3.61965,0.472046,-0.391742,
+ -0.023695,0.006701,-0.999697,3.67471,0.338839,-0.30784,
+ 0.065337,0.07376,-0.995133,3.378799,0.073736,-0.355362,
+ -0.027323,0.180938,-0.983115,3.36004,0.165487,-0.412685,
+ -0.023695,0.006701,-0.999697,3.67471,0.338839,-0.30784,
+ -0.027323,0.180938,-0.983115,3.36004,0.165487,-0.412685,
+ -0.128537,0.152973,-0.979835,3.641195,0.407454,-0.362198,
+ 0.144017,-0.141696,-0.979378,3.700363,0.265794,-0.240762,
+ 0.226651,-0.023678,-0.973688,3.43895,-0.08258,-0.257015,
+ 0.065337,0.07376,-0.995133,3.378799,0.073736,-0.355362,
+ 0.144017,-0.141696,-0.979378,3.700363,0.265794,-0.240762,
+ 0.065337,0.07376,-0.995133,3.378799,0.073736,-0.355362,
+ -0.023695,0.006701,-0.999697,3.67471,0.338839,-0.30784,
+ 0.325831,-0.277459,-0.903798,3.737014,0.181837,-0.176819,
+ 0.383941,-0.196382,-0.902232,3.514981,-0.121886,-0.187589,
+ 0.226651,-0.023678,-0.973688,3.43895,-0.08258,-0.257015,
+ 0.325831,-0.277459,-0.903798,3.737014,0.181837,-0.176819,
+ 0.226651,-0.023678,-0.973688,3.43895,-0.08258,-0.257015,
+ 0.144017,-0.141696,-0.979378,3.700363,0.265794,-0.240762,
+ -0.910859,-0.100368,-0.400327,3.731689,0.186391,0,
+ 0.431966,-0.771434,0.46722,3.486028,-0.141683,0,
+ 0.383941,-0.196382,-0.902232,3.514981,-0.121886,-0.187589,
+ -0.910859,-0.100368,-0.400327,3.731689,0.186391,0,
+ 0.383941,-0.196382,-0.902232,3.514981,-0.121886,-0.187589,
+ 0.325831,-0.277459,-0.903798,3.737014,0.181837,-0.176819,
+ 0.431966,-0.771434,-0.46722,3.71636,2.343387,0,
+ -0.451389,0.892327,-0.00019,3.727093,2.308406,-0.150049,
+ 0.020519,-0.282941,-0.958918,3.4583,2.151656,-0.102662,
+ 0.431966,-0.771434,-0.46722,3.71636,2.343387,0,
+ 0.020519,-0.282941,-0.958918,3.4583,2.151656,-0.102662,
+ 0.694153,-0.467999,0.546926,3.454971,2.169877,0,
+ -0.086812,-0.050981,-0.994919,4.120842,0.627141,-0.185461,
+ -0.926486,-0.356041,-0.121897,4.126565,0.642027,0,
+ 0.338485,-0.103202,-0.935295,3.929251,0.411689,0,
+ -0.086812,-0.050981,-0.994919,4.120842,0.627141,-0.185461,
+ 0.338485,-0.103202,-0.935295,3.929251,0.411689,0,
+ 0.07924,-0.231862,-0.969516,3.955635,0.432417,-0.197586,
+ -0.086812,-0.050981,-0.994919,4.120842,0.627141,-0.185461,
+ 0.07924,-0.231862,-0.969516,3.955635,0.432417,-0.197586,
+ -0.081635,-0.03459,-0.996062,3.889626,0.475277,-0.247365,
+ -0.172151,0.101796,-0.979797,4.105198,0.672581,-0.300001,
+ -0.086812,-0.050981,-0.994919,4.120842,0.627141,-0.185461,
+ -0.081635,-0.03459,-0.996062,3.889626,0.475277,-0.247365,
+ -0.172151,0.101796,-0.979797,4.105198,0.672581,-0.300001,
+ -0.081635,-0.03459,-0.996062,3.889626,0.475277,-0.247365,
+ -0.178707,0.132414,-0.974951,3.861841,0.560638,-0.311961,
+ -0.195132,0.128745,-0.97229,4.068249,0.798926,-0.400813,
+ -0.172151,0.101796,-0.979797,4.105198,0.672581,-0.300001,
+ -0.178707,0.132414,-0.974951,3.861841,0.560638,-0.311961,
+ -0.195132,0.128745,-0.97229,4.068249,0.798926,-0.400813,
+ -0.178707,0.132414,-0.974951,3.861841,0.560638,-0.311961,
+ -0.21777,0.161093,-0.962614,3.849352,0.664451,-0.387198,
+ -0.434016,0.136262,-0.890541,4.041657,1.039756,-0.496922,
+ -0.195132,0.128745,-0.97229,4.068249,0.798926,-0.400813,
+ -0.21777,0.161093,-0.962614,3.849352,0.664451,-0.387198,
+ -0.434016,0.136262,-0.890541,4.041657,1.039756,-0.496922,
+ -0.21777,0.161093,-0.962614,3.849352,0.664451,-0.387198,
+ -0.273816,0.228927,-0.93414,3.823137,0.853054,-0.461519,
+ -0.601466,0.441167,-0.666041,3.98851,1.297806,-0.539537,
+ -0.434016,0.136262,-0.890541,4.041657,1.039756,-0.496922,
+ -0.273816,0.228927,-0.93414,3.823137,0.853054,-0.461519,
+ -0.601466,0.441167,-0.666041,3.98851,1.297806,-0.539537,
+ -0.273816,0.228927,-0.93414,3.823137,0.853054,-0.461519,
+ -0.385487,0.478576,-0.788901,3.747724,1.184933,-0.518662,
+ -0.571598,0.654164,-0.495323,3.886058,1.550141,-0.50483,
+ -0.601466,0.441167,-0.666041,3.98851,1.297806,-0.539537,
+ -0.385487,0.478576,-0.788901,3.747724,1.184933,-0.518662,
+ -0.571598,0.654164,-0.495323,3.886058,1.550141,-0.50483,
+ -0.385487,0.478576,-0.788901,3.747724,1.184933,-0.518662,
+ -0.447812,0.698934,-0.557634,3.650974,1.46374,-0.478617,
+ -0.564871,0.754993,-0.333026,3.881998,1.764428,-0.476337,
+ -0.571598,0.654164,-0.495323,3.886058,1.550141,-0.50483,
+ -0.447812,0.698934,-0.557634,3.650974,1.46374,-0.478617,
+ -0.564871,0.754993,-0.333026,3.881998,1.764428,-0.476337,
+ -0.447812,0.698934,-0.557634,3.650974,1.46374,-0.478617,
+ -0.463441,0.825581,-0.321928,3.590526,1.70109,-0.411994,
+ -0.512639,0.858604,-0.000762,3.814876,1.968416,-0.443,
+ -0.564871,0.754993,-0.333026,3.881998,1.764428,-0.476337,
+ -0.463441,0.825581,-0.321928,3.590526,1.70109,-0.411994,
+ -0.512639,0.858604,-0.000762,3.814876,1.968416,-0.443,
+ -0.463441,0.825581,-0.321928,3.590526,1.70109,-0.411994,
+ 0.492397,-0.77993,-0.386336,3.541188,1.849183,-0.386366,
+ -0.698288,0.715816,-0.000608,3.758215,2.206683,-0.323051,
+ -0.512639,0.858604,-0.000762,3.814876,1.968416,-0.443,
+ 0.492397,-0.77993,-0.386336,3.541188,1.849183,-0.386366,
+ -0.698288,0.715816,-0.000608,3.758215,2.206683,-0.323051,
+ 0.492397,-0.77993,-0.386336,3.541188,1.849183,-0.386366,
+ 0.313443,-0.691245,-0.651102,3.479418,1.97825,-0.317478,
+ -0.777939,0.62834,-0.000226,3.745669,2.266001,-0.24193,
+ -0.698288,0.715816,-0.000608,3.758215,2.206683,-0.323051,
+ 0.313443,-0.691245,-0.651102,3.479418,1.97825,-0.317478,
+ -0.777939,0.62834,-0.000226,3.745669,2.266001,-0.24193,
+ 0.313443,-0.691245,-0.651102,3.479418,1.97825,-0.317478,
+ 0.161194,-0.480657,-0.861966,3.460196,2.103494,-0.180368,
+ -0.451389,0.892327,-0.00019,3.727093,2.308406,-0.150049,
+ -0.777939,0.62834,-0.000226,3.745669,2.266001,-0.24193,
+ 0.161194,-0.480657,-0.861966,3.460196,2.103494,-0.180368,
+ -0.451389,0.892327,-0.00019,3.727093,2.308406,-0.150049,
+ 0.161194,-0.480657,-0.861966,3.460196,2.103494,-0.180368,
+ 0.020519,-0.282941,-0.958918,3.4583,2.151656,-0.102662,
+ -0.476715,0.879058,0,3.118124,-0.703925,0,
+ 0.533629,-0.162705,-0.82992,3.107533,-0.691019,-0.264602,
+ 0.445439,-0.182623,-0.876489,3.342159,-0.384674,-0.201349,
+ -0.476715,0.879058,0,3.118124,-0.703925,0,
+ 0.445439,-0.182623,-0.876489,3.342159,-0.384674,-0.201349,
+ -0.560204,0.828355,-0.00034,3.33521,-0.375755,0,
+ 0.474213,-0.311965,-0.823286,2.361089,1.76666,-0.202595,
+ 0.536218,-0.84408,0.000006,2.339597,1.807702,0,
+ -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
+ 0.474213,-0.311965,-0.823286,2.361089,1.76666,-0.202595,
+ -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
+ 0.45552,-0.330524,-0.826593,2.715712,1.828219,-0.167709,
+ 0.488174,-0.280956,-0.826287,2.406969,1.645328,-0.341479,
+ 0.474213,-0.311965,-0.823286,2.361089,1.76666,-0.202595,
+ 0.45552,-0.330524,-0.826593,2.715712,1.828219,-0.167709,
+ 0.488174,-0.280956,-0.826287,2.406969,1.645328,-0.341479,
+ 0.45552,-0.330524,-0.826593,2.715712,1.828219,-0.167709,
+ 0.489736,-0.346185,-0.800197,2.738132,1.687333,-0.295046,
+ 0.531574,-0.288506,-0.796362,2.519027,1.485931,-0.422962,
+ 0.488174,-0.280956,-0.826287,2.406969,1.645328,-0.341479,
+ 0.489736,-0.346185,-0.800197,2.738132,1.687333,-0.295046,
+ 0.531574,-0.288506,-0.796362,2.519027,1.485931,-0.422962,
+ 0.489736,-0.346185,-0.800197,2.738132,1.687333,-0.295046,
+ 0.5205,-0.336657,-0.784692,2.77568,1.53871,-0.352829,
+ 0.769657,-0.480833,-0.420033,2.553871,1.284278,-0.512335,
+ 0.531574,-0.288506,-0.796362,2.519027,1.485931,-0.422962,
+ 0.5205,-0.336657,-0.784692,2.77568,1.53871,-0.352829,
+ 0.769657,-0.480833,-0.420033,2.553871,1.284278,-0.512335,
+ 0.5205,-0.336657,-0.784692,2.77568,1.53871,-0.352829,
+ 0.760747,-0.509474,-0.40212,2.815366,1.377583,-0.413399,
+ -0.080985,0.883253,-0.461851,2.637461,1.01726,-0.581611,
+ 0.769657,-0.480833,-0.420033,2.553871,1.284278,-0.512335,
+ 0.760747,-0.509474,-0.40212,2.815366,1.377583,-0.413399,
+ -0.080985,0.883253,-0.461851,2.637461,1.01726,-0.581611,
+ 0.760747,-0.509474,-0.40212,2.815366,1.377583,-0.413399,
+ -0.16423,0.819635,-0.548842,2.854291,1.093951,-0.49465,
+ 0.040193,0.650965,-0.758043,2.747937,0.712253,-0.615674,
+ -0.080985,0.883253,-0.461851,2.637461,1.01726,-0.581611,
+ -0.16423,0.819635,-0.548842,2.854291,1.093951,-0.49465,
+ 0.040193,0.650965,-0.758043,2.747937,0.712253,-0.615674,
+ -0.16423,0.819635,-0.548842,2.854291,1.093951,-0.49465,
+ -0.043323,0.541029,-0.839887,2.948387,0.783357,-0.515058,
+ 0.177367,0.480226,-0.859025,2.811504,0.469098,-0.657443,
+ 0.040193,0.650965,-0.758043,2.747937,0.712253,-0.615674,
+ -0.043323,0.541029,-0.839887,2.948387,0.783357,-0.515058,
+ 0.177367,0.480226,-0.859025,2.811504,0.469098,-0.657443,
+ -0.043323,0.541029,-0.839887,2.948387,0.783357,-0.515058,
+ 0.04432,0.372862,-0.926828,3.06109,0.397226,-0.574193,
+ 0.288711,0.386915,-0.875753,2.898733,0.271916,-0.651298,
+ 0.177367,0.480226,-0.859025,2.811504,0.469098,-0.657443,
+ 0.04432,0.372862,-0.926828,3.06109,0.397226,-0.574193,
+ 0.41428,0.318289,-0.852681,2.91987,0.084875,-0.64246,
+ 0.288711,0.386915,-0.875753,2.898733,0.271916,-0.651298,
+ 0.04432,0.372862,-0.926828,3.06109,0.397226,-0.574193,
+ 0.41428,0.318289,-0.852681,2.91987,0.084875,-0.64246,
+ 0.04432,0.372862,-0.926828,3.06109,0.397226,-0.574193,
+ 0.098376,0.32868,-0.939304,3.136321,0.171237,-0.539896,
+ 0.519338,0.264458,-0.812619,2.953029,-0.12769,-0.520499,
+ 0.41428,0.318289,-0.852681,2.91987,0.084875,-0.64246,
+ 0.098376,0.32868,-0.939304,3.136321,0.171237,-0.539896,
+ 0.519338,0.264458,-0.812619,2.953029,-0.12769,-0.520499,
+ 0.098376,0.32868,-0.939304,3.136321,0.171237,-0.539896,
+ 0.159882,0.223439,-0.961516,3.16616,0.02131,-0.457261,
+ 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
+ 0.519338,0.264458,-0.812619,2.953029,-0.12769,-0.520499,
+ 0.159882,0.223439,-0.961516,3.16616,0.02131,-0.457261,
+ 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
+ 0.159882,0.223439,-0.961516,3.16616,0.02131,-0.457261,
+ 0.224429,0.165293,-0.96037,3.199571,-0.153739,-0.38015,
+ 0.449624,0.075438,-0.890027,3.053144,-0.609681,-0.326931,
+ 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
+ 0.224429,0.165293,-0.96037,3.199571,-0.153739,-0.38015,
+ 0.449624,0.075438,-0.890027,3.053144,-0.609681,-0.326931,
+ 0.224429,0.165293,-0.96037,3.199571,-0.153739,-0.38015,
+ 0.331391,0.08899,-0.939287,3.286426,-0.300744,-0.276331,
+ 0.533629,-0.162705,-0.82992,3.107533,-0.691019,-0.264602,
+ 0.449624,0.075438,-0.890027,3.053144,-0.609681,-0.326931,
+ 0.331391,0.08899,-0.939287,3.286426,-0.300744,-0.276331,
+ 0.533629,-0.162705,-0.82992,3.107533,-0.691019,-0.264602,
+ 0.331391,0.08899,-0.939287,3.286426,-0.300744,-0.276331,
+ 0.445439,-0.182623,-0.876489,3.342159,-0.384674,-0.201349,
+ 0.694153,-0.467999,0.546926,3.454971,2.169877,0,
+ 0.020519,-0.282941,-0.958918,3.4583,2.151656,-0.102662,
+ 0.261393,-0.399072,-0.878872,3.233975,2.059193,-0.072431,
+ 0.694153,-0.467999,0.546926,3.454971,2.169877,0,
+ 0.261393,-0.399072,-0.878872,3.233975,2.059193,-0.072431,
+ -0.861251,0.383698,-0.333202,3.247406,2.073333,0,
+ -0.560204,0.828355,-0.00034,3.33521,-0.375755,0,
+ 0.445439,-0.182623,-0.876489,3.342159,-0.384674,-0.201349,
+ 0.383941,-0.196382,-0.902232,3.514981,-0.121886,-0.187589,
+ -0.560204,0.828355,-0.00034,3.33521,-0.375755,0,
+ 0.383941,-0.196382,-0.902232,3.514981,-0.121886,-0.187589,
+ 0.431966,-0.771434,0.46722,3.486028,-0.141683,0,
+ -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
+ 0.889638,-0.392482,0.233458,2.985371,1.982663,0,
+ 0.441787,-0.375177,-0.814903,3.009101,1.971604,-0.03422,
+ 0.45552,-0.330524,-0.826593,2.715712,1.828219,-0.167709,
+ -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
+ 0.441787,-0.375177,-0.814903,3.009101,1.971604,-0.03422,
+ 0.45552,-0.330524,-0.826593,2.715712,1.828219,-0.167709,
+ 0.441787,-0.375177,-0.814903,3.009101,1.971604,-0.03422,
+ 0.483908,-0.405185,-0.775667,3.036361,1.913989,-0.169838,
+ 0.489736,-0.346185,-0.800197,2.738132,1.687333,-0.295046,
+ 0.45552,-0.330524,-0.826593,2.715712,1.828219,-0.167709,
+ 0.483908,-0.405185,-0.775667,3.036361,1.913989,-0.169838,
+ 0.489736,-0.346185,-0.800197,2.738132,1.687333,-0.295046,
+ 0.483908,-0.405185,-0.775667,3.036361,1.913989,-0.169838,
+ 0.482381,-0.398126,-0.780259,3.058366,1.773346,-0.297337,
+ 0.5205,-0.336657,-0.784692,2.77568,1.53871,-0.352829,
+ 0.489736,-0.346185,-0.800197,2.738132,1.687333,-0.295046,
+ 0.482381,-0.398126,-0.780259,3.058366,1.773346,-0.297337,
+ 0.5205,-0.336657,-0.784692,2.77568,1.53871,-0.352829,
+ 0.482381,-0.398126,-0.780259,3.058366,1.773346,-0.297337,
+ 0.702554,-0.570096,-0.42592,3.086666,1.632991,-0.338863,
+ 0.760747,-0.509474,-0.40212,2.815366,1.377583,-0.413399,
+ 0.5205,-0.336657,-0.784692,2.77568,1.53871,-0.352829,
+ 0.702554,-0.570096,-0.42592,3.086666,1.632991,-0.338863,
+ 0.760747,-0.509474,-0.40212,2.815366,1.377583,-0.413399,
+ 0.702554,-0.570096,-0.42592,3.086666,1.632991,-0.338863,
+ -0.317114,0.866865,-0.384686,3.115383,1.49239,-0.380228,
+ -0.16423,0.819635,-0.548842,2.854291,1.093951,-0.49465,
+ 0.760747,-0.509474,-0.40212,2.815366,1.377583,-0.413399,
+ -0.317114,0.866865,-0.384686,3.115383,1.49239,-0.380228,
+ -0.16423,0.819635,-0.548842,2.854291,1.093951,-0.49465,
+ -0.317114,0.866865,-0.384686,3.115383,1.49239,-0.380228,
+ -0.273708,0.760234,-0.589175,3.163181,1.209972,-0.462438,
+ -0.043323,0.541029,-0.839887,2.948387,0.783357,-0.515058,
+ -0.16423,0.819635,-0.548842,2.854291,1.093951,-0.49465,
+ -0.273708,0.760234,-0.589175,3.163181,1.209972,-0.462438,
+ -0.043323,0.541029,-0.839887,2.948387,0.783357,-0.515058,
+ -0.273708,0.760234,-0.589175,3.163181,1.209972,-0.462438,
+ -0.158888,0.47696,-0.864444,3.189664,0.907503,-0.500122,
+ 0.04432,0.372862,-0.926828,3.06109,0.397226,-0.574193,
+ -0.043323,0.541029,-0.839887,2.948387,0.783357,-0.515058,
+ -0.158888,0.47696,-0.864444,3.189664,0.907503,-0.500122,
+ 0.04432,0.372862,-0.926828,3.06109,0.397226,-0.574193,
+ -0.158888,0.47696,-0.864444,3.189664,0.907503,-0.500122,
+ -0.095989,0.297871,-0.949768,3.280681,0.510802,-0.499434,
+ 0.098376,0.32868,-0.939304,3.136321,0.171237,-0.539896,
+ 0.04432,0.372862,-0.926828,3.06109,0.397226,-0.574193,
+ -0.095989,0.297871,-0.949768,3.280681,0.510802,-0.499434,
+ 0.098376,0.32868,-0.939304,3.136321,0.171237,-0.539896,
+ -0.095989,0.297871,-0.949768,3.280681,0.510802,-0.499434,
+ -0.078774,0.27578,-0.957987,3.321825,0.26669,-0.46575,
+ 0.159882,0.223439,-0.961516,3.16616,0.02131,-0.457261,
+ 0.098376,0.32868,-0.939304,3.136321,0.171237,-0.539896,
+ -0.078774,0.27578,-0.957987,3.321825,0.26669,-0.46575,
+ 0.159882,0.223439,-0.961516,3.16616,0.02131,-0.457261,
+ -0.078774,0.27578,-0.957987,3.321825,0.26669,-0.46575,
+ -0.027323,0.180938,-0.983115,3.36004,0.165487,-0.412685,
+ 0.224429,0.165293,-0.96037,3.199571,-0.153739,-0.38015,
+ 0.159882,0.223439,-0.961516,3.16616,0.02131,-0.457261,
+ -0.027323,0.180938,-0.983115,3.36004,0.165487,-0.412685,
+ 0.224429,0.165293,-0.96037,3.199571,-0.153739,-0.38015,
+ -0.027323,0.180938,-0.983115,3.36004,0.165487,-0.412685,
+ 0.065337,0.07376,-0.995133,3.378799,0.073736,-0.355362,
+ 0.331391,0.08899,-0.939287,3.286426,-0.300744,-0.276331,
+ 0.224429,0.165293,-0.96037,3.199571,-0.153739,-0.38015,
+ 0.065337,0.07376,-0.995133,3.378799,0.073736,-0.355362,
+ 0.331391,0.08899,-0.939287,3.286426,-0.300744,-0.276331,
+ 0.065337,0.07376,-0.995133,3.378799,0.073736,-0.355362,
+ 0.226651,-0.023678,-0.973688,3.43895,-0.08258,-0.257015,
+ 0.445439,-0.182623,-0.876489,3.342159,-0.384674,-0.201349,
+ 0.331391,0.08899,-0.939287,3.286426,-0.300744,-0.276331,
+ 0.226651,-0.023678,-0.973688,3.43895,-0.08258,-0.257015,
+ 0.445439,-0.182623,-0.876489,3.342159,-0.384674,-0.201349,
+ 0.226651,-0.023678,-0.973688,3.43895,-0.08258,-0.257015,
+ 0.383941,-0.196382,-0.902232,3.514981,-0.121886,-0.187589,
+ 0.07924,-0.231862,-0.969516,3.955635,0.432417,-0.197586,
+ 0.338485,-0.103202,-0.935295,3.929251,0.411689,0,
+ -0.910859,-0.100368,-0.400327,3.731689,0.186391,0,
+ 0.07924,-0.231862,-0.969516,3.955635,0.432417,-0.197586,
+ -0.910859,-0.100368,-0.400327,3.731689,0.186391,0,
+ 0.325831,-0.277459,-0.903798,3.737014,0.181837,-0.176819,
+ -0.081635,-0.03459,-0.996062,3.889626,0.475277,-0.247365,
+ 0.07924,-0.231862,-0.969516,3.955635,0.432417,-0.197586,
+ 0.325831,-0.277459,-0.903798,3.737014,0.181837,-0.176819,
+ -0.081635,-0.03459,-0.996062,3.889626,0.475277,-0.247365,
+ 0.325831,-0.277459,-0.903798,3.737014,0.181837,-0.176819,
+ 0.144017,-0.141696,-0.979378,3.700363,0.265794,-0.240762,
+ -0.178707,0.132414,-0.974951,3.861841,0.560638,-0.311961,
+ -0.081635,-0.03459,-0.996062,3.889626,0.475277,-0.247365,
+ 0.144017,-0.141696,-0.979378,3.700363,0.265794,-0.240762,
+ -0.178707,0.132414,-0.974951,3.861841,0.560638,-0.311961,
+ 0.144017,-0.141696,-0.979378,3.700363,0.265794,-0.240762,
+ -0.023695,0.006701,-0.999697,3.67471,0.338839,-0.30784,
+ -0.178707,0.132414,-0.974951,3.861841,0.560638,-0.311961,
+ -0.023695,0.006701,-0.999697,3.67471,0.338839,-0.30784,
+ -0.128537,0.152973,-0.979835,3.641195,0.407454,-0.362198,
+ -0.21777,0.161093,-0.962614,3.849352,0.664451,-0.387198,
+ -0.178707,0.132414,-0.974951,3.861841,0.560638,-0.311961,
+ -0.128537,0.152973,-0.979835,3.641195,0.407454,-0.362198,
+ -0.21777,0.161093,-0.962614,3.849352,0.664451,-0.387198,
+ -0.128537,0.152973,-0.979835,3.641195,0.407454,-0.362198,
+ -0.175197,0.22468,-0.958553,3.61965,0.472046,-0.391742,
+ -0.273816,0.228927,-0.93414,3.823137,0.853054,-0.461519,
+ -0.21777,0.161093,-0.962614,3.849352,0.664451,-0.387198,
+ -0.175197,0.22468,-0.958553,3.61965,0.472046,-0.391742,
+ -0.273816,0.228927,-0.93414,3.823137,0.853054,-0.461519,
+ -0.175197,0.22468,-0.958553,3.61965,0.472046,-0.391742,
+ -0.203969,0.261593,-0.94338,3.559394,0.706516,-0.452535,
+ -0.385487,0.478576,-0.788901,3.747724,1.184933,-0.518662,
+ -0.273816,0.228927,-0.93414,3.823137,0.853054,-0.461519,
+ -0.203969,0.261593,-0.94338,3.559394,0.706516,-0.452535,
+ -0.385487,0.478576,-0.788901,3.747724,1.184933,-0.518662,
+ -0.203969,0.261593,-0.94338,3.559394,0.706516,-0.452535,
+ -0.270788,0.46353,-0.84369,3.528445,1.060127,-0.489443,
+ -0.447812,0.698934,-0.557634,3.650974,1.46374,-0.478617,
+ -0.385487,0.478576,-0.788901,3.747724,1.184933,-0.518662,
+ -0.270788,0.46353,-0.84369,3.528445,1.060127,-0.489443,
+ -0.447812,0.698934,-0.557634,3.650974,1.46374,-0.478617,
+ -0.270788,0.46353,-0.84369,3.528445,1.060127,-0.489443,
+ -0.354832,0.724971,-0.590348,3.47341,1.366149,-0.454658,
+ -0.463441,0.825581,-0.321928,3.590526,1.70109,-0.411994,
+ -0.447812,0.698934,-0.557634,3.650974,1.46374,-0.478617,
+ -0.354832,0.724971,-0.590348,3.47341,1.366149,-0.454658,
+ -0.463441,0.825581,-0.321928,3.590526,1.70109,-0.411994,
+ -0.354832,0.724971,-0.590348,3.47341,1.366149,-0.454658,
+ -0.384424,0.863444,-0.326623,3.377233,1.5878,-0.400781,
+ 0.492397,-0.77993,-0.386336,3.541188,1.849183,-0.386366,
+ -0.463441,0.825581,-0.321928,3.590526,1.70109,-0.411994,
+ -0.384424,0.863444,-0.326623,3.377233,1.5878,-0.400781,
+ 0.492397,-0.77993,-0.386336,3.541188,1.849183,-0.386366,
+ -0.384424,0.863444,-0.326623,3.377233,1.5878,-0.400781,
+ 0.673211,-0.58089,-0.457551,3.337545,1.748927,-0.34021,
+ 0.313443,-0.691245,-0.651102,3.479418,1.97825,-0.317478,
+ 0.492397,-0.77993,-0.386336,3.541188,1.849183,-0.386366,
+ 0.673211,-0.58089,-0.457551,3.337545,1.748927,-0.34021,
+ 0.313443,-0.691245,-0.651102,3.479418,1.97825,-0.317478,
+ 0.673211,-0.58089,-0.457551,3.337545,1.748927,-0.34021,
+ 0.454048,-0.464454,-0.760344,3.276333,1.863773,-0.294266,
+ 0.161194,-0.480657,-0.861966,3.460196,2.103494,-0.180368,
+ 0.313443,-0.691245,-0.651102,3.479418,1.97825,-0.317478,
+ 0.454048,-0.464454,-0.760344,3.276333,1.863773,-0.294266,
+ 0.161194,-0.480657,-0.861966,3.460196,2.103494,-0.180368,
+ 0.454048,-0.464454,-0.760344,3.276333,1.863773,-0.294266,
+ 0.428291,-0.499911,-0.752765,3.252224,2.026347,-0.148215,
+ 0.020519,-0.282941,-0.958918,3.4583,2.151656,-0.102662,
+ 0.161194,-0.480657,-0.861966,3.460196,2.103494,-0.180368,
+ 0.428291,-0.499911,-0.752765,3.252224,2.026347,-0.148215,
+ 0.020519,-0.282941,-0.958918,3.4583,2.151656,-0.102662,
+ 0.428291,-0.499911,-0.752765,3.252224,2.026347,-0.148215,
+ 0.261393,-0.399072,-0.878872,3.233975,2.059193,-0.072431,
+ 0.486425,0.192908,-0.852161,2.986408,-0.413503,-0.428964,
+ 0.016767,-0.927537,-0.373356,2.835437,-0.231101,-0.57789,
+ 0.519338,0.264458,-0.812619,2.953029,-0.12769,-0.520499,
+ 0.241303,0.584583,-0.77462,2.753156,0.400829,-0.713141,
+ 0.072694,0.752739,-0.654294,2.679445,0.687427,-0.720573,
+ 0.040193,0.650965,-0.758043,2.747937,0.712253,-0.615674,
+ 0.241303,0.584583,-0.77462,2.753156,0.400829,-0.713141,
+ 0.040193,0.650965,-0.758043,2.747937,0.712253,-0.615674,
+ 0.177367,0.480226,-0.859025,2.811504,0.469098,-0.657443,
+ 0.462789,0.48004,-0.745243,2.790681,0.219187,-0.718263,
+ 0.241303,0.584583,-0.77462,2.753156,0.400829,-0.713141,
+ 0.177367,0.480226,-0.859025,2.811504,0.469098,-0.657443,
+ 0.462789,0.48004,-0.745243,2.790681,0.219187,-0.718263,
+ 0.177367,0.480226,-0.859025,2.811504,0.469098,-0.657443,
+ 0.288711,0.386915,-0.875753,2.898733,0.271916,-0.651298,
+ 0.539114,0.412574,-0.734261,2.790657,0.044324,-0.717488,
+ 0.462789,0.48004,-0.745243,2.790681,0.219187,-0.718263,
+ 0.288711,0.386915,-0.875753,2.898733,0.271916,-0.651298,
+ 0.539114,0.412574,-0.734261,2.790657,0.044324,-0.717488,
+ 0.288711,0.386915,-0.875753,2.898733,0.271916,-0.651298,
+ 0.41428,0.318289,-0.852681,2.91987,0.084875,-0.64246,
+ 0.016767,-0.927537,-0.373356,2.835437,-0.231101,-0.57789,
+ 0.763734,0.228435,-0.603761,2.736198,-0.346225,-0.659345,
+ 0.696162,0.333274,-0.635835,2.743995,-0.129852,-0.718277,
+ 0.696162,0.333274,-0.635835,2.743995,-0.129852,-0.718277,
+ 0.41428,0.318289,-0.852681,2.91987,0.084875,-0.64246,
+ 0.519338,0.264458,-0.812619,2.953029,-0.12769,-0.520499,
+ 0.696162,0.333274,-0.635835,2.743995,-0.129852,-0.718277,
+ 0.519338,0.264458,-0.812619,2.953029,-0.12769,-0.520499,
+ 0.016767,-0.927537,-0.373356,2.835437,-0.231101,-0.57789,
+ 0.696162,0.333274,-0.635835,2.743995,-0.129852,-0.718277,
+ 0.539114,0.412574,-0.734261,2.790657,0.044324,-0.717488,
+ 0.41428,0.318289,-0.852681,2.91987,0.084875,-0.64246,
+ 0.788801,-0.19938,-0.581412,2.514162,0.988713,-0.674527,
+ 0.906617,-0.14387,-0.39667,2.482917,0.997637,-0.702425,
+ 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
+ 0.907314,0.09913,-0.4086,2.618307,-0.549092,-0.805491,
+ 0.908163,-0.140074,-0.394486,2.5392,-0.727778,-0.750475,
+ 0.795625,-0.129968,-0.591684,2.410367,-0.777999,-0.841105,
+ 0.907314,0.09913,-0.4086,2.618307,-0.549092,-0.805491,
+ 0.795625,-0.129968,-0.591684,2.410367,-0.777999,-0.841105,
+ 0.748939,0.152982,-0.644738,2.543372,-0.548031,-0.937182,
+ 0.85208,0.278905,-0.442914,2.690576,-0.368057,-0.819343,
+ 0.907314,0.09913,-0.4086,2.618307,-0.549092,-0.805491,
+ 0.748939,0.152982,-0.644738,2.543372,-0.548031,-0.937182,
+ 0.85208,0.278905,-0.442914,2.690576,-0.368057,-0.819343,
+ 0.748939,0.152982,-0.644738,2.543372,-0.548031,-0.937182,
+ 0.69338,0.351142,-0.629224,2.594499,-0.422948,-0.981263,
+ 0.759315,0.386803,-0.523282,2.702577,-0.197406,-0.795611,
+ 0.85208,0.278905,-0.442914,2.690576,-0.368057,-0.819343,
+ 0.69338,0.351142,-0.629224,2.594499,-0.422948,-0.981263,
+ 0.759315,0.386803,-0.523282,2.702577,-0.197406,-0.795611,
+ 0.69338,0.351142,-0.629224,2.594499,-0.422948,-0.981263,
+ 0.662294,0.443714,-0.603725,2.60743,-0.208248,-0.974218,
+ 0.636794,0.461927,-0.617346,2.734183,0.038769,-0.86581,
+ 0.759315,0.386803,-0.523282,2.702577,-0.197406,-0.795611,
+ 0.662294,0.443714,-0.603725,2.60743,-0.208248,-0.974218,
+ 0.636794,0.461927,-0.617346,2.734183,0.038769,-0.86581,
+ 0.662294,0.443714,-0.603725,2.60743,-0.208248,-0.974218,
+ 0.614456,0.489786,-0.618509,2.649413,0.031535,-1.024796,
+ 0.722145,-0.312679,-0.617041,2.731512,0.219003,-0.891585,
+ 0.636794,0.461927,-0.617346,2.734183,0.038769,-0.86581,
+ 0.614456,0.489786,-0.618509,2.649413,0.031535,-1.024796,
+ 0.722145,-0.312679,-0.617041,2.731512,0.219003,-0.891585,
+ 0.614456,0.489786,-0.618509,2.649413,0.031535,-1.024796,
+ 0.718673,-0.290446,-0.631784,2.668936,0.206182,-1.014371,
+ 0.742962,-0.255405,-0.618688,2.70696,0.393597,-0.849582,
+ 0.722145,-0.312679,-0.617041,2.731512,0.219003,-0.891585,
+ 0.718673,-0.290446,-0.631784,2.668936,0.206182,-1.014371,
+ 0.742962,-0.255405,-0.618688,2.70696,0.393597,-0.849582,
+ 0.718673,-0.290446,-0.631784,2.668936,0.206182,-1.014371,
+ 0.815771,-0.424495,-0.392838,2.616001,0.447717,-0.960748,
+ 0.804239,-0.153549,-0.574128,2.604217,0.728827,-0.769671,
+ 0.742962,-0.255405,-0.618688,2.70696,0.393597,-0.849582,
+ 0.815771,-0.424495,-0.392838,2.616001,0.447717,-0.960748,
+ 0.804239,-0.153549,-0.574128,2.604217,0.728827,-0.769671,
+ 0.815771,-0.424495,-0.392838,2.616001,0.447717,-0.960748,
+ 0.900366,-0.205985,-0.38329,2.5704,0.738683,-0.830405,
+ 0.788801,-0.19938,-0.581412,2.514162,0.988713,-0.674527,
+ 0.804239,-0.153549,-0.574128,2.604217,0.728827,-0.769671,
+ 0.900366,-0.205985,-0.38329,2.5704,0.738683,-0.830405,
+ 0.788801,-0.19938,-0.581412,2.514162,0.988713,-0.674527,
+ 0.900366,-0.205985,-0.38329,2.5704,0.738683,-0.830405,
+ 0.906617,-0.14387,-0.39667,2.482917,0.997637,-0.702425,
+ 0.907314,0.09913,-0.4086,2.618307,-0.549092,-0.805491,
+ 0.85208,0.278905,-0.442914,2.690576,-0.368057,-0.819343,
+ 0.763734,0.228435,-0.603761,2.736198,-0.346225,-0.659345,
+ 0.907314,0.09913,-0.4086,2.618307,-0.549092,-0.805491,
+ 0.763734,0.228435,-0.603761,2.736198,-0.346225,-0.659345,
+ 0.769758,0.095155,-0.631204,2.688131,-0.517509,-0.672975,
+ 0.788801,-0.19938,-0.581412,2.514162,0.988713,-0.674527,
+ 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
+ -0.071584,0.92252,-0.379253,2.542439,0.999928,-0.648592,
+ 0.804239,-0.153549,-0.574128,2.604217,0.728827,-0.769671,
+ 0.788801,-0.19938,-0.581412,2.514162,0.988713,-0.674527,
+ -0.071584,0.92252,-0.379253,2.542439,0.999928,-0.648592,
+ 0.804239,-0.153549,-0.574128,2.604217,0.728827,-0.769671,
+ -0.071584,0.92252,-0.379253,2.542439,0.999928,-0.648592,
+ 0.072694,0.752739,-0.654294,2.679445,0.687427,-0.720573,
+ 0.742962,-0.255405,-0.618688,2.70696,0.393597,-0.849582,
+ 0.804239,-0.153549,-0.574128,2.604217,0.728827,-0.769671,
+ 0.072694,0.752739,-0.654294,2.679445,0.687427,-0.720573,
+ 0.742962,-0.255405,-0.618688,2.70696,0.393597,-0.849582,
+ 0.072694,0.752739,-0.654294,2.679445,0.687427,-0.720573,
+ 0.241303,0.584583,-0.77462,2.753156,0.400829,-0.713141,
+ 0.722145,-0.312679,-0.617041,2.731512,0.219003,-0.891585,
+ 0.742962,-0.255405,-0.618688,2.70696,0.393597,-0.849582,
+ 0.241303,0.584583,-0.77462,2.753156,0.400829,-0.713141,
+ 0.722145,-0.312679,-0.617041,2.731512,0.219003,-0.891585,
+ 0.241303,0.584583,-0.77462,2.753156,0.400829,-0.713141,
+ 0.462789,0.48004,-0.745243,2.790681,0.219187,-0.718263,
+ 0.636794,0.461927,-0.617346,2.734183,0.038769,-0.86581,
+ 0.722145,-0.312679,-0.617041,2.731512,0.219003,-0.891585,
+ 0.462789,0.48004,-0.745243,2.790681,0.219187,-0.718263,
+ 0.636794,0.461927,-0.617346,2.734183,0.038769,-0.86581,
+ 0.462789,0.48004,-0.745243,2.790681,0.219187,-0.718263,
+ 0.539114,0.412574,-0.734261,2.790657,0.044324,-0.717488,
+ 0.759315,0.386803,-0.523282,2.702577,-0.197406,-0.795611,
+ 0.636794,0.461927,-0.617346,2.734183,0.038769,-0.86581,
+ 0.539114,0.412574,-0.734261,2.790657,0.044324,-0.717488,
+ 0.759315,0.386803,-0.523282,2.702577,-0.197406,-0.795611,
+ 0.539114,0.412574,-0.734261,2.790657,0.044324,-0.717488,
+ 0.696162,0.333274,-0.635835,2.743995,-0.129852,-0.718277,
+ 0.85208,0.278905,-0.442914,2.690576,-0.368057,-0.819343,
+ 0.759315,0.386803,-0.523282,2.702577,-0.197406,-0.795611,
+ 0.696162,0.333274,-0.635835,2.743995,-0.129852,-0.718277,
+ 0.85208,0.278905,-0.442914,2.690576,-0.368057,-0.819343,
+ 0.696162,0.333274,-0.635835,2.743995,-0.129852,-0.718277,
+ 0.763734,0.228435,-0.603761,2.736198,-0.346225,-0.659345,
+ 0.072694,0.752739,-0.654294,2.679445,0.687427,-0.720573,
+ -0.071584,0.92252,-0.379253,2.542439,0.999928,-0.648592,
+ -0.080985,0.883253,-0.461851,2.637461,1.01726,-0.581611,
+ 0.072694,0.752739,-0.654294,2.679445,0.687427,-0.720573,
+ -0.080985,0.883253,-0.461851,2.637461,1.01726,-0.581611,
+ 0.040193,0.650965,-0.758043,2.747937,0.712253,-0.615674,
+ 0.547549,-0.279581,-0.788686,2.13239,1.755821,-0.180271,
+ 0.756976,-0.653442,0,2.128139,1.788397,0,
+ 0.536218,-0.84408,0.000006,2.339597,1.807702,0,
+ 0.547549,-0.279581,-0.788686,2.13239,1.755821,-0.180271,
+ 0.536218,-0.84408,0.000006,2.339597,1.807702,0,
+ 0.474213,-0.311965,-0.823286,2.361089,1.76666,-0.202595,
+ 0.598679,-0.200355,-0.775527,2.183003,1.65407,-0.341767,
+ 0.547549,-0.279581,-0.788686,2.13239,1.755821,-0.180271,
+ 0.474213,-0.311965,-0.823286,2.361089,1.76666,-0.202595,
+ 0.598679,-0.200355,-0.775527,2.183003,1.65407,-0.341767,
+ 0.474213,-0.311965,-0.823286,2.361089,1.76666,-0.202595,
+ 0.488174,-0.280956,-0.826287,2.406969,1.645328,-0.341479,
+ 0.561098,-0.272385,-0.781649,2.301359,1.397721,-0.546015,
+ 0.598679,-0.200355,-0.775527,2.183003,1.65407,-0.341767,
+ 0.488174,-0.280956,-0.826287,2.406969,1.645328,-0.341479,
+ 0.561098,-0.272385,-0.781649,2.301359,1.397721,-0.546015,
+ 0.488174,-0.280956,-0.826287,2.406969,1.645328,-0.341479,
+ 0.531574,-0.288506,-0.796362,2.519027,1.485931,-0.422962,
+ 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
+ 0.561098,-0.272385,-0.781649,2.301359,1.397721,-0.546015,
+ 0.531574,-0.288506,-0.796362,2.519027,1.485931,-0.422962,
+ 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
+ 0.531574,-0.288506,-0.796362,2.519027,1.485931,-0.422962,
+ 0.769657,-0.480833,-0.420033,2.553871,1.284278,-0.512335,
+ -0.071584,0.92252,-0.379253,2.542439,0.999928,-0.648592,
+ 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
+ 0.769657,-0.480833,-0.420033,2.553871,1.284278,-0.512335,
+ -0.071584,0.92252,-0.379253,2.542439,0.999928,-0.648592,
+ 0.769657,-0.480833,-0.420033,2.553871,1.284278,-0.512335,
+ -0.080985,0.883253,-0.461851,2.637461,1.01726,-0.581611,
+ -0.096144,-0.182414,-0.97851,2.292449,-0.871852,-0.8824,
+ 0.561574,-0.148323,-0.814024,2.245624,-0.864372,-0.995778,
+ 0.525142,-0.062799,-0.848694,2.346081,-0.74535,-1.013296,
+ -0.096144,-0.182414,-0.97851,2.292449,-0.871852,-0.8824,
+ 0.525142,-0.062799,-0.848694,2.346081,-0.74535,-1.013296,
+ 0.795625,-0.129968,-0.591684,2.410367,-0.777999,-0.841105,
+ 0.805898,-0.146097,-0.573745,2.096552,1.678482,-0.32681,
+ 0.546571,-0.125171,0.828005,2.069379,1.727818,-0.212746,
+ 0.547549,-0.279581,-0.788686,2.13239,1.755821,-0.180271,
+ 0.805898,-0.146097,-0.573745,2.096552,1.678482,-0.32681,
+ 0.547549,-0.279581,-0.788686,2.13239,1.755821,-0.180271,
+ 0.598679,-0.200355,-0.775527,2.183003,1.65407,-0.341767,
+ 0.772313,-0.244122,-0.586461,2.189848,1.468992,-0.517501,
+ 0.805898,-0.146097,-0.573745,2.096552,1.678482,-0.32681,
+ 0.598679,-0.200355,-0.775527,2.183003,1.65407,-0.341767,
+ 0.772313,-0.244122,-0.586461,2.189848,1.468992,-0.517501,
+ 0.598679,-0.200355,-0.775527,2.183003,1.65407,-0.341767,
+ 0.561098,-0.272385,-0.781649,2.301359,1.397721,-0.546015,
+ 0.697438,-0.478568,-0.533435,2.266003,1.273253,-0.663332,
+ 0.772313,-0.244122,-0.586461,2.189848,1.468992,-0.517501,
+ 0.561098,-0.272385,-0.781649,2.301359,1.397721,-0.546015,
+ 0.697438,-0.478568,-0.533435,2.266003,1.273253,-0.663332,
+ 0.561098,-0.272385,-0.781649,2.301359,1.397721,-0.546015,
+ 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
+ 0.628361,-0.426126,-0.65083,2.347317,1.066114,-0.758763,
+ 0.697438,-0.478568,-0.533435,2.266003,1.273253,-0.663332,
+ 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
+ 0.628361,-0.426126,-0.65083,2.347317,1.066114,-0.758763,
+ 0.752227,-0.484776,-0.446258,2.396355,1.242239,-0.597722,
+ 0.906617,-0.14387,-0.39667,2.482917,0.997637,-0.702425,
+ 0.065855,0.814333,-0.576649,2.399389,0.782091,-0.915279,
+ 0.628361,-0.426126,-0.65083,2.347317,1.066114,-0.758763,
+ 0.906617,-0.14387,-0.39667,2.482917,0.997637,-0.702425,
+ 0.065855,0.814333,-0.576649,2.399389,0.782091,-0.915279,
+ 0.906617,-0.14387,-0.39667,2.482917,0.997637,-0.702425,
+ 0.900366,-0.205985,-0.38329,2.5704,0.738683,-0.830405,
+ 0.187431,0.691784,-0.697355,2.448969,0.529858,-1.037335,
+ 0.065855,0.814333,-0.576649,2.399389,0.782091,-0.915279,
+ 0.900366,-0.205985,-0.38329,2.5704,0.738683,-0.830405,
+ 0.187431,0.691784,-0.697355,2.448969,0.529858,-1.037335,
+ 0.900366,-0.205985,-0.38329,2.5704,0.738683,-0.830405,
+ 0.815771,-0.424495,-0.392838,2.616001,0.447717,-0.960748,
+ 0.328244,0.603536,-0.726637,2.495354,0.250522,-1.132081,
+ 0.187431,0.691784,-0.697355,2.448969,0.529858,-1.037335,
+ 0.815771,-0.424495,-0.392838,2.616001,0.447717,-0.960748,
+ 0.328244,0.603536,-0.726637,2.495354,0.250522,-1.132081,
+ 0.815771,-0.424495,-0.392838,2.616001,0.447717,-0.960748,
+ 0.718673,-0.290446,-0.631784,2.668936,0.206182,-1.014371,
+ 0.387394,0.516219,-0.763835,2.50049,-0.035029,-1.170179,
+ 0.328244,0.603536,-0.726637,2.495354,0.250522,-1.132081,
+ 0.718673,-0.290446,-0.631784,2.668936,0.206182,-1.014371,
+ 0.387394,0.516219,-0.763835,2.50049,-0.035029,-1.170179,
+ 0.718673,-0.290446,-0.631784,2.668936,0.206182,-1.014371,
+ 0.614456,0.489786,-0.618509,2.649413,0.031535,-1.024796,
+ 0.387987,0.466054,-0.795148,2.452588,-0.244072,-1.138797,
+ 0.387394,0.516219,-0.763835,2.50049,-0.035029,-1.170179,
+ 0.614456,0.489786,-0.618509,2.649413,0.031535,-1.024796,
+ 0.387987,0.466054,-0.795148,2.452588,-0.244072,-1.138797,
+ 0.614456,0.489786,-0.618509,2.649413,0.031535,-1.024796,
+ 0.662294,0.443714,-0.603725,2.60743,-0.208248,-0.974218,
+ 0.397823,0.403779,-0.823832,2.439827,-0.395385,-1.131324,
+ 0.387987,0.466054,-0.795148,2.452588,-0.244072,-1.138797,
+ 0.662294,0.443714,-0.603725,2.60743,-0.208248,-0.974218,
+ 0.397823,0.403779,-0.823832,2.439827,-0.395385,-1.131324,
+ 0.662294,0.443714,-0.603725,2.60743,-0.208248,-0.974218,
+ 0.69338,0.351142,-0.629224,2.594499,-0.422948,-0.981263,
+ 0.449887,0.239006,-0.860511,2.384638,-0.591919,-1.043058,
+ 0.397823,0.403779,-0.823832,2.439827,-0.395385,-1.131324,
+ 0.69338,0.351142,-0.629224,2.594499,-0.422948,-0.981263,
+ 0.449887,0.239006,-0.860511,2.384638,-0.591919,-1.043058,
+ 0.69338,0.351142,-0.629224,2.594499,-0.422948,-0.981263,
+ 0.748939,0.152982,-0.644738,2.543372,-0.548031,-0.937182,
+ 0.525142,-0.062799,-0.848694,2.346081,-0.74535,-1.013296,
+ 0.449887,0.239006,-0.860511,2.384638,-0.591919,-1.043058,
+ 0.748939,0.152982,-0.644738,2.543372,-0.548031,-0.937182,
+ 0.525142,-0.062799,-0.848694,2.346081,-0.74535,-1.013296,
+ 0.748939,0.152982,-0.644738,2.543372,-0.548031,-0.937182,
+ 0.795625,-0.129968,-0.591684,2.410367,-0.777999,-0.841105,
+ -0.096144,-0.182414,-0.97851,2.292449,-0.871852,-0.8824,
+ -0.012663,0.029084,-0.999497,2.229345,-0.992723,-0.862826,
+ -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
+ -0.096144,-0.182414,-0.97851,2.292449,-0.871852,-0.8824,
+ -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
+ 0.561574,-0.148323,-0.814024,2.245624,-0.864372,-0.995778,
+ 0.525142,-0.062799,-0.848694,2.346081,-0.74535,-1.013296,
+ 0.561574,-0.148323,-0.814024,2.245624,-0.864372,-0.995778,
+ 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
+ 0.449887,0.239006,-0.860511,2.384638,-0.591919,-1.043058,
+ 0.525142,-0.062799,-0.848694,2.346081,-0.74535,-1.013296,
+ 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
+ 0.449887,0.239006,-0.860511,2.384638,-0.591919,-1.043058,
+ 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
+ 0.10998,0.376752,-0.919762,2.108912,-0.357128,-1.259691,
+ -0.385788,0.922588,0,2.042206,1.777154,0,
+ 0.546571,-0.125171,0.828005,2.069379,1.727818,-0.212746,
+ 0.513731,-0.239493,-0.823847,1.807583,1.756546,-0.177627,
+ -0.385788,0.922588,0,2.042206,1.777154,0,
+ 0.513731,-0.239493,-0.823847,1.807583,1.756546,-0.177627,
+ -0.720176,-0.693792,0,1.794465,1.787719,0,
+ 0.397823,0.403779,-0.823832,2.439827,-0.395385,-1.131324,
+ 0.449887,0.239006,-0.860511,2.384638,-0.591919,-1.043058,
+ 0.10998,0.376752,-0.919762,2.108912,-0.357128,-1.259691,
+ 0.397823,0.403779,-0.823832,2.439827,-0.395385,-1.131324,
+ 0.10998,0.376752,-0.919762,2.108912,-0.357128,-1.259691,
+ 0.12555,0.440005,-0.889176,2.136269,-0.187666,-1.278057,
+ 0.387987,0.466054,-0.795148,2.452588,-0.244072,-1.138797,
+ 0.397823,0.403779,-0.823832,2.439827,-0.395385,-1.131324,
+ 0.12555,0.440005,-0.889176,2.136269,-0.187666,-1.278057,
+ 0.387394,0.516219,-0.763835,2.50049,-0.035029,-1.170179,
+ 0.387987,0.466054,-0.795148,2.452588,-0.244072,-1.138797,
+ 0.12555,0.440005,-0.889176,2.136269,-0.187666,-1.278057,
+ 0.387394,0.516219,-0.763835,2.50049,-0.035029,-1.170179,
+ 0.12555,0.440005,-0.889176,2.136269,-0.187666,-1.278057,
+ 0.146937,0.551946,-0.820832,2.14179,-0.055306,-1.295565,
+ 0.328244,0.603536,-0.726637,2.495354,0.250522,-1.132081,
+ 0.387394,0.516219,-0.763835,2.50049,-0.035029,-1.170179,
+ 0.146937,0.551946,-0.820832,2.14179,-0.055306,-1.295565,
+ 0.328244,0.603536,-0.726637,2.495354,0.250522,-1.132081,
+ 0.146937,0.551946,-0.820832,2.14179,-0.055306,-1.295565,
+ 0.115383,0.694944,-0.709746,2.0817,0.283249,-1.259461,
+ 0.187431,0.691784,-0.697355,2.448969,0.529858,-1.037335,
+ 0.328244,0.603536,-0.726637,2.495354,0.250522,-1.132081,
+ 0.115383,0.694944,-0.709746,2.0817,0.283249,-1.259461,
+ 0.187431,0.691784,-0.697355,2.448969,0.529858,-1.037335,
+ 0.115383,0.694944,-0.709746,2.0817,0.283249,-1.259461,
+ 0.052979,0.780732,-0.622616,2.023441,0.529338,-1.144399,
+ 0.065855,0.814333,-0.576649,2.399389,0.782091,-0.915279,
+ 0.187431,0.691784,-0.697355,2.448969,0.529858,-1.037335,
+ 0.052979,0.780732,-0.622616,2.023441,0.529338,-1.144399,
+ 0.065855,0.814333,-0.576649,2.399389,0.782091,-0.915279,
+ 0.052979,0.780732,-0.622616,2.023441,0.529338,-1.144399,
+ 0.019336,0.837694,-0.545798,1.975941,0.827957,-1.018423,
+ 0.628361,-0.426126,-0.65083,2.347317,1.066114,-0.758763,
+ 0.065855,0.814333,-0.576649,2.399389,0.782091,-0.915279,
+ 0.019336,0.837694,-0.545798,1.975941,0.827957,-1.018423,
+ 0.628361,-0.426126,-0.65083,2.347317,1.066114,-0.758763,
+ 0.019336,0.837694,-0.545798,1.975941,0.827957,-1.018423,
+ 0.026499,0.942993,-0.331757,1.958254,1.130271,-0.861813,
+ 0.697438,-0.478568,-0.533435,2.266003,1.273253,-0.663332,
+ 0.628361,-0.426126,-0.65083,2.347317,1.066114,-0.758763,
+ 0.026499,0.942993,-0.331757,1.958254,1.130271,-0.861813,
+ 0.697438,-0.478568,-0.533435,2.266003,1.273253,-0.663332,
+ 0.026499,0.942993,-0.331757,1.958254,1.130271,-0.861813,
+ 0.696414,-0.392791,-0.600602,1.859443,1.450393,-0.632222,
+ 0.772313,-0.244122,-0.586461,2.189848,1.468992,-0.517501,
+ 0.697438,-0.478568,-0.533435,2.266003,1.273253,-0.663332,
+ 0.696414,-0.392791,-0.600602,1.859443,1.450393,-0.632222,
+ 0.772313,-0.244122,-0.586461,2.189848,1.468992,-0.517501,
+ 0.696414,-0.392791,-0.600602,1.859443,1.450393,-0.632222,
+ 0.552632,-0.484765,-0.677938,1.821946,1.618209,-0.403751,
+ 0.805898,-0.146097,-0.573745,2.096552,1.678482,-0.32681,
+ 0.772313,-0.244122,-0.586461,2.189848,1.468992,-0.517501,
+ 0.552632,-0.484765,-0.677938,1.821946,1.618209,-0.403751,
+ 0.805898,-0.146097,-0.573745,2.096552,1.678482,-0.32681,
+ 0.552632,-0.484765,-0.677938,1.821946,1.618209,-0.403751,
+ 0.506924,-0.406124,-0.760323,1.798719,1.714447,-0.259352,
+ 0.546571,-0.125171,0.828005,2.069379,1.727818,-0.212746,
+ 0.805898,-0.146097,-0.573745,2.096552,1.678482,-0.32681,
+ 0.506924,-0.406124,-0.760323,1.798719,1.714447,-0.259352,
+ 0.546571,-0.125171,0.828005,2.069379,1.727818,-0.212746,
+ 0.506924,-0.406124,-0.760323,1.798719,1.714447,-0.259352,
+ 0.513731,-0.239493,-0.823847,1.807583,1.756546,-0.177627,
+ 0.659349,-0.248914,-0.709437,0.737904,1.604213,-0.281713,
+ -0.208715,-0.624734,-0.752427,0.223642,1.684075,-0.160743,
+ 0.566114,-0.824327,0,0.234527,1.730117,0,
+ 0.659349,-0.248914,-0.709437,0.737904,1.604213,-0.281713,
+ 0.566114,-0.824327,0,0.234527,1.730117,0,
+ 0.981421,-0.191868,0,0.733818,1.740873,0,
+ 0.631747,-0.24686,-0.734817,0.725959,1.478055,-0.461804,
+ -0.251063,-0.683027,-0.685888,0.23733,1.595746,-0.288672,
+ -0.208715,-0.624734,-0.752427,0.223642,1.684075,-0.160743,
+ 0.631747,-0.24686,-0.734817,0.725959,1.478055,-0.461804,
+ -0.208715,-0.624734,-0.752427,0.223642,1.684075,-0.160743,
+ 0.659349,-0.248914,-0.709437,0.737904,1.604213,-0.281713,
+ 0.623235,-0.257987,-0.738255,0.760722,1.205036,-0.700545,
+ -0.252973,-0.819125,-0.51482,0.289039,1.496446,-0.430055,
+ -0.251063,-0.683027,-0.685888,0.23733,1.595746,-0.288672,
+ 0.623235,-0.257987,-0.738255,0.760722,1.205036,-0.700545,
+ -0.251063,-0.683027,-0.685888,0.23733,1.595746,-0.288672,
+ 0.631747,-0.24686,-0.734817,0.725959,1.478055,-0.461804,
+ 0.791391,-0.43807,-0.426373,0.857323,0.985001,-0.874029,
+ -0.13716,-0.98063,-0.139827,0.305671,1.298417,-0.629719,
+ -0.252973,-0.819125,-0.51482,0.289039,1.496446,-0.430055,
+ 0.791391,-0.43807,-0.426373,0.857323,0.985001,-0.874029,
+ -0.252973,-0.819125,-0.51482,0.289039,1.496446,-0.430055,
+ 0.623235,-0.257987,-0.738255,0.760722,1.205036,-0.700545,
+ -0.06371,0.842533,-0.534864,0.921312,0.755659,-0.99933,
+ 0.007127,0.896038,-0.44392,0.243473,1.134082,-0.819993,
+ -0.13716,-0.98063,-0.139827,0.305671,1.298417,-0.629719,
+ -0.06371,0.842533,-0.534864,0.921312,0.755659,-0.99933,
+ -0.13716,-0.98063,-0.139827,0.305671,1.298417,-0.629719,
+ 0.791391,-0.43807,-0.426373,0.857323,0.985001,-0.874029,
+ -0.069142,0.724976,-0.685295,0.939271,0.379986,-1.185872,
+ 0.009434,0.815301,-0.578961,0.316341,0.785311,-1.08626,
+ 0.007127,0.896038,-0.44392,0.243473,1.134082,-0.819993,
+ -0.069142,0.724976,-0.685295,0.939271,0.379986,-1.185872,
+ 0.007127,0.896038,-0.44392,0.243473,1.134082,-0.819993,
+ -0.06371,0.842533,-0.534864,0.921312,0.755659,-0.99933,
+ -0.057955,0.638634,-0.767325,0.927775,0.195225,-1.233043,
+ 0.040473,0.760778,-0.647749,0.539252,0.353984,-1.254493,
+ 0.009434,0.815301,-0.578961,0.316341,0.785311,-1.08626,
+ -0.057955,0.638634,-0.767325,0.927775,0.195225,-1.233043,
+ 0.009434,0.815301,-0.578961,0.316341,0.785311,-1.08626,
+ -0.069142,0.724976,-0.685295,0.939271,0.379986,-1.185872,
+ -0.024013,0.58573,-0.810151,0.950215,0.042751,-1.256188,
+ 0.080812,0.697931,-0.711591,0.53915,0.148262,-1.321014,
+ 0.040473,0.760778,-0.647749,0.539252,0.353984,-1.254493,
+ -0.024013,0.58573,-0.810151,0.950215,0.042751,-1.256188,
+ 0.040473,0.760778,-0.647749,0.539252,0.353984,-1.254493,
+ -0.057955,0.638634,-0.767325,0.927775,0.195225,-1.233043,
+ 0.016737,0.497476,-0.867316,0.943855,-0.101127,-1.274771,
+ 0.09853,0.626571,-0.773111,0.516872,-0.020713,-1.356627,
+ 0.080812,0.697931,-0.711591,0.53915,0.148262,-1.321014,
+ 0.016737,0.497476,-0.867316,0.943855,-0.101127,-1.274771,
+ 0.080812,0.697931,-0.711591,0.53915,0.148262,-1.321014,
+ -0.024013,0.58573,-0.810151,0.950215,0.042751,-1.256188,
+ 0.060533,0.377837,-0.923891,0.960321,-0.308052,-1.243133,
+ 0.111825,0.518485,-0.847743,0.542386,-0.188227,-1.370375,
+ 0.09853,0.626571,-0.773111,0.516872,-0.020713,-1.356627,
+ 0.060533,0.377837,-0.923891,0.960321,-0.308052,-1.243133,
+ 0.09853,0.626571,-0.773111,0.516872,-0.020713,-1.356627,
+ 0.016737,0.497476,-0.867316,0.943855,-0.101127,-1.274771,
+ 0.088722,0.251367,-0.963817,0.97453,-0.525273,-1.140353,
+ 0.163727,0.387435,-0.907242,0.546875,-0.39094,-1.363244,
+ 0.111825,0.518485,-0.847743,0.542386,-0.188227,-1.370375,
+ 0.088722,0.251367,-0.963817,0.97453,-0.525273,-1.140353,
+ 0.111825,0.518485,-0.847743,0.542386,-0.188227,-1.370375,
+ 0.060533,0.377837,-0.923891,0.960321,-0.308052,-1.243133,
+ 0.107989,0.168108,-0.979836,0.948819,-0.638568,-1.102958,
+ 0.227108,0.258715,-0.938876,0.550658,-0.633015,-1.331311,
+ 0.163727,0.387435,-0.907242,0.546875,-0.39094,-1.363244,
+ 0.107989,0.168108,-0.979836,0.948819,-0.638568,-1.102958,
+ 0.163727,0.387435,-0.907242,0.546875,-0.39094,-1.363244,
+ 0.088722,0.251367,-0.963817,0.97453,-0.525273,-1.140353,
+ 0.10833,0.05569,-0.992554,0.939974,-0.894739,-1.019809,
+ 0.263434,0.119819,-0.957207,0.527724,-0.862854,-1.253811,
+ 0.227108,0.258715,-0.938876,0.550658,-0.633015,-1.331311,
+ 0.10833,0.05569,-0.992554,0.939974,-0.894739,-1.019809,
+ 0.227108,0.258715,-0.938876,0.550658,-0.633015,-1.331311,
+ 0.107989,0.168108,-0.979836,0.948819,-0.638568,-1.102958,
+ 0.114032,-0.218132,-0.969234,0.956456,-1.070504,-0.921063,
+ 0.304293,-0.024391,-0.952266,0.544825,-1.133123,-1.096902,
+ 0.263434,0.119819,-0.957207,0.527724,-0.862854,-1.253811,
+ 0.114032,-0.218132,-0.969234,0.956456,-1.070504,-0.921063,
+ 0.263434,0.119819,-0.957207,0.527724,-0.862854,-1.253811,
+ 0.10833,0.05569,-0.992554,0.939974,-0.894739,-1.019809,
+ 0.187438,-0.340915,-0.921219,0.93066,-1.216516,-0.831196,
+ 0.372063,-0.134052,-0.918477,0.530629,-1.316423,-0.929842,
+ 0.304293,-0.024391,-0.952266,0.544825,-1.133123,-1.096902,
+ 0.187438,-0.340915,-0.921219,0.93066,-1.216516,-0.831196,
+ 0.304293,-0.024391,-0.952266,0.544825,-1.133123,-1.096902,
+ 0.114032,-0.218132,-0.969234,0.956456,-1.070504,-0.921063,
+ 0.25339,-0.287519,-0.923648,0.922703,-1.296032,-0.728307,
+ 0.424286,-0.254348,-0.869073,0.538756,-1.408602,-0.764911,
+ 0.372063,-0.134052,-0.918477,0.530629,-1.316423,-0.929842,
+ 0.25339,-0.287519,-0.923648,0.922703,-1.296032,-0.728307,
+ 0.372063,-0.134052,-0.918477,0.530629,-1.316423,-0.929842,
+ 0.187438,-0.340915,-0.921219,0.93066,-1.216516,-0.831196,
+ 0.23972,-0.400363,-0.884445,0.912699,-1.455066,-0.576185,
+ 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
+ 0.424286,-0.254348,-0.869073,0.538756,-1.408602,-0.764911,
+ 0.23972,-0.400363,-0.884445,0.912699,-1.455066,-0.576185,
+ 0.424286,-0.254348,-0.869073,0.538756,-1.408602,-0.764911,
+ 0.25339,-0.287519,-0.923648,0.922703,-1.296032,-0.728307,
+ 0.213167,-0.525559,-0.823619,0.912989,-1.499314,-0.419547,
+ 0.383978,-0.566345,-0.729256,0.480235,-1.631521,-0.401961,
+ 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
+ 0.213167,-0.525559,-0.823619,0.912989,-1.499314,-0.419547,
+ 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
+ 0.23972,-0.400363,-0.884445,0.912699,-1.455066,-0.576185,
+ 0.92802,-0.37253,0,0.927497,-1.558489,0,
+ 0.226963,-0.973903,0,0.44655,-1.67295,0,
+ 0.383978,-0.566345,-0.729256,0.480235,-1.631521,-0.401961,
+ 0.92802,-0.37253,0,0.927497,-1.558489,0,
+ 0.383978,-0.566345,-0.729256,0.480235,-1.631521,-0.401961,
+ 0.213167,-0.525559,-0.823619,0.912989,-1.499314,-0.419547,
+ 0.335626,-0.735806,-0.588171,-0.221516,1.686349,-0.151403,
+ 0.235033,-0.721825,-0.650944,-0.559706,1.69418,-0.186107,
+ -0.009814,-0.999952,0,-0.547248,1.742126,0,
+ 0.335626,-0.735806,-0.588171,-0.221516,1.686349,-0.151403,
+ -0.009814,-0.999952,0,-0.547248,1.742126,0,
+ -0.039092,-0.999236,0,-0.228904,1.734267,0,
+ 0.303379,-0.73119,-0.611002,-0.267035,1.627058,-0.266577,
+ 0.244106,-0.79539,-0.554768,-0.557624,1.641278,-0.271462,
+ 0.235033,-0.721825,-0.650944,-0.559706,1.69418,-0.186107,
+ 0.303379,-0.73119,-0.611002,-0.267035,1.627058,-0.266577,
+ 0.235033,-0.721825,-0.650944,-0.559706,1.69418,-0.186107,
+ 0.335626,-0.735806,-0.588171,-0.221516,1.686349,-0.151403,
+ 0.298349,-0.828641,-0.473647,-0.247999,1.565146,-0.389142,
+ 0.213948,-0.943673,-0.252405,-0.626493,1.585426,-0.443136,
+ 0.244106,-0.79539,-0.554768,-0.557624,1.641278,-0.271462,
+ 0.298349,-0.828641,-0.473647,-0.247999,1.565146,-0.389142,
+ 0.244106,-0.79539,-0.554768,-0.557624,1.641278,-0.271462,
+ 0.303379,-0.73119,-0.611002,-0.267035,1.627058,-0.266577,
+ 0.267279,-0.944479,-0.191107,-0.179548,1.471301,-0.544513,
+ 0.190577,-0.970681,-0.146488,-0.597781,1.48962,-0.641047,
+ 0.213948,-0.943673,-0.252405,-0.626493,1.585426,-0.443136,
+ 0.267279,-0.944479,-0.191107,-0.179548,1.471301,-0.544513,
+ 0.213948,-0.943673,-0.252405,-0.626493,1.585426,-0.443136,
+ 0.298349,-0.828641,-0.473647,-0.247999,1.565146,-0.389142,
+ 0.029207,0.916877,-0.398099,-0.192546,1.305535,-0.70008,
+ 0.048754,0.934073,-0.353738,-0.674657,1.333008,-0.761059,
+ 0.190577,-0.970681,-0.146488,-0.597781,1.48962,-0.641047,
+ 0.029207,0.916877,-0.398099,-0.192546,1.305535,-0.70008,
+ 0.190577,-0.970681,-0.146488,-0.597781,1.48962,-0.641047,
+ 0.267279,-0.944479,-0.191107,-0.179548,1.471301,-0.544513,
+ 0.051939,0.876473,-0.478641,-0.406155,1.005088,-0.971088,
+ 0.081223,0.915345,-0.394394,-0.910602,1.204118,-0.83774,
+ 0.048754,0.934073,-0.353738,-0.674657,1.333008,-0.761059,
+ 0.051939,0.876473,-0.478641,-0.406155,1.005088,-0.971088,
+ 0.048754,0.934073,-0.353738,-0.674657,1.333008,-0.761059,
+ 0.029207,0.916877,-0.398099,-0.192546,1.305535,-0.70008,
+ 0.092427,0.86666,-0.490263,-0.11519,0.458427,-1.346197,
+ 0.120116,0.912706,-0.390565,-0.969076,0.901205,-1.146223,
+ 0.081223,0.915345,-0.394394,-0.910602,1.204118,-0.83774,
+ 0.092427,0.86666,-0.490263,-0.11519,0.458427,-1.346197,
+ 0.081223,0.915345,-0.394394,-0.910602,1.204118,-0.83774,
+ 0.051939,0.876473,-0.478641,-0.406155,1.005088,-0.971088,
+ 0.129186,0.757141,-0.64035,0.005537,0.163519,-1.472265,
+ 0.1717,0.74071,-0.649514,-0.752416,0.438132,-1.467349,
+ 0.120116,0.912706,-0.390565,-0.969076,0.901205,-1.146223,
+ 0.129186,0.757141,-0.64035,0.005537,0.163519,-1.472265,
+ 0.120116,0.912706,-0.390565,-0.969076,0.901205,-1.146223,
+ 0.092427,0.86666,-0.490263,-0.11519,0.458427,-1.346197,
+ 0.101272,0.634315,-0.766413,0.018086,0.002865,-1.523199,
+ 0.167704,0.495674,-0.852164,-0.645496,0.179261,-1.584316,
+ 0.1717,0.74071,-0.649514,-0.752416,0.438132,-1.467349,
+ 0.101272,0.634315,-0.766413,0.018086,0.002865,-1.523199,
+ 0.1717,0.74071,-0.649514,-0.752416,0.438132,-1.467349,
+ 0.129186,0.757141,-0.64035,0.005537,0.163519,-1.472265,
+ 0.089104,0.59547,-0.798421,0.034087,-0.225059,-1.542949,
+ 0.140536,0.558684,-0.817388,-0.536767,-0.144454,-1.682232,
+ 0.167704,0.495674,-0.852164,-0.645496,0.179261,-1.584316,
+ 0.089104,0.59547,-0.798421,0.034087,-0.225059,-1.542949,
+ 0.167704,0.495674,-0.852164,-0.645496,0.179261,-1.584316,
+ 0.101272,0.634315,-0.766413,0.018086,0.002865,-1.523199,
+ 0.147941,0.53134,-0.834141,0.010486,-0.502317,-1.576297,
+ 0.136523,0.621747,-0.771228,-0.533528,-0.58228,-1.701405,
+ 0.140536,0.558684,-0.817388,-0.536767,-0.144454,-1.682232,
+ 0.147941,0.53134,-0.834141,0.010486,-0.502317,-1.576297,
+ 0.140536,0.558684,-0.817388,-0.536767,-0.144454,-1.682232,
+ 0.089104,0.59547,-0.798421,0.034087,-0.225059,-1.542949,
+ 0.206788,0.399922,-0.892917,0.021051,-0.831931,-1.511548,
+ 0.100131,0.509748,-0.854477,-0.505045,-0.913827,-1.645612,
+ 0.136523,0.621747,-0.771228,-0.533528,-0.58228,-1.701405,
+ 0.206788,0.399922,-0.892917,0.021051,-0.831931,-1.511548,
+ 0.136523,0.621747,-0.771228,-0.533528,-0.58228,-1.701405,
+ 0.147941,0.53134,-0.834141,0.010486,-0.502317,-1.576297,
+ 0.246802,0.252523,-0.935586,-0.04157,-1.143825,-1.395176,
+ 0.063174,0.351351,-0.93411,-0.487217,-1.193519,-1.504026,
+ 0.100131,0.509748,-0.854477,-0.505045,-0.913827,-1.645612,
+ 0.246802,0.252523,-0.935586,-0.04157,-1.143825,-1.395176,
+ 0.100131,0.509748,-0.854477,-0.505045,-0.913827,-1.645612,
+ 0.206788,0.399922,-0.892917,0.021051,-0.831931,-1.511548,
+ 0.274567,0.116527,-0.954481,-0.071941,-1.346991,-1.237379,
+ 0.078896,0.195617,-0.977502,-0.524231,-1.399266,-1.313019,
+ 0.063174,0.351351,-0.93411,-0.487217,-1.193519,-1.504026,
+ 0.274567,0.116527,-0.954481,-0.071941,-1.346991,-1.237379,
+ 0.063174,0.351351,-0.93411,-0.487217,-1.193519,-1.504026,
+ 0.246802,0.252523,-0.935586,-0.04157,-1.143825,-1.395176,
+ 0.303729,-0.050718,-0.951408,-0.0723,-1.450245,-1.087397,
+ 0.097816,-0.016117,-0.995074,-0.526127,-1.495,-1.167736,
+ 0.078896,0.195617,-0.977502,-0.524231,-1.399266,-1.313019,
+ 0.303729,-0.050718,-0.951408,-0.0723,-1.450245,-1.087397,
+ 0.078896,0.195617,-0.977502,-0.524231,-1.399266,-1.313019,
+ 0.274567,0.116527,-0.954481,-0.071941,-1.346991,-1.237379,
+ 0.33122,-0.270106,-0.904067,-0.063012,-1.583021,-0.865082,
+ 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
+ 0.097816,-0.016117,-0.995074,-0.526127,-1.495,-1.167736,
+ 0.33122,-0.270106,-0.904067,-0.063012,-1.583021,-0.865082,
+ 0.097816,-0.016117,-0.995074,-0.526127,-1.495,-1.167736,
+ 0.303729,-0.050718,-0.951408,-0.0723,-1.450245,-1.087397,
+ 0.004725,-0.680391,-0.732834,-0.894132,1.712652,-0.151911,
+ -0.267766,-0.862787,-0.428835,-1.215563,1.757097,-0.133494,
+ -0.065586,-0.997847,0,-1.179474,1.786649,0,
+ 0.004725,-0.680391,-0.732834,-0.894132,1.712652,-0.151911,
+ -0.065586,-0.997847,0,-1.179474,1.786649,0,
+ -0.098179,0.995169,0,-0.866132,1.75467,0,
+ 0.034172,-0.858604,-0.511498,-0.954897,1.677544,-0.293034,
+ -0.263452,-0.648591,-0.714089,-1.227613,1.709095,-0.276029,
+ -0.267766,-0.862787,-0.428835,-1.215563,1.757097,-0.133494,
+ 0.034172,-0.858604,-0.511498,-0.954897,1.677544,-0.293034,
+ -0.267766,-0.862787,-0.428835,-1.215563,1.757097,-0.133494,
+ 0.004725,-0.680391,-0.732834,-0.894132,1.712652,-0.151911,
+ 0.037423,-0.986705,-0.158154,-1.017767,1.607824,-0.541965,
+ -0.301558,-0.77828,-0.550766,-1.292756,1.656509,-0.51403,
+ -0.263452,-0.648591,-0.714089,-1.227613,1.709095,-0.276029,
+ 0.037423,-0.986705,-0.158154,-1.017767,1.607824,-0.541965,
+ -0.263452,-0.648591,-0.714089,-1.227613,1.709095,-0.276029,
+ 0.034172,-0.858604,-0.511498,-0.954897,1.677544,-0.293034,
+ 0.013768,-0.992402,-0.122267,-1.04607,1.509097,-0.76106,
+ -0.154129,-0.981148,-0.116585,-1.338488,1.613735,-0.725441,
+ -0.301558,-0.77828,-0.550766,-1.292756,1.656509,-0.51403,
+ 0.013768,-0.992402,-0.122267,-1.04607,1.509097,-0.76106,
+ -0.301558,-0.77828,-0.550766,-1.292756,1.656509,-0.51403,
+ 0.037423,-0.986705,-0.158154,-1.017767,1.607824,-0.541965,
+ 0.076524,0.950336,-0.301672,-1.115594,1.39238,-0.819623,
+ 0.095331,0.952335,-0.289775,-1.403848,1.533059,-0.902827,
+ -0.154129,-0.981148,-0.116585,-1.338488,1.613735,-0.725441,
+ 0.076524,0.950336,-0.301672,-1.115594,1.39238,-0.819623,
+ -0.154129,-0.981148,-0.116585,-1.338488,1.613735,-0.725441,
+ 0.013768,-0.992402,-0.122267,-1.04607,1.509097,-0.76106,
+ 0.100598,0.942931,-0.317428,-1.278903,1.192051,-0.946843,
+ 0.10291,0.954344,-0.280422,-1.551526,1.400025,-1.050193,
+ 0.095331,0.952335,-0.289775,-1.403848,1.533059,-0.902827,
+ 0.100598,0.942931,-0.317428,-1.278903,1.192051,-0.946843,
+ 0.095331,0.952335,-0.289775,-1.403848,1.533059,-0.902827,
+ 0.076524,0.950336,-0.301672,-1.115594,1.39238,-0.819623,
+ 0.150328,0.92948,-0.336851,-1.200768,0.978822,-1.103391,
+ 0.172251,0.950689,-0.257916,-1.552899,1.128654,-1.15104,
+ 0.10291,0.954344,-0.280422,-1.551526,1.400025,-1.050193,
+ 0.150328,0.92948,-0.336851,-1.200768,0.978822,-1.103391,
+ 0.10291,0.954344,-0.280422,-1.551526,1.400025,-1.050193,
+ 0.100598,0.942931,-0.317428,-1.278903,1.192051,-0.946843,
+ 0.235667,0.756618,-0.60991,-1.147922,0.807955,-1.254191,
+ 0.28101,0.853935,-0.437982,-1.454529,0.875045,-1.238858,
+ 0.172251,0.950689,-0.257916,-1.552899,1.128654,-1.15104,
+ 0.235667,0.756618,-0.60991,-1.147922,0.807955,-1.254191,
+ 0.172251,0.950689,-0.257916,-1.552899,1.128654,-1.15104,
+ 0.150328,0.92948,-0.336851,-1.200768,0.978822,-1.103391,
+ 0.305452,0.425365,-0.851918,-1.120716,0.424016,-1.45699,
+ 0.381239,0.555717,-0.738807,-1.405685,0.573835,-1.352181,
+ 0.28101,0.853935,-0.437982,-1.454529,0.875045,-1.238858,
+ 0.305452,0.425365,-0.851918,-1.120716,0.424016,-1.45699,
+ 0.28101,0.853935,-0.437982,-1.454529,0.875045,-1.238858,
+ 0.235667,0.756618,-0.60991,-1.147922,0.807955,-1.254191,
+ 0.325482,0.443544,-0.835063,-1.077307,0.165008,-1.553393,
+ 0.376012,0.360026,-0.853813,-1.479588,0.295746,-1.440042,
+ 0.381239,0.555717,-0.738807,-1.405685,0.573835,-1.352181,
+ 0.325482,0.443544,-0.835063,-1.077307,0.165008,-1.553393,
+ 0.381239,0.555717,-0.738807,-1.405685,0.573835,-1.352181,
+ 0.305452,0.425365,-0.851918,-1.120716,0.424016,-1.45699,
+ 0.242426,0.58207,-0.77616,-1.053434,-0.342553,-1.690245,
+ 0.207079,0.373404,-0.904261,-1.489699,-0.024215,-1.510987,
+ 0.376012,0.360026,-0.853813,-1.479588,0.295746,-1.440042,
+ 0.242426,0.58207,-0.77616,-1.053434,-0.342553,-1.690245,
+ 0.376012,0.360026,-0.853813,-1.479588,0.295746,-1.440042,
+ 0.325482,0.443544,-0.835063,-1.077307,0.165008,-1.553393,
+ 0.070189,0.510248,-0.857158,-1.077209,-0.869649,-1.633144,
+ -0.045242,0.348413,-0.936249,-1.395501,-0.698702,-1.553257,
+ 0.207079,0.373404,-0.904261,-1.489699,-0.024215,-1.510987,
+ 0.070189,0.510248,-0.857158,-1.077209,-0.869649,-1.633144,
+ 0.207079,0.373404,-0.904261,-1.489699,-0.024215,-1.510987,
+ 0.242426,0.58207,-0.77616,-1.053434,-0.342553,-1.690245,
+ -0.078623,0.370994,-0.925301,-1.061272,-1.141877,-1.49623,
+ -0.212948,0.334057,-0.918182,-1.376176,-0.948757,-1.451608,
+ -0.045242,0.348413,-0.936249,-1.395501,-0.698702,-1.553257,
+ -0.078623,0.370994,-0.925301,-1.061272,-1.141877,-1.49623,
+ -0.045242,0.348413,-0.936249,-1.395501,-0.698702,-1.553257,
+ 0.070189,0.510248,-0.857158,-1.077209,-0.869649,-1.633144,
+ -0.123389,0.256577,-0.958615,-1.001366,-1.335897,-1.353338,
+ -0.282152,0.285245,-0.915983,-1.402349,-1.127845,-1.309055,
+ -0.212948,0.334057,-0.918182,-1.376176,-0.948757,-1.451608,
+ -0.123389,0.256577,-0.958615,-1.001366,-1.335897,-1.353338,
+ -0.212948,0.334057,-0.918182,-1.376176,-0.948757,-1.451608,
+ -0.078623,0.370994,-0.925301,-1.061272,-1.141877,-1.49623,
+ -0.165685,0.059692,-0.98437,-0.952525,-1.440582,-1.16865,
+ -0.326048,0.118611,-0.937883,-1.407658,-1.236026,-1.11293,
+ -0.282152,0.285245,-0.915983,-1.402349,-1.127845,-1.309055,
+ -0.165685,0.059692,-0.98437,-0.952525,-1.440582,-1.16865,
+ -0.282152,0.285245,-0.915983,-1.402349,-1.127845,-1.309055,
+ -0.123389,0.256577,-0.958615,-1.001366,-1.335897,-1.353338,
+ -0.031021,0.098798,-0.994624,1.644178,-0.857872,-1.208494,
+ -0.039079,0.203923,-0.978207,1.640095,-0.674556,-1.246804,
+ 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
+ 0.12742,0.021045,-0.991626,1.462507,1.745481,-0.222394,
+ 0.779025,-0.626993,0,1.456656,1.785879,0,
+ -0.720176,-0.693792,0,1.794465,1.787719,0,
+ 0.12742,0.021045,-0.991626,1.462507,1.745481,-0.222394,
+ -0.720176,-0.693792,0,1.794465,1.787719,0,
+ 0.513731,-0.239493,-0.823847,1.807583,1.756546,-0.177627,
+ 0.206882,-0.117024,-0.971342,1.483832,1.697594,-0.288781,
+ 0.12742,0.021045,-0.991626,1.462507,1.745481,-0.222394,
+ 0.513731,-0.239493,-0.823847,1.807583,1.756546,-0.177627,
+ 0.206882,-0.117024,-0.971342,1.483832,1.697594,-0.288781,
+ 0.513731,-0.239493,-0.823847,1.807583,1.756546,-0.177627,
+ 0.506924,-0.406124,-0.760323,1.798719,1.714447,-0.259352,
+ 0.218538,-0.213954,-0.952084,1.497138,1.618935,-0.401108,
+ 0.206882,-0.117024,-0.971342,1.483832,1.697594,-0.288781,
+ 0.506924,-0.406124,-0.760323,1.798719,1.714447,-0.259352,
+ 0.218538,-0.213954,-0.952084,1.497138,1.618935,-0.401108,
+ 0.506924,-0.406124,-0.760323,1.798719,1.714447,-0.259352,
+ 0.552632,-0.484765,-0.677938,1.821946,1.618209,-0.403751,
+ 0.304965,-0.136677,-0.942505,1.504951,1.483493,-0.585976,
+ 0.218538,-0.213954,-0.952084,1.497138,1.618935,-0.401108,
+ 0.552632,-0.484765,-0.677938,1.821946,1.618209,-0.403751,
+ 0.304965,-0.136677,-0.942505,1.504951,1.483493,-0.585976,
+ 0.552632,-0.484765,-0.677938,1.821946,1.618209,-0.403751,
+ 0.696414,-0.392791,-0.600602,1.859443,1.450393,-0.632222,
+ -0.061264,0.921927,-0.382487,1.517126,1.334367,-0.741076,
+ 0.304965,-0.136677,-0.942505,1.504951,1.483493,-0.585976,
+ 0.696414,-0.392791,-0.600602,1.859443,1.450393,-0.632222,
+ -0.061264,0.921927,-0.382487,1.517126,1.334367,-0.741076,
+ 0.696414,-0.392791,-0.600602,1.859443,1.450393,-0.632222,
+ 0.026499,0.942993,-0.331757,1.958254,1.130271,-0.861813,
+ -0.070642,0.834207,-0.546908,1.570685,0.938327,-0.989108,
+ -0.061264,0.921927,-0.382487,1.517126,1.334367,-0.741076,
+ 0.026499,0.942993,-0.331757,1.958254,1.130271,-0.861813,
+ -0.070642,0.834207,-0.546908,1.570685,0.938327,-0.989108,
+ 0.026499,0.942993,-0.331757,1.958254,1.130271,-0.861813,
+ 0.019336,0.837694,-0.545798,1.975941,0.827957,-1.018423,
+ -0.055544,0.828008,-0.557959,1.582203,0.771083,-1.06818,
+ -0.070642,0.834207,-0.546908,1.570685,0.938327,-0.989108,
+ 0.019336,0.837694,-0.545798,1.975941,0.827957,-1.018423,
+ -0.047373,0.758242,-0.65025,1.63008,0.420236,-1.172369,
+ -0.055544,0.828008,-0.557959,1.582203,0.771083,-1.06818,
+ 0.019336,0.837694,-0.545798,1.975941,0.827957,-1.018423,
+ -0.047373,0.758242,-0.65025,1.63008,0.420236,-1.172369,
+ 0.019336,0.837694,-0.545798,1.975941,0.827957,-1.018423,
+ 0.052979,0.780732,-0.622616,2.023441,0.529338,-1.144399,
+ -0.046579,0.627301,-0.777383,1.649027,0.224458,-1.211969,
+ -0.047373,0.758242,-0.65025,1.63008,0.420236,-1.172369,
+ 0.052979,0.780732,-0.622616,2.023441,0.529338,-1.144399,
+ -0.046579,0.627301,-0.777383,1.649027,0.224458,-1.211969,
+ 0.052979,0.780732,-0.622616,2.023441,0.529338,-1.144399,
+ 0.115383,0.694944,-0.709746,2.0817,0.283249,-1.259461,
+ -0.05128,0.509983,-0.858655,1.660355,0.019397,-1.246002,
+ -0.046579,0.627301,-0.777383,1.649027,0.224458,-1.211969,
+ 0.115383,0.694944,-0.709746,2.0817,0.283249,-1.259461,
+ -0.05128,0.509983,-0.858655,1.660355,0.019397,-1.246002,
+ 0.115383,0.694944,-0.709746,2.0817,0.283249,-1.259461,
+ 0.146937,0.551946,-0.820832,2.14179,-0.055306,-1.295565,
+ -0.02226,0.394285,-0.918719,1.664159,-0.189659,-1.266729,
+ -0.05128,0.509983,-0.858655,1.660355,0.019397,-1.246002,
+ 0.146937,0.551946,-0.820832,2.14179,-0.055306,-1.295565,
+ -0.02226,0.394285,-0.918719,1.664159,-0.189659,-1.266729,
+ 0.146937,0.551946,-0.820832,2.14179,-0.055306,-1.295565,
+ 0.12555,0.440005,-0.889176,2.136269,-0.187666,-1.278057,
+ -0.026262,0.311275,-0.949957,1.678622,-0.410061,-1.291177,
+ -0.02226,0.394285,-0.918719,1.664159,-0.189659,-1.266729,
+ 0.12555,0.440005,-0.889176,2.136269,-0.187666,-1.278057,
+ -0.026262,0.311275,-0.949957,1.678622,-0.410061,-1.291177,
+ 0.12555,0.440005,-0.889176,2.136269,-0.187666,-1.278057,
+ 0.10998,0.376752,-0.919762,2.108912,-0.357128,-1.259691,
+ -0.039079,0.203923,-0.978207,1.640095,-0.674556,-1.246804,
+ -0.026262,0.311275,-0.949957,1.678622,-0.410061,-1.291177,
+ 0.10998,0.376752,-0.919762,2.108912,-0.357128,-1.259691,
+ -0.039079,0.203923,-0.978207,1.640095,-0.674556,-1.246804,
+ 0.10998,0.376752,-0.919762,2.108912,-0.357128,-1.259691,
+ 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
+ -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
+ -0.809154,0.004832,-0.587577,2.158585,-0.955809,-1.113647,
+ -0.965506,-0.176768,0.191185,2.058189,-0.931238,-1.163518,
+ -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
+ -0.965506,-0.176768,0.191185,2.058189,-0.931238,-1.163518,
+ 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
+ 0.561574,-0.148323,-0.814024,2.245624,-0.864372,-0.995778,
+ -0.742985,0.015712,-0.669123,2.222082,-0.957342,-1.014137,
+ 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
+ 0.859237,-0.17312,-0.481395,1.635139,-0.965221,-1.184968,
+ -0.031021,0.098798,-0.994624,1.644178,-0.857872,-1.208494,
+ 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
+ -0.942755,-0.29871,0.148273,1.867657,-0.920633,-1.206933,
+ 0.859237,-0.17312,-0.481395,1.635139,-0.965221,-1.184968,
+ 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
+ -0.965506,-0.176768,0.191185,2.058189,-0.931238,-1.163518,
+ -0.942755,-0.29871,0.148273,1.867657,-0.920633,-1.206933,
+ 0.097864,0.250653,-0.963118,2.013534,-0.662303,-1.191491,
+ -0.560667,-0.828041,0,1.604939,-1.556997,0,
+ -0.217942,-0.897186,0.384134,1.721211,-1.590185,-0.601932,
+ -0.084936,-0.226589,0.97028,1.963153,-1.588839,-0.612861,
+ -0.560667,-0.828041,0,1.604939,-1.556997,0,
+ -0.084936,-0.226589,0.97028,1.963153,-1.588839,-0.612861,
+ -0.034649,0.9994,0,1.920432,-1.567396,0,
+ -0.148631,-0.373855,-0.915501,1.210555,-1.460061,-0.576841,
+ -0.305786,-0.232288,-0.923329,1.19204,-1.330605,-0.678707,
+ 0.080262,-0.270606,-0.959339,1.328862,-1.352627,-0.758733,
+ -0.148631,-0.373855,-0.915501,1.210555,-1.460061,-0.576841,
+ 0.080262,-0.270606,-0.959339,1.328862,-1.352627,-0.758733,
+ -0.794709,-0.185222,0.578041,1.451825,-1.576856,-0.702758,
+ -0.185127,-0.491394,-0.851035,1.223415,-1.532658,-0.434522,
+ -0.148631,-0.373855,-0.915501,1.210555,-1.460061,-0.576841,
+ -0.794709,-0.185222,0.578041,1.451825,-1.576856,-0.702758,
+ -0.185127,-0.491394,-0.851035,1.223415,-1.532658,-0.434522,
+ -0.794709,-0.185222,0.578041,1.451825,-1.576856,-0.702758,
+ -0.493424,-0.165611,0.853877,1.599889,-1.595526,-0.623185,
+ -0.084936,-0.226589,0.97028,1.963153,-1.588839,-0.612861,
+ 0.552828,-0.750794,-0.36151,2.0482,-1.581983,-0.555832,
+ -0.034649,0.9994,0,1.920432,-1.567396,0,
+ -0.560667,-0.828041,0,1.604939,-1.556997,0,
+ 0.770209,-0.637792,0,1.289448,-1.546597,0,
+ -0.185127,-0.491394,-0.851035,1.223415,-1.532658,-0.434522,
+ -0.560667,-0.828041,0,1.604939,-1.556997,0,
+ -0.185127,-0.491394,-0.851035,1.223415,-1.532658,-0.434522,
+ -0.493424,-0.165611,0.853877,1.599889,-1.595526,-0.623185,
+ -0.560667,-0.828041,0,1.604939,-1.556997,0,
+ -0.493424,-0.165611,0.853877,1.599889,-1.595526,-0.623185,
+ -0.217942,-0.897186,0.384134,1.721211,-1.590185,-0.601932,
+ -0.305786,-0.232288,-0.923329,1.19204,-1.330605,-0.678707,
+ 0.102263,-0.969566,-0.222452,1.219163,-1.218342,-0.823029,
+ 0.02992,-0.202031,-0.978922,1.348219,-1.282064,-0.845204,
+ -0.305786,-0.232288,-0.923329,1.19204,-1.330605,-0.678707,
+ 0.02992,-0.202031,-0.978922,1.348219,-1.282064,-0.845204,
+ 0.080262,-0.270606,-0.959339,1.328862,-1.352627,-0.758733,
+ 0.152876,-0.742504,-0.652163,1.252961,-0.928825,-1.001643,
+ 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
+ 0.045651,-0.004499,-0.998947,1.337875,-0.945716,-1.021299,
+ 0.120054,-0.825719,-0.551157,1.230116,-1.085439,-0.894543,
+ 0.152876,-0.742504,-0.652163,1.252961,-0.928825,-1.001643,
+ 0.045651,-0.004499,-0.998947,1.337875,-0.945716,-1.021299,
+ 0.120054,-0.825719,-0.551157,1.230116,-1.085439,-0.894543,
+ 0.045651,-0.004499,-0.998947,1.337875,-0.945716,-1.021299,
+ 0.023392,-0.110333,-0.993619,1.310865,-1.136322,-0.914838,
+ 0.102263,-0.969566,-0.222452,1.219163,-1.218342,-0.823029,
+ 0.120054,-0.825719,-0.551157,1.230116,-1.085439,-0.894543,
+ 0.023392,-0.110333,-0.993619,1.310865,-1.136322,-0.914838,
+ 0.102263,-0.969566,-0.222452,1.219163,-1.218342,-0.823029,
+ 0.023392,-0.110333,-0.993619,1.310865,-1.136322,-0.914838,
+ 0.02992,-0.202031,-0.978922,1.348219,-1.282064,-0.845204,
+ -0.031021,0.098798,-0.994624,1.644178,-0.857872,-1.208494,
+ 0.859237,-0.17312,-0.481395,1.635139,-0.965221,-1.184968,
+ 0.714393,-0.109998,-0.691045,1.536037,-0.985876,-1.185597,
+ -0.039079,0.203923,-0.978207,1.640095,-0.674556,-1.246804,
+ -0.031021,0.098798,-0.994624,1.644178,-0.857872,-1.208494,
+ 0.714393,-0.109998,-0.691045,1.536037,-0.985876,-1.185597,
+ -0.039079,0.203923,-0.978207,1.640095,-0.674556,-1.246804,
+ 0.714393,-0.109998,-0.691045,1.536037,-0.985876,-1.185597,
+ 0.419396,-0.035927,-0.907092,1.428883,-0.98669,-1.133905,
+ 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
+ -0.026262,0.311275,-0.949957,1.678622,-0.410061,-1.291177,
+ -0.039079,0.203923,-0.978207,1.640095,-0.674556,-1.246804,
+ 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
+ -0.039079,0.203923,-0.978207,1.640095,-0.674556,-1.246804,
+ 0.419396,-0.035927,-0.907092,1.428883,-0.98669,-1.133905,
+ 0.779025,-0.626993,0,1.456656,1.785879,0,
+ 0.12742,0.021045,-0.991626,1.462507,1.745481,-0.222394,
+ 0.981421,-0.191868,0,0.733818,1.740873,0,
+ -0.185127,-0.491394,-0.851035,1.223415,-1.532658,-0.434522,
+ 0.770209,-0.637792,0,1.289448,-1.546597,0,
+ 0.92802,-0.37253,0,0.927497,-1.558489,0,
+ -0.185127,-0.491394,-0.851035,1.223415,-1.532658,-0.434522,
+ 0.92802,-0.37253,0,0.927497,-1.558489,0,
+ 0.213167,-0.525559,-0.823619,0.912989,-1.499314,-0.419547,
+ -0.148631,-0.373855,-0.915501,1.210555,-1.460061,-0.576841,
+ -0.185127,-0.491394,-0.851035,1.223415,-1.532658,-0.434522,
+ 0.213167,-0.525559,-0.823619,0.912989,-1.499314,-0.419547,
+ -0.148631,-0.373855,-0.915501,1.210555,-1.460061,-0.576841,
+ 0.213167,-0.525559,-0.823619,0.912989,-1.499314,-0.419547,
+ 0.23972,-0.400363,-0.884445,0.912699,-1.455066,-0.576185,
+ -0.305786,-0.232288,-0.923329,1.19204,-1.330605,-0.678707,
+ -0.148631,-0.373855,-0.915501,1.210555,-1.460061,-0.576841,
+ 0.23972,-0.400363,-0.884445,0.912699,-1.455066,-0.576185,
+ -0.305786,-0.232288,-0.923329,1.19204,-1.330605,-0.678707,
+ 0.23972,-0.400363,-0.884445,0.912699,-1.455066,-0.576185,
+ 0.25339,-0.287519,-0.923648,0.922703,-1.296032,-0.728307,
+ 0.102263,-0.969566,-0.222452,1.219163,-1.218342,-0.823029,
+ -0.305786,-0.232288,-0.923329,1.19204,-1.330605,-0.678707,
+ 0.25339,-0.287519,-0.923648,0.922703,-1.296032,-0.728307,
+ 0.102263,-0.969566,-0.222452,1.219163,-1.218342,-0.823029,
+ 0.25339,-0.287519,-0.923648,0.922703,-1.296032,-0.728307,
+ 0.187438,-0.340915,-0.921219,0.93066,-1.216516,-0.831196,
+ 0.120054,-0.825719,-0.551157,1.230116,-1.085439,-0.894543,
+ 0.102263,-0.969566,-0.222452,1.219163,-1.218342,-0.823029,
+ 0.187438,-0.340915,-0.921219,0.93066,-1.216516,-0.831196,
+ 0.120054,-0.825719,-0.551157,1.230116,-1.085439,-0.894543,
+ 0.187438,-0.340915,-0.921219,0.93066,-1.216516,-0.831196,
+ 0.114032,-0.218132,-0.969234,0.956456,-1.070504,-0.921063,
+ 0.152876,-0.742504,-0.652163,1.252961,-0.928825,-1.001643,
+ 0.120054,-0.825719,-0.551157,1.230116,-1.085439,-0.894543,
+ 0.114032,-0.218132,-0.969234,0.956456,-1.070504,-0.921063,
+ 0.152876,-0.742504,-0.652163,1.252961,-0.928825,-1.001643,
+ 0.114032,-0.218132,-0.969234,0.956456,-1.070504,-0.921063,
+ 0.10833,0.05569,-0.992554,0.939974,-0.894739,-1.019809,
+ 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
+ 0.152876,-0.742504,-0.652163,1.252961,-0.928825,-1.001643,
+ 0.10833,0.05569,-0.992554,0.939974,-0.894739,-1.019809,
+ 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
+ 0.10833,0.05569,-0.992554,0.939974,-0.894739,-1.019809,
+ 0.107989,0.168108,-0.979836,0.948819,-0.638568,-1.102958,
+ 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
+ 0.107989,0.168108,-0.979836,0.948819,-0.638568,-1.102958,
+ 0.088722,0.251367,-0.963817,0.97453,-0.525273,-1.140353,
+ -0.026262,0.311275,-0.949957,1.678622,-0.410061,-1.291177,
+ 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
+ 0.088722,0.251367,-0.963817,0.97453,-0.525273,-1.140353,
+ -0.026262,0.311275,-0.949957,1.678622,-0.410061,-1.291177,
+ 0.088722,0.251367,-0.963817,0.97453,-0.525273,-1.140353,
+ 0.060533,0.377837,-0.923891,0.960321,-0.308052,-1.243133,
+ -0.02226,0.394285,-0.918719,1.664159,-0.189659,-1.266729,
+ -0.026262,0.311275,-0.949957,1.678622,-0.410061,-1.291177,
+ 0.060533,0.377837,-0.923891,0.960321,-0.308052,-1.243133,
+ -0.02226,0.394285,-0.918719,1.664159,-0.189659,-1.266729,
+ 0.060533,0.377837,-0.923891,0.960321,-0.308052,-1.243133,
+ 0.016737,0.497476,-0.867316,0.943855,-0.101127,-1.274771,
+ -0.05128,0.509983,-0.858655,1.660355,0.019397,-1.246002,
+ -0.02226,0.394285,-0.918719,1.664159,-0.189659,-1.266729,
+ 0.016737,0.497476,-0.867316,0.943855,-0.101127,-1.274771,
+ -0.05128,0.509983,-0.858655,1.660355,0.019397,-1.246002,
+ 0.016737,0.497476,-0.867316,0.943855,-0.101127,-1.274771,
+ -0.024013,0.58573,-0.810151,0.950215,0.042751,-1.256188,
+ -0.046579,0.627301,-0.777383,1.649027,0.224458,-1.211969,
+ -0.05128,0.509983,-0.858655,1.660355,0.019397,-1.246002,
+ -0.024013,0.58573,-0.810151,0.950215,0.042751,-1.256188,
+ -0.046579,0.627301,-0.777383,1.649027,0.224458,-1.211969,
+ -0.024013,0.58573,-0.810151,0.950215,0.042751,-1.256188,
+ -0.057955,0.638634,-0.767325,0.927775,0.195225,-1.233043,
+ -0.047373,0.758242,-0.65025,1.63008,0.420236,-1.172369,
+ -0.046579,0.627301,-0.777383,1.649027,0.224458,-1.211969,
+ -0.057955,0.638634,-0.767325,0.927775,0.195225,-1.233043,
+ -0.047373,0.758242,-0.65025,1.63008,0.420236,-1.172369,
+ -0.057955,0.638634,-0.767325,0.927775,0.195225,-1.233043,
+ -0.069142,0.724976,-0.685295,0.939271,0.379986,-1.185872,
+ -0.055544,0.828008,-0.557959,1.582203,0.771083,-1.06818,
+ -0.047373,0.758242,-0.65025,1.63008,0.420236,-1.172369,
+ -0.069142,0.724976,-0.685295,0.939271,0.379986,-1.185872,
+ -0.055544,0.828008,-0.557959,1.582203,0.771083,-1.06818,
+ -0.069142,0.724976,-0.685295,0.939271,0.379986,-1.185872,
+ -0.06371,0.842533,-0.534864,0.921312,0.755659,-0.99933,
+ -0.070642,0.834207,-0.546908,1.570685,0.938327,-0.989108,
+ -0.055544,0.828008,-0.557959,1.582203,0.771083,-1.06818,
+ -0.06371,0.842533,-0.534864,0.921312,0.755659,-0.99933,
+ -0.070642,0.834207,-0.546908,1.570685,0.938327,-0.989108,
+ -0.06371,0.842533,-0.534864,0.921312,0.755659,-0.99933,
+ 0.791391,-0.43807,-0.426373,0.857323,0.985001,-0.874029,
+ -0.070642,0.834207,-0.546908,1.570685,0.938327,-0.989108,
+ 0.791391,-0.43807,-0.426373,0.857323,0.985001,-0.874029,
+ 0.623235,-0.257987,-0.738255,0.760722,1.205036,-0.700545,
+ -0.061264,0.921927,-0.382487,1.517126,1.334367,-0.741076,
+ -0.070642,0.834207,-0.546908,1.570685,0.938327,-0.989108,
+ 0.623235,-0.257987,-0.738255,0.760722,1.205036,-0.700545,
+ -0.061264,0.921927,-0.382487,1.517126,1.334367,-0.741076,
+ 0.623235,-0.257987,-0.738255,0.760722,1.205036,-0.700545,
+ 0.631747,-0.24686,-0.734817,0.725959,1.478055,-0.461804,
+ 0.304965,-0.136677,-0.942505,1.504951,1.483493,-0.585976,
+ -0.061264,0.921927,-0.382487,1.517126,1.334367,-0.741076,
+ 0.631747,-0.24686,-0.734817,0.725959,1.478055,-0.461804,
+ 0.304965,-0.136677,-0.942505,1.504951,1.483493,-0.585976,
+ 0.631747,-0.24686,-0.734817,0.725959,1.478055,-0.461804,
+ 0.659349,-0.248914,-0.709437,0.737904,1.604213,-0.281713,
+ 0.218538,-0.213954,-0.952084,1.497138,1.618935,-0.401108,
+ 0.304965,-0.136677,-0.942505,1.504951,1.483493,-0.585976,
+ 0.659349,-0.248914,-0.709437,0.737904,1.604213,-0.281713,
+ 0.206882,-0.117024,-0.971342,1.483832,1.697594,-0.288781,
+ 0.218538,-0.213954,-0.952084,1.497138,1.618935,-0.401108,
+ 0.659349,-0.248914,-0.709437,0.737904,1.604213,-0.281713,
+ 0.206882,-0.117024,-0.971342,1.483832,1.697594,-0.288781,
+ 0.659349,-0.248914,-0.709437,0.737904,1.604213,-0.281713,
+ 0.981421,-0.191868,0,0.733818,1.740873,0,
+ 0.12742,0.021045,-0.991626,1.462507,1.745481,-0.222394,
+ 0.206882,-0.117024,-0.971342,1.483832,1.697594,-0.288781,
+ 0.981421,-0.191868,0,0.733818,1.740873,0,
+ -0.208715,-0.624734,-0.752427,0.223642,1.684075,-0.160743,
+ 0.335626,-0.735806,-0.588171,-0.221516,1.686349,-0.151403,
+ -0.039092,-0.999236,0,-0.228904,1.734267,0,
+ -0.208715,-0.624734,-0.752427,0.223642,1.684075,-0.160743,
+ -0.039092,-0.999236,0,-0.228904,1.734267,0,
+ 0.566114,-0.824327,0,0.234527,1.730117,0,
+ -0.251063,-0.683027,-0.685888,0.23733,1.595746,-0.288672,
+ 0.303379,-0.73119,-0.611002,-0.267035,1.627058,-0.266577,
+ 0.335626,-0.735806,-0.588171,-0.221516,1.686349,-0.151403,
+ -0.251063,-0.683027,-0.685888,0.23733,1.595746,-0.288672,
+ 0.335626,-0.735806,-0.588171,-0.221516,1.686349,-0.151403,
+ -0.208715,-0.624734,-0.752427,0.223642,1.684075,-0.160743,
+ -0.252973,-0.819125,-0.51482,0.289039,1.496446,-0.430055,
+ 0.298349,-0.828641,-0.473647,-0.247999,1.565146,-0.389142,
+ 0.303379,-0.73119,-0.611002,-0.267035,1.627058,-0.266577,
+ -0.252973,-0.819125,-0.51482,0.289039,1.496446,-0.430055,
+ 0.303379,-0.73119,-0.611002,-0.267035,1.627058,-0.266577,
+ -0.251063,-0.683027,-0.685888,0.23733,1.595746,-0.288672,
+ -0.13716,-0.98063,-0.139827,0.305671,1.298417,-0.629719,
+ 0.267279,-0.944479,-0.191107,-0.179548,1.471301,-0.544513,
+ 0.298349,-0.828641,-0.473647,-0.247999,1.565146,-0.389142,
+ -0.13716,-0.98063,-0.139827,0.305671,1.298417,-0.629719,
+ 0.298349,-0.828641,-0.473647,-0.247999,1.565146,-0.389142,
+ -0.252973,-0.819125,-0.51482,0.289039,1.496446,-0.430055,
+ 0.007127,0.896038,-0.44392,0.243473,1.134082,-0.819993,
+ 0.029207,0.916877,-0.398099,-0.192546,1.305535,-0.70008,
+ 0.267279,-0.944479,-0.191107,-0.179548,1.471301,-0.544513,
+ 0.007127,0.896038,-0.44392,0.243473,1.134082,-0.819993,
+ 0.267279,-0.944479,-0.191107,-0.179548,1.471301,-0.544513,
+ -0.13716,-0.98063,-0.139827,0.305671,1.298417,-0.629719,
+ 0.009434,0.815301,-0.578961,0.316341,0.785311,-1.08626,
+ 0.051939,0.876473,-0.478641,-0.406155,1.005088,-0.971088,
+ 0.029207,0.916877,-0.398099,-0.192546,1.305535,-0.70008,
+ 0.009434,0.815301,-0.578961,0.316341,0.785311,-1.08626,
+ 0.029207,0.916877,-0.398099,-0.192546,1.305535,-0.70008,
+ 0.007127,0.896038,-0.44392,0.243473,1.134082,-0.819993,
+ 0.040473,0.760778,-0.647749,0.539252,0.353984,-1.254493,
+ 0.092427,0.86666,-0.490263,-0.11519,0.458427,-1.346197,
+ 0.051939,0.876473,-0.478641,-0.406155,1.005088,-0.971088,
+ 0.040473,0.760778,-0.647749,0.539252,0.353984,-1.254493,
+ 0.051939,0.876473,-0.478641,-0.406155,1.005088,-0.971088,
+ 0.009434,0.815301,-0.578961,0.316341,0.785311,-1.08626,
+ 0.080812,0.697931,-0.711591,0.53915,0.148262,-1.321014,
+ 0.129186,0.757141,-0.64035,0.005537,0.163519,-1.472265,
+ 0.092427,0.86666,-0.490263,-0.11519,0.458427,-1.346197,
+ 0.080812,0.697931,-0.711591,0.53915,0.148262,-1.321014,
+ 0.092427,0.86666,-0.490263,-0.11519,0.458427,-1.346197,
+ 0.040473,0.760778,-0.647749,0.539252,0.353984,-1.254493,
+ 0.09853,0.626571,-0.773111,0.516872,-0.020713,-1.356627,
+ 0.101272,0.634315,-0.766413,0.018086,0.002865,-1.523199,
+ 0.129186,0.757141,-0.64035,0.005537,0.163519,-1.472265,
+ 0.09853,0.626571,-0.773111,0.516872,-0.020713,-1.356627,
+ 0.129186,0.757141,-0.64035,0.005537,0.163519,-1.472265,
+ 0.080812,0.697931,-0.711591,0.53915,0.148262,-1.321014,
+ 0.111825,0.518485,-0.847743,0.542386,-0.188227,-1.370375,
+ 0.089104,0.59547,-0.798421,0.034087,-0.225059,-1.542949,
+ 0.101272,0.634315,-0.766413,0.018086,0.002865,-1.523199,
+ 0.111825,0.518485,-0.847743,0.542386,-0.188227,-1.370375,
+ 0.101272,0.634315,-0.766413,0.018086,0.002865,-1.523199,
+ 0.09853,0.626571,-0.773111,0.516872,-0.020713,-1.356627,
+ 0.163727,0.387435,-0.907242,0.546875,-0.39094,-1.363244,
+ 0.147941,0.53134,-0.834141,0.010486,-0.502317,-1.576297,
+ 0.089104,0.59547,-0.798421,0.034087,-0.225059,-1.542949,
+ 0.163727,0.387435,-0.907242,0.546875,-0.39094,-1.363244,
+ 0.089104,0.59547,-0.798421,0.034087,-0.225059,-1.542949,
+ 0.111825,0.518485,-0.847743,0.542386,-0.188227,-1.370375,
+ 0.227108,0.258715,-0.938876,0.550658,-0.633015,-1.331311,
+ 0.206788,0.399922,-0.892917,0.021051,-0.831931,-1.511548,
+ 0.147941,0.53134,-0.834141,0.010486,-0.502317,-1.576297,
+ 0.227108,0.258715,-0.938876,0.550658,-0.633015,-1.331311,
+ 0.147941,0.53134,-0.834141,0.010486,-0.502317,-1.576297,
+ 0.163727,0.387435,-0.907242,0.546875,-0.39094,-1.363244,
+ 0.263434,0.119819,-0.957207,0.527724,-0.862854,-1.253811,
+ 0.246802,0.252523,-0.935586,-0.04157,-1.143825,-1.395176,
+ 0.206788,0.399922,-0.892917,0.021051,-0.831931,-1.511548,
+ 0.263434,0.119819,-0.957207,0.527724,-0.862854,-1.253811,
+ 0.206788,0.399922,-0.892917,0.021051,-0.831931,-1.511548,
+ 0.227108,0.258715,-0.938876,0.550658,-0.633015,-1.331311,
+ 0.304293,-0.024391,-0.952266,0.544825,-1.133123,-1.096902,
+ 0.274567,0.116527,-0.954481,-0.071941,-1.346991,-1.237379,
+ 0.246802,0.252523,-0.935586,-0.04157,-1.143825,-1.395176,
+ 0.304293,-0.024391,-0.952266,0.544825,-1.133123,-1.096902,
+ 0.246802,0.252523,-0.935586,-0.04157,-1.143825,-1.395176,
+ 0.263434,0.119819,-0.957207,0.527724,-0.862854,-1.253811,
+ 0.372063,-0.134052,-0.918477,0.530629,-1.316423,-0.929842,
+ 0.303729,-0.050718,-0.951408,-0.0723,-1.450245,-1.087397,
+ 0.274567,0.116527,-0.954481,-0.071941,-1.346991,-1.237379,
+ 0.372063,-0.134052,-0.918477,0.530629,-1.316423,-0.929842,
+ 0.274567,0.116527,-0.954481,-0.071941,-1.346991,-1.237379,
+ 0.304293,-0.024391,-0.952266,0.544825,-1.133123,-1.096902,
+ 0.424286,-0.254348,-0.869073,0.538756,-1.408602,-0.764911,
+ 0.33122,-0.270106,-0.904067,-0.063012,-1.583021,-0.865082,
+ 0.303729,-0.050718,-0.951408,-0.0723,-1.450245,-1.087397,
+ 0.424286,-0.254348,-0.869073,0.538756,-1.408602,-0.764911,
+ 0.303729,-0.050718,-0.951408,-0.0723,-1.450245,-1.087397,
+ 0.372063,-0.134052,-0.918477,0.530629,-1.316423,-0.929842,
+ 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
+ 0.327725,-0.489439,-0.808112,-0.07847,-1.688266,-0.80023,
+ 0.33122,-0.270106,-0.904067,-0.063012,-1.583021,-0.865082,
+ 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
+ 0.33122,-0.270106,-0.904067,-0.063012,-1.583021,-0.865082,
+ 0.424286,-0.254348,-0.869073,0.538756,-1.408602,-0.764911,
+ 0.420794,-0.405156,-0.811653,0.489819,-1.524947,-0.672392,
+ 0.291858,-0.681117,-0.67149,-0.094135,-1.769086,-0.556924,
+ 0.327725,-0.489439,-0.808112,-0.07847,-1.688266,-0.80023,
+ 0.235033,-0.721825,-0.650944,-0.559706,1.69418,-0.186107,
+ 0.004725,-0.680391,-0.732834,-0.894132,1.712652,-0.151911,
+ -0.098179,0.995169,0,-0.866132,1.75467,0,
+ 0.235033,-0.721825,-0.650944,-0.559706,1.69418,-0.186107,
+ -0.098179,0.995169,0,-0.866132,1.75467,0,
+ -0.009814,-0.999952,0,-0.547248,1.742126,0,
+ 0.244106,-0.79539,-0.554768,-0.557624,1.641278,-0.271462,
+ 0.034172,-0.858604,-0.511498,-0.954897,1.677544,-0.293034,
+ 0.004725,-0.680391,-0.732834,-0.894132,1.712652,-0.151911,
+ 0.244106,-0.79539,-0.554768,-0.557624,1.641278,-0.271462,
+ 0.004725,-0.680391,-0.732834,-0.894132,1.712652,-0.151911,
+ 0.235033,-0.721825,-0.650944,-0.559706,1.69418,-0.186107,
+ 0.213948,-0.943673,-0.252405,-0.626493,1.585426,-0.443136,
+ 0.037423,-0.986705,-0.158154,-1.017767,1.607824,-0.541965,
+ 0.034172,-0.858604,-0.511498,-0.954897,1.677544,-0.293034,
+ 0.213948,-0.943673,-0.252405,-0.626493,1.585426,-0.443136,
+ 0.034172,-0.858604,-0.511498,-0.954897,1.677544,-0.293034,
+ 0.244106,-0.79539,-0.554768,-0.557624,1.641278,-0.271462,
+ 0.190577,-0.970681,-0.146488,-0.597781,1.48962,-0.641047,
+ 0.013768,-0.992402,-0.122267,-1.04607,1.509097,-0.76106,
+ 0.037423,-0.986705,-0.158154,-1.017767,1.607824,-0.541965,
+ 0.190577,-0.970681,-0.146488,-0.597781,1.48962,-0.641047,
+ 0.037423,-0.986705,-0.158154,-1.017767,1.607824,-0.541965,
+ 0.213948,-0.943673,-0.252405,-0.626493,1.585426,-0.443136,
+ 0.048754,0.934073,-0.353738,-0.674657,1.333008,-0.761059,
+ 0.076524,0.950336,-0.301672,-1.115594,1.39238,-0.819623,
+ 0.013768,-0.992402,-0.122267,-1.04607,1.509097,-0.76106,
+ 0.048754,0.934073,-0.353738,-0.674657,1.333008,-0.761059,
+ 0.013768,-0.992402,-0.122267,-1.04607,1.509097,-0.76106,
+ 0.190577,-0.970681,-0.146488,-0.597781,1.48962,-0.641047,
+ 0.081223,0.915345,-0.394394,-0.910602,1.204118,-0.83774,
+ 0.100598,0.942931,-0.317428,-1.278903,1.192051,-0.946843,
+ 0.076524,0.950336,-0.301672,-1.115594,1.39238,-0.819623,
+ 0.081223,0.915345,-0.394394,-0.910602,1.204118,-0.83774,
+ 0.076524,0.950336,-0.301672,-1.115594,1.39238,-0.819623,
+ 0.048754,0.934073,-0.353738,-0.674657,1.333008,-0.761059,
+ 0.120116,0.912706,-0.390565,-0.969076,0.901205,-1.146223,
+ 0.150328,0.92948,-0.336851,-1.200768,0.978822,-1.103391,
+ 0.100598,0.942931,-0.317428,-1.278903,1.192051,-0.946843,
+ 0.120116,0.912706,-0.390565,-0.969076,0.901205,-1.146223,
+ 0.100598,0.942931,-0.317428,-1.278903,1.192051,-0.946843,
+ 0.081223,0.915345,-0.394394,-0.910602,1.204118,-0.83774,
+ 0.1717,0.74071,-0.649514,-0.752416,0.438132,-1.467349,
+ 0.235667,0.756618,-0.60991,-1.147922,0.807955,-1.254191,
+ 0.150328,0.92948,-0.336851,-1.200768,0.978822,-1.103391,
+ 0.1717,0.74071,-0.649514,-0.752416,0.438132,-1.467349,
+ 0.150328,0.92948,-0.336851,-1.200768,0.978822,-1.103391,
+ 0.120116,0.912706,-0.390565,-0.969076,0.901205,-1.146223,
+ 0.167704,0.495674,-0.852164,-0.645496,0.179261,-1.584316,
+ 0.305452,0.425365,-0.851918,-1.120716,0.424016,-1.45699,
+ 0.235667,0.756618,-0.60991,-1.147922,0.807955,-1.254191,
+ 0.167704,0.495674,-0.852164,-0.645496,0.179261,-1.584316,
+ 0.235667,0.756618,-0.60991,-1.147922,0.807955,-1.254191,
+ 0.1717,0.74071,-0.649514,-0.752416,0.438132,-1.467349,
+ 0.140536,0.558684,-0.817388,-0.536767,-0.144454,-1.682232,
+ 0.325482,0.443544,-0.835063,-1.077307,0.165008,-1.553393,
+ 0.305452,0.425365,-0.851918,-1.120716,0.424016,-1.45699,
+ 0.140536,0.558684,-0.817388,-0.536767,-0.144454,-1.682232,
+ 0.305452,0.425365,-0.851918,-1.120716,0.424016,-1.45699,
+ 0.167704,0.495674,-0.852164,-0.645496,0.179261,-1.584316,
+ 0.136523,0.621747,-0.771228,-0.533528,-0.58228,-1.701405,
+ 0.242426,0.58207,-0.77616,-1.053434,-0.342553,-1.690245,
+ 0.325482,0.443544,-0.835063,-1.077307,0.165008,-1.553393,
+ 0.136523,0.621747,-0.771228,-0.533528,-0.58228,-1.701405,
+ 0.325482,0.443544,-0.835063,-1.077307,0.165008,-1.553393,
+ 0.140536,0.558684,-0.817388,-0.536767,-0.144454,-1.682232,
+ 0.100131,0.509748,-0.854477,-0.505045,-0.913827,-1.645612,
+ 0.070189,0.510248,-0.857158,-1.077209,-0.869649,-1.633144,
+ 0.242426,0.58207,-0.77616,-1.053434,-0.342553,-1.690245,
+ 0.100131,0.509748,-0.854477,-0.505045,-0.913827,-1.645612,
+ 0.242426,0.58207,-0.77616,-1.053434,-0.342553,-1.690245,
+ 0.136523,0.621747,-0.771228,-0.533528,-0.58228,-1.701405,
+ 0.063174,0.351351,-0.93411,-0.487217,-1.193519,-1.504026,
+ -0.078623,0.370994,-0.925301,-1.061272,-1.141877,-1.49623,
+ 0.070189,0.510248,-0.857158,-1.077209,-0.869649,-1.633144,
+ 0.063174,0.351351,-0.93411,-0.487217,-1.193519,-1.504026,
+ 0.070189,0.510248,-0.857158,-1.077209,-0.869649,-1.633144,
+ 0.100131,0.509748,-0.854477,-0.505045,-0.913827,-1.645612,
+ 0.078896,0.195617,-0.977502,-0.524231,-1.399266,-1.313019,
+ -0.123389,0.256577,-0.958615,-1.001366,-1.335897,-1.353338,
+ -0.078623,0.370994,-0.925301,-1.061272,-1.141877,-1.49623,
+ 0.078896,0.195617,-0.977502,-0.524231,-1.399266,-1.313019,
+ -0.078623,0.370994,-0.925301,-1.061272,-1.141877,-1.49623,
+ 0.063174,0.351351,-0.93411,-0.487217,-1.193519,-1.504026,
+ 0.097816,-0.016117,-0.995074,-0.526127,-1.495,-1.167736,
+ -0.165685,0.059692,-0.98437,-0.952525,-1.440582,-1.16865,
+ -0.123389,0.256577,-0.958615,-1.001366,-1.335897,-1.353338,
+ 0.097816,-0.016117,-0.995074,-0.526127,-1.495,-1.167736,
+ -0.123389,0.256577,-0.958615,-1.001366,-1.335897,-1.353338,
+ 0.078896,0.195617,-0.977502,-0.524231,-1.399266,-1.313019,
+ 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
+ -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
+ -0.165685,0.059692,-0.98437,-0.952525,-1.440582,-1.16865,
+ 0.10737,-0.293005,-0.950063,-0.535144,-1.615983,-0.920556,
+ -0.165685,0.059692,-0.98437,-0.952525,-1.440582,-1.16865,
+ 0.097816,-0.016117,-0.995074,-0.526127,-1.495,-1.167736,
+ 0.769758,0.095155,-0.631204,2.688131,-0.517509,-0.672975,
+ 0.763734,0.228435,-0.603761,2.736198,-0.346225,-0.659345,
+ 0.226413,-0.89822,-0.376747,2.881063,-0.493146,-0.521968,
+ 0.594643,-0.107364,-0.796789,2.663024,-1.440487,-0.478149,
+ 0.655995,-0.105886,-0.747301,2.740886,-1.339225,-0.463604,
+ 0.690473,-0.61586,-0.379425,2.824356,-1.407256,-0.355013,
+ 0.184661,-0.694307,-0.695585,1.373216,-0.56462,-1.106245,
+ 0.419396,-0.035927,-0.907092,1.428883,-0.98669,-1.133905,
+ 0.045651,-0.004499,-0.998947,1.337875,-0.945716,-1.021299,
+ -0.267766,-0.862787,-0.428835,-1.215563,1.757097,-0.133494,
+ -0.507894,-0.767261,-0.391606,-1.365948,1.769608,-0.133901,
+ 0.262234,-0.965004,0,-1.35095,1.807009,0,
+ -0.267766,-0.862787,-0.428835,-1.215563,1.757097,-0.133494,
+ 0.262234,-0.965004,0,-1.35095,1.807009,0,
+ -0.065586,-0.997847,0,-1.179474,1.786649,0,
+ -0.263452,-0.648591,-0.714089,-1.227613,1.709095,-0.276029,
+ -0.375453,-0.69207,-0.616502,-1.396332,1.723782,-0.267642,
+ -0.507894,-0.767261,-0.391606,-1.365948,1.769608,-0.133901,
+ -0.263452,-0.648591,-0.714089,-1.227613,1.709095,-0.276029,
+ -0.507894,-0.767261,-0.391606,-1.365948,1.769608,-0.133901,
+ -0.267766,-0.862787,-0.428835,-1.215563,1.757097,-0.133494,
+ -0.301558,-0.77828,-0.550766,-1.292756,1.656509,-0.51403,
+ -0.1427,-0.847733,-0.510868,-1.417595,1.67618,-0.529265,
+ -0.375453,-0.69207,-0.616502,-1.396332,1.723782,-0.267642,
+ -0.301558,-0.77828,-0.550766,-1.292756,1.656509,-0.51403,
+ -0.375453,-0.69207,-0.616502,-1.396332,1.723782,-0.267642,
+ -0.263452,-0.648591,-0.714089,-1.227613,1.709095,-0.276029,
+ -0.154129,-0.981148,-0.116585,-1.338488,1.613735,-0.725441,
+ -0.178511,-0.973481,-0.143068,-1.465432,1.655336,-0.722125,
+ -0.1427,-0.847733,-0.510868,-1.417595,1.67618,-0.529265,
+ -0.154129,-0.981148,-0.116585,-1.338488,1.613735,-0.725441,
+ -0.1427,-0.847733,-0.510868,-1.417595,1.67618,-0.529265,
+ -0.301558,-0.77828,-0.550766,-1.292756,1.656509,-0.51403,
+ 0.095331,0.952335,-0.289775,-1.403848,1.533059,-0.902827,
+ 0.067879,0.951186,-0.30106,-1.582187,1.567542,-0.982349,
+ -0.178511,-0.973481,-0.143068,-1.465432,1.655336,-0.722125,
+ 0.095331,0.952335,-0.289775,-1.403848,1.533059,-0.902827,
+ -0.178511,-0.973481,-0.143068,-1.465432,1.655336,-0.722125,
+ -0.154129,-0.981148,-0.116585,-1.338488,1.613735,-0.725441,
+ 0.10291,0.954344,-0.280422,-1.551526,1.400025,-1.050193,
+ 0.085022,0.963119,-0.255291,-1.721806,1.391264,-1.113307,
+ 0.067879,0.951186,-0.30106,-1.582187,1.567542,-0.982349,
+ 0.10291,0.954344,-0.280422,-1.551526,1.400025,-1.050193,
+ 0.067879,0.951186,-0.30106,-1.582187,1.567542,-0.982349,
+ 0.095331,0.952335,-0.289775,-1.403848,1.533059,-0.902827,
+ 0.172251,0.950689,-0.257916,-1.552899,1.128654,-1.15104,
+ 0.120743,0.971588,-0.203561,-1.733703,1.083864,-1.181489,
+ 0.085022,0.963119,-0.255291,-1.721806,1.391264,-1.113307,
+ 0.172251,0.950689,-0.257916,-1.552899,1.128654,-1.15104,
+ 0.085022,0.963119,-0.255291,-1.721806,1.391264,-1.113307,
+ 0.10291,0.954344,-0.280422,-1.551526,1.400025,-1.050193,
+ 0.28101,0.853935,-0.437982,-1.454529,0.875045,-1.238858,
+ 0.117963,0.926753,-0.356669,-1.807421,0.657142,-1.209422,
+ 0.120743,0.971588,-0.203561,-1.733703,1.083864,-1.181489,
+ 0.28101,0.853935,-0.437982,-1.454529,0.875045,-1.238858,
+ 0.120743,0.971588,-0.203561,-1.733703,1.083864,-1.181489,
+ 0.172251,0.950689,-0.257916,-1.552899,1.128654,-1.15104,
+ 0.381239,0.555717,-0.738807,-1.405685,0.573835,-1.352181,
+ 0.109947,0.693426,-0.712089,-1.796156,0.452382,-1.243643,
+ 0.117963,0.926753,-0.356669,-1.807421,0.657142,-1.209422,
+ 0.381239,0.555717,-0.738807,-1.405685,0.573835,-1.352181,
+ 0.117963,0.926753,-0.356669,-1.807421,0.657142,-1.209422,
+ 0.28101,0.853935,-0.437982,-1.454529,0.875045,-1.238858,
+ 0.376012,0.360026,-0.853813,-1.479588,0.295746,-1.440042,
+ 0.076565,0.333251,-0.939724,-1.81092,0.287592,-1.292257,
+ 0.109947,0.693426,-0.712089,-1.796156,0.452382,-1.243643,
+ 0.376012,0.360026,-0.853813,-1.479588,0.295746,-1.440042,
+ 0.109947,0.693426,-0.712089,-1.796156,0.452382,-1.243643,
+ 0.381239,0.555717,-0.738807,-1.405685,0.573835,-1.352181,
+ 0.207079,0.373404,-0.904261,-1.489699,-0.024215,-1.510987,
+ -0.039599,0.171847,-0.984327,-1.79513,0.033439,-1.37116,
+ 0.076565,0.333251,-0.939724,-1.81092,0.287592,-1.292257,
+ 0.207079,0.373404,-0.904261,-1.489699,-0.024215,-1.510987,
+ 0.076565,0.333251,-0.939724,-1.81092,0.287592,-1.292257,
+ 0.376012,0.360026,-0.853813,-1.479588,0.295746,-1.440042,
+ -0.045242,0.348413,-0.936249,-1.395501,-0.698702,-1.553257,
+ -0.164972,0.181757,-0.969406,-1.802864,-0.282523,-1.401315,
+ -0.039599,0.171847,-0.984327,-1.79513,0.033439,-1.37116,
+ -0.045242,0.348413,-0.936249,-1.395501,-0.698702,-1.553257,
+ -0.039599,0.171847,-0.984327,-1.79513,0.033439,-1.37116,
+ 0.207079,0.373404,-0.904261,-1.489699,-0.024215,-1.510987,
+ -0.212948,0.334057,-0.918182,-1.376176,-0.948757,-1.451608,
+ -0.216817,0.278777,-0.935561,-1.837859,-0.540871,-1.295851,
+ -0.164972,0.181757,-0.969406,-1.802864,-0.282523,-1.401315,
+ -0.212948,0.334057,-0.918182,-1.376176,-0.948757,-1.451608,
+ -0.164972,0.181757,-0.969406,-1.802864,-0.282523,-1.401315,
+ -0.045242,0.348413,-0.936249,-1.395501,-0.698702,-1.553257,
+ -0.282152,0.285245,-0.915983,-1.402349,-1.127845,-1.309055,
+ -0.219724,0.297861,-0.928978,-1.782928,-0.770786,-1.173619,
+ -0.216817,0.278777,-0.935561,-1.837859,-0.540871,-1.295851,
+ -0.282152,0.285245,-0.915983,-1.402349,-1.127845,-1.309055,
+ -0.216817,0.278777,-0.935561,-1.837859,-0.540871,-1.295851,
+ -0.212948,0.334057,-0.918182,-1.376176,-0.948757,-1.451608,
+ -0.326048,0.118611,-0.937883,-1.407658,-1.236026,-1.11293,
+ -0.227368,0.161984,-0.960242,-1.757573,-0.945337,-1.075832,
+ -0.219724,0.297861,-0.928978,-1.782928,-0.770786,-1.173619,
+ -0.326048,0.118611,-0.937883,-1.407658,-1.236026,-1.11293,
+ -0.219724,0.297861,-0.928978,-1.782928,-0.770786,-1.173619,
+ -0.282152,0.285245,-0.915983,-1.402349,-1.127845,-1.309055,
+ -0.507894,-0.767261,-0.391606,-1.365948,1.769608,-0.133901,
+ -0.387895,-0.42081,-0.820034,-1.683863,1.789041,-0.121501,
+ 0.021487,0.999769,0,-1.67651,1.826886,0,
+ -0.507894,-0.767261,-0.391606,-1.365948,1.769608,-0.133901,
+ 0.021487,0.999769,0,-1.67651,1.826886,0,
+ 0.262234,-0.965004,0,-1.35095,1.807009,0,
+ -0.375453,-0.69207,-0.616502,-1.396332,1.723782,-0.267642,
+ -0.433119,-0.541143,-0.720814,-1.714432,1.747956,-0.247594,
+ -0.387895,-0.42081,-0.820034,-1.683863,1.789041,-0.121501,
+ -0.375453,-0.69207,-0.616502,-1.396332,1.723782,-0.267642,
+ -0.387895,-0.42081,-0.820034,-1.683863,1.789041,-0.121501,
+ -0.507894,-0.767261,-0.391606,-1.365948,1.769608,-0.133901,
+ -0.1427,-0.847733,-0.510868,-1.417595,1.67618,-0.529265,
+ -0.455057,-0.684123,-0.569999,-1.744732,1.734849,-0.433807,
+ -0.433119,-0.541143,-0.720814,-1.714432,1.747956,-0.247594,
+ -0.1427,-0.847733,-0.510868,-1.417595,1.67618,-0.529265,
+ -0.433119,-0.541143,-0.720814,-1.714432,1.747956,-0.247594,
+ -0.375453,-0.69207,-0.616502,-1.396332,1.723782,-0.267642,
+ -0.178511,-0.973481,-0.143068,-1.465432,1.655336,-0.722125,
+ -0.084259,-0.367691,-0.926123,-1.929731,1.617188,-0.80639,
+ -0.455057,-0.684123,-0.569999,-1.744732,1.734849,-0.433807,
+ -0.178511,-0.973481,-0.143068,-1.465432,1.655336,-0.722125,
+ -0.455057,-0.684123,-0.569999,-1.744732,1.734849,-0.433807,
+ -0.1427,-0.847733,-0.510868,-1.417595,1.67618,-0.529265,
+ 0.067879,0.951186,-0.30106,-1.582187,1.567542,-0.982349,
+ 0.061261,0.954316,-0.292452,-1.996117,1.387891,-1.064104,
+ -0.084259,-0.367691,-0.926123,-1.929731,1.617188,-0.80639,
+ 0.067879,0.951186,-0.30106,-1.582187,1.567542,-0.982349,
+ -0.084259,-0.367691,-0.926123,-1.929731,1.617188,-0.80639,
+ -0.178511,-0.973481,-0.143068,-1.465432,1.655336,-0.722125,
+ 0.085022,0.963119,-0.255291,-1.721806,1.391264,-1.113307,
+ 0.076969,0.969253,-0.233719,-1.980388,1.134038,-1.143196,
+ 0.061261,0.954316,-0.292452,-1.996117,1.387891,-1.064104,
+ 0.085022,0.963119,-0.255291,-1.721806,1.391264,-1.113307,
+ 0.061261,0.954316,-0.292452,-1.996117,1.387891,-1.064104,
+ 0.067879,0.951186,-0.30106,-1.582187,1.567542,-0.982349,
+ 0.120743,0.971588,-0.203561,-1.733703,1.083864,-1.181489,
+ 0.057779,0.975002,-0.214553,-2.013663,0.810726,-1.158827,
+ 0.076969,0.969253,-0.233719,-1.980388,1.134038,-1.143196,
+ 0.120743,0.971588,-0.203561,-1.733703,1.083864,-1.181489,
+ 0.076969,0.969253,-0.233719,-1.980388,1.134038,-1.143196,
+ 0.085022,0.963119,-0.255291,-1.721806,1.391264,-1.113307,
+ 0.117963,0.926753,-0.356669,-1.807421,0.657142,-1.209422,
+ -0.021294,0.896295,-0.442946,-2.030191,0.547622,-1.189762,
+ 0.057779,0.975002,-0.214553,-2.013663,0.810726,-1.158827,
+ 0.117963,0.926753,-0.356669,-1.807421,0.657142,-1.209422,
+ 0.057779,0.975002,-0.214553,-2.013663,0.810726,-1.158827,
+ 0.120743,0.971588,-0.203561,-1.733703,1.083864,-1.181489,
+ 0.109947,0.693426,-0.712089,-1.796156,0.452382,-1.243643,
+ -0.072244,0.618144,-0.782738,-2.021159,0.411979,-1.234679,
+ -0.021294,0.896295,-0.442946,-2.030191,0.547622,-1.189762,
+ 0.109947,0.693426,-0.712089,-1.796156,0.452382,-1.243643,
+ -0.021294,0.896295,-0.442946,-2.030191,0.547622,-1.189762,
+ 0.117963,0.926753,-0.356669,-1.807421,0.657142,-1.209422,
+ 0.076565,0.333251,-0.939724,-1.81092,0.287592,-1.292257,
+ -0.038944,0.247819,-0.968023,-1.932916,0.232972,-1.304589,
+ -0.072244,0.618144,-0.782738,-2.021159,0.411979,-1.234679,
+ 0.076565,0.333251,-0.939724,-1.81092,0.287592,-1.292257,
+ -0.072244,0.618144,-0.782738,-2.021159,0.411979,-1.234679,
+ 0.109947,0.693426,-0.712089,-1.796156,0.452382,-1.243643,
+ -0.039599,0.171847,-0.984327,-1.79513,0.033439,-1.37116,
+ -0.00315,0.115338,-0.993321,-1.897394,0.037852,-1.365798,
+ -0.038944,0.247819,-0.968023,-1.932916,0.232972,-1.304589,
+ -0.039599,0.171847,-0.984327,-1.79513,0.033439,-1.37116,
+ -0.038944,0.247819,-0.968023,-1.932916,0.232972,-1.304589,
+ 0.076565,0.333251,-0.939724,-1.81092,0.287592,-1.292257,
+ -0.164972,0.181757,-0.969406,-1.802864,-0.282523,-1.401315,
+ 0.016683,0.197618,-0.980137,-1.950547,-0.275573,-1.377028,
+ -0.00315,0.115338,-0.993321,-1.897394,0.037852,-1.365798,
+ -0.164972,0.181757,-0.969406,-1.802864,-0.282523,-1.401315,
+ -0.00315,0.115338,-0.993321,-1.897394,0.037852,-1.365798,
+ -0.039599,0.171847,-0.984327,-1.79513,0.033439,-1.37116,
+ -0.216817,0.278777,-0.935561,-1.837859,-0.540871,-1.295851,
+ 0.032424,0.316591,-0.948008,-2.033655,-0.526012,-1.277639,
+ 0.016683,0.197618,-0.980137,-1.950547,-0.275573,-1.377028,
+ -0.216817,0.278777,-0.935561,-1.837859,-0.540871,-1.295851,
+ 0.016683,0.197618,-0.980137,-1.950547,-0.275573,-1.377028,
+ -0.164972,0.181757,-0.969406,-1.802864,-0.282523,-1.401315,
+ -0.219724,0.297861,-0.928978,-1.782928,-0.770786,-1.173619,
+ 0.053195,0.343167,-0.937767,-2.050292,-0.755566,-1.114167,
+ 0.032424,0.316591,-0.948008,-2.033655,-0.526012,-1.277639,
+ -0.219724,0.297861,-0.928978,-1.782928,-0.770786,-1.173619,
+ 0.032424,0.316591,-0.948008,-2.033655,-0.526012,-1.277639,
+ -0.216817,0.278777,-0.935561,-1.837859,-0.540871,-1.295851,
+ -0.227368,0.161984,-0.960242,-1.757573,-0.945337,-1.075832,
+ 0.057735,0.173734,-0.983099,-2.043593,-0.875823,-1.028879,
+ 0.053195,0.343167,-0.937767,-2.050292,-0.755566,-1.114167,
+ -0.227368,0.161984,-0.960242,-1.757573,-0.945337,-1.075832,
+ 0.053195,0.343167,-0.937767,-2.050292,-0.755566,-1.114167,
+ -0.219724,0.297861,-0.928978,-1.782928,-0.770786,-1.173619,
+ -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
+ 0.058723,-0.195869,-0.97887,-2.033406,-0.91003,-0.96422,
+ 0.057735,0.173734,-0.983099,-2.043593,-0.875823,-1.028879,
+ -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
+ 0.057735,0.173734,-0.983099,-2.043593,-0.875823,-1.028879,
+ -0.227368,0.161984,-0.960242,-1.757573,-0.945337,-1.075832,
+ 0.121987,-0.426326,-0.896306,-1.198513,-1.456102,-0.885435,
+ -0.326048,0.118611,-0.937883,-1.407658,-1.236026,-1.11293,
+ -0.165685,0.059692,-0.98437,-0.952525,-1.440582,-1.16865,
+ 0.121987,-0.426326,-0.896306,-1.198513,-1.456102,-0.885435,
+ -0.165685,0.059692,-0.98437,-0.952525,-1.440582,-1.16865,
+ -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
+ 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
+ -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
+ -0.227368,0.161984,-0.960242,-1.757573,-0.945337,-1.075832,
+ 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
+ -0.227368,0.161984,-0.960242,-1.757573,-0.945337,-1.075832,
+ -0.326048,0.118611,-0.937883,-1.407658,-1.236026,-1.11293,
+ -0.422758,-0.178302,-0.888529,-1.366873,-1.340211,-0.907567,
+ 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
+ -0.326048,0.118611,-0.937883,-1.407658,-1.236026,-1.11293,
+ 0.121987,-0.426326,-0.896306,-1.198513,-1.456102,-0.885435,
+ -0.422758,-0.178302,-0.888529,-1.366873,-1.340211,-0.907567,
+ -0.326048,0.118611,-0.937883,-1.407658,-1.236026,-1.11293,
+ -0.387895,-0.42081,-0.820034,-1.683863,1.789041,-0.121501,
+ 0.088769,-0.475351,-0.875307,-2.079597,1.817785,-0.138375,
+ 0.181762,-0.983343,0,-2.057387,1.841308,0,
+ -0.387895,-0.42081,-0.820034,-1.683863,1.789041,-0.121501,
+ 0.181762,-0.983343,0,-2.057387,1.841308,0,
+ 0.021487,0.999769,0,-1.67651,1.826886,0,
+ -0.433119,-0.541143,-0.720814,-1.714432,1.747956,-0.247594,
+ 0.099302,-0.563694,-0.819993,-2.10017,1.78998,-0.229245,
+ 0.088769,-0.475351,-0.875307,-2.079597,1.817785,-0.138375,
+ -0.433119,-0.541143,-0.720814,-1.714432,1.747956,-0.247594,
+ 0.088769,-0.475351,-0.875307,-2.079597,1.817785,-0.138375,
+ -0.387895,-0.42081,-0.820034,-1.683863,1.789041,-0.121501,
+ -0.455057,-0.684123,-0.569999,-1.744732,1.734849,-0.433807,
+ 0.093801,-0.705497,-0.702478,-2.137524,1.753182,-0.433142,
+ 0.099302,-0.563694,-0.819993,-2.10017,1.78998,-0.229245,
+ -0.455057,-0.684123,-0.569999,-1.744732,1.734849,-0.433807,
+ 0.099302,-0.563694,-0.819993,-2.10017,1.78998,-0.229245,
+ -0.433119,-0.541143,-0.720814,-1.714432,1.747956,-0.247594,
+ -0.084259,-0.367691,-0.926123,-1.929731,1.617188,-0.80639,
+ 0.058028,-0.329667,-0.942312,-2.172139,1.62301,-0.805318,
+ 0.093801,-0.705497,-0.702478,-2.137524,1.753182,-0.433142,
+ -0.084259,-0.367691,-0.926123,-1.929731,1.617188,-0.80639,
+ 0.093801,-0.705497,-0.702478,-2.137524,1.753182,-0.433142,
+ -0.455057,-0.684123,-0.569999,-1.744732,1.734849,-0.433807,
+ 0.061261,0.954316,-0.292452,-1.996117,1.387891,-1.064104,
+ 0.096347,0.961203,-0.258467,-2.205791,1.356023,-1.081662,
+ 0.058028,-0.329667,-0.942312,-2.172139,1.62301,-0.805318,
+ 0.061261,0.954316,-0.292452,-1.996117,1.387891,-1.064104,
+ 0.058028,-0.329667,-0.942312,-2.172139,1.62301,-0.805318,
+ -0.084259,-0.367691,-0.926123,-1.929731,1.617188,-0.80639,
+ 0.076969,0.969253,-0.233719,-1.980388,1.134038,-1.143196,
+ 0.098712,0.966371,-0.23745,-2.296056,1.06281,-1.171139,
+ 0.096347,0.961203,-0.258467,-2.205791,1.356023,-1.081662,
+ 0.076969,0.969253,-0.233719,-1.980388,1.134038,-1.143196,
+ 0.096347,0.961203,-0.258467,-2.205791,1.356023,-1.081662,
+ 0.061261,0.954316,-0.292452,-1.996117,1.387891,-1.064104,
+ 0.057779,0.975002,-0.214553,-2.013663,0.810726,-1.158827,
+ 0.079848,0.962653,-0.258695,-2.298249,0.768333,-1.203884,
+ 0.098712,0.966371,-0.23745,-2.296056,1.06281,-1.171139,
+ 0.057779,0.975002,-0.214553,-2.013663,0.810726,-1.158827,
+ 0.098712,0.966371,-0.23745,-2.296056,1.06281,-1.171139,
+ 0.076969,0.969253,-0.233719,-1.980388,1.134038,-1.143196,
+ -0.021294,0.896295,-0.442946,-2.030191,0.547622,-1.189762,
+ 0.031476,0.864418,-0.501788,-2.256285,0.547326,-1.238301,
+ 0.079848,0.962653,-0.258695,-2.298249,0.768333,-1.203884,
+ -0.021294,0.896295,-0.442946,-2.030191,0.547622,-1.189762,
+ 0.079848,0.962653,-0.258695,-2.298249,0.768333,-1.203884,
+ 0.057779,0.975002,-0.214553,-2.013663,0.810726,-1.158827,
+ -0.072244,0.618144,-0.782738,-2.021159,0.411979,-1.234679,
+ -0.004377,0.58747,-0.809234,-2.1584,0.381542,-1.272962,
+ 0.031476,0.864418,-0.501788,-2.256285,0.547326,-1.238301,
+ -0.072244,0.618144,-0.782738,-2.021159,0.411979,-1.234679,
+ 0.031476,0.864418,-0.501788,-2.256285,0.547326,-1.238301,
+ -0.021294,0.896295,-0.442946,-2.030191,0.547622,-1.189762,
+ -0.038944,0.247819,-0.968023,-1.932916,0.232972,-1.304589,
+ 0.044022,0.273891,-0.960753,-2.070413,0.207766,-1.335106,
+ -0.004377,0.58747,-0.809234,-2.1584,0.381542,-1.272962,
+ -0.038944,0.247819,-0.968023,-1.932916,0.232972,-1.304589,
+ -0.004377,0.58747,-0.809234,-2.1584,0.381542,-1.272962,
+ -0.072244,0.618144,-0.782738,-2.021159,0.411979,-1.234679,
+ -0.00315,0.115338,-0.993321,-1.897394,0.037852,-1.365798,
+ 0.136965,0.155729,-0.978258,-2.064786,0.018789,-1.411866,
+ 0.044022,0.273891,-0.960753,-2.070413,0.207766,-1.335106,
+ -0.00315,0.115338,-0.993321,-1.897394,0.037852,-1.365798,
+ 0.044022,0.273891,-0.960753,-2.070413,0.207766,-1.335106,
+ -0.038944,0.247819,-0.968023,-1.932916,0.232972,-1.304589,
+ 0.016683,0.197618,-0.980137,-1.950547,-0.275573,-1.377028,
+ 0.173447,0.205435,-0.963178,-2.187634,-0.375454,-1.406902,
+ 0.136965,0.155729,-0.978258,-2.064786,0.018789,-1.411866,
+ 0.016683,0.197618,-0.980137,-1.950547,-0.275573,-1.377028,
+ 0.136965,0.155729,-0.978258,-2.064786,0.018789,-1.411866,
+ -0.00315,0.115338,-0.993321,-1.897394,0.037852,-1.365798,
+ 0.032424,0.316591,-0.948008,-2.033655,-0.526012,-1.277639,
+ 0.136801,0.29658,-0.945159,-2.276341,-0.689823,-1.268026,
+ 0.173447,0.205435,-0.963178,-2.187634,-0.375454,-1.406902,
+ 0.032424,0.316591,-0.948008,-2.033655,-0.526012,-1.277639,
+ 0.173447,0.205435,-0.963178,-2.187634,-0.375454,-1.406902,
+ 0.016683,0.197618,-0.980137,-1.950547,-0.275573,-1.377028,
+ 0.053195,0.343167,-0.937767,-2.050292,-0.755566,-1.114167,
+ 0.095019,0.330845,-0.938889,-2.292049,-0.933921,-1.128136,
+ 0.136801,0.29658,-0.945159,-2.276341,-0.689823,-1.268026,
+ 0.053195,0.343167,-0.937767,-2.050292,-0.755566,-1.114167,
+ 0.136801,0.29658,-0.945159,-2.276341,-0.689823,-1.268026,
+ 0.032424,0.316591,-0.948008,-2.033655,-0.526012,-1.277639,
+ 0.057735,0.173734,-0.983099,-2.043593,-0.875823,-1.028879,
+ 0.53288,-0.088285,0.841573,-2.299356,-1.025449,-1.044687,
+ 0.095019,0.330845,-0.938889,-2.292049,-0.933921,-1.128136,
+ 0.057735,0.173734,-0.983099,-2.043593,-0.875823,-1.028879,
+ 0.095019,0.330845,-0.938889,-2.292049,-0.933921,-1.128136,
+ 0.053195,0.343167,-0.937767,-2.050292,-0.755566,-1.114167,
+ 0.058723,-0.195869,-0.97887,-2.033406,-0.91003,-0.96422,
+ 0.07657,0.16758,-0.982881,-2.306662,-1.116976,-0.961238,
+ 0.53288,-0.088285,0.841573,-2.299356,-1.025449,-1.044687,
+ 0.058723,-0.195869,-0.97887,-2.033406,-0.91003,-0.96422,
+ 0.53288,-0.088285,0.841573,-2.299356,-1.025449,-1.044687,
+ 0.057735,0.173734,-0.983099,-2.043593,-0.875823,-1.028879,
+ 0.088769,-0.475351,-0.875307,-2.079597,1.817785,-0.138375,
+ 0.079214,-0.175111,-0.981357,-2.672899,1.90511,-0.067168,
+ 0.03611,0.999348,0,-2.629466,1.918204,0,
+ 0.088769,-0.475351,-0.875307,-2.079597,1.817785,-0.138375,
+ 0.03611,0.999348,0,-2.629466,1.918204,0,
+ 0.181762,-0.983343,0,-2.057387,1.841308,0,
+ 0.099302,-0.563694,-0.819993,-2.10017,1.78998,-0.229245,
+ 0.204115,-0.405276,-0.891116,-2.697367,1.871291,-0.218796,
+ 0.079214,-0.175111,-0.981357,-2.672899,1.90511,-0.067168,
+ 0.099302,-0.563694,-0.819993,-2.10017,1.78998,-0.229245,
+ 0.079214,-0.175111,-0.981357,-2.672899,1.90511,-0.067168,
+ 0.088769,-0.475351,-0.875307,-2.079597,1.817785,-0.138375,
+ 0.093801,-0.705497,-0.702478,-2.137524,1.753182,-0.433142,
+ 0.396045,-0.47666,-0.784821,-2.703112,1.825435,-0.395127,
+ 0.204115,-0.405276,-0.891116,-2.697367,1.871291,-0.218796,
+ 0.093801,-0.705497,-0.702478,-2.137524,1.753182,-0.433142,
+ 0.204115,-0.405276,-0.891116,-2.697367,1.871291,-0.218796,
+ 0.099302,-0.563694,-0.819993,-2.10017,1.78998,-0.229245,
+ 0.058028,-0.329667,-0.942312,-2.172139,1.62301,-0.805318,
+ 0.238702,-0.258568,-0.936037,-2.715246,1.746763,-0.604653,
+ 0.396045,-0.47666,-0.784821,-2.703112,1.825435,-0.395127,
+ 0.058028,-0.329667,-0.942312,-2.172139,1.62301,-0.805318,
+ 0.396045,-0.47666,-0.784821,-2.703112,1.825435,-0.395127,
+ 0.093801,-0.705497,-0.702478,-2.137524,1.753182,-0.433142,
+ 0.096347,0.961203,-0.258467,-2.205791,1.356023,-1.081662,
+ 0.11717,0.938619,-0.324447,-2.71748,1.576797,-0.875971,
+ 0.238702,-0.258568,-0.936037,-2.715246,1.746763,-0.604653,
+ 0.096347,0.961203,-0.258467,-2.205791,1.356023,-1.081662,
+ 0.238702,-0.258568,-0.936037,-2.715246,1.746763,-0.604653,
+ 0.058028,-0.329667,-0.942312,-2.172139,1.62301,-0.805318,
+ 0.098712,0.966371,-0.23745,-2.296056,1.06281,-1.171139,
+ 0.080398,0.9582,-0.274571,-2.68493,1.262021,-1.11049,
+ 0.11717,0.938619,-0.324447,-2.71748,1.576797,-0.875971,
+ 0.098712,0.966371,-0.23745,-2.296056,1.06281,-1.171139,
+ 0.11717,0.938619,-0.324447,-2.71748,1.576797,-0.875971,
+ 0.096347,0.961203,-0.258467,-2.205791,1.356023,-1.081662,
+ 0.079848,0.962653,-0.258695,-2.298249,0.768333,-1.203884,
+ 0.069061,0.958871,-0.275312,-2.572286,0.835495,-1.252192,
+ 0.080398,0.9582,-0.274571,-2.68493,1.262021,-1.11049,
+ 0.079848,0.962653,-0.258695,-2.298249,0.768333,-1.203884,
+ 0.080398,0.9582,-0.274571,-2.68493,1.262021,-1.11049,
+ 0.098712,0.966371,-0.23745,-2.296056,1.06281,-1.171139,
+ 0.031476,0.864418,-0.501788,-2.256285,0.547326,-1.238301,
+ 0.051291,0.888276,-0.456438,-2.536112,0.656633,-1.269661,
+ 0.069061,0.958871,-0.275312,-2.572286,0.835495,-1.252192,
+ 0.031476,0.864418,-0.501788,-2.256285,0.547326,-1.238301,
+ 0.069061,0.958871,-0.275312,-2.572286,0.835495,-1.252192,
+ 0.079848,0.962653,-0.258695,-2.298249,0.768333,-1.203884,
+ -0.004377,0.58747,-0.809234,-2.1584,0.381542,-1.272962,
+ -0.008282,0.691944,-0.721904,-2.520947,0.559036,-1.273617,
+ 0.051291,0.888276,-0.456438,-2.536112,0.656633,-1.269661,
+ -0.004377,0.58747,-0.809234,-2.1584,0.381542,-1.272962,
+ 0.051291,0.888276,-0.456438,-2.536112,0.656633,-1.269661,
+ 0.031476,0.864418,-0.501788,-2.256285,0.547326,-1.238301,
+ 0.044022,0.273891,-0.960753,-2.070413,0.207766,-1.335106,
+ -0.0448,0.42163,-0.905661,-2.47375,0.300945,-1.316695,
+ -0.008282,0.691944,-0.721904,-2.520947,0.559036,-1.273617,
+ 0.044022,0.273891,-0.960753,-2.070413,0.207766,-1.335106,
+ -0.008282,0.691944,-0.721904,-2.520947,0.559036,-1.273617,
+ -0.004377,0.58747,-0.809234,-2.1584,0.381542,-1.272962,
+ 0.136965,0.155729,-0.978258,-2.064786,0.018789,-1.411866,
+ -0.02449,0.224062,-0.974267,-2.433366,0.078222,-1.371269,
+ -0.0448,0.42163,-0.905661,-2.47375,0.300945,-1.316695,
+ 0.136965,0.155729,-0.978258,-2.064786,0.018789,-1.411866,
+ -0.0448,0.42163,-0.905661,-2.47375,0.300945,-1.316695,
+ 0.044022,0.273891,-0.960753,-2.070413,0.207766,-1.335106,
+ 0.173447,0.205435,-0.963178,-2.187634,-0.375454,-1.406902,
+ -0.017579,0.132168,-0.991072,-2.41473,-0.108377,-1.395384,
+ -0.02449,0.224062,-0.974267,-2.433366,0.078222,-1.371269,
+ 0.173447,0.205435,-0.963178,-2.187634,-0.375454,-1.406902,
+ -0.02449,0.224062,-0.974267,-2.433366,0.078222,-1.371269,
+ 0.136965,0.155729,-0.978258,-2.064786,0.018789,-1.411866,
+ 0.136801,0.29658,-0.945159,-2.276341,-0.689823,-1.268026,
+ -0.055858,0.145868,-0.987726,-2.38292,-0.41745,-1.375045,
+ -0.017579,0.132168,-0.991072,-2.41473,-0.108377,-1.395384,
+ 0.136801,0.29658,-0.945159,-2.276341,-0.689823,-1.268026,
+ -0.017579,0.132168,-0.991072,-2.41473,-0.108377,-1.395384,
+ 0.173447,0.205435,-0.963178,-2.187634,-0.375454,-1.406902,
+ 0.095019,0.330845,-0.938889,-2.292049,-0.933921,-1.128136,
+ -0.115746,0.20405,-0.972094,-2.430508,-0.822313,-1.254486,
+ -0.055858,0.145868,-0.987726,-2.38292,-0.41745,-1.375045,
+ 0.095019,0.330845,-0.938889,-2.292049,-0.933921,-1.128136,
+ -0.055858,0.145868,-0.987726,-2.38292,-0.41745,-1.375045,
+ 0.136801,0.29658,-0.945159,-2.276341,-0.689823,-1.268026,
+ 0.53288,-0.088285,0.841573,-2.299356,-1.025449,-1.044687,
+ -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
+ -0.115746,0.20405,-0.972094,-2.430508,-0.822313,-1.254486,
+ 0.53288,-0.088285,0.841573,-2.299356,-1.025449,-1.044687,
+ -0.115746,0.20405,-0.972094,-2.430508,-0.822313,-1.254486,
+ 0.095019,0.330845,-0.938889,-2.292049,-0.933921,-1.128136,
+ 0.079214,-0.175111,-0.981357,-2.672899,1.90511,-0.067168,
+ 0.005821,-0.234321,-0.972142,-3.053102,1.96881,-0.051104,
+ 0.012502,-0.999922,0,-3.037562,2.001526,0,
+ 0.079214,-0.175111,-0.981357,-2.672899,1.90511,-0.067168,
+ 0.012502,-0.999922,0,-3.037562,2.001526,0,
+ 0.03611,0.999348,0,-2.629466,1.918204,0,
+ 0.204115,-0.405276,-0.891116,-2.697367,1.871291,-0.218796,
+ 0.243464,-0.335965,-0.909864,-3.077669,1.871112,-0.217368,
+ 0.005821,-0.234321,-0.972142,-3.053102,1.96881,-0.051104,
+ 0.204115,-0.405276,-0.891116,-2.697367,1.871291,-0.218796,
+ 0.005821,-0.234321,-0.972142,-3.053102,1.96881,-0.051104,
+ 0.079214,-0.175111,-0.981357,-2.672899,1.90511,-0.067168,
+ 0.396045,-0.47666,-0.784821,-2.703112,1.825435,-0.395127,
+ 0.49938,-0.45475,-0.737443,-3.07531,1.846,-0.363149,
+ 0.243464,-0.335965,-0.909864,-3.077669,1.871112,-0.217368,
+ 0.396045,-0.47666,-0.784821,-2.703112,1.825435,-0.395127,
+ 0.243464,-0.335965,-0.909864,-3.077669,1.871112,-0.217368,
+ 0.204115,-0.405276,-0.891116,-2.697367,1.871291,-0.218796,
+ 0.238702,-0.258568,-0.936037,-2.715246,1.746763,-0.604653,
+ 0.573426,-0.441087,-0.69038,-3.109047,1.789477,-0.565323,
+ 0.49938,-0.45475,-0.737443,-3.07531,1.846,-0.363149,
+ 0.238702,-0.258568,-0.936037,-2.715246,1.746763,-0.604653,
+ 0.49938,-0.45475,-0.737443,-3.07531,1.846,-0.363149,
+ 0.396045,-0.47666,-0.784821,-2.703112,1.825435,-0.395127,
+ 0.11717,0.938619,-0.324447,-2.71748,1.576797,-0.875971,
+ 0.1643,0.873906,-0.457487,-3.08565,1.65734,-0.784479,
+ 0.573426,-0.441087,-0.69038,-3.109047,1.789477,-0.565323,
+ 0.11717,0.938619,-0.324447,-2.71748,1.576797,-0.875971,
+ 0.573426,-0.441087,-0.69038,-3.109047,1.789477,-0.565323,
+ 0.238702,-0.258568,-0.936037,-2.715246,1.746763,-0.604653,
+ 0.080398,0.9582,-0.274571,-2.68493,1.262021,-1.11049,
+ -0.012448,0.906487,-0.422051,-3.028932,1.461517,-0.941324,
+ 0.1643,0.873906,-0.457487,-3.08565,1.65734,-0.784479,
+ 0.080398,0.9582,-0.274571,-2.68493,1.262021,-1.11049,
+ 0.1643,0.873906,-0.457487,-3.08565,1.65734,-0.784479,
+ 0.11717,0.938619,-0.324447,-2.71748,1.576797,-0.875971,
+ 0.069061,0.958871,-0.275312,-2.572286,0.835495,-1.252192,
+ -0.051905,0.965082,-0.256753,-2.930312,1.10358,-1.125876,
+ -0.012448,0.906487,-0.422051,-3.028932,1.461517,-0.941324,
+ 0.069061,0.958871,-0.275312,-2.572286,0.835495,-1.252192,
+ -0.012448,0.906487,-0.422051,-3.028932,1.461517,-0.941324,
+ 0.080398,0.9582,-0.274571,-2.68493,1.262021,-1.11049,
+ 0.051291,0.888276,-0.456438,-2.536112,0.656633,-1.269661,
+ -0.088843,0.888,-0.45118,-2.825835,0.755899,-1.209042,
+ -0.051905,0.965082,-0.256753,-2.930312,1.10358,-1.125876,
+ 0.051291,0.888276,-0.456438,-2.536112,0.656633,-1.269661,
+ -0.051905,0.965082,-0.256753,-2.930312,1.10358,-1.125876,
+ 0.069061,0.958871,-0.275312,-2.572286,0.835495,-1.252192,
+ -0.008282,0.691944,-0.721904,-2.520947,0.559036,-1.273617,
+ -0.169971,0.704712,-0.688833,-2.79063,0.46881,-1.224273,
+ -0.088843,0.888,-0.45118,-2.825835,0.755899,-1.209042,
+ -0.008282,0.691944,-0.721904,-2.520947,0.559036,-1.273617,
+ -0.088843,0.888,-0.45118,-2.825835,0.755899,-1.209042,
+ 0.051291,0.888276,-0.456438,-2.536112,0.656633,-1.269661,
+ -0.0448,0.42163,-0.905661,-2.47375,0.300945,-1.316695,
+ -0.261543,0.44691,-0.855492,-2.787011,0.264495,-1.237352,
+ -0.169971,0.704712,-0.688833,-2.79063,0.46881,-1.224273,
+ -0.0448,0.42163,-0.905661,-2.47375,0.300945,-1.316695,
+ -0.169971,0.704712,-0.688833,-2.79063,0.46881,-1.224273,
+ -0.008282,0.691944,-0.721904,-2.520947,0.559036,-1.273617,
+ -0.02449,0.224062,-0.974267,-2.433366,0.078222,-1.371269,
+ -0.33898,0.203127,-0.918603,-2.687022,0.076781,-1.290565,
+ -0.261543,0.44691,-0.855492,-2.787011,0.264495,-1.237352,
+ -0.02449,0.224062,-0.974267,-2.433366,0.078222,-1.371269,
+ -0.261543,0.44691,-0.855492,-2.787011,0.264495,-1.237352,
+ -0.0448,0.42163,-0.905661,-2.47375,0.300945,-1.316695,
+ -0.017579,0.132168,-0.991072,-2.41473,-0.108377,-1.395384,
+ -0.351241,0.075821,-0.93321,-2.649338,-0.241719,-1.339644,
+ -0.33898,0.203127,-0.918603,-2.687022,0.076781,-1.290565,
+ -0.017579,0.132168,-0.991072,-2.41473,-0.108377,-1.395384,
+ -0.33898,0.203127,-0.918603,-2.687022,0.076781,-1.290565,
+ -0.02449,0.224062,-0.974267,-2.433366,0.078222,-1.371269,
+ -0.055858,0.145868,-0.987726,-2.38292,-0.41745,-1.375045,
+ -0.311485,0.082882,-0.94663,-2.616467,-0.511373,-1.344133,
+ -0.351241,0.075821,-0.93321,-2.649338,-0.241719,-1.339644,
+ -0.055858,0.145868,-0.987726,-2.38292,-0.41745,-1.375045,
+ -0.351241,0.075821,-0.93321,-2.649338,-0.241719,-1.339644,
+ -0.017579,0.132168,-0.991072,-2.41473,-0.108377,-1.395384,
+ -0.115746,0.20405,-0.972094,-2.430508,-0.822313,-1.254486,
+ -0.285709,0.130064,-0.949449,-2.624856,-0.8882,-1.261176,
+ -0.311485,0.082882,-0.94663,-2.616467,-0.511373,-1.344133,
+ -0.115746,0.20405,-0.972094,-2.430508,-0.822313,-1.254486,
+ -0.311485,0.082882,-0.94663,-2.616467,-0.511373,-1.344133,
+ -0.055858,0.145868,-0.987726,-2.38292,-0.41745,-1.375045,
+ -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
+ -0.279485,0.127803,-0.951606,-2.725776,-1.214862,-1.190384,
+ -0.285709,0.130064,-0.949449,-2.624856,-0.8882,-1.261176,
+ -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
+ -0.285709,0.130064,-0.949449,-2.624856,-0.8882,-1.261176,
+ -0.115746,0.20405,-0.972094,-2.430508,-0.822313,-1.254486,
+ -0.15812,-0.033626,-0.986847,-2.765069,-1.561164,-1.084313,
+ -0.234266,0.044111,-0.971171,-2.862576,-1.546894,-1.117139,
+ -0.279485,0.127803,-0.951606,-2.725776,-1.214862,-1.190384,
+ -0.15812,-0.033626,-0.986847,-2.765069,-1.561164,-1.084313,
+ -0.279485,0.127803,-0.951606,-2.725776,-1.214862,-1.190384,
+ -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
+ -0.108631,-0.122719,-0.986478,-3.35851,1.810253,-0.380095,
+ -0.379807,-0.084066,-0.921238,-3.519716,1.685231,-0.31713,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ -0.108631,-0.122719,-0.986478,-3.35851,1.810253,-0.380095,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ 0.072535,0.997366,0,-3.392806,1.769365,0,
+ -0.006683,-0.232823,-0.972496,-3.395381,1.726325,-0.55477,
+ -0.373751,-0.169261,-0.911954,-3.527168,1.583508,-0.512679,
+ -0.379807,-0.084066,-0.921238,-3.519716,1.685231,-0.31713,
+ -0.006683,-0.232823,-0.972496,-3.395381,1.726325,-0.55477,
+ -0.379807,-0.084066,-0.921238,-3.519716,1.685231,-0.31713,
+ -0.108631,-0.122719,-0.986478,-3.35851,1.810253,-0.380095,
+ -0.004872,-0.216103,-0.976358,-3.338742,1.598933,-0.689636,
+ -0.426971,-0.09322,-0.899447,-3.512997,1.44805,-0.611386,
+ -0.373751,-0.169261,-0.911954,-3.527168,1.583508,-0.512679,
+ -0.004872,-0.216103,-0.976358,-3.338742,1.598933,-0.689636,
+ -0.373751,-0.169261,-0.911954,-3.527168,1.583508,-0.512679,
+ -0.006683,-0.232823,-0.972496,-3.395381,1.726325,-0.55477,
+ 0.193955,-0.251788,-0.948148,-3.27808,1.432418,-0.853958,
+ -0.457657,0.090776,-0.884483,-3.476235,1.287798,-0.704766,
+ -0.426971,-0.09322,-0.899447,-3.512997,1.44805,-0.611386,
+ 0.193955,-0.251788,-0.948148,-3.27808,1.432418,-0.853958,
+ -0.426971,-0.09322,-0.899447,-3.512997,1.44805,-0.611386,
+ -0.004872,-0.216103,-0.976358,-3.338742,1.598933,-0.689636,
+ -0.337275,0.918092,-0.208215,-3.244771,1.19554,-0.910945,
+ -0.575033,0.794917,-0.193504,-3.442151,1.105486,-0.762934,
+ -0.457657,0.090776,-0.884483,-3.476235,1.287798,-0.704766,
+ -0.337275,0.918092,-0.208215,-3.244771,1.19554,-0.910945,
+ -0.457657,0.090776,-0.884483,-3.476235,1.287798,-0.704766,
+ 0.193955,-0.251788,-0.948148,-3.27808,1.432418,-0.853958,
+ -0.47652,0.732046,-0.486866,-3.19641,0.797564,-0.985913,
+ -0.636638,0.552106,-0.538397,-3.379131,0.767915,-0.885996,
+ -0.575033,0.794917,-0.193504,-3.442151,1.105486,-0.762934,
+ -0.47652,0.732046,-0.486866,-3.19641,0.797564,-0.985913,
+ -0.575033,0.794917,-0.193504,-3.442151,1.105486,-0.762934,
+ -0.337275,0.918092,-0.208215,-3.244771,1.19554,-0.910945,
+ -0.505556,0.519614,-0.688778,-3.112555,0.457376,-1.084816,
+ -0.643784,0.341688,-0.684684,-3.306875,0.379713,-0.98762,
+ -0.636638,0.552106,-0.538397,-3.379131,0.767915,-0.885996,
+ -0.505556,0.519614,-0.688778,-3.112555,0.457376,-1.084816,
+ -0.636638,0.552106,-0.538397,-3.379131,0.767915,-0.885996,
+ -0.47652,0.732046,-0.486866,-3.19641,0.797564,-0.985913,
+ -0.539732,0.31653,-0.780063,-3.044646,0.224321,-1.164934,
+ -0.646492,0.202786,-0.735477,-3.251181,0.175063,-1.053445,
+ -0.643784,0.341688,-0.684684,-3.306875,0.379713,-0.98762,
+ -0.539732,0.31653,-0.780063,-3.044646,0.224321,-1.164934,
+ -0.643784,0.341688,-0.684684,-3.306875,0.379713,-0.98762,
+ -0.505556,0.519614,-0.688778,-3.112555,0.457376,-1.084816,
+ -0.545639,0.142044,-0.825894,-2.971546,0.032038,-1.215971,
+ -0.624566,0.121329,-0.77149,-3.160225,-0.018852,-1.113626,
+ -0.646492,0.202786,-0.735477,-3.251181,0.175063,-1.053445,
+ -0.545639,0.142044,-0.825894,-2.971546,0.032038,-1.215971,
+ -0.646492,0.202786,-0.735477,-3.251181,0.175063,-1.053445,
+ -0.539732,0.31653,-0.780063,-3.044646,0.224321,-1.164934,
+ -0.512472,0.102596,-0.852553,-2.90708,-0.345582,-1.281557,
+ -0.588581,0.130279,-0.797872,-3.101125,-0.35476,-1.162409,
+ -0.624566,0.121329,-0.77149,-3.160225,-0.018852,-1.113626,
+ -0.512472,0.102596,-0.852553,-2.90708,-0.345582,-1.281557,
+ -0.624566,0.121329,-0.77149,-3.160225,-0.018852,-1.113626,
+ -0.545639,0.142044,-0.825894,-2.971546,0.032038,-1.215971,
+ -0.449233,0.123555,-0.88483,-2.901159,-0.619504,-1.284058,
+ -0.553145,0.12021,-0.824367,-3.096267,-0.6681,-1.140081,
+ -0.588581,0.130279,-0.797872,-3.101125,-0.35476,-1.162409,
+ -0.449233,0.123555,-0.88483,-2.901159,-0.619504,-1.284058,
+ -0.588581,0.130279,-0.797872,-3.101125,-0.35476,-1.162409,
+ -0.512472,0.102596,-0.852553,-2.90708,-0.345582,-1.281557,
+ -0.404056,0.117264,-0.907187,-2.937658,-1.002749,-1.219413,
+ -0.547788,0.055501,-0.834774,-3.122061,-0.998702,-1.065015,
+ -0.553145,0.12021,-0.824367,-3.096267,-0.6681,-1.140081,
+ -0.404056,0.117264,-0.907187,-2.937658,-1.002749,-1.219413,
+ -0.553145,0.12021,-0.824367,-3.096267,-0.6681,-1.140081,
+ -0.449233,0.123555,-0.88483,-2.901159,-0.619504,-1.284058,
+ -0.387051,0.087837,-0.917865,-2.982676,-1.264649,-1.133596,
+ -0.563128,0.005618,-0.826351,-3.15021,-1.259588,-1.001021,
+ -0.547788,0.055501,-0.834774,-3.122061,-0.998702,-1.065015,
+ -0.387051,0.087837,-0.917865,-2.982676,-1.264649,-1.133596,
+ -0.547788,0.055501,-0.834774,-3.122061,-0.998702,-1.065015,
+ -0.404056,0.117264,-0.907187,-2.937658,-1.002749,-1.219413,
+ -0.390861,0.032481,-0.919876,-3.063133,-1.440555,-1.090926,
+ -0.596319,-0.021767,-0.802452,-3.188954,-1.408279,-0.963611,
+ -0.563128,0.005618,-0.826351,-3.15021,-1.259588,-1.001021,
+ -0.390861,0.032481,-0.919876,-3.063133,-1.440555,-1.090926,
+ -0.563128,0.005618,-0.826351,-3.15021,-1.259588,-1.001021,
+ -0.387051,0.087837,-0.917865,-2.982676,-1.264649,-1.133596,
+ -0.379807,-0.084066,-0.921238,-3.519716,1.685231,-0.31713,
+ -0.6343,-0.110875,-0.765095,-3.734989,1.589433,-0.295202,
+ -0.626255,-0.080061,-0.775497,-3.690685,1.60208,0,
+ -0.379807,-0.084066,-0.921238,-3.519716,1.685231,-0.31713,
+ -0.626255,-0.080061,-0.775497,-3.690685,1.60208,0,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ -0.373751,-0.169261,-0.911954,-3.527168,1.583508,-0.512679,
+ -0.619245,-0.050391,-0.783579,-3.697974,1.466697,-0.433432,
+ -0.6343,-0.110875,-0.765095,-3.734989,1.589433,-0.295202,
+ -0.373751,-0.169261,-0.911954,-3.527168,1.583508,-0.512679,
+ -0.6343,-0.110875,-0.765095,-3.734989,1.589433,-0.295202,
+ -0.379807,-0.084066,-0.921238,-3.519716,1.685231,-0.31713,
+ -0.426971,-0.09322,-0.899447,-3.512997,1.44805,-0.611386,
+ -0.549206,0.149158,-0.822268,-3.684619,1.35069,-0.501428,
+ -0.619245,-0.050391,-0.783579,-3.697974,1.466697,-0.433432,
+ -0.426971,-0.09322,-0.899447,-3.512997,1.44805,-0.611386,
+ -0.619245,-0.050391,-0.783579,-3.697974,1.466697,-0.433432,
+ -0.373751,-0.169261,-0.911954,-3.527168,1.583508,-0.512679,
+ -0.457657,0.090776,-0.884483,-3.476235,1.287798,-0.704766,
+ -0.846545,0.532317,0,-3.655148,1.190938,-0.573692,
+ -0.549206,0.149158,-0.822268,-3.684619,1.35069,-0.501428,
+ -0.457657,0.090776,-0.884483,-3.476235,1.287798,-0.704766,
+ -0.549206,0.149158,-0.822268,-3.684619,1.35069,-0.501428,
+ -0.426971,-0.09322,-0.899447,-3.512997,1.44805,-0.611386,
+ -0.575033,0.794917,-0.193504,-3.442151,1.105486,-0.762934,
+ -0.881408,0.44424,-0.16053,-3.639878,1.015186,-0.615203,
+ -0.846545,0.532317,0,-3.655148,1.190938,-0.573692,
+ -0.575033,0.794917,-0.193504,-3.442151,1.105486,-0.762934,
+ -0.846545,0.532317,0,-3.655148,1.190938,-0.573692,
+ -0.457657,0.090776,-0.884483,-3.476235,1.287798,-0.704766,
+ -0.636638,0.552106,-0.538397,-3.379131,0.767915,-0.885996,
+ -0.881352,0.261345,-0.393596,-3.582867,0.734419,-0.697787,
+ -0.881408,0.44424,-0.16053,-3.639878,1.015186,-0.615203,
+ -0.636638,0.552106,-0.538397,-3.379131,0.767915,-0.885996,
+ -0.881408,0.44424,-0.16053,-3.639878,1.015186,-0.615203,
+ -0.575033,0.794917,-0.193504,-3.442151,1.105486,-0.762934,
+ -0.643784,0.341688,-0.684684,-3.306875,0.379713,-0.98762,
+ -0.880731,0.130089,-0.4554,-3.504525,0.405574,-0.847066,
+ -0.881352,0.261345,-0.393596,-3.582867,0.734419,-0.697787,
+ -0.643784,0.341688,-0.684684,-3.306875,0.379713,-0.98762,
+ -0.881352,0.261345,-0.393596,-3.582867,0.734419,-0.697787,
+ -0.636638,0.552106,-0.538397,-3.379131,0.767915,-0.885996,
+ -0.646492,0.202786,-0.735477,-3.251181,0.175063,-1.053445,
+ -0.874101,0.053175,-0.482825,-3.424258,0.158638,-0.918279,
+ -0.880731,0.130089,-0.4554,-3.504525,0.405574,-0.847066,
+ -0.646492,0.202786,-0.735477,-3.251181,0.175063,-1.053445,
+ -0.880731,0.130089,-0.4554,-3.504525,0.405574,-0.847066,
+ -0.643784,0.341688,-0.684684,-3.306875,0.379713,-0.98762,
+ -0.624566,0.121329,-0.77149,-3.160225,-0.018852,-1.113626,
+ -0.875552,0.01506,-0.482889,-3.365413,-0.113447,-0.9524,
+ -0.874101,0.053175,-0.482825,-3.424258,0.158638,-0.918279,
+ -0.624566,0.121329,-0.77149,-3.160225,-0.018852,-1.113626,
+ -0.874101,0.053175,-0.482825,-3.424258,0.158638,-0.918279,
+ -0.646492,0.202786,-0.735477,-3.251181,0.175063,-1.053445,
+ -0.588581,0.130279,-0.797872,-3.101125,-0.35476,-1.162409,
+ -0.86587,-0.001845,-0.500266,-3.290393,-0.424259,-0.984153,
+ -0.875552,0.01506,-0.482889,-3.365413,-0.113447,-0.9524,
+ -0.588581,0.130279,-0.797872,-3.101125,-0.35476,-1.162409,
+ -0.875552,0.01506,-0.482889,-3.365413,-0.113447,-0.9524,
+ -0.624566,0.121329,-0.77149,-3.160225,-0.018852,-1.113626,
+ -0.553145,0.12021,-0.824367,-3.096267,-0.6681,-1.140081,
+ -0.84112,-0.026303,-0.540209,-3.233333,-0.683782,-1.015512,
+ -0.86587,-0.001845,-0.500266,-3.290393,-0.424259,-0.984153,
+ -0.553145,0.12021,-0.824367,-3.096267,-0.6681,-1.140081,
+ -0.86587,-0.001845,-0.500266,-3.290393,-0.424259,-0.984153,
+ -0.588581,0.130279,-0.797872,-3.101125,-0.35476,-1.162409,
+ -0.547788,0.055501,-0.834774,-3.122061,-0.998702,-1.065015,
+ -0.813168,-0.06637,-0.578232,-3.238094,-0.979377,-0.961631,
+ -0.84112,-0.026303,-0.540209,-3.233333,-0.683782,-1.015512,
+ -0.547788,0.055501,-0.834774,-3.122061,-0.998702,-1.065015,
+ -0.84112,-0.026303,-0.540209,-3.233333,-0.683782,-1.015512,
+ -0.553145,0.12021,-0.824367,-3.096267,-0.6681,-1.140081,
+ -0.563128,0.005618,-0.826351,-3.15021,-1.259588,-1.001021,
+ -0.799953,-0.096213,-0.592299,-3.27751,-1.177346,-0.9153,
+ -0.813168,-0.06637,-0.578232,-3.238094,-0.979377,-0.961631,
+ -0.563128,0.005618,-0.826351,-3.15021,-1.259588,-1.001021,
+ -0.813168,-0.06637,-0.578232,-3.238094,-0.979377,-0.961631,
+ -0.547788,0.055501,-0.834774,-3.122061,-0.998702,-1.065015,
+ -0.596319,-0.021767,-0.802452,-3.188954,-1.408279,-0.963611,
+ -0.811102,-0.12903,-0.570495,-3.319817,-1.365015,-0.886015,
+ -0.799953,-0.096213,-0.592299,-3.27751,-1.177346,-0.9153,
+ -0.596319,-0.021767,-0.802452,-3.188954,-1.408279,-0.963611,
+ -0.799953,-0.096213,-0.592299,-3.27751,-1.177346,-0.9153,
+ -0.563128,0.005618,-0.826351,-3.15021,-1.259588,-1.001021,
+ -0.6343,-0.110875,-0.765095,-3.734989,1.589433,-0.295202,
+ -0.880002,-0.033987,-0.473752,-3.709741,1.351194,-0.211745,
+ -0.848349,-0.120539,-0.515533,-3.709827,1.417763,0,
+ -0.6343,-0.110875,-0.765095,-3.734989,1.589433,-0.295202,
+ -0.848349,-0.120539,-0.515533,-3.709827,1.417763,0,
+ -0.626255,-0.080061,-0.775497,-3.690685,1.60208,0,
+ -0.619245,-0.050391,-0.783579,-3.697974,1.466697,-0.433432,
+ -0.870331,0.069096,-0.487595,-3.701634,1.27265,-0.270469,
+ -0.880002,-0.033987,-0.473752,-3.709741,1.351194,-0.211745,
+ -0.619245,-0.050391,-0.783579,-3.697974,1.466697,-0.433432,
+ -0.880002,-0.033987,-0.473752,-3.709741,1.351194,-0.211745,
+ -0.6343,-0.110875,-0.765095,-3.734989,1.589433,-0.295202,
+ -0.549206,0.149158,-0.822268,-3.684619,1.35069,-0.501428,
+ -0.822733,0.223687,-0.522565,-3.695872,1.156978,-0.316829,
+ -0.870331,0.069096,-0.487595,-3.701634,1.27265,-0.270469,
+ -0.549206,0.149158,-0.822268,-3.684619,1.35069,-0.501428,
+ -0.870331,0.069096,-0.487595,-3.701634,1.27265,-0.270469,
+ -0.619245,-0.050391,-0.783579,-3.697974,1.466697,-0.433432,
+ -0.846545,0.532317,0,-3.655148,1.190938,-0.573692,
+ -0.938447,-0.345423,0,-3.672431,1.044224,-0.364991,
+ -0.822733,0.223687,-0.522565,-3.695872,1.156978,-0.316829,
+ -0.846545,0.532317,0,-3.655148,1.190938,-0.573692,
+ -0.822733,0.223687,-0.522565,-3.695872,1.156978,-0.316829,
+ -0.549206,0.149158,-0.822268,-3.684619,1.35069,-0.501428,
+ -0.881408,0.44424,-0.16053,-3.639878,1.015186,-0.615203,
+ -0.946902,-0.290276,0.138264,-3.664355,0.932851,-0.370749,
+ -0.938447,-0.345423,0,-3.672431,1.044224,-0.364991,
+ -0.881408,0.44424,-0.16053,-3.639878,1.015186,-0.615203,
+ -0.938447,-0.345423,0,-3.672431,1.044224,-0.364991,
+ -0.846545,0.532317,0,-3.655148,1.190938,-0.573692,
+ -0.881352,0.261345,-0.393596,-3.582867,0.734419,-0.697787,
+ -0.982633,-0.143429,0.11773,-3.631292,0.701013,-0.420276,
+ -0.946902,-0.290276,0.138264,-3.664355,0.932851,-0.370749,
+ -0.881352,0.261345,-0.393596,-3.582867,0.734419,-0.697787,
+ -0.946902,-0.290276,0.138264,-3.664355,0.932851,-0.370749,
+ -0.881408,0.44424,-0.16053,-3.639878,1.015186,-0.615203,
+ -0.880731,0.130089,-0.4554,-3.504525,0.405574,-0.847066,
+ -0.995584,-0.070631,0.061842,-3.570384,0.385564,-0.52448,
+ -0.982633,-0.143429,0.11773,-3.631292,0.701013,-0.420276,
+ -0.880731,0.130089,-0.4554,-3.504525,0.405574,-0.847066,
+ -0.982633,-0.143429,0.11773,-3.631292,0.701013,-0.420276,
+ -0.881352,0.261345,-0.393596,-3.582867,0.734419,-0.697787,
+ -0.874101,0.053175,-0.482825,-3.424258,0.158638,-0.918279,
+ -0.997475,-0.070819,0.005318,-3.520188,0.140164,-0.618561,
+ -0.995584,-0.070631,0.061842,-3.570384,0.385564,-0.52448,
+ -0.874101,0.053175,-0.482825,-3.424258,0.158638,-0.918279,
+ -0.995584,-0.070631,0.061842,-3.570384,0.385564,-0.52448,
+ -0.880731,0.130089,-0.4554,-3.504525,0.405574,-0.847066,
+ -0.875552,0.01506,-0.482889,-3.365413,-0.113447,-0.9524,
+ -0.980175,-0.184883,0.071243,-3.458251,-0.12595,-0.731712,
+ -0.997475,-0.070819,0.005318,-3.520188,0.140164,-0.618561,
+ -0.875552,0.01506,-0.482889,-3.365413,-0.113447,-0.9524,
+ -0.997475,-0.070819,0.005318,-3.520188,0.140164,-0.618561,
+ -0.874101,0.053175,-0.482825,-3.424258,0.158638,-0.918279,
+ -0.86587,-0.001845,-0.500266,-3.290393,-0.424259,-0.984153,
+ -0.976177,-0.17359,0.130171,-3.406618,-0.343461,-0.746456,
+ -0.980175,-0.184883,0.071243,-3.458251,-0.12595,-0.731712,
+ -0.86587,-0.001845,-0.500266,-3.290393,-0.424259,-0.984153,
+ -0.980175,-0.184883,0.071243,-3.458251,-0.12595,-0.731712,
+ -0.875552,0.01506,-0.482889,-3.365413,-0.113447,-0.9524,
+ -0.84112,-0.026303,-0.540209,-3.233333,-0.683782,-1.015512,
+ -0.984416,-0.175855,-0.000915,-3.283698,-0.730967,-0.793898,
+ -0.976177,-0.17359,0.130171,-3.406618,-0.343461,-0.746456,
+ -0.84112,-0.026303,-0.540209,-3.233333,-0.683782,-1.015512,
+ -0.976177,-0.17359,0.130171,-3.406618,-0.343461,-0.746456,
+ -0.86587,-0.001845,-0.500266,-3.290393,-0.424259,-0.984153,
+ -0.285709,0.130064,-0.949449,-2.624856,-0.8882,-1.261176,
+ -0.279485,0.127803,-0.951606,-2.725776,-1.214862,-1.190384,
+ -0.387051,0.087837,-0.917865,-2.982676,-1.264649,-1.133596,
+ -0.285709,0.130064,-0.949449,-2.624856,-0.8882,-1.261176,
+ -0.387051,0.087837,-0.917865,-2.982676,-1.264649,-1.133596,
+ -0.404056,0.117264,-0.907187,-2.937658,-1.002749,-1.219413,
+ -0.311485,0.082882,-0.94663,-2.616467,-0.511373,-1.344133,
+ -0.285709,0.130064,-0.949449,-2.624856,-0.8882,-1.261176,
+ -0.404056,0.117264,-0.907187,-2.937658,-1.002749,-1.219413,
+ -0.311485,0.082882,-0.94663,-2.616467,-0.511373,-1.344133,
+ -0.404056,0.117264,-0.907187,-2.937658,-1.002749,-1.219413,
+ -0.449233,0.123555,-0.88483,-2.901159,-0.619504,-1.284058,
+ -0.351241,0.075821,-0.93321,-2.649338,-0.241719,-1.339644,
+ -0.311485,0.082882,-0.94663,-2.616467,-0.511373,-1.344133,
+ -0.449233,0.123555,-0.88483,-2.901159,-0.619504,-1.284058,
+ -0.351241,0.075821,-0.93321,-2.649338,-0.241719,-1.339644,
+ -0.449233,0.123555,-0.88483,-2.901159,-0.619504,-1.284058,
+ -0.512472,0.102596,-0.852553,-2.90708,-0.345582,-1.281557,
+ -0.33898,0.203127,-0.918603,-2.687022,0.076781,-1.290565,
+ -0.351241,0.075821,-0.93321,-2.649338,-0.241719,-1.339644,
+ -0.512472,0.102596,-0.852553,-2.90708,-0.345582,-1.281557,
+ -0.33898,0.203127,-0.918603,-2.687022,0.076781,-1.290565,
+ -0.512472,0.102596,-0.852553,-2.90708,-0.345582,-1.281557,
+ -0.545639,0.142044,-0.825894,-2.971546,0.032038,-1.215971,
+ -0.261543,0.44691,-0.855492,-2.787011,0.264495,-1.237352,
+ -0.33898,0.203127,-0.918603,-2.687022,0.076781,-1.290565,
+ -0.545639,0.142044,-0.825894,-2.971546,0.032038,-1.215971,
+ -0.261543,0.44691,-0.855492,-2.787011,0.264495,-1.237352,
+ -0.545639,0.142044,-0.825894,-2.971546,0.032038,-1.215971,
+ -0.539732,0.31653,-0.780063,-3.044646,0.224321,-1.164934,
+ -0.169971,0.704712,-0.688833,-2.79063,0.46881,-1.224273,
+ -0.261543,0.44691,-0.855492,-2.787011,0.264495,-1.237352,
+ -0.539732,0.31653,-0.780063,-3.044646,0.224321,-1.164934,
+ -0.169971,0.704712,-0.688833,-2.79063,0.46881,-1.224273,
+ -0.539732,0.31653,-0.780063,-3.044646,0.224321,-1.164934,
+ -0.505556,0.519614,-0.688778,-3.112555,0.457376,-1.084816,
+ -0.088843,0.888,-0.45118,-2.825835,0.755899,-1.209042,
+ -0.169971,0.704712,-0.688833,-2.79063,0.46881,-1.224273,
+ -0.505556,0.519614,-0.688778,-3.112555,0.457376,-1.084816,
+ -0.088843,0.888,-0.45118,-2.825835,0.755899,-1.209042,
+ -0.505556,0.519614,-0.688778,-3.112555,0.457376,-1.084816,
+ -0.47652,0.732046,-0.486866,-3.19641,0.797564,-0.985913,
+ -0.051905,0.965082,-0.256753,-2.930312,1.10358,-1.125876,
+ -0.088843,0.888,-0.45118,-2.825835,0.755899,-1.209042,
+ -0.47652,0.732046,-0.486866,-3.19641,0.797564,-0.985913,
+ -0.051905,0.965082,-0.256753,-2.930312,1.10358,-1.125876,
+ -0.47652,0.732046,-0.486866,-3.19641,0.797564,-0.985913,
+ -0.337275,0.918092,-0.208215,-3.244771,1.19554,-0.910945,
+ -0.012448,0.906487,-0.422051,-3.028932,1.461517,-0.941324,
+ -0.051905,0.965082,-0.256753,-2.930312,1.10358,-1.125876,
+ -0.337275,0.918092,-0.208215,-3.244771,1.19554,-0.910945,
+ -0.012448,0.906487,-0.422051,-3.028932,1.461517,-0.941324,
+ -0.337275,0.918092,-0.208215,-3.244771,1.19554,-0.910945,
+ 0.193955,-0.251788,-0.948148,-3.27808,1.432418,-0.853958,
+ 0.1643,0.873906,-0.457487,-3.08565,1.65734,-0.784479,
+ -0.012448,0.906487,-0.422051,-3.028932,1.461517,-0.941324,
+ 0.193955,-0.251788,-0.948148,-3.27808,1.432418,-0.853958,
+ 0.1643,0.873906,-0.457487,-3.08565,1.65734,-0.784479,
+ 0.193955,-0.251788,-0.948148,-3.27808,1.432418,-0.853958,
+ -0.004872,-0.216103,-0.976358,-3.338742,1.598933,-0.689636,
+ 0.573426,-0.441087,-0.69038,-3.109047,1.789477,-0.565323,
+ 0.1643,0.873906,-0.457487,-3.08565,1.65734,-0.784479,
+ -0.004872,-0.216103,-0.976358,-3.338742,1.598933,-0.689636,
+ 0.573426,-0.441087,-0.69038,-3.109047,1.789477,-0.565323,
+ -0.004872,-0.216103,-0.976358,-3.338742,1.598933,-0.689636,
+ -0.006683,-0.232823,-0.972496,-3.395381,1.726325,-0.55477,
+ 0.49938,-0.45475,-0.737443,-3.07531,1.846,-0.363149,
+ 0.573426,-0.441087,-0.69038,-3.109047,1.789477,-0.565323,
+ -0.006683,-0.232823,-0.972496,-3.395381,1.726325,-0.55477,
+ 0.49938,-0.45475,-0.737443,-3.07531,1.846,-0.363149,
+ -0.006683,-0.232823,-0.972496,-3.395381,1.726325,-0.55477,
+ -0.108631,-0.122719,-0.986478,-3.35851,1.810253,-0.380095,
+ -0.15812,-0.033626,-0.986847,-2.765069,-1.561164,-1.084313,
+ -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
+ 0.79444,0.150524,0.588394,-2.687162,-1.539807,-0.988048,
+ -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
+ 0.53288,-0.088285,0.841573,-2.299356,-1.025449,-1.044687,
+ 0.07657,0.16758,-0.982881,-2.306662,-1.116976,-0.961238,
+ -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
+ 0.07657,0.16758,-0.982881,-2.306662,-1.116976,-0.961238,
+ -0.955382,-0.23808,-0.174826,-2.462835,-1.3055,-0.966395,
+ -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
+ -0.955382,-0.23808,-0.174826,-2.462835,-1.3055,-0.966395,
+ 0.137764,-0.289893,-0.947092,-2.591357,-1.510845,-0.88547,
+ -0.164191,0.153328,-0.974439,-2.566746,-1.211312,-1.167101,
+ 0.137764,-0.289893,-0.947092,-2.591357,-1.510845,-0.88547,
+ 0.79444,0.150524,0.588394,-2.687162,-1.539807,-0.988048,
+ -0.363523,-0.150625,0.919327,1.921881,-2.157616,-0.692678,
+ -0.914496,-0.253608,0.315247,1.945206,-2.015769,-0.672724,
+ -0.53197,-0.108751,0.839751,1.747671,-2.067518,-0.638841,
+ -0.363523,-0.150625,0.919327,1.921881,-2.157616,-0.692678,
+ -0.53197,-0.108751,0.839751,1.747671,-2.067518,-0.638841,
+ -0.570406,-0.192005,0.798606,1.772999,-2.230292,-0.64494,
+ 0.546571,-0.125171,0.828005,2.069379,1.727818,-0.212746,
+ -0.385788,0.922588,0,2.042206,1.777154,0,
+ 0.756976,-0.653442,0,2.128139,1.788397,0,
+ 0.546571,-0.125171,0.828005,2.069379,1.727818,-0.212746,
+ 0.756976,-0.653442,0,2.128139,1.788397,0,
+ 0.547549,-0.279581,-0.788686,2.13239,1.755821,-0.180271,
+ 0.726897,-0.546446,-0.415953,-2.955052,-1.49684,-1.128812,
+ -0.279485,0.127803,-0.951606,-2.725776,-1.214862,-1.190384,
+ -0.234266,0.044111,-0.971171,-2.862576,-1.546894,-1.117139,
+ 0.776291,-0.374868,-0.5068,-3.23261,-1.834299,-1.087832,
+ 0.356923,-0.210291,-0.910156,-3.357996,-1.811803,-0.975625,
+ -0.596319,-0.021767,-0.802452,-3.188954,-1.408279,-0.963611,
+ 0.776291,-0.374868,-0.5068,-3.23261,-1.834299,-1.087832,
+ -0.596319,-0.021767,-0.802452,-3.188954,-1.408279,-0.963611,
+ -0.390861,0.032481,-0.919876,-3.063133,-1.440555,-1.090926,
+ 0.726897,-0.546446,-0.415953,-2.955052,-1.49684,-1.128812,
+ -0.390861,0.032481,-0.919876,-3.063133,-1.440555,-1.090926,
+ -0.387051,0.087837,-0.917865,-2.982676,-1.264649,-1.133596,
+ 0.726897,-0.546446,-0.415953,-2.955052,-1.49684,-1.128812,
+ -0.387051,0.087837,-0.917865,-2.982676,-1.264649,-1.133596,
+ -0.279485,0.127803,-0.951606,-2.725776,-1.214862,-1.190384,
+ -0.032036,-0.072305,-0.996868,-3.342096,-1.533989,-0.921628,
+ -0.086361,-0.084973,-0.992634,-3.36599,-1.48517,-0.888076,
+ -0.811102,-0.12903,-0.570495,-3.319817,-1.365015,-0.886015,
+ -0.032036,-0.072305,-0.996868,-3.342096,-1.533989,-0.921628,
+ -0.811102,-0.12903,-0.570495,-3.319817,-1.365015,-0.886015,
+ -0.596319,-0.021767,-0.802452,-3.188954,-1.408279,-0.963611,
+ 0.356923,-0.210291,-0.910156,-3.357996,-1.811803,-0.975625,
+ -0.032036,-0.072305,-0.996868,-3.342096,-1.533989,-0.921628,
+ -0.596319,-0.021767,-0.802452,-3.188954,-1.408279,-0.963611,
+ -0.807765,-0.096776,-0.581507,-2.892438,-1.95081,-0.87812,
+ 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
+ 0.43907,-0.579988,-0.686171,-2.811581,-1.79821,-0.712737,
+ -0.807765,-0.096776,-0.581507,-2.892438,-1.95081,-0.87812,
+ 0.43907,-0.579988,-0.686171,-2.811581,-1.79821,-0.712737,
+ 0.982106,-0.010346,-0.188044,-2.964215,-1.978727,-0.776572,
+ -0.807765,-0.096776,-0.581507,-2.892438,-1.95081,-0.87812,
+ 0.26198,0.048424,0.963858,-2.837147,-1.791733,-0.921563,
+ 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
+ 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
+ 0.773659,-0.235087,0.588375,-3.144012,-2.333635,-0.829994,
+ -0.065687,-0.249194,0.966223,-3.132772,-2.528669,-0.848639,
+ 0.866897,-0.268351,-0.420091,-3.030605,-2.311222,-0.88433,
+ -0.065687,-0.249194,0.966223,-3.132772,-2.528669,-0.848639,
+ 0.886562,-0.46255,-0.007485,-3.04661,-2.510881,-0.900772,
+ 0.517272,-0.552302,-0.653753,-3.302419,-3.017921,-1.128514,
+ -0.020456,0.943466,-0.330837,-3.32033,-2.827513,-1.063914,
+ 0.030762,-0.124297,0.991768,-3.26181,-2.821069,-1.088218,
+ 0.517272,-0.552302,-0.653753,-3.302419,-3.017921,-1.128514,
+ 0.030762,-0.124297,0.991768,-3.26181,-2.821069,-1.088218,
+ 0.753698,-0.027204,0.656657,-3.223286,-3.00178,-1.126176,
+ -0.661663,-0.02548,-0.749368,-3.107105,-2.947818,-1.092235,
+ -0.753891,0.130682,-0.643872,-3.141072,-2.785287,-1.032318,
+ -0.156071,0.243426,-0.95728,-3.053267,-2.764905,-1.043008,
+ -0.661663,-0.02548,-0.749368,-3.107105,-2.947818,-1.092235,
+ -0.156071,0.243426,-0.95728,-3.053267,-2.764905,-1.043008,
+ -0.080858,0.024731,-0.996419,-2.986345,-2.93377,-1.087679,
+ -0.080858,0.024731,-0.996419,-2.986345,-2.93377,-1.087679,
+ -0.156071,0.243426,-0.95728,-3.053267,-2.764905,-1.043008,
+ 0.484364,0.195734,-0.85269,-3.016419,-2.765091,-0.966671,
+ -0.080858,0.024731,-0.996419,-2.986345,-2.93377,-1.087679,
+ 0.484364,0.195734,-0.85269,-3.016419,-2.765091,-0.966671,
+ 0.507452,0.36284,-0.781563,-2.946527,-2.939327,-0.986343,
+ 0.517272,-0.552302,-0.653753,-3.302419,-3.017921,-1.128514,
+ 0.753698,-0.027204,0.656657,-3.223286,-3.00178,-1.126176,
+ 0.121953,0.140869,-0.982488,-3.301857,-3.074776,-1.114869,
+ 0.121953,0.140869,-0.982488,-3.301857,-3.074776,-1.114869,
+ 0.913315,0.39776,0.087427,-3.227676,-3.14166,-1.103969,
+ 0.170703,0.25395,-0.952035,-3.316551,-3.168932,-1.121229,
+ 0.170703,0.25395,-0.952035,-3.316551,-3.168932,-1.121229,
+ 0.913315,0.39776,0.087427,-3.227676,-3.14166,-1.103969,
+ 0.977763,0.208696,-0.020643,-3.217306,-3.187686,-1.075214,
+ -0.080858,0.024731,-0.996419,-2.986345,-2.93377,-1.087679,
+ 0.507452,0.36284,-0.781563,-2.946527,-2.939327,-0.986343,
+ 0.737412,0.542596,-0.402261,-2.884711,-3.063896,-0.993766,
+ -0.080858,0.024731,-0.996419,-2.986345,-2.93377,-1.087679,
+ 0.737412,0.542596,-0.402261,-2.884711,-3.063896,-0.993766,
+ 0.637284,0.689194,-0.344791,-2.90901,-3.084482,-1.089147,
+ -0.661663,-0.02548,-0.749368,-3.107105,-2.947818,-1.092235,
+ -0.833016,0.038682,-0.551896,-3.177108,-2.979305,-1.139084,
+ -0.637764,0.107242,-0.76273,-3.196508,-2.788166,-1.045431,
+ -0.661663,-0.02548,-0.749368,-3.107105,-2.947818,-1.092235,
+ -0.637764,0.107242,-0.76273,-3.196508,-2.788166,-1.045431,
+ -0.753891,0.130682,-0.643872,-3.141072,-2.785287,-1.032318,
+ 0.753698,-0.027204,0.656657,-3.223286,-3.00178,-1.126176,
+ 0.030762,-0.124297,0.991768,-3.26181,-2.821069,-1.088218,
+ -0.637764,0.107242,-0.76273,-3.196508,-2.788166,-1.045431,
+ 0.753698,-0.027204,0.656657,-3.223286,-3.00178,-1.126176,
+ -0.637764,0.107242,-0.76273,-3.196508,-2.788166,-1.045431,
+ -0.833016,0.038682,-0.551896,-3.177108,-2.979305,-1.139084,
+ 0.197648,0.486888,-0.850809,-3.333954,-3.058673,-0.974748,
+ 0.121953,0.140869,-0.982488,-3.301857,-3.074776,-1.114869,
+ 0.170703,0.25395,-0.952035,-3.316551,-3.168932,-1.121229,
+ 0.197648,0.486888,-0.850809,-3.333954,-3.058673,-0.974748,
+ 0.170703,0.25395,-0.952035,-3.316551,-3.168932,-1.121229,
+ -0.67011,-0.018974,-0.742019,-3.330406,-3.18519,-0.950058,
+ -0.67011,-0.018974,-0.742019,-3.330406,-3.18519,-0.950058,
+ 0.170703,0.25395,-0.952035,-3.316551,-3.168932,-1.121229,
+ 0.977763,0.208696,-0.020643,-3.217306,-3.187686,-1.075214,
+ -0.67011,-0.018974,-0.742019,-3.330406,-3.18519,-0.950058,
+ 0.977763,0.208696,-0.020643,-3.217306,-3.187686,-1.075214,
+ 0.163153,0.19945,-0.96623,-3.223246,-3.225388,-0.976573,
+ -0.178214,-0.110838,0.977729,-3.294389,-3.166225,-0.842823,
+ -0.67011,-0.018974,-0.742019,-3.330406,-3.18519,-0.950058,
+ 0.163153,0.19945,-0.96623,-3.223246,-3.225388,-0.976573,
+ -0.178214,-0.110838,0.977729,-3.294389,-3.166225,-0.842823,
+ 0.163153,0.19945,-0.96623,-3.223246,-3.225388,-0.976573,
+ -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
+ 0.197648,0.486888,-0.850809,-3.333954,-3.058673,-0.974748,
+ -0.67011,-0.018974,-0.742019,-3.330406,-3.18519,-0.950058,
+ -0.178214,-0.110838,0.977729,-3.294389,-3.166225,-0.842823,
+ 0.197648,0.486888,-0.850809,-3.333954,-3.058673,-0.974748,
+ -0.178214,-0.110838,0.977729,-3.294389,-3.166225,-0.842823,
+ -0.674431,0.094186,0.732306,-3.256731,-3.032131,-0.849693,
+ -0.674431,0.094186,0.732306,-3.256731,-3.032131,-0.849693,
+ -0.556404,-0.045521,0.829664,-3.300372,-2.795728,-0.878984,
+ -0.978077,-0.070308,0.196017,-3.339637,-2.846837,-0.966368,
+ -0.674431,0.094186,0.732306,-3.256731,-3.032131,-0.849693,
+ -0.978077,-0.070308,0.196017,-3.339637,-2.846837,-0.966368,
+ 0.197648,0.486888,-0.850809,-3.333954,-3.058673,-0.974748,
+ -0.080858,0.024731,-0.996419,-2.986345,-2.93377,-1.087679,
+ 0.637284,0.689194,-0.344791,-2.90901,-3.084482,-1.089147,
+ 0.503689,0.453945,-0.735004,-3.03125,-3.09594,-1.106355,
+ -0.080858,0.024731,-0.996419,-2.986345,-2.93377,-1.087679,
+ 0.503689,0.453945,-0.735004,-3.03125,-3.09594,-1.106355,
+ -0.661663,-0.02548,-0.749368,-3.107105,-2.947818,-1.092235,
+ 0.503689,0.453945,-0.735004,-3.03125,-3.09594,-1.106355,
+ -0.039603,0.339955,-0.939607,-3.121673,-3.120319,-1.136456,
+ -0.833016,0.038682,-0.551896,-3.177108,-2.979305,-1.139084,
+ 0.503689,0.453945,-0.735004,-3.03125,-3.09594,-1.106355,
+ -0.833016,0.038682,-0.551896,-3.177108,-2.979305,-1.139084,
+ -0.661663,-0.02548,-0.749368,-3.107105,-2.947818,-1.092235,
+ -0.833016,0.038682,-0.551896,-3.177108,-2.979305,-1.139084,
+ -0.039603,0.339955,-0.939607,-3.121673,-3.120319,-1.136456,
+ -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
+ -0.833016,0.038682,-0.551896,-3.177108,-2.979305,-1.139084,
+ -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
+ 0.753698,-0.027204,0.656657,-3.223286,-3.00178,-1.126176,
+ 0.913315,0.39776,0.087427,-3.227676,-3.14166,-1.103969,
+ -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
+ 0.977763,0.208696,-0.020643,-3.217306,-3.187686,-1.075214,
+ 0.121953,0.140869,-0.982488,-3.301857,-3.074776,-1.114869,
+ 0.753698,-0.027204,0.656657,-3.223286,-3.00178,-1.126176,
+ -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
+ 0.121953,0.140869,-0.982488,-3.301857,-3.074776,-1.114869,
+ -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
+ 0.913315,0.39776,0.087427,-3.227676,-3.14166,-1.103969,
+ 0.121953,0.140869,-0.982488,-3.301857,-3.074776,-1.114869,
+ 0.197648,0.486888,-0.850809,-3.333954,-3.058673,-0.974748,
+ 0.517272,-0.552302,-0.653753,-3.302419,-3.017921,-1.128514,
+ -0.978077,-0.070308,0.196017,-3.339637,-2.846837,-0.966368,
+ -0.020456,0.943466,-0.330837,-3.32033,-2.827513,-1.063914,
+ 0.517272,-0.552302,-0.653753,-3.302419,-3.017921,-1.128514,
+ -0.978077,-0.070308,0.196017,-3.339637,-2.846837,-0.966368,
+ 0.517272,-0.552302,-0.653753,-3.302419,-3.017921,-1.128514,
+ 0.197648,0.486888,-0.850809,-3.333954,-3.058673,-0.974748,
+ 0.737412,0.542596,-0.402261,-2.884711,-3.063896,-0.993766,
+ 0.507452,0.36284,-0.781563,-2.946527,-2.939327,-0.986343,
+ 0.72114,0.258272,0.642848,-3.008412,-2.89976,-0.904635,
+ 0.737412,0.542596,-0.402261,-2.884711,-3.063896,-0.993766,
+ 0.72114,0.258272,0.642848,-3.008412,-2.89976,-0.904635,
+ 0.684558,0.361154,0.633205,-2.928681,-3.072892,-0.924772,
+ -0.178214,-0.110838,0.977729,-3.294389,-3.166225,-0.842823,
+ -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
+ -0.058899,-0.007802,0.998233,-3.166971,-3.002766,-0.812106,
+ -0.178214,-0.110838,0.977729,-3.294389,-3.166225,-0.842823,
+ -0.058899,-0.007802,0.998233,-3.166971,-3.002766,-0.812106,
+ -0.674431,0.094186,0.732306,-3.256731,-3.032131,-0.849693,
+ -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
+ 0.308087,0.149605,0.939521,-3.011987,-3.092,-0.860973,
+ 0.403627,0.101273,0.909301,-3.06981,-2.928755,-0.845236,
+ -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
+ 0.403627,0.101273,0.909301,-3.06981,-2.928755,-0.845236,
+ -0.058899,-0.007802,0.998233,-3.166971,-3.002766,-0.812106,
+ 0.308087,0.149605,0.939521,-3.011987,-3.092,-0.860973,
+ 0.684558,0.361154,0.633205,-2.928681,-3.072892,-0.924772,
+ 0.72114,0.258272,0.642848,-3.008412,-2.89976,-0.904635,
+ 0.308087,0.149605,0.939521,-3.011987,-3.092,-0.860973,
+ 0.72114,0.258272,0.642848,-3.008412,-2.89976,-0.904635,
+ 0.403627,0.101273,0.909301,-3.06981,-2.928755,-0.845236,
+ -0.058899,-0.007802,0.998233,-3.166971,-3.002766,-0.812106,
+ 0.403627,0.101273,0.909301,-3.06981,-2.928755,-0.845236,
+ 0.313529,0.096126,0.944701,-3.137383,-2.776449,-0.844117,
+ -0.058899,-0.007802,0.998233,-3.166971,-3.002766,-0.812106,
+ 0.313529,0.096126,0.944701,-3.137383,-2.776449,-0.844117,
+ -0.121543,0.046,0.99152,-3.184812,-2.768053,-0.850127,
+ 0.313529,0.096126,0.944701,-3.137383,-2.776449,-0.844117,
+ 0.403627,0.101273,0.909301,-3.06981,-2.928755,-0.845236,
+ 0.72114,0.258272,0.642848,-3.008412,-2.89976,-0.904635,
+ 0.313529,0.096126,0.944701,-3.137383,-2.776449,-0.844117,
+ 0.72114,0.258272,0.642848,-3.008412,-2.89976,-0.904635,
+ 0.761939,0.13671,0.633055,-3.040038,-2.780893,-0.914614,
+ -0.674431,0.094186,0.732306,-3.256731,-3.032131,-0.849693,
+ -0.058899,-0.007802,0.998233,-3.166971,-3.002766,-0.812106,
+ -0.121543,0.046,0.99152,-3.184812,-2.768053,-0.850127,
+ -0.674431,0.094186,0.732306,-3.256731,-3.032131,-0.849693,
+ -0.121543,0.046,0.99152,-3.184812,-2.768053,-0.850127,
+ -0.556404,-0.045521,0.829664,-3.300372,-2.795728,-0.878984,
+ 0.507452,0.36284,-0.781563,-2.946527,-2.939327,-0.986343,
+ 0.484364,0.195734,-0.85269,-3.016419,-2.765091,-0.966671,
+ 0.761939,0.13671,0.633055,-3.040038,-2.780893,-0.914614,
+ 0.507452,0.36284,-0.781563,-2.946527,-2.939327,-0.986343,
+ 0.761939,0.13671,0.633055,-3.040038,-2.780893,-0.914614,
+ 0.72114,0.258272,0.642848,-3.008412,-2.89976,-0.904635,
+ -0.156071,0.243426,-0.95728,-3.053267,-2.764905,-1.043008,
+ -0.753891,0.130682,-0.643872,-3.141072,-2.785287,-1.032318,
+ -0.440199,0.219838,-0.870572,-3.162498,-2.556375,-1.058409,
+ -0.156071,0.243426,-0.95728,-3.053267,-2.764905,-1.043008,
+ -0.440199,0.219838,-0.870572,-3.162498,-2.556375,-1.058409,
+ -0.775358,0.344514,-0.529274,-3.078699,-2.553982,-1.046834,
+ -0.020456,0.943466,-0.330837,-3.32033,-2.827513,-1.063914,
+ -0.978077,-0.070308,0.196017,-3.339637,-2.846837,-0.966368,
+ -0.326843,-0.236652,0.91497,-3.372066,-2.569159,-0.904785,
+ -0.020456,0.943466,-0.330837,-3.32033,-2.827513,-1.063914,
+ -0.326843,-0.236652,0.91497,-3.372066,-2.569159,-0.904785,
+ -0.354049,-0.10839,-0.928925,-3.347304,-2.573628,-0.955211,
+ 0.030762,-0.124297,0.991768,-3.26181,-2.821069,-1.088218,
+ -0.020456,0.943466,-0.330837,-3.32033,-2.827513,-1.063914,
+ -0.354049,-0.10839,-0.928925,-3.347304,-2.573628,-0.955211,
+ 0.030762,-0.124297,0.991768,-3.26181,-2.821069,-1.088218,
+ -0.354049,-0.10839,-0.928925,-3.347304,-2.573628,-0.955211,
+ 0.433219,-0.09361,-0.896414,-3.251541,-2.56405,-1.023627,
+ -0.637764,0.107242,-0.76273,-3.196508,-2.788166,-1.045431,
+ 0.030762,-0.124297,0.991768,-3.26181,-2.821069,-1.088218,
+ 0.433219,-0.09361,-0.896414,-3.251541,-2.56405,-1.023627,
+ -0.637764,0.107242,-0.76273,-3.196508,-2.788166,-1.045431,
+ 0.433219,-0.09361,-0.896414,-3.251541,-2.56405,-1.023627,
+ -0.440199,0.219838,-0.870572,-3.162498,-2.556375,-1.058409,
+ -0.753891,0.130682,-0.643872,-3.141072,-2.785287,-1.032318,
+ -0.637764,0.107242,-0.76273,-3.196508,-2.788166,-1.045431,
+ -0.440199,0.219838,-0.870572,-3.162498,-2.556375,-1.058409,
+ -0.775358,0.344514,-0.529274,-3.078699,-2.553982,-1.046834,
+ -0.501053,-0.05946,-0.863371,-3.022819,-2.52224,-0.979148,
+ 0.484364,0.195734,-0.85269,-3.016419,-2.765091,-0.966671,
+ -0.775358,0.344514,-0.529274,-3.078699,-2.553982,-1.046834,
+ 0.484364,0.195734,-0.85269,-3.016419,-2.765091,-0.966671,
+ -0.156071,0.243426,-0.95728,-3.053267,-2.764905,-1.043008,
+ 0.255431,-0.055528,0.965231,-3.297886,-2.54902,-0.861657,
+ -0.326843,-0.236652,0.91497,-3.372066,-2.569159,-0.904785,
+ -0.978077,-0.070308,0.196017,-3.339637,-2.846837,-0.966368,
+ 0.255431,-0.055528,0.965231,-3.297886,-2.54902,-0.861657,
+ -0.978077,-0.070308,0.196017,-3.339637,-2.846837,-0.966368,
+ -0.556404,-0.045521,0.829664,-3.300372,-2.795728,-0.878984,
+ -0.215783,-0.895808,0.388544,-3.240554,-2.555467,-0.856262,
+ 0.255431,-0.055528,0.965231,-3.297886,-2.54902,-0.861657,
+ -0.556404,-0.045521,0.829664,-3.300372,-2.795728,-0.878984,
+ -0.215783,-0.895808,0.388544,-3.240554,-2.555467,-0.856262,
+ -0.556404,-0.045521,0.829664,-3.300372,-2.795728,-0.878984,
+ -0.121543,0.046,0.99152,-3.184812,-2.768053,-0.850127,
+ -0.065687,-0.249194,0.966223,-3.132772,-2.528669,-0.848639,
+ -0.215783,-0.895808,0.388544,-3.240554,-2.555467,-0.856262,
+ -0.121543,0.046,0.99152,-3.184812,-2.768053,-0.850127,
+ -0.065687,-0.249194,0.966223,-3.132772,-2.528669,-0.848639,
+ -0.121543,0.046,0.99152,-3.184812,-2.768053,-0.850127,
+ 0.313529,0.096126,0.944701,-3.137383,-2.776449,-0.844117,
+ 0.886562,-0.46255,-0.007485,-3.04661,-2.510881,-0.900772,
+ -0.065687,-0.249194,0.966223,-3.132772,-2.528669,-0.848639,
+ 0.313529,0.096126,0.944701,-3.137383,-2.776449,-0.844117,
+ 0.886562,-0.46255,-0.007485,-3.04661,-2.510881,-0.900772,
+ 0.313529,0.096126,0.944701,-3.137383,-2.776449,-0.844117,
+ 0.761939,0.13671,0.633055,-3.040038,-2.780893,-0.914614,
+ -0.501053,-0.05946,-0.863371,-3.022819,-2.52224,-0.979148,
+ 0.886562,-0.46255,-0.007485,-3.04661,-2.510881,-0.900772,
+ 0.761939,0.13671,0.633055,-3.040038,-2.780893,-0.914614,
+ -0.501053,-0.05946,-0.863371,-3.022819,-2.52224,-0.979148,
+ 0.761939,0.13671,0.633055,-3.040038,-2.780893,-0.914614,
+ 0.484364,0.195734,-0.85269,-3.016419,-2.765091,-0.966671,
+ -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
+ -0.799953,-0.096213,-0.592299,-3.27751,-1.177346,-0.9153,
+ -0.811102,-0.12903,-0.570495,-3.319817,-1.365015,-0.886015,
+ -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
+ -0.811102,-0.12903,-0.570495,-3.319817,-1.365015,-0.886015,
+ -0.782249,0.198377,-0.590536,-3.335942,-1.365685,-0.72459,
+ -0.838192,0.000365,-0.545375,-3.25121,-0.948205,-0.819868,
+ -0.984416,-0.175855,-0.000915,-3.283698,-0.730967,-0.793898,
+ -0.84112,-0.026303,-0.540209,-3.233333,-0.683782,-1.015512,
+ -0.838192,0.000365,-0.545375,-3.25121,-0.948205,-0.819868,
+ -0.84112,-0.026303,-0.540209,-3.233333,-0.683782,-1.015512,
+ -0.813168,-0.06637,-0.578232,-3.238094,-0.979377,-0.961631,
+ -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
+ -0.838192,0.000365,-0.545375,-3.25121,-0.948205,-0.819868,
+ -0.813168,-0.06637,-0.578232,-3.238094,-0.979377,-0.961631,
+ -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
+ -0.813168,-0.06637,-0.578232,-3.238094,-0.979377,-0.961631,
+ -0.799953,-0.096213,-0.592299,-3.27751,-1.177346,-0.9153,
+ -0.743901,0.102645,-0.66036,-3.415655,-0.308965,-0.671045,
+ -0.976177,-0.17359,0.130171,-3.406618,-0.343461,-0.746456,
+ -0.984416,-0.175855,-0.000915,-3.283698,-0.730967,-0.793898,
+ -0.472479,0.093412,-0.876377,-3.556552,0.704883,-0.28063,
+ -0.43302,-0.02622,-0.901003,-3.57817,0.837714,-0.288502,
+ -0.946902,-0.290276,0.138264,-3.664355,0.932851,-0.370749,
+ -0.472479,0.093412,-0.876377,-3.556552,0.704883,-0.28063,
+ -0.946902,-0.290276,0.138264,-3.664355,0.932851,-0.370749,
+ -0.982633,-0.143429,0.11773,-3.631292,0.701013,-0.420276,
+ -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
+ -0.472479,0.093412,-0.876377,-3.556552,0.704883,-0.28063,
+ -0.982633,-0.143429,0.11773,-3.631292,0.701013,-0.420276,
+ -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
+ -0.982633,-0.143429,0.11773,-3.631292,0.701013,-0.420276,
+ -0.995584,-0.070631,0.061842,-3.570384,0.385564,-0.52448,
+ -0.923845,0.18432,-0.335466,-3.51684,0.149002,-0.430359,
+ -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
+ -0.995584,-0.070631,0.061842,-3.570384,0.385564,-0.52448,
+ -0.923845,0.18432,-0.335466,-3.51684,0.149002,-0.430359,
+ -0.995584,-0.070631,0.061842,-3.570384,0.385564,-0.52448,
+ -0.997475,-0.070819,0.005318,-3.520188,0.140164,-0.618561,
+ -0.908258,0.139498,-0.394471,-3.470778,-0.078218,-0.546398,
+ -0.923845,0.18432,-0.335466,-3.51684,0.149002,-0.430359,
+ -0.997475,-0.070819,0.005318,-3.520188,0.140164,-0.618561,
+ -0.908258,0.139498,-0.394471,-3.470778,-0.078218,-0.546398,
+ -0.997475,-0.070819,0.005318,-3.520188,0.140164,-0.618561,
+ -0.980175,-0.184883,0.071243,-3.458251,-0.12595,-0.731712,
+ -0.743901,0.102645,-0.66036,-3.415655,-0.308965,-0.671045,
+ -0.908258,0.139498,-0.394471,-3.470778,-0.078218,-0.546398,
+ -0.980175,-0.184883,0.071243,-3.458251,-0.12595,-0.731712,
+ -0.743901,0.102645,-0.66036,-3.415655,-0.308965,-0.671045,
+ -0.980175,-0.184883,0.071243,-3.458251,-0.12595,-0.731712,
+ -0.976177,-0.17359,0.130171,-3.406618,-0.343461,-0.746456,
+ -0.996668,0.081567,0,-3.623861,0.911561,0,
+ -0.946902,-0.290276,0.138264,-3.664355,0.932851,-0.370749,
+ -0.43302,-0.02622,-0.901003,-3.57817,0.837714,-0.288502,
+ -0.996668,0.081567,0,-3.623861,0.911561,0,
+ -0.43302,-0.02622,-0.901003,-3.57817,0.837714,-0.288502,
+ -0.989171,0.146765,0,-3.599077,0.796217,0,
+ -0.844095,-0.536194,0,-3.601668,1.293049,0,
+ -0.848349,-0.120539,-0.515533,-3.709827,1.417763,0,
+ -0.880002,-0.033987,-0.473752,-3.709741,1.351194,-0.211745,
+ -0.844095,-0.536194,0,-3.601668,1.293049,0,
+ -0.880002,-0.033987,-0.473752,-3.709741,1.351194,-0.211745,
+ -0.870331,0.069096,-0.487595,-3.701634,1.27265,-0.270469,
+ -0.946116,-0.323827,0,-3.608593,1.163581,0,
+ -0.844095,-0.536194,0,-3.601668,1.293049,0,
+ -0.870331,0.069096,-0.487595,-3.701634,1.27265,-0.270469,
+ -0.946116,-0.323827,0,-3.608593,1.163581,0,
+ -0.870331,0.069096,-0.487595,-3.701634,1.27265,-0.270469,
+ -0.822733,0.223687,-0.522565,-3.695872,1.156978,-0.316829,
+ -0.997181,-0.075036,0,-3.622326,1.005378,0,
+ -0.946116,-0.323827,0,-3.608593,1.163581,0,
+ -0.822733,0.223687,-0.522565,-3.695872,1.156978,-0.316829,
+ -0.997181,-0.075036,0,-3.622326,1.005378,0,
+ -0.822733,0.223687,-0.522565,-3.695872,1.156978,-0.316829,
+ -0.938447,-0.345423,0,-3.672431,1.044224,-0.364991,
+ -0.996668,0.081567,0,-3.623861,0.911561,0,
+ -0.997181,-0.075036,0,-3.622326,1.005378,0,
+ -0.938447,-0.345423,0,-3.672431,1.044224,-0.364991,
+ -0.996668,0.081567,0,-3.623861,0.911561,0,
+ -0.938447,-0.345423,0,-3.672431,1.044224,-0.364991,
+ -0.946902,-0.290276,0.138264,-3.664355,0.932851,-0.370749,
+ -0.999862,-0.016634,0,-3.900566,1.002504,0,
+ -0.891992,-0.016938,-0.451734,-3.88734,1.003866,-0.057635,
+ -0.888551,-0.077176,-0.452239,-3.84447,0.498176,-0.053132,
+ -0.999862,-0.016634,0,-3.900566,1.002504,0,
+ -0.888551,-0.077176,-0.452239,-3.84447,0.498176,-0.053132,
+ -0.996511,-0.083465,-0.000062,-3.856649,0.496801,0,
+ -0.964752,0.26316,0,-3.87514,1.480358,0,
+ -0.860797,0.234294,-0.451812,-3.86082,1.479723,-0.062137,
+ -0.891992,-0.016938,-0.451734,-3.88734,1.003866,-0.057635,
+ -0.964752,0.26316,0,-3.87514,1.480358,0,
+ -0.891992,-0.016938,-0.451734,-3.88734,1.003866,-0.057635,
+ -0.999862,-0.016634,0,-3.900566,1.002504,0,
+ -0.766357,0.642415,0,-3.712832,1.794492,0,
+ -0.686439,0.576002,-0.443872,-3.698925,1.787941,-0.06664,
+ -0.860797,0.234294,-0.451812,-3.86082,1.479723,-0.062137,
+ -0.766357,0.642415,0,-3.712832,1.794492,0,
+ -0.860797,0.234294,-0.451812,-3.86082,1.479723,-0.062137,
+ -0.964752,0.26316,0,-3.87514,1.480358,0,
+ -0.410619,0.911807,0,-3.47843,1.975409,0,
+ -0.369855,0.817227,-0.441981,-3.469715,1.961504,-0.071141,
+ -0.686439,0.576002,-0.443872,-3.698925,1.787941,-0.06664,
+ -0.410619,0.911807,0,-3.47843,1.975409,0,
+ -0.686439,0.576002,-0.443872,-3.698925,1.787941,-0.06664,
+ -0.766357,0.642415,0,-3.712832,1.794492,0,
+ -0.433128,-0.901332,0,-3.242148,2.021387,0,
+ 0.011581,0.887039,-0.461548,-3.238225,2.005405,-0.075645,
+ -0.369855,0.817227,-0.441981,-3.469715,1.961504,-0.071141,
+ -0.433128,-0.901332,0,-3.242148,2.021387,0,
+ -0.369855,0.817227,-0.441981,-3.469715,1.961504,-0.071141,
+ -0.410619,0.911807,0,-3.47843,1.975409,0,
+ -0.891992,-0.016938,-0.451734,-3.88734,1.003866,-0.057635,
+ -0.548359,-0.017804,-0.836053,-3.851206,1.007586,-0.099831,
+ -0.545298,-0.056465,-0.836338,-3.811194,0.501935,-0.092033,
+ -0.891992,-0.016938,-0.451734,-3.88734,1.003866,-0.057635,
+ -0.545298,-0.056465,-0.836338,-3.811194,0.501935,-0.092033,
+ -0.888551,-0.077176,-0.452239,-3.84447,0.498176,-0.053132,
+ -0.860797,0.234294,-0.451812,-3.86082,1.479723,-0.062137,
+ -0.530021,0.13773,-0.836725,-3.821694,1.477989,-0.107631,
+ -0.548359,-0.017804,-0.836053,-3.851206,1.007586,-0.099831,
+ -0.860797,0.234294,-0.451812,-3.86082,1.479723,-0.062137,
+ -0.548359,-0.017804,-0.836053,-3.851206,1.007586,-0.099831,
+ -0.891992,-0.016938,-0.451734,-3.88734,1.003866,-0.057635,
+ -0.686439,0.576002,-0.443872,-3.698925,1.787941,-0.06664,
+ -0.429713,0.351913,-0.831568,-3.660928,1.770041,-0.115431,
+ -0.530021,0.13773,-0.836725,-3.821694,1.477989,-0.107631,
+ -0.686439,0.576002,-0.443872,-3.698925,1.787941,-0.06664,
+ -0.530021,0.13773,-0.836725,-3.821694,1.477989,-0.107631,
+ -0.860797,0.234294,-0.451812,-3.86082,1.479723,-0.062137,
+ -0.369855,0.817227,-0.441981,-3.469715,1.961504,-0.071141,
+ -0.240211,0.502412,-0.830591,-3.445903,1.923509,-0.123229,
+ -0.429713,0.351913,-0.831568,-3.660928,1.770041,-0.115431,
+ -0.369855,0.817227,-0.441981,-3.469715,1.961504,-0.071141,
+ -0.429713,0.351913,-0.831568,-3.660928,1.770041,-0.115431,
+ -0.686439,0.576002,-0.443872,-3.698925,1.787941,-0.06664,
+ 0.011581,0.887039,-0.461548,-3.238225,2.005405,-0.075645,
+ 0.000909,0.669011,-0.743252,-3.227504,1.961738,-0.131029,
+ -0.240211,0.502412,-0.830591,-3.445903,1.923509,-0.123229,
+ 0.011581,0.887039,-0.461548,-3.238225,2.005405,-0.075645,
+ -0.240211,0.502412,-0.830591,-3.445903,1.923509,-0.123229,
+ -0.369855,0.817227,-0.441981,-3.469715,1.961504,-0.071141,
+ -0.548359,-0.017804,-0.836053,-3.851206,1.007586,-0.099831,
+ 0.000763,-0.01871,-0.999825,-3.80184,1.012668,-0.115288,
+ 0.002291,-0.021629,-0.999763,-3.765736,0.50707,-0.106281,
+ -0.548359,-0.017804,-0.836053,-3.851206,1.007586,-0.099831,
+ 0.002291,-0.021629,-0.999763,-3.765736,0.50707,-0.106281,
+ -0.545298,-0.056465,-0.836338,-3.811194,0.501935,-0.092033,
+ -0.530021,0.13773,-0.836725,-3.821694,1.477989,-0.107631,
+ -0.004656,-0.025693,-0.999659,-3.768245,1.475619,-0.124295,
+ 0.000763,-0.01871,-0.999825,-3.80184,1.012668,-0.115288,
+ -0.530021,0.13773,-0.836725,-3.821694,1.477989,-0.107631,
+ 0.000763,-0.01871,-0.999825,-3.80184,1.012668,-0.115288,
+ -0.548359,-0.017804,-0.836053,-3.851206,1.007586,-0.099831,
+ -0.429713,0.351913,-0.831568,-3.660928,1.770041,-0.115431,
+ -0.020872,-0.032587,-0.999251,-3.609021,1.745588,-0.133304,
+ -0.004656,-0.025693,-0.999659,-3.768245,1.475619,-0.124295,
+ -0.429713,0.351913,-0.831568,-3.660928,1.770041,-0.115431,
+ -0.004656,-0.025693,-0.999659,-3.768245,1.475619,-0.124295,
+ -0.530021,0.13773,-0.836725,-3.821694,1.477989,-0.107631,
+ -0.240211,0.502412,-0.830591,-3.445903,1.923509,-0.123229,
+ -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
+ -0.020872,-0.032587,-0.999251,-3.609021,1.745588,-0.133304,
+ -0.240211,0.502412,-0.830591,-3.445903,1.923509,-0.123229,
+ -0.020872,-0.032587,-0.999251,-3.609021,1.745588,-0.133304,
+ -0.429713,0.351913,-0.831568,-3.660928,1.770041,-0.115431,
+ 0.000909,0.669011,-0.743252,-3.227504,1.961738,-0.131029,
+ -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
+ -0.240211,0.502412,-0.830591,-3.445903,1.923509,-0.123229,
+ 0.000763,-0.01871,-0.999825,-3.80184,1.012668,-0.115288,
+ 0.549332,-0.018885,-0.835391,-3.752468,1.017751,-0.099865,
+ 0.549192,0.015162,-0.835559,-3.720269,0.512205,-0.092064,
+ 0.000763,-0.01871,-0.999825,-3.80184,1.012668,-0.115288,
+ 0.549192,0.015162,-0.835559,-3.720269,0.512205,-0.092064,
+ 0.002291,-0.021629,-0.999763,-3.765736,0.50707,-0.106281,
+ -0.004656,-0.025693,-0.999659,-3.768245,1.475619,-0.124295,
+ 0.516335,-0.196022,-0.833651,-3.714787,1.473248,-0.107668,
+ 0.549332,-0.018885,-0.835391,-3.752468,1.017751,-0.099865,
+ -0.004656,-0.025693,-0.999659,-3.768245,1.475619,-0.124295,
+ 0.549332,-0.018885,-0.835391,-3.752468,1.017751,-0.099865,
+ 0.000763,-0.01871,-0.999825,-3.80184,1.012668,-0.115288,
+ -0.020872,-0.032587,-0.999251,-3.609021,1.745588,-0.133304,
+ 0.368421,-0.433142,-0.82259,-3.557104,1.72113,-0.11547,
+ 0.516335,-0.196022,-0.833651,-3.714787,1.473248,-0.107668,
+ -0.020872,-0.032587,-0.999251,-3.609021,1.745588,-0.133304,
+ 0.516335,-0.196022,-0.833651,-3.714787,1.473248,-0.107668,
+ -0.004656,-0.025693,-0.999659,-3.768245,1.475619,-0.124295,
+ -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
+ 0.255239,-0.528231,-0.80983,-3.380836,1.819691,-0.123273,
+ 0.368421,-0.433142,-0.82259,-3.557104,1.72113,-0.11547,
+ -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
+ 0.368421,-0.433142,-0.82259,-3.557104,1.72113,-0.11547,
+ -0.020872,-0.032587,-0.999251,-3.609021,1.745588,-0.133304,
+ 0.549332,-0.018885,-0.835391,-3.752468,1.017751,-0.099865,
+ 0.892142,-0.018571,-0.451373,-3.716312,1.021474,-0.057693,
+ 0.891325,0.039302,-0.451658,-3.686972,0.515966,-0.053185,
+ 0.549332,-0.018885,-0.835391,-3.752468,1.017751,-0.099865,
+ 0.891325,0.039302,-0.451658,-3.686972,0.515966,-0.053185,
+ 0.549192,0.015162,-0.835559,-3.720269,0.512205,-0.092064,
+ 0.516335,-0.196022,-0.833651,-3.714787,1.473248,-0.107668,
+ 0.843387,-0.305323,-0.442128,-3.675638,1.471512,-0.062201,
+ 0.892142,-0.018571,-0.451373,-3.716312,1.021474,-0.057693,
+ 0.516335,-0.196022,-0.833651,-3.714787,1.473248,-0.107668,
+ 0.892142,-0.018571,-0.451373,-3.716312,1.021474,-0.057693,
+ 0.549332,-0.018885,-0.835391,-3.752468,1.017751,-0.099865,
+ 0.368421,-0.433142,-0.82259,-3.557104,1.72113,-0.11547,
+ 0.589192,-0.69056,-0.4195,-3.519086,1.70322,-0.066709,
+ 0.843387,-0.305323,-0.442128,-3.675638,1.471512,-0.062201,
+ 0.368421,-0.433142,-0.82259,-3.557104,1.72113,-0.11547,
+ 0.843387,-0.305323,-0.442128,-3.675638,1.471512,-0.062201,
+ 0.516335,-0.196022,-0.833651,-3.714787,1.473248,-0.107668,
+ 0.255239,-0.528231,-0.80983,-3.380836,1.819691,-0.123273,
+ 0.389161,-0.829175,-0.401277,-3.357009,1.781675,-0.071216,
+ 0.589192,-0.69056,-0.4195,-3.519086,1.70322,-0.066709,
+ 0.255239,-0.528231,-0.80983,-3.380836,1.819691,-0.123273,
+ 0.589192,-0.69056,-0.4195,-3.519086,1.70322,-0.066709,
+ 0.368421,-0.433142,-0.82259,-3.557104,1.72113,-0.11547,
+ 0.892142,-0.018571,-0.451373,-3.716312,1.021474,-0.057693,
+ 0.999831,-0.018401,-0.000261,-3.703058,1.022838,-0.000069,
+ 0.998889,0.047122,-0.000074,-3.674766,0.517345,-0.000063,
+ 0.892142,-0.018571,-0.451373,-3.716312,1.021474,-0.057693,
+ 0.998889,0.047122,-0.000074,-3.674766,0.517345,-0.000063,
+ 0.891325,0.039302,-0.451658,-3.686972,0.515966,-0.053185,
+ 0.843387,-0.305323,-0.442128,-3.675638,1.471512,-0.062201,
+ 0.941293,-0.337592,-0.000186,-3.661286,1.470876,-0.000074,
+ 0.999831,-0.018401,-0.000261,-3.703058,1.022838,-0.000069,
+ 0.843387,-0.305323,-0.442128,-3.675638,1.471512,-0.062201,
+ 0.999831,-0.018401,-0.000261,-3.703058,1.022838,-0.000069,
+ 0.892142,-0.018571,-0.451373,-3.716312,1.021474,-0.057693,
+ 0.589192,-0.69056,-0.4195,-3.519086,1.70322,-0.066709,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ 0.941293,-0.337592,-0.000186,-3.661286,1.470876,-0.000074,
+ 0.589192,-0.69056,-0.4195,-3.519086,1.70322,-0.066709,
+ 0.941293,-0.337592,-0.000186,-3.661286,1.470876,-0.000074,
+ 0.843387,-0.305323,-0.442128,-3.675638,1.471512,-0.062201,
+ 0.389161,-0.829175,-0.401277,-3.357009,1.781675,-0.071216,
+ 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ 0.389161,-0.829175,-0.401277,-3.357009,1.781675,-0.071216,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ 0.589192,-0.69056,-0.4195,-3.519086,1.70322,-0.066709,
+ 0.000909,0.669011,-0.743252,-3.227504,1.961738,-0.131029,
+ 0.243464,-0.335965,-0.909864,-3.077669,1.871112,-0.217368,
+ -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
+ 0.011581,0.887039,-0.461548,-3.238225,2.005405,-0.075645,
+ -0.433128,-0.901332,0,-3.242148,2.021387,0,
+ 0.012502,-0.999922,0,-3.037562,2.001526,0,
+ 0.011581,0.887039,-0.461548,-3.238225,2.005405,-0.075645,
+ 0.012502,-0.999922,0,-3.037562,2.001526,0,
+ 0.005821,-0.234321,-0.972142,-3.053102,1.96881,-0.051104,
+ 0.000909,0.669011,-0.743252,-3.227504,1.961738,-0.131029,
+ 0.011581,0.887039,-0.461548,-3.238225,2.005405,-0.075645,
+ 0.005821,-0.234321,-0.972142,-3.053102,1.96881,-0.051104,
+ 0.000909,0.669011,-0.743252,-3.227504,1.961738,-0.131029,
+ 0.005821,-0.234321,-0.972142,-3.053102,1.96881,-0.051104,
+ 0.243464,-0.335965,-0.909864,-3.077669,1.871112,-0.217368,
+ 0.243464,-0.335965,-0.909864,-3.077669,1.871112,-0.217368,
+ -0.108631,-0.122719,-0.986478,-3.35851,1.810253,-0.380095,
+ -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
+ 0.243464,-0.335965,-0.909864,-3.077669,1.871112,-0.217368,
+ 0.49938,-0.45475,-0.737443,-3.07531,1.846,-0.363149,
+ -0.108631,-0.122719,-0.986478,-3.35851,1.810253,-0.380095,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ 0.544735,0.449335,-0.708069,4.824747,1.946835,-0.626358,
+ 0.897742,-0.15037,-0.414063,4.852578,1.889721,-0.605031,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ 0.897742,-0.15037,-0.414063,4.852578,1.889721,-0.605031,
+ 0.397989,0.4494,-0.799778,4.861618,1.854067,-0.618095,
+ 0.721999,0.398917,-0.565316,4.861611,2.001639,-0.621913,
+ 0.264979,0.116702,-0.957166,4.842883,2.021333,-0.638025,
+ 0.312982,-0.015529,-0.949632,4.93588,2.051665,-0.572853,
+ 0.721999,0.398917,-0.565316,4.861611,2.001639,-0.621913,
+ 0.312982,-0.015529,-0.949632,4.93588,2.051665,-0.572853,
+ 0.711192,0.127662,-0.69131,4.935561,2.016016,-0.5857,
+ 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
+ 0.412833,-0.156453,-0.897269,5.001903,1.914398,-0.486724,
+ 0.872792,-0.115436,-0.474246,4.973133,1.992779,-0.533466,
+ 0.746476,-0.187741,-0.638379,4.926194,1.859813,-0.582137,
+ 0.560378,0.257626,-0.78715,4.944706,1.840663,-0.575374,
+ 0.397989,0.4494,-0.799778,4.861618,1.854067,-0.618095,
+ 0.746476,-0.187741,-0.638379,4.926194,1.859813,-0.582137,
+ 0.397989,0.4494,-0.799778,4.861618,1.854067,-0.618095,
+ 0.897742,-0.15037,-0.414063,4.852578,1.889721,-0.605031,
+ 0.746476,-0.187741,-0.638379,4.926194,1.859813,-0.582137,
+ 0.108828,-0.182644,-0.977137,4.982364,1.8733,-0.53619,
+ 0.661825,0.260115,-0.703085,4.991709,1.844295,-0.520761,
+ 0.746476,-0.187741,-0.638379,4.926194,1.859813,-0.582137,
+ 0.661825,0.260115,-0.703085,4.991709,1.844295,-0.520761,
+ 0.560378,0.257626,-0.78715,4.944706,1.840663,-0.575374,
+ 0.397989,0.4494,-0.799778,4.861618,1.854067,-0.618095,
+ 0.560378,0.257626,-0.78715,4.944706,1.840663,-0.575374,
+ 0.675892,0.137563,-0.724049,4.908019,1.796041,-0.587882,
+ 0.397989,0.4494,-0.799778,4.861618,1.854067,-0.618095,
+ 0.675892,0.137563,-0.724049,4.908019,1.796041,-0.587882,
+ 0.708269,-0.122724,-0.695193,4.852582,1.816115,-0.603105,
+ 0.560378,0.257626,-0.78715,4.944706,1.840663,-0.575374,
+ 0.661825,0.260115,-0.703085,4.991709,1.844295,-0.520761,
+ 0.683237,-0.051725,-0.728363,4.963546,1.783161,-0.553515,
+ 0.560378,0.257626,-0.78715,4.944706,1.840663,-0.575374,
+ 0.683237,-0.051725,-0.728363,4.963546,1.783161,-0.553515,
+ 0.675892,0.137563,-0.724049,4.908019,1.796041,-0.587882,
+ 0.661825,0.260115,-0.703085,4.991709,1.844295,-0.520761,
+ 0.762434,-0.012904,-0.646937,4.983034,1.806343,-0.505779,
+ 0.683237,-0.051725,-0.728363,4.963546,1.783161,-0.553515,
+ 0.661825,0.260115,-0.703085,4.991709,1.844295,-0.520761,
+ 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
+ 0.762434,-0.012904,-0.646937,4.983034,1.806343,-0.505779,
+ 0.588787,-0.248293,-0.769207,4.918466,2.084725,-0.532713,
+ 0.274422,-0.24433,-0.930051,4.964945,2.053575,-0.499903,
+ 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
+ 0.588787,-0.248293,-0.769207,4.918466,2.084725,-0.532713,
+ 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
+ 0.312982,-0.015529,-0.949632,4.93588,2.051665,-0.572853,
+ 0.274422,-0.24433,-0.930051,4.964945,2.053575,-0.499903,
+ 0.017555,-0.142899,-0.989582,5.020077,1.97817,-0.480978,
+ 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
+ 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
+ 0.017555,-0.142899,-0.989582,5.020077,1.97817,-0.480978,
+ 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
+ 0.264979,0.116702,-0.957166,4.842883,2.021333,-0.638025,
+ 0.961046,0.110911,-0.253159,4.825996,2.089176,-0.576083,
+ 0.910294,-0.144636,-0.387873,4.881574,2.094571,-0.539949,
+ 0.264979,0.116702,-0.957166,4.842883,2.021333,-0.638025,
+ 0.910294,-0.144636,-0.387873,4.881574,2.094571,-0.539949,
+ 0.312982,-0.015529,-0.949632,4.93588,2.051665,-0.572853,
+ 0.961046,0.110911,-0.253159,4.825996,2.089176,-0.576083,
+ 0.264979,0.116702,-0.957166,4.842883,2.021333,-0.638025,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ 0.961046,0.110911,-0.253159,4.825996,2.089176,-0.576083,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ 0.813293,0.022433,-0.581422,4.788476,2.028047,-0.608619,
+ 0.699393,0.056752,-0.71248,4.751519,2.039658,-0.634134,
+ 0.490646,-0.178293,-0.852923,4.798297,2.118191,-0.591085,
+ 0.961046,0.110911,-0.253159,4.825996,2.089176,-0.576083,
+ 0.699393,0.056752,-0.71248,4.751519,2.039658,-0.634134,
+ 0.961046,0.110911,-0.253159,4.825996,2.089176,-0.576083,
+ 0.813293,0.022433,-0.581422,4.788476,2.028047,-0.608619,
+ 0.490646,-0.178293,-0.852923,4.798297,2.118191,-0.591085,
+ 0.267717,-0.172975,-0.947844,4.872539,2.159259,-0.542891,
+ 0.910294,-0.144636,-0.387873,4.881574,2.094571,-0.539949,
+ 0.490646,-0.178293,-0.852923,4.798297,2.118191,-0.591085,
+ 0.910294,-0.144636,-0.387873,4.881574,2.094571,-0.539949,
+ 0.961046,0.110911,-0.253159,4.825996,2.089176,-0.576083,
+ 0.267717,-0.172975,-0.947844,4.872539,2.159259,-0.542891,
+ -0.028502,-0.108631,-0.993673,4.927885,2.15656,-0.516579,
+ 0.588787,-0.248293,-0.769207,4.918466,2.084725,-0.532713,
+ 0.267717,-0.172975,-0.947844,4.872539,2.159259,-0.542891,
+ 0.588787,-0.248293,-0.769207,4.918466,2.084725,-0.532713,
+ 0.910294,-0.144636,-0.387873,4.881574,2.094571,-0.539949,
+ -0.028502,-0.108631,-0.993673,4.927885,2.15656,-0.516579,
+ -0.064166,-0.189382,-0.979805,5.00244,2.105746,-0.468233,
+ 0.274422,-0.24433,-0.930051,4.964945,2.053575,-0.499903,
+ -0.028502,-0.108631,-0.993673,4.927885,2.15656,-0.516579,
+ 0.274422,-0.24433,-0.930051,4.964945,2.053575,-0.499903,
+ 0.588787,-0.248293,-0.769207,4.918466,2.084725,-0.532713,
+ -0.064166,-0.189382,-0.979805,5.00244,2.105746,-0.468233,
+ 0.781868,0.537364,-0.316105,5.057495,2.002751,-0.451974,
+ 0.017555,-0.142899,-0.989582,5.020077,1.97817,-0.480978,
+ -0.064166,-0.189382,-0.979805,5.00244,2.105746,-0.468233,
+ 0.017555,-0.142899,-0.989582,5.020077,1.97817,-0.480978,
+ 0.274422,-0.24433,-0.930051,4.964945,2.053575,-0.499903,
+ 0.781868,0.537364,-0.316105,5.057495,2.002751,-0.451974,
+ 0.89264,0.34991,-0.284178,5.075994,1.900999,-0.443793,
+ 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
+ 0.781868,0.537364,-0.316105,5.057495,2.002751,-0.451974,
+ 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
+ 0.017555,-0.142899,-0.989582,5.020077,1.97817,-0.480978,
+ 0.89264,0.34991,-0.284178,5.075994,1.900999,-0.443793,
+ 0.618085,0.650911,-0.440779,5.030289,1.827419,-0.440803,
+ 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
+ 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
+ 0.618085,0.650911,-0.440779,5.030289,1.827419,-0.440803,
+ 0.352601,0.621479,-0.699597,4.991904,1.760829,-0.510386,
+ 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
+ 0.352601,0.621479,-0.699597,4.991904,1.760829,-0.510386,
+ 0.762434,-0.012904,-0.646937,4.983034,1.806343,-0.505779,
+ 0.762434,-0.012904,-0.646937,4.983034,1.806343,-0.505779,
+ 0.352601,0.621479,-0.699597,4.991904,1.760829,-0.510386,
+ 0.171039,0.554898,-0.814146,4.936066,1.737668,-0.557276,
+ 0.762434,-0.012904,-0.646937,4.983034,1.806343,-0.505779,
+ 0.171039,0.554898,-0.814146,4.936066,1.737668,-0.557276,
+ 0.683237,-0.051725,-0.728363,4.963546,1.783161,-0.553515,
+ 0.675892,0.137563,-0.724049,4.908019,1.796041,-0.587882,
+ 0.683237,-0.051725,-0.728363,4.963546,1.783161,-0.553515,
+ 0.171039,0.554898,-0.814146,4.936066,1.737668,-0.557276,
+ 0.675892,0.137563,-0.724049,4.908019,1.796041,-0.587882,
+ 0.171039,0.554898,-0.814146,4.936066,1.737668,-0.557276,
+ -0.281999,-0.030938,-0.958916,4.871155,1.741238,-0.592326,
+ 0.708269,-0.122724,-0.695193,4.852582,1.816115,-0.603105,
+ 0.675892,0.137563,-0.724049,4.908019,1.796041,-0.587882,
+ -0.281999,-0.030938,-0.958916,4.871155,1.741238,-0.592326,
+ 0.708269,-0.122724,-0.695193,4.852582,1.816115,-0.603105,
+ -0.281999,-0.030938,-0.958916,4.871155,1.741238,-0.592326,
+ -0.120429,-0.209965,-0.970264,4.816181,1.79786,-0.604026,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ 0.708269,-0.122724,-0.695193,4.852582,1.816115,-0.603105,
+ -0.120429,-0.209965,-0.970264,4.816181,1.79786,-0.604026,
+ 0.89264,0.34991,-0.284178,5.075994,1.900999,-0.443793,
+ 0.077536,0.770695,-0.632469,5.095375,1.961238,-0.401516,
+ -0.222902,0.035918,-0.974179,5.085813,1.888503,-0.408327,
+ 0.89264,0.34991,-0.284178,5.075994,1.900999,-0.443793,
+ -0.222902,0.035918,-0.974179,5.085813,1.888503,-0.408327,
+ 0.269003,0.864361,-0.424874,5.058179,1.788186,-0.417387,
+ 0.89264,0.34991,-0.284178,5.075994,1.900999,-0.443793,
+ 0.269003,0.864361,-0.424874,5.058179,1.788186,-0.417387,
+ 0.618085,0.650911,-0.440779,5.030289,1.827419,-0.440803,
+ 0.618085,0.650911,-0.440779,5.030289,1.827419,-0.440803,
+ 0.269003,0.864361,-0.424874,5.058179,1.788186,-0.417387,
+ 0.532717,0.840798,-0.09629,5.019836,1.739907,-0.485562,
+ 0.618085,0.650911,-0.440779,5.030289,1.827419,-0.440803,
+ 0.532717,0.840798,-0.09629,5.019836,1.739907,-0.485562,
+ 0.352601,0.621479,-0.699597,4.991904,1.760829,-0.510386,
+ 0.352601,0.621479,-0.699597,4.991904,1.760829,-0.510386,
+ 0.532717,0.840798,-0.09629,5.019836,1.739907,-0.485562,
+ 0.722741,0.690989,0.01339,4.917973,1.68148,-0.544201,
+ 0.352601,0.621479,-0.699597,4.991904,1.760829,-0.510386,
+ 0.722741,0.690989,0.01339,4.917973,1.68148,-0.544201,
+ 0.171039,0.554898,-0.814146,4.936066,1.737668,-0.557276,
+ -0.281999,-0.030938,-0.958916,4.871155,1.741238,-0.592326,
+ 0.171039,0.554898,-0.814146,4.936066,1.737668,-0.557276,
+ 0.722741,0.690989,0.01339,4.917973,1.68148,-0.544201,
+ -0.281999,-0.030938,-0.958916,4.871155,1.741238,-0.592326,
+ 0.722741,0.690989,0.01339,4.917973,1.68148,-0.544201,
+ 0.870384,0.492055,-0.017698,4.862636,1.684144,-0.570155,
+ -0.120429,-0.209965,-0.970264,4.816181,1.79786,-0.604026,
+ -0.281999,-0.030938,-0.958916,4.871155,1.741238,-0.592326,
+ 0.870384,0.492055,-0.017698,4.862636,1.684144,-0.570155,
+ -0.120429,-0.209965,-0.970264,4.816181,1.79786,-0.604026,
+ 0.870384,0.492055,-0.017698,4.862636,1.684144,-0.570155,
+ 0.947044,0.280641,-0.156039,4.752337,1.723388,-0.591296,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ -0.120429,-0.209965,-0.970264,4.816181,1.79786,-0.604026,
+ 0.947044,0.280641,-0.156039,4.752337,1.723388,-0.591296,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ 0.947044,0.280641,-0.156039,4.752337,1.723388,-0.591296,
+ 0.925586,0.05083,-0.375109,4.697607,1.768061,-0.576663,
+ -0.064166,-0.189382,-0.979805,5.00244,2.105746,-0.468233,
+ -0.212651,-0.104685,-0.971504,5.030641,2.102197,-0.432329,
+ 0.332526,0.910491,-0.245832,5.067202,2.027704,-0.422291,
+ -0.064166,-0.189382,-0.979805,5.00244,2.105746,-0.468233,
+ 0.332526,0.910491,-0.245832,5.067202,2.027704,-0.422291,
+ 0.781868,0.537364,-0.316105,5.057495,2.002751,-0.451974,
+ 0.530808,0.847432,0.010124,4.93795,2.181155,-0.486939,
+ -0.212651,-0.104685,-0.971504,5.030641,2.102197,-0.432329,
+ -0.064166,-0.189382,-0.979805,5.00244,2.105746,-0.468233,
+ 0.530808,0.847432,0.010124,4.93795,2.181155,-0.486939,
+ -0.064166,-0.189382,-0.979805,5.00244,2.105746,-0.468233,
+ -0.028502,-0.108631,-0.993673,4.927885,2.15656,-0.516579,
+ 0.668087,0.738269,0.092842,4.881855,2.194544,-0.530288,
+ 0.530808,0.847432,0.010124,4.93795,2.181155,-0.486939,
+ -0.028502,-0.108631,-0.993673,4.927885,2.15656,-0.516579,
+ 0.668087,0.738269,0.092842,4.881855,2.194544,-0.530288,
+ -0.028502,-0.108631,-0.993673,4.927885,2.15656,-0.516579,
+ 0.267717,-0.172975,-0.947844,4.872539,2.159259,-0.542891,
+ 0.668087,0.738269,0.092842,4.881855,2.194544,-0.530288,
+ 0.267717,-0.172975,-0.947844,4.872539,2.159259,-0.542891,
+ 0.490646,-0.178293,-0.852923,4.798297,2.118191,-0.591085,
+ 0.668087,0.738269,0.092842,4.881855,2.194544,-0.530288,
+ 0.490646,-0.178293,-0.852923,4.798297,2.118191,-0.591085,
+ 0.787133,0.61647,0.019654,4.807794,2.143653,-0.570393,
+ 0.787133,0.61647,0.019654,4.807794,2.143653,-0.570393,
+ 0.490646,-0.178293,-0.852923,4.798297,2.118191,-0.591085,
+ 0.699393,0.056752,-0.71248,4.751519,2.039658,-0.634134,
+ 0.787133,0.61647,0.019654,4.807794,2.143653,-0.570393,
+ 0.699393,0.056752,-0.71248,4.751519,2.039658,-0.634134,
+ 0.856604,0.474873,-0.201803,4.728963,2.036146,-0.614307,
+ 0.827569,0.284292,-0.484054,4.742358,1.882232,-0.62165,
+ 0.856604,0.474873,-0.201803,4.728963,2.036146,-0.614307,
+ 0.699393,0.056752,-0.71248,4.751519,2.039658,-0.634134,
+ 0.827569,0.284292,-0.484054,4.742358,1.882232,-0.62165,
+ 0.699393,0.056752,-0.71248,4.751519,2.039658,-0.634134,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ 0.827569,0.284292,-0.484054,4.742358,1.882232,-0.62165,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ 0.925586,0.05083,-0.375109,4.697607,1.768061,-0.576663,
+ 0.766773,0.253147,-0.589894,4.74405,2.179337,-0.556057,
+ 0.787133,0.61647,0.019654,4.807794,2.143653,-0.570393,
+ 0.856604,0.474873,-0.201803,4.728963,2.036146,-0.614307,
+ 0.766773,0.253147,-0.589894,4.74405,2.179337,-0.556057,
+ 0.856604,0.474873,-0.201803,4.728963,2.036146,-0.614307,
+ 0.667258,0.181112,-0.722471,4.688114,2.046378,-0.604518,
+ 0.766773,0.253147,-0.589894,4.74405,2.179337,-0.556057,
+ 0.45571,-0.00339,-0.890122,4.837331,2.235678,-0.479332,
+ 0.668087,0.738269,0.092842,4.881855,2.194544,-0.530288,
+ 0.766773,0.253147,-0.589894,4.74405,2.179337,-0.556057,
+ 0.668087,0.738269,0.092842,4.881855,2.194544,-0.530288,
+ 0.787133,0.61647,0.019654,4.807794,2.143653,-0.570393,
+ 0.45571,-0.00339,-0.890122,4.837331,2.235678,-0.479332,
+ 0.373808,-0.059429,-0.9256,4.89385,2.220523,-0.417713,
+ 0.530808,0.847432,0.010124,4.93795,2.181155,-0.486939,
+ 0.45571,-0.00339,-0.890122,4.837331,2.235678,-0.479332,
+ 0.530808,0.847432,0.010124,4.93795,2.181155,-0.486939,
+ 0.668087,0.738269,0.092842,4.881855,2.194544,-0.530288,
+ 0.373808,-0.059429,-0.9256,4.89385,2.220523,-0.417713,
+ 0.276212,-0.065585,-0.958856,4.995978,2.148785,-0.344534,
+ -0.212651,-0.104685,-0.971504,5.030641,2.102197,-0.432329,
+ 0.373808,-0.059429,-0.9256,4.89385,2.220523,-0.417713,
+ -0.212651,-0.104685,-0.971504,5.030641,2.102197,-0.432329,
+ 0.530808,0.847432,0.010124,4.93795,2.181155,-0.486939,
+ 0.276212,-0.065585,-0.958856,4.995978,2.148785,-0.344534,
+ 0.122987,-0.006582,-0.992386,5.06084,2.053335,-0.309324,
+ 0.332526,0.910491,-0.245832,5.067202,2.027704,-0.422291,
+ 0.276212,-0.065585,-0.958856,4.995978,2.148785,-0.344534,
+ 0.332526,0.910491,-0.245832,5.067202,2.027704,-0.422291,
+ -0.212651,-0.104685,-0.971504,5.030641,2.102197,-0.432329,
+ 0.122987,-0.006582,-0.992386,5.06084,2.053335,-0.309324,
+ 0.041586,0.068165,-0.996807,5.097062,1.954206,-0.328795,
+ 0.077536,0.770695,-0.632469,5.095375,1.961238,-0.401516,
+ 0.122987,-0.006582,-0.992386,5.06084,2.053335,-0.309324,
+ 0.077536,0.770695,-0.632469,5.095375,1.961238,-0.401516,
+ 0.332526,0.910491,-0.245832,5.067202,2.027704,-0.422291,
+ 0.077536,0.770695,-0.632469,5.095375,1.961238,-0.401516,
+ 0.041586,0.068165,-0.996807,5.097062,1.954206,-0.328795,
+ 0.035084,0.005692,-0.999368,5.105589,1.864086,-0.347113,
+ 0.077536,0.770695,-0.632469,5.095375,1.961238,-0.401516,
+ 0.035084,0.005692,-0.999368,5.105589,1.864086,-0.347113,
+ -0.222902,0.035918,-0.974179,5.085813,1.888503,-0.408327,
+ -0.222902,0.035918,-0.974179,5.085813,1.888503,-0.408327,
+ 0.035084,0.005692,-0.999368,5.105589,1.864086,-0.347113,
+ 0.269003,0.864361,-0.424874,5.058179,1.788186,-0.417387,
+ -0.013461,-0.014478,-0.999805,4.697024,1.862575,-0.604048,
+ 0.827569,0.284292,-0.484054,4.742358,1.882232,-0.62165,
+ 0.925586,0.05083,-0.375109,4.697607,1.768061,-0.576663,
+ 0.45571,-0.00339,-0.890122,4.837331,2.235678,-0.479332,
+ -0.114527,0.103064,-0.988059,4.739441,2.299169,-0.369987,
+ 0.2189,0.87846,-0.424724,4.83289,2.262727,-0.283787,
+ 0.45571,-0.00339,-0.890122,4.837331,2.235678,-0.479332,
+ 0.2189,0.87846,-0.424724,4.83289,2.262727,-0.283787,
+ 0.373808,-0.059429,-0.9256,4.89385,2.220523,-0.417713,
+ 0.2189,0.87846,-0.424724,4.83289,2.262727,-0.283787,
+ -0.194126,0.280848,-0.939914,4.971394,2.146686,-0.224781,
+ 0.276212,-0.065585,-0.958856,4.995978,2.148785,-0.344534,
+ 0.2189,0.87846,-0.424724,4.83289,2.262727,-0.283787,
+ 0.276212,-0.065585,-0.958856,4.995978,2.148785,-0.344534,
+ 0.373808,-0.059429,-0.9256,4.89385,2.220523,-0.417713,
+ -0.194126,0.280848,-0.939914,4.971394,2.146686,-0.224781,
+ 0.742633,0.65679,-0.130853,5.072165,2.04363,-0.209228,
+ 0.122987,-0.006582,-0.992386,5.06084,2.053335,-0.309324,
+ -0.194126,0.280848,-0.939914,4.971394,2.146686,-0.224781,
+ 0.122987,-0.006582,-0.992386,5.06084,2.053335,-0.309324,
+ 0.276212,-0.065585,-0.958856,4.995978,2.148785,-0.344534,
+ 0.742633,0.65679,-0.130853,5.072165,2.04363,-0.209228,
+ 0.681964,0.386262,-0.621069,5.127157,1.942759,-0.211214,
+ 0.041586,0.068165,-0.996807,5.097062,1.954206,-0.328795,
+ 0.742633,0.65679,-0.130853,5.072165,2.04363,-0.209228,
+ 0.041586,0.068165,-0.996807,5.097062,1.954206,-0.328795,
+ 0.122987,-0.006582,-0.992386,5.06084,2.053335,-0.309324,
+ 0.681964,0.386262,-0.621069,5.127157,1.942759,-0.211214,
+ 0.584509,0.341142,-0.736187,5.152698,1.830661,-0.287042,
+ 0.035084,0.005692,-0.999368,5.105589,1.864086,-0.347113,
+ 0.681964,0.386262,-0.621069,5.127157,1.942759,-0.211214,
+ 0.035084,0.005692,-0.999368,5.105589,1.864086,-0.347113,
+ 0.041586,0.068165,-0.996807,5.097062,1.954206,-0.328795,
+ 0.035084,0.005692,-0.999368,5.105589,1.864086,-0.347113,
+ 0.584509,0.341142,-0.736187,5.152698,1.830661,-0.287042,
+ 0.577823,0.271654,-0.769626,5.133171,1.715563,-0.334258,
+ 0.035084,0.005692,-0.999368,5.105589,1.864086,-0.347113,
+ 0.577823,0.271654,-0.769626,5.133171,1.715563,-0.334258,
+ 0.269003,0.864361,-0.424874,5.058179,1.788186,-0.417387,
+ 0.269003,0.864361,-0.424874,5.058179,1.788186,-0.417387,
+ 0.577823,0.271654,-0.769626,5.133171,1.715563,-0.334258,
+ 0.237937,0.08172,-0.967837,5.103427,1.624404,-0.434275,
+ 0.269003,0.864361,-0.424874,5.058179,1.788186,-0.417387,
+ 0.237937,0.08172,-0.967837,5.103427,1.624404,-0.434275,
+ 0.532717,0.840798,-0.09629,5.019836,1.739907,-0.485562,
+ 0.532717,0.840798,-0.09629,5.019836,1.739907,-0.485562,
+ 0.237937,0.08172,-0.967837,5.103427,1.624404,-0.434275,
+ 0.198142,0.152918,-0.968171,4.982822,1.503071,-0.507606,
+ 0.532717,0.840798,-0.09629,5.019836,1.739907,-0.485562,
+ 0.198142,0.152918,-0.968171,4.982822,1.503071,-0.507606,
+ 0.722741,0.690989,0.01339,4.917973,1.68148,-0.544201,
+ 0.870384,0.492055,-0.017698,4.862636,1.684144,-0.570155,
+ 0.722741,0.690989,0.01339,4.917973,1.68148,-0.544201,
+ 0.198142,0.152918,-0.968171,4.982822,1.503071,-0.507606,
+ 0.870384,0.492055,-0.017698,4.862636,1.684144,-0.570155,
+ 0.198142,0.152918,-0.968171,4.982822,1.503071,-0.507606,
+ 0.198441,0.172024,-0.964898,4.927282,1.486953,-0.526327,
+ 0.870384,0.492055,-0.017698,4.862636,1.684144,-0.570155,
+ 0.198441,0.172024,-0.964898,4.927282,1.486953,-0.526327,
+ 0.204819,0.130792,-0.970022,4.79841,1.473149,-0.570618,
+ 0.947044,0.280641,-0.156039,4.752337,1.723388,-0.591296,
+ 0.870384,0.492055,-0.017698,4.862636,1.684144,-0.570155,
+ 0.204819,0.130792,-0.970022,4.79841,1.473149,-0.570618,
+ 0.947044,0.280641,-0.156039,4.752337,1.723388,-0.591296,
+ 0.204819,0.130792,-0.970022,4.79841,1.473149,-0.570618,
+ 0.154028,0.078449,-0.984947,4.715646,1.502195,-0.584339,
+ 0.925586,0.05083,-0.375109,4.697607,1.768061,-0.576663,
+ 0.947044,0.280641,-0.156039,4.752337,1.723388,-0.591296,
+ 0.154028,0.078449,-0.984947,4.715646,1.502195,-0.584339,
+ 0.925586,0.05083,-0.375109,4.697607,1.768061,-0.576663,
+ 0.154028,0.078449,-0.984947,4.715646,1.502195,-0.584339,
+ 0.032152,0.123743,-0.991793,4.615408,1.639641,-0.577768,
+ -0.013461,-0.014478,-0.999805,4.697024,1.862575,-0.604048,
+ 0.925586,0.05083,-0.375109,4.697607,1.768061,-0.576663,
+ 0.032152,0.123743,-0.991793,4.615408,1.639641,-0.577768,
+ -0.013461,-0.014478,-0.999805,4.697024,1.862575,-0.604048,
+ 0.032152,0.123743,-0.991793,4.615408,1.639641,-0.577768,
+ -0.077208,0.343417,-0.936004,4.560751,1.785154,-0.562428,
+ 0.510305,0.850999,-0.124054,4.551484,1.841749,-0.575191,
+ 0.667258,0.181112,-0.722471,4.688114,2.046378,-0.604518,
+ -0.013461,-0.014478,-0.999805,4.697024,1.862575,-0.604048,
+ 0.510305,0.850999,-0.124054,4.551484,1.841749,-0.575191,
+ -0.013461,-0.014478,-0.999805,4.697024,1.862575,-0.604048,
+ -0.077208,0.343417,-0.936004,4.560751,1.785154,-0.562428,
+ 0.561002,0.750769,-0.348745,4.533113,1.989009,-0.578975,
+ 0.667258,0.181112,-0.722471,4.688114,2.046378,-0.604518,
+ 0.510305,0.850999,-0.124054,4.551484,1.841749,-0.575191,
+ 0.719268,0.159441,-0.676189,4.636582,2.263383,-0.471997,
+ 0.766773,0.253147,-0.589894,4.74405,2.179337,-0.556057,
+ 0.667258,0.181112,-0.722471,4.688114,2.046378,-0.604518,
+ 0.719268,0.159441,-0.676189,4.636582,2.263383,-0.471997,
+ 0.667258,0.181112,-0.722471,4.688114,2.046378,-0.604518,
+ 0.328548,0.219459,-0.918637,4.561299,2.133066,-0.547248,
+ 0.328548,0.219459,-0.918637,4.561299,2.133066,-0.547248,
+ 0.667258,0.181112,-0.722471,4.688114,2.046378,-0.604518,
+ 0.561002,0.750769,-0.348745,4.533113,1.989009,-0.578975,
+ -0.989689,-0.143234,0,4.912303,2.162645,-0.00009,
+ -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
+ 0.742633,0.65679,-0.130853,5.072165,2.04363,-0.209228,
+ -0.989689,-0.143234,0,4.912303,2.162645,-0.00009,
+ 0.742633,0.65679,-0.130853,5.072165,2.04363,-0.209228,
+ -0.194126,0.280848,-0.939914,4.971394,2.146686,-0.224781,
+ -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
+ 0.444094,0.036128,-0.895251,5.156645,1.942902,-0.119993,
+ 0.681964,0.386262,-0.621069,5.127157,1.942759,-0.211214,
+ -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
+ 0.681964,0.386262,-0.621069,5.127157,1.942759,-0.211214,
+ 0.742633,0.65679,-0.130853,5.072165,2.04363,-0.209228,
+ 0.444094,0.036128,-0.895251,5.156645,1.942902,-0.119993,
+ 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
+ 0.584509,0.341142,-0.736187,5.152698,1.830661,-0.287042,
+ 0.444094,0.036128,-0.895251,5.156645,1.942902,-0.119993,
+ 0.584509,0.341142,-0.736187,5.152698,1.830661,-0.287042,
+ 0.681964,0.386262,-0.621069,5.127157,1.942759,-0.211214,
+ 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
+ 0.347878,0.028988,-0.937092,5.216855,1.636645,-0.279797,
+ 0.577823,0.271654,-0.769626,5.133171,1.715563,-0.334258,
+ 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
+ 0.577823,0.271654,-0.769626,5.133171,1.715563,-0.334258,
+ 0.584509,0.341142,-0.736187,5.152698,1.830661,-0.287042,
+ 0.577823,0.271654,-0.769626,5.133171,1.715563,-0.334258,
+ 0.347878,0.028988,-0.937092,5.216855,1.636645,-0.279797,
+ 0.282492,0.026082,-0.958915,5.233176,1.442459,-0.362988,
+ 0.577823,0.271654,-0.769626,5.133171,1.715563,-0.334258,
+ 0.282492,0.026082,-0.958915,5.233176,1.442459,-0.362988,
+ 0.237937,0.08172,-0.967837,5.103427,1.624404,-0.434275,
+ 0.032152,0.123743,-0.991793,4.615408,1.639641,-0.577768,
+ 0.154028,0.078449,-0.984947,4.715646,1.502195,-0.584339,
+ 0.380651,0.443224,-0.811577,4.679116,1.438434,-0.589658,
+ 0.032152,0.123743,-0.991793,4.615408,1.639641,-0.577768,
+ 0.380651,0.443224,-0.811577,4.679116,1.438434,-0.589658,
+ 0.362705,0.428702,-0.827442,4.596478,1.512987,-0.598982,
+ 0.032152,0.123743,-0.991793,4.615408,1.639641,-0.577768,
+ 0.362705,0.428702,-0.827442,4.596478,1.512987,-0.598982,
+ 0.332757,0.286207,-0.898531,4.560024,1.604023,-0.589333,
+ -0.077208,0.343417,-0.936004,4.560751,1.785154,-0.562428,
+ 0.032152,0.123743,-0.991793,4.615408,1.639641,-0.577768,
+ 0.332757,0.286207,-0.898531,4.560024,1.604023,-0.589333,
+ -0.077208,0.343417,-0.936004,4.560751,1.785154,-0.562428,
+ 0.332757,0.286207,-0.898531,4.560024,1.604023,-0.589333,
+ 0.302715,0.058971,-0.951255,4.477781,1.687858,-0.597407,
+ 0.510305,0.850999,-0.124054,4.551484,1.841749,-0.575191,
+ -0.077208,0.343417,-0.936004,4.560751,1.785154,-0.562428,
+ 0.302715,0.058971,-0.951255,4.477781,1.687858,-0.597407,
+ 0.510305,0.850999,-0.124054,4.551484,1.841749,-0.575191,
+ 0.302715,0.058971,-0.951255,4.477781,1.687858,-0.597407,
+ 0.347794,0.132396,-0.928176,4.459682,1.778884,-0.588185,
+ 0.36359,0.089346,-0.927264,4.43261,1.878873,-0.577888,
+ 0.561002,0.750769,-0.348745,4.533113,1.989009,-0.578975,
+ 0.510305,0.850999,-0.124054,4.551484,1.841749,-0.575191,
+ 0.36359,0.089346,-0.927264,4.43261,1.878873,-0.577888,
+ 0.510305,0.850999,-0.124054,4.551484,1.841749,-0.575191,
+ 0.347794,0.132396,-0.928176,4.459682,1.778884,-0.588185,
+ 0.361081,-0.056526,-0.93082,4.43302,2.024714,-0.563794,
+ 0.328548,0.219459,-0.918637,4.561299,2.133066,-0.547248,
+ 0.561002,0.750769,-0.348745,4.533113,1.989009,-0.578975,
+ 0.361081,-0.056526,-0.93082,4.43302,2.024714,-0.563794,
+ 0.561002,0.750769,-0.348745,4.533113,1.989009,-0.578975,
+ 0.36359,0.089346,-0.927264,4.43261,1.878873,-0.577888,
+ 0.337014,-0.030018,-0.941021,4.634996,2.369115,-0.140117,
+ -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
+ 0.2189,0.87846,-0.424724,4.83289,2.262727,-0.283787,
+ 0.337014,-0.030018,-0.941021,4.634996,2.369115,-0.140117,
+ 0.2189,0.87846,-0.424724,4.83289,2.262727,-0.283787,
+ -0.114527,0.103064,-0.988059,4.739441,2.299169,-0.369987,
+ 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
+ 0.337014,-0.030018,-0.941021,4.634996,2.369115,-0.140117,
+ -0.114527,0.103064,-0.988059,4.739441,2.299169,-0.369987,
+ 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
+ -0.114527,0.103064,-0.988059,4.739441,2.299169,-0.369987,
+ 0.719268,0.159441,-0.676189,4.636582,2.263383,-0.471997,
+ 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
+ 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
+ 0.719268,0.159441,-0.676189,4.636582,2.263383,-0.471997,
+ 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
+ 0.719268,0.159441,-0.676189,4.636582,2.263383,-0.471997,
+ 0.328548,0.219459,-0.918637,4.561299,2.133066,-0.547248,
+ 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
+ 0.328548,0.219459,-0.918637,4.561299,2.133066,-0.547248,
+ 0.196849,0.14562,-0.969559,4.389484,2.190421,-0.47332,
+ 0.196849,0.14562,-0.969559,4.389484,2.190421,-0.47332,
+ 0.328548,0.219459,-0.918637,4.561299,2.133066,-0.547248,
+ 0.361081,-0.056526,-0.93082,4.43302,2.024714,-0.563794,
+ 0.237937,0.08172,-0.967837,5.103427,1.624404,-0.434275,
+ 0.282492,0.026082,-0.958915,5.233176,1.442459,-0.362988,
+ 0.210495,0.185422,-0.959849,5.223191,1.371491,-0.388069,
+ 0.237937,0.08172,-0.967837,5.103427,1.624404,-0.434275,
+ 0.210495,0.185422,-0.959849,5.223191,1.371491,-0.388069,
+ 0.198142,0.152918,-0.968171,4.982822,1.503071,-0.507606,
+ 0.198142,0.152918,-0.968171,4.982822,1.503071,-0.507606,
+ 0.210495,0.185422,-0.959849,5.223191,1.371491,-0.388069,
+ 0.154687,0.171026,-0.973048,5.158322,1.23677,-0.418043,
+ 0.198142,0.152918,-0.968171,4.982822,1.503071,-0.507606,
+ 0.154687,0.171026,-0.973048,5.158322,1.23677,-0.418043,
+ 0.198441,0.172024,-0.964898,4.927282,1.486953,-0.526327,
+ 0.198441,0.172024,-0.964898,4.927282,1.486953,-0.526327,
+ 0.154687,0.171026,-0.973048,5.158322,1.23677,-0.418043,
+ -0.03359,0.173471,-0.984266,4.95536,1.236724,-0.50523,
+ 0.198441,0.172024,-0.964898,4.927282,1.486953,-0.526327,
+ -0.03359,0.173471,-0.984266,4.95536,1.236724,-0.50523,
+ 0.204819,0.130792,-0.970022,4.79841,1.473149,-0.570618,
+ 0.204819,0.130792,-0.970022,4.79841,1.473149,-0.570618,
+ -0.03359,0.173471,-0.984266,4.95536,1.236724,-0.50523,
+ 0.289202,0.572304,-0.767353,4.761601,1.363013,-0.57137,
+ 0.204819,0.130792,-0.970022,4.79841,1.473149,-0.570618,
+ 0.289202,0.572304,-0.767353,4.761601,1.363013,-0.57137,
+ 0.154028,0.078449,-0.984947,4.715646,1.502195,-0.584339,
+ 0.154028,0.078449,-0.984947,4.715646,1.502195,-0.584339,
+ 0.289202,0.572304,-0.767353,4.761601,1.363013,-0.57137,
+ 0.380651,0.443224,-0.811577,4.679116,1.438434,-0.589658,
+ -0.998597,-0.052951,0,5.177545,1.932323,0.000214,
+ 0.243507,0.533327,-0.810103,5.321136,1.795562,-0.119606,
+ 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
+ -0.998597,-0.052951,0,5.177545,1.932323,0.000214,
+ 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
+ 0.444094,0.036128,-0.895251,5.156645,1.942902,-0.119993,
+ -0.998597,-0.052951,0,5.177545,1.932323,0.000214,
+ -0.99798,-0.063521,0,5.378289,1.768448,0.000441,
+ 0.243507,0.533327,-0.810103,5.321136,1.795562,-0.119606,
+ -0.99798,-0.063521,0,5.378289,1.768448,0.000441,
+ -0.925873,-0.377836,0,5.424281,1.721152,0.000496,
+ 0.168187,0.30029,-0.938903,5.421809,1.685349,-0.123555,
+ -0.99798,-0.063521,0,5.378289,1.768448,0.000441,
+ 0.168187,0.30029,-0.938903,5.421809,1.685349,-0.123555,
+ 0.243507,0.533327,-0.810103,5.321136,1.795562,-0.119606,
+ 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
+ 0.243507,0.533327,-0.810103,5.321136,1.795562,-0.119606,
+ 0.168187,0.30029,-0.938903,5.421809,1.685349,-0.123555,
+ 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
+ 0.168187,0.30029,-0.938903,5.421809,1.685349,-0.123555,
+ 0.112152,0.130705,-0.985057,5.383208,1.619661,-0.202452,
+ 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
+ 0.112152,0.130705,-0.985057,5.383208,1.619661,-0.202452,
+ 0.069483,0.206284,-0.976022,5.373133,1.541142,-0.246712,
+ 0.458202,0.052175,-0.887316,5.218821,1.803552,-0.199306,
+ 0.069483,0.206284,-0.976022,5.373133,1.541142,-0.246712,
+ 0.347878,0.028988,-0.937092,5.216855,1.636645,-0.279797,
+ 0.347878,0.028988,-0.937092,5.216855,1.636645,-0.279797,
+ 0.069483,0.206284,-0.976022,5.373133,1.541142,-0.246712,
+ 0.054287,0.055115,-0.997003,5.334328,1.402713,-0.332639,
+ 0.347878,0.028988,-0.937092,5.216855,1.636645,-0.279797,
+ 0.054287,0.055115,-0.997003,5.334328,1.402713,-0.332639,
+ 0.282492,0.026082,-0.958915,5.233176,1.442459,-0.362988,
+ 0.282492,0.026082,-0.958915,5.233176,1.442459,-0.362988,
+ 0.054287,0.055115,-0.997003,5.334328,1.402713,-0.332639,
+ 0.235746,0.648569,-0.723728,5.296963,1.322443,-0.357984,
+ 0.282492,0.026082,-0.958915,5.233176,1.442459,-0.362988,
+ 0.235746,0.648569,-0.723728,5.296963,1.322443,-0.357984,
+ 0.210495,0.185422,-0.959849,5.223191,1.371491,-0.388069,
+ 0.210495,0.185422,-0.959849,5.223191,1.371491,-0.388069,
+ 0.235746,0.648569,-0.723728,5.296963,1.322443,-0.357984,
+ 0.101496,0.616609,-0.780699,5.260653,1.184173,-0.352062,
+ 0.210495,0.185422,-0.959849,5.223191,1.371491,-0.388069,
+ 0.101496,0.616609,-0.780699,5.260653,1.184173,-0.352062,
+ 0.154687,0.171026,-0.973048,5.158322,1.23677,-0.418043,
+ 0.154687,0.171026,-0.973048,5.158322,1.23677,-0.418043,
+ 0.101496,0.616609,-0.780699,5.260653,1.184173,-0.352062,
+ 0.043397,0.435461,-0.899161,5.250485,1.123029,-0.385234,
+ 0.154687,0.171026,-0.973048,5.158322,1.23677,-0.418043,
+ 0.043397,0.435461,-0.899161,5.250485,1.123029,-0.385234,
+ 0.012421,0.392537,-0.919653,4.991713,1.163096,-0.504149,
+ 0.154687,0.171026,-0.973048,5.158322,1.23677,-0.418043,
+ 0.012421,0.392537,-0.919653,4.991713,1.163096,-0.504149,
+ -0.03359,0.173471,-0.984266,4.95536,1.236724,-0.50523,
+ 0.289202,0.572304,-0.767353,4.761601,1.363013,-0.57137,
+ -0.03359,0.173471,-0.984266,4.95536,1.236724,-0.50523,
+ 0.012421,0.392537,-0.919653,4.991713,1.163096,-0.504149,
+ 0.289202,0.572304,-0.767353,4.761601,1.363013,-0.57137,
+ 0.012421,0.392537,-0.919653,4.991713,1.163096,-0.504149,
+ 0.067357,0.280762,-0.957411,4.733657,1.227371,-0.592883,
+ 0.380651,0.443224,-0.811577,4.679116,1.438434,-0.589658,
+ 0.289202,0.572304,-0.767353,4.761601,1.363013,-0.57137,
+ 0.067357,0.280762,-0.957411,4.733657,1.227371,-0.592883,
+ 0.380651,0.443224,-0.811577,4.679116,1.438434,-0.589658,
+ 0.067357,0.280762,-0.957411,4.733657,1.227371,-0.592883,
+ -0.026366,0.234118,-0.971851,4.641547,1.285422,-0.622034,
+ 0.362705,0.428702,-0.827442,4.596478,1.512987,-0.598982,
+ 0.380651,0.443224,-0.811577,4.679116,1.438434,-0.589658,
+ -0.026366,0.234118,-0.971851,4.641547,1.285422,-0.622034,
+ 0.362705,0.428702,-0.827442,4.596478,1.512987,-0.598982,
+ -0.026366,0.234118,-0.971851,4.641547,1.285422,-0.622034,
+ 0.184871,0.227139,-0.956154,4.522247,1.398278,-0.644892,
+ 0.332757,0.286207,-0.898531,4.560024,1.604023,-0.589333,
+ 0.362705,0.428702,-0.827442,4.596478,1.512987,-0.598982,
+ 0.184871,0.227139,-0.956154,4.522247,1.398278,-0.644892,
+ 0.332757,0.286207,-0.898531,4.560024,1.604023,-0.589333,
+ 0.184871,0.227139,-0.956154,4.522247,1.398278,-0.644892,
+ -0.034875,0.308036,-0.950735,4.430999,1.535753,-0.638888,
+ 0.302715,0.058971,-0.951255,4.477781,1.687858,-0.597407,
+ 0.332757,0.286207,-0.898531,4.560024,1.604023,-0.589333,
+ -0.034875,0.308036,-0.950735,4.430999,1.535753,-0.638888,
+ 0.302715,0.058971,-0.951255,4.477781,1.687858,-0.597407,
+ -0.034875,0.308036,-0.950735,4.430999,1.535753,-0.638888,
+ -0.148853,0.101172,-0.98367,4.404221,1.662433,-0.61661,
+ 0.504832,0.844097,-0.180678,4.38638,1.770868,-0.596666,
+ 0.347794,0.132396,-0.928176,4.459682,1.778884,-0.588185,
+ 0.302715,0.058971,-0.951255,4.477781,1.687858,-0.597407,
+ 0.504832,0.844097,-0.180678,4.38638,1.770868,-0.596666,
+ 0.302715,0.058971,-0.951255,4.477781,1.687858,-0.597407,
+ -0.148853,0.101172,-0.98367,4.404221,1.662433,-0.61661,
+ 0.615047,0.769185,-0.17341,4.377095,1.871713,-0.595743,
+ 0.36359,0.089346,-0.927264,4.43261,1.878873,-0.577888,
+ 0.347794,0.132396,-0.928176,4.459682,1.778884,-0.588185,
+ 0.615047,0.769185,-0.17341,4.377095,1.871713,-0.595743,
+ 0.347794,0.132396,-0.928176,4.459682,1.778884,-0.588185,
+ 0.504832,0.844097,-0.180678,4.38638,1.770868,-0.596666,
+ -0.925873,-0.377836,0,5.424281,1.721152,0.000496,
+ 0.027992,0.999608,0,5.588763,1.573846,0.000686,
+ 0.550962,0.627632,-0.550018,5.604888,1.546091,-0.113773,
+ -0.925873,-0.377836,0,5.424281,1.721152,0.000496,
+ 0.550962,0.627632,-0.550018,5.604888,1.546091,-0.113773,
+ 0.168187,0.30029,-0.938903,5.421809,1.685349,-0.123555,
+ 0.168187,0.30029,-0.938903,5.421809,1.685349,-0.123555,
+ 0.550962,0.627632,-0.550018,5.604888,1.546091,-0.113773,
+ 0.477288,0.71618,-0.509197,5.566339,1.498677,-0.190905,
+ 0.168187,0.30029,-0.938903,5.421809,1.685349,-0.123555,
+ 0.477288,0.71618,-0.509197,5.566339,1.498677,-0.190905,
+ 0.112152,0.130705,-0.985057,5.383208,1.619661,-0.202452,
+ 0.112152,0.130705,-0.985057,5.383208,1.619661,-0.202452,
+ 0.477288,0.71618,-0.509197,5.566339,1.498677,-0.190905,
+ 0.887994,0.419811,-0.187682,5.528186,1.44018,-0.250666,
+ 0.112152,0.130705,-0.985057,5.383208,1.619661,-0.202452,
+ 0.887994,0.419811,-0.187682,5.528186,1.44018,-0.250666,
+ 0.069483,0.206284,-0.976022,5.373133,1.541142,-0.246712,
+ 0.069483,0.206284,-0.976022,5.373133,1.541142,-0.246712,
+ 0.887994,0.419811,-0.187682,5.528186,1.44018,-0.250666,
+ 0.749779,0.312647,-0.583167,5.471928,1.345179,-0.313899,
+ 0.069483,0.206284,-0.976022,5.373133,1.541142,-0.246712,
+ 0.749779,0.312647,-0.583167,5.471928,1.345179,-0.313899,
+ 0.054287,0.055115,-0.997003,5.334328,1.402713,-0.332639,
+ 0.054287,0.055115,-0.997003,5.334328,1.402713,-0.332639,
+ 0.749779,0.312647,-0.583167,5.471928,1.345179,-0.313899,
+ 0.358075,0.480709,-0.800438,5.425783,1.264372,-0.329687,
+ 0.054287,0.055115,-0.997003,5.334328,1.402713,-0.332639,
+ 0.358075,0.480709,-0.800438,5.425783,1.264372,-0.329687,
+ 0.235746,0.648569,-0.723728,5.296963,1.322443,-0.357984,
+ 0.235746,0.648569,-0.723728,5.296963,1.322443,-0.357984,
+ 0.358075,0.480709,-0.800438,5.425783,1.264372,-0.329687,
+ 0.524848,0.480957,-0.702293,5.397967,1.174238,-0.346802,
+ 0.235746,0.648569,-0.723728,5.296963,1.322443,-0.357984,
+ 0.524848,0.480957,-0.702293,5.397967,1.174238,-0.346802,
+ 0.101496,0.616609,-0.780699,5.260653,1.184173,-0.352062,
+ 0.101496,0.616609,-0.780699,5.260653,1.184173,-0.352062,
+ 0.524848,0.480957,-0.702293,5.397967,1.174238,-0.346802,
+ 0.72603,0.248277,-0.641279,5.388455,1.119419,-0.351883,
+ 0.101496,0.616609,-0.780699,5.260653,1.184173,-0.352062,
+ 0.72603,0.248277,-0.641279,5.388455,1.119419,-0.351883,
+ 0.043397,0.435461,-0.899161,5.250485,1.123029,-0.385234,
+ 0.987857,-0.047506,-0.147925,5.687035,1.499636,-0.110765,
+ 0.936734,-0.314344,0.154001,5.741781,1.463956,-0.124891,
+ 0.831976,-0.511655,0.214534,5.730427,1.435668,-0.209848,
+ 0.987857,-0.047506,-0.147925,5.687035,1.499636,-0.110765,
+ 0.831976,-0.511655,0.214534,5.730427,1.435668,-0.209848,
+ 0.798302,-0.559383,0.22317,5.685194,1.452202,-0.188749,
+ 0.744254,-0.654161,-0.134758,5.710154,1.360653,-0.290072,
+ 0.884602,-0.366981,-0.287755,5.608974,1.317869,-0.319719,
+ 0.707709,-0.687035,-0.164711,5.647186,1.394606,-0.257833,
+ 0.884602,-0.366981,-0.287755,5.608974,1.317869,-0.319719,
+ 0.744254,-0.654161,-0.134758,5.710154,1.360653,-0.290072,
+ 0.364327,0.145753,-0.919795,5.681726,1.282503,-0.333871,
+ 0.884602,-0.366981,-0.287755,5.608974,1.317869,-0.319719,
+ 0.364327,0.145753,-0.919795,5.681726,1.282503,-0.333871,
+ 0.777215,-0.378098,-0.50297,5.563253,1.235295,-0.317238,
+ 0.777215,-0.378098,-0.50297,5.563253,1.235295,-0.317238,
+ 0.364327,0.145753,-0.919795,5.681726,1.282503,-0.333871,
+ 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
+ 0.777215,-0.378098,-0.50297,5.563253,1.235295,-0.317238,
+ 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
+ 0.348619,-0.077188,-0.934081,5.580797,1.174135,-0.351054,
+ -0.026558,-0.999647,0,5.680007,1.510009,0.000786,
+ 0.987857,-0.047506,-0.147925,5.687035,1.499636,-0.110765,
+ 0.550962,0.627632,-0.550018,5.604888,1.546091,-0.113773,
+ -0.026558,-0.999647,0,5.680007,1.510009,0.000786,
+ 0.550962,0.627632,-0.550018,5.604888,1.546091,-0.113773,
+ 0.027992,0.999608,0,5.588763,1.573846,0.000686,
+ 0.550962,0.627632,-0.550018,5.604888,1.546091,-0.113773,
+ 0.987857,-0.047506,-0.147925,5.687035,1.499636,-0.110765,
+ 0.798302,-0.559383,0.22317,5.685194,1.452202,-0.188749,
+ 0.550962,0.627632,-0.550018,5.604888,1.546091,-0.113773,
+ 0.798302,-0.559383,0.22317,5.685194,1.452202,-0.188749,
+ 0.477288,0.71618,-0.509197,5.566339,1.498677,-0.190905,
+ 0.798302,-0.559383,0.22317,5.685194,1.452202,-0.188749,
+ 0.707709,-0.687035,-0.164711,5.647186,1.394606,-0.257833,
+ 0.887994,0.419811,-0.187682,5.528186,1.44018,-0.250666,
+ 0.798302,-0.559383,0.22317,5.685194,1.452202,-0.188749,
+ 0.887994,0.419811,-0.187682,5.528186,1.44018,-0.250666,
+ 0.477288,0.71618,-0.509197,5.566339,1.498677,-0.190905,
+ 0.887994,0.419811,-0.187682,5.528186,1.44018,-0.250666,
+ 0.707709,-0.687035,-0.164711,5.647186,1.394606,-0.257833,
+ 0.884602,-0.366981,-0.287755,5.608974,1.317869,-0.319719,
+ 0.887994,0.419811,-0.187682,5.528186,1.44018,-0.250666,
+ 0.884602,-0.366981,-0.287755,5.608974,1.317869,-0.319719,
+ 0.749779,0.312647,-0.583167,5.471928,1.345179,-0.313899,
+ 0.749779,0.312647,-0.583167,5.471928,1.345179,-0.313899,
+ 0.884602,-0.366981,-0.287755,5.608974,1.317869,-0.319719,
+ 0.777215,-0.378098,-0.50297,5.563253,1.235295,-0.317238,
+ 0.749779,0.312647,-0.583167,5.471928,1.345179,-0.313899,
+ 0.777215,-0.378098,-0.50297,5.563253,1.235295,-0.317238,
+ 0.358075,0.480709,-0.800438,5.425783,1.264372,-0.329687,
+ 0.358075,0.480709,-0.800438,5.425783,1.264372,-0.329687,
+ 0.777215,-0.378098,-0.50297,5.563253,1.235295,-0.317238,
+ 0.348619,-0.077188,-0.934081,5.580797,1.174135,-0.351054,
+ 0.358075,0.480709,-0.800438,5.425783,1.264372,-0.329687,
+ 0.348619,-0.077188,-0.934081,5.580797,1.174135,-0.351054,
+ 0.524848,0.480957,-0.702293,5.397967,1.174238,-0.346802,
+ 0.524848,0.480957,-0.702293,5.397967,1.174238,-0.346802,
+ 0.348619,-0.077188,-0.934081,5.580797,1.174135,-0.351054,
+ 0.802898,-0.287005,-0.522477,5.47963,1.11131,-0.364188,
+ 0.524848,0.480957,-0.702293,5.397967,1.174238,-0.346802,
+ 0.802898,-0.287005,-0.522477,5.47963,1.11131,-0.364188,
+ 0.72603,0.248277,-0.641279,5.388455,1.119419,-0.351883,
+ 0.901575,-0.270544,-0.337593,5.842092,1.427708,-0.130724,
+ 0.461068,-0.584089,-0.668024,5.915025,1.382159,-0.13682,
+ 0.194103,-0.204609,-0.959406,5.886832,1.385674,-0.172365,
+ 0.901575,-0.270544,-0.337593,5.842092,1.427708,-0.130724,
+ 0.194103,-0.204609,-0.959406,5.886832,1.385674,-0.172365,
+ 0.286794,0.030057,-0.957521,5.813217,1.415581,-0.195261,
+ -0.016213,0.999869,0,5.908842,1.388968,0.001026,
+ 0.663563,0.74812,0.000025,5.963117,1.307775,0.001098,
+ 0.259896,0.111139,-0.95922,5.979357,1.325532,-0.125337,
+ -0.016213,0.999869,0,5.908842,1.388968,0.001026,
+ 0.259896,0.111139,-0.95922,5.979357,1.325532,-0.125337,
+ 0.461068,-0.584089,-0.668024,5.915025,1.382159,-0.13682,
+ 0.461068,-0.584089,-0.668024,5.915025,1.382159,-0.13682,
+ 0.259896,0.111139,-0.95922,5.979357,1.325532,-0.125337,
+ 0.230527,0.277297,-0.932718,5.941384,1.330818,-0.178936,
+ 0.461068,-0.584089,-0.668024,5.915025,1.382159,-0.13682,
+ 0.230527,0.277297,-0.932718,5.941384,1.330818,-0.178936,
+ 0.194103,-0.204609,-0.959406,5.886832,1.385674,-0.172365,
+ 0.694651,0.719347,0.000019,5.743997,1.482739,0.000851,
+ 0.569495,0.821995,-0.000075,5.835498,1.43628,0.000946,
+ 0.901575,-0.270544,-0.337593,5.842092,1.427708,-0.130724,
+ 0.694651,0.719347,0.000019,5.743997,1.482739,0.000851,
+ 0.901575,-0.270544,-0.337593,5.842092,1.427708,-0.130724,
+ 0.936734,-0.314344,0.154001,5.741781,1.463956,-0.124891,
+ 0.936734,-0.314344,0.154001,5.741781,1.463956,-0.124891,
+ 0.901575,-0.270544,-0.337593,5.842092,1.427708,-0.130724,
+ 0.286794,0.030057,-0.957521,5.813217,1.415581,-0.195261,
+ 0.936734,-0.314344,0.154001,5.741781,1.463956,-0.124891,
+ 0.286794,0.030057,-0.957521,5.813217,1.415581,-0.195261,
+ 0.831976,-0.511655,0.214534,5.730427,1.435668,-0.209848,
+ 0.831976,-0.511655,0.214534,5.730427,1.435668,-0.209848,
+ 0.286794,0.030057,-0.957521,5.813217,1.415581,-0.195261,
+ 0.188634,-0.17518,-0.966297,5.783731,1.341471,-0.28459,
+ 0.831976,-0.511655,0.214534,5.730427,1.435668,-0.209848,
+ 0.188634,-0.17518,-0.966297,5.783731,1.341471,-0.28459,
+ 0.744254,-0.654161,-0.134758,5.710154,1.360653,-0.290072,
+ 0.286794,0.030057,-0.957521,5.813217,1.415581,-0.195261,
+ 0.194103,-0.204609,-0.959406,5.886832,1.385674,-0.172365,
+ 0.244568,-0.04472,-0.9686,5.847989,1.311569,-0.261476,
+ 0.286794,0.030057,-0.957521,5.813217,1.415581,-0.195261,
+ 0.244568,-0.04472,-0.9686,5.847989,1.311569,-0.261476,
+ 0.188634,-0.17518,-0.966297,5.783731,1.341471,-0.28459,
+ 0.194103,-0.204609,-0.959406,5.886832,1.385674,-0.172365,
+ 0.230527,0.277297,-0.932718,5.941384,1.330818,-0.178936,
+ 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
+ 0.194103,-0.204609,-0.959406,5.886832,1.385674,-0.172365,
+ 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
+ 0.244568,-0.04472,-0.9686,5.847989,1.311569,-0.261476,
+ 0.259896,0.111139,-0.95922,5.979357,1.325532,-0.125337,
+ -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
+ 0.230527,0.277297,-0.932718,5.941384,1.330818,-0.178936,
+ 0.663563,0.74812,0.000025,5.963117,1.307775,0.001098,
+ 0.617634,0.786466,0.000062,5.963527,1.232407,0.001121,
+ -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
+ 0.663563,0.74812,0.000025,5.963117,1.307775,0.001098,
+ -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
+ 0.259896,0.111139,-0.95922,5.979357,1.325532,-0.125337,
+ 0.230527,0.277297,-0.932718,5.941384,1.330818,-0.178936,
+ -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
+ 0.193495,-0.385604,-0.902147,5.931474,1.233483,-0.215613,
+ -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
+ 0.617634,0.786466,0.000062,5.963527,1.232407,0.001121,
+ 0.651313,0.75881,-0.000286,5.92711,1.131195,0.001118,
+ -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
+ 0.651313,0.75881,-0.000286,5.92711,1.131195,0.001118,
+ -0.2127,-0.171223,-0.961999,5.961686,1.110978,-0.090324,
+ 0.651313,0.75881,-0.000286,5.92711,1.131195,0.001118,
+ 0.909103,0.416568,-0.001454,5.908782,1.066916,0.001121,
+ 0.054456,-0.320459,-0.945696,5.934596,1.054796,-0.077039,
+ 0.651313,0.75881,-0.000286,5.92711,1.131195,0.001118,
+ 0.054456,-0.320459,-0.945696,5.934596,1.054796,-0.077039,
+ -0.2127,-0.171223,-0.961999,5.961686,1.110978,-0.090324,
+ -0.2127,-0.171223,-0.961999,5.961686,1.110978,-0.090324,
+ 0.054456,-0.320459,-0.945696,5.934596,1.054796,-0.077039,
+ 0.169576,-0.140705,-0.975421,5.923808,1.025283,-0.153084,
+ -0.2127,-0.171223,-0.961999,5.961686,1.110978,-0.090324,
+ 0.169576,-0.140705,-0.975421,5.923808,1.025283,-0.153084,
+ 0.111896,-0.605741,-0.787755,5.950684,1.082725,-0.175648,
+ 0.063422,-0.817077,-0.573029,5.800778,1.078596,-0.31945,
+ 0.16399,-0.527952,-0.833291,5.884856,1.062202,-0.249545,
+ 0.120494,-0.516376,-0.847843,5.85775,0.997026,-0.236768,
+ 0.063422,-0.817077,-0.573029,5.800778,1.078596,-0.31945,
+ 0.120494,-0.516376,-0.847843,5.85775,0.997026,-0.236768,
+ 0.396941,-0.593504,-0.700137,5.755282,1.004149,-0.307505,
+ 0.063422,-0.817077,-0.573029,5.800778,1.078596,-0.31945,
+ 0.396941,-0.593504,-0.700137,5.755282,1.004149,-0.307505,
+ 0.010578,-0.902776,-0.429981,5.763952,1.062109,-0.338641,
+ 0.051115,-0.906355,-0.419414,5.912147,1.117911,-0.254197,
+ 0.223936,-0.919046,-0.324355,5.959462,1.157227,-0.187097,
+ 0.111896,-0.605741,-0.787755,5.950684,1.082725,-0.175648,
+ 0.051115,-0.906355,-0.419414,5.912147,1.117911,-0.254197,
+ 0.111896,-0.605741,-0.787755,5.950684,1.082725,-0.175648,
+ 0.16399,-0.527952,-0.833291,5.884856,1.062202,-0.249545,
+ 0.16399,-0.527952,-0.833291,5.884856,1.062202,-0.249545,
+ 0.111896,-0.605741,-0.787755,5.950684,1.082725,-0.175648,
+ 0.169576,-0.140705,-0.975421,5.923808,1.025283,-0.153084,
+ 0.16399,-0.527952,-0.833291,5.884856,1.062202,-0.249545,
+ 0.169576,-0.140705,-0.975421,5.923808,1.025283,-0.153084,
+ 0.120494,-0.516376,-0.847843,5.85775,0.997026,-0.236768,
+ 0.063422,-0.817077,-0.573029,5.800778,1.078596,-0.31945,
+ 0.161367,-0.802085,-0.574996,5.837875,1.141493,-0.305184,
+ 0.051115,-0.906355,-0.419414,5.912147,1.117911,-0.254197,
+ 0.063422,-0.817077,-0.573029,5.800778,1.078596,-0.31945,
+ 0.051115,-0.906355,-0.419414,5.912147,1.117911,-0.254197,
+ 0.16399,-0.527952,-0.833291,5.884856,1.062202,-0.249545,
+ 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
+ 0.218068,-0.756332,-0.616772,5.77341,1.225861,-0.323025,
+ 0.161367,-0.802085,-0.574996,5.837875,1.141493,-0.305184,
+ 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
+ 0.161367,-0.802085,-0.574996,5.837875,1.141493,-0.305184,
+ 0.063422,-0.817077,-0.573029,5.800778,1.078596,-0.31945,
+ 0.364327,0.145753,-0.919795,5.681726,1.282503,-0.333871,
+ 0.725751,-0.657941,-0.200998,5.764774,1.279824,-0.308562,
+ 0.218068,-0.756332,-0.616772,5.77341,1.225861,-0.323025,
+ 0.364327,0.145753,-0.919795,5.681726,1.282503,-0.333871,
+ 0.218068,-0.756332,-0.616772,5.77341,1.225861,-0.323025,
+ 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
+ 0.744254,-0.654161,-0.134758,5.710154,1.360653,-0.290072,
+ 0.188634,-0.17518,-0.966297,5.783731,1.341471,-0.28459,
+ 0.725751,-0.657941,-0.200998,5.764774,1.279824,-0.308562,
+ 0.744254,-0.654161,-0.134758,5.710154,1.360653,-0.290072,
+ 0.725751,-0.657941,-0.200998,5.764774,1.279824,-0.308562,
+ 0.364327,0.145753,-0.919795,5.681726,1.282503,-0.333871,
+ 0.17011,-0.985049,0.027217,5.690122,1.092917,-0.37085,
+ 0.010578,-0.902776,-0.429981,5.763952,1.062109,-0.338641,
+ 0.231006,-0.859096,-0.456717,5.681086,1.054964,-0.35586,
+ 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
+ 0.063422,-0.817077,-0.573029,5.800778,1.078596,-0.31945,
+ 0.010578,-0.902776,-0.429981,5.763952,1.062109,-0.338641,
+ 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
+ 0.010578,-0.902776,-0.429981,5.763952,1.062109,-0.338641,
+ 0.17011,-0.985049,0.027217,5.690122,1.092917,-0.37085,
+ 0.348619,-0.077188,-0.934081,5.580797,1.174135,-0.351054,
+ 0.612046,-0.714077,-0.339844,5.672187,1.164767,-0.35408,
+ 0.17011,-0.985049,0.027217,5.690122,1.092917,-0.37085,
+ 0.348619,-0.077188,-0.934081,5.580797,1.174135,-0.351054,
+ 0.17011,-0.985049,0.027217,5.690122,1.092917,-0.37085,
+ 0.108306,-0.808441,-0.578527,5.598282,1.094735,-0.386994,
+ 0.348619,-0.077188,-0.934081,5.580797,1.174135,-0.351054,
+ 0.108306,-0.808441,-0.578527,5.598282,1.094735,-0.386994,
+ 0.802898,-0.287005,-0.522477,5.47963,1.11131,-0.364188,
+ 0.802898,-0.287005,-0.522477,5.47963,1.11131,-0.364188,
+ 0.108306,-0.808441,-0.578527,5.598282,1.094735,-0.386994,
+ 0.155351,-0.987262,-0.034337,5.470775,1.009574,-0.355371,
+ 0.108306,-0.808441,-0.578527,5.598282,1.094735,-0.386994,
+ 0.17011,-0.985049,0.027217,5.690122,1.092917,-0.37085,
+ 0.231006,-0.859096,-0.456717,5.681086,1.054964,-0.35586,
+ 0.108306,-0.808441,-0.578527,5.598282,1.094735,-0.386994,
+ 0.231006,-0.859096,-0.456717,5.681086,1.054964,-0.35586,
+ 0.228199,-0.705361,-0.671112,5.580223,1.04747,-0.372696,
+ 0.228199,-0.705361,-0.671112,5.580223,1.04747,-0.372696,
+ 0.231006,-0.859096,-0.456717,5.681086,1.054964,-0.35586,
+ 0.173726,-0.983856,0.042973,5.672385,1.007694,-0.341778,
+ 0.228199,-0.705361,-0.671112,5.580223,1.04747,-0.372696,
+ 0.173726,-0.983856,0.042973,5.672385,1.007694,-0.341778,
+ 0.148862,-0.934725,-0.322692,5.580727,0.99933,-0.349867,
+ 0.228199,-0.705361,-0.671112,5.580223,1.04747,-0.372696,
+ 0.155351,-0.987262,-0.034337,5.470775,1.009574,-0.355371,
+ 0.108306,-0.808441,-0.578527,5.598282,1.094735,-0.386994,
+ 0.228199,-0.705361,-0.671112,5.580223,1.04747,-0.372696,
+ 0.148862,-0.934725,-0.322692,5.580727,0.99933,-0.349867,
+ 0.241652,-0.897637,-0.368581,5.535184,0.98018,-0.341257,
+ 0.228199,-0.705361,-0.671112,5.580223,1.04747,-0.372696,
+ 0.241652,-0.897637,-0.368581,5.535184,0.98018,-0.341257,
+ 0.155351,-0.987262,-0.034337,5.470775,1.009574,-0.355371,
+ 0.72603,0.248277,-0.641279,5.388455,1.119419,-0.351883,
+ 0.802898,-0.287005,-0.522477,5.47963,1.11131,-0.364188,
+ 0.155351,-0.987262,-0.034337,5.470775,1.009574,-0.355371,
+ 0.72603,0.248277,-0.641279,5.388455,1.119419,-0.351883,
+ 0.155351,-0.987262,-0.034337,5.470775,1.009574,-0.355371,
+ 0.114701,-0.691524,-0.713188,5.425352,1.035967,-0.34272,
+ 0.114701,-0.691524,-0.713188,5.425352,1.035967,-0.34272,
+ 0.155351,-0.987262,-0.034337,5.470775,1.009574,-0.355371,
+ 0.298912,-0.321997,-0.898315,5.434594,0.970412,-0.330823,
+ 0.155351,-0.987262,-0.034337,5.470775,1.009574,-0.355371,
+ 0.241652,-0.897637,-0.368581,5.535184,0.98018,-0.341257,
+ 0.298912,-0.321997,-0.898315,5.434594,0.970412,-0.330823,
+ 0.241652,-0.897637,-0.368581,5.535184,0.98018,-0.341257,
+ 0.241049,-0.626018,-0.741618,5.480649,0.941387,-0.316248,
+ 0.298912,-0.321997,-0.898315,5.434594,0.970412,-0.330823,
+ 0.72603,0.248277,-0.641279,5.388455,1.119419,-0.351883,
+ 0.114701,-0.691524,-0.713188,5.425352,1.035967,-0.34272,
+ 0.272751,-0.332382,-0.902845,5.379461,1.045817,-0.349748,
+ 0.272751,-0.332382,-0.902845,5.379461,1.045817,-0.349748,
+ 0.114701,-0.691524,-0.713188,5.425352,1.035967,-0.34272,
+ 0.298912,-0.321997,-0.898315,5.434594,0.970412,-0.330823,
+ 0.272751,-0.332382,-0.902845,5.379461,1.045817,-0.349748,
+ 0.298912,-0.321997,-0.898315,5.434594,0.970412,-0.330823,
+ 0.161397,-0.648357,-0.744032,5.370709,0.980272,-0.337432,
+ 0.298912,-0.321997,-0.898315,5.434594,0.970412,-0.330823,
+ 0.241049,-0.626018,-0.741618,5.480649,0.941387,-0.316248,
+ 0.142784,-0.229696,-0.962732,5.373646,0.885375,-0.20884,
+ 0.161397,-0.648357,-0.744032,5.370709,0.980272,-0.337432,
+ 0.298912,-0.321997,-0.898315,5.434594,0.970412,-0.330823,
+ 0.142784,-0.229696,-0.962732,5.373646,0.885375,-0.20884,
+ 0.241049,-0.626018,-0.741618,5.480649,0.941387,-0.316248,
+ -0.016623,-0.697515,-0.716378,5.546347,0.916044,-0.246782,
+ 0.009824,-0.644035,-0.764933,5.511556,0.863525,-0.177613,
+ 0.241049,-0.626018,-0.741618,5.480649,0.941387,-0.316248,
+ 0.009824,-0.644035,-0.764933,5.511556,0.863525,-0.177613,
+ 0.142784,-0.229696,-0.962732,5.373646,0.885375,-0.20884,
+ -0.016623,-0.697515,-0.716378,5.546347,0.916044,-0.246782,
+ -0.045194,-0.595739,-0.801906,5.638369,0.904402,-0.222548,
+ -0.023775,-0.598435,-0.800819,5.60337,0.852748,-0.162335,
+ -0.016623,-0.697515,-0.716378,5.546347,0.916044,-0.246782,
+ -0.023775,-0.598435,-0.800819,5.60337,0.852748,-0.162335,
+ 0.009824,-0.644035,-0.764933,5.511556,0.863525,-0.177613,
+ -0.045194,-0.595739,-0.801906,5.638369,0.904402,-0.222548,
+ -0.105003,-0.636187,-0.764356,5.748613,0.92049,-0.205099,
+ 0.200817,-0.971977,-0.122205,5.70463,0.849158,-0.12813,
+ -0.045194,-0.595739,-0.801906,5.638369,0.904402,-0.222548,
+ 0.200817,-0.971977,-0.122205,5.70463,0.849158,-0.12813,
+ -0.023775,-0.598435,-0.800819,5.60337,0.852748,-0.162335,
+ 0.043397,0.435461,-0.899161,5.250485,1.123029,-0.385234,
+ 0.72603,0.248277,-0.641279,5.388455,1.119419,-0.351883,
+ 0.272751,-0.332382,-0.902845,5.379461,1.045817,-0.349748,
+ 0.043397,0.435461,-0.899161,5.250485,1.123029,-0.385234,
+ 0.272751,-0.332382,-0.902845,5.379461,1.045817,-0.349748,
+ 0.123418,-0.784469,-0.607763,5.241466,1.040469,-0.383965,
+ 0.123418,-0.784469,-0.607763,5.241466,1.040469,-0.383965,
+ 0.272751,-0.332382,-0.902845,5.379461,1.045817,-0.349748,
+ 0.161397,-0.648357,-0.744032,5.370709,0.980272,-0.337432,
+ 0.123418,-0.784469,-0.607763,5.241466,1.040469,-0.383965,
+ 0.161397,-0.648357,-0.744032,5.370709,0.980272,-0.337432,
+ 0.050019,-0.552867,-0.831767,5.223571,0.974029,-0.362117,
+ 0.161397,-0.648357,-0.744032,5.370709,0.980272,-0.337432,
+ 0.142784,-0.229696,-0.962732,5.373646,0.885375,-0.20884,
+ 0.037801,-0.082839,-0.995846,5.299005,0.908991,-0.260177,
+ 0.050019,-0.552867,-0.831767,5.223571,0.974029,-0.362117,
+ 0.161397,-0.648357,-0.744032,5.370709,0.980272,-0.337432,
+ 0.037801,-0.082839,-0.995846,5.299005,0.908991,-0.260177,
+ 0.050019,-0.552867,-0.831767,5.223571,0.974029,-0.362117,
+ 0.037801,-0.082839,-0.995846,5.299005,0.908991,-0.260177,
+ -0.196146,-0.333078,-0.922272,5.197562,0.922406,-0.302473,
+ 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
+ 0.953994,-0.299798,-0.004126,5.78079,0.891286,0.001059,
+ -0.277696,-0.435918,-0.856073,5.797411,0.880032,-0.072306,
+ 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
+ -0.277696,-0.435918,-0.856073,5.797411,0.880032,-0.072306,
+ -0.106359,-0.394397,-0.912764,5.851404,0.929008,-0.105362,
+ -0.106359,-0.394397,-0.912764,5.851404,0.929008,-0.105362,
+ -0.277696,-0.435918,-0.856073,5.797411,0.880032,-0.072306,
+ 0.200817,-0.971977,-0.122205,5.70463,0.849158,-0.12813,
+ -0.106359,-0.394397,-0.912764,5.851404,0.929008,-0.105362,
+ 0.200817,-0.971977,-0.122205,5.70463,0.849158,-0.12813,
+ -0.105003,-0.636187,-0.764356,5.748613,0.92049,-0.205099,
+ -0.277696,-0.435918,-0.856073,5.797411,0.880032,-0.072306,
+ 0.953994,-0.299798,-0.004126,5.78079,0.891286,0.001059,
+ 0.874313,-0.485341,-0.004579,5.679621,0.8395,0.000985,
+ -0.277696,-0.435918,-0.856073,5.797411,0.880032,-0.072306,
+ 0.874313,-0.485341,-0.004579,5.679621,0.8395,0.000985,
+ -0.301162,-0.110218,-0.947182,5.568745,0.834653,-0.07139,
+ -0.277696,-0.435918,-0.856073,5.797411,0.880032,-0.072306,
+ -0.301162,-0.110218,-0.947182,5.568745,0.834653,-0.07139,
+ 0.200817,-0.971977,-0.122205,5.70463,0.849158,-0.12813,
+ 0.874313,-0.485341,-0.004579,5.679621,0.8395,0.000985,
+ 0.84332,-0.537393,-0.004381,5.579253,0.837796,0.000896,
+ -0.301162,-0.110218,-0.947182,5.568745,0.834653,-0.07139,
+ 0.200817,-0.971977,-0.122205,5.70463,0.849158,-0.12813,
+ -0.301162,-0.110218,-0.947182,5.568745,0.834653,-0.07139,
+ -0.430969,-0.132769,-0.892546,5.449164,0.847535,-0.103909,
+ 0.200817,-0.971977,-0.122205,5.70463,0.849158,-0.12813,
+ -0.430969,-0.132769,-0.892546,5.449164,0.847535,-0.103909,
+ -0.023775,-0.598435,-0.800819,5.60337,0.852748,-0.162335,
+ -0.293162,-0.051827,-0.954657,5.247762,0.848549,-0.108546,
+ 0.832605,-0.553861,-0.002629,5.213434,0.856784,0.000565,
+ 0.598791,-0.8009,-0.003109,5.112563,0.840686,0.00048,
+ -0.293162,-0.051827,-0.954657,5.247762,0.848549,-0.108546,
+ 0.598791,-0.8009,-0.003109,5.112563,0.840686,0.00048,
+ -0.034138,0.050771,-0.998127,5.137075,0.824518,-0.144842,
+ -0.023775,-0.598435,-0.800819,5.60337,0.852748,-0.162335,
+ -0.430969,-0.132769,-0.892546,5.449164,0.847535,-0.103909,
+ -0.101883,0.176778,-0.978963,5.3569,0.85112,-0.138324,
+ -0.023775,-0.598435,-0.800819,5.60337,0.852748,-0.162335,
+ -0.101883,0.176778,-0.978963,5.3569,0.85112,-0.138324,
+ 0.009824,-0.644035,-0.764933,5.511556,0.863525,-0.177613,
+ 0.009824,-0.644035,-0.764933,5.511556,0.863525,-0.177613,
+ -0.101883,0.176778,-0.978963,5.3569,0.85112,-0.138324,
+ -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
+ 0.009824,-0.644035,-0.764933,5.511556,0.863525,-0.177613,
+ -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
+ 0.142784,-0.229696,-0.962732,5.373646,0.885375,-0.20884,
+ 0.224122,-0.97456,-0.001209,5.323232,0.866039,0.00066,
+ 0.832605,-0.553861,-0.002629,5.213434,0.856784,0.000565,
+ -0.293162,-0.051827,-0.954657,5.247762,0.848549,-0.108546,
+ -0.301162,-0.110218,-0.947182,5.568745,0.834653,-0.07139,
+ 0.84332,-0.537393,-0.004381,5.579253,0.837796,0.000896,
+ -0.020035,-0.999799,-0.000148,5.469641,0.838722,0.000798,
+ -0.301162,-0.110218,-0.947182,5.568745,0.834653,-0.07139,
+ -0.020035,-0.999799,-0.000148,5.469641,0.838722,0.000798,
+ -0.430969,-0.132769,-0.892546,5.449164,0.847535,-0.103909,
+ -0.430969,-0.132769,-0.892546,5.449164,0.847535,-0.103909,
+ -0.020035,-0.999799,-0.000148,5.469641,0.838722,0.000798,
+ 0.224122,-0.97456,-0.001209,5.323232,0.866039,0.00066,
+ -0.430969,-0.132769,-0.892546,5.449164,0.847535,-0.103909,
+ 0.224122,-0.97456,-0.001209,5.323232,0.866039,0.00066,
+ -0.293162,-0.051827,-0.954657,5.247762,0.848549,-0.108546,
+ -0.101883,0.176778,-0.978963,5.3569,0.85112,-0.138324,
+ -0.430969,-0.132769,-0.892546,5.449164,0.847535,-0.103909,
+ -0.293162,-0.051827,-0.954657,5.247762,0.848549,-0.108546,
+ -0.101883,0.176778,-0.978963,5.3569,0.85112,-0.138324,
+ -0.293162,-0.051827,-0.954657,5.247762,0.848549,-0.108546,
+ -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
+ 0.037801,-0.082839,-0.995846,5.299005,0.908991,-0.260177,
+ 0.142784,-0.229696,-0.962732,5.373646,0.885375,-0.20884,
+ -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
+ -0.196146,-0.333078,-0.922272,5.197562,0.922406,-0.302473,
+ 0.037801,-0.082839,-0.995846,5.299005,0.908991,-0.260177,
+ -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
+ -0.196146,-0.333078,-0.922272,5.197562,0.922406,-0.302473,
+ -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
+ -0.317809,0.237299,-0.91798,5.153735,0.831575,-0.218348,
+ -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
+ -0.293162,-0.051827,-0.954657,5.247762,0.848549,-0.108546,
+ -0.034138,0.050771,-0.998127,5.137075,0.824518,-0.144842,
+ -0.172671,0.234525,-0.956652,5.26443,0.855571,-0.181694,
+ -0.034138,0.050771,-0.998127,5.137075,0.824518,-0.144842,
+ -0.317809,0.237299,-0.91798,5.153735,0.831575,-0.218348,
+ -0.034138,0.050771,-0.998127,5.137075,0.824518,-0.144842,
+ 0.598791,-0.8009,-0.003109,5.112563,0.840686,0.00048,
+ 0.124158,-0.992262,-0.000543,4.920855,0.812339,0.000318,
+ -0.034138,0.050771,-0.998127,5.137075,0.824518,-0.144842,
+ 0.124158,-0.992262,-0.000543,4.920855,0.812339,0.000318,
+ -0.241534,0.200654,-0.949421,4.963526,0.797382,-0.14344,
+ -0.317809,0.237299,-0.91798,5.153735,0.831575,-0.218348,
+ -0.034138,0.050771,-0.998127,5.137075,0.824518,-0.144842,
+ -0.241534,0.200654,-0.949421,4.963526,0.797382,-0.14344,
+ -0.317809,0.237299,-0.91798,5.153735,0.831575,-0.218348,
+ -0.241534,0.200654,-0.949421,4.963526,0.797382,-0.14344,
+ -0.31398,0.125785,-0.94106,4.99671,0.81056,-0.280771,
+ -0.434729,0.079706,-0.897027,4.712067,0.770512,-0.333393,
+ -0.31398,0.125785,-0.94106,4.99671,0.81056,-0.280771,
+ -0.241534,0.200654,-0.949421,4.963526,0.797382,-0.14344,
+ -0.434729,0.079706,-0.897027,4.712067,0.770512,-0.333393,
+ -0.241534,0.200654,-0.949421,4.963526,0.797382,-0.14344,
+ -0.419631,0.061765,-0.905591,4.66969,0.738163,-0.188296,
+ -0.241534,0.200654,-0.949421,4.963526,0.797382,-0.14344,
+ 0.124158,-0.992262,-0.000543,4.920855,0.812339,0.000318,
+ 0.157494,-0.98752,-0.000465,4.655453,0.758022,0.000098,
+ -0.241534,0.200654,-0.949421,4.963526,0.797382,-0.14344,
+ 0.157494,-0.98752,-0.000465,4.655453,0.758022,0.000098,
+ -0.419631,0.061765,-0.905591,4.66969,0.738163,-0.188296,
+ -0.400711,0.089185,-0.911853,5.004627,0.908637,-0.345273,
+ -0.196146,-0.333078,-0.922272,5.197562,0.922406,-0.302473,
+ -0.317809,0.237299,-0.91798,5.153735,0.831575,-0.218348,
+ -0.400711,0.089185,-0.911853,5.004627,0.908637,-0.345273,
+ -0.317809,0.237299,-0.91798,5.153735,0.831575,-0.218348,
+ -0.31398,0.125785,-0.94106,4.99671,0.81056,-0.280771,
+ -0.497134,0.140473,-0.856227,4.728809,0.878731,-0.405801,
+ -0.400711,0.089185,-0.911853,5.004627,0.908637,-0.345273,
+ -0.31398,0.125785,-0.94106,4.99671,0.81056,-0.280771,
+ -0.497134,0.140473,-0.856227,4.728809,0.878731,-0.405801,
+ -0.31398,0.125785,-0.94106,4.99671,0.81056,-0.280771,
+ -0.434729,0.079706,-0.897027,4.712067,0.770512,-0.333393,
+ 0.274481,0.961015,-0.033322,5.011084,1.06677,-0.458562,
+ 0.123418,-0.784469,-0.607763,5.241466,1.040469,-0.383965,
+ 0.050019,-0.552867,-0.831767,5.223571,0.974029,-0.362117,
+ 0.274481,0.961015,-0.033322,5.011084,1.06677,-0.458562,
+ 0.050019,-0.552867,-0.831767,5.223571,0.974029,-0.362117,
+ 0.563602,0.822451,-0.076991,5.021254,0.951308,-0.405567,
+ 0.050019,-0.552867,-0.831767,5.223571,0.974029,-0.362117,
+ -0.196146,-0.333078,-0.922272,5.197562,0.922406,-0.302473,
+ -0.400711,0.089185,-0.911853,5.004627,0.908637,-0.345273,
+ 0.050019,-0.552867,-0.831767,5.223571,0.974029,-0.362117,
+ -0.400711,0.089185,-0.911853,5.004627,0.908637,-0.345273,
+ 0.563602,0.822451,-0.076991,5.021254,0.951308,-0.405567,
+ 0.067357,0.280762,-0.957411,4.733657,1.227371,-0.592883,
+ 0.012421,0.392537,-0.919653,4.991713,1.163096,-0.504149,
+ 0.274481,0.961015,-0.033322,5.011084,1.06677,-0.458562,
+ 0.067357,0.280762,-0.957411,4.733657,1.227371,-0.592883,
+ 0.274481,0.961015,-0.033322,5.011084,1.06677,-0.458562,
+ 0.311768,0.950117,0.008871,4.74325,1.05921,-0.563421,
+ 0.311768,0.950117,0.008871,4.74325,1.05921,-0.563421,
+ 0.274481,0.961015,-0.033322,5.011084,1.06677,-0.458562,
+ 0.563602,0.822451,-0.076991,5.021254,0.951308,-0.405567,
+ 0.311768,0.950117,0.008871,4.74325,1.05921,-0.563421,
+ 0.563602,0.822451,-0.076991,5.021254,0.951308,-0.405567,
+ 0.609817,0.770093,-0.187297,4.744871,0.950945,-0.491082,
+ 0.609817,0.770093,-0.187297,4.744871,0.950945,-0.491082,
+ 0.563602,0.822451,-0.076991,5.021254,0.951308,-0.405567,
+ -0.400711,0.089185,-0.911853,5.004627,0.908637,-0.345273,
+ 0.609817,0.770093,-0.187297,4.744871,0.950945,-0.491082,
+ -0.400711,0.089185,-0.911853,5.004627,0.908637,-0.345273,
+ -0.497134,0.140473,-0.856227,4.728809,0.878731,-0.405801,
+ -0.026366,0.234118,-0.971851,4.641547,1.285422,-0.622034,
+ 0.067357,0.280762,-0.957411,4.733657,1.227371,-0.592883,
+ 0.311768,0.950117,0.008871,4.74325,1.05921,-0.563421,
+ -0.026366,0.234118,-0.971851,4.641547,1.285422,-0.622034,
+ 0.311768,0.950117,0.008871,4.74325,1.05921,-0.563421,
+ 0.381066,0.919021,-0.100938,4.567896,1.149805,-0.642484,
+ 0.381066,0.919021,-0.100938,4.567896,1.149805,-0.642484,
+ 0.311768,0.950117,0.008871,4.74325,1.05921,-0.563421,
+ 0.609817,0.770093,-0.187297,4.744871,0.950945,-0.491082,
+ 0.381066,0.919021,-0.100938,4.567896,1.149805,-0.642484,
+ 0.609817,0.770093,-0.187297,4.744871,0.950945,-0.491082,
+ 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
+ 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
+ 0.609817,0.770093,-0.187297,4.744871,0.950945,-0.491082,
+ -0.497134,0.140473,-0.856227,4.728809,0.878731,-0.405801,
+ 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
+ -0.497134,0.140473,-0.856227,4.728809,0.878731,-0.405801,
+ -0.062739,0.996071,-0.062495,4.416475,0.921264,-0.458839,
+ -0.11884,0.991349,0.055713,4.333503,0.951176,-0.481517,
+ -0.062739,0.996071,-0.062495,4.416475,0.921264,-0.458839,
+ -0.134248,0.990294,0.035989,4.399629,0.850459,-0.391855,
+ -0.11884,0.991349,0.055713,4.333503,0.951176,-0.481517,
+ -0.134248,0.990294,0.035989,4.399629,0.850459,-0.391855,
+ -0.081906,0.996619,0.006487,4.297891,0.911506,-0.447987,
+ -0.419631,0.061765,-0.905591,4.66969,0.738163,-0.188296,
+ 0.157494,-0.98752,-0.000465,4.655453,0.758022,0.000098,
+ 0.000801,-1,-0.000539,4.380854,0.704574,-0.00013,
+ -0.419631,0.061765,-0.905591,4.66969,0.738163,-0.188296,
+ 0.000801,-1,-0.000539,4.380854,0.704574,-0.00013,
+ 0.448666,0.893201,-0.029856,4.359048,0.700414,-0.166651,
+ -0.434729,0.079706,-0.897027,4.712067,0.770512,-0.333393,
+ -0.419631,0.061765,-0.905591,4.66969,0.738163,-0.188296,
+ 0.448666,0.893201,-0.029856,4.359048,0.700414,-0.166651,
+ -0.434729,0.079706,-0.897027,4.712067,0.770512,-0.333393,
+ 0.448666,0.893201,-0.029856,4.359048,0.700414,-0.166651,
+ 0.731768,0.675964,-0.087106,4.319799,0.731007,-0.291212,
+ -0.134248,0.990294,0.035989,4.399629,0.850459,-0.391855,
+ -0.434729,0.079706,-0.897027,4.712067,0.770512,-0.333393,
+ 0.731768,0.675964,-0.087106,4.319799,0.731007,-0.291212,
+ -0.134248,0.990294,0.035989,4.399629,0.850459,-0.391855,
+ 0.731768,0.675964,-0.087106,4.319799,0.731007,-0.291212,
+ -0.051101,0.977083,0.206633,4.216374,0.852328,-0.405873,
+ -0.134248,0.990294,0.035989,4.399629,0.850459,-0.391855,
+ -0.051101,0.977083,0.206633,4.216374,0.852328,-0.405873,
+ -0.081906,0.996619,0.006487,4.297891,0.911506,-0.447987,
+ -0.134248,0.990294,0.035989,4.399629,0.850459,-0.391855,
+ -0.062739,0.996071,-0.062495,4.416475,0.921264,-0.458839,
+ -0.497134,0.140473,-0.856227,4.728809,0.878731,-0.405801,
+ -0.134248,0.990294,0.035989,4.399629,0.850459,-0.391855,
+ -0.497134,0.140473,-0.856227,4.728809,0.878731,-0.405801,
+ -0.434729,0.079706,-0.897027,4.712067,0.770512,-0.333393,
+ 0.481644,0.842268,0.242081,4.449011,1.260929,-0.647431,
+ 0.381066,0.919021,-0.100938,4.567896,1.149805,-0.642484,
+ 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
+ 0.481644,0.842268,0.242081,4.449011,1.260929,-0.647431,
+ 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
+ 0.794567,0.588129,0.15089,4.366867,1.131136,-0.630581,
+ 0.04154,0.947538,0.316932,4.141189,1.008775,-0.499342,
+ -0.081906,0.996619,0.006487,4.297891,0.911506,-0.447987,
+ -0.051101,0.977083,0.206633,4.216374,0.852328,-0.405873,
+ 0.04154,0.947538,0.316932,4.141189,1.008775,-0.499342,
+ 0.461485,0.788927,0.405742,4.277227,1.077746,-0.550819,
+ -0.11884,0.991349,0.055713,4.333503,0.951176,-0.481517,
+ 0.04154,0.947538,0.316932,4.141189,1.008775,-0.499342,
+ -0.11884,0.991349,0.055713,4.333503,0.951176,-0.481517,
+ -0.081906,0.996619,0.006487,4.297891,0.911506,-0.447987,
+ 0.800967,0.453078,0.391371,4.085564,1.288885,-0.544406,
+ 0.054059,0.926072,0.373454,4.175444,1.350332,-0.613988,
+ 0.461485,0.788927,0.405742,4.277227,1.077746,-0.550819,
+ 0.800967,0.453078,0.391371,4.085564,1.288885,-0.544406,
+ 0.461485,0.788927,0.405742,4.277227,1.077746,-0.550819,
+ 0.04154,0.947538,0.316932,4.141189,1.008775,-0.499342,
+ -0.11884,0.991349,0.055713,4.333503,0.951176,-0.481517,
+ 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
+ -0.062739,0.996071,-0.062495,4.416475,0.921264,-0.458839,
+ 0.461485,0.788927,0.405742,4.277227,1.077746,-0.550819,
+ 0.794567,0.588129,0.15089,4.366867,1.131136,-0.630581,
+ 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
+ 0.461485,0.788927,0.405742,4.277227,1.077746,-0.550819,
+ 0.651262,0.697944,-0.29788,4.496191,1.024566,-0.579491,
+ -0.11884,0.991349,0.055713,4.333503,0.951176,-0.481517,
+ 0.054059,0.926072,0.373454,4.175444,1.350332,-0.613988,
+ 0.329366,0.742755,0.582952,4.247733,1.381058,-0.649596,
+ 0.794567,0.588129,0.15089,4.366867,1.131136,-0.630581,
+ 0.054059,0.926072,0.373454,4.175444,1.350332,-0.613988,
+ 0.794567,0.588129,0.15089,4.366867,1.131136,-0.630581,
+ 0.461485,0.788927,0.405742,4.277227,1.077746,-0.550819,
+ 0.329366,0.742755,0.582952,4.247733,1.381058,-0.649596,
+ 0.693689,0.317886,0.646331,4.329607,1.464801,-0.661485,
+ 0.481644,0.842268,0.242081,4.449011,1.260929,-0.647431,
+ 0.329366,0.742755,0.582952,4.247733,1.381058,-0.649596,
+ 0.481644,0.842268,0.242081,4.449011,1.260929,-0.647431,
+ 0.794567,0.588129,0.15089,4.366867,1.131136,-0.630581,
+ 0.693689,0.317886,0.646331,4.329607,1.464801,-0.661485,
+ -0.034875,0.308036,-0.950735,4.430999,1.535753,-0.638888,
+ 0.184871,0.227139,-0.956154,4.522247,1.398278,-0.644892,
+ 0.693689,0.317886,0.646331,4.329607,1.464801,-0.661485,
+ 0.184871,0.227139,-0.956154,4.522247,1.398278,-0.644892,
+ 0.481644,0.842268,0.242081,4.449011,1.260929,-0.647431,
+ 0.000755,0.939587,0.34231,4.312225,1.683392,-0.639944,
+ -0.148853,0.101172,-0.98367,4.404221,1.662433,-0.61661,
+ -0.034875,0.308036,-0.950735,4.430999,1.535753,-0.638888,
+ 0.000755,0.939587,0.34231,4.312225,1.683392,-0.639944,
+ -0.034875,0.308036,-0.950735,4.430999,1.535753,-0.638888,
+ 0.693689,0.317886,0.646331,4.329607,1.464801,-0.661485,
+ 0.204286,0.745568,0.634347,4.303615,1.799914,-0.610388,
+ 0.504832,0.844097,-0.180678,4.38638,1.770868,-0.596666,
+ -0.148853,0.101172,-0.98367,4.404221,1.662433,-0.61661,
+ 0.204286,0.745568,0.634347,4.303615,1.799914,-0.610388,
+ -0.148853,0.101172,-0.98367,4.404221,1.662433,-0.61661,
+ 0.000755,0.939587,0.34231,4.312225,1.683392,-0.639944,
+ 0.525316,0.261331,0.809784,4.304562,1.906537,-0.572242,
+ 0.615047,0.769185,-0.17341,4.377095,1.871713,-0.595743,
+ 0.504832,0.844097,-0.180678,4.38638,1.770868,-0.596666,
+ 0.525316,0.261331,0.809784,4.304562,1.906537,-0.572242,
+ 0.504832,0.844097,-0.180678,4.38638,1.770868,-0.596666,
+ 0.204286,0.745568,0.634347,4.303615,1.799914,-0.610388,
+ -0.051423,0.948155,0.313619,4.240116,1.770049,-0.583946,
+ 0.204286,0.745568,0.634347,4.303615,1.799914,-0.610388,
+ 0.000755,0.939587,0.34231,4.312225,1.683392,-0.639944,
+ -0.051423,0.948155,0.313619,4.240116,1.770049,-0.583946,
+ 0.000755,0.939587,0.34231,4.312225,1.683392,-0.639944,
+ 0.104327,0.725166,0.680624,4.221814,1.660769,-0.59409,
+ 0.104327,0.725166,0.680624,4.221814,1.660769,-0.59409,
+ 0.000755,0.939587,0.34231,4.312225,1.683392,-0.639944,
+ 0.693689,0.317886,0.646331,4.329607,1.464801,-0.661485,
+ 0.104327,0.725166,0.680624,4.221814,1.660769,-0.59409,
+ 0.693689,0.317886,0.646331,4.329607,1.464801,-0.661485,
+ 0.329366,0.742755,0.582952,4.247733,1.381058,-0.649596,
+ 0.288171,0.239224,0.927216,4.121121,1.614451,-0.587188,
+ 0.104327,0.725166,0.680624,4.221814,1.660769,-0.59409,
+ 0.329366,0.742755,0.582952,4.247733,1.381058,-0.649596,
+ 0.288171,0.239224,0.927216,4.121121,1.614451,-0.587188,
+ 0.329366,0.742755,0.582952,4.247733,1.381058,-0.649596,
+ 0.054059,0.926072,0.373454,4.175444,1.350332,-0.613988,
+ 0.811896,0.498733,-0.303464,4.067576,1.572668,-0.534997,
+ 0.288171,0.239224,0.927216,4.121121,1.614451,-0.587188,
+ 0.054059,0.926072,0.373454,4.175444,1.350332,-0.613988,
+ 0.811896,0.498733,-0.303464,4.067576,1.572668,-0.534997,
+ 0.054059,0.926072,0.373454,4.175444,1.350332,-0.613988,
+ 0.800967,0.453078,0.391371,4.085564,1.288885,-0.544406,
+ 0.969409,0.243853,-0.027951,4.148883,1.759918,-0.573765,
+ -0.051423,0.948155,0.313619,4.240116,1.770049,-0.583946,
+ 0.104327,0.725166,0.680624,4.221814,1.660769,-0.59409,
+ 0.969409,0.243853,-0.027951,4.148883,1.759918,-0.573765,
+ 0.104327,0.725166,0.680624,4.221814,1.660769,-0.59409,
+ 0.288171,0.239224,0.927216,4.121121,1.614451,-0.587188,
+ 0.971427,0.04566,0.232906,4.076852,1.746601,-0.527436,
+ 0.969409,0.243853,-0.027951,4.148883,1.759918,-0.573765,
+ 0.288171,0.239224,0.927216,4.121121,1.614451,-0.587188,
+ 0.971427,0.04566,0.232906,4.076852,1.746601,-0.527436,
+ 0.288171,0.239224,0.927216,4.121121,1.614451,-0.587188,
+ 0.811896,0.498733,-0.303464,4.067576,1.572668,-0.534997,
+ -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
+ -0.989689,-0.143234,0,4.912303,2.162645,-0.00009,
+ -0.194126,0.280848,-0.939914,4.971394,2.146686,-0.224781,
+ -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
+ -0.194126,0.280848,-0.939914,4.971394,2.146686,-0.224781,
+ 0.2189,0.87846,-0.424724,4.83289,2.262727,-0.283787,
+ -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
+ -0.998597,-0.052951,0,5.177545,1.932323,0.000214,
+ 0.444094,0.036128,-0.895251,5.156645,1.942902,-0.119993,
+ -0.026558,-0.999647,0,5.680007,1.510009,0.000786,
+ 0.694651,0.719347,0.000019,5.743997,1.482739,0.000851,
+ 0.936734,-0.314344,0.154001,5.741781,1.463956,-0.124891,
+ -0.026558,-0.999647,0,5.680007,1.510009,0.000786,
+ 0.936734,-0.314344,0.154001,5.741781,1.463956,-0.124891,
+ 0.987857,-0.047506,-0.147925,5.687035,1.499636,-0.110765,
+ 0.569495,0.821995,-0.000075,5.835498,1.43628,0.000946,
+ -0.016213,0.999869,0,5.908842,1.388968,0.001026,
+ 0.461068,-0.584089,-0.668024,5.915025,1.382159,-0.13682,
+ 0.569495,0.821995,-0.000075,5.835498,1.43628,0.000946,
+ 0.461068,-0.584089,-0.668024,5.915025,1.382159,-0.13682,
+ 0.901575,-0.270544,-0.337593,5.842092,1.427708,-0.130724,
+ 0.850248,-0.122855,0.511845,4.342351,2.581176,-0.140317,
+ -0.069594,-0.997575,-0.000151,4.317602,2.588926,-0.000745,
+ 0.169654,-0.985504,-0.000285,4.454962,2.523303,-0.000603,
+ 0.850248,-0.122855,0.511845,4.342351,2.581176,-0.140317,
+ 0.169654,-0.985504,-0.000285,4.454962,2.523303,-0.000603,
+ 0.603381,-0.138834,0.785275,4.452383,2.524558,-0.130255,
+ 0.335985,-0.093511,0.937214,4.332083,2.586481,-0.194917,
+ 0.850248,-0.122855,0.511845,4.342351,2.581176,-0.140317,
+ 0.603381,-0.138834,0.785275,4.452383,2.524558,-0.130255,
+ 0.335985,-0.093511,0.937214,4.332083,2.586481,-0.194917,
+ 0.603381,-0.138834,0.785275,4.452383,2.524558,-0.130255,
+ 0.104604,0.23696,0.965872,4.440143,2.510529,-0.269164,
+ 0.169215,-0.167065,0.971316,4.339601,2.592642,-0.258891,
+ 0.335985,-0.093511,0.937214,4.332083,2.586481,-0.194917,
+ 0.104604,0.23696,0.965872,4.440143,2.510529,-0.269164,
+ 0.169215,-0.167065,0.971316,4.339601,2.592642,-0.258891,
+ 0.104604,0.23696,0.965872,4.440143,2.510529,-0.269164,
+ 0.054838,0.685321,0.726174,4.429895,2.495758,-0.306894,
+ -0.026478,0.945923,0.32331,4.187258,2.590221,-0.135844,
+ 0.172357,-0.985035,-0.000083,4.189883,2.606916,-0.000863,
+ -0.069594,-0.997575,-0.000151,4.317602,2.588926,-0.000745,
+ -0.026478,0.945923,0.32331,4.187258,2.590221,-0.135844,
+ -0.069594,-0.997575,-0.000151,4.317602,2.588926,-0.000745,
+ 0.850248,-0.122855,0.511845,4.342351,2.581176,-0.140317,
+ -0.071389,0.260054,0.962951,4.203325,2.589186,-0.219164,
+ -0.026478,0.945923,0.32331,4.187258,2.590221,-0.135844,
+ 0.850248,-0.122855,0.511845,4.342351,2.581176,-0.140317,
+ -0.071389,0.260054,0.962951,4.203325,2.589186,-0.219164,
+ 0.850248,-0.122855,0.511845,4.342351,2.581176,-0.140317,
+ 0.335985,-0.093511,0.937214,4.332083,2.586481,-0.194917,
+ -0.01127,-0.268802,0.96313,4.211652,2.602538,-0.264011,
+ -0.071389,0.260054,0.962951,4.203325,2.589186,-0.219164,
+ 0.335985,-0.093511,0.937214,4.332083,2.586481,-0.194917,
+ -0.01127,-0.268802,0.96313,4.211652,2.602538,-0.264011,
+ 0.335985,-0.093511,0.937214,4.332083,2.586481,-0.194917,
+ 0.169215,-0.167065,0.971316,4.339601,2.592642,-0.258891,
+ -0.03479,0.69667,0.716547,4.209941,2.600612,-0.337597,
+ -0.01127,-0.268802,0.96313,4.211652,2.602538,-0.264011,
+ 0.169215,-0.167065,0.971316,4.339601,2.592642,-0.258891,
+ -0.03479,0.69667,0.716547,4.209941,2.600612,-0.337597,
+ 0.169215,-0.167065,0.971316,4.339601,2.592642,-0.258891,
+ -0.01139,0.953897,0.299916,4.328606,2.563996,-0.343892,
+ -0.01139,0.953897,0.299916,4.328606,2.563996,-0.343892,
+ 0.169215,-0.167065,0.971316,4.339601,2.592642,-0.258891,
+ 0.054838,0.685321,0.726174,4.429895,2.495758,-0.306894,
+ -0.01139,0.953897,0.299916,4.328606,2.563996,-0.343892,
+ 0.054838,0.685321,0.726174,4.429895,2.495758,-0.306894,
+ -0.151742,0.274295,0.949598,4.410844,2.500167,-0.351972,
+ 0.210866,-0.977515,0.000009,4.528082,2.467537,-0.000521,
+ -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
+ 0.337014,-0.030018,-0.941021,4.634996,2.369115,-0.140117,
+ 0.603381,-0.138834,0.785275,4.452383,2.524558,-0.130255,
+ 0.169654,-0.985504,-0.000285,4.454962,2.523303,-0.000603,
+ 0.210866,-0.977515,0.000009,4.528082,2.467537,-0.000521,
+ 0.603381,-0.138834,0.785275,4.452383,2.524558,-0.130255,
+ 0.210866,-0.977515,0.000009,4.528082,2.467537,-0.000521,
+ 0.337014,-0.030018,-0.941021,4.634996,2.369115,-0.140117,
+ 0.603381,-0.138834,0.785275,4.452383,2.524558,-0.130255,
+ 0.337014,-0.030018,-0.941021,4.634996,2.369115,-0.140117,
+ 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
+ 0.104604,0.23696,0.965872,4.440143,2.510529,-0.269164,
+ 0.603381,-0.138834,0.785275,4.452383,2.524558,-0.130255,
+ 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
+ 0.054838,0.685321,0.726174,4.429895,2.495758,-0.306894,
+ 0.104604,0.23696,0.965872,4.440143,2.510529,-0.269164,
+ 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
+ 0.288841,-0.745301,0.600914,4.474318,2.418432,-0.361347,
+ -0.151742,0.274295,0.949598,4.410844,2.500167,-0.351972,
+ 0.054838,0.685321,0.726174,4.429895,2.495758,-0.306894,
+ 0.288841,-0.745301,0.600914,4.474318,2.418432,-0.361347,
+ 0.054838,0.685321,0.726174,4.429895,2.495758,-0.306894,
+ 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
+ 0.288841,-0.745301,0.600914,4.474318,2.418432,-0.361347,
+ 0.272203,0.043076,-0.961275,4.577573,2.389535,-0.256196,
+ 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
+ -0.130291,0.991051,-0.029017,4.063205,2.509679,-0.342987,
+ -0.904972,-0.026554,-0.424642,4.088356,2.510913,-0.453793,
+ -0.330515,0.821242,-0.465103,4.07851,2.41181,-0.472193,
+ -0.130291,0.991051,-0.029017,4.063205,2.509679,-0.342987,
+ -0.330515,0.821242,-0.465103,4.07851,2.41181,-0.472193,
+ -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
+ -0.778384,0.466328,-0.420305,4.055262,2.505284,-0.297282,
+ -0.130291,0.991051,-0.029017,4.063205,2.509679,-0.342987,
+ -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
+ -0.778384,0.466328,-0.420305,4.055262,2.505284,-0.297282,
+ -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
+ -0.877603,-0.025307,-0.47872,4.035753,2.399538,-0.343957,
+ -0.026478,0.945923,0.32331,4.187258,2.590221,-0.135844,
+ 0.223577,0.97296,0.057987,4.084506,2.570978,-0.218168,
+ 0.272993,0.962016,-0.000199,4.079812,2.571649,-0.000951,
+ -0.026478,0.945923,0.32331,4.187258,2.590221,-0.135844,
+ 0.272993,0.962016,-0.000199,4.079812,2.571649,-0.000951,
+ 0.172357,-0.985035,-0.000083,4.189883,2.606916,-0.000863,
+ -0.071389,0.260054,0.962951,4.203325,2.589186,-0.219164,
+ -0.247355,0.948391,0.198417,4.101754,2.557092,-0.265856,
+ 0.223577,0.97296,0.057987,4.084506,2.570978,-0.218168,
+ -0.071389,0.260054,0.962951,4.203325,2.589186,-0.219164,
+ 0.223577,0.97296,0.057987,4.084506,2.570978,-0.218168,
+ -0.026478,0.945923,0.32331,4.187258,2.590221,-0.135844,
+ -0.01127,-0.268802,0.96313,4.211652,2.602538,-0.264011,
+ -0.671787,0.737297,-0.07138,4.100907,2.560626,-0.302396,
+ -0.247355,0.948391,0.198417,4.101754,2.557092,-0.265856,
+ -0.01127,-0.268802,0.96313,4.211652,2.602538,-0.264011,
+ -0.247355,0.948391,0.198417,4.101754,2.557092,-0.265856,
+ -0.071389,0.260054,0.962951,4.203325,2.589186,-0.219164,
+ -0.03479,0.69667,0.716547,4.209941,2.600612,-0.337597,
+ -0.860594,0.405545,-0.308076,4.117367,2.568514,-0.3845,
+ -0.671787,0.737297,-0.07138,4.100907,2.560626,-0.302396,
+ -0.03479,0.69667,0.716547,4.209941,2.600612,-0.337597,
+ -0.671787,0.737297,-0.07138,4.100907,2.560626,-0.302396,
+ -0.01127,-0.268802,0.96313,4.211652,2.602538,-0.264011,
+ -0.877603,-0.025307,-0.47872,4.035753,2.399538,-0.343957,
+ -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
+ -0.849668,0.488772,0.197904,4.029016,2.519175,-0.249385,
+ -0.877603,-0.025307,-0.47872,4.035753,2.399538,-0.343957,
+ -0.849668,0.488772,0.197904,4.029016,2.519175,-0.249385,
+ -0.778384,0.466328,-0.420305,4.055262,2.505284,-0.297282,
+ 0.544067,0.839042,-0.000076,4.024214,2.527933,-0.000987,
+ -0.849668,0.488772,0.197904,4.029016,2.519175,-0.249385,
+ -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
+ 0.544067,0.839042,-0.000076,4.024214,2.527933,-0.000987,
+ -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
+ -0.069267,0.997598,-0.000362,3.988172,2.489642,-0.001008,
+ 0.544067,0.839042,-0.000076,4.024214,2.527933,-0.000987,
+ 0.272993,0.962016,-0.000199,4.079812,2.571649,-0.000951,
+ 0.223577,0.97296,0.057987,4.084506,2.570978,-0.218168,
+ 0.544067,0.839042,-0.000076,4.024214,2.527933,-0.000987,
+ 0.223577,0.97296,0.057987,4.084506,2.570978,-0.218168,
+ -0.849668,0.488772,0.197904,4.029016,2.519175,-0.249385,
+ -0.849668,0.488772,0.197904,4.029016,2.519175,-0.249385,
+ 0.223577,0.97296,0.057987,4.084506,2.570978,-0.218168,
+ -0.247355,0.948391,0.198417,4.101754,2.557092,-0.265856,
+ -0.849668,0.488772,0.197904,4.029016,2.519175,-0.249385,
+ -0.247355,0.948391,0.198417,4.101754,2.557092,-0.265856,
+ -0.778384,0.466328,-0.420305,4.055262,2.505284,-0.297282,
+ -0.778384,0.466328,-0.420305,4.055262,2.505284,-0.297282,
+ -0.247355,0.948391,0.198417,4.101754,2.557092,-0.265856,
+ -0.671787,0.737297,-0.07138,4.100907,2.560626,-0.302396,
+ -0.778384,0.466328,-0.420305,4.055262,2.505284,-0.297282,
+ -0.671787,0.737297,-0.07138,4.100907,2.560626,-0.302396,
+ -0.130291,0.991051,-0.029017,4.063205,2.509679,-0.342987,
+ -0.130291,0.991051,-0.029017,4.063205,2.509679,-0.342987,
+ -0.671787,0.737297,-0.07138,4.100907,2.560626,-0.302396,
+ -0.860594,0.405545,-0.308076,4.117367,2.568514,-0.3845,
+ -0.130291,0.991051,-0.029017,4.063205,2.509679,-0.342987,
+ -0.860594,0.405545,-0.308076,4.117367,2.568514,-0.3845,
+ -0.904972,-0.026554,-0.424642,4.088356,2.510913,-0.453793,
+ 0.622247,0.782821,-0.000247,3.787342,2.396113,-0.001159,
+ -0.069267,0.997598,-0.000362,3.988172,2.489642,-0.001008,
+ -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
+ 0.622247,0.782821,-0.000247,3.787342,2.396113,-0.001159,
+ -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
+ -0.210883,0.942026,0.260987,3.828001,2.35254,-0.233341,
+ -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
+ -0.892748,0.392127,0.221893,3.961908,2.347745,-0.374747,
+ -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
+ -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
+ -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
+ -0.210883,0.942026,0.260987,3.828001,2.35254,-0.233341,
+ -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
+ -0.877603,-0.025307,-0.47872,4.035753,2.399538,-0.343957,
+ -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
+ -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
+ -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
+ -0.981668,0.173926,0.077954,4.025364,2.3593,-0.402597,
+ -0.683788,0.700764,0.203383,4.00011,2.424158,-0.313254,
+ -0.981668,0.173926,0.077954,4.025364,2.3593,-0.402597,
+ -0.892748,0.392127,0.221893,3.961908,2.347745,-0.374747,
+ -0.892748,0.392127,0.221893,3.961908,2.347745,-0.374747,
+ -0.981668,0.173926,0.077954,4.025364,2.3593,-0.402597,
+ -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
+ -0.892748,0.392127,0.221893,3.961908,2.347745,-0.374747,
+ -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
+ -0.894795,0.444359,0.043442,3.967085,2.280648,-0.537643,
+ -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
+ -0.892748,0.392127,0.221893,3.961908,2.347745,-0.374747,
+ -0.894795,0.444359,0.043442,3.967085,2.280648,-0.537643,
+ -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
+ -0.894795,0.444359,0.043442,3.967085,2.280648,-0.537643,
+ -0.941564,0.056552,-0.332054,3.903911,2.241501,-0.512468,
+ -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
+ -0.941564,0.056552,-0.332054,3.903911,2.241501,-0.512468,
+ -0.984655,0.15519,-0.07981,3.857922,2.141554,-0.521067,
+ -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
+ -0.984655,0.15519,-0.07981,3.857922,2.141554,-0.521067,
+ -0.768362,0.592232,0.242656,3.823349,2.141733,-0.428356,
+ -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
+ -0.330515,0.821242,-0.465103,4.07851,2.41181,-0.472193,
+ -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
+ -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
+ -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
+ -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
+ -0.501952,0.842503,-0.195533,4.043796,2.386524,-0.400392,
+ -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
+ -0.981668,0.173926,0.077954,4.025364,2.3593,-0.402597,
+ -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
+ -0.978317,0.206989,0.00716,4.112302,2.285832,-0.5955,
+ -0.463096,-0.149334,-0.873637,4.010847,2.270246,-0.622149,
+ -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
+ -0.463096,-0.149334,-0.873637,4.010847,2.270246,-0.622149,
+ -0.894795,0.444359,0.043442,3.967085,2.280648,-0.537643,
+ -0.894795,0.444359,0.043442,3.967085,2.280648,-0.537643,
+ -0.463096,-0.149334,-0.873637,4.010847,2.270246,-0.622149,
+ -0.641549,-0.578509,-0.503727,3.928869,2.223919,-0.615683,
+ -0.894795,0.444359,0.043442,3.967085,2.280648,-0.537643,
+ -0.641549,-0.578509,-0.503727,3.928869,2.223919,-0.615683,
+ -0.941564,0.056552,-0.332054,3.903911,2.241501,-0.512468,
+ -0.941564,0.056552,-0.332054,3.903911,2.241501,-0.512468,
+ -0.641549,-0.578509,-0.503727,3.928869,2.223919,-0.615683,
+ -0.791764,-0.610494,0.020171,3.892378,2.149432,-0.603589,
+ -0.941564,0.056552,-0.332054,3.903911,2.241501,-0.512468,
+ -0.791764,-0.610494,0.020171,3.892378,2.149432,-0.603589,
+ -0.984655,0.15519,-0.07981,3.857922,2.141554,-0.521067,
+ -0.978317,0.206989,0.00716,4.112302,2.285832,-0.5955,
+ -0.832539,-0.5495,-0.070196,4.146067,2.278102,-0.707372,
+ -0.862876,-0.450622,-0.228877,4.04473,2.254459,-0.744209,
+ -0.978317,0.206989,0.00716,4.112302,2.285832,-0.5955,
+ -0.862876,-0.450622,-0.228877,4.04473,2.254459,-0.744209,
+ -0.463096,-0.149334,-0.873637,4.010847,2.270246,-0.622149,
+ -0.641549,-0.578509,-0.503727,3.928869,2.223919,-0.615683,
+ -0.463096,-0.149334,-0.873637,4.010847,2.270246,-0.622149,
+ -0.862876,-0.450622,-0.228877,4.04473,2.254459,-0.744209,
+ -0.641549,-0.578509,-0.503727,3.928869,2.223919,-0.615683,
+ -0.862876,-0.450622,-0.228877,4.04473,2.254459,-0.744209,
+ -0.916648,-0.2944,-0.270344,3.990744,2.205448,-0.710795,
+ -0.641549,-0.578509,-0.503727,3.928869,2.223919,-0.615683,
+ -0.916648,-0.2944,-0.270344,3.990744,2.205448,-0.710795,
+ -0.975013,-0.179567,-0.130791,3.945464,2.1301,-0.689536,
+ -0.641549,-0.578509,-0.503727,3.928869,2.223919,-0.615683,
+ -0.975013,-0.179567,-0.130791,3.945464,2.1301,-0.689536,
+ -0.791764,-0.610494,0.020171,3.892378,2.149432,-0.603589,
+ -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
+ -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
+ -0.963659,-0.230665,-0.134738,4.212974,2.303184,-0.587113,
+ -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
+ -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
+ -0.963659,-0.230665,-0.134738,4.212974,2.303184,-0.587113,
+ -0.990661,0.056144,0.124249,4.077563,2.305187,-0.510338,
+ -0.963659,-0.230665,-0.134738,4.212974,2.303184,-0.587113,
+ -0.978317,0.206989,0.00716,4.112302,2.285832,-0.5955,
+ -0.963659,-0.230665,-0.134738,4.212974,2.303184,-0.587113,
+ -0.990956,-0.062739,-0.118613,4.212058,2.27945,-0.625927,
+ -0.832539,-0.5495,-0.070196,4.146067,2.278102,-0.707372,
+ -0.963659,-0.230665,-0.134738,4.212974,2.303184,-0.587113,
+ -0.832539,-0.5495,-0.070196,4.146067,2.278102,-0.707372,
+ -0.978317,0.206989,0.00716,4.112302,2.285832,-0.5955,
+ -0.990956,-0.062739,-0.118613,4.212058,2.27945,-0.625927,
+ -0.938303,-0.3372,-0.076703,4.229332,2.274522,-0.672749,
+ -0.473779,-0.24744,-0.845167,4.172143,2.303394,-0.778972,
+ -0.990956,-0.062739,-0.118613,4.212058,2.27945,-0.625927,
+ -0.473779,-0.24744,-0.845167,4.172143,2.303394,-0.778972,
+ -0.832539,-0.5495,-0.070196,4.146067,2.278102,-0.707372,
+ -0.832539,-0.5495,-0.070196,4.146067,2.278102,-0.707372,
+ -0.473779,-0.24744,-0.845167,4.172143,2.303394,-0.778972,
+ -0.713872,-0.610821,-0.342469,4.079122,2.264104,-0.84501,
+ -0.832539,-0.5495,-0.070196,4.146067,2.278102,-0.707372,
+ -0.713872,-0.610821,-0.342469,4.079122,2.264104,-0.84501,
+ -0.862876,-0.450622,-0.228877,4.04473,2.254459,-0.744209,
+ -0.862876,-0.450622,-0.228877,4.04473,2.254459,-0.744209,
+ -0.713872,-0.610821,-0.342469,4.079122,2.264104,-0.84501,
+ -0.719395,-0.61545,-0.322011,4.0247,2.187859,-0.814219,
+ -0.862876,-0.450622,-0.228877,4.04473,2.254459,-0.744209,
+ -0.719395,-0.61545,-0.322011,4.0247,2.187859,-0.814219,
+ -0.916648,-0.2944,-0.270344,3.990744,2.205448,-0.710795,
+ -0.938303,-0.3372,-0.076703,4.229332,2.274522,-0.672749,
+ -0.841909,-0.49598,-0.212588,4.273005,2.310529,-0.762172,
+ 0.760119,-0.003927,-0.649772,4.215419,2.350484,-0.885764,
+ -0.938303,-0.3372,-0.076703,4.229332,2.274522,-0.672749,
+ 0.760119,-0.003927,-0.649772,4.215419,2.350484,-0.885764,
+ -0.473779,-0.24744,-0.845167,4.172143,2.303394,-0.778972,
+ -0.473779,-0.24744,-0.845167,4.172143,2.303394,-0.778972,
+ 0.760119,-0.003927,-0.649772,4.215419,2.350484,-0.885764,
+ 0.911709,-0.064352,-0.405765,4.104864,2.298353,-0.915735,
+ -0.473779,-0.24744,-0.845167,4.172143,2.303394,-0.778972,
+ 0.911709,-0.064352,-0.405765,4.104864,2.298353,-0.915735,
+ -0.713872,-0.610821,-0.342469,4.079122,2.264104,-0.84501,
+ -0.713872,-0.610821,-0.342469,4.079122,2.264104,-0.84501,
+ 0.911709,-0.064352,-0.405765,4.104864,2.298353,-0.915735,
+ 0.3335,0.232683,-0.913584,4.059714,2.194906,-0.888152,
+ -0.713872,-0.610821,-0.342469,4.079122,2.264104,-0.84501,
+ 0.3335,0.232683,-0.913584,4.059714,2.194906,-0.888152,
+ -0.719395,-0.61545,-0.322011,4.0247,2.187859,-0.814219,
+ 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
+ 0.89585,0.32639,-0.301532,4.102304,2.29996,-1.025862,
+ -0.396467,0.225967,-0.889805,4.155551,2.388662,-1.09196,
+ 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
+ -0.396467,0.225967,-0.889805,4.155551,2.388662,-1.09196,
+ -0.279333,0.256919,-0.925184,4.097362,2.3666,-1.239986,
+ 0.911709,-0.064352,-0.405765,4.104864,2.298353,-0.915735,
+ 0.760119,-0.003927,-0.649772,4.215419,2.350484,-0.885764,
+ -0.564249,0.755597,0.33271,4.194233,2.408334,-1.008471,
+ 0.911709,-0.064352,-0.405765,4.104864,2.298353,-0.915735,
+ -0.564249,0.755597,0.33271,4.194233,2.408334,-1.008471,
+ 0.89585,0.32639,-0.301532,4.102304,2.29996,-1.025862,
+ 0.89585,0.32639,-0.301532,4.102304,2.29996,-1.025862,
+ -0.564249,0.755597,0.33271,4.194233,2.408334,-1.008471,
+ -0.396467,0.225967,-0.889805,4.155551,2.388662,-1.09196,
+ 0.760119,-0.003927,-0.649772,4.215419,2.350484,-0.885764,
+ -0.841909,-0.49598,-0.212588,4.273005,2.310529,-0.762172,
+ -0.571598,0.654164,0.495323,4.307092,2.367482,-0.877202,
+ 0.760119,-0.003927,-0.649772,4.215419,2.350484,-0.885764,
+ -0.571598,0.654164,0.495323,4.307092,2.367482,-0.877202,
+ -0.601466,0.441167,0.666041,4.266263,2.421651,-1.054799,
+ 0.760119,-0.003927,-0.649772,4.215419,2.350484,-0.885764,
+ -0.601466,0.441167,0.666041,4.266263,2.421651,-1.054799,
+ -0.564249,0.755597,0.33271,4.194233,2.408334,-1.008471,
+ -0.564249,0.755597,0.33271,4.194233,2.408334,-1.008471,
+ -0.601466,0.441167,0.666041,4.266263,2.421651,-1.054799,
+ -0.434016,0.136262,0.890541,4.228523,2.435029,-1.098575,
+ -0.564249,0.755597,0.33271,4.194233,2.408334,-1.008471,
+ -0.434016,0.136262,0.890541,4.228523,2.435029,-1.098575,
+ -0.396467,0.225967,-0.889805,4.155551,2.388662,-1.09196,
+ -0.396467,0.225967,-0.889805,4.155551,2.388662,-1.09196,
+ -0.434016,0.136262,0.890541,4.228523,2.435029,-1.098575,
+ -0.195132,0.128745,0.97229,4.17047,2.458441,-1.241846,
+ -0.396467,0.225967,-0.889805,4.155551,2.388662,-1.09196,
+ -0.195132,0.128745,0.97229,4.17047,2.458441,-1.241846,
+ -0.279333,0.256919,-0.925184,4.097362,2.3666,-1.239986,
+ -0.279333,0.256919,-0.925184,4.097362,2.3666,-1.239986,
+ -0.195132,0.128745,0.97229,4.17047,2.458441,-1.241846,
+ -0.172151,0.101796,0.979797,4.094116,2.426172,-1.381032,
+ -0.279333,0.256919,-0.925184,4.097362,2.3666,-1.239986,
+ -0.172151,0.101796,0.979797,4.094116,2.426172,-1.381032,
+ -0.086812,-0.050981,0.994919,4.058311,2.293363,-1.338054,
+ -0.086812,-0.050981,0.994919,4.058311,2.293363,-1.338054,
+ -0.172151,0.101796,0.979797,4.094116,2.426172,-1.381032,
+ 0.020519,-0.282941,0.958918,4.046673,2.341349,-1.45253,
+ 0.3335,0.232683,-0.913584,4.059714,2.194906,-0.888152,
+ 0.911709,-0.064352,-0.405765,4.104864,2.298353,-0.915735,
+ 0.89585,0.32639,-0.301532,4.102304,2.29996,-1.025862,
+ 0.3335,0.232683,-0.913584,4.059714,2.194906,-0.888152,
+ 0.89585,0.32639,-0.301532,4.102304,2.29996,-1.025862,
+ 0.161194,-0.480657,0.861966,4.047406,2.207209,-1.015108,
+ 0.161194,-0.480657,0.861966,4.047406,2.207209,-1.015108,
+ 0.89585,0.32639,-0.301532,4.102304,2.29996,-1.025862,
+ 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
+ -0.975013,-0.179567,-0.130791,3.945464,2.1301,-0.689536,
+ -0.916648,-0.2944,-0.270344,3.990744,2.205448,-0.710795,
+ -0.719395,-0.61545,-0.322011,4.0247,2.187859,-0.814219,
+ -0.975013,-0.179567,-0.130791,3.945464,2.1301,-0.689536,
+ -0.719395,-0.61545,-0.322011,4.0247,2.187859,-0.814219,
+ 0.313443,-0.691245,0.651102,3.989434,2.118832,-0.765086,
+ 0.313443,-0.691245,0.651102,3.989434,2.118832,-0.765086,
+ -0.719395,-0.61545,-0.322011,4.0247,2.187859,-0.814219,
+ 0.3335,0.232683,-0.913584,4.059714,2.194906,-0.888152,
+ 0.313443,-0.691245,0.651102,3.989434,2.118832,-0.765086,
+ 0.3335,0.232683,-0.913584,4.059714,2.194906,-0.888152,
+ 0.492393,-0.77993,0.38634,4.022592,2.123052,-0.903284,
+ 0.492393,-0.77993,0.38634,4.022592,2.123052,-0.903284,
+ 0.3335,0.232683,-0.913584,4.059714,2.194906,-0.888152,
+ 0.161194,-0.480657,0.861966,4.047406,2.207209,-1.015108,
+ 0.492393,-0.77993,0.38634,4.022592,2.123052,-0.903284,
+ 0.161194,-0.480657,0.861966,4.047406,2.207209,-1.015108,
+ -0.463441,0.825581,0.321928,4.020299,2.141675,-1.002365,
+ -0.463441,0.825581,0.321928,4.020299,2.141675,-1.002365,
+ 0.161194,-0.480657,0.861966,4.047406,2.207209,-1.015108,
+ 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
+ 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
+ -0.279333,0.256919,-0.925184,4.097362,2.3666,-1.239986,
+ -0.086812,-0.050981,0.994919,4.058311,2.293363,-1.338054,
+ 0.261393,-0.399072,0.878872,4.036947,1.992167,-1.072561,
+ -0.463441,0.825581,0.321928,4.020299,2.141675,-1.002365,
+ 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
+ 0.261393,-0.399072,0.878872,4.036947,1.992167,-1.072561,
+ 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
+ 0.428291,-0.499911,0.752765,4.024858,2.106568,-1.208099,
+ 0.428291,-0.499911,0.752765,4.024858,2.106568,-1.208099,
+ 0.245858,0.150988,-0.957474,4.061989,2.231988,-1.178382,
+ -0.086812,-0.050981,0.994919,4.058311,2.293363,-1.338054,
+ -0.086812,-0.050981,0.994919,4.058311,2.293363,-1.338054,
+ 0.020519,-0.282941,0.958918,4.046673,2.341349,-1.45253,
+ 0.07924,-0.231863,0.969516,4.082988,2.175805,-1.45093,
+ -0.081635,-0.03459,0.996062,4.103303,2.038565,-1.363737,
+ 0.428291,-0.499911,0.752765,4.024858,2.106568,-1.208099,
+ -0.086812,-0.050981,0.994919,4.058311,2.293363,-1.338054,
+ -0.081635,-0.03459,0.996062,4.103303,2.038565,-1.363737,
+ -0.086812,-0.050981,0.994919,4.058311,2.293363,-1.338054,
+ 0.07924,-0.231863,0.969516,4.082988,2.175805,-1.45093,
+ 0.428291,-0.499911,0.752765,4.024858,2.106568,-1.208099,
+ -0.081635,-0.03459,0.996062,4.103303,2.038565,-1.363737,
+ -0.178707,0.132414,0.974951,4.152166,1.868775,-1.225002,
+ 0.428291,-0.499911,0.752765,4.024858,2.106568,-1.208099,
+ -0.178707,0.132414,0.974951,4.152166,1.868775,-1.225002,
+ 0.261393,-0.399072,0.878872,4.036947,1.992167,-1.072561,
+ 0.454048,-0.464454,0.760344,4.031515,1.968248,-0.91846,
+ 0.261393,-0.399072,0.878872,4.036947,1.992167,-1.072561,
+ -0.178707,0.132414,0.974951,4.152166,1.868775,-1.225002,
+ 0.454048,-0.464454,0.760344,4.031515,1.968248,-0.91846,
+ -0.178707,0.132414,0.974951,4.152166,1.868775,-1.225002,
+ -0.21777,0.161093,0.962614,4.127903,1.828359,-1.090512,
+ 0.454048,-0.464454,0.760344,4.031515,1.968248,-0.91846,
+ 0.492393,-0.77993,0.38634,4.022592,2.123052,-0.903284,
+ -0.463441,0.825581,0.321928,4.020299,2.141675,-1.002365,
+ 0.454048,-0.464454,0.760344,4.031515,1.968248,-0.91846,
+ -0.463441,0.825581,0.321928,4.020299,2.141675,-1.002365,
+ 0.261393,-0.399072,0.878872,4.036947,1.992167,-1.072561,
+ 0.673211,-0.580891,0.457551,3.922437,1.972461,-0.483563,
+ -0.768362,0.592232,0.242656,3.823349,2.141733,-0.428356,
+ -0.984655,0.15519,-0.07981,3.857922,2.141554,-0.521067,
+ 0.673211,-0.580891,0.457551,3.922437,1.972461,-0.483563,
+ -0.984655,0.15519,-0.07981,3.857922,2.141554,-0.521067,
+ -0.384424,0.863444,0.326623,3.966639,1.969285,-0.549291,
+ -0.384424,0.863444,0.326623,3.966639,1.969285,-0.549291,
+ -0.984655,0.15519,-0.07981,3.857922,2.141554,-0.521067,
+ -0.791764,-0.610494,0.020171,3.892378,2.149432,-0.603589,
+ -0.384424,0.863444,0.326623,3.966639,1.969285,-0.549291,
+ -0.791764,-0.610494,0.020171,3.892378,2.149432,-0.603589,
+ -0.354832,0.724971,0.590348,3.98291,1.987391,-0.639809,
+ 0.673211,-0.580891,0.457551,3.922437,1.972461,-0.483563,
+ -0.384424,0.863444,0.326623,3.966639,1.969285,-0.549291,
+ -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
+ 0.673211,-0.580891,0.457551,3.922437,1.972461,-0.483563,
+ -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
+ -0.447812,0.698934,0.557634,4.059885,1.86046,-0.470087,
+ -0.384424,0.863444,0.326623,3.966639,1.969285,-0.549291,
+ -0.354832,0.724971,0.590348,3.98291,1.987391,-0.639809,
+ -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
+ 0.313443,-0.691245,0.651102,3.989434,2.118832,-0.765086,
+ 0.492393,-0.77993,0.38634,4.022592,2.123052,-0.903284,
+ 0.454048,-0.464454,0.760344,4.031515,1.968248,-0.91846,
+ 0.313443,-0.691245,0.651102,3.989434,2.118832,-0.765086,
+ 0.454048,-0.464454,0.760344,4.031515,1.968248,-0.91846,
+ -0.270788,0.46353,0.843691,4.017509,1.996169,-0.731654,
+ -0.270788,0.46353,0.843691,4.017509,1.996169,-0.731654,
+ -0.975013,-0.179567,-0.130791,3.945464,2.1301,-0.689536,
+ 0.313443,-0.691245,0.651102,3.989434,2.118832,-0.765086,
+ -0.354832,0.724971,0.590348,3.98291,1.987391,-0.639809,
+ -0.791764,-0.610494,0.020171,3.892378,2.149432,-0.603589,
+ -0.975013,-0.179567,-0.130791,3.945464,2.1301,-0.689536,
+ -0.354832,0.724971,0.590348,3.98291,1.987391,-0.639809,
+ -0.975013,-0.179567,-0.130791,3.945464,2.1301,-0.689536,
+ -0.270788,0.46353,0.843691,4.017509,1.996169,-0.731654,
+ -0.354832,0.724971,0.590348,3.98291,1.987391,-0.639809,
+ -0.270788,0.46353,0.843691,4.017509,1.996169,-0.731654,
+ -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
+ -0.270788,0.46353,0.843691,4.017509,1.996169,-0.731654,
+ -0.273816,0.228927,0.93414,4.150297,1.820575,-0.917046,
+ -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
+ -0.270788,0.46353,0.843691,4.017509,1.996169,-0.731654,
+ 0.454048,-0.464454,0.760344,4.031515,1.968248,-0.91846,
+ -0.21777,0.161093,0.962614,4.127903,1.828359,-1.090512,
+ -0.270788,0.46353,0.843691,4.017509,1.996169,-0.731654,
+ -0.21777,0.161093,0.962614,4.127903,1.828359,-1.090512,
+ -0.273816,0.228927,0.93414,4.150297,1.820575,-0.917046,
+ -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
+ 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
+ 0.196849,0.14562,-0.969559,4.389484,2.190421,-0.47332,
+ -0.203969,0.261593,0.94338,4.314791,2.142163,-0.54065,
+ 0.196849,0.14562,-0.969559,4.389484,2.190421,-0.47332,
+ 0.159882,0.223439,0.961516,4.3427,2.112281,-0.516692,
+ -0.203969,0.261593,0.94338,4.314791,2.142163,-0.54065,
+ 0.159882,0.223439,0.961516,4.3427,2.112281,-0.516692,
+ 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
+ -0.203969,0.261593,0.94338,4.314791,2.142163,-0.54065,
+ -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
+ 0.196849,0.14562,-0.969559,4.389484,2.190421,-0.47332,
+ 0.159882,0.223439,0.961516,4.3427,2.112281,-0.516692,
+ 0.196849,0.14562,-0.969559,4.389484,2.190421,-0.47332,
+ 0.361081,-0.056526,-0.93082,4.43302,2.024714,-0.563794,
+ 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
+ 0.159882,0.223439,0.961516,4.3427,2.112281,-0.516692,
+ 0.361081,-0.056526,-0.93082,4.43302,2.024714,-0.563794,
+ 0.020519,-0.282941,0.958918,4.046673,2.341349,-1.45253,
+ -0.172151,0.101796,0.979797,4.094116,2.426172,-1.381032,
+ 0.482381,-0.398126,0.780259,4.148927,2.388726,-1.376879,
+ 0.020519,-0.282941,0.958918,4.046673,2.341349,-1.45253,
+ 0.482381,-0.398126,0.780259,4.148927,2.388726,-1.376879,
+ 0.702554,-0.570096,0.42592,4.101726,2.312318,-1.438163,
+ 0.45552,-0.330523,0.826593,4.149438,2.34055,-1.353693,
+ 0.331391,0.08899,0.939287,4.169404,2.306276,-1.284031,
+ 0.445439,-0.182623,0.876489,4.140097,2.295949,-1.367196,
+ 0.45552,-0.330523,0.826593,4.149438,2.34055,-1.353693,
+ 0.445439,-0.182623,0.876489,4.140097,2.295949,-1.367196,
+ 0.489736,-0.346185,0.800197,4.129926,2.30877,-1.402259,
+ 0.331391,0.08899,0.939287,4.169404,2.306276,-1.284031,
+ 0.474213,-0.311965,0.823286,4.141759,2.279958,-1.29534,
+ 0.445439,-0.182623,0.876489,4.140097,2.295949,-1.367196,
+ -0.172151,0.101796,0.979797,4.094116,2.426172,-1.381032,
+ -0.195132,0.128745,0.97229,4.17047,2.458441,-1.241846,
+ 0.483908,-0.405185,0.775667,4.197644,2.394643,-1.248646,
+ -0.172151,0.101796,0.979797,4.094116,2.426172,-1.381032,
+ 0.483908,-0.405185,0.775667,4.197644,2.394643,-1.248646,
+ 0.482381,-0.398126,0.780259,4.148927,2.388726,-1.376879,
+ 0.482381,-0.398126,0.780259,4.148927,2.388726,-1.376879,
+ 0.483908,-0.405185,0.775667,4.197644,2.394643,-1.248646,
+ 0.383941,-0.196382,0.902232,4.197516,2.349135,-1.253043,
+ 0.482381,-0.398126,0.780259,4.148927,2.388726,-1.376879,
+ 0.383941,-0.196382,0.902232,4.197516,2.349135,-1.253043,
+ 0.45552,-0.330523,0.826593,4.149438,2.34055,-1.353693,
+ 0.383941,-0.196382,0.902232,4.197516,2.349135,-1.253043,
+ 0.488174,-0.280956,0.826287,4.199317,2.304652,-1.17454,
+ 0.331391,0.08899,0.939287,4.169404,2.306276,-1.284031,
+ 0.383941,-0.196382,0.902232,4.197516,2.349135,-1.253043,
+ 0.331391,0.08899,0.939287,4.169404,2.306276,-1.284031,
+ 0.45552,-0.330523,0.826593,4.149438,2.34055,-1.353693,
+ 0.531574,-0.288506,0.796362,4.274886,2.22003,-0.679075,
+ -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
+ -0.203969,0.261593,0.94338,4.314791,2.142163,-0.54065,
+ 0.531574,-0.288506,0.796362,4.274886,2.22003,-0.679075,
+ -0.203969,0.261593,0.94338,4.314791,2.142163,-0.54065,
+ -0.175197,0.22468,0.958553,4.26732,2.121987,-0.61494,
+ -0.023695,0.006701,0.999697,4.38099,2.207701,-0.839016,
+ 0.531574,-0.288506,0.796362,4.274886,2.22003,-0.679075,
+ -0.175197,0.22468,0.958553,4.26732,2.121987,-0.61494,
+ -0.023695,0.006701,0.999697,4.38099,2.207701,-0.839016,
+ -0.175197,0.22468,0.958553,4.26732,2.121987,-0.61494,
+ -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
+ -0.963659,-0.230665,-0.134738,4.212974,2.303184,-0.587113,
+ -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
+ -0.990956,-0.062739,-0.118613,4.212058,2.27945,-0.625927,
+ -0.990956,-0.062739,-0.118613,4.212058,2.27945,-0.625927,
+ -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
+ -0.938303,-0.3372,-0.076703,4.229332,2.274522,-0.672749,
+ -0.938303,-0.3372,-0.076703,4.229332,2.274522,-0.672749,
+ -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
+ 0.531574,-0.288506,0.796362,4.274886,2.22003,-0.679075,
+ -0.841909,-0.49598,-0.212588,4.273005,2.310529,-0.762172,
+ -0.938303,-0.3372,-0.076703,4.229332,2.274522,-0.672749,
+ 0.531574,-0.288506,0.796362,4.274886,2.22003,-0.679075,
+ -0.841909,-0.49598,-0.212588,4.273005,2.310529,-0.762172,
+ 0.531574,-0.288506,0.796362,4.274886,2.22003,-0.679075,
+ -0.571598,0.654164,0.495323,4.307092,2.367482,-0.877202,
+ -0.175197,0.22468,0.958553,4.26732,2.121987,-0.61494,
+ -0.203969,0.261593,0.94338,4.314791,2.142163,-0.54065,
+ 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
+ -0.571598,0.654164,0.495323,4.307092,2.367482,-0.877202,
+ 0.531574,-0.288506,0.796362,4.274886,2.22003,-0.679075,
+ -0.023695,0.006701,0.999697,4.38099,2.207701,-0.839016,
+ -0.571598,0.654164,0.495323,4.307092,2.367482,-0.877202,
+ -0.023695,0.006701,0.999697,4.38099,2.207701,-0.839016,
+ 0.144017,-0.141696,0.979378,4.369751,2.298204,-0.921894,
+ 0.325831,-0.277459,0.903798,4.303193,2.347123,-1.044413,
+ -0.601466,0.441167,0.666041,4.266263,2.421651,-1.054799,
+ -0.571598,0.654164,0.495323,4.307092,2.367482,-0.877202,
+ 0.325831,-0.277459,0.903798,4.303193,2.347123,-1.044413,
+ -0.571598,0.654164,0.495323,4.307092,2.367482,-0.877202,
+ 0.144017,-0.141696,0.979378,4.369751,2.298204,-0.921894,
+ 0.441787,-0.375177,0.814903,4.245861,2.375093,-1.141312,
+ -0.434016,0.136262,0.890541,4.228523,2.435029,-1.098575,
+ -0.601466,0.441167,0.666041,4.266263,2.421651,-1.054799,
+ 0.441787,-0.375177,0.814903,4.245861,2.375093,-1.141312,
+ -0.601466,0.441167,0.666041,4.266263,2.421651,-1.054799,
+ 0.325831,-0.277459,0.903798,4.303193,2.347123,-1.044413,
+ 0.441787,-0.375177,0.814903,4.245861,2.375093,-1.141312,
+ 0.483908,-0.405185,0.775667,4.197644,2.394643,-1.248646,
+ -0.195132,0.128745,0.97229,4.17047,2.458441,-1.241846,
+ 0.441787,-0.375177,0.814903,4.245861,2.375093,-1.141312,
+ -0.195132,0.128745,0.97229,4.17047,2.458441,-1.241846,
+ -0.434016,0.136262,0.890541,4.228523,2.435029,-1.098575,
+ 0.383941,-0.196382,0.902232,4.197516,2.349135,-1.253043,
+ 0.483908,-0.405185,0.775667,4.197644,2.394643,-1.248646,
+ 0.441787,-0.375177,0.814903,4.245861,2.375093,-1.141312,
+ 0.383941,-0.196382,0.902232,4.197516,2.349135,-1.253043,
+ 0.441787,-0.375177,0.814903,4.245861,2.375093,-1.141312,
+ 0.226651,-0.023678,0.973688,4.218457,2.356834,-1.142444,
+ 0.226651,-0.023678,0.973688,4.218457,2.356834,-1.142444,
+ 0.441787,-0.375177,0.814903,4.245861,2.375093,-1.141312,
+ 0.325831,-0.277459,0.903798,4.303193,2.347123,-1.044413,
+ 0.226651,-0.023678,0.973688,4.218457,2.356834,-1.142444,
+ 0.325831,-0.277459,0.903798,4.303193,2.347123,-1.044413,
+ 0.065337,0.07376,0.995133,4.275405,2.319905,-1.0464,
+ 0.325831,-0.277459,0.903798,4.303193,2.347123,-1.044413,
+ 0.144017,-0.141696,0.979378,4.369751,2.298204,-0.921894,
+ -0.027323,0.180938,0.983115,4.296538,2.243779,-0.925459,
+ 0.325831,-0.277459,0.903798,4.303193,2.347123,-1.044413,
+ -0.027323,0.180938,0.983115,4.296538,2.243779,-0.925459,
+ 0.065337,0.07376,0.995133,4.275405,2.319905,-1.0464,
+ 0.144017,-0.141696,0.979378,4.369751,2.298204,-0.921894,
+ -0.023695,0.006701,0.999697,4.38099,2.207701,-0.839016,
+ -0.078774,0.27578,0.957987,4.289048,2.172969,-0.858693,
+ 0.144017,-0.141696,0.979378,4.369751,2.298204,-0.921894,
+ -0.078774,0.27578,0.957987,4.289048,2.172969,-0.858693,
+ -0.027323,0.180938,0.983115,4.296538,2.243779,-0.925459,
+ 0.488174,-0.280956,0.826287,4.199317,2.304652,-1.17454,
+ 0.383941,-0.196382,0.902232,4.197516,2.349135,-1.253043,
+ 0.226651,-0.023678,0.973688,4.218457,2.356834,-1.142444,
+ 0.488174,-0.280956,0.826287,4.199317,2.304652,-1.17454,
+ 0.226651,-0.023678,0.973688,4.218457,2.356834,-1.142444,
+ 0.065337,0.07376,0.995133,4.275405,2.319905,-1.0464,
+ 0.488174,-0.280956,0.826287,4.199317,2.304652,-1.17454,
+ 0.065337,0.07376,0.995133,4.275405,2.319905,-1.0464,
+ 0.769657,-0.480833,0.420033,4.211815,2.28249,-1.039137,
+ -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
+ -0.175197,0.22468,0.958553,4.26732,2.121987,-0.61494,
+ 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
+ -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
+ 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
+ -0.080985,0.883253,0.461851,4.278045,1.97666,-0.537351,
+ -0.078774,0.27578,0.957987,4.289048,2.172969,-0.858693,
+ -0.023695,0.006701,0.999697,4.38099,2.207701,-0.839016,
+ -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
+ -0.078774,0.27578,0.957987,4.289048,2.172969,-0.858693,
+ -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
+ -0.095989,0.297871,0.949768,4.290375,2.112337,-0.80019,
+ 0.769657,-0.480833,0.420033,4.211815,2.28249,-1.039137,
+ 0.065337,0.07376,0.995133,4.275405,2.319905,-1.0464,
+ -0.027323,0.180938,0.983115,4.296538,2.243779,-0.925459,
+ 0.769657,-0.480833,0.420033,4.211815,2.28249,-1.039137,
+ -0.027323,0.180938,0.983115,4.296538,2.243779,-0.925459,
+ 0.040193,0.650965,0.758043,4.222795,2.228178,-0.952752,
+ 0.040193,0.650965,0.758043,4.222795,2.228178,-0.952752,
+ -0.027323,0.180938,0.983115,4.296538,2.243779,-0.925459,
+ -0.078774,0.27578,0.957987,4.289048,2.172969,-0.858693,
+ 0.040193,0.650965,0.758043,4.222795,2.228178,-0.952752,
+ -0.078774,0.27578,0.957987,4.289048,2.172969,-0.858693,
+ 0.177367,0.480226,0.859025,4.197609,2.164063,-0.857433,
+ 0.177367,0.480226,0.859025,4.197609,2.164063,-0.857433,
+ -0.078774,0.27578,0.957987,4.289048,2.172969,-0.858693,
+ -0.095989,0.297871,0.949768,4.290375,2.112337,-0.80019,
+ 0.177367,0.480226,0.859025,4.197609,2.164063,-0.857433,
+ -0.095989,0.297871,0.949768,4.290375,2.112337,-0.80019,
+ 0.288711,0.386915,0.875753,4.153175,2.084823,-0.799668,
+ 0.41428,0.318289,0.85268,4.15109,2.102939,-0.889759,
+ 0.177367,0.480226,0.859025,4.197609,2.164063,-0.857433,
+ 0.288711,0.386915,0.875753,4.153175,2.084823,-0.799668,
+ 0.519338,0.264458,0.812619,4.148865,2.148829,-0.986567,
+ 0.040193,0.650965,0.758043,4.222795,2.228178,-0.952752,
+ 0.177367,0.480226,0.859025,4.197609,2.164063,-0.857433,
+ 0.519338,0.264458,0.812619,4.148865,2.148829,-0.986567,
+ 0.177367,0.480226,0.859025,4.197609,2.164063,-0.857433,
+ 0.41428,0.318289,0.85268,4.15109,2.102939,-0.889759,
+ 0.486425,0.192908,0.852161,4.154566,2.19048,-1.129552,
+ 0.769657,-0.480833,0.420033,4.211815,2.28249,-1.039137,
+ 0.040193,0.650965,0.758043,4.222795,2.228178,-0.952752,
+ 0.486425,0.192908,0.852161,4.154566,2.19048,-1.129552,
+ 0.040193,0.650965,0.758043,4.222795,2.228178,-0.952752,
+ 0.519338,0.264458,0.812619,4.148865,2.148829,-0.986567,
+ 0.449624,0.075438,0.890027,4.152557,2.235471,-1.217046,
+ 0.488174,-0.280956,0.826287,4.199317,2.304652,-1.17454,
+ 0.769657,-0.480833,0.420033,4.211815,2.28249,-1.039137,
+ 0.449624,0.075438,0.890027,4.152557,2.235471,-1.217046,
+ 0.769657,-0.480833,0.420033,4.211815,2.28249,-1.039137,
+ 0.486425,0.192908,0.852161,4.154566,2.19048,-1.129552,
+ 0.474213,-0.311965,0.823286,4.141759,2.279958,-1.29534,
+ 0.331391,0.08899,0.939287,4.169404,2.306276,-1.284031,
+ 0.488174,-0.280956,0.826287,4.199317,2.304652,-1.17454,
+ 0.474213,-0.311965,0.823286,4.141759,2.279958,-1.29534,
+ 0.488174,-0.280956,0.826287,4.199317,2.304652,-1.17454,
+ 0.449624,0.075438,0.890027,4.152557,2.235471,-1.217046,
+ 0.533629,-0.162705,0.82992,4.131949,2.050757,-0.921856,
+ 0.41428,0.318289,0.85268,4.15109,2.102939,-0.889759,
+ 0.288711,0.386915,0.875753,4.153175,2.084823,-0.799668,
+ 0.547549,-0.279581,0.788686,4.119993,2.063095,-1.049178,
+ 0.519338,0.264458,0.812619,4.148865,2.148829,-0.986567,
+ 0.41428,0.318289,0.85268,4.15109,2.102939,-0.889759,
+ 0.547549,-0.279581,0.788686,4.119993,2.063095,-1.049178,
+ 0.41428,0.318289,0.85268,4.15109,2.102939,-0.889759,
+ 0.533629,-0.162705,0.82992,4.131949,2.050757,-0.921856,
+ 0.598679,-0.200355,0.775527,4.12616,2.12093,-1.17252,
+ 0.486425,0.192908,0.852161,4.154566,2.19048,-1.129552,
+ 0.519338,0.264458,0.812619,4.148865,2.148829,-0.986567,
+ 0.598679,-0.200355,0.775527,4.12616,2.12093,-1.17252,
+ 0.519338,0.264458,0.812619,4.148865,2.148829,-0.986567,
+ 0.547549,-0.279581,0.788686,4.119993,2.063095,-1.049178,
+ 0.561098,-0.272385,0.78165,4.133175,2.175231,-1.259323,
+ 0.449624,0.075438,0.890027,4.152557,2.235471,-1.217046,
+ 0.486425,0.192908,0.852161,4.154566,2.19048,-1.129552,
+ 0.561098,-0.272385,0.78165,4.133175,2.175231,-1.259323,
+ 0.486425,0.192908,0.852161,4.154566,2.19048,-1.129552,
+ 0.598679,-0.200355,0.775527,4.12616,2.12093,-1.17252,
+ 0.561098,-0.272385,0.78165,4.133175,2.175231,-1.259323,
+ 0.474213,-0.311965,0.823286,4.141759,2.279958,-1.29534,
+ 0.449624,0.075438,0.890027,4.152557,2.235471,-1.217046,
+ 0.760747,-0.509474,0.40212,4.137657,1.944837,-1.061024,
+ 0.547549,-0.279581,0.788686,4.119993,2.063095,-1.049178,
+ 0.533629,-0.162705,0.82992,4.131949,2.050757,-0.921856,
+ 0.760747,-0.509474,0.40212,4.137657,1.944837,-1.061024,
+ 0.533629,-0.162705,0.82992,4.131949,2.050757,-0.921856,
+ 0.5205,-0.336657,0.784692,4.159229,1.949902,-0.923197,
+ -0.16423,0.819635,0.548842,4.143794,2.01372,-1.201386,
+ 0.598679,-0.200355,0.775527,4.12616,2.12093,-1.17252,
+ 0.547549,-0.279581,0.788686,4.119993,2.063095,-1.049178,
+ -0.16423,0.819635,0.548842,4.143794,2.01372,-1.201386,
+ 0.547549,-0.279581,0.788686,4.119993,2.063095,-1.049178,
+ 0.760747,-0.509474,0.40212,4.137657,1.944837,-1.061024,
+ -0.043323,0.541029,0.839887,4.12329,2.086854,-1.295135,
+ 0.561098,-0.272385,0.78165,4.133175,2.175231,-1.259323,
+ 0.598679,-0.200355,0.775527,4.12616,2.12093,-1.17252,
+ -0.043323,0.541029,0.839887,4.12329,2.086854,-1.295135,
+ 0.598679,-0.200355,0.775527,4.12616,2.12093,-1.17252,
+ -0.16423,0.819635,0.548842,4.143794,2.01372,-1.201386,
+ 0.04432,0.372862,0.926827,4.11268,2.195089,-1.366908,
+ 0.474213,-0.311965,0.823286,4.141759,2.279958,-1.29534,
+ 0.561098,-0.272385,0.78165,4.133175,2.175231,-1.259323,
+ 0.04432,0.372862,0.926827,4.11268,2.195089,-1.366908,
+ 0.561098,-0.272385,0.78165,4.133175,2.175231,-1.259323,
+ -0.043323,0.541029,0.839887,4.12329,2.086854,-1.295135,
+ 0.098376,0.32868,0.939304,4.111934,2.234814,-1.399949,
+ 0.445439,-0.182623,0.876489,4.140097,2.295949,-1.367196,
+ 0.474213,-0.311965,0.823286,4.141759,2.279958,-1.29534,
+ 0.098376,0.32868,0.939304,4.111934,2.234814,-1.399949,
+ 0.474213,-0.311965,0.823286,4.141759,2.279958,-1.29534,
+ 0.04432,0.372862,0.926827,4.11268,2.195089,-1.366908,
+ 0.098376,0.32868,0.939304,4.111934,2.234814,-1.399949,
+ 0.489736,-0.346185,0.800197,4.129926,2.30877,-1.402259,
+ 0.445439,-0.182623,0.876489,4.140097,2.295949,-1.367196,
+ -0.080985,0.883253,0.461851,4.278045,1.97666,-0.537351,
+ 0.525316,0.261331,0.809784,4.304562,1.906537,-0.572242,
+ 0.752227,-0.484776,0.446258,4.232341,1.903079,-0.534362,
+ -0.051423,0.948155,0.313619,4.240116,1.770049,-0.583946,
+ 0.752227,-0.484776,0.446258,4.232341,1.903079,-0.534362,
+ 0.525316,0.261331,0.809784,4.304562,1.906537,-0.572242,
+ -0.051423,0.948155,0.313619,4.240116,1.770049,-0.583946,
+ 0.525316,0.261331,0.809784,4.304562,1.906537,-0.572242,
+ 0.204286,0.745568,0.634347,4.303615,1.799914,-0.610388,
+ 0.525316,0.261331,0.809784,4.304562,1.906537,-0.572242,
+ -0.080985,0.883253,0.461851,4.278045,1.97666,-0.537351,
+ 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
+ 0.525316,0.261331,0.809784,4.304562,1.906537,-0.572242,
+ 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
+ 0.615047,0.769185,-0.17341,4.377095,1.871713,-0.595743,
+ 0.615047,0.769185,-0.17341,4.377095,1.871713,-0.595743,
+ 0.224429,0.165293,0.96037,4.305411,2.059245,-0.539407,
+ 0.361081,-0.056526,-0.93082,4.43302,2.024714,-0.563794,
+ 0.615047,0.769185,-0.17341,4.377095,1.871713,-0.595743,
+ 0.361081,-0.056526,-0.93082,4.43302,2.024714,-0.563794,
+ 0.36359,0.089346,-0.927264,4.43261,1.878873,-0.577888,
+ 0.969409,0.243853,-0.027951,4.148883,1.759918,-0.573765,
+ -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
+ 0.752227,-0.484776,0.446258,4.232341,1.903079,-0.534362,
+ 0.969409,0.243853,-0.027951,4.148883,1.759918,-0.573765,
+ 0.752227,-0.484776,0.446258,4.232341,1.903079,-0.534362,
+ -0.051423,0.948155,0.313619,4.240116,1.770049,-0.583946,
+ -0.095989,0.297871,0.949768,4.290375,2.112337,-0.80019,
+ -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
+ -0.158888,0.47696,0.864444,4.281287,2.055751,-0.787,
+ -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
+ -0.317114,0.866865,0.384686,4.354941,2.064161,-0.778851,
+ -0.158888,0.47696,0.864444,4.281287,2.055751,-0.787,
+ -0.158888,0.47696,0.864444,4.281287,2.055751,-0.787,
+ -0.317114,0.866865,0.384686,4.354941,2.064161,-0.778851,
+ -0.273708,0.760234,0.589175,4.245225,2.008532,-0.772641,
+ 0.288711,0.386915,0.875753,4.153175,2.084823,-0.799668,
+ -0.095989,0.297871,0.949768,4.290375,2.112337,-0.80019,
+ -0.158888,0.47696,0.864444,4.281287,2.055751,-0.787,
+ 0.533629,-0.162705,0.82992,4.131949,2.050757,-0.921856,
+ 0.288711,0.386915,0.875753,4.153175,2.084823,-0.799668,
+ -0.158888,0.47696,0.864444,4.281287,2.055751,-0.787,
+ 0.533629,-0.162705,0.82992,4.131949,2.050757,-0.921856,
+ -0.158888,0.47696,0.864444,4.281287,2.055751,-0.787,
+ 0.5205,-0.336657,0.784692,4.159229,1.949902,-0.923197,
+ -0.317114,0.866865,0.384686,4.354941,2.064161,-0.778851,
+ -0.128537,0.152973,0.979835,4.354411,2.102985,-0.80258,
+ -0.080985,0.883253,0.461851,4.278045,1.97666,-0.537351,
+ -0.317114,0.866865,0.384686,4.354941,2.064161,-0.778851,
+ -0.080985,0.883253,0.461851,4.278045,1.97666,-0.537351,
+ 0.752227,-0.484776,0.446258,4.232341,1.903079,-0.534362,
+ -0.317114,0.866865,0.384686,4.354941,2.064161,-0.778851,
+ 0.752227,-0.484776,0.446258,4.232341,1.903079,-0.534362,
+ -0.273708,0.760234,0.589175,4.245225,2.008532,-0.772641,
+ 0.5205,-0.336657,0.784692,4.159229,1.949902,-0.923197,
+ -0.158888,0.47696,0.864444,4.281287,2.055751,-0.787,
+ -0.273708,0.760234,0.589175,4.245225,2.008532,-0.772641,
+ -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
+ -0.2127,-0.171223,-0.961999,5.961686,1.110978,-0.090324,
+ 0.111896,-0.605741,-0.787755,5.950684,1.082725,-0.175648,
+ -0.026148,0.006311,-0.999638,5.998088,1.231874,-0.107334,
+ 0.111896,-0.605741,-0.787755,5.950684,1.082725,-0.175648,
+ 0.223936,-0.919046,-0.324355,5.959462,1.157227,-0.187097,
+ 0.173726,-0.983856,0.042973,5.672385,1.007694,-0.341778,
+ 0.231006,-0.859096,-0.456717,5.681086,1.054964,-0.35586,
+ 0.010578,-0.902776,-0.429981,5.763952,1.062109,-0.338641,
+ 0.173726,-0.983856,0.042973,5.672385,1.007694,-0.341778,
+ 0.010578,-0.902776,-0.429981,5.763952,1.062109,-0.338641,
+ 0.396941,-0.593504,-0.700137,5.755282,1.004149,-0.307505,
+ 0.707709,-0.687035,-0.164711,5.647186,1.394606,-0.257833,
+ 0.798302,-0.559383,0.22317,5.685194,1.452202,-0.188749,
+ 0.831976,-0.511655,0.214534,5.730427,1.435668,-0.209848,
+ 0.707709,-0.687035,-0.164711,5.647186,1.394606,-0.257833,
+ 0.831976,-0.511655,0.214534,5.730427,1.435668,-0.209848,
+ 0.744254,-0.654161,-0.134758,5.710154,1.360653,-0.290072,
+ 0.043397,0.435461,-0.899161,5.250485,1.123029,-0.385234,
+ 0.123418,-0.784469,-0.607763,5.241466,1.040469,-0.383965,
+ 0.274481,0.961015,-0.033322,5.011084,1.06677,-0.458562,
+ 0.043397,0.435461,-0.899161,5.250485,1.123029,-0.385234,
+ 0.274481,0.961015,-0.033322,5.011084,1.06677,-0.458562,
+ 0.012421,0.392537,-0.919653,4.991713,1.163096,-0.504149,
+ 0.381066,0.919021,-0.100938,4.567896,1.149805,-0.642484,
+ 0.481644,0.842268,0.242081,4.449011,1.260929,-0.647431,
+ 0.184871,0.227139,-0.956154,4.522247,1.398278,-0.644892,
+ 0.381066,0.919021,-0.100938,4.567896,1.149805,-0.642484,
+ 0.184871,0.227139,-0.956154,4.522247,1.398278,-0.644892,
+ -0.026366,0.234118,-0.971851,4.641547,1.285422,-0.622034,
+ -0.013461,-0.014478,-0.999805,4.697024,1.862575,-0.604048,
+ 0.667258,0.181112,-0.722471,4.688114,2.046378,-0.604518,
+ 0.856604,0.474873,-0.201803,4.728963,2.036146,-0.614307,
+ -0.013461,-0.014478,-0.999805,4.697024,1.862575,-0.604048,
+ 0.856604,0.474873,-0.201803,4.728963,2.036146,-0.614307,
+ 0.827569,0.284292,-0.484054,4.742358,1.882232,-0.62165,
+ 0.264979,0.116702,-0.957166,4.842883,2.021333,-0.638025,
+ 0.721999,0.398917,-0.565316,4.861611,2.001639,-0.621913,
+ 0.544735,0.449335,-0.708069,4.824747,1.946835,-0.626358,
+ 0.264979,0.116702,-0.957166,4.842883,2.021333,-0.638025,
+ 0.544735,0.449335,-0.708069,4.824747,1.946835,-0.626358,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ 0.397989,0.4494,-0.799778,4.861618,1.854067,-0.618095,
+ 0.708269,-0.122724,-0.695193,4.852582,1.816115,-0.603105,
+ 0.711192,0.127662,-0.69131,4.935561,2.016016,-0.5857,
+ 0.312982,-0.015529,-0.949632,4.93588,2.051665,-0.572853,
+ 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
+ 0.711192,0.127662,-0.69131,4.935561,2.016016,-0.5857,
+ 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
+ 0.872792,-0.115436,-0.474246,4.973133,1.992779,-0.533466,
+ 0.699393,0.056752,-0.71248,4.751519,2.039658,-0.634134,
+ 0.813293,0.022433,-0.581422,4.788476,2.028047,-0.608619,
+ 0.269343,0.329305,-0.904993,4.760921,1.881357,-0.61312,
+ 0.108828,-0.182644,-0.977137,4.982364,1.8733,-0.53619,
+ 0.412833,-0.156453,-0.897269,5.001903,1.914398,-0.486724,
+ 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
+ 0.108828,-0.182644,-0.977137,4.982364,1.8733,-0.53619,
+ 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
+ 0.661825,0.260115,-0.703085,4.991709,1.844295,-0.520761,
+ 0.470021,0.182979,-0.863481,4.991746,2.009819,-0.523206,
+ 0.431713,0.22912,-0.872427,5.01143,1.875569,-0.463205,
+ 0.412833,-0.156453,-0.897269,5.001903,1.914398,-0.486724,
+ 0.910294,-0.144636,-0.387873,4.881574,2.094571,-0.539949,
+ 0.588787,-0.248293,-0.769207,4.918466,2.084725,-0.532713,
+ 0.312982,-0.015529,-0.949632,4.93588,2.051665,-0.572853,
+ 0.719268,0.159441,-0.676189,4.636582,2.263383,-0.471997,
+ -0.114527,0.103064,-0.988059,4.739441,2.299169,-0.369987,
+ 0.45571,-0.00339,-0.890122,4.837331,2.235678,-0.479332,
+ 0.719268,0.159441,-0.676189,4.636582,2.263383,-0.471997,
+ 0.45571,-0.00339,-0.890122,4.837331,2.235678,-0.479332,
+ 0.766773,0.253147,-0.589894,4.74405,2.179337,-0.556057,
+ 0.781868,0.537364,-0.316105,5.057495,2.002751,-0.451974,
+ 0.332526,0.910491,-0.245832,5.067202,2.027704,-0.422291,
+ 0.077536,0.770695,-0.632469,5.095375,1.961238,-0.401516,
+ 0.781868,0.537364,-0.316105,5.057495,2.002751,-0.451974,
+ 0.077536,0.770695,-0.632469,5.095375,1.961238,-0.401516,
+ 0.89264,0.34991,-0.284178,5.075994,1.900999,-0.443793,
+ 0.07924,-0.231863,0.969516,4.082988,2.175805,-1.45093,
+ 0.020519,-0.282941,0.958918,4.046673,2.341349,-1.45253,
+ 0.702554,-0.570096,0.42592,4.101726,2.312318,-1.438163,
+ 0.07924,-0.231863,0.969516,4.082988,2.175805,-1.45093,
+ 0.702554,-0.570096,0.42592,4.101726,2.312318,-1.438163,
+ 0.489736,-0.346185,0.800197,4.129926,2.30877,-1.402259,
+ 0.07924,-0.231863,0.969516,4.082988,2.175805,-1.45093,
+ 0.489736,-0.346185,0.800197,4.129926,2.30877,-1.402259,
+ 0.098376,0.32868,0.939304,4.111934,2.234814,-1.399949,
+ 0.5205,-0.336657,0.784692,4.159229,1.949902,-0.923197,
+ -0.273708,0.760234,0.589175,4.245225,2.008532,-0.772641,
+ -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
+ 0.5205,-0.336657,0.784692,4.159229,1.949902,-0.923197,
+ -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
+ -0.273816,0.228927,0.93414,4.150297,1.820575,-0.917046,
+ 0.760747,-0.509474,0.40212,4.137657,1.944837,-1.061024,
+ 0.5205,-0.336657,0.784692,4.159229,1.949902,-0.923197,
+ -0.273816,0.228927,0.93414,4.150297,1.820575,-0.917046,
+ 0.760747,-0.509474,0.40212,4.137657,1.944837,-1.061024,
+ -0.273816,0.228927,0.93414,4.150297,1.820575,-0.917046,
+ -0.21777,0.161093,0.962614,4.127903,1.828359,-1.090512,
+ -0.16423,0.819635,0.548842,4.143794,2.01372,-1.201386,
+ 0.760747,-0.509474,0.40212,4.137657,1.944837,-1.061024,
+ -0.21777,0.161093,0.962614,4.127903,1.828359,-1.090512,
+ -0.16423,0.819635,0.548842,4.143794,2.01372,-1.201386,
+ -0.21777,0.161093,0.962614,4.127903,1.828359,-1.090512,
+ -0.178707,0.132414,0.974951,4.152166,1.868775,-1.225002,
+ -0.043323,0.541029,0.839887,4.12329,2.086854,-1.295135,
+ -0.16423,0.819635,0.548842,4.143794,2.01372,-1.201386,
+ -0.178707,0.132414,0.974951,4.152166,1.868775,-1.225002,
+ -0.043323,0.541029,0.839887,4.12329,2.086854,-1.295135,
+ -0.178707,0.132414,0.974951,4.152166,1.868775,-1.225002,
+ -0.081635,-0.03459,0.996062,4.103303,2.038565,-1.363737,
+ 0.04432,0.372862,0.926827,4.11268,2.195089,-1.366908,
+ -0.043323,0.541029,0.839887,4.12329,2.086854,-1.295135,
+ -0.081635,-0.03459,0.996062,4.103303,2.038565,-1.363737,
+ 0.04432,0.372862,0.926827,4.11268,2.195089,-1.366908,
+ -0.081635,-0.03459,0.996062,4.103303,2.038565,-1.363737,
+ 0.07924,-0.231863,0.969516,4.082988,2.175805,-1.45093,
+ 0.098376,0.32868,0.939304,4.111934,2.234814,-1.399949,
+ 0.04432,0.372862,0.926827,4.11268,2.195089,-1.366908,
+ 0.07924,-0.231863,0.969516,4.082988,2.175805,-1.45093,
+ -0.447812,0.698934,0.557634,4.059885,1.86046,-0.470087,
+ -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
+ 0.969409,0.243853,-0.027951,4.148883,1.759918,-0.573765,
+ -0.447812,0.698934,0.557634,4.059885,1.86046,-0.470087,
+ 0.969409,0.243853,-0.027951,4.148883,1.759918,-0.573765,
+ 0.971427,0.04566,0.232906,4.076852,1.746601,-0.527436,
+ -0.926486,-0.356041,-0.121897,4.126565,0.642027,0,
+ -0.086812,-0.050981,-0.994919,4.120842,0.627141,-0.185461,
+ 0.448666,0.893201,-0.029856,4.359048,0.700414,-0.166651,
+ -0.926486,-0.356041,-0.121897,4.126565,0.642027,0,
+ 0.448666,0.893201,-0.029856,4.359048,0.700414,-0.166651,
+ 0.000801,-1,-0.000539,4.380854,0.704574,-0.00013,
+ -0.564871,0.754993,-0.333026,3.881998,1.764428,-0.476337,
+ -0.447812,0.698934,0.557634,4.059885,1.86046,-0.470087,
+ 0.971427,0.04566,0.232906,4.076852,1.746601,-0.527436,
+ -0.571598,0.654164,-0.495323,3.886058,1.550141,-0.50483,
+ -0.564871,0.754993,-0.333026,3.881998,1.764428,-0.476337,
+ 0.971427,0.04566,0.232906,4.076852,1.746601,-0.527436,
+ -0.571598,0.654164,-0.495323,3.886058,1.550141,-0.50483,
+ 0.971427,0.04566,0.232906,4.076852,1.746601,-0.527436,
+ 0.811896,0.498733,-0.303464,4.067576,1.572668,-0.534997,
+ -0.601466,0.441167,-0.666041,3.98851,1.297806,-0.539537,
+ -0.571598,0.654164,-0.495323,3.886058,1.550141,-0.50483,
+ 0.811896,0.498733,-0.303464,4.067576,1.572668,-0.534997,
+ -0.601466,0.441167,-0.666041,3.98851,1.297806,-0.539537,
+ 0.811896,0.498733,-0.303464,4.067576,1.572668,-0.534997,
+ 0.800967,0.453078,0.391371,4.085564,1.288885,-0.544406,
+ -0.434016,0.136262,-0.890541,4.041657,1.039756,-0.496922,
+ -0.601466,0.441167,-0.666041,3.98851,1.297806,-0.539537,
+ 0.800967,0.453078,0.391371,4.085564,1.288885,-0.544406,
+ -0.434016,0.136262,-0.890541,4.041657,1.039756,-0.496922,
+ 0.800967,0.453078,0.391371,4.085564,1.288885,-0.544406,
+ 0.04154,0.947538,0.316932,4.141189,1.008775,-0.499342,
+ -0.195132,0.128745,-0.97229,4.068249,0.798926,-0.400813,
+ -0.434016,0.136262,-0.890541,4.041657,1.039756,-0.496922,
+ 0.04154,0.947538,0.316932,4.141189,1.008775,-0.499342,
+ -0.195132,0.128745,-0.97229,4.068249,0.798926,-0.400813,
+ 0.04154,0.947538,0.316932,4.141189,1.008775,-0.499342,
+ -0.051101,0.977083,0.206633,4.216374,0.852328,-0.405873,
+ -0.172151,0.101796,-0.979797,4.105198,0.672581,-0.300001,
+ -0.195132,0.128745,-0.97229,4.068249,0.798926,-0.400813,
+ -0.051101,0.977083,0.206633,4.216374,0.852328,-0.405873,
+ -0.172151,0.101796,-0.979797,4.105198,0.672581,-0.300001,
+ -0.051101,0.977083,0.206633,4.216374,0.852328,-0.405873,
+ 0.731768,0.675964,-0.087106,4.319799,0.731007,-0.291212,
+ -0.086812,-0.050981,-0.994919,4.120842,0.627141,-0.185461,
+ -0.172151,0.101796,-0.979797,4.105198,0.672581,-0.300001,
+ 0.731768,0.675964,-0.087106,4.319799,0.731007,-0.291212,
+ -0.086812,-0.050981,-0.994919,4.120842,0.627141,-0.185461,
+ 0.731768,0.675964,-0.087106,4.319799,0.731007,-0.291212,
+ 0.448666,0.893201,-0.029856,4.359048,0.700414,-0.166651,
+ -0.777939,0.62834,-0.000226,3.745669,2.266001,-0.24193,
+ -0.210883,0.942026,0.260987,3.828001,2.35254,-0.233341,
+ -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
+ -0.777939,0.62834,-0.000226,3.745669,2.266001,-0.24193,
+ -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
+ -0.698288,0.715816,-0.000608,3.758215,2.206683,-0.323051,
+ -0.451389,0.892327,-0.00019,3.727093,2.308406,-0.150049,
+ 0.431966,-0.771434,-0.46722,3.71636,2.343387,0,
+ 0.622247,0.782821,-0.000247,3.787342,2.396113,-0.001159,
+ -0.451389,0.892327,-0.00019,3.727093,2.308406,-0.150049,
+ 0.622247,0.782821,-0.000247,3.787342,2.396113,-0.001159,
+ -0.210883,0.942026,0.260987,3.828001,2.35254,-0.233341,
+ -0.777939,0.62834,-0.000226,3.745669,2.266001,-0.24193,
+ -0.451389,0.892327,-0.00019,3.727093,2.308406,-0.150049,
+ -0.210883,0.942026,0.260987,3.828001,2.35254,-0.233341,
+ 0.673211,-0.580891,0.457551,3.922437,1.972461,-0.483563,
+ -0.447812,0.698934,0.557634,4.059885,1.86046,-0.470087,
+ -0.564871,0.754993,-0.333026,3.881998,1.764428,-0.476337,
+ 0.673211,-0.580891,0.457551,3.922437,1.972461,-0.483563,
+ -0.564871,0.754993,-0.333026,3.881998,1.764428,-0.476337,
+ -0.512639,0.858604,-0.000762,3.814876,1.968416,-0.443,
+ -0.768362,0.592232,0.242656,3.823349,2.141733,-0.428356,
+ 0.673211,-0.580891,0.457551,3.922437,1.972461,-0.483563,
+ -0.512639,0.858604,-0.000762,3.814876,1.968416,-0.443,
+ -0.768362,0.592232,0.242656,3.823349,2.141733,-0.428356,
+ -0.512639,0.858604,-0.000762,3.814876,1.968416,-0.443,
+ -0.698288,0.715816,-0.000608,3.758215,2.206683,-0.323051,
+ -0.502349,0.838172,0.212398,3.870548,2.292106,-0.368964,
+ -0.768362,0.592232,0.242656,3.823349,2.141733,-0.428356,
+ -0.698288,0.715816,-0.000608,3.758215,2.206683,-0.323051,
+ -0.273708,0.760234,0.589175,4.245225,2.008532,-0.772641,
+ 0.752227,-0.484776,0.446258,4.232341,1.903079,-0.534362,
+ -0.385487,0.478576,0.788901,4.094112,1.889281,-0.578435,
+ -0.483189,-0.207332,-0.850613,1.655948,-2.520927,-0.844269,
+ -0.176356,-0.113876,-0.977717,1.678986,-2.513137,-0.891745,
+ -0.246054,-0.154918,-0.956796,1.718315,-2.775468,-0.921796,
+ -0.483189,-0.207332,-0.850613,1.655948,-2.520927,-0.844269,
+ -0.246054,-0.154918,-0.956796,1.718315,-2.775468,-0.921796,
+ 0.21689,-0.976039,0.017487,1.700797,-2.794792,-0.82425,
+ -0.246054,-0.154918,-0.956796,1.718315,-2.775468,-0.921796,
+ -0.024032,-0.835976,0.54824,1.734568,-2.965876,-0.986396,
+ -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
+ -0.246054,-0.154918,-0.956796,1.718315,-2.775468,-0.921796,
+ -0.90358,0.003167,-0.428408,1.705953,-3.006628,-0.83263,
+ 0.21689,-0.976039,0.017487,1.700797,-2.794792,-0.82425,
+ -0.079302,-0.84299,-0.532051,-1.305099,-1.70846,-0.48423,
+ -0.176655,-0.950799,-0.254508,-1.108758,-1.770749,-0.473033,
+ -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
+ -0.079302,-0.84299,-0.532051,-1.305099,-1.70846,-0.48423,
+ -0.253979,-0.745808,-0.615845,-0.977375,-1.793126,-0.498747,
+ -0.040019,-0.929968,-0.365457,-0.972514,-1.822778,-0.372649,
+ -0.171647,-0.971664,-0.162499,-1.406693,-1.697325,-0.450399,
+ -0.094238,-0.851252,-0.516225,-1.397474,-1.693815,-0.570541,
+ -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
+ -0.171647,-0.971664,-0.162499,-1.406693,-1.697325,-0.450399,
+ -0.149005,-0.65467,-0.741084,-1.266738,-1.691944,-0.557922,
+ -0.079302,-0.84299,-0.532051,-1.305099,-1.70846,-0.48423,
+ 0.072535,0.997366,0,-3.392806,1.769365,0,
+ -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
+ -0.108631,-0.122719,-0.986478,-3.35851,1.810253,-0.380095,
+ 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085,
+ 0.255239,-0.528231,-0.80983,-3.380836,1.819691,-0.123273,
+ -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
+ 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085,
+ -0.091034,0.391629,-0.915609,-3.413372,1.871604,-0.142309,
+ 0.072535,0.997366,0,-3.392806,1.769365,0,
+ 0.45552,-0.330523,0.826593,4.149438,2.34055,-1.353693,
+ 0.489736,-0.346185,0.800197,4.129926,2.30877,-1.402259,
+ 0.702554,-0.570096,0.42592,4.101726,2.312318,-1.438163,
+ 0.45552,-0.330523,0.826593,4.149438,2.34055,-1.353693,
+ 0.702554,-0.570096,0.42592,4.101726,2.312318,-1.438163,
+ 0.482381,-0.398126,0.780259,4.148927,2.388726,-1.376879,
+ 0.43907,-0.579988,-0.686171,-2.811581,-1.79821,-0.712737,
+ 0.579344,-0.339433,0.741044,-3.008323,-1.759271,-0.655672,
+ 0.789099,-0.039289,0.613008,-3.066022,-1.953125,-0.719516,
+ 0.43907,-0.579988,-0.686171,-2.811581,-1.79821,-0.712737,
+ 0.789099,-0.039289,0.613008,-3.066022,-1.953125,-0.719516,
+ 0.982106,-0.010346,-0.188044,-2.964215,-1.978727,-0.776572,
+ 0.579344,-0.339433,0.741044,-3.008323,-1.759271,-0.655672,
+ -0.012978,-0.998326,0.056357,-3.139394,-1.687482,-0.638546,
+ 0.230893,-0.309688,0.922378,-3.211005,-1.850398,-0.700723,
+ 0.579344,-0.339433,0.741044,-3.008323,-1.759271,-0.655672,
+ 0.230893,-0.309688,0.922378,-3.211005,-1.850398,-0.700723,
+ 0.789099,-0.039289,0.613008,-3.066022,-1.953125,-0.719516,
+ 0.111825,0.518485,0.847743,2.407309,-0.97498,0.805091,
+ 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
+ 0.09853,0.626571,0.773111,2.292449,-0.871852,0.8824,
+ 0.111825,0.518485,0.847743,2.407309,-0.97498,0.805091,
+ 0.09853,0.626571,0.773111,2.292449,-0.871852,0.8824,
+ 0.080812,0.697931,0.711591,2.229345,-0.992723,0.862826,
+ 0.163727,0.387435,0.907242,2.520417,-0.954785,0.739445,
+ 0.518786,-0.204527,0.830078,2.5392,-0.727778,0.750475,
+ 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
+ 0.163727,0.387435,0.907242,2.520417,-0.954785,0.739445,
+ 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
+ 0.111825,0.518485,0.847743,2.407309,-0.97498,0.805091,
+ 0.227108,0.258715,0.938876,2.637655,-0.768176,0.637039,
+ 0.518786,-0.204527,0.830078,2.5392,-0.727778,0.750475,
+ 0.163727,0.387435,0.907242,2.520417,-0.954785,0.739445,
+ 0.163727,0.387435,0.907242,2.520417,-0.954785,0.739445,
+ 0.304293,-0.024391,0.952266,2.514167,-1.077721,0.706614,
+ 0.263434,0.119819,0.957207,2.669281,-0.930664,0.557166,
+ 0.163727,0.387435,0.907242,2.520417,-0.954785,0.739445,
+ 0.263434,0.119819,0.957207,2.669281,-0.930664,0.557166,
+ 0.227108,0.258715,0.938876,2.637655,-0.768176,0.637039,
+ 0.111825,0.518485,0.847743,2.407309,-0.97498,0.805091,
+ 0.372063,-0.134052,0.918477,2.386465,-1.116066,0.761367,
+ 0.304293,-0.024391,0.952266,2.514167,-1.077721,0.706614,
+ 0.111825,0.518485,0.847743,2.407309,-0.97498,0.805091,
+ 0.304293,-0.024391,0.952266,2.514167,-1.077721,0.706614,
+ 0.163727,0.387435,0.907242,2.520417,-0.954785,0.739445,
+ 0.080812,0.697931,0.711591,2.229345,-0.992723,0.862826,
+ 0.424286,-0.254348,0.869073,2.180012,-1.130557,0.821812,
+ 0.372063,-0.134052,0.918477,2.386465,-1.116066,0.761367,
+ 0.080812,0.697931,0.711591,2.229345,-0.992723,0.862826,
+ 0.372063,-0.134052,0.918477,2.386465,-1.116066,0.761367,
+ 0.111825,0.518485,0.847743,2.407309,-0.97498,0.805091,
+ 0.383978,-0.566345,0.729256,2.158051,-1.209613,0.783941,
+ 0.420794,-0.405156,0.811653,2.354287,-1.193746,0.735189,
+ 0.372063,-0.134052,0.918477,2.386465,-1.116066,0.761367,
+ 0.383978,-0.566345,0.729256,2.158051,-1.209613,0.783941,
+ 0.372063,-0.134052,0.918477,2.386465,-1.116066,0.761367,
+ 0.424286,-0.254348,0.869073,2.180012,-1.130557,0.821812,
+ 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
+ 0.335626,-0.735806,0.588171,2.318787,-1.29409,0.673863,
+ 0.420794,-0.405156,0.811653,2.354287,-1.193746,0.735189,
+ 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
+ 0.420794,-0.405156,0.811653,2.354287,-1.193746,0.735189,
+ 0.383978,-0.566345,0.729256,2.158051,-1.209613,0.783941,
+ 0.298349,-0.828641,0.473647,2.274533,-1.433487,0.567366,
+ 0.335626,-0.735806,0.588171,2.318787,-1.29409,0.673863,
+ 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
+ 0.029207,0.916877,0.398099,2.45706,-1.400958,0.539866,
+ 0.267279,-0.944479,0.191107,2.486533,-1.274971,0.627822,
+ 0.335626,-0.735806,0.588171,2.318787,-1.29409,0.673863,
+ 0.029207,0.916877,0.398099,2.45706,-1.400958,0.539866,
+ 0.335626,-0.735806,0.588171,2.318787,-1.29409,0.673863,
+ 0.298349,-0.828641,0.473647,2.274533,-1.433487,0.567366,
+ 0.051939,0.876473,0.478641,2.549322,-1.335209,0.535156,
+ 0.267279,-0.944479,0.191107,2.486533,-1.274971,0.627822,
+ 0.029207,0.916877,0.398099,2.45706,-1.400958,0.539866,
+ 0.092427,0.86666,0.490262,2.61797,-1.235597,0.520238,
+ 0.267279,-0.944479,0.191107,2.486533,-1.274971,0.627822,
+ 0.051939,0.876473,0.478641,2.549322,-1.335209,0.535156,
+ 0.101272,0.634315,0.766413,2.670253,-1.108365,0.544018,
+ 0.129186,0.757141,0.64035,2.510841,-1.158786,0.678057,
+ 0.267279,-0.944479,0.191107,2.486533,-1.274971,0.627822,
+ 0.101272,0.634315,0.766413,2.670253,-1.108365,0.544018,
+ 0.267279,-0.944479,0.191107,2.486533,-1.274971,0.627822,
+ 0.092427,0.86666,0.490262,2.61797,-1.235597,0.520238,
+ 0.420794,-0.405156,0.811653,2.354287,-1.193746,0.735189,
+ 0.335626,-0.735806,0.588171,2.318787,-1.29409,0.673863,
+ 0.267279,-0.944479,0.191107,2.486533,-1.274971,0.627822,
+ 0.420794,-0.405156,0.811653,2.354287,-1.193746,0.735189,
+ 0.267279,-0.944479,0.191107,2.486533,-1.274971,0.627822,
+ 0.129186,0.757141,0.64035,2.510841,-1.158786,0.678057,
+ 0.129186,0.757141,0.64035,2.510841,-1.158786,0.678057,
+ 0.304293,-0.024391,0.952266,2.514167,-1.077721,0.706614,
+ 0.372063,-0.134052,0.918477,2.386465,-1.116066,0.761367,
+ 0.129186,0.757141,0.64035,2.510841,-1.158786,0.678057,
+ 0.372063,-0.134052,0.918477,2.386465,-1.116066,0.761367,
+ 0.420794,-0.405156,0.811653,2.354287,-1.193746,0.735189,
+ 0.101272,0.634315,0.766413,2.670253,-1.108365,0.544018,
+ 0.263434,0.119819,0.957207,2.669281,-0.930664,0.557166,
+ 0.304293,-0.024391,0.952266,2.514167,-1.077721,0.706614,
+ 0.101272,0.634315,0.766413,2.670253,-1.108365,0.544018,
+ 0.304293,-0.024391,0.952266,2.514167,-1.077721,0.706614,
+ 0.129186,0.757141,0.64035,2.510841,-1.158786,0.678057,
+ 0.089104,0.59547,0.798421,2.710721,-0.830091,0.532493,
+ 0.227108,0.258715,0.938876,2.637655,-0.768176,0.637039,
+ 0.263434,0.119819,0.957207,2.669281,-0.930664,0.557166,
+ 0.206788,0.399922,0.892917,2.757946,-1.099958,0.471684,
+ 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
+ 0.101272,0.634315,0.766413,2.670253,-1.108365,0.544018,
+ 0.101272,0.634315,0.766413,2.670253,-1.108365,0.544018,
+ 0.092427,0.86666,0.490262,2.61797,-1.235597,0.520238,
+ 0.206788,0.399922,0.892917,2.757946,-1.099958,0.471684,
+ 0.092427,0.86666,0.490262,2.61797,-1.235597,0.520238,
+ 0.274567,0.116527,0.954481,2.803736,-1.255869,0.438328,
+ 0.246802,0.252523,0.935586,2.847364,-1.103812,0.402301,
+ 0.092427,0.86666,0.490262,2.61797,-1.235597,0.520238,
+ 0.246802,0.252523,0.935586,2.847364,-1.103812,0.402301,
+ 0.206788,0.399922,0.892917,2.757946,-1.099958,0.471684,
+ 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
+ 0.206788,0.399922,0.892917,2.757946,-1.099958,0.471684,
+ 0.246802,0.252523,0.935586,2.847364,-1.103812,0.402301,
+ 0.303729,-0.050718,0.951408,2.740886,-1.339225,0.463604,
+ 0.274567,0.116527,0.954481,2.803736,-1.255869,0.438328,
+ 0.092427,0.86666,0.490262,2.61797,-1.235597,0.520238,
+ 0.051939,0.876473,0.478641,2.549322,-1.335209,0.535156,
+ 0.33122,-0.270106,0.904067,2.663024,-1.440487,0.478149,
+ 0.303729,-0.050718,0.951408,2.740886,-1.339225,0.463604,
+ 0.051939,0.876473,0.478641,2.549322,-1.335209,0.535156,
+ 0.303729,-0.050718,0.951408,2.740886,-1.339225,0.463604,
+ 0.092427,0.86666,0.490262,2.61797,-1.235597,0.520238,
+ 0.029207,0.916877,0.398099,2.45706,-1.400958,0.539866,
+ 0.327725,-0.489439,0.808112,2.515314,-1.507063,0.483275,
+ 0.33122,-0.270106,0.904067,2.663024,-1.440487,0.478149,
+ 0.029207,0.916877,0.398099,2.45706,-1.400958,0.539866,
+ 0.33122,-0.270106,0.904067,2.663024,-1.440487,0.478149,
+ 0.051939,0.876473,0.478641,2.549322,-1.335209,0.535156,
+ 0.291858,-0.681117,0.67149,2.422296,-1.510915,0.494169,
+ 0.327725,-0.489439,0.808112,2.515314,-1.507063,0.483275,
+ 0.029207,0.916877,0.398099,2.45706,-1.400958,0.539866,
+ 0.298349,-0.828641,0.473647,2.274533,-1.433487,0.567366,
+ 0.248915,-0.807091,0.535392,2.249663,-1.492705,0.53127,
+ 0.291858,-0.681117,0.67149,2.422296,-1.510915,0.494169,
+ 0.298349,-0.828641,0.473647,2.274533,-1.433487,0.567366,
+ 0.291858,-0.681117,0.67149,2.422296,-1.510915,0.494169,
+ 0.029207,0.916877,0.398099,2.45706,-1.400958,0.539866,
+ 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
+ 0.235033,-0.721825,0.650944,2.0796,-1.473377,0.654997,
+ 0.248915,-0.807091,0.535392,2.249663,-1.492705,0.53127,
+ 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
+ 0.248915,-0.807091,0.535392,2.249663,-1.492705,0.53127,
+ 0.298349,-0.828641,0.473647,2.274533,-1.433487,0.567366,
+ 0.246802,0.252523,0.935586,2.847364,-1.103812,0.402301,
+ 0.213948,-0.943673,0.252405,2.928787,-1.107467,0.312054,
+ 0.244106,-0.79539,0.554768,2.960118,-0.941827,0.284743,
+ 0.246802,0.252523,0.935586,2.847364,-1.103812,0.402301,
+ 0.244106,-0.79539,0.554768,2.960118,-0.941827,0.284743,
+ 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
+ 0.274567,0.116527,0.954481,2.803736,-1.255869,0.438328,
+ 0.190577,-0.970681,0.146488,2.893096,-1.302168,0.332049,
+ 0.213948,-0.943673,0.252405,2.928787,-1.107467,0.312054,
+ 0.274567,0.116527,0.954481,2.803736,-1.255869,0.438328,
+ 0.213948,-0.943673,0.252405,2.928787,-1.107467,0.312054,
+ 0.246802,0.252523,0.935586,2.847364,-1.103812,0.402301,
+ 0.303729,-0.050718,0.951408,2.740886,-1.339225,0.463604,
+ 0.048754,0.934073,0.353738,2.824356,-1.407256,0.355013,
+ 0.190577,-0.970681,0.146488,2.893096,-1.302168,0.332049,
+ 0.303729,-0.050718,0.951408,2.740886,-1.339225,0.463604,
+ 0.190577,-0.970681,0.146488,2.893096,-1.302168,0.332049,
+ 0.274567,0.116527,0.954481,2.803736,-1.255869,0.438328,
+ 0.33122,-0.270106,0.904067,2.663024,-1.440487,0.478149,
+ 0.081223,0.915345,0.394394,2.721135,-1.520418,0.362378,
+ 0.048754,0.934073,0.353738,2.824356,-1.407256,0.355013,
+ 0.327725,-0.489439,0.808112,2.515314,-1.507063,0.483275,
+ 0.120116,0.912706,0.390565,2.545261,-1.5933,0.38631,
+ 0.081223,0.915345,0.394394,2.721135,-1.520418,0.362378,
+ 0.327725,-0.489439,0.808112,2.515314,-1.507063,0.483275,
+ 0.081223,0.915345,0.394394,2.721135,-1.520418,0.362378,
+ 0.33122,-0.270106,0.904067,2.663024,-1.440487,0.478149,
+ 0.291858,-0.681117,0.67149,2.422296,-1.510915,0.494169,
+ 0.1717,0.74071,0.649514,2.396607,-1.593239,0.389972,
+ 0.120116,0.912706,0.390565,2.545261,-1.5933,0.38631,
+ 0.291858,-0.681117,0.67149,2.422296,-1.510915,0.494169,
+ 0.120116,0.912706,0.390565,2.545261,-1.5933,0.38631,
+ 0.327725,-0.489439,0.808112,2.515314,-1.507063,0.483275,
+ 0.248915,-0.807091,0.535392,2.249663,-1.492705,0.53127,
+ 0.167704,0.495674,0.852164,2.243492,-1.584783,0.431143,
+ 0.1717,0.74071,0.649514,2.396607,-1.593239,0.389972,
+ 0.248915,-0.807091,0.535392,2.249663,-1.492705,0.53127,
+ 0.1717,0.74071,0.649514,2.396607,-1.593239,0.389972,
+ 0.291858,-0.681117,0.67149,2.422296,-1.510915,0.494169,
+ 0.235033,-0.721825,0.650944,2.0796,-1.473377,0.654997,
+ 0.140536,0.558684,0.817388,2.0482,-1.581983,0.555832,
+ 0.167704,0.495674,0.852164,2.243492,-1.584783,0.431143,
+ 0.235033,-0.721825,0.650944,2.0796,-1.473377,0.654997,
+ 0.167704,0.495674,0.852164,2.243492,-1.584783,0.431143,
+ 0.248915,-0.807091,0.535392,2.249663,-1.492705,0.53127,
+ 0.213948,-0.943673,0.252405,2.928787,-1.107467,0.312054,
+ 0.820584,-0.571526,0,2.931756,-1.129655,0,
+ -0.334515,0.94239,0,2.970902,-0.959664,0,
+ 0.213948,-0.943673,0.252405,2.928787,-1.107467,0.312054,
+ -0.334515,0.94239,0,2.970902,-0.959664,0,
+ 0.244106,-0.79539,0.554768,2.960118,-0.941827,0.284743,
+ 0.190577,-0.970681,0.146488,2.893096,-1.302168,0.332049,
+ -0.255632,0.966774,0,2.896234,-1.31956,0,
+ 0.820584,-0.571526,0,2.931756,-1.129655,0,
+ 0.190577,-0.970681,0.146488,2.893096,-1.302168,0.332049,
+ 0.820584,-0.571526,0,2.931756,-1.129655,0,
+ 0.213948,-0.943673,0.252405,2.928787,-1.107467,0.312054,
+ 0.048754,0.934073,0.353738,2.824356,-1.407256,0.355013,
+ 0.826305,-0.563222,0,2.821376,-1.431534,0,
+ -0.255632,0.966774,0,2.896234,-1.31956,0,
+ 0.048754,0.934073,0.353738,2.824356,-1.407256,0.355013,
+ -0.255632,0.966774,0,2.896234,-1.31956,0,
+ 0.190577,-0.970681,0.146488,2.893096,-1.302168,0.332049,
+ 0.081223,0.915345,0.394394,2.721135,-1.520418,0.362378,
+ -0.133012,0.991114,0,2.706963,-1.528854,0,
+ 0.826305,-0.563222,0,2.821376,-1.431534,0,
+ 0.081223,0.915345,0.394394,2.721135,-1.520418,0.362378,
+ 0.826305,-0.563222,0,2.821376,-1.431534,0,
+ 0.048754,0.934073,0.353738,2.824356,-1.407256,0.355013,
+ 0.120116,0.912706,0.390565,2.545261,-1.5933,0.38631,
+ 0.815341,-0.578981,0,2.534227,-1.617078,0,
+ -0.133012,0.991114,0,2.706963,-1.528854,0,
+ 0.120116,0.912706,0.390565,2.545261,-1.5933,0.38631,
+ -0.133012,0.991114,0,2.706963,-1.528854,0,
+ 0.081223,0.915345,0.394394,2.721135,-1.520418,0.362378,
+ 0.1717,0.74071,0.649514,2.396607,-1.593239,0.389972,
+ -0.144073,0.989567,0,2.348182,-1.624595,0,
+ 0.815341,-0.578981,0,2.534227,-1.617078,0,
+ 0.1717,0.74071,0.649514,2.396607,-1.593239,0.389972,
+ 0.815341,-0.578981,0,2.534227,-1.617078,0,
+ 0.120116,0.912706,0.390565,2.545261,-1.5933,0.38631,
+ 0.167704,0.495674,0.852164,2.243492,-1.584783,0.431143,
+ -0.073566,0.99729,0,2.167167,-1.596326,0,
+ -0.144073,0.989567,0,2.348182,-1.624595,0,
+ 0.167704,0.495674,0.852164,2.243492,-1.584783,0.431143,
+ -0.144073,0.989567,0,2.348182,-1.624595,0,
+ 0.1717,0.74071,0.649514,2.396607,-1.593239,0.389972,
+ 0.140536,0.558684,0.817388,2.0482,-1.581983,0.555832,
+ -0.034649,0.9994,0,1.920432,-1.567396,0,
+ -0.073566,0.99729,0,2.167167,-1.596326,0,
+ 0.140536,0.558684,0.817388,2.0482,-1.581983,0.555832,
+ -0.073566,0.99729,0,2.167167,-1.596326,0,
+ 0.167704,0.495674,0.852164,2.243492,-1.584783,0.431143,
+ 0.100131,0.509748,0.854477,2.835437,-0.231101,0.57789,
+ 0.478274,-0.500384,0.721713,2.736198,-0.346225,0.659345,
+ 0.136523,0.621747,0.771228,2.881063,-0.493146,0.521968,
+ 0.136523,0.621747,0.771228,2.881063,-0.493146,0.521968,
+ 0.709718,-0.453837,0.538824,2.986408,-0.413503,0.428964,
+ 0.100131,0.509748,0.854477,2.835437,-0.231101,0.57789,
+ 0.063174,0.351351,0.93411,2.910769,-0.638444,0.431191,
+ 0.709718,-0.453837,0.538824,2.986408,-0.413503,0.428964,
+ 0.136523,0.621747,0.771228,2.881063,-0.493146,0.521968,
+ 0.136523,0.621747,0.771228,2.881063,-0.493146,0.521968,
+ 0.078896,0.195617,0.977502,2.82554,-0.567578,0.552597,
+ 0.063174,0.351351,0.93411,2.910769,-0.638444,0.431191,
+ 0.245892,-0.489895,0.836385,2.688131,-0.517509,0.672975,
+ 0.078896,0.195617,0.977502,2.82554,-0.567578,0.552597,
+ 0.136523,0.621747,0.771228,2.881063,-0.493146,0.521968,
+ 0.430574,-0.353967,0.830249,2.647368,-0.61155,0.669485,
+ 0.518786,-0.204527,0.830078,2.5392,-0.727778,0.750475,
+ 0.227108,0.258715,0.938876,2.637655,-0.768176,0.637039,
+ 0.58512,-0.108234,0.803692,2.618307,-0.549092,0.805491,
+ 0.518786,-0.204527,0.830078,2.5392,-0.727778,0.750475,
+ 0.430574,-0.353967,0.830249,2.647368,-0.61155,0.669485,
+ 0.430574,-0.353967,0.830249,2.647368,-0.61155,0.669485,
+ 0.245892,-0.489895,0.836385,2.688131,-0.517509,0.672975,
+ 0.58512,-0.108234,0.803692,2.618307,-0.549092,0.805491,
+ 0.089104,0.59547,0.798421,2.710721,-0.830091,0.532493,
+ 0.063174,0.351351,0.93411,2.910769,-0.638444,0.431191,
+ 0.078896,0.195617,0.977502,2.82554,-0.567578,0.552597,
+ 0.089104,0.59547,0.798421,2.710721,-0.830091,0.532493,
+ 0.078896,0.195617,0.977502,2.82554,-0.567578,0.552597,
+ 0.227108,0.258715,0.938876,2.637655,-0.768176,0.637039,
+ 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
+ 0.063174,0.351351,0.93411,2.910769,-0.638444,0.431191,
+ 0.089104,0.59547,0.798421,2.710721,-0.830091,0.532493,
+ 0.097816,-0.016117,0.995074,2.993075,-0.708434,0.342596,
+ 0.063174,0.351351,0.93411,2.910769,-0.638444,0.431191,
+ 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
+ 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
+ 0.244106,-0.79539,0.554768,2.960118,-0.941827,0.284743,
+ 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
+ 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
+ 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
+ 0.097816,-0.016117,0.995074,2.993075,-0.708434,0.342596,
+ -0.334515,0.94239,0,2.970902,-0.959664,0,
+ 0.942695,-0.333657,0,3.065544,-0.788768,0,
+ 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
+ -0.334515,0.94239,0,2.970902,-0.959664,0,
+ 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
+ 0.244106,-0.79539,0.554768,2.960118,-0.941827,0.284743,
+ -0.476715,0.879058,0,3.118124,-0.703925,0,
+ 0.6483,-0.171023,0.741928,3.107533,-0.691019,0.264602,
+ 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
+ -0.476715,0.879058,0,3.118124,-0.703925,0,
+ 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
+ 0.942695,-0.333657,0,3.065544,-0.788768,0,
+ 0.263434,0.119819,0.957207,2.669281,-0.930664,0.557166,
+ 0.101272,0.634315,0.766413,2.670253,-1.108365,0.544018,
+ 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
+ 0.263434,0.119819,0.957207,2.669281,-0.930664,0.557166,
+ 0.147941,0.53134,0.834141,2.857666,-0.930625,0.391195,
+ 0.089104,0.59547,0.798421,2.710721,-0.830091,0.532493,
+ 0.078896,0.195617,0.977502,2.82554,-0.567578,0.552597,
+ 0.245892,-0.489895,0.836385,2.688131,-0.517509,0.672975,
+ 0.430574,-0.353967,0.830249,2.647368,-0.61155,0.669485,
+ 0.078896,0.195617,0.977502,2.82554,-0.567578,0.552597,
+ 0.430574,-0.353967,0.830249,2.647368,-0.61155,0.669485,
+ 0.227108,0.258715,0.938876,2.637655,-0.768176,0.637039,
+ 0.063174,0.351351,0.93411,2.910769,-0.638444,0.431191,
+ 0.097816,-0.016117,0.995074,2.993075,-0.708434,0.342596,
+ 0.4379,-0.250054,0.863549,3.053144,-0.609681,0.326931,
+ 0.063174,0.351351,0.93411,2.910769,-0.638444,0.431191,
+ 0.4379,-0.250054,0.863549,3.053144,-0.609681,0.326931,
+ 0.709718,-0.453837,0.538824,2.986408,-0.413503,0.428964,
+ 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
+ 0.6483,-0.171023,0.741928,3.107533,-0.691019,0.264602,
+ 0.4379,-0.250054,0.863549,3.053144,-0.609681,0.326931,
+ 0.10737,-0.293005,0.950063,3.045715,-0.767786,0.261741,
+ 0.4379,-0.250054,0.863549,3.053144,-0.609681,0.326931,
+ 0.097816,-0.016117,0.995074,2.993075,-0.708434,0.342596,
+ -0.809154,0.004832,0.587577,-1.200688,-1.577575,0.799188,
+ -0.942755,-0.29871,-0.148273,-1.226563,-1.655159,0.687343,
+ -0.965506,-0.176768,-0.191185,-1.091175,-1.70712,0.727242,
+ -0.809154,0.004832,0.587577,-1.200688,-1.577575,0.799188,
+ -0.965506,-0.176768,-0.191185,-1.091175,-1.70712,0.727242,
+ -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
+ -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
+ -0.942755,-0.29871,-0.148273,-1.226563,-1.655159,0.687343,
+ -0.809154,0.004832,0.587577,-1.200688,-1.577575,0.799188,
+ 0.714393,-0.109998,0.691045,-1.266738,-1.691944,0.557922,
+ 0.859237,-0.17312,0.481395,-1.089642,-1.757196,0.685154,
+ -0.965506,-0.176768,-0.191185,-1.091175,-1.70712,0.727242,
+ 0.714393,-0.109998,0.691045,-1.266738,-1.691944,0.557922,
+ -0.965506,-0.176768,-0.191185,-1.091175,-1.70712,0.727242,
+ -0.942755,-0.29871,-0.148273,-1.226563,-1.655159,0.687343,
+ -0.017579,0.132168,0.991072,-0.972089,-1.774507,0.76857,
+ -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
+ -0.965506,-0.176768,-0.191185,-1.091175,-1.70712,0.727242,
+ 0.419396,-0.035927,0.907092,-0.812845,-1.785424,0.768511,
+ -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
+ -0.017579,0.132168,0.991072,-0.972089,-1.774507,0.76857,
+ 0.045651,-0.004499,0.998947,-0.680046,-1.768325,0.81908,
+ 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
+ -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
+ 0.045651,-0.004499,0.998947,-0.680046,-1.768325,0.81908,
+ -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
+ 0.419396,-0.035927,0.907092,-0.812845,-1.785424,0.768511,
+ 0.031476,0.864418,0.501787,-0.564074,-1.789401,0.803191,
+ 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
+ 0.045651,-0.004499,0.998947,-0.680046,-1.768325,0.81908,
+ -0.019419,-0.11596,0.993064,-0.422877,-1.7512,0.823423,
+ 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
+ 0.031476,0.864418,0.501787,-0.564074,-1.789401,0.803191,
+ 0.061261,0.954316,0.292452,-0.07847,-1.688266,0.80023,
+ -0.084259,-0.367691,0.926123,-0.063012,-1.583021,0.865082,
+ 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
+ 0.061261,0.954316,0.292452,-0.07847,-1.688266,0.80023,
+ 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
+ -0.019419,-0.11596,0.993064,-0.422877,-1.7512,0.823423,
+ -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
+ 0.076968,0.969253,0.233719,-0.094135,-1.769086,0.556924,
+ 0.061261,0.954316,0.292452,-0.07847,-1.688266,0.80023,
+ -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
+ 0.061261,0.954316,0.292452,-0.07847,-1.688266,0.80023,
+ -0.019419,-0.11596,0.993064,-0.422877,-1.7512,0.823423,
+ -0.019419,-0.11596,0.993064,-0.422877,-1.7512,0.823423,
+ 0.031476,0.864418,0.501787,-0.564074,-1.789401,0.803191,
+ -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
+ 0.045651,-0.004499,0.998947,-0.680046,-1.768325,0.81908,
+ -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
+ 0.031476,0.864418,0.501787,-0.564074,-1.789401,0.803191,
+ 0.419396,-0.035927,0.907092,-0.812845,-1.785424,0.768511,
+ -0.055857,0.145868,0.987726,-0.977375,-1.793126,0.498747,
+ -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
+ 0.419396,-0.035927,0.907092,-0.812845,-1.785424,0.768511,
+ -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
+ 0.045651,-0.004499,0.998947,-0.680046,-1.768325,0.81908,
+ -0.017579,0.132168,0.991072,-0.972089,-1.774507,0.76857,
+ -0.965506,-0.176768,-0.191185,-1.091175,-1.70712,0.727242,
+ 0.859237,-0.17312,0.481395,-1.089642,-1.757196,0.685154,
+ -0.182029,-0.190207,0.964721,-1.108758,-1.770749,0.473033,
+ -0.055857,0.145868,0.987726,-0.977375,-1.793126,0.498747,
+ 0.859237,-0.17312,0.481395,-1.089642,-1.757196,0.685154,
+ -0.182029,-0.190207,0.964721,-1.108758,-1.770749,0.473033,
+ 0.859237,-0.17312,0.481395,-1.089642,-1.757196,0.685154,
+ 0.714393,-0.109998,0.691045,-1.266738,-1.691944,0.557922,
+ 0.714393,-0.109998,0.691045,-1.266738,-1.691944,0.557922,
+ -0.571338,-0.120921,0.811758,-1.305099,-1.70846,0.48423,
+ -0.182029,-0.190207,0.964721,-1.108758,-1.770749,0.473033,
+ -0.942755,-0.29871,-0.148273,-1.226563,-1.655159,0.687343,
+ -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
+ 0.714393,-0.109998,0.691045,-1.266738,-1.691944,0.557922,
+ -0.587909,-0.233166,0.774594,-1.397474,-1.693815,0.570541,
+ 0.714393,-0.109998,0.691045,-1.266738,-1.691944,0.557922,
+ -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
+ -0.571338,-0.120921,0.811758,-1.305099,-1.70846,0.48423,
+ 0.023392,-0.110333,0.993619,-1.406693,-1.697325,0.450399,
+ -0.279485,0.127803,0.951606,-1.386502,-1.718441,0.350823,
+ -0.329905,-0.225598,0.916661,-0.972514,-1.822778,0.372649,
+ -0.571338,-0.120921,0.811758,-1.305099,-1.70846,0.48423,
+ -0.279485,0.127803,0.951606,-1.386502,-1.718441,0.350823,
+ 0.044022,0.273891,0.960753,-0.523838,-1.850065,0.388007,
+ -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
+ -0.055857,0.145868,0.987726,-0.977375,-1.793126,0.498747,
+ 0.044022,0.273891,0.960753,-0.523838,-1.850065,0.388007,
+ -0.055857,0.145868,0.987726,-0.977375,-1.793126,0.498747,
+ -0.329905,-0.225598,0.916661,-0.972514,-1.822778,0.372649,
+ 0.057779,0.975002,0.214553,-0.112666,-1.806584,0.383324,
+ 0.076968,0.969253,0.233719,-0.094135,-1.769086,0.556924,
+ -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
+ 0.057779,0.975002,0.214553,-0.112666,-1.806584,0.383324,
+ -0.004377,0.58747,0.809234,-0.543078,-1.810473,0.563825,
+ 0.044022,0.273891,0.960753,-0.523838,-1.850065,0.388007,
+ -0.178511,-0.973481,0.143068,0.480235,-1.631521,0.401961,
+ -0.1427,-0.847733,0.510868,0.489819,-1.524947,0.672392,
+ 0.076968,0.969253,0.233719,-0.094135,-1.769086,0.556924,
+ -0.178511,-0.973481,0.143068,0.480235,-1.631521,0.401961,
+ 0.076968,0.969253,0.233719,-0.094135,-1.769086,0.556924,
+ 0.057779,0.975002,0.214553,-0.112666,-1.806584,0.383324,
+ 0.057779,0.975002,0.214553,-0.112666,-1.806584,0.383324,
+ -0.084764,-0.996401,0,-0.155114,-1.828285,0,
+ 0.226963,-0.973903,0,0.44655,-1.67295,0,
+ 0.057779,0.975002,0.214553,-0.112666,-1.806584,0.383324,
+ 0.226963,-0.973903,0,0.44655,-1.67295,0,
+ -0.178511,-0.973481,0.143068,0.480235,-1.631521,0.401961,
+ 0.044022,0.273891,0.960753,-0.523838,-1.850065,0.388007,
+ 0.854132,-0.520056,0,-0.530369,-1.860806,0,
+ -0.084764,-0.996401,0,-0.155114,-1.828285,0,
+ 0.044022,0.273891,0.960753,-0.523838,-1.850065,0.388007,
+ -0.084764,-0.996401,0,-0.155114,-1.828285,0,
+ 0.057779,0.975002,0.214553,-0.112666,-1.806584,0.383324,
+ -0.329905,-0.225598,0.916661,-0.972514,-1.822778,0.372649,
+ 0.113474,-0.993541,0,-0.956007,-1.825728,0,
+ 0.854132,-0.520056,0,-0.530369,-1.860806,0,
+ -0.329905,-0.225598,0.916661,-0.972514,-1.822778,0.372649,
+ 0.854132,-0.520056,0,-0.530369,-1.860806,0,
+ 0.044022,0.273891,0.960753,-0.523838,-1.850065,0.388007,
+ -0.279485,0.127803,0.951606,-1.386502,-1.718441,0.350823,
+ 0.011286,0.999936,0,-1.395728,-1.723811,0,
+ 0.113474,-0.993541,0,-0.956007,-1.825728,0,
+ -0.279485,0.127803,0.951606,-1.386502,-1.718441,0.350823,
+ 0.113474,-0.993541,0,-0.956007,-1.825728,0,
+ -0.329905,-0.225598,0.916661,-0.972514,-1.822778,0.372649,
+ -0.055857,0.145868,0.987726,-0.977375,-1.793126,0.498747,
+ -0.017579,0.132168,0.991072,-0.972089,-1.774507,0.76857,
+ 0.859237,-0.17312,0.481395,-1.089642,-1.757196,0.685154,
+ -0.017579,0.132168,0.991072,-0.972089,-1.774507,0.76857,
+ -0.055857,0.145868,0.987726,-0.977375,-1.793126,0.498747,
+ 0.419396,-0.035927,0.907092,-0.812845,-1.785424,0.768511,
+ -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
+ -0.4909,0.016111,-0.871067,1.771416,-2.769024,0.9461,
+ 0.21689,-0.976039,-0.017487,1.718315,-2.775468,0.921796,
+ -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
+ 0.21689,-0.976039,-0.017487,1.718315,-2.775468,0.921796,
+ -0.424393,0.057227,0.903668,1.734568,-2.965876,0.986396,
+ -0.775358,0.344514,0.529274,2.021366,-2.881725,0.945561,
+ -0.440199,0.219838,0.870572,1.960643,-2.71286,0.90089,
+ -0.90358,0.003168,0.428409,1.880971,-2.733242,0.8902,
+ -0.775358,0.344514,0.529274,2.021366,-2.881725,0.945561,
+ -0.90358,0.003168,0.428409,1.880971,-2.733242,0.8902,
+ -0.032037,-0.072305,0.996868,1.911792,-2.895773,0.950117,
+ -0.820357,0.160676,0.548815,2.057496,-2.887282,0.844225,
+ 0.636282,0.100894,0.76483,1.994078,-2.713047,0.824553,
+ -0.440199,0.219838,0.870572,1.960643,-2.71286,0.90089,
+ -0.820357,0.160676,0.548815,2.057496,-2.887282,0.844225,
+ -0.440199,0.219838,0.870572,1.960643,-2.71286,0.90089,
+ -0.775358,0.344514,0.529274,2.021366,-2.881725,0.945561,
+ -0.906134,0.012265,-0.422813,1.735077,-3.022732,0.972751,
+ -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
+ -0.424393,0.057227,0.903668,1.734568,-2.965876,0.986396,
+ 0.461464,-0.003303,0.887153,1.721745,-3.116887,0.979111,
+ 0.000666,0.002295,0.999997,1.802387,-3.089615,0.961851,
+ -0.906134,0.012265,-0.422813,1.735077,-3.022732,0.972751,
+ -0.156447,-0.088128,0.983747,1.811797,-3.135641,0.933096,
+ 0.000666,0.002295,0.999997,1.802387,-3.089615,0.961851,
+ 0.461464,-0.003303,0.887153,1.721745,-3.116887,0.979111,
+ 0.773659,-0.235087,-0.588375,2.091539,-3.032437,0.947029,
+ 0.789099,-0.039289,-0.613008,2.113587,-3.011851,0.851648,
+ -0.820357,0.160676,0.548815,2.057496,-2.887282,0.844225,
+ 0.773659,-0.235087,-0.588375,2.091539,-3.032437,0.947029,
+ -0.820357,0.160676,0.548815,2.057496,-2.887282,0.844225,
+ -0.775358,0.344514,0.529274,2.021366,-2.881725,0.945561,
+ -0.90358,0.003168,0.428409,1.880971,-2.733242,0.8902,
+ -0.062994,-0.00854,-0.997977,1.830669,-2.736121,0.903313,
+ 0.433219,-0.09361,0.896414,1.848272,-2.92726,0.996966,
+ -0.90358,0.003168,0.428409,1.880971,-2.733242,0.8902,
+ 0.433219,-0.09361,0.896414,1.848272,-2.92726,0.996966,
+ -0.032037,-0.072305,0.996868,1.911792,-2.895773,0.950117,
+ 0.433219,-0.09361,0.896414,1.848272,-2.92726,0.996966,
+ -0.062994,-0.00854,-0.997977,1.830669,-2.736121,0.903313,
+ -0.4909,0.016111,-0.871067,1.771416,-2.769024,0.9461,
+ 0.433219,-0.09361,0.896414,1.848272,-2.92726,0.996966,
+ -0.4909,0.016111,-0.871067,1.771416,-2.769024,0.9461,
+ -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
+ -0.050511,-0.258376,-0.964723,1.709173,-3.133145,0.80794,
+ 0.461464,-0.003303,0.887153,1.721745,-3.116887,0.979111,
+ -0.906134,0.012265,-0.422813,1.735077,-3.022732,0.972751,
+ -0.050511,-0.258376,-0.964723,1.709173,-3.133145,0.80794,
+ -0.906134,0.012265,-0.422813,1.735077,-3.022732,0.972751,
+ -0.065687,-0.249194,-0.966223,1.705953,-3.006628,0.83263,
+ -0.042094,-0.220101,-0.974568,1.806407,-3.173343,0.834455,
+ -0.156447,-0.088128,0.983747,1.811797,-3.135641,0.933096,
+ 0.461464,-0.003303,0.887153,1.721745,-3.116887,0.979111,
+ -0.042094,-0.220101,-0.974568,1.806407,-3.173343,0.834455,
+ 0.461464,-0.003303,0.887153,1.721745,-3.116887,0.979111,
+ -0.050511,-0.258376,-0.964723,1.709173,-3.133145,0.80794,
+ -0.363523,-0.150625,-0.919327,1.900481,-3.131932,0.728621,
+ -0.042094,-0.220101,-0.974568,1.806407,-3.173343,0.834455,
+ -0.050511,-0.258376,-0.964723,1.709173,-3.133145,0.80794,
+ -0.363523,-0.150625,-0.919327,1.900481,-3.131932,0.728621,
+ -0.050511,-0.258376,-0.964723,1.709173,-3.133145,0.80794,
+ -0.326843,-0.236651,-0.91497,1.741854,-3.114181,0.700705,
+ 0.753698,-0.027204,-0.656657,1.776024,-2.980086,0.707575,
+ -0.326843,-0.236651,-0.91497,1.741854,-3.114181,0.700705,
+ -0.050511,-0.258376,-0.964723,1.709173,-3.133145,0.80794,
+ 0.753698,-0.027204,-0.656657,1.776024,-2.980086,0.707575,
+ -0.050511,-0.258376,-0.964723,1.709173,-3.133145,0.80794,
+ -0.065687,-0.249194,-0.966223,1.705953,-3.006628,0.83263,
+ -0.065687,-0.249194,-0.966223,1.705953,-3.006628,0.83263,
+ -0.020456,0.943466,0.330837,1.700797,-2.794792,0.82425,
+ 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
+ -0.065687,-0.249194,-0.966223,1.705953,-3.006628,0.83263,
+ 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
+ 0.753698,-0.027204,-0.656657,1.776024,-2.980086,0.707575,
+ -0.032037,-0.072305,0.996868,1.911792,-2.895773,0.950117,
+ -0.215783,-0.895808,-0.388544,1.980621,-3.043895,0.964237,
+ 0.773659,-0.235087,-0.588375,2.091539,-3.032437,0.947029,
+ -0.032037,-0.072305,0.996868,1.911792,-2.895773,0.950117,
+ 0.773659,-0.235087,-0.588375,2.091539,-3.032437,0.947029,
+ -0.775358,0.344514,0.529274,2.021366,-2.881725,0.945561,
+ -0.032037,-0.072305,0.996868,1.911792,-2.895773,0.950117,
+ 0.433219,-0.09361,0.896414,1.848272,-2.92726,0.996966,
+ 0.356923,-0.210291,0.910156,1.898573,-3.068274,0.994338,
+ -0.032037,-0.072305,0.996868,1.911792,-2.895773,0.950117,
+ 0.356923,-0.210291,0.910156,1.898573,-3.068274,0.994338,
+ -0.215783,-0.895808,-0.388544,1.980621,-3.043895,0.964237,
+ -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
+ 0.517272,-0.552302,0.653753,1.855134,-3.083228,0.986129,
+ 0.356923,-0.210291,0.910156,1.898573,-3.068274,0.994338,
+ -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
+ 0.356923,-0.210291,0.910156,1.898573,-3.068274,0.994338,
+ 0.433219,-0.09361,0.896414,1.848272,-2.92726,0.996966,
+ -0.156447,-0.088128,0.983747,1.811797,-3.135641,0.933096,
+ 0.517272,-0.552302,0.653753,1.855134,-3.083228,0.986129,
+ 0.000666,0.002295,0.999997,1.802387,-3.089615,0.961851,
+ 0.000666,0.002295,0.999997,1.802387,-3.089615,0.961851,
+ 0.517272,-0.552302,0.653753,1.855134,-3.083228,0.986129,
+ -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
+ 0.000666,0.002295,0.999997,1.802387,-3.089615,0.961851,
+ -0.51975,0.138222,0.843063,1.806371,-2.949735,0.984058,
+ -0.906134,0.012265,-0.422813,1.735077,-3.022732,0.972751,
+ -0.424393,0.057227,0.903668,1.734568,-2.965876,0.986396,
+ -0.065687,-0.249194,-0.966223,1.705953,-3.006628,0.83263,
+ -0.906134,0.012265,-0.422813,1.735077,-3.022732,0.972751,
+ -0.080858,0.024731,0.996419,2.07369,-3.020848,0.782654,
+ -0.753891,0.130682,0.643872,2.001343,-2.847715,0.762517,
+ -0.820357,0.160676,0.548815,2.057496,-2.887282,0.844225,
+ -0.080858,0.024731,0.996419,2.07369,-3.020848,0.782654,
+ -0.820357,0.160676,0.548815,2.057496,-2.887282,0.844225,
+ 0.789099,-0.039289,-0.613008,2.113587,-3.011851,0.851648,
+ -0.492859,-0.096404,0.864752,1.857471,-2.950722,0.669988,
+ -0.363523,-0.150625,-0.919327,1.900481,-3.131932,0.728621,
+ -0.326843,-0.236651,-0.91497,1.741854,-3.114181,0.700705,
+ 0.753698,-0.027204,-0.656657,1.776024,-2.980086,0.707575,
+ -0.492859,-0.096404,0.864752,1.857471,-2.950722,0.669988,
+ -0.326843,-0.236651,-0.91497,1.741854,-3.114181,0.700705,
+ -0.492859,-0.096404,0.864752,1.857471,-2.950722,0.669988,
+ 0.012244,-0.298111,0.954453,1.945632,-2.87671,0.703118,
+ -0.245482,-0.183394,0.951896,1.998099,-3.039955,0.718855,
+ -0.492859,-0.096404,0.864752,1.857471,-2.950722,0.669988,
+ -0.245482,-0.183394,0.951896,1.998099,-3.039955,0.718855,
+ -0.363523,-0.150625,-0.919327,1.900481,-3.131932,0.728621,
+ 0.012244,-0.298111,0.954453,1.945632,-2.87671,0.703118,
+ -0.753891,0.130682,0.643872,2.001343,-2.847715,0.762517,
+ -0.080858,0.024731,0.996419,2.07369,-3.020848,0.782654,
+ 0.012244,-0.298111,0.954453,1.945632,-2.87671,0.703118,
+ -0.080858,0.024731,0.996419,2.07369,-3.020848,0.782654,
+ -0.245482,-0.183394,0.951896,1.998099,-3.039955,0.718855,
+ 0.672894,0.661099,0.331907,1.841282,-2.716008,0.708009,
+ -0.545598,-0.330416,0.770161,1.884318,-2.724404,0.701999,
+ 0.012244,-0.298111,0.954453,1.945632,-2.87671,0.703118,
+ 0.672894,0.661099,0.331907,1.841282,-2.716008,0.708009,
+ 0.012244,-0.298111,0.954453,1.945632,-2.87671,0.703118,
+ -0.492859,-0.096404,0.864752,1.857471,-2.950722,0.669988,
+ -0.074103,0.409269,0.909399,1.972647,-2.728848,0.772496,
+ -0.753891,0.130682,0.643872,2.001343,-2.847715,0.762517,
+ 0.012244,-0.298111,0.954453,1.945632,-2.87671,0.703118,
+ -0.074103,0.409269,0.909399,1.972647,-2.728848,0.772496,
+ 0.012244,-0.298111,0.954453,1.945632,-2.87671,0.703118,
+ -0.545598,-0.330416,0.770161,1.884318,-2.724404,0.701999,
+ 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
+ 0.672894,0.661099,0.331907,1.841282,-2.716008,0.708009,
+ -0.492859,-0.096404,0.864752,1.857471,-2.950722,0.669988,
+ 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
+ -0.492859,-0.096404,0.864752,1.857471,-2.950722,0.669988,
+ 0.753698,-0.027204,-0.656657,1.776024,-2.980086,0.707575,
+ 0.009712,0.399549,0.91666,-2.687162,-1.539807,0.988048,
+ -0.13251,0.440061,0.888137,-2.837147,-1.791733,0.921563,
+ 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
+ 0.009712,0.399549,0.91666,-2.687162,-1.539807,0.988048,
+ 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
+ -0.995081,-0.092251,-0.036114,-2.591357,-1.510845,0.88547,
+ 0.095733,-0.224552,0.969748,-2.765069,-1.561164,1.084313,
+ 0.413011,0.629609,0.658038,-2.918293,-1.904184,1.004659,
+ -0.13251,0.440061,0.888137,-2.837147,-1.791733,0.921563,
+ 0.095733,-0.224552,0.969748,-2.765069,-1.561164,1.084313,
+ -0.13251,0.440061,0.888137,-2.837147,-1.791733,0.921563,
+ 0.009712,0.399549,0.91666,-2.687162,-1.539807,0.988048,
+ -0.149005,-0.65467,0.741084,-2.862576,-1.546894,1.117139,
+ 0.070969,0.266956,0.961092,-3.010917,-1.884498,1.08351,
+ 0.413011,0.629609,0.658038,-2.918293,-1.904184,1.004659,
+ -0.149005,-0.65467,0.741084,-2.862576,-1.546894,1.117139,
+ 0.413011,0.629609,0.658038,-2.918293,-1.904184,1.004659,
+ 0.095733,-0.224552,0.969748,-2.765069,-1.561164,1.084313,
+ -0.461794,0.113692,0.879671,-2.955052,-1.49684,1.128812,
+ 0.405633,0.578229,0.707893,-3.117476,-1.866892,1.108034,
+ 0.070969,0.266956,0.961092,-3.010917,-1.884498,1.08351,
+ -0.461794,0.113692,0.879671,-2.955052,-1.49684,1.128812,
+ 0.070969,0.266956,0.961092,-3.010917,-1.884498,1.08351,
+ -0.149005,-0.65467,0.741084,-2.862576,-1.546894,1.117139,
+ -0.18119,-0.970212,0.160805,-3.063133,-1.440555,1.090926,
+ -0.431118,-0.034268,0.901645,-3.23261,-1.834299,1.087832,
+ 0.405633,0.578229,0.707893,-3.117476,-1.866892,1.108034,
+ -0.18119,-0.970212,0.160805,-3.063133,-1.440555,1.090926,
+ 0.405633,0.578229,0.707893,-3.117476,-1.866892,1.108034,
+ -0.461794,0.113692,0.879671,-2.955052,-1.49684,1.128812,
+ 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
+ 0.596352,0.583149,0.551635,-3.498521,-1.762078,0.762472,
+ 0.637284,0.689194,0.344791,-3.49052,-1.760417,0.903104,
+ 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
+ 0.637284,0.689194,0.344791,-3.49052,-1.760417,0.903104,
+ 0.737412,0.542596,0.402261,-3.36599,-1.48517,0.888076,
+ 0.737412,0.542596,0.402261,-3.36599,-1.48517,0.888076,
+ 0.515412,-0.714946,-0.472444,-3.319817,-1.365015,0.886015,
+ -0.521685,-0.261319,0.812131,-3.335942,-1.365685,0.72459,
+ 0.737412,0.542596,0.402261,-3.36599,-1.48517,0.888076,
+ -0.521685,-0.261319,0.812131,-3.335942,-1.365685,0.72459,
+ 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
+ -0.637763,0.107242,0.76273,-3.068444,-2.260195,1.03507,
+ 0.503689,0.453945,0.735004,-3.177824,-2.279173,1.04758,
+ 0.851754,0.52393,-0.003494,-3.162498,-2.556375,1.058409,
+ -0.637763,0.107242,0.76273,-3.068444,-2.260195,1.03507,
+ 0.851754,0.52393,-0.003494,-3.162498,-2.556375,1.058409,
+ 0.840313,0.535537,-0.084107,-3.078699,-2.553982,1.046834,
+ -0.67011,-0.018974,0.742019,-3.047974,-2.109628,1.063497,
+ -0.833016,0.038682,0.551896,-3.169489,-2.110039,1.076796,
+ 0.503689,0.453945,0.735004,-3.177824,-2.279173,1.04758,
+ -0.67011,-0.018974,0.742019,-3.047974,-2.109628,1.063497,
+ 0.503689,0.453945,0.735004,-3.177824,-2.279173,1.04758,
+ -0.637763,0.107242,0.76273,-3.068444,-2.260195,1.03507,
+ 0.070969,0.266956,0.961092,-3.010917,-1.884498,1.08351,
+ 0.405633,0.578229,0.707893,-3.117476,-1.866892,1.108034,
+ -0.833016,0.038682,0.551896,-3.169489,-2.110039,1.076796,
+ 0.070969,0.266956,0.961092,-3.010917,-1.884498,1.08351,
+ -0.833016,0.038682,0.551896,-3.169489,-2.110039,1.076796,
+ -0.67011,-0.018974,0.742019,-3.047974,-2.109628,1.063497,
+ -0.833016,0.038682,0.551896,-3.169489,-2.110039,1.076796,
+ 0.197648,0.486888,0.850809,-3.207447,-2.103206,1.071366,
+ 0.503689,0.453945,0.735004,-3.177824,-2.279173,1.04758,
+ 0.405633,0.578229,0.707893,-3.117476,-1.866892,1.108034,
+ -0.431118,-0.034268,0.901645,-3.23261,-1.834299,1.087832,
+ 0.197648,0.486888,0.850809,-3.207447,-2.103206,1.071366,
+ 0.405633,0.578229,0.707893,-3.117476,-1.866892,1.108034,
+ 0.197648,0.486888,0.850809,-3.207447,-2.103206,1.071366,
+ -0.833016,0.038682,0.551896,-3.169489,-2.110039,1.076796,
+ 0.503689,0.453945,0.735004,-3.177824,-2.279173,1.04758,
+ 0.144389,0.231536,0.962051,-3.281816,-2.305055,1.001878,
+ 0.163153,0.19945,0.96623,-3.251541,-2.56405,1.023627,
+ 0.503689,0.453945,0.735004,-3.177824,-2.279173,1.04758,
+ 0.163153,0.19945,0.96623,-3.251541,-2.56405,1.023627,
+ 0.851754,0.52393,-0.003494,-3.162498,-2.556375,1.058409,
+ 0.197648,0.486888,0.850809,-3.207447,-2.103206,1.071366,
+ -0.985013,0.106757,-0.135469,-3.327526,-2.075729,1.005328,
+ 0.144389,0.231536,0.962051,-3.281816,-2.305055,1.001878,
+ 0.197648,0.486888,0.850809,-3.207447,-2.103206,1.071366,
+ 0.144389,0.231536,0.962051,-3.281816,-2.305055,1.001878,
+ 0.503689,0.453945,0.735004,-3.177824,-2.279173,1.04758,
+ -0.431118,-0.034268,0.901645,-3.23261,-1.834299,1.087832,
+ -0.46316,0.228643,0.856274,-3.357996,-1.811803,0.975625,
+ -0.985013,0.106757,-0.135469,-3.327526,-2.075729,1.005328,
+ -0.431118,-0.034268,0.901645,-3.23261,-1.834299,1.087832,
+ -0.985013,0.106757,-0.135469,-3.327526,-2.075729,1.005328,
+ 0.197648,0.486888,0.850809,-3.207447,-2.103206,1.071366,
+ 0.144389,0.231536,0.962051,-3.281816,-2.305055,1.001878,
+ -0.948593,-0.185732,-0.25627,-3.389388,-2.305625,0.950348,
+ -0.99734,0.010762,-0.072093,-3.347304,-2.573628,0.955211,
+ 0.144389,0.231536,0.962051,-3.281816,-2.305055,1.001878,
+ -0.99734,0.010762,-0.072093,-3.347304,-2.573628,0.955211,
+ 0.163153,0.19945,0.96623,-3.251541,-2.56405,1.023627,
+ -0.985013,0.106757,-0.135469,-3.327526,-2.075729,1.005328,
+ -0.948593,-0.185732,-0.25627,-3.451965,-2.077314,0.931974,
+ -0.948593,-0.185732,-0.25627,-3.389388,-2.305625,0.950348,
+ -0.985013,0.106757,-0.135469,-3.327526,-2.075729,1.005328,
+ -0.948593,-0.185732,-0.25627,-3.389388,-2.305625,0.950348,
+ 0.144389,0.231536,0.962051,-3.281816,-2.305055,1.001878,
+ -0.46316,0.228643,0.856274,-3.357996,-1.811803,0.975625,
+ 0.637284,0.689194,0.344791,-3.49052,-1.760417,0.903104,
+ -0.948593,-0.185732,-0.25627,-3.451965,-2.077314,0.931974,
+ -0.46316,0.228643,0.856274,-3.357996,-1.811803,0.975625,
+ -0.948593,-0.185732,-0.25627,-3.451965,-2.077314,0.931974,
+ -0.985013,0.106757,-0.135469,-3.327526,-2.075729,1.005328,
+ -0.471141,0.022027,-0.881783,-3.007483,-2.270712,0.984279,
+ -0.637763,0.107242,0.76273,-3.068444,-2.260195,1.03507,
+ 0.840313,0.535537,-0.084107,-3.078699,-2.553982,1.046834,
+ -0.471141,0.022027,-0.881783,-3.007483,-2.270712,0.984279,
+ 0.840313,0.535537,-0.084107,-3.078699,-2.553982,1.046834,
+ -0.178214,-0.110838,-0.977729,-3.022819,-2.52224,0.979148,
+ -0.385346,-0.01874,-0.922582,-2.969687,-2.097941,0.982836,
+ -0.67011,-0.018974,0.742019,-3.047974,-2.109628,1.063497,
+ -0.637763,0.107242,0.76273,-3.068444,-2.260195,1.03507,
+ -0.385346,-0.01874,-0.922582,-2.969687,-2.097941,0.982836,
+ -0.637763,0.107242,0.76273,-3.068444,-2.260195,1.03507,
+ -0.471141,0.022027,-0.881783,-3.007483,-2.270712,0.984279,
+ 0.413011,0.629609,0.658038,-2.918293,-1.904184,1.004659,
+ 0.070969,0.266956,0.961092,-3.010917,-1.884498,1.08351,
+ -0.67011,-0.018974,0.742019,-3.047974,-2.109628,1.063497,
+ 0.413011,0.629609,0.658038,-2.918293,-1.904184,1.004659,
+ -0.67011,-0.018974,0.742019,-3.047974,-2.109628,1.063497,
+ -0.385346,-0.01874,-0.922582,-2.969687,-2.097941,0.982836,
+ -0.13251,0.440061,0.888137,-2.837147,-1.791733,0.921563,
+ 0.413011,0.629609,0.658038,-2.918293,-1.904184,1.004659,
+ -0.11646,-0.017993,-0.993032,-2.892438,-1.95081,0.87812,
+ -0.385346,-0.01874,-0.922582,-2.969687,-2.097941,0.982836,
+ 0.156207,-0.109405,-0.981647,-2.981187,-2.142718,0.858353,
+ -0.11646,-0.017993,-0.993032,-2.892438,-1.95081,0.87812,
+ -0.385346,-0.01874,-0.922582,-2.969687,-2.097941,0.982836,
+ -0.11646,-0.017993,-0.993032,-2.892438,-1.95081,0.87812,
+ 0.413011,0.629609,0.658038,-2.918293,-1.904184,1.004659,
+ -0.471141,0.022027,-0.881783,-3.007483,-2.270712,0.984279,
+ 0.339875,0.026681,-0.940092,-3.030605,-2.311222,0.88433,
+ 0.156207,-0.109405,-0.981647,-2.981187,-2.142718,0.858353,
+ -0.471141,0.022027,-0.881783,-3.007483,-2.270712,0.984279,
+ 0.156207,-0.109405,-0.981647,-2.981187,-2.142718,0.858353,
+ -0.385346,-0.01874,-0.922582,-2.969687,-2.097941,0.982836,
+ -0.178214,-0.110838,-0.977729,-3.022819,-2.52224,0.979148,
+ -0.674431,0.094186,-0.732306,-3.04661,-2.510881,0.900772,
+ 0.339875,0.026681,-0.940092,-3.030605,-2.311222,0.88433,
+ -0.178214,-0.110838,-0.977729,-3.022819,-2.52224,0.979148,
+ 0.339875,0.026681,-0.940092,-3.030605,-2.311222,0.88433,
+ -0.471141,0.022027,-0.881783,-3.007483,-2.270712,0.984279,
+ 0.156207,-0.109405,-0.981647,-2.981187,-2.142718,0.858353,
+ -0.978077,-0.070308,-0.196017,-3.040398,-2.156239,0.808208,
+ -0.037581,-0.042039,-0.998409,-2.964215,-1.978727,0.776572,
+ 0.156207,-0.109405,-0.981647,-2.981187,-2.142718,0.858353,
+ -0.037581,-0.042039,-0.998409,-2.964215,-1.978727,0.776572,
+ -0.11646,-0.017993,-0.993032,-2.892438,-1.95081,0.87812,
+ 0.339875,0.026681,-0.940092,-3.030605,-2.311222,0.88433,
+ -0.978077,-0.070308,-0.196017,-3.040398,-2.156239,0.808208,
+ 0.156207,-0.109405,-0.981647,-2.981187,-2.142718,0.858353,
+ -0.039603,0.339955,0.939607,-3.144012,-2.333635,0.829994,
+ -0.556404,-0.045521,-0.829664,-3.120761,-2.15777,0.766432,
+ -0.978077,-0.070308,-0.196017,-3.040398,-2.156239,0.808208,
+ -0.039603,0.339955,0.939607,-3.144012,-2.333635,0.829994,
+ -0.978077,-0.070308,-0.196017,-3.040398,-2.156239,0.808208,
+ 0.339875,0.026681,-0.940092,-3.030605,-2.311222,0.88433,
+ -0.978077,-0.070308,-0.196017,-3.040398,-2.156239,0.808208,
+ -0.556404,-0.045521,-0.829664,-3.120761,-2.15777,0.766432,
+ -0.377491,-0.043727,0.92498,-3.066022,-1.953125,0.719516,
+ -0.978077,-0.070308,-0.196017,-3.040398,-2.156239,0.808208,
+ -0.377491,-0.043727,0.92498,-3.066022,-1.953125,0.719516,
+ -0.037581,-0.042039,-0.998409,-2.964215,-1.978727,0.776572,
+ -0.556404,-0.045521,-0.829664,-3.120761,-2.15777,0.766432,
+ 0.72114,0.258271,-0.642848,-3.253309,-2.137354,0.760713,
+ 0.684558,0.361153,-0.633205,-3.211005,-1.850398,0.700723,
+ -0.556404,-0.045521,-0.829664,-3.120761,-2.15777,0.766432,
+ 0.684558,0.361153,-0.633205,-3.211005,-1.850398,0.700723,
+ -0.377491,-0.043727,0.92498,-3.066022,-1.953125,0.719516,
+ -0.039603,0.339955,0.939607,-3.144012,-2.333635,0.829994,
+ 0.845209,0.529005,0.075999,-3.235873,-2.335338,0.820588,
+ 0.72114,0.258271,-0.642848,-3.253309,-2.137354,0.760713,
+ -0.039603,0.339955,0.939607,-3.144012,-2.333635,0.829994,
+ 0.72114,0.258271,-0.642848,-3.253309,-2.137354,0.760713,
+ -0.556404,-0.045521,-0.829664,-3.120761,-2.15777,0.766432,
+ 0.780958,0.624512,0.00945,-3.132772,-2.528669,0.848639,
+ 0.61389,0.702597,0.359856,-3.240554,-2.555467,0.856262,
+ 0.845209,0.529005,0.075999,-3.235873,-2.335338,0.820588,
+ 0.780958,0.624512,0.00945,-3.132772,-2.528669,0.848639,
+ 0.845209,0.529005,0.075999,-3.235873,-2.335338,0.820588,
+ -0.039603,0.339955,0.939607,-3.144012,-2.333635,0.829994,
+ 0.77125,0.634502,0.050796,-3.381262,-1.828189,0.697034,
+ 0.596352,0.583149,0.551635,-3.498521,-1.762078,0.762472,
+ 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
+ 0.77125,0.634502,0.050796,-3.381262,-1.828189,0.697034,
+ 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
+ 0.830793,-0.244757,0.499877,-3.304804,-1.582192,0.643445,
+ 0.830793,-0.244757,0.499877,-3.304804,-1.582192,0.643445,
+ 0.843062,-0.10517,0.527433,-3.139394,-1.687482,0.638546,
+ 0.684558,0.361153,-0.633205,-3.211005,-1.850398,0.700723,
+ 0.830793,-0.244757,0.499877,-3.304804,-1.582192,0.643445,
+ 0.684558,0.361153,-0.633205,-3.211005,-1.850398,0.700723,
+ 0.77125,0.634502,0.050796,-3.381262,-1.828189,0.697034,
+ 0.72114,0.258271,-0.642848,-3.253309,-2.137354,0.760713,
+ 0.712283,0.385668,-0.586441,-3.422698,-2.070796,0.773898,
+ 0.77125,0.634502,0.050796,-3.381262,-1.828189,0.697034,
+ 0.72114,0.258271,-0.642848,-3.253309,-2.137354,0.760713,
+ 0.77125,0.634502,0.050796,-3.381262,-1.828189,0.697034,
+ 0.684558,0.361153,-0.633205,-3.211005,-1.850398,0.700723,
+ 0.845209,0.529005,0.075999,-3.235873,-2.335338,0.820588,
+ 0.684834,0.490952,-0.538488,-3.339489,-2.328145,0.827572,
+ 0.712283,0.385668,-0.586441,-3.422698,-2.070796,0.773898,
+ 0.845209,0.529005,0.075999,-3.235873,-2.335338,0.820588,
+ 0.712283,0.385668,-0.586441,-3.422698,-2.070796,0.773898,
+ 0.72114,0.258271,-0.642848,-3.253309,-2.137354,0.760713,
+ 0.61389,0.702597,0.359856,-3.240554,-2.555467,0.856262,
+ 0.722847,0.455753,-0.519404,-3.297886,-2.54902,0.861657,
+ 0.684834,0.490952,-0.538488,-3.339489,-2.328145,0.827572,
+ 0.61389,0.702597,0.359856,-3.240554,-2.555467,0.856262,
+ 0.684834,0.490952,-0.538488,-3.339489,-2.328145,0.827572,
+ 0.845209,0.529005,0.075999,-3.235873,-2.335338,0.820588,
+ 0.712283,0.385668,-0.586441,-3.422698,-2.070796,0.773898,
+ -0.058899,-0.007802,-0.998233,-3.463753,-2.079892,0.844667,
+ 0.596352,0.583149,0.551635,-3.498521,-1.762078,0.762472,
+ 0.712283,0.385668,-0.586441,-3.422698,-2.070796,0.773898,
+ 0.596352,0.583149,0.551635,-3.498521,-1.762078,0.762472,
+ 0.77125,0.634502,0.050796,-3.381262,-1.828189,0.697034,
+ 0.684834,0.490952,-0.538488,-3.339489,-2.328145,0.827572,
+ 0.403627,0.101273,-0.909302,-3.412068,-2.356105,0.865813,
+ -0.058899,-0.007802,-0.998233,-3.463753,-2.079892,0.844667,
+ 0.684834,0.490952,-0.538488,-3.339489,-2.328145,0.827572,
+ -0.058899,-0.007802,-0.998233,-3.463753,-2.079892,0.844667,
+ 0.712283,0.385668,-0.586441,-3.422698,-2.070796,0.773898,
+ 0.722847,0.455753,-0.519404,-3.297886,-2.54902,0.861657,
+ 0.308087,0.149605,-0.939522,-3.372066,-2.569159,0.904785,
+ 0.403627,0.101273,-0.909302,-3.412068,-2.356105,0.865813,
+ 0.722847,0.455753,-0.519404,-3.297886,-2.54902,0.861657,
+ 0.403627,0.101273,-0.909302,-3.412068,-2.356105,0.865813,
+ 0.684834,0.490952,-0.538488,-3.339489,-2.328145,0.827572,
+ 0.403627,0.101273,-0.909302,-3.412068,-2.356105,0.865813,
+ -0.948593,-0.185732,-0.25627,-3.389388,-2.305625,0.950348,
+ -0.948593,-0.185732,-0.25627,-3.451965,-2.077314,0.931974,
+ 0.403627,0.101273,-0.909302,-3.412068,-2.356105,0.865813,
+ -0.948593,-0.185732,-0.25627,-3.451965,-2.077314,0.931974,
+ -0.058899,-0.007802,-0.998233,-3.463753,-2.079892,0.844667,
+ 0.308087,0.149605,-0.939522,-3.372066,-2.569159,0.904785,
+ -0.99734,0.010762,-0.072093,-3.347304,-2.573628,0.955211,
+ -0.948593,-0.185732,-0.25627,-3.389388,-2.305625,0.950348,
+ 0.308087,0.149605,-0.939522,-3.372066,-2.569159,0.904785,
+ -0.948593,-0.185732,-0.25627,-3.389388,-2.305625,0.950348,
+ 0.403627,0.101273,-0.909302,-3.412068,-2.356105,0.865813,
+ -0.058899,-0.007802,-0.998233,-3.463753,-2.079892,0.844667,
+ -0.948593,-0.185732,-0.25627,-3.451965,-2.077314,0.931974,
+ 0.637284,0.689194,0.344791,-3.49052,-1.760417,0.903104,
+ -0.058899,-0.007802,-0.998233,-3.463753,-2.079892,0.844667,
+ 0.637284,0.689194,0.344791,-3.49052,-1.760417,0.903104,
+ 0.596352,0.583149,0.551635,-3.498521,-1.762078,0.762472,
+ -0.508357,0.250892,0.823787,-3.342096,-1.533989,0.921628,
+ 0.737412,0.542596,0.402261,-3.36599,-1.48517,0.888076,
+ 0.637284,0.689194,0.344791,-3.49052,-1.760417,0.903104,
+ -0.508357,0.250892,0.823787,-3.342096,-1.533989,0.921628,
+ 0.637284,0.689194,0.344791,-3.49052,-1.760417,0.903104,
+ -0.46316,0.228643,0.856274,-3.357996,-1.811803,0.975625,
+ -0.430524,-0.648446,0.627828,2.02453,-2.195334,0.811284,
+ 0.626232,0.565165,0.53705,1.98533,-2.221319,0.893145,
+ 0.768073,0.514956,0.380637,1.930747,-2.463535,0.894743,
+ -0.430524,-0.648446,0.627828,2.02453,-2.195334,0.811284,
+ 0.768073,0.514956,0.380637,1.930747,-2.463535,0.894743,
+ 0.213417,-0.547722,0.808983,1.953911,-2.462233,0.830594,
+ -0.492627,0.113675,0.862784,2.047696,-2.050138,0.814712,
+ 0.52783,0.437826,0.727807,2.013095,-2.051912,0.911043,
+ 0.626232,0.565165,0.53705,1.98533,-2.221319,0.893145,
+ -0.492627,0.113675,0.862784,2.047696,-2.050138,0.814712,
+ 0.626232,0.565165,0.53705,1.98533,-2.221319,0.893145,
+ -0.430524,-0.648446,0.627828,2.02453,-2.195334,0.811284,
+ -0.495591,0.225654,0.838731,2.053108,-1.738285,0.824853,
+ 0.862528,0.499882,-0.078511,2.021591,-1.755289,0.912093,
+ 0.52783,0.437826,0.727807,2.013095,-2.051912,0.911043,
+ -0.495591,0.225654,0.838731,2.053108,-1.738285,0.824853,
+ 0.52783,0.437826,0.727807,2.013095,-2.051912,0.911043,
+ -0.492627,0.113675,0.862784,2.047696,-2.050138,0.814712,
+ -0.541077,0.245809,0.804247,2.059844,-1.561331,0.858957,
+ 0.872426,0.488735,-0.003223,2.036036,-1.57908,0.967151,
+ 0.862528,0.499882,-0.078511,2.021591,-1.755289,0.912093,
+ -0.541077,0.245809,0.804247,2.059844,-1.561331,0.858957,
+ 0.862528,0.499882,-0.078511,2.021591,-1.755289,0.912093,
+ -0.495591,0.225654,0.838731,2.053108,-1.738285,0.824853,
+ 0.21689,-0.976039,-0.017487,1.718315,-2.775468,0.921796,
+ -0.4909,0.016111,-0.871067,1.771416,-2.769024,0.9461,
+ -0.184432,-0.109597,-0.976716,1.737623,-2.485017,0.918334,
+ 0.21689,-0.976039,-0.017487,1.718315,-2.775468,0.921796,
+ -0.184432,-0.109597,-0.976716,1.737623,-2.485017,0.918334,
+ 0.383337,-0.601981,-0.700479,1.678986,-2.513137,0.891745,
+ 0.383337,-0.601981,-0.700479,1.678986,-2.513137,0.891745,
+ -0.184432,-0.109597,-0.976716,1.737623,-2.485017,0.918334,
+ -0.554502,-0.046423,-0.830886,1.710406,-2.272223,0.954296,
+ 0.383337,-0.601981,-0.700479,1.678986,-2.513137,0.891745,
+ -0.554502,-0.046423,-0.830886,1.710406,-2.272223,0.954296,
+ -0.701253,0.091018,-0.707079,1.648793,-2.280014,0.929365,
+ -0.701253,0.091018,-0.707079,1.648793,-2.280014,0.929365,
+ -0.554502,-0.046423,-0.830886,1.710406,-2.272223,0.954296,
+ -0.554151,-0.205896,-0.80655,1.720031,-2.105568,0.971354,
+ -0.701253,0.091018,-0.707079,1.648793,-2.280014,0.929365,
+ -0.554151,-0.205896,-0.80655,1.720031,-2.105568,0.971354,
+ -0.706628,-0.050081,-0.705811,1.6249,-2.087301,0.963391,
+ -0.706628,-0.050081,-0.705811,1.6249,-2.087301,0.963391,
+ -0.554151,-0.205896,-0.80655,1.720031,-2.105568,0.971354,
+ -0.343436,-0.507052,-0.790537,1.717145,-1.80953,1.004092,
+ -0.706628,-0.050081,-0.705811,1.6249,-2.087301,0.963391,
+ -0.343436,-0.507052,-0.790537,1.717145,-1.80953,1.004092,
+ -0.990285,-0.10079,-0.095796,1.572979,-1.827591,0.985823,
+ -0.990285,-0.10079,-0.095796,1.572979,-1.827591,0.985823,
+ -0.343436,-0.507052,-0.790537,1.717145,-1.80953,1.004092,
+ 0.056398,-0.684481,-0.726846,1.650318,-1.645881,1.053347,
+ -0.990285,-0.10079,-0.095796,1.572979,-1.827591,0.985823,
+ 0.056398,-0.684481,-0.726846,1.650318,-1.645881,1.053347,
+ -0.404532,-0.045989,0.913367,1.54175,-1.643613,1.01419,
+ 0.717573,0.343682,-0.605782,1.655948,-2.520927,0.844269,
+ 0.383337,-0.601981,-0.700479,1.678986,-2.513137,0.891745,
+ -0.701253,0.091018,-0.707079,1.648793,-2.280014,0.929365,
+ 0.717573,0.343682,-0.605782,1.655948,-2.520927,0.844269,
+ -0.701253,0.091018,-0.707079,1.648793,-2.280014,0.929365,
+ 0.743894,0.373896,-0.553916,1.586321,-2.273752,0.880969,
+ 0.743894,0.373896,-0.553916,1.586321,-2.273752,0.880969,
+ -0.701253,0.091018,-0.707079,1.648793,-2.280014,0.929365,
+ -0.706628,-0.050081,-0.705811,1.6249,-2.087301,0.963391,
+ 0.743894,0.373896,-0.553916,1.586321,-2.273752,0.880969,
+ -0.706628,-0.050081,-0.705811,1.6249,-2.087301,0.963391,
+ 0.752232,0.244351,-0.611914,1.529305,-2.092083,0.887353,
+ 0.752232,0.244351,-0.611914,1.529305,-2.092083,0.887353,
+ -0.706628,-0.050081,-0.705811,1.6249,-2.087301,0.963391,
+ -0.990285,-0.10079,-0.095796,1.572979,-1.827591,0.985823,
+ 0.752232,0.244351,-0.611914,1.529305,-2.092083,0.887353,
+ -0.990285,-0.10079,-0.095796,1.572979,-1.827591,0.985823,
+ 0.866543,0.493887,0.071972,1.508714,-1.808578,0.934359,
+ 0.866543,0.493887,0.071972,1.508714,-1.808578,0.934359,
+ -0.990285,-0.10079,-0.095796,1.572979,-1.827591,0.985823,
+ -0.404532,-0.045989,0.913367,1.54175,-1.643613,1.01419,
+ 0.866543,0.493887,0.071972,1.508714,-1.808578,0.934359,
+ -0.404532,-0.045989,0.913367,1.54175,-1.643613,1.01419,
+ 0.874983,0.217677,0.432459,1.480629,-1.640132,0.953447,
+ 0.79991,0.598082,0.049409,1.663494,-2.485963,0.790773,
+ 0.717573,0.343682,-0.605782,1.655948,-2.520927,0.844269,
+ 0.743894,0.373896,-0.553916,1.586321,-2.273752,0.880969,
+ 0.79991,0.598082,0.049409,1.663494,-2.485963,0.790773,
+ 0.743894,0.373896,-0.553916,1.586321,-2.273752,0.880969,
+ 0.963394,-0.268066,0.003702,1.60129,-2.267132,0.787696,
+ 0.963394,-0.268066,0.003702,1.60129,-2.267132,0.787696,
+ 0.743894,0.373896,-0.553916,1.586321,-2.273752,0.880969,
+ 0.752232,0.244351,-0.611914,1.529305,-2.092083,0.887353,
+ 0.963394,-0.268066,0.003702,1.60129,-2.267132,0.787696,
+ 0.752232,0.244351,-0.611914,1.529305,-2.092083,0.887353,
+ 0.714275,0.465374,-0.522723,1.544087,-2.080722,0.786432,
+ 0.714275,0.465374,-0.522723,1.544087,-2.080722,0.786432,
+ 0.752232,0.244351,-0.611914,1.529305,-2.092083,0.887353,
+ 0.866543,0.493887,0.071972,1.508714,-1.808578,0.934359,
+ 0.714275,0.465374,-0.522723,1.544087,-2.080722,0.786432,
+ 0.866543,0.493887,0.071972,1.508714,-1.808578,0.934359,
+ 0.81992,-0.126246,-0.558385,1.473886,-1.818947,0.799576,
+ 0.81992,-0.126246,-0.558385,1.473886,-1.818947,0.799576,
+ 0.866543,0.493887,0.071972,1.508714,-1.808578,0.934359,
+ 0.874983,0.217677,0.432459,1.480629,-1.640132,0.953447,
+ 0.81992,-0.126246,-0.558385,1.473886,-1.818947,0.799576,
+ 0.874983,0.217677,0.432459,1.480629,-1.640132,0.953447,
+ 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
+ 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
+ 0.79991,0.598082,0.049409,1.663494,-2.485963,0.790773,
+ 0.963394,-0.268066,0.003702,1.60129,-2.267132,0.787696,
+ 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
+ 0.963394,-0.268066,0.003702,1.60129,-2.267132,0.787696,
+ 0.43336,0.0979,-0.895888,1.677597,-2.237953,0.696318,
+ 0.43336,0.0979,-0.895888,1.677597,-2.237953,0.696318,
+ 0.963394,-0.268066,0.003702,1.60129,-2.267132,0.787696,
+ 0.714275,0.465374,-0.522723,1.544087,-2.080722,0.786432,
+ 0.43336,0.0979,-0.895888,1.677597,-2.237953,0.696318,
+ 0.714275,0.465374,-0.522723,1.544087,-2.080722,0.786432,
+ 0.261981,0.048424,-0.963857,1.643403,-2.076583,0.689565,
+ 0.261981,0.048424,-0.963857,1.643403,-2.076583,0.689565,
+ 0.714275,0.465374,-0.522723,1.544087,-2.080722,0.786432,
+ 0.81992,-0.126246,-0.558385,1.473886,-1.818947,0.799576,
+ 0.261981,0.048424,-0.963857,1.643403,-2.076583,0.689565,
+ 0.81992,-0.126246,-0.558385,1.473886,-1.818947,0.799576,
+ 0.79444,0.150525,-0.588393,1.596751,-1.722028,0.684655,
+ 0.79444,0.150525,-0.588393,1.596751,-1.722028,0.684655,
+ 0.81992,-0.126246,-0.558385,1.473886,-1.818947,0.799576,
+ 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
+ 0.79444,0.150525,-0.588393,1.596751,-1.722028,0.684655,
+ 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
+ 0.24139,0.178826,-0.953809,1.599889,-1.595526,0.623185,
+ -0.440199,0.219838,0.870572,1.960643,-2.71286,0.90089,
+ 0.636282,0.100894,0.76483,1.994078,-2.713047,0.824553,
+ 0.213417,-0.547722,0.808983,1.953911,-2.462233,0.830594,
+ -0.440199,0.219838,0.870572,1.960643,-2.71286,0.90089,
+ 0.213417,-0.547722,0.808983,1.953911,-2.462233,0.830594,
+ 0.768073,0.514956,0.380637,1.930747,-2.463535,0.894743,
+ -0.90358,0.003168,0.428409,1.880971,-2.733242,0.8902,
+ -0.440199,0.219838,0.870572,1.960643,-2.71286,0.90089,
+ 0.768073,0.514956,0.380637,1.930747,-2.463535,0.894743,
+ -0.90358,0.003168,0.428409,1.880971,-2.733242,0.8902,
+ 0.768073,0.514956,0.380637,1.930747,-2.463535,0.894743,
+ -0.874488,-0.088621,0.476882,1.864064,-2.469953,0.935601,
+ 0.862528,0.499882,-0.078511,2.021591,-1.755289,0.912093,
+ 0.872426,0.488735,-0.003223,2.036036,-1.57908,0.967151,
+ -0.987313,0.097591,-0.125253,1.937009,-1.625419,1.026843,
+ 0.862528,0.499882,-0.078511,2.021591,-1.755289,0.912093,
+ -0.987313,0.097591,-0.125253,1.937009,-1.625419,1.026843,
+ -0.997638,0.009858,-0.067986,1.941767,-1.759457,0.997454,
+ 0.52783,0.437826,0.727807,2.013095,-2.051912,0.911043,
+ 0.862528,0.499882,-0.078511,2.021591,-1.755289,0.912093,
+ -0.997638,0.009858,-0.067986,1.941767,-1.759457,0.997454,
+ 0.52783,0.437826,0.727807,2.013095,-2.051912,0.911043,
+ -0.997638,0.009858,-0.067986,1.941767,-1.759457,0.997454,
+ 0.21581,0.484483,0.847763,1.918641,-2.083654,1.001275,
+ -0.874488,-0.088621,0.476882,1.864064,-2.469953,0.935601,
+ 0.768073,0.514956,0.380637,1.930747,-2.463535,0.894743,
+ 0.626232,0.565165,0.53705,1.98533,-2.221319,0.893145,
+ -0.874488,-0.088621,0.476882,1.864064,-2.469953,0.935601,
+ 0.626232,0.565165,0.53705,1.98533,-2.221319,0.893145,
+ -0.783521,-0.393963,0.480508,1.90637,-2.282284,0.964887,
+ 0.626232,0.565165,0.53705,1.98533,-2.221319,0.893145,
+ 0.52783,0.437826,0.727807,2.013095,-2.051912,0.911043,
+ 0.21581,0.484483,0.847763,1.918641,-2.083654,1.001275,
+ 0.626232,0.565165,0.53705,1.98533,-2.221319,0.893145,
+ 0.21581,0.484483,0.847763,1.918641,-2.083654,1.001275,
+ -0.783521,-0.393963,0.480508,1.90637,-2.282284,0.964887,
+ -0.062994,-0.00854,-0.997977,1.830669,-2.736121,0.903313,
+ -0.955753,-0.169718,-0.240275,1.801127,-2.48469,0.938593,
+ -0.184432,-0.109597,-0.976716,1.737623,-2.485017,0.918334,
+ -0.062994,-0.00854,-0.997977,1.830669,-2.736121,0.903313,
+ -0.184432,-0.109597,-0.976716,1.737623,-2.485017,0.918334,
+ -0.4909,0.016111,-0.871067,1.771416,-2.769024,0.9461,
+ -0.062994,-0.00854,-0.997977,1.830669,-2.736121,0.903313,
+ -0.90358,0.003168,0.428409,1.880971,-2.733242,0.8902,
+ -0.874488,-0.088621,0.476882,1.864064,-2.469953,0.935601,
+ -0.062994,-0.00854,-0.997977,1.830669,-2.736121,0.903313,
+ -0.874488,-0.088621,0.476882,1.864064,-2.469953,0.935601,
+ -0.955753,-0.169718,-0.240275,1.801127,-2.48469,0.938593,
+ -0.150944,-0.987886,-0.036012,1.818846,-1.756976,1.023593,
+ -0.937976,-0.320543,-0.132115,1.804927,-1.581954,1.089198,
+ 0.056398,-0.684481,-0.726846,1.650318,-1.645881,1.053347,
+ -0.150944,-0.987886,-0.036012,1.818846,-1.756976,1.023593,
+ 0.056398,-0.684481,-0.726846,1.650318,-1.645881,1.053347,
+ -0.343436,-0.507052,-0.790537,1.717145,-1.80953,1.004092,
+ -0.630099,-0.773677,-0.066329,1.839224,-2.109267,0.998351,
+ -0.150944,-0.987886,-0.036012,1.818846,-1.756976,1.023593,
+ -0.343436,-0.507052,-0.790537,1.717145,-1.80953,1.004092,
+ -0.630099,-0.773677,-0.066329,1.839224,-2.109267,0.998351,
+ -0.343436,-0.507052,-0.790537,1.717145,-1.80953,1.004092,
+ -0.554151,-0.205896,-0.80655,1.720031,-2.105568,0.971354,
+ -0.967491,-0.143323,-0.208372,1.818266,-2.313852,0.968652,
+ -0.630099,-0.773677,-0.066329,1.839224,-2.109267,0.998351,
+ -0.554151,-0.205896,-0.80655,1.720031,-2.105568,0.971354,
+ -0.967491,-0.143323,-0.208372,1.818266,-2.313852,0.968652,
+ -0.554151,-0.205896,-0.80655,1.720031,-2.105568,0.971354,
+ -0.554502,-0.046423,-0.830886,1.710406,-2.272223,0.954296,
+ -0.955753,-0.169718,-0.240275,1.801127,-2.48469,0.938593,
+ -0.967491,-0.143323,-0.208372,1.818266,-2.313852,0.968652,
+ -0.554502,-0.046423,-0.830886,1.710406,-2.272223,0.954296,
+ -0.955753,-0.169718,-0.240275,1.801127,-2.48469,0.938593,
+ -0.554502,-0.046423,-0.830886,1.710406,-2.272223,0.954296,
+ -0.184432,-0.109597,-0.976716,1.737623,-2.485017,0.918334,
+ -0.997638,0.009858,-0.067986,1.941767,-1.759457,0.997454,
+ -0.987313,0.097591,-0.125253,1.937009,-1.625419,1.026843,
+ -0.937976,-0.320543,-0.132115,1.804927,-1.581954,1.089198,
+ -0.997638,0.009858,-0.067986,1.941767,-1.759457,0.997454,
+ -0.937976,-0.320543,-0.132115,1.804927,-1.581954,1.089198,
+ -0.150944,-0.987886,-0.036012,1.818846,-1.756976,1.023593,
+ 0.21581,0.484483,0.847763,1.918641,-2.083654,1.001275,
+ -0.997638,0.009858,-0.067986,1.941767,-1.759457,0.997454,
+ -0.150944,-0.987886,-0.036012,1.818846,-1.756976,1.023593,
+ 0.21581,0.484483,0.847763,1.918641,-2.083654,1.001275,
+ -0.150944,-0.987886,-0.036012,1.818846,-1.756976,1.023593,
+ -0.630099,-0.773677,-0.066329,1.839224,-2.109267,0.998351,
+ -0.783521,-0.393963,0.480508,1.90637,-2.282284,0.964887,
+ 0.21581,0.484483,0.847763,1.918641,-2.083654,1.001275,
+ -0.630099,-0.773677,-0.066329,1.839224,-2.109267,0.998351,
+ -0.783521,-0.393963,0.480508,1.90637,-2.282284,0.964887,
+ -0.630099,-0.773677,-0.066329,1.839224,-2.109267,0.998351,
+ -0.967491,-0.143323,-0.208372,1.818266,-2.313852,0.968652,
+ -0.874488,-0.088621,0.476882,1.864064,-2.469953,0.935601,
+ -0.783521,-0.393963,0.480508,1.90637,-2.282284,0.964887,
+ -0.967491,-0.143323,-0.208372,1.818266,-2.313852,0.968652,
+ -0.874488,-0.088621,0.476882,1.864064,-2.469953,0.935601,
+ -0.967491,-0.143323,-0.208372,1.818266,-2.313852,0.968652,
+ -0.955753,-0.169718,-0.240275,1.801127,-2.48469,0.938593,
+ 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
+ 0.79991,0.598082,0.049409,1.663494,-2.485963,0.790773,
+ 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
+ 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
+ 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
+ 0.672894,0.661099,0.331907,1.841282,-2.716008,0.708009,
+ 0.79444,0.150525,-0.588393,1.596751,-1.722028,0.684655,
+ 0.24139,0.178826,-0.953809,1.599889,-1.595526,0.623185,
+ 0.776291,-0.374867,0.5068,1.721211,-1.590185,0.601932,
+ 0.79444,0.150525,-0.588393,1.596751,-1.722028,0.684655,
+ 0.776291,-0.374867,0.5068,1.721211,-1.590185,0.601932,
+ 0.726897,-0.546447,0.415952,1.740323,-1.67983,0.664098,
+ 0.261981,0.048424,-0.963857,1.643403,-2.076583,0.689565,
+ 0.79444,0.150525,-0.588393,1.596751,-1.722028,0.684655,
+ 0.726897,-0.546447,0.415952,1.740323,-1.67983,0.664098,
+ 0.261981,0.048424,-0.963857,1.643403,-2.076583,0.689565,
+ 0.726897,-0.546447,0.415952,1.740323,-1.67983,0.664098,
+ 0.81802,-0.47123,0.329827,1.747671,-2.067518,0.638841,
+ 0.43336,0.0979,-0.895888,1.677597,-2.237953,0.696318,
+ 0.261981,0.048424,-0.963857,1.643403,-2.076583,0.689565,
+ 0.81802,-0.47123,0.329827,1.747671,-2.067518,0.638841,
+ 0.43336,0.0979,-0.895888,1.677597,-2.237953,0.696318,
+ 0.81802,-0.47123,0.329827,1.747671,-2.067518,0.638841,
+ 0.247956,0.087485,-0.964813,1.772999,-2.230292,0.64494,
+ 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
+ -0.020456,0.943466,0.330837,1.700797,-2.794792,0.82425,
+ 0.717573,0.343682,-0.605782,1.655948,-2.520927,0.844269,
+ 0.030762,-0.124297,-0.991768,1.736425,-2.743683,0.736866,
+ 0.717573,0.343682,-0.605782,1.655948,-2.520927,0.844269,
+ 0.79991,0.598082,0.049409,1.663494,-2.485963,0.790773,
+ -0.753891,0.130682,0.643872,2.001343,-2.847715,0.762517,
+ -0.074103,0.409269,0.909399,1.972647,-2.728848,0.772496,
+ 0.636282,0.100894,0.76483,1.994078,-2.713047,0.824553,
+ -0.753891,0.130682,0.643872,2.001343,-2.847715,0.762517,
+ 0.636282,0.100894,0.76483,1.994078,-2.713047,0.824553,
+ -0.820357,0.160676,0.548815,2.057496,-2.887282,0.844225,
+ 0.225987,0.181604,-0.957053,1.947264,-2.443232,0.732587,
+ -0.074103,0.409269,0.909399,1.972647,-2.728848,0.772496,
+ -0.545598,-0.330416,0.770161,1.884318,-2.724404,0.701999,
+ 0.225987,0.181604,-0.957053,1.947264,-2.443232,0.732587,
+ -0.545598,-0.330416,0.770161,1.884318,-2.724404,0.701999,
+ 0.229413,0.089674,-0.96919,1.828658,-2.477348,0.67347,
+ -0.121543,0.046,-0.99152,1.921881,-2.157616,0.692678,
+ 0.225987,0.181604,-0.957053,1.947264,-2.443232,0.732587,
+ 0.229413,0.089674,-0.96919,1.828658,-2.477348,0.67347,
+ -0.121543,0.046,-0.99152,1.921881,-2.157616,0.692678,
+ 0.229413,0.089674,-0.96919,1.828658,-2.477348,0.67347,
+ 0.247956,0.087485,-0.964813,1.772999,-2.230292,0.64494,
+ -0.545598,-0.330416,0.770161,1.884318,-2.724404,0.701999,
+ 0.672894,0.661099,0.331907,1.841282,-2.716008,0.708009,
+ 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
+ -0.545598,-0.330416,0.770161,1.884318,-2.724404,0.701999,
+ 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
+ 0.229413,0.089674,-0.96919,1.828658,-2.477348,0.67347,
+ 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
+ 0.43336,0.0979,-0.895888,1.677597,-2.237953,0.696318,
+ 0.247956,0.087485,-0.964813,1.772999,-2.230292,0.64494,
+ 0.331576,0.146631,-0.931964,1.756349,-2.446399,0.705428,
+ 0.247956,0.087485,-0.964813,1.772999,-2.230292,0.64494,
+ 0.229413,0.089674,-0.96919,1.828658,-2.477348,0.67347,
+ 0.636282,0.100894,0.76483,1.994078,-2.713047,0.824553,
+ -0.074103,0.409269,0.909399,1.972647,-2.728848,0.772496,
+ 0.225987,0.181604,-0.957053,1.947264,-2.443232,0.732587,
+ 0.636282,0.100894,0.76483,1.994078,-2.713047,0.824553,
+ 0.225987,0.181604,-0.957053,1.947264,-2.443232,0.732587,
+ 0.213417,-0.547722,0.808983,1.953911,-2.462233,0.830594,
+ 0.726897,-0.546447,0.415952,1.740323,-1.67983,0.664098,
+ 0.776291,-0.374867,0.5068,1.721211,-1.590185,0.601932,
+ -0.086361,-0.084973,0.992634,1.963153,-1.588839,0.612861,
+ 0.726897,-0.546447,0.415952,1.740323,-1.67983,0.664098,
+ -0.086361,-0.084973,0.992634,1.963153,-1.588839,0.612861,
+ 0.313529,0.096126,-0.944701,1.991892,-1.7484,0.65277,
+ 0.81802,-0.47123,0.329827,1.747671,-2.067518,0.638841,
+ 0.726897,-0.546447,0.415952,1.740323,-1.67983,0.664098,
+ 0.313529,0.096126,-0.944701,1.991892,-1.7484,0.65277,
+ 0.81802,-0.47123,0.329827,1.747671,-2.067518,0.638841,
+ 0.313529,0.096126,-0.944701,1.991892,-1.7484,0.65277,
+ 0.761939,0.13671,-0.633055,1.945206,-2.015769,0.672724,
+ 0.313529,0.096126,-0.944701,1.991892,-1.7484,0.65277,
+ -0.086361,-0.084973,0.992634,1.963153,-1.588839,0.612861,
+ -0.541077,0.245809,0.804247,2.059844,-1.561331,0.858957,
+ 0.313529,0.096126,-0.944701,1.991892,-1.7484,0.65277,
+ -0.541077,0.245809,0.804247,2.059844,-1.561331,0.858957,
+ -0.495591,0.225654,0.838731,2.053108,-1.738285,0.824853,
+ 0.761939,0.13671,-0.633055,1.945206,-2.015769,0.672724,
+ 0.313529,0.096126,-0.944701,1.991892,-1.7484,0.65277,
+ -0.495591,0.225654,0.838731,2.053108,-1.738285,0.824853,
+ 0.761939,0.13671,-0.633055,1.945206,-2.015769,0.672724,
+ -0.495591,0.225654,0.838731,2.053108,-1.738285,0.824853,
+ -0.492627,0.113675,0.862784,2.047696,-2.050138,0.814712,
+ -0.121543,0.046,-0.99152,1.921881,-2.157616,0.692678,
+ 0.761939,0.13671,-0.633055,1.945206,-2.015769,0.672724,
+ -0.492627,0.113675,0.862784,2.047696,-2.050138,0.814712,
+ -0.121543,0.046,-0.99152,1.921881,-2.157616,0.692678,
+ -0.492627,0.113675,0.862784,2.047696,-2.050138,0.814712,
+ -0.430524,-0.648446,0.627828,2.02453,-2.195334,0.811284,
+ 0.225987,0.181604,-0.957053,1.947264,-2.443232,0.732587,
+ -0.121543,0.046,-0.99152,1.921881,-2.157616,0.692678,
+ -0.430524,-0.648446,0.627828,2.02453,-2.195334,0.811284,
+ 0.225987,0.181604,-0.957053,1.947264,-2.443232,0.732587,
+ -0.430524,-0.648446,0.627828,2.02453,-2.195334,0.811284,
+ 0.213417,-0.547722,0.808983,1.953911,-2.462233,0.830594,
+ 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
+ 0.383978,-0.566345,0.729256,2.158051,-1.209613,0.783941,
+ -0.671694,-0.023528,0.740455,2.141273,-1.234642,0.941254,
+ 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
+ -0.671694,-0.023528,0.740455,2.141273,-1.234642,0.941254,
+ -0.562282,-0.328887,0.758731,2.111557,-1.376942,0.89657,
+ -0.562282,-0.328887,0.758731,2.111557,-1.376942,0.89657,
+ -0.671694,-0.023528,0.740455,2.141273,-1.234642,0.941254,
+ -0.088841,0.02472,0.995739,2.099566,-1.259996,1.055763,
+ -0.562282,-0.328887,0.758731,2.111557,-1.376942,0.89657,
+ -0.088841,0.02472,0.995739,2.099566,-1.259996,1.055763,
+ 0.157806,0.230905,0.960094,2.071448,-1.410118,1.006192,
+ 0.157806,0.230905,0.960094,2.071448,-1.410118,1.006192,
+ -0.088841,0.02472,0.995739,2.099566,-1.259996,1.055763,
+ 0.57446,0.218241,0.788902,1.966698,-1.22816,1.153716,
+ 0.157806,0.230905,0.960094,2.071448,-1.410118,1.006192,
+ 0.57446,0.218241,0.788902,1.966698,-1.22816,1.153716,
+ -0.144755,0.439659,0.886423,1.974215,-1.469208,1.068951,
+ -0.144755,0.439659,0.886423,1.974215,-1.469208,1.068951,
+ 0.57446,0.218241,0.788902,1.966698,-1.22816,1.153716,
+ 0.526213,0.349004,0.775433,1.805207,-1.268427,1.165317,
+ -0.144755,0.439659,0.886423,1.974215,-1.469208,1.068951,
+ 0.526213,0.349004,0.775433,1.805207,-1.268427,1.165317,
+ 0.339699,0.626415,0.701576,1.801794,-1.465464,1.129277,
+ 0.339699,0.626415,0.701576,1.801794,-1.465464,1.129277,
+ 0.526213,0.349004,0.775433,1.805207,-1.268427,1.165317,
+ 0.926951,0.366239,-0.081429,1.601721,-1.262359,1.14142,
+ 0.339699,0.626415,0.701576,1.801794,-1.465464,1.129277,
+ 0.926951,0.366239,-0.081429,1.601721,-1.262359,1.14142,
+ 0.457853,0.537523,0.708124,1.612396,-1.485728,1.099731,
+ 0.457853,0.537523,0.708124,1.612396,-1.485728,1.099731,
+ 0.926951,0.366239,-0.081429,1.601721,-1.262359,1.14142,
+ -0.496829,-0.096649,0.86245,1.49748,-1.283201,1.088258,
+ 0.457853,0.537523,0.708124,1.612396,-1.485728,1.099731,
+ -0.496829,-0.096649,0.86245,1.49748,-1.283201,1.088258,
+ -0.081045,0.40912,0.908874,1.5167,-1.45305,1.068516,
+ -0.081045,0.40912,0.908874,1.5167,-1.45305,1.068516,
+ -0.496829,-0.096649,0.86245,1.49748,-1.283201,1.088258,
+ 0.013288,-0.297478,0.954636,1.430817,-1.301205,1.024924,
+ -0.081045,0.40912,0.908874,1.5167,-1.45305,1.068516,
+ 0.013288,-0.297478,0.954636,1.430817,-1.301205,1.024924,
+ 0.444124,0.617476,0.649214,1.454817,-1.430228,0.976569,
+ 0.444124,0.617476,0.649214,1.454817,-1.430228,0.976569,
+ 0.013288,-0.297478,0.954636,1.430817,-1.301205,1.024924,
+ -0.228294,-0.186048,0.955651,1.348219,-1.282064,0.845204,
+ 0.444124,0.617476,0.649214,1.454817,-1.430228,0.976569,
+ -0.228294,-0.186048,0.955651,1.348219,-1.282064,0.845204,
+ 0.010538,0.399391,0.91672,1.328862,-1.352627,0.758733,
+ 0.383978,-0.566345,0.729256,2.158051,-1.209613,0.783941,
+ 0.424286,-0.254348,0.869073,2.180012,-1.130557,0.821812,
+ -0.217942,-0.897186,-0.384133,2.17745,-1.127765,0.974416,
+ 0.383978,-0.566345,0.729256,2.158051,-1.209613,0.783941,
+ -0.217942,-0.897186,-0.384133,2.17745,-1.127765,0.974416,
+ -0.671694,-0.023528,0.740455,2.141273,-1.234642,0.941254,
+ -0.671694,-0.023528,0.740455,2.141273,-1.234642,0.941254,
+ -0.217942,-0.897186,-0.384133,2.17745,-1.127765,0.974416,
+ -0.069765,-0.126006,-0.989573,2.148553,-1.103067,1.06541,
+ -0.671694,-0.023528,0.740455,2.141273,-1.234642,0.941254,
+ -0.069765,-0.126006,-0.989573,2.148553,-1.103067,1.06541,
+ -0.088841,0.02472,0.995739,2.099566,-1.259996,1.055763,
+ -0.088841,0.02472,0.995739,2.099566,-1.259996,1.055763,
+ -0.069765,-0.126006,-0.989573,2.148553,-1.103067,1.06541,
+ -0.1083,-0.048546,-0.992932,2.024692,-1.074646,1.172465,
+ -0.088841,0.02472,0.995739,2.099566,-1.259996,1.055763,
+ -0.1083,-0.048546,-0.992932,2.024692,-1.074646,1.172465,
+ 0.57446,0.218241,0.788902,1.966698,-1.22816,1.153716,
+ 0.57446,0.218241,0.788902,1.966698,-1.22816,1.153716,
+ -0.1083,-0.048546,-0.992932,2.024692,-1.074646,1.172465,
+ -0.084936,-0.226589,-0.97028,1.838895,-1.087204,1.201408,
+ 0.57446,0.218241,0.788902,1.966698,-1.22816,1.153716,
+ -0.084936,-0.226589,-0.97028,1.838895,-1.087204,1.201408,
+ 0.526213,0.349004,0.775433,1.805207,-1.268427,1.165317,
+ 0.526213,0.349004,0.775433,1.805207,-1.268427,1.165317,
+ -0.084936,-0.226589,-0.97028,1.838895,-1.087204,1.201408,
+ -0.024032,-0.835976,-0.54824,1.645819,-1.087442,1.173773,
+ 0.526213,0.349004,0.775433,1.805207,-1.268427,1.165317,
+ -0.024032,-0.835976,-0.54824,1.645819,-1.087442,1.173773,
+ 0.926951,0.366239,-0.081429,1.601721,-1.262359,1.14142,
+ 0.926951,0.366239,-0.081429,1.601721,-1.262359,1.14142,
+ -0.024032,-0.835976,-0.54824,1.645819,-1.087442,1.173773,
+ -0.044013,0.340434,0.939238,1.524407,-1.125312,1.142248,
+ 0.926951,0.366239,-0.081429,1.601721,-1.262359,1.14142,
+ -0.044013,0.340434,0.939238,1.524407,-1.125312,1.142248,
+ -0.496829,-0.096649,0.86245,1.49748,-1.283201,1.088258,
+ -0.496829,-0.096649,0.86245,1.49748,-1.283201,1.088258,
+ -0.044013,0.340434,0.939238,1.524407,-1.125312,1.142248,
+ 0.186476,0.252953,0.949337,1.438439,-1.148029,1.098069,
+ -0.496829,-0.096649,0.86245,1.49748,-1.283201,1.088258,
+ 0.186476,0.252953,0.949337,1.438439,-1.148029,1.098069,
+ 0.013288,-0.297478,0.954636,1.430817,-1.301205,1.024924,
+ 0.013288,-0.297478,0.954636,1.430817,-1.301205,1.024924,
+ 0.186476,0.252953,0.949337,1.438439,-1.148029,1.098069,
+ 0.43768,-0.823149,-0.361748,1.310865,-1.136322,0.914838,
+ 0.013288,-0.297478,0.954636,1.430817,-1.301205,1.024924,
+ 0.43768,-0.823149,-0.361748,1.310865,-1.136322,0.914838,
+ -0.228294,-0.186048,0.955651,1.348219,-1.282064,0.845204,
+ -0.086361,-0.084973,0.992634,1.963153,-1.588839,0.612861,
+ 0.140536,0.558684,0.817388,2.0482,-1.581983,0.555832,
+ 0.235033,-0.721825,0.650944,2.0796,-1.473377,0.654997,
+ -0.086361,-0.084973,0.992634,1.963153,-1.588839,0.612861,
+ 0.235033,-0.721825,0.650944,2.0796,-1.473377,0.654997,
+ -0.541077,0.245809,0.804247,2.059844,-1.561331,0.858957,
+ 0.339699,0.626415,0.701576,1.801794,-1.465464,1.129277,
+ 0.457853,0.537523,0.708124,1.612396,-1.485728,1.099731,
+ 0.056398,-0.684481,-0.726846,1.650318,-1.645881,1.053347,
+ 0.339699,0.626415,0.701576,1.801794,-1.465464,1.129277,
+ 0.056398,-0.684481,-0.726846,1.650318,-1.645881,1.053347,
+ -0.937976,-0.320543,-0.132115,1.804927,-1.581954,1.089198,
+ -0.144755,0.439659,0.886423,1.974215,-1.469208,1.068951,
+ 0.339699,0.626415,0.701576,1.801794,-1.465464,1.129277,
+ -0.937976,-0.320543,-0.132115,1.804927,-1.581954,1.089198,
+ -0.144755,0.439659,0.886423,1.974215,-1.469208,1.068951,
+ -0.937976,-0.320543,-0.132115,1.804927,-1.581954,1.089198,
+ -0.987313,0.097591,-0.125253,1.937009,-1.625419,1.026843,
+ 0.157806,0.230905,0.960094,2.071448,-1.410118,1.006192,
+ -0.144755,0.439659,0.886423,1.974215,-1.469208,1.068951,
+ -0.987313,0.097591,-0.125253,1.937009,-1.625419,1.026843,
+ 0.157806,0.230905,0.960094,2.071448,-1.410118,1.006192,
+ -0.987313,0.097591,-0.125253,1.937009,-1.625419,1.026843,
+ 0.872426,0.488735,-0.003223,2.036036,-1.57908,0.967151,
+ -0.562282,-0.328887,0.758731,2.111557,-1.376942,0.89657,
+ 0.157806,0.230905,0.960094,2.071448,-1.410118,1.006192,
+ 0.872426,0.488735,-0.003223,2.036036,-1.57908,0.967151,
+ -0.562282,-0.328887,0.758731,2.111557,-1.376942,0.89657,
+ 0.872426,0.488735,-0.003223,2.036036,-1.57908,0.967151,
+ -0.541077,0.245809,0.804247,2.059844,-1.561331,0.858957,
+ 0.235033,-0.721825,0.650944,2.0796,-1.473377,0.654997,
+ 0.303379,-0.73119,0.611002,2.126237,-1.330172,0.721011,
+ -0.562282,-0.328887,0.758731,2.111557,-1.376942,0.89657,
+ 0.235033,-0.721825,0.650944,2.0796,-1.473377,0.654997,
+ -0.562282,-0.328887,0.758731,2.111557,-1.376942,0.89657,
+ -0.541077,0.245809,0.804247,2.059844,-1.561331,0.858957,
+ 0.080812,0.697931,0.711591,2.229345,-0.992723,0.862826,
+ -0.887036,-0.210048,-0.411154,2.222082,-0.957342,1.014137,
+ -0.217942,-0.897186,-0.384133,2.17745,-1.127765,0.974416,
+ 0.080812,0.697931,0.711591,2.229345,-0.992723,0.862826,
+ -0.217942,-0.897186,-0.384133,2.17745,-1.127765,0.974416,
+ 0.424286,-0.254348,0.869073,2.180012,-1.130557,0.821812,
+ 0.193853,0.161608,0.967628,1.867657,-0.920633,1.206933,
+ -0.493424,-0.16561,-0.853877,1.635139,-0.965221,1.184968,
+ -0.024032,-0.835976,-0.54824,1.645819,-1.087442,1.173773,
+ 0.193853,0.161608,0.967628,1.867657,-0.920633,1.206933,
+ -0.024032,-0.835976,-0.54824,1.645819,-1.087442,1.173773,
+ -0.084936,-0.226589,-0.97028,1.838895,-1.087204,1.201408,
+ -0.819256,-0.566976,0.085772,2.058189,-0.931238,1.163518,
+ 0.193853,0.161608,0.967628,1.867657,-0.920633,1.206933,
+ -0.084936,-0.226589,-0.97028,1.838895,-1.087204,1.201408,
+ -0.819256,-0.566976,0.085772,2.058189,-0.931238,1.163518,
+ -0.084936,-0.226589,-0.97028,1.838895,-1.087204,1.201408,
+ -0.1083,-0.048546,-0.992932,2.024692,-1.074646,1.172465,
+ -0.898389,-0.217201,-0.381735,2.158585,-0.955809,1.113647,
+ -0.819256,-0.566976,0.085772,2.058189,-0.931238,1.163518,
+ -0.1083,-0.048546,-0.992932,2.024692,-1.074646,1.172465,
+ -0.898389,-0.217201,-0.381735,2.158585,-0.955809,1.113647,
+ -0.1083,-0.048546,-0.992932,2.024692,-1.074646,1.172465,
+ -0.069765,-0.126006,-0.989573,2.148553,-1.103067,1.06541,
+ -0.887036,-0.210048,-0.411154,2.222082,-0.957342,1.014137,
+ -0.898389,-0.217201,-0.381735,2.158585,-0.955809,1.113647,
+ -0.069765,-0.126006,-0.989573,2.148553,-1.103067,1.06541,
+ -0.887036,-0.210048,-0.411154,2.222082,-0.957342,1.014137,
+ -0.069765,-0.126006,-0.989573,2.148553,-1.103067,1.06541,
+ -0.217942,-0.897186,-0.384133,2.17745,-1.127765,0.974416,
+ 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
+ 0.874983,0.217677,0.432459,1.480629,-1.640132,0.953447,
+ 0.444124,0.617476,0.649214,1.454817,-1.430228,0.976569,
+ 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
+ 0.444124,0.617476,0.649214,1.454817,-1.430228,0.976569,
+ 0.010538,0.399391,0.91672,1.328862,-1.352627,0.758733,
+ 0.43768,-0.823149,-0.361748,1.310865,-1.136322,0.914838,
+ 0.186476,0.252953,0.949337,1.438439,-1.148029,1.098069,
+ -0.53197,-0.108751,-0.839751,1.428883,-0.98669,1.133905,
+ 0.43768,-0.823149,-0.361748,1.310865,-1.136322,0.914838,
+ -0.53197,-0.108751,-0.839751,1.428883,-0.98669,1.133905,
+ -0.382074,-0.25681,-0.887732,1.337875,-0.945716,1.021299,
+ -0.404532,-0.045989,0.913367,1.54175,-1.643613,1.01419,
+ 0.056398,-0.684481,-0.726846,1.650318,-1.645881,1.053347,
+ 0.457853,0.537523,0.708124,1.612396,-1.485728,1.099731,
+ -0.404532,-0.045989,0.913367,1.54175,-1.643613,1.01419,
+ 0.457853,0.537523,0.708124,1.612396,-1.485728,1.099731,
+ -0.081045,0.40912,0.908874,1.5167,-1.45305,1.068516,
+ 0.874983,0.217677,0.432459,1.480629,-1.640132,0.953447,
+ -0.404532,-0.045989,0.913367,1.54175,-1.643613,1.01419,
+ -0.081045,0.40912,0.908874,1.5167,-1.45305,1.068516,
+ 0.874983,0.217677,0.432459,1.480629,-1.640132,0.953447,
+ -0.081045,0.40912,0.908874,1.5167,-1.45305,1.068516,
+ 0.444124,0.617476,0.649214,1.454817,-1.430228,0.976569,
+ -0.044013,0.340434,0.939238,1.524407,-1.125312,1.142248,
+ -0.024032,-0.835976,-0.54824,1.645819,-1.087442,1.173773,
+ -0.493424,-0.16561,-0.853877,1.635139,-0.965221,1.184968,
+ -0.044013,0.340434,0.939238,1.524407,-1.125312,1.142248,
+ -0.493424,-0.16561,-0.853877,1.635139,-0.965221,1.184968,
+ -0.570406,-0.192005,-0.798606,1.536037,-0.985876,1.185597,
+ 0.186476,0.252953,0.949337,1.438439,-1.148029,1.098069,
+ -0.044013,0.340434,0.939238,1.524407,-1.125312,1.142248,
+ -0.570406,-0.192005,-0.798606,1.536037,-0.985876,1.185597,
+ 0.186476,0.252953,0.949337,1.438439,-1.148029,1.098069,
+ -0.570406,-0.192005,-0.798606,1.536037,-0.985876,1.185597,
+ -0.53197,-0.108751,-0.839751,1.428883,-0.98669,1.133905,
+ -0.861251,0.383698,-0.333202,3.247406,2.073333,0,
+ 0.889638,-0.392482,0.233458,2.985371,1.982663,0,
+ 0.397823,0.403779,0.823832,3.009101,1.971604,0.03422,
+ -0.861251,0.383698,-0.333202,3.247406,2.073333,0,
+ 0.397823,0.403779,0.823832,3.009101,1.971604,0.03422,
+ 0.662294,0.443714,0.603726,3.233975,2.059193,0.072431,
+ 0.662294,0.443714,0.603726,3.233975,2.059193,0.072431,
+ 0.397823,0.403779,0.823832,3.009101,1.971604,0.03422,
+ 0.449887,0.239005,0.860511,3.036361,1.913989,0.169838,
+ 0.662294,0.443714,0.603726,3.233975,2.059193,0.072431,
+ 0.449887,0.239005,0.860511,3.036361,1.913989,0.169838,
+ 0.693381,0.351142,0.629224,3.252224,2.026347,0.148215,
+ 0.693381,0.351142,0.629224,3.252224,2.026347,0.148215,
+ 0.449887,0.239005,0.860511,3.036361,1.913989,0.169838,
+ 0.525142,-0.062799,0.848695,3.058366,1.773346,0.297337,
+ 0.693381,0.351142,0.629224,3.252224,2.026347,0.148215,
+ 0.525142,-0.062799,0.848695,3.058366,1.773346,0.297337,
+ 0.748939,0.152982,0.644738,3.276333,1.863773,0.294266,
+ 0.748939,0.152982,0.644738,3.276333,1.863773,0.294266,
+ 0.525142,-0.062799,0.848695,3.058366,1.773346,0.297337,
+ 0.561573,-0.148323,0.814024,3.086666,1.632991,0.338863,
+ 0.748939,0.152982,0.644738,3.276333,1.863773,0.294266,
+ 0.561573,-0.148323,0.814024,3.086666,1.632991,0.338863,
+ 0.795625,-0.129968,0.591684,3.337545,1.748927,0.34021,
+ 0.795625,-0.129968,0.591684,3.337545,1.748927,0.34021,
+ 0.561573,-0.148323,0.814024,3.086666,1.632991,0.338863,
+ 0.513731,-0.239493,0.823847,3.115383,1.49239,0.380228,
+ 0.795625,-0.129968,0.591684,3.337545,1.748927,0.34021,
+ 0.513731,-0.239493,0.823847,3.115383,1.49239,0.380228,
+ 0.805898,-0.146097,0.573745,3.377233,1.5878,0.400781,
+ 0.805898,-0.146097,0.573745,3.377233,1.5878,0.400781,
+ 0.513731,-0.239493,0.823847,3.115383,1.49239,0.380228,
+ 0.506924,-0.406124,0.760323,3.163181,1.209972,0.462438,
+ 0.805898,-0.146097,0.573745,3.377233,1.5878,0.400781,
+ 0.506924,-0.406124,0.760323,3.163181,1.209972,0.462438,
+ 0.772313,-0.244122,0.586461,3.47341,1.366149,0.454658,
+ 0.772313,-0.244122,0.586461,3.47341,1.366149,0.454658,
+ 0.506924,-0.406124,0.760323,3.163181,1.209972,0.462438,
+ 0.552633,-0.484765,0.677938,3.189664,0.907503,0.500122,
+ 0.772313,-0.244122,0.586461,3.47341,1.366149,0.454658,
+ 0.552633,-0.484765,0.677938,3.189664,0.907503,0.500122,
+ 0.697438,-0.478568,0.533435,3.528445,1.060127,0.489443,
+ 0.697438,-0.478568,0.533435,3.528445,1.060127,0.489443,
+ 0.552633,-0.484765,0.677938,3.189664,0.907503,0.500122,
+ 0.696414,-0.392791,0.600602,3.280681,0.510802,0.499434,
+ 0.697438,-0.478568,0.533435,3.528445,1.060127,0.489443,
+ 0.696414,-0.392791,0.600602,3.280681,0.510802,0.499434,
+ 0.628361,-0.426126,0.65083,3.559394,0.706516,0.452535,
+ 0.628361,-0.426126,0.65083,3.559394,0.706516,0.452535,
+ 0.696414,-0.392791,0.600602,3.280681,0.510802,0.499434,
+ 0.026499,0.942993,0.331757,3.321825,0.26669,0.46575,
+ 0.628361,-0.426126,0.65083,3.559394,0.706516,0.452535,
+ 0.026499,0.942993,0.331757,3.321825,0.26669,0.46575,
+ 0.065855,0.814333,0.576649,3.61965,0.472046,0.391742,
+ 0.065855,0.814333,0.576649,3.61965,0.472046,0.391742,
+ 0.026499,0.942993,0.331757,3.321825,0.26669,0.46575,
+ 0.019336,0.837694,0.545798,3.36004,0.165487,0.412685,
+ 0.065855,0.814333,0.576649,3.61965,0.472046,0.391742,
+ 0.019336,0.837694,0.545798,3.36004,0.165487,0.412685,
+ 0.187432,0.691784,0.697355,3.641195,0.407454,0.362198,
+ 0.187432,0.691784,0.697355,3.641195,0.407454,0.362198,
+ 0.019336,0.837694,0.545798,3.36004,0.165487,0.412685,
+ 0.05298,0.780732,0.622615,3.378799,0.073736,0.355362,
+ 0.187432,0.691784,0.697355,3.641195,0.407454,0.362198,
+ 0.05298,0.780732,0.622615,3.378799,0.073736,0.355362,
+ 0.328244,0.603535,0.726637,3.67471,0.338839,0.30784,
+ 0.328244,0.603535,0.726637,3.67471,0.338839,0.30784,
+ 0.05298,0.780732,0.622615,3.378799,0.073736,0.355362,
+ 0.115383,0.694945,0.709746,3.43895,-0.08258,0.257015,
+ 0.328244,0.603535,0.726637,3.67471,0.338839,0.30784,
+ 0.115383,0.694945,0.709746,3.43895,-0.08258,0.257015,
+ 0.387394,0.516219,0.763835,3.700363,0.265794,0.240762,
+ 0.387394,0.516219,0.763835,3.700363,0.265794,0.240762,
+ 0.115383,0.694945,0.709746,3.43895,-0.08258,0.257015,
+ 0.146937,0.551946,0.820832,3.514981,-0.121886,0.187589,
+ 0.387394,0.516219,0.763835,3.700363,0.265794,0.240762,
+ 0.146937,0.551946,0.820832,3.514981,-0.121886,0.187589,
+ 0.387987,0.466053,0.795148,3.737014,0.181837,0.176819,
+ 0.387987,0.466053,0.795148,3.737014,0.181837,0.176819,
+ 0.146937,0.551946,0.820832,3.514981,-0.121886,0.187589,
+ 0.431966,-0.771434,0.46722,3.486028,-0.141683,0,
+ 0.387987,0.466053,0.795148,3.737014,0.181837,0.176819,
+ 0.431966,-0.771434,0.46722,3.486028,-0.141683,0,
+ -0.910859,-0.100368,-0.400327,3.731689,0.186391,0,
+ 0.694153,-0.467999,0.546926,3.454971,2.169877,0,
+ 0.742962,-0.255405,0.618688,3.4583,2.151656,0.102662,
+ -0.071584,0.92252,0.379253,3.727093,2.308406,0.150049,
+ 0.694153,-0.467999,0.546926,3.454971,2.169877,0,
+ -0.071584,0.92252,0.379253,3.727093,2.308406,0.150049,
+ 0.431966,-0.771434,-0.46722,3.71636,2.343387,0,
+ 0.614456,0.489786,0.618509,3.955635,0.432417,0.197586,
+ 0.338485,-0.103202,-0.935295,3.929251,0.411689,0,
+ -0.926486,-0.356041,-0.121897,4.126565,0.642027,0,
+ 0.614456,0.489786,0.618509,3.955635,0.432417,0.197586,
+ -0.926486,-0.356041,-0.121897,4.126565,0.642027,0,
+ 0.804239,-0.153549,0.574128,4.120842,0.627141,0.185461,
+ 0.718673,-0.290446,0.631784,3.889626,0.475277,0.247365,
+ 0.614456,0.489786,0.618509,3.955635,0.432417,0.197586,
+ 0.804239,-0.153549,0.574128,4.120842,0.627141,0.185461,
+ 0.815771,-0.424495,0.392838,3.861841,0.560638,0.311961,
+ 0.718673,-0.290446,0.631784,3.889626,0.475277,0.247365,
+ 0.804239,-0.153549,0.574128,4.120842,0.627141,0.185461,
+ 0.815771,-0.424495,0.392838,3.861841,0.560638,0.311961,
+ 0.804239,-0.153549,0.574128,4.120842,0.627141,0.185461,
+ 0.788801,-0.199379,0.581412,4.105198,0.672581,0.300001,
+ 0.900366,-0.205985,0.38329,3.849352,0.664451,0.387198,
+ 0.815771,-0.424495,0.392838,3.861841,0.560638,0.311961,
+ 0.788801,-0.199379,0.581412,4.105198,0.672581,0.300001,
+ 0.900366,-0.205985,0.38329,3.849352,0.664451,0.387198,
+ 0.788801,-0.199379,0.581412,4.105198,0.672581,0.300001,
+ 0.771881,-0.100912,0.627707,4.068249,0.798926,0.400813,
+ 0.906617,-0.14387,0.39667,3.823137,0.853054,0.461519,
+ 0.900366,-0.205985,0.38329,3.849352,0.664451,0.387198,
+ 0.771881,-0.100912,0.627707,4.068249,0.798926,0.400813,
+ 0.906617,-0.14387,0.39667,3.823137,0.853054,0.461519,
+ 0.771881,-0.100912,0.627707,4.068249,0.798926,0.400813,
+ 0.769758,0.095155,0.631204,4.041657,1.039756,0.496922,
+ 0.908163,-0.140074,0.394486,3.747724,1.184933,0.518662,
+ 0.906617,-0.14387,0.39667,3.823137,0.853054,0.461519,
+ 0.769758,0.095155,0.631204,4.041657,1.039756,0.496922,
+ 0.908163,-0.140074,0.394486,3.747724,1.184933,0.518662,
+ 0.769758,0.095155,0.631204,4.041657,1.039756,0.496922,
+ 0.763734,0.228435,0.603761,3.98851,1.297806,0.539537,
+ 0.907314,0.09913,0.4086,3.650974,1.46374,0.478617,
+ 0.908163,-0.140074,0.394486,3.747724,1.184933,0.518662,
+ 0.763734,0.228435,0.603761,3.98851,1.297806,0.539537,
+ 0.907314,0.09913,0.4086,3.650974,1.46374,0.478617,
+ 0.763734,0.228435,0.603761,3.98851,1.297806,0.539537,
+ 0.696162,0.333274,0.635835,3.886058,1.550141,0.50483,
+ 0.85208,0.278905,0.442914,3.590526,1.70109,0.411994,
+ 0.907314,0.09913,0.4086,3.650974,1.46374,0.478617,
+ 0.696162,0.333274,0.635835,3.886058,1.550141,0.50483,
+ 0.85208,0.278905,0.442914,3.590526,1.70109,0.411994,
+ 0.696162,0.333274,0.635835,3.886058,1.550141,0.50483,
+ 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
+ 0.759315,0.386803,0.523282,3.541188,1.849183,0.386366,
+ 0.85208,0.278905,0.442914,3.590526,1.70109,0.411994,
+ 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
+ 0.759315,0.386803,0.523282,3.541188,1.849183,0.386366,
+ 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
+ 0.462789,0.48004,0.745243,3.814876,1.968416,0.443,
+ 0.636794,0.461927,0.617346,3.479418,1.97825,0.317478,
+ 0.759315,0.386803,0.523282,3.541188,1.849183,0.386366,
+ 0.462789,0.48004,0.745243,3.814876,1.968416,0.443,
+ 0.636794,0.461927,0.617346,3.479418,1.97825,0.317478,
+ 0.462789,0.48004,0.745243,3.814876,1.968416,0.443,
+ 0.241303,0.584582,0.77462,3.758215,2.206683,0.323051,
+ 0.722145,-0.312679,0.617041,3.460196,2.103494,0.180368,
+ 0.636794,0.461927,0.617346,3.479418,1.97825,0.317478,
+ 0.241303,0.584582,0.77462,3.758215,2.206683,0.323051,
+ 0.722145,-0.312679,0.617041,3.460196,2.103494,0.180368,
+ 0.241303,0.584582,0.77462,3.758215,2.206683,0.323051,
+ 0.072694,0.752739,0.654294,3.745669,2.266001,0.24193,
+ 0.742962,-0.255405,0.618688,3.4583,2.151656,0.102662,
+ 0.722145,-0.312679,0.617041,3.460196,2.103494,0.180368,
+ 0.072694,0.752739,0.654294,3.745669,2.266001,0.24193,
+ 0.742962,-0.255405,0.618688,3.4583,2.151656,0.102662,
+ 0.072694,0.752739,0.654294,3.745669,2.266001,0.24193,
+ -0.071584,0.92252,0.379253,3.727093,2.308406,0.150049,
+ -0.560204,0.828355,-0.00034,3.33521,-0.375755,0,
+ -0.046579,0.627301,0.777383,3.342159,-0.384674,0.201349,
+ 0.6483,-0.171023,0.741928,3.107533,-0.691019,0.264602,
+ -0.560204,0.828355,-0.00034,3.33521,-0.375755,0,
+ 0.6483,-0.171023,0.741928,3.107533,-0.691019,0.264602,
+ -0.476715,0.879058,0,3.118124,-0.703925,0,
+ 0.12555,0.440005,0.889176,2.715712,1.828219,0.167709,
+ -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
+ 0.536218,-0.84408,0.000006,2.339597,1.807702,0,
+ 0.12555,0.440005,0.889176,2.715712,1.828219,0.167709,
+ 0.536218,-0.84408,0.000006,2.339597,1.807702,0,
+ -0.05128,0.509983,0.858655,2.361089,1.76666,0.202595,
+ 0.10998,0.376752,0.919762,2.738132,1.687333,0.295046,
+ 0.12555,0.440005,0.889176,2.715712,1.828219,0.167709,
+ -0.05128,0.509983,0.858655,2.361089,1.76666,0.202595,
+ 0.10998,0.376752,0.919762,2.738132,1.687333,0.295046,
+ -0.05128,0.509983,0.858655,2.361089,1.76666,0.202595,
+ -0.02226,0.394285,0.918719,2.406969,1.645328,0.341479,
+ 0.097864,0.250653,0.963118,2.77568,1.53871,0.352829,
+ 0.10998,0.376752,0.919762,2.738132,1.687333,0.295046,
+ -0.02226,0.394285,0.918719,2.406969,1.645328,0.341479,
+ 0.097864,0.250653,0.963118,2.77568,1.53871,0.352829,
+ -0.02226,0.394285,0.918719,2.406969,1.645328,0.341479,
+ -0.026262,0.311275,0.949957,2.519027,1.485931,0.422962,
+ 0.12742,0.021045,0.991626,2.815366,1.377583,0.413399,
+ 0.097864,0.250653,0.963118,2.77568,1.53871,0.352829,
+ -0.026262,0.311275,0.949957,2.519027,1.485931,0.422962,
+ 0.12742,0.021045,0.991626,2.815366,1.377583,0.413399,
+ -0.026262,0.311275,0.949957,2.519027,1.485931,0.422962,
+ -0.039079,0.203923,0.978207,2.553871,1.284278,0.512335,
+ 0.206882,-0.117024,0.971342,2.854291,1.093951,0.49465,
+ 0.12742,0.021045,0.991626,2.815366,1.377583,0.413399,
+ -0.039079,0.203923,0.978207,2.553871,1.284278,0.512335,
+ 0.206882,-0.117024,0.971342,2.854291,1.093951,0.49465,
+ -0.039079,0.203923,0.978207,2.553871,1.284278,0.512335,
+ -0.031021,0.098798,0.994624,2.637461,1.01726,0.581611,
+ 0.218538,-0.213954,0.952084,2.948387,0.783357,0.515058,
+ 0.206882,-0.117024,0.971342,2.854291,1.093951,0.49465,
+ -0.031021,0.098798,0.994624,2.637461,1.01726,0.581611,
+ 0.218538,-0.213954,0.952084,2.948387,0.783357,0.515058,
+ -0.031021,0.098798,0.994624,2.637461,1.01726,0.581611,
+ -0.012663,0.029084,0.999497,2.747937,0.712253,0.615674,
+ 0.304965,-0.136677,0.942505,3.06109,0.397226,0.574193,
+ 0.218538,-0.213954,0.952084,2.948387,0.783357,0.515058,
+ -0.012663,0.029084,0.999497,2.747937,0.712253,0.615674,
+ 0.304965,-0.136677,0.942505,3.06109,0.397226,0.574193,
+ -0.012663,0.029084,0.999497,2.747937,0.712253,0.615674,
+ -0.096144,-0.182414,0.97851,2.811504,0.469098,0.657443,
+ 0.304965,-0.136677,0.942505,3.06109,0.397226,0.574193,
+ -0.096144,-0.182414,0.97851,2.811504,0.469098,0.657443,
+ -0.200187,-0.124247,0.971848,2.898733,0.271916,0.651298,
+ -0.061264,0.921927,0.382487,3.136321,0.171237,0.539896,
+ 0.304965,-0.136677,0.942505,3.06109,0.397226,0.574193,
+ -0.200187,-0.124247,0.971848,2.898733,0.271916,0.651298,
+ -0.061264,0.921927,0.382487,3.136321,0.171237,0.539896,
+ -0.200187,-0.124247,0.971848,2.898733,0.271916,0.651298,
+ 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
+ -0.070642,0.834207,0.546908,3.16616,0.02131,0.457261,
+ -0.061264,0.921927,0.382487,3.136321,0.171237,0.539896,
+ 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
+ -0.070642,0.834207,0.546908,3.16616,0.02131,0.457261,
+ 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
+ 0.720876,-0.356662,0.594247,2.953029,-0.12769,0.520499,
+ -0.055544,0.828008,0.557959,3.199571,-0.153739,0.38015,
+ -0.070642,0.834207,0.546908,3.16616,0.02131,0.457261,
+ 0.720876,-0.356662,0.594247,2.953029,-0.12769,0.520499,
+ -0.055544,0.828008,0.557959,3.199571,-0.153739,0.38015,
+ 0.720876,-0.356662,0.594247,2.953029,-0.12769,0.520499,
+ 0.709718,-0.453837,0.538824,2.986408,-0.413503,0.428964,
+ -0.047374,0.758242,0.65025,3.286426,-0.300744,0.276331,
+ -0.055544,0.828008,0.557959,3.199571,-0.153739,0.38015,
+ 0.709718,-0.453837,0.538824,2.986408,-0.413503,0.428964,
+ -0.047374,0.758242,0.65025,3.286426,-0.300744,0.276331,
+ 0.709718,-0.453837,0.538824,2.986408,-0.413503,0.428964,
+ 0.4379,-0.250054,0.863549,3.053144,-0.609681,0.326931,
+ -0.046579,0.627301,0.777383,3.342159,-0.384674,0.201349,
+ -0.047374,0.758242,0.65025,3.286426,-0.300744,0.276331,
+ 0.4379,-0.250054,0.863549,3.053144,-0.609681,0.326931,
+ -0.046579,0.627301,0.777383,3.342159,-0.384674,0.201349,
+ 0.4379,-0.250054,0.863549,3.053144,-0.609681,0.326931,
+ 0.6483,-0.171023,0.741928,3.107533,-0.691019,0.264602,
+ -0.861251,0.383698,-0.333202,3.247406,2.073333,0,
+ 0.662294,0.443714,0.603726,3.233975,2.059193,0.072431,
+ 0.742962,-0.255405,0.618688,3.4583,2.151656,0.102662,
+ -0.861251,0.383698,-0.333202,3.247406,2.073333,0,
+ 0.742962,-0.255405,0.618688,3.4583,2.151656,0.102662,
+ 0.694153,-0.467999,0.546926,3.454971,2.169877,0,
+ 0.431966,-0.771434,0.46722,3.486028,-0.141683,0,
+ 0.146937,0.551946,0.820832,3.514981,-0.121886,0.187589,
+ -0.046579,0.627301,0.777383,3.342159,-0.384674,0.201349,
+ 0.431966,-0.771434,0.46722,3.486028,-0.141683,0,
+ -0.046579,0.627301,0.777383,3.342159,-0.384674,0.201349,
+ -0.560204,0.828355,-0.00034,3.33521,-0.375755,0,
+ 0.397823,0.403779,0.823832,3.009101,1.971604,0.03422,
+ 0.889638,-0.392482,0.233458,2.985371,1.982663,0,
+ -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
+ 0.449887,0.239005,0.860511,3.036361,1.913989,0.169838,
+ 0.397823,0.403779,0.823832,3.009101,1.971604,0.03422,
+ -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
+ 0.449887,0.239005,0.860511,3.036361,1.913989,0.169838,
+ -0.926486,-0.356041,0.121897,2.723503,1.898839,0,
+ 0.12555,0.440005,0.889176,2.715712,1.828219,0.167709,
+ 0.525142,-0.062799,0.848695,3.058366,1.773346,0.297337,
+ 0.449887,0.239005,0.860511,3.036361,1.913989,0.169838,
+ 0.12555,0.440005,0.889176,2.715712,1.828219,0.167709,
+ 0.525142,-0.062799,0.848695,3.058366,1.773346,0.297337,
+ 0.12555,0.440005,0.889176,2.715712,1.828219,0.167709,
+ 0.10998,0.376752,0.919762,2.738132,1.687333,0.295046,
+ 0.561573,-0.148323,0.814024,3.086666,1.632991,0.338863,
+ 0.525142,-0.062799,0.848695,3.058366,1.773346,0.297337,
+ 0.10998,0.376752,0.919762,2.738132,1.687333,0.295046,
+ 0.561573,-0.148323,0.814024,3.086666,1.632991,0.338863,
+ 0.10998,0.376752,0.919762,2.738132,1.687333,0.295046,
+ 0.097864,0.250653,0.963118,2.77568,1.53871,0.352829,
+ 0.513731,-0.239493,0.823847,3.115383,1.49239,0.380228,
+ 0.561573,-0.148323,0.814024,3.086666,1.632991,0.338863,
+ 0.097864,0.250653,0.963118,2.77568,1.53871,0.352829,
+ 0.513731,-0.239493,0.823847,3.115383,1.49239,0.380228,
+ 0.097864,0.250653,0.963118,2.77568,1.53871,0.352829,
+ 0.12742,0.021045,0.991626,2.815366,1.377583,0.413399,
+ 0.506924,-0.406124,0.760323,3.163181,1.209972,0.462438,
+ 0.513731,-0.239493,0.823847,3.115383,1.49239,0.380228,
+ 0.12742,0.021045,0.991626,2.815366,1.377583,0.413399,
+ 0.506924,-0.406124,0.760323,3.163181,1.209972,0.462438,
+ 0.12742,0.021045,0.991626,2.815366,1.377583,0.413399,
+ 0.206882,-0.117024,0.971342,2.854291,1.093951,0.49465,
+ 0.552633,-0.484765,0.677938,3.189664,0.907503,0.500122,
+ 0.506924,-0.406124,0.760323,3.163181,1.209972,0.462438,
+ 0.206882,-0.117024,0.971342,2.854291,1.093951,0.49465,
+ 0.552633,-0.484765,0.677938,3.189664,0.907503,0.500122,
+ 0.206882,-0.117024,0.971342,2.854291,1.093951,0.49465,
+ 0.218538,-0.213954,0.952084,2.948387,0.783357,0.515058,
+ 0.696414,-0.392791,0.600602,3.280681,0.510802,0.499434,
+ 0.552633,-0.484765,0.677938,3.189664,0.907503,0.500122,
+ 0.218538,-0.213954,0.952084,2.948387,0.783357,0.515058,
+ 0.696414,-0.392791,0.600602,3.280681,0.510802,0.499434,
+ 0.218538,-0.213954,0.952084,2.948387,0.783357,0.515058,
+ 0.304965,-0.136677,0.942505,3.06109,0.397226,0.574193,
+ 0.026499,0.942993,0.331757,3.321825,0.26669,0.46575,
+ 0.696414,-0.392791,0.600602,3.280681,0.510802,0.499434,
+ 0.304965,-0.136677,0.942505,3.06109,0.397226,0.574193,
+ 0.026499,0.942993,0.331757,3.321825,0.26669,0.46575,
+ 0.304965,-0.136677,0.942505,3.06109,0.397226,0.574193,
+ -0.061264,0.921927,0.382487,3.136321,0.171237,0.539896,
+ 0.019336,0.837694,0.545798,3.36004,0.165487,0.412685,
+ 0.026499,0.942993,0.331757,3.321825,0.26669,0.46575,
+ -0.061264,0.921927,0.382487,3.136321,0.171237,0.539896,
+ 0.019336,0.837694,0.545798,3.36004,0.165487,0.412685,
+ -0.061264,0.921927,0.382487,3.136321,0.171237,0.539896,
+ -0.070642,0.834207,0.546908,3.16616,0.02131,0.457261,
+ 0.05298,0.780732,0.622615,3.378799,0.073736,0.355362,
+ 0.019336,0.837694,0.545798,3.36004,0.165487,0.412685,
+ -0.070642,0.834207,0.546908,3.16616,0.02131,0.457261,
+ 0.05298,0.780732,0.622615,3.378799,0.073736,0.355362,
+ -0.070642,0.834207,0.546908,3.16616,0.02131,0.457261,
+ -0.055544,0.828008,0.557959,3.199571,-0.153739,0.38015,
+ 0.115383,0.694945,0.709746,3.43895,-0.08258,0.257015,
+ 0.05298,0.780732,0.622615,3.378799,0.073736,0.355362,
+ -0.055544,0.828008,0.557959,3.199571,-0.153739,0.38015,
+ 0.115383,0.694945,0.709746,3.43895,-0.08258,0.257015,
+ -0.055544,0.828008,0.557959,3.199571,-0.153739,0.38015,
+ -0.047374,0.758242,0.65025,3.286426,-0.300744,0.276331,
+ 0.146937,0.551946,0.820832,3.514981,-0.121886,0.187589,
+ 0.115383,0.694945,0.709746,3.43895,-0.08258,0.257015,
+ -0.047374,0.758242,0.65025,3.286426,-0.300744,0.276331,
+ 0.146937,0.551946,0.820832,3.514981,-0.121886,0.187589,
+ -0.047374,0.758242,0.65025,3.286426,-0.300744,0.276331,
+ -0.046579,0.627301,0.777383,3.342159,-0.384674,0.201349,
+ 0.387987,0.466053,0.795148,3.737014,0.181837,0.176819,
+ -0.910859,-0.100368,-0.400327,3.731689,0.186391,0,
+ 0.338485,-0.103202,-0.935295,3.929251,0.411689,0,
+ 0.387987,0.466053,0.795148,3.737014,0.181837,0.176819,
+ 0.338485,-0.103202,-0.935295,3.929251,0.411689,0,
+ 0.614456,0.489786,0.618509,3.955635,0.432417,0.197586,
+ 0.387394,0.516219,0.763835,3.700363,0.265794,0.240762,
+ 0.387987,0.466053,0.795148,3.737014,0.181837,0.176819,
+ 0.614456,0.489786,0.618509,3.955635,0.432417,0.197586,
+ 0.387394,0.516219,0.763835,3.700363,0.265794,0.240762,
+ 0.614456,0.489786,0.618509,3.955635,0.432417,0.197586,
+ 0.718673,-0.290446,0.631784,3.889626,0.475277,0.247365,
+ 0.328244,0.603535,0.726637,3.67471,0.338839,0.30784,
+ 0.387394,0.516219,0.763835,3.700363,0.265794,0.240762,
+ 0.718673,-0.290446,0.631784,3.889626,0.475277,0.247365,
+ 0.328244,0.603535,0.726637,3.67471,0.338839,0.30784,
+ 0.718673,-0.290446,0.631784,3.889626,0.475277,0.247365,
+ 0.815771,-0.424495,0.392838,3.861841,0.560638,0.311961,
+ 0.187432,0.691784,0.697355,3.641195,0.407454,0.362198,
+ 0.328244,0.603535,0.726637,3.67471,0.338839,0.30784,
+ 0.815771,-0.424495,0.392838,3.861841,0.560638,0.311961,
+ 0.065855,0.814333,0.576649,3.61965,0.472046,0.391742,
+ 0.187432,0.691784,0.697355,3.641195,0.407454,0.362198,
+ 0.815771,-0.424495,0.392838,3.861841,0.560638,0.311961,
+ 0.065855,0.814333,0.576649,3.61965,0.472046,0.391742,
+ 0.815771,-0.424495,0.392838,3.861841,0.560638,0.311961,
+ 0.900366,-0.205985,0.38329,3.849352,0.664451,0.387198,
+ 0.628361,-0.426126,0.65083,3.559394,0.706516,0.452535,
+ 0.065855,0.814333,0.576649,3.61965,0.472046,0.391742,
+ 0.900366,-0.205985,0.38329,3.849352,0.664451,0.387198,
+ 0.628361,-0.426126,0.65083,3.559394,0.706516,0.452535,
+ 0.900366,-0.205985,0.38329,3.849352,0.664451,0.387198,
+ 0.906617,-0.14387,0.39667,3.823137,0.853054,0.461519,
+ 0.697438,-0.478568,0.533435,3.528445,1.060127,0.489443,
+ 0.628361,-0.426126,0.65083,3.559394,0.706516,0.452535,
+ 0.906617,-0.14387,0.39667,3.823137,0.853054,0.461519,
+ 0.697438,-0.478568,0.533435,3.528445,1.060127,0.489443,
+ 0.906617,-0.14387,0.39667,3.823137,0.853054,0.461519,
+ 0.908163,-0.140074,0.394486,3.747724,1.184933,0.518662,
+ 0.772313,-0.244122,0.586461,3.47341,1.366149,0.454658,
+ 0.697438,-0.478568,0.533435,3.528445,1.060127,0.489443,
+ 0.908163,-0.140074,0.394486,3.747724,1.184933,0.518662,
+ 0.772313,-0.244122,0.586461,3.47341,1.366149,0.454658,
+ 0.908163,-0.140074,0.394486,3.747724,1.184933,0.518662,
+ 0.907314,0.09913,0.4086,3.650974,1.46374,0.478617,
+ 0.805898,-0.146097,0.573745,3.377233,1.5878,0.400781,
+ 0.772313,-0.244122,0.586461,3.47341,1.366149,0.454658,
+ 0.907314,0.09913,0.4086,3.650974,1.46374,0.478617,
+ 0.805898,-0.146097,0.573745,3.377233,1.5878,0.400781,
+ 0.907314,0.09913,0.4086,3.650974,1.46374,0.478617,
+ 0.85208,0.278905,0.442914,3.590526,1.70109,0.411994,
+ 0.795625,-0.129968,0.591684,3.337545,1.748927,0.34021,
+ 0.805898,-0.146097,0.573745,3.377233,1.5878,0.400781,
+ 0.85208,0.278905,0.442914,3.590526,1.70109,0.411994,
+ 0.795625,-0.129968,0.591684,3.337545,1.748927,0.34021,
+ 0.85208,0.278905,0.442914,3.590526,1.70109,0.411994,
+ 0.759315,0.386803,0.523282,3.541188,1.849183,0.386366,
+ 0.748939,0.152982,0.644738,3.276333,1.863773,0.294266,
+ 0.795625,-0.129968,0.591684,3.337545,1.748927,0.34021,
+ 0.759315,0.386803,0.523282,3.541188,1.849183,0.386366,
+ 0.748939,0.152982,0.644738,3.276333,1.863773,0.294266,
+ 0.759315,0.386803,0.523282,3.541188,1.849183,0.386366,
+ 0.636794,0.461927,0.617346,3.479418,1.97825,0.317478,
+ 0.693381,0.351142,0.629224,3.252224,2.026347,0.148215,
+ 0.748939,0.152982,0.644738,3.276333,1.863773,0.294266,
+ 0.636794,0.461927,0.617346,3.479418,1.97825,0.317478,
+ 0.693381,0.351142,0.629224,3.252224,2.026347,0.148215,
+ 0.636794,0.461927,0.617346,3.479418,1.97825,0.317478,
+ 0.722145,-0.312679,0.617041,3.460196,2.103494,0.180368,
+ 0.662294,0.443714,0.603726,3.233975,2.059193,0.072431,
+ 0.693381,0.351142,0.629224,3.252224,2.026347,0.148215,
+ 0.722145,-0.312679,0.617041,3.460196,2.103494,0.180368,
+ 0.662294,0.443714,0.603726,3.233975,2.059193,0.072431,
+ 0.722145,-0.312679,0.617041,3.460196,2.103494,0.180368,
+ 0.742962,-0.255405,0.618688,3.4583,2.151656,0.102662,
+ 0.720876,-0.356662,0.594247,2.953029,-0.12769,0.520499,
+ 0.100131,0.509748,0.854477,2.835437,-0.231101,0.57789,
+ 0.709718,-0.453837,0.538824,2.986408,-0.413503,0.428964,
+ -0.096144,-0.182414,0.97851,2.811504,0.469098,0.657443,
+ -0.012663,0.029084,0.999497,2.747937,0.712253,0.615674,
+ 0.324748,-0.466051,0.823004,2.679445,0.687427,0.720573,
+ -0.096144,-0.182414,0.97851,2.811504,0.469098,0.657443,
+ 0.324748,-0.466051,0.823004,2.679445,0.687427,0.720573,
+ 0.727708,-0.453484,0.514581,2.753156,0.400829,0.713141,
+ -0.200187,-0.124247,0.971848,2.898733,0.271916,0.651298,
+ -0.096144,-0.182414,0.97851,2.811504,0.469098,0.657443,
+ 0.727708,-0.453484,0.514581,2.753156,0.400829,0.713141,
+ -0.200187,-0.124247,0.971848,2.898733,0.271916,0.651298,
+ 0.727708,-0.453484,0.514581,2.753156,0.400829,0.713141,
+ 0.287759,-0.574148,0.766517,2.790681,0.219187,0.718263,
+ 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
+ -0.200187,-0.124247,0.971848,2.898733,0.271916,0.651298,
+ 0.287759,-0.574148,0.766517,2.790681,0.219187,0.718263,
+ 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
+ 0.287759,-0.574148,0.766517,2.790681,0.219187,0.718263,
+ 0.677632,-0.514013,0.525933,2.790657,0.044324,0.717488,
+ 0.290845,-0.568581,0.769497,2.743995,-0.129852,0.718277,
+ 0.478274,-0.500384,0.721713,2.736198,-0.346225,0.659345,
+ 0.100131,0.509748,0.854477,2.835437,-0.231101,0.57789,
+ 0.100131,0.509748,0.854477,2.835437,-0.231101,0.57789,
+ 0.720876,-0.356662,0.594247,2.953029,-0.12769,0.520499,
+ 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
+ 0.100131,0.509748,0.854477,2.835437,-0.231101,0.57789,
+ 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
+ 0.290845,-0.568581,0.769497,2.743995,-0.129852,0.718277,
+ 0.023112,-0.187685,0.981957,2.91987,0.084875,0.64246,
+ 0.677632,-0.514013,0.525933,2.790657,0.044324,0.717488,
+ 0.290845,-0.568581,0.769497,2.743995,-0.129852,0.718277,
+ 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
+ 0.437631,-0.408484,0.801012,2.482917,0.997637,0.702425,
+ 0.539192,-0.226204,0.811236,2.514162,0.988713,0.674527,
+ 0.876436,-0.293555,0.381688,2.543372,-0.548031,0.937182,
+ 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
+ 0.518786,-0.204527,0.830078,2.5392,-0.727778,0.750475,
+ 0.876436,-0.293555,0.381688,2.543372,-0.548031,0.937182,
+ 0.518786,-0.204527,0.830078,2.5392,-0.727778,0.750475,
+ 0.58512,-0.108234,0.803692,2.618307,-0.549092,0.805491,
+ 0.918784,-0.122699,0.375208,2.594499,-0.422948,0.981263,
+ 0.876436,-0.293555,0.381688,2.543372,-0.548031,0.937182,
+ 0.58512,-0.108234,0.803692,2.618307,-0.549092,0.805491,
+ 0.918784,-0.122699,0.375208,2.594499,-0.422948,0.981263,
+ 0.58512,-0.108234,0.803692,2.618307,-0.549092,0.805491,
+ 0.648132,-0.027411,0.761034,2.690576,-0.368057,0.819343,
+ 0.883063,-0.251635,0.396079,2.60743,-0.208248,0.974218,
+ 0.918784,-0.122699,0.375208,2.594499,-0.422948,0.981263,
+ 0.648132,-0.027411,0.761034,2.690576,-0.368057,0.819343,
+ 0.883063,-0.251635,0.396079,2.60743,-0.208248,0.974218,
+ 0.648132,-0.027411,0.761034,2.690576,-0.368057,0.819343,
+ 0.594643,-0.107364,0.796789,2.702577,-0.197406,0.795611,
+ 0.690473,-0.61586,0.379425,2.649413,0.031535,1.024796,
+ 0.883063,-0.251635,0.396079,2.60743,-0.208248,0.974218,
+ 0.594643,-0.107364,0.796789,2.702577,-0.197406,0.795611,
+ 0.690473,-0.61586,0.379425,2.649413,0.031535,1.024796,
+ 0.594643,-0.107364,0.796789,2.702577,-0.197406,0.795611,
+ 0.655995,-0.105886,0.747301,2.734183,0.038769,0.86581,
+ 0.276661,-0.626708,0.728489,2.668936,0.206182,1.014371,
+ 0.690473,-0.61586,0.379425,2.649413,0.031535,1.024796,
+ 0.655995,-0.105886,0.747301,2.734183,0.038769,0.86581,
+ 0.276661,-0.626708,0.728489,2.668936,0.206182,1.014371,
+ 0.655995,-0.105886,0.747301,2.734183,0.038769,0.86581,
+ 0.675576,-0.202498,0.708937,2.731512,0.219003,0.891585,
+ 0.112446,-0.618661,0.77757,2.616001,0.447717,0.960748,
+ 0.276661,-0.626708,0.728489,2.668936,0.206182,1.014371,
+ 0.675576,-0.202498,0.708937,2.731512,0.219003,0.891585,
+ 0.112446,-0.618661,0.77757,2.616001,0.447717,0.960748,
+ 0.675576,-0.202498,0.708937,2.731512,0.219003,0.891585,
+ 0.663699,-0.195183,0.722085,2.70696,0.393597,0.849582,
+ 0.189478,-0.558571,0.807525,2.5704,0.738683,0.830405,
+ 0.112446,-0.618661,0.77757,2.616001,0.447717,0.960748,
+ 0.663699,-0.195183,0.722085,2.70696,0.393597,0.849582,
+ 0.189478,-0.558571,0.807525,2.5704,0.738683,0.830405,
+ 0.663699,-0.195183,0.722085,2.70696,0.393597,0.849582,
+ 0.543412,-0.359347,0.758665,2.604217,0.728827,0.769671,
+ 0.437631,-0.408484,0.801012,2.482917,0.997637,0.702425,
+ 0.189478,-0.558571,0.807525,2.5704,0.738683,0.830405,
+ 0.543412,-0.359347,0.758665,2.604217,0.728827,0.769671,
+ 0.437631,-0.408484,0.801012,2.482917,0.997637,0.702425,
+ 0.543412,-0.359347,0.758665,2.604217,0.728827,0.769671,
+ 0.539192,-0.226204,0.811236,2.514162,0.988713,0.674527,
+ 0.245892,-0.489895,0.836385,2.688131,-0.517509,0.672975,
+ 0.478274,-0.500384,0.721713,2.736198,-0.346225,0.659345,
+ 0.648132,-0.027411,0.761034,2.690576,-0.368057,0.819343,
+ 0.245892,-0.489895,0.836385,2.688131,-0.517509,0.672975,
+ 0.648132,-0.027411,0.761034,2.690576,-0.368057,0.819343,
+ 0.58512,-0.108234,0.803692,2.618307,-0.549092,0.805491,
+ 0.727678,-0.414895,0.546211,2.542439,0.999928,0.648592,
+ 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
+ 0.539192,-0.226204,0.811236,2.514162,0.988713,0.674527,
+ 0.324748,-0.466051,0.823004,2.679445,0.687427,0.720573,
+ 0.727678,-0.414895,0.546211,2.542439,0.999928,0.648592,
+ 0.539192,-0.226204,0.811236,2.514162,0.988713,0.674527,
+ 0.324748,-0.466051,0.823004,2.679445,0.687427,0.720573,
+ 0.539192,-0.226204,0.811236,2.514162,0.988713,0.674527,
+ 0.543412,-0.359347,0.758665,2.604217,0.728827,0.769671,
+ 0.727708,-0.453484,0.514581,2.753156,0.400829,0.713141,
+ 0.324748,-0.466051,0.823004,2.679445,0.687427,0.720573,
+ 0.543412,-0.359347,0.758665,2.604217,0.728827,0.769671,
+ 0.727708,-0.453484,0.514581,2.753156,0.400829,0.713141,
+ 0.543412,-0.359347,0.758665,2.604217,0.728827,0.769671,
+ 0.663699,-0.195183,0.722085,2.70696,0.393597,0.849582,
+ 0.287759,-0.574148,0.766517,2.790681,0.219187,0.718263,
+ 0.727708,-0.453484,0.514581,2.753156,0.400829,0.713141,
+ 0.663699,-0.195183,0.722085,2.70696,0.393597,0.849582,
+ 0.287759,-0.574148,0.766517,2.790681,0.219187,0.718263,
+ 0.663699,-0.195183,0.722085,2.70696,0.393597,0.849582,
+ 0.675576,-0.202498,0.708937,2.731512,0.219003,0.891585,
+ 0.677632,-0.514013,0.525933,2.790657,0.044324,0.717488,
+ 0.287759,-0.574148,0.766517,2.790681,0.219187,0.718263,
+ 0.675576,-0.202498,0.708937,2.731512,0.219003,0.891585,
+ 0.677632,-0.514013,0.525933,2.790657,0.044324,0.717488,
+ 0.675576,-0.202498,0.708937,2.731512,0.219003,0.891585,
+ 0.655995,-0.105886,0.747301,2.734183,0.038769,0.86581,
+ 0.290845,-0.568581,0.769497,2.743995,-0.129852,0.718277,
+ 0.677632,-0.514013,0.525933,2.790657,0.044324,0.717488,
+ 0.655995,-0.105886,0.747301,2.734183,0.038769,0.86581,
+ 0.290845,-0.568581,0.769497,2.743995,-0.129852,0.718277,
+ 0.655995,-0.105886,0.747301,2.734183,0.038769,0.86581,
+ 0.594643,-0.107364,0.796789,2.702577,-0.197406,0.795611,
+ 0.478274,-0.500384,0.721713,2.736198,-0.346225,0.659345,
+ 0.290845,-0.568581,0.769497,2.743995,-0.129852,0.718277,
+ 0.594643,-0.107364,0.796789,2.702577,-0.197406,0.795611,
+ 0.478274,-0.500384,0.721713,2.736198,-0.346225,0.659345,
+ 0.594643,-0.107364,0.796789,2.702577,-0.197406,0.795611,
+ 0.648132,-0.027411,0.761034,2.690576,-0.368057,0.819343,
+ -0.012663,0.029084,0.999497,2.747937,0.712253,0.615674,
+ -0.031021,0.098798,0.994624,2.637461,1.01726,0.581611,
+ 0.727678,-0.414895,0.546211,2.542439,0.999928,0.648592,
+ -0.012663,0.029084,0.999497,2.747937,0.712253,0.615674,
+ 0.727678,-0.414895,0.546211,2.542439,0.999928,0.648592,
+ 0.324748,-0.466051,0.823004,2.679445,0.687427,0.720573,
+ -0.05128,0.509983,0.858655,2.361089,1.76666,0.202595,
+ 0.536218,-0.84408,0.000006,2.339597,1.807702,0,
+ 0.756976,-0.653442,0,2.128139,1.788397,0,
+ -0.05128,0.509983,0.858655,2.361089,1.76666,0.202595,
+ 0.756976,-0.653442,0,2.128139,1.788397,0,
+ 0.70745,-0.193334,0.679806,2.13239,1.755821,0.180271,
+ -0.02226,0.394285,0.918719,2.406969,1.645328,0.341479,
+ -0.05128,0.509983,0.858655,2.361089,1.76666,0.202595,
+ 0.70745,-0.193334,0.679806,2.13239,1.755821,0.180271,
+ -0.02226,0.394285,0.918719,2.406969,1.645328,0.341479,
+ 0.70745,-0.193334,0.679806,2.13239,1.755821,0.180271,
+ 0.71475,-0.118625,0.689247,2.183003,1.65407,0.341767,
+ -0.026262,0.311275,0.949957,2.519027,1.485931,0.422962,
+ -0.02226,0.394285,0.918719,2.406969,1.645328,0.341479,
+ 0.71475,-0.118625,0.689247,2.183003,1.65407,0.341767,
+ -0.026262,0.311275,0.949957,2.519027,1.485931,0.422962,
+ 0.71475,-0.118625,0.689247,2.183003,1.65407,0.341767,
+ 0.608407,-0.244593,0.754993,2.301359,1.397721,0.546015,
+ -0.039079,0.203923,0.978207,2.553871,1.284278,0.512335,
+ -0.026262,0.311275,0.949957,2.519027,1.485931,0.422962,
+ 0.608407,-0.244593,0.754993,2.301359,1.397721,0.546015,
+ -0.039079,0.203923,0.978207,2.553871,1.284278,0.512335,
+ 0.608407,-0.244593,0.754993,2.301359,1.397721,0.546015,
+ 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
+ -0.031021,0.098798,0.994624,2.637461,1.01726,0.581611,
+ -0.039079,0.203923,0.978207,2.553871,1.284278,0.512335,
+ 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
+ -0.031021,0.098798,0.994624,2.637461,1.01726,0.581611,
+ 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
+ 0.727678,-0.414895,0.546211,2.542439,0.999928,0.648592,
+ 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
+ -0.06371,0.842533,0.534864,2.346081,-0.74535,1.013296,
+ -0.069142,0.724976,0.685295,2.245624,-0.864372,0.995778,
+ 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
+ -0.069142,0.724976,0.685295,2.245624,-0.864372,0.995778,
+ 0.09853,0.626571,0.773111,2.292449,-0.871852,0.8824,
+ 0.71475,-0.118625,0.689247,2.183003,1.65407,0.341767,
+ 0.70745,-0.193334,0.679806,2.13239,1.755821,0.180271,
+ 0.411872,0.04507,0.910127,2.069379,1.727818,0.212746,
+ 0.71475,-0.118625,0.689247,2.183003,1.65407,0.341767,
+ 0.411872,0.04507,0.910127,2.069379,1.727818,0.212746,
+ 0.552828,-0.750794,0.36151,2.096552,1.678482,0.32681,
+ 0.608407,-0.244593,0.754993,2.301359,1.397721,0.546015,
+ 0.71475,-0.118625,0.689247,2.183003,1.65407,0.341767,
+ 0.552828,-0.750794,0.36151,2.096552,1.678482,0.32681,
+ 0.608407,-0.244593,0.754993,2.301359,1.397721,0.546015,
+ 0.552828,-0.750794,0.36151,2.096552,1.678482,0.32681,
+ 0.226413,-0.89822,0.376747,2.189848,1.468992,0.517501,
+ 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
+ 0.608407,-0.244593,0.754993,2.301359,1.397721,0.546015,
+ 0.226413,-0.89822,0.376747,2.189848,1.468992,0.517501,
+ 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
+ 0.226413,-0.89822,0.376747,2.189848,1.468992,0.517501,
+ 0.016767,-0.927537,0.373356,2.266003,1.273253,0.663332,
+ 0.437631,-0.408484,0.801012,2.482917,0.997637,0.702425,
+ 0.370396,-0.36596,0.853745,2.396355,1.242239,0.597722,
+ 0.016767,-0.927537,0.373356,2.266003,1.273253,0.663332,
+ 0.437631,-0.408484,0.801012,2.482917,0.997637,0.702425,
+ 0.016767,-0.927537,0.373356,2.266003,1.273253,0.663332,
+ 0.08136,-0.929085,0.360806,2.347317,1.066114,0.758763,
+ 0.189478,-0.558571,0.807525,2.5704,0.738683,0.830405,
+ 0.437631,-0.408484,0.801012,2.482917,0.997637,0.702425,
+ 0.08136,-0.929085,0.360806,2.347317,1.066114,0.758763,
+ 0.189478,-0.558571,0.807525,2.5704,0.738683,0.830405,
+ 0.08136,-0.929085,0.360806,2.347317,1.066114,0.758763,
+ 0.295093,-0.940225,0.16999,2.399389,0.782091,0.915279,
+ 0.112446,-0.618661,0.77757,2.616001,0.447717,0.960748,
+ 0.189478,-0.558571,0.807525,2.5704,0.738683,0.830405,
+ 0.295093,-0.940225,0.16999,2.399389,0.782091,0.915279,
+ 0.112446,-0.618661,0.77757,2.616001,0.447717,0.960748,
+ 0.295093,-0.940225,0.16999,2.399389,0.782091,0.915279,
+ 0.676544,-0.141883,0.722604,2.448969,0.529858,1.037335,
+ 0.276661,-0.626708,0.728489,2.668936,0.206182,1.014371,
+ 0.112446,-0.618661,0.77757,2.616001,0.447717,0.960748,
+ 0.676544,-0.141883,0.722604,2.448969,0.529858,1.037335,
+ 0.276661,-0.626708,0.728489,2.668936,0.206182,1.014371,
+ 0.676544,-0.141883,0.722604,2.448969,0.529858,1.037335,
+ 0.667276,-0.159228,0.727591,2.495354,0.250522,1.132081,
+ 0.690473,-0.61586,0.379425,2.649413,0.031535,1.024796,
+ 0.276661,-0.626708,0.728489,2.668936,0.206182,1.014371,
+ 0.667276,-0.159228,0.727591,2.495354,0.250522,1.132081,
+ 0.690473,-0.61586,0.379425,2.649413,0.031535,1.024796,
+ 0.667276,-0.159228,0.727591,2.495354,0.250522,1.132081,
+ 0.659349,-0.248914,0.709437,2.50049,-0.035029,1.170179,
+ 0.883063,-0.251635,0.396079,2.60743,-0.208248,0.974218,
+ 0.690473,-0.61586,0.379425,2.649413,0.031535,1.024796,
+ 0.659349,-0.248914,0.709437,2.50049,-0.035029,1.170179,
+ 0.883063,-0.251635,0.396079,2.60743,-0.208248,0.974218,
+ 0.659349,-0.248914,0.709437,2.50049,-0.035029,1.170179,
+ 0.631747,-0.24686,0.734817,2.452588,-0.244072,1.138797,
+ 0.918784,-0.122699,0.375208,2.594499,-0.422948,0.981263,
+ 0.883063,-0.251635,0.396079,2.60743,-0.208248,0.974218,
+ 0.631747,-0.24686,0.734817,2.452588,-0.244072,1.138797,
+ 0.918784,-0.122699,0.375208,2.594499,-0.422948,0.981263,
+ 0.631747,-0.24686,0.734817,2.452588,-0.244072,1.138797,
+ 0.623235,-0.257987,0.738255,2.439827,-0.395385,1.131324,
+ 0.876436,-0.293555,0.381688,2.543372,-0.548031,0.937182,
+ 0.918784,-0.122699,0.375208,2.594499,-0.422948,0.981263,
+ 0.623235,-0.257987,0.738255,2.439827,-0.395385,1.131324,
+ 0.876436,-0.293555,0.381688,2.543372,-0.548031,0.937182,
+ 0.623235,-0.257987,0.738255,2.439827,-0.395385,1.131324,
+ 0.791391,-0.43807,0.426373,2.384638,-0.591919,1.043058,
+ 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
+ 0.876436,-0.293555,0.381688,2.543372,-0.548031,0.937182,
+ 0.791391,-0.43807,0.426373,2.384638,-0.591919,1.043058,
+ 0.728904,-0.519577,0.445802,2.410367,-0.777999,0.841105,
+ 0.791391,-0.43807,0.426373,2.384638,-0.591919,1.043058,
+ -0.06371,0.842533,0.534864,2.346081,-0.74535,1.013296,
+ -0.069142,0.724976,0.685295,2.245624,-0.864372,0.995778,
+ -0.887036,-0.210048,-0.411154,2.222082,-0.957342,1.014137,
+ 0.080812,0.697931,0.711591,2.229345,-0.992723,0.862826,
+ -0.069142,0.724976,0.685295,2.245624,-0.864372,0.995778,
+ 0.080812,0.697931,0.711591,2.229345,-0.992723,0.862826,
+ 0.09853,0.626571,0.773111,2.292449,-0.871852,0.8824,
+ 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
+ -0.069142,0.724976,0.685295,2.245624,-0.864372,0.995778,
+ -0.06371,0.842533,0.534864,2.346081,-0.74535,1.013296,
+ 0.23972,-0.400363,0.884445,2.108912,-0.357128,1.259691,
+ 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
+ -0.06371,0.842533,0.534864,2.346081,-0.74535,1.013296,
+ 0.23972,-0.400363,0.884445,2.108912,-0.357128,1.259691,
+ -0.06371,0.842533,0.534864,2.346081,-0.74535,1.013296,
+ 0.791391,-0.43807,0.426373,2.384638,-0.591919,1.043058,
+ -0.720176,-0.693792,0,1.794465,1.787719,0,
+ -0.057955,0.638634,0.767325,1.807583,1.756546,0.177627,
+ 0.411872,0.04507,0.910127,2.069379,1.727818,0.212746,
+ -0.720176,-0.693792,0,1.794465,1.787719,0,
+ 0.411872,0.04507,0.910127,2.069379,1.727818,0.212746,
+ -0.385788,0.922588,0,2.042206,1.777154,0,
+ 0.25339,-0.287519,0.923648,2.136269,-0.187666,1.278057,
+ 0.23972,-0.400363,0.884445,2.108912,-0.357128,1.259691,
+ 0.791391,-0.43807,0.426373,2.384638,-0.591919,1.043058,
+ 0.25339,-0.287519,0.923648,2.136269,-0.187666,1.278057,
+ 0.791391,-0.43807,0.426373,2.384638,-0.591919,1.043058,
+ 0.623235,-0.257987,0.738255,2.439827,-0.395385,1.131324,
+ 0.25339,-0.287519,0.923648,2.136269,-0.187666,1.278057,
+ 0.623235,-0.257987,0.738255,2.439827,-0.395385,1.131324,
+ 0.631747,-0.24686,0.734817,2.452588,-0.244072,1.138797,
+ 0.187438,-0.340915,0.921219,2.14179,-0.055306,1.295565,
+ 0.25339,-0.287519,0.923648,2.136269,-0.187666,1.278057,
+ 0.631747,-0.24686,0.734817,2.452588,-0.244072,1.138797,
+ 0.187438,-0.340915,0.921219,2.14179,-0.055306,1.295565,
+ 0.631747,-0.24686,0.734817,2.452588,-0.244072,1.138797,
+ 0.659349,-0.248914,0.709437,2.50049,-0.035029,1.170179,
+ 0.114032,-0.218132,0.969234,2.0817,0.283249,1.259461,
+ 0.187438,-0.340915,0.921219,2.14179,-0.055306,1.295565,
+ 0.659349,-0.248914,0.709437,2.50049,-0.035029,1.170179,
+ 0.114032,-0.218132,0.969234,2.0817,0.283249,1.259461,
+ 0.659349,-0.248914,0.709437,2.50049,-0.035029,1.170179,
+ 0.667276,-0.159228,0.727591,2.495354,0.250522,1.132081,
+ 0.10833,0.05569,0.992554,2.023441,0.529338,1.144399,
+ 0.114032,-0.218132,0.969234,2.0817,0.283249,1.259461,
+ 0.667276,-0.159228,0.727591,2.495354,0.250522,1.132081,
+ 0.10833,0.05569,0.992554,2.023441,0.529338,1.144399,
+ 0.667276,-0.159228,0.727591,2.495354,0.250522,1.132081,
+ 0.676544,-0.141883,0.722604,2.448969,0.529858,1.037335,
+ 0.107989,0.168108,0.979836,1.975941,0.827957,1.018423,
+ 0.10833,0.05569,0.992554,2.023441,0.529338,1.144399,
+ 0.676544,-0.141883,0.722604,2.448969,0.529858,1.037335,
+ 0.107989,0.168108,0.979836,1.975941,0.827957,1.018423,
+ 0.676544,-0.141883,0.722604,2.448969,0.529858,1.037335,
+ 0.295093,-0.940225,0.16999,2.399389,0.782091,0.915279,
+ 0.088722,0.251367,0.963817,1.958254,1.130271,0.861813,
+ 0.107989,0.168108,0.979836,1.975941,0.827957,1.018423,
+ 0.295093,-0.940225,0.16999,2.399389,0.782091,0.915279,
+ 0.088722,0.251367,0.963817,1.958254,1.130271,0.861813,
+ 0.295093,-0.940225,0.16999,2.399389,0.782091,0.915279,
+ 0.08136,-0.929085,0.360806,2.347317,1.066114,0.758763,
+ 0.060533,0.377837,0.923891,1.859443,1.450393,0.632222,
+ 0.088722,0.251367,0.963817,1.958254,1.130271,0.861813,
+ 0.08136,-0.929085,0.360806,2.347317,1.066114,0.758763,
+ 0.060533,0.377837,0.923891,1.859443,1.450393,0.632222,
+ 0.08136,-0.929085,0.360806,2.347317,1.066114,0.758763,
+ 0.016767,-0.927537,0.373356,2.266003,1.273253,0.663332,
+ 0.016737,0.497476,0.867316,1.821946,1.618209,0.403751,
+ 0.060533,0.377837,0.923891,1.859443,1.450393,0.632222,
+ 0.016767,-0.927537,0.373356,2.266003,1.273253,0.663332,
+ 0.016737,0.497476,0.867316,1.821946,1.618209,0.403751,
+ 0.016767,-0.927537,0.373356,2.266003,1.273253,0.663332,
+ 0.226413,-0.89822,0.376747,2.189848,1.468992,0.517501,
+ -0.024013,0.58573,0.810151,1.798719,1.714447,0.259352,
+ 0.016737,0.497476,0.867316,1.821946,1.618209,0.403751,
+ 0.226413,-0.89822,0.376747,2.189848,1.468992,0.517501,
+ -0.024013,0.58573,0.810151,1.798719,1.714447,0.259352,
+ 0.226413,-0.89822,0.376747,2.189848,1.468992,0.517501,
+ 0.552828,-0.750794,0.36151,2.096552,1.678482,0.32681,
+ -0.057955,0.638634,0.767325,1.807583,1.756546,0.177627,
+ -0.024013,0.58573,0.810151,1.798719,1.714447,0.259352,
+ 0.552828,-0.750794,0.36151,2.096552,1.678482,0.32681,
+ -0.057955,0.638634,0.767325,1.807583,1.756546,0.177627,
+ 0.552828,-0.750794,0.36151,2.096552,1.678482,0.32681,
+ 0.411872,0.04507,0.910127,2.069379,1.727818,0.212746,
+ 0.981421,-0.191868,0,0.733818,1.740873,0,
+ 0.566114,-0.824327,0,0.234527,1.730117,0,
+ 0.095331,0.952335,0.289775,0.223642,1.684075,0.160743,
+ 0.981421,-0.191868,0,0.733818,1.740873,0,
+ 0.095331,0.952335,0.289775,0.223642,1.684075,0.160743,
+ 0.100949,-0.548551,0.830001,0.737904,1.604213,0.281713,
+ 0.100949,-0.548551,0.830001,0.737904,1.604213,0.281713,
+ 0.095331,0.952335,0.289775,0.223642,1.684075,0.160743,
+ 0.10291,0.954344,0.280422,0.23733,1.595746,0.288672,
+ 0.100949,-0.548551,0.830001,0.737904,1.604213,0.281713,
+ 0.10291,0.954344,0.280422,0.23733,1.595746,0.288672,
+ 0.068777,-0.757383,0.649339,0.725959,1.478055,0.461804,
+ 0.068777,-0.757383,0.649339,0.725959,1.478055,0.461804,
+ 0.10291,0.954344,0.280422,0.23733,1.595746,0.288672,
+ 0.172251,0.950689,0.257916,0.289039,1.496446,0.430055,
+ 0.068777,-0.757383,0.649339,0.725959,1.478055,0.461804,
+ 0.172251,0.950689,0.257916,0.289039,1.496446,0.430055,
+ 0.023352,-0.872807,0.487506,0.760722,1.205036,0.700545,
+ 0.023352,-0.872807,0.487506,0.760722,1.205036,0.700545,
+ 0.172251,0.950689,0.257916,0.289039,1.496446,0.430055,
+ 0.28101,0.853935,0.437982,0.305671,1.298417,0.629719,
+ 0.023352,-0.872807,0.487506,0.760722,1.205036,0.700545,
+ 0.28101,0.853935,0.437982,0.305671,1.298417,0.629719,
+ 0.004725,-0.680391,0.732834,0.857323,0.985001,0.874029,
+ 0.004725,-0.680391,0.732834,0.857323,0.985001,0.874029,
+ 0.28101,0.853935,0.437982,0.305671,1.298417,0.629719,
+ 0.381239,0.555717,0.738807,0.243473,1.134082,0.819993,
+ 0.004725,-0.680391,0.732834,0.857323,0.985001,0.874029,
+ 0.381239,0.555717,0.738807,0.243473,1.134082,0.819993,
+ 0.034172,-0.858604,0.511498,0.921312,0.755659,0.99933,
+ 0.034172,-0.858604,0.511498,0.921312,0.755659,0.99933,
+ 0.381239,0.555717,0.738807,0.243473,1.134082,0.819993,
+ 0.376012,0.360026,0.853813,0.316341,0.785311,1.08626,
+ 0.034172,-0.858604,0.511498,0.921312,0.755659,0.99933,
+ 0.376012,0.360026,0.853813,0.316341,0.785311,1.08626,
+ 0.037423,-0.986705,0.158154,0.939271,0.379986,1.185872,
+ 0.037423,-0.986705,0.158154,0.939271,0.379986,1.185872,
+ 0.376012,0.360026,0.853813,0.316341,0.785311,1.08626,
+ 0.207079,0.373404,0.904261,0.539252,0.353984,1.254493,
+ 0.037423,-0.986705,0.158154,0.939271,0.379986,1.185872,
+ 0.207079,0.373404,0.904261,0.539252,0.353984,1.254493,
+ 0.013768,-0.992402,0.122267,0.927775,0.195225,1.233043,
+ 0.013768,-0.992402,0.122267,0.927775,0.195225,1.233043,
+ 0.207079,0.373404,0.904261,0.539252,0.353984,1.254493,
+ -0.045242,0.348413,0.936249,0.53915,0.148262,1.321014,
+ 0.013768,-0.992402,0.122267,0.927775,0.195225,1.233043,
+ -0.045242,0.348413,0.936249,0.53915,0.148262,1.321014,
+ 0.076524,0.950336,0.301672,0.950215,0.042751,1.256188,
+ 0.076524,0.950336,0.301672,0.950215,0.042751,1.256188,
+ -0.045242,0.348413,0.936249,0.53915,0.148262,1.321014,
+ -0.212948,0.334057,0.918182,0.516872,-0.020713,1.356627,
+ 0.076524,0.950336,0.301672,0.950215,0.042751,1.256188,
+ -0.212948,0.334057,0.918182,0.516872,-0.020713,1.356627,
+ 0.100598,0.942931,0.317428,0.943855,-0.101127,1.274771,
+ 0.100598,0.942931,0.317428,0.943855,-0.101127,1.274771,
+ -0.212948,0.334057,0.918182,0.516872,-0.020713,1.356627,
+ -0.282152,0.285245,0.915983,0.542386,-0.188227,1.370375,
+ 0.100598,0.942931,0.317428,0.943855,-0.101127,1.274771,
+ -0.282152,0.285245,0.915983,0.542386,-0.188227,1.370375,
+ 0.150328,0.92948,0.336851,0.960321,-0.308052,1.243133,
+ 0.150328,0.92948,0.336851,0.960321,-0.308052,1.243133,
+ -0.282152,0.285245,0.915983,0.542386,-0.188227,1.370375,
+ -0.326048,0.118611,0.937883,0.546875,-0.39094,1.363244,
+ 0.150328,0.92948,0.336851,0.960321,-0.308052,1.243133,
+ -0.326048,0.118611,0.937883,0.546875,-0.39094,1.363244,
+ 0.235667,0.756618,0.60991,0.97453,-0.525273,1.140353,
+ 0.235667,0.756618,0.60991,0.97453,-0.525273,1.140353,
+ -0.326048,0.118611,0.937883,0.546875,-0.39094,1.363244,
+ -0.422758,-0.178302,0.888529,0.550658,-0.633015,1.331311,
+ 0.235667,0.756618,0.60991,0.97453,-0.525273,1.140353,
+ -0.422758,-0.178302,0.888529,0.550658,-0.633015,1.331311,
+ 0.305452,0.425365,0.851918,0.948819,-0.638568,1.102958,
+ 0.305452,0.425365,0.851918,0.948819,-0.638568,1.102958,
+ -0.422758,-0.178302,0.888529,0.550658,-0.633015,1.331311,
+ -0.504483,-0.438591,0.743731,0.527724,-0.862854,1.253811,
+ 0.305452,0.425365,0.851918,0.948819,-0.638568,1.102958,
+ -0.504483,-0.438591,0.743731,0.527724,-0.862854,1.253811,
+ 0.325482,0.443544,0.835063,0.939974,-0.894739,1.019809,
+ 0.325482,0.443544,0.835063,0.939974,-0.894739,1.019809,
+ -0.504483,-0.438591,0.743731,0.527724,-0.862854,1.253811,
+ -0.53858,-0.616298,0.57455,0.544825,-1.133123,1.096902,
+ 0.325482,0.443544,0.835063,0.939974,-0.894739,1.019809,
+ -0.53858,-0.616298,0.57455,0.544825,-1.133123,1.096902,
+ 0.242426,0.58207,0.77616,0.956456,-1.070504,0.921063,
+ 0.242426,0.58207,0.77616,0.956456,-1.070504,0.921063,
+ -0.53858,-0.616298,0.57455,0.544825,-1.133123,1.096902,
+ -0.507894,-0.767261,0.391606,0.530629,-1.316423,0.929842,
+ 0.242426,0.58207,0.77616,0.956456,-1.070504,0.921063,
+ -0.507894,-0.767261,0.391606,0.530629,-1.316423,0.929842,
+ 0.070189,0.510248,0.857158,0.93066,-1.216516,0.831196,
+ 0.070189,0.510248,0.857158,0.93066,-1.216516,0.831196,
+ -0.507894,-0.767261,0.391606,0.530629,-1.316423,0.929842,
+ -0.375453,-0.69207,0.616502,0.538756,-1.408602,0.764911,
+ 0.070189,0.510248,0.857158,0.93066,-1.216516,0.831196,
+ -0.375453,-0.69207,0.616502,0.538756,-1.408602,0.764911,
+ -0.078623,0.370994,0.925301,0.922703,-1.296032,0.728307,
+ -0.078623,0.370994,0.925301,0.922703,-1.296032,0.728307,
+ -0.375453,-0.69207,0.616502,0.538756,-1.408602,0.764911,
+ -0.1427,-0.847733,0.510868,0.489819,-1.524947,0.672392,
+ -0.078623,0.370994,0.925301,0.922703,-1.296032,0.728307,
+ -0.1427,-0.847733,0.510868,0.489819,-1.524947,0.672392,
+ -0.123389,0.256577,0.958615,0.912699,-1.455066,0.576185,
+ -0.123389,0.256577,0.958615,0.912699,-1.455066,0.576185,
+ -0.1427,-0.847733,0.510868,0.489819,-1.524947,0.672392,
+ -0.178511,-0.973481,0.143068,0.480235,-1.631521,0.401961,
+ -0.123389,0.256577,0.958615,0.912699,-1.455066,0.576185,
+ -0.178511,-0.973481,0.143068,0.480235,-1.631521,0.401961,
+ -0.165685,0.059692,0.98437,0.912989,-1.499314,0.419547,
+ -0.165685,0.059692,0.98437,0.912989,-1.499314,0.419547,
+ -0.178511,-0.973481,0.143068,0.480235,-1.631521,0.401961,
+ 0.226963,-0.973903,0,0.44655,-1.67295,0,
+ -0.165685,0.059692,0.98437,0.912989,-1.499314,0.419547,
+ 0.226963,-0.973903,0,0.44655,-1.67295,0,
+ 0.92802,-0.37253,0,0.927497,-1.558489,0,
+ -0.039092,-0.999236,0,-0.228904,1.734267,0,
+ -0.009814,-0.999952,0,-0.547248,1.742126,0,
+ -0.021294,0.896295,0.442946,-0.559706,1.69418,0.186107,
+ -0.039092,-0.999236,0,-0.228904,1.734267,0,
+ -0.021294,0.896295,0.442946,-0.559706,1.69418,0.186107,
+ 0.067879,0.951186,0.30106,-0.221516,1.686349,0.151403,
+ 0.067879,0.951186,0.30106,-0.221516,1.686349,0.151403,
+ -0.021294,0.896295,0.442946,-0.559706,1.69418,0.186107,
+ -0.072244,0.618144,0.782738,-0.557624,1.641278,0.271462,
+ 0.067879,0.951186,0.30106,-0.221516,1.686349,0.151403,
+ -0.072244,0.618144,0.782738,-0.557624,1.641278,0.271462,
+ 0.085022,0.963119,0.255291,-0.267035,1.627058,0.266577,
+ 0.085022,0.963119,0.255291,-0.267035,1.627058,0.266577,
+ -0.072244,0.618144,0.782738,-0.557624,1.641278,0.271462,
+ -0.038944,0.247819,0.968023,-0.626493,1.585426,0.443136,
+ 0.085022,0.963119,0.255291,-0.267035,1.627058,0.266577,
+ -0.038944,0.247819,0.968023,-0.626493,1.585426,0.443136,
+ 0.120743,0.971588,0.203561,-0.247999,1.565146,0.389142,
+ 0.120743,0.971588,0.203561,-0.247999,1.565146,0.389142,
+ -0.038944,0.247819,0.968023,-0.626493,1.585426,0.443136,
+ -0.00315,0.115338,0.993321,-0.597781,1.48962,0.641047,
+ 0.120743,0.971588,0.203561,-0.247999,1.565146,0.389142,
+ -0.00315,0.115338,0.993321,-0.597781,1.48962,0.641047,
+ 0.117963,0.926753,0.356669,-0.179548,1.471301,0.544513,
+ 0.117963,0.926753,0.356669,-0.179548,1.471301,0.544513,
+ -0.00315,0.115338,0.993321,-0.597781,1.48962,0.641047,
+ 0.016683,0.197618,0.980137,-0.674657,1.333008,0.761059,
+ 0.117963,0.926753,0.356669,-0.179548,1.471301,0.544513,
+ 0.016683,0.197618,0.980137,-0.674657,1.333008,0.761059,
+ 0.109947,0.693426,0.71209,-0.192546,1.305535,0.70008,
+ 0.109947,0.693426,0.71209,-0.192546,1.305535,0.70008,
+ 0.016683,0.197618,0.980137,-0.674657,1.333008,0.761059,
+ 0.032424,0.316591,0.948008,-0.910602,1.204118,0.83774,
+ 0.109947,0.693426,0.71209,-0.192546,1.305535,0.70008,
+ 0.032424,0.316591,0.948008,-0.910602,1.204118,0.83774,
+ 0.076565,0.333251,0.939724,-0.406155,1.005088,0.971088,
+ 0.076565,0.333251,0.939724,-0.406155,1.005088,0.971088,
+ 0.032424,0.316591,0.948008,-0.910602,1.204118,0.83774,
+ 0.053195,0.343167,0.937767,-0.969076,0.901205,1.146223,
+ 0.076565,0.333251,0.939724,-0.406155,1.005088,0.971088,
+ 0.053195,0.343167,0.937767,-0.969076,0.901205,1.146223,
+ -0.039599,0.171847,0.984327,-0.11519,0.458427,1.346197,
+ -0.039599,0.171847,0.984327,-0.11519,0.458427,1.346197,
+ 0.053195,0.343167,0.937767,-0.969076,0.901205,1.146223,
+ 0.057735,0.173734,0.983099,-0.752416,0.438132,1.467349,
+ -0.039599,0.171847,0.984327,-0.11519,0.458427,1.346197,
+ 0.057735,0.173734,0.983099,-0.752416,0.438132,1.467349,
+ -0.164971,0.181757,0.969406,0.005537,0.163519,1.472265,
+ -0.164971,0.181757,0.969406,0.005537,0.163519,1.472265,
+ 0.057735,0.173734,0.983099,-0.752416,0.438132,1.467349,
+ 0.058723,-0.195869,0.97887,-0.645496,0.179261,1.584316,
+ -0.164971,0.181757,0.969406,0.005537,0.163519,1.472265,
+ 0.058723,-0.195869,0.97887,-0.645496,0.179261,1.584316,
+ -0.216817,0.278777,0.935561,0.018086,0.002865,1.523199,
+ -0.216817,0.278777,0.935561,0.018086,0.002865,1.523199,
+ 0.058723,-0.195869,0.97887,-0.645496,0.179261,1.584316,
+ 0.088769,-0.475351,0.875307,-0.536767,-0.144454,1.682232,
+ -0.216817,0.278777,0.935561,0.018086,0.002865,1.523199,
+ 0.088769,-0.475351,0.875307,-0.536767,-0.144454,1.682232,
+ -0.219724,0.297861,0.928978,0.034087,-0.225059,1.542949,
+ -0.219724,0.297861,0.928978,0.034087,-0.225059,1.542949,
+ 0.088769,-0.475351,0.875307,-0.536767,-0.144454,1.682232,
+ 0.099302,-0.563694,0.819993,-0.533528,-0.58228,1.701405,
+ -0.219724,0.297861,0.928978,0.034087,-0.225059,1.542949,
+ 0.099302,-0.563694,0.819993,-0.533528,-0.58228,1.701405,
+ -0.227369,0.161984,0.960242,0.010486,-0.502317,1.576297,
+ -0.227369,0.161984,0.960242,0.010486,-0.502317,1.576297,
+ 0.099302,-0.563694,0.819993,-0.533528,-0.58228,1.701405,
+ 0.093802,-0.705497,0.702478,-0.505045,-0.913827,1.645612,
+ -0.227369,0.161984,0.960242,0.010486,-0.502317,1.576297,
+ 0.093802,-0.705497,0.702478,-0.505045,-0.913827,1.645612,
+ -0.30296,-0.137183,0.943078,0.021051,-0.831931,1.511548,
+ -0.30296,-0.137183,0.943078,0.021051,-0.831931,1.511548,
+ 0.093802,-0.705497,0.702478,-0.505045,-0.913827,1.645612,
+ 0.058028,-0.329667,0.942312,-0.487217,-1.193519,1.504026,
+ -0.30296,-0.137183,0.943078,0.021051,-0.831931,1.511548,
+ 0.058028,-0.329667,0.942312,-0.487217,-1.193519,1.504026,
+ -0.387895,-0.42081,0.820034,-0.04157,-1.143825,1.395176,
+ -0.387895,-0.42081,0.820034,-0.04157,-1.143825,1.395176,
+ 0.058028,-0.329667,0.942312,-0.487217,-1.193519,1.504026,
+ 0.096347,0.961203,0.258467,-0.524231,-1.399266,1.313019,
+ -0.387895,-0.42081,0.820034,-0.04157,-1.143825,1.395176,
+ 0.096347,0.961203,0.258467,-0.524231,-1.399266,1.313019,
+ -0.433119,-0.541142,0.720814,-0.071941,-1.346991,1.237379,
+ -0.433119,-0.541142,0.720814,-0.071941,-1.346991,1.237379,
+ 0.096347,0.961203,0.258467,-0.524231,-1.399266,1.313019,
+ 0.098712,0.966371,0.23745,-0.526127,-1.495,1.167736,
+ -0.433119,-0.541142,0.720814,-0.071941,-1.346991,1.237379,
+ 0.098712,0.966371,0.23745,-0.526127,-1.495,1.167736,
+ -0.455057,-0.684123,0.569999,-0.0723,-1.450245,1.087397,
+ -0.455057,-0.684123,0.569999,-0.0723,-1.450245,1.087397,
+ 0.098712,0.966371,0.23745,-0.526127,-1.495,1.167736,
+ 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
+ -0.455057,-0.684123,0.569999,-0.0723,-1.450245,1.087397,
+ 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
+ -0.084259,-0.367691,0.926123,-0.063012,-1.583021,0.865082,
+ -0.098179,0.995169,0,-0.866132,1.75467,0,
+ -0.065586,-0.997847,0,-1.179474,1.786649,0,
+ -0.115746,0.20405,0.972094,-1.215563,1.757097,0.133494,
+ -0.098179,0.995169,0,-0.866132,1.75467,0,
+ -0.115746,0.20405,0.972094,-1.215563,1.757097,0.133494,
+ 0.136965,0.155729,0.978258,-0.894132,1.712652,0.151911,
+ 0.136965,0.155729,0.978258,-0.894132,1.712652,0.151911,
+ -0.115746,0.20405,0.972094,-1.215563,1.757097,0.133494,
+ -0.164191,0.153328,0.974439,-1.227613,1.709095,0.276029,
+ 0.136965,0.155729,0.978258,-0.894132,1.712652,0.151911,
+ -0.164191,0.153328,0.974439,-1.227613,1.709095,0.276029,
+ 0.173447,0.205435,0.963178,-0.954897,1.677544,0.293034,
+ 0.173447,0.205435,0.963178,-0.954897,1.677544,0.293034,
+ -0.164191,0.153328,0.974439,-1.227613,1.709095,0.276029,
+ -0.15812,-0.033626,0.986847,-1.292756,1.656509,0.51403,
+ 0.173447,0.205435,0.963178,-0.954897,1.677544,0.293034,
+ -0.15812,-0.033626,0.986847,-1.292756,1.656509,0.51403,
+ 0.136801,0.29658,0.945159,-1.017767,1.607824,0.541965,
+ 0.136801,0.29658,0.945159,-1.017767,1.607824,0.541965,
+ -0.15812,-0.033626,0.986847,-1.292756,1.656509,0.51403,
+ 0.005821,-0.234321,0.972142,-1.338488,1.613735,0.725441,
+ 0.136801,0.29658,0.945159,-1.017767,1.607824,0.541965,
+ 0.005821,-0.234321,0.972142,-1.338488,1.613735,0.725441,
+ 0.095019,0.330845,0.938889,-1.04607,1.509097,0.76106,
+ 0.095019,0.330845,0.938889,-1.04607,1.509097,0.76106,
+ 0.005821,-0.234321,0.972142,-1.338488,1.613735,0.725441,
+ 0.243464,-0.335965,0.909864,-1.403848,1.533059,0.902827,
+ 0.095019,0.330845,0.938889,-1.04607,1.509097,0.76106,
+ 0.243464,-0.335965,0.909864,-1.403848,1.533059,0.902827,
+ 0.07657,0.16758,0.982881,-1.115594,1.39238,0.819623,
+ 0.07657,0.16758,0.982881,-1.115594,1.39238,0.819623,
+ 0.243464,-0.335965,0.909864,-1.403848,1.533059,0.902827,
+ 0.49938,-0.45475,0.737443,-1.551526,1.400025,1.050193,
+ 0.07657,0.16758,0.982881,-1.115594,1.39238,0.819623,
+ 0.49938,-0.45475,0.737443,-1.551526,1.400025,1.050193,
+ 0.079214,-0.175111,0.981357,-1.278903,1.192051,0.946843,
+ 0.079214,-0.175111,0.981357,-1.278903,1.192051,0.946843,
+ 0.49938,-0.45475,0.737443,-1.551526,1.400025,1.050193,
+ 0.573426,-0.441087,0.69038,-1.552899,1.128654,1.15104,
+ 0.079214,-0.175111,0.981357,-1.278903,1.192051,0.946843,
+ 0.573426,-0.441087,0.69038,-1.552899,1.128654,1.15104,
+ 0.204115,-0.405276,0.891116,-1.200768,0.978822,1.103391,
+ 0.204115,-0.405276,0.891116,-1.200768,0.978822,1.103391,
+ 0.573426,-0.441087,0.69038,-1.552899,1.128654,1.15104,
+ 0.1643,0.873906,0.457487,-1.454529,0.875045,1.238858,
+ 0.204115,-0.405276,0.891116,-1.200768,0.978822,1.103391,
+ 0.1643,0.873906,0.457487,-1.454529,0.875045,1.238858,
+ 0.396045,-0.47666,0.784821,-1.147922,0.807955,1.254191,
+ 0.396045,-0.47666,0.784821,-1.147922,0.807955,1.254191,
+ 0.1643,0.873906,0.457487,-1.454529,0.875045,1.238858,
+ -0.012448,0.906487,0.422051,-1.405685,0.573835,1.352181,
+ 0.396045,-0.47666,0.784821,-1.147922,0.807955,1.254191,
+ -0.012448,0.906487,0.422051,-1.405685,0.573835,1.352181,
+ 0.238702,-0.258568,0.936036,-1.120716,0.424016,1.45699,
+ 0.238702,-0.258568,0.936036,-1.120716,0.424016,1.45699,
+ -0.012448,0.906487,0.422051,-1.405685,0.573835,1.352181,
+ -0.051905,0.965082,0.256753,-1.479588,0.295746,1.440042,
+ 0.238702,-0.258568,0.936036,-1.120716,0.424016,1.45699,
+ -0.051905,0.965082,0.256753,-1.479588,0.295746,1.440042,
+ 0.11717,0.938619,0.324447,-1.077307,0.165008,1.553393,
+ 0.11717,0.938619,0.324447,-1.077307,0.165008,1.553393,
+ -0.051905,0.965082,0.256753,-1.479588,0.295746,1.440042,
+ -0.088843,0.888,0.45118,-1.489699,-0.024215,1.510987,
+ 0.11717,0.938619,0.324447,-1.077307,0.165008,1.553393,
+ -0.088843,0.888,0.45118,-1.489699,-0.024215,1.510987,
+ 0.080398,0.9582,0.274571,-1.053434,-0.342553,1.690245,
+ 0.080398,0.9582,0.274571,-1.053434,-0.342553,1.690245,
+ -0.088843,0.888,0.45118,-1.489699,-0.024215,1.510987,
+ -0.169971,0.704712,0.688832,-1.395501,-0.698702,1.553257,
+ 0.080398,0.9582,0.274571,-1.053434,-0.342553,1.690245,
+ -0.169971,0.704712,0.688832,-1.395501,-0.698702,1.553257,
+ 0.069061,0.958871,0.275312,-1.077209,-0.869649,1.633144,
+ 0.069061,0.958871,0.275312,-1.077209,-0.869649,1.633144,
+ -0.169971,0.704712,0.688832,-1.395501,-0.698702,1.553257,
+ -0.261543,0.44691,0.855492,-1.376176,-0.948757,1.451608,
+ 0.069061,0.958871,0.275312,-1.077209,-0.869649,1.633144,
+ -0.261543,0.44691,0.855492,-1.376176,-0.948757,1.451608,
+ 0.051291,0.888276,0.456438,-1.061272,-1.141877,1.49623,
+ 0.051291,0.888276,0.456438,-1.061272,-1.141877,1.49623,
+ -0.261543,0.44691,0.855492,-1.376176,-0.948757,1.451608,
+ -0.33898,0.203127,0.918603,-1.402349,-1.127845,1.309055,
+ 0.051291,0.888276,0.456438,-1.061272,-1.141877,1.49623,
+ -0.33898,0.203127,0.918603,-1.402349,-1.127845,1.309055,
+ -0.008282,0.691944,0.721904,-1.001366,-1.335897,1.353338,
+ -0.008282,0.691944,0.721904,-1.001366,-1.335897,1.353338,
+ -0.33898,0.203127,0.918603,-1.402349,-1.127845,1.309055,
+ -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
+ -0.008282,0.691944,0.721904,-1.001366,-1.335897,1.353338,
+ -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
+ -0.0448,0.42163,0.905661,-0.952525,-1.440582,1.16865,
+ 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
+ 0.009434,0.815301,0.578961,1.640095,-0.674556,1.246804,
+ 0.040473,0.760778,0.647749,1.644178,-0.857872,1.208494,
+ -0.057955,0.638634,0.767325,1.807583,1.756546,0.177627,
+ -0.720176,-0.693792,0,1.794465,1.787719,0,
+ 0.779025,-0.626993,0,1.456656,1.785879,0,
+ -0.057955,0.638634,0.767325,1.807583,1.756546,0.177627,
+ 0.779025,-0.626993,0,1.456656,1.785879,0,
+ 0.184661,-0.694307,0.695585,1.462507,1.745481,0.222394,
+ -0.024013,0.58573,0.810151,1.798719,1.714447,0.259352,
+ -0.057955,0.638634,0.767325,1.807583,1.756546,0.177627,
+ 0.184661,-0.694307,0.695585,1.462507,1.745481,0.222394,
+ -0.024013,0.58573,0.810151,1.798719,1.714447,0.259352,
+ 0.184661,-0.694307,0.695585,1.462507,1.745481,0.222394,
+ 0.152876,-0.742504,0.652163,1.483832,1.697594,0.288781,
+ 0.016737,0.497476,0.867316,1.821946,1.618209,0.403751,
+ -0.024013,0.58573,0.810151,1.798719,1.714447,0.259352,
+ 0.152876,-0.742504,0.652163,1.483832,1.697594,0.288781,
+ 0.016737,0.497476,0.867316,1.821946,1.618209,0.403751,
+ 0.152876,-0.742504,0.652163,1.483832,1.697594,0.288781,
+ 0.120054,-0.825719,0.551157,1.497138,1.618935,0.401108,
+ 0.060533,0.377837,0.923891,1.859443,1.450393,0.632222,
+ 0.016737,0.497476,0.867316,1.821946,1.618209,0.403751,
+ 0.120054,-0.825719,0.551157,1.497138,1.618935,0.401108,
+ 0.060533,0.377837,0.923891,1.859443,1.450393,0.632222,
+ 0.120054,-0.825719,0.551157,1.497138,1.618935,0.401108,
+ 0.102263,-0.969566,0.222452,1.504951,1.483493,0.585976,
+ 0.088722,0.251367,0.963817,1.958254,1.130271,0.861813,
+ 0.060533,0.377837,0.923891,1.859443,1.450393,0.632222,
+ 0.102263,-0.969566,0.222452,1.504951,1.483493,0.585976,
+ 0.088722,0.251367,0.963817,1.958254,1.130271,0.861813,
+ 0.102263,-0.969566,0.222452,1.504951,1.483493,0.585976,
+ -0.305786,-0.232288,0.923329,1.517126,1.334367,0.741076,
+ 0.107989,0.168108,0.979836,1.975941,0.827957,1.018423,
+ 0.088722,0.251367,0.963817,1.958254,1.130271,0.861813,
+ -0.305786,-0.232288,0.923329,1.517126,1.334367,0.741076,
+ 0.107989,0.168108,0.979836,1.975941,0.827957,1.018423,
+ -0.305786,-0.232288,0.923329,1.517126,1.334367,0.741076,
+ -0.148631,-0.373855,0.915501,1.570685,0.938327,0.989108,
+ 0.107989,0.168108,0.979836,1.975941,0.827957,1.018423,
+ -0.148631,-0.373855,0.915501,1.570685,0.938327,0.989108,
+ -0.185127,-0.491394,0.851035,1.582203,0.771083,1.06818,
+ 0.10833,0.05569,0.992554,2.023441,0.529338,1.144399,
+ 0.107989,0.168108,0.979836,1.975941,0.827957,1.018423,
+ -0.185127,-0.491394,0.851035,1.582203,0.771083,1.06818,
+ 0.10833,0.05569,0.992554,2.023441,0.529338,1.144399,
+ -0.185127,-0.491394,0.851035,1.582203,0.771083,1.06818,
+ -0.208715,-0.624734,0.752427,1.63008,0.420236,1.172369,
+ 0.114032,-0.218132,0.969234,2.0817,0.283249,1.259461,
+ 0.10833,0.05569,0.992554,2.023441,0.529338,1.144399,
+ -0.208715,-0.624734,0.752427,1.63008,0.420236,1.172369,
+ 0.114032,-0.218132,0.969234,2.0817,0.283249,1.259461,
+ -0.208715,-0.624734,0.752427,1.63008,0.420236,1.172369,
+ -0.251063,-0.683027,0.685888,1.649027,0.224458,1.211969,
+ 0.187438,-0.340915,0.921219,2.14179,-0.055306,1.295565,
+ 0.114032,-0.218132,0.969234,2.0817,0.283249,1.259461,
+ -0.251063,-0.683027,0.685888,1.649027,0.224458,1.211969,
+ 0.187438,-0.340915,0.921219,2.14179,-0.055306,1.295565,
+ -0.251063,-0.683027,0.685888,1.649027,0.224458,1.211969,
+ -0.252973,-0.819125,0.51482,1.660355,0.019397,1.246002,
+ 0.25339,-0.287519,0.923648,2.136269,-0.187666,1.278057,
+ 0.187438,-0.340915,0.921219,2.14179,-0.055306,1.295565,
+ -0.252973,-0.819125,0.51482,1.660355,0.019397,1.246002,
+ 0.25339,-0.287519,0.923648,2.136269,-0.187666,1.278057,
+ -0.252973,-0.819125,0.51482,1.660355,0.019397,1.246002,
+ -0.137161,-0.98063,0.139827,1.664159,-0.189659,1.266729,
+ 0.23972,-0.400363,0.884445,2.108912,-0.357128,1.259691,
+ 0.25339,-0.287519,0.923648,2.136269,-0.187666,1.278057,
+ -0.137161,-0.98063,0.139827,1.664159,-0.189659,1.266729,
+ 0.23972,-0.400363,0.884445,2.108912,-0.357128,1.259691,
+ -0.137161,-0.98063,0.139827,1.664159,-0.189659,1.266729,
+ 0.007127,0.896038,0.44392,1.678622,-0.410061,1.291177,
+ 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
+ 0.23972,-0.400363,0.884445,2.108912,-0.357128,1.259691,
+ 0.007127,0.896038,0.44392,1.678622,-0.410061,1.291177,
+ 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
+ 0.007127,0.896038,0.44392,1.678622,-0.410061,1.291177,
+ 0.009434,0.815301,0.578961,1.640095,-0.674556,1.246804,
+ 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
+ -0.819256,-0.566976,0.085772,2.058189,-0.931238,1.163518,
+ -0.898389,-0.217201,-0.381735,2.158585,-0.955809,1.113647,
+ 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
+ -0.898389,-0.217201,-0.381735,2.158585,-0.955809,1.113647,
+ -0.887036,-0.210048,-0.411154,2.222082,-0.957342,1.014137,
+ 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
+ -0.887036,-0.210048,-0.411154,2.222082,-0.957342,1.014137,
+ -0.069142,0.724976,0.685295,2.245624,-0.864372,0.995778,
+ 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
+ 0.040473,0.760778,0.647749,1.644178,-0.857872,1.208494,
+ -0.493424,-0.16561,-0.853877,1.635139,-0.965221,1.184968,
+ 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
+ -0.493424,-0.16561,-0.853877,1.635139,-0.965221,1.184968,
+ 0.193853,0.161608,0.967628,1.867657,-0.920633,1.206933,
+ 0.213167,-0.525559,0.823619,2.013534,-0.662303,1.191491,
+ 0.193853,0.161608,0.967628,1.867657,-0.920633,1.206933,
+ -0.819256,-0.566976,0.085772,2.058189,-0.931238,1.163518,
+ -0.034649,0.9994,0,1.920432,-1.567396,0,
+ -0.086361,-0.084973,0.992634,1.963153,-1.588839,0.612861,
+ 0.776291,-0.374867,0.5068,1.721211,-1.590185,0.601932,
+ -0.034649,0.9994,0,1.920432,-1.567396,0,
+ 0.776291,-0.374867,0.5068,1.721211,-1.590185,0.601932,
+ -0.560667,-0.828041,0,1.604939,-1.556997,0,
+ 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
+ 0.010538,0.399391,0.91672,1.328862,-1.352627,0.758733,
+ -0.263451,-0.648591,0.714089,1.19204,-1.330605,0.678707,
+ 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
+ -0.263451,-0.648591,0.714089,1.19204,-1.330605,0.678707,
+ -0.301558,-0.77828,0.550766,1.210555,-1.460061,0.576841,
+ 0.24139,0.178826,-0.953809,1.599889,-1.595526,0.623185,
+ 0.751148,0.43192,-0.49922,1.451825,-1.576856,0.702758,
+ -0.301558,-0.77828,0.550766,1.210555,-1.460061,0.576841,
+ 0.24139,0.178826,-0.953809,1.599889,-1.595526,0.623185,
+ -0.301558,-0.77828,0.550766,1.210555,-1.460061,0.576841,
+ -0.154129,-0.981148,0.116585,1.223415,-1.532658,0.434522,
+ -0.034649,0.9994,0,1.920432,-1.567396,0,
+ 0.140536,0.558684,0.817388,2.0482,-1.581983,0.555832,
+ -0.086361,-0.084973,0.992634,1.963153,-1.588839,0.612861,
+ 0.24139,0.178826,-0.953809,1.599889,-1.595526,0.623185,
+ -0.154129,-0.981148,0.116585,1.223415,-1.532658,0.434522,
+ 0.770209,-0.637792,0,1.289448,-1.546597,0,
+ 0.24139,0.178826,-0.953809,1.599889,-1.595526,0.623185,
+ 0.770209,-0.637792,0,1.289448,-1.546597,0,
+ -0.560667,-0.828041,0,1.604939,-1.556997,0,
+ 0.776291,-0.374867,0.5068,1.721211,-1.590185,0.601932,
+ 0.24139,0.178826,-0.953809,1.599889,-1.595526,0.623185,
+ -0.560667,-0.828041,0,1.604939,-1.556997,0,
+ 0.010538,0.399391,0.91672,1.328862,-1.352627,0.758733,
+ -0.228294,-0.186048,0.955651,1.348219,-1.282064,0.845204,
+ -0.267766,-0.862787,0.428835,1.219163,-1.218342,0.823029,
+ 0.010538,0.399391,0.91672,1.328862,-1.352627,0.758733,
+ -0.267766,-0.862787,0.428835,1.219163,-1.218342,0.823029,
+ -0.263451,-0.648591,0.714089,1.19204,-1.330605,0.678707,
+ -0.382074,-0.25681,-0.887732,1.337875,-0.945716,1.021299,
+ -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
+ -0.231653,-0.530839,0.815198,1.252961,-0.928825,1.001643,
+ 0.43768,-0.823149,-0.361748,1.310865,-1.136322,0.914838,
+ -0.382074,-0.25681,-0.887732,1.337875,-0.945716,1.021299,
+ -0.231653,-0.530839,0.815198,1.252961,-0.928825,1.001643,
+ 0.43768,-0.823149,-0.361748,1.310865,-1.136322,0.914838,
+ -0.231653,-0.530839,0.815198,1.252961,-0.928825,1.001643,
+ -0.253979,-0.745808,0.615845,1.230116,-1.085439,0.894543,
+ -0.228294,-0.186048,0.955651,1.348219,-1.282064,0.845204,
+ 0.43768,-0.823149,-0.361748,1.310865,-1.136322,0.914838,
+ -0.253979,-0.745808,0.615845,1.230116,-1.085439,0.894543,
+ -0.228294,-0.186048,0.955651,1.348219,-1.282064,0.845204,
+ -0.253979,-0.745808,0.615845,1.230116,-1.085439,0.894543,
+ -0.267766,-0.862787,0.428835,1.219163,-1.218342,0.823029,
+ -0.570406,-0.192005,-0.798606,1.536037,-0.985876,1.185597,
+ -0.493424,-0.16561,-0.853877,1.635139,-0.965221,1.184968,
+ 0.040473,0.760778,0.647749,1.644178,-0.857872,1.208494,
+ -0.53197,-0.108751,-0.839751,1.428883,-0.98669,1.133905,
+ -0.570406,-0.192005,-0.798606,1.536037,-0.985876,1.185597,
+ 0.040473,0.760778,0.647749,1.644178,-0.857872,1.208494,
+ -0.53197,-0.108751,-0.839751,1.428883,-0.98669,1.133905,
+ 0.040473,0.760778,0.647749,1.644178,-0.857872,1.208494,
+ 0.009434,0.815301,0.578961,1.640095,-0.674556,1.246804,
+ 0.009434,0.815301,0.578961,1.640095,-0.674556,1.246804,
+ 0.007127,0.896038,0.44392,1.678622,-0.410061,1.291177,
+ -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
+ -0.53197,-0.108751,-0.839751,1.428883,-0.98669,1.133905,
+ 0.009434,0.815301,0.578961,1.640095,-0.674556,1.246804,
+ -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
+ 0.981421,-0.191868,0,0.733818,1.740873,0,
+ 0.184661,-0.694307,0.695585,1.462507,1.745481,0.222394,
+ 0.779025,-0.626993,0,1.456656,1.785879,0,
+ -0.165685,0.059692,0.98437,0.912989,-1.499314,0.419547,
+ 0.92802,-0.37253,0,0.927497,-1.558489,0,
+ 0.770209,-0.637792,0,1.289448,-1.546597,0,
+ -0.165685,0.059692,0.98437,0.912989,-1.499314,0.419547,
+ 0.770209,-0.637792,0,1.289448,-1.546597,0,
+ -0.154129,-0.981148,0.116585,1.223415,-1.532658,0.434522,
+ -0.123389,0.256577,0.958615,0.912699,-1.455066,0.576185,
+ -0.165685,0.059692,0.98437,0.912989,-1.499314,0.419547,
+ -0.154129,-0.981148,0.116585,1.223415,-1.532658,0.434522,
+ -0.123389,0.256577,0.958615,0.912699,-1.455066,0.576185,
+ -0.154129,-0.981148,0.116585,1.223415,-1.532658,0.434522,
+ -0.301558,-0.77828,0.550766,1.210555,-1.460061,0.576841,
+ -0.078623,0.370994,0.925301,0.922703,-1.296032,0.728307,
+ -0.123389,0.256577,0.958615,0.912699,-1.455066,0.576185,
+ -0.301558,-0.77828,0.550766,1.210555,-1.460061,0.576841,
+ -0.078623,0.370994,0.925301,0.922703,-1.296032,0.728307,
+ -0.301558,-0.77828,0.550766,1.210555,-1.460061,0.576841,
+ -0.263451,-0.648591,0.714089,1.19204,-1.330605,0.678707,
+ 0.070189,0.510248,0.857158,0.93066,-1.216516,0.831196,
+ -0.078623,0.370994,0.925301,0.922703,-1.296032,0.728307,
+ -0.263451,-0.648591,0.714089,1.19204,-1.330605,0.678707,
+ 0.070189,0.510248,0.857158,0.93066,-1.216516,0.831196,
+ -0.263451,-0.648591,0.714089,1.19204,-1.330605,0.678707,
+ -0.267766,-0.862787,0.428835,1.219163,-1.218342,0.823029,
+ 0.242426,0.58207,0.77616,0.956456,-1.070504,0.921063,
+ 0.070189,0.510248,0.857158,0.93066,-1.216516,0.831196,
+ -0.267766,-0.862787,0.428835,1.219163,-1.218342,0.823029,
+ 0.242426,0.58207,0.77616,0.956456,-1.070504,0.921063,
+ -0.267766,-0.862787,0.428835,1.219163,-1.218342,0.823029,
+ -0.253979,-0.745808,0.615845,1.230116,-1.085439,0.894543,
+ 0.325482,0.443544,0.835063,0.939974,-0.894739,1.019809,
+ 0.242426,0.58207,0.77616,0.956456,-1.070504,0.921063,
+ -0.253979,-0.745808,0.615845,1.230116,-1.085439,0.894543,
+ 0.325482,0.443544,0.835063,0.939974,-0.894739,1.019809,
+ -0.253979,-0.745808,0.615845,1.230116,-1.085439,0.894543,
+ -0.231653,-0.530839,0.815198,1.252961,-0.928825,1.001643,
+ 0.305452,0.425365,0.851918,0.948819,-0.638568,1.102958,
+ 0.325482,0.443544,0.835063,0.939974,-0.894739,1.019809,
+ -0.231653,-0.530839,0.815198,1.252961,-0.928825,1.001643,
+ 0.305452,0.425365,0.851918,0.948819,-0.638568,1.102958,
+ -0.231653,-0.530839,0.815198,1.252961,-0.928825,1.001643,
+ -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
+ 0.235667,0.756618,0.60991,0.97453,-0.525273,1.140353,
+ 0.305452,0.425365,0.851918,0.948819,-0.638568,1.102958,
+ -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
+ 0.150328,0.92948,0.336851,0.960321,-0.308052,1.243133,
+ 0.235667,0.756618,0.60991,0.97453,-0.525273,1.140353,
+ -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
+ 0.150328,0.92948,0.336851,0.960321,-0.308052,1.243133,
+ -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
+ 0.007127,0.896038,0.44392,1.678622,-0.410061,1.291177,
+ 0.100598,0.942931,0.317428,0.943855,-0.101127,1.274771,
+ 0.150328,0.92948,0.336851,0.960321,-0.308052,1.243133,
+ 0.007127,0.896038,0.44392,1.678622,-0.410061,1.291177,
+ 0.100598,0.942931,0.317428,0.943855,-0.101127,1.274771,
+ 0.007127,0.896038,0.44392,1.678622,-0.410061,1.291177,
+ -0.137161,-0.98063,0.139827,1.664159,-0.189659,1.266729,
+ 0.076524,0.950336,0.301672,0.950215,0.042751,1.256188,
+ 0.100598,0.942931,0.317428,0.943855,-0.101127,1.274771,
+ -0.137161,-0.98063,0.139827,1.664159,-0.189659,1.266729,
+ 0.076524,0.950336,0.301672,0.950215,0.042751,1.256188,
+ -0.137161,-0.98063,0.139827,1.664159,-0.189659,1.266729,
+ -0.252973,-0.819125,0.51482,1.660355,0.019397,1.246002,
+ 0.013768,-0.992402,0.122267,0.927775,0.195225,1.233043,
+ 0.076524,0.950336,0.301672,0.950215,0.042751,1.256188,
+ -0.252973,-0.819125,0.51482,1.660355,0.019397,1.246002,
+ 0.013768,-0.992402,0.122267,0.927775,0.195225,1.233043,
+ -0.252973,-0.819125,0.51482,1.660355,0.019397,1.246002,
+ -0.251063,-0.683027,0.685888,1.649027,0.224458,1.211969,
+ 0.037423,-0.986705,0.158154,0.939271,0.379986,1.185872,
+ 0.013768,-0.992402,0.122267,0.927775,0.195225,1.233043,
+ -0.251063,-0.683027,0.685888,1.649027,0.224458,1.211969,
+ 0.037423,-0.986705,0.158154,0.939271,0.379986,1.185872,
+ -0.251063,-0.683027,0.685888,1.649027,0.224458,1.211969,
+ -0.208715,-0.624734,0.752427,1.63008,0.420236,1.172369,
+ 0.034172,-0.858604,0.511498,0.921312,0.755659,0.99933,
+ 0.037423,-0.986705,0.158154,0.939271,0.379986,1.185872,
+ -0.208715,-0.624734,0.752427,1.63008,0.420236,1.172369,
+ 0.034172,-0.858604,0.511498,0.921312,0.755659,0.99933,
+ -0.208715,-0.624734,0.752427,1.63008,0.420236,1.172369,
+ -0.185127,-0.491394,0.851035,1.582203,0.771083,1.06818,
+ 0.004725,-0.680391,0.732834,0.857323,0.985001,0.874029,
+ 0.034172,-0.858604,0.511498,0.921312,0.755659,0.99933,
+ -0.185127,-0.491394,0.851035,1.582203,0.771083,1.06818,
+ 0.004725,-0.680391,0.732834,0.857323,0.985001,0.874029,
+ -0.185127,-0.491394,0.851035,1.582203,0.771083,1.06818,
+ -0.148631,-0.373855,0.915501,1.570685,0.938327,0.989108,
+ 0.023352,-0.872807,0.487506,0.760722,1.205036,0.700545,
+ 0.004725,-0.680391,0.732834,0.857323,0.985001,0.874029,
+ -0.148631,-0.373855,0.915501,1.570685,0.938327,0.989108,
+ 0.068777,-0.757383,0.649339,0.725959,1.478055,0.461804,
+ 0.023352,-0.872807,0.487506,0.760722,1.205036,0.700545,
+ -0.148631,-0.373855,0.915501,1.570685,0.938327,0.989108,
+ 0.068777,-0.757383,0.649339,0.725959,1.478055,0.461804,
+ -0.148631,-0.373855,0.915501,1.570685,0.938327,0.989108,
+ -0.305786,-0.232288,0.923329,1.517126,1.334367,0.741076,
+ 0.100949,-0.548551,0.830001,0.737904,1.604213,0.281713,
+ 0.068777,-0.757383,0.649339,0.725959,1.478055,0.461804,
+ -0.305786,-0.232288,0.923329,1.517126,1.334367,0.741076,
+ 0.100949,-0.548551,0.830001,0.737904,1.604213,0.281713,
+ -0.305786,-0.232288,0.923329,1.517126,1.334367,0.741076,
+ 0.102263,-0.969566,0.222452,1.504951,1.483493,0.585976,
+ 0.100949,-0.548551,0.830001,0.737904,1.604213,0.281713,
+ 0.102263,-0.969566,0.222452,1.504951,1.483493,0.585976,
+ 0.120054,-0.825719,0.551157,1.497138,1.618935,0.401108,
+ 0.981421,-0.191868,0,0.733818,1.740873,0,
+ 0.100949,-0.548551,0.830001,0.737904,1.604213,0.281713,
+ 0.120054,-0.825719,0.551157,1.497138,1.618935,0.401108,
+ 0.981421,-0.191868,0,0.733818,1.740873,0,
+ 0.120054,-0.825719,0.551157,1.497138,1.618935,0.401108,
+ 0.152876,-0.742504,0.652163,1.483832,1.697594,0.288781,
+ 0.981421,-0.191868,0,0.733818,1.740873,0,
+ 0.152876,-0.742504,0.652163,1.483832,1.697594,0.288781,
+ 0.184661,-0.694307,0.695585,1.462507,1.745481,0.222394,
+ 0.566114,-0.824327,0,0.234527,1.730117,0,
+ -0.039092,-0.999236,0,-0.228904,1.734267,0,
+ 0.067879,0.951186,0.30106,-0.221516,1.686349,0.151403,
+ 0.566114,-0.824327,0,0.234527,1.730117,0,
+ 0.067879,0.951186,0.30106,-0.221516,1.686349,0.151403,
+ 0.095331,0.952335,0.289775,0.223642,1.684075,0.160743,
+ 0.095331,0.952335,0.289775,0.223642,1.684075,0.160743,
+ 0.067879,0.951186,0.30106,-0.221516,1.686349,0.151403,
+ 0.085022,0.963119,0.255291,-0.267035,1.627058,0.266577,
+ 0.095331,0.952335,0.289775,0.223642,1.684075,0.160743,
+ 0.085022,0.963119,0.255291,-0.267035,1.627058,0.266577,
+ 0.10291,0.954344,0.280422,0.23733,1.595746,0.288672,
+ 0.10291,0.954344,0.280422,0.23733,1.595746,0.288672,
+ 0.085022,0.963119,0.255291,-0.267035,1.627058,0.266577,
+ 0.120743,0.971588,0.203561,-0.247999,1.565146,0.389142,
+ 0.10291,0.954344,0.280422,0.23733,1.595746,0.288672,
+ 0.120743,0.971588,0.203561,-0.247999,1.565146,0.389142,
+ 0.172251,0.950689,0.257916,0.289039,1.496446,0.430055,
+ 0.172251,0.950689,0.257916,0.289039,1.496446,0.430055,
+ 0.120743,0.971588,0.203561,-0.247999,1.565146,0.389142,
+ 0.117963,0.926753,0.356669,-0.179548,1.471301,0.544513,
+ 0.172251,0.950689,0.257916,0.289039,1.496446,0.430055,
+ 0.117963,0.926753,0.356669,-0.179548,1.471301,0.544513,
+ 0.28101,0.853935,0.437982,0.305671,1.298417,0.629719,
+ 0.28101,0.853935,0.437982,0.305671,1.298417,0.629719,
+ 0.117963,0.926753,0.356669,-0.179548,1.471301,0.544513,
+ 0.109947,0.693426,0.71209,-0.192546,1.305535,0.70008,
+ 0.28101,0.853935,0.437982,0.305671,1.298417,0.629719,
+ 0.109947,0.693426,0.71209,-0.192546,1.305535,0.70008,
+ 0.381239,0.555717,0.738807,0.243473,1.134082,0.819993,
+ 0.381239,0.555717,0.738807,0.243473,1.134082,0.819993,
+ 0.109947,0.693426,0.71209,-0.192546,1.305535,0.70008,
+ 0.076565,0.333251,0.939724,-0.406155,1.005088,0.971088,
+ 0.381239,0.555717,0.738807,0.243473,1.134082,0.819993,
+ 0.076565,0.333251,0.939724,-0.406155,1.005088,0.971088,
+ 0.376012,0.360026,0.853813,0.316341,0.785311,1.08626,
+ 0.376012,0.360026,0.853813,0.316341,0.785311,1.08626,
+ 0.076565,0.333251,0.939724,-0.406155,1.005088,0.971088,
+ -0.039599,0.171847,0.984327,-0.11519,0.458427,1.346197,
+ 0.376012,0.360026,0.853813,0.316341,0.785311,1.08626,
+ -0.039599,0.171847,0.984327,-0.11519,0.458427,1.346197,
+ 0.207079,0.373404,0.904261,0.539252,0.353984,1.254493,
+ 0.207079,0.373404,0.904261,0.539252,0.353984,1.254493,
+ -0.039599,0.171847,0.984327,-0.11519,0.458427,1.346197,
+ -0.164971,0.181757,0.969406,0.005537,0.163519,1.472265,
+ 0.207079,0.373404,0.904261,0.539252,0.353984,1.254493,
+ -0.164971,0.181757,0.969406,0.005537,0.163519,1.472265,
+ -0.045242,0.348413,0.936249,0.53915,0.148262,1.321014,
+ -0.045242,0.348413,0.936249,0.53915,0.148262,1.321014,
+ -0.164971,0.181757,0.969406,0.005537,0.163519,1.472265,
+ -0.216817,0.278777,0.935561,0.018086,0.002865,1.523199,
+ -0.045242,0.348413,0.936249,0.53915,0.148262,1.321014,
+ -0.216817,0.278777,0.935561,0.018086,0.002865,1.523199,
+ -0.212948,0.334057,0.918182,0.516872,-0.020713,1.356627,
+ -0.212948,0.334057,0.918182,0.516872,-0.020713,1.356627,
+ -0.216817,0.278777,0.935561,0.018086,0.002865,1.523199,
+ -0.219724,0.297861,0.928978,0.034087,-0.225059,1.542949,
+ -0.212948,0.334057,0.918182,0.516872,-0.020713,1.356627,
+ -0.219724,0.297861,0.928978,0.034087,-0.225059,1.542949,
+ -0.282152,0.285245,0.915983,0.542386,-0.188227,1.370375,
+ -0.282152,0.285245,0.915983,0.542386,-0.188227,1.370375,
+ -0.219724,0.297861,0.928978,0.034087,-0.225059,1.542949,
+ -0.227369,0.161984,0.960242,0.010486,-0.502317,1.576297,
+ -0.282152,0.285245,0.915983,0.542386,-0.188227,1.370375,
+ -0.227369,0.161984,0.960242,0.010486,-0.502317,1.576297,
+ -0.326048,0.118611,0.937883,0.546875,-0.39094,1.363244,
+ -0.326048,0.118611,0.937883,0.546875,-0.39094,1.363244,
+ -0.227369,0.161984,0.960242,0.010486,-0.502317,1.576297,
+ -0.30296,-0.137183,0.943078,0.021051,-0.831931,1.511548,
+ -0.326048,0.118611,0.937883,0.546875,-0.39094,1.363244,
+ -0.30296,-0.137183,0.943078,0.021051,-0.831931,1.511548,
+ -0.422758,-0.178302,0.888529,0.550658,-0.633015,1.331311,
+ -0.422758,-0.178302,0.888529,0.550658,-0.633015,1.331311,
+ -0.30296,-0.137183,0.943078,0.021051,-0.831931,1.511548,
+ -0.387895,-0.42081,0.820034,-0.04157,-1.143825,1.395176,
+ -0.422758,-0.178302,0.888529,0.550658,-0.633015,1.331311,
+ -0.387895,-0.42081,0.820034,-0.04157,-1.143825,1.395176,
+ -0.504483,-0.438591,0.743731,0.527724,-0.862854,1.253811,
+ -0.504483,-0.438591,0.743731,0.527724,-0.862854,1.253811,
+ -0.387895,-0.42081,0.820034,-0.04157,-1.143825,1.395176,
+ -0.433119,-0.541142,0.720814,-0.071941,-1.346991,1.237379,
+ -0.504483,-0.438591,0.743731,0.527724,-0.862854,1.253811,
+ -0.433119,-0.541142,0.720814,-0.071941,-1.346991,1.237379,
+ -0.53858,-0.616298,0.57455,0.544825,-1.133123,1.096902,
+ -0.53858,-0.616298,0.57455,0.544825,-1.133123,1.096902,
+ -0.433119,-0.541142,0.720814,-0.071941,-1.346991,1.237379,
+ -0.455057,-0.684123,0.569999,-0.0723,-1.450245,1.087397,
+ -0.53858,-0.616298,0.57455,0.544825,-1.133123,1.096902,
+ -0.455057,-0.684123,0.569999,-0.0723,-1.450245,1.087397,
+ -0.507894,-0.767261,0.391606,0.530629,-1.316423,0.929842,
+ -0.507894,-0.767261,0.391606,0.530629,-1.316423,0.929842,
+ -0.455057,-0.684123,0.569999,-0.0723,-1.450245,1.087397,
+ -0.084259,-0.367691,0.926123,-0.063012,-1.583021,0.865082,
+ -0.507894,-0.767261,0.391606,0.530629,-1.316423,0.929842,
+ -0.084259,-0.367691,0.926123,-0.063012,-1.583021,0.865082,
+ -0.375453,-0.69207,0.616502,0.538756,-1.408602,0.764911,
+ -0.375453,-0.69207,0.616502,0.538756,-1.408602,0.764911,
+ -0.084259,-0.367691,0.926123,-0.063012,-1.583021,0.865082,
+ 0.061261,0.954316,0.292452,-0.07847,-1.688266,0.80023,
+ -0.375453,-0.69207,0.616502,0.538756,-1.408602,0.764911,
+ 0.061261,0.954316,0.292452,-0.07847,-1.688266,0.80023,
+ -0.1427,-0.847733,0.510868,0.489819,-1.524947,0.672392,
+ 0.061261,0.954316,0.292452,-0.07847,-1.688266,0.80023,
+ 0.076968,0.969253,0.233719,-0.094135,-1.769086,0.556924,
+ -0.1427,-0.847733,0.510868,0.489819,-1.524947,0.672392,
+ -0.009814,-0.999952,0,-0.547248,1.742126,0,
+ -0.098179,0.995169,0,-0.866132,1.75467,0,
+ 0.136965,0.155729,0.978258,-0.894132,1.712652,0.151911,
+ -0.009814,-0.999952,0,-0.547248,1.742126,0,
+ 0.136965,0.155729,0.978258,-0.894132,1.712652,0.151911,
+ -0.021294,0.896295,0.442946,-0.559706,1.69418,0.186107,
+ -0.021294,0.896295,0.442946,-0.559706,1.69418,0.186107,
+ 0.136965,0.155729,0.978258,-0.894132,1.712652,0.151911,
+ 0.173447,0.205435,0.963178,-0.954897,1.677544,0.293034,
+ -0.021294,0.896295,0.442946,-0.559706,1.69418,0.186107,
+ 0.173447,0.205435,0.963178,-0.954897,1.677544,0.293034,
+ -0.072244,0.618144,0.782738,-0.557624,1.641278,0.271462,
+ -0.072244,0.618144,0.782738,-0.557624,1.641278,0.271462,
+ 0.173447,0.205435,0.963178,-0.954897,1.677544,0.293034,
+ 0.136801,0.29658,0.945159,-1.017767,1.607824,0.541965,
+ -0.072244,0.618144,0.782738,-0.557624,1.641278,0.271462,
+ 0.136801,0.29658,0.945159,-1.017767,1.607824,0.541965,
+ -0.038944,0.247819,0.968023,-0.626493,1.585426,0.443136,
+ -0.038944,0.247819,0.968023,-0.626493,1.585426,0.443136,
+ 0.136801,0.29658,0.945159,-1.017767,1.607824,0.541965,
+ 0.095019,0.330845,0.938889,-1.04607,1.509097,0.76106,
+ -0.038944,0.247819,0.968023,-0.626493,1.585426,0.443136,
+ 0.095019,0.330845,0.938889,-1.04607,1.509097,0.76106,
+ -0.00315,0.115338,0.993321,-0.597781,1.48962,0.641047,
+ -0.00315,0.115338,0.993321,-0.597781,1.48962,0.641047,
+ 0.095019,0.330845,0.938889,-1.04607,1.509097,0.76106,
+ 0.07657,0.16758,0.982881,-1.115594,1.39238,0.819623,
+ -0.00315,0.115338,0.993321,-0.597781,1.48962,0.641047,
+ 0.07657,0.16758,0.982881,-1.115594,1.39238,0.819623,
+ 0.016683,0.197618,0.980137,-0.674657,1.333008,0.761059,
+ 0.016683,0.197618,0.980137,-0.674657,1.333008,0.761059,
+ 0.07657,0.16758,0.982881,-1.115594,1.39238,0.819623,
+ 0.079214,-0.175111,0.981357,-1.278903,1.192051,0.946843,
+ 0.016683,0.197618,0.980137,-0.674657,1.333008,0.761059,
+ 0.079214,-0.175111,0.981357,-1.278903,1.192051,0.946843,
+ 0.032424,0.316591,0.948008,-0.910602,1.204118,0.83774,
+ 0.032424,0.316591,0.948008,-0.910602,1.204118,0.83774,
+ 0.079214,-0.175111,0.981357,-1.278903,1.192051,0.946843,
+ 0.204115,-0.405276,0.891116,-1.200768,0.978822,1.103391,
+ 0.032424,0.316591,0.948008,-0.910602,1.204118,0.83774,
+ 0.204115,-0.405276,0.891116,-1.200768,0.978822,1.103391,
+ 0.053195,0.343167,0.937767,-0.969076,0.901205,1.146223,
+ 0.053195,0.343167,0.937767,-0.969076,0.901205,1.146223,
+ 0.204115,-0.405276,0.891116,-1.200768,0.978822,1.103391,
+ 0.396045,-0.47666,0.784821,-1.147922,0.807955,1.254191,
+ 0.053195,0.343167,0.937767,-0.969076,0.901205,1.146223,
+ 0.396045,-0.47666,0.784821,-1.147922,0.807955,1.254191,
+ 0.057735,0.173734,0.983099,-0.752416,0.438132,1.467349,
+ 0.057735,0.173734,0.983099,-0.752416,0.438132,1.467349,
+ 0.396045,-0.47666,0.784821,-1.147922,0.807955,1.254191,
+ 0.238702,-0.258568,0.936036,-1.120716,0.424016,1.45699,
+ 0.057735,0.173734,0.983099,-0.752416,0.438132,1.467349,
+ 0.238702,-0.258568,0.936036,-1.120716,0.424016,1.45699,
+ 0.058723,-0.195869,0.97887,-0.645496,0.179261,1.584316,
+ 0.058723,-0.195869,0.97887,-0.645496,0.179261,1.584316,
+ 0.238702,-0.258568,0.936036,-1.120716,0.424016,1.45699,
+ 0.11717,0.938619,0.324447,-1.077307,0.165008,1.553393,
+ 0.058723,-0.195869,0.97887,-0.645496,0.179261,1.584316,
+ 0.11717,0.938619,0.324447,-1.077307,0.165008,1.553393,
+ 0.088769,-0.475351,0.875307,-0.536767,-0.144454,1.682232,
+ 0.088769,-0.475351,0.875307,-0.536767,-0.144454,1.682232,
+ 0.11717,0.938619,0.324447,-1.077307,0.165008,1.553393,
+ 0.080398,0.9582,0.274571,-1.053434,-0.342553,1.690245,
+ 0.088769,-0.475351,0.875307,-0.536767,-0.144454,1.682232,
+ 0.080398,0.9582,0.274571,-1.053434,-0.342553,1.690245,
+ 0.099302,-0.563694,0.819993,-0.533528,-0.58228,1.701405,
+ 0.099302,-0.563694,0.819993,-0.533528,-0.58228,1.701405,
+ 0.080398,0.9582,0.274571,-1.053434,-0.342553,1.690245,
+ 0.069061,0.958871,0.275312,-1.077209,-0.869649,1.633144,
+ 0.099302,-0.563694,0.819993,-0.533528,-0.58228,1.701405,
+ 0.069061,0.958871,0.275312,-1.077209,-0.869649,1.633144,
+ 0.093802,-0.705497,0.702478,-0.505045,-0.913827,1.645612,
+ 0.093802,-0.705497,0.702478,-0.505045,-0.913827,1.645612,
+ 0.069061,0.958871,0.275312,-1.077209,-0.869649,1.633144,
+ 0.051291,0.888276,0.456438,-1.061272,-1.141877,1.49623,
+ 0.093802,-0.705497,0.702478,-0.505045,-0.913827,1.645612,
+ 0.051291,0.888276,0.456438,-1.061272,-1.141877,1.49623,
+ 0.058028,-0.329667,0.942312,-0.487217,-1.193519,1.504026,
+ 0.058028,-0.329667,0.942312,-0.487217,-1.193519,1.504026,
+ 0.051291,0.888276,0.456438,-1.061272,-1.141877,1.49623,
+ -0.008282,0.691944,0.721904,-1.001366,-1.335897,1.353338,
+ 0.058028,-0.329667,0.942312,-0.487217,-1.193519,1.504026,
+ -0.008282,0.691944,0.721904,-1.001366,-1.335897,1.353338,
+ 0.096347,0.961203,0.258467,-0.524231,-1.399266,1.313019,
+ 0.096347,0.961203,0.258467,-0.524231,-1.399266,1.313019,
+ -0.008282,0.691944,0.721904,-1.001366,-1.335897,1.353338,
+ -0.0448,0.42163,0.905661,-0.952525,-1.440582,1.16865,
+ 0.096347,0.961203,0.258467,-0.524231,-1.399266,1.313019,
+ -0.0448,0.42163,0.905661,-0.952525,-1.440582,1.16865,
+ 0.098712,0.966371,0.23745,-0.526127,-1.495,1.167736,
+ 0.098712,0.966371,0.23745,-0.526127,-1.495,1.167736,
+ -0.0448,0.42163,0.905661,-0.952525,-1.440582,1.16865,
+ -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
+ 0.098712,0.966371,0.23745,-0.526127,-1.495,1.167736,
+ -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
+ 0.079848,0.962653,0.258695,-0.535144,-1.615983,0.920556,
+ 0.136523,0.621747,0.771228,2.881063,-0.493146,0.521968,
+ 0.478274,-0.500384,0.721713,2.736198,-0.346225,0.659345,
+ 0.245892,-0.489895,0.836385,2.688131,-0.517509,0.672975,
+ 0.048754,0.934073,0.353738,2.824356,-1.407256,0.355013,
+ 0.303729,-0.050718,0.951408,2.740886,-1.339225,0.463604,
+ 0.33122,-0.270106,0.904067,2.663024,-1.440487,0.478149,
+ -0.382074,-0.25681,-0.887732,1.337875,-0.945716,1.021299,
+ -0.53197,-0.108751,-0.839751,1.428883,-0.98669,1.133905,
+ -0.218261,-0.26262,0.93989,1.373216,-0.56462,1.106245,
+ -0.065586,-0.997847,0,-1.179474,1.786649,0,
+ 0.262234,-0.965004,0,-1.35095,1.807009,0,
+ -0.234266,0.044111,0.971171,-1.365948,1.769608,0.133901,
+ -0.065586,-0.997847,0,-1.179474,1.786649,0,
+ -0.234266,0.044111,0.971171,-1.365948,1.769608,0.133901,
+ -0.115746,0.20405,0.972094,-1.215563,1.757097,0.133494,
+ -0.115746,0.20405,0.972094,-1.215563,1.757097,0.133494,
+ -0.234266,0.044111,0.971171,-1.365948,1.769608,0.133901,
+ -0.108631,-0.122719,0.986478,-1.396332,1.723782,0.267642,
+ -0.115746,0.20405,0.972094,-1.215563,1.757097,0.133494,
+ -0.108631,-0.122719,0.986478,-1.396332,1.723782,0.267642,
+ -0.164191,0.153328,0.974439,-1.227613,1.709095,0.276029,
+ -0.164191,0.153328,0.974439,-1.227613,1.709095,0.276029,
+ -0.108631,-0.122719,0.986478,-1.396332,1.723782,0.267642,
+ -0.006683,-0.232823,0.972496,-1.417595,1.67618,0.529265,
+ -0.164191,0.153328,0.974439,-1.227613,1.709095,0.276029,
+ -0.006683,-0.232823,0.972496,-1.417595,1.67618,0.529265,
+ -0.15812,-0.033626,0.986847,-1.292756,1.656509,0.51403,
+ -0.15812,-0.033626,0.986847,-1.292756,1.656509,0.51403,
+ -0.006683,-0.232823,0.972496,-1.417595,1.67618,0.529265,
+ -0.004872,-0.216103,0.976358,-1.465432,1.655336,0.722125,
+ -0.15812,-0.033626,0.986847,-1.292756,1.656509,0.51403,
+ -0.004872,-0.216103,0.976358,-1.465432,1.655336,0.722125,
+ 0.005821,-0.234321,0.972142,-1.338488,1.613735,0.725441,
+ 0.005821,-0.234321,0.972142,-1.338488,1.613735,0.725441,
+ -0.004872,-0.216103,0.976358,-1.465432,1.655336,0.722125,
+ 0.193955,-0.251788,0.948148,-1.582187,1.567542,0.982349,
+ 0.005821,-0.234321,0.972142,-1.338488,1.613735,0.725441,
+ 0.193955,-0.251788,0.948148,-1.582187,1.567542,0.982349,
+ 0.243464,-0.335965,0.909864,-1.403848,1.533059,0.902827,
+ 0.243464,-0.335965,0.909864,-1.403848,1.533059,0.902827,
+ 0.193955,-0.251788,0.948148,-1.582187,1.567542,0.982349,
+ -0.337275,0.918092,0.208215,-1.721806,1.391264,1.113307,
+ 0.243464,-0.335965,0.909864,-1.403848,1.533059,0.902827,
+ -0.337275,0.918092,0.208215,-1.721806,1.391264,1.113307,
+ 0.49938,-0.45475,0.737443,-1.551526,1.400025,1.050193,
+ 0.49938,-0.45475,0.737443,-1.551526,1.400025,1.050193,
+ -0.337275,0.918092,0.208215,-1.721806,1.391264,1.113307,
+ -0.47652,0.732046,0.486866,-1.733703,1.083864,1.181489,
+ 0.49938,-0.45475,0.737443,-1.551526,1.400025,1.050193,
+ -0.47652,0.732046,0.486866,-1.733703,1.083864,1.181489,
+ 0.573426,-0.441087,0.69038,-1.552899,1.128654,1.15104,
+ 0.573426,-0.441087,0.69038,-1.552899,1.128654,1.15104,
+ -0.47652,0.732046,0.486866,-1.733703,1.083864,1.181489,
+ -0.505556,0.519614,0.688777,-1.807421,0.657142,1.209422,
+ 0.573426,-0.441087,0.69038,-1.552899,1.128654,1.15104,
+ -0.505556,0.519614,0.688777,-1.807421,0.657142,1.209422,
+ 0.1643,0.873906,0.457487,-1.454529,0.875045,1.238858,
+ 0.1643,0.873906,0.457487,-1.454529,0.875045,1.238858,
+ -0.505556,0.519614,0.688777,-1.807421,0.657142,1.209422,
+ -0.539732,0.31653,0.780063,-1.796156,0.452382,1.243643,
+ 0.1643,0.873906,0.457487,-1.454529,0.875045,1.238858,
+ -0.539732,0.31653,0.780063,-1.796156,0.452382,1.243643,
+ -0.012448,0.906487,0.422051,-1.405685,0.573835,1.352181,
+ -0.012448,0.906487,0.422051,-1.405685,0.573835,1.352181,
+ -0.539732,0.31653,0.780063,-1.796156,0.452382,1.243643,
+ -0.545639,0.142044,0.825894,-1.81092,0.287592,1.292257,
+ -0.012448,0.906487,0.422051,-1.405685,0.573835,1.352181,
+ -0.545639,0.142044,0.825894,-1.81092,0.287592,1.292257,
+ -0.051905,0.965082,0.256753,-1.479588,0.295746,1.440042,
+ -0.051905,0.965082,0.256753,-1.479588,0.295746,1.440042,
+ -0.545639,0.142044,0.825894,-1.81092,0.287592,1.292257,
+ -0.512472,0.102596,0.852553,-1.79513,0.033439,1.37116,
+ -0.051905,0.965082,0.256753,-1.479588,0.295746,1.440042,
+ -0.512472,0.102596,0.852553,-1.79513,0.033439,1.37116,
+ -0.088843,0.888,0.45118,-1.489699,-0.024215,1.510987,
+ -0.088843,0.888,0.45118,-1.489699,-0.024215,1.510987,
+ -0.512472,0.102596,0.852553,-1.79513,0.033439,1.37116,
+ -0.449233,0.123555,0.88483,-1.802864,-0.282523,1.401315,
+ -0.088843,0.888,0.45118,-1.489699,-0.024215,1.510987,
+ -0.449233,0.123555,0.88483,-1.802864,-0.282523,1.401315,
+ -0.169971,0.704712,0.688832,-1.395501,-0.698702,1.553257,
+ -0.169971,0.704712,0.688832,-1.395501,-0.698702,1.553257,
+ -0.449233,0.123555,0.88483,-1.802864,-0.282523,1.401315,
+ -0.404056,0.117264,0.907187,-1.837859,-0.540871,1.295851,
+ -0.169971,0.704712,0.688832,-1.395501,-0.698702,1.553257,
+ -0.404056,0.117264,0.907187,-1.837859,-0.540871,1.295851,
+ -0.261543,0.44691,0.855492,-1.376176,-0.948757,1.451608,
+ -0.261543,0.44691,0.855492,-1.376176,-0.948757,1.451608,
+ -0.404056,0.117264,0.907187,-1.837859,-0.540871,1.295851,
+ -0.387051,0.087836,0.917865,-1.782928,-0.770786,1.173619,
+ -0.261543,0.44691,0.855492,-1.376176,-0.948757,1.451608,
+ -0.387051,0.087836,0.917865,-1.782928,-0.770786,1.173619,
+ -0.33898,0.203127,0.918603,-1.402349,-1.127845,1.309055,
+ -0.33898,0.203127,0.918603,-1.402349,-1.127845,1.309055,
+ -0.387051,0.087836,0.917865,-1.782928,-0.770786,1.173619,
+ -0.390861,0.032481,0.919876,-1.757573,-0.945337,1.075832,
+ -0.33898,0.203127,0.918603,-1.402349,-1.127845,1.309055,
+ -0.390861,0.032481,0.919876,-1.757573,-0.945337,1.075832,
+ -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
+ 0.262234,-0.965004,0,-1.35095,1.807009,0,
+ 0.021487,0.999769,0,-1.67651,1.826886,0,
+ -0.373751,-0.169261,0.911954,-1.683863,1.789041,0.121501,
+ 0.262234,-0.965004,0,-1.35095,1.807009,0,
+ -0.373751,-0.169261,0.911954,-1.683863,1.789041,0.121501,
+ -0.234266,0.044111,0.971171,-1.365948,1.769608,0.133901,
+ -0.234266,0.044111,0.971171,-1.365948,1.769608,0.133901,
+ -0.373751,-0.169261,0.911954,-1.683863,1.789041,0.121501,
+ -0.426971,-0.09322,0.899447,-1.714432,1.747956,0.247594,
+ -0.234266,0.044111,0.971171,-1.365948,1.769608,0.133901,
+ -0.426971,-0.09322,0.899447,-1.714432,1.747956,0.247594,
+ -0.108631,-0.122719,0.986478,-1.396332,1.723782,0.267642,
+ -0.108631,-0.122719,0.986478,-1.396332,1.723782,0.267642,
+ -0.426971,-0.09322,0.899447,-1.714432,1.747956,0.247594,
+ -0.457657,0.090776,0.884483,-1.744732,1.734849,0.433807,
+ -0.108631,-0.122719,0.986478,-1.396332,1.723782,0.267642,
+ -0.457657,0.090776,0.884483,-1.744732,1.734849,0.433807,
+ -0.006683,-0.232823,0.972496,-1.417595,1.67618,0.529265,
+ -0.006683,-0.232823,0.972496,-1.417595,1.67618,0.529265,
+ -0.457657,0.090776,0.884483,-1.744732,1.734849,0.433807,
+ -0.575033,0.794917,0.193504,-1.929731,1.617188,0.80639,
+ -0.006683,-0.232823,0.972496,-1.417595,1.67618,0.529265,
+ -0.575033,0.794917,0.193504,-1.929731,1.617188,0.80639,
+ -0.004872,-0.216103,0.976358,-1.465432,1.655336,0.722125,
+ -0.004872,-0.216103,0.976358,-1.465432,1.655336,0.722125,
+ -0.575033,0.794917,0.193504,-1.929731,1.617188,0.80639,
+ -0.636638,0.552106,0.538397,-1.996117,1.387891,1.064104,
+ -0.004872,-0.216103,0.976358,-1.465432,1.655336,0.722125,
+ -0.636638,0.552106,0.538397,-1.996117,1.387891,1.064104,
+ 0.193955,-0.251788,0.948148,-1.582187,1.567542,0.982349,
+ 0.193955,-0.251788,0.948148,-1.582187,1.567542,0.982349,
+ -0.636638,0.552106,0.538397,-1.996117,1.387891,1.064104,
+ -0.643784,0.341688,0.684684,-1.980388,1.134038,1.143196,
+ 0.193955,-0.251788,0.948148,-1.582187,1.567542,0.982349,
+ -0.643784,0.341688,0.684684,-1.980388,1.134038,1.143196,
+ -0.337275,0.918092,0.208215,-1.721806,1.391264,1.113307,
+ -0.337275,0.918092,0.208215,-1.721806,1.391264,1.113307,
+ -0.643784,0.341688,0.684684,-1.980388,1.134038,1.143196,
+ -0.646492,0.202786,0.735477,-2.013663,0.810726,1.158827,
+ -0.337275,0.918092,0.208215,-1.721806,1.391264,1.113307,
+ -0.646492,0.202786,0.735477,-2.013663,0.810726,1.158827,
+ -0.47652,0.732046,0.486866,-1.733703,1.083864,1.181489,
+ -0.47652,0.732046,0.486866,-1.733703,1.083864,1.181489,
+ -0.646492,0.202786,0.735477,-2.013663,0.810726,1.158827,
+ -0.624566,0.121329,0.77149,-2.030191,0.547622,1.189762,
+ -0.47652,0.732046,0.486866,-1.733703,1.083864,1.181489,
+ -0.624566,0.121329,0.77149,-2.030191,0.547622,1.189762,
+ -0.505556,0.519614,0.688777,-1.807421,0.657142,1.209422,
+ -0.505556,0.519614,0.688777,-1.807421,0.657142,1.209422,
+ -0.624566,0.121329,0.77149,-2.030191,0.547622,1.189762,
+ -0.588582,0.130278,0.797872,-2.021159,0.411979,1.234679,
+ -0.505556,0.519614,0.688777,-1.807421,0.657142,1.209422,
+ -0.588582,0.130278,0.797872,-2.021159,0.411979,1.234679,
+ -0.539732,0.31653,0.780063,-1.796156,0.452382,1.243643,
+ -0.539732,0.31653,0.780063,-1.796156,0.452382,1.243643,
+ -0.588582,0.130278,0.797872,-2.021159,0.411979,1.234679,
+ -0.553145,0.120209,0.824367,-1.932916,0.232972,1.304589,
+ -0.539732,0.31653,0.780063,-1.796156,0.452382,1.243643,
+ -0.553145,0.120209,0.824367,-1.932916,0.232972,1.304589,
+ -0.545639,0.142044,0.825894,-1.81092,0.287592,1.292257,
+ -0.545639,0.142044,0.825894,-1.81092,0.287592,1.292257,
+ -0.553145,0.120209,0.824367,-1.932916,0.232972,1.304589,
+ -0.547788,0.055501,0.834774,-1.897394,0.037852,1.365798,
+ -0.545639,0.142044,0.825894,-1.81092,0.287592,1.292257,
+ -0.547788,0.055501,0.834774,-1.897394,0.037852,1.365798,
+ -0.512472,0.102596,0.852553,-1.79513,0.033439,1.37116,
+ -0.512472,0.102596,0.852553,-1.79513,0.033439,1.37116,
+ -0.547788,0.055501,0.834774,-1.897394,0.037852,1.365798,
+ -0.563128,0.005618,0.826351,-1.950547,-0.275573,1.377028,
+ -0.512472,0.102596,0.852553,-1.79513,0.033439,1.37116,
+ -0.563128,0.005618,0.826351,-1.950547,-0.275573,1.377028,
+ -0.449233,0.123555,0.88483,-1.802864,-0.282523,1.401315,
+ -0.449233,0.123555,0.88483,-1.802864,-0.282523,1.401315,
+ -0.563128,0.005618,0.826351,-1.950547,-0.275573,1.377028,
+ -0.596319,-0.021767,0.802452,-2.033655,-0.526012,1.277639,
+ -0.449233,0.123555,0.88483,-1.802864,-0.282523,1.401315,
+ -0.596319,-0.021767,0.802452,-2.033655,-0.526012,1.277639,
+ -0.404056,0.117264,0.907187,-1.837859,-0.540871,1.295851,
+ -0.404056,0.117264,0.907187,-1.837859,-0.540871,1.295851,
+ -0.596319,-0.021767,0.802452,-2.033655,-0.526012,1.277639,
+ -0.626255,-0.080061,0.775497,-2.050292,-0.755566,1.114167,
+ -0.404056,0.117264,0.907187,-1.837859,-0.540871,1.295851,
+ -0.626255,-0.080061,0.775497,-2.050292,-0.755566,1.114167,
+ -0.387051,0.087836,0.917865,-1.782928,-0.770786,1.173619,
+ -0.387051,0.087836,0.917865,-1.782928,-0.770786,1.173619,
+ -0.626255,-0.080061,0.775497,-2.050292,-0.755566,1.114167,
+ -0.6343,-0.110875,0.765095,-2.043593,-0.875823,1.028879,
+ -0.387051,0.087836,0.917865,-1.782928,-0.770786,1.173619,
+ -0.6343,-0.110875,0.765095,-2.043593,-0.875823,1.028879,
+ -0.390861,0.032481,0.919876,-1.757573,-0.945337,1.075832,
+ -0.390861,0.032481,0.919876,-1.757573,-0.945337,1.075832,
+ -0.6343,-0.110875,0.765095,-2.043593,-0.875823,1.028879,
+ -0.619245,-0.050391,0.783579,-2.033406,-0.91003,0.96422,
+ -0.390861,0.032481,0.919876,-1.757573,-0.945337,1.075832,
+ -0.619245,-0.050391,0.783579,-2.033406,-0.91003,0.96422,
+ -0.379807,-0.084066,0.921238,-1.782298,-1.020581,0.943381,
+ -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
+ -0.0448,0.42163,0.905661,-0.952525,-1.440582,1.16865,
+ -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
+ -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
+ -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
+ -0.742985,0.015712,0.669123,-1.198513,-1.456102,0.885435,
+ -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
+ -0.390861,0.032481,0.919876,-1.757573,-0.945337,1.075832,
+ -0.379807,-0.084066,0.921238,-1.782298,-1.020581,0.943381,
+ -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
+ -0.379807,-0.084066,0.921238,-1.782298,-1.020581,0.943381,
+ -0.982334,-0.04331,0.182057,-1.456655,-1.295527,0.89424,
+ -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
+ -0.982334,-0.04331,0.182057,-1.456655,-1.295527,0.89424,
+ -0.311485,0.082882,0.94663,-1.366873,-1.340211,0.907567,
+ -0.351241,0.07582,0.93321,-1.407658,-1.236026,1.11293,
+ -0.311485,0.082882,0.94663,-1.366873,-1.340211,0.907567,
+ -0.742985,0.015712,0.669123,-1.198513,-1.456102,0.885435,
+ 0.021487,0.999769,0,-1.67651,1.826886,0,
+ 0.181762,-0.983343,0,-2.057387,1.841308,0,
+ -0.549206,0.149158,0.822268,-2.079597,1.817785,0.138375,
+ 0.021487,0.999769,0,-1.67651,1.826886,0,
+ -0.549206,0.149158,0.822268,-2.079597,1.817785,0.138375,
+ -0.373751,-0.169261,0.911954,-1.683863,1.789041,0.121501,
+ -0.373751,-0.169261,0.911954,-1.683863,1.789041,0.121501,
+ -0.549206,0.149158,0.822268,-2.079597,1.817785,0.138375,
+ -0.881408,0.44424,0.16053,-2.10017,1.78998,0.229245,
+ -0.373751,-0.169261,0.911954,-1.683863,1.789041,0.121501,
+ -0.881408,0.44424,0.16053,-2.10017,1.78998,0.229245,
+ -0.426971,-0.09322,0.899447,-1.714432,1.747956,0.247594,
+ -0.426971,-0.09322,0.899447,-1.714432,1.747956,0.247594,
+ -0.881408,0.44424,0.16053,-2.10017,1.78998,0.229245,
+ -0.881352,0.261345,0.393596,-2.137524,1.753182,0.433142,
+ -0.426971,-0.09322,0.899447,-1.714432,1.747956,0.247594,
+ -0.881352,0.261345,0.393596,-2.137524,1.753182,0.433142,
+ -0.457657,0.090776,0.884483,-1.744732,1.734849,0.433807,
+ -0.457657,0.090776,0.884483,-1.744732,1.734849,0.433807,
+ -0.881352,0.261345,0.393596,-2.137524,1.753182,0.433142,
+ -0.880731,0.130088,0.4554,-2.172139,1.62301,0.805318,
+ -0.457657,0.090776,0.884483,-1.744732,1.734849,0.433807,
+ -0.880731,0.130088,0.4554,-2.172139,1.62301,0.805318,
+ -0.575033,0.794917,0.193504,-1.929731,1.617188,0.80639,
+ -0.575033,0.794917,0.193504,-1.929731,1.617188,0.80639,
+ -0.880731,0.130088,0.4554,-2.172139,1.62301,0.805318,
+ -0.874101,0.053175,0.482825,-2.205791,1.356023,1.081662,
+ -0.575033,0.794917,0.193504,-1.929731,1.617188,0.80639,
+ -0.874101,0.053175,0.482825,-2.205791,1.356023,1.081662,
+ -0.636638,0.552106,0.538397,-1.996117,1.387891,1.064104,
+ -0.636638,0.552106,0.538397,-1.996117,1.387891,1.064104,
+ -0.874101,0.053175,0.482825,-2.205791,1.356023,1.081662,
+ -0.875552,0.01506,0.482889,-2.296056,1.06281,1.171139,
+ -0.636638,0.552106,0.538397,-1.996117,1.387891,1.064104,
+ -0.875552,0.01506,0.482889,-2.296056,1.06281,1.171139,
+ -0.643784,0.341688,0.684684,-1.980388,1.134038,1.143196,
+ -0.643784,0.341688,0.684684,-1.980388,1.134038,1.143196,
+ -0.875552,0.01506,0.482889,-2.296056,1.06281,1.171139,
+ -0.86587,-0.001845,0.500266,-2.298249,0.768333,1.203884,
+ -0.643784,0.341688,0.684684,-1.980388,1.134038,1.143196,
+ -0.86587,-0.001845,0.500266,-2.298249,0.768333,1.203884,
+ -0.646492,0.202786,0.735477,-2.013663,0.810726,1.158827,
+ -0.646492,0.202786,0.735477,-2.013663,0.810726,1.158827,
+ -0.86587,-0.001845,0.500266,-2.298249,0.768333,1.203884,
+ -0.84112,-0.026303,0.540209,-2.256285,0.547326,1.238301,
+ -0.646492,0.202786,0.735477,-2.013663,0.810726,1.158827,
+ -0.84112,-0.026303,0.540209,-2.256285,0.547326,1.238301,
+ -0.624566,0.121329,0.77149,-2.030191,0.547622,1.189762,
+ -0.624566,0.121329,0.77149,-2.030191,0.547622,1.189762,
+ -0.84112,-0.026303,0.540209,-2.256285,0.547326,1.238301,
+ -0.813168,-0.06637,0.578232,-2.1584,0.381542,1.272962,
+ -0.624566,0.121329,0.77149,-2.030191,0.547622,1.189762,
+ -0.813168,-0.06637,0.578232,-2.1584,0.381542,1.272962,
+ -0.588582,0.130278,0.797872,-2.021159,0.411979,1.234679,
+ -0.588582,0.130278,0.797872,-2.021159,0.411979,1.234679,
+ -0.813168,-0.06637,0.578232,-2.1584,0.381542,1.272962,
+ -0.799953,-0.096213,0.592299,-2.070413,0.207766,1.335106,
+ -0.588582,0.130278,0.797872,-2.021159,0.411979,1.234679,
+ -0.799953,-0.096213,0.592299,-2.070413,0.207766,1.335106,
+ -0.553145,0.120209,0.824367,-1.932916,0.232972,1.304589,
+ -0.553145,0.120209,0.824367,-1.932916,0.232972,1.304589,
+ -0.799953,-0.096213,0.592299,-2.070413,0.207766,1.335106,
+ -0.811102,-0.12903,0.570495,-2.064786,0.018789,1.411866,
+ -0.553145,0.120209,0.824367,-1.932916,0.232972,1.304589,
+ -0.811102,-0.12903,0.570495,-2.064786,0.018789,1.411866,
+ -0.547788,0.055501,0.834774,-1.897394,0.037852,1.365798,
+ -0.547788,0.055501,0.834774,-1.897394,0.037852,1.365798,
+ -0.811102,-0.12903,0.570495,-2.064786,0.018789,1.411866,
+ -0.848349,-0.120539,0.515533,-2.187634,-0.375454,1.406902,
+ -0.547788,0.055501,0.834774,-1.897394,0.037852,1.365798,
+ -0.848349,-0.120539,0.515533,-2.187634,-0.375454,1.406902,
+ -0.563128,0.005618,0.826351,-1.950547,-0.275573,1.377028,
+ -0.563128,0.005618,0.826351,-1.950547,-0.275573,1.377028,
+ -0.848349,-0.120539,0.515533,-2.187634,-0.375454,1.406902,
+ -0.880002,-0.033987,0.473752,-2.276341,-0.689823,1.268026,
+ -0.563128,0.005618,0.826351,-1.950547,-0.275573,1.377028,
+ -0.880002,-0.033987,0.473752,-2.276341,-0.689823,1.268026,
+ -0.596319,-0.021767,0.802452,-2.033655,-0.526012,1.277639,
+ -0.596319,-0.021767,0.802452,-2.033655,-0.526012,1.277639,
+ -0.880002,-0.033987,0.473752,-2.276341,-0.689823,1.268026,
+ -0.870332,0.069095,0.487595,-2.292049,-0.933921,1.128136,
+ -0.596319,-0.021767,0.802452,-2.033655,-0.526012,1.277639,
+ -0.870332,0.069095,0.487595,-2.292049,-0.933921,1.128136,
+ -0.626255,-0.080061,0.775497,-2.050292,-0.755566,1.114167,
+ -0.626255,-0.080061,0.775497,-2.050292,-0.755566,1.114167,
+ -0.870332,0.069095,0.487595,-2.292049,-0.933921,1.128136,
+ 0.074896,0.047734,0.996048,-2.299356,-1.025449,1.044687,
+ -0.626255,-0.080061,0.775497,-2.050292,-0.755566,1.114167,
+ 0.074896,0.047734,0.996048,-2.299356,-1.025449,1.044687,
+ -0.6343,-0.110875,0.765095,-2.043593,-0.875823,1.028879,
+ -0.6343,-0.110875,0.765095,-2.043593,-0.875823,1.028879,
+ 0.074896,0.047734,0.996048,-2.299356,-1.025449,1.044687,
+ -0.822733,0.223687,0.522565,-2.306662,-1.116976,0.961238,
+ -0.6343,-0.110875,0.765095,-2.043593,-0.875823,1.028879,
+ -0.822733,0.223687,0.522565,-2.306662,-1.116976,0.961238,
+ -0.619245,-0.050391,0.783579,-2.033406,-0.91003,0.96422,
+ 0.181762,-0.983343,0,-2.057387,1.841308,0,
+ 0.03611,0.999348,0,-2.629466,1.918204,0,
+ -0.946902,-0.290276,-0.138264,-2.672899,1.90511,0.067168,
+ 0.181762,-0.983343,0,-2.057387,1.841308,0,
+ -0.946902,-0.290276,-0.138264,-2.672899,1.90511,0.067168,
+ -0.549206,0.149158,0.822268,-2.079597,1.817785,0.138375,
+ -0.549206,0.149158,0.822268,-2.079597,1.817785,0.138375,
+ -0.946902,-0.290276,-0.138264,-2.672899,1.90511,0.067168,
+ -0.982633,-0.14343,-0.11773,-2.697367,1.871291,0.218796,
+ -0.549206,0.149158,0.822268,-2.079597,1.817785,0.138375,
+ -0.982633,-0.14343,-0.11773,-2.697367,1.871291,0.218796,
+ -0.881408,0.44424,0.16053,-2.10017,1.78998,0.229245,
+ -0.881408,0.44424,0.16053,-2.10017,1.78998,0.229245,
+ -0.982633,-0.14343,-0.11773,-2.697367,1.871291,0.218796,
+ -0.995584,-0.070631,-0.061842,-2.703112,1.825435,0.395127,
+ -0.881408,0.44424,0.16053,-2.10017,1.78998,0.229245,
+ -0.995584,-0.070631,-0.061842,-2.703112,1.825435,0.395127,
+ -0.881352,0.261345,0.393596,-2.137524,1.753182,0.433142,
+ -0.881352,0.261345,0.393596,-2.137524,1.753182,0.433142,
+ -0.995584,-0.070631,-0.061842,-2.703112,1.825435,0.395127,
+ -0.997475,-0.070819,-0.005318,-2.715246,1.746763,0.604653,
+ -0.881352,0.261345,0.393596,-2.137524,1.753182,0.433142,
+ -0.997475,-0.070819,-0.005318,-2.715246,1.746763,0.604653,
+ -0.880731,0.130088,0.4554,-2.172139,1.62301,0.805318,
+ -0.880731,0.130088,0.4554,-2.172139,1.62301,0.805318,
+ -0.997475,-0.070819,-0.005318,-2.715246,1.746763,0.604653,
+ -0.980175,-0.184883,-0.071243,-2.71748,1.576797,0.875971,
+ -0.880731,0.130088,0.4554,-2.172139,1.62301,0.805318,
+ -0.980175,-0.184883,-0.071243,-2.71748,1.576797,0.875971,
+ -0.874101,0.053175,0.482825,-2.205791,1.356023,1.081662,
+ -0.874101,0.053175,0.482825,-2.205791,1.356023,1.081662,
+ -0.980175,-0.184883,-0.071243,-2.71748,1.576797,0.875971,
+ -0.976177,-0.17359,-0.130171,-2.68493,1.262021,1.11049,
+ -0.874101,0.053175,0.482825,-2.205791,1.356023,1.081662,
+ -0.976177,-0.17359,-0.130171,-2.68493,1.262021,1.11049,
+ -0.875552,0.01506,0.482889,-2.296056,1.06281,1.171139,
+ -0.875552,0.01506,0.482889,-2.296056,1.06281,1.171139,
+ -0.976177,-0.17359,-0.130171,-2.68493,1.262021,1.11049,
+ -0.984416,-0.175855,0.000915,-2.572286,0.835495,1.252192,
+ -0.875552,0.01506,0.482889,-2.296056,1.06281,1.171139,
+ -0.984416,-0.175855,0.000915,-2.572286,0.835495,1.252192,
+ -0.86587,-0.001845,0.500266,-2.298249,0.768333,1.203884,
+ -0.86587,-0.001845,0.500266,-2.298249,0.768333,1.203884,
+ -0.984416,-0.175855,0.000915,-2.572286,0.835495,1.252192,
+ -0.977902,-0.171035,0.12023,-2.536112,0.656633,1.269661,
+ -0.86587,-0.001845,0.500266,-2.298249,0.768333,1.203884,
+ -0.977902,-0.171035,0.12023,-2.536112,0.656633,1.269661,
+ -0.84112,-0.026303,0.540209,-2.256285,0.547326,1.238301,
+ -0.84112,-0.026303,0.540209,-2.256285,0.547326,1.238301,
+ -0.977902,-0.171035,0.12023,-2.536112,0.656633,1.269661,
+ -0.964119,-0.189683,0.18573,-2.520947,0.559036,1.273617,
+ -0.84112,-0.026303,0.540209,-2.256285,0.547326,1.238301,
+ -0.964119,-0.189683,0.18573,-2.520947,0.559036,1.273617,
+ -0.813168,-0.06637,0.578232,-2.1584,0.381542,1.272962,
+ -0.813168,-0.06637,0.578232,-2.1584,0.381542,1.272962,
+ -0.964119,-0.189683,0.18573,-2.520947,0.559036,1.273617,
+ -0.955381,-0.23808,0.174826,-2.47375,0.300945,1.316695,
+ -0.813168,-0.06637,0.578232,-2.1584,0.381542,1.272962,
+ -0.955381,-0.23808,0.174826,-2.47375,0.300945,1.316695,
+ -0.799953,-0.096213,0.592299,-2.070413,0.207766,1.335106,
+ -0.799953,-0.096213,0.592299,-2.070413,0.207766,1.335106,
+ -0.955381,-0.23808,0.174826,-2.47375,0.300945,1.316695,
+ -0.843742,-0.096325,0.528036,-2.433366,0.078222,1.371269,
+ -0.799953,-0.096213,0.592299,-2.070413,0.207766,1.335106,
+ -0.843742,-0.096325,0.528036,-2.433366,0.078222,1.371269,
+ -0.811102,-0.12903,0.570495,-2.064786,0.018789,1.411866,
+ -0.811102,-0.12903,0.570495,-2.064786,0.018789,1.411866,
+ -0.843742,-0.096325,0.528036,-2.433366,0.078222,1.371269,
+ 0.028952,-0.016247,0.999449,-2.41473,-0.108377,1.395384,
+ -0.811102,-0.12903,0.570495,-2.064786,0.018789,1.411866,
+ 0.028952,-0.016247,0.999449,-2.41473,-0.108377,1.395384,
+ -0.848349,-0.120539,0.515533,-2.187634,-0.375454,1.406902,
+ -0.848349,-0.120539,0.515533,-2.187634,-0.375454,1.406902,
+ 0.028952,-0.016247,0.999449,-2.41473,-0.108377,1.395384,
+ 0.093953,-0.049433,0.994349,-2.38292,-0.41745,1.375045,
+ -0.848349,-0.120539,0.515533,-2.187634,-0.375454,1.406902,
+ 0.093953,-0.049433,0.994349,-2.38292,-0.41745,1.375045,
+ -0.880002,-0.033987,0.473752,-2.276341,-0.689823,1.268026,
+ -0.880002,-0.033987,0.473752,-2.276341,-0.689823,1.268026,
+ 0.093953,-0.049433,0.994349,-2.38292,-0.41745,1.375045,
+ 0.335613,-0.388493,0.858159,-2.430508,-0.822313,1.254486,
+ -0.880002,-0.033987,0.473752,-2.276341,-0.689823,1.268026,
+ 0.335613,-0.388493,0.858159,-2.430508,-0.822313,1.254486,
+ -0.870332,0.069095,0.487595,-2.292049,-0.933921,1.128136,
+ -0.870332,0.069095,0.487595,-2.292049,-0.933921,1.128136,
+ 0.335613,-0.388493,0.858159,-2.430508,-0.822313,1.254486,
+ -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
+ -0.870332,0.069095,0.487595,-2.292049,-0.933921,1.128136,
+ -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
+ 0.074896,0.047734,0.996048,-2.299356,-1.025449,1.044687,
+ 0.03611,0.999348,0,-2.629466,1.918204,0,
+ 0.012502,-0.999922,0,-3.037562,2.001526,0,
+ 0.137764,-0.289893,0.947092,-3.053102,1.96881,0.051104,
+ 0.03611,0.999348,0,-2.629466,1.918204,0,
+ 0.137764,-0.289893,0.947092,-3.053102,1.96881,0.051104,
+ -0.946902,-0.290276,-0.138264,-2.672899,1.90511,0.067168,
+ -0.946902,-0.290276,-0.138264,-2.672899,1.90511,0.067168,
+ 0.137764,-0.289893,0.947092,-3.053102,1.96881,0.051104,
+ 0.137206,-0.207537,0.968557,-3.077669,1.871112,0.217368,
+ -0.946902,-0.290276,-0.138264,-2.672899,1.90511,0.067168,
+ 0.137206,-0.207537,0.968557,-3.077669,1.871112,0.217368,
+ -0.982633,-0.14343,-0.11773,-2.697367,1.871291,0.218796,
+ -0.982633,-0.14343,-0.11773,-2.697367,1.871291,0.218796,
+ 0.137206,-0.207537,0.968557,-3.077669,1.871112,0.217368,
+ 0.094371,-0.230057,0.968591,-3.07531,1.846,0.363149,
+ -0.982633,-0.14343,-0.11773,-2.697367,1.871291,0.218796,
+ 0.094371,-0.230057,0.968591,-3.07531,1.846,0.363149,
+ -0.995584,-0.070631,-0.061842,-2.703112,1.825435,0.395127,
+ -0.995584,-0.070631,-0.061842,-2.703112,1.825435,0.395127,
+ 0.094371,-0.230057,0.968591,-3.07531,1.846,0.363149,
+ -0.201818,-0.568242,0.797728,-3.109047,1.789477,0.565323,
+ -0.995584,-0.070631,-0.061842,-2.703112,1.825435,0.395127,
+ -0.201818,-0.568242,0.797728,-3.109047,1.789477,0.565323,
+ -0.997475,-0.070819,-0.005318,-2.715246,1.746763,0.604653,
+ -0.997475,-0.070819,-0.005318,-2.715246,1.746763,0.604653,
+ -0.201818,-0.568242,0.797728,-3.109047,1.789477,0.565323,
+ 0.357021,-0.590654,0.723646,-3.08565,1.65734,0.784479,
+ -0.997475,-0.070819,-0.005318,-2.715246,1.746763,0.604653,
+ 0.357021,-0.590654,0.723646,-3.08565,1.65734,0.784479,
+ -0.980175,-0.184883,-0.071243,-2.71748,1.576797,0.875971,
+ -0.980175,-0.184883,-0.071243,-2.71748,1.576797,0.875971,
+ 0.357021,-0.590654,0.723646,-3.08565,1.65734,0.784479,
+ 0.008663,-0.516082,0.856495,-3.028932,1.461517,0.941324,
+ -0.980175,-0.184883,-0.071243,-2.71748,1.576797,0.875971,
+ 0.008663,-0.516082,0.856495,-3.028932,1.461517,0.941324,
+ -0.976177,-0.17359,-0.130171,-2.68493,1.262021,1.11049,
+ -0.976177,-0.17359,-0.130171,-2.68493,1.262021,1.11049,
+ 0.008663,-0.516082,0.856495,-3.028932,1.461517,0.941324,
+ 0.106237,-0.558927,0.822383,-2.930312,1.10358,1.125876,
+ -0.976177,-0.17359,-0.130171,-2.68493,1.262021,1.11049,
+ 0.106237,-0.558927,0.822383,-2.930312,1.10358,1.125876,
+ -0.984416,-0.175855,0.000915,-2.572286,0.835495,1.252192,
+ -0.984416,-0.175855,0.000915,-2.572286,0.835495,1.252192,
+ 0.106237,-0.558927,0.822383,-2.930312,1.10358,1.125876,
+ 0.155794,-0.590112,0.792146,-2.825835,0.755899,1.209042,
+ -0.984416,-0.175855,0.000915,-2.572286,0.835495,1.252192,
+ 0.155794,-0.590112,0.792146,-2.825835,0.755899,1.209042,
+ -0.977902,-0.171035,0.12023,-2.536112,0.656633,1.269661,
+ -0.977902,-0.171035,0.12023,-2.536112,0.656633,1.269661,
+ 0.155794,-0.590112,0.792146,-2.825835,0.755899,1.209042,
+ 0.08565,-0.422547,0.902285,-2.79063,0.46881,1.224273,
+ -0.977902,-0.171035,0.12023,-2.536112,0.656633,1.269661,
+ 0.08565,-0.422547,0.902285,-2.79063,0.46881,1.224273,
+ -0.964119,-0.189683,0.18573,-2.520947,0.559036,1.273617,
+ -0.964119,-0.189683,0.18573,-2.520947,0.559036,1.273617,
+ 0.08565,-0.422547,0.902285,-2.79063,0.46881,1.224273,
+ 0.161064,-0.731195,0.662882,-2.787011,0.264495,1.237352,
+ -0.964119,-0.189683,0.18573,-2.520947,0.559036,1.273617,
+ 0.161064,-0.731195,0.662882,-2.787011,0.264495,1.237352,
+ -0.955381,-0.23808,0.174826,-2.47375,0.300945,1.316695,
+ -0.955381,-0.23808,0.174826,-2.47375,0.300945,1.316695,
+ 0.161064,-0.731195,0.662882,-2.787011,0.264495,1.237352,
+ 0.121987,-0.426327,0.896306,-2.687022,0.076781,1.290565,
+ -0.955381,-0.23808,0.174826,-2.47375,0.300945,1.316695,
+ 0.121987,-0.426327,0.896306,-2.687022,0.076781,1.290565,
+ -0.843742,-0.096325,0.528036,-2.433366,0.078222,1.371269,
+ -0.843742,-0.096325,0.528036,-2.433366,0.078222,1.371269,
+ 0.121987,-0.426327,0.896306,-2.687022,0.076781,1.290565,
+ 0.215155,-0.464575,0.858999,-2.649338,-0.241719,1.339644,
+ -0.843742,-0.096325,0.528036,-2.433366,0.078222,1.371269,
+ 0.215155,-0.464575,0.858999,-2.649338,-0.241719,1.339644,
+ 0.028952,-0.016247,0.999449,-2.41473,-0.108377,1.395384,
+ 0.028952,-0.016247,0.999449,-2.41473,-0.108377,1.395384,
+ 0.215155,-0.464575,0.858999,-2.649338,-0.241719,1.339644,
+ -0.11636,-0.749063,0.652201,-2.616467,-0.511373,1.344133,
+ 0.028952,-0.016247,0.999449,-2.41473,-0.108377,1.395384,
+ -0.11636,-0.749063,0.652201,-2.616467,-0.511373,1.344133,
+ 0.093953,-0.049433,0.994349,-2.38292,-0.41745,1.375045,
+ 0.093953,-0.049433,0.994349,-2.38292,-0.41745,1.375045,
+ -0.11636,-0.749063,0.652201,-2.616467,-0.511373,1.344133,
+ 0.162276,-0.745105,0.646905,-2.624856,-0.8882,1.261176,
+ 0.093953,-0.049433,0.994349,-2.38292,-0.41745,1.375045,
+ 0.162276,-0.745105,0.646905,-2.624856,-0.8882,1.261176,
+ 0.335613,-0.388493,0.858159,-2.430508,-0.822313,1.254486,
+ 0.335613,-0.388493,0.858159,-2.430508,-0.822313,1.254486,
+ 0.162276,-0.745105,0.646905,-2.624856,-0.8882,1.261176,
+ -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
+ 0.335613,-0.388493,0.858159,-2.430508,-0.822313,1.254486,
+ -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
+ -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
+ -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
+ -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
+ -0.149005,-0.65467,0.741084,-2.862576,-1.546894,1.117139,
+ -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
+ -0.149005,-0.65467,0.741084,-2.862576,-1.546894,1.117139,
+ 0.095733,-0.224552,0.969748,-2.765069,-1.561164,1.084313,
+ 0.072535,0.997366,0,-3.392806,1.769365,0,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ 0.048753,-0.975535,0.21437,-3.519716,1.685231,0.31713,
+ 0.072535,0.997366,0,-3.392806,1.769365,0,
+ 0.048753,-0.975535,0.21437,-3.519716,1.685231,0.31713,
+ -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
+ -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
+ 0.048753,-0.975535,0.21437,-3.519716,1.685231,0.31713,
+ -0.177142,-0.976279,0.124502,-3.527168,1.583508,0.512679,
+ -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
+ -0.177142,-0.976279,0.124502,-3.527168,1.583508,0.512679,
+ -0.150892,-0.83775,0.524792,-3.395381,1.726325,0.55477,
+ -0.150892,-0.83775,0.524792,-3.395381,1.726325,0.55477,
+ -0.177142,-0.976279,0.124502,-3.527168,1.583508,0.512679,
+ 0.430742,-0.887318,0.164705,-3.512997,1.44805,0.611386,
+ -0.150892,-0.83775,0.524792,-3.395381,1.726325,0.55477,
+ 0.430742,-0.887318,0.164705,-3.512997,1.44805,0.611386,
+ -0.4144,-0.844957,0.338113,-3.338742,1.598933,0.689636,
+ -0.4144,-0.844957,0.338113,-3.338742,1.598933,0.689636,
+ 0.430742,-0.887318,0.164705,-3.512997,1.44805,0.611386,
+ 0.35682,-0.781398,0.511954,-3.476235,1.287798,0.704766,
+ -0.4144,-0.844957,0.338113,-3.338742,1.598933,0.689636,
+ 0.35682,-0.781398,0.511954,-3.476235,1.287798,0.704766,
+ -0.176655,-0.950799,0.254508,-3.27808,1.432418,0.853958,
+ -0.176655,-0.950799,0.254508,-3.27808,1.432418,0.853958,
+ 0.35682,-0.781398,0.511954,-3.476235,1.287798,0.704766,
+ 0.493535,-0.729115,0.474147,-3.442151,1.105486,0.762934,
+ -0.176655,-0.950799,0.254508,-3.27808,1.432418,0.853958,
+ 0.493535,-0.729115,0.474147,-3.442151,1.105486,0.762934,
+ -0.079302,-0.84299,0.532051,-3.244771,1.19554,0.910945,
+ -0.079302,-0.84299,0.532051,-3.244771,1.19554,0.910945,
+ 0.493535,-0.729115,0.474147,-3.442151,1.105486,0.762934,
+ 0.04422,-0.704109,0.708714,-3.379131,0.767915,0.885996,
+ -0.079302,-0.84299,0.532051,-3.244771,1.19554,0.910945,
+ 0.04422,-0.704109,0.708714,-3.379131,0.767915,0.885996,
+ -0.094238,-0.851252,0.516225,-3.19641,0.797564,0.985913,
+ -0.094238,-0.851252,0.516225,-3.19641,0.797564,0.985913,
+ 0.04422,-0.704109,0.708714,-3.379131,0.767915,0.885996,
+ 0.083262,-0.787311,0.610908,-3.306875,0.379713,0.98762,
+ -0.094238,-0.851252,0.516225,-3.19641,0.797564,0.985913,
+ 0.083262,-0.787311,0.610908,-3.306875,0.379713,0.98762,
+ 0.152347,-0.821467,0.549529,-3.112555,0.457376,1.084816,
+ 0.152347,-0.821467,0.549529,-3.112555,0.457376,1.084816,
+ 0.083262,-0.787311,0.610908,-3.306875,0.379713,0.98762,
+ 0.170756,-0.748007,0.641349,-3.251181,0.175063,1.053445,
+ 0.152347,-0.821467,0.549529,-3.112555,0.457376,1.084816,
+ 0.170756,-0.748007,0.641349,-3.251181,0.175063,1.053445,
+ -0.279342,-0.940234,0.19475,-3.044646,0.224321,1.164934,
+ -0.279342,-0.940234,0.19475,-3.044646,0.224321,1.164934,
+ 0.170756,-0.748007,0.641349,-3.251181,0.175063,1.053445,
+ 0.64791,-0.754869,-0.101908,-3.160225,-0.018852,1.113626,
+ -0.279342,-0.940234,0.19475,-3.044646,0.224321,1.164934,
+ 0.64791,-0.754869,-0.101908,-3.160225,-0.018852,1.113626,
+ -0.198045,-0.959194,0.201804,-2.971546,0.032038,1.215971,
+ -0.198045,-0.959194,0.201804,-2.971546,0.032038,1.215971,
+ 0.64791,-0.754869,-0.101908,-3.160225,-0.018852,1.113626,
+ 0.381337,-0.795981,0.470103,-3.101125,-0.35476,1.162409,
+ -0.198045,-0.959194,0.201804,-2.971546,0.032038,1.215971,
+ 0.381337,-0.795981,0.470103,-3.101125,-0.35476,1.162409,
+ -0.171647,-0.971664,0.162499,-2.90708,-0.345582,1.281557,
+ -0.171647,-0.971664,0.162499,-2.90708,-0.345582,1.281557,
+ 0.381337,-0.795981,0.470103,-3.101125,-0.35476,1.162409,
+ 0.183908,-0.773381,0.606679,-3.096267,-0.6681,1.140081,
+ -0.171647,-0.971664,0.162499,-2.90708,-0.345582,1.281557,
+ 0.183908,-0.773381,0.606679,-3.096267,-0.6681,1.140081,
+ -0.403877,-0.879274,0.252509,-2.901159,-0.619504,1.284058,
+ -0.403877,-0.879274,0.252509,-2.901159,-0.619504,1.284058,
+ 0.183908,-0.773381,0.606679,-3.096267,-0.6681,1.140081,
+ 0.018755,-0.837462,0.546174,-3.122061,-0.998702,1.065015,
+ -0.403877,-0.879274,0.252509,-2.901159,-0.619504,1.284058,
+ 0.018755,-0.837462,0.546174,-3.122061,-0.998702,1.065015,
+ -0.040019,-0.929968,0.365457,-2.937658,-1.002749,1.219413,
+ -0.040019,-0.929968,0.365457,-2.937658,-1.002749,1.219413,
+ 0.018755,-0.837462,0.546174,-3.122061,-0.998702,1.065015,
+ -0.094688,-0.959937,0.263734,-3.15021,-1.259588,1.001021,
+ -0.040019,-0.929968,0.365457,-2.937658,-1.002749,1.219413,
+ -0.094688,-0.959937,0.263734,-3.15021,-1.259588,1.001021,
+ -0.299215,-0.929389,0.216115,-2.982676,-1.264649,1.133596,
+ -0.299215,-0.929389,0.216115,-2.982676,-1.264649,1.133596,
+ -0.094688,-0.959937,0.263734,-3.15021,-1.259588,1.001021,
+ 0.059023,-0.965365,0.25414,-3.188954,-1.408279,0.963611,
+ -0.299215,-0.929389,0.216115,-2.982676,-1.264649,1.133596,
+ 0.059023,-0.965365,0.25414,-3.188954,-1.408279,0.963611,
+ -0.18119,-0.970212,0.160805,-3.063133,-1.440555,1.090926,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ -0.626255,-0.080061,-0.775497,-3.690685,1.60208,0,
+ 0.49176,-0.810764,0.317543,-3.734989,1.589433,0.295202,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ 0.49176,-0.810764,0.317543,-3.734989,1.589433,0.295202,
+ 0.048753,-0.975535,0.21437,-3.519716,1.685231,0.31713,
+ 0.048753,-0.975535,0.21437,-3.519716,1.685231,0.31713,
+ 0.49176,-0.810764,0.317543,-3.734989,1.589433,0.295202,
+ 0.43907,-0.579988,0.686172,-3.697974,1.466697,0.433432,
+ 0.048753,-0.975535,0.21437,-3.519716,1.685231,0.31713,
+ 0.43907,-0.579988,0.686172,-3.697974,1.466697,0.433432,
+ -0.177142,-0.976279,0.124502,-3.527168,1.583508,0.512679,
+ -0.177142,-0.976279,0.124502,-3.527168,1.583508,0.512679,
+ 0.43907,-0.579988,0.686172,-3.697974,1.466697,0.433432,
+ 0.099157,-0.476834,0.873383,-3.684619,1.35069,0.501428,
+ -0.177142,-0.976279,0.124502,-3.527168,1.583508,0.512679,
+ 0.099157,-0.476834,0.873383,-3.684619,1.35069,0.501428,
+ 0.430742,-0.887318,0.164705,-3.512997,1.44805,0.611386,
+ 0.430742,-0.887318,0.164705,-3.512997,1.44805,0.611386,
+ 0.099157,-0.476834,0.873383,-3.684619,1.35069,0.501428,
+ -0.073547,-0.481419,0.8734,-3.655148,1.190938,0.573692,
+ 0.430742,-0.887318,0.164705,-3.512997,1.44805,0.611386,
+ -0.073547,-0.481419,0.8734,-3.655148,1.190938,0.573692,
+ 0.35682,-0.781398,0.511954,-3.476235,1.287798,0.704766,
+ 0.35682,-0.781398,0.511954,-3.476235,1.287798,0.704766,
+ -0.073547,-0.481419,0.8734,-3.655148,1.190938,0.573692,
+ -0.147229,-0.706225,0.69251,-3.639878,1.015186,0.615203,
+ 0.35682,-0.781398,0.511954,-3.476235,1.287798,0.704766,
+ -0.147229,-0.706225,0.69251,-3.639878,1.015186,0.615203,
+ 0.493535,-0.729115,0.474147,-3.442151,1.105486,0.762934,
+ 0.493535,-0.729115,0.474147,-3.442151,1.105486,0.762934,
+ -0.147229,-0.706225,0.69251,-3.639878,1.015186,0.615203,
+ 0.328487,-0.940917,-0.082286,-3.582867,0.734419,0.697787,
+ 0.493535,-0.729115,0.474147,-3.442151,1.105486,0.762934,
+ 0.328487,-0.940917,-0.082286,-3.582867,0.734419,0.697787,
+ 0.04422,-0.704109,0.708714,-3.379131,0.767915,0.885996,
+ 0.04422,-0.704109,0.708714,-3.379131,0.767915,0.885996,
+ 0.328487,-0.940917,-0.082286,-3.582867,0.734419,0.697787,
+ -0.319475,-0.944225,0.079844,-3.504525,0.405574,0.847066,
+ 0.04422,-0.704109,0.708714,-3.379131,0.767915,0.885996,
+ -0.319475,-0.944225,0.079844,-3.504525,0.405574,0.847066,
+ 0.083262,-0.787311,0.610908,-3.306875,0.379713,0.98762,
+ 0.083262,-0.787311,0.610908,-3.306875,0.379713,0.98762,
+ -0.319475,-0.944225,0.079844,-3.504525,0.405574,0.847066,
+ -0.393694,-0.919049,-0.018795,-3.424258,0.158638,0.918279,
+ 0.083262,-0.787311,0.610908,-3.306875,0.379713,0.98762,
+ -0.393694,-0.919049,-0.018795,-3.424258,0.158638,0.918279,
+ 0.170756,-0.748007,0.641349,-3.251181,0.175063,1.053445,
+ 0.170756,-0.748007,0.641349,-3.251181,0.175063,1.053445,
+ -0.393694,-0.919049,-0.018795,-3.424258,0.158638,0.918279,
+ -0.327707,-0.94199,-0.072547,-3.365413,-0.113447,0.9524,
+ 0.170756,-0.748007,0.641349,-3.251181,0.175063,1.053445,
+ -0.327707,-0.94199,-0.072547,-3.365413,-0.113447,0.9524,
+ 0.64791,-0.754869,-0.101908,-3.160225,-0.018852,1.113626,
+ 0.64791,-0.754869,-0.101908,-3.160225,-0.018852,1.113626,
+ -0.327707,-0.94199,-0.072547,-3.365413,-0.113447,0.9524,
+ -0.163041,-0.980692,-0.107986,-3.290393,-0.424259,0.984153,
+ 0.64791,-0.754869,-0.101908,-3.160225,-0.018852,1.113626,
+ -0.163041,-0.980692,-0.107986,-3.290393,-0.424259,0.984153,
+ 0.381337,-0.795981,0.470103,-3.101125,-0.35476,1.162409,
+ 0.381337,-0.795981,0.470103,-3.101125,-0.35476,1.162409,
+ -0.163041,-0.980692,-0.107986,-3.290393,-0.424259,0.984153,
+ 0.074429,-0.99521,-0.063385,-3.233333,-0.683782,1.015512,
+ 0.381337,-0.795981,0.470103,-3.101125,-0.35476,1.162409,
+ 0.074429,-0.99521,-0.063385,-3.233333,-0.683782,1.015512,
+ 0.183908,-0.773381,0.606679,-3.096267,-0.6681,1.140081,
+ 0.183908,-0.773381,0.606679,-3.096267,-0.6681,1.140081,
+ 0.074429,-0.99521,-0.063385,-3.233333,-0.683782,1.015512,
+ -0.012978,-0.998326,-0.056357,-3.238094,-0.979377,0.961631,
+ 0.183908,-0.773381,0.606679,-3.096267,-0.6681,1.140081,
+ -0.012978,-0.998326,-0.056357,-3.238094,-0.979377,0.961631,
+ 0.018755,-0.837462,0.546174,-3.122061,-0.998702,1.065015,
+ 0.018755,-0.837462,0.546174,-3.122061,-0.998702,1.065015,
+ -0.012978,-0.998326,-0.056357,-3.238094,-0.979377,0.961631,
+ 0.249604,-0.855993,-0.452741,-3.27751,-1.177346,0.9153,
+ 0.018755,-0.837462,0.546174,-3.122061,-0.998702,1.065015,
+ 0.249604,-0.855993,-0.452741,-3.27751,-1.177346,0.9153,
+ -0.094688,-0.959937,0.263734,-3.15021,-1.259588,1.001021,
+ -0.094688,-0.959937,0.263734,-3.15021,-1.259588,1.001021,
+ 0.249604,-0.855993,-0.452741,-3.27751,-1.177346,0.9153,
+ 0.515412,-0.714946,-0.472444,-3.319817,-1.365015,0.886015,
+ -0.094688,-0.959937,0.263734,-3.15021,-1.259588,1.001021,
+ 0.515412,-0.714946,-0.472444,-3.319817,-1.365015,0.886015,
+ 0.059023,-0.965365,0.25414,-3.188954,-1.408279,0.963611,
+ -0.626255,-0.080061,-0.775497,-3.690685,1.60208,0,
+ -0.848349,-0.120539,-0.515533,-3.709827,1.417763,0,
+ -0.454242,-0.890878,-0.000928,-3.709741,1.351194,0.211745,
+ -0.626255,-0.080061,-0.775497,-3.690685,1.60208,0,
+ -0.454242,-0.890878,-0.000928,-3.709741,1.351194,0.211745,
+ 0.49176,-0.810764,0.317543,-3.734989,1.589433,0.295202,
+ 0.49176,-0.810764,0.317543,-3.734989,1.589433,0.295202,
+ -0.454242,-0.890878,-0.000928,-3.709741,1.351194,0.211745,
+ -0.354058,-0.732075,-0.581987,-3.701634,1.27265,0.270469,
+ 0.49176,-0.810764,0.317543,-3.734989,1.589433,0.295202,
+ -0.354058,-0.732075,-0.581987,-3.701634,1.27265,0.270469,
+ 0.43907,-0.579988,0.686172,-3.697974,1.466697,0.433432,
+ 0.43907,-0.579988,0.686172,-3.697974,1.466697,0.433432,
+ -0.354058,-0.732075,-0.581987,-3.701634,1.27265,0.270469,
+ -0.587869,-0.808404,0.029894,-3.695872,1.156978,0.316829,
+ 0.43907,-0.579988,0.686172,-3.697974,1.466697,0.433432,
+ -0.587869,-0.808404,0.029894,-3.695872,1.156978,0.316829,
+ 0.099157,-0.476834,0.873383,-3.684619,1.35069,0.501428,
+ 0.099157,-0.476834,0.873383,-3.684619,1.35069,0.501428,
+ -0.587869,-0.808404,0.029894,-3.695872,1.156978,0.316829,
+ -0.581301,-0.608503,-0.540197,-3.672431,1.044224,0.364991,
+ 0.099157,-0.476834,0.873383,-3.684619,1.35069,0.501428,
+ -0.581301,-0.608503,-0.540197,-3.672431,1.044224,0.364991,
+ -0.073547,-0.481419,0.8734,-3.655148,1.190938,0.573692,
+ -0.073547,-0.481419,0.8734,-3.655148,1.190938,0.573692,
+ -0.581301,-0.608503,-0.540197,-3.672431,1.044224,0.364991,
+ -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
+ -0.073547,-0.481419,0.8734,-3.655148,1.190938,0.573692,
+ -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
+ -0.147229,-0.706225,0.69251,-3.639878,1.015186,0.615203,
+ -0.147229,-0.706225,0.69251,-3.639878,1.015186,0.615203,
+ -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
+ -0.98615,-0.150918,0.068783,-3.631292,0.701013,0.420276,
+ -0.147229,-0.706225,0.69251,-3.639878,1.015186,0.615203,
+ -0.98615,-0.150918,0.068783,-3.631292,0.701013,0.420276,
+ 0.328487,-0.940917,-0.082286,-3.582867,0.734419,0.697787,
+ 0.328487,-0.940917,-0.082286,-3.582867,0.734419,0.697787,
+ -0.98615,-0.150918,0.068783,-3.631292,0.701013,0.420276,
+ -0.84728,-0.52968,0.039439,-3.570384,0.385564,0.52448,
+ 0.328487,-0.940917,-0.082286,-3.582867,0.734419,0.697787,
+ -0.84728,-0.52968,0.039439,-3.570384,0.385564,0.52448,
+ -0.319475,-0.944225,0.079844,-3.504525,0.405574,0.847066,
+ -0.319475,-0.944225,0.079844,-3.504525,0.405574,0.847066,
+ -0.84728,-0.52968,0.039439,-3.570384,0.385564,0.52448,
+ -0.815087,-0.388054,0.430171,-3.520188,0.140164,0.618561,
+ -0.319475,-0.944225,0.079844,-3.504525,0.405574,0.847066,
+ -0.815087,-0.388054,0.430171,-3.520188,0.140164,0.618561,
+ -0.393694,-0.919049,-0.018795,-3.424258,0.158638,0.918279,
+ -0.393694,-0.919049,-0.018795,-3.424258,0.158638,0.918279,
+ -0.815087,-0.388054,0.430171,-3.520188,0.140164,0.618561,
+ -0.945906,-0.323169,0.028687,-3.458251,-0.12595,0.731712,
+ -0.393694,-0.919049,-0.018795,-3.424258,0.158638,0.918279,
+ -0.945906,-0.323169,0.028687,-3.458251,-0.12595,0.731712,
+ -0.327707,-0.94199,-0.072547,-3.365413,-0.113447,0.9524,
+ -0.327707,-0.94199,-0.072547,-3.365413,-0.113447,0.9524,
+ -0.945906,-0.323169,0.028687,-3.458251,-0.12595,0.731712,
+ -0.896964,-0.287307,0.336022,-3.406618,-0.343461,0.746456,
+ -0.327707,-0.94199,-0.072547,-3.365413,-0.113447,0.9524,
+ -0.896964,-0.287307,0.336022,-3.406618,-0.343461,0.746456,
+ -0.163041,-0.980692,-0.107986,-3.290393,-0.424259,0.984153,
+ -0.163041,-0.980692,-0.107986,-3.290393,-0.424259,0.984153,
+ -0.896964,-0.287307,0.336022,-3.406618,-0.343461,0.746456,
+ -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
+ -0.163041,-0.980692,-0.107986,-3.290393,-0.424259,0.984153,
+ -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
+ 0.074429,-0.99521,-0.063385,-3.233333,-0.683782,1.015512,
+ -0.040019,-0.929968,0.365457,-2.937658,-1.002749,1.219413,
+ -0.299215,-0.929389,0.216115,-2.982676,-1.264649,1.133596,
+ -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
+ -0.040019,-0.929968,0.365457,-2.937658,-1.002749,1.219413,
+ -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
+ 0.162276,-0.745105,0.646905,-2.624856,-0.8882,1.261176,
+ -0.403877,-0.879274,0.252509,-2.901159,-0.619504,1.284058,
+ -0.040019,-0.929968,0.365457,-2.937658,-1.002749,1.219413,
+ 0.162276,-0.745105,0.646905,-2.624856,-0.8882,1.261176,
+ -0.403877,-0.879274,0.252509,-2.901159,-0.619504,1.284058,
+ 0.162276,-0.745105,0.646905,-2.624856,-0.8882,1.261176,
+ -0.11636,-0.749063,0.652201,-2.616467,-0.511373,1.344133,
+ -0.171647,-0.971664,0.162499,-2.90708,-0.345582,1.281557,
+ -0.403877,-0.879274,0.252509,-2.901159,-0.619504,1.284058,
+ -0.11636,-0.749063,0.652201,-2.616467,-0.511373,1.344133,
+ -0.171647,-0.971664,0.162499,-2.90708,-0.345582,1.281557,
+ -0.11636,-0.749063,0.652201,-2.616467,-0.511373,1.344133,
+ 0.215155,-0.464575,0.858999,-2.649338,-0.241719,1.339644,
+ -0.198045,-0.959194,0.201804,-2.971546,0.032038,1.215971,
+ -0.171647,-0.971664,0.162499,-2.90708,-0.345582,1.281557,
+ 0.215155,-0.464575,0.858999,-2.649338,-0.241719,1.339644,
+ -0.198045,-0.959194,0.201804,-2.971546,0.032038,1.215971,
+ 0.215155,-0.464575,0.858999,-2.649338,-0.241719,1.339644,
+ 0.121987,-0.426327,0.896306,-2.687022,0.076781,1.290565,
+ -0.279342,-0.940234,0.19475,-3.044646,0.224321,1.164934,
+ -0.198045,-0.959194,0.201804,-2.971546,0.032038,1.215971,
+ 0.121987,-0.426327,0.896306,-2.687022,0.076781,1.290565,
+ -0.279342,-0.940234,0.19475,-3.044646,0.224321,1.164934,
+ 0.121987,-0.426327,0.896306,-2.687022,0.076781,1.290565,
+ 0.161064,-0.731195,0.662882,-2.787011,0.264495,1.237352,
+ 0.152347,-0.821467,0.549529,-3.112555,0.457376,1.084816,
+ -0.279342,-0.940234,0.19475,-3.044646,0.224321,1.164934,
+ 0.161064,-0.731195,0.662882,-2.787011,0.264495,1.237352,
+ 0.152347,-0.821467,0.549529,-3.112555,0.457376,1.084816,
+ 0.161064,-0.731195,0.662882,-2.787011,0.264495,1.237352,
+ 0.08565,-0.422547,0.902285,-2.79063,0.46881,1.224273,
+ -0.094238,-0.851252,0.516225,-3.19641,0.797564,0.985913,
+ 0.152347,-0.821467,0.549529,-3.112555,0.457376,1.084816,
+ 0.08565,-0.422547,0.902285,-2.79063,0.46881,1.224273,
+ -0.094238,-0.851252,0.516225,-3.19641,0.797564,0.985913,
+ 0.08565,-0.422547,0.902285,-2.79063,0.46881,1.224273,
+ 0.155794,-0.590112,0.792146,-2.825835,0.755899,1.209042,
+ -0.079302,-0.84299,0.532051,-3.244771,1.19554,0.910945,
+ -0.094238,-0.851252,0.516225,-3.19641,0.797564,0.985913,
+ 0.155794,-0.590112,0.792146,-2.825835,0.755899,1.209042,
+ -0.079302,-0.84299,0.532051,-3.244771,1.19554,0.910945,
+ 0.155794,-0.590112,0.792146,-2.825835,0.755899,1.209042,
+ 0.106237,-0.558927,0.822383,-2.930312,1.10358,1.125876,
+ -0.176655,-0.950799,0.254508,-3.27808,1.432418,0.853958,
+ -0.079302,-0.84299,0.532051,-3.244771,1.19554,0.910945,
+ 0.106237,-0.558927,0.822383,-2.930312,1.10358,1.125876,
+ -0.176655,-0.950799,0.254508,-3.27808,1.432418,0.853958,
+ 0.106237,-0.558927,0.822383,-2.930312,1.10358,1.125876,
+ 0.008663,-0.516082,0.856495,-3.028932,1.461517,0.941324,
+ -0.4144,-0.844957,0.338113,-3.338742,1.598933,0.689636,
+ -0.176655,-0.950799,0.254508,-3.27808,1.432418,0.853958,
+ 0.008663,-0.516082,0.856495,-3.028932,1.461517,0.941324,
+ -0.4144,-0.844957,0.338113,-3.338742,1.598933,0.689636,
+ 0.008663,-0.516082,0.856495,-3.028932,1.461517,0.941324,
+ 0.357021,-0.590654,0.723646,-3.08565,1.65734,0.784479,
+ -0.150892,-0.83775,0.524792,-3.395381,1.726325,0.55477,
+ -0.4144,-0.844957,0.338113,-3.338742,1.598933,0.689636,
+ 0.357021,-0.590654,0.723646,-3.08565,1.65734,0.784479,
+ -0.150892,-0.83775,0.524792,-3.395381,1.726325,0.55477,
+ 0.357021,-0.590654,0.723646,-3.08565,1.65734,0.784479,
+ -0.201818,-0.568242,0.797728,-3.109047,1.789477,0.565323,
+ -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
+ -0.150892,-0.83775,0.524792,-3.395381,1.726325,0.55477,
+ -0.201818,-0.568242,0.797728,-3.109047,1.789477,0.565323,
+ -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
+ -0.201818,-0.568242,0.797728,-3.109047,1.789477,0.565323,
+ 0.094371,-0.230057,0.968591,-3.07531,1.846,0.363149,
+ 0.009712,0.399549,0.91666,-2.687162,-1.539807,0.988048,
+ -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
+ 0.095733,-0.224552,0.969748,-2.765069,-1.561164,1.084313,
+ -0.951862,0.098243,0.290356,-2.462835,-1.3055,0.966395,
+ -0.822733,0.223687,0.522565,-2.306662,-1.116976,0.961238,
+ 0.074896,0.047734,0.996048,-2.299356,-1.025449,1.044687,
+ -0.951862,0.098243,0.290356,-2.462835,-1.3055,0.966395,
+ 0.074896,0.047734,0.996048,-2.299356,-1.025449,1.044687,
+ -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
+ 0.009712,0.399549,0.91666,-2.687162,-1.539807,0.988048,
+ -0.995081,-0.092251,-0.036114,-2.591357,-1.510845,0.88547,
+ -0.951862,0.098243,0.290356,-2.462835,-1.3055,0.966395,
+ 0.009712,0.399549,0.91666,-2.687162,-1.539807,0.988048,
+ -0.951862,0.098243,0.290356,-2.462835,-1.3055,0.966395,
+ -0.004413,-0.170526,0.985343,-2.566746,-1.211312,1.167101,
+ 0.247956,0.087485,-0.964813,1.772999,-2.230292,0.64494,
+ 0.81802,-0.47123,0.329827,1.747671,-2.067518,0.638841,
+ 0.761939,0.13671,-0.633055,1.945206,-2.015769,0.672724,
+ 0.247956,0.087485,-0.964813,1.772999,-2.230292,0.64494,
+ 0.761939,0.13671,-0.633055,1.945206,-2.015769,0.672724,
+ -0.121543,0.046,-0.99152,1.921881,-2.157616,0.692678,
+ 0.70745,-0.193334,0.679806,2.13239,1.755821,0.180271,
+ 0.756976,-0.653442,0,2.128139,1.788397,0,
+ -0.385788,0.922588,0,2.042206,1.777154,0,
+ 0.70745,-0.193334,0.679806,2.13239,1.755821,0.180271,
+ -0.385788,0.922588,0,2.042206,1.777154,0,
+ 0.411872,0.04507,0.910127,2.069379,1.727818,0.212746,
+ -0.149005,-0.65467,0.741084,-2.862576,-1.546894,1.117139,
+ -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
+ -0.461794,0.113692,0.879671,-2.955052,-1.49684,1.128812,
+ -0.18119,-0.970212,0.160805,-3.063133,-1.440555,1.090926,
+ 0.059023,-0.965365,0.25414,-3.188954,-1.408279,0.963611,
+ -0.46316,0.228643,0.856274,-3.357996,-1.811803,0.975625,
+ -0.18119,-0.970212,0.160805,-3.063133,-1.440555,1.090926,
+ -0.46316,0.228643,0.856274,-3.357996,-1.811803,0.975625,
+ -0.431118,-0.034268,0.901645,-3.23261,-1.834299,1.087832,
+ -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
+ -0.299215,-0.929389,0.216115,-2.982676,-1.264649,1.133596,
+ -0.18119,-0.970212,0.160805,-3.063133,-1.440555,1.090926,
+ -0.351476,-0.711504,0.608463,-2.725776,-1.214862,1.190384,
+ -0.18119,-0.970212,0.160805,-3.063133,-1.440555,1.090926,
+ -0.461794,0.113692,0.879671,-2.955052,-1.49684,1.128812,
+ 0.059023,-0.965365,0.25414,-3.188954,-1.408279,0.963611,
+ 0.515412,-0.714946,-0.472444,-3.319817,-1.365015,0.886015,
+ 0.737412,0.542596,0.402261,-3.36599,-1.48517,0.888076,
+ 0.059023,-0.965365,0.25414,-3.188954,-1.408279,0.963611,
+ 0.737412,0.542596,0.402261,-3.36599,-1.48517,0.888076,
+ -0.508357,0.250892,0.823787,-3.342096,-1.533989,0.921628,
+ 0.059023,-0.965365,0.25414,-3.188954,-1.408279,0.963611,
+ -0.508357,0.250892,0.823787,-3.342096,-1.533989,0.921628,
+ -0.46316,0.228643,0.856274,-3.357996,-1.811803,0.975625,
+ -0.037581,-0.042039,-0.998409,-2.964215,-1.978727,0.776572,
+ -0.732521,-0.474279,0.488336,-2.811581,-1.79821,0.712737,
+ 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
+ -0.037581,-0.042039,-0.998409,-2.964215,-1.978727,0.776572,
+ 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
+ -0.11646,-0.017993,-0.993032,-2.892438,-1.95081,0.87812,
+ 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
+ -0.13251,0.440061,0.888137,-2.837147,-1.791733,0.921563,
+ -0.11646,-0.017993,-0.993032,-2.892438,-1.95081,0.87812,
+ -0.674431,0.094186,-0.732306,-3.04661,-2.510881,0.900772,
+ 0.780958,0.624512,0.00945,-3.132772,-2.528669,0.848639,
+ -0.039603,0.339955,0.939607,-3.144012,-2.333635,0.829994,
+ -0.674431,0.094186,-0.732306,-3.04661,-2.510881,0.900772,
+ -0.039603,0.339955,0.939607,-3.144012,-2.333635,0.829994,
+ 0.339875,0.026681,-0.940092,-3.030605,-2.311222,0.88433,
+ 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
+ 0.567548,-0.015056,0.823203,-3.26181,-2.821069,1.088218,
+ 0.71789,-0.165877,0.676106,-3.32033,-2.827513,1.063914,
+ 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
+ 0.71789,-0.165877,0.676106,-3.32033,-2.827513,1.063914,
+ 0.788485,-0.288832,0.543017,-3.302419,-3.017921,1.128514,
+ 0.701058,-0.463233,0.542155,-2.986345,-2.93377,1.087679,
+ 0.705477,-0.524425,0.47674,-3.053267,-2.764905,1.043008,
+ -0.119083,0.074969,0.99005,-3.141072,-2.785287,1.032318,
+ 0.701058,-0.463233,0.542155,-2.986345,-2.93377,1.087679,
+ -0.119083,0.074969,0.99005,-3.141072,-2.785287,1.032318,
+ 0.021785,0.053611,0.998324,-3.107105,-2.947818,1.092235,
+ 0.23503,0.016105,0.971855,-2.946527,-2.939327,0.986343,
+ 0.441943,-0.143195,0.88554,-3.016419,-2.765091,0.966671,
+ 0.705477,-0.524425,0.47674,-3.053267,-2.764905,1.043008,
+ 0.23503,0.016105,0.971855,-2.946527,-2.939327,0.986343,
+ 0.705477,-0.524425,0.47674,-3.053267,-2.764905,1.043008,
+ 0.701058,-0.463233,0.542155,-2.986345,-2.93377,1.087679,
+ 0.586456,-0.375618,0.717621,-3.301857,-3.074776,1.114869,
+ 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
+ 0.788485,-0.288832,0.543017,-3.302419,-3.017921,1.128514,
+ 0.585043,-0.503499,0.635777,-3.316551,-3.168932,1.121229,
+ -0.140754,0.08766,0.986156,-3.227676,-3.14166,1.103969,
+ 0.586456,-0.375618,0.717621,-3.301857,-3.074776,1.114869,
+ 0.085126,0.114843,0.98973,-3.217306,-3.187686,1.075214,
+ -0.140754,0.08766,0.986156,-3.227676,-3.14166,1.103969,
+ 0.585043,-0.503499,0.635777,-3.316551,-3.168932,1.121229,
+ 0.07463,0.029476,0.996776,-2.90901,-3.084482,1.089147,
+ -0.161613,0.16539,0.972896,-2.884711,-3.063896,0.993766,
+ 0.23503,0.016105,0.971855,-2.946527,-2.939327,0.986343,
+ 0.07463,0.029476,0.996776,-2.90901,-3.084482,1.089147,
+ 0.23503,0.016105,0.971855,-2.946527,-2.939327,0.986343,
+ 0.701058,-0.463233,0.542155,-2.986345,-2.93377,1.087679,
+ -0.119083,0.074969,0.99005,-3.141072,-2.785287,1.032318,
+ -0.347185,0.293858,0.890567,-3.196508,-2.788166,1.045431,
+ -0.225282,0.274902,0.934707,-3.177108,-2.979305,1.139084,
+ -0.119083,0.074969,0.99005,-3.141072,-2.785287,1.032318,
+ -0.225282,0.274902,0.934707,-3.177108,-2.979305,1.139084,
+ 0.021785,0.053611,0.998324,-3.107105,-2.947818,1.092235,
+ -0.225282,0.274902,0.934707,-3.177108,-2.979305,1.139084,
+ -0.347185,0.293858,0.890567,-3.196508,-2.788166,1.045431,
+ 0.567548,-0.015056,0.823203,-3.26181,-2.821069,1.088218,
+ -0.225282,0.274902,0.934707,-3.177108,-2.979305,1.139084,
+ 0.567548,-0.015056,0.823203,-3.26181,-2.821069,1.088218,
+ 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
+ -0.921044,0.324519,0.215325,-3.330406,-3.18519,0.950058,
+ 0.585043,-0.503499,0.635777,-3.316551,-3.168932,1.121229,
+ 0.586456,-0.375618,0.717621,-3.301857,-3.074776,1.114869,
+ -0.921044,0.324519,0.215325,-3.330406,-3.18519,0.950058,
+ 0.586456,-0.375618,0.717621,-3.301857,-3.074776,1.114869,
+ -0.904362,0.426369,-0.018424,-3.333954,-3.058673,0.974748,
+ -0.588311,0.26373,0.764419,-3.223246,-3.225388,0.976573,
+ 0.085126,0.114843,0.98973,-3.217306,-3.187686,1.075214,
+ 0.585043,-0.503499,0.635777,-3.316551,-3.168932,1.121229,
+ -0.588311,0.26373,0.764419,-3.223246,-3.225388,0.976573,
+ 0.585043,-0.503499,0.635777,-3.316551,-3.168932,1.121229,
+ -0.921044,0.324519,0.215325,-3.330406,-3.18519,0.950058,
+ -0.64352,0.086605,-0.760514,-3.11957,-3.183977,0.870739,
+ -0.588311,0.26373,0.764419,-3.223246,-3.225388,0.976573,
+ -0.921044,0.324519,0.215325,-3.330406,-3.18519,0.950058,
+ -0.64352,0.086605,-0.760514,-3.11957,-3.183977,0.870739,
+ -0.921044,0.324519,0.215325,-3.330406,-3.18519,0.950058,
+ -0.190279,0.223108,-0.956042,-3.294389,-3.166225,0.842823,
+ -0.121989,0.019056,-0.992349,-3.256731,-3.032131,0.849693,
+ -0.190279,0.223108,-0.956042,-3.294389,-3.166225,0.842823,
+ -0.921044,0.324519,0.215325,-3.330406,-3.18519,0.950058,
+ -0.121989,0.019056,-0.992349,-3.256731,-3.032131,0.849693,
+ -0.921044,0.324519,0.215325,-3.330406,-3.18519,0.950058,
+ -0.904362,0.426369,-0.018424,-3.333954,-3.058673,0.974748,
+ -0.904362,0.426369,-0.018424,-3.333954,-3.058673,0.974748,
+ -0.149743,-0.291108,-0.944898,-3.339637,-2.846837,0.966368,
+ -0.146645,-0.575935,-0.804235,-3.300372,-2.795728,0.878984,
+ -0.904362,0.426369,-0.018424,-3.333954,-3.058673,0.974748,
+ -0.146645,-0.575935,-0.804235,-3.300372,-2.795728,0.878984,
+ -0.121989,0.019056,-0.992349,-3.256731,-3.032131,0.849693,
+ 0.021785,0.053611,0.998324,-3.107105,-2.947818,1.092235,
+ -0.541406,0.227835,0.809302,-3.03125,-3.09594,1.106355,
+ 0.07463,0.029476,0.996776,-2.90901,-3.084482,1.089147,
+ 0.021785,0.053611,0.998324,-3.107105,-2.947818,1.092235,
+ 0.07463,0.029476,0.996776,-2.90901,-3.084482,1.089147,
+ 0.701058,-0.463233,0.542155,-2.986345,-2.93377,1.087679,
+ 0.021785,0.053611,0.998324,-3.107105,-2.947818,1.092235,
+ -0.225282,0.274902,0.934707,-3.177108,-2.979305,1.139084,
+ -0.125911,-0.68432,-0.718229,-3.121673,-3.120319,1.136456,
+ 0.021785,0.053611,0.998324,-3.107105,-2.947818,1.092235,
+ -0.125911,-0.68432,-0.718229,-3.121673,-3.120319,1.136456,
+ -0.541406,0.227835,0.809302,-3.03125,-3.09594,1.106355,
+ 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
+ 0.535863,0.090315,-0.83946,-3.169546,-3.135273,1.128247,
+ -0.125911,-0.68432,-0.718229,-3.121673,-3.120319,1.136456,
+ 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
+ -0.125911,-0.68432,-0.718229,-3.121673,-3.120319,1.136456,
+ -0.225282,0.274902,0.934707,-3.177108,-2.979305,1.139084,
+ 0.085126,0.114843,0.98973,-3.217306,-3.187686,1.075214,
+ 0.535863,0.090315,-0.83946,-3.169546,-3.135273,1.128247,
+ -0.140754,0.08766,0.986156,-3.227676,-3.14166,1.103969,
+ -0.140754,0.08766,0.986156,-3.227676,-3.14166,1.103969,
+ 0.535863,0.090315,-0.83946,-3.169546,-3.135273,1.128247,
+ 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
+ -0.140754,0.08766,0.986156,-3.227676,-3.14166,1.103969,
+ 0.245984,0.029506,0.968825,-3.223286,-3.00178,1.126176,
+ 0.586456,-0.375618,0.717621,-3.301857,-3.074776,1.114869,
+ 0.788485,-0.288832,0.543017,-3.302419,-3.017921,1.128514,
+ -0.904362,0.426369,-0.018424,-3.333954,-3.058673,0.974748,
+ 0.586456,-0.375618,0.717621,-3.301857,-3.074776,1.114869,
+ -0.904362,0.426369,-0.018424,-3.333954,-3.058673,0.974748,
+ 0.788485,-0.288832,0.543017,-3.302419,-3.017921,1.128514,
+ 0.71789,-0.165877,0.676106,-3.32033,-2.827513,1.063914,
+ -0.904362,0.426369,-0.018424,-3.333954,-3.058673,0.974748,
+ 0.71789,-0.165877,0.676106,-3.32033,-2.827513,1.063914,
+ -0.149743,-0.291108,-0.944898,-3.339637,-2.846837,0.966368,
+ 0.236645,-0.06852,-0.969177,-2.928681,-3.072892,0.924772,
+ 0.091886,-0.230243,-0.968785,-3.008412,-2.89976,0.904635,
+ 0.23503,0.016105,0.971855,-2.946527,-2.939327,0.986343,
+ 0.236645,-0.06852,-0.969177,-2.928681,-3.072892,0.924772,
+ 0.23503,0.016105,0.971855,-2.946527,-2.939327,0.986343,
+ -0.161613,0.16539,0.972896,-2.884711,-3.063896,0.993766,
+ -0.888643,-0.077171,0.45206,-3.166971,-3.002766,0.812106,
+ -0.64352,0.086605,-0.760514,-3.11957,-3.183977,0.870739,
+ -0.190279,0.223108,-0.956042,-3.294389,-3.166225,0.842823,
+ -0.121989,0.019056,-0.992349,-3.256731,-3.032131,0.849693,
+ -0.888643,-0.077171,0.45206,-3.166971,-3.002766,0.812106,
+ -0.190279,0.223108,-0.956042,-3.294389,-3.166225,0.842823,
+ -0.888643,-0.077171,0.45206,-3.166971,-3.002766,0.812106,
+ -0.891992,-0.016937,0.451734,-3.06981,-2.928755,0.845236,
+ -0.860798,0.234294,0.451812,-3.011987,-3.092,0.860973,
+ -0.888643,-0.077171,0.45206,-3.166971,-3.002766,0.812106,
+ -0.860798,0.234294,0.451812,-3.011987,-3.092,0.860973,
+ -0.64352,0.086605,-0.760514,-3.11957,-3.183977,0.870739,
+ -0.891992,-0.016937,0.451734,-3.06981,-2.928755,0.845236,
+ 0.091886,-0.230243,-0.968785,-3.008412,-2.89976,0.904635,
+ 0.236645,-0.06852,-0.969177,-2.928681,-3.072892,0.924772,
+ -0.891992,-0.016937,0.451734,-3.06981,-2.928755,0.845236,
+ 0.236645,-0.06852,-0.969177,-2.928681,-3.072892,0.924772,
+ -0.860798,0.234294,0.451812,-3.011987,-3.092,0.860973,
+ -0.686439,0.576002,0.443872,-3.184812,-2.768053,0.850127,
+ -0.369855,0.817227,0.441981,-3.137383,-2.776449,0.844117,
+ -0.891992,-0.016937,0.451734,-3.06981,-2.928755,0.845236,
+ -0.686439,0.576002,0.443872,-3.184812,-2.768053,0.850127,
+ -0.891992,-0.016937,0.451734,-3.06981,-2.928755,0.845236,
+ -0.888643,-0.077171,0.45206,-3.166971,-3.002766,0.812106,
+ 0.011581,0.887039,0.461548,-3.040038,-2.780893,0.914614,
+ 0.091886,-0.230243,-0.968785,-3.008412,-2.89976,0.904635,
+ -0.891992,-0.016937,0.451734,-3.06981,-2.928755,0.845236,
+ 0.011581,0.887039,0.461548,-3.040038,-2.780893,0.914614,
+ -0.891992,-0.016937,0.451734,-3.06981,-2.928755,0.845236,
+ -0.369855,0.817227,0.441981,-3.137383,-2.776449,0.844117,
+ -0.146645,-0.575935,-0.804235,-3.300372,-2.795728,0.878984,
+ -0.686439,0.576002,0.443872,-3.184812,-2.768053,0.850127,
+ -0.888643,-0.077171,0.45206,-3.166971,-3.002766,0.812106,
+ -0.146645,-0.575935,-0.804235,-3.300372,-2.795728,0.878984,
+ -0.888643,-0.077171,0.45206,-3.166971,-3.002766,0.812106,
+ -0.121989,0.019056,-0.992349,-3.256731,-3.032131,0.849693,
+ 0.091886,-0.230243,-0.968785,-3.008412,-2.89976,0.904635,
+ 0.011581,0.887039,0.461548,-3.040038,-2.780893,0.914614,
+ 0.441943,-0.143195,0.88554,-3.016419,-2.765091,0.966671,
+ 0.091886,-0.230243,-0.968785,-3.008412,-2.89976,0.904635,
+ 0.441943,-0.143195,0.88554,-3.016419,-2.765091,0.966671,
+ 0.23503,0.016105,0.971855,-2.946527,-2.939327,0.986343,
+ 0.840313,0.535537,-0.084107,-3.078699,-2.553982,1.046834,
+ 0.851754,0.52393,-0.003494,-3.162498,-2.556375,1.058409,
+ -0.119083,0.074969,0.99005,-3.141072,-2.785287,1.032318,
+ 0.840313,0.535537,-0.084107,-3.078699,-2.553982,1.046834,
+ -0.119083,0.074969,0.99005,-3.141072,-2.785287,1.032318,
+ 0.705477,-0.524425,0.47674,-3.053267,-2.764905,1.043008,
+ -0.99734,0.010762,-0.072093,-3.347304,-2.573628,0.955211,
+ 0.308087,0.149605,-0.939522,-3.372066,-2.569159,0.904785,
+ -0.149743,-0.291108,-0.944898,-3.339637,-2.846837,0.966368,
+ -0.99734,0.010762,-0.072093,-3.347304,-2.573628,0.955211,
+ -0.149743,-0.291108,-0.944898,-3.339637,-2.846837,0.966368,
+ 0.71789,-0.165877,0.676106,-3.32033,-2.827513,1.063914,
+ 0.163153,0.19945,0.96623,-3.251541,-2.56405,1.023627,
+ -0.99734,0.010762,-0.072093,-3.347304,-2.573628,0.955211,
+ 0.71789,-0.165877,0.676106,-3.32033,-2.827513,1.063914,
+ 0.163153,0.19945,0.96623,-3.251541,-2.56405,1.023627,
+ 0.71789,-0.165877,0.676106,-3.32033,-2.827513,1.063914,
+ 0.567548,-0.015056,0.823203,-3.26181,-2.821069,1.088218,
+ 0.851754,0.52393,-0.003494,-3.162498,-2.556375,1.058409,
+ 0.163153,0.19945,0.96623,-3.251541,-2.56405,1.023627,
+ 0.567548,-0.015056,0.823203,-3.26181,-2.821069,1.088218,
+ 0.851754,0.52393,-0.003494,-3.162498,-2.556375,1.058409,
+ 0.567548,-0.015056,0.823203,-3.26181,-2.821069,1.088218,
+ -0.347185,0.293858,0.890567,-3.196508,-2.788166,1.045431,
+ 0.851754,0.52393,-0.003494,-3.162498,-2.556375,1.058409,
+ -0.347185,0.293858,0.890567,-3.196508,-2.788166,1.045431,
+ -0.119083,0.074969,0.99005,-3.141072,-2.785287,1.032318,
+ 0.705477,-0.524425,0.47674,-3.053267,-2.764905,1.043008,
+ 0.441943,-0.143195,0.88554,-3.016419,-2.765091,0.966671,
+ -0.178214,-0.110838,-0.977729,-3.022819,-2.52224,0.979148,
+ 0.705477,-0.524425,0.47674,-3.053267,-2.764905,1.043008,
+ -0.178214,-0.110838,-0.977729,-3.022819,-2.52224,0.979148,
+ 0.840313,0.535537,-0.084107,-3.078699,-2.553982,1.046834,
+ -0.146645,-0.575935,-0.804235,-3.300372,-2.795728,0.878984,
+ -0.149743,-0.291108,-0.944898,-3.339637,-2.846837,0.966368,
+ 0.308087,0.149605,-0.939522,-3.372066,-2.569159,0.904785,
+ -0.146645,-0.575935,-0.804235,-3.300372,-2.795728,0.878984,
+ 0.308087,0.149605,-0.939522,-3.372066,-2.569159,0.904785,
+ 0.722847,0.455753,-0.519404,-3.297886,-2.54902,0.861657,
+ -0.686439,0.576002,0.443872,-3.184812,-2.768053,0.850127,
+ -0.146645,-0.575935,-0.804235,-3.300372,-2.795728,0.878984,
+ 0.722847,0.455753,-0.519404,-3.297886,-2.54902,0.861657,
+ -0.686439,0.576002,0.443872,-3.184812,-2.768053,0.850127,
+ 0.722847,0.455753,-0.519404,-3.297886,-2.54902,0.861657,
+ 0.61389,0.702597,0.359856,-3.240554,-2.555467,0.856262,
+ -0.369855,0.817227,0.441981,-3.137383,-2.776449,0.844117,
+ -0.686439,0.576002,0.443872,-3.184812,-2.768053,0.850127,
+ 0.61389,0.702597,0.359856,-3.240554,-2.555467,0.856262,
+ -0.369855,0.817227,0.441981,-3.137383,-2.776449,0.844117,
+ 0.61389,0.702597,0.359856,-3.240554,-2.555467,0.856262,
+ 0.780958,0.624512,0.00945,-3.132772,-2.528669,0.848639,
+ 0.011581,0.887039,0.461548,-3.040038,-2.780893,0.914614,
+ -0.369855,0.817227,0.441981,-3.137383,-2.776449,0.844117,
+ 0.780958,0.624512,0.00945,-3.132772,-2.528669,0.848639,
+ 0.011581,0.887039,0.461548,-3.040038,-2.780893,0.914614,
+ 0.780958,0.624512,0.00945,-3.132772,-2.528669,0.848639,
+ -0.674431,0.094186,-0.732306,-3.04661,-2.510881,0.900772,
+ 0.441943,-0.143195,0.88554,-3.016419,-2.765091,0.966671,
+ 0.011581,0.887039,0.461548,-3.040038,-2.780893,0.914614,
+ -0.674431,0.094186,-0.732306,-3.04661,-2.510881,0.900772,
+ 0.441943,-0.143195,0.88554,-3.016419,-2.765091,0.966671,
+ -0.674431,0.094186,-0.732306,-3.04661,-2.510881,0.900772,
+ -0.178214,-0.110838,-0.977729,-3.022819,-2.52224,0.979148,
+ -0.521685,-0.261319,0.812131,-3.335942,-1.365685,0.72459,
+ 0.515412,-0.714946,-0.472444,-3.319817,-1.365015,0.886015,
+ 0.249604,-0.855993,-0.452741,-3.27751,-1.177346,0.9153,
+ -0.521685,-0.261319,0.812131,-3.335942,-1.365685,0.72459,
+ 0.249604,-0.855993,-0.452741,-3.27751,-1.177346,0.9153,
+ -0.872722,-0.174901,0.455813,-3.27979,-1.162072,0.784602,
+ -0.012978,-0.998326,-0.056357,-3.238094,-0.979377,0.961631,
+ 0.074429,-0.99521,-0.063385,-3.233333,-0.683782,1.015512,
+ -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
+ -0.012978,-0.998326,-0.056357,-3.238094,-0.979377,0.961631,
+ -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
+ -0.874358,-0.225285,0.429819,-3.25121,-0.948205,0.819868,
+ 0.249604,-0.855993,-0.452741,-3.27751,-1.177346,0.9153,
+ -0.012978,-0.998326,-0.056357,-3.238094,-0.979377,0.961631,
+ -0.874358,-0.225285,0.429819,-3.25121,-0.948205,0.819868,
+ 0.249604,-0.855993,-0.452741,-3.27751,-1.177346,0.9153,
+ -0.874358,-0.225285,0.429819,-3.25121,-0.948205,0.819868,
+ -0.872722,-0.174901,0.455813,-3.27979,-1.162072,0.784602,
+ -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
+ -0.896964,-0.287307,0.336022,-3.406618,-0.343461,0.746456,
+ -0.970971,-0.219011,0.096178,-3.415655,-0.308965,0.671045,
+ -0.98615,-0.150918,0.068783,-3.631292,0.701013,0.420276,
+ -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
+ -0.845931,-0.255219,-0.468256,-3.57817,0.837714,0.288502,
+ -0.98615,-0.150918,0.068783,-3.631292,0.701013,0.420276,
+ -0.845931,-0.255219,-0.468256,-3.57817,0.837714,0.288502,
+ -0.794709,-0.185222,-0.57804,-3.556552,0.704883,0.28063,
+ -0.84728,-0.52968,0.039439,-3.570384,0.385564,0.52448,
+ -0.98615,-0.150918,0.068783,-3.631292,0.701013,0.420276,
+ -0.794709,-0.185222,-0.57804,-3.556552,0.704883,0.28063,
+ -0.84728,-0.52968,0.039439,-3.570384,0.385564,0.52448,
+ -0.794709,-0.185222,-0.57804,-3.556552,0.704883,0.28063,
+ -0.17902,-0.308668,0.934171,-3.536654,0.442277,0.322,
+ -0.815087,-0.388054,0.430171,-3.520188,0.140164,0.618561,
+ -0.84728,-0.52968,0.039439,-3.570384,0.385564,0.52448,
+ -0.17902,-0.308668,0.934171,-3.536654,0.442277,0.322,
+ -0.815087,-0.388054,0.430171,-3.520188,0.140164,0.618561,
+ -0.17902,-0.308668,0.934171,-3.536654,0.442277,0.322,
+ -0.136917,-0.20176,0.969818,-3.51684,0.149002,0.430359,
+ -0.945906,-0.323169,0.028687,-3.458251,-0.12595,0.731712,
+ -0.815087,-0.388054,0.430171,-3.520188,0.140164,0.618561,
+ -0.136917,-0.20176,0.969818,-3.51684,0.149002,0.430359,
+ -0.945906,-0.323169,0.028687,-3.458251,-0.12595,0.731712,
+ -0.136917,-0.20176,0.969818,-3.51684,0.149002,0.430359,
+ -0.739347,0.031953,0.672566,-3.470778,-0.078218,0.546398,
+ -0.896964,-0.287307,0.336022,-3.406618,-0.343461,0.746456,
+ -0.945906,-0.323169,0.028687,-3.458251,-0.12595,0.731712,
+ -0.739347,0.031953,0.672566,-3.470778,-0.078218,0.546398,
+ -0.896964,-0.287307,0.336022,-3.406618,-0.343461,0.746456,
+ -0.739347,0.031953,0.672566,-3.470778,-0.078218,0.546398,
+ -0.970971,-0.219011,0.096178,-3.415655,-0.308965,0.671045,
+ -0.989171,0.146765,0,-3.599077,0.796217,0,
+ -0.845931,-0.255219,-0.468256,-3.57817,0.837714,0.288502,
+ -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
+ -0.989171,0.146765,0,-3.599077,0.796217,0,
+ -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
+ -0.996668,0.081567,0,-3.623861,0.911561,0,
+ -0.454242,-0.890878,-0.000928,-3.709741,1.351194,0.211745,
+ -0.848349,-0.120539,-0.515533,-3.709827,1.417763,0,
+ -0.844095,-0.536194,0,-3.601668,1.293049,0,
+ -0.354058,-0.732075,-0.581987,-3.701634,1.27265,0.270469,
+ -0.454242,-0.890878,-0.000928,-3.709741,1.351194,0.211745,
+ -0.844095,-0.536194,0,-3.601668,1.293049,0,
+ -0.587869,-0.808404,0.029894,-3.695872,1.156978,0.316829,
+ -0.354058,-0.732075,-0.581987,-3.701634,1.27265,0.270469,
+ -0.844095,-0.536194,0,-3.601668,1.293049,0,
+ -0.587869,-0.808404,0.029894,-3.695872,1.156978,0.316829,
+ -0.844095,-0.536194,0,-3.601668,1.293049,0,
+ -0.946116,-0.323827,0,-3.608593,1.163581,0,
+ -0.581301,-0.608503,-0.540197,-3.672431,1.044224,0.364991,
+ -0.587869,-0.808404,0.029894,-3.695872,1.156978,0.316829,
+ -0.946116,-0.323827,0,-3.608593,1.163581,0,
+ -0.581301,-0.608503,-0.540197,-3.672431,1.044224,0.364991,
+ -0.946116,-0.323827,0,-3.608593,1.163581,0,
+ -0.997181,-0.075036,0,-3.622326,1.005378,0,
+ -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
+ -0.581301,-0.608503,-0.540197,-3.672431,1.044224,0.364991,
+ -0.997181,-0.075036,0,-3.622326,1.005378,0,
+ -0.736087,-0.675143,0.048562,-3.664355,0.932851,0.370749,
+ -0.997181,-0.075036,0,-3.622326,1.005378,0,
+ -0.996668,0.081567,0,-3.623861,0.911561,0,
+ 0.166377,-0.157108,0.973466,-3.86074,-0.188349,-0.024962,
+ 0.238843,0.101951,0.965691,-3.84599,-0.18882,0.019164,
+ 0.604306,0.20436,0.770098,-3.81743,0.150343,0.048629,
+ 0.166377,-0.157108,0.973466,-3.86074,-0.188349,-0.024962,
+ 0.604306,0.20436,0.770098,-3.81743,0.150343,0.048629,
+ 0.054863,-0.132814,0.989621,-3.828633,0.149083,0,
+ 0.054863,-0.132814,0.989621,-3.828633,0.149083,0,
+ 0.604306,0.20436,0.770098,-3.81743,0.150343,0.048629,
+ 0.02054,-0.128179,0.991538,-3.84447,0.498176,0.053132,
+ 0.054863,-0.132814,0.989621,-3.828633,0.149083,0,
+ 0.02054,-0.128179,0.991538,-3.84447,0.498176,0.053132,
+ -0.996511,-0.083465,-0.000062,-3.856649,0.496801,0,
+ -0.996511,-0.083465,-0.000062,-3.856649,0.496801,0,
+ 0.02054,-0.128179,0.991538,-3.84447,0.498176,0.053132,
+ 0.193291,-0.0748,0.978286,-3.88734,1.003866,0.057635,
+ -0.996511,-0.083465,-0.000062,-3.856649,0.496801,0,
+ 0.193291,-0.0748,0.978286,-3.88734,1.003866,0.057635,
+ -0.999862,-0.016634,0,-3.900566,1.002504,0,
+ -0.999862,-0.016634,0,-3.900566,1.002504,0,
+ 0.193291,-0.0748,0.978286,-3.88734,1.003866,0.057635,
+ 0.133637,0.26732,0.954296,-3.86082,1.479723,0.062137,
+ -0.999862,-0.016634,0,-3.900566,1.002504,0,
+ 0.133637,0.26732,0.954296,-3.86082,1.479723,0.062137,
+ -0.964752,0.26316,0,-3.87514,1.480358,0,
+ -0.964752,0.26316,0,-3.87514,1.480358,0,
+ 0.133637,0.26732,0.954296,-3.86082,1.479723,0.062137,
+ 0.555353,0.507651,0.65869,-3.698925,1.787941,0.06664,
+ -0.964752,0.26316,0,-3.87514,1.480358,0,
+ 0.555353,0.507651,0.65869,-3.698925,1.787941,0.06664,
+ -0.766357,0.642415,0,-3.712832,1.794492,0,
+ -0.766357,0.642415,0,-3.712832,1.794492,0,
+ 0.555353,0.507651,0.65869,-3.698925,1.787941,0.06664,
+ 0.823156,0.134626,0.551624,-3.469715,1.961504,0.071141,
+ -0.766357,0.642415,0,-3.712832,1.794492,0,
+ 0.823156,0.134626,0.551624,-3.469715,1.961504,0.071141,
+ -0.410619,0.911807,0,-3.47843,1.975409,0,
+ -0.410619,0.911807,0,-3.47843,1.975409,0,
+ 0.823156,0.134626,0.551624,-3.469715,1.961504,0.071141,
+ 0.707626,-0.125604,0.695334,-3.238225,2.005405,0.075645,
+ -0.410619,0.911807,0,-3.47843,1.975409,0,
+ 0.707626,-0.125604,0.695334,-3.238225,2.005405,0.075645,
+ -0.433128,-0.901332,0,-3.242148,2.021387,0,
+ 0.238843,0.101951,0.965691,-3.84599,-0.18882,0.019164,
+ 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
+ 0.836108,-0.069219,0.54418,-3.786822,0.153783,0.084233,
+ 0.238843,0.101951,0.965691,-3.84599,-0.18882,0.019164,
+ 0.836108,-0.069219,0.54418,-3.786822,0.153783,0.084233,
+ 0.604306,0.20436,0.770098,-3.81743,0.150343,0.048629,
+ 0.604306,0.20436,0.770098,-3.81743,0.150343,0.048629,
+ 0.836108,-0.069219,0.54418,-3.786822,0.153783,0.084233,
+ 0.412833,-0.156454,0.897269,-3.811194,0.501935,0.092033,
+ 0.604306,0.20436,0.770098,-3.81743,0.150343,0.048629,
+ 0.412833,-0.156454,0.897269,-3.811194,0.501935,0.092033,
+ 0.02054,-0.128179,0.991538,-3.84447,0.498176,0.053132,
+ 0.02054,-0.128179,0.991538,-3.84447,0.498176,0.053132,
+ 0.412833,-0.156454,0.897269,-3.811194,0.501935,0.092033,
+ 0.108828,-0.182644,0.977137,-3.851206,1.007586,0.099831,
+ 0.02054,-0.128179,0.991538,-3.84447,0.498176,0.053132,
+ 0.108828,-0.182644,0.977137,-3.851206,1.007586,0.099831,
+ 0.193291,-0.0748,0.978286,-3.88734,1.003866,0.057635,
+ 0.193291,-0.0748,0.978286,-3.88734,1.003866,0.057635,
+ 0.108828,-0.182644,0.977137,-3.851206,1.007586,0.099831,
+ 0.746476,-0.187741,0.638379,-3.821694,1.477989,0.107631,
+ 0.193291,-0.0748,0.978286,-3.88734,1.003866,0.057635,
+ 0.746476,-0.187741,0.638379,-3.821694,1.477989,0.107631,
+ 0.133637,0.26732,0.954296,-3.86082,1.479723,0.062137,
+ 0.133637,0.26732,0.954296,-3.86082,1.479723,0.062137,
+ 0.746476,-0.187741,0.638379,-3.821694,1.477989,0.107631,
+ 0.883859,-0.211187,0.417364,-3.660928,1.770041,0.115431,
+ 0.133637,0.26732,0.954296,-3.86082,1.479723,0.062137,
+ 0.883859,-0.211187,0.417364,-3.660928,1.770041,0.115431,
+ 0.555353,0.507651,0.65869,-3.698925,1.787941,0.06664,
+ 0.555353,0.507651,0.65869,-3.698925,1.787941,0.06664,
+ 0.883859,-0.211187,0.417364,-3.660928,1.770041,0.115431,
+ 0.544736,0.449333,0.708069,-3.445903,1.923509,0.123229,
+ 0.555353,0.507651,0.65869,-3.698925,1.787941,0.06664,
+ 0.544736,0.449333,0.708069,-3.445903,1.923509,0.123229,
+ 0.823156,0.134626,0.551624,-3.469715,1.961504,0.071141,
+ 0.823156,0.134626,0.551624,-3.469715,1.961504,0.071141,
+ 0.544736,0.449333,0.708069,-3.445903,1.923509,0.123229,
+ 0.722,0.398916,0.565317,-3.227504,1.961738,0.131029,
+ 0.823156,0.134626,0.551624,-3.469715,1.961504,0.071141,
+ 0.722,0.398916,0.565317,-3.227504,1.961738,0.131029,
+ 0.707626,-0.125604,0.695334,-3.238225,2.005405,0.075645,
+ 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
+ 0.711192,0.127662,0.69131,-3.75063,-0.191863,0.063305,
+ 0.269343,0.329305,0.904993,-3.745007,0.158482,0.097274,
+ 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
+ 0.269343,0.329305,0.904993,-3.745007,0.158482,0.097274,
+ 0.836108,-0.069219,0.54418,-3.786822,0.153783,0.084233,
+ 0.836108,-0.069219,0.54418,-3.786822,0.153783,0.084233,
+ 0.269343,0.329305,0.904993,-3.745007,0.158482,0.097274,
+ 0.397989,0.4494,0.799778,-3.765736,0.50707,0.106281,
+ 0.836108,-0.069219,0.54418,-3.786822,0.153783,0.084233,
+ 0.397989,0.4494,0.799778,-3.765736,0.50707,0.106281,
+ 0.412833,-0.156454,0.897269,-3.811194,0.501935,0.092033,
+ 0.412833,-0.156454,0.897269,-3.811194,0.501935,0.092033,
+ 0.397989,0.4494,0.799778,-3.765736,0.50707,0.106281,
+ 0.264978,0.116702,0.957166,-3.80184,1.012668,0.115288,
+ 0.412833,-0.156454,0.897269,-3.811194,0.501935,0.092033,
+ 0.264978,0.116702,0.957166,-3.80184,1.012668,0.115288,
+ 0.108828,-0.182644,0.977137,-3.851206,1.007586,0.099831,
+ 0.108828,-0.182644,0.977137,-3.851206,1.007586,0.099831,
+ 0.264978,0.116702,0.957166,-3.80184,1.012668,0.115288,
+ 0.312982,-0.015529,0.949632,-3.768245,1.475619,0.124295,
+ 0.108828,-0.182644,0.977137,-3.851206,1.007586,0.099831,
+ 0.312982,-0.015529,0.949632,-3.768245,1.475619,0.124295,
+ 0.746476,-0.187741,0.638379,-3.821694,1.477989,0.107631,
+ 0.746476,-0.187741,0.638379,-3.821694,1.477989,0.107631,
+ 0.312982,-0.015529,0.949632,-3.768245,1.475619,0.124295,
+ 0.470021,0.18298,0.863481,-3.609021,1.745588,0.133304,
+ 0.746476,-0.187741,0.638379,-3.821694,1.477989,0.107631,
+ 0.470021,0.18298,0.863481,-3.609021,1.745588,0.133304,
+ 0.883859,-0.211187,0.417364,-3.660928,1.770041,0.115431,
+ 0.883859,-0.211187,0.417364,-3.660928,1.770041,0.115431,
+ 0.470021,0.18298,0.863481,-3.609021,1.745588,0.133304,
+ 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
+ 0.883859,-0.211187,0.417364,-3.660928,1.770041,0.115431,
+ 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
+ 0.544736,0.449333,0.708069,-3.445903,1.923509,0.123229,
+ 0.544736,0.449333,0.708069,-3.445903,1.923509,0.123229,
+ 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
+ 0.722,0.398916,0.565317,-3.227504,1.961738,0.131029,
+ 0.711192,0.127662,0.69131,-3.75063,-0.191863,0.063305,
+ 0.560378,0.257624,0.787151,-3.695565,-0.19362,0.051497,
+ 0.661824,0.260114,0.703086,-3.703185,0.163182,0.084262,
+ 0.711192,0.127662,0.69131,-3.75063,-0.191863,0.063305,
+ 0.661824,0.260114,0.703086,-3.703185,0.163182,0.084262,
+ 0.269343,0.329305,0.904993,-3.745007,0.158482,0.097274,
+ 0.269343,0.329305,0.904993,-3.745007,0.158482,0.097274,
+ 0.661824,0.260114,0.703086,-3.703185,0.163182,0.084262,
+ 0.675892,0.137563,0.724049,-3.720269,0.512205,0.092064,
+ 0.269343,0.329305,0.904993,-3.745007,0.158482,0.097274,
+ 0.675892,0.137563,0.724049,-3.720269,0.512205,0.092064,
+ 0.397989,0.4494,0.799778,-3.765736,0.50707,0.106281,
+ 0.397989,0.4494,0.799778,-3.765736,0.50707,0.106281,
+ 0.675892,0.137563,0.724049,-3.720269,0.512205,0.092064,
+ 0.708269,-0.122725,0.695193,-3.752468,1.017751,0.099865,
+ 0.397989,0.4494,0.799778,-3.765736,0.50707,0.106281,
+ 0.708269,-0.122725,0.695193,-3.752468,1.017751,0.099865,
+ 0.264978,0.116702,0.957166,-3.80184,1.012668,0.115288,
+ 0.264978,0.116702,0.957166,-3.80184,1.012668,0.115288,
+ 0.708269,-0.122725,0.695193,-3.752468,1.017751,0.099865,
+ 0.540204,-0.272055,0.796345,-3.714787,1.473248,0.107668,
+ 0.264978,0.116702,0.957166,-3.80184,1.012668,0.115288,
+ 0.540204,-0.272055,0.796345,-3.714787,1.473248,0.107668,
+ 0.312982,-0.015529,0.949632,-3.768245,1.475619,0.124295,
+ 0.312982,-0.015529,0.949632,-3.768245,1.475619,0.124295,
+ 0.540204,-0.272055,0.796345,-3.714787,1.473248,0.107668,
+ 0.723289,-0.195474,0.662302,-3.557104,1.72113,0.11547,
+ 0.312982,-0.015529,0.949632,-3.768245,1.475619,0.124295,
+ 0.723289,-0.195474,0.662302,-3.557104,1.72113,0.11547,
+ 0.470021,0.18298,0.863481,-3.609021,1.745588,0.133304,
+ 0.470021,0.18298,0.863481,-3.609021,1.745588,0.133304,
+ 0.723289,-0.195474,0.662302,-3.557104,1.72113,0.11547,
+ 0.588787,-0.248294,0.769207,-3.380836,1.819691,0.123273,
+ 0.470021,0.18298,0.863481,-3.609021,1.745588,0.133304,
+ 0.588787,-0.248294,0.769207,-3.380836,1.819691,0.123273,
+ 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
+ 0.560378,0.257624,0.787151,-3.695565,-0.19362,0.051497,
+ 0.274422,-0.24433,0.930051,-3.65524,-0.194907,0.019209,
+ 0.017555,-0.142899,0.989582,-3.672559,0.166625,0.048678,
+ 0.560378,0.257624,0.787151,-3.695565,-0.19362,0.051497,
+ 0.017555,-0.142899,0.989582,-3.672559,0.166625,0.048678,
+ 0.661824,0.260114,0.703086,-3.703185,0.163182,0.084262,
+ 0.661824,0.260114,0.703086,-3.703185,0.163182,0.084262,
+ 0.017555,-0.142899,0.989582,-3.672559,0.166625,0.048678,
+ 0.961046,0.110911,0.253159,-3.686972,0.515966,0.053185,
+ 0.661824,0.260114,0.703086,-3.703185,0.163182,0.084262,
+ 0.961046,0.110911,0.253159,-3.686972,0.515966,0.053185,
+ 0.675892,0.137563,0.724049,-3.720269,0.512205,0.092064,
+ 0.675892,0.137563,0.724049,-3.720269,0.512205,0.092064,
+ 0.961046,0.110911,0.253159,-3.686972,0.515966,0.053185,
+ 0.910294,-0.144636,0.387873,-3.716312,1.021474,0.057693,
+ 0.675892,0.137563,0.724049,-3.720269,0.512205,0.092064,
+ 0.910294,-0.144636,0.387873,-3.716312,1.021474,0.057693,
+ 0.708269,-0.122725,0.695193,-3.752468,1.017751,0.099865,
+ 0.708269,-0.122725,0.695193,-3.752468,1.017751,0.099865,
+ 0.910294,-0.144636,0.387873,-3.716312,1.021474,0.057693,
+ 0.813709,-0.132052,0.566074,-3.675638,1.471512,0.062201,
+ 0.708269,-0.122725,0.695193,-3.752468,1.017751,0.099865,
+ 0.813709,-0.132052,0.566074,-3.675638,1.471512,0.062201,
+ 0.540204,-0.272055,0.796345,-3.714787,1.473248,0.107668,
+ 0.540204,-0.272055,0.796345,-3.714787,1.473248,0.107668,
+ 0.813709,-0.132052,0.566074,-3.675638,1.471512,0.062201,
+ 0.577502,-0.140087,0.804281,-3.519086,1.70322,0.066709,
+ 0.540204,-0.272055,0.796345,-3.714787,1.473248,0.107668,
+ 0.577502,-0.140087,0.804281,-3.519086,1.70322,0.066709,
+ 0.723289,-0.195474,0.662302,-3.557104,1.72113,0.11547,
+ 0.723289,-0.195474,0.662302,-3.557104,1.72113,0.11547,
+ 0.577502,-0.140087,0.804281,-3.519086,1.70322,0.066709,
+ 0.490646,-0.178294,0.852923,-3.357009,1.781675,0.071216,
+ 0.723289,-0.195474,0.662302,-3.557104,1.72113,0.11547,
+ 0.490646,-0.178294,0.852923,-3.357009,1.781675,0.071216,
+ 0.588787,-0.248294,0.769207,-3.380836,1.819691,0.123273,
+ 0.274422,-0.24433,0.930051,-3.65524,-0.194907,0.019209,
+ 0.267717,-0.172975,0.947844,-3.640457,-0.195379,-0.024909,
+ -0.028502,-0.108631,0.993674,-3.661331,0.167886,0.000058,
+ 0.274422,-0.24433,0.930051,-3.65524,-0.194907,0.019209,
+ -0.028502,-0.108631,0.993674,-3.661331,0.167886,0.000058,
+ 0.017555,-0.142899,0.989582,-3.672559,0.166625,0.048678,
+ 0.017555,-0.142899,0.989582,-3.672559,0.166625,0.048678,
+ -0.028502,-0.108631,0.993674,-3.661331,0.167886,0.000058,
+ 0.998889,0.047122,-0.000074,-3.674766,0.517345,-0.000063,
+ 0.017555,-0.142899,0.989582,-3.672559,0.166625,0.048678,
+ 0.998889,0.047122,-0.000074,-3.674766,0.517345,-0.000063,
+ 0.961046,0.110911,0.253159,-3.686972,0.515966,0.053185,
+ 0.961046,0.110911,0.253159,-3.686972,0.515966,0.053185,
+ 0.998889,0.047122,-0.000074,-3.674766,0.517345,-0.000063,
+ 0.999831,-0.018401,-0.000261,-3.703058,1.022838,-0.000069,
+ 0.961046,0.110911,0.253159,-3.686972,0.515966,0.053185,
+ 0.999831,-0.018401,-0.000261,-3.703058,1.022838,-0.000069,
+ 0.910294,-0.144636,0.387873,-3.716312,1.021474,0.057693,
+ 0.910294,-0.144636,0.387873,-3.716312,1.021474,0.057693,
+ 0.999831,-0.018401,-0.000261,-3.703058,1.022838,-0.000069,
+ 0.941293,-0.337592,-0.000186,-3.661286,1.470876,-0.000074,
+ 0.910294,-0.144636,0.387873,-3.716312,1.021474,0.057693,
+ 0.941293,-0.337592,-0.000186,-3.661286,1.470876,-0.000074,
+ 0.813709,-0.132052,0.566074,-3.675638,1.471512,0.062201,
+ 0.813709,-0.132052,0.566074,-3.675638,1.471512,0.062201,
+ 0.941293,-0.337592,-0.000186,-3.661286,1.470876,-0.000074,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ 0.813709,-0.132052,0.566074,-3.675638,1.471512,0.062201,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ 0.577502,-0.140087,0.804281,-3.519086,1.70322,0.066709,
+ 0.577502,-0.140087,0.804281,-3.519086,1.70322,0.066709,
+ -0.153783,-0.988105,0,-3.507689,1.700214,0,
+ 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085,
+ 0.577502,-0.140087,0.804281,-3.519086,1.70322,0.066709,
+ 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085,
+ 0.490646,-0.178294,0.852923,-3.357009,1.781675,0.071216,
+ 0.267717,-0.172975,0.947844,-3.640457,-0.195379,-0.024909,
+ -0.064166,-0.189382,0.979805,-3.655175,-0.194909,-0.069044,
+ 0.781868,0.537363,0.316106,-3.67251,0.16663,-0.048579,
+ 0.267717,-0.172975,0.947844,-3.640457,-0.195379,-0.024909,
+ 0.781868,0.537363,0.316106,-3.67251,0.16663,-0.048579,
+ -0.028502,-0.108631,0.993674,-3.661331,0.167886,0.000058,
+ -0.028502,-0.108631,0.993674,-3.661331,0.167886,0.000058,
+ 0.781868,0.537363,0.316106,-3.67251,0.16663,-0.048579,
+ 0.891325,0.039302,-0.451658,-3.686972,0.515966,-0.053185,
+ -0.028502,-0.108631,0.993674,-3.661331,0.167886,0.000058,
+ 0.891325,0.039302,-0.451658,-3.686972,0.515966,-0.053185,
+ 0.998889,0.047122,-0.000074,-3.674766,0.517345,-0.000063,
+ -0.064166,-0.189382,0.979805,-3.655175,-0.194909,-0.069044,
+ 0.89264,0.349909,0.284178,-3.695452,-0.193624,-0.101369,
+ 0.618085,0.65091,0.440781,-3.703099,0.163192,-0.084205,
+ -0.064166,-0.189382,0.979805,-3.655175,-0.194909,-0.069044,
+ 0.618085,0.65091,0.440781,-3.703099,0.163192,-0.084205,
+ 0.781868,0.537363,0.316106,-3.67251,0.16663,-0.048579,
+ 0.781868,0.537363,0.316106,-3.67251,0.16663,-0.048579,
+ 0.618085,0.65091,0.440781,-3.703099,0.163192,-0.084205,
+ 0.549192,0.015162,-0.835559,-3.720269,0.512205,-0.092064,
+ 0.781868,0.537363,0.316106,-3.67251,0.16663,-0.048579,
+ 0.549192,0.015162,-0.835559,-3.720269,0.512205,-0.092064,
+ 0.891325,0.039302,-0.451658,-3.686972,0.515966,-0.053185,
+ 0.89264,0.349909,0.284178,-3.695452,-0.193624,-0.101369,
+ 0.3526,0.621479,0.699598,-3.7505,-0.191867,-0.11323,
+ 0.171039,0.554898,0.814146,-3.744907,0.158493,-0.097274,
+ 0.89264,0.349909,0.284178,-3.695452,-0.193624,-0.101369,
+ 0.171039,0.554898,0.814146,-3.744907,0.158493,-0.097274,
+ 0.618085,0.65091,0.440781,-3.703099,0.163192,-0.084205,
+ 0.618085,0.65091,0.440781,-3.703099,0.163192,-0.084205,
+ 0.171039,0.554898,0.814146,-3.744907,0.158493,-0.097274,
+ 0.002291,-0.021629,-0.999763,-3.765736,0.50707,-0.106281,
+ 0.618085,0.65091,0.440781,-3.703099,0.163192,-0.084205,
+ 0.002291,-0.021629,-0.999763,-3.765736,0.50707,-0.106281,
+ 0.549192,0.015162,-0.835559,-3.720269,0.512205,-0.092064,
+ 0.3526,0.621479,0.699598,-3.7505,-0.191867,-0.11323,
+ -0.281998,-0.030938,0.958916,-3.805575,-0.190109,-0.101447,
+ -0.120429,-0.209965,0.970264,-3.786736,0.153792,-0.084291,
+ 0.3526,0.621479,0.699598,-3.7505,-0.191867,-0.11323,
+ -0.120429,-0.209965,0.970264,-3.786736,0.153792,-0.084291,
+ 0.171039,0.554898,0.814146,-3.744907,0.158493,-0.097274,
+ 0.171039,0.554898,0.814146,-3.744907,0.158493,-0.097274,
+ -0.120429,-0.209965,0.970264,-3.786736,0.153792,-0.084291,
+ -0.545298,-0.056465,-0.836338,-3.811194,0.501935,-0.092033,
+ 0.171039,0.554898,0.814146,-3.744907,0.158493,-0.097274,
+ -0.545298,-0.056465,-0.836338,-3.811194,0.501935,-0.092033,
+ 0.002291,-0.021629,-0.999763,-3.765736,0.50707,-0.106281,
+ -0.281998,-0.030938,0.958916,-3.805575,-0.190109,-0.101447,
+ 0.077536,0.770695,0.632469,-3.845923,-0.188822,-0.06918,
+ -0.222902,0.035918,0.974179,-3.817381,0.150348,-0.048728,
+ -0.281998,-0.030938,0.958916,-3.805575,-0.190109,-0.101447,
+ -0.222902,0.035918,0.974179,-3.817381,0.150348,-0.048728,
+ -0.120429,-0.209965,0.970264,-3.786736,0.153792,-0.084291,
+ -0.120429,-0.209965,0.970264,-3.786736,0.153792,-0.084291,
+ -0.222902,0.035918,0.974179,-3.817381,0.150348,-0.048728,
+ -0.888551,-0.077176,-0.452239,-3.84447,0.498176,-0.053132,
+ -0.120429,-0.209965,0.970264,-3.786736,0.153792,-0.084291,
+ -0.888551,-0.077176,-0.452239,-3.84447,0.498176,-0.053132,
+ -0.545298,-0.056465,-0.836338,-3.811194,0.501935,-0.092033,
+ 0.077536,0.770695,0.632469,-3.845923,-0.188822,-0.06918,
+ 0.166377,-0.157108,0.973466,-3.86074,-0.188349,-0.024962,
+ 0.054863,-0.132814,0.989621,-3.828633,0.149083,0,
+ 0.077536,0.770695,0.632469,-3.845923,-0.188822,-0.06918,
+ 0.054863,-0.132814,0.989621,-3.828633,0.149083,0,
+ -0.222902,0.035918,0.974179,-3.817381,0.150348,-0.048728,
+ -0.222902,0.035918,0.974179,-3.817381,0.150348,-0.048728,
+ 0.054863,-0.132814,0.989621,-3.828633,0.149083,0,
+ -0.996511,-0.083465,-0.000062,-3.856649,0.496801,0,
+ -0.222902,0.035918,0.974179,-3.817381,0.150348,-0.048728,
+ -0.996511,-0.083465,-0.000062,-3.856649,0.496801,0,
+ -0.888551,-0.077176,-0.452239,-3.84447,0.498176,-0.053132,
+ 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
+ 0.137206,-0.207537,0.968557,-3.077669,1.871112,0.217368,
+ 0.722,0.398916,0.565317,-3.227504,1.961738,0.131029,
+ 0.137764,-0.289893,0.947092,-3.053102,1.96881,0.051104,
+ 0.012502,-0.999922,0,-3.037562,2.001526,0,
+ -0.433128,-0.901332,0,-3.242148,2.021387,0,
+ 0.137764,-0.289893,0.947092,-3.053102,1.96881,0.051104,
+ -0.433128,-0.901332,0,-3.242148,2.021387,0,
+ 0.707626,-0.125604,0.695334,-3.238225,2.005405,0.075645,
+ 0.137764,-0.289893,0.947092,-3.053102,1.96881,0.051104,
+ 0.707626,-0.125604,0.695334,-3.238225,2.005405,0.075645,
+ 0.722,0.398916,0.565317,-3.227504,1.961738,0.131029,
+ 0.137206,-0.207537,0.968557,-3.077669,1.871112,0.217368,
+ 0.137764,-0.289893,0.947092,-3.053102,1.96881,0.051104,
+ 0.722,0.398916,0.565317,-3.227504,1.961738,0.131029,
+ 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
+ -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
+ 0.137206,-0.207537,0.968557,-3.077669,1.871112,0.217368,
+ -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
+ 0.094371,-0.230057,0.968591,-3.07531,1.846,0.363149,
+ 0.137206,-0.207537,0.968557,-3.077669,1.871112,0.217368,
+ 0.272203,0.043076,0.961275,4.861618,1.854067,0.618095,
+ 0.302716,0.058971,0.951255,4.852578,1.889721,0.605031,
+ 0.347794,0.132396,0.928176,4.824747,1.946835,0.626358,
+ 0.272203,0.043076,0.961275,4.861618,1.854067,0.618095,
+ 0.347794,0.132396,0.928176,4.824747,1.946835,0.626358,
+ 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
+ 0.361081,-0.056526,0.93082,4.935561,2.016016,0.5857,
+ 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
+ 0.195545,0.103956,0.975169,4.842883,2.021333,0.638025,
+ 0.361081,-0.056526,0.93082,4.935561,2.016016,0.5857,
+ 0.195545,0.103956,0.975169,4.842883,2.021333,0.638025,
+ 0.36359,0.089346,0.927264,4.861611,2.001639,0.621913,
+ 0.282492,0.026081,0.958915,4.973133,1.992779,0.533466,
+ 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
+ 0.210495,0.185422,0.959849,4.991746,2.009819,0.523206,
+ 0.302716,0.058971,0.951255,4.852578,1.889721,0.605031,
+ 0.272203,0.043076,0.961275,4.861618,1.854067,0.618095,
+ -0.03359,0.173471,0.984266,4.944706,1.840663,0.575374,
+ 0.302716,0.058971,0.951255,4.852578,1.889721,0.605031,
+ -0.03359,0.173471,0.984266,4.944706,1.840663,0.575374,
+ 0.332757,0.286207,0.898531,4.926194,1.859813,0.582137,
+ -0.03359,0.173471,0.984266,4.944706,1.840663,0.575374,
+ 0.289202,0.572304,0.767353,4.991709,1.844295,0.520761,
+ 0.362705,0.428702,0.827442,4.982364,1.8733,0.53619,
+ -0.03359,0.173471,0.984266,4.944706,1.840663,0.575374,
+ 0.362705,0.428702,0.827442,4.982364,1.8733,0.53619,
+ 0.332757,0.286207,0.898531,4.926194,1.859813,0.582137,
+ 0.168187,0.300291,0.938903,4.852582,1.816115,0.603105,
+ 0.243508,0.533327,0.810103,4.908019,1.796041,0.587882,
+ -0.03359,0.173471,0.984266,4.944706,1.840663,0.575374,
+ 0.168187,0.300291,0.938903,4.852582,1.816115,0.603105,
+ -0.03359,0.173471,0.984266,4.944706,1.840663,0.575374,
+ 0.272203,0.043076,0.961275,4.861618,1.854067,0.618095,
+ 0.243508,0.533327,0.810103,4.908019,1.796041,0.587882,
+ 0.112152,0.130705,0.985057,4.963546,1.783161,0.553515,
+ 0.289202,0.572304,0.767353,4.991709,1.844295,0.520761,
+ 0.243508,0.533327,0.810103,4.908019,1.796041,0.587882,
+ 0.289202,0.572304,0.767353,4.991709,1.844295,0.520761,
+ -0.03359,0.173471,0.984266,4.944706,1.840663,0.575374,
+ 0.112152,0.130705,0.985057,4.963546,1.783161,0.553515,
+ 0.069483,0.206285,0.976022,4.983034,1.806343,0.505779,
+ 0.289202,0.572304,0.767353,4.991709,1.844295,0.520761,
+ 0.069483,0.206285,0.976022,4.983034,1.806343,0.505779,
+ 0.154687,0.171026,0.973048,5.01143,1.875569,0.463205,
+ 0.289202,0.572304,0.767353,4.991709,1.844295,0.520761,
+ 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
+ 0.210495,0.185422,0.959849,4.991746,2.009819,0.523206,
+ 0.235746,0.648569,0.723728,4.964945,2.053575,0.499903,
+ 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
+ 0.235746,0.648569,0.723728,4.964945,2.053575,0.499903,
+ 0.054287,0.055115,0.997003,4.918466,2.084725,0.532713,
+ 0.210495,0.185422,0.959849,4.991746,2.009819,0.523206,
+ 0.101497,0.61661,0.780699,5.020077,1.97817,0.480978,
+ 0.235746,0.648569,0.723728,4.964945,2.053575,0.499903,
+ 0.154687,0.171026,0.973048,5.01143,1.875569,0.463205,
+ 0.101497,0.61661,0.780699,5.020077,1.97817,0.480978,
+ 0.210495,0.185422,0.959849,4.991746,2.009819,0.523206,
+ 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
+ 0.012421,0.392537,0.919652,4.881574,2.094571,0.539949,
+ 0.043397,0.435463,0.89916,4.825996,2.089176,0.576083,
+ 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
+ 0.043397,0.435463,0.89916,4.825996,2.089176,0.576083,
+ 0.195545,0.103956,0.975169,4.842883,2.021333,0.638025,
+ 0.067357,0.280764,0.95741,4.788476,2.028047,0.608619,
+ 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
+ 0.195545,0.103956,0.975169,4.842883,2.021333,0.638025,
+ 0.067357,0.280764,0.95741,4.788476,2.028047,0.608619,
+ 0.195545,0.103956,0.975169,4.842883,2.021333,0.638025,
+ 0.043397,0.435463,0.89916,4.825996,2.089176,0.576083,
+ 0.067357,0.280764,0.95741,4.788476,2.028047,0.608619,
+ 0.043397,0.435463,0.89916,4.825996,2.089176,0.576083,
+ 0.184871,0.227138,0.956154,4.798297,2.118191,0.591085,
+ 0.067357,0.280764,0.95741,4.788476,2.028047,0.608619,
+ 0.184871,0.227138,0.956154,4.798297,2.118191,0.591085,
+ -0.026366,0.234118,0.971851,4.751519,2.039658,0.634134,
+ 0.043397,0.435463,0.89916,4.825996,2.089176,0.576083,
+ 0.012421,0.392537,0.919652,4.881574,2.094571,0.539949,
+ -0.034875,0.308036,0.950735,4.872539,2.159259,0.542891,
+ 0.043397,0.435463,0.89916,4.825996,2.089176,0.576083,
+ -0.034875,0.308036,0.950735,4.872539,2.159259,0.542891,
+ 0.184871,0.227138,0.956154,4.798297,2.118191,0.591085,
+ 0.012421,0.392537,0.919652,4.881574,2.094571,0.539949,
+ 0.054287,0.055115,0.997003,4.918466,2.084725,0.532713,
+ -0.148853,0.101172,0.98367,4.927885,2.15656,0.516579,
+ 0.012421,0.392537,0.919652,4.881574,2.094571,0.539949,
+ -0.148853,0.101172,0.98367,4.927885,2.15656,0.516579,
+ -0.034875,0.308036,0.950735,4.872539,2.159259,0.542891,
+ 0.054287,0.055115,0.997003,4.918466,2.084725,0.532713,
+ 0.235746,0.648569,0.723728,4.964945,2.053575,0.499903,
+ 0.504806,0.844077,0.180846,5.00244,2.105746,0.468233,
+ 0.054287,0.055115,0.997003,4.918466,2.084725,0.532713,
+ 0.504806,0.844077,0.180846,5.00244,2.105746,0.468233,
+ -0.148853,0.101172,0.98367,4.927885,2.15656,0.516579,
+ 0.235746,0.648569,0.723728,4.964945,2.053575,0.499903,
+ 0.101497,0.61661,0.780699,5.020077,1.97817,0.480978,
+ 0.615065,0.769234,0.173133,5.057495,2.002751,0.451974,
+ 0.235746,0.648569,0.723728,4.964945,2.053575,0.499903,
+ 0.615065,0.769234,0.173133,5.057495,2.002751,0.451974,
+ 0.504806,0.844077,0.180846,5.00244,2.105746,0.468233,
+ 0.101497,0.61661,0.780699,5.020077,1.97817,0.480978,
+ 0.154687,0.171026,0.973048,5.01143,1.875569,0.463205,
+ 0.550963,0.62763,0.550018,5.075994,1.900999,0.443793,
+ 0.101497,0.61661,0.780699,5.020077,1.97817,0.480978,
+ 0.550963,0.62763,0.550018,5.075994,1.900999,0.443793,
+ 0.615065,0.769234,0.173133,5.057495,2.002751,0.451974,
+ 0.154687,0.171026,0.973048,5.01143,1.875569,0.463205,
+ 0.477291,0.716177,0.509199,5.030289,1.827419,0.440803,
+ 0.550963,0.62763,0.550018,5.075994,1.900999,0.443793,
+ 0.069483,0.206285,0.976022,4.983034,1.806343,0.505779,
+ 0.888167,0.420088,0.186241,4.991904,1.760829,0.510386,
+ 0.477291,0.716177,0.509199,5.030289,1.827419,0.440803,
+ 0.069483,0.206285,0.976022,4.983034,1.806343,0.505779,
+ 0.477291,0.716177,0.509199,5.030289,1.827419,0.440803,
+ 0.154687,0.171026,0.973048,5.01143,1.875569,0.463205,
+ 0.112152,0.130705,0.985057,4.963546,1.783161,0.553515,
+ 0.749779,0.312648,0.583167,4.936066,1.737668,0.557276,
+ 0.888167,0.420088,0.186241,4.991904,1.760829,0.510386,
+ 0.112152,0.130705,0.985057,4.963546,1.783161,0.553515,
+ 0.888167,0.420088,0.186241,4.991904,1.760829,0.510386,
+ 0.069483,0.206285,0.976022,4.983034,1.806343,0.505779,
+ 0.358075,0.480709,0.800438,4.871155,1.741238,0.592326,
+ 0.749779,0.312648,0.583167,4.936066,1.737668,0.557276,
+ 0.112152,0.130705,0.985057,4.963546,1.783161,0.553515,
+ 0.358075,0.480709,0.800438,4.871155,1.741238,0.592326,
+ 0.112152,0.130705,0.985057,4.963546,1.783161,0.553515,
+ 0.243508,0.533327,0.810103,4.908019,1.796041,0.587882,
+ 0.524848,0.480955,0.702294,4.816181,1.79786,0.604026,
+ 0.358075,0.480709,0.800438,4.871155,1.741238,0.592326,
+ 0.243508,0.533327,0.810103,4.908019,1.796041,0.587882,
+ 0.524848,0.480955,0.702294,4.816181,1.79786,0.604026,
+ 0.243508,0.533327,0.810103,4.908019,1.796041,0.587882,
+ 0.168187,0.300291,0.938903,4.852582,1.816115,0.603105,
+ 0.524848,0.480955,0.702294,4.816181,1.79786,0.604026,
+ 0.168187,0.300291,0.938903,4.852582,1.816115,0.603105,
+ 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
+ 0.988203,-0.047217,0.145687,5.085813,1.888503,0.408327,
+ 0.72603,0.248277,0.641279,5.095375,1.961238,0.401516,
+ 0.550963,0.62763,0.550018,5.075994,1.900999,0.443793,
+ 0.477291,0.716177,0.509199,5.030289,1.827419,0.440803,
+ 0.936242,-0.313777,-0.158096,5.058179,1.788186,0.417387,
+ 0.988203,-0.047217,0.145687,5.085813,1.888503,0.408327,
+ 0.477291,0.716177,0.509199,5.030289,1.827419,0.440803,
+ 0.988203,-0.047217,0.145687,5.085813,1.888503,0.408327,
+ 0.550963,0.62763,0.550018,5.075994,1.900999,0.443793,
+ 0.888167,0.420088,0.186241,4.991904,1.760829,0.510386,
+ 0.831186,-0.511045,-0.219005,5.019836,1.739907,0.485562,
+ 0.936242,-0.313777,-0.158096,5.058179,1.788186,0.417387,
+ 0.888167,0.420088,0.186241,4.991904,1.760829,0.510386,
+ 0.936242,-0.313777,-0.158096,5.058179,1.788186,0.417387,
+ 0.477291,0.716177,0.509199,5.030289,1.827419,0.440803,
+ 0.749779,0.312648,0.583167,4.936066,1.737668,0.557276,
+ 0.797293,-0.558933,-0.227857,4.917973,1.68148,0.544201,
+ 0.831186,-0.511045,-0.219005,5.019836,1.739907,0.485562,
+ 0.749779,0.312648,0.583167,4.936066,1.737668,0.557276,
+ 0.831186,-0.511045,-0.219005,5.019836,1.739907,0.485562,
+ 0.888167,0.420088,0.186241,4.991904,1.760829,0.510386,
+ 0.707669,-0.687185,0.164261,4.862636,1.684144,0.570155,
+ 0.797293,-0.558933,-0.227857,4.917973,1.68148,0.544201,
+ 0.749779,0.312648,0.583167,4.936066,1.737668,0.557276,
+ 0.707669,-0.687185,0.164261,4.862636,1.684144,0.570155,
+ 0.749779,0.312648,0.583167,4.936066,1.737668,0.557276,
+ 0.358075,0.480709,0.800438,4.871155,1.741238,0.592326,
+ 0.744254,-0.65416,0.134758,4.752337,1.723388,0.591296,
+ 0.707669,-0.687185,0.164261,4.862636,1.684144,0.570155,
+ 0.358075,0.480709,0.800438,4.871155,1.741238,0.592326,
+ 0.744254,-0.65416,0.134758,4.752337,1.723388,0.591296,
+ 0.358075,0.480709,0.800438,4.871155,1.741238,0.592326,
+ 0.524848,0.480955,0.702294,4.816181,1.79786,0.604026,
+ 0.884603,-0.366979,0.287755,4.697607,1.768061,0.576663,
+ 0.744254,-0.65416,0.134758,4.752337,1.723388,0.591296,
+ 0.524848,0.480955,0.702294,4.816181,1.79786,0.604026,
+ 0.884603,-0.366979,0.287755,4.697607,1.768061,0.576663,
+ 0.524848,0.480955,0.702294,4.816181,1.79786,0.604026,
+ 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
+ 0.615065,0.769234,0.173133,5.057495,2.002751,0.451974,
+ 0.670109,-0.356989,0.650778,5.067202,2.027704,0.422291,
+ 0.468872,-0.092982,0.878359,5.030641,2.102197,0.432329,
+ 0.615065,0.769234,0.173133,5.057495,2.002751,0.451974,
+ 0.468872,-0.092982,0.878359,5.030641,2.102197,0.432329,
+ 0.504806,0.844077,0.180846,5.00244,2.105746,0.468233,
+ -0.148853,0.101172,0.98367,4.927885,2.15656,0.516579,
+ 0.504806,0.844077,0.180846,5.00244,2.105746,0.468233,
+ 0.468872,-0.092982,0.878359,5.030641,2.102197,0.432329,
+ -0.148853,0.101172,0.98367,4.927885,2.15656,0.516579,
+ 0.468872,-0.092982,0.878359,5.030641,2.102197,0.432329,
+ 0.507131,-0.710633,0.487667,4.93795,2.181155,0.486939,
+ -0.034875,0.308036,0.950735,4.872539,2.159259,0.542891,
+ -0.148853,0.101172,0.98367,4.927885,2.15656,0.516579,
+ 0.507131,-0.710633,0.487667,4.93795,2.181155,0.486939,
+ -0.034875,0.308036,0.950735,4.872539,2.159259,0.542891,
+ 0.507131,-0.710633,0.487667,4.93795,2.181155,0.486939,
+ 0.292794,-0.691168,0.660725,4.881855,2.194544,0.530288,
+ 0.384025,-0.256534,0.88697,4.807794,2.143653,0.570393,
+ 0.184871,0.227138,0.956154,4.798297,2.118191,0.591085,
+ -0.034875,0.308036,0.950735,4.872539,2.159259,0.542891,
+ 0.384025,-0.256534,0.88697,4.807794,2.143653,0.570393,
+ -0.034875,0.308036,0.950735,4.872539,2.159259,0.542891,
+ 0.292794,-0.691168,0.660725,4.881855,2.194544,0.530288,
+ 0.689769,-0.265624,0.673544,4.728963,2.036146,0.614307,
+ -0.026366,0.234118,0.971851,4.751519,2.039658,0.634134,
+ 0.184871,0.227138,0.956154,4.798297,2.118191,0.591085,
+ 0.689769,-0.265624,0.673544,4.728963,2.036146,0.614307,
+ 0.184871,0.227138,0.956154,4.798297,2.118191,0.591085,
+ 0.384025,-0.256534,0.88697,4.807794,2.143653,0.570393,
+ 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
+ -0.026366,0.234118,0.971851,4.751519,2.039658,0.634134,
+ 0.689769,-0.265624,0.673544,4.728963,2.036146,0.614307,
+ 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
+ 0.689769,-0.265624,0.673544,4.728963,2.036146,0.614307,
+ 0.901575,-0.270544,0.337593,4.742358,1.882232,0.62165,
+ 0.884603,-0.366979,0.287755,4.697607,1.768061,0.576663,
+ 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
+ 0.901575,-0.270544,0.337593,4.742358,1.882232,0.62165,
+ 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
+ 0.689769,-0.265624,0.673544,4.728963,2.036146,0.614307,
+ 0.384025,-0.256534,0.88697,4.807794,2.143653,0.570393,
+ 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
+ 0.384025,-0.256534,0.88697,4.807794,2.143653,0.570393,
+ 0.399187,-0.679804,0.615237,4.74405,2.179337,0.556057,
+ 0.384025,-0.256534,0.88697,4.807794,2.143653,0.570393,
+ 0.292794,-0.691168,0.660725,4.881855,2.194544,0.530288,
+ 0.428199,-0.104479,0.897624,4.837331,2.235678,0.479332,
+ 0.384025,-0.256534,0.88697,4.807794,2.143653,0.570393,
+ 0.428199,-0.104479,0.897624,4.837331,2.235678,0.479332,
+ 0.399187,-0.679804,0.615237,4.74405,2.179337,0.556057,
+ 0.292794,-0.691168,0.660725,4.881855,2.194544,0.530288,
+ 0.507131,-0.710633,0.487667,4.93795,2.181155,0.486939,
+ 0.259896,0.111139,0.95922,4.89385,2.220523,0.417713,
+ 0.292794,-0.691168,0.660725,4.881855,2.194544,0.530288,
+ 0.259896,0.111139,0.95922,4.89385,2.220523,0.417713,
+ 0.428199,-0.104479,0.897624,4.837331,2.235678,0.479332,
+ 0.507131,-0.710633,0.487667,4.93795,2.181155,0.486939,
+ 0.468872,-0.092982,0.878359,5.030641,2.102197,0.432329,
+ 0.230527,0.277299,0.932718,4.995978,2.148785,0.344534,
+ 0.507131,-0.710633,0.487667,4.93795,2.181155,0.486939,
+ 0.230527,0.277299,0.932718,4.995978,2.148785,0.344534,
+ 0.259896,0.111139,0.95922,4.89385,2.220523,0.417713,
+ 0.468872,-0.092982,0.878359,5.030641,2.102197,0.432329,
+ 0.670109,-0.356989,0.650778,5.067202,2.027704,0.422291,
+ 0.171367,-0.69152,0.701736,5.06084,2.053335,0.309324,
+ 0.468872,-0.092982,0.878359,5.030641,2.102197,0.432329,
+ 0.171367,-0.69152,0.701736,5.06084,2.053335,0.309324,
+ 0.230527,0.277299,0.932718,4.995978,2.148785,0.344534,
+ 0.670109,-0.356989,0.650778,5.067202,2.027704,0.422291,
+ 0.72603,0.248277,0.641279,5.095375,1.961238,0.401516,
+ 0.258975,-0.768157,0.585548,5.097062,1.954206,0.328795,
+ 0.670109,-0.356989,0.650778,5.067202,2.027704,0.422291,
+ 0.258975,-0.768157,0.585548,5.097062,1.954206,0.328795,
+ 0.171367,-0.69152,0.701736,5.06084,2.053335,0.309324,
+ 0.988203,-0.047217,0.145687,5.085813,1.888503,0.408327,
+ 0.154813,-0.698608,0.698556,5.105589,1.864086,0.347113,
+ 0.258975,-0.768157,0.585548,5.097062,1.954206,0.328795,
+ 0.988203,-0.047217,0.145687,5.085813,1.888503,0.408327,
+ 0.258975,-0.768157,0.585548,5.097062,1.954206,0.328795,
+ 0.72603,0.248277,0.641279,5.095375,1.961238,0.401516,
+ 0.936242,-0.313777,-0.158096,5.058179,1.788186,0.417387,
+ 0.154813,-0.698608,0.698556,5.105589,1.864086,0.347113,
+ 0.988203,-0.047217,0.145687,5.085813,1.888503,0.408327,
+ 0.884603,-0.366979,0.287755,4.697607,1.768061,0.576663,
+ 0.901575,-0.270544,0.337593,4.742358,1.882232,0.62165,
+ 0.152967,-0.640193,0.752831,4.697024,1.862575,0.604048,
+ 0.259896,0.111139,0.95922,4.89385,2.220523,0.417713,
+ 0.203778,-0.389736,0.898098,4.83289,2.262727,0.283787,
+ 0.244568,-0.044721,0.9686,4.739441,2.299169,0.369987,
+ 0.259896,0.111139,0.95922,4.89385,2.220523,0.417713,
+ 0.244568,-0.044721,0.9686,4.739441,2.299169,0.369987,
+ 0.428199,-0.104479,0.897624,4.837331,2.235678,0.479332,
+ 0.259896,0.111139,0.95922,4.89385,2.220523,0.417713,
+ 0.230527,0.277299,0.932718,4.995978,2.148785,0.344534,
+ -0.026148,0.006311,0.999638,4.971394,2.146686,0.224781,
+ 0.259896,0.111139,0.95922,4.89385,2.220523,0.417713,
+ -0.026148,0.006311,0.999638,4.971394,2.146686,0.224781,
+ 0.203778,-0.389736,0.898098,4.83289,2.262727,0.283787,
+ 0.230527,0.277299,0.932718,4.995978,2.148785,0.344534,
+ 0.171367,-0.69152,0.701736,5.06084,2.053335,0.309324,
+ -0.149467,-0.273889,0.950076,5.072165,2.04363,0.209228,
+ 0.230527,0.277299,0.932718,4.995978,2.148785,0.344534,
+ -0.149467,-0.273889,0.950076,5.072165,2.04363,0.209228,
+ -0.026148,0.006311,0.999638,4.971394,2.146686,0.224781,
+ 0.171367,-0.69152,0.701736,5.06084,2.053335,0.309324,
+ 0.258975,-0.768157,0.585548,5.097062,1.954206,0.328795,
+ 0.06611,-0.359829,0.930673,5.127157,1.942759,0.211214,
+ 0.171367,-0.69152,0.701736,5.06084,2.053335,0.309324,
+ 0.06611,-0.359829,0.930673,5.127157,1.942759,0.211214,
+ -0.149467,-0.273889,0.950076,5.072165,2.04363,0.209228,
+ 0.258975,-0.768157,0.585548,5.097062,1.954206,0.328795,
+ 0.154813,-0.698608,0.698556,5.105589,1.864086,0.347113,
+ -0.091049,-0.145989,0.985087,5.152698,1.830661,0.287042,
+ 0.258975,-0.768157,0.585548,5.097062,1.954206,0.328795,
+ -0.091049,-0.145989,0.985087,5.152698,1.830661,0.287042,
+ 0.06611,-0.359829,0.930673,5.127157,1.942759,0.211214,
+ 0.936242,-0.313777,-0.158096,5.058179,1.788186,0.417387,
+ -0.12102,-0.514608,0.848842,5.133171,1.715563,0.334258,
+ -0.091049,-0.145989,0.985087,5.152698,1.830661,0.287042,
+ 0.936242,-0.313777,-0.158096,5.058179,1.788186,0.417387,
+ -0.091049,-0.145989,0.985087,5.152698,1.830661,0.287042,
+ 0.154813,-0.698608,0.698556,5.105589,1.864086,0.347113,
+ 0.831186,-0.511045,-0.219005,5.019836,1.739907,0.485562,
+ 0.063508,-0.739371,0.670296,5.103427,1.624404,0.434275,
+ -0.12102,-0.514608,0.848842,5.133171,1.715563,0.334258,
+ 0.831186,-0.511045,-0.219005,5.019836,1.739907,0.485562,
+ -0.12102,-0.514608,0.848842,5.133171,1.715563,0.334258,
+ 0.936242,-0.313777,-0.158096,5.058179,1.788186,0.417387,
+ 0.797293,-0.558933,-0.227857,4.917973,1.68148,0.544201,
+ 0.169576,-0.140705,0.975421,4.982822,1.503071,0.507606,
+ 0.063508,-0.739371,0.670296,5.103427,1.624404,0.434275,
+ 0.797293,-0.558933,-0.227857,4.917973,1.68148,0.544201,
+ 0.063508,-0.739371,0.670296,5.103427,1.624404,0.434275,
+ 0.831186,-0.511045,-0.219005,5.019836,1.739907,0.485562,
+ 0.111896,-0.605741,0.787755,4.927282,1.486953,0.526327,
+ 0.169576,-0.140705,0.975421,4.982822,1.503071,0.507606,
+ 0.797293,-0.558933,-0.227857,4.917973,1.68148,0.544201,
+ 0.111896,-0.605741,0.787755,4.927282,1.486953,0.526327,
+ 0.797293,-0.558933,-0.227857,4.917973,1.68148,0.544201,
+ 0.707669,-0.687185,0.164261,4.862636,1.684144,0.570155,
+ 0.002178,-0.833415,0.552643,4.79841,1.473149,0.570618,
+ 0.111896,-0.605741,0.787755,4.927282,1.486953,0.526327,
+ 0.707669,-0.687185,0.164261,4.862636,1.684144,0.570155,
+ 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
+ 0.002178,-0.833415,0.552643,4.79841,1.473149,0.570618,
+ 0.707669,-0.687185,0.164261,4.862636,1.684144,0.570155,
+ 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
+ 0.707669,-0.687185,0.164261,4.862636,1.684144,0.570155,
+ 0.744254,-0.65416,0.134758,4.752337,1.723388,0.591296,
+ 0.205809,-0.680492,0.703259,4.615408,1.639641,0.577768,
+ 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
+ 0.744254,-0.65416,0.134758,4.752337,1.723388,0.591296,
+ 0.205809,-0.680492,0.703259,4.615408,1.639641,0.577768,
+ 0.744254,-0.65416,0.134758,4.752337,1.723388,0.591296,
+ 0.884603,-0.366979,0.287755,4.697607,1.768061,0.576663,
+ 0.396941,-0.593503,0.700137,4.560751,1.785154,0.562428,
+ 0.205809,-0.680492,0.703259,4.615408,1.639641,0.577768,
+ 0.884603,-0.366979,0.287755,4.697607,1.768061,0.576663,
+ 0.396941,-0.593503,0.700137,4.560751,1.785154,0.562428,
+ 0.884603,-0.366979,0.287755,4.697607,1.768061,0.576663,
+ 0.152967,-0.640193,0.752831,4.697024,1.862575,0.604048,
+ 0.396941,-0.593503,0.700137,4.560751,1.785154,0.562428,
+ 0.152967,-0.640193,0.752831,4.697024,1.862575,0.604048,
+ 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
+ 0.396941,-0.593503,0.700137,4.560751,1.785154,0.562428,
+ 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
+ 0.025716,-0.894111,0.447106,4.551484,1.841749,0.575191,
+ 0.025716,-0.894111,0.447106,4.551484,1.841749,0.575191,
+ 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
+ 0.051115,-0.906355,0.419413,4.533113,1.989009,0.578975,
+ 0.256335,-0.2349,0.937611,4.561299,2.133066,0.547248,
+ 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
+ 0.399187,-0.679804,0.615237,4.74405,2.179337,0.556057,
+ 0.256335,-0.2349,0.937611,4.561299,2.133066,0.547248,
+ 0.399187,-0.679804,0.615237,4.74405,2.179337,0.556057,
+ 0.223925,-0.919003,0.324486,4.636582,2.263383,0.471997,
+ 0.051115,-0.906355,0.419413,4.533113,1.989009,0.578975,
+ 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
+ 0.256335,-0.2349,0.937611,4.561299,2.133066,0.547248,
+ -0.026148,0.006311,0.999638,4.971394,2.146686,0.224781,
+ -0.149467,-0.273889,0.950076,5.072165,2.04363,0.209228,
+ -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
+ -0.026148,0.006311,0.999638,4.971394,2.146686,0.224781,
+ -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
+ -0.989689,-0.143234,0,4.912303,2.162645,-0.00009,
+ -0.149467,-0.273889,0.950076,5.072165,2.04363,0.209228,
+ 0.06611,-0.359829,0.930673,5.127157,1.942759,0.211214,
+ 0.204472,-0.587725,0.782797,5.156645,1.942902,0.119993,
+ -0.149467,-0.273889,0.950076,5.072165,2.04363,0.209228,
+ 0.204472,-0.587725,0.782797,5.156645,1.942902,0.119993,
+ -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
+ 0.06611,-0.359829,0.930673,5.127157,1.942759,0.211214,
+ -0.091049,-0.145989,0.985087,5.152698,1.830661,0.287042,
+ 0.161367,-0.802085,0.574996,5.218821,1.803552,0.199306,
+ 0.06611,-0.359829,0.930673,5.127157,1.942759,0.211214,
+ 0.161367,-0.802085,0.574996,5.218821,1.803552,0.199306,
+ 0.204472,-0.587725,0.782797,5.156645,1.942902,0.119993,
+ -0.091049,-0.145989,0.985087,5.152698,1.830661,0.287042,
+ -0.12102,-0.514608,0.848842,5.133171,1.715563,0.334258,
+ 0.218068,-0.756333,0.616772,5.216855,1.636645,0.279797,
+ -0.091049,-0.145989,0.985087,5.152698,1.830661,0.287042,
+ 0.218068,-0.756333,0.616772,5.216855,1.636645,0.279797,
+ 0.161367,-0.802085,0.574996,5.218821,1.803552,0.199306,
+ 0.726183,-0.658007,0.199213,5.233176,1.442459,0.362988,
+ 0.218068,-0.756333,0.616772,5.216855,1.636645,0.279797,
+ -0.12102,-0.514608,0.848842,5.133171,1.715563,0.334258,
+ 0.063508,-0.739371,0.670296,5.103427,1.624404,0.434275,
+ 0.726183,-0.658007,0.199213,5.233176,1.442459,0.362988,
+ -0.12102,-0.514608,0.848842,5.133171,1.715563,0.334258,
+ 0.035735,-0.99787,0.054579,4.596478,1.512987,0.598982,
+ 0.485742,-0.874075,-0.006874,4.679116,1.438434,0.589658,
+ 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
+ 0.035735,-0.99787,0.054579,4.596478,1.512987,0.598982,
+ 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
+ 0.205809,-0.680492,0.703259,4.615408,1.639641,0.577768,
+ -0.034202,-0.995024,0.093584,4.560024,1.604023,0.589333,
+ 0.035735,-0.99787,0.054579,4.596478,1.512987,0.598982,
+ 0.205809,-0.680492,0.703259,4.615408,1.639641,0.577768,
+ 0.06465,-0.997821,-0.013157,4.477781,1.687858,0.597407,
+ -0.034202,-0.995024,0.093584,4.560024,1.604023,0.589333,
+ 0.205809,-0.680492,0.703259,4.615408,1.639641,0.577768,
+ 0.06465,-0.997821,-0.013157,4.477781,1.687858,0.597407,
+ 0.205809,-0.680492,0.703259,4.615408,1.639641,0.577768,
+ 0.396941,-0.593503,0.700137,4.560751,1.785154,0.562428,
+ 0.173736,-0.983834,-0.043437,4.459682,1.778884,0.588185,
+ 0.06465,-0.997821,-0.013157,4.477781,1.687858,0.597407,
+ 0.396941,-0.593503,0.700137,4.560751,1.785154,0.562428,
+ 0.173736,-0.983834,-0.043437,4.459682,1.778884,0.588185,
+ 0.396941,-0.593503,0.700137,4.560751,1.785154,0.562428,
+ 0.025716,-0.894111,0.447106,4.551484,1.841749,0.575191,
+ 0.173736,-0.983834,-0.043437,4.459682,1.778884,0.588185,
+ 0.025716,-0.894111,0.447106,4.551484,1.841749,0.575191,
+ 0.051115,-0.906355,0.419413,4.533113,1.989009,0.578975,
+ 0.173736,-0.983834,-0.043437,4.459682,1.778884,0.588185,
+ 0.051115,-0.906355,0.419413,4.533113,1.989009,0.578975,
+ 0.003817,-0.976864,0.213829,4.43261,1.878873,0.577888,
+ 0.003817,-0.976864,0.213829,4.43261,1.878873,0.577888,
+ 0.051115,-0.906355,0.419413,4.533113,1.989009,0.578975,
+ 0.256335,-0.2349,0.937611,4.561299,2.133066,0.547248,
+ 0.003817,-0.976864,0.213829,4.43261,1.878873,0.577888,
+ 0.256335,-0.2349,0.937611,4.561299,2.133066,0.547248,
+ 0.125846,-0.929941,0.345503,4.43302,2.024714,0.563794,
+ 0.244568,-0.044721,0.9686,4.739441,2.299169,0.369987,
+ 0.203778,-0.389736,0.898098,4.83289,2.262727,0.283787,
+ -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
+ 0.244568,-0.044721,0.9686,4.739441,2.299169,0.369987,
+ -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
+ 0.241652,-0.897637,0.368581,4.634996,2.369115,0.140117,
+ 0.223925,-0.919003,0.324486,4.636582,2.263383,0.471997,
+ 0.244568,-0.044721,0.9686,4.739441,2.299169,0.369987,
+ 0.241652,-0.897637,0.368581,4.634996,2.369115,0.140117,
+ 0.223925,-0.919003,0.324486,4.636582,2.263383,0.471997,
+ 0.241652,-0.897637,0.368581,4.634996,2.369115,0.140117,
+ 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
+ 0.223925,-0.919003,0.324486,4.636582,2.263383,0.471997,
+ 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
+ 0.231006,-0.859096,0.456717,4.472349,2.325133,0.443764,
+ 0.108306,-0.808441,0.578527,4.389484,2.190421,0.47332,
+ 0.256335,-0.2349,0.937611,4.561299,2.133066,0.547248,
+ 0.223925,-0.919003,0.324486,4.636582,2.263383,0.471997,
+ 0.108306,-0.808441,0.578527,4.389484,2.190421,0.47332,
+ 0.223925,-0.919003,0.324486,4.636582,2.263383,0.471997,
+ 0.231006,-0.859096,0.456717,4.472349,2.325133,0.443764,
+ 0.125846,-0.929941,0.345503,4.43302,2.024714,0.563794,
+ 0.256335,-0.2349,0.937611,4.561299,2.133066,0.547248,
+ 0.108306,-0.808441,0.578527,4.389484,2.190421,0.47332,
+ 0.169576,-0.140705,0.975421,4.982822,1.503071,0.507606,
+ 0.155382,-0.98726,0.034255,5.223191,1.371491,0.388069,
+ 0.726183,-0.658007,0.199213,5.233176,1.442459,0.362988,
+ 0.169576,-0.140705,0.975421,4.982822,1.503071,0.507606,
+ 0.726183,-0.658007,0.199213,5.233176,1.442459,0.362988,
+ 0.063508,-0.739371,0.670296,5.103427,1.624404,0.434275,
+ 0.111896,-0.605741,0.787755,4.927282,1.486953,0.526327,
+ 0.228199,-0.705361,0.671111,5.158322,1.23677,0.418043,
+ 0.155382,-0.98726,0.034255,5.223191,1.371491,0.388069,
+ 0.111896,-0.605741,0.787755,4.927282,1.486953,0.526327,
+ 0.155382,-0.98726,0.034255,5.223191,1.371491,0.388069,
+ 0.169576,-0.140705,0.975421,4.982822,1.503071,0.507606,
+ 0.002178,-0.833415,0.552643,4.79841,1.473149,0.570618,
+ 0.114701,-0.691525,0.713188,4.95536,1.236724,0.50523,
+ 0.228199,-0.705361,0.671111,5.158322,1.23677,0.418043,
+ 0.002178,-0.833415,0.552643,4.79841,1.473149,0.570618,
+ 0.228199,-0.705361,0.671111,5.158322,1.23677,0.418043,
+ 0.111896,-0.605741,0.787755,4.927282,1.486953,0.526327,
+ 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
+ 0.298912,-0.321997,0.898315,4.761601,1.363013,0.57137,
+ 0.114701,-0.691525,0.713188,4.95536,1.236724,0.50523,
+ 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
+ 0.114701,-0.691525,0.713188,4.95536,1.236724,0.50523,
+ 0.002178,-0.833415,0.552643,4.79841,1.473149,0.570618,
+ 0.485742,-0.874075,-0.006874,4.679116,1.438434,0.589658,
+ 0.298912,-0.321997,0.898315,4.761601,1.363013,0.57137,
+ 0.16399,-0.527953,0.833291,4.715646,1.502195,0.584339,
+ 0.204472,-0.587725,0.782797,5.156645,1.942902,0.119993,
+ 0.161367,-0.802085,0.574996,5.218821,1.803552,0.199306,
+ 0.241049,-0.626018,0.741618,5.321136,1.795562,0.119606,
+ 0.204472,-0.587725,0.782797,5.156645,1.942902,0.119993,
+ 0.241049,-0.626018,0.741618,5.321136,1.795562,0.119606,
+ -0.998597,-0.052951,0,5.177545,1.932323,0.000214,
+ 0.241049,-0.626018,0.741618,5.321136,1.795562,0.119606,
+ -0.99798,-0.063521,0,5.378289,1.768448,0.000441,
+ -0.998597,-0.052951,0,5.177545,1.932323,0.000214,
+ 0.241049,-0.626018,0.741618,5.321136,1.795562,0.119606,
+ 0.272751,-0.332382,0.902845,5.421809,1.685349,0.123555,
+ -0.925873,-0.377836,0,5.424281,1.721152,0.000496,
+ 0.241049,-0.626018,0.741618,5.321136,1.795562,0.119606,
+ -0.925873,-0.377836,0,5.424281,1.721152,0.000496,
+ -0.99798,-0.063521,0,5.378289,1.768448,0.000441,
+ 0.161397,-0.648358,0.744032,5.383208,1.619661,0.202452,
+ 0.272751,-0.332382,0.902845,5.421809,1.685349,0.123555,
+ 0.241049,-0.626018,0.741618,5.321136,1.795562,0.119606,
+ 0.161397,-0.648358,0.744032,5.383208,1.619661,0.202452,
+ 0.241049,-0.626018,0.741618,5.321136,1.795562,0.119606,
+ 0.161367,-0.802085,0.574996,5.218821,1.803552,0.199306,
+ 0.218068,-0.756333,0.616772,5.216855,1.636645,0.279797,
+ 0.142784,-0.229696,0.962732,5.373133,1.541142,0.246712,
+ 0.161397,-0.648358,0.744032,5.383208,1.619661,0.202452,
+ 0.218068,-0.756333,0.616772,5.216855,1.636645,0.279797,
+ 0.161397,-0.648358,0.744032,5.383208,1.619661,0.202452,
+ 0.161367,-0.802085,0.574996,5.218821,1.803552,0.199306,
+ 0.726183,-0.658007,0.199213,5.233176,1.442459,0.362988,
+ -0.045194,-0.595739,0.801906,5.334328,1.402713,0.332639,
+ 0.142784,-0.229696,0.962732,5.373133,1.541142,0.246712,
+ 0.726183,-0.658007,0.199213,5.233176,1.442459,0.362988,
+ 0.142784,-0.229696,0.962732,5.373133,1.541142,0.246712,
+ 0.218068,-0.756333,0.616772,5.216855,1.636645,0.279797,
+ 0.155382,-0.98726,0.034255,5.223191,1.371491,0.388069,
+ -0.016623,-0.697515,0.716377,5.296963,1.322443,0.357984,
+ -0.045194,-0.595739,0.801906,5.334328,1.402713,0.332639,
+ 0.155382,-0.98726,0.034255,5.223191,1.371491,0.388069,
+ -0.045194,-0.595739,0.801906,5.334328,1.402713,0.332639,
+ 0.726183,-0.658007,0.199213,5.233176,1.442459,0.362988,
+ 0.228199,-0.705361,0.671111,5.158322,1.23677,0.418043,
+ -0.105003,-0.636187,0.764356,5.260653,1.184173,0.352062,
+ -0.016623,-0.697515,0.716377,5.296963,1.322443,0.357984,
+ 0.228199,-0.705361,0.671111,5.158322,1.23677,0.418043,
+ -0.016623,-0.697515,0.716377,5.296963,1.322443,0.357984,
+ 0.155382,-0.98726,0.034255,5.223191,1.371491,0.388069,
+ 0.009824,-0.644035,0.764933,5.250485,1.123029,0.385234,
+ -0.105003,-0.636187,0.764356,5.260653,1.184173,0.352062,
+ 0.228199,-0.705361,0.671111,5.158322,1.23677,0.418043,
+ 0.114701,-0.691525,0.713188,4.95536,1.236724,0.50523,
+ -0.023775,-0.598435,0.800818,4.991713,1.163096,0.504149,
+ 0.009824,-0.644035,0.764933,5.250485,1.123029,0.385234,
+ 0.114701,-0.691525,0.713188,4.95536,1.236724,0.50523,
+ 0.009824,-0.644035,0.764933,5.250485,1.123029,0.385234,
+ 0.228199,-0.705361,0.671111,5.158322,1.23677,0.418043,
+ 0.200825,-0.971974,0.122213,4.733657,1.227371,0.592883,
+ -0.023775,-0.598435,0.800818,4.991713,1.163096,0.504149,
+ 0.114701,-0.691525,0.713188,4.95536,1.236724,0.50523,
+ 0.200825,-0.971974,0.122213,4.733657,1.227371,0.592883,
+ 0.114701,-0.691525,0.713188,4.95536,1.236724,0.50523,
+ 0.298912,-0.321997,0.898315,4.761601,1.363013,0.57137,
+ 0.123418,-0.784469,0.607763,4.641547,1.285422,0.622034,
+ 0.200825,-0.971974,0.122213,4.733657,1.227371,0.592883,
+ 0.298912,-0.321997,0.898315,4.761601,1.363013,0.57137,
+ 0.123418,-0.784469,0.607763,4.641547,1.285422,0.622034,
+ 0.298912,-0.321997,0.898315,4.761601,1.363013,0.57137,
+ 0.485742,-0.874075,-0.006874,4.679116,1.438434,0.589658,
+ 0.050019,-0.552867,0.831767,4.522247,1.398278,0.644892,
+ 0.123418,-0.784469,0.607763,4.641547,1.285422,0.622034,
+ 0.485742,-0.874075,-0.006874,4.679116,1.438434,0.589658,
+ 0.050019,-0.552867,0.831767,4.522247,1.398278,0.644892,
+ 0.485742,-0.874075,-0.006874,4.679116,1.438434,0.589658,
+ 0.035735,-0.99787,0.054579,4.596478,1.512987,0.598982,
+ 0.037801,-0.082839,0.995846,4.430999,1.535753,0.638888,
+ 0.050019,-0.552867,0.831767,4.522247,1.398278,0.644892,
+ 0.035735,-0.99787,0.054579,4.596478,1.512987,0.598982,
+ 0.037801,-0.082839,0.995846,4.430999,1.535753,0.638888,
+ 0.035735,-0.99787,0.054579,4.596478,1.512987,0.598982,
+ -0.034202,-0.995024,0.093584,4.560024,1.604023,0.589333,
+ -0.196146,-0.333078,0.922272,4.404221,1.662433,0.61661,
+ 0.037801,-0.082839,0.995846,4.430999,1.535753,0.638888,
+ -0.034202,-0.995024,0.093584,4.560024,1.604023,0.589333,
+ -0.196146,-0.333078,0.922272,4.404221,1.662433,0.61661,
+ -0.034202,-0.995024,0.093584,4.560024,1.604023,0.589333,
+ 0.06465,-0.997821,-0.013157,4.477781,1.687858,0.597407,
+ -0.196146,-0.333078,0.922272,4.404221,1.662433,0.61661,
+ 0.06465,-0.997821,-0.013157,4.477781,1.687858,0.597407,
+ 0.173736,-0.983834,-0.043437,4.459682,1.778884,0.588185,
+ -0.196146,-0.333078,0.922272,4.404221,1.662433,0.61661,
+ 0.173736,-0.983834,-0.043437,4.459682,1.778884,0.588185,
+ -0.106358,-0.394397,0.912765,4.38638,1.770868,0.596666,
+ -0.106358,-0.394397,0.912765,4.38638,1.770868,0.596666,
+ 0.173736,-0.983834,-0.043437,4.459682,1.778884,0.588185,
+ 0.003817,-0.976864,0.213829,4.43261,1.878873,0.577888,
+ -0.106358,-0.394397,0.912765,4.38638,1.770868,0.596666,
+ 0.003817,-0.976864,0.213829,4.43261,1.878873,0.577888,
+ -0.277696,-0.435918,0.856073,4.377095,1.871713,0.595743,
+ 0.272751,-0.332382,0.902845,5.421809,1.685349,0.123555,
+ -0.301162,-0.110219,0.947182,5.604888,1.546091,0.113773,
+ 0.027992,0.999608,0,5.588763,1.573846,0.000686,
+ 0.272751,-0.332382,0.902845,5.421809,1.685349,0.123555,
+ 0.027992,0.999608,0,5.588763,1.573846,0.000686,
+ -0.925873,-0.377836,0,5.424281,1.721152,0.000496,
+ 0.161397,-0.648358,0.744032,5.383208,1.619661,0.202452,
+ -0.430969,-0.132769,0.892546,5.566339,1.498677,0.190905,
+ -0.301162,-0.110219,0.947182,5.604888,1.546091,0.113773,
+ 0.161397,-0.648358,0.744032,5.383208,1.619661,0.202452,
+ -0.301162,-0.110219,0.947182,5.604888,1.546091,0.113773,
+ 0.272751,-0.332382,0.902845,5.421809,1.685349,0.123555,
+ 0.142784,-0.229696,0.962732,5.373133,1.541142,0.246712,
+ -0.293162,-0.051827,0.954657,5.528186,1.44018,0.250666,
+ -0.430969,-0.132769,0.892546,5.566339,1.498677,0.190905,
+ 0.142784,-0.229696,0.962732,5.373133,1.541142,0.246712,
+ -0.430969,-0.132769,0.892546,5.566339,1.498677,0.190905,
+ 0.161397,-0.648358,0.744032,5.383208,1.619661,0.202452,
+ -0.045194,-0.595739,0.801906,5.334328,1.402713,0.332639,
+ -0.034138,0.050771,0.998127,5.471928,1.345179,0.313899,
+ -0.293162,-0.051827,0.954657,5.528186,1.44018,0.250666,
+ -0.045194,-0.595739,0.801906,5.334328,1.402713,0.332639,
+ -0.293162,-0.051827,0.954657,5.528186,1.44018,0.250666,
+ 0.142784,-0.229696,0.962732,5.373133,1.541142,0.246712,
+ -0.016623,-0.697515,0.716377,5.296963,1.322443,0.357984,
+ -0.101883,0.176778,0.978963,5.425783,1.264372,0.329687,
+ -0.034138,0.050771,0.998127,5.471928,1.345179,0.313899,
+ -0.016623,-0.697515,0.716377,5.296963,1.322443,0.357984,
+ -0.034138,0.050771,0.998127,5.471928,1.345179,0.313899,
+ -0.045194,-0.595739,0.801906,5.334328,1.402713,0.332639,
+ -0.105003,-0.636187,0.764356,5.260653,1.184173,0.352062,
+ -0.172671,0.234525,0.956652,5.397967,1.174238,0.346802,
+ -0.101883,0.176778,0.978963,5.425783,1.264372,0.329687,
+ -0.105003,-0.636187,0.764356,5.260653,1.184173,0.352062,
+ -0.101883,0.176778,0.978963,5.425783,1.264372,0.329687,
+ -0.016623,-0.697515,0.716377,5.296963,1.322443,0.357984,
+ 0.009824,-0.644035,0.764933,5.250485,1.123029,0.385234,
+ -0.317809,0.237298,0.91798,5.388455,1.119419,0.351883,
+ -0.172671,0.234525,0.956652,5.397967,1.174238,0.346802,
+ 0.009824,-0.644035,0.764933,5.250485,1.123029,0.385234,
+ -0.172671,0.234525,0.956652,5.397967,1.174238,0.346802,
+ -0.105003,-0.636187,0.764356,5.260653,1.184173,0.352062,
+ -0.419631,0.061765,0.905591,5.685194,1.452202,0.188749,
+ -0.434729,0.079706,0.897027,5.730427,1.435668,0.209848,
+ -0.31398,0.125786,0.94106,5.741781,1.463956,0.124891,
+ -0.419631,0.061765,0.905591,5.685194,1.452202,0.188749,
+ -0.31398,0.125786,0.94106,5.741781,1.463956,0.124891,
+ -0.241533,0.200654,0.949421,5.687035,1.499636,0.110765,
+ -0.400711,0.089186,0.911853,5.647186,1.394606,0.257833,
+ 0.274471,0.961025,0.033122,5.608974,1.317869,0.319719,
+ -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
+ 0.311768,0.950117,-0.008871,5.563253,1.235295,0.317238,
+ 0.563605,0.822456,0.076915,5.681726,1.282503,0.333871,
+ -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
+ 0.311768,0.950117,-0.008871,5.563253,1.235295,0.317238,
+ -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
+ 0.274471,0.961025,0.033122,5.608974,1.317869,0.319719,
+ 0.381066,0.919021,0.100938,5.580797,1.174135,0.351054,
+ 0.609817,0.770093,0.187296,5.672187,1.164767,0.35408,
+ 0.563605,0.822456,0.076915,5.681726,1.282503,0.333871,
+ 0.381066,0.919021,0.100938,5.580797,1.174135,0.351054,
+ 0.563605,0.822456,0.076915,5.681726,1.282503,0.333871,
+ 0.311768,0.950117,-0.008871,5.563253,1.235295,0.317238,
+ 0.027992,0.999608,0,5.588763,1.573846,0.000686,
+ -0.301162,-0.110219,0.947182,5.604888,1.546091,0.113773,
+ -0.241533,0.200654,0.949421,5.687035,1.499636,0.110765,
+ 0.027992,0.999608,0,5.588763,1.573846,0.000686,
+ -0.241533,0.200654,0.949421,5.687035,1.499636,0.110765,
+ -0.026558,-0.999647,0,5.680007,1.510009,0.000786,
+ -0.430969,-0.132769,0.892546,5.566339,1.498677,0.190905,
+ -0.419631,0.061765,0.905591,5.685194,1.452202,0.188749,
+ -0.241533,0.200654,0.949421,5.687035,1.499636,0.110765,
+ -0.430969,-0.132769,0.892546,5.566339,1.498677,0.190905,
+ -0.241533,0.200654,0.949421,5.687035,1.499636,0.110765,
+ -0.301162,-0.110219,0.947182,5.604888,1.546091,0.113773,
+ -0.430969,-0.132769,0.892546,5.566339,1.498677,0.190905,
+ -0.293162,-0.051827,0.954657,5.528186,1.44018,0.250666,
+ -0.400711,0.089186,0.911853,5.647186,1.394606,0.257833,
+ -0.430969,-0.132769,0.892546,5.566339,1.498677,0.190905,
+ -0.400711,0.089186,0.911853,5.647186,1.394606,0.257833,
+ -0.419631,0.061765,0.905591,5.685194,1.452202,0.188749,
+ -0.034138,0.050771,0.998127,5.471928,1.345179,0.313899,
+ 0.274471,0.961025,0.033122,5.608974,1.317869,0.319719,
+ -0.400711,0.089186,0.911853,5.647186,1.394606,0.257833,
+ -0.034138,0.050771,0.998127,5.471928,1.345179,0.313899,
+ -0.400711,0.089186,0.911853,5.647186,1.394606,0.257833,
+ -0.293162,-0.051827,0.954657,5.528186,1.44018,0.250666,
+ -0.101883,0.176778,0.978963,5.425783,1.264372,0.329687,
+ 0.311768,0.950117,-0.008871,5.563253,1.235295,0.317238,
+ 0.274471,0.961025,0.033122,5.608974,1.317869,0.319719,
+ -0.101883,0.176778,0.978963,5.425783,1.264372,0.329687,
+ 0.274471,0.961025,0.033122,5.608974,1.317869,0.319719,
+ -0.034138,0.050771,0.998127,5.471928,1.345179,0.313899,
+ -0.172671,0.234525,0.956652,5.397967,1.174238,0.346802,
+ 0.381066,0.919021,0.100938,5.580797,1.174135,0.351054,
+ 0.311768,0.950117,-0.008871,5.563253,1.235295,0.317238,
+ -0.172671,0.234525,0.956652,5.397967,1.174238,0.346802,
+ 0.311768,0.950117,-0.008871,5.563253,1.235295,0.317238,
+ -0.101883,0.176778,0.978963,5.425783,1.264372,0.329687,
+ -0.317809,0.237298,0.91798,5.388455,1.119419,0.351883,
+ 0.651262,0.697944,0.297879,5.47963,1.11131,0.364188,
+ 0.381066,0.919021,0.100938,5.580797,1.174135,0.351054,
+ -0.317809,0.237298,0.91798,5.388455,1.119419,0.351883,
+ 0.381066,0.919021,0.100938,5.580797,1.174135,0.351054,
+ -0.172671,0.234525,0.956652,5.397967,1.174238,0.346802,
+ -0.081905,0.996619,-0.006486,5.813217,1.415581,0.195261,
+ -0.134248,0.990294,-0.035988,5.886832,1.385674,0.172365,
+ -0.11884,0.991349,-0.055713,5.915025,1.382159,0.13682,
+ -0.081905,0.996619,-0.006486,5.813217,1.415581,0.195261,
+ -0.11884,0.991349,-0.055713,5.915025,1.382159,0.13682,
+ -0.062808,0.99609,0.062134,5.842092,1.427708,0.130724,
+ -0.11884,0.991349,-0.055713,5.915025,1.382159,0.13682,
+ 0.448666,0.893201,0.029856,5.979357,1.325532,0.125337,
+ 0.663563,0.74812,0.000025,5.963117,1.307775,0.001098,
+ -0.11884,0.991349,-0.055713,5.915025,1.382159,0.13682,
+ 0.663563,0.74812,0.000025,5.963117,1.307775,0.001098,
+ -0.016213,0.999869,0,5.908842,1.388968,0.001026,
+ -0.134248,0.990294,-0.035988,5.886832,1.385674,0.172365,
+ 0.731768,0.675964,0.087106,5.941384,1.330818,0.178936,
+ 0.448666,0.893201,0.029856,5.979357,1.325532,0.125337,
+ -0.134248,0.990294,-0.035988,5.886832,1.385674,0.172365,
+ 0.448666,0.893201,0.029856,5.979357,1.325532,0.125337,
+ -0.11884,0.991349,-0.055713,5.915025,1.382159,0.13682,
+ -0.31398,0.125786,0.94106,5.741781,1.463956,0.124891,
+ -0.062808,0.99609,0.062134,5.842092,1.427708,0.130724,
+ 0.569495,0.821995,-0.000075,5.835498,1.43628,0.000946,
+ -0.31398,0.125786,0.94106,5.741781,1.463956,0.124891,
+ 0.569495,0.821995,-0.000075,5.835498,1.43628,0.000946,
+ 0.694651,0.719347,0.000019,5.743997,1.482739,0.000851,
+ -0.434729,0.079706,0.897027,5.730427,1.435668,0.209848,
+ -0.081905,0.996619,-0.006486,5.813217,1.415581,0.195261,
+ -0.062808,0.99609,0.062134,5.842092,1.427708,0.130724,
+ -0.434729,0.079706,0.897027,5.730427,1.435668,0.209848,
+ -0.062808,0.99609,0.062134,5.842092,1.427708,0.130724,
+ -0.31398,0.125786,0.94106,5.741781,1.463956,0.124891,
+ -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
+ -0.0511,0.977083,-0.206633,5.783731,1.341471,0.28459,
+ -0.081905,0.996619,-0.006486,5.813217,1.415581,0.195261,
+ -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
+ -0.081905,0.996619,-0.006486,5.813217,1.415581,0.195261,
+ -0.434729,0.079706,0.897027,5.730427,1.435668,0.209848,
+ -0.0511,0.977083,-0.206633,5.783731,1.341471,0.28459,
+ 0.481644,0.842268,-0.242082,5.847989,1.311569,0.261476,
+ -0.134248,0.990294,-0.035988,5.886832,1.385674,0.172365,
+ -0.0511,0.977083,-0.206633,5.783731,1.341471,0.28459,
+ -0.134248,0.990294,-0.035988,5.886832,1.385674,0.172365,
+ -0.081905,0.996619,-0.006486,5.813217,1.415581,0.195261,
+ 0.481644,0.842268,-0.242082,5.847989,1.311569,0.261476,
+ 0.794567,0.588129,-0.15089,5.931474,1.233483,0.215613,
+ 0.731768,0.675964,0.087106,5.941384,1.330818,0.178936,
+ 0.481644,0.842268,-0.242082,5.847989,1.311569,0.261476,
+ 0.731768,0.675964,0.087106,5.941384,1.330818,0.178936,
+ -0.134248,0.990294,-0.035988,5.886832,1.385674,0.172365,
+ 0.731768,0.675964,0.087106,5.941384,1.330818,0.178936,
+ 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
+ 0.448666,0.893201,0.029856,5.979357,1.325532,0.125337,
+ 0.448666,0.893201,0.029856,5.979357,1.325532,0.125337,
+ 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
+ 0.617634,0.786466,0.000062,5.963527,1.232407,0.001121,
+ 0.448666,0.893201,0.029856,5.979357,1.325532,0.125337,
+ 0.617634,0.786466,0.000062,5.963527,1.232407,0.001121,
+ 0.663563,0.74812,0.000025,5.963117,1.307775,0.001098,
+ 0.794567,0.588129,-0.15089,5.931474,1.233483,0.215613,
+ 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
+ 0.731768,0.675964,0.087106,5.941384,1.330818,0.178936,
+ 0.461485,0.788926,-0.405742,5.961686,1.110978,0.090324,
+ 0.651313,0.75881,-0.000286,5.92711,1.131195,0.001118,
+ 0.617634,0.786466,0.000062,5.963527,1.232407,0.001121,
+ 0.461485,0.788926,-0.405742,5.961686,1.110978,0.090324,
+ 0.617634,0.786466,0.000062,5.963527,1.232407,0.001121,
+ 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
+ 0.461485,0.788926,-0.405742,5.961686,1.110978,0.090324,
+ 0.800967,0.453079,-0.391371,5.934596,1.054796,0.077039,
+ 0.909103,0.416568,-0.001454,5.908782,1.066916,0.001121,
+ 0.461485,0.788926,-0.405742,5.961686,1.110978,0.090324,
+ 0.909103,0.416568,-0.001454,5.908782,1.066916,0.001121,
+ 0.651313,0.75881,-0.000286,5.92711,1.131195,0.001118,
+ 0.000755,0.939586,-0.342312,5.950684,1.082725,0.175648,
+ 0.693689,0.317887,-0.646331,5.923808,1.025283,0.153084,
+ 0.800967,0.453079,-0.391371,5.934596,1.054796,0.077039,
+ 0.000755,0.939586,-0.342312,5.950684,1.082725,0.175648,
+ 0.800967,0.453079,-0.391371,5.934596,1.054796,0.077039,
+ 0.461485,0.788926,-0.405742,5.961686,1.110978,0.090324,
+ 0.288171,0.239223,-0.927216,5.763952,1.062109,0.338641,
+ 0.104327,0.725166,-0.680625,5.755282,1.004149,0.307505,
+ -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
+ 0.288171,0.239223,-0.927216,5.763952,1.062109,0.338641,
+ -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
+ 0.525316,0.261332,-0.809783,5.884856,1.062202,0.249545,
+ 0.288171,0.239223,-0.927216,5.763952,1.062109,0.338641,
+ 0.525316,0.261332,-0.809783,5.884856,1.062202,0.249545,
+ 0.204286,0.745568,-0.634347,5.800778,1.078596,0.31945,
+ 0.525316,0.261332,-0.809783,5.884856,1.062202,0.249545,
+ 0.000755,0.939586,-0.342312,5.950684,1.082725,0.175648,
+ 0.969409,0.243854,0.027951,5.959462,1.157227,0.187097,
+ 0.525316,0.261332,-0.809783,5.884856,1.062202,0.249545,
+ 0.969409,0.243854,0.027951,5.959462,1.157227,0.187097,
+ 0.811896,0.498733,0.303464,5.912147,1.117911,0.254197,
+ -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
+ 0.693689,0.317887,-0.646331,5.923808,1.025283,0.153084,
+ 0.000755,0.939586,-0.342312,5.950684,1.082725,0.175648,
+ -0.051423,0.948155,-0.31362,5.85775,0.997026,0.236768,
+ 0.000755,0.939586,-0.342312,5.950684,1.082725,0.175648,
+ 0.525316,0.261332,-0.809783,5.884856,1.062202,0.249545,
+ 0.525316,0.261332,-0.809783,5.884856,1.062202,0.249545,
+ 0.811896,0.498733,0.303464,5.912147,1.117911,0.254197,
+ 0.603382,-0.138832,-0.785275,5.837875,1.141493,0.305184,
+ 0.525316,0.261332,-0.809783,5.884856,1.062202,0.249545,
+ 0.603382,-0.138832,-0.785275,5.837875,1.141493,0.305184,
+ 0.204286,0.745568,-0.634347,5.800778,1.078596,0.31945,
+ 0.204286,0.745568,-0.634347,5.800778,1.078596,0.31945,
+ 0.603382,-0.138832,-0.785275,5.837875,1.141493,0.305184,
+ 0.335985,-0.093512,-0.937214,5.77341,1.225861,0.323025,
+ 0.204286,0.745568,-0.634347,5.800778,1.078596,0.31945,
+ 0.335985,-0.093512,-0.937214,5.77341,1.225861,0.323025,
+ 0.609817,0.770093,0.187296,5.672187,1.164767,0.35408,
+ 0.609817,0.770093,0.187296,5.672187,1.164767,0.35408,
+ 0.335985,-0.093512,-0.937214,5.77341,1.225861,0.323025,
+ 0.104604,0.236958,-0.965872,5.764774,1.279824,0.308562,
+ 0.609817,0.770093,0.187296,5.672187,1.164767,0.35408,
+ 0.104604,0.236958,-0.965872,5.764774,1.279824,0.308562,
+ 0.563605,0.822456,0.076915,5.681726,1.282503,0.333871,
+ 0.563605,0.822456,0.076915,5.681726,1.282503,0.333871,
+ 0.104604,0.236958,-0.965872,5.764774,1.279824,0.308562,
+ -0.0511,0.977083,-0.206633,5.783731,1.341471,0.28459,
+ 0.563605,0.822456,0.076915,5.681726,1.282503,0.333871,
+ -0.0511,0.977083,-0.206633,5.783731,1.341471,0.28459,
+ -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
+ -0.163152,0.699849,-0.695408,5.681086,1.054964,0.35586,
+ 0.288171,0.239223,-0.927216,5.763952,1.062109,0.338641,
+ -0.000715,-0.295728,-0.955272,5.690122,1.092917,0.37085,
+ -0.000715,-0.295728,-0.955272,5.690122,1.092917,0.37085,
+ 0.288171,0.239223,-0.927216,5.763952,1.062109,0.338641,
+ 0.204286,0.745568,-0.634347,5.800778,1.078596,0.31945,
+ -0.000715,-0.295728,-0.955272,5.690122,1.092917,0.37085,
+ 0.204286,0.745568,-0.634347,5.800778,1.078596,0.31945,
+ 0.609817,0.770093,0.187296,5.672187,1.164767,0.35408,
+ -0.090939,0.953561,-0.287143,5.598282,1.094735,0.386994,
+ -0.000715,-0.295728,-0.955272,5.690122,1.092917,0.37085,
+ 0.609817,0.770093,0.187296,5.672187,1.164767,0.35408,
+ -0.090939,0.953561,-0.287143,5.598282,1.094735,0.386994,
+ 0.609817,0.770093,0.187296,5.672187,1.164767,0.35408,
+ 0.381066,0.919021,0.100938,5.580797,1.174135,0.351054,
+ 0.651262,0.697944,0.297879,5.47963,1.11131,0.364188,
+ -0.090939,0.953561,-0.287143,5.598282,1.094735,0.386994,
+ 0.381066,0.919021,0.100938,5.580797,1.174135,0.351054,
+ 0.008972,0.708004,-0.706152,5.470775,1.009574,0.355371,
+ -0.090939,0.953561,-0.287143,5.598282,1.094735,0.386994,
+ 0.651262,0.697944,0.297879,5.47963,1.11131,0.364188,
+ 0.809878,-0.450756,0.375387,5.580223,1.04747,0.372696,
+ -0.163152,0.699849,-0.695408,5.681086,1.054964,0.35586,
+ -0.000715,-0.295728,-0.955272,5.690122,1.092917,0.37085,
+ 0.809878,-0.450756,0.375387,5.580223,1.04747,0.372696,
+ -0.000715,-0.295728,-0.955272,5.690122,1.092917,0.37085,
+ -0.090939,0.953561,-0.287143,5.598282,1.094735,0.386994,
+ -0.01139,0.953897,-0.299918,5.580727,0.99933,0.349867,
+ -0.011269,-0.268801,-0.96313,5.672385,1.007694,0.341778,
+ -0.163152,0.699849,-0.695408,5.681086,1.054964,0.35586,
+ -0.01139,0.953897,-0.299918,5.580727,0.99933,0.349867,
+ -0.163152,0.699849,-0.695408,5.681086,1.054964,0.35586,
+ 0.809878,-0.450756,0.375387,5.580223,1.04747,0.372696,
+ -0.090939,0.953561,-0.287143,5.598282,1.094735,0.386994,
+ 0.008972,0.708004,-0.706152,5.470775,1.009574,0.355371,
+ 0.809878,-0.450756,0.375387,5.580223,1.04747,0.372696,
+ 0.008972,0.708004,-0.706152,5.470775,1.009574,0.355371,
+ -0.151742,0.274295,-0.949598,5.535184,0.98018,0.341257,
+ -0.01139,0.953897,-0.299918,5.580727,0.99933,0.349867,
+ 0.008972,0.708004,-0.706152,5.470775,1.009574,0.355371,
+ -0.01139,0.953897,-0.299918,5.580727,0.99933,0.349867,
+ 0.809878,-0.450756,0.375387,5.580223,1.04747,0.372696,
+ 0.795507,-0.586003,0.154171,5.425352,1.035967,0.34272,
+ 0.008972,0.708004,-0.706152,5.470775,1.009574,0.355371,
+ 0.651262,0.697944,0.297879,5.47963,1.11131,0.364188,
+ 0.795507,-0.586003,0.154171,5.425352,1.035967,0.34272,
+ 0.651262,0.697944,0.297879,5.47963,1.11131,0.364188,
+ -0.317809,0.237298,0.91798,5.388455,1.119419,0.351883,
+ 0.743898,-0.655713,-0.129057,5.434594,0.970412,0.330823,
+ 0.008972,0.708004,-0.706152,5.470775,1.009574,0.355371,
+ 0.795507,-0.586003,0.154171,5.425352,1.035967,0.34272,
+ 0.743898,-0.655713,-0.129057,5.434594,0.970412,0.330823,
+ -0.151742,0.274295,-0.949598,5.535184,0.98018,0.341257,
+ 0.008972,0.708004,-0.706152,5.470775,1.009574,0.355371,
+ 0.743898,-0.655713,-0.129057,5.434594,0.970412,0.330823,
+ 0.083641,-0.81989,0.566378,5.480649,0.941387,0.316248,
+ -0.151742,0.274295,-0.949598,5.535184,0.98018,0.341257,
+ 0.042118,-0.881893,0.469564,5.379461,1.045817,0.349748,
+ 0.795507,-0.586003,0.154171,5.425352,1.035967,0.34272,
+ -0.317809,0.237298,0.91798,5.388455,1.119419,0.351883,
+ 0.713982,0.301535,0.631907,5.370709,0.980272,0.337432,
+ 0.743898,-0.655713,-0.129057,5.434594,0.970412,0.330823,
+ 0.795507,-0.586003,0.154171,5.425352,1.035967,0.34272,
+ 0.713982,0.301535,0.631907,5.370709,0.980272,0.337432,
+ 0.795507,-0.586003,0.154171,5.425352,1.035967,0.34272,
+ 0.042118,-0.881893,0.469564,5.379461,1.045817,0.349748,
+ 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
+ 0.083641,-0.81989,0.566378,5.480649,0.941387,0.316248,
+ 0.743898,-0.655713,-0.129057,5.434594,0.970412,0.330823,
+ 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
+ 0.743898,-0.655713,-0.129057,5.434594,0.970412,0.330823,
+ 0.713982,0.301535,0.631907,5.370709,0.980272,0.337432,
+ 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
+ 0.21141,-0.953268,0.215838,5.511556,0.863525,0.177613,
+ 0.176955,-0.903058,0.391373,5.546347,0.916044,0.246782,
+ 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
+ 0.176955,-0.903058,0.391373,5.546347,0.916044,0.246782,
+ 0.083641,-0.81989,0.566378,5.480649,0.941387,0.316248,
+ 0.21141,-0.953268,0.215838,5.511556,0.863525,0.177613,
+ 0.288841,-0.745301,-0.600914,5.60337,0.852748,0.162335,
+ 0.571342,-0.680689,-0.45851,5.638369,0.904402,0.222548,
+ 0.21141,-0.953268,0.215838,5.511556,0.863525,0.177613,
+ 0.571342,-0.680689,-0.45851,5.638369,0.904402,0.222548,
+ 0.176955,-0.903058,0.391373,5.546347,0.916044,0.246782,
+ 0.288841,-0.745301,-0.600914,5.60337,0.852748,0.162335,
+ 0.237421,-0.963021,0.127366,5.70463,0.849158,0.12813,
+ 0.388502,-0.6643,-0.63857,5.748613,0.92049,0.205099,
+ 0.288841,-0.745301,-0.600914,5.60337,0.852748,0.162335,
+ 0.388502,-0.6643,-0.63857,5.748613,0.92049,0.205099,
+ 0.571342,-0.680689,-0.45851,5.638369,0.904402,0.222548,
+ 0.157921,-0.851177,-0.500559,5.241466,1.040469,0.383965,
+ 0.042118,-0.881893,0.469564,5.379461,1.045817,0.349748,
+ -0.317809,0.237298,0.91798,5.388455,1.119419,0.351883,
+ 0.157921,-0.851177,-0.500559,5.241466,1.040469,0.383965,
+ -0.317809,0.237298,0.91798,5.388455,1.119419,0.351883,
+ 0.009824,-0.644035,0.764933,5.250485,1.123029,0.385234,
+ 0.254106,-0.95176,0.171999,5.223571,0.974029,0.362117,
+ 0.713982,0.301535,0.631907,5.370709,0.980272,0.337432,
+ 0.042118,-0.881893,0.469564,5.379461,1.045817,0.349748,
+ 0.254106,-0.95176,0.171999,5.223571,0.974029,0.362117,
+ 0.042118,-0.881893,0.469564,5.379461,1.045817,0.349748,
+ 0.157921,-0.851177,-0.500559,5.241466,1.040469,0.383965,
+ 0.165259,-0.797056,-0.580854,5.299005,0.908991,0.260177,
+ 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
+ 0.713982,0.301535,0.631907,5.370709,0.980272,0.337432,
+ 0.243744,-0.944481,0.220328,5.197562,0.922406,0.302473,
+ 0.165259,-0.797056,-0.580854,5.299005,0.908991,0.260177,
+ 0.713982,0.301535,0.631907,5.370709,0.980272,0.337432,
+ 0.243744,-0.944481,0.220328,5.197562,0.922406,0.302473,
+ 0.713982,0.301535,0.631907,5.370709,0.980272,0.337432,
+ 0.254106,-0.95176,0.171999,5.223571,0.974029,0.362117,
+ 0.20994,-0.930128,0.301309,5.851404,0.929008,0.105362,
+ -0.05208,-0.715695,0.696469,5.797411,0.880032,0.072306,
+ 0.953994,-0.299798,-0.004126,5.78079,0.891286,0.001059,
+ 0.20994,-0.930128,0.301309,5.851404,0.929008,0.105362,
+ 0.953994,-0.299798,-0.004126,5.78079,0.891286,0.001059,
+ 0.997356,-0.072614,-0.002907,5.836005,0.945722,0.001092,
+ 0.388502,-0.6643,-0.63857,5.748613,0.92049,0.205099,
+ 0.237421,-0.963021,0.127366,5.70463,0.849158,0.12813,
+ -0.05208,-0.715695,0.696469,5.797411,0.880032,0.072306,
+ 0.388502,-0.6643,-0.63857,5.748613,0.92049,0.205099,
+ -0.05208,-0.715695,0.696469,5.797411,0.880032,0.072306,
+ 0.20994,-0.930128,0.301309,5.851404,0.929008,0.105362,
+ 0.874313,-0.485341,-0.004579,5.679621,0.8395,0.000985,
+ 0.953994,-0.299798,-0.004126,5.78079,0.891286,0.001059,
+ -0.05208,-0.715695,0.696469,5.797411,0.880032,0.072306,
+ 0.237421,-0.963021,0.127366,5.70463,0.849158,0.12813,
+ 0.287073,-0.905921,0.311283,5.568745,0.834653,0.07139,
+ 0.874313,-0.485341,-0.004579,5.679621,0.8395,0.000985,
+ 0.237421,-0.963021,0.127366,5.70463,0.849158,0.12813,
+ 0.874313,-0.485341,-0.004579,5.679621,0.8395,0.000985,
+ -0.05208,-0.715695,0.696469,5.797411,0.880032,0.072306,
+ 0.287073,-0.905921,0.311283,5.568745,0.834653,0.07139,
+ 0.84332,-0.537393,-0.004381,5.579253,0.837796,0.000896,
+ 0.874313,-0.485341,-0.004579,5.679621,0.8395,0.000985,
+ 0.288841,-0.745301,-0.600914,5.60337,0.852748,0.162335,
+ 0.267121,-0.895396,0.356249,5.449164,0.847535,0.103909,
+ 0.287073,-0.905921,0.311283,5.568745,0.834653,0.07139,
+ 0.288841,-0.745301,-0.600914,5.60337,0.852748,0.162335,
+ 0.287073,-0.905921,0.311283,5.568745,0.834653,0.07139,
+ 0.237421,-0.963021,0.127366,5.70463,0.849158,0.12813,
+ -0.501598,-0.526154,0.686704,5.137075,0.824518,0.144842,
+ 0.598791,-0.8009,-0.003109,5.112563,0.840686,0.00048,
+ 0.832605,-0.553861,-0.002629,5.213434,0.856784,0.000565,
+ -0.501598,-0.526154,0.686704,5.137075,0.824518,0.144842,
+ 0.832605,-0.553861,-0.002629,5.213434,0.856784,0.000565,
+ -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
+ 0.21141,-0.953268,0.215838,5.511556,0.863525,0.177613,
+ -0.538845,-0.659239,0.524452,5.3569,0.85112,0.138324,
+ 0.267121,-0.895396,0.356249,5.449164,0.847535,0.103909,
+ 0.21141,-0.953268,0.215838,5.511556,0.863525,0.177613,
+ 0.267121,-0.895396,0.356249,5.449164,0.847535,0.103909,
+ 0.288841,-0.745301,-0.600914,5.60337,0.852748,0.162335,
+ 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
+ -0.53682,-0.608254,0.58468,5.26443,0.855571,0.181694,
+ -0.538845,-0.659239,0.524452,5.3569,0.85112,0.138324,
+ 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
+ -0.538845,-0.659239,0.524452,5.3569,0.85112,0.138324,
+ 0.21141,-0.953268,0.215838,5.511556,0.863525,0.177613,
+ -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
+ 0.832605,-0.553861,-0.002629,5.213434,0.856784,0.000565,
+ 0.224122,-0.97456,-0.001209,5.323232,0.866039,0.00066,
+ 0.267121,-0.895396,0.356249,5.449164,0.847535,0.103909,
+ -0.020035,-0.999799,-0.000148,5.469641,0.838722,0.000798,
+ 0.84332,-0.537393,-0.004381,5.579253,0.837796,0.000896,
+ 0.267121,-0.895396,0.356249,5.449164,0.847535,0.103909,
+ 0.84332,-0.537393,-0.004381,5.579253,0.837796,0.000896,
+ 0.287073,-0.905921,0.311283,5.568745,0.834653,0.07139,
+ -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
+ 0.224122,-0.97456,-0.001209,5.323232,0.866039,0.00066,
+ -0.020035,-0.999799,-0.000148,5.469641,0.838722,0.000798,
+ -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
+ -0.020035,-0.999799,-0.000148,5.469641,0.838722,0.000798,
+ 0.267121,-0.895396,0.356249,5.449164,0.847535,0.103909,
+ -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
+ 0.267121,-0.895396,0.356249,5.449164,0.847535,0.103909,
+ -0.538845,-0.659239,0.524452,5.3569,0.85112,0.138324,
+ -0.53682,-0.608254,0.58468,5.26443,0.855571,0.181694,
+ -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
+ -0.538845,-0.659239,0.524452,5.3569,0.85112,0.138324,
+ -0.53682,-0.608254,0.58468,5.26443,0.855571,0.181694,
+ 0.086688,-0.887002,0.453556,5.373646,0.885375,0.20884,
+ 0.165259,-0.797056,-0.580854,5.299005,0.908991,0.260177,
+ -0.635877,0.324329,0.700337,5.153735,0.831575,0.218348,
+ -0.53682,-0.608254,0.58468,5.26443,0.855571,0.181694,
+ 0.165259,-0.797056,-0.580854,5.299005,0.908991,0.260177,
+ -0.635877,0.324329,0.700337,5.153735,0.831575,0.218348,
+ 0.165259,-0.797056,-0.580854,5.299005,0.908991,0.260177,
+ 0.243744,-0.944481,0.220328,5.197562,0.922406,0.302473,
+ -0.635877,0.324329,0.700337,5.153735,0.831575,0.218348,
+ -0.501598,-0.526154,0.686704,5.137075,0.824518,0.144842,
+ -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
+ -0.635877,0.324329,0.700337,5.153735,0.831575,0.218348,
+ -0.290459,-0.499809,0.815981,5.247762,0.848549,0.108546,
+ -0.53682,-0.608254,0.58468,5.26443,0.855571,0.181694,
+ -0.376273,-0.140159,0.915846,4.963526,0.797382,0.14344,
+ 0.124158,-0.992262,-0.000543,4.920855,0.812339,0.000318,
+ 0.598791,-0.8009,-0.003109,5.112563,0.840686,0.00048,
+ -0.376273,-0.140159,0.915846,4.963526,0.797382,0.14344,
+ 0.598791,-0.8009,-0.003109,5.112563,0.840686,0.00048,
+ -0.501598,-0.526154,0.686704,5.137075,0.824518,0.144842,
+ -0.508574,-0.111047,0.853827,4.99671,0.81056,0.280771,
+ -0.376273,-0.140159,0.915846,4.963526,0.797382,0.14344,
+ -0.501598,-0.526154,0.686704,5.137075,0.824518,0.144842,
+ -0.508574,-0.111047,0.853827,4.99671,0.81056,0.280771,
+ -0.501598,-0.526154,0.686704,5.137075,0.824518,0.144842,
+ -0.635877,0.324329,0.700337,5.153735,0.831575,0.218348,
+ -0.86136,-0.239794,0.447836,4.66969,0.738163,0.188296,
+ -0.376273,-0.140159,0.915846,4.963526,0.797382,0.14344,
+ -0.508574,-0.111047,0.853827,4.99671,0.81056,0.280771,
+ -0.86136,-0.239794,0.447836,4.66969,0.738163,0.188296,
+ -0.508574,-0.111047,0.853827,4.99671,0.81056,0.280771,
+ -0.724544,-0.128977,0.677054,4.712067,0.770512,0.333393,
+ -0.86136,-0.239794,0.447836,4.66969,0.738163,0.188296,
+ 0.157494,-0.98752,-0.000465,4.655453,0.758022,0.000098,
+ 0.124158,-0.992262,-0.000543,4.920855,0.812339,0.000318,
+ -0.86136,-0.239794,0.447836,4.66969,0.738163,0.188296,
+ 0.124158,-0.992262,-0.000543,4.920855,0.812339,0.000318,
+ -0.376273,-0.140159,0.915846,4.963526,0.797382,0.14344,
+ -0.508574,-0.111047,0.853827,4.99671,0.81056,0.280771,
+ -0.635877,0.324329,0.700337,5.153735,0.831575,0.218348,
+ 0.243744,-0.944481,0.220328,5.197562,0.922406,0.302473,
+ -0.508574,-0.111047,0.853827,4.99671,0.81056,0.280771,
+ 0.243744,-0.944481,0.220328,5.197562,0.922406,0.302473,
+ -0.903777,-0.182749,0.387027,5.004627,0.908637,0.345273,
+ -0.724544,-0.128977,0.677054,4.712067,0.770512,0.333393,
+ -0.508574,-0.111047,0.853827,4.99671,0.81056,0.280771,
+ -0.903777,-0.182749,0.387027,5.004627,0.908637,0.345273,
+ -0.724544,-0.128977,0.677054,4.712067,0.770512,0.333393,
+ -0.903777,-0.182749,0.387027,5.004627,0.908637,0.345273,
+ -0.911341,0.002265,0.411646,4.728809,0.878731,0.405801,
+ -0.566117,0.431683,0.702254,5.021254,0.951308,0.405567,
+ 0.254106,-0.95176,0.171999,5.223571,0.974029,0.362117,
+ 0.157921,-0.851177,-0.500559,5.241466,1.040469,0.383965,
+ -0.566117,0.431683,0.702254,5.021254,0.951308,0.405567,
+ 0.157921,-0.851177,-0.500559,5.241466,1.040469,0.383965,
+ -0.77316,0.344902,0.532228,5.011084,1.06677,0.458562,
+ -0.566117,0.431683,0.702254,5.021254,0.951308,0.405567,
+ -0.903777,-0.182749,0.387027,5.004627,0.908637,0.345273,
+ 0.243744,-0.944481,0.220328,5.197562,0.922406,0.302473,
+ -0.566117,0.431683,0.702254,5.021254,0.951308,0.405567,
+ 0.243744,-0.944481,0.220328,5.197562,0.922406,0.302473,
+ 0.254106,-0.95176,0.171999,5.223571,0.974029,0.362117,
+ -0.383862,0.612068,0.691392,4.74325,1.05921,0.563421,
+ -0.77316,0.344902,0.532228,5.011084,1.06677,0.458562,
+ -0.023775,-0.598435,0.800818,4.991713,1.163096,0.504149,
+ -0.383862,0.612068,0.691392,4.74325,1.05921,0.563421,
+ -0.023775,-0.598435,0.800818,4.991713,1.163096,0.504149,
+ 0.200825,-0.971974,0.122213,4.733657,1.227371,0.592883,
+ -0.091679,0.768658,0.633057,4.744871,0.950945,0.491082,
+ -0.566117,0.431683,0.702254,5.021254,0.951308,0.405567,
+ -0.77316,0.344902,0.532228,5.011084,1.06677,0.458562,
+ -0.091679,0.768658,0.633057,4.744871,0.950945,0.491082,
+ -0.77316,0.344902,0.532228,5.011084,1.06677,0.458562,
+ -0.383862,0.612068,0.691392,4.74325,1.05921,0.563421,
+ -0.911341,0.002265,0.411646,4.728809,0.878731,0.405801,
+ -0.903777,-0.182749,0.387027,5.004627,0.908637,0.345273,
+ -0.566117,0.431683,0.702254,5.021254,0.951308,0.405567,
+ -0.911341,0.002265,0.411646,4.728809,0.878731,0.405801,
+ -0.566117,0.431683,0.702254,5.021254,0.951308,0.405567,
+ -0.091679,0.768658,0.633057,4.744871,0.950945,0.491082,
+ -0.911194,0.285551,0.296961,4.567896,1.149805,0.642484,
+ -0.383862,0.612068,0.691392,4.74325,1.05921,0.563421,
+ 0.200825,-0.971974,0.122213,4.733657,1.227371,0.592883,
+ -0.911194,0.285551,0.296961,4.567896,1.149805,0.642484,
+ 0.200825,-0.971974,0.122213,4.733657,1.227371,0.592883,
+ 0.123418,-0.784469,0.607763,4.641547,1.285422,0.622034,
+ -0.931592,0.319003,0.174278,4.496191,1.024566,0.579491,
+ -0.091679,0.768658,0.633057,4.744871,0.950945,0.491082,
+ -0.383862,0.612068,0.691392,4.74325,1.05921,0.563421,
+ -0.931592,0.319003,0.174278,4.496191,1.024566,0.579491,
+ -0.383862,0.612068,0.691392,4.74325,1.05921,0.563421,
+ -0.911194,0.285551,0.296961,4.567896,1.149805,0.642484,
+ -0.895156,0.397807,0.201112,4.416475,0.921264,0.458839,
+ -0.911341,0.002265,0.411646,4.728809,0.878731,0.405801,
+ -0.091679,0.768658,0.633057,4.744871,0.950945,0.491082,
+ -0.895156,0.397807,0.201112,4.416475,0.921264,0.458839,
+ -0.091679,0.768658,0.633057,4.744871,0.950945,0.491082,
+ -0.931592,0.319003,0.174278,4.496191,1.024566,0.579491,
+ -0.742898,0.572423,0.347036,4.297891,0.911506,0.447987,
+ -0.821562,0.369566,0.434117,4.399629,0.850459,0.391855,
+ -0.895156,0.397807,0.201112,4.416475,0.921264,0.458839,
+ -0.742898,0.572423,0.347036,4.297891,0.911506,0.447987,
+ -0.895156,0.397807,0.201112,4.416475,0.921264,0.458839,
+ -0.885175,0.439902,0.1515,4.333503,0.951176,0.481517,
+ -0.659696,0.567802,0.492343,4.359048,0.700414,0.166651,
+ 0.000801,-1,-0.000539,4.380854,0.704574,-0.00013,
+ 0.157494,-0.98752,-0.000465,4.655453,0.758022,0.000098,
+ -0.659696,0.567802,0.492343,4.359048,0.700414,0.166651,
+ 0.157494,-0.98752,-0.000465,4.655453,0.758022,0.000098,
+ -0.86136,-0.239794,0.447836,4.66969,0.738163,0.188296,
+ 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
+ -0.659696,0.567802,0.492343,4.359048,0.700414,0.166651,
+ -0.86136,-0.239794,0.447836,4.66969,0.738163,0.188296,
+ 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
+ -0.86136,-0.239794,0.447836,4.66969,0.738163,0.188296,
+ -0.724544,-0.128977,0.677054,4.712067,0.770512,0.333393,
+ 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
+ -0.724544,-0.128977,0.677054,4.712067,0.770512,0.333393,
+ -0.821562,0.369566,0.434117,4.399629,0.850459,0.391855,
+ -0.742898,0.572423,0.347036,4.297891,0.911506,0.447987,
+ 0.206279,0.744917,0.634467,4.216374,0.852328,0.405873,
+ 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
+ -0.742898,0.572423,0.347036,4.297891,0.911506,0.447987,
+ 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
+ -0.821562,0.369566,0.434117,4.399629,0.850459,0.391855,
+ -0.724544,-0.128977,0.677054,4.712067,0.770512,0.333393,
+ -0.911341,0.002265,0.411646,4.728809,0.878731,0.405801,
+ -0.895156,0.397807,0.201112,4.416475,0.921264,0.458839,
+ -0.724544,-0.128977,0.677054,4.712067,0.770512,0.333393,
+ -0.895156,0.397807,0.201112,4.416475,0.921264,0.458839,
+ -0.821562,0.369566,0.434117,4.399629,0.850459,0.391855,
+ -0.476949,0.871027,0.117605,4.366867,1.131136,0.630581,
+ -0.931592,0.319003,0.174278,4.496191,1.024566,0.579491,
+ -0.911194,0.285551,0.296961,4.567896,1.149805,0.642484,
+ -0.476949,0.871027,0.117605,4.366867,1.131136,0.630581,
+ -0.911194,0.285551,0.296961,4.567896,1.149805,0.642484,
+ -0.395804,0.901672,0.174144,4.449011,1.260929,0.647431,
+ 0.206279,0.744917,0.634467,4.216374,0.852328,0.405873,
+ -0.742898,0.572423,0.347036,4.297891,0.911506,0.447987,
+ -0.590367,0.807126,-0.003753,4.141189,1.008775,0.499342,
+ -0.742898,0.572423,0.347036,4.297891,0.911506,0.447987,
+ -0.885175,0.439902,0.1515,4.333503,0.951176,0.481517,
+ -0.594389,0.803108,0.041468,4.277227,1.077746,0.550819,
+ -0.742898,0.572423,0.347036,4.297891,0.911506,0.447987,
+ -0.594389,0.803108,0.041468,4.277227,1.077746,0.550819,
+ -0.590367,0.807126,-0.003753,4.141189,1.008775,0.499342,
+ -0.590367,0.807126,-0.003753,4.141189,1.008775,0.499342,
+ -0.594389,0.803108,0.041468,4.277227,1.077746,0.550819,
+ -0.091114,0.94565,0.312162,4.175444,1.350332,0.613988,
+ -0.590367,0.807126,-0.003753,4.141189,1.008775,0.499342,
+ -0.091114,0.94565,0.312162,4.175444,1.350332,0.613988,
+ -0.610894,0.790229,-0.048447,4.085564,1.288885,0.544406,
+ -0.895156,0.397807,0.201112,4.416475,0.921264,0.458839,
+ -0.931592,0.319003,0.174278,4.496191,1.024566,0.579491,
+ -0.885175,0.439902,0.1515,4.333503,0.951176,0.481517,
+ -0.885175,0.439902,0.1515,4.333503,0.951176,0.481517,
+ -0.931592,0.319003,0.174278,4.496191,1.024566,0.579491,
+ -0.476949,0.871027,0.117605,4.366867,1.131136,0.630581,
+ -0.885175,0.439902,0.1515,4.333503,0.951176,0.481517,
+ -0.476949,0.871027,0.117605,4.366867,1.131136,0.630581,
+ -0.594389,0.803108,0.041468,4.277227,1.077746,0.550819,
+ -0.594389,0.803108,0.041468,4.277227,1.077746,0.550819,
+ -0.476949,0.871027,0.117605,4.366867,1.131136,0.630581,
+ -0.216454,0.960138,0.176868,4.247733,1.381058,0.649596,
+ -0.594389,0.803108,0.041468,4.277227,1.077746,0.550819,
+ -0.216454,0.960138,0.176868,4.247733,1.381058,0.649596,
+ -0.091114,0.94565,0.312162,4.175444,1.350332,0.613988,
+ -0.476949,0.871027,0.117605,4.366867,1.131136,0.630581,
+ -0.395804,0.901672,0.174144,4.449011,1.260929,0.647431,
+ -0.283495,0.953867,0.098839,4.329607,1.464801,0.661485,
+ -0.476949,0.871027,0.117605,4.366867,1.131136,0.630581,
+ -0.283495,0.953867,0.098839,4.329607,1.464801,0.661485,
+ -0.216454,0.960138,0.176868,4.247733,1.381058,0.649596,
+ -0.395804,0.901672,0.174144,4.449011,1.260929,0.647431,
+ 0.050019,-0.552867,0.831767,4.522247,1.398278,0.644892,
+ 0.037801,-0.082839,0.995846,4.430999,1.535753,0.638888,
+ -0.395804,0.901672,0.174144,4.449011,1.260929,0.647431,
+ 0.037801,-0.082839,0.995846,4.430999,1.535753,0.638888,
+ -0.283495,0.953867,0.098839,4.329607,1.464801,0.661485,
+ -0.283495,0.953867,0.098839,4.329607,1.464801,0.661485,
+ 0.037801,-0.082839,0.995846,4.430999,1.535753,0.638888,
+ -0.196146,-0.333078,0.922272,4.404221,1.662433,0.61661,
+ -0.283495,0.953867,0.098839,4.329607,1.464801,0.661485,
+ -0.196146,-0.333078,0.922272,4.404221,1.662433,0.61661,
+ -0.421166,0.906102,0.039982,4.312225,1.683392,0.639944,
+ -0.421166,0.906102,0.039982,4.312225,1.683392,0.639944,
+ -0.196146,-0.333078,0.922272,4.404221,1.662433,0.61661,
+ -0.106358,-0.394397,0.912765,4.38638,1.770868,0.596666,
+ -0.421166,0.906102,0.039982,4.312225,1.683392,0.639944,
+ -0.106358,-0.394397,0.912765,4.38638,1.770868,0.596666,
+ -0.557881,0.828586,-0.047048,4.303615,1.799914,0.610388,
+ -0.557881,0.828586,-0.047048,4.303615,1.799914,0.610388,
+ -0.106358,-0.394397,0.912765,4.38638,1.770868,0.596666,
+ -0.277696,-0.435918,0.856073,4.377095,1.871713,0.595743,
+ -0.557881,0.828586,-0.047048,4.303615,1.799914,0.610388,
+ -0.277696,-0.435918,0.856073,4.377095,1.871713,0.595743,
+ -0.536419,0.710997,0.454685,4.304562,1.906537,0.572242,
+ 0.055369,0.916343,0.396547,4.221814,1.660769,0.59409,
+ -0.421166,0.906102,0.039982,4.312225,1.683392,0.639944,
+ -0.557881,0.828586,-0.047048,4.303615,1.799914,0.610388,
+ 0.055369,0.916343,0.396547,4.221814,1.660769,0.59409,
+ -0.557881,0.828586,-0.047048,4.303615,1.799914,0.610388,
+ -0.678336,0.658323,0.326299,4.240116,1.770049,0.583946,
+ -0.216454,0.960138,0.176868,4.247733,1.381058,0.649596,
+ -0.283495,0.953867,0.098839,4.329607,1.464801,0.661485,
+ -0.421166,0.906102,0.039982,4.312225,1.683392,0.639944,
+ -0.216454,0.960138,0.176868,4.247733,1.381058,0.649596,
+ -0.421166,0.906102,0.039982,4.312225,1.683392,0.639944,
+ 0.055369,0.916343,0.396547,4.221814,1.660769,0.59409,
+ -0.091114,0.94565,0.312162,4.175444,1.350332,0.613988,
+ -0.216454,0.960138,0.176868,4.247733,1.381058,0.649596,
+ 0.055369,0.916343,0.396547,4.221814,1.660769,0.59409,
+ -0.091114,0.94565,0.312162,4.175444,1.350332,0.613988,
+ 0.055369,0.916343,0.396547,4.221814,1.660769,0.59409,
+ 0.090337,0.942369,0.32215,4.121121,1.614451,0.587188,
+ -0.610894,0.790229,-0.048447,4.085564,1.288885,0.544406,
+ -0.091114,0.94565,0.312162,4.175444,1.350332,0.613988,
+ 0.090337,0.942369,0.32215,4.121121,1.614451,0.587188,
+ -0.610894,0.790229,-0.048447,4.085564,1.288885,0.544406,
+ 0.090337,0.942369,0.32215,4.121121,1.614451,0.587188,
+ -0.560402,0.735791,0.380211,4.067576,1.572668,0.534997,
+ 0.090337,0.942369,0.32215,4.121121,1.614451,0.587188,
+ 0.055369,0.916343,0.396547,4.221814,1.660769,0.59409,
+ -0.678336,0.658323,0.326299,4.240116,1.770049,0.583946,
+ 0.090337,0.942369,0.32215,4.121121,1.614451,0.587188,
+ -0.678336,0.658323,0.326299,4.240116,1.770049,0.583946,
+ -0.641133,0.599375,0.479267,4.148883,1.759918,0.573765,
+ -0.560402,0.735791,0.380211,4.067576,1.572668,0.534997,
+ 0.090337,0.942369,0.32215,4.121121,1.614451,0.587188,
+ -0.641133,0.599375,0.479267,4.148883,1.759918,0.573765,
+ -0.560402,0.735791,0.380211,4.067576,1.572668,0.534997,
+ -0.641133,0.599375,0.479267,4.148883,1.759918,0.573765,
+ -0.760994,0.140163,0.633437,4.076852,1.746601,0.527436,
+ 0.203778,-0.389736,0.898098,4.83289,2.262727,0.283787,
+ -0.026148,0.006311,0.999638,4.971394,2.146686,0.224781,
+ -0.989689,-0.143234,0,4.912303,2.162645,-0.00009,
+ 0.203778,-0.389736,0.898098,4.83289,2.262727,0.283787,
+ -0.989689,-0.143234,0,4.912303,2.162645,-0.00009,
+ -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
+ 0.204472,-0.587725,0.782797,5.156645,1.942902,0.119993,
+ -0.998597,-0.052951,0,5.177545,1.932323,0.000214,
+ -0.941169,-0.337937,0,5.04969,2.032731,0.000071,
+ -0.241533,0.200654,0.949421,5.687035,1.499636,0.110765,
+ -0.31398,0.125786,0.94106,5.741781,1.463956,0.124891,
+ 0.694651,0.719347,0.000019,5.743997,1.482739,0.000851,
+ -0.241533,0.200654,0.949421,5.687035,1.499636,0.110765,
+ 0.694651,0.719347,0.000019,5.743997,1.482739,0.000851,
+ -0.026558,-0.999647,0,5.680007,1.510009,0.000786,
+ -0.062808,0.99609,0.062134,5.842092,1.427708,0.130724,
+ -0.11884,0.991349,-0.055713,5.915025,1.382159,0.13682,
+ -0.016213,0.999869,0,5.908842,1.388968,0.001026,
+ -0.062808,0.99609,0.062134,5.842092,1.427708,0.130724,
+ -0.016213,0.999869,0,5.908842,1.388968,0.001026,
+ 0.569495,0.821995,-0.000075,5.835498,1.43628,0.000946,
+ -0.395037,0.740118,0.544216,4.452383,2.524558,0.130255,
+ 0.169654,-0.985504,-0.000285,4.454962,2.523303,-0.000603,
+ -0.069594,-0.997575,-0.000151,4.317602,2.588926,-0.000745,
+ -0.395037,0.740118,0.544216,4.452383,2.524558,0.130255,
+ -0.069594,-0.997575,-0.000151,4.317602,2.588926,-0.000745,
+ -0.411843,0.771855,0.484381,4.342351,2.581176,0.140317,
+ -0.353793,0.870619,0.341838,4.440143,2.510529,0.269164,
+ -0.395037,0.740118,0.544216,4.452383,2.524558,0.130255,
+ -0.411843,0.771855,0.484381,4.342351,2.581176,0.140317,
+ -0.353793,0.870619,0.341838,4.440143,2.510529,0.269164,
+ -0.411843,0.771855,0.484381,4.342351,2.581176,0.140317,
+ -0.330516,0.821242,0.465104,4.332083,2.586481,0.194917,
+ -0.929249,-0.009268,0.369337,4.429895,2.495758,0.306894,
+ -0.353793,0.870619,0.341838,4.440143,2.510529,0.269164,
+ -0.330516,0.821242,0.465104,4.332083,2.586481,0.194917,
+ -0.929249,-0.009268,0.369337,4.429895,2.495758,0.306894,
+ -0.330516,0.821242,0.465104,4.332083,2.586481,0.194917,
+ -0.718934,0.608496,0.335955,4.339601,2.592642,0.258891,
+ -0.411843,0.771855,0.484381,4.342351,2.581176,0.140317,
+ -0.069594,-0.997575,-0.000151,4.317602,2.588926,-0.000745,
+ 0.172357,-0.985035,-0.000083,4.189883,2.606916,-0.000863,
+ -0.411843,0.771855,0.484381,4.342351,2.581176,0.140317,
+ 0.172357,-0.985035,-0.000083,4.189883,2.606916,-0.000863,
+ -0.144656,0.947613,0.284787,4.187258,2.590221,0.135844,
+ -0.330516,0.821242,0.465104,4.332083,2.586481,0.194917,
+ -0.411843,0.771855,0.484381,4.342351,2.581176,0.140317,
+ -0.144656,0.947613,0.284787,4.187258,2.590221,0.135844,
+ -0.330516,0.821242,0.465104,4.332083,2.586481,0.194917,
+ -0.144656,0.947613,0.284787,4.187258,2.590221,0.135844,
+ -0.364192,0.890167,0.273801,4.203325,2.589186,0.219164,
+ -0.718934,0.608496,0.335955,4.339601,2.592642,0.258891,
+ -0.330516,0.821242,0.465104,4.332083,2.586481,0.194917,
+ -0.364192,0.890167,0.273801,4.203325,2.589186,0.219164,
+ -0.718934,0.608496,0.335955,4.339601,2.592642,0.258891,
+ -0.364192,0.890167,0.273801,4.203325,2.589186,0.219164,
+ -0.719327,0.568276,0.399538,4.211652,2.602538,0.264011,
+ -0.130291,0.991051,0.029017,4.328606,2.563996,0.343892,
+ -0.718934,0.608496,0.335955,4.339601,2.592642,0.258891,
+ -0.719327,0.568276,0.399538,4.211652,2.602538,0.264011,
+ -0.130291,0.991051,0.029017,4.328606,2.563996,0.343892,
+ -0.719327,0.568276,0.399538,4.211652,2.602538,0.264011,
+ -0.904972,-0.026555,0.424641,4.209941,2.600612,0.337597,
+ -0.501953,0.842502,0.195534,4.410844,2.500167,0.351972,
+ -0.929249,-0.009268,0.369337,4.429895,2.495758,0.306894,
+ -0.718934,0.608496,0.335955,4.339601,2.592642,0.258891,
+ -0.501953,0.842502,0.195534,4.410844,2.500167,0.351972,
+ -0.718934,0.608496,0.335955,4.339601,2.592642,0.258891,
+ -0.130291,0.991051,0.029017,4.328606,2.563996,0.343892,
+ 0.241652,-0.897637,0.368581,4.634996,2.369115,0.140117,
+ -0.965284,-0.261201,0,4.747988,2.300163,-0.000276,
+ 0.210866,-0.977515,0.000009,4.528082,2.467537,-0.000521,
+ 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
+ 0.241652,-0.897637,0.368581,4.634996,2.369115,0.140117,
+ 0.210866,-0.977515,0.000009,4.528082,2.467537,-0.000521,
+ 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
+ 0.210866,-0.977515,0.000009,4.528082,2.467537,-0.000521,
+ 0.169654,-0.985504,-0.000285,4.454962,2.523303,-0.000603,
+ 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
+ 0.169654,-0.985504,-0.000285,4.454962,2.523303,-0.000603,
+ -0.395037,0.740118,0.544216,4.452383,2.524558,0.130255,
+ 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
+ -0.395037,0.740118,0.544216,4.452383,2.524558,0.130255,
+ -0.353793,0.870619,0.341838,4.440143,2.510529,0.269164,
+ 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
+ -0.353793,0.870619,0.341838,4.440143,2.510529,0.269164,
+ -0.929249,-0.009268,0.369337,4.429895,2.495758,0.306894,
+ -0.929249,-0.009268,0.369337,4.429895,2.495758,0.306894,
+ -0.501953,0.842502,0.195534,4.410844,2.500167,0.351972,
+ -0.849668,0.488771,-0.197904,4.474318,2.418432,0.361347,
+ 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
+ -0.929249,-0.009268,0.369337,4.429895,2.495758,0.306894,
+ -0.849668,0.488771,-0.197904,4.474318,2.418432,0.361347,
+ 0.231006,-0.859096,0.456717,4.472349,2.325133,0.443764,
+ 0.170159,-0.985033,-0.027502,4.577573,2.389535,0.256196,
+ -0.849668,0.488771,-0.197904,4.474318,2.418432,0.361347,
+ 0.361848,-0.921221,-0.142892,4.043796,2.386524,0.400392,
+ -0.138401,-0.989733,0.035683,4.07851,2.41181,0.472193,
+ 0.207048,-0.965263,0.159371,4.088356,2.510913,0.453793,
+ 0.361848,-0.921221,-0.142892,4.043796,2.386524,0.400392,
+ 0.207048,-0.965263,0.159371,4.088356,2.510913,0.453793,
+ 0.198783,-0.979888,0.017481,4.063205,2.509679,0.342987,
+ 0.3579,-0.920931,0.154253,4.035753,2.399538,0.343957,
+ 0.361848,-0.921221,-0.142892,4.043796,2.386524,0.400392,
+ 0.198783,-0.979888,0.017481,4.063205,2.509679,0.342987,
+ 0.3579,-0.920931,0.154253,4.035753,2.399538,0.343957,
+ 0.198783,-0.979888,0.017481,4.063205,2.509679,0.342987,
+ 0.363913,-0.931415,0.005744,4.055262,2.505284,0.297282,
+ 0.172357,-0.985035,-0.000083,4.189883,2.606916,-0.000863,
+ 0.272993,0.962016,-0.000199,4.079812,2.571649,-0.000951,
+ 0.579082,-0.064826,-0.812688,4.084506,2.570978,0.218168,
+ 0.172357,-0.985035,-0.000083,4.189883,2.606916,-0.000863,
+ 0.579082,-0.064826,-0.812688,4.084506,2.570978,0.218168,
+ -0.144656,0.947613,0.284787,4.187258,2.590221,0.135844,
+ -0.144656,0.947613,0.284787,4.187258,2.590221,0.135844,
+ 0.579082,-0.064826,-0.812688,4.084506,2.570978,0.218168,
+ 0.849086,-0.12151,-0.51409,4.101754,2.557092,0.265856,
+ -0.144656,0.947613,0.284787,4.187258,2.590221,0.135844,
+ 0.849086,-0.12151,-0.51409,4.101754,2.557092,0.265856,
+ -0.364192,0.890167,0.273801,4.203325,2.589186,0.219164,
+ -0.364192,0.890167,0.273801,4.203325,2.589186,0.219164,
+ 0.849086,-0.12151,-0.51409,4.101754,2.557092,0.265856,
+ 0.727891,-0.103877,-0.677779,4.100907,2.560626,0.302396,
+ -0.364192,0.890167,0.273801,4.203325,2.589186,0.219164,
+ 0.727891,-0.103877,-0.677779,4.100907,2.560626,0.302396,
+ -0.719327,0.568276,0.399538,4.211652,2.602538,0.264011,
+ -0.719327,0.568276,0.399538,4.211652,2.602538,0.264011,
+ 0.727891,-0.103877,-0.677779,4.100907,2.560626,0.302396,
+ 0.576293,-0.081905,-0.813128,4.117367,2.568514,0.3845,
+ -0.719327,0.568276,0.399538,4.211652,2.602538,0.264011,
+ 0.576293,-0.081905,-0.813128,4.117367,2.568514,0.3845,
+ -0.904972,-0.026555,0.424641,4.209941,2.600612,0.337597,
+ 0.363913,-0.931415,0.005744,4.055262,2.505284,0.297282,
+ 0.740815,-0.598363,-0.305214,4.029016,2.519175,0.249385,
+ 0.640669,-0.433938,-0.633436,4.00011,2.424158,0.313254,
+ 0.363913,-0.931415,0.005744,4.055262,2.505284,0.297282,
+ 0.640669,-0.433938,-0.633436,4.00011,2.424158,0.313254,
+ 0.3579,-0.920931,0.154253,4.035753,2.399538,0.343957,
+ -0.069267,0.997598,-0.000362,3.988172,2.489642,-0.001008,
+ 0.640669,-0.433938,-0.633436,4.00011,2.424158,0.313254,
+ 0.740815,-0.598363,-0.305214,4.029016,2.519175,0.249385,
+ -0.069267,0.997598,-0.000362,3.988172,2.489642,-0.001008,
+ 0.740815,-0.598363,-0.305214,4.029016,2.519175,0.249385,
+ 0.544067,0.839042,-0.000076,4.024214,2.527933,-0.000987,
+ 0.740815,-0.598363,-0.305214,4.029016,2.519175,0.249385,
+ 0.579082,-0.064826,-0.812688,4.084506,2.570978,0.218168,
+ 0.272993,0.962016,-0.000199,4.079812,2.571649,-0.000951,
+ 0.740815,-0.598363,-0.305214,4.029016,2.519175,0.249385,
+ 0.272993,0.962016,-0.000199,4.079812,2.571649,-0.000951,
+ 0.544067,0.839042,-0.000076,4.024214,2.527933,-0.000987,
+ 0.363913,-0.931415,0.005744,4.055262,2.505284,0.297282,
+ 0.849086,-0.12151,-0.51409,4.101754,2.557092,0.265856,
+ 0.579082,-0.064826,-0.812688,4.084506,2.570978,0.218168,
+ 0.363913,-0.931415,0.005744,4.055262,2.505284,0.297282,
+ 0.579082,-0.064826,-0.812688,4.084506,2.570978,0.218168,
+ 0.740815,-0.598363,-0.305214,4.029016,2.519175,0.249385,
+ 0.198783,-0.979888,0.017481,4.063205,2.509679,0.342987,
+ 0.727891,-0.103877,-0.677779,4.100907,2.560626,0.302396,
+ 0.849086,-0.12151,-0.51409,4.101754,2.557092,0.265856,
+ 0.198783,-0.979888,0.017481,4.063205,2.509679,0.342987,
+ 0.849086,-0.12151,-0.51409,4.101754,2.557092,0.265856,
+ 0.363913,-0.931415,0.005744,4.055262,2.505284,0.297282,
+ 0.207048,-0.965263,0.159371,4.088356,2.510913,0.453793,
+ 0.576293,-0.081905,-0.813128,4.117367,2.568514,0.3845,
+ 0.727891,-0.103877,-0.677779,4.100907,2.560626,0.302396,
+ 0.207048,-0.965263,0.159371,4.088356,2.510913,0.453793,
+ 0.727891,-0.103877,-0.677779,4.100907,2.560626,0.302396,
+ 0.198783,-0.979888,0.017481,4.063205,2.509679,0.342987,
+ -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
+ 0.640669,-0.433938,-0.633436,4.00011,2.424158,0.313254,
+ -0.069267,0.997598,-0.000362,3.988172,2.489642,-0.001008,
+ -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
+ -0.069267,0.997598,-0.000362,3.988172,2.489642,-0.001008,
+ 0.622247,0.782821,-0.000247,3.787342,2.396113,-0.001159,
+ -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
+ -0.745507,-0.065161,-0.663305,3.870548,2.292106,0.368964,
+ -0.611332,-0.037351,-0.790492,3.961908,2.347745,0.374747,
+ -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
+ -0.611332,-0.037351,-0.790492,3.961908,2.347745,0.374747,
+ 0.640669,-0.433938,-0.633436,4.00011,2.424158,0.313254,
+ -0.747931,-0.041912,-0.662452,4.025364,2.3593,0.402597,
+ 0.361848,-0.921221,-0.142892,4.043796,2.386524,0.400392,
+ 0.3579,-0.920931,0.154253,4.035753,2.399538,0.343957,
+ -0.747931,-0.041912,-0.662452,4.025364,2.3593,0.402597,
+ 0.3579,-0.920931,0.154253,4.035753,2.399538,0.343957,
+ 0.640669,-0.433938,-0.633436,4.00011,2.424158,0.313254,
+ -0.611332,-0.037351,-0.790492,3.961908,2.347745,0.374747,
+ -0.747931,-0.041912,-0.662452,4.025364,2.3593,0.402597,
+ 0.640669,-0.433938,-0.633436,4.00011,2.424158,0.313254,
+ -0.609407,-0.033626,-0.792144,3.967085,2.280648,0.537643,
+ -0.749946,-0.01864,-0.661236,4.077563,2.305187,0.510338,
+ -0.747931,-0.041912,-0.662452,4.025364,2.3593,0.402597,
+ -0.609407,-0.033626,-0.792144,3.967085,2.280648,0.537643,
+ -0.747931,-0.041912,-0.662452,4.025364,2.3593,0.402597,
+ -0.611332,-0.037351,-0.790492,3.961908,2.347745,0.374747,
+ -0.446251,-0.047365,-0.893653,3.903911,2.241501,0.512468,
+ -0.609407,-0.033626,-0.792144,3.967085,2.280648,0.537643,
+ -0.611332,-0.037351,-0.790492,3.961908,2.347745,0.374747,
+ -0.446251,-0.047365,-0.893653,3.903911,2.241501,0.512468,
+ -0.611332,-0.037351,-0.790492,3.961908,2.347745,0.374747,
+ -0.745507,-0.065161,-0.663305,3.870548,2.292106,0.368964,
+ -0.453311,-0.031481,-0.890797,3.823349,2.141733,0.428356,
+ -0.93621,-0.256398,0.240355,3.857922,2.141554,0.521067,
+ -0.446251,-0.047365,-0.893653,3.903911,2.241501,0.512468,
+ -0.453311,-0.031481,-0.890797,3.823349,2.141733,0.428356,
+ -0.446251,-0.047365,-0.893653,3.903911,2.241501,0.512468,
+ -0.745507,-0.065161,-0.663305,3.870548,2.292106,0.368964,
+ -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
+ -0.138401,-0.989733,0.035683,4.07851,2.41181,0.472193,
+ 0.361848,-0.921221,-0.142892,4.043796,2.386524,0.400392,
+ -0.747931,-0.041912,-0.662452,4.025364,2.3593,0.402597,
+ -0.749946,-0.01864,-0.661236,4.077563,2.305187,0.510338,
+ -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
+ -0.747931,-0.041912,-0.662452,4.025364,2.3593,0.402597,
+ -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
+ 0.361848,-0.921221,-0.142892,4.043796,2.386524,0.400392,
+ -0.609407,-0.033626,-0.792144,3.967085,2.280648,0.537643,
+ -0.450889,-0.363512,0.815205,4.010847,2.270246,0.622149,
+ -0.749779,-0.335085,0.57057,4.112302,2.285832,0.5955,
+ -0.609407,-0.033626,-0.792144,3.967085,2.280648,0.537643,
+ -0.749779,-0.335085,0.57057,4.112302,2.285832,0.5955,
+ -0.749946,-0.01864,-0.661236,4.077563,2.305187,0.510338,
+ -0.446251,-0.047365,-0.893653,3.903911,2.241501,0.512468,
+ -0.948723,-0.104868,0.298208,3.928869,2.223919,0.615683,
+ -0.450889,-0.363512,0.815205,4.010847,2.270246,0.622149,
+ -0.446251,-0.047365,-0.893653,3.903911,2.241501,0.512468,
+ -0.450889,-0.363512,0.815205,4.010847,2.270246,0.622149,
+ -0.609407,-0.033626,-0.792144,3.967085,2.280648,0.537643,
+ -0.93621,-0.256398,0.240355,3.857922,2.141554,0.521067,
+ -0.782361,-0.139191,0.607073,3.892378,2.149432,0.603589,
+ -0.948723,-0.104868,0.298208,3.928869,2.223919,0.615683,
+ -0.93621,-0.256398,0.240355,3.857922,2.141554,0.521067,
+ -0.948723,-0.104868,0.298208,3.928869,2.223919,0.615683,
+ -0.446251,-0.047365,-0.893653,3.903911,2.241501,0.512468,
+ -0.450889,-0.363512,0.815205,4.010847,2.270246,0.622149,
+ -0.555116,0.058381,0.829722,4.04473,2.254459,0.744209,
+ -0.515329,-0.156304,0.842618,4.146067,2.278102,0.707372,
+ -0.450889,-0.363512,0.815205,4.010847,2.270246,0.622149,
+ -0.515329,-0.156304,0.842618,4.146067,2.278102,0.707372,
+ -0.749779,-0.335085,0.57057,4.112302,2.285832,0.5955,
+ -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
+ -0.555116,0.058381,0.829722,4.04473,2.254459,0.744209,
+ -0.450889,-0.363512,0.815205,4.010847,2.270246,0.622149,
+ -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
+ -0.450889,-0.363512,0.815205,4.010847,2.270246,0.622149,
+ -0.948723,-0.104868,0.298208,3.928869,2.223919,0.615683,
+ -0.782361,-0.139191,0.607073,3.892378,2.149432,0.603589,
+ -0.936127,0.049437,0.348169,3.945464,2.1301,0.689536,
+ -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
+ -0.782361,-0.139191,0.607073,3.892378,2.149432,0.603589,
+ -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
+ -0.948723,-0.104868,0.298208,3.928869,2.223919,0.615683,
+ 0.73986,-0.312403,0.595828,4.212974,2.303184,0.587113,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
+ -0.749779,-0.335085,0.57057,4.112302,2.285832,0.5955,
+ 0.73986,-0.312403,0.595828,4.212974,2.303184,0.587113,
+ -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
+ -0.749779,-0.335085,0.57057,4.112302,2.285832,0.5955,
+ -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
+ -0.749946,-0.01864,-0.661236,4.077563,2.305187,0.510338,
+ -0.749779,-0.335085,0.57057,4.112302,2.285832,0.5955,
+ -0.515329,-0.156304,0.842618,4.146067,2.278102,0.707372,
+ -0.965005,-0.14502,-0.218484,4.212058,2.27945,0.625927,
+ -0.749779,-0.335085,0.57057,4.112302,2.285832,0.5955,
+ -0.965005,-0.14502,-0.218484,4.212058,2.27945,0.625927,
+ 0.73986,-0.312403,0.595828,4.212974,2.303184,0.587113,
+ -0.515329,-0.156304,0.842618,4.146067,2.278102,0.707372,
+ -0.766653,-0.188233,0.61385,4.172143,2.303394,0.778972,
+ -0.98488,-0.159984,0.066451,4.229332,2.274522,0.672749,
+ -0.515329,-0.156304,0.842618,4.146067,2.278102,0.707372,
+ -0.98488,-0.159984,0.066451,4.229332,2.274522,0.672749,
+ -0.965005,-0.14502,-0.218484,4.212058,2.27945,0.625927,
+ -0.555116,0.058381,0.829722,4.04473,2.254459,0.744209,
+ -0.172109,-0.240744,0.955207,4.079122,2.264104,0.84501,
+ -0.766653,-0.188233,0.61385,4.172143,2.303394,0.778972,
+ -0.555116,0.058381,0.829722,4.04473,2.254459,0.744209,
+ -0.766653,-0.188233,0.61385,4.172143,2.303394,0.778972,
+ -0.515329,-0.156304,0.842618,4.146067,2.278102,0.707372,
+ -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
+ 0.50391,-0.29577,0.811538,4.0247,2.187859,0.814219,
+ -0.172109,-0.240744,0.955207,4.079122,2.264104,0.84501,
+ -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
+ -0.172109,-0.240744,0.955207,4.079122,2.264104,0.84501,
+ -0.555116,0.058381,0.829722,4.04473,2.254459,0.744209,
+ -0.766653,-0.188233,0.61385,4.172143,2.303394,0.778972,
+ -0.986028,-0.026302,-0.164487,4.215419,2.350484,0.885764,
+ 0.74814,-0.190428,0.635629,4.273005,2.310529,0.762172,
+ -0.766653,-0.188233,0.61385,4.172143,2.303394,0.778972,
+ 0.74814,-0.190428,0.635629,4.273005,2.310529,0.762172,
+ -0.98488,-0.159984,0.066451,4.229332,2.274522,0.672749,
+ -0.172109,-0.240744,0.955207,4.079122,2.264104,0.84501,
+ -0.993835,-0.024167,0.108201,4.104864,2.298353,0.915735,
+ -0.986028,-0.026302,-0.164487,4.215419,2.350484,0.885764,
+ -0.172109,-0.240744,0.955207,4.079122,2.264104,0.84501,
+ -0.986028,-0.026302,-0.164487,4.215419,2.350484,0.885764,
+ -0.766653,-0.188233,0.61385,4.172143,2.303394,0.778972,
+ 0.50391,-0.29577,0.811538,4.0247,2.187859,0.814219,
+ -0.76371,-0.034453,0.644639,4.059714,2.194906,0.888152,
+ -0.993835,-0.024167,0.108201,4.104864,2.298353,0.915735,
+ 0.50391,-0.29577,0.811538,4.0247,2.187859,0.814219,
+ -0.993835,-0.024167,0.108201,4.104864,2.298353,0.915735,
+ -0.172109,-0.240744,0.955207,4.079122,2.264104,0.84501,
+ 0.513205,-0.021212,0.858004,4.097362,2.3666,1.239986,
+ 0.744052,-0.065305,0.664923,4.155551,2.388662,1.09196,
+ 0.513577,-0.159689,0.843053,4.102304,2.29996,1.025862,
+ 0.513205,-0.021212,0.858004,4.097362,2.3666,1.239986,
+ 0.513577,-0.159689,0.843053,4.102304,2.29996,1.025862,
+ -0.158973,-0.085654,0.98356,4.061989,2.231988,1.178382,
+ 0.513577,-0.159689,0.843053,4.102304,2.29996,1.025862,
+ -0.141926,0.071007,0.987327,4.194233,2.408334,1.008471,
+ -0.986028,-0.026302,-0.164487,4.215419,2.350484,0.885764,
+ 0.513577,-0.159689,0.843053,4.102304,2.29996,1.025862,
+ -0.986028,-0.026302,-0.164487,4.215419,2.350484,0.885764,
+ -0.993835,-0.024167,0.108201,4.104864,2.298353,0.915735,
+ 0.744052,-0.065305,0.664923,4.155551,2.388662,1.09196,
+ -0.141926,0.071007,0.987327,4.194233,2.408334,1.008471,
+ 0.513577,-0.159689,0.843053,4.102304,2.29996,1.025862,
+ -0.741934,0.120389,0.659576,4.307092,2.367482,0.877202,
+ 0.74814,-0.190428,0.635629,4.273005,2.310529,0.762172,
+ -0.986028,-0.026302,-0.164487,4.215419,2.350484,0.885764,
+ -0.141926,0.071007,0.987327,4.194233,2.408334,1.008471,
+ -0.982826,0.110983,0.147432,4.266263,2.421651,1.054799,
+ -0.741934,0.120389,0.659576,4.307092,2.367482,0.877202,
+ -0.141926,0.071007,0.987327,4.194233,2.408334,1.008471,
+ -0.741934,0.120389,0.659576,4.307092,2.367482,0.877202,
+ -0.986028,-0.026302,-0.164487,4.215419,2.350484,0.885764,
+ 0.744052,-0.065305,0.664923,4.155551,2.388662,1.09196,
+ -0.989845,0.092874,-0.10762,4.228523,2.435029,1.098575,
+ -0.982826,0.110983,0.147432,4.266263,2.421651,1.054799,
+ 0.744052,-0.065305,0.664923,4.155551,2.388662,1.09196,
+ -0.982826,0.110983,0.147432,4.266263,2.421651,1.054799,
+ -0.141926,0.071007,0.987327,4.194233,2.408334,1.008471,
+ 0.513205,-0.021212,0.858004,4.097362,2.3666,1.239986,
+ 0.3936,0.919282,0.000642,4.17047,2.458441,1.241846,
+ -0.989845,0.092874,-0.10762,4.228523,2.435029,1.098575,
+ 0.513205,-0.021212,0.858004,4.097362,2.3666,1.239986,
+ -0.989845,0.092874,-0.10762,4.228523,2.435029,1.098575,
+ 0.744052,-0.065305,0.664923,4.155551,2.388662,1.09196,
+ -0.570564,0.630958,-0.525689,4.058311,2.293363,1.338054,
+ 0.3936,0.919282,0.000642,4.094116,2.426172,1.381032,
+ 0.3936,0.919282,0.000642,4.17047,2.458441,1.241846,
+ -0.570564,0.630958,-0.525689,4.058311,2.293363,1.338054,
+ 0.3936,0.919282,0.000642,4.17047,2.458441,1.241846,
+ 0.513205,-0.021212,0.858004,4.097362,2.3666,1.239986,
+ -0.570564,0.630958,-0.525689,4.046673,2.341349,1.45253,
+ 0.3936,0.919282,0.000642,4.094116,2.426172,1.381032,
+ -0.570564,0.630958,-0.525689,4.058311,2.293363,1.338054,
+ -0.329373,0.540393,-0.774267,4.047406,2.207209,1.015108,
+ 0.513577,-0.159689,0.843053,4.102304,2.29996,1.025862,
+ -0.993835,-0.024167,0.108201,4.104864,2.298353,0.915735,
+ -0.329373,0.540393,-0.774267,4.047406,2.207209,1.015108,
+ -0.993835,-0.024167,0.108201,4.104864,2.298353,0.915735,
+ -0.76371,-0.034453,0.644639,4.059714,2.194906,0.888152,
+ -0.158973,-0.085654,0.98356,4.061989,2.231988,1.178382,
+ 0.513577,-0.159689,0.843053,4.102304,2.29996,1.025862,
+ -0.329373,0.540393,-0.774267,4.047406,2.207209,1.015108,
+ -0.329373,0.540393,-0.774267,3.989434,2.118832,0.765086,
+ 0.50391,-0.29577,0.811538,4.0247,2.187859,0.814219,
+ -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
+ -0.329373,0.540393,-0.774267,3.989434,2.118832,0.765086,
+ -0.783471,0.056646,0.618841,3.990744,2.205448,0.710795,
+ -0.936127,0.049437,0.348169,3.945464,2.1301,0.689536,
+ -0.105514,0.43457,-0.894436,4.022592,2.123052,0.903284,
+ -0.76371,-0.034453,0.644639,4.059714,2.194906,0.888152,
+ 0.50391,-0.29577,0.811538,4.0247,2.187859,0.814219,
+ -0.105514,0.43457,-0.894436,4.022592,2.123052,0.903284,
+ 0.50391,-0.29577,0.811538,4.0247,2.187859,0.814219,
+ -0.329373,0.540393,-0.774267,3.989434,2.118832,0.765086,
+ -0.105514,0.43457,-0.894436,4.020299,2.141675,1.002365,
+ -0.329373,0.540393,-0.774267,4.047406,2.207209,1.015108,
+ -0.76371,-0.034453,0.644639,4.059714,2.194906,0.888152,
+ -0.105514,0.43457,-0.894436,4.020299,2.141675,1.002365,
+ -0.76371,-0.034453,0.644639,4.059714,2.194906,0.888152,
+ -0.105514,0.43457,-0.894436,4.022592,2.123052,0.903284,
+ -0.158973,-0.085654,0.98356,4.061989,2.231988,1.178382,
+ -0.329373,0.540393,-0.774267,4.047406,2.207209,1.015108,
+ -0.105514,0.43457,-0.894436,4.020299,2.141675,1.002365,
+ -0.570564,0.630958,-0.525689,4.058311,2.293363,1.338054,
+ 0.513205,-0.021212,0.858004,4.097362,2.3666,1.239986,
+ -0.158973,-0.085654,0.98356,4.061989,2.231988,1.178382,
+ 0.908355,-0.087284,0.408989,4.024858,2.106568,1.208099,
+ -0.158973,-0.085654,0.98356,4.061989,2.231988,1.178382,
+ -0.105514,0.43457,-0.894436,4.020299,2.141675,1.002365,
+ 0.908355,-0.087284,0.408989,4.024858,2.106568,1.208099,
+ -0.105514,0.43457,-0.894436,4.020299,2.141675,1.002365,
+ 0.944023,-0.282834,0.169783,4.036947,1.992167,1.072561,
+ -0.570564,0.630958,-0.525689,4.058311,2.293363,1.338054,
+ -0.158973,-0.085654,0.98356,4.061989,2.231988,1.178382,
+ 0.908355,-0.087284,0.408989,4.024858,2.106568,1.208099,
+ 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
+ -0.570564,0.630958,-0.525689,4.046673,2.341349,1.45253,
+ -0.570564,0.630958,-0.525689,4.058311,2.293363,1.338054,
+ 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
+ -0.570564,0.630958,-0.525689,4.058311,2.293363,1.338054,
+ 0.908355,-0.087284,0.408989,4.024858,2.106568,1.208099,
+ 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
+ 0.908355,-0.087284,0.408989,4.024858,2.106568,1.208099,
+ 0.392037,0.915475,-0.09062,4.103303,2.038565,1.363737,
+ 0.944023,-0.282834,0.169783,4.036947,1.992167,1.072561,
+ 0.392037,0.915475,-0.09062,4.152166,1.868775,1.225002,
+ 0.392037,0.915475,-0.09062,4.103303,2.038565,1.363737,
+ 0.944023,-0.282834,0.169783,4.036947,1.992167,1.072561,
+ 0.392037,0.915475,-0.09062,4.103303,2.038565,1.363737,
+ 0.908355,-0.087284,0.408989,4.024858,2.106568,1.208099,
+ -0.121207,0.426739,-0.896216,4.127903,1.828359,1.090512,
+ 0.392037,0.915475,-0.09062,4.152166,1.868775,1.225002,
+ 0.944023,-0.282834,0.169783,4.036947,1.992167,1.072561,
+ -0.121207,0.426739,-0.896216,4.127903,1.828359,1.090512,
+ 0.944023,-0.282834,0.169783,4.036947,1.992167,1.072561,
+ -0.570559,0.630963,0.525688,4.031515,1.968248,0.91846,
+ 0.944023,-0.282834,0.169783,4.036947,1.992167,1.072561,
+ -0.105514,0.43457,-0.894436,4.020299,2.141675,1.002365,
+ -0.105514,0.43457,-0.894436,4.022592,2.123052,0.903284,
+ 0.944023,-0.282834,0.169783,4.036947,1.992167,1.072561,
+ -0.105514,0.43457,-0.894436,4.022592,2.123052,0.903284,
+ -0.570559,0.630963,0.525688,4.031515,1.968248,0.91846,
+ 0.774828,0.16858,0.60928,3.966639,1.969285,0.549291,
+ -0.93621,-0.256398,0.240355,3.857922,2.141554,0.521067,
+ -0.453311,-0.031481,-0.890797,3.823349,2.141733,0.428356,
+ 0.774828,0.16858,0.60928,3.966639,1.969285,0.549291,
+ -0.453311,-0.031481,-0.890797,3.823349,2.141733,0.428356,
+ -0.570559,0.630963,0.525688,3.922437,1.972461,0.483563,
+ 0.774828,0.16858,0.60928,3.98291,1.987391,0.639809,
+ -0.782361,-0.139191,0.607073,3.892378,2.149432,0.603589,
+ -0.93621,-0.256398,0.240355,3.857922,2.141554,0.521067,
+ 0.774828,0.16858,0.60928,3.98291,1.987391,0.639809,
+ -0.93621,-0.256398,0.240355,3.857922,2.141554,0.521067,
+ 0.774828,0.16858,0.60928,3.966639,1.969285,0.549291,
+ -0.142868,0.456449,-0.878204,4.059885,1.86046,0.470087,
+ -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
+ 0.774828,0.16858,0.60928,3.966639,1.969285,0.549291,
+ -0.142868,0.456449,-0.878204,4.059885,1.86046,0.470087,
+ 0.774828,0.16858,0.60928,3.966639,1.969285,0.549291,
+ -0.570559,0.630963,0.525688,3.922437,1.972461,0.483563,
+ -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
+ 0.774828,0.16858,0.60928,3.98291,1.987391,0.639809,
+ 0.774828,0.16858,0.60928,3.966639,1.969285,0.549291,
+ 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
+ -0.570559,0.630963,0.525688,4.031515,1.968248,0.91846,
+ -0.105514,0.43457,-0.894436,4.022592,2.123052,0.903284,
+ 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
+ -0.105514,0.43457,-0.894436,4.022592,2.123052,0.903284,
+ -0.329373,0.540393,-0.774267,3.989434,2.118832,0.765086,
+ -0.329373,0.540393,-0.774267,3.989434,2.118832,0.765086,
+ -0.936127,0.049437,0.348169,3.945464,2.1301,0.689536,
+ 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
+ 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
+ -0.936127,0.049437,0.348169,3.945464,2.1301,0.689536,
+ -0.782361,-0.139191,0.607073,3.892378,2.149432,0.603589,
+ 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
+ -0.782361,-0.139191,0.607073,3.892378,2.149432,0.603589,
+ 0.774828,0.16858,0.60928,3.98291,1.987391,0.639809,
+ -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
+ 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
+ 0.774828,0.16858,0.60928,3.98291,1.987391,0.639809,
+ -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
+ -0.121207,0.426739,-0.896216,4.150297,1.820575,0.917046,
+ 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
+ -0.121207,0.426739,-0.896216,4.150297,1.820575,0.917046,
+ -0.121207,0.426739,-0.896216,4.127903,1.828359,1.090512,
+ -0.570559,0.630963,0.525688,4.031515,1.968248,0.91846,
+ -0.121207,0.426739,-0.896216,4.150297,1.820575,0.917046,
+ -0.570559,0.630963,0.525688,4.031515,1.968248,0.91846,
+ 0.77718,0.24762,0.578512,4.017509,1.996169,0.731654,
+ 0.108306,-0.808441,0.578527,4.389484,2.190421,0.47332,
+ 0.231006,-0.859096,0.456717,4.472349,2.325133,0.443764,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ 0.424214,0.855079,-0.298131,4.3427,2.112281,0.516692,
+ 0.108306,-0.808441,0.578527,4.389484,2.190421,0.47332,
+ 0.77718,0.24762,0.578512,4.314791,2.142163,0.54065,
+ 0.353564,0.891052,-0.284638,4.305411,2.059245,0.539407,
+ 0.424214,0.855079,-0.298131,4.3427,2.112281,0.516692,
+ 0.77718,0.24762,0.578512,4.314791,2.142163,0.54065,
+ 0.108306,-0.808441,0.578527,4.389484,2.190421,0.47332,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ 0.77718,0.24762,0.578512,4.314791,2.142163,0.54065,
+ 0.125846,-0.929941,0.345503,4.43302,2.024714,0.563794,
+ 0.108306,-0.808441,0.578527,4.389484,2.190421,0.47332,
+ 0.424214,0.855079,-0.298131,4.3427,2.112281,0.516692,
+ 0.125846,-0.929941,0.345503,4.43302,2.024714,0.563794,
+ 0.424214,0.855079,-0.298131,4.3427,2.112281,0.516692,
+ 0.353564,0.891052,-0.284638,4.305411,2.059245,0.539407,
+ 0.771387,0.339113,0.538483,4.101726,2.312318,1.438163,
+ -0.142868,0.456449,0.878205,4.148927,2.388726,1.376879,
+ 0.3936,0.919282,0.000642,4.094116,2.426172,1.381032,
+ 0.771387,0.339113,0.538483,4.101726,2.312318,1.438163,
+ 0.3936,0.919282,0.000642,4.094116,2.426172,1.381032,
+ -0.570564,0.630958,-0.525689,4.046673,2.341349,1.45253,
+ 0.63166,0.704336,-0.323908,4.129926,2.30877,1.402259,
+ 0.229942,0.797697,-0.5575,4.140097,2.295949,1.367196,
+ 0.22211,0.815123,-0.535015,4.169404,2.306276,1.284031,
+ 0.63166,0.704336,-0.323908,4.129926,2.30877,1.402259,
+ 0.22211,0.815123,-0.535015,4.169404,2.306276,1.284031,
+ 0.459043,0.888414,0.000701,4.149438,2.34055,1.353693,
+ 0.229942,0.797697,-0.5575,4.140097,2.295949,1.367196,
+ 0.017957,0.744062,-0.667869,4.141759,2.279958,1.29534,
+ 0.22211,0.815123,-0.535015,4.169404,2.306276,1.284031,
+ -0.142868,0.456449,0.878205,4.148927,2.388726,1.376879,
+ -0.142868,0.456449,0.878205,4.197644,2.394643,1.248646,
+ 0.3936,0.919282,0.000642,4.17047,2.458441,1.241846,
+ -0.142868,0.456449,0.878205,4.148927,2.388726,1.376879,
+ 0.3936,0.919282,0.000642,4.17047,2.458441,1.241846,
+ 0.3936,0.919282,0.000642,4.094116,2.426172,1.381032,
+ 0.459043,0.888414,0.000701,4.149438,2.34055,1.353693,
+ 0.498956,0.866627,0.000639,4.197516,2.349135,1.253043,
+ -0.142868,0.456449,0.878205,4.197644,2.394643,1.248646,
+ 0.459043,0.888414,0.000701,4.149438,2.34055,1.353693,
+ -0.142868,0.456449,0.878205,4.197644,2.394643,1.248646,
+ -0.142868,0.456449,0.878205,4.148927,2.388726,1.376879,
+ 0.459043,0.888414,0.000701,4.149438,2.34055,1.353693,
+ 0.22211,0.815123,-0.535015,4.169404,2.306276,1.284031,
+ 0.13983,0.720686,-0.679014,4.199317,2.304652,1.17454,
+ 0.459043,0.888414,0.000701,4.149438,2.34055,1.353693,
+ 0.13983,0.720686,-0.679014,4.199317,2.304652,1.17454,
+ 0.498956,0.866627,0.000639,4.197516,2.349135,1.253043,
+ -0.329371,0.540395,0.774266,4.26732,2.121987,0.61494,
+ 0.77718,0.24762,0.578512,4.314791,2.142163,0.54065,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ -0.329371,0.540395,0.774266,4.26732,2.121987,0.61494,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
+ -0.329371,0.540395,0.774266,4.354411,2.102985,0.80258,
+ -0.329371,0.540395,0.774266,4.26732,2.121987,0.61494,
+ 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
+ -0.329371,0.540395,0.774266,4.354411,2.102985,0.80258,
+ 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
+ -0.105515,0.43457,0.894436,4.38099,2.207701,0.839016,
+ -0.965005,-0.14502,-0.218484,4.212058,2.27945,0.625927,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ 0.73986,-0.312403,0.595828,4.212974,2.303184,0.587113,
+ -0.98488,-0.159984,0.066451,4.229332,2.274522,0.672749,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ -0.965005,-0.14502,-0.218484,4.212058,2.27945,0.625927,
+ 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ -0.98488,-0.159984,0.066451,4.229332,2.274522,0.672749,
+ 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
+ -0.98488,-0.159984,0.066451,4.229332,2.274522,0.672749,
+ 0.74814,-0.190428,0.635629,4.273005,2.310529,0.762172,
+ -0.741934,0.120389,0.659576,4.307092,2.367482,0.877202,
+ 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
+ 0.74814,-0.190428,0.635629,4.273005,2.310529,0.762172,
+ 0.353564,0.891052,-0.284638,4.305411,2.059245,0.539407,
+ 0.77718,0.24762,0.578512,4.314791,2.142163,0.54065,
+ -0.329371,0.540395,0.774266,4.26732,2.121987,0.61494,
+ -0.105515,0.43457,0.894436,4.369751,2.298204,0.921894,
+ -0.105515,0.43457,0.894436,4.38099,2.207701,0.839016,
+ 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
+ -0.105515,0.43457,0.894436,4.369751,2.298204,0.921894,
+ 0.292429,0.900404,-0.322114,4.274886,2.22003,0.679075,
+ -0.741934,0.120389,0.659576,4.307092,2.367482,0.877202,
+ -0.105515,0.43457,0.894436,4.369751,2.298204,0.921894,
+ -0.741934,0.120389,0.659576,4.307092,2.367482,0.877202,
+ -0.982826,0.110983,0.147432,4.266263,2.421651,1.054799,
+ -0.105515,0.43457,0.894436,4.369751,2.298204,0.921894,
+ -0.982826,0.110983,0.147432,4.266263,2.421651,1.054799,
+ 0.781263,0.307132,0.543414,4.303193,2.347123,1.044413,
+ 0.781263,0.307132,0.543414,4.303193,2.347123,1.044413,
+ -0.982826,0.110983,0.147432,4.266263,2.421651,1.054799,
+ -0.989845,0.092874,-0.10762,4.228523,2.435029,1.098575,
+ 0.781263,0.307132,0.543414,4.303193,2.347123,1.044413,
+ -0.989845,0.092874,-0.10762,4.228523,2.435029,1.098575,
+ 0.781263,0.307132,0.543414,4.245861,2.375093,1.141312,
+ -0.989845,0.092874,-0.10762,4.228523,2.435029,1.098575,
+ 0.3936,0.919282,0.000642,4.17047,2.458441,1.241846,
+ -0.142868,0.456449,0.878205,4.197644,2.394643,1.248646,
+ -0.989845,0.092874,-0.10762,4.228523,2.435029,1.098575,
+ -0.142868,0.456449,0.878205,4.197644,2.394643,1.248646,
+ 0.781263,0.307132,0.543414,4.245861,2.375093,1.141312,
+ 0.589285,0.807925,0.000704,4.218457,2.356834,1.142444,
+ 0.781263,0.307132,0.543414,4.245861,2.375093,1.141312,
+ -0.142868,0.456449,0.878205,4.197644,2.394643,1.248646,
+ 0.589285,0.807925,0.000704,4.218457,2.356834,1.142444,
+ -0.142868,0.456449,0.878205,4.197644,2.394643,1.248646,
+ 0.498956,0.866627,0.000639,4.197516,2.349135,1.253043,
+ 0.685325,0.728237,0.000788,4.275405,2.319905,1.0464,
+ 0.781263,0.307132,0.543414,4.303193,2.347123,1.044413,
+ 0.781263,0.307132,0.543414,4.245861,2.375093,1.141312,
+ 0.685325,0.728237,0.000788,4.275405,2.319905,1.0464,
+ 0.781263,0.307132,0.543414,4.245861,2.375093,1.141312,
+ 0.589285,0.807925,0.000704,4.218457,2.356834,1.142444,
+ 0.685325,0.728237,0.000788,4.275405,2.319905,1.0464,
+ 0.682044,0.731311,0.000573,4.296538,2.243779,0.925459,
+ -0.105515,0.43457,0.894436,4.369751,2.298204,0.921894,
+ 0.685325,0.728237,0.000788,4.275405,2.319905,1.0464,
+ -0.105515,0.43457,0.894436,4.369751,2.298204,0.921894,
+ 0.781263,0.307132,0.543414,4.303193,2.347123,1.044413,
+ 0.682044,0.731311,0.000573,4.296538,2.243779,0.925459,
+ 0.649774,0.760128,0.000367,4.289048,2.172969,0.858693,
+ -0.105515,0.43457,0.894436,4.38099,2.207701,0.839016,
+ 0.682044,0.731311,0.000573,4.296538,2.243779,0.925459,
+ -0.105515,0.43457,0.894436,4.38099,2.207701,0.839016,
+ -0.105515,0.43457,0.894436,4.369751,2.298204,0.921894,
+ 0.589285,0.807925,0.000704,4.218457,2.356834,1.142444,
+ 0.498956,0.866627,0.000639,4.197516,2.349135,1.253043,
+ 0.13983,0.720686,-0.679014,4.199317,2.304652,1.17454,
+ 0.282216,0.811186,-0.512182,4.211815,2.28249,1.039137,
+ 0.685325,0.728237,0.000788,4.275405,2.319905,1.0464,
+ 0.589285,0.807925,0.000704,4.218457,2.356834,1.142444,
+ 0.282216,0.811186,-0.512182,4.211815,2.28249,1.039137,
+ 0.589285,0.807925,0.000704,4.218457,2.356834,1.142444,
+ 0.13983,0.720686,-0.679014,4.199317,2.304652,1.17454,
+ 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
+ 0.353564,0.891052,-0.284638,4.305411,2.059245,0.539407,
+ -0.329371,0.540395,0.774266,4.26732,2.121987,0.61494,
+ 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
+ -0.329371,0.540395,0.774266,4.26732,2.121987,0.61494,
+ -0.329371,0.540395,0.774266,4.354411,2.102985,0.80258,
+ 0.391878,0.915416,0.091898,4.290375,2.112337,0.80019,
+ -0.329371,0.540395,0.774266,4.354411,2.102985,0.80258,
+ -0.105515,0.43457,0.894436,4.38099,2.207701,0.839016,
+ 0.391878,0.915416,0.091898,4.290375,2.112337,0.80019,
+ -0.105515,0.43457,0.894436,4.38099,2.207701,0.839016,
+ 0.649774,0.760128,0.000367,4.289048,2.172969,0.858693,
+ 0.540427,-0.323841,-0.776573,4.222795,2.228178,0.952752,
+ 0.682044,0.731311,0.000573,4.296538,2.243779,0.925459,
+ 0.685325,0.728237,0.000788,4.275405,2.319905,1.0464,
+ 0.540427,-0.323841,-0.776573,4.222795,2.228178,0.952752,
+ 0.685325,0.728237,0.000788,4.275405,2.319905,1.0464,
+ 0.282216,0.811186,-0.512182,4.211815,2.28249,1.039137,
+ 0.540427,-0.323841,-0.776573,4.197609,2.164063,0.857433,
+ 0.649774,0.760128,0.000367,4.289048,2.172969,0.858693,
+ 0.682044,0.731311,0.000573,4.296538,2.243779,0.925459,
+ 0.540427,-0.323841,-0.776573,4.197609,2.164063,0.857433,
+ 0.682044,0.731311,0.000573,4.296538,2.243779,0.925459,
+ 0.540427,-0.323841,-0.776573,4.222795,2.228178,0.952752,
+ 0.384749,-0.683591,-0.620219,4.153175,2.084823,0.799668,
+ 0.391878,0.915416,0.091898,4.290375,2.112337,0.80019,
+ 0.649774,0.760128,0.000367,4.289048,2.172969,0.858693,
+ 0.384749,-0.683591,-0.620219,4.153175,2.084823,0.799668,
+ 0.649774,0.760128,0.000367,4.289048,2.172969,0.858693,
+ 0.540427,-0.323841,-0.776573,4.197609,2.164063,0.857433,
+ 0.384749,-0.683591,-0.620219,4.153175,2.084823,0.799668,
+ 0.540427,-0.323841,-0.776573,4.197609,2.164063,0.857433,
+ 0.292794,-0.691168,-0.660725,4.15109,2.102939,0.889759,
+ 0.292794,-0.691168,-0.660725,4.15109,2.102939,0.889759,
+ 0.540427,-0.323841,-0.776573,4.197609,2.164063,0.857433,
+ 0.540427,-0.323841,-0.776573,4.222795,2.228178,0.952752,
+ 0.292794,-0.691168,-0.660725,4.15109,2.102939,0.889759,
+ 0.540427,-0.323841,-0.776573,4.222795,2.228178,0.952752,
+ 0.404933,-0.417851,-0.813283,4.148865,2.148829,0.986567,
+ 0.404933,-0.417851,-0.813283,4.148865,2.148829,0.986567,
+ 0.540427,-0.323841,-0.776573,4.222795,2.228178,0.952752,
+ 0.282216,0.811186,-0.512182,4.211815,2.28249,1.039137,
+ 0.404933,-0.417851,-0.813283,4.148865,2.148829,0.986567,
+ 0.282216,0.811186,-0.512182,4.211815,2.28249,1.039137,
+ 0.551755,-0.23466,-0.800313,4.154566,2.19048,1.129552,
+ 0.551755,-0.23466,-0.800313,4.154566,2.19048,1.129552,
+ 0.282216,0.811186,-0.512182,4.211815,2.28249,1.039137,
+ 0.13983,0.720686,-0.679014,4.199317,2.304652,1.17454,
+ 0.551755,-0.23466,-0.800313,4.154566,2.19048,1.129552,
+ 0.13983,0.720686,-0.679014,4.199317,2.304652,1.17454,
+ 0.202713,-0.881703,-0.426036,4.152557,2.235471,1.217046,
+ 0.202713,-0.881703,-0.426036,4.152557,2.235471,1.217046,
+ 0.13983,0.720686,-0.679014,4.199317,2.304652,1.17454,
+ 0.22211,0.815123,-0.535015,4.169404,2.306276,1.284031,
+ 0.202713,-0.881703,-0.426036,4.152557,2.235471,1.217046,
+ 0.22211,0.815123,-0.535015,4.169404,2.306276,1.284031,
+ 0.017957,0.744062,-0.667869,4.141759,2.279958,1.29534,
+ 0.384749,-0.683591,-0.620219,4.153175,2.084823,0.799668,
+ 0.292794,-0.691168,-0.660725,4.15109,2.102939,0.889759,
+ 0.149569,-0.88683,-0.437221,4.131949,2.050757,0.921856,
+ 0.149569,-0.88683,-0.437221,4.131949,2.050757,0.921856,
+ 0.292794,-0.691168,-0.660725,4.15109,2.102939,0.889759,
+ 0.404933,-0.417851,-0.813283,4.148865,2.148829,0.986567,
+ 0.149569,-0.88683,-0.437221,4.131949,2.050757,0.921856,
+ 0.404933,-0.417851,-0.813283,4.148865,2.148829,0.986567,
+ 0.551755,-0.23466,-0.800313,4.119993,2.063095,1.049178,
+ 0.551755,-0.23466,-0.800313,4.119993,2.063095,1.049178,
+ 0.404933,-0.417851,-0.813283,4.148865,2.148829,0.986567,
+ 0.551755,-0.23466,-0.800313,4.154566,2.19048,1.129552,
+ 0.551755,-0.23466,-0.800313,4.119993,2.063095,1.049178,
+ 0.551755,-0.23466,-0.800313,4.154566,2.19048,1.129552,
+ 0.171366,-0.691521,-0.701735,4.12616,2.12093,1.17252,
+ 0.171366,-0.691521,-0.701735,4.12616,2.12093,1.17252,
+ 0.551755,-0.23466,-0.800313,4.154566,2.19048,1.129552,
+ 0.202713,-0.881703,-0.426036,4.152557,2.235471,1.217046,
+ 0.171366,-0.691521,-0.701735,4.12616,2.12093,1.17252,
+ 0.202713,-0.881703,-0.426036,4.152557,2.235471,1.217046,
+ 0.256636,-0.859143,-0.442732,4.133175,2.175231,1.259323,
+ 0.202713,-0.881703,-0.426036,4.152557,2.235471,1.217046,
+ 0.017957,0.744062,-0.667869,4.141759,2.279958,1.29534,
+ 0.256636,-0.859143,-0.442732,4.133175,2.175231,1.259323,
+ 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
+ 0.149569,-0.88683,-0.437221,4.131949,2.050757,0.921856,
+ 0.551755,-0.23466,-0.800313,4.119993,2.063095,1.049178,
+ 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
+ 0.551755,-0.23466,-0.800313,4.119993,2.063095,1.049178,
+ 0.648166,0.682063,-0.338631,4.137657,1.944837,1.061024,
+ 0.648166,0.682063,-0.338631,4.137657,1.944837,1.061024,
+ 0.551755,-0.23466,-0.800313,4.119993,2.063095,1.049178,
+ 0.171366,-0.691521,-0.701735,4.12616,2.12093,1.17252,
+ 0.648166,0.682063,-0.338631,4.137657,1.944837,1.061024,
+ 0.171366,-0.691521,-0.701735,4.12616,2.12093,1.17252,
+ 0.61118,0.658001,-0.439878,4.143794,2.01372,1.201386,
+ 0.61118,0.658001,-0.439878,4.143794,2.01372,1.201386,
+ 0.171366,-0.691521,-0.701735,4.12616,2.12093,1.17252,
+ 0.256636,-0.859143,-0.442732,4.133175,2.175231,1.259323,
+ 0.61118,0.658001,-0.439878,4.143794,2.01372,1.201386,
+ 0.256636,-0.859143,-0.442732,4.133175,2.175231,1.259323,
+ 0.503641,0.551737,-0.66478,4.12329,2.086854,1.295135,
+ 0.503641,0.551737,-0.66478,4.12329,2.086854,1.295135,
+ 0.256636,-0.859143,-0.442732,4.133175,2.175231,1.259323,
+ 0.017957,0.744062,-0.667869,4.141759,2.279958,1.29534,
+ 0.503641,0.551737,-0.66478,4.12329,2.086854,1.295135,
+ 0.017957,0.744062,-0.667869,4.141759,2.279958,1.29534,
+ 0.517427,0.766113,-0.381235,4.11268,2.195089,1.366908,
+ 0.517427,0.766113,-0.381235,4.11268,2.195089,1.366908,
+ 0.017957,0.744062,-0.667869,4.141759,2.279958,1.29534,
+ 0.229942,0.797697,-0.5575,4.140097,2.295949,1.367196,
+ 0.517427,0.766113,-0.381235,4.11268,2.195089,1.366908,
+ 0.229942,0.797697,-0.5575,4.140097,2.295949,1.367196,
+ 0.41344,0.676483,-0.609457,4.111934,2.234814,1.399949,
+ 0.229942,0.797697,-0.5575,4.140097,2.295949,1.367196,
+ 0.63166,0.704336,-0.323908,4.129926,2.30877,1.402259,
+ 0.41344,0.676483,-0.609457,4.111934,2.234814,1.399949,
+ 0.154813,-0.698608,-0.698555,4.232341,1.903079,0.534362,
+ -0.536419,0.710997,0.454685,4.304562,1.906537,0.572242,
+ 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
+ -0.557881,0.828586,-0.047048,4.303615,1.799914,0.610388,
+ -0.536419,0.710997,0.454685,4.304562,1.906537,0.572242,
+ 0.154813,-0.698608,-0.698555,4.232341,1.903079,0.534362,
+ -0.557881,0.828586,-0.047048,4.303615,1.799914,0.610388,
+ 0.154813,-0.698608,-0.698555,4.232341,1.903079,0.534362,
+ -0.678336,0.658323,0.326299,4.240116,1.770049,0.583946,
+ -0.277696,-0.435918,0.856073,4.377095,1.871713,0.595743,
+ 0.353564,0.891052,-0.284638,4.305411,2.059245,0.539407,
+ 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
+ -0.277696,-0.435918,0.856073,4.377095,1.871713,0.595743,
+ 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
+ -0.536419,0.710997,0.454685,4.304562,1.906537,0.572242,
+ 0.003817,-0.976864,0.213829,4.43261,1.878873,0.577888,
+ 0.125846,-0.929941,0.345503,4.43302,2.024714,0.563794,
+ 0.353564,0.891052,-0.284638,4.305411,2.059245,0.539407,
+ 0.003817,-0.976864,0.213829,4.43261,1.878873,0.577888,
+ 0.353564,0.891052,-0.284638,4.305411,2.059245,0.539407,
+ -0.277696,-0.435918,0.856073,4.377095,1.871713,0.595743,
+ -0.678336,0.658323,0.326299,4.240116,1.770049,0.583946,
+ 0.154813,-0.698608,-0.698555,4.232341,1.903079,0.534362,
+ -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
+ -0.678336,0.658323,0.326299,4.240116,1.770049,0.583946,
+ -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
+ -0.641133,0.599375,0.479267,4.148883,1.759918,0.573765,
+ 0.391878,0.915416,0.091898,4.281287,2.055751,0.787,
+ -0.329371,0.540395,0.774266,4.354411,2.102985,0.80258,
+ 0.391878,0.915416,0.091898,4.290375,2.112337,0.80019,
+ 0.391878,0.915416,0.091898,4.281287,2.055751,0.787,
+ -0.121207,0.426739,0.896216,4.354941,2.064161,0.778851,
+ -0.329371,0.540395,0.774266,4.354411,2.102985,0.80258,
+ -0.121207,0.426739,0.896216,4.245225,2.008532,0.772641,
+ -0.121207,0.426739,0.896216,4.354941,2.064161,0.778851,
+ 0.391878,0.915416,0.091898,4.281287,2.055751,0.787,
+ 0.391878,0.915416,0.091898,4.281287,2.055751,0.787,
+ 0.391878,0.915416,0.091898,4.290375,2.112337,0.80019,
+ 0.384749,-0.683591,-0.620219,4.153175,2.084823,0.799668,
+ 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
+ 0.391878,0.915416,0.091898,4.281287,2.055751,0.787,
+ 0.384749,-0.683591,-0.620219,4.153175,2.084823,0.799668,
+ 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
+ 0.384749,-0.683591,-0.620219,4.153175,2.084823,0.799668,
+ 0.149569,-0.88683,-0.437221,4.131949,2.050757,0.921856,
+ 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
+ -0.329371,0.540395,0.774266,4.354411,2.102985,0.80258,
+ -0.121207,0.426739,0.896216,4.354941,2.064161,0.778851,
+ -0.121207,0.426739,0.896216,4.245225,2.008532,0.772641,
+ 0.154813,-0.698608,-0.698555,4.232341,1.903079,0.534362,
+ 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
+ -0.121207,0.426739,0.896216,4.245225,2.008532,0.772641,
+ 0.259533,0.686122,-0.679617,4.278045,1.97666,0.537351,
+ -0.121207,0.426739,0.896216,4.354941,2.064161,0.778851,
+ -0.121207,0.426739,0.896216,4.245225,2.008532,0.772641,
+ 0.391878,0.915416,0.091898,4.281287,2.055751,0.787,
+ 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
+ 0.969409,0.243854,0.027951,5.959462,1.157227,0.187097,
+ 0.000755,0.939586,-0.342312,5.950684,1.082725,0.175648,
+ 0.461485,0.788926,-0.405742,5.961686,1.110978,0.090324,
+ 0.969409,0.243854,0.027951,5.959462,1.157227,0.187097,
+ 0.461485,0.788926,-0.405742,5.961686,1.110978,0.090324,
+ 0.04154,0.947538,-0.316933,5.998088,1.231874,0.107334,
+ 0.104327,0.725166,-0.680625,5.755282,1.004149,0.307505,
+ 0.288171,0.239223,-0.927216,5.763952,1.062109,0.338641,
+ -0.163152,0.699849,-0.695408,5.681086,1.054964,0.35586,
+ 0.104327,0.725166,-0.680625,5.755282,1.004149,0.307505,
+ -0.163152,0.699849,-0.695408,5.681086,1.054964,0.35586,
+ -0.011269,-0.268801,-0.96313,5.672385,1.007694,0.341778,
+ -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
+ -0.434729,0.079706,0.897027,5.730427,1.435668,0.209848,
+ -0.419631,0.061765,0.905591,5.685194,1.452202,0.188749,
+ -0.497134,0.140474,0.856227,5.710154,1.360653,0.290072,
+ -0.419631,0.061765,0.905591,5.685194,1.452202,0.188749,
+ -0.400711,0.089186,0.911853,5.647186,1.394606,0.257833,
+ -0.023775,-0.598435,0.800818,4.991713,1.163096,0.504149,
+ -0.77316,0.344902,0.532228,5.011084,1.06677,0.458562,
+ 0.157921,-0.851177,-0.500559,5.241466,1.040469,0.383965,
+ -0.023775,-0.598435,0.800818,4.991713,1.163096,0.504149,
+ 0.157921,-0.851177,-0.500559,5.241466,1.040469,0.383965,
+ 0.009824,-0.644035,0.764933,5.250485,1.123029,0.385234,
+ 0.123418,-0.784469,0.607763,4.641547,1.285422,0.622034,
+ 0.050019,-0.552867,0.831767,4.522247,1.398278,0.644892,
+ -0.395804,0.901672,0.174144,4.449011,1.260929,0.647431,
+ 0.123418,-0.784469,0.607763,4.641547,1.285422,0.622034,
+ -0.395804,0.901672,0.174144,4.449011,1.260929,0.647431,
+ -0.911194,0.285551,0.296961,4.567896,1.149805,0.642484,
+ 0.901575,-0.270544,0.337593,4.742358,1.882232,0.62165,
+ 0.689769,-0.265624,0.673544,4.728963,2.036146,0.614307,
+ 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
+ 0.901575,-0.270544,0.337593,4.742358,1.882232,0.62165,
+ 0.190357,-0.604308,0.773677,4.688114,2.046378,0.604518,
+ 0.152967,-0.640193,0.752831,4.697024,1.862575,0.604048,
+ 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
+ 0.347794,0.132396,0.928176,4.824747,1.946835,0.626358,
+ 0.36359,0.089346,0.927264,4.861611,2.001639,0.621913,
+ 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
+ 0.36359,0.089346,0.927264,4.861611,2.001639,0.621913,
+ 0.195545,0.103956,0.975169,4.842883,2.021333,0.638025,
+ 0.168187,0.300291,0.938903,4.852582,1.816115,0.603105,
+ 0.272203,0.043076,0.961275,4.861618,1.854067,0.618095,
+ 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
+ 0.282492,0.026081,0.958915,4.973133,1.992779,0.533466,
+ 0.210495,0.185422,0.959849,4.991746,2.009819,0.523206,
+ 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
+ 0.282492,0.026081,0.958915,4.973133,1.992779,0.533466,
+ 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
+ 0.361081,-0.056526,0.93082,4.935561,2.016016,0.5857,
+ 0.337014,-0.030018,0.941021,4.760921,1.881357,0.61312,
+ 0.067357,0.280764,0.95741,4.788476,2.028047,0.608619,
+ -0.026366,0.234118,0.971851,4.751519,2.039658,0.634134,
+ 0.289202,0.572304,0.767353,4.991709,1.844295,0.520761,
+ 0.154687,0.171026,0.973048,5.01143,1.875569,0.463205,
+ 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
+ 0.289202,0.572304,0.767353,4.991709,1.844295,0.520761,
+ 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
+ 0.362705,0.428702,0.827442,4.982364,1.8733,0.53619,
+ 0.380651,0.443224,0.811577,5.001903,1.914398,0.486724,
+ 0.154687,0.171026,0.973048,5.01143,1.875569,0.463205,
+ 0.210495,0.185422,0.959849,4.991746,2.009819,0.523206,
+ 0.196849,0.14562,0.969559,4.93588,2.051665,0.572853,
+ 0.054287,0.055115,0.997003,4.918466,2.084725,0.532713,
+ 0.012421,0.392537,0.919652,4.881574,2.094571,0.539949,
+ 0.399187,-0.679804,0.615237,4.74405,2.179337,0.556057,
+ 0.428199,-0.104479,0.897624,4.837331,2.235678,0.479332,
+ 0.244568,-0.044721,0.9686,4.739441,2.299169,0.369987,
+ 0.399187,-0.679804,0.615237,4.74405,2.179337,0.556057,
+ 0.244568,-0.044721,0.9686,4.739441,2.299169,0.369987,
+ 0.223925,-0.919003,0.324486,4.636582,2.263383,0.471997,
+ 0.550963,0.62763,0.550018,5.075994,1.900999,0.443793,
+ 0.72603,0.248277,0.641279,5.095375,1.961238,0.401516,
+ 0.670109,-0.356989,0.650778,5.067202,2.027704,0.422291,
+ 0.550963,0.62763,0.550018,5.075994,1.900999,0.443793,
+ 0.670109,-0.356989,0.650778,5.067202,2.027704,0.422291,
+ 0.615065,0.769234,0.173133,5.057495,2.002751,0.451974,
+ 0.771387,0.339113,0.538483,4.101726,2.312318,1.438163,
+ -0.570564,0.630958,-0.525689,4.046673,2.341349,1.45253,
+ 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
+ 0.41344,0.676483,-0.609457,4.111934,2.234814,1.399949,
+ 0.63166,0.704336,-0.323908,4.129926,2.30877,1.402259,
+ 0.771387,0.339113,0.538483,4.101726,2.312318,1.438163,
+ 0.41344,0.676483,-0.609457,4.111934,2.234814,1.399949,
+ 0.771387,0.339113,0.538483,4.101726,2.312318,1.438163,
+ 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
+ -0.121207,0.426739,-0.896216,4.150297,1.820575,0.917046,
+ -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
+ -0.121207,0.426739,0.896216,4.245225,2.008532,0.772641,
+ -0.121207,0.426739,-0.896216,4.150297,1.820575,0.917046,
+ -0.121207,0.426739,0.896216,4.245225,2.008532,0.772641,
+ 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
+ -0.121207,0.426739,-0.896216,4.127903,1.828359,1.090512,
+ -0.121207,0.426739,-0.896216,4.150297,1.820575,0.917046,
+ 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
+ -0.121207,0.426739,-0.896216,4.127903,1.828359,1.090512,
+ 0.600629,0.618513,-0.506642,4.159229,1.949902,0.923197,
+ 0.648166,0.682063,-0.338631,4.137657,1.944837,1.061024,
+ 0.392037,0.915475,-0.09062,4.152166,1.868775,1.225002,
+ -0.121207,0.426739,-0.896216,4.127903,1.828359,1.090512,
+ 0.648166,0.682063,-0.338631,4.137657,1.944837,1.061024,
+ 0.392037,0.915475,-0.09062,4.152166,1.868775,1.225002,
+ 0.648166,0.682063,-0.338631,4.137657,1.944837,1.061024,
+ 0.61118,0.658001,-0.439878,4.143794,2.01372,1.201386,
+ 0.392037,0.915475,-0.09062,4.103303,2.038565,1.363737,
+ 0.392037,0.915475,-0.09062,4.152166,1.868775,1.225002,
+ 0.61118,0.658001,-0.439878,4.143794,2.01372,1.201386,
+ 0.392037,0.915475,-0.09062,4.103303,2.038565,1.363737,
+ 0.61118,0.658001,-0.439878,4.143794,2.01372,1.201386,
+ 0.503641,0.551737,-0.66478,4.12329,2.086854,1.295135,
+ 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
+ 0.392037,0.915475,-0.09062,4.103303,2.038565,1.363737,
+ 0.503641,0.551737,-0.66478,4.12329,2.086854,1.295135,
+ 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
+ 0.503641,0.551737,-0.66478,4.12329,2.086854,1.295135,
+ 0.517427,0.766113,-0.381235,4.11268,2.195089,1.366908,
+ 0.908355,-0.087284,0.408989,4.082988,2.175805,1.45093,
+ 0.517427,0.766113,-0.381235,4.11268,2.195089,1.366908,
+ 0.41344,0.676483,-0.609457,4.111934,2.234814,1.399949,
+ -0.760994,0.140163,0.633437,4.076852,1.746601,0.527436,
+ -0.641133,0.599375,0.479267,4.148883,1.759918,0.573765,
+ -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
+ -0.760994,0.140163,0.633437,4.076852,1.746601,0.527436,
+ -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
+ -0.142868,0.456449,-0.878204,4.059885,1.86046,0.470087,
+ 0.000801,-1,-0.000539,4.380854,0.704574,-0.00013,
+ -0.659696,0.567802,0.492343,4.359048,0.700414,0.166651,
+ 0.804239,-0.153549,0.574128,4.120842,0.627141,0.185461,
+ 0.000801,-1,-0.000539,4.380854,0.704574,-0.00013,
+ 0.804239,-0.153549,0.574128,4.120842,0.627141,0.185461,
+ -0.926486,-0.356041,-0.121897,4.126565,0.642027,0,
+ -0.760994,0.140163,0.633437,4.076852,1.746601,0.527436,
+ -0.142868,0.456449,-0.878204,4.059885,1.86046,0.470087,
+ 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
+ -0.560402,0.735791,0.380211,4.067576,1.572668,0.534997,
+ -0.760994,0.140163,0.633437,4.076852,1.746601,0.527436,
+ 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
+ -0.560402,0.735791,0.380211,4.067576,1.572668,0.534997,
+ 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
+ 0.696162,0.333274,0.635835,3.886058,1.550141,0.50483,
+ -0.610894,0.790229,-0.048447,4.085564,1.288885,0.544406,
+ -0.560402,0.735791,0.380211,4.067576,1.572668,0.534997,
+ 0.696162,0.333274,0.635835,3.886058,1.550141,0.50483,
+ -0.610894,0.790229,-0.048447,4.085564,1.288885,0.544406,
+ 0.696162,0.333274,0.635835,3.886058,1.550141,0.50483,
+ 0.763734,0.228435,0.603761,3.98851,1.297806,0.539537,
+ -0.590367,0.807126,-0.003753,4.141189,1.008775,0.499342,
+ -0.610894,0.790229,-0.048447,4.085564,1.288885,0.544406,
+ 0.763734,0.228435,0.603761,3.98851,1.297806,0.539537,
+ -0.590367,0.807126,-0.003753,4.141189,1.008775,0.499342,
+ 0.763734,0.228435,0.603761,3.98851,1.297806,0.539537,
+ 0.769758,0.095155,0.631204,4.041657,1.039756,0.496922,
+ 0.206279,0.744917,0.634467,4.216374,0.852328,0.405873,
+ -0.590367,0.807126,-0.003753,4.141189,1.008775,0.499342,
+ 0.769758,0.095155,0.631204,4.041657,1.039756,0.496922,
+ 0.206279,0.744917,0.634467,4.216374,0.852328,0.405873,
+ 0.769758,0.095155,0.631204,4.041657,1.039756,0.496922,
+ 0.771881,-0.100912,0.627707,4.068249,0.798926,0.400813,
+ 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
+ 0.206279,0.744917,0.634467,4.216374,0.852328,0.405873,
+ 0.771881,-0.100912,0.627707,4.068249,0.798926,0.400813,
+ 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
+ 0.771881,-0.100912,0.627707,4.068249,0.798926,0.400813,
+ 0.788801,-0.199379,0.581412,4.105198,0.672581,0.300001,
+ -0.659696,0.567802,0.492343,4.359048,0.700414,0.166651,
+ 0.11638,0.680311,0.723624,4.319799,0.731007,0.291212,
+ 0.788801,-0.199379,0.581412,4.105198,0.672581,0.300001,
+ -0.659696,0.567802,0.492343,4.359048,0.700414,0.166651,
+ 0.788801,-0.199379,0.581412,4.105198,0.672581,0.300001,
+ 0.804239,-0.153549,0.574128,4.120842,0.627141,0.185461,
+ 0.241303,0.584582,0.77462,3.758215,2.206683,0.323051,
+ -0.745507,-0.065161,-0.663305,3.870548,2.292106,0.368964,
+ -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
+ 0.241303,0.584582,0.77462,3.758215,2.206683,0.323051,
+ -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
+ 0.072694,0.752739,0.654294,3.745669,2.266001,0.24193,
+ -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
+ 0.622247,0.782821,-0.000247,3.787342,2.396113,-0.001159,
+ 0.431966,-0.771434,-0.46722,3.71636,2.343387,0,
+ -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
+ 0.431966,-0.771434,-0.46722,3.71636,2.343387,0,
+ -0.071584,0.92252,0.379253,3.727093,2.308406,0.150049,
+ -0.613241,-0.041068,-0.788827,3.828001,2.35254,0.233341,
+ -0.071584,0.92252,0.379253,3.727093,2.308406,0.150049,
+ 0.072694,0.752739,0.654294,3.745669,2.266001,0.24193,
+ 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
+ -0.142868,0.456449,-0.878204,4.059885,1.86046,0.470087,
+ -0.570559,0.630963,0.525688,3.922437,1.972461,0.483563,
+ 0.462789,0.48004,0.745243,3.814876,1.968416,0.443,
+ 0.539114,0.412574,0.734261,3.881998,1.764428,0.476337,
+ -0.570559,0.630963,0.525688,3.922437,1.972461,0.483563,
+ 0.462789,0.48004,0.745243,3.814876,1.968416,0.443,
+ -0.570559,0.630963,0.525688,3.922437,1.972461,0.483563,
+ -0.453311,-0.031481,-0.890797,3.823349,2.141733,0.428356,
+ 0.241303,0.584582,0.77462,3.758215,2.206683,0.323051,
+ 0.462789,0.48004,0.745243,3.814876,1.968416,0.443,
+ -0.453311,-0.031481,-0.890797,3.823349,2.141733,0.428356,
+ 0.241303,0.584582,0.77462,3.758215,2.206683,0.323051,
+ -0.453311,-0.031481,-0.890797,3.823349,2.141733,0.428356,
+ -0.745507,-0.065161,-0.663305,3.870548,2.292106,0.368964,
+ -0.142868,0.456449,-0.878204,4.094112,1.889281,0.578435,
+ 0.154813,-0.698608,-0.698555,4.232341,1.903079,0.534362,
+ -0.121207,0.426739,0.896216,4.245225,2.008532,0.772641,
+ -0.020456,0.943466,0.330837,1.700797,-2.794792,0.82425,
+ 0.21689,-0.976039,-0.017487,1.718315,-2.775468,0.921796,
+ 0.383337,-0.601981,-0.700479,1.678986,-2.513137,0.891745,
+ -0.020456,0.943466,0.330837,1.700797,-2.794792,0.82425,
+ 0.383337,-0.601981,-0.700479,1.678986,-2.513137,0.891745,
+ 0.717573,0.343682,-0.605782,1.655948,-2.520927,0.844269,
+ -0.020456,0.943466,0.330837,1.700797,-2.794792,0.82425,
+ -0.065687,-0.249194,-0.966223,1.705953,-3.006628,0.83263,
+ -0.424393,0.057227,0.903668,1.734568,-2.965876,0.986396,
+ -0.020456,0.943466,0.330837,1.700797,-2.794792,0.82425,
+ -0.424393,0.057227,0.903668,1.734568,-2.965876,0.986396,
+ 0.21689,-0.976039,-0.017487,1.718315,-2.775468,0.921796,
+ -0.329905,-0.225598,0.916661,-0.972514,-1.822778,0.372649,
+ -0.055857,0.145868,0.987726,-0.977375,-1.793126,0.498747,
+ -0.182029,-0.190207,0.964721,-1.108758,-1.770749,0.473033,
+ -0.329905,-0.225598,0.916661,-0.972514,-1.822778,0.372649,
+ -0.182029,-0.190207,0.964721,-1.108758,-1.770749,0.473033,
+ -0.571338,-0.120921,0.811758,-1.305099,-1.70846,0.48423,
+ -0.571338,-0.120921,0.811758,-1.305099,-1.70846,0.48423,
+ 0.714393,-0.109998,0.691045,-1.266738,-1.691944,0.557922,
+ -0.587909,-0.233166,0.774594,-1.397474,-1.693815,0.570541,
+ -0.571338,-0.120921,0.811758,-1.305099,-1.70846,0.48423,
+ -0.587909,-0.233166,0.774594,-1.397474,-1.693815,0.570541,
+ 0.023392,-0.110333,0.993619,-1.406693,-1.697325,0.450399,
+ -0.468954,-0.586277,0.660577,-3.35851,1.810253,0.380095,
+ 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
+ 0.072535,0.997366,0,-3.392806,1.769365,0,
+ 0.072535,0.997366,0,-3.392806,1.769365,0,
+ 0.431712,0.22912,0.872427,-3.413372,1.871604,0.142309,
+ 0.588787,-0.248294,0.769207,-3.380836,1.819691,0.123273,
+ 0.072535,0.997366,0,-3.392806,1.769365,0,
+ 0.588787,-0.248294,0.769207,-3.380836,1.819691,0.123273,
+ 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085,
+ -0.142868,0.456449,0.878205,4.148927,2.388726,1.376879,
+ 0.771387,0.339113,0.538483,4.101726,2.312318,1.438163,
+ 0.63166,0.704336,-0.323908,4.129926,2.30877,1.402259,
+ -0.142868,0.456449,0.878205,4.148927,2.388726,1.376879,
+ 0.63166,0.704336,-0.323908,4.129926,2.30877,1.402259,
+ 0.459043,0.888414,0.000701,4.149438,2.34055,1.353693,
+ -0.037581,-0.042039,-0.998409,-2.964215,-1.978727,0.776572,
+ -0.377491,-0.043727,0.92498,-3.066022,-1.953125,0.719516,
+ 0.713401,0.39471,-0.579019,-3.008323,-1.759271,0.655672,
+ -0.037581,-0.042039,-0.998409,-2.964215,-1.978727,0.776572,
+ 0.713401,0.39471,-0.579019,-3.008323,-1.759271,0.655672,
+ -0.732521,-0.474279,0.488336,-2.811581,-1.79821,0.712737,
+ -0.377491,-0.043727,0.92498,-3.066022,-1.953125,0.719516,
+ 0.684558,0.361153,-0.633205,-3.211005,-1.850398,0.700723,
+ 0.843062,-0.10517,0.527433,-3.139394,-1.687482,0.638546,
+ -0.377491,-0.043727,0.92498,-3.066022,-1.953125,0.719516,
+ 0.843062,-0.10517,0.527433,-3.139394,-1.687482,0.638546,
+ 0.713401,0.39471,-0.579019,-3.008323,-1.759271,0.655672,
+ 0.588787,-0.248294,0.769207,-3.380836,1.819691,0.123273,
+ 0.490646,-0.178294,0.852923,-3.357009,1.781675,0.071216,
+ 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085,
+ 0.389161,-0.829175,-0.401277,-3.357009,1.781675,-0.071216,
+ 0.255239,-0.528231,-0.80983,-3.380836,1.819691,-0.123273,
+ 0.411442,-0.911436,-0.000099,-3.348274,1.767738,-0.000085
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,13050,data,NULL};
+const struct gllist *cow_hide=&frame;
diff --git a/hacks/glx/cow_hoofs.c b/hacks/glx/cow_hoofs.c
new file mode 100644
index 0000000..b66ef88
--- /dev/null
+++ b/hacks/glx/cow_hoofs.c
@@ -0,0 +1,1037 @@
+#include "gllist.h"
+static const float data[]={
+ 0.013288,-0.297478,-0.954636,1.970051,-3.141862,-1.065178,
+ -0.228294,-0.186048,-0.955651,2.110033,-3.148257,-1.068816,
+ -0.562282,-0.328888,-0.75873,2.14888,-3.221616,-1.076203,
+ 0.013288,-0.297478,-0.954636,1.970051,-3.141862,-1.065178,
+ -0.562282,-0.328888,-0.75873,2.14888,-3.221616,-1.076203,
+ 0.157806,0.230904,-0.960094,2.031262,-3.256709,-1.111122,
+ 0.157806,0.230904,-0.960094,2.031262,-3.256709,-1.111122,
+ -0.562282,-0.328888,-0.75873,2.14888,-3.221616,-1.076203,
+ -0.144755,0.439659,-0.886423,2.247981,-3.342804,-1.127459,
+ 0.157806,0.230904,-0.960094,2.031262,-3.256709,-1.111122,
+ -0.144755,0.439659,-0.886423,2.247981,-3.342804,-1.127459,
+ 0.339699,0.626415,-0.701576,2.138771,-3.397683,-1.214726,
+ 0.339699,0.626415,-0.701576,2.138771,-3.397683,-1.214726,
+ -0.144755,0.439659,-0.886423,2.247981,-3.342804,-1.127459,
+ 0.457854,0.537523,-0.708123,2.343303,-3.507846,-1.195262,
+ 0.339699,0.626415,-0.701576,2.138771,-3.397683,-1.214726,
+ 0.457854,0.537523,-0.708123,2.343303,-3.507846,-1.195262,
+ -0.081045,0.409121,-0.908874,2.254361,-3.550931,-1.235118,
+ -0.081045,0.409121,-0.908874,2.254361,-3.550931,-1.235118,
+ 0.444124,0.617475,-0.649214,2.025468,-3.556842,-1.204841,
+ 0.010538,0.399391,-0.91672,1.981186,-3.441282,-1.180532,
+ -0.081045,0.409121,-0.908874,2.254361,-3.550931,-1.235118,
+ 0.010538,0.399391,-0.91672,1.981186,-3.441282,-1.180532,
+ 0.339699,0.626415,-0.701576,2.138771,-3.397683,-1.214726,
+ 0.339699,0.626415,-0.701576,2.138771,-3.397683,-1.214726,
+ 0.010538,0.399391,-0.91672,1.981186,-3.441282,-1.180532,
+ 0.636282,0.100893,-0.764831,1.926176,-3.28888,-1.093746,
+ 0.339699,0.626415,-0.701576,2.138771,-3.397683,-1.214726,
+ 0.636282,0.100893,-0.764831,1.926176,-3.28888,-1.093746,
+ 0.157806,0.230904,-0.960094,2.031262,-3.256709,-1.111122,
+ 0.157806,0.230904,-0.960094,2.031262,-3.256709,-1.111122,
+ 0.636282,0.100893,-0.764831,1.926176,-3.28888,-1.093746,
+ 0.213417,-0.547723,-0.808983,1.886443,-3.191742,-1.047318,
+ 0.157806,0.230904,-0.960094,2.031262,-3.256709,-1.111122,
+ 0.213417,-0.547723,-0.808983,1.886443,-3.191742,-1.047318,
+ 0.013288,-0.297478,-0.954636,1.970051,-3.141862,-1.065178,
+ -0.430523,-0.648445,-0.627828,2.281229,-3.33825,-1.043475,
+ -0.144755,0.439659,-0.886423,2.247981,-3.342804,-1.127459,
+ -0.562282,-0.328888,-0.75873,2.14888,-3.221616,-1.076203,
+ -0.430523,-0.648445,-0.627828,2.281229,-3.33825,-1.043475,
+ -0.562282,-0.328888,-0.75873,2.14888,-3.221616,-1.076203,
+ -0.492627,0.113675,-0.862784,2.201939,-3.226457,-0.996503,
+ -0.492627,0.113675,-0.862784,2.201939,-3.226457,-0.996503,
+ -0.562282,-0.328888,-0.75873,2.14888,-3.221616,-1.076203,
+ -0.228294,-0.186048,-0.955651,2.110033,-3.148257,-1.068816,
+ -0.492627,0.113675,-0.862784,2.201939,-3.226457,-0.996503,
+ -0.228294,-0.186048,-0.955651,2.110033,-3.148257,-1.068816,
+ -0.495591,0.225654,-0.838731,2.170039,-3.134504,-0.978866,
+ -0.495591,0.225654,-0.838731,2.170039,-3.134504,-0.978866,
+ -0.541077,0.245809,-0.804247,2.091539,-3.032437,-0.947029,
+ 0.672893,0.661099,-0.331908,2.113587,-3.011851,-0.851648,
+ -0.495591,0.225654,-0.838731,2.170039,-3.134504,-0.978866,
+ 0.672893,0.661099,-0.331908,2.113587,-3.011851,-0.851648,
+ 0.768072,0.514957,-0.380637,2.217369,-3.156093,-0.888927,
+ 0.626232,0.565165,-0.53705,1.841888,-3.246003,-1.014774,
+ 0.213417,-0.547723,-0.808983,1.886443,-3.191742,-1.047318,
+ 0.636282,0.100893,-0.764831,1.926176,-3.28888,-1.093746,
+ 0.626232,0.565165,-0.53705,1.841888,-3.246003,-1.014774,
+ 0.636282,0.100893,-0.764831,1.926176,-3.28888,-1.093746,
+ 0.52783,0.437826,-0.727807,1.865135,-3.353827,-1.054981,
+ 0.862528,0.499882,0.078511,1.919391,-3.487078,-1.110869,
+ 0.52783,0.437826,-0.727807,1.865135,-3.353827,-1.054981,
+ 0.636282,0.100893,-0.764831,1.926176,-3.28888,-1.093746,
+ 0.862528,0.499882,0.078511,1.919391,-3.487078,-1.110869,
+ 0.636282,0.100893,-0.764831,1.926176,-3.28888,-1.093746,
+ 0.010538,0.399391,-0.91672,1.981186,-3.441282,-1.180532,
+ 0.010538,0.399391,-0.91672,1.981186,-3.441282,-1.180532,
+ 0.444124,0.617475,-0.649214,2.025468,-3.556842,-1.204841,
+ 0.862528,0.499882,0.078511,1.919391,-3.487078,-1.110869,
+ 0.872426,0.488735,0.003222,1.980621,-3.043895,-0.964237,
+ -0.495591,0.225654,-0.838731,2.170039,-3.134504,-0.978866,
+ -0.228294,-0.186048,-0.955651,2.110033,-3.148257,-1.068816,
+ -0.783521,-0.393963,-0.480508,1.806407,-3.173343,-0.834455,
+ 0.926951,0.366239,0.081429,1.811797,-3.135641,-0.933096,
+ 0.626232,0.565165,-0.53705,1.841888,-3.246003,-1.014774,
+ -0.783521,-0.393963,-0.480508,1.806407,-3.173343,-0.834455,
+ 0.626232,0.565165,-0.53705,1.841888,-3.246003,-1.014774,
+ 0.215809,0.484483,-0.847763,1.83279,-3.296508,-0.865078,
+ -0.997638,0.009858,0.067986,1.933899,-3.546253,-0.912438,
+ 0.862528,0.499882,0.078511,1.919391,-3.487078,-1.110869,
+ 0.444124,0.617475,-0.649214,2.025468,-3.556842,-1.204841,
+ -0.997638,0.009858,0.067986,1.933899,-3.546253,-0.912438,
+ 0.444124,0.617475,-0.649214,2.025468,-3.556842,-1.204841,
+ -0.987313,0.097592,0.125253,2.078928,-3.584991,-0.917088,
+ 0.215809,0.484483,-0.847763,1.83279,-3.296508,-0.865078,
+ 0.626232,0.565165,-0.53705,1.841888,-3.246003,-1.014774,
+ 0.52783,0.437826,-0.727807,1.865135,-3.353827,-1.054981,
+ 0.215809,0.484483,-0.847763,1.83279,-3.296508,-0.865078,
+ 0.52783,0.437826,-0.727807,1.865135,-3.353827,-1.054981,
+ -0.955753,-0.169718,0.240275,1.839523,-3.405292,-0.883488,
+ -0.955753,-0.169718,0.240275,1.839523,-3.405292,-0.883488,
+ 0.52783,0.437826,-0.727807,1.865135,-3.353827,-1.054981,
+ 0.862528,0.499882,0.078511,1.919391,-3.487078,-1.110869,
+ -0.955753,-0.169718,0.240275,1.839523,-3.405292,-0.883488,
+ 0.862528,0.499882,0.078511,1.919391,-3.487078,-1.110869,
+ -0.997638,0.009858,0.067986,1.933899,-3.546253,-0.912438,
+ 0.215809,0.484483,-0.847763,1.83279,-3.296508,-0.865078,
+ -0.150944,-0.987886,0.036011,1.92973,-3.298418,-0.689538,
+ -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
+ 0.215809,0.484483,-0.847763,1.83279,-3.296508,-0.865078,
+ -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
+ -0.783521,-0.393963,-0.480508,1.806407,-3.173343,-0.834455,
+ 0.215809,0.484483,-0.847763,1.83279,-3.296508,-0.865078,
+ -0.955753,-0.169718,0.240275,1.839523,-3.405292,-0.883488,
+ -0.937976,-0.320543,0.132115,1.941325,-3.434803,-0.701314,
+ 0.215809,0.484483,-0.847763,1.83279,-3.296508,-0.865078,
+ -0.937976,-0.320543,0.132115,1.941325,-3.434803,-0.701314,
+ -0.150944,-0.987886,0.036011,1.92973,-3.298418,-0.689538,
+ -0.937976,-0.320543,0.132115,1.941325,-3.434803,-0.701314,
+ -0.955753,-0.169718,0.240275,1.839523,-3.405292,-0.883488,
+ -0.997638,0.009858,0.067986,1.933899,-3.546253,-0.912438,
+ -0.937976,-0.320543,0.132115,1.941325,-3.434803,-0.701314,
+ -0.997638,0.009858,0.067986,1.933899,-3.546253,-0.912438,
+ -0.4909,0.016111,0.871067,2.002745,-3.52342,-0.688103,
+ -0.4909,0.016111,0.871067,2.002745,-3.52342,-0.688103,
+ -0.997638,0.009858,0.067986,1.933899,-3.546253,-0.912438,
+ -0.987313,0.097592,0.125253,2.078928,-3.584991,-0.917088,
+ -0.4909,0.016111,0.871067,2.002745,-3.52342,-0.688103,
+ -0.987313,0.097592,0.125253,2.078928,-3.584991,-0.917088,
+ -0.184432,-0.109597,0.976716,2.126553,-3.549679,-0.701005,
+ -0.184432,-0.109597,0.976716,2.126553,-3.549679,-0.701005,
+ -0.987313,0.097592,0.125253,2.078928,-3.584991,-0.917088,
+ -0.554502,-0.046423,0.830886,2.197935,-3.583948,-0.936437,
+ -0.184432,-0.109597,0.976716,2.126553,-3.549679,-0.701005,
+ -0.554502,-0.046423,0.830886,2.197935,-3.583948,-0.936437,
+ -0.554151,-0.205896,0.806551,2.244147,-3.545557,-0.732888,
+ -0.069765,-0.126006,0.989573,1.898573,-3.068274,-0.994338,
+ 0.872426,0.488735,0.003222,1.980621,-3.043895,-0.964237,
+ -0.228294,-0.186048,-0.955651,2.110033,-3.148257,-1.068816,
+ -0.069765,-0.126006,0.989573,1.898573,-3.068274,-0.994338,
+ -0.228294,-0.186048,-0.955651,2.110033,-3.148257,-1.068816,
+ 0.013288,-0.297478,-0.954636,1.970051,-3.141862,-1.065178,
+ 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
+ -0.069765,-0.126006,0.989573,1.898573,-3.068274,-0.994338,
+ 0.013288,-0.297478,-0.954636,1.970051,-3.141862,-1.065178,
+ 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
+ 0.013288,-0.297478,-0.954636,1.970051,-3.141862,-1.065178,
+ 0.213417,-0.547723,-0.808983,1.886443,-3.191742,-1.047318,
+ 0.926951,0.366239,0.081429,1.811797,-3.135641,-0.933096,
+ 0.383337,-0.601981,0.700479,1.855134,-3.083228,-0.986129,
+ 0.213417,-0.547723,-0.808983,1.886443,-3.191742,-1.047318,
+ 0.926951,0.366239,0.081429,1.811797,-3.135641,-0.933096,
+ 0.213417,-0.547723,-0.808983,1.886443,-3.191742,-1.047318,
+ 0.626232,0.565165,-0.53705,1.841888,-3.246003,-1.014774,
+ 0.768072,0.514957,-0.380637,2.217369,-3.156093,-0.888927,
+ 0.672893,0.661099,-0.331908,2.113587,-3.011851,-0.851648,
+ -0.701253,0.091018,0.707079,2.07369,-3.020848,-0.782654,
+ 0.768072,0.514957,-0.380637,2.217369,-3.156093,-0.888927,
+ -0.701253,0.091018,0.707079,2.07369,-3.020848,-0.782654,
+ -0.706628,-0.050081,0.705811,2.187495,-3.161535,-0.800285,
+ -0.495591,0.225654,-0.838731,2.170039,-3.134504,-0.978866,
+ 0.768072,0.514957,-0.380637,2.217369,-3.156093,-0.888927,
+ -0.404532,-0.045989,-0.913367,2.236407,-3.220054,-0.89203,
+ -0.495591,0.225654,-0.838731,2.170039,-3.134504,-0.978866,
+ -0.404532,-0.045989,-0.913367,2.236407,-3.220054,-0.89203,
+ -0.492627,0.113675,-0.862784,2.201939,-3.226457,-0.996503,
+ -0.144755,0.439659,-0.886423,2.247981,-3.342804,-1.127459,
+ -0.430523,-0.648445,-0.627828,2.281229,-3.33825,-1.043475,
+ 0.717573,0.343682,0.605781,2.386827,-3.462222,-1.13648,
+ -0.144755,0.439659,-0.886423,2.247981,-3.342804,-1.127459,
+ 0.717573,0.343682,0.605781,2.386827,-3.462222,-1.13648,
+ 0.457854,0.537523,-0.708123,2.343303,-3.507846,-1.195262,
+ 0.717573,0.343682,0.605781,2.386827,-3.462222,-1.13648,
+ -0.430523,-0.648445,-0.627828,2.281229,-3.33825,-1.043475,
+ 0.743895,0.373896,0.553916,2.327021,-3.352317,-0.958234,
+ 0.717573,0.343682,0.605781,2.386827,-3.462222,-1.13648,
+ 0.743895,0.373896,0.553916,2.327021,-3.352317,-0.958234,
+ 0.752232,0.244352,0.611914,2.440236,-3.509564,-1.019417,
+ 0.743895,0.373896,0.553916,2.327021,-3.352317,-0.958234,
+ -0.430523,-0.648445,-0.627828,2.281229,-3.33825,-1.043475,
+ -0.492627,0.113675,-0.862784,2.201939,-3.226457,-0.996503,
+ 0.743895,0.373896,0.553916,2.327021,-3.352317,-0.958234,
+ -0.492627,0.113675,-0.862784,2.201939,-3.226457,-0.996503,
+ -0.404532,-0.045989,-0.913367,2.236407,-3.220054,-0.89203,
+ 0.752232,0.244352,0.611914,2.440236,-3.509564,-1.019417,
+ 0.743895,0.373896,0.553916,2.327021,-3.352317,-0.958234,
+ 0.866542,0.493887,-0.071973,2.309358,-3.345468,-0.801508,
+ 0.752232,0.244352,0.611914,2.440236,-3.509564,-1.019417,
+ 0.866542,0.493887,-0.071973,2.309358,-3.345468,-0.801508,
+ 0.874983,0.217676,-0.43246,2.377814,-3.484109,-0.800332,
+ 0.866542,0.493887,-0.071973,2.309358,-3.345468,-0.801508,
+ 0.743895,0.373896,0.553916,2.327021,-3.352317,-0.958234,
+ -0.404532,-0.045989,-0.913367,2.236407,-3.220054,-0.89203,
+ 0.866542,0.493887,-0.071973,2.309358,-3.345468,-0.801508,
+ -0.404532,-0.045989,-0.913367,2.236407,-3.220054,-0.89203,
+ 0.79991,0.598082,-0.049409,2.235942,-3.243103,-0.823955,
+ 0.79991,0.598082,-0.049409,2.235942,-3.243103,-0.823955,
+ -0.404532,-0.045989,-0.913367,2.236407,-3.220054,-0.89203,
+ 0.768072,0.514957,-0.380637,2.217369,-3.156093,-0.888927,
+ 0.79991,0.598082,-0.049409,2.235942,-3.243103,-0.823955,
+ 0.768072,0.514957,-0.380637,2.217369,-3.156093,-0.888927,
+ -0.706628,-0.050081,0.705811,2.187495,-3.161535,-0.800285,
+ -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
+ -0.150944,-0.987886,0.036011,1.92973,-3.298418,-0.689538,
+ 0.331575,0.146631,0.931964,2.059222,-3.230076,-0.674936,
+ -0.630099,-0.773677,0.066329,1.900481,-3.131932,-0.728621,
+ 0.331575,0.146631,0.931964,2.059222,-3.230076,-0.674936,
+ 0.714275,0.465374,0.522723,1.998099,-3.039955,-0.718855,
+ 0.714275,0.465374,0.522723,1.998099,-3.039955,-0.718855,
+ 0.331575,0.146631,0.931964,2.059222,-3.230076,-0.674936,
+ -0.706628,-0.050081,0.705811,2.187495,-3.161535,-0.800285,
+ 0.714275,0.465374,0.522723,1.998099,-3.039955,-0.718855,
+ -0.706628,-0.050081,0.705811,2.187495,-3.161535,-0.800285,
+ -0.701253,0.091018,0.707079,2.07369,-3.020848,-0.782654,
+ -0.150944,-0.987886,0.036011,1.92973,-3.298418,-0.689538,
+ -0.937976,-0.320543,0.132115,1.941325,-3.434803,-0.701314,
+ 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
+ -0.150944,-0.987886,0.036011,1.92973,-3.298418,-0.689538,
+ 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
+ 0.331575,0.146631,0.931964,2.059222,-3.230076,-0.674936,
+ 0.331575,0.146631,0.931964,2.059222,-3.230076,-0.674936,
+ 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
+ 0.79991,0.598082,-0.049409,2.235942,-3.243103,-0.823955,
+ 0.331575,0.146631,0.931964,2.059222,-3.230076,-0.674936,
+ 0.79991,0.598082,-0.049409,2.235942,-3.243103,-0.823955,
+ -0.706628,-0.050081,0.705811,2.187495,-3.161535,-0.800285,
+ 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
+ -0.937976,-0.320543,0.132115,1.941325,-3.434803,-0.701314,
+ -0.4909,0.016111,0.871067,2.002745,-3.52342,-0.688103,
+ -0.184432,-0.109597,0.976716,2.126553,-3.549679,-0.701005,
+ 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
+ -0.4909,0.016111,0.871067,2.002745,-3.52342,-0.688103,
+ 0.79991,0.598082,-0.049409,2.235942,-3.243103,-0.823955,
+ 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
+ 0.866542,0.493887,-0.071973,2.309358,-3.345468,-0.801508,
+ -0.184432,-0.109597,0.976716,2.126553,-3.549679,-0.701005,
+ -0.554151,-0.205896,0.806551,2.244147,-3.545557,-0.732888,
+ 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
+ 0.874983,0.217676,-0.43246,2.377814,-3.484109,-0.800332,
+ 0.866542,0.493887,-0.071973,2.309358,-3.345468,-0.801508,
+ 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
+ 0.874983,0.217676,-0.43246,2.377814,-3.484109,-0.800332,
+ 0.43336,0.0979,0.895888,2.107985,-3.363571,-0.677007,
+ -0.554151,-0.205896,0.806551,2.244147,-3.545557,-0.732888,
+ 0.752232,0.244352,0.611914,2.440236,-3.509564,-1.019417,
+ 0.874983,0.217676,-0.43246,2.377814,-3.484109,-0.800332,
+ -0.554151,-0.205896,0.806551,2.244147,-3.545557,-0.732888,
+ 0.752232,0.244352,0.611914,2.440236,-3.509564,-1.019417,
+ -0.554151,-0.205896,0.806551,2.244147,-3.545557,-0.732888,
+ -0.554502,-0.046423,0.830886,2.197935,-3.583948,-0.936437,
+ -0.987313,0.097592,0.125253,2.078928,-3.584991,-0.917088,
+ 0.444124,0.617475,-0.649214,2.025468,-3.556842,-1.204841,
+ -0.081045,0.409121,-0.908874,2.254361,-3.550931,-1.235118,
+ -0.987313,0.097592,0.125253,2.078928,-3.584991,-0.917088,
+ -0.081045,0.409121,-0.908874,2.254361,-3.550931,-1.235118,
+ -0.554502,-0.046423,0.830886,2.197935,-3.583948,-0.936437,
+ 0.872426,0.488735,0.003222,1.980621,-3.043895,-0.964237,
+ -0.541077,0.245809,-0.804247,2.091539,-3.032437,-0.947029,
+ -0.495591,0.225654,-0.838731,2.170039,-3.134504,-0.978866,
+ -0.554502,-0.046423,0.830886,2.197935,-3.583948,-0.936437,
+ -0.081045,0.409121,-0.908874,2.254361,-3.550931,-1.235118,
+ 0.457854,0.537523,-0.708123,2.343303,-3.507846,-1.195262,
+ -0.554502,-0.046423,0.830886,2.197935,-3.583948,-0.936437,
+ 0.457854,0.537523,-0.708123,2.343303,-3.507846,-1.195262,
+ 0.717573,0.343682,0.605781,2.386827,-3.462222,-1.13648,
+ -0.554502,-0.046423,0.830886,2.197935,-3.583948,-0.936437,
+ 0.717573,0.343682,0.605781,2.386827,-3.462222,-1.13648,
+ 0.752232,0.244352,0.611914,2.440236,-3.509564,-1.019417,
+ -0.545598,-0.330415,-0.770161,-3.042899,-3.193907,-1.207296,
+ 0.012244,-0.298111,-0.954453,-2.888628,-3.200302,-1.210934,
+ -0.245482,-0.183395,-0.951896,-2.845816,-3.273661,-1.218321,
+ -0.545598,-0.330415,-0.770161,-3.042899,-3.193907,-1.207296,
+ -0.245482,-0.183395,-0.951896,-2.845816,-3.273661,-1.218321,
+ -0.492859,-0.096405,-0.864752,-2.975439,-3.308754,-1.25324,
+ -0.492859,-0.096405,-0.864752,-2.975439,-3.308754,-1.25324,
+ -0.245482,-0.183395,-0.951896,-2.845816,-3.273661,-1.218321,
+ 0.430301,0.548598,-0.716855,-2.736599,-3.394849,-1.269577,
+ -0.492859,-0.096405,-0.864752,-2.975439,-3.308754,-1.25324,
+ 0.430301,0.548598,-0.716855,-2.736599,-3.394849,-1.269577,
+ -0.074103,0.409269,-0.909399,-2.856957,-3.449728,-1.356844,
+ -0.074103,0.409269,-0.909399,-2.856957,-3.449728,-1.356844,
+ 0.430301,0.548598,-0.716855,-2.736599,-3.394849,-1.269577,
+ -0.13251,0.440061,-0.888137,-2.631547,-3.559891,-1.33738,
+ -0.074103,0.409269,-0.909399,-2.856957,-3.449728,-1.356844,
+ -0.13251,0.440061,-0.888137,-2.631547,-3.559891,-1.33738,
+ 0.317837,0.631876,-0.706903,-2.729567,-3.602976,-1.377236,
+ 0.317837,0.631876,-0.706903,-2.729567,-3.602976,-1.377236,
+ 0.413011,0.629609,-0.658038,-2.981824,-3.608887,-1.346959,
+ 0.009712,0.399549,-0.91666,-3.030627,-3.493327,-1.32265,
+ 0.317837,0.631876,-0.706903,-2.729567,-3.602976,-1.377236,
+ 0.009712,0.399549,-0.91666,-3.030627,-3.493327,-1.32265,
+ -0.074103,0.409269,-0.909399,-2.856957,-3.449728,-1.356844,
+ -0.074103,0.409269,-0.909399,-2.856957,-3.449728,-1.356844,
+ 0.009712,0.399549,-0.91666,-3.030627,-3.493327,-1.32265,
+ 0.070969,0.266956,-0.961092,-3.091252,-3.340925,-1.235864,
+ -0.074103,0.409269,-0.909399,-2.856957,-3.449728,-1.356844,
+ 0.070969,0.266956,-0.961092,-3.091252,-3.340925,-1.235864,
+ -0.492859,-0.096405,-0.864752,-2.975439,-3.308754,-1.25324,
+ -0.492859,-0.096405,-0.864752,-2.975439,-3.308754,-1.25324,
+ 0.070969,0.266956,-0.961092,-3.091252,-3.340925,-1.235864,
+ 0.405633,0.57823,-0.707893,-3.135041,-3.243787,-1.189436,
+ -0.492859,-0.096405,-0.864752,-2.975439,-3.308754,-1.25324,
+ 0.405633,0.57823,-0.707893,-3.135041,-3.243787,-1.189436,
+ -0.545598,-0.330415,-0.770161,-3.042899,-3.193907,-1.207296,
+ -0.431117,-0.034268,-0.901645,-2.699957,-3.390295,-1.185593,
+ 0.430301,0.548598,-0.716855,-2.736599,-3.394849,-1.269577,
+ -0.245482,-0.183395,-0.951896,-2.845816,-3.273661,-1.218321,
+ -0.431117,-0.034268,-0.901645,-2.699957,-3.390295,-1.185593,
+ -0.245482,-0.183395,-0.951896,-2.845816,-3.273661,-1.218321,
+ -0.461794,0.113692,-0.879671,-2.787341,-3.278502,-1.138621,
+ -0.461794,0.113692,-0.879671,-2.787341,-3.278502,-1.138621,
+ -0.245482,-0.183395,-0.951896,-2.845816,-3.273661,-1.218321,
+ 0.012244,-0.298111,-0.954453,-2.888628,-3.200302,-1.210934,
+ -0.461794,0.113692,-0.879671,-2.787341,-3.278502,-1.138621,
+ 0.012244,-0.298111,-0.954453,-2.888628,-3.200302,-1.210934,
+ -0.46316,0.228643,-0.856274,-2.822497,-3.186549,-1.120984,
+ -0.46316,0.228643,-0.856274,-2.822497,-3.186549,-1.120984,
+ 0.637284,0.689194,-0.344791,-2.90901,-3.084482,-1.089147,
+ 0.737412,0.542596,-0.402261,-2.884711,-3.063896,-0.993766,
+ -0.46316,0.228643,-0.856274,-2.822497,-3.186549,-1.120984,
+ 0.737412,0.542596,-0.402261,-2.884711,-3.063896,-0.993766,
+ -0.508358,0.250892,-0.823787,-2.770335,-3.208138,-1.031045,
+ 0.851754,0.52393,0.003494,-3.184143,-3.298048,-1.156892,
+ 0.405633,0.57823,-0.707893,-3.135041,-3.243787,-1.189436,
+ 0.070969,0.266956,-0.961092,-3.091252,-3.340925,-1.235864,
+ 0.851754,0.52393,0.003494,-3.184143,-3.298048,-1.156892,
+ 0.070969,0.266956,-0.961092,-3.091252,-3.340925,-1.235864,
+ 0.596352,0.583149,-0.551635,-3.158524,-3.405872,-1.197099,
+ 0.840313,0.535537,0.084106,-3.09873,-3.539123,-1.252987,
+ 0.596352,0.583149,-0.551635,-3.158524,-3.405872,-1.197099,
+ 0.070969,0.266956,-0.961092,-3.091252,-3.340925,-1.235864,
+ 0.840313,0.535537,0.084106,-3.09873,-3.539123,-1.252987,
+ 0.070969,0.266956,-0.961092,-3.091252,-3.340925,-1.235864,
+ 0.009712,0.399549,-0.91666,-3.030627,-3.493327,-1.32265,
+ 0.009712,0.399549,-0.91666,-3.030627,-3.493327,-1.32265,
+ 0.413011,0.629609,-0.658038,-2.981824,-3.608887,-1.346959,
+ 0.840313,0.535537,0.084106,-3.09873,-3.539123,-1.252987,
+ 0.503689,0.453945,-0.735004,-3.03125,-3.09594,-1.106355,
+ -0.46316,0.228643,-0.856274,-2.822497,-3.186549,-1.120984,
+ 0.012244,-0.298111,-0.954453,-2.888628,-3.200302,-1.210934,
+ 0.163153,0.19945,-0.96623,-3.223246,-3.225388,-0.976573,
+ 0.977763,0.208696,-0.020643,-3.217306,-3.187686,-1.075214,
+ 0.851754,0.52393,0.003494,-3.184143,-3.298048,-1.156892,
+ 0.163153,0.19945,-0.96623,-3.223246,-3.225388,-0.976573,
+ 0.851754,0.52393,0.003494,-3.184143,-3.298048,-1.156892,
+ 0.144389,0.231536,-0.962051,-3.19417,-3.348553,-1.007196,
+ -0.99734,0.010761,0.072093,-3.082741,-3.598298,-1.054556,
+ 0.840313,0.535537,0.084106,-3.09873,-3.539123,-1.252987,
+ 0.413011,0.629609,-0.658038,-2.981824,-3.608887,-1.346959,
+ -0.99734,0.010761,0.072093,-3.082741,-3.598298,-1.054556,
+ 0.413011,0.629609,-0.658038,-2.981824,-3.608887,-1.346959,
+ -0.985013,0.106756,0.135469,-2.922908,-3.637036,-1.059206,
+ 0.144389,0.231536,-0.962051,-3.19417,-3.348553,-1.007196,
+ 0.851754,0.52393,0.003494,-3.184143,-3.298048,-1.156892,
+ 0.596352,0.583149,-0.551635,-3.158524,-3.405872,-1.197099,
+ 0.144389,0.231536,-0.962051,-3.19417,-3.348553,-1.007196,
+ 0.596352,0.583149,-0.551635,-3.158524,-3.405872,-1.197099,
+ -0.948594,-0.185732,0.256269,-3.18675,-3.457336,-1.025606,
+ -0.948594,-0.185732,0.256269,-3.18675,-3.457336,-1.025606,
+ 0.596352,0.583149,-0.551635,-3.158524,-3.405872,-1.197099,
+ 0.840313,0.535537,0.084106,-3.09873,-3.539123,-1.252987,
+ -0.948594,-0.185732,0.256269,-3.18675,-3.457336,-1.025606,
+ 0.840313,0.535537,0.084106,-3.09873,-3.539123,-1.252987,
+ -0.99734,0.010761,0.072093,-3.082741,-3.598298,-1.054556,
+ 0.144389,0.231536,-0.962051,-3.19417,-3.348553,-1.007196,
+ -0.471141,0.022027,0.881783,-3.087335,-3.350463,-0.831656,
+ -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
+ 0.144389,0.231536,-0.962051,-3.19417,-3.348553,-1.007196,
+ -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
+ 0.163153,0.19945,-0.96623,-3.223246,-3.225388,-0.976573,
+ 0.144389,0.231536,-0.962051,-3.19417,-3.348553,-1.007196,
+ -0.948594,-0.185732,0.256269,-3.18675,-3.457336,-1.025606,
+ -0.385346,-0.01874,0.922582,-3.074557,-3.486847,-0.843432,
+ 0.144389,0.231536,-0.962051,-3.19417,-3.348553,-1.007196,
+ -0.385346,-0.01874,0.922582,-3.074557,-3.486847,-0.843432,
+ -0.471141,0.022027,0.881783,-3.087335,-3.350463,-0.831656,
+ -0.385346,-0.01874,0.922582,-3.074557,-3.486847,-0.843432,
+ -0.948594,-0.185732,0.256269,-3.18675,-3.457336,-1.025606,
+ -0.99734,0.010761,0.072093,-3.082741,-3.598298,-1.054556,
+ -0.385346,-0.01874,0.922582,-3.074557,-3.486847,-0.843432,
+ -0.99734,0.010761,0.072093,-3.082741,-3.598298,-1.054556,
+ -0.11646,-0.017993,0.993032,-3.006867,-3.575464,-0.830221,
+ -0.11646,-0.017993,0.993032,-3.006867,-3.575464,-0.830221,
+ -0.99734,0.010761,0.072093,-3.082741,-3.598298,-1.054556,
+ -0.985013,0.106756,0.135469,-2.922908,-3.637036,-1.059206,
+ -0.11646,-0.017993,0.993032,-3.006867,-3.575464,-0.830221,
+ -0.985013,0.106756,0.135469,-2.922908,-3.637036,-1.059206,
+ -0.037581,-0.042039,0.998409,-2.870422,-3.601724,-0.843123,
+ -0.037581,-0.042039,0.998409,-2.870422,-3.601724,-0.843123,
+ -0.985013,0.106756,0.135469,-2.922908,-3.637036,-1.059206,
+ 0.339875,0.026681,0.940092,-2.791754,-3.635993,-1.078555,
+ -0.037581,-0.042039,0.998409,-2.870422,-3.601724,-0.843123,
+ 0.339875,0.026681,0.940092,-2.791754,-3.635993,-1.078555,
+ 0.156207,-0.109405,0.981647,-2.740824,-3.597601,-0.875006,
+ -0.039603,0.339955,-0.939607,-3.121673,-3.120319,-1.136456,
+ 0.503689,0.453945,-0.735004,-3.03125,-3.09594,-1.106355,
+ 0.012244,-0.298111,-0.954453,-2.888628,-3.200302,-1.210934,
+ -0.039603,0.339955,-0.939607,-3.121673,-3.120319,-1.136456,
+ 0.012244,-0.298111,-0.954453,-2.888628,-3.200302,-1.210934,
+ -0.545598,-0.330415,-0.770161,-3.042899,-3.193907,-1.207296,
+ -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
+ -0.039603,0.339955,-0.939607,-3.121673,-3.120319,-1.136456,
+ -0.545598,-0.330415,-0.770161,-3.042899,-3.193907,-1.207296,
+ -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
+ -0.545598,-0.330415,-0.770161,-3.042899,-3.193907,-1.207296,
+ 0.405633,0.57823,-0.707893,-3.135041,-3.243787,-1.189436,
+ 0.977763,0.208696,-0.020643,-3.217306,-3.187686,-1.075214,
+ -0.377491,-0.043727,-0.92498,-3.169546,-3.135273,-1.128247,
+ 0.405633,0.57823,-0.707893,-3.135041,-3.243787,-1.189436,
+ 0.977763,0.208696,-0.020643,-3.217306,-3.187686,-1.075214,
+ 0.405633,0.57823,-0.707893,-3.135041,-3.243787,-1.189436,
+ 0.851754,0.52393,0.003494,-3.184143,-3.298048,-1.156892,
+ -0.508358,0.250892,-0.823787,-2.770335,-3.208138,-1.031045,
+ 0.737412,0.542596,-0.402261,-2.884711,-3.063896,-0.993766,
+ 0.684558,0.361154,0.633205,-2.928681,-3.072892,-0.924772,
+ -0.508358,0.250892,-0.823787,-2.770335,-3.208138,-1.031045,
+ 0.684558,0.361154,0.633205,-2.928681,-3.072892,-0.924772,
+ 0.713402,0.39471,0.579018,-2.80326,-3.21358,-0.942403,
+ -0.46316,0.228643,-0.856274,-2.822497,-3.186549,-1.120984,
+ -0.508358,0.250892,-0.823787,-2.770335,-3.208138,-1.031045,
+ 0.845209,0.529004,-0.075999,-2.749355,-3.272099,-1.034148,
+ -0.46316,0.228643,-0.856274,-2.822497,-3.186549,-1.120984,
+ 0.845209,0.529004,-0.075999,-2.749355,-3.272099,-1.034148,
+ -0.461794,0.113692,-0.879671,-2.787341,-3.278502,-1.138621,
+ 0.430301,0.548598,-0.716855,-2.736599,-3.394849,-1.269577,
+ -0.431117,-0.034268,-0.901645,-2.699957,-3.390295,-1.185593,
+ 0.61389,0.702597,-0.359856,-2.58358,-3.514267,-1.278598,
+ 0.430301,0.548598,-0.716855,-2.736599,-3.394849,-1.269577,
+ 0.61389,0.702597,-0.359856,-2.58358,-3.514267,-1.278598,
+ -0.13251,0.440061,-0.888137,-2.631547,-3.559891,-1.33738,
+ 0.61389,0.702597,-0.359856,-2.58358,-3.514267,-1.278598,
+ -0.431117,-0.034268,-0.901645,-2.699957,-3.390295,-1.185593,
+ 0.77125,0.634502,-0.050796,-2.649491,-3.404362,-1.100352,
+ 0.61389,0.702597,-0.359856,-2.58358,-3.514267,-1.278598,
+ 0.77125,0.634502,-0.050796,-2.649491,-3.404362,-1.100352,
+ 0.780958,0.624512,-0.009449,-2.52472,-3.561609,-1.161535,
+ 0.77125,0.634502,-0.050796,-2.649491,-3.404362,-1.100352,
+ -0.431117,-0.034268,-0.901645,-2.699957,-3.390295,-1.185593,
+ -0.461794,0.113692,-0.879671,-2.787341,-3.278502,-1.138621,
+ 0.77125,0.634502,-0.050796,-2.649491,-3.404362,-1.100352,
+ -0.461794,0.113692,-0.879671,-2.787341,-3.278502,-1.138621,
+ 0.845209,0.529004,-0.075999,-2.749355,-3.272099,-1.034148,
+ 0.780958,0.624512,-0.009449,-2.52472,-3.561609,-1.161535,
+ 0.77125,0.634502,-0.050796,-2.649491,-3.404362,-1.100352,
+ 0.684834,0.490952,0.538488,-2.668957,-3.397513,-0.943626,
+ 0.780958,0.624512,-0.009449,-2.52472,-3.561609,-1.161535,
+ 0.684834,0.490952,0.538488,-2.668957,-3.397513,-0.943626,
+ 0.712283,0.385667,0.586441,-2.593513,-3.536154,-0.94245,
+ 0.684834,0.490952,0.538488,-2.668957,-3.397513,-0.943626,
+ 0.77125,0.634502,-0.050796,-2.649491,-3.404362,-1.100352,
+ 0.845209,0.529004,-0.075999,-2.749355,-3.272099,-1.034148,
+ 0.684834,0.490952,0.538488,-2.668957,-3.397513,-0.943626,
+ 0.845209,0.529004,-0.075999,-2.749355,-3.272099,-1.034148,
+ 0.722848,0.455753,0.519404,-2.749867,-3.295148,-0.966073,
+ 0.722848,0.455753,0.519404,-2.749867,-3.295148,-0.966073,
+ 0.845209,0.529004,-0.075999,-2.749355,-3.272099,-1.034148,
+ -0.508358,0.250892,-0.823787,-2.770335,-3.208138,-1.031045,
+ 0.722848,0.455753,0.519404,-2.749867,-3.295148,-0.966073,
+ -0.508358,0.250892,-0.823787,-2.770335,-3.208138,-1.031045,
+ 0.713402,0.39471,0.579018,-2.80326,-3.21358,-0.942403,
+ -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
+ -0.471141,0.022027,0.881783,-3.087335,-3.350463,-0.831656,
+ 0.225987,0.181605,0.957053,-2.944625,-3.282121,-0.817054,
+ -0.948594,-0.185732,0.256269,-3.11957,-3.183977,-0.870739,
+ 0.225987,0.181605,0.957053,-2.944625,-3.282121,-0.817054,
+ 0.308087,0.149605,0.939521,-3.011987,-3.092,-0.860973,
+ 0.308087,0.149605,0.939521,-3.011987,-3.092,-0.860973,
+ 0.225987,0.181605,0.957053,-2.944625,-3.282121,-0.817054,
+ 0.713402,0.39471,0.579018,-2.80326,-3.21358,-0.942403,
+ 0.308087,0.149605,0.939521,-3.011987,-3.092,-0.860973,
+ 0.713402,0.39471,0.579018,-2.80326,-3.21358,-0.942403,
+ 0.684558,0.361154,0.633205,-2.928681,-3.072892,-0.924772,
+ -0.471141,0.022027,0.881783,-3.087335,-3.350463,-0.831656,
+ -0.385346,-0.01874,0.922582,-3.074557,-3.486847,-0.843432,
+ 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
+ -0.471141,0.022027,0.881783,-3.087335,-3.350463,-0.831656,
+ 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
+ 0.225987,0.181605,0.957053,-2.944625,-3.282121,-0.817054,
+ 0.225987,0.181605,0.957053,-2.944625,-3.282121,-0.817054,
+ 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
+ 0.722848,0.455753,0.519404,-2.749867,-3.295148,-0.966073,
+ 0.225987,0.181605,0.957053,-2.944625,-3.282121,-0.817054,
+ 0.722848,0.455753,0.519404,-2.749867,-3.295148,-0.966073,
+ 0.713402,0.39471,0.579018,-2.80326,-3.21358,-0.942403,
+ 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
+ -0.385346,-0.01874,0.922582,-3.074557,-3.486847,-0.843432,
+ -0.11646,-0.017993,0.993032,-3.006867,-3.575464,-0.830221,
+ -0.037581,-0.042039,0.998409,-2.870422,-3.601724,-0.843123,
+ 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
+ -0.11646,-0.017993,0.993032,-3.006867,-3.575464,-0.830221,
+ 0.722848,0.455753,0.519404,-2.749867,-3.295148,-0.966073,
+ 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
+ 0.684834,0.490952,0.538488,-2.668957,-3.397513,-0.943626,
+ -0.037581,-0.042039,0.998409,-2.870422,-3.601724,-0.843123,
+ 0.156207,-0.109405,0.981647,-2.740824,-3.597601,-0.875006,
+ 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
+ 0.712283,0.385667,0.586441,-2.593513,-3.536154,-0.94245,
+ 0.684834,0.490952,0.538488,-2.668957,-3.397513,-0.943626,
+ 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
+ 0.712283,0.385667,0.586441,-2.593513,-3.536154,-0.94245,
+ 0.229413,0.089674,0.96919,-2.890885,-3.415616,-0.819125,
+ 0.156207,-0.109405,0.981647,-2.740824,-3.597601,-0.875006,
+ 0.780958,0.624512,-0.009449,-2.52472,-3.561609,-1.161535,
+ 0.712283,0.385667,0.586441,-2.593513,-3.536154,-0.94245,
+ 0.156207,-0.109405,0.981647,-2.740824,-3.597601,-0.875006,
+ 0.780958,0.624512,-0.009449,-2.52472,-3.561609,-1.161535,
+ 0.156207,-0.109405,0.981647,-2.740824,-3.597601,-0.875006,
+ 0.339875,0.026681,0.940092,-2.791754,-3.635993,-1.078555,
+ -0.985013,0.106756,0.135469,-2.922908,-3.637036,-1.059206,
+ 0.413011,0.629609,-0.658038,-2.981824,-3.608887,-1.346959,
+ 0.317837,0.631876,-0.706903,-2.729567,-3.602976,-1.377236,
+ -0.985013,0.106756,0.135469,-2.922908,-3.637036,-1.059206,
+ 0.317837,0.631876,-0.706903,-2.729567,-3.602976,-1.377236,
+ 0.339875,0.026681,0.940092,-2.791754,-3.635993,-1.078555,
+ 0.503689,0.453945,-0.735004,-3.03125,-3.09594,-1.106355,
+ 0.637284,0.689194,-0.344791,-2.90901,-3.084482,-1.089147,
+ -0.46316,0.228643,-0.856274,-2.822497,-3.186549,-1.120984,
+ 0.339875,0.026681,0.940092,-2.791754,-3.635993,-1.078555,
+ 0.317837,0.631876,-0.706903,-2.729567,-3.602976,-1.377236,
+ -0.13251,0.440061,-0.888137,-2.631547,-3.559891,-1.33738,
+ 0.339875,0.026681,0.940092,-2.791754,-3.635993,-1.078555,
+ -0.13251,0.440061,-0.888137,-2.631547,-3.559891,-1.33738,
+ 0.61389,0.702597,-0.359856,-2.58358,-3.514267,-1.278598,
+ 0.339875,0.026681,0.940092,-2.791754,-3.635993,-1.078555,
+ 0.61389,0.702597,-0.359856,-2.58358,-3.514267,-1.278598,
+ 0.780958,0.624512,-0.009449,-2.52472,-3.561609,-1.161535,
+ -0.35872,0.092902,0.928811,2.031262,-3.256709,1.111122,
+ -0.354049,-0.10839,0.928924,2.14888,-3.221616,1.076203,
+ 0.422569,-0.18743,0.886739,2.110033,-3.148257,1.068816,
+ -0.35872,0.092902,0.928811,2.031262,-3.256709,1.111122,
+ 0.422569,-0.18743,0.886739,2.110033,-3.148257,1.068816,
+ -0.019303,-0.142974,0.989538,1.970051,-3.141862,1.065178,
+ -0.501053,-0.05946,0.863371,2.138771,-3.397683,1.214726,
+ -0.453746,-0.057149,0.889297,2.247981,-3.342804,1.127459,
+ -0.354049,-0.10839,0.928924,2.14888,-3.221616,1.076203,
+ -0.501053,-0.05946,0.863371,2.138771,-3.397683,1.214726,
+ -0.354049,-0.10839,0.928924,2.14888,-3.221616,1.076203,
+ -0.35872,0.092902,0.928811,2.031262,-3.256709,1.111122,
+ -0.765488,-0.115047,0.633082,2.254361,-3.550931,1.235118,
+ -0.779685,0.02537,0.625657,2.343303,-3.507846,1.195262,
+ -0.453746,-0.057149,0.889297,2.247981,-3.342804,1.127459,
+ -0.765488,-0.115047,0.633082,2.254361,-3.550931,1.235118,
+ -0.453746,-0.057149,0.889297,2.247981,-3.342804,1.127459,
+ -0.501053,-0.05946,0.863371,2.138771,-3.397683,1.214726,
+ -0.501053,-0.05946,0.863371,2.138771,-3.397683,1.214726,
+ 0.982106,-0.010346,0.188044,1.981186,-3.441282,1.180532,
+ -0.807765,-0.096776,0.581507,2.025468,-3.556842,1.204841,
+ -0.501053,-0.05946,0.863371,2.138771,-3.397683,1.214726,
+ -0.807765,-0.096776,0.581507,2.025468,-3.556842,1.204841,
+ -0.765488,-0.115047,0.633082,2.254361,-3.550931,1.235118,
+ -0.35872,0.092902,0.928811,2.031262,-3.256709,1.111122,
+ 0.937141,-0.149709,0.315204,1.926176,-3.28888,1.093746,
+ 0.982106,-0.010346,0.188044,1.981186,-3.441282,1.180532,
+ -0.35872,0.092902,0.928811,2.031262,-3.256709,1.111122,
+ 0.982106,-0.010346,0.188044,1.981186,-3.441282,1.180532,
+ -0.501053,-0.05946,0.863371,2.138771,-3.397683,1.214726,
+ -0.019303,-0.142974,0.989538,1.970051,-3.141862,1.065178,
+ 0.866898,-0.268351,0.420091,1.886443,-3.191742,1.047318,
+ 0.937141,-0.149709,0.315204,1.926176,-3.28888,1.093746,
+ -0.019303,-0.142974,0.989538,1.970051,-3.141862,1.065178,
+ 0.937141,-0.149709,0.315204,1.926176,-3.28888,1.093746,
+ -0.35872,0.092902,0.928811,2.031262,-3.256709,1.111122,
+ 0.567579,-0.469834,-0.6761,2.201939,-3.226457,0.996503,
+ -0.354049,-0.10839,0.928924,2.14888,-3.221616,1.076203,
+ -0.453746,-0.057149,0.889297,2.247981,-3.342804,1.127459,
+ 0.567579,-0.469834,-0.6761,2.201939,-3.226457,0.996503,
+ -0.453746,-0.057149,0.889297,2.247981,-3.342804,1.127459,
+ 0.886562,-0.46255,0.007486,2.281229,-3.33825,1.043475,
+ 0.890357,-0.340018,-0.302742,2.170039,-3.134504,0.978866,
+ 0.422569,-0.18743,0.886739,2.110033,-3.148257,1.068816,
+ -0.354049,-0.10839,0.928924,2.14888,-3.221616,1.076203,
+ 0.890357,-0.340018,-0.302742,2.170039,-3.134504,0.978866,
+ -0.354049,-0.10839,0.928924,2.14888,-3.221616,1.076203,
+ 0.567579,-0.469834,-0.6761,2.201939,-3.226457,0.996503,
+ 0.579344,-0.339433,-0.741044,2.217369,-3.156093,0.888927,
+ 0.789099,-0.039289,-0.613008,2.113587,-3.011851,0.851648,
+ 0.773659,-0.235087,-0.588375,2.091539,-3.032437,0.947029,
+ 0.579344,-0.339433,-0.741044,2.217369,-3.156093,0.888927,
+ 0.773659,-0.235087,-0.588375,2.091539,-3.032437,0.947029,
+ 0.890357,-0.340018,-0.302742,2.170039,-3.134504,0.978866,
+ 0.257818,-0.230014,-0.938415,1.865135,-3.353827,1.054981,
+ 0.937141,-0.149709,0.315204,1.926176,-3.28888,1.093746,
+ 0.866898,-0.268351,0.420091,1.886443,-3.191742,1.047318,
+ 0.257818,-0.230014,-0.938415,1.865135,-3.353827,1.054981,
+ 0.866898,-0.268351,0.420091,1.886443,-3.191742,1.047318,
+ 0.230893,-0.309688,-0.922378,1.841888,-3.246003,1.014774,
+ 0.982106,-0.010346,0.188044,1.981186,-3.441282,1.180532,
+ 0.937141,-0.149709,0.315204,1.926176,-3.28888,1.093746,
+ 0.257818,-0.230014,-0.938415,1.865135,-3.353827,1.054981,
+ 0.982106,-0.010346,0.188044,1.981186,-3.441282,1.180532,
+ 0.257818,-0.230014,-0.938415,1.865135,-3.353827,1.054981,
+ 0.148388,-0.325205,-0.933929,1.919391,-3.487078,1.110869,
+ 0.148388,-0.325205,-0.933929,1.919391,-3.487078,1.110869,
+ -0.807765,-0.096776,0.581507,2.025468,-3.556842,1.204841,
+ 0.982106,-0.010346,0.188044,1.981186,-3.441282,1.180532,
+ 0.422569,-0.18743,0.886739,2.110033,-3.148257,1.068816,
+ 0.890357,-0.340018,-0.302742,2.170039,-3.134504,0.978866,
+ -0.215783,-0.895808,-0.388544,1.980621,-3.043895,0.964237,
+ -0.085416,-0.081635,-0.992995,1.83279,-3.296508,0.865078,
+ 0.230893,-0.309688,-0.922378,1.841888,-3.246003,1.014774,
+ -0.156447,-0.088128,0.983747,1.811797,-3.135641,0.933096,
+ -0.085416,-0.081635,-0.992995,1.83279,-3.296508,0.865078,
+ -0.156447,-0.088128,0.983747,1.811797,-3.135641,0.933096,
+ -0.042094,-0.220101,-0.974568,1.806407,-3.173343,0.834455,
+ -0.348227,-0.192527,-0.917427,2.078928,-3.584991,0.917088,
+ -0.807765,-0.096776,0.581507,2.025468,-3.556842,1.204841,
+ 0.148388,-0.325205,-0.933929,1.919391,-3.487078,1.110869,
+ -0.348227,-0.192527,-0.917427,2.078928,-3.584991,0.917088,
+ 0.148388,-0.325205,-0.933929,1.919391,-3.487078,1.110869,
+ 0.255431,-0.055528,-0.965231,1.933899,-3.546253,0.912438,
+ -0.401279,-0.250965,-0.880904,1.839523,-3.405292,0.883488,
+ 0.257818,-0.230014,-0.938415,1.865135,-3.353827,1.054981,
+ 0.230893,-0.309688,-0.922378,1.841888,-3.246003,1.014774,
+ -0.401279,-0.250965,-0.880904,1.839523,-3.405292,0.883488,
+ 0.230893,-0.309688,-0.922378,1.841888,-3.246003,1.014774,
+ -0.085416,-0.081635,-0.992995,1.83279,-3.296508,0.865078,
+ 0.255431,-0.055528,-0.965231,1.933899,-3.546253,0.912438,
+ 0.148388,-0.325205,-0.933929,1.919391,-3.487078,1.110869,
+ 0.257818,-0.230014,-0.938415,1.865135,-3.353827,1.054981,
+ 0.255431,-0.055528,-0.965231,1.933899,-3.546253,0.912438,
+ 0.257818,-0.230014,-0.938415,1.865135,-3.353827,1.054981,
+ -0.401279,-0.250965,-0.880904,1.839523,-3.405292,0.883488,
+ -0.042094,-0.220101,-0.974568,1.806407,-3.173343,0.834455,
+ -0.363523,-0.150625,-0.919327,1.900481,-3.131932,0.728621,
+ -0.924461,-0.213385,-0.315973,1.92973,-3.298418,0.689538,
+ -0.042094,-0.220101,-0.974568,1.806407,-3.173343,0.834455,
+ -0.924461,-0.213385,-0.315973,1.92973,-3.298418,0.689538,
+ -0.085416,-0.081635,-0.992995,1.83279,-3.296508,0.865078,
+ -0.924461,-0.213385,-0.315973,1.92973,-3.298418,0.689538,
+ -0.914496,-0.253607,-0.315247,1.941325,-3.434803,0.701314,
+ -0.401279,-0.250965,-0.880904,1.839523,-3.405292,0.883488,
+ -0.924461,-0.213385,-0.315973,1.92973,-3.298418,0.689538,
+ -0.401279,-0.250965,-0.880904,1.839523,-3.405292,0.883488,
+ -0.085416,-0.081635,-0.992995,1.83279,-3.296508,0.865078,
+ -0.943599,-0.160394,-0.289646,2.002745,-3.52342,0.688103,
+ 0.255431,-0.055528,-0.965231,1.933899,-3.546253,0.912438,
+ -0.401279,-0.250965,-0.880904,1.839523,-3.405292,0.883488,
+ -0.943599,-0.160394,-0.289646,2.002745,-3.52342,0.688103,
+ -0.401279,-0.250965,-0.880904,1.839523,-3.405292,0.883488,
+ -0.914496,-0.253607,-0.315247,1.941325,-3.434803,0.701314,
+ 0.601229,-0.111151,-0.791308,2.126553,-3.549679,0.701005,
+ -0.348227,-0.192527,-0.917427,2.078928,-3.584991,0.917088,
+ 0.255431,-0.055528,-0.965231,1.933899,-3.546253,0.912438,
+ 0.601229,-0.111151,-0.791308,2.126553,-3.549679,0.701005,
+ 0.255431,-0.055528,-0.965231,1.933899,-3.546253,0.912438,
+ -0.943599,-0.160394,-0.289646,2.002745,-3.52342,0.688103,
+ 0.53288,-0.088285,-0.841572,2.244147,-3.545557,0.732888,
+ 0.546571,-0.125171,-0.828005,2.197935,-3.583948,0.936437,
+ -0.348227,-0.192527,-0.917427,2.078928,-3.584991,0.917088,
+ 0.53288,-0.088285,-0.841572,2.244147,-3.545557,0.732888,
+ -0.348227,-0.192527,-0.917427,2.078928,-3.584991,0.917088,
+ 0.601229,-0.111151,-0.791308,2.126553,-3.549679,0.701005,
+ -0.019303,-0.142974,0.989538,1.970051,-3.141862,1.065178,
+ 0.422569,-0.18743,0.886739,2.110033,-3.148257,1.068816,
+ -0.215783,-0.895808,-0.388544,1.980621,-3.043895,0.964237,
+ -0.019303,-0.142974,0.989538,1.970051,-3.141862,1.065178,
+ -0.215783,-0.895808,-0.388544,1.980621,-3.043895,0.964237,
+ 0.356923,-0.210291,0.910156,1.898573,-3.068274,0.994338,
+ 0.866898,-0.268351,0.420091,1.886443,-3.191742,1.047318,
+ -0.019303,-0.142974,0.989538,1.970051,-3.141862,1.065178,
+ 0.356923,-0.210291,0.910156,1.898573,-3.068274,0.994338,
+ 0.866898,-0.268351,0.420091,1.886443,-3.191742,1.047318,
+ 0.356923,-0.210291,0.910156,1.898573,-3.068274,0.994338,
+ 0.517272,-0.552302,0.653753,1.855134,-3.083228,0.986129,
+ 0.230893,-0.309688,-0.922378,1.841888,-3.246003,1.014774,
+ 0.866898,-0.268351,0.420091,1.886443,-3.191742,1.047318,
+ 0.517272,-0.552302,0.653753,1.855134,-3.083228,0.986129,
+ 0.230893,-0.309688,-0.922378,1.841888,-3.246003,1.014774,
+ 0.517272,-0.552302,0.653753,1.855134,-3.083228,0.986129,
+ -0.156447,-0.088128,0.983747,1.811797,-3.135641,0.933096,
+ -0.156072,0.243426,0.95728,2.187495,-3.161535,0.800285,
+ -0.080858,0.024731,0.996419,2.07369,-3.020848,0.782654,
+ 0.789099,-0.039289,-0.613008,2.113587,-3.011851,0.851648,
+ -0.156072,0.243426,0.95728,2.187495,-3.161535,0.800285,
+ 0.789099,-0.039289,-0.613008,2.113587,-3.011851,0.851648,
+ 0.579344,-0.339433,-0.741044,2.217369,-3.156093,0.888927,
+ 0.567579,-0.469834,-0.6761,2.201939,-3.226457,0.996503,
+ -0.661663,-0.025481,0.749369,2.236407,-3.220054,0.89203,
+ 0.579344,-0.339433,-0.741044,2.217369,-3.156093,0.888927,
+ 0.567579,-0.469834,-0.6761,2.201939,-3.226457,0.996503,
+ 0.579344,-0.339433,-0.741044,2.217369,-3.156093,0.888927,
+ 0.890357,-0.340018,-0.302742,2.170039,-3.134504,0.978866,
+ -0.779685,0.02537,0.625657,2.343303,-3.507846,1.195262,
+ 0.507452,0.36284,0.781562,2.386827,-3.462222,1.13648,
+ 0.886562,-0.46255,0.007486,2.281229,-3.33825,1.043475,
+ -0.779685,0.02537,0.625657,2.343303,-3.507846,1.195262,
+ 0.886562,-0.46255,0.007486,2.281229,-3.33825,1.043475,
+ -0.453746,-0.057149,0.889297,2.247981,-3.342804,1.127459,
+ 0.121953,0.140869,0.982488,2.440236,-3.509564,1.019417,
+ 0.484364,0.195735,0.85269,2.327021,-3.352317,0.958234,
+ 0.886562,-0.46255,0.007486,2.281229,-3.33825,1.043475,
+ 0.121953,0.140869,0.982488,2.440236,-3.509564,1.019417,
+ 0.886562,-0.46255,0.007486,2.281229,-3.33825,1.043475,
+ 0.507452,0.36284,0.781562,2.386827,-3.462222,1.13648,
+ -0.661663,-0.025481,0.749369,2.236407,-3.220054,0.89203,
+ 0.567579,-0.469834,-0.6761,2.201939,-3.226457,0.996503,
+ 0.886562,-0.46255,0.007486,2.281229,-3.33825,1.043475,
+ -0.661663,-0.025481,0.749369,2.236407,-3.220054,0.89203,
+ 0.886562,-0.46255,0.007486,2.281229,-3.33825,1.043475,
+ 0.484364,0.195735,0.85269,2.327021,-3.352317,0.958234,
+ 0.913315,0.39776,-0.087428,2.377814,-3.484109,0.800332,
+ 0.170703,0.25395,0.952035,2.309358,-3.345468,0.801508,
+ 0.484364,0.195735,0.85269,2.327021,-3.352317,0.958234,
+ 0.913315,0.39776,-0.087428,2.377814,-3.484109,0.800332,
+ 0.484364,0.195735,0.85269,2.327021,-3.352317,0.958234,
+ 0.121953,0.140869,0.982488,2.440236,-3.509564,1.019417,
+ 0.977763,0.208696,0.020643,2.235942,-3.243103,0.823955,
+ -0.661663,-0.025481,0.749369,2.236407,-3.220054,0.89203,
+ 0.484364,0.195735,0.85269,2.327021,-3.352317,0.958234,
+ 0.977763,0.208696,0.020643,2.235942,-3.243103,0.823955,
+ 0.484364,0.195735,0.85269,2.327021,-3.352317,0.958234,
+ 0.170703,0.25395,0.952035,2.309358,-3.345468,0.801508,
+ -0.156072,0.243426,0.95728,2.187495,-3.161535,0.800285,
+ 0.579344,-0.339433,-0.741044,2.217369,-3.156093,0.888927,
+ -0.661663,-0.025481,0.749369,2.236407,-3.220054,0.89203,
+ -0.156072,0.243426,0.95728,2.187495,-3.161535,0.800285,
+ -0.661663,-0.025481,0.749369,2.236407,-3.220054,0.89203,
+ 0.977763,0.208696,0.020643,2.235942,-3.243103,0.823955,
+ -0.245482,-0.183394,0.951896,1.998099,-3.039955,0.718855,
+ 0.430301,0.548598,0.716855,2.059222,-3.230076,0.674936,
+ -0.924461,-0.213385,-0.315973,1.92973,-3.298418,0.689538,
+ -0.245482,-0.183394,0.951896,1.998099,-3.039955,0.718855,
+ -0.924461,-0.213385,-0.315973,1.92973,-3.298418,0.689538,
+ -0.363523,-0.150625,-0.919327,1.900481,-3.131932,0.728621,
+ -0.080858,0.024731,0.996419,2.07369,-3.020848,0.782654,
+ -0.156072,0.243426,0.95728,2.187495,-3.161535,0.800285,
+ 0.430301,0.548598,0.716855,2.059222,-3.230076,0.674936,
+ -0.080858,0.024731,0.996419,2.07369,-3.020848,0.782654,
+ 0.430301,0.548598,0.716855,2.059222,-3.230076,0.674936,
+ -0.245482,-0.183394,0.951896,1.998099,-3.039955,0.718855,
+ 0.430301,0.548598,0.716855,2.059222,-3.230076,0.674936,
+ 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
+ -0.914496,-0.253607,-0.315247,1.941325,-3.434803,0.701314,
+ 0.430301,0.548598,0.716855,2.059222,-3.230076,0.674936,
+ -0.914496,-0.253607,-0.315247,1.941325,-3.434803,0.701314,
+ -0.924461,-0.213385,-0.315973,1.92973,-3.298418,0.689538,
+ -0.156072,0.243426,0.95728,2.187495,-3.161535,0.800285,
+ 0.977763,0.208696,0.020643,2.235942,-3.243103,0.823955,
+ 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
+ -0.156072,0.243426,0.95728,2.187495,-3.161535,0.800285,
+ 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
+ 0.430301,0.548598,0.716855,2.059222,-3.230076,0.674936,
+ -0.943599,-0.160394,-0.289646,2.002745,-3.52342,0.688103,
+ -0.914496,-0.253607,-0.315247,1.941325,-3.434803,0.701314,
+ 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
+ -0.943599,-0.160394,-0.289646,2.002745,-3.52342,0.688103,
+ 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
+ 0.601229,-0.111151,-0.791308,2.126553,-3.549679,0.701005,
+ 0.170703,0.25395,0.952035,2.309358,-3.345468,0.801508,
+ 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
+ 0.977763,0.208696,0.020643,2.235942,-3.243103,0.823955,
+ 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
+ 0.53288,-0.088285,-0.841572,2.244147,-3.545557,0.732888,
+ 0.601229,-0.111151,-0.791308,2.126553,-3.549679,0.701005,
+ 0.53288,-0.088285,-0.841572,2.244147,-3.545557,0.732888,
+ 0.317836,0.631876,0.706903,2.107985,-3.363571,0.677007,
+ 0.170703,0.25395,0.952035,2.309358,-3.345468,0.801508,
+ 0.53288,-0.088285,-0.841572,2.244147,-3.545557,0.732888,
+ 0.170703,0.25395,0.952035,2.309358,-3.345468,0.801508,
+ 0.913315,0.39776,-0.087428,2.377814,-3.484109,0.800332,
+ 0.546571,-0.125171,-0.828005,2.197935,-3.583948,0.936437,
+ 0.53288,-0.088285,-0.841572,2.244147,-3.545557,0.732888,
+ 0.913315,0.39776,-0.087428,2.377814,-3.484109,0.800332,
+ 0.546571,-0.125171,-0.828005,2.197935,-3.583948,0.936437,
+ 0.913315,0.39776,-0.087428,2.377814,-3.484109,0.800332,
+ 0.121953,0.140869,0.982488,2.440236,-3.509564,1.019417,
+ 0.546571,-0.125171,-0.828005,2.197935,-3.583948,0.936437,
+ -0.765488,-0.115047,0.633082,2.254361,-3.550931,1.235118,
+ -0.807765,-0.096776,0.581507,2.025468,-3.556842,1.204841,
+ 0.546571,-0.125171,-0.828005,2.197935,-3.583948,0.936437,
+ -0.807765,-0.096776,0.581507,2.025468,-3.556842,1.204841,
+ -0.348227,-0.192527,-0.917427,2.078928,-3.584991,0.917088,
+ 0.890357,-0.340018,-0.302742,2.170039,-3.134504,0.978866,
+ 0.773659,-0.235087,-0.588375,2.091539,-3.032437,0.947029,
+ -0.215783,-0.895808,-0.388544,1.980621,-3.043895,0.964237,
+ 0.121953,0.140869,0.982488,2.440236,-3.509564,1.019417,
+ 0.507452,0.36284,0.781562,2.386827,-3.462222,1.13648,
+ -0.779685,0.02537,0.625657,2.343303,-3.507846,1.195262,
+ 0.121953,0.140869,0.982488,2.440236,-3.509564,1.019417,
+ -0.779685,0.02537,0.625657,2.343303,-3.507846,1.195262,
+ -0.765488,-0.115047,0.633082,2.254361,-3.550931,1.235118,
+ 0.121953,0.140869,0.982488,2.440236,-3.509564,1.019417,
+ -0.765488,-0.115047,0.633082,2.254361,-3.550931,1.235118,
+ 0.546571,-0.125171,-0.828005,2.197935,-3.583948,0.936437,
+ 0.205604,0.070037,0.976126,-2.975439,-3.308754,1.25324,
+ 0.193496,0.00102,0.981101,-2.845816,-3.273661,1.218321,
+ 0.254799,-0.149124,0.955426,-2.888628,-3.200302,1.210934,
+ 0.205604,0.070037,0.976126,-2.975439,-3.308754,1.25324,
+ 0.254799,-0.149124,0.955426,-2.888628,-3.200302,1.210934,
+ 0.405755,-0.293021,0.865737,-3.042899,-3.193907,1.207296,
+ 0.580504,-0.526296,0.621312,-2.856957,-3.449728,1.356844,
+ 0.011655,0.055061,0.998415,-2.736599,-3.394849,1.269577,
+ 0.193496,0.00102,0.981101,-2.845816,-3.273661,1.218321,
+ 0.580504,-0.526296,0.621312,-2.856957,-3.449728,1.356844,
+ 0.193496,0.00102,0.981101,-2.845816,-3.273661,1.218321,
+ 0.205604,0.070037,0.976126,-2.975439,-3.308754,1.25324,
+ -0.093334,0.204552,0.974396,-2.729567,-3.602976,1.377236,
+ -0.026425,0.178249,0.983631,-2.631547,-3.559891,1.33738,
+ 0.011655,0.055061,0.998415,-2.736599,-3.394849,1.269577,
+ -0.093334,0.204552,0.974396,-2.729567,-3.602976,1.377236,
+ 0.011655,0.055061,0.998415,-2.736599,-3.394849,1.269577,
+ 0.580504,-0.526296,0.621312,-2.856957,-3.449728,1.356844,
+ 0.580504,-0.526296,0.621312,-2.856957,-3.449728,1.356844,
+ -0.028076,0.054588,0.998114,-3.030627,-3.493327,1.32265,
+ -0.057735,0.03099,0.997851,-2.981824,-3.608887,1.346959,
+ 0.580504,-0.526296,0.621312,-2.856957,-3.449728,1.356844,
+ -0.057735,0.03099,0.997851,-2.981824,-3.608887,1.346959,
+ -0.093334,0.204552,0.974396,-2.729567,-3.602976,1.377236,
+ 0.205604,0.070037,0.976126,-2.975439,-3.308754,1.25324,
+ 0.089482,-0.029551,0.99555,-3.091252,-3.340925,1.235864,
+ -0.028076,0.054588,0.998114,-3.030627,-3.493327,1.32265,
+ 0.205604,0.070037,0.976126,-2.975439,-3.308754,1.25324,
+ -0.028076,0.054588,0.998114,-3.030627,-3.493327,1.32265,
+ 0.580504,-0.526296,0.621312,-2.856957,-3.449728,1.356844,
+ 0.405755,-0.293021,0.865737,-3.042899,-3.193907,1.207296,
+ 0.487947,-0.44627,0.750167,-3.135041,-3.243787,1.189436,
+ 0.089482,-0.029551,0.99555,-3.091252,-3.340925,1.235864,
+ 0.405755,-0.293021,0.865737,-3.042899,-3.193907,1.207296,
+ 0.089482,-0.029551,0.99555,-3.091252,-3.340925,1.235864,
+ 0.205604,0.070037,0.976126,-2.975439,-3.308754,1.25324,
+ 0.177373,0.037311,0.983436,-2.787341,-3.278502,1.138621,
+ 0.193496,0.00102,0.981101,-2.845816,-3.273661,1.218321,
+ 0.011655,0.055061,0.998415,-2.736599,-3.394849,1.269577,
+ 0.177373,0.037311,0.983436,-2.787341,-3.278502,1.138621,
+ 0.011655,0.055061,0.998415,-2.736599,-3.394849,1.269577,
+ -0.048366,0.138166,0.989227,-2.699957,-3.390295,1.185593,
+ -0.308543,0.191148,0.931807,-2.822497,-3.186549,1.120984,
+ 0.254799,-0.149124,0.955426,-2.888628,-3.200302,1.210934,
+ 0.193496,0.00102,0.981101,-2.845816,-3.273661,1.218321,
+ -0.308543,0.191148,0.931807,-2.822497,-3.186549,1.120984,
+ 0.193496,0.00102,0.981101,-2.845816,-3.273661,1.218321,
+ 0.177373,0.037311,0.983436,-2.787341,-3.278502,1.138621,
+ -0.206994,0.072903,0.975622,-2.770335,-3.208138,1.031045,
+ -0.161613,0.16539,0.972896,-2.884711,-3.063896,0.993766,
+ 0.07463,0.029476,0.996776,-2.90901,-3.084482,1.089147,
+ -0.206994,0.072903,0.975622,-2.770335,-3.208138,1.031045,
+ 0.07463,0.029476,0.996776,-2.90901,-3.084482,1.089147,
+ -0.308543,0.191148,0.931807,-2.822497,-3.186549,1.120984,
+ -0.730585,0.298655,0.614045,-3.158524,-3.405872,1.197099,
+ 0.089482,-0.029551,0.99555,-3.091252,-3.340925,1.235864,
+ 0.487947,-0.44627,0.750167,-3.135041,-3.243787,1.189436,
+ -0.730585,0.298655,0.614045,-3.158524,-3.405872,1.197099,
+ 0.487947,-0.44627,0.750167,-3.135041,-3.243787,1.189436,
+ -0.059163,0.13391,0.989226,-3.184143,-3.298048,1.156892,
+ -0.028076,0.054588,0.998114,-3.030627,-3.493327,1.32265,
+ 0.089482,-0.029551,0.99555,-3.091252,-3.340925,1.235864,
+ -0.730585,0.298655,0.614045,-3.158524,-3.405872,1.197099,
+ -0.028076,0.054588,0.998114,-3.030627,-3.493327,1.32265,
+ -0.730585,0.298655,0.614045,-3.158524,-3.405872,1.197099,
+ -0.498861,0.185917,0.846506,-3.09873,-3.539123,1.252987,
+ -0.498861,0.185917,0.846506,-3.09873,-3.539123,1.252987,
+ -0.057735,0.03099,0.997851,-2.981824,-3.608887,1.346959,
+ -0.028076,0.054588,0.998114,-3.030627,-3.493327,1.32265,
+ 0.254799,-0.149124,0.955426,-2.888628,-3.200302,1.210934,
+ -0.308543,0.191148,0.931807,-2.822497,-3.186549,1.120984,
+ -0.541406,0.227835,0.809302,-3.03125,-3.09594,1.106355,
+ -0.626758,0.377346,0.681751,-3.19417,-3.348553,1.007196,
+ -0.059163,0.13391,0.989226,-3.184143,-3.298048,1.156892,
+ 0.085126,0.114843,0.98973,-3.217306,-3.187686,1.075214,
+ -0.626758,0.377346,0.681751,-3.19417,-3.348553,1.007196,
+ 0.085126,0.114843,0.98973,-3.217306,-3.187686,1.075214,
+ -0.588311,0.26373,0.764419,-3.223246,-3.225388,0.976573,
+ -0.670566,0.283017,-0.685743,-2.922908,-3.637036,1.059206,
+ -0.057735,0.03099,0.997851,-2.981824,-3.608887,1.346959,
+ -0.498861,0.185917,0.846506,-3.09873,-3.539123,1.252987,
+ -0.670566,0.283017,-0.685743,-2.922908,-3.637036,1.059206,
+ -0.498861,0.185917,0.846506,-3.09873,-3.539123,1.252987,
+ -0.738865,0.325814,-0.589851,-3.082741,-3.598298,1.054556,
+ -0.701121,0.259575,-0.664117,-3.18675,-3.457336,1.025606,
+ -0.730585,0.298655,0.614045,-3.158524,-3.405872,1.197099,
+ -0.059163,0.13391,0.989226,-3.184143,-3.298048,1.156892,
+ -0.701121,0.259575,-0.664117,-3.18675,-3.457336,1.025606,
+ -0.059163,0.13391,0.989226,-3.184143,-3.298048,1.156892,
+ -0.626758,0.377346,0.681751,-3.19417,-3.348553,1.007196,
+ -0.738865,0.325814,-0.589851,-3.082741,-3.598298,1.054556,
+ -0.498861,0.185917,0.846506,-3.09873,-3.539123,1.252987,
+ -0.730585,0.298655,0.614045,-3.158524,-3.405872,1.197099,
+ -0.738865,0.325814,-0.589851,-3.082741,-3.598298,1.054556,
+ -0.730585,0.298655,0.614045,-3.158524,-3.405872,1.197099,
+ -0.701121,0.259575,-0.664117,-3.18675,-3.457336,1.025606,
+ -0.588311,0.26373,0.764419,-3.223246,-3.225388,0.976573,
+ -0.64352,0.086605,-0.760514,-3.11957,-3.183977,0.870739,
+ -0.382827,0.20765,-0.900181,-3.087335,-3.350463,0.831656,
+ -0.588311,0.26373,0.764419,-3.223246,-3.225388,0.976573,
+ -0.382827,0.20765,-0.900181,-3.087335,-3.350463,0.831656,
+ -0.626758,0.377346,0.681751,-3.19417,-3.348553,1.007196,
+ -0.382827,0.20765,-0.900181,-3.087335,-3.350463,0.831656,
+ -0.421241,0.09636,-0.901815,-3.074557,-3.486847,0.843432,
+ -0.701121,0.259575,-0.664117,-3.18675,-3.457336,1.025606,
+ -0.382827,0.20765,-0.900181,-3.087335,-3.350463,0.831656,
+ -0.701121,0.259575,-0.664117,-3.18675,-3.457336,1.025606,
+ -0.626758,0.377346,0.681751,-3.19417,-3.348553,1.007196,
+ -0.482826,-0.146891,-0.863309,-3.006867,-3.575464,0.830221,
+ -0.738865,0.325814,-0.589851,-3.082741,-3.598298,1.054556,
+ -0.701121,0.259575,-0.664117,-3.18675,-3.457336,1.025606,
+ -0.482826,-0.146891,-0.863309,-3.006867,-3.575464,0.830221,
+ -0.701121,0.259575,-0.664117,-3.18675,-3.457336,1.025606,
+ -0.421241,0.09636,-0.901815,-3.074557,-3.486847,0.843432,
+ -0.562406,-0.352304,-0.748051,-2.870422,-3.601724,0.843123,
+ -0.670566,0.283017,-0.685743,-2.922908,-3.637036,1.059206,
+ -0.738865,0.325814,-0.589851,-3.082741,-3.598298,1.054556,
+ -0.562406,-0.352304,-0.748051,-2.870422,-3.601724,0.843123,
+ -0.738865,0.325814,-0.589851,-3.082741,-3.598298,1.054556,
+ -0.482826,-0.146891,-0.863309,-3.006867,-3.575464,0.830221,
+ 0.115225,0.169061,-0.978847,-2.740824,-3.597601,0.875006,
+ 0.024044,0.175693,-0.984151,-2.791754,-3.635993,1.078555,
+ -0.670566,0.283017,-0.685743,-2.922908,-3.637036,1.059206,
+ 0.115225,0.169061,-0.978847,-2.740824,-3.597601,0.875006,
+ -0.670566,0.283017,-0.685743,-2.922908,-3.637036,1.059206,
+ -0.562406,-0.352304,-0.748051,-2.870422,-3.601724,0.843123,
+ 0.405755,-0.293021,0.865737,-3.042899,-3.193907,1.207296,
+ 0.254799,-0.149124,0.955426,-2.888628,-3.200302,1.210934,
+ -0.541406,0.227835,0.809302,-3.03125,-3.09594,1.106355,
+ 0.405755,-0.293021,0.865737,-3.042899,-3.193907,1.207296,
+ -0.541406,0.227835,0.809302,-3.03125,-3.09594,1.106355,
+ -0.125911,-0.68432,-0.718229,-3.121673,-3.120319,1.136456,
+ 0.487947,-0.44627,0.750167,-3.135041,-3.243787,1.189436,
+ 0.405755,-0.293021,0.865737,-3.042899,-3.193907,1.207296,
+ -0.125911,-0.68432,-0.718229,-3.121673,-3.120319,1.136456,
+ 0.487947,-0.44627,0.750167,-3.135041,-3.243787,1.189436,
+ -0.125911,-0.68432,-0.718229,-3.121673,-3.120319,1.136456,
+ 0.535863,0.090315,-0.83946,-3.169546,-3.135273,1.128247,
+ -0.059163,0.13391,0.989226,-3.184143,-3.298048,1.156892,
+ 0.487947,-0.44627,0.750167,-3.135041,-3.243787,1.189436,
+ 0.535863,0.090315,-0.83946,-3.169546,-3.135273,1.128247,
+ -0.059163,0.13391,0.989226,-3.184143,-3.298048,1.156892,
+ 0.535863,0.090315,-0.83946,-3.169546,-3.135273,1.128247,
+ 0.085126,0.114843,0.98973,-3.217306,-3.187686,1.075214,
+ 0.199599,0.097869,-0.974978,-2.80326,-3.21358,0.942403,
+ 0.236645,-0.06852,-0.969177,-2.928681,-3.072892,0.924772,
+ -0.161613,0.16539,0.972896,-2.884711,-3.063896,0.993766,
+ 0.199599,0.097869,-0.974978,-2.80326,-3.21358,0.942403,
+ -0.161613,0.16539,0.972896,-2.884711,-3.063896,0.993766,
+ -0.206994,0.072903,0.975622,-2.770335,-3.208138,1.031045,
+ 0.177373,0.037311,0.983436,-2.787341,-3.278502,1.138621,
+ 0.159383,-0.507401,-0.846842,-2.749355,-3.272099,1.034148,
+ -0.206994,0.072903,0.975622,-2.770335,-3.208138,1.031045,
+ 0.177373,0.037311,0.983436,-2.787341,-3.278502,1.138621,
+ -0.206994,0.072903,0.975622,-2.770335,-3.208138,1.031045,
+ -0.308543,0.191148,0.931807,-2.822497,-3.186549,1.120984,
+ -0.026425,0.178249,0.983631,-2.631547,-3.559891,1.33738,
+ 0.35124,-0.91474,-0.199704,-2.58358,-3.514267,1.278598,
+ -0.048366,0.138166,0.989227,-2.699957,-3.390295,1.185593,
+ -0.026425,0.178249,0.983631,-2.631547,-3.559891,1.33738,
+ -0.048366,0.138166,0.989227,-2.699957,-3.390295,1.185593,
+ 0.011655,0.055061,0.998415,-2.736599,-3.394849,1.269577,
+ 0.285409,-0.933801,-0.215773,-2.52472,-3.561609,1.161535,
+ -0.97518,0.20982,-0.070713,-2.649491,-3.404362,1.100352,
+ -0.048366,0.138166,0.989227,-2.699957,-3.390295,1.185593,
+ 0.285409,-0.933801,-0.215773,-2.52472,-3.561609,1.161535,
+ -0.048366,0.138166,0.989227,-2.699957,-3.390295,1.185593,
+ 0.35124,-0.91474,-0.199704,-2.58358,-3.514267,1.278598,
+ 0.159383,-0.507401,-0.846842,-2.749355,-3.272099,1.034148,
+ 0.177373,0.037311,0.983436,-2.787341,-3.278502,1.138621,
+ -0.048366,0.138166,0.989227,-2.699957,-3.390295,1.185593,
+ 0.159383,-0.507401,-0.846842,-2.749355,-3.272099,1.034148,
+ -0.048366,0.138166,0.989227,-2.699957,-3.390295,1.185593,
+ -0.97518,0.20982,-0.070713,-2.649491,-3.404362,1.100352,
+ -0.999995,0.003039,0.000095,-2.593513,-3.536154,0.94245,
+ -0.830756,0.127038,0.541946,-2.668957,-3.397513,0.943626,
+ -0.97518,0.20982,-0.070713,-2.649491,-3.404362,1.100352,
+ -0.999995,0.003039,0.000095,-2.593513,-3.536154,0.94245,
+ -0.97518,0.20982,-0.070713,-2.649491,-3.404362,1.100352,
+ 0.285409,-0.933801,-0.215773,-2.52472,-3.561609,1.161535,
+ -0.874688,-0.025586,0.48401,-2.749867,-3.295148,0.966073,
+ 0.159383,-0.507401,-0.846842,-2.749355,-3.272099,1.034148,
+ -0.97518,0.20982,-0.070713,-2.649491,-3.404362,1.100352,
+ -0.874688,-0.025586,0.48401,-2.749867,-3.295148,0.966073,
+ -0.97518,0.20982,-0.070713,-2.649491,-3.404362,1.100352,
+ -0.830756,0.127038,0.541946,-2.668957,-3.397513,0.943626,
+ 0.199599,0.097869,-0.974978,-2.80326,-3.21358,0.942403,
+ -0.206994,0.072903,0.975622,-2.770335,-3.208138,1.031045,
+ 0.159383,-0.507401,-0.846842,-2.749355,-3.272099,1.034148,
+ 0.199599,0.097869,-0.974978,-2.80326,-3.21358,0.942403,
+ 0.159383,-0.507401,-0.846842,-2.749355,-3.272099,1.034148,
+ -0.874688,-0.025586,0.48401,-2.749867,-3.295148,0.966073,
+ -0.860798,0.234294,0.451812,-3.011987,-3.092,0.860973,
+ -0.405387,0.054444,0.912522,-2.944625,-3.282121,0.817054,
+ -0.382827,0.20765,-0.900181,-3.087335,-3.350463,0.831656,
+ -0.860798,0.234294,0.451812,-3.011987,-3.092,0.860973,
+ -0.382827,0.20765,-0.900181,-3.087335,-3.350463,0.831656,
+ -0.64352,0.086605,-0.760514,-3.11957,-3.183977,0.870739,
+ 0.236645,-0.06852,-0.969177,-2.928681,-3.072892,0.924772,
+ 0.199599,0.097869,-0.974978,-2.80326,-3.21358,0.942403,
+ -0.405387,0.054444,0.912522,-2.944625,-3.282121,0.817054,
+ 0.236645,-0.06852,-0.969177,-2.928681,-3.072892,0.924772,
+ -0.405387,0.054444,0.912522,-2.944625,-3.282121,0.817054,
+ -0.860798,0.234294,0.451812,-3.011987,-3.092,0.860973,
+ -0.405387,0.054444,0.912522,-2.944625,-3.282121,0.817054,
+ -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
+ -0.421241,0.09636,-0.901815,-3.074557,-3.486847,0.843432,
+ -0.405387,0.054444,0.912522,-2.944625,-3.282121,0.817054,
+ -0.421241,0.09636,-0.901815,-3.074557,-3.486847,0.843432,
+ -0.382827,0.20765,-0.900181,-3.087335,-3.350463,0.831656,
+ 0.199599,0.097869,-0.974978,-2.80326,-3.21358,0.942403,
+ -0.874688,-0.025586,0.48401,-2.749867,-3.295148,0.966073,
+ -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
+ 0.199599,0.097869,-0.974978,-2.80326,-3.21358,0.942403,
+ -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
+ -0.405387,0.054444,0.912522,-2.944625,-3.282121,0.817054,
+ -0.482826,-0.146891,-0.863309,-3.006867,-3.575464,0.830221,
+ -0.421241,0.09636,-0.901815,-3.074557,-3.486847,0.843432,
+ -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
+ -0.482826,-0.146891,-0.863309,-3.006867,-3.575464,0.830221,
+ -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
+ -0.562406,-0.352304,-0.748051,-2.870422,-3.601724,0.843123,
+ -0.830756,0.127038,0.541946,-2.668957,-3.397513,0.943626,
+ -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
+ -0.874688,-0.025586,0.48401,-2.749867,-3.295148,0.966073,
+ -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
+ 0.115225,0.169061,-0.978847,-2.740824,-3.597601,0.875006,
+ -0.562406,-0.352304,-0.748051,-2.870422,-3.601724,0.843123,
+ 0.115225,0.169061,-0.978847,-2.740824,-3.597601,0.875006,
+ -0.51506,-0.054833,0.855398,-2.890885,-3.415616,0.819125,
+ -0.830756,0.127038,0.541946,-2.668957,-3.397513,0.943626,
+ 0.115225,0.169061,-0.978847,-2.740824,-3.597601,0.875006,
+ -0.830756,0.127038,0.541946,-2.668957,-3.397513,0.943626,
+ -0.999995,0.003039,0.000095,-2.593513,-3.536154,0.94245,
+ 0.024044,0.175693,-0.984151,-2.791754,-3.635993,1.078555,
+ 0.115225,0.169061,-0.978847,-2.740824,-3.597601,0.875006,
+ -0.999995,0.003039,0.000095,-2.593513,-3.536154,0.94245,
+ 0.024044,0.175693,-0.984151,-2.791754,-3.635993,1.078555,
+ -0.999995,0.003039,0.000095,-2.593513,-3.536154,0.94245,
+ 0.285409,-0.933801,-0.215773,-2.52472,-3.561609,1.161535,
+ 0.024044,0.175693,-0.984151,-2.791754,-3.635993,1.078555,
+ -0.093334,0.204552,0.974396,-2.729567,-3.602976,1.377236,
+ -0.057735,0.03099,0.997851,-2.981824,-3.608887,1.346959,
+ 0.024044,0.175693,-0.984151,-2.791754,-3.635993,1.078555,
+ -0.057735,0.03099,0.997851,-2.981824,-3.608887,1.346959,
+ -0.670566,0.283017,-0.685743,-2.922908,-3.637036,1.059206,
+ -0.308543,0.191148,0.931807,-2.822497,-3.186549,1.120984,
+ 0.07463,0.029476,0.996776,-2.90901,-3.084482,1.089147,
+ -0.541406,0.227835,0.809302,-3.03125,-3.09594,1.106355,
+ 0.285409,-0.933801,-0.215773,-2.52472,-3.561609,1.161535,
+ 0.35124,-0.91474,-0.199704,-2.58358,-3.514267,1.278598,
+ -0.026425,0.178249,0.983631,-2.631547,-3.559891,1.33738,
+ 0.285409,-0.933801,-0.215773,-2.52472,-3.561609,1.161535,
+ -0.026425,0.178249,0.983631,-2.631547,-3.559891,1.33738,
+ -0.093334,0.204552,0.974396,-2.729567,-3.602976,1.377236,
+ 0.285409,-0.933801,-0.215773,-2.52472,-3.561609,1.161535,
+ -0.093334,0.204552,0.974396,-2.729567,-3.602976,1.377236,
+ 0.024044,0.175693,-0.984151,-2.791754,-3.635993,1.078555
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,1032,data,NULL};
+const struct gllist *cow_hoofs=&frame;
diff --git a/hacks/glx/cow_horns.c b/hacks/glx/cow_horns.c
new file mode 100644
index 0000000..2d5dbe9
--- /dev/null
+++ b/hacks/glx/cow_horns.c
@@ -0,0 +1,1025 @@
+#include "gllist.h"
+static const float data[]={
+ -0.000715,-0.295728,0.955272,4.22473,2.624525,-0.491916,
+ -0.03479,0.69667,0.716547,4.209941,2.600612,-0.337597,
+ -0.01139,0.953897,0.299916,4.328606,2.563996,-0.343892,
+ -0.000715,-0.295728,0.955272,4.22473,2.624525,-0.491916,
+ -0.01139,0.953897,0.299916,4.328606,2.563996,-0.343892,
+ -0.163152,0.69985,0.695407,4.344028,2.585635,-0.470949,
+ -0.163152,0.69985,0.695407,4.344028,2.585635,-0.470949,
+ -0.01139,0.953897,0.299916,4.328606,2.563996,-0.343892,
+ -0.151742,0.274295,0.949598,4.410844,2.500167,-0.351972,
+ -0.163152,0.69985,0.695407,4.344028,2.585635,-0.470949,
+ -0.151742,0.274295,0.949598,4.410844,2.500167,-0.351972,
+ -0.090939,0.953562,0.287141,4.407729,2.53164,-0.486692,
+ 0.008972,0.708004,0.706152,4.277169,2.652435,-0.591369,
+ -0.000715,-0.295728,0.955272,4.22473,2.624525,-0.491916,
+ -0.163152,0.69985,0.695407,4.344028,2.585635,-0.470949,
+ 0.008972,0.708004,0.706152,4.277169,2.652435,-0.591369,
+ -0.163152,0.69985,0.695407,4.344028,2.585635,-0.470949,
+ 0.809878,-0.450757,-0.375386,4.359483,2.615839,-0.596817,
+ 0.809878,-0.450757,-0.375386,4.359483,2.615839,-0.596817,
+ -0.163152,0.69985,0.695407,4.344028,2.585635,-0.470949,
+ -0.090939,0.953562,0.287141,4.407729,2.53164,-0.486692,
+ 0.809878,-0.450757,-0.375386,4.359483,2.615839,-0.596817,
+ -0.090939,0.953562,0.287141,4.407729,2.53164,-0.486692,
+ 0.795507,-0.586003,-0.154171,4.423033,2.561337,-0.603562,
+ 0.743898,-0.655714,0.129057,4.35668,2.682996,-0.71905,
+ 0.008972,0.708004,0.706152,4.277169,2.652435,-0.591369,
+ 0.809878,-0.450757,-0.375386,4.359483,2.615839,-0.596817,
+ 0.743898,-0.655714,0.129057,4.35668,2.682996,-0.71905,
+ 0.809878,-0.450757,-0.375386,4.359483,2.615839,-0.596817,
+ 0.083641,-0.819891,-0.566378,4.411541,2.663824,-0.713132,
+ 0.083641,-0.819891,-0.566378,4.411541,2.663824,-0.713132,
+ 0.809878,-0.450757,-0.375386,4.359483,2.615839,-0.596817,
+ 0.795507,-0.586003,-0.154171,4.423033,2.561337,-0.603562,
+ 0.083641,-0.819891,-0.566378,4.411541,2.663824,-0.713132,
+ 0.795507,-0.586003,-0.154171,4.423033,2.561337,-0.603562,
+ 0.042118,-0.881894,-0.469563,4.47609,2.606654,-0.692301,
+ 0.713982,0.301536,-0.631907,4.418954,2.707401,-0.782531,
+ 0.743898,-0.655714,0.129057,4.35668,2.682996,-0.71905,
+ 0.083641,-0.819891,-0.566378,4.411541,2.663824,-0.713132,
+ 0.713982,0.301536,-0.631907,4.418954,2.707401,-0.782531,
+ 0.083641,-0.819891,-0.566378,4.411541,2.663824,-0.713132,
+ 0.086688,-0.887002,-0.453556,4.465268,2.695425,-0.757267,
+ 0.083641,-0.819891,-0.566378,4.411541,2.663824,-0.713132,
+ 0.042118,-0.881894,-0.469563,4.47609,2.606654,-0.692301,
+ 0.571341,-0.68069,0.458509,4.520603,2.639162,-0.745542,
+ 0.083641,-0.819891,-0.566378,4.411541,2.663824,-0.713132,
+ 0.571341,-0.68069,0.458509,4.520603,2.639162,-0.745542,
+ 0.086688,-0.887002,-0.453556,4.465268,2.695425,-0.757267,
+ 0.176955,-0.903058,-0.391373,4.509555,2.719807,-0.819972,
+ 0.713982,0.301536,-0.631907,4.418954,2.707401,-0.782531,
+ 0.086688,-0.887002,-0.453556,4.465268,2.695425,-0.757267,
+ 0.176955,-0.903058,-0.391373,4.509555,2.719807,-0.819972,
+ 0.086688,-0.887002,-0.453556,4.465268,2.695425,-0.757267,
+ 0.388502,-0.664299,0.638571,4.546655,2.709095,-0.80378,
+ 0.086688,-0.887002,-0.453556,4.465268,2.695425,-0.757267,
+ 0.571341,-0.68069,0.458509,4.520603,2.639162,-0.745542,
+ 0.21141,-0.953268,-0.215838,4.574545,2.669863,-0.780363,
+ 0.086688,-0.887002,-0.453556,4.465268,2.695425,-0.757267,
+ 0.21141,-0.953268,-0.215838,4.574545,2.669863,-0.780363,
+ 0.388502,-0.664299,0.638571,4.546655,2.709095,-0.80378,
+ -0.090939,0.953562,0.287141,4.407729,2.53164,-0.486692,
+ -0.151742,0.274295,0.949598,4.410844,2.500167,-0.351972,
+ 0.288841,-0.745301,0.600914,4.474318,2.418432,-0.361347,
+ -0.090939,0.953562,0.287141,4.407729,2.53164,-0.486692,
+ 0.288841,-0.745301,0.600914,4.474318,2.418432,-0.361347,
+ 0.237421,-0.963021,-0.127365,4.44385,2.449921,-0.495432,
+ 0.795507,-0.586003,-0.154171,4.423033,2.561337,-0.603562,
+ -0.090939,0.953562,0.287141,4.407729,2.53164,-0.486692,
+ 0.237421,-0.963021,-0.127365,4.44385,2.449921,-0.495432,
+ 0.795507,-0.586003,-0.154171,4.423033,2.561337,-0.603562,
+ 0.237421,-0.963021,-0.127365,4.44385,2.449921,-0.495432,
+ 0.157921,-0.851177,0.500558,4.44076,2.490353,-0.629287,
+ 0.042118,-0.881894,-0.469563,4.47609,2.606654,-0.692301,
+ 0.795507,-0.586003,-0.154171,4.423033,2.561337,-0.603562,
+ 0.157921,-0.851177,0.500558,4.44076,2.490353,-0.629287,
+ 0.042118,-0.881894,-0.469563,4.47609,2.606654,-0.692301,
+ 0.157921,-0.851177,0.500558,4.44076,2.490353,-0.629287,
+ 0.254106,-0.95176,-0.171999,4.484667,2.534451,-0.708888,
+ 0.571341,-0.68069,0.458509,4.520603,2.639162,-0.745542,
+ 0.042118,-0.881894,-0.469563,4.47609,2.606654,-0.692301,
+ 0.254106,-0.95176,-0.171999,4.484667,2.534451,-0.708888,
+ 0.571341,-0.68069,0.458509,4.520603,2.639162,-0.745542,
+ 0.254106,-0.95176,-0.171999,4.484667,2.534451,-0.708888,
+ 0.165259,-0.797056,0.580854,4.520165,2.557971,-0.762427,
+ 0.21141,-0.953268,-0.215838,4.574545,2.669863,-0.780363,
+ 0.571341,-0.68069,0.458509,4.520603,2.639162,-0.745542,
+ 0.165259,-0.797056,0.580854,4.520165,2.557971,-0.762427,
+ 0.21141,-0.953268,-0.215838,4.574545,2.669863,-0.780363,
+ 0.165259,-0.797056,0.580854,4.520165,2.557971,-0.762427,
+ 0.243744,-0.944481,-0.220328,4.59262,2.569879,-0.790452,
+ 0.209939,-0.930128,-0.301309,4.656565,2.680542,-0.799684,
+ 0.21141,-0.953268,-0.215838,4.574545,2.669863,-0.780363,
+ 0.243744,-0.944481,-0.220328,4.59262,2.569879,-0.790452,
+ 0.209939,-0.930128,-0.301309,4.656565,2.680542,-0.799684,
+ 0.243744,-0.944481,-0.220328,4.59262,2.569879,-0.790452,
+ -0.05208,-0.715695,-0.696469,4.674691,2.598833,-0.808006,
+ 0.287073,-0.905921,-0.311283,4.646703,2.728688,-0.822295,
+ 0.388502,-0.664299,0.638571,4.546655,2.709095,-0.80378,
+ 0.21141,-0.953268,-0.215838,4.574545,2.669863,-0.780363,
+ 0.287073,-0.905921,-0.311283,4.646703,2.728688,-0.822295,
+ 0.21141,-0.953268,-0.215838,4.574545,2.669863,-0.780363,
+ 0.209939,-0.930128,-0.301309,4.656565,2.680542,-0.799684,
+ 0.267121,-0.895396,-0.356249,4.636909,2.750501,-0.856859,
+ 0.176955,-0.903058,-0.391373,4.509555,2.719807,-0.819972,
+ 0.388502,-0.664299,0.638571,4.546655,2.709095,-0.80378,
+ 0.267121,-0.895396,-0.356249,4.636909,2.750501,-0.856859,
+ 0.388502,-0.664299,0.638571,4.546655,2.709095,-0.80378,
+ 0.287073,-0.905921,-0.311283,4.646703,2.728688,-0.822295,
+ -0.290459,-0.499809,-0.815981,4.748031,2.683805,-0.800044,
+ 0.209939,-0.930128,-0.301309,4.656565,2.680542,-0.799684,
+ -0.05208,-0.715695,-0.696469,4.674691,2.598833,-0.808006,
+ -0.290459,-0.499809,-0.815981,4.748031,2.683805,-0.800044,
+ -0.05208,-0.715695,-0.696469,4.674691,2.598833,-0.808006,
+ -0.501597,-0.526154,-0.686704,4.729447,2.606204,-0.807513,
+ -0.538845,-0.659239,-0.524452,4.728931,2.721892,-0.832625,
+ 0.287073,-0.905921,-0.311283,4.646703,2.728688,-0.822295,
+ 0.209939,-0.930128,-0.301309,4.656565,2.680542,-0.799684,
+ -0.538845,-0.659239,-0.524452,4.728931,2.721892,-0.832625,
+ 0.209939,-0.930128,-0.301309,4.656565,2.680542,-0.799684,
+ -0.290459,-0.499809,-0.815981,4.748031,2.683805,-0.800044,
+ -0.53682,-0.608254,-0.58468,4.719171,2.751091,-0.865965,
+ 0.267121,-0.895396,-0.356249,4.636909,2.750501,-0.856859,
+ 0.287073,-0.905921,-0.311283,4.646703,2.728688,-0.822295,
+ -0.53682,-0.608254,-0.58468,4.719171,2.751091,-0.865965,
+ 0.287073,-0.905921,-0.311283,4.646703,2.728688,-0.822295,
+ -0.538845,-0.659239,-0.524452,4.728931,2.721892,-0.832625,
+ -0.635876,0.32433,-0.700337,4.821325,2.691794,-0.791887,
+ -0.290459,-0.499809,-0.815981,4.748031,2.683805,-0.800044,
+ -0.501597,-0.526154,-0.686704,4.729447,2.606204,-0.807513,
+ -0.635876,0.32433,-0.700337,4.821325,2.691794,-0.791887,
+ -0.501597,-0.526154,-0.686704,4.729447,2.606204,-0.807513,
+ -0.376273,-0.14016,-0.915846,4.821336,2.621498,-0.789636,
+ -0.508573,-0.111047,-0.853828,4.811798,2.72868,-0.815406,
+ -0.538845,-0.659239,-0.524452,4.728931,2.721892,-0.832625,
+ -0.290459,-0.499809,-0.815981,4.748031,2.683805,-0.800044,
+ -0.508573,-0.111047,-0.853828,4.811798,2.72868,-0.815406,
+ -0.290459,-0.499809,-0.815981,4.748031,2.683805,-0.800044,
+ -0.635876,0.32433,-0.700337,4.821325,2.691794,-0.791887,
+ -0.53682,-0.608254,-0.58468,4.719171,2.751091,-0.865965,
+ -0.538845,-0.659239,-0.524452,4.728931,2.721892,-0.832625,
+ -0.508573,-0.111047,-0.853828,4.811798,2.72868,-0.815406,
+ -0.53682,-0.608254,-0.58468,4.719171,2.751091,-0.865965,
+ -0.508573,-0.111047,-0.853828,4.811798,2.72868,-0.815406,
+ -0.724543,-0.128977,-0.677054,4.801436,2.750224,-0.858918,
+ -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
+ -0.724543,-0.128977,-0.677054,4.801436,2.750224,-0.858918,
+ -0.508573,-0.111047,-0.853828,4.811798,2.72868,-0.815406,
+ -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
+ -0.508573,-0.111047,-0.853828,4.811798,2.72868,-0.815406,
+ -0.635876,0.32433,-0.700337,4.821325,2.691794,-0.791887,
+ -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
+ -0.635876,0.32433,-0.700337,4.821325,2.691794,-0.791887,
+ -0.376273,-0.14016,-0.915846,4.821336,2.621498,-0.789636,
+ -0.903777,-0.182749,-0.387027,4.442912,2.343263,-0.53322,
+ 0.237421,-0.963021,-0.127365,4.44385,2.449921,-0.495432,
+ 0.288841,-0.745301,0.600914,4.474318,2.418432,-0.361347,
+ -0.903777,-0.182749,-0.387027,4.442912,2.343263,-0.53322,
+ 0.288841,-0.745301,0.600914,4.474318,2.418432,-0.361347,
+ 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
+ -0.911341,0.002265,-0.411646,4.440713,2.398472,-0.629128,
+ 0.157921,-0.851177,0.500558,4.44076,2.490353,-0.629287,
+ 0.237421,-0.963021,-0.127365,4.44385,2.449921,-0.495432,
+ -0.911341,0.002265,-0.411646,4.440713,2.398472,-0.629128,
+ 0.237421,-0.963021,-0.127365,4.44385,2.449921,-0.495432,
+ -0.903777,-0.182749,-0.387027,4.442912,2.343263,-0.53322,
+ 0.254106,-0.95176,-0.171999,4.484667,2.534451,-0.708888,
+ 0.157921,-0.851177,0.500558,4.44076,2.490353,-0.629287,
+ -0.911341,0.002265,-0.411646,4.440713,2.398472,-0.629128,
+ 0.254106,-0.95176,-0.171999,4.484667,2.534451,-0.708888,
+ -0.911341,0.002265,-0.411646,4.440713,2.398472,-0.629128,
+ -0.77316,0.344901,-0.532228,4.474625,2.465214,-0.75189,
+ -0.911341,0.002265,-0.411646,4.440713,2.398472,-0.629128,
+ -0.903777,-0.182749,-0.387027,4.442912,2.343263,-0.53322,
+ -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
+ -0.911341,0.002265,-0.411646,4.440713,2.398472,-0.629128,
+ -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
+ -0.383863,0.612068,-0.691392,4.32063,2.385528,-0.682583,
+ -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
+ -0.903777,-0.182749,-0.387027,4.442912,2.343263,-0.53322,
+ 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
+ -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
+ 0.195545,0.103956,-0.975169,4.472349,2.325133,-0.443764,
+ -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
+ -0.77316,0.344901,-0.532228,4.474625,2.465214,-0.75189,
+ -0.911341,0.002265,-0.411646,4.440713,2.398472,-0.629128,
+ -0.383863,0.612068,-0.691392,4.32063,2.385528,-0.682583,
+ -0.77316,0.344901,-0.532228,4.474625,2.465214,-0.75189,
+ -0.383863,0.612068,-0.691392,4.32063,2.385528,-0.682583,
+ -0.911194,0.285551,-0.296961,4.382053,2.433474,-0.798757,
+ 0.165259,-0.797056,0.580854,4.520165,2.557971,-0.762427,
+ 0.254106,-0.95176,-0.171999,4.484667,2.534451,-0.708888,
+ -0.77316,0.344901,-0.532228,4.474625,2.465214,-0.75189,
+ 0.165259,-0.797056,0.580854,4.520165,2.557971,-0.762427,
+ -0.77316,0.344901,-0.532228,4.474625,2.465214,-0.75189,
+ -0.931592,0.319003,-0.174277,4.538177,2.513353,-0.776566,
+ -0.931592,0.319003,-0.174277,4.538177,2.513353,-0.776566,
+ -0.77316,0.344901,-0.532228,4.474625,2.465214,-0.75189,
+ -0.911194,0.285551,-0.296961,4.382053,2.433474,-0.798757,
+ -0.931592,0.319003,-0.174277,4.538177,2.513353,-0.776566,
+ -0.911194,0.285551,-0.296961,4.382053,2.433474,-0.798757,
+ -0.895156,0.397807,-0.201111,4.444739,2.475795,-0.860515,
+ 0.243744,-0.944481,-0.220328,4.59262,2.569879,-0.790452,
+ 0.165259,-0.797056,0.580854,4.520165,2.557971,-0.762427,
+ -0.931592,0.319003,-0.174277,4.538177,2.513353,-0.776566,
+ 0.243744,-0.944481,-0.220328,4.59262,2.569879,-0.790452,
+ -0.931592,0.319003,-0.174277,4.538177,2.513353,-0.776566,
+ -0.885174,0.439903,-0.1515,4.601515,2.533324,-0.794193,
+ -0.885174,0.439903,-0.1515,4.601515,2.533324,-0.794193,
+ -0.931592,0.319003,-0.174277,4.538177,2.513353,-0.776566,
+ -0.895156,0.397807,-0.201111,4.444739,2.475795,-0.860515,
+ -0.885174,0.439903,-0.1515,4.601515,2.533324,-0.794193,
+ -0.895156,0.397807,-0.201111,4.444739,2.475795,-0.860515,
+ -0.821561,0.369567,-0.434116,4.554459,2.511417,-0.850571,
+ -0.05208,-0.715695,-0.696469,4.674691,2.598833,-0.808006,
+ 0.243744,-0.944481,-0.220328,4.59262,2.569879,-0.790452,
+ -0.885174,0.439903,-0.1515,4.601515,2.533324,-0.794193,
+ -0.05208,-0.715695,-0.696469,4.674691,2.598833,-0.808006,
+ -0.885174,0.439903,-0.1515,4.601515,2.533324,-0.794193,
+ -0.742898,0.572423,-0.347037,4.683344,2.554221,-0.821927,
+ -0.742898,0.572423,-0.347037,4.683344,2.554221,-0.821927,
+ -0.885174,0.439903,-0.1515,4.601515,2.533324,-0.794193,
+ -0.821561,0.369567,-0.434116,4.554459,2.511417,-0.850571,
+ -0.742898,0.572423,-0.347037,4.683344,2.554221,-0.821927,
+ -0.821561,0.369567,-0.434116,4.554459,2.511417,-0.850571,
+ -0.659696,0.567803,-0.492342,4.681847,2.551036,-0.886235,
+ 0.11638,0.680313,-0.723623,4.737893,2.564648,-0.830389,
+ -0.742898,0.572423,-0.347037,4.683344,2.554221,-0.821927,
+ -0.659696,0.567803,-0.492342,4.681847,2.551036,-0.886235,
+ 0.11638,0.680313,-0.723623,4.737893,2.564648,-0.830389,
+ -0.659696,0.567803,-0.492342,4.681847,2.551036,-0.886235,
+ 0.206279,0.744918,-0.634466,4.755192,2.568818,-0.876311,
+ -0.395723,0.901671,-0.174334,4.829566,2.580797,-0.821827,
+ 0.11638,0.680313,-0.723623,4.737893,2.564648,-0.830389,
+ 0.206279,0.744918,-0.634466,4.755192,2.568818,-0.876311,
+ -0.395723,0.901671,-0.174334,4.829566,2.580797,-0.821827,
+ 0.206279,0.744918,-0.634466,4.755192,2.568818,-0.876311,
+ -0.476949,0.871028,-0.117606,4.856249,2.593812,-0.867067,
+ -0.501597,-0.526154,-0.686704,4.729447,2.606204,-0.807513,
+ -0.05208,-0.715695,-0.696469,4.674691,2.598833,-0.808006,
+ -0.742898,0.572423,-0.347037,4.683344,2.554221,-0.821927,
+ -0.501597,-0.526154,-0.686704,4.729447,2.606204,-0.807513,
+ -0.742898,0.572423,-0.347037,4.683344,2.554221,-0.821927,
+ 0.11638,0.680313,-0.723623,4.737893,2.564648,-0.830389,
+ -0.376273,-0.14016,-0.915846,4.821336,2.621498,-0.789636,
+ -0.501597,-0.526154,-0.686704,4.729447,2.606204,-0.807513,
+ 0.11638,0.680313,-0.723623,4.737893,2.564648,-0.830389,
+ -0.376273,-0.14016,-0.915846,4.821336,2.621498,-0.789636,
+ 0.11638,0.680313,-0.723623,4.737893,2.564648,-0.830389,
+ -0.395723,0.901671,-0.174334,4.829566,2.580797,-0.821827,
+ -0.590366,0.807127,0.003753,4.662221,2.556346,-0.940618,
+ -0.659696,0.567803,-0.492342,4.681847,2.551036,-0.886235,
+ -0.821561,0.369567,-0.434116,4.554459,2.511417,-0.850571,
+ -0.590366,0.807127,0.003753,4.662221,2.556346,-0.940618,
+ -0.821561,0.369567,-0.434116,4.554459,2.511417,-0.850571,
+ -0.594389,0.803108,-0.041468,4.497719,2.54748,-0.937659,
+ -0.659696,0.567803,-0.492342,4.681847,2.551036,-0.886235,
+ -0.590366,0.807127,0.003753,4.662221,2.556346,-0.940618,
+ -0.610894,0.790229,0.048447,4.763337,2.590834,-0.929248,
+ -0.659696,0.567803,-0.492342,4.681847,2.551036,-0.886235,
+ -0.610894,0.790229,0.048447,4.763337,2.590834,-0.929248,
+ 0.206279,0.744918,-0.634466,4.755192,2.568818,-0.876311,
+ -0.091114,0.94565,-0.312161,4.883022,2.613658,-0.893163,
+ -0.476949,0.871028,-0.117606,4.856249,2.593812,-0.867067,
+ 0.206279,0.744918,-0.634466,4.755192,2.568818,-0.876311,
+ -0.091114,0.94565,-0.312161,4.883022,2.613658,-0.893163,
+ 0.206279,0.744918,-0.634466,4.755192,2.568818,-0.876311,
+ -0.610894,0.790229,0.048447,4.763337,2.590834,-0.929248,
+ -0.821561,0.369567,-0.434116,4.554459,2.511417,-0.850571,
+ -0.895156,0.397807,-0.201111,4.444739,2.475795,-0.860515,
+ -0.216454,0.960138,-0.176868,4.352603,2.524888,-0.890532,
+ -0.821561,0.369567,-0.434116,4.554459,2.511417,-0.850571,
+ -0.216454,0.960138,-0.176868,4.352603,2.524888,-0.890532,
+ -0.594389,0.803108,-0.041468,4.497719,2.54748,-0.937659,
+ -0.216454,0.960138,-0.176868,4.352603,2.524888,-0.890532,
+ -0.895156,0.397807,-0.201111,4.444739,2.475795,-0.860515,
+ -0.911194,0.285551,-0.296961,4.382053,2.433474,-0.798757,
+ -0.216454,0.960138,-0.176868,4.352603,2.524888,-0.890532,
+ -0.911194,0.285551,-0.296961,4.382053,2.433474,-0.798757,
+ -0.283496,0.953866,-0.098841,4.262798,2.490674,-0.818316,
+ -0.283496,0.953866,-0.098841,4.262798,2.490674,-0.818316,
+ -0.911194,0.285551,-0.296961,4.382053,2.433474,-0.798757,
+ -0.383863,0.612068,-0.691392,4.32063,2.385528,-0.682583,
+ -0.283496,0.953866,-0.098841,4.262798,2.490674,-0.818316,
+ -0.383863,0.612068,-0.691392,4.32063,2.385528,-0.682583,
+ -0.421167,0.906102,-0.039984,4.192789,2.411967,-0.668016,
+ -0.421167,0.906102,-0.039984,4.192789,2.411967,-0.668016,
+ -0.383863,0.612068,-0.691392,4.32063,2.385528,-0.682583,
+ -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
+ -0.421167,0.906102,-0.039984,4.192789,2.411967,-0.668016,
+ -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
+ -0.557881,0.828586,0.047047,4.193959,2.370476,-0.616705,
+ -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
+ -0.557881,0.828586,0.047047,4.193959,2.370476,-0.616705,
+ -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
+ -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
+ -0.566117,0.431682,-0.702255,4.314039,2.32946,-0.57751,
+ -0.091679,0.768658,-0.633056,4.296769,2.260422,-0.528796,
+ -0.091114,0.94565,-0.312161,4.883022,2.613658,-0.893163,
+ -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
+ -0.476949,0.871028,-0.117606,4.856249,2.593812,-0.867067,
+ -0.610894,0.790229,0.048447,4.763337,2.590834,-0.929248,
+ -0.678216,0.658343,-0.326508,4.735139,2.645464,-0.95089,
+ 0.05537,0.916343,-0.396546,4.854957,2.660227,-0.92431,
+ -0.610894,0.790229,0.048447,4.763337,2.590834,-0.929248,
+ 0.05537,0.916343,-0.396546,4.854957,2.660227,-0.92431,
+ -0.091114,0.94565,-0.312161,4.883022,2.613658,-0.893163,
+ -0.590366,0.807127,0.003753,4.662221,2.556346,-0.940618,
+ 0.090337,0.942369,-0.32215,4.615662,2.63387,-0.977986,
+ -0.678216,0.658343,-0.326508,4.735139,2.645464,-0.95089,
+ -0.590366,0.807127,0.003753,4.662221,2.556346,-0.940618,
+ -0.678216,0.658343,-0.326508,4.735139,2.645464,-0.95089,
+ -0.610894,0.790229,0.048447,4.763337,2.590834,-0.929248,
+ -0.594389,0.803108,-0.041468,4.497719,2.54748,-0.937659,
+ -0.560855,0.735161,-0.380763,4.460582,2.622875,-0.957002,
+ 0.090337,0.942369,-0.32215,4.615662,2.63387,-0.977986,
+ -0.594389,0.803108,-0.041468,4.497719,2.54748,-0.937659,
+ 0.090337,0.942369,-0.32215,4.615662,2.63387,-0.977986,
+ -0.590366,0.807127,0.003753,4.662221,2.556346,-0.940618,
+ -0.216454,0.960138,-0.176868,4.352603,2.524888,-0.890532,
+ -0.641133,0.599375,-0.479267,4.343217,2.589542,-0.893106,
+ -0.560855,0.735161,-0.380763,4.460582,2.622875,-0.957002,
+ -0.216454,0.960138,-0.176868,4.352603,2.524888,-0.890532,
+ -0.560855,0.735161,-0.380763,4.460582,2.622875,-0.957002,
+ -0.594389,0.803108,-0.041468,4.497719,2.54748,-0.937659,
+ -0.283496,0.953866,-0.098841,4.262798,2.490674,-0.818316,
+ -0.760994,0.140162,-0.633436,4.244622,2.554467,-0.811726,
+ -0.641133,0.599375,-0.479267,4.343217,2.589542,-0.893106,
+ -0.283496,0.953866,-0.098841,4.262798,2.490674,-0.818316,
+ -0.641133,0.599375,-0.479267,4.343217,2.589542,-0.893106,
+ -0.216454,0.960138,-0.176868,4.352603,2.524888,-0.890532,
+ -0.421167,0.906102,-0.039984,4.192789,2.411967,-0.668016,
+ -0.411843,0.771855,-0.484381,4.138687,2.474013,-0.642311,
+ -0.760994,0.140162,-0.633436,4.244622,2.554467,-0.811726,
+ -0.421167,0.906102,-0.039984,4.192789,2.411967,-0.668016,
+ -0.760994,0.140162,-0.633436,4.244622,2.554467,-0.811726,
+ -0.283496,0.953866,-0.098841,4.262798,2.490674,-0.818316,
+ -0.091114,0.94565,-0.312161,4.883022,2.613658,-0.893163,
+ 0.05537,0.916343,-0.396546,4.854957,2.660227,-0.92431,
+ -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
+ -0.395036,0.74012,-0.544214,4.121994,2.458034,-0.570029,
+ -0.411843,0.771855,-0.484381,4.138687,2.474013,-0.642311,
+ -0.421167,0.906102,-0.039984,4.192789,2.411967,-0.668016,
+ -0.395036,0.74012,-0.544214,4.121994,2.458034,-0.570029,
+ -0.421167,0.906102,-0.039984,4.192789,2.411967,-0.668016,
+ -0.557881,0.828586,0.047047,4.193959,2.370476,-0.616705,
+ -0.395036,0.74012,-0.544214,4.121994,2.458034,-0.570029,
+ -0.557881,0.828586,0.047047,4.193959,2.370476,-0.616705,
+ -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
+ -0.395036,0.74012,-0.544214,4.121994,2.458034,-0.570029,
+ -0.536307,0.710867,-0.45502,4.113935,2.334131,-0.526471,
+ -0.330515,0.821242,-0.465103,4.07851,2.41181,-0.472193,
+ -0.760994,0.140162,-0.633436,4.244622,2.554467,-0.811726,
+ -0.353793,0.870619,-0.341838,4.235494,2.636171,-0.803613,
+ -0.718934,0.608496,-0.335955,4.342998,2.664049,-0.904347,
+ -0.760994,0.140162,-0.633436,4.244622,2.554467,-0.811726,
+ -0.718934,0.608496,-0.335955,4.342998,2.664049,-0.904347,
+ -0.641133,0.599375,-0.479267,4.343217,2.589542,-0.893106,
+ -0.641133,0.599375,-0.479267,4.343217,2.589542,-0.893106,
+ -0.718934,0.608496,-0.335955,4.342998,2.664049,-0.904347,
+ -0.929249,-0.009269,-0.369337,4.460786,2.695616,-0.949972,
+ -0.641133,0.599375,-0.479267,4.343217,2.589542,-0.893106,
+ -0.929249,-0.009269,-0.369337,4.460786,2.695616,-0.949972,
+ -0.560855,0.735161,-0.380763,4.460582,2.622875,-0.957002,
+ -0.560855,0.735161,-0.380763,4.460582,2.622875,-0.957002,
+ -0.929249,-0.009269,-0.369337,4.460786,2.695616,-0.949972,
+ -0.144656,0.947613,-0.284787,4.6248,2.708372,-0.989445,
+ -0.560855,0.735161,-0.380763,4.460582,2.622875,-0.957002,
+ -0.144656,0.947613,-0.284787,4.6248,2.708372,-0.989445,
+ 0.090337,0.942369,-0.32215,4.615662,2.63387,-0.977986,
+ -0.411843,0.771855,-0.484381,4.138687,2.474013,-0.642311,
+ -0.364192,0.890167,-0.2738,4.138494,2.557838,-0.652651,
+ -0.353793,0.870619,-0.341838,4.235494,2.636171,-0.803613,
+ -0.411843,0.771855,-0.484381,4.138687,2.474013,-0.642311,
+ -0.353793,0.870619,-0.341838,4.235494,2.636171,-0.803613,
+ -0.760994,0.140162,-0.633436,4.244622,2.554467,-0.811726,
+ -0.719327,0.568277,-0.399538,4.104292,2.537976,-0.543437,
+ -0.364192,0.890167,-0.2738,4.138494,2.557838,-0.652651,
+ -0.411843,0.771855,-0.484381,4.138687,2.474013,-0.642311,
+ -0.719327,0.568277,-0.399538,4.104292,2.537976,-0.543437,
+ -0.411843,0.771855,-0.484381,4.138687,2.474013,-0.642311,
+ -0.395036,0.74012,-0.544214,4.121994,2.458034,-0.570029,
+ -0.904972,-0.026554,-0.424642,4.088356,2.510913,-0.453793,
+ -0.719327,0.568277,-0.399538,4.104292,2.537976,-0.543437,
+ -0.395036,0.74012,-0.544214,4.121994,2.458034,-0.570029,
+ -0.904972,-0.026554,-0.424642,4.088356,2.510913,-0.453793,
+ -0.395036,0.74012,-0.544214,4.121994,2.458034,-0.570029,
+ -0.330515,0.821242,-0.465103,4.07851,2.41181,-0.472193,
+ -0.144656,0.947613,-0.284787,4.6248,2.708372,-0.989445,
+ 0.197027,0.937222,-0.287742,4.753015,2.699695,-0.973279,
+ -0.678216,0.658343,-0.326508,4.735139,2.645464,-0.95089,
+ -0.144656,0.947613,-0.284787,4.6248,2.708372,-0.989445,
+ -0.678216,0.658343,-0.326508,4.735139,2.645464,-0.95089,
+ 0.090337,0.942369,-0.32215,4.615662,2.63387,-0.977986,
+ -0.678216,0.658343,-0.326508,4.735139,2.645464,-0.95089,
+ 0.197027,0.937222,-0.287742,4.753015,2.699695,-0.973279,
+ 0.225135,0.965893,-0.127928,4.863709,2.722151,-0.93666,
+ -0.678216,0.658343,-0.326508,4.735139,2.645464,-0.95089,
+ 0.225135,0.965893,-0.127928,4.863709,2.722151,-0.93666,
+ 0.05537,0.916343,-0.396546,4.854957,2.660227,-0.92431,
+ -0.000715,-0.295728,0.955272,4.22473,2.624525,-0.491916,
+ -0.162972,0.917259,0.363422,4.151183,2.579059,-0.494606,
+ -0.860594,0.405545,-0.308076,4.117367,2.568514,-0.3845,
+ -0.000715,-0.295728,0.955272,4.22473,2.624525,-0.491916,
+ -0.860594,0.405545,-0.308076,4.117367,2.568514,-0.3845,
+ -0.03479,0.69667,0.716547,4.209941,2.600612,-0.337597,
+ 0.267121,-0.895396,-0.356249,4.636909,2.750501,-0.856859,
+ -0.31499,0.894135,0.318282,4.616626,2.749486,-0.939333,
+ -0.758791,0.646991,0.075091,4.462368,2.725999,-0.882675,
+ 0.267121,-0.895396,-0.356249,4.636909,2.750501,-0.856859,
+ -0.758791,0.646991,0.075091,4.462368,2.725999,-0.882675,
+ 0.176955,-0.903058,-0.391373,4.509555,2.719807,-0.819972,
+ 0.176955,-0.903058,-0.391373,4.509555,2.719807,-0.819972,
+ -0.758791,0.646991,0.075091,4.462368,2.725999,-0.882675,
+ -0.900694,0.426849,-0.080936,4.354196,2.711836,-0.826545,
+ 0.176955,-0.903058,-0.391373,4.509555,2.719807,-0.819972,
+ -0.900694,0.426849,-0.080936,4.354196,2.711836,-0.826545,
+ 0.713982,0.301536,-0.631907,4.418954,2.707401,-0.782531,
+ 0.713982,0.301536,-0.631907,4.418954,2.707401,-0.782531,
+ -0.900694,0.426849,-0.080936,4.354196,2.711836,-0.826545,
+ -0.940255,0.335069,0.060403,4.273414,2.686575,-0.753674,
+ 0.713982,0.301536,-0.631907,4.418954,2.707401,-0.782531,
+ -0.940255,0.335069,0.060403,4.273414,2.686575,-0.753674,
+ 0.743898,-0.655714,0.129057,4.35668,2.682996,-0.71905,
+ -0.162972,0.917259,0.363422,4.151183,2.579059,-0.494606,
+ -0.000715,-0.295728,0.955272,4.22473,2.624525,-0.491916,
+ 0.008972,0.708004,0.706152,4.277169,2.652435,-0.591369,
+ -0.162972,0.917259,0.363422,4.151183,2.579059,-0.494606,
+ 0.008972,0.708004,0.706152,4.277169,2.652435,-0.591369,
+ -0.816521,0.559553,0.142109,4.176065,2.636883,-0.618384,
+ -0.904972,-0.026554,-0.424642,4.088356,2.510913,-0.453793,
+ -0.860594,0.405545,-0.308076,4.117367,2.568514,-0.3845,
+ -0.162972,0.917259,0.363422,4.151183,2.579059,-0.494606,
+ -0.904972,-0.026554,-0.424642,4.088356,2.510913,-0.453793,
+ -0.162972,0.917259,0.363422,4.151183,2.579059,-0.494606,
+ -0.719327,0.568277,-0.399538,4.104292,2.537976,-0.543437,
+ -0.816521,0.559553,0.142109,4.176065,2.636883,-0.618384,
+ 0.008972,0.708004,0.706152,4.277169,2.652435,-0.591369,
+ 0.743898,-0.655714,0.129057,4.35668,2.682996,-0.71905,
+ -0.816521,0.559553,0.142109,4.176065,2.636883,-0.618384,
+ 0.743898,-0.655714,0.129057,4.35668,2.682996,-0.71905,
+ -0.940255,0.335069,0.060403,4.273414,2.686575,-0.753674,
+ -0.719327,0.568277,-0.399538,4.104292,2.537976,-0.543437,
+ -0.162972,0.917259,0.363422,4.151183,2.579059,-0.494606,
+ -0.816521,0.559553,0.142109,4.176065,2.636883,-0.618384,
+ -0.719327,0.568277,-0.399538,4.104292,2.537976,-0.543437,
+ -0.816521,0.559553,0.142109,4.176065,2.636883,-0.618384,
+ -0.364192,0.890167,-0.2738,4.138494,2.557838,-0.652651,
+ -0.364192,0.890167,-0.2738,4.138494,2.557838,-0.652651,
+ -0.816521,0.559553,0.142109,4.176065,2.636883,-0.618384,
+ -0.940255,0.335069,0.060403,4.273414,2.686575,-0.753674,
+ -0.364192,0.890167,-0.2738,4.138494,2.557838,-0.652651,
+ -0.940255,0.335069,0.060403,4.273414,2.686575,-0.753674,
+ -0.353793,0.870619,-0.341838,4.235494,2.636171,-0.803613,
+ -0.353793,0.870619,-0.341838,4.235494,2.636171,-0.803613,
+ -0.940255,0.335069,0.060403,4.273414,2.686575,-0.753674,
+ -0.900694,0.426849,-0.080936,4.354196,2.711836,-0.826545,
+ -0.353793,0.870619,-0.341838,4.235494,2.636171,-0.803613,
+ -0.900694,0.426849,-0.080936,4.354196,2.711836,-0.826545,
+ -0.718934,0.608496,-0.335955,4.342998,2.664049,-0.904347,
+ -0.718934,0.608496,-0.335955,4.342998,2.664049,-0.904347,
+ -0.900694,0.426849,-0.080936,4.354196,2.711836,-0.826545,
+ -0.758791,0.646991,0.075091,4.462368,2.725999,-0.882675,
+ -0.718934,0.608496,-0.335955,4.342998,2.664049,-0.904347,
+ -0.758791,0.646991,0.075091,4.462368,2.725999,-0.882675,
+ -0.929249,-0.009269,-0.369337,4.460786,2.695616,-0.949972,
+ 0.267121,-0.895396,-0.356249,4.636909,2.750501,-0.856859,
+ -0.53682,-0.608254,-0.58468,4.719171,2.751091,-0.865965,
+ -0.47673,0.840923,0.25608,4.735445,2.749285,-0.940329,
+ 0.267121,-0.895396,-0.356249,4.636909,2.750501,-0.856859,
+ -0.47673,0.840923,0.25608,4.735445,2.749285,-0.940329,
+ -0.31499,0.894135,0.318282,4.616626,2.749486,-0.939333,
+ -0.724543,-0.128977,-0.677054,4.801436,2.750224,-0.858918,
+ -0.145585,0.915338,0.375448,4.827733,2.75439,-0.905049,
+ -0.47673,0.840923,0.25608,4.735445,2.749285,-0.940329,
+ -0.724543,-0.128977,-0.677054,4.801436,2.750224,-0.858918,
+ -0.47673,0.840923,0.25608,4.735445,2.749285,-0.940329,
+ -0.53682,-0.608254,-0.58468,4.719171,2.751091,-0.865965,
+ -0.145585,0.915338,0.375448,4.827733,2.75439,-0.905049,
+ -0.724543,-0.128977,-0.677054,4.801436,2.750224,-0.858918,
+ -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
+ -0.758791,0.646991,0.075091,4.462368,2.725999,-0.882675,
+ -0.31499,0.894135,0.318282,4.616626,2.749486,-0.939333,
+ -0.144656,0.947613,-0.284787,4.6248,2.708372,-0.989445,
+ -0.758791,0.646991,0.075091,4.462368,2.725999,-0.882675,
+ -0.144656,0.947613,-0.284787,4.6248,2.708372,-0.989445,
+ -0.929249,-0.009269,-0.369337,4.460786,2.695616,-0.949972,
+ -0.31499,0.894135,0.318282,4.616626,2.749486,-0.939333,
+ -0.47673,0.840923,0.25608,4.735445,2.749285,-0.940329,
+ 0.197027,0.937222,-0.287742,4.753015,2.699695,-0.973279,
+ -0.31499,0.894135,0.318282,4.616626,2.749486,-0.939333,
+ 0.197027,0.937222,-0.287742,4.753015,2.699695,-0.973279,
+ -0.144656,0.947613,-0.284787,4.6248,2.708372,-0.989445,
+ 0.225135,0.965893,-0.127928,4.863709,2.722151,-0.93666,
+ 0.197027,0.937222,-0.287742,4.753015,2.699695,-0.973279,
+ -0.47673,0.840923,0.25608,4.735445,2.749285,-0.940329,
+ 0.225135,0.965893,-0.127928,4.863709,2.722151,-0.93666,
+ -0.47673,0.840923,0.25608,4.735445,2.749285,-0.940329,
+ -0.145585,0.915338,0.375448,4.827733,2.75439,-0.905049,
+ 0.225135,0.965893,-0.127928,4.863709,2.722151,-0.93666,
+ -0.145585,0.915338,0.375448,4.827733,2.75439,-0.905049,
+ -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
+ 0.05537,0.916343,-0.396546,4.854957,2.660227,-0.92431,
+ 0.225135,0.965893,-0.127928,4.863709,2.722151,-0.93666,
+ -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
+ -0.376273,-0.14016,-0.915846,4.821336,2.621498,-0.789636,
+ -0.395723,0.901671,-0.174334,4.829566,2.580797,-0.821827,
+ -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
+ -0.395723,0.901671,-0.174334,4.829566,2.580797,-0.821827,
+ -0.476949,0.871028,-0.117606,4.856249,2.593812,-0.867067,
+ -0.86136,-0.239794,-0.447836,5.096148,2.75972,-0.774729,
+ -0.877603,-0.025309,0.478719,4.344028,2.585635,0.470949,
+ -0.130291,0.991051,0.029017,4.328606,2.563996,0.343892,
+ -0.904972,-0.026555,0.424641,4.209941,2.600612,0.337597,
+ -0.877603,-0.025309,0.478719,4.344028,2.585635,0.470949,
+ -0.904972,-0.026555,0.424641,4.209941,2.600612,0.337597,
+ -0.778386,0.466325,0.420305,4.22473,2.624525,0.491916,
+ 0.197027,0.937222,0.287741,4.407729,2.53164,0.486692,
+ -0.501953,0.842502,0.195534,4.410844,2.500167,0.351972,
+ -0.130291,0.991051,0.029017,4.328606,2.563996,0.343892,
+ 0.197027,0.937222,0.287741,4.407729,2.53164,0.486692,
+ -0.130291,0.991051,0.029017,4.328606,2.563996,0.343892,
+ -0.877603,-0.025309,0.478719,4.344028,2.585635,0.470949,
+ 0.223577,0.97296,-0.057987,4.359483,2.615839,0.596817,
+ -0.877603,-0.025309,0.478719,4.344028,2.585635,0.470949,
+ -0.778386,0.466325,0.420305,4.22473,2.624525,0.491916,
+ 0.223577,0.97296,-0.057987,4.359483,2.615839,0.596817,
+ -0.778386,0.466325,0.420305,4.22473,2.624525,0.491916,
+ 0.225135,0.965893,0.127928,4.277169,2.652435,0.591369,
+ -0.247355,0.948391,-0.198417,4.423033,2.561337,0.603562,
+ 0.197027,0.937222,0.287741,4.407729,2.53164,0.486692,
+ -0.877603,-0.025309,0.478719,4.344028,2.585635,0.470949,
+ -0.247355,0.948391,-0.198417,4.423033,2.561337,0.603562,
+ -0.877603,-0.025309,0.478719,4.344028,2.585635,0.470949,
+ 0.223577,0.97296,-0.057987,4.359483,2.615839,0.596817,
+ -0.860595,0.405543,0.308077,4.411541,2.663824,0.713132,
+ 0.223577,0.97296,-0.057987,4.359483,2.615839,0.596817,
+ 0.225135,0.965893,0.127928,4.277169,2.652435,0.591369,
+ -0.860595,0.405543,0.308077,4.411541,2.663824,0.713132,
+ 0.225135,0.965893,0.127928,4.277169,2.652435,0.591369,
+ -0.671788,0.737297,0.07138,4.35668,2.682996,0.71905,
+ -0.162972,0.917259,-0.363422,4.47609,2.606654,0.692301,
+ -0.247355,0.948391,-0.198417,4.423033,2.561337,0.603562,
+ 0.223577,0.97296,-0.057987,4.359483,2.615839,0.596817,
+ -0.162972,0.917259,-0.363422,4.47609,2.606654,0.692301,
+ 0.223577,0.97296,-0.057987,4.359483,2.615839,0.596817,
+ -0.860595,0.405543,0.308077,4.411541,2.663824,0.713132,
+ -0.758791,0.646991,-0.075091,4.465268,2.695425,0.757267,
+ -0.860595,0.405543,0.308077,4.411541,2.663824,0.713132,
+ -0.671788,0.737297,0.07138,4.35668,2.682996,0.71905,
+ -0.758791,0.646991,-0.075091,4.465268,2.695425,0.757267,
+ -0.671788,0.737297,0.07138,4.35668,2.682996,0.71905,
+ -0.31499,0.894135,-0.318282,4.418954,2.707401,0.782531,
+ -0.758791,0.646991,-0.075091,4.465268,2.695425,0.757267,
+ -0.900694,0.426849,0.080936,4.520603,2.639162,0.745542,
+ -0.162972,0.917259,-0.363422,4.47609,2.606654,0.692301,
+ -0.758791,0.646991,-0.075091,4.465268,2.695425,0.757267,
+ -0.162972,0.917259,-0.363422,4.47609,2.606654,0.692301,
+ -0.860595,0.405543,0.308077,4.411541,2.663824,0.713132,
+ -0.816521,0.559553,-0.142109,4.546655,2.709095,0.80378,
+ -0.758791,0.646991,-0.075091,4.465268,2.695425,0.757267,
+ -0.31499,0.894135,-0.318282,4.418954,2.707401,0.782531,
+ -0.816521,0.559553,-0.142109,4.546655,2.709095,0.80378,
+ -0.31499,0.894135,-0.318282,4.418954,2.707401,0.782531,
+ -0.940256,0.335069,-0.060403,4.509555,2.719807,0.819972,
+ -0.816521,0.559553,-0.142109,4.546655,2.709095,0.80378,
+ -0.683788,0.700764,-0.203383,4.574545,2.669863,0.780363,
+ -0.900694,0.426849,0.080936,4.520603,2.639162,0.745542,
+ -0.816521,0.559553,-0.142109,4.546655,2.709095,0.80378,
+ -0.900694,0.426849,0.080936,4.520603,2.639162,0.745542,
+ -0.758791,0.646991,-0.075091,4.465268,2.695425,0.757267,
+ -0.476729,0.840923,-0.25608,4.44385,2.449921,0.495432,
+ -0.849668,0.488771,-0.197904,4.474318,2.418432,0.361347,
+ -0.501953,0.842502,0.195534,4.410844,2.500167,0.351972,
+ -0.476729,0.840923,-0.25608,4.44385,2.449921,0.495432,
+ -0.501953,0.842502,0.195534,4.410844,2.500167,0.351972,
+ 0.197027,0.937222,0.287741,4.407729,2.53164,0.486692,
+ -0.145585,0.915338,-0.375448,4.44076,2.490353,0.629287,
+ -0.476729,0.840923,-0.25608,4.44385,2.449921,0.495432,
+ 0.197027,0.937222,0.287741,4.407729,2.53164,0.486692,
+ -0.145585,0.915338,-0.375448,4.44076,2.490353,0.629287,
+ 0.197027,0.937222,0.287741,4.407729,2.53164,0.486692,
+ -0.247355,0.948391,-0.198417,4.423033,2.561337,0.603562,
+ -0.210882,0.942026,-0.260988,4.484667,2.534451,0.708888,
+ -0.145585,0.915338,-0.375448,4.44076,2.490353,0.629287,
+ -0.247355,0.948391,-0.198417,4.423033,2.561337,0.603562,
+ -0.210882,0.942026,-0.260988,4.484667,2.534451,0.708888,
+ -0.247355,0.948391,-0.198417,4.423033,2.561337,0.603562,
+ -0.162972,0.917259,-0.363422,4.47609,2.606654,0.692301,
+ -0.502348,0.838173,-0.212398,4.520165,2.557971,0.762427,
+ -0.210882,0.942026,-0.260988,4.484667,2.534451,0.708888,
+ -0.162972,0.917259,-0.363422,4.47609,2.606654,0.692301,
+ -0.502348,0.838173,-0.212398,4.520165,2.557971,0.762427,
+ -0.162972,0.917259,-0.363422,4.47609,2.606654,0.692301,
+ -0.900694,0.426849,0.080936,4.520603,2.639162,0.745542,
+ -0.768362,0.592231,-0.242657,4.59262,2.569879,0.790452,
+ -0.502348,0.838173,-0.212398,4.520165,2.557971,0.762427,
+ -0.900694,0.426849,0.080936,4.520603,2.639162,0.745542,
+ -0.768362,0.592231,-0.242657,4.59262,2.569879,0.790452,
+ -0.900694,0.426849,0.080936,4.520603,2.639162,0.745542,
+ -0.683788,0.700764,-0.203383,4.574545,2.669863,0.780363,
+ -0.981668,0.173926,-0.077954,4.674691,2.598833,0.808006,
+ -0.768362,0.592231,-0.242657,4.59262,2.569879,0.790452,
+ -0.683788,0.700764,-0.203383,4.574545,2.669863,0.780363,
+ -0.981668,0.173926,-0.077954,4.674691,2.598833,0.808006,
+ -0.683788,0.700764,-0.203383,4.574545,2.669863,0.780363,
+ -0.892748,0.392127,-0.221893,4.656565,2.680542,0.799684,
+ -0.892748,0.392127,-0.221893,4.656565,2.680542,0.799684,
+ -0.683788,0.700764,-0.203383,4.574545,2.669863,0.780363,
+ -0.816521,0.559553,-0.142109,4.546655,2.709095,0.80378,
+ -0.892748,0.392127,-0.221893,4.656565,2.680542,0.799684,
+ -0.816521,0.559553,-0.142109,4.546655,2.709095,0.80378,
+ -0.990661,0.056144,-0.124249,4.646703,2.728688,0.822295,
+ -0.990661,0.056144,-0.124249,4.646703,2.728688,0.822295,
+ -0.816521,0.559553,-0.142109,4.546655,2.709095,0.80378,
+ -0.940256,0.335069,-0.060403,4.509555,2.719807,0.819972,
+ -0.990661,0.056144,-0.124249,4.646703,2.728688,0.822295,
+ -0.940256,0.335069,-0.060403,4.509555,2.719807,0.819972,
+ -0.894795,0.444359,-0.043442,4.636909,2.750501,0.856859,
+ -0.984655,0.15519,0.07981,4.729447,2.606204,0.807513,
+ -0.981668,0.173926,-0.077954,4.674691,2.598833,0.808006,
+ -0.892748,0.392127,-0.221893,4.656565,2.680542,0.799684,
+ -0.984655,0.15519,0.07981,4.729447,2.606204,0.807513,
+ -0.892748,0.392127,-0.221893,4.656565,2.680542,0.799684,
+ -0.941564,0.056551,0.332054,4.748031,2.683805,0.800044,
+ -0.941564,0.056551,0.332054,4.748031,2.683805,0.800044,
+ -0.892748,0.392127,-0.221893,4.656565,2.680542,0.799684,
+ -0.990661,0.056144,-0.124249,4.646703,2.728688,0.822295,
+ -0.941564,0.056551,0.332054,4.748031,2.683805,0.800044,
+ -0.990661,0.056144,-0.124249,4.646703,2.728688,0.822295,
+ -0.978317,0.206989,-0.00716,4.728931,2.721892,0.832625,
+ -0.978317,0.206989,-0.00716,4.728931,2.721892,0.832625,
+ -0.990661,0.056144,-0.124249,4.646703,2.728688,0.822295,
+ -0.894795,0.444359,-0.043442,4.636909,2.750501,0.856859,
+ -0.978317,0.206989,-0.00716,4.728931,2.721892,0.832625,
+ -0.894795,0.444359,-0.043442,4.636909,2.750501,0.856859,
+ -0.463096,-0.149333,0.873637,4.719171,2.751091,0.865965,
+ -0.791764,-0.610494,-0.020171,4.821336,2.621498,0.789636,
+ -0.984655,0.15519,0.07981,4.729447,2.606204,0.807513,
+ -0.941564,0.056551,0.332054,4.748031,2.683805,0.800044,
+ -0.791764,-0.610494,-0.020171,4.821336,2.621498,0.789636,
+ -0.941564,0.056551,0.332054,4.748031,2.683805,0.800044,
+ -0.64155,-0.578509,0.503727,4.821325,2.691794,0.791887,
+ -0.64155,-0.578509,0.503727,4.821325,2.691794,0.791887,
+ -0.941564,0.056551,0.332054,4.748031,2.683805,0.800044,
+ -0.978317,0.206989,-0.00716,4.728931,2.721892,0.832625,
+ -0.64155,-0.578509,0.503727,4.821325,2.691794,0.791887,
+ -0.978317,0.206989,-0.00716,4.728931,2.721892,0.832625,
+ -0.832539,-0.5495,0.070196,4.811798,2.72868,0.815406,
+ -0.862876,-0.450622,0.228877,4.801436,2.750224,0.858918,
+ -0.832539,-0.5495,0.070196,4.811798,2.72868,0.815406,
+ -0.978317,0.206989,-0.00716,4.728931,2.721892,0.832625,
+ -0.862876,-0.450622,0.228877,4.801436,2.750224,0.858918,
+ -0.978317,0.206989,-0.00716,4.728931,2.721892,0.832625,
+ -0.463096,-0.149333,0.873637,4.719171,2.751091,0.865965,
+ -0.832539,-0.5495,0.070196,4.811798,2.72868,0.815406,
+ -0.862876,-0.450622,0.228877,4.801436,2.750224,0.858918,
+ -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
+ -0.64155,-0.578509,0.503727,4.821325,2.691794,0.791887,
+ -0.832539,-0.5495,0.070196,4.811798,2.72868,0.815406,
+ -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
+ -0.791764,-0.610494,-0.020171,4.821336,2.621498,0.789636,
+ -0.64155,-0.578509,0.503727,4.821325,2.691794,0.791887,
+ -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
+ 0.231006,-0.859096,0.456717,4.472349,2.325133,0.443764,
+ -0.849668,0.488771,-0.197904,4.474318,2.418432,0.361347,
+ -0.476729,0.840923,-0.25608,4.44385,2.449921,0.495432,
+ 0.231006,-0.859096,0.456717,4.472349,2.325133,0.443764,
+ -0.476729,0.840923,-0.25608,4.44385,2.449921,0.495432,
+ -0.975013,-0.179566,0.130791,4.442912,2.343263,0.53322,
+ -0.975013,-0.179566,0.130791,4.442912,2.343263,0.53322,
+ -0.476729,0.840923,-0.25608,4.44385,2.449921,0.495432,
+ -0.145585,0.915338,-0.375448,4.44076,2.490353,0.629287,
+ -0.975013,-0.179566,0.130791,4.442912,2.343263,0.53322,
+ -0.145585,0.915338,-0.375448,4.44076,2.490353,0.629287,
+ -0.963659,-0.230665,0.134738,4.440713,2.398472,0.629128,
+ -0.990956,-0.062739,0.118613,4.474625,2.465214,0.75189,
+ -0.963659,-0.230665,0.134738,4.440713,2.398472,0.629128,
+ -0.145585,0.915338,-0.375448,4.44076,2.490353,0.629287,
+ -0.990956,-0.062739,0.118613,4.474625,2.465214,0.75189,
+ -0.145585,0.915338,-0.375448,4.44076,2.490353,0.629287,
+ -0.210882,0.942026,-0.260988,4.484667,2.534451,0.708888,
+ -0.473779,-0.24744,0.845167,4.32063,2.385528,0.682583,
+ -0.938303,-0.3372,0.076703,4.314039,2.32946,0.57751,
+ -0.975013,-0.179566,0.130791,4.442912,2.343263,0.53322,
+ -0.473779,-0.24744,0.845167,4.32063,2.385528,0.682583,
+ -0.975013,-0.179566,0.130791,4.442912,2.343263,0.53322,
+ -0.963659,-0.230665,0.134738,4.440713,2.398472,0.629128,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ 0.231006,-0.859096,0.456717,4.472349,2.325133,0.443764,
+ -0.975013,-0.179566,0.130791,4.442912,2.343263,0.53322,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ -0.975013,-0.179566,0.130791,4.442912,2.343263,0.53322,
+ -0.938303,-0.3372,0.076703,4.314039,2.32946,0.57751,
+ -0.719395,-0.61545,0.322011,4.382053,2.433474,0.798757,
+ -0.473779,-0.24744,0.845167,4.32063,2.385528,0.682583,
+ -0.963659,-0.230665,0.134738,4.440713,2.398472,0.629128,
+ -0.719395,-0.61545,0.322011,4.382053,2.433474,0.798757,
+ -0.963659,-0.230665,0.134738,4.440713,2.398472,0.629128,
+ -0.990956,-0.062739,0.118613,4.474625,2.465214,0.75189,
+ -0.841909,-0.49598,0.212588,4.538177,2.513353,0.776566,
+ -0.990956,-0.062739,0.118613,4.474625,2.465214,0.75189,
+ -0.210882,0.942026,-0.260988,4.484667,2.534451,0.708888,
+ -0.841909,-0.49598,0.212588,4.538177,2.513353,0.776566,
+ -0.210882,0.942026,-0.260988,4.484667,2.534451,0.708888,
+ -0.502348,0.838173,-0.212398,4.520165,2.557971,0.762427,
+ 0.760119,-0.003927,0.649772,4.444739,2.475795,0.860515,
+ -0.719395,-0.61545,0.322011,4.382053,2.433474,0.798757,
+ -0.990956,-0.062739,0.118613,4.474625,2.465214,0.75189,
+ 0.760119,-0.003927,0.649772,4.444739,2.475795,0.860515,
+ -0.990956,-0.062739,0.118613,4.474625,2.465214,0.75189,
+ -0.841909,-0.49598,0.212588,4.538177,2.513353,0.776566,
+ 0.911709,-0.064353,0.405764,4.601515,2.533324,0.794193,
+ -0.841909,-0.49598,0.212588,4.538177,2.513353,0.776566,
+ -0.502348,0.838173,-0.212398,4.520165,2.557971,0.762427,
+ 0.911709,-0.064353,0.405764,4.601515,2.533324,0.794193,
+ -0.502348,0.838173,-0.212398,4.520165,2.557971,0.762427,
+ -0.768362,0.592231,-0.242657,4.59262,2.569879,0.790452,
+ 0.3335,0.232683,0.913584,4.554459,2.511417,0.850571,
+ 0.760119,-0.003927,0.649772,4.444739,2.475795,0.860515,
+ -0.841909,-0.49598,0.212588,4.538177,2.513353,0.776566,
+ 0.3335,0.232683,0.913584,4.554459,2.511417,0.850571,
+ -0.841909,-0.49598,0.212588,4.538177,2.513353,0.776566,
+ 0.911709,-0.064353,0.405764,4.601515,2.533324,0.794193,
+ 0.245858,0.150988,0.957474,4.683344,2.554221,0.821927,
+ 0.911709,-0.064353,0.405764,4.601515,2.533324,0.794193,
+ -0.768362,0.592231,-0.242657,4.59262,2.569879,0.790452,
+ 0.245858,0.150988,0.957474,4.683344,2.554221,0.821927,
+ -0.768362,0.592231,-0.242657,4.59262,2.569879,0.790452,
+ -0.981668,0.173926,-0.077954,4.674691,2.598833,0.808006,
+ 0.895851,0.326389,0.301532,4.681847,2.551036,0.886235,
+ 0.3335,0.232683,0.913584,4.554459,2.511417,0.850571,
+ 0.911709,-0.064353,0.405764,4.601515,2.533324,0.794193,
+ 0.895851,0.326389,0.301532,4.681847,2.551036,0.886235,
+ 0.911709,-0.064353,0.405764,4.601515,2.533324,0.794193,
+ 0.245858,0.150988,0.957474,4.683344,2.554221,0.821927,
+ -0.279333,0.256918,0.925184,4.755192,2.568818,0.876311,
+ 0.895851,0.326389,0.301532,4.681847,2.551036,0.886235,
+ 0.245858,0.150988,0.957474,4.683344,2.554221,0.821927,
+ -0.279333,0.256918,0.925184,4.755192,2.568818,0.876311,
+ 0.245858,0.150988,0.957474,4.683344,2.554221,0.821927,
+ -0.396467,0.225967,0.889805,4.737893,2.564648,0.830389,
+ -0.274209,-0.939323,-0.20611,4.856249,2.593812,0.867067,
+ -0.279333,0.256918,0.925184,4.755192,2.568818,0.876311,
+ -0.396467,0.225967,0.889805,4.737893,2.564648,0.830389,
+ -0.274209,-0.939323,-0.20611,4.856249,2.593812,0.867067,
+ -0.396467,0.225967,0.889805,4.737893,2.564648,0.830389,
+ -0.274209,-0.939323,-0.20611,4.829566,2.580797,0.821827,
+ -0.396467,0.225967,0.889805,4.737893,2.564648,0.830389,
+ 0.245858,0.150988,0.957474,4.683344,2.554221,0.821927,
+ -0.981668,0.173926,-0.077954,4.674691,2.598833,0.808006,
+ -0.396467,0.225967,0.889805,4.737893,2.564648,0.830389,
+ -0.981668,0.173926,-0.077954,4.674691,2.598833,0.808006,
+ -0.984655,0.15519,0.07981,4.729447,2.606204,0.807513,
+ -0.274209,-0.939323,-0.20611,4.829566,2.580797,0.821827,
+ -0.396467,0.225967,0.889805,4.737893,2.564648,0.830389,
+ -0.984655,0.15519,0.07981,4.729447,2.606204,0.807513,
+ -0.274209,-0.939323,-0.20611,4.829566,2.580797,0.821827,
+ -0.984655,0.15519,0.07981,4.729447,2.606204,0.807513,
+ -0.791764,-0.610494,-0.020171,4.821336,2.621498,0.789636,
+ -0.21443,-0.974064,0.072245,4.497719,2.54748,0.937659,
+ 0.3335,0.232683,0.913584,4.554459,2.511417,0.850571,
+ 0.895851,0.326389,0.301532,4.681847,2.551036,0.886235,
+ -0.21443,-0.974064,0.072245,4.497719,2.54748,0.937659,
+ 0.895851,0.326389,0.301532,4.681847,2.551036,0.886235,
+ -0.21443,-0.974064,0.072245,4.662221,2.556346,0.940618,
+ -0.279333,0.256918,0.925184,4.755192,2.568818,0.876311,
+ -0.137011,-0.928676,0.344657,4.763337,2.590834,0.929248,
+ -0.21443,-0.974064,0.072245,4.662221,2.556346,0.940618,
+ -0.279333,0.256918,0.925184,4.755192,2.568818,0.876311,
+ -0.21443,-0.974064,0.072245,4.662221,2.556346,0.940618,
+ 0.895851,0.326389,0.301532,4.681847,2.551036,0.886235,
+ -0.137011,-0.928676,0.344657,4.763337,2.590834,0.929248,
+ -0.279333,0.256918,0.925184,4.755192,2.568818,0.876311,
+ -0.274209,-0.939323,-0.20611,4.856249,2.593812,0.867067,
+ -0.137011,-0.928676,0.344657,4.763337,2.590834,0.929248,
+ -0.274209,-0.939323,-0.20611,4.856249,2.593812,0.867067,
+ -0.137011,-0.928676,0.344657,4.883022,2.613658,0.893163,
+ -0.21443,-0.974064,0.072245,4.497719,2.54748,0.937659,
+ -0.250481,-0.945625,-0.207493,4.352603,2.524888,0.890532,
+ 0.760119,-0.003927,0.649772,4.444739,2.475795,0.860515,
+ -0.21443,-0.974064,0.072245,4.497719,2.54748,0.937659,
+ 0.760119,-0.003927,0.649772,4.444739,2.475795,0.860515,
+ 0.3335,0.232683,0.913584,4.554459,2.511417,0.850571,
+ -0.250481,-0.945625,-0.207493,4.262798,2.490674,0.818316,
+ -0.719395,-0.61545,0.322011,4.382053,2.433474,0.798757,
+ 0.760119,-0.003927,0.649772,4.444739,2.475795,0.860515,
+ -0.250481,-0.945625,-0.207493,4.262798,2.490674,0.818316,
+ 0.760119,-0.003927,0.649772,4.444739,2.475795,0.860515,
+ -0.250481,-0.945625,-0.207493,4.352603,2.524888,0.890532,
+ -0.19553,-0.978064,0.071821,4.192789,2.411967,0.668016,
+ -0.473779,-0.24744,0.845167,4.32063,2.385528,0.682583,
+ -0.719395,-0.61545,0.322011,4.382053,2.433474,0.798757,
+ -0.19553,-0.978064,0.071821,4.192789,2.411967,0.668016,
+ -0.719395,-0.61545,0.322011,4.382053,2.433474,0.798757,
+ -0.250481,-0.945625,-0.207493,4.262798,2.490674,0.818316,
+ -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
+ -0.938303,-0.3372,0.076703,4.314039,2.32946,0.57751,
+ -0.473779,-0.24744,0.845167,4.32063,2.385528,0.682583,
+ -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
+ -0.473779,-0.24744,0.845167,4.32063,2.385528,0.682583,
+ -0.19553,-0.978064,0.071821,4.192789,2.411967,0.668016,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ -0.938303,-0.3372,0.076703,4.314039,2.32946,0.57751,
+ -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
+ -0.713872,-0.610821,0.342469,4.296769,2.260422,0.528796,
+ -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
+ -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
+ -0.274209,-0.939323,-0.20611,4.856249,2.593812,0.867067,
+ -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
+ -0.137011,-0.928676,0.344657,4.883022,2.613658,0.893163,
+ -0.137011,-0.928676,0.344657,4.883022,2.613658,0.893163,
+ 0.186393,-0.974436,-0.125429,4.854957,2.660227,0.92431,
+ -0.124529,-0.930217,0.345238,4.735139,2.645464,0.95089,
+ -0.137011,-0.928676,0.344657,4.883022,2.613658,0.893163,
+ -0.124529,-0.930217,0.345238,4.735139,2.645464,0.95089,
+ -0.137011,-0.928676,0.344657,4.763337,2.590834,0.929248,
+ -0.137011,-0.928676,0.344657,4.763337,2.590834,0.929248,
+ -0.124529,-0.930217,0.345238,4.735139,2.645464,0.95089,
+ 0.361848,-0.921221,-0.142892,4.615662,2.63387,0.977986,
+ -0.137011,-0.928676,0.344657,4.763337,2.590834,0.929248,
+ 0.361848,-0.921221,-0.142892,4.615662,2.63387,0.977986,
+ -0.21443,-0.974064,0.072245,4.662221,2.556346,0.940618,
+ -0.21443,-0.974064,0.072245,4.662221,2.556346,0.940618,
+ 0.361848,-0.921221,-0.142892,4.615662,2.63387,0.977986,
+ -0.199236,-0.974239,-0.105658,4.460582,2.622875,0.957002,
+ -0.21443,-0.974064,0.072245,4.662221,2.556346,0.940618,
+ -0.199236,-0.974239,-0.105658,4.460582,2.622875,0.957002,
+ -0.21443,-0.974064,0.072245,4.497719,2.54748,0.937659,
+ -0.21443,-0.974064,0.072245,4.497719,2.54748,0.937659,
+ -0.199236,-0.974239,-0.105658,4.460582,2.622875,0.957002,
+ -0.942162,-0.29295,-0.162822,4.343217,2.589542,0.893106,
+ -0.21443,-0.974064,0.072245,4.497719,2.54748,0.937659,
+ -0.942162,-0.29295,-0.162822,4.343217,2.589542,0.893106,
+ -0.250481,-0.945625,-0.207493,4.352603,2.524888,0.890532,
+ -0.250481,-0.945625,-0.207493,4.352603,2.524888,0.890532,
+ -0.942162,-0.29295,-0.162822,4.343217,2.589542,0.893106,
+ -0.982438,-0.108835,-0.151559,4.244622,2.554467,0.811726,
+ -0.250481,-0.945625,-0.207493,4.352603,2.524888,0.890532,
+ -0.982438,-0.108835,-0.151559,4.244622,2.554467,0.811726,
+ -0.250481,-0.945625,-0.207493,4.262798,2.490674,0.818316,
+ -0.250481,-0.945625,-0.207493,4.262798,2.490674,0.818316,
+ -0.982438,-0.108835,-0.151559,4.244622,2.554467,0.811726,
+ -0.668254,-0.729938,-0.143622,4.138687,2.474013,0.642311,
+ -0.250481,-0.945625,-0.207493,4.262798,2.490674,0.818316,
+ -0.668254,-0.729938,-0.143622,4.138687,2.474013,0.642311,
+ -0.19553,-0.978064,0.071821,4.192789,2.411967,0.668016,
+ -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
+ 0.186393,-0.974436,-0.125429,4.854957,2.660227,0.92431,
+ -0.137011,-0.928676,0.344657,4.883022,2.613658,0.893163,
+ -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
+ -0.19553,-0.978064,0.071821,4.192789,2.411967,0.668016,
+ -0.668254,-0.729938,-0.143622,4.138687,2.474013,0.642311,
+ -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
+ -0.668254,-0.729938,-0.143622,4.138687,2.474013,0.642311,
+ -0.973393,-0.128296,0.18986,4.121994,2.458034,0.570029,
+ -0.138401,-0.989733,0.035683,4.07851,2.41181,0.472193,
+ -0.124529,-0.930217,0.345238,4.113935,2.334131,0.526471,
+ -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
+ -0.138401,-0.989733,0.035683,4.07851,2.41181,0.472193,
+ -0.19553,-0.978064,0.071821,4.193959,2.370476,0.616705,
+ -0.973393,-0.128296,0.18986,4.121994,2.458034,0.570029,
+ -0.942162,-0.29295,-0.162822,4.343217,2.589542,0.893106,
+ -0.927379,-0.346541,0.14099,4.342998,2.664049,0.904347,
+ -0.601432,-0.796051,0.067694,4.235494,2.636171,0.803613,
+ -0.942162,-0.29295,-0.162822,4.343217,2.589542,0.893106,
+ -0.601432,-0.796051,0.067694,4.235494,2.636171,0.803613,
+ -0.982438,-0.108835,-0.151559,4.244622,2.554467,0.811726,
+ -0.199236,-0.974239,-0.105658,4.460582,2.622875,0.957002,
+ -0.850433,-0.132742,0.509061,4.460786,2.695616,0.949972,
+ -0.927379,-0.346541,0.14099,4.342998,2.664049,0.904347,
+ -0.199236,-0.974239,-0.105658,4.460582,2.622875,0.957002,
+ -0.927379,-0.346541,0.14099,4.342998,2.664049,0.904347,
+ -0.942162,-0.29295,-0.162822,4.343217,2.589542,0.893106,
+ 0.361848,-0.921221,-0.142892,4.615662,2.63387,0.977986,
+ -0.822149,-0.367113,0.435086,4.6248,2.708372,0.989445,
+ -0.850433,-0.132742,0.509061,4.460786,2.695616,0.949972,
+ 0.361848,-0.921221,-0.142892,4.615662,2.63387,0.977986,
+ -0.850433,-0.132742,0.509061,4.460786,2.695616,0.949972,
+ -0.199236,-0.974239,-0.105658,4.460582,2.622875,0.957002,
+ -0.982438,-0.108835,-0.151559,4.244622,2.554467,0.811726,
+ -0.601432,-0.796051,0.067694,4.235494,2.636171,0.803613,
+ -0.501842,-0.819591,0.27645,4.138494,2.557838,0.652651,
+ -0.982438,-0.108835,-0.151559,4.244622,2.554467,0.811726,
+ -0.501842,-0.819591,0.27645,4.138494,2.557838,0.652651,
+ -0.668254,-0.729938,-0.143622,4.138687,2.474013,0.642311,
+ -0.973393,-0.128296,0.18986,4.121994,2.458034,0.570029,
+ -0.668254,-0.729938,-0.143622,4.138687,2.474013,0.642311,
+ -0.501842,-0.819591,0.27645,4.138494,2.557838,0.652651,
+ -0.973393,-0.128296,0.18986,4.121994,2.458034,0.570029,
+ -0.501842,-0.819591,0.27645,4.138494,2.557838,0.652651,
+ -0.075112,-0.981815,0.174346,4.104292,2.537976,0.543437,
+ -0.138401,-0.989733,0.035683,4.07851,2.41181,0.472193,
+ -0.973393,-0.128296,0.18986,4.121994,2.458034,0.570029,
+ -0.075112,-0.981815,0.174346,4.104292,2.537976,0.543437,
+ -0.138401,-0.989733,0.035683,4.07851,2.41181,0.472193,
+ -0.075112,-0.981815,0.174346,4.104292,2.537976,0.543437,
+ 0.207048,-0.965263,0.159371,4.088356,2.510913,0.453793,
+ 0.361848,-0.921221,-0.142892,4.615662,2.63387,0.977986,
+ -0.124529,-0.930217,0.345238,4.735139,2.645464,0.95089,
+ 0.846486,-0.14409,-0.512541,4.753015,2.699695,0.973279,
+ 0.361848,-0.921221,-0.142892,4.615662,2.63387,0.977986,
+ 0.846486,-0.14409,-0.512541,4.753015,2.699695,0.973279,
+ -0.822149,-0.367113,0.435086,4.6248,2.708372,0.989445,
+ 0.186393,-0.974436,-0.125429,4.854957,2.660227,0.92431,
+ 0.728229,-0.106722,-0.676973,4.863709,2.722151,0.93666,
+ 0.846486,-0.14409,-0.512541,4.753015,2.699695,0.973279,
+ 0.186393,-0.974436,-0.125429,4.854957,2.660227,0.92431,
+ 0.846486,-0.14409,-0.512541,4.753015,2.699695,0.973279,
+ -0.124529,-0.930217,0.345238,4.735139,2.645464,0.95089,
+ -0.904972,-0.026555,0.424641,4.209941,2.600612,0.337597,
+ 0.576293,-0.081905,-0.813128,4.117367,2.568514,0.3845,
+ 0.42646,-0.865041,0.264264,4.151183,2.579059,0.494606,
+ -0.904972,-0.026555,0.424641,4.209941,2.600612,0.337597,
+ 0.42646,-0.865041,0.264264,4.151183,2.579059,0.494606,
+ -0.778386,0.466325,0.420305,4.22473,2.624525,0.491916,
+ -0.940256,0.335069,-0.060403,4.509555,2.719807,0.819972,
+ -0.266521,-0.953514,0.14063,4.462368,2.725999,0.882675,
+ 0.078387,-0.886884,0.455294,4.616626,2.749486,0.939333,
+ -0.940256,0.335069,-0.060403,4.509555,2.719807,0.819972,
+ 0.078387,-0.886884,0.455294,4.616626,2.749486,0.939333,
+ -0.894795,0.444359,-0.043442,4.636909,2.750501,0.856859,
+ -0.31499,0.894135,-0.318282,4.418954,2.707401,0.782531,
+ -0.393317,-0.870591,-0.295589,4.354196,2.711836,0.826545,
+ -0.266521,-0.953514,0.14063,4.462368,2.725999,0.882675,
+ -0.31499,0.894135,-0.318282,4.418954,2.707401,0.782531,
+ -0.266521,-0.953514,0.14063,4.462368,2.725999,0.882675,
+ -0.940256,0.335069,-0.060403,4.509555,2.719807,0.819972,
+ -0.671788,0.737297,0.07138,4.35668,2.682996,0.71905,
+ -0.180888,-0.792822,-0.58199,4.273414,2.686575,0.753674,
+ -0.393317,-0.870591,-0.295589,4.354196,2.711836,0.826545,
+ -0.671788,0.737297,0.07138,4.35668,2.682996,0.71905,
+ -0.393317,-0.870591,-0.295589,4.354196,2.711836,0.826545,
+ -0.31499,0.894135,-0.318282,4.418954,2.707401,0.782531,
+ 0.333262,-0.530645,-0.779328,4.176065,2.636883,0.618384,
+ 0.225135,0.965893,0.127928,4.277169,2.652435,0.591369,
+ -0.778386,0.466325,0.420305,4.22473,2.624525,0.491916,
+ 0.333262,-0.530645,-0.779328,4.176065,2.636883,0.618384,
+ -0.778386,0.466325,0.420305,4.22473,2.624525,0.491916,
+ 0.42646,-0.865041,0.264264,4.151183,2.579059,0.494606,
+ -0.075112,-0.981815,0.174346,4.104292,2.537976,0.543437,
+ 0.42646,-0.865041,0.264264,4.151183,2.579059,0.494606,
+ 0.576293,-0.081905,-0.813128,4.117367,2.568514,0.3845,
+ -0.075112,-0.981815,0.174346,4.104292,2.537976,0.543437,
+ 0.576293,-0.081905,-0.813128,4.117367,2.568514,0.3845,
+ 0.207048,-0.965263,0.159371,4.088356,2.510913,0.453793,
+ -0.180888,-0.792822,-0.58199,4.273414,2.686575,0.753674,
+ -0.671788,0.737297,0.07138,4.35668,2.682996,0.71905,
+ 0.225135,0.965893,0.127928,4.277169,2.652435,0.591369,
+ -0.180888,-0.792822,-0.58199,4.273414,2.686575,0.753674,
+ 0.225135,0.965893,0.127928,4.277169,2.652435,0.591369,
+ 0.333262,-0.530645,-0.779328,4.176065,2.636883,0.618384,
+ -0.501842,-0.819591,0.27645,4.138494,2.557838,0.652651,
+ 0.333262,-0.530645,-0.779328,4.176065,2.636883,0.618384,
+ 0.42646,-0.865041,0.264264,4.151183,2.579059,0.494606,
+ -0.501842,-0.819591,0.27645,4.138494,2.557838,0.652651,
+ 0.42646,-0.865041,0.264264,4.151183,2.579059,0.494606,
+ -0.075112,-0.981815,0.174346,4.104292,2.537976,0.543437,
+ -0.601432,-0.796051,0.067694,4.235494,2.636171,0.803613,
+ -0.180888,-0.792822,-0.58199,4.273414,2.686575,0.753674,
+ 0.333262,-0.530645,-0.779328,4.176065,2.636883,0.618384,
+ -0.601432,-0.796051,0.067694,4.235494,2.636171,0.803613,
+ 0.333262,-0.530645,-0.779328,4.176065,2.636883,0.618384,
+ -0.501842,-0.819591,0.27645,4.138494,2.557838,0.652651,
+ -0.927379,-0.346541,0.14099,4.342998,2.664049,0.904347,
+ -0.393317,-0.870591,-0.295589,4.354196,2.711836,0.826545,
+ -0.180888,-0.792822,-0.58199,4.273414,2.686575,0.753674,
+ -0.927379,-0.346541,0.14099,4.342998,2.664049,0.904347,
+ -0.180888,-0.792822,-0.58199,4.273414,2.686575,0.753674,
+ -0.601432,-0.796051,0.067694,4.235494,2.636171,0.803613,
+ -0.850433,-0.132742,0.509061,4.460786,2.695616,0.949972,
+ -0.266521,-0.953514,0.14063,4.462368,2.725999,0.882675,
+ -0.393317,-0.870591,-0.295589,4.354196,2.711836,0.826545,
+ -0.850433,-0.132742,0.509061,4.460786,2.695616,0.949972,
+ -0.393317,-0.870591,-0.295589,4.354196,2.711836,0.826545,
+ -0.927379,-0.346541,0.14099,4.342998,2.664049,0.904347,
+ 0.078387,-0.886884,0.455294,4.616626,2.749486,0.939333,
+ 0.136995,-0.968757,-0.206741,4.735445,2.749285,0.940329,
+ -0.463096,-0.149333,0.873637,4.719171,2.751091,0.865965,
+ 0.078387,-0.886884,0.455294,4.616626,2.749486,0.939333,
+ -0.463096,-0.149333,0.873637,4.719171,2.751091,0.865965,
+ -0.894795,0.444359,-0.043442,4.636909,2.750501,0.856859,
+ -0.463096,-0.149333,0.873637,4.719171,2.751091,0.865965,
+ 0.136995,-0.968757,-0.206741,4.735445,2.749285,0.940329,
+ -0.460229,-0.015586,-0.887663,4.827733,2.75439,0.905049,
+ -0.463096,-0.149333,0.873637,4.719171,2.751091,0.865965,
+ -0.460229,-0.015586,-0.887663,4.827733,2.75439,0.905049,
+ -0.862876,-0.450622,0.228877,4.801436,2.750224,0.858918,
+ -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
+ -0.862876,-0.450622,0.228877,4.801436,2.750224,0.858918,
+ -0.460229,-0.015586,-0.887663,4.827733,2.75439,0.905049,
+ -0.850433,-0.132742,0.509061,4.460786,2.695616,0.949972,
+ -0.822149,-0.367113,0.435086,4.6248,2.708372,0.989445,
+ 0.078387,-0.886884,0.455294,4.616626,2.749486,0.939333,
+ -0.850433,-0.132742,0.509061,4.460786,2.695616,0.949972,
+ 0.078387,-0.886884,0.455294,4.616626,2.749486,0.939333,
+ -0.266521,-0.953514,0.14063,4.462368,2.725999,0.882675,
+ -0.822149,-0.367113,0.435086,4.6248,2.708372,0.989445,
+ 0.846486,-0.14409,-0.512541,4.753015,2.699695,0.973279,
+ 0.136995,-0.968757,-0.206741,4.735445,2.749285,0.940329,
+ -0.822149,-0.367113,0.435086,4.6248,2.708372,0.989445,
+ 0.136995,-0.968757,-0.206741,4.735445,2.749285,0.940329,
+ 0.078387,-0.886884,0.455294,4.616626,2.749486,0.939333,
+ -0.460229,-0.015586,-0.887663,4.827733,2.75439,0.905049,
+ 0.136995,-0.968757,-0.206741,4.735445,2.749285,0.940329,
+ 0.846486,-0.14409,-0.512541,4.753015,2.699695,0.973279,
+ -0.460229,-0.015586,-0.887663,4.827733,2.75439,0.905049,
+ 0.846486,-0.14409,-0.512541,4.753015,2.699695,0.973279,
+ 0.728229,-0.106722,-0.676973,4.863709,2.722151,0.93666,
+ -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
+ -0.460229,-0.015586,-0.887663,4.827733,2.75439,0.905049,
+ 0.728229,-0.106722,-0.676973,4.863709,2.722151,0.93666,
+ -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
+ 0.728229,-0.106722,-0.676973,4.863709,2.722151,0.93666,
+ 0.186393,-0.974436,-0.125429,4.854957,2.660227,0.92431,
+ -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
+ -0.274209,-0.939323,-0.20611,4.829566,2.580797,0.821827,
+ -0.791764,-0.610494,-0.020171,4.821336,2.621498,0.789636,
+ -0.916647,-0.2944,0.270344,5.096148,2.75972,0.774729,
+ -0.274209,-0.939323,-0.20611,4.856249,2.593812,0.867067,
+ -0.274209,-0.939323,-0.20611,4.829566,2.580797,0.821827
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,1020,data,NULL};
+const struct gllist *cow_horns=&frame;
diff --git a/hacks/glx/cow_tail.c b/hacks/glx/cow_tail.c
new file mode 100644
index 0000000..895f05c
--- /dev/null
+++ b/hacks/glx/cow_tail.c
@@ -0,0 +1,464 @@
+#include "gllist.h"
+static const float data[]={
+ -0.54555,-0.056478,0.836173,-3.67645,-0.551317,0.077574,
+ 0.00197,-0.021649,0.999764,-3.740631,-0.558176,0.085478,
+ 0.000763,-0.01871,0.999825,-3.72947,-0.869371,0.096946,
+ -0.54555,-0.056478,0.836173,-3.67645,-0.551317,0.077574,
+ 0.000763,-0.01871,0.999825,-3.72947,-0.869371,0.096946,
+ -0.548359,-0.017804,0.836053,-3.699784,-0.759901,0.088664,
+ -0.548359,-0.017804,0.836053,-3.699784,-0.759901,0.088664,
+ 0.000763,-0.01871,0.999825,-3.72947,-0.869371,0.096946,
+ -0.530021,0.13773,0.836724,-3.697889,-0.951955,0.098793,
+ -0.530021,0.13773,0.836724,-3.697889,-0.951955,0.098793,
+ 0.000763,-0.01871,0.999825,-3.72947,-0.869371,0.096946,
+ -0.004656,-0.025693,0.999659,-3.733767,-1.141917,0.111139,
+ -0.530021,0.13773,0.836724,-3.697889,-0.951955,0.098793,
+ -0.004656,-0.025693,0.999659,-3.733767,-1.141917,0.111139,
+ -0.429713,0.351913,0.831567,-3.666536,-1.140372,0.078261,
+ -0.429713,0.351913,0.831567,-3.666536,-1.140372,0.078261,
+ -0.004656,-0.025693,0.999659,-3.733767,-1.141917,0.111139,
+ -0.020872,-0.032587,0.999251,-3.743747,-1.367219,0.100951,
+ -0.429713,0.351913,0.831567,-3.666536,-1.140372,0.078261,
+ -0.020872,-0.032587,0.999251,-3.743747,-1.367219,0.100951,
+ -0.24021,0.502412,0.830591,-3.639696,-1.242349,0.05719,
+ -0.24021,0.502412,0.830591,-3.639696,-1.242349,0.05719,
+ -0.020872,-0.032587,0.999251,-3.743747,-1.367219,0.100951,
+ -0.091034,0.391629,0.915609,-3.823638,-1.557534,0.081533,
+ -0.24021,0.502412,0.830591,-3.639696,-1.242349,0.05719,
+ -0.091034,0.391629,0.915609,-3.823638,-1.557534,0.081533,
+ 0.000909,0.669011,0.743252,-3.581963,-1.413947,-0.104371,
+ 0.000909,0.669011,0.743252,-3.581963,-1.413947,-0.104371,
+ -0.091034,0.391629,0.915609,-3.823638,-1.557534,0.081533,
+ -0.041225,-0.030655,0.99868,-3.683069,-1.591975,-0.115233,
+ -0.041225,-0.030655,0.99868,-3.683069,-1.591975,-0.115233,
+ -0.091034,0.391629,0.915609,-3.823638,-1.557534,0.081533,
+ 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
+ -0.041225,-0.030655,0.99868,-3.683069,-1.591975,-0.115233,
+ 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
+ 0.002322,-0.058071,0.99831,-3.828485,-1.786559,-0.114095,
+ 0.00197,-0.021649,0.999764,-3.740631,-0.558176,0.085478,
+ 0.518386,-0.029316,0.854644,-3.778908,-0.541975,0.064258,
+ 0.000763,-0.01871,0.999825,-3.72947,-0.869371,0.096946,
+ 0.518386,-0.029316,0.854644,-3.778908,-0.541975,0.064258,
+ 0.548941,0.015145,0.835724,-3.805841,-0.798961,0.099237,
+ 0.000763,-0.01871,0.999825,-3.72947,-0.869371,0.096946,
+ 0.000763,-0.01871,0.999825,-3.72947,-0.869371,0.096946,
+ 0.548941,0.015145,0.835724,-3.805841,-0.798961,0.099237,
+ -0.004656,-0.025693,0.999659,-3.733767,-1.141917,0.111139,
+ 0.548941,0.015145,0.835724,-3.805841,-0.798961,0.099237,
+ 0.549332,-0.018885,0.835391,-3.843256,-0.981402,0.116282,
+ -0.004656,-0.025693,0.999659,-3.733767,-1.141917,0.111139,
+ 0.549332,-0.018885,0.835391,-3.843256,-0.981402,0.116282,
+ 0.516335,-0.196022,0.833651,-3.884588,-1.261469,0.148322,
+ -0.004656,-0.025693,0.999659,-3.733767,-1.141917,0.111139,
+ -0.004656,-0.025693,0.999659,-3.733767,-1.141917,0.111139,
+ 0.516335,-0.196022,0.833651,-3.884588,-1.261469,0.148322,
+ -0.020872,-0.032587,0.999251,-3.743747,-1.367219,0.100951,
+ 0.516335,-0.196022,0.833651,-3.884588,-1.261469,0.148322,
+ 0.368421,-0.433142,0.82259,-3.914006,-1.486854,0.149147,
+ -0.020872,-0.032587,0.999251,-3.743747,-1.367219,0.100951,
+ -0.020872,-0.032587,0.999251,-3.743747,-1.367219,0.100951,
+ 0.368421,-0.433142,0.82259,-3.914006,-1.486854,0.149147,
+ -0.091034,0.391629,0.915609,-3.823638,-1.557534,0.081533,
+ 0.368421,-0.433142,0.82259,-3.914006,-1.486854,0.149147,
+ 0.255239,-0.528232,0.80983,-4.015306,-1.659952,0.130331,
+ -0.091034,0.391629,0.915609,-3.823638,-1.557534,0.081533,
+ -0.091034,0.391629,0.915609,-3.823638,-1.557534,0.081533,
+ 0.255239,-0.528232,0.80983,-4.015306,-1.659952,0.130331,
+ 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
+ 0.255239,-0.528232,0.80983,-4.015306,-1.659952,0.130331,
+ 0.791625,0.052579,0.608741,-4.107191,-1.83652,0.120149,
+ 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
+ 0.518386,-0.029316,0.854644,-3.778908,-0.541975,0.064258,
+ 0.875325,0.013439,0.483348,-3.818598,-0.52269,0.055572,
+ 0.891295,0.039311,0.451717,-3.900964,-0.780883,0.091579,
+ 0.518386,-0.029316,0.854644,-3.778908,-0.541975,0.064258,
+ 0.891295,0.039311,0.451717,-3.900964,-0.780883,0.091579,
+ 0.548941,0.015145,0.835724,-3.805841,-0.798961,0.099237,
+ 0.548941,0.015145,0.835724,-3.805841,-0.798961,0.099237,
+ 0.891295,0.039311,0.451717,-3.900964,-0.780883,0.091579,
+ 0.892259,-0.018571,0.451141,-3.949814,-0.963797,0.140806,
+ 0.548941,0.015145,0.835724,-3.805841,-0.798961,0.099237,
+ 0.892259,-0.018571,0.451141,-3.949814,-0.963797,0.140806,
+ 0.549332,-0.018885,0.835391,-3.843256,-0.981402,0.116282,
+ 0.549332,-0.018885,0.835391,-3.843256,-0.981402,0.116282,
+ 0.892259,-0.018571,0.451141,-3.949814,-0.963797,0.140806,
+ 0.843461,-0.305355,0.441963,-3.974499,-1.1696,0.164243,
+ 0.549332,-0.018885,0.835391,-3.843256,-0.981402,0.116282,
+ 0.843461,-0.305355,0.441963,-3.974499,-1.1696,0.164243,
+ 0.516335,-0.196022,0.833651,-3.884588,-1.261469,0.148322,
+ 0.516335,-0.196022,0.833651,-3.884588,-1.261469,0.148322,
+ 0.843461,-0.305355,0.441963,-3.974499,-1.1696,0.164243,
+ 0.589229,-0.690587,0.419402,-4.018866,-1.413191,0.154149,
+ 0.516335,-0.196022,0.833651,-3.884588,-1.261469,0.148322,
+ 0.589229,-0.690587,0.419402,-4.018866,-1.413191,0.154149,
+ 0.368421,-0.433142,0.82259,-3.914006,-1.486854,0.149147,
+ 0.368421,-0.433142,0.82259,-3.914006,-1.486854,0.149147,
+ 0.589229,-0.690587,0.419402,-4.018866,-1.413191,0.154149,
+ 0.389217,-0.829193,0.401185,-4.154334,-1.677827,0.165852,
+ 0.368421,-0.433142,0.82259,-3.914006,-1.486854,0.149147,
+ 0.389217,-0.829193,0.401185,-4.154334,-1.677827,0.165852,
+ 0.255239,-0.528232,0.80983,-4.015306,-1.659952,0.130331,
+ 0.255239,-0.528232,0.80983,-4.015306,-1.659952,0.130331,
+ 0.389217,-0.829193,0.401185,-4.154334,-1.677827,0.165852,
+ 0.981696,0.042552,-0.185638,-4.207566,-1.922824,0.155104,
+ 0.255239,-0.528232,0.80983,-4.015306,-1.659952,0.130331,
+ 0.981696,0.042552,-0.185638,-4.207566,-1.922824,0.155104,
+ 0.791625,0.052579,0.608741,-4.107191,-1.83652,0.120149,
+ 0.875325,0.013439,0.483348,-3.818598,-0.52269,0.055572,
+ 0.999006,0.044565,0.000415,-3.896204,-0.629183,0.077883,
+ 0.839295,0.00969,-0.54359,-3.978115,-0.82344,0.09928,
+ 0.875325,0.013439,0.483348,-3.818598,-0.52269,0.055572,
+ 0.839295,0.00969,-0.54359,-3.978115,-0.82344,0.09928,
+ 0.891295,0.039311,0.451717,-3.900964,-0.780883,0.091579,
+ 0.891295,0.039311,0.451717,-3.900964,-0.780883,0.091579,
+ 0.839295,0.00969,-0.54359,-3.978115,-0.82344,0.09928,
+ 0.874434,0.048946,-0.48267,-4.029726,-1.043238,0.136305,
+ 0.891295,0.039311,0.451717,-3.900964,-0.780883,0.091579,
+ 0.874434,0.048946,-0.48267,-4.029726,-1.043238,0.136305,
+ 0.892259,-0.018571,0.451141,-3.949814,-0.963797,0.140806,
+ 0.892259,-0.018571,0.451141,-3.949814,-0.963797,0.140806,
+ 0.874434,0.048946,-0.48267,-4.029726,-1.043238,0.136305,
+ 0.843461,-0.305355,0.441963,-3.974499,-1.1696,0.164243,
+ 0.843461,-0.305355,0.441963,-3.974499,-1.1696,0.164243,
+ 0.874434,0.048946,-0.48267,-4.029726,-1.043238,0.136305,
+ 0.432653,0.056559,-0.899785,-4.129295,-1.228786,0.120745,
+ 0.843461,-0.305355,0.441963,-3.974499,-1.1696,0.164243,
+ 0.432653,0.056559,-0.899785,-4.129295,-1.228786,0.120745,
+ 0.589229,-0.690587,0.419402,-4.018866,-1.413191,0.154149,
+ 0.589229,-0.690587,0.419402,-4.018866,-1.413191,0.154149,
+ 0.432653,0.056559,-0.899785,-4.129295,-1.228786,0.120745,
+ 0.517516,0.032105,-0.855071,-4.184154,-1.59808,0.151191,
+ 0.589229,-0.690587,0.419402,-4.018866,-1.413191,0.154149,
+ 0.517516,0.032105,-0.855071,-4.184154,-1.59808,0.151191,
+ 0.389217,-0.829193,0.401185,-4.154334,-1.677827,0.165852,
+ 0.389217,-0.829193,0.401185,-4.154334,-1.677827,0.165852,
+ 0.517516,0.032105,-0.855071,-4.184154,-1.59808,0.151191,
+ 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
+ 0.389217,-0.829193,0.401185,-4.154334,-1.677827,0.165852,
+ 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
+ 0.981696,0.042552,-0.185638,-4.207566,-1.922824,0.155104,
+ 0.999006,0.044565,0.000415,-3.896204,-0.629183,0.077883,
+ 0.001234,0.013557,-0.999907,-3.932489,-0.556566,0.037354,
+ -0.369174,0.174156,-0.912897,-4.070739,-0.947648,0.110554,
+ 0.999006,0.044565,0.000415,-3.896204,-0.629183,0.077883,
+ -0.369174,0.174156,-0.912897,-4.070739,-0.947648,0.110554,
+ 0.839295,0.00969,-0.54359,-3.978115,-0.82344,0.09928,
+ 0.839295,0.00969,-0.54359,-3.978115,-0.82344,0.09928,
+ -0.369174,0.174156,-0.912897,-4.070739,-0.947648,0.110554,
+ -0.516127,0.008586,-0.856469,-4.227645,-1.227895,0.069894,
+ 0.839295,0.00969,-0.54359,-3.978115,-0.82344,0.09928,
+ -0.516127,0.008586,-0.856469,-4.227645,-1.227895,0.069894,
+ 0.874434,0.048946,-0.48267,-4.029726,-1.043238,0.136305,
+ 0.874434,0.048946,-0.48267,-4.029726,-1.043238,0.136305,
+ -0.516127,0.008586,-0.856469,-4.227645,-1.227895,0.069894,
+ -0.822516,0.195417,-0.534116,-4.229164,-1.473093,0.11156,
+ 0.874434,0.048946,-0.48267,-4.029726,-1.043238,0.136305,
+ -0.822516,0.195417,-0.534116,-4.229164,-1.473093,0.11156,
+ 0.432653,0.056559,-0.899785,-4.129295,-1.228786,0.120745,
+ 0.432653,0.056559,-0.899785,-4.129295,-1.228786,0.120745,
+ -0.822516,0.195417,-0.534116,-4.229164,-1.473093,0.11156,
+ -0.874954,0.011842,-0.484061,-4.309744,-1.743848,0.150329,
+ 0.432653,0.056559,-0.899785,-4.129295,-1.228786,0.120745,
+ -0.874954,0.011842,-0.484061,-4.309744,-1.743848,0.150329,
+ 0.517516,0.032105,-0.855071,-4.184154,-1.59808,0.151191,
+ 0.517516,0.032105,-0.855071,-4.184154,-1.59808,0.151191,
+ -0.874954,0.011842,-0.484061,-4.309744,-1.743848,0.150329,
+ 0.924466,0.048977,0.378105,-4.405365,-1.921443,0.192978,
+ 0.517516,0.032105,-0.855071,-4.184154,-1.59808,0.151191,
+ 0.924466,0.048977,0.378105,-4.405365,-1.921443,0.192978,
+ 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
+ 0.001234,0.013557,-0.999907,-3.932489,-0.556566,0.037354,
+ 0.728068,-0.191899,-0.658097,-3.975337,-0.554961,-0.014407,
+ 0.313565,-0.18353,-0.931662,-4.112449,-0.875765,0.016326,
+ 0.001234,0.013557,-0.999907,-3.932489,-0.556566,0.037354,
+ 0.313565,-0.18353,-0.931662,-4.112449,-0.875765,0.016326,
+ -0.369174,0.174156,-0.912897,-4.070739,-0.947648,0.110554,
+ -0.369174,0.174156,-0.912897,-4.070739,-0.947648,0.110554,
+ 0.313565,-0.18353,-0.931662,-4.112449,-0.875765,0.016326,
+ 0.537835,-0.193789,-0.820475,-4.233834,-1.166542,0.022074,
+ -0.369174,0.174156,-0.912897,-4.070739,-0.947648,0.110554,
+ 0.537835,-0.193789,-0.820475,-4.233834,-1.166542,0.022074,
+ -0.516127,0.008586,-0.856469,-4.227645,-1.227895,0.069894,
+ -0.516127,0.008586,-0.856469,-4.227645,-1.227895,0.069894,
+ 0.537835,-0.193789,-0.820475,-4.233834,-1.166542,0.022074,
+ 0.908243,-0.229695,0.349765,-4.333831,-1.548255,0.056938,
+ -0.516127,0.008586,-0.856469,-4.227645,-1.227895,0.069894,
+ 0.908243,-0.229695,0.349765,-4.333831,-1.548255,0.056938,
+ -0.822516,0.195417,-0.534116,-4.229164,-1.473093,0.11156,
+ -0.822516,0.195417,-0.534116,-4.229164,-1.473093,0.11156,
+ 0.908243,-0.229695,0.349765,-4.333831,-1.548255,0.056938,
+ 0.701057,-0.21056,0.68131,-4.424122,-1.831742,0.130839,
+ -0.822516,0.195417,-0.534116,-4.229164,-1.473093,0.11156,
+ 0.701057,-0.21056,0.68131,-4.424122,-1.831742,0.130839,
+ -0.874954,0.011842,-0.484061,-4.309744,-1.743848,0.150329,
+ -0.874954,0.011842,-0.484061,-4.309744,-1.743848,0.150329,
+ 0.701057,-0.21056,0.68131,-4.424122,-1.831742,0.130839,
+ 0.129519,-0.132707,0.982656,-4.445835,-2.015127,0.189702,
+ -0.874954,0.011842,-0.484061,-4.309744,-1.743848,0.150329,
+ 0.129519,-0.132707,0.982656,-4.445835,-2.015127,0.189702,
+ 0.924466,0.048977,0.378105,-4.405365,-1.921443,0.192978,
+ 0.728068,-0.191899,-0.658097,-3.975337,-0.554961,-0.014407,
+ -0.276108,-0.088023,0.957087,-3.921874,-0.538502,-0.145307,
+ -0.409041,-0.077841,0.90919,-4.042715,-0.87671,-0.168968,
+ 0.728068,-0.191899,-0.658097,-3.975337,-0.554961,-0.014407,
+ -0.409041,-0.077841,0.90919,-4.042715,-0.87671,-0.168968,
+ 0.313565,-0.18353,-0.931662,-4.112449,-0.875765,0.016326,
+ 0.313565,-0.18353,-0.931662,-4.112449,-0.875765,0.016326,
+ -0.409041,-0.077841,0.90919,-4.042715,-0.87671,-0.168968,
+ 0.50178,0.000639,-0.864995,-4.216296,-1.160854,-0.104034,
+ 0.313565,-0.18353,-0.931662,-4.112449,-0.875765,0.016326,
+ 0.50178,0.000639,-0.864995,-4.216296,-1.160854,-0.104034,
+ 0.537835,-0.193789,-0.820475,-4.233834,-1.166542,0.022074,
+ 0.537835,-0.193789,-0.820475,-4.233834,-1.166542,0.022074,
+ 0.50178,0.000639,-0.864995,-4.216296,-1.160854,-0.104034,
+ 0.300485,0.019099,-0.953595,-4.252683,-1.437854,-0.14562,
+ 0.537835,-0.193789,-0.820475,-4.233834,-1.166542,0.022074,
+ 0.300485,0.019099,-0.953595,-4.252683,-1.437854,-0.14562,
+ 0.908243,-0.229695,0.349765,-4.333831,-1.548255,0.056938,
+ 0.908243,-0.229695,0.349765,-4.333831,-1.548255,0.056938,
+ 0.300485,0.019099,-0.953595,-4.252683,-1.437854,-0.14562,
+ 0.678632,-0.017853,-0.734261,-4.331331,-1.69259,-0.043593,
+ 0.908243,-0.229695,0.349765,-4.333831,-1.548255,0.056938,
+ 0.678632,-0.017853,-0.734261,-4.331331,-1.69259,-0.043593,
+ 0.701057,-0.21056,0.68131,-4.424122,-1.831742,0.130839,
+ 0.701057,-0.21056,0.68131,-4.424122,-1.831742,0.130839,
+ 0.678632,-0.017853,-0.734261,-4.331331,-1.69259,-0.043593,
+ 0.687126,-0.68509,0.241888,-4.387148,-1.967814,0.045602,
+ 0.701057,-0.21056,0.68131,-4.424122,-1.831742,0.130839,
+ 0.687126,-0.68509,0.241888,-4.387148,-1.967814,0.045602,
+ 0.129519,-0.132707,0.982656,-4.445835,-2.015127,0.189702,
+ -0.276108,-0.088023,0.957087,-3.921874,-0.538502,-0.145307,
+ 0.260319,-0.908993,-0.325523,-3.910546,-0.601719,-0.163159,
+ -0.148191,-0.901516,-0.40658,-3.988138,-0.962789,-0.223649,
+ -0.276108,-0.088023,0.957087,-3.921874,-0.538502,-0.145307,
+ -0.148191,-0.901516,-0.40658,-3.988138,-0.962789,-0.223649,
+ -0.409041,-0.077841,0.90919,-4.042715,-0.87671,-0.168968,
+ -0.409041,-0.077841,0.90919,-4.042715,-0.87671,-0.168968,
+ -0.148191,-0.901516,-0.40658,-3.988138,-0.962789,-0.223649,
+ -0.443612,-0.876487,-0.187028,-4.111927,-1.333141,-0.26716,
+ -0.409041,-0.077841,0.90919,-4.042715,-0.87671,-0.168968,
+ -0.443612,-0.876487,-0.187028,-4.111927,-1.333141,-0.26716,
+ 0.50178,0.000639,-0.864995,-4.216296,-1.160854,-0.104034,
+ 0.50178,0.000639,-0.864995,-4.216296,-1.160854,-0.104034,
+ -0.443612,-0.876487,-0.187028,-4.111927,-1.333141,-0.26716,
+ -0.508388,-0.837291,0.20121,-4.201904,-1.668554,-0.214859,
+ 0.50178,0.000639,-0.864995,-4.216296,-1.160854,-0.104034,
+ -0.508388,-0.837291,0.20121,-4.201904,-1.668554,-0.214859,
+ 0.300485,0.019099,-0.953595,-4.252683,-1.437854,-0.14562,
+ 0.300485,0.019099,-0.953595,-4.252683,-1.437854,-0.14562,
+ -0.508388,-0.837291,0.20121,-4.201904,-1.668554,-0.214859,
+ -0.409829,-0.525605,0.745506,-4.273069,-1.798884,-0.099878,
+ 0.300485,0.019099,-0.953595,-4.252683,-1.437854,-0.14562,
+ -0.409829,-0.525605,0.745506,-4.273069,-1.798884,-0.099878,
+ 0.678632,-0.017853,-0.734261,-4.331331,-1.69259,-0.043593,
+ 0.678632,-0.017853,-0.734261,-4.331331,-1.69259,-0.043593,
+ -0.409829,-0.525605,0.745506,-4.273069,-1.798884,-0.099878,
+ -0.227573,-0.361148,0.904313,-4.351543,-1.947675,0.02502,
+ 0.678632,-0.017853,-0.734261,-4.331331,-1.69259,-0.043593,
+ -0.227573,-0.361148,0.904313,-4.351543,-1.947675,0.02502,
+ 0.687126,-0.68509,0.241888,-4.387148,-1.967814,0.045602,
+ 0.260319,-0.908993,-0.325523,-3.910546,-0.601719,-0.163159,
+ 0.10009,-0.380026,0.919545,-3.873622,-0.759035,-0.197169,
+ 0.547733,-0.470267,0.691981,-3.917882,-1.082831,-0.289171,
+ 0.260319,-0.908993,-0.325523,-3.910546,-0.601719,-0.163159,
+ 0.547733,-0.470267,0.691981,-3.917882,-1.082831,-0.289171,
+ -0.148191,-0.901516,-0.40658,-3.988138,-0.962789,-0.223649,
+ -0.148191,-0.901516,-0.40658,-3.988138,-0.962789,-0.223649,
+ 0.547733,-0.470267,0.691981,-3.917882,-1.082831,-0.289171,
+ -0.071182,-0.950841,0.301389,-4.001496,-1.375703,-0.285641,
+ -0.148191,-0.901516,-0.40658,-3.988138,-0.962789,-0.223649,
+ -0.071182,-0.950841,0.301389,-4.001496,-1.375703,-0.285641,
+ -0.443612,-0.876487,-0.187028,-4.111927,-1.333141,-0.26716,
+ -0.443612,-0.876487,-0.187028,-4.111927,-1.333141,-0.26716,
+ -0.071182,-0.950841,0.301389,-4.001496,-1.375703,-0.285641,
+ 0.216747,0.039317,0.975436,-4.073086,-1.649491,-0.238382,
+ -0.443612,-0.876487,-0.187028,-4.111927,-1.333141,-0.26716,
+ 0.216747,0.039317,0.975436,-4.073086,-1.649491,-0.238382,
+ -0.508388,-0.837291,0.20121,-4.201904,-1.668554,-0.214859,
+ -0.508388,-0.837291,0.20121,-4.201904,-1.668554,-0.214859,
+ 0.216747,0.039317,0.975436,-4.073086,-1.649491,-0.238382,
+ 0.555948,0.246866,0.793712,-4.175757,-1.808223,-0.140659,
+ -0.508388,-0.837291,0.20121,-4.201904,-1.668554,-0.214859,
+ 0.555948,0.246866,0.793712,-4.175757,-1.808223,-0.140659,
+ -0.409829,-0.525605,0.745506,-4.273069,-1.798884,-0.099878,
+ -0.409829,-0.525605,0.745506,-4.273069,-1.798884,-0.099878,
+ 0.555948,0.246866,0.793712,-4.175757,-1.808223,-0.140659,
+ 0.768311,0.202351,0.60725,-4.321269,-1.963488,0.025072,
+ -0.409829,-0.525605,0.745506,-4.273069,-1.798884,-0.099878,
+ 0.768311,0.202351,0.60725,-4.321269,-1.963488,0.025072,
+ -0.227573,-0.361148,0.904313,-4.351543,-1.947675,0.02502,
+ 0.10009,-0.380026,0.919545,-3.873622,-0.759035,-0.197169,
+ 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
+ 0.547733,-0.470267,0.691981,-3.917882,-1.082831,-0.289171,
+ 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
+ 0.587809,-0.328909,0.739121,-3.777709,-1.051411,-0.240495,
+ 0.547733,-0.470267,0.691981,-3.917882,-1.082831,-0.289171,
+ 0.547733,-0.470267,0.691981,-3.917882,-1.082831,-0.289171,
+ 0.587809,-0.328909,0.739121,-3.777709,-1.051411,-0.240495,
+ -0.071182,-0.950841,0.301389,-4.001496,-1.375703,-0.285641,
+ 0.587809,-0.328909,0.739121,-3.777709,-1.051411,-0.240495,
+ 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
+ -0.071182,-0.950841,0.301389,-4.001496,-1.375703,-0.285641,
+ 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
+ 0.794828,0.083383,0.601079,-4.000019,-1.567512,-0.27535,
+ -0.071182,-0.950841,0.301389,-4.001496,-1.375703,-0.285641,
+ -0.071182,-0.950841,0.301389,-4.001496,-1.375703,-0.285641,
+ 0.794828,0.083383,0.601079,-4.000019,-1.567512,-0.27535,
+ 0.216747,0.039317,0.975436,-4.073086,-1.649491,-0.238382,
+ 0.794828,0.083383,0.601079,-4.000019,-1.567512,-0.27535,
+ 0.873201,-0.045461,0.485235,-3.977657,-1.750845,-0.184909,
+ 0.216747,0.039317,0.975436,-4.073086,-1.649491,-0.238382,
+ 0.216747,0.039317,0.975436,-4.073086,-1.649491,-0.238382,
+ 0.873201,-0.045461,0.485235,-3.977657,-1.750845,-0.184909,
+ 0.555948,0.246866,0.793712,-4.175757,-1.808223,-0.140659,
+ 0.873201,-0.045461,0.485235,-3.977657,-1.750845,-0.184909,
+ 0.829377,-0.173626,0.531026,-4.075028,-1.904403,-0.041324,
+ 0.555948,0.246866,0.793712,-4.175757,-1.808223,-0.140659,
+ 0.555948,0.246866,0.793712,-4.175757,-1.808223,-0.140659,
+ 0.829377,-0.173626,0.531026,-4.075028,-1.904403,-0.041324,
+ 0.768311,0.202351,0.60725,-4.321269,-1.963488,0.025072,
+ 0.829377,-0.173626,0.531026,-4.075028,-1.904403,-0.041324,
+ 0.506864,-0.193038,0.840134,-4.192486,-1.953852,0.017313,
+ 0.768311,0.202351,0.60725,-4.321269,-1.963488,0.025072,
+ 0.274422,-0.24433,0.930051,-3.65524,-0.194907,0.019209,
+ 0.560378,0.257624,0.787151,-3.695565,-0.19362,0.051497,
+ 0.00197,-0.021649,0.999764,-3.740631,-0.558176,0.085478,
+ 0.274422,-0.24433,0.930051,-3.65524,-0.194907,0.019209,
+ 0.00197,-0.021649,0.999764,-3.740631,-0.558176,0.085478,
+ -0.54555,-0.056478,0.836173,-3.67645,-0.551317,0.077574,
+ 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
+ 0.728068,-0.191899,-0.658097,-3.975337,-0.554961,-0.014407,
+ 0.001234,0.013557,-0.999907,-3.932489,-0.556566,0.037354,
+ 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
+ 0.001234,0.013557,-0.999907,-3.932489,-0.556566,0.037354,
+ 0.999006,0.044565,0.000415,-3.896204,-0.629183,0.077883,
+ 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
+ 0.999006,0.044565,0.000415,-3.896204,-0.629183,0.077883,
+ 0.875325,0.013439,0.483348,-3.818598,-0.52269,0.055572,
+ 0.711192,0.127662,0.69131,-3.75063,-0.191863,0.063305,
+ 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
+ 0.875325,0.013439,0.483348,-3.818598,-0.52269,0.055572,
+ 0.711192,0.127662,0.69131,-3.75063,-0.191863,0.063305,
+ 0.875325,0.013439,0.483348,-3.818598,-0.52269,0.055572,
+ 0.518386,-0.029316,0.854644,-3.778908,-0.541975,0.064258,
+ 0.560378,0.257624,0.787151,-3.695565,-0.19362,0.051497,
+ 0.518386,-0.029316,0.854644,-3.778908,-0.541975,0.064258,
+ 0.00197,-0.021649,0.999764,-3.740631,-0.558176,0.085478,
+ 0.238843,0.101951,0.965691,-3.84599,-0.18882,0.019164,
+ 0.166377,-0.157108,0.973466,-3.86074,-0.188349,-0.024962,
+ 0.728068,-0.191899,-0.658097,-3.975337,-0.554961,-0.014407,
+ 0.89264,0.349909,0.284178,-3.695452,-0.193624,-0.101369,
+ 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
+ 0.10009,-0.380026,0.919545,-3.873622,-0.759035,-0.197169,
+ 0.3526,0.621479,0.699598,-3.7505,-0.191867,-0.11323,
+ 0.89264,0.349909,0.284178,-3.695452,-0.193624,-0.101369,
+ 0.10009,-0.380026,0.919545,-3.873622,-0.759035,-0.197169,
+ -0.281998,-0.030938,0.958916,-3.805575,-0.190109,-0.101447,
+ 0.3526,0.621479,0.699598,-3.7505,-0.191867,-0.11323,
+ 0.10009,-0.380026,0.919545,-3.873622,-0.759035,-0.197169,
+ -0.281998,-0.030938,0.958916,-3.805575,-0.190109,-0.101447,
+ 0.10009,-0.380026,0.919545,-3.873622,-0.759035,-0.197169,
+ 0.260319,-0.908993,-0.325523,-3.910546,-0.601719,-0.163159,
+ -0.281998,-0.030938,0.958916,-3.805575,-0.190109,-0.101447,
+ 0.260319,-0.908993,-0.325523,-3.910546,-0.601719,-0.163159,
+ -0.276108,-0.088023,0.957087,-3.921874,-0.538502,-0.145307,
+ 0.077536,0.770695,0.632469,-3.845923,-0.188822,-0.06918,
+ -0.281998,-0.030938,0.958916,-3.805575,-0.190109,-0.101447,
+ -0.276108,-0.088023,0.957087,-3.921874,-0.538502,-0.145307,
+ 0.166377,-0.157108,0.973466,-3.86074,-0.188349,-0.024962,
+ -0.276108,-0.088023,0.957087,-3.921874,-0.538502,-0.145307,
+ 0.728068,-0.191899,-0.658097,-3.975337,-0.554961,-0.014407,
+ 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
+ -0.064166,-0.189382,0.979805,-3.655175,-0.194909,-0.069044,
+ 0.267717,-0.172975,0.947844,-3.640457,-0.195379,-0.024909,
+ 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
+ 0.89264,0.349909,0.284178,-3.695452,-0.193624,-0.101369,
+ -0.064166,-0.189382,0.979805,-3.655175,-0.194909,-0.069044,
+ 0.274422,-0.24433,0.930051,-3.65524,-0.194907,0.019209,
+ -0.54555,-0.056478,0.836173,-3.67645,-0.551317,0.077574,
+ 0.269003,0.86436,0.424875,-3.569386,-0.761644,-0.035893,
+ 0.269003,0.86436,0.424875,-3.569386,-0.761644,-0.035893,
+ 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
+ 0.267717,-0.172975,0.947844,-3.640457,-0.195379,-0.024909,
+ -0.54555,-0.056478,0.836173,-3.67645,-0.551317,0.077574,
+ -0.530021,0.13773,0.836724,-3.697889,-0.951955,0.098793,
+ -0.429713,0.351913,0.831567,-3.666536,-1.140372,0.078261,
+ 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
+ 0.587809,-0.328909,0.739121,-3.777709,-1.051411,-0.240495,
+ 0.000909,0.669011,0.743252,-3.581963,-1.413947,-0.104371,
+ 0.269003,0.86436,0.424875,-3.569386,-0.761644,-0.035893,
+ -0.54555,-0.056478,0.836173,-3.67645,-0.551317,0.077574,
+ -0.429713,0.351913,0.831567,-3.666536,-1.140372,0.078261,
+ 0.269003,0.86436,0.424875,-3.569386,-0.761644,-0.035893,
+ -0.429713,0.351913,0.831567,-3.666536,-1.140372,0.078261,
+ -0.24021,0.502412,0.830591,-3.639696,-1.242349,0.05719,
+ 0.269003,0.86436,0.424875,-3.569386,-0.761644,-0.035893,
+ -0.24021,0.502412,0.830591,-3.639696,-1.242349,0.05719,
+ 0.000909,0.669011,0.743252,-3.581963,-1.413947,-0.104371,
+ 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
+ 0.269003,0.86436,0.424875,-3.569386,-0.761644,-0.035893,
+ 0.000909,0.669011,0.743252,-3.581963,-1.413947,-0.104371,
+ 0.587809,-0.328909,0.739121,-3.777709,-1.051411,-0.240495,
+ 0.833232,0.046885,0.550932,-3.742608,-0.729374,-0.149361,
+ 0.000909,0.669011,0.743252,-3.581963,-1.413947,-0.104371,
+ 0.873201,-0.045461,0.485235,-3.977657,-1.750845,-0.184909,
+ 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
+ 0.829377,-0.173626,0.531026,-4.075028,-1.904403,-0.041324,
+ 0.873201,-0.045461,0.485235,-3.977657,-1.750845,-0.184909,
+ 0.794828,0.083383,0.601079,-4.000019,-1.567512,-0.27535,
+ 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
+ 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
+ 0.000909,0.669011,0.743252,-3.581963,-1.413947,-0.104371,
+ -0.041225,-0.030655,0.99868,-3.683069,-1.591975,-0.115233,
+ 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
+ -0.041225,-0.030655,0.99868,-3.683069,-1.591975,-0.115233,
+ 0.002322,-0.058071,0.99831,-3.828485,-1.786559,-0.114095,
+ 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
+ 0.002322,-0.058071,0.99831,-3.828485,-1.786559,-0.114095,
+ 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
+ 0.873201,-0.045461,0.485235,-3.977657,-1.750845,-0.184909,
+ 0.213242,-0.278117,0.936578,-3.82037,-1.239135,-0.269807,
+ 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
+ 0.231733,0.017467,0.972623,-3.890388,-1.750102,0.017612,
+ 0.791625,0.052579,0.608741,-4.107191,-1.83652,0.120149,
+ 0.829377,-0.173626,0.531026,-4.075028,-1.904403,-0.041324,
+ 0.791625,0.052579,0.608741,-4.107191,-1.83652,0.120149,
+ 0.981696,0.042552,-0.185638,-4.207566,-1.922824,0.155104,
+ 0.829377,-0.173626,0.531026,-4.075028,-1.904403,-0.041324,
+ 0.924466,0.048977,0.378105,-4.405365,-1.921443,0.192978,
+ 0.687126,-0.68509,0.241888,-4.387148,-1.967814,0.045602,
+ 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
+ 0.506864,-0.193038,0.840134,-4.192486,-1.953852,0.017313,
+ 0.829377,-0.173626,0.531026,-4.075028,-1.904403,-0.041324,
+ 0.981696,0.042552,-0.185638,-4.207566,-1.922824,0.155104,
+ 0.506864,-0.193038,0.840134,-4.192486,-1.953852,0.017313,
+ 0.981696,0.042552,-0.185638,-4.207566,-1.922824,0.155104,
+ 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
+ 0.768311,0.202351,0.60725,-4.321269,-1.963488,0.025072,
+ 0.506864,-0.193038,0.840134,-4.192486,-1.953852,0.017313,
+ 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
+ -0.227573,-0.361148,0.904313,-4.351543,-1.947675,0.02502,
+ 0.768311,0.202351,0.60725,-4.321269,-1.963488,0.025072,
+ 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
+ 0.687126,-0.68509,0.241888,-4.387148,-1.967814,0.045602,
+ -0.227573,-0.361148,0.904313,-4.351543,-1.947675,0.02502,
+ 0.002983,0.098874,-0.995096,-4.297769,-1.889903,0.177707,
+ 0.924466,0.048977,0.378105,-4.405365,-1.921443,0.192978,
+ 0.129519,-0.132707,0.982656,-4.445835,-2.015127,0.189702,
+ 0.687126,-0.68509,0.241888,-4.387148,-1.967814,0.045602,
+ 0.560378,0.257624,0.787151,-3.695565,-0.19362,0.051497,
+ 0.711192,0.127662,0.69131,-3.75063,-0.191863,0.063305,
+ 0.518386,-0.029316,0.854644,-3.778908,-0.541975,0.064258,
+ 0.546619,0.025488,0.836993,-3.805688,-0.190106,0.051472,
+ 0.238843,0.101951,0.965691,-3.84599,-0.18882,0.019164,
+ 0.728068,-0.191899,-0.658097,-3.975337,-0.554961,-0.014407,
+ 0.166377,-0.157108,0.973466,-3.86074,-0.188349,-0.024962,
+ 0.077536,0.770695,0.632469,-3.845923,-0.188822,-0.06918,
+ -0.276108,-0.088023,0.957087,-3.921874,-0.538502,-0.145307,
+ 0.269003,0.86436,0.424875,-3.569386,-0.761644,-0.035893,
+ 0.267717,-0.172975,0.947844,-3.640457,-0.195379,-0.024909,
+ 0.274422,-0.24433,0.930051,-3.65524,-0.194907,0.019209
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,459,data,NULL};
+const struct gllist *cow_tail=&frame;
diff --git a/hacks/glx/cow_udder.c b/hacks/glx/cow_udder.c
new file mode 100644
index 0000000..46df87c
--- /dev/null
+++ b/hacks/glx/cow_udder.c
@@ -0,0 +1,1520 @@
+#include "gllist.h"
+static const float data[]={
+ 0.058723,-0.195869,-0.97887,-2.033406,-0.91003,-0.96422,
+ -0.977902,-0.171036,-0.12023,-2.119856,-1.1288,-0.97096,
+ 0.07657,0.16758,-0.982881,-2.306662,-1.116976,-0.961238,
+ -0.977902,-0.171036,-0.12023,-2.119856,-1.1288,-0.97096,
+ 0.058723,-0.195869,-0.97887,-2.033406,-0.91003,-0.96422,
+ -0.964119,-0.189683,-0.18573,-2.031698,-1.097344,-0.966701,
+ -0.964119,-0.189683,-0.18573,-2.031698,-1.097344,-0.966701,
+ 0.058723,-0.195869,-0.97887,-2.033406,-0.91003,-0.96422,
+ -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
+ -0.955382,-0.23808,-0.174826,-2.462835,-1.3055,-0.966395,
+ 0.07657,0.16758,-0.982881,-2.306662,-1.116976,-0.961238,
+ -0.843742,-0.096326,-0.528036,-2.337617,-1.334842,-0.966761,
+ -0.843742,-0.096326,-0.528036,-2.337617,-1.334842,-0.966761,
+ 0.07657,0.16758,-0.982881,-2.306662,-1.116976,-0.961238,
+ -0.977902,-0.171036,-0.12023,-2.119856,-1.1288,-0.97096,
+ -0.843742,-0.096326,-0.528036,-2.337617,-1.334842,-0.966761,
+ -0.977902,-0.171036,-0.12023,-2.119856,-1.1288,-0.97096,
+ 0.028952,-0.016247,-0.999449,-2.161843,-1.325837,-0.957465,
+ 0.028952,-0.016247,-0.999449,-2.161843,-1.325837,-0.957465,
+ -0.977902,-0.171036,-0.12023,-2.119856,-1.1288,-0.97096,
+ -0.964119,-0.189683,-0.18573,-2.031698,-1.097344,-0.966701,
+ 0.028952,-0.016247,-0.999449,-2.161843,-1.325837,-0.957465,
+ -0.964119,-0.189683,-0.18573,-2.031698,-1.097344,-0.966701,
+ 0.093953,-0.049433,-0.994349,-2.042059,-1.312976,-0.940911,
+ 0.093953,-0.049433,-0.994349,-2.042059,-1.312976,-0.940911,
+ -0.964119,-0.189683,-0.18573,-2.031698,-1.097344,-0.966701,
+ -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
+ 0.093953,-0.049433,-0.994349,-2.042059,-1.312976,-0.940911,
+ -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
+ 0.335613,-0.388493,-0.858159,-1.776785,-1.275107,-0.914703,
+ 0.335613,-0.388493,-0.858159,-1.776785,-1.275107,-0.914703,
+ -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
+ -0.004413,-0.170526,-0.985343,-1.709172,-1.283232,-0.897427,
+ -0.004413,-0.170526,-0.985343,-1.709172,-1.283232,-0.897427,
+ -0.30296,-0.137183,-0.943078,-1.782298,-1.020581,-0.943381,
+ 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
+ 0.137764,-0.289893,-0.947092,-2.591357,-1.510845,-0.88547,
+ -0.955382,-0.23808,-0.174826,-2.462835,-1.3055,-0.966395,
+ -0.843742,-0.096326,-0.528036,-2.337617,-1.334842,-0.966761,
+ 0.137764,-0.289893,-0.947092,-2.591357,-1.510845,-0.88547,
+ -0.843742,-0.096326,-0.528036,-2.337617,-1.334842,-0.966761,
+ 0.137206,-0.207537,-0.968557,-2.417777,-1.553136,-0.887222,
+ 0.137206,-0.207537,-0.968557,-2.417777,-1.553136,-0.887222,
+ -0.843742,-0.096326,-0.528036,-2.337617,-1.334842,-0.966761,
+ 0.028952,-0.016247,-0.999449,-2.161843,-1.325837,-0.957465,
+ 0.137206,-0.207537,-0.968557,-2.417777,-1.553136,-0.887222,
+ 0.028952,-0.016247,-0.999449,-2.161843,-1.325837,-0.957465,
+ 0.094371,-0.230057,-0.968591,-2.223917,-1.541268,-0.87926,
+ 0.094371,-0.230057,-0.968591,-2.223917,-1.541268,-0.87926,
+ 0.028952,-0.016247,-0.999449,-2.161843,-1.325837,-0.957465,
+ 0.093953,-0.049433,-0.994349,-2.042059,-1.312976,-0.940911,
+ 0.094371,-0.230057,-0.968591,-2.223917,-1.541268,-0.87926,
+ 0.093953,-0.049433,-0.994349,-2.042059,-1.312976,-0.940911,
+ -0.201818,-0.568242,-0.797728,-2.049879,-1.562369,-0.829319,
+ -0.201818,-0.568242,-0.797728,-2.049879,-1.562369,-0.829319,
+ 0.093953,-0.049433,-0.994349,-2.042059,-1.312976,-0.940911,
+ 0.357021,-0.590654,-0.723646,-1.777628,-1.473076,-0.845827,
+ -0.201818,-0.568242,-0.797728,-2.049879,-1.562369,-0.829319,
+ 0.357021,-0.590654,-0.723646,-1.777628,-1.473076,-0.845827,
+ 0.008663,-0.516082,-0.856495,-1.778934,-1.550199,-0.776454,
+ 0.357021,-0.590654,-0.723646,-1.777628,-1.473076,-0.845827,
+ 0.093953,-0.049433,-0.994349,-2.042059,-1.312976,-0.940911,
+ 0.335613,-0.388493,-0.858159,-1.776785,-1.275107,-0.914703,
+ 0.357021,-0.590654,-0.723646,-1.777628,-1.473076,-0.845827,
+ 0.335613,-0.388493,-0.858159,-1.776785,-1.275107,-0.914703,
+ -0.004413,-0.170526,-0.985343,-1.709172,-1.283232,-0.897427,
+ 0.357021,-0.590654,-0.723646,-1.777628,-1.473076,-0.845827,
+ -0.004413,-0.170526,-0.985343,-1.709172,-1.283232,-0.897427,
+ 0.106237,-0.558927,-0.822383,-1.686329,-1.414405,-0.869373,
+ 0.106237,-0.558927,-0.822383,-1.686329,-1.414405,-0.869373,
+ -0.004413,-0.170526,-0.985343,-1.709172,-1.283232,-0.897427,
+ 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
+ 0.106237,-0.558927,-0.822383,-1.686329,-1.414405,-0.869373,
+ 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
+ 0.155794,-0.590112,-0.792146,-1.592146,-1.408592,-0.838483,
+ 0.155794,-0.590112,-0.792146,-1.592146,-1.408592,-0.838483,
+ 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
+ 0.08565,-0.422547,-0.902285,-1.552229,-1.555077,-0.735708,
+ 0.08565,-0.422547,-0.902285,-1.552229,-1.555077,-0.735708,
+ 0.161064,-0.731195,-0.662882,-1.659758,-1.544361,-0.788181,
+ 0.155794,-0.590112,-0.792146,-1.592146,-1.408592,-0.838483,
+ 0.155794,-0.590112,-0.792146,-1.592146,-1.408592,-0.838483,
+ 0.161064,-0.731195,-0.662882,-1.659758,-1.544361,-0.788181,
+ 0.106237,-0.558927,-0.822383,-1.686329,-1.414405,-0.869373,
+ 0.106237,-0.558927,-0.822383,-1.686329,-1.414405,-0.869373,
+ 0.161064,-0.731195,-0.662882,-1.659758,-1.544361,-0.788181,
+ 0.008663,-0.516082,-0.856495,-1.778934,-1.550199,-0.776454,
+ 0.106237,-0.558927,-0.822383,-1.686329,-1.414405,-0.869373,
+ 0.008663,-0.516082,-0.856495,-1.778934,-1.550199,-0.776454,
+ 0.357021,-0.590654,-0.723646,-1.777628,-1.473076,-0.845827,
+ 0.08565,-0.422547,-0.902285,-1.552229,-1.555077,-0.735708,
+ 0.095733,-0.224552,-0.969748,-1.456655,-1.295527,-0.89424,
+ -0.422758,-0.178302,-0.888529,-1.366873,-1.340211,-0.907567,
+ 0.08565,-0.422547,-0.902285,-1.552229,-1.555077,-0.735708,
+ -0.422758,-0.178302,-0.888529,-1.366873,-1.340211,-0.907567,
+ -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
+ -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
+ -0.422758,-0.178302,-0.888529,-1.366873,-1.340211,-0.907567,
+ 0.121987,-0.426326,-0.896306,-1.198513,-1.456102,-0.885435,
+ -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
+ 0.121987,-0.426326,-0.896306,-1.198513,-1.456102,-0.885435,
+ 0.215155,-0.464575,-0.858999,-1.200688,-1.577575,-0.799188,
+ 0.215155,-0.464575,-0.858999,-1.200688,-1.577575,-0.799188,
+ 0.121987,-0.426326,-0.896306,-1.198513,-1.456102,-0.885435,
+ -0.218261,-0.26262,-0.93989,-0.953236,-1.545941,-0.89918,
+ -0.094238,-0.851252,-0.516225,-1.397474,-1.693815,-0.570541,
+ 0.152347,-0.821467,-0.549529,-1.480217,-1.6566,-0.606638,
+ -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
+ -0.504483,-0.438591,-0.743731,-1.376186,-1.661988,-0.718954,
+ 0.152347,-0.821467,-0.549529,-1.480217,-1.6566,-0.606638,
+ 0.08565,-0.422547,-0.902285,-1.552229,-1.555077,-0.735708,
+ 0.08565,-0.422547,-0.902285,-1.552229,-1.555077,-0.735708,
+ 0.152347,-0.821467,-0.549529,-1.480217,-1.6566,-0.606638,
+ -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
+ -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
+ 0.152347,-0.821467,-0.549529,-1.480217,-1.6566,-0.606638,
+ -0.198045,-0.959194,-0.201804,-1.519339,-1.653776,-0.501741,
+ -0.198045,-0.959194,-0.201804,-1.519339,-1.653776,-0.501741,
+ 0.152347,-0.821467,-0.549529,-1.480217,-1.6566,-0.606638,
+ -0.094238,-0.851252,-0.516225,-1.397474,-1.693815,-0.570541,
+ -0.198045,-0.959194,-0.201804,-1.519339,-1.653776,-0.501741,
+ -0.094238,-0.851252,-0.516225,-1.397474,-1.693815,-0.570541,
+ -0.171647,-0.971664,-0.162499,-1.406693,-1.697325,-0.450399,
+ -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
+ -0.198045,-0.959194,-0.201804,-1.519339,-1.653776,-0.501741,
+ -0.403877,-0.879274,-0.252509,-1.576196,-1.696317,-0.358146,
+ -0.403877,-0.879274,-0.252509,-1.576196,-1.696317,-0.358146,
+ -0.198045,-0.959194,-0.201804,-1.519339,-1.653776,-0.501741,
+ -0.171647,-0.971664,-0.162499,-1.406693,-1.697325,-0.450399,
+ -0.403877,-0.879274,-0.252509,-1.576196,-1.696317,-0.358146,
+ -0.171647,-0.971664,-0.162499,-1.406693,-1.697325,-0.450399,
+ -0.53858,-0.616299,-0.57455,-1.386502,-1.718441,-0.350823,
+ -0.53858,-0.616299,-0.57455,-1.386502,-1.718441,-0.350823,
+ 0.011286,0.999936,0,-1.395728,-1.723811,0,
+ 0.106808,0.99428,0,-1.610025,-1.711571,0,
+ -0.53858,-0.616299,-0.57455,-1.386502,-1.718441,-0.350823,
+ 0.106808,0.99428,0,-1.610025,-1.711571,0,
+ -0.403877,-0.879274,-0.252509,-1.576196,-1.696317,-0.358146,
+ -0.403877,-0.879274,-0.252509,-1.576196,-1.696317,-0.358146,
+ 0.106808,0.99428,0,-1.610025,-1.711571,0,
+ -0.160087,-0.987103,0,-1.799827,-1.753136,0,
+ -0.403877,-0.879274,-0.252509,-1.576196,-1.696317,-0.358146,
+ -0.160087,-0.987103,0,-1.799827,-1.753136,0,
+ -0.299215,-0.929389,-0.216116,-1.764045,-1.764987,-0.406586,
+ -0.299215,-0.929389,-0.216116,-1.764045,-1.764987,-0.406586,
+ -0.18119,-0.970212,-0.160805,-1.74779,-1.667608,-0.60634,
+ -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
+ -0.299215,-0.929389,-0.216116,-1.764045,-1.764987,-0.406586,
+ -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
+ -0.403877,-0.879274,-0.252509,-1.576196,-1.696317,-0.358146,
+ -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
+ -0.18119,-0.970212,-0.160805,-1.74779,-1.667608,-0.60634,
+ 0.008663,-0.516082,-0.856495,-1.778934,-1.550199,-0.776454,
+ 0.008663,-0.516082,-0.856495,-1.778934,-1.550199,-0.776454,
+ 0.161064,-0.731195,-0.662882,-1.659758,-1.544361,-0.788181,
+ -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
+ -0.279342,-0.940234,-0.19475,-1.601625,-1.593321,-0.605607,
+ 0.161064,-0.731195,-0.662882,-1.659758,-1.544361,-0.788181,
+ 0.08565,-0.422547,-0.902285,-1.552229,-1.555077,-0.735708,
+ 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
+ 0.137764,-0.289893,-0.947092,-2.591357,-1.510845,-0.88547,
+ 0.137206,-0.207537,-0.968557,-2.417777,-1.553136,-0.887222,
+ 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
+ 0.137206,-0.207537,-0.968557,-2.417777,-1.553136,-0.887222,
+ -0.177142,-0.976279,-0.124502,-2.508885,-1.719933,-0.721675,
+ -0.177142,-0.976279,-0.124502,-2.508885,-1.719933,-0.721675,
+ 0.137206,-0.207537,-0.968557,-2.417777,-1.553136,-0.887222,
+ 0.094371,-0.230057,-0.968591,-2.223917,-1.541268,-0.87926,
+ -0.177142,-0.976279,-0.124502,-2.508885,-1.719933,-0.721675,
+ 0.094371,-0.230057,-0.968591,-2.223917,-1.541268,-0.87926,
+ 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
+ 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
+ 0.094371,-0.230057,-0.968591,-2.223917,-1.541268,-0.87926,
+ -0.201818,-0.568242,-0.797728,-2.049879,-1.562369,-0.829319,
+ 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
+ -0.201818,-0.568242,-0.797728,-2.049879,-1.562369,-0.829319,
+ 0.35682,-0.781398,-0.511953,-2.037371,-1.73636,-0.656787,
+ 0.35682,-0.781398,-0.511953,-2.037371,-1.73636,-0.656787,
+ -0.201818,-0.568242,-0.797728,-2.049879,-1.562369,-0.829319,
+ 0.008663,-0.516082,-0.856495,-1.778934,-1.550199,-0.776454,
+ 0.35682,-0.781398,-0.511953,-2.037371,-1.73636,-0.656787,
+ 0.008663,-0.516082,-0.856495,-1.778934,-1.550199,-0.776454,
+ -0.18119,-0.970212,-0.160805,-1.74779,-1.667608,-0.60634,
+ -0.18119,-0.970212,-0.160805,-1.74779,-1.667608,-0.60634,
+ -0.299215,-0.929389,-0.216116,-1.764045,-1.764987,-0.406586,
+ 0.493535,-0.729115,-0.474147,-1.88316,-1.829718,-0.401567,
+ -0.18119,-0.970212,-0.160805,-1.74779,-1.667608,-0.60634,
+ 0.493535,-0.729115,-0.474147,-1.88316,-1.829718,-0.401567,
+ 0.04422,-0.704109,-0.708714,-1.936032,-1.829617,-0.488916,
+ 0.04422,-0.704109,-0.708714,-1.936032,-1.829617,-0.488916,
+ 0.083262,-0.787311,-0.610907,-2.027242,-1.813012,-0.555232,
+ 0.35682,-0.781398,-0.511953,-2.037371,-1.73636,-0.656787,
+ 0.04422,-0.704109,-0.708714,-1.936032,-1.829617,-0.488916,
+ 0.35682,-0.781398,-0.511953,-2.037371,-1.73636,-0.656787,
+ -0.18119,-0.970212,-0.160805,-1.74779,-1.667608,-0.60634,
+ 0.35682,-0.781398,-0.511953,-2.037371,-1.73636,-0.656787,
+ 0.083262,-0.787311,-0.610907,-2.027242,-1.813012,-0.555232,
+ 0.170756,-0.748007,-0.641349,-2.126375,-1.866497,-0.502895,
+ 0.35682,-0.781398,-0.511953,-2.037371,-1.73636,-0.656787,
+ 0.170756,-0.748007,-0.641349,-2.126375,-1.866497,-0.502895,
+ 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
+ 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
+ 0.170756,-0.748007,-0.641349,-2.126375,-1.866497,-0.502895,
+ 0.64791,-0.754869,0.101909,-2.176551,-1.873816,-0.445782,
+ 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
+ 0.64791,-0.754869,0.101909,-2.176551,-1.873816,-0.445782,
+ 0.381337,-0.795981,-0.470102,-2.317557,-1.8742,-0.470587,
+ 0.381337,-0.795981,-0.470102,-2.317557,-1.8742,-0.470587,
+ 0.183908,-0.773381,-0.606679,-2.446375,-1.893261,-0.49411,
+ 0.018755,-0.837462,-0.546174,-2.466779,-1.857679,-0.570461,
+ 0.381337,-0.795981,-0.470102,-2.317557,-1.8742,-0.470587,
+ 0.018755,-0.837462,-0.546174,-2.466779,-1.857679,-0.570461,
+ 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
+ 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
+ 0.018755,-0.837462,-0.546174,-2.466779,-1.857679,-0.570461,
+ -0.094688,-0.959937,-0.263734,-2.547737,-1.833025,-0.609321,
+ 0.430742,-0.887318,-0.164704,-2.267049,-1.753901,-0.662106,
+ -0.094688,-0.959937,-0.263734,-2.547737,-1.833025,-0.609321,
+ -0.177142,-0.976279,-0.124502,-2.508885,-1.719933,-0.721675,
+ -0.177142,-0.976279,-0.124502,-2.508885,-1.719933,-0.721675,
+ -0.094688,-0.959937,-0.263734,-2.547737,-1.833025,-0.609321,
+ 0.059023,-0.965365,-0.25414,-2.64722,-1.84401,-0.594347,
+ -0.177142,-0.976279,-0.124502,-2.508885,-1.719933,-0.721675,
+ 0.059023,-0.965365,-0.25414,-2.64722,-1.84401,-0.594347,
+ 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
+ 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
+ 0.059023,-0.965365,-0.25414,-2.64722,-1.84401,-0.594347,
+ 0.49176,-0.810764,-0.317543,-2.699966,-1.850397,-0.57007,
+ 0.048753,-0.975535,-0.21437,-2.734184,-1.717948,-0.749581,
+ 0.49176,-0.810764,-0.317543,-2.699966,-1.850397,-0.57007,
+ 0.43907,-0.579988,-0.686171,-2.811581,-1.79821,-0.712737,
+ -0.073547,-0.481419,-0.8734,-2.941731,-1.787431,-0.442574,
+ 0.099157,-0.476834,-0.873383,-2.709403,-1.879947,-0.508775,
+ -0.147229,-0.706225,-0.69251,-2.684452,-1.891207,-0.447388,
+ -0.073547,-0.481419,-0.8734,-2.941731,-1.787431,-0.442574,
+ -0.147229,-0.706225,-0.69251,-2.684452,-1.891207,-0.447388,
+ 0.0787,0.996898,0,-2.892162,-1.781087,0,
+ 0.0787,0.996898,0,-2.892162,-1.781087,0,
+ -0.147229,-0.706225,-0.69251,-2.684452,-1.891207,-0.447388,
+ 0.328486,-0.940918,0.082286,-2.614084,-1.905005,-0.404925,
+ 0.0787,0.996898,0,-2.892162,-1.781087,0,
+ 0.328486,-0.940918,0.082286,-2.614084,-1.905005,-0.404925,
+ 0.058013,0.998316,0,-2.656867,-1.853045,0,
+ 0.058013,0.998316,0,-2.656867,-1.853045,0,
+ 0.328486,-0.940918,0.082286,-2.614084,-1.905005,-0.404925,
+ -0.319475,-0.944225,-0.079844,-2.503818,-1.909806,-0.431456,
+ 0.058013,0.998316,0,-2.656867,-1.853045,0,
+ -0.319475,-0.944225,-0.079844,-2.503818,-1.909806,-0.431456,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ -0.319475,-0.944225,-0.079844,-2.503818,-1.909806,-0.431456,
+ 0.183908,-0.773381,-0.606679,-2.446375,-1.893261,-0.49411,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ 0.183908,-0.773381,-0.606679,-2.446375,-1.893261,-0.49411,
+ 0.381337,-0.795981,-0.470102,-2.317557,-1.8742,-0.470587,
+ 0.381337,-0.795981,-0.470102,-2.317557,-1.8742,-0.470587,
+ 0.64791,-0.754869,0.101909,-2.176551,-1.873816,-0.445782,
+ -0.393694,-0.919049,0.018795,-2.147113,-1.903198,-0.362462,
+ 0.381337,-0.795981,-0.470102,-2.317557,-1.8742,-0.470587,
+ -0.393694,-0.919049,0.018795,-2.147113,-1.903198,-0.362462,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ -0.393694,-0.919049,0.018795,-2.147113,-1.903198,-0.362462,
+ -0.327707,-0.94199,0.072547,-2.062725,-1.884246,-0.307336,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ -0.327707,-0.94199,0.072547,-2.062725,-1.884246,-0.307336,
+ 0.149455,0.988769,0,-2.092921,-1.839622,0,
+ 0.149455,0.988769,0,-2.092921,-1.839622,0,
+ -0.327707,-0.94199,0.072547,-2.062725,-1.884246,-0.307336,
+ -0.163041,-0.980692,0.107986,-1.946306,-1.872735,-0.344251,
+ 0.149455,0.988769,0,-2.092921,-1.839622,0,
+ -0.163041,-0.980692,0.107986,-1.946306,-1.872735,-0.344251,
+ -0.160087,-0.987103,0,-1.799827,-1.753136,0,
+ -0.160087,-0.987103,0,-1.799827,-1.753136,0,
+ -0.163041,-0.980692,0.107986,-1.946306,-1.872735,-0.344251,
+ 0.493535,-0.729115,-0.474147,-1.88316,-1.829718,-0.401567,
+ -0.160087,-0.987103,0,-1.799827,-1.753136,0,
+ 0.493535,-0.729115,-0.474147,-1.88316,-1.829718,-0.401567,
+ -0.299215,-0.929389,-0.216116,-1.764045,-1.764987,-0.406586,
+ -0.012978,-0.998326,0.056357,-3.139394,-1.687482,-0.638546,
+ 0.074429,-0.99521,0.063385,-3.120907,-1.707924,-0.431829,
+ 0.249604,-0.855993,0.452741,-3.314868,-1.599081,-0.439626,
+ -0.012978,-0.998326,0.056357,-3.139394,-1.687482,-0.638546,
+ 0.249604,-0.855993,0.452741,-3.314868,-1.599081,-0.439626,
+ 0.515412,-0.714946,0.472444,-3.304804,-1.582192,-0.643445,
+ 0.515412,-0.714946,0.472444,-3.304804,-1.582192,-0.643445,
+ 0.249604,-0.855993,0.452741,-3.314868,-1.599081,-0.439626,
+ -0.454242,-0.890878,0.000928,-3.442085,-1.48412,-0.406377,
+ 0.515412,-0.714946,0.472444,-3.304804,-1.582192,-0.643445,
+ -0.454242,-0.890878,0.000928,-3.442085,-1.48412,-0.406377,
+ -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
+ -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
+ -0.454242,-0.890878,0.000928,-3.442085,-1.48412,-0.406377,
+ -0.587869,-0.808404,-0.029894,-3.557869,-1.325941,-0.37803,
+ -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
+ -0.587869,-0.808404,-0.029894,-3.557869,-1.325941,-0.37803,
+ -0.581301,-0.608503,0.540197,-3.53391,-1.330455,-0.568246,
+ -0.581301,-0.608503,0.540197,-3.53391,-1.330455,-0.568246,
+ -0.587869,-0.808404,-0.029894,-3.557869,-1.325941,-0.37803,
+ -0.736087,-0.675142,-0.048562,-3.639586,-1.140102,-0.3338,
+ -0.581301,-0.608503,0.540197,-3.53391,-1.330455,-0.568246,
+ -0.736087,-0.675142,-0.048562,-3.639586,-1.140102,-0.3338,
+ -0.98615,-0.150918,-0.068783,-3.631179,-1.157838,-0.50561,
+ -0.98615,-0.150918,-0.068783,-3.631179,-1.157838,-0.50561,
+ -0.736087,-0.675142,-0.048562,-3.639586,-1.140102,-0.3338,
+ -0.84728,-0.52968,-0.039439,-3.686518,-0.955181,-0.320349,
+ -0.98615,-0.150918,-0.068783,-3.631179,-1.157838,-0.50561,
+ -0.84728,-0.52968,-0.039439,-3.686518,-0.955181,-0.320349,
+ -0.815087,-0.388053,-0.430171,-3.667859,-0.964867,-0.464702,
+ -0.815087,-0.388053,-0.430171,-3.667859,-0.964867,-0.464702,
+ -0.84728,-0.52968,-0.039439,-3.686518,-0.955181,-0.320349,
+ -0.945906,-0.323169,-0.028687,-3.676599,-0.729578,-0.330724,
+ -0.815087,-0.388053,-0.430171,-3.667859,-0.964867,-0.464702,
+ -0.945906,-0.323169,-0.028687,-3.676599,-0.729578,-0.330724,
+ -0.896964,-0.287307,-0.336022,-3.665774,-0.73408,-0.446286,
+ -0.896964,-0.287307,-0.336022,-3.665774,-0.73408,-0.446286,
+ -0.945906,-0.323169,-0.028687,-3.676599,-0.729578,-0.330724,
+ -0.99574,-0.082547,-0.041071,-3.616627,-0.350374,-0.338492,
+ -0.896964,-0.287307,-0.336022,-3.665774,-0.73408,-0.446286,
+ -0.99574,-0.082547,-0.041071,-3.616627,-0.350374,-0.338492,
+ -0.950882,-0.075567,-0.300188,-3.595973,-0.346391,-0.426453,
+ -0.950882,-0.075567,-0.300188,-3.595973,-0.346391,-0.426453,
+ -0.99574,-0.082547,-0.041071,-3.616627,-0.350374,-0.338492,
+ -0.993498,0.089934,-0.06981,-3.570243,-0.060093,-0.344854,
+ -0.950882,-0.075567,-0.300188,-3.595973,-0.346391,-0.426453,
+ -0.993498,0.089934,-0.06981,-3.570243,-0.060093,-0.344854,
+ -0.951862,0.098243,-0.290356,-3.529709,-0.065998,-0.437217,
+ -0.951862,0.098243,-0.290356,-3.529709,-0.065998,-0.437217,
+ -0.993498,0.089934,-0.06981,-3.570243,-0.060093,-0.344854,
+ -0.9775,0.159844,-0.137638,-3.535416,0.191408,-0.338478,
+ -0.951862,0.098243,-0.290356,-3.529709,-0.065998,-0.437217,
+ -0.9775,0.159844,-0.137638,-3.535416,0.191408,-0.338478,
+ -0.923845,0.18432,-0.335466,-3.51684,0.149002,-0.430359,
+ -0.923845,0.18432,-0.335466,-3.51684,0.149002,-0.430359,
+ -0.9775,0.159844,-0.137638,-3.535416,0.191408,-0.338478,
+ -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
+ -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
+ -0.9775,0.159844,-0.137638,-3.535416,0.191408,-0.338478,
+ 0.170833,0.9853,0,-3.55232,0.219613,0,
+ -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
+ 0.170833,0.9853,0,-3.55232,0.219613,0,
+ -0.57342,0.819261,0,-3.544507,0.467147,0,
+ 0.170833,0.9853,0,-3.55232,0.219613,0,
+ -0.9775,0.159844,-0.137638,-3.535416,0.191408,-0.338478,
+ -0.993498,0.089934,-0.06981,-3.570243,-0.060093,-0.344854,
+ 0.170833,0.9853,0,-3.55232,0.219613,0,
+ -0.993498,0.089934,-0.06981,-3.570243,-0.060093,-0.344854,
+ 0.614301,0.789071,-0.000581,-3.583763,-0.052271,0,
+ 0.098463,-0.995141,0,-3.637643,-0.356271,0,
+ -0.99574,-0.082547,-0.041071,-3.616627,-0.350374,-0.338492,
+ -0.945906,-0.323169,-0.028687,-3.676599,-0.729578,-0.330724,
+ 0.098463,-0.995141,0,-3.637643,-0.356271,0,
+ -0.945906,-0.323169,-0.028687,-3.676599,-0.729578,-0.330724,
+ 0.353735,-0.935346,0,-3.673607,-0.720796,0,
+ 0.353735,-0.935346,0,-3.673607,-0.720796,0,
+ -0.945906,-0.323169,-0.028687,-3.676599,-0.729578,-0.330724,
+ -0.84728,-0.52968,-0.039439,-3.686518,-0.955181,-0.320349,
+ 0.353735,-0.935346,0,-3.673607,-0.720796,0,
+ -0.84728,-0.52968,-0.039439,-3.686518,-0.955181,-0.320349,
+ -0.34926,-0.937026,0,-3.678793,-0.926816,0,
+ -0.34926,-0.937026,0,-3.678793,-0.926816,0,
+ -0.84728,-0.52968,-0.039439,-3.686518,-0.955181,-0.320349,
+ -0.736087,-0.675142,-0.048562,-3.639586,-1.140102,-0.3338,
+ -0.34926,-0.937026,0,-3.678793,-0.926816,0,
+ -0.736087,-0.675142,-0.048562,-3.639586,-1.140102,-0.3338,
+ -0.164,-0.98646,0,-3.650579,-1.142448,0,
+ -0.164,-0.98646,0,-3.650579,-1.142448,0,
+ -0.736087,-0.675142,-0.048562,-3.639586,-1.140102,-0.3338,
+ -0.587869,-0.808404,-0.029894,-3.557869,-1.325941,-0.37803,
+ -0.164,-0.98646,0,-3.650579,-1.142448,0,
+ -0.587869,-0.808404,-0.029894,-3.557869,-1.325941,-0.37803,
+ 0.030921,-0.999522,0,-3.522115,-1.366623,0,
+ 0.030921,-0.999522,0,-3.522115,-1.366623,0,
+ -0.587869,-0.808404,-0.029894,-3.557869,-1.325941,-0.37803,
+ -0.454242,-0.890878,0.000928,-3.442085,-1.48412,-0.406377,
+ 0.030921,-0.999522,0,-3.522115,-1.366623,0,
+ -0.454242,-0.890878,0.000928,-3.442085,-1.48412,-0.406377,
+ 0.183204,-0.983075,0,-3.417689,-1.494416,0,
+ 0.183204,-0.983075,0,-3.417689,-1.494416,0,
+ -0.454242,-0.890878,0.000928,-3.442085,-1.48412,-0.406377,
+ 0.249604,-0.855993,0.452741,-3.314868,-1.599081,-0.439626,
+ 0.183204,-0.983075,0,-3.417689,-1.494416,0,
+ 0.249604,-0.855993,0.452741,-3.314868,-1.599081,-0.439626,
+ -0.997516,0.070442,0,-3.271035,-1.609292,0,
+ -0.997516,0.070442,0,-3.271035,-1.609292,0,
+ 0.249604,-0.855993,0.452741,-3.314868,-1.599081,-0.439626,
+ 0.074429,-0.99521,0.063385,-3.120907,-1.707924,-0.431829,
+ -0.997516,0.070442,0,-3.271035,-1.609292,0,
+ 0.074429,-0.99521,0.063385,-3.120907,-1.707924,-0.431829,
+ -0.99928,-0.037933,0,-3.1103,-1.69172,0,
+ -0.99928,-0.037933,0,-3.1103,-1.69172,0,
+ 0.074429,-0.99521,0.063385,-3.120907,-1.707924,-0.431829,
+ -0.073547,-0.481419,-0.8734,-2.941731,-1.787431,-0.442574,
+ -0.99928,-0.037933,0,-3.1103,-1.69172,0,
+ -0.073547,-0.481419,-0.8734,-2.941731,-1.787431,-0.442574,
+ 0.0787,0.996898,0,-2.892162,-1.781087,0,
+ 0.614301,0.789071,-0.000581,-3.583763,-0.052271,0,
+ -0.993498,0.089934,-0.06981,-3.570243,-0.060093,-0.344854,
+ -0.99574,-0.082547,-0.041071,-3.616627,-0.350374,-0.338492,
+ 0.614301,0.789071,-0.000581,-3.583763,-0.052271,0,
+ -0.99574,-0.082547,-0.041071,-3.616627,-0.350374,-0.338492,
+ 0.098463,-0.995141,0,-3.637643,-0.356271,0,
+ -0.923845,0.18432,-0.335466,-3.51684,0.149002,-0.430359,
+ -0.908258,0.139498,-0.394471,-3.470778,-0.078218,-0.546398,
+ -0.951862,0.098243,-0.290356,-3.529709,-0.065998,-0.437217,
+ -0.951862,0.098243,-0.290356,-3.529709,-0.065998,-0.437217,
+ -0.908258,0.139498,-0.394471,-3.470778,-0.078218,-0.546398,
+ -0.985615,0.064121,-0.156369,-3.526766,-0.317542,-0.560837,
+ -0.951862,0.098243,-0.290356,-3.529709,-0.065998,-0.437217,
+ -0.985615,0.064121,-0.156369,-3.526766,-0.317542,-0.560837,
+ -0.950882,-0.075567,-0.300188,-3.595973,-0.346391,-0.426453,
+ -0.950882,-0.075567,-0.300188,-3.595973,-0.346391,-0.426453,
+ -0.985615,0.064121,-0.156369,-3.526766,-0.317542,-0.560837,
+ -0.982334,-0.04331,-0.182057,-3.569993,-0.731989,-0.649435,
+ -0.950882,-0.075567,-0.300188,-3.595973,-0.346391,-0.426453,
+ -0.982334,-0.04331,-0.182057,-3.569993,-0.731989,-0.649435,
+ -0.896964,-0.287307,-0.336022,-3.665774,-0.73408,-0.446286,
+ -0.896964,-0.287307,-0.336022,-3.665774,-0.73408,-0.446286,
+ -0.982334,-0.04331,-0.182057,-3.569993,-0.731989,-0.649435,
+ -0.995081,-0.092251,0.036114,-3.55012,-0.984868,-0.675228,
+ -0.896964,-0.287307,-0.336022,-3.665774,-0.73408,-0.446286,
+ -0.995081,-0.092251,0.036114,-3.55012,-0.984868,-0.675228,
+ -0.815087,-0.388053,-0.430171,-3.667859,-0.964867,-0.464702,
+ -0.815087,-0.388053,-0.430171,-3.667859,-0.964867,-0.464702,
+ -0.995081,-0.092251,0.036114,-3.55012,-0.984868,-0.675228,
+ -0.938884,0.007108,-0.344159,-3.492599,-1.180646,-0.692282,
+ -0.815087,-0.388053,-0.430171,-3.667859,-0.964867,-0.464702,
+ -0.938884,0.007108,-0.344159,-3.492599,-1.180646,-0.692282,
+ -0.98615,-0.150918,-0.068783,-3.631179,-1.157838,-0.50561,
+ -0.98615,-0.150918,-0.068783,-3.631179,-1.157838,-0.50561,
+ -0.938884,0.007108,-0.344159,-3.492599,-1.180646,-0.692282,
+ -0.782249,0.198377,-0.590536,-3.335942,-1.365685,-0.72459,
+ -0.98615,-0.150918,-0.068783,-3.631179,-1.157838,-0.50561,
+ -0.782249,0.198377,-0.590536,-3.335942,-1.365685,-0.72459,
+ -0.581301,-0.608503,0.540197,-3.53391,-1.330455,-0.568246,
+ -0.581301,-0.608503,0.540197,-3.53391,-1.330455,-0.568246,
+ -0.782249,0.198377,-0.590536,-3.335942,-1.365685,-0.72459,
+ -0.354058,-0.732075,0.581987,-3.387254,-1.486027,-0.672861,
+ -0.743901,0.102645,-0.66036,-3.415655,-0.308965,-0.671045,
+ -0.984416,-0.175855,-0.000915,-3.283698,-0.730967,-0.793898,
+ -0.681141,-0.040116,-0.731052,-3.438226,-0.721479,-0.728141,
+ -0.908258,0.139498,-0.394471,-3.470778,-0.078218,-0.546398,
+ -0.743901,0.102645,-0.66036,-3.415655,-0.308965,-0.671045,
+ -0.985615,0.064121,-0.156369,-3.526766,-0.317542,-0.560837,
+ -0.985615,0.064121,-0.156369,-3.526766,-0.317542,-0.560837,
+ -0.743901,0.102645,-0.66036,-3.415655,-0.308965,-0.671045,
+ -0.681141,-0.040116,-0.731052,-3.438226,-0.721479,-0.728141,
+ -0.985615,0.064121,-0.156369,-3.526766,-0.317542,-0.560837,
+ -0.681141,-0.040116,-0.731052,-3.438226,-0.721479,-0.728141,
+ -0.982334,-0.04331,-0.182057,-3.569993,-0.731989,-0.649435,
+ -0.982334,-0.04331,-0.182057,-3.569993,-0.731989,-0.649435,
+ -0.681141,-0.040116,-0.731052,-3.438226,-0.721479,-0.728141,
+ -0.605564,-0.17532,-0.776244,-3.355398,-0.969157,-0.766213,
+ -0.982334,-0.04331,-0.182057,-3.569993,-0.731989,-0.649435,
+ -0.605564,-0.17532,-0.776244,-3.355398,-0.969157,-0.766213,
+ -0.995081,-0.092251,0.036114,-3.55012,-0.984868,-0.675228,
+ -0.995081,-0.092251,0.036114,-3.55012,-0.984868,-0.675228,
+ -0.605564,-0.17532,-0.776244,-3.355398,-0.969157,-0.766213,
+ -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
+ -0.995081,-0.092251,0.036114,-3.55012,-0.984868,-0.675228,
+ -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
+ -0.938884,0.007108,-0.344159,-3.492599,-1.180646,-0.692282,
+ -0.938884,0.007108,-0.344159,-3.492599,-1.180646,-0.692282,
+ -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
+ -0.782249,0.198377,-0.590536,-3.335942,-1.365685,-0.72459,
+ -0.823768,0.005745,-0.566899,-3.27979,-1.162072,-0.784602,
+ -0.605564,-0.17532,-0.776244,-3.355398,-0.969157,-0.766213,
+ -0.838192,0.000365,-0.545375,-3.25121,-0.948205,-0.819868,
+ -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
+ -0.57342,0.819261,0,-3.544507,0.467147,0,
+ -0.989276,0.146061,0,-3.566995,0.656967,0,
+ -0.971344,0.144305,-0.188856,-3.536654,0.442277,-0.322,
+ -0.989276,0.146061,0,-3.566995,0.656967,0,
+ -0.472479,0.093412,-0.876377,-3.556552,0.704883,-0.28063,
+ -0.472479,0.093412,-0.876377,-3.556552,0.704883,-0.28063,
+ -0.989276,0.146061,0,-3.566995,0.656967,0,
+ -0.989171,0.146765,0,-3.599077,0.796217,0,
+ -0.472479,0.093412,-0.876377,-3.556552,0.704883,-0.28063,
+ -0.989171,0.146765,0,-3.599077,0.796217,0,
+ -0.43302,-0.02622,-0.901003,-3.57817,0.837714,-0.288502,
+ -0.838192,0.000365,-0.545375,-3.25121,-0.948205,-0.819868,
+ -0.605564,-0.17532,-0.776244,-3.355398,-0.969157,-0.766213,
+ -0.681141,-0.040116,-0.731052,-3.438226,-0.721479,-0.728141,
+ -0.838192,0.000365,-0.545375,-3.25121,-0.948205,-0.819868,
+ -0.681141,-0.040116,-0.731052,-3.438226,-0.721479,-0.728141,
+ -0.984416,-0.175855,-0.000915,-3.283698,-0.730967,-0.793898,
+ 0.493535,-0.729115,-0.474147,-1.88316,-1.829718,-0.401567,
+ 0.728068,-0.191899,0.658097,-1.933565,-1.993029,-0.438902,
+ 0.313565,-0.18353,0.931662,-1.971059,-1.992958,-0.500845,
+ 0.493535,-0.729115,-0.474147,-1.88316,-1.829718,-0.401567,
+ 0.313565,-0.18353,0.931662,-1.971059,-1.992958,-0.500845,
+ 0.04422,-0.704109,-0.708714,-1.936032,-1.829617,-0.488916,
+ 0.04422,-0.704109,-0.708714,-1.936032,-1.829617,-0.488916,
+ 0.313565,-0.18353,0.931662,-1.971059,-1.992958,-0.500845,
+ 0.537835,-0.193789,0.820475,-2.03574,-1.981182,-0.547873,
+ 0.04422,-0.704109,-0.708714,-1.936032,-1.829617,-0.488916,
+ 0.537835,-0.193789,0.820475,-2.03574,-1.981182,-0.547873,
+ 0.083262,-0.787311,-0.610907,-2.027242,-1.813012,-0.555232,
+ 0.083262,-0.787311,-0.610907,-2.027242,-1.813012,-0.555232,
+ 0.537835,-0.193789,0.820475,-2.03574,-1.981182,-0.547873,
+ 0.908243,-0.229695,-0.349765,-2.106039,-2.019111,-0.510759,
+ 0.083262,-0.787311,-0.610907,-2.027242,-1.813012,-0.555232,
+ 0.908243,-0.229695,-0.349765,-2.106039,-2.019111,-0.510759,
+ 0.170756,-0.748007,-0.641349,-2.126375,-1.866497,-0.502895,
+ 0.170756,-0.748007,-0.641349,-2.126375,-1.866497,-0.502895,
+ 0.908243,-0.229695,-0.349765,-2.106039,-2.019111,-0.510759,
+ 0.701057,-0.210559,-0.68131,-2.141621,-2.024301,-0.470257,
+ 0.170756,-0.748007,-0.641349,-2.126375,-1.866497,-0.502895,
+ 0.701057,-0.210559,-0.68131,-2.141621,-2.024301,-0.470257,
+ 0.64791,-0.754869,0.101909,-2.176551,-1.873816,-0.445782,
+ 0.64791,-0.754869,0.101909,-2.176551,-1.873816,-0.445782,
+ 0.701057,-0.210559,-0.68131,-2.141621,-2.024301,-0.470257,
+ 0.129519,-0.132707,-0.982656,-2.120746,-2.045137,-0.411171,
+ 0.64791,-0.754869,0.101909,-2.176551,-1.873816,-0.445782,
+ 0.129519,-0.132707,-0.982656,-2.120746,-2.045137,-0.411171,
+ -0.393694,-0.919049,0.018795,-2.147113,-1.903198,-0.362462,
+ -0.393694,-0.919049,0.018795,-2.147113,-1.903198,-0.362462,
+ 0.129519,-0.132707,-0.982656,-2.120746,-2.045137,-0.411171,
+ -0.276108,-0.088024,-0.957087,-2.060902,-2.031698,-0.372079,
+ -0.393694,-0.919049,0.018795,-2.147113,-1.903198,-0.362462,
+ -0.276108,-0.088024,-0.957087,-2.060902,-2.031698,-0.372079,
+ -0.327707,-0.94199,0.072547,-2.062725,-1.884246,-0.307336,
+ -0.327707,-0.94199,0.072547,-2.062725,-1.884246,-0.307336,
+ -0.276108,-0.088024,-0.957087,-2.060902,-2.031698,-0.372079,
+ -0.40904,-0.077842,-0.90919,-1.978344,-2.023535,-0.398257,
+ -0.327707,-0.94199,0.072547,-2.062725,-1.884246,-0.307336,
+ -0.40904,-0.077842,-0.90919,-1.978344,-2.023535,-0.398257,
+ -0.163041,-0.980692,0.107986,-1.946306,-1.872735,-0.344251,
+ -0.163041,-0.980692,0.107986,-1.946306,-1.872735,-0.344251,
+ -0.40904,-0.077842,-0.90919,-1.978344,-2.023535,-0.398257,
+ 0.728068,-0.191899,0.658097,-1.933565,-1.993029,-0.438902,
+ -0.163041,-0.980692,0.107986,-1.946306,-1.872735,-0.344251,
+ 0.728068,-0.191899,0.658097,-1.933565,-1.993029,-0.438902,
+ 0.493535,-0.729115,-0.474147,-1.88316,-1.829718,-0.401567,
+ 0.183908,-0.773381,-0.606679,-2.446375,-1.893261,-0.49411,
+ 0.50178,0.000639,0.864995,-2.499138,-2.03809,-0.504529,
+ 0.300485,0.019099,0.953595,-2.513608,-2.012858,-0.558673,
+ 0.183908,-0.773381,-0.606679,-2.446375,-1.893261,-0.49411,
+ 0.300485,0.019099,0.953595,-2.513608,-2.012858,-0.558673,
+ 0.018755,-0.837462,-0.546174,-2.466779,-1.857679,-0.570461,
+ 0.018755,-0.837462,-0.546174,-2.466779,-1.857679,-0.570461,
+ 0.300485,0.019099,0.953595,-2.513608,-2.012858,-0.558673,
+ 0.678632,-0.017853,0.734261,-2.571019,-1.995375,-0.58623,
+ 0.018755,-0.837462,-0.546174,-2.466779,-1.857679,-0.570461,
+ 0.678632,-0.017853,0.734261,-2.571019,-1.995375,-0.58623,
+ -0.094688,-0.959937,-0.263734,-2.547737,-1.833025,-0.609321,
+ -0.094688,-0.959937,-0.263734,-2.547737,-1.833025,-0.609321,
+ 0.678632,-0.017853,0.734261,-2.571019,-1.995375,-0.58623,
+ 0.687126,-0.68509,-0.241887,-2.641567,-2.003164,-0.575611,
+ -0.094688,-0.959937,-0.263734,-2.547737,-1.833025,-0.609321,
+ 0.687126,-0.68509,-0.241887,-2.641567,-2.003164,-0.575611,
+ 0.059023,-0.965365,-0.25414,-2.64722,-1.84401,-0.594347,
+ 0.059023,-0.965365,-0.25414,-2.64722,-1.84401,-0.594347,
+ 0.687126,-0.68509,-0.241887,-2.641567,-2.003164,-0.575611,
+ 0.260319,-0.908993,0.325523,-2.678971,-2.007694,-0.558395,
+ 0.059023,-0.965365,-0.25414,-2.64722,-1.84401,-0.594347,
+ 0.260319,-0.908993,0.325523,-2.678971,-2.007694,-0.558395,
+ 0.49176,-0.810764,-0.317543,-2.699966,-1.850397,-0.57007,
+ 0.49176,-0.810764,-0.317543,-2.699966,-1.850397,-0.57007,
+ 0.260319,-0.908993,0.325523,-2.678971,-2.007694,-0.558395,
+ -0.148191,-0.901516,0.40658,-2.685663,-2.028649,-0.514928,
+ 0.49176,-0.810764,-0.317543,-2.699966,-1.850397,-0.57007,
+ -0.148191,-0.901516,0.40658,-2.685663,-2.028649,-0.514928,
+ 0.099157,-0.476834,-0.873383,-2.709403,-1.879947,-0.508775,
+ 0.099157,-0.476834,-0.873383,-2.709403,-1.879947,-0.508775,
+ -0.148191,-0.901516,0.40658,-2.685663,-2.028649,-0.514928,
+ -0.443612,-0.876487,0.187028,-2.667969,-2.036634,-0.471396,
+ 0.099157,-0.476834,-0.873383,-2.709403,-1.879947,-0.508775,
+ -0.443612,-0.876487,0.187028,-2.667969,-2.036634,-0.471396,
+ -0.147229,-0.706225,-0.69251,-2.684452,-1.891207,-0.447388,
+ -0.147229,-0.706225,-0.69251,-2.684452,-1.891207,-0.447388,
+ -0.443612,-0.876487,0.187028,-2.667969,-2.036634,-0.471396,
+ -0.508388,-0.837291,-0.20121,-2.618068,-2.046419,-0.441284,
+ -0.147229,-0.706225,-0.69251,-2.684452,-1.891207,-0.447388,
+ -0.508388,-0.837291,-0.20121,-2.618068,-2.046419,-0.441284,
+ 0.328486,-0.940918,0.082286,-2.614084,-1.905005,-0.404925,
+ 0.328486,-0.940918,0.082286,-2.614084,-1.905005,-0.404925,
+ -0.508388,-0.837291,-0.20121,-2.618068,-2.046419,-0.441284,
+ -0.409829,-0.525605,-0.745506,-2.539874,-2.049824,-0.460098,
+ 0.328486,-0.940918,0.082286,-2.614084,-1.905005,-0.404925,
+ -0.409829,-0.525605,-0.745506,-2.539874,-2.049824,-0.460098,
+ -0.319475,-0.944225,-0.079844,-2.503818,-1.909806,-0.431456,
+ -0.319475,-0.944225,-0.079844,-2.503818,-1.909806,-0.431456,
+ -0.409829,-0.525605,-0.745506,-2.539874,-2.049824,-0.460098,
+ 0.50178,0.000639,0.864995,-2.499138,-2.03809,-0.504529,
+ -0.319475,-0.944225,-0.079844,-2.503818,-1.909806,-0.431456,
+ 0.50178,0.000639,0.864995,-2.499138,-2.03809,-0.504529,
+ 0.183908,-0.773381,-0.606679,-2.446375,-1.893261,-0.49411,
+ -0.276108,-0.088024,-0.957087,-2.060902,-2.031698,-0.372079,
+ 0.10009,-0.380026,-0.919545,-2.065655,-2.124623,-0.36872,
+ -0.227573,-0.361149,-0.904313,-1.985123,-2.116661,-0.394256,
+ -0.276108,-0.088024,-0.957087,-2.060902,-2.031698,-0.372079,
+ -0.227573,-0.361149,-0.904313,-1.985123,-2.116661,-0.394256,
+ -0.40904,-0.077842,-0.90919,-1.978344,-2.023535,-0.398257,
+ 0.129519,-0.132707,-0.982656,-2.120746,-2.045137,-0.411171,
+ 0.547733,-0.470267,-0.691981,-2.12403,-2.137733,-0.406853,
+ 0.10009,-0.380026,-0.919545,-2.065655,-2.124623,-0.36872,
+ 0.129519,-0.132707,-0.982656,-2.120746,-2.045137,-0.411171,
+ 0.10009,-0.380026,-0.919545,-2.065655,-2.124623,-0.36872,
+ -0.276108,-0.088024,-0.957087,-2.060902,-2.031698,-0.372079,
+ 0.701057,-0.210559,-0.68131,-2.141621,-2.024301,-0.470257,
+ -0.071182,-0.950841,-0.301389,-2.144393,-2.117408,-0.464489,
+ 0.547733,-0.470267,-0.691981,-2.12403,-2.137733,-0.406853,
+ 0.701057,-0.210559,-0.68131,-2.141621,-2.024301,-0.470257,
+ 0.547733,-0.470267,-0.691981,-2.12403,-2.137733,-0.406853,
+ 0.129519,-0.132707,-0.982656,-2.120746,-2.045137,-0.411171,
+ 0.908243,-0.229695,-0.349765,-2.106039,-2.019111,-0.510759,
+ 0.216748,0.039315,-0.975436,-2.109684,-2.112345,-0.503997,
+ -0.071182,-0.950841,-0.301389,-2.144393,-2.117408,-0.464489,
+ 0.908243,-0.229695,-0.349765,-2.106039,-2.019111,-0.510759,
+ -0.071182,-0.950841,-0.301389,-2.144393,-2.117408,-0.464489,
+ 0.701057,-0.210559,-0.68131,-2.141621,-2.024301,-0.470257,
+ 0.537835,-0.193789,0.820475,-2.03574,-1.981182,-0.547873,
+ 0.555949,0.246865,-0.793712,-2.04111,-2.075348,-0.540201,
+ 0.216748,0.039315,-0.975436,-2.109684,-2.112345,-0.503997,
+ 0.537835,-0.193789,0.820475,-2.03574,-1.981182,-0.547873,
+ 0.216748,0.039315,-0.975436,-2.109684,-2.112345,-0.503997,
+ 0.908243,-0.229695,-0.349765,-2.106039,-2.019111,-0.510759,
+ 0.313565,-0.18353,0.931662,-1.971059,-1.992958,-0.500845,
+ 0.768311,0.202351,-0.60725,-1.978016,-2.086834,-0.494327,
+ 0.555949,0.246865,-0.793712,-2.04111,-2.075348,-0.540201,
+ 0.313565,-0.18353,0.931662,-1.971059,-1.992958,-0.500845,
+ 0.555949,0.246865,-0.793712,-2.04111,-2.075348,-0.540201,
+ 0.537835,-0.193789,0.820475,-2.03574,-1.981182,-0.547873,
+ 0.728068,-0.191899,0.658097,-1.933565,-1.993029,-0.438902,
+ 0.833232,0.046883,-0.550932,-1.941442,-2.086904,-0.433904,
+ 0.768311,0.202351,-0.60725,-1.978016,-2.086834,-0.494327,
+ 0.728068,-0.191899,0.658097,-1.933565,-1.993029,-0.438902,
+ 0.768311,0.202351,-0.60725,-1.978016,-2.086834,-0.494327,
+ 0.313565,-0.18353,0.931662,-1.971059,-1.992958,-0.500845,
+ -0.40904,-0.077842,-0.90919,-1.978344,-2.023535,-0.398257,
+ -0.227573,-0.361149,-0.904313,-1.985123,-2.116661,-0.394256,
+ 0.833232,0.046883,-0.550932,-1.941442,-2.086904,-0.433904,
+ -0.40904,-0.077842,-0.90919,-1.978344,-2.023535,-0.398257,
+ 0.833232,0.046883,-0.550932,-1.941442,-2.086904,-0.433904,
+ 0.728068,-0.191899,0.658097,-1.933565,-1.993029,-0.438902,
+ -0.409829,-0.525605,-0.745506,-2.539874,-2.049824,-0.460098,
+ 0.213243,-0.278119,-0.936578,-2.552923,-2.142304,-0.454579,
+ 0.587809,-0.328911,-0.73912,-2.513187,-2.130859,-0.49792,
+ -0.409829,-0.525605,-0.745506,-2.539874,-2.049824,-0.460098,
+ 0.587809,-0.328911,-0.73912,-2.513187,-2.130859,-0.49792,
+ 0.50178,0.000639,0.864995,-2.499138,-2.03809,-0.504529,
+ -0.508388,-0.837291,-0.20121,-2.618068,-2.046419,-0.441284,
+ 0.794828,0.083381,-0.601079,-2.629199,-2.138983,-0.436227,
+ 0.213243,-0.278119,-0.936578,-2.552923,-2.142304,-0.454579,
+ -0.508388,-0.837291,-0.20121,-2.618068,-2.046419,-0.441284,
+ 0.213243,-0.278119,-0.936578,-2.552923,-2.142304,-0.454579,
+ -0.409829,-0.525605,-0.745506,-2.539874,-2.049824,-0.460098,
+ -0.443612,-0.876487,0.187028,-2.667969,-2.036634,-0.471396,
+ 0.873201,-0.04546,-0.485236,-2.677875,-2.129439,-0.4656,
+ 0.794828,0.083381,-0.601079,-2.629199,-2.138983,-0.436227,
+ -0.443612,-0.876487,0.187028,-2.667969,-2.036634,-0.471396,
+ 0.794828,0.083381,-0.601079,-2.629199,-2.138983,-0.436227,
+ -0.508388,-0.837291,-0.20121,-2.618068,-2.046419,-0.441284,
+ -0.148191,-0.901516,0.40658,-2.685663,-2.028649,-0.514928,
+ 0.829377,-0.173624,-0.531026,-2.695135,-2.12165,-0.508064,
+ 0.873201,-0.04546,-0.485236,-2.677875,-2.129439,-0.4656,
+ -0.148191,-0.901516,0.40658,-2.685663,-2.028649,-0.514928,
+ 0.873201,-0.04546,-0.485236,-2.677875,-2.129439,-0.4656,
+ -0.443612,-0.876487,0.187028,-2.667969,-2.036634,-0.471396,
+ 0.260319,-0.908993,0.325523,-2.678971,-2.007694,-0.558395,
+ 0.506864,-0.193035,-0.840135,-2.688607,-2.101208,-0.550465,
+ 0.829377,-0.173624,-0.531026,-2.695135,-2.12165,-0.508064,
+ 0.260319,-0.908993,0.325523,-2.678971,-2.007694,-0.558395,
+ 0.829377,-0.173624,-0.531026,-2.695135,-2.12165,-0.508064,
+ -0.148191,-0.901516,0.40658,-2.685663,-2.028649,-0.514928,
+ 0.687126,-0.68509,-0.241887,-2.641567,-2.003164,-0.575611,
+ 0.166377,-0.157108,-0.973466,-2.65212,-2.09679,-0.567258,
+ 0.506864,-0.193035,-0.840135,-2.688607,-2.101208,-0.550465,
+ 0.687126,-0.68509,-0.241887,-2.641567,-2.003164,-0.575611,
+ 0.506864,-0.193035,-0.840135,-2.688607,-2.101208,-0.550465,
+ 0.260319,-0.908993,0.325523,-2.678971,-2.007694,-0.558395,
+ 0.678632,-0.017853,0.734261,-2.571019,-1.995375,-0.58623,
+ 0.054863,-0.132815,-0.989621,-2.583303,-2.089191,-0.577616,
+ 0.166377,-0.157108,-0.973466,-2.65212,-2.09679,-0.567258,
+ 0.678632,-0.017853,0.734261,-2.571019,-1.995375,-0.58623,
+ 0.166377,-0.157108,-0.973466,-2.65212,-2.09679,-0.567258,
+ 0.687126,-0.68509,-0.241887,-2.641567,-2.003164,-0.575611,
+ 0.300485,0.019099,0.953595,-2.513608,-2.012858,-0.558673,
+ 0.238844,0.101951,-0.965691,-2.527301,-2.106246,-0.550735,
+ 0.054863,-0.132815,-0.989621,-2.583303,-2.089191,-0.577616,
+ 0.300485,0.019099,0.953595,-2.513608,-2.012858,-0.558673,
+ 0.054863,-0.132815,-0.989621,-2.583303,-2.089191,-0.577616,
+ 0.678632,-0.017853,0.734261,-2.571019,-1.995375,-0.58623,
+ 0.50178,0.000639,0.864995,-2.499138,-2.03809,-0.504529,
+ 0.587809,-0.328911,-0.73912,-2.513187,-2.130859,-0.49792,
+ 0.238844,0.101951,-0.965691,-2.527301,-2.106246,-0.550735,
+ 0.50178,0.000639,0.864995,-2.499138,-2.03809,-0.504529,
+ 0.238844,0.101951,-0.965691,-2.527301,-2.106246,-0.550735,
+ 0.300485,0.019099,0.953595,-2.513608,-2.012858,-0.558673,
+ 0.768311,0.202351,-0.60725,-1.978016,-2.086834,-0.494327,
+ 0.833232,0.046883,-0.550932,-1.941442,-2.086904,-0.433904,
+ 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
+ 0.555949,0.246865,-0.793712,-2.04111,-2.075348,-0.540201,
+ 0.768311,0.202351,-0.60725,-1.978016,-2.086834,-0.494327,
+ 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
+ 0.216748,0.039315,-0.975436,-2.109684,-2.112345,-0.503997,
+ 0.555949,0.246865,-0.793712,-2.04111,-2.075348,-0.540201,
+ 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
+ -0.071182,-0.950841,-0.301389,-2.144393,-2.117408,-0.464489,
+ 0.216748,0.039315,-0.975436,-2.109684,-2.112345,-0.503997,
+ 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
+ 0.547733,-0.470267,-0.691981,-2.12403,-2.137733,-0.406853,
+ -0.071182,-0.950841,-0.301389,-2.144393,-2.117408,-0.464489,
+ 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
+ 0.10009,-0.380026,-0.919545,-2.065655,-2.124623,-0.36872,
+ 0.547733,-0.470267,-0.691981,-2.12403,-2.137733,-0.406853,
+ 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
+ -0.227573,-0.361149,-0.904313,-1.985123,-2.116661,-0.394256,
+ 0.10009,-0.380026,-0.919545,-2.065655,-2.124623,-0.36872,
+ 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
+ 0.833232,0.046883,-0.550932,-1.941442,-2.086904,-0.433904,
+ -0.227573,-0.361149,-0.904313,-1.985123,-2.116661,-0.394256,
+ 0.604307,0.204357,-0.770098,-2.048681,-2.165282,-0.450843,
+ 0.238844,0.101951,-0.965691,-2.527301,-2.106246,-0.550735,
+ 0.587809,-0.328911,-0.73912,-2.513187,-2.130859,-0.49792,
+ 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
+ 0.054863,-0.132815,-0.989621,-2.583303,-2.089191,-0.577616,
+ 0.238844,0.101951,-0.965691,-2.527301,-2.106246,-0.550735,
+ 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
+ 0.166377,-0.157108,-0.973466,-2.65212,-2.09679,-0.567258,
+ 0.054863,-0.132815,-0.989621,-2.583303,-2.089191,-0.577616,
+ 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
+ 0.506864,-0.193035,-0.840135,-2.688607,-2.101208,-0.550465,
+ 0.166377,-0.157108,-0.973466,-2.65212,-2.09679,-0.567258,
+ 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
+ 0.829377,-0.173624,-0.531026,-2.695135,-2.12165,-0.508064,
+ 0.506864,-0.193035,-0.840135,-2.688607,-2.101208,-0.550465,
+ 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
+ 0.873201,-0.04546,-0.485236,-2.677875,-2.129439,-0.4656,
+ 0.829377,-0.173624,-0.531026,-2.695135,-2.12165,-0.508064,
+ 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
+ 0.794828,0.083381,-0.601079,-2.629199,-2.138983,-0.436227,
+ 0.873201,-0.04546,-0.485236,-2.677875,-2.129439,-0.4656,
+ 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
+ 0.213243,-0.278119,-0.936578,-2.552923,-2.142304,-0.454579,
+ 0.794828,0.083381,-0.601079,-2.629199,-2.138983,-0.436227,
+ 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
+ 0.587809,-0.328911,-0.73912,-2.513187,-2.130859,-0.49792,
+ 0.213243,-0.278119,-0.936578,-2.552923,-2.142304,-0.454579,
+ 0.02054,-0.128179,-0.991538,-2.603284,-2.176802,-0.510638,
+ -0.012978,-0.998326,0.056357,-3.139394,-1.687482,-0.638546,
+ 0.579344,-0.339433,0.741044,-3.008323,-1.759271,-0.655672,
+ -0.073547,-0.481419,-0.8734,-2.941731,-1.787431,-0.442574,
+ -0.012978,-0.998326,0.056357,-3.139394,-1.687482,-0.638546,
+ -0.073547,-0.481419,-0.8734,-2.941731,-1.787431,-0.442574,
+ 0.074429,-0.99521,0.063385,-3.120907,-1.707924,-0.431829,
+ 0.579344,-0.339433,0.741044,-3.008323,-1.759271,-0.655672,
+ 0.099157,-0.476834,-0.873383,-2.709403,-1.879947,-0.508775,
+ -0.073547,-0.481419,-0.8734,-2.941731,-1.787431,-0.442574,
+ 0.579344,-0.339433,0.741044,-3.008323,-1.759271,-0.655672,
+ 0.43907,-0.579988,-0.686171,-2.811581,-1.79821,-0.712737,
+ 0.49176,-0.810764,-0.317543,-2.699966,-1.850397,-0.57007,
+ 0.579344,-0.339433,0.741044,-3.008323,-1.759271,-0.655672,
+ 0.49176,-0.810764,-0.317543,-2.699966,-1.850397,-0.57007,
+ 0.099157,-0.476834,-0.873383,-2.709403,-1.879947,-0.508775,
+ -0.822733,0.223687,0.522565,-2.306662,-1.116976,0.961238,
+ -0.950882,-0.075567,0.300188,-2.119856,-1.1288,0.97096,
+ -0.619245,-0.050391,0.783579,-2.033406,-0.91003,0.96422,
+ -0.993498,0.089934,0.06981,-2.031698,-1.097344,0.966701,
+ -0.619245,-0.050391,0.783579,-2.033406,-0.91003,0.96422,
+ -0.950882,-0.075567,0.300188,-2.119856,-1.1288,0.97096,
+ -0.379807,-0.084066,0.921238,-1.782298,-1.020581,0.943381,
+ -0.619245,-0.050391,0.783579,-2.033406,-0.91003,0.96422,
+ -0.993498,0.089934,0.06981,-2.031698,-1.097344,0.966701,
+ -0.9775,0.159844,0.137638,-2.337617,-1.334842,0.966761,
+ -0.822733,0.223687,0.522565,-2.306662,-1.116976,0.961238,
+ -0.951862,0.098243,0.290356,-2.462835,-1.3055,0.966395,
+ -0.923845,0.18432,0.335466,-2.161843,-1.325837,0.957465,
+ -0.950882,-0.075567,0.300188,-2.119856,-1.1288,0.97096,
+ -0.822733,0.223687,0.522565,-2.306662,-1.116976,0.961238,
+ -0.923845,0.18432,0.335466,-2.161843,-1.325837,0.957465,
+ -0.822733,0.223687,0.522565,-2.306662,-1.116976,0.961238,
+ -0.9775,0.159844,0.137638,-2.337617,-1.334842,0.966761,
+ -0.971344,0.144305,0.188856,-2.042059,-1.312976,0.940911,
+ -0.993498,0.089934,0.06981,-2.031698,-1.097344,0.966701,
+ -0.950882,-0.075567,0.300188,-2.119856,-1.1288,0.97096,
+ -0.971344,0.144305,0.188856,-2.042059,-1.312976,0.940911,
+ -0.950882,-0.075567,0.300188,-2.119856,-1.1288,0.97096,
+ -0.923845,0.18432,0.335466,-2.161843,-1.325837,0.957465,
+ -0.908258,0.139498,0.394471,-1.776785,-1.275107,0.914703,
+ -0.379807,-0.084066,0.921238,-1.782298,-1.020581,0.943381,
+ -0.993498,0.089934,0.06981,-2.031698,-1.097344,0.966701,
+ -0.908258,0.139498,0.394471,-1.776785,-1.275107,0.914703,
+ -0.993498,0.089934,0.06981,-2.031698,-1.097344,0.966701,
+ -0.971344,0.144305,0.188856,-2.042059,-1.312976,0.940911,
+ -0.985615,0.064121,0.156369,-1.709172,-1.283232,0.897427,
+ -0.379807,-0.084066,0.921238,-1.782298,-1.020581,0.943381,
+ -0.908258,0.139498,0.394471,-1.776785,-1.275107,0.914703,
+ -0.982334,-0.04331,0.182057,-1.456655,-1.295527,0.89424,
+ -0.379807,-0.084066,0.921238,-1.782298,-1.020581,0.943381,
+ -0.985615,0.064121,0.156369,-1.709172,-1.283232,0.897427,
+ -0.938884,0.007108,0.344159,-2.417777,-1.553136,0.887222,
+ -0.9775,0.159844,0.137638,-2.337617,-1.334842,0.966761,
+ -0.951862,0.098243,0.290356,-2.462835,-1.3055,0.966395,
+ -0.938884,0.007108,0.344159,-2.417777,-1.553136,0.887222,
+ -0.951862,0.098243,0.290356,-2.462835,-1.3055,0.966395,
+ -0.995081,-0.092251,-0.036114,-2.591357,-1.510845,0.88547,
+ -0.782249,0.198377,0.590536,-2.223917,-1.541268,0.87926,
+ -0.923845,0.18432,0.335466,-2.161843,-1.325837,0.957465,
+ -0.9775,0.159844,0.137638,-2.337617,-1.334842,0.966761,
+ -0.782249,0.198377,0.590536,-2.223917,-1.541268,0.87926,
+ -0.9775,0.159844,0.137638,-2.337617,-1.334842,0.966761,
+ -0.938884,0.007108,0.344159,-2.417777,-1.553136,0.887222,
+ -0.743901,0.102645,0.66036,-2.049879,-1.562369,0.829319,
+ -0.971344,0.144305,0.188856,-2.042059,-1.312976,0.940911,
+ -0.923845,0.18432,0.335466,-2.161843,-1.325837,0.957465,
+ -0.743901,0.102645,0.66036,-2.049879,-1.562369,0.829319,
+ -0.923845,0.18432,0.335466,-2.161843,-1.325837,0.957465,
+ -0.782249,0.198377,0.590536,-2.223917,-1.541268,0.87926,
+ -0.605564,-0.17532,0.776244,-1.778934,-1.550199,0.776454,
+ -0.681141,-0.040116,0.731052,-1.777628,-1.473076,0.845827,
+ -0.971344,0.144305,0.188856,-2.042059,-1.312976,0.940911,
+ -0.605564,-0.17532,0.776244,-1.778934,-1.550199,0.776454,
+ -0.971344,0.144305,0.188856,-2.042059,-1.312976,0.940911,
+ -0.743901,0.102645,0.66036,-2.049879,-1.562369,0.829319,
+ -0.908258,0.139498,0.394471,-1.776785,-1.275107,0.914703,
+ -0.971344,0.144305,0.188856,-2.042059,-1.312976,0.940911,
+ -0.681141,-0.040116,0.731052,-1.777628,-1.473076,0.845827,
+ -0.823768,0.005745,0.566899,-1.686329,-1.414405,0.869373,
+ -0.985615,0.064121,0.156369,-1.709172,-1.283232,0.897427,
+ -0.908258,0.139498,0.394471,-1.776785,-1.275107,0.914703,
+ -0.823768,0.005745,0.566899,-1.686329,-1.414405,0.869373,
+ -0.908258,0.139498,0.394471,-1.776785,-1.275107,0.914703,
+ -0.681141,-0.040116,0.731052,-1.777628,-1.473076,0.845827,
+ -0.838192,0.000364,0.545375,-1.592146,-1.408592,0.838483,
+ -0.982334,-0.04331,0.182057,-1.456655,-1.295527,0.89424,
+ -0.985615,0.064121,0.156369,-1.709172,-1.283232,0.897427,
+ -0.838192,0.000364,0.545375,-1.592146,-1.408592,0.838483,
+ -0.985615,0.064121,0.156369,-1.709172,-1.283232,0.897427,
+ -0.823768,0.005745,0.566899,-1.686329,-1.414405,0.869373,
+ -0.472479,0.093413,0.876377,-1.552229,-1.555077,0.735708,
+ -0.982334,-0.04331,0.182057,-1.456655,-1.295527,0.89424,
+ -0.838192,0.000364,0.545375,-1.592146,-1.408592,0.838483,
+ -0.838192,0.000364,0.545375,-1.592146,-1.408592,0.838483,
+ -0.43302,-0.02622,0.901003,-1.659758,-1.544361,0.788181,
+ -0.472479,0.093413,0.876377,-1.552229,-1.555077,0.735708,
+ -0.823768,0.005745,0.566899,-1.686329,-1.414405,0.869373,
+ -0.43302,-0.02622,0.901003,-1.659758,-1.544361,0.788181,
+ -0.838192,0.000364,0.545375,-1.592146,-1.408592,0.838483,
+ -0.681141,-0.040116,0.731052,-1.777628,-1.473076,0.845827,
+ -0.605564,-0.17532,0.776244,-1.778934,-1.550199,0.776454,
+ -0.43302,-0.02622,0.901003,-1.659758,-1.544361,0.788181,
+ -0.681141,-0.040116,0.731052,-1.777628,-1.473076,0.845827,
+ -0.43302,-0.02622,0.901003,-1.659758,-1.544361,0.788181,
+ -0.823768,0.005745,0.566899,-1.686329,-1.414405,0.869373,
+ -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
+ -0.311485,0.082882,0.94663,-1.366873,-1.340211,0.907567,
+ -0.982334,-0.04331,0.182057,-1.456655,-1.295527,0.89424,
+ -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
+ -0.982334,-0.04331,0.182057,-1.456655,-1.295527,0.89424,
+ -0.472479,0.093413,0.876377,-1.552229,-1.555077,0.735708,
+ -0.809154,0.004832,0.587577,-1.200688,-1.577575,0.799188,
+ -0.742985,0.015712,0.669123,-1.198513,-1.456102,0.885435,
+ -0.311485,0.082882,0.94663,-1.366873,-1.340211,0.907567,
+ -0.809154,0.004832,0.587577,-1.200688,-1.577575,0.799188,
+ -0.311485,0.082882,0.94663,-1.366873,-1.340211,0.907567,
+ -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
+ -0.02449,0.224062,0.974267,-0.953236,-1.545941,0.89918,
+ -0.742985,0.015712,0.669123,-1.198513,-1.456102,0.885435,
+ -0.809154,0.004832,0.587577,-1.200688,-1.577575,0.799188,
+ -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
+ 0.924702,-0.311563,0.218757,-1.480217,-1.6566,0.606638,
+ -0.587909,-0.233166,0.774594,-1.397474,-1.693815,0.570541,
+ -0.472479,0.093413,0.876377,-1.552229,-1.555077,0.735708,
+ 0.924702,-0.311563,0.218757,-1.480217,-1.6566,0.606638,
+ -0.285709,0.130064,0.949449,-1.376186,-1.661988,0.718954,
+ 0.73827,-0.277136,0.614942,-1.601625,-1.593321,0.605607,
+ 0.924702,-0.311563,0.218757,-1.480217,-1.6566,0.606638,
+ -0.472479,0.093413,0.876377,-1.552229,-1.555077,0.735708,
+ 0.366416,-0.175098,0.913827,-1.519339,-1.653776,0.501741,
+ 0.924702,-0.311563,0.218757,-1.480217,-1.6566,0.606638,
+ 0.73827,-0.277136,0.614942,-1.601625,-1.593321,0.605607,
+ 0.023392,-0.110333,0.993619,-1.406693,-1.697325,0.450399,
+ -0.587909,-0.233166,0.774594,-1.397474,-1.693815,0.570541,
+ 0.924702,-0.311563,0.218757,-1.480217,-1.6566,0.606638,
+ 0.023392,-0.110333,0.993619,-1.406693,-1.697325,0.450399,
+ 0.924702,-0.311563,0.218757,-1.480217,-1.6566,0.606638,
+ 0.366416,-0.175098,0.913827,-1.519339,-1.653776,0.501741,
+ -0.157802,-0.148625,0.976222,-1.576196,-1.696317,0.358146,
+ 0.366416,-0.175098,0.913827,-1.519339,-1.653776,0.501741,
+ 0.73827,-0.277136,0.614942,-1.601625,-1.593321,0.605607,
+ -0.279485,0.127803,0.951606,-1.386502,-1.718441,0.350823,
+ 0.023392,-0.110333,0.993619,-1.406693,-1.697325,0.450399,
+ 0.366416,-0.175098,0.913827,-1.519339,-1.653776,0.501741,
+ -0.279485,0.127803,0.951606,-1.386502,-1.718441,0.350823,
+ 0.366416,-0.175098,0.913827,-1.519339,-1.653776,0.501741,
+ -0.157802,-0.148625,0.976222,-1.576196,-1.696317,0.358146,
+ -0.157802,-0.148625,0.976222,-1.576196,-1.696317,0.358146,
+ 0.106808,0.99428,0,-1.610025,-1.711571,0,
+ 0.011286,0.999936,0,-1.395728,-1.723811,0,
+ -0.157802,-0.148625,0.976222,-1.576196,-1.696317,0.358146,
+ 0.011286,0.999936,0,-1.395728,-1.723811,0,
+ -0.279485,0.127803,0.951606,-1.386502,-1.718441,0.350823,
+ -0.661097,-0.258238,0.70446,-1.764045,-1.764987,0.406586,
+ -0.160087,-0.987103,0,-1.799827,-1.753136,0,
+ 0.106808,0.99428,0,-1.610025,-1.711571,0,
+ -0.661097,-0.258238,0.70446,-1.764045,-1.764987,0.406586,
+ 0.106808,0.99428,0,-1.610025,-1.711571,0,
+ -0.157802,-0.148625,0.976222,-1.576196,-1.696317,0.358146,
+ -0.157802,-0.148625,0.976222,-1.576196,-1.696317,0.358146,
+ 0.73827,-0.277136,0.614942,-1.601625,-1.593321,0.605607,
+ -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
+ -0.157802,-0.148625,0.976222,-1.576196,-1.696317,0.358146,
+ -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
+ -0.661097,-0.258238,0.70446,-1.764045,-1.764987,0.406586,
+ -0.605564,-0.17532,0.776244,-1.778934,-1.550199,0.776454,
+ -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
+ 0.73827,-0.277136,0.614942,-1.601625,-1.593321,0.605607,
+ 0.73827,-0.277136,0.614942,-1.601625,-1.593321,0.605607,
+ -0.43302,-0.02622,0.901003,-1.659758,-1.544361,0.788181,
+ -0.605564,-0.17532,0.776244,-1.778934,-1.550199,0.776454,
+ -0.472479,0.093413,0.876377,-1.552229,-1.555077,0.735708,
+ -0.43302,-0.02622,0.901003,-1.659758,-1.544361,0.788181,
+ 0.73827,-0.277136,0.614942,-1.601625,-1.593321,0.605607,
+ 0.772916,-0.305378,0.556188,-2.508885,-1.719933,0.721675,
+ -0.938884,0.007108,0.344159,-2.417777,-1.553136,0.887222,
+ -0.995081,-0.092251,-0.036114,-2.591357,-1.510845,0.88547,
+ 0.772916,-0.305378,0.556188,-2.508885,-1.719933,0.721675,
+ -0.995081,-0.092251,-0.036114,-2.591357,-1.510845,0.88547,
+ 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
+ 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
+ -0.782249,0.198377,0.590536,-2.223917,-1.541268,0.87926,
+ -0.938884,0.007108,0.344159,-2.417777,-1.553136,0.887222,
+ 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
+ -0.938884,0.007108,0.344159,-2.417777,-1.553136,0.887222,
+ 0.772916,-0.305378,0.556188,-2.508885,-1.719933,0.721675,
+ 0.02992,-0.202031,0.978922,-2.037371,-1.73636,0.656787,
+ -0.743901,0.102645,0.66036,-2.049879,-1.562369,0.829319,
+ -0.782249,0.198377,0.590536,-2.223917,-1.541268,0.87926,
+ 0.02992,-0.202031,0.978922,-2.037371,-1.73636,0.656787,
+ -0.782249,0.198377,0.590536,-2.223917,-1.541268,0.87926,
+ 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
+ -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
+ -0.605564,-0.17532,0.776244,-1.778934,-1.550199,0.776454,
+ -0.743901,0.102645,0.66036,-2.049879,-1.562369,0.829319,
+ -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
+ -0.743901,0.102645,0.66036,-2.049879,-1.562369,0.829319,
+ 0.02992,-0.202031,0.978922,-2.037371,-1.73636,0.656787,
+ -0.498756,-0.224101,0.83727,-1.936032,-1.829617,0.488916,
+ -0.239734,-0.173966,0.955125,-1.88316,-1.829718,0.401567,
+ -0.661097,-0.258238,0.70446,-1.764045,-1.764987,0.406586,
+ -0.498756,-0.224101,0.83727,-1.936032,-1.829617,0.488916,
+ -0.661097,-0.258238,0.70446,-1.764045,-1.764987,0.406586,
+ -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
+ -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
+ 0.02992,-0.202031,0.978922,-2.037371,-1.73636,0.656787,
+ -0.759627,-0.28527,0.584455,-2.027242,-1.813012,0.555232,
+ -0.632119,-0.359381,0.686492,-1.74779,-1.667608,0.60634,
+ -0.759627,-0.28527,0.584455,-2.027242,-1.813012,0.555232,
+ -0.498756,-0.224101,0.83727,-1.936032,-1.829617,0.488916,
+ 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
+ -0.672688,-0.442616,0.592944,-2.126375,-1.866497,0.502895,
+ -0.759627,-0.28527,0.584455,-2.027242,-1.813012,0.555232,
+ 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
+ -0.759627,-0.28527,0.584455,-2.027242,-1.813012,0.555232,
+ 0.02992,-0.202031,0.978922,-2.037371,-1.73636,0.656787,
+ 0.80128,-0.303744,0.515451,-2.317557,-1.8742,0.470587,
+ 0.954473,-0.270031,0.126745,-2.176551,-1.873816,0.445782,
+ -0.672688,-0.442616,0.592944,-2.126375,-1.866497,0.502895,
+ 0.80128,-0.303744,0.515451,-2.317557,-1.8742,0.470587,
+ -0.672688,-0.442616,0.592944,-2.126375,-1.866497,0.502895,
+ 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
+ 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
+ 0.080262,-0.270606,0.959339,-2.466779,-1.857679,0.570461,
+ 0.441315,-0.29978,0.845797,-2.446375,-1.893261,0.49411,
+ 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
+ 0.441315,-0.29978,0.845797,-2.446375,-1.893261,0.49411,
+ 0.80128,-0.303744,0.515451,-2.317557,-1.8742,0.470587,
+ 0.772916,-0.305378,0.556188,-2.508885,-1.719933,0.721675,
+ -0.247433,-0.24804,0.936618,-2.547737,-1.833025,0.609321,
+ 0.080262,-0.270606,0.959339,-2.466779,-1.857679,0.570461,
+ 0.772916,-0.305378,0.556188,-2.508885,-1.719933,0.721675,
+ 0.080262,-0.270606,0.959339,-2.466779,-1.857679,0.570461,
+ 0.38578,-0.259547,0.88533,-2.267049,-1.753901,0.662106,
+ 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
+ -0.587844,-0.244917,0.771009,-2.64722,-1.84401,0.594347,
+ -0.247433,-0.24804,0.936618,-2.547737,-1.833025,0.609321,
+ 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
+ -0.247433,-0.24804,0.936618,-2.547737,-1.833025,0.609321,
+ 0.772916,-0.305378,0.556188,-2.508885,-1.719933,0.721675,
+ -0.732521,-0.474279,0.488336,-2.811581,-1.79821,0.712737,
+ -0.845196,-0.27877,0.455994,-2.699966,-1.850397,0.57007,
+ -0.587844,-0.244917,0.771009,-2.64722,-1.84401,0.594347,
+ -0.732521,-0.474279,0.488336,-2.811581,-1.79821,0.712737,
+ -0.587844,-0.244917,0.771009,-2.64722,-1.84401,0.594347,
+ 0.942117,-0.292664,0.163592,-2.734184,-1.717948,0.749581,
+ 0.0787,0.996898,0,-2.892162,-1.781087,0,
+ 0.975634,-0.187231,-0.114377,-2.684452,-1.891207,0.447388,
+ 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
+ 0.0787,0.996898,0,-2.892162,-1.781087,0,
+ 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
+ 0.999491,-0.02584,0.01873,-2.941731,-1.787431,0.442574,
+ 0.058013,0.998316,0,-2.656867,-1.853045,0,
+ 0.985192,-0.12583,-0.116459,-2.614084,-1.905005,0.404925,
+ 0.975634,-0.187231,-0.114377,-2.684452,-1.891207,0.447388,
+ 0.058013,0.998316,0,-2.656867,-1.853045,0,
+ 0.975634,-0.187231,-0.114377,-2.684452,-1.891207,0.447388,
+ 0.0787,0.996898,0,-2.892162,-1.781087,0,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ 0.996811,-0.048518,-0.063355,-2.503818,-1.909806,0.431456,
+ 0.985192,-0.12583,-0.116459,-2.614084,-1.905005,0.404925,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ 0.985192,-0.12583,-0.116459,-2.614084,-1.905005,0.404925,
+ 0.058013,0.998316,0,-2.656867,-1.853045,0,
+ 0.80128,-0.303744,0.515451,-2.317557,-1.8742,0.470587,
+ 0.441315,-0.29978,0.845797,-2.446375,-1.893261,0.49411,
+ 0.996811,-0.048518,-0.063355,-2.503818,-1.909806,0.431456,
+ 0.80128,-0.303744,0.515451,-2.317557,-1.8742,0.470587,
+ 0.996811,-0.048518,-0.063355,-2.503818,-1.909806,0.431456,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ 0.957938,-0.285979,0.023877,-2.147113,-1.903198,0.362462,
+ 0.954473,-0.270031,0.126745,-2.176551,-1.873816,0.445782,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ 0.954473,-0.270031,0.126745,-2.176551,-1.873816,0.445782,
+ 0.80128,-0.303744,0.515451,-2.317557,-1.8742,0.470587,
+ 0.149455,0.988769,0,-2.092921,-1.839622,0,
+ -0.274087,0.000043,-0.961705,-2.062725,-1.884246,0.307336,
+ 0.957938,-0.285979,0.023877,-2.147113,-1.903198,0.362462,
+ 0.149455,0.988769,0,-2.092921,-1.839622,0,
+ 0.957938,-0.285979,0.023877,-2.147113,-1.903198,0.362462,
+ 0.093777,0.995593,0,-2.348005,-1.869142,0,
+ -0.160087,-0.987103,0,-1.799827,-1.753136,0,
+ 0.74023,-0.090866,0.666185,-1.946306,-1.872735,0.344251,
+ -0.274087,0.000043,-0.961705,-2.062725,-1.884246,0.307336,
+ -0.160087,-0.987103,0,-1.799827,-1.753136,0,
+ -0.274087,0.000043,-0.961705,-2.062725,-1.884246,0.307336,
+ 0.149455,0.988769,0,-2.092921,-1.839622,0,
+ -0.661097,-0.258238,0.70446,-1.764045,-1.764987,0.406586,
+ -0.239734,-0.173966,0.955125,-1.88316,-1.829718,0.401567,
+ 0.74023,-0.090866,0.666185,-1.946306,-1.872735,0.344251,
+ -0.661097,-0.258238,0.70446,-1.764045,-1.764987,0.406586,
+ 0.74023,-0.090866,0.666185,-1.946306,-1.872735,0.344251,
+ -0.160087,-0.987103,0,-1.799827,-1.753136,0,
+ 0.830793,-0.244757,0.499877,-3.304804,-1.582192,0.643445,
+ 0.846555,-0.103662,0.52211,-3.314868,-1.599081,0.439626,
+ 0.820312,-0.193024,0.538358,-3.120907,-1.707924,0.431829,
+ 0.830793,-0.244757,0.499877,-3.304804,-1.582192,0.643445,
+ 0.820312,-0.193024,0.538358,-3.120907,-1.707924,0.431829,
+ 0.843062,-0.10517,0.527433,-3.139394,-1.687482,0.638546,
+ 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
+ 0.159615,0.129847,0.978602,-3.442085,-1.48412,0.406377,
+ 0.846555,-0.103662,0.52211,-3.314868,-1.599081,0.439626,
+ 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
+ 0.846555,-0.103662,0.52211,-3.314868,-1.599081,0.439626,
+ 0.830793,-0.244757,0.499877,-3.304804,-1.582192,0.643445,
+ 0.431429,-0.109339,0.895497,-3.53391,-1.330455,0.568246,
+ 0.407719,-0.190267,0.893064,-3.557869,-1.325941,0.37803,
+ 0.159615,0.129847,0.978602,-3.442085,-1.48412,0.406377,
+ 0.431429,-0.109339,0.895497,-3.53391,-1.330455,0.568246,
+ 0.159615,0.129847,0.978602,-3.442085,-1.48412,0.406377,
+ 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
+ 0.473622,-0.284001,0.833682,-3.631179,-1.157838,0.50561,
+ 0.459595,-0.144347,0.87632,-3.639586,-1.140102,0.3338,
+ 0.407719,-0.190267,0.893064,-3.557869,-1.325941,0.37803,
+ 0.473622,-0.284001,0.833682,-3.631179,-1.157838,0.50561,
+ 0.407719,-0.190267,0.893064,-3.557869,-1.325941,0.37803,
+ 0.431429,-0.109339,0.895497,-3.53391,-1.330455,0.568246,
+ -0.069043,-0.157333,0.985129,-3.667859,-0.964867,0.464702,
+ 0.051664,-0.122235,0.991156,-3.686518,-0.955181,0.320349,
+ 0.459595,-0.144347,0.87632,-3.639586,-1.140102,0.3338,
+ -0.069043,-0.157333,0.985129,-3.667859,-0.964867,0.464702,
+ 0.459595,-0.144347,0.87632,-3.639586,-1.140102,0.3338,
+ 0.473622,-0.284001,0.833682,-3.631179,-1.157838,0.50561,
+ 0.039,-0.185675,0.981837,-3.665774,-0.73408,0.446286,
+ -0.051713,-0.100833,0.993559,-3.676599,-0.729578,0.330724,
+ 0.051664,-0.122235,0.991156,-3.686518,-0.955181,0.320349,
+ 0.039,-0.185675,0.981837,-3.665774,-0.73408,0.446286,
+ 0.051664,-0.122235,0.991156,-3.686518,-0.955181,0.320349,
+ -0.069043,-0.157333,0.985129,-3.667859,-0.964867,0.464702,
+ -0.09542,0.162222,0.98213,-3.595973,-0.346391,0.426453,
+ 0.109483,-0.310605,0.944213,-3.616627,-0.350374,0.338492,
+ -0.051713,-0.100833,0.993559,-3.676599,-0.729578,0.330724,
+ -0.09542,0.162222,0.98213,-3.595973,-0.346391,0.426453,
+ -0.051713,-0.100833,0.993559,-3.676599,-0.729578,0.330724,
+ 0.039,-0.185675,0.981837,-3.665774,-0.73408,0.446286,
+ -0.246054,-0.154918,0.956796,-3.529709,-0.065998,0.437217,
+ -0.211092,-0.082708,0.973961,-3.570243,-0.060093,0.344854,
+ 0.109483,-0.310605,0.944213,-3.616627,-0.350374,0.338492,
+ -0.246054,-0.154918,0.956796,-3.529709,-0.065998,0.437217,
+ 0.109483,-0.310605,0.944213,-3.616627,-0.350374,0.338492,
+ -0.09542,0.162222,0.98213,-3.595973,-0.346391,0.426453,
+ -0.136917,-0.20176,0.969818,-3.51684,0.149002,0.430359,
+ -0.176356,-0.113876,0.977717,-3.535416,0.191408,0.338478,
+ -0.211092,-0.082708,0.973961,-3.570243,-0.060093,0.344854,
+ -0.136917,-0.20176,0.969818,-3.51684,0.149002,0.430359,
+ -0.211092,-0.082708,0.973961,-3.570243,-0.060093,0.344854,
+ -0.246054,-0.154918,0.956796,-3.529709,-0.065998,0.437217,
+ -0.17902,-0.308668,0.934171,-3.536654,0.442277,0.322,
+ -0.176356,-0.113876,0.977717,-3.535416,0.191408,0.338478,
+ -0.136917,-0.20176,0.969818,-3.51684,0.149002,0.430359,
+ -0.57342,0.819261,0,-3.544507,0.467147,0,
+ 0.170833,0.9853,0,-3.55232,0.219613,0,
+ -0.176356,-0.113876,0.977717,-3.535416,0.191408,0.338478,
+ -0.57342,0.819261,0,-3.544507,0.467147,0,
+ -0.176356,-0.113876,0.977717,-3.535416,0.191408,0.338478,
+ -0.17902,-0.308668,0.934171,-3.536654,0.442277,0.322,
+ 0.614301,0.789071,-0.000581,-3.583763,-0.052271,0,
+ -0.211092,-0.082708,0.973961,-3.570243,-0.060093,0.344854,
+ -0.176356,-0.113876,0.977717,-3.535416,0.191408,0.338478,
+ 0.614301,0.789071,-0.000581,-3.583763,-0.052271,0,
+ -0.176356,-0.113876,0.977717,-3.535416,0.191408,0.338478,
+ 0.170833,0.9853,0,-3.55232,0.219613,0,
+ 0.353735,-0.935346,0,-3.673607,-0.720796,0,
+ -0.051713,-0.100833,0.993559,-3.676599,-0.729578,0.330724,
+ 0.109483,-0.310605,0.944213,-3.616627,-0.350374,0.338492,
+ 0.353735,-0.935346,0,-3.673607,-0.720796,0,
+ 0.109483,-0.310605,0.944213,-3.616627,-0.350374,0.338492,
+ 0.098463,-0.995141,0,-3.637643,-0.356271,0,
+ -0.34926,-0.937026,0,-3.678793,-0.926816,0,
+ 0.051664,-0.122235,0.991156,-3.686518,-0.955181,0.320349,
+ -0.051713,-0.100833,0.993559,-3.676599,-0.729578,0.330724,
+ -0.34926,-0.937026,0,-3.678793,-0.926816,0,
+ -0.051713,-0.100833,0.993559,-3.676599,-0.729578,0.330724,
+ 0.353735,-0.935346,0,-3.673607,-0.720796,0,
+ -0.164,-0.98646,0,-3.650579,-1.142448,0,
+ 0.459595,-0.144347,0.87632,-3.639586,-1.140102,0.3338,
+ 0.051664,-0.122235,0.991156,-3.686518,-0.955181,0.320349,
+ -0.164,-0.98646,0,-3.650579,-1.142448,0,
+ 0.051664,-0.122235,0.991156,-3.686518,-0.955181,0.320349,
+ -0.34926,-0.937026,0,-3.678793,-0.926816,0,
+ 0.030921,-0.999522,0,-3.522115,-1.366623,0,
+ 0.407719,-0.190267,0.893064,-3.557869,-1.325941,0.37803,
+ 0.459595,-0.144347,0.87632,-3.639586,-1.140102,0.3338,
+ 0.030921,-0.999522,0,-3.522115,-1.366623,0,
+ 0.459595,-0.144347,0.87632,-3.639586,-1.140102,0.3338,
+ -0.164,-0.98646,0,-3.650579,-1.142448,0,
+ 0.183204,-0.983075,0,-3.417689,-1.494416,0,
+ 0.159615,0.129847,0.978602,-3.442085,-1.48412,0.406377,
+ 0.407719,-0.190267,0.893064,-3.557869,-1.325941,0.37803,
+ 0.183204,-0.983075,0,-3.417689,-1.494416,0,
+ 0.407719,-0.190267,0.893064,-3.557869,-1.325941,0.37803,
+ 0.030921,-0.999522,0,-3.522115,-1.366623,0,
+ -0.997516,0.070442,0,-3.271035,-1.609292,0,
+ 0.846555,-0.103662,0.52211,-3.314868,-1.599081,0.439626,
+ 0.159615,0.129847,0.978602,-3.442085,-1.48412,0.406377,
+ -0.997516,0.070442,0,-3.271035,-1.609292,0,
+ 0.159615,0.129847,0.978602,-3.442085,-1.48412,0.406377,
+ 0.183204,-0.983075,0,-3.417689,-1.494416,0,
+ -0.99928,-0.037933,0,-3.1103,-1.69172,0,
+ 0.820312,-0.193024,0.538358,-3.120907,-1.707924,0.431829,
+ 0.846555,-0.103662,0.52211,-3.314868,-1.599081,0.439626,
+ -0.99928,-0.037933,0,-3.1103,-1.69172,0,
+ 0.846555,-0.103662,0.52211,-3.314868,-1.599081,0.439626,
+ -0.997516,0.070442,0,-3.271035,-1.609292,0,
+ 0.0787,0.996898,0,-2.892162,-1.781087,0,
+ 0.999491,-0.02584,0.01873,-2.941731,-1.787431,0.442574,
+ 0.820312,-0.193024,0.538358,-3.120907,-1.707924,0.431829,
+ 0.0787,0.996898,0,-2.892162,-1.781087,0,
+ 0.820312,-0.193024,0.538358,-3.120907,-1.707924,0.431829,
+ -0.99928,-0.037933,0,-3.1103,-1.69172,0,
+ 0.098463,-0.995141,0,-3.637643,-0.356271,0,
+ 0.109483,-0.310605,0.944213,-3.616627,-0.350374,0.338492,
+ -0.211092,-0.082708,0.973961,-3.570243,-0.060093,0.344854,
+ 0.098463,-0.995141,0,-3.637643,-0.356271,0,
+ -0.211092,-0.082708,0.973961,-3.570243,-0.060093,0.344854,
+ 0.614301,0.789071,-0.000581,-3.583763,-0.052271,0,
+ -0.246054,-0.154918,0.956796,-3.529709,-0.065998,0.437217,
+ -0.739347,0.031953,0.672566,-3.470778,-0.078218,0.546398,
+ -0.136917,-0.20176,0.969818,-3.51684,0.149002,0.430359,
+ -0.09542,0.162222,0.98213,-3.595973,-0.346391,0.426453,
+ -0.652584,-0.147678,0.743186,-3.526766,-0.317542,0.560837,
+ -0.739347,0.031953,0.672566,-3.470778,-0.078218,0.546398,
+ -0.09542,0.162222,0.98213,-3.595973,-0.346391,0.426453,
+ -0.739347,0.031953,0.672566,-3.470778,-0.078218,0.546398,
+ -0.246054,-0.154918,0.956796,-3.529709,-0.065998,0.437217,
+ 0.039,-0.185675,0.981837,-3.665774,-0.73408,0.446286,
+ -0.483189,-0.207332,0.850613,-3.569993,-0.731989,0.649435,
+ -0.652584,-0.147678,0.743186,-3.526766,-0.317542,0.560837,
+ 0.039,-0.185675,0.981837,-3.665774,-0.73408,0.446286,
+ -0.652584,-0.147678,0.743186,-3.526766,-0.317542,0.560837,
+ -0.09542,0.162222,0.98213,-3.595973,-0.346391,0.426453,
+ -0.069043,-0.157333,0.985129,-3.667859,-0.964867,0.464702,
+ -0.4008,-0.167777,0.900672,-3.55012,-0.984868,0.675228,
+ -0.483189,-0.207332,0.850613,-3.569993,-0.731989,0.649435,
+ -0.069043,-0.157333,0.985129,-3.667859,-0.964867,0.464702,
+ -0.483189,-0.207332,0.850613,-3.569993,-0.731989,0.649435,
+ 0.039,-0.185675,0.981837,-3.665774,-0.73408,0.446286,
+ 0.473622,-0.284001,0.833682,-3.631179,-1.157838,0.50561,
+ -0.417424,-0.199203,0.886609,-3.492599,-1.180646,0.692282,
+ -0.4008,-0.167777,0.900672,-3.55012,-0.984868,0.675228,
+ 0.473622,-0.284001,0.833682,-3.631179,-1.157838,0.50561,
+ -0.4008,-0.167777,0.900672,-3.55012,-0.984868,0.675228,
+ -0.069043,-0.157333,0.985129,-3.667859,-0.964867,0.464702,
+ 0.431429,-0.109339,0.895497,-3.53391,-1.330455,0.568246,
+ -0.521685,-0.261319,0.812131,-3.335942,-1.365685,0.72459,
+ -0.417424,-0.199203,0.886609,-3.492599,-1.180646,0.692282,
+ 0.431429,-0.109339,0.895497,-3.53391,-1.330455,0.568246,
+ -0.417424,-0.199203,0.886609,-3.492599,-1.180646,0.692282,
+ 0.473622,-0.284001,0.833682,-3.631179,-1.157838,0.50561,
+ 0.290478,-0.146424,0.945612,-3.387254,-1.486027,0.672861,
+ -0.521685,-0.261319,0.812131,-3.335942,-1.365685,0.72459,
+ 0.431429,-0.109339,0.895497,-3.53391,-1.330455,0.568246,
+ -0.912869,-0.285577,0.291747,-3.438226,-0.721479,0.728141,
+ -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
+ -0.970971,-0.219011,0.096178,-3.415655,-0.308965,0.671045,
+ -0.652584,-0.147678,0.743186,-3.526766,-0.317542,0.560837,
+ -0.970971,-0.219011,0.096178,-3.415655,-0.308965,0.671045,
+ -0.739347,0.031953,0.672566,-3.470778,-0.078218,0.546398,
+ -0.483189,-0.207332,0.850613,-3.569993,-0.731989,0.649435,
+ -0.912869,-0.285577,0.291747,-3.438226,-0.721479,0.728141,
+ -0.970971,-0.219011,0.096178,-3.415655,-0.308965,0.671045,
+ -0.483189,-0.207332,0.850613,-3.569993,-0.731989,0.649435,
+ -0.970971,-0.219011,0.096178,-3.415655,-0.308965,0.671045,
+ -0.652584,-0.147678,0.743186,-3.526766,-0.317542,0.560837,
+ -0.4008,-0.167777,0.900672,-3.55012,-0.984868,0.675228,
+ -0.883057,-0.239959,0.403273,-3.355398,-0.969157,0.766213,
+ -0.912869,-0.285577,0.291747,-3.438226,-0.721479,0.728141,
+ -0.4008,-0.167777,0.900672,-3.55012,-0.984868,0.675228,
+ -0.912869,-0.285577,0.291747,-3.438226,-0.721479,0.728141,
+ -0.483189,-0.207332,0.850613,-3.569993,-0.731989,0.649435,
+ -0.417424,-0.199203,0.886609,-3.492599,-1.180646,0.692282,
+ -0.872722,-0.174901,0.455813,-3.27979,-1.162072,0.784602,
+ -0.883057,-0.239959,0.403273,-3.355398,-0.969157,0.766213,
+ -0.417424,-0.199203,0.886609,-3.492599,-1.180646,0.692282,
+ -0.883057,-0.239959,0.403273,-3.355398,-0.969157,0.766213,
+ -0.4008,-0.167777,0.900672,-3.55012,-0.984868,0.675228,
+ -0.521685,-0.261319,0.812131,-3.335942,-1.365685,0.72459,
+ -0.872722,-0.174901,0.455813,-3.27979,-1.162072,0.784602,
+ -0.417424,-0.199203,0.886609,-3.492599,-1.180646,0.692282,
+ -0.874358,-0.225285,0.429819,-3.25121,-0.948205,0.819868,
+ -0.883057,-0.239959,0.403273,-3.355398,-0.969157,0.766213,
+ -0.872722,-0.174901,0.455813,-3.27979,-1.162072,0.784602,
+ -0.794709,-0.185222,-0.57804,-3.556552,0.704883,0.28063,
+ -0.989276,0.146061,0,-3.566995,0.656967,0,
+ -0.57342,0.819261,0,-3.544507,0.467147,0,
+ -0.794709,-0.185222,-0.57804,-3.556552,0.704883,0.28063,
+ -0.57342,0.819261,0,-3.544507,0.467147,0,
+ -0.17902,-0.308668,0.934171,-3.536654,0.442277,0.322,
+ -0.845931,-0.255219,-0.468256,-3.57817,0.837714,0.288502,
+ -0.989171,0.146765,0,-3.599077,0.796217,0,
+ -0.989276,0.146061,0,-3.566995,0.656967,0,
+ -0.845931,-0.255219,-0.468256,-3.57817,0.837714,0.288502,
+ -0.989276,0.146061,0,-3.566995,0.656967,0,
+ -0.794709,-0.185222,-0.57804,-3.556552,0.704883,0.28063,
+ -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
+ -0.912869,-0.285577,0.291747,-3.438226,-0.721479,0.728141,
+ -0.883057,-0.239959,0.403273,-3.355398,-0.969157,0.766213,
+ -0.99574,-0.082547,0.041071,-3.283698,-0.730967,0.793898,
+ -0.883057,-0.239959,0.403273,-3.355398,-0.969157,0.766213,
+ -0.874358,-0.225285,0.429819,-3.25121,-0.948205,0.819868,
+ -0.498756,-0.224101,0.83727,-1.936032,-1.829617,0.488916,
+ 0.722741,0.690989,-0.01339,-1.971059,-1.992958,0.500845,
+ 0.532717,0.840798,0.09629,-1.933565,-1.993029,0.438902,
+ -0.498756,-0.224101,0.83727,-1.936032,-1.829617,0.488916,
+ 0.532717,0.840798,0.09629,-1.933565,-1.993029,0.438902,
+ -0.239734,-0.173966,0.955125,-1.88316,-1.829718,0.401567,
+ -0.759627,-0.28527,0.584455,-2.027242,-1.813012,0.555232,
+ 0.870384,0.492056,0.017698,-2.03574,-1.981182,0.547873,
+ 0.722741,0.690989,-0.01339,-1.971059,-1.992958,0.500845,
+ -0.759627,-0.28527,0.584455,-2.027242,-1.813012,0.555232,
+ 0.722741,0.690989,-0.01339,-1.971059,-1.992958,0.500845,
+ -0.498756,-0.224101,0.83727,-1.936032,-1.829617,0.488916,
+ -0.672688,-0.442616,0.592944,-2.126375,-1.866497,0.502895,
+ 0.947044,0.280641,0.156039,-2.106039,-2.019111,0.510759,
+ 0.870384,0.492056,0.017698,-2.03574,-1.981182,0.547873,
+ -0.672688,-0.442616,0.592944,-2.126375,-1.866497,0.502895,
+ 0.870384,0.492056,0.017698,-2.03574,-1.981182,0.547873,
+ -0.759627,-0.28527,0.584455,-2.027242,-1.813012,0.555232,
+ 0.954473,-0.270031,0.126745,-2.176551,-1.873816,0.445782,
+ 0.925586,0.050829,0.375109,-2.141621,-2.024301,0.470257,
+ 0.947044,0.280641,0.156039,-2.106039,-2.019111,0.510759,
+ 0.954473,-0.270031,0.126745,-2.176551,-1.873816,0.445782,
+ 0.947044,0.280641,0.156039,-2.106039,-2.019111,0.510759,
+ -0.672688,-0.442616,0.592944,-2.126375,-1.866497,0.502895,
+ 0.957938,-0.285979,0.023877,-2.147113,-1.903198,0.362462,
+ -0.212651,-0.104685,0.971504,-2.120746,-2.045137,0.411171,
+ 0.925586,0.050829,0.375109,-2.141621,-2.024301,0.470257,
+ 0.957938,-0.285979,0.023877,-2.147113,-1.903198,0.362462,
+ 0.925586,0.050829,0.375109,-2.141621,-2.024301,0.470257,
+ 0.954473,-0.270031,0.126745,-2.176551,-1.873816,0.445782,
+ -0.274087,0.000043,-0.961705,-2.062725,-1.884246,0.307336,
+ 0.332529,0.910491,0.245827,-2.060902,-2.031698,0.372079,
+ -0.212651,-0.104685,0.971504,-2.120746,-2.045137,0.411171,
+ -0.274087,0.000043,-0.961705,-2.062725,-1.884246,0.307336,
+ -0.212651,-0.104685,0.971504,-2.120746,-2.045137,0.411171,
+ 0.957938,-0.285979,0.023877,-2.147113,-1.903198,0.362462,
+ 0.74023,-0.090866,0.666185,-1.946306,-1.872735,0.344251,
+ 0.530834,0.847416,-0.010102,-1.978344,-2.023535,0.398257,
+ 0.332529,0.910491,0.245827,-2.060902,-2.031698,0.372079,
+ 0.74023,-0.090866,0.666185,-1.946306,-1.872735,0.344251,
+ 0.332529,0.910491,0.245827,-2.060902,-2.031698,0.372079,
+ -0.274087,0.000043,-0.961705,-2.062725,-1.884246,0.307336,
+ -0.239734,-0.173966,0.955125,-1.88316,-1.829718,0.401567,
+ 0.532717,0.840798,0.09629,-1.933565,-1.993029,0.438902,
+ 0.530834,0.847416,-0.010102,-1.978344,-2.023535,0.398257,
+ -0.239734,-0.173966,0.955125,-1.88316,-1.829718,0.401567,
+ 0.530834,0.847416,-0.010102,-1.978344,-2.023535,0.398257,
+ 0.74023,-0.090866,0.666185,-1.946306,-1.872735,0.344251,
+ 0.080262,-0.270606,0.959339,-2.466779,-1.857679,0.570461,
+ 0.78715,0.616449,-0.019656,-2.513608,-2.012858,0.558673,
+ 0.66813,0.738233,-0.092817,-2.499138,-2.03809,0.504529,
+ 0.080262,-0.270606,0.959339,-2.466779,-1.857679,0.570461,
+ 0.66813,0.738233,-0.092817,-2.499138,-2.03809,0.504529,
+ 0.441315,-0.29978,0.845797,-2.446375,-1.893261,0.49411,
+ -0.247433,-0.24804,0.936618,-2.547737,-1.833025,0.609321,
+ 0.856604,0.474875,0.201802,-2.571019,-1.995375,0.58623,
+ 0.78715,0.616449,-0.019656,-2.513608,-2.012858,0.558673,
+ -0.247433,-0.24804,0.936618,-2.547737,-1.833025,0.609321,
+ 0.78715,0.616449,-0.019656,-2.513608,-2.012858,0.558673,
+ 0.080262,-0.270606,0.959339,-2.466779,-1.857679,0.570461,
+ -0.587844,-0.244917,0.771009,-2.64722,-1.84401,0.594347,
+ 0.827569,0.284291,0.484054,-2.641567,-2.003164,0.575611,
+ 0.856604,0.474875,0.201802,-2.571019,-1.995375,0.58623,
+ -0.587844,-0.244917,0.771009,-2.64722,-1.84401,0.594347,
+ 0.856604,0.474875,0.201802,-2.571019,-1.995375,0.58623,
+ -0.247433,-0.24804,0.936618,-2.547737,-1.833025,0.609321,
+ -0.845196,-0.27877,0.455994,-2.699966,-1.850397,0.57007,
+ 0.754806,0.216246,0.619279,-2.678971,-2.007694,0.558395,
+ 0.827569,0.284291,0.484054,-2.641567,-2.003164,0.575611,
+ -0.845196,-0.27877,0.455994,-2.699966,-1.850397,0.57007,
+ 0.827569,0.284291,0.484054,-2.641567,-2.003164,0.575611,
+ -0.587844,-0.244917,0.771009,-2.64722,-1.84401,0.594347,
+ 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
+ 0.512523,0.043999,0.857545,-2.685663,-2.028649,0.514928,
+ 0.754806,0.216246,0.619279,-2.678971,-2.007694,0.558395,
+ 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
+ 0.754806,0.216246,0.619279,-2.678971,-2.007694,0.558395,
+ -0.845196,-0.27877,0.455994,-2.699966,-1.850397,0.57007,
+ 0.975634,-0.187231,-0.114377,-2.684452,-1.891207,0.447388,
+ 0.45571,-0.00339,0.890122,-2.667969,-2.036634,0.471396,
+ 0.512523,0.043999,0.857545,-2.685663,-2.028649,0.514928,
+ 0.975634,-0.187231,-0.114377,-2.684452,-1.891207,0.447388,
+ 0.512523,0.043999,0.857545,-2.685663,-2.028649,0.514928,
+ 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
+ 0.985192,-0.12583,-0.116459,-2.614084,-1.905005,0.404925,
+ 0.373808,-0.059429,0.9256,-2.618068,-2.046419,0.441284,
+ 0.45571,-0.00339,0.890122,-2.667969,-2.036634,0.471396,
+ 0.985192,-0.12583,-0.116459,-2.614084,-1.905005,0.404925,
+ 0.45571,-0.00339,0.890122,-2.667969,-2.036634,0.471396,
+ 0.975634,-0.187231,-0.114377,-2.684452,-1.891207,0.447388,
+ 0.996811,-0.048518,-0.063355,-2.503818,-1.909806,0.431456,
+ 0.276212,-0.065585,0.958856,-2.539874,-2.049824,0.460098,
+ 0.373808,-0.059429,0.9256,-2.618068,-2.046419,0.441284,
+ 0.996811,-0.048518,-0.063355,-2.503818,-1.909806,0.431456,
+ 0.373808,-0.059429,0.9256,-2.618068,-2.046419,0.441284,
+ 0.985192,-0.12583,-0.116459,-2.614084,-1.905005,0.404925,
+ 0.441315,-0.29978,0.845797,-2.446375,-1.893261,0.49411,
+ 0.66813,0.738233,-0.092817,-2.499138,-2.03809,0.504529,
+ 0.276212,-0.065585,0.958856,-2.539874,-2.049824,0.460098,
+ 0.441315,-0.29978,0.845797,-2.446375,-1.893261,0.49411,
+ 0.276212,-0.065585,0.958856,-2.539874,-2.049824,0.460098,
+ 0.996811,-0.048518,-0.063355,-2.503818,-1.909806,0.431456,
+ 0.530834,0.847416,-0.010102,-1.978344,-2.023535,0.398257,
+ 0.122987,-0.006582,0.992387,-1.985123,-2.116661,0.394256,
+ 0.041586,0.068165,0.996807,-2.065655,-2.124623,0.36872,
+ 0.530834,0.847416,-0.010102,-1.978344,-2.023535,0.398257,
+ 0.041586,0.068165,0.996807,-2.065655,-2.124623,0.36872,
+ 0.332529,0.910491,0.245827,-2.060902,-2.031698,0.372079,
+ 0.332529,0.910491,0.245827,-2.060902,-2.031698,0.372079,
+ 0.041586,0.068165,0.996807,-2.065655,-2.124623,0.36872,
+ 0.035084,0.005692,0.999368,-2.12403,-2.137733,0.406853,
+ 0.332529,0.910491,0.245827,-2.060902,-2.031698,0.372079,
+ 0.035084,0.005692,0.999368,-2.12403,-2.137733,0.406853,
+ -0.212651,-0.104685,0.971504,-2.120746,-2.045137,0.411171,
+ -0.212651,-0.104685,0.971504,-2.120746,-2.045137,0.411171,
+ 0.035084,0.005692,0.999368,-2.12403,-2.137733,0.406853,
+ -0.01346,-0.014478,0.999805,-2.144393,-2.117408,0.464489,
+ -0.212651,-0.104685,0.971504,-2.120746,-2.045137,0.411171,
+ -0.01346,-0.014478,0.999805,-2.144393,-2.117408,0.464489,
+ 0.925586,0.050829,0.375109,-2.141621,-2.024301,0.470257,
+ 0.925586,0.050829,0.375109,-2.141621,-2.024301,0.470257,
+ -0.01346,-0.014478,0.999805,-2.144393,-2.117408,0.464489,
+ -0.114527,0.103064,0.988059,-2.109684,-2.112345,0.503997,
+ 0.925586,0.050829,0.375109,-2.141621,-2.024301,0.470257,
+ -0.114527,0.103064,0.988059,-2.109684,-2.112345,0.503997,
+ 0.947044,0.280641,0.156039,-2.106039,-2.019111,0.510759,
+ 0.947044,0.280641,0.156039,-2.106039,-2.019111,0.510759,
+ -0.114527,0.103064,0.988059,-2.109684,-2.112345,0.503997,
+ 0.2189,0.87846,0.424724,-2.04111,-2.075348,0.540201,
+ 0.947044,0.280641,0.156039,-2.106039,-2.019111,0.510759,
+ 0.2189,0.87846,0.424724,-2.04111,-2.075348,0.540201,
+ 0.870384,0.492056,0.017698,-2.03574,-1.981182,0.547873,
+ 0.870384,0.492056,0.017698,-2.03574,-1.981182,0.547873,
+ 0.2189,0.87846,0.424724,-2.04111,-2.075348,0.540201,
+ -0.194126,0.280848,0.939914,-1.978016,-2.086834,0.494327,
+ 0.870384,0.492056,0.017698,-2.03574,-1.981182,0.547873,
+ -0.194126,0.280848,0.939914,-1.978016,-2.086834,0.494327,
+ 0.722741,0.690989,-0.01339,-1.971059,-1.992958,0.500845,
+ 0.722741,0.690989,-0.01339,-1.971059,-1.992958,0.500845,
+ -0.194126,0.280848,0.939914,-1.978016,-2.086834,0.494327,
+ 0.742615,0.656803,0.130894,-1.941442,-2.086904,0.433904,
+ 0.722741,0.690989,-0.01339,-1.971059,-1.992958,0.500845,
+ 0.742615,0.656803,0.130894,-1.941442,-2.086904,0.433904,
+ 0.532717,0.840798,0.09629,-1.933565,-1.993029,0.438902,
+ 0.532717,0.840798,0.09629,-1.933565,-1.993029,0.438902,
+ 0.742615,0.656803,0.130894,-1.941442,-2.086904,0.433904,
+ 0.122987,-0.006582,0.992387,-1.985123,-2.116661,0.394256,
+ 0.532717,0.840798,0.09629,-1.933565,-1.993029,0.438902,
+ 0.122987,-0.006582,0.992387,-1.985123,-2.116661,0.394256,
+ 0.530834,0.847416,-0.010102,-1.978344,-2.023535,0.398257,
+ 0.66813,0.738233,-0.092817,-2.499138,-2.03809,0.504529,
+ 0.681964,0.386261,0.621069,-2.513187,-2.130859,0.49792,
+ 0.584509,0.341142,0.736187,-2.552923,-2.142304,0.454579,
+ 0.66813,0.738233,-0.092817,-2.499138,-2.03809,0.504529,
+ 0.584509,0.341142,0.736187,-2.552923,-2.142304,0.454579,
+ 0.276212,-0.065585,0.958856,-2.539874,-2.049824,0.460098,
+ 0.276212,-0.065585,0.958856,-2.539874,-2.049824,0.460098,
+ 0.584509,0.341142,0.736187,-2.552923,-2.142304,0.454579,
+ 0.519595,0.25029,0.816931,-2.629199,-2.138983,0.436227,
+ 0.276212,-0.065585,0.958856,-2.539874,-2.049824,0.460098,
+ 0.519595,0.25029,0.816931,-2.629199,-2.138983,0.436227,
+ 0.373808,-0.059429,0.9256,-2.618068,-2.046419,0.441284,
+ 0.373808,-0.059429,0.9256,-2.618068,-2.046419,0.441284,
+ 0.519595,0.25029,0.816931,-2.629199,-2.138983,0.436227,
+ 0.237937,0.08172,0.967837,-2.677875,-2.129439,0.4656,
+ 0.373808,-0.059429,0.9256,-2.618068,-2.046419,0.441284,
+ 0.237937,0.08172,0.967837,-2.677875,-2.129439,0.4656,
+ 0.45571,-0.00339,0.890122,-2.667969,-2.036634,0.471396,
+ 0.45571,-0.00339,0.890122,-2.667969,-2.036634,0.471396,
+ 0.237937,0.08172,0.967837,-2.677875,-2.129439,0.4656,
+ 0.198142,0.152918,0.968171,-2.695135,-2.12165,0.508064,
+ 0.45571,-0.00339,0.890122,-2.667969,-2.036634,0.471396,
+ 0.198142,0.152918,0.968171,-2.695135,-2.12165,0.508064,
+ 0.512523,0.043999,0.857545,-2.685663,-2.028649,0.514928,
+ 0.512523,0.043999,0.857545,-2.685663,-2.028649,0.514928,
+ 0.198142,0.152918,0.968171,-2.695135,-2.12165,0.508064,
+ 0.198441,0.172024,0.964898,-2.688607,-2.101208,0.550465,
+ 0.512523,0.043999,0.857545,-2.685663,-2.028649,0.514928,
+ 0.198441,0.172024,0.964898,-2.688607,-2.101208,0.550465,
+ 0.754806,0.216246,0.619279,-2.678971,-2.007694,0.558395,
+ 0.754806,0.216246,0.619279,-2.678971,-2.007694,0.558395,
+ 0.198441,0.172024,0.964898,-2.688607,-2.101208,0.550465,
+ 0.204819,0.130792,0.970022,-2.65212,-2.09679,0.567258,
+ 0.754806,0.216246,0.619279,-2.678971,-2.007694,0.558395,
+ 0.204819,0.130792,0.970022,-2.65212,-2.09679,0.567258,
+ 0.827569,0.284291,0.484054,-2.641567,-2.003164,0.575611,
+ 0.827569,0.284291,0.484054,-2.641567,-2.003164,0.575611,
+ 0.204819,0.130792,0.970022,-2.65212,-2.09679,0.567258,
+ 0.154029,0.078449,0.984947,-2.583303,-2.089191,0.577616,
+ 0.827569,0.284291,0.484054,-2.641567,-2.003164,0.575611,
+ 0.154029,0.078449,0.984947,-2.583303,-2.089191,0.577616,
+ 0.856604,0.474875,0.201802,-2.571019,-1.995375,0.58623,
+ 0.856604,0.474875,0.201802,-2.571019,-1.995375,0.58623,
+ 0.154029,0.078449,0.984947,-2.583303,-2.089191,0.577616,
+ 0.032152,0.123743,0.991793,-2.527301,-2.106246,0.550735,
+ 0.856604,0.474875,0.201802,-2.571019,-1.995375,0.58623,
+ 0.032152,0.123743,0.991793,-2.527301,-2.106246,0.550735,
+ 0.78715,0.616449,-0.019656,-2.513608,-2.012858,0.558673,
+ 0.78715,0.616449,-0.019656,-2.513608,-2.012858,0.558673,
+ 0.032152,0.123743,0.991793,-2.527301,-2.106246,0.550735,
+ 0.681964,0.386261,0.621069,-2.513187,-2.130859,0.49792,
+ 0.78715,0.616449,-0.019656,-2.513608,-2.012858,0.558673,
+ 0.681964,0.386261,0.621069,-2.513187,-2.130859,0.49792,
+ 0.66813,0.738233,-0.092817,-2.499138,-2.03809,0.504529,
+ -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
+ 0.742615,0.656803,0.130894,-1.941442,-2.086904,0.433904,
+ -0.194126,0.280848,0.939914,-1.978016,-2.086834,0.494327,
+ -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
+ -0.194126,0.280848,0.939914,-1.978016,-2.086834,0.494327,
+ 0.2189,0.87846,0.424724,-2.04111,-2.075348,0.540201,
+ -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
+ 0.2189,0.87846,0.424724,-2.04111,-2.075348,0.540201,
+ -0.114527,0.103064,0.988059,-2.109684,-2.112345,0.503997,
+ -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
+ -0.114527,0.103064,0.988059,-2.109684,-2.112345,0.503997,
+ -0.01346,-0.014478,0.999805,-2.144393,-2.117408,0.464489,
+ -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
+ -0.01346,-0.014478,0.999805,-2.144393,-2.117408,0.464489,
+ 0.035084,0.005692,0.999368,-2.12403,-2.137733,0.406853,
+ -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
+ 0.035084,0.005692,0.999368,-2.12403,-2.137733,0.406853,
+ 0.041586,0.068165,0.996807,-2.065655,-2.124623,0.36872,
+ -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
+ 0.041586,0.068165,0.996807,-2.065655,-2.124623,0.36872,
+ 0.122987,-0.006582,0.992387,-1.985123,-2.116661,0.394256,
+ -0.077208,0.343417,0.936004,-2.048681,-2.165282,0.450843,
+ 0.122987,-0.006582,0.992387,-1.985123,-2.116661,0.394256,
+ 0.742615,0.656803,0.130894,-1.941442,-2.086904,0.433904,
+ 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
+ 0.681964,0.386261,0.621069,-2.513187,-2.130859,0.49792,
+ 0.032152,0.123743,0.991793,-2.527301,-2.106246,0.550735,
+ 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
+ 0.032152,0.123743,0.991793,-2.527301,-2.106246,0.550735,
+ 0.154029,0.078449,0.984947,-2.583303,-2.089191,0.577616,
+ 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
+ 0.154029,0.078449,0.984947,-2.583303,-2.089191,0.577616,
+ 0.204819,0.130792,0.970022,-2.65212,-2.09679,0.567258,
+ 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
+ 0.204819,0.130792,0.970022,-2.65212,-2.09679,0.567258,
+ 0.198441,0.172024,0.964898,-2.688607,-2.101208,0.550465,
+ 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
+ 0.198441,0.172024,0.964898,-2.688607,-2.101208,0.550465,
+ 0.198142,0.152918,0.968171,-2.695135,-2.12165,0.508064,
+ 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
+ 0.198142,0.152918,0.968171,-2.695135,-2.12165,0.508064,
+ 0.237937,0.08172,0.967837,-2.677875,-2.129439,0.4656,
+ 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
+ 0.237937,0.08172,0.967837,-2.677875,-2.129439,0.4656,
+ 0.519595,0.25029,0.816931,-2.629199,-2.138983,0.436227,
+ 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
+ 0.519595,0.25029,0.816931,-2.629199,-2.138983,0.436227,
+ 0.584509,0.341142,0.736187,-2.552923,-2.142304,0.454579,
+ 0.510285,0.851048,0.1238,-2.603284,-2.176802,0.510638,
+ 0.584509,0.341142,0.736187,-2.552923,-2.142304,0.454579,
+ 0.681964,0.386261,0.621069,-2.513187,-2.130859,0.49792,
+ 0.820312,-0.193024,0.538358,-3.120907,-1.707924,0.431829,
+ 0.999491,-0.02584,0.01873,-2.941731,-1.787431,0.442574,
+ 0.713401,0.39471,-0.579019,-3.008323,-1.759271,0.655672,
+ 0.820312,-0.193024,0.538358,-3.120907,-1.707924,0.431829,
+ 0.713401,0.39471,-0.579019,-3.008323,-1.759271,0.655672,
+ 0.843062,-0.10517,0.527433,-3.139394,-1.687482,0.638546,
+ 0.999491,-0.02584,0.01873,-2.941731,-1.787431,0.442574,
+ 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
+ 0.713401,0.39471,-0.579019,-3.008323,-1.759271,0.655672,
+ 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
+ -0.845196,-0.27877,0.455994,-2.699966,-1.850397,0.57007,
+ -0.732521,-0.474279,0.488336,-2.811581,-1.79821,0.712737,
+ 0.972392,0.232654,0.018037,-2.709403,-1.879947,0.508775,
+ -0.732521,-0.474279,0.488336,-2.811581,-1.79821,0.712737,
+ 0.713401,0.39471,-0.579019,-3.008323,-1.759271,0.655672,
+ -0.530021,0.13773,0.836724,-3.697889,-0.951955,0.098793,
+ -0.54555,-0.056478,0.836173,-3.67645,-0.551317,0.077574,
+ -0.548359,-0.017804,0.836053,-3.699784,-0.759901,0.088664
+};
+static const struct gllist frame={GL_N3F_V3F,GL_TRIANGLES,1515,data,NULL};
+const struct gllist *cow_udder=&frame;
diff --git a/hacks/glx/crackberg.c b/hacks/glx/crackberg.c
new file mode 100644
index 0000000..74c6915
--- /dev/null
+++ b/hacks/glx/crackberg.c
@@ -0,0 +1,1468 @@
+/***************************
+ ** crackberg; Matus Telgarsky [ catachresis@cmu.edu ] 2005
+ ** */
+#ifndef HAVE_JWXYZ
+# define XK_MISCELLANY
+# include <X11/keysymdef.h>
+#endif
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define release_crackberg 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#ifdef USE_GL /* whole file */
+
+#define DEF_NSUBDIVS "4"
+#define DEF_BORING "False"
+#define DEF_CRACK "True"
+#define DEF_WATER "True"
+#define DEF_FLAT "True"
+#define DEF_COLOR "random"
+#define DEF_LIT "True"
+#define DEF_VISIBILITY "0.6"
+#define DEF_LETTERBOX "False"
+
+
+/***************************
+ ** macros
+ ** */
+
+#define M_RAD7_4 0.661437827766148
+#define M_SQRT3_2 0.866025403784439
+#define M_PI_180 0.0174532925199433
+#define M_180_PI 57.2957795130823
+#define MSPEED_SCALE 1.1
+#define AVE3(a,b,c) ( ((a) + (b) + (c)) / 3.0 )
+#define MAX_ZDELTA 0.35
+#define DISPLACE(h,d) (h+(random()/(double)RAND_MAX-0.5)*2*MAX_ZDELTA/(1<<d))
+#define MEAN(x,y) ( ((x) + (y)) / 2.0 )
+#define TCOORD(x,y) (cberg->heights[(cberg->epoints * (y) - ((y)-1)*(y)/2 + (x))])
+#define sNCOORD(x,y,p) (cberg->norms[3 * (cberg->epoints * (y) - ((y)-1)*(y)/2 + (x)) + (p)])
+#define SET_sNCOORD(x,y, down, a,b,c,d,e,f) \
+ sNCOORD(x,y,0) = AVE3(a-d, 0.5 * (b-e), -0.5 * (c-f)); \
+ sNCOORD(x,y,1) = ((down) ? -1 : +1) * AVE3(0.0, M_SQRT3_2 * (b-e), M_SQRT3_2 * (c-f)); \
+ sNCOORD(x,y,2) = (2*dx)
+#define fNCOORD(x,y,w,p) \
+ (cberg->norms[3 * (2*(y)*cberg->epoints-((y)+1)*((y)+1) + 1 + 2 * ((x)-1) + (w)) + (p)])
+#define SET_fNCOORDa(x,y, down, dz00,dz01) \
+ fNCOORD(x,y,0,0) = (down) * (dy) * (dz01); \
+ fNCOORD(x,y,0,1) = (down) * ((dz01) * (dx) / 2 - (dx) * (dz00)); \
+ fNCOORD(x,y,0,2) = (down) * (dx) * (dy)
+#define SET_fNCOORDb(x,y, down, dz10,dz11) \
+ fNCOORD(x,y,1,0) = (down) * (dy) * (dz10); \
+ fNCOORD(x,y,1,1) = (down) * ((dz11) * (dx) - (dx) * (dz10) / 2); \
+ fNCOORD(x,y,1,2) = (down) * (dx) * (dy)
+
+
+/***************************
+ ** types
+ ** */
+
+
+typedef struct _cberg_state cberg_state;
+typedef struct _Trile Trile;
+
+typedef struct {
+ void (*init)(Trile *);
+ void (*free)(Trile *);
+ void (*draw)(Trile *);
+ void (*init_iter)(Trile *, cberg_state *);
+ void (*dying_iter)(Trile *, cberg_state *);
+} Morph;
+
+typedef struct {
+ char *id;
+ void (*land)(cberg_state *, double);
+ void (*water)(cberg_state *, double);
+ double bg[4];
+} Color;
+
+enum { TRILE_NEW, TRILE_INIT, TRILE_STABLE, TRILE_DYING, TRILE_DELETE };
+
+struct _Trile {
+ int x,y; /*center coords; points up if (x+y)%2 == 0, else down*/
+ short state;
+ short visible;
+ double *l,*r,*v; /*only edges need saving*/
+ GLuint call_list;
+
+ void *morph_data;
+ const Morph *morph;
+
+ struct _Trile *left, *right, *parent; /* for bst, NOT spatial */
+ struct _Trile *next_free; /* for memory allocation */
+};
+
+enum { MOTION_AUTO = 0, MOTION_MANUAL = 1, MOTION_LROT= 2, MOTION_RROT = 4,
+ MOTION_FORW = 8, MOTION_BACK = 16, MOTION_DEC = 32, MOTION_INC = 64,
+ MOTION_LEFT = 128, MOTION_RIGHT = 256 };
+
+struct _cberg_state {
+ GLXContext *glx_context;
+ Trile *trile_head;
+
+ double x,y,z, yaw,roll,pitch, dx,dy,dz, dyaw,droll,dpitch, elapsed;
+ double prev_frame;
+ int motion_state;
+ double mspeed;
+
+ double fovy, aspect, zNear, zFar;
+
+ const Color *color;
+
+ int count;
+
+ unsigned int epoints, /*number of points to one edge*/
+ tpoints, /*number points total*/
+ ntris, /*number triangles per trile*/
+ tnorms; /*number of normals*/
+
+ double *heights, *norms;
+ Trile *free_head; /* for trile_[alloc|free] */
+
+ double draw_elapsed;
+
+ double dx0;
+
+ double vs0r,vs0g,vs0b, vs1r, vs1g, vs1b,
+ vf0r,vf0g,vf0b, vf1r, vf1g, vf1b;
+
+ Bool button_down_p;
+ int mouse_x, mouse_y;
+ struct timeval paused;
+};
+
+
+
+/***************************
+ ** globals
+ ** */
+
+static unsigned int nsubdivs;
+static Bool crack, boring, do_water, flat, lit, letterbox;
+static float visibility;
+static char *color;
+
+static cberg_state *cbergs = NULL;
+
+static XrmOptionDescRec opts[] = {
+ {"-nsubdivs", ".nsubdivs", XrmoptionSepArg, 0},
+ {"-boring", ".boring", XrmoptionNoArg, "True"},
+ {"-crack", ".crack", XrmoptionNoArg, "True"},
+ {"-no-crack", ".crack", XrmoptionNoArg, "False"},
+ {"-water", ".water", XrmoptionNoArg, "True"},
+ {"-no-water", ".water", XrmoptionNoArg, "False"},
+ {"-flat", ".flat", XrmoptionNoArg, "True"},
+ {"-no-flat", ".flat", XrmoptionNoArg, "False"},
+ {"-color", ".color", XrmoptionSepArg, 0},
+ {"-lit", ".lit", XrmoptionNoArg, "True"},
+ {"-no-lit", ".lit", XrmoptionNoArg, "False"},
+ {"-visibility", ".visibility", XrmoptionSepArg, 0},
+ {"-letterbox", ".letterbox", XrmoptionNoArg, "True"}
+};
+
+static argtype vars[] = {
+ {&nsubdivs, "nsubdivs", "nsubdivs", DEF_NSUBDIVS, t_Int},
+ {&boring, "boring", "boring", DEF_BORING, t_Bool},
+ {&crack, "crack", "crack", DEF_CRACK, t_Bool},
+ {&do_water, "water", "water", DEF_WATER, t_Bool},
+ {&flat, "flat", "flat", DEF_FLAT, t_Bool},
+ {&color, "color", "color", DEF_COLOR, t_String},
+ {&lit, "lit", "lit", DEF_LIT, t_Bool},
+ {&visibility, "visibility", "visibility", DEF_VISIBILITY, t_Float},
+ {&letterbox, "letterbox", "letterbox", DEF_LETTERBOX, t_Bool}
+};
+
+ENTRYPOINT ModeSpecOpt crackberg_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/***************************
+ ** Trile functions.
+ ** first come all are regular trile functions
+ ** */
+
+
+/* forward decls for trile_new */
+static Trile *triles_find(Trile *tr, int x, int y);
+static Trile *trile_alloc(cberg_state *cberg);
+static const Morph *select_morph(void);
+static const Color *select_color(cberg_state *);
+
+static void trile_calc_sides(cberg_state *cberg,
+ Trile *new, int x, int y, Trile *root)
+{
+ unsigned int i,j,k;
+ int dv = ( (x + y) % 2 ? +1 : -1); /* we are pointing down or up*/
+ Trile *l, *r, *v; /* v_ertical */
+
+
+ if (root) {
+ l = triles_find(root, x-1, y);
+ r = triles_find(root, x+1, y);
+ v = triles_find(root, x,y+dv);
+ } else
+ l = r = v = NULL;
+
+ if (v) {
+ for (i = 0; i != cberg->epoints; ++i)
+ new->v[i] = v->v[i];
+ } else {
+ if (l) new->v[0] = l->l[0];
+ else if (!root) new->v[0] = DISPLACE(0,0);
+ else {
+ Trile *tr; /* all of these tests needed.. */
+ if ( (tr = triles_find(root, x-1, y + dv)) )
+ new->v[0] = tr->l[0];
+ else if ( (tr = triles_find(root, x-2, y)) )
+ new->v[0] = tr->r[0];
+ else if ( (tr = triles_find(root, x-2, y + dv)) )
+ new->v[0] = tr->r[0];
+ else
+ new->v[0] = DISPLACE(0,0);
+ }
+
+ if (r) new->v[cberg->epoints-1] = r->l[0];
+ else if (!root) new->v[cberg->epoints-1] = DISPLACE(0,0);
+ else {
+ Trile *tr;
+ if ( (tr = triles_find(root, x+1, y + dv)) )
+ new->v[cberg->epoints-1] = tr->l[0];
+ else if ( (tr = triles_find(root, x+2, y)) )
+ new->v[cberg->epoints-1] = tr->v[0];
+ else if ( (tr = triles_find(root, x+2, y + dv)) )
+ new->v[cberg->epoints-1] = tr->v[0];
+ else
+ new->v[cberg->epoints-1] = DISPLACE(0,0);
+ }
+
+ for (i = ((1 << nsubdivs) >> 1), k =1; i; i >>= 1, ++k)
+ for (j = i; j < cberg->epoints; j += i * 2)
+ new->v[j] = DISPLACE(MEAN(new->v[j-i], new->v[j+i]), k);
+ }
+
+ if (l) {
+ for (i = 0; i != cberg->epoints; ++i)
+ new->l[i] = l->r[i];
+ } else {
+ if (r) new->l[0] = r->v[0];
+ else if (!root) new->l[0] = DISPLACE(0,0);
+ else {
+ Trile *tr;
+ if ( (tr = triles_find(root, x-1, y-dv)) )
+ new->l[0] = tr->r[0];
+ else if ( (tr = triles_find(root, x+1, y-dv)) )
+ new->l[0] = tr->v[0];
+ else if ( (tr = triles_find(root, x, y-dv)) )
+ new->l[0] = tr->l[0];
+ else
+ new->l[0] = DISPLACE(0,0);
+ }
+
+ new->l[cberg->epoints - 1] = new->v[0];
+
+ for (i = ((1 << nsubdivs) >> 1), k =1; i; i >>= 1, ++k)
+ for (j = i; j < cberg->epoints; j += i * 2)
+ new->l[j] = DISPLACE(MEAN(new->l[j-i], new->l[j+i]), k);
+ }
+
+ if (r) {
+ for (i = 0; i != cberg->epoints; ++i)
+ new->r[i] = r->l[i];
+ } else {
+ new->r[0] = new->v[cberg->epoints - 1];
+ new->r[cberg->epoints - 1] = new->l[0];
+
+ for (i = ((1 << nsubdivs) >> 1), k =1; i; i >>= 1, ++k)
+ for (j = i; j < cberg->epoints; j += i * 2)
+ new->r[j] = DISPLACE(MEAN(new->r[j-i], new->r[j+i]), k);
+ }
+}
+
+static void trile_calc_heights(cberg_state *cberg, Trile *new)
+{
+ unsigned int i, j, k, h;
+
+ for (i = 0; i < cberg->epoints - 1; ++i) { /* copy in sides */
+ TCOORD(i,0) = new->v[i];
+ TCOORD(cberg->epoints - 1 - i, i) = new->r[i];
+ TCOORD(0, cberg->epoints - 1 - i) = new->l[i];
+ }
+
+ for (i = ((1 << nsubdivs) >> 2), k =1; i; i >>= 1, ++k)
+ for (j = 1; j < (1 << k); ++j)
+ for (h = 1; h <= (1<<k) - j; ++h) {
+ TCOORD( i*(2*h - 1), i*(2*j - 1) ) = /*rights*/
+ DISPLACE(MEAN(TCOORD( i*(2*h - 2), i*(2*j + 0) ),
+ TCOORD( i*(2*h + 0), i*(2*j - 2) )), k);
+
+ TCOORD( i*(2*h + 0), i*(2*j - 1) ) = /*lefts*/
+ DISPLACE(MEAN(TCOORD( i*(2*h + 0), i*(2*j - 2) ),
+ TCOORD( i*(2*h + 0), i*(2*j + 0) )), k);
+
+ TCOORD( i*(2*h - 1), i*(2*j + 0) ) = /*verts*/
+ DISPLACE(MEAN(TCOORD( i*(2*h - 2), i*(2*j + 0) ),
+ TCOORD( i*(2*h + 0), i*(2*j + 0) )), k);
+ }
+}
+
+static void trile_calc_flat_norms(cberg_state *cberg, Trile *new)
+{
+ unsigned int x, y;
+ int down = (((new->x + new->y) % 2) ? -1 : +1);
+ double dz00,dz01,dz10,dz11, a,b,c,d;
+ double dy = down * M_SQRT3_2 / (1 << nsubdivs);
+ double dx = cberg->dx0;
+
+ for (y = 0; y < cberg->epoints - 1; ++y) {
+ a = TCOORD(0,y);
+ b = TCOORD(0,y+1);
+ for (x = 1; x < cberg->epoints - 1 - y; ++x) {
+ c = TCOORD(x,y);
+ d = TCOORD(x,y+1);
+
+ dz00 = b-c;
+ dz01 = a-c;
+ dz10 = b-d;
+ dz11 = c-d;
+
+ SET_fNCOORDa(x,y, down, dz00,dz01);
+ SET_fNCOORDb(x,y, down, dz10,dz11);
+
+ a = c;
+ b = d;
+ }
+
+ c = TCOORD(x,y);
+ dz00 = b-c;
+ dz01 = a-c;
+ SET_fNCOORDa(x,y, down, dz00, dz01);
+ }
+}
+
+static void trile_calc_smooth_norms(cberg_state *cberg, Trile *new)
+{
+ unsigned int i,j, down = (new->x + new->y) % 2;
+ double prev, cur, next;
+ double dx = cberg->dx0;
+
+ /** corners -- assume level (bah) **/
+ cur = TCOORD(0,0);
+ SET_sNCOORD(0,0, down,
+ cur,cur,TCOORD(0,1),TCOORD(1,0),cur,cur);
+ cur = TCOORD(cberg->epoints-1,0);
+ SET_sNCOORD(cberg->epoints-1,0, down,
+ TCOORD(cberg->epoints-2,0),TCOORD(cberg->epoints-2,1),cur,cur,cur,cur);
+ cur = TCOORD(0,cberg->epoints-1);
+ SET_sNCOORD(0,cberg->epoints-1, down,
+ cur,cur,cur,cur,TCOORD(1,cberg->epoints-2),TCOORD(0,cberg->epoints-2));
+
+
+ /** sides **/
+ /* vert */
+ prev = TCOORD(0,0);
+ cur = TCOORD(1,0);
+ for (i = 1; i < cberg->epoints - 1; ++i) {
+ next = TCOORD(i+1,0);
+ SET_sNCOORD(i,0, down, prev,TCOORD(i-1,1),TCOORD(i,1), next,cur,cur);
+ prev = cur;
+ cur = next;
+ }
+
+ /* right */
+ prev = TCOORD(cberg->epoints-1,0);
+ cur = TCOORD(cberg->epoints-2,0);
+ for (i = 1; i < cberg->epoints - 1; ++i) {
+ next = TCOORD(cberg->epoints-i-2,i+1);
+ SET_sNCOORD(cberg->epoints-i-1,i, down, TCOORD(cberg->epoints-i-2,i),next,cur,
+ cur,prev,TCOORD(cberg->epoints-i-1,i-1));
+ prev = cur;
+ cur = next;
+ }
+
+ /* left */
+ prev = TCOORD(0,0);
+ cur = TCOORD(0,1);
+ for (i = 1; i < cberg->epoints - 1; ++i) {
+ next = TCOORD(0,i+1);
+ SET_sNCOORD(0,i, down, cur,cur,next,TCOORD(1,i),TCOORD(1,i-1),prev);
+ prev = cur;
+ cur = next;
+ }
+
+
+ /** fill in **/
+ for (i = 1; i < cberg->epoints - 2; ++i) {
+ prev = TCOORD(0,i);
+ cur = TCOORD(1,i);
+ for (j = 1; j < cberg->epoints - i - 1; ++j) {
+ next = TCOORD(j+1,i);
+ SET_sNCOORD(j,i, down, prev,TCOORD(j-1,i+1),TCOORD(j,i+1),
+ next,TCOORD(j+1,i-1),TCOORD(j,i-1));
+ prev = cur;
+ cur = next;
+ }
+ }
+}
+
+static inline void trile_light(cberg_state *cberg,
+ unsigned int x, unsigned int y,
+ unsigned int which)
+{
+ if (flat) {
+ if (x) {
+ glNormal3d(fNCOORD(x,y,which,0),
+ fNCOORD(x,y,which,1),
+ fNCOORD(x,y,which,2));
+ } else { /* I get mesa errors and bizarre glitches without this!! */
+ glNormal3d(fNCOORD(1,y,0,0),
+ fNCOORD(1,y,0,1),
+ fNCOORD(1,y,0,2));
+ }
+ } else {
+ glNormal3d(sNCOORD(x,y+which,0),
+ sNCOORD(x,y+which,1),
+ sNCOORD(x,y+which,2));
+ }
+}
+
+static inline void trile_draw_vertex(cberg_state *cberg, unsigned int ix,
+ unsigned int iy, unsigned int which, double x,double y,
+ double zcur, double z1, double z2)
+{
+ glColor3d(0.0, 0.0, 0.0); /* don't ask. my card breaks otherwise. */
+
+ if (do_water && zcur <= 0.0) {
+ cberg->color->water(cberg, zcur); /* XXX use average-of-3 for color when flat?*/
+ if (lit) glNormal3d(0.0,0.0,1.0);
+ glVertex3d(x, y, 0.0);
+ } else {
+ cberg->color->land(cberg, zcur);
+ if (lit) trile_light(cberg,ix,iy,which);
+ glVertex3d(x, y, zcur);
+ }
+}
+
+static void trile_render(cberg_state *cberg, Trile *new)
+{
+ double cornerx = 0.5 * new->x - 0.5, cornery;
+ double dy = M_SQRT3_2 / (1 << nsubdivs);
+ double z0,z1,z2;
+ int x,y;
+
+ new->call_list = glGenLists(1);
+ glNewList(new->call_list, GL_COMPILE);
+
+ if ((new->x + new->y) % 2) { /*point down*/
+ cornery = (new->y + 0.5)*M_SQRT3_2;
+ glFrontFace(GL_CW);
+ dy = -dy;
+ } else
+ cornery = (new->y - 0.5) * M_SQRT3_2;
+
+ for (y = 0; y < cberg->epoints - 1; ++y) {
+ double dx = cberg->dx0;
+ glBegin(GL_TRIANGLE_STRIP);
+ /* first three points all part of the same triangle.. */
+ z0 = TCOORD(0,y);
+ z1 = TCOORD(0,y+1);
+ z2 = TCOORD(1,y);
+ trile_draw_vertex(cberg, 0,y,0,
+ cornerx,cornery, z0, z1, z2);
+ trile_draw_vertex(cberg, 0,y,1,
+ cornerx+0.5*dx,cornery+dy, z1, z0, z2);
+
+ for (x = 1; x < cberg->epoints - 1 - y; ++x) {
+ trile_draw_vertex(cberg, x,y,0,
+ cornerx+x*dx,cornery, z2, z1, z0);
+
+ z0 = TCOORD(x, y+1);
+
+ trile_draw_vertex(cberg, x,y,1,
+ cornerx+(x+0.5)*dx,cornery+dy, z0, z2, z1);
+
+ z1 = z0;
+ z0 = z2;
+ z2 = TCOORD(x+1,y);
+ }
+ trile_draw_vertex(cberg, x,y,0,
+ cornerx + x*dx, cornery, z2, z1, z0);
+ glEnd();
+
+ cornerx += dx/2;
+ cornery += dy;
+ }
+
+ if ((new->x + new->y) % 2) /*point down*/
+ glFrontFace(GL_CCW);
+ glEndList();
+}
+
+static Trile *trile_new(cberg_state *cberg, int x,int y,Trile *parent,Trile *root)
+{
+ Trile *new;
+
+ new = trile_alloc(cberg);
+
+ new->x = x;
+ new->y = y;
+ new->state = TRILE_NEW;
+ new->parent = parent;
+ new->left = new->right = NULL;
+ new->visible = 1;
+
+ new->morph = select_morph();
+ new->morph->init(new);
+
+ trile_calc_sides(cberg, new, x, y, root);
+ trile_calc_heights(cberg, new);
+
+ if (lit) {
+ if (flat) trile_calc_flat_norms(cberg, new);
+ else trile_calc_smooth_norms(cberg, new);
+ }
+
+ trile_render(cberg, new);
+ return new;
+}
+
+static Trile *trile_alloc(cberg_state *cberg)
+{
+ Trile *new;
+
+ if (cberg->free_head) {
+ new = cberg->free_head;
+ cberg->free_head = cberg->free_head->next_free;
+ } else {
+ ++cberg->count;
+ if (!(new = malloc(sizeof(Trile)))
+ || !(new->l = (double *) malloc(sizeof(double) * cberg->epoints * 3))) {
+ perror(progname);
+ exit(1);
+ }
+ new->r = new->l + cberg->epoints;
+ new->v = new->r + cberg->epoints;
+#ifdef DEBUG
+ printf("needed to alloc; [%d]\n", cberg->count);
+#endif
+ }
+ return new;
+}
+
+static void trile_free(cberg_state *cberg, Trile *tr)
+{
+ glDeleteLists(tr->call_list, 1);
+ tr->morph->free(tr);
+ tr->next_free = cberg->free_head;
+ cberg->free_head = tr;
+}
+
+
+static void trile_draw_vanilla(Trile *tr)
+{ glCallList(tr->call_list); }
+
+static void trile_draw(Trile *tr, void *ignore)
+{
+ if (tr->state == TRILE_STABLE)
+ trile_draw_vanilla(tr);
+ else
+ tr->morph->draw(tr);
+}
+
+
+/***************************
+ ** Trile morph functions.
+ ** select function at bottom (forward decls sucls)
+ ** */
+
+
+/*** first the basic growing morph */
+
+static void grow_init(Trile *tr)
+{
+ tr->morph_data = (void *) malloc(sizeof(double));
+ *((double *)tr->morph_data) = 0.02; /* not 0; avoid normals crapping */
+}
+
+static void grow_free(Trile *tr)
+{
+ free(tr->morph_data);
+}
+
+static void grow_draw(Trile *tr)
+{
+ glPushMatrix();
+ glScaled(1.0,1.0, *((double *)tr->morph_data));
+ trile_draw_vanilla(tr);
+ glPopMatrix();
+}
+
+static void grow_init_iter(Trile *tr, cberg_state *cberg)
+{
+ *((double *)(tr->morph_data)) = *((double *)tr->morph_data) + cberg->elapsed;
+ if (*((double *)tr->morph_data) >= 1.0)
+ tr->state = TRILE_STABLE;
+}
+
+static void grow_dying_iter(Trile *tr, cberg_state *cberg)
+{
+ *((double *)tr->morph_data) = *((double *)tr->morph_data) - cberg->elapsed;
+ if (*((double *)tr->morph_data) <= 0.02) /* XXX avoid fast del/cons? */
+ tr->state = TRILE_DELETE;
+}
+
+/**** falling morph ****/
+
+static void fall_init(Trile *tr)
+{
+ tr->morph_data = (void *) malloc(sizeof(double));
+ *((double *)tr->morph_data) = 0.0;
+}
+
+static void fall_free(Trile *tr)
+{
+ free(tr->morph_data);
+}
+
+static void fall_draw(Trile *tr)
+{
+ glPushMatrix();
+ glTranslated(0.0,0.0,(0.5 - *((double *)tr->morph_data)) * 8);
+ trile_draw_vanilla(tr);
+ glPopMatrix();
+}
+
+static void fall_init_iter(Trile *tr, cberg_state *cberg)
+{
+ *((double *)(tr->morph_data)) = *((double *)tr->morph_data) + cberg->elapsed;
+ if (*((double *)tr->morph_data) >= 0.5)
+ tr->state = TRILE_STABLE;
+}
+
+static void fall_dying_iter(Trile *tr, cberg_state *cberg)
+{
+ *((double *)tr->morph_data) = *((double *)tr->morph_data) - cberg->elapsed;
+ if (*((double *)tr->morph_data) <= 0.0) /* XXX avoid fast del/cons? */
+ tr->state = TRILE_DELETE;
+}
+
+/**** yeast morph ****/
+
+static void yeast_init(Trile *tr)
+{
+ tr->morph_data = (void *) malloc(sizeof(double));
+ *((double *)tr->morph_data) = 0.02;
+}
+
+static void yeast_free(Trile *tr)
+{
+ free(tr->morph_data);
+}
+
+static void yeast_draw(Trile *tr)
+{
+ double x = tr->x * 0.5,
+ y = tr->y * M_SQRT3_2,
+ z = *((double *)tr->morph_data);
+
+ glPushMatrix();
+ glTranslated(x, y, 0);
+ glRotated(z*360, 0,0,1);
+ glScaled(z,z,z);
+ glTranslated(-x, -y, 0);
+ trile_draw_vanilla(tr);
+ glPopMatrix();
+}
+
+static void yeast_init_iter(Trile *tr, cberg_state *cberg)
+{
+ *((double *)(tr->morph_data)) = *((double *)tr->morph_data) + cberg->elapsed;
+ if (*((double *)tr->morph_data) >= 1.0)
+ tr->state = TRILE_STABLE;
+}
+
+static void yeast_dying_iter(Trile *tr, cberg_state *cberg)
+{
+ *((double *)tr->morph_data) = *((double *)tr->morph_data) - cberg->elapsed;
+ if (*((double *)tr->morph_data) <= 0.02) /* XXX avoid fast del/cons? */
+ tr->state = TRILE_DELETE;
+}
+
+/**** identity morph ****/
+
+static void identity_init(Trile *tr)
+{ tr->state = TRILE_STABLE; }
+
+static void identity_free(Trile *tr)
+{}
+
+static void identity_draw(Trile *tr)
+{ trile_draw_vanilla(tr); }
+
+static void identity_init_iter(Trile *tr, cberg_state *cberg)
+{}
+
+static void identity_dying_iter(Trile *tr, cberg_state *cberg)
+{ tr->state = TRILE_DELETE; }
+
+/** now to handle selection **/
+
+static const Morph morphs[] = {
+ {grow_init, grow_free, grow_draw, grow_init_iter, grow_dying_iter},
+ {fall_init, fall_free, fall_draw, fall_init_iter, fall_dying_iter},
+ {yeast_init, yeast_free, yeast_draw, yeast_init_iter, yeast_dying_iter},
+ {identity_init, /*always put identity last to skip it..*/
+ identity_free, identity_draw, identity_init_iter, identity_dying_iter}
+};
+
+static const Morph *select_morph()
+{
+ int nmorphs = countof(morphs);
+ if (crack)
+ return &morphs[random() % (nmorphs-1)];
+ else if (boring)
+ return &morphs[nmorphs-1];
+ else
+ return morphs;
+}
+
+
+/***************************
+ ** Trile superstructure functions.
+ ** */
+
+
+static void triles_set_visible(cberg_state *cberg, Trile **root, int x, int y)
+{
+ Trile *parent = NULL,
+ *iter = *root;
+ int goleft=0;
+
+ while (iter != NULL) {
+ parent = iter;
+ goleft = (iter->x > x || (iter->x == x && iter->y > y));
+ if (goleft)
+ iter = iter->left;
+ else if (iter->x == x && iter->y == y) {
+ iter->visible = 1;
+ return;
+ } else
+ iter = iter->right;
+ }
+
+ if (parent == NULL)
+ *root = trile_new(cberg, x,y, NULL, NULL);
+ else if (goleft)
+ parent->left = trile_new(cberg, x,y, parent, *root);
+ else
+ parent->right = trile_new(cberg, x,y, parent, *root);
+}
+
+static unsigned int triles_foreach(Trile *root, void (*f)(Trile *, void *),
+ void *data)
+{
+ if (root == NULL)
+ return 0;
+
+ f(root, data);
+ return 1 + triles_foreach(root->left, f, data)
+ + triles_foreach(root->right, f, data);
+}
+
+static void triles_update_state(Trile **root, cberg_state *cberg)
+{
+ int process_current = 1;
+ if (*root == NULL)
+ return;
+
+ while (process_current) {
+ if ( (*root)->visible ) {
+ if ( (*root)->state == TRILE_INIT )
+ (*root)->morph->init_iter(*root, cberg);
+ else if ( (*root)->state == TRILE_DYING ) {
+ (*root)->state = TRILE_INIT;
+ (*root)->morph->init_iter(*root, cberg);
+ } else if ( (*root)->state == TRILE_NEW )
+ (*root)->state = TRILE_INIT;
+
+ (*root)->visible = 0;
+ } else {
+ if ( (*root)->state == TRILE_STABLE )
+ (*root)->state = TRILE_DYING;
+ else if ( (*root)->state == TRILE_INIT ) {
+ (*root)->state = TRILE_DYING;
+ (*root)->morph->dying_iter(*root, cberg);
+ } else if ( (*root)->state == TRILE_DYING )
+ (*root)->morph->dying_iter(*root, cberg);
+ }
+
+ if ( (*root)->state == TRILE_DELETE ) {
+ Trile *splice_me;
+ process_current = 1;
+
+ if ((*root)->left == NULL) {
+ splice_me = (*root)->right;
+ if (splice_me)
+ splice_me->parent = (*root)->parent;
+ else
+ process_current = 0;
+ } else if ((*root)->right == NULL) {
+ splice_me = (*root)->left;
+ splice_me->parent = (*root)->parent;
+ } else {
+ Trile *tmp;
+ for (splice_me = (*root)->right; splice_me->left != NULL; )
+ splice_me = splice_me->left;
+ tmp = splice_me->right;
+
+ if (tmp) tmp->parent = splice_me->parent;
+
+ if (splice_me == splice_me->parent->left)
+ splice_me->parent->left = tmp;
+ else
+ splice_me->parent->right = tmp;
+
+ splice_me->parent = (*root)->parent;
+ splice_me->left = (*root)->left;
+ (*root)->left->parent = splice_me;
+ splice_me->right = (*root)->right;
+ if ((*root)->right)
+ (*root)->right->parent = splice_me;
+ }
+ trile_free(cberg, *root);
+ *root = splice_me;
+ } else
+ process_current = 0;
+ }
+
+ if (*root) {
+ triles_update_state(&((*root)->left), cberg);
+ triles_update_state(&((*root)->right), cberg);
+ }
+}
+
+static Trile *triles_find(Trile *tr, int x, int y)
+{
+ while (tr && !(tr->x == x && tr->y == y))
+ if (x < tr->x || (x == tr->x && y < tr->y))
+ tr = tr->left;
+ else
+ tr = tr->right;
+ return tr;
+}
+
+
+/***************************
+ ** Trile superstructure visibility functions.
+ ** strategy fine, implementation lazy&retarded =/
+ ** */
+
+#ifdef DEBUG
+static double x_shit, y_shit;
+#endif
+
+static void calc_points(cberg_state *cberg, double *x1,double *y1,
+ double *x2,double *y2, double *x3,double *y3, double *x4,double *y4)
+{
+ double zNear, x_nearcenter, y_nearcenter, nhalfwidth, x_center, y_center;
+
+
+ /* could cache these.. bahhhhhhhhhhhhhh */
+ double halfheight = tan(cberg->fovy / 2 * M_PI_180) * cberg->zNear;
+ double fovx_2 = atan(halfheight * cberg->aspect / cberg->zNear) * M_180_PI;
+ double zFar = cberg->zFar + M_RAD7_4;
+ double fhalfwidth = zFar * tan(fovx_2 * M_PI_180)
+ + M_RAD7_4 / cos(fovx_2 * M_PI_180);
+ double x_farcenter = cberg->x + zFar * cos(cberg->yaw * M_PI_180);
+ double y_farcenter = cberg->y + zFar * sin(cberg->yaw * M_PI_180);
+ *x1 = x_farcenter + fhalfwidth * cos((cberg->yaw - 90) * M_PI_180);
+ *y1 = y_farcenter + fhalfwidth * sin((cberg->yaw - 90) * M_PI_180);
+ *x2 = x_farcenter - fhalfwidth * cos((cberg->yaw - 90) * M_PI_180);
+ *y2 = y_farcenter - fhalfwidth * sin((cberg->yaw - 90) * M_PI_180);
+
+#ifdef DEBUG
+ printf("pos (%.3f,%.3f) @ %.3f || fovx: %f || fovy: %f\n",
+ cberg->x, cberg->y, cberg->yaw, fovx_2 * 2, cberg->fovy);
+ printf("\tfarcenter: (%.3f,%.3f) || fhalfwidth: %.3f \n"
+ "\tp1: (%.3f,%.3f) || p2: (%.3f,%.3f)\n",
+ x_farcenter, y_farcenter, fhalfwidth, *x1, *y1, *x2, *y2);
+#endif
+
+ if (cberg->z - halfheight <= 0) /* near view plane hits xy */
+ zNear = cberg->zNear - M_RAD7_4;
+ else /* use bottom of frustum */
+ zNear = cberg->z / tan(cberg->fovy / 2 * M_PI_180) - M_RAD7_4;
+ nhalfwidth = zNear * tan(fovx_2 * M_PI_180)
+ + M_RAD7_4 / cos(fovx_2 * M_PI_180);
+ x_nearcenter = cberg->x + zNear * cos(cberg->yaw * M_PI_180);
+ y_nearcenter = cberg->y + zNear * sin(cberg->yaw * M_PI_180);
+ *x3 = x_nearcenter - nhalfwidth * cos((cberg->yaw - 90) * M_PI_180);
+ *y3 = y_nearcenter - nhalfwidth * sin((cberg->yaw - 90) * M_PI_180);
+ *x4 = x_nearcenter + nhalfwidth * cos((cberg->yaw - 90) * M_PI_180);
+ *y4 = y_nearcenter + nhalfwidth * sin((cberg->yaw - 90) * M_PI_180);
+
+#ifdef DEBUG
+ printf("\tnearcenter: (%.3f,%.3f) || nhalfwidth: %.3f\n"
+ "\tp3: (%.3f,%.3f) || p4: (%.3f,%.3f)\n",
+ x_nearcenter, y_nearcenter, nhalfwidth, *x3, *y3, *x4, *y4);
+#endif
+
+
+ /* center can be average or the intersection of diagonals.. */
+#if 0
+ {
+ double c = nhalfwidth * (zFar -zNear) / (fhalfwidth + nhalfwidth);
+ x_center = x_nearcenter + c * cos(cberg->yaw * M_PI_180);
+ y_center = y_nearcenter + c * sin(cberg->yaw * M_PI_180);
+ }
+#else
+ x_center = (x_nearcenter + x_farcenter) / 2;
+ y_center = (y_nearcenter + y_farcenter) / 2;
+#endif
+#ifdef DEBUG
+ x_shit = x_center;
+ y_shit = y_center;
+#endif
+
+#define VSCALE(p) *x##p = visibility * *x##p + (1-visibility) * x_center; \
+ *y##p = visibility * *y##p + (1-visibility) * y_center
+
+ VSCALE(1);
+ VSCALE(2);
+ VSCALE(3);
+ VSCALE(4);
+#undef VSCALE
+}
+
+/* this is pretty stupid.. */
+static inline void minmax4(double a, double b, double c, double d,
+ double *min, double *max)
+{
+ *min = *max = a;
+
+ if (b > *max) *max = b;
+ else if (b < *min) *min = b;
+ if (c > *max) *max = c;
+ else if (c < *min) *min = c;
+ if (d > *max) *max = d;
+ else if (d < *min) *min = d;
+}
+
+typedef struct {
+ double min, max, start, dx;
+} LS;
+
+#define check_line(a, b) \
+ if (fabs(y##a-y##b) > 0.001) { \
+ ls[count].dx = (x##b-x##a)/(y##b-y##a); \
+ if (y##b > y##a) { \
+ ls[count].start = x##a; \
+ ls[count].min = y##a; \
+ ls[count].max = y##b; \
+ } else { \
+ ls[count].start = x##b; \
+ ls[count].min = y##b; \
+ ls[count].max = y##a; \
+ } \
+ ++count; \
+ }
+
+static unsigned int build_ls(cberg_state *cberg,
+ double x1, double y1, double x2, double y2,
+ double x3, double y3, double x4, double y4, LS *ls,
+ double *trough, double *peak)
+{
+ unsigned int count = 0;
+
+ check_line(1, 2);
+ check_line(2, 3);
+ check_line(3, 4);
+ check_line(4, 1);
+
+ minmax4(y1, y2, y3, y4, trough, peak);
+ return count;
+}
+
+#undef check_line
+
+/*needs bullshit to avoid double counts on corners.*/
+static void find_bounds(double y, double *left, double *right, LS *ls,
+ unsigned int nls)
+{
+ double x;
+ unsigned int i, set = 0;
+
+ for (i = 0; i != nls; ++i)
+ if (ls[i].min <= y && ls[i].max >= y) {
+ x = (y - ls[i].min) * ls[i].dx + ls[i].start;
+ if (!set) {
+ *left = x;
+ ++set;
+ } else if (fabs(x - *left) > 0.001) {
+ if (*left < x)
+ *right = x;
+ else {
+ *right = *left;
+ *left = x;
+ }
+ return;
+ }
+ }
+
+ /* just in case we somehow blew up */
+ *left = 3.0;
+ *right = -3.0;
+}
+
+static void mark_visible(cberg_state *cberg)
+{
+ double trough, peak, yval, left=0, right=0;
+ double x1,y1, x2,y2, x3,y3, x4,y4;
+ int start, stop, x, y;
+ LS ls[4];
+ unsigned int nls;
+
+ calc_points(cberg, &x1,&y1, &x2,&y2, &x3,&y3, &x4,&y4);
+ nls = build_ls(cberg, x1,y1, x2,y2, x3,y3, x4,y4, ls, &trough, &peak);
+
+ start = (int) ceil(trough / M_SQRT3_2);
+ stop = (int) floor(peak / M_SQRT3_2);
+
+ for (y = start; y <= stop; ++y) {
+ yval = y * M_SQRT3_2;
+ find_bounds(yval, &left, &right, ls, nls);
+ for (x = (int) ceil(left*2-1); x <= (int) floor(right*2); ++x)
+ triles_set_visible(cberg, &(cberg->trile_head), x, y);
+ }
+}
+
+
+/***************************
+ ** color schemes
+ ** */
+
+static void plain_land(cberg_state *cberg, double z)
+{ glColor3f(pow((z/0.35),4), z/0.35, pow((z/0.35),4)); }
+static void plain_water(cberg_state *cberg, double z)
+{ glColor3f(0.0, (z+0.35)*1.6, 0.8); }
+
+static void ice_land(cberg_state *cberg, double z)
+{ glColor3f((0.35 - z)/0.35, (0.35 - z)/0.35, 1.0); }
+static void ice_water(cberg_state *cberg, double z)
+{ glColor3f(0.0, (z+0.35)*1.6, 0.8); }
+
+
+static void magma_land(cberg_state *cberg, double z)
+{ glColor3f(z/0.35, z/0.2,0); }
+static void magma_lava(cberg_state *cberg, double z)
+{ glColor3f((z+0.35)*1.6, (z+0.35), 0.0); }
+
+static void vomit_solid(cberg_state *cberg, double z)
+{
+ double norm = fabs(z) / 0.35;
+ glColor3f(
+ (1-norm) * cberg->vs0r + norm * cberg->vs1r,
+ (1-norm) * cberg->vs0g + norm * cberg->vs1g,
+ (1-norm) * cberg->vs0b + norm * cberg->vs1b
+ );
+}
+static void vomit_fluid(cberg_state *cberg, double z)
+{
+ double norm = z / -0.35;
+ glColor3f(
+ (1-norm) * cberg->vf0r + norm * cberg->vf1r,
+ (1-norm) * cberg->vf0g + norm * cberg->vf1g,
+ (1-norm) * cberg->vf0b + norm * cberg->vf1b
+ );
+}
+
+
+static const Color colors[] = {
+ {"plain", plain_land, plain_water, {0.0, 0.0, 0.0, 1.0}},
+ {"ice", ice_land, ice_water, {0.0, 0.0, 0.0, 1.0}},
+ {"magma", magma_land, magma_lava, {0.3, 0.3, 0.0, 1.0}},
+ {"vomit", vomit_solid, vomit_fluid, {0.3, 0.3, 0.0, 1.0}}, /* no error! */
+};
+
+static const Color *select_color(cberg_state *cberg)
+{
+ unsigned int ncolors = countof(colors);
+ int idx = -1;
+ if ( ! strcmp(color, "random") )
+ idx = random() % ncolors;
+ else {
+ unsigned int i;
+ for (i = 0; i != ncolors; ++i)
+ if ( ! strcmp(colors[i].id, color) ) {
+ idx = i;
+ break;
+ }
+
+ if (idx == -1) {
+ printf("invalid color scheme selected; valid choices are:\n");
+ for (i = 0; i != ncolors; ++i)
+ printf("\t%s\n", colors[i].id);
+ printf("\t%s\n", "random");
+ idx = 0;
+ }
+ }
+
+ if ( ! strcmp(colors[idx].id, "vomit") ) { /* need to create it (ghetto) */
+ cberg->vs0r = random()/(double)RAND_MAX;
+ cberg->vs0g = random()/(double)RAND_MAX;
+ cberg->vs0b = random()/(double)RAND_MAX;
+ cberg->vs1r = random()/(double)RAND_MAX;
+ cberg->vs1g = random()/(double)RAND_MAX;
+ cberg->vs1b = random()/(double)RAND_MAX;
+ cberg->vf0r = random()/(double)RAND_MAX;
+ cberg->vf0g = random()/(double)RAND_MAX;
+ cberg->vf0b = random()/(double)RAND_MAX;
+ cberg->vf1r = random()/(double)RAND_MAX;
+ cberg->vf1g = random()/(double)RAND_MAX;
+ cberg->vf1b = random()/(double)RAND_MAX;
+
+ glClearColor(random()/(double)RAND_MAX,
+ random()/(double)RAND_MAX,
+ random()/(double)RAND_MAX,
+ 1.0);
+ } else {
+ glClearColor(colors[idx].bg[0],
+ colors[idx].bg[1],
+ colors[idx].bg[2],
+ colors[idx].bg[3]);
+ }
+ return colors + idx;
+}
+
+
+/***************************
+ ** misc helper functions
+ ** */
+
+
+/* simple one for now.. */
+static inline double drunken_rando(double cur_val, double max, double width)
+{
+ double r = random() / (double) RAND_MAX * 2;
+ if (cur_val > 0)
+ if (r >= 1)
+ return cur_val + (r-1) * width * (1-cur_val/max);
+ else
+ return cur_val - r * width;
+ else
+ if (r >= 1)
+ return cur_val - (r-1) * width * (1+cur_val/max);
+ else
+ return cur_val + r * width;
+}
+
+
+/***************************
+ ** core crackberg routines
+ ** */
+
+ENTRYPOINT void reshape_crackberg (ModeInfo *mi, int w, int h);
+
+ENTRYPOINT void init_crackberg (ModeInfo *mi)
+{
+ cberg_state *cberg;
+
+ nsubdivs %= 16; /* just in case.. */
+
+ MI_INIT(mi, cbergs);
+
+ if (visibility > 1.0 || visibility < 0.2) {
+ printf("visibility must be in range [0.2 .. 1.0]\n");
+ visibility = 1.0;
+ }
+
+ cberg = &cbergs[MI_SCREEN(mi)];
+
+ cberg->epoints = 1 + (1 << nsubdivs);
+ cberg->tpoints = cberg->epoints * (cberg->epoints + 1) / 2;
+ cberg->ntris = (1 << (nsubdivs << 1));
+ cberg->tnorms = ( (flat) ? cberg->ntris : cberg->tpoints);
+ cberg->dx0 = 1.0 / (1 << nsubdivs);
+
+ cberg->heights = malloc(cberg->tpoints * sizeof(double));
+ cberg->norms = malloc(3 * cberg->tnorms * sizeof(double));
+
+ cberg->glx_context = init_GL(mi);
+ cberg->motion_state = MOTION_AUTO;
+ cberg->mspeed = 1.0;
+ cberg->z = 0.5;
+
+ cberg->fovy = 60.0;
+ cberg->zNear = 0.5;
+ cberg->zFar = 5.0;
+
+ cberg->draw_elapsed = 1.0;
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glShadeModel((flat) ? GL_FLAT : GL_SMOOTH);
+# ifndef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ glPolygonMode(GL_FRONT_AND_BACK, (MI_IS_WIREFRAME(mi)) ? GL_LINE : GL_FILL);
+# endif
+
+ if (lit) {
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_COLOR_MATERIAL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
+ glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_RESCALE_NORMAL);
+ }
+
+ cberg->color = select_color(cberg);
+
+ reshape_crackberg(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+}
+
+ENTRYPOINT void reshape_crackberg (ModeInfo *mi, int w, int h)
+{
+ int h2;
+ cberg_state *cberg = &cbergs[MI_SCREEN(mi)];
+
+ if (letterbox && (h2 = w * 9 / 16) < h) {
+ glViewport(0, (h-h2)/2, w, h2);
+ cberg->aspect = w/(double)h2;
+ } else {
+ glViewport (0, 0, w, h);
+ cberg->aspect = w/(double)h;
+ }
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(cberg->fovy, cberg->aspect, cberg->zNear, cberg->zFar);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+ENTRYPOINT Bool crackberg_handle_event (ModeInfo *mi, XEvent *ev)
+{
+ cberg_state *cberg = &cbergs[MI_SCREEN(mi)];
+ KeySym keysym = 0;
+ char c = 0;
+ if (ev->xany.type == KeyPress || ev->xany.type == KeyRelease)
+ XLookupString (&ev->xkey, &c, 1, &keysym, 0);
+
+ if (ev->xany.type == KeyPress) {
+ switch (keysym) {
+ case XK_Left: cberg->motion_state |= MOTION_LROT; break;
+ case XK_Prior: cberg->motion_state |= MOTION_LROT; break;
+ case XK_Right: cberg->motion_state |= MOTION_RROT; break;
+ case XK_Next: cberg->motion_state |= MOTION_RROT; break;
+ case XK_Down: cberg->motion_state |= MOTION_BACK; break;
+ case XK_Up: cberg->motion_state |= MOTION_FORW; break;
+ case '1': cberg->motion_state |= MOTION_DEC; break;
+ case '2': cberg->motion_state |= MOTION_INC; break;
+ case 'a': cberg->motion_state |= MOTION_LEFT; break;
+ case 'd': cberg->motion_state |= MOTION_RIGHT; break;
+ case 's': cberg->motion_state |= MOTION_BACK; break;
+ case 'w': cberg->motion_state |= MOTION_FORW; break;
+ default: return False;
+ }
+ cberg->motion_state |= MOTION_MANUAL;
+ } else if (ev->xany.type == KeyRelease) {
+#if 0
+ XEvent peek_ev;
+ if (XPending(mi->dpy)) {
+ XPeekEvent(mi->dpy, &peek_ev);
+ if (peek_ev.type == KeyPress
+ && peek_ev.xkey.keycode == ev->xkey.keycode
+ && peek_ev.xkey.time - ev->xkey.time < 2) {
+ XNextEvent(mi->dpy, &peek_ev); /* drop bullshit repeat events */
+ return False;
+ }
+ }
+#endif
+
+ switch (keysym) {
+ case XK_Left: cberg->motion_state &= ~MOTION_LROT; break;
+ case XK_Prior: cberg->motion_state &= ~MOTION_LROT; break;
+ case XK_Right: cberg->motion_state &= ~MOTION_RROT; break;
+ case XK_Next: cberg->motion_state &= ~MOTION_RROT; break;
+ case XK_Down: cberg->motion_state &= ~MOTION_BACK; break;
+ case XK_Up: cberg->motion_state &= ~MOTION_FORW; break;
+ case '1': cberg->motion_state &= ~MOTION_DEC; break;
+ case '2': cberg->motion_state &= ~MOTION_INC; break;
+ case 'a': cberg->motion_state &= ~MOTION_LEFT; break;
+ case 'd': cberg->motion_state &= ~MOTION_RIGHT; break;
+ case 's': cberg->motion_state &= ~MOTION_BACK; break;
+ case 'w': cberg->motion_state &= ~MOTION_FORW; break;
+ case ' ':
+ if (cberg->motion_state == MOTION_MANUAL)
+ cberg->motion_state = MOTION_AUTO;
+ break;
+ default: return False;
+ }
+ } else if (ev->xany.type == ButtonPress &&
+ ev->xbutton.button == Button1) {
+ cberg->button_down_p = True;
+ cberg->mouse_x = ev->xbutton.x;
+ cberg->mouse_y = ev->xbutton.y;
+ cberg->motion_state = MOTION_MANUAL;
+ cberg->paused.tv_sec = 0;
+ } else if (ev->xany.type == ButtonRelease &&
+ ev->xbutton.button == Button1) {
+ cberg->button_down_p = False;
+ cberg->motion_state = MOTION_AUTO;
+ /* After mouse-up, don't go back into auto-motion mode for a second, so
+ that repeated click-and-drag gestures don't fight with auto-motion. */
+ gettimeofday(&cberg->paused, NULL);
+ } else if (ev->xany.type == MotionNotify &&
+ cberg->button_down_p) {
+ int dx = ev->xmotion.x - cberg->mouse_x;
+ int dy = ev->xmotion.y - cberg->mouse_y;
+ cberg->mouse_x = ev->xmotion.x;
+ cberg->mouse_y = ev->xmotion.y;
+ cberg->motion_state = MOTION_MANUAL;
+
+ /* Take the larger dimension, since motion_state doesn't scale */
+ if (dx > 0 && dx > dy) dy = 0;
+ if (dx < 0 && dx < dy) dy = 0;
+ if (dy > 0 && dy > dx) dx = 0;
+ if (dy < 0 && dy < dx) dx = 0;
+
+ {
+ int rot = current_device_rotation();
+ int swap;
+ while (rot <= -180) rot += 360;
+ while (rot > 180) rot -= 360;
+ if (rot > 135 || rot < -135) /* 180 */
+ dx = -dx, dy = -dy;
+ else if (rot > 45) /* 90 */
+ swap = dx, dx = -dy, dy = swap;
+ else if (rot < -45) /* 270 */
+ swap = dx, dx = dy, dy = -swap;
+ }
+
+ if (dx > 0) cberg->motion_state |= MOTION_LEFT;
+ else if (dx < 0) cberg->motion_state |= MOTION_RIGHT;
+ else if (dy > 0) cberg->motion_state |= MOTION_FORW;
+ else if (dy < 0) cberg->motion_state |= MOTION_BACK;
+ } else
+ return False;
+ return True;
+}
+
+ENTRYPOINT void draw_crackberg (ModeInfo *mi)
+{
+ cberg_state *cberg = &cbergs[MI_SCREEN(mi)];
+ struct timeval cur_frame_t;
+ double cur_frame;
+ static const float lpos[] = {2.0,0.0,-0.3,0.0};
+
+ if (!cberg->glx_context) /*XXX does this get externally tweaked? it kinda*/
+ return; /*XXX can't.. check it in crackberg_init*/
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(cberg->glx_context));
+
+ gettimeofday(&cur_frame_t, NULL);
+ cur_frame = cur_frame_t.tv_sec + cur_frame_t.tv_usec / 1.0E6;
+ if ( cberg->prev_frame ) { /*not first run */
+
+ cberg->elapsed = cur_frame - cberg->prev_frame;
+
+ if (cberg->motion_state == MOTION_AUTO &&
+ cberg->paused.tv_sec < cur_frame_t.tv_sec) {
+ cberg->x += cberg->dx * cberg->elapsed;
+ cberg->y += cberg->dy * cberg->elapsed;
+ /* cberg->z */
+ /* cberg->pitch */
+ /* cberg->roll */
+ cberg->yaw += cberg->dyaw * cberg->elapsed;
+
+ cberg->draw_elapsed += cberg->elapsed;
+ if (cberg->draw_elapsed >= 0.8) {
+ cberg->draw_elapsed = 0.0;
+ cberg->dx = drunken_rando(cberg->dx, 2.5, 0.8);
+ cberg->dy = drunken_rando(cberg->dy, 2.5, 0.8);
+ /* cberg->dz */
+ /* cberg->dpitch */
+ /* cberg->droll */
+ cberg->dyaw = drunken_rando(cberg->dyaw, 40.0, 8.0);
+ }
+ } else {
+ double scale = cberg->elapsed * cberg->mspeed;
+ if (cberg->motion_state & MOTION_BACK) {
+ cberg->x -= cos(cberg->yaw * M_PI_180) * scale;
+ cberg->y -= sin(cberg->yaw * M_PI_180) * scale;
+ }
+ if (cberg->motion_state & MOTION_FORW) {
+ cberg->x += cos(cberg->yaw * M_PI_180) * scale;
+ cberg->y += sin(cberg->yaw * M_PI_180) * scale;
+ }
+
+ if (cberg->motion_state & MOTION_LEFT) {
+ cberg->x -= sin(cberg->yaw * M_PI_180) * scale;
+ cberg->y += cos(cberg->yaw * M_PI_180) * scale;
+ }
+ if (cberg->motion_state & MOTION_RIGHT) {
+ cberg->x += sin(cberg->yaw * M_PI_180) * scale;
+ cberg->y -= cos(cberg->yaw * M_PI_180) * scale;
+ }
+
+ if (cberg->motion_state & MOTION_LROT)
+ cberg->yaw += 45 * scale;
+ if (cberg->motion_state & MOTION_RROT)
+ cberg->yaw -= 45 * scale;
+
+ if (cberg->motion_state & MOTION_DEC)
+ cberg->mspeed /= pow(MSPEED_SCALE, cberg->draw_elapsed);
+ if (cberg->motion_state & MOTION_INC)
+ cberg->mspeed *= pow(MSPEED_SCALE, cberg->draw_elapsed);
+
+ }
+ }
+ cberg->prev_frame = cur_frame;
+
+ mark_visible(cberg);
+ triles_update_state(&(cberg->trile_head), cberg);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+ gluLookAt(0,0,0, 1,0,0, 0,0,1);
+ glLightfv(GL_LIGHT0, GL_POSITION, lpos);
+ /*glRotated(cberg->roll, 1,0,0); / * XXX blah broken and unused for now..* /
+ glRotated(cberg->pitch, 0,1,0); */
+ glRotated(-cberg->yaw, 0,0,1); /* camera sees ->yaw over */
+ glTranslated(-cberg->x, -cberg->y, -cberg->z);
+
+ mi->polygon_count = cberg->ntris *
+ triles_foreach(cberg->trile_head, trile_draw,(void *) cberg);
+
+ if (mi->fps_p)
+ do_fps(mi);
+
+#ifdef DEBUG
+ glBegin(GL_LINES);
+ glColor3f(1.0,0.0,0.0);
+ glVertex3d(x_shit, y_shit, 0.0);
+ glVertex3d(x_shit, y_shit, 1.0);
+ glEnd();
+#endif
+
+ glFinish();
+ glXSwapBuffers(MI_DISPLAY(mi), MI_WINDOW(mi));
+}
+
+/* uh */
+ENTRYPOINT void free_crackberg (ModeInfo *mi)
+{
+ cberg_state *cberg = &cbergs[MI_SCREEN(mi)];
+ if (cberg->norms)
+ free(cberg->norms);
+ free(cberg->heights);
+}
+
+XSCREENSAVER_MODULE ("Crackberg", crackberg)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/crackberg.man b/hacks/glx/crackberg.man
new file mode 100644
index 0000000..5183baa
--- /dev/null
+++ b/hacks/glx/crackberg.man
@@ -0,0 +1,123 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+crackberg - Lose your way wandering some height fields, and enjoy candy.
+.SH SYNOPSIS
+.B crackberg
+[\-root]
+[\-window]
+[\-install]
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window-id \fIid\fP]
+[\-delay \fIusecs\fP]
+[\-fps]
+[\-crack]
+[\-lit]
+[\-boring]
+[\-letterbox]
+[\-flat]
+[\-wire]
+[\-nowater]
+[\-visibility \fIfloat\fP]
+[\-color \fIstring\fP]
+[\-nsubdivs \fIinteger\fP]
+.SH DESCRIPTION
+Flies through height maps, optionally animating the instantiation and
+destruction of generated tiles; by default, tiles 'grow' into place (height
+gradually increased up to correct value). In windowed mode the following key
+controls are available:
+.TP 8
+.B left, right
+Turn left and right.
+.TP 8
+.B a,w,s,d
+Move left, forwards, backwards, and to the right, respectively.
+.TP 8
+.B 1,2
+Decrease and increase manual speed, respectively.
+.TP 8
+.B Spacebar
+Return to automatic control.
+.SH OPTIONS
+.I crackberg
+accepts the following options:
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual
+class, or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+Delay between frames; default 20000 (1/50th of a second).
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-crack
+Use all possible methods to animate tile instantiation.
+.TP 8
+.B \-boring
+Do not animate instatiation at all; use this to get standard landscape
+generator behavior.
+.TP 8
+.B \-letterbox
+Drawable window region has a 16:9 aspect ratio, regardless of actual
+window size.
+.TP 8
+.B \-lit
+Enable lighting.
+.TP 8
+.B \-flat
+Flat shading (OpenGL will use one color per primitive, rather than
+interpolating betwixt vertices).
+.TP 8
+.B \-wire
+Wireframe.
+.TP 8
+.B \-nowater
+Do not display 'water' (forces negative values to zero, and selects a
+different coloring method).
+.TP 8
+.B \-visibility \fIfloat\fP
+Value in range [0.2,1.0] (default 0.6) specifying proportion of viewable
+XY plane which is to be drawn upon.
+.TP 8
+.B \-color \fIstring\fP
+Selects color scheme. Use with no or bogus argument for current list.
+.TP 8
+.B \-nsubdivs \fIinteger\fP
+Number of times to recursively subdivide each triangular tile. Each
+increment increases total triangles by a factor of 4; for instance the default
+setting 4 results in 256 triangles per tile.
+
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Matus Telgarsky. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Matus Telgarsky <catachresis@cmu.edu>, 2005.
diff --git a/hacks/glx/crumbler.c b/hacks/glx/crumbler.c
new file mode 100644
index 0000000..8e783db
--- /dev/null
+++ b/hacks/glx/crumbler.c
@@ -0,0 +1,875 @@
+/* crumbler, Copyright (c) 2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define release_crumbler 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "rotator.h"
+#include "quickhull.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+#define DEF_DENSITY "1.0"
+#define DEF_FRACTURE "0"
+
+#undef RANDSIGN
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+typedef struct {
+ qh_vertex_t *verts; /* interior point cloud */
+ int nverts, onverts;
+ qh_vertex_t min, max; /* enclosing box */
+ qh_vertex_t mid, vec;
+ int polygon_count;
+ GLuint dlist;
+ int color;
+ int color_shift;
+} chunk;
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ enum { IDLE, SPLIT, PAUSE, FLEE, ZOOM } state;
+ GLfloat tick;
+ Bool button_down_p;
+ int nchunks;
+ chunk **chunks;
+ chunk *ghost;
+
+ int ncolors;
+ XColor *colors;
+} crumbler_configuration;
+
+static crumbler_configuration *bps = NULL;
+
+static Bool do_spin;
+static GLfloat speed;
+static GLfloat density;
+static int fracture;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-density", ".density", XrmoptionSepArg, 0 },
+ { "-fracture",".fracture",XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" }
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&density, "density", "Density", DEF_DENSITY, t_Float},
+ {&fracture, "fracture","Fracture",DEF_FRACTURE,t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt crumbler_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Create a roughly spherical cloud of N random points.
+ */
+static void
+make_point_cloud (qh_vertex_t *verts, int nverts)
+{
+ int i = 0;
+ while (i < nverts)
+ {
+ verts[i].x = (0.5 - frand(1.0));
+ verts[i].y = (0.5 - frand(1.0));
+ verts[i].z = (0.5 - frand(1.0));
+ if ((verts[i].x * verts[i].x +
+ verts[i].y * verts[i].y +
+ verts[i].z * verts[i].z)
+ < 0.25)
+ i++;
+ }
+}
+
+
+static chunk *
+make_chunk (void)
+{
+ chunk *c = (chunk *) calloc (1, sizeof(*c));
+ c->dlist = glGenLists (1);
+ c->color_shift = 1 + (random() % 3) * RANDSIGN();
+ return c;
+}
+
+static void
+render_chunk (ModeInfo *mi, chunk *c)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ int i, j;
+ qh_mesh_t m;
+ GLfloat d;
+
+ if (c->nverts <= 3)
+ {
+ fprintf (stderr, "%s: nverts %d\n", progname, c->nverts);
+ abort();
+ }
+
+ c->polygon_count = 0;
+ c->min.x = c->min.y = c->min.z = 999999;
+ c->max.x = c->max.y = c->max.z = -999999;
+
+ for (i = 0; i < c->nverts; i++)
+ {
+ if (c->verts[i].x < c->min.x) c->min.x = c->verts[i].x;
+ if (c->verts[i].y < c->min.y) c->min.y = c->verts[i].y;
+ if (c->verts[i].z < c->min.z) c->min.z = c->verts[i].z;
+ if (c->verts[i].x > c->max.x) c->max.x = c->verts[i].x;
+ if (c->verts[i].y > c->max.y) c->max.y = c->verts[i].y;
+ if (c->verts[i].z > c->max.z) c->max.z = c->verts[i].z;
+ }
+
+ c->mid.x = (c->max.x + c->min.x) / 2;
+ c->mid.y = (c->max.y + c->min.y) / 2;
+ c->mid.z = (c->max.z + c->min.z) / 2;
+
+ /* midpoint as normalized vector from origin */
+ d = sqrt (c->mid.x * c->mid.x +
+ c->mid.y * c->mid.y +
+ c->mid.z * c->mid.z);
+ c->vec.x = c->mid.x / d;
+ c->vec.y = c->mid.y / d;
+ c->vec.z = c->mid.z / d;
+
+ if (c->nverts <= 3)
+ {
+ fprintf (stderr, "%s: nverts %d\n", progname, c->nverts);
+ abort();
+ }
+
+ m = qh_quickhull3d (c->verts, c->nverts);
+
+ glNewList (c->dlist, GL_COMPILE);
+ if (! wire) glBegin (GL_TRIANGLES);
+ for (i = 0, j = 0; i < m.nindices; i += 3, j++)
+ {
+ qh_vertex_t *v0 = &m.vertices[m.indices[i+0]];
+ qh_vertex_t *v1 = &m.vertices[m.indices[i+1]];
+ qh_vertex_t *v2 = &m.vertices[m.indices[i+2]];
+ qh_vec3_t *n = &m.normals[m.normalindices[j]];
+
+ if (i+2 >= m.nindices) abort();
+ if (j >= m.nnormals) abort();
+
+ glNormal3f (n->x, n->y, n->z);
+ if (wire) glBegin(GL_LINE_LOOP);
+ glVertex3f (v0->x, v0->y, v0->z);
+ glVertex3f (v1->x, v1->y, v1->z);
+ glVertex3f (v2->x, v2->y, v2->z);
+ if (wire) glEnd();
+ c->polygon_count++;
+ }
+ if (! wire) glEnd();
+
+ if (wire)
+ {
+ glPointSize (1);
+ glColor3f (0, 1, 0);
+ glBegin (GL_POINTS);
+ for (i = 0; i < c->nverts; i++)
+ {
+ if (i > 0 && i == c->onverts)
+ {
+ glEnd();
+ glColor3f (1, 0, 0);
+ glBegin (GL_POINTS);
+ }
+ glVertex3f (c->verts[i].x, c->verts[i].y, c->verts[i].z);
+ }
+ glEnd();
+ }
+
+ glEndList();
+
+ qh_free_mesh (m);
+}
+
+
+static void
+free_chunk (chunk *c)
+{
+ if (c->dlist)
+ glDeleteLists (c->dlist, 1);
+ free (c->verts);
+ free (c);
+}
+
+
+/* Make sure the chunk contains at least N points.
+ As we subdivide, the number of points is reduced.
+ This adds new points to the interior that do not
+ affect the shape of the outer hull.
+ */
+static void
+pad_chunk (chunk *c, int min)
+{
+ /* Allocate a new array of size N
+ Copy the old points into it
+ while size < N
+ pick two random points
+ add a point that is somewhere along the line between them
+ (that point will still be inside the old hull)
+ */
+ qh_vertex_t *verts;
+ int i;
+ if (c->nverts >= min) return;
+ if (c->nverts <= 3) abort();
+ verts = (qh_vertex_t *) calloc (min, sizeof(*verts));
+ if (!verts) abort();
+ memcpy (verts, c->verts, c->nverts * sizeof(*verts));
+ i = c->nverts;
+ while (i < min)
+ {
+ qh_vertex_t v;
+ int j0, j1;
+ GLfloat r;
+ j0 = random() % c->nverts;
+ do {
+ j1 = random() % c->nverts;
+ } while (j0 == j1);
+
+ r = 0.2 + frand(0.6);
+# undef R
+# define R(F) v.F = c->verts[j0].F + \
+ r * (fabs (c->verts[j1].F - c->verts[j0].F)) \
+ * (c->verts[j0].F > c->verts[j1].F ? -1 : 1)
+ R(x);
+ R(y);
+ R(z);
+# undef R
+
+ /* Sometimes quickhull.c is giving us concave and un-closed polygons.
+ Maybe it gets confused if there are duplicate points? So reject
+ this point if it is within epsilon of any earlier point.
+ */
+# if 0 /* Nope, that's not it. */
+ {
+ Bool ok = True;
+ int j;
+ for (j = 0; j < i; j++)
+ {
+
+ double X = c->verts[j].x - v.x;
+ double Y = c->verts[j].y - v.y;
+ double Z = c->verts[j].z - v.z;
+ double d2 = X*X + Y*Y + Z*Z;
+ if (d2 < 0.0001)
+ {
+ /* fprintf (stderr, "## REJ %f\n",d2); */
+ ok = False;
+ break;
+ }
+ }
+ if (! ok) continue;
+ }
+# endif
+
+ verts[i++] = v;
+ }
+
+#if 0
+ fprintf (stdout, " int n = %d;\n", min);
+ fprintf (stdout, " qh_vertex_t v[] = {");
+ for (i = 0; i < min; i++)
+ fprintf(stdout,"{%f,%f,%f},", verts[i].x, verts[i].y, verts[i].z);
+ fprintf (stdout, "};\n\n");
+#endif
+
+ free (c->verts);
+ c->verts = verts;
+ c->onverts = c->nverts;
+ c->nverts = min;
+
+#if 0
+ qh_vertex_t *verts2 = (qh_vertex_t *) calloc (n, sizeof(*verts2));
+ memcpy (verts2, v, n * sizeof(*verts2));
+ free (c->verts);
+ c->verts = verts2;
+ c->onverts = 0;
+ c->nverts = n;
+#endif
+}
+
+
+/* Returns a list of N new chunks.
+ */
+static chunk **
+split_chunk (ModeInfo *mi, chunk *c, int nchunks)
+{
+ /* Pick N key-points from the cloud.
+ Create N new chunks.
+ For each old point:
+ It goes in chunk N if it is closest to key-point N.
+ Free old chunk.
+ for each new chunk
+ render_chunk
+ */
+ crumbler_configuration *bp = &bps[MI_SCREEN(mi)];
+ chunk **chunks;
+ int *keys;
+ int i, j;
+ int retries = 0;
+
+ RETRY:
+ chunks = (chunk **) calloc (nchunks, sizeof(*chunks));
+ keys = (int *) calloc (nchunks, sizeof(*keys));
+
+ for (i = 0; i < nchunks; i++)
+ {
+ /* Fill keys with random numbers that are not duplicates. */
+ Bool ok = True;
+ chunk *c2 = 0;
+ if (nchunks >= c->nverts)
+ {
+ fprintf (stderr, "%s: nverts %d nchunks %d\n", progname,
+ c->nverts, nchunks);
+ abort();
+ }
+ do {
+ keys[i] = random() % c->nverts;
+ ok = True;
+ for (j = 0; j < i; j++)
+ if (keys[i] == keys[j])
+ {
+ ok = False;
+ break;
+ }
+ } while (!ok);
+
+ c2 = make_chunk();
+ chunks[i] = c2;
+ chunks[i]->nverts = 0;
+ c2->verts = (qh_vertex_t *) calloc (c->nverts, sizeof(*c2->verts));
+ c2->color = (c->color + (random() % (1 + (bp->ncolors / 3))))
+ % bp->ncolors;
+ }
+
+ /* Add the verts to the approprate chunks
+ */
+ for (i = 0; i < c->nverts; i++)
+ {
+ qh_vertex_t *v0 = &c->verts[i];
+ int target_chunk = -1;
+ double target_d2 = 9999999;
+ chunk *c2 = 0;
+
+ for (j = 0; j < nchunks; j++)
+ {
+ qh_vertex_t *v1 = &c->verts[keys[j]];
+ double X = v1->x - v0->x;
+ double Y = v1->y - v0->y;
+ double Z = v1->z - v0->z;
+ double d2 = X*X + Y*Y + Z*Z;
+ if (d2 < target_d2)
+ {
+ target_d2 = d2;
+ target_chunk = j;
+ }
+ }
+ if (target_chunk == -1) abort();
+
+ c2 = chunks[target_chunk];
+ c2->verts[c2->nverts++] = *v0;
+ if (c2->nverts > c->nverts) abort();
+ }
+
+ free (keys);
+ keys = 0;
+
+ for (i = 0; i < nchunks; i++)
+ {
+ chunk *c2 = chunks[i];
+
+ /* It is possible that the keys we have chosen have resulted in one or
+ more cells that have 3 or fewer points in them. If that's the case,
+ re-randomize.
+ */
+ if (c2->nverts <= 3)
+ {
+ for (j = 0; j < nchunks; j++)
+ free_chunk (chunks[j]);
+ free (chunks);
+ chunks = 0;
+ if (retries++ > 100)
+ {
+ fprintf(stderr, "%s: unsplittable\n", progname);
+ abort();
+ }
+ goto RETRY;
+ }
+
+ if (i == 0) /* The one we're gonna keep */
+ pad_chunk (c2, c->nverts);
+ render_chunk (mi, c2);
+ }
+
+ return chunks;
+}
+
+
+static void
+tick_crumbler (ModeInfo *mi)
+{
+ crumbler_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat ts;
+
+ if (bp->button_down_p) return;
+
+ switch (bp->state) {
+ case IDLE: ts = 0.02; break;
+ case SPLIT: ts = 0.01; break;
+ case PAUSE: ts = 0.008; break;
+ case FLEE: ts = 0.005; break;
+ case ZOOM: ts = 0.03; break;
+ default: abort(); break;
+ }
+
+ bp->tick += ts * speed;
+
+ if (bp->tick < 1) return;
+
+ bp->tick = 0;
+ bp->state = (bp->state + 1) % (ZOOM + 1);
+
+ switch (bp->state) {
+ case IDLE:
+ {
+ chunk *c = bp->chunks[0];
+ int i;
+
+ /* We already animated it zooming to full size. Now make it real. */
+ GLfloat X = (c->max.x - c->min.x);
+ GLfloat Y = (c->max.y - c->min.y);
+ GLfloat Z = (c->max.z - c->min.z);
+ GLfloat s = 1 / MAX(X, MAX(Y, Z));
+
+ for (i = 0; i < c->nverts; i++)
+ {
+ c->verts[i].x *= s;
+ c->verts[i].y *= s;
+ c->verts[i].z *= s;
+ }
+
+ /* Re-render it to move the verts in the display list too.
+ This also recomputes min, max and mid.
+ */
+ render_chunk (mi, c);
+ break;
+ }
+
+ case SPLIT:
+ {
+ chunk *c = bp->chunks[0];
+ int frac = (fracture >= 2 ? fracture : 2 + (2 * (random() % 5)));
+ chunk **chunks = split_chunk (mi, c, frac);
+ if (bp->nchunks != 1) abort();
+ if (bp->ghost) abort();
+ bp->ghost = c;
+ free (bp->chunks);
+ bp->chunks = chunks;
+ bp->nchunks = frac;
+ break;
+ }
+
+ case PAUSE:
+ break;
+
+ case FLEE:
+ if (bp->ghost) free_chunk (bp->ghost);
+ bp->ghost = 0;
+ break;
+
+ case ZOOM:
+ {
+ chunk *c = bp->chunks[0];
+ int i;
+ for (i = 1; i < bp->nchunks; i++)
+ free_chunk (bp->chunks[i]);
+ bp->nchunks = 1;
+
+ /* We already animated the remaining chunk moving toward the origin.
+ Make it real.
+ */
+ for (i = 0; i < c->nverts; i++)
+ {
+ c->verts[i].x -= c->mid.x;
+ c->verts[i].y -= c->mid.y;
+ c->verts[i].z -= c->mid.z;
+ }
+
+ /* Re-render it to move the verts in the display list too.
+ This also recomputes min, max and mid (now 0).
+ */
+ render_chunk (mi, c);
+ break;
+ }
+
+ default: abort(); break;
+ }
+}
+
+
+static GLfloat
+ease_fn (GLfloat r)
+{
+ return cos ((r/2 + 1) * M_PI) + 1; /* Smooth curve up, end at slope 1. */
+}
+
+
+static GLfloat
+ease_ratio (GLfloat r)
+{
+ GLfloat ease = 0.35;
+ if (r <= 0) return 0;
+ else if (r >= 1) return 1;
+ else if (r <= ease) return ease * ease_fn (r / ease);
+ else if (r > 1-ease) return 1 - ease * ease_fn ((1 - r) / ease);
+ else return r;
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_crumbler (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+crumbler_handle_event (ModeInfo *mi, XEvent *event)
+{
+ crumbler_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_crumbler (ModeInfo *mi)
+{
+ crumbler_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ MI_INIT (mi, bps);
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_crumbler (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ {
+ double spin_speed = 0.5 * speed;
+ double spin_accel = 0.3;
+ double wander_speed = 0.01 * speed;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ True);
+ bp->trackball = gltrackball_init (True);
+ }
+
+ bp->ncolors = 1024;
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+
+ /* brighter colors, please... */
+ for (i = 0; i < bp->ncolors; i++)
+ {
+# undef R
+# define R(F) F = 65535 * (0.3 + 0.7 * ((F) / 65535.0))
+ R (bp->colors[i].red);
+ R (bp->colors[i].green);
+ R (bp->colors[i].blue);
+# undef R
+ }
+
+# ifdef HAVE_MOBILE
+# ifdef USE_IPHONE
+ density *= 0.5; /* iPhone 6s runs out of memory at 4500 nverts. */
+# else
+ density *= 0.3; /* Android Nexus_5_8.1 emulator runs out earlier. */
+# endif
+# endif
+
+ {
+ chunk *c;
+ bp->nchunks = 1;
+ bp->chunks = (chunk **) calloc (bp->nchunks, sizeof(*bp->chunks));
+ c = make_chunk();
+ bp->chunks[0] = c;
+ c->nverts = 4500 * density;
+ c->verts = (qh_vertex_t *) calloc (c->nverts, sizeof(*c->verts));
+ make_point_cloud (c->verts, c->nverts);
+
+ /* Let's shrink it to a point then zoom in. */
+ bp->state = ZOOM;
+ bp->tick = 0;
+ for (i = 0; i < c->nverts; i++)
+ {
+ c->verts[i].x /= 500;
+ c->verts[i].y /= 500;
+ c->verts[i].z /= 500;
+ }
+
+ render_chunk (mi, c);
+ }
+}
+
+
+static void
+draw_chunk (ModeInfo *mi, chunk *c, GLfloat alpha)
+{
+ crumbler_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat color[4];
+
+ color[0] = bp->colors[c->color].red / 65536.0;
+ color[1] = bp->colors[c->color].green / 65536.0;
+ color[2] = bp->colors[c->color].blue / 65536.0;
+ color[3] = alpha;
+ glColor4fv (color);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+
+ c->color += c->color_shift;
+ while (c->color < 0) c->color += bp->ncolors;
+ while (c->color >= bp->ncolors) c->color -= bp->ncolors;
+
+ glCallList (c->dlist);
+ mi->polygon_count += c->polygon_count;
+}
+
+
+ENTRYPOINT void
+draw_crumbler (ModeInfo *mi)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ crumbler_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GLfloat alpha = 1;
+ int i;
+
+ static const GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
+ static const GLfloat bshiny = 128.0;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ tick_crumbler (mi);
+
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 8,
+ (z - 0.5) * 15);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ mi->polygon_count = 0;
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, bspec);
+ glMateriali (GL_FRONT, GL_SHININESS, bshiny);
+
+ if (do_wander)
+ glScalef (10, 10, 10);
+ else
+ glScalef (13, 13, 13);
+
+ alpha = 1;
+ for (i = 0; i < bp->nchunks; i++)
+ {
+ chunk *c = bp->chunks[i];
+
+ glPushMatrix();
+
+ switch (bp->state) {
+ case FLEE:
+ {
+ GLfloat r = ease_ratio (bp->tick);
+ /* Move everybody toward the origin, so that chunk #0 ends up
+ centered there. */
+ glTranslatef (-r * c->mid.x,
+ -r * c->mid.y,
+ -r * c->mid.z);
+ if (i != 0)
+ {
+ /* Move this chunk away from the center, along a vector from
+ the origin to its midpoint. */
+ GLfloat d2 = r * 6;
+ glTranslatef (c->vec.x * d2, c->vec.y * d2, c->vec.z * d2);
+ alpha = 1 - r;
+ }
+ }
+ break;
+
+ case ZOOM:
+ {
+ chunk *c = bp->chunks[0];
+ GLfloat X = (c->max.x - c->min.x);
+ GLfloat Y = (c->max.y - c->min.y);
+ GLfloat Z = (c->max.z - c->min.z);
+ GLfloat size0 = MAX(X, MAX(Y, Z));
+ GLfloat size1 = 1.0;
+ GLfloat r = 1 - ease_ratio (bp->tick);
+ GLfloat s = 1 / (size0 + r * (size1 - size0));
+ glScalef (s, s, s);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ draw_chunk (mi, c, alpha);
+ glPopMatrix();
+ }
+
+ /* Draw the old one, fading out. */
+ if (!wire && bp->state == SPLIT && bp->ghost)
+ {
+ GLfloat s;
+ /* alpha = 1 - bp->tick; */
+ alpha = 1;
+ /* s = 0.7 + (0.3 * ease_ratio (1-bp->tick)); */
+ s = 2 * ease_ratio ((1-bp->tick) / 2);
+ s *= 1.01;
+ glScalef (s, s, s);
+ draw_chunk (mi, bp->ghost, alpha);
+ }
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+
+ENTRYPOINT void
+free_crumbler (ModeInfo *mi)
+{
+ crumbler_configuration *bp = &bps[MI_SCREEN(mi)];
+ int i;
+ free (bp->trackball);
+ free (bp->rot);
+ free (bp->colors);
+ for (i = 0; i < bp->nchunks; i++)
+ free_chunk (bp->chunks[i]);
+ free (bp->chunks);
+}
+
+
+XSCREENSAVER_MODULE ("Crumbler", crumbler)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/crumbler.man b/hacks/glx/crumbler.man
new file mode 100644
index 0000000..a608d9d
--- /dev/null
+++ b/hacks/glx/crumbler.man
@@ -0,0 +1,77 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+crumbler - voronoi divisions of a sphere.
+.SH SYNOPSIS
+.B crumbler
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-density \fInumber\fP]
+[\-fracture \fInumber\fP]
+[\-no-wander]
+[\-no-spin]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Randomly subdivides a ball into voronoi chunks, then further subdivides one
+of the remaining pieces.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-density \fInumber\fP
+Density of the polygons mesh. 2.0 means twice as dense, 0.5 means half.
+.TP 8
+.B \-fracture \fInumber\fP
+How many times to fracture each object. 0 means random.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the object should spin.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2018 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/cube21.c b/hacks/glx/cube21.c
new file mode 100644
index 0000000..451a523
--- /dev/null
+++ b/hacks/glx/cube21.c
@@ -0,0 +1,941 @@
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Cube 21 - a Rubik-like puzzle. It changes its shape and has more than
+ * 200 configurations. It is known better as Square-1, but it is called
+ * Cube 21 in the Czech republic, where it was invented in 1992.
+ *
+ * This file is derived from cage.c,
+ * "cage --- the Impossible Cage, an Escher like scene",
+ * by Marcelo F. Vienna,
+ * parts from gltext.c by Jamie Zawinski
+ *
+ * Vaclav (Vasek) Potocek
+ * vasek.potocek@post.cz
+ */
+
+/* TODO:
+ * some simple "solve mode"
+ * use rotator
+ */
+
+/*-
+ * Texture mapping is only available on RGBA contexts, Mono and color index
+ * visuals DO NOT support texture mapping in OpenGL.
+ *
+ * BUT Mesa do implements RGBA contexts in pseudo color visuals, so texture
+ * mapping should work on PseudoColor, DirectColor, TrueColor using Mesa. Mono
+ * is not officially supported for both OpenGL and Mesa, but seems to not crash
+ * Mesa.
+ *
+ * In real OpenGL, PseudoColor DO NOT support texture map (as far as I know).
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n"
+
+# define free_cube21 0
+# define release_cube21 0
+#include "xlockmore.h"
+
+#include "gltrackball.h"
+
+#ifdef USE_GL
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_TEXTURE "True"
+#define DEF_RANDOMIZE "True"
+#define DEF_SPINSPEED "1.0"
+#define DEF_ROTSPEED "3.0"
+#define DEF_WANDERSPEED "0.02"
+#define DEF_WAIT "40.0"
+#define DEF_CUBESIZE "0.7"
+#define DEF_COLORMODE "six"
+
+#ifdef Pi
+#undef Pi
+#endif
+#define Pi M_PI
+
+#define SHUFFLE 100
+
+#define COS15 0.9659258263
+#define SIN15 0.2588190451
+#define COS30 0.8660254038
+#define SIN30 0.5000000000
+
+#define TEX_WIDTH 128
+#define TEX_HEIGHT 128
+#define TEX_GRAY 0.7, 0.7
+#define BORDER 3
+#define BORDER2 9
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define rnd01() (random()%2)
+#define rndcolor() (frand(0.5)+0.3)
+
+/*************************************************************************/
+
+static Bool spin, wander, rndstart, tex;
+static float spinspeed, tspeed, wspeed, twait, size;
+static char *colmode_s;
+static int colmode;
+
+static argtype vars[] = {
+ { &spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ { &wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ { &rndstart, "randomize", "Randomize", DEF_RANDOMIZE, t_Bool},
+ { &tex, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ { &spinspeed, "spinspeed", "SpinSpeed", DEF_SPINSPEED, t_Float},
+ { &tspeed, "rotspeed", "RotSpeed", DEF_ROTSPEED, t_Float},
+ { &wspeed, "wanderspeed", "WanderSpeed", DEF_WANDERSPEED, t_Float},
+ { &twait, "wait", "Wait", DEF_WAIT, t_Float},
+ { &size, "cubesize", "CubeSize", DEF_CUBESIZE, t_Float},
+ { &colmode_s, "colormode", "ColorMode", DEF_COLORMODE, t_String}
+};
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-randomize", ".randomize", XrmoptionNoArg, "True" },
+ { "+randomize", ".randomize", XrmoptionNoArg, "False" },
+ { "-texture", ".texture", XrmoptionNoArg, "True" },
+ { "+texture", ".texture", XrmoptionNoArg, "False" },
+ { "-spinspeed", ".spinspeed", XrmoptionSepArg, 0 },
+ { "-wanderspeed", ".wanderspeed", XrmoptionSepArg, 0 },
+ { "-rotspeed", ".rotspeed", XrmoptionSepArg, 0 },
+ { "-wait", ".wait", XrmoptionSepArg, 0 },
+ { "-cubesize", ".cubesize", XrmoptionSepArg, 0 },
+ { "-colormode", ".colormode", XrmoptionSepArg, 0 }
+};
+
+ENTRYPOINT ModeSpecOpt cube21_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct cube21_description =
+{ "cube21", "init_cube21", "draw_cube21", NULL,
+ "draw_cube21", "change_cube21", NULL, &cube21_opts,
+ 25000, 1, 1, 1, 1.0, 4, "",
+ "Shows randomly shuffling Cube 21", 0, NULL
+};
+#endif
+
+typedef enum {
+ CUBE21_STATE_BASIC,
+ CUBE21_PAUSE1 = CUBE21_STATE_BASIC,
+ CUBE21_ROT_BASE,
+ CUBE21_ROT_TOP = CUBE21_ROT_BASE,
+ CUBE21_ROT_BOTTOM,
+ CUBE21_PAUSE2,
+ CUBE21_HALF_BASE,
+ CUBE21_HALF1 = CUBE21_HALF_BASE,
+ CUBE21_HALF2
+} cube21_state;
+
+typedef enum {
+ CUBE21_COLOR_WHITE,
+ CUBE21_COLOR_RANDOM,
+ CUBE21_COLOR_SILVER,
+ CUBE21_COLOR_TWORND,
+ CUBE21_COLOR_CLASSIC,
+ CUBE21_COLOR_SIXRND
+} cube21_cmode;
+
+typedef int pieces_t[2][13];
+typedef int cind_t[5][12];
+typedef GLfloat col_t[6][3];
+
+typedef struct {
+ GLXContext *glx_context;
+ GLfloat ratio;
+ cube21_state state; /* type of "rotation" - shuffling */
+ GLfloat xrot, yrot; /* "spin" - object rotation around axis */
+ GLfloat posarg; /* position argument (for sine function) */
+ GLfloat t, tmax; /* rotation clock */
+ int hf[2], fr[2]; /* half flipped / face rotated flags */
+ int rface, ramount; /* selected face and amount of rotation in multiplies of 30deg */
+ int pieces[2][13]; /* locations of "narrow" and "wide" pieces */
+ int cind[5][12]; /* color indices */
+ GLfloat colors[6][3]; /* color map */
+
+ Bool wire, cmat;
+ unsigned char texture[TEX_HEIGHT][TEX_WIDTH];
+
+ GLfloat texp, texq, posc[6];
+ GLfloat color_inner[4];
+
+ Bool button_down_p;
+ trackball_state *trackball;
+
+} cube21_conf;
+
+static cube21_conf *cube21 = NULL;
+
+static const GLfloat shininess = 20.0;
+static const GLfloat ambient[] = {0.0, 0.0, 0.0, 1.0};
+static const GLfloat diffuse[] = {1.0, 1.0, 1.0, 1.0};
+static const GLfloat position0[] = {1.0, 1.0, 1.0, 0.0};
+static const GLfloat position1[] = {-1.0, -1.0, 1.0, 0.0};
+static const GLfloat lmodel_ambient[] = {0.1, 0.1, 0.1, 1.0};
+static const GLfloat material_ambient[] = {0.7, 0.7, 0.7, 1.0};
+static const GLfloat material_diffuse[] = {0.7, 0.7, 0.7, 1.0};
+static const GLfloat material_specular[] = {0.2, 0.2, 0.2, 1.0};
+static const GLfloat zpos = -18.0;
+
+/*************************************************************************/
+
+static void find_matches(pieces_t pieces, int matches[12], int s)
+{
+ int i, j = 1;
+ for(i = 1; i<6; i++) {
+ if(pieces[s][i] && pieces[s][i+6]) {
+ matches[j++] = i;
+ }
+ }
+ matches[0] = j;
+ for(i = 1; i<matches[0]; i++) {
+ matches[j++] = matches[i]-6;
+ }
+ matches[j++] = 6;
+ matches[0] = j;
+}
+
+static void rot_face(pieces_t pieces, cind_t colors, int s, int o)
+{
+ int i;
+ int tmp[12], tmpc[2][12];
+ int c0 = 2*s, c1 = c0+1;
+ for(i = 0; i<12; i++) {
+ tmp[i] = pieces[s][i];
+ tmpc[0][i] = colors[c0][i];
+ tmpc[1][i] = colors[c1][i];
+ }
+ if(o<0) o += 12;
+ for(i = 0; i<12; i++, o++) {
+ if(o==12) o = 0;
+ pieces[s][i] = tmp[o];
+ colors[c0][i] = tmpc[0][o];
+ colors[c1][i] = tmpc[1][o];
+ }
+}
+
+static void rot_halves(pieces_t pieces, cind_t colors, int hf[2], int s)
+{
+ int ss = 6*s, i, j, k, t;
+ for(i = 0; i<6; i++) {
+ j = ss+i; k = ss+6-i;
+ t = pieces[0][j];
+ pieces[0][j] = pieces[1][k];
+ pieces[1][k] = t;
+ k--;
+ t = colors[0][j];
+ colors[0][j] = colors[2][k];
+ colors[2][k] = t;
+ t = colors[1][j];
+ colors[1][j] = colors[3][k];
+ colors[3][k] = t;
+ }
+ hf[s] ^= 1;
+}
+
+static void randomize(cube21_conf *cp)
+{
+ int i, j, s;
+ int matches[12];
+ for(i = 0; i<SHUFFLE; i++) {
+ s = rnd01();
+ find_matches(cp->pieces, matches, s);
+ j = matches[0]-1;
+ j = random()%j;
+ j = matches[j+1];
+ rot_face(cp->pieces, cp->cind, s, j);
+ s = rnd01();
+ rot_halves(cp->pieces, cp->cind, cp->hf, s);
+ }
+}
+
+static void finish(cube21_conf *cp)
+{
+ int j, s;
+ int matches[12];
+ switch(cp->state) {
+ case CUBE21_PAUSE1:
+ s = rnd01();
+ find_matches(cp->pieces, matches, s);
+ j = matches[0]-1;
+ j = random()%j;
+ j = matches[j+1];
+ if(j==6 && rnd01()) j = -6;
+ cp->state = CUBE21_ROT_BASE+s;
+ cp->tmax = 30.0*abs(j);
+ cp->fr[0] = cp->fr[1] = 0;
+ cp->rface = s;
+ cp->ramount = j;
+ break;
+ case CUBE21_ROT_TOP:
+ case CUBE21_ROT_BOTTOM:
+ rot_face(cp->pieces, cp->cind, s = cp->rface, cp->ramount);
+ cp->fr[s] = 1;
+ s ^= 1;
+ if(!cp->fr[s] && rnd01()) {
+ find_matches(cp->pieces, matches, s);
+ j = matches[0]-1;
+ j = random()%j;
+ j = matches[j+1];
+ if(j==6 && rnd01()) j = -6;
+ cp->state = CUBE21_ROT_BASE+s;
+ cp->tmax = 30.0*abs(j);
+ cp->rface = s;
+ cp->ramount = j;
+ break;
+ } else {
+ cp->state = CUBE21_PAUSE2;
+ cp->tmax = twait;
+ break;
+ }
+ case CUBE21_PAUSE2:
+ s = rnd01();
+ cp->ramount = -rnd01(); /* 0 or -1, only sign is significant in this case */
+ cp->state = CUBE21_HALF_BASE+s;
+ cp->tmax = 180.0;
+ cp->rface = s;
+ break;
+ case CUBE21_HALF1:
+ case CUBE21_HALF2:
+ rot_halves(cp->pieces, cp->cind, cp->hf, cp->rface);
+ cp->state = CUBE21_PAUSE1;
+ cp->tmax = twait;
+ break;
+ }
+ cp->t = 0;
+}
+
+static void draw_narrow_piece(ModeInfo *mi, cube21_conf *cp, GLfloat s, int c1, int c2, col_t colors)
+{
+ GLfloat s1 = cp->posc[0]*s;
+ glBegin(GL_TRIANGLES);
+ glNormal3f(0.0, 0.0, s);
+ if(cp->cmat) glColor3fv(colors[c1]);
+ glTexCoord2f(0.5, 0.5); glVertex3f(0.0, 0.0, s);
+ glTexCoord2f(cp->texq, 0.0); glVertex3f(cp->posc[1], 0.0, s);
+ glTexCoord2f(cp->texp, 0.0); glVertex3f(cp->posc[2], cp->posc[3], s);
+ mi->polygon_count++;
+ glNormal3f(0.0, 0.0, -s);
+ if(cp->cmat) glColor3fv(cp->color_inner);
+ glTexCoord2f(TEX_GRAY);
+ glVertex3f(0.0, 0.0, s1);
+ glVertex3f(cp->posc[1], 0.0, s1);
+ glVertex3f(cp->posc[2], cp->posc[3], s1);
+ mi->polygon_count++;
+ glEnd();
+ glBegin(GL_QUADS);
+ glNormal3f(0.0, -1.0, 0.0);
+ if(cp->cmat) glColor3fv(cp->color_inner);
+ glTexCoord2f(TEX_GRAY);
+ glVertex3f(0.0, 0.0, s);
+ glVertex3f(cp->posc[1], 0.0, s);
+ glVertex3f(cp->posc[1], 0.0, s1);
+ glVertex3f(0.0, 0.0, s1);
+ mi->polygon_count++;
+ glNormal3f(COS15, SIN15, 0.0);
+ if(cp->cmat) glColor3fv(colors[c2]);
+ glTexCoord2f(cp->texq, cp->texq); glVertex3f(cp->posc[1], 0.0, s);
+ glTexCoord2f(cp->texq, cp->texp); glVertex3f(cp->posc[2], cp->posc[3], s);
+ glTexCoord2f(1.0, cp->texp); glVertex3f(cp->posc[2], cp->posc[3], s1);
+ glTexCoord2f(1.0, cp->texq); glVertex3f(cp->posc[1], 0.0, s1);
+ mi->polygon_count++;
+ glNormal3f(-SIN30, COS30, 0.0);
+ if(cp->cmat) glColor3fv(cp->color_inner);
+ glTexCoord2f(TEX_GRAY);
+ glVertex3f(0.0, 0.0, s);
+ glVertex3f(cp->posc[2], cp->posc[3], s);
+ glVertex3f(cp->posc[2], cp->posc[3], s1);
+ glVertex3f(0.0, 0.0, s1);
+ mi->polygon_count++;
+ glEnd();
+ glRotatef(30.0, 0.0, 0.0, 1.0);
+}
+
+static void draw_wide_piece(ModeInfo *mi, cube21_conf *cp, GLfloat s, int c1, int c2, int c3, col_t colors)
+{
+ GLfloat s1 = cp->posc[0]*s;
+ glBegin(GL_TRIANGLES);
+ glNormal3f(0.0, 0.0, s);
+ if(cp->cmat) glColor3fv(colors[c1]);
+ glTexCoord2f(0.5, 0.5); glVertex3f(0.0, 0.0, s);
+ glTexCoord2f(cp->texp, 0.0); glVertex3f(cp->posc[1], 0.0, s);
+ glTexCoord2f(0.0, 0.0); glVertex3f(cp->posc[4], cp->posc[5], s);
+ glTexCoord2f(0.0, 0.0); glVertex3f(cp->posc[4], cp->posc[5], s);
+ glTexCoord2f(0.0, cp->texp); glVertex3f(cp->posc[3], cp->posc[2], s);
+ glTexCoord2f(0.5, 0.5); glVertex3f(0.0, 0.0, s);
+ glNormal3f(0.0, 0.0, -s);
+ if(cp->cmat) glColor3fv(cp->color_inner);
+ glTexCoord2f(TEX_GRAY);
+ glVertex3f(0.0, 0.0, s1);
+ glVertex3f(cp->posc[1], 0.0, s1);
+ glVertex3f(cp->posc[4], cp->posc[5], s1);
+ glVertex3f(cp->posc[4], cp->posc[5], s1);
+ glVertex3f(cp->posc[3], cp->posc[2], s1);
+ glVertex3f(0.0, 0.0, s1);
+ glEnd();
+ glBegin(GL_QUADS);
+ glNormal3f(0.0, -1.0, 0);
+ if(cp->cmat) glColor3fv(cp->color_inner);
+ glTexCoord2f(TEX_GRAY);
+ glVertex3f(0.0, 0.0, s);
+ glVertex3f(cp->posc[1], 0.0, s);
+ glVertex3f(cp->posc[1], 0.0, s1);
+ glVertex3f(0.0, 0.0, s1);
+ glNormal3f(COS15, -SIN15, 0.0);
+ if(cp->cmat) glColor3fv(colors[c2]);
+ glTexCoord2f(cp->texq, cp->texp); glVertex3f(cp->posc[1], 0.0, s);
+ glTexCoord2f(cp->texq, 0.0); glVertex3f(cp->posc[4], cp->posc[5], s);
+ glTexCoord2f(1.0, 0.0); glVertex3f(cp->posc[4], cp->posc[5], s1);
+ glTexCoord2f(1.0, cp->texp); glVertex3f(cp->posc[1], 0.0, s1);
+ glNormal3f(SIN15, COS15, 0.0);
+ if(cp->cmat) glColor3fv(colors[c3]);
+ glTexCoord2f(cp->texq, cp->texp); glVertex3f(cp->posc[4], cp->posc[5], s);
+ glTexCoord2f(cp->texq, 0.0); glVertex3f(cp->posc[3], cp->posc[2], s);
+ glTexCoord2f(1.0, 0.0); glVertex3f(cp->posc[3], cp->posc[2], s1);
+ glTexCoord2f(1.0, cp->texp); glVertex3f(cp->posc[4], cp->posc[5], s1);
+ glNormal3f(-COS30, SIN30, 0.0);
+ if(cp->cmat) glColor3fv(cp->color_inner);
+ glTexCoord2f(TEX_GRAY);
+ glVertex3f(0.0, 0.0, s);
+ glVertex3f(cp->posc[3], cp->posc[2], s);
+ glVertex3f(cp->posc[3], cp->posc[2], s1);
+ glVertex3f(0.0, 0.0, s1);
+ glEnd();
+ glRotatef(60.0, 0.0, 0.0, 1.0);
+}
+
+static void draw_middle_piece(cube21_conf *cp, int s, cind_t cind, col_t colors)
+{
+ s *= 6;
+ glBegin(GL_QUADS);
+ if(cp->cmat) glColor3fv(cp->color_inner);
+ glNormal3f(0.0, 0.0, 1.0);
+ glTexCoord2f(TEX_GRAY);
+ glVertex3f(cp->posc[1], 0.0, cp->posc[0]);
+ glVertex3f(cp->posc[4], cp->posc[5], cp->posc[0]);
+ glVertex3f(-cp->posc[5], cp->posc[4], cp->posc[0]);
+ glVertex3f(-cp->posc[1], 0.0, cp->posc[0]);
+ glNormal3f(0.0, 0.0, -1.0);
+ glTexCoord2f(TEX_GRAY);
+ glVertex3f(cp->posc[1], 0.0, -cp->posc[0]);
+ glVertex3f(cp->posc[4], cp->posc[5], -cp->posc[0]);
+ glVertex3f(-cp->posc[5], cp->posc[4], -cp->posc[0]);
+ glVertex3f(-cp->posc[1], 0.0, -cp->posc[0]);
+ glNormal3f(0.0, -1.0, 0.0);
+ glTexCoord2f(TEX_GRAY);
+ glVertex3f(-cp->posc[1], 0.0, cp->posc[0]);
+ glVertex3f(cp->posc[1], 0.0, cp->posc[0]);
+ glVertex3f(cp->posc[1], 0.0, -cp->posc[0]);
+ glVertex3f(-cp->posc[1], 0.0, -cp->posc[0]);
+ glNormal3f(COS15, -SIN15, 0.0);
+ if(cp->cmat) glColor3fv(colors[cind[4][s]]);
+ glTexCoord2f(cp->texq, cp->texp); glVertex3f(cp->posc[1], 0.0, cp->posc[0]);
+ glTexCoord2f(1.0, cp->texp); glVertex3f(cp->posc[4], cp->posc[5], cp->posc[0]);
+ glTexCoord2f(1.0, cp->texq); glVertex3f(cp->posc[4], cp->posc[5], -cp->posc[0]);
+ glTexCoord2f(cp->texq, cp->texq); glVertex3f(cp->posc[1], 0.0, -cp->posc[0]);
+ glNormal3f(SIN15, COS15, 0.0);
+ if(cp->cmat) glColor3fv(colors[cind[4][s+1]]);
+ glTexCoord2f(0.0, 0.5); glVertex3f(cp->posc[4], cp->posc[5], cp->posc[0]);
+ glTexCoord2f(cp->texq, 0.5); glVertex3f(-cp->posc[5], cp->posc[4], cp->posc[0]);
+ glTexCoord2f(cp->texq, 0.75); glVertex3f(-cp->posc[5], cp->posc[4], -cp->posc[0]);
+ glTexCoord2f(0.0, 0.75); glVertex3f(cp->posc[4], cp->posc[5], -cp->posc[0]);
+ glNormal3f(-COS15, SIN15, 0.0);
+ if(cp->cmat) glColor3fv(colors[cind[4][s+4]]);
+ glTexCoord2f(0.0, 0.75); glVertex3f(-cp->posc[5], cp->posc[4], cp->posc[0]);
+ glTexCoord2f(1.0, 0.75); glVertex3f(-cp->posc[1], 0.0, cp->posc[0]);
+ glTexCoord2f(1.0, 1.0); glVertex3f(-cp->posc[1], 0.0, -cp->posc[0]);
+ glTexCoord2f(0.0, 1.0); glVertex3f(-cp->posc[5], cp->posc[4], -cp->posc[0]);
+ glEnd();
+}
+
+static void draw_middle(cube21_conf *cp)
+{
+ if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0);
+ draw_middle_piece(cp, 0, cp->cind, cp->colors);
+ if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0);
+ glRotatef(180.0, 0.0, 0.0, 1.0);
+ if(cp->hf[1]) glRotatef(180.0, 0.0, 1.0, 0.0);
+ draw_middle_piece(cp, 1, cp->cind, cp->colors);
+ if(cp->hf[1]) glRotatef(180.0, 0.0, 1.0, 0.0);
+}
+
+static void draw_half_face(ModeInfo *mi, cube21_conf *cp, int s, int o)
+{
+ int i, s1 = 1-s*2, s2 = s*2;
+ for(i = o; i<o+6; i++) {
+ if(cp->pieces[s][i+1])
+ draw_narrow_piece(mi, cp, s1, cp->cind[s2][i], cp->cind[s2+1][i], cp->colors);
+ else {
+ draw_wide_piece(mi, cp, s1, cp->cind[s2][i], cp->cind[s2+1][i], cp->cind[s2+1][i+1], cp->colors);
+ i++;
+ }
+ }
+}
+
+static void draw_top_face(ModeInfo *mi, cube21_conf *cp)
+{
+ draw_half_face(mi, cp, 0, 0);
+ draw_half_face(mi, cp, 0, 6);
+}
+
+static void draw_bottom_face(ModeInfo *mi, cube21_conf *cp)
+{
+ draw_half_face(mi, cp, 1, 0);
+ draw_half_face(mi, cp, 1, 6);
+}
+
+static Bool draw_main(ModeInfo *mi, cube21_conf *cp)
+{
+ GLfloat theta = cp->ramount<0?cp->t:-cp->t;
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity();
+ if(wander)
+ glTranslatef(3.0*cp->ratio*sin(13.0*cp->posarg), 3.0*sin(17.0*cp->posarg), zpos);
+ else
+ glTranslatef(0, 0, zpos);
+ glScalef(size, size, size);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glRotatef(cp->xrot, 1.0, 0.0, 0.0);
+ glRotatef(cp->yrot, 0.0, 1.0, 0.0);
+
+ gltrackball_rotate (cp->trackball);
+
+ if(cp->wire) glColor3f(0.7, 0.7, 0.7);
+ switch(cp->state) {
+ case CUBE21_PAUSE1:
+ case CUBE21_PAUSE2:
+ draw_top_face(mi, cp);
+ draw_bottom_face(mi, cp);
+ draw_middle(cp);
+ break;
+ case CUBE21_ROT_TOP:
+ glRotatef(theta, 0.0, 0.0, 1.0);
+ draw_top_face(mi, cp);
+ glRotatef(-theta, 0.0, 0.0, 1.0);
+ draw_bottom_face(mi, cp);
+ draw_middle(cp);
+ break;
+ case CUBE21_ROT_BOTTOM:
+ draw_top_face(mi, cp);
+ glRotatef(theta, 0.0, 0.0, 1.0);
+ draw_bottom_face(mi, cp);
+ glRotatef(-theta, 0.0, 0.0, 1.0);
+ draw_middle(cp);
+ break;
+ case CUBE21_HALF1:
+ glRotatef(theta, 0.0, 1.0, 0.0);
+ case CUBE21_HALF2:
+ draw_half_face(mi, cp, 0, 0);
+ glRotatef(-180.0, 0.0, 0.0, 1.0);
+ draw_half_face(mi, cp, 1, 0);
+ glRotatef(-180.0, 0.0, 0.0, 1.0);
+ if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0);
+ draw_middle_piece(cp, 0, cp->cind, cp->colors);
+ if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0);
+ if(cp->state==CUBE21_HALF1)
+ glRotatef(-theta, 0.0, 1.0, 0.0);
+ else
+ glRotatef(theta, 0.0, 1.0, 0.0);
+ glRotatef(180.0, 0.0, 0.0, 1.0);
+ draw_half_face(mi, cp, 0, 6);
+ glRotatef(-180.0, 0.0, 0.0, 1.0);
+ draw_half_face(mi, cp, 1, 6);
+ glRotatef(-180.0, 0.0, 0.0, 1.0);
+ if(cp->hf[1]) glRotatef(180.0, 0.0, 1.0, 0.0);
+ draw_middle_piece(cp, 1, cp->cind, cp->colors);
+ break;
+ }
+ if(spin) {
+ if((cp->xrot += spinspeed)>360.0) cp->xrot -= 360.0;
+ if((cp->yrot += spinspeed)>360.0) cp->yrot -= 360.0;
+ }
+ if(wander)
+ if((cp->posarg += wspeed/1000.0)>360.0) cp->posarg -= 360.0;
+ if((cp->t += tspeed)>cp->tmax) finish(cp);
+ return True;
+}
+
+static void parse_colmode(void)
+{
+ if(!colmode_s) {
+ colmode = CUBE21_COLOR_WHITE;
+ return;
+ }
+ if(strstr(colmode_s, "se") || strstr(colmode_s, "sil")) colmode = CUBE21_COLOR_SILVER;
+ else if(strstr(colmode_s, "ce") || strstr(colmode_s, "cla")) colmode = CUBE21_COLOR_CLASSIC;
+ else if(strstr(colmode_s, "2") || strstr(colmode_s, "two")) colmode = CUBE21_COLOR_TWORND;
+ else if(strstr(colmode_s, "6") || strstr(colmode_s, "six")) colmode = CUBE21_COLOR_SIXRND;
+ else if(strstr(colmode_s, "1") || strstr(colmode_s, "ran") || strstr(colmode_s, "rnd")) colmode = CUBE21_COLOR_RANDOM;
+ else colmode = CUBE21_COLOR_WHITE;
+}
+
+static void init_posc(cube21_conf *cp)
+{
+ cp->texp = (1.0-tan(Pi/12.0))/2.0;
+ cp->texq = 1.0-cp->texp;
+ /* Some significant non-trivial coordinates
+ * of the object. We need them exactly at GLfloat precision
+ * for the edges to line up perfectly. */
+ cp->posc[0] = tan(Pi/12); /* 0.268 */
+ cp->posc[1] = 1.0/cos(Pi/12); /* 1.035 */
+ cp->posc[2] = cos(Pi/6)/cos(Pi/12); /* 0.897 */
+ cp->posc[3] = sin(Pi/6)/cos(Pi/12); /* 0.518 */
+ cp->posc[4] = sqrt(2)*cos(Pi/6); /* 1.225 */
+ cp->posc[5] = sqrt(2)*sin(Pi/6); /* 0.707 = 1/sqrt(2) */
+}
+
+static void draw_horz_line(cube21_conf *cp, int x1, int x2, int y)
+{
+ int x, y0 = y, w;
+ if(y<BORDER) y = -y;
+ else y = -BORDER;
+ for(; y<BORDER; y++) {
+ if(y0+y>=TEX_HEIGHT) break;
+ w = y*y*255/BORDER2;
+ for(x=x1; x<=x2; x++)
+ if(cp->texture[y0+y][x]>w) cp->texture[y0+y][x] = w;
+ }
+}
+
+static void draw_vert_line(cube21_conf *cp, int x, int y1, int y2)
+{
+ int x0 = x, y, w;
+ if(x<BORDER) x = -x;
+ else x = -BORDER;
+ for(; x<BORDER; x++) {
+ if(x0+x>=TEX_WIDTH) break;
+ w = x*x*255/BORDER2;
+ for(y=y1; y<=y2; y++)
+ if(cp->texture[y][x0+x]>w) cp->texture[y][x0+x] = w;
+ }
+}
+
+static void draw_slanted_horz(cube21_conf *cp, int x1, int y1, int x2, int y2)
+{
+ int x, y, dx = x2-x1, dy = y2-y1, y0, w;
+ for(x=x1; x<=x2; x++) {
+ y0 = y1+(y2-y1)*(x-x1)/(x2-x1);
+ for(y=-1-BORDER; y<2+BORDER; y++) {
+ w = dx*(y0+y-y1)-dy*(x-x1);
+ w = w*w/(dx*dx+dy*dy);
+ w = w*255/BORDER2;
+ if(cp->texture[y0+y][x]>w) cp->texture[y0+y][x] = w;
+ }
+ }
+}
+
+static void draw_slanted_vert(cube21_conf *cp, int x1, int y1, int x2, int y2)
+{
+ int x, y, dx = x2-x1, dy = y2-y1, x0, w;
+ for(y=y1; y<=y2; y++) {
+ x0 = x1+(x2-x1)*(y-y1)/(y2-y1);
+ for(x=-1-BORDER; x<2+BORDER; x++) {
+ w = dy*(x0+x-x1)-dx*(y-y1);
+ w = w*w/(dy*dy+dx*dx);
+ w = w*255/BORDER2;
+ if(cp->texture[y][x0+x]>w) cp->texture[y][x0+x] = w;
+ }
+ }
+}
+
+static void make_texture(cube21_conf *cp)
+{
+ int x, y, x0, y0;
+ float grayp[2] = {TEX_GRAY};
+ for(y=0; y<TEX_HEIGHT; y++)
+ for(x=0; x<TEX_WIDTH; x++)
+ cp->texture[y][x] = 255;
+ draw_horz_line(cp, 0, TEX_WIDTH-1, 0);
+ draw_horz_line(cp, cp->texq*TEX_WIDTH, TEX_WIDTH-1, cp->texp*TEX_HEIGHT);
+ draw_horz_line(cp, cp->texq*TEX_WIDTH, TEX_WIDTH-1, cp->texq*TEX_HEIGHT);
+ draw_horz_line(cp, 0, cp->texq*TEX_WIDTH, TEX_HEIGHT/2);
+ draw_horz_line(cp, 0, TEX_WIDTH-1, TEX_HEIGHT*3/4);
+ draw_horz_line(cp, 0, TEX_WIDTH-1, TEX_HEIGHT-1);
+ draw_vert_line(cp, 0, 0, TEX_HEIGHT-1);
+ draw_vert_line(cp, cp->texq*TEX_WIDTH, 0, TEX_HEIGHT*3/4);
+ draw_vert_line(cp, TEX_WIDTH-1, 0, TEX_HEIGHT-1);
+ draw_slanted_horz(cp, 0, cp->texp*TEX_HEIGHT, TEX_WIDTH/2, TEX_HEIGHT/2);
+ draw_slanted_vert(cp, cp->texp*TEX_WIDTH, 0, TEX_WIDTH/2, TEX_HEIGHT/2);
+ draw_slanted_vert(cp, cp->texq*TEX_WIDTH, 0, TEX_WIDTH/2, TEX_HEIGHT/2);
+ x0 = grayp[0]*TEX_WIDTH;
+ y0 = grayp[1]*TEX_HEIGHT;
+ for(y=-1; y<=1; y++)
+ for(x=-1; x<=1; x++)
+ cp->texture[y0+y][x0+x] = 100;
+}
+
+/* It doesn't look good */
+/*#define MIPMAP*/
+
+static void init_gl(ModeInfo *mi)
+{
+ cube21_conf *cp = &cube21[MI_SCREEN(mi)];
+#ifdef MIPMAP
+ int status;
+#endif
+ parse_colmode();
+ cp->wire = MI_IS_WIREFRAME(mi);
+ cp->cmat = !cp->wire && (colmode != CUBE21_COLOR_WHITE);
+ if(MI_IS_MONO(mi)) {
+ tex = False;
+ cp->cmat = False;
+ }
+
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ cp->wire = 0;
+# endif
+
+ if(cp->wire) {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ return;
+ }
+ if(!tex)
+ cp->color_inner[0] = cp->color_inner[1] = cp->color_inner[2] = 0.4;
+ else
+ cp->color_inner[0] = cp->color_inner[1] = cp->color_inner[2] = 1.0;
+
+ glClearDepth(1.0);
+ glDrawBuffer(GL_BACK);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glShadeModel(GL_FLAT);
+ glDepthFunc(GL_LESS);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT1, GL_POSITION, position1);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_COLOR_MATERIAL);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, material_ambient);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material_diffuse);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material_specular);
+ glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
+ if(!tex) return;
+ glEnable(GL_TEXTURE_2D);
+#ifdef MIPMAP
+ clear_gl_error();
+ status = gluBuild2DMipmaps(GL_TEXTURE_2D, 1, TEX_WIDTH, TEX_HEIGHT,
+ GL_LUMINANCE, GL_UNSIGNED_BYTE, texture);
+ if (status) {
+ const char *s = gluErrorString(status);
+ fprintf (stderr, "%s: error mipmapping texture: %s\n", progname, (s?s:"(unknown)"));
+ exit (1);
+ }
+ check_gl_error("mipmapping");
+#else
+ glTexImage2D(GL_TEXTURE_2D, 0, 1, TEX_WIDTH, TEX_HEIGHT,
+ 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, cp->texture);
+#endif
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+#ifdef MIPMAP
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+#else
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+#endif
+}
+
+static void init_cp(cube21_conf *cp)
+{
+ int i, j;
+ GLfloat ce_colors[6][3] = {
+ {1.0, 1.0, 1.0},
+ {1.0, 0.5, 0.0},
+ {0.0, 0.9, 0.0},
+ {0.8, 0.0, 0.0},
+ {0.1, 0.1, 1.0},
+ {0.9, 0.9, 0.0}
+ };
+ cp->state = CUBE21_STATE_BASIC;
+ cp->xrot = -65.0; cp->yrot = 185.0;
+ cp->posarg = (wspeed?random()%360:0.0);
+ cp->t = 0.0; cp->tmax = twait;
+ cp->hf[0] = cp->hf[1] = 0;
+ cp->fr[0] = cp->fr[1] = 0;
+ for(i=0;i<13;i++)
+ cp->pieces[0][i] = cp->pieces[1][i] = (i%3==1?0:1);
+ switch(colmode) {
+ case CUBE21_COLOR_RANDOM:
+ case CUBE21_COLOR_TWORND:
+ case CUBE21_COLOR_SIXRND:
+ for(i=0; i<6; i++)
+ for(j=0; j<3; j++)
+ cp->colors[i][j] = rndcolor();
+ break;
+ case CUBE21_COLOR_SILVER:
+ cp->colors[0][0] = 1.0;
+ cp->colors[0][1] = 1.0;
+ cp->colors[0][2] = 1.0;
+ cp->colors[1][0] = rndcolor();
+ cp->colors[1][1] = rndcolor();
+ cp->colors[1][2] = rndcolor();
+ break;
+ case CUBE21_COLOR_CLASSIC:
+ for(i=0; i<6; i++)
+ for(j=0; j<3; j++)
+ cp->colors[i][j] = 0.2+0.7*ce_colors[i][j];
+ break;
+ }
+ switch(colmode) {
+ case CUBE21_COLOR_SILVER:
+ case CUBE21_COLOR_TWORND:
+ for(i=0; i<5; i++)
+ for(j=0; j<12; j++)
+ if(i==0) cp->cind[i][j] = 0;
+ else if(i==2) cp->cind[i][j] = 1;
+ else cp->cind[i][j] = ((j+5)%12)>=6?1:0;
+ break;
+ case CUBE21_COLOR_CLASSIC:
+ case CUBE21_COLOR_SIXRND:
+ for(i=0; i<5; i++)
+ for(j=0; j<12; j++)
+ if(i==0) cp->cind[i][j] = 4;
+ else if(i==2) cp->cind[i][j] = 5;
+ else cp->cind[i][j] = ((j+5)%12)/3;
+ break;
+ case CUBE21_COLOR_RANDOM:
+ for(i=0; i<5; i++)
+ for(j=0; j<12; j++)
+ cp->cind[i][j] = 0;
+ break;
+ }
+ if(rndstart) randomize(cp);
+}
+
+/*************************************************************************/
+
+ENTRYPOINT void reshape_cube21(ModeInfo *mi, int width, int height)
+{
+ cube21_conf *cp = &cube21[MI_SCREEN(mi)];
+ int y = 0;
+ if(!height) height = 1;
+ cp->ratio = (GLfloat)width/(GLfloat)height;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ cp->ratio = width / (GLfloat) height;
+ cp->posarg = 0;
+ }
+
+ glViewport(0, y, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(30.0, cp->ratio, 1.0, 100.0);
+ glMatrixMode(GL_MODELVIEW);
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+ENTRYPOINT Bool
+cube21_handle_event (ModeInfo *mi, XEvent *event)
+{
+ cube21_conf *cp = &cube21[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, cp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &cp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+ENTRYPOINT void init_cube21(ModeInfo *mi)
+{
+ cube21_conf *cp;
+ MI_INIT(mi, cube21);
+ cp = &cube21[MI_SCREEN(mi)];
+
+ cp->trackball = gltrackball_init (False);
+
+ if(!cp->texp) {
+ init_posc(cp);
+ make_texture(cp);
+ }
+
+#ifdef HAVE_MOBILE
+ size *= 2;
+#endif
+
+ if ((cp->glx_context = init_GL(mi)) != NULL) {
+ init_gl(mi);
+ init_cp(cp);
+ reshape_cube21(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+ENTRYPOINT void draw_cube21(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ cube21_conf *cp;
+ if (!cube21) return;
+ cp = &cube21[MI_SCREEN(mi)];
+ MI_IS_DRAWN(mi) = True;
+ if (!cp->glx_context) return;
+ mi->polygon_count = 0;
+ glXMakeCurrent(display, window, *(cp->glx_context));
+ if (!draw_main(mi, cp)) {
+ MI_ABORT(mi);
+ return;
+ }
+ if (MI_IS_FPS(mi)) do_fps (mi);
+ glFlush();
+ glXSwapBuffers(display, window);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void change_cube21(ModeInfo * mi)
+{
+ cube21_conf *cp = &cube21[MI_SCREEN(mi)];
+ if (!cp->glx_context) return;
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(cp->glx_context));
+ init_gl(mi);
+}
+#endif /* !STANDALONE */
+
+
+XSCREENSAVER_MODULE ("Cube21", cube21)
+
+#endif
diff --git a/hacks/glx/cube21.man b/hacks/glx/cube21.man
new file mode 100644
index 0000000..d90c0fb
--- /dev/null
+++ b/hacks/glx/cube21.man
@@ -0,0 +1,147 @@
+.TH XScreenSaver 1 "30-Aug-05" "X Version 11"
+.SH NAME
+cube21 - animates the Cube 21 puzzle
+.SH SYNOPSIS
+.B cube21
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-install]
+[\-delay \fImicroseconds\fP]
+[\-texture] [\-no\-texture]
+[\-mono]
+[\-wireframe]
+[\-spin] [\-no\-spin]
+[\-wander] [\-no\-wander]
+[\-randomize] [\-no\-randomize]
+[\-spinspeed \fInumber\fP]
+[\-rotspeed \fInumber\fP]
+[\-wanderspeed \fInumber\fP]
+[\-wait \fInumber\fP]
+[\-cubesize \fInumber\fP]
+[\-colormode \fIarg\fP]
+[\-fps]
+.SH DESCRIPTION
+This program animates a puzzle known as Cube 21 or Square-1.
+Its moves are chosen randomly.
+.P
+Cube 21 is a Rubik-like puzzle invented in 1992. Its specialities are that
+it can change its shape and even the number of possible moves. It can have
+more than 200 different shapes and the total number of configurations
+(assuming colors) is several tens of billions.
+.SH OPTIONS
+.I cube21
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How long to pause between frames. Default is 20000, or 0.02 second.
+.TP 8
+.B \-texture
+Use texture maps. This is the default.
+.TP 8
+.B \-no\-texture
+Use solid colors.
+.TP 8
+.B \-mono
+Disable both texture maps and colors.
+.TP 8
+.B \-wireframe
+Only draw outlines. Outlines of all pieces, not only the whole object, are drawn.
+.TP 8
+.B \-spin
+Spin the whole object around X, Y and Z axes. This is the default.
+.TP 8
+.B \-no\-spin
+Do not spin, showing the same three faces all the time.
+.TP 8
+.B \-wander
+Move the object around the screen. This is the default.
+.TP 8
+.B \-no\-wander
+Keep the object centered on the screen.
+.TP 8
+.B \-randomize
+Shuffle the puzzle randomly at startup. This is the default.
+.TP 8
+.B \-no\-randomize
+Do not shuffle at startup, begin at the shape of cube.
+.TP 8
+.B \-spinspeed \fInumber\fP
+The relative speed of spinning. Default is 1.0.
+.TP 8
+.B \-rotspeed \fInumber\fP
+The relative speed of the moves. Default is 3.0. Setting to \(<= 0.0
+makes the object stay at one configuration.
+.TP 8
+.B \-wanderspeed \fInumber\fP
+The relative speed of wandering around the screen. Default is 1.0.
+.TP 8
+.B \-wait \fInumber\fP
+How long to stay at ending position after each move. The meaning of
+the argument is again relative. Default is 40.0.
+.TP 8
+.B \-cubesize \fInumber\fP
+Size of the object. Value of 3.0 fills roughly all the screen (its height). Default is 0.7.
+.TP 8
+.B \-colormode \fIargument\fP
+How many and which colors should the object have. The colors are put on the piece
+faces so that the puzzle is solvable. The inner faces are not influenced.
+.RS
+.TP 8
+.BR se " or " silver
+Simulate the "Silver Edition" \- white and one random color.
+.TP 8
+.BR 2 " or " two
+Two random colors.
+.TP 8
+.BR ce " or " classic
+Simulate the "Classic Edition" \- white, yellow, orange, red, green and blue.
+.TP 8
+.BR 6 " or " six
+Six random colors.
+.TP 8
+.BR 1 " or " random " or " rnd
+One random color.
+.TP 8
+Anything else
+All faces white.
+.RE
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Vaclav Potocek. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Vaclav (Vasek) Potocek <vasek.potocek@post.cz>, 30-Aug-05.
diff --git a/hacks/glx/cubenetic.c b/hacks/glx/cubenetic.c
new file mode 100644
index 0000000..cc9b0d6
--- /dev/null
+++ b/hacks/glx/cubenetic.c
@@ -0,0 +1,598 @@
+/* cubenetic, Copyright (c) 2002-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*count: 5 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_cube 0
+# define release_cube 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SPIN "XYZ"
+#define DEF_WANDER "True"
+#define DEF_TEXTURE "True"
+
+#define DEF_WAVES "3"
+#define DEF_WAVE_SPEED "80"
+#define DEF_WAVE_RADIUS "512"
+
+typedef struct {
+ int color;
+ GLfloat x, y, z;
+ GLfloat w, h, d;
+ int frame;
+ GLfloat dx, dy, dz;
+ GLfloat dw, dh, dd;
+} cube;
+
+typedef struct {
+ int x, y;
+ double xth, yth;
+} wave_src;
+
+typedef struct {
+ int nwaves;
+ int radius;
+ int speed;
+ wave_src *srcs;
+ int *heights;
+} waves;
+
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ GLuint cube_list;
+ GLuint texture_id;
+ int cube_polys;
+ int ncubes;
+ cube *cubes;
+ waves *waves;
+
+ int texture_width, texture_height;
+ unsigned char *texture;
+
+ int ncolors;
+ XColor *cube_colors;
+ XColor *texture_colors;
+
+} cube_configuration;
+
+static cube_configuration *ccs = NULL;
+
+static char *do_spin;
+static Bool do_wander;
+static Bool do_texture;
+
+static int wave_count;
+static int wave_speed;
+static int wave_radius;
+static int texture_size = 256;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionSepArg, 0 },
+ { "+spin", ".spin", XrmoptionNoArg, "" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ {"-texture", ".texture", XrmoptionNoArg, "true" },
+ {"+texture", ".texture", XrmoptionNoArg, "false" },
+ {"-waves", ".waves", XrmoptionSepArg, 0 },
+ {"-wave-speed", ".waveSpeed", XrmoptionSepArg, 0 },
+ {"-wave-radius", ".waveRadius", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_String},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ {&wave_count, "waves", "Waves", DEF_WAVES, t_Int},
+ {&wave_speed, "waveSpeed", "WaveSpeed", DEF_WAVE_SPEED, t_Int},
+ {&wave_radius,"waveRadius","WaveRadius", DEF_WAVE_RADIUS,t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt cube_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+static int
+unit_cube (Bool wire)
+{
+ int polys = 0;
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* front */
+ glNormal3f (0, 0, 1);
+ glTexCoord2f(1, 0); glVertex3f ( 0.5, -0.5, 0.5);
+ glTexCoord2f(0, 0); glVertex3f ( 0.5, 0.5, 0.5);
+ glTexCoord2f(0, 1); glVertex3f (-0.5, 0.5, 0.5);
+ glTexCoord2f(1, 1); glVertex3f (-0.5, -0.5, 0.5);
+ polys++;
+ glEnd();
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* back */
+ glNormal3f (0, 0, -1);
+ glTexCoord2f(0, 0); glVertex3f (-0.5, -0.5, -0.5);
+ glTexCoord2f(0, 1); glVertex3f (-0.5, 0.5, -0.5);
+ glTexCoord2f(1, 1); glVertex3f ( 0.5, 0.5, -0.5);
+ glTexCoord2f(1, 0); glVertex3f ( 0.5, -0.5, -0.5);
+ polys++;
+ glEnd();
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* left */
+ glNormal3f (-1, 0, 0);
+ glTexCoord2f(1, 1); glVertex3f (-0.5, 0.5, 0.5);
+ glTexCoord2f(1, 0); glVertex3f (-0.5, 0.5, -0.5);
+ glTexCoord2f(0, 0); glVertex3f (-0.5, -0.5, -0.5);
+ glTexCoord2f(0, 1); glVertex3f (-0.5, -0.5, 0.5);
+ polys++;
+ glEnd();
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* right */
+ glNormal3f (1, 0, 0);
+ glTexCoord2f(1, 1); glVertex3f ( 0.5, -0.5, -0.5);
+ glTexCoord2f(1, 0); glVertex3f ( 0.5, 0.5, -0.5);
+ glTexCoord2f(0, 0); glVertex3f ( 0.5, 0.5, 0.5);
+ glTexCoord2f(0, 1); glVertex3f ( 0.5, -0.5, 0.5);
+ polys++;
+ glEnd();
+
+ if (wire) return polys;
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* top */
+ glNormal3f (0, 1, 0);
+ glTexCoord2f(0, 0); glVertex3f ( 0.5, 0.5, 0.5);
+ glTexCoord2f(0, 1); glVertex3f ( 0.5, 0.5, -0.5);
+ glTexCoord2f(1, 1); glVertex3f (-0.5, 0.5, -0.5);
+ glTexCoord2f(1, 0); glVertex3f (-0.5, 0.5, 0.5);
+ polys++;
+ glEnd();
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* bottom */
+ glNormal3f (0, -1, 0);
+ glTexCoord2f(1, 0); glVertex3f (-0.5, -0.5, 0.5);
+ glTexCoord2f(0, 0); glVertex3f (-0.5, -0.5, -0.5);
+ glTexCoord2f(0, 1); glVertex3f ( 0.5, -0.5, -0.5);
+ glTexCoord2f(1, 1); glVertex3f ( 0.5, -0.5, 0.5);
+ polys++;
+ glEnd();
+ return polys;
+}
+
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_cube (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+
+/* Waves.
+ Adapted from ../hacks/interference.c by Hannu Mallat.
+ */
+
+static void
+init_wave (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ waves *ww;
+ int i;
+ cc->waves = ww = (waves *) calloc (sizeof(*cc->waves), 1);
+ ww->nwaves = wave_count;
+ ww->radius = wave_radius;
+ ww->speed = wave_speed;
+ ww->heights = (int *) calloc (sizeof(*ww->heights), ww->radius);
+ ww->srcs = (wave_src *) calloc (sizeof(*ww->srcs), ww->nwaves);
+
+ for (i = 0; i < ww->radius; i++)
+ {
+ float max = (cc->ncolors * (ww->radius - i) / (float) ww->radius);
+ ww->heights[i] = ((max + max * cos(i / 50.0)) / 2.0);
+ }
+
+ for (i = 0; i < ww->nwaves; i++)
+ {
+ ww->srcs[i].xth = frand(2.0) * M_PI;
+ ww->srcs[i].yth = frand(2.0) * M_PI;
+ }
+}
+
+static void
+interference (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ waves *ww = cc->waves;
+ int x, y, i;
+
+ /* Move the wave origins around
+ */
+ for (i = 0; i < ww->nwaves; i++)
+ {
+ ww->srcs[i].xth += (ww->speed / 1000.0);
+ if (ww->srcs[i].xth > 2*M_PI)
+ ww->srcs[i].xth -= 2*M_PI;
+ ww->srcs[i].yth += (ww->speed / 1000.0);
+ if (ww->srcs[i].yth > 2*M_PI)
+ ww->srcs[i].yth -= 2*M_PI;
+
+ ww->srcs[i].x = (cc->texture_width/2 +
+ (cos (ww->srcs[i].xth) *
+ cc->texture_width / 2));
+ ww->srcs[i].y = (cc->texture_height/2 +
+ (cos (ww->srcs[i].yth) *
+ cc->texture_height / 2));
+ }
+
+ /* Compute the effect of the waves on each pixel,
+ and generate the output map.
+ */
+ for (y = 0; y < cc->texture_height; y++)
+ for (x = 0; x < cc->texture_width; x++)
+ {
+ int result = 0;
+ unsigned char *o;
+ for (i = 0; i < ww->nwaves; i++)
+ {
+ int dx = x - ww->srcs[i].x;
+ int dy = y - ww->srcs[i].y;
+ int dist = sqrt (dx*dx + dy*dy);
+ result += (dist > ww->radius ? 0 : ww->heights[dist]);
+ }
+ result %= cc->ncolors;
+
+ o = cc->texture + (((y * cc->texture_width) + x) << 2);
+ o[0] = (cc->texture_colors[result].red >> 8);
+ o[1] = (cc->texture_colors[result].green >> 8);
+ o[2] = (cc->texture_colors[result].blue >> 8);
+ /* o[3] = 0xFF; */
+ }
+}
+
+
+/* Textures
+ */
+
+static void
+init_texture (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ int i;
+
+ glEnable(GL_TEXTURE_2D);
+
+ clear_gl_error();
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+ glGenTextures (1, &cc->texture_id);
+ glBindTexture (GL_TEXTURE_2D, cc->texture_id);
+ check_gl_error("texture binding");
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ check_gl_error("texture initialization");
+
+ cc->texture_width = texture_size;
+ cc->texture_height = texture_size;
+
+ i = texture_size * texture_size * 4;
+ cc->texture = (unsigned char *) malloc (i);
+ memset (cc->texture, 0xFF, i);
+}
+
+
+static void
+shuffle_texture (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ interference (mi);
+ clear_gl_error();
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ cc->texture_width, cc->texture_height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE,
+ cc->texture);
+ check_gl_error("texture");
+}
+
+
+static void
+reset_colors (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ double H[3], S[3], V[3];
+ int shift = 60;
+ H[0] = frand(360.0);
+ H[1] = ((H[0] + shift) < 360) ? (H[0]+shift) : (H[0] + shift - 360);
+ H[2] = ((H[1] + shift) < 360) ? (H[1]+shift) : (H[1] + shift - 360);
+ S[0] = S[1] = S[2] = 1.0;
+ V[0] = V[1] = V[2] = 1.0;
+ make_color_loop(0, 0, 0,
+ H[0], S[0], V[0],
+ H[1], S[1], V[1],
+ H[2], S[2], V[2],
+ cc->texture_colors, &cc->ncolors,
+ False, False);
+
+ make_smooth_colormap (0, 0, 0,
+ cc->cube_colors, &cc->ncolors,
+ False, 0, False);
+}
+
+
+ENTRYPOINT Bool
+cube_handle_event (ModeInfo *mi, XEvent *event)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, cc->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &cc->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ reset_colors (mi);
+ return True;
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_cube (ModeInfo *mi)
+{
+ int i;
+ cube_configuration *cc;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, ccs);
+
+ cc = &ccs[MI_SCREEN(mi)];
+
+ if ((cc->glx_context = init_GL(mi)) != NULL) {
+ reshape_cube (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+
+ if (!wire)
+ {
+ static const GLfloat pos[4] = {1.0, 0.5, 1.0, 0.0};
+ static const GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+ static const GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ }
+
+
+ {
+ Bool spinx=False, spiny=False, spinz=False;
+ double spin_speed = 1.0;
+ double wander_speed = 0.05;
+
+ char *s = do_spin;
+ while (*s)
+ {
+ if (*s == 'x' || *s == 'X') spinx = True;
+ else if (*s == 'y' || *s == 'Y') spiny = True;
+ else if (*s == 'z' || *s == 'Z') spinz = True;
+ else if (*s == '0') ;
+ else
+ {
+ fprintf (stderr,
+ "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
+ progname, do_spin);
+ exit (1);
+ }
+ s++;
+ }
+
+ cc->rot = make_rotator (spinx ? spin_speed : 0,
+ spiny ? spin_speed : 0,
+ spinz ? spin_speed : 0,
+ 1.0,
+ do_wander ? wander_speed : 0,
+ (spinx && spiny && spinz));
+ cc->trackball = gltrackball_init (True);
+ }
+
+ cc->ncolors = 256;
+ cc->texture_colors = (XColor *) calloc(cc->ncolors, sizeof(XColor));
+ cc->cube_colors = (XColor *) calloc(cc->ncolors, sizeof(XColor));
+
+ reset_colors (mi);
+
+ cc->ncubes = MI_COUNT (mi);
+ cc->cubes = (cube *) calloc (sizeof(cube), cc->ncubes);
+ for (i = 0; i < cc->ncubes; i++)
+ {
+ cube *cube = &cc->cubes[i];
+ cube->color = random() % cc->ncolors;
+ cube->w = 1.0;
+ cube->h = 1.0;
+ cube->d = 1.0;
+ cube->dx = frand(0.1);
+ cube->dy = frand(0.1);
+ cube->dz = frand(0.1);
+ cube->dw = frand(0.1);
+ cube->dh = frand(0.1);
+ cube->dd = frand(0.1);
+ }
+
+ if (wire)
+ do_texture = False;
+
+ if (do_texture)
+ {
+ init_texture (mi);
+ init_wave (mi);
+ shuffle_texture (mi);
+ }
+
+ cc->cube_list = glGenLists (1);
+ glNewList (cc->cube_list, GL_COMPILE);
+ cc->cube_polys = unit_cube (wire);
+ glEndList ();
+}
+
+
+static void
+shuffle_cubes (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ int i;
+ for (i = 0; i < cc->ncubes; i++)
+ {
+# define SINOID(SCALE,FRAME,SIZE) \
+ ((((1 + sin((FRAME * (SCALE)) / 2 * M_PI)) / 2.0) * (SIZE)) - (SIZE)/2)
+
+ cube *cube = &cc->cubes[i];
+ cube->x = SINOID(cube->dx, cube->frame, 0.5);
+ cube->y = SINOID(cube->dy, cube->frame, 0.5);
+ cube->z = SINOID(cube->dz, cube->frame, 0.5);
+ cube->w = SINOID(cube->dw, cube->frame, 0.9) + 1.0;
+ cube->h = SINOID(cube->dh, cube->frame, 0.9) + 1.0;
+ cube->d = SINOID(cube->dd, cube->frame, 0.9) + 1.0;
+ cube->frame++;
+# undef SINOID
+ }
+}
+
+
+ENTRYPOINT void
+draw_cube (ModeInfo *mi)
+{
+ cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i;
+
+ if (!cc->glx_context)
+ return;
+
+ mi->polygon_count = 0;
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(cc->glx_context));
+
+ glShadeModel(GL_FLAT);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ glScalef(1.1, 1.1, 1.1);
+
+ {
+ double x, y, z;
+ get_position (cc->rot, &x, &y, &z, !cc->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 6,
+ (z - 0.5) * 15);
+
+ gltrackball_rotate (cc->trackball);
+
+ get_rotation (cc->rot, &x, &y, &z, !cc->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ glScalef (2.5, 2.5, 2.5);
+
+ for (i = 0; i < cc->ncubes; i++)
+ {
+ cube *cube = &cc->cubes[i];
+ GLfloat color[4];
+ color[0] = cc->cube_colors[cube->color].red / 65536.0;
+ color[1] = cc->cube_colors[cube->color].green / 65536.0;
+ color[2] = cc->cube_colors[cube->color].blue / 65536.0;
+ color[3] = 1.0;
+ cube->color++;
+ if (cube->color >= cc->ncolors) cube->color = 0;
+
+ glPushMatrix ();
+ glTranslatef (cube->x, cube->y, cube->z);
+ glScalef (cube->w, cube->h, cube->d);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+ glCallList (cc->cube_list);
+ mi->polygon_count += cc->cube_polys;
+ glPopMatrix ();
+ }
+
+ shuffle_cubes (mi);
+ if (do_texture)
+ shuffle_texture (mi);
+
+ glPopMatrix();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("Cubenetic", cubenetic, cube)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/cubenetic.man b/hacks/glx/cubenetic.man
new file mode 100644
index 0000000..e11d479
--- /dev/null
+++ b/hacks/glx/cubenetic.man
@@ -0,0 +1,89 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+cubenetic - cubist 3D undulating blob.
+.SH SYNOPSIS
+.B cubenetic
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-count \fInumber\fP]
+[\-no-wander]
+[\-no-spin]
+[\-spin \fI[XYZ]\fP]
+[\-wireframe]
+[\-no-texture]
+[\-wave-speed \fInumber\fP]
+[\-wave-radius \fInumber\fP]
+[\-waves \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Draws a pulsating set of overlapping boxes with ever-chaning blobby
+patterns undulating across their surfaces.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-count \fInumber\fP
+How many boxes make up the object. Default: 5.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin \fI[XYZ]\fP
+Around which axes should the object spin?
+.TP 8
+.B \-no-spin
+Don't spin.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-texture | \-no-texture
+Display Solid Colors.
+.TP 8
+.B \-wave-speed \fInumber\fP
+Surface Pattern Speed. 5 - 150. Default: 80.
+.TP 8
+.B \-wave-radius \fInumber\fP
+Surface Pattern Overlap. 5 - 600. Default: 512.
+.TP 8
+.B \-waves \fInumber\fP
+Surface Pattern Complexity. 1 - 20. Default: 3.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/cubestack.c b/hacks/glx/cubestack.c
new file mode 100644
index 0000000..70883f6
--- /dev/null
+++ b/hacks/glx/cubestack.c
@@ -0,0 +1,462 @@
+/* cubestack, Copyright (c) 2016 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_cube 0
+# define release_cube 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+#define DEF_THICKNESS "0.13"
+#define DEF_OPACITY "0.7"
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+ GLfloat state;
+ GLfloat r;
+ int length;
+ int ncolors;
+ XColor *colors;
+ int ccolor;
+} cube_configuration;
+
+static cube_configuration *bps = NULL;
+
+static GLfloat speed;
+static GLfloat thickness;
+static GLfloat opacity;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-thickness", ".thickness", XrmoptionSepArg, 0 },
+ { "-opacity", ".opacity", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&thickness, "thickness", "Thickness", DEF_THICKNESS, t_Float},
+ {&opacity, "opacity", "Opacity", DEF_OPACITY, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt cube_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+static int
+draw_strut (ModeInfo *mi)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ int polys = 0;
+ GLfloat h;
+
+ glPushMatrix();
+ glFrontFace (GL_CCW);
+ glNormal3f (0, 0, -1);
+ glTranslatef (-0.5, -0.5, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
+ glVertex3f (0, 0, 0);
+ glVertex3f (1, 0, 0);
+ glVertex3f (1 - thickness, thickness, 0);
+ glVertex3f (thickness, thickness, 0);
+ glEnd();
+ polys += 2;
+
+ h = 0.5 - thickness;
+ if (h >= 0.25)
+ {
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
+ glVertex3f (0.5, 0.5, 0);
+ glVertex3f (0.5 - thickness/2, 0.5 - thickness/2, 0);
+ glVertex3f (0.5 - thickness/2, 0.5 - h/2, 0);
+ glVertex3f (0.5 + thickness/2, 0.5 - h/2, 0);
+ glVertex3f (0.5 + thickness/2, 0.5 - thickness/2, 0);
+ glEnd();
+ polys += 3;
+ }
+
+ glPopMatrix();
+
+ return polys;
+}
+
+
+static int
+draw_face (ModeInfo *mi)
+{
+ int i;
+ int polys = 0;
+ for (i = 0; i < 4; i++)
+ {
+ polys += draw_strut (mi);
+ glRotatef (90, 0, 0, 1);
+ }
+ return polys;
+}
+
+
+static GLfloat
+ease_fn (GLfloat r)
+{
+ return cos ((r/2 + 1) * M_PI) + 1; /* Smooth curve up, end at slope 1. */
+}
+
+
+static GLfloat
+ease_ratio (GLfloat r)
+{
+ GLfloat ease = 0.5;
+ if (r <= 0) return 0;
+ else if (r >= 1) return 1;
+ else if (r <= ease) return ease * ease_fn (r / ease);
+ else if (r > 1-ease) return 1 - ease * ease_fn ((1 - r) / ease);
+ else return r;
+}
+
+
+static int
+draw_cube_1 (ModeInfo *mi, GLfloat state, GLfloat color[4], Bool bottom_p)
+{
+ int polys = 0;
+ int istate = state;
+ GLfloat r = state - istate;
+ GLfloat a = color[3];
+
+ r = ease_ratio (r);
+
+# define COLORIZE(R) \
+ color[3] = a * R; \
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); \
+ glColor4fv (color)
+
+ if (bottom_p)
+ {
+ GLfloat r2 = (state < 0 ? 1 + state : 1);
+ COLORIZE(r2);
+ polys += draw_face (mi); /* Bottom */
+ }
+
+ if (state >= 0) /* Left */
+ {
+ GLfloat r2 = (istate == 0 ? r : 1);
+ COLORIZE(r2);
+ glPushMatrix();
+ glTranslatef (-0.5, 0.5, 0);
+ glRotatef (-r2 * 90, 0, 1, 0);
+ glTranslatef (0.5, -0.5, 0);
+ polys += draw_face (mi);
+ glPopMatrix();
+ }
+
+ if (state >= 1) /* Back */
+ {
+ GLfloat r2 = (istate == 1 ? r : 1);
+ COLORIZE(r2);
+ glPushMatrix();
+ glTranslatef (-0.5, 0.5, 0);
+ glRotatef ( 90, 0, 1, 0);
+ glRotatef (-90, 0, 0, 1);
+ glRotatef (-r2 * 90, 0, 1, 0);
+ glTranslatef (0.5, -0.5, 0);
+ polys += draw_face (mi);
+ glPopMatrix();
+ }
+
+ if (state >= 2) /* Right */
+ {
+ GLfloat r2 = (istate == 2 ? r : 1);
+ COLORIZE(r2);
+ glPushMatrix();
+ glTranslatef (0.5, 0.5, 0);
+ glRotatef ( 90, 0, 1, 0);
+ glRotatef (-90, 0, 0, 1);
+ glRotatef (-90, 0, 1, 0);
+ glRotatef (-r2 * 90, 0, 1, 0);
+ glTranslatef (-0.5, -0.5, 0);
+ polys += draw_face (mi);
+ glPopMatrix();
+ }
+
+ if (state >= 3) /* Front */
+ {
+ GLfloat r2 = (istate == 3 ? r : 1);
+ COLORIZE(r2);
+ glPushMatrix();
+ glTranslatef (0.5, 0.5, 0);
+ glRotatef ( 90, 0, 1, 0);
+ glRotatef (-90, 0, 0, 1);
+ glRotatef (-180, 0, 1, 0);
+ glTranslatef (-1, 0, 0);
+ glRotatef (-r2 * 90, 0, 1, 0);
+ glTranslatef (0.5, -0.5, 0);
+ polys += draw_face (mi);
+ glPopMatrix();
+ }
+
+ if (state >= 4) /* Top */
+ {
+ GLfloat r2 = (istate == 4 ? r : 1);
+ COLORIZE(r2);
+ glPushMatrix();
+ glTranslatef (0, 0, 1);
+ glRotatef (-90, 0, 0, 1);
+ glTranslatef (0.5, 0.5, 0);
+ glRotatef (-90, 0, 1, 0);
+ glRotatef (r2 * 90, 0, 1, 0);
+ glTranslatef (-0.5, -0.5, 0);
+ polys += draw_face (mi);
+ glPopMatrix();
+ }
+
+ return polys;
+}
+
+
+static int
+draw_cubes (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ int polys = 0;
+ GLfloat z = bp->state / 6;
+ int i;
+ GLfloat c[4];
+ int c0 = bp->ccolor;
+ GLfloat alpha = opacity;
+
+ glPushMatrix();
+ glTranslatef (0, 0, -1.5 - z);
+
+ glTranslatef (0, 0, -bp->length);
+ for (i = bp->length-1; i >= 0; i--)
+ {
+ int c1 = c0 - i - 1;
+ if (c1 < 0) c1 += bp->ncolors;
+ c[0] = bp->colors[c1].red / 65536.0;
+ c[1] = bp->colors[c1].green / 65536.0;
+ c[2] = bp->colors[c1].blue / 65536.0;
+ c[3] = alpha;
+
+ glTranslatef (0, 0, 1);
+ polys += draw_cube_1 (mi, 5, c, i == bp->length - 1);
+ }
+
+ c[0] = bp->colors[c0].red / 65536.0;
+ c[1] = bp->colors[c0].green / 65536.0;
+ c[2] = bp->colors[c0].blue / 65536.0;
+ c[3] = alpha;
+ glTranslatef (0, 0, 1);
+ polys += draw_cube_1 (mi, bp->state, c, bp->length == 0);
+
+ glPopMatrix();
+
+ return polys;
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_cube (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+cube_handle_event (ModeInfo *mi, XEvent *event)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == ' ' || c == '\t')
+ {
+ bp->ncolors = 32;
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+ return True;
+ }
+ }
+
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_cube (ModeInfo *mi)
+{
+ cube_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_cube (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire)
+ {
+ glDisable (GL_LIGHTING);
+ glEnable(GL_DEPTH_TEST);
+ glShadeModel (GL_SMOOTH);
+ glEnable (GL_NORMALIZE);
+ glDisable (GL_CULL_FACE);
+ glEnable (GL_BLEND);
+ glDisable (GL_DEPTH_TEST);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE);
+ }
+
+ {
+ double wander_speed = 0.005;
+ bp->rot = make_rotator (0, 0, 0, 0,
+ do_wander ? wander_speed : 0,
+ False);
+ bp->trackball = gltrackball_init (True);
+ }
+
+ if (thickness > 0.5)
+ thickness = 0.5;
+ if (thickness < 0.001)
+ thickness = 0.001;
+
+ bp->ncolors = 32;
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+ bp->state = -1;
+}
+
+
+ENTRYPOINT void
+draw_cube (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 4,
+ (y - 0.5) * 4,
+ (z - 0.5) * 2);
+
+ gltrackball_rotate (bp->trackball);
+ }
+
+ mi->polygon_count = 0;
+
+ glScalef (6, 6, 6);
+ glRotatef (-45, 1, 0, 0);
+ glRotatef (20, 0, 0, 1);
+ glRotatef (bp->r, 0, 0, 1);
+
+ mi->polygon_count = draw_cubes (mi);
+ glPopMatrix ();
+
+ if (!bp->button_down_p)
+ {
+ int max = 6;
+ bp->state += speed * 0.015;
+ bp->r += speed * 0.05;
+ while (bp->r > 360)
+ bp->r -= 360;
+ while (bp->state > max)
+ {
+ bp->state -= max;
+ bp->length++;
+ bp->ccolor++;
+ if (bp->ccolor > bp->ncolors)
+ bp->ccolor = 0;
+ }
+
+ if (bp->length > 20)
+ bp->length = 20;
+ }
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("CubeStack", cubestack, cube)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/cubestack.man b/hacks/glx/cubestack.man
new file mode 100644
index 0000000..511d116
--- /dev/null
+++ b/hacks/glx/cubestack.man
@@ -0,0 +1,72 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+cubestack - An endless stack of unfolding, translucent cubes.
+.SH SYNOPSIS
+.B cubestack
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-thickness \fInumber\fP]
+[\-opacity \fInumber\fP]
+[\-no-wander]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+An endless stack of unfolding, translucent cubes.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-thickness \fInumber\fP
+Thickness of the face edges. 0.0 - 0.5. Default: 0.13.
+.TP 8
+.B \-opacity \fInumber\fP
+Opacity of the cubes. 0.01 - 1.0. Default: 0.7.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2016 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/cubestorm.c b/hacks/glx/cubestorm.c
new file mode 100644
index 0000000..cf973c9
--- /dev/null
+++ b/hacks/glx/cubestorm.c
@@ -0,0 +1,469 @@
+/* cubestorm, Copyright (c) 2003-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: " DEF_COUNT "\n" \
+ "*showFPS: False \n" \
+ "*fpsSolid: True \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+
+# define free_cube 0
+# define release_cube 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+#define DEF_THICKNESS "0.06"
+#define DEF_COUNT "4"
+#define DEF_LENGTH "200"
+
+typedef struct {
+ GLfloat px, py, pz;
+ GLfloat rx, ry, rz;
+ int ccolor;
+} histcube;
+
+typedef struct {
+ rotator *rot;
+ int ccolor;
+} subcube;
+
+typedef struct {
+ GLXContext *glx_context;
+ trackball_state *trackball;
+ Bool button_down_p;
+ Bool clear_p;
+
+ GLuint cube_list;
+
+ int ncolors;
+ XColor *colors;
+
+ subcube *subcubes;
+
+ int hist_size, hist_count;
+ histcube *hist;
+
+} cube_configuration;
+
+static cube_configuration *bps = NULL;
+
+static Bool do_spin;
+static Bool do_wander;
+static GLfloat speed;
+static GLfloat thickness;
+static int max_length;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-db", ".doubleBuffer", XrmoptionNoArg, "True"},
+ { "+db", ".doubleBuffer", XrmoptionNoArg, "False"},
+ { "-thickness", ".thickness", XrmoptionSepArg, 0 },
+ { "-length", ".length", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&thickness, "thickness", "Thickness", DEF_THICKNESS, t_Float},
+ {&max_length, "length", "Length", DEF_LENGTH, t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt cube_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+static void
+draw_face (ModeInfo *mi)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+
+ int i;
+ GLfloat t = thickness / 2;
+ GLfloat a = -0.5;
+ GLfloat b = 0.5;
+
+ if (t <= 0) t = 0.001;
+ else if (t > 0.5) t = 0.5;
+
+ glPushMatrix();
+ glFrontFace(GL_CW);
+
+ for (i = 0; i < 4; i++)
+ {
+ glNormal3f (0, 0, -1);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (a, a, a);
+ glVertex3f (b, a, a);
+ glVertex3f (b-t, a+t, a);
+ glVertex3f (a+t, a+t, a);
+ glEnd();
+
+ glNormal3f (0, 1, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (b-t, a+t, a);
+ glVertex3f (b-t, a+t, a+t);
+ glVertex3f (a+t, a+t, a+t);
+ glVertex3f (a+t, a+t, a);
+ glEnd();
+
+ glRotatef(90, 0, 0, 1);
+ }
+ glPopMatrix();
+}
+
+static void
+draw_faces (ModeInfo *mi)
+{
+ glPushMatrix();
+ draw_face (mi);
+ glRotatef (90, 0, 1, 0); draw_face (mi);
+ glRotatef (90, 0, 1, 0); draw_face (mi);
+ glRotatef (90, 0, 1, 0); draw_face (mi);
+ glRotatef (90, 1, 0, 0); draw_face (mi);
+ glRotatef (180, 1, 0, 0); draw_face (mi);
+ glPopMatrix();
+}
+
+
+static void
+new_cube_colors (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ int i;
+ bp->ncolors = 128;
+ if (bp->colors) free (bp->colors);
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+ for (i = 0; i < MI_COUNT(mi); i++)
+ bp->subcubes[i].ccolor = random() % bp->ncolors;
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_cube (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 45.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+cube_handle_event (ModeInfo *mi, XEvent *event)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == ' ')
+ {
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ return True;
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ goto DEF;
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ DEF:
+ new_cube_colors (mi);
+ return True;
+ }
+ return False;
+}
+
+
+ENTRYPOINT void
+init_cube (ModeInfo *mi)
+{
+ cube_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ if (MI_COUNT(mi) <= 0) MI_COUNT(mi) = 1;
+
+ bp->trackball = gltrackball_init (True);
+ bp->subcubes = (subcube *) calloc (MI_COUNT(mi), sizeof(subcube));
+
+ bp->hist_count = 0;
+ bp->hist_size = 100;
+ bp->hist = (histcube *) malloc (bp->hist_size * sizeof(*bp->hist));
+
+ for (i = 0; i < MI_COUNT(mi); i++)
+ {
+ double wander_speed, spin_speed, spin_accel;
+
+ if (i == 0)
+ {
+ wander_speed = 0.05 * speed;
+ spin_speed = 10.0 * speed;
+ spin_accel = 4.0 * speed;
+ }
+ else
+ {
+ wander_speed = 0;
+ spin_speed = 4.0 * speed;
+ spin_accel = 2.0 * speed;
+ }
+
+ bp->subcubes[i].rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ True);
+ }
+
+ bp->colors = 0;
+ new_cube_colors (mi);
+
+ reshape_cube (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ bp->cube_list = glGenLists (1);
+ glNewList (bp->cube_list, GL_COMPILE);
+ draw_faces (mi);
+ glEndList ();
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+/* Originally, this program achieved the "accumulating cubes" effect by
+ simply not clearing the depth or color buffers between frames. That
+ doesn't work on modern systems, particularly mobile: you can no longer
+ rely on your buffers being unmolested once you have yielded. So now we
+ must save and re-render every polygon. Noof has the same problem and
+ solves it by taking a screenshot of the frame buffer into a texture, but
+ cubestorm needs to restore the depth buffer as well as the color buffer.
+ */
+static void
+push_hist (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ double px, py, pz;
+ double rx = 0, ry = 0, rz = 0;
+ int i;
+
+ if (bp->hist_count > max_length &&
+ bp->hist_count > MI_COUNT(mi) &&
+ !bp->button_down_p)
+ {
+ /* Drop history off of the end. */
+ memmove (bp->hist,
+ bp->hist + MI_COUNT(mi),
+ (bp->hist_count - MI_COUNT(mi)) * sizeof(*bp->hist));
+ bp->hist_count -= MI_COUNT(mi);
+ }
+
+ if (bp->hist_count + MI_COUNT(mi) >= bp->hist_size)
+ {
+ bp->hist_size = bp->hist_count + MI_COUNT(mi) + 100;
+ bp->hist = (histcube *)
+ realloc (bp->hist, bp->hist_size * sizeof(*bp->hist));
+ }
+
+ get_position (bp->subcubes[0].rot, &px, &py, &pz, !bp->button_down_p);
+
+ for (i = 0; i < MI_COUNT(mi); i++)
+ {
+ subcube *sc = &bp->subcubes[i];
+ histcube *hc = &bp->hist[bp->hist_count];
+ double rx2, ry2, rz2;
+
+ get_rotation (sc->rot, &rx2, &ry2, &rz2, !bp->button_down_p);
+
+ if (i == 0) /* N+1 cubes rotate relative to cube 0 */
+ rx = rx2, ry = ry2, rz = rz2;
+ else
+ rx2 += rx, ry2 += ry, rz2 += rz;
+
+ hc->px = px;
+ hc->py = py;
+ hc->pz = pz;
+ hc->rx = rx2;
+ hc->ry = ry2;
+ hc->rz = rz2;
+ hc->ccolor = sc->ccolor;
+ sc->ccolor++;
+ if (sc->ccolor >= bp->ncolors)
+ sc->ccolor = 0;
+ bp->hist_count++;
+ }
+}
+
+
+ENTRYPOINT void
+draw_cube (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ if (bp->clear_p) /* we're in "no vapor trails" mode */
+ {
+ bp->hist_count = 0;
+ if (! (random() % (int) (25 / speed)))
+ bp->clear_p = False;
+ }
+ else
+ {
+ if (! (random() % (int) (200 / speed)))
+ {
+ bp->clear_p = True;
+ new_cube_colors (mi);
+ }
+ }
+
+ push_hist (mi);
+ mi->polygon_count = 0;
+ for (i = 0; i < bp->hist_count; i++)
+ {
+ GLfloat bcolor[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat bshiny = 128.0;
+
+ histcube *hc = &bp->hist[i];
+
+ glPushMatrix();
+ glScalef (1.1, 1.1, 1.1);
+
+ glTranslatef((hc->px - 0.5) * 15,
+ (hc->py - 0.5) * 15,
+ (hc->pz - 0.5) * 30);
+ gltrackball_rotate (bp->trackball);
+
+ glScalef (4.0, 4.0, 4.0);
+
+ glRotatef (hc->rx * 360, 1.0, 0.0, 0.0);
+ glRotatef (hc->ry * 360, 0.0, 1.0, 0.0);
+ glRotatef (hc->rz * 360, 0.0, 0.0, 1.0);
+
+ bcolor[0] = bp->colors[hc->ccolor].red / 65536.0;
+ bcolor[1] = bp->colors[hc->ccolor].green / 65536.0;
+ bcolor[2] = bp->colors[hc->ccolor].blue / 65536.0;
+
+ if (wire)
+ glColor3f (bcolor[0], bcolor[1], bcolor[2]);
+ else
+ {
+ glMaterialfv (GL_FRONT, GL_SPECULAR, bspec);
+ glMateriali (GL_FRONT, GL_SHININESS, bshiny);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bcolor);
+ }
+
+ glCallList (bp->cube_list);
+ mi->polygon_count += (4 * 2 * 6);
+
+ glPopMatrix();
+ }
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("CubeStorm", cubestorm, cube)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/cubestorm.man b/hacks/glx/cubestorm.man
new file mode 100644
index 0000000..9d912fd
--- /dev/null
+++ b/hacks/glx/cubestorm.man
@@ -0,0 +1,77 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+cubestorm - a series of 3D boxes that fill space
+.SH SYNOPSIS
+.B cubestorm
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fIfloat\fP]
+[\-count \fIint\fP]
+[\-thickness \fIfloat\fP]
+[\-no-wander]
+[\-no-spin]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Draws a series of rotating 3D boxes that intersect each other and
+eventually fill space.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Larger numbers mean run faster. Default: 1.0.
+.TP 8
+.B \-count \fInumber\fP
+Number of cubes. Default 4.
+.TP 8
+.B \-thickness \fIfloat\fP
+How thick the struts making up the cubes should be (0.0-1.0). Default 0.06.
+.TP 8
+.B \-wander | \-no-wander
+Whether the cubes should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the cubes should spin.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/cubetwist.c b/hacks/glx/cubetwist.c
new file mode 100644
index 0000000..61af287
--- /dev/null
+++ b/hacks/glx/cubetwist.c
@@ -0,0 +1,595 @@
+/* cubetwist, Copyright (c) 2016-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define release_cube 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "normals.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+#define DEF_FLAT "True"
+#define DEF_THICKNESS "0.0"
+#define DEF_DISPLACEMENT "0.0"
+
+typedef struct cube cube;
+struct cube {
+ GLfloat size, thickness;
+ XYZ pos, rot;
+ GLfloat color[4];
+ cube *next;
+};
+
+typedef struct oscillator oscillator;
+struct oscillator {
+ double ratio, from, to, speed, *var;
+ int remaining;
+ oscillator *next;
+};
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+ cube *cubes;
+ oscillator *oscillators;
+} cube_configuration;
+
+static cube_configuration *bps = NULL;
+
+static Bool do_flat;
+static Bool do_spin;
+static GLfloat speed;
+static GLfloat thickness;
+static GLfloat displacement;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-flat", ".flat", XrmoptionNoArg, "True" },
+ { "+flat", ".flat", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-thickness", ".thickness", XrmoptionSepArg, 0 },
+ { "-displacement", ".displacement", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_flat, "flat", "flat", DEF_FLAT, t_Bool},
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&thickness, "thickness", "Thickness", DEF_THICKNESS, t_Float},
+ {&displacement, "displacement", "Displacement", DEF_DISPLACEMENT, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt cube_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+static int
+draw_strut (ModeInfo *mi, cube *c)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ int polys = 0;
+
+ glPushMatrix();
+ glFrontFace (GL_CW);
+ glNormal3f (0, 0, -1);
+ glTranslatef (-c->size/2, -c->size/2, -c->size/2);
+
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
+ glVertex3f (0, 0, 0);
+ glVertex3f (c->size, 0, 0);
+ glVertex3f (c->size - c->thickness, c->thickness, 0);
+ glVertex3f (c->thickness, c->thickness, 0);
+ glEnd();
+ polys += 2;
+
+ glNormal3f (0, 1, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
+ glVertex3f (c->thickness, c->thickness, 0);
+ glVertex3f (c->size - c->thickness, c->thickness, 0);
+ glVertex3f (c->size - c->thickness, c->thickness, c->thickness);
+ glVertex3f (c->thickness, c->thickness, c->thickness);
+ glEnd();
+ polys += 2;
+ glPopMatrix();
+
+ return polys;
+}
+
+
+static int
+draw_cubes (ModeInfo *mi, cube *c)
+{
+ int polys = 0;
+ int i, j;
+
+ glColor4fv (c->color);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, c->color);
+
+ glPushMatrix();
+ for (j = 0; j < 6; j++)
+ {
+ for (i = 0; i < 4; i++)
+ {
+ polys += draw_strut (mi, c);
+ glRotatef (90, 0, 0, 1);
+ }
+ if (j == 3)
+ glRotatef (90, 0, 0, 1);
+ if (j < 4)
+ glRotatef (90, 0, 1, 0);
+ else
+ glRotatef (180, 1, 0, 0);
+ }
+ glPopMatrix();
+
+ if (c->next)
+ {
+ /* This leaves rotations on the prevailing matrix stack, but since
+ this is a tail-call, that's fine. Don't blow the matrix stack. */
+ glRotatef (c->rot.x, 1, 0, 0);
+ glRotatef (c->rot.y, 0, 1, 0);
+ glRotatef (c->rot.z, 0, 0, 1);
+ glTranslatef (c->pos.x, c->pos.y, c->pos.z);
+ c->next->pos = c->pos;
+ c->next->rot = c->rot;
+ polys += draw_cubes (mi, c->next);
+ }
+
+ check_gl_error("cubetwist");
+ return polys;
+}
+
+
+static void
+make_cubes (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat step = 2 * (thickness + displacement);
+ GLfloat size = 1.0;
+ cube *tail = 0;
+ GLfloat cc[4], cstep;
+ int depth = 0;
+ cube *c;
+
+ cc[0] = 0.3 + frand(0.7);
+ cc[1] = 0.3 + frand(0.7);
+ cc[2] = 0.3 + frand(0.7);
+ cc[3] = 1;
+
+ if (bp->cubes) abort();
+ while (1)
+ {
+ cube *c = (cube *) calloc (1, sizeof (*c));
+ c->size = size;
+ c->thickness = thickness;
+ if (tail)
+ tail->next = c;
+ else
+ bp->cubes = c;
+ tail = c;
+
+ depth++;
+ size -= step;
+ if (size <= step)
+ break;
+ }
+
+ cstep = 0.8 / depth;
+ for (c = bp->cubes; c; c = c->next)
+ {
+ memcpy (c->color, cc, sizeof(cc));
+ cc[0] -= cstep;
+ cc[1] -= cstep;
+ cc[2] -= cstep;
+ }
+}
+
+
+static GLfloat
+ease_fn (GLfloat r)
+{
+ return cos ((r/2 + 1) * M_PI) + 1; /* Smooth curve up, end at slope 1. */
+}
+
+
+static GLfloat
+ease_ratio (GLfloat r)
+{
+ GLfloat ease = 0.5;
+ if (r <= 0) return 0;
+ else if (r >= 1) return 1;
+ else if (r <= ease) return ease * ease_fn (r / ease);
+ else if (r > 1-ease) return 1 - ease * ease_fn ((1 - r) / ease);
+ else return r;
+}
+
+
+static void
+tick_oscillators (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ oscillator *prev = 0;
+ oscillator *a = bp->oscillators;
+ GLfloat tick = 0.1 / speed;
+
+ while (a)
+ {
+ oscillator *next = a->next;
+ a->ratio += tick * a->speed;
+ if (a->ratio > 1)
+ a->ratio = 1;
+
+ *a->var = a->from + (a->to - a->from) * ease_ratio (a->ratio);
+
+ if (a->ratio < 1) /* mid cycle */
+ prev = a;
+ else if (--a->remaining <= 0) /* ended, and expired */
+ {
+ if (prev)
+ prev->next = next;
+ else
+ bp->oscillators = next;
+ free (a);
+ }
+ else /* keep going the other way */
+ {
+ GLfloat swap = a->from;
+ a->from = a->to;
+ a->to = swap;
+ a->ratio = 0;
+ prev = a;
+ }
+
+ a = next;
+ }
+}
+
+
+static void
+add_oscillator (ModeInfo *mi, double *var, GLfloat speed, GLfloat to,
+ int repeat)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ oscillator *a;
+
+ /* If an oscillator is already running on this variable, don't
+ add another. */
+ for (a = bp->oscillators; a && a->next; a = a->next)
+ if (a->var == var)
+ return;
+
+ a = (oscillator *) calloc (1, sizeof (*a));
+ if (repeat <= 0) abort();
+ a->ratio = 0;
+ a->from = *var;
+ a->to = to;
+ a->speed = speed;
+ a->var = var;
+ a->remaining = repeat;
+ a->next = bp->oscillators;
+ bp->oscillators = a;
+# if 0
+ fprintf (stderr, "%s: %3d %6.2f -> %6.2f %s\n",
+ progname, repeat, *var, to,
+ (var == &bp->midpoint.z ? "z" :
+ var == &bp->tilt ? "tilt" :
+ var == &bp->axial_radius ? "r" :
+ var == &bp->speed ? "speed" : "?"));
+# endif
+}
+
+
+#undef RANDSIGN
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+static void
+add_random_oscillator (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ cube *c = bp->cubes;
+ double s1 = speed * 0.07;
+ double s2 = speed * 0.3;
+ double disp = (thickness + displacement);
+ int c1 = 1 + ((random() % 4) ? 0 : (random() % 3));
+ int c2 = 2;
+ int n = random() % 6;
+
+ switch (n) {
+ case 0: add_oscillator (mi, &c->rot.x, s1, 90 * RANDSIGN(), c1); break;
+ case 1: add_oscillator (mi, &c->rot.y, s1, 90 * RANDSIGN(), c1); break;
+ case 2: add_oscillator (mi, &c->rot.z, s1, 90 * RANDSIGN(), c1); break;
+ case 3: add_oscillator (mi, &c->pos.x, s2, disp * RANDSIGN(), c2); break;
+ case 4: add_oscillator (mi, &c->pos.y, s2, disp * RANDSIGN(), c2); break;
+ case 5: add_oscillator (mi, &c->pos.z, s2, disp * RANDSIGN(), c2); break;
+ default: abort(); break;
+ }
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_cube (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+cube_handle_event (ModeInfo *mi, XEvent *event)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == ' ' || c == '\t')
+ {
+ while (bp->cubes)
+ {
+ cube *c = bp->cubes->next;
+ free (bp->cubes);
+ bp->cubes = c;
+ }
+
+ while (bp->oscillators)
+ {
+ oscillator *o = bp->oscillators->next;
+ free (bp->oscillators);
+ bp->oscillators = o;
+ }
+
+ if (random() & 1)
+ {
+ thickness = 0.03 + frand(0.02);
+ displacement = (random() & 1) ? 0 : (thickness / 3);
+ }
+ else
+ {
+ thickness = 0.001 + frand(0.02);
+ displacement = 0;
+ }
+
+ make_cubes (mi);
+
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_cube (ModeInfo *mi)
+{
+ cube_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_cube (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire && !do_flat)
+ {
+ GLfloat color[4] = {1, 1, 1, 1};
+ GLfloat cspec[4] = {1, 1, 0, 1};
+ static const GLfloat shiny = 30;
+
+ static GLfloat pos0[4] = { 0.5, -1, -0.5, 0};
+ static GLfloat pos1[4] = {-0.75, -1, 0, 0};
+ static GLfloat amb[4] = {0, 0, 0, 1};
+ static GLfloat dif[4] = {1, 1, 1, 1};
+ static GLfloat spc[4] = {1, 1, 1, 1};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos0);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ glLightfv(GL_LIGHT1, GL_POSITION, pos1);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT1, GL_SPECULAR, spc);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT, GL_SPECULAR, cspec);
+ glMateriali (GL_FRONT, GL_SHININESS, shiny);
+ }
+
+ {
+ double spin_speed = 0.05;
+ double wander_speed = 0.005;
+ double spin_accel = 1.0;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ True);
+ bp->trackball = gltrackball_init (True);
+ }
+
+ if (thickness > 0.5)
+ thickness = 0.5;
+ if (displacement > 0.5)
+ displacement = 0.5;
+
+ if (thickness <= 0.0001)
+ {
+ if (random() & 1)
+ {
+ thickness = 0.03 + frand(0.02);
+ displacement = (random() & 1) ? 0 : (thickness / 3);
+ }
+ else
+ {
+ thickness = 0.001 + frand(0.02);
+ displacement = 0;
+ }
+ }
+
+ make_cubes (mi);
+}
+
+
+ENTRYPOINT void
+draw_cube (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ glScalef(1.1, 1.1, 1.1);
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 4,
+ (y - 0.5) * 4,
+ (z - 0.5) * 2);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ mi->polygon_count = 0;
+
+ glScalef (6, 6, 6);
+
+ mi->polygon_count = draw_cubes (mi, bp->cubes);
+ glPopMatrix ();
+
+ if (!bp->button_down_p)
+ tick_oscillators (mi);
+
+ if (! bp->oscillators &&
+ !bp->button_down_p &&
+ !(random() % 60))
+ {
+ bp->cubes->pos.x = bp->cubes->pos.y = bp->cubes->pos.z = 0;
+ bp->cubes->rot.x = bp->cubes->rot.y = bp->cubes->rot.z = 0;
+ add_random_oscillator (mi);
+ }
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+ENTRYPOINT void
+free_cube (ModeInfo *mi)
+{
+ cube_configuration *bp = &bps[MI_SCREEN(mi)];
+ while (bp->cubes)
+ {
+ cube *c = bp->cubes->next;
+ free (bp->cubes);
+ bp->cubes = c;
+ }
+
+ while (bp->oscillators)
+ {
+ oscillator *o = bp->oscillators->next;
+ free (bp->oscillators);
+ bp->oscillators = o;
+ }
+}
+
+
+XSCREENSAVER_MODULE_2 ("CubeTwist", cubetwist, cube)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/cubetwist.man b/hacks/glx/cubetwist.man
new file mode 100644
index 0000000..3a6574b
--- /dev/null
+++ b/hacks/glx/cubetwist.man
@@ -0,0 +1,80 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+cubetwist - A series of nested cubes rotate and slide recursively.
+.SH SYNOPSIS
+.B cubetwist
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-thickness \fInumber\fP]
+[\-displacement \fInumber\fP]
+[\-no-flat]
+[\-no-wander]
+[\-no-spin]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+A series of nested cubes rotate and slide recursively.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-thickness \fInumber\fP
+Thickness of the cube edges. 0.005 - 0.2. Default: 0.05.
+.TP 8
+.B \-displacement \fInumber\fP
+Displacement between nested cubes. 0.0 - 0.2. Default: 0.01.
+.TP 8
+.B \-flat | \-no-flat
+Whether to use flat shading, or lighting. Default flat.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the object should spin.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2016 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/cubicgrid.c b/hacks/glx/cubicgrid.c
new file mode 100644
index 0000000..34b6c34
--- /dev/null
+++ b/hacks/glx/cubicgrid.c
@@ -0,0 +1,269 @@
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Cubic Grid - a 3D lattice. The observer is located in the centre of
+ * a spinning finite lattice. As it rotates, various view-throughs appear and
+ * evolve. A simple idea with interesting results.
+ *
+ * Vasek Potocek (Dec-28-2007)
+ * vasek.potocek@post.cz
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_cubicgrid 0
+# define release_cubicgrid 0
+#include "xlockmore.h"
+
+#ifdef USE_GL
+
+#define DEF_SPEED "1.0"
+#define DEF_DIV "30"
+#define DEF_ZOOM "20"
+#define DEF_BIGDOTS "True"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "rotator.h"
+#include "gltrackball.h"
+
+/*************************************************************************/
+
+static int ticks;
+static float size;
+static float speed;
+static Bool bigdots;
+
+static argtype vars[] = {
+ { &speed, "speed", "Speed", DEF_SPEED, t_Float },
+ { &size, "zoom", "Zoom", DEF_ZOOM, t_Float },
+ { &ticks, "ticks", "Ticks", DEF_DIV, t_Int },
+ { &bigdots, "bigdots", "BigDots", DEF_BIGDOTS, t_Bool },
+};
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-zoom", ".zoom", XrmoptionSepArg, 0 },
+ { "-ticks", ".ticks", XrmoptionSepArg, 0 },
+ { "-bigdots", ".bigdots", XrmoptionNoArg, "True" },
+ { "+bigdots", ".bigdots", XrmoptionNoArg, "False" },
+};
+
+ENTRYPOINT ModeSpecOpt cubicgrid_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct cubicgrid_description =
+{ "cubicgrid", "init_cubicgrid", "draw_cubicgrid", NULL,
+ "draw_cubicgrid", "change_cubicgrid", NULL, &cubicgrid_opts,
+ 25000, 1, 1, 1, 1.0, 4, "",
+ "Shows a rotating 3D lattice from inside", 0, NULL
+};
+#endif
+
+typedef struct {
+ GLXContext *glx_context;
+ GLfloat ratio;
+ GLint list;
+
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+ int npoints;
+} cubicgrid_conf;
+
+static cubicgrid_conf *cubicgrid = NULL;
+
+static const GLfloat zpos = -18.0;
+
+/*************************************************************************/
+
+ENTRYPOINT Bool
+cubicgrid_handle_event (ModeInfo *mi, XEvent *event)
+{
+ cubicgrid_conf *cp = &cubicgrid[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, cp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &cp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+static Bool draw_main(ModeInfo *mi)
+{
+ cubicgrid_conf *cp = &cubicgrid[MI_SCREEN(mi)];
+ double x, y, z;
+
+ glClear(GL_COLOR_BUFFER_BIT);
+ glLoadIdentity();
+
+ glRotatef (180, 1, 0, 0); /* Make trackball track the right way */
+ glRotatef (180, 0, 1, 0);
+
+ glTranslatef(0, 0, zpos);
+
+ glScalef(size/ticks, size/ticks, size/ticks);
+
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1);
+ }
+# endif
+
+ gltrackball_rotate (cp->trackball);
+
+ get_rotation (cp->rot, &x, &y, &z, !cp->button_down_p);
+ glRotatef (-x * 360, 1.0, 0.0, 0.0);
+ glRotatef (-y * 360, 0.0, 1.0, 0.0);
+ glRotatef (-z * 360, 0.0, 0.0, 1.0);
+
+ glTranslatef(-ticks/2.0, -ticks/2.0, -ticks/2.0);
+ glCallList(cp->list);
+ return True;
+}
+
+static void init_gl(ModeInfo *mi)
+{
+ cubicgrid_conf *cp = &cubicgrid[MI_SCREEN(mi)];
+ int x, y, z;
+ float tf = ticks;
+
+ glDrawBuffer(GL_BACK);
+ if(bigdots) {
+ glPointSize(2.0);
+ }
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glShadeModel(GL_FLAT);
+
+ cp->list = glGenLists(1);
+ glNewList(cp->list, GL_COMPILE);
+ if(MI_IS_MONO(mi)) {
+ glColor3f(1.0, 1.0, 1.0);
+ glBegin(GL_POINTS);
+ for(x = 0; x < ticks; x++) {
+ for(y = 0; y < ticks; y++) {
+ for(z = 0; z < ticks; z++) {
+ glVertex3f(x, y, z);
+ cp->npoints++;
+ }
+ }
+ }
+ glEnd();
+ }
+ else
+ {
+ glBegin(GL_POINTS);
+ for(x = 0; x < ticks; x++) {
+ for(y = 0; y < ticks; y++) {
+ for(z = 0; z < ticks; z++) {
+ glColor3f(x/tf, y/tf, z/tf);
+ glVertex3f(x, y, z);
+ cp->npoints++;
+ }
+ }
+ }
+ glEnd();
+ }
+ glEndList();
+}
+
+/*************************************************************************/
+
+ENTRYPOINT void reshape_cubicgrid(ModeInfo *mi, int width, int height)
+{
+ cubicgrid_conf *cp = &cubicgrid[MI_SCREEN(mi)];
+ int y = 0;
+ if(!height) height = 1;
+ cp->ratio = (GLfloat)width/(GLfloat)height;
+
+ if (width > height * 3) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ cp->ratio = (GLfloat)width/(GLfloat)height;
+ }
+
+ glViewport(0, y, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(30.0, cp->ratio, 1.0, 100.0);
+ glMatrixMode(GL_MODELVIEW);
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+ENTRYPOINT void init_cubicgrid(ModeInfo *mi)
+{
+ cubicgrid_conf *cp;
+ MI_INIT(mi, cubicgrid);
+ cp = &cubicgrid[MI_SCREEN(mi)];
+
+ if ((cp->glx_context = init_GL(mi)) != NULL) {
+ init_gl(mi);
+ reshape_cubicgrid(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+
+ {
+ double spin_speed = 0.045 * speed;
+ double spin_accel = 0.005 * speed;
+
+ cp->rot = make_rotator (spin_speed, spin_speed, spin_speed,
+ spin_accel, 0, True);
+ cp->trackball = gltrackball_init (True);
+ }
+}
+
+ENTRYPOINT void draw_cubicgrid(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ cubicgrid_conf *cp;
+ if (!cubicgrid) return;
+ cp = &cubicgrid[MI_SCREEN(mi)];
+ MI_IS_DRAWN(mi) = True;
+ if (!cp->glx_context) return;
+ glXMakeCurrent(display, window, *(cp->glx_context));
+ if (!draw_main(mi)) {
+ MI_ABORT(mi);
+ return;
+ }
+ mi->polygon_count = cp->npoints;
+ if (MI_IS_FPS(mi)) do_fps (mi);
+ glFlush();
+ glXSwapBuffers(display, window);
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void change_cubicgrid(ModeInfo * mi)
+{
+ cubicgrid_conf *cp = &cubicgrid[MI_SCREEN(mi)];
+ if (!cp->glx_context) return;
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(cp->glx_context));
+ init_gl(mi);
+}
+#endif /* !STANDALONE */
+
+
+XSCREENSAVER_MODULE ("CubicGrid", cubicgrid)
+
+#endif
diff --git a/hacks/glx/cubicgrid.man b/hacks/glx/cubicgrid.man
new file mode 100644
index 0000000..d267bc3
--- /dev/null
+++ b/hacks/glx/cubicgrid.man
@@ -0,0 +1,83 @@
+.TH XScreenSaver 1 "Dec-28-07" "X Version 11"
+.SH NAME
+cubicgrid - rotating 3D lattice seen from inside
+.SH SYNOPSIS
+.B cubicgrid
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-install]
+[\-delay \fImicroseconds\fP]
+[\-mono]
+[\-speed \fInumber\fP]
+[\-zoom \fInumber\fP]
+[\-ticks \fInumber\fP]
+[\-bigdots]
+[\-fps]
+.SH DESCRIPTION
+This program shows the view of an observer located inside a set of points
+arranged to a 3D lattice. As the lattice rotates, various view-throughs appear
+and evolve. A simple idea with interesting results.
+.SH OPTIONS
+.I cubicgrid
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How long to pause between frames. Default is 20000, or 0.02 second.
+.TP 8
+.B \-mono
+Draw in black and white. If not used, a fixed all-color scheme is chosen.
+.TP 8
+.B \-speed \fInumber\fP
+The maximum speed of the rotation. The actual speed and axis change smoothly
+for better effect. 0.5 - 10. The default is 1.0.
+.TP 8
+.B \-zoom \fInumber\fP
+Size of the lattice. Ideally it should fill all the screen, but one may find
+other values also interesting. 5 - 50. The default of 20 should do for common
+screen aspect ratios.
+.TP 8
+.B \-ticks \fInumber\fP
+The count of points drawn along every axis. 10 - 100. The default is 30.
+.TP 8
+.B \-bigdots
+Draw the points twice as big.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2007 by Vasek Potocek. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear in
+all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Vasek Potocek <vasek.potocek@post.cz>, Dec-28-07.
diff --git a/hacks/glx/curlicue.h b/hacks/glx/curlicue.h
new file mode 100644
index 0000000..0963d6e
--- /dev/null
+++ b/hacks/glx/curlicue.h
@@ -0,0 +1,261 @@
+/* curlicue.h --- A texture map containing a "curlicue" */
+
+#define TEX_DIMENSION 64
+static const unsigned char texture[TEX_DIMENSION*TEX_DIMENSION] = {
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 58, 43, 43, 43, 43, 45, 70, 70, 70,
+ 70, 70, 70, 70, 74, 98, 98, 98,100,194,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 30,186,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1,111,244,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 43,198,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 5,123,248,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 50,209,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
+ 74,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,138, 4,
+ 66,229,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1,170,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,153, 0, 0,
+ 0, 53,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 18, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 6,188,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,213, 7, 0, 0,
+ 0, 0,226,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 45, 0, 0, 0, 0, 0, 47, 0, 0,
+ 0, 0, 22,225,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,254, 54, 0, 0, 0,
+ 0, 81,254,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 45, 0, 0, 0, 0, 56,247, 82, 0,
+ 0, 0, 0, 59,253,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,152, 0, 0, 0, 0,
+ 52,243,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 45, 0, 0, 0, 8,215,255,250, 56,
+ 0, 0, 0, 0,142,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,241, 19, 0, 0, 0, 15,
+ 220,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 45, 0, 0, 0,129,255,255,255,230,
+ 23, 0, 0, 0, 12,230,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,131, 0, 0, 0, 0,157,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 45, 0, 0, 49,250,255,255,255,255,
+ 171, 0, 0, 0, 0,112,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,246, 19, 0, 0, 0, 54,253,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 45, 0, 5,208,255,255,255,255,255,
+ 255, 77, 0, 0, 0, 9,231,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,163, 0, 0, 0, 0,186,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 45, 0,121,255,255,255,255,255,255,
+ 255,211, 2, 0, 0, 0,134,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255, 69, 0, 0, 0, 50,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 45, 41,247,255,255,255,255,255,255,
+ 255,255, 73, 0, 0, 0, 38,254,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,237, 4, 0, 0, 0,145,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255, 52,201,255,255,255,255,255,255,255,
+ 255,255,169, 0, 0, 0, 0,216,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,181, 0, 0, 0, 0,229,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,186,255,255,255,255,255,255,255,255,
+ 255,255,247, 7, 0, 0, 0,150,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,130, 0, 0, 0, 42,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255, 67, 0, 0, 0, 91,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255, 79, 0, 0, 0, 95,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,120, 0, 0, 0, 56,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255, 55, 0, 0, 0,130,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,157, 0, 0, 0, 21,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255, 34, 0, 0, 0,161,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,179, 0, 0, 0, 2,250,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255, 27, 0, 0, 0,168,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,200, 0, 0, 0, 0,249,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255, 27, 0, 0, 0,168,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,200, 0, 0, 0, 0,249,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255, 27, 0, 0, 0,163,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,183, 0, 0, 0, 0,249,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255, 42, 0, 0, 0,135,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,161, 0, 0, 0, 17,254,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255, 76, 0, 0, 0,100,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,126, 0, 0, 0, 48,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,114, 0, 0, 0, 53,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255, 78, 0, 0, 0, 84,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,165, 0, 0, 0, 3,241,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,252, 16, 0, 0, 0,139,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,228, 0, 0, 0, 0,161,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,192, 0, 0, 0, 0,198,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255, 46, 0, 0, 0, 67,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255, 93, 0, 0, 0, 21,250,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,139, 0, 0, 0, 1,211,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,226, 7, 0, 0, 0,108,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,230, 6, 0, 0, 0, 79,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,106, 0, 0, 0, 1,206,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255, 97, 0, 0, 0, 0,183,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 202, 3, 0, 0, 0, 67,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,221, 8, 0, 0, 0, 27,
+ 235,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,243,
+ 40, 0, 0, 0, 0,198,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,126, 0, 0, 0, 0,
+ 71,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,253, 85,
+ 0, 0, 0, 0, 96,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,247, 44, 0, 0, 0,
+ 0, 91,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,116, 0,
+ 0, 0, 0, 25,233,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,216, 11, 0, 0,
+ 0, 0, 90,251,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,252,112, 0, 0,
+ 0, 0, 4,191,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,174, 4, 0,
+ 0, 0, 0, 72,235,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,242, 84, 0, 0, 0,
+ 0, 0,146,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,150, 1,
+ 0, 0, 0, 0, 27,181,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,194, 39, 0, 0, 0, 0,
+ 0,120,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,151,
+ 4, 0, 0, 0, 0, 0, 77,209,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,216, 92, 1, 0, 0, 0, 0, 0,
+ 125,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 175, 12, 0, 0, 0, 0, 0, 1, 70,164,241,255,255,255,255,255,
+ 255,255,255,255,255,242,171, 77, 2, 0, 0, 0, 0, 0, 4,150,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,214, 41, 0, 0, 0, 0, 0, 0, 0, 4, 48, 98,138,163,163,
+ 163,163,140,103, 55, 5, 0, 0, 0, 0, 0, 0, 0, 30,199,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,245,125, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,105,240,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,222,100, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 83,210,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,228,136, 45, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 37,125,220,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,225,166,112, 74, 43, 32, 12,
+ 8, 32, 40, 71,105,162,218,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+};
diff --git a/hacks/glx/dangerball.c b/hacks/glx/dangerball.c
new file mode 100644
index 0000000..e40ccc5
--- /dev/null
+++ b/hacks/glx/dangerball.c
@@ -0,0 +1,364 @@
+/* dangerball, Copyright (c) 2001-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 30 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_ball 0
+# define release_ball 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "sphere.h"
+#include "tube.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "0.05"
+
+#define SPIKE_FACES 12 /* how densely to render spikes */
+#define SMOOTH_SPIKES True
+#define SPHERE_SLICES 32 /* how densely to render spheres */
+#define SPHERE_STACKS 16
+
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ GLuint ball_list;
+ GLuint spike_list;
+
+ GLfloat pos;
+ int *spikes;
+
+ int ncolors;
+ XColor *colors;
+ int ccolor;
+ int color_shift;
+
+} ball_configuration;
+
+static ball_configuration *bps = NULL;
+
+static Bool do_spin;
+static GLfloat speed;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" }
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt ball_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_ball (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+static void
+randomize_spikes (ModeInfo *mi)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+ int i;
+ bp->pos = 0;
+ for (i = 0; i < MI_COUNT(mi); i++)
+ {
+ bp->spikes[i*2] = (random() % 360) - 180;
+ bp->spikes[i*2+1] = (random() % 180) - 90;
+ }
+
+# define ROT_SCALE 22
+ for (i = 0; i < MI_COUNT(mi) * 2; i++)
+ bp->spikes[i] = (bp->spikes[i] / ROT_SCALE) * ROT_SCALE;
+
+ if ((random() % 3) == 0)
+ bp->color_shift = random() % (bp->ncolors / 2);
+ else
+ bp->color_shift = 0;
+}
+
+static void
+draw_spikes (ModeInfo *mi)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat diam = 0.2;
+ GLfloat pos = bp->pos;
+ int i;
+
+ if (pos < 0) pos = -pos;
+
+ pos = (asin (0.5 + pos/2) - 0.5) * 2;
+
+ for (i = 0; i < MI_COUNT(mi); i++)
+ {
+ glPushMatrix();
+ glRotatef(bp->spikes[i*2], 0, 1, 0);
+ glRotatef(bp->spikes[i*2+1], 0, 0, 1);
+ glTranslatef(0.7, 0, 0);
+ glRotatef(-90, 0, 0, 1);
+ glScalef (diam, pos, diam);
+ glCallList (bp->spike_list);
+ glPopMatrix();
+
+ mi->polygon_count += (SPIKE_FACES + 1);
+ }
+}
+
+
+static void
+move_spikes (ModeInfo *mi)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (bp->pos >= 0) /* moving outward */
+ {
+ bp->pos += speed;
+ if (bp->pos >= 1) /* reverse gears at apex */
+ bp->pos = -1;
+ }
+ else /* moving inward */
+ {
+ bp->pos += speed;
+ if (bp->pos >= 0) /* stop at end */
+ randomize_spikes (mi);
+ }
+}
+
+
+ENTRYPOINT Bool
+ball_handle_event (ModeInfo *mi, XEvent *event)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_ball (ModeInfo *mi)
+{
+ ball_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, bps);
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_ball (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ {
+ double spin_speed = 10.0;
+ double wander_speed = 0.12;
+ double spin_accel = 2.0;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ True);
+ bp->trackball = gltrackball_init (True);
+ }
+
+ bp->ncolors = 128;
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+
+ bp->spikes = (int *) calloc(MI_COUNT(mi), sizeof(*bp->spikes) * 2);
+
+ bp->ball_list = glGenLists (1);
+ bp->spike_list = glGenLists (1);
+
+ glNewList (bp->ball_list, GL_COMPILE);
+ unit_sphere (SPHERE_STACKS, SPHERE_SLICES, wire);
+ glEndList ();
+
+ glNewList (bp->spike_list, GL_COMPILE);
+ cone (0, 0, 0,
+ 0, 1, 0,
+ 1, 0, SPIKE_FACES, SMOOTH_SPIKES, False, wire);
+ glEndList ();
+
+ randomize_spikes (mi);
+}
+
+
+ENTRYPOINT void
+draw_ball (ModeInfo *mi)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int c2;
+
+ static const GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
+ static const GLfloat sspec[4] = {0.0, 0.0, 0.0, 1.0};
+ static const GLfloat bshiny = 128.0;
+ static const GLfloat sshiny = 0.0;
+
+ GLfloat bcolor[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat scolor[4] = {0.0, 0.0, 0.0, 1.0};
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ glScalef(1.1, 1.1, 1.1);
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 8,
+ (z - 0.5) * 15);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ bcolor[0] = bp->colors[bp->ccolor].red / 65536.0;
+ bcolor[1] = bp->colors[bp->ccolor].green / 65536.0;
+ bcolor[2] = bp->colors[bp->ccolor].blue / 65536.0;
+
+ c2 = (bp->ccolor + bp->color_shift) % bp->ncolors;
+ scolor[0] = bp->colors[c2].red / 65536.0;
+ scolor[1] = bp->colors[c2].green / 65536.0;
+ scolor[2] = bp->colors[c2].blue / 65536.0;
+
+ bp->ccolor++;
+ if (bp->ccolor >= bp->ncolors) bp->ccolor = 0;
+
+ mi->polygon_count = 0;
+
+ glScalef (2.0, 2.0, 2.0);
+
+ move_spikes (mi);
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, bspec);
+ glMateriali (GL_FRONT, GL_SHININESS, bshiny);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bcolor);
+ glCallList (bp->ball_list);
+ mi->polygon_count += (SPHERE_SLICES * SPHERE_STACKS);
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, sspec);
+ glMaterialf (GL_FRONT, GL_SHININESS, sshiny);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, scolor);
+ draw_spikes (mi);
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("DangerBall", dangerball, ball)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/dangerball.man b/hacks/glx/dangerball.man
new file mode 100644
index 0000000..3e33f82
--- /dev/null
+++ b/hacks/glx/dangerball.man
@@ -0,0 +1,72 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+dangerball - a 3D ball that periodically extrudes spikes. Ouch!
+.SH SYNOPSIS
+.B dangerball
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-count \fInumber\fP]
+[\-no-wander]
+[\-no-spin]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Draws a ball that periodically extrudes many random spikes. Ouch!
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Spike growth frequency. 0.0 - 0.25. Default: 0.05.
+.TP 8
+.B \-count \fInumber\fP
+Number o spikes. Default: 30.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the object should spin.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/discoball.c b/hacks/glx/discoball.c
new file mode 100644
index 0000000..4085c56
--- /dev/null
+++ b/hacks/glx/discoball.c
@@ -0,0 +1,707 @@
+/* discoball, Copyright (c) 2016 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 30 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define release_ball 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "normals.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SPIN "False"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+
+typedef struct tile tile;
+struct tile {
+ XYZ position, normal;
+ GLfloat size, tilt;
+ tile *next;
+};
+
+
+typedef struct {
+ XYZ normal;
+ GLfloat color[4];
+} ray;
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ GLfloat th;
+ trackball_state *trackball;
+ Bool button_down_p;
+ tile *tiles;
+ int nrays;
+ ray *rays;
+} ball_configuration;
+
+static ball_configuration *bps = NULL;
+
+static Bool do_spin;
+static GLfloat speed;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" }
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt ball_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+static XYZ
+normalize (XYZ p)
+{
+ GLfloat d = sqrt(p.x*p.x + p.y*p.y * p.z*p.z);
+ if (d < 0.0000001)
+ p.x = p.y = p.z = 0;
+ else
+ {
+ p.x /= d;
+ p.y /= d;
+ p.z /= d;
+ }
+
+ return p;
+}
+
+
+static void
+build_texture (ModeInfo *mi)
+{
+ int x, y;
+ int size = 128;
+ int bpl = size * 2;
+ unsigned char *data = malloc (bpl * size);
+
+ for (y = 0; y < size; y++)
+ {
+ for (x = 0; x < size; x++)
+ {
+ unsigned char *c = &data [y * bpl + x * 2];
+ GLfloat X = (x / (GLfloat) (size-1)) - 0.5;
+ GLfloat Y = (y / (GLfloat) (size-1)) - 0.5;
+ X = cos (X * X * 6.2);
+ Y = cos (Y * Y * 6.2);
+ X = X < Y ? X : Y;
+ X *= 0.4;
+ c[0] = 0xFF;
+ c[1] = 0xFF * X;
+ }
+ }
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+ check_gl_error ("texture param");
+
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, size, size, 0,
+ GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, data);
+ check_gl_error ("light texture");
+ free (data);
+}
+
+
+static int
+draw_rays (ModeInfo *mi)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int polys = 0;
+ int i;
+
+ glEnable (GL_TEXTURE_2D);
+ glDisable (GL_LIGHTING);
+ glEnable (GL_BLEND);
+ glDisable (GL_DEPTH_TEST);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE);
+
+ for (i = 0; i < bp->nrays; i++)
+ {
+ GLfloat x = bp->rays[i].normal.x;
+ GLfloat y = bp->rays[i].normal.y;
+ GLfloat z = bp->rays[i].normal.z;
+ glPushMatrix();
+
+ /* Orient to direction of ray. */
+ glRotatef (-atan2 (x, y) * (180 / M_PI), 0, 0, 1);
+ glRotatef ( atan2 (z, sqrt(x*x + y*y)) * (180 / M_PI), 1, 0, 0);
+
+ glScalef (5, 5, 10);
+ glTranslatef(0, 0, 1.1);
+ glColor4fv (bp->rays[i].color);
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glTexCoord2f (0, 0); glVertex3f (-0.5, 0, -1);
+ glTexCoord2f (1, 0); glVertex3f ( 0.5, 0, -1);
+ glTexCoord2f (1, 1); glVertex3f ( 0.5, 0, 1);
+ glTexCoord2f (0, 1); glVertex3f (-0.5, 0, 1);
+ glEnd();
+ polys++;
+ glPopMatrix();
+ }
+
+ glDisable (GL_TEXTURE_2D);
+ glEnable (GL_LIGHTING);
+ glDisable (GL_BLEND);
+ glEnable (GL_DEPTH_TEST);
+ glDisable (GL_FOG);
+
+ return polys;
+}
+
+
+static int
+draw_ball_1 (ModeInfo *mi)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int polys = 0;
+ tile *t;
+ GLfloat m[4][4];
+
+ glGetFloatv (GL_MODELVIEW_MATRIX, &m[0][0]);
+
+ glFrontFace (GL_CW);
+
+#if 0
+ /* Draw the back rays.
+ */
+ if (! wire)
+ {
+ glPushMatrix();
+ glLoadIdentity();
+ glMultMatrixf (&m[0][0]);
+ glTranslatef(0, 0, -4.1);
+ glRotatef (bp->th, 0, 0, 1);
+ polys += draw_rays (mi);
+ glPopMatrix();
+ }
+ glClear(GL_DEPTH_BUFFER_BIT);
+#endif
+
+
+ /* Instead of rendering polygons for the foam ball substrate, let's
+ just billboard a quad down the middle to mask out the back-facing
+ tiles. */
+ {
+ glPushMatrix();
+ m[0][0] = 1; m[1][0] = 0; m[2][0] = 0;
+ m[0][1] = 0; m[1][1] = 1; m[2][1] = 0;
+ m[0][2] = 0; m[1][2] = 0; m[2][2] = 1;
+ glLoadIdentity();
+ glMultMatrixf (&m[0][0]);
+ glScalef (40, 40, 40);
+ glTranslatef (-0.5, -0.5, -0.01);
+ if (! wire)
+ glDisable (GL_LIGHTING);
+ /* Draw into the depth buffer but not the frame buffer */
+ glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
+ glColor3f (0, 0, 0);
+ glBegin (GL_QUADS);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, 1, 0);
+ glVertex3f (1, 1, 0);
+ glVertex3f (1, 0, 0);
+ glEnd();
+ polys++;
+ glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+ if (! wire)
+ glEnable (GL_LIGHTING);
+ glPopMatrix();
+ glColor3f (1, 1, 1);
+ }
+
+ /* Draw all the tiles.
+ */
+ for (t = bp->tiles; t; t = t->next)
+ {
+ GLfloat x = t->normal.x;
+ GLfloat y = t->normal.y;
+ GLfloat z = t->normal.z;
+ GLfloat s = t->size / 2;
+ glPushMatrix();
+
+ /* Move to location of tile. */
+ glTranslatef (t->position.x, t->position.y, t->position.z);
+
+ /* Orient to direction tile is facing. */
+ glRotatef (-atan2 (x, y) * (180 / M_PI), 0, 0, 1);
+ glRotatef ( atan2 (z, sqrt(x*x + y*y)) * (180 / M_PI), 1, 0, 0);
+
+ glRotatef (t->tilt, 0, 1, 0);
+
+ glScalef (s, s, s);
+ glNormal3f (0, 1, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (-1, 0, -1);
+ glVertex3f ( 1, 0, -1);
+ glVertex3f ( 1, 0, 1);
+ glVertex3f (-1, 0, 1);
+ glEnd();
+ polys++;
+
+ if (! wire)
+ {
+ GLfloat d = 0.2;
+ glNormal3f (0, 0, -1);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (-1, 0, -1);
+ glVertex3f (-1, -d, -1);
+ glVertex3f ( 1, -d, -1);
+ glVertex3f ( 1, 0, -1);
+ glEnd();
+ polys++;
+
+ glNormal3f (0, 0, 1);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f ( 1, 0, 1);
+ glVertex3f ( 1, -d, 1);
+ glVertex3f (-1, -d, 1);
+ glVertex3f (-1, 0, 1);
+ glEnd();
+ polys++;
+
+ glNormal3f (1, 0, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f ( 1, 0, -1);
+ glVertex3f ( 1, -d, -1);
+ glVertex3f ( 1, -d, 1);
+ glVertex3f ( 1, 0, 1);
+ glEnd();
+ polys++;
+
+ glNormal3f (-1, 0, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (-1, 0, 1);
+ glVertex3f (-1, -d, 1);
+ glVertex3f (-1, -d, -1);
+ glVertex3f (-1, 0, -1);
+ glEnd();
+ polys++;
+ }
+
+ glPopMatrix();
+ }
+
+ /* Draw the front rays.
+ */
+ if (! wire)
+ {
+ glPushMatrix();
+ glLoadIdentity();
+ glMultMatrixf (&m[0][0]);
+ glTranslatef(0, 0, 4.1);
+ glRotatef (-bp->th, 0, 0, 1);
+ polys += draw_rays (mi);
+ glPopMatrix();
+ }
+
+ return polys;
+}
+
+
+static GLfloat
+vector_angle (XYZ a, XYZ b)
+{
+ double La = sqrt (a.x*a.x + a.y*a.y + a.z*a.z);
+ double Lb = sqrt (b.x*b.x + b.y*b.y + b.z*b.z);
+ double cc, angle;
+
+ if (La == 0 || Lb == 0) return 0;
+ if (a.x == b.x && a.y == b.y && a.z == b.z) return 0;
+
+ /* dot product of two vectors is defined as:
+ La * Lb * cos(angle between vectors)
+ and is also defined as:
+ ax*bx + ay*by + az*bz
+ so:
+ La * Lb * cos(angle) = ax*bx + ay*by + az*bz
+ cos(angle) = (ax*bx + ay*by + az*bz) / (La * Lb)
+ angle = acos ((ax*bx + ay*by + az*bz) / (La * Lb));
+ */
+ cc = (a.x*b.x + a.y*b.y + a.z*b.z) / (La * Lb);
+ if (cc > 1) cc = 1; /* avoid fp rounding error (1.000001 => sqrt error) */
+ angle = acos (cc);
+
+ return (angle);
+}
+
+
+#undef RANDSIGN
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+static void
+build_ball (ModeInfo *mi)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+ int rows = MI_COUNT (mi);
+
+ GLfloat tile_size = M_PI / rows;
+ GLfloat th0, th1;
+
+ struct { XYZ position; GLfloat strength; } dents[5];
+ int dent_count = random() % countof(dents);
+ int i;
+ for (i = 0; i < dent_count; i++)
+ {
+ GLfloat dist;
+ dents[i].position.x = RANDSIGN() * (2 - BELLRAND(0.2));
+ dents[i].position.y = RANDSIGN() * (2 - BELLRAND(0.2));
+ dents[i].position.z = RANDSIGN() * (2 - BELLRAND(0.2));
+ dist = sqrt (dents[i].position.x * dents[i].position.x +
+ dents[i].position.y * dents[i].position.y +
+ dents[i].position.z * dents[i].position.z);
+ dents[i].strength = dist - (1 - BELLRAND(0.3));
+ dents[i].strength = dist - (1 - BELLRAND(0.3));
+ }
+
+
+ for (th1 = M_PI/2; th1 > -(M_PI/2 + tile_size/2); th1 -= tile_size)
+ {
+ GLfloat x = cos (th1);
+ GLfloat y = sin (th1);
+ GLfloat x0 = cos (th1 - tile_size/2);
+ GLfloat x1 = cos (th1 + tile_size/2);
+ GLfloat circ0 = M_PI * x0 * 2;
+ GLfloat circ1 = M_PI * x1 * 2;
+ GLfloat circ = (circ0 < circ1 ? circ0 : circ1);
+ int row_tiles = floor ((circ < 0 ? 0 : circ) / tile_size);
+ GLfloat spacing;
+ GLfloat dropsy = 0.13 + frand(0.04);
+
+ if (row_tiles <= 0) row_tiles = 1;
+ spacing = M_PI*2 / row_tiles;
+
+ for (th0 = 0; th0 < M_PI*2; th0 += spacing)
+ {
+ tile *t = (tile *) calloc (1, sizeof(*t));
+ t->size = tile_size * 0.85;
+ t->position.x = cos (th0) * x;
+ t->position.y = sin (th0) * x;
+ t->position.z = y;
+
+ t->normal = t->position;
+
+ /* Apply pressure on position from the dents. */
+ for (i = 0; i < dent_count; i++)
+ {
+ GLfloat dist;
+ XYZ direction;
+
+ if (! (random() % 150)) /* Drop tiles randomly */
+ {
+ free (t);
+ goto SKIP;
+ }
+
+ direction.x = t->position.x - dents[i].position.x;
+ direction.y = t->position.y - dents[i].position.y;
+ direction.z = t->position.z - dents[i].position.z;
+ dist = sqrt (direction.x * direction.x +
+ direction.y * direction.y +
+ direction.z * direction.z);
+ if (dist < dents[i].strength)
+ {
+ GLfloat s = 1 - (dents[i].strength - dist) * 0.66;
+ XYZ n2 = t->normal;
+ GLfloat angle = vector_angle (t->position, dents[i].position);
+
+ /* Drop out the tiles near the apex of the dent. */
+ if (angle < dropsy)
+ {
+ free (t);
+ goto SKIP;
+ }
+
+ t->position.x *= s;
+ t->position.y *= s;
+ t->position.z *= s;
+
+ direction = normalize (direction);
+ n2.x -= direction.x;
+ n2.y -= direction.y;
+ n2.z -= direction.z;
+
+ t->normal.x = (t->normal.x + n2.x) / 2;
+ t->normal.y = (t->normal.y + n2.y) / 2;
+ t->normal.z = (t->normal.z + n2.z) / 2;
+ }
+ }
+
+ /* Skew the direction the tile is facing slightly. */
+ t->normal.x += 0.12 - frand(0.06);
+ t->normal.y += 0.12 - frand(0.06);
+ t->normal.z += 0.12 - frand(0.06);
+ t->tilt = 4 - BELLRAND(8);
+
+ t->next = bp->tiles;
+ bp->tiles = t;
+ SKIP: ;
+ }
+ }
+
+ bp->nrays = 5 + BELLRAND(10);
+ bp->rays = (ray *) calloc (bp->nrays, sizeof(*bp->rays));
+ for (i = 0; i < bp->nrays; i++)
+ {
+ GLfloat th = frand(M_PI * 2);
+ bp->rays[i].normal.x = cos (th);
+ bp->rays[i].normal.y = sin (th);
+ bp->rays[i].normal.z = 1;
+ bp->rays[i].normal = normalize (bp->rays[i].normal);
+ bp->rays[i].color[0] = 0.9 + frand(0.1);
+ bp->rays[i].color[1] = 0.6 + frand(0.4);
+ bp->rays[i].color[2] = 0.6 + frand(0.2);
+ bp->rays[i].color[3] = 1;
+ }
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_ball (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+ball_handle_event (ModeInfo *mi, XEvent *event)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_ball (ModeInfo *mi)
+{
+ ball_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ if (! wire)
+ build_texture (mi);
+
+ reshape_ball (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ bp->th = 180 - frand(360);
+
+ if (MI_COUNT(mi) < 10)
+ MI_COUNT(mi) = 10;
+ if (MI_COUNT(mi) > 200)
+ MI_COUNT(mi) = 200;
+
+ {
+ double spin_speed = 0.1;
+ double wander_speed = 0.003;
+ double spin_accel = 1;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ False);
+ bp->trackball = gltrackball_init (True);
+ }
+
+ build_ball (mi);
+
+ if (!wire)
+ {
+ GLfloat color[4] = {0.5, 0.5, 0.5, 1};
+ GLfloat cspec[4] = {1, 1, 1, 1};
+ static const GLfloat shiny = 10;
+
+ static GLfloat pos0[4] = { 0.5, -1, -0.5, 0};
+ static GLfloat pos1[4] = {-0.75, -1, 0, 0};
+ static GLfloat amb[4] = {0, 0, 0, 1};
+ static GLfloat dif[4] = {1, 1, 1, 1};
+ static GLfloat spc[4] = {1, 1, 1, 1};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ color[0] += frand(0.2);
+ color[1] += frand(0.2);
+ color[2] += frand(0.2);
+
+ cspec[0] -= frand(0.2);
+ cspec[1] -= frand(0.2);
+ cspec[2] -= frand(0.2);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos0);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ glLightfv(GL_LIGHT1, GL_POSITION, pos1);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT1, GL_SPECULAR, spc);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT, GL_SPECULAR, cspec);
+ glMateriali (GL_FRONT, GL_SHININESS, shiny);
+ }
+}
+
+
+ENTRYPOINT void
+draw_ball (ModeInfo *mi)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 6,
+ (y - 0.5) * 6,
+ (z - 0.5) * 2);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ mi->polygon_count = 0;
+
+ glRotatef (50, 1, 0, 0);
+
+ glScalef (4, 4, 4);
+ glRotatef (bp->th, 0, 0, 1);
+ if (! bp->button_down_p)
+ {
+ bp->th += (bp->th > 0 ? speed : -speed);
+ while (bp->th > 360) bp->th -= 360;
+ while (bp->th < -360) bp->th += 360;
+ }
+
+ mi->polygon_count += draw_ball_1 (mi);
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+
+ENTRYPOINT void
+free_ball (ModeInfo *mi)
+{
+ ball_configuration *bp = &bps[MI_SCREEN(mi)];
+ while (bp->tiles)
+ {
+ tile *t = bp->tiles->next;
+ free (bp->tiles);
+ bp->tiles = t;
+ }
+ free (bp->rays);
+}
+
+XSCREENSAVER_MODULE_2 ("Discoball", discoball, ball)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/discoball.man b/hacks/glx/discoball.man
new file mode 100644
index 0000000..041cbd2
--- /dev/null
+++ b/hacks/glx/discoball.man
@@ -0,0 +1,72 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+discoball - A dusty, dented disco ball screen saver.
+.SH SYNOPSIS
+.B discoball
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-count \fInumber\fP]
+[\-no-wander]
+[\-spin]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+A dusty, dented disco ball. Woop woop.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-count \fInumber\fP
+Number of rows of tiles on the ball. 10 - 100. Default: 30.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the scene should spin.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2016 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/dnalogo.c b/hacks/glx/dnalogo.c
new file mode 100644
index 0000000..2b24f83
--- /dev/null
+++ b/hacks/glx/dnalogo.c
@@ -0,0 +1,3639 @@
+/* DNA Logo, Copyright (c) 2001-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * DNA Lounge
+ *
+ * Restaurant -- Bar -- Nightclub -- Cafe -- Est. 1985.
+ *
+ * 375 Eleventh Street
+ * San Francisco, CA
+ * 94103
+ *
+ * https://www.dnalounge.com/
+ * http://www.dnapizza.com/
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS __extension__ \
+ "*delay: 25000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*doGasket: True \n" \
+ "*doHelix: True \n" \
+ "*doLadder: True \n" \
+ "*doFrame: True \n" \
+ "*wallFacets: 360 \n" \
+ "*barFacets: 90 \n" \
+ "*clockwise: False \n" \
+ "*turns: 0.72 \n" \
+ "*turnSpacing: 2.3 \n" \
+ "*barSpacing: 0.268 \n" \
+ "*wallHeight: 0.42 \n" \
+ "*wallThickness: 0.12 \n" \
+ "*barThickness: 0.058 \n" \
+ "*wallTaper: 0.95 \n" \
+ "*gasketSize: 2.0 \n" \
+ "*gasketDepth: 0.15 \n" \
+ "*gasketThickness: 0.4 \n" \
+ "*frameSize: 1.28 \n" \
+ "*frameDepth: 0.01 \n" \
+ "*frameThickness: 0.03 \n" \
+ "*triangleSize: 0.045 \n" \
+ "*cwFacets: 3 \n" \
+ "*cwDiscFacets: 64 \n" \
+ "*cwSpread: 0.5 \n" \
+ "*cwLineWidth: 0.18 \n" \
+ "*cwThickness: 0.15 \n" \
+ "*cwCapSize: 0.4 \n" \
+ "*text: CODEWORD\n" \
+ "*speed: 1.0 \n" \
+ "*mode: both" "\n" \
+ ".background: #000000\n" \
+ ".foreground: #00AA00\n" \
+ ".cwForeground: #FCA816\n" \
+ ".cwBackground: #943225\n" \
+ "*cwFont: " CWFONT "\n" \
+ "*geometry: =640x640\n" \
+
+# if defined(HAVE_COCOA) || defined(HAVE_ANDROID)
+# define CWFONT "Yearling 28, OCR A Std 24"
+# else
+# define CWFONT "-*-helvetica-medium-r-normal-*-*-240-*-*-*-*-*-*"
+# endif
+
+# define free_logo 0
+# define release_logo 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#undef DXF_OUTPUT_HACK
+
+#ifdef DXF_OUTPUT_HACK /* When this is defined, instead of rendering
+ to the screen, we write a DXF CAD file to stdout.
+ This is a kludge of shocking magnitude...
+ Maybe there's some other way to intercept all
+ glVertex3f calls than with a #define? */
+# define unit_tube dxf_unit_tube
+# define unit_cone dxf_unit_cone
+# define tube_1 dxf_tube_1
+# define tube dxf_tube
+# define cone dxf_cone
+#endif /* DXF_OUTPUT_HACK */
+
+#include "xlockmore.h"
+#include "normals.h"
+#include "tube.h"
+#include "sphere.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include "utf8wc.h"
+#include "texfont.h"
+
+#ifdef USE_GL /* whole file */
+
+#ifdef HAVE_JWZGLES
+# include "dnapizza.h"
+#else
+# define HAVE_TESS
+#endif
+
+typedef enum {
+ HELIX_IN, HELIX, HELIX_OUT,
+ PIZZA_IN, PIZZA, PIZZA_OUT,
+ HELIX_AND_PIZZA,
+# ifdef CW
+ CODEWORD_IN, CODEWORD, CODEWORD_OUT, CODEWORD_BLANK
+# endif
+} glyph_mode;
+
+typedef struct {
+ Bool spinning_p;
+ GLfloat position; /* 0.0 - 1.0 */
+ GLfloat position_eased; /* 0.0 - 1.0, eased in and out */
+ GLfloat easement; /* portion of path that is eased. <= 0.5 */
+ GLfloat speed; /* how far along the path (may be negative) */
+ GLfloat probability; /* relative likelyhood to start spinning */
+} spinner;
+
+typedef struct {
+ GLXContext *glx_context;
+
+ GLuint helix_list, helix_list_wire, helix_list_facetted;
+ GLuint pizza_list, pizza_list_wire, pizza_list_facetted;
+ GLuint gasket_list, gasket_list_wire;
+ GLuint frame_list, frame_list_wire;
+ int polys[7];
+
+ int wall_facets;
+ int bar_facets;
+ Bool clockwise;
+ GLfloat color[4];
+
+ GLfloat turns;
+ GLfloat turn_spacing;
+ GLfloat bar_spacing;
+ GLfloat wall_height;
+ GLfloat wall_thickness;
+ GLfloat bar_thickness;
+ GLfloat wall_taper;
+
+ GLfloat gasket_size;
+ GLfloat gasket_depth;
+ GLfloat gasket_thickness;
+
+ GLfloat frame_size;
+ GLfloat frame_depth;
+ GLfloat frame_thickness;
+ GLfloat triangle_size;
+
+# ifdef CW
+ int codeword_facets, codeword_disc_facets;
+ GLfloat codeword_spread, codeword_line_width, codeword_thickness;
+ GLfloat codeword_cap_size;
+ const char *codeword_text;
+ char *codeword_text_out;
+ int *codeword_text_points;
+ XYZ *codeword_path;
+ int codeword_path_npoints;
+ int codeword_nguides;
+ XYZ *codeword_guides;
+ GLfloat codeword_color[4], codeword_bg[4];
+ texture_font_data *font;
+# endif
+
+# ifdef DEBUG
+ GLfloat persp_off, pos_off;
+ texture_font_data *label_font;
+# endif
+
+ GLfloat speed;
+ glyph_mode mode;
+ glyph_mode anim_state;
+ GLfloat anim_ratio;
+
+ spinner gasket_spinnerx, gasket_spinnery, gasket_spinnerz;
+ spinner scene_spinnerx, scene_spinnery; /* for DNA */
+# ifdef CW
+ rotator *scene_rot; /* for Codeword */
+# endif
+ spinner helix_spinnerz;
+ spinner pizza_spinnery, pizza_spinnerz;
+ spinner frame_spinner;
+
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ int wire_overlay; /* frame countdown */
+
+} logo_configuration;
+
+static logo_configuration *dcs = NULL;
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-pizza", ".mode", XrmoptionNoArg, "pizza" },
+ { "-helix", ".mode", XrmoptionNoArg, "helix" },
+ { "-both", ".mode", XrmoptionNoArg, "both" },
+# ifdef CW
+ { "-codeword", ".mode", XrmoptionNoArg, "codeword" },
+ { "-cw", ".mode", XrmoptionNoArg, "codeword" },
+ { "-text", ".text", XrmoptionSepArg, 0 },
+# endif
+};
+
+ENTRYPOINT ModeSpecOpt logo_opts = {countof(opts), opts, 0, NULL, NULL};
+
+#define PROBABILITY_SCALE 600
+
+
+#ifdef DXF_OUTPUT_HACK
+
+# define glBegin dxf_glBegin
+# define glVertex3f dxf_glVertex3f
+# define glVertex3dv dxf_glVertex3dv
+# define glEnd dxf_glEnd
+# define glVertexPointer dxf_glVertexPointer
+# define glDrawArrays dxf_glDrawArrays
+
+static int dxf_type, dxf_point, dxf_point_total, dxf_layer, dxf_color;
+static GLfloat dxf_quads[4*4];
+
+static void
+dxf_glBegin (int type)
+{
+ dxf_type = type;
+ dxf_point = 0;
+ dxf_point_total = 0;
+}
+
+static void
+dxf_glVertex3f (GLfloat ox, GLfloat oy, GLfloat oz)
+{
+ int i = 0;
+ GLfloat m[4*4];
+ GLfloat x, y, z;
+
+ /* Transform the point into modelview space. */
+ glGetFloatv (GL_MODELVIEW_MATRIX, m);
+ x = ox * m[0] + oy * m[4] + oz * m[8] + m[12];
+ y = ox * m[1] + oy * m[5] + oz * m[9] + m[13];
+ z = ox * m[2] + oy * m[6] + oz * m[10] + m[14];
+
+ dxf_quads[dxf_point*3+0] = x;
+ dxf_quads[dxf_point*3+1] = y;
+ dxf_quads[dxf_point*3+2] = z;
+ dxf_point++;
+ dxf_point_total++;
+
+ switch (dxf_type) {
+ case GL_QUADS:
+ if (dxf_point < 4) return;
+
+ fprintf (stdout, "0\n3DFACE\n8\n%d\n62\n%d\n", dxf_layer, dxf_color);
+ fprintf (stdout, "10\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "20\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "30\n%.6f\n", dxf_quads[i++]);
+
+ fprintf (stdout, "11\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "21\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "31\n%.6f\n", dxf_quads[i++]);
+
+ fprintf (stdout, "12\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "22\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "32\n%.6f\n", dxf_quads[i++]);
+
+ fprintf (stdout, "13\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "23\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "33\n%.6f\n", dxf_quads[i++]);
+ dxf_point = 0;
+ break;
+
+ case GL_QUAD_STRIP:
+ if (dxf_point < 4) return;
+
+ fprintf (stdout, "0\n3DFACE\n8\n%d\n62\n%d\n", dxf_layer, dxf_color);
+ fprintf (stdout, "10\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "20\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "30\n%.6f\n", dxf_quads[i++]);
+
+ fprintf (stdout, "11\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "21\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "31\n%.6f\n", dxf_quads[i++]);
+
+ fprintf (stdout, "12\n%.6f\n", dxf_quads[i+3]); /* funky quad strip */
+ fprintf (stdout, "22\n%.6f\n", dxf_quads[i+4]); /* vert order: 1243. */
+ fprintf (stdout, "32\n%.6f\n", dxf_quads[i+5]);
+
+ fprintf (stdout, "13\n%.6f\n", dxf_quads[i]);
+ fprintf (stdout, "23\n%.6f\n", dxf_quads[i+1]);
+ fprintf (stdout, "33\n%.6f\n", dxf_quads[i+2]);
+ i += 6;
+
+ dxf_quads[0] = dxf_quads[6]; /* copy point 3 to pos 1 */
+ dxf_quads[1] = dxf_quads[7];
+ dxf_quads[2] = dxf_quads[8];
+ dxf_quads[3] = dxf_quads[9]; /* copy point 4 to pos 2 */
+ dxf_quads[4] = dxf_quads[10];
+ dxf_quads[5] = dxf_quads[11];
+ dxf_point = 2; /* leave those two points in queue */
+ break;
+
+ case GL_TRIANGLES:
+ case GL_TRIANGLE_FAN:
+ if (dxf_point < 3) return;
+
+ fprintf (stdout, "0\n3DFACE\n8\n%d\n62\n%d\n", dxf_layer, dxf_color);
+ fprintf (stdout, "10\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "20\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "30\n%.6f\n", dxf_quads[i++]);
+
+ fprintf (stdout, "11\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "21\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "31\n%.6f\n", dxf_quads[i++]);
+
+ fprintf (stdout, "12\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "22\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "32\n%.6f\n", dxf_quads[i++]);
+
+ i -= 3;
+ fprintf (stdout, "13\n%.6f\n", dxf_quads[i++]); /* dup pt 4 as pt 3. */
+ fprintf (stdout, "23\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "33\n%.6f\n", dxf_quads[i++]);
+
+ dxf_point = 0;
+ if (dxf_type == GL_TRIANGLE_FAN)
+ {
+ dxf_quads[3] = dxf_quads[6]; /* copy point 3 to point 2 */
+ dxf_quads[4] = dxf_quads[7];
+ dxf_quads[5] = dxf_quads[8];
+ dxf_point = 2; /* leave two points in queue */
+ }
+ break;
+
+ case GL_TRIANGLE_STRIP:
+ if (dxf_point < 3) return;
+
+ fprintf (stdout, "0\n3DFACE\n8\n%d\n62\n%d\n", dxf_layer, dxf_color);
+
+ fprintf (stdout, "10\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "20\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "30\n%.6f\n", dxf_quads[i++]);
+
+ fprintf (stdout, "11\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "21\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "31\n%.6f\n", dxf_quads[i++]);
+
+ fprintf (stdout, "12\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "22\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "32\n%.6f\n", dxf_quads[i++]);
+
+ i -= 3;
+ fprintf (stdout, "13\n%.6f\n", dxf_quads[i++]); /* dup pt 4 as pt 3. */
+ fprintf (stdout, "23\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "33\n%.6f\n", dxf_quads[i++]);
+
+ dxf_quads[0] = dxf_quads[3]; /* copy point 2 to pos 1 */
+ dxf_quads[1] = dxf_quads[4];
+ dxf_quads[2] = dxf_quads[5];
+ dxf_quads[3] = dxf_quads[6]; /* copy point 3 to pos 2 */
+ dxf_quads[4] = dxf_quads[7];
+ dxf_quads[5] = dxf_quads[8];
+ dxf_point = 2; /* leave those two points in queue */
+ break;
+
+ case GL_LINES:
+ case GL_LINE_STRIP:
+ case GL_LINE_LOOP:
+
+ if (dxf_point_total == 1)
+ {
+ dxf_quads[6] = ox;
+ dxf_quads[7] = oy;
+ dxf_quads[8] = oz;
+ }
+
+ if (dxf_point < 2) return;
+
+ fprintf (stdout, "0\nLINE\n8\n%d\n62\n%d\n", dxf_layer, dxf_color);
+
+ fprintf (stdout, "10\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "20\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "30\n%.6f\n", dxf_quads[i++]);
+
+ fprintf (stdout, "11\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "21\n%.6f\n", dxf_quads[i++]);
+ fprintf (stdout, "31\n%.6f\n", dxf_quads[i++]);
+
+ dxf_point = 0;
+ if (dxf_type != GL_LINES)
+ {
+ dxf_quads[0] = dxf_quads[3];
+ dxf_quads[1] = dxf_quads[4];
+ dxf_quads[2] = dxf_quads[5];
+ dxf_point = 1;
+ }
+ break;
+
+ default:
+ abort();
+ break;
+ }
+}
+
+
+static void
+dxf_glVertex3dv (const GLdouble *v)
+{
+ glVertex3f (v[0], v[1], v[2]);
+}
+
+
+static void
+dxf_glEnd(void)
+{
+ if (dxf_type == GL_LINE_LOOP) /* close loop */
+ glVertex3f (dxf_quads[6], dxf_quads[7], dxf_quads[8]);
+ dxf_type = -1;
+ dxf_point = 0;
+ dxf_point_total = 0;
+}
+
+
+static void
+dxf_start (void)
+{
+ fprintf (stdout, "0\nSECTION\n2\nHEADER\n0\nENDSEC\n");
+ fprintf (stdout, "0\nSECTION\n2\nENTITIES\n");
+}
+
+static void
+dxf_end (void)
+{
+ fprintf (stdout, "0\nENDSEC\n0\nEOF\n");
+ exit (0);
+}
+
+
+static const GLvoid *dxf_vp;
+static GLsizei dxf_vp_size;
+static GLsizei dxf_vp_stride;
+
+static void
+dxf_glVertexPointer (GLint size, GLenum type, GLsizei stride,
+ const GLvoid *pointer)
+{
+ if (type != GL_FLOAT) abort();
+ if (stride <= 0) abort();
+ dxf_vp = pointer;
+ dxf_vp_size = size;
+ dxf_vp_stride = stride;
+}
+
+static void
+dxf_glDrawArrays (GLenum mode, GLint first, GLsizei count)
+{
+ int i;
+ unsigned char *a = (unsigned char *) dxf_vp;
+ dxf_glBegin (mode);
+ for (i = first; i < first+count; i++)
+ {
+ GLfloat *fa = (GLfloat *) a;
+ dxf_glVertex3f (fa[0], fa[1], fa[2]);
+ a += dxf_vp_stride;
+ }
+ dxf_glEnd();
+}
+
+
+# define XYZ tube_XYZ /* avoid conflict with normals.h */
+# include "tube.c" /* Yes, I really am including a C file. */
+# undef XYZ
+# define XYZ sphere_XYZ
+# define unit_sphere unit_sphere_dxf
+# define unit_dome unit_dome_dxf
+# include "sphere.c"
+# undef XYZ
+
+#endif /* DXF_OUTPUT_HACK */
+
+
+
+/* Calculate the angle (in radians) between two vectors.
+ */
+static GLfloat
+vector_angle (double ax, double ay, double az,
+ double bx, double by, double bz)
+{
+ double La = sqrt (ax*ax + ay*ay + az*az);
+ double Lb = sqrt (bx*bx + by*by + bz*bz);
+ double cc, angle;
+
+ if (La == 0 || Lb == 0) return 0;
+ if (ax == bx && ay == by && az == bz) return 0;
+
+ /* dot product of two vectors is defined as:
+ La * Lb * cos(angle between vectors)
+ and is also defined as:
+ ax*bx + ay*by + az*bz
+ so:
+ La * Lb * cos(angle) = ax*bx + ay*by + az*bz
+ cos(angle) = (ax*bx + ay*by + az*bz) / (La * Lb)
+ angle = acos ((ax*bx + ay*by + az*bz) / (La * Lb));
+ */
+ cc = (ax*bx + ay*by + az*bz) / (La * Lb);
+ if (cc > 1) cc = 1; /* avoid fp rounding error (1.000001 => sqrt error) */
+ angle = acos (cc);
+
+ return (angle);
+}
+
+
+# ifdef CW
+
+static void
+normalize (XYZ *p)
+{
+ GLfloat d = sqrt (p->x*p->x + p->y*p->y + p->z*p->z);
+ if (d != 0)
+ {
+ p->x /= d;
+ p->y /= d;
+ p->z /= d;
+ }
+ else
+ {
+ p->x = p->y = p->z = 0;
+ }
+}
+
+
+static double
+dot (const XYZ u, const XYZ v)
+{
+ return (u.x * v.x) + (u.y * v.y) + (u.z * v.z);
+}
+
+#endif /* CW */
+
+
+/* Make the helix
+ */
+
+static int
+make_helix (logo_configuration *dc, int facetted, int wire)
+{
+ int polys = 0;
+ int wall_facets = dc->wall_facets / (facetted ? 10 : 1);
+ GLfloat th;
+ GLfloat max_th = M_PI * 2 * dc->turns;
+ GLfloat th_inc = M_PI * 2 / wall_facets;
+
+ GLfloat x1=0, y1=0, x2=0, y2=0;
+ GLfloat x1b=0, y1b=0, x2b=0, y2b=0;
+ GLfloat z1=0, z2=0;
+ GLfloat h1=0, h2=0;
+ GLfloat h1off=0, h2off=0;
+ GLfloat z_inc = dc->turn_spacing / wall_facets;
+
+ th = 0;
+ x1 = 1;
+ y1 = 0;
+ x1b = 1;
+ y1b = 0;
+
+ z1 = -(dc->turn_spacing * dc->turns / 2);
+
+ h1 = (dc->wall_taper > 0 ? 0 : dc->wall_height / 2);
+ h1off = (dc->wall_taper > 0 ? -dc->wall_height / 2 : 0);
+
+ if (!dc->clockwise)
+ z1 = -z1, z_inc = -z_inc, h1off = -h1off;
+
+ /* Leading end-cap
+ */
+ if (!wire && h1 > 0)
+ {
+ GLfloat nx, ny;
+ glFrontFace(GL_CCW);
+ glBegin(GL_QUADS);
+ nx = cos (th + M_PI/2);
+ ny = sin (th + M_PI/2);
+ glNormal3f(nx, ny, 0);
+ glVertex3f( x1, y1, z1 - h1 + h1off);
+ glVertex3f( x1, y1, z1 + h1 + h1off);
+ glVertex3f(x1b, y1b, z1 + h1 + h1off);
+ glVertex3f(x1b, y1b, z1 - h1 + h1off);
+ polys++;
+ glEnd();
+ }
+
+ while (th + th_inc <= max_th)
+ {
+ GLfloat thick = dc->wall_thickness;
+
+ th += th_inc;
+
+ x2 = cos (th);
+ y2 = sin (th);
+ z2 = z1 + z_inc;
+
+ h2 = h1;
+ h2off = h1off;
+
+ if (dc->wall_taper > 0)
+ {
+ h2off = 0;
+ if (th < dc->wall_taper)
+ {
+ h2 = dc->wall_height/2 * cos (M_PI / 2
+ * (1 - (th / dc->wall_taper)));
+ if (dc->clockwise)
+ h2off = h2 - dc->wall_height/2;
+ else
+ h2off = dc->wall_height/2 - h2;
+
+ if (th + th_inc <= 0)
+ thick = 0;
+ else
+ thick *= cos (M_PI / 2 * (1 - (th / dc->wall_taper)));
+ }
+ else if (th >= max_th - dc->wall_taper)
+ {
+ if (th + th_inc > max_th) /* edge case: always come to a point */
+ h2 = 0;
+ else
+ h2 = dc->wall_height/2 * cos (M_PI / 2
+ * (1 - ((max_th - th)
+ / dc->wall_taper)));
+ if (dc->clockwise)
+ h2off = dc->wall_height/2 - h2;
+ else
+ h2off = h2 - dc->wall_height/2;
+
+ if (th + th_inc > max_th)
+ thick = 0;
+ else
+ thick *= cos(M_PI / 2 * (1 - ((max_th - th)/dc->wall_taper)));
+ }
+ }
+
+ x2b = x2 * (1 - thick);
+ y2b = y2 * (1 - thick);
+
+ /* outer face
+ */
+ glFrontFace(GL_CW);
+ glBegin(wire ? GL_LINES : GL_QUADS);
+ glNormal3f(x1, y1, 0);
+ glVertex3f(x1, y1, z1 - h1 + h1off);
+ glVertex3f(x1, y1, z1 + h1 + h1off);
+ glNormal3f(x2, y2, 0);
+ glVertex3f(x2, y2, z2 + h2 + h2off);
+ glVertex3f(x2, y2, z2 - h2 + h2off);
+ polys++;
+ glEnd();
+
+ /* inner face
+ */
+ glFrontFace(GL_CCW);
+ glBegin(wire ? GL_LINES : GL_QUADS);
+ glNormal3f(-x1b, -y1b, 0);
+ glVertex3f( x1b, y1b, z1 - h1 + h1off);
+ glVertex3f( x1b, y1b, z1 + h1 + h1off);
+ glNormal3f(-x2b, -y2b, 0);
+ glVertex3f( x2b, y2b, z2 + h2 + h2off);
+ glVertex3f( x2b, y2b, z2 - h2 + h2off);
+ polys++;
+ glEnd();
+
+ /* top face
+ */
+ glFrontFace(GL_CCW);
+ /* glNormal3f(0, 0, 1);*/
+ do_normal (x2, y2, z2 + h2 + h2off,
+ x2b, y2b, z2 + h2 + h2off,
+ x1b, y1b, z1 + h1 + h1off);
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f( x2, y2, z2 + h2 + h2off);
+ glVertex3f( x2b, y2b, z2 + h2 + h2off);
+ glVertex3f( x1b, y1b, z1 + h1 + h1off);
+ glVertex3f( x1, y1, z1 + h1 + h1off);
+ polys++;
+ glEnd();
+
+ /* bottom face
+ */
+ glFrontFace(GL_CCW);
+ do_normal ( x1, y1, z1 - h1 + h1off,
+ x1b, y1b, z1 - h1 + h1off,
+ x2b, y2b, z2 - h2 + h2off);
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glNormal3f(0, 0, -1);
+ glVertex3f( x1, y1, z1 - h1 + h1off);
+ glVertex3f( x1b, y1b, z1 - h1 + h1off);
+ glVertex3f( x2b, y2b, z2 - h2 + h2off);
+ glVertex3f( x2, y2, z2 - h2 + h2off);
+ polys++;
+ glEnd();
+
+ x1 = x2;
+ y1 = y2;
+ x1b = x2b;
+ y1b = y2b;
+ z1 += z_inc;
+ h1 = h2;
+ h1off = h2off;
+ }
+
+ /* Trailing end-cap
+ */
+ if (!wire && h2 > 0)
+ {
+ GLfloat nx, ny;
+ glFrontFace(GL_CW);
+ glBegin(GL_QUADS);
+ nx = cos (th + M_PI/2);
+ ny = sin (th + M_PI/2);
+ glNormal3f(nx, ny, 0);
+ glVertex3f(x2, y2, z1 - h2 + h2off);
+ glVertex3f(x2, y2, z1 + h2 + h2off);
+ glVertex3f(x2b, y2b, z1 + h2 + h2off);
+ glVertex3f(x2b, y2b, z1 - h2 + h2off);
+ polys++;
+ glEnd();
+ }
+ return polys;
+}
+
+
+static int
+make_ladder (logo_configuration *dc, int facetted, int wire)
+{
+ int polys = 0;
+ GLfloat th;
+ GLfloat max_th = dc->turns * M_PI * 2;
+ GLfloat max_z = dc->turns * dc->turn_spacing;
+ GLfloat z_inc = dc->bar_spacing;
+ GLfloat th_inc = M_PI * 2 * (dc->bar_spacing / dc->turn_spacing);
+ GLfloat x, y, z;
+
+ /* skip forward to center the bars in the helix... */
+ int i;
+ GLfloat usable_th = max_th - dc->wall_taper;
+ GLfloat usable_z = max_z / (max_th / usable_th);
+ int nbars = usable_z / dc->bar_spacing;
+ GLfloat used_z, pad_z, pad_ratio;
+
+ if (! (nbars & 1)) nbars--; /* always an odd number of bars */
+
+ used_z = (nbars - 1) * dc->bar_spacing;
+ pad_z = max_z - used_z;
+ pad_ratio = pad_z / max_z;
+
+ th = (max_th * pad_ratio/2);
+ z = -(max_z / 2) + (max_z * pad_ratio/2);
+
+ /* ##### WHYYYYYY */
+ /* The image is not reflected across line y = -x and I don't know why. */
+ th += M_PI * -0.035;
+ z -= 0.08;
+
+ if (!dc->clockwise)
+ z = -z, z_inc = -z_inc;
+
+ glFrontFace(GL_CCW);
+ for (i = 0; i < nbars; i++)
+ {
+ int facets = dc->bar_facets / (facetted ? 14 : 1);
+ if (facets <= 3) facets = 3;
+ x = cos (th) * (1 - dc->wall_thickness);
+ y = sin (th) * (1 - dc->wall_thickness);
+ polys += tube ( x, y, z,
+ -x, -y, z,
+ dc->bar_thickness, 0, facets,
+ True, True, wire);
+ z += z_inc;
+ th += th_inc;
+ }
+ return polys;
+}
+
+
+
+/* Make the gasket
+ */
+
+
+static int
+make_gasket (logo_configuration *dc, int wire)
+{
+ int polys = 0;
+ int i;
+ int points_size;
+ int npoints = 0;
+ int nctrls = 0;
+ int res = 360/8;
+ GLfloat d2r = M_PI / 180;
+
+ GLfloat thick2 = (dc->gasket_thickness / dc->gasket_size) / 2;
+
+ GLfloat *pointsx0, *pointsy0, *pointsx1, *pointsy1, *normals;
+
+ GLfloat r0 = 0.750; /* 395 */
+ GLfloat r1a = 0.825; /* bottom of wall below upper left hole */
+ GLfloat r1b = 0.867; /* center of upper left hole */
+ GLfloat r1c = 0.909; /* top of wall above hole */
+ GLfloat r1 = 0.916; /* 471 */
+ GLfloat r2 = 0.963; /* 490 */
+ GLfloat r3 = 0.960; /* 499 */
+ GLfloat r4 = 1.000; /* 507 */
+ GLfloat r5 = 1.080; /* 553 */
+
+ GLfloat ctrl_r[100], ctrl_th[100];
+
+ glPushMatrix();
+
+# ifdef DXF_OUTPUT_HACK
+ if (! wire) res *= 8;
+# endif
+
+# define POINT(r,th) \
+ ctrl_r [nctrls] = r, \
+ ctrl_th[nctrls] = (th * d2r), \
+ nctrls++
+
+ POINT (0.829, 0); /* top indentation, right half */
+ POINT (0.831, 0.85);
+ POINT (0.835, 1.81);
+ POINT (0.841, 2.65);
+ POINT (0.851, 3.30);
+ POINT (0.862, 3.81);
+ POINT (0.872, 3.95);
+
+ POINT (r4, 4.0); /* moving clockwise... */
+ POINT (r4, 47.0);
+ POINT (r1, 47.0);
+ POINT (r1, 53.0);
+ POINT (r2, 55.5);
+ POINT (r2, 72.3);
+ POINT (r1, 74.0);
+ POINT (r1, 100.0);
+ POINT (r3, 102.5);
+ POINT (r3, 132.0);
+ POINT (r1, 133.0);
+
+ POINT (r1, 180.7);
+ POINT (r2, 183.6);
+ POINT (r2, 210.0);
+ POINT (r1, 212.0);
+ POINT (r1, 223.2);
+ POINT (r5, 223.2);
+ POINT (r5, 225.0);
+ POINT (r4, 225.0);
+
+ POINT (r4, 316.8); /* upper left indentation */
+ POINT (0.990, 316.87);
+ POINT (0.880, 317.21);
+ POINT (0.872, 317.45);
+ POINT (0.869, 317.80);
+ POINT (0.867, 318.10);
+
+ POINT (0.867, 318.85);
+ POINT (0.869, 319.15);
+ POINT (0.872, 319.50);
+ POINT (0.880, 319.74);
+ POINT (0.990, 320.08);
+
+ POINT (r4, 338.0);
+ if (! wire)
+ {
+ POINT (r1a, 338.0); /* cut-out disc */
+ POINT (r1a, 344.0);
+ }
+ POINT (r4, 344.0);
+ POINT (r4, 356.0);
+
+ POINT (0.872, 356.05); /* top indentation, left half */
+ POINT (0.862, 356.19);
+ POINT (0.851, 356.70);
+ POINT (0.841, 357.35);
+ POINT (0.835, 358.19);
+ POINT (0.831, 359.15);
+ POINT (0.829, 360);
+# undef POINT
+
+ points_size = res + (nctrls * 2);
+ pointsx0 = (GLfloat *) malloc (points_size * sizeof(GLfloat));
+ pointsy0 = (GLfloat *) malloc (points_size * sizeof(GLfloat));
+ pointsx1 = (GLfloat *) malloc (points_size * sizeof(GLfloat));
+ pointsy1 = (GLfloat *) malloc (points_size * sizeof(GLfloat));
+ normals = (GLfloat *) malloc (points_size * sizeof(GLfloat) * 2);
+
+ npoints = 0;
+ for (i = 1; i < nctrls; i++)
+ {
+ GLfloat from_r = ctrl_r [i-1];
+ GLfloat from_th = ctrl_th[i-1];
+ GLfloat to_r = ctrl_r [i];
+ GLfloat to_th = ctrl_th[i];
+
+ GLfloat step = 2*M_PI / res;
+ int nsteps = 1 + ((to_th - from_th) / step);
+ int j;
+
+ for (j = 0; j < nsteps + (i == nctrls-1); j++)
+ {
+ GLfloat r = from_r + (j * (to_r - from_r) / nsteps);
+ GLfloat th = from_th + (j * (to_th - from_th) / nsteps);
+
+ GLfloat cth = cos(th) * dc->gasket_size;
+ GLfloat sth = sin(th) * dc->gasket_size;
+
+ pointsx0[npoints] = r0 * cth; /* inner ring */
+ pointsy0[npoints] = r0 * sth;
+ pointsx1[npoints] = r * cth; /* outer ring */
+ pointsy1[npoints] = r * sth;
+ npoints++;
+
+ if (npoints >= points_size) abort();
+ }
+ }
+
+ /* normals for the outer ring */
+ for (i = 1; i < npoints; i++)
+ {
+ XYZ a, b, c, n;
+ a.x = pointsx1[i-1];
+ a.y = pointsy1[i-1];
+ a.z = 0;
+ b.x = pointsx1[i];
+ b.y = pointsy1[i];
+ b.z = 0;
+ c = b;
+ c.z = 1;
+ n = calc_normal (a, b, c);
+ normals[(i-1)*2 ] = n.x;
+ normals[(i-1)*2+1] = n.y;
+ }
+
+ glRotatef(-90, 0, 1, 0);
+ glRotatef(180, 0, 0, 1);
+
+ if (wire)
+ {
+ GLfloat z;
+ for (z = -thick2; z <= thick2; z += thick2*2)
+ {
+# if 1
+ /* inside edge */
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < npoints; i++)
+ glVertex3f (pointsx0[i], pointsy0[i], z);
+ polys += npoints;
+ glEnd();
+
+ /* outside edge */
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < npoints; i++)
+ glVertex3f (pointsx1[i], pointsy1[i], z);
+ polys += npoints;
+ glEnd();
+# else
+ for (i = 1; i < npoints; i++)
+ {
+ glBegin (GL_LINE_STRIP);
+ glVertex3f (pointsx0[i-1], pointsy0[i-1], z);
+ glVertex3f (pointsx0[i ], pointsy0[i ], z);
+ glVertex3f (pointsx1[i ], pointsy1[i ], z);
+ glVertex3f (pointsx1[i-1], pointsy1[i-1], z);
+ glEnd();
+ }
+ polys += npoints;
+# endif
+ }
+#if 1
+ glBegin (GL_LINES);
+ for (i = 0; i < npoints; i++)
+ {
+ /* inside rim */
+ glVertex3f (pointsx0[i], pointsy0[i], -thick2);
+ glVertex3f (pointsx0[i], pointsy0[i], thick2);
+ /* outside rim */
+ glVertex3f (pointsx1[i], pointsy1[i], -thick2);
+ glVertex3f (pointsx1[i], pointsy1[i], thick2);
+ }
+ polys += npoints;
+ glEnd();
+#endif
+ }
+ else
+ {
+ /* top */
+ glFrontFace(GL_CW);
+ glNormal3f(0, 0, -1);
+ glBegin (GL_QUAD_STRIP);
+ for (i = 0; i < npoints; i++)
+ {
+ glVertex3f (pointsx0[i], pointsy0[i], -thick2);
+ glVertex3f (pointsx1[i], pointsy1[i], -thick2);
+ }
+ polys += npoints;
+ glEnd();
+
+ /* bottom */
+ glFrontFace(GL_CCW);
+ glNormal3f(0, 0, 1);
+ glBegin (GL_QUAD_STRIP);
+ for (i = 0; i < npoints; i++)
+ {
+ glVertex3f (pointsx0[i], pointsy0[i], thick2);
+ glVertex3f (pointsx1[i], pointsy1[i], thick2);
+ }
+ polys += npoints;
+ glEnd();
+
+ /* inside edge */
+ glFrontFace(GL_CW);
+ glBegin (GL_QUAD_STRIP);
+ for (i = 0; i < npoints; i++)
+ {
+ glNormal3f (-pointsx0[i], -pointsy0[i], 0);
+ glVertex3f ( pointsx0[i], pointsy0[i], thick2);
+ glVertex3f ( pointsx0[i], pointsy0[i], -thick2);
+ }
+ polys += npoints;
+ glEnd();
+
+ /* outside edge */
+ glFrontFace(GL_CCW);
+ glBegin (GL_QUADS);
+ {
+ for (i = 0; i < npoints-1; i++)
+ {
+ int ia = (i == 0 ? npoints-2 : i-1);
+ int iz = (i == npoints-2 ? 0 : i+1);
+ GLfloat x = pointsx1[i];
+ GLfloat y = pointsy1[i];
+ GLfloat xz = pointsx1[iz];
+ GLfloat yz = pointsy1[iz];
+
+ GLfloat nxa = normals[ia*2]; /* normal of [i-1 - i] face */
+ GLfloat nya = normals[ia*2+1];
+ GLfloat nx = normals[i*2]; /* normal of [i - i+1] face */
+ GLfloat ny = normals[i*2+1];
+ GLfloat nxz = normals[iz*2]; /* normal of [i+1 - i+2] face */
+ GLfloat nyz = normals[iz*2+1];
+
+ GLfloat anglea = vector_angle (nx, ny, 0, nxa, nya, 0);
+ GLfloat anglez = vector_angle (nx, ny, 0, nxz, nyz, 0);
+ GLfloat pointy = 0.6;
+
+ if (anglea > pointy)
+ {
+ glNormal3f (nx, ny, 0);
+ glVertex3f (x, y, thick2);
+ glVertex3f (x, y, -thick2);
+ }
+ else
+ {
+ glNormal3f ((nxa + nx) / 2, (nya + ny) / 2, 0);
+ glVertex3f (x, y, thick2);
+ glVertex3f (x, y, -thick2);
+ }
+
+ if (anglez > pointy)
+ {
+ glNormal3f (nx, ny, 0);
+ glVertex3f (xz, yz, -thick2);
+ glVertex3f (xz, yz, thick2);
+ }
+ else
+ {
+ glNormal3f ((nx + nxz) / 2, (ny + nyz) / 2, 0);
+ glVertex3f (xz, yz, -thick2);
+ glVertex3f (xz, yz, thick2);
+ }
+ }
+ polys += npoints;
+ }
+ glEnd();
+ }
+
+ /* Fill in the upper left hole...
+ */
+ {
+ GLfloat th;
+ npoints = 0;
+
+ th = 338.0 * d2r;
+ pointsx0[npoints] = r1c * cos(th) * dc->gasket_size;
+ pointsy0[npoints] = r1c * sin(th) * dc->gasket_size;
+ npoints++;
+ pointsx0[npoints] = r4 * cos(th) * dc->gasket_size;
+ pointsy0[npoints] = r4 * sin(th) * dc->gasket_size;
+ npoints++;
+
+ th = 344.0 * d2r;
+ pointsx0[npoints] = r1c * cos(th) * dc->gasket_size;
+ pointsy0[npoints] = r1c * sin(th) * dc->gasket_size;
+ npoints++;
+ pointsx0[npoints] = r4 * cos(th) * dc->gasket_size;
+ pointsy0[npoints] = r4 * sin(th) * dc->gasket_size;
+
+ if (! wire)
+ {
+ /* front wall */
+ glNormal3f (0, 0, -1);
+ glFrontFace(GL_CW);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (pointsx0[0], pointsy0[0], -thick2);
+ glVertex3f (pointsx0[1], pointsy0[1], -thick2);
+ glVertex3f (pointsx0[3], pointsy0[3], -thick2);
+ glVertex3f (pointsx0[2], pointsy0[2], -thick2);
+ glEnd();
+ polys++;
+
+ /* back wall */
+ glNormal3f (0, 0, 1);
+ glFrontFace(GL_CCW);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (pointsx0[0], pointsy0[0], thick2);
+ glVertex3f (pointsx0[1], pointsy0[1], thick2);
+ glVertex3f (pointsx0[3], pointsy0[3], thick2);
+ glVertex3f (pointsx0[2], pointsy0[2], thick2);
+ glEnd();
+ polys++;
+ }
+
+ /* top wall */
+ glFrontFace(GL_CW);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glNormal3f (pointsx0[1], pointsy0[1], 0);
+ glVertex3f (pointsx0[1], pointsy0[1], thick2);
+ glNormal3f (pointsx0[3], pointsy0[3], 0);
+ glVertex3f (pointsx0[3], pointsy0[3], thick2);
+ glVertex3f (pointsx0[3], pointsy0[3], -thick2);
+ glNormal3f (pointsx0[1], pointsy0[1], 0);
+ glVertex3f (pointsx0[1], pointsy0[1], -thick2);
+ glEnd();
+ polys++;
+
+
+ /* Now make a donut.
+ */
+ {
+ int nsteps = (wire ? 12 : 64);
+ GLfloat r0 = 0.04;
+ GLfloat r1 = 0.070;
+ GLfloat th, cth, sth;
+
+ glPushMatrix ();
+
+ th = ((339.0 + 343.0) / 2) * d2r;
+
+ glTranslatef (r1b * cos(th) * dc->gasket_size,
+ r1b * sin(th) * dc->gasket_size,
+ 0);
+
+ npoints = 0;
+ for (i = 0; i < nsteps; i++)
+ {
+ th = 2 * M_PI * i / nsteps;
+ cth = cos (th) * dc->gasket_size;
+ sth = sin (th) * dc->gasket_size;
+ pointsx0[npoints] = r0 * cth;
+ pointsy0[npoints] = r0 * sth;
+ pointsx1[npoints] = r1 * cth;
+ pointsy1[npoints] = r1 * sth;
+ npoints++;
+ polys++;
+ }
+
+ pointsx0[npoints] = pointsx0[0];
+ pointsy0[npoints] = pointsy0[0];
+ pointsx1[npoints] = pointsx1[0];
+ pointsy1[npoints] = pointsy1[0];
+ npoints++;
+
+ if (wire)
+ {
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < npoints; i++)
+ glVertex3f (pointsx0[i], pointsy0[i], -thick2);
+ polys += npoints;
+ glEnd();
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < npoints; i++)
+ glVertex3f (pointsx0[i], pointsy0[i], thick2);
+ polys += npoints;
+ glEnd();
+# if 0
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < npoints; i++)
+ glVertex3f (pointsx1[i], pointsy1[i], -thick2);
+ polys += npoints;
+ glEnd();
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < npoints; i++)
+ glVertex3f (pointsx1[i], pointsy1[i], thick2);
+ polys += npoints;
+ glEnd();
+# endif
+ }
+ else
+ {
+ /* top */
+ glFrontFace(GL_CW);
+ glNormal3f(0, 0, -1);
+ glBegin (GL_QUAD_STRIP);
+ for (i = 0; i < npoints; i++)
+ {
+ glVertex3f (pointsx0[i], pointsy0[i], -thick2);
+ glVertex3f (pointsx1[i], pointsy1[i], -thick2);
+ }
+ polys += npoints;
+ glEnd();
+
+ /* bottom */
+ glFrontFace(GL_CCW);
+ glNormal3f(0, 0, 1);
+ glBegin (GL_QUAD_STRIP);
+ for (i = 0; i < npoints; i++)
+ {
+ glVertex3f (pointsx0[i], pointsy0[i], thick2);
+ glVertex3f (pointsx1[i], pointsy1[i], thick2);
+ }
+ polys += npoints;
+ glEnd();
+ }
+
+ /* inside edge */
+ glFrontFace(GL_CW);
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < npoints; i++)
+ {
+ glNormal3f (-pointsx0[i], -pointsy0[i], 0);
+ glVertex3f ( pointsx0[i], pointsy0[i], thick2);
+ glVertex3f ( pointsx0[i], pointsy0[i], -thick2);
+ }
+ polys += npoints;
+ glEnd();
+
+ glPopMatrix();
+ }
+ }
+
+
+ /* Attach the bottom-right dingus...
+ */
+ {
+ GLfloat w = 0.05;
+ GLfloat h = 0.19;
+ GLfloat th;
+
+ glRotatef (49.5, 0, 0, 1);
+ glScalef (dc->gasket_size, dc->gasket_size, 1);
+ glTranslatef (0, (r0+r1)/2, 0);
+
+ /* buried box */
+ if (! wire)
+ {
+ glFrontFace(GL_CCW);
+ glBegin (wire ? GL_LINE_STRIP : GL_QUADS);
+ glNormal3f (0, 0, -1);
+ glVertex3f (-w/2, -h/2, -thick2); glVertex3f (-w/2, h/2, -thick2);
+ glVertex3f ( w/2, h/2, -thick2); glVertex3f ( w/2, -h/2, -thick2);
+ glNormal3f (1, 0, 0);
+ glVertex3f ( w/2, -h/2, -thick2); glVertex3f ( w/2, h/2, -thick2);
+ glVertex3f ( w/2, h/2, thick2); glVertex3f ( w/2, -h/2, thick2);
+ glNormal3f (0, 0, 1);
+ glVertex3f ( w/2, -h/2, thick2); glVertex3f ( w/2, h/2, thick2);
+ glVertex3f (-w/2, h/2, thick2); glVertex3f (-w/2, -h/2, thick2);
+ glNormal3f (-1, 0, 0);
+ glVertex3f (-w/2, -h/2, thick2); glVertex3f (-w/2, h/2, thick2);
+ glVertex3f (-w/2, h/2, -thick2); glVertex3f (-w/2, -h/2, -thick2);
+ polys++;
+ glEnd();
+ }
+
+ npoints = 0;
+ for (th = (wire ? 0 : -0.1);
+ th <= M_PI + 0.1;
+ th += (M_PI / (wire ? 5 : 32)))
+ {
+ pointsx0[npoints] = w/2 * cos(th);
+ pointsy0[npoints] = w/2 * sin(th);
+ npoints++;
+ polys++;
+ }
+
+ /* front inside curve */
+ glNormal3f (0, 0, -1);
+ glFrontFace(GL_CW);
+ glBegin (wire ? GL_LINE_STRIP : GL_TRIANGLE_FAN);
+ if (! wire) glVertex3f (0, h/2, -thick2);
+ for (i = 0; i < npoints; i++)
+ glVertex3f (pointsx0[i], h/2 + pointsy0[i], -thick2);
+ polys += npoints;
+ glEnd();
+
+ /* front outside curve */
+ glFrontFace(GL_CCW);
+ glBegin (wire ? GL_LINE_STRIP : GL_TRIANGLE_FAN);
+ if (! wire) glVertex3f (0, -h/2, -thick2);
+ for (i = 0; i < npoints; i++)
+ glVertex3f (pointsx0[i], -h/2 - pointsy0[i], -thick2);
+ polys += npoints;
+ glEnd();
+
+ /* back inside curve */
+ glNormal3f (0, 0, 1);
+ glFrontFace(GL_CCW);
+ glBegin (wire ? GL_LINE_STRIP : GL_TRIANGLE_FAN);
+ if (! wire) glVertex3f (0, h/2, thick2);
+ for (i = 0; i < npoints; i++)
+ glVertex3f (pointsx0[i], h/2 + pointsy0[i], thick2);
+ polys += npoints;
+ glEnd();
+
+ /* back outside curve */
+ glFrontFace(GL_CW);
+ glBegin (wire ? GL_LINE_STRIP : GL_TRIANGLE_FAN);
+ if (! wire) glVertex3f (0, -h/2, thick2);
+ for (i = 0; i < npoints; i++)
+ glVertex3f (pointsx0[i], -h/2 - pointsy0[i], thick2);
+ polys += npoints;
+ glEnd();
+
+ /* inside curve */
+ glFrontFace(GL_CCW);
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < npoints; i++)
+ {
+ glNormal3f (pointsx0[i], pointsy0[i], 0);
+ glVertex3f (pointsx0[i], h/2 + pointsy0[i], thick2);
+ glVertex3f (pointsx0[i], h/2 + pointsy0[i], -thick2);
+ }
+ polys += npoints;
+ glEnd();
+
+ /* outside curve */
+ glFrontFace(GL_CW);
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < npoints; i++)
+ {
+ glNormal3f (pointsx0[i], -pointsy0[i], 0);
+ glVertex3f (pointsx0[i], -h/2 - pointsy0[i], thick2);
+ glVertex3f (pointsx0[i], -h/2 - pointsy0[i], -thick2);
+ }
+ polys += npoints;
+ glEnd();
+ }
+
+ free (pointsx0);
+ free (pointsy0);
+ free (pointsx1);
+ free (pointsy1);
+ free (normals);
+
+ glPopMatrix();
+ return polys;
+}
+
+static int
+make_frame (logo_configuration *dc, int wire)
+{
+ int polys = 0;
+ int i, j;
+ GLfloat x[20], y[20];
+ GLfloat corner_cut = 0.5;
+
+ glPushMatrix();
+ glRotatef (90, 0, 1, 0);
+ glScalef (4 * dc->frame_size,
+ 4 * dc->frame_size,
+ 4 * dc->frame_size);
+
+ x[0] = -dc->frame_thickness;
+ x[1] = -dc->frame_thickness * corner_cut;
+ x[2] = 0;
+ x[3] = 0.5 - dc->triangle_size;
+ x[4] = 0.5;
+ x[5] = 0.5 + dc->triangle_size;
+ x[6] = 1;
+ x[7] = 1 + dc->frame_thickness * corner_cut;
+ x[8] = 1 + dc->frame_thickness;
+
+ y[0] = -dc->frame_thickness;
+ y[1] = -dc->frame_thickness * corner_cut;
+ y[2] = 0;
+ y[3] = dc->triangle_size;
+
+ /* front and back
+ */
+ glTranslatef (-0.5, -0.5, dc->frame_depth / 4);
+ if (! wire)
+ for (j = 0; j <= 1; j++)
+ {
+ if (j) glTranslatef (0, 0, -dc->frame_depth / 2);
+ glFrontFace (j ? GL_CCW : GL_CW);
+ for (i = 0; i < 4; i++)
+ {
+ glNormal3f (0, 0, (j ? -1 : 1));
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ glVertex3f (x[0], y[1], 0); glVertex3f (x[0], y[2], 0);
+ glVertex3f (x[1], y[0], 0); glVertex3f (x[1], y[2], 0);
+ glVertex3f (x[3], y[0], 0); glVertex3f (x[3], y[2], 0);
+ glVertex3f (x[4], y[0], 0); glVertex3f (x[4], y[3], 0);
+ glVertex3f (x[5], y[0], 0); glVertex3f (x[5], y[2], 0);
+ glVertex3f (x[7], y[0], 0); glVertex3f (x[7], y[2], 0);
+ glVertex3f (x[8], y[1], 0); glVertex3f (x[8], y[2], 0);
+ polys += 6;
+ glEnd ();
+ glTranslatef (0.5, 0.5, 0);
+ glRotatef (90, 0, 0, 1);
+ glTranslatef (-0.5, -0.5, 0);
+ }
+ }
+
+ /* ledges
+ */
+ glFrontFace (GL_CCW);
+ for (i = 0; i < 4; i++)
+ {
+ glNormal3f (0, 1, 0);
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ glVertex3f (x[2], y[2], 0); glVertex3f (x[2], y[2], dc->frame_depth/2);
+ glVertex3f (x[3], y[2], 0); glVertex3f (x[3], y[2], dc->frame_depth/2);
+ glVertex3f (x[4], y[3], 0); glVertex3f (x[4], y[3], dc->frame_depth/2);
+ glVertex3f (x[5], y[2], 0); glVertex3f (x[5], y[2], dc->frame_depth/2);
+ glVertex3f (x[6], y[2], 0); glVertex3f (x[6], y[2], dc->frame_depth/2);
+ polys += 4;
+ glEnd ();
+
+ glNormal3f (0, -1, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (x[7], y[0], 0);
+ glVertex3f (x[7], y[0], dc->frame_depth/2);
+ glVertex3f (x[1], y[0], dc->frame_depth/2);
+ glVertex3f (x[1], y[0], 0);
+ polys++;
+ glEnd ();
+
+ glNormal3f (1, -1, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (x[8], y[1], 0);
+ glVertex3f (x[8], y[1], dc->frame_depth/2);
+ glVertex3f (x[7], y[0], dc->frame_depth/2);
+ glVertex3f (x[7], y[0], 0);
+ polys++;
+ glEnd ();
+
+ if (wire)
+ {
+ glNormal3f (0, 1, 0);
+ for (j = 0; j <= 1; j++)
+ {
+ glBegin (GL_LINE_STRIP);
+ glVertex3f (x[2], y[2], j*dc->frame_depth/2);
+ glVertex3f (x[3], y[2], j*dc->frame_depth/2);
+ glVertex3f (x[4], y[3], j*dc->frame_depth/2);
+ glVertex3f (x[5], y[2], j*dc->frame_depth/2);
+ glVertex3f (x[6], y[2], j*dc->frame_depth/2);
+ polys += 4;
+ glEnd ();
+ }
+ }
+
+ glTranslatef (0.5, 0.5, 0);
+ glRotatef (90, 0, 0, 1);
+ glTranslatef (-0.5, -0.5, 0);
+ }
+
+ glPopMatrix();
+ return polys;
+}
+
+
+/* Make some pizza.
+ */
+
+#ifdef HAVE_TESS
+
+typedef struct {
+ GLdouble *points;
+ int i;
+} tess_out;
+
+
+static void
+tess_error_cb (GLenum errorCode)
+{
+ fprintf (stderr, "%s: tesselation error: %s\n",
+ progname, gluErrorString(errorCode));
+ exit (0);
+}
+
+static void
+tess_combine_cb (GLdouble coords[3], GLdouble *d[4], GLfloat w[4],
+ GLdouble **data_out)
+{
+ GLdouble *new = (GLdouble *) malloc (3 * sizeof(*new));
+ new[0] = coords[0];
+ new[1] = coords[1];
+ new[2] = coords[2];
+ *data_out = new;
+}
+
+
+#if 0
+static void
+tess_vertex_cb (void *vertex_data, void *closure)
+{
+ tess_out *to = (tess_out *) closure;
+ GLdouble *v = (GLdouble *) vertex_data;
+ to->points[to->i++] = v[0];
+ to->points[to->i++] = v[1];
+ to->points[to->i++] = v[2];
+}
+#endif
+
+static void
+tess_begin_cb (GLenum which)
+{
+ glBegin(which);
+}
+
+static void
+tess_end_cb (void)
+{
+ glEnd();
+}
+
+#endif /* HAVE_TESS */
+
+
+static int
+make_pizza (logo_configuration *dc, int facetted, int wire)
+{
+ int polys = 0;
+ int topfaces = (facetted ? 48 : 120);
+ int discfaces = (facetted ? 12 : 120);
+ int npoints = topfaces * 2 + 100;
+ GLdouble *points = (GLdouble *) calloc (npoints * 3, sizeof(GLdouble));
+ int nholes = 3;
+ GLdouble *holes = (GLdouble *) calloc (topfaces*nholes*3, sizeof(GLdouble));
+
+ GLfloat step = M_PI * 2 / 6 / topfaces;
+ GLfloat thick2 = (dc->gasket_thickness / dc->gasket_size) / 4;
+ GLfloat th, x, y, s;
+ int i, j, k;
+ int endpoints;
+
+# ifdef HAVE_TESS
+ tess_out TO, *to = &TO;
+ GLUtesselator *tess = gluNewTess();
+
+ to->points = (GLdouble *) calloc (topfaces * 20, sizeof(GLdouble));
+ to->i = 0;
+
+# ifndef _GLUfuncptr
+# define _GLUfuncptr void(*)(void)
+# endif
+
+ gluTessCallback(tess,GLU_TESS_BEGIN, (_GLUfuncptr)tess_begin_cb);
+ gluTessCallback(tess,GLU_TESS_VERTEX, (_GLUfuncptr)glVertex3dv);
+ gluTessCallback(tess,GLU_TESS_END, (_GLUfuncptr)tess_end_cb);
+ gluTessCallback(tess,GLU_TESS_COMBINE, (_GLUfuncptr)tess_combine_cb);
+ gluTessCallback(tess,GLU_TESS_ERROR, (_GLUfuncptr)tess_error_cb);
+
+ gluTessProperty (tess, GLU_TESS_BOUNDARY_ONLY, wire);
+ gluTessProperty (tess,GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ODD);
+
+# endif /* HAVE_TESS */
+
+ glPushMatrix();
+
+ s = 1.9;
+ glRotatef (180, 0, 0, 1);
+ glScalef (s, s, s);
+ glRotatef (90, 0, 1, 0);
+ glTranslatef (-0.53, 0, 0);
+ glRotatef (-30, 0, 0, 1);
+
+ /* Compute the wedge */
+ th = 0;
+ j = 0;
+
+ /* Edge 1 */
+ {
+ GLfloat edge[] = {
+ 0.000, 0.000,
+ 0.000, 0.210,
+ 0.042, 0.230,
+ 0.042, 0.616,
+ 0.000, 0.641,
+ };
+ for (i = 0; i < countof(edge)/2; i++)
+ {
+ points[j++] = edge[i*2+1];
+ points[j++] = edge[i*2];
+ points[j++] = 0;
+ }
+ }
+
+ s = 0.798; /* radius of end of slice, before crust gap */
+ for (i = 0; i < topfaces; i++)
+ {
+ points[j++] = cos(th) * s;
+ points[j++] = sin(th) * s;
+ points[j++] = 0;
+ th += step;
+ }
+
+ /* Edge 2 */
+ {
+ GLfloat edge[] = {
+ 0.613, 0.353,
+ 0.572, 0.376,
+ 0.455, 0.309,
+ 0.452, 0.260,
+ 0.332, 0.192,
+ 0.293, 0.216,
+ 0.178, 0.149,
+ 0.178, 0.102,
+ };
+ for (i = 0; i < countof(edge)/2; i++)
+ {
+ points[j++] = edge[i*2+1];
+ points[j++] = edge[i*2];
+ points[j++] = 0;
+ }
+ endpoints = j/3;
+ }
+
+
+ /* Draw the rim of the slice */
+ glBegin (wire ? GL_LINES : GL_QUADS);
+ x = points[0];
+ y = points[1];
+ for (i = (wire ? 0 : 1); i < endpoints; i++)
+ {
+ GLdouble *p = points + (i*3);
+
+ do_normal (p[0], p[1], -thick2,
+ p[0], p[1], thick2,
+ x, y, thick2);
+ if (!wire)
+ {
+ glVertex3f (x, y, -thick2);
+ glVertex3f (x, y, thick2);
+ }
+ glVertex3f (p[0], p[1], thick2);
+ glVertex3f (p[0], p[1], -thick2);
+ x = p[0];
+ y = p[1];
+ polys++;
+ }
+
+ do_normal (points[0], points[1], -thick2,
+ points[0], points[1], thick2,
+ x, y, thick2);
+ glVertex3f (x, y, -thick2);
+ glVertex3f (x, y, thick2);
+ glVertex3f (points[0], points[1], thick2);
+ glVertex3f (points[0], points[1], -thick2);
+ polys++;
+ glEnd();
+
+# ifndef HAVE_TESS
+ if (wire)
+ {
+ /* Outline of slice */
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < endpoints; i++)
+ glVertex3f (points[i*3], points[i*3+1], -thick2);
+ glEnd();
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < endpoints; i++)
+ glVertex3f (points[i*3], points[i*3+1], thick2);
+ glEnd();
+ }
+# endif /* HAVE_TESS */
+
+ /* Compute the holes */
+ step = M_PI * 2 / discfaces;
+ for (k = 0; k < nholes; k++)
+ {
+ GLdouble *p = holes + (discfaces * 3 * k);
+ th = 0;
+ j = 0;
+ switch (k) {
+ case 0: x = 0.34; y = 0.17; s = 0.05; break;
+ case 1: x = 0.54; y = 0.17; s = 0.06; break;
+ case 2: x = 0.55; y = 0.36; s = 0.06; break;
+ default: abort(); break;
+ }
+ for (i = 0; i < discfaces; i++)
+ {
+ p[j++] = x + cos(M_PI*2 - th) * s;
+ p[j++] = y + sin(M_PI*2 - th) * s;
+ p[j++] = 0;
+ th += step;
+ }
+ }
+
+
+ /* Draw the inside rim of the holes */
+ for (k = 0; k < nholes; k++)
+ {
+ GLdouble *p = holes + (discfaces * 3 * k);
+
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < discfaces; i++)
+ {
+ GLdouble *p2 = p + (i*3);
+ if (i > 0)
+ do_normal (p2[0], p2[1], -thick2,
+ p2[0], p2[1], thick2,
+ p2[-3], p2[-2], thick2);
+ glVertex3f (p2[0], p2[1], -thick2);
+ glVertex3f (p2[0], p2[1], thick2);
+ polys++;
+ }
+ glVertex3f (p[0], p[1], -thick2);
+ glVertex3f (p[0], p[1], thick2);
+ polys++;
+ glEnd();
+# ifndef HAVE_TESS
+ if (wire)
+ {
+ /* Outline of holes */
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < discfaces; i++)
+ glVertex3f (p[i*3], p[i*3+1], -thick2);
+ glEnd();
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < discfaces; i++)
+ glVertex3f (p[i*3], p[i*3+1], thick2);
+ glEnd();
+ }
+# endif /* !HAVE_TESS */
+ }
+
+# ifdef HAVE_TESS
+ glTranslatef (0, 0, -thick2);
+ for (y = 0; y <= 1; y++)
+ {
+ if (y) glTranslatef (0, 0, thick2*2);
+
+ /* A non-convex polygon */
+ gluTessBeginPolygon (tess, to);
+
+ glNormal3f (0, 0, (y > 0 ? 1 : -1));
+ gluTessNormal (tess, 0, 0, (y > 0 ? 1 : -1));
+ glFrontFace (GL_CCW);
+
+ /* Tess the wedge */
+ gluTessBeginContour (tess);
+ for (i = 0; i < endpoints; i++)
+ {
+ GLdouble *p = points + (i*3);
+ gluTessVertex (tess, p, p);
+ polys++;
+ }
+ gluTessVertex (tess, points, points);
+ gluTessEndContour (tess);
+
+ /* Tess the holes */
+ for (k = 0; k < nholes; k++)
+ {
+ GLdouble *p = holes + (discfaces * 3 * k);
+ gluTessBeginContour (tess);
+ for (i = 0; i < discfaces; i++)
+ {
+ GLdouble *p2 = p + (i*3);
+ gluTessVertex (tess, p2, p2);
+ polys++;
+ }
+ gluTessEndContour (tess);
+ }
+
+ gluTessEndPolygon (tess);
+ }
+
+ glTranslatef (0, 0, -thick2);
+
+# else /* !HAVE_TESS */
+ if (! wire)
+ {
+ glTranslatef(0, 0, thick2);
+ glNormal3f (0, 0, 1);
+ glFrontFace (GL_CW);
+
+ /* Sadly, jwzgl's glVertexPointer seems not to be recordable inside
+ display lists. */
+# if 0
+ glDisableClientState (GL_COLOR_ARRAY);
+ glDisableClientState (GL_NORMAL_ARRAY);
+ glDisableClientState (GL_TEXTURE_COORD_ARRAY);
+ glEnableClientState (GL_VERTEX_ARRAY);
+ glVertexPointer (3, GL_FLOAT, 0, dnapizza_triangles);
+ glDrawArrays (GL_TRIANGLES, 0, countof (dnapizza_triangles) / 3);
+# else
+ glBegin (GL_TRIANGLES);
+ for (i = 0; i < countof (dnapizza_triangles); i += 3)
+ glVertex3fv (dnapizza_triangles + i);
+ glEnd();
+# endif
+
+ glTranslatef(0, 0, -thick2*2);
+ glNormal3f (0, 0, -1);
+ glFrontFace (GL_CCW);
+
+# if 0
+ glDrawArrays (GL_TRIANGLES, 0, countof (dnapizza_triangles) / 3);
+# else
+ int i;
+ glBegin (GL_TRIANGLES);
+ for (i = 0; i < countof (dnapizza_triangles); i += 3)
+ glVertex3fv (dnapizza_triangles + i);
+ glEnd();
+# endif
+
+ glTranslatef(0, 0, thick2);
+ }
+# endif /* !HAVE_TESS */
+
+
+ /* Compute the crust */
+
+ s = 0.861; /* radius of inside of crust */
+ step = M_PI * 2 / 6 / topfaces;
+ th = 0;
+ j = 0;
+ for (i = 0; i < topfaces; i++)
+ {
+ points[j++] = cos(th) * s;
+ points[j++] = sin(th) * s;
+ points[j++] = 0;
+ th += step;
+ }
+
+ s = 1;
+ for (i = 0; i < topfaces; i++)
+ {
+ points[j++] = cos(th) * s;
+ points[j++] = sin(th) * s;
+ points[j++] = 0;
+ th -= step;
+ }
+
+ /* Draw the rim of the crust */
+ glFrontFace (GL_CCW);
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < topfaces * 2; i++)
+ {
+ GLdouble *p = points + (i*3);
+ if (i == 0 || i == (topfaces*2)-1)
+ glNormal3f (0, -1, 0);
+ else if (i == topfaces-1 || i == topfaces)
+ glNormal3f (0, 1, 0);
+ else
+ do_normal (p[-3], p[-2], thick2,
+ p[0], p[1], thick2,
+ p[0], p[1], -thick2);
+ glVertex3f (p[0], p[1], -thick2);
+ glVertex3f (p[0], p[1], thick2);
+ polys++;
+ }
+ glVertex3f (points[0], points[1], -thick2);
+ glVertex3f (points[0], points[1], thick2);
+ polys++;
+ glEnd();
+
+ if (wire)
+ {
+ glBegin (GL_LINE_STRIP);
+ for (i = 0; i < topfaces * 2; i++)
+ {
+ GLdouble *p = points + (i*3);
+ glVertex3f (p[0], p[1], -thick2);
+ polys++;
+ }
+ glVertex3f (points[0], points[1], -thick2);
+ glEnd();
+
+ glBegin (GL_LINE_STRIP);
+ for (i = 0; i < topfaces * 2; i++)
+ {
+ GLdouble *p = points + (i*3);
+ glVertex3f (p[0], p[1], thick2);
+ polys++;
+ }
+ glVertex3f (points[0], points[1], thick2);
+ glEnd();
+ }
+
+ /* Draw the top of the crust */
+ if (! wire)
+ {
+ glFrontFace (GL_CW);
+ glBegin (wire ? GL_LINE_STRIP : GL_QUAD_STRIP);
+ glNormal3f (0, 0, -1);
+ if (!wire)
+ for (i = 0; i < topfaces; i++)
+ {
+ int ii = topfaces + (topfaces - i - 1);
+ GLdouble *p1 = points + (i*3);
+ GLdouble *p2 = points + (ii*3);
+ glVertex3f (p1[0], p1[1], -thick2);
+ glVertex3f (p2[0], p2[1], -thick2);
+ polys++;
+ }
+ polys++;
+ glEnd();
+
+ /* Draw the bottom of the crust */
+ glFrontFace (GL_CCW);
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ glNormal3f (0, 0, 1);
+ for (i = 0; i < topfaces; i++)
+ {
+ int ii = topfaces + (topfaces - i - 1);
+ GLdouble *p1 = points + (i*3);
+ GLdouble *p2 = points + (ii*3);
+ glVertex3f (p1[0], p1[1], thick2);
+ glVertex3f (p2[0], p2[1], thick2);
+ polys++;
+ }
+ polys++;
+ glEnd();
+ }
+
+# ifdef HAVE_TESS
+ gluDeleteTess (tess);
+ free (to->points);
+# endif /* HAVE_TESS */
+
+ free (points);
+ free (holes);
+
+ glPopMatrix();
+
+ return polys;
+}
+
+
+# ifdef CW
+
+/* Upcase string, convert Unicrud to ASCII, remove any non-letters.
+ */
+static char *
+codeword_simplify_text (const char *s0)
+{
+ char *s1 = utf8_to_latin1 ((s0 ? s0 : ""), True);
+ int L = strlen(s1);
+ char *s2 = (char *) malloc (L + 10);
+ char *s3 = s2;
+ int i;
+ for (i = 0; i < L; i++)
+ {
+ char c = s1[i];
+ if (c >= 'a' && c <= 'z')
+ c -= 'a'-'A';
+ if (c >= 'A' && c <= 'Z')
+ *s3++ = c;
+ }
+ *s3 = 0;
+ if (! *s2)
+ strcpy (s2, "CODEWORD");
+ return s2;
+}
+
+
+static void
+make_codeword_path (ModeInfo *mi)
+{
+ logo_configuration *dc = &dcs[MI_SCREEN(mi)];
+ int letters = strlen (dc->codeword_text);
+
+ GLfloat rtick = dc->codeword_spread;
+ GLfloat iradius = rtick * dc->codeword_cap_size;
+
+ int dial = 0;
+ int letter;
+ GLfloat last_r = 0;
+
+ GLfloat inner_circum = M_PI * 2 * (iradius + rtick * 2);
+ GLfloat outer_circum = M_PI * 2 * (iradius + rtick * (letters + 1));
+ GLfloat facet_length = inner_circum / (26 * dc->codeword_facets);
+ int outer_facets = ceil (outer_circum / facet_length);
+
+ int *histo = (int *) calloc (letters * 26, sizeof(*histo));
+ XYZ *points = (XYZ *) calloc (letters * outer_facets, sizeof (*points));
+ int npoints = 0;
+
+ for (letter = -1; letter < letters; letter++)
+ {
+ if (letter == -1) /* Inner starting point */
+ {
+ points[npoints].x = iradius;
+ points[npoints].y = 0;
+ last_r = iradius;
+ npoints++;
+ }
+ else /* Add arc for this letter */
+ {
+ int direction = (letter & 1 ? -1 : 1);
+ int v = (dc->codeword_text[letter] - 'A' + 1);
+ int dial1 = dial + v * direction;
+
+ GLfloat th;
+ GLfloat th0 = M_PI * 2 / 26 * dial;
+ GLfloat th1 = M_PI * 2 / 26 * dial1;
+ GLfloat r = iradius + rtick * (letter + 2);
+ GLfloat circum = M_PI * 2 * r;
+ GLfloat arc_length = circum * v / 26;
+ int arc_facets = ceil (fabs (arc_length / facet_length));
+ GLfloat facet_th = (th1 - th0) / arc_facets;
+
+ if (arc_facets > outer_facets) abort();
+
+ /* Let's put some intermediate facets on the crossbars too,
+ so that the animation doesn't speed up on those. */
+ {
+ GLfloat rr;
+ for (rr = last_r + facet_length;
+ rr <= r - facet_length;
+ rr += facet_length)
+ {
+ points[npoints].x = rr * cos (th0);
+ points[npoints].y = rr * sin (th0);
+ npoints++;
+ }
+ last_r = r;
+ }
+
+
+ for (th = th0;
+ (th0 < th1
+ ? th <= th1 + facet_th
+ : th >= th1 + facet_th);
+ th += facet_th)
+ {
+ GLfloat th2 = th;
+ if (th0 < th1 && th > th1)
+ th2 = th1;
+ if (th0 > th1 && th < th1)
+ th2 = th1;
+ points[npoints].x = r * cos (th2);
+ points[npoints].y = r * sin (th2);
+
+ /* Ugh, add point only if it differs from prev.
+ Not sure how this happens. */
+ if (npoints == 0 ||
+ points[npoints-1].x != points[npoints].x ||
+ points[npoints-1].y != points[npoints].y)
+ npoints++;
+ }
+
+ /* Mark up the histo array to find the outer border. */
+ {
+ int i;
+ for (i = dial;
+ (direction > 0
+ ? i <= dial1
+ : i >= dial1);
+ i += direction)
+ {
+ int x = (i + 26) % 26;
+ int y;
+ for (y = 0; y <= letter; y++)
+ histo[y * 26 + x]++;
+ }
+ }
+
+ dc->codeword_text_points[letter] = npoints;
+
+ dial = dial1;
+ }
+ }
+
+ if (npoints >= letters * outer_facets) abort();
+
+# if 0
+ { /* Print histo */
+ int x, y;
+ for (y = 0; y < letters; y++)
+ {
+ fprintf (stderr, "%2d: ", y);
+ for (x = 0; x < 26; x++)
+ fprintf (stderr, "%x", histo[y * 26 + x]);
+ fprintf (stderr, "\n");
+ }
+ fprintf (stderr, "\n");
+ }
+# endif
+
+
+ /* Find a gap in the outer edge, to draw guide dots. */
+ {
+ int x, y;
+ int last_row = letters;
+ int start_dial = -1, end_dial = -1;
+
+ for (y = letters-1; y >= 0; y--)
+ {
+ for (x = 0; x < 26; x++)
+ {
+ if (histo[y * 26 + x] == 0)
+ {
+ if (last_row != y)
+ start_dial = end_dial = -1;
+ last_row = y;
+ if (start_dial == -1)
+ start_dial = x;
+ end_dial = x;
+ }
+ }
+ }
+
+ if (last_row < letters-1 && start_dial >= 0)
+ {
+ GLfloat r = iradius + rtick * (last_row + 2);
+ int i;
+
+ dc->codeword_nguides = 0;
+ dc->codeword_guides = (XYZ *)
+ calloc (end_dial - start_dial + 1, sizeof (*dc->codeword_guides));
+ for (i = start_dial; i <= end_dial; i++)
+ {
+ GLfloat th = i * M_PI * 2 / 26;
+ GLfloat x = r * cos (th);
+ GLfloat y = r * sin (th);
+ dc->codeword_guides[dc->codeword_nguides].x = x;
+ dc->codeword_guides[dc->codeword_nguides].y = y;
+ dc->codeword_nguides++;
+ }
+ }
+ free (histo);
+ histo = 0;
+ }
+
+ dc->codeword_path_npoints = npoints;
+ dc->codeword_path = points;
+}
+
+
+static int
+draw_codeword_cap (ModeInfo *mi)
+{
+ logo_configuration *dc = &dcs[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int polys = 0;
+
+ int segments = dc->codeword_disc_facets;
+ GLfloat size = dc->codeword_spread * dc->codeword_cap_size;
+ GLfloat width = dc->codeword_line_width / 2;
+ GLfloat thick = dc->codeword_thickness / 2;
+ GLfloat r1 = size + width/2;
+ GLfloat r2 = size - width/2;
+ GLfloat facet, th, z;
+
+ if (wire) segments = 12;
+ facet = M_PI * 2 / segments;
+
+ glPushMatrix();
+
+ /* Top and bottom */
+
+ for (z = -thick; z <= thick; z += thick*2)
+ {
+ glNormal3f (0, 0, (z < 0 ? -1 : 1));
+ glFrontFace (z < 0 ? GL_CCW : GL_CW);
+
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (th = 0; th <= M_PI*2; th += facet)
+ {
+ GLfloat x = cos (th);
+ GLfloat y = sin (th);
+ glVertex3f (r1 * x, r1 * y, z);
+ glVertex3f (r2 * x, r2 * y, z);
+ }
+ glEnd();
+
+ if (wire)
+ {
+ glBegin (GL_LINE_LOOP);
+ for (th = 0; th <= M_PI*2; th += facet)
+ {
+ GLfloat x = cos (th);
+ GLfloat y = sin (th);
+ glVertex3f (r1 * x, r1 * y, z);
+ }
+ glEnd();
+ glBegin (GL_LINE_LOOP);
+ for (th = 0; th <= M_PI*2; th += facet)
+ {
+ GLfloat x = cos (th);
+ GLfloat y = sin (th);
+ glVertex3f (r2 * x, r2 * y, z);
+ }
+ glEnd();
+ }
+ }
+
+ /* Inside and outside */
+
+ for (z = -1; z <= 1; z += 2)
+ {
+ glFrontFace (z < 0 ? GL_CCW : GL_CW);
+
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (th = 0; th <= M_PI*2; th += facet)
+ {
+ GLfloat th1 = th + facet;
+ GLfloat x0 = cos (th);
+ GLfloat y0 = sin (th);
+ GLfloat x1 = cos (th1);
+ GLfloat y1 = sin (th1);
+ GLfloat r = z < 0 ? r1 : r2;
+
+ if (z < 0)
+ do_normal (r * x0, r * y0, thick,
+ r * x0, r * y0, -thick,
+ r * x1, r * y1, -thick);
+ else
+ do_normal (r * x1, r * y1, thick,
+ r * x1, r * y1, -thick,
+ r * x0, r * y0, -thick);
+
+ glVertex3f (r * x0, r * y0, thick);
+ glVertex3f (r * x0, r * y0, -thick);
+ }
+ glEnd();
+ }
+
+ glPopMatrix();
+
+ return polys;
+}
+
+
+static int
+draw_codeword_guides (ModeInfo *mi, GLfloat anim_ratio)
+{
+ logo_configuration *dc = &dcs[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int polys = 0;
+
+ int segments = dc->codeword_disc_facets;
+ GLfloat s = dc->codeword_line_width / 2;
+ GLfloat each = 1.0 / dc->codeword_nguides;
+ int i;
+
+ if (wire) segments = 6;
+
+ for (i = 0; i < dc->codeword_nguides; i++)
+ {
+ GLfloat ratio;
+ if (anim_ratio < i*each) ratio = 0;
+ else if (anim_ratio >= (i+1)*each) ratio = 1;
+ else ratio = (anim_ratio - i*each) / each;
+
+ if (ratio <= 0) continue;
+ if (ratio == 0) ratio = 0.001;
+
+ glPushMatrix();
+ glTranslatef (dc->codeword_guides[i].x,
+ dc->codeword_guides[i].y,
+ dc->codeword_guides[i].z);
+
+ glScalef (ratio, ratio, ratio);
+
+ /* If the line width and thickness are pretty close to each other,
+ use spheres. Otherwise use tubes.
+ */
+ if (dc->codeword_thickness < dc->codeword_line_width * 1.3 &&
+ dc->codeword_thickness > dc->codeword_line_width / 1.3)
+ {
+ glScalef (s, s, s);
+ glFrontFace (GL_CCW);
+ polys += unit_sphere (segments, segments, wire);
+ }
+ else
+ {
+ polys += tube (0, 0, -dc->codeword_thickness / 2,
+ 0, 0, dc->codeword_thickness / 2,
+ s, 0, segments, True, True, wire);
+ }
+
+ glPopMatrix();
+ }
+
+ return polys;
+}
+
+
+/* Compute the characters at which the cursor is currently pointing,
+ and render it on the logo.
+ */
+static void
+codeword_text_output (ModeInfo *mi, GLfloat anim_ratio)
+{
+ logo_configuration *dc = &dcs[MI_SCREEN(mi)];
+ int i;
+ int L = strlen (dc->codeword_text);
+ int point = dc->codeword_path_npoints * anim_ratio;
+ Bool hit = False;
+
+ if (dc->anim_state == CODEWORD_BLANK)
+ point = 0;
+
+ for (i = 0; i < L; i++)
+ {
+ if (point >= dc->codeword_text_points[i])
+ dc->codeword_text_out[i] = dc->codeword_text[i];
+ else if (hit)
+ dc->codeword_text_out[i] = 0;
+ else
+ {
+ int steps = dc->codeword_text[i] - 'A' + 1;
+ int last = (i > 0 ? dc->codeword_text_points[i-1] : 0);
+ double ratio = ((point - last) /
+ (double) (dc->codeword_text_points[i] - last));
+ char chr = 'A' + (ratio * steps);
+ if (ratio < 0.1) chr = 0;
+ dc->codeword_text_out[i] = chr;
+ hit = True;
+ }
+ }
+ dc->codeword_text_out[i] = 0;
+
+ if (*dc->codeword_text_out &&
+ !strcmp (dc->codeword_text, "CODEWORD"))
+ {
+ int i;
+ int L2 = strlen (dc->codeword_text_out);
+ GLfloat ss = 0.01;
+ int ascent, descent;
+
+ glPushMatrix();
+ glColor4fv (dc->codeword_color);
+ glRotatef (90, 0, 1, 0);
+ glRotatef (-90, 0, 0, 1);
+
+ for (i = 0; i < L2; i++)
+ {
+ XCharStruct e;
+ char buf[2];
+ glPushMatrix();
+ glRotatef ((i + 0.5) * 360 / 26.0, 0, 0, 1);
+
+# if 0
+ {
+ GLfloat th;
+ glDisable(GL_LIGHTING);
+ glBegin(GL_LINES);
+ glVertex3f(0,0,0);
+ glVertex3f(0,-4,0);
+ glEnd();
+ glBegin(GL_LINE_STRIP);
+ for (th = M_PI * 1.45; th < M_PI * 1.55; th += 0.1)
+ {
+ GLfloat r = 3.85;
+ glVertex3f (r * cos(th), r * sin(th), 0);
+ }
+ glEnd();
+ if (!MI_IS_WIREFRAME(mi)) glEnable(GL_LIGHTING);
+ }
+# endif
+
+ glTranslatef (0, -dc->codeword_spread * (L - 1), 0);
+ glScalef (ss, ss, ss);
+ buf[0] = dc->codeword_text_out[i] + ('a' - 'A');
+ buf[1] = 0;
+ texture_string_metrics (dc->font, buf, &e, &ascent, &descent);
+
+# ifdef HAVE_MOBILE
+ /* #### Magic magic magic WTF... */
+ glScalef (0.5, 0.5, 0.5);
+# endif
+
+ glTranslatef (-e.width * 1.0,
+ -(ascent + descent + e.descent * 2.4), /* #### WTF */
+ 0);
+
+ glScalef (2, 2, 2);
+
+# if 0
+ glDisable(GL_LIGHTING);
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(0, 0, 0);
+ glVertex3f(e.width, 0, 0);
+ glVertex3f(e.width, e.ascent + e.descent, 0);
+ glVertex3f(0, e.ascent + e.descent, 0);
+ glEnd();
+ if (!MI_IS_WIREFRAME(mi)) glEnable(GL_LIGHTING);
+# endif
+
+ glDisable(GL_CULL_FACE); /* tell texfont.c to draw both sides */
+ print_texture_string (dc->font, buf);
+ glEnable(GL_CULL_FACE);
+
+ glPopMatrix();
+ }
+ glPopMatrix();
+ }
+}
+
+
+/* Convert the precomputed path to a thick line of polygons.
+ We could actually precompute all of these polygons too,
+ but it's fast enough.
+ */
+static int
+draw_codeword_path (ModeInfo *mi)
+{
+ logo_configuration *dc = &dcs[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int polys = 0;
+
+ GLfloat anim_ratio = (dc->anim_state == CODEWORD_IN ? dc->anim_ratio :
+ dc->anim_state == CODEWORD_OUT ? 1 - dc->anim_ratio :
+ dc->anim_state == CODEWORD_BLANK ? 0 :
+ 1);
+ int last_anim_point = 0;
+
+ GLfloat width = dc->codeword_line_width / 2;
+ GLfloat thick = dc->codeword_thickness / 2;
+ int i, k;
+ GLfloat j;
+
+ int quad_size = (dc->codeword_path_npoints + 1) * 2;
+ XYZ *quads = (XYZ *) calloc (quad_size, sizeof(*quads));
+ XYZ *norms = (XYZ *) calloc (quad_size, sizeof(*norms));
+ int nquads = 0;
+
+ for (i = 0; i < dc->codeword_path_npoints; i++)
+ {
+ XYZ p1 = dc->codeword_path[i];
+ XYZ p2 = (i < dc->codeword_path_npoints-1
+ ? dc->codeword_path[i+1]
+ : dc->codeword_path[i-1]);
+ XYZ p1a, p1b;
+
+ XYZ n; /* normal of the first line segment */
+ n.x = -(p2.y - p1.y);
+ n.y = (p2.x - p1.x);
+ n.z = 0;
+ normalize (&n);
+
+ if (i == 0)
+ {
+ p1a.x = p1.x - width / 2 * n.x;
+ p1a.y = p1.y - width / 2 * n.y;
+ p1a.z = 0;
+
+ p1b.x = p1.x + width / 2 * n.x;
+ p1b.y = p1.y + width / 2 * n.y;
+ p1b.z = 0;
+ }
+ else if (i == dc->codeword_path_npoints - 1)
+ {
+ p1b.x = p1.x - width / 2 * n.x;
+ p1b.y = p1.y - width / 2 * n.y;
+ p1b.z = 0;
+
+ p1a.x = p1.x + width / 2 * n.x;
+ p1a.y = p1.y + width / 2 * n.y;
+ p1a.z = 0;
+ }
+ else
+ {
+ XYZ p0 = dc->codeword_path[i-1];
+
+ XYZ t, t0, t1; /* tangent of corner between two line segments */
+ XYZ m; /* miter line: normal of tangent */
+ GLfloat d; /* length of miter */
+
+ t0.x = p2.x - p1.x;
+ t0.y = p2.y - p1.y;
+ t0.z = p2.z - p1.z;
+ normalize (&t0);
+
+ t1.x = p1.x - p0.x;
+ t1.y = p1.y - p0.y;
+ t1.z = p1.z - p0.z;
+ normalize (&t1);
+
+ t.x = t0.x + t1.x;
+ t.y = t0.y + t1.y;
+ t.z = t0.z + t1.z;
+ normalize (&t);
+
+ m.x = -t.y;
+ m.y = t.x;
+ m.z = 0;
+
+ /* find length of miter by projecting it on one of the normals */
+ d = width / 2 / dot (m, n);
+
+ p1a.x = p1.x - d * m.x;
+ p1a.y = p1.y - d * m.y;
+ p1a.z = 0;
+
+ p1b.x = p1.x + d * m.x;
+ p1b.y = p1.y + d * m.y;
+ p1b.z = 0;
+ }
+
+ quads[nquads++] = p1a;
+ quads[nquads++] = p1b;
+
+ if (nquads >= quad_size) abort();
+
+ if (i / (double) dc->codeword_path_npoints > anim_ratio)
+ break;
+
+ last_anim_point = i;
+ }
+
+
+ /* Compute normals for each point along the interior edge */
+ for (k = 0; k <= 1; k++)
+ {
+ for (i = k; i < nquads-2; i += 2)
+ {
+ XYZ p1a = quads[i];
+ XYZ p2a = quads[i+2];
+ XYZ p1b = p1a;
+ XYZ p2b = p2a;
+ p1a.z = thick; /* a: top */
+ p1b.z = -thick; /* b: bottom */
+ p2a.z = thick;
+ p2b.z = -thick;
+
+ norms[i] = (k == 0
+ ? calc_normal (p1a, p1b, p2b)
+ : calc_normal (p2a, p2b, p1a));
+ }
+ }
+
+ glPushMatrix();
+ glColor4fv (dc->codeword_color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, dc->codeword_color);
+
+# ifdef HAVE_MOBILE /* Make the whole thing fit on the phone screen */
+ {
+ GLfloat size = MI_WIDTH(mi) < MI_HEIGHT(mi) ? MI_WIDTH(mi) : MI_HEIGHT(mi);
+ glScalef (0.9, 0.9, 0.9);
+ if (size <= 768) /* iPad retina / iPhone 6 */
+ glScalef (0.7, 0.7, 0.7);
+ }
+# endif
+
+ codeword_text_output (mi, anim_ratio);
+
+ glRotatef (90, 1, 0, 0);
+ glRotatef (90, 0, 1, 0);
+ glRotatef (-90, 0, 0, 1);
+ glScalef (0.8, 0.8, 0.8);
+
+ glNormal3f (0, 0, -1);
+
+ if (anim_ratio <= 0)
+ {
+ polys += draw_codeword_cap (mi);
+ goto DONE;
+ }
+
+# if 0
+ glColor3f (1, 0, 0);
+ glBegin(GL_LINE_STRIP);
+ for (i = 0; i < dc->codeword_path_npoints; i++)
+ {
+ glVertex3f (dc->codeword_path[i].x,
+ dc->codeword_path[i].y,
+ dc->codeword_path[i].z);
+ polys++;
+ }
+ glEnd();
+ glColor4fv (dc->codeword_color);
+# endif
+
+ if (wire)
+ {
+ int k;
+ GLfloat j;
+ for (i = 0; i <= 1; i++)
+ for (j = -thick; j <= thick; j += thick*2)
+ {
+ glBegin (GL_LINE_STRIP);
+ for (k = i; k < nquads; k += 2)
+ {
+ glVertex3f (quads[k].x, quads[k].y, j);
+ polys++;
+ }
+ glEnd();
+ }
+ }
+
+ /* Top and bottom */
+
+ for (j = -thick; j <= thick; j += thick*2)
+ {
+ if (j < 0)
+ {
+ glNormal3f (0, 0, -1);
+ glFrontFace (GL_CW);
+ }
+ else
+ {
+ glNormal3f (0, 0, 1);
+ glFrontFace (GL_CCW);
+ }
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < nquads; i += 2)
+ {
+ glVertex3f (quads[i+1].x, quads[i+1].y, j);
+ glVertex3f (quads[i].x, quads[i].y, j);
+ polys++;
+ }
+ glEnd();
+ }
+
+ /* Edges */
+
+ for (k = 0; k <= 1; k++)
+ {
+ if (k > 0)
+ {
+ glNormal3f (0, 0, -1);
+ glFrontFace (GL_CW);
+ }
+ else
+ {
+ glNormal3f (0, 0, 1);
+ glFrontFace (GL_CCW);
+ }
+
+ glBegin (wire ? GL_LINES : GL_QUADS);
+ for (i = k; i < nquads; i += 2)
+ {
+ XYZ p1a = quads[i];
+ XYZ p2a = (i < nquads-2) ? quads[i+2] : p1a;
+ XYZ p1b = p1a;
+ XYZ p2b = p2a;
+
+ XYZ n1 = norms[i];
+ XYZ n2 = (i < nquads-2) ? norms[i+2] : n1;
+
+ /* If the two normals are very similar, smooth the face.
+ If they are different, it's a sharp turn, and use the
+ same normal for both edges (not quite right, but close).
+ */
+ GLfloat angle = vector_angle (n1.x, n1.y, n1.z,
+ n2.x, n2.y, n2.z);
+ GLfloat pointy = 0.8;
+
+ p1a.z = thick;
+ p1b.z = -thick;
+ p2a.z = thick;
+ p2b.z = -thick;
+
+ glNormal3f (n1.x, n1.y, n1.z);
+ glVertex3f (p1a.x, p1a.y, p1a.z);
+ glVertex3f (p1b.x, p1b.y, p1b.z);
+
+ if (angle < pointy)
+ glNormal3f (n2.x, n2.y, n2.z);
+ glVertex3f (p2b.x, p2b.y, p2b.z);
+ glVertex3f (p2a.x, p2a.y, p2a.z);
+ polys++;
+ }
+ glEnd();
+ }
+
+
+ /* Only draw the guides when the path is almost complete;
+ fade them in and out based on completeness. */
+ {
+ GLfloat size = 0.95;
+ GLfloat r = (anim_ratio > size
+ ? (anim_ratio - size) / (1 - size)
+ : 0);
+ polys += draw_codeword_guides (mi, r);
+ }
+
+
+ /* Draw the start and end caps */
+ {
+ int i;
+ GLfloat x, y, z, x2, y2, z2, X, Y, Z;
+ GLfloat r = dc->codeword_spread * dc->codeword_cap_size;
+
+ i = 0;
+ x = dc->codeword_path[i].x;
+ y = dc->codeword_path[i].y;
+ z = dc->codeword_path[i].z;
+
+ x -= r;
+
+ glPushMatrix();
+ glTranslatef (x, y, z);
+ polys += draw_codeword_cap (mi);
+ glPopMatrix();
+
+ /* end cap */
+
+ i = last_anim_point + 1;
+ if (i > dc->codeword_path_npoints - 1)
+ i = dc->codeword_path_npoints - 1;
+
+ x = dc->codeword_path[i].x;
+ y = dc->codeword_path[i].y;
+ z = dc->codeword_path[i].z;
+
+ i--;
+ x2 = dc->codeword_path[i].x;
+ y2 = dc->codeword_path[i].y;
+ z2 = dc->codeword_path[i].z;
+
+ X = (x2 - x);
+ Y = (y2 - y);
+ Z = (z2 - z);
+
+ glPushMatrix();
+ glTranslatef (x, y, z);
+ glRotatef (-atan2 (X, Y) * (180 / M_PI), 0, 0, 1);
+ glRotatef ( atan2 (Z, sqrt(X*X + Y*Y)) * (180 / M_PI), 1, 0, 0);
+ glTranslatef (0, -r, 0);
+ polys += draw_codeword_cap (mi);
+ glPopMatrix();
+ }
+
+ DONE:
+
+ glPopMatrix();
+
+ free (quads);
+ free (norms);
+
+ return polys;
+}
+
+#endif /* CW */
+
+
+ENTRYPOINT void
+reshape_logo (ModeInfo *mi, int width, int height)
+{
+# ifdef DEBUG
+ logo_configuration *dc = &dcs[MI_SCREEN(mi)];
+# endif
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ GLfloat persp = 64; /* 30 */
+ GLfloat pos = 13; /* 30 */
+
+# ifdef DEBUG
+ persp += dc->persp_off;
+ pos += dc->pos_off;
+# endif
+
+ glViewport (0, 0, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (persp, 1/h, 1, 100);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0, 0, pos,
+ 0, 0, 0,
+ 0, 1, 0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h); /* #### Why does this change the lighting? */
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+static void
+gl_init (ModeInfo *mi)
+{
+/* logo_configuration *dc = &dcs[MI_SCREEN(mi)]; */
+ int wire = MI_IS_WIREFRAME(mi);
+
+ GLfloat position[] = {0, 0, 0, 0};
+ GLfloat direction[] = {3, -1, -3};
+
+ position[0] = -direction[0];
+ position[1] = -direction[1];
+ position[2] = -direction[2];
+
+ if (!wire)
+ {
+ glLightfv(GL_LIGHT0, GL_POSITION, position);
+ glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, direction);
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ }
+}
+
+
+ENTRYPOINT void
+init_logo (ModeInfo *mi)
+{
+ logo_configuration *dc;
+ int do_gasket = get_boolean_resource(mi->dpy, "doGasket", "Boolean");
+ int do_helix = get_boolean_resource(mi->dpy, "doHelix", "Boolean");
+ int do_ladder = (do_helix &&
+ get_boolean_resource(mi->dpy, "doLadder", "Boolean"));
+ int do_frame = get_boolean_resource(mi->dpy, "doFrame", "Boolean");
+ GLfloat helix_rot = 147.0;
+
+ if (!do_gasket && !do_helix)
+ {
+ fprintf (stderr, "%s: no helix or gasket?\n", progname);
+ exit (1);
+ }
+
+ MI_INIT (mi, dcs);
+
+ dc = &dcs[MI_SCREEN(mi)];
+
+ if ((dc->glx_context = init_GL(mi)) != NULL) {
+ gl_init(mi);
+ reshape_logo (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+
+ dc->wall_facets = get_integer_resource(mi->dpy, "wallFacets", "Integer");
+ dc->bar_facets = get_integer_resource(mi->dpy, "barFacets", "Integer");
+ dc->clockwise = get_boolean_resource(mi->dpy, "clockwise", "Boolean");
+ dc->turns = get_float_resource(mi->dpy, "turns", "Float");
+ dc->turn_spacing = get_float_resource(mi->dpy, "turnSpacing", "Float");
+ dc->bar_spacing = get_float_resource(mi->dpy, "barSpacing", "Float");
+ dc->wall_height = get_float_resource(mi->dpy, "wallHeight", "Float");
+ dc->wall_thickness = get_float_resource(mi->dpy, "wallThickness", "Float");
+ dc->bar_thickness = get_float_resource(mi->dpy, "barThickness", "Float");
+ dc->wall_taper = get_float_resource(mi->dpy, "wallTaper", "Float");
+
+ dc->gasket_size = get_float_resource(mi->dpy,"gasketSize", "Float");
+ dc->gasket_depth = get_float_resource(mi->dpy,"gasketDepth", "Float");
+ dc->gasket_thickness = get_float_resource(mi->dpy,"gasketThickness","Float");
+
+ dc->frame_size = get_float_resource(mi->dpy, "frameSize", "Float");
+ dc->frame_depth = get_float_resource(mi->dpy, "frameDepth", "Float");
+ dc->frame_thickness = get_float_resource(mi->dpy, "frameThickness", "Float");
+ dc->triangle_size = get_float_resource(mi->dpy, "triangleSize", "Float");
+
+ dc->speed = get_float_resource(mi->dpy, "speed", "Float");
+# ifdef CW
+ dc->codeword_text = get_string_resource(mi->dpy, "text", "String");
+ dc->codeword_text = codeword_simplify_text (dc->codeword_text);
+ dc->codeword_text_out =
+ calloc (strlen(dc->codeword_text) + 1, sizeof(*dc->codeword_text_out));
+ dc->codeword_text_points =
+ (int *) calloc (strlen(dc->codeword_text) + 1,
+ sizeof(*dc->codeword_text_points));
+
+ dc->codeword_facets = get_integer_resource(mi->dpy, "cwFacets", "Integer");
+ dc->codeword_disc_facets = get_integer_resource(mi->dpy,
+ "cwDiscFacets", "Integer");
+ dc->codeword_spread = get_float_resource(mi->dpy, "cwSpread", "Float");
+ dc->codeword_line_width = get_float_resource(mi->dpy, "cwLineWidth", "Float");
+ dc->codeword_thickness = get_float_resource(mi->dpy, "cwThickness", "Float");
+ dc->codeword_cap_size = get_float_resource(mi->dpy, "cwCapSize", "Float");
+# endif
+
+ {
+ char *s = get_string_resource (MI_DISPLAY (mi), "mode", "String");
+ if (!s || !*s || !strcasecmp (s, "helix"))
+ dc->mode = HELIX;
+ else if (!strcasecmp (s, "pizza"))
+ dc->mode = PIZZA;
+ else if (!strcasecmp (s, "both"))
+ dc->mode = HELIX_AND_PIZZA;
+# ifdef CW
+ else if (!strcasecmp (s, "codeword"))
+ dc->mode = CODEWORD_IN;
+# endif
+ else
+ {
+ fprintf (stderr,
+ "%s: mode must be helix, pizza or both, not \"%s\"\n",
+ progname, s);
+ exit (1);
+ }
+ if (s) free (s);
+
+ dc->anim_state = (dc->mode == HELIX_AND_PIZZA
+ ? ((random() & 1) ? HELIX : PIZZA)
+ : dc->mode);
+ dc->anim_ratio = 0;
+ }
+
+# ifdef CW
+ if (dc->mode == CODEWORD_IN)
+ dc->font = load_texture_font (MI_DISPLAY(mi), "cwFont");
+# endif
+
+# ifdef DEBUG
+ dc->label_font = load_texture_font (MI_DISPLAY(mi), "fpsFont");
+# endif
+
+ {
+ XColor xcolor;
+
+ char *color_name =
+ get_string_resource (mi->dpy, "foreground", "Foreground");
+ char *s2;
+ for (s2 = color_name + strlen(color_name) - 1; s2 > color_name; s2--)
+ if (*s2 == ' ' || *s2 == '\t')
+ *s2 = 0;
+ else
+ break;
+
+ if (! XParseColor (MI_DISPLAY(mi), mi->xgwa.colormap, color_name, &xcolor))
+ {
+ fprintf (stderr, "%s: can't parse color %s\n", progname, color_name);
+ exit (1);
+ }
+
+ dc->color[0] = xcolor.red / 65535.0;
+ dc->color[1] = xcolor.green / 65535.0;
+ dc->color[2] = xcolor.blue / 65535.0;
+ dc->color[3] = 1.0;
+
+ color_name = get_string_resource (mi->dpy, "cwForeground", "Foreground");
+ for (s2 = color_name + strlen(color_name) - 1; s2 > color_name; s2--)
+ if (*s2 == ' ' || *s2 == '\t')
+ *s2 = 0;
+ else
+ break;
+
+ if (! XParseColor (MI_DISPLAY(mi), mi->xgwa.colormap, color_name, &xcolor))
+ {
+ fprintf (stderr, "%s: can't parse color %s\n", progname, color_name);
+ exit (1);
+ }
+
+# ifdef CW
+ dc->codeword_color[0] = xcolor.red / 65535.0;
+ dc->codeword_color[1] = xcolor.green / 65535.0;
+ dc->codeword_color[2] = xcolor.blue / 65535.0;
+ dc->codeword_color[3] = 1.0;
+
+ color_name = get_string_resource (mi->dpy, "cwBackground", "Background");
+ for (s2 = color_name + strlen(color_name) - 1; s2 > color_name; s2--)
+ if (*s2 == ' ' || *s2 == '\t')
+ *s2 = 0;
+ else
+ break;
+
+ if (! XParseColor (MI_DISPLAY(mi), mi->xgwa.colormap, color_name, &xcolor))
+ {
+ fprintf (stderr, "%s: can't parse color %s\n", progname, color_name);
+ exit (1);
+ }
+
+ dc->codeword_bg[0] = xcolor.red / 65535.0;
+ dc->codeword_bg[1] = xcolor.green / 65535.0;
+ dc->codeword_bg[2] = xcolor.blue / 65535.0;
+ dc->codeword_bg[3] = 1.0;
+# endif /* CW */
+ }
+
+ dc->trackball = gltrackball_init (False);
+
+ dc->gasket_spinnerx.probability = 0.1;
+ dc->gasket_spinnery.probability = 0.1;
+ dc->gasket_spinnerz.probability = 1.0;
+ dc->gasket_spinnerx.easement = 0.08;
+ dc->gasket_spinnery.easement = 0.08;
+ dc->gasket_spinnerz.easement = 0.08;
+
+ dc->helix_spinnerz.probability = 0.6;
+ dc->helix_spinnerz.easement = 0.2;
+
+ dc->pizza_spinnerz.probability = 0.6;
+ dc->pizza_spinnery.probability = 0.6;
+ dc->pizza_spinnerz.easement = 0.2;
+ dc->pizza_spinnery.easement = 0.2;
+
+ dc->frame_spinner.probability = 5.0;
+ dc->frame_spinner.easement = 0.2;
+
+ dc->scene_spinnerx.probability = 0.1;
+ dc->scene_spinnery.probability = 0.0;
+ dc->scene_spinnerx.easement = 0.1;
+ dc->scene_spinnery.easement = 0.1;
+
+# ifdef CW
+ if (dc->mode == CODEWORD_IN)
+ {
+ double tilt_speed = 0.003;
+ dc->scene_rot = make_rotator (0, 0, 0, 0, tilt_speed, True);
+ }
+# endif
+
+ /* start the frame off-screen */
+ dc->frame_spinner.spinning_p = True;
+ dc->frame_spinner.position = 0.3;
+ dc->frame_spinner.speed = 0.001;
+
+ if (dc->speed > 0) /* start off with the gasket in motion */
+ {
+ dc->gasket_spinnerz.spinning_p = True;
+ dc->gasket_spinnerz.speed = (0.002
+ * ((random() & 1) ? 1 : -1)
+ * dc->speed);
+ }
+
+# ifdef DXF_OUTPUT_HACK
+ {
+# if 0
+ dc->frame_depth = dc->gasket_depth;
+ dxf_layer = 1;
+ dxf_color = 3;
+ dxf_start();
+ glPushMatrix();
+ glRotatef(90, 1, 0, 0);
+ glRotatef(90, 0, 0, 1);
+ make_pizza (dc, 0, 0);
+
+ glPushMatrix();
+ glRotatef(helix_rot, 0, 0, 1);
+ make_ladder (dc, 0, 0);
+ make_helix (dc, 0, 0);
+ glRotatef (180, 0, 0, 1);
+ make_helix (dc, 0, 0);
+ glPopMatrix();
+
+ dxf_layer++;
+ make_gasket (dc, 0);
+ dxf_layer++;
+ make_frame (dc, 0);
+ glPopMatrix();
+ dxf_end();
+# else
+ dxf_start();
+ glPushMatrix();
+ glRotatef(90, 1, 0, 0);
+ glRotatef(90, 0, 0, 1);
+ dc->anim_state = CODEWORD;
+ make_codeword_path (mi);
+ draw_codeword_path (mi);
+ glPopMatrix();
+ dxf_end();
+# endif
+ }
+# endif
+
+ glPushMatrix();
+ dc->helix_list = glGenLists (1);
+ glNewList (dc->helix_list, GL_COMPILE);
+ glRotatef(helix_rot, 0, 0, 1);
+ if (do_ladder) dc->polys[0] += make_ladder (dc, 0, 0);
+ if (do_helix) dc->polys[0] += make_helix (dc, 0, 0);
+ glRotatef(180, 0, 0, 1);
+ if (do_helix) dc->polys[0] += make_helix (dc, 0, 0);
+ glEndList ();
+ glPopMatrix();
+
+ glPushMatrix();
+ dc->helix_list_wire = glGenLists (1);
+ glNewList (dc->helix_list_wire, GL_COMPILE);
+/* glRotatef(helix_rot, 0, 0, 1); wtf? */
+ if (do_ladder) dc->polys[1] += make_ladder (dc, 1, 1);
+ if (do_helix) dc->polys[1] += make_helix (dc, 1, 1);
+ glRotatef(180, 0, 0, 1);
+ if (do_helix) dc->polys[1] += make_helix (dc, 1, 1);
+ glEndList ();
+ glPopMatrix();
+
+ glPushMatrix();
+ dc->helix_list_facetted = glGenLists (1);
+ glNewList (dc->helix_list_facetted, GL_COMPILE);
+ glRotatef(helix_rot, 0, 0, 1);
+ if (do_ladder) dc->polys[2] += make_ladder (dc, 1, 0);
+ if (do_helix) dc->polys[2] += make_helix (dc, 1, 0);
+ glRotatef(180, 0, 0, 1);
+ if (do_helix) dc->polys[2] += make_helix (dc, 1, 0);
+ glEndList ();
+ glPopMatrix();
+
+ dc->pizza_list = glGenLists (1);
+ glNewList (dc->pizza_list, GL_COMPILE);
+ if (do_frame) dc->polys[5] += make_pizza (dc, 0, 0);
+ glEndList ();
+
+ dc->pizza_list_wire = glGenLists (1);
+ glNewList (dc->pizza_list_wire, GL_COMPILE);
+ if (do_frame) dc->polys[6] += make_pizza (dc, 1, 1);
+ glEndList ();
+
+ dc->pizza_list_facetted = glGenLists (1);
+ glNewList (dc->pizza_list_facetted, GL_COMPILE);
+ if (do_frame) dc->polys[6] += make_pizza (dc, 1, 0);
+ glEndList ();
+
+ dc->gasket_list = glGenLists (1);
+ glNewList (dc->gasket_list, GL_COMPILE);
+ if (do_gasket) dc->polys[3] += make_gasket (dc, 0);
+ glEndList ();
+
+ dc->gasket_list_wire = glGenLists (1);
+ glNewList (dc->gasket_list_wire, GL_COMPILE);
+ if (do_gasket) dc->polys[4] += make_gasket (dc, 1);
+ glEndList ();
+
+ dc->frame_list = glGenLists (1);
+ glNewList (dc->frame_list, GL_COMPILE);
+ if (do_frame) dc->polys[5] += make_frame (dc, 0);
+ glEndList ();
+
+ dc->frame_list_wire = glGenLists (1);
+ glNewList (dc->frame_list_wire, GL_COMPILE);
+ if (do_frame) dc->polys[6] += make_frame (dc, 1);
+ glEndList ();
+
+# ifdef CW
+ make_codeword_path (mi);
+# endif
+
+ /* When drawing both solid and wireframe objects,
+ make sure the wireframe actually shows up! */
+ glEnable (GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset (1.0, 1.0);
+}
+
+
+ENTRYPOINT Bool
+logo_handle_event (ModeInfo *mi, XEvent *event)
+{
+ logo_configuration *dc = &dcs[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, dc->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &dc->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+
+# ifdef DEBUG
+ {
+ GLfloat step = 0.1;
+ if (c == 'a') dc->persp_off += step;
+ else if (c == 'z') dc->persp_off -= step;
+ else if (c == 's') dc->pos_off += step;
+ else if (c == 'x') dc->pos_off -= step;
+ else return False;
+
+ /* dc->pos_off = -dc->persp_off; */
+ reshape_logo (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+# endif
+
+ if (c == ' ' || c == '\t')
+ {
+ switch (dc->anim_state) {
+ case HELIX:
+ dc->anim_state = HELIX_OUT;
+ dc->anim_ratio = 0.0;
+ return True;
+ case PIZZA:
+ dc->anim_state = PIZZA_OUT;
+ dc->anim_ratio = 0.0;
+ return True;
+# ifdef CW
+ case CODEWORD:
+ dc->anim_state = CODEWORD_OUT;
+ dc->anim_ratio = 0.0;
+ return True;
+# endif
+ default:
+ break;
+ }
+ }
+ }
+
+ return False;
+}
+
+
+static GLfloat
+spinner_ease (GLfloat x)
+{
+ /* Smooth curve up, ending at slope = 1. */
+ return cos ((x/2 + 1) * M_PI) + 1;
+}
+
+
+static void
+tick_spinner (ModeInfo *mi, spinner *s)
+{
+ logo_configuration *dc = &dcs[MI_SCREEN(mi)];
+
+ if (dc->speed == 0) return;
+ if (dc->button_down_p) return;
+
+ if (s->spinning_p)
+ {
+ s->position += s->speed;
+ if (s->position >= 1.0 || s->position <= 0.0)
+ {
+ s->position = 0;
+ s->position_eased = 0;
+ s->spinning_p = False;
+ }
+ else if (s->easement > 0 && s->position <= s->easement)
+ s->position_eased = (s->easement *
+ spinner_ease (s->position / s->easement));
+ else if (s->easement > 0 && s->position >= 1-s->easement)
+ s->position_eased = (1 - s->easement *
+ spinner_ease ((1 - s->position) / s->easement));
+ else
+ s->position_eased = s->position;
+ }
+ else if (s->probability &&
+ (random() % (int) (PROBABILITY_SCALE / s->probability)) == 0)
+ {
+ GLfloat ss = 0.004;
+ s->spinning_p = True;
+ s->position = 0;
+ do {
+ s->speed = dc->speed * (frand(ss/3) + frand(ss/3) + frand(ss/3));
+ } while (s->speed <= 0);
+ if (random() & 1)
+ {
+ s->speed = -s->speed;
+ s->position = 1.0;
+ }
+ }
+}
+
+
+static void
+link_spinners (ModeInfo *mi, spinner *s0, spinner *s1)
+{
+ if (s0->spinning_p && !s1->spinning_p)
+ {
+ GLfloat op = s1->probability;
+ s1->probability = PROBABILITY_SCALE;
+ tick_spinner (mi, s1);
+ s1->probability = op;
+ }
+}
+
+
+ENTRYPOINT void
+draw_logo (ModeInfo *mi)
+{
+ logo_configuration *dc = &dcs[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int wire = MI_IS_WIREFRAME(mi);
+ GLfloat gcolor[4];
+ GLfloat specular[] = {0.8, 0.8, 0.8, 1.0};
+ GLfloat shininess = 50.0;
+ Bool pizza_p;
+# ifdef CW
+ Bool codeword_p;
+# endif
+
+ if (!dc->glx_context)
+ return;
+
+ mi->polygon_count = 0;
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(dc->glx_context));
+
+ if (!wire &&
+ dc->wire_overlay == 0 &&
+ (random() % (int) (PROBABILITY_SCALE / 0.2)) == 0)
+ dc->wire_overlay = ((random() % 200) +
+ (random() % 200) +
+ (random() % 200));
+
+# ifndef DEBUG
+ tick_spinner (mi, &dc->gasket_spinnerx);
+ tick_spinner (mi, &dc->gasket_spinnery);
+ tick_spinner (mi, &dc->gasket_spinnerz);
+ tick_spinner (mi, &dc->helix_spinnerz);
+ tick_spinner (mi, &dc->pizza_spinnery);
+ tick_spinner (mi, &dc->pizza_spinnerz);
+ tick_spinner (mi, &dc->scene_spinnerx);
+ tick_spinner (mi, &dc->scene_spinnery);
+ tick_spinner (mi, &dc->frame_spinner);
+ link_spinners (mi, &dc->scene_spinnerx, &dc->scene_spinnery);
+# endif /* DEBUG */
+
+ switch (dc->anim_state)
+ {
+ case HELIX:
+ if (dc->mode == HELIX_AND_PIZZA &&
+ (random() % (int) (PROBABILITY_SCALE / 0.2)) == 0)
+ dc->anim_state = HELIX_OUT;
+ break;
+
+ case HELIX_OUT:
+ dc->anim_ratio += 0.1 * dc->speed;
+ if (dc->anim_ratio >= 1.0)
+ {
+ dc->anim_ratio = 0.0;
+ dc->anim_state = PIZZA_IN;
+ }
+ break;
+
+ case PIZZA_IN:
+ dc->anim_ratio += 0.1 * dc->speed;
+ if (dc->anim_ratio >= 1.0)
+ {
+ dc->anim_ratio = 0.0;
+ dc->anim_state = PIZZA;
+ }
+ break;
+
+ case PIZZA:
+ if (dc->mode == HELIX_AND_PIZZA &&
+ (random() % (int) (PROBABILITY_SCALE / 0.2)) == 0)
+ dc->anim_state = PIZZA_OUT;
+ break;
+
+ case PIZZA_OUT:
+ dc->anim_ratio += 0.1 * dc->speed;
+ if (dc->anim_ratio >= 1.0)
+ {
+ dc->anim_ratio = 0.0;
+ dc->anim_state = HELIX_IN;
+ }
+ break;
+
+ case HELIX_IN:
+ dc->anim_ratio += 0.1 * dc->speed;
+ if (dc->anim_ratio >= 1.0)
+ {
+ dc->anim_ratio = 0.0;
+ dc->anim_state = HELIX;
+ }
+ break;
+
+
+# ifdef CW
+ case CODEWORD_IN:
+ dc->scene_spinnerx.probability = 0.2;
+ dc->scene_spinnery.probability = 0.05;
+ if (! dc->button_down_p)
+ dc->anim_ratio += 0.004 * dc->speed;
+ if (dc->anim_ratio >= 1.0)
+ {
+ dc->anim_state = CODEWORD;
+ dc->anim_ratio = frand (0.5);
+ }
+ break;
+
+ case CODEWORD:
+ dc->scene_spinnerx.probability = 0.5;
+ dc->scene_spinnery.probability = 0.2;
+ if (! dc->button_down_p)
+ dc->anim_ratio += (0.0005 + frand(0.002)) * dc->speed;
+ if (dc->anim_ratio >= 1.0)
+ {
+ dc->anim_ratio = 0.0;
+ dc->anim_state = CODEWORD_OUT;
+ }
+ break;
+
+ case CODEWORD_OUT:
+ dc->scene_spinnerx.probability = 0;
+ dc->scene_spinnery.probability = 0;
+ if (! dc->button_down_p)
+ dc->anim_ratio += 0.02 * dc->speed;
+ if (dc->anim_ratio >= 1.0)
+ {
+ dc->anim_ratio = 0.0;
+ dc->anim_state = CODEWORD_BLANK;
+ }
+ break;
+
+ case CODEWORD_BLANK:
+ dc->scene_spinnerx.probability = 0;
+ dc->scene_spinnery.probability = 0;
+ if (! dc->button_down_p)
+ dc->anim_ratio += 0.01 * dc->speed;
+ if (dc->anim_ratio >= 1.0)
+ {
+ dc->anim_ratio = 0.0;
+ dc->anim_state = CODEWORD_IN;
+ }
+ break;
+# endif /* CW */
+
+ default:
+ abort();
+ break;
+ }
+
+# ifdef DEBUG
+ dc->anim_state = HELIX;
+ dc->wire_overlay = 0;
+# endif
+
+ pizza_p = (dc->anim_state == PIZZA ||
+ dc->anim_state == PIZZA_IN ||
+ dc->anim_state == PIZZA_OUT);
+
+# ifdef CW
+ codeword_p = (dc->anim_state == CODEWORD ||
+ dc->anim_state == CODEWORD_IN ||
+ dc->anim_state == CODEWORD_OUT ||
+ dc->anim_state == CODEWORD_BLANK);
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+ {
+ GLfloat scale = 1.8;
+ glScalef(scale, scale, scale);
+
+ glColor3f(dc->color[0], dc->color[1], dc->color[2]);
+
+
+ /* Draw frame before trackball rotation */
+# ifdef CW
+ if (! codeword_p)
+# endif
+ {
+ GLfloat p = (dc->frame_spinner.position_eased >= 0
+ ? dc->frame_spinner.position_eased
+ : -dc->frame_spinner.position_eased);
+ GLfloat size = (p > 0.5 ? 1-p : p);
+ scale = 1 + (size * 10);
+ glPushMatrix();
+ /* gltrackball_rotate (dc->trackball); */
+ glRotatef(90, 1, 0, 0);
+ glRotatef(90, 0, 0, 1);
+
+ glScalef (1, scale, scale);
+ if (wire)
+ {
+ glDisable (GL_LIGHTING);
+ glCallList (dc->frame_list_wire);
+ mi->polygon_count += dc->polys[6];
+ }
+ else if (dc->wire_overlay != 0)
+ {
+ glCallList (dc->frame_list);
+ glDisable (GL_LIGHTING);
+ glColor3fv (dc->color);
+ glCallList (dc->frame_list_wire);
+ mi->polygon_count += dc->polys[6];
+ if (!wire) glEnable (GL_LIGHTING);
+ }
+ else
+ {
+ glCallList (dc->frame_list);
+ mi->polygon_count += dc->polys[5];
+ }
+ glPopMatrix();
+ }
+
+ gltrackball_rotate (dc->trackball);
+
+ glRotatef(90, 1, 0, 0);
+ glRotatef(90, 0, 0, 1);
+
+# ifdef CW
+ if (! codeword_p)
+# endif
+ {
+ glRotatef (360 * dc->scene_spinnerx.position_eased, 0, 1, 0);
+ glRotatef (360 * dc->scene_spinnery.position_eased, 0, 0, 1);
+
+ glPushMatrix();
+
+ glRotatef (360 * dc->gasket_spinnerx.position_eased, 0, 1, 0);
+ glRotatef (360 * dc->gasket_spinnery.position_eased, 0, 0, 1);
+ glRotatef (360 * dc->gasket_spinnerz.position_eased, 1, 0, 0);
+
+ memcpy (gcolor, dc->color, sizeof (dc->color));
+ if (dc->wire_overlay != 0)
+ {
+ gcolor[0] = gcolor[1] = gcolor[2] = 0;
+ specular[0] = specular[1] = specular[2] = 0;
+ shininess = 0;
+ }
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, gcolor);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, specular);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shininess);
+
+ if (wire)
+ {
+ glDisable (GL_LIGHTING);
+ glCallList (dc->gasket_list_wire);
+ mi->polygon_count += dc->polys[4];
+ }
+ else if (dc->wire_overlay != 0)
+ {
+ glCallList (dc->gasket_list);
+ glDisable (GL_LIGHTING);
+ glColor3fv (dc->color);
+ glCallList (dc->gasket_list_wire);
+ mi->polygon_count += dc->polys[4];
+ if (!wire) glEnable (GL_LIGHTING);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, gcolor);
+ }
+ else
+ {
+ glCallList (dc->gasket_list);
+ mi->polygon_count += dc->polys[3];
+ }
+ glPopMatrix();
+
+ if (pizza_p)
+ {
+ glRotatef (360 * dc->pizza_spinnery.position_eased, 1, 0, 0);
+ glRotatef (360 * dc->pizza_spinnerz.position_eased, 0, 0, 1);
+ }
+ else
+ {
+ glRotatef (360 * dc->helix_spinnerz.position_eased, 0, 0, 1);
+ }
+
+ scale = ((dc->anim_state == PIZZA_IN || dc->anim_state == HELIX_IN)
+ ? dc->anim_ratio
+ : ((dc->anim_state == PIZZA_OUT || dc->anim_state == HELIX_OUT)
+ ? 1.0 - dc->anim_ratio
+ : 1.0));
+ if (scale <= 0) scale = 0.001;
+ glScalef (scale, scale, scale);
+
+ if (wire)
+ {
+ glDisable (GL_LIGHTING);
+ if (pizza_p)
+ glCallList (dc->pizza_list_wire);
+ else
+ glCallList (dc->helix_list_wire);
+ mi->polygon_count += dc->polys[1];
+ }
+ else if (dc->wire_overlay != 0)
+ {
+ if (pizza_p)
+ glCallList (dc->pizza_list_facetted);
+ else
+ glCallList (dc->helix_list_facetted);
+
+ glDisable (GL_LIGHTING);
+ glColor3fv (dc->color);
+
+ if (pizza_p)
+ glCallList (dc->pizza_list_wire);
+ else
+ glCallList (dc->helix_list_wire);
+
+ mi->polygon_count += dc->polys[2];
+ if (!wire) glEnable (GL_LIGHTING);
+ }
+ else
+ {
+ if (pizza_p)
+ glCallList (dc->pizza_list);
+ else
+ glCallList (dc->helix_list);
+ mi->polygon_count += dc->polys[0];
+ }
+ }
+# ifdef CW
+ else /* codeword_p */
+ {
+# if 0
+ double max = 70; /* face front */
+ double x, y, z;
+ get_position (dc->scene_rot, &x, &y, &z, !dc->button_down_p);
+ glRotatef (max/2 - x*max, 0, 0, 1);
+ glRotatef (max/2 - y*max, 0, 1, 0);
+ /* glRotatef (max/2 - z*max, 1, 0, 0); */
+# else
+ glRotatef (360 * dc->scene_spinnerx.position_eased, 0, 1, 0);
+ glRotatef (360 * dc->scene_spinnery.position_eased, 0, 0, 1);
+# endif
+
+ glClearColor (dc->codeword_bg[0],
+ dc->codeword_bg[1],
+ dc->codeword_bg[2],
+ dc->codeword_bg[3]);
+ mi->polygon_count += draw_codeword_path (mi);
+ }
+# endif /* CW */
+ }
+ glPopMatrix();
+
+ if (dc->wire_overlay > 0)
+ dc->wire_overlay--;
+
+# ifdef DEBUG
+ {
+ char s[1024];
+ sprintf (s, "a/z, s/x; per = %0.2f pos = %0.2f",
+ dc->persp_off, dc->pos_off);
+ glColor3f (1,1,1);
+ print_texture_label (dpy, dc->label_font, MI_WIDTH(mi), MI_HEIGHT(mi),
+ 1, s);
+ }
+# endif
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("DNALogo", dnalogo, logo)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/dnapizza.h b/hacks/glx/dnapizza.h
new file mode 100644
index 0000000..6dd48b9
--- /dev/null
+++ b/hacks/glx/dnapizza.h
@@ -0,0 +1,122 @@
+/* DNA Pizza Logo, Copyright (c) 2011-2012 Jamie Zawinski <jwz@dnalounge.com>
+
+ Since GLUtesselator doesn't exist in the iOS build, the slice shape
+ of the DNA Pizza logo is hardcoded there, instead of being generated.
+ (These vertexes were generated by GLUtesselator and saved.)
+ */
+
+static const GLfloat dnapizza_triangles[]={
+ 0.315,0.213301,0, 0.296699,0.195,0, 0.309,0.455,0,
+ 0.296699,0.195,0, 0.29,0.17,0, 0.309,0.455,0,
+ 0.309,0.455,0, 0.29,0.17,0, 0.26,0.452,0,
+ 0.29,0.17,0, 0.23,0.042,0, 0.26,0.452,0,
+ 0.26,0.452,0, 0.23,0.042,0, 0.216,0.293,0,
+ 0.23,0.042,0, 0.21,0,0, 0.216,0.293,0,
+ 0.216,0.293,0, 0.21,0,0, 0.149,0.178,0,
+ 0.21,0,0, 0.102,0.178,0, 0.149,0.178,0,
+ 0.376,0.572,0, 0.353,0.613,0, 0.411,0.68402,0,
+ 0.376,0.572,0, 0.411,0.68402,0, 0.383301,0.195,0,
+ 0.376,0.572,0, 0.383301,0.195,0, 0.365,0.213301,0,
+ 0.376,0.572,0, 0.365,0.213301,0, 0.34,0.22,0,
+ 0.376,0.572,0, 0.34,0.22,0, 0.315,0.213301,0,
+ 0.376,0.572,0, 0.315,0.213301,0, 0.309,0.455,0,
+ 0.39,0.17,0, 0.383301,0.195,0, 0.411,0.68402,0,
+ 0.39,0.17,0, 0.411,0.68402,0, 0.48,0.17,0,
+ 0.39,0.17,0, 0.48,0.17,0, 0.488039,0.14,0,
+ 0.39,0.17,0, 0.488039,0.14,0, 0.51,0.118038,0,
+ 0.39,0.17,0, 0.51,0.118038,0, 0.616,0.042,0,
+ 0.39,0.17,0, 0.616,0.042,0, 0.383301,0.145,0,
+ 0.798,0,0, 0.641,0,0, 0.645595,0.469053,0,
+ 0.798,0,0, 0.645595,0.469053,0, 0.653683,0.457714,0,
+ 0.798,0,0, 0.653683,0.457714,0, 0.661572,0.446236,0,
+ 0.798,0,0, 0.661572,0.446236,0, 0.669259,0.434622,0,
+ 0.798,0,0, 0.669259,0.434622,0, 0.676742,0.422876,0,
+ 0.798,0,0, 0.676742,0.422876,0, 0.68402,0.411,0,
+ 0.798,0,0, 0.68402,0.411,0, 0.691088,0.399,0,
+ 0.798,0,0, 0.691088,0.399,0, 0.697947,0.386878,0,
+ 0.798,0,0, 0.697947,0.386878,0, 0.704592,0.374638,0,
+ 0.798,0,0, 0.704592,0.374638,0, 0.711023,0.362284,0,
+ 0.798,0,0, 0.711023,0.362284,0, 0.717238,0.34982,0,
+ 0.798,0,0, 0.717238,0.34982,0, 0.723234,0.337249,0,
+ 0.798,0,0, 0.723234,0.337249,0, 0.729009,0.324576,0,
+ 0.798,0,0, 0.729009,0.324576,0, 0.734563,0.311803,0,
+ 0.798,0,0, 0.734563,0.311803,0, 0.739893,0.298936,0,
+ 0.798,0,0, 0.739893,0.298936,0, 0.744997,0.285978,0,
+ 0.798,0,0, 0.744997,0.285978,0, 0.749875,0.272932,0,
+ 0.798,0,0, 0.749875,0.272932,0, 0.754524,0.259803,0,
+ 0.798,0,0, 0.754524,0.259803,0, 0.758943,0.246596,0,
+ 0.798,0,0, 0.758943,0.246596,0, 0.763131,0.233313,0,
+ 0.798,0,0, 0.763131,0.233313,0, 0.767087,0.219959,0,
+ 0.798,0,0, 0.767087,0.219959,0, 0.770809,0.206538,0,
+ 0.798,0,0, 0.770809,0.206538,0, 0.774296,0.193054,0,
+ 0.798,0,0, 0.774296,0.193054,0, 0.777547,0.179511,0,
+ 0.798,0,0, 0.777547,0.179511,0, 0.780562,0.165914,0,
+ 0.798,0,0, 0.780562,0.165914,0, 0.783338,0.152266,0,
+ 0.798,0,0, 0.783338,0.152266,0, 0.785877,0.138571,0,
+ 0.798,0,0, 0.785877,0.138571,0, 0.788175,0.124835,0,
+ 0.798,0,0, 0.788175,0.124835,0, 0.790234,0.11106,0,
+ 0.798,0,0, 0.790234,0.11106,0, 0.792052,0.097252,0,
+ 0.798,0,0, 0.792052,0.097252,0, 0.793628,0.083414,0,
+ 0.798,0,0, 0.793628,0.083414,0, 0.794963,0.06955,0,
+ 0.798,0,0, 0.794963,0.06955,0, 0.796056,0.055666,0,
+ 0.798,0,0, 0.796056,0.055666,0, 0.796906,0.041764,0,
+ 0.798,0,0, 0.796906,0.041764,0, 0.797514,0.02785,0,
+ 0.798,0,0, 0.797514,0.02785,0, 0.797878,0.013927,0,
+ 0.641,0,0, 0.616,0.042,0, 0.620162,0.502198,0,
+ 0.641,0,0, 0.620162,0.502198,0, 0.628833,0.491298,0,
+ 0.641,0,0, 0.628833,0.491298,0, 0.637311,0.480248,0,
+ 0.641,0,0, 0.637311,0.480248,0, 0.645595,0.469053,0,
+ 0.616,0.042,0, 0.51,0.118038,0, 0.54,0.11,0,
+ 0.616,0.042,0, 0.54,0.11,0, 0.57,0.118038,0,
+ 0.616,0.042,0, 0.57,0.118038,0, 0.591962,0.14,0,
+ 0.616,0.042,0, 0.591962,0.14,0, 0.6,0.17,0,
+ 0.616,0.042,0, 0.6,0.17,0, 0.601962,0.33,0,
+ 0.616,0.042,0, 0.601962,0.33,0, 0.61,0.36,0,
+ 0.616,0.042,0, 0.61,0.36,0, 0.611303,0.512945,0,
+ 0.616,0.042,0, 0.611303,0.512945,0, 0.620162,0.502198,0,
+ 0.48,0.17,0, 0.411,0.68402,0, 0.422875,0.676743,0,
+ 0.48,0.17,0, 0.422875,0.676743,0, 0.434622,0.669259,0,
+ 0.48,0.17,0, 0.434622,0.669259,0, 0.446236,0.661572,0,
+ 0.48,0.17,0, 0.446236,0.661572,0, 0.457714,0.653684,0,
+ 0.48,0.17,0, 0.457714,0.653684,0, 0.469052,0.645596,0,
+ 0.48,0.17,0, 0.469052,0.645596,0, 0.480248,0.637311,0,
+ 0.48,0.17,0, 0.480248,0.637311,0, 0.488038,0.2,0,
+ 0.616,0.042,0, 0.23,0.042,0, 0.315,0.126699,0,
+ 0.616,0.042,0, 0.315,0.126699,0, 0.34,0.12,0,
+ 0.616,0.042,0, 0.34,0.12,0, 0.365,0.126699,0,
+ 0.616,0.042,0, 0.365,0.126699,0, 0.383301,0.145,0,
+ 0.23,0.042,0, 0.29,0.17,0, 0.296699,0.145,0,
+ 0.23,0.042,0, 0.296699,0.145,0, 0.315,0.126699,0,
+ 0.58362,0.544235,0, 0.593029,0.533966,0, 0.601961,0.39,0,
+ 0.593029,0.533966,0, 0.602258,0.523535,0, 0.601961,0.39,0,
+ 0.601961,0.39,0, 0.602258,0.523535,0, 0.61,0.36,0,
+ 0.602258,0.523535,0, 0.611303,0.512945,0, 0.61,0.36,0,
+ 0.58,0.411962,0, 0.55,0.42,0, 0.554337,0.574033,0,
+ 0.58,0.411962,0, 0.554337,0.574033,0, 0.564271,0.564271,0,
+ 0.58,0.411962,0, 0.564271,0.564271,0, 0.574033,0.554338,0,
+ 0.58,0.411962,0, 0.574033,0.554338,0, 0.58362,0.544235,0,
+ 0.58,0.411962,0, 0.58362,0.544235,0, 0.601961,0.39,0,
+ 0.55,0.42,0, 0.52,0.411962,0, 0.523535,0.602258,0,
+ 0.55,0.42,0, 0.523535,0.602258,0, 0.533966,0.59303,0,
+ 0.55,0.42,0, 0.533966,0.59303,0, 0.544235,0.58362,0,
+ 0.55,0.42,0, 0.544235,0.58362,0, 0.554337,0.574033,0,
+ 0.51,0.221962,0, 0.488038,0.2,0, 0.49,0.36,0,
+ 0.488038,0.2,0, 0.491298,0.628833,0, 0.49,0.36,0,
+ 0.49,0.36,0, 0.491298,0.628833,0, 0.498038,0.39,0,
+ 0.491298,0.628833,0, 0.502197,0.620163,0, 0.498038,0.39,0,
+ 0.498038,0.39,0, 0.502197,0.620163,0, 0.52,0.411962,0,
+ 0.502197,0.620163,0, 0.512944,0.611304,0, 0.52,0.411962,0,
+ 0.52,0.411962,0, 0.512944,0.611304,0, 0.523535,0.602258,0,
+ 0.49,0.36,0, 0.498039,0.33,0, 0.51,0.221962,0,
+ 0.498039,0.33,0, 0.52,0.308039,0, 0.51,0.221962,0,
+ 0.51,0.221962,0, 0.52,0.308039,0, 0.54,0.23,0,
+ 0.52,0.308039,0, 0.55,0.3,0, 0.54,0.23,0,
+ 0.54,0.23,0, 0.55,0.3,0, 0.57,0.221962,0,
+ 0.55,0.3,0, 0.58,0.308039,0, 0.57,0.221962,0,
+ 0.57,0.221962,0, 0.58,0.308039,0, 0.591962,0.2,0,
+ 0.58,0.308039,0, 0.601962,0.33,0, 0.591962,0.2,0,
+ 0.591962,0.2,0, 0.601962,0.33,0, 0.6,0.17,0,
+ 0.488038,0.2,0, 0.480248,0.637311,0, 0.491298,0.628833,0,
+ 0.26,0.452,0, 0.216,0.293,0, 0.192,0.332,0,
+ 0.102,0.178,0, 0.21,0,0, 0,0,0,
+};
diff --git a/hacks/glx/dolphin.c b/hacks/glx/dolphin.c
new file mode 100644
index 0000000..2ef4e33
--- /dev/null
+++ b/hacks/glx/dolphin.c
@@ -0,0 +1,2061 @@
+/* atlantis --- Shows moving 3D sea animals */
+
+#if 0
+static const char sccsid[] = "@(#)dolphin.c 1.2 98/06/16 xlockmore";
+#endif
+
+/* Copyright (c) E. Lassauge, 1998. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by Mark J. Kilgard
+ * as a demo for openGL programming.
+ *
+ * Porting it to xlock was possible by comparing the original Mesa's morph3d
+ * demo with it's ported version to xlock, so thanks for Marcelo F. Vianna
+ * (look at morph3d.c) for his indirect help.
+ *
+ * Thanks goes also to Brian Paul for making it possible and inexpensive
+ * to use OpenGL at home.
+ *
+ * My e-mail address is lassauge@sagem.fr
+ *
+ * Eric Lassauge (May-13-1998)
+ *
+ */
+
+/**
+ * (c) Copyright 1993, 1994, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States. Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+
+#ifdef USE_GL
+
+#include "atlantis.h"
+
+/* *INDENT-OFF* */
+static const float N001[3] = {-0.005937, -0.101998, -0.994767};
+static const float N002[3] = {0.93678, -0.200803, 0.286569};
+static const float N003[3] = {-0.233062, 0.972058, 0.028007};
+#if 0
+static const float N004[3] = {0, 1, 0};
+#endif
+static const float N005[3] = {0.898117, 0.360171, 0.252315};
+static const float N006[3] = {-0.915437, 0.348456, 0.201378};
+static const float N007[3] = {0.602263, -0.777527, 0.18092};
+static const float N008[3] = {-0.906912, -0.412015, 0.088061};
+#if 0
+static const float N009[3] = {-0.015623, 0.999878, 0};
+static const float N010[3] = {0, -0.992278, 0.124035};
+static const float N011[3] = {0, -0.936329, -0.351123};
+#endif
+static const float N012[3] = {0.884408, -0.429417, -0.182821};
+static const float N013[3] = {0.921121, 0.311084, -0.234016};
+static const float N014[3] = {0.382635, 0.877882, -0.287948};
+static const float N015[3] = {-0.380046, 0.888166, -0.258316};
+static const float N016[3] = {-0.891515, 0.392238, -0.226607};
+static const float N017[3] = {-0.901419, -0.382002, -0.203763};
+static const float N018[3] = {-0.367225, -0.911091, -0.187243};
+static const float N019[3] = {0.339539, -0.924846, -0.171388};
+static const float N020[3] = {0.914706, -0.378617, -0.14129};
+static const float N021[3] = {0.950662, 0.262713, -0.164994};
+static const float N022[3] = {0.546359, 0.80146, -0.243218};
+static const float N023[3] = {-0.315796, 0.917068, -0.243431};
+static const float N024[3] = {-0.825687, 0.532277, -0.186875};
+static const float N025[3] = {-0.974763, -0.155232, -0.160435};
+static const float N026[3] = {-0.560596, -0.816658, -0.137119};
+static const float N027[3] = {0.38021, -0.910817, -0.160786};
+static const float N028[3] = {0.923772, -0.358322, -0.135093};
+static const float N029[3] = {0.951202, 0.275053, -0.139859};
+static const float N030[3] = {0.686099, 0.702548, -0.188932};
+static const float N031[3] = {-0.521865, 0.826719, -0.21022};
+static const float N032[3] = {-0.92382, 0.346739, -0.162258};
+static const float N033[3] = {-0.902095, -0.409995, -0.134646};
+static const float N034[3] = {-0.509115, -0.848498, -0.144404};
+static const float N035[3] = {0.456469, -0.880293, -0.129305};
+static const float N036[3] = {0.873401, -0.475489, -0.105266};
+static const float N037[3] = {0.970825, 0.179861, -0.158584};
+static const float N038[3] = {0.675609, 0.714187, -0.183004};
+static const float N039[3] = {-0.523574, 0.830212, -0.19136};
+static const float N040[3] = {-0.958895, 0.230808, -0.165071};
+static const float N041[3] = {-0.918285, -0.376803, -0.121542};
+static const float N042[3] = {-0.622467, -0.774167, -0.114888};
+static const float N043[3] = {0.404497, -0.908807, -0.102231};
+static const float N044[3] = {0.930538, -0.365155, -0.027588};
+static const float N045[3] = {0.92192, 0.374157, -0.100345};
+static const float N046[3] = {0.507346, 0.860739, 0.041562};
+static const float N047[3] = {-0.394646, 0.918815, -0.00573};
+static const float N048[3] = {-0.925411, 0.373024, -0.066837};
+static const float N049[3] = {-0.945337, -0.322309, -0.049551};
+static const float N050[3] = {-0.660437, -0.750557, -0.022072};
+static const float N051[3] = {0.488835, -0.87195, -0.027261};
+static const float N052[3] = {0.902599, -0.421397, 0.087969};
+static const float N053[3] = {0.938636, 0.322606, 0.12202};
+static const float N054[3] = {0.484605, 0.871078, 0.079878};
+static const float N055[3] = {-0.353607, 0.931559, 0.084619};
+static const float N056[3] = {-0.867759, 0.478564, 0.134054};
+static const float N057[3] = {-0.951583, -0.29603, 0.082794};
+static const float N058[3] = {-0.672355, -0.730209, 0.121384};
+static const float N059[3] = {0.528336, -0.842452, 0.105525};
+static const float N060[3] = {0.786913, -0.56476, 0.248627};
+#if 0
+static const float N061[3] = {0, 1, 0};
+#endif
+static const float N062[3] = {0.622098, 0.76523, 0.165584};
+static const float N063[3] = {-0.631711, 0.767816, 0.106773};
+static const float N064[3] = {-0.687886, 0.606351, 0.398938};
+static const float N065[3] = {-0.946327, -0.281623, 0.158598};
+static const float N066[3] = {-0.509549, -0.860437, 0.002776};
+static const float N067[3] = {0.462594, -0.876692, 0.131977};
+#if 0
+static const float N068[3] = {0, -0.992278, 0.124035};
+static const float N069[3] = {0, -0.970143, -0.242536};
+static const float N070[3] = {0.015502, 0.992159, -0.12402};
+#endif
+static const float N071[3] = {0, 1, 0};
+#if 0
+static const float N072[3] = {0, 1, 0};
+static const float N073[3] = {0, 1, 0};
+static const float N074[3] = {0, -1, 0};
+static const float N075[3] = {-0.242536, 0, -0.970143};
+static const float N076[3] = {-0.010336, -0.992225, -0.124028};
+#endif
+static const float N077[3] = {-0.88077, 0.461448, 0.106351};
+static const float N078[3] = {-0.88077, 0.461448, 0.106351};
+static const float N079[3] = {-0.88077, 0.461448, 0.106351};
+static const float N080[3] = {-0.88077, 0.461448, 0.106351};
+static const float N081[3] = {-0.571197, 0.816173, 0.087152};
+static const float N082[3] = {-0.88077, 0.461448, 0.106351};
+static const float N083[3] = {-0.571197, 0.816173, 0.087152};
+static const float N084[3] = {-0.571197, 0.816173, 0.087152};
+static const float N085[3] = {-0.88077, 0.461448, 0.106351};
+static const float N086[3] = {-0.571197, 0.816173, 0.087152};
+static const float N087[3] = {-0.88077, 0.461448, 0.106351};
+static const float N088[3] = {-0.88077, 0.461448, 0.106351};
+static const float N089[3] = {-0.88077, 0.461448, 0.106351};
+static const float N090[3] = {-0.88077, 0.461448, 0.106351};
+static const float N091[3] = {0, 1, 0};
+static const float N092[3] = {0, 1, 0};
+static const float N093[3] = {0, 1, 0};
+static const float N094[3] = {1, 0, 0};
+static const float N095[3] = {-1, 0, 0};
+#if 0
+static const float N096[3] = {0, 1, 0};
+#endif
+static const float N097[3] = {-0.697296, 0.702881, 0.140491};
+static const float N098[3] = {0.918864, 0.340821, 0.198819};
+static const float N099[3] = {-0.932737, 0.201195, 0.299202};
+static const float N100[3] = {0.029517, 0.981679, 0.188244};
+#if 0
+static const float N101[3] = {0, 1, 0};
+#endif
+static const float N102[3] = {0.813521, -0.204936, 0.544229};
+#if 0
+static const float N103[3] = {0, 1, 0};
+static const float N104[3] = {0, 1, 0};
+static const float N105[3] = {0, 1, 0};
+static const float N106[3] = {0, 1, 0};
+static const float N107[3] = {0, 1, 0};
+static const float N108[3] = {0, 1, 0};
+static const float N109[3] = {0, 1, 0};
+#endif
+static const float N110[3] = {-0.78148, -0.384779, 0.491155};
+static const float N111[3] = {-0.722243, 0.384927, 0.574627};
+static const float N112[3] = {-0.752278, 0.502679, 0.425901};
+static const float N113[3] = {0.547257, 0.36791, 0.751766};
+static const float N114[3] = {0.725949, -0.232568, 0.647233};
+static const float N115[3] = {-0.747182, -0.660786, 0.07128};
+static const float N116[3] = {0.931519, 0.200748, 0.30327};
+static const float N117[3] = {-0.828928, 0.313757, 0.463071};
+static const float N118[3] = {0.902554, -0.370967, 0.218587};
+static const float N119[3] = {-0.879257, -0.441851, 0.177973};
+static const float N120[3] = {0.642327, 0.611901, 0.461512};
+static const float N121[3] = {0.964817, -0.202322, 0.16791};
+static const float N122[3] = {0, 1, 0};
+#if 0
+static const float N123[3] = {-0.980734, 0.041447, 0.1909};
+static const float N124[3] = {-0.980734, 0.041447, 0.1909};
+static const float N125[3] = {-0.980734, 0.041447, 0.1909};
+static const float N126[3] = {0, 1, 0};
+static const float N127[3] = {0, 1, 0};
+static const float N128[3] = {0, 1, 0};
+static const float N129[3] = {0.96325, 0.004839, 0.268565};
+static const float N130[3] = {0.96325, 0.004839, 0.268565};
+static const float N131[3] = {0.96325, 0.004839, 0.268565};
+static const float N132[3] = {0, 1, 0};
+static const float N133[3] = {0, 1, 0};
+static const float N134[3] = {0, 1, 0};
+#endif
+static float P001[3] = {5.68, -300.95, 1324.7};
+static const float P002[3] = {338.69, -219.63, 9677.03};
+static const float P003[3] = {12.18, 474.59, 9138.14};
+#if 0
+static const float P004[3] = {-7.49, -388.91, 10896.74};
+#endif
+static const float P005[3] = {487.51, 198.05, 9350.78};
+static const float P006[3] = {-457.61, 68.74, 9427.85};
+static const float P007[3] = {156.52, -266.72, 10311.68};
+static const float P008[3] = {-185.56, -266.51, 10310.47};
+static float P009[3] = {124.39, -261.46, 1942.34};
+static float P010[3] = {-130.05, -261.46, 1946.03};
+static float P011[3] = {141.07, -320.11, 1239.38};
+static float P012[3] = {156.48, -360.12, 2073.41};
+static float P013[3] = {162, -175.88, 2064.44};
+static float P014[3] = {88.16, -87.72, 2064.02};
+static float P015[3] = {-65.21, -96.13, 2064.02};
+static float P016[3] = {-156.48, -180.96, 2064.44};
+static float P017[3] = {-162, -368.93, 2082.39};
+static float P018[3] = {-88.16, -439.22, 2082.39};
+static float P019[3] = {65.21, -440.32, 2083.39};
+static float P020[3] = {246.87, -356.02, 2576.95};
+static float P021[3] = {253.17, -111.15, 2567.15};
+static float P022[3] = {132.34, 51.41, 2559.84};
+static float P023[3] = {-97.88, 40.44, 2567.15};
+static float P024[3] = {-222.97, -117.49, 2567.15};
+static float P025[3] = {-252.22, -371.53, 2569.92};
+static float P026[3] = {-108.44, -518.19, 2586.75};
+static float P027[3] = {97.88, -524.79, 2586.75};
+static float P028[3] = {370.03, -421.19, 3419.7};
+static float P029[3] = {351.15, -16.98, 3423.17};
+static float P030[3] = {200.66, 248.46, 3430.37};
+static float P031[3] = {-148.42, 235.02, 3417.91};
+static float P032[3] = {-360.21, -30.27, 3416.84};
+static float P033[3] = {-357.9, -414.89, 3407.04};
+static float P034[3] = {-148.88, -631.35, 3409.9};
+static float P035[3] = {156.38, -632.59, 3419.7};
+static float P036[3] = {462.61, -469.21, 4431.51};
+static float P037[3] = {466.6, 102.25, 4434.98};
+static float P038[3] = {243.05, 474.34, 4562.02};
+static float P039[3] = {-191.23, 474.4, 4554.42};
+static float P040[3] = {-476.12, 111.05, 4451.11};
+static float P041[3] = {-473.36, -470.74, 4444.78};
+static float P042[3] = {-266.95, -748.41, 4447.78};
+static float P043[3] = {211.14, -749.91, 4429.73};
+static float P044[3] = {680.57, -370.27, 5943.46};
+static float P045[3] = {834.01, 363.09, 6360.63};
+static float P046[3] = {371.29, 804.51, 6486.26};
+static float P047[3] = {-291.43, 797.22, 6494.28};
+static float P048[3] = {-784.13, 370.75, 6378.01};
+static float P049[3] = {-743.29, -325.82, 5943.46};
+static float P050[3] = {-383.24, -804.77, 5943.46};
+static float P051[3] = {283.47, -846.09, 5943.46};
+static const float iP001[3] = {5.68, -300.95, 1324.7};
+#if 0
+static const float iP002[3] = {338.69, -219.63, 9677.03};
+static const float iP003[3] = {12.18, 624.93, 8956.39};
+static const float iP004[3] = {-7.49, -388.91, 10896.74};
+static const float iP005[3] = {487.51, 198.05, 9350.78};
+static const float iP006[3] = {-457.61, 199.04, 9353.01};
+static const float iP007[3] = {156.52, -266.72, 10311.68};
+static const float iP008[3] = {-185.56, -266.51, 10310.47};
+#endif
+static const float iP009[3] = {124.39, -261.46, 1942.34};
+static const float iP010[3] = {-130.05, -261.46, 1946.03};
+static const float iP011[3] = {141.07, -320.11, 1239.38};
+static const float iP012[3] = {156.48, -360.12, 2073.41};
+static const float iP013[3] = {162, -175.88, 2064.44};
+static const float iP014[3] = {88.16, -87.72, 2064.02};
+static const float iP015[3] = {-65.21, -96.13, 2064.02};
+static const float iP016[3] = {-156.48, -180.96, 2064.44};
+static const float iP017[3] = {-162, -368.93, 2082.39};
+static const float iP018[3] = {-88.16, -439.22, 2082.39};
+static const float iP019[3] = {65.21, -440.32, 2083.39};
+static const float iP020[3] = {246.87, -356.02, 2576.95};
+static const float iP021[3] = {253.17, -111.15, 2567.15};
+static const float iP022[3] = {132.34, 51.41, 2559.84};
+static const float iP023[3] = {-97.88, 40.44, 2567.15};
+static const float iP024[3] = {-222.97, -117.49, 2567.15};
+static const float iP025[3] = {-252.22, -371.53, 2569.92};
+static const float iP026[3] = {-108.44, -518.19, 2586.75};
+static const float iP027[3] = {97.88, -524.79, 2586.75};
+static const float iP028[3] = {370.03, -421.19, 3419.7};
+static const float iP029[3] = {351.15, -16.98, 3423.17};
+static const float iP030[3] = {200.66, 248.46, 3430.37};
+static const float iP031[3] = {-148.42, 235.02, 3417.91};
+static const float iP032[3] = {-360.21, -30.27, 3416.84};
+static const float iP033[3] = {-357.9, -414.89, 3407.04};
+static const float iP034[3] = {-148.88, -631.35, 3409.9};
+static const float iP035[3] = {156.38, -632.59, 3419.7};
+static const float iP036[3] = {462.61, -469.21, 4431.51};
+static const float iP037[3] = {466.6, 102.25, 4434.98};
+static const float iP038[3] = {243.05, 474.34, 4562.02};
+static const float iP039[3] = {-191.23, 474.4, 4554.42};
+static const float iP040[3] = {-476.12, 111.05, 4451.11};
+static const float iP041[3] = {-473.36, -470.74, 4444.78};
+static const float iP042[3] = {-266.95, -748.41, 4447.78};
+static const float iP043[3] = {211.14, -749.91, 4429.73};
+static const float iP044[3] = {680.57, -370.27, 5943.46};
+static const float iP045[3] = {834.01, 363.09, 6360.63};
+static const float iP046[3] = {371.29, 804.51, 6486.26};
+static const float iP047[3] = {-291.43, 797.22, 6494.28};
+static const float iP048[3] = {-784.13, 370.75, 6378.01};
+static const float iP049[3] = {-743.29, -325.82, 5943.46};
+static const float iP050[3] = {-383.24, -804.77, 5943.46};
+static const float iP051[3] = {283.47, -846.09, 5943.46};
+static const float P052[3] = {599.09, -300.15, 7894.03};
+static const float P053[3] = {735.48, 306.26, 7911.92};
+static const float P054[3] = {246.22, 558.53, 8460.5};
+static const float P055[3] = {-230.41, 559.84, 8473.23};
+static const float P056[3] = {-698.66, 320.83, 7902.59};
+static const float P057[3] = {-643.29, -299.16, 7902.59};
+static const float P058[3] = {-341.47, -719.3, 7902.59};
+static const float P059[3] = {252.57, -756.12, 7902.59};
+static const float P060[3] = {458.39, -265.31, 9355.44};
+#if 0
+static const float P061[3] = {433.38, -161.9, 9503.03};
+#endif
+static const float P062[3] = {224.04, 338.75, 9450.3};
+static const float P063[3] = {-165.71, 341.04, 9462.35};
+static const float P064[3] = {-298.11, 110.13, 10180.37};
+static const float P065[3] = {-473.99, -219.71, 9355.44};
+static const float P066[3] = {-211.97, -479.87, 9355.44};
+static const float P067[3] = {192.86, -491.45, 9348.73};
+static float P068[3] = {-136.29, -319.84, 1228.73};
+static float P069[3] = {1111.17, -314.14, 1314.19};
+static float P070[3] = {-1167.34, -321.61, 1319.45};
+static float P071[3] = {1404.86, -306.66, 1235.45};
+static float P072[3] = {-1409.73, -314.14, 1247.66};
+static float P073[3] = {1254.01, -296.87, 1544.58};
+static float P074[3] = {-1262.09, -291.7, 1504.26};
+static float P075[3] = {965.71, -269.26, 1742.65};
+static float P076[3] = {-900.97, -276.74, 1726.07};
+static const float iP068[3] = {-136.29, -319.84, 1228.73};
+static const float iP069[3] = {1111.17, -314.14, 1314.19};
+static const float iP070[3] = {-1167.34, -321.61, 1319.45};
+static const float iP071[3] = {1404.86, -306.66, 1235.45};
+static const float iP072[3] = {-1409.73, -314.14, 1247.66};
+static const float iP073[3] = {1254.01, -296.87, 1544.58};
+static const float iP074[3] = {-1262.09, -291.7, 1504.26};
+static const float iP075[3] = {965.71, -269.26, 1742.65};
+static const float iP076[3] = {-900.97, -276.74, 1726.07};
+static const float P077[3] = {1058, -448.81, 8194.66};
+static const float P078[3] = {-1016.51, -456.43, 8190.62};
+static const float P079[3] = {-1515.96, -676.45, 7754.93};
+static const float P080[3] = {1856.75, -830.34, 7296.56};
+static const float P081[3] = {1472.16, -497.38, 7399.68};
+static const float P082[3] = {-1775.26, -829.51, 7298.46};
+static const float P083[3] = {911.09, -252.51, 7510.99};
+static const float P084[3] = {-1451.94, -495.62, 7384.3};
+static const float P085[3] = {1598.75, -669.26, 7769.9};
+static const float P086[3] = {-836.53, -250.08, 7463.25};
+static const float P087[3] = {722.87, -158.18, 8006.41};
+static const float P088[3] = {-688.86, -162.28, 7993.89};
+static const float P089[3] = {-626.92, -185.3, 8364.98};
+static const float P090[3] = {647.72, -189.46, 8354.99};
+static float P091[3] = {0, 835.01, 5555.62};
+static float P092[3] = {0, 1350.18, 5220.86};
+static float P093[3] = {0, 1422.94, 5285.27};
+static float P094[3] = {0, 1296.75, 5650.19};
+static float P095[3] = {0, 795.63, 6493.88};
+static const float iP091[3] = {0, 835.01, 5555.62};
+static const float iP092[3] = {0, 1350.18, 5220.86};
+static const float iP093[3] = {0, 1422.94, 5285.27};
+static const float iP094[3] = {0, 1296.75, 5650.19};
+static const float iP095[3] = {0, 795.63, 6493.88};
+#if 0
+static const float P096[3] = {-447.38, -165.99, 9499.6};
+#endif
+static float P097[3] = {-194.91, -357.14, 10313.32};
+static float P098[3] = {135.35, -357.66, 10307.94};
+static const float iP097[3] = {-194.91, -357.14, 10313.32};
+static const float iP098[3] = {135.35, -357.66, 10307.94};
+static const float P099[3] = {-380.53, -221.14, 9677.98};
+static const float P100[3] = {0, 412.99, 9629.33};
+#if 0
+static const float P101[3] = {5.7, 567, 7862.98};
+#endif
+static float P102[3] = {59.51, -412.55, 10677.58};
+static const float iP102[3] = {59.51, -412.55, 10677.58};
+static const float P103[3] = {6.5, 484.74, 9009.94};
+#if 0
+static const float P104[3] = {-9.86, 567.62, 7858.65};
+#endif
+static const float P105[3] = {-41.86, 476.51, 9078.17};
+#if 0
+static const float P106[3] = {22.75, 568.13, 7782.83};
+static const float P107[3] = {58.93, 568.42, 7775.94};
+#endif
+static const float P108[3] = {49.2, 476.83, 9078.24};
+#if 0
+static const float P109[3] = {99.21, 566, 7858.65};
+#endif
+static float P110[3] = {-187.62, -410.04, 10674.12};
+static const float iP110[3] = {-187.62, -410.04, 10674.12};
+static float P111[3] = {-184.25, -318.7, 10723.88};
+static const float iP111[3] = {-184.25, -318.7, 10723.88};
+static const float P112[3] = {-179.61, -142.81, 10670.26};
+static const float P113[3] = {57.43, -147.94, 10675.26};
+static const float P114[3] = {54.06, -218.9, 10712.44};
+static const float P115[3] = {-186.35, -212.09, 10713.76};
+static const float P116[3] = {205.9, -84.61, 10275.97};
+static const float P117[3] = {-230.96, -83.26, 10280.09};
+static const float iP118[3] = {216.78, -509.17, 10098.94};
+static const float iP119[3] = {-313.21, -510.79, 10102.62};
+static float P118[3] = {216.78, -509.17, 10098.94};
+static float P119[3] = {-313.21, -510.79, 10102.62};
+static const float P120[3] = {217.95, 96.34, 10161.62};
+static float P121[3] = {71.99, -319.74, 10717.7};
+static const float iP121[3] = {71.99, -319.74, 10717.7};
+static float P122[3] = {0, 602.74, 5375.84};
+static const float iP122[3] = {0, 602.74, 5375.84};
+static const float P123[3] = {-448.94, -203.14, 9499.6};
+static const float P124[3] = {-442.64, -185.2, 9528.07};
+static const float P125[3] = {-441.07, -148.05, 9528.07};
+static const float P126[3] = {-443.43, -128.84, 9499.6};
+static const float P127[3] = {-456.87, -146.78, 9466.67};
+static const float P128[3] = {-453.68, -183.93, 9466.67};
+static const float P129[3] = {428.43, -124.08, 9503.03};
+static const float P130[3] = {419.73, -142.14, 9534.56};
+static const float P131[3] = {419.92, -179.96, 9534.56};
+static const float P132[3] = {431.2, -199.73, 9505.26};
+static const float P133[3] = {442.28, -181.67, 9475.96};
+static const float P134[3] = {442.08, -143.84, 9475.96};
+/* *INDENT-ON* */
+
+
+
+static void
+Dolphin001(GLenum cap)
+{
+ glNormal3fv(N071);
+ glBegin(cap);
+ glVertex3fv(P001);
+ glVertex3fv(P068);
+ glVertex3fv(P010);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P068);
+ glVertex3fv(P076);
+ glVertex3fv(P010);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P068);
+ glVertex3fv(P070);
+ glVertex3fv(P076);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P076);
+ glVertex3fv(P070);
+ glVertex3fv(P074);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P070);
+ glVertex3fv(P072);
+ glVertex3fv(P074);
+ glEnd();
+ glNormal3fv(N119);
+ glBegin(cap);
+ glVertex3fv(P072);
+ glVertex3fv(P070);
+ glVertex3fv(P074);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P074);
+ glVertex3fv(P070);
+ glVertex3fv(P076);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P070);
+ glVertex3fv(P068);
+ glVertex3fv(P076);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P076);
+ glVertex3fv(P068);
+ glVertex3fv(P010);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P068);
+ glVertex3fv(P001);
+ glVertex3fv(P010);
+ glEnd();
+}
+
+static void
+Dolphin002(GLenum cap)
+{
+ glNormal3fv(N071);
+ glBegin(cap);
+ glVertex3fv(P011);
+ glVertex3fv(P001);
+ glVertex3fv(P009);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P075);
+ glVertex3fv(P011);
+ glVertex3fv(P009);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P069);
+ glVertex3fv(P011);
+ glVertex3fv(P075);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P069);
+ glVertex3fv(P075);
+ glVertex3fv(P073);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P071);
+ glVertex3fv(P069);
+ glVertex3fv(P073);
+ glEnd();
+ glNormal3fv(N119);
+ glBegin(cap);
+ glVertex3fv(P001);
+ glVertex3fv(P011);
+ glVertex3fv(P009);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P009);
+ glVertex3fv(P011);
+ glVertex3fv(P075);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P011);
+ glVertex3fv(P069);
+ glVertex3fv(P075);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P069);
+ glVertex3fv(P073);
+ glVertex3fv(P075);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P069);
+ glVertex3fv(P071);
+ glVertex3fv(P073);
+ glEnd();
+}
+
+static void
+Dolphin003(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N018);
+ glVertex3fv(P018);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N019);
+ glVertex3fv(P019);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N019);
+ glVertex3fv(P019);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N012);
+ glVertex3fv(P012);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N017);
+ glVertex3fv(P017);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N018);
+ glVertex3fv(P018);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N017);
+ glVertex3fv(P017);
+ glNormal3fv(N016);
+ glVertex3fv(P016);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N013);
+ glVertex3fv(P013);
+ glNormal3fv(N012);
+ glVertex3fv(P012);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N016);
+ glVertex3fv(P016);
+ glNormal3fv(N015);
+ glVertex3fv(P015);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N014);
+ glVertex3fv(P014);
+ glNormal3fv(N013);
+ glVertex3fv(P013);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N001);
+ glVertex3fv(P001);
+ glNormal3fv(N015);
+ glVertex3fv(P015);
+ glNormal3fv(N014);
+ glVertex3fv(P014);
+ glEnd();
+}
+
+static void
+Dolphin004(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N014);
+ glVertex3fv(P014);
+ glNormal3fv(N015);
+ glVertex3fv(P015);
+ glNormal3fv(N023);
+ glVertex3fv(P023);
+ glNormal3fv(N022);
+ glVertex3fv(P022);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N015);
+ glVertex3fv(P015);
+ glNormal3fv(N016);
+ glVertex3fv(P016);
+ glNormal3fv(N024);
+ glVertex3fv(P024);
+ glNormal3fv(N023);
+ glVertex3fv(P023);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N016);
+ glVertex3fv(P016);
+ glNormal3fv(N017);
+ glVertex3fv(P017);
+ glNormal3fv(N025);
+ glVertex3fv(P025);
+ glNormal3fv(N024);
+ glVertex3fv(P024);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N017);
+ glVertex3fv(P017);
+ glNormal3fv(N018);
+ glVertex3fv(P018);
+ glNormal3fv(N026);
+ glVertex3fv(P026);
+ glNormal3fv(N025);
+ glVertex3fv(P025);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N013);
+ glVertex3fv(P013);
+ glNormal3fv(N014);
+ glVertex3fv(P014);
+ glNormal3fv(N022);
+ glVertex3fv(P022);
+ glNormal3fv(N021);
+ glVertex3fv(P021);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N012);
+ glVertex3fv(P012);
+ glNormal3fv(N013);
+ glVertex3fv(P013);
+ glNormal3fv(N021);
+ glVertex3fv(P021);
+ glNormal3fv(N020);
+ glVertex3fv(P020);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N018);
+ glVertex3fv(P018);
+ glNormal3fv(N019);
+ glVertex3fv(P019);
+ glNormal3fv(N027);
+ glVertex3fv(P027);
+ glNormal3fv(N026);
+ glVertex3fv(P026);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N019);
+ glVertex3fv(P019);
+ glNormal3fv(N012);
+ glVertex3fv(P012);
+ glNormal3fv(N020);
+ glVertex3fv(P020);
+ glNormal3fv(N027);
+ glVertex3fv(P027);
+ glEnd();
+}
+
+static void
+Dolphin005(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N022);
+ glVertex3fv(P022);
+ glNormal3fv(N023);
+ glVertex3fv(P023);
+ glNormal3fv(N031);
+ glVertex3fv(P031);
+ glNormal3fv(N030);
+ glVertex3fv(P030);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N021);
+ glVertex3fv(P021);
+ glNormal3fv(N022);
+ glVertex3fv(P022);
+ glNormal3fv(N030);
+ glVertex3fv(P030);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N021);
+ glVertex3fv(P021);
+ glNormal3fv(N030);
+ glVertex3fv(P030);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N023);
+ glVertex3fv(P023);
+ glNormal3fv(N024);
+ glVertex3fv(P024);
+ glNormal3fv(N031);
+ glVertex3fv(P031);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N024);
+ glVertex3fv(P024);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glNormal3fv(N031);
+ glVertex3fv(P031);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N024);
+ glVertex3fv(P024);
+ glNormal3fv(N025);
+ glVertex3fv(P025);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N025);
+ glVertex3fv(P025);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N020);
+ glVertex3fv(P020);
+ glNormal3fv(N021);
+ glVertex3fv(P021);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N020);
+ glVertex3fv(P020);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glNormal3fv(N028);
+ glVertex3fv(P028);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N027);
+ glVertex3fv(P027);
+ glNormal3fv(N020);
+ glVertex3fv(P020);
+ glNormal3fv(N028);
+ glVertex3fv(P028);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N027);
+ glVertex3fv(P027);
+ glNormal3fv(N028);
+ glVertex3fv(P028);
+ glNormal3fv(N035);
+ glVertex3fv(P035);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N025);
+ glVertex3fv(P025);
+ glNormal3fv(N026);
+ glVertex3fv(P026);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glNormal3fv(N026);
+ glVertex3fv(P026);
+ glNormal3fv(N034);
+ glVertex3fv(P034);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N026);
+ glVertex3fv(P026);
+ glNormal3fv(N027);
+ glVertex3fv(P027);
+ glNormal3fv(N035);
+ glVertex3fv(P035);
+ glNormal3fv(N034);
+ glVertex3fv(P034);
+ glEnd();
+}
+
+static void
+Dolphin006(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N092);
+ glVertex3fv(P092);
+ glNormal3fv(N093);
+ glVertex3fv(P093);
+ glNormal3fv(N094);
+ glVertex3fv(P094);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N093);
+ glVertex3fv(P093);
+ glNormal3fv(N092);
+ glVertex3fv(P092);
+ glNormal3fv(N094);
+ glVertex3fv(P094);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N092);
+ glVertex3fv(P092);
+ glNormal3fv(N091);
+ glVertex3fv(P091);
+ glNormal3fv(N095);
+ glVertex3fv(P095);
+ glNormal3fv(N094);
+ glVertex3fv(P094);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N091);
+ glVertex3fv(P091);
+ glNormal3fv(N092);
+ glVertex3fv(P092);
+ glNormal3fv(N094);
+ glVertex3fv(P094);
+ glNormal3fv(N095);
+ glVertex3fv(P095);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N122);
+ glVertex3fv(P122);
+ glNormal3fv(N095);
+ glVertex3fv(P095);
+ glNormal3fv(N091);
+ glVertex3fv(P091);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N122);
+ glVertex3fv(P122);
+ glNormal3fv(N091);
+ glVertex3fv(P091);
+ glNormal3fv(N095);
+ glVertex3fv(P095);
+ glEnd();
+}
+
+static void
+Dolphin007(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N030);
+ glVertex3fv(P030);
+ glNormal3fv(N031);
+ glVertex3fv(P031);
+ glNormal3fv(N039);
+ glVertex3fv(P039);
+ glNormal3fv(N038);
+ glVertex3fv(P038);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glNormal3fv(N030);
+ glVertex3fv(P030);
+ glNormal3fv(N038);
+ glVertex3fv(P038);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glNormal3fv(N038);
+ glVertex3fv(P038);
+ glNormal3fv(N037);
+ glVertex3fv(P037);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N028);
+ glVertex3fv(P028);
+ glNormal3fv(N029);
+ glVertex3fv(P029);
+ glNormal3fv(N037);
+ glVertex3fv(P037);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N028);
+ glVertex3fv(P028);
+ glNormal3fv(N037);
+ glVertex3fv(P037);
+ glNormal3fv(N036);
+ glVertex3fv(P036);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N035);
+ glVertex3fv(P035);
+ glNormal3fv(N028);
+ glVertex3fv(P028);
+ glNormal3fv(N036);
+ glVertex3fv(P036);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N035);
+ glVertex3fv(P035);
+ glNormal3fv(N036);
+ glVertex3fv(P036);
+ glNormal3fv(N043);
+ glVertex3fv(P043);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N034);
+ glVertex3fv(P034);
+ glNormal3fv(N035);
+ glVertex3fv(P035);
+ glNormal3fv(N043);
+ glVertex3fv(P043);
+ glNormal3fv(N042);
+ glVertex3fv(P042);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glNormal3fv(N034);
+ glVertex3fv(P034);
+ glNormal3fv(N042);
+ glVertex3fv(P042);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glNormal3fv(N042);
+ glVertex3fv(P042);
+ glNormal3fv(N041);
+ glVertex3fv(P041);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N031);
+ glVertex3fv(P031);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glNormal3fv(N039);
+ glVertex3fv(P039);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N039);
+ glVertex3fv(P039);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glNormal3fv(N040);
+ glVertex3fv(P040);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N032);
+ glVertex3fv(P032);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glNormal3fv(N040);
+ glVertex3fv(P040);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N040);
+ glVertex3fv(P040);
+ glNormal3fv(N033);
+ glVertex3fv(P033);
+ glNormal3fv(N041);
+ glVertex3fv(P041);
+ glEnd();
+}
+
+static void
+Dolphin008(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N042);
+ glVertex3fv(P042);
+ glNormal3fv(N043);
+ glVertex3fv(P043);
+ glNormal3fv(N051);
+ glVertex3fv(P051);
+ glNormal3fv(N050);
+ glVertex3fv(P050);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N043);
+ glVertex3fv(P043);
+ glNormal3fv(N036);
+ glVertex3fv(P036);
+ glNormal3fv(N051);
+ glVertex3fv(P051);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N051);
+ glVertex3fv(P051);
+ glNormal3fv(N036);
+ glVertex3fv(P036);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N041);
+ glVertex3fv(P041);
+ glNormal3fv(N042);
+ glVertex3fv(P042);
+ glNormal3fv(N050);
+ glVertex3fv(P050);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N041);
+ glVertex3fv(P041);
+ glNormal3fv(N050);
+ glVertex3fv(P050);
+ glNormal3fv(N049);
+ glVertex3fv(P049);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N036);
+ glVertex3fv(P036);
+ glNormal3fv(N037);
+ glVertex3fv(P037);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glNormal3fv(N037);
+ glVertex3fv(P037);
+ glNormal3fv(N045);
+ glVertex3fv(P045);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N040);
+ glVertex3fv(P040);
+ glNormal3fv(N041);
+ glVertex3fv(P041);
+ glNormal3fv(N049);
+ glVertex3fv(P049);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N040);
+ glVertex3fv(P040);
+ glNormal3fv(N049);
+ glVertex3fv(P049);
+ glNormal3fv(N048);
+ glVertex3fv(P048);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N039);
+ glVertex3fv(P039);
+ glNormal3fv(N040);
+ glVertex3fv(P040);
+ glNormal3fv(N048);
+ glVertex3fv(P048);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N039);
+ glVertex3fv(P039);
+ glNormal3fv(N048);
+ glVertex3fv(P048);
+ glNormal3fv(N047);
+ glVertex3fv(P047);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N037);
+ glVertex3fv(P037);
+ glNormal3fv(N038);
+ glVertex3fv(P038);
+ glNormal3fv(N045);
+ glVertex3fv(P045);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N038);
+ glVertex3fv(P038);
+ glNormal3fv(N046);
+ glVertex3fv(P046);
+ glNormal3fv(N045);
+ glVertex3fv(P045);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N038);
+ glVertex3fv(P038);
+ glNormal3fv(N039);
+ glVertex3fv(P039);
+ glNormal3fv(N047);
+ glVertex3fv(P047);
+ glNormal3fv(N046);
+ glVertex3fv(P046);
+ glEnd();
+}
+
+static void
+Dolphin009(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N050);
+ glVertex3fv(P050);
+ glNormal3fv(N051);
+ glVertex3fv(P051);
+ glNormal3fv(N059);
+ glVertex3fv(P059);
+ glNormal3fv(N058);
+ glVertex3fv(P058);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N051);
+ glVertex3fv(P051);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glNormal3fv(N059);
+ glVertex3fv(P059);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N059);
+ glVertex3fv(P059);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glNormal3fv(N052);
+ glVertex3fv(P052);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glNormal3fv(N045);
+ glVertex3fv(P045);
+ glNormal3fv(N053);
+ glVertex3fv(P053);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N044);
+ glVertex3fv(P044);
+ glNormal3fv(N053);
+ glVertex3fv(P053);
+ glNormal3fv(N052);
+ glVertex3fv(P052);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N049);
+ glVertex3fv(P049);
+ glNormal3fv(N050);
+ glVertex3fv(P050);
+ glNormal3fv(N058);
+ glVertex3fv(P058);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N049);
+ glVertex3fv(P049);
+ glNormal3fv(N058);
+ glVertex3fv(P058);
+ glNormal3fv(N057);
+ glVertex3fv(P057);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N048);
+ glVertex3fv(P048);
+ glNormal3fv(N049);
+ glVertex3fv(P049);
+ glNormal3fv(N057);
+ glVertex3fv(P057);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N048);
+ glVertex3fv(P048);
+ glNormal3fv(N057);
+ glVertex3fv(P057);
+ glNormal3fv(N056);
+ glVertex3fv(P056);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N047);
+ glVertex3fv(P047);
+ glNormal3fv(N048);
+ glVertex3fv(P048);
+ glNormal3fv(N056);
+ glVertex3fv(P056);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N047);
+ glVertex3fv(P047);
+ glNormal3fv(N056);
+ glVertex3fv(P056);
+ glNormal3fv(N055);
+ glVertex3fv(P055);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N045);
+ glVertex3fv(P045);
+ glNormal3fv(N046);
+ glVertex3fv(P046);
+ glNormal3fv(N053);
+ glVertex3fv(P053);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N046);
+ glVertex3fv(P046);
+ glNormal3fv(N054);
+ glVertex3fv(P054);
+ glNormal3fv(N053);
+ glVertex3fv(P053);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N046);
+ glVertex3fv(P046);
+ glNormal3fv(N047);
+ glVertex3fv(P047);
+ glNormal3fv(N055);
+ glVertex3fv(P055);
+ glNormal3fv(N054);
+ glVertex3fv(P054);
+ glEnd();
+}
+
+static void
+Dolphin010(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N080);
+ glVertex3fv(P080);
+ glNormal3fv(N081);
+ glVertex3fv(P081);
+ glNormal3fv(N085);
+ glVertex3fv(P085);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N081);
+ glVertex3fv(P081);
+ glNormal3fv(N083);
+ glVertex3fv(P083);
+ glNormal3fv(N085);
+ glVertex3fv(P085);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N085);
+ glVertex3fv(P085);
+ glNormal3fv(N083);
+ glVertex3fv(P083);
+ glNormal3fv(N077);
+ glVertex3fv(P077);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N083);
+ glVertex3fv(P083);
+ glNormal3fv(N087);
+ glVertex3fv(P087);
+ glNormal3fv(N077);
+ glVertex3fv(P077);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N077);
+ glVertex3fv(P077);
+ glNormal3fv(N087);
+ glVertex3fv(P087);
+ glNormal3fv(N090);
+ glVertex3fv(P090);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N081);
+ glVertex3fv(P081);
+ glNormal3fv(N080);
+ glVertex3fv(P080);
+ glNormal3fv(N085);
+ glVertex3fv(P085);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N083);
+ glVertex3fv(P083);
+ glNormal3fv(N081);
+ glVertex3fv(P081);
+ glNormal3fv(N085);
+ glVertex3fv(P085);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N083);
+ glVertex3fv(P083);
+ glNormal3fv(N085);
+ glVertex3fv(P085);
+ glNormal3fv(N077);
+ glVertex3fv(P077);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N087);
+ glVertex3fv(P087);
+ glNormal3fv(N083);
+ glVertex3fv(P083);
+ glNormal3fv(N077);
+ glVertex3fv(P077);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N087);
+ glVertex3fv(P087);
+ glNormal3fv(N077);
+ glVertex3fv(P077);
+ glNormal3fv(N090);
+ glVertex3fv(P090);
+ glEnd();
+}
+
+static void
+Dolphin011(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N082);
+ glVertex3fv(P082);
+ glNormal3fv(N084);
+ glVertex3fv(P084);
+ glNormal3fv(N079);
+ glVertex3fv(P079);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N084);
+ glVertex3fv(P084);
+ glNormal3fv(N086);
+ glVertex3fv(P086);
+ glNormal3fv(N079);
+ glVertex3fv(P079);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N079);
+ glVertex3fv(P079);
+ glNormal3fv(N086);
+ glVertex3fv(P086);
+ glNormal3fv(N078);
+ glVertex3fv(P078);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N086);
+ glVertex3fv(P086);
+ glNormal3fv(N088);
+ glVertex3fv(P088);
+ glNormal3fv(N078);
+ glVertex3fv(P078);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N078);
+ glVertex3fv(P078);
+ glNormal3fv(N088);
+ glVertex3fv(P088);
+ glNormal3fv(N089);
+ glVertex3fv(P089);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N088);
+ glVertex3fv(P088);
+ glNormal3fv(N086);
+ glVertex3fv(P086);
+ glNormal3fv(N089);
+ glVertex3fv(P089);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N089);
+ glVertex3fv(P089);
+ glNormal3fv(N086);
+ glVertex3fv(P086);
+ glNormal3fv(N078);
+ glVertex3fv(P078);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N086);
+ glVertex3fv(P086);
+ glNormal3fv(N084);
+ glVertex3fv(P084);
+ glNormal3fv(N078);
+ glVertex3fv(P078);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N078);
+ glVertex3fv(P078);
+ glNormal3fv(N084);
+ glVertex3fv(P084);
+ glNormal3fv(N079);
+ glVertex3fv(P079);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N084);
+ glVertex3fv(P084);
+ glNormal3fv(N082);
+ glVertex3fv(P082);
+ glNormal3fv(N079);
+ glVertex3fv(P079);
+ glEnd();
+}
+
+static void
+Dolphin012(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N058);
+ glVertex3fv(P058);
+ glNormal3fv(N059);
+ glVertex3fv(P059);
+ glNormal3fv(N067);
+ glVertex3fv(P067);
+ glNormal3fv(N066);
+ glVertex3fv(P066);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N059);
+ glVertex3fv(P059);
+ glNormal3fv(N052);
+ glVertex3fv(P052);
+ glNormal3fv(N060);
+ glVertex3fv(P060);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N059);
+ glVertex3fv(P059);
+ glNormal3fv(N060);
+ glVertex3fv(P060);
+ glNormal3fv(N067);
+ glVertex3fv(P067);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N058);
+ glVertex3fv(P058);
+ glNormal3fv(N066);
+ glVertex3fv(P066);
+ glNormal3fv(N065);
+ glVertex3fv(P065);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N058);
+ glVertex3fv(P058);
+ glNormal3fv(N065);
+ glVertex3fv(P065);
+ glNormal3fv(N057);
+ glVertex3fv(P057);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N056);
+ glVertex3fv(P056);
+ glNormal3fv(N057);
+ glVertex3fv(P057);
+ glNormal3fv(N065);
+ glVertex3fv(P065);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N056);
+ glVertex3fv(P056);
+ glNormal3fv(N065);
+ glVertex3fv(P065);
+ glNormal3fv(N006);
+ glVertex3fv(P006);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N056);
+ glVertex3fv(P056);
+ glNormal3fv(N006);
+ glVertex3fv(P006);
+ glNormal3fv(N063);
+ glVertex3fv(P063);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N056);
+ glVertex3fv(P056);
+ glNormal3fv(N063);
+ glVertex3fv(P063);
+ glNormal3fv(N055);
+ glVertex3fv(P055);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N054);
+ glVertex3fv(P054);
+ glNormal3fv(N062);
+ glVertex3fv(P062);
+ glNormal3fv(N005);
+ glVertex3fv(P005);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N054);
+ glVertex3fv(P054);
+ glNormal3fv(N005);
+ glVertex3fv(P005);
+ glNormal3fv(N053);
+ glVertex3fv(P053);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N052);
+ glVertex3fv(P052);
+ glNormal3fv(N053);
+ glVertex3fv(P053);
+ glNormal3fv(N005);
+ glVertex3fv(P005);
+ glNormal3fv(N060);
+ glVertex3fv(P060);
+ glEnd();
+}
+
+static void
+Dolphin013(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N116);
+ glVertex3fv(P116);
+ glNormal3fv(N117);
+ glVertex3fv(P117);
+ glNormal3fv(N112);
+ glVertex3fv(P112);
+ glNormal3fv(N113);
+ glVertex3fv(P113);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N114);
+ glVertex3fv(P114);
+ glNormal3fv(N113);
+ glVertex3fv(P113);
+ glNormal3fv(N112);
+ glVertex3fv(P112);
+ glNormal3fv(N115);
+ glVertex3fv(P115);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N114);
+ glVertex3fv(P114);
+ glNormal3fv(N116);
+ glVertex3fv(P116);
+ glNormal3fv(N113);
+ glVertex3fv(P113);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N114);
+ glVertex3fv(P114);
+ glNormal3fv(N007);
+ glVertex3fv(P007);
+ glNormal3fv(N116);
+ glVertex3fv(P116);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N007);
+ glVertex3fv(P007);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glNormal3fv(N116);
+ glVertex3fv(P116);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P002);
+ glVertex3fv(P007);
+ glVertex3fv(P008);
+ glVertex3fv(P099);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P007);
+ glVertex3fv(P114);
+ glVertex3fv(P115);
+ glVertex3fv(P008);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N117);
+ glVertex3fv(P117);
+ glNormal3fv(N099);
+ glVertex3fv(P099);
+ glNormal3fv(N008);
+ glVertex3fv(P008);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N117);
+ glVertex3fv(P117);
+ glNormal3fv(N008);
+ glVertex3fv(P008);
+ glNormal3fv(N112);
+ glVertex3fv(P112);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N112);
+ glVertex3fv(P112);
+ glNormal3fv(N008);
+ glVertex3fv(P008);
+ glNormal3fv(N115);
+ glVertex3fv(P115);
+ glEnd();
+}
+
+static void
+Dolphin014(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N111);
+ glVertex3fv(P111);
+ glNormal3fv(N110);
+ glVertex3fv(P110);
+ glNormal3fv(N102);
+ glVertex3fv(P102);
+ glNormal3fv(N121);
+ glVertex3fv(P121);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N111);
+ glVertex3fv(P111);
+ glNormal3fv(N097);
+ glVertex3fv(P097);
+ glNormal3fv(N110);
+ glVertex3fv(P110);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N097);
+ glVertex3fv(P097);
+ glNormal3fv(N119);
+ glVertex3fv(P119);
+ glNormal3fv(N110);
+ glVertex3fv(P110);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N097);
+ glVertex3fv(P097);
+ glNormal3fv(N099);
+ glVertex3fv(P099);
+ glNormal3fv(N119);
+ glVertex3fv(P119);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N099);
+ glVertex3fv(P099);
+ glNormal3fv(N065);
+ glVertex3fv(P065);
+ glNormal3fv(N119);
+ glVertex3fv(P119);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N065);
+ glVertex3fv(P065);
+ glNormal3fv(N066);
+ glVertex3fv(P066);
+ glNormal3fv(N119);
+ glVertex3fv(P119);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P098);
+ glVertex3fv(P097);
+ glVertex3fv(P111);
+ glVertex3fv(P121);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P002);
+ glVertex3fv(P099);
+ glVertex3fv(P097);
+ glVertex3fv(P098);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N110);
+ glVertex3fv(P110);
+ glNormal3fv(N119);
+ glVertex3fv(P119);
+ glNormal3fv(N118);
+ glVertex3fv(P118);
+ glNormal3fv(N102);
+ glVertex3fv(P102);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N119);
+ glVertex3fv(P119);
+ glNormal3fv(N066);
+ glVertex3fv(P066);
+ glNormal3fv(N067);
+ glVertex3fv(P067);
+ glNormal3fv(N118);
+ glVertex3fv(P118);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N067);
+ glVertex3fv(P067);
+ glNormal3fv(N060);
+ glVertex3fv(P060);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N067);
+ glVertex3fv(P067);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glNormal3fv(N118);
+ glVertex3fv(P118);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N118);
+ glVertex3fv(P118);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glNormal3fv(N098);
+ glVertex3fv(P098);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N118);
+ glVertex3fv(P118);
+ glNormal3fv(N098);
+ glVertex3fv(P098);
+ glNormal3fv(N102);
+ glVertex3fv(P102);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N102);
+ glVertex3fv(P102);
+ glNormal3fv(N098);
+ glVertex3fv(P098);
+ glNormal3fv(N121);
+ glVertex3fv(P121);
+ glEnd();
+}
+
+static void
+Dolphin015(GLenum cap)
+{
+ glBegin(cap);
+ glNormal3fv(N055);
+ glVertex3fv(P055);
+ glNormal3fv(N003);
+ glVertex3fv(P003);
+ glNormal3fv(N054);
+ glVertex3fv(P054);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N003);
+ glVertex3fv(P003);
+ glNormal3fv(N055);
+ glVertex3fv(P055);
+ glNormal3fv(N063);
+ glVertex3fv(P063);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N003);
+ glVertex3fv(P003);
+ glNormal3fv(N063);
+ glVertex3fv(P063);
+ glNormal3fv(N100);
+ glVertex3fv(P100);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N003);
+ glVertex3fv(P003);
+ glNormal3fv(N100);
+ glVertex3fv(P100);
+ glNormal3fv(N054);
+ glVertex3fv(P054);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N054);
+ glVertex3fv(P054);
+ glNormal3fv(N100);
+ glVertex3fv(P100);
+ glNormal3fv(N062);
+ glVertex3fv(P062);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N100);
+ glVertex3fv(P100);
+ glNormal3fv(N064);
+ glVertex3fv(P064);
+ glNormal3fv(N120);
+ glVertex3fv(P120);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N100);
+ glVertex3fv(P100);
+ glNormal3fv(N063);
+ glVertex3fv(P063);
+ glNormal3fv(N064);
+ glVertex3fv(P064);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N063);
+ glVertex3fv(P063);
+ glNormal3fv(N006);
+ glVertex3fv(P006);
+ glNormal3fv(N064);
+ glVertex3fv(P064);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N064);
+ glVertex3fv(P064);
+ glNormal3fv(N006);
+ glVertex3fv(P006);
+ glNormal3fv(N099);
+ glVertex3fv(P099);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N064);
+ glVertex3fv(P064);
+ glNormal3fv(N099);
+ glVertex3fv(P099);
+ glNormal3fv(N117);
+ glVertex3fv(P117);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N120);
+ glVertex3fv(P120);
+ glNormal3fv(N064);
+ glVertex3fv(P064);
+ glNormal3fv(N117);
+ glVertex3fv(P117);
+ glNormal3fv(N116);
+ glVertex3fv(P116);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N006);
+ glVertex3fv(P006);
+ glNormal3fv(N065);
+ glVertex3fv(P065);
+ glNormal3fv(N099);
+ glVertex3fv(P099);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N062);
+ glVertex3fv(P062);
+ glNormal3fv(N100);
+ glVertex3fv(P100);
+ glNormal3fv(N120);
+ glVertex3fv(P120);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N005);
+ glVertex3fv(P005);
+ glNormal3fv(N062);
+ glVertex3fv(P062);
+ glNormal3fv(N120);
+ glVertex3fv(P120);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N005);
+ glVertex3fv(P005);
+ glNormal3fv(N120);
+ glVertex3fv(P120);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glNormal3fv(N120);
+ glVertex3fv(P120);
+ glNormal3fv(N116);
+ glVertex3fv(P116);
+ glEnd();
+ glBegin(cap);
+ glNormal3fv(N060);
+ glVertex3fv(P060);
+ glNormal3fv(N005);
+ glVertex3fv(P005);
+ glNormal3fv(N002);
+ glVertex3fv(P002);
+ glEnd();
+}
+
+static void
+Dolphin016(GLenum cap)
+{
+
+ glDisable(GL_DEPTH_TEST);
+ glBegin(cap);
+ glVertex3fv(P123);
+ glVertex3fv(P124);
+ glVertex3fv(P125);
+ glVertex3fv(P126);
+ glVertex3fv(P127);
+ glVertex3fv(P128);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P129);
+ glVertex3fv(P130);
+ glVertex3fv(P131);
+ glVertex3fv(P132);
+ glVertex3fv(P133);
+ glVertex3fv(P134);
+ glEnd();
+ glBegin(cap);
+ glVertex3fv(P103);
+ glVertex3fv(P105);
+ glVertex3fv(P108);
+ glEnd();
+ glEnable(GL_DEPTH_TEST);
+}
+
+void
+DrawDolphin(fishRec * fish, int wire)
+{
+ float seg0, seg1, seg2, seg3, seg4, seg5, seg6, seg7;
+ float pitch, thrash, chomp;
+ GLenum cap;
+
+ fish->htail = (int) (fish->htail - (int) (10 * fish->v)) % 360;
+
+ thrash = 70 * fish->v;
+
+ seg0 = 1 * thrash * sin((fish->htail) * RRAD);
+ seg3 = 1 * thrash * sin((fish->htail) * RRAD);
+ seg1 = 2 * thrash * sin((fish->htail + 4) * RRAD);
+ seg2 = 3 * thrash * sin((fish->htail + 6) * RRAD);
+ seg4 = 4 * thrash * sin((fish->htail + 10) * RRAD);
+ seg5 = 4.5 * thrash * sin((fish->htail + 15) * RRAD);
+ seg6 = 5 * thrash * sin((fish->htail + 20) * RRAD);
+ seg7 = 6 * thrash * sin((fish->htail + 30) * RRAD);
+
+ pitch = fish->v * sin((fish->htail + 180) * RRAD);
+
+/* if (fish->v > 2) {
+ chomp = -(fish->v - 2) * 200;
+ }*/
+ chomp = 100;
+
+ P012[1] = iP012[1] + seg5;
+ P013[1] = iP013[1] + seg5;
+ P014[1] = iP014[1] + seg5;
+ P015[1] = iP015[1] + seg5;
+ P016[1] = iP016[1] + seg5;
+ P017[1] = iP017[1] + seg5;
+ P018[1] = iP018[1] + seg5;
+ P019[1] = iP019[1] + seg5;
+
+ P020[1] = iP020[1] + seg4;
+ P021[1] = iP021[1] + seg4;
+ P022[1] = iP022[1] + seg4;
+ P023[1] = iP023[1] + seg4;
+ P024[1] = iP024[1] + seg4;
+ P025[1] = iP025[1] + seg4;
+ P026[1] = iP026[1] + seg4;
+ P027[1] = iP027[1] + seg4;
+
+ P028[1] = iP028[1] + seg2;
+ P029[1] = iP029[1] + seg2;
+ P030[1] = iP030[1] + seg2;
+ P031[1] = iP031[1] + seg2;
+ P032[1] = iP032[1] + seg2;
+ P033[1] = iP033[1] + seg2;
+ P034[1] = iP034[1] + seg2;
+ P035[1] = iP035[1] + seg2;
+
+ P036[1] = iP036[1] + seg1;
+ P037[1] = iP037[1] + seg1;
+ P038[1] = iP038[1] + seg1;
+ P039[1] = iP039[1] + seg1;
+ P040[1] = iP040[1] + seg1;
+ P041[1] = iP041[1] + seg1;
+ P042[1] = iP042[1] + seg1;
+ P043[1] = iP043[1] + seg1;
+
+ P044[1] = iP044[1] + seg0;
+ P045[1] = iP045[1] + seg0;
+ P046[1] = iP046[1] + seg0;
+ P047[1] = iP047[1] + seg0;
+ P048[1] = iP048[1] + seg0;
+ P049[1] = iP049[1] + seg0;
+ P050[1] = iP050[1] + seg0;
+ P051[1] = iP051[1] + seg0;
+
+ P009[1] = iP009[1] + seg6;
+ P010[1] = iP010[1] + seg6;
+ P075[1] = iP075[1] + seg6;
+ P076[1] = iP076[1] + seg6;
+
+ P001[1] = iP001[1] + seg7;
+ P011[1] = iP011[1] + seg7;
+ P068[1] = iP068[1] + seg7;
+ P069[1] = iP069[1] + seg7;
+ P070[1] = iP070[1] + seg7;
+ P071[1] = iP071[1] + seg7;
+ P072[1] = iP072[1] + seg7;
+ P073[1] = iP073[1] + seg7;
+ P074[1] = iP074[1] + seg7;
+
+ P091[1] = iP091[1] + seg3;
+ P092[1] = iP092[1] + seg3;
+ P093[1] = iP093[1] + seg3;
+ P094[1] = iP094[1] + seg3;
+ P095[1] = iP095[1] + seg3;
+ P122[1] = iP122[1] + seg3 * 1.5;
+
+ P097[1] = iP097[1] + chomp;
+ P098[1] = iP098[1] + chomp;
+ P102[1] = iP102[1] + chomp;
+ P110[1] = iP110[1] + chomp;
+ P111[1] = iP111[1] + chomp;
+ P121[1] = iP121[1] + chomp;
+ P118[1] = iP118[1] + chomp;
+ P119[1] = iP119[1] + chomp;
+
+ glPushMatrix();
+
+ glRotatef(pitch, 1, 0, 0);
+
+ glTranslatef(0, 0, 7000);
+
+ glRotatef(180, 0, 1, 0);
+
+ glEnable(GL_CULL_FACE);
+ cap = wire ? GL_LINE_LOOP : GL_POLYGON;
+ Dolphin014(cap);
+ Dolphin010(cap);
+ Dolphin009(cap);
+ Dolphin012(cap);
+ Dolphin013(cap);
+ Dolphin006(cap);
+ Dolphin002(cap);
+ Dolphin001(cap);
+ Dolphin003(cap);
+ Dolphin015(cap);
+ Dolphin004(cap);
+ Dolphin005(cap);
+ Dolphin007(cap);
+ Dolphin008(cap);
+ Dolphin011(cap);
+ Dolphin016(cap);
+ glDisable(GL_CULL_FACE);
+
+ glPopMatrix();
+}
+#endif
diff --git a/hacks/glx/dropshadow.c b/hacks/glx/dropshadow.c
new file mode 100644
index 0000000..0a5855c
--- /dev/null
+++ b/hacks/glx/dropshadow.c
@@ -0,0 +1,181 @@
+/* dropshadow.c, Copyright (c) 2009 Jens Kilian <jjk@acm.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include <stdlib.h>
+
+#include "dropshadow.h"
+
+/* (Alpha) texture data for drop shadow.
+ */
+static int drop_shadow_width = 32;
+static int drop_shadow_height = 32;
+static unsigned char drop_shadow_data[] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1, 1, 3, 3, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 3, 3, 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 3, 4, 6, 7, 9, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 9, 7, 6, 4, 3, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 1, 1, 3, 5, 9, 13, 16, 19, 19, 21, 21, 22, 22,
+ 22, 22, 21, 21, 19, 19, 16, 13, 9, 5, 3, 1, 1, 0, 0, 0,
+ 0, 0, 1, 1, 3, 5, 10, 16, 22, 28, 32, 35, 37, 37, 38, 38,
+ 38, 38, 37, 37, 35, 32, 28, 22, 16, 10, 5, 3, 1, 1, 0, 0,
+ 0, 0, 1, 1, 4, 9, 16, 25, 34, 43, 50, 55, 58, 59, 60, 60,
+ 60, 60, 59, 58, 55, 50, 43, 34, 25, 16, 9, 4, 1, 1, 0, 0,
+ 0, 0, 1, 3, 6, 13, 22, 34, 48, 61, 70, 77, 80, 82, 83, 84,
+ 84, 83, 82, 80, 77, 70, 61, 48, 34, 22, 13, 6, 3, 1, 0, 0,
+ 0, 0, 1, 3, 7, 16, 28, 43, 61, 76, 88, 97, 102, 103, 104, 104,
+ 104, 104, 103, 102, 97, 88, 76, 61, 43, 28, 16, 7, 3, 1, 0, 0,
+ 0, 1, 1, 4, 9, 19, 32, 51, 70, 88, 103, 112, 117, 120, 121, 121,
+ 121, 121, 120, 117, 112, 103, 88, 70, 51, 32, 19, 9, 4, 1, 1, 0,
+ 0, 1, 1, 4, 10, 20, 35, 55, 77, 97, 112, 122, 128, 130, 132, 133,
+ 133, 132, 130, 128, 122, 112, 97, 77, 55, 35, 20, 10, 4, 1, 1, 0,
+ 0, 1, 1, 4, 10, 21, 37, 58, 80, 101, 117, 128, 134, 137, 138, 139,
+ 139, 138, 137, 134, 128, 117, 101, 80, 58, 37, 21, 10, 4, 1, 0, 0,
+ 0, 0, 1, 4, 10, 21, 38, 59, 82, 103, 119, 130, 137, 139, 141, 142,
+ 142, 141, 139, 137, 130, 119, 103, 82, 59, 38, 21, 10, 4, 1, 0, 0,
+ 0, 0, 1, 4, 10, 22, 38, 59, 83, 104, 121, 132, 139, 141, 142, 142,
+ 142, 142, 141, 139, 132, 121, 104, 83, 59, 38, 22, 10, 4, 1, 0, 0,
+ 0, 0, 1, 4, 10, 22, 38, 60, 84, 104, 121, 133, 139, 142, 142, 142,
+ 142, 142, 142, 139, 133, 121, 104, 84, 60, 38, 22, 10, 4, 1, 0, 0,
+ 0, 0, 1, 4, 10, 22, 38, 60, 84, 104, 121, 133, 139, 142, 142, 142,
+ 142, 142, 142, 139, 133, 121, 104, 84, 60, 38, 22, 10, 4, 1, 0, 0,
+ 0, 0, 1, 4, 10, 22, 38, 59, 83, 104, 121, 132, 139, 141, 142, 142,
+ 142, 142, 141, 139, 132, 121, 104, 83, 59, 38, 22, 10, 4, 1, 0, 0,
+ 0, 0, 1, 4, 10, 21, 38, 59, 82, 103, 119, 130, 137, 139, 141, 142,
+ 142, 141, 139, 137, 130, 119, 103, 82, 59, 38, 21, 10, 4, 1, 0, 0,
+ 0, 1, 1, 4, 10, 21, 37, 58, 80, 101, 118, 128, 134, 137, 139, 139,
+ 139, 139, 137, 134, 128, 117, 102, 80, 58, 37, 21, 10, 4, 1, 0, 0,
+ 0, 1, 1, 4, 10, 20, 35, 55, 77, 97, 112, 122, 128, 130, 132, 133,
+ 133, 132, 130, 128, 122, 112, 97, 77, 55, 35, 20, 10, 4, 1, 1, 0,
+ 0, 1, 1, 4, 9, 19, 32, 51, 70, 88, 103, 112, 117, 120, 121, 121,
+ 121, 121, 120, 117, 112, 103, 88, 70, 51, 32, 19, 9, 4, 1, 1, 0,
+ 0, 0, 1, 3, 7, 16, 28, 43, 61, 76, 88, 97, 102, 103, 104, 104,
+ 104, 104, 103, 102, 97, 88, 76, 61, 43, 28, 16, 7, 3, 1, 0, 0,
+ 0, 0, 1, 3, 6, 13, 22, 34, 48, 61, 70, 77, 80, 82, 83, 84,
+ 84, 83, 82, 80, 77, 70, 61, 48, 34, 22, 13, 6, 3, 1, 0, 0,
+ 0, 0, 1, 1, 4, 9, 16, 25, 34, 43, 50, 55, 58, 59, 60, 60,
+ 60, 60, 59, 58, 55, 50, 43, 34, 25, 16, 9, 4, 1, 1, 0, 0,
+ 0, 0, 1, 1, 3, 5, 10, 16, 22, 28, 32, 35, 37, 37, 38, 38,
+ 38, 38, 37, 37, 35, 32, 28, 22, 16, 10, 5, 3, 1, 1, 0, 0,
+ 0, 0, 0, 1, 1, 3, 5, 9, 13, 16, 19, 19, 21, 21, 22, 22,
+ 22, 22, 21, 21, 19, 19, 16, 13, 9, 5, 3, 1, 1, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 3, 4, 6, 7, 9, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 9, 7, 6, 4, 3, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1, 1, 3, 3, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 3, 3, 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+GLuint
+init_drop_shadow(void)
+{
+ GLuint t;
+
+ glGenTextures (1, &t);
+ if (t <= 0) abort();
+
+ glBindTexture (GL_TEXTURE_2D, t);
+#if 0
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+ gluBuild2DMipmaps (GL_TEXTURE_2D, GL_ALPHA,
+ drop_shadow_width, drop_shadow_height,
+ GL_ALPHA, GL_UNSIGNED_BYTE,
+ drop_shadow_data);
+#else
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_ALPHA,
+ drop_shadow_width, drop_shadow_height, 0,
+ GL_ALPHA, GL_UNSIGNED_BYTE,
+ drop_shadow_data);
+#endif
+
+ return t;
+}
+
+void
+draw_drop_shadow (GLuint t,
+ GLfloat x, GLfloat y, GLfloat z, GLfloat w, GLfloat h,
+ GLfloat r)
+{
+ /* Inner and outer boundaries of shadow. */
+ const GLfloat li = x, lo = li - r;
+ const GLfloat ri = x + w, ro = ri + r;
+ const GLfloat bi = y, bo = bi - r;
+ const GLfloat ti = y + h, to = ti + r;
+
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glEnable (GL_TEXTURE_2D);
+ glBindTexture (GL_TEXTURE_2D, t);
+
+ glBegin (GL_QUADS);
+
+ /* There's likely a better way to do this... */
+ glTexCoord2f (0.0, 0.0); glVertex3f (lo, bo, z);
+ glTexCoord2f (0.5, 0.0); glVertex3f (li, bo, z);
+ glTexCoord2f (0.5, 0.5); glVertex3f (li, bi, z);
+ glTexCoord2f (0.0, 0.5); glVertex3f (lo, bi, z);
+
+ glTexCoord2f (0.5, 0.0); glVertex3f (li, bo, z);
+ glTexCoord2f (0.5, 0.0); glVertex3f (ri, bo, z);
+ glTexCoord2f (0.5, 0.5); glVertex3f (ri, bi, z);
+ glTexCoord2f (0.5, 0.5); glVertex3f (li, bi, z);
+
+ glTexCoord2f (0.5, 0.0); glVertex3f (ri, bo, z);
+ glTexCoord2f (1.0, 0.0); glVertex3f (ro, bo, z);
+ glTexCoord2f (1.0, 0.5); glVertex3f (ro, bi, z);
+ glTexCoord2f (0.5, 0.5); glVertex3f (ri, bi, z);
+
+ glTexCoord2f (0.5, 0.5); glVertex3f (ri, bi, z);
+ glTexCoord2f (1.0, 0.5); glVertex3f (ro, bi, z);
+ glTexCoord2f (1.0, 0.5); glVertex3f (ro, ti, z);
+ glTexCoord2f (0.5, 0.5); glVertex3f (ri, ti, z);
+
+ glTexCoord2f (0.5, 0.5); glVertex3f (ri, ti, z);
+ glTexCoord2f (1.0, 0.5); glVertex3f (ro, ti, z);
+ glTexCoord2f (1.0, 1.0); glVertex3f (ro, to, z);
+ glTexCoord2f (0.5, 1.0); glVertex3f (ri, to, z);
+
+ glTexCoord2f (0.5, 0.5); glVertex3f (li, ti, z);
+ glTexCoord2f (0.5, 0.5); glVertex3f (ri, ti, z);
+ glTexCoord2f (0.5, 1.0); glVertex3f (ri, to, z);
+ glTexCoord2f (0.5, 1.0); glVertex3f (li, to, z);
+
+ glTexCoord2f (0.0, 0.5); glVertex3f (lo, ti, z);
+ glTexCoord2f (0.5, 0.5); glVertex3f (li, ti, z);
+ glTexCoord2f (0.5, 1.0); glVertex3f (li, to, z);
+ glTexCoord2f (0.0, 1.0); glVertex3f (lo, to, z);
+
+ glTexCoord2f (0.0, 0.5); glVertex3f (lo, bi, z);
+ glTexCoord2f (0.5, 0.5); glVertex3f (li, bi, z);
+ glTexCoord2f (0.5, 0.5); glVertex3f (li, ti, z);
+ glTexCoord2f (0.0, 0.5); glVertex3f (lo, ti, z);
+
+ glEnd();
+}
diff --git a/hacks/glx/dropshadow.h b/hacks/glx/dropshadow.h
new file mode 100644
index 0000000..09af0c8
--- /dev/null
+++ b/hacks/glx/dropshadow.h
@@ -0,0 +1,40 @@
+/* dropshadow.h, Copyright (c) 2009 Jens Kilian <jjk@acm.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __DROPSHADOW_H__
+#define __DROPSHADOW_H__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include "xlockmoreI.h"
+
+/* Initialize drop shadow texture, return a texture ID.
+ */
+GLuint
+init_drop_shadow(void);
+
+/* Draw a drop shadow around a rectangle.
+
+ t Texture ID (as returned by init_drop_shadow()).
+ x, y, z; w, h Position (left bottom), depth and size of rectangle.
+ r Radius of drop shadow.
+
+ The shadow will be drawn using the current color.
+ */
+
+void
+draw_drop_shadow (GLuint t,
+ GLfloat x, GLfloat y, GLfloat z, GLfloat w, GLfloat h,
+ GLfloat r);
+
+#endif /* __DROPSHADOW_H__ */
diff --git a/hacks/glx/dxf2gl.pl b/hacks/glx/dxf2gl.pl
new file mode 100755
index 0000000..9ed470c
--- /dev/null
+++ b/hacks/glx/dxf2gl.pl
@@ -0,0 +1,729 @@
+#!/usr/bin/perl -w
+# Copyright © 2003-2014 Jamie Zawinski <jwz@jwz.org>
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation. No representations are made about the suitability of this
+# software for any purpose. It is provided "as is" without express or
+# implied warranty.
+#
+# Reads a DXF file, and emits C data suitable for use with OpenGL's
+# glInterleavedArrays() and glDrawArrays() routines.
+#
+# Options:
+#
+# --normalize Compute the bounding box of the object, and scale all
+# coordinates so that the object fits inside a unit cube.
+#
+# --smooth When computing normals for the vertexes, average the
+# normals at any edge which is less than 90 degrees.
+# If this option is not specified, planar normals will be
+# used, resulting in a "faceted" object.
+#
+# --wireframe Emit lines instead of faces.
+#
+# --layers Emit a separate set of polygons for each layer in the
+# input file, instead of emitting the whole file as a
+# single unit.
+#
+# Created: 8-Mar-2003.
+
+require 5;
+use diagnostics;
+use strict;
+
+use POSIX qw(mktime strftime);
+use Math::Trig qw(acos);
+use Text::Wrap;
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my ($version) = ('$Revision: 1.11 $' =~ m/\s(\d[.\d]+)\s/s);
+
+my $verbose = 0;
+
+
+# convert a vector to a unit vector
+sub normalize($$$) {
+ my ($x, $y, $z) = @_;
+ my $L = sqrt (($x * $x) + ($y * $y) + ($z * $z));
+ if ($L != 0) {
+ $x /= $L;
+ $y /= $L;
+ $z /= $L;
+ } else {
+ $x = $y = $z = 0;
+ }
+ return ($x, $y, $z);
+}
+
+
+# Calculate the unit normal at p0 given two other points p1,p2 on the
+# surface. The normal points in the direction of p1 crossproduct p2.
+#
+sub face_normal($$$$$$$$$) {
+ my ($p0x, $p0y, $p0z,
+ $p1x, $p1y, $p1z,
+ $p2x, $p2y, $p2z) = @_;
+
+ my ($nx, $ny, $nz);
+ my ($pax, $pay, $paz);
+ my ($pbx, $pby, $pbz);
+
+ $pax = $p1x - $p0x;
+ $pay = $p1y - $p0y;
+ $paz = $p1z - $p0z;
+ $pbx = $p2x - $p0x;
+ $pby = $p2y - $p0y;
+ $pbz = $p2z - $p0z;
+ $nx = $pay * $pbz - $paz * $pby;
+ $ny = $paz * $pbx - $pax * $pbz;
+ $nz = $pax * $pby - $pay * $pbx;
+
+ return (normalize ($nx, $ny, $nz));
+}
+
+
+my $pi = 3.141592653589793;
+my $radians_to_degrees = 180.0 / $pi;
+
+# Calculate the angle (in degrees) between two vectors.
+#
+sub vector_angle($$$$$$) {
+ my ($x1, $y1, $z1,
+ $x2, $y2, $z2) = @_;
+
+ my $L1 = sqrt ($x1*$x1 + $y1*$y1 + $z1*$z1);
+ my $L2 = sqrt ($x2*$x2 + $y2*$y2 + $z2*$z2);
+
+ return 0 if ($L1 == 0 || $L2 == 0);
+ return 0 if ($x1 == $x2 && $y1 == $y2 && $z1 == $z2);
+
+ # dot product of two vectors is defined as:
+ # $L1 * $L1 * cos(angle between vectors)
+ # and is also defined as:
+ # $x1*$x2 + $y1*$y2 + $z1*$z2
+ # so:
+ # $L1 * $L1 * cos($angle) = $x1*$x2 + $y1*$y2 + $z1*$z2
+ # cos($angle) = ($x1*$x2 + $y1*$y2 + $z1*$z2) / ($L1 * $L2)
+ # $angle = acos (($x1*$x2 + $y1*$y2 + $z1*$z2) / ($L1 * $L2));
+ #
+ my $cos = ($x1*$x2 + $y1*$y2 + $z1*$z2) / ($L1 * $L2);
+ $cos = 1 if ($cos > 1); # avoid fp rounding error (1.000001 => sqrt error)
+ my $angle = acos ($cos);
+
+ return ($angle * $radians_to_degrees);
+}
+
+
+# given a list of triangles ( [ X1, Y1, Z1, X2, Y2, Z2, X3, Y3, Z3, ]+ )
+# returns a list of the normals for each vertex. These are the smoothed
+# normals: the average of the normals of the participating faces.
+#
+sub compute_vertex_normals(@) {
+ my (@points) = @_;
+ my $npoints = ($#points+1) / 3;
+ my $nfaces = $npoints / 3;
+
+ my @face_normals = ();
+ my %point_faces;
+
+ for (my $i = 0; $i < $nfaces; $i++) {
+ my ($ax, $ay, $az, $bx, $by, $bz, $cx, $cy, $cz) =
+ @points[($i*9) .. ($i*9)+8];
+
+ # store the normal for each face in the $face_normals array
+ # indexed by face number.
+ #
+ my @norm = face_normal ($ax, $ay, $az,
+ $bx, $by, $bz,
+ $cx, $cy, $cz);
+ $face_normals[$i] = \@norm;
+
+ # store in the %point_faces hash table a list of every face number
+ # in which a point participates
+
+ foreach my $p ("$ax $ay $az", "$bx $by $bz", "$cx $cy $cz") {
+ my @flist = (defined($point_faces{$p}) ? @{$point_faces{$p}} : ());
+ push @flist, $i;
+ $point_faces{$p} = \@flist;
+ }
+ }
+
+
+ # compute the normal for each vertex of each face.
+ # (these points are not unique -- because there might be multiple
+ # normals associated with the same vertex for different faces,
+ # in the case where it's a sharp angle.)
+ #
+ my @normals = ();
+ for (my $i = 0; $i < $nfaces; $i++) {
+ my @verts = @points[($i*9) .. ($i*9)+8];
+ error ("overshot in points?") unless defined($verts[8]);
+
+ my @norm = @{$face_normals[$i]};
+ error ("no normal $i?") unless defined($norm[2]);
+
+ # iterate over the (three) vertexes in this face.
+ #
+ for (my $j = 0; $j < 3; $j++) {
+ my ($x, $y, $z) = @verts[($j*3) .. ($j*3)+2];
+ error ("overshot in verts?") unless defined($z);
+
+ # Iterate over the faces in which this point participates.
+ # But ignore any other faces that are at more than an N degree
+ # angle from this point's face. Those are sharp edges.
+ #
+ my ($nx, $ny, $nz) = (0, 0, 0);
+ my @faces = @{$point_faces{"$x $y $z"}};
+ foreach my $fn (@faces) {
+ my ($ax, $ay, $az, $bx, $by, $bz, $cx, $cy, $cz) =
+ @points[($fn*9) .. ($fn*9)+8];
+ my @fnorm = @{$face_normals[$fn]};
+
+ # ignore any adjascent faces that are more than N degrees off.
+ my $angle = vector_angle ($norm[0], $norm[1], $norm[2],
+ $fnorm[0], $fnorm[1], $fnorm[2]);
+ next if ($angle >= 30);
+
+ $nx += $fnorm[0];
+ $ny += $fnorm[1];
+ $nz += $fnorm[2];
+ }
+
+ push @normals, normalize ($nx, $ny, $nz);
+ }
+ }
+
+ return @normals;
+}
+
+
+sub parse_dxf($$$$$) {
+ my ($filename, $dxf, $normalize_p, $wireframe_p, $layers_p) = @_;
+
+ $dxf =~ s/\r\n/\n/gs; # CRLF
+ $dxf =~ s/^[ \t\n]+|[ \t\n]+$//s; # leading/trailing whitespace
+
+ # Convert whitespace within a line to _, e.g., "ObjectDBX Classes".
+ # What the hell is up with this file format!
+ 1 while ($dxf =~ s/([^ \t\n])[ \t]+([^ \t\n])/$1_$2/gs);
+
+ $dxf =~ s/\r/\n/gs;
+
+ # Turn blank lines into "", e.g., "$DIMBLK \n 1 \n \n 9 \n"
+ $dxf =~ s/\n\n/\n""\n/gs;
+
+ my @tokens = split (/[ \t\n]+/, $dxf); # tokenize
+
+ my @entities = (); # parse
+ while (@tokens) {
+ my @elts = ();
+ my $key = shift @tokens; # sectionize at "0 WORD"
+ do {
+ my $val = shift @tokens;
+ push @elts, [ $key, $val ]; # contents are [CODE VAL]
+ $key = shift @tokens;
+ } while ($key && $key ne 0);
+ unshift @tokens, $key if defined($key);
+ push @entities, \@elts;
+ }
+ my %triangles; # list of points, indexed by layer name
+ my %lines;
+ my $error_count = 0;
+
+ foreach my $entity (@entities) {
+ my $header = shift @$entity;
+ my ($code, $name) = @$header;
+
+ if ($name eq 'SECTION' ||
+ $name eq 'HEADER' ||
+ $name eq 'ENDSEC' ||
+ $name eq 'EOF') {
+ print STDERR "$progname: $filename: ignoring \"$code $name\"\n"
+ if ($verbose > 1);
+
+ } elsif ($name eq '3DFACE') {
+
+ my @points = ();
+ my $pc = 0;
+ my $layer = '';
+
+ foreach my $entry (@$entity) {
+ my ($key, $val) = @$entry;
+ if ($key eq 8) { $layer = $val; # layer name
+
+ } elsif ($key eq 10) { $pc++; $points[0] = $val; # X1
+ } elsif ($key eq 20) { $pc++; $points[1] = $val; # Y1
+ } elsif ($key eq 30) { $pc++; $points[2] = $val; # Z1
+
+ } elsif ($key eq 11) { $pc++; $points[3] = $val; # X2
+ } elsif ($key eq 21) { $pc++; $points[4] = $val; # Y2
+ } elsif ($key eq 31) { $pc++; $points[5] = $val; # Z2
+
+ } elsif ($key eq 12) { $pc++; $points[6] = $val; # X3
+ } elsif ($key eq 22) { $pc++; $points[7] = $val; # Y3
+ } elsif ($key eq 32) { $pc++; $points[8] = $val; # Z3
+
+ } elsif ($key eq 13) { $pc++; $points[9] = $val; # X4
+ } elsif ($key eq 23) { $pc++; $points[10] = $val; # Y4
+ } elsif ($key eq 33) { $pc++; $points[11] = $val; # Z4
+
+ } elsif ($key eq 62) { # color number
+ } elsif ($key eq 70) { # invisible edge flag
+ } else {
+ print STDERR "$progname: $filename: WARNING:" .
+ " unknown $name: \"$key $val\"\n";
+ $error_count++;
+ }
+ }
+
+ error ("got $pc points in $name") unless ($pc == 12);
+
+ if ($points[6] != $points[9] ||
+ $points[7] != $points[10] ||
+ $points[8] != $points[11]) {
+ error ("$filename: got a quad, not a triangle\n");
+ } else {
+ @points = @points[0 .. 8];
+ }
+
+ foreach (@points) { $_ += 0; } # convert strings to numbers
+
+ $layer = '' unless $layers_p;
+
+ $triangles{$layer} = [] unless defined ($triangles{$layer});
+ push @{$triangles{$layer}}, @points;
+
+ } elsif ($name eq 'LINE') {
+
+ my @points = ();
+ my $pc = 0;
+ my $layer = '';
+
+ foreach my $entry (@$entity) {
+ my ($key, $val) = @$entry;
+ if ($key eq 8) { $layer = $val; # layer name
+
+ } elsif ($key eq 10) { $pc++; $points[0] = $val; # X1
+ } elsif ($key eq 20) { $pc++; $points[1] = $val; # Y1
+ } elsif ($key eq 30) { $pc++; $points[2] = $val; # Z1
+
+ } elsif ($key eq 11) { $pc++; $points[3] = $val; # X2
+ } elsif ($key eq 21) { $pc++; $points[4] = $val; # Y2
+ } elsif ($key eq 31) { $pc++; $points[5] = $val; # Z2
+
+ } elsif ($key eq 39) { # thickness
+ } elsif ($key eq 62) { # color number
+ } else {
+ print STDERR "$progname: $filename: WARNING:" .
+ " unknown $name: \"$key $val\"\n";
+ $error_count++;
+ }
+ }
+
+ error ("got $pc points in $name") unless ($pc == 6);
+
+ foreach (@points) { $_ += 0; } # convert strings to numbers
+
+ $layer = '' unless $layers_p;
+
+ $lines{$layer} = [] unless defined ($lines{$layer});
+ push @{$lines{$layer}}, @points;
+
+ } elsif ($name =~ m/^\d+$/s) {
+ error ("sequence lost: \"$code $name\"");
+
+ } else {
+ print STDERR "$progname: $filename: WARNING: unknown: \"$code $name\"\n";
+ $error_count++;
+ }
+
+ error ("too many errors: bailing!") if ($error_count > 50);
+ }
+
+ if ($wireframe_p) {
+
+ # Convert faces to lines.
+ # Don't duplicate shared edges.
+
+ foreach my $layer (keys %triangles) {
+ my %dups;
+ my @triangles = @{$triangles{$layer}};
+ while (@triangles) {
+ my $x1 = shift @triangles; # 0
+ my $y1 = shift @triangles; # 1
+ my $z1 = shift @triangles; # 2
+ my $x2 = shift @triangles; # 3
+ my $y2 = shift @triangles; # 4
+ my $z2 = shift @triangles; # 5
+ my $x3 = shift @triangles; # 6
+ my $y3 = shift @triangles; # 7
+ my $z3 = shift @triangles; # 8
+
+ my $p = sub(@) {
+ my ($x1, $y1, $z1, $x2, $y2, $z2) = @_;
+ my $key1 = "$x1, $y1, $z1, $x2, $y2, $z2";
+ my $key2 = "$x2, $y2, $z2, $x1, $y1, $z1";
+ my $dup = $dups{$key1} || $dups{$key2};
+ $dups{$key1} = 1;
+ $dups{$key2} = 1;
+ push @{$lines{$layer}}, @_ unless $dup;
+ }
+ ;
+ $p->($x1, $y1, $z1, $x2, $y2, $z2);
+ $p->($x2, $y2, $z2, $x3, $y3, $z3);
+ $p->($x3, $y3, $z3, $x1, $y1, $z1);
+ }
+
+ @{$triangles{$layer}} = ();
+ }
+
+ } else {
+ foreach my $layer (keys %lines) {
+ my $n = @{$lines{$layer}};
+ @{$lines{$layer}} = ();
+ print STDERR "$progname: $filename: $layer: WARNING:" .
+ " ignored $n stray LINE" . ($n == 1 ? "" : "s") . ".\n"
+ if ($n);
+ }
+ }
+
+
+ # find bounding box, and normalize
+ #
+ if ($normalize_p || $verbose) {
+ my $minx = 999999999;
+ my $miny = 999999999;
+ my $minz = 999999999;
+ my $maxx = -999999999;
+ my $maxy = -999999999;
+ my $maxz = -999999999;
+ my $i = 0;
+
+ foreach my $layer (keys %triangles) {
+ my %dups;
+ my @triangles = @{$triangles{$layer}};
+
+ foreach my $n (@{$lines{$layer}}, @{$triangles{$layer}}) {
+ if ($i == 0) { $minx = $n if ($n < $minx);
+ $maxx = $n if ($n > $maxx); }
+ elsif ($i == 1) { $miny = $n if ($n < $miny);
+ $maxy = $n if ($n > $maxy); }
+ else { $minz = $n if ($n < $minz);
+ $maxz = $n if ($n > $maxz); }
+ $i = 0 if (++$i == 3);
+ }
+ }
+
+ my $w = ($maxx - $minx);
+ my $h = ($maxy - $miny);
+ my $d = ($maxz - $minz);
+ my $sizea = ($w > $h ? $w : $h);
+ my $sizeb = ($w > $d ? $w : $d);
+ my $size = ($sizea > $sizeb ? $sizea : $sizeb);
+
+ print STDERR "$progname: $filename: bbox is " .
+ sprintf("%.2f x %.2f x %.2f\n", $w, $h, $d)
+ if ($verbose);
+ print STDERR "$progname: $filename: center is " .
+ sprintf("%.2f, %.2f, %.2f\n",
+ $minx + $w / 2,
+ $miny + $h / 2,
+ $minz + $d / 2)
+ if ($verbose);
+
+ if ($normalize_p) {
+ $w /= $size;
+ $h /= $size;
+ $d /= $size;
+
+ print STDERR "$progname: $filename: dividing by " .
+ sprintf("%.2f", $size) . " for bbox of " .
+ sprintf("%.2f x %.2f x %.2f\n", $w, $h, $d)
+ if ($verbose);
+ foreach my $layer (keys %triangles) {
+ foreach my $n (@{$triangles{$layer}}) { $n /= $size; }
+ foreach my $n (@{$lines{$layer}}) { $n /= $size; }
+ }
+ }
+ }
+
+ return ($wireframe_p ? \%lines : \%triangles);
+}
+
+
+sub generate_c_1($$$$$@) {
+ my ($name, $outfile, $smooth_p, $wireframe_p, $normalize_p, @points) = @_;
+
+ my $ccw_p = 1; # counter-clockwise winding rule for computing normals
+
+ my $npoints = ($#points + 1) / 3;
+ my $nfaces = ($wireframe_p ? $npoints/2 : $npoints/3);
+
+ my @normals;
+ if ($smooth_p && !$wireframe_p) {
+ @normals = compute_vertex_normals (@points);
+
+ if ($#normals != $#points) {
+ error ("computed " . (($#normals+1)/3) . " normals for " .
+ (($#points+1)/3) . " points?");
+ }
+ }
+
+ my $code .= "\nstatic const float ${name}_data[] = {\n";
+
+ if ($wireframe_p) {
+ my %dups;
+ for (my $i = 0; $i < $nfaces; $i++) {
+ my $ax = $points[$i*6];
+ my $ay = $points[$i*6+1];
+ my $az = $points[$i*6+2];
+
+ my $bx = $points[$i*6+3];
+ my $by = $points[$i*6+4];
+ my $bz = $points[$i*6+5];
+
+ my $lines = sprintf("\t" . "%.6f,%.6f,%.6f,\n" .
+ "\t" . "%.6f,%.6f,%.6f,\n",
+ $ax, $ay, $az,
+ $bx, $by, $bz);
+ $lines =~ s/([.\d])0+,/$1,/g; # lose trailing insignificant zeroes
+ $lines =~ s/\.,/,/g;
+ $lines =~ s/-0,/0,/g;
+
+ $code .= $lines;
+ }
+
+ } else {
+ for (my $i = 0; $i < $nfaces; $i++) {
+ my $ax = $points[$i*9];
+ my $ay = $points[$i*9+1];
+ my $az = $points[$i*9+2];
+
+ my $bx = $points[$i*9+3];
+ my $by = $points[$i*9+4];
+ my $bz = $points[$i*9+5];
+
+ my $cx = $points[$i*9+6];
+ my $cy = $points[$i*9+7];
+ my $cz = $points[$i*9+8];
+
+ my ($nax, $nay, $naz,
+ $nbx, $nby, $nbz,
+ $ncx, $ncy, $ncz);
+
+ if ($smooth_p) {
+ $nax = $normals[$i*9];
+ $nay = $normals[$i*9+1];
+ $naz = $normals[$i*9+2];
+
+ $nbx = $normals[$i*9+3];
+ $nby = $normals[$i*9+4];
+ $nbz = $normals[$i*9+5];
+
+ $ncx = $normals[$i*9+6];
+ $ncy = $normals[$i*9+7];
+ $ncz = $normals[$i*9+8];
+
+ } else {
+ if ($ccw_p) {
+ ($nax, $nay, $naz) = face_normal ($ax, $ay, $az,
+ $bx, $by, $bz,
+ $cx, $cy, $cz);
+ } else {
+ ($nax, $nay, $naz) = face_normal ($ax, $ay, $az,
+ $cx, $cy, $cz,
+ $bx, $by, $bz);
+ }
+ ($nbx, $nby, $nbz) = ($nax, $nay, $naz);
+ ($ncx, $ncy, $ncz) = ($nax, $nay, $naz);
+ }
+
+ my $lines = sprintf("\t" . "%.6f,%.6f,%.6f," . "%.6f,%.6f,%.6f,\n" .
+ "\t" . "%.6f,%.6f,%.6f," . "%.6f,%.6f,%.6f,\n" .
+ "\t" . "%.6f,%.6f,%.6f," . "%.6f,%.6f,%.6f,\n",
+ $nax, $nay, $naz, $ax, $ay, $az,
+ $nbx, $nby, $nbz, $bx, $by, $bz,
+ $ncx, $ncy, $ncz, $cx, $cy, $cz);
+ $lines =~ s/([.\d])0+,/$1,/g; # lose trailing insignificant zeroes
+ $lines =~ s/\.,/,/g;
+ $lines =~ s/-0,/0,/g;
+
+ $code .= $lines;
+ }
+ }
+
+ my $format = ($wireframe_p ? 'GL_V3F' : 'GL_N3F_V3F');
+ my $primitive = ($wireframe_p ? 'GL_LINES' : 'GL_TRIANGLES');
+
+ $code =~ s/,\n$//s;
+ $code .= "\n};\n";
+ $code .= "static const struct gllist ${name}_frame = {\n";
+ $code .= " $format, $primitive, $npoints, ${name}_data, 0\n};\n";
+ $code .= "const struct gllist *$name = &${name}_frame;\n";
+
+ print STDERR "$progname: $outfile: $name: $npoints points, $nfaces faces.\n"
+ if ($verbose);
+
+ return ($code, $npoints, $nfaces);
+}
+
+
+sub generate_c($$$$$$) {
+ my ($infile, $outfile, $smooth_p, $wireframe_p, $normalize_p, $layers) = @_;
+
+ my $code = '';
+
+ my $token = $outfile; # guess at a C token from the filename
+ $token =~ s/\<[^<>]*\>//;
+ $token =~ s@^.*/@@;
+ $token =~ s/\.[^.]*$//;
+ $token =~ s/[^a-z\d]/_/gi;
+ $token =~ s/__+/_/g;
+ $token =~ s/^_//g;
+ $token =~ s/_$//g;
+ $token =~ tr [A-Z] [a-z];
+ $token = 'foo' if ($token eq '');
+
+ my @layers = sort (keys %$layers);
+
+ $infile =~ s@^.*/@@s;
+ $code .= ("/* Generated from \"$infile\" on " .
+ strftime ("%d-%b-%Y", localtime ()) . ".\n" .
+ " " . ($wireframe_p
+ ? "Wireframe."
+ : ($smooth_p ?
+ "Smoothed vertex normals." :
+ "Faceted face normals.")) .
+ ($normalize_p ? " Normalized to unit bounding box." : "") .
+ "\n" .
+ (@layers > 1
+ ? wrap (" ", " ", "Components: " . join (", ", @layers)) . ".\n"
+ : "") .
+ " */\n\n");
+
+ $code .= "#include \"gllist.h\"\n";
+
+ my $npoints = 0;
+ my $nfaces = 0;
+
+ foreach my $layer (@layers) {
+ my $name = $layer ? "${token}_${layer}" : $token;
+ my ($c, $np, $nf) =
+ generate_c_1 ($name, $outfile,
+ $smooth_p, $wireframe_p, $normalize_p,
+ @{$layers->{$layer}});
+ $code .= $c;
+ $npoints += $np;
+ $nfaces += $nf;
+ }
+
+ print STDERR "$progname: $outfile: total: $npoints points, $nfaces faces.\n"
+ if ($verbose && @layers > 1);
+
+ return $code;
+}
+
+
+# Returns true if the two files differ (by running "cmp")
+#
+sub cmp_files($$) {
+ my ($file1, $file2) = @_;
+
+ my @cmd = ("cmp", "-s", "$file1", "$file2");
+ print STDERR "$progname: executing \"" . join(" ", @cmd) . "\"\n"
+ if ($verbose > 3);
+
+ system (@cmd);
+ my $exit_value = $? >> 8;
+ my $signal_num = $? & 127;
+ my $dumped_core = $? & 128;
+
+ error ("$cmd[0]: core dumped!") if ($dumped_core);
+ error ("$cmd[0]: signal $signal_num!") if ($signal_num);
+ return $exit_value;
+}
+
+
+sub dxf_to_gl($$$$$$) {
+ my ($infile, $outfile, $smooth_p, $normalize_p, $wireframe_p, $layers_p) = @_;
+
+ open (my $in, "<$infile") || error ("$infile: $!");
+ my $filename = ($infile eq '-' ? "<stdin>" : $infile);
+ print STDERR "$progname: reading $filename...\n"
+ if ($verbose);
+
+ local $/ = undef; # read entire file
+ my $dxf = <$in>;
+ close $in;
+
+ my $data = parse_dxf ($filename, $dxf, $normalize_p, $wireframe_p, $layers_p);
+
+ $filename = ($outfile eq '-' ? "<stdout>" : $outfile);
+ my $code = generate_c ($infile, $filename, $smooth_p, $wireframe_p,
+ $normalize_p, $data);
+
+ if ($outfile eq '-') {
+ print STDOUT $code;
+ } else {
+ my $tmp = "$outfile.tmp";
+ open (my $out, '>', $tmp) || error ("$tmp: $!");
+ print $out $code || error ("$filename: $!");
+ close $out || error ("$filename: $!");
+ if (cmp_files ($filename, $tmp)) {
+ if (!rename ($tmp, $filename)) {
+ unlink $tmp;
+ error ("mv $tmp $filename: $!");
+ }
+ print STDERR "$progname: wrote $filename\n";
+ } else {
+ unlink "$tmp" || error ("rm $tmp: $!\n");
+ print STDERR "$progname: $filename unchanged\n" if ($verbose);
+ }
+ }
+}
+
+
+sub error() {
+ ($_) = @_;
+ print STDERR "$progname: $_\n";
+ exit 1;
+}
+
+sub usage() {
+ print STDERR "usage: $progname " .
+ "[--verbose] [--normalize] [--smooth] [--wireframe] [--layers]\n" .
+ "[infile [outfile]]\n";
+ exit 1;
+}
+
+sub main() {
+ my ($infile, $outfile);
+ my $normalize_p = 0;
+ my $smooth_p = 0;
+ my $wireframe_p = 0;
+ my $layers_p = 0;
+ while ($_ = $ARGV[0]) {
+ shift @ARGV;
+ if ($_ eq "--verbose") { $verbose++; }
+ elsif (m/^-v+$/) { $verbose += length($_)-1; }
+ elsif ($_ eq "--normalize") { $normalize_p = 1; }
+ elsif ($_ eq "--smooth") { $smooth_p = 1; }
+ elsif ($_ eq "--wireframe") { $wireframe_p = 1; }
+ elsif ($_ eq "--layers") { $layers_p = 1; }
+ elsif (m/^-./) { usage; }
+ elsif (!defined($infile)) { $infile = $_; }
+ elsif (!defined($outfile)) { $outfile = $_; }
+ else { usage; }
+ }
+
+ $infile = "-" unless defined ($infile);
+ $outfile = "-" unless defined ($outfile);
+
+ dxf_to_gl ($infile, $outfile, $smooth_p, $normalize_p, $wireframe_p, $layers_p);
+}
+
+main;
+exit 0;
diff --git a/hacks/glx/dymaxionmap-coords.c b/hacks/glx/dymaxionmap-coords.c
new file mode 100644
index 0000000..1eb064d
--- /dev/null
+++ b/hacks/glx/dymaxionmap-coords.c
@@ -0,0 +1,685 @@
+/* http://www.rwgrayprojects.com/rbfnotes/maps/graymap6.html
+ Slightly modified by jwz for xscreensaver
+ */
+
+
+/**************************************************************/
+/* */
+/* This C program is copyrighted by Robert W. Gray and may */
+/* not be used in ANY for-profit project without written */
+/* permission. */
+/* */
+/**************************************************************/
+
+/* (Note: Robert Gray has kindly given me his permission to include
+ this code in xscreensaver. -- Jamie Zawinski, Apr 2018.)
+ */
+
+
+/**************************************************************/
+/* */
+/* This C program contains the Dymaxion map coordinate */
+/* transformation routines for converting longitude/latitude */
+/* points to (X, Y) points on the Dymaxion map. */
+/* */
+/* This version uses the exact transformation equations. */
+/**************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "dymaxionmap-coords.h"
+
+/************************************************************************/
+/* NOTE: in C, array indexing starts with element zero (0). I choose */
+/* to start my array indexing with elemennt one (1) so all arrays */
+/* are defined one element longer than they need to be. */
+/************************************************************************/
+
+/************************************************************************/
+/* global variables accessable to all procedures */
+/************************************************************************/
+
+static double v_x[13], v_y[13], v_z[13];
+static double center_x[21], center_y[21], center_z[21];
+static double garc, gt, gdve, gel;
+
+/********************************************/
+/* function pre-definitions */
+/********************************************/
+
+static double radians(double degrees);
+static void rotate(double angle, double *x, double *y);
+static void r2(int axis, double alpha, double *x, double *y, double *z);
+static void init_stuff(void);
+/*static void convert_s_t_p(double lng, double lat, double *x, double *y);*/
+static void s_to_c(double theta, double phi, double *x, double *y, double *z);
+static void c_to_s(double *theta, double *phi, double x, double y, double z);
+static void s_tri_info(double x, double y, double z,
+ int *tri, int *lcd);
+static void dymax_point(int tri, int lcd,
+ double x, double y, double z,
+ double *dx, double *dy);
+static void conv_ll_t_sc(double lng, double lat, double *theta, double *phi);
+
+
+/****************************************/
+/* function definitions */
+/****************************************/
+
+
+void
+/* convert_s_t_p */
+dymaxion_convert
+(double lng, double lat, double *x, double *y)
+{
+ /***********************************************************/
+ /* This is the main control procedure. */
+ /***********************************************************/
+
+ double theta, phi;
+ double hx, hy, hz;
+ double px = 0, py = 0;
+ int tri, hlcd;
+
+ static int initted = 0;
+ if (! initted) {
+ init_stuff();
+ initted = 1;
+ }
+
+ /* Convert the given (long.,lat.) coordinate into spherical */
+ /* polar coordinates (r, theta, phi) with radius=1. */
+ /* Angles are given in radians, NOT degrees. */
+
+ conv_ll_t_sc(lng, lat, &theta, &phi);
+
+ /* convert the spherical polar coordinates into cartesian */
+ /* (x, y, z) coordinates. */
+
+ s_to_c(theta, phi, &hx, &hy, &hz);
+
+ /* determine which of the 20 spherical icosahedron triangles */
+ /* the given point is in and the LCD triangle. */
+
+ s_tri_info(hx, hy, hz, &tri, &hlcd);
+
+ /* Determine the corresponding Fuller map plane (x, y) point */
+
+ dymax_point(tri, hlcd, hx, hy, hz, &px, &py);
+ *x = px;
+ *y = py;
+
+} /* end convert_s_t_p */
+
+
+static void conv_ll_t_sc(double lng, double lat, double *theta, double *phi)
+{
+ /* convert (long., lat.) point into spherical polar coordinates */
+ /* with r=radius=1. Angles are given in radians. */
+
+ double h_theta, h_phi;
+
+ h_theta = 90.0 - lat ;
+ h_phi = lng;
+ if (lng < 0.0) {h_phi = lng + 360.0;}
+ *theta = radians(h_theta);
+ *phi = radians(h_phi);
+
+} /* end conv_ll_t_sc */
+
+
+static double radians(double degrees)
+{
+ /* convert angles in degrees into angles in radians */
+
+ double pi2, c1;
+
+ pi2 = 2 * 3.14159265358979323846;
+ c1 = pi2 / 360;
+ return(c1 * degrees);
+
+} /* end of radians function */
+
+
+static void init_stuff()
+{
+ /* initializes the global variables which includes the */
+ /* vertix coordinates and mid-face coordinates. */
+
+ double /* i, */ hold_x, hold_y, hold_z, magn;
+ /* double theta, phi; */
+
+ /* Cartesian coordinates for the 12 vertices of icosahedron */
+
+ v_x[1] = 0.420152426708710003;
+ v_y[1] = 0.078145249402782959;
+ v_z[1] = 0.904082550615019298;
+ v_x[2] = 0.995009439436241649 ;
+ v_y[2] = -0.091347795276427931 ;
+ v_z[2] = 0.040147175877166645 ;
+ v_x[3] = 0.518836730327364437 ;
+ v_y[3] = 0.835420380378235850 ;
+ v_z[3] = 0.181331837557262454 ;
+ v_x[4] = -0.414682225320335218 ;
+ v_y[4] = 0.655962405434800777 ;
+ v_z[4] = 0.630675807891475371 ;
+ v_x[5] = -0.515455959944041808 ;
+ v_y[5] = -0.381716898287133011 ;
+ v_z[5] = 0.767200992517747538 ;
+ v_x[6] = 0.355781402532944713 ;
+ v_y[6] = -0.843580002466178147 ;
+ v_z[6] = 0.402234226602925571 ;
+ v_x[7] = 0.414682225320335218 ;
+ v_y[7] = -0.655962405434800777 ;
+ v_z[7] = -0.630675807891475371 ;
+ v_x[8] = 0.515455959944041808 ;
+ v_y[8] = 0.381716898287133011 ;
+ v_z[8] = -0.767200992517747538 ;
+ v_x[9] = -0.355781402532944713 ;
+ v_y[9] = 0.843580002466178147 ;
+ v_z[9] = -0.402234226602925571 ;
+ v_x[10] = -0.995009439436241649 ;
+ v_y[10] = 0.091347795276427931 ;
+ v_z[10] = -0.040147175877166645 ;
+ v_x[11] = -0.518836730327364437 ;
+ v_y[11] = -0.835420380378235850 ;
+ v_z[11] = -0.181331837557262454 ;
+ v_x[12] = -0.420152426708710003 ;
+ v_y[12] = -0.078145249402782959 ;
+ v_z[12] = -0.904082550615019298 ;
+
+ /* now calculate mid face coordinates */
+
+ hold_x = (v_x[1] + v_x[2] + v_x[3]) / 3.0 ;
+ hold_y = (v_y[1] + v_y[2] + v_y[3]) / 3.0 ;
+ hold_z = (v_z[1] + v_z[2] + v_z[3]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[1] = hold_x / magn;
+ center_y[1] = hold_y / magn;
+ center_z[1] = hold_z / magn;
+
+ hold_x = (v_x[1] + v_x[3] + v_x[4]) / 3.0 ;
+ hold_y = (v_y[1] + v_y[3] + v_y[4]) / 3.0 ;
+ hold_z = (v_z[1] + v_z[3] + v_z[4]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[2] = hold_x / magn;
+ center_y[2] = hold_y / magn;
+ center_z[2] = hold_z / magn;
+
+ hold_x = (v_x[1] + v_x[4] + v_x[5]) / 3.0 ;
+ hold_y = (v_y[1] + v_y[4] + v_y[5]) / 3.0 ;
+ hold_z = (v_z[1] + v_z[4] + v_z[5]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[3] = hold_x / magn;
+ center_y[3] = hold_y / magn;
+ center_z[3] = hold_z / magn;
+
+ hold_x = (v_x[1] + v_x[5] + v_x[6]) / 3.0 ;
+ hold_y = (v_y[1] + v_y[5] + v_y[6]) / 3.0 ;
+ hold_z = (v_z[1] + v_z[5] + v_z[6]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[4] = hold_x / magn;
+ center_y[4] = hold_y / magn;
+ center_z[4] = hold_z / magn;
+
+ hold_x = (v_x[1] + v_x[2] + v_x[6]) / 3.0 ;
+ hold_y = (v_y[1] + v_y[2] + v_y[6]) / 3.0 ;
+ hold_z = (v_z[1] + v_z[2] + v_z[6]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[5] = hold_x / magn;
+ center_y[5] = hold_y / magn;
+ center_z[5] = hold_z / magn;
+
+ hold_x = (v_x[2] + v_x[3] + v_x[8]) / 3.0 ;
+ hold_y = (v_y[2] + v_y[3] + v_y[8]) / 3.0 ;
+ hold_z = (v_z[2] + v_z[3] + v_z[8]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[6] = hold_x / magn;
+ center_y[6] = hold_y / magn;
+ center_z[6] = hold_z / magn;
+
+ hold_x = (v_x[8] + v_x[3] + v_x[9]) / 3.0 ;
+ hold_y = (v_y[8] + v_y[3] + v_y[9]) / 3.0 ;
+ hold_z = (v_z[8] + v_z[3] + v_z[9]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[7] = hold_x / magn;
+ center_y[7] = hold_y / magn;
+ center_z[7] = hold_z / magn;
+
+ hold_x = (v_x[9] + v_x[3] + v_x[4]) / 3.0 ;
+ hold_y = (v_y[9] + v_y[3] + v_y[4]) / 3.0 ;
+ hold_z = (v_z[9] + v_z[3] + v_z[4]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[8] = hold_x / magn;
+ center_y[8] = hold_y / magn;
+ center_z[8] = hold_z / magn;
+
+ hold_x = (v_x[10] + v_x[9] + v_x[4]) / 3.0 ;
+ hold_y = (v_y[10] + v_y[9] + v_y[4]) / 3.0 ;
+ hold_z = (v_z[10] + v_z[9] + v_z[4]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[9] = hold_x / magn;
+ center_y[9] = hold_y / magn;
+ center_z[9] = hold_z / magn;
+
+ hold_x = (v_x[5] + v_x[10] + v_x[4]) / 3.0 ;
+ hold_y = (v_y[5] + v_y[10] + v_y[4]) / 3.0 ;
+ hold_z = (v_z[5] + v_z[10] + v_z[4]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[10] = hold_x / magn;
+ center_y[10] = hold_y / magn;
+ center_z[10] = hold_z / magn;
+
+ hold_x = (v_x[5] + v_x[11] + v_x[10]) / 3.0 ;
+ hold_y = (v_y[5] + v_y[11] + v_y[10]) / 3.0 ;
+ hold_z = (v_z[5] + v_z[11] + v_z[10]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[11] = hold_x / magn;
+ center_y[11] = hold_y / magn;
+ center_z[11] = hold_z / magn;
+
+ hold_x = (v_x[5] + v_x[6] + v_x[11]) / 3.0 ;
+ hold_y = (v_y[5] + v_y[6] + v_y[11]) / 3.0 ;
+ hold_z = (v_z[5] + v_z[6] + v_z[11]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[12] = hold_x / magn;
+ center_y[12] = hold_y / magn;
+ center_z[12] = hold_z / magn;
+
+ hold_x = (v_x[11] + v_x[6] + v_x[7]) / 3.0 ;
+ hold_y = (v_y[11] + v_y[6] + v_y[7]) / 3.0 ;
+ hold_z = (v_z[11] + v_z[6] + v_z[7]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[13] = hold_x / magn;
+ center_y[13] = hold_y / magn;
+ center_z[13] = hold_z / magn;
+
+ hold_x = (v_x[7] + v_x[6] + v_x[2]) / 3.0 ;
+ hold_y = (v_y[7] + v_y[6] + v_y[2]) / 3.0 ;
+ hold_z = (v_z[7] + v_z[6] + v_z[2]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[14] = hold_x / magn;
+ center_y[14] = hold_y / magn;
+ center_z[14] = hold_z / magn;
+
+ hold_x = (v_x[8] + v_x[7] + v_x[2]) / 3.0 ;
+ hold_y = (v_y[8] + v_y[7] + v_y[2]) / 3.0 ;
+ hold_z = (v_z[8] + v_z[7] + v_z[2]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[15] = hold_x / magn;
+ center_y[15] = hold_y / magn;
+ center_z[15] = hold_z / magn;
+
+ hold_x = (v_x[12] + v_x[9] + v_x[8]) / 3.0 ;
+ hold_y = (v_y[12] + v_y[9] + v_y[8]) / 3.0 ;
+ hold_z = (v_z[12] + v_z[9] + v_z[8]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[16] = hold_x / magn;
+ center_y[16] = hold_y / magn;
+ center_z[16] = hold_z / magn;
+
+ hold_x = (v_x[12] + v_x[9] + v_x[10]) / 3.0 ;
+ hold_y = (v_y[12] + v_y[9] + v_y[10]) / 3.0 ;
+ hold_z = (v_z[12] + v_z[9] + v_z[10]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[17] = hold_x / magn;
+ center_y[17] = hold_y / magn;
+ center_z[17] = hold_z / magn;
+
+ hold_x = (v_x[12] + v_x[11] + v_x[10]) / 3.0 ;
+ hold_y = (v_y[12] + v_y[11] + v_y[10]) / 3.0 ;
+ hold_z = (v_z[12] + v_z[11] + v_z[10]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[18] = hold_x / magn;
+ center_y[18] = hold_y / magn;
+ center_z[18] = hold_z / magn;
+
+ hold_x = (v_x[12] + v_x[11] + v_x[7]) / 3.0 ;
+ hold_y = (v_y[12] + v_y[11] + v_y[7]) / 3.0 ;
+ hold_z = (v_z[12] + v_z[11] + v_z[7]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[19] = hold_x / magn;
+ center_y[19] = hold_y / magn;
+ center_z[19] = hold_z / magn;
+
+ hold_x = (v_x[12] + v_x[8] + v_x[7]) / 3.0 ;
+ hold_y = (v_y[12] + v_y[8] + v_y[7]) / 3.0 ;
+ hold_z = (v_z[12] + v_z[8] + v_z[7]) / 3.0 ;
+ magn = sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
+ center_x[20] = hold_x / magn;
+ center_y[20] = hold_y / magn;
+ center_z[20] = hold_z / magn;
+
+ garc = 2.0 * asin( sqrt( 5 - sqrt(5)) / sqrt(10) );
+ gt = garc / 2.0;
+
+ gdve = sqrt( 3 + sqrt(5) ) / sqrt( 5 + sqrt(5) );
+ gel = sqrt(8) / sqrt(5 + sqrt(5));
+
+} /* end of int_stuff procedure */
+
+
+static void s_to_c(double theta, double phi, double *x, double *y, double *z)
+{
+ /* Covert spherical polar coordinates to cartesian coordinates. */
+ /* The angles are given in radians. */
+
+ *x = sin(theta) * cos(phi);
+ *y = sin(theta) * sin(phi);
+ *z = cos(theta);
+
+ } /* end s_to_c */
+
+
+static void c_to_s(double *lng, double *lat, double x, double y, double z)
+ {
+ /* convert cartesian coordinates into spherical polar coordinates. */
+ /* The angles are given in radians. */
+
+ double a;
+
+ if (x>0.0 && y>0.0){a = radians(0.0);}
+ if (x<0.0 && y>0.0){a = radians(180.0);}
+ if (x<0.0 && y<0.0){a = radians(180.0);}
+ if (x>0.0 && y<0.0){a = radians(360.0);}
+ *lat = acos(z);
+ if (x==0.0 && y>0.0){*lng = radians(90.0);}
+ if (x==0.0 && y<0.0){*lng = radians(270.0);}
+ if (x>0.0 && y==0.0){*lng = radians(0.0);}
+ if (x<0.0 && y==0.0){*lng = radians(180.0);}
+ if (x!=0.0 && y!=0.0){*lng = atan(y/x) + a;}
+
+} /* end c_to_s */
+
+
+void s_tri_info(double x, double y, double z,
+ int *tri, int *lcd)
+{
+ /* Determine which triangle and LCD triangle the point is in. */
+
+ double h_dist1, h_dist2, h_dist3, h1, h2, h3;
+ int i, h_tri, h_lcd ;
+ int v1 = 0, v2 = 0, v3 = 0;
+
+ h_tri = 0;
+ h_dist1 = 9999.0;
+
+ /* Which triangle face center is the closest to the given point */
+ /* is the triangle in which the given point is in. */
+
+ for (i = 1; i <=20; i = i + 1)
+ {
+ h1 = center_x[i] - x;
+ h2 = center_y[i] - y;
+ h3 = center_z[i] - z;
+ h_dist2 = sqrt(h1 * h1 + h2 * h2 + h3 * h3);
+ if (h_dist2 < h_dist1)
+ {
+ h_tri = i;
+ h_dist1 = h_dist2;
+ } /* end the if statement */
+ } /* end the for statement */
+
+ *tri = h_tri;
+
+ /* Now the LCD triangle is determined. */
+
+ switch (h_tri)
+ {
+ case 1: v1 = 1; v2 = 3; v3 = 2; break;
+ case 2: v1 = 1; v2 = 4; v3 = 3; break;
+ case 3: v1 = 1; v2 = 5; v3 = 4; break;
+ case 4: v1 = 1; v2 = 6; v3 = 5; break;
+ case 5: v1 = 1; v2 = 2; v3 = 6; break;
+ case 6: v1 = 2; v2 = 3; v3 = 8; break;
+ case 7: v1 = 3; v2 = 9; v3 = 8; break;
+ case 8: v1 = 3; v2 = 4; v3 = 9; break;
+ case 9: v1 = 4; v2 = 10; v3 = 9; break;
+ case 10: v1 = 4; v2 = 5; v3 = 10; break;
+ case 11: v1 = 5; v2 = 11; v3 = 10; break;
+ case 12: v1 = 5; v2 = 6; v3 = 11; break;
+ case 13: v1 = 6; v2 = 7; v3 = 11; break;
+ case 14: v1 = 2; v2 = 7; v3 = 6; break;
+ case 15: v1 = 2; v2 = 8; v3 = 7; break;
+ case 16: v1 = 8; v2 = 9; v3 = 12; break;
+ case 17: v1 = 9; v2 = 10; v3 = 12; break;
+ case 18: v1 = 10; v2 = 11; v3 = 12; break;
+ case 19: v1 = 11; v2 = 7; v3 = 12; break;
+ case 20: v1 = 8; v2 = 12; v3 = 7; break;
+ } /* end of switch statement */
+
+ h1 = x - v_x[v1];
+ h2 = y - v_y[v1];
+ h3 = z - v_z[v1];
+ h_dist1 = sqrt(h1 * h1 + h2 * h2 + h3 * h3);
+
+ h1 = x - v_x[v2];
+ h2 = y - v_y[v2];
+ h3 = z - v_z[v2];
+ h_dist2 = sqrt(h1 * h1 + h2 * h2 + h3 * h3);
+
+ h1 = x - v_x[v3];
+ h2 = y - v_y[v3];
+ h3 = z - v_z[v3];
+ h_dist3 = sqrt(h1 * h1 + h2 * h2 + h3 * h3);
+
+ if ( (h_dist1 <= h_dist2) && (h_dist2 <= h_dist3) ) {h_lcd = 1; }
+ if ( (h_dist1 <= h_dist3) && (h_dist3 <= h_dist2) ) {h_lcd = 6; }
+ if ( (h_dist2 <= h_dist1) && (h_dist1 <= h_dist3) ) {h_lcd = 2; }
+ if ( (h_dist2 <= h_dist3) && (h_dist3 <= h_dist1) ) {h_lcd = 3; }
+ if ( (h_dist3 <= h_dist1) && (h_dist1 <= h_dist2) ) {h_lcd = 5; }
+ if ( (h_dist3 <= h_dist2) && (h_dist2 <= h_dist1) ) {h_lcd = 4; }
+
+ *lcd = h_lcd;
+
+} /* end s_tri_info */
+
+
+static void dymax_point(int tri, int lcd,
+ double x, double y, double z,
+ double *px, double *py)
+{
+ int axis, v1 = 0;
+ double hlng, hlat, h0x, h0y, h0z, h1x, h1y, h1z;
+
+ double gs;
+ double gx, gy, gz, ga1,ga2,ga3,ga1p,ga2p,ga3p,gxp,gyp/*,gzp*/;
+
+
+ /* In order to rotate the given point into the template spherical */
+ /* triangle, we need the spherical polar coordinates of the center */
+ /* of the face and one of the face vertices. So set up which vertex */
+ /* to use. */
+
+ switch (tri)
+ {
+ case 1: v1 = 1; break;
+ case 2: v1 = 1; break;
+ case 3: v1 = 1; break;
+ case 4: v1 = 1; break;
+ case 5: v1 = 1; break;
+ case 6: v1 = 2; break;
+ case 7: v1 = 3; break;
+ case 8: v1 = 3; break;
+ case 9: v1 = 4; break;
+ case 10: v1 = 4; break;
+ case 11: v1 = 5; break;
+ case 12: v1 = 5; break;
+ case 13: v1 = 6; break;
+ case 14: v1 = 2; break;
+ case 15: v1 = 2; break;
+ case 16: v1 = 8; break;
+ case 17: v1 = 9; break;
+ case 18: v1 = 10; break;
+ case 19: v1 = 11; break;
+ case 20: v1 = 8; break;
+ } /* end of switch statement */
+
+ h0x = x;
+ h0y = y;
+ h0z = z;
+
+ h1x = v_x[v1];
+ h1y = v_y[v1];
+ h1z = v_z[v1];
+
+ c_to_s(&hlng, &hlat, center_x[tri], center_y[tri], center_z[tri]);
+
+ axis = 3;
+ r2(axis,hlng,&h0x,&h0y,&h0z);
+ r2(axis,hlng,&h1x,&h1y,&h1z);
+
+ axis = 2;
+ r2(axis,hlat,&h0x,&h0y,&h0z);
+ r2(axis,hlat,&h1x,&h1y,&h1z);
+
+ c_to_s(&hlng,&hlat,h1x,h1y,h1z);
+ hlng = hlng - radians(90.0);
+
+ axis = 3;
+ r2(axis,hlng,&h0x,&h0y,&h0z);
+
+ /* exact transformation equations */
+
+ gz = sqrt(1 - h0x * h0x - h0y * h0y);
+ gs = sqrt( 5 + 2 * sqrt(5) ) / ( gz * sqrt(15) );
+
+ gxp = h0x * gs ;
+ gyp = h0y * gs ;
+
+ ga1p = 2.0 * gyp / sqrt(3.0) + (gel / 3.0) ;
+ ga2p = gxp - (gyp / sqrt(3)) + (gel / 3.0) ;
+ ga3p = (gel / 3.0) - gxp - (gyp / sqrt(3));
+
+ ga1 = gt + atan( (ga1p - 0.5 * gel) / gdve);
+ ga2 = gt + atan( (ga2p - 0.5 * gel) / gdve);
+ ga3 = gt + atan( (ga3p - 0.5 * gel) / gdve);
+
+ gx = 0.5 * (ga2 - ga3) ;
+
+ gy = (1.0 / (2.0 * sqrt(3)) ) * (2 * ga1 - ga2 - ga3);
+
+ /* Re-scale so plane triangle edge length is 1. */
+
+ x = gx / garc;
+ y = gy / garc;
+
+ /* rotate and translate to correct position */
+
+ switch (tri)
+ {
+ case 1: rotate(240.0,&x, &y);
+ *px = x + 2.0; *py = y + 7.0 / (2.0 * sqrt(3.0)) ; break;
+ case 2: rotate(300.0, &x, &y); *px = x + 2.0;
+ *py = y + 5.0 / (2.0 * sqrt(3.0)) ; break;
+ case 3: rotate(0.0, &x, &y);
+ *px = x + 2.5; *py = y + 2.0 / sqrt(3.0); break;
+ case 4: rotate(60.0, &x, &y);
+ *px = x + 3.0; *py = y + 5.0 / (2.0 * sqrt(3.0)) ; break;
+ case 5: rotate(180.0, &x, &y);
+ *px = x + 2.5; *py = y + 4.0 * sqrt(3.0) / 3.0; break;
+ case 6: rotate(300.0, &x, &y);
+ *px = x + 1.5; *py = y + 4.0 * sqrt(3.0) / 3.0; break;
+ case 7: rotate(300.0, &x, &y);
+ *px = x + 1.0; *py = y + 5.0 / (2.0 * sqrt(3.0)) ; break;
+ case 8: rotate(0.0, &x, &y);
+ *px = x + 1.5; *py = y + 2.0 / sqrt(3.0); break;
+ case 9: if (lcd > 2)
+ {
+ rotate(300.0, &x, &y);
+ *px = x + 1.5; *py = y + 1.0 / sqrt(3.0);
+ }
+ else
+ {
+ rotate(0.0, &x, &y);
+ *px = x + 2.0; *py = y + 1.0 / (2.0 * sqrt(3.0));
+ }
+ break;
+
+ case 10: rotate(60.0, &x, &y);
+ *px = x + 2.5; *py = y + 1.0 / sqrt(3.0); break;
+ case 11: rotate(60.0, &x, &y);
+ *px = x + 3.5; *py = y + 1.0 / sqrt(3.0); break;
+ case 12: rotate(120.0, &x, &y);
+ *px = x + 3.5; *py = y + 2.0 / sqrt(3.0); break;
+ case 13: rotate(60.0, &x, &y);
+ *px = x + 4.0; *py = y + 5.0 / (2.0 * sqrt(3.0)); break;
+ case 14: rotate(0.0, &x, &y);
+ *px = x + 4.0; *py = y + 7.0 / (2.0 * sqrt(3.0)) ; break;
+ case 15: rotate(0.0, &x, &y);
+ *px = x + 5.0; *py = y + 7.0 / (2.0 * sqrt(3.0)) ; break;
+ case 16: if (lcd < 4)
+ {
+ rotate(60.0, &x, &y);
+ *px = x + 0.5; *py = y + 1.0 / sqrt(3.0);
+ }
+ else
+ {
+ rotate(0.0, &x, &y);
+ *px = x + 5.5; *py = y + 2.0 / sqrt(3.0);
+ }
+ break;
+ case 17: rotate(0.0, &x, &y);
+ *px = x + 1.0; *py = y + 1.0 / (2.0 * sqrt(3.0)); break;
+ case 18: rotate(120.0, &x, &y);
+ *px = x + 4.0; *py = y + 1.0 / (2.0 * sqrt(3.0)); break;
+ case 19: rotate(120.0, &x, &y);
+ *px = x + 4.5; *py = y + 2.0 / sqrt(3.0); break;
+ case 20: rotate(300.0, &x, &y);
+ *px = x + 5.0; *py = y + 5.0 / (2.0 * sqrt(3.0)); break;
+
+ } /* end switch statement */
+
+} /* end of dymax_point */
+
+
+static void rotate(double angle, double *x, double *y)
+{
+ /* Rotate the point to correct orientation in XY-plane. */
+
+ double ha, hx, hy ;
+
+ ha = radians(angle);
+ hx = *x;
+ hy = *y;
+ *x = hx * cos(ha) - hy * sin(ha);
+ *y = hx * sin(ha) + hy * cos(ha);
+
+} /* end rotate procedure */
+
+
+static void r2(int axis, double alpha, double *x, double *y, double *z)
+{
+ /* Rotate a 3-D point about the specified axis. */
+
+ double a, b, c;
+
+ a = *x;
+ b = *y;
+ c = *z;
+ if (axis == 1)
+ {
+ *y = b * cos(alpha) + c * sin(alpha);
+ *z = c * cos(alpha) - b * sin(alpha);
+ }
+
+ if (axis == 2)
+ {
+ *x = a * cos(alpha) - c * sin(alpha);
+ *z = a * sin(alpha) + c * cos(alpha);
+ }
+
+ if (axis == 3)
+ {
+ *x = a * cos(alpha) + b * sin(alpha);
+ *y = b * cos(alpha) - a * sin(alpha);
+ }
+
+} /* end of r2 */
+
diff --git a/hacks/glx/dymaxionmap-coords.h b/hacks/glx/dymaxionmap-coords.h
new file mode 100644
index 0000000..fad4a04
--- /dev/null
+++ b/hacks/glx/dymaxionmap-coords.h
@@ -0,0 +1,6 @@
+#ifndef __DYMAXIONMAP_COORDS_H__
+#define __DYMAXIONMAP_COORDS_H__
+
+void dymaxion_convert (double lng, double lat, double *x, double *y);
+
+#endif /* __DYMAXIONMAP_COORDS_H__ */
diff --git a/hacks/glx/dymaxionmap.c b/hacks/glx/dymaxionmap.c
new file mode 100644
index 0000000..711db2e
--- /dev/null
+++ b/hacks/glx/dymaxionmap.c
@@ -0,0 +1,1654 @@
+/* dymaxionmap --- Buckminster Fuller's unwrapped icosahedral globe.
+ * Copyright (c) 2016-2018 Jamie Zawinski.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ */
+
+#define LABEL_FONT "-*-helvetica-bold-r-normal-*-*-240-*-*-*-*-*-*"
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*labelFont: " LABEL_FONT "\n"
+# define release_planet 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL /* whole file */
+
+#include "sphere.h"
+#include "normals.h"
+#include "texfont.h"
+#include "dymaxionmap-coords.h"
+
+#ifdef HAVE_XMU
+# ifndef VMS
+# include <X11/Xmu/Drawing.h>
+#else /* VMS */
+# include <Xmu/Drawing.h>
+# endif /* VMS */
+#endif
+
+#define DEF_ROTATE "True"
+#define DEF_ROLL "True"
+#define DEF_WANDER "True"
+#define DEF_TEXTURE "True"
+#define DEF_STARS "True"
+#define DEF_GRID "True"
+#define DEF_SPEED "1.0"
+#define DEF_IMAGE "BUILTIN_FLAT"
+#define DEF_IMAGE2 "NONE"
+#define DEF_FRAMES "720"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+#undef RANDSIGN
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+static int do_roll;
+static int do_wander;
+static int do_texture;
+static int do_stars;
+static int do_grid;
+static int frames;
+static GLfloat speed;
+static char *which_image;
+static char *which_image2;
+
+static XrmOptionDescRec opts[] = {
+ {"-speed", ".speed", XrmoptionSepArg, 0 },
+ {"-roll", ".roll", XrmoptionNoArg, "true" },
+ {"+roll", ".roll", XrmoptionNoArg, "false" },
+ {"-wander", ".wander", XrmoptionNoArg, "true" },
+ {"+wander", ".wander", XrmoptionNoArg, "false" },
+ {"-texture", ".texture", XrmoptionNoArg, "true" },
+ {"+texture", ".texture", XrmoptionNoArg, "false" },
+ {"-stars", ".stars", XrmoptionNoArg, "true" },
+ {"+stars", ".stars", XrmoptionNoArg, "false" },
+ {"-grid", ".grid", XrmoptionNoArg, "true" },
+ {"+grid", ".grid", XrmoptionNoArg, "false" },
+ {"-flat", ".image", XrmoptionNoArg, "BUILTIN_FLAT" },
+ {"-satellite",".image", XrmoptionNoArg, "BUILTIN_SAT" },
+ {"-image", ".image", XrmoptionSepArg, 0 },
+ {"-image2", ".image2", XrmoptionSepArg, 0 },
+ {"-frames", ".frames", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&do_roll, "roll", "Roll", DEF_ROLL, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ {&do_stars, "stars", "Stars", DEF_STARS, t_Bool},
+ {&do_grid, "grid", "Grid", DEF_GRID, t_Bool},
+ {&which_image, "image", "Image", DEF_IMAGE, t_String},
+ {&which_image2,"image2", "Image2", DEF_IMAGE2, t_String},
+ {&frames, "frames", "Frames", DEF_FRAMES, t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt planet_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct planet_description =
+{"planet", "init_planet", "draw_planet", NULL,
+ "draw_planet", "init_planet", "free_planet", &planet_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "Buckminster Fuller's unwrapped icosahedral globe", 0, NULL};
+#endif
+
+# ifdef __GNUC__
+ __extension__ /* don't warn about "string length is greater than the length
+ ISO C89 compilers are required to support" when including
+ the following XPM file... */
+# endif
+
+#include "images/gen/earth_flat_png.h"
+#include "images/gen/earth_png.h"
+#include "images/gen/earth_night_png.h"
+#include "images/gen/ground_png.h"
+
+#include "ximage-loader.h"
+#include "rotator.h"
+#include "gltrackball.h"
+
+
+typedef struct {
+ GLXContext *glx_context;
+ GLuint starlist;
+ int starcount;
+ rotator *rot, *rot2;
+ trackball_state *trackball;
+ Bool button_down_p;
+ enum { STARTUP, FLAT, FOLD,
+ ICO, STEL_IN, AXIS, SPIN, STEL, STEL_OUT,
+ ICO2, UNFOLD } state;
+ GLfloat ratio;
+ GLuint tex1, tex2;
+ texture_font_data *font_data;
+ int loading_sw, loading_sh;
+
+ XImage *day, *night, *dusk, *cvt;
+ XImage **images; /* One image for each frame of time-of-day. */
+ int nimages;
+
+ double current_frame;
+ Bool cache_p;
+ long delay;
+
+} planetstruct;
+
+
+static planetstruct *planets = NULL;
+
+
+static double
+double_time (void)
+{
+ struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&now, &tzp);
+# else
+ gettimeofday(&now);
+# endif
+
+ return (now.tv_sec + ((double) now.tv_usec * 0.000001));
+}
+
+
+/* Draw faint latitude and longitude lines into the RGBA XImage.
+ */
+static void
+add_grid_lines (XImage *image)
+{
+ int i;
+ int off = 24;
+ for (i = 0; i < 24; i++)
+ {
+ int x = (i + 0.5) * image->width / (double) 24;
+ int y;
+ for (y = 0; y < image->height; y++)
+ {
+ unsigned long rgba = XGetPixel (image, x, y);
+ int r = (rgba >> 24) & 0xFF;
+ int g = (rgba >> 16) & 0xFF;
+ int b = (rgba >> 8) & 0xFF;
+ int a = (rgba >> 0) & 0xFF;
+ int off2 = (((r + g + b) / 3) < 0x7F ? off : -off);
+ r = MAX (0, MIN (0xFF, r + off2));
+ g = MAX (0, MIN (0xFF, g + off2));
+ b = MAX (0, MIN (0xFF, b + off2));
+ XPutPixel (image, x, y, (r << 24) | (g << 16) | (b << 8) | a);
+ }
+ }
+
+ for (i = 1; i < 11; i++)
+ {
+ int y = i * image->height / (double) 12;
+ int x;
+ for (x = 0; x < image->width; x++)
+ {
+ unsigned long rgba = XGetPixel (image, x, y);
+ int r = (rgba >> 24) & 0xFF;
+ int g = (rgba >> 16) & 0xFF;
+ int b = (rgba >> 8) & 0xFF;
+ int a = (rgba >> 0) & 0xFF;
+ int off2 = (((r + g + b) / 3) < 0x7F ? off : -off);
+ r = MAX (0, MIN (0xFF, r + off2));
+ g = MAX (0, MIN (0xFF, g + off2));
+ b = MAX (0, MIN (0xFF, b + off2));
+ XPutPixel (image, x, y, (r << 24) | (g << 16) | (b << 8) | a);
+ }
+ }
+}
+
+
+static void
+adjust_brightness (XImage *image, double amount)
+{
+ uint32_t *in = (uint32_t *) image->data;
+ int i;
+ int end = image->height * image->bytes_per_line / 4;
+ for (i = 0; i < end; i++)
+ {
+ uint32_t p = *in;
+ /* #### Why is this ABGR instead of RGBA? */
+ uint32_t a = (p >> 24) & 0xFF;
+ uint32_t g = (p >> 16) & 0xFF;
+ uint32_t b = (p >> 8) & 0xFF;
+ uint32_t r = (p >> 0) & 0xFF;
+ r = MAX(0, MIN(0xFF, (long) (r * amount)));
+ g = MAX(0, MIN(0xFF, (long) (g * amount)));
+ b = MAX(0, MIN(0xFF, (long) (b * amount)));
+ p = (a << 24) | (g << 16) | (b << 8) | r;
+ *in++ = p;
+ }
+}
+
+
+static GLfloat
+vector_angle (XYZ a, XYZ b)
+{
+ double La = sqrt (a.x*a.x + a.y*a.y + a.z*a.z);
+ double Lb = sqrt (b.x*b.x + b.y*b.y + b.z*b.z);
+ double cc, angle;
+
+ if (La == 0 || Lb == 0) return 0;
+ if (a.x == b.x && a.y == b.y && a.z == b.z) return 0;
+
+ /* dot product of two vectors is defined as:
+ La * Lb * cos(angle between vectors)
+ and is also defined as:
+ ax*bx + ay*by + az*bz
+ so:
+ La * Lb * cos(angle) = ax*bx + ay*by + az*bz
+ cos(angle) = (ax*bx + ay*by + az*bz) / (La * Lb)
+ angle = acos ((ax*bx + ay*by + az*bz) / (La * Lb));
+ */
+ cc = (a.x*b.x + a.y*b.y + a.z*b.z) / (La * Lb);
+ if (cc > 1) cc = 1; /* avoid fp rounding error (1.000001 => sqrt error) */
+ angle = acos (cc);
+
+ return (angle);
+}
+
+
+/* Creates a grayscale image encoding the day/night terminator for a random
+ axial tilt.
+ */
+static XImage *
+create_daylight_mask (Display *dpy, Visual *v, int w, int h)
+{
+ XImage *image = XCreateImage (dpy, v, 8, ZPixmap, 0, 0, w, h, 8, 0);
+ int x, y;
+ XYZ sun;
+ double axial_tilt = frand(23.4) / (180/M_PI) * RANDSIGN();
+ double dusk = M_PI * 0.035;
+ sun.x = 0;
+ sun.y = cos (axial_tilt);
+ sun.z = sin (axial_tilt);
+
+ image->data = (char *) malloc (image->height * image->bytes_per_line);
+
+ for (y = 0; y < image->height; y++)
+ {
+ double lat = -M_PI_2 + (M_PI * (y / (double) image->height));
+ double cosL = cos(lat);
+ double sinL = sin(lat);
+ for (x = 0; x < image->width; x++)
+ {
+ double lon = -M_PI_2 + (M_PI * 2 * (x / (double) image->width));
+ XYZ v;
+ double a;
+ unsigned long p;
+ v.x = cos(lon) * cosL;
+ v.y = sin(lon) * cosL;
+ v.z = sinL;
+ a = vector_angle (sun, v);
+ a -= M_PI_2;
+ a = (a < -dusk ? 1 : a >= dusk ? 0 : (dusk - a) / (dusk * 2));
+ p = 0xFF & (unsigned long) (a * 0xFF);
+ XPutPixel (image, x, y, p);
+ }
+ }
+ return image;
+}
+
+
+static void
+load_images (ModeInfo *mi)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+ int i;
+
+ if (which_image && !strcmp (which_image, "BUILTIN_FLAT"))
+ {
+ which_image = strdup("BUILTIN_FLAT");
+ which_image2 = strdup("BUILTIN_FLAT");
+ }
+ else if (which_image && !strcmp (which_image, "BUILTIN_SAT"))
+ {
+ which_image = strdup("BUILTIN_DAY");
+ which_image2 = strdup("BUILTIN_NIGHT");
+ }
+
+ if (!which_image) which_image = strdup("");
+ if (!which_image2) which_image2 = strdup("");
+
+ for (i = 0; i < 2; i++)
+ {
+ char *s = (i == 0 ? which_image : which_image2);
+ XImage *image;
+ if (!strcmp (s, "BUILTIN_DAY"))
+ image = image_data_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi),
+ earth_png, sizeof(earth_png));
+ else if (!strcmp (s, "BUILTIN_NIGHT"))
+ image = image_data_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi),
+ earth_night_png,sizeof(earth_night_png));
+ else if (!strcmp (s, "BUILTIN") ||
+ !strcmp (s, "BUILTIN_FLAT") ||
+ (i == 0 && !strcmp (s, "")))
+ image = image_data_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi),
+ earth_flat_png, sizeof(earth_flat_png));
+ else if (!strcmp (s, "NONE"))
+ image = 0;
+ else if (*s)
+ image = file_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi), s);
+ else
+ image = 0;
+
+ /* if (image) fprintf (stderr, "%s: %d: loaded %s\n", progname, i, s); */
+
+ if (i == 0)
+ gp->day = image;
+ else
+ gp->night = image;
+ }
+
+ if (gp->night && !gp->day)
+ gp->day = gp->night, gp->night = 0;
+
+ gp->nimages = frames;
+ gp->current_frame = random() % gp->nimages;
+
+ if (gp->nimages < 1)
+ gp->nimages = 1;
+
+ if (gp->nimages < 2 && gp->night)
+ {
+ XDestroyImage (gp->night);
+ gp->night = 0;
+ gp->nimages = 1;
+ }
+
+ if (! gp->night)
+ gp->nimages = 1;
+
+ if (do_grid)
+ {
+ if (gp->day) add_grid_lines (gp->day);
+ if (gp->night) add_grid_lines (gp->night);
+ }
+
+ if (gp->day && gp->night && !gp->dusk)
+ {
+ if (gp->day->width != gp->night->width ||
+ gp->day->height != gp->night->height)
+ {
+ fprintf (stderr, "%s: day and night images must be the same size"
+ " (%dx%d vs %dx%d)\n", progname,
+ gp->day->width, gp->day->height,
+ gp->night->width, gp->night->height);
+ exit (1);
+ }
+ gp->dusk = create_daylight_mask (MI_DISPLAY (mi), MI_VISUAL (mi),
+ gp->day->width, gp->day->height);
+ }
+
+ /* Make the day image brighter, because that's easier than doing it
+ with GL lights. */
+ adjust_brightness (gp->day, 1.4);
+
+ if (!strcmp (which_image, which_image2))
+ /* If day and night are the same image, make night way darker. */
+ adjust_brightness (gp->night, 0.2);
+ else if (gp->night)
+ /* Otherwise make it just a little darker. */
+ adjust_brightness (gp->night, 0.7);
+
+
+ gp->images = (XImage **) calloc (gp->nimages, sizeof(*gp->images));
+
+ /* Create 'cvt', a map that projects each pixel from Equirectangular to
+ Dymaxion. It is 2x the width/height of the source images. We iterate
+ by half pixel to make sure we hit every pixel in 'out'. It would be
+ cleaner to iterate over 'out' instead of over 'in' but
+ dymaxionmap-coords.c only goes forward. This is... not super fast.
+ */
+ {
+ double W = 5.5;
+ double H = 3 * sqrt(3)/2;
+ int x2, y2;
+ int w = gp->day->width;
+ int h = gp->day->height;
+ uint32_t *out;
+
+ gp->cvt = XCreateImage (MI_DISPLAY(mi), MI_VISUAL(mi), 32, ZPixmap, 0, 0,
+ gp->day->width*2, gp->day->height*2, 32, 0);
+ gp->cvt->data = (char *)
+ malloc (gp->cvt->height * gp->cvt->bytes_per_line);
+ out = (uint32_t *) gp->cvt->data;
+
+ for (y2 = 0; y2 < h*2; y2++)
+ {
+ double y = (double) y2/2;
+ double lat = -90 + (180 * (y / (double) h));
+ for (x2 = 0; x2 < w*2; x2++)
+ {
+ double x = (double) x2/2;
+ double lon = -180 + (360 * x / w);
+ double ox, oy;
+ dymaxion_convert (lon, lat, &ox, &oy);
+ ox = w - (w * ox / W);
+ oy = (h * oy / H);
+
+ *out++ = (((((uint32_t) ox) & 0xFFFF) << 16) |
+ ((((uint32_t) oy) & 0xFFFF)));
+ }
+ }
+ }
+
+ /* A 128 GB iPhone 6s dies at around 540 frames, ~1 GB of XImages.
+ A 16 GB iPad Air 2 dies at around 320 frames, ~640 MB.
+ Caching on mobile doesn't matter much: we can just run at 100% CPU.
+
+ On some systems it would be more efficient to cache the images inside
+ a texture on the GPU instead of moving it from RAM to GPU every few
+ frames; but on other systems, we'd just run out of GPU memory instead. */
+ {
+ unsigned long cache_size = (gp->day->width * gp->day->height * 4 *
+ gp->nimages);
+# ifdef HAVE_MOBILE
+ unsigned long max = 320 * 1024 * 1024L; /* 320 MB */
+# else
+ unsigned long max = 2 * 1024 * 1024 * 1024L; /* 2 GB */
+# endif
+ gp->cache_p = (cache_size < max);
+ }
+}
+
+
+static void
+cache_current_frame (ModeInfo *mi)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+ XImage *blended, *dymaxion;
+ int i, x, y, w, h, end, xoff;
+ uint32_t *day, *night, *cvt, *out;
+ uint8_t *dusk;
+
+ if (gp->images[(int) gp->current_frame])
+ return;
+
+ xoff = (gp->dusk
+ ? gp->dusk->width * ((double) gp->current_frame / gp->nimages)
+ : 0);
+
+ w = gp->day->width;
+ h = gp->day->height;
+
+ if (!gp->night)
+ blended = gp->day;
+ else
+ {
+ /* Blend the foreground and background images through the dusk map.
+ */
+ blended = XCreateImage (MI_DISPLAY(mi), MI_VISUAL(mi),
+ gp->day->depth, ZPixmap, 0, 0, w, h, 32, 0);
+ if (!blended) abort();
+ blended->data = (char *) malloc (h * blended->bytes_per_line);
+ if (!blended->data) abort();
+
+ end = blended->height * blended->bytes_per_line / 4;
+ day = (uint32_t *) gp->day->data;
+ night = (uint32_t *) gp->night->data;
+ dusk = (uint8_t *) gp->dusk->data;
+ out = (uint32_t *) blended->data;
+
+ for (i = 0; i < end; i++)
+ {
+ uint32_t d = *day++;
+ uint32_t n = *night++;
+ uint32_t x = i % w;
+ uint32_t y = i / w;
+ double r = dusk[y * w + ((x + xoff) % w)] / 256.0;
+ double r2 = 1-r;
+# define ADD(M) (((unsigned long) \
+ ((((d >> M) & 0xFF) * r) + \
+ (((n >> M) & 0xFF) * r2))) \
+ << M)
+ /* #### Why is this ABGR instead of RGBA? */
+ *out++ = (0xFF << 24) | ADD(16) | ADD(8) | ADD(0);
+# undef ADD
+ }
+ }
+
+ /* Convert blended Equirectangular to Dymaxion through the 'cvt' map.
+ */
+ dymaxion = XCreateImage (MI_DISPLAY(mi), MI_VISUAL(mi),
+ gp->day->depth, ZPixmap, 0, 0, w, h, 32, 0);
+ dymaxion->data = (char *) calloc (h, dymaxion->bytes_per_line);
+
+ day = (uint32_t *) blended->data;
+ out = (uint32_t *) dymaxion->data;
+ cvt = (uint32_t *) gp->cvt->data;
+
+ for (y = 0; y < h*2; y++)
+ for (x = 0; x < w*2; x++)
+ {
+ unsigned long m = *cvt++;
+ unsigned long dx = (m >> 16) & 0xFFFF;
+ unsigned long dy = m & 0xFFFF;
+ unsigned long p = day[(y>>1) * w + (x>>1)];
+ unsigned long p2 = out[dy * w + dx];
+ if (p2 & 0xFF000000)
+ /* RGBA nonzero alpha: initialized. Average with existing,
+ otherwise the grid lines look terrible. */
+ p = (((((p>>24) & 0xFF) + ((p2>>24) & 0xFF)) >> 1) << 24 |
+ ((((p>>16) & 0xFF) + ((p2>>16) & 0xFF)) >> 1) << 16 |
+ ((((p>> 8) & 0xFF) + ((p2>> 8) & 0xFF)) >> 1) << 8 |
+ ((((p>> 0) & 0xFF) + ((p2>> 0) & 0xFF)) >> 1) << 0);
+ out[dy * w + dx] = p;
+ }
+
+ /* Fill in the triangles that are not a part of The World with the
+ color of the ocean to avoid texture-tearing on the folded edges.
+ */
+ out = (uint32_t *) dymaxion->data;
+ end = dymaxion->height * dymaxion->bytes_per_line / 4;
+ {
+ double lat = -48.44, lon = -123.39; /* R'Lyeh */
+ int x = (lon + 180) * blended->width / 360.0;
+ int y = (lat + 90) * blended->height / 180.0;
+ unsigned long ocean = XGetPixel (gp->day, x, y);
+ for (i = 0; i < end; i++)
+ {
+ uint32_t p = *out;
+ if (! (p & 0xFF000000)) /* AGBR */
+ *out = ocean;
+ out++;
+ }
+ }
+
+ if (blended != gp->day)
+ XDestroyImage (blended);
+
+ gp->images[(int) gp->current_frame] = dymaxion;
+
+ if (!gp->cache_p) /* Keep only one image around; recompute every time. */
+ {
+ i = ((int) gp->current_frame) - 1;
+ if (i < 0) i = gp->nimages - 1;
+ if (gp->images[i])
+ {
+ XDestroyImage (gp->images[i]);
+ gp->images[i] = 0;
+ }
+ }
+}
+
+
+static void
+setup_texture (ModeInfo * mi)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+ XImage *ground;
+
+ glGenTextures (1, &gp->tex1);
+ glBindTexture (GL_TEXTURE_2D, gp->tex1);
+
+ /* Must be after glBindTexture */
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ load_images (mi);
+
+ glGenTextures (1, &gp->tex2);
+ glBindTexture (GL_TEXTURE_2D, gp->tex2);
+
+ /* Must be after glBindTexture */
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ /* The underground image can go on flat, without the dymaxion transform. */
+ ground = image_data_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi),
+ ground_png, sizeof(ground_png));
+ clear_gl_error();
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ /* glPixelStorei(GL_UNPACK_ROW_LENGTH, ground->width); */
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ ground->width, ground->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, ground->data);
+ check_gl_error ("ground texture");
+ XDestroyImage (ground);
+}
+
+
+static void
+init_stars (ModeInfo *mi)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+ int i, j;
+ int width = MI_WIDTH(mi);
+ int height = MI_HEIGHT(mi);
+ int size = (width > height ? width : height);
+ int nstars = size * size / 80;
+ int max_size = 3;
+ GLfloat inc = 0.5;
+ int steps = max_size / inc;
+ GLfloat scale = 1;
+
+ if (MI_WIDTH(mi) > 2560) { /* Retina displays */
+ scale *= 2;
+ nstars /= 2;
+ }
+
+ gp->starlist = glGenLists(1);
+ glNewList(gp->starlist, GL_COMPILE);
+ for (j = 1; j <= steps; j++)
+ {
+ glPointSize(inc * j * scale);
+ glBegin (GL_POINTS);
+ for (i = 0; i < nstars / steps; i++)
+ {
+ GLfloat d = 0.1;
+ GLfloat r = 0.15 + frand(0.3);
+ GLfloat g = r + frand(d) - d;
+ GLfloat b = r + frand(d) - d;
+
+ GLfloat x = frand(1)-0.5;
+ GLfloat y = frand(1)-0.5;
+ GLfloat z = ((random() & 1)
+ ? frand(1)-0.5
+ : (BELLRAND(1)-0.5)/12); /* milky way */
+ d = sqrt (x*x + y*y + z*z);
+ x /= d;
+ y /= d;
+ z /= d;
+ glColor3f (r, g, b);
+ glVertex3f (x, y, z);
+ gp->starcount++;
+ }
+ glEnd ();
+ }
+ glEndList ();
+
+ check_gl_error("stars initialization");
+}
+
+
+ENTRYPOINT void
+reshape_planet (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+
+ glViewport(0, 0, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-1.0, 1.0, -h, h, 5.0, 200.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.0, 0.0, -40);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (h, h, h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+static void
+do_normal2 (ModeInfo *mi, Bool frontp, XYZ a, XYZ b, XYZ c)
+{
+ XYZ n = (frontp
+ ? calc_normal (a, b, c)
+ : calc_normal (b, a, c));
+ glNormal3f (n.x, n.y, n.z);
+
+# if 0
+ if (frontp && MI_IS_WIREFRAME(mi))
+ {
+ glBegin (GL_LINES);
+ glVertex3f ((a.x + b.x + c.x) / 3,
+ (a.y + b.y + c.y) / 3,
+ (a.z + b.z + c.z) / 3);
+ glVertex3f ((a.x + b.x + c.x) / 3 + n.x,
+ (a.y + b.y + c.y) / 3 + n.y,
+ (a.z + b.z + c.z) / 3 + n.z);
+ glEnd();
+ }
+# endif
+}
+
+
+static void
+triangle0 (ModeInfo *mi, Bool frontp, GLfloat stel_ratio, int facemask,
+ XYZ *corners_ret)
+{
+ /* Render a triangle as six sub-triangles.
+ Facemask bits 0-5 indicate which sub-triangle to draw.
+
+ A
+ / \
+ / | \
+ / | \
+ / 0 | 1 \
+ E /_ | _\ F
+ / \_ | _/ \
+ / 5 \D/ 2 \
+ / / | \ \
+ / / 4 | 3 \ \
+ / / | \ \
+ B ----------------------- C
+ G
+ */
+
+ Bool wire = MI_IS_WIREFRAME(mi);
+ GLfloat h = sqrt(3) / 2;
+ GLfloat h2 = sqrt(h*h - (h/2)*(h/2)) - 0.5;
+ XYZ A, B, C, D, E, F, G;
+ XYZ tA, tB, tC, tD, tE, tF, tG;
+ XYZ a, b, c;
+ XYZ ta, tb, tc;
+ A.x = 0; A.y = h; A.z = 0;
+ B.x = -0.5, B.y = 0; B.z = 0;
+ C.x = 0.5, C.y = 0; C.z = 0;
+ D.x = 0; D.y = h/3; D.z = 0;
+ E.x = -h2; E.y = h/2; E.z = 0;
+ F.x = h2; F.y = h/2; F.z = 0;
+ G.x = 0; G.y = 0; G.z = 0;
+
+ /* When tweaking object XY to stellate, don't change texture coordinates. */
+ tA = A; tB = B; tC = C; tD = D; tE = E; tF = F; tG = G;
+
+ /* Eyeballed this to find the depth of stellation that seems to most
+ approximate a sphere.
+ */
+ D.z = 0.193 * stel_ratio;
+
+ /* We want to raise E, F and G as well but we can't just shift Z:
+ we need to keep them on the same vector from the center of the sphere,
+ which means also changing F and G's X and Y.
+ */
+ E.z = F.z = G.z = 0.132 * stel_ratio;
+ {
+ double magic_x = 0.044;
+ double magic_y = 0.028;
+ /* G.x stays 0 */
+ G.y -= sqrt (magic_x*magic_x + magic_y*magic_y) * stel_ratio;
+ E.x -= magic_x * stel_ratio;
+ E.y += magic_y * stel_ratio;
+ F.x += magic_x * stel_ratio;
+ F.y += magic_y * stel_ratio;
+ }
+
+
+ if (facemask & 1<<0)
+ {
+ a = E; b = D; c = A;
+ ta = tE; tb = tD; tc = tA;
+ do_normal2 (mi, frontp, a, b, c);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ glTexCoord2f (ta.x, ta.y); glVertex3f (a.x, a.y, a.z);
+ glTexCoord2f (tb.x, tb.y); glVertex3f (b.x, b.y, b.z);
+ glTexCoord2f (tc.x, tc.y); glVertex3f (c.x, c.y, c.z);
+ glEnd();
+ mi->polygon_count++;
+ }
+ if (facemask & 1<<1)
+ {
+ a = D; b = F; c = A;
+ ta = tD; tb = tF; tc = tA;
+ do_normal2 (mi, frontp, a, b, c);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ glTexCoord2f (ta.x, ta.y); glVertex3f (a.x, a.y, a.z);
+ glTexCoord2f (tb.x, tb.y); glVertex3f (b.x, b.y, b.z);
+ glTexCoord2f (tc.x, tc.y); glVertex3f (c.x, c.y, c.z);
+ glEnd();
+ mi->polygon_count++;
+ }
+ if (facemask & 1<<2)
+ {
+ a = D; b = C; c = F;
+ ta = tD; tb = tC; tc = tF;
+ do_normal2 (mi, frontp, a, b, c);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ glTexCoord2f (ta.x, ta.y); glVertex3f (a.x, a.y, a.z);
+ glTexCoord2f (tb.x, tb.y); glVertex3f (b.x, b.y, b.z);
+ glTexCoord2f (tc.x, tc.y); glVertex3f (c.x, c.y, c.z);
+ glEnd();
+ mi->polygon_count++;
+ }
+ if (facemask & 1<<3)
+ {
+ a = G; b = C; c = D;
+ ta = tG; tb = tC; tc = tD;
+ do_normal2 (mi, frontp, a, b, c);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ glTexCoord2f (ta.x, ta.y); glVertex3f (a.x, a.y, a.z);
+ glTexCoord2f (tb.x, tb.y); glVertex3f (b.x, b.y, b.z);
+ glTexCoord2f (tc.x, tc.y); glVertex3f (c.x, c.y, c.z);
+ glEnd();
+ mi->polygon_count++;
+ }
+ if (facemask & 1<<4)
+ {
+ a = B; b = G; c = D;
+ ta = tB; tb = tG; tc = tD;
+ do_normal2 (mi, frontp, a, b, c);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ glTexCoord2f (ta.x, ta.y); glVertex3f (a.x, a.y, a.z);
+ glTexCoord2f (tb.x, tb.y); glVertex3f (b.x, b.y, b.z);
+ glTexCoord2f (tc.x, tc.y); glVertex3f (c.x, c.y, c.z);
+ glEnd();
+ mi->polygon_count++;
+ }
+ if (facemask & 1<<5)
+ {
+ a = B; b = D; c = E;
+ ta = tB; tb = tD; tc = tE;
+ do_normal2 (mi, frontp, a, b, c);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ glTexCoord2f (ta.x, ta.y); glVertex3f (a.x, a.y, a.z);
+ glTexCoord2f (tb.x, tb.y); glVertex3f (b.x, b.y, b.z);
+ glTexCoord2f (tc.x, tc.y); glVertex3f (c.x, c.y, c.z);
+ glEnd();
+ mi->polygon_count++;
+ }
+ if (facemask & 1<<6)
+ {
+ a = E; b = D; c = A;
+ ta = tE; tb = tD; tc = tA;
+ do_normal2 (mi, frontp, a, b, c);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ glTexCoord2f (ta.x, ta.y); glVertex3f (a.x, a.y, a.z);
+ glTexCoord2f (tb.x, tb.y); glVertex3f (b.x, b.y, b.z);
+ glTexCoord2f (tc.x, tc.y); glVertex3f (c.x, c.y, c.z);
+ glEnd();
+ mi->polygon_count++;
+ }
+
+ if (corners_ret)
+ {
+ corners_ret[0] = A;
+ corners_ret[1] = B;
+ corners_ret[2] = C;
+ corners_ret[3] = D;
+ corners_ret[4] = E;
+ corners_ret[5] = F;
+ corners_ret[6] = G;
+ }
+}
+
+
+/* The segments, numbered arbitrarily from the top left:
+ ________ _ ________
+ \ /\ /\ \ |\ /
+ \ 0 / \ / \3> | \ 5 /
+ \ / 1 \ / 2 \| ..|4 \ /-6-..
+ ___________\/______\/______\/______\/______\
+ | /\ /\ /\ /\ /\
+ |7 / \ 9 / \ 11 / \ 13 / \ 15 / \
+ | / 8 \ / 10 \ / 12 \ / 14 \ / 16 \
+ |/______\/______\/______\/______\/______\
+ \ /\ / /\ /\
+ \ 17 / \ 18 / / \ 20 / \
+ \ / \ / / 19 \ / 21 \
+ \/ \/ /______\/______\
+
+ Each triangle can be connected to at most two other triangles.
+ We start from the middle, #12, and work our way to the edges.
+ Its centroid is 0,0.
+
+ (Note that dymaxionmap-coords.c uses a different numbering system.)
+ */
+static void
+triangle (ModeInfo *mi, int which, Bool frontp,
+ GLfloat fold_ratio, GLfloat stel_ratio)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+ const GLfloat fg[] = { 1, 1, 1, 1 };
+ const GLfloat bg[] = { 0.3, 0.3, 0.3, 1 };
+ int a = -1, b = -1;
+ GLfloat max = acos (sqrt(5)/3);
+ GLfloat rot = -max * fold_ratio / (M_PI/180);
+ Bool wire = MI_IS_WIREFRAME(mi);
+ XYZ corners[7];
+
+ glColor3fv (fg);
+ if (!wire)
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, fg);
+
+ switch (which) {
+ case 3: /* One third of the face. */
+ triangle0 (mi, frontp, stel_ratio, 1<<3 | 1<<4, corners);
+ break;
+ case 4: /* Two thirds of the face: convex. */
+ triangle0 (mi, frontp, stel_ratio, 1<<1 | 1<<2 | 1<<3 | 1<<4, corners);
+ break;
+ case 6: /* One half of the face. */
+ triangle0 (mi, frontp, stel_ratio, 1<<1 | 1<<2 | 1<<3, corners);
+ break;
+ case 7: /* One half of the face. */
+ triangle0 (mi, frontp, stel_ratio, 1<<2 | 1<<3 | 1<<4, corners);
+ break;
+ default: /* Full face. */
+ triangle0 (mi, frontp, stel_ratio, 0x3F, corners);
+ break;
+ }
+
+ if (wire)
+ {
+ char tag[20];
+ glColor3fv (bg);
+ sprintf (tag, "%d", which);
+ glPushMatrix();
+ glTranslatef (-0.1, 0.2, 0);
+ glScalef (0.005, 0.005, 0.005);
+ print_texture_string (gp->font_data, tag);
+ glPopMatrix();
+ mi->polygon_count++;
+ }
+
+
+ /* The connection hierarchy of the faces starting at the middle, #12. */
+ switch (which) {
+ case 0: break;
+ case 1: a = 0; b = -1; break;
+ case 2: a = -1; b = 3; break;
+ case 3: break;
+ case 4: a = -1; b = 5; break;
+ case 5: a = -1; b = 6; break;
+ case 7: break;
+ case 6: break;
+ case 8: a = 17; b = 7; break;
+ case 9: a = 8; b = -1; break;
+ case 10: a = 18; b = 9; break;
+ case 11: a = 10; b = 1; break;
+ case 12: a = 11; b = 13; break;
+ case 13: a = 2; b = 14; break;
+ case 14: a = 15; b = 20; break;
+ case 15: a = 4; b = 16; break;
+ case 16: break;
+ case 17: break;
+ case 18: break;
+ case 19: break;
+ case 20: a = 21; b = 19; break;
+ case 21: break;
+ default: abort(); break;
+ }
+
+ if (a != -1)
+ {
+ glPushMatrix();
+ glTranslatef (-0.5, 0, 0); /* Move model matrix to upper left */
+ glRotatef (60, 0, 0, 1);
+ glTranslatef ( 0.5, 0, 0);
+
+ glMatrixMode(GL_TEXTURE);
+ /* glPushMatrix(); */
+ glTranslatef (-0.5, 0, 0); /* Move texture matrix the same way */
+ glRotatef (60, 0, 0, 1);
+ glTranslatef ( 0.5, 0, 0);
+
+ glMatrixMode(GL_MODELVIEW);
+
+ glRotatef (rot, 1, 0, 0);
+ triangle (mi, a, frontp, fold_ratio, stel_ratio);
+
+ /* This should just be a PopMatrix on the TEXTURE stack, but
+ fucking iOS has GL_MAX_TEXTURE_STACK_DEPTH == 4! WTF!
+ So we have to undo our rotations and translations manually.
+ */
+ glMatrixMode(GL_TEXTURE);
+ /* glPopMatrix(); */
+ glTranslatef (-0.5, 0, 0);
+ glRotatef (-60, 0, 0, 1);
+ glTranslatef (0.5, 0, 0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glPopMatrix();
+ }
+
+ if (b != -1)
+ {
+ glPushMatrix();
+ glTranslatef (0.5, 0, 0); /* Move model matrix to upper right */
+ glRotatef (-60, 0, 0, 1);
+ glTranslatef (-0.5, 0, 0);
+
+ glMatrixMode(GL_TEXTURE);
+ /* glPushMatrix(); */
+ glTranslatef (0.5, 0, 0); /* Move texture matrix the same way */
+ glRotatef (-60, 0, 0, 1);
+ glTranslatef (-0.5, 0, 0);
+
+ glMatrixMode(GL_MODELVIEW);
+
+ glRotatef (rot, 1, 0, 0);
+ triangle (mi, b, frontp, fold_ratio, stel_ratio);
+
+ /* See above. Grr. */
+ glMatrixMode(GL_TEXTURE);
+ /* glPopMatrix(); */
+ glTranslatef (0.5, 0, 0);
+ glRotatef (60, 0, 0, 1);
+ glTranslatef (-0.5, 0, 0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glPopMatrix();
+ }
+
+
+ /* Draw a border around the edge of the world.
+ */
+ if (!wire && frontp && stel_ratio == 0 && fold_ratio < 0.95)
+ {
+ int edges = 0;
+ GLfloat c[] = { 0, 0.2, 0.5, 1 };
+ c[3] = 1-fold_ratio;
+
+ switch (which)
+ {
+ case 0: edges = 1<<0 | 1<<2; break;
+ case 1: edges = 1<<2; break;
+ case 2: edges = 1<<0; break;
+ case 3: edges = 1<<3 | 1<<4; break;
+ case 4: edges = 1<<3 | 1<<5; break;
+ case 5: edges = 1<<0 | 1<<6; break;
+ case 6: edges = 1<<2 | 1<<7; break;
+ case 16: edges = 1<<0 | 1<<2; break;
+ case 21: edges = 1<<0 | 1<<2; break;
+ case 19: edges = 1<<0 | 1<<2; break;
+ case 12: edges = 1<<1; break;
+ case 18: edges = 1<<0 | 1<<2; break;
+ case 17: edges = 1<<0 | 1<<2; break;
+ case 7: edges = 1<<8 | 1<<9; break;
+ case 9: edges = 1<<2; break;
+ default: break;
+ }
+
+ glDisable (GL_TEXTURE_2D);
+ glDisable (GL_LIGHTING);
+ glLineWidth (2);
+ glColor4fv (c);
+ glBegin (GL_LINES);
+ if (edges & 1<<0)
+ {
+ glVertex3f (corners[0].x, corners[0].y, corners[0].z);
+ glVertex3f (corners[1].x, corners[1].y, corners[1].z);
+ }
+ if (edges & 1<<1)
+ {
+ glVertex3f (corners[1].x, corners[1].y, corners[1].z);
+ glVertex3f (corners[2].x, corners[2].y, corners[2].z);
+ }
+ if (edges & 1<<2)
+ {
+ glVertex3f (corners[2].x, corners[2].y, corners[2].z);
+ glVertex3f (corners[0].x, corners[0].y, corners[0].z);
+ }
+ if (edges & 1<<3)
+ {
+ glVertex3f (corners[1].x, corners[1].y, corners[1].z);
+ glVertex3f (corners[3].x, corners[3].y, corners[3].z);
+ }
+ if (edges & 1<<4)
+ {
+ glVertex3f (corners[3].x, corners[3].y, corners[3].z);
+ glVertex3f (corners[2].x, corners[2].y, corners[2].z);
+ }
+ if (edges & 1<<5)
+ {
+ glVertex3f (corners[3].x, corners[3].y, corners[3].z);
+ glVertex3f (corners[0].x, corners[0].y, corners[0].z);
+ }
+ if (edges & 1<<6)
+ {
+ glVertex3f (corners[0].x, corners[0].y, corners[0].z);
+ glVertex3f (corners[5].x, corners[5].y, corners[5].z);
+ }
+ if (edges & 1<<7)
+ {
+ glVertex3f (corners[0].x, corners[0].y, corners[0].z);
+ glVertex3f (corners[6].x, corners[6].y, corners[6].z);
+ }
+ if (edges & 1<<8)
+ {
+ glVertex3f (corners[1].x, corners[1].y, corners[1].z);
+ glVertex3f (corners[5].x, corners[5].y, corners[5].z);
+ }
+ if (edges & 1<<9)
+ {
+ glVertex3f (corners[5].x, corners[5].y, corners[5].z);
+ glVertex3f (corners[2].x, corners[2].y, corners[2].z);
+ }
+ glEnd();
+ glEnable (GL_TEXTURE_2D);
+ glEnable (GL_LIGHTING);
+ }
+}
+
+
+static void
+draw_triangles (ModeInfo *mi, GLfloat fold_ratio, GLfloat stel_ratio)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+ Bool wire = MI_IS_WIREFRAME(mi);
+ GLfloat h = sqrt(3) / 2;
+ GLfloat c = h / 3;
+
+ glTranslatef (0, -h/3, 0); /* Center on face 12 */
+
+ /* When closed, center on midpoint of icosahedron. Eyeballed this. */
+ glTranslatef (0, 0, fold_ratio * 0.754);
+
+ glFrontFace (GL_CCW);
+
+ /* Adjust the texture matrix so that it has the same coordinate space
+ as the model. */
+
+ glMatrixMode(GL_TEXTURE);
+ glPushMatrix();
+ {
+ GLfloat texw = 5.5;
+ GLfloat texh = 3 * h;
+ GLfloat midx = 2.5;
+ GLfloat midy = 3 * c;
+ glScalef (1/texw, -1/texh, 1);
+ glTranslatef (midx, midy, 0);
+ }
+ glMatrixMode(GL_MODELVIEW);
+
+
+
+ /* Front faces */
+
+ if (wire)
+ glDisable (GL_TEXTURE_2D);
+ else if (do_texture)
+ {
+ glEnable (GL_TEXTURE_2D);
+ glBindTexture (GL_TEXTURE_2D, gp->tex1);
+ }
+ else
+ glDisable (GL_TEXTURE_2D);
+
+ triangle (mi, 12, True, fold_ratio, stel_ratio);
+
+ /* Back faces */
+
+ if (wire)
+ glDisable (GL_TEXTURE_2D);
+ else if (do_texture)
+ {
+ glEnable (GL_TEXTURE_2D);
+ glBindTexture (GL_TEXTURE_2D, gp->tex2);
+ }
+ else
+ glDisable (GL_TEXTURE_2D);
+
+ glFrontFace (GL_CW);
+
+ triangle (mi, 12, False, fold_ratio, 0);
+
+ glMatrixMode(GL_TEXTURE);
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+}
+
+
+static void
+align_axis (ModeInfo *mi, int undo)
+{
+ /* Rotate so that an axis is lined up with the north and south poles
+ on the map, which are not in the center of their faces, or any
+ other easily computable spot. */
+
+ GLfloat r1 = 20.5;
+ GLfloat r2 = 28.5;
+
+ if (undo)
+ {
+ glRotatef (-r2, 0, 1, 0);
+ glRotatef ( r2, 1, 0, 0);
+ glRotatef (-r1, 1, 0, 0);
+ }
+ else
+ {
+ glRotatef (r1, 1, 0, 0);
+ glRotatef (-r2, 1, 0, 0);
+ glRotatef ( r2, 0, 1, 0);
+ }
+}
+
+
+static void
+draw_axis (ModeInfo *mi)
+{
+ GLfloat s;
+ glDisable (GL_TEXTURE_2D);
+ glDisable (GL_LIGHTING);
+ glPushMatrix();
+
+ align_axis (mi, 0);
+ glTranslatef (0.34, 0.39, -0.61);
+
+ s = 0.96;
+ glScalef (s, s, s); /* tighten up the enclosing sphere */
+
+ glLineWidth (1);
+ glColor3f (0.5, 0.5, 0);
+
+ glRotatef (90, 1, 0, 0); /* unit_sphere is off by 90 */
+ glRotatef (9.5, 0, 1, 0); /* line up the time zones */
+ glFrontFace (GL_CCW);
+ unit_sphere (12, 24, True);
+ glBegin(GL_LINES);
+ glVertex3f(0, -2, 0);
+ glVertex3f(0, 2, 0);
+ glEnd();
+
+ glPopMatrix();
+}
+
+
+
+
+ENTRYPOINT Bool
+planet_handle_event (ModeInfo *mi, XEvent *event)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, gp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &gp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == ' ' || c == '\t' || c == '\r' || c == '\n')
+ {
+ int i;
+ double cf = gp->current_frame;
+
+ /* Switch between the satellite and flat map, preserving position. */
+ if (gp->day) XDestroyImage (gp->day);
+ if (gp->night) XDestroyImage (gp->night);
+ if (gp->cvt) XDestroyImage (gp->cvt);
+ gp->day = 0;
+ gp->night = 0;
+ gp->cvt = 0;
+
+ for (i = 0; i < gp->nimages; i++)
+ if (gp->images[i]) XDestroyImage (gp->images[i]);
+ free (gp->images);
+ gp->images = 0;
+
+ which_image = strdup (!strcmp (which_image, "BUILTIN_DAY")
+ ? "BUILTIN_FLAT" : "BUILTIN_DAY");
+ which_image2 = strdup (!strcmp (which_image2, "BUILTIN_NIGHT")
+ ? "BUILTIN_FLAT" : "BUILTIN_NIGHT");
+ load_images (mi);
+ gp->current_frame = cf;
+# if 0
+ switch (gp->state) {
+ case FLAT: case ICO: case STEL: case AXIS: case ICO2:
+ gp->ratio = 1;
+ break;
+ default:
+ break;
+ }
+# endif
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_planet (ModeInfo * mi)
+{
+ planetstruct *gp;
+ int screen = MI_SCREEN(mi);
+ Bool wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, planets);
+ gp = &planets[screen];
+
+ if ((gp->glx_context = init_GL(mi)) != NULL) {
+ reshape_planet(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+
+ gp->state = STARTUP;
+ gp->ratio = 0;
+ gp->font_data = load_texture_font (mi->dpy, "labelFont");
+ gp->delay = MI_DELAY(mi);
+
+ {
+ double spin_speed = 0.1;
+ double wander_speed = 0.002;
+ gp->rot = make_rotator (do_roll ? spin_speed : 0,
+ do_roll ? spin_speed : 0,
+ 0, 1,
+ do_wander ? wander_speed : 0,
+ False);
+ gp->rot2 = make_rotator (0, 0, 0, 0, wander_speed, False);
+ gp->trackball = gltrackball_init (True);
+ }
+
+ if (wire)
+ do_texture = False;
+
+ if (do_texture)
+ setup_texture (mi);
+
+ if (do_stars)
+ init_stars (mi);
+
+ glEnable (GL_DEPTH_TEST);
+ glEnable (GL_NORMALIZE);
+ glEnable (GL_CULL_FACE);
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1, 1, 1, 0};
+ GLfloat amb[4] = {0, 0, 0, 1};
+ GLfloat dif[4] = {1, 1, 1, 1};
+ GLfloat spc[4] = {0, 1, 1, 1};
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+}
+
+
+static GLfloat
+ease_fn (GLfloat r)
+{
+ return cos ((r/2 + 1) * M_PI) + 1; /* Smooth curve up, end at slope 1. */
+}
+
+
+static GLfloat
+ease_ratio (GLfloat r)
+{
+ GLfloat ease = 0.35;
+ if (r <= 0) return 0;
+ else if (r >= 1) return 1;
+ else if (r <= ease) return ease * ease_fn (r / ease);
+ else if (r > 1-ease) return 1 - ease * ease_fn ((1 - r) / ease);
+ else return r;
+}
+
+
+ENTRYPOINT void
+draw_planet (ModeInfo * mi)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ long delay = gp->delay;
+ double x, y, z;
+
+ if (!gp->glx_context)
+ return;
+
+ glDrawBuffer(GL_BACK);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glXMakeCurrent (dpy, window, *(gp->glx_context));
+
+ mi->polygon_count = 0;
+
+ if (! gp->button_down_p)
+ switch (gp->state) {
+ case STARTUP: gp->ratio += speed * 0.01; break;
+ case FLAT: gp->ratio += speed * 0.005 *
+ /* Stay flat longer if animating day and night. */
+ (gp->nimages <= 1 ? 1 : 0.3);
+ break;
+ case FOLD: gp->ratio += speed * 0.01; break;
+ case ICO: gp->ratio += speed * 0.01; break;
+ case STEL_IN: gp->ratio += speed * 0.05; break;
+ case STEL: gp->ratio += speed * 0.01; break;
+ case STEL_OUT: gp->ratio += speed * 0.07; break;
+ case ICO2: gp->ratio += speed * 0.07; break;
+ case AXIS: gp->ratio += speed * 0.02; break;
+ case SPIN: gp->ratio += speed * 0.005; break;
+ case UNFOLD: gp->ratio += speed * 0.01; break;
+ default: abort();
+ }
+
+ if (gp->ratio > 1.0)
+ {
+ gp->ratio = 0;
+ switch (gp->state) {
+ case STARTUP: gp->state = FLAT; break;
+ case FLAT: gp->state = FOLD; break;
+ case FOLD: gp->state = ICO; break;
+ case ICO: gp->state = STEL_IN; break;
+ case STEL_IN: gp->state = STEL; break;
+ case STEL:
+ {
+ int i = (random() << 9) % 7;
+ gp->state = (i < 3 ? STEL_OUT :
+ i < 6 ? SPIN : AXIS);
+ }
+ break;
+ case AXIS: gp->state = STEL_OUT; break;
+ case SPIN: gp->state = STEL_OUT; break;
+ case STEL_OUT: gp->state = ICO2; break;
+ case ICO2: gp->state = UNFOLD; break;
+ case UNFOLD: gp->state = FLAT; break;
+ default: abort();
+ }
+ }
+
+ glEnable(GL_LINE_SMOOTH);
+ glEnable(GL_POINT_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+
+ glPushMatrix();
+
+ gltrackball_rotate (gp->trackball);
+ glRotatef (current_device_rotation(), 0, 0, 1);
+
+# ifdef HAVE_MOBILE /* Fill more of the screen. */
+ {
+ int size = MI_WIDTH(mi) < MI_HEIGHT(mi)
+ ? MI_WIDTH(mi) : MI_HEIGHT(mi);
+ GLfloat s = (size > 768 ? 1.4 : /* iPad */
+ 2); /* iPhone */
+ glScalef (s, s, s);
+ if (MI_WIDTH(mi) < MI_HEIGHT(mi))
+ glRotatef (90, 0, 0, 1);
+ }
+# endif
+
+ if (gp->state != STARTUP)
+ {
+ get_position (gp->rot, &x, &y, &z, !gp->button_down_p);
+ x = (x - 0.5) * 3;
+ y = (y - 0.5) * 3;
+ z = 0;
+ glTranslatef(x, y, z);
+ }
+
+ if (do_roll && gp->state != STARTUP)
+ {
+ double max = 65;
+ get_position (gp->rot2, &x, &y, 0, !gp->button_down_p);
+ glRotatef (max/2 - x*max, 1, 0, 0);
+ glRotatef (max/2 - y*max, 0, 1, 0);
+ }
+
+ if (do_stars)
+ {
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_LIGHTING);
+ glPushMatrix();
+ glScalef (60, 60, 60);
+ glRotatef (90, 1, 0, 0);
+ glRotatef (35, 1, 0, 0);
+ glCallList (gp->starlist);
+ mi->polygon_count += gp->starcount;
+ glPopMatrix();
+ glClear(GL_DEPTH_BUFFER_BIT);
+ }
+
+ if (! wire)
+ {
+ glEnable (GL_LIGHTING);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ if (do_texture)
+ glEnable(GL_TEXTURE_2D);
+
+ if (do_texture /* && !gp->button_down_p */)
+ {
+ int i;
+ int prev = gp->current_frame;
+
+ /* By default, advance terminator by about an hour every 5 seconds. */
+ gp->current_frame += 0.1 * speed * (gp->nimages / 360.0);
+ while (gp->current_frame >= gp->nimages)
+ gp->current_frame -= gp->nimages;
+ i = gp->current_frame;
+
+ /* Load the current image into the texture.
+ */
+ if (i != prev || !gp->images[i])
+ {
+ double start = double_time();
+ cache_current_frame (mi);
+
+ glBindTexture (GL_TEXTURE_2D, gp->tex1);
+
+ /* Must be after glBindTexture */
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ gp->images[i]->width,
+ gp->images[i]->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE,
+ gp->images[i]->data);
+ check_gl_error ("texture");
+
+ /* If caching the image took a bunch of time, deduct that from
+ our per-frame delay to keep the timing a little smoother. */
+ delay -= 1000000 * (double_time() - start);
+ if (delay < 0) delay = 0;
+ }
+ }
+
+ glTranslatef (-0.5, -0.4, 0);
+ glScalef (2.6, 2.6, 2.6);
+
+ {
+ GLfloat fold_ratio = 0;
+ GLfloat stel_ratio = 0;
+ switch (gp->state) {
+ case FOLD: fold_ratio = gp->ratio; break;
+ case UNFOLD: fold_ratio = 1 - gp->ratio; break;
+ case ICO: case ICO2: fold_ratio = 1; break;
+ case STEL: case AXIS: case SPIN: fold_ratio = 1; stel_ratio = 1; break;
+ case STEL_IN: fold_ratio = 1; stel_ratio = gp->ratio; break;
+ case STEL_OUT: fold_ratio = 1; stel_ratio = 1 - gp->ratio; break;
+ case STARTUP: /* Tilt in from flat */
+ glRotatef (-90 * ease_ratio (1 - gp->ratio), 1, 0, 0);
+ break;
+
+ default: break;
+ }
+
+# ifdef HAVE_MOBILE /* Enlarge the icosahedron a bit to make it more visible */
+ {
+ GLfloat s = 1 + 1.3 * ease_ratio (fold_ratio);
+ glScalef (s, s, s);
+ }
+# endif
+
+ if (gp->state == SPIN)
+ {
+ align_axis (mi, 0);
+ glRotatef (ease_ratio (gp->ratio) * 360 * 3, 0, 0, 1);
+ align_axis (mi, 1);
+ }
+
+ draw_triangles (mi, ease_ratio (fold_ratio), ease_ratio (stel_ratio));
+
+ if (gp->state == AXIS)
+ draw_axis(mi);
+ }
+
+ glPopMatrix();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers(dpy, window);
+
+ MI_DELAY(mi) = delay;
+}
+
+
+ENTRYPOINT void
+free_planet (ModeInfo * mi)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+ int i;
+
+ if (gp->day) XDestroyImage (gp->day);
+ if (gp->night) XDestroyImage (gp->night);
+ if (gp->dusk) XDestroyImage (gp->dusk);
+ if (gp->cvt) XDestroyImage (gp->cvt);
+
+ for (i = 0; i < gp->nimages; i++)
+ if (gp->images[i]) XDestroyImage (gp->images[i]);
+ free (gp->images);
+
+ if (gp->glx_context) {
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(gp->glx_context));
+
+ if (glIsList(gp->starlist))
+ glDeleteLists(gp->starlist, 1);
+ }
+}
+
+
+XSCREENSAVER_MODULE_2 ("DymaxionMap", dymaxionmap, planet)
+
+#endif
diff --git a/hacks/glx/dymaxionmap.man b/hacks/glx/dymaxionmap.man
new file mode 100644
index 0000000..9f3e794
--- /dev/null
+++ b/hacks/glx/dymaxionmap.man
@@ -0,0 +1,117 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+dymaxionmap - An animation of Buckminster Fuller's unwrapped icosahedral globe.
+.SH SYNOPSIS
+.B dymaxionmap
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fIratio\fP]
+[\-no-wander]
+[\-no-roll]
+[\-no-stars]
+[\-no-grid]
+[\-flat]
+[\-satellite]
+[\-image \fIfile\fP]
+[\-image2 \fIfile\fP]
+[\-frames \fInumber\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Buckminster Fuller's map of the Earth projected onto the surface of an
+unfolded icosahedron. It depicts the Earth's continents as one island, or
+nearly contiguous land masses.
+
+This screen saver animates the progression of the dusk terminator across
+the flattened globe. It includes both satellite and flat-colored map
+imagery, and can load and convert other Equirectangular-projected maps.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds).
+.TP 8
+.B \-speed \fIratio\fP
+Speed of the animation. 0.5 means half as fast, 2 means twice as fast.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen. Default yes.
+.TP 8
+.B \-roll | \-no-roll
+Whether the object should roll randomly. Default yes.
+.TP 8
+.B \-stars | \-no-stars
+Whether to display a star field. Default yes.
+.TP 8
+.B \-grid | \-no-grid
+Whether to overlay a latitude/longitude grid over the map. Default yes.
+.TP 8
+.B \-flat
+Display a flat-colored map of the Earth. This is the default.
+.TP 8
+.B \-satellite
+Display a day-time satellite map of the Earth.
+.TP 8
+.B \-image \fIfile\fP
+An image to use for the day-time map.
+.TP 8
+.B \-image2 \fIfile\fP
+An image to use for the night-time map.
+The two images can be the same: the night-time one will be darkened.
+.TP 8
+.B \-frames \fInumber\fP
+The number of frames in the day/night animation. Default 720.
+Larger numbers are smoother, but use more memory.
+The day/night animation happens if \fIimage2\fP is set, or
+if \fIframes\fP is greater than 1.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR glplanet (1)
+.SH COPYRIGHT
+Copyright \(co 2016-2018 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+
+"Dymaxion Map" and "The Fuller Projection Map" are trademarks of
+The Buckminster Fuller Institute.
+
+The original Dymaxion Map image is copyright \(co 1982 by
+The Buckminster Fuller Institute. (This program does not use their
+imagery, only similar trigonometry.)
+
+The Dymaxion Map was covered by now-expired US Patent 2,393,676
+(Richard Buckminster Fuller, 1946).
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/e_textures.h b/hacks/glx/e_textures.h
new file mode 100644
index 0000000..7f9457e
--- /dev/null
+++ b/hacks/glx/e_textures.h
@@ -0,0 +1,1478 @@
+static unsigned char WoodTextureWidth = 199;
+static unsigned char WoodTextureHeight = 37;
+static unsigned char WoodTextureData[] =
+{
+ 84, 30, 12, 84, 26, 12, 108, 42, 28, 100, 38, 28, 108, 42, 28,
+ 108, 46, 28, 100, 38, 28, 108, 46, 28, 108, 42, 28, 108, 42, 20,
+ 108, 42, 28, 108, 38, 20, 108, 42, 20, 108, 42, 28, 116, 42, 28,
+ 108, 42, 20, 108, 46, 28, 100, 34, 12, 108, 42, 20, 108, 42, 20,
+ 108, 42, 20, 108, 38, 20, 100, 38, 20, 100, 38, 20, 108, 42, 20,
+ 108, 42, 20, 108, 38, 20, 100, 38, 20, 108, 38, 20, 100, 38, 20,
+ 108, 42, 20, 108, 42, 20, 108, 42, 28, 108, 42, 20, 108, 42, 20,
+ 100, 38, 20, 100, 38, 20, 100, 38, 20, 108, 38, 20, 116, 50, 28,
+ 108, 42, 28, 108, 42, 20, 100, 38, 20, 108, 42, 20, 108, 42, 20,
+ 108, 46, 28, 108, 42, 20, 108, 42, 20, 108, 42, 20, 100, 38, 20,
+ 108, 38, 20, 100, 38, 20, 108, 38, 20, 100, 38, 20, 100, 38, 20,
+ 108, 38, 20, 100, 38, 20, 108, 38, 20, 100, 42, 20, 108, 42, 20,
+ 108, 42, 28, 108, 42, 20, 100, 38, 20, 108, 42, 20, 100, 38, 20,
+ 100, 34, 12, 100, 38, 20, 108, 38, 20, 100, 38, 20, 108, 42, 20,
+ 108, 42, 20, 108, 42, 20, 100, 38, 20, 108, 38, 20, 100, 38, 20,
+ 100, 34, 12, 100, 38, 20, 108, 38, 20, 100, 38, 20, 108, 42, 20,
+ 100, 38, 20, 100, 34, 12, 100, 34, 12, 100, 38, 20, 108, 38, 20,
+ 100, 38, 20, 108, 38, 20, 108, 42, 20, 100, 38, 20, 108, 42, 20,
+ 108, 42, 28, 108, 46, 20, 108, 38, 20, 108, 42, 20, 108, 46, 28,
+ 108, 46, 28, 108, 42, 20, 108, 42, 20, 108, 42, 20, 100, 38, 20,
+ 108, 42, 20, 100, 38, 20, 108, 38, 20, 100, 38, 20, 108, 38, 20,
+ 108, 42, 20, 108, 46, 28, 116, 50, 28, 116, 54, 36, 116, 54, 36,
+ 116, 54, 28, 108, 46, 28, 108, 42, 20, 108, 42, 28, 108, 42, 20,
+ 108, 42, 20, 108, 46, 28, 116, 50, 28, 116, 50, 28, 116, 50, 28,
+ 116, 46, 28, 108, 42, 28, 116, 50, 36, 116, 50, 36, 100, 38, 20,
+ 108, 42, 28, 108, 38, 20, 100, 38, 20, 108, 38, 20, 108, 42, 28,
+ 108, 46, 28, 116, 46, 28, 108, 42, 28, 108, 42, 28, 108, 42, 20,
+ 108, 46, 28, 116, 50, 28, 116, 50, 28, 116, 50, 28, 116, 50, 28,
+ 108, 42, 28, 108, 42, 20, 100, 38, 20, 116, 50, 28, 108, 46, 28,
+ 108, 42, 20, 108, 42, 20, 108, 46, 28, 116, 46, 28, 108, 46, 28,
+ 108, 46, 28, 108, 46, 20, 108, 46, 28, 116, 46, 28, 108, 46, 28,
+ 116, 50, 28, 108, 46, 28, 108, 46, 28, 108, 42, 20, 116, 46, 28,
+ 108, 46, 28, 108, 42, 20, 108, 42, 28, 108, 46, 28, 116, 50, 28,
+ 116, 50, 28, 116, 50, 36, 124, 54, 36, 116, 54, 36, 116, 54, 28,
+ 116, 50, 28, 116, 50, 28, 108, 46, 28, 116, 46, 28, 108, 46, 28,
+ 116, 50, 28, 116, 46, 28, 116, 50, 28, 116, 50, 28, 116, 50, 28,
+ 116, 50, 28, 108, 46, 28, 108, 46, 20, 124, 50, 36, 116, 54, 28,
+ 124, 54, 28, 116, 54, 28, 116, 54, 28, 116, 54, 28, 124, 54, 36,
+ 124, 58, 36, 124, 50, 36, 116, 46, 28, 116, 46, 28, 116, 42, 28,
+ 116, 50, 36, 124, 66, 44, 108, 58, 36, 84, 30, 12, 100, 42, 20,
+ 116, 54, 36, 140, 82, 68, 148, 86, 68, 148, 86, 68, 156, 90, 76,
+ 148, 86, 68, 156, 86, 76, 156, 86, 68, 148, 86, 68, 156, 86, 68,
+ 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 90, 68, 156, 86, 68,
+ 156, 90, 68, 164, 94, 76, 164, 98, 84, 164, 102, 84, 164, 102, 84,
+ 164, 98, 76, 156, 94, 68, 164, 94, 76, 156, 94, 76, 164, 98, 84,
+ 164, 98, 76, 164, 98, 76, 156, 94, 76, 164, 98, 76, 164, 98, 76,
+ 164, 102, 84, 164, 102, 84, 172, 106, 84, 172, 106, 84, 164, 98, 76,
+ 164, 94, 68, 164, 94, 68, 164, 98, 76, 172, 106, 84, 164, 98, 76,
+ 164, 98, 76, 164, 94, 68, 164, 94, 76, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 164, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 172, 106, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 164, 94, 68, 164, 98, 76, 164, 98, 76, 164, 102, 76,
+ 164, 94, 76, 156, 94, 68, 172, 102, 84, 172, 106, 84, 172, 102, 84,
+ 164, 98, 76, 164, 102, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 172, 102, 84, 164, 102, 76, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 164, 98, 76, 172, 102, 76, 164, 98, 76,
+ 164, 94, 76, 156, 94, 68, 164, 98, 76, 164, 102, 76, 164, 98, 76,
+ 164, 98, 76, 164, 94, 76, 156, 94, 68, 164, 94, 76, 164, 102, 76,
+ 172, 106, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 102, 76, 172, 102, 84,
+ 172, 106, 84, 172, 110, 84, 180, 110, 92, 172, 110, 84, 172, 110, 84,
+ 180, 114, 92, 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92,
+ 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84, 180, 114, 92,
+ 188, 118, 100, 188, 118, 100, 180, 118, 100, 188, 122, 108, 188, 126, 108,
+ 188, 118, 100, 196, 130, 108, 204, 134, 116, 188, 126, 108, 196, 122, 108,
+ 180, 118, 100, 180, 110, 92, 180, 114, 100, 180, 118, 100, 188, 118, 100,
+ 188, 122, 108, 188, 118, 100, 188, 118, 100, 180, 118, 100, 188, 118, 100,
+ 180, 118, 100, 180, 118, 100, 180, 118, 100, 180, 114, 92, 180, 114, 92,
+ 172, 110, 92, 172, 106, 84, 180, 114, 92, 172, 106, 92, 172, 102, 84,
+ 172, 106, 84, 172, 110, 92, 180, 110, 84, 172, 110, 92, 172, 106, 84,
+ 172, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84,
+ 164, 102, 84, 164, 102, 76, 172, 106, 84, 172, 110, 92, 180, 110, 92,
+ 172, 110, 84, 172, 114, 92, 180, 114, 92, 180, 110, 92, 172, 110, 92,
+ 172, 106, 92, 172, 106, 84, 172, 106, 84, 164, 102, 84, 180, 114, 100,
+ 180, 114, 92, 180, 118, 100, 180, 118, 100, 180, 114, 92, 172, 110, 92,
+ 172, 106, 84, 172, 106, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92,
+ 172, 110, 92, 172, 110, 84, 172, 110, 92, 180, 114, 92, 180, 118, 100,
+ 196, 126, 100, 196, 122, 108, 196, 126, 108, 196, 130, 116, 196, 134, 116,
+ 204, 142, 124, 164, 106, 84, 100, 42, 20, 84, 26, 4, 132, 78, 68,
+ 188, 122, 108, 188, 122, 108, 188, 126, 116, 196, 134, 116, 188, 122, 108,
+ 188, 126, 108, 188, 126, 108, 188, 122, 108, 196, 126, 108, 196, 130, 108,
+ 188, 126, 108, 188, 122, 100, 196, 126, 108, 196, 126, 108, 188, 126, 108,
+ 196, 130, 108, 196, 130, 108, 196, 134, 116, 196, 130, 108, 196, 130, 108,
+ 188, 126, 108, 196, 126, 108, 188, 126, 108, 196, 130, 108, 188, 126, 108,
+ 188, 126, 108, 196, 126, 108, 188, 126, 108, 196, 130, 108, 196, 130, 108,
+ 196, 134, 116, 204, 142, 116, 204, 134, 116, 196, 130, 108, 196, 130, 108,
+ 188, 126, 108, 196, 126, 100, 196, 134, 108, 196, 130, 108, 188, 126, 100,
+ 188, 122, 100, 188, 126, 108, 196, 126, 100, 188, 126, 108, 196, 126, 100,
+ 188, 126, 100, 196, 130, 108, 204, 134, 108, 196, 134, 116, 196, 134, 108,
+ 196, 130, 108, 196, 126, 108, 196, 130, 108, 196, 130, 108, 196, 130, 108,
+ 188, 126, 108, 196, 126, 108, 196, 134, 108, 196, 130, 108, 196, 130, 108,
+ 188, 122, 100, 196, 130, 108, 196, 130, 108, 196, 134, 108, 196, 130, 108,
+ 188, 126, 100, 196, 130, 108, 196, 134, 108, 204, 134, 116, 204, 138, 116,
+ 204, 138, 116, 204, 134, 116, 196, 130, 108, 196, 130, 108, 196, 134, 108,
+ 204, 134, 116, 196, 134, 116, 196, 134, 108, 196, 130, 108, 196, 130, 108,
+ 204, 134, 116, 204, 138, 116, 204, 138, 116, 196, 130, 108, 196, 130, 108,
+ 188, 122, 100, 180, 118, 92, 188, 118, 100, 196, 130, 108, 196, 130, 108,
+ 188, 126, 100, 188, 122, 100, 188, 122, 100, 204, 134, 108, 196, 134, 116,
+ 204, 134, 116, 196, 134, 108, 196, 130, 108, 204, 134, 108, 204, 138, 116,
+ 204, 138, 116, 212, 142, 124, 204, 142, 116, 204, 134, 116, 204, 138, 116,
+ 204, 138, 116, 204, 138, 116, 204, 134, 108, 188, 126, 108, 196, 130, 108,
+ 196, 126, 100, 188, 122, 100, 196, 130, 108, 204, 138, 116, 212, 146, 124,
+ 204, 142, 116, 204, 138, 116, 212, 146, 124, 212, 142, 124, 204, 138, 124,
+ 204, 138, 124, 204, 138, 124, 204, 138, 116, 212, 142, 124, 204, 138, 124,
+ 196, 130, 116, 204, 134, 116, 204, 138, 116, 204, 138, 124, 204, 138, 116,
+ 204, 138, 124, 204, 134, 116, 204, 138, 124, 212, 142, 124, 204, 138, 116,
+ 196, 134, 116, 196, 130, 108, 196, 134, 116, 204, 138, 116, 204, 142, 124,
+ 212, 142, 124, 204, 138, 116, 204, 138, 116, 204, 138, 116, 204, 138, 116,
+ 204, 138, 124, 204, 142, 124, 204, 142, 116, 204, 138, 124, 196, 134, 108,
+ 196, 134, 116, 196, 134, 116, 196, 130, 116, 196, 130, 108, 188, 126, 108,
+ 196, 126, 108, 188, 130, 108, 188, 126, 108, 188, 122, 100, 180, 118, 100,
+ 188, 118, 100, 188, 126, 108, 196, 130, 108, 196, 126, 108, 188, 126, 108,
+ 188, 122, 100, 188, 122, 108, 188, 126, 108, 196, 126, 108, 196, 130, 108,
+ 188, 126, 108, 196, 126, 108, 188, 126, 108, 196, 134, 108, 196, 134, 116,
+ 196, 134, 108, 196, 130, 108, 196, 126, 108, 188, 122, 108, 188, 122, 100,
+ 188, 122, 100, 196, 130, 108, 196, 130, 100, 196, 130, 108, 196, 130, 100,
+ 188, 130, 108, 196, 130, 108, 196, 134, 108, 204, 138, 116, 204, 130, 108,
+ 204, 134, 116, 204, 134, 116, 204, 134, 116, 204, 138, 124, 204, 146, 124,
+ 156, 102, 84, 84, 26, 4, 84, 26, 4, 116, 58, 36, 164, 106, 92,
+ 164, 102, 84, 164, 106, 92, 172, 110, 92, 156, 98, 84, 172, 102, 84,
+ 172, 102, 84, 180, 110, 92, 180, 118, 100, 180, 118, 100, 180, 110, 92,
+ 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 106, 92,
+ 172, 106, 84, 172, 106, 84, 172, 106, 92, 172, 110, 92, 172, 110, 92,
+ 172, 106, 84, 172, 106, 84, 164, 102, 84, 164, 102, 84, 172, 102, 76,
+ 164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92, 172, 110, 84,
+ 180, 110, 92, 172, 110, 84, 180, 110, 92, 172, 110, 84, 172, 106, 84,
+ 172, 110, 84, 180, 110, 92, 172, 106, 84, 172, 102, 84, 164, 102, 84,
+ 172, 102, 76, 172, 102, 84, 172, 102, 84, 164, 102, 76, 164, 94, 76,
+ 172, 102, 84, 172, 110, 92, 172, 110, 84, 172, 102, 84, 164, 98, 76,
+ 172, 102, 76, 172, 106, 84, 172, 110, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 180, 114, 92, 180, 114, 92, 172, 110, 84, 172, 106, 84,
+ 172, 102, 76, 172, 110, 84, 172, 110, 84, 172, 102, 84, 172, 102, 84,
+ 172, 106, 84, 180, 110, 92, 172, 110, 84, 180, 118, 92, 180, 114, 92,
+ 180, 110, 92, 172, 110, 84, 180, 110, 92, 180, 114, 92, 180, 118, 92,
+ 188, 122, 100, 188, 118, 100, 180, 114, 92, 180, 118, 92, 180, 114, 92,
+ 180, 118, 92, 188, 118, 100, 180, 118, 92, 180, 114, 92, 180, 118, 92,
+ 180, 110, 84, 180, 110, 92, 180, 118, 92, 188, 122, 100, 188, 114, 100,
+ 180, 114, 92, 180, 114, 92, 196, 126, 108, 188, 126, 100, 188, 122, 100,
+ 188, 118, 100, 180, 118, 100, 180, 114, 92, 188, 118, 100, 188, 122, 100,
+ 180, 110, 92, 172, 110, 84, 180, 110, 92, 180, 114, 92, 188, 122, 100,
+ 188, 126, 100, 188, 118, 100, 180, 114, 92, 172, 110, 84, 172, 110, 92,
+ 180, 114, 92, 180, 114, 92, 180, 118, 92, 188, 118, 100, 188, 122, 100,
+ 188, 122, 100, 180, 106, 92, 172, 110, 92, 172, 102, 84, 172, 102, 84,
+ 164, 94, 76, 164, 94, 76, 164, 98, 76, 164, 102, 84, 172, 102, 84,
+ 172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 110, 92, 172, 106, 92,
+ 172, 106, 84, 172, 106, 92, 172, 110, 84, 164, 102, 84, 164, 98, 76,
+ 164, 94, 76, 164, 98, 76, 172, 110, 92, 180, 114, 92, 180, 118, 100,
+ 180, 118, 100, 188, 122, 100, 180, 122, 108, 188, 122, 100, 188, 122, 100,
+ 188, 122, 100, 188, 122, 100, 188, 126, 108, 188, 122, 100, 188, 126, 108,
+ 188, 122, 100, 188, 122, 100, 180, 118, 100, 180, 114, 92, 180, 114, 92,
+ 180, 118, 100, 180, 110, 92, 172, 110, 92, 172, 106, 84, 180, 110, 92,
+ 180, 118, 92, 180, 118, 100, 180, 114, 92, 180, 110, 92, 172, 110, 84,
+ 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 92, 180, 118, 92,
+ 180, 114, 92, 180, 118, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92,
+ 172, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 92, 172, 110, 84,
+ 180, 110, 92, 180, 114, 92, 180, 118, 92, 180, 118, 92, 180, 118, 92,
+ 180, 118, 92, 188, 118, 100, 188, 122, 100, 180, 114, 100, 180, 110, 92,
+ 188, 114, 100, 180, 110, 92, 172, 110, 92, 180, 126, 108, 148, 98, 76,
+ 84, 26, 4, 84, 26, 12, 108, 50, 36, 164, 102, 84, 164, 98, 84,
+ 156, 94, 76, 164, 98, 84, 148, 86, 68, 156, 90, 76, 156, 94, 84,
+ 164, 90, 76, 164, 98, 84, 172, 102, 84, 164, 94, 76, 156, 90, 68,
+ 164, 94, 76, 164, 98, 84, 164, 94, 76, 164, 98, 76, 164, 98, 84,
+ 164, 98, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 164, 102, 84, 164, 94, 68, 164, 94, 76, 156, 98, 76, 164, 98, 76,
+ 164, 98, 76, 164, 98, 84, 164, 102, 84, 172, 102, 84, 164, 98, 76,
+ 164, 98, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84, 180, 106, 84,
+ 172, 110, 84, 172, 106, 84, 164, 102, 76, 164, 98, 76, 164, 98, 76,
+ 164, 102, 76, 164, 102, 76, 164, 98, 76, 164, 98, 76, 172, 106, 84,
+ 180, 110, 84, 172, 106, 84, 164, 98, 76, 164, 98, 76, 172, 106, 84,
+ 180, 114, 92, 172, 106, 84, 164, 102, 76, 164, 98, 76, 172, 106, 84,
+ 180, 110, 92, 180, 114, 92, 180, 110, 92, 172, 106, 84, 172, 106, 84,
+ 180, 114, 92, 188, 118, 100, 180, 114, 92, 172, 110, 84, 180, 114, 92,
+ 180, 114, 92, 180, 114, 92, 172, 110, 92, 172, 106, 84, 164, 102, 76,
+ 172, 102, 76, 164, 102, 84, 180, 110, 84, 180, 118, 92, 188, 118, 100,
+ 188, 122, 100, 180, 118, 92, 180, 110, 92, 180, 110, 84, 172, 106, 92,
+ 180, 114, 84, 180, 114, 100, 188, 122, 100, 188, 122, 100, 180, 114, 92,
+ 172, 110, 92, 180, 114, 92, 188, 118, 92, 180, 114, 92, 180, 114, 92,
+ 180, 118, 92, 164, 102, 84, 172, 102, 84, 172, 106, 84, 172, 102, 76,
+ 164, 102, 76, 172, 102, 84, 172, 110, 84, 180, 114, 92, 172, 110, 84,
+ 172, 102, 84, 172, 106, 84, 180, 110, 84, 180, 118, 100, 188, 118, 92,
+ 180, 110, 92, 172, 106, 84, 172, 106, 84, 180, 110, 92, 188, 118, 92,
+ 180, 118, 100, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100,
+ 180, 114, 92, 188, 122, 100, 188, 126, 108, 188, 118, 100, 172, 110, 92,
+ 172, 102, 84, 172, 106, 84, 180, 106, 92, 164, 98, 76, 172, 102, 84,
+ 172, 106, 92, 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 84,
+ 172, 102, 84, 172, 106, 84, 164, 102, 84, 164, 98, 76, 164, 98, 76,
+ 172, 106, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100,
+ 188, 122, 100, 188, 122, 100, 188, 126, 108, 188, 122, 100, 188, 122, 100,
+ 188, 122, 108, 196, 126, 108, 180, 118, 92, 188, 118, 100, 180, 118, 100,
+ 180, 118, 100, 180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 118, 100,
+ 180, 110, 92, 172, 110, 84, 172, 106, 92, 172, 110, 92, 188, 118, 100,
+ 180, 118, 100, 180, 114, 92, 172, 106, 84, 180, 110, 92, 180, 114, 92,
+ 172, 110, 92, 180, 114, 92, 180, 114, 100, 180, 114, 92, 172, 110, 92,
+ 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 114, 100, 180, 110, 92,
+ 172, 110, 92, 172, 110, 92, 180, 114, 92, 180, 118, 92, 172, 106, 84,
+ 180, 110, 84, 180, 118, 92, 188, 122, 100, 180, 118, 100, 180, 118, 92,
+ 180, 118, 92, 180, 114, 92, 180, 110, 92, 180, 110, 92, 188, 118, 108,
+ 188, 118, 100, 188, 122, 100, 188, 130, 108, 156, 102, 84, 84, 26, 12,
+ 84, 30, 12, 108, 46, 28, 140, 82, 68, 156, 90, 76, 156, 94, 84,
+ 156, 94, 84, 156, 94, 76, 164, 94, 76, 156, 90, 76, 164, 94, 76,
+ 156, 94, 76, 156, 90, 68, 156, 90, 68, 164, 90, 76, 156, 90, 68,
+ 148, 82, 60, 148, 78, 60, 164, 98, 76, 164, 94, 76, 156, 90, 68,
+ 156, 90, 68, 156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+ 156, 90, 68, 148, 86, 68, 156, 90, 68, 156, 90, 68, 156, 90, 76,
+ 164, 94, 68, 156, 94, 76, 156, 94, 68, 156, 90, 68, 156, 90, 68,
+ 172, 102, 76, 180, 114, 92, 188, 118, 92, 172, 106, 84, 180, 106, 84,
+ 172, 106, 84, 164, 98, 76, 164, 94, 68, 164, 98, 76, 172, 102, 84,
+ 172, 106, 84, 172, 102, 76, 164, 98, 76, 172, 106, 84, 180, 110, 92,
+ 172, 110, 84, 172, 98, 76, 164, 98, 76, 172, 106, 84, 180, 118, 92,
+ 180, 106, 84, 180, 106, 84, 172, 106, 84, 172, 110, 84, 180, 110, 92,
+ 180, 110, 84, 172, 102, 76, 164, 98, 76, 164, 94, 68, 172, 106, 84,
+ 180, 114, 92, 172, 106, 84, 164, 98, 76, 172, 98, 76, 172, 106, 84,
+ 172, 106, 84, 180, 106, 84, 180, 110, 84, 172, 110, 84, 180, 110, 92,
+ 180, 110, 84, 180, 110, 92, 180, 110, 84, 172, 106, 84, 188, 118, 92,
+ 188, 114, 92, 172, 106, 84, 172, 102, 76, 172, 106, 84, 188, 118, 92,
+ 188, 122, 100, 188, 118, 100, 188, 118, 92, 180, 110, 92, 180, 114, 84,
+ 180, 114, 92, 180, 110, 92, 172, 106, 84, 164, 98, 76, 172, 102, 76,
+ 180, 106, 84, 180, 114, 84, 172, 102, 76, 164, 94, 76, 172, 106, 84,
+ 180, 110, 84, 172, 106, 84, 172, 106, 84, 188, 122, 100, 188, 118, 92,
+ 180, 118, 92, 188, 118, 100, 196, 122, 100, 188, 122, 100, 180, 118, 92,
+ 180, 110, 84, 188, 114, 92, 172, 110, 84, 172, 106, 84, 180, 114, 92,
+ 188, 114, 92, 180, 114, 92, 180, 114, 84, 180, 114, 92, 180, 110, 92,
+ 180, 110, 92, 180, 110, 92, 172, 106, 84, 164, 98, 76, 172, 110, 92,
+ 188, 118, 100, 180, 118, 92, 180, 110, 92, 180, 114, 100, 180, 118, 100,
+ 172, 106, 84, 164, 94, 76, 164, 98, 76, 172, 102, 76, 164, 102, 84,
+ 164, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 172, 106, 84, 172, 106, 92, 180, 118, 92, 180, 118, 100,
+ 180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 114, 100, 180, 118, 92,
+ 180, 118, 100, 188, 122, 108, 188, 122, 100, 188, 118, 100, 180, 114, 92,
+ 180, 114, 92, 172, 110, 92, 172, 110, 92, 172, 106, 84, 188, 122, 100,
+ 180, 114, 100, 172, 106, 84, 172, 110, 84, 180, 114, 92, 180, 114, 92,
+ 180, 110, 92, 172, 110, 92, 172, 106, 84, 172, 110, 92, 180, 114, 92,
+ 180, 118, 100, 180, 114, 92, 172, 110, 92, 172, 110, 92, 180, 110, 92,
+ 164, 106, 84, 172, 106, 84, 172, 110, 84, 172, 110, 92, 172, 110, 92,
+ 180, 110, 84, 172, 110, 92, 172, 110, 84, 180, 110, 92, 180, 110, 92,
+ 180, 114, 92, 180, 118, 92, 180, 118, 92, 180, 118, 100, 188, 118, 92,
+ 188, 118, 100, 180, 110, 92, 180, 110, 92, 188, 118, 100, 188, 118, 100,
+ 180, 118, 100, 180, 122, 108, 148, 90, 68, 84, 30, 12, 92, 34, 12,
+ 116, 58, 44, 156, 90, 76, 156, 94, 76, 156, 94, 76, 156, 90, 76,
+ 148, 86, 68, 156, 90, 76, 148, 86, 68, 156, 86, 68, 156, 86, 68,
+ 156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 86, 68, 148, 78, 60,
+ 140, 74, 52, 148, 82, 68, 148, 82, 60, 148, 86, 68, 156, 90, 68,
+ 156, 94, 76, 164, 98, 76, 164, 98, 84, 164, 98, 76, 148, 86, 68,
+ 156, 86, 68, 156, 90, 68, 156, 90, 76, 156, 94, 68, 156, 94, 76,
+ 164, 94, 76, 164, 98, 76, 172, 102, 76, 164, 98, 76, 172, 102, 76,
+ 172, 106, 84, 180, 110, 92, 172, 106, 84, 164, 98, 76, 172, 102, 76,
+ 172, 102, 84, 164, 94, 68, 164, 94, 76, 172, 102, 76, 180, 110, 84,
+ 180, 110, 92, 164, 98, 76, 172, 102, 76, 172, 106, 84, 172, 102, 76,
+ 164, 98, 76, 164, 98, 76, 172, 102, 76, 180, 110, 92, 180, 110, 92,
+ 172, 110, 84, 172, 106, 84, 180, 106, 84, 180, 114, 84, 180, 110, 92,
+ 172, 102, 84, 164, 98, 76, 156, 94, 68, 172, 106, 84, 188, 114, 92,
+ 180, 110, 84, 172, 106, 84, 172, 102, 76, 172, 106, 84, 180, 110, 84,
+ 172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 110, 92, 180, 114, 84,
+ 172, 110, 84, 172, 106, 84, 172, 106, 84, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 164, 90, 68, 164, 98, 76, 172, 102, 84, 172, 106, 76,
+ 172, 102, 76, 172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 114, 92,
+ 188, 114, 92, 180, 110, 84, 180, 110, 92, 180, 114, 92, 172, 106, 84,
+ 180, 114, 92, 172, 106, 84, 164, 94, 68, 172, 106, 84, 180, 114, 92,
+ 188, 118, 92, 196, 126, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92,
+ 180, 118, 92, 188, 118, 100, 188, 118, 92, 180, 114, 92, 172, 106, 84,
+ 180, 114, 92, 180, 106, 84, 172, 102, 76, 172, 102, 76, 172, 106, 84,
+ 172, 102, 84, 172, 106, 84, 180, 110, 84, 172, 102, 84, 164, 102, 84,
+ 172, 102, 84, 164, 94, 76, 156, 90, 68, 164, 94, 76, 180, 106, 92,
+ 172, 102, 84, 164, 98, 84, 180, 110, 84, 180, 110, 92, 164, 98, 84,
+ 164, 94, 76, 164, 98, 76, 164, 98, 84, 172, 98, 76, 164, 102, 84,
+ 164, 102, 84, 172, 102, 84, 164, 106, 84, 172, 106, 92, 172, 106, 92,
+ 172, 110, 92, 180, 110, 84, 180, 118, 100, 188, 118, 100, 180, 118, 100,
+ 180, 114, 92, 172, 114, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92,
+ 180, 118, 100, 180, 118, 92, 180, 114, 100, 180, 114, 92, 180, 110, 92,
+ 172, 110, 92, 180, 110, 92, 172, 114, 92, 188, 118, 100, 180, 114, 92,
+ 172, 110, 92, 172, 106, 84, 172, 110, 92, 172, 110, 92, 172, 110, 84,
+ 164, 102, 84, 172, 102, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92,
+ 180, 114, 92, 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 110, 92,
+ 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100, 180, 114, 92,
+ 180, 114, 100, 180, 114, 92, 180, 114, 92, 180, 118, 92, 188, 118, 92,
+ 188, 122, 92, 180, 122, 100, 188, 122, 100, 180, 122, 100, 188, 118, 100,
+ 196, 122, 100, 188, 118, 100, 196, 122, 108, 180, 114, 100, 180, 114, 100,
+ 180, 126, 108, 148, 98, 76, 92, 34, 12, 84, 26, 12, 116, 58, 36,
+ 148, 90, 76, 148, 90, 76, 140, 82, 68, 148, 82, 68, 140, 78, 60,
+ 156, 86, 68, 148, 86, 68, 156, 90, 68, 156, 90, 76, 164, 94, 76,
+ 156, 90, 76, 156, 90, 68, 148, 82, 68, 148, 78, 60, 140, 78, 60,
+ 156, 86, 68, 148, 86, 68, 156, 86, 68, 156, 90, 68, 156, 94, 76,
+ 164, 94, 76, 156, 94, 76, 148, 86, 68, 148, 82, 60, 148, 86, 68,
+ 156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 68, 156, 94, 76,
+ 164, 102, 76, 172, 102, 84, 172, 102, 76, 172, 106, 84, 180, 110, 84,
+ 180, 114, 84, 180, 110, 84, 172, 102, 76, 180, 106, 84, 172, 106, 76,
+ 172, 98, 76, 164, 98, 68, 172, 106, 76, 172, 106, 84, 180, 110, 84,
+ 172, 98, 76, 180, 106, 84, 180, 110, 84, 180, 110, 84, 172, 98, 76,
+ 172, 98, 76, 180, 106, 84, 180, 114, 84, 188, 114, 92, 180, 110, 84,
+ 180, 110, 84, 180, 110, 84, 180, 114, 92, 180, 110, 84, 172, 106, 84,
+ 164, 98, 68, 164, 94, 68, 180, 106, 84, 188, 118, 92, 180, 114, 92,
+ 180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 110, 84, 172, 106, 76,
+ 180, 106, 84, 180, 110, 84, 180, 114, 92, 188, 114, 92, 180, 110, 84,
+ 180, 106, 84, 172, 106, 76, 180, 106, 84, 188, 114, 92, 180, 114, 84,
+ 180, 110, 84, 180, 114, 92, 188, 118, 92, 188, 118, 92, 180, 110, 84,
+ 180, 106, 84, 172, 106, 76, 180, 106, 84, 188, 114, 92, 188, 118, 92,
+ 180, 118, 92, 188, 118, 92, 196, 122, 100, 172, 106, 84, 188, 114, 84,
+ 172, 106, 84, 164, 98, 68, 172, 102, 76, 180, 106, 84, 180, 110, 84,
+ 188, 118, 92, 188, 122, 92, 188, 114, 92, 180, 110, 92, 180, 114, 84,
+ 188, 118, 92, 188, 118, 92, 180, 110, 84, 172, 102, 84, 188, 122, 92,
+ 180, 110, 84, 164, 102, 76, 172, 102, 76, 172, 98, 76, 172, 102, 76,
+ 172, 102, 76, 180, 106, 84, 180, 110, 92, 180, 106, 84, 180, 106, 84,
+ 172, 102, 76, 164, 90, 76, 172, 98, 76, 180, 110, 92, 172, 102, 76,
+ 172, 102, 84, 180, 106, 84, 180, 110, 84, 172, 102, 84, 172, 98, 76,
+ 164, 94, 76, 164, 98, 76, 164, 98, 76, 172, 98, 84, 164, 98, 76,
+ 164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92, 180, 114, 92,
+ 180, 114, 92, 188, 122, 100, 188, 122, 100, 188, 122, 100, 180, 118, 100,
+ 172, 106, 92, 172, 106, 84, 164, 106, 84, 172, 106, 84, 180, 114, 92,
+ 180, 110, 92, 172, 110, 84, 172, 110, 92, 180, 110, 92, 172, 110, 92,
+ 180, 114, 92, 180, 114, 92, 180, 118, 92, 172, 110, 92, 172, 106, 84,
+ 172, 106, 84, 172, 110, 92, 172, 106, 84, 164, 102, 84, 164, 94, 76,
+ 164, 98, 76, 172, 110, 92, 180, 114, 92, 172, 106, 92, 172, 106, 92,
+ 172, 110, 84, 172, 106, 92, 164, 102, 84, 172, 110, 92, 180, 110, 92,
+ 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100, 180, 114, 92,
+ 180, 118, 92, 180, 114, 92, 188, 114, 92, 180, 118, 92, 180, 118, 100,
+ 180, 118, 92, 180, 118, 100, 188, 118, 92, 180, 118, 92, 180, 110, 92,
+ 180, 106, 92, 180, 110, 92, 172, 106, 92, 172, 106, 84, 172, 114, 92,
+ 140, 90, 68, 84, 26, 12, 84, 30, 12, 116, 58, 44, 156, 90, 76,
+ 156, 90, 76, 148, 86, 68, 148, 86, 76, 148, 86, 68, 156, 90, 76,
+ 156, 90, 76, 164, 94, 84, 164, 98, 76, 164, 94, 76, 156, 90, 68,
+ 156, 86, 68, 156, 86, 60, 156, 90, 68, 156, 90, 76, 164, 94, 76,
+ 156, 94, 68, 156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+ 156, 94, 76, 156, 94, 68, 148, 78, 60, 148, 86, 68, 156, 90, 68,
+ 156, 90, 68, 148, 86, 68, 156, 86, 68, 156, 90, 68, 164, 98, 76,
+ 164, 94, 68, 172, 98, 76, 180, 106, 84, 188, 118, 92, 188, 118, 92,
+ 188, 118, 100, 180, 114, 92, 180, 114, 84, 180, 106, 84, 172, 102, 76,
+ 172, 98, 76, 172, 106, 84, 180, 106, 84, 164, 98, 68, 172, 102, 76,
+ 180, 114, 84, 196, 122, 100, 188, 118, 92, 172, 106, 76, 172, 102, 76,
+ 180, 110, 84, 188, 122, 92, 188, 118, 92, 188, 114, 92, 180, 110, 84,
+ 188, 114, 84, 188, 114, 92, 180, 114, 84, 180, 106, 84, 172, 102, 76,
+ 164, 94, 68, 180, 110, 84, 188, 118, 92, 188, 118, 92, 188, 114, 92,
+ 180, 114, 92, 188, 114, 84, 180, 114, 92, 180, 106, 84, 180, 110, 84,
+ 180, 114, 84, 188, 114, 92, 180, 114, 84, 180, 110, 92, 180, 110, 84,
+ 180, 106, 84, 180, 114, 84, 188, 114, 92, 188, 114, 92, 180, 114, 92,
+ 188, 118, 92, 196, 122, 100, 188, 122, 92, 180, 114, 92, 188, 114, 92,
+ 180, 110, 84, 180, 114, 84, 188, 118, 92, 188, 122, 92, 188, 118, 92,
+ 188, 118, 92, 188, 122, 92, 188, 118, 92, 196, 122, 100, 188, 118, 92,
+ 188, 114, 92, 188, 122, 100, 196, 126, 100, 188, 118, 92, 188, 114, 92,
+ 188, 114, 92, 180, 114, 84, 180, 110, 84, 180, 110, 84, 188, 118, 92,
+ 188, 118, 92, 188, 118, 92, 180, 114, 84, 196, 126, 100, 188, 114, 92,
+ 180, 106, 84, 172, 106, 76, 172, 102, 76, 172, 102, 76, 172, 106, 76,
+ 180, 110, 84, 188, 118, 92, 180, 110, 92, 180, 114, 92, 180, 106, 92,
+ 164, 98, 76, 180, 106, 84, 188, 114, 100, 180, 106, 84, 180, 110, 92,
+ 180, 110, 92, 188, 114, 92, 180, 110, 92, 172, 106, 84, 172, 98, 76,
+ 172, 98, 76, 164, 98, 76, 164, 102, 76, 164, 102, 84, 172, 102, 84,
+ 172, 106, 84, 172, 110, 92, 180, 118, 92, 180, 114, 100, 180, 118, 100,
+ 188, 122, 108, 188, 126, 100, 188, 118, 100, 180, 114, 92, 172, 106, 84,
+ 164, 102, 84, 172, 102, 84, 172, 110, 92, 172, 110, 92, 172, 110, 84,
+ 172, 106, 92, 172, 106, 84, 172, 110, 84, 172, 110, 92, 180, 110, 92,
+ 180, 114, 92, 180, 110, 92, 172, 110, 92, 172, 110, 92, 180, 110, 92,
+ 172, 110, 92, 180, 110, 84, 164, 102, 84, 164, 98, 76, 156, 94, 76,
+ 172, 106, 84, 180, 114, 92, 172, 106, 84, 164, 102, 84, 172, 110, 84,
+ 172, 106, 84, 164, 98, 76, 172, 102, 84, 164, 106, 84, 172, 106, 84,
+ 172, 106, 92, 172, 110, 92, 180, 110, 92, 180, 110, 92, 172, 110, 92,
+ 180, 106, 84, 172, 110, 84, 172, 110, 84, 180, 110, 84, 172, 110, 84,
+ 172, 110, 84, 172, 106, 84, 172, 106, 84, 180, 106, 92, 180, 106, 84,
+ 188, 114, 100, 188, 118, 100, 180, 114, 100, 180, 126, 108, 148, 90, 68,
+ 84, 30, 12, 92, 34, 12, 124, 66, 44, 156, 98, 84, 164, 102, 84,
+ 164, 98, 84, 164, 98, 84, 156, 94, 76, 164, 98, 84, 164, 98, 76,
+ 156, 90, 76, 156, 94, 76, 164, 94, 76, 156, 90, 76, 156, 90, 68,
+ 156, 86, 68, 156, 86, 68, 164, 94, 68, 156, 90, 76, 156, 94, 68,
+ 156, 90, 76, 164, 98, 76, 164, 102, 84, 172, 106, 84, 172, 106, 84,
+ 172, 102, 84, 148, 82, 60, 148, 86, 68, 156, 90, 68, 156, 90, 68,
+ 148, 86, 68, 148, 82, 60, 156, 86, 68, 156, 94, 68, 156, 86, 68,
+ 164, 98, 68, 180, 110, 84, 188, 118, 92, 196, 122, 92, 196, 122, 100,
+ 188, 118, 92, 188, 118, 92, 180, 110, 92, 172, 106, 76, 172, 106, 76,
+ 180, 106, 84, 180, 106, 84, 172, 102, 76, 180, 110, 84, 188, 118, 92,
+ 196, 126, 100, 188, 118, 100, 180, 110, 84, 172, 106, 84, 188, 114, 84,
+ 188, 122, 100, 196, 122, 100, 188, 118, 92, 180, 114, 84, 180, 114, 92,
+ 188, 118, 92, 188, 118, 92, 180, 110, 84, 180, 106, 84, 172, 102, 76,
+ 180, 110, 84, 196, 122, 100, 188, 122, 92, 188, 118, 92, 188, 118, 92,
+ 188, 122, 92, 188, 114, 92, 188, 114, 84, 180, 114, 92, 188, 114, 84,
+ 180, 110, 92, 180, 114, 84, 188, 114, 92, 180, 114, 84, 188, 114, 92,
+ 180, 114, 92, 188, 114, 92, 180, 114, 84, 180, 110, 84, 180, 110, 84,
+ 188, 118, 92, 188, 114, 92, 180, 114, 84, 188, 118, 92, 180, 114, 92,
+ 188, 114, 92, 188, 122, 92, 188, 118, 100, 188, 118, 92, 188, 118, 92,
+ 196, 122, 100, 180, 114, 92, 188, 118, 92, 180, 110, 84, 180, 110, 84,
+ 196, 130, 100, 204, 134, 108, 196, 126, 100, 188, 118, 100, 188, 122, 92,
+ 188, 114, 92, 188, 114, 92, 188, 114, 92, 188, 122, 100, 196, 122, 100,
+ 196, 122, 100, 188, 118, 92, 188, 118, 100, 188, 118, 92, 180, 110, 84,
+ 180, 110, 84, 180, 110, 84, 172, 102, 76, 172, 102, 76, 180, 110, 84,
+ 180, 110, 92, 172, 106, 84, 180, 106, 84, 172, 98, 76, 164, 94, 68,
+ 172, 106, 84, 180, 110, 92, 172, 106, 84, 180, 110, 84, 180, 110, 84,
+ 180, 114, 92, 180, 110, 92, 180, 110, 92, 172, 106, 84, 180, 106, 84,
+ 172, 106, 84, 172, 102, 84, 172, 102, 76, 164, 102, 84, 172, 110, 92,
+ 180, 114, 92, 188, 118, 100, 188, 122, 100, 188, 118, 92, 188, 126, 108,
+ 188, 122, 100, 180, 118, 100, 172, 110, 92, 164, 106, 84, 172, 102, 84,
+ 172, 106, 84, 180, 114, 92, 180, 110, 92, 172, 110, 92, 172, 106, 84,
+ 172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92,
+ 172, 110, 92, 172, 110, 92, 172, 110, 84, 180, 110, 92, 172, 114, 92,
+ 180, 110, 92, 172, 106, 92, 172, 106, 84, 156, 94, 68, 172, 106, 92,
+ 180, 114, 92, 172, 102, 84, 164, 102, 84, 180, 110, 92, 172, 106, 92,
+ 164, 98, 76, 164, 102, 84, 172, 102, 84, 164, 102, 84, 172, 106, 84,
+ 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 110, 84, 172, 102, 84,
+ 172, 106, 84, 172, 106, 84, 172, 110, 84, 172, 106, 84, 164, 106, 84,
+ 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84, 180, 114, 100,
+ 188, 118, 100, 180, 118, 100, 188, 126, 100, 148, 94, 76, 92, 34, 12,
+ 92, 34, 12, 116, 62, 44, 156, 94, 76, 164, 94, 84, 156, 94, 76,
+ 156, 94, 76, 148, 86, 68, 148, 86, 76, 148, 82, 68, 148, 78, 60,
+ 148, 82, 68, 156, 90, 68, 156, 94, 76, 164, 90, 76, 156, 90, 68,
+ 148, 82, 68, 148, 82, 60, 164, 94, 76, 156, 94, 76, 156, 94, 68,
+ 164, 94, 76, 164, 102, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84,
+ 156, 90, 68, 156, 90, 68, 156, 94, 76, 156, 90, 68, 148, 86, 68,
+ 148, 86, 68, 156, 90, 68, 156, 90, 68, 164, 98, 76, 172, 106, 84,
+ 180, 110, 84, 180, 110, 84, 180, 114, 92, 188, 118, 92, 180, 110, 84,
+ 188, 118, 92, 188, 118, 92, 180, 110, 84, 180, 106, 84, 180, 114, 84,
+ 180, 114, 84, 180, 114, 92, 188, 114, 84, 180, 114, 92, 188, 114, 84,
+ 188, 118, 92, 188, 114, 92, 180, 114, 92, 188, 114, 84, 180, 110, 84,
+ 196, 122, 100, 188, 118, 92, 188, 114, 92, 188, 114, 92, 188, 118, 92,
+ 188, 118, 92, 188, 118, 92, 180, 110, 84, 172, 106, 84, 188, 114, 92,
+ 196, 122, 100, 188, 122, 100, 196, 122, 92, 196, 122, 100, 188, 122, 100,
+ 188, 118, 92, 188, 122, 100, 188, 118, 92, 188, 118, 92, 188, 114, 92,
+ 188, 118, 92, 188, 114, 92, 188, 118, 92, 188, 122, 92, 196, 122, 100,
+ 188, 126, 100, 188, 118, 92, 180, 110, 84, 188, 114, 92, 188, 122, 100,
+ 196, 126, 100, 188, 118, 100, 196, 122, 92, 188, 114, 92, 180, 114, 92,
+ 196, 122, 92, 188, 122, 100, 188, 118, 92, 196, 122, 100, 196, 126, 100,
+ 188, 118, 92, 188, 118, 92, 172, 98, 76, 164, 94, 68, 180, 110, 92,
+ 188, 122, 92, 188, 114, 92, 180, 114, 84, 204, 130, 108, 196, 126, 100,
+ 188, 118, 92, 188, 122, 92, 196, 122, 100, 188, 122, 92, 188, 122, 92,
+ 188, 114, 92, 180, 114, 84, 180, 110, 84, 180, 110, 84, 180, 114, 92,
+ 180, 110, 84, 172, 102, 76, 172, 102, 76, 180, 106, 84, 180, 110, 92,
+ 180, 106, 84, 172, 102, 76, 172, 98, 76, 164, 94, 76, 180, 106, 84,
+ 180, 110, 92, 180, 106, 84, 172, 102, 76, 172, 98, 84, 172, 102, 76,
+ 180, 110, 84, 180, 110, 84, 180, 106, 84, 180, 110, 92, 180, 114, 92,
+ 172, 110, 92, 172, 106, 92, 172, 106, 84, 180, 110, 92, 180, 118, 100,
+ 188, 122, 100, 180, 122, 100, 188, 118, 100, 188, 126, 108, 188, 118, 100,
+ 180, 114, 92, 172, 106, 84, 172, 106, 84, 172, 110, 92, 180, 114, 92,
+ 180, 114, 92, 172, 114, 92, 180, 110, 92, 172, 106, 84, 164, 102, 84,
+ 164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 92, 180, 110, 84,
+ 172, 110, 92, 180, 110, 92, 172, 110, 92, 180, 110, 92, 180, 114, 92,
+ 172, 114, 92, 180, 110, 92, 164, 98, 76, 172, 110, 92, 180, 114, 92,
+ 172, 106, 84, 172, 106, 84, 172, 110, 92, 172, 106, 84, 164, 102, 84,
+ 172, 106, 84, 172, 110, 84, 172, 106, 92, 172, 106, 84, 172, 106, 84,
+ 172, 110, 92, 172, 110, 92, 180, 110, 84, 172, 106, 84, 172, 106, 84,
+ 180, 110, 84, 172, 110, 84, 172, 114, 92, 172, 110, 92, 172, 110, 84,
+ 172, 110, 84, 180, 106, 92, 172, 102, 84, 180, 106, 92, 172, 106, 92,
+ 172, 106, 92, 180, 122, 100, 148, 98, 76, 92, 34, 12, 100, 42, 28,
+ 116, 54, 36, 148, 86, 68, 148, 90, 76, 148, 86, 76, 148, 86, 76,
+ 140, 78, 60, 148, 78, 60, 140, 78, 60, 148, 78, 60, 148, 78, 60,
+ 148, 82, 60, 156, 86, 68, 156, 90, 68, 156, 90, 68, 156, 90, 68,
+ 148, 86, 68, 172, 102, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84,
+ 172, 106, 84, 172, 106, 84, 164, 102, 84, 164, 98, 76, 156, 94, 76,
+ 164, 98, 76, 156, 94, 76, 164, 98, 76, 164, 94, 76, 164, 94, 76,
+ 156, 94, 76, 164, 98, 76, 180, 110, 84, 188, 114, 84, 188, 114, 92,
+ 180, 106, 84, 188, 114, 84, 188, 118, 92, 188, 114, 92, 188, 118, 92,
+ 188, 118, 92, 188, 114, 92, 180, 110, 84, 188, 114, 92, 188, 118, 92,
+ 188, 114, 92, 188, 118, 92, 188, 118, 92, 188, 114, 92, 188, 118, 92,
+ 188, 118, 92, 188, 118, 92, 188, 114, 92, 180, 110, 84, 196, 122, 100,
+ 188, 118, 92, 180, 114, 84, 188, 114, 92, 188, 122, 92, 196, 122, 100,
+ 188, 118, 92, 188, 114, 92, 180, 110, 84, 188, 118, 92, 196, 122, 100,
+ 196, 122, 92, 188, 118, 92, 188, 118, 100, 196, 122, 92, 188, 118, 92,
+ 196, 122, 100, 196, 122, 92, 196, 122, 100, 188, 122, 92, 196, 122, 100,
+ 188, 122, 92, 196, 122, 100, 196, 122, 100, 196, 122, 100, 196, 122, 92,
+ 188, 114, 92, 180, 110, 84, 188, 114, 84, 188, 118, 92, 196, 122, 92,
+ 188, 118, 92, 188, 122, 92, 188, 118, 92, 188, 114, 92, 188, 118, 92,
+ 196, 122, 92, 188, 118, 92, 188, 118, 92, 196, 126, 100, 204, 130, 108,
+ 204, 134, 108, 188, 122, 92, 180, 106, 84, 188, 114, 92, 188, 118, 92,
+ 188, 118, 92, 196, 122, 100, 204, 134, 108, 196, 130, 100, 196, 122, 100,
+ 188, 122, 92, 196, 122, 100, 196, 122, 100, 188, 118, 92, 188, 114, 92,
+ 188, 114, 84, 180, 110, 84, 180, 110, 84, 188, 114, 92, 180, 110, 84,
+ 180, 106, 84, 180, 106, 84, 188, 114, 92, 188, 118, 92, 188, 114, 92,
+ 180, 110, 92, 180, 106, 84, 172, 102, 84, 180, 110, 84, 188, 118, 92,
+ 180, 106, 84, 180, 106, 84, 172, 106, 84, 180, 106, 84, 180, 106, 92,
+ 188, 114, 92, 180, 110, 92, 180, 110, 84, 188, 114, 92, 188, 114, 100,
+ 180, 114, 92, 172, 110, 92, 180, 114, 92, 188, 122, 100, 188, 122, 108,
+ 188, 122, 100, 180, 118, 100, 188, 122, 100, 180, 118, 100, 180, 114, 92,
+ 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 110, 92,
+ 180, 110, 92, 172, 110, 84, 172, 106, 84, 164, 102, 84, 172, 102, 84,
+ 164, 106, 84, 172, 106, 84, 180, 110, 92, 172, 114, 92, 180, 110, 92,
+ 172, 110, 92, 180, 110, 92, 172, 110, 84, 172, 110, 92, 172, 110, 84,
+ 180, 110, 92, 164, 102, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92,
+ 180, 110, 92, 172, 110, 84, 172, 110, 92, 172, 106, 84, 180, 114, 92,
+ 180, 110, 92, 180, 110, 92, 172, 110, 92, 172, 110, 92, 172, 110, 84,
+ 172, 110, 92, 180, 110, 92, 172, 110, 92, 180, 110, 84, 180, 114, 92,
+ 180, 114, 92, 180, 114, 92, 180, 118, 92, 180, 114, 92, 180, 114, 92,
+ 188, 118, 100, 188, 114, 92, 196, 122, 108, 188, 118, 100, 180, 118, 100,
+ 188, 130, 108, 156, 106, 84, 100, 42, 28, 84, 30, 12, 116, 54, 36,
+ 156, 90, 76, 156, 90, 76, 156, 90, 68, 156, 94, 76, 148, 86, 68,
+ 164, 94, 84, 156, 94, 76, 156, 90, 76, 148, 86, 68, 148, 78, 60,
+ 148, 78, 60, 148, 86, 68, 164, 94, 76, 164, 94, 76, 172, 98, 84,
+ 164, 98, 76, 164, 102, 76, 172, 106, 84, 180, 110, 92, 180, 118, 100,
+ 180, 118, 100, 180, 110, 92, 172, 110, 92, 164, 98, 76, 164, 94, 76,
+ 164, 98, 76, 164, 98, 84, 164, 102, 76, 164, 102, 84, 172, 102, 84,
+ 164, 102, 76, 188, 118, 92, 188, 122, 100, 196, 122, 100, 188, 114, 92,
+ 180, 114, 92, 188, 114, 92, 196, 122, 100, 196, 122, 100, 188, 118, 92,
+ 188, 114, 92, 188, 118, 92, 188, 118, 92, 188, 118, 92, 180, 110, 84,
+ 196, 122, 100, 196, 122, 100, 188, 122, 92, 196, 122, 100, 196, 126, 100,
+ 196, 122, 100, 188, 118, 92, 188, 118, 92, 196, 122, 100, 188, 118, 92,
+ 188, 114, 92, 188, 118, 92, 196, 122, 100, 196, 126, 100, 196, 122, 100,
+ 188, 118, 92, 188, 114, 84, 188, 122, 92, 196, 122, 100, 188, 122, 92,
+ 188, 118, 92, 196, 122, 100, 196, 122, 92, 188, 118, 92, 196, 122, 100,
+ 196, 126, 100, 196, 122, 100, 196, 126, 100, 196, 126, 100, 196, 126, 100,
+ 196, 122, 100, 196, 126, 100, 196, 122, 100, 196, 126, 100, 196, 122, 100,
+ 188, 118, 92, 188, 118, 100, 196, 126, 100, 196, 126, 100, 196, 122, 100,
+ 196, 126, 100, 196, 122, 100, 188, 118, 92, 188, 122, 100, 196, 122, 92,
+ 188, 114, 92, 188, 114, 92, 188, 122, 92, 188, 114, 92, 204, 130, 108,
+ 196, 126, 100, 188, 118, 92, 188, 118, 92, 188, 118, 92, 196, 122, 100,
+ 196, 126, 100, 204, 130, 108, 196, 126, 100, 196, 122, 100, 188, 118, 92,
+ 196, 122, 100, 196, 126, 100, 196, 122, 100, 188, 118, 92, 188, 114, 92,
+ 188, 114, 92, 188, 118, 92, 188, 118, 92, 188, 118, 92, 180, 114, 84,
+ 188, 114, 92, 196, 126, 100, 196, 122, 100, 188, 114, 92, 180, 110, 84,
+ 180, 106, 84, 172, 98, 76, 180, 110, 92, 188, 114, 92, 172, 102, 84,
+ 196, 126, 100, 188, 114, 92, 188, 114, 92, 188, 114, 92, 188, 114, 92,
+ 180, 110, 84, 188, 114, 92, 188, 114, 92, 188, 122, 100, 180, 118, 100,
+ 180, 114, 92, 180, 118, 100, 188, 122, 100, 188, 126, 108, 188, 122, 100,
+ 180, 118, 100, 188, 122, 100, 180, 118, 100, 180, 110, 92, 180, 114, 100,
+ 180, 118, 100, 188, 118, 100, 172, 114, 92, 172, 106, 84, 172, 110, 92,
+ 172, 106, 92, 172, 102, 84, 164, 102, 84, 172, 102, 76, 172, 106, 84,
+ 172, 106, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92, 172, 110, 92,
+ 172, 110, 84, 172, 106, 84, 172, 106, 84, 172, 106, 92, 172, 110, 84,
+ 172, 106, 84, 180, 110, 92, 180, 114, 92, 180, 118, 100, 180, 118, 100,
+ 180, 110, 92, 172, 110, 92, 180, 110, 92, 180, 114, 92, 172, 114, 92,
+ 172, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 92, 172, 110, 84,
+ 172, 106, 84, 180, 110, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92,
+ 180, 118, 92, 180, 118, 92, 180, 114, 92, 180, 118, 92, 188, 114, 100,
+ 180, 110, 92, 188, 122, 108, 188, 122, 100, 180, 118, 108, 188, 126, 108,
+ 148, 90, 76, 84, 30, 12, 92, 38, 28, 140, 78, 60, 156, 90, 68,
+ 156, 90, 76, 156, 90, 68, 156, 94, 76, 164, 98, 76, 156, 94, 76,
+ 164, 94, 76, 156, 94, 68, 156, 94, 76, 156, 90, 68, 156, 86, 68,
+ 148, 86, 68, 156, 86, 68, 156, 94, 76, 164, 102, 76, 180, 110, 92,
+ 172, 102, 84, 172, 98, 84, 172, 106, 84, 180, 114, 92, 188, 122, 100,
+ 188, 114, 92, 172, 110, 92, 172, 102, 84, 164, 98, 76, 156, 90, 68,
+ 156, 86, 68, 164, 94, 76, 172, 102, 84, 172, 106, 84, 180, 110, 92,
+ 188, 114, 92, 196, 126, 100, 196, 126, 100, 188, 118, 92, 180, 110, 92,
+ 188, 118, 92, 196, 130, 108, 196, 126, 100, 196, 122, 100, 188, 126, 100,
+ 196, 126, 108, 196, 126, 100, 196, 122, 100, 180, 118, 92, 188, 114, 92,
+ 188, 118, 92, 196, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92,
+ 188, 118, 92, 188, 118, 92, 196, 126, 100, 188, 122, 100, 196, 122, 100,
+ 188, 122, 100, 196, 126, 100, 196, 130, 100, 196, 126, 108, 196, 130, 100,
+ 196, 122, 100, 188, 122, 100, 196, 126, 108, 196, 126, 100, 204, 130, 108,
+ 196, 130, 100, 196, 130, 108, 196, 130, 108, 188, 122, 100, 196, 126, 100,
+ 188, 122, 100, 196, 122, 100, 188, 122, 100, 196, 126, 100, 196, 126, 100,
+ 196, 130, 100, 196, 130, 108, 196, 130, 100, 196, 126, 100, 196, 126, 100,
+ 204, 130, 108, 196, 130, 100, 196, 126, 108, 188, 126, 100, 196, 122, 100,
+ 196, 126, 100, 196, 130, 108, 204, 130, 108, 196, 126, 108, 196, 130, 100,
+ 196, 122, 100, 188, 122, 100, 196, 126, 100, 204, 134, 108, 204, 134, 108,
+ 196, 126, 100, 188, 114, 92, 188, 118, 92, 188, 122, 100, 196, 126, 100,
+ 196, 130, 108, 196, 126, 108, 196, 126, 100, 196, 126, 100, 196, 126, 100,
+ 188, 122, 92, 188, 122, 100, 188, 122, 100, 196, 122, 100, 188, 122, 100,
+ 196, 122, 100, 188, 122, 100, 196, 122, 100, 188, 122, 100, 188, 118, 92,
+ 188, 118, 100, 196, 126, 100, 188, 122, 100, 188, 122, 100, 188, 118, 100,
+ 188, 118, 92, 188, 118, 92, 188, 114, 92, 188, 118, 92, 188, 122, 100,
+ 188, 114, 92, 180, 114, 92, 180, 114, 84, 172, 102, 84, 172, 106, 84,
+ 188, 118, 92, 188, 118, 100, 188, 122, 100, 188, 122, 100, 180, 118, 100,
+ 188, 118, 100, 188, 122, 100, 188, 122, 100, 188, 118, 100, 180, 118, 100,
+ 196, 130, 108, 180, 114, 92, 172, 106, 84, 172, 110, 92, 180, 114, 92,
+ 172, 110, 92, 172, 106, 84, 172, 106, 84, 180, 110, 92, 180, 114, 92,
+ 180, 114, 92, 180, 110, 92, 164, 102, 84, 164, 98, 84, 172, 102, 84,
+ 172, 106, 84, 172, 106, 92, 172, 106, 84, 172, 106, 84, 180, 106, 92,
+ 172, 106, 92, 180, 110, 92, 180, 110, 92, 172, 110, 92, 172, 102, 84,
+ 172, 110, 92, 180, 114, 92, 180, 114, 100, 180, 114, 92, 172, 110, 92,
+ 180, 114, 92, 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 110, 92,
+ 180, 110, 92, 172, 110, 92, 180, 110, 84, 172, 110, 92, 172, 110, 92,
+ 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100,
+ 180, 118, 100, 180, 114, 92, 180, 114, 92, 172, 102, 84, 172, 102, 84,
+ 180, 106, 92, 164, 94, 84, 156, 94, 76, 172, 110, 100, 140, 82, 68,
+ 92, 38, 28, 92, 34, 20, 124, 58, 44, 140, 78, 60, 148, 86, 68,
+ 156, 90, 68, 156, 94, 76, 164, 94, 76, 148, 90, 68, 156, 90, 68,
+ 164, 94, 76, 156, 94, 76, 156, 94, 76, 156, 90, 68, 148, 86, 60,
+ 148, 86, 68, 156, 90, 68, 164, 94, 76, 164, 98, 76, 156, 94, 76,
+ 156, 94, 76, 172, 98, 84, 180, 110, 92, 180, 118, 100, 188, 114, 100,
+ 180, 114, 92, 172, 102, 84, 164, 98, 84, 164, 94, 76, 156, 94, 76,
+ 156, 90, 68, 164, 94, 76, 164, 94, 76, 164, 94, 76, 164, 98, 76,
+ 180, 110, 92, 196, 126, 100, 196, 126, 108, 204, 130, 100, 196, 126, 108,
+ 196, 130, 108, 196, 126, 100, 188, 122, 100, 196, 122, 100, 196, 126, 100,
+ 196, 126, 100, 188, 122, 100, 188, 118, 92, 196, 130, 108, 196, 134, 108,
+ 204, 134, 108, 204, 134, 108, 196, 130, 108, 196, 130, 108, 196, 126, 108,
+ 196, 130, 108, 196, 126, 100, 188, 126, 100, 188, 122, 100, 196, 126, 100,
+ 196, 126, 100, 196, 126, 108, 196, 126, 100, 188, 126, 100, 188, 122, 100,
+ 196, 126, 100, 188, 122, 100, 188, 122, 100, 188, 122, 100, 196, 122, 100,
+ 196, 126, 100, 196, 126, 108, 204, 130, 108, 196, 130, 108, 196, 130, 108,
+ 196, 130, 108, 196, 130, 108, 204, 130, 108, 196, 130, 108, 204, 130, 108,
+ 196, 130, 108, 196, 126, 100, 188, 126, 108, 196, 126, 100, 196, 126, 108,
+ 196, 130, 108, 196, 126, 100, 196, 126, 100, 196, 126, 100, 188, 126, 100,
+ 196, 126, 100, 196, 126, 108, 196, 130, 100, 196, 126, 108, 188, 126, 100,
+ 196, 122, 100, 188, 126, 100, 196, 130, 108, 196, 130, 108, 188, 122, 100,
+ 180, 114, 92, 188, 118, 92, 188, 122, 100, 188, 122, 100, 188, 118, 92,
+ 188, 122, 100, 188, 118, 100, 188, 122, 100, 188, 118, 92, 188, 118, 100,
+ 188, 118, 92, 188, 122, 100, 188, 118, 92, 188, 122, 92, 188, 118, 100,
+ 188, 118, 92, 188, 118, 92, 188, 118, 92, 188, 118, 100, 180, 118, 92,
+ 188, 122, 100, 188, 122, 100, 188, 118, 92, 188, 118, 92, 180, 114, 92,
+ 180, 114, 92, 180, 114, 92, 188, 118, 92, 196, 126, 100, 188, 118, 100,
+ 188, 122, 100, 188, 118, 92, 180, 110, 84, 180, 114, 92, 188, 122, 100,
+ 188, 122, 100, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92,
+ 180, 118, 100, 180, 118, 100, 180, 114, 92, 172, 110, 92, 172, 106, 84,
+ 164, 94, 76, 164, 102, 84, 180, 114, 92, 180, 118, 100, 172, 106, 84,
+ 164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 98, 84, 172, 102, 84,
+ 172, 102, 84, 164, 98, 76, 172, 102, 84, 172, 106, 84, 180, 110, 92,
+ 180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 110, 92,
+ 180, 110, 92, 172, 110, 92, 180, 110, 92, 172, 106, 84, 172, 110, 92,
+ 180, 118, 92, 188, 118, 100, 180, 114, 92, 180, 114, 92, 180, 114, 92,
+ 180, 114, 92, 180, 118, 100, 180, 118, 100, 180, 118, 100, 180, 118, 100,
+ 188, 118, 92, 180, 118, 100, 180, 118, 100, 188, 118, 100, 180, 110, 92,
+ 172, 110, 100, 180, 114, 100, 180, 118, 100, 180, 118, 100, 180, 118, 100,
+ 188, 122, 100, 188, 118, 100, 180, 106, 84, 172, 102, 84, 188, 114, 100,
+ 164, 98, 76, 164, 98, 84, 172, 110, 100, 132, 78, 68, 92, 34, 20,
+ 92, 34, 20, 132, 70, 52, 156, 90, 68, 164, 102, 76, 164, 98, 76,
+ 164, 98, 84, 164, 98, 76, 156, 90, 68, 156, 94, 76, 148, 82, 60,
+ 148, 86, 68, 148, 82, 60, 148, 82, 60, 148, 82, 60, 148, 78, 60,
+ 148, 82, 60, 148, 86, 68, 148, 82, 68, 148, 82, 60, 156, 82, 68,
+ 156, 90, 68, 164, 98, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84,
+ 164, 102, 76, 172, 98, 84, 164, 98, 76, 156, 90, 76, 156, 82, 60,
+ 140, 78, 60, 140, 70, 52, 132, 70, 52, 156, 82, 60, 172, 98, 76,
+ 188, 114, 92, 196, 122, 100, 196, 126, 100, 196, 126, 108, 196, 130, 108,
+ 196, 130, 108, 196, 126, 100, 188, 126, 100, 196, 126, 100, 188, 126, 100,
+ 196, 126, 100, 188, 122, 100, 196, 130, 108, 204, 130, 108, 196, 130, 108,
+ 196, 130, 108, 196, 122, 100, 188, 122, 100, 196, 122, 100, 188, 126, 100,
+ 196, 126, 100, 196, 122, 100, 188, 122, 100, 188, 122, 100, 196, 122, 100,
+ 188, 126, 100, 188, 122, 100, 188, 122, 100, 196, 122, 100, 188, 122, 100,
+ 196, 126, 100, 188, 122, 100, 188, 118, 100, 188, 118, 92, 188, 122, 100,
+ 188, 126, 100, 196, 126, 100, 196, 126, 100, 196, 130, 108, 196, 126, 100,
+ 196, 126, 100, 196, 126, 108, 196, 126, 100, 188, 122, 100, 196, 130, 108,
+ 196, 130, 100, 196, 126, 108, 196, 126, 100, 196, 130, 108, 204, 130, 108,
+ 196, 130, 108, 196, 126, 108, 196, 130, 108, 204, 134, 108, 196, 130, 108,
+ 196, 130, 108, 196, 130, 108, 196, 130, 108, 204, 130, 108, 196, 134, 108,
+ 204, 130, 108, 204, 134, 116, 196, 130, 108, 196, 122, 100, 188, 122, 100,
+ 196, 126, 108, 196, 126, 100, 196, 126, 100, 188, 118, 100, 188, 118, 92,
+ 188, 118, 92, 188, 122, 92, 188, 118, 100, 188, 122, 100, 188, 122, 100,
+ 188, 122, 100, 188, 122, 100, 188, 118, 100, 188, 122, 92, 188, 118, 100,
+ 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92,
+ 188, 122, 100, 188, 122, 100, 188, 118, 100, 188, 118, 92, 188, 114, 92,
+ 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92, 188, 122, 100,
+ 188, 122, 100, 180, 110, 92, 180, 114, 92, 188, 122, 100, 188, 122, 100,
+ 188, 118, 100, 180, 118, 100, 180, 118, 100, 188, 122, 100, 188, 122, 100,
+ 188, 122, 100, 180, 114, 92, 180, 110, 92, 172, 110, 92, 164, 102, 76,
+ 164, 102, 84, 188, 118, 100, 180, 118, 100, 172, 106, 84, 164, 102, 84,
+ 172, 110, 92, 180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 110, 92,
+ 172, 106, 84, 180, 110, 92, 172, 110, 92, 180, 110, 92, 180, 110, 92,
+ 180, 114, 92, 180, 110, 92, 180, 114, 92, 172, 110, 92, 180, 110, 84,
+ 180, 110, 92, 180, 110, 92, 172, 102, 84, 172, 106, 84, 172, 110, 92,
+ 180, 110, 92, 172, 110, 92, 172, 110, 92, 172, 106, 92, 172, 110, 92,
+ 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 100,
+ 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 110, 100, 180, 114, 92,
+ 180, 114, 92, 180, 114, 100, 180, 118, 92, 180, 122, 100, 188, 122, 100,
+ 188, 122, 100, 188, 118, 100, 180, 110, 92, 188, 114, 100, 172, 102, 92,
+ 172, 106, 92, 180, 118, 100, 132, 78, 68, 92, 34, 20, 92, 34, 20,
+ 132, 74, 60, 156, 90, 68, 164, 94, 76, 148, 90, 68, 156, 86, 68,
+ 156, 90, 68, 156, 90, 68, 164, 98, 84, 156, 90, 68, 156, 90, 68,
+ 156, 90, 76, 156, 94, 76, 164, 98, 76, 164, 98, 84, 164, 102, 76,
+ 172, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 180, 110, 92,
+ 180, 110, 92, 180, 110, 92, 180, 114, 100, 180, 114, 92, 180, 110, 92,
+ 180, 114, 92, 180, 114, 92, 180, 110, 92, 164, 98, 84, 164, 94, 76,
+ 156, 90, 68, 156, 90, 68, 172, 102, 84, 180, 110, 92, 188, 118, 92,
+ 196, 122, 100, 196, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92,
+ 188, 118, 100, 188, 118, 100, 180, 114, 92, 188, 114, 92, 188, 118, 100,
+ 188, 118, 92, 196, 126, 100, 188, 126, 100, 196, 122, 100, 188, 122, 100,
+ 180, 118, 92, 188, 118, 92, 188, 122, 100, 196, 122, 100, 196, 126, 108,
+ 188, 126, 100, 188, 122, 100, 196, 122, 100, 188, 126, 100, 196, 122, 100,
+ 188, 122, 100, 188, 118, 92, 180, 110, 92, 180, 114, 92, 188, 118, 92,
+ 180, 114, 92, 180, 110, 84, 172, 110, 84, 180, 114, 92, 188, 114, 92,
+ 188, 126, 100, 196, 126, 108, 196, 126, 100, 196, 130, 108, 196, 126, 108,
+ 188, 126, 100, 188, 126, 100, 196, 122, 100, 188, 122, 100, 188, 122, 100,
+ 188, 118, 92, 188, 122, 100, 188, 122, 100, 188, 126, 100, 188, 122, 100,
+ 188, 118, 92, 196, 130, 108, 196, 130, 108, 196, 126, 108, 196, 126, 100,
+ 196, 130, 108, 196, 130, 108, 196, 130, 108, 204, 130, 108, 196, 130, 108,
+ 196, 130, 100, 196, 122, 100, 180, 118, 92, 188, 118, 92, 188, 122, 100,
+ 196, 126, 100, 180, 118, 100, 188, 118, 92, 180, 118, 92, 180, 114, 92,
+ 188, 118, 92, 180, 114, 92, 188, 118, 92, 180, 114, 92, 188, 114, 92,
+ 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 188, 118, 92,
+ 180, 114, 92, 188, 118, 92, 188, 118, 92, 180, 110, 92, 188, 114, 92,
+ 188, 122, 92, 180, 118, 92, 180, 110, 92, 180, 110, 92, 180, 118, 92,
+ 196, 122, 100, 188, 118, 100, 180, 114, 92, 188, 122, 100, 188, 118, 92,
+ 180, 110, 92, 180, 114, 84, 188, 118, 100, 180, 118, 92, 188, 118, 100,
+ 188, 122, 100, 188, 122, 100, 188, 122, 108, 188, 122, 100, 188, 122, 100,
+ 180, 114, 92, 172, 106, 84, 164, 98, 84, 156, 94, 76, 164, 94, 76,
+ 164, 102, 76, 172, 102, 84, 164, 98, 76, 172, 106, 84, 188, 122, 100,
+ 188, 118, 100, 188, 118, 100, 180, 114, 92, 180, 114, 92, 180, 110, 92,
+ 180, 110, 92, 180, 110, 92, 172, 110, 92, 180, 110, 92, 172, 110, 92,
+ 180, 110, 84, 172, 110, 92, 180, 110, 92, 172, 106, 92, 172, 110, 84,
+ 172, 106, 92, 172, 102, 84, 172, 106, 84, 172, 110, 92, 172, 110, 84,
+ 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84,
+ 164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 92,
+ 172, 106, 84, 172, 106, 92, 180, 110, 92, 172, 110, 92, 180, 106, 92,
+ 172, 110, 92, 172, 110, 92, 180, 114, 92, 180, 118, 92, 180, 118, 92,
+ 188, 118, 100, 188, 114, 100, 188, 118, 100, 180, 110, 92, 180, 118, 108,
+ 180, 122, 108, 132, 78, 68, 92, 34, 20, 92, 34, 20, 108, 50, 28,
+ 132, 66, 52, 140, 74, 52, 132, 70, 52, 140, 74, 52, 140, 78, 60,
+ 148, 86, 60, 164, 94, 76, 156, 94, 68, 156, 94, 76, 164, 98, 76,
+ 164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92, 172, 106, 84,
+ 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 110, 92, 180, 110, 92,
+ 180, 114, 92, 180, 110, 92, 180, 114, 92, 172, 106, 92, 180, 110, 92,
+ 180, 114, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92, 188, 114, 100,
+ 188, 122, 100, 180, 110, 84, 188, 114, 92, 180, 114, 92, 188, 114, 92,
+ 180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 114, 84,
+ 180, 114, 92, 180, 110, 84, 180, 110, 92, 172, 110, 84, 180, 110, 92,
+ 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 110, 92, 180, 110, 84,
+ 180, 110, 92, 188, 118, 92, 188, 122, 100, 180, 114, 84, 180, 110, 92,
+ 180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 114, 92, 180, 106, 84,
+ 172, 106, 84, 164, 102, 76, 172, 102, 84, 180, 110, 84, 180, 110, 84,
+ 172, 110, 92, 180, 106, 84, 180, 110, 84, 180, 110, 92, 180, 118, 92,
+ 188, 118, 92, 188, 118, 100, 188, 122, 100, 188, 122, 92, 188, 118, 100,
+ 188, 118, 92, 180, 114, 92, 188, 118, 92, 180, 114, 92, 180, 110, 92,
+ 180, 114, 92, 180, 114, 92, 188, 114, 92, 180, 114, 92, 180, 114, 92,
+ 188, 114, 92, 188, 118, 92, 188, 122, 92, 188, 118, 100, 196, 122, 92,
+ 188, 122, 100, 188, 118, 100, 188, 122, 92, 188, 118, 100, 188, 118, 92,
+ 180, 114, 92, 172, 106, 84, 180, 110, 92, 180, 118, 92, 188, 114, 92,
+ 172, 110, 84, 180, 110, 84, 180, 110, 92, 180, 110, 92, 180, 110, 84,
+ 172, 110, 84, 180, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84,
+ 172, 106, 76, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 180, 110, 84, 172, 106, 84, 172, 102, 76, 172, 106, 84, 180, 110, 84,
+ 172, 106, 84, 172, 102, 84, 172, 102, 76, 180, 106, 84, 180, 114, 92,
+ 188, 118, 92, 180, 114, 92, 188, 118, 92, 188, 122, 100, 180, 110, 84,
+ 180, 110, 92, 188, 118, 92, 180, 114, 92, 180, 114, 92, 172, 114, 92,
+ 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 110, 84, 164, 98, 84,
+ 156, 94, 76, 140, 74, 52, 140, 78, 60, 148, 86, 68, 156, 90, 68,
+ 156, 94, 76, 156, 98, 76, 172, 102, 84, 172, 110, 92, 172, 106, 92,
+ 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 180, 106, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84,
+ 172, 102, 84, 172, 106, 84, 180, 106, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 172, 110, 92, 180, 110, 92, 180, 110, 92, 172, 106, 92,
+ 172, 106, 84, 172, 106, 84, 172, 110, 92, 164, 102, 84, 172, 102, 84,
+ 164, 106, 84, 172, 106, 84, 172, 106, 92, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 172, 106, 92, 172, 106, 92, 164, 102, 84, 172, 102, 84,
+ 164, 106, 84, 164, 102, 84, 172, 106, 84, 172, 106, 84, 180, 110, 92,
+ 180, 106, 92, 180, 110, 92, 172, 102, 92, 172, 114, 100, 180, 118, 100,
+ 132, 74, 60, 92, 34, 20, 92, 34, 12, 124, 58, 44, 148, 78, 60,
+ 148, 90, 68, 156, 86, 68, 156, 94, 76, 156, 94, 76, 156, 90, 68,
+ 164, 98, 76, 156, 94, 76, 164, 94, 76, 156, 94, 68, 164, 94, 76,
+ 164, 98, 76, 164, 98, 84, 164, 98, 76, 156, 98, 76, 164, 94, 76,
+ 164, 98, 76, 164, 98, 84, 164, 98, 84, 172, 102, 76, 164, 102, 84,
+ 172, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 92, 180, 106, 84,
+ 172, 106, 92, 172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 114, 92,
+ 180, 110, 92, 180, 106, 84, 180, 114, 92, 188, 118, 92, 188, 118, 92,
+ 188, 114, 92, 188, 118, 92, 188, 118, 92, 188, 118, 100, 188, 118, 92,
+ 188, 122, 100, 188, 122, 100, 188, 118, 92, 180, 118, 92, 188, 118, 92,
+ 188, 118, 100, 188, 118, 92, 180, 118, 92, 188, 114, 92, 180, 118, 92,
+ 188, 122, 100, 196, 130, 108, 188, 114, 92, 180, 114, 92, 180, 118, 92,
+ 188, 118, 92, 188, 118, 100, 188, 118, 92, 180, 114, 92, 180, 110, 84,
+ 180, 110, 92, 180, 114, 84, 180, 114, 92, 180, 114, 92, 188, 118, 92,
+ 188, 118, 100, 188, 118, 92, 188, 118, 100, 188, 118, 92, 188, 118, 100,
+ 188, 122, 92, 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 122, 100,
+ 196, 122, 100, 188, 126, 100, 188, 122, 100, 188, 122, 92, 188, 122, 100,
+ 196, 122, 100, 188, 126, 100, 196, 122, 100, 188, 118, 92, 180, 118, 92,
+ 188, 118, 100, 188, 118, 92, 188, 122, 100, 188, 122, 100, 188, 122, 100,
+ 188, 122, 100, 188, 122, 100, 188, 118, 92, 188, 118, 100, 180, 114, 92,
+ 180, 110, 84, 180, 110, 92, 188, 118, 92, 180, 114, 92, 180, 110, 92,
+ 188, 118, 92, 180, 118, 92, 188, 114, 92, 180, 114, 92, 180, 110, 92,
+ 180, 110, 84, 180, 110, 84, 180, 110, 84, 180, 110, 84, 180, 110, 84,
+ 180, 106, 84, 180, 110, 84, 180, 110, 92, 180, 110, 84, 180, 110, 92,
+ 180, 110, 92, 172, 106, 84, 180, 110, 84, 180, 114, 92, 180, 110, 92,
+ 172, 110, 84, 172, 110, 84, 180, 110, 92, 188, 118, 92, 188, 118, 92,
+ 180, 114, 92, 188, 118, 100, 188, 118, 92, 180, 110, 92, 180, 114, 84,
+ 188, 118, 100, 180, 114, 92, 180, 110, 92, 172, 110, 92, 172, 110, 92,
+ 172, 110, 92, 172, 110, 92, 172, 102, 84, 164, 98, 76, 156, 94, 76,
+ 156, 94, 68, 172, 102, 76, 172, 110, 92, 172, 110, 84, 172, 106, 92,
+ 172, 110, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 180, 106, 92,
+ 172, 106, 84, 172, 106, 92, 172, 102, 84, 172, 102, 84, 172, 106, 92,
+ 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84,
+ 172, 106, 84, 172, 102, 84, 172, 106, 92, 172, 102, 84, 164, 98, 76,
+ 164, 102, 84, 164, 102, 84, 164, 102, 76, 164, 98, 76, 164, 98, 76,
+ 164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 102, 84,
+ 172, 102, 84, 164, 102, 84, 164, 102, 84, 164, 102, 84, 164, 98, 76,
+ 172, 102, 84, 172, 102, 84, 172, 102, 84, 164, 98, 84, 164, 102, 76,
+ 164, 98, 76, 164, 98, 76, 164, 98, 76, 172, 98, 84, 172, 98, 76,
+ 172, 98, 84, 164, 94, 84, 172, 110, 92, 172, 110, 100, 116, 62, 52,
+ 92, 34, 12, 92, 34, 20, 148, 90, 68, 172, 106, 84, 172, 110, 92,
+ 172, 106, 84, 172, 110, 84, 180, 110, 92, 164, 102, 84, 172, 106, 84,
+ 172, 106, 84, 172, 106, 84, 164, 102, 84, 172, 106, 84, 172, 106, 84,
+ 172, 110, 92, 172, 106, 84, 172, 106, 92, 172, 106, 84, 172, 102, 84,
+ 172, 106, 84, 172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 110, 92,
+ 180, 110, 92, 188, 118, 100, 188, 114, 100, 180, 114, 92, 180, 110, 92,
+ 180, 110, 92, 172, 110, 92, 180, 110, 92, 172, 106, 84, 188, 118, 100,
+ 188, 118, 92, 196, 122, 100, 196, 126, 108, 204, 130, 108, 188, 122, 100,
+ 188, 118, 100, 180, 118, 92, 180, 114, 92, 188, 122, 100, 196, 122, 100,
+ 188, 122, 100, 188, 118, 92, 180, 110, 92, 196, 122, 100, 188, 126, 100,
+ 196, 126, 100, 188, 122, 100, 188, 122, 100, 196, 126, 100, 196, 126, 108,
+ 196, 130, 108, 196, 130, 108, 196, 126, 100, 196, 126, 108, 196, 130, 108,
+ 196, 134, 108, 204, 134, 108, 196, 130, 108, 188, 126, 108, 188, 118, 92,
+ 180, 114, 92, 180, 106, 84, 180, 110, 84, 180, 114, 92, 180, 118, 92,
+ 188, 118, 92, 180, 118, 92, 188, 126, 100, 188, 122, 100, 196, 126, 100,
+ 196, 126, 100, 196, 126, 100, 196, 130, 108, 204, 130, 108, 196, 130, 108,
+ 196, 122, 100, 188, 122, 100, 188, 118, 100, 188, 118, 92, 188, 122, 100,
+ 188, 122, 100, 188, 122, 100, 188, 118, 100, 180, 118, 100, 188, 118, 92,
+ 180, 114, 92, 188, 118, 92, 188, 118, 100, 188, 122, 92, 188, 122, 100,
+ 196, 122, 100, 180, 118, 92, 188, 118, 92, 180, 114, 92, 172, 110, 84,
+ 180, 110, 84, 180, 114, 92, 188, 118, 92, 180, 114, 92, 180, 118, 92,
+ 188, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92,
+ 180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92,
+ 180, 110, 92, 180, 114, 84, 180, 110, 92, 180, 110, 84, 180, 114, 84,
+ 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 110, 84, 180, 110, 92,
+ 180, 114, 84, 180, 114, 92, 180, 118, 92, 180, 110, 92, 172, 106, 84,
+ 180, 110, 84, 180, 110, 84, 164, 102, 76, 172, 102, 84, 180, 110, 84,
+ 172, 110, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84,
+ 172, 110, 84, 172, 106, 92, 172, 106, 84, 164, 98, 76, 180, 118, 100,
+ 188, 122, 100, 188, 118, 100, 188, 118, 100, 180, 114, 92, 172, 106, 92,
+ 172, 106, 84, 164, 102, 84, 180, 106, 84, 172, 106, 92, 180, 110, 92,
+ 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84, 172, 106, 92,
+ 172, 98, 84, 164, 102, 84, 172, 102, 84, 172, 102, 84, 172, 106, 92,
+ 180, 106, 84, 172, 110, 92, 180, 106, 92, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 156, 94, 76, 156, 94, 76, 156, 94, 76,
+ 164, 98, 76, 164, 98, 84, 164, 98, 76, 172, 102, 84, 164, 102, 84,
+ 172, 102, 84, 164, 102, 84, 164, 98, 76, 156, 94, 76, 172, 102, 84,
+ 172, 102, 92, 164, 102, 84, 172, 102, 84, 164, 106, 84, 164, 106, 84,
+ 164, 102, 76, 172, 102, 84, 164, 98, 76, 172, 102, 84, 172, 102, 84,
+ 164, 94, 84, 172, 106, 92, 164, 106, 92, 116, 62, 52, 92, 34, 20,
+ 100, 46, 28, 148, 86, 76, 164, 98, 76, 164, 98, 76, 156, 90, 76,
+ 164, 98, 76, 164, 102, 84, 172, 102, 84, 172, 106, 84, 164, 102, 84,
+ 164, 102, 84, 164, 98, 76, 164, 98, 84, 172, 106, 84, 172, 110, 92,
+ 180, 110, 92, 172, 110, 84, 180, 110, 92, 180, 106, 92, 172, 106, 84,
+ 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 110, 92, 172, 110, 92,
+ 172, 106, 84, 172, 102, 84, 164, 102, 84, 172, 106, 84, 180, 106, 92,
+ 180, 110, 84, 172, 106, 84, 172, 102, 84, 180, 110, 92, 172, 102, 76,
+ 172, 98, 76, 172, 106, 84, 180, 106, 84, 172, 98, 76, 164, 98, 76,
+ 164, 94, 76, 164, 98, 76, 172, 102, 76, 172, 110, 84, 172, 106, 84,
+ 172, 98, 76, 156, 94, 68, 164, 94, 68, 164, 94, 76, 164, 98, 76,
+ 164, 94, 68, 164, 94, 68, 156, 90, 68, 164, 94, 68, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 164, 98, 76, 172, 102, 76, 172, 106, 84,
+ 172, 106, 84, 172, 102, 76, 164, 98, 76, 172, 106, 84, 164, 98, 76,
+ 148, 86, 60, 148, 82, 60, 156, 90, 68, 164, 94, 76, 164, 98, 76,
+ 164, 94, 76, 172, 98, 76, 164, 98, 76, 164, 98, 76, 172, 102, 84,
+ 172, 102, 76, 172, 106, 84, 172, 106, 84, 180, 110, 84, 172, 106, 84,
+ 172, 102, 76, 172, 102, 76, 172, 102, 76, 172, 106, 84, 172, 106, 84,
+ 172, 102, 76, 172, 102, 76, 172, 106, 84, 172, 102, 84, 172, 102, 76,
+ 164, 102, 84, 172, 102, 76, 172, 106, 84, 180, 110, 84, 180, 114, 92,
+ 172, 102, 76, 172, 106, 84, 172, 102, 84, 164, 94, 76, 164, 98, 76,
+ 172, 102, 76, 172, 102, 84, 172, 102, 76, 164, 98, 76, 172, 98, 76,
+ 164, 102, 76, 172, 102, 76, 164, 98, 76, 172, 102, 76, 164, 102, 76,
+ 172, 102, 76, 172, 102, 76, 164, 102, 76, 172, 102, 76, 164, 102, 76,
+ 172, 98, 76, 164, 98, 76, 164, 102, 76, 164, 98, 76, 172, 102, 84,
+ 172, 102, 76, 172, 102, 76, 164, 98, 76, 172, 102, 76, 172, 102, 84,
+ 172, 102, 76, 172, 102, 84, 172, 102, 76, 164, 98, 76, 164, 98, 76,
+ 164, 102, 76, 156, 90, 68, 164, 94, 68, 164, 98, 76, 164, 98, 76,
+ 164, 94, 76, 156, 94, 76, 156, 94, 76, 164, 94, 76, 164, 98, 76,
+ 164, 102, 84, 164, 102, 76, 164, 98, 84, 164, 94, 76, 156, 90, 68,
+ 156, 90, 76, 156, 94, 68, 156, 94, 76, 156, 90, 68, 156, 90, 68,
+ 156, 94, 76, 156, 86, 68, 156, 90, 68, 164, 98, 76, 164, 94, 76,
+ 164, 94, 76, 164, 98, 76, 172, 102, 84, 180, 114, 92, 164, 102, 76,
+ 172, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 180, 110, 92,
+ 180, 110, 92, 180, 114, 92, 172, 106, 92, 180, 110, 92, 172, 110, 92,
+ 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92,
+ 172, 110, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92,
+ 172, 110, 92, 172, 110, 84, 172, 106, 84, 172, 102, 92, 172, 106, 84,
+ 172, 106, 92, 172, 110, 92, 172, 110, 92, 172, 110, 92, 180, 106, 84,
+ 172, 106, 84, 180, 106, 92, 180, 110, 92, 180, 110, 100, 172, 102, 84,
+ 180, 114, 100, 172, 110, 100, 124, 66, 52, 100, 46, 28, 100, 42, 28,
+ 148, 78, 68, 156, 90, 68, 156, 94, 76, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 156, 90, 68, 148, 82, 60, 148, 82, 68, 148, 86, 60,
+ 148, 82, 68, 148, 86, 60, 148, 86, 68, 156, 90, 68, 148, 86, 68,
+ 156, 90, 68, 156, 90, 68, 164, 94, 76, 164, 98, 84, 164, 98, 76,
+ 156, 94, 76, 164, 94, 76, 164, 98, 76, 164, 98, 76, 172, 102, 84,
+ 156, 90, 68, 164, 94, 76, 164, 98, 76, 164, 94, 76, 156, 86, 68,
+ 156, 94, 76, 180, 110, 92, 172, 98, 76, 172, 102, 76, 172, 102, 84,
+ 164, 98, 76, 172, 98, 76, 180, 110, 84, 188, 122, 100, 188, 118, 92,
+ 180, 114, 92, 188, 118, 100, 188, 118, 92, 188, 122, 100, 180, 114, 92,
+ 180, 110, 92, 172, 102, 76, 172, 106, 84, 188, 118, 92, 188, 122, 100,
+ 188, 122, 100, 188, 118, 92, 188, 118, 100, 188, 118, 92, 172, 102, 76,
+ 172, 102, 76, 180, 106, 84, 180, 110, 92, 180, 114, 92, 188, 118, 92,
+ 188, 114, 92, 180, 114, 92, 188, 114, 92, 188, 118, 100, 188, 118, 92,
+ 180, 114, 92, 172, 102, 76, 164, 98, 76, 172, 102, 76, 172, 106, 84,
+ 180, 110, 84, 172, 110, 84, 172, 102, 84, 172, 102, 76, 164, 98, 76,
+ 172, 102, 76, 172, 106, 76, 172, 102, 84, 172, 102, 76, 172, 106, 84,
+ 180, 110, 92, 180, 114, 92, 180, 110, 84, 172, 110, 84, 180, 106, 84,
+ 180, 110, 92, 172, 106, 76, 172, 110, 84, 180, 110, 92, 180, 110, 84,
+ 180, 106, 84, 172, 106, 84, 180, 106, 84, 172, 110, 84, 180, 110, 84,
+ 172, 102, 84, 172, 102, 76, 172, 102, 76, 164, 94, 68, 164, 98, 76,
+ 172, 102, 76, 164, 94, 76, 172, 102, 76, 164, 98, 76, 164, 94, 76,
+ 164, 98, 76, 172, 102, 76, 172, 102, 84, 172, 102, 76, 164, 98, 76,
+ 164, 102, 84, 172, 98, 76, 164, 98, 76, 172, 102, 76, 164, 98, 76,
+ 156, 90, 68, 156, 90, 68, 164, 94, 76, 172, 102, 76, 172, 106, 84,
+ 172, 106, 84, 164, 98, 76, 164, 98, 76, 172, 102, 76, 172, 102, 76,
+ 164, 98, 76, 164, 102, 76, 164, 98, 76, 172, 102, 76, 172, 102, 84,
+ 164, 94, 68, 164, 94, 76, 172, 102, 76, 164, 98, 76, 164, 102, 76,
+ 164, 94, 76, 156, 90, 68, 156, 94, 76, 164, 98, 76, 156, 94, 76,
+ 156, 90, 68, 156, 94, 76, 156, 90, 68, 156, 94, 76, 164, 98, 76,
+ 164, 98, 76, 156, 94, 76, 156, 86, 68, 148, 86, 68, 148, 82, 60,
+ 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 82, 60,
+ 148, 86, 68, 156, 86, 68, 156, 90, 76, 156, 90, 68, 156, 86, 68,
+ 148, 78, 60, 148, 82, 60, 156, 86, 68, 156, 90, 76, 156, 90, 68,
+ 156, 86, 68, 148, 86, 60, 156, 86, 68, 148, 86, 68, 148, 86, 68,
+ 156, 90, 68, 156, 90, 68, 164, 94, 76, 156, 94, 76, 156, 86, 68,
+ 156, 90, 68, 156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 68,
+ 156, 86, 68, 148, 86, 68, 156, 86, 68, 156, 86, 68, 156, 90, 68,
+ 156, 90, 76, 164, 98, 76, 164, 102, 76, 164, 102, 84, 172, 106, 84,
+ 172, 102, 84, 164, 90, 76, 172, 102, 84, 172, 102, 84, 164, 102, 92,
+ 164, 102, 92, 124, 70, 60, 100, 42, 28, 84, 30, 12, 132, 70, 52,
+ 140, 74, 60, 148, 78, 60, 140, 74, 52, 140, 74, 60, 140, 78, 60,
+ 140, 78, 60, 140, 74, 52, 148, 78, 60, 148, 82, 60, 148, 82, 60,
+ 148, 82, 68, 156, 86, 60, 156, 90, 68, 156, 90, 68, 156, 90, 76,
+ 148, 82, 68, 156, 90, 68, 156, 90, 68, 164, 90, 68, 156, 90, 68,
+ 156, 86, 68, 156, 90, 68, 164, 90, 76, 172, 102, 84, 156, 94, 76,
+ 156, 90, 68, 172, 98, 84, 164, 102, 84, 164, 94, 76, 164, 94, 76,
+ 172, 102, 84, 180, 110, 84, 180, 110, 92, 188, 114, 92, 180, 110, 84,
+ 180, 110, 92, 188, 114, 92, 188, 118, 92, 188, 118, 92, 180, 118, 92,
+ 188, 114, 92, 188, 118, 92, 180, 118, 92, 180, 114, 92, 180, 110, 84,
+ 180, 114, 92, 180, 118, 92, 188, 118, 100, 180, 114, 92, 180, 114, 92,
+ 180, 114, 92, 188, 118, 92, 188, 122, 100, 180, 114, 92, 180, 114, 92,
+ 180, 110, 84, 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 110, 84,
+ 172, 102, 84, 172, 106, 76, 180, 110, 92, 188, 118, 92, 188, 118, 100,
+ 188, 118, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 110, 84,
+ 180, 106, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 110, 92,
+ 180, 110, 84, 172, 110, 84, 172, 102, 84, 172, 106, 84, 180, 110, 84,
+ 180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 110, 84, 180, 110, 92,
+ 172, 106, 84, 180, 106, 84, 180, 110, 84, 172, 110, 84, 172, 106, 84,
+ 172, 106, 84, 180, 106, 84, 180, 110, 92, 180, 110, 92, 172, 106, 76,
+ 172, 106, 84, 172, 106, 84, 164, 94, 76, 164, 98, 76, 172, 106, 84,
+ 172, 102, 76, 172, 102, 76, 164, 102, 76, 172, 98, 76, 164, 102, 76,
+ 172, 102, 84, 172, 106, 76, 172, 102, 84, 172, 102, 76, 172, 102, 76,
+ 164, 102, 84, 172, 102, 76, 172, 102, 84, 172, 102, 76, 164, 94, 68,
+ 164, 94, 76, 172, 102, 76, 172, 106, 84, 180, 106, 84, 172, 106, 84,
+ 172, 102, 76, 172, 102, 76, 172, 106, 84, 172, 106, 84, 172, 102, 76,
+ 172, 102, 76, 164, 98, 76, 172, 102, 84, 172, 106, 76, 164, 94, 76,
+ 164, 98, 76, 172, 102, 76, 164, 98, 76, 172, 102, 84, 164, 98, 76,
+ 156, 94, 76, 164, 102, 84, 172, 102, 84, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 156, 94, 76, 164, 94, 76, 164, 98, 76, 164, 102, 84,
+ 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 102, 84, 164, 94, 76,
+ 156, 94, 76, 164, 94, 76, 156, 94, 76, 156, 90, 68, 156, 86, 68,
+ 156, 90, 68, 164, 94, 76, 164, 94, 76, 156, 90, 68, 156, 86, 68,
+ 156, 86, 68, 156, 94, 76, 164, 98, 76, 164, 94, 76, 156, 90, 76,
+ 156, 86, 68, 148, 90, 68, 156, 90, 68, 156, 94, 68, 156, 94, 76,
+ 156, 94, 76, 156, 94, 76, 156, 94, 68, 156, 94, 76, 156, 94, 76,
+ 164, 94, 76, 156, 98, 76, 164, 94, 76, 156, 94, 76, 156, 90, 68,
+ 156, 90, 68, 164, 94, 84, 156, 94, 76, 164, 98, 84, 164, 98, 76,
+ 164, 102, 76, 156, 98, 76, 164, 98, 76, 164, 94, 68, 156, 82, 68,
+ 132, 66, 44, 140, 70, 52, 148, 78, 68, 156, 90, 76, 156, 102, 84,
+ 124, 66, 52, 84, 30, 12, 92, 38, 28, 132, 66, 52, 140, 74, 52,
+ 132, 74, 60, 132, 66, 44, 124, 66, 44, 140, 70, 52, 140, 78, 60,
+ 148, 82, 60, 148, 82, 68, 148, 86, 60, 148, 86, 68, 156, 86, 68,
+ 148, 90, 68, 156, 90, 76, 156, 94, 68, 156, 94, 76, 164, 90, 68,
+ 164, 94, 76, 164, 98, 76, 164, 98, 84, 172, 98, 84, 164, 98, 84,
+ 172, 98, 76, 164, 102, 84, 172, 102, 84, 172, 98, 84, 164, 98, 76,
+ 172, 102, 84, 180, 110, 84, 180, 110, 92, 172, 110, 92, 172, 102, 76,
+ 180, 106, 92, 180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 106, 84,
+ 172, 102, 84, 180, 118, 92, 188, 114, 92, 180, 114, 92, 180, 114, 92,
+ 180, 114, 92, 188, 114, 92, 180, 110, 92, 172, 110, 84, 188, 118, 100,
+ 188, 118, 92, 188, 114, 92, 180, 114, 92, 180, 110, 84, 180, 110, 92,
+ 180, 114, 92, 188, 118, 92, 188, 114, 92, 180, 114, 92, 180, 114, 92,
+ 180, 114, 92, 180, 114, 92, 180, 110, 84, 172, 102, 84, 172, 102, 76,
+ 172, 102, 76, 172, 110, 84, 188, 118, 100, 188, 122, 100, 188, 118, 92,
+ 188, 118, 100, 188, 122, 92, 188, 122, 100, 172, 110, 84, 180, 110, 92,
+ 180, 114, 84, 180, 114, 92, 188, 114, 92, 180, 118, 92, 188, 114, 92,
+ 180, 118, 92, 180, 106, 84, 172, 106, 84, 180, 106, 84, 180, 114, 84,
+ 180, 114, 92, 188, 114, 92, 180, 114, 92, 180, 114, 84, 172, 106, 84,
+ 180, 106, 84, 172, 110, 92, 180, 110, 84, 180, 106, 84, 172, 106, 84,
+ 172, 106, 84, 172, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 164, 94, 68, 164, 98, 76, 180, 106, 84, 172, 110, 84,
+ 172, 102, 84, 172, 102, 84, 164, 102, 76, 172, 102, 76, 172, 106, 84,
+ 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 76,
+ 172, 106, 84, 172, 106, 84, 172, 102, 84, 164, 98, 76, 172, 102, 76,
+ 172, 106, 84, 180, 110, 84, 180, 114, 92, 180, 110, 84, 172, 106, 84,
+ 172, 106, 84, 180, 110, 92, 180, 110, 84, 172, 110, 84, 172, 102, 84,
+ 172, 102, 76, 172, 106, 84, 180, 110, 84, 164, 98, 76, 164, 98, 76,
+ 172, 106, 84, 164, 102, 76, 172, 102, 84, 164, 98, 84, 164, 98, 76,
+ 172, 106, 84, 172, 110, 84, 172, 102, 84, 164, 102, 84, 164, 102, 84,
+ 172, 106, 84, 164, 102, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84,
+ 156, 94, 76, 164, 98, 76, 172, 106, 84, 172, 102, 76, 164, 98, 84,
+ 172, 102, 84, 164, 98, 76, 164, 94, 76, 164, 94, 76, 164, 98, 76,
+ 164, 98, 84, 164, 98, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76,
+ 172, 102, 84, 172, 102, 84, 164, 98, 76, 164, 94, 76, 156, 86, 68,
+ 156, 90, 68, 164, 94, 76, 164, 98, 84, 164, 98, 76, 164, 98, 76,
+ 164, 94, 76, 164, 94, 76, 164, 98, 84, 164, 102, 76, 164, 98, 76,
+ 164, 102, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 94, 76,
+ 164, 98, 84, 172, 102, 84, 172, 102, 84, 172, 106, 92, 164, 102, 84,
+ 164, 98, 76, 156, 94, 68, 156, 90, 68, 156, 86, 68, 132, 62, 44,
+ 140, 66, 52, 140, 74, 60, 156, 94, 84, 172, 110, 100, 132, 74, 60,
+ 92, 38, 28, 116, 58, 44, 164, 106, 84, 180, 114, 92, 180, 114, 92,
+ 172, 106, 84, 172, 106, 84, 172, 110, 92, 188, 122, 100, 188, 126, 100,
+ 180, 114, 92, 180, 114, 100, 180, 114, 92, 180, 114, 92, 180, 114, 92,
+ 180, 110, 92, 172, 110, 92, 180, 110, 92, 164, 102, 84, 172, 106, 84,
+ 180, 106, 92, 180, 110, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92,
+ 180, 110, 92, 172, 110, 84, 180, 114, 92, 180, 114, 100, 180, 114, 92,
+ 180, 114, 100, 188, 122, 100, 188, 122, 100, 188, 114, 92, 180, 114, 92,
+ 188, 114, 92, 188, 114, 92, 188, 122, 100, 188, 114, 92, 180, 110, 84,
+ 180, 110, 92, 180, 110, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92,
+ 180, 110, 84, 180, 110, 92, 180, 110, 84, 180, 114, 92, 180, 114, 92,
+ 180, 114, 92, 180, 114, 92, 180, 110, 84, 180, 110, 92, 180, 110, 84,
+ 180, 110, 92, 172, 110, 84, 172, 106, 84, 180, 106, 84, 180, 110, 84,
+ 180, 110, 84, 180, 110, 84, 172, 106, 84, 172, 102, 76, 180, 110, 92,
+ 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 110, 84, 180, 114, 92,
+ 188, 118, 92, 188, 122, 100, 188, 114, 92, 180, 110, 84, 172, 106, 84,
+ 172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 114, 92, 188, 118, 92,
+ 180, 110, 92, 180, 114, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92,
+ 180, 114, 92, 180, 110, 84, 172, 106, 84, 172, 102, 84, 172, 106, 76,
+ 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 76, 172, 106, 84,
+ 180, 106, 84, 172, 110, 84, 172, 102, 84, 180, 110, 84, 172, 106, 84,
+ 164, 94, 68, 164, 98, 76, 172, 106, 84, 180, 110, 84, 172, 106, 84,
+ 172, 102, 76, 172, 102, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 76, 172, 102, 76, 172, 102, 84, 164, 102, 76, 172, 102, 84,
+ 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84, 180, 110, 84,
+ 180, 110, 92, 180, 114, 84, 180, 110, 92, 172, 106, 84, 180, 106, 84,
+ 172, 110, 84, 180, 106, 84, 172, 110, 92, 180, 106, 84, 172, 106, 84,
+ 180, 110, 84, 172, 106, 84, 164, 98, 76, 172, 98, 76, 180, 110, 84,
+ 172, 106, 84, 172, 102, 84, 164, 98, 76, 164, 102, 84, 172, 106, 84,
+ 172, 110, 92, 172, 106, 84, 172, 102, 84, 164, 102, 84, 172, 106, 84,
+ 164, 98, 76, 164, 98, 76, 164, 102, 84, 164, 98, 76, 156, 90, 68,
+ 156, 90, 68, 164, 98, 84, 164, 98, 84, 172, 102, 76, 172, 102, 84,
+ 164, 102, 84, 164, 98, 76, 164, 98, 84, 172, 102, 84, 172, 106, 84,
+ 172, 98, 84, 164, 98, 76, 164, 98, 76, 172, 98, 84, 172, 106, 84,
+ 172, 106, 84, 164, 98, 84, 164, 94, 76, 156, 94, 76, 164, 98, 76,
+ 164, 98, 76, 164, 102, 76, 164, 102, 84, 164, 98, 76, 164, 98, 76,
+ 156, 94, 76, 164, 102, 76, 172, 102, 84, 164, 102, 84, 164, 102, 76,
+ 164, 102, 84, 164, 98, 84, 164, 98, 76, 164, 98, 84, 164, 98, 84,
+ 164, 98, 84, 172, 102, 84, 164, 102, 84, 172, 106, 84, 164, 102, 84,
+ 164, 98, 76, 164, 98, 76, 172, 102, 84, 164, 90, 68, 164, 90, 76,
+ 164, 94, 76, 164, 102, 92, 172, 114, 100, 140, 82, 68, 116, 58, 44,
+ 116, 62, 52, 148, 86, 68, 164, 98, 76, 164, 102, 84, 164, 98, 76,
+ 156, 94, 76, 164, 98, 76, 164, 102, 84, 172, 102, 84, 164, 102, 84,
+ 164, 102, 76, 164, 102, 84, 164, 98, 84, 164, 98, 76, 164, 102, 84,
+ 164, 98, 76, 164, 98, 76, 172, 102, 84, 172, 102, 84, 172, 106, 84,
+ 180, 110, 84, 172, 110, 92, 180, 110, 84, 172, 106, 92, 172, 106, 84,
+ 164, 90, 76, 172, 106, 84, 180, 110, 92, 172, 98, 84, 164, 98, 76,
+ 172, 106, 84, 180, 110, 92, 180, 114, 92, 180, 110, 92, 180, 110, 84,
+ 188, 114, 92, 188, 118, 100, 188, 114, 92, 180, 110, 84, 172, 106, 84,
+ 172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 110, 84, 180, 114, 92,
+ 180, 110, 84, 180, 114, 92, 180, 106, 84, 172, 110, 84, 180, 106, 84,
+ 172, 106, 84, 180, 110, 84, 172, 110, 84, 180, 110, 84, 172, 110, 84,
+ 172, 102, 76, 172, 102, 76, 172, 102, 76, 172, 102, 84, 172, 110, 92,
+ 180, 110, 84, 172, 106, 84, 172, 102, 84, 172, 110, 84, 180, 110, 84,
+ 180, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84, 180, 110, 84,
+ 180, 110, 92, 180, 114, 92, 180, 114, 92, 172, 106, 84, 172, 102, 84,
+ 172, 102, 76, 172, 106, 84, 180, 106, 84, 180, 114, 92, 180, 114, 92,
+ 180, 114, 92, 180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 114, 84,
+ 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 76, 172, 102, 84,
+ 172, 102, 76, 164, 98, 76, 164, 98, 76, 172, 102, 76, 172, 106, 84,
+ 172, 102, 84, 172, 102, 76, 172, 106, 84, 172, 102, 76, 156, 90, 68,
+ 164, 94, 68, 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 98, 76,
+ 164, 98, 76, 164, 98, 76, 172, 102, 76, 172, 102, 76, 172, 102, 84,
+ 164, 102, 76, 172, 102, 76, 164, 98, 76, 172, 102, 76, 180, 106, 84,
+ 172, 106, 84, 164, 102, 76, 172, 102, 76, 172, 110, 92, 180, 110, 84,
+ 172, 110, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 172, 106, 84, 180, 114, 84, 172, 106, 84, 180, 106, 84,
+ 172, 106, 84, 164, 94, 68, 164, 98, 76, 180, 110, 84, 180, 114, 92,
+ 164, 98, 84, 156, 98, 76, 164, 98, 76, 172, 106, 84, 172, 110, 92,
+ 172, 106, 84, 164, 102, 76, 164, 102, 84, 156, 90, 68, 156, 90, 68,
+ 156, 94, 76, 164, 102, 76, 164, 98, 76, 156, 94, 76, 164, 98, 76,
+ 164, 102, 84, 164, 98, 76, 164, 98, 76, 164, 98, 84, 172, 98, 76,
+ 164, 98, 84, 172, 98, 76, 172, 102, 84, 172, 106, 92, 164, 98, 76,
+ 164, 94, 76, 164, 98, 76, 164, 98, 84, 172, 106, 84, 172, 102, 84,
+ 164, 98, 76, 156, 90, 68, 164, 98, 76, 164, 98, 76, 164, 98, 84,
+ 164, 98, 76, 164, 98, 84, 164, 102, 76, 164, 98, 84, 164, 102, 76,
+ 172, 102, 84, 164, 102, 84, 164, 98, 76, 164, 98, 84, 164, 98, 76,
+ 164, 98, 76, 164, 102, 76, 164, 98, 76, 164, 98, 84, 172, 98, 84,
+ 164, 102, 84, 164, 102, 84, 164, 102, 84, 164, 106, 84, 172, 102, 84,
+ 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 92, 164, 98, 84,
+ 164, 102, 92, 156, 98, 84, 132, 74, 60, 116, 62, 52, 116, 58, 44,
+ 148, 86, 68, 164, 94, 76, 164, 102, 84, 164, 102, 76, 164, 98, 76,
+ 164, 98, 76, 164, 102, 84, 164, 98, 76, 172, 106, 84, 172, 106, 84,
+ 172, 106, 92, 172, 110, 84, 172, 110, 92, 180, 110, 92, 180, 114, 92,
+ 180, 114, 92, 164, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 92,
+ 180, 110, 92, 180, 110, 92, 172, 106, 84, 172, 102, 84, 164, 98, 84,
+ 180, 114, 92, 188, 122, 100, 180, 114, 92, 172, 102, 84, 180, 106, 92,
+ 188, 118, 100, 188, 122, 100, 172, 102, 84, 172, 106, 84, 180, 106, 84,
+ 180, 110, 84, 180, 110, 84, 180, 106, 92, 172, 102, 76, 172, 102, 84,
+ 180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 110, 84, 180, 114, 92,
+ 180, 114, 92, 180, 110, 84, 172, 106, 84, 172, 102, 76, 164, 98, 76,
+ 172, 102, 84, 172, 106, 84, 180, 110, 92, 180, 114, 92, 172, 102, 84,
+ 172, 102, 84, 172, 106, 84, 172, 106, 84, 180, 106, 84, 172, 106, 84,
+ 172, 102, 76, 164, 98, 76, 172, 102, 76, 172, 102, 84, 172, 106, 84,
+ 180, 110, 92, 180, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84,
+ 180, 110, 84, 180, 114, 92, 180, 114, 92, 188, 114, 92, 180, 114, 92,
+ 180, 110, 92, 172, 110, 84, 172, 106, 84, 180, 114, 92, 180, 110, 92,
+ 180, 110, 84, 172, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84,
+ 172, 102, 76, 172, 102, 84, 172, 102, 84, 172, 106, 76, 164, 98, 76,
+ 164, 98, 76, 172, 98, 76, 172, 102, 84, 172, 106, 84, 172, 106, 76,
+ 164, 98, 76, 172, 106, 84, 172, 102, 84, 164, 94, 68, 164, 94, 76,
+ 172, 102, 76, 172, 102, 76, 164, 102, 84, 172, 102, 76, 164, 98, 76,
+ 172, 102, 76, 172, 102, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84,
+ 164, 102, 76, 172, 98, 76, 164, 102, 76, 172, 106, 84, 172, 102, 76,
+ 172, 102, 76, 172, 102, 84, 180, 110, 84, 180, 110, 84, 172, 102, 84,
+ 172, 102, 76, 172, 106, 84, 172, 106, 76, 172, 102, 76, 172, 102, 84,
+ 172, 106, 84, 180, 110, 84, 172, 106, 84, 180, 110, 84, 172, 102, 84,
+ 156, 90, 68, 164, 94, 68, 172, 110, 84, 180, 114, 92, 172, 102, 76,
+ 164, 94, 76, 164, 98, 76, 164, 102, 84, 172, 106, 84, 164, 102, 84,
+ 164, 98, 76, 164, 98, 84, 156, 94, 76, 164, 98, 76, 164, 98, 84,
+ 164, 102, 84, 164, 98, 76, 164, 98, 84, 164, 102, 76, 164, 102, 84,
+ 164, 94, 76, 164, 94, 76, 164, 98, 76, 164, 98, 84, 164, 98, 76,
+ 164, 98, 76, 172, 102, 84, 172, 106, 84, 164, 98, 76, 164, 98, 76,
+ 164, 94, 76, 164, 98, 76, 172, 102, 84, 172, 102, 84, 164, 94, 76,
+ 156, 90, 68, 164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 164, 98, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84,
+ 164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 84,
+ 164, 98, 76, 164, 98, 84, 172, 102, 84, 164, 102, 84, 172, 102, 84,
+ 164, 98, 84, 164, 102, 76, 164, 98, 76, 164, 102, 76, 164, 98, 76,
+ 172, 98, 84, 164, 98, 76, 172, 98, 84, 164, 94, 76, 164, 98, 84,
+ 156, 98, 84, 124, 70, 60, 116, 58, 44, 116, 62, 44, 164, 98, 76,
+ 164, 102, 84, 172, 106, 84, 164, 98, 84, 164, 102, 84, 172, 102, 84,
+ 172, 106, 84, 164, 102, 84, 164, 98, 84, 164, 98, 76, 164, 102, 84,
+ 172, 102, 84, 172, 106, 84, 172, 110, 84, 172, 110, 92, 180, 110, 92,
+ 172, 110, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 114, 92,
+ 180, 114, 92, 180, 106, 92, 164, 102, 84, 180, 106, 84, 180, 114, 100,
+ 188, 118, 100, 188, 118, 100, 180, 114, 92, 180, 110, 92, 180, 118, 100,
+ 188, 118, 100, 188, 114, 92, 188, 118, 100, 188, 118, 92, 188, 118, 100,
+ 188, 114, 92, 188, 122, 100, 172, 106, 84, 172, 106, 84, 180, 110, 84,
+ 172, 110, 92, 180, 110, 84, 172, 106, 84, 172, 110, 84, 180, 110, 84,
+ 180, 114, 92, 172, 106, 84, 172, 102, 84, 172, 102, 76, 172, 106, 84,
+ 180, 110, 84, 180, 114, 92, 180, 114, 92, 180, 110, 84, 172, 110, 84,
+ 172, 106, 84, 180, 110, 84, 180, 114, 92, 180, 110, 84, 172, 106, 84,
+ 172, 102, 76, 172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 114, 92,
+ 180, 114, 92, 180, 114, 92, 180, 106, 84, 172, 106, 84, 172, 106, 84,
+ 180, 110, 84, 180, 114, 92, 188, 118, 92, 188, 118, 92, 180, 114, 92,
+ 180, 110, 84, 172, 106, 84, 180, 106, 84, 172, 106, 84, 180, 106, 84,
+ 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 76, 172, 106, 84,
+ 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84,
+ 172, 102, 76, 172, 106, 84, 180, 110, 84, 180, 106, 84, 172, 102, 76,
+ 172, 106, 84, 172, 106, 84, 164, 98, 76, 164, 98, 76, 172, 102, 84,
+ 164, 98, 76, 172, 106, 76, 172, 102, 84, 164, 98, 76, 172, 102, 76,
+ 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84,
+ 172, 102, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 98, 76,
+ 164, 102, 84, 180, 110, 84, 172, 110, 84, 172, 102, 84, 172, 102, 76,
+ 172, 106, 84, 172, 106, 84, 172, 98, 76, 172, 102, 76, 172, 106, 84,
+ 172, 106, 84, 172, 102, 84, 180, 110, 84, 172, 106, 84, 156, 94, 68,
+ 164, 90, 68, 172, 106, 84, 180, 110, 84, 164, 102, 84, 164, 98, 76,
+ 164, 98, 76, 164, 102, 84, 172, 106, 84, 164, 98, 84, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 172, 106, 84, 172, 106, 84, 164, 98, 76,
+ 164, 94, 76, 164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 98, 76,
+ 164, 98, 84, 172, 102, 84, 172, 98, 76, 164, 98, 76, 164, 94, 76,
+ 164, 98, 76, 172, 102, 84, 164, 98, 84, 164, 94, 76, 164, 94, 76,
+ 164, 94, 76, 164, 98, 84, 164, 98, 76, 164, 94, 76, 156, 86, 68,
+ 164, 94, 76, 156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 102, 84,
+ 172, 102, 76, 164, 102, 84, 164, 102, 76, 172, 102, 84, 164, 102, 76,
+ 164, 102, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 84,
+ 164, 102, 76, 164, 102, 84, 172, 98, 84, 164, 102, 84, 164, 98, 76,
+ 164, 102, 84, 156, 98, 76, 164, 98, 76, 164, 94, 76, 164, 98, 76,
+ 172, 98, 84, 172, 98, 84, 164, 90, 76, 172, 106, 92, 164, 106, 92,
+ 132, 70, 60, 116, 62, 44, 116, 58, 44, 164, 98, 84, 164, 98, 76,
+ 164, 98, 76, 156, 90, 68, 156, 90, 68, 164, 98, 76, 164, 102, 84,
+ 164, 98, 76, 172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 92, 172, 106, 84, 172, 110, 92, 172, 106, 84, 180, 110, 92,
+ 172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 114, 100, 180, 110, 92,
+ 172, 106, 84, 164, 98, 76, 180, 110, 92, 180, 110, 92, 180, 114, 92,
+ 188, 118, 100, 188, 118, 100, 180, 114, 92, 180, 110, 92, 180, 110, 92,
+ 180, 114, 92, 188, 118, 92, 188, 118, 100, 180, 110, 84, 180, 110, 92,
+ 188, 118, 92, 172, 106, 84, 180, 110, 84, 180, 114, 92, 180, 110, 92,
+ 180, 110, 84, 172, 106, 84, 172, 106, 84, 180, 106, 84, 180, 110, 92,
+ 172, 106, 84, 180, 110, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92,
+ 180, 110, 92, 180, 106, 84, 172, 110, 84, 180, 106, 84, 180, 110, 92,
+ 180, 110, 84, 180, 118, 100, 188, 114, 92, 180, 114, 92, 180, 110, 92,
+ 188, 122, 100, 188, 118, 92, 180, 114, 100, 180, 114, 84, 180, 110, 92,
+ 180, 110, 84, 180, 110, 92, 180, 110, 84, 172, 106, 84, 172, 110, 84,
+ 180, 110, 84, 180, 110, 92, 180, 110, 84, 180, 110, 92, 180, 110, 84,
+ 180, 110, 92, 164, 98, 76, 172, 102, 76, 172, 106, 84, 172, 102, 76,
+ 172, 102, 76, 172, 102, 76, 172, 106, 84, 180, 106, 84, 180, 110, 84,
+ 180, 110, 84, 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 172, 110, 84, 180, 114, 92, 180, 110, 92, 172, 106, 84, 180, 106, 84,
+ 180, 110, 84, 172, 102, 76, 172, 102, 76, 172, 102, 76, 164, 94, 76,
+ 172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84,
+ 180, 110, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 180, 110, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84,
+ 180, 110, 84, 180, 110, 92, 172, 106, 76, 172, 102, 84, 172, 106, 84,
+ 172, 106, 84, 172, 102, 76, 164, 102, 76, 180, 106, 84, 164, 98, 76,
+ 164, 102, 76, 180, 110, 84, 172, 110, 84, 164, 94, 76, 156, 94, 68,
+ 172, 102, 84, 172, 106, 84, 172, 106, 92, 164, 102, 84, 164, 98, 76,
+ 164, 102, 84, 172, 102, 84, 164, 98, 76, 164, 98, 84, 164, 102, 84,
+ 156, 90, 68, 164, 102, 84, 164, 102, 84, 156, 86, 68, 148, 86, 68,
+ 172, 102, 84, 172, 110, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84,
+ 172, 102, 84, 164, 98, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76,
+ 164, 98, 76, 172, 98, 84, 164, 98, 76, 156, 90, 76, 164, 94, 76,
+ 172, 98, 76, 164, 98, 84, 164, 94, 76, 156, 90, 68, 148, 90, 68,
+ 156, 94, 76, 164, 94, 76, 164, 102, 84, 164, 102, 84, 164, 102, 84,
+ 164, 98, 76, 164, 98, 84, 172, 106, 84, 164, 102, 84, 172, 102, 84,
+ 164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 102, 76, 164, 98, 84,
+ 164, 94, 76, 164, 94, 76, 164, 98, 84, 164, 102, 84, 164, 102, 84,
+ 164, 98, 76, 164, 94, 76, 156, 94, 76, 164, 98, 76, 164, 94, 84,
+ 164, 98, 84, 156, 94, 76, 164, 106, 92, 164, 102, 92, 124, 66, 52,
+ 116, 58, 44, 116, 58, 36, 164, 106, 92, 172, 106, 84, 164, 106, 84,
+ 172, 102, 84, 164, 102, 84, 164, 102, 84, 164, 102, 76, 164, 98, 84,
+ 172, 106, 84, 172, 106, 84, 172, 110, 92, 172, 110, 84, 172, 106, 92,
+ 172, 106, 84, 172, 110, 92, 180, 114, 92, 180, 110, 92, 180, 110, 92,
+ 172, 110, 92, 180, 110, 92, 188, 118, 92, 188, 118, 100, 180, 114, 100,
+ 180, 114, 92, 180, 114, 92, 180, 114, 92, 188, 118, 100, 180, 114, 100,
+ 180, 114, 92, 180, 114, 92, 180, 110, 92, 172, 106, 84, 188, 118, 100,
+ 188, 118, 92, 188, 118, 100, 188, 118, 92, 188, 118, 92, 180, 114, 92,
+ 180, 106, 92, 180, 114, 92, 188, 118, 100, 180, 114, 100, 180, 110, 92,
+ 172, 106, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 110, 92,
+ 172, 106, 84, 172, 106, 84, 180, 114, 92, 188, 122, 100, 188, 118, 100,
+ 180, 118, 92, 188, 114, 100, 180, 118, 92, 188, 118, 100, 188, 118, 100,
+ 188, 118, 100, 180, 114, 92, 180, 118, 92, 188, 118, 100, 188, 122, 100,
+ 188, 118, 100, 180, 114, 92, 188, 114, 92, 180, 114, 100, 180, 114, 92,
+ 180, 110, 92, 172, 106, 84, 188, 118, 92, 180, 114, 92, 172, 110, 84,
+ 172, 110, 84, 172, 110, 84, 172, 110, 84, 180, 110, 84, 172, 106, 84,
+ 172, 110, 84, 172, 106, 84, 180, 106, 84, 172, 106, 84, 180, 106, 84,
+ 172, 102, 84, 180, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 180, 110, 84, 180, 114, 84, 180, 110, 92, 180, 110, 84, 180, 110, 92,
+ 180, 110, 84, 172, 106, 84, 172, 106, 76, 172, 102, 84, 164, 102, 76,
+ 164, 102, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 102, 76,
+ 172, 102, 84, 172, 106, 84, 180, 110, 84, 180, 110, 92, 172, 106, 84,
+ 172, 106, 84, 172, 102, 84, 180, 106, 84, 172, 106, 84, 180, 106, 92,
+ 172, 106, 84, 180, 106, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 172, 110, 84, 180, 110, 84, 172, 110, 84, 172, 98, 76,
+ 164, 102, 76, 172, 110, 84, 180, 118, 92, 172, 106, 84, 172, 110, 84,
+ 172, 102, 84, 172, 102, 76, 164, 102, 76, 164, 98, 76, 164, 98, 76,
+ 164, 98, 68, 164, 102, 84, 164, 102, 76, 164, 98, 84, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 164, 102, 76, 164, 102, 84, 164, 98, 76,
+ 164, 98, 76, 156, 98, 76, 164, 94, 76, 156, 94, 76, 164, 98, 76,
+ 164, 98, 84, 164, 106, 84, 164, 98, 76, 164, 98, 76, 156, 94, 76,
+ 156, 94, 76, 164, 94, 76, 164, 98, 76, 172, 102, 84, 164, 102, 84,
+ 164, 94, 76, 156, 98, 76, 164, 94, 76, 164, 98, 76, 164, 98, 76,
+ 164, 102, 76, 164, 94, 76, 156, 94, 76, 148, 86, 68, 164, 94, 76,
+ 164, 102, 84, 164, 102, 76, 164, 94, 76, 156, 94, 76, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 84,
+ 164, 94, 84, 164, 90, 76, 164, 94, 76, 164, 98, 84, 164, 98, 84,
+ 164, 94, 76, 164, 94, 76, 172, 102, 84, 164, 98, 76, 172, 98, 84,
+ 164, 98, 84, 172, 110, 92, 164, 102, 84, 124, 66, 52, 116, 58, 36,
+ 108, 46, 28, 180, 110, 92, 180, 110, 92, 172, 110, 92, 172, 110, 84,
+ 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92,
+ 172, 110, 92, 180, 110, 92, 172, 110, 92, 172, 110, 84, 172, 110, 92,
+ 180, 114, 92, 180, 118, 100, 180, 110, 92, 172, 106, 84, 180, 110, 92,
+ 180, 110, 92, 180, 114, 100, 188, 118, 100, 180, 114, 92, 180, 114, 92,
+ 180, 114, 100, 180, 114, 92, 180, 114, 100, 180, 114, 92, 180, 110, 92,
+ 180, 110, 92, 172, 106, 92, 180, 106, 84, 180, 114, 92, 180, 110, 92,
+ 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 110, 92,
+ 180, 110, 92, 188, 118, 100, 180, 114, 92, 180, 110, 92, 172, 106, 84,
+ 180, 106, 92, 180, 110, 92, 180, 114, 92, 172, 106, 92, 172, 106, 84,
+ 180, 106, 92, 180, 114, 92, 188, 118, 100, 188, 118, 100, 180, 114, 92,
+ 180, 110, 92, 180, 114, 100, 188, 118, 100, 188, 118, 100, 180, 118, 100,
+ 188, 118, 100, 188, 118, 100, 188, 118, 100, 196, 126, 108, 188, 122, 100,
+ 188, 118, 100, 188, 118, 100, 188, 122, 100, 188, 118, 100, 180, 118, 100,
+ 180, 114, 92, 188, 118, 100, 180, 118, 92, 180, 110, 84, 180, 110, 92,
+ 180, 114, 84, 180, 114, 92, 180, 110, 92, 180, 110, 84, 180, 110, 92,
+ 180, 110, 84, 180, 110, 92, 180, 110, 92, 188, 114, 84, 180, 110, 92,
+ 180, 110, 84, 188, 114, 92, 188, 114, 92, 180, 118, 92, 188, 118, 100,
+ 188, 118, 92, 188, 122, 100, 188, 118, 92, 188, 118, 100, 180, 118, 92,
+ 180, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 76, 172, 102, 84,
+ 172, 102, 76, 172, 106, 84, 172, 106, 84, 172, 102, 84, 164, 102, 84,
+ 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 84,
+ 164, 98, 84, 172, 106, 84, 172, 110, 92, 172, 106, 84, 180, 110, 92,
+ 172, 106, 84, 172, 110, 92, 180, 106, 92, 172, 110, 92, 180, 110, 84,
+ 172, 114, 92, 180, 114, 92, 172, 110, 84, 172, 106, 84, 172, 106, 84,
+ 180, 114, 84, 180, 118, 92, 180, 110, 84, 172, 110, 84, 172, 110, 84,
+ 172, 106, 84, 164, 102, 76, 172, 102, 76, 164, 102, 76, 164, 102, 84,
+ 172, 102, 76, 164, 102, 84, 164, 98, 76, 164, 98, 84, 164, 98, 76,
+ 164, 102, 84, 164, 102, 84, 172, 98, 76, 164, 98, 84, 164, 98, 76,
+ 164, 94, 76, 156, 94, 68, 164, 94, 76, 164, 98, 76, 164, 98, 76,
+ 164, 102, 84, 172, 102, 84, 164, 102, 84, 164, 98, 76, 164, 98, 76,
+ 156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 102, 76, 164, 98, 76,
+ 164, 98, 76, 156, 94, 76, 164, 98, 76, 164, 102, 84, 164, 98, 84,
+ 164, 98, 76, 164, 94, 76, 156, 94, 68, 164, 102, 84, 172, 106, 84,
+ 172, 110, 92, 172, 102, 84, 164, 102, 76, 172, 102, 84, 164, 106, 84,
+ 164, 98, 84, 164, 98, 76, 164, 98, 84, 156, 98, 76, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 164, 98, 84, 164, 98, 84, 164, 94, 76,
+ 164, 94, 76, 164, 94, 76, 164, 98, 84, 164, 98, 84, 164, 98, 84,
+ 164, 94, 76, 156, 94, 84, 156, 94, 76, 156, 94, 76, 156, 90, 76,
+ 164, 98, 84, 156, 90, 76, 116, 54, 36, 108, 46, 28, 116, 54, 36,
+ 172, 110, 92, 172, 110, 92, 180, 110, 92, 172, 110, 92, 172, 106, 84,
+ 172, 106, 92, 164, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 172, 110, 84, 172, 106, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84, 180, 110, 92,
+ 180, 114, 92, 180, 114, 92, 188, 114, 100, 180, 114, 92, 180, 110, 92,
+ 180, 110, 92, 180, 110, 92, 180, 110, 92, 172, 106, 84, 180, 106, 92,
+ 172, 110, 84, 172, 106, 92, 180, 110, 84, 180, 110, 92, 180, 110, 92,
+ 180, 110, 84, 180, 110, 92, 180, 106, 84, 180, 106, 84, 180, 114, 92,
+ 180, 114, 100, 180, 114, 92, 172, 106, 92, 172, 106, 84, 172, 106, 84,
+ 172, 106, 92, 180, 110, 92, 172, 106, 84, 172, 102, 84, 172, 106, 84,
+ 180, 114, 92, 180, 114, 100, 180, 114, 92, 180, 114, 92, 180, 110, 92,
+ 180, 114, 92, 188, 122, 100, 188, 118, 100, 188, 118, 100, 180, 114, 92,
+ 180, 114, 92, 180, 114, 92, 180, 110, 92, 172, 106, 92, 172, 106, 84,
+ 172, 106, 84, 172, 106, 92, 172, 106, 84, 180, 110, 92, 172, 110, 84,
+ 180, 114, 92, 180, 114, 92, 172, 110, 84, 172, 110, 84, 172, 110, 84,
+ 180, 110, 92, 180, 114, 84, 172, 110, 84, 172, 102, 84, 172, 106, 76,
+ 172, 106, 84, 180, 106, 84, 172, 106, 84, 180, 106, 84, 180, 106, 84,
+ 172, 106, 84, 180, 106, 84, 180, 110, 84, 172, 110, 92, 180, 110, 84,
+ 180, 110, 92, 172, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84,
+ 172, 106, 84, 164, 102, 84, 172, 102, 76, 164, 102, 76, 172, 102, 84,
+ 172, 106, 76, 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 106, 84,
+ 180, 106, 84, 172, 106, 92, 172, 106, 84, 172, 102, 84, 172, 102, 84,
+ 172, 102, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 106, 92,
+ 180, 106, 84, 172, 106, 92, 172, 110, 84, 180, 110, 92, 180, 110, 92,
+ 172, 114, 92, 180, 110, 84, 172, 114, 92, 180, 110, 84, 172, 114, 92,
+ 180, 110, 92, 172, 114, 92, 180, 110, 92, 172, 106, 84, 172, 106, 84,
+ 164, 106, 84, 172, 106, 84, 164, 102, 84, 172, 106, 84, 164, 98, 76,
+ 164, 98, 76, 164, 98, 84, 164, 102, 76, 164, 102, 84, 164, 98, 76,
+ 164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 156, 94, 76,
+ 156, 90, 76, 156, 94, 68, 156, 94, 76, 156, 94, 76, 164, 98, 76,
+ 164, 102, 84, 164, 102, 76, 164, 98, 76, 156, 94, 76, 156, 94, 76,
+ 156, 94, 68, 156, 90, 76, 156, 94, 76, 164, 98, 76, 164, 98, 76,
+ 156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+ 156, 94, 76, 156, 86, 68, 156, 94, 68, 164, 98, 76, 164, 98, 76,
+ 156, 94, 76, 156, 90, 68, 156, 94, 76, 164, 94, 76, 156, 98, 76,
+ 164, 94, 76, 156, 98, 76, 164, 94, 76, 164, 98, 76, 156, 94, 76,
+ 164, 98, 76, 156, 94, 76, 164, 94, 76, 156, 90, 76, 156, 90, 76,
+ 156, 90, 76, 156, 94, 76, 164, 94, 76, 156, 90, 76, 156, 94, 76,
+ 164, 98, 84, 164, 94, 76, 164, 98, 84, 156, 94, 76, 164, 102, 84,
+ 156, 94, 76, 116, 58, 36, 116, 54, 36, 116, 58, 36, 180, 114, 100,
+ 180, 118, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92,
+ 180, 110, 92, 172, 110, 92, 180, 114, 92, 180, 114, 100, 180, 114, 92,
+ 180, 114, 92, 172, 110, 92, 172, 110, 92, 180, 114, 92, 180, 118, 100,
+ 180, 114, 92, 180, 114, 100, 188, 118, 100, 188, 118, 100, 188, 122, 100,
+ 196, 126, 108, 188, 122, 108, 196, 126, 100, 188, 122, 108, 188, 122, 100,
+ 188, 118, 100, 180, 118, 100, 188, 114, 100, 180, 118, 100, 188, 118, 100,
+ 188, 118, 100, 196, 126, 108, 188, 126, 100, 196, 126, 108, 188, 122, 100,
+ 180, 114, 100, 180, 114, 92, 188, 122, 100, 196, 122, 108, 196, 126, 108,
+ 196, 126, 100, 188, 118, 100, 180, 114, 100, 188, 114, 92, 180, 118, 100,
+ 188, 122, 100, 188, 118, 100, 188, 114, 100, 188, 118, 100, 188, 122, 100,
+ 196, 122, 108, 188, 126, 108, 188, 122, 100, 196, 126, 108, 196, 130, 108,
+ 196, 130, 116, 196, 130, 108, 196, 126, 108, 188, 118, 100, 180, 114, 100,
+ 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 84,
+ 172, 106, 84, 180, 106, 92, 180, 114, 92, 180, 114, 92, 180, 118, 92,
+ 180, 118, 92, 180, 118, 92, 180, 118, 92, 188, 118, 92, 180, 118, 92,
+ 180, 118, 92, 188, 118, 100, 180, 114, 84, 180, 110, 92, 188, 114, 92,
+ 180, 110, 92, 188, 114, 92, 188, 118, 92, 188, 118, 100, 188, 118, 92,
+ 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 110, 84,
+ 180, 110, 92, 180, 110, 84, 180, 110, 84, 188, 118, 92, 180, 114, 92,
+ 180, 114, 92, 180, 110, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92,
+ 188, 118, 92, 188, 118, 100, 188, 122, 100, 188, 122, 100, 188, 122, 108,
+ 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 100, 180, 114, 92,
+ 180, 114, 92, 180, 114, 100, 188, 114, 92, 180, 118, 100, 188, 118, 100,
+ 188, 118, 100, 188, 118, 100, 188, 122, 100, 180, 122, 100, 188, 118, 100,
+ 188, 122, 100, 188, 122, 100, 188, 126, 108, 188, 122, 100, 180, 118, 92,
+ 172, 106, 84, 172, 110, 84, 172, 106, 84, 164, 102, 84, 172, 102, 76,
+ 164, 102, 76, 164, 102, 84, 172, 102, 76, 156, 94, 76, 164, 98, 76,
+ 164, 98, 76, 164, 102, 84, 164, 98, 76, 164, 102, 76, 164, 98, 76,
+ 156, 98, 76, 164, 98, 84, 164, 98, 76, 156, 94, 76, 164, 94, 68,
+ 156, 94, 76, 156, 94, 68, 164, 94, 76, 156, 94, 76, 164, 98, 76,
+ 164, 98, 84, 164, 98, 76, 156, 94, 76, 156, 90, 68, 156, 94, 76,
+ 156, 90, 68, 156, 94, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76,
+ 156, 98, 76, 164, 98, 76, 164, 98, 84, 156, 98, 76, 156, 94, 68,
+ 164, 94, 76, 164, 98, 76, 164, 102, 84, 164, 102, 84, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 164, 98, 76, 156, 94, 76, 156, 94, 68,
+ 156, 94, 76, 156, 94, 76, 156, 94, 76, 156, 94, 76, 156, 94, 68,
+ 156, 94, 76, 172, 98, 84, 164, 98, 84, 172, 98, 76, 164, 94, 84,
+ 172, 98, 84, 164, 98, 84, 164, 98, 84, 172, 98, 84, 164, 98, 84,
+ 164, 98, 84, 164, 106, 84, 164, 102, 84, 172, 110, 92, 164, 98, 84,
+ 124, 66, 44, 116, 58, 36, 116, 50, 36, 172, 106, 84, 164, 102, 84,
+ 172, 102, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84, 164, 102, 84,
+ 172, 102, 84, 164, 102, 84, 172, 106, 84, 164, 106, 84, 172, 102, 84,
+ 164, 102, 76, 172, 102, 84, 164, 102, 84, 172, 106, 84, 172, 102, 84,
+ 180, 106, 84, 172, 110, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92,
+ 180, 114, 92, 180, 114, 100, 180, 114, 92, 180, 110, 92, 180, 110, 92,
+ 172, 106, 84, 180, 110, 84, 172, 106, 84, 180, 110, 92, 180, 110, 92,
+ 180, 118, 92, 180, 114, 100, 180, 110, 92, 180, 110, 92, 180, 106, 92,
+ 172, 102, 84, 180, 114, 92, 180, 114, 92, 180, 114, 100, 180, 114, 92,
+ 180, 110, 92, 180, 106, 92, 172, 106, 84, 172, 106, 84, 180, 106, 92,
+ 172, 110, 92, 172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 114, 92,
+ 180, 110, 92, 180, 110, 92, 180, 110, 92, 188, 114, 100, 188, 122, 100,
+ 188, 118, 100, 180, 110, 92, 172, 106, 84, 172, 102, 84, 164, 98, 76,
+ 172, 102, 84, 172, 102, 84, 164, 102, 84, 172, 98, 76, 164, 98, 84,
+ 172, 106, 84, 180, 106, 92, 180, 110, 92, 172, 106, 92, 172, 110, 84,
+ 172, 106, 84, 172, 110, 92, 172, 106, 84, 172, 110, 92, 180, 106, 84,
+ 172, 110, 92, 180, 110, 84, 172, 110, 92, 180, 110, 84, 180, 110, 92,
+ 180, 114, 92, 180, 114, 92, 188, 114, 92, 188, 114, 92, 180, 110, 92,
+ 180, 110, 92, 180, 110, 92, 180, 110, 84, 180, 110, 92, 172, 110, 84,
+ 172, 106, 84, 172, 106, 92, 172, 106, 84, 180, 106, 84, 172, 106, 84,
+ 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+ 180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 114, 100,
+ 180, 114, 92, 180, 110, 92, 180, 110, 92, 172, 102, 84, 172, 102, 84,
+ 172, 106, 84, 172, 106, 84, 172, 106, 92, 180, 110, 84, 172, 110, 92,
+ 180, 110, 92, 172, 106, 92, 172, 106, 84, 172, 106, 84, 172, 110, 92,
+ 180, 114, 92, 180, 110, 92, 172, 110, 92, 172, 102, 84, 172, 106, 92,
+ 164, 102, 84, 172, 102, 84, 164, 102, 84, 164, 98, 84, 164, 102, 76,
+ 164, 98, 84, 164, 102, 84, 164, 98, 76, 164, 98, 76, 164, 98, 84,
+ 172, 102, 76, 164, 102, 84, 164, 98, 84, 164, 98, 84, 164, 98, 76,
+ 172, 102, 76, 164, 102, 84, 164, 102, 76, 164, 98, 84, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 164, 94, 76, 164, 98, 76, 164, 94, 76, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+ 164, 102, 84, 164, 102, 84, 164, 98, 76, 156, 94, 76, 164, 98, 76,
+ 164, 98, 84, 172, 102, 84, 164, 102, 76, 164, 98, 84, 164, 98, 76,
+ 164, 98, 84, 164, 98, 76, 164, 94, 76, 164, 94, 76, 164, 94, 76,
+ 156, 94, 76, 164, 94, 68, 164, 94, 76, 164, 94, 76, 156, 94, 76,
+ 164, 94, 76, 164, 90, 76, 156, 94, 76, 164, 94, 76, 164, 94, 76,
+ 156, 94, 76, 164, 94, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76,
+ 164, 102, 84, 164, 102, 84, 172, 106, 92, 156, 94, 76, 124, 62, 44,
+ 116, 50, 36, 108, 50, 28, 156, 86, 68, 156, 90, 68, 148, 86, 68,
+ 156, 90, 68, 148, 86, 68, 156, 90, 68, 156, 86, 68, 148, 90, 68,
+ 156, 90, 68, 156, 90, 76, 156, 94, 76, 156, 90, 68, 148, 86, 68,
+ 156, 86, 68, 156, 90, 68, 156, 90, 76, 148, 86, 68, 156, 86, 68,
+ 156, 90, 68, 164, 90, 76, 156, 90, 68, 156, 90, 76, 164, 90, 68,
+ 156, 90, 76, 164, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 68,
+ 156, 90, 76, 156, 90, 68, 156, 90, 68, 156, 90, 68, 156, 86, 76,
+ 156, 86, 68, 156, 90, 76, 156, 90, 68, 156, 90, 76, 156, 90, 68,
+ 164, 90, 76, 164, 94, 76, 164, 94, 76, 156, 94, 76, 156, 90, 68,
+ 156, 90, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68,
+ 156, 90, 68, 156, 90, 68, 156, 90, 76, 164, 90, 68, 156, 90, 76,
+ 156, 90, 68, 148, 86, 68, 156, 86, 68, 164, 94, 76, 164, 94, 76,
+ 156, 90, 68, 156, 90, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68,
+ 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68,
+ 156, 90, 68, 164, 94, 76, 156, 90, 68, 156, 94, 76, 164, 98, 76,
+ 164, 94, 76, 156, 94, 68, 156, 90, 68, 156, 94, 68, 164, 94, 68,
+ 156, 86, 68, 156, 86, 68, 156, 90, 68, 156, 90, 68, 164, 90, 68,
+ 164, 90, 76, 164, 90, 68, 164, 90, 76, 164, 94, 76, 156, 94, 68,
+ 164, 94, 68, 156, 90, 68, 156, 90, 68, 164, 90, 68, 164, 94, 76,
+ 156, 90, 68, 156, 90, 68, 156, 90, 68, 156, 90, 68, 164, 90, 68,
+ 156, 90, 68, 156, 90, 68, 164, 90, 68, 156, 90, 68, 156, 90, 76,
+ 156, 90, 68, 156, 90, 76, 164, 90, 68, 156, 90, 68, 156, 90, 76,
+ 156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 76, 156, 86, 68,
+ 164, 90, 76, 156, 90, 68, 164, 90, 76, 156, 94, 68, 164, 94, 76,
+ 156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 76, 156, 94, 76,
+ 156, 94, 76, 156, 90, 76, 148, 86, 68, 164, 98, 84, 164, 98, 76,
+ 164, 98, 76, 156, 94, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76,
+ 156, 94, 76, 164, 94, 76, 156, 98, 76, 164, 98, 76, 164, 98, 76,
+ 164, 94, 76, 164, 98, 76, 156, 94, 76, 156, 94, 76, 164, 98, 76,
+ 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+ 164, 98, 76, 156, 94, 76, 156, 94, 76, 156, 90, 68, 156, 94, 76,
+ 156, 94, 76, 164, 94, 76, 156, 98, 76, 164, 98, 76, 164, 98, 84,
+ 156, 94, 76, 156, 94, 76, 156, 94, 76, 164, 94, 76, 164, 98, 76,
+ 164, 98, 76, 164, 94, 76, 156, 90, 76, 156, 90, 68, 156, 90, 68,
+ 156, 94, 76, 156, 90, 68, 156, 90, 68, 156, 90, 68, 148, 90, 68,
+ 156, 90, 68, 156, 90, 76, 156, 94, 68, 156, 90, 68, 156, 94, 76,
+ 156, 90, 68, 156, 94, 76, 156, 90, 68, 156, 94, 68, 156, 82, 68,
+ 156, 86, 76, 156, 90, 76, 156, 86, 76, 148, 86, 68, 156, 86, 68,
+ 156, 86, 76, 156, 90, 68, 156, 94, 76, 164, 94, 84, 164, 98, 84,
+ 156, 94, 76, 156, 98, 76, 148, 86, 68, 116, 54, 36, 108, 50, 28,
+ 108, 50, 36, 140, 78, 60, 140, 78, 60, 148, 78, 60, 140, 78, 60,
+ 140, 78, 60, 140, 78, 60, 140, 78, 60, 140, 78, 60, 148, 82, 60,
+ 148, 82, 60, 148, 82, 60, 148, 78, 60, 140, 74, 52, 140, 74, 52,
+ 140, 78, 60, 148, 82, 60, 140, 70, 52, 140, 74, 52, 148, 74, 60,
+ 140, 78, 60, 148, 74, 60, 140, 74, 52, 140, 74, 52, 140, 78, 60,
+ 140, 74, 52, 148, 78, 60, 140, 74, 60, 148, 78, 60, 148, 74, 60,
+ 148, 78, 60, 148, 74, 60, 148, 78, 60, 140, 70, 52, 140, 70, 52,
+ 148, 74, 60, 140, 74, 60, 148, 78, 60, 148, 78, 68, 140, 78, 60,
+ 148, 78, 60, 140, 78, 60, 148, 78, 60, 148, 78, 60, 148, 74, 60,
+ 140, 74, 52, 140, 74, 52, 140, 74, 52, 140, 74, 52, 140, 74, 52,
+ 148, 74, 60, 148, 78, 60, 140, 78, 60, 148, 74, 60, 140, 74, 52,
+ 140, 70, 52, 140, 74, 52, 140, 78, 60, 148, 78, 60, 148, 78, 60,
+ 148, 78, 60, 148, 78, 60, 148, 82, 60, 140, 74, 52, 140, 74, 52,
+ 140, 78, 60, 140, 74, 52, 140, 74, 52, 140, 74, 52, 140, 74, 52,
+ 140, 78, 60, 140, 82, 60, 148, 82, 60, 148, 86, 68, 148, 86, 60,
+ 140, 82, 60, 148, 78, 60, 140, 78, 60, 140, 78, 60, 140, 70, 52,
+ 140, 70, 52, 140, 74, 52, 140, 70, 52, 140, 74, 52, 140, 70, 52,
+ 140, 74, 52, 140, 74, 52, 140, 78, 60, 148, 74, 60, 140, 74, 52,
+ 140, 74, 60, 140, 74, 52, 140, 74, 60, 140, 78, 60, 148, 78, 60,
+ 156, 82, 60, 148, 82, 68, 156, 82, 60, 148, 82, 68, 148, 82, 60,
+ 156, 82, 68, 148, 82, 60, 148, 82, 68, 148, 82, 60, 148, 82, 60,
+ 148, 82, 60, 148, 82, 68, 148, 78, 60, 156, 82, 60, 148, 82, 68,
+ 148, 82, 60, 156, 82, 60, 148, 82, 60, 156, 82, 68, 148, 82, 60,
+ 156, 86, 68, 148, 82, 60, 156, 82, 68, 148, 82, 60, 148, 82, 68,
+ 148, 82, 68, 148, 82, 68, 148, 86, 68, 148, 82, 68, 156, 86, 68,
+ 148, 82, 68, 148, 82, 60, 148, 82, 68, 140, 78, 60, 148, 78, 68,
+ 140, 78, 60, 148, 78, 60, 140, 78, 60, 148, 78, 60, 140, 78, 60,
+ 148, 82, 60, 148, 78, 60, 140, 78, 60, 140, 78, 60, 140, 78, 60,
+ 140, 78, 60, 148, 78, 60, 148, 82, 60, 140, 78, 60, 148, 78, 60,
+ 140, 78, 60, 148, 78, 60, 140, 78, 60, 140, 78, 60, 148, 78, 60,
+ 148, 82, 60, 140, 74, 52, 140, 78, 60, 148, 78, 60, 140, 78, 60,
+ 148, 82, 60, 148, 82, 60, 148, 82, 60, 148, 82, 60, 148, 78, 60,
+ 148, 78, 60, 140, 78, 60, 140, 78, 60, 148, 82, 60, 148, 82, 60,
+ 148, 78, 60, 140, 78, 60, 148, 86, 60, 148, 82, 68, 148, 82, 60,
+ 148, 82, 60, 140, 78, 60, 148, 82, 60, 148, 78, 60, 148, 78, 60,
+ 140, 78, 60, 140, 78, 60, 140, 78, 60, 140, 78, 60, 140, 78, 60,
+ 140, 78, 60, 148, 78, 60, 140, 78, 60, 148, 82, 68, 148, 82, 68,
+ 148, 86, 68, 156, 82, 68, 148, 82, 68, 148, 82, 68, 148, 82, 68,
+ 148, 86, 68, 148, 82, 68, 148, 78, 60, 140, 82, 60, 140, 74, 60,
+ 140, 78, 60, 140, 74, 60, 116, 50, 36, 108, 50, 36, 108, 50, 28,
+ 108, 42, 28, 108, 42, 20, 108, 42, 20, 108, 42, 20, 116, 46, 28,
+ 108, 42, 20, 116, 46, 28, 108, 42, 20, 108, 46, 28, 108, 46, 28,
+ 116, 46, 28, 108, 46, 20, 108, 42, 20, 100, 42, 20, 108, 42, 20,
+ 108, 42, 28, 108, 42, 20, 116, 46, 28, 116, 46, 28, 116, 46, 28,
+ 108, 42, 20, 108, 38, 20, 108, 42, 28, 116, 42, 28, 108, 42, 20,
+ 116, 46, 28, 116, 46, 28, 116, 46, 28, 116, 50, 28, 108, 46, 28,
+ 116, 46, 28, 108, 42, 20, 108, 42, 28, 116, 42, 28, 108, 46, 28,
+ 116, 46, 28, 116, 46, 28, 108, 46, 28, 116, 42, 28, 108, 42, 20,
+ 116, 46, 28, 108, 42, 20, 116, 46, 28, 108, 46, 28, 108, 42, 20,
+ 116, 42, 28, 108, 38, 20, 108, 42, 28, 116, 46, 28, 108, 46, 28,
+ 116, 46, 28, 108, 42, 20, 108, 42, 20, 116, 42, 28, 116, 46, 28,
+ 116, 50, 28, 116, 50, 28, 116, 50, 28, 116, 46, 28, 116, 46, 28,
+ 116, 46, 28, 116, 50, 28, 116, 46, 28, 116, 50, 36, 124, 50, 36,
+ 116, 50, 28, 116, 46, 28, 116, 46, 28, 116, 46, 28, 116, 46, 28,
+ 108, 46, 20, 108, 50, 28, 116, 50, 28, 116, 54, 28, 108, 46, 28,
+ 108, 46, 20, 108, 42, 20, 108, 42, 20, 116, 50, 28, 116, 46, 28,
+ 116, 46, 28, 116, 46, 28, 116, 46, 28, 108, 46, 28, 116, 46, 28,
+ 116, 46, 28, 116, 46, 28, 116, 46, 28, 116, 46, 28, 116, 42, 28,
+ 116, 46, 28, 116, 46, 28, 116, 50, 28, 124, 50, 36, 124, 58, 36,
+ 124, 58, 36, 124, 58, 36, 124, 58, 36, 124, 58, 44, 124, 58, 36,
+ 124, 58, 36, 124, 54, 36, 132, 62, 44, 124, 54, 36, 124, 58, 36,
+ 124, 58, 36, 124, 58, 36, 124, 54, 44, 124, 58, 36, 132, 62, 44,
+ 124, 54, 36, 124, 58, 36, 124, 58, 36, 124, 58, 36, 124, 58, 36,
+ 124, 54, 36, 124, 58, 36, 124, 58, 36, 124, 58, 44, 124, 58, 36,
+ 124, 58, 44, 124, 54, 36, 124, 58, 44, 124, 58, 36, 124, 58, 44,
+ 124, 58, 44, 132, 62, 44, 124, 62, 44, 132, 62, 44, 124, 58, 44,
+ 124, 58, 44, 124, 58, 44, 132, 62, 44, 124, 62, 44, 132, 62, 44,
+ 124, 62, 44, 124, 62, 44, 124, 58, 36, 124, 58, 36, 124, 62, 44,
+ 124, 62, 44, 132, 62, 44, 116, 58, 36, 124, 58, 36, 124, 58, 44,
+ 124, 62, 44, 124, 62, 44, 124, 62, 44, 124, 62, 44, 124, 58, 36,
+ 124, 62, 44, 124, 58, 36, 124, 62, 44, 132, 62, 44, 124, 62, 44,
+ 132, 62, 44, 124, 66, 44, 132, 62, 44, 124, 62, 44, 124, 58, 36,
+ 124, 58, 36, 124, 62, 44, 132, 62, 44, 124, 62, 44, 124, 62, 44,
+ 124, 58, 36, 124, 62, 44, 124, 58, 36, 124, 58, 36, 124, 58, 44,
+ 124, 58, 36, 124, 58, 36, 116, 58, 36, 124, 58, 36, 124, 58, 36,
+ 124, 58, 36, 124, 58, 36, 124, 58, 36, 124, 58, 36, 124, 58, 36,
+ 124, 58, 36, 124, 58, 36, 124, 50, 36, 124, 54, 36, 124, 54, 36,
+ 124, 54, 36, 116, 54, 36, 116, 50, 36, 124, 54, 36, 124, 54, 44,
+ 124, 54, 36, 116, 54, 36, 116, 54, 36, 108, 46, 28, 124, 58, 44,
+ 124, 58, 44, 100, 42, 20, 108, 50, 28
+};
diff --git a/hacks/glx/endgame.c b/hacks/glx/endgame.c
new file mode 100644
index 0000000..ddba7f9
--- /dev/null
+++ b/hacks/glx/endgame.c
@@ -0,0 +1,971 @@
+/*
+ * endgame.c
+ * plays through a chess game ending. enjoy.
+ *
+ * version 1.0 - June 6, 2002
+ *
+ * Copyright (C) 2002-2008 Blair Tennessy (tennessb@unbc.ca)
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define free_chess 0
+# define release_chess 0
+# include "xlockmore.h"
+
+#else
+# include "xlock.h"
+#endif
+
+#ifdef USE_GL
+
+#define BOARDSIZE 8
+#define WHITES 5
+
+#include "gltrackball.h"
+#include "chessmodels.h"
+#include "chessgames.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define DEF_ROTATE "True"
+#define DEF_REFLECTIONS "True"
+#define DEF_SHADOWS "True"
+#define DEF_SMOOTH "True"
+#define DEF_CLASSIC "False"
+
+
+static XrmOptionDescRec opts[] = {
+ {"+rotate", ".chess.rotate", XrmoptionNoArg, "false" },
+ {"-rotate", ".chess.rotate", XrmoptionNoArg, "true" },
+ {"+reflections", ".chess.reflections", XrmoptionNoArg, "false" },
+ {"-reflections", ".chess.reflections", XrmoptionNoArg, "true" },
+ {"+shadows", ".chess.shadows", XrmoptionNoArg, "false" },
+ {"-shadows", ".chess.shadows", XrmoptionNoArg, "true" },
+ {"+smooth", ".chess.smooth", XrmoptionNoArg, "false" },
+ {"-smooth", ".chess.smooth", XrmoptionNoArg, "true" },
+ {"+classic", ".chess.classic", XrmoptionNoArg, "false" },
+ {"-classic", ".chess.classic", XrmoptionNoArg, "true" },
+};
+
+static int rotate, reflections, smooth, shadows, classic;
+
+static argtype vars[] = {
+ {&rotate, "rotate", "Rotate", DEF_ROTATE, t_Bool},
+ {&reflections, "reflections", "Reflections", DEF_REFLECTIONS, t_Bool},
+ {&shadows, "shadows", "Shadows", DEF_SHADOWS, t_Bool},
+ {&smooth, "smooth", "Smooth", DEF_SMOOTH, t_Bool},
+ {&classic, "classic", "Classic", DEF_CLASSIC, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt chess_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct chess_description =
+{"chess", "init_chess", "draw_chess", NULL,
+ "draw_chess", "init_chess", NULL, &chess_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "Chess", 0, NULL};
+
+#endif
+
+#define checkImageWidth 16
+#define checkImageHeight 16
+
+typedef struct {
+ GLXContext *glx_context;
+ Window window;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ ChessGame game;
+ int oldwhite;
+
+ /** definition of white/black (orange/gray) colors */
+ GLfloat colors[2][3];
+
+ GLubyte checkImage[checkImageWidth][checkImageHeight][3];
+ GLuint piecetexture, boardtexture;
+
+ int mpiece, tpiece, steps, done;
+ double from[2], to[2];
+ double dx, dz;
+ int moving, take, mc, count, wire;
+ double theta;
+
+ GLfloat position[4];
+ GLfloat position2[4];
+
+ GLfloat mod;
+
+ GLfloat ground[4];
+
+ int oldgame;
+
+ int poly_counts[PIECES]; /* polygon count of each type of piece */
+
+
+} Chesscreen;
+
+static Chesscreen *qs = NULL;
+
+static const GLfloat MaterialShadow[] = {0.0, 0.0, 0.0, 0.3};
+
+
+/* i prefer silvertip */
+static const GLfloat whites[WHITES][3] =
+ {
+ {1.0, 0.55, 0.1},
+ {0.8, 0.52, 0.8},
+ {0.43, 0.54, 0.76},
+ {0.2, 0.2, 0.2},
+ {0.35, 0.60, 0.35},
+ };
+
+static void build_colors(Chesscreen *cs)
+{
+
+ /* find new white */
+ int newwhite = cs->oldwhite;
+ while(newwhite == cs->oldwhite)
+ newwhite = random()%WHITES;
+ cs->oldwhite = newwhite;
+
+ cs->colors[0][0] = whites[cs->oldwhite][0];
+ cs->colors[0][1] = whites[cs->oldwhite][1];
+ cs->colors[0][2] = whites[cs->oldwhite][2];
+}
+
+/* build piece texture */
+static void make_piece_texture(Chesscreen *cs)
+{
+ int i, j, c;
+
+ for (i = 0; i < checkImageWidth; i++) {
+ for (j = 0; j < checkImageHeight; j++) {
+ c = ((j%2) == 0 || i%2 == 0) ? 240 : 180+random()%16;
+ cs->checkImage[i][j][0] = (GLubyte) c;
+ cs->checkImage[i][j][1] = (GLubyte) c;
+ cs->checkImage[i][j][2] = (GLubyte) c;
+ }
+ }
+
+ glGenTextures(1, &cs->piecetexture);
+ glBindTexture(GL_TEXTURE_2D, cs->piecetexture);
+
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth,
+ checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE,
+ &cs->checkImage[0][0]);
+}
+
+/* build board texture (uniform noise in [180,180+50]) */
+static void make_board_texture(Chesscreen *cs)
+{
+ int i, j, c;
+
+ for (i = 0; i < checkImageWidth; i++) {
+ for (j = 0; j < checkImageHeight; j++) {
+ c = 180 + random()%51;
+ cs->checkImage[i][j][0] = (GLubyte) c;
+ cs->checkImage[i][j][1] = (GLubyte) c;
+ cs->checkImage[i][j][2] = (GLubyte) c;
+ }
+ }
+
+ glGenTextures(1, &cs->boardtexture);
+ glBindTexture(GL_TEXTURE_2D, cs->boardtexture);
+
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth,
+ checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE,
+ &cs->checkImage[0][0]);
+}
+
+/** handle X event (trackball) */
+ENTRYPOINT Bool chess_handle_event (ModeInfo *mi, XEvent *event)
+{
+ Chesscreen *cs = &qs[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, cs->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &cs->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ cs->done = 1;
+ return True;
+ }
+
+ return False;
+}
+
+static const GLfloat diffuse2[] = {1.0, 1.0, 1.0, 1.0};
+/*static const GLfloat ambient2[] = {0.7, 0.7, 0.7, 1.0};*/
+static const GLfloat shininess[] = {60.0};
+static const GLfloat specular[] = {0.4, 0.4, 0.4, 1.0};
+
+/* configure lighting */
+static void setup_lights(Chesscreen *cs)
+{
+ glEnable(GL_LIGHTING);
+ glLightfv(GL_LIGHT0, GL_POSITION, cs->position);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse2);
+ glEnable(GL_LIGHT0);
+
+/* glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient2); */
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
+
+ glLightfv(GL_LIGHT1, GL_SPECULAR, diffuse2);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse2);
+ glEnable(GL_LIGHT1);
+}
+
+/* draw pieces */
+static void drawPieces(ModeInfo *mi, Chesscreen *cs)
+{
+ int i, j;
+
+ for(i = 0; i < BOARDSIZE; ++i) {
+ for(j = 0; j < BOARDSIZE; ++j) {
+ if(cs->game.board[i][j]) {
+ int c = cs->game.board[i][j]/PIECES;
+ glColor3fv(cs->colors[c]);
+ glCallList(cs->game.board[i][j]%PIECES);
+ mi->polygon_count += cs->poly_counts[cs->game.board[i][j]%PIECES];
+ }
+
+ glTranslatef(1.0, 0.0, 0.0);
+ }
+
+ glTranslatef(-1.0*BOARDSIZE, 0.0, 1.0);
+ }
+
+ glTranslatef(0.0, 0.0, -1.0*BOARDSIZE);
+}
+
+/* draw pieces */
+static void drawPiecesShadow(ModeInfo *mi, Chesscreen *cs)
+{
+ int i, j;
+
+ for(i = 0; i < BOARDSIZE; ++i) {
+ for(j = 0; j < BOARDSIZE; ++j) {
+ if(cs->game.board[i][j]) {
+ glColor4f(0.0, 0.0, 0.0, 0.4);
+ glCallList(cs->game.board[i][j]%PIECES);
+ mi->polygon_count += cs->poly_counts[cs->game.board[i][j]%PIECES];
+ }
+
+ glTranslatef(1.0, 0.0, 0.0);
+ }
+
+ glTranslatef(-1.0*BOARDSIZE, 0.0, 1.0);
+ }
+
+ glTranslatef(0.0, 0.0, -1.0*BOARDSIZE);
+}
+
+/* draw a moving piece */
+static void drawMovingPiece(ModeInfo *mi, Chesscreen *cs, int shadow)
+{
+ int piece = cs->mpiece % PIECES;
+
+ if (piece == NONE) return;
+
+ glPushMatrix();
+
+ if(shadow) glColor4fv(MaterialShadow);
+ else glColor3fv(cs->colors[cs->mpiece/PIECES]);
+
+ /** assume a queening. should be more general */
+ if((cs->mpiece == PAWN && fabs(cs->to[0]) < 0.01) ||
+ (cs->mpiece == BPAWN && fabs(cs->to[0]-7.0) < 0.01)) {
+ glTranslatef(cs->from[1]+cs->steps*cs->dx, 0.0, cs->from[0]+cs->steps*cs->dz);
+
+ glColor4f(shadow ? MaterialShadow[0] : cs->colors[cs->mpiece/7][0],
+ shadow ? MaterialShadow[1] : cs->colors[cs->mpiece/7][1],
+ shadow ? MaterialShadow[2] : cs->colors[cs->mpiece/7][2],
+ (fabs(50.0-cs->steps))/50.0);
+
+ piece = cs->steps < 50 ? PAWN : QUEEN;
+
+ /* what a kludge */
+ if(cs->steps == 99)
+ cs->mpiece = cs->mpiece == PAWN ? QUEEN : BQUEEN;
+ }
+ else if(cs->mpiece % PIECES == KNIGHT) {
+ /* If there is nothing in the path of a knight, move it by sliding,
+ just like the other pieces. But if there are any pieces on the
+ middle two squares in its path, the knight would intersect them,
+ so in that case, move it in an airborne arc. */
+ GLfloat y;
+ int i, j;
+ Bool blocked_p = False;
+ int fromx = MIN(cs->from[1], cs->to[1]);
+ int fromy = MIN(cs->from[0], cs->to[0]);
+ int tox = MAX(cs->from[1], cs->to[1]);
+ int toy = MAX(cs->from[0], cs->to[0]);
+ if (fromx == tox-2) fromx = tox = fromx+1;
+ if (fromy == toy-2) fromy = toy = fromy+1;
+ for (i = fromy; i <= toy; i++) {
+ for (j = fromx; j <= tox; j++) {
+ if (cs->game.board[i][j]) {
+ blocked_p = True;
+ break;
+ }
+ }
+ }
+
+ if (!blocked_p)
+ goto SLIDE;
+
+ /* Move by hopping. */
+ y = 1.5 * sin (M_PI * cs->steps / 100.0);
+ glTranslatef(cs->from[1]+cs->steps*cs->dx, y,
+ cs->from[0]+cs->steps*cs->dz);
+
+ } else {
+ SLIDE:
+ /* Move by sliding. */
+ glTranslatef(cs->from[1]+cs->steps*cs->dx, 0.0, cs->from[0]+cs->steps*cs->dz);
+ }
+
+
+ if(!cs->wire)
+ glEnable(GL_BLEND);
+
+ glCallList(piece);
+ mi->polygon_count += cs->poly_counts[cs->mpiece % PIECES];
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
+
+ glPopMatrix();
+
+ if(!cs->wire)
+ glDisable(GL_BLEND);
+}
+
+/** code to squish a taken piece */
+static void drawTakePiece(ModeInfo *mi, Chesscreen *cs, int shadow)
+{
+ if(!cs->wire)
+ glEnable(GL_BLEND);
+
+ glColor4f(shadow ? MaterialShadow[0] : cs->colors[cs->tpiece/7][0],
+ shadow ? MaterialShadow[1] : cs->colors[cs->tpiece/7][1],
+ shadow ? MaterialShadow[2] : cs->colors[cs->tpiece/7][2],
+ (100-1.6*cs->steps)/100.0);
+
+ glTranslatef(cs->to[1], 0.0, cs->to[0]);
+
+ if(cs->mpiece % PIECES == KNIGHT)
+ glScalef(1.0+cs->steps/100.0, 1.0, 1.0+cs->steps/100.0);
+ else
+ glScalef(1.0, 1 - cs->steps/50.0 > 0.01 ? 1 - cs->steps/50.0 : 0.01, 1.0);
+ glCallList(cs->tpiece % 7);
+ mi->polygon_count += cs->poly_counts[cs->tpiece % PIECES];
+
+ if(!cs->wire)
+ glDisable(GL_BLEND);
+}
+
+/** draw board */
+static void drawBoard(ModeInfo *mi, Chesscreen *cs)
+{
+ int i, j;
+
+ glBegin(GL_QUADS);
+
+ for(i = 0; i < BOARDSIZE; ++i)
+ for(j = 0; j < BOARDSIZE; ++j) {
+ double ma1 = (i+j)%2 == 0 ? cs->mod*i : 0.0;
+ double mb1 = (i+j)%2 == 0 ? cs->mod*j : 0.0;
+ double ma2 = (i+j)%2 == 0 ? cs->mod*(i+1.0) : 0.01;
+ double mb2 = (i+j)%2 == 0 ? cs->mod*(j+1.0) : 0.01;
+
+ /*glColor3fv(colors[(i+j)%2]);*/
+ glColor4f(cs->colors[(i+j)%2][0], cs->colors[(i+j)%2][1],
+ cs->colors[(i+j)%2][2], 0.65);
+
+ glNormal3f(0.0, 1.0, 0.0);
+/* glTexCoord2f(mod*i, mod*(j+1.0)); */
+ glTexCoord2f(ma1, mb2);
+ glVertex3f(i, 0.0, j + 1.0);
+/* glTexCoord2f(mod*(i+1.0), mod*(j+1.0)); */
+ glTexCoord2f(ma2, mb2);
+ glVertex3f(i + 1.0, 0.0, j + 1.0);
+ glTexCoord2f(ma2, mb1);
+/* glTexCoord2f(mod*(i+1.0), mod*j); */
+ glVertex3f(i + 1.0, 0.0, j);
+ glTexCoord2f(ma1, mb1);
+/* glTexCoord2f(mod*i, mod*j); */
+ glVertex3f(i, 0.0, j);
+
+ mi->polygon_count++;
+ }
+ glEnd();
+
+ {
+ GLfloat off = 0.01;
+ GLfloat w = BOARDSIZE;
+ GLfloat h = 0.1;
+
+ /* Give the board a slight lip. */
+ /* #### oops, normals are wrong here, but you can't tell */
+
+ glColor3f(0.3, 0.3, 0.3);
+ glBegin (GL_QUADS);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, -h, 0);
+ glVertex3f (0, -h, w);
+ glVertex3f (0, 0, w);
+
+ glVertex3f (0, 0, w);
+ glVertex3f (0, -h, w);
+ glVertex3f (w, -h, w);
+ glVertex3f (w, 0, w);
+
+ glVertex3f (w, 0, w);
+ glVertex3f (w, -h, w);
+ glVertex3f (w, -h, 0);
+ glVertex3f (w, 0, 0);
+
+ glVertex3f (w, 0, 0);
+ glVertex3f (w, -h, 0);
+ glVertex3f (0, -h, 0);
+ glVertex3f (0, 0, 0);
+
+ glVertex3f (0, -h, 0);
+ glVertex3f (w, -h, 0);
+ glVertex3f (w, -h, w);
+ glVertex3f (0, -h, w);
+ glEnd();
+ mi->polygon_count += 4;
+
+ /* Fill in the underside of the board with an invisible black box
+ to hide the reflections that are not on tiles. Probably there's
+ a way to do this with stencils instead.
+ */
+ w -= off*2;
+ h = 5;
+
+ glPushMatrix();
+ glTranslatef (off, 0, off);
+ glDisable(GL_LIGHTING);
+ glColor3f(0,0,0);
+ glBegin (GL_QUADS);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, -h, 0);
+ glVertex3f (0, -h, w);
+ glVertex3f (0, 0, w);
+
+ glVertex3f (0, 0, w);
+ glVertex3f (0, -h, w);
+ glVertex3f (w, -h, w);
+ glVertex3f (w, 0, w);
+
+ glVertex3f (w, 0, w);
+ glVertex3f (w, -h, w);
+ glVertex3f (w, -h, 0);
+ glVertex3f (w, 0, 0);
+
+ glVertex3f (w, 0, 0);
+ glVertex3f (w, -h, 0);
+ glVertex3f (0, -h, 0);
+ glVertex3f (0, 0, 0);
+
+ glVertex3f (0, -h, 0);
+ glVertex3f (w, -h, 0);
+ glVertex3f (w, -h, w);
+ glVertex3f (0, -h, w);
+ glEnd();
+ mi->polygon_count += 4;
+ glPopMatrix();
+ if (!cs->wire)
+ glEnable(GL_LIGHTING);
+ }
+}
+
+static void draw_pieces(ModeInfo *mi, Chesscreen *cs, int wire)
+{
+ if (!cs->wire) {
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, cs->piecetexture);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+ glColor4f(0.5, 0.5, 0.5, 1.0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialShadow);
+ }
+
+ drawPieces(mi, cs);
+ if(cs->moving) drawMovingPiece(mi, cs, 0);
+ if(cs->take) drawTakePiece(mi, cs, 0);
+ glDisable(GL_TEXTURE_2D);
+}
+
+static void draw_shadow_pieces(ModeInfo *mi, Chesscreen *cs, int wire)
+{
+ if (!cs->wire) {
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, cs->piecetexture);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ }
+
+ /* use the stencil */
+ glDisable(GL_LIGHTING);
+ glDisable(GL_COLOR_MATERIAL);
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_BLEND);
+
+ glClear(GL_STENCIL_BUFFER_BIT);
+ glColorMask(0,0,0,0);
+ glEnable(GL_STENCIL_TEST);
+
+ glStencilFunc(GL_ALWAYS, 1, 0xFFFFFFFFL);
+ glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
+
+
+ glPushMatrix();
+ glTranslatef(0.0, 0.001, 0.0);
+
+ /* draw the pieces */
+ drawPiecesShadow(mi, cs);
+ if(cs->moving) drawMovingPiece(mi, cs, shadows);
+ if(cs->take) drawTakePiece(mi, cs, shadows);
+
+ glPopMatrix();
+
+
+ /* turn on drawing into colour buffer */
+ glColorMask(1,1,1,1);
+
+ /* programming with effect */
+ glDisable(GL_LIGHTING);
+ glDisable(GL_COLOR_MATERIAL);
+ glDisable(GL_TEXTURE_2D);
+
+ /* now draw the union of the shadows */
+
+ /*
+ <todo>
+ want to keep alpha values (alpha is involved in transition
+ effects of the active pieces).
+ </todo>
+ */
+ glStencilFunc(GL_NOTEQUAL, 0, 0xFFFFFFFFL);
+ glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
+
+ glEnable(GL_BLEND);
+
+ glColor4fv(MaterialShadow);
+
+ /* draw the board generously to fill the shadows */
+ glBegin(GL_QUADS);
+
+ glVertex3f(-1.0, 0.0, -1.0);
+ glVertex3f(-1.0, 0.0, BOARDSIZE + 1.0);
+ glVertex3f(1.0 + BOARDSIZE, 0.0, BOARDSIZE + 1.0);
+ glVertex3f(1.0 + BOARDSIZE, 0.0, -1.0);
+
+ glEnd();
+
+ glDisable(GL_STENCIL_TEST);
+
+ /* "pop" attributes */
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_COLOR_MATERIAL);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_CULL_FACE);
+
+
+
+}
+
+enum {X, Y, Z, W};
+enum {A, B, C, D};
+
+/* create a matrix that will project the desired shadow */
+static void shadowmatrix(GLfloat shadowMat[4][4],
+ GLfloat groundplane[4],
+ GLfloat lightpos[4])
+{
+ GLfloat dot;
+
+ /* find dot product between light position vector and ground plane normal */
+ dot = groundplane[X] * lightpos[X] +
+ groundplane[Y] * lightpos[Y] +
+ groundplane[Z] * lightpos[Z] +
+ groundplane[W] * lightpos[W];
+
+ shadowMat[0][0] = dot - lightpos[X] * groundplane[X];
+ shadowMat[1][0] = 0.f - lightpos[X] * groundplane[Y];
+ shadowMat[2][0] = 0.f - lightpos[X] * groundplane[Z];
+ shadowMat[3][0] = 0.f - lightpos[X] * groundplane[W];
+
+ shadowMat[X][1] = 0.f - lightpos[Y] * groundplane[X];
+ shadowMat[1][1] = dot - lightpos[Y] * groundplane[Y];
+ shadowMat[2][1] = 0.f - lightpos[Y] * groundplane[Z];
+ shadowMat[3][1] = 0.f - lightpos[Y] * groundplane[W];
+
+ shadowMat[X][2] = 0.f - lightpos[Z] * groundplane[X];
+ shadowMat[1][2] = 0.f - lightpos[Z] * groundplane[Y];
+ shadowMat[2][2] = dot - lightpos[Z] * groundplane[Z];
+ shadowMat[3][2] = 0.f - lightpos[Z] * groundplane[W];
+
+ shadowMat[X][3] = 0.f - lightpos[W] * groundplane[X];
+ shadowMat[1][3] = 0.f - lightpos[W] * groundplane[Y];
+ shadowMat[2][3] = 0.f - lightpos[W] * groundplane[Z];
+ shadowMat[3][3] = dot - lightpos[W] * groundplane[W];
+}
+
+/** reflectionboard */
+static void draw_reflections(ModeInfo *mi, Chesscreen *cs)
+{
+ int i, j;
+
+ glEnable(GL_STENCIL_TEST);
+ glStencilFunc(GL_ALWAYS, 1, 1);
+ glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
+ glColorMask(0,0,0,0);
+ glDisable(GL_CULL_FACE);
+
+ glDisable(GL_DEPTH_TEST);
+ glBegin(GL_QUADS);
+
+ /* only draw white squares */
+ for(i = 0; i < BOARDSIZE; ++i) {
+ for(j = (BOARDSIZE+i) % 2; j < BOARDSIZE; j += 2) {
+ glVertex3f(i, 0.0, j + 1.0);
+ glVertex3f(i + 1.0, 0.0, j + 1.0);
+ glVertex3f(i + 1.0, 0.0, j);
+ glVertex3f(i, 0.0, j);
+ mi->polygon_count++;
+ }
+ }
+ glEnd();
+ glEnable(GL_DEPTH_TEST);
+
+ glColorMask(1, 1, 1, 1);
+ glStencilFunc(GL_EQUAL, 1, 1);
+ glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+
+ glPushMatrix();
+ glScalef(1.0, -1.0, 1.0);
+ glTranslatef(0.5, 0.0, 0.5);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, cs->position);
+ draw_pieces(mi, cs, cs->wire);
+ glPopMatrix();
+
+ glDisable(GL_STENCIL_TEST);
+ glLightfv(GL_LIGHT0, GL_POSITION, cs->position);
+
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ glColorMask(1,1,1,1);
+}
+
+/** draws the scene */
+static void display(ModeInfo *mi, Chesscreen *cs)
+{
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
+
+ mi->polygon_count = 0;
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ /** setup perspectiv */
+ glTranslatef(0.0, 0.0, -1.5*BOARDSIZE);
+ glRotatef(30.0, 1.0, 0.0, 0.0);
+ gltrackball_rotate (cs->trackball);
+
+ if (rotate)
+ glRotatef(cs->theta*100, 0.0, 1.0, 0.0);
+ glTranslatef(-0.5*BOARDSIZE, 0.0, -0.5*BOARDSIZE);
+
+/* cs->position[0] = 4.0 + 1.0*-sin(cs->theta*100*M_PI/180.0); */
+/* cs->position[2] = 4.0 + 1.0* cos(cs->theta*100*M_PI/180.0); */
+/* cs->position[1] = 5.0; */
+
+ /* this is the lone light that the shadow matrix is generated from */
+ cs->position[0] = 1.0;
+ cs->position[2] = 1.0;
+ cs->position[1] = 16.0;
+
+ cs->position2[0] = 4.0 + 8.0*-sin(cs->theta*100*M_PI/180.0);
+ cs->position2[2] = 4.0 + 8.0* cos(cs->theta*100*M_PI/180.0);
+
+ if (!cs->wire) {
+ glEnable(GL_LIGHTING);
+ glLightfv(GL_LIGHT0, GL_POSITION, cs->position);
+ glLightfv(GL_LIGHT1, GL_POSITION, cs->position2);
+ glEnable(GL_LIGHT0);
+ }
+
+ /** draw board, pieces */
+ if(!cs->wire) {
+ glEnable(GL_LIGHTING);
+ glEnable(GL_COLOR_MATERIAL);
+
+ if(reflections && !cs->wire) {
+ draw_reflections(mi, cs);
+ glEnable(GL_BLEND);
+ }
+
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, cs->boardtexture);
+ drawBoard(mi, cs);
+ glDisable(GL_TEXTURE_2D);
+
+ if(shadows) {
+ /* render shadows */
+ GLfloat m[4][4];
+ shadowmatrix(m, cs->ground, cs->position);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialShadow);
+ glEnable(GL_BLEND);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_DEPTH_TEST);
+
+ /* display ant shadow */
+ glPushMatrix();
+ glTranslatef(0.0, 0.001, 0.0);
+ glMultMatrixf(m[0]);
+ glTranslatef(0.5, 0.01, 0.5);
+ draw_shadow_pieces(mi, cs, cs->wire);
+ glPopMatrix();
+
+ glEnable(GL_LIGHTING);
+ glDisable(GL_BLEND);
+ glEnable(GL_DEPTH_TEST);
+ }
+
+ if(reflections)
+ glDisable(GL_BLEND);
+ }
+ else
+ drawBoard(mi, cs);
+
+ glTranslatef(0.5, 0.0, 0.5);
+ draw_pieces(mi, cs, cs->wire);
+
+ if(!cs->wire) {
+ glDisable(GL_COLOR_MATERIAL);
+ glDisable(GL_LIGHTING);
+ }
+
+ if (!cs->button_down_p)
+ cs->theta += .002;
+}
+
+/** reshape handler */
+ENTRYPOINT void reshape_chess(ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0,y, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(45, 1/h, 2.0, 30.0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+/** initialization handler */
+ENTRYPOINT void init_chess(ModeInfo *mi)
+{
+ Chesscreen *cs;
+ int screen = MI_SCREEN(mi);
+
+ MI_INIT(mi, qs);
+
+ cs = &qs[screen];
+ cs->window = MI_WINDOW(mi);
+ cs->wire = MI_IS_WIREFRAME(mi);
+ cs->trackball = gltrackball_init (False);
+
+ cs->oldwhite = -1;
+
+ cs->colors[0][0] = 1.0;
+ cs->colors[0][1] = 0.5;
+ cs->colors[0][2] = 0.0;
+
+ cs->colors[1][0] = 0.6;
+ cs->colors[1][1] = 0.6;
+ cs->colors[1][2] = 0.6;
+
+ cs->done = 1;
+ cs->count = 99;
+ cs->mod = 1.4;
+
+/* cs->position[0] = 0.0; */
+/* cs->position[1] = 5.0; */
+/* cs->position[2] = 5.0; */
+/* cs->position[3] = 1.0; */
+
+ cs->position[0] = 0.0;
+ cs->position[1] = 24.0;
+ cs->position[2] = 2.0;
+ cs->position[3] = 1.0;
+
+
+ cs->position2[0] = 5.0;
+ cs->position2[1] = 5.0;
+ cs->position2[2] = 5.0;
+ cs->position2[3] = 1.0;
+
+ cs->ground[0] = 0.0;
+ cs->ground[1] = 1.0;
+ cs->ground[2] = 0.0;
+ cs->ground[3] = -0.00001;
+
+ cs->oldgame = -1;
+
+
+ if((cs->glx_context = init_GL(mi)))
+ reshape_chess(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ else
+ MI_CLEARWINDOW(mi);
+
+ if (!cs->wire) {
+ glDepthFunc(GL_LEQUAL);
+ glClearStencil(0);
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+
+ make_piece_texture(cs);
+ make_board_texture(cs);
+ }
+ chessmodels_gen_lists( classic, cs->poly_counts);
+
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ cs->wire = 0;
+# endif
+
+ if(!cs->wire) {
+ setup_lights(cs);
+ glColorMaterial(GL_FRONT, GL_DIFFUSE);
+ glShadeModel(smooth ? GL_SMOOTH : GL_FLAT);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_DEPTH_TEST);
+ }
+ else
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+}
+
+/** does dirty work drawing scene, moving pieces */
+ENTRYPOINT void draw_chess(ModeInfo *mi)
+{
+ Chesscreen *cs = &qs[MI_SCREEN(mi)];
+ Window w = MI_WINDOW(mi);
+ Display *disp = MI_DISPLAY(mi);
+
+ if(!cs->glx_context)
+ return;
+
+ glXMakeCurrent(disp, w, *(cs->glx_context));
+
+ /** code for moving a piece */
+ if(cs->moving && ++cs->steps == 100) {
+ cs->moving = cs->count = cs->steps = cs->take = 0;
+ cs->game.board[cs->game.moves[cs->mc][2]][cs->game.moves[cs->mc][3]] = cs->mpiece;
+ ++cs->mc;
+
+ if(cs->mc == cs->game.movecount) {
+ cs->done = 1;
+ cs->mc = 0;
+ }
+ }
+
+ if(++cs->count == 100) {
+ if(!cs->done) {
+ cs->mpiece = cs->game.board[cs->game.moves[cs->mc][0]][cs->game.moves[cs->mc][1]];
+ cs->game.board[cs->game.moves[cs->mc][0]][cs->game.moves[cs->mc][1]] = NONE;
+
+ if((cs->tpiece = cs->game.board[cs->game.moves[cs->mc][2]][cs->game.moves[cs->mc][3]])) {
+ cs->game.board[cs->game.moves[cs->mc][2]][cs->game.moves[cs->mc][3]] = NONE;
+ cs->take = 1;
+ }
+
+ cs->from[0] = cs->game.moves[cs->mc][0];
+ cs->from[1] = cs->game.moves[cs->mc][1];
+ cs->to[0] = cs->game.moves[cs->mc][2];
+ cs->to[1] = cs->game.moves[cs->mc][3];
+
+ cs->dz = (cs->to[0] - cs->from[0]) / 100;
+ cs->dx = (cs->to[1] - cs->from[1]) / 100;
+ cs->steps = 0;
+ cs->moving = 1;
+ }
+ else if(cs->done == 1) {
+ int newgame = cs->oldgame;
+ while(newgame == cs->oldgame)
+ newgame = random()%GAMES;
+
+ /* mod the mod */
+ cs->mod = 0.6 + (random()%20)/10.0;
+
+ /* same old game */
+ cs->oldgame = newgame;
+ cs->game = games[cs->oldgame];
+ build_colors(cs);
+ cs->done = 2;
+ cs->count = 0;
+ }
+ else {
+ cs->done = 0;
+ cs->count = 0;
+ }
+ }
+
+ /* set lighting */
+ if(cs->done) {
+ glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION,
+ cs->done == 1 ? 1.0+0.1*cs->count : 100.0/cs->count);
+ glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION,
+ cs->done == 1 ? 1.0+0.1*cs->count : 100.0/cs->count);
+ glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.14);
+ glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.14);
+ }
+
+ display(mi, cs);
+
+ if(mi->fps_p) do_fps(mi);
+ glFinish();
+ glXSwapBuffers(disp, w);
+}
+
+XSCREENSAVER_MODULE_2 ("Endgame", endgame, chess)
+
+#endif
diff --git a/hacks/glx/endgame.man b/hacks/glx/endgame.man
new file mode 100644
index 0000000..93ca5c3
--- /dev/null
+++ b/hacks/glx/endgame.man
@@ -0,0 +1,72 @@
+.TH XScreenSaver 1 "5-May-2004"
+.SH NAME
+endgame \- endgame chess screensaver
+.SH SYNOPSIS
+.B endgame
+[\-display \fIhost:display.screen\fP]
+[\-window]
+[\-root]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fImicroseconds\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+endgame replays a brilliant chess ending
+.SH OPTIONS
+.I endgame
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-shadows
+Project pieces against the board with dark blend.
+.TP 8
+.B \-reflections
+Reflect pieces in light board squares.
+.TP 8
+.B \-classic
+Use the original low-polygon piece models.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH BUGS
+It's not unknown for this and other OpenGL hacks to fail under hardware accelaration (UtahGLX) and take the X server with them. Texture images must be 16x16 or 32x32 or 64x64 etc.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Blair Tennessy. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Blair Tennessy <tennessb@unbc.ca>, 20-April-2002.
+
diff --git a/hacks/glx/energystream.c b/hacks/glx/energystream.c
new file mode 100644
index 0000000..7221f0d
--- /dev/null
+++ b/hacks/glx/energystream.c
@@ -0,0 +1,534 @@
+/* energystream, Copyright (c) 2016 Eugene Sandulenko <sev@scummvm.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Based on Public Domain code by konrad "yoghurt" zagorowicz
+ * for Tesla demo by Sunflower (http://www.pouet.net/prod.php?which=33)
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 30 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define release_stream 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "gltrackball.h"
+#include "rotator.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+static float change_time = 0;
+static float change_time1 = 25;
+static float change_time2 = 40;
+static float change_time3 = 60;
+
+#define DEF_STREAMS "16"
+
+#include <sys/time.h>
+#include <time.h>
+
+typedef struct timeval streamtime;
+
+#define GETSECS(t) ((t).tv_sec)
+#define GETMSECS(t) ((t).tv_usec/1000)
+
+#define DEF_SPIN "False"
+#define DEF_WANDER "False"
+#define DEF_SPEED "1.0"
+
+
+typedef struct {
+ float x, y, z;
+} Vector;
+
+typedef struct {
+ Vector *flares;
+ int num_flares;
+ GLuint flare_tex;
+ float speed;
+} flare_stream;
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ time_t start_time;
+
+ int num_streams;
+ flare_stream *streams;
+
+} stream_configuration;
+
+static stream_configuration *ess = NULL;
+
+static int num_streams;
+static Bool do_spin;
+static GLfloat global_speed;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ { "-streams", ".streams", XrmoptionSepArg, 0 },
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" }
+};
+
+static argtype vars[] = {
+ {&num_streams, "streams", "Streams", DEF_STREAMS, t_Int},
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&global_speed, "speed", "Speed", DEF_SPEED, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt stream_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+static void gettime(streamtime *t)
+{
+#ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(t, &tzp);
+#else /* !GETTIMEOFDAY_TWO_ARGS */
+ gettimeofday(t);
+#endif /* !GETTIMEOFDAY_TWO_ARGS */
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_stream (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+
+ glViewport (0, 0, (GLint) width, (GLint) height);
+
+ glMatrixMode (GL_PROJECTION);
+ glLoadIdentity ();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode (GL_MODELVIEW);
+ glLoadIdentity ();
+ gluLookAt (0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear (GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+stream_handle_event (ModeInfo *mi, XEvent *event)
+{
+ stream_configuration *es = &ess[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, es->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &es->button_down_p))
+ return True;
+
+ return False;
+}
+
+#define TEX_WIDTH 256
+#define TEX_HEIGHT 256
+#define COEFF 0.2
+
+static GLuint gen_texture (void)
+{
+ int x, y, i;
+ float color;
+ GLuint tex;
+
+ unsigned char *texture = (unsigned char *)calloc (TEX_WIDTH * TEX_HEIGHT, 4);
+ unsigned char *ptr = texture;
+
+ float tint[3];
+ for (i = 0; i < 3; i++)
+ tint[i] = 1.0 * random() / RAND_MAX;
+
+ for (y = 0; y < TEX_HEIGHT; y++) {
+ for (x = 0; x < TEX_WIDTH; x++) {
+ color = 255 - sqrt((x - TEX_WIDTH / 2) * (x - TEX_WIDTH / 2) / COEFF
+ + (y - TEX_HEIGHT / 2) * (y - TEX_HEIGHT / 2) / COEFF);
+
+ if (color < 0)
+ color = 0;
+
+ for (i = 0; i < 3; i++)
+ ptr[i] = (unsigned char)(color * tint[i]);
+ ptr[3] = color ? 255 : 0;
+
+ ptr += 4;
+ }
+ }
+
+ glGenTextures (1, &tex);
+#ifdef HAVE_GLBINDTEXTURE
+ glBindTexture (GL_TEXTURE_2D, tex);
+#endif /* HAVE_GLBINDTEXTURE */
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+ clear_gl_error ();
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, TEX_WIDTH, TEX_HEIGHT,
+ 0, GL_RGBA, GL_UNSIGNED_BYTE, texture);
+ check_gl_error ("texture");
+
+ /* Texture parameters, LINEAR scaling for better texture quality */
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ free (texture);
+
+ return tex;
+}
+
+static inline void vector_copy (Vector *a, Vector *b)
+{
+ a->x = b->x;
+ a->y = b->y;
+ a->z = b->z;
+}
+
+/* a += b */
+static inline void vector_add (Vector *a, Vector *b)
+{
+ a->x += b->x;
+ a->y += b->y;
+ a->z += b->z;
+}
+
+/* a -= b */
+static inline void vector_sub (Vector *a, Vector *b)
+{
+ a->x -= b->x;
+ a->y -= b->y;
+ a->z -= b->z;
+}
+
+static void init_flare_stream (flare_stream *s, int num_flares, float bx, float by, float bz, float speed)
+{
+ int i;
+
+ s->flares = (Vector *) calloc (num_flares, sizeof (Vector));
+ s->num_flares = num_flares;
+ s->flare_tex = gen_texture();
+ s->speed = speed;
+
+ for (i = 0; i != s->num_flares; i++)
+ {
+ s->flares[i].x = -800.0f * random() / RAND_MAX - 1150 + bx;
+ s->flares[i].y = 10.0f * random() / RAND_MAX - 20 + by;
+ s->flares[i].z = 10.0f * random() / RAND_MAX - 20 + bz;
+ }
+}
+
+static void render_flare_stream (flare_stream *s, float cur_time, Vector *vx, Vector *vy, float alpha)
+{
+ float fMultipler = 1;
+ int i;
+
+ if (s->flare_tex == -1)
+ return;
+ if (!s->num_flares)
+ return;
+
+ if (cur_time < change_time)
+ return;
+
+ cur_time -= change_time;
+
+ glColor4f (1.0, 1, 1, alpha);
+#ifdef HAVE_GLBINDTEXTURE
+ glBindTexture (GL_TEXTURE_2D, s->flare_tex);
+#endif
+
+ glBegin (GL_QUADS);
+
+ if (cur_time + change_time > change_time1)
+ {
+ if (cur_time + change_time > change_time2)
+ {
+ fMultipler = 2.5;
+ }
+ else
+ fMultipler = 2;
+ }
+
+ for (i = 0; i != s->num_flares; i++)
+ {
+ Vector flare_pos;
+ Vector cc;
+
+ flare_pos.x = fmod (s->flares[i].x + cur_time * s->speed * fMultipler, 800) - 400;
+ flare_pos.y = s->flares[i].y + 2 * sin (cur_time * 7 + s->flares[i].x);
+ flare_pos.z = s->flares[i].z + 2 * cos (cur_time * 7 + i * 3.14);
+
+ glTexCoord2f (0, 0);
+ vector_copy (&cc, &flare_pos);
+ vector_sub (&cc, vx);
+ vector_add (&cc, vy);
+ glVertex3fv ((float *)&cc);
+
+ glTexCoord2f ( 1, 0 );
+ vector_copy (&cc, &flare_pos);
+ vector_add (&cc, vx);
+ vector_add (&cc, vy);
+ glVertex3fv ((float *)&cc);
+
+ glTexCoord2f ( 1, 1 );
+ vector_copy (&cc, &flare_pos);
+ vector_add (&cc, vx);
+ vector_sub (&cc, vy);
+ glVertex3fv ((float *)&cc);
+
+ glTexCoord2f ( 0, 1 );
+ vector_copy (&cc, &flare_pos);
+ vector_sub (&cc, vx);
+ vector_sub (&cc, vy);
+ glVertex3fv ((float *)&cc);
+ }
+
+ glEnd ();
+}
+
+ENTRYPOINT void
+init_stream (ModeInfo *mi)
+{
+ stream_configuration *es;
+ streamtime current_time;
+
+ MI_INIT (mi, ess);
+
+ es = &ess[MI_SCREEN(mi)];
+
+ es->glx_context = init_GL (mi);
+
+ reshape_stream (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ gettime (&current_time);
+ es->start_time = GETSECS(current_time) * 1000 + GETMSECS(current_time);
+
+ es->num_streams = num_streams;
+
+ es->streams = (flare_stream *) calloc (es->num_streams, sizeof(flare_stream));
+
+ init_flare_stream (&es->streams[0], 150, 0, 50, 0, 300);
+ init_flare_stream (&es->streams[1], 150, 0, 0, 0, 150);
+ init_flare_stream (&es->streams[2], 150, 0, 90, 60, 250);
+ init_flare_stream (&es->streams[3], 150, 0, -100, 30, 160);
+ init_flare_stream (&es->streams[4], 150, 0, 50, -100, 340);
+ init_flare_stream (&es->streams[5], 150, 0, -50, 50, 270 );
+ init_flare_stream (&es->streams[6], 150, 0, 100, 50, 180);
+ init_flare_stream (&es->streams[7], 150, 0, -30, 90, 130);
+
+ init_flare_stream (&es->streams[8], 150, 0, 150, 10, 200);
+ init_flare_stream (&es->streams[9], 150, 0, 100, -100, 210);
+ init_flare_stream (&es->streams[10], 150, 0, 190, 160, 220);
+ init_flare_stream (&es->streams[11], 150, 0, -200, 130, 230);
+ init_flare_stream (&es->streams[12], 150, 0, 150, -200, 240);
+ init_flare_stream (&es->streams[13], 150, 0, -150, 250, 160);
+ init_flare_stream (&es->streams[14], 150, 0, 200, 150, 230);
+ init_flare_stream (&es->streams[15], 150, 0, -130, 190, 250);
+
+ {
+ double spin_speed = 0.5 * global_speed;
+ double wander_speed = 0.02 * global_speed;
+ double spin_accel = 1.1;
+
+ es->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ True);
+ es->trackball = gltrackball_init (True);
+ }
+}
+
+ENTRYPOINT void
+free_stream (ModeInfo * mi)
+{
+ stream_configuration *es = &ess[MI_SCREEN(mi)];
+ int i;
+
+ if (es->glx_context) {
+ glXMakeCurrent (MI_DISPLAY(mi), MI_WINDOW(mi), *(es->glx_context));
+
+ for (i = 0; i < es->num_streams; i++) {
+ free (es->streams[i].flares);
+ glDeleteTextures (1, &es->streams[i].flare_tex);
+ }
+
+ free (es->streams);
+ }
+}
+
+
+static void inverse_matrix (float m[16]) {
+ double a,b,c,d,e,f,g,h,i,j,k,l;
+ register double dW;
+
+ a = m[ 0]; b = m[ 1]; c = m[ 2];
+ d = m[ 4]; e = m[ 5]; f = m[ 6];
+ g = m[ 8]; h = m[ 9]; i = m[10];
+ j = m[12]; k = m[13]; l = m[14];
+
+ dW = 1.0 / (a * (e * i - f * h)
+ - (b * (d * i - f * g)
+ + c * (e * g - d * h)));
+
+ m[ 0]= (float)((e * i - f * h) * dW);
+ m[ 1]= (float)((c * h - b * i) * dW);
+ m[ 2]= (float)((b * f - c * e) * dW);
+
+ m[ 4]= (float)((f * g - d * i) * dW);
+ m[ 5]= (float)((a * i - c * g) * dW);
+ m[ 6]= (float)((c * d - a * f) * dW);
+
+ m[ 8]= (float)((d * h - e * g) * dW);
+ m[ 9]= (float)((b * g - a * h) * dW);
+ m[10]= (float)((a * e - b * d) * dW);
+
+ m[12]= (float)((e * (g * l - i * j)
+ + f * (h * j - g * k)
+ - d * (h * l - i * k)) * dW);
+ m[13]= (float)((a * (h * l - i * k)
+ + b * (i * j - g * l)
+ + c * (g * k - h * j)) * dW);
+ m[14]= (float)((b * (d * l - f * j)
+ + c * (e * j - d * k)
+ - a * (e * l - f * k)) * dW);
+}
+
+ENTRYPOINT void
+draw_stream (ModeInfo *mi)
+{
+ stream_configuration *es = &ess[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ streamtime current_time;
+ float cur_time;
+ int i;
+ float alpha = 1.0;
+ Vector vx;
+ Vector vy;
+ GLfloat m[4*4];
+
+ if (!es->glx_context)
+ return;
+
+ gettime (&current_time);
+
+ cur_time = (float)(GETSECS(current_time) * 1000 + GETMSECS(current_time) - es->start_time) / 1000.0;
+ cur_time *= global_speed;
+
+ glXMakeCurrent (MI_DISPLAY(mi), MI_WINDOW(mi), *(es->glx_context));
+
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glMatrixMode (GL_PROJECTION);
+ glLoadIdentity ();
+ glFrustum (-.6f, .6f, -.45f, .45f, 1, 1000);
+
+ glMatrixMode (GL_MODELVIEW);
+ glLoadIdentity ();
+
+ glEnable (GL_LIGHTING);
+ glEnable (GL_TEXTURE_2D);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE);
+ glDisable (GL_CULL_FACE);
+ glDisable (GL_DEPTH_TEST);
+ glDepthMask (0);
+
+ glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD);
+
+ glTranslatef (0, 0, -300);
+ glRotatef (cur_time * 30, 1, 0, 0);
+ glRotatef (30 * sin(cur_time / 3) + 10, 0, 0, 1);
+
+ {
+ double x, y, z;
+ get_position (es->rot, &x, &y, &z, !es->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 8,
+ (z - 0.5) * 15);
+
+ gltrackball_rotate (es->trackball);
+
+ get_rotation (es->rot, &x, &y, &z, !es->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ if (cur_time > change_time1)
+ {
+ if (cur_time > change_time2)
+ {
+ glRotatef (90, 0, 1, 0);
+
+ if (cur_time > change_time3)
+ es->start_time = GETSECS(current_time) * 1000 + GETMSECS(current_time) - 5000;
+ }
+ else
+ {
+ glRotatef (180, 0, 1, 0);
+ }
+ }
+
+ glEnable ( GL_FOG);
+ glFogf (GL_FOG_START, 200);
+ glFogf (GL_FOG_END, 500);
+ glFogf (GL_FOG_MODE, GL_LINEAR);
+
+ glGetFloatv (GL_MODELVIEW_MATRIX, m);
+
+ inverse_matrix (m);
+
+ vx.x = m[0] * 10;
+ vx.y = m[1] * 10;
+ vx.z = m[2] * 10;
+
+ vy.x = m[4] * 10;
+ vy.y = m[5] * 10;
+ vy.z = m[6] * 10;
+
+ mi->polygon_count = 0;
+
+ for (i = 0; i != es->num_streams; i++)
+ {
+ mi->polygon_count += es->streams[i].num_flares;
+ render_flare_stream (&es->streams[i], cur_time, &vx, &vy, alpha);
+ }
+
+ glDisable (GL_TEXTURE_2D);
+ glDisable (GL_LIGHTING);
+ glDisable (GL_FOG);
+ glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers (dpy, window);
+}
+
+XSCREENSAVER_MODULE_2("EnergyStream", energystream, stream)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/energystream.man b/hacks/glx/energystream.man
new file mode 100644
index 0000000..c2591f3
--- /dev/null
+++ b/hacks/glx/energystream.man
@@ -0,0 +1,56 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+energystream - a flow of particles which form an energy stream
+.SH SYNOPSIS
+.B energystream
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-no-wander]
+[\-no-spin]
+[\-fps]
+.SH DESCRIPTION
+Draws a set of flowing particles with camera flying around and through it.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-wander | \-no-wander
+Whether the camera should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the camera should spin.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2016 by Eugene Sandulenko. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Eugene Sandulenko.
diff --git a/hacks/glx/engine.c b/hacks/glx/engine.c
new file mode 100644
index 0000000..0f39b8d
--- /dev/null
+++ b/hacks/glx/engine.c
@@ -0,0 +1,1006 @@
+/*
+ * engine.c - GL representation of a 4 stroke engine
+ *
+ * version 2.00
+ *
+ * Copyright (C) 2001 Ben Buxton (bb@cactii.net)
+ * modified by Ed Beroset (beroset@mindspring.com)
+ * new to 2.0 version is:
+ * - command line argument to specify number of cylinders
+ * - command line argument to specify included angle of engine
+ * - removed broken command line argument to specify rotation speed
+ * - included crankshaft shapes and firing orders for real engines
+ * verified using the Bosch _Automotive Handbook_, 5th edition, pp 402,403
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*suppressRotationAnimation: True\n" \
+ "*titleFont: -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n" \
+
+# define free_engine 0
+# define release_engine 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#include "texfont.h"
+#include "rotator.h"
+#include "gltrackball.h"
+
+/* lifted from lament.c */
+#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+
+#ifdef USE_GL
+
+#define DEF_ENGINE "(none)"
+#define DEF_TITLES "False"
+#define DEF_SPIN "True"
+#define DEF_MOVE "True"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+static char *which_engine;
+static int move;
+static int spin;
+static Bool do_titles;
+
+static XrmOptionDescRec opts[] = {
+ {"-engine", ".engine.engine", XrmoptionSepArg, DEF_ENGINE },
+ {"-move", ".engine.move", XrmoptionNoArg, "True" },
+ {"+move", ".engine.move", XrmoptionNoArg, "False" },
+ {"-spin", ".engine.spin", XrmoptionNoArg, "True" },
+ {"+spin", ".engine.spin", XrmoptionNoArg, "False" },
+ { "-titles", ".engine.titles", XrmoptionNoArg, "True" },
+ { "+titles", ".engine.titles", XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+ {&which_engine, "engine", "Engine", DEF_ENGINE, t_String},
+ {&move, "move", "Move", DEF_MOVE, t_Bool},
+ {&spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_titles, "titles", "Titles", DEF_TITLES, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt engine_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct engine_description =
+{"engine", "init_engine", "draw_engine", NULL,
+ "draw_engine", "init_engine", NULL, &engine_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "A four stroke engine", 0, NULL};
+
+#endif
+
+/* these defines are used to provide symbolic means
+ * by which to refer to various portions or multiples
+ * of a cyle in degrees
+ */
+#define HALFREV 180
+#define ONEREV 360
+#define TWOREV 720
+
+#define MOVE_MULT 0.05
+
+#define RAND_RANGE(min, max) ((min) + (max - min) * f_rand())
+
+
+typedef struct {
+ GLXContext *glx_context;
+ Window window;
+ GLfloat x, y, z; /* position */
+ GLfloat dx, dy, dz; /* position */
+ GLfloat an1, an2, an3; /* internal angle */
+ GLfloat nx, ny, nz; /* spin vector */
+ GLfloat a; /* spin angle */
+ GLfloat da; /* spin speed */
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+ texture_font_data *font_data;
+ char *engine_name;
+ int engineType;
+ int movepaused;
+
+ float crankOffset;
+ float crankWidth;
+
+ int win_w, win_h;
+
+ float sin_table[TWOREV];
+ float cos_table[TWOREV];
+ float tan_table[TWOREV];
+
+ GLfloat boom_red[4];
+ GLfloat boom_lpos[4];
+ GLfloat boom_d, boom_wd;
+ int boom_time;
+
+ GLfloat viewer[3], lookat[3];
+
+ int display_a;
+ GLfloat ln[730], yp[730], ang[730];
+ int ln_init;
+ int lastPlug;
+
+ GLuint shaft_list, piston_list;
+ int shaft_polys, piston_polys;
+
+} Engine;
+
+static Engine *engine = NULL;
+
+static const GLfloat lightpos[] = {7.0, 7.0, 12, 1.0};
+static const GLfloat light_sp[] = {0.8, 0.8, 0.8, 0.5};
+static const GLfloat red[] = {1.0, 0, 0, 1.0};
+static const GLfloat green[] = {0.0, 1, 0, 1.0};
+static const GLfloat blue[] = {0, 0, 1, 1.0};
+static const GLfloat white[] = {1.0, 1, 1, 1.0};
+static const GLfloat yellow_t[] = {1, 1, 0, 0.4};
+
+static GLvoid normal(GLfloat [], GLfloat [], GLfloat [],
+ GLfloat *, GLfloat *, GLfloat *);
+
+/*
+ * this table represents both the firing order and included angle of engine.
+ * To simplify things, we always number from 0 starting at the flywheel and
+ * moving down the crankshaft toward the back of the engine. This doesn't
+ * always match manufacturer's schemes. For example, the Porsche 911 engine
+ * is a flat six with the following configuration (Porsche's numbering):
+ *
+ * 3 2 1
+ * |= firing order is 1-6-2-4-3-5 in this diagram
+ * 6 5 4
+ *
+ * We renumber these using our scheme but preserve the effective firing order:
+ *
+ * 0 2 4
+ * |= firing order is 4-1-2-5-0-3 in this diagram
+ * 1 3 5
+ *
+ * To avoid going completely insane, we also reorder these so the newly
+ * renumbered cylinder 0 is always first: 0-3-4-1-2-5
+ *
+ * For a flat 6, the included angle is 180 degrees (0 would be a inline
+ * engine). Because these are all four-stroke engines, each piston goes
+ * through 720 degrees of rotation for each time the spark plug sparks,
+ * so in this case, we would use the following angles:
+ *
+ * cylinder firing order angle
+ * -------- ------------ -----
+ * 0 0 0
+ * 1 3 360
+ * 2 4 240
+ * 3 1 600
+ * 4 2 480
+ * 5 5 120
+ *
+ */
+
+typedef struct
+{
+ int cylinders;
+ int includedAngle;
+ int pistonAngle[12]; /* twelve cylinders should suffice... */
+ int speed; /* step size in degrees for engine speed */
+ const char *engineName; /* currently unused */
+} engine_type;
+
+static const engine_type engines[] = {
+ { 3, 0, { 0, 240, 480, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0 }, 12,
+ "Honda Insight" },
+ { 4, 0, { 0, 180, 540, 360, 0, 0,
+ 0, 0, 0, 0, 0, 0 }, 12,
+ "BMW M3" },
+ { 4, 180, { 0, 360, 180, 540, 0, 0,
+ 0, 0, 0, 0, 0, 0 }, 12,
+ "VW Beetle" },
+ { 5, 0, { 0, 576, 144, 432, 288, 0,
+ 0, 0, 0, 0, 0, 0 }, 12,
+ "Audi Quattro" },
+ { 6, 0, { 0, 240, 480, 120, 600, 360,
+ 0, 0, 0, 0, 0, 0 }, 12,
+ "BMW M5" },
+ { 6, 90, { 0, 360, 480, 120, 240, 600,
+ 0, 0, 0, 0, 0, 0 }, 12,
+ "Subaru XT" },
+ { 6, 180, { 0, 360, 240, 600, 480, 120,
+ 0, 0, 0, 0, 0, 0 }, 12,
+ "Porsche 911" },
+ { 8, 90, { 0, 450, 90, 180, 270, 360,
+ 540, 630, 0, 0, 0, 0 }, 15,
+ "Corvette Z06" },
+ {10, 90, { 0, 72, 432, 504, 288, 360,
+ 144, 216, 576, 648, 0, 0 }, 12,
+ "Dodge Viper" },
+ {12, 60, { 0, 300, 240, 540, 480, 60,
+ 120, 420, 600, 180, 360, 660 }, 12,
+ "Jaguar XKE" },
+};
+
+/* this define is just a little shorter way of referring to members of the
+ * table above
+ */
+#define ENG engines[e->engineType]
+
+/* given a number of cylinders and an included angle, finds matching engine */
+static int
+find_engine(char *name)
+{
+ unsigned int i;
+ char *s;
+
+ if (!name || !*name || !strcasecmp (name, "(none)"))
+ return (random() % countof(engines));
+
+ for (s = name; *s; s++)
+ if (*s == '-' || *s == '_') *s = ' ';
+
+ for (i = 0; i < countof(engines); i++) {
+ if (!strcasecmp(name, engines[i].engineName))
+ return i;
+ }
+
+ fprintf (stderr, "%s: unknown engine type \"%s\"\n", progname, name);
+ fprintf (stderr, "%s: available models are:\n", progname);
+ for (i = 0; i < countof(engines); i++) {
+ fprintf (stderr, "\t %-13s (%d cylinders",
+ engines[i].engineName, engines[i].cylinders);
+ if (engines[i].includedAngle == 0)
+ fprintf (stderr, ")\n");
+ else if (engines[i].includedAngle == 180)
+ fprintf (stderr, ", flat)\n");
+ else
+ fprintf (stderr, ", V)\n");
+ }
+ exit(1);
+}
+
+/* we use trig tables to speed things up - 200 calls to sin()
+ in one frame can be a bit harsh..
+*/
+
+static void make_tables(Engine *e)
+{
+ int i;
+ float f;
+
+ f = ONEREV / (M_PI * 2);
+ for (i = 0 ; i < TWOREV ; i++) {
+ e->sin_table[i] = sin(i/f);
+ }
+ for (i = 0 ; i < TWOREV ; i++) {
+ e->cos_table[i] = cos(i/f);
+ }
+ for (i = 0 ; i < TWOREV ; i++) {
+ e->tan_table[i] = tan(i/f);
+ }
+}
+
+/* if inner and outer are the same, we draw a cylinder, not a tube */
+/* for a tube, endcaps is 0 (none), 1 (left), 2 (right) or 3(both) */
+/* angle is how far around the axis to go (up to 360) */
+
+static int cylinder (Engine *e, GLfloat x, GLfloat y, GLfloat z,
+ float length, float outer, float inner, int endcaps, int sang, int eang)
+{
+ int polys = 0;
+ int a; /* current angle around cylinder */
+ int b = 0; /* previous */
+ int angle, norm, step, sangle;
+ float z1, y1, z2, y2, ex=0;
+ float Z1, Y1, Z2, Y2, xl;
+ GLfloat y2c[TWOREV], z2c[TWOREV];
+ int nsegs, tube = 0;
+
+ glPushMatrix();
+ nsegs = outer*(MAX(e->win_w, e->win_h)/200);
+ nsegs = MAX(nsegs, 6);
+ nsegs = MAX(nsegs, 40);
+ if (nsegs % 2)
+ nsegs += 1;
+ sangle = sang;
+ angle = eang;
+ z1 = e->cos_table[sangle]*outer+z; y1 = e->sin_table[sangle] * outer+y;
+ Z1 = e->cos_table[sangle] * inner+z; Y1 = e->sin_table[sangle]*inner+y ;
+ Z2 = z;
+ Y2 = y;
+ xl = x + length;
+ if (inner < outer && endcaps < 3) tube = 1;
+ step = ONEREV/nsegs;
+
+ glBegin(GL_QUADS);
+ for (a = sangle ; a <= angle || b <= angle ; a+= step) {
+ y2=outer*(float)e->sin_table[a]+y;
+ z2=outer*(float)e->cos_table[a]+z;
+ if (endcaps) {
+ y2c[a] = y2;
+ z2c[a] = z2; /* cache for later */
+ }
+ if (tube) {
+ Y2=inner*(float)e->sin_table[a]+y;
+ Z2=inner*(float)e->cos_table[a]+z;
+ }
+ glNormal3f(0, y1, z1);
+ glVertex3f(x,y1,z1);
+ glVertex3f(xl,y1,z1);
+ glNormal3f(0, y2, z2);
+ glVertex3f(xl,y2,z2);
+ glVertex3f(x,y2,z2);
+ polys++;
+ if (a == sangle && angle - sangle < ONEREV) {
+ if (tube)
+ glVertex3f(x, Y1, Z1);
+ else
+ glVertex3f(x, y, z);
+ glVertex3f(x, y1, z1);
+ glVertex3f(xl, y1, z1);
+ if (tube)
+ glVertex3f(xl, Z1, Z1);
+ else
+ glVertex3f(xl, y, z);
+ polys++;
+ }
+ if (tube) {
+ if (endcaps != 1) {
+ glNormal3f(-1, 0, 0); /* left end */
+ glVertex3f(x, y1, z1);
+ glVertex3f(x, y2, z2);
+ glVertex3f(x, Y2, Z2);
+ glVertex3f(x, Y1, Z1);
+ polys++;
+ }
+
+ glNormal3f(0, -Y1, -Z1); /* inner surface */
+ glVertex3f(x, Y1, Z1);
+ glVertex3f(xl, Y1, Z1);
+ glNormal3f(0, -Y2, -Z2);
+ glVertex3f(xl, Y2, Z2);
+ glVertex3f(x, Y2, Z2);
+ polys++;
+
+ if (endcaps != 2) {
+ glNormal3f(1, 0, 0); /* right end */
+ glVertex3f(xl, y1, z1);
+ glVertex3f(xl, y2, z2);
+ glVertex3f(xl, Y2, Z2);
+ glVertex3f(xl, Y1, Z1);
+ polys++;
+ }
+ }
+
+ z1=z2; y1=y2;
+ Z1=Z2; Y1=Y2;
+ b = a;
+ }
+ glEnd();
+
+ if (angle - sangle < ONEREV) {
+ GLfloat nx, ny, nz;
+ GLfloat v1[3], v2[3], v3[3];
+ v1[0] = x; v1[1] = y; v1[2] = z;
+ v2[0] = x; v2[1] = y1; v2[2] = z1;
+ v3[0] = xl; v3[1] = y1; v3[2] = z1;
+ normal(&v2[0], &v1[0], &v3[0], &nx, &ny, &nz);
+ glBegin(GL_QUADS);
+ glNormal3f(nx, ny, nz);
+ glVertex3f(x, y, z);
+ glVertex3f(x, y1, z1);
+ glVertex3f(xl, y1, z1);
+ glVertex3f(xl, y, z);
+ polys++;
+ glEnd();
+ }
+ if (endcaps) {
+ GLfloat end, start;
+ if (tube) {
+ if (endcaps == 1) {
+ end = 0;
+ start = 0;
+ } else if (endcaps == 2) {
+ start = end = length+0.01;
+ } else {
+ end = length+0.02; start = -0.01;
+ }
+ norm = (ex == length+0.01) ? -1 : 1;
+ } else {
+ end = length;
+ start = 0;
+ norm = -1;
+ }
+
+ for(ex = start ; ex <= end ; ex += length) {
+ z1 = outer*e->cos_table[sangle]+z;
+ y1 = y+e->sin_table[sangle]*outer;
+ step = ONEREV/nsegs;
+ glBegin(GL_TRIANGLES);
+ b = 0;
+ for (a = sangle ; a <= angle || b <= angle; a+= step) {
+ glNormal3f(norm, 0, 0);
+ glVertex3f(x+ex,y, z);
+ glVertex3f(x+ex,y1,z1);
+ glVertex3f(x+ex,y2c[a],z2c[a]);
+ polys++;
+ y1 = y2c[a]; z1 = z2c[a];
+ b = a;
+ }
+ if (!tube) norm = 1;
+ glEnd();
+ }
+ }
+ glPopMatrix();
+ return polys;
+}
+
+/* this is just a convenience function to make a solid rod */
+static int rod (Engine *e, GLfloat x, GLfloat y, GLfloat z, float length, float diameter)
+{
+ return cylinder(e, x, y, z, length, diameter, diameter, 3, 0, ONEREV);
+}
+
+static GLvoid normal(GLfloat v1[], GLfloat v2[], GLfloat v3[],
+ GLfloat *nx, GLfloat *ny, GLfloat *nz)
+{
+ GLfloat x, y, z, X, Y, Z;
+
+ x = v2[0]-v1[0];
+ y = v2[1]-v1[1];
+ z = v2[2]-v1[2];
+ X = v3[0]-v1[0];
+ Y = v3[1]-v1[1];
+ Z = v3[2]-v1[2];
+
+ *nx = Y*z - Z*y;
+ *ny = Z*x - X*z;
+ *nz = X*y - Y*x;
+
+}
+
+
+
+static int Rect(GLfloat x, GLfloat y, GLfloat z, GLfloat w, GLfloat h,
+ GLfloat t)
+{
+ int polys = 0;
+ GLfloat yh;
+ GLfloat xw;
+ GLfloat zt;
+
+ yh = y+h; xw = x+w; zt = z - t;
+
+ glBegin(GL_QUADS); /* front */
+ glNormal3f(0, 0, 1);
+ glVertex3f(x, y, z);
+ glVertex3f(x, yh, z);
+ glVertex3f(xw, yh, z);
+ glVertex3f(xw, y, z);
+ polys++;
+ /* back */
+ glNormal3f(0, 0, -1);
+ glVertex3f(x, y, zt);
+ glVertex3f(x, yh, zt);
+ glVertex3f(xw, yh, zt);
+ glVertex3f(xw, y, zt);
+ polys++;
+ /* top */
+ glNormal3f(0, 1, 0);
+ glVertex3f(x, yh, z);
+ glVertex3f(x, yh, zt);
+ glVertex3f(xw, yh, zt);
+ glVertex3f(xw, yh, z);
+ polys++;
+ /* bottom */
+ glNormal3f(0, -1, 0);
+ glVertex3f(x, y, z);
+ glVertex3f(x, y, zt);
+ glVertex3f(xw, y, zt);
+ glVertex3f(xw, y, z);
+ polys++;
+ /* left */
+ glNormal3f(-1, 0, 0);
+ glVertex3f(x, y, z);
+ glVertex3f(x, y, zt);
+ glVertex3f(x, yh, zt);
+ glVertex3f(x, yh, z);
+ polys++;
+ /* right */
+ glNormal3f(1, 0, 0);
+ glVertex3f(xw, y, z);
+ glVertex3f(xw, y, zt);
+ glVertex3f(xw, yh, zt);
+ glVertex3f(xw, yh, z);
+ polys++;
+ glEnd();
+ return polys;
+}
+
+static int makepiston(Engine *e)
+{
+ int polys = 0;
+ GLfloat colour[] = {0.6, 0.6, 0.6, 1.0};
+
+ /* if (e->piston_list) glDeleteLists(1, e->piston_list); */
+ if (! e->piston_list) e->piston_list = glGenLists(1);
+ glNewList(e->piston_list, GL_COMPILE);
+ glRotatef(90, 0, 0, 1);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, colour);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, colour);
+ glMateriali(GL_FRONT, GL_SHININESS, 20);
+ polys += cylinder(e, 0, 0, 0, 2, 1, 0.7, 2, 0, ONEREV); /* body */
+ colour[0] = colour[1] = colour[2] = 0.2;
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, colour);
+ polys += cylinder(e, 1.6, 0, 0, 0.1, 1.05, 1.05, 0, 0, ONEREV); /* ring */
+ polys += cylinder(e, 1.8, 0, 0, 0.1, 1.05, 1.05, 0, 0, ONEREV); /* ring */
+ glEndList();
+ return polys;
+}
+
+static int CrankBit(Engine *e, GLfloat x)
+{
+ int polys = 0;
+ polys += Rect(x, -1.4, 0.5, 0.2, 1.8, 1);
+ polys += cylinder(e, x, -0.5, 0, 0.2, 2, 2, 1, 60, 120);
+ return polys;
+}
+
+static int boom(Engine *e, GLfloat x, GLfloat y, int s)
+{
+ int polys = 0;
+ int flameOut = 720/ENG.speed/ENG.cylinders;
+
+ if (e->boom_time == 0 && s) {
+ e->boom_red[0] = e->boom_red[1] = 0;
+ e->boom_d = 0.05;
+ e->boom_time++;
+ glEnable(GL_LIGHT1);
+ } else if (e->boom_time == 0 && !s) {
+ return polys;
+ } else if (e->boom_time >= 8 && e->boom_time < flameOut && !s) {
+ e->boom_time++;
+ e->boom_red[0] -= 0.2; e->boom_red[1] -= 0.1;
+ e->boom_d-= 0.04;
+ } else if (e->boom_time >= flameOut) {
+ e->boom_time = 0;
+ glDisable(GL_LIGHT1);
+ return polys;
+ } else {
+ e->boom_red[0] += 0.2; e->boom_red[1] += 0.1;
+ e->boom_d += 0.04;
+ e->boom_time++;
+ }
+ e->boom_lpos[0] = x-e->boom_d; e->boom_lpos[1] = y;
+ glLightfv(GL_LIGHT1, GL_POSITION, e->boom_lpos);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, e->boom_red);
+ glLightfv(GL_LIGHT1, GL_SPECULAR, e->boom_red);
+ glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 1.3);
+ glLighti(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 0);
+
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, e->boom_red);
+ e->boom_wd = e->boom_d*3;
+ if (e->boom_wd > 0.7) e->boom_wd = 0.7;
+ glEnable(GL_BLEND);
+ glDepthMask(GL_FALSE);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ polys += rod(e, x, y, 0, e->boom_d, e->boom_wd);
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ return polys;
+}
+
+static int display(ModeInfo *mi)
+{
+ Engine *e = &engine[MI_SCREEN(mi)];
+ int polys = 0;
+ GLfloat zb, yb;
+ float rightSide;
+ int half;
+ int sides;
+ int j, b;
+
+ glEnable(GL_LIGHTING);
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity();
+ gluLookAt(e->viewer[0], e->viewer[1], e->viewer[2],
+ e->lookat[0], e->lookat[1], e->lookat[2],
+ 0.0, 1.0, 0.0);
+ glPushMatrix();
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, light_sp);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, light_sp);
+
+ if (move) {
+ double x, y, z;
+ get_position (e->rot, &x, &y, &z, !e->button_down_p);
+ glTranslatef(x*16-9, y*14-7, z*16-10);
+ }
+
+ if (spin) {
+ double x, y, z;
+
+ gltrackball_rotate (e->trackball);
+
+ get_rotation(e->rot, &x, &y, &z, !e->button_down_p);
+ glRotatef(x*ONEREV, 1.0, 0.0, 0.0);
+ glRotatef(y*ONEREV, 0.0, 1.0, 0.0);
+ glRotatef(x*ONEREV, 0.0, 0.0, 1.0);
+ }
+
+/* So the rotation appears around the centre of the engine */
+ glTranslatef(-5, 0, 0);
+
+/* crankshaft */
+ glPushMatrix();
+ glRotatef(e->display_a, 1, 0, 0);
+ glCallList(e->shaft_list);
+ polys += e->shaft_polys;
+ glPopMatrix();
+
+ /* init the ln[] matrix for speed */
+ if (e->ln_init == 0) {
+ for (e->ln_init = 0 ; e->ln_init < countof(e->sin_table) ; e->ln_init++) {
+ zb = e->sin_table[e->ln_init];
+ yb = e->cos_table[e->ln_init];
+ /* y ordinate of piston */
+ e->yp[e->ln_init] = yb + sqrt(25 - (zb*zb));
+ /* length of rod */
+ e->ln[e->ln_init] = sqrt(zb*zb + (yb-e->yp[e->ln_init])*(yb-e->yp[e->ln_init]));
+ /* angle of connecting rod */
+ e->ang[e->ln_init] = asin(zb/5)*57;
+ e->ang[e->ln_init] *= -1;
+ }
+ }
+
+ glPushMatrix();
+ sides = (ENG.includedAngle == 0) ? 1 : 2;
+ for (half = 0; half < sides; half++, glRotatef(ENG.includedAngle,1,0,0))
+ {
+ /* pistons */
+ /* glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, white); */
+ for (j = 0; j < ENG.cylinders; j += sides)
+ {
+ b = (e->display_a + ENG.pistonAngle[j+half]) % ONEREV;
+ glPushMatrix();
+ glTranslatef(e->crankWidth/2 + e->crankOffset*(j+half), e->yp[b]-0.3, 0);
+ glCallList(e->piston_list);
+ polys += e->piston_polys;
+ glPopMatrix();
+ }
+ /* spark plugs */
+ glPushMatrix();
+ glRotatef(90, 0, 0, 1);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
+ for (j = 0; j < ENG.cylinders; j += sides)
+ {
+ polys += cylinder(e, 8.5, -e->crankWidth/2-e->crankOffset*(j+half), 0,
+ 0.5, 0.4, 0.3, 1, 0, ONEREV);
+ }
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, white);
+ for (j = 0; j < ENG.cylinders; j += sides)
+ {
+ polys += rod(e, 8, -e->crankWidth/2-e->crankOffset*(j+half), 0, 0.5, 0.2);
+ polys += rod(e, 9, -e->crankWidth/2-e->crankOffset*(j+half), 0, 1, 0.15);
+ }
+
+ /* rod */
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
+ for (j = 0; j < ENG.cylinders; j += sides)
+ {
+ b = (e->display_a+HALFREV+ENG.pistonAngle[j+half]) % TWOREV;
+ glPushMatrix();
+ glRotatef(e->ang[b], 0, 1, 0);
+ polys += rod(e,
+ -e->cos_table[b],
+ -e->crankWidth/2-e->crankOffset*(j+half),
+ -e->sin_table[b],
+ e->ln[b], 0.2);
+ glPopMatrix();
+ }
+ glPopMatrix();
+
+ /* engine block */
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, yellow_t);
+ glEnable(GL_BLEND);
+ glDepthMask(GL_FALSE);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ rightSide = (sides > 1) ? 0 : 1.6;
+ /* left plate */
+ polys += Rect(-e->crankWidth/2, -0.5, 1, 0.2, 9, 2);
+ /* right plate */
+ polys += Rect(0.3+e->crankOffset*ENG.cylinders-rightSide, -0.5, 1, 0.2, 9, 2);
+ /* head plate */
+ polys += Rect(-e->crankWidth/2+0.2, 8.3, 1,
+ e->crankWidth/2+0.1+e->crankOffset*ENG.cylinders-rightSide, 0.2, 2);
+ /* front rail */
+ polys += Rect(-e->crankWidth/2+0.2, 3, 1,
+ e->crankWidth/2+0.1+e->crankOffset*ENG.cylinders-rightSide, 0.2, 0.2);
+ /* back rail */
+ polys += Rect(-e->crankWidth/2+0.2, 3, -1+0.2,
+ e->crankWidth/2+0.1+e->crankOffset*ENG.cylinders-rightSide, 0.2, 0.2);
+ /* plates between cylinders */
+ for (j=0; j < ENG.cylinders - (sides == 1); j += sides)
+ polys += Rect(0.4+e->crankWidth+e->crankOffset*(j-half), 3, 1, 1, 5.3, 2);
+ glDepthMask(GL_TRUE);
+ }
+ glPopMatrix();
+
+ /* see which of our plugs should fire now, if any */
+ for (j = 0; j < ENG.cylinders; j++)
+ {
+ if (0 == ((e->display_a + ENG.pistonAngle[j]) % TWOREV))
+ {
+ glPushMatrix();
+ if (j & 1)
+ glRotatef(ENG.includedAngle,1,0,0);
+ glRotatef(90, 0, 0, 1);
+ polys += boom(e, 8, -e->crankWidth/2-e->crankOffset*j, 1);
+ e->lastPlug = j;
+ glPopMatrix();
+ }
+ }
+
+ if (e->lastPlug != j)
+ {
+ /* this code causes the last plug explosion to dim gradually */
+ if (e->lastPlug & 1)
+ glRotatef(ENG.includedAngle, 1, 0, 0);
+ glRotatef(90, 0, 0, 1);
+ polys += boom(e, 8, -e->crankWidth/2-e->crankOffset*e->lastPlug, 0);
+ }
+ glDisable(GL_BLEND);
+
+ e->display_a += ENG.speed;
+ if (e->display_a >= TWOREV)
+ e->display_a = 0;
+ glPopMatrix();
+ glFlush();
+ return polys;
+}
+
+static int makeshaft (Engine *e)
+{
+ int polys = 0;
+ int j;
+ float crankThick = 0.2;
+ float crankDiam = 0.3;
+
+ /* if (e->shaft_list) glDeleteLists(1, e->shaft_list); */
+ if (! e->shaft_list) e->shaft_list = glGenLists(1);
+ glNewList(e->shaft_list, GL_COMPILE);
+
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
+ /* draw the flywheel */
+ polys += cylinder(e, -2.5, 0, 0, 1, 3, 2.5, 0, 0, ONEREV);
+ polys += Rect(-2, -0.3, 2.8, 0.5, 0.6, 5.6);
+ polys += Rect(-2, -2.8, 0.3, 0.5, 5.6, 0.6);
+
+ /* now make each of the shaft bits between the cranks,
+ * starting from the flywheel end which is at X-coord 0.
+ * the first cranskhaft bit is always 2 units long
+ */
+ polys += rod(e, -2, 0, 0, 2, crankDiam);
+
+ /* Each crank is crankWidth units wide and the total width of a
+ * cylinder assembly is 3.3 units. For inline engines, there is just
+ * a single crank per cylinder width. For other engine
+ * configurations, there is a crank between each pair of adjacent
+ * cylinders on one side of the engine, so the crankOffset length is
+ * halved.
+ */
+ e->crankOffset = 3.3;
+ if (ENG.includedAngle != 0)
+ e->crankOffset /= 2;
+ for (j = 0; j < ENG.cylinders - 1; j++)
+ polys += rod(e,
+ e->crankWidth - crankThick + e->crankOffset*j, 0, 0,
+ e->crankOffset - e->crankWidth + 2 * crankThick, crankDiam);
+ /* the last bit connects to the engine wall on the non-flywheel end */
+ polys += rod(e, e->crankWidth - crankThick + e->crankOffset*j, 0, 0, 0.9, crankDiam);
+
+
+ for (j = 0; j < ENG.cylinders; j++)
+ {
+ glPushMatrix();
+ if (j & 1)
+ glRotatef(HALFREV+ENG.pistonAngle[j]+ENG.includedAngle,1,0,0);
+ else
+ glRotatef(HALFREV+ENG.pistonAngle[j],1,0,0);
+ /* draw wrist pin */
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
+ polys += rod(e, e->crankOffset*j, -1.0, 0.0, e->crankWidth, crankDiam);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
+ /* draw right part of crank */
+ polys += CrankBit(e, e->crankOffset*j);
+ /* draw left part of crank */
+ polys += CrankBit(e, e->crankWidth-crankThick+e->crankOffset*j);
+ glPopMatrix();
+ }
+ glEndList();
+ return polys;
+}
+
+
+ENTRYPOINT void reshape_engine(ModeInfo *mi, int width, int height)
+{
+ Engine *e = &engine[MI_SCREEN(mi)];
+ double h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0, y, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(40, 1/h, 1.5, 70.0);
+ glMatrixMode(GL_MODELVIEW);
+ e->win_h = height;
+ e->win_w = width;
+}
+
+
+ENTRYPOINT void init_engine(ModeInfo *mi)
+{
+ int screen = MI_SCREEN(mi);
+ Engine *e;
+
+ MI_INIT(mi, engine);
+ e = &engine[screen];
+ e->window = MI_WINDOW(mi);
+
+ e->x = e->y = e->z = e->a = e->an1 = e->nx = e->ny = e->nz =
+ e->dx = e->dy = e->dz = e->da = 0;
+
+ if (move) {
+ e->dx = (float)(random() % 1000)/30000;
+ e->dy = (float)(random() % 1000)/30000;
+ e->dz = (float)(random() % 1000)/30000;
+ } else {
+ e->viewer[0] = 0; e->viewer[1] = 2; e->viewer[2] = 18;
+ e->lookat[0] = 0; e->lookat[1] = 0; e->lookat[2] = 0;
+
+ }
+ if (spin) {
+ e->da = (float)(random() % 1000)/125 - 4;
+ e->nx = (float)(random() % 100) / 100;
+ e->ny = (float)(random() % 100) / 100;
+ e->nz = (float)(random() % 100) / 100;
+ }
+
+ {
+ double spin_speed = 0.5;
+ double wander_speed = 0.01;
+
+ e->crankWidth = 1.5;
+ e->boom_red[3] = 0.9;
+ e->boom_lpos[3] = 1;
+
+ e->viewer[2] = 30;
+
+ e->rot = make_rotator (spin ? spin_speed : 0,
+ spin ? spin_speed : 0,
+ spin ? spin_speed : 0,
+ 1.0,
+ move ? wander_speed : 0,
+ True);
+
+ e->trackball = gltrackball_init (True);
+ }
+
+ if (!e->glx_context && /* re-initting breaks print_texture_label */
+ (e->glx_context = init_GL(mi)) != NULL) {
+ reshape_engine(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_NORMALIZE);
+ make_tables(e);
+ e->engineType = find_engine(which_engine);
+
+ if (!e->engine_name)
+ e->engine_name = malloc(200);
+ sprintf (e->engine_name,
+ "%s\n%s%d%s",
+ engines[e->engineType].engineName,
+ (engines[e->engineType].includedAngle == 0 ? "" :
+ engines[e->engineType].includedAngle == 180 ? "Flat " : "V"),
+ engines[e->engineType].cylinders,
+ (engines[e->engineType].includedAngle == 0 ? " Cylinder" : "")
+ );
+
+ e->shaft_polys = makeshaft(e);
+ e->piston_polys = makepiston(e);
+
+ if (!e->font_data)
+ e->font_data = load_texture_font (mi->dpy, "titleFont");
+}
+
+ENTRYPOINT Bool
+engine_handle_event (ModeInfo *mi, XEvent *event)
+{
+ Engine *e = &engine[MI_SCREEN(mi)];
+
+ if (event->xany.type == ButtonPress &&
+ event->xbutton.button == Button1)
+ {
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease &&
+ event->xbutton.button == Button1) {
+ e->movepaused = 0;
+ }
+
+ if (gltrackball_event_handler (event, e->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &e->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ which_engine = NULL; /* randomize */
+ init_engine(mi);
+ return True;
+ }
+
+ return False;
+}
+
+ENTRYPOINT void draw_engine(ModeInfo *mi)
+{
+ Engine *e = &engine[MI_SCREEN(mi)];
+ Window w = MI_WINDOW(mi);
+ Display *disp = MI_DISPLAY(mi);
+
+ if (!e->glx_context)
+ return;
+
+ glXMakeCurrent(disp, w, *(e->glx_context));
+
+
+ mi->polygon_count = display(mi);
+
+ glColor3f (1, 1, 0);
+ if (do_titles)
+ print_texture_label (mi->dpy, e->font_data,
+ mi->xgwa.width, mi->xgwa.height,
+ 1, e->engine_name);
+
+ if(mi->fps_p) do_fps(mi);
+ glFinish();
+ glXSwapBuffers(disp, w);
+}
+
+XSCREENSAVER_MODULE ("Engine", engine)
+
+#endif
diff --git a/hacks/glx/engine.man b/hacks/glx/engine.man
new file mode 100644
index 0000000..af794e5
--- /dev/null
+++ b/hacks/glx/engine.man
@@ -0,0 +1,80 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+engine - draws a 3D four-stroke engine.
+.SH SYNOPSIS
+.B engine
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-engine \fIname\fP]
+[\-delay \fInumber\fP]
+[\-no-move]
+[\-no-spin]
+[\-no-title]
+[\-fps]
+.SH DESCRIPTION
+Draws a simple four-stroke engine that floats around the screen.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-engine \fIname\fP
+What kind of engine to draw. Default: random.
+Known models are:
+"Honda Insight" (3),
+"BMW M3" (4),
+"VW Beetle" (flat 4),
+"Audi Quattro" (5),
+"BMW M5" (6),
+"Subaru XT" (V6),
+"Porsche 911" (flat 6),
+"Corvette Z06" (V8),
+"Dodge Viper" (V10),
+and
+"Jaguar XKE" (V12).
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-move | \-no-move
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the object should spin.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-title | \-no-title
+Whether to display the name of the engine being rendered.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Ben Buxton. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Ben Buxton.
diff --git a/hacks/glx/erase-gl.c b/hacks/glx/erase-gl.c
new file mode 100644
index 0000000..8515dd9
--- /dev/null
+++ b/hacks/glx/erase-gl.c
@@ -0,0 +1,38 @@
+/* Copyright (c) 2017 Dave Odell <dmo2118@gmail.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * xlockmore.c has references to erase_window, but it never calls these when
+ * running OpenGL hacks. Using this in place of regular utils/erase.c saves a
+ * tiny bit of code/disk space with a native X11 build, where everything is
+ * statically linked together.
+ *
+ * (Linux, amd64, CFLAGS='-O2 -g')
+ * Before: -rwxr-xr-x 1 david david 545848 Aug 9 20:42 hilbert
+ * After: -rwxr-xr-x 1 david david 519344 Aug 9 20:41 hilbert
+ *
+ * (Linux, amd64, CFLAGS=-O2)
+ * Before: -rwxr-xr-x 1 david david 150168 Aug 9 20:40 hilbert
+ * After: -rwxr-xr-x 1 david david 141256 Aug 9 20:39 hilbert
+ */
+
+#include "utils.h"
+#include "erase.h"
+
+void
+eraser_free (eraser_state *st)
+{
+}
+
+
+eraser_state *
+erase_window (Display *dpy, Window window, eraser_state *st)
+{
+ return st;
+}
diff --git a/hacks/glx/esper.c b/hacks/glx/esper.c
new file mode 100644
index 0000000..7a0bb0b
--- /dev/null
+++ b/hacks/glx/esper.c
@@ -0,0 +1,2412 @@
+/* esper, Copyright (c) 2017-2018 Jamie Zawinski <jwz@jwz.org>
+ * Enhance 224 to 176. Pull out track right. Center in pull back.
+ * Pull back. Wait a minute. Go right. Stop. Enhance 57 19. Track 45 left.
+ * Gimme a hardcopy right there.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/*
+ The Esper machine has a 4:3 display, about 12" diagonal.
+ The display is overlayed with a 10x7 grid of blue lines.
+ The scene goes approximately like this:
+
+ "Enhance 224 To 176."
+
+ ZM 0000 NS 0000 EW 0000
+
+ The reticle is displayed centered.
+ It moves in 8 steps with 3 frame blur to move to around to grid 1,4.
+
+ ZM 0000 NS 0000 EW 0000
+ ZM 0000 NS 0001 EW 0001
+ ZM 0000 NS 0001 EW 0002
+ ZM 0000 NS 0002 EW 0003
+ ZM 0000 NS 0003 EW 0005
+ ZM 0000 NS 0004 EW 0008
+ ZM 0000 NS 0015 EW 0011
+
+ These numbers appear to have little relation to what we are
+ actually seeing on the screen. Also the same numbers are
+ repeated later when looking at totally different parts of
+ the photograph.
+
+ ZM 0000 NS 0117 EW 0334
+
+ The box appears: 8 steps, final box is 1.5x2.25 at -0.5,4.0.
+
+ ZM 4086 NS 0117 EW 0334
+
+ The box blinks yellow 5x.
+ The image's zoom-and-pan takes 8 steps, with no text on the screen.
+ The zoom is in discreet steps, with flashes.
+ The grid stays the same size the whole time.
+ The flashes look like solarization to blue.
+ When the zoom is finished, there is still no text.
+
+ "Enhance." Goes 4 more ticks down the same hole?
+ "Stop." Moves up a little bit at the end.
+
+ Then with no instructions, it goes 20 ticks by itself, off camera.
+
+ "Move in." 10 ticks.
+ "Stop." (We are looking at a fist in the picture.)
+ "Pull out track right."
+ "Stop." (We are looking at a newspaper.)
+ "Center and pull back."
+ "Stop." (We just passed the round mirror.)
+ "Track 45 right."
+ "Stop."
+ "Center and stop."
+
+ This time there was no grid until it stopped, then the grid showed up.
+ There is video tearing at the bottom.
+
+ "Enhance 34 to 36."
+
+ ZM 0000 NS 0063 EW 0185
+ ZM 0000 NS 0197 EW 0334
+ ZM 3841 NS 0197 EW 0334
+
+ It kind of zooms in to the center wobbly and willy-nilly.
+ We are now looking at a glass.
+
+ "Pan right and pull back." (There is no grid while moving again.)
+ "Stop."
+
+ Ok, at this point, we enter fantasy-land. From here on, the images
+ shown are very high resolution with no noise. And suddenly the
+ UI on the Esper is *way* higher resolution. My theory is that from
+ this point on in the scene, we are not looking at the literal Esper
+ machine, but instead the movie is presenting Decard's perception of
+ it. We're seeing the room, not the photo of the room. The map has
+ become the territory.
+
+ "Enhance 34 to 46."
+
+ ZM 0000 NS 0197 EW 0334
+
+ This has the reticle and box only, no grid, ends with no grid.
+
+ "Pull back."
+ "Wait a minute. Go right."
+ "Stop."
+ Now it's going around the corner or something.
+
+ "Enhance 57 19."
+ This has a reticle then box, but the image started zooming early.
+
+ "Track 45 left."
+ zooms out and moves left
+
+ "Stop." (O hai Zhora.)
+ "Enhance 15 to 23."
+
+ ZM 3852 NS 0197 EW 0334
+
+ "Gimme a hardcopy right there."
+
+ The printer polaroid is WAY lower resolution than the image we see on
+ the "screen" -- in keeping with my theory that we were not seeing the
+ screen.
+
+
+ TODO:
+
+ * There's a glitch at the top/bottom of the texfont textures.
+ * "Pull back" isn't quite symmetric: zoom origin is slightly off.
+ * Maybe display text like "Pull right" and "Stop".
+*/
+
+
+/* Use a small point size to keep it nice and grainy. */
+#if defined(HAVE_COCOA) || defined(HAVE_ANDROID)
+# define TITLE_FONT "OCR A Std 10, Lucida Console 10, Monaco 10"
+#elif 0 /* real X11, XQueryFont() */
+# define TITLE_FONT "-*-courier-bold-r-*-*-*-100-*-*-m-*-*-*"
+#else /* real X11, load_font_retry() */
+# define TITLE_FONT "-*-ocr a std-medium-r-*-*-*-100-*-*-m-*-*-*"
+#endif
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*wireframe: False \n" \
+ "*showFPS: False \n" \
+ "*fpsTop: True \n" \
+ "*useSHM: True \n" \
+ "*titleFont: " TITLE_FONT "\n" \
+ "*desktopGrabber: xscreensaver-getimage -no-desktop %s\n" \
+ "*grabDesktopImages: False \n" \
+ "*chooseRandomImages: True \n" \
+ "*gridColor: #4444FF\n" \
+ "*reticleColor: #FFFF77\n" \
+ "*textColor: #FFFFBB\n" \
+
+# define free_esper 0
+# define refresh_esper 0
+# define release_esper 0
+# include "xlockmore.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#undef RANDSIGN
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+#ifdef USE_GL
+
+#undef SMOOTH
+
+# define DEF_GRID_SIZE "11"
+# define DEF_GRID_THICKNESS "15"
+# define DEF_TITLES "True"
+# define DEF_SPEED "1.0"
+# define DEF_DEBUG "False"
+
+#include "grab-ximage.h"
+#include "texfont.h"
+
+#ifdef HAVE_XSHM_EXTENSION
+# include "xshm.h" /* to get <sys/shm.h> */
+#endif
+
+
+typedef struct {
+ double x, y, w, h;
+} rect;
+
+typedef struct {
+ ModeInfo *mi;
+ unsigned long id; /* unique */
+ char *title; /* the filename of this image */
+ int w, h; /* size in pixels of the image */
+ int tw, th; /* size in pixels of the texture */
+ XRectangle geom; /* where in the image the bits are */
+ Bool loaded_p; /* whether the image has finished loading */
+ Bool used_p; /* whether the image has yet appeared
+ on screen */
+ GLuint texid; /* which texture contains the image */
+ int refcount; /* how many sprites refer to this image */
+} image;
+
+
+typedef enum {
+ BLANK,
+ GRID_ON,
+ IMAGE_LOAD,
+ IMAGE_UNLOAD,
+ IMAGE_FORCE_UNLOAD,
+ REPOSITION,
+ RETICLE_ON,
+ RETICLE_MOVE,
+ BOX_MOVE,
+ IMAGE_ZOOM,
+ MANUAL_RETICLE_ON,
+ MANUAL_RETICLE,
+ MANUAL_BOX_ON,
+ MANUAL_BOX,
+} anim_state;
+
+typedef enum { NEW, IN, FULL, OUT, DEAD } sprite_state;
+typedef enum { IMAGE, RETICLE, BOX, GRID, FLASH, TEXT } sprite_type;
+
+typedef struct {
+ unsigned long id; /* unique */
+ sprite_type type;
+ image *img; /* type = IMAGE */
+ unsigned long text_id; /* type = TEXT */
+ char *text;
+ GLfloat opacity;
+ GLfloat thickness_scale; /* line and image types */
+ Bool throb_p;
+ double start_time; /* when this animation began */
+ double duration; /* lifetime of sprite in seconds; 0 = inf */
+ double fade_duration; /* speed of fade in and fade out */
+ double pause_duration; /* delay before fade-in starts */
+ Bool remain_p; /* pause forever before fade-out */
+ rect from, to, current; /* the journey this image is taking */
+ sprite_state state; /* the state we're in right now */
+ double state_time; /* time of last state change */
+ int frame_count; /* frames since last state change */
+ Bool fatbits_p; /* For image texture rendering */
+ Bool back_p; /* If BOX, zooming out, not in */
+} sprite;
+
+
+typedef struct {
+ GLXContext *glx_context;
+ int nimages; /* how many images are loaded or loading now */
+ image *images[10]; /* pointers to the images */
+
+ int nsprites; /* how many sprites are animating right now */
+ sprite *sprites[100]; /* pointers to the live sprites */
+
+ double now; /* current time in seconds */
+ double dawn_of_time; /* when the program launched */
+ double image_load_time; /* time when we last loaded a new image */
+
+ texture_font_data *font_data;
+
+ int sprite_id, image_id; /* debugging id counters */
+
+ GLfloat grid_color[4], reticle_color[4], text_color[4];
+
+ anim_state anim_state; /* Counters for global animation state, */
+ double anim_start, anim_duration;
+
+ Bool button_down_p;
+
+} esper_state;
+
+static esper_state *sss = NULL;
+
+
+/* Command-line arguments
+ */
+static int grid_size;
+static int grid_thickness;
+
+static Bool do_titles; /* Display image titles. */
+static GLfloat speed;
+static Bool debug_p; /* Be loud and do weird things. */
+
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-titles", ".titles", XrmoptionNoArg, "True" },
+ { "-no-titles", ".titles", XrmoptionNoArg, "False" },
+ { "-debug", ".debug", XrmoptionNoArg, "True" },
+};
+
+static argtype vars[] = {
+ { &grid_size, "gridSize", "GridSize", DEF_GRID_SIZE, t_Int},
+ { &grid_thickness,"gridThickness","GridThickness",DEF_GRID_THICKNESS, t_Int},
+ { &do_titles, "titles", "Titles", DEF_TITLES, t_Bool},
+ { &speed, "speed", "Speed", DEF_SPEED, t_Float},
+ { &debug_p, "debug", "Debug", DEF_DEBUG, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt esper_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Returns the current time in seconds as a double.
+ */
+static double
+double_time (void)
+{
+ struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&now, &tzp);
+# else
+ gettimeofday(&now);
+# endif
+
+ return (now.tv_sec + ((double) now.tv_usec * 0.000001));
+}
+
+static const char *
+state_name (anim_state s)
+{
+ switch (s) {
+ case BLANK: return "BLANK";
+ case GRID_ON: return "GRID_ON";
+ case IMAGE_LOAD: return "IMAGE_LOAD";
+ case IMAGE_UNLOAD: return "IMAGE_UNLOAD";
+ case IMAGE_FORCE_UNLOAD: return "IMAGE_FORCE_UNLOAD";
+ case REPOSITION: return "REPOSITION";
+ case RETICLE_ON: return "RETICLE_ON";
+ case RETICLE_MOVE: return "RETICLE_MOVE";
+ case BOX_MOVE: return "BOX_MOVE";
+ case IMAGE_ZOOM: return "IMAGE_ZOOM";
+ case MANUAL_BOX_ON: return "MANUAL_BOX_ON";
+ case MANUAL_BOX: return "MANUAL_BOX";
+ case MANUAL_RETICLE_ON: return "MANUAL_RETICLE_ON";
+ case MANUAL_RETICLE: return "MANUAL_RETICLE";
+ default: return "UNKNOWN";
+ }
+}
+
+
+static void image_loaded_cb (const char *filename, XRectangle *geom,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure);
+
+
+/* Allocate an image structure and start a file loading in the background.
+ */
+static image *
+alloc_image (ModeInfo *mi)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ image *img = (image *) calloc (1, sizeof (*img));
+
+ img->id = ++ss->image_id;
+ img->loaded_p = False;
+ img->used_p = False;
+ img->mi = mi;
+
+ glGenTextures (1, &img->texid);
+ if (img->texid <= 0) abort();
+
+ ss->image_load_time = ss->now;
+
+ if (wire)
+ image_loaded_cb (0, 0, 0, 0, 0, 0, img);
+ else
+ {
+ /* If possible, load images at much higher resolution than the window,
+ to facilitate deep zooms.
+ */
+ int max_max = 4096; /* ~12 megapixels */
+ int max = 0;
+
+# if defined(HAVE_XSHM_EXTENSION) && \
+ !defined(HAVE_MOBILE) && \
+ !defined(HAVE_COCOA)
+
+ /* Try not to ask for an image larger than the SHM segment size.
+ If XSHM fails in a real-X11 world, it can take a staggeringly long
+ time to transfer the image bits from the server over Xproto -- like,
+ *18 seconds* for 4096 px and 8 seconds for 3072 px on MacOS XQuartz.
+ What madness is this?
+ */
+ unsigned long shmmax = 0;
+
+# if defined(SHMMAX)
+ /* Linux 2.6 defines this to be 0x2000000, but on CentOS 6.9,
+ "sysctl kernel.shmmax" reports a luxurious 0x1000000000. */
+ shmmax = SHMMAX;
+# elif defined(__APPLE__)
+ /* MacOS 10.13 "sysctl kern.sysv.shmmax" is paltry: */
+ shmmax = 0x400000;
+# endif /* !SHMMAX */
+
+ if (shmmax)
+ {
+ /* Roughly, bytes => NxN. b = (n/8)*4n = n*n*4, so n^2 = 2b, so: */
+ unsigned long n = sqrt(shmmax)/2;
+ if (n < max_max)
+ max_max = n;
+ }
+# endif /* HAVE_XSHM_EXTENSION and real X11 */
+
+ glGetIntegerv (GL_MAX_TEXTURE_SIZE, &max);
+ if (max > max_max) max = max_max;
+
+ /* Never ask for an image smaller than the window, even if that
+ will make XSHM fall back to Xproto. */
+ if (max < MI_WIDTH(mi) || max < MI_HEIGHT(mi))
+ max = 0;
+
+ load_texture_async (mi->xgwa.screen, mi->window, *ss->glx_context,
+ max, max, False, img->texid, image_loaded_cb, img);
+ }
+
+ ss->images[ss->nimages++] = img;
+ if (ss->nimages >= countof(ss->images)) abort();
+
+ return img;
+}
+
+
+/* Callback that tells us that the texture has been loaded.
+ */
+static void
+image_loaded_cb (const char *filename, XRectangle *geom,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure)
+{
+ image *img = (image *) closure;
+ ModeInfo *mi = img->mi;
+ int ow, oh;
+ /* esper_state *ss = &sss[MI_SCREEN(mi)]; */
+
+ int wire = MI_IS_WIREFRAME(mi);
+
+ if (wire)
+ {
+ img->w = MI_WIDTH (mi) * (0.5 + frand (1.0));
+ img->h = MI_HEIGHT (mi);
+ img->geom.width = img->w;
+ img->geom.height = img->h;
+ goto DONE;
+ }
+
+ if (image_width == 0 || image_height == 0)
+ exit (1);
+
+ img->w = image_width;
+ img->h = image_height;
+ img->tw = texture_width;
+ img->th = texture_height;
+ img->geom = *geom;
+ img->title = (filename ? strdup (filename) : 0);
+
+ ow = img->geom.width;
+ oh = img->geom.height;
+
+ /* If the image's width doesn't come back as the width of the screen,
+ then the image must have been scaled down (due to insufficient
+ texture memory.) Scale up the coordinates to stretch the image
+ to fill the window.
+ */
+ if (img->w != MI_WIDTH(mi))
+ {
+ double scale = (double) MI_WIDTH(mi) / img->w;
+ img->w *= scale;
+ img->h *= scale;
+ img->tw *= scale;
+ img->th *= scale;
+ img->geom.x *= scale;
+ img->geom.y *= scale;
+ img->geom.width *= scale;
+ img->geom.height *= scale;
+ }
+
+ /* xscreensaver-getimage returns paths relative to the image directory
+ now, so leave the sub-directory part in. Unless it's an absolute path.
+ */
+ if (img->title && img->title[0] == '/')
+ {
+ /* strip filename to part between last "/" and last ".". */
+ char *s = strrchr (img->title, '/');
+ if (s) strcpy (img->title, s+1);
+ s = strrchr (img->title, '.');
+ if (s) *s = 0;
+ }
+
+# if !(__APPLE__ && TARGET_IPHONE_SIMULATOR || !defined(__OPTIMIZE__))
+ if (debug_p)
+# endif
+ fprintf (stderr, "%s: loaded %lu \"%s\" %dx%d\n",
+ progname, img->id, (img->title ? img->title : "(null)"),
+ ow, oh);
+ DONE:
+
+ img->loaded_p = True;
+}
+
+
+
+/* Free the image and texture, after nobody is referencing it.
+ */
+static void
+destroy_image (ModeInfo *mi, image *img)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ Bool freed_p = False;
+ int i;
+
+ if (!img) abort();
+ if (!img->loaded_p) abort();
+ if (!img->used_p) abort();
+ if (img->texid <= 0) abort();
+ if (img->refcount != 0) abort();
+
+ for (i = 0; i < ss->nimages; i++) /* unlink it from the list */
+ if (ss->images[i] == img)
+ {
+ int j;
+ for (j = i; j < ss->nimages-1; j++) /* pull remainder forward */
+ ss->images[j] = ss->images[j+1];
+ ss->images[j] = 0;
+ ss->nimages--;
+ freed_p = True;
+ break;
+ }
+
+ if (!freed_p) abort();
+
+ if (debug_p)
+ fprintf (stderr, "%s: unloaded img %2lu: \"%s\"\n",
+ progname, img->id, (img->title ? img->title : "(null)"));
+
+ if (img->title) free (img->title);
+ glDeleteTextures (1, &img->texid);
+ free (img);
+}
+
+
+/* Return an image to use for a sprite.
+ If it's time for a new one, get a new one.
+ Otherwise, use an old one.
+ Might return 0 if the machine is really slow.
+ */
+static image *
+get_image (ModeInfo *mi)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ image *img = 0;
+ image *loading_img = 0;
+ int i;
+
+ for (i = 0; i < ss->nimages; i++)
+ {
+ image *img2 = ss->images[i];
+ if (!img2) abort();
+ if (!img2->loaded_p)
+ loading_img = img2;
+ else
+ img = img2;
+ }
+
+ /* Make sure that there is always one unused image in the pipe.
+ */
+ if (!img && !loading_img)
+ alloc_image (mi);
+
+ return img;
+}
+
+
+/* Allocate a new sprite and start its animation going.
+ */
+static sprite *
+new_sprite (ModeInfo *mi, sprite_type type)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ image *img = (type == IMAGE ? get_image (mi) : 0);
+ sprite *sp;
+
+ if (type == IMAGE && !img)
+ {
+ /* Oops, no images yet! The machine is probably hurting bad.
+ Let's give it some time before thrashing again. */
+ usleep (250000);
+ return 0;
+ }
+
+ sp = (sprite *) calloc (1, sizeof (*sp));
+ sp->id = ++ss->sprite_id;
+ sp->type = type;
+ sp->start_time = ss->now;
+ sp->state_time = sp->start_time;
+ sp->thickness_scale = 1;
+ sp->throb_p = True;
+ sp->to.x = 0.5;
+ sp->to.y = 0.5;
+ sp->to.w = 1.0;
+ sp->to.h = 1.0;
+
+ if (img)
+ {
+ sp->img = img;
+ sp->img->refcount++;
+ sp->img->used_p = True;
+ sp->duration = 0; /* forever, until further notice */
+ sp->fade_duration = 0.5;
+
+ /* Scale the sprite so that the image bits fill the window. */
+ {
+ double w = MI_WIDTH(mi);
+ double h = MI_HEIGHT(mi);
+ double r;
+ r = ((img->geom.height / (double) img->geom.width) * (w / h));
+ if (r > 1)
+ sp->to.h *= r;
+ else
+ sp->to.w /= r;
+ }
+
+ /* Pan to a random spot */
+ if (sp->to.h > 1)
+ sp->to.y += frand ((sp->to.h - 1) / 2) * RANDSIGN();
+ if (sp->to.w > 1)
+ sp->to.x += frand ((sp->to.w - 1) / 2) * RANDSIGN();
+ }
+
+ sp->from = sp->current = sp->to;
+
+ ss->sprites[ss->nsprites++] = sp;
+ if (ss->nsprites >= countof(ss->sprites)) abort();
+
+ return sp;
+}
+
+
+static sprite *
+copy_sprite (ModeInfo *mi, sprite *old)
+{
+ sprite *sp = new_sprite (mi, (sprite_type) ~0L);
+ int id;
+ double tt = sp->start_time;
+ if (!sp) abort();
+ id = sp->id;
+ memcpy (sp, old, sizeof(*sp));
+ sp->id = id;
+ sp->state = NEW;
+ sp->state_time = sp->start_time = tt;
+ if (sp->img)
+ sp->img->refcount++;
+ return sp;
+}
+
+
+/* Free the given sprite, and decrement the reference count on its image.
+ */
+static void
+destroy_sprite (ModeInfo *mi, sprite *sp)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ Bool freed_p = False;
+ image *img;
+ int i;
+
+ if (!sp) abort();
+ if (sp->state != DEAD) abort();
+ img = sp->img;
+
+ if (sp->type != IMAGE)
+ {
+ if (img) abort();
+ }
+ else
+ {
+ if (!img) abort();
+ if (!img->loaded_p) abort();
+ if (!img->used_p) abort();
+ if (img->refcount <= 0) abort();
+ }
+
+ for (i = 0; i < ss->nsprites; i++) /* unlink it from the list */
+ if (ss->sprites[i] == sp)
+ {
+ int j;
+ for (j = i; j < ss->nsprites-1; j++) /* pull remainder forward */
+ ss->sprites[j] = ss->sprites[j+1];
+ ss->sprites[j] = 0;
+ ss->nsprites--;
+ freed_p = True;
+ break;
+ }
+
+ if (!freed_p) abort();
+ if (sp->text) free (sp->text);
+ free (sp);
+ sp = 0;
+
+ if (img)
+ {
+ img->refcount--;
+ if (img->refcount < 0) abort();
+ if (img->refcount == 0)
+ destroy_image (mi, img);
+ }
+}
+
+
+/* Updates the sprite for the current frame of the animation based on
+ its creation time compared to the current wall clock.
+ */
+static void
+tick_sprite (ModeInfo *mi, sprite *sp)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ image *img = sp->img;
+ double now = ss->now;
+ double secs;
+ double ratio;
+ GLfloat visible = sp->duration + sp->fade_duration * 2;
+ GLfloat total = sp->pause_duration + visible;
+
+ if (sp->type != IMAGE)
+ {
+ if (sp->img) abort();
+ }
+ else
+ {
+ if (! sp->img) abort();
+ if (! img->loaded_p) abort();
+ }
+
+ /* pause fade duration fade
+ |------------|------------|---------|-----------|
+ ....----====##########====----....
+ from current to
+ */
+
+ secs = now - sp->start_time;
+ ratio = (visible <= 0 ? 1 : ((secs - sp->pause_duration) / visible));
+ if (ratio < 0) ratio = 0;
+ else if (ratio > 1) ratio = 1;
+
+ sp->current.x = sp->from.x + ratio * (sp->to.x - sp->from.x);
+ sp->current.y = sp->from.y + ratio * (sp->to.y - sp->from.y);
+ sp->current.w = sp->from.w + ratio * (sp->to.w - sp->from.w);
+ sp->current.h = sp->from.h + ratio * (sp->to.h - sp->from.h);
+
+ sp->thickness_scale = 1;
+
+ if (secs < sp->pause_duration)
+ {
+ sp->state = IN;
+ sp->opacity = 0;
+ }
+ else if (secs < sp->pause_duration + sp->fade_duration)
+ {
+ sp->state = IN;
+ sp->opacity = (secs - sp->pause_duration) / (GLfloat) sp->fade_duration;
+ }
+ else if (sp->duration == 0 || /* 0 means infinite lifetime */
+ sp->remain_p ||
+ secs < sp->pause_duration + sp->fade_duration + sp->duration)
+ {
+ sp->state = FULL;
+ sp->opacity = 1;
+
+ /* Just after reaching full opacity, pulse the width up and down. */
+ if (sp->fade_duration > 0 &&
+ secs < sp->pause_duration + sp->fade_duration * 2)
+ {
+ GLfloat f = ((secs - (sp->pause_duration + sp->fade_duration)) /
+ sp->fade_duration);
+ if (sp->throb_p)
+ sp->thickness_scale = 1 + 3 * (f > 0.5 ? 1-f : f);
+ }
+ }
+ else if (secs < total)
+ {
+ sp->state = OUT;
+ sp->opacity = (total - secs) / sp->fade_duration;
+ }
+ else
+ {
+ sp->state = DEAD;
+ sp->opacity = 0;
+ }
+
+ sp->frame_count++;
+}
+
+
+/* Draw the given sprite at the phase of its animation dictated by
+ its creation time compared to the current wall clock.
+ */
+static void
+draw_image_sprite (ModeInfo *mi, sprite *sp)
+{
+ /* esper_state *ss = &sss[MI_SCREEN(mi)]; */
+ int wire = MI_IS_WIREFRAME(mi);
+ image *img = sp->img;
+
+ if (! sp->img) abort();
+ if (! img->loaded_p) abort();
+
+ glPushMatrix();
+ {
+ GLfloat s = 1 + (sp->thickness_scale - 1) / 40.0;
+ glTranslatef (0.5, 0.5, 0);
+ glScalef (s, s, 1);
+ glTranslatef (-0.5, -0.5, 0);
+
+ glTranslatef (sp->current.x, sp->current.y, 0);
+ glScalef (sp->current.w, sp->current.h, 1);
+
+ glTranslatef (-0.5, -0.5, 0);
+
+ if (wire) /* Draw a grid inside the box */
+ {
+ GLfloat dy = 0.1;
+ GLfloat dx = dy * img->w / img->h;
+ GLfloat x, y;
+
+ if (sp->id & 1)
+ glColor4f (sp->opacity, 0, 0, 1);
+ else
+ glColor4f (0, 0, sp->opacity, 1);
+
+ glBegin(GL_LINES);
+ glVertex3f (0, 0, 0); glVertex3f (1, 1, 0);
+ glVertex3f (1, 0, 0); glVertex3f (0, 1, 0);
+
+ for (y = 0; y < 1+dy; y += dy)
+ {
+ GLfloat yy = (y > 1 ? 1 : y);
+ for (x = 0.5; x < 1+dx; x += dx)
+ {
+ GLfloat xx = (x > 1 ? 1 : x);
+ glVertex3f (0, xx, 0); glVertex3f (1, xx, 0);
+ glVertex3f (yy, 0, 0); glVertex3f (yy, 1, 0);
+ }
+ for (x = 0.5; x > -dx; x -= dx)
+ {
+ GLfloat xx = (x < 0 ? 0 : x);
+ glVertex3f (0, xx, 0); glVertex3f (1, xx, 0);
+ glVertex3f (yy, 0, 0); glVertex3f (yy, 1, 0);
+ }
+ }
+ glEnd();
+ }
+ else /* Draw the texture quad */
+ {
+ GLfloat texw = img->geom.width / (GLfloat) img->tw;
+ GLfloat texh = img->geom.height / (GLfloat) img->th;
+ GLfloat texx1 = img->geom.x / (GLfloat) img->tw;
+ GLfloat texy1 = img->geom.y / (GLfloat) img->th;
+ GLfloat texx2 = texx1 + texw;
+ GLfloat texy2 = texy1 + texh;
+ GLfloat o = sp->opacity;
+ GLint mag = (sp->fatbits_p ? GL_NEAREST : GL_LINEAR);
+
+ glBindTexture (GL_TEXTURE_2D, img->texid);
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mag);
+
+ /* o = 1 - sin ((1 - o*o*o) * M_PI/2); */
+ glColor4f (1, 1, 1, o);
+
+ glNormal3f (0, 0, 1);
+ glBegin (GL_QUADS);
+ glTexCoord2f (texx1, texy2); glVertex3f (0, 0, 0);
+ glTexCoord2f (texx2, texy2); glVertex3f (1, 0, 0);
+ glTexCoord2f (texx2, texy1); glVertex3f (1, 1, 0);
+ glTexCoord2f (texx1, texy1); glVertex3f (0, 1, 0);
+ glEnd();
+
+ if (debug_p) /* Draw a border around the image */
+ {
+ if (!wire) glDisable (GL_TEXTURE_2D);
+ glColor4f (sp->opacity, 0, 0, 1);
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, 1, 0);
+ glVertex3f (1, 1, 0);
+ glVertex3f (1, 0, 0);
+ glEnd();
+ if (!wire) glEnable (GL_TEXTURE_2D);
+ }
+ }
+ }
+ glPopMatrix();
+}
+
+
+static void
+draw_line_sprite (ModeInfo *mi, sprite *sp)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int w = MI_WIDTH(mi);
+ int h = MI_HEIGHT(mi);
+ int wh = (w > h ? w : h);
+ int gs = (sp->type == RETICLE ? grid_size+1 : grid_size);
+ int sx = wh / (gs + 1);
+ int sy;
+ int k;
+ GLfloat t = grid_thickness * sp->thickness_scale;
+ int fade;
+ GLfloat color[4];
+
+ GLfloat x = w * sp->current.x;
+ GLfloat y = h * sp->current.y;
+ GLfloat bw = w * sp->current.w;
+ GLfloat bh = h * sp->current.h;
+
+ if (MI_WIDTH(mi) > 2560) t *= 3; /* Retina displays */
+
+ if (sx < 10) sx = 10;
+ sy = sx;
+
+ if (t > sx/3) t = sx/3;
+ if (t < 1) t = 1;
+ fade = t;
+ if (fade < 1) fade = 1;
+
+ if (t <= 0 || sp->opacity <= 0) return;
+
+ glPushMatrix();
+ glLoadIdentity();
+
+ if (debug_p)
+ {
+ GLfloat s = 0.75;
+ glScalef (s, s, s);
+ }
+
+ glOrtho (0, w, 0, h, -1, 1);
+
+ switch (sp->type) {
+ case GRID: memcpy (color, ss->grid_color, sizeof(color)); break;
+ case RETICLE: memcpy (color, ss->reticle_color, sizeof(color)); break;
+ case BOX: memcpy (color, ss->reticle_color, sizeof(color)); break;
+ default: abort();
+ }
+
+ if (sp->type == GRID)
+ {
+ GLfloat s = 1 + (sp->thickness_scale - 1) / 120.0;
+ glTranslatef (w/2, h/2, 0);
+ glScalef (s, s, 1);
+ glTranslatef (-w/2, -h/2, 0);
+ }
+
+ glColor4fv (color);
+
+ if (!wire) glDisable (GL_TEXTURE_2D);
+
+ for (k = 0; k < fade; k++)
+ {
+ GLfloat t2 = t * (1 - (k / (fade * 1.0)));
+ if (t2 <= 0) break;
+ color[3] = sp->opacity / fade;
+ glColor4fv (color);
+
+ glBegin (wire ? GL_LINES : GL_QUADS);
+
+ switch (sp->type) {
+ case GRID:
+ {
+ GLfloat xoff = (w - sx * (w / sx)) / 2.0;
+ GLfloat yoff = (h - sy * (h / sy)) / 2.0;
+ for (y = -sy/2+t2/2; y < h; y += sy)
+ for (x = -sx/2-t2/2; x < w; x += sx)
+ {
+ glVertex3f (xoff+x+t2, yoff+y, 0);
+ glVertex3f (xoff+x+t2, yoff+y+sy-t2, 0);
+ glVertex3f (xoff+x, yoff+y+sy-t2, 0);
+ glVertex3f (xoff+x, yoff+y, 0);
+ mi->polygon_count++;
+
+ glVertex3f (xoff+x, yoff+y-t2, 0);
+ glVertex3f (xoff+x+sx, yoff+y-t2, 0);
+ glVertex3f (xoff+x+sx, yoff+y, 0);
+ glVertex3f (xoff+x, yoff+y, 0);
+ mi->polygon_count++;
+ }
+ }
+ break;
+
+ case BOX:
+ glVertex3f (x-bw/2-t2/2, y-bh/2-t2/2, 0);
+ glVertex3f (x+bw/2+t2/2, y-bh/2-t2/2, 0);
+ glVertex3f (x+bw/2+t2/2, y-bh/2+t2/2, 0);
+ glVertex3f (x-bw/2-t2/2, y-bh/2+t2/2, 0);
+ mi->polygon_count++;
+
+ glVertex3f (x-bw/2-t2/2, y+bh/2-t2/2, 0);
+ glVertex3f (x+bw/2+t2/2, y+bh/2-t2/2, 0);
+ glVertex3f (x+bw/2+t2/2, y+bh/2+t2/2, 0);
+ glVertex3f (x-bw/2-t2/2, y+bh/2+t2/2, 0);
+ mi->polygon_count++;
+
+ glVertex3f (x-bw/2+t2/2, y-bh/2+t2/2, 0);
+ glVertex3f (x-bw/2+t2/2, y+bh/2-t2/2, 0);
+ glVertex3f (x-bw/2-t2/2, y+bh/2-t2/2, 0);
+ glVertex3f (x-bw/2-t2/2, y-bh/2+t2/2, 0);
+ mi->polygon_count++;
+
+ glVertex3f (x+bw/2+t2/2, y-bh/2+t2/2, 0);
+ glVertex3f (x+bw/2+t2/2, y+bh/2-t2/2, 0);
+ glVertex3f (x+bw/2-t2/2, y+bh/2-t2/2, 0);
+ glVertex3f (x+bw/2-t2/2, y-bh/2+t2/2, 0);
+ mi->polygon_count++;
+ break;
+
+ case RETICLE:
+ glVertex3f (x+t2/2, y+sy/2-t2/2, 0);
+ glVertex3f (x+t2/2, h, 0);
+ glVertex3f (x-t2/2, h, 0);
+ glVertex3f (x-t2/2, y+sy/2-t2/2, 0);
+ mi->polygon_count++;
+
+ glVertex3f (x-t2/2, y-sy/2+t2/2, 0);
+ glVertex3f (x-t2/2, 0, 0);
+ glVertex3f (x+t2/2, 0, 0);
+ glVertex3f (x+t2/2, y-sy/2+t2/2, 0);
+ mi->polygon_count++;
+
+ glVertex3f (x-sx/2+t2/2, y+t2/2, 0);
+ glVertex3f (0, y+t2/2, 0);
+ glVertex3f (0, y-t2/2, 0);
+ glVertex3f (x-sx/2+t2/2, y-t2/2, 0);
+ mi->polygon_count++;
+
+ glVertex3f (x+sx/2-t2/2, y-t2/2, 0);
+ glVertex3f (w, y-t2/2, 0);
+ glVertex3f (w, y+t2/2, 0);
+ glVertex3f (x+sx/2-t2/2, y+t2/2, 0);
+ mi->polygon_count++;
+ break;
+
+ default: abort();
+ }
+ glEnd();
+ }
+
+ glPopMatrix();
+
+ if (!wire) glEnable (GL_TEXTURE_2D);
+}
+
+
+static sprite * find_newest_sprite (ModeInfo *, sprite_type);
+static void compute_image_rect (rect *, sprite *, Bool);
+
+static void
+draw_text_sprite (ModeInfo *mi, sprite *sp)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ GLfloat w = MI_WIDTH(mi);
+ GLfloat h = MI_HEIGHT(mi);
+ GLfloat s;
+ int x, y, z;
+ XCharStruct e;
+ sprite *target = 0;
+ char text[255];
+ GLfloat color[4];
+ int i;
+
+ if (sp->opacity <= 0)
+ return;
+
+ for (i = 0; i < ss->nsprites; i++)
+ {
+ sprite *sp2 = ss->sprites[i];
+ if (sp2->id == sp->text_id && sp2->state != DEAD)
+ {
+ target = sp2;
+ break;
+ }
+ }
+
+ if (target)
+ {
+ rect r;
+ sprite *img;
+
+ if (target->opacity <= 0 &&
+ (target->state == NEW || target->state == IN))
+ return;
+
+ r = target->current;
+
+ img = find_newest_sprite (mi, IMAGE);
+ if (img)
+ compute_image_rect (&r, img, target->back_p);
+
+ mi->recursion_depth = (img
+ ? MIN (img->current.w, img->current.h)
+ : 0);
+
+ x = abs ((int) (r.x * 10000)) % 10000;
+ y = abs ((int) (r.y * 10000)) % 10000;
+ z = abs ((int) (r.w * 10000)) % 10000;
+
+ sprintf (text, "ZM %04d NS %04d EW %04d", z, y, x);
+
+ if ((x == 0 || x == 5000) && /* startup */
+ (y == 0 || y == 5000) &&
+ (z == 0 || z == 5000))
+ *text = 0;
+
+ if (do_titles &&
+ target->type == IMAGE &&
+ target->remain_p) /* The initial background image */
+ {
+ char *s = (target->img &&
+ target->img->title && *target->img->title
+ ? target->img->title
+ : "Loading");
+ int L = strlen (s);
+ int i = (L > 23 ? L-23 : 0);
+ sprintf (text, ">>%-23s", target->img->title + i);
+ for (s = text; *s; s++)
+ if (*s >= 'a' && *s <= 'z') *s += ('A'-'a');
+ else if (*s == '/' || *s == '-' || *s == '.') *s = '_';
+ }
+
+ if (!*text) return;
+
+ if (sp->text) free (sp->text);
+ sp->text = strdup (text);
+ }
+ else if (sp->text && *sp->text)
+ /* The target sprite might be dead, but we saved our last text. */
+ strcpy (text, sp->text);
+ else
+ /* No target, no saved text. */
+ return;
+
+ texture_string_metrics (ss->font_data, text, &e, 0, 0);
+
+ glPushMatrix();
+ glLoadIdentity();
+ glOrtho (0, 1, 0, 1, -1, 1);
+
+ /* Scale the text to fit N characters horizontally. */
+ {
+# ifdef HAVE_MOBILE
+ GLfloat c = 25;
+# else /* desktop */
+ GLfloat c = (MI_WIDTH(mi) <= 640 ? 25 :
+ MI_WIDTH(mi) <= 1280 ? 32 : 64);
+# endif
+ s = w / (e.ascent * c);
+ }
+ w /= s;
+ h /= s;
+ x = (w - e.width) / 2;
+ y = e.ascent + e.descent * 2;
+
+ glScalef (1.0/w, 1.0/h, 1);
+ glTranslatef (x, y, 0);
+
+ memcpy (color, ss->text_color, sizeof(color));
+ color[3] = sp->opacity;
+ glColor4fv (color);
+
+ if (wire)
+ glEnable (GL_TEXTURE_2D);
+
+ print_texture_string (ss->font_data, text);
+ mi->polygon_count++;
+
+ if (wire)
+ glDisable (GL_TEXTURE_2D);
+ glPopMatrix();
+}
+
+
+static void
+draw_flash_sprite (ModeInfo *mi, sprite *sp)
+{
+ /* esper_state *ss = &sss[MI_SCREEN(mi)]; */
+ GLfloat o = sp->opacity;
+
+ if (o <= 0) return;
+ o = 0.7; /* Too fast to see, so keep it consistent */
+
+ glPushMatrix();
+ int wire = MI_IS_WIREFRAME(mi);
+ if (!wire)
+ glDisable (GL_TEXTURE_2D);
+ glColor4f (0, 0, 1, o);
+ glColorMask (0, 0, 1, 1); /* write only into blue and alpha channels */
+ glBegin (GL_QUADS);
+ glVertex3f (0, 0, 0);
+ glVertex3f (1, 0, 0);
+ glVertex3f (1, 1, 0);
+ glVertex3f (0, 1, 0);
+ glEnd();
+ glColorMask (1, 1, 1, 1);
+ if (!wire)
+ glEnable (GL_TEXTURE_2D);
+ glPopMatrix();
+}
+
+
+static void
+draw_sprite (ModeInfo *mi, sprite *sp)
+{
+ switch (sp->type) {
+ case IMAGE:
+ draw_image_sprite (mi, sp);
+ break;
+ case RETICLE:
+ case BOX:
+ case GRID:
+ draw_line_sprite (mi, sp);
+ break;
+ case TEXT:
+ draw_text_sprite (mi, sp);
+ break;
+ case FLASH:
+ draw_flash_sprite (mi, sp);
+ break;
+ default:
+ abort();
+ }
+}
+
+
+static void
+tick_sprites (ModeInfo *mi)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ int i;
+ for (i = 0; i < ss->nsprites; i++)
+ tick_sprite (mi, ss->sprites[i]);
+
+ for (i = 0; i < ss->nsprites; i++)
+ {
+ sprite *sp = ss->sprites[i];
+ if (sp->state == DEAD)
+ {
+ destroy_sprite (mi, sp);
+ i--;
+ }
+ }
+}
+
+
+static void
+draw_sprites (ModeInfo *mi)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ int i;
+
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+
+/*
+ {
+ GLfloat rot = current_device_rotation();
+ glTranslatef (0.5, 0.5, 0);
+ glRotatef(rot, 0, 0, 1);
+ if ((rot > 45 && rot < 135) ||
+ (rot < -45 && rot > -135))
+ {
+ GLfloat s = MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi);
+ glScalef (s, 1/s, 1);
+ }
+ glTranslatef (-0.5, -0.5, 0);
+ }
+*/
+
+ /* Draw the images first, then the overlays. */
+ for (i = 0; i < ss->nsprites; i++)
+ if (ss->sprites[i]->type == IMAGE)
+ draw_sprite (mi, ss->sprites[i]);
+ for (i = 0; i < ss->nsprites; i++)
+ if (ss->sprites[i]->type != IMAGE)
+ draw_sprite (mi, ss->sprites[i]);
+
+ glPopMatrix();
+
+ if (debug_p) /* draw a white box (the "screen") */
+ {
+ int wire = MI_IS_WIREFRAME(mi);
+
+ if (!wire) glDisable (GL_TEXTURE_2D);
+
+ glColor4f (1, 1, 1, 1);
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, 1, 0);
+ glVertex3f (1, 1, 0);
+ glVertex3f (1, 0, 0);
+ glEnd();
+
+ if (!wire) glEnable (GL_TEXTURE_2D);
+ }
+}
+
+
+static void
+fadeout_sprite (ModeInfo *mi, sprite *sp)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+
+ /* If it hasn't faded in yet, don't fade out. */
+ if (ss->now <= sp->start_time + sp->pause_duration)
+ sp->fade_duration = 0;
+
+ /* Pretend it's at the point where it should fade out. */
+ sp->pause_duration = 0;
+ sp->duration = 9999;
+ sp->remain_p = False;
+ sp->start_time = ss->now - sp->duration;
+}
+
+static void
+fadeout_sprites (ModeInfo *mi, sprite_type type)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ int i;
+ for (i = 0; i < ss->nsprites; i++)
+ {
+ sprite *sp = ss->sprites[i];
+ if (sp->type == type)
+ fadeout_sprite (mi, sp);
+ }
+}
+
+
+static sprite *
+find_newest_sprite (ModeInfo *mi, sprite_type type)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ sprite *sp = 0;
+ int i;
+ for (i = 0; i < ss->nsprites; i++)
+ {
+ sprite *sp2 = ss->sprites[i];
+ if (sp2->type == type &&
+ (!sp ||
+ (sp->start_time < sp2->start_time &&
+ ss->now >= sp2->start_time + sp2->pause_duration)))
+ sp = sp2;
+ }
+ return sp;
+}
+
+
+/* Enqueue a text sprite describing the given sprite that runs at the
+ same time.
+ */
+static sprite *
+push_text_sprite (ModeInfo *mi, sprite *sp)
+{
+ /* esper_state *ss = &sss[MI_SCREEN(mi)]; */
+ sprite *sp2 = new_sprite (mi, TEXT);
+ if (!sp2) abort();
+ sp2->text_id = sp->id;
+ sp2->fade_duration = sp->fade_duration;
+ sp2->duration = sp->duration;
+ sp2->pause_duration = sp->pause_duration;
+ return sp2;
+}
+
+
+/* Enqueue a flash sprite that fires at the same time.
+ */
+#ifndef SMOOTH
+static sprite *
+push_flash_sprite (ModeInfo *mi, sprite *sp)
+{
+ /* esper_state *ss = &sss[MI_SCREEN(mi)]; */
+ sprite *sp2 = new_sprite (mi, FLASH);
+ if (!sp2) abort();
+ if (sp->type != IMAGE) abort();
+ sp2->text_id = sp->id;
+ sp2->duration = MAX (0.07 / speed, 0.07);
+ sp2->fade_duration = 0; /* Fading these is too fast to see */
+ sp2->pause_duration = sp->pause_duration + (sp->fade_duration * 0.3);
+ return sp2;
+}
+#endif /* !SMOOTH */
+
+
+/* Set the sprite's duration based on distance travelled.
+ */
+static void
+compute_sprite_duration (ModeInfo *mi, sprite *sp, Bool blink_p)
+{
+ /* Compute max distance traveled by any point (corners or center). */
+ /* (cpp is the devil) */
+# define L(F) (sp->F.x - sp->F.w/2) /* delta of left edge, from/to */
+# define R(F) (1-(sp->F.x + sp->F.w/2)) /* right */
+# define B(F) (sp->F.y - sp->F.h/2) /* top */
+# define T(F) (1-(sp->F.y + sp->F.h/2)) /* bottom */
+# define D(F,G) sqrt(F(from)*F(from) + G(to)*G(to)) /* corner traveled */
+ double BL = D(B,L);
+ double BR = D(B,R);
+ double TL = D(T,L);
+ double TR = D(T,R);
+ double cx = sp->to.x - sp->from.x;
+ double cy = sp->to.y - sp->from.y;
+ double C = sqrt(cx*cx + cy*cy);
+ double dist = MAX (BL, MAX (BR, MAX (TL, MAX (TR, C))));
+# undef L
+# undef R
+# undef B
+# undef T
+# undef D
+
+ int steps = 1 + dist * 28;
+ if (steps > 10) steps = 10;
+
+ sp->duration = steps * 0.2 / speed;
+
+# ifndef SMOOTH
+ sp->duration += 1.5 / speed; /* For linger added by animate_sprite_path() */
+ if (blink_p) sp->duration += 0.6 / speed;
+# endif
+}
+
+
+/* Convert the sprite to a jerky transition.
+ Instead of smoothly animating, move in discrete steps,
+ using multiple staggered sprites.
+ */
+static void
+animate_sprite_path (ModeInfo *mi, sprite *sp, Bool blink_p)
+{
+# ifndef SMOOTH
+ /* esper_state *ss = &sss[MI_SCREEN(mi)]; */
+ double dx = sp->to.x - sp->from.x;
+ double dy = sp->to.y - sp->from.y;
+ double dw = sp->to.w - sp->from.w;
+ double dh = sp->to.h - sp->from.h;
+ double linger = 1.5 / speed;
+ double blinger = 0.6 / speed;
+ double dur = sp->duration - linger - (blink_p ? blinger : 0);
+ int steps = dur / 0.3 * speed; /* step duration in seconds */
+ int i;
+
+ if (sp->type == IMAGE)
+ steps *= 0.8;
+
+ if (steps < 2) steps = 2;
+ if (steps > 10) steps = 10;
+
+ /* if (dur <= 0.01) abort(); */
+ if (dur < 0.01)
+ linger = blinger = 0;
+
+ for (i = 0; i <= steps; i++)
+ {
+ sprite *sp2 = copy_sprite (mi, sp);
+ if (!sp2) abort();
+
+ sp2->to.x = (sp->current.x + i * dx / steps);
+ sp2->to.y = (sp->current.y + i * dy / steps);
+ sp2->to.w = (sp->current.w + i * dw / steps);
+ sp2->to.h = (sp->current.h + i * dh / steps);
+ sp2->current = sp2->from = sp2->to;
+ sp2->duration = dur / steps;
+ sp2->pause_duration += i * sp2->duration;
+ sp2->remain_p = False;
+ sp2->fatbits_p = True;
+
+ if (i == steps)
+ sp2->duration += linger; /* last one lingers for a bit */
+
+ if (i == steps && !blink_p)
+ {
+ sp2->remain_p = sp->remain_p;
+ sp2->fatbits_p = False;
+ }
+
+ if (sp2->type == IMAGE && i > 0)
+ push_flash_sprite (mi, sp2);
+
+ if (sp2->type == RETICLE || sp2->type == BOX)
+ {
+ sp2 = push_text_sprite (mi, sp2);
+ if (i == steps)
+ sp2->duration += linger * 2;
+ }
+ }
+
+ if (blink_p && blinger) /* last one blinks before vanishing */
+ {
+ int blinkers = 3;
+ for (i = 1; i <= blinkers; i++)
+ {
+ sprite *sp2 = copy_sprite (mi, sp);
+ if (!sp2) abort();
+
+ sp2->current = sp2->from = sp->to;
+ sp2->duration = blinger / blinkers;
+ sp2->pause_duration += dur + linger + i * sp2->duration;
+ sp2->remain_p = False;
+ if (i == blinkers)
+ {
+ sp2->remain_p = sp->remain_p;
+ sp2->fatbits_p = False;
+ }
+ }
+ }
+
+ /* Fade out the template sprite. It might not have even appeared yet. */
+ fadeout_sprite (mi, sp);
+# endif
+}
+
+
+/* Input rect is of a reticle or box.
+ Output rect is what the image's rect should be so that the only part
+ visible is the part indicated by the input rect.
+ */
+static void
+compute_image_rect (rect *r, sprite *img, Bool inverse_p)
+{
+ double scale = (inverse_p ? 1/r->w : r->w);
+ double dx = r->x - 0.5;
+ double dy = r->y - 0.5;
+
+ /* Adjust size and center by zoom factor */
+ r->w = img->current.w / scale;
+ r->h = img->current.h / scale;
+ r->x = 0.5 + (img->current.x - 0.5) / scale;
+ r->y = 0.5 + (img->current.y - 0.5) / scale;
+
+ /* Move center */
+
+ if (inverse_p)
+ {
+ dx = -dx; /* #### Close but not quite right */
+ dy = -dy;
+ }
+
+ r->x -= dx / scale;
+ r->y -= dy / scale;
+}
+
+
+/* Sets 'to' such that the image zooms out so that the only part visible
+ is the part indicated by the box.
+ */
+static void
+track_box_with_image (ModeInfo *mi, sprite *sp, sprite *img)
+{
+ rect r = sp->current;
+ compute_image_rect (&r, img, sp->back_p);
+ img->to = r;
+
+ /* Never zoom out too far. */
+ if (img->to.w < 1 && img->to.h < 1)
+ {
+ if (img->to.w > img->to.h)
+ {
+ img->to.w = img->to.w / img->to.h;
+ img->to.h = 1;
+ }
+ else
+ {
+ img->to.h = img->to.h / img->to.w;
+ img->to.w = 1;
+ }
+ }
+
+ /* Never pan beyond the bounds of the image. */
+ if (img->to.x < -img->to.w/2+1) img->to.x = -img->to.w/2+1;
+ if (img->to.x > img->to.w/2) img->to.x = img->to.w/2;
+ if (img->to.y < -img->to.h/2+1) img->to.y = -img->to.h/2+1;
+ if (img->to.y > img->to.h/2) img->to.y = img->to.h/2;
+}
+
+
+static void
+tick_animation (ModeInfo *mi)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ anim_state prev_state = ss->anim_state;
+ sprite *sp = 0;
+ int i;
+
+ switch (ss->anim_state) {
+ case BLANK:
+ ss->anim_state = GRID_ON;
+ break;
+ case GRID_ON:
+ ss->anim_state = IMAGE_LOAD;
+ break;
+ case IMAGE_LOAD:
+ /* Only advance once an image has loaded. */
+ if (find_newest_sprite (mi, IMAGE))
+ ss->anim_state = RETICLE_ON;
+ else
+ ss->anim_state = IMAGE_LOAD;
+ break;
+ case RETICLE_ON:
+ ss->anim_state = RETICLE_MOVE;
+ break;
+ case RETICLE_MOVE:
+ if (random() % 6)
+ ss->anim_state = BOX_MOVE;
+ else
+ ss->anim_state = IMAGE_ZOOM;
+ break;
+ case BOX_MOVE:
+ ss->anim_state = IMAGE_ZOOM;
+ break;
+ case IMAGE_ZOOM:
+ {
+ sprite *sp = find_newest_sprite (mi, IMAGE);
+ double depth = (sp
+ ? MIN (sp->current.w, sp->current.h)
+ : 0);
+ if (depth > 20)
+ ss->anim_state = IMAGE_UNLOAD;
+ else
+ ss->anim_state = RETICLE_ON;
+ }
+ break;
+ case IMAGE_FORCE_UNLOAD:
+ ss->anim_state = IMAGE_UNLOAD;
+ break;
+ case IMAGE_UNLOAD:
+ ss->anim_state = IMAGE_LOAD;
+ break;
+ case MANUAL_BOX_ON:
+ ss->anim_state = MANUAL_BOX;
+ break;
+ case MANUAL_BOX:
+ break;
+ case MANUAL_RETICLE_ON:
+ ss->anim_state = MANUAL_RETICLE;
+ break;
+ case MANUAL_RETICLE:
+ break;
+ default:
+ abort();
+ break;
+ }
+
+ ss->anim_start = ss->now;
+ ss->anim_duration = 0;
+
+ if (debug_p)
+ fprintf (stderr, "%s: entering %s\n",
+ progname, state_name (ss->anim_state));
+
+ switch (ss->anim_state) {
+
+ case GRID_ON: /* Start the grid fading in. */
+ if (! find_newest_sprite (mi, GRID))
+ {
+ sp = new_sprite (mi, GRID);
+ if (!sp) abort();
+ sp->fade_duration = 1.0 / speed;
+ sp->duration = 2.0 / speed;
+ sp->remain_p = True;
+ ss->anim_duration = (sp->pause_duration + sp->fade_duration * 2 +
+ sp->duration);
+ }
+ break;
+
+ case IMAGE_LOAD:
+ fadeout_sprites (mi, IMAGE);
+ sp = new_sprite (mi, IMAGE);
+ if (! sp)
+ {
+ if (debug_p) fprintf (stderr, "%s: image load failed\n", progname);
+ break;
+ }
+
+ sp->fade_duration = 0.5 / speed;
+ sp->duration = sp->fade_duration * 3;
+ sp->remain_p = True;
+ /* If we zoom in, we lose the pulse at the end. */
+ /* sp->from.w = sp->from.h = 0.0001; */
+ sp->current = sp->from;
+
+ ss->anim_duration = (sp->pause_duration + sp->fade_duration * 2 +
+ sp->duration);
+
+ sp = push_text_sprite (mi, sp);
+ sp->fade_duration = 0.2 / speed;
+ sp->pause_duration = 0;
+ sp->duration = 2.5 / speed;
+ break;
+
+ case IMAGE_FORCE_UNLOAD:
+ break;
+
+ case IMAGE_UNLOAD:
+ sp = find_newest_sprite (mi, IMAGE);
+ if (sp)
+ sp->fade_duration = ((prev_state == IMAGE_FORCE_UNLOAD ? 0.2 : 3.0)
+ / speed);
+ fadeout_sprites (mi, IMAGE);
+ fadeout_sprites (mi, RETICLE);
+ fadeout_sprites (mi, BOX);
+ fadeout_sprites (mi, TEXT);
+ ss->anim_duration = (sp ? sp->fade_duration : 0) + 3.5 / speed;
+ break;
+
+ case RETICLE_ON: /* Display reticle at center. */
+ fadeout_sprites (mi, TEXT);
+ sp = new_sprite (mi, RETICLE);
+ if (!sp) abort();
+ sp->fade_duration = 0.2 / speed;
+ sp->pause_duration = 1.0 / speed;
+ sp->duration = 1.5 / speed;
+ ss->anim_duration = (sp->pause_duration + sp->fade_duration * 2 +
+ sp->duration);
+ ss->anim_duration -= sp->fade_duration * 2;
+ break;
+
+ case RETICLE_MOVE:
+ /* Reticle has faded in. Now move it to somewhere else.
+ Create N new reticle sprites, wih staggered pause_durations.
+ */
+ {
+ GLfloat ox = 0.5;
+ GLfloat oy = 0.5;
+ GLfloat nx, ny, dist;
+
+ do { /* pick a new position not too near the old */
+ nx = 0.3 + BELLRAND(0.4);
+ ny = 0.3 + BELLRAND(0.4);
+ dist = sqrt ((nx-ox)*(nx-ox) + (ny-oy)*(ny-oy));
+ } while (dist < 0.1);
+
+ sp = new_sprite (mi, RETICLE);
+ if (!sp) abort();
+
+ sp->from.x = ox;
+ sp->from.y = oy;
+ sp->current = sp->to = sp->from;
+ sp->to.x = nx;
+ sp->to.y = ny;
+ sp->fade_duration = 0.2 / speed;
+ sp->pause_duration = 0;
+ compute_sprite_duration (mi, sp, False);
+
+ ss->anim_duration = (sp->pause_duration + sp->fade_duration * 2 +
+ sp->duration - 0.1);
+ animate_sprite_path (mi, sp, False);
+ }
+ break;
+
+ case BOX_MOVE:
+ /* Reticle has moved, and faded out.
+ Start the box zooming into place.
+ */
+ {
+ GLfloat ox = 0.5;
+ GLfloat oy = 0.5;
+ GLfloat nx, ny;
+ GLfloat z;
+
+ /* Find the last-added reticle, for our destination position. */
+ sp = 0;
+ for (i = 0; i < ss->nsprites; i++)
+ {
+ sprite *sp2 = ss->sprites[i];
+ if (sp2->type == RETICLE &&
+ (!sp || sp->start_time < sp2->start_time))
+ sp = sp2;
+ }
+ if (sp)
+ {
+ nx = sp->to.x;
+ ny = sp->to.y;
+ }
+ else
+ {
+ nx = ny = 0.5;
+ if (debug_p)
+ fprintf (stderr, "%s: no reticle before box?\n", progname);
+ }
+
+ z = 0.3 + frand(0.5);
+
+ /* Ensure that the selected box is contained within the screen */
+ {
+ double margin = 0.005;
+ double maxw = 2 * MIN (1 - margin - nx, nx - margin);
+ double maxh = 2 * MIN (1 - margin - ny, ny - margin);
+ double max = MIN (maxw, maxh);
+ if (z > max) z = max;
+ }
+
+ sp = new_sprite (mi, BOX);
+ if (!sp) abort();
+ sp->from.x = ox;
+ sp->from.y = oy;
+ sp->from.w = 1.0;
+ sp->from.h = 1.0;
+ sp->current = sp->from;
+ sp->to.x = nx;
+ sp->to.y = ny;
+ sp->to.w = z;
+ sp->to.h = z;
+
+ /* Maybe zoom out instead of in.
+ */
+ {
+ sprite *img = find_newest_sprite (mi, IMAGE);
+ double depth = MIN (img->current.w, img->current.h);
+ if (depth > 1 && /* if zoomed in */
+ (depth < 6 ? !(random() % 5) : /* 20% */
+ depth < 12 ? !(random() % 2) : /* 50% */
+ (random() % 3))) /* 66% */
+ {
+ sp->back_p = True;
+ if (depth < 1.5 && z < 0.8)
+ {
+ z = 0.8; /* don't zoom out much past 100% */
+ sp->to.w = z;
+ sp->to.h = z;
+ }
+ }
+ }
+
+ sp->fade_duration = 0.2 / speed;
+ sp->pause_duration = 2.0 / speed;
+ compute_sprite_duration (mi, sp, True);
+ ss->anim_duration = (sp->pause_duration + sp->fade_duration * 2 +
+ sp->duration - 0.1);
+ animate_sprite_path (mi, sp, True);
+ }
+ break;
+
+ case IMAGE_ZOOM:
+
+ /* Box has moved, and faded out.
+ Or, if no box, then just a reticle.
+ Zoom the underlying image to track the box's position. */
+ {
+ sprite *img, *img2;
+
+ /* Find latest box or reticle, for our destination position. */
+ sp = find_newest_sprite (mi, BOX);
+ if (! sp)
+ sp = find_newest_sprite (mi, RETICLE);
+ if (! sp)
+ {
+ if (debug_p)
+ fprintf (stderr, "%s: no box or reticle before image\n",
+ progname);
+ break;
+ }
+
+ img = find_newest_sprite (mi, IMAGE);
+ if (!img)
+ {
+ if (debug_p)
+ fprintf (stderr, "%s: no image?\n", progname);
+ break;
+ }
+
+ img2 = copy_sprite (mi, img);
+ if (!img2) abort();
+
+ img2->from = img->current;
+
+ fadeout_sprite (mi, img);
+
+ track_box_with_image (mi, sp, img2);
+
+ img2->fade_duration = 0.2 / speed;
+ img2->pause_duration = 0.5 / speed;
+ img2->remain_p = True;
+ img2->throb_p = False;
+ compute_sprite_duration (mi, img2, False);
+
+ img->start_time += img2->pause_duration;
+
+ ss->anim_duration = (img2->pause_duration + img2->fade_duration * 2 +
+ img2->duration);
+ animate_sprite_path (mi, img2, False);
+ fadeout_sprites (mi, TEXT);
+ }
+ break;
+
+ case MANUAL_BOX_ON:
+ case MANUAL_RETICLE_ON:
+ break;
+
+ case MANUAL_BOX:
+ case MANUAL_RETICLE:
+ {
+ sprite_type tt = (ss->anim_state == MANUAL_BOX ? BOX : RETICLE);
+ sprite *osp = find_newest_sprite (mi, tt);
+ fadeout_sprites (mi, RETICLE);
+ fadeout_sprites (mi, BOX);
+
+ sp = new_sprite (mi, tt);
+ if (!sp) abort();
+ if (osp)
+ sp->from = osp->current;
+ else
+ {
+ sp->from.x = 0.5;
+ sp->from.y = 0.5;
+ sp->from.w = 0.5;
+ sp->from.h = 0.5;
+ }
+ sp->to = sp->current = sp->from;
+ sp->fade_duration = 0.2 / speed;
+ sp->duration = 0.2 / speed;
+ sp->remain_p = True;
+ sp->throb_p = False;
+ ss->anim_duration = 9999;
+ }
+ break;
+
+ default:
+ fprintf (stderr,"%s: unknown state %d\n",
+ progname, (int) ss->anim_state);
+ abort();
+ }
+}
+
+
+/* Copied from gltrackball.c, sigh.
+ */
+static void
+adjust_for_device_rotation (double *x, double *y, double *w, double *h)
+{
+ int rot = (int) current_device_rotation();
+ int swap;
+
+ while (rot <= -180) rot += 360;
+ while (rot > 180) rot -= 360;
+
+ if (rot > 135 || rot < -135) /* 180 */
+ {
+ *x = *w - *x;
+ *y = *h - *y;
+ }
+ else if (rot > 45) /* 90 */
+ {
+ swap = *x; *x = *y; *y = swap;
+ swap = *w; *w = *h; *h = swap;
+ *x = *w - *x;
+ }
+ else if (rot < -45) /* 270 */
+ {
+ swap = *x; *x = *y; *y = swap;
+ swap = *w; *w = *h; *h = swap;
+ *y = *h - *y;
+ }
+}
+
+
+ENTRYPOINT Bool
+esper_handle_event (ModeInfo *mi, XEvent *event)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+
+ if (event->xany.type == Expose ||
+ event->xany.type == GraphicsExpose ||
+ event->xany.type == VisibilityNotify)
+ {
+ return False;
+ }
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ sprite *sp = 0;
+ double delta = 0.025;
+ double margin = 0.005;
+ Bool ok = False;
+
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+
+ if (c == '\t')
+ {
+ ss->anim_state = IMAGE_FORCE_UNLOAD;
+ return True;
+ }
+
+ if (! find_newest_sprite (mi, IMAGE))
+ return False; /* Too early */
+
+ ss->now = double_time();
+
+# define BONK() do { \
+ if (ss->anim_state != MANUAL_BOX_ON && \
+ ss->anim_state != MANUAL_BOX) { \
+ ss->anim_state = MANUAL_BOX_ON; \
+ tick_animation (mi); \
+ } \
+ sp = find_newest_sprite (mi, BOX); \
+ if (!sp) abort() ; \
+ sp->from = sp->current; \
+ sp->to = sp->from; \
+ sp->start_time = ss->now - sp->fade_duration; \
+ ok = True; \
+ } while(0)
+
+ if (keysym == XK_Left || c == ',' || c == '<')
+ {
+ BONK();
+ sp->to.x -= delta;
+ }
+ else if (keysym == XK_Right || c == '.' || c == '>')
+ {
+ BONK();
+ sp->to.x += delta;
+ }
+ else if (keysym == XK_Down || c == '-')
+ {
+ BONK();
+ sp->to.y -= delta;
+ }
+ else if (keysym == XK_Up || c == '=')
+ {
+ BONK();
+ sp->to.y += delta, ok = True;
+ }
+ else if (keysym == XK_Prior || c == '+')
+ {
+ BONK();
+ sp->to.w += delta;
+ sp->to.h = sp->to.w * sp->from.w / sp->from.h;
+ }
+ else if (keysym == XK_Next || c == '_')
+ {
+ BONK();
+ sp->to.w -= delta;
+ sp->to.h = sp->to.w * sp->from.w / sp->from.h;
+ }
+ else if ((c == ' ' || c == '\t') && debug_p &&
+ ss->anim_state == MANUAL_BOX)
+ {
+ BONK(); /* Null motion: just flash the current image. */
+ }
+ else if ((keysym == XK_Home || c == ' ' || c == '\t') &&
+ ss->anim_state == MANUAL_BOX)
+ {
+ BONK();
+ sp->to.x = 0.5;
+ sp->to.y = 0.5;
+ sp->to.w = 0.5;
+ sp->to.h = 0.5;
+ }
+ else if ((c == '\r' || c == '\n' || c == 033) &&
+ ss->anim_state == MANUAL_BOX)
+ {
+ BONK();
+ ss->anim_state = BOX_MOVE;
+ ss->anim_duration = 9999;
+ ss->anim_start = ss->now - ss->anim_duration;
+ fadeout_sprite (mi, sp);
+ return True;
+ }
+ else
+ return False;
+
+ if (! ok)
+ return False;
+
+ /* Keep it on screen */
+ if (sp->to.w > 1 - margin)
+ {
+ GLfloat r = sp->to.h / sp->to.w;
+ sp->to.w = 1-margin;
+ sp->to.h = (1-margin) * r;
+ }
+ if (sp->to.h > 1)
+ {
+ GLfloat r = sp->to.h / sp->to.w;
+ sp->to.w = (1-margin) / r;
+ sp->to.h = 1-margin;
+ }
+
+ if (sp->to.x - sp->to.w/2 < margin)
+ sp->to.x = sp->to.w/2 + margin;
+ if (sp->to.y - sp->to.h/2 < margin)
+ sp->to.y = sp->to.h/2 + margin;
+
+ if (sp->to.x + sp->to.w/2 >= 1 + margin)
+ sp->to.x = 1 - (sp->to.w/2 + margin);
+ if (sp->to.y + sp->to.h/2 >= 1 + margin)
+ sp->to.y = 1 - (sp->to.h/2 + margin);
+
+ /* Now let's give a momentary glimpse of what the image would do. */
+ if (debug_p)
+ {
+ sprite *img = 0;
+ int i;
+
+ /* Find the lingering image */
+ /* img = find__sprite (mi, IMAGE); */
+ for (i = 0; i < ss->nsprites; i++)
+ {
+ sprite *sp2 = ss->sprites[i];
+ if (sp2->type == IMAGE &&
+ sp2->remain_p &&
+ (!img ||
+ (img->start_time < sp2->start_time &&
+ ss->now >= sp2->start_time + sp2->pause_duration)))
+ img = sp2;
+ }
+
+ if (!img) abort();
+ img = copy_sprite (mi, img);
+ img->pause_duration = 0;
+ img->fade_duration = 0.1 / speed;
+ img->duration = 0.5 / speed;
+ img->start_time = ss->now;
+ img->remain_p = False;
+ track_box_with_image (mi, sp, img);
+ img->from = img->current = img->to;
+ }
+
+ return True;
+ }
+ else if (event->xany.type == ButtonPress &&
+ event->xbutton.button == Button1)
+ {
+ ss->button_down_p = 1;
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease &&
+ event->xbutton.button == Button1)
+ {
+ ss->button_down_p = 0;
+
+ if (ss->anim_state == MANUAL_BOX)
+ {
+ sprite *sp = find_newest_sprite (mi, BOX);
+ if (sp) fadeout_sprite (mi, sp);
+ ss->anim_state = BOX_MOVE;
+ ss->anim_duration = 9999;
+ ss->anim_start = ss->now - ss->anim_duration;
+ }
+ else if (ss->anim_state == MANUAL_RETICLE)
+ {
+ sprite *sp = find_newest_sprite (mi, RETICLE);
+ if (sp) fadeout_sprite (mi, sp);
+ ss->anim_state = RETICLE_MOVE;
+ ss->anim_duration = 9999;
+ ss->anim_start = ss->now - ss->anim_duration;
+ }
+ return True;
+ }
+ else if (event->xany.type == MotionNotify &&
+ ss->button_down_p &&
+ (ss->anim_state == MANUAL_RETICLE ||
+ ss->anim_state == RETICLE_MOVE))
+ {
+ sprite *sp = 0;
+ double x = event->xmotion.x;
+ double y = event->xmotion.y;
+ double w = MI_WIDTH(mi);
+ double h = MI_HEIGHT(mi);
+
+ adjust_for_device_rotation (&x, &y, &w, &h);
+ x = x/w;
+ y = 1-y/h;
+
+ if (ss->anim_state != MANUAL_RETICLE_ON &&
+ ss->anim_state != MANUAL_RETICLE)
+ {
+ ss->anim_state = MANUAL_RETICLE_ON;
+ tick_animation (mi);
+ }
+ sp = find_newest_sprite (mi, RETICLE);
+ if (!sp) abort();
+ sp->from = sp->current;
+ sp->to = sp->from;
+ sp->start_time = ss->now - sp->fade_duration;
+ sp->remain_p = True;
+
+ sp->current.x = MIN (0.95, MAX (0.05, x));
+ sp->current.y = MIN (0.95, MAX (0.05, y));
+ sp->from = sp->to = sp->current;
+
+ /* Don't update the text sprite more often than once a second. */
+ {
+ sprite *sp2 = find_newest_sprite (mi, TEXT);
+ if (!sp2 || sp2->start_time < ss->now-1)
+ {
+ fadeout_sprites (mi, TEXT);
+ sp = push_text_sprite (mi, sp);
+ sp->remain_p = True;
+ }
+ }
+
+ return True;
+ }
+ else if (event->xany.type == MotionNotify &&
+ ss->button_down_p &&
+ (ss->anim_state == MANUAL_BOX ||
+ ss->anim_state == BOX_MOVE))
+ {
+ sprite *sp = 0;
+ double x = event->xmotion.x;
+ double y = event->xmotion.y;
+ double w = MI_WIDTH(mi);
+ double h = MI_HEIGHT(mi);
+ double max;
+ Bool ok = True;
+
+ adjust_for_device_rotation (&x, &y, &w, &h);
+ x = x/w;
+ y = 1-y/h;
+
+ BONK();
+ max = (2 * (0.5 - MAX (fabs (sp->current.x - 0.5),
+ fabs (sp->current.y - 0.5)))
+ * 0.95);
+
+ x = fabs (x - sp->current.x);
+ y = fabs (y - sp->current.y);
+
+ if (x > y)
+ sp->current.w = sp->current.h = MIN (max, MAX (0.05, 2*x));
+ else
+ sp->current.w = sp->current.h = MIN (max, MAX (0.05, 2*y));
+ sp->from = sp->to = sp->current;
+
+ /* Don't update the text sprite more often than once a second. */
+ {
+ sprite *sp2 = find_newest_sprite (mi, TEXT);
+ if (!sp2 || sp2->start_time < ss->now-1)
+ {
+ fadeout_sprites (mi, TEXT);
+ sp = push_text_sprite (mi, sp);
+ sp->remain_p = True;
+ }
+ }
+
+ return ok;
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ ss->anim_state = IMAGE_FORCE_UNLOAD;
+ return True;
+ }
+# undef BONK
+
+ return False;
+}
+
+
+ENTRYPOINT void
+reshape_esper (ModeInfo *mi, int width, int height)
+{
+ GLfloat s;
+
+ glViewport (0, 0, width, height);
+ glMatrixMode (GL_PROJECTION);
+ glLoadIdentity();
+ glRotatef (current_device_rotation(), 0, 0, 1);
+ glMatrixMode (GL_MODELVIEW);
+ glLoadIdentity();
+
+ s = 2;
+
+ if (debug_p)
+ {
+ s *= 0.75;
+ if (s < 0.1) s = 0.1;
+ }
+
+ glScalef (s, s, s);
+ glTranslatef (-0.5, -0.5, 0);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /* Stretch each existing image to match new window aspect. */
+ {
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+ int i;
+ for (i = 0; i < ss->nsprites; i++)
+ {
+ sprite *sp = ss->sprites[i];
+ if (sp && sp->type == IMAGE && sp->img && sp->img->loaded_p)
+ {
+ GLfloat sp_asp = sp->current.h / sp->current.w;
+ GLfloat img_asp = (sp->img->geom.height /
+ (GLfloat) sp->img->geom.width);
+ GLfloat new_win = (MI_WIDTH(mi) / (double) MI_HEIGHT(mi));
+ GLfloat old_win = sp_asp / img_asp;
+ GLfloat r = old_win / new_win;
+ if (img_asp > 1)
+ {
+ sp->from.h /= r;
+ sp->current.h /= r;
+ sp->to.h /= r;
+ }
+ else
+ {
+ sp->from.w *= r;
+ sp->current.w *= r;
+ sp->to.w *= r;
+ }
+ }
+ }
+ }
+}
+
+
+static void
+parse_color (ModeInfo *mi, char *key, GLfloat color[4])
+{
+ XColor xcolor;
+ char *string = get_string_resource (mi->dpy, key, "EsperColor");
+ if (!XParseColor (mi->dpy, mi->xgwa.colormap, string, &xcolor))
+ {
+ fprintf (stderr, "%s: unparsable color in %s: %s\n", progname,
+ key, string);
+ exit (1);
+ }
+
+ color[0] = xcolor.red / 65536.0;
+ color[1] = xcolor.green / 65536.0;
+ color[2] = xcolor.blue / 65536.0;
+ color[3] = 1;
+}
+
+
+ENTRYPOINT void
+init_esper (ModeInfo *mi)
+{
+ int screen = MI_SCREEN(mi);
+ esper_state *ss;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, sss);
+ ss = &sss[screen];
+
+ if ((ss->glx_context = init_GL(mi)) != NULL) {
+ reshape_esper (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+
+ parse_color (mi, "gridColor", ss->grid_color);
+ parse_color (mi, "reticleColor", ss->reticle_color);
+ parse_color (mi, "textColor", ss->text_color);
+
+ glDisable (GL_LIGHTING);
+ glDisable (GL_DEPTH_TEST);
+ glDepthMask (GL_FALSE);
+ glEnable (GL_CULL_FACE);
+ glCullFace (GL_BACK);
+
+ if (! wire)
+ {
+ glEnable (GL_TEXTURE_2D);
+ glShadeModel (GL_SMOOTH);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ ss->font_data = load_texture_font (mi->dpy, "titleFont");
+
+ ss->now = double_time();
+ ss->dawn_of_time = ss->now;
+
+ alloc_image (mi);
+
+ ss->anim_state = BLANK;
+ ss->anim_start = 0;
+ ss->anim_duration = 0;
+}
+
+
+ENTRYPOINT void
+draw_esper (ModeInfo *mi)
+{
+ esper_state *ss = &sss[MI_SCREEN(mi)];
+
+ if (!ss->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(ss->glx_context));
+
+ mi->polygon_count = 0;
+
+ ss->now = double_time();
+
+ tick_sprites (mi);
+ draw_sprites (mi);
+ if (ss->now >= ss->anim_start + ss->anim_duration)
+ tick_animation (mi);
+
+ if (mi->fps_p) do_fps (mi);
+
+ glFinish();
+ glXSwapBuffers (MI_DISPLAY (mi), MI_WINDOW(mi));
+}
+
+XSCREENSAVER_MODULE ("Esper", esper)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/esper.man b/hacks/glx/esper.man
new file mode 100644
index 0000000..4d994d9
--- /dev/null
+++ b/hacks/glx/esper.man
@@ -0,0 +1,68 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+esper - Enhance 224 to 176. Go right. Enhance 57 19. Track 45 left.
+.SH SYNOPSIS
+.B esper
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-titles]
+[\-fps]
+.SH DESCRIPTION
+"Enhance 224 to 176. Pull out track right. Center in pull back. Pull back.
+Wait a minute. Go right. Stop. Enhance 57 19. Track 45 left. Gimme a
+hardcopy right there."
+
+The Esper Machine was a voice-controlled forensic device used by LAPD
+in 2019, as documented in the 1982 film, \fIBlade Runner.\fP It was
+capable of enhancing photographs to an extreme degree, including
+reconstructing different viewpoints within the space from the
+reflections on various objects in the photograph.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-titles | \-no-titles
+Show file names. Boolean.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the top of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2017 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/extrusion-helix2.c b/hacks/glx/extrusion-helix2.c
new file mode 100644
index 0000000..7a7152f
--- /dev/null
+++ b/hacks/glx/extrusion-helix2.c
@@ -0,0 +1,47 @@
+
+/*
+ * helicoid (gernalized torus) demo
+ *
+ * FUNCTION:
+ * This code provides a very simple example of the helicoid primitive.
+ * Most of this code is required to set up OpenGL and GLUT, and very
+ * very little to set up the helix drawer. Don't blink!
+ *
+ * =======> MOUSE HOOKED UP TO RADIUS, DELTA-RADIUS < ========
+ *
+ * HISTORY:
+ * Written by Linas Vepstas, March 1995
+ */
+
+#include "extrusion.h"
+
+/* controls shape of object */
+extern float lastx;
+extern float lasty;
+
+void InitStuff_helix2 (void)
+{
+}
+
+/* draw the helix shape */
+void DrawStuff_helix2 (void)
+{
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glColor3f (0.6, 0.3, 0.8);
+
+ /* set up some matrices so that the object spins with the mouse */
+ glPushMatrix ();
+/* glTranslatef (0.0, 0.0, -80.0); */
+/* glRotatef (220.0, 0.0, 1.0, 0.0); */
+/* glRotatef (65.0, 1.0, 0.0, 0.0); */
+
+ /* Phew. FINALLY, Draw the helix -- */
+ gleSetJoinStyle (TUBE_NORM_EDGE | TUBE_JN_ANGLE | TUBE_JN_CAP);
+ gleHelicoid (0.01*lastx,
+ 6.0, (0.01*lasty - 2.0),
+ -3.0, 4.0, 0x0, 0x0, 0.0, 1080.0);
+
+ glPopMatrix ();
+
+}
+/* ------------------------- end of file ----------------- */
diff --git a/hacks/glx/extrusion-helix3.c b/hacks/glx/extrusion-helix3.c
new file mode 100644
index 0000000..7650f46
--- /dev/null
+++ b/hacks/glx/extrusion-helix3.c
@@ -0,0 +1,46 @@
+
+/*
+ * helicoid (gernalized torus) demo
+ *
+ * FUNCTION:
+ * This code provides a very simple example of the helicoid primitive.
+ * Most of this code is required to set up OpenGL and GLUT, and very
+ * very little to set up the helix drawer. Don't blink!
+ *
+ * =======> MOUSE HOOKED UP TO SWEEP, HEIGHT < ========
+ *
+ * HISTORY:
+ * Written by Linas Vepstas, March 1995
+ */
+
+#include "extrusion.h"
+
+/* controls shape of object */
+extern float lastx;
+extern float lasty;
+
+void InitStuff_helix3 (void)
+{
+}
+
+/* draw the helix shape */
+void DrawStuff_helix3 (void)
+{
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glColor3f (0.8, 0.3, 0.6);
+
+ /* set up some matrices so that the object spins with the mouse */
+ glPushMatrix ();
+/* glTranslatef (0.0, 0.0, -80.0); */
+/* glRotatef (220.0, 0.0, 1.0, 0.0); */
+/* glRotatef (65.0, 1.0, 0.0, 0.0); */
+
+ /* Phew. FINALLY, Draw the helix -- */
+ gleSetJoinStyle (TUBE_NORM_EDGE | TUBE_JN_ANGLE | TUBE_JN_CAP);
+ gleHelicoid (1.0, 6.0, -1.0,
+ 0.0, (0.02*lasty-2.0), 0x0, 0x0, 0.0, 6.0*lastx);
+
+ glPopMatrix ();
+
+}
+/* ------------------------- end of file ----------------- */
diff --git a/hacks/glx/extrusion-helix4.c b/hacks/glx/extrusion-helix4.c
new file mode 100644
index 0000000..fbf1602
--- /dev/null
+++ b/hacks/glx/extrusion-helix4.c
@@ -0,0 +1,63 @@
+
+/*
+ * helicoid (gernalized torus) demo
+ *
+ * FUNCTION:
+ * This code provides a very simple example of the helicoid primitive.
+ * Most of this code is required to set up OpenGL and GLUT, and very
+ * very little to set up the helix drawer. Don't blink!
+ *
+ * =======> MOUSE HOOKED UP TO AFFINE < ========
+ *
+ * HISTORY:
+ * Written by Linas Vepstas, March 1995
+ */
+
+#include "extrusion.h"
+
+/* controls shape of object */
+extern float lastx;
+extern float lasty;
+
+void InitStuff_helix4 (void)
+{
+}
+
+/* draw the helix shape */
+void DrawStuff_helix4 (void)
+{
+ double affine[2][3];
+ double delta_affine[2][3];
+
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glColor3f (0.7, 0.5, 0.3);
+
+ /* set up some matrices so that the object spins with the mouse */
+ glPushMatrix ();
+/* glTranslatef (0.0, 0.0, -80.0); */
+/* glRotatef (220.0, 0.0, 1.0, 0.0); */
+/* glRotatef (65.0, 1.0, 0.0, 0.0); */
+
+ /* Phew. FINALLY, Draw the helix -- */
+ affine [0][0] = 1.0/ (0.01*lastx);
+ affine [1][0] = 0.0;
+ affine [0][1] = 0.0;
+ affine [1][1] = 0.01*lastx;
+ affine [0][2] = 0.0;
+ affine [1][2] = 0.0;
+
+ delta_affine [0][0] = 0.0;
+ delta_affine [1][0] = 0.03*lasty;
+ delta_affine [0][1] = -0.03*lasty;
+ delta_affine [1][1] = 0.0;
+ delta_affine [0][2] = 0.0;
+ delta_affine [1][2] = 0.0;
+
+ gleSetJoinStyle (TUBE_NORM_EDGE | TUBE_JN_ANGLE | TUBE_JN_CAP);
+ gleHelicoid (1.0, 7.0, -1.0,
+ -4.0, 6.0, affine, delta_affine, 0.0, 980.0);
+
+ glPopMatrix ();
+
+}
+/* ------------------------- end of file ----------------- */
diff --git a/hacks/glx/extrusion-joinoffset.c b/hacks/glx/extrusion-joinoffset.c
new file mode 100644
index 0000000..89a60e2
--- /dev/null
+++ b/hacks/glx/extrusion-joinoffset.c
@@ -0,0 +1,148 @@
+
+/* cylinder drawing demo */
+/* this demo demonstrates the various join styles */
+
+#include "extrusion.h"
+
+/* ------------------------------------------------------- */
+
+/* the arrays in which we will store the polyline */
+#define NPTS 100
+static double points [NPTS][3];
+static float colors [NPTS][3];
+static int idx = 0;
+
+/* some utilities for filling that array */
+#define PSCALE 0.5
+#define PNT(x,y,z) { \
+ points[idx][0] = PSCALE * x; \
+ points[idx][1] = PSCALE * y; \
+ points[idx][2] = PSCALE * z; \
+ idx ++; \
+}
+
+#define COL(r,g,b) { \
+ colors[idx][0] = r; \
+ colors[idx][1] = g; \
+ colors[idx][2] = b; \
+}
+
+/* the arrays in which we will store the contour */
+#define NCONTOUR 100
+static double contour_points [NCONTOUR][2];
+static int cidx = 0;
+
+/* some utilities for filling that array */
+#define C_PNT(x,y) { \
+ contour_points[cidx][0] = x; \
+ contour_points[cidx][1] = y; \
+ cidx ++; \
+}
+
+
+/* ------------------------------------------------------- */
+/*
+ * Initialize a bent shape with three segments.
+ * The data format is a polyline.
+ *
+ * NOTE that neither the first, nor the last segment are drawn.
+ * The first & last segment serve only to determine that angle
+ * at which the endcaps are drawn.
+ */
+
+void InitStuff_joinoffset (void)
+{
+ COL (0.0, 0.0, 0.0);
+ PNT (16.0, 0.0, 0.0);
+
+ COL (0.2, 0.8, 0.5);
+ PNT (0.0, -16.0, 0.0);
+
+ COL (0.0, 0.8, 0.3);
+ PNT (-16.0, 0.0, 0.0);
+
+ COL (0.8, 0.3, 0.0);
+ PNT (0.0, 16.0, 0.0);
+
+ COL (0.2, 0.3, 0.9);
+ PNT (16.0, 0.0, 0.0);
+
+ COL (0.2, 0.8, 0.5);
+ PNT (0.0, -16.0, 0.0);
+
+ COL (0.0, 0.0, 0.0);
+ PNT (-16.0, 0.0, 0.0);
+
+ C_PNT (-0.8, -0.5);
+ C_PNT (-1.8, 0.0);
+ C_PNT (-1.2, 0.3);
+ C_PNT (-0.7, 0.8);
+ C_PNT (-0.2, 1.3);
+ C_PNT (0.0, 1.6);
+ C_PNT (0.2, 1.3);
+ C_PNT (0.7, 0.8);
+ C_PNT (1.2, 0.3);
+ C_PNT (1.8, 0.0);
+ C_PNT (0.8, -0.5);
+
+ gleSetJoinStyle (TUBE_JN_ANGLE | TUBE_CONTOUR_CLOSED | TUBE_JN_CAP);
+}
+
+static double up_vector[3] = {1.0, 0.0, 0.0};
+
+/* controls shape of object */
+extern float lastx;
+extern float lasty;
+
+/* ------------------------------------------------------- */
+/* draw the extrusion */
+
+void DrawStuff_joinoffset (void)
+{
+ double moved_contour [NCONTOUR][2];
+ int style, save_style;
+ int i;
+
+ for (i=0; i<cidx; i++) {
+ moved_contour[i][0] = contour_points [i][0];
+ moved_contour[i][1] = contour_points [i][1] + 0.05 * (lasty-200.0);
+ }
+
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /* set up some matrices so that the object spins with the mouse */
+ glPushMatrix ();
+ glScalef (0.5, 0.5, 0.5);
+ glTranslatef (0, 4, 0);
+ /* glTranslatef (0.0, 4.0, -80.0); */
+ /* glRotatef (0.5*lastx, 0.0, 1.0, 0.0); */
+
+ gleExtrusion (cidx, moved_contour, contour_points, up_vector,
+ idx, points, colors);
+
+ glPopMatrix ();
+
+
+ /* draw a seond copy, this time with the raw style, to compare
+ * things against */
+ glPushMatrix ();
+ glScalef (0.5, 0.5, 0.5);
+ glTranslatef (0, -4, 0);
+ /* glTranslatef (0.0, -4.0, -80.0); */
+ /* glRotatef (0.5*lastx, 0.0, 1.0, 0.0); */
+
+ save_style = gleGetJoinStyle ();
+ style = save_style;
+ style &= ~TUBE_JN_MASK;
+ style |= TUBE_JN_RAW;
+ gleSetJoinStyle (style);
+
+ gleExtrusion (cidx, moved_contour, contour_points, up_vector,
+ idx, points, colors);
+
+ gleSetJoinStyle (save_style);
+ glPopMatrix ();
+
+}
+
+/* ------------------ end of file ----------------------------- */
diff --git a/hacks/glx/extrusion-screw.c b/hacks/glx/extrusion-screw.c
new file mode 100644
index 0000000..6724476
--- /dev/null
+++ b/hacks/glx/extrusion-screw.c
@@ -0,0 +1,114 @@
+/*
+ * screw.c
+ *
+ * FUNCTION:
+ * Draws a screw shape.
+ *
+ * HISTORY:
+ * -- created by Linas Vepstas October 1991
+ * -- heavily modified to draw more texas shapes, Feb 1993, Linas
+ * -- converted to use GLUT -- December 1995, Linas
+ *
+ */
+
+#include "extrusion.h"
+#include <stdlib.h>
+#include <math.h>
+
+/* =========================================================== */
+
+#define SCALE 1.3
+#define CONTOUR(x,y) { \
+ double ax, ay, alen; \
+ contour[i][0] = SCALE * (x); \
+ contour[i][1] = SCALE * (y); \
+ if (i!=0) { \
+ ax = contour[i][0] - contour[i-1][0]; \
+ ay = contour[i][1] - contour[i-1][1]; \
+ alen = 1.0 / sqrt (ax*ax + ay*ay); \
+ ax *= alen; ay *= alen; \
+ norms [i-1][0] = ay; \
+ norms [i-1][1] = -ax; \
+ } \
+ i++; \
+}
+
+#define NUM_PTS (25)
+
+static double contour [NUM_PTS][2];
+static double norms [NUM_PTS][2];
+
+static void init_contour (void)
+{
+ int i;
+
+ /* outline of extrusion */
+ i=0;
+ CONTOUR (1.0, 1.0);
+ CONTOUR (1.0, 2.9);
+ CONTOUR (0.9, 3.0);
+ CONTOUR (-0.9, 3.0);
+ CONTOUR (-1.0, 2.9);
+
+ CONTOUR (-1.0, 1.0);
+ CONTOUR (-2.9, 1.0);
+ CONTOUR (-3.0, 0.9);
+ CONTOUR (-3.0, -0.9);
+ CONTOUR (-2.9, -1.0);
+
+ CONTOUR (-1.0, -1.0);
+ CONTOUR (-1.0, -2.9);
+ CONTOUR (-0.9, -3.0);
+ CONTOUR (0.9, -3.0);
+ CONTOUR (1.0, -2.9);
+
+ CONTOUR (1.0, -1.0);
+ CONTOUR (2.9, -1.0);
+ CONTOUR (3.0, -0.9);
+ CONTOUR (3.0, 0.9);
+ CONTOUR (2.9, 1.0);
+
+ CONTOUR (1.0, 1.0); /* repeat so that last normal is computed */
+}
+
+/* =========================================================== */
+
+/* controls shape of object */
+extern float lastx;
+extern float lasty;
+
+void InitStuff_screw (void)
+{
+ int style;
+
+ /* configure the pipeline */
+ style = TUBE_JN_CAP;
+ style |= TUBE_CONTOUR_CLOSED;
+ style |= TUBE_NORM_FACET;
+ style |= TUBE_JN_ANGLE;
+ gleSetJoinStyle (style);
+
+ init_contour();
+}
+
+/* =========================================================== */
+
+void DrawStuff_screw (void) {
+
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glColor3f (0.5, 0.6, 0.6);
+
+ /* set up some matrices so that the object spins with the mouse */
+ glPushMatrix ();
+ /* glTranslatef (0.0, 0.0, -80.0); */
+ /* glRotatef (130.0, 0.0, 1.0, 0.0); */
+ /* glRotatef (65.0, 1.0, 0.0, 0.0); */
+
+ /* draw the brand and the handle */
+ gleScrew (20, contour, norms,
+ NULL, -6.0, 9.0, lasty);
+
+ glPopMatrix ();
+}
+
+/* ===================== END OF FILE ================== */
diff --git a/hacks/glx/extrusion-taper.c b/hacks/glx/extrusion-taper.c
new file mode 100644
index 0000000..d2d05a1
--- /dev/null
+++ b/hacks/glx/extrusion-taper.c
@@ -0,0 +1,218 @@
+/*
+ * taper.c
+ *
+ * FUNCTION:
+ * Draws a tapered screw shape.
+ *
+ * HISTORY:
+ * -- created by Linas Vepstas October 1991
+ * -- heavily modified to draw more texas shapes, Feb 1993, Linas
+ * -- converted to use GLUT -- December 1995, Linas
+ *
+ */
+
+#include "extrusion.h"
+
+#include <math.h>
+#include <stdlib.h>
+
+#ifndef NULL
+#define NULL ((void *) 0x0)
+#endif /* NULL */
+
+/* Some <math.h> files do not define M_PI... */
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+/* =========================================================== */
+
+#define SCALE 3.33333
+#define CONTOUR(x,y) { \
+ double ax, ay, alen; \
+ contour[i][0] = SCALE * (x); \
+ contour[i][1] = SCALE * (y); \
+ if (i!=0) { \
+ ax = contour[i][0] - contour[i-1][0]; \
+ ay = contour[i][1] - contour[i-1][1]; \
+ alen = 1.0 / sqrt (ax*ax + ay*ay); \
+ ax *= alen; ay *= alen; \
+ norms [i-1][0] = ay; \
+ norms [i-1][1] = -ax; \
+ } \
+ i++; \
+}
+
+#define NUM_PTS (25)
+
+static double contour [NUM_PTS][2];
+static double norms [NUM_PTS][2];
+
+static void init_contour (void)
+{
+ int i;
+
+ /* outline of extrusion */
+ i=0;
+ CONTOUR (1.0, 1.0);
+ CONTOUR (1.0, 2.9);
+ CONTOUR (0.9, 3.0);
+ CONTOUR (-0.9, 3.0);
+ CONTOUR (-1.0, 2.9);
+
+ CONTOUR (-1.0, 1.0);
+ CONTOUR (-2.9, 1.0);
+ CONTOUR (-3.0, 0.9);
+ CONTOUR (-3.0, -0.9);
+ CONTOUR (-2.9, -1.0);
+
+ CONTOUR (-1.0, -1.0);
+ CONTOUR (-1.0, -2.9);
+ CONTOUR (-0.9, -3.0);
+ CONTOUR (0.9, -3.0);
+ CONTOUR (1.0, -2.9);
+
+ CONTOUR (1.0, -1.0);
+ CONTOUR (2.9, -1.0);
+ CONTOUR (3.0, -0.9);
+ CONTOUR (3.0, 0.9);
+ CONTOUR (2.9, 1.0);
+
+ CONTOUR (1.0, 1.0); /* repeat so that last normal is computed */
+}
+
+/* =========================================================== */
+
+#define PSIZE 40
+static double path[PSIZE][3];
+static double twist[PSIZE];
+static double taper[PSIZE];
+
+static void init_taper (void) {
+ int j;
+ double z, deltaz;
+ double ang, dang;
+
+ z = -10.0;
+ deltaz = 0.5;
+
+ ang = 0.0;
+ dang = 20.0;
+ for (j=0; j<40; j++) {
+ path[j][0] = 0x0;
+ path[j][1] = 0x0;
+ path[j][2] = z;
+
+ twist[j] = ang;
+ ang += dang;
+
+ taper[j] = 0.1 * sqrt (9.51*9.51 - z*z);
+
+ z += deltaz;
+ }
+
+ taper[0] = taper[1];
+ taper[39] = taper[38];
+
+}
+
+/* =========================================================== */
+
+/* controls shape of object */
+extern float lastx;
+extern float lasty;
+
+void InitStuff_taper (void)
+{
+ int style;
+
+ /* configure the pipeline */
+ style = TUBE_JN_CAP;
+ style |= TUBE_CONTOUR_CLOSED;
+ style |= TUBE_NORM_FACET;
+ style |= TUBE_JN_ANGLE;
+ gleSetJoinStyle (style);
+
+ init_contour();
+ init_taper();
+}
+
+/* =========================================================== */
+
+static void gleTaper (int ncp,
+ gleDouble contour[][2],
+ gleDouble cont_normal[][2],
+ gleDouble up[3],
+ int npoints,
+ gleDouble point_array[][3],
+ float color_array[][3],
+ gleDouble taper[],
+ gleDouble twist[])
+{
+ int j;
+ gleAffine *xforms;
+ double co, si, angle;
+
+ /* malloc the extrusion array and the twist array */
+ xforms = (gleAffine *) malloc (npoints * sizeof(gleAffine));
+
+ for (j=0; j<npoints; j++) {
+ angle = (M_PI/180.0) * twist[j];
+ si = sin (angle);
+ co = cos (angle);
+ xforms[j][0][0] = taper[j] * co;
+ xforms[j][0][1] = - taper[j] * si;
+ xforms[j][0][2] = 0.0;
+ xforms[j][1][0] = taper[j] * si;
+ xforms[j][1][1] = taper[j] * co;
+ xforms[j][1][2] = 0.0;
+ }
+
+ gleSuperExtrusion (ncp, /* number of contour points */
+ contour, /* 2D contour */
+ cont_normal, /* 2D contour normals */
+ up, /* up vector for contour */
+ npoints, /* numpoints in poly-line */
+ point_array, /* polyline */
+ color_array, /* color of polyline */
+ xforms);
+
+ free (xforms);
+}
+
+/* =========================================================== */
+
+void DrawStuff_taper (void) {
+ int j;
+ double ang, dang;
+ double z, deltaz;
+ double ponent;
+ z=-1.0;
+ deltaz = 1.999/38;
+ ang = 0.0;
+ dang = lasty/40.0;
+ ponent = fabs (lastx/540.0);
+ for (j=1; j<39; j++) {
+ twist[j] = ang;
+ ang += dang;
+
+ taper[j] = pow ((1.0 - pow (fabs(z), 1.0/ponent)), ponent);
+ z += deltaz;
+ }
+
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glColor3f (0.5, 0.6, 0.6);
+
+ /* set up some matrices so that the object spins with the mouse */
+ glPushMatrix ();
+ /* glTranslatef (0.0, 0.0, -80.0); */
+ /* glRotatef (130.0, 0.0, 1.0, 0.0); */
+ /* glRotatef (65.0, 1.0, 0.0, 0.0); */
+
+ /* draw the brand and the handle */
+ gleTaper (20, contour, norms, NULL, 40, path, NULL, taper, twist);
+
+ glPopMatrix ();
+}
+
+/* ===================== END OF FILE ================== */
diff --git a/hacks/glx/extrusion-twistoid.c b/hacks/glx/extrusion-twistoid.c
new file mode 100644
index 0000000..82034af
--- /dev/null
+++ b/hacks/glx/extrusion-twistoid.c
@@ -0,0 +1,215 @@
+/*
+ * twistoid.c
+ *
+ * FUNCTION:
+ * Show extrusion of open contours. Also, show how torsion is applied.
+ *
+ * HISTORY:
+ * -- linas Vepstas October 1991
+ * -- heavily modified to draw corrugated surface, Feb 1993, Linas
+ * -- modified to demo twistoid March 1993
+ * -- port to glut Linas Vepstas March 1995
+ */
+
+#include "extrusion.h"
+
+#include <math.h>
+#include <stdlib.h>
+
+/* Some <math.h> files do not define M_PI... */
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+/* controls shape of object */
+extern float lastx;
+extern float lasty;
+
+#define OPENGL_10
+/* =========================================================== */
+
+#define NUM_TOID1_PTS 5
+static double toid1_points[NUM_TOID1_PTS][3];
+static float toid1_colors [NUM_TOID1_PTS][3];
+static double toid1_twists [NUM_TOID1_PTS];
+
+#define TSCALE (6.0)
+
+#define TPTS(x,y) { \
+ toid1_points[i][0] = TSCALE * (x); \
+ toid1_points[i][1] = TSCALE * (y); \
+ toid1_points[i][2] = TSCALE * (0.0); \
+ i++; \
+}
+
+#define TCOLS(r,g,b) { \
+ toid1_colors[i][0] = (r); \
+ toid1_colors[i][1] = (g); \
+ toid1_colors[i][2] = (b); \
+ i++; \
+}
+
+#define TXZERO() { \
+ toid1_twists[i] = 0.0; \
+ i++; \
+}
+
+static void init_toid1_line (void)
+{
+ int i;
+
+ i=0;
+ TPTS (-1.1, 0.0);
+ TPTS (-1.0, 0.0);
+ TPTS (0.0, 0.0);
+ TPTS (1.0, 0.0);
+ TPTS (1.1, 0.0);
+
+ i=0;
+ TCOLS (0.8, 0.8, 0.5);
+ TCOLS (0.8, 0.4, 0.5);
+ TCOLS (0.8, 0.8, 0.3);
+ TCOLS (0.4, 0.4, 0.5);
+ TCOLS (0.8, 0.8, 0.5);
+
+ i=0;
+ TXZERO ();
+ TXZERO ();
+ TXZERO ();
+ TXZERO ();
+ TXZERO ();
+}
+
+/* =========================================================== */
+
+#define SCALE 0.6
+#define TWIST(x,y) { \
+ double ax, ay, alen; \
+ twistation[i][0] = SCALE * (x); \
+ twistation[i][1] = SCALE * (y); \
+ if (i!=0) { \
+ ax = twistation[i][0] - twistation[i-1][0]; \
+ ay = twistation[i][1] - twistation[i-1][1]; \
+ alen = 1.0 / sqrt (ax*ax + ay*ay); \
+ ax *= alen; ay *= alen; \
+ twist_normal [i-1][0] = - ay; \
+ twist_normal [i-1][1] = ax; \
+ } \
+ i++; \
+}
+
+#define NUM_TWIS_PTS (20)
+
+static double twistation [NUM_TWIS_PTS][2];
+static double twist_normal [NUM_TWIS_PTS][2];
+
+static void init_tripples (void)
+{
+ int i;
+ double angle;
+ double co, si;
+
+ /* outline of extrusion */
+ i=0;
+ /* first, draw a semi-curcular "hump" */
+ while (i< 11) {
+ angle = M_PI * ((double) i) / 10.0;
+ co = cos (angle);
+ si = sin (angle);
+ TWIST ((-7.0 -3.0*co), 1.8*si);
+ }
+
+ /* now, a zig-zag corrugation */
+ while (1) {
+ if (i >= NUM_TWIS_PTS) break;
+ TWIST ((-10.0 +(double) i), 0.0);
+ if (i >= NUM_TWIS_PTS) break;
+ TWIST ((-9.5 +(double) i), 1.0);
+ }
+}
+
+
+/* =========================================================== */
+
+#define V3F(x,y,z) { \
+ float vvv[3]; \
+ vvv[0] = x; vvv[1] = y; vvv[2] = z; v3f (vvv); \
+}
+
+#define N3F(x,y,z) { \
+ float nnn[3]; \
+ nnn[0] = x; nnn[1] = y; nnn[2] = z; n3f (nnn); \
+}
+
+/* =========================================================== */
+
+void DrawStuff_twistoid (void) {
+ int i;
+
+ toid1_twists[2] = (lastx-121.0) / 8.0;
+
+ i=3;
+/*
+ TPTS (1.0, lasty /400.0);
+ TPTS (1.1, 1.1 * lasty / 400.0);
+*/
+ TPTS (1.0, -(lasty-121.0) /200.0);
+ TPTS (1.1, -1.1 * (lasty-121.0) / 200.0);
+
+#ifdef IBM_GL_32
+ rotate (230, 'x');
+ rotate (230, 'y');
+ scale (1.8, 1.8, 1.8);
+
+ if (mono_color) {
+ RGBcolor (178, 178, 204);
+ twist_extrusion (NUM_TWIS_PTS, twistation, twist_normal,
+ NULL, NUM_TOID1_PTS, toid1_points, NULL, toid1_twists);
+ } else {
+ twist_extrusion (NUM_TWIS_PTS, twistation, twist_normal,
+ NULL, NUM_TOID1_PTS, toid1_points, toid1_colors, toid1_twists);
+ }
+#endif
+
+#ifdef OPENGL_10
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glFrontFace(GL_CW); /* jwz */
+
+ /* set up some matrices so that the object spins with the mouse */
+ glPushMatrix ();
+/* glTranslatef (0.0, 0.0, -80.0); */
+/* glRotated (43.0, 1.0, 0.0, 0.0); */
+/* glRotated (43.0, 0.0, 1.0, 0.0); */
+ glScaled (1.8, 1.8, 1.8);
+ gleTwistExtrusion (NUM_TWIS_PTS, twistation, twist_normal,
+ NULL, NUM_TOID1_PTS, toid1_points, NULL, toid1_twists);
+ glPopMatrix ();
+#endif
+
+}
+
+/* =========================================================== */
+
+void InitStuff_twistoid (void)
+{
+ int js;
+
+ init_toid1_line ();
+ init_tripples ();
+
+#ifdef IBM_GL_32
+ js = getjoinstyle ();
+ js &= ~TUBE_CONTOUR_CLOSED;
+ setjoinstyle (js);
+#endif
+
+#ifdef OPENGL_10
+ js = gleGetJoinStyle ();
+ js &= ~TUBE_CONTOUR_CLOSED;
+ gleSetJoinStyle (js);
+#endif
+
+}
+
+/* ------------------ end of file -------------------- */
diff --git a/hacks/glx/extrusion.c b/hacks/glx/extrusion.c
new file mode 100644
index 0000000..3dee71c
--- /dev/null
+++ b/hacks/glx/extrusion.c
@@ -0,0 +1,556 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* extrusion --- extrusion module for xscreensaver */
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+
+ * Revision History:
+ * Tue Oct 19 22:24:47 PDT 1999 Initial creation by David Konerding
+ * <dek@cgl.ucsf.edu>
+ *
+ * Notes:
+ * This screensaver requires the GLE ("OpenGL Tubing and Extrusion Library")
+ * which can be obtained from http://www.linas.org/gle/index.html
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n"
+
+# define free_extrusion 0
+# define release_extrusion 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL /* whole file */
+
+#ifdef HAVE_XMU
+# ifndef VMS
+# include <X11/Xmu/Drawing.h>
+#else /* VMS */
+# include <Xmu/Drawing.h>
+# endif /* VMS */
+#endif
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "ximage-loader.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include "extrusion.h"
+
+#define checkImageWidth 64
+#define checkImageHeight 64
+
+
+#define WIDTH 640
+#define HEIGHT 480
+
+#define DEF_LIGHT "True"
+#define DEF_TEXTURE "False"
+#define DEF_TEX_QUAL "False"
+#define DEF_MIPMAP "False"
+#define DEF_NAME "RANDOM"
+#define DEF_IMAGE "BUILTIN"
+
+static int do_light;
+static int do_texture;
+static int do_tex_qual;
+static int do_mipmap;
+static char *which_name;
+static char *which_image;
+
+static XrmOptionDescRec opts[] = {
+ {"-light", ".extrusion.light", XrmoptionNoArg, "true" },
+ {"+light", ".extrusion.light", XrmoptionNoArg, "false" },
+ {"-texture", ".extrusion.texture", XrmoptionNoArg, "true" },
+ {"+texture", ".extrusion.texture", XrmoptionNoArg, "false" },
+ {"-texture", ".extrusion.texture", XrmoptionNoArg, "true" },
+ {"+texture_quality", ".extrusion.texture", XrmoptionNoArg, "false" },
+ {"-texture_quality", ".extrusion.texture", XrmoptionNoArg, "true" },
+ {"+mipmap", ".extrusion.mipmap", XrmoptionNoArg, "false" },
+ {"-mipmap", ".extrusion.mipmap", XrmoptionNoArg, "true" },
+ {"-name", ".extrusion.name", XrmoptionSepArg, 0 },
+ {"-image", ".extrusion.image", XrmoptionSepArg, 0 },
+};
+
+
+static argtype vars[] = {
+ {&do_light, "light", "Light", DEF_LIGHT, t_Bool},
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ {&do_tex_qual, "texture_quality", "Texture_Quality", DEF_TEX_QUAL, t_Bool},
+ {&do_mipmap, "mipmap", "Mipmap", DEF_MIPMAP, t_Bool},
+ {&which_name, "name", "Name", DEF_NAME, t_String},
+ {&which_image, "image", "Image", DEF_IMAGE, t_String},
+};
+
+
+static OptionStruct desc[] =
+{
+ {"-name num", "example 'name' to draw (helix2, helix3, helix4, joinoffset, screw, taper, twistoid)"},
+ {"-/+ light", "whether to do enable lighting (slower)"},
+ {"-/+ texture", "whether to apply a texture (slower)"},
+ {"-image <filename>", "texture image to load"},
+ {"-/+ texture_quality", "whether to use texture smoothing (slower)"},
+ {"-/+ mipmap", "whether to use texture mipmap (slower)"},
+};
+
+ENTRYPOINT ModeSpecOpt extrusion_opts = {countof(opts), opts, countof(vars), vars, desc};
+
+#ifdef USE_MODULES
+ModStruct extrusion_description =
+{"extrusion", "init_extrusion", "draw_extrusion", NULL,
+ "draw_extrusion", "init_extrusion", NULL, &extrusion_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "OpenGL extrusion", 0, NULL};
+#endif
+
+
+/* structure for holding the extrusion data */
+typedef struct {
+ int screen_width, screen_height;
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+ Bool button2_down_p;
+ int mouse_start_x, mouse_start_y;
+ int mouse_x, mouse_y;
+ int mouse_dx, mouse_dy;
+ Window window;
+ XColor fg, bg;
+ int extrusion_number;
+} extrusionstruct;
+
+static extrusionstruct *Extrusion = NULL;
+
+
+
+/* set up a light */
+static const GLfloat lightOnePosition[] = {40.0, 40, 100.0, 0.0};
+static const GLfloat lightOneColor[] = {0.99, 0.99, 0.00, 1.0};
+
+static const GLfloat lightTwoPosition[] = {-40.0, 40, 100.0, 0.0};
+static const GLfloat lightTwoColor[] = {0.00, 0.99, 0.99, 1.0};
+
+float rot_x=0, rot_y=0, rot_z=0;
+float lastx=0, lasty=0;
+
+static float max_lastx=400, max_lasty=400;
+static float min_lastx=-400, min_lasty=-400;
+
+struct functions {
+ void (*InitStuff)(void);
+ void (*DrawStuff)(void);
+ char *name;
+};
+
+/* currently joinoffset and twistoid look funny-
+ like we're looking at them from the back or something
+*/
+
+static const struct functions funcs_ptr[] = {
+ {InitStuff_helix2, DrawStuff_helix2, "helix2"},
+ {InitStuff_helix3, DrawStuff_helix3, "helix3"},
+ {InitStuff_helix4, DrawStuff_helix4, "helix4"},
+ {InitStuff_joinoffset, DrawStuff_joinoffset, "joinoffset"},
+ {InitStuff_screw, DrawStuff_screw, "screw"},
+ {InitStuff_taper, DrawStuff_taper, "taper"},
+ {InitStuff_twistoid, DrawStuff_twistoid, "twistoid"},
+};
+
+static int num_extrusions = countof(funcs_ptr);
+
+
+/* BEGINNING OF FUNCTIONS */
+
+
+static GLubyte *
+Generate_Image(int *width, int *height, int *format)
+{
+ GLubyte *result;
+ int i, j, c;
+ int counter=0;
+
+ *width = checkImageWidth;
+ *height = checkImageHeight;
+ result = (GLubyte *)malloc(4 * (*width) * (*height));
+
+ counter = 0;
+ for (i = 0; i < checkImageWidth; i++) {
+ for (j = 0; j < checkImageHeight; j++) {
+ c = (((((i&0x8)==0))^(((j&0x8))==0)))*255;
+ result[counter++] = (GLubyte) c;
+ result[counter++] = (GLubyte) c;
+ result[counter++] = (GLubyte) c;
+ result[counter++] = (GLubyte) 255;
+ }
+ }
+
+ *format = GL_RGBA;
+ return result;
+}
+
+
+/* Create a texture in OpenGL. First an image is loaded
+ and stored in a raster buffer, then it's */
+static void Create_Texture(ModeInfo *mi, const char *filename)
+{
+ int height, width;
+ GLubyte *image;
+ int format;
+
+ if ( !strncmp(filename, "BUILTIN", 7))
+ {
+ BUILTIN:
+ image = Generate_Image(&width, &height, &format);
+ }
+ else
+ {
+ XImage *ximage = file_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi),
+ filename);
+ if (!ximage)
+ goto BUILTIN;
+ image = (GLubyte *) ximage->data;
+ width = ximage->width;
+ height = ximage->height;
+ format = GL_RGBA;
+ }
+
+ /* GL_MODULATE or GL_DECAL depending on what you want */
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ /* perhaps we can edge a bit more speed at the expense of quality */
+ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
+
+ if (do_tex_qual) {
+ /* with texture_quality, the min and mag filters look *much* nice but are *much* slower */
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+ }
+ else {
+ /* default is to do it quick and dirty */
+ /* if you have mipmaps turned on, but not texture quality, nothing will happen! */
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ }
+
+ /* mipmaps make the image look much nicer */
+ if (do_mipmap)
+ {
+ int status;
+ clear_gl_error();
+ status = gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height, format,
+ GL_UNSIGNED_BYTE, image);
+ if (status)
+ {
+ const char *s = (char *) gluErrorString (status);
+ fprintf (stderr, "%s: error mipmapping %dx%d texture: %s\n",
+ progname, width, height,
+ (s ? s : "(unknown)"));
+ exit (1);
+ }
+ check_gl_error("mipmapping");
+ }
+ else
+ {
+ clear_gl_error();
+ glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0,
+ format, GL_UNSIGNED_BYTE, image);
+ check_gl_error("texture");
+ }
+}
+
+
+static void
+init_rotation (ModeInfo *mi)
+{
+ extrusionstruct *gp = &Extrusion[MI_SCREEN(mi)];
+ double spin_speed = 0.5;
+ gp->rot = make_rotator (spin_speed, spin_speed, spin_speed,
+ 0.2,
+ 0.005,
+ True);
+ gp->trackball = gltrackball_init (True);
+
+ lastx = (random() % (int) (max_lastx - min_lastx)) + min_lastx;
+ lasty = (random() % (int) (max_lasty - min_lasty)) + min_lasty;
+}
+
+
+/* draw the extrusion once */
+ENTRYPOINT void
+draw_extrusion(ModeInfo * mi)
+{
+ extrusionstruct *gp = &Extrusion[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ static const GLfloat color[4] = {0.6, 0.6, 0.4, 1.0};
+ /* static const GLfloat spec[4] = {0.6, 0.6, 0.6, 1.0}; */
+ /* static const GLfloat shiny = 40.0; */
+
+ double x, y, z;
+
+ if (!gp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(gp->glx_context));
+
+ glPushMatrix();
+
+ gltrackball_rotate (gp->trackball);
+
+ get_rotation (gp->rot, &x, &y, &z,
+ !(gp->button_down_p || gp->button2_down_p));
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+
+ /* track the mouse only if a button is down. */
+ if (gp->button2_down_p)
+ {
+ gp->mouse_dx += gp->mouse_x - gp->mouse_start_x;
+ gp->mouse_dy += gp->mouse_y - gp->mouse_start_y;
+ gp->mouse_start_x = gp->mouse_x;
+ gp->mouse_start_y = gp->mouse_y;
+ }
+
+ {
+ float scale = (max_lastx - min_lastx);
+ get_position (gp->rot, &x, &y, &z,
+ !(gp->button_down_p || gp->button2_down_p));
+ lastx = x * scale + min_lastx + gp->mouse_dx;
+ lasty = y * scale + min_lasty + gp->mouse_dy;
+ }
+
+ glScalef(0.5, 0.5, 0.5);
+
+ /* glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec); */
+ /* glMateriali (GL_FRONT_AND_BACK, GL_SHININESS, shiny); */
+
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glFrontFace(GL_CCW);
+
+ funcs_ptr[gp->extrusion_number].DrawStuff();
+
+ glPopMatrix();
+
+ if (mi->fps_p) do_fps (mi);
+ glXSwapBuffers(display, window);
+}
+
+
+/* set up lighting conditions */
+static void
+SetupLight(void)
+{
+ glLightfv (GL_LIGHT0, GL_POSITION, lightOnePosition);
+ glLightfv (GL_LIGHT0, GL_DIFFUSE, lightOneColor);
+ glLightfv (GL_LIGHT1, GL_POSITION, lightTwoPosition);
+ glLightfv (GL_LIGHT1, GL_DIFFUSE, lightTwoColor);
+
+ glEnable (GL_LIGHT0);
+ glEnable (GL_LIGHT1);
+ glEnable (GL_LIGHTING);
+
+ glColorMaterial (GL_FRONT, GL_DIFFUSE);
+ glColorMaterial (GL_BACK, GL_DIFFUSE);
+ glEnable (GL_COLOR_MATERIAL);
+}
+
+/* Standard reshape function */
+ENTRYPOINT void
+reshape_extrusion (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+/* decide which extrusion example to run */
+static void
+chooseExtrusionExample (ModeInfo *mi)
+{
+ extrusionstruct *gp = &Extrusion[MI_SCREEN(mi)];
+ int i;
+ /* call the extrusion init routine */
+
+ if (!strncmp(which_name, "RANDOM", strlen(which_name))) {
+ gp->extrusion_number = random() % num_extrusions;
+ }
+ else {
+ gp->extrusion_number=-1;
+ for (i=0; i < num_extrusions; i++) {
+ if (!strncmp(which_name, funcs_ptr[i].name, strlen(which_name))) {
+ gp->extrusion_number = i;
+ }
+ }
+ }
+
+ if (gp->extrusion_number < 0 || gp->extrusion_number >= num_extrusions) {
+ fprintf(stderr, "%s: invalid extrusion example number!\n", progname);
+ fprintf(stderr, "%s: known extrusions:\n", progname);
+ for (i=0; i < num_extrusions; i++)
+ fprintf(stderr,"\t%s\n", funcs_ptr[i].name);
+ exit(1);
+ }
+ init_rotation(mi);
+ funcs_ptr[gp->extrusion_number].InitStuff();
+}
+
+
+/* main OpenGL initialization routine */
+static void
+initializeGL(ModeInfo *mi, GLsizei width, GLsizei height)
+{
+ int style;
+ int mode;
+
+ reshape_extrusion(mi, width, height);
+ glViewport( 0, 0, width, height );
+
+ glEnable(GL_DEPTH_TEST);
+ glDisable (GL_CULL_FACE);
+ glLightModeli (GL_LIGHT_MODEL_TWO_SIDE, True);
+ glShadeModel(GL_SMOOTH);
+
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ MI_IS_WIREFRAME(mi) = 0;
+# endif
+
+ if (do_light)
+ SetupLight();
+ if (MI_IS_WIREFRAME(mi)) {
+ glPolygonMode(GL_FRONT,GL_LINE);
+ glPolygonMode(GL_BACK,GL_LINE);
+ }
+ if (do_texture) {
+ Create_Texture(mi, which_image);
+ glEnable(GL_TEXTURE_2D);
+
+ /* configure the pipeline */
+ style = TUBE_JN_CAP;
+ style |= TUBE_CONTOUR_CLOSED;
+ style |= TUBE_NORM_FACET;
+ style |= TUBE_JN_ANGLE;
+ gleSetJoinStyle (style);
+
+ if (do_texture) {
+ mode = GLE_TEXTURE_ENABLE | GLE_TEXTURE_VERTEX_MODEL_FLAT;
+ glMatrixMode (GL_TEXTURE); glLoadIdentity ();
+ glScalef (0.25, 0.1, 1); glMatrixMode (GL_MODELVIEW);
+ gleTextureMode (mode);
+ }
+ }
+
+}
+
+ENTRYPOINT Bool
+extrusion_handle_event (ModeInfo *mi, XEvent *event)
+{
+ extrusionstruct *gp = &Extrusion[MI_SCREEN(mi)];
+
+ if (event->xany.type == ButtonPress &&
+ (event->xbutton.button == Button4 ||
+ event->xbutton.button == Button5 ||
+ event->xbutton.button == Button6 ||
+ event->xbutton.button == Button7))
+ {
+ }
+ else if (event->xany.type == ButtonPress && /* rotate with left button */
+ !event->xbutton.state) /* if no modifier keys */
+ {
+ }
+ else if (event->xany.type == ButtonPress) /* deform with other buttons */
+ { /* or with modifier keys */
+ gp->button2_down_p = True;
+ }
+ else if (event->xany.type == ButtonRelease)
+ {
+ gp->button_down_p = False;
+ gp->button2_down_p = False;
+ }
+ else if (event->xany.type == MotionNotify)
+ {
+ if (gp->button2_down_p)
+ {
+ gp->mouse_x = event->xmotion.x;
+ gp->mouse_y = event->xmotion.y;
+ }
+ }
+
+ if (gltrackball_event_handler (event, gp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &gp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+/* xextrusion initialization routine */
+ENTRYPOINT void
+init_extrusion (ModeInfo * mi)
+{
+ int screen = MI_SCREEN(mi);
+ extrusionstruct *gp;
+
+ if (MI_IS_WIREFRAME(mi)) do_light = 0;
+
+ MI_INIT(mi, Extrusion);
+ gp = &Extrusion[screen];
+
+ gp->window = MI_WINDOW(mi);
+ if ((gp->glx_context = init_GL(mi)) != NULL) {
+ reshape_extrusion(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ initializeGL(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ chooseExtrusionExample(mi);
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+
+}
+
+XSCREENSAVER_MODULE ("Extrusion", extrusion)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/extrusion.h b/hacks/glx/extrusion.h
new file mode 100644
index 0000000..226a442
--- /dev/null
+++ b/hacks/glx/extrusion.h
@@ -0,0 +1,55 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* extrusion --- extrusion module for xscreensaver */
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ */
+
+#ifndef __XSCREENSAVER_EXTRUSION_H__
+#define __XSCREENSAVER_EXTRUSION_H__
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef HAVE_COCOA
+# include <GLUT/tube.h> /* gle is included with GLUT on OSX */
+#else /* !HAVE_COCOA */
+# include <GL/gl.h>
+# include <GL/glu.h>
+# ifdef HAVE_GLE3
+# include <GL/gle.h>
+# else
+# include <GL/tube.h>
+# endif
+#endif /* !HAVE_COCOA */
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+extern void InitStuff_helix2(void);
+extern void DrawStuff_helix2(void);
+extern void InitStuff_helix3(void);
+extern void DrawStuff_helix3(void);
+extern void InitStuff_helix4(void);
+extern void DrawStuff_helix4(void);
+extern void InitStuff_joinoffset(void);
+extern void DrawStuff_joinoffset(void);
+extern void InitStuff_screw(void);
+extern void DrawStuff_screw(void);
+extern void InitStuff_taper(void);
+extern void DrawStuff_taper(void);
+extern void InitStuff_twistoid(void);
+extern void DrawStuff_twistoid(void);
+
+#endif /* __XSCREENSAVER_EXTRUSION_H__ */
diff --git a/hacks/glx/extrusion.man b/hacks/glx/extrusion.man
new file mode 100644
index 0000000..e01d573
--- /dev/null
+++ b/hacks/glx/extrusion.man
@@ -0,0 +1,71 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+extrusion - various rotating extruded shapes.
+.SH SYNOPSIS
+.B extrusion
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-name \fIwhich\fP]
+[\-no-light]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Draws various rotating extruded shapes that twist around, lengthen, and
+turn inside out.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-name \fIwhich\fP
+Which object to draw. Choices are: helix2, helix3, helix4, joinoffset,
+screw, taper, and twistoid.
+.TP 8
+.B \-light | \-no-light
+Whether to light the scene, or use flat coloring.
+.TP 8
+.B \-bitmap \fIfile\fP
+The texture map to use.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Linas Vepstas and David Konerding. Permission
+to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided
+that the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation. No representations are made about the suitability of
+this software for any purpose. It is provided "as is" without express
+or implied warranty.
+.SH AUTHOR
+This screensaver was created by David Konerding from the samples that
+come with the GL Extrusion library by Linas Vepstas.
diff --git a/hacks/glx/flipflop.c b/hacks/glx/flipflop.c
new file mode 100644
index 0000000..c26458c
--- /dev/null
+++ b/hacks/glx/flipflop.c
@@ -0,0 +1,859 @@
+/* flipflop, Copyright (c) 2003 Kevin Ogden <kogden1@hotmail.com>
+ * (c) 2006 Sergio Gutirrez "Sergut" <sergut@gmail.com>
+ * (c) 2008 Andrew Galante <a.drew7@gmail.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ *
+ * 2003 Kevin Odgen First version
+ * 2006 Sergio Gutirrez "Sergut" Made several parameters dynamic and selectable
+ * from the command line: size of the board,
+ * rotation speed and number of free squares; also
+ * added the "sticks" mode.
+ * 2008 Andrew Galante Added -textured option: textures the board with
+ * an image which gets scrambled as the tiles move
+ *
+ */
+
+#define DEF_MODE "tiles" /* Default mode (options: "tiles", "sticks") */
+#define DEF_SIZEX "9" /* Default width of the board */
+#define DEF_SIZEY "9" /* Default length of the board */
+
+#define DEF_BOARD_SIZE "0" /* "0" means "no value selected by user". It is changed */
+#define DEF_NUMSQUARES "0" /* in function init_flipflop() to its correct value (that */
+#define DEF_FREESQUARES "0" /* is a function of the size of the board and the mode)*/
+
+#define DEF_SPIN "0.1" /* Default angular velocity: PI/10 rads/s */
+
+#define DEF_TEXTURED "False" /* Default: do not grab an image for texturing */
+
+#define DEF_STICK_THICK 54 /* Thickness for the sticks mode (over 100) */
+#define DEF_STICK_RATIO 80 /* Ratio of sticks/total squares (over 100) */
+#define DEF_TILE_THICK 4 /* Thickness for the tiles mode (over 100) */
+#define DEF_TILE_RATIO 95 /* Ratio of tiles/total squares (over 100) */
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n"
+
+# define release_flipflop 0
+# include "xlockmore.h"
+
+#else
+# include "xlock.h"
+#endif /* STANDALONE */
+
+#ifdef USE_GL
+
+#include "gltrackball.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+static XrmOptionDescRec opts[] = {
+ {"-sticks", ".mode", XrmoptionNoArg, "sticks"},
+ {"-tiles", ".mode", XrmoptionNoArg, "tiles" },
+ {"-mode", ".mode", XrmoptionSepArg, 0 },
+ {"-size", ".size", XrmoptionSepArg, 0 },
+ {"-size-x", ".sizex", XrmoptionSepArg, 0 },
+ {"-size-y", ".sizey", XrmoptionSepArg, 0 },
+ {"-count", ".numsquares", XrmoptionSepArg, 0 },
+ {"-free", ".freesquares", XrmoptionSepArg, 0 },
+ {"-spin", ".spin", XrmoptionSepArg, 0 },
+ {"-texture", ".textured", XrmoptionNoArg, "True" },
+ {"+texture", ".textured", XrmoptionNoArg, "False" },
+};
+
+static int wire, clearbits;
+static int board_x_size, board_y_size, board_avg_size;
+static int numsquares, freesquares;
+static float half_thick;
+static float spin;
+static char* flipflopmode_str="tiles";
+static int textured;
+
+static argtype vars[] = {
+ { &flipflopmode_str, "mode", "Mode", DEF_MODE, t_String},
+ { &board_avg_size, "size", "Integer", DEF_BOARD_SIZE, t_Int},
+ { &board_x_size, "sizex", "Integer", DEF_SIZEX, t_Int},
+ { &board_y_size, "sizey", "Integer", DEF_SIZEY, t_Int},
+ { &numsquares, "numsquares", "Integer", DEF_NUMSQUARES, t_Int},
+ { &freesquares, "freesquares", "Integer", DEF_NUMSQUARES, t_Int},
+ { &spin, "spin", "Float", DEF_SPIN, t_Float},
+ { &textured, "textured", "Bool", DEF_TEXTURED, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt flipflop_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct flipflop_description =
+ {"flipflop", "init_flipflop", "draw_flipflop", NULL,
+ "draw_flipflop", "init_flipflop", "free_flipflop", &flipflop_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "Flipflop", 0, NULL};
+
+#endif /* USE_MODULES */
+
+typedef struct {
+ /* array specifying which squares are where (to avoid collisions) */
+ /* -1 means empty otherwise integer represents square index 0 - n-1 */
+ /* occupied[x*board_y_size+y] is the tile [x][y] (i.e. that starts at column x and row y)*/
+ int *occupied; /* size: size_x * size_y */
+ /* an array of xpositions of the squares */
+ int *xpos; /* size: numsquares */
+ /* array of y positions of the squares */
+ int *ypos; /* size: numsquares */
+ /* integer representing the direction of movement of a square */
+ int *direction; /* 0 not, 1 x+, 2 y+, 3 x-, 4 y-*/ /* size: numsquares */
+ /* angle of moving square (during a flip) */
+ float *angle; /* size: numsquares */
+ /* array of colors for a square (RGB) */
+ /* eg. color[ 3*3 + 0 ] is the red component of square 3 */
+ /* eg. color[ 4*3 + 1 ] is the green component of square 4 */
+ /* eg. color[ 5*3 + 2 ] is the blue component of square 5 */
+ /* ^-- n is the number of square */
+ float *color; /* size: numsquares * 3 */
+ /* array of texcoords for each square */
+ /* tex[ n*4 + 0 ] is x texture coordinate of square n's left side */
+ /* tex[ n*4 + 1 ] is y texture coordinate of square n's top side */
+ /* tex[ n*4 + 2 ] is x texture coordinate of square n's right side */
+ /* tex[ n*4 + 3 ] is y texture coordinate of square n's bottom side */
+ float *tex; /* size: numsquares * 4 */
+} randsheet;
+
+typedef struct {
+ GLXContext *glx_context;
+ Window window;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ randsheet *sheet;
+
+ float theta; /* angle of rotation of the board */
+ float flipspeed; /* amount of flip; 1 is a entire flip */
+ float reldist; /* relative distace of camera from center */
+ float energy; /* likelyhood that a square will attempt to move */
+
+ /* texture rectangle */
+ float tex_x;
+ float tex_y;
+ float tex_width;
+ float tex_height;
+
+ /* id of texture in use */
+ GLuint texid;
+
+ Bool mipmap;
+ Bool got_texture;
+
+ GLfloat anisotropic;
+
+} Flipflopcreen;
+
+static Flipflopcreen *qs = NULL;
+
+#include "grab-ximage.h"
+
+static void randsheet_create( randsheet *rs );
+static void randsheet_initialize( randsheet *rs );
+static void randsheet_free( randsheet *rs );
+static int randsheet_new_move( randsheet* rs );
+static void randsheet_move( randsheet *rs, float rot );
+static int randsheet_draw( randsheet *rs );
+static void setup_lights(void);
+static int drawBoard(Flipflopcreen *);
+static int display(ModeInfo *mi);
+static int draw_sheet(float *tex);
+
+
+/* configure lighting */
+static void
+setup_lights(void)
+{
+ /* GLfloat position0[] = { board_avg_size*0.5, board_avg_size*0.1, board_avg_size*0.5, 1.0 }; */
+
+ /* GLfloat position0[] = { -board_avg_size*0.5, 0.2*board_avg_size, -board_avg_size*0.5, 1.0 }; */
+ GLfloat position0[4];
+ position0[0] = 0;
+ position0[1] = board_avg_size*0.3;
+ position0[2] = 0;
+ position0[3] = 1;
+
+ if (wire) return;
+
+ glEnable(GL_LIGHTING);
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+ glEnable(GL_LIGHT0);
+}
+
+static void get_texture(ModeInfo *);
+
+
+ENTRYPOINT Bool
+flipflop_handle_event (ModeInfo *mi, XEvent *event)
+{
+ Flipflopcreen *c = &qs[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, c->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &c->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ if (!textured || c->got_texture)
+ {
+ textured = 1;
+ c->got_texture = False;
+ get_texture (mi);
+ return True;
+ }
+ }
+
+ return False;
+}
+
+/* draw board */
+static int
+drawBoard(Flipflopcreen *c)
+{
+ int i;
+ for( i=0; i < (c->energy) ; i++ ) {
+ randsheet_new_move( c->sheet );
+ }
+ randsheet_move( c->sheet, c->flipspeed * 3.14159 );
+ return randsheet_draw( c->sheet );
+}
+
+
+static int
+display(ModeInfo *mi)
+{
+ Flipflopcreen *c = &qs[MI_SCREEN(mi)];
+ GLfloat amb[] = { 0.8, 0.8, 0.8, 1.0 };
+ int polys = 0;
+
+
+ glClear(clearbits);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.2);
+ glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.15/board_avg_size );
+ glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.15/board_avg_size );
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+
+
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ /** setup perspectif */
+ glTranslatef(0.0, 0.0, -c->reldist*board_avg_size);
+ glRotatef(22.5, 1.0, 0.0, 0.0);
+ gltrackball_rotate (c->trackball);
+ glRotatef(c->theta*100, 0.0, 1.0, 0.0);
+ glTranslatef(-0.5*board_x_size, 0.0, -0.5*board_y_size); /* Center the board */
+
+ /* set texture */
+ if(textured)
+ glBindTexture(GL_TEXTURE_2D, c->texid);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ polys = drawBoard(c);
+
+ if (!c->button_down_p) {
+ c->theta += .01 * spin;
+ }
+
+ return polys;
+}
+
+ENTRYPOINT void
+reshape_flipflop(ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0,y, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(45, 1/h, 1.0, 300.0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void
+image_loaded_cb (const char *filename, XRectangle *geometry,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure)
+{
+ Flipflopcreen *c = (Flipflopcreen *)closure;
+ int i, j;
+ int index = 0;
+ randsheet *rs = c->sheet;
+
+ c->tex_x = (float)geometry->x / (float)texture_width;
+ c->tex_y = (float)geometry->y / (float)texture_height;
+ c->tex_width = (float)geometry->width / (float)texture_width;
+ c->tex_height = (float)geometry->height / (float)texture_height;
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+ (c->mipmap ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
+
+ if(c->anisotropic >= 1)
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, c->anisotropic);
+
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ for(i = 0; i < board_x_size && index < numsquares; i++)
+ for(j = 0; j < board_y_size && index < numsquares; j++)
+ {
+ /* arrange squares to form loaded image */
+ rs->tex[ index*4 + 0 ] = c->tex_x + c->tex_width / board_x_size * (i + 0);
+ rs->tex[ index*4 + 1 ] = c->tex_y + c->tex_height / board_y_size * (j + 1);
+ rs->tex[ index*4 + 2 ] = c->tex_x + c->tex_width / board_x_size * (i + 1);
+ rs->tex[ index*4 + 3 ] = c->tex_y + c->tex_height / board_y_size * (j + 0);
+ rs->color[ index*3 + 0 ] = 1;
+ rs->color[ index*3 + 1 ] = 1;
+ rs->color[ index*3 + 2 ] = 1;
+ index++;
+ }
+
+ c->got_texture = True;
+}
+
+static void
+get_texture(ModeInfo *modeinfo)
+{
+ Flipflopcreen *c = &qs[MI_SCREEN(modeinfo)];
+
+ c->got_texture = False;
+ c->mipmap = True;
+ load_texture_async (modeinfo->xgwa.screen, modeinfo->window,
+ *c->glx_context, 0, 0, c->mipmap, c->texid,
+ image_loaded_cb, c);
+}
+
+ENTRYPOINT void
+init_flipflop(ModeInfo *mi)
+{
+ int screen;
+ Flipflopcreen *c;
+
+ if (MI_IS_WIREFRAME(mi)) textured = 0;
+
+ /* Set all constants to their correct values */
+ if (board_avg_size != 0) { /* general size specified by user */
+ board_x_size = board_avg_size;
+ board_y_size = board_avg_size;
+ } else {
+ board_avg_size = (board_x_size + board_y_size) / 2;
+ }
+ if ((numsquares == 0) && (freesquares != 0)) {
+ numsquares = board_x_size * board_y_size - freesquares;
+ }
+ if (strcmp(flipflopmode_str, "tiles")) {
+ textured = 0; /* textures look dumb in stick mode */
+ half_thick = 1.0 * DEF_STICK_THICK / 100.0;
+ if (numsquares == 0) { /* No value defined by user */
+ numsquares = board_x_size * board_y_size * DEF_STICK_RATIO / 100;
+ }
+ } else {
+ half_thick = 1.0 * DEF_TILE_THICK / 100.0;
+ if (numsquares == 0) { /* No value defined by user */
+ numsquares = board_x_size * board_y_size * DEF_TILE_RATIO/ 100;;
+ }
+ }
+ if (board_avg_size < 2) {
+ fprintf (stderr,"%s: the board must be at least 2x2.\n", progname);
+ exit(1);
+ }
+ if ((board_x_size < 1) || (board_y_size < 1) || (numsquares < 1)) {
+ fprintf (stderr,"%s: the number of elements ('-count') and the dimensions of the board ('-size-x', '-size-y') must be positive integers.\n", progname);
+ exit(1);
+ }
+ if (board_x_size * board_y_size <= numsquares) {
+ fprintf (stderr,"%s: the number of elements ('-count') that you specified is too big \n for the dimensions of the board ('-size-x', '-size-y'). Nothing will move.\n", progname);
+ }
+
+ screen = MI_SCREEN(mi);
+ wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT(mi, qs);
+
+ c = &qs[screen];
+ c->window = MI_WINDOW(mi);
+ c->trackball = gltrackball_init (False);
+
+ c->flipspeed = 0.03;
+ c->reldist = 1;
+ c->energy = 40;
+
+ if((c->glx_context = init_GL(mi)))
+ reshape_flipflop(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ else
+ MI_CLEARWINDOW(mi);
+
+ /* At this point, all the constants have already been set, */
+ /* so we can create the board */
+ c->sheet = (randsheet*) malloc(sizeof(randsheet));
+ randsheet_create( c->sheet );
+
+ clearbits = GL_COLOR_BUFFER_BIT;
+
+ glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
+ glEnable(GL_COLOR_MATERIAL);
+ setup_lights();
+
+ glEnable(GL_DEPTH_TEST);
+ clearbits |= GL_DEPTH_BUFFER_BIT;
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+
+ randsheet_initialize( c->sheet );
+ if( textured ){
+ /* check for anisotropic filtering */
+ if(strstr((char *)glGetString(GL_EXTENSIONS),
+ "GL_EXT_texture_filter_anisotropic"))
+ glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &c->anisotropic);
+ else
+ c->anisotropic = 0;
+
+ /* allocate a new texture and get it */
+ glGenTextures(1, &c->texid);
+ get_texture(mi);
+ }
+}
+
+ENTRYPOINT void
+draw_flipflop(ModeInfo *mi)
+{
+ Flipflopcreen *c = &qs[MI_SCREEN(mi)];
+ Window w = MI_WINDOW(mi);
+ Display *disp = MI_DISPLAY(mi);
+
+ if(!c->glx_context || (textured && !c->got_texture))
+ return;
+
+ glXMakeCurrent(disp, w, *(c->glx_context));
+
+ mi->polygon_count = display(mi);
+
+ if(mi->fps_p){
+ do_fps(mi);
+ }
+
+ glFinish();
+ glXSwapBuffers(disp, w);
+
+
+}
+
+ENTRYPOINT void
+free_flipflop(ModeInfo *mi)
+{
+ Flipflopcreen *c = &qs[MI_SCREEN(mi)];
+ if (c->sheet) {
+ randsheet_free(c->sheet);
+ free (c->sheet);
+ }
+}
+
+/*** ADDED RANDSHEET FUNCTIONS ***/
+
+static int
+draw_sheet(float *tex)
+{
+ int polys = 0;
+ glBegin( wire ? GL_LINE_LOOP : GL_QUADS );
+
+ glNormal3f( 0, -1, 0 );
+ glTexCoord2f(tex[0], tex[3]);
+ glVertex3f( half_thick, -half_thick, half_thick );
+ glTexCoord2f(tex[2], tex[3]);
+ glVertex3f( 1-half_thick, -half_thick, half_thick );
+ glTexCoord2f(tex[2], tex[1]);
+ glVertex3f( 1-half_thick, -half_thick, 1-half_thick);
+ glTexCoord2f(tex[0], tex[1]);
+ glVertex3f( half_thick, -half_thick, 1-half_thick );
+ polys++;
+
+ if (wire) { glEnd(); glBegin (GL_LINE_LOOP); }
+
+ /* back */
+ glNormal3f( 0, 1, 0 );
+ glTexCoord2f(tex[0], tex[1]);
+ glVertex3f( half_thick, half_thick, 1-half_thick );
+ glTexCoord2f(tex[2], tex[1]);
+ glVertex3f( 1-half_thick, half_thick, 1-half_thick);
+ glTexCoord2f(tex[2], tex[3]);
+ glVertex3f( 1-half_thick, half_thick, half_thick );
+ glTexCoord2f(tex[0], tex[3]);
+ glVertex3f( half_thick, half_thick, half_thick );
+ polys++;
+
+ if (wire) { glEnd(); return polys; }
+
+ /* 4 edges!!! weee.... */
+ glNormal3f( 0, 0, -1 );
+ glTexCoord2f(tex[0], tex[3]);
+ glVertex3f( half_thick, half_thick, half_thick );
+ glTexCoord2f(tex[2], tex[3]);
+ glVertex3f( 1-half_thick, half_thick, half_thick );
+ glTexCoord2f(tex[2], tex[3]);
+ glVertex3f( 1-half_thick, -half_thick, half_thick );
+ glTexCoord2f(tex[0], tex[3]);
+ glVertex3f( half_thick, -half_thick, half_thick );
+ polys++;
+ glNormal3f( 0, 0, 1 );
+ glTexCoord2f(tex[0], tex[1]);
+ glVertex3f( half_thick, half_thick, 1-half_thick );
+ glTexCoord2f(tex[0], tex[1]);
+ glVertex3f( half_thick, -half_thick, 1-half_thick );
+ glTexCoord2f(tex[2], tex[1]);
+ glVertex3f( 1-half_thick, -half_thick, 1-half_thick );
+ glTexCoord2f(tex[2], tex[1]);
+ glVertex3f( 1-half_thick, half_thick, 1-half_thick );
+ polys++;
+ glNormal3f( 1, 0, 0 );
+ glTexCoord2f(tex[2], tex[1]);
+ glVertex3f( 1-half_thick, half_thick, 1-half_thick );
+ glTexCoord2f(tex[2], tex[1]);
+ glVertex3f( 1-half_thick, -half_thick, 1-half_thick );
+ glTexCoord2f(tex[2], tex[3]);
+ glVertex3f( 1-half_thick, -half_thick, half_thick );
+ glTexCoord2f(tex[2], tex[3]);
+ glVertex3f( 1-half_thick, half_thick, half_thick );
+ polys++;
+ glNormal3f( -1, 0, 0 );
+ glTexCoord2f(tex[0], tex[1]);
+ glVertex3f( half_thick, half_thick, 1-half_thick );
+ glTexCoord2f(tex[0], tex[3]);
+ glVertex3f( half_thick, half_thick, half_thick );
+ glTexCoord2f(tex[0], tex[3]);
+ glVertex3f( half_thick, -half_thick, half_thick );
+ glTexCoord2f(tex[0], tex[1]);
+ glVertex3f( half_thick, -half_thick, 1-half_thick );
+ polys++;
+ glEnd();
+
+ return polys;
+}
+
+/* Reserve memory for the randsheet */
+static void
+randsheet_create( randsheet *rs )
+{
+ rs -> occupied = (int*) malloc(board_x_size*board_y_size * sizeof(int));
+ rs -> xpos = (int*) malloc(numsquares * sizeof(int));
+ rs -> ypos = (int*) malloc(numsquares * sizeof(int));
+ rs -> direction = (int*) malloc(numsquares * sizeof(int));
+ rs -> angle = (float*) malloc(numsquares * sizeof(float));
+ rs -> color = (float*) malloc(numsquares*3 * sizeof(float));
+ rs -> tex = (float*) malloc(numsquares*4 * sizeof(float));
+}
+
+/* Free reserved memory for the randsheet */
+static void
+randsheet_free( randsheet *rs )
+{
+ free(rs->occupied);
+ free(rs->xpos);
+ free(rs->ypos);
+ free(rs->direction);
+ free(rs->angle);
+ free(rs->color);
+ free(rs->tex);
+}
+
+static void
+randsheet_initialize( randsheet *rs )
+{
+ int i, j, index;
+ index = 0;
+ /* put the moving sheets on the board */
+ for( i = 0; i < board_x_size; i++ )
+ {
+ for( j = 0; j < board_y_size; j++ )
+ {
+ /* initially fill up a corner with the moving squares */
+ if( index < numsquares )
+ {
+ rs->occupied[ i * board_y_size + j ] = index;
+ rs->xpos[ index ] = i;
+ rs->ypos[ index ] = j;
+ /* have the square colors start out as a pattern */
+ rs->color[ index*3 + 0 ] = ((i+j)%3 == 0)||((i+j+1)%3 == 0);
+ rs->color[ index*3 + 1 ] = ((i+j+1)%3 == 0);
+ rs->color[ index*3 + 2 ] = ((i+j+2)%3 == 0);
+ index++;
+ }
+ /* leave everything else empty*/
+ else
+ {
+ rs->occupied[ i * board_y_size + j ] = -1;
+ }
+ }
+ }
+ /* initially everything is at rest */
+ for( i=0; i<numsquares; i++ )
+ {
+ rs->direction[ i ] = 0;
+ rs->angle[ i ] = 0;
+ }
+}
+
+/* Pick and random square and direction and try to move it. */
+/* May not actually move anything, just attempt a random move. */
+/* Returns true if move was sucessful. */
+/* This could probably be implemented faster in a dequeue */
+/* to avoid trying to move a square which is already moving */
+/* but speed is most likely bottlenecked by rendering anyway... */
+static int
+randsheet_new_move( randsheet* rs )
+{
+ int i, j;
+ int num, dir;
+ /* pick a random square */
+ num = random( ) % numsquares;
+ i = rs->xpos[ num ];
+ j = rs->ypos[ num ];
+ /* pick a random direction */
+ dir = ( random( )% 4 ) + 1;
+
+ if( rs->direction[ num ] == 0 )
+ {
+ switch( dir )
+ {
+ case 1:
+ /* move up in x */
+ if( ( i + 1 ) < board_x_size )
+ {
+ if( rs->occupied[ (i + 1) * board_y_size + j ] == -1 )
+ {
+ rs->direction[ num ] = dir;
+ rs->occupied[ (i + 1) * board_y_size + j ] = num;
+ rs->occupied[ i * board_y_size + j ] = -1;
+ return 1;
+ }
+ }
+ return 0;
+ break;
+ case 2:
+ /* move up in y */
+ if( ( j + 1 ) < board_y_size )
+ {
+ if( rs->occupied[ i * board_y_size + (j + 1) ] == -1 )
+ {
+ rs->direction[ num ] = dir;
+ rs->occupied[ i * board_y_size + (j + 1) ] = num;
+ rs->occupied[ i * board_y_size + j ] = -1;
+ return 1;
+ }
+ }
+ return 0;
+ break;
+ case 3:
+ /* move down in x */
+ if( ( i - 1 ) >= 0 )
+ {
+ if( rs->occupied[ (i - 1) * board_y_size + j ] == -1 )
+ {
+ rs->direction[ num ] = dir;
+ rs->occupied[ (i - 1) * board_y_size + j ] = num;
+ rs->occupied[ i * board_y_size + j ] = -1;
+ return 1;
+ }
+ }
+ return 0;
+ break;
+ case 4:
+ /* move down in y */
+ if( ( j - 1 ) >= 0 )
+ {
+ if( rs->occupied[ i * board_y_size + (j - 1) ] == -1 )
+ {
+ rs->direction[ num ] = dir;
+ rs->occupied[ i * board_y_size + (j - 1) ] = num;
+ rs->occupied[ i * board_y_size + j ] = -1;
+ return 1;
+ }
+ }
+ return 0;
+ break;
+ default:
+ break;
+ }
+ }
+ return 0;
+}
+
+/* move a single frame. */
+/* Pass in the angle in rads the square rotates in a frame. */
+static void
+randsheet_move( randsheet *rs, float rot )
+{
+ int index;
+ float tmp;
+ for( index = 0 ; index < numsquares; index++ )
+ {
+ switch( rs->direction[ index ] )
+ {
+ case 0:
+ /* not moving */
+ break;
+ case 1:
+ /* move up in x */
+ if( textured && rs->angle[ index ] == 0 )
+ {
+ tmp = rs->tex[ index * 4 + 0 ];
+ rs->tex[ index * 4 + 0 ] = rs->tex[ index * 4 + 2 ];
+ rs->tex[ index * 4 + 2 ] = tmp;
+ }
+ rs->angle[ index ] += rot;
+ /* check to see if we have finished moving */
+ if( rs->angle[ index ] >= M_PI )
+ {
+ rs->xpos[ index ] += 1;
+ rs->direction[ index ] = 0;
+ rs->angle[ index ] = 0;
+ }
+ break;
+ case 2:
+ /* move up in y */
+ if( textured && rs->angle[ index ] == 0 )
+ {
+ tmp = rs->tex[ index * 4 + 1 ];
+ rs->tex[ index * 4 + 1 ] = rs->tex[ index * 4 + 3 ];
+ rs->tex[ index * 4 + 3 ] = tmp;
+ }
+ rs->angle[ index ] += rot;
+ /* check to see if we have finished moving */
+ if( rs->angle[ index ] >= M_PI )
+ {
+ rs->ypos[ index ] += 1;
+ rs->direction[ index ] = 0;
+ rs->angle[ index ] = 0;
+ }
+ break;
+ case 3:
+ /* down in x */
+ rs->angle[ index ] += rot;
+ /* check to see if we have finished moving */
+ if( rs->angle[ index ] >= M_PI )
+ {
+ rs->xpos[ index ] -= 1;
+ rs->direction[ index ] = 0;
+ rs->angle[ index ] = 0;
+ if( textured )
+ {
+ tmp = rs->tex[ index * 4 + 0 ];
+ rs->tex[ index * 4 + 0 ] = rs->tex[ index * 4 + 2 ];
+ rs->tex[ index * 4 + 2 ] = tmp;
+ }
+ }
+ break;
+ case 4:
+ /* down in y */
+ rs->angle[ index ] += rot;
+ /* check to see if we have finished moving */
+ if( rs->angle[ index ] >= M_PI )
+ {
+ rs->ypos[ index ] -= 1;
+ rs->direction[ index ] = 0;
+ rs->angle[ index ] = 0;
+ if( textured )
+ {
+ tmp = rs->tex[ index * 4 + 1 ];
+ rs->tex[ index * 4 + 1 ] = rs->tex[ index * 4 + 3 ];
+ rs->tex[ index * 4 + 3 ] = tmp;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+
+/* draw all the moving squares */
+static int
+randsheet_draw( randsheet *rs )
+{
+ int i, j, polys = 0;
+ int index;
+
+ /* for all moving squares ... */
+ for( index = 0; index < numsquares; index++ )
+ {
+ /* set color */
+ glColor3f( rs->color[ index*3 + 0 ],
+ rs->color[ index*3 + 1 ],
+ rs->color[ index*3 + 2 ] );
+ /* find x and y position */
+ i = rs->xpos[ index ];
+ j = rs->ypos[ index ];
+ glPushMatrix();
+ switch( rs->direction[ index ] )
+ {
+ case 0:
+
+ /* not moving */
+ /* front */
+ glTranslatef( i, 0, j );
+ break;
+ case 1:
+ glTranslatef( i+1, 0, j );
+ glRotatef( 180 - rs->angle[ index ]*180/M_PI, 0, 0, 1 );
+
+ break;
+ case 2:
+ glTranslatef( i, 0, j+1 );
+ glRotatef( 180 - rs->angle[ index ]*180/M_PI, -1, 0, 0 );
+
+ break;
+ case 3:
+ glTranslatef( i, 0, j );
+ glRotatef( rs->angle[ index ]*180/M_PI, 0, 0, 1 );
+ break;
+ case 4:
+ glTranslatef( i, 0, j );
+ glRotatef( rs->angle[ index ]*180/M_PI, -1, 0, 0 );
+ break;
+ default:
+ break;
+ }
+ polys += draw_sheet( rs->tex + index*4 );
+ glPopMatrix();
+
+ }
+ return polys;
+}
+
+/**** END RANDSHEET_BAK FUNCTIONS ***/
+
+XSCREENSAVER_MODULE ("FlipFlop", flipflop)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/flipflop.man b/hacks/glx/flipflop.man
new file mode 100644
index 0000000..17691bc
--- /dev/null
+++ b/hacks/glx/flipflop.man
@@ -0,0 +1,95 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+flipflop - draws a grid of 3D squares that change positions
+.SH SYNOPSIS
+.B flipflop
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-count \fInumber\fP | \-free \fInumber\fP]
+[\-size \fInumber\fP]
+[\-size-x \fInumber\fP]
+[\-size-y \fInumber\fP]
+[\-spin \fInumber\fP]
+[\-mode sticks | tiles]
+[\-delay \fInumber\fP]
+[\-wireframe]
+[\-fps]
+[\-texture]
+.SH DESCRIPTION
+Flipflop draws a grid of 3D colored tiles that change positions with
+each other.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-count \fInumber\fP
+Number of tiles on the board. A value of "0" means "default". The
+default number of tiles depends on the size of the board and the mode:
+95% of total tiles for "tiles" mode and 80% of total sticks for
+"sticks" mode (e.g. 76 tiles or 64 sticks for a 9x9 board).
+.TP 8
+.B \-free \fInumber\fP
+Number of tiles missing from the board. See -count.
+.TP 8
+.B \-size \fInumber\fP
+Number of tiles on each side of the board. Takes precedence over
+-size-x and -size-y. Default: 9.
+.TP 8
+.B \-size-x \fInumber\fP
+Width (in tiles) of the board. Default: 9.
+.TP 8
+.B \-size-y \fInumber\fP
+Length (in tiles) of the board. Default: 9.
+.TP 8
+.B \-spin \fInumber\fP
+Angular velocity for the rotation of the board.
+.TP 8
+.B \-mode sticks
+Draw hopping sticks instead of flipping tiles.
+.TP 8
+.B \-mode tiles
+Draw flipping tiles. This is the default.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-fps | \-no\-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-wireframe
+Only draw outlines.
+.TP 8
+.B \-texture | \-no\-texture
+Whether to texture the tiles with a screen grab or an image.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Kevin Ogden. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Kevin Ogden <kogden1@hotmail.com>. Some additional code by Sergio
+Gutierrez <sergut@gmail.com>.
diff --git a/hacks/glx/flipscreen3d.c b/hacks/glx/flipscreen3d.c
new file mode 100644
index 0000000..e4db5df
--- /dev/null
+++ b/hacks/glx/flipscreen3d.c
@@ -0,0 +1,518 @@
+/*
+ * flipscreen3d - takes snapshots of the screen and flips it around
+ *
+ * version 1.0 - Oct 24, 2001
+ *
+ * Copyright (C) 2001 Ben Buxton (bb@cactii.net)
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*useSHM: True \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_screenflip 0
+# define release_screenflip 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+# include "gltrackball.h"
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+/* lifted from lament.c */
+#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+
+#ifdef USE_GL
+
+/* Should be in <GL/glext.h> */
+# ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT
+# define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
+# endif
+# ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
+# define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
+# endif
+
+#define DEF_ROTATE "True"
+static int rotate;
+
+#define QW 12
+#define QH 12
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+
+static XrmOptionDescRec opts[] = {
+ {"+rotate", ".screenflip.rotate", XrmoptionNoArg, "false" },
+ {"-rotate", ".screenflip.rotate", XrmoptionNoArg, "true" },
+};
+
+
+static argtype vars[] = {
+ {&rotate, "rotate", "Rotate", DEF_ROTATE, t_Bool},
+};
+
+
+
+ENTRYPOINT ModeSpecOpt screenflip_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+#ifdef USE_MODULES
+ModStruct screenflip_description =
+{"screenflip", "init_screenflip", "draw_screenflip", NULL,
+ "draw_screenflip", "init_screenflip", NULL, &screenflip_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "Screenflips", 0, NULL};
+
+#endif
+
+
+typedef struct {
+ GLXContext *glx_context;
+ Window window;
+
+ int winw, winh;
+ int tw, th; /* texture width, height */
+ GLfloat min_tx, min_ty;
+ GLfloat max_tx, max_ty;
+ GLfloat qx, qy, qw, qh; /* the quad we'll draw */
+
+ int regrab;
+ int fadetime; /* fade before regrab */
+
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ GLfloat show_colors[4];
+ GLfloat stretch_val_x, stretch_val_y;
+ GLfloat stretch_val_dx, stretch_val_dy;
+
+ GLfloat curx, cury, curz;
+
+ GLfloat rx, ry, rz;
+ GLfloat rot, drot, odrot, ddrot, orot;
+ float theta, rho, dtheta, drho, gamma, dgamma;
+
+ GLuint texid;
+ Bool mipmap_p;
+ Bool waiting_for_image_p;
+ Bool first_image_p;
+
+ GLfloat anisotropic;
+
+} Screenflip;
+
+static Screenflip *screenflip = NULL;
+
+#include "grab-ximage.h"
+
+static const GLfloat viewer[] = {0.0, 0.0, 15.0};
+
+
+static void getSnapshot (ModeInfo *);
+
+
+ENTRYPOINT Bool
+screenflip_handle_event (ModeInfo *mi, XEvent *event)
+{
+ Screenflip *c = &screenflip[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, c->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &c->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ if (!c->waiting_for_image_p)
+ {
+ getSnapshot (mi);
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+/* draw the texture mapped quad (actually two back to back)*/
+static void showscreen(Screenflip *c, int frozen, int wire)
+{
+ GLfloat x, y, w, h;
+
+ if (c->fadetime) {
+/* r -= 0.02; g -= 0.02; b -= 0.02; */
+ c->show_colors[3] -= 0.02;
+ if (c->show_colors[3] < 0) {
+ c->regrab = 1;
+ c->fadetime = 0;
+ }
+ } else if (c->show_colors[3] < 0) {
+ c->show_colors[0] = c->show_colors[1] =
+ c->show_colors[2] = c->show_colors[3] = 1;
+ c->stretch_val_x = c->stretch_val_y =
+ c->stretch_val_dx = c->stretch_val_dy = 0;
+ }
+ if (c->stretch_val_dx == 0 && !frozen && !(random() % 25))
+ c->stretch_val_dx = (float)(random() % 100) / 5000;
+ if (c->stretch_val_dy == 0 && !frozen && !(random() % 25))
+ c->stretch_val_dy = (float)(random() % 100) / 5000;
+
+ x = c->qx;
+ y = c->qy;
+ w = c->qx+c->qw;
+ h = c->qy-c->qh;
+
+ if (!frozen) {
+ w *= sin (c->stretch_val_x) + 1;
+ x *= sin (c->stretch_val_x) + 1;
+ if (!c->button_down_p) {
+ if (!c->fadetime) c->stretch_val_x += c->stretch_val_dx;
+ if (c->stretch_val_x > 2*M_PI && !(random() % 5))
+ c->stretch_val_dx = (float)(random() % 100) / 5000;
+ else
+ c->stretch_val_x -= 2*M_PI;
+ }
+
+ if (!c->button_down_p && !c->fadetime) c->stretch_val_y += c->stretch_val_dy;
+ h *= sin (c->stretch_val_y) / 2 + 1;
+ y *= sin (c->stretch_val_y) / 2 + 1;
+ if (!c->button_down_p) {
+ if (c->stretch_val_y > 2*M_PI && !(random() % 5))
+ c->stretch_val_dy = (float)(random() % 100) / 5000;
+ else
+ c->stretch_val_y -= 2*M_PI;
+ }
+ }
+
+ glColor4f(c->show_colors[0], c->show_colors[1],
+ c->show_colors[2], c->show_colors[3]);
+
+ if (!wire)
+ {
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glDepthMask(GL_FALSE);
+ }
+
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+
+ glNormal3f(0, 0, 1);
+ glTexCoord2f(c->max_tx, c->max_ty); glVertex3f(w, h, 0);
+ glTexCoord2f(c->max_tx, c->min_ty); glVertex3f(w, y, 0);
+ glTexCoord2f(c->min_tx, c->min_ty); glVertex3f(x, y, 0);
+ glTexCoord2f(c->min_tx, c->max_ty); glVertex3f(x, h, 0);
+
+ glNormal3f(0, 0, -1);
+ glTexCoord2f(c->min_tx, c->min_ty); glVertex3f(x, y, -0.05);
+ glTexCoord2f(c->max_tx, c->min_ty); glVertex3f(w, y, -0.05);
+ glTexCoord2f(c->max_tx, c->max_ty); glVertex3f(w, h, -0.05);
+ glTexCoord2f(c->min_tx, c->max_ty); glVertex3f(x, h, -0.05);
+ glEnd();
+
+
+ glDisable(GL_TEXTURE_2D);
+ glDepthMask(GL_TRUE);
+
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(x, y, 0);
+ glVertex3f(x, h, 0);
+ glVertex3f(w, h, 0);
+ glVertex3f(w, y, 0);
+ glEnd();
+ glDisable(GL_BLEND);
+
+}
+
+/* This function is responsible for 'zooming back' the square after
+ * a new chunk has been grabbed with getSnapshot(), and positioning
+ * it suitably on the screen. Once positioned (where we begin to rotate),
+ * it just does a glTranslatef() and returns 1
+ */
+
+static int inposition(Screenflip *c)
+{
+ GLfloat wx;
+ GLfloat wy;
+ wx = 0 - (c->qw/2);
+ wy = (c->qh/2);
+
+ if (c->curx == 0) c->curx = c->qx;
+ if (c->cury == 0) c->cury = c->qy;
+ if (c->regrab) {
+ c->curz = 0;
+ c->curx = c->qx;
+ c->cury = c->qy;
+ c->regrab = 0;
+ }
+ if (c->curz > -10 || c->curx > wx + 0.1 || c->curx < wx - 0.1 ||
+ c->cury > wy + 0.1 || c->cury < wy - 0.1) {
+ if (c->curz > -10)
+ c->curz -= 0.05;
+ if (c->curx > wx) {
+ c->qx -= 0.02;
+ c->curx -= 0.02;
+ }
+ if (c->curx < wx) {
+ c->qx += 0.02;
+ c->curx += 0.02;
+ }
+ if (c->cury > wy) {
+ c->qy -= 0.02;
+ c->cury -= 0.02;
+ }
+ if (c->cury < wy) {
+ c->qy += 0.02;
+ c->cury += 0.02;
+ }
+ glTranslatef(0, 0, c->curz);
+ return 0;
+ }
+ glTranslatef(0, 0, c->curz);
+ return 1;
+
+}
+
+#if 0
+static void drawgrid(void)
+{
+ int i;
+
+ glColor3f(0, 0.7, 0);
+ glBegin(GL_LINES);
+ for (i = 0 ; i <= 50; i+=2) {
+ glVertex3f( -25, -15, i-70);
+ glVertex3f( 25, -15, i-70);
+ glVertex3f( i-25, -15, -70);
+ glVertex3f( i-25, -15, -20);
+ }
+ glEnd();
+}
+#endif
+
+
+static void display(Screenflip *c, int wire)
+{
+ int frozen;
+ GLfloat rot = current_device_rotation();
+
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity();
+ gluLookAt(viewer[0], viewer[1], viewer[2], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
+ glPushMatrix();
+
+/*
+ glRotatef(rot, 0, 0, 1);
+ if ((rot > 45 && rot < 135) ||
+ (rot < -45 && rot > -135))
+ {
+ GLfloat s = c->winw / (GLfloat) c->winh;
+ glScalef (s, 1/s, 1);
+ }
+*/
+
+ if (inposition(c)) {
+ frozen = 0;
+ glTranslatef(5 * sin(c->theta), 5 * sin(c->rho), 10 * cos(c->gamma) - 10);
+/* randomly change the speed */
+ if (!c->button_down_p && !(random() % 300)) {
+ if (random() % 2)
+ c->drho = 1/60 - (float)(random() % 100)/3000;
+ if (random() % 2)
+ c->dtheta = 1/60 - (float)(random() % 100)/3000;
+ if (random() % 2)
+ c->dgamma = 1/60 - (float)(random() % 100)/3000;
+ }
+ glRotatef(rot, 0, 0, 1);
+ gltrackball_rotate (c->trackball);
+ glRotatef(-rot, 0, 0, 1);
+ if (rotate) glRotatef(c->rot, c->rx, c->ry, c->rz);
+/* update variables with each frame */
+ if(!c->button_down_p && !c->fadetime) {
+ c->theta += c->dtheta;
+ c->rho += c->drho;
+ c->gamma += c->dgamma;
+ c->rot += c->drot;
+ c->drot += c->ddrot;
+ }
+/* dont let our rotation speed get too high */
+ if (c->drot > 5 && c->ddrot > 0)
+ c->ddrot = 0 - (GLfloat)(random() % 100) / 1000;
+ else if (c->drot < -5 && c->ddrot < 0)
+ c->ddrot = (GLfloat)(random() % 100) / 1000;
+ } else { /* reset some paramaters */
+ c->ddrot = 0.05 - (GLfloat)(random() % 100) / 1000;
+ c->theta = c->rho = c->gamma = 0;
+ c->rot = 0;
+ frozen = 1;
+ }
+ if (!c->button_down_p && !c->fadetime && (c->rot >= 360 || c->rot <= -360) && !(random() % 7)) { /* rotate change */
+ c->rx = (GLfloat)(random() % 100) / 100;
+ c->ry = (GLfloat)(random() % 100) / 100;
+ c->rz = (GLfloat)(random() % 100) / 100;
+ }
+ if (c->odrot * c->drot < 0 && c->tw < c->winw && !(random() % 10)) {
+ c->fadetime = 1; /* randomly fade and get new snapshot */
+ }
+ c->orot = c->rot;
+ c->odrot = c->drot;
+ if (c->rot > 360 || c->rot < -360) /* dont overflow rotation! */
+ c->rot -= c->rot;
+ showscreen(c, frozen, wire);
+ glPopMatrix();
+ glFlush();
+}
+
+ENTRYPOINT void reshape_screenflip(ModeInfo *mi, int width, int height)
+{
+ Screenflip *c = &screenflip[MI_SCREEN(mi)];
+ glViewport(0,0,(GLint)width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(45, 1, 2.0, 85);
+ glMatrixMode(GL_MODELVIEW);
+ c->winw = width;
+ c->winh = height;
+}
+
+static void
+image_loaded_cb (const char *filename, XRectangle *geometry,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure)
+{
+ Screenflip *c = (Screenflip *) closure;
+
+ c->tw = texture_width;
+ c->th = texture_height;
+ c->min_tx = (GLfloat) geometry->x / c->tw;
+ c->min_ty = (GLfloat) geometry->y / c->th;
+ c->max_tx = (GLfloat) (geometry->x + geometry->width) / c->tw;
+ c->max_ty = (GLfloat) (geometry->y + geometry->height) / c->th;
+
+ c->qx = -QW/2 + ((GLfloat) geometry->x * QW / image_width);
+ c->qy = QH/2 - ((GLfloat) geometry->y * QH / image_height);
+ c->qw = QW * ((GLfloat) geometry->width / image_width);
+ c->qh = QH * ((GLfloat) geometry->height / image_height);
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+ (c->mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
+
+ if (c->anisotropic >= 1.0)
+ glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
+ c->anisotropic);
+
+ c->waiting_for_image_p = False;
+ c->first_image_p = False;
+}
+
+
+static void getSnapshot (ModeInfo *modeinfo)
+{
+ Screenflip *c = &screenflip[MI_SCREEN(modeinfo)];
+
+ if (MI_IS_WIREFRAME(modeinfo))
+ return;
+
+ c->waiting_for_image_p = True;
+ c->mipmap_p = True;
+ load_texture_async (modeinfo->xgwa.screen, modeinfo->window,
+ *c->glx_context, 0, 0, c->mipmap_p, c->texid,
+ image_loaded_cb, c);
+}
+
+ENTRYPOINT void init_screenflip(ModeInfo *mi)
+{
+ int screen = MI_SCREEN(mi);
+ Screenflip *c;
+
+ MI_INIT(mi, screenflip);
+ c = &screenflip[screen];
+ c->window = MI_WINDOW(mi);
+
+ c->trackball = gltrackball_init (False);
+
+ if ((c->glx_context = init_GL(mi)) != NULL) {
+ reshape_screenflip(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+ c->winh = MI_WIN_HEIGHT(mi);
+ c->winw = MI_WIN_WIDTH(mi);
+ c->qw = QW;
+ c->qh = QH;
+ c->qx = -6;
+ c->qy = 6;
+
+ c->rx = c->ry = 1;
+ c->odrot = 1;
+
+ c->show_colors[0] = c->show_colors[1] =
+ c->show_colors[2] = c->show_colors[3] = 1;
+
+ if (! MI_IS_WIREFRAME(mi))
+ {
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ glDisable(GL_LIGHTING);
+ }
+
+ if (strstr ((char *) glGetString(GL_EXTENSIONS),
+ "GL_EXT_texture_filter_anisotropic"))
+ glGetFloatv (GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &c->anisotropic);
+ else
+ c->anisotropic = 0.0;
+
+ glGenTextures(1, &c->texid);
+
+ c->first_image_p = True;
+ getSnapshot(mi);
+}
+
+ENTRYPOINT void draw_screenflip(ModeInfo *mi)
+{
+ Screenflip *c = &screenflip[MI_SCREEN(mi)];
+ Window w = MI_WINDOW(mi);
+ Display *disp = MI_DISPLAY(mi);
+
+ if (!c->glx_context)
+ return;
+
+ /* Wait for the first image; for subsequent images, load them in the
+ background while animating. */
+ if (c->waiting_for_image_p && c->first_image_p)
+ return;
+
+ glXMakeCurrent(disp, w, *(c->glx_context));
+
+ glBindTexture(GL_TEXTURE_2D, c->texid);
+
+ if (c->regrab)
+ getSnapshot(mi);
+
+ display(c, MI_IS_WIREFRAME(mi));
+
+ if(mi->fps_p) do_fps(mi);
+ glFinish();
+ glXSwapBuffers(disp, w);
+}
+
+XSCREENSAVER_MODULE_2 ("FlipScreen3D", flipscreen3d, screenflip)
+
+#endif
diff --git a/hacks/glx/flipscreen3d.man b/hacks/glx/flipscreen3d.man
new file mode 100644
index 0000000..fecd005
--- /dev/null
+++ b/hacks/glx/flipscreen3d.man
@@ -0,0 +1,61 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+flipscreen3d - rotates an image of the screen through 3 dimensions.
+.SH SYNOPSIS
+.B flipscreen3d
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-no-rotate]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Grabs an image of the desktop, turns it into a GL texture map, and spins it
+around and deforms it in various ways.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-rotate | \-no-rotate
+Whether to rotate.
+.TP 8
+.B \-wireframe
+Just render boxes instead of textures (for debugging).
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Ben Buxton. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Ben Buxton.
diff --git a/hacks/glx/fliptext.c b/hacks/glx/fliptext.c
new file mode 100644
index 0000000..c233e8b
--- /dev/null
+++ b/hacks/glx/fliptext.c
@@ -0,0 +1,1001 @@
+/*
+ * fliptext, Copyright (c) 2005-2015 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#define DEF_FONT "-*-utopia-bold-r-normal-*-*-720-*-*-*-*-*-*"
+#define DEF_COLOR "#00CCFF"
+
+#define DEFAULTS "*delay: 10000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*usePty: False \n" \
+ "*texFontCacheSize: 60 \n" \
+ "*font: " DEF_FONT "\n" \
+ ".foreground: " DEF_COLOR "\n" \
+ "*program: xscreensaver-text --cols 0" /* don't wrap */
+
+# define release_fliptext 0
+# define fliptext_handle_event xlockmore_no_events
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+#include "xlockmore.h"
+#include "texfont.h"
+#include "textclient.h"
+
+#ifdef USE_GL /* whole file */
+
+/* Should be in <GL/glext.h> */
+# ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT
+# define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
+# endif
+# ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
+# define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
+# endif
+
+
+#define DEF_LINES "8"
+#define DEF_FONT_SIZE "20"
+#define DEF_COLUMNS "80"
+#define DEF_ALIGNMENT "random"
+#define DEF_SPEED "1.0"
+#define TAB_WIDTH 8
+
+#define FONT_WEIGHT 14
+#define KEEP_ASPECT
+
+typedef enum { NEW, HESITATE, IN, LINGER, OUT, DEAD } line_state;
+typedef enum { SCROLL_BOTTOM, SCROLL_TOP, SPIN } line_anim_type;
+
+typedef struct { GLfloat x, y, z; } XYZ;
+
+typedef struct {
+ char *text;
+ GLfloat width, height; /* size */
+ XYZ from, to, current; /* start, end, and current position */
+ GLfloat fth, tth, cth; /* rotation around Z */
+
+ int cluster_size; /* how many lines in this cluster */
+ int cluster_pos; /* position of this line in the cluster */
+
+ line_state state; /* current motion model */
+ int step, steps; /* progress along this path */
+ GLfloat color[4];
+
+} line;
+
+
+typedef struct {
+ Display *dpy;
+ GLXContext *glx_context;
+
+ texture_font_data *texfont;
+ text_data *tc;
+
+ int alignment;
+
+ char *buf;
+ int buf_size;
+ int buf_tail;
+
+ int char_width; /* in font units */
+ int line_height; /* in font units */
+ double font_scale; /* convert font units to display units */
+
+ int font_wrap_pixels; /* in font units (for wrapping text) */
+
+ int top_margin, bottom_margin;
+ int left_margin, right_margin;
+
+ int nlines;
+ int lines_size;
+ line **lines;
+
+ line_anim_type anim_type;
+ XYZ in, mid, out;
+ XYZ rotation;
+ GLfloat color[4];
+
+} fliptext_configuration;
+
+
+static fliptext_configuration *scs = NULL;
+
+static int max_lines, min_lines;
+static float font_size;
+static int target_columns;
+static char *alignment_str;
+static int alignment_random_p;
+static GLfloat speed;
+
+static XrmOptionDescRec opts[] = {
+ {"-lines", ".lines", XrmoptionSepArg, 0 },
+ {"-size", ".fontSize", XrmoptionSepArg, 0 },
+ {"-columns", ".columns", XrmoptionSepArg, 0 },
+ {"-speed", ".speed", XrmoptionSepArg, 0 },
+/*{"-font", ".font", XrmoptionSepArg, 0 },*/
+ {"-alignment", ".alignment", XrmoptionSepArg, 0 },
+ {"-left", ".alignment", XrmoptionNoArg, "Left" },
+ {"-right", ".alignment", XrmoptionNoArg, "Right" },
+ {"-center", ".alignment", XrmoptionNoArg, "Center" },
+};
+
+static argtype vars[] = {
+ {&max_lines, "lines", "Integer", DEF_LINES, t_Int},
+ {&font_size, "fontSize", "Float", DEF_FONT_SIZE, t_Float},
+ {&target_columns, "columns", "Integer", DEF_COLUMNS, t_Int},
+ {&alignment_str, "alignment", "Alignment", DEF_ALIGNMENT, t_String},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt fliptext_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+
+/* Tabs are bad, mmmkay? */
+
+static char *
+untabify (const char *string)
+{
+ const char *ostring = string;
+ char *result = (char *) malloc ((strlen(string) * 8) + 1);
+ char *out = result;
+ int col = 0;
+ while (*string)
+ {
+ if (*string == '\t')
+ {
+ do {
+ col++;
+ *out++ = ' ';
+ } while (col % TAB_WIDTH);
+ string++;
+ }
+ else if (*string == '\r' || *string == '\n')
+ {
+ *out++ = *string++;
+ col = 0;
+ }
+ else if (*string == '\010') /* backspace */
+ {
+ if (string > ostring)
+ out--, string++;
+ }
+ else
+ {
+ *out++ = *string++;
+ col++;
+ }
+ }
+ *out = 0;
+
+ return result;
+}
+
+static void
+strip (char *s, Bool leading, Bool trailing)
+{
+ int L = strlen(s);
+ if (trailing)
+ while (L > 0 && (s[L-1] == ' ' || s[L-1] == '\t'))
+ s[L--] = 0;
+ if (leading)
+ {
+ char *s2 = s;
+ while (*s2 == ' ' || *s2 == '\t')
+ s2++;
+ if (s == s2)
+ return;
+ while (*s2)
+ *s++ = *s2++;
+ *s = 0;
+ }
+}
+
+
+static int
+char_width (fliptext_configuration *sc, char c)
+{
+ XCharStruct e;
+ char s[2];
+ s[0] = c;
+ s[1] = 0;
+ texture_string_metrics (sc->texfont, s, &e, 0, 0);
+ return e.width;
+}
+
+
+/* Returns a single line of text from the output buffer of the subprocess,
+ taking into account wrapping, centering, etc. Returns 0 if no complete
+ line is currently available.
+ */
+static char *
+get_one_line (fliptext_configuration *sc)
+{
+ char *result = 0;
+ int wrap_pix = sc->font_wrap_pixels;
+ int col = 0;
+ int col_pix = 0;
+ char *s = sc->buf;
+ int target = sc->buf_size - sc->buf_tail - 2;
+
+ /* Fill as much as we can into sc->buf, but stop at newline.
+ */
+ while (target > 0)
+ {
+ int c = textclient_getc (sc->tc);
+ if (c <= 0)
+ break;
+ sc->buf[sc->buf_tail++] = (char) c;
+ sc->buf[sc->buf_tail] = 0;
+ target--;
+ if (c == '\r' || c == '\n')
+ break;
+ }
+
+ while (!result)
+ {
+ int cw;
+
+ if (s >= sc->buf + sc->buf_tail)
+ /* Reached end of buffer before end of line. Bail. */
+ return 0;
+
+ cw = char_width (sc, *s);
+
+ if (*s == '\r' || *s == '\n' ||
+ col_pix + cw >= wrap_pix)
+ {
+ int L = s - sc->buf;
+
+ if (*s == '\r' || *s == '\n')
+ {
+ if (*s == '\r' && s[1] == '\n') /* swallow CRLF too */
+ *s++ = 0;
+
+ *s++ = 0;
+ }
+ else
+ {
+ /* We wrapped -- try to back up to the previous word boundary. */
+ char *s2 = s;
+ int n = 0;
+ while (s2 > sc->buf && *s2 != ' ' && *s2 != '\t')
+ s2--, n++;
+ if (s2 > sc->buf)
+ {
+ s = s2;
+ *s++ = 0;
+ L = s - sc->buf;
+ }
+ }
+
+ if (result) abort();
+ result = (char *) malloc (L+1);
+ memcpy (result, sc->buf, L);
+ result[L] = 0;
+
+ {
+ char *t = result;
+ char *ut = untabify (t);
+ strip (ut, (sc->alignment == 0), 1); /* if centering, strip
+ leading whitespace too */
+ result = ut;
+ free (t);
+ }
+
+ if (sc->buf_tail > (s - sc->buf))
+ {
+ int i = sc->buf_tail - (s - sc->buf);
+ memmove (sc->buf, s, i);
+ sc->buf_tail = i;
+ sc->buf[sc->buf_tail] = 0;
+ }
+ else
+ {
+ sc->buf_tail = 0;
+ }
+
+ sc->buf[sc->buf_tail] = 0;
+ s = sc->buf;
+ col = 0;
+ col_pix = 0;
+ }
+ else
+ {
+ col++;
+ col_pix += cw;
+ if (*s == '\t')
+ {
+ int tab_pix = TAB_WIDTH * sc->char_width;
+ col = TAB_WIDTH * ((col / TAB_WIDTH) + 1);
+ col_pix = tab_pix * ((col / tab_pix) + 1);
+ }
+ s++;
+ }
+ }
+
+ return result;
+}
+
+
+static Bool
+blank_p (const char *s)
+{
+ for (; *s; s++)
+ if (*s != ' ' && *s != '\t' && *s != '\r' && *s != '\n')
+ return False;
+ return True;
+}
+
+/* Reads some text from the subprocess, and creates and returns a `line'
+ object. Adds that object to the lines list. Returns 0 if no text
+ available yet.
+
+ If skip_blanks_p, then keep trying for new lines of text until we
+ get one that is not empty.
+ */
+static line *
+make_line (fliptext_configuration *sc, Bool skip_blanks_p)
+{
+ XCharStruct e;
+ line *ln;
+ char *s;
+
+ AGAIN:
+ s = get_one_line (sc);
+ if (s && skip_blanks_p && blank_p (s))
+ {
+ free (s);
+ goto AGAIN;
+ }
+
+ if (!s) return 0;
+
+ ln = (line *) calloc (1, sizeof(*ln));
+ ln->text = s;
+ ln->state = NEW;
+ texture_string_metrics (sc->texfont, s, &e, 0, 0);
+ ln->width = sc->font_scale * e.width;
+ ln->height = sc->font_scale * sc->line_height;
+
+ memcpy (ln->color, sc->color, sizeof(ln->color));
+
+ sc->nlines++;
+ if (sc->lines_size <= sc->nlines)
+ {
+ sc->lines_size = (sc->lines_size * 1.2) + sc->nlines;
+ sc->lines = (line **)
+ realloc (sc->lines, sc->lines_size * sizeof(*sc->lines));
+ if (! sc->lines)
+ {
+ fprintf (stderr, "%s: out of memory (%d lines)\n",
+ progname, sc->lines_size);
+ exit (1);
+ }
+ }
+
+ sc->lines[sc->nlines-1] = ln;
+ return ln;
+}
+
+
+/* frees the object and removes it from the list.
+ */
+static void
+free_line (fliptext_configuration *sc, line *line)
+{
+ int i;
+ for (i = 0; i < sc->nlines; i++)
+ if (sc->lines[i] == line)
+ break;
+ if (i == sc->nlines) abort();
+ for (; i < sc->nlines-1; i++)
+ sc->lines[i] = sc->lines[i+1];
+ sc->lines[i] = 0;
+ sc->nlines--;
+
+ free (line->text);
+ free (line);
+}
+
+
+static void
+draw_line (ModeInfo *mi, line *line)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ fliptext_configuration *sc = &scs[MI_SCREEN(mi)];
+
+ if (! line->text || !*line->text ||
+ line->state == NEW || line->state == HESITATE || line->state == DEAD)
+ return;
+
+ glPushMatrix();
+ glTranslatef (line->current.x, line->current.y, line->current.z);
+
+ glRotatef (line->cth, 0, 1, 0);
+
+ if (sc->alignment == 1)
+ glTranslatef (-line->width, 0, 0);
+ else if (sc->alignment == 0)
+ glTranslatef (-line->width/2, 0, 0);
+
+ glScalef (sc->font_scale, sc->font_scale, sc->font_scale);
+
+ glColor4f (line->color[0], line->color[1], line->color[2], line->color[3]);
+
+ if (!wire)
+ print_texture_string (sc->texfont, line->text);
+ else
+ {
+ int w, h;
+ char *s = line->text;
+ char c[2];
+ c[1]=0;
+ glDisable (GL_TEXTURE_2D);
+ glColor3f (0.4, 0.4, 0.4);
+ while (*s)
+ {
+ XCharStruct e;
+ *c = *s++;
+ texture_string_metrics (sc->texfont, c, &e, 0, 0);
+ w = e.width;
+ h = e.ascent + e.descent;
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (0, 0, 0);
+ glVertex3f (w, 0, 0);
+ glVertex3f (w, h, 0);
+ glVertex3f (0, h, 0);
+ glEnd();
+ glTranslatef (w, 0, 0);
+ }
+ }
+
+#if 0
+ glDisable (GL_TEXTURE_2D);
+ glColor3f (0.4, 0.4, 0.4);
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (0, 0, 0);
+ glVertex3f (line->width/sc->font_scale, 0, 0);
+ glVertex3f (line->width/sc->font_scale, line->height/sc->font_scale, 0);
+ glVertex3f (0, line->height/sc->font_scale, 0);
+ glEnd();
+ if (!wire) glEnable (GL_TEXTURE_2D);
+#endif
+
+ glPopMatrix();
+
+ mi->polygon_count += strlen (line->text);
+}
+
+static void
+tick_line (fliptext_configuration *sc, line *line)
+{
+ int stagger = 30; /* frames of delay between line spin-outs */
+ int slide = 600; /* frames in a slide in/out */
+ int linger = 0; /* frames to pause with no motion */
+ double i, ii;
+
+ if (line->state >= DEAD) abort();
+ if (++line->step >= line->steps)
+ {
+ line->state++;
+ line->step = 0;
+
+ if (linger == 0 && line->state == LINGER)
+ line->state++;
+
+ if (sc->anim_type != SPIN)
+ stagger *= 2;
+
+ switch (line->state)
+ {
+ case HESITATE: /* entering state HESITATE */
+ switch (sc->anim_type)
+ {
+ case SPIN:
+ line->steps = (line->cluster_pos * stagger);
+ break;
+ case SCROLL_TOP:
+ line->steps = stagger * (line->cluster_size - line->cluster_pos);
+ break;
+ case SCROLL_BOTTOM:
+ line->steps = stagger * line->cluster_pos;
+ break;
+ default:
+ abort();
+ }
+ break;
+
+ case IN:
+ line->color[3] = 0;
+ switch (sc->anim_type)
+ {
+ case SCROLL_BOTTOM: /* entering state BOTTOM IN */
+ line->from = sc->in;
+ line->to = sc->mid;
+ line->from.y = (sc->bottom_margin -
+ (line->height *
+ (line->cluster_pos + 1)));
+ line->to.y += (line->height *
+ ((line->cluster_size/2.0) - line->cluster_pos));
+ line->steps = slide;
+ break;
+
+ case SCROLL_TOP: /* entering state TOP IN */
+ line->from = sc->in;
+ line->to = sc->mid;
+ line->from.y = (sc->top_margin +
+ (line->height *
+ (line->cluster_size - line->cluster_pos)));
+ line->to.y += (line->height *
+ ((line->cluster_size/2.0) - line->cluster_pos));
+ line->steps = slide;
+ break;
+
+ case SPIN: /* entering state SPIN IN */
+ line->from = sc->in;
+ line->to = sc->mid;
+ line->to.y += (line->height *
+ ((line->cluster_size/2.0) - line->cluster_pos));
+ line->from.y += (line->height *
+ ((line->cluster_size/2.0) - line->cluster_pos));
+
+ line->fth = 270;
+ line->tth = 0;
+ line->steps = slide;
+ break;
+
+ default:
+ abort();
+ }
+ break;
+
+ case OUT:
+ switch (sc->anim_type)
+ {
+ case SCROLL_BOTTOM: /* entering state BOTTOM OUT */
+ line->from = line->to;
+ line->to = sc->out;
+ line->to.y = (sc->top_margin +
+ (line->height *
+ (line->cluster_size - line->cluster_pos)));
+ line->steps = slide;
+ break;
+
+ case SCROLL_TOP: /* entering state TOP OUT */
+ line->from = line->to;
+ line->to = sc->out;
+ line->to.y = (sc->bottom_margin -
+ (line->height *
+ (line->cluster_pos + 1)));
+ line->steps = slide;
+ break;
+
+ case SPIN: /* entering state SPIN OUT */
+ line->from = line->to;
+ line->to = sc->out;
+ line->to.y += (line->height *
+ ((line->cluster_size/2.0) - line->cluster_pos));
+
+ line->fth = line->tth;
+ line->tth = -270;
+ line->steps = slide;
+ break;
+
+ default:
+ abort();
+ }
+ break;
+
+ case LINGER:
+ line->from = line->to;
+ line->steps = linger;
+ break;
+
+ default:
+ break;
+ }
+
+ line->steps /= speed;
+ }
+
+ switch (line->state)
+ {
+ case IN:
+ case OUT:
+ i = (double) line->step / line->steps;
+
+ /* Move along the path exponentially, slow side towards the middle. */
+ if (line->state == OUT)
+ ii = i * i;
+ else
+ ii = 1 - ((1-i) * (1-i));
+
+ line->current.x = line->from.x + (ii * (line->to.x - line->from.x));
+ line->current.y = line->from.y + (ii * (line->to.y - line->from.y));
+ line->current.z = line->from.z + (ii * (line->to.z - line->from.z));
+ line->cth = line->fth + (ii * (line->tth - line->fth));
+
+ if (line->state == OUT) ii = 1-ii;
+ line->color[3] = sc->color[3] * ii;
+ break;
+
+ case HESITATE:
+ case LINGER:
+ case DEAD:
+ break;
+ default:
+ abort();
+ }
+}
+
+
+/* Start a new cluster of lines going.
+ Pick their anim type, and in, mid, and out positions.
+ */
+static void
+reset_lines (ModeInfo *mi)
+{
+ fliptext_configuration *sc = &scs[MI_SCREEN(mi)];
+ int i;
+ line *prev = 0;
+ GLfloat minx, maxx, miny, maxy, minz, maxz, maxw, maxh;
+
+ sc->rotation.x = 5 - BELLRAND(10);
+ sc->rotation.y = 5 - BELLRAND(10);
+ sc->rotation.z = 5 - BELLRAND(10);
+
+ switch (random() % 8)
+ {
+ case 0: sc->anim_type = SCROLL_TOP; break;
+ case 1: sc->anim_type = SCROLL_BOTTOM; break;
+ default: sc->anim_type = SPIN; break;
+ }
+
+ minx = sc->left_margin * 0.9;
+ maxx = sc->right_margin * 0.9;
+
+ miny = sc->bottom_margin * 0.9;
+ maxy = sc->top_margin * 0.9;
+
+ minz = sc->left_margin * 5;
+ maxz = sc->right_margin * 2;
+
+ maxw = sc->font_wrap_pixels * sc->font_scale;
+ maxh = max_lines * sc->line_height * sc->font_scale;
+
+ if (maxw > maxx - minx)
+ maxw = maxx - minx;
+ if (maxh > maxy - miny)
+ maxh = maxy - miny;
+
+ if (alignment_random_p)
+ sc->alignment = (random() % 3) - 1;
+
+ if (sc->alignment == -1) maxx -= maxw;
+ else if (sc->alignment == 1) minx += maxw;
+ else minx += maxw/2, maxx -= maxw/2;
+
+ miny += maxh/2;
+ maxy -= maxh/2;
+
+ sc->mid.x = minx + frand (maxx - minx);
+ if (sc->anim_type == SPIN)
+ sc->mid.y = miny + BELLRAND (maxy - miny);
+ else
+ sc->mid.y = miny + frand (maxy - miny);
+
+ sc->in.x = BELLRAND(sc->right_margin * 2) - sc->right_margin;
+ sc->out.x = BELLRAND(sc->right_margin * 2) - sc->right_margin;
+
+ sc->in.y = miny + frand(maxy - miny);
+ sc->out.y = miny + frand(maxy - miny);
+
+ sc->in.z = minz + frand(maxz - minz);
+ sc->out.z = minz + frand(maxz - minz);
+
+ sc->mid.z = 0;
+
+ if (sc->anim_type == SPIN && sc->in.z > 0) sc->in.z /= 4;
+ if (sc->anim_type == SPIN && sc->out.z > 0) sc->out.z /= 4;
+
+ for (i = 0; i < max_lines; i++)
+ {
+ line *line = make_line (sc, (i == 0));
+ if (!line) break; /* no text available */
+ if (i >= min_lines &&
+ (!line->text || !*line->text)) /* blank after min */
+ break;
+ }
+
+ for (i = 0; i < sc->nlines; i++)
+ {
+ line *line = sc->lines[i];
+ if (!prev)
+ {
+ line->from.y = sc->bottom_margin;
+ line->to.y = 0;
+ }
+ else
+ {
+ line->from.y = prev->from.y - prev->height;
+ line->to.y = prev->to.y - prev->height;
+ }
+ line->cluster_pos = i;
+ line->cluster_size = sc->nlines;
+ prev = line;
+ }
+}
+
+
+static void
+parse_color (ModeInfo *mi, const char *name, const char *s, GLfloat *a)
+{
+ XColor c;
+ if (! XParseColor (MI_DISPLAY(mi), MI_COLORMAP(mi), s, &c))
+ {
+ fprintf (stderr, "%s: can't parse %s color %s", progname, name, s);
+ exit (1);
+ }
+ a[0] = c.red / 65536.0;
+ a[1] = c.green / 65536.0;
+ a[2] = c.blue / 65536.0;
+ a[3] = 1.0;
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_fliptext (ModeInfo *mi, int width, int height)
+{
+ fliptext_configuration *sc = &scs[MI_SCREEN(mi)];
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (60.0, 1/h, 0.01, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 2.6,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ sc->right_margin = sc->top_margin / h;
+ sc->left_margin = -sc->right_margin;
+}
+
+
+ENTRYPOINT void
+init_fliptext (ModeInfo *mi)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+
+ fliptext_configuration *sc;
+
+ MI_INIT(mi, scs);
+
+ sc = &scs[MI_SCREEN(mi)];
+ sc->lines = (line **) calloc (max_lines+1, sizeof(char *));
+
+ sc->dpy = MI_DISPLAY(mi);
+
+ if ((sc->glx_context = init_GL(mi)) != NULL) {
+ reshape_fliptext (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */
+ }
+
+ {
+ XCharStruct e;
+ int cw, lh, ascent, descent;
+ sc->texfont = load_texture_font (MI_DISPLAY(mi), "font");
+ check_gl_error ("loading font");
+ texture_string_metrics (sc->texfont, "n", &e, &ascent, &descent);
+ cw = e.width;
+ lh = ascent + descent;
+ sc->char_width = cw;
+ sc->line_height = lh;
+ }
+
+ if (!wire)
+ {
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable (GL_BLEND);
+ glEnable (GL_ALPHA_TEST);
+ glEnable (GL_TEXTURE_2D);
+
+ /* "Anistropic filtering helps for quadrilateral-angled textures.
+ A sharper image is accomplished by interpolating and filtering
+ multiple samples from one or more mipmaps to better approximate
+ very distorted textures. This is the next level of filtering
+ after trilinear filtering." */
+ if (strstr ((char *) glGetString(GL_EXTENSIONS),
+ "GL_EXT_texture_filter_anisotropic"))
+ {
+ GLfloat anisotropic = 0.0;
+ glGetFloatv (GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &anisotropic);
+ if (anisotropic >= 1.0)
+ glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
+ anisotropic);
+ }
+ }
+
+ /* The default font is (by fiat) "18 points".
+ Interpret the user's font size request relative to that.
+ */
+ sc->font_scale = 3 * (font_size / 18.0);
+
+ if (target_columns <= 2) target_columns = 2;
+
+ /* Figure out what the wrap column should be, in font-coordinate pixels.
+ Compute it from the given -columns value, but don't let it be wider
+ than the screen.
+ */
+ {
+ GLfloat maxw = 110 * sc->line_height / sc->font_scale; /* magic... */
+ sc->font_wrap_pixels = target_columns * sc->char_width;
+ if (sc->font_wrap_pixels > maxw ||
+ sc->font_wrap_pixels <= 0)
+ sc->font_wrap_pixels = maxw;
+ }
+
+ sc->buf_size = target_columns * max_lines;
+ sc->buf = (char *) calloc (1, sc->buf_size);
+
+ alignment_random_p = False;
+ if (!alignment_str || !*alignment_str ||
+ !strcasecmp(alignment_str, "left"))
+ sc->alignment = -1;
+ else if (!strcasecmp(alignment_str, "center") ||
+ !strcasecmp(alignment_str, "middle"))
+ sc->alignment = 0;
+ else if (!strcasecmp(alignment_str, "right"))
+ sc->alignment = 1;
+ else if (!strcasecmp(alignment_str, "random"))
+ sc->alignment = -1, alignment_random_p = True;
+
+ else
+ {
+ fprintf (stderr,
+ "%s: alignment must be left/center/right/random, not \"%s\"\n",
+ progname, alignment_str);
+ exit (1);
+ }
+
+ sc->tc = textclient_open (sc->dpy);
+
+ if (max_lines < 1) max_lines = 1;
+ min_lines = max_lines * 0.66;
+ if (min_lines > max_lines - 3) min_lines = max_lines - 4;
+ if (min_lines < 1) min_lines = 1;
+
+ parse_color (mi, "foreground",
+ get_string_resource(mi->dpy, "foreground", "Foreground"),
+ sc->color);
+
+ sc->top_margin = (sc->char_width * 100);
+ sc->bottom_margin = -sc->top_margin;
+ reshape_fliptext (mi, MI_WIDTH(mi), MI_HEIGHT(mi)); /* compute left/right */
+}
+
+
+ENTRYPOINT void
+draw_fliptext (ModeInfo *mi)
+{
+ fliptext_configuration *sc = &scs[MI_SCREEN(mi)];
+/* XtAppContext app = XtDisplayToApplicationContext (sc->dpy);*/
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i;
+
+ if (!sc->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(sc->glx_context));
+
+#if 0
+ if (XtAppPending (app) & (XtIMTimer|XtIMAlternateInput))
+ XtAppProcessEvent (app, XtIMTimer|XtIMAlternateInput);
+#endif
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ mi->polygon_count = 0;
+
+ glPushMatrix();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+ {
+ GLfloat s = 3.0 / (sc->top_margin - sc->bottom_margin);
+ glScalef(s, s, s);
+ }
+
+ glRotatef (sc->rotation.x, 1, 0, 0);
+ glRotatef (sc->rotation.y, 0, 1, 0);
+ glRotatef (sc->rotation.z, 0, 0, 1);
+
+#if 0
+ glDisable (GL_TEXTURE_2D);
+ glColor3f (1,1,1);
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (sc->left_margin, sc->top_margin, 0);
+ glVertex3f (sc->right_margin, sc->top_margin, 0);
+ glVertex3f (sc->right_margin, sc->bottom_margin, 0);
+ glVertex3f (sc->left_margin, sc->bottom_margin, 0);
+ glEnd();
+ glBegin (GL_LINES);
+ glVertex3f (sc->in.x, sc->top_margin, sc->in.z);
+ glVertex3f (sc->in.x, sc->bottom_margin, sc->in.z);
+ glVertex3f (sc->mid.x, sc->top_margin, sc->mid.z);
+ glVertex3f (sc->mid.x, sc->bottom_margin, sc->mid.z);
+ glVertex3f (sc->out.x, sc->top_margin, sc->out.z);
+ glVertex3f (sc->out.x, sc->bottom_margin, sc->out.z);
+ glEnd();
+ glEnable (GL_TEXTURE_2D);
+#endif
+
+ for (i = 0; i < sc->nlines; i++)
+ {
+ line *line = sc->lines[i];
+ draw_line (mi, line);
+ tick_line (sc, line);
+ }
+
+ for (i = sc->nlines-1; i >= 0; i--)
+ {
+ line *line = sc->lines[i];
+ if (line->state == DEAD)
+ free_line (sc, line);
+ }
+
+ if (sc->nlines == 0)
+ reset_lines (mi);
+
+ glPopMatrix();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers(dpy, window);
+}
+
+ENTRYPOINT void
+free_fliptext (ModeInfo *mi)
+{
+ fliptext_configuration *sc = &scs[MI_SCREEN(mi)];
+ if (sc->tc)
+ textclient_close (sc->tc);
+ free(sc->lines);
+
+ /* #### there's more to free here */
+}
+
+XSCREENSAVER_MODULE ("FlipText", fliptext)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/fliptext.man b/hacks/glx/fliptext.man
new file mode 100644
index 0000000..8d2915e
--- /dev/null
+++ b/hacks/glx/fliptext.man
@@ -0,0 +1,114 @@
+.TH XScreenSaver 1 "20-Mar-2005" "X Version 11"
+.SH NAME
+fliptext - draws pages of text whose lines transparently flip around
+.SH SYNOPSIS
+.B fliptext
+[\-display \fIhost:display.screen\fP] [\-window] [\-root]
+[\-visual \fIvisual\fP]
+[\-delay \fImicroseconds\fP]
+[\-program \fIcommand\fP]
+[\-size \fIinteger\fP ]
+[\-columns \fIinteger\fP]
+[\-left | \-center | \-right]
+[\-lines \fIinteger\fP]
+[\-speed \fIfloat\fP]
+[\-delay \fIusecs\fP]
+[\-font \fIxlfd\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+The \fIfliptext\fP program runs another program to generate a stream of
+text, then animates the lines of that text transparently flipping in
+and out in 3D.
+.SH OPTIONS
+.I fliptext
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-program \fIsh-command\fP
+This program will be run periodically, and its output will be the text
+that is displayed. Default \fIxscreensaver\-text\fP.
+
+You can configure the text printed through the "Advanced" tab of
+.BR xscreensaver\-demo (1),
+or by editing your ~/.xscreensaver file.
+.TP 8
+.B \-size \fIinteger\fP
+How large a font to use, in points. (Well, in some arbitrary unit
+we're calling "points" for the sake of argument.) Default: 20.
+.TP 8
+.B \-columns \fIinteger\fP
+At (approximately) what column to wrap lines. Default 80. Wrapping is
+done by pixels, not characters, and lines will always wrap at the
+edge of the screen regardless.
+.TP 8
+.B \-left | \-center | \-right
+Whether to align the text flush left, centered, or flush right.
+The default is to choose randomly each time a new screen of text
+is displayed.
+.TP 8
+.B \-lines \fIinteger\fP
+How many lines of text should be shown at once. Default 8.
+.TP 8
+.B \-speed \fIratio\fP
+Change the animation speed; 0.5 to go half as fast, 2.0 to go twice as fast.
+.TP 8
+.B \-delay \fIusecs\fP
+The delay between frames of the animation; default is 10000 (1/10th second.)
+.TP 8
+.B \-font \fIfont-name\fP
+The name of the font to use. For best effect, this should be a large
+font (at least 36 points.) The bigger the font, the better looking the
+characters will be. Note that the size of this font affects only the
+clarity of the characters, not their size on the screen: for that, use
+the \fI\-size\fP or \fI\-columns\fP options.
+
+Default: -*-utopia-bold-r-normal-*-*-720-*-*-*-*-iso8859-1
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR xscreensaver (1),
+.BR xscreensaver-text (1),
+.BR fortune (1),
+.BR phosphor (MANSUFFIX),
+.BR apple2 (MANSUFFIX),
+.BR fontglide (MANSUFFIX),
+.BR ljlatest (MANSUFFIX),
+.BR dadadodo (1),
+.BR webcollage (MANSUFFIX),
+.BR driftnet (1)
+.BR EtherPEG ,
+.BR EtherPeek
+.SH COPYRIGHT
+Copyright \(co 2005 by Jamie Zawinski.
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>
diff --git a/hacks/glx/flurry-smoke.c b/hacks/glx/flurry-smoke.c
new file mode 100644
index 0000000..245e9f1
--- /dev/null
+++ b/hacks/glx/flurry-smoke.c
@@ -0,0 +1,1441 @@
+/*
+
+Copyright (c) 2002, Calum Robinson
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the author nor the names of its contributors may be used
+ to endorse or promote products derived from this software without specific
+ prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+/* Smoke.cpp: implementation of the Smoke class. */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "flurry.h"
+
+#define MAXANGLES 16384
+#define NOT_QUITE_DEAD 3
+
+#define intensity 75000.0f;
+
+void InitSmoke(SmokeV *s)
+{
+ int i;
+ s->nextParticle = 0;
+ s->nextSubParticle = 0;
+ s->lastParticleTime = 0.25f;
+ s->firstTime = 1;
+ s->frame = 0;
+ for (i=0;i<3;i++) {
+ s->old[i] = RandFlt(-100.0, 100.0);
+ }
+}
+
+void UpdateSmoke_ScalarBase(global_info_t *global, flurry_info_t *flurry, SmokeV *s)
+{
+ int i,j,k;
+ float sx = flurry->star->position[0];
+ float sy = flurry->star->position[1];
+ float sz = flurry->star->position[2];
+ double frameRate;
+ double frameRateModifier;
+
+
+ s->frame++;
+
+ if(!s->firstTime) {
+ /* release 12 puffs every frame */
+ if(flurry->fTime - s->lastParticleTime >= 1.0f / 121.0f) {
+ float dx,dy,dz,deltax,deltay,deltaz;
+ float f;
+ float rsquared;
+ float mag;
+
+ dx = s->old[0] - sx;
+ dy = s->old[1] - sy;
+ dz = s->old[2] - sz;
+ mag = 5.0f;
+ deltax = (dx * mag);
+ deltay = (dy * mag);
+ deltaz = (dz * mag);
+ for(i=0;i<flurry->numStreams;i++) {
+ float streamSpeedCoherenceFactor;
+
+ s->p[s->nextParticle].delta[0].f[s->nextSubParticle] = deltax;
+ s->p[s->nextParticle].delta[1].f[s->nextSubParticle] = deltay;
+ s->p[s->nextParticle].delta[2].f[s->nextSubParticle] = deltaz;
+ s->p[s->nextParticle].position[0].f[s->nextSubParticle] = sx;
+ s->p[s->nextParticle].position[1].f[s->nextSubParticle] = sy;
+ s->p[s->nextParticle].position[2].f[s->nextSubParticle] = sz;
+ s->p[s->nextParticle].oldposition[0].f[s->nextSubParticle] = sx;
+ s->p[s->nextParticle].oldposition[1].f[s->nextSubParticle] = sy;
+ s->p[s->nextParticle].oldposition[2].f[s->nextSubParticle] = sz;
+ streamSpeedCoherenceFactor = MAX_(0.0f,1.0f + RandBell(0.25f*incohesion));
+ dx = s->p[s->nextParticle].position[0].f[s->nextSubParticle] - flurry->spark[i]->position[0];
+ dy = s->p[s->nextParticle].position[1].f[s->nextSubParticle] - flurry->spark[i]->position[1];
+ dz = s->p[s->nextParticle].position[2].f[s->nextSubParticle] - flurry->spark[i]->position[2];
+ rsquared = (dx*dx+dy*dy+dz*dz);
+ f = streamSpeed * streamSpeedCoherenceFactor;
+
+ mag = f / (float) sqrt(rsquared);
+
+ s->p[s->nextParticle].delta[0].f[s->nextSubParticle] -= (dx * mag);
+ s->p[s->nextParticle].delta[1].f[s->nextSubParticle] -= (dy * mag);
+ s->p[s->nextParticle].delta[2].f[s->nextSubParticle] -= (dz * mag);
+ s->p[s->nextParticle].color[0].f[s->nextSubParticle] = flurry->spark[i]->color[0] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[1].f[s->nextSubParticle] = flurry->spark[i]->color[1] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[2].f[s->nextSubParticle] = flurry->spark[i]->color[2] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[3].f[s->nextSubParticle] = 0.85f * (1.0f + RandBell(0.5f*colorIncoherence));
+ s->p[s->nextParticle].time.f[s->nextSubParticle] = flurry->fTime;
+ s->p[s->nextParticle].dead.i[s->nextSubParticle] = 0;
+ s->p[s->nextParticle].animFrame.i[s->nextSubParticle] = random()&63;
+ s->nextSubParticle++;
+ if (s->nextSubParticle==4) {
+ s->nextParticle++;
+ s->nextSubParticle=0;
+ }
+ if (s->nextParticle >= NUMSMOKEPARTICLES/4) {
+ s->nextParticle = 0;
+ s->nextSubParticle = 0;
+ }
+ }
+
+ s->lastParticleTime = flurry->fTime;
+ }
+ } else {
+ s->lastParticleTime = flurry->fTime;
+ s->firstTime = 0;
+ }
+
+ for(i=0;i<3;i++) {
+ s->old[i] = flurry->star->position[i];
+ }
+
+ frameRate = ((double) flurry->dframe)/(flurry->fTime);
+ frameRateModifier = 42.5f / frameRate;
+
+ for(i=0;i<NUMSMOKEPARTICLES/4;i++) {
+ for(k=0; k<4; k++) {
+ float dx,dy,dz;
+ float f;
+ float rsquared;
+ float mag;
+ float deltax;
+ float deltay;
+ float deltaz;
+
+ if (s->p[i].dead.i[k]) {
+ continue;
+ }
+
+ deltax = s->p[i].delta[0].f[k];
+ deltay = s->p[i].delta[1].f[k];
+ deltaz = s->p[i].delta[2].f[k];
+
+ for(j=0;j<flurry->numStreams;j++) {
+ dx = s->p[i].position[0].f[k] - flurry->spark[j]->position[0];
+ dy = s->p[i].position[1].f[k] - flurry->spark[j]->position[1];
+ dz = s->p[i].position[2].f[k] - flurry->spark[j]->position[2];
+ rsquared = (dx*dx+dy*dy+dz*dz);
+
+ f = (gravity/rsquared) * frameRateModifier;
+
+ if ((((i*4)+k) % flurry->numStreams) == j) {
+ f *= 1.0f + streamBias;
+ }
+ mag = f / (float) sqrt(rsquared);
+
+ deltax -= (dx * mag);
+ deltay -= (dy * mag);
+ deltaz -= (dz * mag);
+ }
+
+ /* slow this particle down by flurry->drag */
+ deltax *= flurry->drag;
+ deltay *= flurry->drag;
+ deltaz *= flurry->drag;
+
+ if((deltax*deltax+deltay*deltay+deltaz*deltaz) >= 25000000.0f) {
+ s->p[i].dead.i[k] = 1;
+ continue;
+ }
+
+ /* update the position */
+ s->p[i].delta[0].f[k] = deltax;
+ s->p[i].delta[1].f[k] = deltay;
+ s->p[i].delta[2].f[k] = deltaz;
+ for(j=0;j<3;j++) {
+ s->p[i].oldposition[j].f[k] = s->p[i].position[j].f[k];
+ s->p[i].position[j].f[k] += (s->p[i].delta[j].f[k])*flurry->fDeltaTime;
+ }
+ }
+ }
+}
+
+#if 0
+#ifdef __ppc__
+
+void UpdateSmoke_ScalarFrsqrte(global_info_t *global, flurry_info_t *flurry, SmokeV *s)
+{
+ int i,j,k;
+ float sx = flurry->star->position[0];
+ float sy = flurry->star->position[1];
+ float sz = flurry->star->position[2];
+ double frameRate;
+ double frameRateModifier;
+
+
+ s->frame++;
+
+ if(!s->firstTime) {
+ /* release 12 puffs every frame */
+ if(flurry->fTime - s->lastParticleTime >= 1.0f / 121.0f) {
+ float dx,dy,dz,deltax,deltay,deltaz;
+ float f;
+ float rsquared;
+ float mag;
+
+ dx = s->old[0] - sx;
+ dy = s->old[1] - sy;
+ dz = s->old[2] - sz;
+ mag = 5.0f;
+ deltax = (dx * mag);
+ deltay = (dy * mag);
+ deltaz = (dz * mag);
+ for(i=0;i<flurry->numStreams;i++) {
+ float streamSpeedCoherenceFactor;
+
+ s->p[s->nextParticle].delta[0].f[s->nextSubParticle] = deltax;
+ s->p[s->nextParticle].delta[1].f[s->nextSubParticle] = deltay;
+ s->p[s->nextParticle].delta[2].f[s->nextSubParticle] = deltaz;
+ s->p[s->nextParticle].position[0].f[s->nextSubParticle] = sx;
+ s->p[s->nextParticle].position[1].f[s->nextSubParticle] = sy;
+ s->p[s->nextParticle].position[2].f[s->nextSubParticle] = sz;
+ s->p[s->nextParticle].oldposition[0].f[s->nextSubParticle] = sx;
+ s->p[s->nextParticle].oldposition[1].f[s->nextSubParticle] = sy;
+ s->p[s->nextParticle].oldposition[2].f[s->nextSubParticle] = sz;
+ streamSpeedCoherenceFactor = MAX_(0.0f,1.0f + RandBell(0.25f*incohesion));
+ dx = s->p[s->nextParticle].position[0].f[s->nextSubParticle] - flurry->spark[i]->position[0];
+ dy = s->p[s->nextParticle].position[1].f[s->nextSubParticle] - flurry->spark[i]->position[1];
+ dz = s->p[s->nextParticle].position[2].f[s->nextSubParticle] - flurry->spark[i]->position[2];
+ rsquared = (dx*dx+dy*dy+dz*dz);
+ f = streamSpeed * streamSpeedCoherenceFactor;
+
+ mag = f / (float) sqrt(rsquared);
+ /*
+ reciprocal square-root estimate replaced above divide and call to system sqrt()
+
+ asm("frsqrte %0, %1" : "=f" (mag) : "f" (rsquared));
+ mag *= f;
+ */
+
+ s->p[s->nextParticle].delta[0].f[s->nextSubParticle] -= (dx * mag);
+ s->p[s->nextParticle].delta[1].f[s->nextSubParticle] -= (dy * mag);
+ s->p[s->nextParticle].delta[2].f[s->nextSubParticle] -= (dz * mag);
+ s->p[s->nextParticle].color[0].f[s->nextSubParticle] = flurry->spark[i]->color[0] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[1].f[s->nextSubParticle] = flurry->spark[i]->color[1] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[2].f[s->nextSubParticle] = flurry->spark[i]->color[2] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[3].f[s->nextSubParticle] = 0.85f * (1.0f + RandBell(0.5f*colorIncoherence));
+ s->p[s->nextParticle].time.f[s->nextSubParticle] = flurry->fTime;
+ s->p[s->nextParticle].dead.i[s->nextSubParticle] = 0;
+ s->p[s->nextParticle].animFrame.i[s->nextSubParticle] = random()&63;
+ s->nextSubParticle++;
+ if (s->nextSubParticle==4) {
+ s->nextParticle++;
+ s->nextSubParticle=0;
+ }
+ if (s->nextParticle >= NUMSMOKEPARTICLES/4) {
+ s->nextParticle = 0;
+ s->nextSubParticle = 0;
+ }
+ }
+
+ s->lastParticleTime = flurry->fTime;
+ }
+ } else {
+ s->lastParticleTime = flurry->fTime;
+ s->firstTime = 0;
+ }
+
+ for(i=0;i<3;i++) {
+ s->old[i] = flurry->star->position[i];
+ }
+
+ frameRate = ((double) flurry->dframe)/(flurry->fTime);
+ frameRateModifier = 42.5f / frameRate;
+
+ for(i=0;i<NUMSMOKEPARTICLES/4;i++) {
+ for(k=0; k<4; k++) {
+ float dx,dy,dz;
+ float f;
+ float rsquared;
+ float mag;
+ float deltax;
+ float deltay;
+ float deltaz;
+
+ if (s->p[i].dead.i[k]) {
+ continue;
+ }
+
+ deltax = s->p[i].delta[0].f[k];
+ deltay = s->p[i].delta[1].f[k];
+ deltaz = s->p[i].delta[2].f[k];
+
+ for(j=0;j<flurry->numStreams;j++) {
+ dx = s->p[i].position[0].f[k] - flurry->spark[j]->position[0];
+ dy = s->p[i].position[1].f[k] - flurry->spark[j]->position[1];
+ dz = s->p[i].position[2].f[k] - flurry->spark[j]->position[2];
+ rsquared = (dx*dx+dy*dy+dz*dz);
+
+ /*
+ asm("fres %0, %1" : "=f" (f) : "f" (rsquared));
+ f *= gravity*frameRateModifier;
+ */
+ f = ( gravity * frameRateModifier ) / rsquared;
+
+ if((((i*4)+k) % flurry->numStreams) == j) {
+ f *= 1.0f + streamBias;
+ }
+
+ mag = f / (float) sqrt(rsquared);
+
+ /* reciprocal square-root estimate replaced above divide and call to system sqrt() */
+
+ deltax -= (dx * mag);
+ deltay -= (dy * mag);
+ deltaz -= (dz * mag);
+ }
+
+ /* slow this particle down by flurry->drag */
+ deltax *= flurry->drag;
+ deltay *= flurry->drag;
+ deltaz *= flurry->drag;
+
+ if((deltax*deltax+deltay*deltay+deltaz*deltaz) >= 25000000.0f) {
+ s->p[i].dead.i[k] = 1;
+ continue;
+ }
+
+ /* update the position */
+ s->p[i].delta[0].f[k] = deltax;
+ s->p[i].delta[1].f[k] = deltay;
+ s->p[i].delta[2].f[k] = deltaz;
+ for(j=0;j<3;j++) {
+ s->p[i].oldposition[j].f[k] = s->p[i].position[j].f[k];
+ s->p[i].position[j].f[k] += (s->p[i].delta[j].f[k])*flurry->fDeltaTime;
+ }
+ }
+ }
+}
+
+#endif
+
+#ifdef __VEC__
+
+void UpdateSmoke_VectorBase(global_info_t *global, flurry_info_t *flurry, SmokeV *s)
+{
+ unsigned int i,j;
+ float sx = flurry->star->position[0];
+ float sy = flurry->star->position[1];
+ float sz = flurry->star->position[2];
+ double frameRate;
+ floatToVector frameRateModifier;
+ floatToVector gravityV;
+ floatToVector dragV;
+ floatToVector deltaTimeV;
+ const vector float deadConst = (vector float) (25000000.0,25000000.0,25000000.0,25000000.0);
+ const vector float zero = (vector float)(0.0, 0.0, 0.0, 0.0);
+ const vector float biasConst = (vector float)(streamBias);
+
+ gravityV.f[0] = gravity;
+ gravityV.v = (vector float) vec_splat((vector unsigned int)gravityV.v, 0);
+
+ dragV.f[0] = flurry->drag;
+ dragV.v = (vector float) vec_splat((vector unsigned int)dragV.v, 0);
+
+ deltaTimeV.f[0] = flurry->fDeltaTime;
+ deltaTimeV.v = (vector float) vec_splat((vector unsigned int)deltaTimeV.v, 0);
+
+ s->frame++;
+
+ if(!s->firstTime) {
+ /* release 12 puffs every frame */
+ if(flurry->fTime - s->lastParticleTime >= 1.0f / 121.0f) {
+ float dx,dy,dz,deltax,deltay,deltaz;
+ float f;
+ float rsquared;
+ float mag;
+
+ dx = s->old[0] - sx;
+ dy = s->old[1] - sy;
+ dz = s->old[2] - sz;
+ mag = 5.0f;
+ deltax = (dx * mag);
+ deltay = (dy * mag);
+ deltaz = (dz * mag);
+ for(i=0;i<flurry->numStreams;i++) {
+ float streamSpeedCoherenceFactor;
+
+ s->p[s->nextParticle].delta[0].f[s->nextSubParticle] = deltax;
+ s->p[s->nextParticle].delta[1].f[s->nextSubParticle] = deltay;
+ s->p[s->nextParticle].delta[2].f[s->nextSubParticle] = deltaz;
+ s->p[s->nextParticle].position[0].f[s->nextSubParticle] = sx;
+ s->p[s->nextParticle].position[1].f[s->nextSubParticle] = sy;
+ s->p[s->nextParticle].position[2].f[s->nextSubParticle] = sz;
+ s->p[s->nextParticle].oldposition[0].f[s->nextSubParticle] = sx;
+ s->p[s->nextParticle].oldposition[1].f[s->nextSubParticle] = sy;
+ s->p[s->nextParticle].oldposition[2].f[s->nextSubParticle] = sz;
+ streamSpeedCoherenceFactor = MAX_(0.0f,1.0f + RandBell(0.25f*incohesion));
+ dx = s->p[s->nextParticle].position[0].f[s->nextSubParticle] - flurry->spark[i]->position[0];
+ dy = s->p[s->nextParticle].position[1].f[s->nextSubParticle] - flurry->spark[i]->position[1];
+ dz = s->p[s->nextParticle].position[2].f[s->nextSubParticle] - flurry->spark[i]->position[2];
+ rsquared = (dx*dx+dy*dy+dz*dz);
+ f = streamSpeed * streamSpeedCoherenceFactor;
+
+ mag = f / (float) sqrt(rsquared);
+ /*
+ asm("frsqrte %0, %1" : "=f" (mag) : "f" (rsquared));
+ mag *= f;
+ */
+
+ s->p[s->nextParticle].delta[0].f[s->nextSubParticle] -= (dx * mag);
+ s->p[s->nextParticle].delta[1].f[s->nextSubParticle] -= (dy * mag);
+ s->p[s->nextParticle].delta[2].f[s->nextSubParticle] -= (dz * mag);
+ s->p[s->nextParticle].color[0].f[s->nextSubParticle] = flurry->spark[i]->color[0] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[1].f[s->nextSubParticle] = flurry->spark[i]->color[1] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[2].f[s->nextSubParticle] = flurry->spark[i]->color[2] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[3].f[s->nextSubParticle] = 0.85f * (1.0f + RandBell(0.5f*colorIncoherence));
+ s->p[s->nextParticle].time.f[s->nextSubParticle] = flurry->fTime;
+ s->p[s->nextParticle].dead.i[s->nextSubParticle] = 0;
+ s->p[s->nextParticle].animFrame.i[s->nextSubParticle] = random()&63;
+ s->nextSubParticle++;
+ if (s->nextSubParticle==4) {
+ s->nextParticle++;
+ s->nextSubParticle=0;
+ }
+ if (s->nextParticle >= NUMSMOKEPARTICLES/4) {
+ s->nextParticle = 0;
+ s->nextSubParticle = 0;
+ }
+ }
+
+ s->lastParticleTime = flurry->fTime;
+ }
+ } else {
+ s->lastParticleTime = flurry->fTime;
+ s->firstTime = 0;
+ }
+
+ for(i=0;i<3;i++) {
+ s->old[i] = flurry->star->position[i];
+ }
+
+ frameRate = ((double) flurry->dframe)/(flurry->fTime);
+ frameRateModifier.f[0] = 42.5f / frameRate;
+ frameRateModifier.v = (vector float) vec_splat((vector unsigned int)frameRateModifier.v, 0);
+
+ frameRateModifier.v = vec_madd(frameRateModifier.v, gravityV.v, zero);
+
+ for(i=0;i<NUMSMOKEPARTICLES/4;i++) {
+ /* floatToVector f; */
+ vector float deltax, deltay, deltaz;
+ vector float distTemp;
+ vector unsigned int deadTemp;
+ /* floatToVector infopos0, infopos1, infopos2; */
+ intToVector mod;
+ vector unsigned int jVec;
+
+
+ vec_dst((int *)(&(s->p[i+4])), 0x00020200, 3);
+
+ if (vec_all_ne(s->p[i].dead.v, (vector unsigned int)(0))) {
+ continue;
+ }
+
+ deltax = s->p[i].delta[0].v;
+ deltay = s->p[i].delta[1].v;
+ deltaz = s->p[i].delta[2].v;
+
+ mod.i[0] = (i<<2 + 0) % flurry->numStreams;
+ if(mod.i[0]+1 == flurry->numStreams) {
+ mod.i[1] = 0;
+ } else {
+ mod.i[1] = mod.i[0]+1;
+ }
+ if(mod.i[1]+1 == flurry->numStreams) {
+ mod.i[2] = 0;
+ } else {
+ mod.i[2] = mod.i[1]+1;
+ }
+ if(mod.i[2]+1 == flurry->numStreams) {
+ mod.i[3] = 0;
+ } else {
+ mod.i[3] = mod.i[2]+1;
+ }
+
+ jVec = vec_xor(jVec, jVec);
+
+ vec_dst( &flurry->spark[0]->position[0], 0x16020160, 3 );
+ for(j=0; j<flurry->numStreams;j++) {
+ vector float ip0, ip1 = (vector float)(0.0), ip2;
+ vector float dx, dy, dz;
+ vector float rsquared, f;
+ vector float one_over_rsquared;
+ vector float biasTemp;
+ vector float mag;
+ vector bool int biasOr;
+
+ ip0 = vec_ld(0, flurry->spark[j]->position);
+ if(((int)(flurry->spark[j]->position) & 0xF)>=8) {
+ ip1 = vec_ld(16, flurry->spark[j]->position);
+ }
+
+ ip0 = vec_perm(ip0, ip1, vec_lvsl(0, flurry->spark[j]->position));
+ ip1 = (vector float) vec_splat((vector unsigned int)ip0, 1);
+ ip2 = (vector float) vec_splat((vector unsigned int)ip0, 2);
+ ip0 = (vector float) vec_splat((vector unsigned int)ip0, 0);
+
+ dx = vec_sub(s->p[i].position[0].v, ip0);
+ dy = vec_sub(s->p[i].position[1].v, ip1);
+ dz = vec_sub(s->p[i].position[2].v, ip2);
+
+ rsquared = vec_madd(dx, dx, zero);
+ rsquared = vec_madd(dy, dy, rsquared);
+ rsquared = vec_madd(dz, dz, rsquared);
+
+ biasOr = vec_cmpeq(jVec, mod.v);
+ biasTemp = vec_add(vec_and(biasOr, biasConst), (vector float)(1.0));
+
+ f = vec_madd(biasTemp, frameRateModifier.v, zero);
+ one_over_rsquared = vec_re(rsquared);
+ f = vec_madd(f, one_over_rsquared, zero);
+
+ mag = vec_rsqrte(rsquared);
+ mag = vec_madd(mag, f, zero);
+
+ deltax = vec_nmsub(dx, mag, deltax);
+ deltay = vec_nmsub(dy, mag, deltay);
+ deltaz = vec_nmsub(dz, mag, deltaz);
+
+ jVec = vec_add(jVec, (vector unsigned int)(1));
+ }
+
+ /* slow this particle down by flurry->drag */
+ deltax = vec_madd(deltax, dragV.v, zero);
+ deltay = vec_madd(deltay, dragV.v, zero);
+ deltaz = vec_madd(deltaz, dragV.v, zero);
+
+ distTemp = vec_madd(deltax, deltax, zero);
+ distTemp = vec_madd(deltay, deltay, distTemp);
+ distTemp = vec_madd(deltaz, deltaz, distTemp);
+
+ deadTemp = (vector unsigned int) vec_cmpge(distTemp, deadConst);
+ deadTemp = vec_and((vector unsigned int)vec_splat_u32(1), deadTemp);
+ s->p[i].dead.v = vec_or(s->p[i].dead.v, deadTemp);
+ if (vec_all_ne(s->p[i].dead.v, (vector unsigned int)(0))) {
+ continue;
+ }
+
+ /* update the position */
+ s->p[i].delta[0].v = deltax;
+ s->p[i].delta[1].v = deltay;
+ s->p[i].delta[2].v = deltaz;
+ for(j=0;j<3;j++) {
+ s->p[i].oldposition[j].v = s->p[i].position[j].v;
+ s->p[i].position[j].v = vec_madd(s->p[i].delta[j].v, deltaTimeV.v, s->p[i].position[j].v);
+ }
+ }
+}
+
+void UpdateSmoke_VectorUnrolled(global_info_t *info, SmokeV *s)
+{
+ unsigned int i,j;
+ float sx = flurry->star->position[0];
+ float sy = flurry->star->position[1];
+ float sz = flurry->star->position[2];
+ double frameRate;
+ floatToVector frameRateModifier;
+ floatToVector gravityV;
+ floatToVector dragV;
+ floatToVector deltaTimeV;
+ const vector float deadConst = (vector float) (25000000.0,25000000.0,25000000.0,25000000.0);
+ const vector float zero = (vector float)(0.0, 0.0, 0.0, 0.0);
+ const vector float biasConst = (vector float)(streamBias);
+
+ gravityV.f[0] = gravity;
+ gravityV.v = (vector float) vec_splat((vector unsigned int)gravityV.v, 0);
+
+ dragV.f[0] = flurry->drag;
+ dragV.v = (vector float) vec_splat((vector unsigned int)dragV.v, 0);
+
+ deltaTimeV.f[0] = flurry->fDeltaTime;
+ deltaTimeV.v = (vector float) vec_splat((vector unsigned int)deltaTimeV.v, 0);
+
+ s->frame++;
+
+ if(!s->firstTime) {
+ /* release 12 puffs every frame */
+ if(flurry->fTime - s->lastParticleTime >= 1.0f / 121.0f) {
+ float dx,dy,dz,deltax,deltay,deltaz;
+ float f;
+ float rsquared;
+ float mag;
+
+ dx = s->old[0] - sx;
+ dy = s->old[1] - sy;
+ dz = s->old[2] - sz;
+ mag = 5.0f;
+ deltax = (dx * mag);
+ deltay = (dy * mag);
+ deltaz = (dz * mag);
+ for(i=0;i<flurry->numStreams;i++) {
+ float streamSpeedCoherenceFactor;
+
+ s->p[s->nextParticle].delta[0].f[s->nextSubParticle] = deltax;
+ s->p[s->nextParticle].delta[1].f[s->nextSubParticle] = deltay;
+ s->p[s->nextParticle].delta[2].f[s->nextSubParticle] = deltaz;
+ s->p[s->nextParticle].position[0].f[s->nextSubParticle] = sx;
+ s->p[s->nextParticle].position[1].f[s->nextSubParticle] = sy;
+ s->p[s->nextParticle].position[2].f[s->nextSubParticle] = sz;
+ s->p[s->nextParticle].oldposition[0].f[s->nextSubParticle] = sx;
+ s->p[s->nextParticle].oldposition[1].f[s->nextSubParticle] = sy;
+ s->p[s->nextParticle].oldposition[2].f[s->nextSubParticle] = sz;
+ streamSpeedCoherenceFactor = MAX_(0.0f,1.0f + RandBell(0.25f*incohesion));
+ dx = s->p[s->nextParticle].position[0].f[s->nextSubParticle] - flurry->spark[i]->position[0];
+ dy = s->p[s->nextParticle].position[1].f[s->nextSubParticle] - flurry->spark[i]->position[1];
+ dz = s->p[s->nextParticle].position[2].f[s->nextSubParticle] - flurry->spark[i]->position[2];
+ rsquared = (dx*dx+dy*dy+dz*dz);
+ f = streamSpeed * streamSpeedCoherenceFactor;
+
+ mag = f / (float) sqrt(rsquared);
+ /*
+ asm("frsqrte %0, %1" : "=f" (mag) : "f" (rsquared));
+ mag *= f;
+ */
+
+ s->p[s->nextParticle].delta[0].f[s->nextSubParticle] -= (dx * mag);
+ s->p[s->nextParticle].delta[1].f[s->nextSubParticle] -= (dy * mag);
+ s->p[s->nextParticle].delta[2].f[s->nextSubParticle] -= (dz * mag);
+ s->p[s->nextParticle].color[0].f[s->nextSubParticle] = flurry->spark[i]->color[0] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[1].f[s->nextSubParticle] = flurry->spark[i]->color[1] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[2].f[s->nextSubParticle] = flurry->spark[i]->color[2] * (1.0f + RandBell(colorIncoherence));
+ s->p[s->nextParticle].color[3].f[s->nextSubParticle] = 0.85f * (1.0f + RandBell(0.5f*colorIncoherence));
+ s->p[s->nextParticle].time.f[s->nextSubParticle] = flurry->fTime;
+ s->p[s->nextParticle].dead.i[s->nextSubParticle] = 0;
+ s->p[s->nextParticle].animFrame.i[s->nextSubParticle] = random()&63;
+ s->nextSubParticle++;
+ if (s->nextSubParticle==4) {
+ s->nextParticle++;
+ s->nextSubParticle=0;
+ }
+ if (s->nextParticle >= NUMSMOKEPARTICLES/4) {
+ s->nextParticle = 0;
+ s->nextSubParticle = 0;
+ }
+ }
+
+ s->lastParticleTime = flurry->fTime;
+ }
+ } else {
+ s->lastParticleTime = flurry->fTime;
+ s->firstTime = 0;
+ }
+
+ for(i=0;i<3;i++) {
+ s->old[i] = flurry->star->position[i];
+ }
+
+ frameRate = ((double) flurry->dframe)/(flurry->fTime);
+ frameRateModifier.f[0] = 42.5f / frameRate;
+ frameRateModifier.v = (vector float) vec_splat((vector unsigned int)frameRateModifier.v, 0);
+
+ frameRateModifier.v = vec_madd(frameRateModifier.v, gravityV.v, zero);
+
+ for(i=0;i<NUMSMOKEPARTICLES/4;i++) {
+ /* floatToVector f; */
+ vector float deltax, deltay, deltaz;
+ vector float distTemp;
+ vector unsigned int deadTemp;
+ /* floatToVector infopos0, infopos1, infopos2; */
+ intToVector mod;
+ vector unsigned int jVec;
+ vector unsigned int intOne = vec_splat_u32(1);
+ vector float floatOne = vec_ctf(intOne, 0);
+
+
+ vec_dst((int *)(&(s->p[i+4])), 0x00020200, 3);
+
+ if (vec_all_ne(s->p[i].dead.v, (vector unsigned int)(0))) {
+ continue;
+ }
+
+ deltax = s->p[i].delta[0].v;
+ deltay = s->p[i].delta[1].v;
+ deltaz = s->p[i].delta[2].v;
+
+ mod.i[0] = (i<<2 + 0) % flurry->numStreams;
+ if(mod.i[0]+1 == flurry->numStreams) {
+ mod.i[1] = 0;
+ } else {
+ mod.i[1] = mod.i[0]+1;
+ }
+ if(mod.i[1]+1 == flurry->numStreams) {
+ mod.i[2] = 0;
+ } else {
+ mod.i[2] = mod.i[1]+1;
+ }
+ if(mod.i[2]+1 == flurry->numStreams) {
+ mod.i[3] = 0;
+ } else {
+ mod.i[3] = mod.i[2]+1;
+ }
+
+ jVec = vec_xor(jVec, jVec);
+
+ vec_dst( &flurry->spark[0]->position[0], 0x16020160, 3 );
+ for(j=0; j + 3 < flurry->numStreams;j+=4)
+ {
+ vector float dxa, dya, dza;
+ vector float dxb, dyb, dzb;
+ vector float dxc, dyc, dzc;
+ vector float dxd, dyd, dzd;
+ vector float ip0a, ip1a;
+ vector float ip0b, ip1b;
+ vector float ip0c, ip1c;
+ vector float ip0d, ip1d;
+ vector float rsquaredA;
+ vector float rsquaredB;
+ vector float rsquaredC;
+ vector float rsquaredD;
+ vector float fA, fB, fC, fD;
+ vector float biasTempA;
+ vector float biasTempB;
+ vector float biasTempC;
+ vector float biasTempD;
+ vector float magA;
+ vector float magB;
+ vector float magC;
+ vector float magD;
+
+ vector float one_over_rsquaredA;
+ vector float one_over_rsquaredB;
+ vector float one_over_rsquaredC;
+ vector float one_over_rsquaredD;
+ vector bool int biasOrA,biasOrB,biasOrC,biasOrD;
+
+ /* load vectors */
+ ip0a = vec_ld(0, flurry->spark[j]->position);
+ ip0b = vec_ld(0, flurry->spark[j+1]->position);
+ ip0c = vec_ld(0, flurry->spark[j+2]->position);
+ ip0d = vec_ld(0, flurry->spark[j+3]->position);
+ ip1a = vec_ld( 12, flurry->spark[j]->position );
+ ip1b = vec_ld( 12, flurry->spark[j+1]->position );
+ ip1c = vec_ld( 12, flurry->spark[j+2]->position );
+ ip1d = vec_ld( 12, flurry->spark[j+3]->position );
+
+ /* align them */
+ ip0a = vec_perm(ip0a, ip1a, vec_lvsl(0, flurry->spark[j]->position));
+ ip0b = vec_perm(ip0b, ip1b, vec_lvsl(0, flurry->spark[j+1]->position));
+ ip0c = vec_perm(ip0c, ip1c, vec_lvsl(0, flurry->spark[j+2]->position));
+ ip0d = vec_perm(ip0d, ip1d, vec_lvsl(0, flurry->spark[j+3]->position));
+
+ dxa = vec_splat( ip0a, 0 );
+ dxb = vec_splat( ip0b, 0 );
+ dxc = vec_splat( ip0c, 0 );
+ dxd = vec_splat( ip0d, 0 );
+ dxa = vec_sub( s->p[i].position[0].v, dxa );
+ dxb = vec_sub( s->p[i].position[0].v, dxb );
+ dxc = vec_sub( s->p[i].position[0].v, dxc );
+ dxd = vec_sub( s->p[i].position[0].v, dxd );
+
+ dya = vec_splat( ip0a, 1 );
+ dyb = vec_splat( ip0b, 1 );
+ dyc = vec_splat( ip0c, 1 );
+ dyd = vec_splat( ip0d, 1 );
+ dya = vec_sub( s->p[i].position[1].v, dya );
+ dyb = vec_sub( s->p[i].position[1].v, dyb );
+ dyc = vec_sub( s->p[i].position[1].v, dyc );
+ dyd = vec_sub( s->p[i].position[1].v, dyd );
+
+ dza = vec_splat( ip0a, 2 );
+ dzb = vec_splat( ip0b, 2 );
+ dzc = vec_splat( ip0c, 2 );
+ dzd = vec_splat( ip0d, 2 );
+ dza = vec_sub( s->p[i].position[2].v, dza );
+ dzb = vec_sub( s->p[i].position[2].v, dzb );
+ dzc = vec_sub( s->p[i].position[2].v, dzc );
+ dzd = vec_sub( s->p[i].position[2].v, dzd );
+
+ rsquaredA = vec_madd( dxa, dxa, zero );
+ rsquaredB = vec_madd( dxb, dxb, zero );
+ rsquaredC = vec_madd( dxc, dxc, zero );
+ rsquaredD = vec_madd( dxd, dxd, zero );
+
+ rsquaredA = vec_madd( dya, dya, rsquaredA );
+ rsquaredB = vec_madd( dyb, dyb, rsquaredB );
+ rsquaredC = vec_madd( dyc, dyc, rsquaredC );
+ rsquaredD = vec_madd( dyd, dyd, rsquaredD );
+
+ rsquaredA = vec_madd( dza, dza, rsquaredA );
+ rsquaredB = vec_madd( dzb, dzb, rsquaredB );
+ rsquaredC = vec_madd( dzc, dzc, rsquaredC );
+ rsquaredD = vec_madd( dzd, dzd, rsquaredD );
+
+ biasOrA = vec_cmpeq( jVec, mod.v );
+ jVec = vec_add(jVec, intOne);
+ biasOrB = vec_cmpeq( jVec, mod.v );
+ jVec = vec_add(jVec, intOne);
+ biasOrC = vec_cmpeq( jVec, mod.v );
+ jVec = vec_add(jVec, intOne);
+ biasOrD = vec_cmpeq( jVec, mod.v );
+ jVec = vec_add(jVec, intOne);
+
+ biasTempA = vec_add( vec_and( biasOrA, biasConst), floatOne);
+ biasTempB = vec_add( vec_and( biasOrB, biasConst), floatOne);
+ biasTempC = vec_add( vec_and( biasOrC, biasConst), floatOne);
+ biasTempD = vec_add( vec_and( biasOrD, biasConst), floatOne);
+
+ fA = vec_madd( biasTempA, frameRateModifier.v, zero);
+ fB = vec_madd( biasTempB, frameRateModifier.v, zero);
+ fC = vec_madd( biasTempC, frameRateModifier.v, zero);
+ fD = vec_madd( biasTempD, frameRateModifier.v, zero);
+ one_over_rsquaredA = vec_re( rsquaredA );
+ one_over_rsquaredB = vec_re( rsquaredB );
+ one_over_rsquaredC = vec_re( rsquaredC );
+ one_over_rsquaredD = vec_re( rsquaredD );
+ fA = vec_madd( fA, one_over_rsquaredA, zero);
+ fB = vec_madd( fB, one_over_rsquaredB, zero);
+ fC = vec_madd( fC, one_over_rsquaredC, zero);
+ fD = vec_madd( fD, one_over_rsquaredD, zero);
+ magA = vec_rsqrte( rsquaredA );
+ magB = vec_rsqrte( rsquaredB );
+ magC = vec_rsqrte( rsquaredC );
+ magD = vec_rsqrte( rsquaredD );
+ magA = vec_madd( magA, fA, zero );
+ magB = vec_madd( magB, fB, zero );
+ magC = vec_madd( magC, fC, zero );
+ magD = vec_madd( magD, fD, zero );
+ deltax = vec_nmsub( dxa, magA, deltax );
+ deltay = vec_nmsub( dya, magA, deltay );
+ deltaz = vec_nmsub( dza, magA, deltaz );
+
+ deltax = vec_nmsub( dxb, magB, deltax );
+ deltay = vec_nmsub( dyb, magB, deltay );
+ deltaz = vec_nmsub( dzb, magB, deltaz );
+
+ deltax = vec_nmsub( dxc, magC, deltax );
+ deltay = vec_nmsub( dyc, magC, deltay );
+ deltaz = vec_nmsub( dzc, magC, deltaz );
+
+ deltax = vec_nmsub( dxd, magD, deltax );
+ deltay = vec_nmsub( dyd, magD, deltay );
+ deltaz = vec_nmsub( dzd, magD, deltaz );
+ }
+
+
+ for(;j<flurry->numStreams;j++) {
+ vector float ip0, ip1 = (vector float)(0.0), ip2;
+ vector float dx, dy, dz;
+ vector float rsquared, f;
+ vector float one_over_rsquared;
+ vector float biasTemp;
+ vector float mag;
+ vector bool int biasOr;
+
+ ip0 = vec_ld(0, flurry->spark[j]->position);
+ if(((int)(flurry->spark[j]->position) & 0xF)>=8) {
+ ip1 = vec_ld(16, flurry->spark[j]->position);
+ }
+
+ ip0 = vec_perm(ip0, ip1, vec_lvsl(0, flurry->spark[j]->position));
+ ip1 = (vector float) vec_splat((vector unsigned int)ip0, 1);
+ ip2 = (vector float) vec_splat((vector unsigned int)ip0, 2);
+ ip0 = (vector float) vec_splat((vector unsigned int)ip0, 0);
+
+ dx = vec_sub(s->p[i].position[0].v, ip0);
+ dy = vec_sub(s->p[i].position[1].v, ip1);
+ dz = vec_sub(s->p[i].position[2].v, ip2);
+
+ rsquared = vec_madd(dx, dx, zero);
+ rsquared = vec_madd(dy, dy, rsquared);
+ rsquared = vec_madd(dz, dz, rsquared);
+
+ biasOr = vec_cmpeq(jVec, mod.v);
+ biasTemp = vec_add(vec_and(biasOr, biasConst), (vector float)(1.0));
+
+ f = vec_madd(biasTemp, frameRateModifier.v, zero);
+ one_over_rsquared = vec_re(rsquared);
+ f = vec_madd(f, one_over_rsquared, zero);
+
+ mag = vec_rsqrte(rsquared);
+ mag = vec_madd(mag, f, zero);
+
+ deltax = vec_nmsub(dx, mag, deltax);
+ deltay = vec_nmsub(dy, mag, deltay);
+ deltaz = vec_nmsub(dz, mag, deltaz);
+
+ jVec = vec_add(jVec, (vector unsigned int)(1));
+ }
+
+ /* slow this particle down by flurry->drag */
+ deltax = vec_madd(deltax, dragV.v, zero);
+ deltay = vec_madd(deltay, dragV.v, zero);
+ deltaz = vec_madd(deltaz, dragV.v, zero);
+
+ distTemp = vec_madd(deltax, deltax, zero);
+ distTemp = vec_madd(deltay, deltay, distTemp);
+ distTemp = vec_madd(deltaz, deltaz, distTemp);
+
+ deadTemp = (vector unsigned int) vec_cmpge(distTemp, deadConst);
+ deadTemp = vec_and((vector unsigned int)vec_splat_u32(1), deadTemp);
+ s->p[i].dead.v = vec_or(s->p[i].dead.v, deadTemp);
+ if (vec_all_ne(s->p[i].dead.v, (vector unsigned int)(0))) {
+ continue;
+ }
+
+ /* update the position */
+ s->p[i].delta[0].v = deltax;
+ s->p[i].delta[1].v = deltay;
+ s->p[i].delta[2].v = deltaz;
+ for(j=0;j<3;j++) {
+ s->p[i].oldposition[j].v = s->p[i].position[j].v;
+ s->p[i].position[j].v = vec_madd(s->p[i].delta[j].v, deltaTimeV.v, s->p[i].position[j].v);
+ }
+ }
+}
+
+#endif
+#endif /* 0 */
+
+void DrawSmoke_Scalar(global_info_t *global, flurry_info_t *flurry, SmokeV *s, float brightness)
+{
+ int svi = 0;
+ int sci = 0;
+ int sti = 0;
+ int si = 0;
+ float width;
+ float sx,sy;
+ float u0,v0,u1,v1;
+ float w,z;
+ float screenRatio = global->sys_glWidth / 1024.0f;
+ float hslash2 = global->sys_glHeight * 0.5f;
+ float wslash2 = global->sys_glWidth * 0.5f;
+ int i,k;
+
+ width = (streamSize+2.5f*flurry->streamExpansion) * screenRatio;
+
+ for (i=0;i<NUMSMOKEPARTICLES/4;i++)
+ {
+ for (k=0; k<4; k++) {
+ float thisWidth;
+ float oldz;
+
+ if (s->p[i].dead.i[k]) {
+ continue;
+ }
+ thisWidth = (streamSize + (flurry->fTime - s->p[i].time.f[k])*flurry->streamExpansion) * screenRatio;
+ if (thisWidth >= width)
+ {
+ s->p[i].dead.i[k] = 1;
+ continue;
+ }
+ z = s->p[i].position[2].f[k];
+ sx = s->p[i].position[0].f[k] * global->sys_glWidth / z + wslash2;
+ sy = s->p[i].position[1].f[k] * global->sys_glWidth / z + hslash2;
+ oldz = s->p[i].oldposition[2].f[k];
+ if (sx > global->sys_glWidth+50.0f || sx < -50.0f || sy > global->sys_glHeight+50.0f || sy < -50.0f || z < 25.0f || oldz < 25.0f)
+ {
+ continue;
+ }
+
+ w = MAX_(1.0f,thisWidth/z);
+ {
+ float oldx = s->p[i].oldposition[0].f[k];
+ float oldy = s->p[i].oldposition[1].f[k];
+ float oldscreenx = (oldx * global->sys_glWidth / oldz) + wslash2;
+ float oldscreeny = (oldy * global->sys_glWidth / oldz) + hslash2;
+ float dx = (sx-oldscreenx);
+ float dy = (sy-oldscreeny);
+
+ float d = FastDistance2D(dx, dy);
+
+ float sm, os, ow;
+ if (d)
+ {
+ sm = w/d;
+ }
+ else
+ {
+ sm = 0.0f;
+ }
+ ow = MAX_(1.0f,thisWidth/oldz);
+ if (d)
+ {
+ os = ow/d;
+ }
+ else
+ {
+ os = 0.0f;
+ }
+
+ {
+ floatToVector cmv;
+ float cm;
+ float m = 1.0f + sm;
+
+ float dxs = dx*sm;
+ float dys = dy*sm;
+ float dxos = dx*os;
+ float dyos = dy*os;
+ float dxm = dx*m;
+ float dym = dy*m;
+
+ s->p[i].animFrame.i[k]++;
+ if (s->p[i].animFrame.i[k] >= 64)
+ {
+ s->p[i].animFrame.i[k] = 0;
+ }
+
+ u0 = (s->p[i].animFrame.i[k]& 7) * 0.125f;
+ v0 = (s->p[i].animFrame.i[k]>>3) * 0.125f;
+ u1 = u0 + 0.125f;
+ v1 = v0 + 0.125f;
+ cm = (1.375f - thisWidth/width);
+ if (s->p[i].dead.i[k] == 3)
+ {
+ cm *= 0.125f;
+ s->p[i].dead.i[k] = 1;
+ }
+ si++;
+ cm *= brightness;
+ cmv.f[0] = s->p[i].color[0].f[k]*cm;
+ cmv.f[1] = s->p[i].color[1].f[k]*cm;
+ cmv.f[2] = s->p[i].color[2].f[k]*cm;
+ cmv.f[3] = s->p[i].color[3].f[k]*cm;
+
+#if 0
+ /* MDT we can't use vectors in the Scalar routine */
+ s->seraphimColors[sci++].v = cmv.v;
+ s->seraphimColors[sci++].v = cmv.v;
+ s->seraphimColors[sci++].v = cmv.v;
+ s->seraphimColors[sci++].v = cmv.v;
+#else
+ {
+ int ii, jj;
+ for (jj = 0; jj < 4; jj++) {
+ for (ii = 0; ii < 4; ii++) {
+ s->seraphimColors[sci].f[ii] = cmv.f[ii];
+ }
+ sci += 1;
+ }
+ }
+#endif
+
+ s->seraphimTextures[sti++] = u0;
+ s->seraphimTextures[sti++] = v0;
+ s->seraphimTextures[sti++] = u0;
+ s->seraphimTextures[sti++] = v1;
+
+ s->seraphimTextures[sti++] = u1;
+ s->seraphimTextures[sti++] = v1;
+ s->seraphimTextures[sti++] = u1;
+ s->seraphimTextures[sti++] = v0;
+
+ s->seraphimVertices[svi].f[0] = sx+dxm-dys;
+ s->seraphimVertices[svi].f[1] = sy+dym+dxs;
+ s->seraphimVertices[svi].f[2] = sx+dxm+dys;
+ s->seraphimVertices[svi].f[3] = sy+dym-dxs;
+ svi++;
+
+ s->seraphimVertices[svi].f[0] = oldscreenx-dxm+dyos;
+ s->seraphimVertices[svi].f[1] = oldscreeny-dym-dxos;
+ s->seraphimVertices[svi].f[2] = oldscreenx-dxm-dyos;
+ s->seraphimVertices[svi].f[3] = oldscreeny-dym+dxos;
+ svi++;
+ }
+ }
+ }
+ }
+ glColorPointer(4,GL_FLOAT,0,s->seraphimColors);
+ glVertexPointer(2,GL_FLOAT,0,s->seraphimVertices);
+ glTexCoordPointer(2,GL_FLOAT,0,s->seraphimTextures);
+ glDrawArrays(GL_QUADS,0,si*4);
+}
+
+#if 0
+#ifdef __VEC__
+
+void DrawSmoke_Vector(global_info_t *global, flurry_info_t *flurry, SmokeV *s, float brightness)
+{
+ const vector float zero = (vector float)(0.0);
+ int svi = 0;
+ int sci = 0;
+ int sti = 0;
+ int si = 0;
+ floatToVector width;
+ vector float sx,sy;
+ floatToVector u0,v0,u1,v1;
+ vector float one_over_z;
+ vector float w;
+ floatToVector z;
+ float screenRatio = global->sys_glWidth / 1024.0f;
+ float hslash2 = global->sys_glHeight * 0.5f;
+ float wslash2 = global->sys_glWidth * 0.5f;
+ int i,kk;
+ floatToVector briteV, fTimeV, expansionV, screenRatioV, hslash2V, wslash2V, streamSizeV;
+ floatToVector glWidthV;
+ floatToVector cm;
+ vector float cmv[4];
+ vector float svec[4], ovec[4];
+ vector float oldscreenx, oldscreeny;
+ vector float sm;
+ vector float frameAnd7;
+ vector float frameShift3;
+ vector float one_over_width;
+ vector float dx, dy;
+ vector float os;
+ vector unsigned int vSi = vec_splat_u32(0);
+ const vector float eighth = (vector float)(0.125);
+ float glWidth50 = global->sys_glWidth + 50.0f;
+ float glHeight50 = global->sys_glHeight + 50.0f;
+ vector float vGLWidth50, vGLHeight50;
+ unsigned int blitBool;
+
+ vec_dst((int *)(&(s->p[0])), 0x00020200, 2);
+
+ {
+ vector unsigned char permute1 = vec_lvsl( 0, &glWidth50 );
+ vector unsigned char permute2 = vec_lvsl( 0, &glHeight50 );
+ permute1 = (vector unsigned char) vec_splat( (vector unsigned int) permute1, 0 );
+ permute2 = (vector unsigned char) vec_splat( (vector unsigned int) permute2, 0 );
+ vGLWidth50 = vec_lde( 0, &glWidth50 );
+ vGLHeight50 = vec_lde( 0, &glHeight50 );
+ vGLWidth50 = vec_perm( vGLWidth50, vGLWidth50, permute1 );
+ vGLHeight50 = vec_perm( vGLHeight50, vGLHeight50, permute2 );
+ }
+
+ width.f[0] = (streamSize+2.5f*flurry->streamExpansion) * screenRatio;
+ width.v = (vector float) vec_splat((vector unsigned int)width.v, 0);
+
+ briteV.f[0] = brightness;
+ briteV.v = (vector float) vec_splat((vector unsigned int)briteV.v, 0);
+
+ fTimeV.f[0] = (float) flurry->fTime;
+ fTimeV.v = (vector float) vec_splat((vector unsigned int)fTimeV.v, 0);
+
+ expansionV.f[0] = flurry->streamExpansion;
+ expansionV.v = (vector float) vec_splat((vector unsigned int)expansionV.v, 0);
+
+ screenRatioV.f[0] = screenRatio;
+ screenRatioV.v = (vector float) vec_splat((vector unsigned int)screenRatioV.v, 0);
+
+ hslash2V.f[0] = hslash2;
+ hslash2V.v = (vector float) vec_splat((vector unsigned int)hslash2V.v, 0);
+
+ wslash2V.f[0] = wslash2;
+ wslash2V.v = (vector float) vec_splat((vector unsigned int)wslash2V.v, 0);
+
+ streamSizeV.f[0] = streamSize;
+ streamSizeV.v = (vector float) vec_splat((vector unsigned int)streamSizeV.v, 0);
+
+ glWidthV.f[0] = global->sys_glWidth;
+ glWidthV.v = (vector float) vec_splat((vector unsigned int)glWidthV.v, 0);
+
+ for (i=0;i<NUMSMOKEPARTICLES/4;i++) {
+ vector float thisWidth;
+ vector float oldz;
+ vector float oldx, oldy, one_over_oldz;
+ vector float xabs, yabs, mn;
+ vector float d;
+ vector float one_over_d;
+ vector bool int dnz;
+ vector float ow;
+
+ vec_dst((int *)(&(s->p[i+4])), 0x00020200, 2);
+
+ if (vec_all_eq(s->p[i].dead.v, (vector unsigned int)(1))) continue;
+
+ blitBool = 0; /* keep track of particles that actually need to be drawn */
+
+ thisWidth = vec_sub(fTimeV.v, s->p[i].time.v);
+ thisWidth = vec_madd(thisWidth, expansionV.v, streamSizeV.v);
+ thisWidth = vec_madd(thisWidth, screenRatioV.v, zero);
+
+ z.v = s->p[i].position[2].v;
+ one_over_z = vec_re(z.v);
+
+ sx = vec_madd(s->p[i].position[0].v, glWidthV.v, zero);
+ sx = vec_madd(sx, one_over_z, wslash2V.v);
+ sy = vec_madd(s->p[i].position[1].v, glWidthV.v, zero);
+ sy = vec_madd(sy, one_over_z, hslash2V.v);
+
+ oldz = s->p[i].oldposition[2].v;
+
+ w = vec_max((vector float)(1.0), vec_madd(thisWidth, one_over_z, zero));
+
+ oldx = s->p[i].oldposition[0].v;
+ oldy = s->p[i].oldposition[1].v;
+ one_over_oldz = vec_re(oldz);
+ oldscreenx = vec_madd(oldx, glWidthV.v, zero);
+ oldscreenx = vec_madd(oldscreenx, one_over_oldz, wslash2V.v);
+ oldscreeny = vec_madd(oldy, glWidthV.v, zero);
+ oldscreeny = vec_madd(oldscreeny, one_over_oldz, hslash2V.v);
+ dx = vec_sub(sx,oldscreenx);
+ dy = vec_sub(sy,oldscreeny);
+
+ xabs = vec_abs(dx);
+ yabs = vec_abs(dy);
+ mn = vec_min(xabs,yabs);
+ d = vec_add(xabs,yabs);
+ d = vec_madd(mn, (vector float)(-0.6875), d);
+
+ ow = vec_max((vector float)(1.0), vec_madd(thisWidth, one_over_oldz, zero));
+ one_over_d = vec_re(d);
+ dnz = vec_cmpgt(d, zero);
+ sm = vec_madd(w, one_over_d, zero);
+ sm = vec_and(sm, dnz);
+ os = vec_madd(ow, one_over_d, zero);
+ os = vec_and(os, dnz);
+
+ {
+ intToVector tempMask;
+ vector bool int mask = vec_cmpeq( s->p[i].dead.v, vec_splat_u32(1) ); /* -1 where true */
+ vector bool int gtMask = vec_cmpge( thisWidth, width.v ); /* -1 where true */
+ vector bool int glWidth50Test = vec_cmpgt( sx, (vector float)(vGLWidth50) ); /* -1 where true */
+ vector bool int glHeight50Test = vec_cmpgt( sy, (vector float)(vGLHeight50) ); /* -1 where true */
+ vector bool int test50x = vec_cmplt( sx, (vector float) (-50.0) );
+ vector bool int test50y = vec_cmplt( sy, (vector float) (-50.0) );
+ vector bool int testz = vec_cmplt( z.v, (vector float) (25.0) );
+ vector bool int testoldz = vec_cmplt( oldz, (vector float) (25.0) );
+ mask = vec_or( mask, gtMask );
+ s->p[i].dead.v = vec_and( mask, vec_splat_u32( 1 ) );
+ mask = vec_or( mask, glWidth50Test );
+ mask = vec_or( mask, glHeight50Test );
+ mask = vec_or( mask, test50x );
+ mask = vec_or( mask, test50y );
+ mask = vec_or( mask, testz );
+ mask = vec_or( mask, testoldz );
+ tempMask.v = (vector unsigned int)mask;
+
+ s->p[i].animFrame.v = vec_sub( s->p[i].animFrame.v, vec_nor( mask, mask ) );
+ s->p[i].animFrame.v = vec_and( s->p[i].animFrame.v, (vector unsigned int)(63) );
+
+ frameAnd7 = vec_ctf(vec_and(s->p[i].animFrame.v, (vector unsigned int)(7)),0);
+ u0.v = vec_madd(frameAnd7, eighth, zero);
+
+ frameShift3 = vec_ctf(vec_sr(s->p[i].animFrame.v, (vector unsigned int)(3)),0);
+ v0.v = vec_madd(frameAnd7, eighth, zero);
+
+ u1.v = vec_add(u0.v, eighth);
+ v1.v = vec_add(v0.v, eighth);
+
+ one_over_width = vec_re(width.v);
+ cm.v = vec_sel( vec_nmsub(thisWidth, one_over_width, (vector float)(1.375)), cm.v, mask );
+ cm.v = vec_madd(cm.v, briteV.v, zero);
+
+ vSi = vec_sub( vSi, vec_nor( mask, mask ) );
+ {
+ vector unsigned int blitMask = (vector unsigned int) (1, 2, 4, 8);
+ vector unsigned int temp = (vector unsigned int)mask;
+ temp = vec_andc( blitMask, temp );
+ temp = vec_add( temp, vec_sld( temp, temp, 8 ) );
+ temp = vec_add( temp, vec_sld( temp, temp, 4 ) );
+ vec_ste( temp, 0, &blitBool );
+
+ }
+
+ {
+ vector float temp1, temp2, temp3, temp4;
+ vector float result1a, result1b, result2a, result2b, result3a, result3b, result4a, result4b;
+
+ temp1 = vec_mergeh( u0.v, u0.v );
+ temp2 = vec_mergel( u0.v, u0.v );
+ temp3 = vec_mergeh( v0.v, v1.v );
+ temp4 = vec_mergel( v0.v, v1.v );
+
+ result1a = vec_mergeh( temp1, temp3 );
+ result1b = vec_mergel( temp1, temp3 );
+ result2a = vec_mergeh( temp2, temp4 );
+ result2b = vec_mergel( temp2, temp4 );
+
+ temp1 = vec_mergeh( u1.v, u1.v );
+ temp2 = vec_mergel( u1.v, u1.v );
+ temp3 = vec_mergeh( v1.v, v0.v );
+ temp4 = vec_mergel( v1.v, v0.v );
+
+ result3a = vec_mergeh( temp1, temp3 );
+ result3b = vec_mergel( temp1, temp3 );
+ result4a = vec_mergeh( temp2, temp4 );
+ result4b = vec_mergel( temp2, temp4 );
+
+ if( blitBool & 1 )
+ {
+ vec_st( result1a, 0, &s->seraphimTextures[sti] );
+ vec_st( result3a, 16, &s->seraphimTextures[sti]);
+ sti+= 8;
+ }
+ if( blitBool & 2 )
+ {
+ vec_st( result1b, 0, &s->seraphimTextures[sti]);
+ vec_st( result3b, 16, &s->seraphimTextures[sti]);
+ sti+= 8;
+ }
+ if( blitBool & 4 )
+ {
+ vec_st( result2a, 0, &s->seraphimTextures[sti]);
+ vec_st( result4a, 16, &s->seraphimTextures[sti]);
+ sti+= 8;
+ }
+ if( blitBool & 8 )
+ {
+ vec_st( result2b, 0, &s->seraphimTextures[sti]);
+ vec_st( result4b, 16, &s->seraphimTextures[sti]);
+ sti+= 8;
+ }
+ }
+ }
+
+ cmv[0] = vec_madd(s->p[i].color[0].v, cm.v, zero);
+ cmv[1] = vec_madd(s->p[i].color[1].v, cm.v, zero);
+ cmv[2] = vec_madd(s->p[i].color[2].v, cm.v, zero);
+ cmv[3] = vec_madd(s->p[i].color[3].v, cm.v, zero);
+ {
+ vector float vI0, vI1, vI2, vI3;
+
+ vI0 = vec_mergeh ( cmv[0], cmv[2] );
+ vI1 = vec_mergeh ( cmv[1], cmv[3] );
+ vI2 = vec_mergel ( cmv[0], cmv[2] );
+ vI3 = vec_mergel ( cmv[1], cmv[3] );
+
+ cmv[0] = vec_mergeh ( vI0, vI1 );
+ cmv[1] = vec_mergel ( vI0, vI1 );
+ cmv[2] = vec_mergeh ( vI2, vI3 );
+ cmv[3] = vec_mergel ( vI2, vI3 );
+ }
+
+ vec_dst( cmv, 0x0D0100D0, 1 );
+
+ {
+ vector float sxd, syd;
+ vector float sxdm, sxdp, sydm, sydp;
+ vector float oxd, oyd;
+ vector float oxdm, oxdp, oydm, oydp;
+ vector float vI0, vI1, vI2, vI3;
+ vector float dxs, dys;
+ vector float dxos, dyos;
+ vector float dxm, dym;
+ vector float m;
+
+ m = vec_add((vector float)(1.0), sm);
+
+ dxs = vec_madd(dx, sm, zero);
+ dys = vec_madd(dy, sm, zero);
+ dxos = vec_madd(dx, os, zero);
+ dyos = vec_madd(dy, os, zero);
+ dxm = vec_madd(dx, m, zero);
+ dym = vec_madd(dy, m, zero);
+
+ sxd = vec_add(sx, dxm);
+ sxdm = vec_sub(sxd, dys);
+ sxdp = vec_add(sxd, dys);
+
+ syd = vec_add(sy, dym);
+ sydm = vec_sub(syd, dxs);
+ sydp = vec_add(syd, dxs);
+
+ oxd = vec_sub(oldscreenx, dxm);
+ oxdm = vec_sub(oxd, dyos);
+ oxdp = vec_add(oxd, dyos);
+
+ oyd = vec_sub(oldscreeny, dym);
+ oydm = vec_sub(oyd, dxos);
+ oydp = vec_add(oyd, dxos);
+
+ vI0 = vec_mergeh ( sxdm, sxdp );
+ vI1 = vec_mergeh ( sydp, sydm );
+ vI2 = vec_mergel ( sxdm, sxdp );
+ vI3 = vec_mergel ( sydp, sydm );
+
+ svec[0] = vec_mergeh ( vI0, vI1 );
+ svec[1] = vec_mergel ( vI0, vI1 );
+ svec[2] = vec_mergeh ( vI2, vI3 );
+ svec[3] = vec_mergel ( vI2, vI3 );
+
+ vI0 = vec_mergeh ( oxdp, oxdm );
+ vI1 = vec_mergeh ( oydm, oydp );
+ vI2 = vec_mergel ( oxdp, oxdm );
+ vI3 = vec_mergel ( oydm, oydp );
+
+ ovec[0] = vec_mergeh ( vI0, vI1 );
+ ovec[1] = vec_mergel ( vI0, vI1 );
+ ovec[2] = vec_mergeh ( vI2, vI3 );
+ ovec[3] = vec_mergel ( vI2, vI3 );
+ }
+
+ {
+ int offset0 = (sci + 0) * sizeof( vector float );
+ int offset1 = (sci + 1) * sizeof( vector float );
+ int offset2 = (sci + 2) * sizeof( vector float );
+ int offset3 = (sci + 3) * sizeof( vector float );
+ int offset4 = (svi + 0) * sizeof( vector float );
+ int offset5 = (svi + 1) * sizeof( vector float );
+ vector float *colors = (vector float *)s->seraphimColors;
+ vector float *vertices = (vector float *)s->seraphimVertices;
+ for (kk=0; kk<4; kk++) {
+ if (blitBool>>kk & 1) {
+ vector float vcmv = cmv[kk];
+ vector float vsvec = svec[kk];
+ vector float vovec = ovec[kk];
+
+ vec_st( vcmv, offset0, colors );
+ vec_st( vcmv, offset1, colors );
+ vec_st( vcmv, offset2, colors );
+ vec_st( vcmv, offset3, colors );
+ vec_st( vsvec, offset4, vertices );
+ vec_st( vovec, offset5, vertices );
+ colors += 4;
+ vertices += 2;
+ sci += 4;
+ svi += 2;
+ }
+ }
+ }
+ }
+ vSi = vec_add( vSi, vec_sld( vSi, vSi, 8 ) );
+ vSi = vec_add( vSi, vec_sld( vSi, vSi, 4 ) );
+ vec_ste( (vector signed int) vSi, 0, &si );
+
+ glColorPointer(4,GL_FLOAT,0,s->seraphimColors);
+ glVertexPointer(2,GL_FLOAT,0,s->seraphimVertices);
+ glTexCoordPointer(2,GL_FLOAT,0,s->seraphimTextures);
+ glDrawArrays(GL_QUADS,0,si*4);
+}
+
+#endif
+#endif /* 0 */
diff --git a/hacks/glx/flurry-spark.c b/hacks/glx/flurry-spark.c
new file mode 100644
index 0000000..5b58b56
--- /dev/null
+++ b/hacks/glx/flurry-spark.c
@@ -0,0 +1,285 @@
+/*
+
+Copyright (c) 2002, Calum Robinson
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the author nor the names of its contributors may be used
+ to endorse or promote products derived from this software without specific
+ prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+/* Spark.cpp: implementation of the Spark class. */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "flurry.h"
+
+void InitSpark(Spark *s)
+{
+ int i;
+ for (i=0;i<3;i++)
+ {
+ s->position[i] = RandFlt(-100.0, 100.0);
+ }
+}
+
+void DrawSpark(global_info_t *global, flurry_info_t *flurry, Spark *s)
+{
+ const float black[4] = {0.0f,0.0f,0.0f,1.0f};
+ float width,sx,sy;
+ float a;
+ float c = 0.0625f;
+ float screenx;
+ float screeny;
+ float w,z, scale;
+ int k;
+ width = 60000.0f * global->sys_glWidth / 1024.0f;
+
+ z = s->position[2];
+ sx = s->position[0] * global->sys_glWidth / z + global->sys_glWidth * 0.5f;
+ sy = s->position[1] * global->sys_glWidth / z + global->sys_glHeight * 0.5f;
+ w = width*4.0f / z;
+
+ screenx = sx;
+ screeny = sy;
+
+ glPushMatrix();
+ glTranslatef(screenx,screeny,0.0f);
+ scale = w/50.0f;
+ glScalef(scale,scale,0.0f);
+ for (k=0;k<12;k++)
+ {
+ a = ((float) (random() % 3600)) / 10.0f;
+ glRotatef(a,0.0f,0.0f,1.0f);
+ glBegin(GL_QUAD_STRIP);
+ glColor4fv(black);
+ glVertex2f(-3.0f,0.0f);
+ a = 2.0f + (float) (random() & 255) * c;
+ glVertex2f(-3.0f,a);
+ glColor4fv(s->color);
+ glVertex2f(0.0f,0.0f);
+ glColor4fv(black);
+ glVertex2f(0.0f,a);
+ glVertex2f(3.0f,0.0f);
+ glVertex2f(3.0f,a);
+ glEnd();
+ }
+ glPopMatrix();
+}
+
+#define BIGMYSTERY 1800.0
+#define MAXANGLES 16384
+
+void UpdateSparkColour(global_info_t *global, flurry_info_t *flurry, Spark *s)
+{
+ const float rotationsPerSecond = (float) (2.0*PI*fieldSpeed/MAXANGLES);
+ double thisPointInRadians;
+ double thisAngle = flurry->fTime*rotationsPerSecond;
+ float cf;
+ float cycleTime = 20.0f;
+ float colorRot;
+ float redPhaseShift;
+ float greenPhaseShift;
+ float bluePhaseShift;
+ float baseRed;
+ float baseGreen;
+ float baseBlue;
+ float colorTime;
+
+ if (flurry->currentColorMode == rainbowColorMode)
+ {
+ cycleTime = 1.5f;
+ }
+ else if (flurry->currentColorMode == tiedyeColorMode)
+ {
+ cycleTime = 4.5f;
+ }
+ else if (flurry->currentColorMode == cyclicColorMode)
+ {
+ cycleTime = 20.0f;
+ }
+ else if (flurry->currentColorMode == slowCyclicColorMode)
+ {
+ cycleTime = 120.0f;
+ }
+ colorRot = (float) (2.0*PI/cycleTime);
+ redPhaseShift = 0.0f; /* cycleTime * 0.0f / 3.0f */
+ greenPhaseShift = cycleTime / 3.0f;
+ bluePhaseShift = cycleTime * 2.0f / 3.0f ;
+ colorTime = flurry->fTime;
+ if (flurry->currentColorMode == whiteColorMode)
+ {
+ baseRed = 0.1875f;
+ baseGreen = 0.1875f;
+ baseBlue = 0.1875f;
+ }
+ else if (flurry->currentColorMode == multiColorMode)
+ {
+ baseRed = 0.0625f;
+ baseGreen = 0.0625f;
+ baseBlue = 0.0625f;
+ }
+ else if (flurry->currentColorMode == darkColorMode)
+ {
+ baseRed = 0.0f;
+ baseGreen = 0.0f;
+ baseBlue = 0.0f;
+ }
+ else
+ {
+ if (flurry->currentColorMode < slowCyclicColorMode)
+ {
+ colorTime = (flurry->currentColorMode / 6.0f) * cycleTime;
+ }
+ else
+ {
+ colorTime = flurry->fTime + flurry->flurryRandomSeed;
+ }
+ baseRed = 0.109375f * ((float) cos((colorTime+redPhaseShift)*colorRot)+1.0f);
+ baseGreen = 0.109375f * ((float) cos((colorTime+greenPhaseShift)*colorRot)+1.0f);
+ baseBlue = 0.109375f * ((float) cos((colorTime+bluePhaseShift)*colorRot)+1.0f);
+ }
+
+ cf = ((float) (cos(7.0*((flurry->fTime)*rotationsPerSecond))+cos(3.0*((flurry->fTime)*rotationsPerSecond))+cos(13.0*((flurry->fTime)*rotationsPerSecond))));
+ cf /= 6.0f;
+ cf += 2.0f;
+ thisPointInRadians = 2.0 * PI * (double) s->mystery / (double) BIGMYSTERY;
+
+ s->color[0] = baseRed + 0.0625f * (0.5f + (float) cos((15.0 * (thisPointInRadians + 3.0*thisAngle))) + (float) sin((7.0 * (thisPointInRadians + thisAngle))));
+ s->color[1] = baseGreen + 0.0625f * (0.5f + (float) sin(((thisPointInRadians) + thisAngle)));
+ s->color[2] = baseBlue + 0.0625f * (0.5f + (float) cos((37.0 * (thisPointInRadians + thisAngle))));
+}
+
+void UpdateSpark(global_info_t *global, flurry_info_t *flurry, Spark *s)
+{
+ const float rotationsPerSecond = (float) (2.0*PI*fieldSpeed/MAXANGLES);
+ double thisPointInRadians;
+ double thisAngle = flurry->fTime*rotationsPerSecond;
+ float cf;
+ int i;
+ double tmpX1,tmpY1,tmpZ1;
+ double tmpX2,tmpY2,tmpZ2;
+ double tmpX3,tmpY3,tmpZ3;
+ double tmpX4,tmpY4,tmpZ4;
+ double rotation;
+ double cr;
+ double sr;
+ float cycleTime = 20.0f;
+ float colorRot;
+ float redPhaseShift;
+ float greenPhaseShift;
+ float bluePhaseShift;
+ float baseRed;
+ float baseGreen;
+ float baseBlue;
+ float colorTime;
+
+ float old[3];
+
+ if (flurry->currentColorMode == rainbowColorMode) {
+ cycleTime = 1.5f;
+ } else if (flurry->currentColorMode == tiedyeColorMode) {
+ cycleTime = 4.5f;
+ } else if (flurry->currentColorMode == cyclicColorMode) {
+ cycleTime = 20.0f;
+ } else if (flurry->currentColorMode == slowCyclicColorMode) {
+ cycleTime = 120.0f;
+ }
+ colorRot = (float) (2.0*PI/cycleTime);
+ redPhaseShift = 0.0f; /* cycleTime * 0.0f / 3.0f */
+ greenPhaseShift = cycleTime / 3.0f;
+ bluePhaseShift = cycleTime * 2.0f / 3.0f ;
+ colorTime = flurry->fTime;
+ if (flurry->currentColorMode == whiteColorMode) {
+ baseRed = 0.1875f;
+ baseGreen = 0.1875f;
+ baseBlue = 0.1875f;
+ } else if (flurry->currentColorMode == multiColorMode) {
+ baseRed = 0.0625f;
+ baseGreen = 0.0625f;
+ baseBlue = 0.0625f;
+ } else if (flurry->currentColorMode == darkColorMode) {
+ baseRed = 0.0f;
+ baseGreen = 0.0f;
+ baseBlue = 0.0f;
+ } else {
+ if(flurry->currentColorMode < slowCyclicColorMode) {
+ colorTime = (flurry->currentColorMode / 6.0f) * cycleTime;
+ } else {
+ colorTime = flurry->fTime + flurry->flurryRandomSeed;
+ }
+ baseRed = 0.109375f * ((float) cos((colorTime+redPhaseShift)*colorRot)+1.0f);
+ baseGreen = 0.109375f * ((float) cos((colorTime+greenPhaseShift)*colorRot)+1.0f);
+ baseBlue = 0.109375f * ((float) cos((colorTime+bluePhaseShift)*colorRot)+1.0f);
+ }
+
+ for (i=0;i<3;i++) {
+ old[i] = s->position[i];
+ }
+
+ cf = ((float) (cos(7.0*((flurry->fTime)*rotationsPerSecond))+cos(3.0*((flurry->fTime)*rotationsPerSecond))+cos(13.0*((flurry->fTime)*rotationsPerSecond))));
+ cf /= 6.0f;
+ cf += 2.0f;
+ thisPointInRadians = 2.0 * PI * (double) s->mystery / (double) BIGMYSTERY;
+
+ s->color[0] = baseRed + 0.0625f * (0.5f + (float) cos((15.0 * (thisPointInRadians + 3.0*thisAngle))) + (float) sin((7.0 * (thisPointInRadians + thisAngle))));
+ s->color[1] = baseGreen + 0.0625f * (0.5f + (float) sin(((thisPointInRadians) + thisAngle)));
+ s->color[2] = baseBlue + 0.0625f * (0.5f + (float) cos((37.0 * (thisPointInRadians + thisAngle))));
+ s->position[0] = fieldRange * cf * (float) cos(11.0 * (thisPointInRadians + (3.0*thisAngle)));
+ s->position[1] = fieldRange * cf * (float) sin(12.0 * (thisPointInRadians + (4.0*thisAngle)));
+ s->position[2] = fieldRange * (float) cos((23.0 * (thisPointInRadians + (12.0*thisAngle))));
+
+ rotation = thisAngle*0.501 + 5.01 * (double) s->mystery / (double) BIGMYSTERY;
+ cr = cos(rotation);
+ sr = sin(rotation);
+ tmpX1 = s->position[0] * cr - s->position[1] * sr;
+ tmpY1 = s->position[1] * cr + s->position[0] * sr;
+ tmpZ1 = s->position[2];
+
+ tmpX2 = tmpX1 * cr - tmpZ1 * sr;
+ tmpY2 = tmpY1;
+ tmpZ2 = tmpZ1 * cr + tmpX1 * sr;
+
+ tmpX3 = tmpX2;
+ tmpY3 = tmpY2 * cr - tmpZ2 * sr;
+ tmpZ3 = tmpZ2 * cr + tmpY2 * sr + seraphDistance;
+
+ rotation = thisAngle*2.501 + 85.01 * (double) s->mystery / (double) BIGMYSTERY;
+ cr = cos(rotation);
+ sr = sin(rotation);
+ tmpX4 = tmpX3 * cr - tmpY3 * sr;
+ tmpY4 = tmpY3 * cr + tmpX3 * sr;
+ tmpZ4 = tmpZ3;
+
+ s->position[0] = (float) tmpX4 + RandBell(5.0f*fieldCoherence);
+ s->position[1] = (float) tmpY4 + RandBell(5.0f*fieldCoherence);
+ s->position[2] = (float) tmpZ4 + RandBell(5.0f*fieldCoherence);
+
+ for (i=0;i<3;i++) {
+ s->delta[i] = (s->position[i] - old[i])/flurry->fDeltaTime;
+ }
+}
diff --git a/hacks/glx/flurry-star.c b/hacks/glx/flurry-star.c
new file mode 100644
index 0000000..8d9cc41
--- /dev/null
+++ b/hacks/glx/flurry-star.c
@@ -0,0 +1,106 @@
+/*
+
+Copyright (c) 2002, Calum Robinson
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the author nor the names of its contributors may be used
+ to endorse or promote products derived from this software without specific
+ prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+/* Star.c: implementation of the Star class. */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "flurry.h"
+
+/* Construction/Destruction */
+
+void InitStar(Star *s)
+{
+ int i;
+ for (i=0;i<3;i++) {
+ s->position[i] = RandFlt(-10000.0, 10000.0);
+ }
+ s->rotSpeed = RandFlt(0.4, 0.9);
+ s->mystery = RandFlt(0.0, 10.0);
+}
+
+#define BIGMYSTERY 1800.0
+#define MAXANGLES 16384
+
+void UpdateStar(global_info_t *global, flurry_info_t *flurry, Star *s)
+{
+ float rotationsPerSecond = (float) (2.0*PI*12.0/MAXANGLES) * s->rotSpeed /* speed control */;
+ double thisPointInRadians;
+ double thisAngle = flurry->fTime*rotationsPerSecond;
+ float cf;
+ double tmpX1,tmpY1,tmpZ1;
+ double tmpX2,tmpY2,tmpZ2;
+ double tmpX3,tmpY3,tmpZ3;
+ double tmpX4,tmpY4,tmpZ4;
+ double rotation;
+ double cr;
+ double sr;
+
+ s->ate = 0;
+
+ cf = ((float) (cos(7.0*((flurry->fTime)*rotationsPerSecond))+cos(3.0*((flurry->fTime)*rotationsPerSecond))+cos(13.0*((flurry->fTime)*rotationsPerSecond))));
+ cf /= 6.0f;
+ cf += 0.75f;
+ thisPointInRadians = 2.0 * PI * (double) s->mystery / (double) BIGMYSTERY;
+
+ s->position[0] = 250.0f * cf * (float) cos(11.0 * (thisPointInRadians + (3.0*thisAngle)));
+ s->position[1] = 250.0f * cf * (float) sin(12.0 * (thisPointInRadians + (4.0*thisAngle)));
+ s->position[2] = 250.0f * (float) cos((23.0 * (thisPointInRadians + (12.0*thisAngle))));
+
+ rotation = thisAngle*0.501 + 5.01 * (double) s->mystery / (double) BIGMYSTERY;
+ cr = cos(rotation);
+ sr = sin(rotation);
+ tmpX1 = s->position[0] * cr - s->position[1] * sr;
+ tmpY1 = s->position[1] * cr + s->position[0] * sr;
+ tmpZ1 = s->position[2];
+
+ tmpX2 = tmpX1 * cr - tmpZ1 * sr;
+ tmpY2 = tmpY1;
+ tmpZ2 = tmpZ1 * cr + tmpX1 * sr;
+
+ tmpX3 = tmpX2;
+ tmpY3 = tmpY2 * cr - tmpZ2 * sr;
+ tmpZ3 = tmpZ2 * cr + tmpY2 * sr + seraphDistance;
+
+ rotation = thisAngle*2.501 + 85.01 * (double) s->mystery / (double) BIGMYSTERY;
+ cr = cos(rotation);
+ sr = sin(rotation);
+ tmpX4 = tmpX3 * cr - tmpY3 * sr;
+ tmpY4 = tmpY3 * cr + tmpX3 * sr;
+ tmpZ4 = tmpZ3;
+
+ s->position[0] = (float) tmpX4;
+ s->position[1] = (float) tmpY4;
+ s->position[2] = (float) tmpZ4;
+}
diff --git a/hacks/glx/flurry-texture.c b/hacks/glx/flurry-texture.c
new file mode 100644
index 0000000..c787f59
--- /dev/null
+++ b/hacks/glx/flurry-texture.c
@@ -0,0 +1,224 @@
+/*
+
+Copyright (c) 2002, Calum Robinson
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the author nor the names of its contributors may be used
+ to endorse or promote products derived from this software without specific
+ prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+/*
+ * Texture.c
+ * AppleFlurry
+ *
+ * Created by calumr on Sat Jul 07 2001.
+ * Copyright (c) 2001 __CompanyName__. All rights reserved.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "flurry.h"
+
+#include <GL/gl.h>
+#include <GL/glu.h>
+
+#include <stdlib.h>
+#include <math.h>
+
+static GLubyte smallTextureArray[32][32];
+static GLubyte bigTextureArray[256][256][2];
+GLuint theTexture = 0;
+
+/* simple smoothing routine */
+static void SmoothTexture(void)
+{
+ GLubyte filter[32][32];
+ int i,j;
+ float t;
+ for (i=1;i<31;i++)
+ {
+ for (j=1;j<31;j++)
+ {
+ t = (float) smallTextureArray[i][j]*4;
+ t += (float) smallTextureArray[i-1][j];
+ t += (float) smallTextureArray[i+1][j];
+ t += (float) smallTextureArray[i][j-1];
+ t += (float) smallTextureArray[i][j+1];
+ t /= 8.0f;
+ filter[i][j] = (GLubyte) t;
+ }
+ }
+ for (i=1;i<31;i++)
+ {
+ for (j=1;j<31;j++)
+ {
+ smallTextureArray[i][j] = filter[i][j];
+ }
+ }
+}
+
+/* add some randomness to texture data */
+static void SpeckleTexture(void)
+{
+ int i,j;
+ int speck;
+ float t;
+ for (i=2;i<30;i++)
+ {
+ for (j=2;j<30;j++)
+ {
+ speck = 1;
+ while (speck <= 32 && random() % 2)
+ {
+ t = (float) MIN_(255,smallTextureArray[i][j]+speck);
+ smallTextureArray[i][j] = (GLubyte) t;
+ speck+=speck;
+ }
+ speck = 1;
+ while (speck <= 32 && random() % 2)
+ {
+ t = (float) MAX_(0,smallTextureArray[i][j]-speck);
+ smallTextureArray[i][j] = (GLubyte) t;
+ speck+=speck;
+ }
+ }
+ }
+}
+
+static void MakeSmallTexture(void)
+{
+ static int firstTime = 1;
+ int i,j;
+ float r,t;
+ if (firstTime)
+ {
+ firstTime = 0;
+ for (i=0;i<32;i++)
+ {
+ for (j=0;j<32;j++)
+ {
+ r = (float) sqrt((i-15.5)*(i-15.5)+(j-15.5)*(j-15.5));
+ if (r > 15.0f)
+ {
+ smallTextureArray[i][j] = 0;
+ }
+ else
+ {
+ t = 255.0f * (float) cos(r*M_PI/31.0);
+ smallTextureArray[i][j] = (GLubyte) t;
+ }
+ }
+ }
+ }
+ else
+ {
+ for (i=0;i<32;i++)
+ {
+ for (j=0;j<32;j++)
+ {
+ r = (float) sqrt((i-15.5)*(i-15.5)+(j-15.5)*(j-15.5));
+ if (r > 15.0f)
+ {
+ t = 0.0f;
+ }
+ else
+ {
+ t = 255.0f * (float) cos(r*M_PI/31.0);
+ }
+ smallTextureArray[i][j] = (GLubyte) MIN_(255,(t+smallTextureArray[i][j]+smallTextureArray[i][j])/3);
+ }
+ }
+ }
+ SpeckleTexture();
+ SmoothTexture();
+ SmoothTexture();
+}
+
+static void CopySmallTextureToBigTexture(int k, int l)
+{
+ int i,j;
+ for (i=0;i<32;i++)
+ {
+ for (j=0;j<32;j++)
+ {
+ bigTextureArray[i+k][j+l][0] = smallTextureArray[i][j];
+ bigTextureArray[i+k][j+l][1] = smallTextureArray[i][j];
+ }
+ }
+}
+
+static void AverageLastAndFirstTextures(void)
+{
+ int i,j;
+ int t;
+ for (i=0;i<32;i++)
+ {
+ for (j=0;j<32;j++)
+ {
+ t = (smallTextureArray[i][j] + bigTextureArray[i][j][0]) / 2;
+ smallTextureArray[i][j] = (GLubyte) MIN_(255,t);
+ }
+ }
+}
+
+void MakeTexture()
+{
+ int i,j;
+ for (i=0;i<8;i++)
+ {
+ for (j=0;j<8;j++)
+ {
+ if (i==7 && j==7)
+ {
+ AverageLastAndFirstTextures();
+ }
+ else
+ {
+ MakeSmallTexture();
+ }
+ CopySmallTextureToBigTexture(i*32,j*32);
+ }
+ }
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT,1);
+
+ glGenTextures(1, &theTexture);
+ glBindTexture(GL_TEXTURE_2D, theTexture);
+
+ /* Set the tiling mode (this is generally always GL_REPEAT). */
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+ /* Set the filtering. */
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
+
+ gluBuild2DMipmaps(GL_TEXTURE_2D, 2, 256, 256, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, bigTextureArray);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+}
diff --git a/hacks/glx/flurry.c b/hacks/glx/flurry.c
new file mode 100644
index 0000000..c9008a9
--- /dev/null
+++ b/hacks/glx/flurry.c
@@ -0,0 +1,549 @@
+/* -*- Mode: C; tab-width: 4 c-basic-offset: 4 indent-tabs-mode: t -*- */
+/*
+ * vim: ts=8 sw=4 noet
+ */
+
+/*
+
+Copyright (c) 2002, Calum Robinson
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the author nor the names of its contributors may be used
+ to endorse or promote products derived from this software without specific
+ prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+/* flurry */
+
+#if 0
+static const char sccsid[] = "@(#)flurry.c 4.07 97/11/24 xlockmore";
+#endif
+
+#define DEF_PRESET "random"
+#define DEF_BRIGHTNESS "8"
+
+# define DEFAULTS "*delay: 10000 \n" \
+ "*showFPS: False \n"
+
+# define release_flurry 0
+# define flurry_handle_event xlockmore_no_events
+# include "xlockmore.h" /* from the xscreensaver distribution */
+
+#ifdef USE_GL
+
+static char *preset_str;
+
+static XrmOptionDescRec opts[] = {
+ { "-preset", ".preset", XrmoptionSepArg, 0 }
+};
+
+static argtype vars[] = {
+ {&preset_str, "preset", "Preset", DEF_PRESET, t_String},
+};
+
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+ENTRYPOINT ModeSpecOpt flurry_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct flurry_description = {
+ "flurry",
+ "init_flurry",
+ "draw_flurry",
+ NULL,
+ "draw_flurry",
+ "init_flurry",
+ "free_flurry",
+ &flurry_opts,
+ 1000, 1, 2, 1, 4, 1.0,
+ "",
+ "Flurry",
+ 0,
+ NULL
+};
+
+#endif
+
+#include "flurry.h"
+
+global_info_t *flurry_info = NULL;
+
+static
+double currentTime(void) {
+ struct timeval tv;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&tv, &tzp);
+# else
+ gettimeofday(&tv);
+# endif
+
+ return (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0;
+}
+
+double TimeInSecondsSinceStart (const global_info_t *global) {
+ return currentTime() - global->gTimeCounter;
+}
+
+#if 0
+#ifdef __ppc__
+static int IsAltiVecAvailable(void)
+{
+ return 0;
+}
+#endif
+#endif
+
+
+static
+void delete_flurry_info(flurry_info_t *flurry)
+{
+ int i;
+
+ free(flurry->s);
+ free(flurry->star);
+ for (i=0;i<MAX_SPARKS;i++)
+ {
+ free(flurry->spark[i]);
+ }
+ /* free(flurry); */
+}
+
+static
+flurry_info_t *new_flurry_info(global_info_t *global, int streams, ColorModes colour, float thickness, float speed, double bf)
+{
+ int i,k;
+ flurry_info_t *flurry = (flurry_info_t *)malloc(sizeof(flurry_info_t));
+
+ if (!flurry) return NULL;
+
+ flurry->flurryRandomSeed = RandFlt(0.0, 300.0);
+
+ flurry->fOldTime = 0;
+ flurry->dframe = 0;
+ flurry->fTime = TimeInSecondsSinceStart(global) + flurry->flurryRandomSeed;
+ flurry->fDeltaTime = flurry->fTime - flurry->fOldTime;
+
+ flurry->numStreams = streams;
+ flurry->streamExpansion = thickness;
+ flurry->currentColorMode = colour;
+ flurry->briteFactor = bf;
+
+ flurry->s = malloc(sizeof(SmokeV));
+ InitSmoke(flurry->s);
+
+ flurry->star = malloc(sizeof(Star));
+ InitStar(flurry->star);
+ flurry->star->rotSpeed = speed;
+
+ for (i = 0;i < MAX_SPARKS; i++)
+ {
+ flurry->spark[i] = malloc(sizeof(Spark));
+ InitSpark(flurry->spark[i]);
+ flurry->spark[i]->mystery = 1800 * (i + 1) / 13; /* 100 * (i + 1) / (flurry->numStreams + 1); */
+ UpdateSpark(global, flurry, flurry->spark[i]);
+ }
+
+ for (i=0;i<NUMSMOKEPARTICLES/4;i++) {
+ for(k=0;k<4;k++) {
+ flurry->s->p[i].dead.i[k] = 1;
+ }
+ }
+
+ flurry->next = NULL;
+
+ return flurry;
+}
+
+static
+void GLSetupRC(global_info_t *global)
+{
+ /* setup the defaults for OpenGL */
+ glDisable(GL_DEPTH_TEST);
+ glAlphaFunc(GL_GREATER,0.0f);
+ glEnable(GL_ALPHA_TEST);
+ glShadeModel(GL_FLAT);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_CULL_FACE);
+ glEnable(GL_BLEND);
+
+ glViewport(0,0,(int) global->sys_glWidth,(int) global->sys_glHeight);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(0,global->sys_glWidth,0,global->sys_glHeight,-1,1);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glEnableClientState(GL_COLOR_ARRAY);
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+
+#if 0
+#ifdef __ppc__
+ global->optMode = OPT_MODE_SCALAR_FRSQRTE;
+
+#ifdef __VEC__
+ if (IsAltiVecAvailable()) global->optMode = OPT_MODE_VECTOR_UNROLLED;
+#endif
+
+#else
+ global->optMode = OPT_MODE_SCALAR_BASE;
+#endif
+#endif /* 0 */
+}
+
+static
+void GLRenderScene(global_info_t *global, flurry_info_t *flurry, double b)
+{
+ int i;
+
+ flurry->dframe++;
+
+ flurry->fOldTime = flurry->fTime;
+ flurry->fTime = TimeInSecondsSinceStart(global) + flurry->flurryRandomSeed;
+ flurry->fDeltaTime = flurry->fTime - flurry->fOldTime;
+
+ flurry->drag = (float) pow(0.9965,flurry->fDeltaTime*85.0);
+
+ UpdateStar(global, flurry, flurry->star);
+
+#ifdef DRAW_SPARKS
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+#endif
+
+ for (i=0;i<flurry->numStreams;i++) {
+ flurry->spark[i]->color[0]=1.0;
+ flurry->spark[i]->color[1]=1.0;
+ flurry->spark[i]->color[2]=1.0;
+ flurry->spark[i]->color[2]=1.0;
+ UpdateSpark(global, flurry, flurry->spark[i]);
+#ifdef DRAW_SPARKS
+ DrawSpark(global, flurry, flurry->spark[i]);
+#endif
+ }
+
+ switch(global->optMode) {
+ case OPT_MODE_SCALAR_BASE:
+ UpdateSmoke_ScalarBase(global, flurry, flurry->s);
+ break;
+#if 0
+#ifdef __ppc__
+ case OPT_MODE_SCALAR_FRSQRTE:
+ UpdateSmoke_ScalarFrsqrte(global, flurry, flurry->s);
+ break;
+#endif
+#ifdef __VEC__
+ case OPT_MODE_VECTOR_SIMPLE:
+ UpdateSmoke_VectorBase(global, flurry, flurry->s);
+ break;
+ case OPT_MODE_VECTOR_UNROLLED:
+ UpdateSmoke_VectorUnrolled(global, flurry, flurry->s);
+ break;
+#endif
+#endif /* 0 */
+
+ default:
+ break;
+ }
+
+ /* glDisable(GL_BLEND); */
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ glEnable(GL_TEXTURE_2D);
+
+ switch(global->optMode) {
+ case OPT_MODE_SCALAR_BASE:
+#if 0
+#ifdef __ppc__
+ case OPT_MODE_SCALAR_FRSQRTE:
+#endif
+#endif /* 0 */
+ DrawSmoke_Scalar(global, flurry, flurry->s, b);
+ break;
+#if 0
+#ifdef __VEC__
+ case OPT_MODE_VECTOR_SIMPLE:
+ case OPT_MODE_VECTOR_UNROLLED:
+ DrawSmoke_Vector(global, flurry, flurry->s, b);
+ break;
+#endif
+#endif /* 0 */
+ default:
+ break;
+ }
+
+ glDisable(GL_TEXTURE_2D);
+}
+
+static
+void GLResize(global_info_t *global, float w, float h)
+{
+ global->sys_glWidth = w;
+ global->sys_glHeight = h;
+}
+
+/* new window size or exposure */
+ENTRYPOINT void reshape_flurry(ModeInfo *mi, int width, int height)
+{
+ global_info_t *global = flurry_info + MI_SCREEN(mi);
+
+ glXMakeCurrent(MI_DISPLAY(mi), global->window, *(global->glx_context));
+
+ glViewport(0.0, 0.0, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(0, width, 0, height,-1,1);
+ glMatrixMode(GL_MODELVIEW);
+ glClear(GL_COLOR_BUFFER_BIT);
+ glFlush();
+ GLResize(global, (float)width, (float)height);
+}
+
+ENTRYPOINT void
+init_flurry(ModeInfo * mi)
+{
+ int screen = MI_SCREEN(mi);
+ int i;
+ global_info_t *global;
+ enum {
+ PRESET_INSANE = -1,
+ PRESET_WATER = 0,
+ PRESET_FIRE,
+ PRESET_PSYCHEDELIC,
+ PRESET_RGB,
+ PRESET_BINARY,
+ PRESET_CLASSIC,
+ PRESET_MAX
+ } preset_num;
+
+ MI_INIT (mi, flurry_info);
+
+ global = &flurry_info[screen];
+
+ global->gTimeCounter = currentTime();
+
+ global->window = MI_WINDOW(mi);
+
+ global->flurry = NULL;
+
+ if (!preset_str || !*preset_str) preset_str = DEF_PRESET;
+ if (!strcmp(preset_str, "random")) {
+ preset_num = random() % PRESET_MAX;
+ } else if (!strcmp(preset_str, "water")) {
+ preset_num = PRESET_WATER;
+ } else if (!strcmp(preset_str, "fire")) {
+ preset_num = PRESET_FIRE;
+ } else if (!strcmp(preset_str, "psychedelic")) {
+ preset_num = PRESET_PSYCHEDELIC;
+ } else if (!strcmp(preset_str, "rgb")) {
+ preset_num = PRESET_RGB;
+ } else if (!strcmp(preset_str, "binary")) {
+ preset_num = PRESET_BINARY;
+ } else if (!strcmp(preset_str, "classic")) {
+ preset_num = PRESET_CLASSIC;
+ } else if (!strcmp(preset_str, "insane")) {
+ preset_num = PRESET_INSANE;
+ } else {
+ fprintf(stderr, "%s: unknown preset %s\n", progname, preset_str);
+ exit(1);
+ }
+
+ switch (preset_num) {
+ case PRESET_WATER: {
+ for (i = 0; i < 9; i++) {
+ flurry_info_t *flurry;
+
+ flurry = new_flurry_info(global, 1, blueColorMode, 100.0, 2.0, 2.0);
+ flurry->next = global->flurry;
+ global->flurry = flurry;
+ }
+ break;
+ }
+ case PRESET_FIRE: {
+ flurry_info_t *flurry;
+
+ flurry = new_flurry_info(global, 12, slowCyclicColorMode, 10000.0, 0.2, 1.0);
+ flurry->next = global->flurry;
+ global->flurry = flurry;
+ break;
+ }
+ case PRESET_PSYCHEDELIC: {
+ flurry_info_t *flurry;
+
+ flurry = new_flurry_info(global, 10, rainbowColorMode, 200.0, 2.0, 1.0);
+ flurry->next = global->flurry;
+ global->flurry = flurry;
+ break;
+ }
+ case PRESET_RGB: {
+ flurry_info_t *flurry;
+
+ flurry = new_flurry_info(global, 3, redColorMode, 100.0, 0.8, 1.0);
+ flurry->next = global->flurry;
+ global->flurry = flurry;
+
+ flurry = new_flurry_info(global, 3, greenColorMode, 100.0, 0.8, 1.0);
+ flurry->next = global->flurry;
+ global->flurry = flurry;
+
+ flurry = new_flurry_info(global, 3, blueColorMode, 100.0, 0.8, 1.0);
+ flurry->next = global->flurry;
+ global->flurry = flurry;
+ break;
+ }
+ case PRESET_BINARY: {
+ flurry_info_t *flurry;
+
+ flurry = new_flurry_info(global, 16, tiedyeColorMode, 1000.0, 0.5, 1.0);
+ flurry->next = global->flurry;
+ global->flurry = flurry;
+
+ flurry = new_flurry_info(global, 16, tiedyeColorMode, 1000.0, 1.5, 1.0);
+ flurry->next = global->flurry;
+ global->flurry = flurry;
+ break;
+ }
+ case PRESET_CLASSIC: {
+ flurry_info_t *flurry;
+
+ flurry = new_flurry_info(global, 5, tiedyeColorMode, 10000.0, 1.0, 1.0);
+ flurry->next = global->flurry;
+ global->flurry = flurry;
+ break;
+ }
+ case PRESET_INSANE: {
+ flurry_info_t *flurry;
+
+ flurry = new_flurry_info(global, 64, tiedyeColorMode, 1000.0, 0.5, 0.5);
+ flurry->next = global->flurry;
+ global->flurry = flurry;
+
+ break;
+ }
+ default: {
+ fprintf(stderr, "%s: unknown preset %s\n", progname, preset_str);
+ exit(1);
+ }
+ }
+
+ if ((global->glx_context = init_GL(mi)) != NULL) {
+ reshape_flurry(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ GLSetupRC(global);
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+
+ global->first = 1;
+ global->oldFrameTime = -1;
+}
+
+ENTRYPOINT void
+draw_flurry(ModeInfo * mi)
+{
+ double newFrameTime;
+ double deltaFrameTime = 0;
+ double brite;
+ GLfloat alpha;
+
+ global_info_t *global = flurry_info + MI_SCREEN(mi);
+ flurry_info_t *flurry;
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ newFrameTime = currentTime();
+ if (global->oldFrameTime == -1) {
+ /* special case the first frame -- clear to black */
+ alpha = 1.0;
+ } else {
+ /*
+ * this clamps the speed at below 60fps and, here
+ * at least, produces a reasonably accurate 50fps.
+ * (probably part CPU speed and part scheduler).
+ *
+ * Flurry is designed to run at this speed; much higher
+ * than that and the blending causes the display to
+ * saturate, which looks really ugly.
+ */
+ if (newFrameTime - global->oldFrameTime < 1/60.0) {
+ usleep(MAX_(1,(int)(20000 * (newFrameTime - global->oldFrameTime))));
+ return;
+
+ }
+ deltaFrameTime = newFrameTime - global->oldFrameTime;
+ alpha = 5.0 * deltaFrameTime;
+ }
+ global->oldFrameTime = newFrameTime;
+
+ if (alpha > 0.2) alpha = 0.2;
+
+ if (!global->glx_context)
+ return;
+
+ if (global->first) {
+ MakeTexture();
+ global->first = 0;
+ }
+ glDrawBuffer(GL_BACK);
+ glXMakeCurrent(display, window, *(global->glx_context));
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glColor4f(0.0, 0.0, 0.0, alpha);
+ glRectd(0, 0, global->sys_glWidth, global->sys_glHeight);
+
+ brite = pow(deltaFrameTime,0.75) * 10;
+ for (flurry = global->flurry; flurry; flurry=flurry->next) {
+ GLRenderScene(global, flurry, brite * flurry->briteFactor);
+ }
+
+ if (mi->fps_p) do_fps (mi);
+
+ glFinish();
+ glXSwapBuffers(display, window);
+}
+
+ENTRYPOINT void
+free_flurry(ModeInfo * mi)
+{
+ global_info_t *global = &flurry_info[MI_SCREEN(mi)];
+ flurry_info_t *flurry;
+
+ if (global->glx_context) {
+ glXMakeCurrent(MI_DISPLAY(mi), global->window, *(global->glx_context));
+ }
+
+ for (flurry = global->flurry; flurry; flurry=flurry->next) {
+ delete_flurry_info(flurry);
+ }
+}
+
+XSCREENSAVER_MODULE ("Flurry", flurry)
+
+#endif
diff --git a/hacks/glx/flurry.h b/hacks/glx/flurry.h
new file mode 100644
index 0000000..9bbe4b2
--- /dev/null
+++ b/hacks/glx/flurry.h
@@ -0,0 +1,299 @@
+/*
+
+Copyright (c) 2002, Calum Robinson
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the author nor the names of its contributors may be used
+ to endorse or promote products derived from this software without specific
+ prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+/* -*- Mode: C; tab-width: 4 c-basic-offset: 4 indent-tabs-mode: t -*- */
+/* flurry */
+#ifndef __GLCODE__
+#define __GLCODE__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#ifndef HAVE_JWXYZ
+# include <GL/gl.h>
+# include <GL/glu.h>
+# include <GL/glx.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+
+#include <stdlib.h>
+#include <math.h>
+
+#include "yarandom.h"
+#include "rotator.h"
+#include "gltrackball.h"
+
+typedef struct _global_info_t global_info_t;
+typedef struct _flurry_info_t flurry_info_t;
+
+#define sqr(X) ((X) * (X))
+#define PI 3.14159265358979323846f
+#define DEG2RAD(X) (PI*(X)/180.0)
+#define RAD2DEG(X) ((X)*180.0/PI)
+#define rnd() (frand(1.0))
+
+/* fabs: Absolute function. */
+/* #undef abs */
+/* #define abs(a) ( (a) > 0 ? (a) : -(a) ) */
+
+/* Force sign clamping to (-1;0;1) */
+#define sgn(a) ((a)<0?-1:((a)?1:0))
+
+/* used to compute the min and max of two expresions */
+#define MIN_(a, b) (((a) < (b)) ? (a) : (b))
+#define MAX_(a, b) (((a) > (b)) ? (a) : (b))
+
+typedef union {
+ float f[4];
+#if 0
+#if __VEC__
+ vector float v;
+#endif
+#endif /* 0 */
+} floatToVector;
+
+typedef union {
+ unsigned int i[4];
+#if 0
+#if __VEC__
+ vector unsigned int v;
+#endif
+#endif /* 0 */
+} intToVector;
+
+typedef struct SmokeParticleV
+{
+ floatToVector color[4];
+ floatToVector position[3];
+ floatToVector oldposition[3];
+ floatToVector delta[3];
+ intToVector dead;
+ floatToVector time;
+ intToVector animFrame;
+} SmokeParticleV;
+
+#define NUMSMOKEPARTICLES 3600
+
+typedef struct SmokeV
+{
+ SmokeParticleV p[NUMSMOKEPARTICLES/4];
+ int nextParticle;
+ int nextSubParticle;
+ float lastParticleTime;
+ int firstTime;
+ long frame;
+ float old[3];
+ floatToVector seraphimVertices[NUMSMOKEPARTICLES*2+1];
+ floatToVector seraphimColors[NUMSMOKEPARTICLES*4+1];
+ float seraphimTextures[NUMSMOKEPARTICLES*2*4];
+} SmokeV;
+
+void InitSmoke(SmokeV *s);
+
+void UpdateSmoke_ScalarBase(global_info_t *global, flurry_info_t *flurry, SmokeV *s);
+#if 0
+#ifdef __ppc__
+void UpdateSmoke_ScalarFrsqrte(global_info_t *global, flurry_info_t *flurry, SmokeV *s);
+#endif
+#ifdef __VEC__
+void UpdateSmoke_VectorBase(global_info_t *global, flurry_info_t *flurry, SmokeV *s);
+void UpdateSmoke_VectorUnrolled(global_info_t *global, flurry_info_t *flurry, SmokeV *s);
+#endif
+#endif /* 0 */
+
+void DrawSmoke_Scalar(global_info_t *global, flurry_info_t *flurry, SmokeV *s, float);
+void DrawSmoke_Vector(global_info_t *global, flurry_info_t *flurry, SmokeV *s, float);
+
+typedef struct Star
+{
+ float position[3];
+ float mystery;
+ float rotSpeed;
+ int ate;
+} Star;
+
+void UpdateStar(global_info_t *global, flurry_info_t *flurry, Star *s);
+void InitStar(Star *s);
+
+typedef struct Spark
+{
+ float position[3];
+ int mystery;
+ float delta[3];
+ float color[4];
+} Spark;
+
+void UpdateSparkColour(global_info_t *info, flurry_info_t *flurry, Spark *s);
+void InitSpark(Spark *s);
+void UpdateSpark(global_info_t *info, flurry_info_t *flurry, Spark *s);
+void DrawSpark(global_info_t *info, flurry_info_t *flurry, Spark *s);
+
+/* #define FastDistance2D(x,y) hypot(x,y) */
+
+/* UInt8 sys_glBPP=32; */
+/* int SSMODE = FALSE; */
+/* int currentVideoMode = 0; */
+/* int cohesiveness = 7; */
+/* int fieldStrength; */
+/* int colorCoherence = 7; */
+/* int fieldIncoherence = 0; */
+/* int ifieldSpeed = 120; */
+
+static inline float FastDistance2D(float x, float y)
+{
+ /* this function computes the distance from 0,0 to x,y with ~3.5% error */
+ float mn;
+ /* first compute the absolute value of x,y */
+ x = (x < 0.0f) ? -x : x;
+ y = (y < 0.0f) ? -y : y;
+
+ /* compute the minimum of x,y */
+ mn = x<y?x:y;
+
+ /* return the distance */
+ return(x+y-(mn*0.5f)-(mn*0.25f)+(mn*0.0625f));
+}
+
+#if 0
+#ifdef __VEC__
+
+static vector float FastDistance2DV(vector float x, vector float y) {
+ vector float mn, temp;
+
+ x = vec_abs(x);
+ y = vec_abs(y);
+ mn = vec_min(x,y);
+ temp = vec_add(x,y);
+ temp = vec_madd(mn, (vector float)(-0.6875), temp);
+ return temp;
+}
+
+#endif
+#endif /* 0 */
+
+#define RandFlt(min, max) ((min) + frand((max) - (min)))
+
+#define RandBell(scale) ((scale) * (-(frand(.5) + frand(.5) + frand(.5))))
+
+extern GLuint theTexture;
+
+void MakeTexture(void);
+
+#define OPT_MODE_SCALAR_BASE 0x0
+
+#if 0
+#ifdef __ppc__
+#define OPT_MODE_SCALAR_FRSQRTE 0x1
+#endif
+
+#ifdef __VEC__
+#define OPT_MODE_VECTOR_SIMPLE 0x2
+#define OPT_MODE_VECTOR_UNROLLED 0x3
+#endif
+#endif /* 0 */
+
+typedef enum _ColorModes
+{
+ redColorMode = 0,
+ magentaColorMode,
+ blueColorMode,
+ cyanColorMode,
+ greenColorMode,
+ yellowColorMode,
+ slowCyclicColorMode,
+ cyclicColorMode,
+ tiedyeColorMode,
+ rainbowColorMode,
+ whiteColorMode,
+ multiColorMode,
+ darkColorMode
+} ColorModes;
+
+#define gravity 1500000.0f
+
+#define incohesion 0.07f
+#define colorIncoherence 0.15f
+#define streamSpeed 450.0
+#define fieldCoherence 0
+#define fieldSpeed 12.0f
+#define numParticles 250
+#define starSpeed 50
+#define seraphDistance 2000.0f
+#define streamSize 25000.0f
+#define fieldRange 1000.0f
+#define streamBias 7.0f
+
+#define MAX_SPARKS 64
+
+struct _flurry_info_t {
+ flurry_info_t *next;
+ ColorModes currentColorMode;
+ SmokeV *s;
+ Star *star;
+ Spark *spark[MAX_SPARKS];
+ float streamExpansion;
+ int numStreams;
+ double flurryRandomSeed;
+ double fTime;
+ double fOldTime;
+ double fDeltaTime;
+ double briteFactor;
+ float drag;
+ int dframe;
+};
+
+struct _global_info_t {
+ /* system values */
+ GLXContext *glx_context;
+ Window window;
+ int optMode;
+
+ float sys_glWidth;
+ float sys_glHeight;
+
+ double gTimeCounter;
+ int first;
+ double oldFrameTime;
+
+ flurry_info_t *flurry;
+};
+
+#define kNumSpectrumEntries 512
+
+double TimeInSecondsSinceStart(const global_info_t *global);
+
+#endif /* Include/Define */
diff --git a/hacks/glx/flurry.man b/hacks/glx/flurry.man
new file mode 100644
index 0000000..bec54d9
--- /dev/null
+++ b/hacks/glx/flurry.man
@@ -0,0 +1,73 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+flurry - a colorful particle system
+.SH SYNOPSIS
+.B flurry
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-preset <arg>]
+[\-fps]
+.SH DESCRIPTION
+This is a port of the OSX screensaver flurry.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-preset <arg>
+Select a preset (classic, fire, water, psychedelic, rgb, binary, random, insane)
+
+(Insane will never be selected at random, because it requires lots of CPU/GPU
+power)
+
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH AUTHORS
+OSX screensaver by Calum Robinson <calumr@mac.com>
+
+http://homepage.mac.com/calumr
+
+xscreensaver port by Tobias Sargeant <tobias.sargeant@bigpond.com>
+
+.SH POSTCARDS
+
+If you really like it, send me a postcard (after all, you're getting this for
+free!). Please check this address by downloading the latest version of Flurry
+just before you send me a postcard - I may have moved.
+
+.PD 0
+Calum Robinson
+.P
+133 Sydenham Avenue
+.P
+Belfast
+.P
+Northern Ireland
+.P
+BT4 2DQ
+.PD 0
+
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
diff --git a/hacks/glx/flyingtoasters.c b/hacks/glx/flyingtoasters.c
new file mode 100644
index 0000000..19a5897
--- /dev/null
+++ b/hacks/glx/flyingtoasters.c
@@ -0,0 +1,868 @@
+/* flyingtoasters, Copyright (c) 2003-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Draws 3D flying toasters, and toast. Inspired by the ancient
+ * Berkeley Systems / After Dark hack, but now updated to the wide
+ * wonderful workd of OpenGL and 3D!
+ *
+ * Code by jwz; object models by Baconmonkey.
+ *
+ * The original After Dark flying toasters, with the fluffy white wings,
+ * were a trademark of Berkeley Systems. Berkeley Systems ceased to exist
+ * some time in 1998, having been gobbled up by Sierra Online, who were
+ * subsequently gobbled up by Flipside and/or Vivendi (it's hard to tell
+ * exactly what happened when.)
+ *
+ * I doubt anyone even cares any more, but if they do, hopefully this homage,
+ * with the space-age 3D jet-plane toasters, will be considered different
+ * enough that whoever still owns the trademark to the fluffy-winged 2D
+ * bitmapped toasters won't get all huffy at us.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+/* #define DEBUG */
+
+# define free_toasters 0
+# define release_toasters 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define DEF_SPEED "1.0"
+#define DEF_NTOASTERS "20"
+#define DEF_NSLICES "25"
+#define DEF_TEXTURE "True"
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+#include "xlockmore.h"
+#include "gltrackball.h"
+#include "ximage-loader.h"
+#include <ctype.h>
+
+#define HAVE_TEXTURE
+#ifdef HAVE_TEXTURE
+# include "images/gen/chromesphere_png.h"
+# include "images/gen/toast_png.h"
+#endif /* HAVE_TEXTURE */
+
+
+#ifdef USE_GL /* whole file */
+
+#include "gllist.h"
+
+extern const struct gllist
+ *toaster, *toaster_base, *toaster_handle, *toaster_handle2, *toaster_jet,
+ *toaster_knob, *toaster_slots, *toaster_wing, *toast, *toast2;
+
+static const struct gllist * const *all_objs[] = {
+ &toaster, &toaster_base, &toaster_handle, &toaster_handle2, &toaster_jet,
+ &toaster_knob, &toaster_slots, &toaster_wing, &toast, &toast2
+};
+
+#define BASE_TOASTER 0
+#define BASE 1
+#define HANDLE 2
+#define HANDLE_SLOT 3
+#define JET 4
+#define KNOB 5
+#define SLOTS 6
+#define JET_WING 7
+#define TOAST 8
+#define TOAST_BITTEN 9
+
+#define GRID_SIZE 60
+#define GRID_DEPTH 500
+
+
+static const struct { GLfloat x, y; } nice_views[] = {
+ { 0, 120 },
+ { 0, -120 },
+ { 12, 28 }, /* this is a list of viewer rotations that look nice. */
+ { 12, -28 }, /* every now and then we switch to a new one. */
+ {-10, -28 }, /* (but we only use the first two at start-up.) */
+ { 40, -60 },
+ {-40, -60 },
+ { 40, 60 },
+ {-40, 60 },
+ { 30, 0 },
+ {-30, 0 },
+};
+
+
+typedef struct {
+ GLfloat x, y, z;
+ GLfloat dx, dy, dz;
+ Bool toaster_p;
+ int toast_type; /* 0, 1 */
+ GLfloat handle_pos; /* 0.0 - 1.0 */
+ GLfloat knob_pos; /* degrees */
+ int loaded; /* 2 bits */
+} floater;
+
+typedef struct {
+ GLXContext *glx_context;
+ trackball_state *user_trackball;
+ Bool button_down_p;
+
+ int last_view, target_view;
+ GLfloat view_x, view_y;
+ int view_steps, view_tick;
+ Bool auto_tracking_p;
+ int track_tick;
+
+ GLuint *dlists;
+
+# ifdef HAVE_TEXTURE
+ GLuint chrome_texture;
+ GLuint toast_texture;
+# endif
+
+ int nfloaters;
+ floater *floaters;
+
+} toaster_configuration;
+
+static toaster_configuration *bps = NULL;
+
+static GLfloat speed;
+static int ntoasters;
+static int nslices;
+static int do_texture;
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-ntoasters", ".ntoasters", XrmoptionSepArg, 0 },
+ { "-nslices", ".nslices", XrmoptionSepArg, 0 },
+ {"-texture", ".texture", XrmoptionNoArg, "True" },
+ {"+texture", ".texture", XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&ntoasters, "ntoasters", "Count", DEF_NTOASTERS, t_Int},
+ {&nslices, "nslices", "Count", DEF_NSLICES, t_Int},
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt toasters_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+static void
+reset_floater (ModeInfo *mi, floater *f)
+{
+/* toaster_configuration *bp = &bps[MI_SCREEN(mi)]; */
+
+ GLfloat n = GRID_SIZE/2.0;
+ GLfloat n2 = GRID_DEPTH/2.0;
+ GLfloat delta = GRID_SIZE * speed / 200.0;
+
+ f->dx = 0;
+ f->dy = 0;
+ f->dz = delta;
+
+ f->dz += BELLRAND(delta) - delta/3;
+
+ if (! (random() % 5)) {
+ f->dx += (BELLRAND(delta*2) - delta);
+ f->dy += (BELLRAND(delta*2) - delta);
+ }
+
+ if (! (random() % 40)) f->dz *= 10; /* occasional speedy one */
+
+ f->x = frand(n) - n/2;
+ f->y = frand(n) - n/2;
+ f->z = -n2 - frand(delta * 4);
+
+ if (f->toaster_p)
+ {
+ f->loaded = 0;
+ f->knob_pos = frand(180) - 90;
+ f->handle_pos = ((random() & 1) ? 0.0 : 1.0);
+
+ if (f->handle_pos > 0.8 && (! (random() % 5)))
+ f->loaded = (random() & 3); /* let's toast! */
+ }
+ else
+ {
+ if (! (random() % 10))
+ f->toast_type = 1; /* toast_bitten */
+ }
+}
+
+
+static void
+tick_floater (ModeInfo *mi, floater *f)
+{
+ toaster_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ GLfloat n1 = GRID_DEPTH/2.0;
+ GLfloat n2 = GRID_SIZE*4;
+
+ if (bp->button_down_p) return;
+
+ f->x += f->dx;
+ f->y += f->dy;
+ f->z += f->dz;
+
+ if (! (random() % 50000)) /* sudden gust of gravity */
+ f->dy -= 2.8;
+
+ if (f->x < -n2 || f->x > n2 ||
+ f->y < -n2 || f->y > n2 ||
+ f->z > n1)
+ reset_floater (mi, f);
+}
+
+
+static void
+auto_track_init (ModeInfo *mi)
+{
+ toaster_configuration *bp = &bps[MI_SCREEN(mi)];
+ bp->last_view = (random() % 2);
+ bp->target_view = bp->last_view + 2;
+ bp->view_x = nice_views[bp->last_view].x;
+ bp->view_y = nice_views[bp->last_view].y;
+ bp->view_steps = 100;
+ bp->view_tick = 0;
+ bp->auto_tracking_p = True;
+}
+
+
+static void
+auto_track (ModeInfo *mi)
+{
+ toaster_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (bp->button_down_p)
+ return;
+
+ /* if we're not moving, maybe start moving. Otherwise, do nothing. */
+ if (! bp->auto_tracking_p)
+ {
+ if (++bp->track_tick < 200/speed) return;
+ bp->track_tick = 0;
+ if (! (random() % 5))
+ bp->auto_tracking_p = True;
+ else
+ return;
+ }
+
+
+ {
+ GLfloat ox = nice_views[bp->last_view].x;
+ GLfloat oy = nice_views[bp->last_view].y;
+ GLfloat tx = nice_views[bp->target_view].x;
+ GLfloat ty = nice_views[bp->target_view].y;
+
+ /* move from A to B with sinusoidal deltas, so that it doesn't jerk
+ to a stop. */
+ GLfloat th = sin ((M_PI / 2) * (double) bp->view_tick / bp->view_steps);
+
+ bp->view_x = (ox + ((tx - ox) * th));
+ bp->view_y = (oy + ((ty - oy) * th));
+ bp->view_tick++;
+
+ if (bp->view_tick >= bp->view_steps)
+ {
+ bp->view_tick = 0;
+ bp->view_steps = (350.0 / speed);
+ bp->last_view = bp->target_view;
+ bp->target_view = (random() % (countof(nice_views) - 2)) + 2;
+ bp->auto_tracking_p = False;
+ }
+ }
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_toasters (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (40.0, 1/h, 1.0, 250);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 2.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+toasters_handle_event (ModeInfo *mi, XEvent *event)
+{
+ toaster_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->user_trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+#ifdef HAVE_TEXTURE
+
+static void
+load_textures (ModeInfo *mi)
+{
+ toaster_configuration *bp = &bps[MI_SCREEN(mi)];
+ XImage *xi;
+
+ xi = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
+ chromesphere_png, sizeof(chromesphere_png));
+ clear_gl_error();
+
+#ifndef HAVE_JWZGLES /* No SPHERE_MAP yet */
+ glGenTextures (1, &bp->chrome_texture);
+ glBindTexture (GL_TEXTURE_2D, bp->chrome_texture);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ xi->width, xi->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, xi->data);
+ check_gl_error("texture");
+ XDestroyImage (xi);
+ xi = 0;
+#endif
+
+ xi = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
+ toast_png, sizeof(toast_png));
+
+ glGenTextures (1, &bp->toast_texture);
+ glBindTexture (GL_TEXTURE_2D, bp->toast_texture);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ xi->width, xi->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, xi->data);
+ check_gl_error("texture");
+ XDestroyImage (xi);
+ xi = 0;
+}
+
+#endif /* HAVE_TEXTURE */
+
+
+
+ENTRYPOINT void
+init_toasters (ModeInfo *mi)
+{
+ toaster_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_toasters (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {0.4, 0.2, 0.4, 0.0};
+/* GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};*/
+ GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+# ifdef HAVE_TEXTURE
+ if (!wire && do_texture)
+ load_textures (mi);
+# endif
+
+ bp->user_trackball = gltrackball_init (False);
+ auto_track_init (mi);
+
+ bp->dlists = (GLuint *) calloc (countof(all_objs)+1, sizeof(GLuint));
+ for (i = 0; i < countof(all_objs); i++)
+ bp->dlists[i] = glGenLists (1);
+
+ for (i = 0; i < countof(all_objs); i++)
+ {
+ const struct gllist *gll = *all_objs[i];
+
+ glNewList (bp->dlists[i], GL_COMPILE);
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glMatrixMode(GL_TEXTURE);
+ glPushMatrix();
+ glMatrixMode(GL_MODELVIEW);
+
+ glRotatef (-90, 1, 0, 0);
+ glRotatef (180, 0, 0, 1);
+ glScalef (6, 6, 6);
+
+ glBindTexture (GL_TEXTURE_2D, 0);
+ glDisable (GL_TEXTURE_2D);
+
+ if (i == BASE_TOASTER)
+ {
+ GLfloat color[4] = {1.00, 1.00, 1.00, 1.00};
+ GLfloat spec[4] = {1.00, 1.00, 1.00, 1.0};
+ GLfloat shiny = 20.0;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+#ifdef HAVE_TEXTURE
+ if (do_texture)
+ {
+#ifndef HAVE_JWZGLES /* No SPHERE_MAP yet */
+ glEnable (GL_TEXTURE_2D);
+ glEnable (GL_TEXTURE_GEN_S);
+ glEnable (GL_TEXTURE_GEN_T);
+ glBindTexture (GL_TEXTURE_2D, bp->chrome_texture);
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+#endif
+ }
+# endif
+ }
+ else if (i == TOAST || i == TOAST_BITTEN)
+ {
+ GLfloat color[4] = {0.80, 0.80, 0.00, 1.0};
+ GLfloat spec[4] = {0.00, 0.00, 0.00, 1.0};
+ GLfloat shiny = 0.0;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+#ifdef HAVE_TEXTURE
+ if (do_texture)
+ {
+ glEnable (GL_TEXTURE_2D);
+ glEnable (GL_TEXTURE_GEN_S);
+ glEnable (GL_TEXTURE_GEN_T);
+ glBindTexture (GL_TEXTURE_2D, bp->toast_texture);
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ }
+# endif
+
+ glMatrixMode(GL_TEXTURE);
+ glTranslatef(0.5, 0.5, 0);
+ glMatrixMode(GL_MODELVIEW);
+ }
+ else if (i == SLOTS || i == HANDLE_SLOT)
+ {
+ GLfloat color[4] = {0.30, 0.30, 0.40, 1.0};
+ GLfloat spec[4] = {0.40, 0.40, 0.70, 1.0};
+ GLfloat shiny = 128.0;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+ }
+ else if (i == HANDLE)
+ {
+ GLfloat color[4] = {0.80, 0.10, 0.10, 1.0};
+ GLfloat spec[4] = {1.00, 1.00, 1.00, 1.0};
+ GLfloat shiny = 20.0;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+ }
+ else if (i == KNOB)
+ {
+ GLfloat color[4] = {0.80, 0.10, 0.10, 1.0};
+ GLfloat spec[4] = {0.00, 0.00, 0.00, 1.0};
+ GLfloat shiny = 0.0;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+ }
+ else if (i == JET || i == JET_WING)
+ {
+ GLfloat color[4] = {0.70, 0.70, 0.70, 1.0};
+ GLfloat spec[4] = {1.00, 1.00, 1.00, 1.0};
+ GLfloat shiny = 20.0;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+ }
+ else if (i == BASE)
+ {
+ GLfloat color[4] = {0.50, 0.50, 0.50, 1.0};
+ GLfloat spec[4] = {1.00, 1.00, 1.00, 1.0};
+ GLfloat shiny = 20.0;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+ }
+ else
+ {
+ GLfloat color[4] = {1.00, 1.00, 1.00, 1.00};
+ GLfloat spec[4] = {1.00, 1.00, 1.00, 1.0};
+ GLfloat shiny = 128.0;
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+ }
+
+ renderList (gll, wire);
+
+ glMatrixMode(GL_TEXTURE);
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+ glPopMatrix();
+
+ glEndList ();
+ }
+
+ bp->nfloaters = ntoasters + nslices;
+ bp->floaters = (floater *) calloc (bp->nfloaters, sizeof (floater));
+
+ for (i = 0; i < bp->nfloaters; i++)
+ {
+ floater *f = &bp->floaters[i];
+ /* arrange the list so that half the toasters are in front of bread,
+ and half are behind. */
+ f->toaster_p = ((i < ntoasters / 2) ||
+ (i >= (nslices + (ntoasters / 2))));
+ reset_floater (mi, f);
+
+ /* Position the first generation randomly, but make sure they aren't
+ on screen yet (until we rotate the view into position.)
+ */
+ {
+ GLfloat min = -GRID_DEPTH/2;
+ GLfloat max = GRID_DEPTH/3.5;
+ f->z = frand (max - min) + min;
+ }
+ }
+}
+
+
+static void
+draw_origin (ModeInfo *mi)
+{
+# ifdef DEBUG
+/* toaster_configuration *bp = &bps[MI_SCREEN(mi)];*/
+
+ if (!MI_IS_WIREFRAME(mi)) glDisable(GL_LIGHTING);
+ if (!MI_IS_WIREFRAME(mi) && do_texture) glDisable(GL_TEXTURE_2D);
+
+ glPushMatrix();
+ glScalef (5, 5, 5);
+ glBegin(GL_LINES);
+ glVertex3f(-1, 0, 0); glVertex3f(1, 0, 0);
+ glVertex3f(0, -1, 0); glVertex3f(0, 1, 0);
+ glVertex3f(0, 0, -1); glVertex3f(0, 0, 1);
+ glEnd();
+ glPopMatrix();
+
+ if (!MI_IS_WIREFRAME(mi)) glEnable(GL_LIGHTING);
+ if (!MI_IS_WIREFRAME(mi) && do_texture) glEnable(GL_TEXTURE_2D);
+# endif /* DEBUG */
+}
+
+
+static void
+draw_grid (ModeInfo *mi)
+{
+# ifdef DEBUG
+/* toaster_configuration *bp = &bps[MI_SCREEN(mi)];*/
+
+ if (!MI_IS_WIREFRAME(mi)) glDisable(GL_LIGHTING);
+ if (!MI_IS_WIREFRAME(mi) && do_texture) glDisable(GL_TEXTURE_2D);
+ glPushMatrix();
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, 0);
+ glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, 0);
+ glVertex3f( GRID_SIZE/2, GRID_SIZE/2, 0);
+ glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, 0);
+ glEnd();
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
+ glEnd();
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
+ glEnd();
+ glBegin(GL_LINES);
+ glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
+ glEnd();
+ glPopMatrix();
+
+ if (!MI_IS_WIREFRAME(mi)) glEnable(GL_LIGHTING);
+ if (!MI_IS_WIREFRAME(mi) && do_texture) glEnable(GL_TEXTURE_2D);
+# endif /* DEBUG */
+}
+
+
+static void
+draw_floater (ModeInfo *mi, floater *f)
+{
+ toaster_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat n;
+
+ glFrontFace(GL_CCW);
+
+ glPushMatrix();
+ glTranslatef (f->x, f->y, f->z);
+ if (f->toaster_p)
+ {
+ glPushMatrix();
+ glRotatef (180, 0, 1, 0);
+
+ glCallList (bp->dlists[BASE_TOASTER]);
+ mi->polygon_count += (*all_objs[BASE_TOASTER])->points / 3;
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslatef(0, 1.01, 0);
+ n = 0.91; glScalef(n,n,n);
+ glCallList (bp->dlists[SLOTS]);
+ mi->polygon_count += (*all_objs[SLOTS])->points / 3;
+ glPopMatrix();
+
+ glPushMatrix();
+ glRotatef (180, 0, 1, 0);
+ glTranslatef(0, -0.4, -2.38);
+ n = 0.33; glScalef(n,n,n);
+ glCallList (bp->dlists[HANDLE_SLOT]);
+ mi->polygon_count += (*all_objs[HANDLE_SLOT])->points / 3;
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslatef(0, -1.1, 3);
+ n = 0.3; glScalef (n,n,n);
+ glTranslatef(0, f->handle_pos * 4.8, 0);
+ glCallList (bp->dlists[HANDLE]);
+ mi->polygon_count += (*all_objs[HANDLE])->points / 3;
+ glPopMatrix();
+
+ glPushMatrix();
+ glRotatef (180, 0, 1, 0);
+ glTranslatef(0, -1.1, -3); /* where the handle is */
+ glTranslatef (1, -0.4, 0); /* down and to the left */
+ n = 0.08; glScalef (n,n,n);
+ glRotatef (f->knob_pos, 0, 0, 1);
+ glCallList (bp->dlists[KNOB]);
+ mi->polygon_count += (*all_objs[KNOB])->points / 3;
+ glPopMatrix();
+
+ glPushMatrix();
+ glRotatef (180, 0, 1, 0);
+ glTranslatef (0, -2.3, 0);
+ glCallList (bp->dlists[BASE]);
+ mi->polygon_count += (*all_objs[BASE])->points / 3;
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslatef(-4.8, 0, 0);
+ glCallList (bp->dlists[JET_WING]);
+ mi->polygon_count += (*all_objs[JET_WING])->points / 3;
+ glScalef (0.5, 0.5, 0.5);
+ glTranslatef (-2, -1, 0);
+ glCallList (bp->dlists[JET]);
+ mi->polygon_count += (*all_objs[JET])->points / 3;
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslatef(4.8, 0, 0);
+ glScalef(-1, 1, 1);
+ glFrontFace(GL_CW);
+ glCallList (bp->dlists[JET_WING]);
+ mi->polygon_count += (*all_objs[JET_WING])->points / 3;
+ glScalef (0.5, 0.5, 0.5);
+ glTranslatef (-2, -1, 0);
+ glCallList (bp->dlists[JET]);
+ mi->polygon_count += (*all_objs[JET])->points / 3;
+ glFrontFace(GL_CCW);
+ glPopMatrix();
+
+ if (f->loaded)
+ {
+ glPushMatrix();
+ glTranslatef(0, 1.01, 0);
+ n = 0.91; glScalef(n,n,n);
+ glRotatef (90, 0, 0, 1);
+ glRotatef (90, 0, 1, 0);
+ glTranslatef(0, 0, -0.95);
+ glTranslatef(0, 0.72, 0);
+ if (f->loaded & 1)
+ {
+ glCallList (bp->dlists[TOAST]);
+ mi->polygon_count += (*all_objs[TOAST])->points / 3;
+ }
+ glTranslatef(0, -1.46, 0);
+ if (f->loaded & 2)
+ {
+ glCallList (bp->dlists[TOAST]);
+ mi->polygon_count += (*all_objs[TOAST])->points / 3;
+ }
+ glPopMatrix();
+ }
+ }
+ else
+ {
+ glScalef (0.7, 0.7, 0.7);
+ if (f->toast_type == 0)
+ {
+ glCallList (bp->dlists[TOAST]);
+ mi->polygon_count += (*all_objs[TOAST])->points / 3;
+ }
+ else
+ {
+ glCallList (bp->dlists[TOAST_BITTEN]);
+ mi->polygon_count += (*all_objs[TOAST_BITTEN])->points / 3;
+ }
+ }
+
+ glPopMatrix();
+}
+
+
+
+ENTRYPOINT void
+draw_toasters (ModeInfo *mi)
+{
+ toaster_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+ glRotatef(bp->view_x, 1, 0, 0);
+ glRotatef(bp->view_y, 0, 1, 0);
+
+ /* Rotate the scene around a point that's a little deeper in. */
+ glTranslatef (0, 0, -50);
+ gltrackball_rotate (bp->user_trackball);
+ glTranslatef (0, 0, 50);
+
+#if 0
+ {
+ floater F;
+ F.toaster_p = 0;
+ F.toast_type = 1;
+ F.handle_pos = 0;
+ F.knob_pos = -90;
+ F.loaded = 3;
+ F.x = F.y = F.z = 0;
+ F.dx = F.dy = F.dz = 0;
+
+ glScalef(2,2,2);
+ if (!MI_IS_WIREFRAME(mi)) glDisable(GL_LIGHTING);
+ if (!MI_IS_WIREFRAME(mi) && do_texture) glDisable(GL_TEXTURE_2D);
+ glBegin(GL_LINES);
+ glVertex3f(-10, 0, 0); glVertex3f(10, 0, 0);
+ glVertex3f(0, -10, 0); glVertex3f(0, 10, 0);
+ glVertex3f(0, 0, -10); glVertex3f(0, 0, 10);
+ glEnd();
+ if (!MI_IS_WIREFRAME(mi)) glEnable(GL_LIGHTING);
+ if (!MI_IS_WIREFRAME(mi) && do_texture) glEnable(GL_TEXTURE_2D);
+
+ draw_floater (mi, &F);
+ glPopMatrix ();
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers(dpy, window);
+ return;
+ }
+#endif
+
+ glScalef (0.5, 0.5, 0.5);
+ draw_origin (mi);
+ glTranslatef (0, 0, -GRID_DEPTH/2.5);
+ draw_grid (mi);
+
+ mi->polygon_count = 0;
+ for (i = 0; i < bp->nfloaters; i++)
+ {
+ floater *f = &bp->floaters[i];
+ draw_floater (mi, f);
+ tick_floater (mi, f);
+ }
+ auto_track (mi);
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("FlyingToasters", flyingtoasters, toasters)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/flyingtoasters.man b/hacks/glx/flyingtoasters.man
new file mode 100644
index 0000000..dbe5d5a
--- /dev/null
+++ b/hacks/glx/flyingtoasters.man
@@ -0,0 +1,86 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+flyingtoasters - 3d space-age jet-powered flying toasters (and toast)
+.SH SYNOPSIS
+.B flyingtoasters
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-ntoasters \fInumber\fP]
+[\-nslices \fInumber\fP]
+[\-no-texture]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Draws a squadron of shiny 3D space-age jet-powered flying toasters, and
+associated toast, flying across your screen.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+How fast the toasters fly. Larger for faster. Default: 1.0.
+.TP 8
+.B \-ntoasters \fInumber\fP
+How many toasters to draw. Default 20.
+.TP 8
+.B \-nslices \fInumber\fP
+How many slices of toast to draw. Default 25.
+.TP 8
+.B \-no-texture
+Turn off texture mapping (for slow machines.)
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR After Dark
+.SH COPYRIGHT
+Copyright \(co 2003 by Jamie Zawinski. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+
+The original After Dark flying toasters, with the fluffy white wings,
+were a trademark of Berkeley Systems. Berkeley Systems ceased to exist
+some time in 1998, having been gobbled up by Sierra Online, who were
+subsequently gobbled up by Flipside and/or Vivendi (it's hard to tell
+exactly what happened when.)
+
+I doubt anyone even cares any more, but if they do, hopefully this
+homage, with the space-age 3D jet-plane toasters, will be considered
+different enough that whoever still owns the trademark to the
+fluffy-winged 2D bitmapped toasters won't get all huffy at us.
+.SH AUTHOR
+Code by Jamie Zawinski. Object models by Baconmonkey.
diff --git a/hacks/glx/fps-gl.c b/hacks/glx/fps-gl.c
new file mode 100644
index 0000000..eb6b6de
--- /dev/null
+++ b/hacks/glx/fps-gl.c
@@ -0,0 +1,98 @@
+/* fps, Copyright (c) 2001-2015 Jamie Zawinski <jwz@jwz.org>
+ * Draw a frames-per-second display (Xlib and OpenGL).
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#ifdef HAVE_COCOA
+# include "jwxyz.h"
+#elif defined(HAVE_ANDROID)
+# include <GLES/gl.h>
+#else /* real Xlib */
+# include <GL/glx.h>
+# include <GL/glu.h>
+#endif /* !HAVE_COCOA */
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#include "xlockmoreI.h"
+#include "fpsI.h"
+#include "texfont.h"
+
+/* These are in xlock-gl.c */
+extern void clear_gl_error (void);
+extern void check_gl_error (const char *type);
+
+typedef struct {
+ texture_font_data *texfont;
+ int line_height;
+ Bool top_p;
+} gl_fps_data;
+
+
+static void
+xlockmore_gl_fps_init (fps_state *st)
+{
+ gl_fps_data *data = (gl_fps_data *) calloc (1, sizeof(*data));
+ int ascent, descent;
+ data->top_p = get_boolean_resource (st->dpy, "fpsTop", "FPSTop");
+ data->texfont = load_texture_font (st->dpy, "fpsFont");
+ texture_string_metrics (data->texfont, "M", 0, &ascent, &descent);
+ data->line_height = ascent + descent;
+ st->gl_fps_data = data;
+}
+
+
+/* Callback in xscreensaver_function_table, via xlockmore.c.
+ */
+void
+xlockmore_gl_compute_fps (Display *dpy, Window w, fps_state *fpst,
+ void *closure)
+{
+ ModeInfo *mi = (ModeInfo *) closure;
+ if (! mi->fpst)
+ {
+ mi->fpst = fpst;
+ xlockmore_gl_fps_init (fpst);
+ }
+
+ fps_compute (fpst, mi->polygon_count, mi->recursion_depth);
+}
+
+
+/* Called directly from GL programs (as `do_fps') before swapping buffers.
+ */
+void
+xlockmore_gl_draw_fps (ModeInfo *mi)
+{
+ fps_state *st = mi->fpst;
+ if (st) /* might be too early */
+ {
+ gl_fps_data *data = (gl_fps_data *) st->gl_fps_data;
+ XWindowAttributes xgwa;
+ int lines = 1;
+ const char *s;
+
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ for (s = st->string; *s; s++)
+ if (*s == '\n') lines++;
+
+ glColor3f (1, 1, 1);
+ print_texture_label (st->dpy, data->texfont,
+ xgwa.width, xgwa.height,
+ (data->top_p ? 1 : 2),
+ st->string);
+ }
+}
diff --git a/hacks/glx/gears.c b/hacks/glx/gears.c
new file mode 100644
index 0000000..3976f2f
--- /dev/null
+++ b/hacks/glx/gears.c
@@ -0,0 +1,938 @@
+/* gears, Copyright (c) 2007-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Originally written by Brian Paul in 1996 or earlier;
+ * rewritten by jwz in Nov 2007.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 0 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_gears 0
+# define release_gears 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "involute.h"
+#include "normals.h"
+#include "tube.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+ Bool planetary_p;
+
+ int ngears;
+ gear **gears;
+
+ GLuint armature_dlist;
+ int armature_polygons;
+
+ struct { GLfloat x1, y1, x2, y2; } bbox;
+
+} gears_configuration;
+
+static gears_configuration *bps = NULL;
+
+static Bool do_spin;
+static GLfloat speed;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt gears_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_gears (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+static void
+free_gear (gear *g)
+{
+ if (g->dlist)
+ glDeleteLists (g->dlist, 1);
+ free (g);
+}
+
+
+/* Create and return a new gear sized for placement next to or on top of
+ the given parent gear (if any.) Returns 0 if out of memory.
+ [Mostly lifted from pinion.c]
+ */
+static gear *
+new_gear (ModeInfo *mi, gear *parent)
+{
+ gears_configuration *bp = &bps[MI_SCREEN(mi)];
+ gear *g = (gear *) calloc (1, sizeof (*g));
+ static unsigned long id = 0; /* only used in debugging output */
+
+ if (!g) return 0;
+ g->id = ++id;
+
+ /* Pick the size of the teeth.
+ */
+ if (parent) /* adjascent gears need matching teeth */
+ {
+ g->tooth_w = parent->tooth_w;
+ g->tooth_h = parent->tooth_h;
+ g->tooth_slope = -parent->tooth_slope;
+ }
+ else /* gears that begin trains get any size they want */
+ {
+ g->tooth_w = 0.007 * (1.0 + BELLRAND(4.0));
+ g->tooth_h = 0.005 * (1.0 + BELLRAND(8.0));
+/*
+ g->tooth_slope = ((random() % 8)
+ ? 0
+ : 0.5 + BELLRAND(1));
+ */
+ }
+
+ /* Pick the number of teeth, and thus, the radius.
+ */
+ {
+ double c;
+
+ if (!parent || bp->ngears > 4)
+ g->nteeth = 5 + BELLRAND (20);
+ else
+ g->nteeth = parent->nteeth * (0.5 + BELLRAND(2));
+
+ c = g->nteeth * g->tooth_w * 2; /* circumference = teeth + gaps */
+ g->r = c / (M_PI * 2); /* c = 2 pi r */
+ }
+
+ g->thickness = g->tooth_w + frand (g->r);
+ g->thickness2 = g->thickness * 0.7;
+ g->thickness3 = g->thickness;
+
+ /* Colorize
+ */
+ g->color[0] = 0.5 + frand(0.5);
+ g->color[1] = 0.5 + frand(0.5);
+ g->color[2] = 0.5 + frand(0.5);
+ g->color[3] = 1.0;
+
+ g->color2[0] = g->color[0] * 0.85;
+ g->color2[1] = g->color[1] * 0.85;
+ g->color2[2] = g->color[2] * 0.85;
+ g->color2[3] = g->color[3];
+
+
+ /* Decide on shape of gear interior:
+ - just a ring with teeth;
+ - that, plus a thinner in-set "plate" in the middle;
+ - that, plus a thin raised "lip" on the inner plate;
+ - or, a wide lip (really, a thicker third inner plate.)
+ */
+ if ((random() % 10) == 0)
+ {
+ /* inner_r can go all the way in; there's no inset disc. */
+ g->inner_r = (g->r * 0.1) + frand((g->r - g->tooth_h/2) * 0.8);
+ g->inner_r2 = 0;
+ g->inner_r3 = 0;
+ }
+ else
+ {
+ /* inner_r doesn't go in very far; inner_r2 is an inset disc. */
+ g->inner_r = (g->r * 0.5) + frand((g->r - g->tooth_h) * 0.4);
+ g->inner_r2 = (g->r * 0.1) + frand(g->inner_r * 0.5);
+ g->inner_r3 = 0;
+
+ if (g->inner_r2 > (g->r * 0.2))
+ {
+ int nn = (random() % 10);
+ if (nn <= 2)
+ g->inner_r3 = (g->r * 0.1) + frand(g->inner_r2 * 0.2);
+ else if (nn <= 7 && g->inner_r2 >= 0.1)
+ g->inner_r3 = g->inner_r2 - 0.01;
+ }
+ }
+
+ /* If we have three discs, sometimes make the middle disc be spokes.
+ */
+ if (g->inner_r3 && ((random() % 5) == 0))
+ {
+ g->spokes = 2 + BELLRAND (5);
+ g->spoke_thickness = 1 + frand(7.0);
+ if (g->spokes == 2 && g->spoke_thickness < 2)
+ g->spoke_thickness += 1;
+ }
+
+ /* Sometimes add little nubbly bits, if there is room.
+ */
+ if (g->nteeth > 5)
+ {
+ double size = 0;
+ involute_biggest_ring (g, 0, &size, 0);
+ if (size > g->r * 0.2 && (random() % 5) == 0)
+ {
+ g->nubs = 1 + (random() % 16);
+ if (g->nubs > 8) g->nubs = 1;
+ }
+ }
+
+ if (g->inner_r3 > g->inner_r2) abort();
+ if (g->inner_r2 > g->inner_r) abort();
+ if (g->inner_r > g->r) abort();
+
+ /* Decide how complex the polygon model should be.
+ */
+ {
+ double pix = g->tooth_h * MI_HEIGHT(mi); /* approx. tooth size in pixels */
+ if (pix <= 2.5) g->size = INVOLUTE_SMALL;
+ else if (pix <= 3.5) g->size = INVOLUTE_MEDIUM;
+ else if (pix <= 25) g->size = INVOLUTE_LARGE;
+ else g->size = INVOLUTE_HUGE;
+ }
+
+ g->base_p = !parent;
+
+ return g;
+}
+
+
+/* Given a newly-created gear, place it next to its parent in the scene,
+ with its teeth meshed and the proper velocity. Returns False if it
+ didn't work. (Call this a bunch of times until either it works, or
+ you decide it's probably not going to.)
+ [Mostly lifted from pinion.c]
+ */
+static Bool
+place_gear (ModeInfo *mi, gear *g, gear *parent)
+{
+ gears_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ /* Compute this gear's velocity.
+ */
+ if (! parent)
+ {
+ g->ratio = 0.8 + BELLRAND(0.4); /* 0.8-1.2 = 8-12rpm @ 60fps */
+ g->th = 1; /* not 0 */
+ }
+ else
+ {
+ /* Gearing ratio is the ratio of the number of teeth to previous gear
+ (which is also the ratio of the circumferences.)
+ */
+ g->ratio = (double) parent->nteeth / (double) g->nteeth;
+
+ /* Set our initial rotation to match that of the previous gear,
+ multiplied by the gearing ratio. (This is finessed later,
+ once we know the exact position of the gear relative to its
+ parent.)
+ */
+ g->th = -(parent->th * g->ratio);
+
+ if (g->nteeth & 1) /* rotate 1/2 tooth-size if odd number of teeth */
+ {
+ double off = (180.0 / g->nteeth);
+ if (g->th > 0)
+ g->th += off;
+ else
+ g->th -= off;
+ }
+
+ /* ratios are cumulative for all gears in the train. */
+ g->ratio *= parent->ratio;
+ }
+
+
+ if (parent) /* Place the gear next to the parent. */
+ {
+ double r_off = parent->r + g->r;
+ int angle;
+
+ angle = (random() % 360) - 180; /* -180 to +180 degrees */
+
+ g->x = parent->x + (cos ((double) angle * (M_PI / 180)) * r_off);
+ g->y = parent->y + (sin ((double) angle * (M_PI / 180)) * r_off);
+ g->z = parent->z;
+
+ /* avoid accidentally changing sign of "th" in the math below. */
+ g->th += (g->th > 0 ? 360 : -360);
+
+ /* Adjust the rotation of the gear so that its teeth line up with its
+ parent, based on the position of the gear and the current rotation
+ of the parent.
+ */
+ {
+ double p_c = 2 * M_PI * parent->r; /* circumference of parent */
+ double g_c = 2 * M_PI * g->r; /* circumference of g */
+
+ double p_t = p_c * (angle/360.0); /* distance travelled along
+ circumference of parent when
+ moving "angle" degrees along
+ parent. */
+ double g_rat = p_t / g_c; /* if travelling that distance
+ along circumference of g,
+ ratio of g's circumference
+ travelled. */
+ double g_th = 360.0 * g_rat; /* that ratio in degrees */
+
+ g->th += angle + g_th;
+ }
+ }
+
+ /* If the position we picked for this gear causes it to overlap
+ with any earlier gear in the train, give up.
+ */
+ {
+ int i;
+
+ for (i = bp->ngears-1; i >= 0; i--)
+ {
+ gear *og = bp->gears[i];
+
+ if (og == g) continue;
+ if (og == parent) continue;
+ if (g->z != og->z) continue; /* Ignore unless on same layer */
+
+ /* Collision detection without sqrt:
+ d = sqrt(a^2 + b^2) d^2 = a^2 + b^2
+ d < r1 + r2 d^2 < (r1 + r2)^2
+ */
+ if (((g->x - og->x) * (g->x - og->x) +
+ (g->y - og->y) * (g->y - og->y)) <
+ ((g->r + g->tooth_h + og->r + og->tooth_h) *
+ (g->r + g->tooth_h + og->r + og->tooth_h)))
+ return False;
+ }
+ }
+
+ return True;
+}
+
+
+/* Make a new gear, place it next to its parent in the scene,
+ with its teeth meshed and the proper velocity. Returns the gear;
+ or 0 if it didn't work. (Call this a bunch of times until either
+ it works, or you decide it's probably not going to.)
+ [Mostly lifted from pinion.c]
+ */
+static gear *
+place_new_gear (ModeInfo *mi, gear *parent)
+{
+ gears_configuration *bp = &bps[MI_SCREEN(mi)];
+ int loop_count = 0;
+ gear *g = 0;
+
+ while (1)
+ {
+ loop_count++;
+ if (loop_count >= 100)
+ {
+ if (g)
+ free_gear (g);
+ g = 0;
+ break;
+ }
+
+ g = new_gear (mi, parent);
+ if (!g) return 0; /* out of memory? */
+
+ if (place_gear (mi, g, parent))
+ break;
+ }
+
+ if (! g) return 0;
+
+ /* We got a gear, and it is properly positioned.
+ Insert it in the scene.
+ */
+ bp->gears[bp->ngears++] = g;
+ return g;
+}
+
+
+static int
+arm (GLfloat length,
+ GLfloat width1, GLfloat height1,
+ GLfloat width2, GLfloat height2,
+ Bool wire)
+{
+ int polys = 0;
+ glShadeModel(GL_FLAT);
+
+#if 0 /* don't need these - they're embedded in other objects */
+ /* draw end 1 */
+ glFrontFace(GL_CW);
+ glNormal3f(-1, 0, 0);
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f(-length/2, -width1/2, -height1/2);
+ glVertex3f(-length/2, width1/2, -height1/2);
+ glVertex3f(-length/2, width1/2, height1/2);
+ glVertex3f(-length/2, -width1/2, height1/2);
+ polys++;
+ glEnd();
+
+ /* draw end 2 */
+ glFrontFace(GL_CCW);
+ glNormal3f(1, 0, 0);
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f(length/2, -width2/2, -height2/2);
+ glVertex3f(length/2, width2/2, -height2/2);
+ glVertex3f(length/2, width2/2, height2/2);
+ glVertex3f(length/2, -width2/2, height2/2);
+ polys++;
+ glEnd();
+#endif
+
+ /* draw top */
+ glFrontFace(GL_CCW);
+ glNormal3f(0, 0, -1);
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f(-length/2, -width1/2, -height1/2);
+ glVertex3f(-length/2, width1/2, -height1/2);
+ glVertex3f( length/2, width2/2, -height2/2);
+ glVertex3f( length/2, -width2/2, -height2/2);
+ polys++;
+ glEnd();
+
+ /* draw bottom */
+ glFrontFace(GL_CW);
+ glNormal3f(0, 0, 1);
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f(-length/2, -width1/2, height1/2);
+ glVertex3f(-length/2, width1/2, height1/2);
+ glVertex3f( length/2, width2/2, height2/2);
+ glVertex3f( length/2, -width2/2, height2/2);
+ polys++;
+ glEnd();
+
+ /* draw left */
+ glFrontFace(GL_CW);
+ glNormal3f(0, -1, 0);
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f(-length/2, -width1/2, -height1/2);
+ glVertex3f(-length/2, -width1/2, height1/2);
+ glVertex3f( length/2, -width2/2, height2/2);
+ glVertex3f( length/2, -width2/2, -height2/2);
+ polys++;
+ glEnd();
+
+ /* draw right */
+ glFrontFace(GL_CCW);
+ glNormal3f(0, 1, 0);
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f(-length/2, width1/2, -height1/2);
+ glVertex3f(-length/2, width1/2, height1/2);
+ glVertex3f( length/2, width2/2, height2/2);
+ glVertex3f( length/2, width2/2, -height2/2);
+ polys++;
+ glEnd();
+
+ glFrontFace(GL_CCW);
+
+ return polys;
+}
+
+
+static int
+ctube (GLfloat diameter, GLfloat width, Bool wire)
+{
+ tube (0, 0, width/2,
+ 0, 0, -width/2,
+ diameter, 0,
+ 32, True, True, wire);
+ return 0; /* #### */
+}
+
+static void
+armature (ModeInfo *mi)
+{
+ gears_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+
+ static const GLfloat spec[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat shiny = 128.0;
+ GLfloat color[4];
+
+ color[0] = 0.5 + frand(0.5);
+ color[1] = 0.5 + frand(0.5);
+ color[2] = 0.5 + frand(0.5);
+ color[3] = 1.0;
+
+ bp->armature_polygons = 0;
+
+ bp->armature_dlist = glGenLists (1);
+ if (! bp->armature_dlist)
+ {
+ check_gl_error ("glGenLists");
+ abort();
+ }
+
+ glNewList (bp->armature_dlist, GL_COMPILE);
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, spec);
+ glMateriali (GL_FRONT, GL_SHININESS, shiny);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+ glColor3f (color[0], color[1], color[2]);
+
+ glPushMatrix();
+
+ {
+ GLfloat s = bp->gears[0]->r * 2.7;
+ s = s/5.6;
+ glScalef (s, s, s);
+ }
+
+ glTranslatef (0, 0, 1.4 + bp->gears[0]->thickness);
+ glRotatef (30, 0, 0, 1);
+
+ bp->armature_polygons += ctube (0.5, 10, wire); /* center axle */
+
+ glPushMatrix();
+ glTranslatef(0.0, 4.2, -1);
+ bp->armature_polygons += ctube (0.5, 3, wire); /* axle 1 */
+ glTranslatef(0, 0, 1.8);
+ bp->armature_polygons += ctube (0.7, 0.7, wire);
+ glPopMatrix();
+
+ glPushMatrix();
+ glRotatef(120, 0.0, 0.0, 1.0);
+ glTranslatef(0.0, 4.2, -1);
+ bp->armature_polygons += ctube (0.5, 3, wire); /* axle 2 */
+ glTranslatef(0, 0, 1.8);
+ bp->armature_polygons += ctube (0.7, 0.7, wire);
+ glPopMatrix();
+
+ glPushMatrix();
+ glRotatef(240, 0.0, 0.0, 1.0);
+ glTranslatef(0.0, 4.2, -1);
+ bp->armature_polygons += ctube (0.5, 3, wire); /* axle 3 */
+ glTranslatef(0, 0, 1.8);
+ bp->armature_polygons += ctube (0.7, 0.7, wire);
+ glPopMatrix();
+
+ glTranslatef(0, 0, 1.5); /* center disk */
+ bp->armature_polygons += ctube (1.5, 2, wire);
+
+ glPushMatrix();
+ glRotatef(270, 0, 0, 1);
+ glRotatef(-10, 0, 1, 0);
+ glTranslatef(-2.2, 0, 0);
+ bp->armature_polygons += arm (4.0, 1.0, 0.5,
+ 2.0, 1.0, wire); /* arm 1 */
+ glPopMatrix();
+
+ glPushMatrix();
+ glRotatef(30, 0, 0, 1);
+ glRotatef(-10, 0, 1, 0);
+ glTranslatef(-2.2, 0, 0);
+ bp->armature_polygons += arm (4.0, 1.0, 0.5,
+ 2.0, 1.0, wire); /* arm 2 */
+ glPopMatrix();
+
+ glPushMatrix();
+ glRotatef(150, 0, 0, 1);
+ glRotatef(-10, 0, 1, 0);
+ glTranslatef(-2.2, 0, 0);
+ bp->armature_polygons += arm (4.0, 1.0, 0.5,
+ 2.0, 1.0, wire); /* arm 3 */
+ glPopMatrix();
+
+ glPopMatrix();
+
+ glEndList ();
+}
+
+
+static void
+planetary_gears (ModeInfo *mi)
+{
+ gears_configuration *bp = &bps[MI_SCREEN(mi)];
+ gear *g0, *g1, *g2, *g3, *g4;
+ GLfloat distance = 2.02;
+
+ bp->planetary_p = True;
+
+ g0 = new_gear (mi, 0);
+ g1 = new_gear (mi, 0);
+ g2 = new_gear (mi, 0);
+ g3 = new_gear (mi, 0);
+ g4 = new_gear (mi, 0);
+
+ if (! place_gear (mi, g0, 0)) abort();
+ if (! place_gear (mi, g1, 0)) abort();
+ if (! place_gear (mi, g2, 0)) abort();
+ if (! place_gear (mi, g3, 0)) abort();
+ if (! place_gear (mi, g4, 0)) abort();
+
+ g0->nteeth = 12 + (3 * (random() % 10)); /* must be multiple of 3 */
+ g0->tooth_w = g0->r / g0->nteeth;
+ g0->tooth_h = g0->tooth_w * 2.8;
+
+# define COPY(F) g4->F = g3->F = g2->F = g1->F = g0->F
+ COPY(r);
+ COPY(th);
+ COPY(nteeth);
+ COPY(tooth_w);
+ COPY(tooth_h);
+ COPY(tooth_slope);
+ COPY(inner_r);
+ COPY(inner_r2);
+ COPY(inner_r3);
+ COPY(thickness);
+ COPY(thickness2);
+ COPY(thickness3);
+ COPY(ratio);
+ COPY(size);
+# undef COPY
+
+ g1->x = cos (M_PI * 2 / 3) * g1->r * distance;
+ g1->y = sin (M_PI * 2 / 3) * g1->r * distance;
+
+ g2->x = cos (M_PI * 4 / 3) * g2->r * distance;
+ g2->y = sin (M_PI * 4 / 3) * g2->r * distance;
+
+ g3->x = cos (M_PI * 6 / 3) * g3->r * distance;
+ g3->y = sin (M_PI * 6 / 3) * g3->r * distance;
+
+ g4->x = 0;
+ g4->y = 0;
+ g4->th = -g3->th;
+
+ /* rotate central gear 1/2 tooth-size if odd number of teeth */
+ if (g4->nteeth & 1)
+ g4->th -= (180.0 / g4->nteeth);
+
+ g0->inverted_p = True;
+ g0->x = 0;
+ g0->y = 0;
+ g0->nteeth = g1->nteeth * 3;
+ g0->r = g1->r * 3.05;
+ g0->inner_r = g0->r * 0.8;
+ g0->inner_r2 = 0;
+ g0->inner_r3 = 0;
+ g0->th = g1->th + (180 / g0->nteeth);
+ g0->ratio = g1->ratio / 3;
+
+ g0->tooth_slope = 0;
+ g0->nubs = 3;
+ g0->spokes = 0;
+ g0->size = INVOLUTE_LARGE;
+
+ bp->gears = (gear **) calloc (6, sizeof(**bp->gears));
+ bp->ngears = 0;
+
+ bp->gears[bp->ngears++] = g1;
+ bp->gears[bp->ngears++] = g2;
+ bp->gears[bp->ngears++] = g3;
+ bp->gears[bp->ngears++] = g4;
+ bp->gears[bp->ngears++] = g0;
+}
+
+
+
+
+ENTRYPOINT void
+init_gears (ModeInfo *mi)
+{
+ gears_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_gears (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ if (! bp->rot)
+ {
+ double spin_speed = 0.5;
+ double wander_speed = 0.01;
+ double spin_accel = 0.25;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ True
+ );
+ bp->trackball = gltrackball_init (True);
+ }
+
+ if (bp->gears)
+ {
+ for (i = 0; i < bp->ngears; i++)
+ free_gear (bp->gears[i]);
+ free (bp->gears);
+ bp->gears = 0;
+ bp->ngears = 0;
+ }
+
+ if (!(random() % 8))
+ {
+ planetary_gears (mi);
+ }
+ else
+ {
+ gear *g = 0;
+ int total_gears = MI_COUNT (mi);
+
+ bp->planetary_p = False;
+
+ if (total_gears <= 0)
+ total_gears = 3 + fabs (BELLRAND (8) - 4); /* 3 - 7, mostly 3. */
+ bp->gears = (gear **) calloc (total_gears+2, sizeof(**bp->gears));
+ bp->ngears = 0;
+
+ for (i = 0; i < total_gears; i++)
+ g = place_new_gear (mi, g);
+ }
+
+
+ /* Center gears in scene. */
+ {
+ GLfloat minx=99999, miny=99999, maxx=-99999, maxy=-99999;
+ int i;
+ for (i = 0; i < bp->ngears; i++)
+ {
+ gear *g = bp->gears[i];
+ if (g->x - g->r < minx) minx = g->x - g->r;
+ if (g->x + g->r > maxx) maxx = g->x + g->r;
+ if (g->y - g->r < miny) miny = g->y - g->r;
+ if (g->y + g->r > maxy) maxy = g->y + g->r;
+ }
+ bp->bbox.x1 = minx;
+ bp->bbox.y1 = miny;
+ bp->bbox.x2 = maxx;
+ bp->bbox.y2 = maxy;
+ }
+
+ /* Now render each gear into its display list.
+ */
+ for (i = 0; i < bp->ngears; i++)
+ {
+ gear *g = bp->gears[i];
+ g->dlist = glGenLists (1);
+ if (! g->dlist)
+ {
+ check_gl_error ("glGenLists");
+ abort();
+ }
+
+ glNewList (g->dlist, GL_COMPILE);
+ g->polygons += draw_involute_gear (g, wire);
+ glEndList ();
+ }
+ if (bp->planetary_p)
+ armature (mi);
+}
+
+
+ENTRYPOINT void
+draw_gears (ModeInfo *mi)
+{
+ gears_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef ((x - 0.5) * 4,
+ (y - 0.5) * 4,
+ (z - 0.5) * 7);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+
+ /* add a little rotation for -no-spin mode */
+ x -= 0.14;
+ y -= 0.06;
+
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ /* Center the scene's bounding box in the window,
+ and scale it to fit.
+ */
+ {
+ GLfloat w = bp->bbox.x2 - bp->bbox.x1;
+ GLfloat h = bp->bbox.y2 - bp->bbox.y1;
+ GLfloat s = 10.0 / (w > h ? w : h);
+ glScalef (s, s, s);
+ glTranslatef (-(bp->bbox.x1 + w/2),
+ -(bp->bbox.y1 + h/2),
+ 0);
+ }
+
+ mi->polygon_count = 0;
+
+ for (i = 0; i < bp->ngears; i++)
+ {
+ gear *g = bp->gears[i];
+
+ glPushMatrix();
+
+ glTranslatef (g->x, g->y, g->z);
+ glRotatef (g->th, 0, 0, 1);
+
+ glCallList (g->dlist);
+ mi->polygon_count += g->polygons;
+
+ glPopMatrix ();
+ }
+
+ if (bp->planetary_p)
+ {
+ glCallList (bp->armature_dlist);
+ mi->polygon_count += bp->armature_polygons;
+ }
+
+ glPopMatrix ();
+
+ /* spin gears */
+ if (!bp->button_down_p)
+ for (i = 0; i < bp->ngears; i++)
+ {
+ gear *g = bp->gears[i];
+ double off = g->ratio * 5 * speed;
+ if (g->th > 0)
+ g->th += off;
+ else
+ g->th -= off;
+ }
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+ENTRYPOINT Bool
+gears_handle_event (ModeInfo *mi, XEvent *event)
+{
+ gears_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ init_gears (mi);
+ return True;
+ }
+
+ return False;
+}
+
+XSCREENSAVER_MODULE ("Gears", gears)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/gears.man b/hacks/glx/gears.man
new file mode 100644
index 0000000..a54a6af
--- /dev/null
+++ b/hacks/glx/gears.man
@@ -0,0 +1,79 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+gears - draw interlocking gears, for xscreensaver.
+.SH SYNOPSIS
+.B gears
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIusecs\fP]
+[\-speed \fIfloat\fP]
+[\-no\-spin]
+[\-no\-wander]
+[-count \fIinteger\fP]
+[-wireframe]
+[-fps]
+.SH DESCRIPTION
+This draws a set of rotating gears.
+.SH OPTIONS
+.I gears
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIusecs\fP
+The delay between frames of the animation, in microseconds.
+Default: 30000 (0.03 seconds.)
+.TP 8
+.B \-speed \fIfloat\fP
+Larger numbers mean run faster. Default: 1.0.
+.TP 8
+.B \-no\-spin
+Don't rotate the object.
+.TP 8
+.B \-no\-wander
+Don't wander the object around the screen.
+.TP 8
+.B \-count \fIinteger\fP
+How many gears to draw. Default: 0 for random.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2007 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
+
+An earlier version of this program by Brian Paul was written in 1997;
+this version was rewritten from scratch by jwz in 2007.
diff --git a/hacks/glx/geodesic.c b/hacks/glx/geodesic.c
new file mode 100644
index 0000000..9ef2696
--- /dev/null
+++ b/hacks/glx/geodesic.c
@@ -0,0 +1,816 @@
+/* geodesic, Copyright (c) 2013-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 4 \n" \
+ "*showFPS: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_geodesic 0
+# define release_geodesic 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "normals.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#include "gllist.h"
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+#define DEF_MODE "mesh"
+
+typedef struct { double a, o; } LL; /* latitude + longitude */
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+ int ncolors;
+ XColor *colors;
+ int ccolor, ccolor2;
+ GLfloat color1[4], color2[4];
+
+ GLfloat depth;
+ GLfloat delta;
+
+ GLfloat thickness;
+ GLfloat thickdelta;
+
+ GLfloat morph_ratio;
+
+ Bool random_p;
+ enum { WIRE, MESH, SOLID, STELLATED, STELLATED2 } mode;
+
+} geodesic_configuration;
+
+static geodesic_configuration *bps = NULL;
+
+static Bool do_spin;
+static GLfloat speed;
+static Bool do_wander;
+static char *mode_str;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-wireframe", ".mode", XrmoptionNoArg, "wire" },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&mode_str, "mode", "Mode", DEF_MODE, t_String},
+};
+
+ENTRYPOINT ModeSpecOpt geodesic_opts = {
+ countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Renders a triangle specified by 3 cartesian endpoints.
+ */
+static void
+triangle0 (ModeInfo *mi, XYZ p1, XYZ p2, XYZ p3)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ GLfloat r = bp->thickness;
+
+ if (bp->mode == SOLID || bp->mode == STELLATED || bp->mode == STELLATED2)
+ r = 1;
+
+ if (r <= 0.001) r = 0.001;
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bp->color1);
+
+ if (wire) r = 1;
+
+ if (r <= 0)
+ ;
+ else if (r >= 1) /* solid triangular face */
+ {
+ glFrontFace (GL_CCW);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ do_normal (p1.x, p1.y, p1.z,
+ p2.x, p2.y, p2.z,
+ p3.x, p3.y, p3.z);
+ glVertex3f (p1.x, p1.y, p1.z);
+ glVertex3f (p2.x, p2.y, p2.z);
+ glVertex3f (p3.x, p3.y, p3.z);
+ glEnd();
+ mi->polygon_count++;
+ }
+ else /* mesh: triangular face with a triangular hole */
+ {
+ XYZ p1b, p2b, p3b, c;
+ GLfloat d = 0.98;
+
+ c.x = (p1.x + p2.x + p3.x) / 3;
+ c.y = (p1.y + p2.y + p3.y) / 3;
+ c.z = (p1.z + p2.z + p3.z) / 3;
+
+ p1b.x = p1.x + (r * (c.x - p1.x));
+ p1b.y = p1.y + (r * (c.y - p1.y));
+ p1b.z = p1.z + (r * (c.z - p1.z));
+
+ p2b.x = p2.x + (r * (c.x - p2.x));
+ p2b.y = p2.y + (r * (c.y - p2.y));
+ p2b.z = p2.z + (r * (c.z - p2.z));
+
+ p3b.x = p3.x + (r * (c.x - p3.x));
+ p3b.y = p3.y + (r * (c.y - p3.y));
+ p3b.z = p3.z + (r * (c.z - p3.z));
+
+ /* Outside faces */
+
+ do_normal (p1.x, p1.y, p1.z,
+ p2.x, p2.y, p2.z,
+ p3.x, p3.y, p3.z);
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (p1.x, p1.y, p1.z);
+ glVertex3f (p1b.x, p1b.y, p1b.z);
+ glVertex3f (p3b.x, p3b.y, p3b.z);
+ glVertex3f (p3.x, p3.y, p3.z);
+ mi->polygon_count++;
+
+ glVertex3f (p1.x, p1.y, p1.z);
+ glVertex3f (p2.x, p2.y, p2.z);
+ glVertex3f (p2b.x, p2b.y, p2b.z);
+ glVertex3f (p1b.x, p1b.y, p1b.z);
+ mi->polygon_count++;
+
+ glVertex3f (p2.x, p2.y, p2.z);
+ glVertex3f (p3.x, p3.y, p3.z);
+ glVertex3f (p3b.x, p3b.y, p3b.z);
+ glVertex3f (p2b.x, p2b.y, p2b.z);
+ mi->polygon_count++;
+ glEnd();
+
+ /* Inside faces */
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bp->color2);
+
+ do_normal (p3.x, p3.y, p3.z,
+ p3b.x, p3b.y, p3b.z,
+ p1b.x, p1b.y, p1b.z);
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (d * p3.x, d * p3.y, d * p3.z);
+ glVertex3f (d * p3b.x, d * p3b.y, d * p3b.z);
+ glVertex3f (d * p1b.x, d * p1b.y, d * p1b.z);
+ glVertex3f (d * p1.x, d * p1.y, d * p1.z);
+ mi->polygon_count++;
+
+ glVertex3f (d * p1b.x, d * p1b.y, d * p1b.z);
+ glVertex3f (d * p2b.x, d * p2b.y, d * p2b.z);
+ glVertex3f (d * p2.x, d * p2.y, d * p2.z);
+ glVertex3f (d * p1.x, d * p1.y, d * p1.z);
+ mi->polygon_count++;
+
+ glVertex3f (d * p2b.x, d * p2b.y, d * p2b.z);
+ glVertex3f (d * p3b.x, d * p3b.y, d * p3b.z);
+ glVertex3f (d * p3.x, d * p3.y, d * p3.z);
+ glVertex3f (d * p2.x, d * p2.y, d * p2.z);
+ mi->polygon_count++;
+ glEnd();
+
+
+ /* Connecting edges */
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bp->color1);
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+
+ do_normal (p1b.x, p1b.y, p1b.z,
+ p2b.x, p2b.y, p2b.z,
+ p2b.x * d, p2b.y * d, p2b.z * d);
+ glVertex3f (p1b.x, p1b.y, p1b.z);
+ glVertex3f (p2b.x, p2b.y, p2b.z);
+ glVertex3f (p2b.x * d, p2b.y * d, p2b.z * d);
+ glVertex3f (p1b.x * d, p1b.y * d, p1b.z * d);
+ mi->polygon_count++;
+
+ do_normal (p2b.x, p2b.y, p2b.z,
+ p3b.x, p3b.y, p3b.z,
+ p3b.x * d, p3b.y * d, p3b.z * d);
+ glVertex3f (p2b.x, p2b.y, p2b.z);
+ glVertex3f (p3b.x, p3b.y, p3b.z);
+ glVertex3f (p3b.x * d, p3b.y * d, p3b.z * d);
+ glVertex3f (p2b.x * d, p2b.y * d, p2b.z * d);
+ mi->polygon_count++;
+
+ do_normal (p3b.x, p3b.y, p3b.z,
+ p1b.x, p1b.y, p1b.z,
+ p1b.x * d, p1b.y * d, p1b.z * d);
+ glVertex3f (p3b.x, p3b.y, p3b.z);
+ glVertex3f (p1b.x, p1b.y, p1b.z);
+ glVertex3f (p1b.x * d, p1b.y * d, p1b.z * d);
+ glVertex3f (p3b.x * d, p3b.y * d, p3b.z * d);
+ mi->polygon_count++;
+ glEnd();
+ }
+}
+
+
+/* Renders a triangle specified by 3 polar endpoints.
+ */
+static void
+triangle1 (ModeInfo *mi, LL v1, LL v2, LL v3)
+{
+ XYZ p1, p2, p3;
+
+ p1.x = cos (v1.a) * cos (v1.o);
+ p1.y = cos (v1.a) * sin (v1.o);
+ p1.z = sin (v1.a);
+
+ p2.x = cos (v2.a) * cos (v2.o);
+ p2.y = cos (v2.a) * sin (v2.o);
+ p2.z = sin (v2.a);
+
+ p3.x = cos (v3.a) * cos (v3.o);
+ p3.y = cos (v3.a) * sin (v3.o);
+ p3.z = sin (v3.a);
+
+ triangle0 (mi, p1, p2, p3);
+}
+
+
+/* Computes the midpoint of a line between two polar coords.
+ */
+static void
+midpoint2 (LL v1, LL v2, LL *vm_ret,
+ XYZ *p1_ret, XYZ *p2_ret, XYZ *pm_ret)
+{
+ XYZ p1, p2, pm;
+ LL vm;
+ GLfloat hyp;
+
+ p1.x = cos (v1.a) * cos (v1.o);
+ p1.y = cos (v1.a) * sin (v1.o);
+ p1.z = sin (v1.a);
+
+ p2.x = cos (v2.a) * cos (v2.o);
+ p2.y = cos (v2.a) * sin (v2.o);
+ p2.z = sin (v2.a);
+
+ pm.x = (p1.x + p2.x) / 2;
+ pm.y = (p1.y + p2.y) / 2;
+ pm.z = (p1.z + p2.z) / 2;
+
+ vm.o = atan2 (pm.y, pm.x);
+ hyp = sqrt (pm.x * pm.x + pm.y * pm.y);
+ vm.a = atan2 (pm.z, hyp);
+
+ *p1_ret = p1;
+ *p2_ret = p2;
+ *pm_ret = pm;
+ *vm_ret = vm;
+}
+
+
+/* Computes the midpoint of a triangle specified in polar coords.
+ */
+static void
+midpoint3 (LL v1, LL v2, LL v3, LL *vm_ret,
+ XYZ *p1_ret, XYZ *p2_ret, XYZ *p3_ret, XYZ *pm_ret)
+{
+ XYZ p1, p2, p3, pm;
+ LL vm;
+ GLfloat hyp;
+
+ p1.x = cos (v1.a) * cos (v1.o);
+ p1.y = cos (v1.a) * sin (v1.o);
+ p1.z = sin (v1.a);
+
+ p2.x = cos (v2.a) * cos (v2.o);
+ p2.y = cos (v2.a) * sin (v2.o);
+ p2.z = sin (v2.a);
+
+ p3.x = cos (v3.a) * cos (v3.o);
+ p3.y = cos (v3.a) * sin (v3.o);
+ p3.z = sin (v3.a);
+
+ pm.x = (p1.x + p2.x + p3.x) / 3;
+ pm.y = (p1.y + p2.y + p3.y) / 3;
+ pm.z = (p1.z + p2.z + p3.z) / 3;
+
+ vm.o = atan2 (pm.y, pm.x);
+ hyp = sqrt (pm.x * pm.x + pm.y * pm.y);
+ vm.a = atan2 (pm.z, hyp);
+
+ *p1_ret = p1;
+ *p2_ret = p2;
+ *p3_ret = p3;
+ *pm_ret = pm;
+ *vm_ret = vm;
+}
+
+
+/* Renders a triangular geodesic facet to the given depth.
+ */
+static void
+triangle (ModeInfo *mi, LL v1, LL v2, LL v3, int depth)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (depth <= 0)
+ triangle1 (mi, v1, v2, v3);
+ else
+ {
+ LL v12, v23, v13;
+ XYZ p1, p2, p3, p12, p23, p13;
+ GLfloat r = bp->morph_ratio;
+
+ midpoint2 (v1, v2, &v12, &p1, &p2, &p12);
+ midpoint2 (v2, v3, &v23, &p2, &p3, &p23);
+ midpoint2 (v1, v3, &v13, &p1, &p3, &p13);
+ depth--;
+
+ if (depth == 0 &&
+ r != 0 &&
+ (bp->mode == STELLATED || bp->mode == STELLATED2))
+ { /* morph between flat and stellated faces */
+ XYZ pc, pc2;
+ LL vc;
+ midpoint3 (v1, v2, v3, &vc, &p1, &p2, &p3, &pc);
+
+ pc2.x = cos (vc.a) * cos (vc.o);
+ pc2.y = cos (vc.a) * sin (vc.o);
+ pc2.z = sin (vc.a);
+
+ pc.x = pc.x + r * (pc2.x - pc.x);
+ pc.y = pc.y + r * (pc2.y - pc.y);
+ pc.z = pc.z + r * (pc2.z - pc.z);
+
+ triangle0 (mi, p1, p2, pc);
+ triangle0 (mi, p2, p3, pc);
+ triangle0 (mi, p3, p1, pc);
+ }
+ else if (depth == 0 && r < 1)
+ { /* morph between flat and sphere-oid faces */
+ XYZ p12b, p23b, p13b;
+
+ p12b.x = cos (v12.a) * cos (v12.o);
+ p12b.y = cos (v12.a) * sin (v12.o);
+ p12b.z = sin (v12.a);
+
+ p23b.x = cos (v23.a) * cos (v23.o);
+ p23b.y = cos (v23.a) * sin (v23.o);
+ p23b.z = sin (v23.a);
+
+ p13b.x = cos (v13.a) * cos (v13.o);
+ p13b.y = cos (v13.a) * sin (v13.o);
+ p13b.z = sin (v13.a);
+
+ p12.x = p12.x + r * (p12b.x - p12.x);
+ p12.y = p12.y + r * (p12b.y - p12.y);
+ p12.z = p12.z + r * (p12b.z - p12.z);
+
+ p23.x = p23.x + r * (p23b.x - p23.x);
+ p23.y = p23.y + r * (p23b.y - p23.y);
+ p23.z = p23.z + r * (p23b.z - p23.z);
+
+ p13.x = p13.x + r * (p13b.x - p13.x);
+ p13.y = p13.y + r * (p13b.y - p13.y);
+ p13.z = p13.z + r * (p13b.z - p13.z);
+
+ triangle0 (mi, p1, p12, p13);
+ triangle0 (mi, p12, p2, p23);
+ triangle0 (mi, p13, p23, p3);
+ triangle0 (mi, p12, p23, p13);
+ }
+ else
+ {
+ triangle (mi, v1, v12, v13, depth);
+ triangle (mi, v12, v2, v23, depth);
+ triangle (mi, v13, v23, v3, depth);
+ triangle (mi, v12, v23, v13, depth);
+ }
+ }
+}
+
+
+/* Renders a geodesic sphere to the given depth (frequency).
+ */
+static void
+make_geodesic (ModeInfo *mi, int depth)
+{
+ GLfloat th0 = atan (0.5); /* lat division: 26.57 deg */
+ GLfloat s = M_PI / 5; /* lon division: 72 deg */
+ int i;
+
+ for (i = 0; i < 10; i++)
+ {
+ GLfloat th1 = s * i;
+ GLfloat th2 = s * (i+1);
+ GLfloat th3 = s * (i+2);
+ LL v1, v2, v3, vc;
+ v1.a = th0; v1.o = th1;
+ v2.a = th0; v2.o = th3;
+ v3.a = -th0; v3.o = th2;
+ vc.a = M_PI/2; vc.o = th2;
+
+ if (i & 1) /* north */
+ {
+ triangle (mi, v1, v2, vc, depth);
+ triangle (mi, v2, v1, v3, depth);
+ }
+ else /* south */
+ {
+ v1.a = -v1.a;
+ v2.a = -v2.a;
+ v3.a = -v3.a;
+ vc.a = -vc.a;
+ triangle (mi, v2, v1, vc, depth);
+ triangle (mi, v1, v2, v3, depth);
+ }
+ }
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_geodesic (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+
+ENTRYPOINT void
+init_geodesic (ModeInfo *mi)
+{
+ geodesic_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_geodesic (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ /* This comes first because it sets wire. */
+ if (!mode_str || !*mode_str)
+ mode_str = DEF_MODE;
+ if (!strcasecmp(mode_str, "random")) {
+ bp->random_p = 1;
+ bp->mode = MESH + (random() % (STELLATED2 - MESH + 1));
+ } else if (!strcasecmp(mode_str, "mesh")) {
+ bp->mode = MESH;
+ } else if (!strcasecmp(mode_str, "solid")) {
+ bp->mode = SOLID;
+ } else if (!strcasecmp(mode_str, "stellated")) {
+ bp->mode = STELLATED;
+ } else if (!strcasecmp(mode_str, "stellated2")) {
+ bp->mode = STELLATED2;
+ } else if (!strcasecmp(mode_str, "wire")) {
+ bp->mode = WIRE;
+ MI_IS_WIREFRAME(mi) = wire = 1;
+ } else {
+ fprintf (stderr, "%s: unknown mode: %s\n", progname, mode_str);
+ exit (1);
+ }
+
+
+ {
+ static GLfloat cspec[4] = {1.0, 1.0, 1.0, 1.0};
+ static const GLfloat shiny = 128.0;
+
+ static GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ static GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ static GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ static GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, cspec);
+ glMateriali (GL_FRONT, GL_SHININESS, shiny);
+
+ glLineWidth (3);
+ }
+
+ if (! wire)
+ {
+ glEnable (GL_DEPTH_TEST);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ /* Actually this looks pretty good in -wire with lighting! */
+ glEnable (GL_LIGHTING);
+ glEnable (GL_LIGHT0);
+
+ if (! bp->rot)
+ {
+ double spin_speed = 0.25 * speed;
+ double wander_speed = 0.01 * speed;
+ double spin_accel = 0.2;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ True);
+ bp->trackball = gltrackball_init (True);
+ }
+
+ if (MI_COUNT(mi) < 1) MI_COUNT(mi) = 1;
+
+ bp->ncolors = 1024;
+ if (! bp->colors)
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+ bp->ccolor = 0;
+ bp->depth = 1; /* start 1 up from the icosahedron */
+ bp->delta = 0.003;
+
+#if 0
+ bp->thickness = 1;
+ bp->thickdelta = 0.0007;
+#else
+ bp->thickness = 0.1;
+ bp->thickdelta = 0;
+#endif
+}
+
+
+ENTRYPOINT Bool
+geodesic_handle_event (ModeInfo *mi, XEvent *event)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ mode_str = "random";
+ init_geodesic (mi);
+ return True;
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+draw_geodesic (ModeInfo *mi)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ if (! wire)
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 8,
+ (z - 0.5) * 15);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ bp->color1[0] = bp->colors[bp->ccolor].red / 65536.0;
+ bp->color1[1] = bp->colors[bp->ccolor].green / 65536.0;
+ bp->color1[2] = bp->colors[bp->ccolor].blue / 65536.0;
+ bp->color1[3] = 1;
+
+ bp->color2[0] = bp->colors[bp->ccolor2].red / 65536.0;
+ bp->color2[1] = bp->colors[bp->ccolor2].green / 65536.0;
+ bp->color2[2] = bp->colors[bp->ccolor2].blue / 65536.0;
+ bp->color2[3] = 1;
+
+ bp->ccolor = (bp->ccolor + 1) % bp->ncolors;
+ bp->ccolor2 = (bp->ccolor + bp->ncolors / 2) % bp->ncolors;
+
+ mi->polygon_count = 0;
+
+ glScalef (10, 10, 10);
+
+ {
+ GLfloat r = bp->depth - floor(bp->depth);
+ GLfloat alpha, morph1, morph2;
+ int d1, d2;
+
+ /* Two ranges: first for fading in the new segments.
+ Second for morphing the segments into position.
+ */
+ GLfloat range = 0.15;
+ GLfloat min1 = (0.5 - range) / 2;
+ GLfloat max1 = 0.5 - min1;
+ GLfloat min2 = 0.5 + min1;
+ GLfloat max2 = 0.5 + max1;
+
+ if (r < min1) /* old alone */
+ {
+ d1 = d2 = floor (bp->depth);
+ morph1 = morph2 = 1;
+ alpha = 1;
+ }
+ else if (r < max1 && /* fade to new flat */
+ (bp->mode == MESH ||
+ bp->mode == STELLATED ||
+ bp->mode == STELLATED2))
+ {
+ d1 = floor (bp->depth);
+ d2 = ceil (bp->depth);
+ morph1 = 1;
+ morph2 = 0;
+ alpha = (r - min1) / (max1 - min1);
+
+ if (bp->mode == STELLATED || bp->mode == STELLATED2)
+ {
+ morph1 = 1 - alpha; /* de-stellate while fading out */
+ morph1 = 2 * (morph1 - 0.5); /* do it faster */
+ if (morph1 < 0) morph1 = 0;
+ }
+ }
+ else if (r < min2) /* new flat */
+ {
+ d1 = d2 = ceil (bp->depth);
+ morph1 = morph2 = 0;
+ alpha = 1;
+ }
+ else if (r < max2) /* morph */
+ {
+ d1 = d2 = ceil (bp->depth);
+ morph1 = morph2 = (r - min2) / (max2 - min2);
+ alpha = 1;
+ }
+ else /* new alone */
+ {
+ d1 = d2 = ceil (bp->depth);
+ morph1 = morph2 = 1;
+ alpha = 1;
+ }
+
+ mi->recursion_depth = d2 + r;
+
+ if (bp->mode == STELLATED2)
+ {
+ morph1 = -morph1;
+ morph2 = -morph2;
+ }
+
+ if (d1 != d2)
+ {
+ if (alpha > 0.5) /* always draw the more transparent one first */
+ {
+ int s1; GLfloat s2;
+ s1 = d1; d1 = d2; d2 = s1;
+ s2 = morph1; morph1 = morph2; morph2 = s2;
+ alpha = 1 - alpha;
+ }
+ bp->color1[3] = 1 - alpha;
+ bp->color2[3] = 1 - alpha;
+
+ if (! wire)
+ glDisable (GL_POLYGON_OFFSET_FILL);
+
+ bp->morph_ratio = morph1;
+ make_geodesic (mi, d1);
+
+ /* Make the less-transparent object take precedence */
+ if (!wire)
+ {
+ glEnable (GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset (1.0, 1.0);
+ }
+ }
+
+ bp->color1[3] = alpha;
+ bp->color2[3] = alpha;
+
+ bp->morph_ratio = morph2;
+ make_geodesic (mi, d2);
+ }
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+
+
+ if (! bp->button_down_p)
+ {
+ bp->depth += speed * bp->delta;
+ bp->thickness += speed * bp->thickdelta;
+
+ if (bp->depth > MI_COUNT(mi)-1)
+ {
+ bp->depth = MI_COUNT(mi)-1;
+ bp->delta = -fabs (bp->delta);
+ }
+ else if (bp->depth < 0)
+ {
+ bp->depth = 0;
+ bp->delta = fabs (bp->delta);
+
+ /* Randomize the mode again when we hit the bottom state.
+ #### I wish this did a fade instead of a jump-cut.
+ */
+ if (bp->random_p)
+ bp->mode = MESH + (random() % (STELLATED2 - MESH + 1));
+ }
+
+ if (bp->thickness > 1)
+ {
+ bp->thickness = 1;
+ bp->thickdelta = -fabs (bp->thickdelta);
+ }
+ else if (bp->thickness < 0)
+ {
+ bp->thickness = 0;
+ bp->thickdelta = fabs (bp->thickdelta);
+ }
+ }
+}
+
+XSCREENSAVER_MODULE ("Geodesic", geodesic)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/geodesic.man b/hacks/glx/geodesic.man
new file mode 100644
index 0000000..4a408ca
--- /dev/null
+++ b/hacks/glx/geodesic.man
@@ -0,0 +1,79 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+geodesic - animates a mesh geodesic sphere.
+.SH SYNOPSIS
+.B geodesic
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-mode \fImode\fP]
+[\-no-wander]
+[\-no-spin]
+[\-fps]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-count \fInumber\fP]
+.SH DESCRIPTION
+Animates a mesh geodesic sphere of increasing and decreasing complexity. A
+geodesic sphere is an icosohedron whose equilateral faces are sub-divided
+into non-equilateral triangles to more closely approximate a sphere.
+
+The animation shows the equilateral triangles subdivided into four
+coplanar equilateral triangles; and then inflated outward, causing the
+sub-triangles to no longer be equilateral, but to more closely
+approximate the surface of a sphere.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mode mesh | solid | stellated | stellated2 | wire
+Face/edge display style. Default mesh.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the object should spin.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-count \fInumber\fP
+Depth (frequency) of the geodesic sphere. Default: 4.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2013 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/geodesicgears.c b/hacks/glx/geodesicgears.c
new file mode 100644
index 0000000..ecc7f26
--- /dev/null
+++ b/hacks/glx/geodesicgears.c
@@ -0,0 +1,1803 @@
+/* geodesicgears, Copyright (c) 2014-2015 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Inspired by http://bugman123.com/Gears/
+ * and by http://kennethsnelson.net/PortraitOfAnAtom.pdf
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 4 \n" \
+ "*wireframe: False \n" \
+ "*showFPS: False \n" \
+ "*texFontCacheSize: 100 \n" \
+ "*suppressRotationAnimation: True\n" \
+ "*font: -*-helvetica-medium-r-normal-*-*-160-*-*-*-*-*-*\n" \
+
+# define release_geodesic 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "involute.h"
+#include "colors.h"
+#include "normals.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+#include "texfont.h"
+
+
+#ifdef USE_GL /* whole file */
+
+#include "gllist.h"
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+#define DEF_LABELS "False"
+#define DEF_NUMBERS "False"
+#define DEF_TIMEOUT "20"
+
+typedef struct { double a, o; } LL; /* latitude + longitude */
+
+/* 10:6 is a mismesh. */
+
+static const struct {
+ enum { PRISM, OCTO, DECA, G14, G18, G32, G92, G182 } type;
+ const GLfloat args[5];
+} gear_templates[] = {
+ { PRISM },
+ { OCTO },
+ { DECA },
+ { G14 },
+ { G18 },
+ { G32, { 15, 6, 0.4535 }}, /* teeth1, teeth2, radius1 */
+ { G32, { 15, 12, 0.3560 }},
+ { G32, { 20, 6, 0.4850 }},
+ { G32, { 20, 12, 0.3995 }}, /* double of 10:6 */
+ { G32, { 20, 18, 0.3375 }},
+ { G32, { 25, 6, 0.5065 }},
+ { G32, { 25, 12, 0.4300 }},
+ { G32, { 25, 18, 0.3725 }},
+ { G32, { 25, 24, 0.3270 }},
+ { G32, { 30, 12, 0.4535 }}, /* double of 15:6 */
+ { G32, { 30, 18, 0.3995 }},
+ { G32, { 30, 24, 0.3560 }}, /* double of 15:12 */
+ { G32, { 30, 30, 0.3205 }},
+ { G32, { 35, 12, 0.4710 }},
+ { G32, { 35, 18, 0.4208 }},
+ { G32, { 35, 24, 0.3800 }},
+ { G32, { 35, 30, 0.3450 }},
+ { G32, { 35, 36, 0.3160 }},
+ { G32, { 40, 12, 0.4850 }}, /* double of 20:6 */
+ { G32, { 40, 24, 0.3995 }}, /* double of 10:6, 20:12 */
+/*{ G32, { 40, 36, 0.3375 }},*/ /* double of 20:18 */
+ { G32, { 50, 12, 0.5065 }}, /* double of 25:6 */
+ { G32, { 50, 24, 0.4300 }}, /* double of 25:12 */
+
+ /* These all have phase errors and don't always mesh properly.
+ Maybe we should just omit them? */
+
+ { G92, { 35, 36, 16, 0.2660, 0.366 }}, /* teeth1, 2, 3, r1, pitch3 */
+ { G92, { 25, 36, 11, 0.2270, 0.315 }},
+/*{ G92, { 15, 15, 8, 0.2650, 0.356 }},*/
+/*{ G92, { 20, 21, 8, 0.2760, 0.355 }},*/
+ { G92, { 25, 27, 16, 0.2320, 0.359 }},
+ { G92, { 20, 36, 11, 0.1875, 0.283 }},
+ { G92, { 30, 30, 16, 0.2585, 0.374 }}, /* double of 15:15:8 */
+ { G92, { 20, 33, 11, 0.1970, 0.293 }},
+/*{ G92, { 10, 12, 8, 0.2030, 0.345 }},*/
+ { G92, { 30, 33, 16, 0.2455, 0.354 }},
+/*{ G92, { 25, 24, 8, 0.3050, 0.375 }},*/
+ { G92, { 20, 24, 16, 0.2030, 0.346 }},
+};
+
+
+typedef struct sphere_gear sphere_gear;
+struct sphere_gear {
+ int id; /* name, for debugging */
+ XYZ axis; /* the vector on which this gear's axis lies */
+ int direction; /* rotation, +1 or -1 */
+ GLfloat offset; /* rotational degrees from parent gear */
+ sphere_gear *parent; /* gear driving this one, or 0 for root */
+ sphere_gear **children; /* gears driven by this one (no loops) */
+ sphere_gear **neighbors; /* gears touching this one (circular!) */
+ int nchildren, children_size;
+ int nneighbors, neighbors_size;
+ const gear *g; /* shape of this gear (shared) */
+};
+
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+ int ncolors;
+ XColor *colors;
+ GLfloat color1[4], color2[4];
+ texture_font_data *font;
+
+ int nshapes, shapes_size; /* how many 'gear' objects there are */
+ int ngears, gears_size; /* how many 'sphere_gear' objects there are */
+ gear *shapes;
+ sphere_gear *gears;
+
+ int which;
+ int mode; /* 0 = normal, 1 = out, 2 = in */
+ int mode_tick;
+ int next; /* 0 = random, -1 = back, 1 = forward */
+ time_t draw_time;
+ int draw_tick;
+ char *desc;
+
+ GLfloat th; /* rotation of the root sphere_gear in degrees. */
+
+} geodesic_configuration;
+
+static geodesic_configuration *bps = NULL;
+
+static int timeout;
+static Bool do_spin;
+static GLfloat speed;
+static Bool do_wander;
+static Bool do_labels;
+static Bool do_numbers;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-labels", ".labels", XrmoptionNoArg, "True" },
+ { "+labels", ".labels", XrmoptionNoArg, "False" },
+ { "-numbers", ".numbers",XrmoptionNoArg, "True" },
+ { "+numbers", ".numbers",XrmoptionNoArg, "False" },
+ { "-timeout", ".timeout",XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&do_labels, "labels", "Labels", DEF_LABELS, t_Bool},
+ {&do_numbers,"numbers","Numbers",DEF_NUMBERS,t_Bool},
+ {&timeout, "timeout","Seconds",DEF_TIMEOUT,t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt geodesic_opts = {
+ countof(opts), opts, countof(vars), vars, NULL};
+
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+
+
+static XYZ
+cross_product (XYZ a, XYZ b)
+{
+ XYZ c;
+ c.x = (a.y * b.z) - (a.z * b.y);
+ c.y = (a.z * b.x) - (a.x * b.z);
+ c.z = (a.x * b.y) - (a.y * b.x);
+ return c;
+}
+
+
+static GLfloat
+dot_product (XYZ a, XYZ b)
+{
+ return (a.x * b.x) + (a.y * b.y) + (a.z * b.z);
+}
+
+
+static XYZ
+normalize (XYZ v)
+{
+ GLfloat d = sqrt ((v.x * v.x) + (v.y * v.y) + (v.z * v.z));
+ if (d == 0)
+ v.x = v.y = v.z = 0;
+ else
+ {
+ v.x /= d;
+ v.y /= d;
+ v.z /= d;
+ }
+ return v;
+}
+
+
+static XYZ
+polar_to_cartesian (LL v)
+{
+ XYZ p;
+ p.x = cos (v.a) * cos (v.o);
+ p.y = cos (v.a) * sin (v.o);
+ p.z = sin (v.a);
+ return p;
+}
+
+
+
+
+static gear *
+add_gear_shape (ModeInfo *mi, GLfloat radius, int teeth)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ gear *g;
+ int i;
+
+ if (bp->nshapes >= bp->shapes_size - 1)
+ {
+ bp->shapes_size = bp->shapes_size * 1.2 + 4;
+ bp->shapes = (gear *)
+ realloc (bp->shapes, bp->shapes_size * sizeof(*bp->shapes));
+ }
+ g = &bp->shapes[bp->nshapes++];
+
+ memset (g, 0, sizeof(*g));
+
+ g->r = radius;
+ g->nteeth = teeth;
+ g->ratio = 1;
+
+ g->tooth_h = g->r / (teeth * 0.4);
+
+ if (g->tooth_h > 0.06) /* stubbier teeth when small tooth count. */
+ g->tooth_h *= 0.6;
+
+ g->thickness = 0.05 + BELLRAND(0.15);
+ g->thickness2 = g->thickness / 4;
+ g->thickness3 = g->thickness;
+ g->size = wire ? INVOLUTE_SMALL : INVOLUTE_LARGE;
+
+ /* Move the disc's origin inward to make the edge of the disc be tangent
+ to the unit sphere. */
+ g->z = 1 - sqrt (1 - (g->r * g->r));
+
+ /* #### This isn't quite right */
+ g->tooth_slope = 1 + ((g->z * 2) / g->r);
+
+
+ /* Decide on shape of gear interior:
+ - just a ring with teeth;
+ - that, plus a thinner in-set "plate" in the middle;
+ - that, plus a thin raised "lip" on the inner plate;
+ - or, a wide lip (really, a thicker third inner plate.)
+ */
+ if (wire)
+ ;
+ else if ((random() % 10) == 0)
+ {
+ /* inner_r can go all the way in; there's no inset disc. */
+ g->inner_r = (g->r * 0.3) + frand((g->r - g->tooth_h/2) * 0.6);
+ g->inner_r2 = 0;
+ g->inner_r3 = 0;
+ }
+ else
+ {
+ /* inner_r doesn't go in very far; inner_r2 is an inset disc. */
+ g->inner_r = (g->r * 0.5) + frand((g->r - g->tooth_h) * 0.4);
+ g->inner_r2 = (g->r * 0.1) + frand(g->inner_r * 0.5);
+ g->inner_r3 = 0;
+
+ if (g->inner_r2 > (g->r * 0.2))
+ {
+ int nn = (random() % 10);
+ if (nn <= 2)
+ g->inner_r3 = (g->r * 0.1) + frand(g->inner_r2 * 0.2);
+ else if (nn <= 7 && g->inner_r2 >= 0.1)
+ g->inner_r3 = g->inner_r2 - 0.01;
+ }
+ }
+
+ /* If we have three discs, sometimes make the middle disc be spokes.
+ */
+ if (g->inner_r3 && ((random() % 5) == 0))
+ {
+ g->spokes = 2 + BELLRAND (5);
+ g->spoke_thickness = 1 + frand(7.0);
+ if (g->spokes == 2 && g->spoke_thickness < 2)
+ g->spoke_thickness += 1;
+ }
+
+ /* Sometimes add little nubbly bits, if there is room.
+ */
+ if (!wire && g->nteeth > 5)
+ {
+ double size = 0;
+ involute_biggest_ring (g, 0, &size, 0);
+ if (size > g->r * 0.2 && (random() % 5) == 0)
+ {
+ g->nubs = 1 + (random() % 16);
+ if (g->nubs > 8) g->nubs = 1;
+ }
+ }
+
+ /* Decide how complex the polygon model should be.
+ */
+ {
+ double pix = g->tooth_h * MI_HEIGHT(mi); /* approx. tooth size in pixels */
+ if (pix <= 4) g->size = INVOLUTE_SMALL;
+ else if (pix <= 8) g->size = INVOLUTE_MEDIUM;
+ else if (pix <= 30) g->size = INVOLUTE_LARGE;
+ else g->size = INVOLUTE_HUGE;
+ }
+
+ if (g->inner_r3 > g->inner_r2) abort();
+ if (g->inner_r2 > g->inner_r) abort();
+ if (g->inner_r > g->r) abort();
+
+ i = random() % bp->ncolors;
+ g->color[0] = bp->colors[i].red / 65536.0;
+ g->color[1] = bp->colors[i].green / 65536.0;
+ g->color[2] = bp->colors[i].blue / 65536.0;
+ g->color[3] = 1;
+
+ i = (i + bp->ncolors / 2) % bp->ncolors;
+ g->color2[0] = bp->colors[i].red / 65536.0;
+ g->color2[1] = bp->colors[i].green / 65536.0;
+ g->color2[2] = bp->colors[i].blue / 65536.0;
+ g->color2[3] = 1;
+
+ g->dlist = glGenLists (1);
+ glNewList (g->dlist, GL_COMPILE);
+
+#if 1
+ {
+ gear G, *g2 = &G;
+ *g2 = *g;
+
+ /* Move the gear inward so that its outer edge is on the disc, instead
+ of its midpoint. */
+ g2->z += g2->thickness/2;
+
+ /* 'radius' is at the surface but 'g->r' is at the center, so we need
+ to reverse the slope computation that involute.c does. */
+ g2->r /= (1 + (g2->thickness * g2->tooth_slope / 2));
+
+ glPushMatrix();
+ glTranslatef(g2->x, g2->y, -g2->z);
+
+ /* Line up the center of the point of tooth 0 with "up". */
+ glRotatef (90, 0, 0, 1);
+ glRotatef (180, 0, 1, 0);
+ glRotatef (-360.0 / g2->nteeth / 4, 0, 0, 1);
+
+ g->polygons = draw_involute_gear (g2, wire);
+ glPopMatrix();
+ }
+# else /* draw discs */
+ {
+ glPushMatrix();
+ glTranslatef(g->x, g->y, -g->z);
+ glLineWidth (2);
+ glFrontFace (GL_CCW);
+ glNormal3f(0, 0, 1);
+ glColor3f(0, 0, 0);
+ glDisable (GL_LIGHTING);
+
+ glBegin(GL_LINES);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, radius, 0);
+ glEnd();
+
+ glColor3f(0.5, 0.5, 0.5);
+ glBegin(wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
+ {
+ GLfloat th;
+ GLfloat step = M_PI * 2 / 128;
+ /* radius *= 1.005; */
+ glVertex3f (0, 0, 0);
+ for (th = 0; th < M_PI * 2 + step; th += step)
+ {
+ GLfloat x = cos(th) * radius;
+ GLfloat y = sin(th) * radius;
+ glVertex3f (x, y, 0);
+ }
+ }
+ glEnd();
+ if (!wire) glEnable(GL_LIGHTING);
+ glPopMatrix();
+ }
+# endif /* 0 */
+
+ glEndList ();
+
+ return g;
+}
+
+
+static void
+add_sphere_gear (ModeInfo *mi, gear *g, XYZ axis)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ sphere_gear *gg;
+ int i;
+
+ axis = normalize (axis);
+
+ /* If there's already a gear on this axis, don't duplicate it. */
+ for (i = 0; i < bp->ngears; i++)
+ {
+ XYZ o = bp->gears[i].axis;
+ if (o.x == axis.x && o.y == axis.y && o.z == axis.z)
+ return;
+ }
+
+ if (bp->ngears >= bp->gears_size - 1)
+ {
+ bp->gears_size = bp->gears_size * 1.2 + 10;
+ bp->gears = (sphere_gear *)
+ realloc (bp->gears, bp->gears_size * sizeof(*bp->gears));
+ }
+
+ gg = &bp->gears[bp->ngears];
+ memset (gg, 0, sizeof(*gg));
+ gg->id = bp->ngears;
+ gg->axis = axis;
+ gg->direction = 0;
+ gg->g = g;
+ bp->ngears++;
+}
+
+
+static void
+free_sphere_gears (ModeInfo *mi)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ int i;
+ for (i = 0; i < bp->nshapes; i++)
+ {
+ if (bp->shapes[i].dlist)
+ glDeleteLists (bp->shapes[i].dlist, 1);
+ }
+ free (bp->shapes);
+ bp->nshapes = 0;
+ bp->shapes_size = 0;
+ bp->shapes = 0;
+
+ for (i = 0; i < bp->ngears; i++)
+ {
+ sphere_gear *g = &bp->gears[i];
+ if (g->children)
+ free (g->children);
+ if (g->neighbors)
+ free (g->neighbors);
+ }
+ free (bp->gears);
+ bp->ngears = 0;
+ bp->gears_size = 0;
+ bp->gears = 0;
+}
+
+
+
+/* Is the gear a member of the list?
+ */
+static Bool
+gear_list_member (sphere_gear *g, sphere_gear **list, int count)
+{
+ int i;
+ for (i = 0; i < count; i++)
+ if (list[i] == g) return True;
+ return False;
+}
+
+
+/* Add the gear to the list, resizing it as needed.
+ */
+static void
+gear_list_push (sphere_gear *g,
+ sphere_gear ***listP,
+ int *countP, int *sizeP)
+{
+ if (*countP >= (*sizeP) - 1)
+ {
+ *sizeP = (*sizeP) * 1.2 + 4;
+ *listP = (sphere_gear **) realloc (*listP, (*sizeP) * sizeof(**listP));
+ }
+ (*listP)[*countP] = g;
+ (*countP)++;
+}
+
+
+/* Mark child and parent as being mutual neighbors.
+ */
+static void
+link_neighbors (sphere_gear *parent, sphere_gear *child)
+{
+ if (child == parent) abort();
+
+ /* Add child to parent's list of neighbors */
+ if (! gear_list_member (child, parent->neighbors, parent->nneighbors))
+ {
+ gear_list_push (child,
+ &parent->neighbors,
+ &parent->nneighbors,
+ &parent->neighbors_size);
+ /* fprintf(stderr, "neighbor %2d -> %2d (%d)\n", parent->id, child->id,
+ parent->nneighbors); */
+ }
+
+ /* Add parent to child's list of neighbors */
+ if (! gear_list_member (parent, child->neighbors, child->nneighbors))
+ {
+ gear_list_push (parent,
+ &child->neighbors,
+ &child->nneighbors,
+ &child->neighbors_size);
+ /* fprintf(stderr, "neighbor %2d <- %2d\n", parent->id, child->id); */
+ }
+}
+
+/* Mark child as having parent, and vice versa.
+ */
+static void
+link_child (sphere_gear *parent, sphere_gear *child)
+{
+ if (child == parent) abort();
+ if (child->parent) return;
+
+ gear_list_push (child,
+ &parent->children,
+ &parent->nchildren,
+ &parent->children_size);
+ child->parent = parent;
+ /* fprintf(stderr, "child %2d -> %2d (%d)\n", parent->id, child->id,
+ parent->nchildren); */
+}
+
+
+
+static void link_children (sphere_gear *);
+
+static void
+link_children (sphere_gear *parent)
+{
+ int i;
+# if 1 /* depth first */
+ for (i = 0; i < parent->nneighbors; i++)
+ {
+ sphere_gear *child = parent->neighbors[i];
+ if (! child->parent)
+ {
+ link_child (parent, child);
+ link_children (child);
+ }
+ }
+# else /* breadth first */
+ for (i = 0; i < parent->nneighbors; i++)
+ {
+ sphere_gear *child = parent->neighbors[i];
+ if (! child->parent)
+ link_child (parent, child);
+ }
+ for (i = 0; i < parent->nchildren; i++)
+ {
+ sphere_gear *child = parent->children[i];
+ link_children (child);
+ }
+# endif
+}
+
+
+
+/* Whether the two gears touch.
+ */
+static Bool
+gears_touch_p (ModeInfo *mi, sphere_gear *a, sphere_gear *b)
+{
+ /* We need to know if the two discs on the surface overlap.
+
+ Find the angle between the axis of each disc, and a point on its edge:
+ the axis between the hypotenuse and adjacent of a right triangle between
+ the disc's radius and the origin.
+
+ R
+ _____
+ |_| /
+ | /
+ 1 | /
+ |t/ t = asin(R)
+ |/
+
+ Find the angle between the axes of the two discs.
+
+ |
+ | / angle = acos (v1 dot v2)
+ 1 | / axis = v1 cross v2
+ | / 1
+ | /
+ |/
+
+ If the sum of the first two angles is less than the third angle,
+ they touch.
+ */
+ XYZ p1 = a->axis;
+ XYZ p2 = b->axis;
+ double t1 = asin (a->g->r);
+ double t2 = asin (b->g->r);
+ double th = acos (dot_product (p1, p2));
+
+ return (t1 + t2 >= th);
+}
+
+
+/* Set the rotation direction for the gear and its kids.
+ */
+static void
+orient_gears (ModeInfo *mi, sphere_gear *g)
+{
+ int i;
+ if (g->parent)
+ g->direction = -g->parent->direction;
+ for (i = 0; i < g->nchildren; i++)
+ orient_gears (mi, g->children[i]);
+}
+
+
+/* Returns the global model coordinates of the given tooth of a gear.
+ */
+static XYZ
+tooth_coords (const sphere_gear *s, int tooth)
+{
+ const gear *g = s->g;
+ GLfloat off = s->offset * (M_PI / 180) * g->ratio * s->direction;
+ GLfloat th = (tooth * M_PI * 2 / g->nteeth) - off;
+ XYZ axis;
+ GLfloat angle;
+ XYZ from = { 0, 1, 0 };
+ XYZ to = s->axis;
+ XYZ p0, p1, p2;
+ GLfloat x, y, z, C, S, m[4][4];
+
+ axis = cross_product (from, to);
+ angle = acos (dot_product (from, to));
+
+ p0 = normalize (axis);
+ x = p0.x;
+ y = p0.y;
+ z = p0.z;
+ C = cos(angle);
+ S = sin(angle);
+
+ /* this is what glRotatef does */
+ m[0][0] = x*x * (1 - C) + C;
+ m[1][0] = x*y * (1 - C) - z*S;
+ m[2][0] = x*z * (1 - C) + y*S;
+ m[3][0] = 0;
+
+ m[0][1] = y*x * (1 - C) + z*S;
+ m[1][1] = y*y * (1 - C) + C;
+ m[2][1] = y*z * (1 - C) - x*S;
+ m[3][1] = 0;
+
+ m[0][2] = x*z * (1 - C) - y*S;
+ m[1][2] = y*z * (1 - C) + x*S;
+ m[2][2] = z*z * (1 - C) + C;
+ m[3][2] = 0;
+
+ m[0][3] = 0;
+ m[1][3] = 0;
+ m[2][3] = 0;
+ m[3][3] = 1;
+
+ /* The point to transform */
+ p1.x = g->r * sin (th);
+ p1.z = g->r * cos (th);
+ p1.y = 1 - g->z;
+ p1 = normalize (p1);
+
+ /* transformation result */
+ p2.x = p1.x * m[0][0] + p1.y * m[1][0] + p1.z * m[2][0] + m[3][0];
+ p2.y = p1.x * m[0][1] + p1.y * m[1][1] + p1.z * m[2][1] + m[3][1];
+ p2.z = p1.x * m[0][2] + p1.y * m[1][2] + p1.z * m[2][2] + m[3][2];
+
+ return p2;
+}
+
+
+/* Returns the number of the tooth of the first gear that is closest
+ to any tooth of its parent. Also the position of the parent tooth.
+ */
+static int
+parent_tooth (const sphere_gear *s, XYZ *parent)
+{
+ const sphere_gear *s2 = s->parent;
+ int i, j;
+ GLfloat min_dist = 99999;
+ int min_tooth = 0;
+ XYZ min_parent = { 0, 0, 0 };
+
+ if (s2)
+ for (i = 0; i < s->g->nteeth; i++)
+ {
+ XYZ p1 = tooth_coords (s, i);
+ for (j = 0; j < s2->g->nteeth; j++)
+ {
+ XYZ p2 = tooth_coords (s2, j);
+ XYZ d;
+ GLfloat dist;
+ d.x = p1.x - p2.x;
+ d.y = p1.y - p2.y;
+ d.z = p1.z - p2.z;
+
+ dist = sqrt (d.x*d.x + d.y*d.y + d.z*d.z);
+ if (dist < min_dist)
+ {
+ min_dist = dist;
+ min_parent = p2;
+ min_tooth = i;
+ }
+ }
+ }
+ *parent = min_parent;
+ return min_tooth;
+}
+
+
+/* Make all of the gear's children's teeth mesh properly.
+ */
+static void align_gear_teeth (sphere_gear *s);
+static void
+align_gear_teeth (sphere_gear *s)
+{
+ int i;
+ XYZ pc;
+
+ if (s->parent)
+ {
+ /* Iterate this gear's offset until we find a value for it that
+ minimizes the distance between this gear's parent-pointing
+ tooth, and the corresponding tooth on the parent.
+ */
+ int pt = parent_tooth (s, &pc);
+ GLfloat range = 360 / s->g->nteeth;
+ GLfloat steps = 64;
+ GLfloat min_dist = 999999;
+ GLfloat min_off = 0;
+ GLfloat off;
+
+ for (off = -range/2; off < range/2; off += range/steps)
+ {
+ XYZ tc, d;
+ GLfloat dist;
+ s->offset = off;
+ tc = tooth_coords (s, pt);
+ d.x = pc.x - tc.x;
+ d.y = pc.y - tc.y;
+ d.z = pc.z - tc.z;
+ dist = sqrt (d.x*d.x + d.y*d.y + d.z*d.z);
+ if (dist < min_dist)
+ {
+ min_dist = dist;
+ min_off = off;
+ }
+ }
+
+ s->offset = min_off;
+ }
+
+ /* Now do the children. We have to do it in parent/child order because
+ the offset we just computed for the parent affects everyone downstream.
+ */
+ for (i = 0; i < s->nchildren; i++)
+ align_gear_teeth (s->children[i]);
+}
+
+
+
+static void
+describe_gears (ModeInfo *mi)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ int gears_per_teeth[1000];
+ int i;
+ int lines = 0;
+ memset (gears_per_teeth, 0, sizeof(gears_per_teeth));
+ for (i = 0; i < bp->ngears; i++)
+ gears_per_teeth[bp->gears[i].g->nteeth]++;
+ if (bp->desc) free (bp->desc);
+ bp->desc = (char *) malloc (80 * bp->ngears);
+ *bp->desc = 0;
+ for (i = 0; i < countof(gears_per_teeth); i++)
+ if (gears_per_teeth[i])
+ {
+ sprintf (bp->desc + strlen(bp->desc),
+ "%s%d gears with %d teeth",
+ (lines > 0 ? ",\n" : ""),
+ gears_per_teeth[i], i);
+ lines++;
+ }
+ if (lines > 1)
+ sprintf (bp->desc + strlen(bp->desc), ",\n%d gears total", bp->ngears);
+ strcat (bp->desc, ".");
+}
+
+
+/* Takes the gears and makes an arbitrary DAG of them in order to compute
+ direction and gear ratios.
+ */
+static void
+sort_gears (ModeInfo *mi)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ sphere_gear *root = 0;
+ int i, j;
+
+ /* For each gear, compare it against every other gear.
+ If they touch, mark them as being each others' neighbors.
+ */
+ for (i = 0; i < bp->ngears; i++)
+ {
+ sphere_gear *a = &bp->gears[i];
+ for (j = 0; j < bp->ngears; j++)
+ {
+ sphere_gear *b = &bp->gears[j];
+ if (a == b) continue;
+ if (gears_touch_p (mi, a, b))
+ link_neighbors (a, b);
+ }
+ }
+
+ bp->gears[0].parent = &bp->gears[0]; /* don't give this one a parent */
+ link_children (&bp->gears[0]);
+ bp->gears[0].parent = 0;
+
+
+# if 0
+ for (i = 0; i < bp->ngears; i++)
+ {
+ fprintf (stderr, "%2d: p = %2d; k(%d, %d) = ",
+ i,
+ bp->gears[i].parent ? bp->gears[i].parent->id : -1,
+ bp->gears[i].nneighbors,
+ bp->gears[i].nchildren);
+ for (j = 0; j < bp->gears[i].nneighbors; j++)
+ fprintf (stderr, "%2d ", (int) bp->gears[i].neighbors[j]->id);
+ fprintf (stderr, "\t\t");
+ if (j < 5) fprintf (stderr, "\t");
+ for (j = 0; j < bp->gears[i].nchildren; j++)
+ fprintf (stderr, "%2d ", (int) bp->gears[i].children[j]->id);
+ fprintf (stderr,"\n");
+ }
+ fprintf (stderr,"\n");
+# endif /* 0 */
+
+
+ /* If there is more than one gear with no parent, we fucked up. */
+
+ root = 0;
+ for (i = 0; i < bp->ngears; i++)
+ {
+ sphere_gear *g = &bp->gears[i];
+ if (!g->parent)
+ root = g;
+ }
+
+ if (! root) abort();
+
+ root->direction = 1;
+ orient_gears (mi, root);
+
+ /* If there are any gears with no direction, they aren't reachable. */
+ for (i = 0; i < bp->ngears; i++)
+ {
+ sphere_gear *g = &bp->gears[i];
+ if (g->direction == 0)
+ fprintf(stderr,"INTERNAL ERROR: unreachable: %d\n", g->id);
+ }
+
+ align_gear_teeth (root);
+ describe_gears (mi);
+}
+
+
+/* Create 5 identical gears arranged on the faces of a uniform
+ triangular prism.
+ */
+static void
+make_prism (ModeInfo *mi)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ gear *g;
+ XYZ a;
+ int i;
+ int teeth = 4 * (4 + (int) (BELLRAND(20)));
+ if (teeth % 4) abort(); /* must be a multiple of 4 */
+
+ g = add_gear_shape (mi, 0.7075, teeth);
+
+ a.x = 0; a.y = 0; a.z = 1;
+ add_sphere_gear (mi, g, a);
+ a.z = -1;
+ add_sphere_gear (mi, g, a);
+
+ a.z = 0;
+ for (i = 0; i < 3; i++)
+ {
+ GLfloat th = i * M_PI * 2 / 3;
+ a.x = cos (th);
+ a.y = sin (th);
+ add_sphere_gear (mi, g, a);
+ }
+
+ if (bp->ngears != 5) abort();
+}
+
+
+/* Create 8 identical gears arranged on the faces of an octohedron
+ (or alternately, arranged on the diagonals of a cube.)
+ */
+static void
+make_octo (ModeInfo *mi)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ static const XYZ verts[] = {{ -1, -1, -1 },
+ { -1, -1, 1 },
+ { -1, 1, 1 },
+ { -1, 1, -1 },
+ { 1, -1, 1 },
+ { 1, -1, -1 },
+ { 1, 1, -1 },
+ { 1, 1, 1 }};
+ gear *g;
+ int i;
+ int teeth = 4 * (4 + (int) (BELLRAND(20)));
+ if (teeth % 4) abort(); /* must be a multiple of 4 */
+
+ g = add_gear_shape (mi, 0.578, teeth);
+ for (i = 0; i < countof(verts); i++)
+ add_sphere_gear (mi, g, verts[i]);
+
+ if (bp->ngears != 8) abort();
+}
+
+
+/* Create 10 identical gears arranged on the faces of ... something.
+ I'm not sure what polyhedron is the basis of this.
+ */
+static void
+make_deca (ModeInfo *mi)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ gear *g;
+ XYZ a;
+ int i, j;
+ int teeth = 4 * (4 + (int) (BELLRAND(15)));
+ if (teeth % 4) abort(); /* must be a multiple of 4 */
+
+ g = add_gear_shape (mi, 0.5415, teeth);
+
+ a.x = 0; a.y = 0; a.z = 1;
+ add_sphere_gear (mi, g, a);
+ a.z = -1;
+ add_sphere_gear (mi, g, a);
+
+ for (j = -1; j <= 1; j += 2)
+ {
+ GLfloat off = (j < 0 ? 0 : M_PI / 4);
+ LL v;
+ v.a = j * M_PI * 0.136; /* #### Empirical. What is this? */
+ for (i = 0; i < 4; i++)
+ {
+ v.o = i * M_PI / 2 + off;
+ a = polar_to_cartesian (v);
+ add_sphere_gear (mi, g, a);
+ }
+ }
+ if (bp->ngears != 10) abort();
+}
+
+
+/* Create 14 identical gears arranged on the faces of ... something.
+ I'm not sure what polyhedron is the basis of this.
+ */
+static void
+make_14 (ModeInfo *mi)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ gear *g;
+ XYZ a;
+ int i;
+ GLfloat r = 0.4610;
+ int teeth = 6 * (2 + (int) (BELLRAND(4)));
+ if (teeth % 6) abort(); /* must be a multiple of 6. I think? */
+ /* mismeshes: 24 30 34 36 42 48 54 60 */
+
+ /* North, south */
+ g = add_gear_shape (mi, r, teeth);
+ a.x = 0; a.y = 0; a.z = 1;
+ add_sphere_gear (mi, g, a);
+ a.z = -1;
+ add_sphere_gear (mi, g, a);
+
+ /* Equator */
+ a.z = 0;
+ for (i = 0; i < 4; i++)
+ {
+ GLfloat th = i * M_PI * 2 / 4 + (M_PI / 4);
+ a.x = cos(th);
+ a.y = sin(th);
+ add_sphere_gear (mi, g, a);
+ }
+
+ /* The other 8 */
+ g = add_gear_shape (mi, r, teeth);
+
+ for (i = 0; i < 4; i++)
+ {
+ LL v;
+ v.a = M_PI * 0.197; /* #### Empirical. Also, wrong. What is this? */
+ v.o = i * M_PI * 2 / 4;
+ a = polar_to_cartesian (v);
+ add_sphere_gear (mi, g, a);
+ v.a = -v.a;
+ a = polar_to_cartesian (v);
+ add_sphere_gear (mi, g, a);
+ }
+
+ if (bp->ngears != 14) abort();
+}
+
+
+/* Create 18 identical gears arranged on the faces of ... something.
+ I'm not sure what polyhedron is the basis of this.
+ */
+static void
+make_18 (ModeInfo *mi)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ gear *g, *g2;
+ XYZ a;
+ int i;
+ GLfloat r = 0.3830;
+ int sizes[] = { 8, 12, 16, 20 }; /* 10, 14, 18, 26 and 34 don't work */
+ int teeth = sizes[random() % countof(sizes)] * (1 + (random() % 4));
+
+ /* North, south */
+ g = add_gear_shape (mi, r, teeth);
+ a.x = 0; a.y = 0; a.z = 1;
+ add_sphere_gear (mi, g, a);
+ a.z = -1;
+ add_sphere_gear (mi, g, a);
+
+ /* Equator */
+ g2 = add_gear_shape (mi, r, teeth);
+ a.z = 0;
+ for (i = 0; i < 8; i++)
+ {
+ GLfloat th = i * M_PI * 2 / 8 + (M_PI / 4);
+ a.x = cos(th);
+ a.y = sin(th);
+ add_sphere_gear (mi, (i & 1 ? g : g2), a);
+ }
+
+ /* The other 16 */
+ g = add_gear_shape (mi, r, teeth);
+
+ for (i = 0; i < 4; i++)
+ {
+ LL v;
+ v.a = M_PI * 0.25;
+ v.o = i * M_PI * 2 / 4;
+ a = polar_to_cartesian (v);
+ add_sphere_gear (mi, g, a);
+ v.a = -v.a;
+ a = polar_to_cartesian (v);
+ add_sphere_gear (mi, g, a);
+ }
+
+ if (bp->ngears != 18) abort();
+}
+
+
+/* Create 32 gears arranged along a truncated icosahedron:
+ One gear on each of the 20 faces, and one on each of the 12 vertices.
+ */
+static void
+make_32 (ModeInfo *mi, const GLfloat *args)
+{
+ /* http://bugman123.com/Gears/32GearSpheres/ */
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat th0 = atan (0.5); /* lat division: 26.57 deg */
+ GLfloat s = M_PI / 5; /* lon division: 72 deg */
+ int i;
+
+ int teeth1 = args[0];
+ int teeth2 = args[1];
+ GLfloat r1 = args[2];
+ GLfloat ratio = teeth2 / (GLfloat) teeth1;
+ GLfloat r2 = r1 * ratio;
+
+ gear *gear1, *gear2;
+
+ if (teeth1 % 5) abort();
+ if (teeth2 % 6) abort();
+
+ gear1 = add_gear_shape (mi, r1, teeth1);
+ gear2 = add_gear_shape (mi, r2, teeth2);
+ gear2->ratio = 1 / ratio;
+
+ {
+ XYZ a = { 0, 0, 1 };
+ XYZ b = { 0, 0, -1 };
+ add_sphere_gear (mi, gear1, a);
+ add_sphere_gear (mi, gear1, b);
+ }
+
+ for (i = 0; i < 10; i++)
+ {
+ GLfloat th1 = s * i;
+ GLfloat th2 = s * (i+1);
+ GLfloat th3 = s * (i+2);
+ LL v1, v2, v3, vc;
+ XYZ p1, p2, p3, pc, pc2;
+ v1.a = th0; v1.o = th1;
+ v2.a = th0; v2.o = th3;
+ v3.a = -th0; v3.o = th2;
+ vc.a = M_PI/2; vc.o = th2;
+
+ if (! (i & 1)) /* southern hemisphere */
+ {
+ v1.a = -v1.a;
+ v2.a = -v2.a;
+ v3.a = -v3.a;
+ vc.a = -vc.a;
+ }
+
+ p1 = polar_to_cartesian (v1);
+ p2 = polar_to_cartesian (v2);
+ p3 = polar_to_cartesian (v3);
+ pc = polar_to_cartesian (vc);
+
+ /* Two faces: 123 and 12c. */
+
+ add_sphere_gear (mi, gear1, p1); /* left shared point of 2 triangles */
+
+ pc2.x = (p1.x + p2.x + p3.x) / 3; /* center of bottom triangle */
+ pc2.y = (p1.y + p2.y + p3.y) / 3;
+ pc2.z = (p1.z + p2.z + p3.z) / 3;
+ add_sphere_gear (mi, gear2, pc2);
+
+ pc2.x = (p1.x + p2.x + pc.x) / 3; /* center of top triangle */
+ pc2.y = (p1.y + p2.y + pc.y) / 3;
+ pc2.z = (p1.z + p2.z + pc.z) / 3;
+ add_sphere_gear (mi, gear2, pc2);
+ }
+
+ if (bp->ngears != 32) abort();
+}
+
+
+/* Create 92 gears arranged along a geodesic sphere: 20 + 12 + 60.
+ (frequency 3v, class-I geodesic tessellation of an icosahedron)
+ */
+static void
+make_92 (ModeInfo *mi, const GLfloat *args)
+{
+ /* http://bugman123.com/Gears/92GearSpheres/ */
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat th0 = atan (0.5); /* lat division: 26.57 deg */
+ GLfloat s = M_PI / 5; /* lon division: 72 deg */
+ int i;
+
+ int tscale = 2; /* These don't mesh properly, so let's increase the
+ number of teeth so that it's not so obvious. */
+
+ int teeth1 = args[0] * tscale;
+ int teeth2 = args[1] * tscale;
+ int teeth3 = args[2] * tscale;
+ GLfloat r1 = args[3];
+ GLfloat ratio2 = teeth2 / (GLfloat) teeth1;
+ GLfloat ratio3 = teeth3 / (GLfloat) teeth2;
+ GLfloat r2 = r1 * ratio2;
+ GLfloat r3 = r2 * ratio3;
+
+ GLfloat r4 = args[4]; /* #### Empirical. Not sure what its basis is. */
+ GLfloat r5 = 1 - r4;
+
+ gear *gear1, *gear2, *gear3;
+
+ gear1 = add_gear_shape (mi, r1, teeth1);
+ gear2 = add_gear_shape (mi, r2, teeth2);
+ gear3 = add_gear_shape (mi, r3, teeth3);
+ gear2->ratio = 1 / ratio2;
+ gear3->ratio = 1 / ratio3;
+
+ {
+ XYZ a = { 0, 0, 1 };
+ XYZ b = { 0, 0, -1 };
+ add_sphere_gear (mi, gear1, a);
+ add_sphere_gear (mi, gear1, b);
+ }
+
+ for (i = 0; i < 10; i++)
+ {
+ GLfloat th1 = s * i;
+ GLfloat th2 = s * (i+1);
+ GLfloat th3 = s * (i+2);
+ LL v1, v2, v3, vc;
+ XYZ p1, p2, p3, pc, pc2;
+ v1.a = th0; v1.o = th1;
+ v2.a = th0; v2.o = th3;
+ v3.a = -th0; v3.o = th2;
+ vc.a = M_PI/2; vc.o = th2;
+
+ if (! (i & 1)) /* southern hemisphere */
+ {
+ v1.a = -v1.a;
+ v2.a = -v2.a;
+ v3.a = -v3.a;
+ vc.a = -vc.a;
+ }
+
+ p1 = polar_to_cartesian (v1);
+ p2 = polar_to_cartesian (v2);
+ p3 = polar_to_cartesian (v3);
+ pc = polar_to_cartesian (vc);
+
+ /* Two faces: 123 and 12c. */
+
+ add_sphere_gear (mi, gear1, p1); /* left shared point of 2 triangles */
+
+ pc2.x = (p1.x + p2.x + p3.x) / 3; /* center of bottom triangle */
+ pc2.y = (p1.y + p2.y + p3.y) / 3;
+ pc2.z = (p1.z + p2.z + p3.z) / 3;
+ add_sphere_gear (mi, gear2, pc2);
+
+ pc2.x = (p1.x + p2.x + pc.x) / 3; /* center of top triangle */
+ pc2.y = (p1.y + p2.y + pc.y) / 3;
+ pc2.z = (p1.z + p2.z + pc.z) / 3;
+ add_sphere_gear (mi, gear2, pc2);
+
+ /* left edge of bottom triangle, 1/3 in */
+ pc2.x = p1.x + (p3.x - p1.x) * r4;
+ pc2.y = p1.y + (p3.y - p1.y) * r4;
+ pc2.z = p1.z + (p3.z - p1.z) * r4;
+ add_sphere_gear (mi, gear3, pc2);
+
+ /* left edge of bottom triangle, 2/3 in */
+ pc2.x = p1.x + (p3.x - p1.x) * r5;
+ pc2.y = p1.y + (p3.y - p1.y) * r5;
+ pc2.z = p1.z + (p3.z - p1.z) * r5;
+ add_sphere_gear (mi, gear3, pc2);
+
+ /* left edge of top triangle, 1/3 in */
+ pc2.x = p1.x + (pc.x - p1.x) * r4;
+ pc2.y = p1.y + (pc.y - p1.y) * r4;
+ pc2.z = p1.z + (pc.z - p1.z) * r4;
+ add_sphere_gear (mi, gear3, pc2);
+
+ /* left edge of top triangle, 2/3 in */
+ pc2.x = p1.x + (pc.x - p1.x) * r5;
+ pc2.y = p1.y + (pc.y - p1.y) * r5;
+ pc2.z = p1.z + (pc.z - p1.z) * r5;
+ add_sphere_gear (mi, gear3, pc2);
+
+ /* center of shared edge, 1/3 in */
+ pc2.x = p1.x + (p2.x - p1.x) * r4;
+ pc2.y = p1.y + (p2.y - p1.y) * r4;
+ pc2.z = p1.z + (p2.z - p1.z) * r4;
+ add_sphere_gear (mi, gear3, pc2);
+
+ /* center of shared edge, 2/3 in */
+ pc2.x = p1.x + (p2.x - p1.x) * r5;
+ pc2.y = p1.y + (p2.y - p1.y) * r5;
+ pc2.z = p1.z + (p2.z - p1.z) * r5;
+ add_sphere_gear (mi, gear3, pc2);
+ }
+
+ if (bp->ngears != 92) abort();
+}
+
+static void
+make_182 (ModeInfo *mi, const GLfloat *args)
+{
+ /* #### TODO: http://bugman123.com/Gears/182GearSpheres/ */
+ abort();
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_geodesic (ModeInfo *mi, int width, int height)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+static void
+pick_shape (ModeInfo *mi, time_t last)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ int count = countof (gear_templates);
+
+ if (bp->colors)
+ free (bp->colors);
+
+ bp->ncolors = 1024;
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+
+ free_sphere_gears (mi);
+
+ if (last == 0)
+ {
+ bp->which = random() % count;
+ }
+ else if (bp->next < 0)
+ {
+ bp->which--;
+ if (bp->which < 0) bp->which = count-1;
+ bp->next = 0;
+ }
+ else if (bp->next > 0)
+ {
+ bp->which++;
+ if (bp->which >= count) bp->which = 0;
+ bp->next = 0;
+ }
+ else
+ {
+ int n = bp->which;
+ while (n == bp->which)
+ n = random() % count;
+ bp->which = n;
+ }
+
+ switch (gear_templates[bp->which].type) {
+ case PRISM: make_prism (mi); break;
+ case OCTO: make_octo (mi); break;
+ case DECA: make_deca (mi); break;
+ case G14: make_14 (mi); break;
+ case G18: make_18 (mi); break;
+ case G32: make_32 (mi, gear_templates[bp->which].args); break;
+ case G92: make_92 (mi, gear_templates[bp->which].args); break;
+ case G182: make_182(mi, gear_templates[bp->which].args); break;
+ default: abort(); break;
+ }
+
+ sort_gears (mi);
+}
+
+
+
+ENTRYPOINT void
+init_geodesic (ModeInfo *mi)
+{
+ geodesic_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_geodesic (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ {
+ static GLfloat cspec[4] = {1.0, 1.0, 1.0, 1.0};
+ static const GLfloat shiny = 128.0;
+
+ static GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ static GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ static GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ static GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, cspec);
+ glMateriali (GL_FRONT, GL_SHININESS, shiny);
+ }
+
+ if (! wire)
+ {
+ glEnable (GL_DEPTH_TEST);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable (GL_LIGHTING);
+ glEnable (GL_LIGHT0);
+ }
+
+ if (! bp->rot)
+ {
+ double spin_speed = 0.25 * speed;
+ double wander_speed = 0.01 * speed;
+ double spin_accel = 0.2;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ True);
+ bp->trackball = gltrackball_init (True);
+ }
+
+ bp->font = load_texture_font (MI_DISPLAY(mi), "font");
+
+ pick_shape (mi, 0);
+}
+
+
+ENTRYPOINT Bool
+geodesic_handle_event (ModeInfo *mi, XEvent *event)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else
+ {
+ if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == '<' || c == ',' || c == '-' || c == '_' ||
+ keysym == XK_Left || keysym == XK_Up || keysym == XK_Prior)
+ {
+ bp->next = -1;
+ goto SWITCH;
+ }
+ else if (c == '>' || c == '.' || c == '=' || c == '+' ||
+ keysym == XK_Right || keysym == XK_Down ||
+ keysym == XK_Next)
+ {
+ bp->next = 1;
+ goto SWITCH;
+ }
+ }
+
+ if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ SWITCH:
+ bp->mode = 1;
+ bp->mode_tick = 4;
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+draw_geodesic (ModeInfo *mi)
+{
+ time_t now = time ((time_t *) 0);
+ int wire = MI_IS_WIREFRAME(mi);
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+
+ if (bp->draw_time == 0)
+ {
+ pick_shape (mi, bp->draw_time);
+ bp->draw_time = now;
+ }
+ else if (bp->mode == 0)
+ {
+ if (bp->draw_tick++ > 10)
+ {
+ if (bp->draw_time == 0) bp->draw_time = now;
+ bp->draw_tick = 0;
+
+ if (!bp->button_down_p &&
+ bp->draw_time + timeout <= now)
+ {
+ /* randomize every -timeout seconds */
+ bp->mode = 1; /* go out */
+ bp->mode_tick = 10 / speed;
+ bp->draw_time = now;
+ }
+ }
+ }
+ else if (bp->mode == 1) /* out */
+ {
+ if (--bp->mode_tick <= 0)
+ {
+ bp->mode_tick = 10 / speed;
+ bp->mode = 2; /* go in */
+ pick_shape (mi, bp->draw_time);
+ bp->draw_time = now;
+ }
+ }
+ else if (bp->mode == 2) /* in */
+ {
+ if (--bp->mode_tick <= 0)
+ bp->mode = 0; /* normal */
+ }
+ else
+ abort();
+
+
+ if (! wire)
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 8,
+ (z - 0.5) * 17);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ mi->polygon_count = 0;
+
+ glScalef (6, 6, 6);
+
+ if (bp->ngears < 14)
+ glScalef (0.8, 0.8, 0.8); /* make these a little easier to see */
+
+ if (bp->mode != 0)
+ {
+ GLfloat s = (bp->mode == 1
+ ? bp->mode_tick / (10 / speed)
+ : ((10 / speed) - bp->mode_tick + 1) / (10 / speed));
+ glScalef (s, s, s);
+ }
+
+
+ {
+ int i;
+ for (i = 0; i < bp->ngears; i++)
+ {
+ const sphere_gear *s = &bp->gears[i];
+ const gear *g = s->g;
+
+ XYZ axis;
+ XYZ from = { 0, 1, 0 };
+ XYZ to = s->axis;
+ GLfloat angle;
+ GLfloat off = s->offset;
+
+ /* If an even number of teeth, offset by 1/2 tooth width. */
+ if (s->direction > 0 && !(g->nteeth & 1))
+ off += 360 / g->nteeth / 2;
+
+ axis = cross_product (from, to);
+ angle = acos (dot_product (from, to));
+
+ glPushMatrix();
+ glTranslatef (to.x, to.y, to.z);
+ glRotatef (angle / M_PI * 180, axis.x, axis.y, axis.z);
+ glRotatef (-90, 1, 0, 0);
+ glRotatef(180, 0, 0, 1);
+ glRotatef ((bp->th - off) * g->ratio * s->direction,
+ 0, 0, 1);
+
+ glCallList (g->dlist);
+ mi->polygon_count += g->polygons;
+ glPopMatrix();
+
+#if 0
+ { /* Draw tooth vectors */
+ GLfloat r = 1 - g->z;
+ XYZ pc;
+ int pt = parent_tooth (s, &pc);
+ int t;
+ glDisable(GL_LIGHTING);
+ glLineWidth (8);
+ for (t = 0; t < g->nteeth; t++)
+ {
+ XYZ p = tooth_coords (s, t);
+ XYZ p2;
+ p2.x = (r * s->axis.x + p.x) / 2;
+ p2.y = (r * s->axis.y + p.y) / 2;
+ p2.z = (r * s->axis.z + p.z) / 2;
+
+ if (t == pt)
+ glColor3f(1,0,1);
+ else
+ glColor3f(0,1,1);
+ glBegin(GL_LINES);
+ glVertex3f (p.x, p.y, p.z);
+ glVertex3f (p2.x, p2.y, p2.z);
+ glEnd();
+ }
+ if (!wire) glEnable(GL_LIGHTING);
+ glLineWidth (1);
+ }
+#endif
+
+#if 0
+ { /* Draw the parent/child DAG */
+ GLfloat s1 = 1.1;
+ GLfloat s2 = s->parent ? s1 : 1.5;
+ GLfloat s3 = 1.0;
+ XYZ p1 = s->axis;
+ XYZ p2 = s->parent ? s->parent->axis : p1;
+ glDisable(GL_LIGHTING);
+ glColor3f(0,0,1);
+ glBegin(GL_LINES);
+ glVertex3f (s1 * p1.x, s1 * p1.y, s1 * p1.z);
+ glVertex3f (s2 * p2.x, s2 * p2.y, s2 * p2.z);
+ glVertex3f (s1 * p1.x, s1 * p1.y, s1 * p1.z);
+ glVertex3f (s3 * p1.x, s3 * p1.y, s3 * p1.z);
+ glEnd();
+ if (!wire) glEnable(GL_LIGHTING);
+ }
+#endif
+ }
+
+ /* We need to draw the fonts in a second pass in order to make
+ transparency (as a result of anti-aliasing) work properly.
+ */
+ if (do_numbers && bp->mode == 0)
+ for (i = 0; i < bp->ngears; i++)
+ {
+ const sphere_gear *s = &bp->gears[i];
+ const gear *g = s->g;
+
+ XYZ axis;
+ XYZ from = { 0, 1, 0 };
+ XYZ to = s->axis;
+ GLfloat angle;
+ GLfloat off = s->offset;
+
+ int w, h, j;
+ char buf[100];
+ XCharStruct e;
+
+ /* If an even number of teeth, offset by 1/2 tooth width. */
+ if (s->direction > 0 /* && !(g->nteeth & 1) */)
+ off += 360 / g->nteeth / 2;
+
+ axis = cross_product (from, to);
+ angle = acos (dot_product (from, to));
+
+ glPushMatrix();
+ glTranslatef(to.x, to.y, to.z);
+ glRotatef (angle / M_PI * 180, axis.x, axis.y, axis.z);
+ glRotatef (-90, 1, 0, 0);
+ glRotatef(180, 0, 0, 1);
+ glRotatef ((bp->th - off) * g->ratio * s->direction,
+ 0, 0, 1);
+
+ glDisable (GL_LIGHTING);
+ glColor3f(1, 1, 0);
+ glPushMatrix();
+ glScalef(0.005, 0.005, 0.005);
+ sprintf (buf, "%d", i);
+ texture_string_metrics (bp->font, buf, &e, 0, 0);
+ w = e.width;
+ h = e.ascent + e.descent;
+ glTranslatef (-w/2, -h/2, 0);
+ print_texture_string (bp->font, buf);
+ glPopMatrix();
+
+# if 1
+ for (j = 0; j < g->nteeth; j++) /* Number the teeth */
+ {
+ GLfloat ss = 0.08 * g->r / g->nteeth;
+ GLfloat r = g->r * 0.88;
+ GLfloat th = M_PI - (j * M_PI * 2 / g->nteeth + M_PI/2);
+
+
+ glPushMatrix();
+ glTranslatef (r * cos(th), r * sin(th), -g->z + 0.01);
+ glScalef(ss, ss, ss);
+ sprintf (buf, "%d", j + 1);
+ texture_string_metrics (bp->font, buf, &e, 0, 0);
+ w = e.width;
+ h = e.ascent + e.descent;
+ glTranslatef (-w/2, -h/2, 0);
+ print_texture_string (bp->font, buf);
+ glPopMatrix();
+ }
+# endif
+ glPopMatrix();
+ if (!wire) glEnable(GL_LIGHTING);
+ }
+
+ bp->th += 0.7 * speed; /* Don't mod this to 360 - causes glitches. */
+ }
+
+ if (do_labels && bp->mode == 0)
+ {
+ glColor3f (1, 1, 0);
+ print_texture_label (mi->dpy, bp->font,
+ mi->xgwa.width, mi->xgwa.height,
+ 1, bp->desc);
+ }
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+ENTRYPOINT void
+free_geodesic (ModeInfo *mi)
+{
+ geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+ if (!bp->glx_context)
+ return;
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+ free_texture_font (bp->font);
+ free (bp->colors);
+ free_sphere_gears (mi);
+ if (bp->desc) free (bp->desc);
+}
+
+
+XSCREENSAVER_MODULE_2 ("GeodesicGears", geodesicgears, geodesic)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/geodesicgears.man b/hacks/glx/geodesicgears.man
new file mode 100644
index 0000000..b15cf90
--- /dev/null
+++ b/hacks/glx/geodesicgears.man
@@ -0,0 +1,78 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+geodesicgears - gears on the surface of a sphere.
+.SH SYNOPSIS
+.B geodesicgears
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-timeout \fInumber\fP]
+[\-labels]
+[\-numbers]
+[\-wireframe]
+[\-wander]
+[\-no-spin]
+[\-fps]
+.SH DESCRIPTION
+A set of meshed gears arranged on the surface of a sphere.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
+.TP 8
+.B \-timeout \fInumber\fP
+Duration before switching to a new model. 5 - 120 seconds. Default: 20.
+.TP 8
+.B \-labels | \-no-labels
+Whether to show the number of gears and teeth. Default: no.
+.TP 8
+.B \-numbers | \-no-numbers
+Whether to label the gears with ID numbers. Default: no.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the object should spin.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR geodesic (1),
+.BR pinion (1)
+.SH COPYRIGHT
+Copyright \(co 2014 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/gflux.c b/hacks/glx/gflux.c
new file mode 100644
index 0000000..dbbb11c
--- /dev/null
+++ b/hacks/glx/gflux.c
@@ -0,0 +1,803 @@
+/* -*- Mode: C; tab-width: 4 -*- emacs friendly */
+/* gflux - creates a fluctuating 3D grid
+ * requires OpenGL or MesaGL
+ *
+ * Copyright (c) Josiah Pease, 2000, 2003
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Thanks go to all those who worked on...
+ * MesaGL, OpenGL, UtahGLX, XFree86, gcc, vim, rxvt, the PNM (anymap) format
+ * xscreensaver and the thousands of other tools, apps and daemons that make
+ * linux usable
+ * Personal thanks to Kevin Moss, Paul Sheahee and Jamie Zawinski
+ *
+ * some xscreensaver code lifted from superquadrics. Most other glx hacks
+ * used as reference at some time.
+ *
+ * This hack and others can cause UtahGLX to crash my X server
+ * wireframe looks good with software only rendering anyway
+ * If anyone can work out why and supply a fix I'd love to hear from them
+ *
+ * Josiah Pease <gfluxcode@jpease.force9.co.uk> 21 July 2000
+ *
+ * History
+ * 10 June 2000 : wireframe rippling grid standalone written
+ * 18 June 2000 : xscreensaver code added
+ * 25 June 2000 : solid and light added
+ * 04 July 2000 : majour bug hunt, xscreensaver code rewritten
+ * 08 July 2000 : texture mapping, rotation and zoom added
+ * 21 July 2000 : cleaned up code from bug hunts, manpage written
+ * 24 November 2000 : fixed x co-ord calculation in solid - textured
+ * 05 March 2001 : put back non pnmlib code with #ifdefs
+ * 11 May 2002 : fixed image problems with large images
+ */
+
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 20000\n" \
+ "*showFPS: False\n" \
+ "*mode: grab\n" \
+ "*useSHM: True \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_gflux 0
+# define release_gflux 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL /* whole file */
+
+#ifdef HAVE_XMU
+# ifndef VMS
+# include <X11/Xmu/Drawing.h>
+#else /* VMS */
+# include <Xmu/Drawing.h>
+# endif /* VMS */
+#endif
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <math.h>
+
+#include "grab-ximage.h"
+#include "gltrackball.h"
+
+
+static enum {wire=0,solid,light,checker,grab} _draw;
+
+# define DEF_SQUARES "19"
+# define DEF_RESOLUTION "4"
+# define DEF_DRAW "2"
+# define DEF_FLAT "0"
+# define DEF_SPEED "0.05"
+# define DEF_ROTATIONX "0.01"
+# define DEF_ROTATIONY "0.0"
+# define DEF_ROTATIONZ "0.1"
+# define DEF_WAVES "3"
+# define DEF_WAVE_CHANGE "50"
+# define DEF_WAVE_HEIGHT "1.0"
+# define DEF_WAVE_FREQ "3.0"
+# define DEF_ZOOM "1.0"
+
+
+
+static int _squares; /* grid size */
+static int _resolution; /* wireframe resolution */
+static int _flat;
+
+static float _speed;
+static float _rotationx;
+static float _rotationy;
+static float _rotationz;
+static float _zoom;
+
+static int _waves;
+static int _waveChange;
+static float _waveHeight;
+static float _waveFreq;
+
+
+#define WIDTH 320
+#define HEIGHT 240
+
+static XrmOptionDescRec opts[] = {
+ {"-squares", ".gflux.squares", XrmoptionSepArg, 0},
+ {"-resolution", ".gflux.resolution", XrmoptionSepArg, 0},
+/* {"-draw", ".gflux.draw", XrmoptionSepArg, 0},*/
+ {"-mode", ".gflux.mode", XrmoptionSepArg, 0},
+ {"-wireframe", ".gflux.mode", XrmoptionNoArg, "wire"},
+ {"-flat", ".gflux.flat", XrmoptionSepArg, 0},
+ {"-speed", ".gflux.speed", XrmoptionSepArg, 0},
+ {"-rotationx", ".gflux.rotationx", XrmoptionSepArg, 0},
+ {"-rotationy", ".gflux.rotationy", XrmoptionSepArg, 0},
+ {"-rotationz", ".gflux.rotationz", XrmoptionSepArg, 0},
+ {"-waves", ".gflux.waves", XrmoptionSepArg, 0},
+ {"-waveChange", ".gflux.waveChange", XrmoptionSepArg, 0},
+ {"-waveHeight", ".gflux.waveHeight", XrmoptionSepArg, 0},
+ {"-waveFreq", ".gflux.waveFreq", XrmoptionSepArg, 0},
+ {"-zoom", ".gflux.zoom", XrmoptionSepArg, 0},
+};
+
+
+static argtype vars[] = {
+ {&_squares, "squares", "Squares", DEF_SQUARES, t_Int},
+ {&_resolution, "resolution", "Resolution", DEF_RESOLUTION, t_Int},
+/* {&_draw, "draw", "Draw", DEF_DRAW, t_Int},*/
+ {&_flat, "flat", "Flat", DEF_FLAT, t_Int},
+ {&_speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&_rotationx, "rotationx", "Rotationx", DEF_ROTATIONX, t_Float},
+ {&_rotationy, "rotationy", "Rotationy", DEF_ROTATIONY, t_Float},
+ {&_rotationz, "rotationz", "Rotationz", DEF_ROTATIONZ, t_Float},
+ {&_waves, "waves", "Waves", DEF_WAVES, t_Int},
+ {&_waveChange, "waveChange", "WaveChange", DEF_WAVE_CHANGE, t_Int},
+ {&_waveHeight, "waveHeight", "WaveHeight", DEF_WAVE_HEIGHT, t_Float},
+ {&_waveFreq, "waveFreq", "WaveFreq", DEF_WAVE_FREQ, t_Float},
+ {&_zoom, "zoom", "Zoom", DEF_ZOOM, t_Float},
+};
+
+
+static OptionStruct desc[] =
+{
+ {"-squares num", "size of grid in squares (19)"},
+ {"-resolution num", "detail of lines making grid, wireframe only (4)"},
+/* {"-draw num", "draw method to use: 0=wireframe 1=solid 2=lit (0)"},*/
+ {"-flat num", "shading method, not wireframe: 0=smooth 1=flat (0)"},
+ {"-speed num", "speed of waves (0.05)"},
+ {"-rotationx num", "speed of xrotation (0.01)"},
+ {"-rotationy num", "speed of yrotation (0.00)"},
+ {"-rotationz num", "speed of zrotation (0.10)"},
+ {"-waves num", "number of simultanious waves (3)"},
+ {"-waveChange num", "number of cyles for a wave to change (50)"},
+ {"-waveHeight num", "height of waves (1.0)"},
+ {"-waveFreq num", "max frequency of a wave (3.0)"},
+ {"-zoom num", "camera control (1.0)"},
+};
+
+ENTRYPOINT ModeSpecOpt gflux_opts = {countof(opts), opts, countof(vars), vars, desc};
+
+#ifdef USE_MODULES
+ModStruct gflux_description =
+{"gflux", "init_gflux", "draw_gflux", NULL,
+ "draw_gflux", "init_gflux", NULL, &gflux_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "GFlux: an OpenGL gflux", 0, NULL};
+#endif
+
+/* structure for holding the gflux data */
+typedef struct gfluxstruct {
+ ModeInfo *modeinfo;
+ int screen_width, screen_height;
+ GLXContext *glx_context;
+ Window window;
+ XColor fg, bg;
+#define MAXWAVES 10 /* should be dynamic */
+ double wa[MAXWAVES];
+ double freq[MAXWAVES];
+ double dispy[MAXWAVES];
+ double dispx[MAXWAVES];
+ GLfloat colour[3];
+ GLuint texName;
+ GLfloat tex_xscale;
+ GLfloat tex_yscale;
+ XRectangle img_geom;
+ int img_width, img_height;
+ int (*drawFunc)(struct gfluxstruct *);
+
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ double time;
+ double anglex;
+ double angley;
+ double anglez;
+
+ int counter;
+ int newWave;
+
+ Bool mipmap_p;
+ Bool waiting_for_image_p;
+
+} gfluxstruct;
+static gfluxstruct *gfluxes = NULL;
+
+/* prototypes */
+static void initLighting(void);
+static void grabTexture(gfluxstruct *);
+static void createTexture(gfluxstruct *);
+static int displaySolid(gfluxstruct *); /* drawFunc implementations */
+static int displayLight(gfluxstruct *);
+static int displayTexture(gfluxstruct *);
+static int displayWire(gfluxstruct *);
+static void calcGrid(gfluxstruct *);
+static double getGrid(gfluxstruct *,double,double,double);
+
+/* as macro for speed */
+/* could do with colour cycling here */
+/* void genColour(double);*/
+#define genColour(X) \
+{\
+ gp->colour[0] = 0.0;\
+ gp->colour[1] = 0.5+0.5*(X);\
+ gp->colour[2] = 0.5-0.5*(X);\
+}
+
+/* BEGINNING OF FUNCTIONS */
+
+
+ENTRYPOINT Bool
+gflux_handle_event (ModeInfo *mi, XEvent *event)
+{
+ gfluxstruct *gp = &gfluxes[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, gp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &gp->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ if (_draw == grab) {
+ grabTexture(gp);
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+static void
+userRot(gfluxstruct *gp)
+{
+ gltrackball_rotate (gp->trackball);
+}
+
+/* draw the gflux once */
+ENTRYPOINT void draw_gflux(ModeInfo * mi)
+{
+ gfluxstruct *gp = &gfluxes[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!gp->glx_context) return;
+
+ /* Just keep running before the texture has come in. */
+ /* if (gp->waiting_for_image_p) return; */
+
+ glXMakeCurrent(display, window, *(gp->glx_context));
+
+ calcGrid(gp);
+ mi->polygon_count = gp->drawFunc(gp);
+ if (mi->fps_p) do_fps (mi);
+ glXSwapBuffers(display, window);
+}
+
+
+/* Standard reshape function */
+ENTRYPOINT void
+reshape_gflux(ModeInfo *mi, int width, int height)
+{
+ glViewport( 0, 0, width, height );
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-_zoom,_zoom,-0.8*_zoom,0.8*_zoom,2,6);
+ glTranslatef(0.0,0.0,-4.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+}
+
+
+/* main OpenGL initialization routine */
+static void initializeGL(ModeInfo *mi, GLsizei width, GLsizei height)
+{
+ gfluxstruct *gp = &gfluxes[MI_SCREEN(mi)];
+
+ reshape_gflux(mi, width, height);
+ glViewport( 0, 0, width, height );
+
+ gp->tex_xscale = 1.0; /* maybe changed later */
+ gp->tex_yscale = 1.0;
+
+ switch(_draw) {
+ case solid :
+ gp->drawFunc = (displaySolid);
+ glEnable(GL_DEPTH_TEST);
+ break;
+ case light :
+ gp->drawFunc = (displayLight);
+ glEnable(GL_DEPTH_TEST);
+ initLighting();
+ break;
+ case checker :
+ gp->drawFunc = (displayTexture);
+ glEnable(GL_DEPTH_TEST);
+ createTexture(gp);
+ initLighting();
+ break;
+ case grab :
+ gp->drawFunc = (displayTexture);
+ glEnable(GL_DEPTH_TEST);
+ grabTexture(gp);
+ initLighting();
+ break;
+ case wire :
+ default :
+ gp->drawFunc = (displayWire);
+ glDisable(GL_DEPTH_TEST);
+ break;
+ }
+
+ if(_flat) glShadeModel(GL_FLAT);
+ else glShadeModel(GL_SMOOTH);
+
+}
+
+
+/* xgflux initialization routine */
+ENTRYPOINT void init_gflux(ModeInfo * mi)
+{
+ int screen = MI_SCREEN(mi);
+ gfluxstruct *gp;
+
+ MI_INIT(mi, gfluxes);
+ gp = &gfluxes[screen];
+
+ gp->trackball = gltrackball_init (True);
+
+ gp->time = frand(1000.0); /* don't run two screens in lockstep */
+
+ {
+ char *s = get_string_resource (mi->dpy, "mode", "Mode");
+ if (!s || !*s) _draw = grab;
+ else if (!strcasecmp (s, "wire")) _draw = wire;
+ else if (!strcasecmp (s, "solid")) _draw = solid;
+ else if (!strcasecmp (s, "light")) _draw = light;
+ else if (!strcasecmp (s, "checker")) _draw = checker;
+ else if (!strcasecmp (s, "grab")) _draw = grab;
+ else
+ {
+ fprintf (stderr,
+ "%s: mode must be one of: wire, solid, "
+ "light, checker, or grab; not \"%s\"\n",
+ progname, s);
+ exit (1);
+ }
+ }
+
+ gp->modeinfo = mi;
+ gp->window = MI_WINDOW(mi);
+ if ((gp->glx_context = init_GL(mi)) != NULL) {
+ reshape_gflux(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ initializeGL(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+
+static void createTexture(gfluxstruct *gp)
+{
+ int size = 4;
+ unsigned int data[] = { 0xFFFFFFFF, 0xAAAAAAAA, 0xFFFFFFFF, 0xAAAAAAAA,
+ 0xAAAAAAAA, 0xFFFFFFFF, 0xAAAAAAAA, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xAAAAAAAA, 0xFFFFFFFF, 0xAAAAAAAA,
+ 0xAAAAAAAA, 0xFFFFFFFF, 0xAAAAAAAA, 0xFFFFFFFF };
+
+ gp->tex_xscale = size;
+ gp->tex_yscale = size;
+
+ glGenTextures (1, &gp->texName);
+ glBindTexture (GL_TEXTURE_2D, gp->texName);
+
+ glTexImage2D (GL_TEXTURE_2D, 0, 3, size, size, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, data);
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+}
+
+
+static void
+image_loaded_cb (const char *filename, XRectangle *geometry,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure)
+{
+ gfluxstruct *gp = (gfluxstruct *) closure;
+ gp->img_geom = *geometry;
+
+ gp->tex_xscale = (GLfloat) image_width / texture_width;
+ gp->tex_yscale = -(GLfloat) image_height / texture_height;
+ gp->img_width = image_width;
+ gp->img_height = image_height;
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+ (gp->mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
+
+ gp->waiting_for_image_p = False;
+}
+
+static void
+grabTexture(gfluxstruct *gp)
+{
+ if (MI_IS_WIREFRAME(gp->modeinfo))
+ return;
+
+ gp->waiting_for_image_p = True;
+ gp->mipmap_p = True;
+ load_texture_async (gp->modeinfo->xgwa.screen, gp->modeinfo->window,
+ *gp->glx_context, 0, 0, gp->mipmap_p, gp->texName,
+ image_loaded_cb, gp);
+}
+
+
+static void initLighting(void)
+{
+ static const float ambientA[] = {0.0, 0.0, 0.0, 1.0};
+ static const float diffuseA[] = {1.0, 1.0, 1.0, 1.0};
+ static const float positionA[] = {5.0, 5.0, 15.0, 1.0};
+
+ static const float front_mat_shininess[] = {30.0};
+ static const float front_mat_specular[] = {0.5, 0.5, 0.5, 1.0};
+
+ static const float mat_diffuse[] = {0.5, 0.5, 0.5, 1.0};
+
+ glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambientA);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseA);
+ glLightfv(GL_LIGHT0, GL_POSITION, positionA);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightModelf(GL_LIGHT_MODEL_TWO_SIDE,1);
+
+ glEnable(GL_NORMALIZE); /* would it be faster ... */
+ glEnable(GL_COLOR_MATERIAL);
+ glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
+}
+
+/************************************/
+/* draw implementations */
+/* somewhat inefficient since they */
+/* all calculate previously */
+/* calculated values again */
+/* storing the values in an array */
+/* is a posibility */
+/************************************/
+static int displayTexture(gfluxstruct *gp)
+{
+ int polys = 0;
+ double x,y,u,v;
+ double z;
+ double dx = 2.0/((double)_squares);
+ double dy = 2.0/((double)_squares);
+
+ double du = 2.0/((double)_squares);
+ double dv = 2.0/((double)_squares);
+
+ double xs = gp->tex_xscale;
+ double ys = gp->tex_yscale;
+
+ double minx, miny, maxx, maxy;
+ double minu, minv;
+
+#if 0
+ minx = (GLfloat) gp->img_geom.x / gp->img_width;
+ miny = (GLfloat) gp->img_geom.y / gp->img_height;
+ maxx = ((GLfloat) (gp->img_geom.x + gp->img_geom.width) /
+ gp->img_width);
+ maxy = ((GLfloat) (gp->img_geom.y + gp->img_geom.height) /
+ gp->img_height);
+ minu = minx;
+ minv = miny;
+ minx = (minx * 2) - 1;
+ miny = (miny * 2) - 1;
+ maxx = (maxx * 2) - 1;
+ maxy = (maxy * 2) - 1;
+#else
+ minx = -1;
+ miny = -1;
+ maxx = 1;
+ maxy = 1;
+ minv = 0;
+ minu = 0;
+#endif
+
+ glMatrixMode (GL_TEXTURE);
+ glLoadIdentity ();
+ glTranslatef(-1,-1,0);
+ glScalef(0.5,0.5,1);
+ glMatrixMode (GL_MODELVIEW);
+
+ glLoadIdentity();
+ userRot(gp);
+ glRotatef(gp->anglex,1,0,0);
+ glRotatef(gp->angley,0,1,0);
+ glRotatef(gp->anglez,0,0,1);
+ glScalef(1,1,(GLfloat)_waveHeight);
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+ glEnable(GL_TEXTURE_2D);
+
+ clear_gl_error();
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glBindTexture(GL_TEXTURE_2D, gp->texName);
+ check_gl_error("texture binding");
+
+ glColor3f(0.5,0.5,0.5);
+
+ for(x = minx, u = minu; x < maxx - 0.01; x += dx, u += du) {
+ glBegin(GL_QUAD_STRIP);
+ for (y = miny, v = minv; y <= maxy + 0.01; y += dy, v += dv) {
+ z = getGrid(gp,x,y,gp->time);
+ glTexCoord2f(u*xs,v*ys);
+ glNormal3f(
+ getGrid(gp,x+dx,y,gp->time)-getGrid(gp, x-dx,y,gp->time),
+ getGrid(gp,x,y+dy,gp->time)-getGrid(gp, x,y-dy,gp->time),
+ 1
+ );
+ glVertex3f(x,y,z);
+
+ z = getGrid(gp,x+dx,y,gp->time);
+ glTexCoord2f((u+du)*xs,v*ys);
+ glNormal3f(
+ getGrid(gp,x+dx+dx,y,gp->time)-getGrid(gp, x,y,gp->time),
+ getGrid(gp,x+dx,y+dy,gp->time)-getGrid(gp, x+dx,y-dy,gp->time),
+ 1
+ );
+ glVertex3f(x+dx,y,z);
+ polys++;
+ }
+ glEnd();
+ }
+
+ /* Draw a border around the grid.
+ */
+ glColor3f(0.4, 0.4, 0.4);
+ glDisable(GL_TEXTURE_2D);
+ glEnable (GL_LINE_SMOOTH);
+
+ glBegin(GL_LINE_LOOP);
+ y = miny;
+ for (x = minx; x <= maxx; x += dx) {
+ glVertex3f (x, y, getGrid (gp, x, y, gp->time));
+ polys++;
+ }
+ x = maxx;
+ for (y = miny; y <= maxy; y += dy) {
+ glVertex3f (x, y, getGrid (gp, x, y, gp->time));
+ polys++;
+ }
+ y = maxy;
+ for (x = maxx; x >= minx; x -= dx) {
+ glVertex3f (x, y, getGrid (gp, x, y, gp->time));
+ polys++;
+ }
+ x = minx;
+ for (y = maxy; y >= miny; y -= dy) {
+ glVertex3f (x, y, getGrid (gp, x, y, gp->time));
+ polys++;
+ }
+ glEnd();
+ glEnable(GL_TEXTURE_2D);
+
+ if (! gp->button_down_p) {
+ gp->time -= _speed;
+ gp->anglex -= _rotationx;
+ gp->angley -= _rotationy;
+ gp->anglez -= _rotationz;
+ }
+ return polys;
+}
+
+static int displaySolid(gfluxstruct *gp)
+{
+ int polys = 0;
+ double x,y;
+ double z;
+ double dx = 2.0/((double)_squares);
+ double dy = 2.0/((double)_squares);
+
+ glLoadIdentity();
+ glRotatef(gp->anglex,1,0,0);
+ glRotatef(gp->angley,0,1,0);
+ glRotatef(gp->anglez,0,0,1);
+ userRot(gp);
+ glScalef(1,1,(GLfloat)_waveHeight);
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+
+ for(x=-1;x<0.9999;x+=dx) {
+ glBegin(GL_QUAD_STRIP);
+ for(y=-1;y<=1;y+=dy) {
+ z = getGrid(gp, x,y,gp->time);
+ genColour(z);
+ glColor3fv(gp->colour);
+ glVertex3f(x,y,z);
+
+ z = getGrid(gp, x+dx,y,gp->time);
+ genColour(z);
+ glColor3fv(gp->colour);
+ glVertex3f(x+dx,y,z);
+ polys++;
+ }
+ glEnd();
+ }
+
+ if (! gp->button_down_p) {
+ gp->time -= _speed;
+ gp->anglex -= _rotationx;
+ gp->angley -= _rotationy;
+ gp->anglez -= _rotationz;
+ }
+
+ return polys;
+}
+
+static int displayLight(gfluxstruct *gp)
+{
+ int polys = 0;
+ double x,y;
+ double z;
+ double dx = 2.0/((double)_squares);
+ double dy = 2.0/((double)_squares);
+
+ glLoadIdentity();
+ glRotatef(gp->anglex,1,0,0);
+ glRotatef(gp->angley,0,1,0);
+ glRotatef(gp->anglez,0,0,1);
+ userRot(gp);
+ glScalef(1,1,(GLfloat)_waveHeight);
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+
+ for(x=-1;x<0.9999;x+=dx) {
+ glBegin(GL_QUAD_STRIP);
+ for(y=-1;y<=1;y+=dy) {
+ z = getGrid(gp, x,y,gp->time);
+ genColour(z);
+ glColor3fv(gp->colour);
+ glNormal3f(
+ getGrid(gp, x+dx,y,gp->time)-getGrid(gp, x-dx,y,gp->time),
+ getGrid(gp, x,y+dy,gp->time)-getGrid(gp, x,y-dy,gp->time),
+ 1
+ );
+ glVertex3f(x,y,z);
+
+ z = getGrid(gp, x+dx,y,gp->time);
+ genColour(z);
+ glColor3fv(gp->colour);
+ glNormal3f(
+ getGrid(gp, x+dx+dx,y,gp->time)-getGrid(gp, x,y,gp->time),
+ getGrid(gp, x+dx,y+dy,gp->time)-getGrid(gp, x+dx,y-dy,gp->time),
+ 1
+ );
+ glVertex3f(x+dx,y,z);
+ polys++;
+ }
+ glEnd();
+ }
+
+ if (! gp->button_down_p) {
+ gp->time -= _speed;
+ gp->anglex -= _rotationx;
+ gp->angley -= _rotationy;
+ gp->anglez -= _rotationz;
+ }
+ return polys;
+}
+
+static int displayWire(gfluxstruct *gp)
+{
+ int polys = 0;
+ double x,y;
+ double z;
+ double dx1 = 2.0/((double)(_squares*_resolution)) - 0.00001;
+ double dy1 = 2.0/((double)(_squares*_resolution)) - 0.00001;
+ double dx2 = 2.0/((double)_squares) - 0.00001;
+ double dy2 = 2.0/((double)_squares) - 0.00001;
+
+ glLoadIdentity();
+ glRotatef(gp->anglex,1,0,0);
+ glRotatef(gp->angley,0,1,0);
+ glRotatef(gp->anglez,0,0,1);
+ userRot(gp);
+ glScalef(1,1,(GLfloat)_waveHeight);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ for(x=-1;x<=1;x+=dx2) {
+ glBegin(GL_LINE_STRIP);
+ for(y=-1;y<=1;y+=dy1) {
+ z = getGrid(gp, x,y,gp->time);
+ genColour(z);
+ glColor3fv(gp->colour);
+ glVertex3f(x,y,z);
+ polys++;
+ }
+ glEnd();
+ }
+ for(y=-1;y<=1;y+=dy2) {
+ glBegin(GL_LINE_STRIP);
+ for(x=-1;x<=1;x+=dx1) {
+ z = getGrid(gp, x,y,gp->time);
+ genColour(z);
+ glColor3fv(gp->colour);
+ glVertex3f(x,y,z);
+ polys++;
+ }
+ glEnd();
+ }
+
+ if (! gp->button_down_p) {
+ gp->time -= _speed;
+ gp->anglex -= _rotationx;
+ gp->angley -= _rotationy;
+ gp->anglez -= _rotationz;
+ }
+ return polys;
+}
+
+/* generates new ripples */
+static void calcGrid(gfluxstruct *gp)
+{
+ double tmp;
+
+ if (gp->button_down_p) return;
+
+ tmp = 1.0/((double)_waveChange);
+ if(!(gp->counter%_waveChange)) {
+ gp->newWave = ((int)(gp->counter*tmp))%_waves;
+ gp->dispx[gp->newWave] = -frand(1.0);
+ gp->dispy[gp->newWave] = -frand(1.0);
+ gp->freq[gp->newWave] = _waveFreq * frand(1.0);
+ gp->wa[gp->newWave] = 0.0;
+ }
+ gp->counter++;
+ gp->wa[gp->newWave] += tmp;
+ gp->wa[(gp->newWave+1)%_waves] -= tmp;
+}
+
+/* returns a height for the grid given time and x,y space co-ords */
+static double getGrid(gfluxstruct *gp, double x, double y, double a)
+{
+ register int i;
+ double retval=0.0;
+ double tmp;
+
+ tmp = 1.0/((float)_waves);
+ for(i=0;i<_waves;i++) {
+ retval += gp->wa[i] * tmp * sin( gp->freq[i]
+ * ( (x+gp->dispx[i]) * (x+gp->dispx[i])
+ + (y+gp->dispy[i]) * (y+gp->dispy[i]) +a ) );
+ }
+ return(retval);
+}
+
+
+XSCREENSAVER_MODULE ("GFlux", gflux)
+
+#endif
diff --git a/hacks/glx/gflux.man b/hacks/glx/gflux.man
new file mode 100644
index 0000000..654aeb4
--- /dev/null
+++ b/hacks/glx/gflux.man
@@ -0,0 +1,111 @@
+.TH XScreenSaver 1 "May 2004"
+.SH NAME
+gflux \- rippling surface graphics hack
+.SH SYNOPSIS
+.B gflux
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP]
+[\-squares \fInum\fP] [\-resolution \fInum\fP] [\-mode \fImode\fP]
+[\-flat \fInum\fP] [\-speed \fInum\fP]
+[\-rotationx \fInum\fP] [\-rotationy \fInum\fP] [\-rotationz \fInum\fP]
+[\-waves \fInum\fP] [\-waveChange \fInum\fP] [\-waveHeight \fInum\fP]
+[\-waveFreq \fInum\fP] [\-zoom \fInum\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+The \fIgflux\fP program draws a colourfull animated rippling square rotating in 3D space.
+.SH OPTIONS
+.I gflux
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-squares \fInum\fP\fP
+Specifies the size of the grid in squares. default 19
+.TP 8
+.B \-resolution \fInum\fP\fP
+Specifies the wireframe detail of the squares. default 4
+.TP 8
+.B \-mode \fImode\fP\fP
+Specifies the draw method: wireframe; solid (meaning a solid colored
+surface); light (same as solid, but with lighting effects);
+checker (a texture-mapped checkerboard pattern); or grab (meaning
+grab an image to manipulate.)
+
+When grabbing images, the image will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
+.TP 8
+.B \-wireframe
+Same as "-mode wire".
+.TP 8
+.B \-flat \fInum\fP\fP
+0 for smooth shading 1 for flat. default 0
+.TP 8
+.B \-speed \fInum\fP\fP
+Specifies speed of ripples flowing over the surface. default 0.05
+.TP 8
+.B \-rotationx \fInum\fP \-rotationy \fInum\fP \-rotationz \fInum\fP\fP
+Specifies the speed of rotation of the surface in these axis
+.TP 8
+.B \-waves \fInum\fP\fP
+Specifies the number of ripple centres at any one time. Values should be greater than 1. default 3
+.TP 8
+.B \-waveChange \fInum\fP\fP
+Specifies the duration of a ripple centre. after this they fade away to be reborn elsewhere with a different frequency. default 50
+.TP 8
+.B \-waveHeight \fInum\fP\fP
+Specifies the height of ripples on the surface. default 1.0
+.TP 8
+.B \-waveFreq \fInum\fP\fP
+Specifies the maximum frequency of ripples. default 3.0
+.TP 8
+.B \-zoom \fInum\fP\fP
+Specifies the size of the viewport. Smaller values fill the screen with rippling surface. default 1.0
+.TP 8
+.B \-delay \fImicroseconds\fP
+How long to pause between frames. Default is 20000, or 0.02 second.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 2000 by Josiah Pease. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Josiah Pease <gflux@jpease.force9.co.uk>, 10-Jun-2000.
+
diff --git a/hacks/glx/glblur.c b/hacks/glx/glblur.c
new file mode 100644
index 0000000..cee020c
--- /dev/null
+++ b/hacks/glx/glblur.c
@@ -0,0 +1,610 @@
+/* glblur --- radial blur using GL textures
+ * Copyright (c) 2002-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * This program draws a box and a few line segments, and generates a flowing
+ * radial blur outward from it -- this causes flowing field effects.
+ * It does this by rendering the scene into a small texture, then repeatedly
+ * rendering increasingly-enlarged and increasingly-transparent versions of
+ * that texture onto the frame buffer.
+ *
+ * As such, it's quite graphics intensive -- don't bother trying to run this
+ * if you don't have hardware-accelerated texture support.
+ *
+ * Inspired by Dario Corno's Radial Blur tutorial:
+ * http://nehe.gamedev.net/tutorials/lesson.asp?l=36
+ */
+
+#define DEFAULTS "*delay: 10000 \n" \
+ "*showFPS: False \n" \
+ "*fpsSolid: True \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_glblur 0
+# define release_glblur 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#undef ABS
+#define ABS(n) ((n)<0?-(n):(n))
+#undef SIGNOF
+#define SIGNOF(n) ((n)<0?-1:1)
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_SPIN "XYZ"
+#define DEF_WANDER "True"
+#define DEF_BLUR_SIZE "15"
+
+typedef struct metaball metaball;
+
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ GLuint obj_dlist0; /* east-west cube faces */
+ GLuint obj_dlist1; /* north-south cube faces */
+ GLuint obj_dlist2; /* up-down cube faces */
+ GLuint obj_dlist3; /* spikes coming out of the cube's corners */
+ GLuint scene_dlist1; /* the cube, rotated and translated */
+ GLuint scene_dlist2; /* the spikes, rotated and translated */
+ int scene_polys1; /* polygons in scene, not counting texture overlay */
+ int scene_polys2; /* polygons in scene, not counting texture overlay */
+
+ GLuint texture;
+ unsigned int *tex_data;
+ int tex_w, tex_h;
+
+ int ncolors;
+ XColor *colors0;
+ XColor *colors1;
+ XColor *colors2;
+ XColor *colors3;
+ int ccolor;
+
+ Bool show_cube_p;
+ Bool show_spikes_p;
+
+} glblur_configuration;
+
+static glblur_configuration *bps = NULL;
+
+static char *do_spin;
+static Bool do_wander;
+static int blursize;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionSepArg, 0 },
+ { "+spin", ".spin", XrmoptionNoArg, "" },
+ { "-blursize", ".blurSize", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_String},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&blursize, "blurSize","BlurSize", DEF_BLUR_SIZE, t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt glblur_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_glblur (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+
+ glViewport (0, 0, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 8.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+
+/* Objects in the scene
+ */
+
+static void
+generate_object (ModeInfo *mi)
+{
+ glblur_configuration *bp = &bps[MI_SCREEN(mi)];
+ Bool wire = MI_IS_WIREFRAME (mi);
+ int s = 10;
+
+ bp->scene_polys1 = 0;
+ bp->scene_polys2 = 0;
+
+ glNewList (bp->obj_dlist0, GL_COMPILE);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* front */
+ glNormal3f (0, 0, 1);
+ glTexCoord2f(1, 0); glVertex3f ( 0.5, -0.5, 0.5);
+ glTexCoord2f(0, 0); glVertex3f ( 0.5, 0.5, 0.5);
+ glTexCoord2f(0, 1); glVertex3f (-0.5, 0.5, 0.5);
+ glTexCoord2f(1, 1); glVertex3f (-0.5, -0.5, 0.5);
+ bp->scene_polys1++;
+ glEnd();
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* back */
+ glNormal3f (0, 0, -1);
+ glTexCoord2f(0, 0); glVertex3f (-0.5, -0.5, -0.5);
+ glTexCoord2f(0, 1); glVertex3f (-0.5, 0.5, -0.5);
+ glTexCoord2f(1, 1); glVertex3f ( 0.5, 0.5, -0.5);
+ glTexCoord2f(1, 0); glVertex3f ( 0.5, -0.5, -0.5);
+ bp->scene_polys1++;
+ glEnd();
+ glEndList();
+
+ glNewList (bp->obj_dlist1, GL_COMPILE);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* left */
+ glNormal3f (-1, 0, 0);
+ glTexCoord2f(1, 1); glVertex3f (-0.5, 0.5, 0.5);
+ glTexCoord2f(1, 0); glVertex3f (-0.5, 0.5, -0.5);
+ glTexCoord2f(0, 0); glVertex3f (-0.5, -0.5, -0.5);
+ glTexCoord2f(0, 1); glVertex3f (-0.5, -0.5, 0.5);
+ bp->scene_polys1++;
+ glEnd();
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* right */
+ glNormal3f (1, 0, 0);
+ glTexCoord2f(1, 1); glVertex3f ( 0.5, -0.5, -0.5);
+ glTexCoord2f(1, 0); glVertex3f ( 0.5, 0.5, -0.5);
+ glTexCoord2f(0, 0); glVertex3f ( 0.5, 0.5, 0.5);
+ glTexCoord2f(0, 1); glVertex3f ( 0.5, -0.5, 0.5);
+ bp->scene_polys1++;
+ glEnd();
+ glEndList();
+
+ glNewList (bp->obj_dlist2, GL_COMPILE);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* top */
+ glNormal3f (0, 1, 0);
+ glTexCoord2f(0, 0); glVertex3f ( 0.5, 0.5, 0.5);
+ glTexCoord2f(0, 1); glVertex3f ( 0.5, 0.5, -0.5);
+ glTexCoord2f(1, 1); glVertex3f (-0.5, 0.5, -0.5);
+ glTexCoord2f(1, 0); glVertex3f (-0.5, 0.5, 0.5);
+ bp->scene_polys1++;
+ glEnd();
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS); /* bottom */
+ glNormal3f (0, -1, 0);
+ glTexCoord2f(1, 0); glVertex3f (-0.5, -0.5, 0.5);
+ glTexCoord2f(0, 0); glVertex3f (-0.5, -0.5, -0.5);
+ glTexCoord2f(0, 1); glVertex3f ( 0.5, -0.5, -0.5);
+ glTexCoord2f(1, 1); glVertex3f ( 0.5, -0.5, 0.5);
+ bp->scene_polys1++;
+ glEnd();
+ glEndList();
+
+ glNewList (bp->obj_dlist3, GL_COMPILE);
+ glLineWidth (1);
+ glBegin(GL_LINES);
+ glVertex3f(-s, 0, 0); glVertex3f(s, 0, 0); /* face spikes */
+ glVertex3f(0, -s, 0); glVertex3f(0, s, 0);
+ glVertex3f(0, 0, -s); glVertex3f(0, 0, s);
+ bp->scene_polys2 += 3;
+ glEnd();
+
+ glLineWidth (8);
+ glBegin(GL_LINES);
+ glVertex3f(-s, -s, -s); glVertex3f( s, s, s); /* corner spikes */
+ glVertex3f(-s, -s, s); glVertex3f( s, s, -s);
+ glVertex3f(-s, s, -s); glVertex3f( s, -s, s);
+ glVertex3f( s, -s, -s); glVertex3f(-s, s, s);
+ bp->scene_polys2 += 4;
+ glEnd();
+ glEndList ();
+
+ check_gl_error ("object generation");
+}
+
+
+static void
+init_texture (ModeInfo *mi)
+{
+ glblur_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (bp->tex_data) free (bp->tex_data);
+
+ bp->tex_w = 128;
+ bp->tex_h = 128;
+ bp->tex_data = (unsigned int *)
+ malloc (bp->tex_w * bp->tex_h * 4 * sizeof (unsigned int));
+
+ glGenTextures (1, &bp->texture);
+ glBindTexture (GL_TEXTURE_2D, bp->texture);
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ bp->tex_w, bp->tex_h, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, bp->tex_data);
+ check_gl_error ("texture generation");
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+}
+
+
+static void
+render_scene_to_texture (ModeInfo *mi)
+{
+ glblur_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ glViewport (0, 0, bp->tex_w, bp->tex_h);
+
+ glCallList (bp->scene_dlist1);
+ glCallList (bp->scene_dlist2);
+
+ glBindTexture (GL_TEXTURE_2D, bp->texture);
+ glCopyTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE, 0, 0,
+ bp->tex_w, bp->tex_h, 0);
+ check_gl_error ("texture2D");
+
+ glViewport (0, 0, MI_WIDTH(mi), MI_HEIGHT(mi));
+}
+
+static void
+overlay_blur_texture (ModeInfo *mi)
+{
+ glblur_configuration *bp = &bps[MI_SCREEN(mi)];
+ int w = MI_WIDTH (mi);
+ int h = MI_HEIGHT (mi);
+ int times = blursize;
+ int i;
+ GLfloat inc = 0.02 * (25.0 / times);
+
+ GLfloat spost = 0; /* starting texture coordinate offset */
+ GLfloat alpha_inc; /* transparency fade factor */
+ GLfloat alpha = 0.2; /* initial transparency */
+
+ glEnable (GL_TEXTURE_2D);
+ glDisable (GL_DEPTH_TEST);
+ glBlendFunc (GL_SRC_ALPHA,GL_ONE);
+ glEnable (GL_BLEND);
+ glBindTexture (GL_TEXTURE_2D, bp->texture);
+
+
+ /* switch to orthographic projection, saving both previous matrixes
+ on their respective stacks.
+ */
+ glMatrixMode (GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+ glOrtho (0, w, h, 0, -1, 1);
+ glMatrixMode (GL_MODELVIEW);
+ glPushMatrix();
+ glLoadIdentity();
+
+
+ alpha_inc = alpha / times;
+
+ mi->polygon_count = bp->scene_polys1 + bp->scene_polys2;
+
+ glBegin (GL_QUADS);
+ for (i = 0; i < times; i++)
+ {
+ glColor4f (1, 1, 1, alpha);
+ glTexCoord2f (0+spost, 1-spost); glVertex2f (0, 0);
+ glTexCoord2f (0+spost, 0+spost); glVertex2f (0, h);
+ glTexCoord2f (1-spost, 0+spost); glVertex2f (w, h);
+ glTexCoord2f (1-spost, 1-spost); glVertex2f (w, 0);
+ spost += inc;
+ alpha -= alpha_inc;
+ mi->polygon_count++;
+ }
+ glEnd();
+
+ /* Switch back to perspective projection, restoring the saved matrixes
+ */
+ glMatrixMode (GL_PROJECTION);
+ glPopMatrix();
+ glMatrixMode (GL_MODELVIEW);
+ glPopMatrix();
+
+ glEnable (GL_DEPTH_TEST);
+ glDisable (GL_BLEND);
+ glDisable (GL_TEXTURE_2D);
+ glBindTexture (GL_TEXTURE_2D, 0);
+}
+
+
+
+/* Startup initialization
+ */
+
+ENTRYPOINT Bool
+glblur_handle_event (ModeInfo *mi, XEvent *event)
+{
+ glblur_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_glblur (ModeInfo *mi)
+{
+ glblur_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_glblur (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */
+
+ if (!wire)
+ {
+ GLfloat gamb[4]= {0.2, 0.2, 0.2, 1.0};
+ GLfloat pos[4] = {0.0, 5.0, 10.0, 1.0};
+ GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+ GLfloat dif[4] = {0.3, 0.3, 0.3, 1.0};
+ GLfloat spc[4] = {0.8, 0.8, 0.8, 1.0};
+ GLfloat shiny = 128;
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_NORMALIZE);
+ glShadeModel(GL_SMOOTH);
+
+ glLightModelfv (GL_LIGHT_MODEL_AMBIENT, gamb);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+
+ glMaterialf(GL_FRONT, GL_SHININESS, shiny);
+ }
+
+ {
+ Bool spinx=False, spiny=False, spinz=False;
+ double spin_speed = 0.9;
+ double wander_speed = 0.06;
+
+ char *s = do_spin;
+ while (*s)
+ {
+ if (*s == 'x' || *s == 'X') spinx = True;
+ else if (*s == 'y' || *s == 'Y') spiny = True;
+ else if (*s == 'z' || *s == 'Z') spinz = True;
+ else if (*s == '0') ;
+ else
+ {
+ fprintf (stderr,
+ "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
+ progname, do_spin);
+ exit (1);
+ }
+ s++;
+ }
+
+ bp->rot = make_rotator (spinx ? spin_speed : 0,
+ spiny ? spin_speed : 0,
+ spinz ? spin_speed : 0,
+ 1.0,
+ do_wander ? wander_speed : 0,
+ False);
+ bp->trackball = gltrackball_init (True);
+ }
+
+ if (blursize < 0) blursize = 0;
+ if (blursize > 200) blursize = 200;
+
+ bp->ncolors = 128;
+ bp->colors0 = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ bp->colors1 = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ bp->colors2 = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ bp->colors3 = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0, bp->colors0, &bp->ncolors, False, 0, False);
+ make_smooth_colormap (0, 0, 0, bp->colors1, &bp->ncolors, False, 0, False);
+ make_smooth_colormap (0, 0, 0, bp->colors2, &bp->ncolors, False, 0, False);
+ make_smooth_colormap (0, 0, 0, bp->colors3, &bp->ncolors, False, 0, False);
+ bp->ccolor = 0;
+
+ bp->obj_dlist0 = glGenLists (1);
+ bp->obj_dlist1 = glGenLists (1);
+ bp->obj_dlist2 = glGenLists (1);
+ bp->obj_dlist3 = glGenLists (1);
+ bp->scene_dlist1 = glGenLists (1);
+ bp->scene_dlist2 = glGenLists (1);
+
+ init_texture (mi);
+
+ generate_object (mi);
+}
+
+
+/* Render one frame
+ */
+ENTRYPOINT void
+draw_glblur (ModeInfo *mi)
+{
+ glblur_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ GLfloat color0[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat color1[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat color2[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat color3[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat spec[4] = {1.0, 1.0, 1.0, 1.0};
+
+ double rx, ry, rz;
+ double px, py, pz;
+ int extra_polys = 0;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ /* Decide what we're drawing
+ */
+ if (0 == (random() % 30))
+ {
+ bp->show_cube_p = (0 == (random() % 10));
+ bp->show_spikes_p = (0 == (random() % 20));
+ }
+
+ /* Select new colors for the various objects
+ */
+ color0[0] = bp->colors0[bp->ccolor].red / 65536.0;
+ color0[1] = bp->colors0[bp->ccolor].green / 65536.0;
+ color0[2] = bp->colors0[bp->ccolor].blue / 65536.0;
+
+ color1[0] = bp->colors1[bp->ccolor].red / 65536.0;
+ color1[1] = bp->colors1[bp->ccolor].green / 65536.0;
+ color1[2] = bp->colors1[bp->ccolor].blue / 65536.0;
+
+ color2[0] = bp->colors2[bp->ccolor].red / 65536.0;
+ color2[1] = bp->colors2[bp->ccolor].green / 65536.0;
+ color2[2] = bp->colors2[bp->ccolor].blue / 65536.0;
+
+ color3[0] = bp->colors3[bp->ccolor].red / 65536.0;
+ color3[1] = bp->colors3[bp->ccolor].green / 65536.0;
+ color3[2] = bp->colors3[bp->ccolor].blue / 65536.0;
+
+ bp->ccolor++;
+ if (bp->ccolor >= bp->ncolors) bp->ccolor = 0;
+
+
+ get_position (bp->rot, &px, &py, &pz, !bp->button_down_p);
+ get_rotation (bp->rot, &rx, &ry, &rz, !bp->button_down_p);
+
+ px = (px - 0.5) * 2;
+ py = (py - 0.5) * 2;
+ pz = (pz - 0.5) * 8;
+ rx *= 360;
+ ry *= 360;
+ rz *= 360;
+
+ /* Generate scene_dlist1, which contains the box (not spikes),
+ rotated into position.
+ */
+ glNewList (bp->scene_dlist1, GL_COMPILE);
+ {
+ glMatrixMode (GL_MODELVIEW);
+ glPushMatrix ();
+ glTranslatef (px, py, pz);
+ gltrackball_rotate (bp->trackball);
+ glRotatef (rx, 1.0, 0.0, 0.0);
+ glRotatef (ry, 0.0, 1.0, 0.0);
+ glRotatef (rz, 0.0, 0.0, 1.0);
+
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color0);
+ glCallList (bp->obj_dlist0);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color1);
+ glCallList (bp->obj_dlist1);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color2);
+ glCallList (bp->obj_dlist2);
+
+ glMatrixMode (GL_MODELVIEW);
+ glPopMatrix ();
+ }
+ glEndList ();
+
+
+ /* Generate scene_dlist2, which contains the spikes (not box),
+ rotated into position.
+ */
+ glNewList (bp->scene_dlist2, GL_COMPILE);
+ {
+ glMatrixMode (GL_MODELVIEW);
+ glPushMatrix ();
+ glTranslatef (px, py, pz);
+ gltrackball_rotate (bp->trackball);
+ glRotatef (rx, 1.0, 0.0, 0.0);
+ glRotatef (ry, 0.0, 1.0, 0.0);
+ glRotatef (rz, 0.0, 0.0, 1.0);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color3);
+ glCallList (bp->obj_dlist3);
+
+ glMatrixMode (GL_MODELVIEW);
+ glPopMatrix ();
+ }
+ glEndList ();
+
+
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ render_scene_to_texture (mi);
+
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if (bp->show_cube_p || bp->button_down_p)
+ {
+ glCallList (bp->scene_dlist1);
+ extra_polys += bp->scene_polys1;
+ }
+ if (bp->show_spikes_p || bp->button_down_p)
+ {
+ glCallList (bp->scene_dlist2);
+ extra_polys += bp->scene_polys2;
+ }
+
+ overlay_blur_texture (mi);
+ mi->polygon_count += extra_polys;
+
+ glFlush ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE ("GLBlur", glblur)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/glblur.man b/hacks/glx/glblur.man
new file mode 100644
index 0000000..968f42f
--- /dev/null
+++ b/hacks/glx/glblur.man
@@ -0,0 +1,76 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+glblur - 3D radial blur texture fields
+.SH SYNOPSIS
+.B glblur
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-blursize \fInumber\fP]
+[\-no-wander]
+[\-no-spin]
+[\-spin \fI[XYZ]\fP]
+[\-fps]
+.SH DESCRIPTION
+This program draws a box and a few line segments, and generates a
+radial blur outward from it. This creates flowing field effects.
+
+This is done by rendering the scene into a small texture, then
+repeatedly rendering increasingly-enlarged and increasingly-transparent
+versions of that texture onto the frame buffer. As such, it's quite
+graphics intensive: don't bother trying to run this if you don't have
+hardware-accelerated texture support. It will hurt your machine bad.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-blursize \fInumber\fP
+How many copies of the scene should be laid down to make the vapor trail.
+Default: 15. Larger numbers create smoother fields, but are slower.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin [XYZ]
+Around which axes should the object spin?
+.TP 8
+.B \-no-spin
+None.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski, with inspiration from a tutorial by Dario Corno.
diff --git a/hacks/glx/glcells.c b/hacks/glx/glcells.c
new file mode 100644
index 0000000..adf9866
--- /dev/null
+++ b/hacks/glx/glcells.c
@@ -0,0 +1,1388 @@
+/* -*- Mode: C; tab-width: 2 -*- */
+/* glcells --- Cells growing on your screen */
+
+/*-
+ * Cells growing on your screen
+ *
+ * Copyright (c) 2007 by Matthias Toussaint
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * 2007: Written by Matthias Toussaint
+ * 0.1 Initial version
+ * 0.2 Bugfixes (threading) and code cleanup by Jamie Zawinski
+ * Window scaling bug + performance bug in tick()
+ */
+
+#include <sys/time.h> /* gettimeofday */
+
+#include "xlockmore.h"
+#include <math.h>
+
+/**********************************
+ DEFINES
+ **********************************/
+
+#define INDEX_OFFSET 100000
+#define NUM_CELL_SHAPES 10
+
+#define release_glcells 0
+#define glcells_handle_event xlockmore_no_events
+
+#define DEF_DELAY "20000"
+#define DEF_MAXCELLS "800"
+#define DEF_RADIUS "40"
+#define DEF_SEEDS "1"
+#define DEF_QUALITY "3"
+#define DEF_KEEPOLD "False"
+#define DEF_MINFOOD "5"
+#define DEF_MAXFOOD "20"
+#define DEF_DIVIDEAGE "20"
+#define DEF_MINDIST "1.4"
+#define DEF_PAUSE "50"
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#ifndef HAVE_JWZGLES /* glDrawElements unimplemented... */
+# define USE_VERTEX_ARRAY
+#endif
+
+#define TEX_SIZE 64
+
+/**********************************
+ TYPEDEFS
+ **********************************/
+
+typedef struct /* a 3-D vector */
+{
+ double x, y, z; /* 3-D coordinates (we don't need w here) */
+} Vector;
+
+typedef struct /* a triangle (indexes of vertexes in some list) */
+{
+ int i[3]; /* the three indexes for the triangle corners */
+} Triangle;
+
+typedef struct
+{
+ float *vertex;
+ float *normal;
+ unsigned *index;
+ int num_index;
+} VertexArray;
+
+typedef struct /* an 3-D object without normal vectors */
+{
+ Vector *vertex; /* the vertexes */
+ Triangle *triangle; /* triangle list */
+ int num_vertex; /* number of vertexes */
+ int num_triangle; /* number of triangles */
+} Object;
+
+typedef struct /* an 3-D object with smooth normal vectors */
+{
+ Vector *vertex; /* the vertexes */
+ Vector *normal; /* the vertex normal vectors */
+ Triangle *triangle; /* triangle list */
+ int num_vertex; /* number of vertexes */
+ int num_triangle; /* number of triangles */
+} ObjectSmooth;
+
+typedef struct /* Cell */
+{
+ double x, y; /* position */
+ double vx, vy; /* movement vector */
+ int age; /* cells age */
+ double min_dist; /* minimum distance to other cells */
+ int energy; /* health */
+ double rotation; /* random rot, so they don't look all the same */
+ double radius; /* current size of cell */
+ double growth; /* current growth rate. might be <1.0 while dividing,
+ >1.0 when finished dividing and food is available
+ and 1.0 when grown up */
+} Cell;
+
+typedef struct /* hacks state */
+{
+ GLXContext *glx_context;
+ int width, height; /* current size of viewport */
+ double screen_scale; /* we scale content with window size */
+ int num_cells; /* current number of cell in list */
+ Cell *cell; /* array of cells */
+ int cell_polys;
+ GLfloat color[4]; /* current cell color */
+ double radius; /* cell radius */
+ int move_dist; /* min distance from neighbours for forking */
+ int max_cells; /* maximum number of cells */
+ int num_seeds; /* number of initial seeds */
+ int keep_old_cells; /* draw dead cells? */
+ int divide_age; /* min age for division */
+ /* display lists for the cell stages */
+ int cell_list[NUM_CELL_SHAPES];
+ int nucleus_list;
+ int minfood; /* minimum amount of food per area unit */
+ int maxfood; /* maximum amount of food per area unit */
+ int pause; /* pause at end (all cells dead) */
+ int pause_counter;
+ int wire; /* draw wireframe? */
+ Object *sphere; /* the raw undisturbed sphere */
+ double *disturbance; /* disturbance values for the vertexes */
+ int *food; /* our petri dish (e.g. screen) */
+ GLubyte *texture; /* texture data for nucleus */
+ GLuint texture_name; /* texture name for binding */
+} State;
+
+/**********************************
+ STATIC STUFF
+ **********************************/
+
+static State *sstate = NULL;
+
+static XrmOptionDescRec opts[] = {
+ { "-maxcells", ".maxcells", XrmoptionSepArg, 0 },
+ { "-radius", ".radius", XrmoptionSepArg, 0 },
+ { "-seeds", ".seeds", XrmoptionSepArg, 0 },
+ { "-quality", ".quality", XrmoptionSepArg, 0 },
+ { "-minfood", ".minfood", XrmoptionSepArg, 0 },
+ { "-maxfood", ".maxfood", XrmoptionSepArg, 0 },
+ { "-divideage", ".divideage", XrmoptionSepArg, 0 },
+ { "-mindist", ".mindist", XrmoptionSepArg, 0 },
+ { "-pause", ".pause", XrmoptionSepArg, 0 },
+ { "-keepold", ".keepold", XrmoptionNoArg, "True" }
+};
+
+static int s_maxcells;
+static int s_radius;
+static int s_seeds;
+static int s_quality;
+static int s_minfood;
+static int s_maxfood;
+static int s_divideage;
+static int s_pause;
+static float s_min_dist;
+static Bool s_keepold;
+
+static argtype vars[] = {
+ {&s_maxcells, "maxcells", "Max Cells", DEF_MAXCELLS, t_Int},
+ {&s_radius, "radius", "Radius", DEF_RADIUS, t_Int},
+ {&s_seeds, "seeds", "Seeds", DEF_SEEDS, t_Int},
+ {&s_quality, "quality", "Quality", DEF_QUALITY, t_Int},
+ {&s_minfood, "minfood", "Min Food", DEF_MINFOOD, t_Int},
+ {&s_maxfood, "maxfood", "Max Food", DEF_MAXFOOD, t_Int},
+ {&s_pause, "pause", "Pause at end", DEF_PAUSE, t_Int},
+ {&s_divideage, "divideage", "Age for duplication (Ticks)", DEF_DIVIDEAGE, t_Int},
+ {&s_min_dist, "mindist", "Minimum preferred distance to other cells", DEF_MINDIST, t_Float},
+ {&s_keepold, "keepold", "Keep old cells", DEF_KEEPOLD, t_Bool}
+};
+
+/**********************************
+ PROTOTYPES
+ **********************************/
+
+/* render scene */
+static int render( State *st );
+/* create initial cells and fill petri dish with food */
+static void create_cells( State * );
+/* do one animation step */
+static void tick( State *st );
+/* draw a single cell */
+static void draw_cell( State *st, int shape );
+/* draw cells nucleus */
+static void draw_nucleus( State *st );
+/* return randum number in the interval min-max */
+static int random_interval( int min, int max );
+/* retunr random number in the interval 0-max */
+static int random_max( int max );
+/* create display list for given disturbance weighting factor */
+static int create_list( State *st, double fac );
+/* return length of vector */
+static double vector_length( Vector * );
+/* normalize vector */
+static void vector_normalize( Vector * );
+/* a += b */
+static void vector_add( Vector *a, Vector *b );
+/* a -= b */
+static void vector_sub( Vector *a, Vector *b );
+/* a *= fac */
+static void vector_mul( Vector *a, double fac );
+/* a.x = a.y = a.z = 0 */
+static void vector_clear( Vector *a );
+/* return crossproduct a*b in out */
+static void vector_crossprod( Vector *a, Vector *b, Vector *out );
+/* return 1 if vectors are equal (epsilon compare) otherwise 0 */
+static int vector_compare( Vector *a, Vector *b );
+/* compute normal vector of given triangle and return in out */
+static void triangle_normal( Vector *a, Vector *b, Vector *c, Vector *out );
+/* take an Object and create an ObjectSmooth out of it */
+static ObjectSmooth *create_ObjectSmooth( Object * );
+/* Subdivide the Object once (assuming it's supposed to be a shpere */
+static Object *subdivide( Object *obj );
+/* free an Object */
+static void free_Object( Object * );
+/* free an ObjectSmooth */
+static void free_ObjectSmooth( ObjectSmooth * );
+/* scale an Object. return pointer to the object */
+/*static Object *scale_Object( Object *obj, double scale );*/
+/* create a perfect sphere refining with divisions */
+static Object *create_sphere( State *st, int divisions );
+/* make a copy of the given Object */
+static Object *clone_Object( Object * );
+/* return 1 if cell is capable to divide */
+static int can_divide( State *st, Cell *cell );
+#ifdef USE_VERTEX_ARRAY
+static VertexArray *array_from_ObjectSmooth( ObjectSmooth * );
+#endif
+static void create_nucleus_texture( State *st );
+
+ENTRYPOINT ModeSpecOpt glcells_opts = { countof(opts), opts, countof(vars), vars,
+ NULL };
+
+
+/**********************************
+ INLINE FUNCTIONS
+ **********************************/
+/* create random numbers
+*/
+static inline int random_interval( int min, int max )
+{
+ int n = max - min;
+ if (n == 0) n = 1;
+ return min+(random()%n);
+}
+
+static inline int random_max( int max )
+{
+ return random()%max;
+}
+
+/* Vector stuff
+*/
+
+/* a += b */
+static inline void vector_add( Vector *a, Vector *b )
+{
+ a->x += b->x;
+ a->y += b->y;
+ a->z += b->z;
+}
+
+/* a -= b */
+static inline void vector_sub( Vector *a, Vector *b )
+{
+ a->x -= b->x;
+ a->y -= b->y;
+ a->z -= b->z;
+}
+
+/* a *= v */
+static inline void vector_mul( Vector *a, double v )
+{
+ a->x *= v;
+ a->y *= v;
+ a->z *= v;
+}
+
+/* set to 0 */
+static inline void vector_clear( Vector *vec )
+{
+ vec->x = vec->y = vec->z = 0;
+}
+
+/* return vector length */
+static inline double vector_length( Vector *vec )
+{
+ return sqrt( vec->x*vec->x + vec->y*vec->y + vec->z*vec->z );
+}
+
+/* normalize vector */
+static inline void vector_normalize( Vector *vec )
+{
+ double len = vector_length( vec );
+
+ if (len != 0.0) {
+ vector_mul( vec, 1.0 / len );
+ }
+}
+
+/* crossproduct */
+static inline void vector_crossprod( Vector *a, Vector *b, Vector *out )
+{
+ out->x = a->y*b->z - a->z*b->y;
+ out->y = a->z*b->x - a->x*b->z;
+ out->z = a->x*b->y - a->y*b->x;
+}
+
+/* epsilon compare of two vectors */
+static inline int vector_compare( Vector *a, Vector *b )
+{
+ const double epsilon = 0.0000001;
+ Vector delta = *a;
+
+ vector_sub( &delta, b );
+ if (fabs(delta.x) < epsilon &&
+ fabs(delta.y) < epsilon &&
+ fabs(delta.z) < epsilon) {
+ return 1;
+ }
+
+ return 0;
+}
+
+/* check if given cell is capable of dividing
+ needs space, must be old enough, grown up and healthy
+*/
+static inline int can_divide( State *st, Cell *cell )
+{
+ if (cell->min_dist > st->move_dist &&
+ cell->age >= st->divide_age &&
+ cell->radius > 0.99 * st->radius &&
+ cell->energy > 0) {
+ return 1;
+ }
+
+ return 0;
+}
+
+/**********************************
+ FUNCTIONS
+ **********************************/
+
+/* compute normal vector of given
+ triangle spanned by the points a, b, c
+*/
+static void triangle_normal( Vector *a, Vector *b, Vector *c, Vector *out )
+{
+ Vector v1 = *a;
+ Vector v2 = *a;
+
+ vector_sub( &v1, b );
+ vector_sub( &v2, c );
+ vector_crossprod( &v1, &v2, out );
+}
+
+/* free */
+static void free_Object( Object *obj )
+{
+ free( obj->vertex );
+ free( obj->triangle );
+ free( obj );
+}
+
+static void free_ObjectSmooth( ObjectSmooth *obj )
+{
+ free( obj->vertex );
+ free( obj->triangle );
+ free( obj->normal );
+ free( obj );
+}
+
+/* scale the given Object */
+#if 0
+static Object *scale_Object( Object *obj, double scale )
+{
+ int v;
+
+ for (v=0; v<obj->num_vertex; ++v) {
+ vector_mul( &obj->vertex[v], scale );
+ }
+
+ return obj;
+}
+#endif
+
+/* create a copy of the given Object */
+static Object *clone_Object( Object *obj )
+{
+ /* alloc */
+ Object *ret = (Object *) malloc( sizeof( Object ) );
+
+ ret->vertex =
+ (Vector *) malloc( obj->num_vertex*sizeof(Vector) );
+ ret->triangle =
+ (Triangle *) malloc( obj->num_triangle*sizeof(Triangle) );
+ ret->num_vertex = obj->num_vertex;
+ ret->num_triangle = obj->num_triangle;
+ /* copy */
+ memcpy( ret->vertex, obj->vertex,
+ obj->num_vertex*sizeof(Vector) );
+ memcpy( ret->triangle, obj->triangle,
+ obj->num_triangle*sizeof(Triangle) );
+
+ return ret;
+}
+
+#ifdef USE_VERTEX_ARRAY
+static VertexArray *array_from_ObjectSmooth( ObjectSmooth *obj )
+{
+ int i, j;
+ VertexArray *array = (VertexArray *) malloc( sizeof( VertexArray ) );
+
+ array->vertex = (float *) malloc( 3*sizeof(float)*obj->num_vertex );
+ array->normal = (float *) malloc( 3*sizeof(float)*obj->num_vertex );
+ array->index = (unsigned *) malloc( 3*sizeof(unsigned)*obj->num_triangle );
+ array->num_index = obj->num_triangle*3;
+
+ for (i=0, j=0; i<obj->num_vertex; ++i) {
+ array->vertex[j] = obj->vertex[i].x;
+ array->normal[j++] = obj->normal[i].x;
+ array->vertex[j] = obj->vertex[i].y;
+ array->normal[j++] = obj->normal[i].y;
+ array->vertex[j] = obj->vertex[i].z;
+ array->normal[j++] = obj->normal[i].z;
+ }
+
+ for (i=0, j=0; i<obj->num_triangle; ++i) {
+ array->index[j++] = obj->triangle[i].i[0];
+ array->index[j++] = obj->triangle[i].i[1];
+ array->index[j++] = obj->triangle[i].i[2];
+ }
+
+ return array;
+}
+#endif /* USE_VERTEX_ARRAY */
+
+
+/* create a smoothed version of the given Object
+ by computing average normal vectors for the vertexes
+*/
+static ObjectSmooth *create_ObjectSmooth( Object *obj )
+{
+ int t, v, i;
+ Vector *t_normal =
+ (Vector *) malloc( obj->num_triangle*sizeof(Vector) );
+ ObjectSmooth *ret =
+ (ObjectSmooth *) malloc( sizeof( ObjectSmooth ) );
+
+ /* fill in vertexes and triangles */
+ ret->num_vertex = obj->num_vertex;
+ ret->num_triangle = obj->num_triangle;
+ ret->vertex =
+ (Vector *) malloc( obj->num_vertex * sizeof( Vector ) );
+ ret->normal =
+ (Vector *) malloc( obj->num_vertex * sizeof( Vector ) );
+ ret->triangle =
+ (Triangle *) malloc( obj->num_triangle * sizeof( Triangle ) );
+
+ for (v=0; v<obj->num_vertex; ++v) {
+ ret->vertex[v] = obj->vertex[v];
+ }
+
+ for (t=0; t<obj->num_triangle; ++t) {
+ ret->triangle[t] = obj->triangle[t];
+ }
+
+ /* create normals (triangles) */
+ for (t=0; t<ret->num_triangle; ++t) {
+ triangle_normal( &ret->vertex[ret->triangle[t].i[0]],
+ &ret->vertex[ret->triangle[t].i[1]],
+ &ret->vertex[ret->triangle[t].i[2]],
+ &t_normal[t] );
+ }
+
+ /* create normals (vertex) by averaging triangle
+ normals at vertex
+ */
+ for (v=0; v<ret->num_vertex; ++v) {
+ vector_clear( &ret->normal[v] );
+ for (t=0; t<ret->num_triangle; ++t) {
+ for (i=0; i<3; ++i) {
+ if (ret->triangle[t].i[i] == v) {
+ vector_add( &ret->normal[v], &t_normal[t] );
+ }
+ }
+ }
+ /* as we have only a half sphere we force the
+ normals at the bortder to be perpendicular to z.
+ the simple algorithm above makes an error here.
+ */
+ if (fabs(ret->vertex[v].z) < 0.0001) {
+ ret->normal[v].z = 0.0;
+ }
+
+ vector_normalize( &ret->normal[v] );
+ }
+
+ free( t_normal );
+
+ return ret;
+}
+
+/* subdivide the triangles of the object once
+ The order of this algorithm is probably something like O(n^42) :)
+ but I can't think of something smarter at the moment
+*/
+static Object *subdivide( Object *obj )
+{
+ /* create for worst case (which I dont't know) */
+ int start, t, i, v;
+ int index_list[1000];
+ int index_cnt, index_found;
+ Object *tmp = (Object *)malloc( sizeof(Object) );
+ Object *ret = (Object *)malloc( sizeof(Object) );
+ Object *c_ret;
+
+ tmp->vertex =
+ (Vector *)malloc( 100*obj->num_vertex*sizeof( Vector ) );
+ tmp->triangle =
+ (Triangle *)malloc( 4*obj->num_triangle*sizeof( Triangle ) );
+ tmp->num_vertex = 0;
+ tmp->num_triangle = 0;
+ ret->vertex =
+ (Vector *)malloc( 100*obj->num_vertex*sizeof( Vector ) );
+ ret->triangle =
+ (Triangle *)malloc( 4*obj->num_triangle*sizeof( Triangle ) );
+ ret->num_vertex = 0;
+ ret->num_triangle = 0;
+#ifdef PRINT_STAT
+ fprintf( stderr, "in v=%d t=%d\n",
+ obj->num_vertex, obj->num_triangle );
+#endif
+ /* for each triangle create 3 new vertexes and the 4
+ corresponding triangles
+ */
+ for (t=0; t<obj->num_triangle; ++t) {
+ /* copy the three original vertexes */
+ for (i=0; i<3; ++i) {
+ tmp->vertex[tmp->num_vertex++] =
+ obj->vertex[obj->triangle[t].i[i]];
+ }
+
+ /* create 3 new */
+ tmp->vertex[tmp->num_vertex] =
+ obj->vertex[obj->triangle[t].i[0]];
+ vector_add( &tmp->vertex[tmp->num_vertex],
+ &obj->vertex[obj->triangle[t].i[1]] );
+ vector_mul( &tmp->vertex[tmp->num_vertex++], 0.5 );
+
+ tmp->vertex[tmp->num_vertex] =
+ obj->vertex[obj->triangle[t].i[1]];
+ vector_add( &tmp->vertex[tmp->num_vertex],
+ &obj->vertex[obj->triangle[t].i[2]] );
+ vector_mul( &tmp->vertex[tmp->num_vertex++], 0.5 );
+
+ tmp->vertex[tmp->num_vertex] =
+ obj->vertex[obj->triangle[t].i[2]];
+ vector_add( &tmp->vertex[tmp->num_vertex],
+ &obj->vertex[obj->triangle[t].i[0]] );
+ vector_mul( &tmp->vertex[tmp->num_vertex++], 0.5 );
+
+ /* create triangles */
+ start = tmp->num_vertex-6;
+
+ tmp->triangle[tmp->num_triangle].i[0] = start;
+ tmp->triangle[tmp->num_triangle].i[1] = start+3;
+ tmp->triangle[tmp->num_triangle++].i[2] = start+5;
+
+ tmp->triangle[tmp->num_triangle].i[0] = start+3;
+ tmp->triangle[tmp->num_triangle].i[1] = start+1;
+ tmp->triangle[tmp->num_triangle++].i[2] = start+4;
+
+ tmp->triangle[tmp->num_triangle].i[0] = start+5;
+ tmp->triangle[tmp->num_triangle].i[1] = start+4;
+ tmp->triangle[tmp->num_triangle++].i[2] = start+2;
+
+ tmp->triangle[tmp->num_triangle].i[0] = start+3;
+ tmp->triangle[tmp->num_triangle].i[1] = start+4;
+ tmp->triangle[tmp->num_triangle++].i[2] = start+5;
+ }
+
+ /* compress object eliminating double vertexes
+ (welcome to the not so smart section)
+ */
+ /* copy original triangle list */
+ for (t=0; t<tmp->num_triangle; ++t) {
+ ret->triangle[t] = tmp->triangle[t];
+ }
+ ret->num_triangle = tmp->num_triangle;
+
+ /* copy unique vertexes and correct triangle list */
+ for (v=0; v<tmp->num_vertex; ++v) {
+ /* create list of vertexes that are the same */
+ index_cnt = 0;
+ for (i=0; i<tmp->num_vertex; ++i) {
+ /* check if i and v are the same
+ first in the list is the smallest index
+ */
+ if (vector_compare( &tmp->vertex[v], &tmp->vertex[i] )) {
+ index_list[index_cnt++] = i;
+ }
+ }
+
+ /* check if vertex unknown so far */
+ index_found = 0;
+ for (i=0; i<ret->num_vertex; ++i) {
+ if (vector_compare( &ret->vertex[i],
+ &tmp->vertex[index_list[0]] )) {
+ index_found = 1;
+ break;
+ }
+ }
+
+ if (!index_found) {
+ ret->vertex[ret->num_vertex] = tmp->vertex[index_list[0]];
+
+ /* correct triangles
+ (we add an offset to the index, so we can tell them apart)
+ */
+ for (t=0; t<ret->num_triangle; ++t) {
+ for (i=0; i<index_cnt; ++i) {
+ if (ret->triangle[t].i[0] == index_list[i]) {
+ ret->triangle[t].i[0] = ret->num_vertex+INDEX_OFFSET;
+ }
+ if (ret->triangle[t].i[1] == index_list[i]) {
+ ret->triangle[t].i[1] = ret->num_vertex+INDEX_OFFSET;
+ }
+ if (ret->triangle[t].i[2] == index_list[i]) {
+ ret->triangle[t].i[2] = ret->num_vertex+INDEX_OFFSET;
+ }
+ }
+ }
+ ret->num_vertex++;
+ }
+ }
+
+ free_Object( tmp );
+
+ /* correct index offset */
+ for (t=0; t<ret->num_triangle; ++t) {
+ ret->triangle[t].i[0] -= INDEX_OFFSET;
+ ret->triangle[t].i[1] -= INDEX_OFFSET;
+ ret->triangle[t].i[2] -= INDEX_OFFSET;
+ }
+
+ /* normalize vertexes */
+ for (v=0; v<ret->num_vertex; ++v) {
+ vector_normalize( &ret->vertex[v] );
+ }
+#ifdef PRINT_STAT
+ fprintf( stderr, "out v=%d t=%d\n",
+ ret->num_vertex, ret->num_triangle );
+#endif
+ /* shrink the arrays by cloning */
+ c_ret = clone_Object( ret );
+ free_Object( ret );
+
+ return c_ret;
+}
+
+static int render( State *st )
+{
+#ifdef PRINT_STAT
+ struct timeval tv1, tv2;
+ int usec;
+#endif
+ GLfloat LightAmbient[]= { 0.1f, 0.1f, 0.1f, 1.0f };
+ GLfloat LightPosition[]= { -20.0f, -10.0f, -100.0f, 0.0f };
+ int b;
+ int num_paint = 0;
+
+ if (0 == st->food) return 0;
+#ifdef PRINT_STAT
+ gettimeofday( &tv1, NULL );
+#endif
+ /* life goes on... */
+ tick( st );
+#ifdef PRINT_STAT
+ gettimeofday( &tv2, NULL );
+ usec = (tv2.tv_sec-tv1.tv_sec)*1000000+(tv2.tv_usec-tv1.tv_usec);
+ fprintf( stderr, "tick %d\n", usec );
+ gettimeofday( &tv1, NULL );
+#endif
+
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+ glDepthFunc(GL_LESS);
+ glEnable(GL_DEPTH_TEST);
+ glLightfv( GL_LIGHT0, GL_AMBIENT, LightAmbient );
+ glLightfv( GL_LIGHT0, GL_DIFFUSE, st->color );
+ glLightfv( GL_LIGHT0, GL_POSITION, LightPosition );
+
+ /* prepare lighting vs. wireframe */
+ if (!st->wire) {
+ glEnable( GL_LIGHT0 );
+ glEnable( GL_LIGHTING );
+ glEnable( GL_NORMALIZE );
+ glPolygonMode( GL_FRONT, GL_FILL );
+ } else {
+# ifndef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ glPolygonMode( GL_FRONT, GL_LINE );
+# endif
+ }
+
+# if 0
+ if (st->wire) {
+ glDisable(GL_DEPTH_TEST);
+ glColor3f (1, 1, 1);
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(0, 0, 0); glVertex3f(st->width, 0, 0);
+ glVertex3f(st->width, st->height, 0); glVertex3f(0, st->height, 0);
+ glVertex3f(0, 0, 0); glVertex3f(st->width/4, 0, 0);
+ glVertex3f(st->width/4, st->height/4, 0); glVertex3f(0, st->height/4, 0);
+ glEnd();
+ }
+# endif
+
+ /* draw the dead cells if choosen */
+ if (st->keep_old_cells) {
+ for (b=0; b<st->num_cells; ++b) {
+ if (st->cell[b].energy <= 0) {
+ num_paint++;
+ glPushMatrix();
+ glTranslatef( st->cell[b].x, st->cell[b].y, 0.0 );
+ glRotatef( st->cell[b].rotation, 0.0, 0.0, 1.0 );
+ glScalef( st->cell[b].radius, st->cell[b].radius, st->cell[b].radius );
+ draw_cell( st, 9 );
+ glPopMatrix();
+ }
+ }
+ }
+
+ /* draw the living cells */
+ for (b=0; b<st->num_cells; ++b) {
+ if (st->cell[b].energy >0) {
+ double fac = (double)st->cell[b].energy / 50.0;
+ int shape;
+ if (fac < 0.0) fac = 0.0;
+ if (fac > 1.0) fac = 1.0;
+
+ shape = (int)(9.0*fac);
+ num_paint++;
+ /*glColor3f( fac, fac, fac );*/
+
+# if 0
+ if (st->wire) {
+ glBegin(GL_LINES);
+ glVertex3f(0, 0, 0);
+ glVertex3f(st->cell[b].x, st->cell[b].y, 0);
+ glEnd();
+ }
+# endif
+
+ glPushMatrix();
+ glTranslatef( st->cell[b].x, st->cell[b].y, 0.0 );
+ glRotatef( st->cell[b].rotation, 0.0, 0.0, 1.0 );
+ glScalef( st->cell[b].radius, st->cell[b].radius, st->cell[b].radius );
+ draw_cell( st, 9-shape );
+ glPopMatrix();
+ }
+ }
+
+ /* draw cell nuclei */
+ if (!st->wire)
+ {
+ glDisable( GL_LIGHT0 );
+ glDisable( GL_LIGHTING );
+
+ glEnable( GL_BLEND );
+ glDisable( GL_DEPTH_TEST );
+ glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
+ glEnable( GL_TEXTURE_2D );
+ glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
+ glBindTexture( GL_TEXTURE_2D, st->texture_name );
+
+ for (b=0; b<st->num_cells; ++b) {
+ if (st->cell[b].energy>0 || st->keep_old_cells) {
+ glPushMatrix();
+ glTranslatef( st->cell[b].x, st->cell[b].y, 0.0 );
+ glScalef( st->cell[b].radius, st->cell[b].radius, st->cell[b].radius );
+ draw_nucleus( st );
+ glPopMatrix();
+ }
+ }
+
+ glDisable( GL_TEXTURE_2D );
+ glDisable( GL_BLEND );
+ }
+
+#ifdef PRINT_STAT
+ gettimeofday( &tv2, NULL );
+ usec = (tv2.tv_sec-tv1.tv_sec)*1000000+(tv2.tv_usec-tv1.tv_usec);
+ fprintf( stderr, "OpenGL %d\n", usec );
+#endif
+ return num_paint * st->cell_polys;
+}
+
+/* this creates the initial subdivided half-dodecaedron */
+static Object *create_sphere( State *st, int divisions )
+{
+ int num_vertex = 9;
+ int num_triangle = 10;
+ int i, v, t;
+ double a, aStep = (double)M_PI / 3.0;
+ double e;
+ int vi[30] = { 0, 7, 1, 1, 7, 2, 2, 8, 3, 3, 8, 4, 4, 6, 5,
+ 5, 6, 0, 0, 6, 7, 2, 7, 8, 4, 8, 6, 6, 8, 7 };
+ Object *obj = (Object *)malloc( sizeof( Object ) );
+
+ obj->vertex = (Vector *)malloc( num_vertex*sizeof( Vector ) );
+ obj->triangle =
+ (Triangle *)malloc( num_triangle*sizeof( Triangle ) );
+ obj->num_vertex = num_vertex;
+ obj->num_triangle = num_triangle;
+
+ /* create vertexes for dodecaedron */
+ a = 0.0;
+ for (v=0; v<6; ++v) {
+ obj->vertex[v].x = sin( a );
+ obj->vertex[v].y = -cos( a );
+ obj->vertex[v].z = 0.0;
+
+ a += aStep;
+ }
+
+ a = -60.0/180.0*(double)M_PI;
+ e = 58.2825/180.0 * (double)M_PI;
+ for (;v<9; ++v) {
+ obj->vertex[v].x = sin( a )*cos( e );
+ obj->vertex[v].y = -cos( a )*cos( e );
+ obj->vertex[v].z = -sin( e );
+
+ a += 2.0*aStep;
+ }
+
+ /* create triangles */
+ for (t=0; t<obj->num_triangle; ++t) {
+ obj->triangle[t].i[0] = vi[3*t];
+ obj->triangle[t].i[1] = vi[3*t+1];
+ obj->triangle[t].i[2] = vi[3*t+2];
+ }
+
+ /* subdivide as specified */
+ for (i=0; i<divisions; ++i) {
+ Object *newObj = subdivide( obj );
+ free_Object( obj );
+ obj = newObj;
+ }
+
+ st->cell_polys = obj->num_triangle;
+
+ return obj;
+}
+
+static int create_list( State *st, double fac )
+{
+ int v;
+ Object *obj = clone_Object( st->sphere );
+ ObjectSmooth *smooth;
+#ifdef USE_VERTEX_ARRAY
+ VertexArray *vertex_array;
+#else
+ int t, i;
+#endif
+ int list = glGenLists(1);
+
+ /* apply wrinckle factor */
+ for (v=0; v<obj->num_vertex; ++v) {
+ vector_mul( &obj->vertex[v], 1.0+fac*st->disturbance[v] );
+ }
+
+ /* compute normals */
+ smooth = create_ObjectSmooth( obj );
+ free_Object( obj );
+
+ /* Create display list */
+ glNewList( list, GL_COMPILE );
+#ifdef USE_VERTEX_ARRAY
+ vertex_array = array_from_ObjectSmooth( smooth );
+ glEnableClientState( GL_VERTEX_ARRAY );
+ glEnableClientState( GL_NORMAL_ARRAY );
+ glVertexPointer( 3, GL_FLOAT, 0, vertex_array->vertex );
+ glNormalPointer( GL_FLOAT, 0, vertex_array->normal );
+ glDrawElements( GL_TRIANGLES, vertex_array->num_index,
+ GL_UNSIGNED_INT, vertex_array->index );
+ free( vertex_array );
+#else
+ glBegin( GL_TRIANGLES );
+
+ for (t=0; t<smooth->num_triangle; ++t) {
+ for (i=0; i<3; ++i) {
+ glNormal3f( smooth->normal[smooth->triangle[t].i[i]].x,
+ smooth->normal[smooth->triangle[t].i[i]].y,
+ smooth->normal[smooth->triangle[t].i[i]].z );
+ glVertex3f( smooth->vertex[smooth->triangle[t].i[i]].x,
+ smooth->vertex[smooth->triangle[t].i[i]].y,
+ smooth->vertex[smooth->triangle[t].i[i]].z );
+ }
+ }
+
+ glEnd();
+#endif
+ glEndList();
+
+ free_ObjectSmooth( smooth );
+
+ return list;
+}
+
+static void draw_cell( State *st, int shape )
+{
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ if (st->wire) {
+ glDisable(GL_DEPTH_TEST);
+ glColor3f (1, 1, 1);
+ glPushMatrix();
+ glScalef (0.33, 0.33, 1);
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (-1, -1, 0); glVertex3f (-1, 1, 0);
+ glVertex3f ( 1, 1, 0); glVertex3f ( 1, -1, 0);
+ glEnd();
+ if (shape == 9) {
+ glBegin (GL_LINES);
+ glVertex3f (-1, -1, 0); glVertex3f (1, 1, 0);
+ glVertex3f (-1, 1, 0); glVertex3f (1, -1, 0);
+ glEnd();
+ }
+ glPopMatrix();
+ return;
+ }
+# endif
+
+ if (-1 == st->cell_list[shape]) {
+ st->cell_list[shape] = create_list( st, (double)shape/10.0 );
+ }
+
+ glCallList( st->cell_list[shape] );
+}
+
+static void create_nucleus_texture( State *st )
+{
+ int x, y;
+ int w2 = TEX_SIZE/2;
+ float s = w2*w2/4.0;
+
+ st->texture = (GLubyte *) malloc( 4*TEX_SIZE*TEX_SIZE );
+
+ for (y=0; y<TEX_SIZE; ++y) {
+ for (x=0; x<TEX_SIZE; ++x) {
+ float r2 = ((x-w2)*(x-w2)+(y-w2)*(y-w2));
+ float v = 120.0 * expf( -(r2) / s );
+ st->texture[4*(x+y*TEX_SIZE)] = (GLubyte)0;
+ st->texture[4*(x+y*TEX_SIZE)+1] = (GLubyte)0;
+ st->texture[4*(x+y*TEX_SIZE)+2] = (GLubyte)0;
+ st->texture[4*(x+y*TEX_SIZE)+3] = (GLubyte)v;
+ }
+ }
+
+ glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
+ glGenTextures( 1, &st->texture_name );
+ glBindTexture( GL_TEXTURE_2D, st->texture_name );
+
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+ glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, TEX_SIZE, TEX_SIZE, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, st->texture );
+}
+
+static void draw_nucleus( State *st )
+{
+ if (-1 == st->nucleus_list) {
+ float z = -1.2f;
+ float r=1.0/2.0f;
+ st->nucleus_list = glGenLists( 1 );
+ glNewList( st->nucleus_list, GL_COMPILE );
+ glBegin( GL_QUADS );
+ glTexCoord2f( 0.0f, 0.0f ); glVertex3f( -r, -r, z );
+ glTexCoord2f( 0.0f, 1.0f ); glVertex3f( -r, r, z );
+ glTexCoord2f( 1.0f, 1.0f ); glVertex3f( r, r, z );
+ glTexCoord2f( 1.0f, 0.0f ); glVertex3f( r, -r, z );
+ glEnd();
+ glEndList();
+ }
+
+ glCallList( st->nucleus_list );
+}
+
+static void create_cells( State *st )
+{
+ int border = (int)(200.0 * st->screen_scale);
+ int i, foodcnt;
+ int w = st->width-2*border;
+ int h = st->height-2*border;
+
+ st->color[0] = 0.5 + random_max( 1000 ) * 0.0005;
+ st->color[1] = 0.5 + random_max( 1000 ) * 0.0005;
+ st->color[2] = 0.5 + random_max( 1000 ) * 0.0005;
+ st->color[3] = 1.0f;
+
+ /* allocate if startup */
+ if (!st->cell) {
+ st->cell = (Cell *) malloc( st->max_cells * sizeof(Cell));
+ }
+
+ /* fill the screen with random food for our little critters */
+ foodcnt = (st->width*st->height)/16;
+ for (i=0; i<foodcnt; ++i) {
+ st->food[i] = random_interval( st->minfood, st->maxfood );
+ }
+
+ /* create the requested seed-cells */
+ st->num_cells = st->num_seeds;
+
+ for (i=0; i<st->num_cells; ++i) {
+ st->cell[i].x = border + random_max( w );
+ st->cell[i].y = border + random_max( h );
+ st->cell[i].vx = 0.0;
+ st->cell[i].vy = 0.0;
+ st->cell[i].age = random_max( 0x0f );
+ st->cell[i].min_dist = 500.0;
+ st->cell[i].energy = random_interval( 5, 5+0x3f );
+ st->cell[i].rotation = ((double)random()/(double)RAND_MAX)*360.0;
+ st->cell[i].radius = st->radius;
+ st->cell[i].growth = 1.0;
+ }
+}
+
+/* all this is rather expensive :( */
+static void tick( State *st )
+{
+ int new_num_cells, num_cells=0;
+ int b, j;
+ int x, y, w4=st->width/4, h4=st->height/4, offset;
+ double min_dist;
+ int min_index;
+ int num_living = 0;
+ const double check_dist = 0.75*st->move_dist;
+ const double grow_dist = 0.75*st->radius;
+ const double adult_radius = st->radius;
+
+ /* find number of cells capable of division
+ and count living cells
+ */
+ for (b=0; b<st->num_cells; ++b) {
+ if (st->cell[b].energy > 0) num_living++;
+ if (can_divide( st, &st->cell[b] )) num_cells++;
+ }
+ new_num_cells = st->num_cells + num_cells;
+
+ /* end of simulation ? */
+ if (0 == num_living || new_num_cells >= st->max_cells) {
+ if (st->pause_counter > 0) st->pause_counter--;
+ if (st->pause_counter > 0) return;
+ create_cells( st );
+ st->pause_counter = st->pause;
+ } else if (num_cells) { /* any fertile candidates ? */
+ for (b=0, j=st->num_cells; b<st->num_cells; ++b) {
+ if (can_divide( st, &st->cell[b] )) {
+ st->cell[b].vx = random_interval( -50, 50 ) * 0.01;
+ st->cell[b].vy = random_interval( -50, 50 ) * 0.01;
+ st->cell[b].age = random_max( 0x0f );
+ /* half energy for both plus some bonus for forking */
+ st->cell[b].energy =
+ st->cell[b].energy/2 + random_max( 0x0f );
+ /* forking makes me shrink */
+ st->cell[b].growth = 0.995;
+
+ /* this one initially goes into the oposite direction */
+ st->cell[j].vx = -st->cell[b].vx;
+ st->cell[j].vy = -st->cell[b].vy;
+ /* same center */
+ st->cell[j].x = st->cell[b].x;
+ st->cell[j].y = st->cell[b].y;
+ st->cell[j].age = random_max( 0x0f );
+ st->cell[j].energy = (st->cell[b].energy);
+ st->cell[j].rotation =
+ ((double)random()/(double)RAND_MAX)*360.0;
+ st->cell[j].growth = st->cell[b].growth;
+ st->cell[j].radius = st->cell[b].radius;
+ ++j;
+ } else {
+ st->cell[b].vx = 0.0;
+ st->cell[b].vy = 0.0;
+ }
+ }
+
+ st->num_cells = new_num_cells;
+ }
+
+ /* for each find a direction to escape */
+ if (st->num_cells > 1) {
+ for (b=0; b<st->num_cells; ++b) {
+ if (st->cell[b].energy > 0) {
+ double vx;
+ double vy;
+ double len;
+
+ /* grow or shrink */
+ st->cell[b].radius *= st->cell[b].growth;
+ /* find closest neighbour */
+ min_dist = 100000.0;
+ min_index = 0;
+ for (j=0; j<st->num_cells; ++j) {
+ if (j!=b) {
+ const double dx = st->cell[b].x - st->cell[j].x;
+ const double dy = st->cell[b].y - st->cell[j].y;
+
+ if (fabs(dx) < check_dist || fabs(dy) < check_dist) {
+ const double dist = dx*dx+dy*dy;
+ /*const double dist = sqrt( dx*dx+dy*dy );*/
+ if (dist<min_dist) {
+ min_dist = dist;
+ min_index = j;
+ }
+ }
+ }
+ }
+ /* escape step is away from closest normalized with distance */
+ vx = st->cell[b].x - st->cell[min_index].x;
+ vy = st->cell[b].y - st->cell[min_index].y;
+ len = sqrt( vx*vx + vy*vy );
+ if (len > 0.0001) {
+ st->cell[b].vx = vx/len;
+ st->cell[b].vy = vy/len;
+ }
+ st->cell[b].min_dist = len;
+ /* if not adult (radius too small) */
+ if (st->cell[b].radius < adult_radius) {
+ /* if too small 60% stop shrinking */
+ if (st->cell[b].radius < adult_radius * 0.6) {
+ st->cell[b].growth = 1.0;
+ }
+ /* at safe distance we start growing again */
+ if (len > grow_dist) {
+ if (st->cell[b].energy > 30) {
+ st->cell[b].growth = 1.005;
+ }
+ }
+ } else { /* else keep size */
+ st->cell[b].growth = 1.0;
+ }
+ }
+ }
+ } else {
+ st->cell[0].min_dist = 2*st->move_dist;
+ }
+
+ /* now move em, snack and burn energy */
+ for (b=0; b<st->num_cells; ++b) {
+ /* if still alive */
+ if (st->cell[b].energy > 0) {
+ /* agility depends on amount of energy */
+ double fac = (double)st->cell[b].energy / 50.0;
+ if (fac < 0.0) fac = 0.0;
+ if (fac > 1.0) fac = 1.0;
+
+ st->cell[b].x += fac*(2.0 -
+ (4.0*(double)random() / (double)RAND_MAX) +
+ st->cell[b].vx);
+ st->cell[b].y += fac*(2.0 -
+ (4.0*(double)random() / (double)RAND_MAX) +
+ st->cell[b].vy);
+
+ /* get older and burn energy */
+ if (st->cell[b].energy > 0) {
+ st->cell[b].age++;
+ st->cell[b].energy--;
+ }
+
+ /* have a snack */
+ x = ((int)st->cell[b].x)/4;
+ if (x<0) x=0;
+ if (x>=w4) x = w4-1;
+ y = ((int)st->cell[b].y)/4;
+ if (y<0) y=0;
+ if (y>=h4) y = h4-1;
+
+ offset = x+y*w4;
+
+ /* don't eat if already satisfied */
+ if (st->cell[b].energy < 100 &&
+ st->food[offset] > 0) {
+ st->food[offset]--;
+ st->cell[b].energy++;
+ /* if you are hungry, eat more */
+ if (st->cell[b].energy < 50 &&
+ st->food[offset] > 0) {
+ st->food[offset]--;
+ st->cell[b].energy++;
+ }
+ }
+ }
+ }
+}
+
+ENTRYPOINT void
+reshape_glcells( ModeInfo *mi, int width, int height )
+{
+ State *st = &sstate[MI_SCREEN(mi)];
+# ifdef HAVE_MOBILE
+ int rot = current_device_rotation();
+# endif
+ st->height = height;
+ st->width = width;
+# ifdef HAVE_MOBILE
+ st->screen_scale = (double)(width < height ? width : height) / 1600.0;
+# else
+ st->screen_scale = (double)width / 1600.0;
+# endif
+
+ st->radius = s_radius;
+ if (st->radius < 5) st->radius = 5;
+ if (st->radius > 200) st->radius = 200;
+ st->radius *= st->screen_scale;
+
+ st->move_dist = s_min_dist;
+ if (st->move_dist < 1.0) st->move_dist = 1.0;
+ if (st->move_dist > 3.0) st->move_dist = 3.0;
+ st->move_dist *= st->radius;
+
+ glViewport (0, 0, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho( 0, width, height, 0, 200, 0 );
+# ifdef HAVE_MOBILE
+ glRotatef (rot, 0, 0, 1);
+# endif
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ if (st->food) free( st->food );
+ st->food = (int *)malloc( ((width*height)/16)*sizeof(int) );
+ /* create_cells( st );*/
+
+# ifdef HAVE_MOBILE
+ glTranslatef (st->width/2, st->height/2, 0);
+ if (rot == 90 || rot == -90 || rot == 270 || rot == -270)
+ st->width = height, st->height = width;
+ glRotatef (rot, 0, 0, 1);
+ if (st->wire) glScalef(0.8, 0.8, 1);
+ glTranslatef (-st->width/2, -st->height/2, 0);
+# endif
+}
+
+ENTRYPOINT void
+init_glcells( ModeInfo *mi )
+{
+ int i, divisions;
+ State *st=0;
+
+ MI_INIT(mi, sstate);
+ st = &sstate[MI_SCREEN(mi)];
+
+ st->glx_context = init_GL(mi);
+ st->cell = 0;
+ st->num_cells = 0;
+ st->wire = MI_IS_WIREFRAME(mi);
+
+ /* get settings */
+ st->max_cells = s_maxcells;;
+ if (st->max_cells < 50) st->max_cells = 50;
+ if (st->max_cells > 10000) st->max_cells = 10000;
+
+ st->pause = s_pause;
+ if (st->pause < 0) st->pause = 0;
+ if (st->pause > 400) st->pause = 400;
+ st->pause_counter = st->pause;
+
+ st->radius = s_radius;
+ if (st->radius < 5) st->radius = 5;
+ if (st->radius > 200) st->radius = 200;
+
+ divisions = s_quality;
+ if (divisions < 0) divisions = 0;
+ if (divisions > 5) divisions = 5;
+
+ st->num_seeds = s_seeds;
+ if (st->num_seeds < 1) st->num_seeds = 1;
+ if (st->num_seeds > 16) st->num_seeds = 16;
+
+ st->minfood = s_minfood;
+ if (st->minfood < 0) st->minfood = 0;
+ if (st->minfood > 1000) st->minfood = 1000;
+
+ st->maxfood = s_maxfood;
+ if (st->maxfood < 0) st->maxfood = 0;
+ if (st->maxfood > 1000) st->maxfood = 1000;
+
+ if (st->maxfood < st->minfood) st->maxfood = st->minfood+1;
+
+ st->keep_old_cells = s_keepold;
+
+ st->divide_age = s_divideage;
+ if (st->divide_age < 1) st->divide_age = 1;
+ if (st->divide_age > 1000) st->divide_age = 1000;
+
+ st->move_dist = s_min_dist;
+ if (st->move_dist < 1.0) st->move_dist = 1.0;
+ if (st->move_dist > 3.0) st->move_dist = 3.0;
+ st->move_dist *= st->radius;
+
+ for (i=0; i<NUM_CELL_SHAPES; ++i) st->cell_list[i] = -1;
+ st->nucleus_list = -1;
+ st->food = 0;
+
+ st->sphere = create_sphere( st, divisions );
+ st->disturbance =
+ (double *) malloc( st->sphere->num_vertex*sizeof(double) );
+ for (i=0; i<st->sphere->num_vertex; ++i) {
+ st->disturbance[i] =
+ 0.05-((double)random()/(double)RAND_MAX*0.1);
+ }
+
+ create_nucleus_texture( st );
+
+ reshape_glcells (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+}
+
+ENTRYPOINT void
+draw_glcells( ModeInfo *mi )
+{
+ State *st = &sstate[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!st->glx_context) return;
+
+ glXMakeCurrent( MI_DISPLAY(mi), MI_WINDOW(mi),
+ *(st->glx_context) );
+
+ mi->polygon_count = render( st );
+
+ if (mi->fps_p) do_fps (mi);
+
+ glFinish();
+ glXSwapBuffers( dpy, window );
+}
+
+ENTRYPOINT void
+free_glcells( ModeInfo *mi )
+{
+ int i;
+ State *st = &sstate[MI_SCREEN(mi)];
+
+ if (st->glx_context) {
+ glXMakeCurrent( MI_DISPLAY(mi), MI_WINDOW(mi),
+ *(st->glx_context) );
+
+ /* nuke everything before exit */
+ if (st->sphere) free_Object( st->sphere );
+ if (st->food) free( st->food );
+ for (i=0; i<NUM_CELL_SHAPES; ++i) {
+ if (st->cell_list[i] != -1) {
+ glDeleteLists( st->cell_list[i], 1 );
+ }
+ }
+ if (st->cell) free( st->cell );
+ free( st->disturbance );
+ glDeleteTextures( 1, &st->texture_name );
+ free( st->texture );
+ }
+}
+
+XSCREENSAVER_MODULE( "GLCells", glcells )
diff --git a/hacks/glx/glcells.man b/hacks/glx/glcells.man
new file mode 100644
index 0000000..6c1e7e9
--- /dev/null
+++ b/hacks/glx/glcells.man
@@ -0,0 +1,97 @@
+.TH XScreenSaver 1 "June 2007"
+.SH NAME
+glcells \- growing cells graphics hack
+.SH SYNOPSIS
+.B glcells
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fInum\fP] [\-pause \fInum\fP] [\-maxcells \fInum\fP]
+[\-radius \fInum\fP] [\-seeds \fInum\fP] [\-quality \fInum\fP]
+[\-minfood \fInum\fP] [\-maxfood \fInum\fP] [\-divideage \fInum\fP]
+[\-mindist \fInum\fP]
+[\-keepold]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+The \fIglcells\fP program draws cells that divide exponentially, eat and eventually die.
+.SH OPTIONS
+.I glcells
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-pause \fInum\fP\fP
+Specifies the pause at the end of the animation (all cells dead or maximum amount of cells reached). Unit is in frames, default 20.
+.TP 8
+.B \-maxcells \fInum\fP\fP
+Specifies the maximum number of cells on screen (dead cells also count, even if invisible). Default is 800.
+.TP 8
+.B \-radius \fInum\fP\fP
+Specifies the radius of the cells. Default is 40.
+.TP 8
+.B \-seeds \fInum\fP\fP
+Specifies the number of cells when animation starts. Default is 1.
+.TP 8
+.B \-quality \fInum\fP\fP
+Specifies subdivision quality of the spheres used to draw the cells [0...5]. Default is 3.
+.TP 8
+.B \-minfood \fInum\fP\fP
+Food is ditributed randomly on the screen (Yes, the cells need to eat). This parameter specifies the
+minimum amount of food per pixel. Default is 5.
+.TP 8
+.B \-maxfood \fInum\fP\fP
+Food is ditributed randomly on the screen (Yes, the cells need to eat). This parameter specifies the
+maximum amount of food per pixel. Default is 20.
+.TP 8
+.B \-divideage \fInum\fP\fP
+Specifies the minimum age in frames a cell needs to have before beeing able to divide. Default is 20
+.TP 8
+.B \-mindist \fInum\fP\fP
+Specifies the minimum distance between cells. Default 1.4
+.TP 8
+.B \-delay \fInum\fP
+How long to pause between frames. Default is 20000, or 0.02 second.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-wireframe
+Draw wireframe only.
+.TP 8
+.B \-keepold
+Dead cells stay on screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver\-demo (1),
+.SH COPYRIGHT
+Copyright \(co 2007 by Matthias Toussaint. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Matthias Toussaint <glcells@mtoussaint.de>, 17-Jun-2007, http://www.mtoussaint.de/bits.html.
+
diff --git a/hacks/glx/gleidescope.c b/hacks/glx/gleidescope.c
new file mode 100644
index 0000000..ec33388
--- /dev/null
+++ b/hacks/glx/gleidescope.c
@@ -0,0 +1,1624 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* vim: set ai ts=4 sw=4: */
+
+#if 0
+/*static const char sccsid[] = "@(#)gleidescope.c 1.0 03/06/27 xlockmore";*/
+#endif
+
+/* enable -grab switch for animations */
+#undef GRAB
+
+#undef DISPLAY_TEXTURE
+
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ *
+ * 20030627 1.0 acd First Release.
+ * Texture loading code from 'glplanet'
+ * by Jamie Zawinski <jwz@jwz.org>
+ * 20030810 1.1 acd Added size flag.
+ * Now grabs screen / video / picture
+ * (uses code from 'glslideshow' by
+ * Mike Oliphant, Ben Buxton, Jamie Zawinski).
+ * Added -duration.
+ * Added mouse code.
+ * Added fade code (also from glslideshow).
+ * 20031013 1.2 acd Migrated to compile without warnings under
+ * xscreensaver 4.13.
+ * 20031023 1.3 acd Better code to limit twisting speeds.
+ * Tweaked initial rotation values.
+ * Move, Rotate, Zoom now chosen at random if
+ * no preference is given.
+ * Made grid slightly bigger so you can't see
+ * the edge when zooming and moving.
+ * 20061226 1.4 acd Now uses GL Display Lists.
+ * 20070318 1.5 acd Generates textures.
+ * Fixed texture size problem (and introduced another).
+ * 20070412 1.6 acd Textures now have independant sizes.
+ * 20070413 1.7 acd Added Lissajous movement pattern.
+ * 20070414 1.8 acd Added corners movement pattern.
+ * 20080319 1.9 acd Changes to arguments for saner gleidescope.xml.
+ *
+ * TODO
+ * generate textures myself - render random shapes to 256x256 texture. (done)
+ * lower res for checks and random - use 256 and 4x4 or 8x8 pixels. (disabled for now)
+ * gnome-saver doesn't let you specify source directory so add that to this.
+ * image loading routine is too slow - rotation grinds to a halt - stop using it. (better in version 5)
+ * image loading also looks bad for non-square images - edges are black. (fixed)
+ * possible to see edge of the world on widescreen terminals - use larger grid and hidden hex removal?
+ * fading textures may have different max_tx - use two sets. (done)
+ * choice of movement patterns. (3 implemented, chooseable at compile time)
+ * look into rangle and tangle.
+ */
+
+/*
+**----------------------------------------------------------------------------
+** Defines
+**----------------------------------------------------------------------------
+*/
+
+#ifdef STANDALONE
+# define DEFAULTS \
+ "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*size: 0 \n" \
+ "*useSHM: True \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define release_gleidescope 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#include "colors.h"
+#include "ximage-loader.h"
+#include "grab-ximage.h"
+
+#ifdef GRAB
+void grab_frame(Display *display, Window window);
+#endif
+
+/* acd TODO should all these be in gleidestruct? */
+/* they can't be, because of the idiotic way the xlockmore "argtype vars"
+ interface works. -jwz */
+#ifdef GRAB
+static Bool grab; /* grab images */
+#endif
+static Bool move; /* moving camera */
+static Bool nomove; /* no moving camera */
+static Bool rotate; /* rotate in place */
+static Bool norotate; /* no rotate in place */
+static Bool zoom; /* zooming camera */
+static Bool nozoom; /* no zooming camera */
+static char *image_str; /* name of texture to load */
+static int duration; /* length of time to display grabbed image */
+
+#define MAX_CAM_SPEED 1.0
+#define MAX_ANGLE_VEL 1.0
+#define INITIAL_ANGLE_VEL 0.2
+#define INITIAL_ANGLE_ACC 0.001
+#define TWISTING_PROBABILITY 1000 /* 1 in ... of change of acceleration */
+
+#define RADIANS (M_PI / 180)
+#define ANGLE_120 (M_PI * 2 / 3)
+#define ANGLE_240 (M_PI * 4 / 3)
+
+#define DEF_GRAB "False"
+#define DEF_MOVE "False"
+#define DEF_NOMOVE "False"
+#define DEF_ROTATE "False"
+#define DEF_NOROTATE "False"
+#define DEF_ZOOM "False"
+#define DEF_NOZOOM "False"
+#define DEF_IMAGE "DEFAULT"
+#define DEF_DURATION "30"
+
+
+static XrmOptionDescRec opts[] =
+{
+#ifdef GRAB
+ {"-grab", ".gleidescope.grab", XrmoptionNoArg, "true"},
+#endif
+ {"-move", ".gleidescope.move", XrmoptionNoArg, "true"},
+ {"-no-move", ".gleidescope.nomove", XrmoptionNoArg, "true"},
+ {"-rotate", ".gleidescope.rotate", XrmoptionNoArg, "true"},
+ {"-no-rotate", ".gleidescope.norotate", XrmoptionNoArg, "true"},
+ {"-zoom", ".gleidescope.zoom", XrmoptionNoArg, "true"},
+ {"-no-zoom", ".gleidescope.nozoom", XrmoptionNoArg, "true"},
+ {"-image", ".gleidescope.image", XrmoptionSepArg, "DEFAULT"},
+ {"-duration", ".gleidescope.duration", XrmoptionSepArg, "30"},
+};
+
+
+static argtype vars[] = {
+#ifdef GRAB
+ {&grab, "grab", "Grab", DEF_GRAB, t_Bool},
+#endif
+ {&move, "move", "Move", DEF_MOVE, t_Bool},
+ {&nomove, "nomove", "noMove", DEF_NOMOVE, t_Bool},
+ {&rotate, "rotate", "Rotate", DEF_ROTATE, t_Bool},
+ {&norotate, "norotate", "noRotate", DEF_NOROTATE, t_Bool},
+ {&zoom, "zoom", "Zoom", DEF_ZOOM, t_Bool},
+ {&nozoom, "nozoom", "noZoom", DEF_NOZOOM, t_Bool},
+ {&image_str, "image", "Image", DEF_IMAGE, t_String},
+ {&duration, "duration", "Duration", DEF_DURATION, t_Int},
+};
+
+static OptionStruct desc[] = {
+#ifdef GRAB
+ {"-grab", "grab images to create animation"},
+#endif
+ {"-move", "camera will move"},
+ {"-no-move", "camera won't move"},
+ {"-rotate", "camera will rotate"},
+ {"-no-rotate", "camera won't rotate"},
+ {"-zoom", "camera will zoom"},
+ {"-no-zoom", "camera won't zoom"},
+ {"-image", "xpm / xbm image file to use for texture"},
+ {"-duration", "length of time texture will be used"},
+};
+
+ENTRYPOINT ModeSpecOpt gleidescope_opts = {
+ sizeof opts / sizeof opts[0], opts,
+ sizeof vars / sizeof vars[0], vars,
+ desc
+};
+
+#ifdef USE_MODULES
+ModStruct gleidescope_description = {
+ "gleidescope", "init_gleidescope", "draw_gleidescope", NULL,
+ "draw_gleidescope", "init_gleidescope", "free_gleidescope",
+ &gleidescope_opts, 1000, 1, 2, 1, 4, 1.0, "",
+ "GL Kaleidescope", 0, NULL};
+#endif
+
+/*
+**-----------------------------------------------------------------------------
+** Typedefs
+**-----------------------------------------------------------------------------
+*/
+
+typedef struct hex_s {
+ GLfloat x, y, z; /* position */
+} hex_t;
+
+typedef struct {
+ GLfloat x;
+ GLfloat y;
+ GLfloat z;
+} vectorf;
+
+typedef struct {
+ GLfloat x;
+ GLfloat y;
+} vector2f;
+
+typedef struct {
+ GLuint id; /* opengl texture id */
+ GLfloat width, height; /* texture width and height */
+ GLfloat min_tx, min_ty; /* minimum texture sizes */
+ GLfloat max_tx, max_ty; /* maximum texture sizes */
+ time_t start_time;
+ Bool button_down_p;
+ Bool mipmap_p;
+ Bool waiting_for_image_p;
+ /* r_phase is for triangle rotation speed */
+ GLfloat x_period, y_period, r_period;
+ GLfloat x_phase, y_phase, r_phase;
+} texture;
+
+#define MAX_FADE 500 /* number of fade cycles */
+
+typedef struct {
+ float cam_x_speed, cam_z_speed, cam_y_speed;
+ int cam_x_phase, cam_z_phase, cam_y_phase;
+ float tic;
+ GLXContext *glx_context;
+ Window window;
+ texture textures[2]; /* texture handles */
+ GLuint visible; /* index for current texture */
+ GLint fade;
+ time_t start_time;
+ Bool button_down_p;
+
+ int size;
+ int list;
+
+ float tangle; /* texture angle (degrees) */
+ float tangle_vel; /* texture velocity */
+ float tangle_acc; /* texture acceleration */
+
+ float rangle; /* rotate angle */
+ float rangle_vel; /* rotate velocity */
+ float rangle_acc; /* rotate acceleration */
+
+ /* mouse */
+ int xstart;
+ int ystart;
+ double xmouse;
+ double ymouse;
+
+ Bool mipmap_p;
+ Bool waiting_for_image_p;
+
+} gleidestruct;
+
+#define frandrange(x, y) (x + frand(y - x))
+
+#define XOFFSET (0.8660254f) /* sin 60' */
+#define YOFFSET (1.5000000f) /* cos 60' + 1 */
+
+#if 0
+
+#define SIZE 3
+
+/* generates a grid with edges of given size */
+/* acd TODO - replace hex[] with this and allow size and distance as parameters */
+
+int
+generate_grid(int size)
+
+ int i, x, y;
+
+ gp->size--;
+
+ i = gp->size;
+ for (y = -size ; y <= size ; y++) {
+ for (x = -i ; x <= i ; x += 2) {
+ printf("{XOFFSET * %d, YOFFSET * %d, 0},\n", x, y);
+ }
+ printf("\n");
+ if (y < 0) {
+ i++;
+ } else {
+ i--;
+ }
+ }
+ return 0;
+}
+#endif
+
+/* acd - this is terrible - 120+ hexes */
+static const hex_t hex[] = {
+ /* edges of size 7 */
+ /* number of hexagons required to cover screen depends on camera distance */
+ /* at a distance of 10 this is just about enough. */
+ {XOFFSET * -6, YOFFSET * -6, 0},
+ {XOFFSET * -4, YOFFSET * -6, 0},
+ {XOFFSET * -2, YOFFSET * -6, 0},
+ {XOFFSET * 0, YOFFSET * -6, 0},
+ {XOFFSET * 2, YOFFSET * -6, 0},
+ {XOFFSET * 4, YOFFSET * -6, 0},
+ {XOFFSET * 6, YOFFSET * -6, 0},
+
+ {XOFFSET * -7, YOFFSET * -5, 0},
+ {XOFFSET * -5, YOFFSET * -5, 0},
+ {XOFFSET * -3, YOFFSET * -5, 0},
+ {XOFFSET * -1, YOFFSET * -5, 0},
+ {XOFFSET * 1, YOFFSET * -5, 0},
+ {XOFFSET * 3, YOFFSET * -5, 0},
+ {XOFFSET * 5, YOFFSET * -5, 0},
+ {XOFFSET * 7, YOFFSET * -5, 0},
+
+ {XOFFSET * -8, YOFFSET * -4, 0},
+ {XOFFSET * -6, YOFFSET * -4, 0},
+ {XOFFSET * -4, YOFFSET * -4, 0},
+ {XOFFSET * -2, YOFFSET * -4, 0},
+ {XOFFSET * 0, YOFFSET * -4, 0},
+ {XOFFSET * 2, YOFFSET * -4, 0},
+ {XOFFSET * 4, YOFFSET * -4, 0},
+ {XOFFSET * 6, YOFFSET * -4, 0},
+ {XOFFSET * 8, YOFFSET * -4, 0},
+
+ {XOFFSET * -9, YOFFSET * -3, 0},
+ {XOFFSET * -7, YOFFSET * -3, 0},
+ {XOFFSET * -5, YOFFSET * -3, 0},
+ {XOFFSET * -3, YOFFSET * -3, 0},
+ {XOFFSET * -1, YOFFSET * -3, 0},
+ {XOFFSET * 1, YOFFSET * -3, 0},
+ {XOFFSET * 3, YOFFSET * -3, 0},
+ {XOFFSET * 5, YOFFSET * -3, 0},
+ {XOFFSET * 7, YOFFSET * -3, 0},
+ {XOFFSET * 9, YOFFSET * -3, 0},
+
+ {XOFFSET * -10, YOFFSET * -2, 0},
+ {XOFFSET * -8, YOFFSET * -2, 0},
+ {XOFFSET * -6, YOFFSET * -2, 0},
+ {XOFFSET * -4, YOFFSET * -2, 0},
+ {XOFFSET * -2, YOFFSET * -2, 0},
+ {XOFFSET * 0, YOFFSET * -2, 0},
+ {XOFFSET * 2, YOFFSET * -2, 0},
+ {XOFFSET * 4, YOFFSET * -2, 0},
+ {XOFFSET * 6, YOFFSET * -2, 0},
+ {XOFFSET * 8, YOFFSET * -2, 0},
+ {XOFFSET * 10, YOFFSET * -2, 0},
+
+ {XOFFSET * -11, YOFFSET * -1, 0},
+ {XOFFSET * -9, YOFFSET * -1, 0},
+ {XOFFSET * -7, YOFFSET * -1, 0},
+ {XOFFSET * -5, YOFFSET * -1, 0},
+ {XOFFSET * -3, YOFFSET * -1, 0},
+ {XOFFSET * -1, YOFFSET * -1, 0},
+ {XOFFSET * 1, YOFFSET * -1, 0},
+ {XOFFSET * 3, YOFFSET * -1, 0},
+ {XOFFSET * 5, YOFFSET * -1, 0},
+ {XOFFSET * 7, YOFFSET * -1, 0},
+ {XOFFSET * 9, YOFFSET * -1, 0},
+ {XOFFSET * 11, YOFFSET * -1, 0},
+
+ {XOFFSET * -12, YOFFSET * 0, 0},
+ {XOFFSET * -10, YOFFSET * 0, 0},
+ {XOFFSET * -8, YOFFSET * 0, 0},
+ {XOFFSET * -6, YOFFSET * 0, 0},
+ {XOFFSET * -4, YOFFSET * 0, 0},
+ {XOFFSET * -2, YOFFSET * 0, 0},
+ {XOFFSET * 0, YOFFSET * 0, 0},
+ {XOFFSET * 2, YOFFSET * 0, 0},
+ {XOFFSET * 4, YOFFSET * 0, 0},
+ {XOFFSET * 6, YOFFSET * 0, 0},
+ {XOFFSET * 8, YOFFSET * 0, 0},
+ {XOFFSET * 10, YOFFSET * 0, 0},
+ {XOFFSET * 12, YOFFSET * 0, 0},
+
+ {XOFFSET * -11, YOFFSET * 1, 0},
+ {XOFFSET * -9, YOFFSET * 1, 0},
+ {XOFFSET * -7, YOFFSET * 1, 0},
+ {XOFFSET * -5, YOFFSET * 1, 0},
+ {XOFFSET * -3, YOFFSET * 1, 0},
+ {XOFFSET * -1, YOFFSET * 1, 0},
+ {XOFFSET * 1, YOFFSET * 1, 0},
+ {XOFFSET * 3, YOFFSET * 1, 0},
+ {XOFFSET * 5, YOFFSET * 1, 0},
+ {XOFFSET * 7, YOFFSET * 1, 0},
+ {XOFFSET * 9, YOFFSET * 1, 0},
+ {XOFFSET * 11, YOFFSET * 1, 0},
+
+ {XOFFSET * -10, YOFFSET * 2, 0},
+ {XOFFSET * -8, YOFFSET * 2, 0},
+ {XOFFSET * -6, YOFFSET * 2, 0},
+ {XOFFSET * -4, YOFFSET * 2, 0},
+ {XOFFSET * -2, YOFFSET * 2, 0},
+ {XOFFSET * 0, YOFFSET * 2, 0},
+ {XOFFSET * 2, YOFFSET * 2, 0},
+ {XOFFSET * 4, YOFFSET * 2, 0},
+ {XOFFSET * 6, YOFFSET * 2, 0},
+ {XOFFSET * 8, YOFFSET * 2, 0},
+ {XOFFSET * 10, YOFFSET * 2, 0},
+
+ {XOFFSET * -9, YOFFSET * 3, 0},
+ {XOFFSET * -7, YOFFSET * 3, 0},
+ {XOFFSET * -5, YOFFSET * 3, 0},
+ {XOFFSET * -3, YOFFSET * 3, 0},
+ {XOFFSET * -1, YOFFSET * 3, 0},
+ {XOFFSET * 1, YOFFSET * 3, 0},
+ {XOFFSET * 3, YOFFSET * 3, 0},
+ {XOFFSET * 5, YOFFSET * 3, 0},
+ {XOFFSET * 7, YOFFSET * 3, 0},
+ {XOFFSET * 9, YOFFSET * 3, 0},
+
+ {XOFFSET * -8, YOFFSET * 4, 0},
+ {XOFFSET * -6, YOFFSET * 4, 0},
+ {XOFFSET * -4, YOFFSET * 4, 0},
+ {XOFFSET * -2, YOFFSET * 4, 0},
+ {XOFFSET * 0, YOFFSET * 4, 0},
+ {XOFFSET * 2, YOFFSET * 4, 0},
+ {XOFFSET * 4, YOFFSET * 4, 0},
+ {XOFFSET * 6, YOFFSET * 4, 0},
+ {XOFFSET * 8, YOFFSET * 4, 0},
+
+ {XOFFSET * -7, YOFFSET * 5, 0},
+ {XOFFSET * -5, YOFFSET * 5, 0},
+ {XOFFSET * -3, YOFFSET * 5, 0},
+ {XOFFSET * -1, YOFFSET * 5, 0},
+ {XOFFSET * 1, YOFFSET * 5, 0},
+ {XOFFSET * 3, YOFFSET * 5, 0},
+ {XOFFSET * 5, YOFFSET * 5, 0},
+ {XOFFSET * 7, YOFFSET * 5, 0},
+
+ {XOFFSET * -6, YOFFSET * 6, 0},
+ {XOFFSET * -4, YOFFSET * 6, 0},
+ {XOFFSET * -2, YOFFSET * 6, 0},
+ {XOFFSET * 0, YOFFSET * 6, 0},
+ {XOFFSET * 2, YOFFSET * 6, 0},
+ {XOFFSET * 4, YOFFSET * 6, 0},
+ {XOFFSET * 6, YOFFSET * 6, 0},
+};
+
+/*
+**----------------------------------------------------------------------------
+** Local Variables
+**----------------------------------------------------------------------------
+*/
+
+static gleidestruct *gleidescope = NULL;
+
+#if 0
+/*
+ *load defaults in config structure
+ */
+static void setdefaultconfig(void)
+{
+#ifdef GRAB
+ grab = False;
+#endif
+ move = False;
+ rotate = False;
+ zoom = False;
+ image = NULL;
+}
+#endif
+
+ENTRYPOINT Bool
+gleidescope_handle_event(ModeInfo *mi, XEvent *event)
+{
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+
+ /*
+ printf("event:%d\n", event->xany.type);
+ printf("button:%d\n", event->xbutton.button);
+ */
+ if (event->xany.type == ButtonPress)
+ {
+ if (event->xbutton.button == Button1 ||
+ event->xbutton.button == Button3)
+ {
+ /* store initial values of mouse */
+ gp->xstart = event->xbutton.x;
+ gp->ystart = event->xbutton.y;
+
+ /* button is down */
+ gp->button_down_p = True;
+ return True;
+ }
+#if 0 /* TODO */
+ else if (event->xbutton.button == Button4)
+ {
+ /* zoom in */
+ return True;
+ }
+ else if (event->xbutton.button == Button5)
+ {
+ /* zoom out */
+ return True;
+ }
+#endif
+ } else if (event->xany.type == ButtonRelease)
+ {
+ if (event->xbutton.button == Button1 ||
+ event->xbutton.button == Button3)
+ {
+ /* button is up */
+ gp->button_down_p = False;
+ return True;
+ }
+ } else if (event->xany.type == MotionNotify)
+ {
+ if (gp->button_down_p)
+ {
+ /* update mouse position */
+ gp->xmouse += (double)(event->xmotion.x - gp->xstart) / MI_WIDTH(mi);
+ gp->ymouse += (double)(event->xmotion.y - gp->ystart) / MI_HEIGHT(mi);
+ gp->xstart = event->xmotion.x;
+ gp->ystart = event->xmotion.y;
+
+ return True;
+ }
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ gp->start_time = -1;
+ gp->fade = 0;
+ return True;
+ }
+
+ return False;
+}
+
+
+static void
+image_loaded_cb (const char *filename, XRectangle *geometry,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure)
+{
+ texture *tp = (texture *) closure;
+
+#if 0
+ gp->max_tx = (GLfloat) image_width / texture_width;
+ gp->max_ty = (GLfloat) image_height / texture_height;
+#endif
+
+ /* new - taken from flipscreen */
+ tp->width = texture_width;
+ tp->height = texture_height;
+ tp->min_tx = (GLfloat) geometry->x / tp->width;
+ tp->min_ty = (GLfloat) geometry->y / tp->height;
+ tp->max_tx = (GLfloat) (geometry->x + geometry->width) / tp->width;
+ tp->max_ty = (GLfloat) (geometry->y + geometry->height) / tp->height;
+
+#ifdef DEBUG
+ printf("Image w,h: (%d, %d)\n", image_width, image_height);
+ printf("Texture w,h: (%d, %d)\n", texture_width, texture_height);
+ printf("Geom x,y: (%d, %d)\n", geometry->x, geometry->y);
+ printf("Geom w,h: (%d, %d)\n", geometry->width, geometry->height);
+ printf("Max Tx,Ty: (%f, %f)\n", tp->max_tx, tp->max_ty);
+#endif
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+ (tp->mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
+
+ tp->waiting_for_image_p = False;
+ tp->start_time = time ((time_t *) 0);
+}
+
+static void
+getSnapshot(ModeInfo *mi, texture *texture)
+{
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+
+#ifdef DEBUG
+ printf("getSnapshot");
+#endif
+
+ if (MI_IS_WIREFRAME(mi))
+ return;
+
+ gp->mipmap_p = True;
+ load_texture_async (mi->xgwa.screen, mi->window,
+ *gp->glx_context, 0, 0, gp->mipmap_p,
+ texture->id, image_loaded_cb, texture);
+ texture->start_time = time((time_t *)0);
+}
+
+#define TEXTURE_SIZE 256
+
+static void
+plot(unsigned char *buffer, int x, int y, int r, int g, int b, int a) {
+ int c;
+ if (x < 0 || x >= TEXTURE_SIZE || y < 0 || y >= TEXTURE_SIZE) {
+ return;
+ }
+ c = ((x * TEXTURE_SIZE) + y) * 4;
+ /*printf("(%d,%d)[%d]\n", x, y, c);*/
+ buffer[c + 0] = r;
+ buffer[c + 1] = g;
+ buffer[c + 2] = b;
+ buffer[c + 3] = a;
+}
+
+#if 0
+static void
+plot2(unsigned char *buffer, int x, int y, int r, int g, int b, int a) {
+ int c;
+ if (x < 0 || x >= TEXTURE_SIZE || y < 0 || y >= TEXTURE_SIZE) {
+ return;
+ }
+ c = ((x * TEXTURE_SIZE) + y) * 4;
+ /*printf("(%d,%d)[%d]\n", x, y, c);*/
+ buffer[c + 0] = r;
+ buffer[c + 1] = g;
+ buffer[c + 2] = b;
+ buffer[c + 3] = a;
+
+ if (y + 1 < TEXTURE_SIZE) {
+ buffer[c + 4] = r;
+ buffer[c + 5] = g;
+ buffer[c + 6] = b;
+ buffer[c + 7] = a;
+ }
+
+ if (x + 1 < TEXTURE_SIZE) {
+ c += (TEXTURE_SIZE * 4);
+ buffer[c + 0] = r;
+ buffer[c + 1] = g;
+ buffer[c + 2] = b;
+ buffer[c + 3] = a;
+ if (y + 1 < TEXTURE_SIZE) {
+ buffer[c + 4] = r;
+ buffer[c + 5] = g;
+ buffer[c + 6] = b;
+ buffer[c + 7] = a;
+ }
+ }
+}
+#endif
+
+/* draw geometric shapes to texture */
+/* modifies passed in buffer */
+static void
+draw_shapes (unsigned char *buffer) {
+ int a = 0xff;
+ int x, y, w, h;
+ int i, j;
+ int s;
+ float left, right;
+
+ for (i = 0 ; i < TEXTURE_SIZE * TEXTURE_SIZE * 4 ; i += 4) {
+ buffer[i + 0] = 0x00;
+ buffer[i + 1] = 0x00;
+ buffer[i + 2] = 0x00;
+ buffer[i + 3] = 0xff;
+ }
+
+ for (s = 0 ; s < 25 ; s++) {
+ int shape = random() % 3;
+
+ /* 8 bits */
+ int r = (random() & 0xff);
+ int g = (random() & 0xff);
+ int b = (random() & 0xff);
+
+ switch (shape) {
+ case 0:
+ /* rectangle */
+ x = (random() % TEXTURE_SIZE) - (TEXTURE_SIZE / 4); /* top left */
+ y = (random() % TEXTURE_SIZE) - (TEXTURE_SIZE / 4);
+ w = 10 + random() % (TEXTURE_SIZE / 4); /* size */
+ h = 10 + random() % (TEXTURE_SIZE / 4);
+#ifdef DEBUG
+ printf("Rectangle: (%d, %d)(%d, %d)\n", x, y, w, h);
+#endif
+ if (x < 0) {
+ x = 0;
+ }
+ if (y < 0) {
+ y = 0;
+ }
+ for (i = x ; i < x + w && i < TEXTURE_SIZE; i++) {
+ for (j = y ; j < y + h && j < TEXTURE_SIZE; j++) {
+ plot(buffer, i, j, r, g, b, a);
+ }
+ }
+ break;
+
+ case 1:
+ /* circle */
+ x = random() % TEXTURE_SIZE; /* centre */
+ y = random() % TEXTURE_SIZE;
+ h = 10 + random() % (TEXTURE_SIZE / 8); /* radius */
+#ifdef DEBUG
+ printf("Circle: %d, %d, %d\n", x, y, h);
+#endif
+ for (i = 0 ; i < h ; i++) {
+ int xdist = i * i;
+ for (j = 0 ; j < h ; j++) {
+ int ydist = j * j;
+ /*
+ printf("xdist: %d\n", xdist);
+ printf("ydist: %d\n", ydist);
+ printf("radius: %d\n", h * h);
+ */
+ if ((xdist + ydist) < (h * h)) {
+ plot(buffer, x + i, y + j, r, b, g, a);
+ /* check we haven't already done these */
+ if (j != 0) {
+ plot(buffer, x + i, y - j, r, b, g, a);
+ }
+ if (i != 0) {
+ plot(buffer, x - i, y + j, r, b, g, a);
+ if (j != 0) {
+ plot(buffer, x - i, y - j, r, b, g, a);
+ }
+ }
+ }
+ }
+ }
+ break;
+
+ case 2:
+ /* triangle */
+ x = random() % TEXTURE_SIZE; /* top */
+ y = random() % TEXTURE_SIZE;
+ h = 10 + random() % (TEXTURE_SIZE / 4); /* height */
+#ifdef DEBUG
+ printf("Triangle: %d, %d, %d\n", x, y, h);
+#endif
+ left = x;
+ right = x;
+ for (i = 0 ; i < h ; i++) {
+ for (j = left ; j < right ; j++) {
+ plot(buffer, j, y + i, r, g, b, a);
+ }
+ left -= .5;
+ right += .5;
+ }
+ break;
+ }
+ }
+}
+
+static void
+setup_random_texture (ModeInfo *mi, texture *texture)
+{
+ int width = 0, height = 0;
+ char buf[1024];
+ unsigned char *my_data = NULL;
+#if 0
+ int i, j, c;
+ int style;
+ int r0, g0, b0, a0, r1, g1, b1, a1;
+#endif
+
+#ifdef DEBUG
+ printf("RandomTexture\n");
+#endif
+
+ /* use this texture */
+ glBindTexture(GL_TEXTURE_2D, texture->id);
+
+ clear_gl_error();
+
+ /*
+ * code for various generated patterns - noise, stripes, checks etc.
+ * random geometric shapes looked the best.
+ */
+
+#if 0
+ style = random() & 0x3;
+ r0 = random() & 0xff;
+ g0 = random() & 0xff;
+ b0 = random() & 0xff;
+ a0 = 0xff;
+ r1 = random() & 0xff;
+ g1 = random() & 0xff;
+ b1 = random() & 0xff;
+ a1 = 0xff;
+
+ switch (style) {
+ case 0: /* random */
+ printf("Random0\n");
+ height = width = TEXTURE_SIZE;
+ my_data = (void *)malloc(width * height * 4);
+ for (i = 0 ; i < width ; i += 2) {
+ for (j = 0 ; j < height ; j += 2) {
+ r0 = random() & 0xff;
+ g0 = random() & 0xff;
+ b0 = random() & 0xff;
+ a0 = 0xff;
+ plot2(my_data, i, j, r0, g0, b0, a0);
+ }
+ }
+ break;
+
+ case 1: /* shapes */
+#endif
+#ifdef DEBUG
+ printf("Shapes\n");
+#endif
+ height = width = TEXTURE_SIZE;
+ my_data = (void *)malloc(width * height * 4);
+ draw_shapes(my_data);
+#if 0
+ break;
+
+ case 2: /* check */
+ printf("Check\n");
+ height = width = TEXTURE_SIZE;
+ my_data = (void *)malloc(width * height * 4);
+ for (i = 0 ; i < height ; i += 2) {
+ for (j = 0 ; j < width ; j += 2) {
+ if (((i + j) & 0x3) == 0) {
+ plot2(my_data, i, j, r0, g0, b0, a0);
+ } else {
+ plot2(my_data, i, j, r1, g1, b1, a1);
+ }
+ }
+ }
+ break;
+
+ case 3: /* random stripes */
+ printf("Stripes 2\n");
+ height = width = TEXTURE_SIZE;
+ my_data = (void *)malloc(width * height * 4);
+ for (i = 0 ; i < height ; i += 2) {
+ r0 = random() & 0xff;
+ g0 = random() & 0xff;
+ b0 = random() & 0xff;
+ a0 = 0xff;
+ for (j = 0 ; j < width ; j += 2) {
+ plot2(my_data, i, j, r0, g0, b0, a0);
+ }
+ }
+ break;
+ }
+#endif
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ width, height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, my_data);
+ sprintf (buf, "random texture: (%dx%d)",
+ width, height);
+ check_gl_error(buf);
+
+ /* setup parameters for texturing */
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, width);
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ if (random() & 0x1) {
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ } else {
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ }
+
+ if (my_data != NULL) {
+ free(my_data);
+ my_data = NULL;
+ }
+
+ /* use full texture */
+ /* acd - was 1.0 */
+ texture->min_tx = 0.0;
+ texture->max_tx = 2.0;
+ texture->min_ty = 0.0;
+ texture->max_ty = 2.0;
+ texture->start_time = time((time_t *)0);
+}
+
+static Bool
+setup_file_texture (ModeInfo *mi, char *filename, texture *texture)
+{
+ Display *dpy = mi->dpy;
+ Visual *visual = mi->xgwa.visual;
+ char buf[1024];
+
+ XImage *image = file_to_ximage (dpy, visual, filename);
+ if (!image) return False;
+
+#ifdef DEBUG
+ printf("FileTexture\n");
+#endif
+
+ /* use this texture */
+ glBindTexture(GL_TEXTURE_2D, texture->id);
+
+ clear_gl_error();
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ image->width, image->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, image->data);
+ sprintf (buf, "texture: %.100s (%dx%d)",
+ filename, image->width, image->height);
+ check_gl_error(buf);
+
+ /* setup parameters for texturing */
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, image->width);
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ /* use full texture */
+ texture->min_tx = 0.0;
+ texture->max_tx = 1.0;
+ texture->min_ty = 0.0;
+ texture->max_ty = 1.0;
+ texture->start_time = time((time_t *)0);
+ return True;
+}
+
+static void
+setup_texture(ModeInfo * mi, texture *texture)
+{
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+
+ if (!image_str || !*image_str || !strcmp(image_str, "DEFAULT")) {
+ BUILTIN:
+ /* no image specified - use system settings */
+#ifdef DEBUG
+ printf("SetupTexture: get_snapshot\n");
+#endif
+ getSnapshot(mi, texture);
+ } else {
+ if (strcmp(image_str, "GENERATE") == 0) {
+#ifdef DEBUG
+ printf("SetupTexture: random_texture\n");
+#endif
+ setup_random_texture(mi, texture);
+ } else {
+ /* use supplied image file */
+#ifdef DEBUG
+ printf("SetupTexture: file_texture\n");
+#endif
+ if (! setup_file_texture(mi, image_str, texture))
+ goto BUILTIN;
+ }
+ }
+ /* copy start time from texture */
+ gp->start_time = texture->start_time;
+
+ check_gl_error("texture initialization");
+
+ /* acd
+ * resultant loaded image is upside down BUT
+ * it's a kaledescope and half of the hexagon is backwards anyway...
+ */
+
+ /* TODO: values for lissajous movement */
+ texture->x_period = frandrange(-2.0, 2.0);
+ texture->y_period = frandrange(-2.0, 2.0);
+ texture->r_period = frandrange(-2.0, 2.0);
+ texture->x_phase = frand(M_PI * 2);
+ texture->y_phase = frand(M_PI * 2);
+ texture->r_phase = frand(M_PI * 2);
+#ifdef DEBUG
+ printf("XPeriod %f XPhase %f\n", texture->x_period, texture->x_phase);
+ printf("YPeriod %f YPhase %f\n", texture->y_period, texture->y_phase);
+ printf("RPeriod %f RPhase %f\n", texture->r_period, texture->r_phase);
+#endif
+}
+
+#define VERTEX0 glVertex3f( 0.0000f, 0.000f, 0.0f);
+#define VERTEX1 glVertex3f( 0.0000f, 1.000f, 0.0f);
+#define VERTEX2 glVertex3f( XOFFSET, 0.500f, 0.0f);
+#define VERTEX3 glVertex3f( XOFFSET, -0.500f, 0.0f);
+#define VERTEX4 glVertex3f( 0.0000f, -1.000f, 0.0f);
+#define VERTEX5 glVertex3f(-XOFFSET, -0.500f, 0.0f);
+#define VERTEX6 glVertex3f(-XOFFSET, 0.500f, 0.0f);
+
+/*
+** Three different functions for calculating texture coordinates
+** which modify how the texture triangle moves over the source image.
+** Choose one.
+*/
+
+#if 0
+/* the classic equilateral triangle rotating around centre */
+static void
+calculate_texture_coords(ModeInfo *mi, texture *texture, vector2f t[3]) {
+
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+ GLfloat centre_x = 0.5;
+ GLfloat centre_y = 0.5;
+ GLfloat radius_x = (texture->max_tx - texture->min_tx) / 2;
+ GLfloat radius_y = (texture->max_ty - texture->min_ty) / 2;
+ GLfloat tangle2;
+ t[0].x = centre_x;
+ t[0].y = centre_y;
+
+ /* t[1] */
+ t[1].x = centre_x + .95 * radius_x * cos((gp->ymouse * 2 * M_PI) + (gp->tangle * RADIANS));
+ t[1].y = centre_y + .95 * radius_y * sin((gp->ymouse * 2 * M_PI) + (gp->tangle * RADIANS));
+
+ /* t[2] is always 60' further around than t2 */
+ tangle2 = (gp->ymouse * 2 * M_PI) + (gp->tangle * RADIANS) + (M_PI * 2 / 6);
+ t[2].x = centre_x + .95 * radius_x * cos(tangle2);
+ t[2].y = centre_y + .95 * radius_y * sin(tangle2);
+#if 0
+ printf("texcoords:[%f,%f]->[%f,%f](%f,%f)\n", t[0].x, t[0].y, t[1].x, t[1].y, texture->max_tx, texture->max_ty);
+#endif
+}
+#endif
+
+#if 1
+/* new lissajous movement pattern */
+static void
+calculate_texture_coords(ModeInfo *mi, texture *texture, vector2f t[3]) {
+
+ /* equilateral triangle rotating around centre */
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+ GLfloat width = texture->max_tx - texture->min_tx;
+ GLfloat height = texture->max_ty - texture->min_ty;
+ /* centre */
+ GLfloat centre_x = texture->min_tx + (width * .5);
+ GLfloat centre_y = texture->min_ty + (height * .5);
+ /* m radius and t radius should be = .5 */
+ /* triangle radius is 30% available space */
+ GLfloat t_radius_x = width * .3;
+ GLfloat t_radius_y = height * .3;
+ /* movement radius is 30% available space */
+ GLfloat m_radius_x = width * .2;
+ GLfloat m_radius_y = height * .2;
+ GLfloat angle2;
+
+ /* centre of triangle */
+ GLfloat angle = (gp->ymouse * 2 * M_PI) + (gp->tangle * RADIANS); /* to radians */
+ GLfloat t_centre_x = centre_x + m_radius_x * cos(texture->x_period * angle + texture->x_phase);
+ GLfloat t_centre_y = centre_y + m_radius_y * sin(texture->y_period * angle + texture->y_phase);
+
+#if 0
+ printf("WH: %f, %f - tWH: %f, %f\n", width, height, texture->width, texture->height);
+ printf("size: (%f, %f)\n", width, height);
+ printf("centre: (%f, %f)\n", centre_x, centre_y);
+#endif
+
+ angle2 = texture->r_period * angle + texture->r_phase;
+ t[0].x = t_centre_x + t_radius_x * cos(angle2);
+ t[0].y = t_centre_y + t_radius_y * sin(angle2);
+ t[1].x = t_centre_x + t_radius_x * cos(angle2 + ANGLE_120);
+ t[1].y = t_centre_y + t_radius_y * sin(angle2 + ANGLE_120);
+ t[2].x = t_centre_x + t_radius_x * cos(angle2 + ANGLE_240);
+ t[2].y = t_centre_y + t_radius_y * sin(angle2 + ANGLE_240);
+
+#if 0
+ printf("texcoords:[%f,%f]->[%f,%f](%f,%f)\n", t[0].x, t[0].y, t[1].x, t[1].y, texture->max_tx, texture->max_ty);
+#endif
+}
+#endif
+
+#if 0
+/* corners into corners - meant to maximise coverage */
+static void
+calculate_texture_coords(ModeInfo *mi, texture *texture, vector2f t[3]) {
+
+ /* equilateral triangle rotating around centre */
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+ GLfloat width = texture->max_tx - texture->min_tx;
+ GLfloat height = texture->max_ty - texture->min_ty;
+ /* centre */
+ GLfloat centre_x = texture->min_tx + (width * .5);
+ GLfloat centre_y = texture->min_ty + (height * .5);
+ /* m radius and t radius should be = .5 */
+ /* triangle radius calculated using maths 8) */
+#define TRADIUS (M_SQRT2 - 1.0)
+#define MRADIUS (1.0 - (M_SQRT2 / 2.0))
+ GLfloat t_radius_x = width * TRADIUS * .95;
+ GLfloat t_radius_y = height * TRADIUS * .95;
+ /* movement radius also calculated using maths */
+ GLfloat m_radius_x = width * MRADIUS * .95;
+ GLfloat m_radius_y = height * MRADIUS * .95;
+ GLfloat angle, angle2;
+ GLfloat t_centre_x, t_centre_y;
+
+ /* centre of triangle */
+ angle = gp->tangle * RADIANS; /* to radians */
+ t_centre_x = centre_x + m_radius_x * cos(angle);
+ t_centre_y = centre_y + m_radius_y * sin(angle);
+#if 0
+ printf("angle: %f, %f\n", angle, gp->tangle);
+ printf("tcentre: %f,%f\n", t_centre_x, t_centre_y);
+ printf("tradius: %f,%f\n", t_radius_x, t_radius_y);
+
+ printf("size: (%f, %f)\n", width, height);
+ printf("centre: (%f, %f)\n", centre_x, centre_y);
+ printf("centre: (%f, %f)\n", centre_x, centre_y);
+ printf("TRADIUS: %f\n", TRADIUS);
+ printf("MRADIUS: %f\n", MRADIUS);
+#endif
+
+ /* angle2 is tied to tangle */
+ angle2 = (180.0 - ((30.0 / 90.0) * gp->tangle)) * RADIANS;
+#if 0
+ printf("Angle1: %f\tAngle2: %f\n", angle / RADIANS, angle2 / RADIANS);
+#endif
+ t[0].x = t_centre_x + t_radius_x * cos(angle2);
+ t[0].y = t_centre_y + t_radius_y * sin(angle2);
+ t[1].x = t_centre_x + t_radius_x * cos(angle2 + ANGLE_120);
+ t[1].y = t_centre_y + t_radius_y * sin(angle2 + ANGLE_120);
+ t[2].x = t_centre_x + t_radius_x * cos(angle2 + ANGLE_240);
+ t[2].y = t_centre_y + t_radius_y * sin(angle2 + ANGLE_240);
+
+#if 0
+ printf("texcoords:[%f,%f][%f,%f][%f,%f]\n", t[0].x, t[0].y, t[1].x, t[1].y, t[2].x, t[2].y);
+#endif
+}
+#endif
+
+static int
+draw_hexagons(ModeInfo *mi, int translucency, texture *texture)
+{
+ int polys = 0;
+ int i;
+ vector2f t[3];
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+
+ calculate_texture_coords(mi, texture, t);
+
+ glColor4f(1.0, 1.0, 1.0, (float)translucency / MAX_FADE);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glDepthMask(GL_FALSE);
+ glBindTexture(GL_TEXTURE_2D, texture->id);
+
+ if (gp->list == -1) {
+ gp->list = glGenLists(1);
+ }
+
+ /* compile new list */
+ glNewList(gp->list, GL_COMPILE);
+ glBegin(GL_TRIANGLES);
+
+ /*
+ ** six triangles to each hexagon
+ */
+
+ glTexCoord2f(t[0].x, t[0].y);
+ VERTEX0;
+ glTexCoord2f(t[1].x, t[1].y);
+ VERTEX1;
+ glTexCoord2f(t[2].x, t[2].y);
+ VERTEX6;
+
+ glTexCoord2f(t[0].x, t[0].y);
+ VERTEX0;
+ glTexCoord2f(t[2].x, t[2].y);
+ VERTEX6;
+ glTexCoord2f(t[1].x, t[1].y);
+ VERTEX5;
+
+ glTexCoord2f(t[0].x, t[0].y);
+ VERTEX0;
+ glTexCoord2f(t[1].x, t[1].y);
+ VERTEX5;
+ glTexCoord2f(t[2].x, t[2].y);
+ VERTEX4;
+
+ glTexCoord2f(t[0].x, t[0].y);
+ VERTEX0;
+ glTexCoord2f(t[2].x, t[2].y);
+ VERTEX4;
+ glTexCoord2f(t[1].x, t[1].y);
+ VERTEX3;
+
+ glTexCoord2f(t[0].x, t[0].y);
+ VERTEX0;
+ glTexCoord2f(t[1].x, t[1].y);
+ VERTEX3;
+ glTexCoord2f(t[2].x, t[2].y);
+ VERTEX2;
+
+ glTexCoord2f(t[0].x, t[0].y);
+ VERTEX0;
+ glTexCoord2f(t[2].x, t[2].y);
+ VERTEX2;
+ glTexCoord2f(t[1].x, t[1].y);
+ VERTEX1;
+
+ glEnd();
+ glEndList();
+
+ /* call the list n times */
+ for (i = 0 ; i < sizeof(hex) / sizeof(hex[0]) ; i++) {
+
+ glPushMatrix();
+
+ glTranslatef(hex[i].x, hex[i].y, 0.0);
+ glCallList(gp->list);
+ polys += 6;
+
+ glPopMatrix();
+ }
+
+#ifdef DISPLAY_TEXTURE
+ glPushMatrix();
+ /* acd debug - display (bigger, centred) texture */
+ glScalef(2.0, 2.0, 2.0);
+ glTranslatef(-0.5, -0.5, 0.0);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0.0, 0.0);
+ glVertex3f(0.0, 0.0, -0.1);
+ glTexCoord2f(1.0, 0.0);
+ glVertex3f(1.0, 0.0, -0.1);
+ glTexCoord2f(1.0, 1.0);
+ glVertex3f(1.0, 1.0, -0.1);
+ glTexCoord2f(0.0, 1.0);
+ glVertex3f(0.0, 1.0, -0.1);
+ polys++;
+ glEnd();
+ /* acd debug - display texture triangle */
+ glColor4f(1.0, 0.5, 1.0, 1.0);
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(t[0].x, t[0].y, -0.11);
+ glVertex3f(t[1].x, t[1].y, -0.11);
+ glVertex3f(t[2].x, t[2].y, -0.11);
+ polys++;
+ glEnd();
+ glPopMatrix();
+#endif
+
+ glDisable(GL_TEXTURE_2D);
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ return polys;
+}
+
+/*
+ * main rendering loop
+ */
+static void
+draw(ModeInfo * mi)
+{
+ GLfloat x_angle, y_angle, z_angle;
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+ vectorf v1;
+
+ mi->polygon_count = 0;
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity();
+
+ gp->tic += 0.005f;
+
+ x_angle = gp->cam_x_phase + gp->tic * gp->cam_x_speed;
+ y_angle = gp->cam_y_phase + gp->tic * gp->cam_y_speed;
+ z_angle = gp->cam_z_phase + gp->tic * gp->cam_z_speed;
+
+ if (move) {
+ v1.x = 1 * sin(x_angle);
+ v1.y = 1 * sin(y_angle);
+ } else {
+ v1.x = 0;
+ v1.y = 0;
+ }
+
+ /* size is changed in pinit() to be distance from plane */
+ gp->size = MI_SIZE(mi);
+ if (gp->size > 10) {
+ gp->size = 10;
+ }
+ if (gp->size <= 0) {
+ gp->size = 0;
+ }
+ if (gp->size > 0) {
+ /* user defined size */
+ v1.z = gp->size;
+ } else if (zoom) {
+ /* max distance given by adding the constant and the multiplier */
+ v1.z = 5.0 + 3.0 * sin(z_angle);
+ } else {
+ /* default */
+ v1.z = 7.0;
+ }
+
+ /* update rotation angle (but not if mouse button down) */
+ if (rotate && !gp->button_down_p)
+ {
+ float new_rangle_vel = 0.0;
+
+ /* update camera rotation angle and velocity */
+ gp->rangle += gp->rangle_vel;
+ new_rangle_vel = gp->rangle_vel + gp->rangle_acc;
+ if (new_rangle_vel > -MAX_ANGLE_VEL && new_rangle_vel < MAX_ANGLE_VEL)
+ {
+ /* new velocity is within limits */
+ gp->rangle_vel = new_rangle_vel;
+ }
+
+ /* randomly change twisting speed - 3ff = 1024 */
+ if ((random() % TWISTING_PROBABILITY) < 1.0) {
+ gp->rangle_acc = INITIAL_ANGLE_ACC * frand(1.0);
+ if (gp->rangle_vel > 0.0) {
+ gp->rangle_acc = -gp->rangle_acc;
+ }
+ }
+ }
+#if 0
+ printf("Rangle: %f : %f : %f\n", gp->rangle, gp->rangle_vel, gp->rangle_acc);
+ printf("Tangle: %f : %f : %f\n", gp->tangle, gp->tangle_vel, gp->tangle_acc);
+#endif
+
+#ifdef WOBBLE
+ /* this makes the image wobble - requires -move and a larger grid */
+ gluLookAt(0, 0, v1.z, v1.x, v1.y, 0.0, 0.0, 1.0, 0.0);
+#else
+ /* no wobble - camera always perpendicular to grid */
+
+ /* rotating camera rather than entire space - smoother */
+ gluLookAt(
+ v1.x, v1.y, v1.z,
+ v1.x, v1.y, 0.0,
+ sin((gp->xmouse * M_PI * 2) + gp->rangle * RADIANS),
+ cos((gp->xmouse * M_PI * 2) + gp->rangle * RADIANS),
+ 0.0);
+#endif
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ if (gp->fade == 0)
+ {
+ /* not fading */
+ mi->polygon_count +=
+ draw_hexagons(mi, MAX_FADE, &gp->textures[gp->visible]);
+ }
+ else
+ {
+ /* fading - show both textures with alpha
+ NB first is always max alpha */
+ mi->polygon_count +=
+ draw_hexagons(mi, MAX_FADE, &gp->textures[1 - gp->visible]);
+ mi->polygon_count +=
+ draw_hexagons(mi, MAX_FADE - gp->fade, &gp->textures[gp->visible]);
+
+ /* fade some more */
+ gp->fade++;
+
+ /* have we faded enough? */
+ if (gp->fade > MAX_FADE)
+ {
+ /* stop fading */
+ gp->fade = 0;
+ gp->visible = 1 - gp->visible;
+ }
+ }
+
+ /* increment texture angle based on time, velocity etc */
+ /* but only if button is not down */
+ if (!gp->button_down_p)
+ {
+ float new_tangle_vel = 0.0;
+
+ gp->tangle += gp->tangle_vel;
+
+ /* work out new texture angle velocity */
+ new_tangle_vel = gp->tangle_vel + gp->tangle_acc;
+ if (new_tangle_vel > -MAX_ANGLE_VEL && new_tangle_vel < MAX_ANGLE_VEL)
+ {
+ /* new velocity is inside limits */
+ gp->tangle_vel = new_tangle_vel;
+ }
+
+ /* randomly change twisting speed - 3ff = 1024 */
+ if ((random() % TWISTING_PROBABILITY) < 1.0) {
+ gp->tangle_acc = INITIAL_ANGLE_ACC * frand(1.0);
+ if (gp->tangle_vel > 0.0) {
+ gp->tangle_acc = -gp->tangle_acc;
+ }
+ }
+ }
+
+ glFlush();
+}
+
+/*
+ * new window size or exposure
+ */
+ENTRYPOINT void reshape_gleidescope(ModeInfo *mi, int width, int height)
+{
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(gp->glx_context));
+
+ glViewport(0, y, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(50.0, 1/h, 0.1, 2000.0);
+ glMatrixMode (GL_MODELVIEW);
+ glLineWidth(1);
+ glPointSize(1);
+}
+
+static void
+pinit(ModeInfo * mi)
+{
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+
+ /* set start time - star_time = 0 implies non-dynamic texture */
+ gp->start_time = (time_t)0;
+
+ /* set the texture size to default */
+ /*
+ gp->max_tx = 1.0;
+ gp->max_ty = 1.0;
+ */
+
+ /* no fading */
+ gp->fade = 0;
+
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glDisable(GL_LIGHTING);
+
+ /* space for textures */
+ glGenTextures(1, &gp->textures[0].id);
+ glGenTextures(1, &gp->textures[1].id);
+ gp->visible = 0;
+
+ setup_texture(mi, &gp->textures[gp->visible]);
+
+ /*
+ ** want to choose a value for arg randomly if neither -arg nor -no-arg
+ ** is specified. xscreensaver libraries don't seem to let you do this -
+ ** if something isn't true then it is false (pesky two-state boolean values).
+ ** so, i've defined both -arg and -no-arg to arguments and added the
+ ** following logic.
+ ** (btw if both -arg and -no-arg are defined then arg is set to False)
+ */
+ if (zoom == False && nozoom == False)
+ {
+ /* no zoom preference - randomise */
+ zoom = (((random() & 0x1) == 0x1) ? True : False);
+ }
+ else if (nozoom == True)
+ {
+ /* definately no zoom */
+ zoom = False;
+ }
+
+ if (move == False && nomove == False)
+ {
+ /* no move preference - randomise */
+ move = (((random() & 0x1) == 0x1) ? True : False);
+ }
+ else if (nomove == True)
+ {
+ /* definately no move */
+ move = False;
+ }
+
+ if (rotate == False && norotate == False)
+ {
+ /* no rotate preference - randomise */
+ rotate = (((random() & 0x1) == 0x1) ? True : False);
+ }
+ else if (norotate == True)
+ {
+ /* definately no rotate */
+ rotate = False;
+ }
+
+ /* define cam variables */
+ gp->cam_x_speed = MAX_CAM_SPEED * frandrange(-.5, 0.5);
+ gp->cam_x_phase = random() % 360;
+ gp->cam_y_speed = MAX_CAM_SPEED * frandrange(-.5, 0.5);
+ gp->cam_y_phase = random() % 360;
+ gp->cam_z_speed = MAX_CAM_SPEED * frandrange(-.5, 0.5);
+ gp->cam_z_phase = random() % 360;
+
+ /* initial angular speeds */
+ gp->rangle_vel = INITIAL_ANGLE_VEL * frandrange(-.5, 0.5);
+ gp->tangle_vel = INITIAL_ANGLE_VEL * frandrange(-.5, 0.5);
+ gp->rangle_acc = INITIAL_ANGLE_ACC * frandrange(-.5, 0.5);
+ gp->tangle_acc = INITIAL_ANGLE_ACC * frandrange(-.5, 0.5);
+
+ /* jwz */
+#if 0
+ {
+ GLfloat speed = 15;
+ gp->rangle_vel *= speed;
+ gp->tangle_vel *= speed;
+ gp->rangle_acc *= speed;
+ gp->tangle_acc *= speed;
+ }
+#endif
+
+ /* distance is 11 - size */
+ if (gp->size != -1) {
+ if (zoom) {
+ fprintf(stderr, "-size given. ignoring -zoom.\n");
+ zoom = False;
+ }
+ if (gp->size < 1) {
+ gp->size = 1;
+ } else if (gp->size >= 10) {
+ gp->size = 10;
+ }
+ gp->size = 11 - gp->size;
+ }
+
+#ifdef DEBUG
+printf("phases [%d, %d, %d]\n", gp->cam_x_phase, gp->cam_y_phase, gp->cam_z_phase);
+#endif
+}
+
+ENTRYPOINT void
+init_gleidescope(ModeInfo * mi)
+{
+ gleidestruct *gp;
+ int screen = MI_SCREEN(mi);
+
+ MI_INIT(mi, gleidescope);
+ gp = &gleidescope[screen];
+ gp->window = MI_WINDOW(mi);
+ gp->size = -1;
+ gp->list = -1;
+
+ if ((gp->glx_context = init_GL(mi)) != NULL) {
+
+ reshape_gleidescope(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */
+
+ glDrawBuffer(GL_BACK);
+
+ /* do initialisation */
+ pinit(mi);
+
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+ENTRYPOINT void
+draw_gleidescope(ModeInfo * mi)
+{
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+
+ if (!gp->glx_context)
+ return;
+
+ /* Just keep running before the texture has come in. */
+ /* if (gp->waiting_for_image_p) return; */
+
+ glDrawBuffer(GL_BACK);
+
+ glXMakeCurrent(display, window, *(gp->glx_context));
+ draw(mi);
+
+ if (mi->fps_p) {
+ do_fps (mi);
+ }
+
+ glFinish();
+ glXSwapBuffers(display, window);
+
+#ifdef GRAB
+ if (grab) {
+ grab_frame(display, window);
+ }
+#endif
+
+ /* need to change texture? */
+ if ((gp->start_time != 0) && (duration != -1) && gp->fade == 0) {
+ if (gp->start_time + duration <= time((time_t *)0)) {
+#ifdef DEBUG
+ printf("Start Time: %lu - Current Time: %lu\n", (unsigned long)gp->start_time, (unsigned long)time((time_t *)0));
+ printf("Changing Texture\n");
+#endif
+ /* get new snapshot (into back buffer) and start fade count */
+ setup_texture(mi, &gp->textures[1 - gp->visible]);
+ /* restart fading */
+ gp->fade = 1;
+ }
+ }
+}
+
+ENTRYPOINT void
+free_gleidescope(ModeInfo * mi)
+{
+ gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
+
+ /* acd - is this needed? */
+ if (gp->glx_context) {
+ /* Display lists MUST be freed while their glXContext is current. */
+ glXMakeCurrent(MI_DISPLAY(mi), gp->window, *(gp->glx_context));
+
+ /* acd - was code here for freeing things that are no longer in struct */
+ }
+}
+
+XSCREENSAVER_MODULE ("Gleidescope", gleidescope)
+
+#endif
diff --git a/hacks/glx/gleidescope.man b/hacks/glx/gleidescope.man
new file mode 100644
index 0000000..c0b9b15
--- /dev/null
+++ b/hacks/glx/gleidescope.man
@@ -0,0 +1,77 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+gleidescope - a tiled OpenGL kaleidescope
+.SH SYNOPSIS
+.B gleidescope
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[-delay \fInumber\fP]
+[-move]
+[-rotate]
+[-zoom]
+[-image \fIfile\fP]
+[-fps]
+[-size \fInumber\fP]
+[-duration \fInumber\fP]
+.SH DESCRIPTION
+A tiled kaleidescope using OpenGL.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-move
+Move the camera.
+.TP 8
+.B \-rotate
+Rotate the camera.
+.TP 8
+.B \-zoom
+Zoom the camera in and out.
+.TP 8
+.B \-image \fIfile\fP
+The texture map to use at the end of the kaleidescope.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-size \fInumber\fP
+The size of the hexagons being displayed [1(small)-10(large)]
+.TP 8
+.B \-duration \fInumber\fP
+The time in seconds before another image is chosen.
+.TP 8
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Andrew Dean Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Andrew Dean.
diff --git a/hacks/glx/glforestfire.c b/hacks/glx/glforestfire.c
new file mode 100644
index 0000000..bcc9ed7
--- /dev/null
+++ b/hacks/glx/glforestfire.c
@@ -0,0 +1,1097 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* fire --- 3D fire or rain landscape */
+
+#if 0
+static const char sccsid[] = "@(#)fire.c 5.02 2001/09/26 xlockmore";
+#endif
+
+/* Copyright (c) E. Lassauge, 2001. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by David Bucciarelli
+ * (tech.hmw@plus.it) and could be found in the demo package
+ * of Mesa (Mesa-3.2/3Dfx/demos/). This mode is the result of the merge of
+ * two of the David's demos (fire and rain).
+ *
+ * Eric Lassauge (October-10-2000) <lassauge@users.sourceforge.net>
+ * http://lassauge.free.fr/linux.html
+ *
+ * REVISION HISTORY:
+ *
+ * E.Lassauge - 26-Sep-2001:
+ * - add wander option and code
+ * - cleanups for xscreensaver
+ *
+ * E.Lassauge - 09-Mar-2001:
+ * - get rid of my framerate options to use showfps
+ *
+ * E.Lassauge - 12-Jan-2001:
+ * - add rain particules, selected if count=0 (no fire means rain !)
+ *
+ * E.Lassauge - 28-Nov-2000:
+ * - modified release part to add freeing of GL objects
+ *
+ * E.Lassauge - 14-Nov-2000:
+ * - use new common xpm_to_ximage function
+ *
+ * E.Lassauge - 25-Oct-2000:
+ * - add the trees (with a new resource '-trees')
+ * - corrected handling of color (textured vs untextured)
+ * - corrected handling of endiannes for the xpm files
+ * - inverted ground pixmap file
+ * - use malloc-ed tree array
+ *
+ * TSchmidt - 23-Oct-2000:
+ * - added size option like used in sproingies mode
+ *
+ * E.Lassauge - 13-Oct-2000:
+ * - when trackmouse and window is iconified (login screen): stop tracking
+ * - add pure GLX handling of framerate display (erased GLUT stuff)
+ * - made count a per screen variable and update it only if framemode
+ * - changes for no_texture an wireframe modes
+ * - change no_texture color for the ground
+ * - add freeing of texture image
+ * - misc comments and little tweakings
+ *
+ * TODO:
+ * - perhaps use a user supplied xpm for ground image (or a whatever image
+ * file using ImageMagick ?)
+ * - random number of trees ? change trees at change_fire ?
+ * - fix wireframe mode: it's too CPU intensive.
+ * - look how we can get the Wheel events (Button4&5).
+ */
+
+
+#ifdef STANDALONE /* xscreensaver mode */
+#define DEFAULTS "*delay: 10000 \n" \
+ "*count: 800 \n" \
+ "*size: 0 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+#define MODE_fire
+#include "xlockmore.h" /* from the xscreensaver distribution */
+#include "gltrackball.h"
+#else /* !STANDALONE */
+#include "xlock.h" /* from the xlockmore distribution */
+#include "visgl.h"
+#endif /* !STANDALONE */
+
+#ifdef MODE_fire
+
+#define MINSIZE 32
+
+#if defined( USE_XPM ) || defined( USE_XPMINC ) || defined(STANDALONE)
+/* USE_XPM & USE_XPMINC in xlock mode ; HAVE_XPM in xscreensaver mode */
+#include "ximage-loader.h"
+#define I_HAVE_XPM
+
+#include "images/gen/ground_png.h"
+#include "images/gen/tree_png.h"
+#endif /* HAVE_XPM */
+
+/* vector utility macros */
+#define vinit(a,i,j,k) {\
+ (a)[0]=i;\
+ (a)[1]=j;\
+ (a)[2]=k;\
+}
+
+#define vinit4(a,i,j,k,w) {\
+ (a)[0]=i;\
+ (a)[1]=j;\
+ (a)[2]=k;\
+ (a)[3]=w;\
+}
+
+#define vadds(a,dt,b) {\
+ (a)[0]+=(dt)*(b)[0];\
+ (a)[1]+=(dt)*(b)[1];\
+ (a)[2]+=(dt)*(b)[2];\
+}
+
+#define vequ(a,b) {\
+ (a)[0]=(b)[0];\
+ (a)[1]=(b)[1];\
+ (a)[2]=(b)[2];\
+}
+
+#define vinter(a,dt,b,c) {\
+ (a)[0]=(dt)*(b)[0]+(1.0-dt)*(c)[0];\
+ (a)[1]=(dt)*(b)[1]+(1.0-dt)*(c)[1];\
+ (a)[2]=(dt)*(b)[2]+(1.0-dt)*(c)[2];\
+}
+
+#define clamp(a) ((a) < 0.0 ? 0.0 : ((a) < 1.0 ? (a) : 1.0))
+
+#define vclamp(v) {\
+ (v)[0]=clamp((v)[0]);\
+ (v)[1]=clamp((v)[1]);\
+ (v)[2]=clamp((v)[2]);\
+}
+
+/* Manage option vars */
+#define DEF_TEXTURE "True"
+#define DEF_FOG "False"
+#define DEF_SHADOWS "True"
+#define DEF_FRAMERATE "False"
+#define DEF_WANDER "True"
+#define DEF_TREES "5"
+#define MAX_TREES 20
+static Bool do_texture;
+static Bool do_fog;
+static Bool do_shadows;
+static Bool do_wander;
+static int num_trees;
+static XFontStruct *mode_font = None;
+
+static XrmOptionDescRec opts[] = {
+ {"-texture", ".fire.texture", XrmoptionNoArg, "on"},
+ {"+texture", ".fire.texture", XrmoptionNoArg, "off"},
+ {"-fog", ".fire.fog", XrmoptionNoArg, "on"},
+ {"+fog", ".fire.fog", XrmoptionNoArg, "off"},
+ {"-shadows", ".fire.shadows", XrmoptionNoArg, "on"},
+ {"+shadows", ".fire.shadows", XrmoptionNoArg, "off"},
+ {"-wander", ".fire.wander", XrmoptionNoArg, "on"},
+ {"+wander", ".fire.wander", XrmoptionNoArg, "off"},
+ {"-trees", ".fire.trees", XrmoptionSepArg, 0},
+ {"-rain", ".fire.count", XrmoptionNoArg, "0"},
+
+};
+
+static argtype vars[] = {
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ {&do_fog, "fog", "Fog", DEF_FOG, t_Bool},
+ {&do_shadows, "shadows", "Shadows", DEF_SHADOWS, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&num_trees, "trees", "Trees", DEF_TREES, t_Int},
+};
+
+static OptionStruct desc[] = {
+ {"-/+texture", "turn on/off texturing"},
+ {"-/+fog", "turn on/off fog"},
+ {"-/+shadows", "turn on/off shadows"},
+ {"-/+wander", "turn on/off wandering"},
+ {"-trees num", "number of trees (0 disables)"},
+};
+
+ENTRYPOINT ModeSpecOpt fire_opts =
+ { sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc };
+
+#ifdef USE_MODULES
+ModStruct fire_description =
+ { "fire", "init_fire", "draw_fire", "release_fire",
+ "draw_fire", "change_fire", (char *) NULL, &fire_opts,
+ 10000, 800, 1, 400, 64, 1.0, "",
+ "Shows a 3D fire-like image", 0, NULL
+};
+#endif /* USE_MODULES */
+
+/* misc defines */
+#define TREEINR 2.5 /* tree min distance */
+#define TREEOUTR 8.0 /* tree max distance */
+#define FRAME 50 /* frame count interval */
+#define DIMP 20.0 /* dimension of ground */
+#define DIMTP 16.0 /* dimension of ground texture */
+
+#define RIDCOL 0.4 /* factor for color blending */
+
+#define AGRAV -9.8 /* gravity */
+
+#define NUMPART 7500 /* rain particles */
+
+/* fire particle struct */
+typedef struct {
+ int age;
+ float p[3][3];
+ float v[3];
+ float c[3][4];
+} part;
+
+/* rain particle struct */
+typedef struct {
+ float age;
+ float acc[3];
+ float vel[3];
+ float pos[3];
+ float partLength;
+ float oldpos[3];
+} rain;
+
+/* colors */
+static const GLfloat black[3] = { 0.0, 0.0, 0.0 }; /* shadow color */
+static const GLfloat partcol1[3] = { 1.0, 0.2, 0.0 }; /* initial color: red-ish */
+static const GLfloat partcol2[3] = { 1.0, 1.0, 0.0 }; /* blending color: yellow-ish */
+static const GLfloat fogcolor[4] = { 0.9, 0.9, 1.0, 1.0 };
+
+/* ground */
+static const float q[4][3] = {
+ {-DIMP, 0.0, -DIMP},
+ {DIMP, 0.0, -DIMP},
+ {DIMP, 0.0, DIMP},
+ {-DIMP, 0.0, DIMP}
+};
+
+/* ground texture */
+static const float qt[4][2] = {
+ {-DIMTP, -DIMTP},
+ {DIMTP, -DIMTP},
+ {DIMTP, DIMTP},
+ {-DIMTP, DIMTP}
+};
+
+/* default values for observer */
+static const float DEF_OBS[3] = { 2.0f, 1.0f, 0.0f };
+#define DEV_V 0.0
+#define DEF_ALPHA -90.0
+#define DEF_BETA 90.0
+
+/* tree struct */
+typedef struct {
+ float x,y,z;
+} treestruct;
+
+/* the mode struct, contains all per screen variables */
+typedef struct {
+ GLint WIDTH, HEIGHT; /* display dimensions */
+ GLXContext *glx_context;
+
+ int np; /* number of fire particles : set it through 'count' resource */
+ float eject_r; /* emission radius */
+ float dt, maxage, eject_vy, eject_vl;
+ float ridtri; /* fire particle size */
+ Bool shadows; /* misc booleans: set them through specific resources */
+ Bool fog;
+
+ part *p; /* fire particles array */
+ rain *r; /* rain particles array */
+
+ XImage *gtexture; /* ground texture image bits */
+ XImage *ttexture; /* tree texture image bits */
+ GLuint groundid; /* ground texture id: GL world */
+ GLuint treeid; /* tree texture id: GL world */
+ GLuint fontbase; /* fontbase id: GL world */
+
+ int num_trees; /* number of trees: set it through 'trees' resource */
+ treestruct *treepos; /* trees positions: float treepos[num_trees][3] */
+
+ float min[3]; /* raining area */
+ float max[3];
+
+ float obs[3]; /* observer coordinates */
+ float dir[3]; /* view direction */
+ float v; /* observer velocity */
+ float alpha; /* observer angles */
+ float beta;
+
+ trackball_state *trackball;
+ Bool button_down_p;
+ int frame;
+
+} firestruct;
+
+/* array of firestruct indexed by screen number */
+static firestruct *fire = (firestruct *) NULL;
+
+/*
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ * Misc funcs.
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ */
+
+/* utility function for the rain particles */
+static float gettimerain(void)
+{
+#if 0
+ /* Oh yeah, *that's* portable! WTF. */
+ /*
+ * I really thought clock() was standard ... EL
+ * I found this on the net:
+ * The clock() function conforms to ISO/IEC 9899:1990 (``ISO C89'')
+ * */
+
+ static clock_t told= (clock_t)0;
+ clock_t tnew,ris;
+
+ tnew=clock();
+
+ ris=tnew-told;
+
+ told=tnew;
+
+ return (0.0125 + ris/(float)CLOCKS_PER_SEC);
+#else
+ return 0.0150;
+#endif
+}
+
+/* my RAND */
+static float vrnd(void)
+{
+ return ((float) LRAND() / (float) MAXRAND);
+}
+
+/* initialise new fire particle */
+static void setnewpart(firestruct * fs, part * p)
+{
+ float a, vi[3];
+ const float *c;
+
+ p->age = 0;
+
+ a = vrnd() * M_PI * 2.0;
+
+ vinit(vi, sin(a) * fs->eject_r * vrnd(), 0.15, cos(a) * fs->eject_r * vrnd());
+ vinit(p->p[0], vi[0] + vrnd() * fs->ridtri, vi[1] + vrnd() * fs->ridtri, vi[2] + vrnd() * fs->ridtri);
+ vinit(p->p[1], vi[0] + vrnd() * fs->ridtri, vi[1] + vrnd() * fs->ridtri, vi[2] + vrnd() * fs->ridtri);
+ vinit(p->p[2], vi[0] + vrnd() * fs->ridtri, vi[1] + vrnd() * fs->ridtri, vi[2] + vrnd() * fs->ridtri);
+
+ vinit(p->v, vi[0] * fs->eject_vl / (fs->eject_r / 2),
+ vrnd() * fs->eject_vy + fs->eject_vy / 2,
+ vi[2] * fs->eject_vl / (fs->eject_r / 2));
+
+ c = partcol1;
+
+ vinit4(p->c[0], c[0] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
+ c[1] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
+ c[2] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), 1.0);
+ vinit4(p->c[1], c[0] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
+ c[1] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
+ c[2] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), 1.0);
+ vinit4(p->c[2], c[0] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
+ c[1] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
+ c[2] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), 1.0);
+}
+
+/* initialise new rain particle */
+static void setnewrain(firestruct * fs, rain * r)
+{
+ r->age=0.0f;
+
+ vinit(r->acc,0.0f,-0.98f,0.0f);
+ vinit(r->vel,0.0f,0.0f,0.0f);
+
+ r->partLength=0.2f;
+
+ vinit(r->oldpos,fs->min[0]+(fs->max[0]-fs->min[0])*vrnd(),
+ fs->max[1]+0.2f*fs->max[1]*vrnd(),
+ fs->min[2]+(fs->max[2]-fs->min[2])*vrnd());
+ vequ(r->pos,r->oldpos);
+ vadds(r->oldpos,-(r->partLength),r->vel);
+
+ r->pos[1]=(fs->max[1]-fs->min[1])*vrnd()+fs->min[1];
+ r->oldpos[1]=r->pos[1]-r->partLength*r->vel[1];
+}
+
+/* set fire particle values */
+static void setpart(firestruct * fs, part * p)
+{
+ float fact;
+
+ if (p->p[0][1] < 0.1) {
+ setnewpart(fs, p);
+ return;
+ }
+
+ p->v[1] += AGRAV * fs->dt;
+
+ vadds(p->p[0], fs->dt, p->v);
+ vadds(p->p[1], fs->dt, p->v);
+ vadds(p->p[2], fs->dt, p->v);
+
+ p->age++;
+
+ if ((p->age) > fs->maxage) {
+ vequ(p->c[0], partcol2);
+ vequ(p->c[1], partcol2);
+ vequ(p->c[2], partcol2);
+ } else {
+ fact = 1.0 / fs->maxage;
+ vadds(p->c[0], fact, partcol2);
+ vclamp(p->c[0]);
+ p->c[0][3] = fact * (fs->maxage - p->age);
+
+ vadds(p->c[1], fact, partcol2);
+ vclamp(p->c[1]);
+ p->c[1][3] = fact * (fs->maxage - p->age);
+
+ vadds(p->c[2], fact, partcol2);
+ vclamp(p->c[2]);
+ p->c[2][3] = fact * (fs->maxage - p->age);
+ }
+}
+
+/* set rain particle values */
+static void setpartrain(firestruct * fs, rain * r, float dt)
+{
+ r->age += dt;
+
+ vadds(r->vel,dt,r->acc);
+ vadds(r->pos,dt,r->vel);
+
+ if(r->pos[0]<fs->min[0])
+ r->pos[0]=fs->max[0]-(fs->min[0]-r->pos[0]);
+ if(r->pos[2]<fs->min[2])
+ r->pos[2]=fs->max[2]-(fs->min[2]-r->pos[2]);
+
+ if(r->pos[0]>fs->max[0])
+ r->pos[0]=fs->min[0]+(r->pos[0]-fs->max[0]);
+ if(r->pos[2]>fs->max[2])
+ r->pos[2]=fs->min[2]+(r->pos[2]-fs->max[2]);
+
+ vequ(r->oldpos,r->pos);
+ vadds(r->oldpos,-(r->partLength),r->vel);
+ if(r->pos[1]<fs->min[1])
+ setnewrain(fs, r);
+}
+
+/* draw a tree */
+static int drawtree(float x, float y, float z)
+{
+ int polys = 0;
+ glBegin(GL_QUADS);
+ glTexCoord2f(0.0,0.0);
+ glVertex3f(x-1.5,y+0.0,z);
+
+ glTexCoord2f(1.0,0.0);
+ glVertex3f(x+1.5,y+0.0,z);
+
+ glTexCoord2f(1.0,1.0);
+ glVertex3f(x+1.5,y+3.0,z);
+
+ glTexCoord2f(0.0,1.0);
+ glVertex3f(x-1.5,y+3.0,z);
+ polys++;
+
+
+ glTexCoord2f(0.0,0.0);
+ glVertex3f(x,y+0.0,z-1.5);
+
+ glTexCoord2f(1.0,0.0);
+ glVertex3f(x,y+0.0,z+1.5);
+
+ glTexCoord2f(1.0,1.0);
+ glVertex3f(x,y+3.0,z+1.5);
+
+ glTexCoord2f(0.0,1.0);
+ glVertex3f(x,y+3.0,z-1.5);
+ polys++;
+
+ glEnd();
+
+ return polys;
+}
+
+/* calculate observer position : modified only if trackmouse is used */
+static void calcposobs(firestruct * fs)
+{
+ fs->dir[0] = sin(fs->alpha * M_PI / 180.0);
+ fs->dir[2] =
+ cos(fs->alpha * M_PI / 180.0) * sin(fs->beta * M_PI / 180.0);
+ fs->dir[1] = cos(fs->beta * M_PI / 180.0);
+
+ fs->obs[0] += fs->v * fs->dir[0];
+ fs->obs[1] += fs->v * fs->dir[1];
+ fs->obs[2] += fs->v * fs->dir[2];
+
+ if (!fs->np)
+ {
+ vinit(fs->min,fs->obs[0]-7.0f,-0.2f,fs->obs[2]-7.0f);
+ vinit(fs->max,fs->obs[0]+7.0f,8.0f,fs->obs[2]+7.0f);
+ }
+}
+
+
+/* initialise textures */
+static void inittextures(ModeInfo * mi)
+{
+ firestruct *fs = &fire[MI_SCREEN(mi)];
+
+#if defined( I_HAVE_XPM )
+ if (do_texture) {
+
+ glGenTextures(1, &fs->groundid);
+#ifdef HAVE_GLBINDTEXTURE
+ glBindTexture(GL_TEXTURE_2D, fs->groundid);
+#endif /* HAVE_GLBINDTEXTURE */
+
+ if ((fs->gtexture = image_data_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi),
+ ground_png,
+ sizeof(ground_png)))
+ == None) {
+ (void) fprintf(stderr, "Error reading the ground texture.\n");
+ glDeleteTextures(1, &fs->groundid);
+ do_texture = False;
+ fs->groundid = 0;
+ fs->treeid = 0;
+ return;
+ }
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+ clear_gl_error();
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ fs->gtexture->width, fs->gtexture->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, fs->gtexture->data);
+ check_gl_error("texture");
+
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
+
+ if (fs->num_trees)
+ {
+ glGenTextures(1, &fs->treeid);
+#ifdef HAVE_GLBINDTEXTURE
+ glBindTexture(GL_TEXTURE_2D,fs->treeid);
+#endif /* HAVE_GLBINDTEXTURE */
+ if ((fs->ttexture = image_data_to_ximage(MI_DISPLAY(mi),
+ MI_VISUAL(mi),
+ tree_png,
+ sizeof(tree_png)))
+ == None) {
+ (void)fprintf(stderr,"Error reading tree texture.\n");
+ glDeleteTextures(1, &fs->treeid);
+ fs->treeid = 0;
+ fs->num_trees = 0;
+ return;
+ }
+
+ clear_gl_error();
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ fs->ttexture->width, fs->ttexture->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, fs->ttexture->data);
+ check_gl_error("texture");
+
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
+
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
+
+ glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
+ }
+ }
+ else
+ {
+ fs->groundid = 0; /* default textures */
+ fs->treeid = 0;
+ }
+#else /* !I_HAVE_XPM */
+ do_texture = False;
+ fs->groundid = 0; /* default textures */
+ fs->treeid = 0;
+#endif /* !I_HAVE_XPM */
+}
+
+/* init tree array and positions */
+static Bool inittree(ModeInfo * mi)
+{
+ firestruct *fs = &fire[MI_SCREEN(mi)];
+ int i;
+ float dist;
+
+ /* allocate treepos array */
+ if ((fs->treepos = (treestruct *) malloc(fs->num_trees *
+ sizeof(treestruct))) == NULL) {
+ return False;
+ }
+ /* initialise positions */
+ for(i=0;i<fs->num_trees;i++) {
+ do {
+ fs->treepos[i].x =vrnd()*TREEOUTR*2.0-TREEOUTR;
+ fs->treepos[i].y =0.0;
+ fs->treepos[i].z =vrnd()*TREEOUTR*2.0-TREEOUTR;
+ dist = sqrt(fs->treepos[i].x * fs->treepos[i].x +
+ fs->treepos[i].z * fs->treepos[i].z);
+ } while((dist<TREEINR) || (dist>TREEOUTR));
+ }
+ return True;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ * GL funcs.
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ */
+
+ENTRYPOINT void reshape_fire(ModeInfo * mi, int width, int height)
+{
+
+ firestruct *fs = &fire[MI_SCREEN(mi)];
+ int size = MI_SIZE(mi);
+
+ /* Viewport is specified size if size >= MINSIZE && size < screensize */
+ if (size <= 1) {
+ fs->WIDTH = MI_WIDTH(mi);
+ fs->HEIGHT = MI_HEIGHT(mi);
+ } else if (size < MINSIZE) {
+ fs->WIDTH = MINSIZE;
+ fs->HEIGHT = MINSIZE;
+ } else {
+ fs->WIDTH = (size > MI_WIDTH(mi)) ? MI_WIDTH(mi) : size;
+ fs->HEIGHT = (size > MI_HEIGHT(mi)) ? MI_HEIGHT(mi) : size;
+ }
+ glViewport((MI_WIDTH(mi) - fs->WIDTH) / 2, (MI_HEIGHT(mi) - fs->HEIGHT) / 2, fs->WIDTH, fs->HEIGHT);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(70.0, fs->WIDTH / (float) fs->HEIGHT, 0.1, 30.0);
+
+ glMatrixMode(GL_MODELVIEW);
+
+}
+
+static void DrawFire(ModeInfo * mi)
+{
+ int j;
+ firestruct *fs = &fire[MI_SCREEN(mi)];
+ Bool wire = MI_IS_WIREFRAME(mi);
+
+ mi->polygon_count = 0;
+
+ if (do_wander && !fs->button_down_p)
+ {
+ GLfloat x, y, z;
+
+# define SINOID(SCALE,SIZE) \
+ ((((1 + sin((fs->frame * (SCALE)) / 2 * M_PI)) / 2.0) * (SIZE)) - (SIZE)/2)
+
+ x = SINOID(0.031, 0.85);
+ y = SINOID(0.017, 0.25);
+ z = SINOID(0.023, 0.85);
+ fs->frame++;
+ fs->obs[0] = x + DEF_OBS[0];
+ fs->obs[1] = y + DEF_OBS[1];
+ fs->obs[2] = z + DEF_OBS[2];
+ fs->dir[1] = y;
+ fs->dir[2] = z;
+ }
+
+ glEnable(GL_DEPTH_TEST);
+
+ if (fs->fog)
+ glEnable(GL_FOG);
+ else
+ glDisable(GL_FOG);
+
+ glDepthMask(GL_TRUE);
+ glClearColor(0.5, 0.5, 0.8, 1.0); /* sky in the distance */
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+
+ calcposobs(fs);
+
+ gltrackball_rotate (fs->trackball);
+
+ gluLookAt(fs->obs[0], fs->obs[1], fs->obs[2],
+ fs->obs[0] + fs->dir[0],
+ fs->obs[1] + fs->dir[1],
+ fs->obs[2] + fs->dir[2],
+ 0.0, 1.0, 0.0);
+
+ glEnable(GL_TEXTURE_2D);
+
+ /* draw ground using the computed texture */
+ if (do_texture) {
+ glColor4f(1.0,1.0,1.0,1.0); /* white to get texture in it's true color */
+#ifdef HAVE_GLBINDTEXTURE
+ glBindTexture(GL_TEXTURE_2D, fs->groundid);
+#endif /* HAVE_GLBINDTEXTURE */
+ }
+ else
+ glColor4f(0.54, 0.27, 0.07, 1.0); /* untextured ground color */
+ glBegin(GL_QUADS);
+ glTexCoord2fv(qt[0]);
+ glVertex3fv(q[0]);
+ glTexCoord2fv(qt[1]);
+ glVertex3fv(q[1]);
+ glTexCoord2fv(qt[2]);
+ glVertex3fv(q[2]);
+ glTexCoord2fv(qt[3]);
+ glVertex3fv(q[3]);
+ mi->polygon_count++;
+ glEnd();
+
+ glAlphaFunc(GL_GEQUAL, 0.9);
+ if (fs->num_trees)
+ {
+ /* here do_texture IS True - and color used is white */
+ glEnable(GL_ALPHA_TEST);
+#ifdef HAVE_GLBINDTEXTURE
+ glBindTexture(GL_TEXTURE_2D,fs->treeid);
+#endif /* HAVE_GLBINDTEXTURE */
+ for(j=0;j<fs->num_trees;j++)
+ mi->polygon_count += drawtree(fs->treepos[j].x ,fs->treepos[j].y ,fs->treepos[j].z );
+ glDisable(GL_ALPHA_TEST);
+ }
+ glDisable(GL_TEXTURE_2D);
+ glDepthMask(GL_FALSE);
+
+ if (fs->shadows) {
+ /* draw shadows with black color */
+ glBegin(wire ? GL_LINE_STRIP : GL_TRIANGLES);
+ for (j = 0; j < fs->np; j++) {
+ glColor4f(black[0], black[1], black[2], fs->p[j].c[0][3]);
+ glVertex3f(fs->p[j].p[0][0], 0.1, fs->p[j].p[0][2]);
+
+ glColor4f(black[0], black[1], black[2], fs->p[j].c[1][3]);
+ glVertex3f(fs->p[j].p[1][0], 0.1, fs->p[j].p[1][2]);
+
+ glColor4f(black[0], black[1], black[2], fs->p[j].c[2][3]);
+ glVertex3f(fs->p[j].p[2][0], 0.1, fs->p[j].p[2][2]);
+ mi->polygon_count++;
+ }
+ glEnd();
+ }
+
+ glBegin(wire ? GL_LINE_STRIP : GL_TRIANGLES);
+ for (j = 0; j < fs->np; j++) {
+ /* draw particles: colors are computed in setpart */
+ glColor4fv(fs->p[j].c[0]);
+ glVertex3fv(fs->p[j].p[0]);
+
+ glColor4fv(fs->p[j].c[1]);
+ glVertex3fv(fs->p[j].p[1]);
+
+ glColor4fv(fs->p[j].c[2]);
+ glVertex3fv(fs->p[j].p[2]);
+ mi->polygon_count++;
+
+ setpart(fs, &fs->p[j]);
+ }
+ glEnd();
+
+ /* draw rain particles if no fire particles */
+ if (!fs->np)
+ {
+ float timeused = gettimerain();
+ glDisable(GL_TEXTURE_2D);
+ glShadeModel(GL_SMOOTH);
+ glBegin(GL_LINES);
+ for (j = 0; j < NUMPART; j++) {
+ glColor4f(0.7f,0.95f,1.0f,0.0f);
+ glVertex3fv(fs->r[j].oldpos);
+ glColor4f(0.3f,0.7f,1.0f,1.0f);
+ glVertex3fv(fs->r[j].pos);
+ setpartrain(fs, &fs->r[j],timeused);
+ mi->polygon_count++;
+ }
+ glEnd();
+ glShadeModel(GL_FLAT);
+ }
+
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_ALPHA_TEST);
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_FOG);
+
+ /* manage framerate display */
+ if (MI_IS_FPS(mi)) do_fps (mi);
+ glPopMatrix();
+}
+
+
+static Bool Init(ModeInfo * mi)
+{
+ int i;
+ firestruct *fs = &fire[MI_SCREEN(mi)];
+
+ /* default settings */
+ fs->eject_r = 0.1 + NRAND(10) * 0.03;
+ fs->dt = 0.015;
+ fs->eject_vy = 4;
+ fs->eject_vl = 1;
+ fs->ridtri = 0.1 + NRAND(10) * 0.005;
+ fs->maxage = 1.0 / fs->dt;
+ vinit(fs->obs, DEF_OBS[0], DEF_OBS[1], DEF_OBS[2]);
+ fs->v = 0.0;
+ fs->alpha = DEF_ALPHA;
+ fs->beta = DEF_BETA;
+
+ /* initialise texture stuff */
+ if (do_texture)
+ inittextures(mi);
+ else
+ {
+ fs->ttexture = (XImage*) NULL;
+ fs->gtexture = (XImage*) NULL;
+ }
+
+ if (MI_IS_DEBUG(mi)) {
+ (void) fprintf(stderr,
+ "%s:\n\tnum_part=%d\n\ttrees=%d\n\tfog=%s\n\tshadows=%s\n\teject_r=%.3f\n\tridtri=%.3f\n",
+ MI_NAME(mi),
+ fs->np,
+ fs->num_trees,
+ fs->fog ? "on" : "off",
+ fs->shadows ? "on" : "off",
+ fs->eject_r, fs->ridtri);
+ }
+
+ /* initialise particles and trees */
+ for (i = 0; i < fs->np; i++) {
+ setnewpart(fs, &(fs->p[i]));
+ }
+
+ if (fs->num_trees)
+ if (!inittree(mi)) {
+ return False;
+ }
+
+ /* if no fire particles then initialise rain particles */
+ if (!fs->np)
+ {
+ vinit(fs->min,-7.0f,-0.2f,-7.0f);
+ vinit(fs->max,7.0f,8.0f,7.0f);
+ for (i = 0; i < NUMPART; i++) {
+ setnewrain(fs, &(fs->r[i]));
+ }
+ }
+
+ return True;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ * Xlock hooks.
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ */
+
+
+ENTRYPOINT void
+free_fire(ModeInfo * mi)
+{
+ firestruct *fs = &fire[MI_SCREEN(mi)];
+
+ if (mode_font != None && fs->fontbase != None) {
+ glDeleteLists(fs->fontbase, mode_font->max_char_or_byte2 -
+ mode_font->min_char_or_byte2 + 1);
+ fs->fontbase = None;
+ }
+
+ if (fs->p != NULL) {
+ (void) free((void *) fs->p);
+ fs->p = (part *) NULL;
+ }
+ if (fs->r != NULL) {
+ (void) free((void *) fs->r);
+ fs->r = (rain *) NULL;
+ }
+ if (fs->treepos != NULL) {
+ (void) free((void *) fs->treepos);
+ fs->treepos = (treestruct *) NULL;
+ }
+ if (fs->ttexture != None) {
+ glDeleteTextures(1, &fs->treeid);
+ XDestroyImage(fs->ttexture);
+ fs->ttexture = None;
+ }
+ if (fs->gtexture != None) {
+ glDeleteTextures(1, &fs->groundid);
+ XDestroyImage(fs->gtexture);
+ fs->gtexture = None;
+ }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * Initialize fire. Called each time the window changes.
+ *-----------------------------------------------------------------------------
+ */
+
+ENTRYPOINT void
+init_fire(ModeInfo * mi)
+{
+ firestruct *fs;
+
+ MI_INIT (mi, fire);
+ fs = &fire[MI_SCREEN(mi)];
+ fs->np = MI_COUNT(mi);
+ fs->fog = do_fog;
+ fs->shadows = do_shadows;
+ /* initialise fire particles if any */
+ if ((fs->np)&&(fs->p == NULL)) {
+ if ((fs->p = (part *) calloc(fs->np, sizeof(part))) == NULL) {
+ free_fire(mi);
+ return;
+ }
+ }
+ else if (fs->r == NULL) {
+ /* initialise rain particles if no fire particles */
+ if ((fs->r = (rain *) calloc(NUMPART, sizeof(part))) == NULL) {
+ free_fire(mi);
+ return;
+ }
+ }
+
+ /* check tree number */
+ if (do_texture)
+ fs->num_trees = (num_trees<MAX_TREES)?num_trees:MAX_TREES;
+ else
+ fs->num_trees = 0;
+
+ fs->trackball = gltrackball_init (False);
+
+ /* xlock GL stuff */
+ if ((fs->glx_context = init_GL(mi)) != NULL) {
+
+#ifndef STANDALONE
+ Reshape(mi); /* xlock mode */
+#else
+ reshape_fire(mi,MI_WIDTH(mi),MI_HEIGHT(mi)); /* xscreensaver mode */
+#endif
+ glDrawBuffer(GL_BACK);
+ if (!Init(mi)) {
+ free_fire(mi);
+ return;
+ }
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * Called by the mainline code periodically to update the display.
+ *-----------------------------------------------------------------------------
+ */
+ENTRYPOINT void draw_fire(ModeInfo * mi)
+{
+ firestruct *fs = &fire[MI_SCREEN(mi)];
+
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ MI_IS_DRAWN(mi) = True;
+
+ if (!fs->glx_context)
+ return;
+
+ glXMakeCurrent(display, window, *(fs->glx_context));
+
+ glShadeModel(GL_FLAT);
+ glEnable(GL_DEPTH_TEST);
+
+ /* makes particles blend with background */
+ if (!MI_IS_WIREFRAME(mi)||(!fs->np))
+ {
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ /* fog stuff */
+ glEnable(GL_FOG);
+ glFogi(GL_FOG_MODE, GL_EXP);
+ glFogfv(GL_FOG_COLOR, fogcolor);
+ glFogf(GL_FOG_DENSITY, 0.03);
+ glHint(GL_FOG_HINT, GL_NICEST);
+
+ glPushMatrix();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+ DrawFire(mi);
+ glPopMatrix();
+#ifndef STANDALONE
+ Reshape(mi); /* xlock mode */
+#else
+ reshape_fire(mi,MI_WIDTH(mi),MI_HEIGHT(mi)); /* xscreensaver mode */
+#endif
+
+ glFinish();
+ glXSwapBuffers(display, window);
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * The display is being taken away from us. Free up malloc'ed
+ * memory and X resources that we've alloc'ed. Only called
+ * once, we must zap everything for every screen.
+ *-----------------------------------------------------------------------------
+ */
+
+ENTRYPOINT void release_fire(ModeInfo * mi)
+{
+ if (mode_font != None)
+ {
+ /* only free-ed when there are no more screens used */
+ XFreeFont(MI_DISPLAY(mi), mode_font);
+ mode_font = None;
+ }
+ FreeAllGL(mi);
+}
+
+ENTRYPOINT Bool
+fire_handle_event (ModeInfo *mi, XEvent *event)
+{
+ firestruct *fs = &fire[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, fs->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &fs->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+#ifndef STANDALONE
+ENTRYPOINT void change_fire(ModeInfo * mi)
+{
+ firestruct *fs = &fire[MI_SCREEN(mi)];
+
+ if (!fs->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(fs->glx_context));
+
+ /* if available, randomly change some values */
+ if (do_fog)
+ fs->fog = LRAND() & 1;
+ if (do_shadows)
+ fs->shadows = LRAND() & 1;
+ /* reset observer position */
+ frame = 0;
+ vinit(fs->obs, DEF_OBS[0], DEF_OBS[1], DEF_OBS[2]);
+ fs->v = 0.0;
+ /* particle randomisation */
+ fs->eject_r = 0.1 + NRAND(10) * 0.03;
+ fs->ridtri = 0.1 + NRAND(10) * 0.005;
+
+ if (MI_IS_DEBUG(mi)) {
+ (void) fprintf(stderr,
+ "%s:\n\tnum_part=%d\n\ttrees=%d\n\tfog=%s\n\tshadows=%s\n\teject_r=%.3f\n\tridtri=%.3f\n",
+ MI_NAME(mi),
+ fs->np,
+ fs->num_trees,
+ fs->fog ? "on" : "off",
+ fs->shadows ? "on" : "off",
+ fs->eject_r, fs->ridtri);
+ }
+}
+#endif /* !STANDALONE */
+
+XSCREENSAVER_MODULE_2 ("GLForestFire", glforestfire, fire)
+
+#endif /* MODE_fire */
diff --git a/hacks/glx/glforestfire.man b/hacks/glx/glforestfire.man
new file mode 100644
index 0000000..aae3a25
--- /dev/null
+++ b/hacks/glx/glforestfire.man
@@ -0,0 +1,130 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "03-Oct-01" "X Version 11"
+.SH NAME
+glforestfire - draws a GL animation of sprinkling fire-like 3D triangles
+.SH SYNOPSIS
+.B glforestfire
+[\-display \fIhost:display.screen\fP] [\-window] [\-root]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP]
+[\-count \fInumber_of_particles\fP]
+[\-trees \fInumber_of_trees\fP]
+[\-size \fIviewport_size\fP]
+[\-texture] [\-no-texture]
+[\-shadows] [\-no-shadows]
+[\-fog] [\-no-fog]
+[\-wireframe] [\-no-wireframe]
+[\-wander] [\-no-wander]
+[\-trackmouse] [\-no-trackmouse]
+[\-fps]
+.SH DESCRIPTION
+The \fIglforestfire\fP program draws an animation of sprinkling fire-like 3D triangles in
+a landscape filled with trees.
+.SH OPTIONS
+.I glforestfire
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-trees \fInumber_of_trees\fP\fP
+Specify how much trees are drawn in the landscape.
+.TP 8
+.B \-count \fInumber_of_particles\fP\fP
+Specify how much fire particles are drawn. A very special case is 0
+wich means that you get
+.B rain
+!
+.TP 8
+.B \-size \fIviewport_size\fP\fP
+Viewport of GL scene is specified size if greater than 32 and less than screensize. Default value is 0, meaning full screensize.
+.TP 8
+.B \-texture
+Show a textured ground and the trees. This is the default.
+.TP 8
+.B \-no\-texture
+Disables texturing the landscape. This implies that no trees are drawn.
+.TP 8
+.B \-shadows
+Show a shadow for each particle on the ground. This is the default.
+.TP 8
+.B \-no\-shadows
+Disables the drawing of the shadows.
+.TP 8
+.B \-fog
+Show a fog in the distance.
+.TP 8
+.B \-no\-fog
+Disables the fog. This is the default.
+.TP 8
+.B \-wander
+Move the observer around the landscape. This is the default.
+.TP 8
+.B \-no\-wander
+Keep the fire centered on the screen.
+.TP 8
+.B \-trackmouse
+Let the mouse be a joystick to change the view of the landscape.
+This implies
+.I \-no\-wander.
+.TP 8
+.B \-no\-trackmouse
+Disables mouse tracking. This is the default.
+.TP 8
+.B \-wire
+Draw a wireframe rendition of the fire: this will consist only of
+single-pixel lines for the triangles.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2001 by Eric Lassauge.
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+
+The original code for this hack was written by David Bucciarelli
+(tech.hmw@plus.it) and could be found in the demo package
+of Mesa (Mesa-3.2/3Dfx/demos/). This hack is the result of the merge of
+two of the David's demos (fire and rain).
+
+.SH AUTHOR
+David Bucciarelli <tech.hmw@plus.it>
+Eric Lassauge <lassauge@mail.dotcom.fr>
diff --git a/hacks/glx/glhanoi.c b/hacks/glx/glhanoi.c
new file mode 100644
index 0000000..865930f
--- /dev/null
+++ b/hacks/glx/glhanoi.c
@@ -0,0 +1,2086 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* glhanoi, Copyright (c) 2005, 2009 Dave Atkinson <da@davea.org.uk>
+ * except noise function code Copyright (c) 2002 Ken Perlin
+ * Modified by Lars Huttar (c) 2010, to generalize to 4 or more poles
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include <assert.h>
+
+#include "rotator.h"
+
+#define DEF_LIGHT "True"
+#define DEF_FOG "False"
+#define DEF_TEXTURE "True"
+#define DEF_POLES "0" /* choose random value */
+#define DEF_SPEED "1"
+#define DEF_TRAILS "2"
+
+#define DEFAULTS "*delay: 15000\n" \
+ "*count: 0\n" \
+ "*showFPS: False\n" \
+ "*wireframe: False\n"
+
+# define release_glhanoi 0
+
+/* polygon resolution of poles and disks */
+#define NSLICE 32
+#define NLOOPS 1
+
+/* How long to wait at start and finish (seconds). */
+#define START_DURATION 1.0
+#define FINISH_DURATION 1.0
+#define BASE_LENGTH 30.0
+#define BOARD_SQUARES 8
+
+/* Don't draw trail lines till they're this old (sec).
+ Helps trails not be "attached" to the disks. */
+#define TRAIL_START_DELAY 0.1
+
+#define MAX_CAMERA_RADIUS 250.0
+#define MIN_CAMERA_RADIUS 75.0
+
+#define MARBLE_SCALE 1.01
+
+#undef BELLRAND
+/* Return a double precision number in [0...n], with bell curve distribution. */
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+enum {
+ MARBLE_TEXURE,
+ N_TEXTURES
+};
+
+#define MARBLE_TEXTURE_SIZE 256
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include <math.h>
+#include "xlockmore.h"
+
+#ifdef USE_GL /* whole file */
+
+typedef struct timeval glhtime;
+
+static double getTime(void)
+{
+ struct timeval t;
+#ifdef GETTIMEOFDAY_TWO_ARGS
+ gettimeofday(&t, NULL);
+#else /* !GETTIMEOFDAY_TWO_ARGS */
+ gettimeofday(&t);
+#endif /* !GETTIMEOFDAY_TWO_ARGS */
+ return t.tv_sec + t.tv_usec / 1000000.0;
+}
+
+typedef enum {
+ START,
+ MOVE_DISK,
+ MOVE_FINISHED,
+ FINISHED,
+ MONEY_SHOT,
+ INVALID = -1
+} State;
+
+typedef struct {
+ int id;
+ GLuint displayList;
+ GLfloat position[3];
+ GLfloat rotation[3];
+ GLfloat color[4];
+ GLfloat base0;
+ GLfloat base1;
+ GLfloat height;
+ GLfloat xmin, xmax, ymin, zmin, zmax;
+ GLfloat u1, u2;
+ GLfloat t1, t2;
+ GLfloat ucostheta, usintheta;
+ GLfloat dx, dz;
+ GLdouble rotAngle; /* degree of "flipping" so far, during travel */
+ GLdouble phi; /* angle of motion in xz plane */
+ GLfloat speed;
+ int polys;
+} Disk;
+
+typedef struct {
+ Disk **data;
+ int count;
+ int size;
+ GLfloat position[3];
+} Pole;
+
+/* A SubProblem is a recursive subdivision of the problem, and means
+ "Move nDisks disks from src pole to dst pole, using the poles indicated in 'available'." */
+typedef struct {
+ int nDisks;
+ int src, dst;
+ unsigned long available; /* a bitmask of poles that have no smaller disks on them */
+} SubProblem;
+
+typedef struct {
+ GLfloat position[3];
+ double startTime, endTime;
+ Bool isEnd;
+} TrailPoint;
+
+typedef struct {
+ GLXContext *glx_context;
+ State state;
+ Bool wire;
+ Bool fog;
+ Bool light;
+ Bool layoutLinear;
+ GLfloat trailDuration;
+ double startTime;
+ double lastTime;
+ double duration;
+ int numberOfDisks;
+ int numberOfPoles;
+ int numberOfMoves;
+ int maxDiskIdx;
+ int magicNumber;
+ Disk *currentDisk;
+ int move;
+ /* src, tmp, dst: index of pole that is source / storage / destination for
+ current move */
+ int src;
+ int tmp;
+ int dst;
+ int oldsrc;
+ int oldtmp;
+ int olddst;
+ GLfloat speed; /* coefficient for how fast the disks move */
+ SubProblem *solveStack;
+ int solveStackSize, solveStackIdx;
+ Pole *pole;
+ float boardSize;
+ float baseLength;
+ float baseWidth;
+ float baseHeight;
+ float poleRadius;
+ float poleHeight;
+ float poleOffset;
+ float poleDist; /* distance of poles from center, for round layout */
+ float diskHeight;
+ float maxDiskRadius;
+ float *diskPos; /* pre-computed disk positions on rods */
+ Disk *disk;
+ GLint floorList;
+ GLint baseList;
+ GLint poleList;
+ int floorpolys, basepolys, polepolys;
+ int trailQSize;
+ TrailPoint *trailQ;
+ int trailQFront, trailQBack;
+ GLfloat camera[3];
+ GLfloat centre[3];
+ rotator *the_rotator;
+ Bool button_down_p;
+ Bool texture;
+ GLuint textureNames[N_TEXTURES];
+ int drag_x;
+ int drag_y;
+ int noise_initted;
+ int p[512];
+} glhcfg;
+
+static glhcfg *glhanoi_cfg = NULL;
+static Bool fog;
+static Bool light;
+static Bool texture;
+static GLfloat trails;
+static int poles;
+static GLfloat speed;
+
+static XrmOptionDescRec opts[] = {
+ {"-light", ".glhanoi.light", XrmoptionNoArg, "true"},
+ {"+light", ".glhanoi.light", XrmoptionNoArg, "false"},
+ {"-fog", ".glhanoi.fog", XrmoptionNoArg, "true"},
+ {"+fog", ".glhanoi.fog", XrmoptionNoArg, "false"},
+ {"-texture", ".glhanoi.texture", XrmoptionNoArg, "true"},
+ {"+texture", ".glhanoi.texture", XrmoptionNoArg, "false"},
+ {"-trails", ".glhanoi.trails", XrmoptionSepArg, 0},
+ {"-poles", ".glhanoi.poles", XrmoptionSepArg, 0 },
+ {"-speed", ".glhanoi.speed", XrmoptionSepArg, 0 }
+};
+
+static argtype vars[] = {
+ {&light, "light", "Light", DEF_LIGHT, t_Bool},
+ {&fog, "fog", "Fog", DEF_FOG, t_Bool},
+ {&texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ {&trails, "trails", "Trails", DEF_TRAILS, t_Float},
+ {&poles, "poles", "Poles", DEF_POLES, t_Int},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float}
+};
+
+static OptionStruct desc[] = {
+ {"+/-light", "whether to light the scene"},
+ {"+/-fog", "whether to apply fog to the scene"},
+ {"+/-texture", "whether to apply texture to the scene"},
+ {"-trails t", "how long of disk trails to show (sec.)"},
+ {"-poles r", "number of poles to move disks between"},
+ {"-speed s", "speed multiplier"}
+};
+
+ENTRYPOINT ModeSpecOpt glhanoi_opts = { countof(opts), opts, countof(vars), vars, desc };
+
+#ifdef USE_MODULES
+
+ModStruct glhanoi_description = {
+ "glhanoi", "init_glhanoi", "draw_glhanoi", NULL,
+ "draw_glhanoi", "init_glhanoi", "free_glhanoi", &glhanoi_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "Towers of Hanoi", 0, NULL
+};
+
+#endif
+
+static const GLfloat cBlack[] = { 0.0, 0.0, 0.0, 1.0 };
+static const GLfloat cWhite[] = { 1.0, 1.0, 1.0, 1.0 };
+static const GLfloat poleColor[] = { 0.545, 0.137, 0.137 };
+static const GLfloat baseColor[] = { 0.34, 0.34, 0.48 };
+/* static const GLfloat baseColor[] = { 0.545, 0.137, 0.137 }; */
+static const GLfloat fogcolor[] = { 0.5, 0.5, 0.5 };
+static GLfloat trailColor[] = { 1.0, 1.0, 1.0, 0.5 };
+
+static const float left[] = { 1.0, 0.0, 0.0 };
+static const float up[] = { 0.0, 1.0, 0.0 };
+static const float front[] = { 0.0, 0.0, 1.0 };
+static const float right[] = { -1.0, 0.0, 0.0 };
+static const float down[] = { 0.0, -1.0, 0.0 };
+static const float back[] = { 0.0, 0.0, -1.0 };
+
+static const GLfloat pos0[4] = { 50.0, 50.0, 50.0, 0.0 };
+static const GLfloat amb0[4] = { 0.0, 0.0, 0.0, 1.0 };
+static const GLfloat dif0[4] = { 1.0, 1.0, 1.0, 1.0 };
+static const GLfloat spc0[4] = { 0.0, 1.0, 1.0, 1.0 };
+
+static const GLfloat pos1[4] = { -50.0, 50.0, -50.0, 0.0 };
+static const GLfloat amb1[4] = { 0.0, 0.0, 0.0, 1.0 };
+static const GLfloat dif1[4] = { 1.0, 1.0, 1.0, 1.0 };
+static const GLfloat spc1[4] = { 1.0, 1.0, 1.0, 1.0 };
+
+static float g = 3.0 * 9.80665; /* hmm, looks like we need more gravity, Scotty... */
+
+static void checkAllocAndExit(Bool item, char *descr) {
+ if (!item) {
+ fprintf(stderr, "%s: unable to allocate memory for %s\n",
+ progname, descr);
+ exit(EXIT_FAILURE);
+ }
+}
+
+#define DOPUSH(X, Y) (((X)->count) >= ((X)->size)) ? NULL : ((X)->data[(X)->count++] = (Y))
+#define DOPOP(X) (X)->count <= 0 ? NULL : ((X)->data[--((X)->count)])
+
+/* push disk d onto pole idx */
+static Disk *push(glhcfg *glhanoi, int idx, Disk * d)
+{
+ return DOPUSH(&glhanoi->pole[idx], d);
+}
+
+/* pop the top disk from pole idx */
+static Disk *pop(glhcfg *glhanoi, int idx)
+{
+ return DOPOP(&glhanoi->pole[idx]);
+}
+
+static inline void swap(int *x, int *y)
+{
+ *x = *x ^ *y;
+ *y = *x ^ *y;
+ *x = *x ^ *y;
+}
+
+/*
+ * magic - it's magic...
+ * Return 1 if the number of trailing zeroes on i is even, unless i is 1 or 0.
+ */
+static int magic(int i)
+{
+ int count = 0;
+ if(i <= 1)
+ return 0;
+ while((i & 0x01) == 0) {
+ i >>= 1;
+ count++;
+ }
+ return count % 2 == 0;
+}
+
+static float distance(float *p0, float *p1)
+{
+ float x, y, z;
+ x = p1[0] - p0[0];
+ y = p1[1] - p0[1];
+ z = p1[2] - p0[2];
+ return (float)sqrt(x * x + y * y + z * z);
+}
+
+/* What is this for?
+ = c / (a b - 0.25 (a^2 + 2 a b + b^2) )
+ = c / (-0.25 (a^2 - 2 a b + b^2) )
+ = c / (-0.25 ((a - b)(a - b)))
+ = -4 c / (a - b)^2
+static GLfloat A(GLfloat a, GLfloat b, GLfloat c)
+{
+ GLfloat sum = a + b;
+ return c / (a * b - 0.25 * sum * sum);
+}
+*/
+
+static void moveSetup(glhcfg *glhanoi, Disk * disk)
+{
+ float h, ymax;
+ float u;
+ int src = glhanoi->src;
+ int dst = glhanoi->dst;
+ GLfloat theta;
+ GLfloat sintheta, costheta;
+ double dh;
+ double dx, dz; /* total x and z distances from src to dst */
+ Pole *poleSrc, *poleDst;
+
+ poleSrc = &(glhanoi->pole[src]);
+ poleDst = &(glhanoi->pole[dst]);
+
+ disk->xmin = poleSrc->position[0];
+ /* glhanoi->poleOffset * (src - (glhanoi->numberOfPoles - 1.0f) * 0.5); */
+ disk->xmax = poleDst->position[0];
+ /* disk->xmax = glhanoi->poleOffset * (dst - (glhanoi->numberOfPoles - 1.0f) * 0.5); */
+ disk->ymin = glhanoi->poleHeight;
+ disk->zmin = poleSrc->position[2];
+ disk->zmax = poleDst->position[2];
+
+ dx = disk->xmax - disk->xmin;
+ dz = disk->zmax - disk->zmin;
+
+ if(glhanoi->state != FINISHED) {
+ double xxx = ((dx < 0) ? 180.0 : -180.0);
+ if(random() % 6 == 0) {
+ disk->rotAngle = xxx * (2 - 2 * random() % 2) * (random() % 3 + 1);
+ } else {
+ disk->rotAngle = xxx;
+ }
+ if(random() % 4 == 0) {
+ /* Backflip */
+ disk->rotAngle = -disk->rotAngle;
+ }
+ } else {
+ disk->rotAngle = -180.0;
+ }
+
+ disk->base0 = glhanoi->diskPos[poleSrc->count];
+ disk->base1 = (glhanoi->state == FINISHED) ?
+ disk->base0 : glhanoi->diskPos[poleDst->count];
+
+ /* horizontal distance to travel? */
+ /* was: absx = sqrt(disk->xmax - disk->xmin); */
+ dh = distance(poleSrc->position, poleDst->position);
+ /* absx = sqrt(dh); */
+ ymax = glhanoi->poleHeight + dh;
+ if(glhanoi->state == FINISHED) {
+ ymax += dh * (double)(glhanoi->numberOfDisks - disk->id);
+ }
+ h = ymax - disk->ymin;
+ /* A(a, b, c) = -4 c / (a - b)^2 */
+ /* theta = atan(4 h / (b - a)) */
+ theta = atan(4 * h / dh);
+ if(theta < 0.0)
+ theta += M_PI;
+ costheta = cos(theta);
+ sintheta = sin(theta);
+ u = (float)
+ sqrt(fabs
+ (-g /
+ /* (2.0 * A(disk->xmin, disk->xmax, h) * costheta * costheta))); */
+ (2.0 * -4 * h / (dh * dh) * costheta * costheta)));
+ disk->usintheta = u * sintheta;
+ disk->ucostheta = u * costheta;
+ /* Not to be confused: disk->dx is the per-time-unit portion of dx */
+ disk->dx = disk->ucostheta * dx / dh;
+ disk->dz = disk->ucostheta * dz / dh;
+ disk->t1 =
+ (-u + sqrt(u * u + 2.0 * g * fabs(disk->ymin - disk->base0))) / g;
+ disk->u1 = u + g * disk->t1;
+ disk->t2 = 2.0 * disk->usintheta / g;
+ disk->u2 = disk->usintheta - g * disk->t2;
+
+ /* Compute direction of travel, in the XZ plane. */
+ disk->phi = atan(dz / dx);
+ disk->phi *= 180.0 / M_PI; /* convert radians to degrees */
+}
+
+/* For debugging: show a value as a string of ones and zeroes
+static const char *byteToBinary(int x) {
+ static char b[9];
+ int i, z;
+
+ for (z = 128, i = 0; z > 0; z >>= 1, i++) {
+ b[i] = ((x & z) == z) ? '1' : '0';
+ }
+ b[i] = '\0';
+
+ return b;
+}
+*/
+
+static void pushMove(glhcfg *glhanoi, int n, int src, int dst, int avail) {
+ SubProblem *sp = &(glhanoi->solveStack[glhanoi->solveStackIdx++]);
+
+ if (glhanoi->solveStackIdx > glhanoi->solveStackSize) {
+ fprintf(stderr, "solveStack overflow: pushed index %d: %d from %d to %d, using %d\n",
+ glhanoi->solveStackIdx, n, src, dst, avail);
+ exit(EXIT_FAILURE);
+ }
+
+ sp->nDisks = n;
+ sp->src = src;
+ sp->dst = dst;
+ sp->available = avail & ~((unsigned long)(1 << src))
+ & ~((unsigned long)(1 << dst));
+ /*
+ fprintf(stderr, "Debug: > pushed solveStack %d: %d from %d to %d, using %s\n",
+ glhanoi->solveStackIdx - 1, n, src, dst, byteToBinary(sp->available));
+ */
+}
+
+static Bool solveStackEmpty(glhcfg *glhanoi) {
+ return (glhanoi->solveStackIdx < 1);
+}
+
+static SubProblem *popMove(glhcfg *glhanoi) {
+ SubProblem *sp;
+ if (solveStackEmpty(glhanoi)) return (SubProblem *)NULL;
+ sp = &(glhanoi->solveStack[--glhanoi->solveStackIdx]);
+ /* fprintf(stderr, "Debug: < popped solveStack %d: %d from %d to %d, using %s\n",
+ glhanoi->solveStackIdx, sp->nDisks, sp->src, sp->dst, byteToBinary(sp->available)); */
+ return sp;
+}
+
+/* Return number of bits set in b */
+static int numBits(unsigned long b) {
+ int count = 0;
+ while (b) {
+ count += b & 0x1u;
+ b >>= 1;
+ }
+ return count;
+}
+
+/* Return index (power of 2) of least significant 1 bit. */
+static int bitScan(unsigned long b) {
+ int count;
+ for (count = 0; b; count++, b >>= 1) {
+ if (b & 0x1u) return count;
+ }
+ return -1;
+}
+
+/* A bit pattern representing all poles */
+#define ALL_POLES ((1 << glhanoi->numberOfPoles) - 1)
+
+#define REMOVE_BIT(a, b) ((a) & ~(1 << (b)))
+#define ADD_BIT(a, b) ((a) | (1 << (b)))
+
+static void makeMove(glhcfg *glhanoi)
+{
+ if (glhanoi->numberOfPoles == 3) {
+ int fudge = glhanoi->move + 2;
+ int magicNumber = magic(fudge);
+
+
+ glhanoi->currentDisk = pop(glhanoi, glhanoi->src);
+ moveSetup(glhanoi, glhanoi->currentDisk);
+ push(glhanoi, glhanoi->dst, glhanoi->currentDisk);
+
+ fudge = fudge % 2;
+
+ if(fudge == 1 || magicNumber) {
+ swap(&glhanoi->src, &glhanoi->tmp);
+ }
+ if(fudge == 0 || glhanoi->magicNumber) {
+ swap(&glhanoi->dst, &glhanoi->tmp);
+ }
+ glhanoi->magicNumber = magicNumber;
+ } else {
+ SubProblem sp;
+ int tmp = 0;
+
+ if (glhanoi->move == 0) {
+ /* Initialize the solution stack. Original problem:
+ move all disks from pole 0 to furthest pole,
+ using all other poles. */
+ pushMove(glhanoi, glhanoi->numberOfDisks, 0,
+ glhanoi->numberOfPoles - 1,
+ REMOVE_BIT(REMOVE_BIT(ALL_POLES, 0), glhanoi->numberOfPoles - 1));
+ }
+
+ while (!solveStackEmpty(glhanoi)) {
+ int k, numAvail;
+ sp = *popMove(glhanoi);
+
+ if (sp.nDisks == 1) {
+ /* We have a single, concrete move to do. */
+ /* moveSetup uses glhanoi->src, dst. */
+ glhanoi->src = sp.src;
+ glhanoi->dst = sp.dst;
+ glhanoi->tmp = tmp; /* Probably unnecessary */
+
+ glhanoi->currentDisk = pop(glhanoi, sp.src);
+ moveSetup(glhanoi, glhanoi->currentDisk);
+ push(glhanoi, sp.dst, glhanoi->currentDisk);
+
+ return;
+ } else {
+ /* Divide and conquer, using Frame-Stewart algorithm, until we get to base case */
+ if (sp.nDisks == 1) break;
+
+ numAvail = numBits(sp.available);
+ if (numAvail < 2) k = sp.nDisks - 1;
+ else if(numAvail >= sp.nDisks - 2) k = 1;
+ /* heuristic for optimal k: sqrt(2n) (see http://www.cs.wm.edu/~pkstoc/boca.pdf) */
+ else k = (int)(sqrt(2 * sp.nDisks));
+
+ if (k >= sp.nDisks) k = sp.nDisks - 1;
+ else if (k < 1) k = 1;
+
+ tmp = bitScan(sp.available);
+ /* fprintf(stderr, "Debug: k is %d, tmp is %d\n", k, tmp); */
+ if (tmp == -1) {
+ fprintf(stderr, "Error: n > 1 (%d) and no poles available\n",
+ sp.nDisks);
+ }
+
+ /* Push on moves in reverse order, since this is a stack. */
+ pushMove(glhanoi, k, tmp, sp.dst,
+ REMOVE_BIT(ADD_BIT(sp.available, sp.src), tmp));
+ pushMove(glhanoi, sp.nDisks - k, sp.src, sp.dst,
+ REMOVE_BIT(sp.available, tmp));
+ pushMove(glhanoi, k, sp.src, tmp,
+ REMOVE_BIT(ADD_BIT(sp.available, sp.dst), tmp));
+
+ /* Repeat until we've found a move we can make. */
+ }
+ }
+ }
+}
+
+static double lerp(double alpha, double start, double end)
+{
+ return start + alpha * (end - start);
+}
+
+static void upfunc(GLdouble t, Disk * d)
+{
+ d->position[0] = d->xmin;
+ d->position[1] = d->base0 + (d->u1 - 0.5 * g * t) * t;
+ d->position[2] = d->zmin;
+
+ d->rotation[1] = 0.0;
+}
+
+static void parafunc(GLdouble t, Disk * d)
+{
+ /* ##was: d->position[0] = d->xmin + d->ucostheta * t; */
+ d->position[0] = d->xmin + d->dx * t;
+ d->position[2] = d->zmin + d->dz * t;
+ d->position[1] = d->ymin + (d->usintheta - 0.5 * g * t) * t;
+
+ d->rotation[1] = d->rotAngle * t / d->t2;
+ /* d->rotAngle * (d->position[0] - d->xmin) / (d->xmax - d->xmin); */
+}
+
+static void downfunc(GLdouble t, Disk * d)
+{
+ d->position[0] = d->xmax;
+ d->position[1] = d->ymin + (d->u2 - 0.5 * g * t) * t;
+ d->position[2] = d->zmax;
+
+ d->rotation[1] = 0.0;
+}
+
+#define normalizeQ(i) ((i) >= glhanoi->trailQSize ? (i) - glhanoi->trailQSize : (i))
+#define normalizeQNeg(i) ((i) < 0 ? (i) + glhanoi->trailQSize : (i))
+
+/* Add trail point at position posn at time t onto back of trail queue.
+ Removes old trails if necessary to make room. */
+static void enQTrail(glhcfg *glhanoi, GLfloat *posn)
+{
+ if (glhanoi->trailQSize && glhanoi->state != MONEY_SHOT) {
+ TrailPoint *tp = &(glhanoi->trailQ[glhanoi->trailQBack]);
+ double t = getTime();
+
+ tp->position[0] = posn[0];
+ tp->position[1] = posn[1] + glhanoi->diskHeight;
+ /* Slight jitter to prevent clashing with other trails */
+ tp->position[2] = posn[2] + (glhanoi->move % 23) * 0.01;
+ tp->startTime = t + TRAIL_START_DELAY;
+ tp->endTime = t + TRAIL_START_DELAY + glhanoi->trailDuration;
+ tp->isEnd = False;
+
+ /* Update queue back/front indices */
+ glhanoi->trailQBack = normalizeQ(glhanoi->trailQBack + 1);
+ if (glhanoi->trailQBack == glhanoi->trailQFront)
+ glhanoi->trailQFront = normalizeQ(glhanoi->trailQFront + 1);
+ }
+}
+
+/* Mark last trailpoint in queue as the end of a trail. */
+/* was: #define endTrail(glh) ((glh)->trailQ[(glh)->trailQBack].isEnd = True) */
+static void endTrail(glhcfg *glhanoi) {
+ if (glhanoi->trailQSize)
+ glhanoi->trailQ[normalizeQNeg(glhanoi->trailQBack - 1)].isEnd = True;
+}
+
+/* Update disk d's position and rotation based on time t.
+ Returns true iff move is finished. */
+static Bool computePosition(glhcfg *glhanoi, GLfloat t, Disk * d)
+{
+ Bool finished = False;
+
+ if(t < d->t1) {
+ upfunc(t, d);
+ } else if(t < d->t1 + d->t2) {
+ parafunc(t - d->t1, d);
+ enQTrail(glhanoi, d->position);
+ } else {
+ downfunc(t - d->t1 - d->t2, d);
+ if(d->position[1] <= d->base1) {
+ d->position[1] = d->base1;
+ finished = True;
+ endTrail(glhanoi);
+ }
+ }
+ return finished;
+}
+
+static void updateView(glhcfg *glhanoi)
+{
+ double longitude, latitude, radius;
+ double a, b, c, A, B;
+
+ get_position(glhanoi->the_rotator, NULL, NULL, &radius,
+ !glhanoi->button_down_p);
+ get_rotation(glhanoi->the_rotator, &longitude, &latitude, NULL,
+ !glhanoi->button_down_p);
+ longitude += glhanoi->camera[0];
+ latitude += glhanoi->camera[1];
+ radius += glhanoi->camera[2];
+ /* FUTURE: tweak this to be smooth: */
+ longitude = longitude - floor(longitude);
+ latitude = latitude - floor(latitude);
+ radius = radius - floor(radius);
+ if(latitude > 0.5) {
+ latitude = 1.0 - latitude;
+ }
+ if(radius > 0.5) {
+ radius = 1.0 - radius;
+ }
+
+ b = glhanoi->centre[1];
+ c = (MIN_CAMERA_RADIUS +
+ radius * (MAX_CAMERA_RADIUS - MIN_CAMERA_RADIUS));
+ A = M_PI / 4.0 * (1.0 - latitude);
+ a = sqrt(b * b + c * c - 2.0 * b * c * cos(A));
+ B = asin(sin(A) * b / a);
+ glRotatef(-B * 180 / M_PI, 1.0, 0.0, 0.0);
+
+ glTranslatef(0.0f, 0.0f,
+ -(MIN_CAMERA_RADIUS +
+ radius * (MAX_CAMERA_RADIUS - MIN_CAMERA_RADIUS)));
+ glRotatef(longitude * 360.0, 0.0f, 1.0f, 0.0f);
+ glRotatef(latitude * 180.0, cos(longitude * 2.0 * M_PI), 0.0,
+ sin(longitude * 2.0 * M_PI));
+}
+
+static void changeState(glhcfg *glhanoi, State state)
+{
+ glhanoi->state = state;
+ glhanoi->startTime = getTime();
+}
+
+static Bool finishedHanoi(glhcfg *glhanoi) {
+ /* use different criteria depending on algorithm */
+ return (glhanoi->numberOfPoles == 3 ?
+ glhanoi->move >= glhanoi->numberOfMoves :
+ solveStackEmpty(glhanoi));
+}
+
+static void update_glhanoi(glhcfg *glhanoi)
+{
+ double t = getTime() - glhanoi->startTime;
+ int i;
+ Bool done;
+
+ switch (glhanoi->state) {
+ case START:
+ if(t < glhanoi->duration) {
+ break;
+ }
+ glhanoi->move = 0;
+ if(glhanoi->numberOfDisks % 2 == 0) {
+ swap(&glhanoi->tmp, &glhanoi->dst);
+ }
+ glhanoi->magicNumber = 1;
+ makeMove(glhanoi);
+ changeState(glhanoi, MOVE_DISK);
+ break;
+
+ case MOVE_DISK:
+ if(computePosition(glhanoi, t * glhanoi->currentDisk->speed, glhanoi->currentDisk)) {
+ changeState(glhanoi, MOVE_FINISHED);
+ }
+ break;
+
+ case MOVE_FINISHED:
+ ++glhanoi->move;
+ if(!finishedHanoi(glhanoi)) {
+ makeMove(glhanoi);
+ changeState(glhanoi, MOVE_DISK);
+ } else {
+ glhanoi->duration = FINISH_DURATION;
+ changeState(glhanoi, FINISHED);
+ }
+ break;
+
+ case FINISHED:
+ if (t < glhanoi->duration)
+ break;
+ glhanoi->src = glhanoi->olddst;
+ glhanoi->dst = glhanoi->oldsrc;
+ for(i = 0; i < glhanoi->numberOfDisks; ++i) {
+ Disk *disk = pop(glhanoi, glhanoi->src);
+ assert(disk != NULL);
+ moveSetup(glhanoi, disk);
+ }
+ for(i = glhanoi->maxDiskIdx; i >= 0; --i) {
+ push(glhanoi, glhanoi->dst, &glhanoi->disk[i]);
+ }
+ changeState(glhanoi, MONEY_SHOT);
+ break;
+
+ case MONEY_SHOT:
+ done = True;
+ for(i = glhanoi->maxDiskIdx; i >= 0; --i) {
+ double delay = 0.25 * i;
+ int finished;
+
+ if(t - delay < 0) {
+ done = False;
+ continue;
+ }
+
+ finished = computePosition(glhanoi, t - delay, &glhanoi->disk[i]);
+ glhanoi->disk[i].rotation[1] = 0.0;
+
+ if(!finished) {
+ done = False;
+ }
+ }
+ if(done) {
+ glhanoi->src = glhanoi->oldsrc;
+ glhanoi->tmp = glhanoi->oldtmp;
+ glhanoi->dst = glhanoi->olddst;
+ changeState(glhanoi, START);
+ }
+ break;
+
+ case INVALID:
+ default:
+ fprintf(stderr, "Invalid state\n");
+ break;
+ }
+}
+
+static void HSVtoRGBf(GLfloat h, GLfloat s, GLfloat v,
+ GLfloat * r, GLfloat * g, GLfloat * b)
+{
+ if(s == 0.0) {
+ *r = v;
+ *g = v;
+ *b = v;
+ } else {
+ GLfloat i, f, p, q, t;
+ if(h >= 360.0) {
+ h = 0.0;
+ }
+ h /= 60.0; /* h now in [0,6). */
+ i = floor((double)h); /* i now largest integer <= h */
+ f = h - i; /* f is no fractional part of h */
+ p = v * (1.0 - s);
+ q = v * (1.0 - (s * f));
+ t = v * (1.0 - (s * (1.0 - f)));
+ switch ((int)i) {
+ case 0:
+ *r = v;
+ *g = t;
+ *b = p;
+ break;
+ case 1:
+ *r = q;
+ *g = v;
+ *b = p;
+ break;
+ case 2:
+ *r = p;
+ *g = v;
+ *b = t;
+ break;
+ case 3:
+ *r = p;
+ *g = q;
+ *b = v;
+ break;
+ case 4:
+ *r = t;
+ *g = p;
+ *b = v;
+ break;
+ case 5:
+ *r = v;
+ *g = p;
+ *b = q;
+ break;
+ }
+ }
+}
+
+static void HSVtoRGBv(GLfloat * hsv, GLfloat * rgb)
+{
+ HSVtoRGBf(hsv[0], hsv[1], hsv[2], &rgb[0], &rgb[1], &rgb[2]);
+}
+
+static void setMaterial(const GLfloat color[3], const GLfloat hlite[3], int shininess)
+{
+ glColor3fv(color);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, hlite);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+ glMateriali(GL_FRONT, GL_SHININESS, shininess); /* [0,128] */
+}
+
+/*
+ * drawTube: I know all this stuff is available in gluQuadrics
+ * but I'd originally intended to texture the poles with a 3D wood
+ * texture, but I was having difficulty getting wood... what? Why
+ * are all you Amercians laughing..? Anyway, I don't know if enough
+ * people's hardware supports 3D textures, so I didn't bother (xorg
+ * ATI server doesn't :-( )
+ */
+static int drawTube(GLdouble bottomRadius, GLdouble topRadius,
+ GLdouble bottomThickness, GLdouble topThickness,
+ GLdouble height, GLuint nSlice, GLuint nLoop)
+{
+ int polys = 0;
+ GLfloat y;
+ GLfloat *cosCache = malloc(sizeof(GLfloat) * nSlice);
+ GLfloat *sinCache = malloc(sizeof(GLfloat) * nSlice);
+ GLint slice;
+ GLuint loop;
+ GLint lastSlice = nSlice - 1;
+ GLfloat radius;
+ GLfloat innerRadius;
+
+ if(bottomThickness > bottomRadius) {
+ bottomThickness = bottomRadius;
+ }
+ if(topThickness > topRadius) {
+ topThickness = topRadius;
+ }
+ if(bottomThickness < 0.0) {
+ bottomThickness = 0.0;
+ }
+ if(topThickness < 0.0) {
+ topThickness = 0.0;
+ }
+/* if(topRadius >= bottomRadius) {
+ maxRadius = topRadius;
+ } else {
+ maxRadius = bottomRadius;
+ } */
+
+ /* bottom */
+ y = 0.0;
+ radius = bottomRadius;
+ innerRadius = bottomRadius - bottomThickness;
+ /* innerTexCoordSize = texCoordSize * innerRadius / maxRadius; */
+ /* outerTexCoordSize = texCoordSize * radius / maxRadius; */
+ /* yTexCoord = minTexCoord; */
+
+ glBegin(GL_QUAD_STRIP);
+
+ glNormal3f(0.0, -1.0, 0.0);
+
+ /* glTexCoord3f(midTexCoord, yTexCoord, midTexCoord + innerTexCoordSize); */
+ glVertex3f(0.0, y, innerRadius);
+
+ /* glTexCoord3f(midTexCoord, yTexCoord, midTexCoord + outerTexCoordSize); */
+ glVertex3f(0.0, y, radius);
+
+ for(slice = lastSlice; slice >= 0; --slice) {
+ GLfloat theta = 2.0 * M_PI * (double)slice / nSlice;
+
+ cosCache[slice] = cos(theta);
+ sinCache[slice] = sin(theta);
+
+ /* glTexCoord3f(midTexCoord + sinCache[slice] * innerTexCoordSize, */
+ /* yTexCoord, */
+ /* midTexCoord + cosCache[slice] * innerTexCoordSize); */
+ glVertex3f(innerRadius * sinCache[slice], y,
+ innerRadius * cosCache[slice]);
+ /* glTexCoord3f(midTexCoord + sinCache[slice] * outerTexCoordSize, */
+ /* yTexCoord, */
+ /* midTexCoord + cosCache[slice] * outerTexCoordSize); */
+ glVertex3f(radius * sinCache[slice], y, radius * cosCache[slice]);
+ polys++;
+ }
+ glEnd();
+
+ /* middle */
+ for(loop = 0; loop < nLoop; ++loop) {
+ GLfloat lowerRadius =
+ bottomRadius + (topRadius -
+ bottomRadius) * (float)loop / (nLoop);
+ GLfloat upperRadius =
+ bottomRadius + (topRadius - bottomRadius) * (float)(loop +
+ 1) /
+ (nLoop);
+ GLfloat lowerY = height * (float)loop / (nLoop);
+ GLfloat upperY = height * (float)(loop + 1) / (nLoop);
+ GLfloat factor = (topRadius - topThickness) -
+ (bottomRadius - bottomThickness);
+
+ /* outside */
+ glBegin(GL_QUAD_STRIP);
+ for(slice = 0; slice < nSlice; ++slice) {
+ glNormal3f(sinCache[slice], 0.0, cosCache[slice]);
+ glVertex3f(upperRadius * sinCache[slice], upperY,
+ upperRadius * cosCache[slice]);
+ glVertex3f(lowerRadius * sinCache[slice], lowerY,
+ lowerRadius * cosCache[slice]);
+ polys++;
+ }
+ glNormal3f(0.0, 0.0, 1.0);
+ glVertex3f(0.0, upperY, upperRadius);
+ glVertex3f(0.0, lowerY, lowerRadius);
+ polys++;
+ glEnd();
+
+ /* inside */
+ lowerRadius = bottomRadius - bottomThickness +
+ factor * (float)loop / (nLoop);
+ upperRadius = bottomRadius - bottomThickness +
+ factor * (float)(loop + 1) / (nLoop);
+
+ glBegin(GL_QUAD_STRIP);
+ glNormal3f(0.0, 0.0, -1.0);
+ glVertex3f(0.0, upperY, upperRadius);
+ glVertex3f(0.0, lowerY, lowerRadius);
+ for(slice = lastSlice; slice >= 0; --slice) {
+ glNormal3f(-sinCache[slice], 0.0, -cosCache[slice]);
+ glVertex3f(upperRadius * sinCache[slice], upperY,
+ upperRadius * cosCache[slice]);
+ glVertex3f(lowerRadius * sinCache[slice], lowerY,
+ lowerRadius * cosCache[slice]);
+ polys++;
+ }
+ glEnd();
+ }
+
+ /* top */
+ y = height;
+ radius = topRadius;
+ innerRadius = topRadius - topThickness;
+
+ glBegin(GL_QUAD_STRIP);
+ glNormal3f(0.0, 1.0, 0.0);
+ for(slice = 0; slice < nSlice; ++slice) {
+ glVertex3f(innerRadius * sinCache[slice], y,
+ innerRadius * cosCache[slice]);
+
+ glVertex3f(radius * sinCache[slice], y, radius * cosCache[slice]);
+ polys++;
+ }
+ glVertex3f(0.0, y, innerRadius);
+ glVertex3f(0.0, y, radius);
+ glEnd();
+ return polys;
+}
+
+static int drawPole(GLfloat radius, GLfloat length)
+{
+ return drawTube(radius, radius, radius, radius, length, NSLICE, NLOOPS);
+}
+
+static int drawDisk3D(GLdouble inner_radius, GLdouble outer_radius,
+ GLdouble height)
+{
+ return drawTube(outer_radius, outer_radius, outer_radius - inner_radius,
+ outer_radius - inner_radius, height, NSLICE, NLOOPS);
+}
+
+/* used for drawing base */
+static int drawCuboid(GLfloat length, GLfloat width, GLfloat height)
+{
+ GLfloat xmin = -length / 2.0f;
+ GLfloat xmax = length / 2.0f;
+ GLfloat zmin = -width / 2.0f;
+ GLfloat zmax = width / 2.0f;
+ GLfloat ymin = 0.0f;
+ GLfloat ymax = height;
+ int polys = 0;
+
+ glBegin(GL_QUADS);
+ /* front */
+ glNormal3fv(front);
+ glVertex3f(xmin, ymin, zmax); /* 0 */
+ glVertex3f(xmax, ymin, zmax); /* 1 */
+ glVertex3f(xmax, ymax, zmax); /* 2 */
+ glVertex3f(xmin, ymax, zmax); /* 3 */
+ polys++;
+ /* right */
+ glNormal3fv(right);
+ glVertex3f(xmax, ymin, zmax); /* 1 */
+ glVertex3f(xmax, ymin, zmin); /* 5 */
+ glVertex3f(xmax, ymax, zmin); /* 6 */
+ glVertex3f(xmax, ymax, zmax); /* 2 */
+ polys++;
+ /* back */
+ glNormal3fv(back);
+ glVertex3f(xmax, ymin, zmin); /* 5 */
+ glVertex3f(xmin, ymin, zmin); /* 4 */
+ glVertex3f(xmin, ymax, zmin); /* 7 */
+ glVertex3f(xmax, ymax, zmin); /* 6 */
+ polys++;
+ /* left */
+ glNormal3fv(left);
+ glVertex3f(xmin, ymin, zmin); /* 4 */
+ glVertex3f(xmin, ymin, zmax); /* 0 */
+ glVertex3f(xmin, ymax, zmax); /* 3 */
+ glVertex3f(xmin, ymax, zmin); /* 7 */
+ polys++;
+ /* top */
+ glNormal3fv(up);
+ glVertex3f(xmin, ymax, zmax); /* 3 */
+ glVertex3f(xmax, ymax, zmax); /* 2 */
+ glVertex3f(xmax, ymax, zmin); /* 6 */
+ glVertex3f(xmin, ymax, zmin); /* 7 */
+ polys++;
+ /* bottom */
+ glNormal3fv(down);
+ glVertex3f(xmin, ymin, zmin); /* 4 */
+ glVertex3f(xmax, ymin, zmin); /* 5 */
+ glVertex3f(xmax, ymin, zmax); /* 1 */
+ glVertex3f(xmin, ymin, zmax); /* 0 */
+ polys++;
+ glEnd();
+ return polys;
+}
+
+/* Set normal vector in xz plane, based on rotation around center. */
+static void setNormalV(glhcfg *glhanoi, GLfloat theta, int y1, int y2, int r1) {
+ if (y1 == y2) /* up/down */
+ glNormal3f(0.0, y1 ? 1.0 : -1.0, 0.0);
+ else if (!r1) /* inward */
+ glNormal3f(-cos(theta), 0.0, -sin(theta));
+ else /* outward */
+ glNormal3f(cos(theta), 0.0, sin(theta));
+}
+
+/* y1, r1, y2, r2 are indices into y, r, beg, end */
+static int drawBaseStrip(glhcfg *glhanoi, int y1, int r1, int y2, int r2,
+ GLfloat y[2], GLfloat r[2], GLfloat beg[2][2], GLfloat end[2][2]) {
+ int i;
+ GLfloat theta, costh, sinth, x[2], z[2];
+ GLfloat theta1 = (M_PI * 2) / (glhanoi->numberOfPoles + 1);
+
+ glBegin(GL_QUAD_STRIP);
+
+ /* beginning edge */
+ glVertex3f(beg[r1][0], y[y1], beg[r1][1]);
+ glVertex3f(beg[r2][0], y[y2], beg[r2][1]);
+ setNormalV(glhanoi, theta1, y1, y2, r1);
+
+ for (i = 1; i < glhanoi->numberOfPoles; i++) {
+ theta = theta1 * (i + 0.5);
+ costh = cos(theta);
+ sinth = sin(theta);
+ x[0] = costh * r[0];
+ x[1] = costh * r[1];
+ z[0] = sinth * r[0];
+ z[1] = sinth * r[1];
+
+ glVertex3f(x[r1], y[y1], z[r1]);
+ glVertex3f(x[r2], y[y2], z[r2]);
+
+ setNormalV(glhanoi, theta1 * (i + 1), y1, y2, r1);
+ }
+
+ /* end edge */
+ glVertex3f(end[r1][0], y[y1], end[r1][1]);
+ glVertex3f(end[r2][0], y[y2], end[r2][1]);
+ setNormalV(glhanoi, glhanoi->numberOfPoles, y1, y2, r1);
+
+ glEnd();
+ return glhanoi->numberOfPoles;
+}
+
+/* Draw base such that poles are distributed around a regular polygon. */
+static int drawRoundBase(glhcfg *glhanoi) {
+ int polys = 0;
+ GLfloat theta, sinth, costh;
+
+ /*
+ r[0] = (minimum) inner radius of base at vertices
+ r[1] = (minimum) outer radius of base at vertices
+ y[0] = bottom of base
+ y[1] = top of base */
+ GLfloat r[2], y[2];
+ /* positions of end points: beginning, end.
+ beg[0] is inner corner of beginning of base, beg[1] is outer corner.
+ beg[i][0] is x, [i][1] is z. */
+ GLfloat beg[2][2], end[2][2], begNorm, endNorm;
+ /* ratio of radius at base vertices to ratio at poles */
+ GLfloat longer = 1.0 / cos(M_PI / (glhanoi->numberOfPoles + 1));
+
+ r[0] = (glhanoi->poleDist - glhanoi->maxDiskRadius) * longer;
+ r[1] = (glhanoi->poleDist + glhanoi->maxDiskRadius) * longer;
+ y[0] = 0;
+ y[1] = glhanoi->baseHeight;
+
+ /* compute beg, end. Make the ends square. */
+ theta = M_PI * 2 / (glhanoi->numberOfPoles + 1);
+
+ costh = cos(theta);
+ sinth = sin(theta);
+ beg[0][0] = (glhanoi->poleDist - glhanoi->maxDiskRadius) * costh +
+ glhanoi->maxDiskRadius * sinth;
+ beg[1][0] = (glhanoi->poleDist + glhanoi->maxDiskRadius) * costh +
+ glhanoi->maxDiskRadius * sinth;
+ beg[0][1] = (glhanoi->poleDist - glhanoi->maxDiskRadius) * sinth -
+ glhanoi->maxDiskRadius * costh;
+ beg[1][1] = (glhanoi->poleDist + glhanoi->maxDiskRadius) * sinth -
+ glhanoi->maxDiskRadius * costh;
+ begNorm = theta - M_PI * 0.5;
+
+ theta = M_PI * 2 * glhanoi->numberOfPoles / (glhanoi->numberOfPoles + 1);
+
+ costh = cos(theta);
+ sinth = sin(theta);
+ end[0][0] = (glhanoi->poleDist - glhanoi->maxDiskRadius) * costh -
+ glhanoi->maxDiskRadius * sinth;
+ end[1][0] = (glhanoi->poleDist + glhanoi->maxDiskRadius) * costh -
+ glhanoi->maxDiskRadius * sinth;
+ end[0][1] = (glhanoi->poleDist - glhanoi->maxDiskRadius) * sinth +
+ glhanoi->maxDiskRadius * costh;
+ end[1][1] = (glhanoi->poleDist + glhanoi->maxDiskRadius) * sinth +
+ glhanoi->maxDiskRadius * costh;
+ endNorm = theta + M_PI * 0.5;
+
+ /* bottom: never seen
+ polys = drawBaseStrip(glhanoi, 0, 0, 0, 1, y, r, beg, end); */
+ /* outside edge */
+ polys += drawBaseStrip(glhanoi, 0, 1, 1, 1, y, r, beg, end);
+ /* top */
+ polys += drawBaseStrip(glhanoi, 1, 1, 1, 0, y, r, beg, end);
+ /* inside edge */
+ polys += drawBaseStrip(glhanoi, 1, 0, 0, 0, y, r, beg, end);
+
+ /* Draw ends */
+ glBegin(GL_QUADS);
+
+ glVertex3f(beg[0][0], y[1], beg[0][1]);
+ glVertex3f(beg[1][0], y[1], beg[1][1]);
+ glVertex3f(beg[1][0], y[0], beg[1][1]);
+ glVertex3f(beg[0][0], y[0], beg[0][1]);
+ glNormal3f(cos(begNorm), 0, sin(begNorm));
+
+ glVertex3f(end[0][0], y[0], end[0][1]);
+ glVertex3f(end[1][0], y[0], end[1][1]);
+ glVertex3f(end[1][0], y[1], end[1][1]);
+ glVertex3f(end[0][0], y[1], end[0][1]);
+ glNormal3f(cos(endNorm), 0, sin(endNorm));
+
+ polys += 2;
+
+ glEnd();
+
+ return polys;
+}
+
+static int drawDisks(glhcfg *glhanoi)
+{
+ int i;
+ int polys = 0;
+
+ glPushMatrix();
+ glTranslatef(0.0f, glhanoi->baseHeight, 0.0f);
+ for(i = glhanoi->maxDiskIdx; i >= 0; i--) {
+ Disk *disk = &glhanoi->disk[i];
+ GLfloat *pos = disk->position;
+ GLfloat *rot = disk->rotation;
+
+ glPushMatrix();
+ glTranslatef(pos[0], pos[1], pos[2]);
+ if(rot[1] != 0.0) {
+ glTranslatef(0.0, glhanoi->diskHeight / 2.0, 0.0);
+ /* rotate around different axis depending on phi */
+ if (disk->phi != 0.0)
+ glRotatef(-disk->phi, 0.0, 1.0, 0.0);
+ glRotatef(rot[1], 0.0, 0.0, 1.0);
+ if (disk->phi != 0.0)
+ glRotatef(disk->phi, 0.0, 1.0, 0.0);
+ glTranslatef(0.0, -glhanoi->diskHeight / 2.0, 0.0);
+ }
+ glCallList(disk->displayList);
+ polys += disk->polys;
+ glPopMatrix();
+ }
+ glPopMatrix();
+ return polys;
+}
+
+static GLfloat getDiskRadius(glhcfg *glhanoi, int i)
+{
+ GLfloat retVal = glhanoi->maxDiskRadius *
+ ((GLfloat) i + 3.0) / (glhanoi->numberOfDisks + 3.0);
+ return retVal;
+}
+
+static void initData(glhcfg *glhanoi)
+{
+ int i;
+ GLfloat sinPiOverNP;
+
+ glhanoi->baseLength = BASE_LENGTH;
+ if (glhanoi->layoutLinear) {
+ glhanoi->maxDiskRadius = glhanoi->baseLength /
+ (2 * 0.95 * glhanoi->numberOfPoles);
+ } else {
+ sinPiOverNP = sin(M_PI / (glhanoi->numberOfPoles + 1));
+ glhanoi->maxDiskRadius = (sinPiOverNP * glhanoi->baseLength * 0.5 * 0.95) / (1 + sinPiOverNP);
+ }
+
+ glhanoi->poleDist = glhanoi->baseLength * 0.5 - glhanoi->maxDiskRadius;
+ glhanoi->poleRadius = glhanoi->maxDiskRadius / (glhanoi->numberOfDisks + 3.0);
+ /* fprintf(stderr, "Debug: baseL = %f, maxDiskR = %f, poleR = %f\n",
+ glhanoi->baseLength, glhanoi->maxDiskRadius, glhanoi->poleRadius); */
+ glhanoi->baseWidth = 2.0 * glhanoi->maxDiskRadius;
+ glhanoi->poleOffset = 2.0 * getDiskRadius(glhanoi, glhanoi->maxDiskIdx);
+ glhanoi->diskHeight = 2.0 * glhanoi->poleRadius;
+ glhanoi->baseHeight = 2.0 * glhanoi->poleRadius;
+ glhanoi->poleHeight = glhanoi->numberOfDisks *
+ glhanoi->diskHeight + glhanoi->poleRadius;
+ /* numberOfMoves only applies if numberOfPoles = 3 */
+ glhanoi->numberOfMoves = (1 << glhanoi->numberOfDisks) - 1;
+ /* use golden ratio */
+ glhanoi->boardSize = glhanoi->baseLength * 0.5 * (1.0 + sqrt(5.0));
+
+ glhanoi->pole = (Pole *)calloc(glhanoi->numberOfPoles, sizeof(Pole));
+ checkAllocAndExit(!!glhanoi->pole, "poles");
+
+ for(i = 0; i < glhanoi->numberOfPoles; i++) {
+ checkAllocAndExit(
+ !!(glhanoi->pole[i].data = calloc(glhanoi->numberOfDisks, sizeof(Disk *))),
+ "disk stack");
+ glhanoi->pole[i].size = glhanoi->numberOfDisks;
+ }
+ checkAllocAndExit(
+ !!(glhanoi->diskPos = calloc(glhanoi->numberOfDisks, sizeof(double))),
+ "diskPos");
+
+ if (glhanoi->trailQSize) {
+ glhanoi->trailQ = (TrailPoint *)calloc(glhanoi->trailQSize, sizeof(TrailPoint));
+ checkAllocAndExit(!!glhanoi->trailQ, "trail queue");
+ } else glhanoi->trailQ = (TrailPoint *)NULL;
+ glhanoi->trailQFront = glhanoi->trailQBack = 0;
+
+ glhanoi->the_rotator = make_rotator(0.1, 0.025, 0, 1, 0.005, False);
+ /* or glhanoi->the_rotator = make_rotator(0.025, 0.025, 0.025, 0.5, 0.005, False); */
+ glhanoi->button_down_p = False;
+
+ glhanoi->src = glhanoi->oldsrc = 0;
+ glhanoi->tmp = glhanoi->oldtmp = 1;
+ glhanoi->dst = glhanoi->olddst = glhanoi->numberOfPoles - 1;
+
+ if (glhanoi->numberOfPoles > 3) {
+ glhanoi->solveStackSize = glhanoi->numberOfDisks + 2;
+ glhanoi->solveStack = (SubProblem *)calloc(glhanoi->solveStackSize, sizeof(SubProblem));
+ checkAllocAndExit(!!glhanoi->solveStack, "solving stack");
+ glhanoi->solveStackIdx = 0;
+ }
+}
+
+static void initView(glhcfg *glhanoi)
+{
+ glhanoi->camera[0] = 0.0;
+ glhanoi->camera[1] = 0.0;
+ glhanoi->camera[2] = 0.0;
+ glhanoi->centre[0] = 0.0;
+ glhanoi->centre[1] = glhanoi->poleHeight * 3.0;
+ glhanoi->centre[2] = 0.0;
+}
+
+/*
+ * noise_improved.c - based on ImprovedNoise.java
+ * JAVA REFERENCE IMPLEMENTATION OF IMPROVED NOISE - COPYRIGHT 2002 KEN PERLIN.
+ */
+static double fade(double t)
+{
+ return t * t * t * (t * (t * 6 - 15) + 10);
+}
+
+static double grad(int hash, double x, double y, double z)
+{
+ int h = hash & 15; /* CONVERT LO 4 BITS OF HASH CODE */
+ double u = h < 8 ? x : y, /* INTO 12 GRADIENT DIRECTIONS. */
+ v = h < 4 ? y : h == 12 || h == 14 ? x : z;
+ return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v);
+}
+
+static const int permutation[] = { 151, 160, 137, 91, 90, 15,
+ 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142,
+ 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26,
+ 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237,
+ 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71,
+ 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60,
+ 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143,
+ 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89,
+ 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198,
+ 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118,
+ 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189,
+ 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70,
+ 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108,
+ 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251,
+ 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145,
+ 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184,
+ 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205,
+ 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61,
+ 156, 180
+};
+
+static void initNoise(glhcfg *glhanoi)
+{
+ int i;
+ for(i = 0; i < 256; i++)
+ glhanoi->p[256 + i] = glhanoi->p[i] = permutation[i];
+}
+
+static double improved_noise(glhcfg *glhanoi, double x, double y, double z)
+{
+ double u, v, w;
+ int A, AA, AB, B, BA, BB;
+ int X = (int)floor(x) & 255, /* FIND UNIT CUBE THAT */
+ Y = (int)floor(y) & 255, /* CONTAINS POINT. */
+ Z = (int)floor(z) & 255;
+ if(!glhanoi->noise_initted) {
+ initNoise(glhanoi);
+ glhanoi->noise_initted = 1;
+ }
+ x -= floor(x); /* FIND RELATIVE X,Y,Z */
+ y -= floor(y); /* OF POINT IN CUBE. */
+ z -= floor(z);
+ u = fade(x), /* COMPUTE FADE CURVES */
+ v = fade(y), /* FOR EACH OF X,Y,Z. */
+ w = fade(z);
+ A = glhanoi->p[X] + Y;
+ AA = glhanoi->p[A] + Z;
+ AB = glhanoi->p[A + 1] + Z, /* HASH COORDINATES OF */
+ B = glhanoi->p[X + 1] + Y;
+ BA = glhanoi->p[B] + Z;
+ BB = glhanoi->p[B + 1] + Z; /* THE 8 CUBE CORNERS, */
+ return lerp(w, lerp(v, lerp(u, grad(glhanoi->p[AA], x, y, z),/* AND ADD */
+ grad(glhanoi->p[BA], x - 1, y, z)),/* BLENDED */
+ lerp(u, grad(glhanoi->p[AB], x, y - 1, z),/* RESULTS */
+ grad(glhanoi->p[BB], x - 1, y - 1, z))),/* FROM 8 CORNERS */
+ lerp(v, lerp(u, grad(glhanoi->p[AA + 1], x, y, z - 1), grad(glhanoi->p[BA + 1], x - 1, y, z - 1)), /* OF CUBE */
+ lerp(u, grad(glhanoi->p[AB + 1], x, y - 1, z - 1),
+ grad(glhanoi->p[BB + 1], x - 1, y - 1, z - 1))));
+}
+
+/*
+ * end noise_improved.c - based on ImprovedNoise.java
+ */
+
+struct tex_col_t {
+ GLuint *colours;
+ /* GLfloat *points; */
+ unsigned int ncols;
+};
+typedef struct tex_col_t tex_col_t;
+
+static GLubyte *makeTexture(glhcfg *glhanoi, int x_size, int y_size, int z_size,
+ GLuint(*texFunc) (glhcfg *, double, double, double,
+ tex_col_t *), tex_col_t * colours)
+{
+ int i, j, k;
+ GLubyte *textureData;
+ GLuint *texturePtr;
+ double x, y, z;
+ double xi, yi, zi;
+
+ if((textureData =
+ calloc(x_size * y_size * z_size, sizeof(GLuint))) == NULL) {
+ return NULL;
+ }
+
+ xi = 1.0 / x_size;
+ yi = 1.0 / y_size;
+ zi = 1.0 / z_size;
+
+ z = 0.0;
+ texturePtr = (void *)textureData;
+ for(k = 0; k < z_size; k++, z += zi) {
+ y = 0.0;
+ for(j = 0; j < y_size; j++, y += yi) {
+ x = 0.0;
+ for(i = 0; i < x_size; i++, x += xi) {
+ *texturePtr = texFunc(glhanoi, x, y, z, colours);
+ ++texturePtr;
+ }
+ }
+ }
+ return textureData;
+}
+
+static void freeTexCols(tex_col_t*p)
+{
+ free(p->colours);
+ free(p);
+}
+
+static tex_col_t *makeMarbleColours(void)
+{
+ tex_col_t *marbleColours;
+ int ncols = 2;
+
+ marbleColours = malloc(sizeof(tex_col_t));
+ if(marbleColours == NULL) return NULL;
+ marbleColours->colours = calloc(sizeof(GLuint), ncols);
+ if(marbleColours->colours == NULL) return NULL;
+ marbleColours->ncols = ncols;
+
+ marbleColours->colours[0] = 0x3f3f3f3f;
+ marbleColours->colours[1] = 0xffffffff;
+
+ return marbleColours;
+}
+
+static double turb(glhcfg *glhanoi, double x, double y, double z, int octaves)
+{
+ int oct, freq = 1;
+ double r = 0.0;
+
+ for(oct = 0; oct < octaves; ++oct) {
+ r += fabs(improved_noise(glhanoi, freq * x, freq * y, freq * z)) / freq;
+ freq <<= 1;
+ }
+ return r / 2.0;
+}
+
+static void perturb(glhcfg *glhanoi, double *x, double *y, double *z, double scale)
+{
+ double t = scale * turb(glhanoi, *x, *y, *z, 4);
+ *x += t;
+ *y += t;
+ *z += t;
+}
+
+static double f_m(double x, double y, double z)
+{
+ return sin(3.0 * M_PI * x);
+}
+
+static GLuint C_m(double x, const tex_col_t * tex_cols)
+{
+ int r = tex_cols->colours[0] & 0xff;
+ int g = tex_cols->colours[0] >> 8 & 0xff;
+ int b = tex_cols->colours[0] >> 16 & 0xff;
+ double factor;
+ int r1, g1, b1;
+ x = x - floor(x);
+
+ factor = (1.0 + sin(2.0 * M_PI * x)) / 2.0;
+
+ r1 = (tex_cols->colours[1] & 0xff);
+ g1 = (tex_cols->colours[1] >> 8 & 0xff);
+ b1 = (tex_cols->colours[1] >> 16 & 0xff);
+
+ r += (int)(factor * (r1 - r));
+ g += (int)(factor * (g1 - g));
+ b += (int)(factor * (b1 - b));
+
+ return 0xff000000 | (b << 16) | (g << 8) | r;
+}
+
+
+static GLuint makeMarbleTexture(glhcfg *glhanoi, double x, double y, double z, tex_col_t * colours)
+{
+ perturb(glhanoi, &x, &y, &z, MARBLE_SCALE);
+ return C_m(f_m(x, y, z), colours);
+}
+
+static void setTexture(glhcfg *glhanoi, int n)
+{
+ glBindTexture(GL_TEXTURE_2D, glhanoi->textureNames[n]);
+}
+
+/* returns 1 on failure, 0 on success */
+static int makeTextures(glhcfg *glhanoi)
+{
+ GLubyte *marbleTexture;
+ tex_col_t *marbleColours;
+
+ glGenTextures(N_TEXTURES, glhanoi->textureNames);
+
+ if((marbleColours = makeMarbleColours()) == NULL) {
+ return 1;
+ }
+ if((marbleTexture =
+ makeTexture(glhanoi, MARBLE_TEXTURE_SIZE, MARBLE_TEXTURE_SIZE, 1,
+ makeMarbleTexture, marbleColours)) == NULL) {
+ return 1;
+ }
+
+ glBindTexture(GL_TEXTURE_2D, glhanoi->textureNames[0]);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ MARBLE_TEXTURE_SIZE, MARBLE_TEXTURE_SIZE, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, marbleTexture);
+ free(marbleTexture);
+ freeTexCols(marbleColours);
+
+ return 0;
+}
+
+static void initFloor(glhcfg *glhanoi)
+{
+ int i, j;
+ float tileSize = glhanoi->boardSize / BOARD_SQUARES;
+ float x0, x1, z0, z1;
+ float tx0, tx1, tz0, tz1;
+ const float *col = cWhite;
+ float texIncr = 1.0 / BOARD_SQUARES;
+
+ glhanoi->floorpolys = 0;
+ checkAllocAndExit(!!(glhanoi->floorList = glGenLists(1)), "floor display list");
+ glNewList(glhanoi->floorList, GL_COMPILE);
+ x0 = -glhanoi->boardSize / 2.0;
+ tx0 = 0.0f;
+ setMaterial(col, cWhite, 128);
+ setTexture(glhanoi, 0);
+ glNormal3fv(up);
+ for(i = 0; i < BOARD_SQUARES; i++, x0 += tileSize, tx0 += texIncr) {
+ x1 = x0 + tileSize;
+ tx1 = tx0 + texIncr;
+ z0 = -glhanoi->boardSize / 2.0;
+ tz0 = 0.0f;
+ for(j = 0; j < BOARD_SQUARES; j++, z0 += tileSize, tz0 += texIncr) {
+ int colIndex = (i + j) & 0x1;
+
+ z1 = z0 + tileSize;
+ tz1 = tz0 + texIncr;
+
+ if(colIndex)
+ col = cWhite;
+ else
+ col = cBlack;
+
+ setMaterial(col, cWhite, 100);
+
+ glBegin(GL_QUADS);
+
+ glTexCoord2d(tx0, tz0);
+ glVertex3f(x0, 0.0, z0);
+
+ glTexCoord2d(tx0, tz1);
+ glVertex3f(x0, 0.0, z1);
+
+ glTexCoord2d(tx1, tz1);
+ glVertex3f(x1, 0.0, z1);
+
+ glTexCoord2d(tx1, tz0);
+ glVertex3f(x1, 0.0, z0);
+ glhanoi->floorpolys++;
+ glEnd();
+ }
+ }
+ glEndList();
+}
+
+static void initBase(glhcfg *glhanoi)
+{
+ checkAllocAndExit(!!(glhanoi->baseList = glGenLists(1)), "tower bases display list");
+
+ glNewList(glhanoi->baseList, GL_COMPILE);
+ setMaterial(baseColor, cWhite, 50);
+ if (glhanoi->layoutLinear) {
+ glhanoi->basepolys = drawCuboid(glhanoi->baseLength, glhanoi->baseWidth,
+ glhanoi->baseHeight);
+ } else {
+ glhanoi->basepolys = drawRoundBase(glhanoi);
+ }
+ glEndList();
+}
+
+static void initTowers(glhcfg *glhanoi)
+{
+ int i;
+
+ checkAllocAndExit(!!(glhanoi->poleList = glGenLists(1)), "poles display list\n");
+
+ glNewList(glhanoi->poleList, GL_COMPILE);
+ /* glTranslatef(-glhanoi->poleOffset * (glhanoi->numberOfPoles - 1.0f) * 0.5f, glhanoi->baseHeight, 0.0f); */
+ setMaterial(poleColor, cWhite, 50);
+ for (i = 0; i < glhanoi->numberOfPoles; i++) {
+ GLfloat *p = glhanoi->pole[i].position;
+ GLfloat rad = (M_PI * 2.0 * (i + 1)) / (glhanoi->numberOfPoles + 1);
+
+ p[1] = glhanoi->baseHeight;
+
+ if (glhanoi->layoutLinear) {
+ /* Linear: */
+ p[0] = -glhanoi->poleOffset * ((glhanoi->numberOfPoles - 1) * 0.5f - i);
+ p[2] = 0.0f;
+ } else {
+ /* Circular layout: */
+ p[0] = cos(rad) * glhanoi->poleDist;
+ p[2] = sin(rad) * glhanoi->poleDist;
+ }
+
+ glPushMatrix();
+ glTranslatef(p[0], p[1], p[2]);
+ glhanoi->polepolys = drawPole(glhanoi->poleRadius, glhanoi->poleHeight);
+ glPopMatrix();
+
+ }
+ glEndList();
+}
+
+/* Parameterized hue based on input 0.0 - 1.0. */
+static double cfunc(double x)
+{
+#define COMP <
+ if(x < 2.0 / 7.0) {
+ return (1.0 / 12.0) / (1.0 / 7.0) * x;
+ }
+ if(x < 3.0 / 7.0) {
+ /* (7x - 1) / 6 */
+ return (1.0 + 1.0 / 6.0) * x - 1.0 / 6.0;
+ }
+ if(x < 4.0 / 7.0) {
+ return (2.0 + 1.0 / 3.0) * x - 2.0 / 3.0;
+ }
+ if(x < 5.0 / 7.0) {
+ return (1.0 / 12.0) / (1.0 / 7.0) * x + 1.0 / 3.0;
+ }
+ return (1.0 / 12.0) / (1.0 / 7.0) * x + 1.0 / 3.0;
+}
+
+static void initDisks(glhcfg *glhanoi)
+{
+ int i;
+ glhanoi->disk = (Disk *) calloc(glhanoi->numberOfDisks, sizeof(Disk));
+ checkAllocAndExit(!!glhanoi->disk, "disks");
+
+ for(i = glhanoi->maxDiskIdx; i >= 0; i--) {
+ GLfloat height = (GLfloat) (glhanoi->maxDiskIdx - i);
+ double f = cfunc((GLfloat) i / (GLfloat) glhanoi->numberOfDisks);
+ GLfloat diskColor = f * 360.0;
+ GLfloat color[3];
+ Disk *disk = &glhanoi->disk[i];
+
+ disk->id = i;
+ disk->position[0] = glhanoi->pole[0].position[0]; /* -glhanoi->poleOffset * (glhanoi->numberOfPoles - 1.0f) * 0.5; */
+ disk->position[1] = glhanoi->diskHeight * height;
+ disk->position[2] = glhanoi->pole[0].position[2];
+ disk->rotation[0] = 0.0;
+ disk->rotation[1] = 0.0;
+ disk->rotation[2] = 0.0;
+ disk->polys = 0;
+
+ /* make smaller disks move faster */
+ disk->speed = lerp(((double)glhanoi->numberOfDisks - i) / glhanoi->numberOfDisks,
+ 1.0, glhanoi->speed);
+ /* fprintf(stderr, "disk id: %d, alpha: %0.2f, speed: %0.2f\n", disk->id,
+ ((double)(glhanoi->maxDiskIdx - i)) / glhanoi->numberOfDisks, disk->speed); */
+
+ color[0] = diskColor;
+ color[1] = 1.0f;
+ color[2] = 1.0f;
+ HSVtoRGBv(color, color);
+
+ checkAllocAndExit(!!(disk->displayList = glGenLists(1)), "disk display list");
+ glNewList(disk->displayList, GL_COMPILE);
+ setMaterial(color, cWhite, 100.0);
+ disk->polys += drawDisk3D(glhanoi->poleRadius,
+ getDiskRadius(glhanoi, i),
+ glhanoi->diskHeight);
+ /*fprintf(stderr, "Debug: disk %d has radius %f\n", i,
+ getDiskRadius(glhanoi, i)); */
+ glEndList();
+ }
+ for(i = glhanoi->maxDiskIdx; i >= 0; --i) {
+ GLfloat height = (GLfloat) (glhanoi->maxDiskIdx - i);
+ int h = glhanoi->maxDiskIdx - i;
+ glhanoi->diskPos[h] = glhanoi->diskHeight * height;
+ push(glhanoi, glhanoi->src, &glhanoi->disk[i]);
+ }
+}
+
+static void initLights(Bool state)
+{
+ if(state) {
+ glLightfv(GL_LIGHT0, GL_POSITION, pos0);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb0);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif0);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc0);
+
+ glLightfv(GL_LIGHT1, GL_POSITION, pos1);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, amb1);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, dif1);
+ glLightfv(GL_LIGHT1, GL_SPECULAR, spc1);
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ } else {
+ glDisable(GL_LIGHTING);
+ }
+}
+
+static int drawFloor(glhcfg *glhanoi)
+{
+ glCallList(glhanoi->floorList);
+ return glhanoi->floorpolys;
+}
+
+static int drawTowers(glhcfg *glhanoi)
+{
+ glCallList(glhanoi->baseList);
+ glCallList(glhanoi->poleList);
+ return glhanoi->basepolys + glhanoi->polepolys;
+}
+
+static int drawTrails1(glhcfg *glhanoi, double t, double thickness, double alpha) {
+ int i, prev = -1, lines = 0;
+ Bool fresh = False;
+ GLfloat trailDurInv = 1.0f / glhanoi->trailDuration;
+
+ glLineWidth(thickness);
+
+ glBegin(GL_LINES);
+
+ for (i = glhanoi->trailQFront;
+ i != glhanoi->trailQBack;
+ i = normalizeQ(i + 1)) {
+ TrailPoint *tqi = &(glhanoi->trailQ[i]);
+
+ if (!fresh && t > tqi->endTime) {
+ glhanoi->trailQFront = normalizeQ(i + 1);
+ } else {
+ if (tqi->startTime > t) break;
+ /* Found trails that haven't timed out. */
+ if (!fresh) fresh = True;
+ if (prev > -1) {
+ /* Fade to invisible with age */
+ trailColor[3] = alpha * (tqi->endTime - t) * trailDurInv;
+ /* Can't use setMaterial(trailColor, cBlack, 0) because our color needs an alpha value. */
+ glColor4fv(trailColor);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, trailColor);
+ /* FUTURE: to really do this right, trails should be drawn in back-to-front
+ order, so that blending is done correctly.
+ Currently it looks poor when a faded trail is in front of, or coincident with,
+ a bright trail but is drawn first.
+ I think for now it's good enough to recommend shorter trails so they
+ never/rarely overlap.
+ A jitter per trail arc would also mitigate this problem, to a lesser degree. */
+ glVertex3fv(glhanoi->trailQ[prev].position);
+ glVertex3fv(glhanoi->trailQ[i].position);
+ lines++;
+ }
+ if (glhanoi->trailQ[i].isEnd)
+ prev = -1;
+ else
+ prev = i;
+ }
+ }
+
+ glEnd();
+
+ return lines;
+}
+
+static int drawTrails(glhcfg *glhanoi) {
+ int lines = 0;
+ double t = getTime();
+
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, cBlack);
+ glMateriali(GL_FRONT, GL_SHININESS, 0);
+
+ /* Draw them twice, with different widths and opacities, to make them smoother. */
+ lines = drawTrails1(glhanoi, t, 1.0, 0.75);
+ lines += drawTrails1(glhanoi, t, 2.5, 0.5);
+
+ glDisable (GL_BLEND);
+
+ /* fprintf(stderr, "Drew trails: %d lines\n", lines); */
+ return lines;
+}
+
+/* Window management, etc
+ */
+ENTRYPOINT void reshape_glhanoi(ModeInfo * mi, int width, int height)
+{
+ glhcfg *glhanoi = &glhanoi_cfg[MI_SCREEN(mi)];
+ double h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(glhanoi->glx_context));
+
+ glViewport(0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(30.0, 1/h, 1.0,
+ 2 * MAX_CAMERA_RADIUS);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+ENTRYPOINT void init_glhanoi(ModeInfo * mi)
+{
+ glhcfg *glhanoi;
+ MI_INIT(mi, glhanoi_cfg);
+
+ glhanoi = &glhanoi_cfg[MI_SCREEN(mi)];
+ glhanoi->glx_context = init_GL(mi);
+ glhanoi->numberOfDisks = MI_BATCHCOUNT(mi);
+
+ if (glhanoi->numberOfDisks <= 1)
+ glhanoi->numberOfDisks = 3 + (int) BELLRAND(9);
+
+ /* magicnumber is a bitfield, so we can't have more than 31 discs
+ on a system with 4-byte ints. */
+ if (glhanoi->numberOfDisks >= 8 * sizeof(int))
+ glhanoi->numberOfDisks = (8 * sizeof(int)) - 1;
+
+ glhanoi->maxDiskIdx = glhanoi->numberOfDisks - 1;
+
+ glhanoi->numberOfPoles = get_integer_resource(MI_DISPLAY(mi), "poles", "Integer");
+ /* Set a number of poles from 3 to numberOfDisks + 1, biased toward lower values,
+ with probability decreasing linearly. */
+ if (glhanoi->numberOfPoles <= 2)
+ glhanoi->numberOfPoles = 3 +
+ (int)((1 - sqrt(frand(1.0))) * (glhanoi->numberOfDisks - 1));
+
+ glhanoi->wire = MI_IS_WIREFRAME(mi);
+
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ glhanoi->wire = 0;
+# endif
+
+ glhanoi->light = light;
+ glhanoi->fog = fog;
+ glhanoi->texture = texture;
+ glhanoi->speed = speed;
+ glhanoi->trailDuration = trails;
+ /* set trailQSize based on 60 fps (a maximum, more or less) */
+ /* FUTURE: Should clamp framerate to 60 fps? See flurry.c's draw_flurry().
+ The only bad effect if we don't is that trail-ends could
+ show "unnatural" pauses at high fps. */
+ glhanoi->trailQSize = (int)(trails * 60.0);
+
+ reshape_glhanoi(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if(glhanoi->wire) {
+ glhanoi->light = False;
+ glhanoi->fog = False;
+ glhanoi->texture = False;
+ }
+
+ initLights(!glhanoi->wire && glhanoi->light);
+ checkAllocAndExit(!makeTextures(glhanoi), "textures\n");
+
+ /* Choose linear or circular layout. Could make this a user option. */
+ glhanoi->layoutLinear = (glhanoi->numberOfPoles == 3);
+
+ initData(glhanoi);
+ initView(glhanoi);
+ initFloor(glhanoi);
+ initBase(glhanoi);
+ initTowers(glhanoi);
+ initDisks(glhanoi);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+ glShadeModel(GL_SMOOTH);
+ if(glhanoi->fog) {
+ glClearColor(fogcolor[0], fogcolor[1], fogcolor[2], 1.0);
+ glFogi(GL_FOG_MODE, GL_LINEAR);
+ glFogfv(GL_FOG_COLOR, fogcolor);
+ glFogf(GL_FOG_DENSITY, 0.35f);
+ glHint(GL_FOG_HINT, GL_NICEST);
+ glFogf(GL_FOG_START, MIN_CAMERA_RADIUS);
+ glFogf(GL_FOG_END, MAX_CAMERA_RADIUS / 1.9);
+ glEnable(GL_FOG);
+ }
+
+ glhanoi->duration = START_DURATION;
+ changeState(glhanoi, START);
+}
+
+ENTRYPOINT void draw_glhanoi(ModeInfo * mi)
+{
+ glhcfg *glhanoi = &glhanoi_cfg[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if(!glhanoi->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(glhanoi->glx_context));
+
+ glPolygonMode(GL_FRONT, glhanoi->wire ? GL_LINE : GL_FILL);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ mi->polygon_count = 0;
+
+ glLoadIdentity();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ update_glhanoi(glhanoi);
+ updateView(glhanoi);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ if(!glhanoi->wire && glhanoi->texture) {
+ glEnable(GL_TEXTURE_2D);
+ }
+ mi->polygon_count += drawFloor(glhanoi);
+ glDisable(GL_TEXTURE_2D);
+
+ mi->polygon_count += drawTowers(glhanoi);
+ mi->polygon_count += drawDisks(glhanoi);
+
+ if (glhanoi->trailQSize) {
+ /* No polygons, just lines. So ignore the return count. */
+ (void)drawTrails(glhanoi);
+ }
+
+ if(mi->fps_p) {
+ do_fps(mi);
+ }
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+ENTRYPOINT Bool glhanoi_handle_event(ModeInfo * mi, XEvent * event)
+{
+ glhcfg *glhanoi = &glhanoi_cfg[MI_SCREEN(mi)];
+
+ /* #### this is all wrong on iOS -- should be using gltrackball. */
+
+ if(event->xany.type == ButtonPress && event->xbutton.button == Button1) {
+ glhanoi->button_down_p = True;
+ glhanoi->drag_x = event->xbutton.x;
+ glhanoi->drag_y = event->xbutton.y;
+ return True;
+ } else if(event->xany.type == ButtonRelease
+ && event->xbutton.button == Button1) {
+ glhanoi->button_down_p = False;
+ return True;
+ } else if(event->xany.type == ButtonPress &&
+ (event->xbutton.button == Button4
+ || event->xbutton.button == Button5)) {
+ switch (event->xbutton.button) {
+ case Button4:
+ glhanoi->camera[2] += 0.01;
+ break;
+ case Button5:
+ glhanoi->camera[2] -= 0.01;
+ break;
+ default:
+ fprintf(stderr,
+ "glhanoi: unknown button in mousewheel handler\n");
+ }
+ return True;
+ } else if(event->xany.type == MotionNotify
+ && glhanoi_cfg->button_down_p) {
+ int x_diff, y_diff;
+
+ x_diff = event->xbutton.x - glhanoi->drag_x;
+ y_diff = event->xbutton.y - glhanoi->drag_y;
+
+ glhanoi->camera[0] = (float)x_diff / (float)MI_WIDTH(mi);
+ glhanoi->camera[1] = (float)y_diff / (float)MI_HEIGHT(mi);
+
+ return True;
+ }
+#if 0 /* #### doesn't work */
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ changeState(glhanoi, START);
+ return True;
+ }
+#endif
+ return False;
+}
+
+ENTRYPOINT void free_glhanoi(ModeInfo * mi)
+{
+ int i;
+ int j;
+ glhcfg *glh = &glhanoi_cfg[MI_SCREEN(mi)];
+ if (glh->glx_context) {
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(glh->glx_context));
+ glDeleteLists(glh->floorList, 1);
+ glDeleteLists(glh->baseList, 1);
+ glDeleteLists(glh->poleList, 1);
+ glDeleteLists(glh->textureNames[0], 2);
+ for(j = 0; j < glh->numberOfDisks; ++j) {
+ glDeleteLists(glh->disk[j].displayList, 1);
+ }
+ free(glh->disk);
+ for(i = 0; i < glh->numberOfPoles; i++) {
+ if(glh->pole[i].data != NULL) {
+ free(glh->pole[i].data);
+ }
+ }
+ }
+}
+
+XSCREENSAVER_MODULE ("GLHanoi", glhanoi)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/glhanoi.man b/hacks/glx/glhanoi.man
new file mode 100644
index 0000000..2060cde
--- /dev/null
+++ b/hacks/glx/glhanoi.man
@@ -0,0 +1,83 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+glhanoi - OpenGL Towers of Hanoi
+.SH SYNOPSIS
+.B glhanoi
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-count \fInumber\fP]
+[\-poles \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-wireframe]
+[\-light]
+[\-texture]
+[\-fog]
+[\-fps]
+.SH DESCRIPTION
+Implementation of Towers of Hanoi in OpenGL
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-count \fInumber\fP
+Number of disks. Default: 7.
+.TP 8
+.B \-poles \fInumber\fP
+Number of poles. Default: random from 3 to disks+1.
+.TP 8
+.B \-speed \fInumber\fP
+Speed multiplier (for smallest disks). Default: 1.
+.TP 8
+.B \-trails \fInumber\fP
+Length of disk trails, in seconds. Default: 2.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fog | \-no-fog
+Render in fog.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-light | -no-light
+Whether the scene is lit.
+.TP 8
+.B \-texture | \-no-texture
+Render with textures instead of solid.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2004 by Dave Atkinson. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Dave Atkinson.
diff --git a/hacks/glx/glknots.c b/hacks/glx/glknots.c
new file mode 100644
index 0000000..730cadb
--- /dev/null
+++ b/hacks/glx/glknots.c
@@ -0,0 +1,445 @@
+/* glknots, Copyright (c) 2003-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Generates some 3D knots (closed loops).
+ * Inspired by Paul Bourke <pbourke@swin.edu.au> at
+ * http://astronomy.swin.edu.au/~pbourke/curves/knot/
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_knot 0
+# define release_knot 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "tube.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_SPIN "XYZ"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+#define DEF_THICKNESS "0.3"
+#define DEF_SEGMENTS "800"
+#define DEF_DURATION "8"
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ GLuint knot_list;
+
+ int ncolors;
+ XColor *colors;
+ int ccolor;
+
+ int mode; /* 0 = normal, 1 = out, 2 = in */
+ int mode_tick;
+ Bool clear_p;
+
+ time_t last_time;
+ int draw_tick;
+
+} knot_configuration;
+
+static knot_configuration *bps = NULL;
+
+static char *do_spin;
+static GLfloat speed;
+static Bool do_wander;
+static GLfloat thickness;
+static unsigned int segments;
+static int duration;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionSepArg, 0 },
+ { "+spin", ".spin", XrmoptionNoArg, "" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-thickness", ".thickness", XrmoptionSepArg, 0 },
+ { "-segments", ".segments", XrmoptionSepArg, 0 },
+ { "-duration", ".duration", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_String},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&thickness, "thickness", "Thickness", DEF_THICKNESS, t_Float},
+ {&segments, "segments", "Segments", DEF_SEGMENTS, t_Int},
+ {&duration, "duration", "Duration", DEF_DURATION, t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt knot_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+static void
+make_knot (ModeInfo *mi)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+
+ GLfloat diam = (4 * thickness);
+ int faces = (wire ? 3 : 6);
+
+ unsigned int i;
+ double x, y, z, ox=0, oy=0, oz=0;
+ double mu;
+
+ double p[9];
+
+ Bool blobby_p = (0 == (random() % 5));
+ Bool type = (random() % 2);
+
+ for (i = 0; i < countof(p); i++)
+ {
+ p[i] = 1 + (random() % 4);
+ if (! (random() % 3))
+ p[i] += (random() % 5);
+ }
+
+ if (type == 1)
+ {
+ p[0] += 4;
+ p[1] *= ((p[0] + p[0]) / 10);
+ blobby_p = False;
+ }
+
+ mi->polygon_count = 0;
+
+ for (i = 0; i <= segments; i++)
+ {
+ if (type == 0)
+ {
+ mu = i * (M_PI * 2) / segments;
+ x = 10 * (cos(mu) + cos(p[0]*mu)) + cos(p[1]*mu) + cos(p[2]*mu);
+ y = 6 * sin(mu) + 10 * sin(p[3]*mu);
+ z = 16 * sin(p[4]*mu) * sin(p[5]*mu/2) + p[6]*sin(p[7]*mu) -
+ 2 * sin(p[8]*mu);
+ }
+ else if (type == 1)
+ {
+ mu = i * (M_PI * 2) * p[0] / (double) segments;
+ x = 10 * cos(mu) * (1 + cos(p[1] * mu/ p[0]) / 2.0);
+ y = 25 * sin(p[1] * mu / p[0]) / 2.0;
+ z = 10 * sin(mu) * (1 + cos(p[1] * mu/ p[0]) / 2.0);
+ }
+ else
+ abort();
+
+ if (i != 0)
+ {
+ GLfloat dist = sqrt ((x-ox)*(x-ox) +
+ (y-oy)*(y-oy) +
+ (z-oz)*(z-oz));
+ GLfloat di;
+ if (!blobby_p)
+ di = diam;
+ else
+ {
+ di = dist * (segments / 500.0);
+ di = (di * di * 3);
+ }
+
+ mi->polygon_count += tube (ox, oy, oz,
+ x, y, z,
+ di, dist/3,
+ faces, True, wire, wire);
+ }
+
+ ox = x;
+ oy = y;
+ oz = z;
+ }
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_knot (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+static void
+new_knot (ModeInfo *mi)
+{
+ knot_configuration *bp = &bps[MI_SCREEN(mi)];
+ int i;
+
+ bp->clear_p = !!(random() % 15);
+
+ bp->ncolors = 128;
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+
+ for (i = 0; i < bp->ncolors; i++)
+ {
+ /* make colors twice as bright */
+ bp->colors[i].red = (bp->colors[i].red >> 2) + 0x7FFF;
+ bp->colors[i].green = (bp->colors[i].green >> 2) + 0x7FFF;
+ bp->colors[i].blue = (bp->colors[i].blue >> 2) + 0x7FFF;
+ }
+
+ glNewList (bp->knot_list, GL_COMPILE);
+ make_knot (mi);
+ glEndList ();
+}
+
+
+ENTRYPOINT Bool
+knot_handle_event (ModeInfo *mi, XEvent *event)
+{
+ knot_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ bp->last_time = 1;
+ return True;
+ }
+
+ return False;
+}
+
+
+
+ENTRYPOINT void
+init_knot (ModeInfo *mi)
+{
+ knot_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ if (thickness <= 0) thickness = 0.001;
+ else if (thickness > 1) thickness = 1;
+
+ if (segments < 10) segments = 10;
+
+ reshape_knot (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ {
+ Bool spinx=False, spiny=False, spinz=False;
+ double spin_speed = 2.0;
+ double wander_speed = 0.05;
+ double spin_accel = 0.2;
+
+ char *s = do_spin;
+ while (*s)
+ {
+ if (*s == 'x' || *s == 'X') spinx = True;
+ else if (*s == 'y' || *s == 'Y') spiny = True;
+ else if (*s == 'z' || *s == 'Z') spinz = True;
+ else if (*s == '0') ;
+ else
+ {
+ fprintf (stderr,
+ "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
+ progname, do_spin);
+ exit (1);
+ }
+ s++;
+ }
+
+ bp->rot = make_rotator (spinx ? spin_speed : 0,
+ spiny ? spin_speed : 0,
+ spinz ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ (spinx && spiny && spinz));
+ bp->trackball = gltrackball_init (True);
+ }
+
+ bp->knot_list = glGenLists (1);
+ new_knot(mi);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+ENTRYPOINT void
+draw_knot (ModeInfo *mi)
+{
+ knot_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ GLfloat bcolor[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat bshiny = 128.0;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ if (bp->mode == 0)
+ {
+ if (bp->draw_tick++ > 10)
+ {
+ time_t now = time((time_t *) 0);
+ if (bp->last_time == 0) bp->last_time = now;
+ bp->draw_tick = 0;
+ if (!bp->button_down_p &&
+ now - bp->last_time >= duration)
+ {
+ bp->mode = 1; /* go out */
+ bp->mode_tick = 10 / speed;
+ bp->last_time = now;
+ }
+ }
+ }
+ else if (bp->mode == 1) /* out */
+ {
+ if (--bp->mode_tick <= 0)
+ {
+ new_knot (mi);
+ bp->mode_tick = 10 / speed;
+ bp->mode = 2; /* go in */
+ }
+ }
+ else if (bp->mode == 2) /* in */
+ {
+ if (--bp->mode_tick <= 0)
+ bp->mode = 0; /* normal */
+ }
+ else
+ abort();
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ if (bp->clear_p)
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 8,
+ (z - 0.5) * 15);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ bcolor[0] = bp->colors[bp->ccolor].red / 65536.0;
+ bcolor[1] = bp->colors[bp->ccolor].green / 65536.0;
+ bcolor[2] = bp->colors[bp->ccolor].blue / 65536.0;
+ bp->ccolor++;
+ if (bp->ccolor >= bp->ncolors) bp->ccolor = 0;
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, bspec);
+ glMateriali (GL_FRONT, GL_SHININESS, bshiny);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bcolor);
+
+ glScalef(0.25, 0.25, 0.25);
+
+ if (bp->mode != 0)
+ {
+ GLfloat s = (bp->mode == 1
+ ? bp->mode_tick / (10 / speed)
+ : ((10 / speed) - bp->mode_tick + 1) / (10 / speed));
+ glScalef (s, s, s);
+ }
+
+ glCallList (bp->knot_list);
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("GLKnots", glknots, knot)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/glknots.man b/hacks/glx/glknots.man
new file mode 100644
index 0000000..c4f1d1a
--- /dev/null
+++ b/hacks/glx/glknots.man
@@ -0,0 +1,81 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+glknots - generates some twisting 3d knot patterns
+.SH SYNOPSIS
+.B glknots
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fIfloat\fP]
+[\-segments \fIint\fP]
+[\-thickness \fIfloat\fP]
+[\-duration \fIseconds\fP]
+[\-no-wander]
+[\-spin \fIXYZ\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Generates some twisting 3d knot patterns. Spins 'em around.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Larger numbers mean run faster. Default: 1.0.
+.TP 8
+.B \-segments \fInumber\fP
+Number of segments in each path. Default 800. Larger numbers make the
+curves smoother, at the expense of a higher polygon count.
+.TP 8
+.B \-thickness \fIfloat\fP
+How thick the tubes should be. Default 0.3.
+.TP 8
+.B \-duration \fIseconds\fP
+How long to leave each knot up. Default 8 seconds.
+.TP 8
+.B \-wander | \-no-wander
+Whether the cubes should wander around the screen.
+.TP 8
+.B \-spin [XYZ] | \-no-spin
+Which axes, if any, to spin around on.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/gllist.c b/hacks/glx/gllist.c
new file mode 100644
index 0000000..342e381
--- /dev/null
+++ b/hacks/glx/gllist.c
@@ -0,0 +1,127 @@
+/* xscreensaver, Copyright (c) 1998-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include "gllist.h"
+
+void
+renderList (const struct gllist *list, int wire_p)
+{
+ while (list)
+ {
+ if (!wire_p || list->primitive == GL_LINES ||
+ list->primitive == GL_POINTS)
+ {
+ glInterleavedArrays (list->format, 0, list->data);
+ glDrawArrays (list->primitive, 0, list->points);
+ }
+ else
+ {
+ /* For wireframe, do it the hard way: treat every tuple of
+ points as its own line loop.
+ */
+ const GLfloat *p = (GLfloat *) list->data;
+ int i, j, tick, skip, stride;
+
+ switch (list->primitive) {
+ case GL_QUADS: tick = 4; break;
+ case GL_TRIANGLES: tick = 3; break;
+ default: abort(); break; /* write me */
+ }
+
+ switch (list->format) {
+ case GL_C3F_V3F: case GL_N3F_V3F: skip = 3; stride = 6; break;
+ default: abort(); break; /* write me */
+ }
+
+ glBegin (GL_LINE_LOOP);
+ for (i = 0, j = skip;
+ i < list->points;
+ i++, j += stride)
+ {
+ if (i && !(i % tick))
+ {
+ glEnd();
+ glBegin (GL_LINE_LOOP);
+ }
+ glVertex3f (p[j], p[j+1], p[j+2]);
+ }
+ glEnd();
+ }
+ list = list->next;
+ }
+}
+
+
+void
+renderListNormals (const struct gllist *list, GLfloat length, int faces_p)
+{
+ while (list)
+ {
+ const GLfloat *p = (GLfloat *) list->data;
+ int i, j, tick, skip, stride;
+ GLfloat v[3], n[3];
+
+ if (list->primitive == GL_LINES) continue;
+
+ if (! faces_p)
+ tick = 1;
+ else
+ switch (list->primitive) {
+ case GL_QUADS: tick = 4; break;
+ case GL_TRIANGLES: tick = 3; break;
+ default: abort(); break; /* write me */
+ }
+
+ switch (list->format) {
+ case GL_N3F_V3F: skip = 0; stride = 6; break;
+ case GL_C3F_V3F: continue; break;
+ default: abort(); break; /* write me */
+ }
+
+ v[0] = v[1] = v[2] = 0;
+ n[0] = n[1] = n[2] = 0;
+
+ for (i = 0, j = skip;
+ i <= list->points;
+ i++, j += stride)
+ {
+ if (i && !(i % tick))
+ {
+ n[0] /= tick;
+ n[1] /= tick;
+ n[2] /= tick;
+ v[0] /= tick;
+ v[1] /= tick;
+ v[2] /= tick;
+ glPushMatrix();
+ glTranslatef (v[0], v[1], v[2]);
+ glScalef (length, length, length);
+ glBegin (GL_LINES);
+ glVertex3f (0, 0, 0);
+ glVertex3f (n[0], n[1], n[2]);
+ glEnd();
+ glPopMatrix();
+ v[0] = v[1] = v[2] = 0;
+ n[0] = n[1] = n[2] = 0;
+ }
+
+ if (i == list->points) break;
+ n[0] += p[j];
+ n[1] += p[j+1];
+ n[2] += p[j+2];
+ v[0] += p[j+3];
+ v[1] += p[j+4];
+ v[2] += p[j+5];
+
+ }
+ list = list->next;
+ }
+}
diff --git a/hacks/glx/gllist.h b/hacks/glx/gllist.h
new file mode 100644
index 0000000..1d6326a
--- /dev/null
+++ b/hacks/glx/gllist.h
@@ -0,0 +1,44 @@
+/* xscreensaver, Copyright (c) 1998-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __GLLIST_H__
+#define __GLLIST_H__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include <stdlib.h>
+
+#ifdef HAVE_COCOA
+#elif defined(HAVE_ANDROID)
+# include <GLES/gl.h>
+#else /* real X11 */
+# include <GL/gl.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+struct gllist
+{
+ GLenum format;
+ GLenum primitive;
+ int points;
+ const void *data;
+ struct gllist *next;
+};
+
+void renderList (const struct gllist *, int wire_p);
+void renderListNormals (const struct gllist *, GLfloat length, int facesp);
+
+#endif /* __GLLIST_H__ */
diff --git a/hacks/glx/glmatrix.c b/hacks/glx/glmatrix.c
new file mode 100644
index 0000000..6a9b1fe
--- /dev/null
+++ b/hacks/glx/glmatrix.c
@@ -0,0 +1,1068 @@
+/* glmatrix, Copyright (c) 2003-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * GLMatrix -- simulate the text scrolls from the movie "The Matrix".
+ *
+ * This program does a 3D rendering of the dropping characters that
+ * appeared in the title sequences of the movies. See also `xmatrix'
+ * for a simulation of what the computer monitors actually *in* the
+ * movie did.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define free_matrix 0
+# define release_matrix 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+#include "xlockmore.h"
+#include "ximage-loader.h"
+
+#include "images/gen/matrix3_png.h"
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SPEED "1.0"
+#define DEF_DENSITY "20"
+#define DEF_CLOCK "False"
+#define DEF_FOG "True"
+#define DEF_WAVES "True"
+#define DEF_ROTATE "True"
+#define DEF_TEXTURE "True"
+#define DEF_MODE "Matrix"
+#define DEF_TIMEFMT " %l%M%p "
+
+
+#define CHAR_COLS 16
+#define CHAR_ROWS 13
+
+static const int matrix_encoding[] = {
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
+# if 0
+ 192, 193, 194, 195, 196, 197, 198, 199,
+ 200, 201, 202, 203, 204, 205, 206, 207
+# else
+ 160, 161, 162, 163, 164, 165, 166, 167,
+ 168, 169, 170, 171, 172, 173, 174, 175
+# endif
+ };
+static const int decimal_encoding[] = {
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 };
+static const int hex_encoding[] = {
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 33, 34, 35, 36, 37, 38 };
+static const int binary_encoding[] = { 16, 17 };
+static const int dna_encoding[] = { 33, 35, 39, 52 };
+
+static const unsigned char char_map[256] = {
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, /* 0 */
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, /* 16 */
+ 0, 1, 2, 96, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, /* 32 */
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* 48 */
+ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, /* 64 */
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, /* 80 */
+ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, /* 96 */
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, /* 112 */
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, /* 128 */
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, /* 144 */
+ 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, /* 160 */
+ 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, /* 176 */
+ 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, /* 192 */
+ 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, /* 208 */
+#if 0
+ 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, /* 224 */
+ 176,177,178,195,180,181,182,183,184,185,186,187,188,189,190,191 /* 240 */
+#else /* see spank_image() */
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, /* 224 */
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, /* 240 */
+#endif
+};
+
+#define CURSOR_GLYPH 97
+
+/* #define DEBUG */
+
+#define GRID_SIZE 70 /* width and height of the arena */
+#define GRID_DEPTH 35 /* depth of the arena */
+#define WAVE_SIZE 22 /* periodicity of color (brightness) waves */
+#define SPLASH_RATIO 0.7 /* ratio of GRID_DEPTH where chars hit the screen */
+
+static const struct { GLfloat x, y; } nice_views[] = {
+ { 0, 0 },
+ { 0, -20 }, /* this is a list of viewer rotations that look nice. */
+ { 0, 20 }, /* every now and then we switch to a new one. */
+ { 25, 0 }, /* (but we only use the first one at start-up.) */
+ {-25, 0 },
+ { 25, 20 },
+ {-25, 20 },
+ { 25, -20 },
+ {-25, -20 },
+
+ { 10, 0 },
+ {-10, 0 },
+ { 0, 0 }, /* prefer these */
+ { 0, 0 },
+ { 0, 0 },
+ { 0, 0 },
+ { 0, 0 },
+};
+
+
+typedef struct {
+ GLfloat x, y, z; /* position of strip */
+ GLfloat dx, dy, dz; /* velocity of strip */
+
+ Bool erasing_p; /* Whether this strip is on its way out. */
+
+ int spinner_glyph; /* the bottommost glyph -- the feeder */
+ GLfloat spinner_y; /* where on the strip the bottom glyph is */
+ GLfloat spinner_speed; /* how fast the bottom glyph drops */
+
+ int glyphs[GRID_SIZE]; /* the other glyphs on the strip, which will be
+ revealed by the dropping spinner.
+ 0 means no glyph; negative means "spinner".
+ If non-zero, real value is abs(G)-1. */
+
+ Bool highlight[GRID_SIZE];
+ /* some glyphs may be highlighted */
+
+ int spin_speed; /* Rotate all spinners every this-many frames */
+ int spin_tick; /* frame counter */
+
+ int wave_position; /* Waves of brightness wash down the strip. */
+ int wave_speed; /* every this-many frames. */
+ int wave_tick; /* frame counter. */
+
+} strip;
+
+
+typedef struct {
+ GLXContext *glx_context;
+ Bool button_down_p;
+ GLuint texture;
+ int nstrips;
+ strip *strips;
+ const int *glyph_map;
+ int nglyphs;
+ GLfloat tex_char_width, tex_char_height;
+
+ /* auto-tracking direction of view */
+ int last_view, target_view;
+ GLfloat view_x, view_y;
+ int view_steps, view_tick;
+ Bool auto_tracking_p;
+ int track_tick;
+
+ int real_char_rows;
+ GLfloat brightness_ramp[WAVE_SIZE];
+
+} matrix_configuration;
+
+static matrix_configuration *mps = NULL;
+
+static GLfloat speed;
+static GLfloat density;
+static Bool do_clock;
+static char *timefmt;
+static Bool do_fog;
+static Bool do_waves;
+static Bool do_rotate;
+static Bool do_texture;
+static char *mode_str;
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-density", ".density", XrmoptionSepArg, 0 },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-binary", ".mode", XrmoptionNoArg, "binary" },
+ { "-hexadecimal", ".mode", XrmoptionNoArg, "hexadecimal" },
+ { "-decimal", ".mode", XrmoptionNoArg, "decimal" },
+ { "-dna", ".mode", XrmoptionNoArg, "dna" },
+ { "-clock", ".clock", XrmoptionNoArg, "True" },
+ { "+clock", ".clock", XrmoptionNoArg, "False" },
+ { "-timefmt", ".timefmt", XrmoptionSepArg, 0 },
+ { "-fog", ".fog", XrmoptionNoArg, "True" },
+ { "+fog", ".fog", XrmoptionNoArg, "False" },
+ { "-waves", ".waves", XrmoptionNoArg, "True" },
+ { "+waves", ".waves", XrmoptionNoArg, "False" },
+ { "-rotate", ".rotate", XrmoptionNoArg, "True" },
+ { "+rotate", ".rotate", XrmoptionNoArg, "False" },
+ {"-texture", ".texture", XrmoptionNoArg, "True" },
+ {"+texture", ".texture", XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+ {&mode_str, "mode", "Mode", DEF_MODE, t_String},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&density, "density", "Density", DEF_DENSITY, t_Float},
+ {&do_clock, "clock", "Clock", DEF_CLOCK, t_Bool},
+ {&timefmt, "timefmt", "Timefmt", DEF_TIMEFMT, t_String},
+ {&do_fog, "fog", "Fog", DEF_FOG, t_Bool},
+ {&do_waves, "waves", "Waves", DEF_WAVES, t_Bool},
+ {&do_rotate, "rotate", "Rotate", DEF_ROTATE, t_Bool},
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt matrix_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Re-randomize the state of one strip.
+ */
+static void
+reset_strip (ModeInfo *mi, strip *s)
+{
+ matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+ int i;
+ Bool time_displayed_p = False; /* never display time twice in one strip */
+
+ memset (s, 0, sizeof(*s));
+ s->x = (GLfloat) (frand(GRID_SIZE) - (GRID_SIZE/2));
+ s->y = (GLfloat) (GRID_SIZE/2 + BELLRAND(0.5)); /* shift top slightly */
+ s->z = (GLfloat) (GRID_DEPTH * 0.2) - frand (GRID_DEPTH * 0.7);
+ s->spinner_y = 0;
+
+ s->dx = 0;
+/* s->dx = ((BELLRAND(0.01) - 0.005) * speed); */
+ s->dy = 0;
+ s->dz = (BELLRAND(0.02) * speed);
+
+ s->spinner_speed = (BELLRAND(0.3) * speed);
+
+ s->spin_speed = (int) BELLRAND(2.0 / speed) + 1;
+ s->spin_tick = 0;
+
+ s->wave_position = 0;
+ s->wave_speed = (int) BELLRAND(3.0 / speed) + 1;
+ s->wave_tick = 0;
+
+ for (i = 0; i < GRID_SIZE; i++)
+ if (do_clock &&
+ !time_displayed_p &&
+ (i < GRID_SIZE-5) && /* display approx. once per 5 strips */
+ !(random() % (GRID_SIZE-5)*5))
+ {
+ int j;
+ char text[80];
+ time_t now = time ((time_t *) 0);
+ struct tm *tm = localtime (&now);
+ strftime (text, sizeof(text)-1, timefmt, tm);
+
+ /* render time into the strip */
+ for (j = 0; j < strlen(text) && i < GRID_SIZE; j++, i++)
+ {
+ s->glyphs[i] = char_map [((unsigned char *) text)[j]] + 1;
+ s->highlight[i] = True;
+ }
+
+ time_displayed_p = True;
+ }
+ else
+ {
+ int draw_p = (random() % 7);
+ int spin_p = (draw_p && !(random() % 20));
+ int g = (draw_p
+ ? mp->glyph_map[(random() % mp->nglyphs)] + 1
+ : 0);
+ if (spin_p) g = -g;
+ s->glyphs[i] = g;
+ s->highlight[i] = False;
+ }
+
+ s->spinner_glyph = - (mp->glyph_map[(random() % mp->nglyphs)] + 1);
+}
+
+
+/* Animate the strip one step. Reset if it has reached the bottom.
+ */
+static void
+tick_strip (ModeInfo *mi, strip *s)
+{
+ matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+ int i;
+
+ if (mp->button_down_p)
+ return;
+
+ s->x += s->dx;
+ s->y += s->dy;
+ s->z += s->dz;
+
+ if (s->z > GRID_DEPTH * SPLASH_RATIO) /* splashed into screen */
+ {
+ reset_strip (mi, s);
+ return;
+ }
+
+ s->spinner_y += s->spinner_speed;
+ if (s->spinner_y >= GRID_SIZE)
+ {
+ if (s->erasing_p)
+ {
+ reset_strip (mi, s);
+ return;
+ }
+ else
+ {
+ s->erasing_p = True;
+ s->spinner_y = 0;
+ s->spinner_speed /= 2; /* erase it slower than we drew it */
+ }
+ }
+
+ /* Spin the spinners. */
+ s->spin_tick++;
+ if (s->spin_tick > s->spin_speed)
+ {
+ s->spin_tick = 0;
+ s->spinner_glyph = - (mp->glyph_map[(random() % mp->nglyphs)] + 1);
+ for (i = 0; i < GRID_SIZE; i++)
+ if (s->glyphs[i] < 0)
+ {
+ s->glyphs[i] = -(mp->glyph_map[(random() % mp->nglyphs)] + 1);
+ if (! (random() % 800)) /* sometimes they stop spinning */
+ s->glyphs[i] = -s->glyphs[i];
+ }
+ }
+
+ /* Move the color (brightness) wave. */
+ s->wave_tick++;
+ if (s->wave_tick > s->wave_speed)
+ {
+ s->wave_tick = 0;
+ s->wave_position++;
+ if (s->wave_position >= WAVE_SIZE)
+ s->wave_position = 0;
+ }
+}
+
+
+/* Draw a single character at the given position and brightness.
+ */
+static void
+draw_glyph (ModeInfo *mi, int glyph, Bool highlight,
+ GLfloat x, GLfloat y, GLfloat z,
+ GLfloat brightness)
+{
+ matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ GLfloat w = mp->tex_char_width;
+ GLfloat h = mp->tex_char_height;
+ GLfloat cx = 0, cy = 0;
+ GLfloat S = 1;
+ Bool spinner_p = (glyph < 0);
+
+ if (glyph == 0) abort();
+ if (glyph < 0) glyph = -glyph;
+
+ if (spinner_p)
+ brightness *= 1.5;
+
+ if (!do_texture)
+ {
+ S = 0.8;
+ x += 0.1;
+ y += 0.1;
+ }
+ else
+ {
+ int ccx = ((glyph - 1) % CHAR_COLS);
+ int ccy = ((glyph - 1) / CHAR_COLS);
+
+ cx = ccx * w;
+ cy = (mp->real_char_rows - ccy - 1) * h;
+
+ if (do_fog)
+ {
+ GLfloat depth;
+ depth = (z / GRID_DEPTH) + 0.5; /* z ratio from back/front */
+ depth = 0.2 + (depth * 0.8); /* scale to range [0.2 - 1.0] */
+ brightness *= depth; /* so no row goes all black. */
+ }
+ }
+
+ {
+ GLfloat r, g, b, a;
+
+ if (highlight)
+ brightness *= 2;
+
+ if (!do_texture && !spinner_p)
+ r = b = 0, g = 1;
+ else
+ r = g = b = 1;
+
+ a = brightness;
+
+ /* If the glyph is very close to the screen (meaning it is very large,
+ and is about to splash into the screen and vanish) then start fading
+ it out, proportional to how close to the glass it is.
+ */
+ if (z > GRID_DEPTH/2)
+ {
+ GLfloat ratio = ((z - GRID_DEPTH/2) /
+ ((GRID_DEPTH * SPLASH_RATIO) - GRID_DEPTH/2));
+ int i = ratio * WAVE_SIZE;
+
+ if (i < 0) i = 0;
+ else if (i >= WAVE_SIZE) i = WAVE_SIZE-1;
+
+ a *= mp->brightness_ramp[i];
+ }
+
+ glColor4f (r,g,b,a);
+ }
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glNormal3f (0, 0, 1);
+ glTexCoord2f (cx, cy); glVertex3f (x, y, z);
+ glTexCoord2f (cx+w, cy); glVertex3f (x+S, y, z);
+ glTexCoord2f (cx+w, cy+h); glVertex3f (x+S, y+S, z);
+ glTexCoord2f (cx, cy+h); glVertex3f (x, y+S, z);
+ glEnd ();
+
+ if (wire && spinner_p)
+ {
+ glBegin (GL_LINES);
+ glVertex3f (x, y, z);
+ glVertex3f (x+S, y+S, z);
+ glVertex3f (x, y+S, z);
+ glVertex3f (x+S, y, z);
+ glEnd();
+ }
+
+ mi->polygon_count++;
+}
+
+
+/* Draw all the visible glyphs in the strip.
+ */
+static void
+draw_strip (ModeInfo *mi, strip *s)
+{
+ matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+ int i;
+ for (i = 0; i < GRID_SIZE; i++)
+ {
+ int g = s->glyphs[i];
+ Bool below_p = (s->spinner_y >= i);
+
+ if (s->erasing_p)
+ below_p = !below_p;
+
+ if (g && below_p) /* don't draw cells below the spinner */
+ {
+ GLfloat brightness;
+ if (!do_waves)
+ brightness = 1.0;
+ else
+ {
+ int j = WAVE_SIZE - ((i + (GRID_SIZE - s->wave_position))
+ % WAVE_SIZE);
+ brightness = mp->brightness_ramp[j];
+ }
+
+ draw_glyph (mi, g, s->highlight[i],
+ s->x, s->y - i, s->z, brightness);
+ }
+ }
+
+ if (!s->erasing_p)
+ draw_glyph (mi, s->spinner_glyph, False,
+ s->x, s->y - s->spinner_y, s->z, 1.0);
+}
+
+
+/* qsort comparator for sorting strips by z position */
+static int
+cmp_strips (const void *aa, const void *bb)
+{
+ const strip *a = *(strip **) aa;
+ const strip *b = *(strip **) bb;
+ return ((int) (a->z * 10000) -
+ (int) (b->z * 10000));
+}
+
+
+/* Auto-tracking
+ */
+
+static void
+auto_track_init (ModeInfo *mi)
+{
+ matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+ mp->last_view = 0;
+ mp->target_view = 0;
+ mp->view_x = nice_views[mp->last_view].x;
+ mp->view_y = nice_views[mp->last_view].y;
+ mp->view_steps = 100;
+ mp->view_tick = 0;
+ mp->auto_tracking_p = False;
+}
+
+
+static void
+auto_track (ModeInfo *mi)
+{
+ matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+
+ if (! do_rotate)
+ return;
+ if (mp->button_down_p)
+ return;
+
+ /* if we're not moving, maybe start moving. Otherwise, do nothing. */
+ if (! mp->auto_tracking_p)
+ {
+ if (++mp->track_tick < 20/speed) return;
+ mp->track_tick = 0;
+ if (! (random() % 20))
+ mp->auto_tracking_p = True;
+ else
+ return;
+ }
+
+
+ {
+ GLfloat ox = nice_views[mp->last_view].x;
+ GLfloat oy = nice_views[mp->last_view].y;
+ GLfloat tx = nice_views[mp->target_view].x;
+ GLfloat ty = nice_views[mp->target_view].y;
+
+ /* move from A to B with sinusoidal deltas, so that it doesn't jerk
+ to a stop. */
+ GLfloat th = sin ((M_PI / 2) * (double) mp->view_tick / mp->view_steps);
+
+ mp->view_x = (ox + ((tx - ox) * th));
+ mp->view_y = (oy + ((ty - oy) * th));
+ mp->view_tick++;
+
+ if (mp->view_tick >= mp->view_steps)
+ {
+ mp->view_tick = 0;
+ mp->view_steps = (350.0 / speed);
+ mp->last_view = mp->target_view;
+ mp->target_view = (random() % (countof(nice_views) - 1)) + 1;
+ mp->auto_tracking_p = False;
+ }
+ }
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_matrix (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (80.0, 1/h, 1.0, 100);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 25.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+matrix_handle_event (ModeInfo *mi, XEvent *event)
+{
+ matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+
+ if (event->xany.type == ButtonPress &&
+ event->xbutton.button == Button1)
+ {
+ mp->button_down_p = True;
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease &&
+ event->xbutton.button == Button1)
+ {
+ mp->button_down_p = False;
+ return True;
+ }
+
+ return False;
+}
+
+
+#if 0
+static Bool
+bigendian (void)
+{
+ union { int i; char c[sizeof(int)]; } u;
+ u.i = 1;
+ return !u.c[0];
+}
+#endif
+
+
+/* The image with the characters in it is 512x598, meaning that it needs to
+ be copied into a 512x1024 texture. But some machines can't handle textures
+ that large... And it turns out that we aren't using most of the characters
+ in that image anyway, since this program doesn't do anything that makes use
+ of the full range of Latin1 characters. So... this function tosses out the
+ last 32 of the Latin1 characters, resulting in a 512x506 image, which we
+ can then stuff in a 512x512 texture. Voila.
+
+ If this hack ever grows into something that displays full Latin1 text,
+ well then, Something Else Will Need To Be Done.
+
+ Since currently GLMatrix does not run textclient / xscreensaver-text,
+ it's not an issue. (XMatrix does that.)
+
+ */
+static void
+spank_image (matrix_configuration *mp, XImage *xi)
+{
+ int ch = xi->height / CHAR_ROWS;
+ int cut = 2;
+ unsigned char *bits = (unsigned char *) xi->data;
+ unsigned char *from, *to, *s, *end;
+ int L = xi->bytes_per_line * ch;
+/* int i;*/
+
+ /* Copy row 12 into 10 (which really means, copy 2 into 0,
+ since texture data is upside down.).
+ */
+ to = bits + (L * cut);
+ from = bits;
+ end = from + L;
+ s = from;
+ while (s < end)
+ *to++ = *s++;
+
+ /* Then, pull all the bits down by 2 rows.
+ */
+ to = bits;
+ from = bits + (L * cut);
+ end = bits + (L * CHAR_ROWS);
+ s = from;
+ while (s < end)
+ *to++ = *s++;
+
+ /* And clear out the rest, for good measure.
+ */
+ from = bits + (L * (CHAR_ROWS - cut));
+ end = bits + (L * CHAR_ROWS);
+ s = from;
+ while (s < end)
+ *s++ = 0;
+
+ xi->height -= (cut * ch);
+ mp->real_char_rows -= cut;
+
+# if 0
+ /* Finally, pull the map indexes back to match the new bits.
+ */
+ for (i = 0; i < countof(matrix_encoding); i++)
+ if (matrix_encoding[i] > (CHAR_COLS * (CHAR_ROWS - cut)))
+ matrix_encoding[i] -= (cut * CHAR_COLS);
+# endif
+}
+
+
+static void
+load_textures (ModeInfo *mi, Bool flip_p)
+{
+ matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+ XImage *xi;
+ int x, y;
+ int cw, ch;
+ int orig_w, orig_h;
+
+ /* The Matrix image is 512x598 -- but GL texture sizes must be powers of 2.
+ So we waste some padding rows to round up.
+ */
+ xi = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
+ matrix3_png, sizeof(matrix3_png));
+ orig_w = xi->width;
+ orig_h = xi->height;
+ mp->real_char_rows = CHAR_ROWS;
+ spank_image (mp, xi);
+
+ if (xi->height != 512 && xi->height != 1024)
+ {
+ xi->height = (xi->height < 512 ? 512 : 1024);
+ xi->data = realloc (xi->data, xi->height * xi->bytes_per_line);
+ if (!xi->data)
+ {
+ fprintf(stderr, "%s: out of memory\n", progname);
+ exit(1);
+ }
+ }
+
+ if (xi->width != 512) abort();
+ if (xi->height != 512 && xi->height != 1024) abort();
+
+ /* char size in pixels */
+ cw = orig_w / CHAR_COLS;
+ ch = orig_h / CHAR_ROWS;
+
+ /* char size in ratio of final (padded) texture size */
+ mp->tex_char_width = (GLfloat) cw / xi->width;
+ mp->tex_char_height = (GLfloat) ch / xi->height;
+
+ /* Flip each character's bits horizontally -- we could also just do this
+ by reversing the texture coordinates on the quads, but on some systems
+ that slows things down a lot.
+ */
+ if (flip_p)
+ {
+ int xx, col;
+ unsigned long buf[100];
+ for (y = 0; y < xi->height; y++)
+ for (col = 0, xx = 0; col < CHAR_COLS; col++, xx += cw)
+ {
+ for (x = 0; x < cw; x++)
+ buf[x] = XGetPixel (xi, xx+x, y);
+ for (x = 0; x < cw; x++)
+ XPutPixel (xi, xx+x, y, buf[cw-x-1]);
+ }
+ }
+
+ /* The pixmap is a color image with no transparency. Set the texture's
+ alpha to be the green channel, and set the green channel to be 100%.
+ */
+ {
+ int rpos, gpos, bpos, apos; /* bitfield positions */
+#if 0
+ /* #### Cherub says that the little-endian case must be taken on MacOSX,
+ or else the colors/alpha are the wrong way around. How can
+ that be the case?
+ */
+ if (bigendian())
+ rpos = 24, gpos = 16, bpos = 8, apos = 0;
+ else
+#endif
+ rpos = 0, gpos = 8, bpos = 16, apos = 24;
+
+ for (y = 0; y < xi->height; y++)
+ for (x = 0; x < xi->width; x++)
+ {
+ unsigned long p = XGetPixel (xi, x, y);
+ unsigned char r = (p >> rpos) & 0xFF;
+ unsigned char g = (p >> gpos) & 0xFF;
+ unsigned char b = (p >> bpos) & 0xFF;
+ unsigned char a = g;
+ g = 0xFF;
+ p = (r << rpos) | (g << gpos) | (b << bpos) | (a << apos);
+ XPutPixel (xi, x, y, p);
+ }
+ }
+
+ /* Now load the texture into GL.
+ */
+ clear_gl_error();
+ glGenTextures (1, &mp->texture);
+
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+ /* messes up -fps */
+ /* glPixelStorei (GL_UNPACK_ROW_LENGTH, xi->width);*/
+ glBindTexture (GL_TEXTURE_2D, mp->texture);
+ check_gl_error ("texture init");
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, xi->width, xi->height, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, xi->data);
+ {
+ char buf[255];
+ sprintf (buf, "creating %dx%d texture:", xi->width, xi->height);
+ check_gl_error (buf);
+ }
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ /* I'd expect CLAMP to be the thing to do here, but oddly, we get a
+ faint solid green border around the texture if it is *not* REPEAT!
+ */
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+ glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+ check_gl_error ("texture param");
+
+ XDestroyImage (xi);
+}
+
+
+ENTRYPOINT void
+init_matrix (ModeInfo *mi)
+{
+ matrix_configuration *mp;
+ int wire = MI_IS_WIREFRAME(mi);
+ Bool flip_p = 0;
+ int i;
+
+ if (wire)
+ do_texture = False;
+
+ MI_INIT (mi, mps);
+
+ mp = &mps[MI_SCREEN(mi)];
+ mp->glx_context = init_GL(mi);
+
+ if (!mode_str || !*mode_str || !strcasecmp(mode_str, "matrix"))
+ {
+ flip_p = 1;
+ mp->glyph_map = matrix_encoding;
+ mp->nglyphs = countof(matrix_encoding);
+ }
+ else if (!strcasecmp (mode_str, "dna"))
+ {
+ flip_p = 0;
+ mp->glyph_map = dna_encoding;
+ mp->nglyphs = countof(dna_encoding);
+ }
+ else if (!strcasecmp (mode_str, "bin") ||
+ !strcasecmp (mode_str, "binary"))
+ {
+ flip_p = 0;
+ mp->glyph_map = binary_encoding;
+ mp->nglyphs = countof(binary_encoding);
+ }
+ else if (!strcasecmp (mode_str, "hex") ||
+ !strcasecmp (mode_str, "hexadecimal"))
+ {
+ flip_p = 0;
+ mp->glyph_map = hex_encoding;
+ mp->nglyphs = countof(hex_encoding);
+ }
+ else if (!strcasecmp (mode_str, "dec") ||
+ !strcasecmp (mode_str, "decimal"))
+ {
+ flip_p = 0;
+ mp->glyph_map = decimal_encoding;
+ mp->nglyphs = countof(decimal_encoding);
+ }
+ else
+ {
+ fprintf (stderr,
+ "%s: `mode' must be matrix, dna, binary, or hex: not `%s'\n",
+ progname, mode_str);
+ exit (1);
+ }
+
+ reshape_matrix (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ glShadeModel(GL_SMOOTH);
+
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_CULL_FACE);
+ glEnable(GL_NORMALIZE);
+
+ if (do_texture)
+ load_textures (mi, flip_p);
+
+ /* to scale coverage-percent to strips, this number looks about right... */
+ mp->nstrips = (int) (density * 2.2);
+ if (mp->nstrips < 1) mp->nstrips = 1;
+ else if (mp->nstrips > 2000) mp->nstrips = 2000;
+
+
+ mp->strips = calloc (mp->nstrips, sizeof(strip));
+ for (i = 0; i < mp->nstrips; i++)
+ {
+ strip *s = &mp->strips[i];
+ reset_strip (mi, s);
+
+ /* If we start all strips from zero at once, then the first few seconds
+ of the animation are much denser than normal. So instead, set all
+ the initial strips to erase-mode with random starting positions.
+ As these die off at random speeds and are re-created, we'll get a
+ more consistent density. */
+ s->erasing_p = True;
+ s->spinner_y = frand(GRID_SIZE);
+ memset (s->glyphs, 0, sizeof(s->glyphs)); /* no visible glyphs */
+ }
+
+ /* Compute the brightness ramp.
+ */
+ for (i = 0; i < WAVE_SIZE; i++)
+ {
+ GLfloat j = ((WAVE_SIZE - i) / (GLfloat) (WAVE_SIZE - 1));
+ j *= (M_PI / 2); /* j ranges from 0.0 - PI/2 */
+ j = sin (j); /* j ranges from 0.0 - 1.0 */
+ j = 0.2 + (j * 0.8); /* j ranges from 0.2 - 1.0 */
+ mp->brightness_ramp[i] = j;
+ /* printf("%2d %8.2f\n", i, j); */
+ }
+
+
+ auto_track_init (mi);
+}
+
+
+#ifdef DEBUG
+
+static void
+draw_grid (ModeInfo *mi)
+{
+ if (!MI_IS_WIREFRAME(mi))
+ {
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_BLEND);
+ }
+ glPushMatrix();
+
+ glColor3f(1, 1, 1);
+ glBegin(GL_LINES);
+ glVertex3f(-GRID_SIZE, 0, 0); glVertex3f(GRID_SIZE, 0, 0);
+ glVertex3f(0, -GRID_SIZE, 0); glVertex3f(0, GRID_SIZE, 0);
+ glEnd();
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, 0);
+ glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, 0);
+ glVertex3f( GRID_SIZE/2, GRID_SIZE/2, 0);
+ glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, 0);
+ glEnd();
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
+ glEnd();
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
+ glEnd();
+ glBegin(GL_LINES);
+ glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, GRID_DEPTH/2);
+ glVertex3f( GRID_SIZE/2, GRID_SIZE/2, GRID_DEPTH/2);
+ glEnd();
+ glPopMatrix();
+ if (!MI_IS_WIREFRAME(mi))
+ {
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ }
+}
+#endif /* DEBUG */
+
+
+ENTRYPOINT void
+draw_matrix (ModeInfo *mi)
+{
+ matrix_configuration *mp = &mps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i;
+
+ if (!mp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(mp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ if (do_texture)
+ {
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+
+ /* Jeff Epler points out:
+ By using GL_ONE instead of GL_SRC_ONE_MINUS_ALPHA, glyphs are
+ added to each other, so that a bright glyph with a darker one
+ in front is a little brighter than the bright glyph alone.
+ */
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE);
+ }
+
+ if (do_rotate)
+ {
+ glRotatef (mp->view_x, 1, 0, 0);
+ glRotatef (mp->view_y, 0, 1, 0);
+ }
+
+#ifdef DEBUG
+# if 0
+ glScalef(0.5, 0.5, 0.5);
+# endif
+# if 0
+ glRotatef(-30, 0, 1, 0);
+# endif
+ draw_grid (mi);
+#endif
+
+ mi->polygon_count = 0;
+
+ /* Render (and tick) each strip, starting at the back
+ (draw the ones farthest from the camera first, to make
+ the alpha transparency work out right.)
+ */
+ {
+ strip **sorted = malloc (mp->nstrips * sizeof(*sorted));
+ for (i = 0; i < mp->nstrips; i++)
+ sorted[i] = &mp->strips[i];
+ qsort (sorted, i, sizeof(*sorted), cmp_strips);
+
+ for (i = 0; i < mp->nstrips; i++)
+ {
+ strip *s = sorted[i];
+ tick_strip (mi, s);
+ draw_strip (mi, s);
+ }
+ free (sorted);
+ }
+
+ auto_track (mi);
+
+#if 0
+ glBegin(GL_QUADS);
+ glColor3f(1,1,1);
+ glTexCoord2f (0,0); glVertex3f(-15,-15,0);
+ glTexCoord2f (0,1); glVertex3f(-15,15,0);
+ glTexCoord2f (1,1); glVertex3f(15,15,0);
+ glTexCoord2f (1,0); glVertex3f(15,-15,0);
+ glEnd();
+#endif
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("GLMatrix", glmatrix, matrix)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/glmatrix.man b/hacks/glx/glmatrix.man
new file mode 100644
index 0000000..9290290
--- /dev/null
+++ b/hacks/glx/glmatrix.man
@@ -0,0 +1,116 @@
+.TH XScreenSaver 1 "30-Oct-99" "X Version 11"
+.SH NAME
+glmatrix - simulates the title sequence effect of the movie
+.SH SYNOPSIS
+.B glmatrix
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP]
+[\-delay \fIusecs\fP]
+[\-speed \fIratio\fP]
+[\-density \fIpct\fP]
+[\-no\-fog]
+[\-no\-waves]
+[\-no\-rotate]
+[\-binary]
+[\-hexadecimal]
+[\-dna]
+[\-clock]
+[\-timefmt \fIfmt\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+The \fIglmatrix\fP program draws the 3D "digital rain" effect, as seen
+in the title sequence of the Wachowski brothers' film, "The Matrix".
+
+Also see
+.BR xmatrix (MANSUFFIX)
+for a 2D rendering of the similar effect that appeared on the
+computer monitors actually \fIin\fP the movie.
+.SH OPTIONS
+.I glmatrix
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIusecs\fP
+The delay between frames of the animation, in microseconds: default 30000.
+.TP 8
+.B \-speed \fIratio\fP
+How fast the glyphs should move; default 1.0. 2.0 means twice as fast,
+0.5 means half as fast.
+.TP 8
+.B \-density \fIpercentage\fP
+The approximate percentage of the screen that should be filled with
+characters at any given time. Default 20%.
+.TP 8
+.B \-no\-fog
+By default, glyphs are dimmer the farther away they are. This
+argument disables that.
+.TP 8
+.B \-no\-waves
+By default, waves of color roll down the columns of glyphs. This
+argument disables that.
+.TP 8
+.B \-no-rotate\fP
+By default, the scene slowly tilts and rotates. This
+argument disables that.
+.TP 8
+.B \-binary\fP
+Instead of displaying Matrix glyphs, only display ones and zeros.
+.TP 8
+.B \-hexadecimal\fP
+Instead of displaying Matrix glyphs, display hexadecimal digits.
+.TP 8
+.B \-dna\fP
+Instead of displaying Matrix glyphs, display genetic code
+(guanine, adenine, thymine, and cytosine.)
+.TP 8
+.B \-clock\fP
+Hide a clock displaying the current time somewhere in the glyphs.
+.TP 8
+.B \-timefmt\fP \fIstrftime-string\fP
+How to format the clock when \fI\-clock\fP is specified.
+Default "\ %l%M%p\ ".
+.TP 8
+.B \-speed \fIratio\fP
+Less than 1 for slower, greater than 1 for faster. Default 1.
+.TP 8
+.B \-wireframe
+Just draw boxes instead of textured characters.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR xmatrix (MANSUFFIX),
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1999-2003 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 8-Jun-2003.
diff --git a/hacks/glx/glplanet.c b/hacks/glx/glplanet.c
new file mode 100644
index 0000000..f26a4ad
--- /dev/null
+++ b/hacks/glx/glplanet.c
@@ -0,0 +1,847 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* glplanet --- 3D rotating planet, e.g., Earth.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ *
+ * 10-Nov-14: jwz@jwz.org Night map. Better stars.
+ * 16-Jan-02: jwz@jwz.org gdk_pixbuf support.
+ * 21-Mar-01: jwz@jwz.org Broke sphere routine out into its own file.
+ *
+ * 9-Oct-98: dek@cgl.ucsf.edu Added stars.
+ *
+ * 8-Oct-98: jwz@jwz.org Made the 512x512x1 xearth image be built in.
+ * Made it possible to load XPM or XBM files.
+ * Made the planet bounce and roll around.
+ *
+ * 8-Oct-98: Released initial version of "glplanet"
+ * (David Konerding, dek@cgl.ucsf.edu)
+ */
+
+
+#ifdef STANDALONE
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*imageForeground: Green \n" \
+ "*imageBackground: Blue \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define release_planet 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL /* whole file */
+
+#include "sphere.h"
+
+#ifdef HAVE_XMU
+# ifndef VMS
+# include <X11/Xmu/Drawing.h>
+#else /* VMS */
+# include <Xmu/Drawing.h>
+# endif /* VMS */
+#endif
+
+#define DEF_ROTATE "True"
+#define DEF_ROLL "True"
+#define DEF_WANDER "True"
+#define DEF_SPIN "1.0"
+#define DEF_TEXTURE "True"
+#define DEF_STARS "True"
+#define DEF_RESOLUTION "128"
+#define DEF_IMAGE "BUILTIN"
+#define DEF_IMAGE2 "BUILTIN"
+
+#define BLENDED_TERMINATOR
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+static int do_rotate;
+static int do_roll;
+static int do_wander;
+static int do_texture;
+static int do_stars;
+static char *which_image;
+static char *which_image2;
+static int resolution;
+static GLfloat spin_arg;
+
+static XrmOptionDescRec opts[] = {
+ {"-rotate", ".rotate", XrmoptionNoArg, "true" },
+ {"+rotate", ".rotate", XrmoptionNoArg, "false" },
+ {"-roll", ".roll", XrmoptionNoArg, "true" },
+ {"+roll", ".roll", XrmoptionNoArg, "false" },
+ {"-wander", ".wander", XrmoptionNoArg, "true" },
+ {"+wander", ".wander", XrmoptionNoArg, "false" },
+ {"-texture", ".texture", XrmoptionNoArg, "true" },
+ {"+texture", ".texture", XrmoptionNoArg, "false" },
+ {"-stars", ".stars", XrmoptionNoArg, "true" },
+ {"+stars", ".stars", XrmoptionNoArg, "false" },
+ {"-spin", ".spin", XrmoptionSepArg, 0 },
+ {"-image", ".image", XrmoptionSepArg, 0 },
+ {"-image2", ".image2", XrmoptionSepArg, 0 },
+ {"-resolution", ".resolution", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_rotate, "rotate", "Rotate", DEF_ROTATE, t_Bool},
+ {&do_roll, "roll", "Roll", DEF_ROLL, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+ {&do_stars, "stars", "Stars", DEF_STARS, t_Bool},
+ {&spin_arg, "spin", "Spin", DEF_SPIN, t_Float},
+ {&which_image, "image", "Image", DEF_IMAGE, t_String},
+ {&which_image2,"image2", "Image", DEF_IMAGE2, t_String},
+ {&resolution, "resolution","Resolution", DEF_RESOLUTION, t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt planet_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct planet_description =
+{"planet", "init_planet", "draw_planet", NULL,
+ "draw_planet", "init_planet", "free_planet", &planet_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "Animates texture mapped sphere (planet)", 0, NULL};
+#endif
+
+#include "images/gen/earth_png.h"
+#include "images/gen/earth_night_png.h"
+
+#include "ximage-loader.h"
+#include "rotator.h"
+#include "gltrackball.h"
+
+
+/*-
+ * slices and stacks are used in the sphere parameterization routine.
+ * more slices and stacks will increase the quality of the sphere,
+ * at the expense of rendering speed
+ */
+
+/* structure for holding the planet data */
+typedef struct {
+ GLuint platelist;
+ GLuint shadowlist;
+ GLuint latlonglist;
+ GLuint starlist;
+ int starcount;
+ int screen_width, screen_height;
+ GLXContext *glx_context;
+ Window window;
+ GLfloat z;
+ GLfloat tilt;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+ GLuint tex1, tex2;
+ int draw_axis;
+
+} planetstruct;
+
+
+static planetstruct *planets = NULL;
+
+
+/* Set up and enable texturing on our object */
+static void
+setup_xpm_texture (ModeInfo *mi, const unsigned char *data, unsigned long size)
+{
+ XImage *image = image_data_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi),
+ data, size);
+ char buf[1024];
+ clear_gl_error();
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ /* iOS invalid enum:
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, image->width);
+ */
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ image->width, image->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, image->data);
+ sprintf (buf, "builtin texture (%dx%d)", image->width, image->height);
+ check_gl_error(buf);
+}
+
+
+static Bool
+setup_file_texture (ModeInfo *mi, char *filename)
+{
+ Display *dpy = mi->dpy;
+ Visual *visual = mi->xgwa.visual;
+ char buf[1024];
+
+ XImage *image = file_to_ximage (dpy, visual, filename);
+ if (!image) return False;
+
+ clear_gl_error();
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, image->width);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ image->width, image->height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, image->data);
+ sprintf (buf, "texture: %.100s (%dx%d)",
+ filename, image->width, image->height);
+ check_gl_error(buf);
+ return True;
+}
+
+
+static void
+setup_texture (ModeInfo * mi)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+
+ glGenTextures (1, &gp->tex1);
+ glBindTexture (GL_TEXTURE_2D, gp->tex1);
+
+ /* Must be after glBindTexture */
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ if (!which_image ||
+ !*which_image ||
+ !strcmp(which_image, "BUILTIN"))
+ {
+ BUILTIN1:
+ setup_xpm_texture (mi, earth_png, sizeof(earth_png));
+ }
+ else
+ {
+ if (! setup_file_texture (mi, which_image))
+ goto BUILTIN1;
+ }
+
+ check_gl_error("texture 1 initialization");
+
+ glGenTextures (1, &gp->tex2);
+ glBindTexture (GL_TEXTURE_2D, gp->tex2);
+
+ /* Must be after glBindTexture */
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ if (!which_image2 ||
+ !*which_image2 ||
+ !strcmp(which_image2, "BUILTIN"))
+ {
+ BUILTIN2:
+ setup_xpm_texture (mi, earth_night_png, sizeof(earth_night_png));
+ }
+ else
+ {
+ if (! setup_file_texture (mi, which_image2))
+ goto BUILTIN2;
+ }
+
+ check_gl_error("texture 2 initialization");
+
+ /* Need to flip the texture top for bottom for some reason. */
+ glMatrixMode (GL_TEXTURE);
+ glScalef (1, -1, 1);
+ glMatrixMode (GL_MODELVIEW);
+}
+
+
+static void
+init_stars (ModeInfo *mi)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+ int i, j;
+ int width = MI_WIDTH(mi);
+ int height = MI_HEIGHT(mi);
+ int size = (width > height ? width : height);
+ int nstars = size * size / 80;
+ int max_size = 3;
+ GLfloat inc = 0.5;
+ int steps = max_size / inc;
+ GLfloat scale = 1;
+
+ if (MI_WIDTH(mi) > 2560) { /* Retina displays */
+ scale *= 2;
+ nstars /= 2;
+ }
+
+ gp->starlist = glGenLists(1);
+ glNewList(gp->starlist, GL_COMPILE);
+ for (j = 1; j <= steps; j++)
+ {
+ glPointSize(inc * j * scale);
+ glBegin (GL_POINTS);
+ for (i = 0; i < nstars / steps; i++)
+ {
+ GLfloat d = 0.1;
+ GLfloat r = 0.15 + frand(0.3);
+ GLfloat g = r + frand(d) - d;
+ GLfloat b = r + frand(d) - d;
+
+ GLfloat x = frand(1)-0.5;
+ GLfloat y = frand(1)-0.5;
+ GLfloat z = ((random() & 1)
+ ? frand(1)-0.5
+ : (BELLRAND(1)-0.5)/12); /* milky way */
+ d = sqrt (x*x + y*y + z*z);
+ x /= d;
+ y /= d;
+ z /= d;
+ glColor3f (r, g, b);
+ glVertex3f (x, y, z);
+ gp->starcount++;
+ }
+ glEnd ();
+ }
+ glEndList ();
+
+ check_gl_error("stars initialization");
+}
+
+
+#ifdef BLENDED_TERMINATOR
+static void
+terminator_tube (ModeInfo *mi, int resolution)
+{
+ Bool wire = MI_IS_WIREFRAME(mi);
+ GLfloat th;
+ GLfloat step = M_PI*2 / resolution;
+ GLfloat thickness = 0.1; /* Dusk is about an hour wide. */
+ GLfloat c1[] = { 0, 0, 0, 1 };
+ GLfloat c2[] = { 0, 0, 0, 0 };
+
+ glPushMatrix();
+ if (wire)
+ {
+ c1[0] = c1[1] = 0.5;
+ c2[2] = 0.5;
+ glLineWidth (4);
+ }
+ glRotatef (90, 1, 0, 0);
+ glScalef (1.02, 1.02, 1.02);
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (th = 0; th < M_PI*2 + step; th += step)
+ {
+ GLfloat x = cos(th);
+ GLfloat y = sin(th);
+ glColor4fv (c1);
+ if (!do_texture)
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c1);
+ glNormal3f (x, y, 0);
+ glVertex3f (x, y, thickness);
+ glColor4fv (c2);
+ if (!do_texture)
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c2);
+ glVertex3f (x, y, -thickness);
+ }
+ glEnd();
+
+ /* There's a bit of a spike in the shading where the tube overlaps
+ the sphere, so extend the sphere a lot to try and avoid that. */
+# if 0 /* Nope, that doesn't help. */
+ glColor4fv (c1);
+ if (!do_texture)
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c1);
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (th = 0; th < M_PI*2 + step; th += step)
+ {
+ GLfloat x = cos(th);
+ GLfloat y = sin(th);
+ glNormal3f (x, y, 0);
+ glVertex3f (x, y, thickness);
+ glVertex3f (x, y, thickness + 10);
+ }
+ glEnd();
+
+ glColor4fv (c2);
+ if (!do_texture)
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c2);
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (th = 0; th < M_PI*2 + step; th += step)
+ {
+ GLfloat x = cos(th);
+ GLfloat y = sin(th);
+ glNormal3f (x, y, 0);
+ glVertex3f (x, y, -thickness);
+ glVertex3f (x, y, -thickness - 10);
+ }
+ glEnd();
+# endif /* 0 */
+
+ glPopMatrix();
+}
+#endif /* BLENDED_TERMINATOR */
+
+
+ENTRYPOINT void
+reshape_planet (ModeInfo *mi, int width, int height)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+
+ glXMakeCurrent(MI_DISPLAY(mi), gp->window, *(gp->glx_context));
+
+ glViewport(0, 0, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-1.0, 1.0, -h, h, 5.0, 200.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.0, 0.0, -40);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (h, h, h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+planet_handle_event (ModeInfo *mi, XEvent *event)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, gp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &gp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_planet (ModeInfo * mi)
+{
+ planetstruct *gp;
+ int screen = MI_SCREEN(mi);
+ Bool wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, planets);
+ gp = &planets[screen];
+
+ gp->window = MI_WINDOW(mi);
+
+ if ((gp->glx_context = init_GL(mi)) != NULL) {
+ reshape_planet(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+
+ {
+ char *f = get_string_resource(mi->dpy, "imageForeground", "Foreground");
+ char *b = get_string_resource(mi->dpy, "imageBackground", "Background");
+ char *s;
+ if (!f) f = strdup("white");
+ if (!b) b = strdup("black");
+
+ for (s = f + strlen(f)-1; s > f; s--)
+ if (*s == ' ' || *s == '\t')
+ *s = 0;
+ for (s = b + strlen(b)-1; s > b; s--)
+ if (*s == ' ' || *s == '\t')
+ *s = 0;
+
+ free (f);
+ free (b);
+ }
+
+ {
+ double spin_speed = 0.1;
+ double wander_speed = 0.005;
+ gp->rot = make_rotator (do_roll ? spin_speed : 0,
+ do_roll ? spin_speed : 0,
+ 0, 1,
+ do_wander ? wander_speed : 0,
+ True);
+ gp->z = frand (1.0);
+ gp->tilt = frand (23.4);
+ gp->trackball = gltrackball_init (True);
+ }
+
+ if (!wire && !do_texture)
+ {
+ GLfloat pos[4] = {1, 1, 1, 0};
+ GLfloat amb[4] = {0, 0, 0, 1};
+ GLfloat dif[4] = {1, 1, 1, 1};
+ GLfloat spc[4] = {0, 1, 1, 1};
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ if (wire)
+ do_texture = False;
+
+ if (do_texture)
+ setup_texture (mi);
+
+ if (do_stars)
+ init_stars (mi);
+
+ /* construct the polygons of the planet
+ */
+ gp->platelist = glGenLists(1);
+ glNewList (gp->platelist, GL_COMPILE);
+ glFrontFace(GL_CCW);
+ glPushMatrix();
+ glRotatef (90, 1, 0, 0);
+ unit_sphere (resolution, resolution, wire);
+ glPopMatrix();
+ glEndList();
+
+ gp->shadowlist = glGenLists(1);
+ glNewList (gp->shadowlist, GL_COMPILE);
+ glFrontFace(GL_CCW);
+
+ if (wire)
+ glColor4f (0.5, 0.5, 0, 1);
+# ifdef BLENDED_TERMINATOR
+ else
+ {
+ GLfloat c[] = { 0, 0, 0, 1 };
+ glColor4fv (c);
+ if (!do_texture)
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c);
+ }
+# endif
+
+ glPushMatrix();
+ glScalef (1.01, 1.01, 1.01);
+ unit_dome (resolution, resolution, wire);
+
+# ifdef BLENDED_TERMINATOR
+ terminator_tube (mi, resolution);
+ if (!wire)
+ {
+ /* We have to draw the transparent side of the mask too,
+ though I'm not sure why. */
+ GLfloat c[] = { 0, 0, 0, 0 };
+ glColor4fv (c);
+ if (!do_texture)
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c);
+ glRotatef (180, 1, 0, 0);
+ unit_dome (resolution, resolution, wire);
+ }
+# endif
+
+ glPopMatrix();
+ glEndList();
+
+ /* construct the polygons of the latitude/longitude/axis lines.
+ */
+ gp->latlonglist = glGenLists(1);
+ glNewList (gp->latlonglist, GL_COMPILE);
+ glPushMatrix ();
+ glRotatef (90, 1, 0, 0); /* unit_sphere is off by 90 */
+ glRotatef (8, 0, 1, 0); /* line up the time zones */
+ unit_sphere (12, 24, 1);
+ unit_sphere (12, 24, 1);
+ glBegin(GL_LINES);
+ glVertex3f(0, -2, 0);
+ glVertex3f(0, 2, 0);
+ glEnd();
+ glPopMatrix ();
+ glEndList();
+}
+
+
+ENTRYPOINT void
+draw_planet (ModeInfo * mi)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ double x, y, z;
+
+ if (!gp->glx_context)
+ return;
+
+ glDrawBuffer(GL_BACK);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glXMakeCurrent (dpy, window, *(gp->glx_context));
+
+ mi->polygon_count = 0;
+
+ if (gp->button_down_p)
+ gp->draw_axis = 60;
+ else if (!gp->draw_axis && !(random() % 1000))
+ gp->draw_axis = 60 + (random() % 90);
+
+ if (do_rotate && !gp->button_down_p)
+ {
+ gp->z -= 0.001 * spin_arg; /* the sun sets in the west */
+ if (gp->z < 0) gp->z += 1;
+ }
+
+ glEnable(GL_LINE_SMOOTH);
+ glEnable(GL_POINT_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+
+ glPushMatrix();
+
+ get_position (gp->rot, &x, &y, &z, !gp->button_down_p);
+ x = (x - 0.5) * 6;
+ y = (y - 0.5) * 6;
+ z = (z - 0.5) * 3;
+ glTranslatef(x, y, z);
+
+ gltrackball_rotate (gp->trackball);
+
+ if (do_roll)
+ {
+ get_rotation (gp->rot, &x, &y, 0, !gp->button_down_p);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ }
+ else
+ glRotatef (current_device_rotation(), 0, 0, 1);
+
+ if (do_stars)
+ {
+ glDisable(GL_TEXTURE_2D);
+ glPushMatrix();
+ glScalef (60, 60, 60);
+ glRotatef (90, 1, 0, 0);
+ glRotatef (35, 1, 0, 0);
+ glCallList (gp->starlist);
+ mi->polygon_count += gp->starcount;
+ glPopMatrix();
+ glClear(GL_DEPTH_BUFFER_BIT);
+ }
+
+ glRotatef (90, 1, 0, 0);
+ glRotatef (35, 1, 0, 0);
+ glRotatef (10, 0, 1, 0);
+ glRotatef (120, 0, 0, 1);
+
+ glScalef (3, 3, 3);
+
+# ifdef HAVE_MOBILE
+ glScalef (2, 2, 2);
+# endif
+
+ if (wire)
+ glColor3f (0, 0, 0.5);
+ else if (do_texture)
+ {
+ glColor4f (1, 1, 1, 1);
+ glEnable (GL_TEXTURE_2D);
+ glBindTexture (GL_TEXTURE_2D, gp->tex1);
+ }
+ else
+ {
+ GLfloat c[] = { 0, 0.5, 0, 1 };
+ glColor4fv (c);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c);
+ }
+
+ glPushMatrix();
+ glRotatef (gp->z * 360, 0, 0, 1);
+ glCallList (gp->platelist);
+ mi->polygon_count += resolution*resolution;
+ glPopMatrix();
+
+ if (wire)
+ {
+ glPushMatrix();
+ glRotatef (gp->tilt, 1, 0, 0);
+ glColor3f(1, 0, 0);
+ glLineWidth(4);
+ glCallList (gp->shadowlist);
+ glLineWidth(1);
+ mi->polygon_count += resolution*(resolution/2);
+ glPopMatrix();
+ }
+
+ else if (!do_texture || gp->tex2)
+ {
+ /* Originally we just used GL_LIGHT0 to produce the day/night sides of
+ the planet, but that always looked crappy, even with a vast number of
+ polygons, because the day/night terminator didn't exactly line up with
+ the polygon edges.
+ */
+
+#ifndef BLENDED_TERMINATOR
+
+ /* Method 1, use the depth buffer as a stencil.
+
+ - Draw the full "day" sphere;
+ - Clear the depth buffer;
+ - Draw a rotated/tilted half-sphere into the depth buffer only,
+ on the Eastern hemisphere, putting non-zero depth only on the
+ sunlit side;
+ - Draw the full "night" sphere, which will clip to dark parts only.
+
+ That lets us divide the sphere into the two maps, and the dividing
+ line can be at any angle, regardless of polygon layout.
+
+ The half-sphere is scaled slightly larger to avoid polygon fighting,
+ since those triangles won't exactly line up because of the rotation.
+
+ The downside of this is that the day/night terminator is 100% sharp.
+ */
+ glClear (GL_DEPTH_BUFFER_BIT);
+ glColorMask (0, 0, 0, 0);
+ glDisable (GL_TEXTURE_2D);
+ glPushMatrix();
+ glRotatef (gp->tilt, 1, 0, 0);
+ glScalef (1.01, 1.01, 1.01);
+ glCallList (gp->shadowlist); /* Fill in depth on sunlit side */
+ mi->polygon_count += resolution*(resolution/2);
+ glPopMatrix();
+ glColorMask (1, 1, 1, 1);
+
+ if (do_texture)
+ {
+ glEnable (GL_TEXTURE_2D);
+ glBindTexture (GL_TEXTURE_2D, gp->tex2);
+ }
+ else
+ {
+ GLfloat c[] = { 0, 0, 0.5, 1 };
+ glColor4fv (c);
+ if (! do_texture)
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c);
+ }
+
+ glPushMatrix();
+ glRotatef (gp->z * 360, 0, 0, 1);
+ glCallList (gp->platelist); /* Fill in color on night side */
+ mi->polygon_count += resolution*resolution;
+ glPopMatrix();
+
+#else /* BLENDED_TERMINATOR */
+
+ /* Method 2, use the alpha buffer as a stencil.
+ - Draw the full "day" sphere;
+ - Clear the depth buffer;
+ - Clear the alpha buffer;
+ - Draw a rotated/tilted half-sphere into the alpha buffer only,
+ on the Eastern hemisphere, putting non-zero alpha only on the
+ sunlit side;
+ - Also draw a fuzzy terminator ring into the alpha buffer;
+ - Clear the depth buffer again;
+ - Draw the full "night" sphere, which will blend to dark parts only.
+ */
+ glColorMask (0, 0, 0, 1);
+ glClear (GL_COLOR_BUFFER_BIT);
+ glClear (GL_DEPTH_BUFFER_BIT);
+ glDisable (GL_TEXTURE_2D);
+
+ glPushMatrix();
+ glRotatef (gp->tilt, 1, 0, 0);
+ glScalef (1.01, 1.01, 1.01);
+ glCallList (gp->shadowlist); /* Fill in alpha on sunlit side */
+ mi->polygon_count += resolution*(resolution/2);
+ glPopMatrix();
+
+ glClear (GL_DEPTH_BUFFER_BIT);
+
+ glColorMask (1, 1, 1, 1);
+ {
+ GLfloat c[] = { 1, 1, 1, 1 };
+ glColor4fv (c);
+ if (! do_texture)
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c);
+ }
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA);
+
+ if (do_texture)
+ {
+ glEnable (GL_TEXTURE_2D);
+ glBindTexture (GL_TEXTURE_2D, gp->tex2);
+ }
+ else
+ {
+ GLfloat c[] = { 0, 0, 0.5, 1 };
+ glColor4fv (c);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c);
+ glEnable (GL_LIGHTING);
+ }
+
+ glPushMatrix();
+ glRotatef (gp->z * 360, 0, 0, 1);
+ glCallList (gp->platelist); /* Fill in color on night side */
+ mi->polygon_count += resolution*resolution;
+ glPopMatrix();
+ glDisable (GL_BLEND);
+ glBlendFunc (GL_ONE, GL_ZERO);
+
+#endif /* BLENDED_TERMINATOR */
+ }
+
+ if (gp->draw_axis)
+ {
+ glPushMatrix();
+ glRotatef (gp->z * 360, 0.0, 0.0, 1.0);
+ glScalef (1.02, 1.02, 1.02);
+ glDisable (GL_TEXTURE_2D);
+ glDisable (GL_LIGHTING);
+ glDisable (GL_LINE_SMOOTH);
+ glColor3f (0.1, 0.3, 0.1);
+ glCallList (gp->latlonglist);
+ mi->polygon_count += 24*24;
+ glPopMatrix();
+ if (!wire && !do_texture)
+ glEnable (GL_LIGHTING);
+ if (gp->draw_axis) gp->draw_axis--;
+ }
+ glPopMatrix();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+ glXSwapBuffers(dpy, window);
+}
+
+
+ENTRYPOINT void
+free_planet (ModeInfo * mi)
+{
+ planetstruct *gp = &planets[MI_SCREEN(mi)];
+
+ if (gp->glx_context) {
+ glXMakeCurrent(MI_DISPLAY(mi), gp->window, *(gp->glx_context));
+
+ if (glIsList(gp->platelist))
+ glDeleteLists(gp->platelist, 1);
+ if (glIsList(gp->starlist))
+ glDeleteLists(gp->starlist, 1);
+ }
+}
+
+
+XSCREENSAVER_MODULE_2 ("GLPlanet", glplanet, planet)
+
+#endif
diff --git a/hacks/glx/glplanet.man b/hacks/glx/glplanet.man
new file mode 100644
index 0000000..6a62dc9
--- /dev/null
+++ b/hacks/glx/glplanet.man
@@ -0,0 +1,75 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+glplanet - rotating 3d texture-mapped planet.
+.SH SYNOPSIS
+.B glplanet
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-image \fIfile\fP]
+[\-image2 \fIfile\fP]
+[\-resolution \fInumber\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Draws a planet bouncing around in space. The built-in images are day and
+night maps of the Earth, but you can wrap any Equirectangular-projected
+map onto the sphere, e.g., the planetary textures included
+with \fIssystem.\fP
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-image \fIfile\fP
+The day texture map to wrap around the planet's surface.
+.TP 8
+.B \-image2 \fIfile\fP
+The night texture map to wrap around the planet's surface.
+The two will be blended together at the dusk terminator.
+.TP 8
+.B \-resolution
+The resolution of the planetary mesh. Default: 128.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR dymaxionmap (1)
+.BR ssystem (1)
+.SH COPYRIGHT
+Copyright \(co 2002-2018 by David Konerding and Jamie Zawinski.
+Permission to use, copy, modify, distribute, and sell this software
+and its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+David Konerding and Jamie Zawinski.
diff --git a/hacks/glx/glschool.c b/hacks/glx/glschool.c
new file mode 100644
index 0000000..49cfc11
--- /dev/null
+++ b/hacks/glx/glschool.c
@@ -0,0 +1,216 @@
+/* glschool.c, Copyright (c) 2005-2006 David C. Lambert <dcl@panix.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+#include "xlockmore.h"
+#include "glschool.h"
+
+#define sws_opts xlockmore_opts
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+#define free_glschool (0)
+#define release_glschool (0)
+#define glschool_handle_event (xlockmore_no_events)
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define DEF_NFISH "100"
+#define DEF_FOG "False"
+#define DEF_DRAWBBOX "True"
+#define DEF_DRAWGOAL "False"
+#define DEF_GOALCHGF "50"
+#define DEF_MAXVEL "7.0"
+#define DEF_MINVEL "1.0"
+#define DEF_ACCLIMIT "8.0"
+#define DEF_DISTEXP "2.2"
+#define DEF_AVOIDFACT "1.5"
+#define DEF_MATCHFACT "0.15"
+#define DEF_CENTERFACT "0.1"
+#define DEF_TARGETFACT "80"
+#define DEF_MINRADIUS "30.0"
+#define DEF_MOMENTUM "0.9"
+#define DEF_DISTCOMP "10.0"
+
+static int NFish;
+static Bool DoFog;
+static Bool DoDrawBBox;
+static Bool DoDrawGoal;
+static int GoalChgFreq;
+static float MinVel;
+static float MaxVel;
+static float DistExp;
+static float AccLimit;
+static float AvoidFact;
+static float MatchFact;
+static float TargetFact;
+static float CenterFact;
+static float MinRadius;
+static float Momentum;
+static float DistComp;
+
+static XrmOptionDescRec opts[] = {
+ { "-nfish", ".nfish", XrmoptionSepArg, 0 },
+ { "-fog", ".fog", XrmoptionNoArg, "True" },
+ { "+fog", ".fog", XrmoptionNoArg, "False" },
+ { "-drawgoal", ".drawgoal", XrmoptionNoArg, "True" },
+ { "+drawgoal", ".drawgoal", XrmoptionNoArg, "False" },
+ { "-drawbbox", ".drawbbox", XrmoptionNoArg, "True" },
+ { "+drawbbox", ".drawbbox", XrmoptionNoArg, "False" },
+ { "-goalchgf", ".goalchgf", XrmoptionSepArg, 0 },
+ { "-maxvel", ".maxvel", XrmoptionSepArg, 0 },
+ { "-minvel", ".minvel", XrmoptionSepArg, 0 },
+ { "-acclimit", ".acclimit", XrmoptionSepArg, 0 },
+ { "-distexp", ".distexp", XrmoptionSepArg, 0 },
+ { "-avoidfact", ".avoidfact", XrmoptionSepArg, 0 },
+ { "-matchfact", ".matchfact", XrmoptionSepArg, 0 },
+ { "-centerfact",".centerfact", XrmoptionSepArg, 0 },
+ { "-targetfact",".targetfact", XrmoptionSepArg, 0 },
+ { "-minradius", ".minradius", XrmoptionSepArg, 0 },
+ { "-distcomp", ".distcomp", XrmoptionSepArg, 0 },
+ { "-momentum", ".momentum", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&NFish, "nfish", "NFish", DEF_NFISH, t_Int},
+ {&DoFog, "fog", "DoFog", DEF_FOG, t_Bool},
+ {&DoDrawBBox, "drawbbox", "DoDrawBBox", DEF_DRAWBBOX, t_Bool},
+ {&DoDrawGoal, "drawgoal", "DoDrawGoal", DEF_DRAWGOAL, t_Bool},
+ {&GoalChgFreq, "goalchgf", "GoalChgFreq", DEF_GOALCHGF, t_Int},
+ {&MaxVel, "maxvel", "MaxVel", DEF_MAXVEL, t_Float},
+ {&MinVel, "minvel", "MinVel", DEF_MINVEL, t_Float},
+ {&AccLimit, "acclimit", "AccLimit", DEF_ACCLIMIT, t_Float},
+ {&DistExp, "distexp", "DistExp", DEF_DISTEXP, t_Float},
+ {&AvoidFact, "avoidfact", "AvoidFact", DEF_AVOIDFACT, t_Float},
+ {&MatchFact, "matchfact", "MatchFact", DEF_MATCHFACT, t_Float},
+ {&CenterFact, "centerfact", "CenterFact", DEF_CENTERFACT, t_Float},
+ {&TargetFact, "targetfact", "TargetFact", DEF_TARGETFACT, t_Float},
+ {&MinRadius, "minradius", "MinRadius", DEF_MINRADIUS, t_Float},
+ {&Momentum, "momentum", "Momentum", DEF_MOMENTUM, t_Float},
+ {&DistComp, "distcomp", "DistComp", DEF_DISTCOMP, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt glschool_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+typedef struct {
+ int nColors;
+ int rotCounter;
+ int goalCounter;
+ Bool drawGoal;
+ Bool drawBBox;
+ GLuint bboxList;
+ GLuint goalList;
+ GLuint fishList;
+ int fish_polys, box_polys;
+ XColor *colors;
+ School *school;
+ GLXContext *context;
+} glschool_configuration;
+
+static glschool_configuration *scs = NULL;
+
+ENTRYPOINT void
+reshape_glschool(ModeInfo *mi, int width, int height)
+{
+ Bool wire = MI_IS_WIREFRAME(mi);
+ double aspect = (double)width/(double)height;
+ glschool_configuration *sc = &scs[MI_SCREEN(mi)];
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(sc->context));
+ if (sc->school != (School *)0) {
+ glschool_setBBox(sc->school, -aspect*160, aspect*160, -130, 130, -450, -50.0);
+ glDeleteLists(sc->bboxList, 1);
+ glschool_createBBoxList(&SCHOOL_BBOX(sc->school),
+ &sc->bboxList, wire);
+ }
+ glschool_reshape(width, height);
+}
+
+ENTRYPOINT void
+init_glschool(ModeInfo *mi)
+{
+ int width = MI_WIDTH(mi);
+ int height = MI_HEIGHT(mi);
+ Bool wire = MI_IS_WIREFRAME(mi);
+ glschool_configuration *sc;
+
+ MI_INIT (mi, scs);
+ sc = &scs[MI_SCREEN(mi)];
+
+ sc->drawGoal = DoDrawGoal;
+ sc->drawBBox = DoDrawBBox;
+
+ sc->nColors = 360;
+ sc->context = init_GL(mi);
+ sc->colors = (XColor *)calloc(sc->nColors, sizeof(XColor));
+ make_color_ramp(0, 0, 0,
+ 0.0, 1.0, 1.0,
+ 359.0, 1.0, 1.0,
+ sc->colors, &sc->nColors,
+ False, 0, False);
+
+ sc->school = glschool_initSchool(NFish, AccLimit, MaxVel, MinVel, DistExp, Momentum,
+ MinRadius, AvoidFact, MatchFact, CenterFact, TargetFact,
+ DistComp);
+ if (sc->school == (School *)0) {
+ fprintf(stderr, "couldn't initialize TheSchool, exiting\n");
+ exit(1);
+ }
+
+ reshape_glschool(mi, width, height);
+
+ glschool_initGLEnv(DoFog);
+ glschool_initFishes(sc->school);
+ glschool_createDrawLists(&SCHOOL_BBOX(sc->school),
+ &sc->bboxList, &sc->goalList, &sc->fishList,
+ &sc->fish_polys, &sc->box_polys, wire);
+ glschool_computeAccelerations(sc->school);
+}
+
+ENTRYPOINT void
+draw_glschool(ModeInfo *mi)
+{
+ Window window = MI_WINDOW(mi);
+ Display *dpy = MI_DISPLAY(mi);
+ glschool_configuration *sc = &scs[MI_SCREEN(mi)];
+
+ if (!sc->context) {
+ fprintf(stderr, "no context\n");
+ return;
+ }
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(sc->context));
+
+ mi->polygon_count = 0;
+
+ if ((sc->goalCounter % GoalChgFreq) == 0)
+ glschool_newGoal(sc->school);
+ sc->goalCounter++;
+
+ sc->rotCounter++;
+ sc->rotCounter = (sc->rotCounter%360);
+
+ glschool_applyMovements(sc->school);
+ glschool_drawSchool(sc->colors, sc->school, sc->bboxList,
+ sc->goalList, sc->fishList, sc->rotCounter,
+ sc->drawGoal, sc->drawBBox,
+ sc->fish_polys, sc->box_polys,
+ &mi->polygon_count);
+ glschool_computeAccelerations(sc->school);
+
+ if (mi->fps_p)
+ do_fps(mi);
+
+ glFinish();
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE("GLSchool", glschool)
diff --git a/hacks/glx/glschool.h b/hacks/glx/glschool.h
new file mode 100644
index 0000000..b6ce7d5
--- /dev/null
+++ b/hacks/glx/glschool.h
@@ -0,0 +1,17 @@
+/* glschool.h, Copyright (c) 2005-2006 David C. Lambert <dcl@panix.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+#ifndef __GLSCHOOL_H__
+#define __GLSCHOOL_H__
+
+#include "glschool_alg.h"
+#include "glschool_gl.h"
+
+#endif /* __GLSCHOOL_H__ */
diff --git a/hacks/glx/glschool.man b/hacks/glx/glschool.man
new file mode 100644
index 0000000..8de00c4
--- /dev/null
+++ b/hacks/glx/glschool.man
@@ -0,0 +1,126 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+glschool - a 3D schooling simulation
+.SH SYNOPSIS
+.B glschool
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-wireframe]
+[\-fps]
+[\-delay \fInumber\fP]
+[\-nfish \fInumber\fP]
+[\-maxvel \fInumber\fP]
+[\-minvel \fInumber\fP]
+[\-acclimit \fInumber\fP]
+[\-avoidfact \fInumber\fP]
+[\-matchfact \fInumber\fP]
+[\-centerfact \fInumber\fP]
+[\-targetfact \fInumber\fP]
+[\-minradius \fInumber\fP]
+[\-momentum \fInumber\fP]
+[\-distexp \fInumber\fP]
+[\-goalchgf \fInumber\fP]
+[\-fog]
+[\-drawgoal]
+[\-drawbbox]
+.SH DESCRIPTION
+Uses Craig Reynolds Boids algorithm to simulate a 3d school of
+fish. See <http://www.red3d.com/cwr/boids> for a description
+of the algorithm and the original paper. This is a lightly modified
+version of the algorithm that supports goal attraction.
+
+Many different behaviors are possible by tweaking the parameters. No sanity checking is performed
+on the command line params, so if you want to use negative accelerations or minimum velocity that is
+larger than maximum velocity or that sort of thing, the simulation will try to digest it.
+
+It looks best with the highest number of fish that will give you an FPS of > 25 or so.
+
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.020 seconds.).
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-fog | \-no-fog
+ Whether to show foggy (cloudy) water.
+.TP 8
+.B \-drawgoal | \-no-drawgoal
+ Whether to show the school's attraction goal.
+.TP 8
+.B \-drawbbox | \-no-drawbbox
+ Whether to show the bounding box.
+.TP 8
+.B \-fog | \-no-fog
+ Whether to show foggy (cloudy) water.
+.TP 8
+.B \-nfish \fInumber\fP
+Number of fish. Defaults to 100
+.TP 8
+.B \-acclimit \fInumber\fP
+Acceleration limit. Defaults to 8.0
+.TP 8
+.B \-minvel \fInumber\fP
+Minimum velocity. Defaults to 1.0
+.TP 8
+.B \-maxvel \fInumber\fP
+Minimum velocity. Defaults to 7.0
+.TP 8
+.B \-goalchgf \fInumber\fP
+Goal change frequency. Defaults to 50 (frames)
+.TP 8
+.B \-avoidfact \fInumber\fP
+Avoidance acceleration factor. Defaults to 1.5
+.TP 8
+.B \-matchfact \fInumber\fP
+Match avg velocity acceleration factor. Defaults to 0.15
+.TP 8
+.B \-centerfact \fInumber\fP
+School centering acceleration factor. Defaults to 0.1
+.TP 8
+.B \-targetfact \fInumber\fP
+Target attraction acceleration factor. Defaults to 80
+.TP 8
+.B \-distexp \fInumber\fP
+Distance weighting exponent. Defaults to 2.2
+.TP 8
+.B \-momentum \fInumber\fP
+Momentum. Defaults to 0.9
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2005-2006 by David C. Lambert. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+David C. Lambert
diff --git a/hacks/glx/glschool_alg.c b/hacks/glx/glschool_alg.c
new file mode 100644
index 0000000..32b4a5f
--- /dev/null
+++ b/hacks/glx/glschool_alg.c
@@ -0,0 +1,364 @@
+/* school_alg.c, Copyright (c) 2005-2006 David C. Lambert <dcl@panix.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "yarandom.h"
+#include "glschool_alg.h"
+
+/* for xscreensaver */
+#undef drand48
+#define drand48() frand(1.0)
+
+#define RAD2DEG (180.0/3.1415926535)
+
+
+static inline double
+norm(double *dv)
+{
+ return sqrt(dv[0]*dv[0] + dv[1]*dv[1] + dv[2]*dv[2]);
+}
+
+
+static inline void
+addVector(double *v, double *d)
+{
+ v[0] += d[0];
+ v[1] += d[1];
+ v[2] += d[2];
+}
+
+
+static inline void
+clearVector(double *v)
+{
+ v[0] = v[1] = v[2] = 0.0;
+}
+
+
+static inline void
+scaleVector(double *v, double s)
+{
+ v[0] *= s;
+ v[1] *= s;
+ v[2] *= s;
+}
+
+
+static inline void
+addScaledVector(double *v, double *d, double s)
+{
+ v[0] += d[0]*s;
+ v[1] += d[1]*s;
+ v[2] += d[2]*s;
+}
+
+
+static inline void
+getDifferenceVector(double *v0, double *v1, double *diff)
+{
+ diff[0] = v0[0] - v1[0];
+ diff[1] = v0[1] - v1[1];
+ diff[2] = v0[2] - v1[2];
+}
+
+
+void
+glschool_initFish(Fish *f, double *mins, double *ranges)
+{
+ int i;
+
+ for(i = 0; i < 3; i++) {
+ FISH_IPOS(f, i) = mins[i] + drand48()*ranges[i];
+ FISH_IACC(f, i) = 0.0;
+ FISH_IVEL(f, i) = drand48();
+ FISH_IMAGIC(f, i) = 0.70 + 0.60*drand48();
+ FISH_IOLDVEL(f, i) = 0.0;
+ }
+}
+
+
+void
+glschool_initFishes(School *s)
+{
+ int i;
+ Fish *f = (Fish *)0;
+ int nFish = SCHOOL_NFISH(s);
+ BBox *bbox = &SCHOOL_BBOX(s);
+ double *mins = BBOX_MINS(bbox);
+ double *ranges = SCHOOL_BBRANGES(s);
+ Fish *theFishes = SCHOOL_FISHES(s);
+
+ for(i = 0, f = theFishes; i < nFish; i++, f++)
+ glschool_initFish(f, mins, ranges);
+}
+
+
+static void
+applyFishMovements(Fish *f, BBox *bbox, double minVel, double maxVel, double momentum)
+{
+ int i;
+ int oob = 0;
+ double vMag = 0.0;
+
+ for(i = 0; i < 3; i++) {
+ double pos = FISH_IPOS(f, i);
+ oob = (pos > BBOX_IMAX(bbox, i) || pos < BBOX_IMIN(bbox, i));
+ if (oob == 0) FISH_IVEL(f, i) += FISH_IACC(f, i) * FISH_IMAGIC(f, i);
+ vMag += (FISH_IVEL(f, i) * FISH_IVEL(f, i));
+ }
+ vMag = sqrt(vMag);
+
+ if (vMag > maxVel)
+ scaleVector(FISH_VEL(f), maxVel/vMag);
+ else if (vMag < minVel)
+ scaleVector(FISH_VEL(f), minVel/vMag);
+
+ for(i = 0; i < 3; i++) {
+ FISH_IVEL(f, i) = momentum * FISH_IOLDVEL(f, i) + (1.0-momentum) * FISH_IVEL(f, i);
+ FISH_IPOS(f, i) += FISH_IVEL(f, i);
+ FISH_IOLDVEL(f, i) = FISH_IVEL(f, i);
+
+ if (FISH_IPOS(f, i) < BBOX_IMIN(bbox, i))
+ FISH_IPOS(f, i) = BBOX_IMAX(bbox, i);
+ else if (FISH_IPOS(f, i) > BBOX_IMAX(bbox, i))
+ FISH_IPOS(f, i) = BBOX_IMIN(bbox, i);
+ }
+}
+
+
+void
+glschool_applyMovements(School *s)
+{
+ int i = 0;
+ Fish *f = (Fish *)0;
+ int nFish = SCHOOL_NFISH(s);
+ double minVel = SCHOOL_MINVEL(s);
+ double maxVel = SCHOOL_MAXVEL(s);
+ double momentum = SCHOOL_MOMENTUM(s);
+ BBox *bbox = &SCHOOL_BBOX(s);
+ Fish *theFishes = SCHOOL_FISHES(s);
+
+ for(i = 0, f = theFishes; i < nFish; i++, f++)
+ applyFishMovements(f, bbox, minVel, maxVel, momentum);
+}
+
+
+School *
+glschool_initSchool(int nFish, double accLimit, double maxV, double minV, double distExp, double momentum,
+ double minRadius, double avoidFact, double matchFact, double centerFact, double targetFact,
+ double distComp)
+{
+ School *s = (School *)0;
+
+ if ((s = (School *)malloc(sizeof(School))) == (School *)0) {
+ perror("initSchool School allocation failed: ");
+ return s;
+ }
+
+ if ((SCHOOL_FISHES(s) = (Fish *)malloc(sizeof(Fish)*nFish)) == (Fish *)0) {
+ perror("initSchool Fish array allocation failed: ");
+ free(s);
+ return (School *)0;
+ }
+
+ SCHOOL_NFISH(s) = nFish;
+ SCHOOL_ACCLIMIT(s) = accLimit;
+ SCHOOL_MAXVEL(s) = maxV;
+ SCHOOL_MINVEL(s) = minV;
+ SCHOOL_DISTEXP(s) = distExp;
+ SCHOOL_MOMENTUM(s) = momentum;
+ SCHOOL_MINRADIUS(s) = minRadius;
+ SCHOOL_MINRADIUSEXP(s) = pow(minRadius, distExp);
+ SCHOOL_MATCHFACT(s) = matchFact;
+ SCHOOL_AVOIDFACT(s) = avoidFact;
+ SCHOOL_CENTERFACT(s) = centerFact;
+ SCHOOL_TARGETFACT(s) = targetFact;
+ SCHOOL_DISTCOMP(s) = distComp;
+
+ return s;
+}
+
+void
+glschool_freeSchool(School *s)
+{
+ free(SCHOOL_FISHES(s));
+ free(s);
+}
+
+void
+glschool_setBBox(School *s, double xMin, double xMax, double yMin, double yMax, double zMin, double zMax)
+{
+ int i;
+ BBox *bbox = &SCHOOL_BBOX(s);
+
+ BBOX_XMIN(bbox) = xMin; BBOX_XMAX(bbox) = xMax;
+ BBOX_YMIN(bbox) = yMin; BBOX_YMAX(bbox) = yMax;
+ BBOX_ZMIN(bbox) = zMin; BBOX_ZMAX(bbox) = zMax;
+
+ for(i = 0; i < 3; i++) {
+ SCHOOL_IMID(s, i) = BBOX_IMID(bbox, i);
+ SCHOOL_IRANGE(s, i) = BBOX_IRANGE(bbox, i);
+ }
+}
+
+
+void
+glschool_newGoal(School *s)
+{
+ SCHOOL_IGOAL(s,0) = 0.85*(drand48()-0.5)*SCHOOL_IRANGE(s,0) + SCHOOL_IMID(s,0);
+ SCHOOL_IGOAL(s,1) = 0.40*(drand48()-0.5)*SCHOOL_IRANGE(s,1) + SCHOOL_IMID(s,1);
+ SCHOOL_IGOAL(s,2) = 0.85*(drand48()-0.5)*SCHOOL_IRANGE(s,2) + SCHOOL_IMID(s,2);
+}
+
+
+double
+glschool_computeNormalAndThetaToPlusZ(double *v, double *xV)
+{
+ double x1 = 0.0;
+ double y1 = 0.0;
+ double z1 = 1.0;
+ double x2 = v[0];
+ double y2 = v[1];
+ double z2 = v[2];
+ double theta = 0.0;
+ double xVNorm = 0.0;
+ double sinTheta = 0.0;
+ double v2Norm = norm(v);
+
+ if (v2Norm == 0.0) {
+ xV[1] = 1.0;
+ xV[0] = xV[2] = 0.0;
+ return theta;
+ }
+ xV[0] = (y1*z2 - z1*y2);
+ xV[1] = -(x1*z2 - z1*x2);
+ xV[2] = (x1*y2 - y1*x2);
+ xVNorm = norm(xV);
+
+ sinTheta = xVNorm/v2Norm;
+ return (asin(sinTheta) * RAD2DEG);
+}
+
+
+int
+glschool_computeGroupVectors(School *s, Fish *ref, double *avoidance, double *centroid, double *avgVel)
+{
+ int i;
+ double dist;
+ double adjDist;
+ double diffVect[3];
+ int neighborCount = 0;
+ Fish *test = (Fish *)0;
+ int nFish = SCHOOL_NFISH(s);
+ double distExp = SCHOOL_DISTEXP(s);
+ double distComp = SCHOOL_DISTCOMP(s);
+ double minRadiusExp = SCHOOL_MINRADIUSEXP(s);
+ Fish *fishes = SCHOOL_FISHES(s);
+
+ for(i = 0, test = fishes; i < nFish; i++, test++) {
+ if (test == ref) continue;
+
+ getDifferenceVector(FISH_POS(ref), FISH_POS(test), diffVect);
+
+ dist = norm(diffVect) - distComp;
+ if (dist < 0.0) dist = 0.1;
+
+ adjDist = pow(dist, distExp);
+ if (adjDist > minRadiusExp) continue;
+
+ neighborCount++;
+
+ addVector(avgVel, FISH_VEL(test));
+ addVector(centroid, FISH_POS(test));
+
+ addScaledVector(avoidance, diffVect, 1.0/adjDist);
+ }
+ if (neighborCount > 0) {
+ scaleVector(avgVel, 1.0/neighborCount);
+ scaleVector(centroid, 1.0/neighborCount);
+ }
+ return neighborCount;
+}
+
+
+void
+glschool_computeAccelerations(School *s)
+{
+ int i;
+ int j;
+ int neighborCount;
+ double dist;
+ double adjDist;
+ double accMag;
+ double avgVel[3];
+ double diffVect[3];
+ double centroid[3];
+ double avoidance[3];
+ Fish *ref = (Fish *)0;
+ int nFish = SCHOOL_NFISH(s);
+ double *goal = SCHOOL_GOAL(s);
+ double distExp = SCHOOL_DISTEXP(s);
+ double distComp = SCHOOL_DISTCOMP(s);
+ double avoidFact = SCHOOL_AVOIDFACT(s);
+ double matchFact = SCHOOL_MATCHFACT(s);
+ double centerFact = SCHOOL_CENTERFACT(s);
+ double targetFact = SCHOOL_TARGETFACT(s);
+ double accLimit = SCHOOL_ACCLIMIT(s);
+ double minRadius = SCHOOL_MINRADIUS(s);
+ Fish *fishes = SCHOOL_FISHES(s);
+
+ for(i = 0, ref = fishes; i < nFish; i++, ref++) {
+ clearVector(avgVel);
+ clearVector(centroid);
+ clearVector(avoidance);
+ clearVector(FISH_ACC(ref));
+ neighborCount = glschool_computeGroupVectors(s, ref, avoidance, centroid, avgVel);
+
+ /* avoidanceAccel[] = avoidance[] * AvoidFact */
+ scaleVector(avoidance, avoidFact);
+ addVector(FISH_ACC(ref), avoidance);
+
+ accMag = norm(FISH_ACC(ref));
+ if (neighborCount > 0 && accMag < accLimit) {
+ for(j = 0; j < 3; j++) {
+ FISH_IAVGVEL(ref, j) = avgVel[j];
+ FISH_IACC(ref, j) += ((avgVel[j] - FISH_IVEL(ref, j)) * matchFact);
+ }
+
+ accMag = norm(FISH_ACC(ref));
+ if (accMag < accLimit) {
+ for(j = 0; j < 3; j++)
+ FISH_IACC(ref, j) += ((centroid[j] - FISH_IPOS(ref, j)) * centerFact);
+ }
+ }
+
+ accMag = norm(FISH_ACC(ref));
+ if (accMag < accLimit) {
+ getDifferenceVector(goal, FISH_POS(ref), diffVect);
+
+ dist = norm(diffVect) - distComp;
+ if (dist < 0.0) dist = 0.1;
+
+ /*adjDist = pow(dist, distExp);*/
+ if (dist > minRadius) {
+ adjDist = pow(dist, distExp);
+ for(j = 0; j < 3; j++)
+ FISH_IACC(ref, j) += (diffVect[j]*targetFact/adjDist);
+ }
+ }
+ }
+}
diff --git a/hacks/glx/glschool_alg.h b/hacks/glx/glschool_alg.h
new file mode 100644
index 0000000..339e778
--- /dev/null
+++ b/hacks/glx/glschool_alg.h
@@ -0,0 +1,126 @@
+/* glschool_alg.h, Copyright (c) 2005-2006 David C. Lambert <dcl@panix.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+#ifndef __GLSCHOOL_ALG_H__
+#define __GLSCHOOL_ALG_H__
+
+typedef struct {
+ double mins[3];
+ double maxs[3];
+} BBox;
+
+#define BBOX_XMIN(b) ((b)->mins[0])
+#define BBOX_YMIN(b) ((b)->mins[1])
+#define BBOX_ZMIN(b) ((b)->mins[2])
+#define BBOX_MINS(b) ((b)->mins)
+#define BBOX_IMIN(b, i) ((b)->mins[(i)])
+
+#define BBOX_XMAX(b) ((b)->maxs[0])
+#define BBOX_YMAX(b) ((b)->maxs[1])
+#define BBOX_ZMAX(b) ((b)->maxs[2])
+#define BBOX_MAXS(b) ((b)->maxs)
+#define BBOX_IMAX(b, i) ((b)->maxs[(i)])
+
+#define BBOX_IMID(b, i) (((b)->maxs[(i)] + (b)->mins[(i)])/2.0)
+#define BBOX_IRANGE(b, i) ((b)->maxs[(i)] - (b)->mins[(i)])
+
+typedef struct {
+ double pos[3];
+ double vel[3];
+ double accel[3];
+ double oldVel[3];
+ double magic[3];
+ double avgVel[3];
+} Fish;
+
+#define FISH_POS(f) ((f)->pos)
+#define FISH_X(f) ((f)->pos[0])
+#define FISH_Y(f) ((f)->pos[1])
+#define FISH_Z(f) ((f)->pos[2])
+
+#define FISH_VEL(f) ((f)->vel)
+#define FISH_VX(f) ((f)->vel[0])
+#define FISH_VY(f) ((f)->vel[1])
+#define FISH_VZ(f) ((f)->vel[2])
+
+#define FISH_ACC(f) ((f)->accel)
+#define FISH_MAGIC(f) ((f)->magic)
+#define FISH_OLDVEL(f) ((f)->oldVel)
+#define FISH_AVGVEL(f) ((f)->avgVel)
+#define FISH_IPOS(f, i) ((f)->pos[(i)])
+#define FISH_IVEL(f, i) ((f)->vel[(i)])
+#define FISH_IACC(f, i) ((f)->accel[(i)])
+#define FISH_IMAGIC(f, i) ((f)->magic[(i)])
+#define FISH_IOLDVEL(f, i) ((f)->oldVel[(i)])
+#define FISH_IAVGVEL(f, i) ((f)->avgVel[(i)])
+
+typedef struct {
+ int nFish;
+ double maxVel;
+ double minVel;
+ double distExp;
+ double momentum;
+ double accLimit;
+ double minRadius;
+ double minRadiusExp;
+ double avoidFact;
+ double matchFact;
+ double centerFact;
+ double targetFact;
+ double distComp;
+ double goal[3];
+ double boxMids[3];
+ double boxRanges[3];
+ BBox theBox;
+ Fish *theFish;
+} School;
+
+#define SCHOOL_NFISH(s) ((s)->nFish)
+#define SCHOOL_MAXVEL(s) ((s)->maxVel)
+#define SCHOOL_MINVEL(s) ((s)->minVel)
+#define SCHOOL_DISTEXP(s) ((s)->distExp)
+#define SCHOOL_MOMENTUM(s) ((s)->momentum)
+#define SCHOOL_ACCLIMIT(s) ((s)->accLimit)
+#define SCHOOL_MINRADIUS(s) ((s)->minRadius)
+#define SCHOOL_MINRADIUSEXP(s) ((s)->minRadiusExp)
+#define SCHOOL_MATCHFACT(s) ((s)->matchFact)
+#define SCHOOL_AVOIDFACT(s) ((s)->avoidFact)
+#define SCHOOL_CENTERFACT(s) ((s)->centerFact)
+#define SCHOOL_TARGETFACT(s) ((s)->targetFact)
+#define SCHOOL_DISTCOMP(s) ((s)->distComp)
+#define SCHOOL_GOAL(s) ((s)->goal)
+#define SCHOOL_IGOAL(s,i) ((s)->goal[(i)])
+#define SCHOOL_BBMINS(s) ((s)->bbox.mins)
+#define SCHOOL_BBMAXS(s) ((s)->bbox.maxs)
+#define SCHOOL_BBMIDS(s) ((s)->boxMids)
+#define SCHOOL_IMID(s,i) ((s)->boxMids[(i)])
+#define SCHOOL_BBRANGES(s) ((s)->boxRanges)
+#define SCHOOL_IRANGE(s,i) ((s)->boxRanges[(i)])
+#define SCHOOL_BBOX(s) ((s)->theBox)
+#define SCHOOL_FISHES(s) ((s)->theFish)
+#define SCHOOL_IFISH(s,i) ((s)->theFish[i])
+
+extern void glschool_initFishes(School *);
+extern void glschool_initFish(Fish *, double *, double *);
+
+extern void glschool_applyMovements(School *);
+/* extern void applyFishMovements(Fish *, BBox *, double, double, double); */
+
+extern void glschool_freeSchool(School *);
+extern School *glschool_initSchool(int, double, double, double, double, double, double, double, double, double, double, double);
+
+extern void glschool_newGoal(School *);
+extern void glschool_setBBox(School *, double, double, double, double, double, double);
+
+extern void glschool_computeAccelerations(School *);
+extern double glschool_computeNormalAndThetaToPlusZ(double *, double *);
+int glschool_computeGroupVectors(School *, Fish *, double *, double *, double *);
+
+#endif /* __GLSCHOOL_ALG_H__ */
diff --git a/hacks/glx/glschool_gl.c b/hacks/glx/glschool_gl.c
new file mode 100644
index 0000000..660580b
--- /dev/null
+++ b/hacks/glx/glschool_gl.c
@@ -0,0 +1,274 @@
+/* glschool_gl.c, Copyright (c) 2005-2012 David C. Lambert <dcl@panix.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include "sphere.h"
+#include "glschool_gl.h"
+#include "sphere.h"
+#include "tube.h"
+
+void
+glschool_drawGoal(double *goal, GLuint goalList)
+{
+ glColor3f(1.0, 0.0, 0.0);
+ glPushMatrix();
+ {
+ glTranslatef(goal[0], goal[1], goal[2]);
+ glColor3f(1.0, 0.0, 0.0);
+ glCallList(goalList);
+ }
+ glPopMatrix();
+}
+
+int
+glschool_drawBoundingBox(BBox *bbox, Bool wire)
+{
+ int polys = 0;
+ double xMin = BBOX_XMIN(bbox);
+ double yMin = BBOX_YMIN(bbox);
+ double zMin = BBOX_ZMIN(bbox);
+
+ double xMax = BBOX_XMAX(bbox);
+ double yMax = BBOX_YMAX(bbox);
+ double zMax = BBOX_ZMAX(bbox);
+
+ glFrontFace(GL_CCW);
+ if (wire) glLineWidth(5.0);
+
+ /* back */
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glColor3f(0.0, 0.0, .15);
+ glVertex3f(xMin, yMin, zMin);
+ glVertex3f(xMax, yMin, zMin);
+ glVertex3f(xMax, yMax, zMin);
+ glVertex3f(xMin, yMax, zMin);
+ polys++;
+ glEnd();
+
+ /* left */
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glColor3f(0.0, 0.0, .2);
+ glVertex3f(xMin, yMin, zMax);
+ glVertex3f(xMin, yMin, zMin);
+ glVertex3f(xMin, yMax, zMin);
+ glVertex3f(xMin, yMax, zMax);
+ polys++;
+ glEnd();
+
+ /* right */
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glColor3f(0.0, 0.0, .2);
+ glVertex3f(xMax, yMin, zMin);
+ glVertex3f(xMax, yMin, zMax);
+ glVertex3f(xMax, yMax, zMax);
+ glVertex3f(xMax, yMax, zMin);
+ polys++;
+ glEnd();
+
+ /* top */
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glColor3f(0.0, 0.0, .1);
+ glVertex3f(xMax, yMax, zMax);
+ glVertex3f(xMin, yMax, zMax);
+ glVertex3f(xMin, yMax, zMin);
+ glVertex3f(xMax, yMax, zMin);
+ polys++;
+ glEnd();
+
+ /* bottom */
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glColor3f(0.0, 0.0, .3);
+ glVertex3f(xMin, yMin, zMax);
+ glVertex3f(xMax, yMin, zMax);
+ glVertex3f(xMax, yMin, zMin);
+ glVertex3f(xMin, yMin, zMin);
+ polys++;
+ glEnd();
+
+ if (wire) glLineWidth(1.0);
+
+ return polys;
+}
+
+int
+glschool_createBBoxList(BBox *bbox, GLuint *bboxList, int wire)
+{
+ int polys = 0;
+ *bboxList = glGenLists(1);
+ glNewList(*bboxList, GL_COMPILE);
+ polys = glschool_drawBoundingBox(bbox, wire);
+ glEndList();
+ return polys;
+}
+
+void
+glschool_createDrawLists(BBox *bbox, GLuint *bboxList, GLuint *goalList, GLuint *fishList, int *fish_polys, int *box_polys, int wire)
+{
+
+ int faces = 16;
+
+ *box_polys = 0;
+ *fish_polys = 0;
+
+ *box_polys += glschool_createBBoxList(bbox, bboxList, wire);
+
+ *box_polys = 0;
+ *fish_polys = 0;
+
+ *goalList = glGenLists(1);
+ glNewList(*goalList, GL_COMPILE);
+ glScalef (5, 5, 5);
+ *box_polys += unit_sphere (10, 10, wire);
+ glEndList();
+
+ *fishList = glGenLists(1);
+ glNewList(*fishList, GL_COMPILE);
+ *fish_polys += cone (0, 0, 0,
+ 0, 0, 10,
+ 2, 0,
+ faces, True, (faces <= 3), /* cap */
+ wire);
+ glTranslatef (0, 0, -0.3);
+ glScalef (2, 2, 2);
+ glRotatef (90, 1, 0, 0);
+ if (faces > 3)
+ *fish_polys += unit_sphere (faces, faces, wire);
+ glEndList();
+}
+
+
+void
+glschool_initLights(void)
+{
+ GLfloat amb[4] = {0.1, 0.1, 0.1, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat pos[4] = {0.0, 50.0, -50.0, 1.0};
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHTING);
+}
+
+void
+glschool_initFog(void)
+{
+ GLfloat fog[4] = {0.0, 0.0, 0.15, 1.0};
+
+ glEnable(GL_FOG);
+ glFogi(GL_FOG_MODE, GL_EXP2);
+ glFogfv(GL_FOG_COLOR, fog);
+ glFogf(GL_FOG_DENSITY, .0025);
+ glFogf(GL_FOG_START, -100);
+}
+
+void
+glschool_initGLEnv(Bool doFog)
+{
+ GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
+
+ glClearDepth(1.0);
+ glDepthFunc(GL_LESS);
+
+ glEnable(GL_COLOR_MATERIAL);
+ glMateriali(GL_FRONT, GL_SHININESS, 128);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spc);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, spc);
+
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_DEPTH_TEST);
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_CULL_FACE);
+
+ glschool_initLights();
+ if (doFog) glschool_initFog();
+}
+
+void
+glschool_reshape(int width, int height)
+{
+ GLfloat h = (GLfloat) width / (GLfloat) height;
+
+ glViewport (0, 0, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(60.0, h, 0.1, 451.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+}
+
+void
+glschool_getColorVect(XColor *colors, int index, double *colorVect)
+{
+ colorVect[0] = colors[index].red / 65535.0;
+ colorVect[1] = colors[index].green / 65535.0;
+ colorVect[2] = colors[index].blue / 65535.0;
+}
+
+void
+glschool_drawSchool(XColor *colors, School *s,
+ GLuint bboxList, GLuint goalList, GLuint fishList,
+ int rotCounter, Bool drawGoal_p, Bool drawBBox_p,
+ int fish_polys, int box_polys, unsigned long *polys)
+{
+ double xVect[3];
+ double colorVect[3];
+ int i = 0;
+ double rotTheta = 0.0;
+ double colTheta = 0.0;
+ Fish *f = (Fish *)0;
+ int nFish = SCHOOL_NFISH(s);
+ Fish *theFishes = SCHOOL_FISHES(s);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ if (drawBBox_p) {
+ glDisable(GL_LIGHTING);
+ glCallList(bboxList);
+ glEnable(GL_LIGHTING);
+ *polys += box_polys;
+ }
+
+ if (drawGoal_p) glschool_drawGoal(SCHOOL_GOAL(s), goalList);
+
+ for(i = 0, f = theFishes; i < nFish; i++, f++) {
+ colTheta = glschool_computeNormalAndThetaToPlusZ(FISH_AVGVEL(f), xVect);
+ rotTheta = glschool_computeNormalAndThetaToPlusZ(FISH_VEL(f), xVect);
+
+ if (FISH_IAVGVEL(f,2) < 0.0) colTheta = 180.0 - colTheta;
+ if (FISH_VZ(f) < 0.0) rotTheta = 180.0 - rotTheta;
+
+ glschool_getColorVect(colors, (int)(colTheta+240)%360, colorVect);
+ glColor3f(colorVect[0], colorVect[1], colorVect[2]);
+
+ glPushMatrix();
+ {
+ glTranslatef(FISH_X(f), FISH_Y(f), FISH_Z(f));
+ glRotatef(180.0+rotTheta, xVect[0], xVect[1], xVect[2]);
+ glCallList(fishList);
+ *polys += fish_polys;
+ }
+ glPopMatrix();
+ }
+
+ glFinish();
+}
diff --git a/hacks/glx/glschool_gl.h b/hacks/glx/glschool_gl.h
new file mode 100644
index 0000000..c5e2d38
--- /dev/null
+++ b/hacks/glx/glschool_gl.h
@@ -0,0 +1,51 @@
+/* glschool_gl.h, Copyright (c) 2005-2006 David C. Lambert <dcl@panix.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+#ifndef __GLSCHOOL_GL_H__
+#define __GLSCHOOL_GL_H__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+# ifndef HAVE_JWZGLES
+# include <OpenGL/glu.h>
+# endif
+#else
+# include <X11/Xlib.h>
+# include <GL/gl.h>
+# include <GL/glu.h>
+#endif
+
+#ifdef HAVE_ANDROID
+#include <GLES/gl.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#include "glschool_alg.h"
+
+extern void glschool_initFog(void);
+extern void glschool_initGLEnv(Bool);
+extern void glschool_initLights(void);
+extern void glschool_reshape(int, int);
+extern void glschool_drawGoal(double *, GLuint);
+extern void glschool_getColorVect(XColor *, int, double *);
+extern int glschool_drawBoundingBox(BBox *, Bool);
+extern int glschool_createBBoxList(BBox *, GLuint *, int);
+extern void glschool_createDrawLists(BBox *, GLuint *, GLuint *, GLuint *, int *, int *, Bool);
+extern void glschool_drawSchool(XColor *, School *, GLuint, GLuint, GLuint, int, Bool, Bool,
+ int, int, unsigned long *);
+
+#endif /* __GLSCHOOL_GL_H__ */
diff --git a/hacks/glx/glslideshow.c b/hacks/glx/glslideshow.c
new file mode 100644
index 0000000..64b1494
--- /dev/null
+++ b/hacks/glx/glslideshow.c
@@ -0,0 +1,1222 @@
+/* glslideshow, Copyright (c) 2003-2014 Jamie Zawinski <jwz@jwz.org>
+ * Loads a sequence of images and smoothly pans around them; crossfades
+ * when loading new images.
+ *
+ * Originally written by Mike Oliphant <oliphant@gtk.org> (c) 2002, 2003.
+ * Rewritten by jwz, 21-Jun-2003.
+ * Rewritten by jwz again, 6-Feb-2005.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ *****************************************************************************
+ *
+ * TODO:
+ *
+ * - When a new image is loaded, there is a glitch: animation pauses during
+ * the period when we're loading the image-to-fade-in. On fast (2GHz)
+ * machines, this stutter is short but noticable (usually around 1/10th
+ * second.) On slower machines, it can be much more pronounced.
+ * This turns out to be hard to fix...
+ *
+ * Image loading happens in three stages:
+ *
+ * 1: Fork a process and run xscreensaver-getimage in the background.
+ * This writes image data to a server-side X pixmap.
+ *
+ * 2: When that completes, a callback informs us that the pixmap is ready.
+ * We must then download the pixmap data from the server with XGetImage
+ * (or XShmGetImage.)
+ *
+ * 3: Once we have the bits, we must convert them from server-native bitmap
+ * layout to 32 bit RGBA in client-endianness, to make them usable as
+ * OpenGL textures.
+ *
+ * 4: We must actually construct a texture.
+ *
+ * So, the speed of step 1 doesn't really matter, since that happens in
+ * the background. But steps 2, 3, and 4 happen in *this* process, and
+ * cause the visible glitch.
+ *
+ * Step 2 can't be moved to another process without opening a second
+ * connection to the X server, which is pretty heavy-weight. (That would
+ * be possible, though; the other process could open an X connection,
+ * retrieve the pixmap, and feed it back to us through a pipe or
+ * something.)
+ *
+ * Step 3 might be able to be optimized by coding tuned versions of
+ * grab-ximage.c:copy_ximage() for the most common depths and bit orders.
+ * (Or by moving it into the other process along with step 2.)
+ *
+ * Step 4 is the hard one, though. It might be possible to speed up this
+ * step if there is some way to allow two GL processes share texture
+ * data. Unless, of course, all the time being consumed by step 4 is
+ * because the graphics pipeline is flooded, in which case, that other
+ * process would starve the screen anyway.
+ *
+ * Is it possible to use a single GLX context in a multithreaded way?
+ * Or use a second GLX context, but allow the two contexts to share data?
+ * I can't find any documentation about this.
+ *
+ * How does Apple do this with their MacOSX slideshow screen saver?
+ * Perhaps it's easier for them because their OpenGL libraries have
+ * thread support at a lower level?
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*wireframe: False \n" \
+ "*showFPS: False \n" \
+ "*fpsSolid: True \n" \
+ "*useSHM: True \n" \
+ "*titleFont: -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n" \
+ "*desktopGrabber: xscreensaver-getimage -no-desktop %s\n" \
+ "*grabDesktopImages: False \n" \
+ "*chooseRandomImages: True \n"
+
+# define free_slideshow 0
+# define release_slideshow 0
+# include "xlockmore.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#ifdef USE_GL
+
+
+# define DEF_FADE_DURATION "2"
+# define DEF_PAN_DURATION "6"
+# define DEF_IMAGE_DURATION "30"
+# define DEF_ZOOM "75"
+# define DEF_FPS_CUTOFF "5"
+# define DEF_TITLES "False"
+# define DEF_LETTERBOX "True"
+# define DEF_DEBUG "False"
+# define DEF_MIPMAP "True"
+
+#include "grab-ximage.h"
+#include "texfont.h"
+
+typedef struct {
+ double x, y, w, h;
+} rect;
+
+typedef struct {
+ ModeInfo *mi;
+ int id; /* unique number for debugging */
+ char *title; /* the filename of this image */
+ int w, h; /* size in pixels of the image */
+ int tw, th; /* size in pixels of the texture */
+ XRectangle geom; /* where in the image the bits are */
+ Bool loaded_p; /* whether the image has finished loading */
+ Bool used_p; /* whether the image has yet appeared
+ on screen */
+ GLuint texid; /* which texture contains the image */
+ int refcount; /* how many sprites refer to this image */
+} image;
+
+
+typedef enum { NEW, IN, FULL, OUT, DEAD } sprite_state;
+
+typedef struct {
+ int id; /* unique number for debugging */
+ image *img; /* which image this animation displays */
+ GLfloat opacity; /* how to render it */
+ double start_time; /* when this animation began */
+ rect from, to, current; /* the journey this image is taking */
+ sprite_state state; /* the state we're in right now */
+ sprite_state prev_state; /* the state we were in previously */
+ double state_time; /* time of last state change */
+ int frame_count; /* frames since last state change */
+} sprite;
+
+
+typedef struct {
+ GLXContext *glx_context;
+ int nimages; /* how many images are loaded or loading now */
+ image *images[10]; /* pointers to the images */
+
+ int nsprites; /* how many sprites are animating right now */
+ sprite *sprites[10]; /* pointers to the live sprites */
+
+ double now; /* current time in seconds */
+ double dawn_of_time; /* when the program launched */
+ double image_load_time; /* time when we last loaded a new image */
+ double prev_frame_time; /* time when we last drew a frame */
+
+ Bool awaiting_first_image_p; /* Early in startup: nothing to display yet */
+ Bool redisplay_needed_p; /* Sometimes we can get away with not
+ re-painting. Tick this if a redisplay
+ is required. */
+ Bool change_now_p; /* Set when the user clicks to ask for a new
+ image right now. */
+
+ GLfloat fps; /* approximate frame rate we're achieving */
+ GLfloat theoretical_fps; /* maximum frame rate that might be possible */
+ Bool checked_fps_p; /* Whether we have checked for a low
+ frame rate. */
+
+ texture_font_data *font_data; /* for printing image file names */
+
+ int sprite_id, image_id; /* debugging id counters */
+
+ double time_elapsed;
+ int frames_elapsed;
+
+} slideshow_state;
+
+static slideshow_state *sss = NULL;
+
+
+/* Command-line arguments
+ */
+static int fade_seconds; /* Duration in seconds of fade transitions.
+ If 0, jump-cut instead of fading. */
+static int pan_seconds; /* Duration of each pan through an image. */
+static int image_seconds; /* How many seconds until loading a new image. */
+static int zoom; /* How far in to zoom when panning, in percent of
+ image size: that is, 75 means "when zoomed all
+ the way in, 75% of the image will be visible."
+ */
+static int fps_cutoff; /* If the frame-rate falls below this, turn off
+ zooming.*/
+static Bool letterbox_p; /* When a loaded image is not the same aspect
+ ratio as the window, whether to display black
+ bars.
+ */
+static Bool mipmap_p; /* Use mipmaps instead of single textures. */
+static Bool do_titles; /* Display image titles. */
+static Bool debug_p; /* Be loud and do weird things. */
+
+
+static XrmOptionDescRec opts[] = {
+ {"-fade", ".fadeDuration", XrmoptionSepArg, 0 },
+ {"-pan", ".panDuration", XrmoptionSepArg, 0 },
+ {"-duration", ".imageDuration", XrmoptionSepArg, 0 },
+ {"-zoom", ".zoom", XrmoptionSepArg, 0 },
+ {"-cutoff", ".FPScutoff", XrmoptionSepArg, 0 },
+ {"-titles", ".titles", XrmoptionNoArg, "True" },
+ {"-letterbox", ".letterbox", XrmoptionNoArg, "True" },
+ {"-no-letterbox", ".letterbox", XrmoptionNoArg, "False" },
+ {"-clip", ".letterbox", XrmoptionNoArg, "False" },
+ {"-mipmaps", ".mipmap", XrmoptionNoArg, "True" },
+ {"-no-mipmaps", ".mipmap", XrmoptionNoArg, "False" },
+ {"-debug", ".debug", XrmoptionNoArg, "True" },
+};
+
+static argtype vars[] = {
+ { &fade_seconds, "fadeDuration", "FadeDuration", DEF_FADE_DURATION, t_Int},
+ { &pan_seconds, "panDuration", "PanDuration", DEF_PAN_DURATION, t_Int},
+ { &image_seconds, "imageDuration","ImageDuration",DEF_IMAGE_DURATION, t_Int},
+ { &zoom, "zoom", "Zoom", DEF_ZOOM, t_Int},
+ { &mipmap_p, "mipmap", "Mipmap", DEF_MIPMAP, t_Bool},
+ { &letterbox_p, "letterbox", "Letterbox", DEF_LETTERBOX, t_Bool},
+ { &fps_cutoff, "FPScutoff", "FPSCutoff", DEF_FPS_CUTOFF, t_Int},
+ { &debug_p, "debug", "Debug", DEF_DEBUG, t_Bool},
+ { &do_titles, "titles", "Titles", DEF_TITLES, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt slideshow_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+static const char *
+blurb (void)
+{
+# ifdef HAVE_JWXYZ
+ return "GLSlideshow";
+# else
+ static char buf[255];
+ time_t now = time ((time_t *) 0);
+ char *ct = (char *) ctime (&now);
+ int n = strlen(progname);
+ if (n > 100) n = 99;
+ strncpy(buf, progname, n);
+ buf[n++] = ':';
+ buf[n++] = ' ';
+ strncpy(buf+n, ct+11, 8);
+ strcpy(buf+n+9, ": ");
+ return buf;
+# endif
+}
+
+
+/* Returns the current time in seconds as a double.
+ */
+static double
+double_time (void)
+{
+ struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&now, &tzp);
+# else
+ gettimeofday(&now);
+# endif
+
+ return (now.tv_sec + ((double) now.tv_usec * 0.000001));
+}
+
+
+static void image_loaded_cb (const char *filename, XRectangle *geom,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure);
+
+
+/* Allocate an image structure and start a file loading in the background.
+ */
+static image *
+alloc_image (ModeInfo *mi)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ image *img = (image *) calloc (1, sizeof (*img));
+
+ img->id = ++ss->image_id;
+ img->loaded_p = False;
+ img->used_p = False;
+ img->mi = mi;
+
+ glGenTextures (1, &img->texid);
+ if (img->texid <= 0) abort();
+
+ ss->image_load_time = ss->now;
+
+ if (wire)
+ image_loaded_cb (0, 0, 0, 0, 0, 0, img);
+ else
+ load_texture_async (mi->xgwa.screen, mi->window, *ss->glx_context,
+ 0, 0, mipmap_p, img->texid, image_loaded_cb, img);
+
+ ss->images[ss->nimages++] = img;
+ if (ss->nimages >= countof(ss->images)) abort();
+
+ return img;
+}
+
+
+/* Callback that tells us that the texture has been loaded.
+ */
+static void
+image_loaded_cb (const char *filename, XRectangle *geom,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure)
+{
+ image *img = (image *) closure;
+ ModeInfo *mi = img->mi;
+ /* slideshow_state *ss = &sss[MI_SCREEN(mi)]; */
+
+ int wire = MI_IS_WIREFRAME(mi);
+
+ if (wire)
+ {
+ img->w = MI_WIDTH (mi) * (0.5 + frand (1.0));
+ img->h = MI_HEIGHT (mi);
+ img->geom.width = img->w;
+ img->geom.height = img->h;
+ goto DONE;
+ }
+
+ if (image_width == 0 || image_height == 0)
+ exit (1);
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+ mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR);
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+ img->w = image_width;
+ img->h = image_height;
+ img->tw = texture_width;
+ img->th = texture_height;
+ img->geom = *geom;
+ img->title = (filename ? strdup (filename) : 0);
+
+ /* If the image's width doesn't come back as the width of the screen,
+ then the image must have been scaled down (due to insufficient
+ texture memory.) Scale up the coordinates to stretch the image
+ to fill the window.
+ */
+ if (img->w != MI_WIDTH(mi))
+ {
+ double scale = (double) MI_WIDTH(mi) / img->w;
+ img->w *= scale;
+ img->h *= scale;
+ img->tw *= scale;
+ img->th *= scale;
+ img->geom.x *= scale;
+ img->geom.y *= scale;
+ img->geom.width *= scale;
+ img->geom.height *= scale;
+ }
+
+ /* xscreensaver-getimage returns paths relative to the image directory
+ now, so leave the sub-directory part in. Unless it's an absolute path.
+ */
+ if (img->title && img->title[0] == '/')
+ {
+ /* strip filename to part between last "/" and last ".". */
+ char *s = strrchr (img->title, '/');
+ if (s) strcpy (img->title, s+1);
+ s = strrchr (img->title, '.');
+ if (s) *s = 0;
+ }
+
+ if (debug_p)
+ fprintf (stderr, "%s: loaded img %2d: \"%s\"\n",
+ blurb(), img->id, (img->title ? img->title : "(null)"));
+ DONE:
+
+ img->loaded_p = True;
+}
+
+
+
+/* Free the image and texture, after nobody is referencing it.
+ */
+static void
+destroy_image (ModeInfo *mi, image *img)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ Bool freed_p = False;
+ int i;
+
+ if (!img) abort();
+ if (!img->loaded_p) abort();
+ if (!img->used_p) abort();
+ if (img->texid <= 0) abort();
+ if (img->refcount != 0) abort();
+
+ for (i = 0; i < ss->nimages; i++) /* unlink it from the list */
+ if (ss->images[i] == img)
+ {
+ int j;
+ for (j = i; j < ss->nimages-1; j++) /* pull remainder forward */
+ ss->images[j] = ss->images[j+1];
+ ss->images[j] = 0;
+ ss->nimages--;
+ freed_p = True;
+ break;
+ }
+
+ if (!freed_p) abort();
+
+ if (debug_p)
+ fprintf (stderr, "%s: unloaded img %2d: \"%s\"\n",
+ blurb(), img->id, (img->title ? img->title : "(null)"));
+
+ if (img->title) free (img->title);
+ glDeleteTextures (1, &img->texid);
+ free (img);
+}
+
+
+/* Return an image to use for a sprite.
+ If it's time for a new one, get a new one.
+ Otherwise, use an old one.
+ Might return 0 if the machine is really slow.
+ */
+static image *
+get_image (ModeInfo *mi)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ image *img = 0;
+ double now = ss->now;
+ Bool want_new_p = (ss->change_now_p ||
+ ss->image_load_time + image_seconds <= now);
+ image *new_img = 0;
+ image *old_img = 0;
+ image *loading_img = 0;
+ int i;
+
+ for (i = 0; i < ss->nimages; i++)
+ {
+ image *img2 = ss->images[i];
+ if (!img2) abort();
+ if (!img2->loaded_p)
+ loading_img = img2;
+ else if (!img2->used_p)
+ new_img = img2;
+ else
+ old_img = img2;
+ }
+
+ if (want_new_p && new_img)
+ img = new_img, new_img = 0, ss->change_now_p = False;
+ else if (old_img)
+ img = old_img, old_img = 0;
+ else if (new_img)
+ img = new_img, new_img = 0, ss->change_now_p = False;
+
+ /* Make sure that there is always one unused image in the pipe.
+ */
+ if (!new_img && !loading_img)
+ alloc_image (mi);
+
+ return img;
+}
+
+
+/* Pick random starting and ending positions for the given sprite.
+ */
+static void
+randomize_sprite (ModeInfo *mi, sprite *sp)
+{
+ int vp_w = MI_WIDTH(mi);
+ int vp_h = MI_HEIGHT(mi);
+ int img_w = sp->img->geom.width;
+ int img_h = sp->img->geom.height;
+ int min_w, max_w;
+ double ratio = (double) img_h / img_w;
+
+ if (letterbox_p)
+ {
+ min_w = img_w;
+ }
+ else
+ {
+ if (img_w < vp_w)
+ min_w = vp_w;
+ else
+ min_w = img_w * (float) vp_h / img_h;
+ }
+
+ max_w = min_w * 100 / zoom;
+
+ sp->from.w = min_w + frand ((max_w - min_w) * 0.4);
+ sp->to.w = max_w - frand ((max_w - min_w) * 0.4);
+ sp->from.h = sp->from.w * ratio;
+ sp->to.h = sp->to.w * ratio;
+
+ if (zoom == 100) /* only one box, and it is centered */
+ {
+ sp->from.x = (sp->from.w > vp_w
+ ? -(sp->from.w - vp_w) / 2
+ : (vp_w - sp->from.w) / 2);
+ sp->from.y = (sp->from.h > vp_h
+ ? -(sp->from.h - vp_h) / 2
+ : (vp_h - sp->from.h) / 2);
+ sp->to = sp->from;
+ }
+ else /* position both boxes randomly */
+ {
+ sp->from.x = (sp->from.w > vp_w
+ ? -frand (sp->from.w - vp_w)
+ : frand (vp_w - sp->from.w));
+ sp->from.y = (sp->from.h > vp_h
+ ? -frand (sp->from.h - vp_h)
+ : frand (vp_h - sp->from.h));
+ sp->to.x = (sp->to.w > vp_w
+ ? -frand (sp->to.w - vp_w)
+ : frand (vp_w - sp->to.w));
+ sp->to.y = (sp->to.h > vp_h
+ ? -frand (sp->to.h - vp_h)
+ : frand (vp_h - sp->to.h));
+ }
+
+ if (random() & 1)
+ {
+ rect swap = sp->to;
+ sp->to = sp->from;
+ sp->from = swap;
+ }
+
+ /* Make sure the aspect ratios are within 0.001 of each other.
+ */
+ {
+ int r1 = 0.5 + (sp->from.w * 1000 / sp->from.h);
+ int r2 = 0.5 + (sp->to.w * 1000 / sp->to.h);
+ if (r1 < r2-1 || r1 > r2+1)
+ {
+ fprintf (stderr,
+ "%s: botched aspect: %f x %f (%d) vs %f x %f (%d): %s\n",
+ progname,
+ sp->from.w, sp->from.h, r1,
+ sp->to.w, sp->to.h, r2,
+ (sp->img->title ? sp->img->title : "[null]"));
+ abort();
+ }
+ }
+
+ sp->from.x /= vp_w;
+ sp->from.y /= vp_h;
+ sp->from.w /= vp_w;
+ sp->from.h /= vp_h;
+ sp->to.x /= vp_w;
+ sp->to.y /= vp_h;
+ sp->to.w /= vp_w;
+ sp->to.h /= vp_h;
+}
+
+
+/* Allocate a new sprite and start its animation going.
+ */
+static sprite *
+new_sprite (ModeInfo *mi)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ image *img = get_image (mi);
+ sprite *sp;
+
+ if (!img)
+ {
+ /* Oops, no images yet! The machine is probably hurting bad.
+ Let's give it some time before thrashing again. */
+ usleep (250000);
+ return 0;
+ }
+
+ sp = (sprite *) calloc (1, sizeof (*sp));
+ sp->id = ++ss->sprite_id;
+ sp->start_time = ss->now;
+ sp->state_time = sp->start_time;
+ sp->state = sp->prev_state = NEW;
+ sp->img = img;
+
+ sp->img->refcount++;
+ sp->img->used_p = True;
+
+ ss->sprites[ss->nsprites++] = sp;
+ if (ss->nsprites >= countof(ss->sprites)) abort();
+
+ randomize_sprite (mi, sp);
+
+ return sp;
+}
+
+
+/* Free the given sprite, and decrement the reference count on its image.
+ */
+static void
+destroy_sprite (ModeInfo *mi, sprite *sp)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ Bool freed_p = False;
+ image *img;
+ int i;
+
+ if (!sp) abort();
+ if (sp->state != DEAD) abort();
+ img = sp->img;
+ if (!img) abort();
+ if (!img->loaded_p) abort();
+ if (!img->used_p) abort();
+ if (img->refcount <= 0) abort();
+
+ for (i = 0; i < ss->nsprites; i++) /* unlink it from the list */
+ if (ss->sprites[i] == sp)
+ {
+ int j;
+ for (j = i; j < ss->nsprites-1; j++) /* pull remainder forward */
+ ss->sprites[j] = ss->sprites[j+1];
+ ss->sprites[j] = 0;
+ ss->nsprites--;
+ freed_p = True;
+ break;
+ }
+
+ if (!freed_p) abort();
+ free (sp);
+ sp = 0;
+
+ img->refcount--;
+ if (img->refcount < 0) abort();
+ if (img->refcount == 0)
+ destroy_image (mi, img);
+}
+
+
+/* Updates the sprite for the current frame of the animation based on
+ its creation time compared to the current wall clock.
+ */
+static void
+tick_sprite (ModeInfo *mi, sprite *sp)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ image *img = sp->img;
+ double now = ss->now;
+ double secs;
+ double ratio;
+ rect prev_rect = sp->current;
+ GLfloat prev_opacity = sp->opacity;
+
+ if (! sp->img) abort();
+ if (! img->loaded_p) abort();
+
+ secs = now - sp->start_time;
+ ratio = secs / (pan_seconds + fade_seconds);
+ if (ratio > 1) ratio = 1;
+
+ sp->current.x = sp->from.x + ratio * (sp->to.x - sp->from.x);
+ sp->current.y = sp->from.y + ratio * (sp->to.y - sp->from.y);
+ sp->current.w = sp->from.w + ratio * (sp->to.w - sp->from.w);
+ sp->current.h = sp->from.h + ratio * (sp->to.h - sp->from.h);
+
+ sp->prev_state = sp->state;
+
+ if (secs < fade_seconds)
+ {
+ sp->state = IN;
+ sp->opacity = secs / (GLfloat) fade_seconds;
+ }
+ else if (secs < pan_seconds)
+ {
+ sp->state = FULL;
+ sp->opacity = 1;
+ }
+ else if (secs < pan_seconds + fade_seconds)
+ {
+ sp->state = OUT;
+ sp->opacity = 1 - ((secs - pan_seconds) / (GLfloat) fade_seconds);
+ }
+ else
+ {
+ sp->state = DEAD;
+ sp->opacity = 0;
+ }
+
+ if (sp->state != sp->prev_state &&
+ (sp->prev_state == IN ||
+ sp->prev_state == FULL))
+ {
+ double secs = now - sp->state_time;
+
+ if (debug_p)
+ fprintf (stderr,
+ "%s: %s %3d frames %2.0f sec %5.1f fps (%.1f fps?)\n",
+ blurb(),
+ (sp->prev_state == IN ? "fade" : "pan "),
+ sp->frame_count,
+ secs,
+ sp->frame_count / secs,
+ ss->theoretical_fps);
+
+ sp->state_time = now;
+ sp->frame_count = 0;
+ }
+
+ sp->frame_count++;
+
+ if (sp->state != DEAD &&
+ (prev_rect.x != sp->current.x ||
+ prev_rect.y != sp->current.y ||
+ prev_rect.w != sp->current.w ||
+ prev_rect.h != sp->current.h ||
+ prev_opacity != sp->opacity))
+ ss->redisplay_needed_p = True;
+}
+
+
+/* Draw the given sprite at the phase of its animation dictated by
+ its creation time compared to the current wall clock.
+ */
+static void
+draw_sprite (ModeInfo *mi, sprite *sp)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ image *img = sp->img;
+
+ if (! sp->img) abort();
+ if (! img->loaded_p) abort();
+
+ glPushMatrix();
+ {
+ glTranslatef (sp->current.x, sp->current.y, 0);
+ glScalef (sp->current.w, sp->current.h, 1);
+
+ if (wire) /* Draw a grid inside the box */
+ {
+ GLfloat dy = 0.1;
+ GLfloat dx = dy * img->w / img->h;
+ GLfloat x, y;
+
+ if (sp->id & 1)
+ glColor4f (sp->opacity, 0, 0, 1);
+ else
+ glColor4f (0, 0, sp->opacity, 1);
+
+ glBegin(GL_LINES);
+ glVertex3f (0, 0, 0); glVertex3f (1, 1, 0);
+ glVertex3f (1, 0, 0); glVertex3f (0, 1, 0);
+
+ for (y = 0; y < 1+dy; y += dy)
+ {
+ GLfloat yy = (y > 1 ? 1 : y);
+ for (x = 0.5; x < 1+dx; x += dx)
+ {
+ GLfloat xx = (x > 1 ? 1 : x);
+ glVertex3f (0, xx, 0); glVertex3f (1, xx, 0);
+ glVertex3f (yy, 0, 0); glVertex3f (yy, 1, 0);
+ }
+ for (x = 0.5; x > -dx; x -= dx)
+ {
+ GLfloat xx = (x < 0 ? 0 : x);
+ glVertex3f (0, xx, 0); glVertex3f (1, xx, 0);
+ glVertex3f (yy, 0, 0); glVertex3f (yy, 1, 0);
+ }
+ }
+ glEnd();
+ }
+ else /* Draw the texture quad */
+ {
+ GLfloat texw = img->geom.width / (GLfloat) img->tw;
+ GLfloat texh = img->geom.height / (GLfloat) img->th;
+ GLfloat texx1 = img->geom.x / (GLfloat) img->tw;
+ GLfloat texy1 = img->geom.y / (GLfloat) img->th;
+ GLfloat texx2 = texx1 + texw;
+ GLfloat texy2 = texy1 + texh;
+
+ glBindTexture (GL_TEXTURE_2D, img->texid);
+ glColor4f (1, 1, 1, sp->opacity);
+ glNormal3f (0, 0, 1);
+ glBegin (GL_QUADS);
+ glTexCoord2f (texx1, texy2); glVertex3f (0, 0, 0);
+ glTexCoord2f (texx2, texy2); glVertex3f (1, 0, 0);
+ glTexCoord2f (texx2, texy1); glVertex3f (1, 1, 0);
+ glTexCoord2f (texx1, texy1); glVertex3f (0, 1, 0);
+ glEnd();
+
+ if (debug_p) /* Draw a border around the image */
+ {
+ if (!wire) glDisable (GL_TEXTURE_2D);
+
+ if (sp->id & 1)
+ glColor4f (sp->opacity, 0, 0, 1);
+ else
+ glColor4f (0, 0, sp->opacity, 1);
+
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, 1, 0);
+ glVertex3f (1, 1, 0);
+ glVertex3f (1, 0, 0);
+ glEnd();
+
+ if (!wire) glEnable (GL_TEXTURE_2D);
+ }
+ }
+
+
+ if (do_titles &&
+ img->title && *img->title &&
+ (sp->state == IN || sp->state == FULL))
+ {
+ glColor4f (1, 1, 1, sp->opacity);
+ print_texture_label (mi->dpy, ss->font_data,
+ mi->xgwa.width, mi->xgwa.height,
+ 1, img->title);
+ }
+ }
+ glPopMatrix();
+
+ if (debug_p)
+ {
+ if (!wire) glDisable (GL_TEXTURE_2D);
+
+ if (sp->id & 1)
+ glColor4f (1, 0, 0, 1);
+ else
+ glColor4f (0, 0, 1, 1);
+
+ /* Draw the "from" and "to" boxes
+ */
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (sp->from.x, sp->from.y, 0);
+ glVertex3f (sp->from.x + sp->from.w, sp->from.y, 0);
+ glVertex3f (sp->from.x + sp->from.w, sp->from.y + sp->from.h, 0);
+ glVertex3f (sp->from.x, sp->from.y + sp->from.h, 0);
+ glEnd();
+
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (sp->to.x, sp->to.y, 0);
+ glVertex3f (sp->to.x + sp->to.w, sp->to.y, 0);
+ glVertex3f (sp->to.x + sp->to.w, sp->to.y + sp->to.h, 0);
+ glVertex3f (sp->to.x, sp->to.y + sp->to.h, 0);
+ glEnd();
+
+ if (!wire) glEnable (GL_TEXTURE_2D);
+ }
+}
+
+
+static void
+tick_sprites (ModeInfo *mi)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ int i;
+ for (i = 0; i < ss->nsprites; i++)
+ tick_sprite (mi, ss->sprites[i]);
+}
+
+
+static void
+draw_sprites (ModeInfo *mi)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ int i;
+
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+
+/*
+ {
+ GLfloat rot = current_device_rotation();
+ glTranslatef (0.5, 0.5, 0);
+ glRotatef(rot, 0, 0, 1);
+ if ((rot > 45 && rot < 135) ||
+ (rot < -45 && rot > -135))
+ {
+ GLfloat s = MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi);
+ glScalef (s, 1/s, 1);
+ }
+ glTranslatef (-0.5, -0.5, 0);
+ }
+*/
+
+ for (i = 0; i < ss->nsprites; i++)
+ draw_sprite (mi, ss->sprites[i]);
+ glPopMatrix();
+
+ if (debug_p) /* draw a white box (the "screen") */
+ {
+ int wire = MI_IS_WIREFRAME(mi);
+
+ if (!wire) glDisable (GL_TEXTURE_2D);
+
+ glColor4f (1, 1, 1, 1);
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, 1, 0);
+ glVertex3f (1, 1, 0);
+ glVertex3f (1, 0, 0);
+ glEnd();
+
+ if (!wire) glEnable (GL_TEXTURE_2D);
+ }
+}
+
+
+ENTRYPOINT void
+reshape_slideshow (ModeInfo *mi, int width, int height)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ GLfloat s;
+ glViewport (0, 0, width, height);
+ glMatrixMode (GL_PROJECTION);
+ glLoadIdentity();
+ glRotatef (current_device_rotation(), 0, 0, 1);
+ glMatrixMode (GL_MODELVIEW);
+ glLoadIdentity();
+
+ s = 2;
+
+ if (debug_p)
+ {
+ s *= (zoom / 100.0) * 0.75;
+ if (s < 0.1) s = 0.1;
+ }
+
+ glScalef (s, s, s);
+ glTranslatef (-0.5, -0.5, 0);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ ss->redisplay_needed_p = True;
+}
+
+
+ENTRYPOINT Bool
+slideshow_handle_event (ModeInfo *mi, XEvent *event)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+
+ if (event->xany.type == Expose ||
+ event->xany.type == GraphicsExpose ||
+ event->xany.type == VisibilityNotify)
+ {
+ ss->redisplay_needed_p = True;
+ if (debug_p)
+ fprintf (stderr, "%s: exposure\n", blurb());
+ return False;
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ ss->change_now_p = True;
+ return True;
+ }
+
+ return False;
+}
+
+
+/* Do some sanity checking on various user-supplied values, and make
+ sure they are all internally consistent.
+ */
+static void
+sanity_check (ModeInfo *mi)
+{
+ if (zoom < 1) zoom = 1; /* zoom is a positive percentage */
+ else if (zoom > 100) zoom = 100;
+
+ if (zoom == 100) /* with no zooming, there is no panning */
+ pan_seconds = 0;
+
+ if (pan_seconds < fade_seconds) /* pan is inclusive of fade */
+ pan_seconds = fade_seconds;
+
+ if (pan_seconds == 0) /* no zero-length cycles, please... */
+ pan_seconds = 1;
+
+ if (image_seconds < pan_seconds) /* we only change images at fade-time */
+ image_seconds = pan_seconds;
+
+ /* If we're not panning/zooming within the image, then there's no point
+ in crossfading the image with itself -- only do crossfades when changing
+ to a new image. */
+ if (zoom == 100 && pan_seconds < image_seconds)
+ pan_seconds = image_seconds;
+
+ /* No need to use mipmaps if we're not changing the image size much */
+ if (zoom >= 80) mipmap_p = False;
+
+ if (fps_cutoff < 0) fps_cutoff = 0;
+ else if (fps_cutoff > 30) fps_cutoff = 30;
+}
+
+
+static void
+check_fps (ModeInfo *mi)
+{
+#ifndef HAVE_JWXYZ /* always assume Cocoa and mobile are fast enough */
+
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+
+ double start_time, end_time, wall_elapsed, frame_duration, fps;
+ int i;
+
+ start_time = ss->now;
+ end_time = double_time();
+ frame_duration = end_time - start_time; /* time spent drawing this frame */
+ ss->time_elapsed += frame_duration; /* time spent drawing all frames */
+ ss->frames_elapsed++;
+
+ wall_elapsed = end_time - ss->dawn_of_time;
+ fps = ss->frames_elapsed / ss->time_elapsed;
+ ss->theoretical_fps = fps;
+
+ if (ss->checked_fps_p) return;
+
+ if (wall_elapsed <= 8) /* too early to be sure */
+ return;
+
+ ss->checked_fps_p = True;
+
+ if (fps >= fps_cutoff)
+ {
+ if (debug_p)
+ fprintf (stderr,
+ "%s: %.1f fps is fast enough (with %d frames in %.1f secs)\n",
+ blurb(), fps, ss->frames_elapsed, wall_elapsed);
+ return;
+ }
+
+ fprintf (stderr,
+ "%s: only %.1f fps! Turning off pan/fade to compensate...\n",
+ blurb(), fps);
+ zoom = 100;
+ fade_seconds = 0;
+
+ sanity_check (mi);
+
+ for (i = 0; i < ss->nsprites; i++)
+ {
+ sprite *sp = ss->sprites[i];
+ randomize_sprite (mi, sp);
+ sp->state = FULL;
+ }
+
+ ss->redisplay_needed_p = True;
+
+ /* Need this in case zoom changed. */
+ reshape_slideshow (mi, mi->xgwa.width, mi->xgwa.height);
+#endif /* HAVE_JWXYZ */
+}
+
+
+/* Kludge to add "-v" to invocation of "xscreensaver-getimage" in -debug mode
+ */
+static void
+hack_resources (void)
+{
+#if 0
+ char *res = "desktopGrabber";
+ char *val = get_string_resource (res, "DesktopGrabber");
+ char buf1[255];
+ char buf2[255];
+ XrmValue value;
+ sprintf (buf1, "%.100s.%.100s", progclass, res);
+ sprintf (buf2, "%.200s -v", val);
+ value.addr = buf2;
+ value.size = strlen(buf2);
+ XrmPutResource (&db, buf1, "String", &value);
+#endif
+}
+
+
+ENTRYPOINT void
+init_slideshow (ModeInfo *mi)
+{
+ int screen = MI_SCREEN(mi);
+ slideshow_state *ss;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, sss);
+ ss = &sss[screen];
+
+ if ((ss->glx_context = init_GL(mi)) != NULL) {
+ reshape_slideshow (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+
+ if (debug_p)
+ fprintf (stderr, "%s: pan: %d; fade: %d; img: %d; zoom: %d%%\n",
+ blurb(), pan_seconds, fade_seconds, image_seconds, zoom);
+
+ sanity_check(mi);
+
+ if (debug_p)
+ fprintf (stderr, "%s: pan: %d; fade: %d; img: %d; zoom: %d%%\n\n",
+ blurb(), pan_seconds, fade_seconds, image_seconds, zoom);
+
+ glDisable (GL_LIGHTING);
+ glDisable (GL_DEPTH_TEST);
+ glDepthMask (GL_FALSE);
+ glEnable (GL_CULL_FACE);
+ glCullFace (GL_BACK);
+
+ if (! wire)
+ {
+ glEnable (GL_TEXTURE_2D);
+ glShadeModel (GL_SMOOTH);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ if (debug_p) glLineWidth (3);
+
+ ss->font_data = load_texture_font (mi->dpy, "titleFont");
+
+ if (debug_p)
+ hack_resources();
+
+ ss->now = double_time();
+ ss->dawn_of_time = ss->now;
+ ss->prev_frame_time = ss->now;
+
+ ss->awaiting_first_image_p = True;
+ alloc_image (mi);
+}
+
+
+ENTRYPOINT void
+draw_slideshow (ModeInfo *mi)
+{
+ slideshow_state *ss = &sss[MI_SCREEN(mi)];
+ int i;
+
+ if (!ss->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(ss->glx_context));
+
+ if (ss->awaiting_first_image_p)
+ {
+ image *img = ss->images[0];
+ if (!img) abort();
+ if (!img->loaded_p)
+ return;
+
+ ss->awaiting_first_image_p = False;
+ ss->dawn_of_time = double_time();
+
+ /* start the very first sprite fading in */
+ new_sprite (mi);
+ }
+
+ ss->now = double_time();
+
+ /* Each sprite has three states: fading in, full, fading out.
+ The in/out states overlap like this:
+
+ iiiiiiFFFFFFFFFFFFoooooo . . . . . . . . . . . . . . . . .
+ . . . . . . . . . iiiiiiFFFFFFFFFFFFoooooo . . . . . . . .
+ . . . . . . . . . . . . . . . . . . iiiiiiFFFFFFFFFFFFooooo
+
+ So as soon as a sprite goes into the "out" state, we create
+ a new sprite (in the "in" state.)
+ */
+
+ if (ss->nsprites > 2) abort();
+
+ /* If a sprite is just entering the fade-out state,
+ then add a new sprite in the fade-in state.
+ */
+ for (i = 0; i < ss->nsprites; i++)
+ {
+ sprite *sp = ss->sprites[i];
+ if (sp->state != sp->prev_state &&
+ sp->state == (fade_seconds == 0 ? DEAD : OUT))
+ new_sprite (mi);
+ }
+
+ tick_sprites (mi);
+
+ /* Now garbage collect the dead sprites.
+ */
+ for (i = 0; i < ss->nsprites; i++)
+ {
+ sprite *sp = ss->sprites[i];
+ if (sp->state == DEAD)
+ {
+ destroy_sprite (mi, sp);
+ i--;
+ }
+ }
+
+ /* We can only ever end up with no sprites at all if the machine is
+ being really slow and we hopped states directly from FULL to DEAD
+ without passing OUT... */
+ if (ss->nsprites == 0)
+ new_sprite (mi);
+
+ if (!ss->redisplay_needed_p)
+ return;
+
+ if (debug_p && ss->now - ss->prev_frame_time > 1)
+ fprintf (stderr, "%s: static screen for %.1f secs\n",
+ blurb(), ss->now - ss->prev_frame_time);
+
+ draw_sprites (mi);
+
+ if (mi->fps_p) do_fps (mi);
+
+ glFinish();
+ glXSwapBuffers (MI_DISPLAY (mi), MI_WINDOW(mi));
+ ss->prev_frame_time = ss->now;
+ ss->redisplay_needed_p = False;
+ check_fps (mi);
+}
+
+XSCREENSAVER_MODULE_2 ("GLSlideshow", glslideshow, slideshow)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/glslideshow.man b/hacks/glx/glslideshow.man
new file mode 100644
index 0000000..4ce4672
--- /dev/null
+++ b/hacks/glx/glslideshow.man
@@ -0,0 +1,131 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+glslideshow - slideshow of images using smooth zooming and fades
+.SH SYNOPSIS
+.B glslideshow
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-duration \fIseconds\fP]
+[\-zoom \fIpercent\fP]
+[\-pan \fIseconds\fP]
+[\-fade \fIseconds\fP]
+[\-titles]
+[\-letterbox | \-clip]
+[\-delay \fIusecs\fP]
+[\-fps]
+[\-debug]
+[\-wireframe]
+[\-cutoff \fIint\fP]
+.SH DESCRIPTION
+Loads a random sequence of images and smoothly scans and zooms around
+in each, fading from pan to pan.
+
+This program requires a good video card capable of supporting large
+textures.
+
+To specify the directory that images are loaded from, run
+.BR xscreensaver-demo (1)
+and click on the "Advanced" tab.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-duration \fIseconds\fP
+How long each image will be displayed before loading a new one.
+Default 30 seconds.
+.TP 8
+.B \-pan \fIseconds\fP
+How long each pan-and-zoom should last. Default 6 seconds.
+
+With the default settings of \fI\-pan 6 \-duration 30\fP, each image
+will be displayed five times (30/6), and then a new image will be loaded.
+If you want a new image to be loaded at each fade, then set \fI\-pan\fP
+and \fI\-duration\fP to the same value.
+.TP 8
+.B \-fade \fIseconds\fP
+How long each cross-fade between images should last. Default 2 seconds.
+If set to 0, then no cross-fading will be done (all transitions
+will be jump-cuts.)
+
+Note that fades are included in the pan time, so \fI\-fade\fP cannot
+be larger than \fI\-pan\fP.
+.TP 8
+.B \-zoom \fInumber\fP
+Amount to zoom and pan as a percentage. Default: 75, meaning that
+75% or more of each image will always be visible. If set to 100%,
+then the images will always fill the screen, and no panning or
+zooming will occur. (Images will still smoothly fade from one
+to another if \fI\-fade\fP is non-zero.)
+.TP 8
+.B \-titles
+Whether to print the file name of the current image in the upper left corner.
+.TP 8
+.B \-letterbox
+In "letterbox" mode, when an image is not the same aspect ratio as the screen,
+black bars will appear at the top/bottom or left/right so that the whole
+image can be displayed. This is the default.
+.TP 8
+.B \-clip
+In "clip" mode, when an image is not the same aspect ratio as the screen,
+we will zoom in further until the image takes up the whole screen.
+This is the opposite of \fI\-letterbox\fP.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-cutoff \fInumber\fP
+If the frame rate we are achieving is lower than this, then panning,
+fading, and zooming will be disabled. Default 5 FPS.
+
+The idea here is that if your machine can't maintain a decent frame
+rate, then it must not have fast 3D hardware, so we might as well
+behave in a simpler manner. Set this to 0 to disable this check.
+.TP 8
+.B \-debug
+Prints debugging info to stderr.
+.TP 8
+.B \-wireframe
+Another debug mode.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver-demo (1),
+.BR xscreensaver-getimage (1),
+.BR xscreensaver (1),
+.BR carousel (MANSUFFIX)
+.BR photopile (MANSUFFIX)
+.SH COPYRIGHT
+Copyright \(co 2003-2005 by Jamie Zawinski, based on an earlier version
+that was
+Copyright \(co 2002 by Mike Oliphant.
+
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski and Mike Oliphant.
diff --git a/hacks/glx/glsnake.c b/hacks/glx/glsnake.c
new file mode 100644
index 0000000..5f20421
--- /dev/null
+++ b/hacks/glx/glsnake.c
@@ -0,0 +1,2694 @@
+/* glsnake.c - OpenGL imitation of Rubik's Snake
+ *
+ * (c) 2001-2005 Jamie Wilkinson <jaq@spacepants.org>
+ * (c) 2001-2003 Andrew Bennetts <andrew@puzzling.org>
+ * (c) 2001-2003 Peter Aylett <peter@ylett.com>
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+/* HAVE_GLUT defined if we're building a standalone glsnake,
+ * and not defined if we're building as an xscreensaver hack */
+#ifdef HAVE_GLUT
+# include <GL/glut.h>
+#else
+# ifdef HAVE_JWXYZ
+# define HAVE_GETTIMEOFDAY
+# else
+# include <GL/gl.h>
+# include <GL/glu.h>
+# endif
+#endif
+# ifdef HAVE_ANDROID
+# include <GLES/gl.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#ifdef STANDALONE
+# include "xlockmoreI.h"
+#endif
+
+#include <stdio.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* angles */
+#define ZERO 0.0
+#define LEFT 90.0
+#define PIN 180.0
+#define RIGHT 270.0
+
+#ifdef HAVE_GETTIMEOFDAY
+# ifdef GETTIMEOFDAY_TWO_ARGS
+
+# include <sys/time.h>
+# include <time.h>
+ typedef struct timeval snaketime;
+# define GETSECS(t) ((t).tv_sec)
+# define GETMSECS(t) ((t).tv_usec/1000)
+
+# else /* !GETTIMEOFDAY_TWO_ARGS */
+
+# include <sys/time.h>
+# include <time.h>
+ typedef struct timeval snaketime;
+# define GETSECS(t) ((t).tv_sec)
+# define GETMSECS(t) ((t).tv_usec/1000)
+
+# endif /* GETTIMEOFDAY_TWO_ARGS */
+
+#else /* !HAVE_GETTIMEOFDAY */
+# ifdef HAVE_FTIME
+
+# include <sys/timeb.h>
+ typedef struct timeb snaketime;
+# define GETSECS(t) ((long)(t).time)
+# define GETMSECS(t) ((t).millitm/1000)
+
+# endif /* HAVE_FTIME */
+#endif /* HAVE_GETTIMEOFDAY */
+
+#include <math.h>
+
+#ifndef M_SQRT1_2 /* Win32 doesn't have this constant */
+#define M_SQRT1_2 0.70710678118654752440084436210485
+#endif
+
+#define NODE_COUNT 24
+
+#ifdef HAVE_GLUT
+#define DEF_YANGVEL 0.10
+#define DEF_ZANGVEL 0.14
+#define DEF_EXPLODE 0.03
+#define DEF_ANGVEL 1.0
+#define DEF_STATICTIME 5000
+#define DEF_ALTCOLOUR 0
+#define DEF_TITLES 0
+#define DEF_INTERACTIVE 0
+#define DEF_ZOOM 25.0
+#define DEF_WIREFRAME 0
+#define DEF_TRANSPARENT 1
+#else
+/* xscreensaver options doobies prefer strings */
+#define DEF_YANGVEL "0.10"
+#define DEF_ZANGVEL "0.14"
+#define DEF_EXPLODE "0.03"
+#define DEF_ANGVEL "1.0"
+#define DEF_STATICTIME "5000"
+#define DEF_ALTCOLOUR "False"
+#define DEF_TITLES "False"
+#define DEF_INTERACTIVE "False"
+#define DEF_ZOOM "25.0"
+#define DEF_WIREFRAME "False"
+#define DEF_TRANSPARENT "True"
+#endif
+
+/* static variables */
+
+static GLfloat explode;
+static long statictime;
+static GLfloat yspin = 60.0;
+static GLfloat zspin = -45.0;
+static GLfloat yangvel;
+static GLfloat zangvel;
+static Bool altcolour;
+static Bool titles;
+static Bool interactive;
+static Bool wireframe;
+static Bool transparent;
+static GLfloat zoom;
+static GLfloat angvel;
+
+#ifndef HAVE_GLUT
+
+#define glsnake_init init_glsnake
+#define glsnake_display draw_glsnake
+#define glsnake_reshape reshape_glsnake
+#define free_glsnake 0
+#define release_glsnake 0
+#define glsnake_handle_event xlockmore_no_events
+
+/* xscreensaver defaults */
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 30 \n" \
+ "*showFPS: False \n" \
+ "*suppressRotationAnimation: True\n" \
+ "*labelfont: -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n" \
+
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "texfont.h"
+
+static XrmOptionDescRec opts[] = {
+ { "-explode", ".explode", XrmoptionSepArg, DEF_EXPLODE },
+ { "-angvel", ".angvel", XrmoptionSepArg, DEF_ANGVEL },
+ { "-statictime", ".statictime", XrmoptionSepArg, DEF_STATICTIME },
+ { "-yangvel", ".yangvel", XrmoptionSepArg, DEF_YANGVEL },
+ { "-zangvel", ".zangvel", XrmoptionSepArg, DEF_ZANGVEL },
+ { "-altcolour", ".altcolour", XrmoptionNoArg, "True" },
+ { "-no-altcolour", ".altcolour", XrmoptionNoArg, "False" },
+ { "-titles", ".titles", XrmoptionNoArg, "True" },
+ { "-no-titles", ".titles", XrmoptionNoArg, "False" },
+ { "-zoom", ".zoom", XrmoptionSepArg, DEF_ZOOM },
+ { "-wireframe", ".wireframe", XrmoptionNoArg, "true" },
+ { "-no-wireframe", ".wireframe", XrmoptionNoArg, "false" },
+ { "-transparent", ".transparent", XrmoptionNoArg, "true" },
+ { "-no-transparent", ".transparent", XrmoptionNoArg, "false" },
+};
+
+static argtype vars[] = {
+ {&explode, "explode", "Explode", DEF_EXPLODE, t_Float},
+ {&angvel, "angvel", "Angular Velocity", DEF_ANGVEL, t_Float},
+ {&statictime, "statictime", "Static Time", DEF_STATICTIME, t_Int},
+ {&yangvel, "yangvel", "Angular Velocity about Y axis", DEF_YANGVEL, t_Float},
+ {&zangvel, "zangvel", "Angular Velocity about X axis", DEF_ZANGVEL, t_Float},
+ {&interactive, "interactive", "Interactive", DEF_INTERACTIVE, t_Bool},
+ {&altcolour, "altcolour", "Alternate Colour Scheme", DEF_ALTCOLOUR, t_Bool},
+ {&titles, "titles", "Titles", DEF_TITLES, t_Bool},
+ {&zoom, "zoom", "Zoom", DEF_ZOOM, t_Float},
+ {&wireframe, "wireframe", "Wireframe", DEF_WIREFRAME, t_Bool},
+ {&transparent, "transparent", "Transparent!", DEF_TRANSPARENT, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt glsnake_opts = {countof(opts), opts, countof(vars), vars, NULL};
+#endif
+
+struct model_s {
+ const char * name;
+ float node[NODE_COUNT];
+};
+
+struct glsnake_cfg {
+#ifndef HAVE_GLUT
+ GLXContext * glx_context;
+ texture_font_data *font_data;
+#else
+ /* font list number */
+ int font;
+#endif
+
+ /* window id */
+ int window;
+
+ /* is a morph in progress? */
+ int morphing;
+
+ /* has the model been paused? */
+ int paused;
+
+ /* snake metrics */
+ int is_cyclic;
+ int is_legal;
+ float last_turn;
+ int debug;
+
+ /* the shape of the model */
+ float node[NODE_COUNT];
+
+ /* currently selected node for interactive mode */
+ int selected;
+
+ /* models */
+ unsigned int prev_model;
+ unsigned int next_model;
+
+ /* model morphing */
+ int new_morph;
+
+ /* colours */
+ float colour[2][4];
+ int next_colour;
+ int prev_colour;
+
+ /* timing variables */
+ snaketime last_iteration;
+ snaketime last_morph;
+
+ /* window size */
+ int width, height;
+ int old_width, old_height;
+
+ /* the id of the display lists for drawing a node */
+ GLuint node_solid, node_wire;
+ int node_polys;
+
+ /* is the window fullscreen? */
+ int fullscreen;
+};
+
+#define COLOUR_CYCLIC 0
+#define COLOUR_ACYCLIC 1
+#define COLOUR_INVALID 2
+#define COLOUR_AUTHENTIC 3
+#define COLOUR_ORIGLOGO 4
+
+static const float colour[][2][4] = {
+ /* cyclic - green */
+ { { 0.4, 0.8, 0.2, 0.6 },
+ { 1.0, 1.0, 1.0, 0.6 } },
+ /* acyclic - blue */
+ { { 0.3, 0.1, 0.9, 0.6 },
+ { 1.0, 1.0, 1.0, 0.6 } },
+ /* invalid - grey */
+ { { 0.3, 0.1, 0.9, 0.6 },
+ { 1.0, 1.0, 1.0, 0.6 } },
+ /* authentic - purple and green */
+ { { 0.38, 0.0, 0.55, 0.7 },
+ { 0.0, 0.5, 0.34, 0.7 } },
+ /* old "authentic" colours from the logo */
+ { { 171/255.0, 0, 1.0, 1.0 },
+ { 46/255.0, 205/255.0, 227/255.0, 1.0 } }
+};
+
+static const struct model_s model[] = {
+#define STRAIGHT_MODEL 0
+ { "straight",
+ { ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO,
+ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO,
+ ZERO, ZERO, ZERO }
+ },
+ /* the models in the Rubik's snake manual */
+ { "ball",
+ { RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT,
+ RIGHT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT,
+ RIGHT, LEFT, RIGHT, LEFT, ZERO }
+ },
+#define START_MODEL 2
+ { "snow",
+ { RIGHT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, LEFT, RIGHT,
+ RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, LEFT, RIGHT, RIGHT, RIGHT,
+ RIGHT, LEFT, LEFT, LEFT, ZERO }
+ },
+ { "propellor",
+ { ZERO, ZERO, ZERO, RIGHT, LEFT, RIGHT, ZERO, LEFT, ZERO, ZERO,
+ ZERO, RIGHT, LEFT, RIGHT, ZERO, LEFT, ZERO, ZERO, ZERO, RIGHT,
+ LEFT, RIGHT, ZERO, LEFT }
+ },
+ { "flamingo",
+ { ZERO, PIN, ZERO, ZERO, ZERO, ZERO, ZERO, PIN, RIGHT, RIGHT, PIN,
+ RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, RIGHT, ZERO, ZERO,
+ ZERO, PIN, ZERO }
+ },
+ { "cat",
+ { ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN,
+ ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, ZERO,
+ ZERO, ZERO }
+ },
+ { "rooster",
+ { ZERO, ZERO, PIN, PIN, ZERO, LEFT, ZERO, LEFT, RIGHT, PIN, RIGHT,
+ ZERO, PIN, PIN, ZERO, RIGHT, PIN, RIGHT, LEFT, ZERO, LEFT, ZERO,
+ PIN, ZERO }
+ },
+ /* These models were taken from Andrew and Peter's original snake.c
+ * as well as some newer ones made up by Jamie, Andrew and Peter. */
+ { "half balls",
+ { LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT,
+ LEFT, LEFT, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT,
+ RIGHT, LEFT, LEFT, LEFT, ZERO }
+ },
+ { "zigzag1",
+ { RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, RIGHT, RIGHT,
+ LEFT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT,
+ RIGHT, RIGHT, LEFT, LEFT, ZERO }
+ },
+ { "zigzag2",
+ { PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN,
+ ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN,
+ ZERO }
+ },
+ { "zigzag3",
+ { PIN, LEFT, PIN, LEFT, PIN, LEFT, PIN, LEFT, PIN, LEFT, PIN,
+ LEFT, PIN, LEFT, PIN, LEFT, PIN, LEFT, PIN, LEFT, PIN, LEFT, PIN,
+ ZERO }
+ },
+ { "caterpillar",
+ { RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT,
+ LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN,
+ LEFT, LEFT, ZERO }
+ },
+ { "bow",
+ { RIGHT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT,
+ LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT,
+ RIGHT, RIGHT, LEFT, LEFT, ZERO }
+ },
+ { "turtle",
+ { ZERO, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT,
+ LEFT, RIGHT, LEFT, LEFT, PIN, LEFT, LEFT, LEFT, RIGHT, LEFT,
+ RIGHT, RIGHT, RIGHT, ZERO }
+ },
+ { "basket",
+ { RIGHT, PIN, ZERO, ZERO, PIN, LEFT, ZERO, LEFT, LEFT, ZERO,
+ LEFT, PIN, ZERO, ZERO, PIN, RIGHT, PIN, LEFT, PIN, ZERO, ZERO,
+ PIN, LEFT, ZERO }
+ },
+ { "thing",
+ { PIN, RIGHT, LEFT, RIGHT, RIGHT, LEFT, PIN, LEFT, RIGHT, LEFT,
+ LEFT, RIGHT, PIN, RIGHT, LEFT, RIGHT, RIGHT, LEFT, PIN, LEFT,
+ RIGHT, LEFT, LEFT, ZERO }
+ },
+ { "hexagon",
+ { ZERO, ZERO, ZERO, ZERO, LEFT, ZERO, ZERO, RIGHT, ZERO, ZERO,
+ ZERO, ZERO, LEFT, ZERO, ZERO, RIGHT, ZERO, ZERO, ZERO, ZERO,
+ LEFT, ZERO, ZERO, RIGHT }
+ },
+ { "tri1",
+ { ZERO, ZERO, LEFT, RIGHT, ZERO, LEFT, ZERO, RIGHT, ZERO, ZERO,
+ LEFT, RIGHT, ZERO, LEFT, ZERO, RIGHT, ZERO, ZERO, LEFT, RIGHT,
+ ZERO, LEFT, ZERO, RIGHT }
+ },
+ { "triangle",
+ { ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO,
+ ZERO, ZERO, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, ZERO, ZERO,
+ ZERO, ZERO, LEFT, RIGHT }
+ },
+ { "flower",
+ { ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO, LEFT, PIN, RIGHT,
+ RIGHT, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO, LEFT, PIN,
+ RIGHT, RIGHT, PIN }
+ },
+ { "crucifix",
+ { ZERO, PIN, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, PIN,
+ PIN, ZERO, PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN }
+ },
+ { "kayak",
+ { PIN, RIGHT, LEFT, PIN, LEFT, PIN, ZERO, ZERO, RIGHT, PIN, LEFT,
+ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO,
+ PIN, RIGHT }
+ },
+ { "bird",
+ { ZERO, ZERO, ZERO, ZERO, RIGHT, RIGHT, ZERO, LEFT, PIN, RIGHT,
+ ZERO, RIGHT, ZERO, RIGHT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT,
+ LEFT, ZERO, PIN, ZERO }
+ },
+ { "seal",
+ { RIGHT, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, PIN, PIN, ZERO,
+ LEFT, ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, LEFT, LEFT, PIN, RIGHT,
+ RIGHT, LEFT, ZERO }
+ },
+ { "dog",
+ { ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, PIN,
+ ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO }
+ },
+ { "frog",
+ { RIGHT, RIGHT, LEFT, LEFT, RIGHT, PIN, RIGHT, PIN, LEFT, PIN,
+ RIGHT, ZERO, LEFT, ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, LEFT,
+ RIGHT, LEFT, LEFT, ZERO }
+ },
+ { "quavers",
+ { LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, ZERO, ZERO, ZERO,
+ RIGHT, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, ZERO, LEFT, LEFT,
+ RIGHT, LEFT, RIGHT, RIGHT, ZERO }
+ },
+ { "fly",
+ { LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, ZERO, PIN, ZERO, ZERO,
+ LEFT, PIN, RIGHT, ZERO, ZERO, PIN, ZERO, LEFT, LEFT, RIGHT, LEFT,
+ RIGHT, RIGHT, ZERO }
+ },
+ { "puppy",
+ { ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO,
+ RIGHT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT,
+ LEFT, ZERO, ZERO }
+ },
+ { "stars",
+ { LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT,
+ ZERO, ZERO, ZERO, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN,
+ RIGHT, LEFT, ZERO }
+ },
+ { "mountains",
+ { RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN,
+ LEFT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT,
+ PIN, LEFT, PIN }
+ },
+ { "quad1",
+ { RIGHT, PIN, RIGHT, RIGHT, RIGHT, PIN, LEFT, LEFT, LEFT, PIN,
+ LEFT, PIN, RIGHT, PIN, RIGHT, RIGHT, RIGHT, PIN, LEFT, LEFT,
+ LEFT, PIN, LEFT, PIN }
+ },
+ { "quad2",
+ { ZERO, PIN, RIGHT, RIGHT, RIGHT, PIN, LEFT, LEFT, LEFT, PIN,
+ ZERO, PIN, ZERO, PIN, RIGHT, RIGHT, RIGHT, PIN, LEFT, LEFT, LEFT,
+ PIN, ZERO, PIN }
+ },
+ { "glasses",
+ { ZERO, PIN, ZERO, RIGHT, RIGHT, PIN, LEFT, LEFT, ZERO, PIN,
+ ZERO, PIN, ZERO, PIN, ZERO, RIGHT, RIGHT, PIN, LEFT, LEFT, ZERO,
+ PIN, ZERO, PIN }
+ },
+ { "em",
+ { ZERO, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN,
+ ZERO, PIN, ZERO, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO,
+ PIN, ZERO, PIN }
+ },
+ { "quad3",
+ { ZERO, RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, LEFT,
+ ZERO, PIN, ZERO, RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO,
+ LEFT, ZERO, PIN }
+ },
+ { "vee",
+ { ZERO, ZERO, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, ZERO,
+ ZERO, PIN, ZERO, ZERO, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO,
+ ZERO, ZERO, PIN }
+ },
+ { "square",
+ { ZERO, ZERO, ZERO, RIGHT, RIGHT, PIN, LEFT, LEFT, ZERO, ZERO,
+ ZERO, PIN, ZERO, ZERO, ZERO, RIGHT, RIGHT, PIN, LEFT, LEFT, ZERO,
+ ZERO, ZERO, PIN }
+ },
+ { "eagle",
+ { RIGHT, ZERO, ZERO, RIGHT, RIGHT, PIN, LEFT, LEFT, ZERO, ZERO,
+ LEFT, PIN, RIGHT, ZERO, ZERO, RIGHT, RIGHT, PIN, LEFT, LEFT,
+ ZERO, ZERO, LEFT, PIN }
+ },
+ { "volcano",
+ { RIGHT, ZERO, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT,
+ ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, RIGHT, RIGHT, PIN, LEFT,
+ LEFT, RIGHT, ZERO, LEFT, PIN }
+ },
+ { "saddle",
+ { RIGHT, ZERO, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, ZERO,
+ LEFT, PIN, RIGHT, ZERO, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT,
+ ZERO, LEFT, PIN }
+ },
+ { "c3d",
+ { ZERO, ZERO, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO, LEFT, ZERO,
+ ZERO, PIN, ZERO, ZERO, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO, LEFT,
+ ZERO, ZERO, PIN }
+ },
+ { "block",
+ { ZERO, ZERO, PIN, PIN, ZERO, RIGHT, PIN, LEFT, PIN, RIGHT, PIN,
+ RIGHT, PIN, LEFT, PIN, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO, LEFT,
+ PIN, RIGHT }
+ },
+ { "duck",
+ { LEFT, PIN, LEFT, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, LEFT,
+ PIN, RIGHT, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, LEFT, PIN,
+ LEFT, ZERO }
+ },
+ { "prayer",
+ { RIGHT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO, ZERO,
+ ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, ZERO, RIGHT, RIGHT, LEFT,
+ RIGHT, LEFT, LEFT, LEFT, PIN }
+ },
+ { "giraffe",
+ { ZERO, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, ZERO, RIGHT,
+ RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, PIN, ZERO, LEFT, RIGHT,
+ PIN, LEFT, LEFT, LEFT }
+ },
+ { "tie fighter",
+ { PIN, LEFT, RIGHT, LEFT, LEFT, PIN, RIGHT, ZERO, RIGHT, LEFT,
+ ZERO, PIN, LEFT, LEFT, RIGHT, RIGHT, RIGHT, PIN, LEFT, ZERO,
+ LEFT, RIGHT, ZERO, ZERO }
+ },
+ { "Strong Arms",
+ { PIN, PIN, ZERO, ZERO, PIN, ZERO, ZERO, RIGHT, ZERO, RIGHT,
+ RIGHT, PIN, RIGHT, RIGHT, ZERO, RIGHT, ZERO, ZERO, PIN, ZERO,
+ ZERO, PIN, PIN, ZERO }
+ },
+
+ /* the following modesl were created during the slug/compsoc codefest
+ * febrray 2003 */
+ { "cool looking gegl",
+ { PIN, PIN, ZERO, ZERO, RIGHT, ZERO, ZERO, PIN, PIN, ZERO, LEFT,
+ ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, LEFT, RIGHT, PIN, ZERO,
+ ZERO, ZERO }
+ },
+ { "knuckledusters",
+ { ZERO, ZERO, ZERO, ZERO, PIN, RIGHT, ZERO, PIN, PIN, ZERO, PIN,
+ PIN, ZERO, RIGHT, RIGHT, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO,
+ RIGHT, ZERO }
+ },
+ { "k's turd",
+ { RIGHT, RIGHT, PIN, RIGHT, LEFT, RIGHT, PIN, RIGHT, LEFT,
+ RIGHT, PIN, RIGHT, LEFT, RIGHT, PIN, RIGHT, LEFT, RIGHT, PIN,
+ RIGHT, LEFT, RIGHT, PIN, ZERO }
+ },
+ { "lightsabre",
+ { ZERO, ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO,
+ ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO,
+ ZERO, ZERO }
+ },
+ { "not a stairway",
+ { LEFT, ZERO, RIGHT, LEFT, RIGHT, ZERO, LEFT, RIGHT, LEFT, ZERO,
+ RIGHT, LEFT, RIGHT, ZERO, LEFT, RIGHT, LEFT, ZERO, RIGHT, LEFT,
+ RIGHT, ZERO, LEFT, ZERO }
+ },
+ { "not very good (but accurate) gegl",
+ { ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, LEFT, ZERO,
+ PIN, PIN, ZERO, RIGHT, LEFT, ZERO, PIN, ZERO, PIN, PIN, ZERO,
+ PIN, ZERO }
+ },
+ { "box",
+ { ZERO, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO, ZERO,
+ ZERO, PIN, ZERO, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO,
+ ZERO, ZERO, ZERO }
+ },
+ { "kissy box",
+ { PIN, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO, ZERO,
+ ZERO, PIN, ZERO, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO,
+ ZERO, PIN, ZERO }
+ },
+ { "erect penis", /* thanks benno */
+ { PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, PIN,
+ PIN, ZERO, ZERO, ZERO, RIGHT, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO,
+ ZERO, ZERO }
+ },
+ { "flaccid penis",
+ { PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, PIN,
+ PIN, ZERO, ZERO, ZERO, RIGHT, PIN, ZERO, ZERO, ZERO, ZERO, ZERO,
+ ZERO, ZERO }
+ },
+ { "vagina",
+ { RIGHT, ZERO, ZERO, ZERO, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO,
+ LEFT, ZERO, ZERO, ZERO, LEFT, ZERO, LEFT, PIN, LEFT, PIN, RIGHT,
+ PIN, RIGHT, ZERO }
+ },
+ { "mask",
+ { ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO, ZERO, PIN,
+ ZERO, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO,
+ ZERO, ZERO, ZERO }
+ },
+ { "poles or columns or something",
+ { LEFT, RIGHT, LEFT, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO,
+ ZERO, LEFT, RIGHT, LEFT, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO,
+ ZERO, LEFT, ZERO }
+ },
+ { "crooked v",
+ { ZERO, LEFT, ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO,
+ ZERO, LEFT, ZERO, LEFT, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO,
+ ZERO, ZERO, ZERO }
+ },
+ { "dog leg",
+ { ZERO, LEFT, ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO, ZERO,
+ LEFT, ZERO, RIGHT, ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO,
+ ZERO, ZERO }
+ },
+ { "scrubby",
+ { ZERO, ZERO, ZERO, ZERO, ZERO, LEFT, ZERO, ZERO, ZERO, ZERO,
+ LEFT, RIGHT, ZERO, ZERO, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO,
+ LEFT, PIN, ZERO, ZERO }
+ },
+ { "voltron's eyes",
+ { ZERO, ZERO, PIN, RIGHT, ZERO, LEFT, ZERO, ZERO, RIGHT, ZERO,
+ LEFT, PIN, ZERO, ZERO, PIN, ZERO, LEFT, ZERO, RIGHT, LEFT, ZERO,
+ RIGHT, ZERO, ZERO }
+ },
+ { "flying toaster",
+ { PIN, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO,
+ RIGHT, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, ZERO,
+ PIN, ZERO }
+ },
+ { "dubbya",
+ { PIN, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO,
+ ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, ZERO,
+ PIN, ZERO }
+ },
+ { "tap handle",
+ { PIN, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO,
+ LEFT, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, ZERO,
+ PIN, ZERO }
+ },
+ { "wingnut",
+ { PIN, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO,
+ PIN, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, ZERO,
+ PIN, ZERO }
+ },
+ { "tight twist",
+ { RIGHT, ZERO, ZERO, LEFT, ZERO, LEFT, RIGHT, ZERO, RIGHT, LEFT,
+ RIGHT, PIN, RIGHT, LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT,
+ ZERO, ZERO, RIGHT, ZERO }
+ },
+ { "double helix",
+ { RIGHT, ZERO, RIGHT, ZERO, RIGHT, ZERO, RIGHT, ZERO, RIGHT,
+ ZERO, RIGHT, ZERO, RIGHT, LEFT, RIGHT, PIN, ZERO, RIGHT, ZERO,
+ RIGHT, ZERO, RIGHT, ZERO, ZERO }
+ },
+
+ /* These models come from the website at
+ * http://www.geocities.com/stigeide/snake */
+#if 0
+ { "Abstract",
+ { RIGHT, LEFT, RIGHT, ZERO, PIN, ZERO, LEFT, RIGHT, LEFT, PIN, ZERO, ZERO, PIN, LEFT, RIGHT, LEFT, ZERO, PIN, ZERO, RIGHT, LEFT, RIGHT, ZERO, ZERO }
+ },
+#endif
+ { "toadstool",
+ { LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, PIN, RIGHT, LEFT, PIN, ZERO }
+ },
+ { "AlanH2",
+ { LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, ZERO }
+ },
+ { "AlanH3",
+ { LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, ZERO }
+ },
+ { "AlanH4",
+ { ZERO, ZERO, PIN, LEFT, RIGHT, LEFT, ZERO, RIGHT, LEFT, RIGHT, ZERO, PIN, ZERO, LEFT, RIGHT, LEFT, ZERO, RIGHT, LEFT, RIGHT, PIN, ZERO, ZERO, ZERO }
+ },
+ { "Alien",
+ { RIGHT, LEFT, RIGHT, PIN, ZERO, ZERO, PIN, RIGHT, LEFT, RIGHT, ZERO, PIN, PIN, ZERO, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, ZERO, PIN, PIN, ZERO }
+ },
+ { "Angel",
+ { ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, ZERO }
+ },
+ { "AnotherFigure",
+ { LEFT, PIN, RIGHT, ZERO, ZERO, PIN, RIGHT, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, PIN, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, LEFT, PIN, ZERO, ZERO }
+ },
+ { "Ball",
+ { LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT , ZERO }
+ },
+ { "Basket",
+ { ZERO, RIGHT, RIGHT, ZERO, RIGHT, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, LEFT, RIGHT, PIN, LEFT, LEFT, ZERO, LEFT , ZERO }
+ },
+ { "Beetle",
+ { PIN, LEFT, RIGHT, ZERO, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, ZERO, LEFT, RIGHT, PIN, RIGHT , ZERO }
+ },
+ { "bone",
+ { PIN, PIN, LEFT, ZERO, PIN, PIN, ZERO, LEFT, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, RIGHT, PIN, PIN , ZERO }
+ },
+ { "Bow",
+ { LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT , ZERO }
+ },
+ { "bra",
+ { RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, LEFT , ZERO }
+ },
+ { "bronchosaurus",
+ { ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, PIN , ZERO }
+ },
+ { "Cactus",
+ { PIN, LEFT, ZERO, PIN, PIN, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN, RIGHT, PIN, LEFT, ZERO, ZERO, RIGHT, PIN, LEFT, PIN, ZERO, ZERO , ZERO }
+ },
+ { "Camel",
+ { RIGHT, ZERO, PIN, RIGHT, PIN, RIGHT, ZERO, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, ZERO, RIGHT, PIN, RIGHT, ZERO, ZERO, LEFT , ZERO }
+ },
+ { "Candlestick",
+ { LEFT, PIN, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, RIGHT , ZERO }
+ },
+ { "Cat",
+ { ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO , ZERO }
+ },
+ { "Cave",
+ { RIGHT, ZERO, ZERO, PIN, LEFT, ZERO, PIN, PIN, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, LEFT, LEFT, PIN, RIGHT, RIGHT, LEFT, PIN, ZERO, ZERO , ZERO }
+ },
+ { "Chains",
+ { PIN, ZERO, ZERO, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO , ZERO }
+ },
+ { "Chair",
+ { RIGHT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, RIGHT, ZERO, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, LEFT, RIGHT, LEFT, LEFT , ZERO }
+ },
+ { "Chick",
+ { RIGHT, RIGHT, RIGHT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, RIGHT, RIGHT, PIN, LEFT, LEFT, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, LEFT, LEFT , ZERO }
+ },
+ { "Clockwise",
+ { RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT , ZERO }
+ },
+ { "cobra",
+ { ZERO, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, LEFT, ZERO, LEFT, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO, RIGHT , ZERO }
+ },
+#if 0
+ { "Cobra2",
+ { LEFT, ZERO, PIN, ZERO, PIN, LEFT, ZERO, PIN, ZERO, LEFT, LEFT, PIN, RIGHT, RIGHT, ZERO, PIN, ZERO, RIGHT, PIN, ZERO, PIN, ZERO, RIGHT , ZERO }
+ },
+#endif
+ { "Cobra3",
+ { ZERO, LEFT, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, ZERO, ZERO, LEFT, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, LEFT , ZERO }
+ },
+ { "Compact1",
+ { ZERO, ZERO, PIN, ZERO, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO, PIN, PIN, ZERO, ZERO, LEFT, PIN , ZERO }
+ },
+ { "Compact2",
+ { LEFT, PIN, RIGHT, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, RIGHT, ZERO, ZERO, ZERO , ZERO }
+ },
+ { "Compact3",
+ { ZERO, PIN, ZERO, PIN, PIN, ZERO, LEFT, PIN, RIGHT, ZERO, PIN, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, LEFT, PIN, RIGHT, ZERO, PIN , ZERO }
+ },
+ { "Compact4",
+ { PIN, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO, PIN, PIN, ZERO, PIN, RIGHT, PIN, LEFT, PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, ZERO , ZERO }
+ },
+ { "Compact5",
+ { LEFT, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, RIGHT, ZERO, RIGHT, PIN, RIGHT, PIN, LEFT , ZERO }
+ },
+ { "Contact",
+ { PIN, ZERO, ZERO, PIN, LEFT, LEFT, PIN, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, PIN, RIGHT, RIGHT, PIN, ZERO, ZERO, PIN, RIGHT, PIN , ZERO }
+ },
+ { "Contact2",
+ { RIGHT, PIN, ZERO, LEFT, LEFT, PIN, RIGHT, RIGHT, ZERO, PIN, LEFT, PIN, RIGHT, PIN, ZERO, LEFT, LEFT, PIN, RIGHT, RIGHT, ZERO, PIN, LEFT , ZERO }
+ },
+ { "Cook",
+ { ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, RIGHT, LEFT, PIN, LEFT, ZERO, PIN, PIN, ZERO, LEFT, PIN, LEFT, RIGHT, ZERO, RIGHT, ZERO, PIN , ZERO }
+ },
+ { "Counterclockwise",
+ { LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT , ZERO }
+ },
+ { "Cradle",
+ { LEFT, LEFT, ZERO, PIN, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, PIN, ZERO, RIGHT, RIGHT, LEFT, LEFT, ZERO, ZERO, RIGHT , ZERO }
+ },
+ { "Crankshaft",
+ { ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, PIN, LEFT, PIN, RIGHT, ZERO, ZERO, ZERO, PIN, RIGHT , ZERO }
+ },
+ { "Cross",
+ { ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, PIN , ZERO }
+ },
+ { "Cross2",
+ { ZERO, ZERO, PIN, PIN, ZERO, LEFT, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, ZERO, PIN, PIN, ZERO, LEFT, ZERO, ZERO, PIN, PIN, ZERO , ZERO }
+ },
+ { "Cross3",
+ { ZERO, ZERO, PIN, PIN, ZERO, LEFT, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, ZERO, PIN, PIN, ZERO, LEFT, ZERO, ZERO, PIN, PIN, ZERO, ZERO }
+ },
+ { "CrossVersion1",
+ { PIN, ZERO, RIGHT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, RIGHT, ZERO, PIN, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, ZERO }
+ },
+ { "CrossVersion2",
+ { RIGHT, LEFT, PIN, LEFT, LEFT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, LEFT, LEFT, PIN, LEFT, RIGHT, ZERO }
+ },
+ { "Crown",
+ { LEFT, ZERO, PIN, ZERO, RIGHT, ZERO, ZERO, LEFT, ZERO, PIN, ZERO, RIGHT, LEFT, ZERO, PIN, ZERO, RIGHT, ZERO, ZERO, LEFT, ZERO, PIN, ZERO, ZERO }
+ },
+ { "DNAStrand",
+ { RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, ZERO }
+ },
+ { "Diamond",
+ { ZERO, RIGHT, ZERO, ZERO, LEFT, ZERO, ZERO, RIGHT, PIN, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, LEFT, ZERO, ZERO, RIGHT, ZERO, ZERO, LEFT, ZERO }
+ },
+ { "Dog",
+ { RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO, LEFT, RIGHT, ZERO }
+ },
+ { "DogFace",
+ { ZERO, ZERO, PIN, PIN, ZERO, LEFT, LEFT, RIGHT, PIN, ZERO, PIN, PIN, ZERO, PIN, LEFT, RIGHT, RIGHT, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO }
+ },
+ { "DoublePeak",
+ { ZERO, ZERO, PIN, ZERO, ZERO, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, LEFT, ZERO, PIN, ZERO, RIGHT, RIGHT, LEFT, PIN, LEFT, RIGHT, ZERO }
+ },
+ { "DoubleRoof",
+ { ZERO, LEFT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, ZERO, LEFT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, ZERO }
+ },
+ { "txoboggan",
+ { ZERO, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, LEFT, PIN, RIGHT, ZERO, ZERO, ZERO, ZERO, PIN, ZERO }
+ },
+ { "Doubled",
+ { LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, LEFT, ZERO, LEFT, PIN, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, ZERO }
+ },
+ { "Doubled1",
+ { LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, ZERO, RIGHT, ZERO, RIGHT, ZERO, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, ZERO }
+ },
+ { "Doubled2",
+ { LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, LEFT, RIGHT, ZERO, RIGHT, LEFT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, ZERO }
+ },
+ { "DumblingSpoon",
+ { PIN, PIN, ZERO, ZERO, ZERO, ZERO, ZERO, LEFT, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, RIGHT, ZERO, ZERO, ZERO, ZERO, ZERO }
+ },
+ { "Embrace",
+ { PIN, ZERO, ZERO, PIN, RIGHT, PIN, LEFT, PIN, ZERO, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, ZERO, PIN, RIGHT, PIN, LEFT, PIN, ZERO, ZERO }
+ },
+ { "EndlessBelt",
+ { ZERO, RIGHT, LEFT, ZERO, ZERO, ZERO, LEFT, RIGHT, ZERO, PIN, RIGHT, LEFT, ZERO, LEFT, RIGHT, LEFT, PIN, LEFT, RIGHT, LEFT, ZERO, LEFT, RIGHT, ZERO }
+ },
+ { "Entrance",
+ { LEFT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, ZERO }
+ },
+ { "Esthetic",
+ { LEFT, LEFT, PIN, RIGHT, RIGHT, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, ZERO }
+ },
+ { "Explosion",
+ { RIGHT, RIGHT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, ZERO }
+ },
+ { "F-ZeroXCar",
+ { RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, ZERO, ZERO, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, ZERO }
+ },
+ { "Face",
+ { ZERO, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, PIN, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, ZERO }
+ },
+ { "Fantasy",
+ { LEFT, LEFT, RIGHT, PIN, ZERO, RIGHT, ZERO, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, ZERO, LEFT, ZERO, PIN, LEFT, RIGHT, RIGHT, RIGHT, PIN, ZERO }
+ },
+ { "Fantasy1",
+ { PIN, ZERO, ZERO, PIN, PIN, ZERO, PIN, RIGHT, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, LEFT, PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO }
+ },
+ { "FaserGun",
+ { ZERO, ZERO, LEFT, RIGHT, PIN, RIGHT, ZERO, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, ZERO, RIGHT, PIN, RIGHT, RIGHT, ZERO, PIN, ZERO }
+ },
+ { "FelixW",
+ { ZERO, RIGHT, ZERO, PIN, LEFT, ZERO, LEFT, RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, LEFT, RIGHT, ZERO, RIGHT, PIN, ZERO, LEFT, ZERO, ZERO }
+ },
+ { "Flamingo",
+ { ZERO, PIN, ZERO, ZERO, ZERO, ZERO, ZERO, PIN, LEFT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, LEFT, ZERO, ZERO, ZERO, PIN, ZERO }
+ },
+ { "FlatOnTheTop",
+ { ZERO, PIN, PIN, ZERO, PIN, RIGHT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO }
+ },
+ { "Fly",
+ { ZERO, LEFT, PIN, RIGHT, ZERO, PIN, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, ZERO }
+ },
+ { "Fountain",
+ { LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, LEFT, PIN, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, PIN, RIGHT, PIN, ZERO }
+ },
+ { "Frog",
+ { LEFT, LEFT, RIGHT, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO, RIGHT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, RIGHT, LEFT, RIGHT, RIGHT, ZERO }
+ },
+ { "Frog2",
+ { LEFT, ZERO, LEFT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, LEFT, RIGHT, PIN, LEFT, LEFT, RIGHT, ZERO, RIGHT, ZERO }
+ },
+ { "Furby",
+ { PIN, ZERO, LEFT, PIN, RIGHT, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, RIGHT, PIN, LEFT, ZERO, PIN, ZERO, ZERO, PIN, ZERO }
+ },
+ { "Gate",
+ { ZERO, ZERO, PIN, ZERO, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, LEFT, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN, RIGHT, ZERO, PIN, PIN, ZERO, ZERO }
+ },
+ { "Ghost",
+ { LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, LEFT, RIGHT, ZERO }
+ },
+ { "Globus",
+ { RIGHT, LEFT, ZERO, PIN, LEFT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, PIN, ZERO, RIGHT, LEFT, ZERO, ZERO }
+ },
+ { "Grotto",
+ { PIN, PIN, ZERO, LEFT, RIGHT, LEFT, ZERO, PIN, RIGHT, PIN, LEFT, ZERO, ZERO, ZERO, ZERO, RIGHT, PIN, LEFT, PIN, ZERO, RIGHT, LEFT, RIGHT, ZERO }
+ },
+ { "H",
+ { PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO, PIN, LEFT, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO }
+ },
+ { "HeadOfDevil",
+ { PIN, ZERO, RIGHT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN, RIGHT, LEFT, ZERO, ZERO, ZERO }
+ },
+ { "Heart",
+ { RIGHT, ZERO, ZERO, ZERO, PIN, LEFT, PIN, LEFT, RIGHT, RIGHT, ZERO, PIN, ZERO, LEFT, LEFT, RIGHT, PIN, RIGHT, PIN, ZERO, ZERO, ZERO, LEFT, ZERO }
+ },
+ { "Heart2",
+ { ZERO, PIN, ZERO, ZERO, LEFT, ZERO, LEFT, ZERO, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO, RIGHT, ZERO, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO }
+ },
+ { "Hexagon",
+ { ZERO, ZERO, ZERO, ZERO, LEFT, ZERO, ZERO, RIGHT, ZERO, ZERO, ZERO, ZERO, LEFT, ZERO, ZERO, RIGHT, ZERO, ZERO, ZERO, ZERO, LEFT, ZERO, ZERO, ZERO }
+ },
+ { "HoleInTheMiddle1",
+ { ZERO, LEFT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, LEFT, RIGHT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, RIGHT, ZERO }
+ },
+ { "HoleInTheMiddle2",
+ { ZERO, LEFT, RIGHT, ZERO, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT, RIGHT, ZERO, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, RIGHT, ZERO }
+ },
+ { "HouseBoat",
+ { RIGHT, RIGHT, PIN, LEFT, LEFT, LEFT, PIN, RIGHT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, RIGHT, PIN, ZERO }
+ },
+ { "HouseByHouse",
+ { LEFT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, RIGHT, ZERO }
+ },
+ { "Infinity",
+ { LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, ZERO }
+ },
+ { "Integral",
+ { RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO }
+ },
+ { "Iron",
+ { ZERO, ZERO, ZERO, ZERO, PIN, RIGHT, ZERO, RIGHT, ZERO, ZERO, LEFT, PIN, RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, RIGHT, ZERO, RIGHT, ZERO }
+ },
+ { "just squares",
+ { RIGHT, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, LEFT, PIN, RIGHT, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, LEFT, ZERO }
+ },
+ { "Kink",
+ { ZERO, PIN, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO }
+ },
+ { "Knot",
+ { LEFT, LEFT, PIN, LEFT, ZERO, LEFT, RIGHT, LEFT, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, RIGHT, LEFT, RIGHT, ZERO, RIGHT, PIN, RIGHT, RIGHT, LEFT, ZERO }
+ },
+ { "Leaf",
+ { ZERO, PIN, PIN, ZERO, ZERO, LEFT, ZERO, LEFT, ZERO, ZERO, PIN, ZERO, ZERO, RIGHT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO }
+ },
+ { "LeftAsRight",
+ { RIGHT, PIN, LEFT, RIGHT, LEFT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, RIGHT, LEFT, RIGHT, PIN, LEFT, ZERO }
+ },
+ { "Long-necked",
+ { PIN, ZERO, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, ZERO, PIN, ZERO, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO, PIN, PIN, ZERO, ZERO }
+ },
+ { "lunar module",
+ { PIN, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT, ZERO }
+ },
+ { "magnifying glass",
+ { ZERO, ZERO, PIN, ZERO, LEFT, ZERO, PIN, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, ZERO, ZERO, ZERO }
+ },
+ { "Mask",
+ { ZERO, ZERO, ZERO, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO, PIN, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT, ZERO }
+ },
+ { "Microscope",
+ { PIN, PIN, ZERO, ZERO, PIN, ZERO, RIGHT, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN, LEFT, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO }
+ },
+ { "Mirror",
+ { PIN, RIGHT, LEFT, ZERO, PIN, PIN, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO, LEFT, RIGHT, PIN, RIGHT, ZERO, PIN, PIN, ZERO, ZERO }
+ },
+ { "MissPiggy",
+ { ZERO, LEFT, LEFT, PIN, RIGHT, ZERO, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, ZERO, LEFT, PIN, RIGHT, RIGHT, ZERO, RIGHT, ZERO }
+ },
+ { "Mole",
+ { ZERO, RIGHT, ZERO, RIGHT, LEFT, RIGHT, PIN, ZERO, LEFT, PIN, RIGHT, ZERO, PIN, LEFT, RIGHT, LEFT, ZERO, LEFT, ZERO, RIGHT, RIGHT, PIN, LEFT, ZERO }
+ },
+ { "Monk",
+ { LEFT, ZERO, PIN, PIN, ZERO, LEFT, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO }
+ },
+ { "Mountain",
+ { ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, LEFT, PIN, LEFT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, ZERO }
+ },
+ { "mountains",
+ { ZERO, PIN, ZERO, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, ZERO, PIN, ZERO, ZERO }
+ },
+ { "MouseWithoutTail",
+ { ZERO, PIN, PIN, ZERO, LEFT, ZERO, PIN, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, ZERO }
+ },
+ { "mushroom",
+ { PIN, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, ZERO, LEFT, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, LEFT, ZERO, PIN, ZERO }
+ },
+ { "necklace",
+ { ZERO, ZERO, LEFT, ZERO, ZERO, ZERO, LEFT, ZERO, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO, RIGHT, ZERO, ZERO, ZERO, RIGHT, ZERO, ZERO, ZERO }
+ },
+ { "NestledAgainst",
+ { LEFT, ZERO, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, ZERO }
+ },
+ { "NoClue",
+ { ZERO, RIGHT, PIN, LEFT, LEFT, LEFT, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, ZERO, RIGHT, RIGHT, RIGHT, PIN, LEFT, ZERO, ZERO }
+ },
+ { "Noname",
+ { LEFT, PIN, RIGHT, PIN, RIGHT, ZERO, PIN, ZERO, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, RIGHT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, ZERO }
+ },
+ { "Obelisk",
+ { PIN, ZERO, ZERO, ZERO, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, ZERO, ZERO, ZERO, ZERO }
+ },
+ { "Ostrich",
+ { ZERO, ZERO, PIN, PIN, ZERO, LEFT, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, ZERO, PIN, ZERO }
+ },
+ { "Ostrich2",
+ { PIN, PIN, ZERO, PIN, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO }
+ },
+ { "pair of glasses",
+ { ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, LEFT, ZERO, PIN, ZERO, RIGHT, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO }
+ },
+ { "Parrot",
+ { ZERO, ZERO, ZERO, ZERO, RIGHT, RIGHT, ZERO, LEFT, PIN, RIGHT, ZERO, RIGHT, ZERO, RIGHT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, LEFT, ZERO, PIN, ZERO }
+ },
+ { "Penis",
+ { PIN, PIN, RIGHT, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, LEFT, PIN, PIN, ZERO }
+ },
+ { "PictureComingSoon",
+ { LEFT, LEFT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, RIGHT, PIN, RIGHT, LEFT, ZERO, RIGHT, RIGHT, ZERO }
+ },
+ { "Pitti",
+ { LEFT, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, RIGHT, ZERO }
+ },
+ { "Plait",
+ { LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, LEFT, ZERO }
+ },
+ { "Platform",
+ { RIGHT, PIN, ZERO, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, PIN, PIN, ZERO, PIN, LEFT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO }
+ },
+ { "PodRacer",
+ { ZERO, PIN, ZERO, PIN, RIGHT, PIN, ZERO, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, PIN, PIN, ZERO, ZERO, LEFT, ZERO, PIN, LEFT, ZERO }
+ },
+#if 0
+ { "Pokemon",
+ { LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, ZERO }
+ },
+#endif
+ { "Prawn",
+ { RIGHT, PIN, ZERO, PIN, RIGHT, ZERO, PIN, PIN, ZERO, ZERO, LEFT, PIN, RIGHT, ZERO, ZERO, PIN, PIN, ZERO, LEFT, PIN, ZERO, PIN, LEFT, ZERO }
+ },
+ { "Propeller",
+ { ZERO, ZERO, ZERO, RIGHT, ZERO, LEFT, RIGHT, LEFT, ZERO, ZERO, ZERO, RIGHT, ZERO, LEFT, RIGHT, LEFT, ZERO, ZERO, ZERO, RIGHT, ZERO, LEFT, RIGHT, ZERO }
+ },
+ { "Pyramid",
+ { ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, PIN, RIGHT, ZERO, PIN, RIGHT, LEFT, LEFT, LEFT, PIN, RIGHT, RIGHT, RIGHT, LEFT, ZERO }
+ },
+ { "QuarterbackTiltedAndReadyToHut",
+ { PIN, ZERO, RIGHT, RIGHT, LEFT, RIGHT, PIN, RIGHT, LEFT, RIGHT, ZERO, PIN, ZERO, LEFT, RIGHT, LEFT, PIN, LEFT, RIGHT, LEFT, LEFT, ZERO, PIN, ZERO }
+ },
+ { "Ra",
+ { PIN, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO }
+ },
+ { "Rattlesnake",
+ { LEFT, ZERO, LEFT, ZERO, LEFT, ZERO, LEFT, LEFT, ZERO, LEFT, ZERO, LEFT, ZERO, LEFT, RIGHT, ZERO, PIN, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, ZERO }
+ },
+ { "Revelation",
+ { ZERO, ZERO, ZERO, PIN, ZERO, ZERO, PIN, RIGHT, LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, LEFT, PIN, ZERO, ZERO, PIN, ZERO }
+ },
+ { "Revolution1",
+ { LEFT, LEFT, PIN, RIGHT, ZERO, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, ZERO, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, ZERO }
+ },
+ { "Ribbon",
+ { RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO }
+ },
+ { "Rocket",
+ { RIGHT, ZERO, LEFT, PIN, RIGHT, ZERO, RIGHT, ZERO, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, ZERO, LEFT, ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, ZERO }
+ },
+ { "Roofed",
+ { ZERO, LEFT, PIN, RIGHT, ZERO, PIN, LEFT, ZERO, PIN, ZERO, RIGHT, PIN, ZERO, LEFT, PIN, RIGHT, ZERO, PIN, LEFT, ZERO, PIN, ZERO, RIGHT, ZERO }
+ },
+ { "Roofs",
+ { PIN, PIN, RIGHT, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, RIGHT, ZERO, LEFT, PIN, PIN, ZERO }
+ },
+ { "RowHouses",
+ { RIGHT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO }
+ },
+ { "Sculpture",
+ { RIGHT, LEFT, PIN, ZERO, ZERO, ZERO, LEFT, RIGHT, LEFT, PIN, ZERO, ZERO, PIN, LEFT, RIGHT, LEFT, ZERO, ZERO, ZERO, PIN, LEFT, RIGHT, LEFT, ZERO }
+ },
+ { "Seal",
+ { LEFT, LEFT, LEFT, PIN, RIGHT, RIGHT, RIGHT, ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, PIN, PIN, ZERO, LEFT, ZERO }
+ },
+ { "Seal2",
+ { RIGHT, PIN, ZERO, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, RIGHT, PIN, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, ZERO }
+ },
+ { "Sheep",
+ { RIGHT, LEFT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, LEFT, LEFT, RIGHT, LEFT, ZERO }
+ },
+ { "Shelter",
+ { LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, ZERO, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO, RIGHT, ZERO }
+ },
+ { "Ship",
+ { PIN, RIGHT, LEFT, LEFT, LEFT, LEFT, PIN, RIGHT, RIGHT, RIGHT, RIGHT, LEFT, ZERO, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, LEFT, ZERO, PIN, PIN, ZERO }
+ },
+ { "Shpongle",
+ { LEFT, RIGHT, ZERO, RIGHT, LEFT, RIGHT, ZERO, RIGHT, LEFT, RIGHT, ZERO, RIGHT, LEFT, RIGHT, ZERO, RIGHT, LEFT, RIGHT, ZERO, RIGHT, LEFT, RIGHT, ZERO, ZERO }
+ },
+ { "Slide",
+ { LEFT, RIGHT, LEFT, RIGHT, ZERO, LEFT, RIGHT, LEFT, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, RIGHT, LEFT, ZERO }
+ },
+ { "SmallShip",
+ { ZERO, LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT, RIGHT, ZERO, LEFT, RIGHT, ZERO, LEFT, RIGHT, ZERO, RIGHT, LEFT, ZERO, LEFT, RIGHT, ZERO, LEFT, ZERO }
+ },
+ { "SnakeReadyToStrike",
+ { LEFT, ZERO, LEFT, ZERO, LEFT, ZERO, LEFT, RIGHT, ZERO, RIGHT, ZERO, RIGHT, ZERO, LEFT, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO, LEFT, ZERO }
+ },
+ { "Snakes14",
+ { RIGHT, RIGHT, PIN, ZERO, RIGHT, LEFT, RIGHT, ZERO, ZERO, ZERO, RIGHT, PIN, LEFT, PIN, ZERO, PIN, LEFT, PIN, RIGHT, ZERO, ZERO, LEFT, RIGHT, ZERO }
+ },
+ { "Snakes15",
+ { ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, PIN, LEFT, PIN, RIGHT, ZERO, ZERO, ZERO, PIN, RIGHT, ZERO }
+ },
+ { "Snakes18",
+ { PIN, PIN, LEFT, PIN, LEFT, PIN, RIGHT, ZERO, RIGHT, PIN, RIGHT, ZERO, RIGHT, PIN, LEFT, PIN, RIGHT, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO }
+ },
+ { "Snowflake",
+ { LEFT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, RIGHT, ZERO }
+ },
+ { "Snowman",
+ { ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO }
+ },
+ { "Source",
+ { PIN, RIGHT, ZERO, PIN, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, ZERO }
+ },
+ { "Spaceship",
+ { PIN, PIN, RIGHT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, PIN, RIGHT, PIN, PIN, ZERO }
+ },
+ { "Spaceship2",
+ { PIN, PIN, LEFT, PIN, LEFT, PIN, RIGHT, ZERO, PIN, PIN, ZERO, LEFT, PIN, RIGHT, ZERO, PIN, ZERO, LEFT, PIN, LEFT, LEFT, PIN, PIN, ZERO }
+ },
+ { "Speedboat",
+ { LEFT, ZERO, ZERO, LEFT, PIN, RIGHT, ZERO, ZERO, LEFT, ZERO, ZERO, PIN, ZERO, ZERO, RIGHT, ZERO, ZERO, LEFT, PIN, RIGHT, ZERO, ZERO, RIGHT, ZERO }
+ },
+ { "Speedboat2",
+ { PIN, RIGHT, LEFT, LEFT, RIGHT, RIGHT, RIGHT, ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, LEFT, LEFT, RIGHT, RIGHT, LEFT, PIN, ZERO, RIGHT, PIN, LEFT, ZERO }
+ },
+ { "Spider",
+ { RIGHT, RIGHT, ZERO, ZERO, LEFT, RIGHT, LEFT, PIN, ZERO, LEFT, ZERO, PIN, PIN, ZERO, RIGHT, ZERO, PIN, RIGHT, LEFT, RIGHT, ZERO, ZERO, LEFT, ZERO }
+ },
+ { "Spitzbergen",
+ { PIN, LEFT, ZERO, RIGHT, RIGHT, LEFT, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, ZERO, PIN, RIGHT, LEFT, LEFT, ZERO, ZERO }
+ },
+ { "Square",
+ { ZERO, ZERO, LEFT, LEFT, PIN, RIGHT, RIGHT, ZERO, ZERO, LEFT, LEFT, PIN, RIGHT, RIGHT, ZERO, ZERO, LEFT, LEFT, PIN, RIGHT, RIGHT, ZERO, ZERO, ZERO }
+ },
+ { "SquareHole",
+ { PIN, ZERO, PIN, ZERO, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, PIN, ZERO }
+ },
+ { "Stage",
+ { RIGHT, ZERO, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, LEFT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, ZERO, ZERO }
+ },
+ { "Stairs",
+ { ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, ZERO }
+ },
+ { "Stairs2",
+ { ZERO, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, ZERO }
+ },
+ { "Straight",
+ { ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO }
+ },
+ { "Swan",
+ { ZERO, PIN, ZERO, PIN, LEFT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, PIN, LEFT, PIN, LEFT, RIGHT, ZERO }
+ },
+ { "Swan2",
+ { PIN, ZERO, PIN, RIGHT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, RIGHT, PIN, ZERO, ZERO, ZERO, ZERO, ZERO, PIN, PIN, ZERO }
+ },
+ { "Swan3",
+ { PIN, PIN, ZERO, ZERO, ZERO, RIGHT, ZERO, RIGHT, ZERO, ZERO, LEFT, PIN, RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, RIGHT, ZERO, RIGHT, ZERO }
+ },
+ { "Symbol",
+ { RIGHT, RIGHT, PIN, ZERO, PIN, PIN, ZERO, PIN, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, ZERO, PIN, PIN, ZERO, PIN, LEFT, LEFT, RIGHT, ZERO }
+ },
+ { "Symmetry",
+ { RIGHT, ZERO, LEFT, RIGHT, LEFT, ZERO, LEFT, RIGHT, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, LEFT, RIGHT, ZERO, RIGHT, LEFT, RIGHT, ZERO, LEFT, ZERO }
+ },
+ { "Symmetry2",
+ { ZERO, PIN, LEFT, LEFT, PIN, ZERO, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, PIN, LEFT, ZERO }
+ },
+ { "TableFireworks",
+ { ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, RIGHT, PIN, RIGHT, LEFT, ZERO, RIGHT, PIN, ZERO }
+ },
+ { "Tapering",
+ { ZERO, ZERO, RIGHT, LEFT, PIN, LEFT, ZERO, PIN, PIN, ZERO, LEFT, PIN, RIGHT, ZERO, PIN, PIN, ZERO, RIGHT, PIN, RIGHT, LEFT, ZERO, ZERO, ZERO }
+ },
+ { "TaperingTurned",
+ { ZERO, ZERO, RIGHT, LEFT, PIN, LEFT, ZERO, PIN, PIN, ZERO, LEFT, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, RIGHT, PIN, RIGHT, LEFT, ZERO, ZERO, ZERO }
+ },
+ { "TeaLightStick",
+ { RIGHT, ZERO, PIN, PIN, ZERO, LEFT, RIGHT, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, ZERO }
+ },
+ { "thighmaster",
+ { RIGHT, ZERO, ZERO, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO, RIGHT, LEFT, ZERO, ZERO, RIGHT, LEFT, ZERO, ZERO, ZERO }
+ },
+ { "Terraces",
+ { RIGHT, LEFT, ZERO, RIGHT, LEFT, PIN, LEFT, LEFT, PIN, LEFT, RIGHT, RIGHT, RIGHT, LEFT, LEFT, LEFT, RIGHT, PIN, RIGHT, RIGHT, PIN, RIGHT, LEFT, ZERO }
+ },
+ { "Terrier",
+ { PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, ZERO }
+ },
+ { "Three-Legged",
+ { RIGHT, ZERO, LEFT, RIGHT, ZERO, LEFT, PIN, RIGHT, ZERO, RIGHT, ZERO, PIN, ZERO, LEFT, ZERO, LEFT, PIN, RIGHT, ZERO, LEFT, RIGHT, ZERO, LEFT, ZERO }
+ },
+ { "ThreePeaks",
+ { RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO, ZERO, LEFT, ZERO }
+ },
+ { "ToTheFront",
+ { ZERO, PIN, RIGHT, LEFT, LEFT, LEFT, PIN, RIGHT, LEFT, ZERO, PIN, PIN, ZERO, LEFT, LEFT, PIN, ZERO, LEFT, RIGHT, ZERO, PIN, ZERO, LEFT, ZERO }
+ },
+ { "Top",
+ { PIN, LEFT, LEFT, PIN, LEFT, ZERO, ZERO, RIGHT, LEFT, PIN, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, PIN, RIGHT, PIN, RIGHT, RIGHT, PIN, ZERO, ZERO }
+ },
+ { "Transport",
+ { PIN, ZERO, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO }
+ },
+ { "Triangle",
+ { ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, RIGHT, LEFT, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, RIGHT, LEFT, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, RIGHT, ZERO }
+ },
+ { "Tripple",
+ { PIN, ZERO, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, PIN, ZERO, PIN, LEFT, PIN, RIGHT, PIN, ZERO, PIN, LEFT, PIN, LEFT, PIN, RIGHT, PIN, ZERO }
+ },
+#if 0
+ { "Turtle",
+ { RIGHT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, PIN, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, ZERO, LEFT, RIGHT, ZERO, ZERO }
+ },
+#endif
+ { "Twins",
+ { ZERO, PIN, ZERO, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, PIN, ZERO, ZERO, PIN, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, ZERO, PIN, ZERO, ZERO, ZERO }
+ },
+ { "TwoSlants",
+ { ZERO, PIN, ZERO, ZERO, PIN, PIN, ZERO, PIN, ZERO, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO, ZERO, RIGHT, PIN, ZERO }
+ },
+ { "TwoWings",
+ { PIN, LEFT, ZERO, RIGHT, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, LEFT, ZERO, ZERO }
+ },
+ { "UFO",
+ { LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, LEFT, PIN, LEFT, LEFT, LEFT, RIGHT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO }
+ },
+ { "USS Enterprise",
+ { LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, ZERO, PIN, PIN, ZERO, RIGHT, LEFT, ZERO, PIN, PIN, ZERO, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, ZERO, ZERO }
+ },
+ { "UpAndDown",
+ { ZERO, PIN, ZERO, PIN, ZERO, PIN, LEFT, PIN, RIGHT, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, PIN, LEFT, PIN, RIGHT, PIN, ZERO, ZERO }
+ },
+ { "Upright",
+ { ZERO, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, PIN, ZERO, ZERO, LEFT, PIN, RIGHT, ZERO, ZERO, PIN, RIGHT, RIGHT, LEFT, RIGHT, LEFT, LEFT, ZERO, ZERO }
+ },
+ { "Upside-down",
+ { PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, RIGHT, RIGHT, LEFT, LEFT, PIN, RIGHT, RIGHT, LEFT, LEFT, ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN, ZERO }
+ },
+ { "Valley",
+ { ZERO, RIGHT, PIN, LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, RIGHT, ZERO, PIN, ZERO, LEFT, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, PIN, LEFT, ZERO, ZERO }
+ },
+ { "Viaduct",
+ { PIN, RIGHT, PIN, LEFT, PIN, ZERO, ZERO, PIN, RIGHT, ZERO, RIGHT, RIGHT, ZERO, RIGHT, PIN, ZERO, ZERO, PIN, LEFT, PIN, RIGHT, PIN, ZERO, ZERO }
+ },
+ { "View",
+ { ZERO, RIGHT, PIN, LEFT, PIN, RIGHT, ZERO, ZERO, RIGHT, PIN, LEFT, LEFT, RIGHT, RIGHT, PIN, LEFT, ZERO, ZERO, LEFT, PIN, RIGHT, PIN, LEFT, ZERO }
+ },
+ { "Waterfall",
+ { LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, ZERO }
+ },
+ { "windwheel",
+ { PIN, RIGHT, RIGHT, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, ZERO, ZERO }
+ },
+ { "Window",
+ { PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO, PIN, ZERO, PIN, PIN, ZERO, ZERO, ZERO, ZERO, ZERO }
+ },
+ { "WindowToTheWorld",
+ { PIN, LEFT, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, RIGHT, PIN, LEFT, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO, PIN, ZERO, ZERO }
+ },
+ { "Windshield",
+ { PIN, PIN, ZERO, RIGHT, PIN, LEFT, LEFT, PIN, RIGHT, ZERO, PIN, ZERO, LEFT, PIN, RIGHT, RIGHT, PIN, LEFT, ZERO, PIN, PIN, ZERO, PIN, ZERO }
+ },
+ { "WingNut",
+ { ZERO, ZERO, ZERO, ZERO, PIN, RIGHT, RIGHT, RIGHT, PIN, RIGHT, LEFT, PIN, LEFT, RIGHT, PIN, RIGHT, RIGHT, RIGHT, PIN, ZERO, ZERO, ZERO, ZERO, ZERO }
+ },
+ { "Wings2",
+ { RIGHT, ZERO, PIN, ZERO, LEFT, PIN, RIGHT, PIN, RIGHT, LEFT, RIGHT, RIGHT, LEFT, LEFT, RIGHT, LEFT, PIN, LEFT, PIN, RIGHT, ZERO, PIN, ZERO, ZERO }
+ },
+ { "WithoutName",
+ { PIN, RIGHT, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, ZERO, PIN, RIGHT, PIN, LEFT, PIN, ZERO, PIN, RIGHT, RIGHT, PIN, LEFT, LEFT, PIN, ZERO }
+ },
+ { "Wolf",
+ { ZERO, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, ZERO, PIN, PIN, ZERO, ZERO, ZERO, PIN, ZERO }
+ },
+ { "X",
+ { LEFT, ZERO, ZERO, PIN, LEFT, RIGHT, RIGHT, PIN, LEFT, RIGHT, ZERO, PIN, PIN, ZERO, LEFT, RIGHT, PIN, LEFT, LEFT, RIGHT, PIN, ZERO, ZERO, ZERO }
+ },
+};
+
+static size_t models = sizeof(model) / sizeof(struct model_s);
+
+#define VOFFSET 0.045
+
+#define X_MASK 1
+#define Y_MASK 2
+#define Z_MASK 4
+
+/* the connecting string that holds the snake together */
+#define MAGICAL_RED_STRING 0
+
+#define GETSCALAR(vec,mask) ((vec)==(mask) ? 1 : ((vec)==-(mask) ? -1 : 0 ))
+
+#ifndef MAX
+# define MAX(x, y) ((x) > (y) ? (x) : (y))
+#endif
+#ifndef MIN
+# define MIN(x, y) ((x) < (y) ? (x) : (y))
+#endif
+
+#define RAND(n) ((random() & 0x7fffffff) % ((long) (n)))
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+/* the triangular prism what makes up the basic unit */
+static const float solid_prism_v[][3] = {
+ /* first corner, bottom left front */
+ { VOFFSET, VOFFSET, 1.0 },
+ { VOFFSET, 0.00, 1.0 - VOFFSET },
+ { 0.00, VOFFSET, 1.0 - VOFFSET },
+ /* second corner, rear */
+ { VOFFSET, VOFFSET, 0.00 },
+ { VOFFSET, 0.00, VOFFSET },
+ { 0.00, VOFFSET, VOFFSET },
+ /* third, right front */
+ { 1.0 - VOFFSET / M_SQRT1_2, VOFFSET, 1.0 },
+ { 1.0 - VOFFSET / M_SQRT1_2, 0.0, 1.0 - VOFFSET },
+ { 1.0 - VOFFSET * M_SQRT1_2, VOFFSET, 1.0 - VOFFSET },
+ /* fourth, right rear */
+ { 1.0 - VOFFSET / M_SQRT1_2, VOFFSET, 0.0 },
+ { 1.0 - VOFFSET / M_SQRT1_2, 0.0, VOFFSET },
+ { 1.0 - VOFFSET * M_SQRT1_2, VOFFSET, VOFFSET },
+ /* fifth, upper front */
+ { VOFFSET, 1.0 - VOFFSET / M_SQRT1_2, 1.0 },
+ { VOFFSET / M_SQRT1_2, 1.0 - VOFFSET * M_SQRT1_2, 1.0 - VOFFSET },
+ { 0.0, 1.0 - VOFFSET / M_SQRT1_2, 1.0 - VOFFSET},
+ /* sixth, upper rear */
+ { VOFFSET, 1.0 - VOFFSET / M_SQRT1_2, 0.0 },
+ { VOFFSET / M_SQRT1_2, 1.0 - VOFFSET * M_SQRT1_2, VOFFSET },
+ { 0.0, 1.0 - VOFFSET / M_SQRT1_2, VOFFSET }};
+
+static const float solid_prism_n[][3] = {/* corners */
+ { -VOFFSET, -VOFFSET, VOFFSET },
+ { VOFFSET, -VOFFSET, VOFFSET },
+ { -VOFFSET, VOFFSET, VOFFSET },
+ { -VOFFSET, -VOFFSET, -VOFFSET },
+ { VOFFSET, -VOFFSET, -VOFFSET },
+ { -VOFFSET, VOFFSET, -VOFFSET },
+ /* edges */
+ { -VOFFSET, 0.0, VOFFSET },
+ { 0.0, -VOFFSET, VOFFSET },
+ { VOFFSET, VOFFSET, VOFFSET },
+ { -VOFFSET, 0.0, -VOFFSET },
+ { 0.0, -VOFFSET, -VOFFSET },
+ { VOFFSET, VOFFSET, -VOFFSET },
+ { -VOFFSET, -VOFFSET, 0.0 },
+ { VOFFSET, -VOFFSET, 0.0 },
+ { -VOFFSET, VOFFSET, 0.0 },
+ /* faces */
+ { 0.0, 0.0, 1.0 },
+ { 0.0, -1.0, 0.0 },
+ { M_SQRT1_2, M_SQRT1_2, 0.0 },
+ { -1.0, 0.0, 0.0 },
+ { 0.0, 0.0, -1.0 }};
+
+static const float wire_prism_v[][3] = {{ 0.0, 0.0, 1.0 },
+ { 1.0, 0.0, 1.0 },
+ { 0.0, 1.0, 1.0 },
+ { 0.0, 0.0, 0.0 },
+ { 1.0, 0.0, 0.0 },
+ { 0.0, 1.0, 0.0 }};
+
+/*
+static const float wire_prism_n[][3] = {{ 0.0, 0.0, 1.0},
+ { 0.0,-1.0, 0.0},
+ { M_SQRT1_2, M_SQRT1_2, 0.0},
+ {-1.0, 0.0, 0.0},
+ { 0.0, 0.0,-1.0}};
+*/
+
+static struct glsnake_cfg * glc = NULL;
+#ifdef HAVE_GLUT
+# define bp glc
+#endif
+
+typedef float (*morphFunc)(long);
+
+#ifdef HAVE_GLUT
+/* forward definitions for GLUT functions */
+static void calc_rotation();
+static inline void ui_mousedrag();
+#endif
+
+static const GLfloat white_light[] = { 1.0, 1.0, 1.0, 1.0 };
+static const GLfloat lmodel_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
+static const GLfloat mat_specular[] = { 0.1, 0.1, 0.1, 1.0 };
+static const GLfloat mat_shininess[] = { 20.0 };
+
+static void gl_init(
+#ifndef HAVE_GLUT
+ ModeInfo * mi
+#endif
+ )
+{
+ float light_pos[][3] = {{0.0, 10.0, 20.0}, {0.0, 20.0, -1.0}};
+ float light_dir[][3] = {{0.0, -10.0,-20.0}, {0.0,-20.0, 1.0}};
+
+ glEnable(GL_DEPTH_TEST);
+ glShadeModel(GL_SMOOTH);
+ glCullFace(GL_BACK);
+ /*glEnable(GL_CULL_FACE);*/
+ glEnable(GL_NORMALIZE);
+ if (transparent) {
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ }
+
+ if (!wireframe) {
+ /*glColor4f(1.0, 1.0, 1.0, 1.0);*/
+ glLightfv(GL_LIGHT0, GL_POSITION, light_pos[0]);
+ glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, light_dir[0]);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light);
+ /*glLightfv(GL_LIGHT0, GL_SPECULAR, white_light);*/
+#if 1
+ glLightfv(GL_LIGHT1, GL_POSITION, light_pos[1]);
+ glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, light_dir[1]);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, white_light);
+ glLightfv(GL_LIGHT1, GL_SPECULAR, white_light);
+#endif
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
+ glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ /*glEnable(GL_COLOR_MATERIAL);*/
+ }
+}
+
+static void gettime(snaketime *t)
+{
+#ifdef HAVE_GETTIMEOFDAY
+#ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(t, &tzp);
+#else /* !GETTIMEOFDAY_TWO_ARGS */
+ gettimeofday(t);
+#endif /* !GETTIMEOFDAY_TWO_ARGS */
+#else /* !HAVE_GETTIMEOFDAY */
+#ifdef HAVE_FTIME
+ ftime(t);
+#endif /* HAVE_FTIME */
+#endif /* !HAVE_GETTIMEOFDAY */
+}
+
+
+ENTRYPOINT void glsnake_reshape(
+#ifndef HAVE_GLUT
+ ModeInfo * mi,
+#endif
+ int w, int h);
+
+static void start_morph(struct glsnake_cfg *,
+ unsigned int model_index, int immediate);
+
+/* wot initialises it */
+ENTRYPOINT void glsnake_init(
+#ifndef HAVE_GLUT
+ModeInfo * mi
+#endif
+)
+{
+#ifndef HAVE_GLUT
+ struct glsnake_cfg * bp;
+
+ /* set up the conf struct and glx contexts */
+ MI_INIT(mi, glc);
+ bp = &glc[MI_SCREEN(mi)];
+
+ if ((bp->glx_context = init_GL(mi)) != NULL) {
+ gl_init(mi);
+ glsnake_reshape(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+#else
+ gl_init();
+#endif
+
+ /* initialise conf struct */
+ memset(&bp->node, 0, sizeof(float) * NODE_COUNT);
+
+ bp->selected = 11;
+ bp->is_cyclic = 0;
+ bp->is_legal = 1;
+ bp->last_turn = -1;
+ bp->morphing = 0;
+ bp->paused = 0;
+ bp->new_morph = 0;
+
+ gettime(&bp->last_iteration);
+ memcpy(&bp->last_morph, &bp->last_iteration, sizeof(bp->last_morph));
+
+ bp->prev_colour = bp->next_colour = COLOUR_ACYCLIC;
+ bp->next_model = RAND(models);
+ bp->prev_model = START_MODEL;
+ start_morph(bp, bp->prev_model, 1);
+
+ /* set up a font for the labels */
+#ifndef HAVE_GLUT
+ if (titles)
+ bp->font_data = load_texture_font (mi->dpy, "labelfont");
+#endif
+
+ /* build a solid display list */
+ bp->node_solid = glGenLists(1);
+ glNewList(bp->node_solid, GL_COMPILE);
+ /* corners */
+ glBegin(GL_TRIANGLES);
+ glNormal3fv(solid_prism_n[0]);
+ glVertex3fv(solid_prism_v[0]);
+ glVertex3fv(solid_prism_v[2]);
+ glVertex3fv(solid_prism_v[1]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[1]);
+ glVertex3fv(solid_prism_v[6]);
+ glVertex3fv(solid_prism_v[7]);
+ glVertex3fv(solid_prism_v[8]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[2]);
+ glVertex3fv(solid_prism_v[12]);
+ glVertex3fv(solid_prism_v[13]);
+ glVertex3fv(solid_prism_v[14]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[3]);
+ glVertex3fv(solid_prism_v[3]);
+ glVertex3fv(solid_prism_v[4]);
+ glVertex3fv(solid_prism_v[5]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[4]);
+ glVertex3fv(solid_prism_v[9]);
+ glVertex3fv(solid_prism_v[11]);
+ glVertex3fv(solid_prism_v[10]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[5]);
+ glVertex3fv(solid_prism_v[16]);
+ glVertex3fv(solid_prism_v[15]);
+ glVertex3fv(solid_prism_v[17]);
+ bp->node_polys++;
+ glEnd();
+
+ /* edges */
+ glBegin(GL_QUADS);
+ glNormal3fv(solid_prism_n[6]);
+ glVertex3fv(solid_prism_v[0]);
+ glVertex3fv(solid_prism_v[12]);
+ glVertex3fv(solid_prism_v[14]);
+ glVertex3fv(solid_prism_v[2]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[7]);
+ glVertex3fv(solid_prism_v[0]);
+ glVertex3fv(solid_prism_v[1]);
+ glVertex3fv(solid_prism_v[7]);
+ glVertex3fv(solid_prism_v[6]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[8]);
+ glVertex3fv(solid_prism_v[6]);
+ glVertex3fv(solid_prism_v[8]);
+ glVertex3fv(solid_prism_v[13]);
+ glVertex3fv(solid_prism_v[12]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[9]);
+ glVertex3fv(solid_prism_v[3]);
+ glVertex3fv(solid_prism_v[5]);
+ glVertex3fv(solid_prism_v[17]);
+ glVertex3fv(solid_prism_v[15]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[10]);
+ glVertex3fv(solid_prism_v[3]);
+ glVertex3fv(solid_prism_v[9]);
+ glVertex3fv(solid_prism_v[10]);
+ glVertex3fv(solid_prism_v[4]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[11]);
+ glVertex3fv(solid_prism_v[15]);
+ glVertex3fv(solid_prism_v[16]);
+ glVertex3fv(solid_prism_v[11]);
+ glVertex3fv(solid_prism_v[9]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[12]);
+ glVertex3fv(solid_prism_v[1]);
+ glVertex3fv(solid_prism_v[2]);
+ glVertex3fv(solid_prism_v[5]);
+ glVertex3fv(solid_prism_v[4]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[13]);
+ glVertex3fv(solid_prism_v[8]);
+ glVertex3fv(solid_prism_v[7]);
+ glVertex3fv(solid_prism_v[10]);
+ glVertex3fv(solid_prism_v[11]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[14]);
+ glVertex3fv(solid_prism_v[13]);
+ glVertex3fv(solid_prism_v[16]);
+ glVertex3fv(solid_prism_v[17]);
+ glVertex3fv(solid_prism_v[14]);
+ bp->node_polys++;
+ glEnd();
+
+ /* faces */
+ glBegin(GL_TRIANGLES);
+ glNormal3fv(solid_prism_n[15]);
+ glVertex3fv(solid_prism_v[0]);
+ glVertex3fv(solid_prism_v[6]);
+ glVertex3fv(solid_prism_v[12]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[19]);
+ glVertex3fv(solid_prism_v[3]);
+ glVertex3fv(solid_prism_v[15]);
+ glVertex3fv(solid_prism_v[9]);
+ bp->node_polys++;
+ glEnd();
+
+ glBegin(GL_QUADS);
+ glNormal3fv(solid_prism_n[16]);
+ glVertex3fv(solid_prism_v[1]);
+ glVertex3fv(solid_prism_v[4]);
+ glVertex3fv(solid_prism_v[10]);
+ glVertex3fv(solid_prism_v[7]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[17]);
+ glVertex3fv(solid_prism_v[8]);
+ glVertex3fv(solid_prism_v[11]);
+ glVertex3fv(solid_prism_v[16]);
+ glVertex3fv(solid_prism_v[13]);
+ bp->node_polys++;
+
+ glNormal3fv(solid_prism_n[18]);
+ glVertex3fv(solid_prism_v[2]);
+ glVertex3fv(solid_prism_v[14]);
+ glVertex3fv(solid_prism_v[17]);
+ glVertex3fv(solid_prism_v[5]);
+ bp->node_polys++;
+ glEnd();
+ glEndList();
+
+ /* build wire display list */
+ bp->node_wire = glGenLists(1);
+ glNewList(bp->node_wire, GL_COMPILE);
+ glBegin(GL_LINE_STRIP);
+ glVertex3fv(wire_prism_v[0]);
+ glVertex3fv(wire_prism_v[1]);
+ bp->node_polys++;
+ glVertex3fv(wire_prism_v[2]);
+ glVertex3fv(wire_prism_v[0]);
+ bp->node_polys++;
+ glVertex3fv(wire_prism_v[3]);
+ glVertex3fv(wire_prism_v[4]);
+ bp->node_polys++;
+ glVertex3fv(wire_prism_v[5]);
+ glVertex3fv(wire_prism_v[3]);
+ bp->node_polys++;
+ glEnd();
+ glBegin(GL_LINES);
+ glVertex3fv(wire_prism_v[1]);
+ glVertex3fv(wire_prism_v[4]);
+ bp->node_polys++;
+ glVertex3fv(wire_prism_v[2]);
+ glVertex3fv(wire_prism_v[5]);
+ bp->node_polys++;
+ glEnd();
+ glEndList();
+
+#ifdef HAVE_GLUT
+ /* initialise the rotation */
+ calc_rotation();
+#endif
+}
+
+static void draw_title(
+#ifndef HAVE_GLUT
+ ModeInfo * mi
+#endif
+ )
+{
+#ifndef HAVE_GLUT
+ struct glsnake_cfg * bp = &glc[MI_SCREEN(mi)];
+#endif
+
+ /* draw some text */
+
+/* glPushAttrib((GLbitfield) GL_TRANSFORM_BIT | GL_ENABLE_BIT);*/
+ glDisable(GL_LIGHTING);
+ glDisable(GL_DEPTH_TEST);
+ if (transparent) {
+ glDisable(GL_BLEND);
+ }
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glLoadIdentity();
+#ifdef HAVE_GLUT
+ glOrtho((GLdouble) 0., (GLdouble) bp->width, (GLdouble) 0., (GLdouble) bp->height, -1, 1);
+#else
+ glOrtho((GLdouble) 0., (GLdouble) mi->xgwa.width, (GLdouble) 0., (GLdouble) mi->xgwa.height, -1, 1);
+#endif
+
+ glColor4f(1.0, 1.0, 1.0, 1.0);
+ {
+ char interactstr[] = "interactive";
+ const char * s;
+#ifdef HAVE_GLUT
+ int w;
+#endif
+
+ if (interactive)
+ s = interactstr;
+ else
+ s = model[bp->next_model].name;
+
+#ifdef HAVE_GLUT
+ {
+ unsigned int i = 0;
+
+ w = glutBitmapLength(GLUT_BITMAP_HELVETICA_12, (const unsigned char *) s);
+ glRasterPos2f((GLfloat) (bp->width - w - 3), 4.0);
+ while (s[i] != '\0')
+ glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, s[i++]);
+ }
+#else
+ print_texture_label (mi->dpy, bp->font_data,
+ mi->xgwa.width, mi->xgwa.height,
+ 1, s);
+#endif
+ }
+ glPopMatrix();
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+
+
+/* glPopAttrib();*/
+}
+
+/* apply the matrix to the origin and stick it in vec */
+static void matmult_origin(float rotmat[16], float vec[4])
+{
+#if 1
+ vec[0] = 0.5 * rotmat[0] + 0.5 * rotmat[4] + 0.5 * rotmat [8] + 1 * rotmat[12];
+ vec[1] = 0.5 * rotmat[1] + 0.5 * rotmat[5] + 0.5 * rotmat [9] + 1 * rotmat[13];
+ vec[2] = 0.5 * rotmat[2] + 0.5 * rotmat[6] + 0.5 * rotmat[10] + 1 * rotmat[14];
+ vec[3] = 0.5 * rotmat[3] + 0.5 * rotmat[7] + 0.5 * rotmat[11] + 1 * rotmat[15];
+#else
+ vec[0] = 0 * rotmat [0] + 0 * rotmat [1] + 0 * rotmat [2] + 1 * rotmat [3];
+ vec[1] = 0 * rotmat [4] + 0 * rotmat [5] + 0 * rotmat [6] + 1 * rotmat [7];
+ vec[2] = 0 * rotmat [8] + 0 * rotmat [9] + 0 * rotmat[10] + 1 * rotmat[11];
+ vec[3] = 0 * rotmat[12] + 0 * rotmat[13] + 0 * rotmat[14] + 1 * rotmat[15];
+#endif
+ vec[0] /= vec[3];
+ vec[1] /= vec[3];
+ vec[2] /= vec[3];
+ vec[3] = 1.0;
+}
+
+/* wot gets called when the winder is resized */
+ENTRYPOINT void glsnake_reshape(
+#ifndef HAVE_GLUT
+ ModeInfo * mi,
+#endif
+ int width, int height)
+{
+ double h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0, y, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ /* jwz: 0.05 was too close (left black rectangles) */
+ gluPerspective(zoom, 1/h, 1.0, 100.0);
+ gluLookAt(0.0, 0.0, 20.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
+ glMatrixMode(GL_MODELVIEW);
+ /*gluLookAt(0.0, 0.0, 20.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);*/
+ glLoadIdentity();
+#ifdef HAVE_GLUT
+ bp->width = width;
+ bp->height = height;
+#endif
+}
+
+/* Returns the new dst_dir for the given src_dir and dst_dir */
+static int cross_product(int src_dir, int dst_dir)
+{
+ return X_MASK*(GETSCALAR(src_dir,Y_MASK) * GETSCALAR(dst_dir,Z_MASK) -
+ GETSCALAR(src_dir,Z_MASK) * GETSCALAR(dst_dir,Y_MASK))+
+ Y_MASK*(GETSCALAR(src_dir,Z_MASK) * GETSCALAR(dst_dir,X_MASK) -
+ GETSCALAR(src_dir,X_MASK) * GETSCALAR(dst_dir,Z_MASK))+
+ Z_MASK*(GETSCALAR(src_dir,X_MASK) * GETSCALAR(dst_dir,Y_MASK) -
+ GETSCALAR(src_dir,Y_MASK) * GETSCALAR(dst_dir,X_MASK));
+}
+
+/* calculate orthogonal snake metrics
+ * is_legal = true if model does not pass through itself
+ * is_cyclic = true if last node connects back to first node
+ * last_turn = for cyclic snakes, specifes what the 24th turn would be
+ */
+static void calc_snake_metrics(struct glsnake_cfg *bp)
+{
+ int srcDir, dstDir;
+ int i, x, y, z;
+ int prevSrcDir = -Y_MASK;
+ int prevDstDir = Z_MASK;
+ int grid[25][25][25];
+
+ /* zero the grid */
+ memset(&grid, 0, sizeof(int) * 25*25*25);
+
+ bp->is_legal = 1;
+ x = y = z = 12;
+
+ /* trace path of snake - and keep record for is_legal */
+ for (i = 0; i < NODE_COUNT - 1; i++) {
+ /*int ang_card;*/ /* cardinal direction of node angle */
+ /* establish new state vars */
+ srcDir = -prevDstDir;
+ x += GETSCALAR(prevDstDir, X_MASK);
+ y += GETSCALAR(prevDstDir, Y_MASK);
+ z += GETSCALAR(prevDstDir, Z_MASK);
+
+ switch ((int) model[bp->next_model].node[i]) {
+ case (int) (ZERO):
+ dstDir = -prevSrcDir;
+ break;
+ case (int) (PIN):
+ dstDir = prevSrcDir;
+ break;
+ case (int) (RIGHT):
+ case (int) (LEFT):
+ dstDir = cross_product(prevSrcDir, prevDstDir);
+ if (model[bp->next_model].node[i] == (int) (RIGHT))
+ dstDir = -dstDir;
+ break;
+ default:
+ /* Prevent spurious "might be used
+ * uninitialised" warnings when compiling
+ * with -O2 */
+ dstDir = 0;
+ break;
+ }
+
+ if (grid[x][y][z] == 0)
+ grid[x][y][z] = srcDir + dstDir;
+ else if (grid[x][y][z] + srcDir + dstDir == 0)
+ grid[x][y][z] = 8;
+ else
+ bp->is_legal = 0;
+
+ prevSrcDir = srcDir;
+ prevDstDir = dstDir;
+ }
+
+ /* determine if the snake is cyclic */
+ bp->is_cyclic = (dstDir == Y_MASK && x == 12 && y == 11 && z == 12);
+
+ /* determine last_turn */
+ bp->last_turn = -1;
+ if (bp->is_cyclic)
+ switch (srcDir) {
+ case -Z_MASK: bp->last_turn = ZERO; break;
+ case Z_MASK: bp->last_turn = PIN; break;
+ case X_MASK: bp->last_turn = LEFT; break;
+ case -X_MASK: bp->last_turn = RIGHT; break;
+ }
+}
+
+/* work out how far through the current morph we are */
+static float morph_percent(struct glsnake_cfg *bp)
+{
+ float retval;
+ int i;
+
+ /* extend this function later with a case statement for each of the
+ * morph schemes */
+
+ /* when morphing all nodes at once, the longest morph will be the node
+ * that needs to rotate 180 degrees. For each node, work out how far it
+ * has to go, and store the maximum rotation and current largest angular
+ * difference, returning the angular difference over the maximum. */
+ {
+ float rot_max = 0.0, ang_diff_max = 0.0;
+
+ for (i = 0; i < NODE_COUNT - 1; i++) {
+ float rot, ang_diff;
+
+ /* work out the maximum rotation this node has to go through
+ * from the previous to the next model, taking into account that
+ * the snake always morphs through the smaller angle */
+ rot = fabs(model[bp->prev_model].node[i] -
+ model[bp->next_model].node[i]);
+ if (rot > 180.0) rot = 180.0 - rot;
+ /* work out the difference between the current position and the
+ * target */
+ ang_diff = fabs(bp->node[i] -
+ model[bp->next_model].node[i]);
+ if (ang_diff > 180.0) ang_diff = 180.0 - ang_diff;
+ /* if it's the biggest so far, record it */
+ if (rot > rot_max) rot_max = rot;
+ if (ang_diff > ang_diff_max) ang_diff_max = ang_diff;
+ }
+
+ /* ang_diff / rot approaches 0, we want the complement */
+ retval = 1.0 - (ang_diff_max / rot_max);
+ /* protect against naan */
+
+/* Apparently some systems (Solaris) don't have isinf() */
+#undef isinf
+#define isinf(x) (((x) > 999999999999.9) || ((x) < -999999999999.9))
+
+ if (isnan(retval) || isinf(retval)) retval = 1.0;
+ }
+ /*printf("morph_pct = %f\n", retval);*/
+ return retval;
+}
+
+static void morph_colour(struct glsnake_cfg *bp)
+{
+ float percent, compct; /* complement of percentage */
+
+ percent = morph_percent(bp);
+ compct = 1.0 - percent;
+
+ bp->colour[0][0] = colour[bp->prev_colour][0][0] * compct + colour[bp->next_colour][0][0] * percent;
+ bp->colour[0][1] = colour[bp->prev_colour][0][1] * compct + colour[bp->next_colour][0][1] * percent;
+ bp->colour[0][2] = colour[bp->prev_colour][0][2] * compct + colour[bp->next_colour][0][2] * percent;
+ bp->colour[0][3] = colour[bp->prev_colour][0][3] * compct + colour[bp->next_colour][0][3] * percent;
+
+ bp->colour[1][0] = colour[bp->prev_colour][1][0] * compct + colour[bp->next_colour][1][0] * percent;
+ bp->colour[1][1] = colour[bp->prev_colour][1][1] * compct + colour[bp->next_colour][1][1] * percent;
+ bp->colour[1][2] = colour[bp->prev_colour][1][2] * compct + colour[bp->next_colour][1][2] * percent;
+ bp->colour[1][3] = colour[bp->prev_colour][1][3] * compct + colour[bp->next_colour][1][3] * percent;
+}
+
+/* Start morph process to this model */
+static void start_morph(struct glsnake_cfg *bp,
+ unsigned int model_index, int immediate)
+{
+ /* if immediate, don't bother morphing, go straight to the next model */
+ if (immediate) {
+ int i;
+
+ for (i = 0; i < NODE_COUNT; i++)
+ bp->node[i] = model[model_index].node[i];
+ }
+
+ bp->prev_model = bp->next_model;
+ bp->next_model = model_index;
+ bp->prev_colour = bp->next_colour;
+
+ calc_snake_metrics(bp);
+ if (!bp->is_legal)
+ bp->next_colour = COLOUR_INVALID;
+ else if (altcolour)
+ bp->next_colour = COLOUR_AUTHENTIC;
+ else if (bp->is_cyclic)
+ bp->next_colour = COLOUR_CYCLIC;
+ else
+ bp->next_colour = COLOUR_ACYCLIC;
+
+ if (immediate) {
+ bp->colour[0][0] = colour[bp->next_colour][0][0];
+ bp->colour[0][1] = colour[bp->next_colour][0][1];
+ bp->colour[0][2] = colour[bp->next_colour][0][2];
+ bp->colour[0][3] = colour[bp->next_colour][0][3];
+ bp->colour[1][0] = colour[bp->next_colour][1][0];
+ bp->colour[1][1] = colour[bp->next_colour][1][1];
+ bp->colour[1][2] = colour[bp->next_colour][1][2];
+ bp->colour[1][3] = colour[bp->next_colour][1][3];
+ }
+ bp->morphing = 1;
+
+ morph_colour(bp);
+}
+
+#if 0
+/* Returns morph progress */
+static float morph(long iter_msec)
+{
+ /* work out the maximum angle for this iteration */
+ int still_morphing;
+ float iter_angle_max, largest_diff, largest_progress;
+ int i;
+
+ if (bp->new_morph)
+ bp->new_morph = 0;
+
+ iter_angle_max = 90.0 * (angvel/1000.0) * iter_msec;
+
+ still_morphing = 0;
+ largest_diff = largest_progress = 0.0;
+ for (i = 0; i < NODE_COUNT; i++) {
+ float curAngle = bp->node[i];
+ float destAngle = model[bp->next_model].node[i];
+ if (curAngle != destAngle) {
+ still_morphing = 1;
+ if (fabs(curAngle-destAngle) <= iter_angle_max)
+ bp->node[i] = destAngle;
+ else if (fmod(curAngle-destAngle+360,360) > 180)
+ bp->node[i] = fmod(curAngle + iter_angle_max, 360);
+ else
+ bp->node[i] = fmod(curAngle+360 - iter_angle_max, 360);
+ largest_diff = MAX(largest_diff, fabs(destAngle-bp->node[i]));
+ largest_progress = MAX(largest_diff, fabs(bp->node[i] - model[bp->prev_model].node[i]));
+ }
+ }
+
+ return MIN(largest_diff / largest_progress, 1.0);
+}
+#endif
+
+
+#ifdef HAVE_GLUT
+static void glsnake_idle();
+
+static restore_idle(int v __attribute__((__unused__)))
+{
+ glutIdleFunc(glsnake_idle);
+}
+#endif
+
+static void quick_sleep(void)
+{
+#ifdef HAVE_GLUT
+ /* By using glutTimerFunc we can keep responding to
+ * mouse and keyboard events, unlike using something like
+ * usleep. */
+ glutIdleFunc(NULL);
+ glutTimerFunc(1, restore_idle, 0);
+#else
+ usleep(1);
+#endif
+}
+
+static void glsnake_idle(
+#ifndef HAVE_GLUT
+ struct glsnake_cfg * bp
+#endif
+ )
+{
+ /* time since last iteration */
+ long iter_msec;
+ /* time since the beginning of last morph */
+ long morf_msec;
+ float iter_angle_max;
+ snaketime current_time;
+ /* morphFunc transition; */
+ int still_morphing;
+ int i;
+
+ /* Do nothing to the model if we are paused */
+ if (bp->paused) {
+ /* Avoid busy waiting when nothing is changing */
+ quick_sleep();
+#ifdef HAVE_GLUT
+ glutSwapBuffers();
+ glutPostRedisplay();
+#endif
+ return;
+ }
+
+ /* <spiv> Well, ftime gives time with millisecond resolution.
+ * <spiv> (or worse, perhaps... who knows what the OS will do)
+ * <spiv> So if no discernable amount of time has passed:
+ * <spiv> a) There's no point updating the screen, because
+ * it would be the same
+ * <spiv> b) The code will divide by zero
+ */
+ gettime(&current_time);
+
+ iter_msec = (long) GETMSECS(current_time) - GETMSECS(bp->last_iteration) +
+ ((long) GETSECS(current_time) - GETSECS(bp->last_iteration)) * 1000L;
+
+ if (iter_msec) {
+ /* save the current time */
+ memcpy(&bp->last_iteration, &current_time, sizeof(snaketime));
+
+ /* work out if we have to switch models */
+ morf_msec = GETMSECS(bp->last_iteration) - GETMSECS(bp->last_morph) +
+ ((long) (GETSECS(bp->last_iteration)-GETSECS(bp->last_morph)) * 1000L);
+
+ if ((morf_msec > statictime) && !interactive && !bp->morphing) {
+ /*printf("starting morph\n");*/
+ memcpy(&bp->last_morph, &(bp->last_iteration), sizeof(bp->last_morph));
+ start_morph(bp, RAND(models), 0);
+ }
+
+ if (interactive && !bp->morphing) {
+ quick_sleep();
+ return;
+ }
+
+ /* if (!bp->dragging && !bp->interactive) { */
+ if (!interactive) {
+
+ yspin += 360/((1000/yangvel)/iter_msec);
+ zspin += 360/((1000/zangvel)/iter_msec);
+ /*
+ yspin += 360 * (yangvel/1000.0) * iter_msec;
+ zspin += 360 * (zangvel/1000.0) * iter_msec;
+ */
+
+ /*printf("yspin: %f, zspin: %f\n", yspin, zspin);*/
+
+ }
+
+ /* work out the maximum angle we could turn this node in this
+ * timeslice, iter_msec milliseconds long */
+ iter_angle_max = 90.0 * (angvel/1000.0) * iter_msec;
+
+ still_morphing = 0;
+ for (i = 0; i < NODE_COUNT; i++) {
+ float cur_angle = bp->node[i];
+ float dest_angle = model[bp->next_model].node[i];
+ if (cur_angle != dest_angle) {
+ still_morphing = 1;
+ if (fabs(cur_angle - dest_angle) <= iter_angle_max)
+ bp->node[i] = dest_angle;
+ else if (fmod(cur_angle - dest_angle + 360, 360) > 180)
+ bp->node[i] = fmod(cur_angle + iter_angle_max, 360);
+ else
+ bp->node[i] = fmod(cur_angle + 360 - iter_angle_max, 360);
+ }
+ }
+
+ if (!still_morphing)
+ bp->morphing = 0;
+
+ /* colour cycling */
+ morph_colour(bp);
+
+#ifdef HAVE_GLUT
+ glutSwapBuffers();
+ glutPostRedisplay();
+#endif
+ } else {
+ /* We are going too fast, so we may as well let the
+ * cpu relax a little by sleeping for a millisecond. */
+ quick_sleep();
+ }
+}
+
+/* wot draws it */
+ENTRYPOINT void glsnake_display(
+#ifndef HAVE_GLUT
+ ModeInfo * mi
+#endif
+ )
+{
+#ifndef HAVE_GLUT
+ struct glsnake_cfg * bp = &glc[MI_SCREEN(mi)];
+ Display * dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+#endif
+
+ int i;
+ float ang;
+ float positions[NODE_COUNT][4]; /* origin points for each node */
+ float com[4]; /* it's the CENTRE of MASS */
+
+#ifndef HAVE_GLUT
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+#endif
+
+ gl_init(mi);
+
+ /* clear the buffer */
+ glClear((GLbitfield) GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /* go into the modelview stack */
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ /* get the centre of each node, by moving through the snake and
+ * performing the rotations, then grabbing the matrix at each point
+ * and applying it to the origin */
+ glPushMatrix();
+
+#ifdef HAVE_GLUT
+ /* apply the mouse drag rotation */
+ ui_mousedrag();
+#endif
+
+ /* apply the continuous rotation */
+ glRotatef(yspin, 0.0, 1.0, 0.0);
+ glRotatef(zspin, 0.0, 0.0, 1.0);
+
+ com[0] = 0.0;
+ com[1] = 0.0;
+ com[2] = 0.0;
+ com[3] = 0.0;
+ for (i = 0; i < NODE_COUNT; i++) {
+ float rotmat[16];
+
+ ang = bp->node[i];
+
+ /*printf("ang = %f\n", ang);*/
+
+ glTranslatef(0.5, 0.5, 0.5); /* move to center */
+ glRotatef(90.0, 0.0, 0.0, -1.0); /* reorient */
+ glTranslatef(1.0 + explode, 0.0, 0.0); /* move to new pos. */
+ glRotatef(180.0 + ang, 1.0, 0.0, 0.0); /* pivot to new angle */
+ glTranslatef(-0.5, -0.5, -0.5); /* return from center */
+
+ glGetFloatv(GL_MODELVIEW_MATRIX, rotmat);
+
+ matmult_origin(rotmat, positions[i]);
+
+ /*printf("positions %f %f %f %f\n", positions[i][0], positions[i][1], positions[i][2], positions[i][3]);*/
+
+ com[0] += positions[i][0];
+ com[1] += positions[i][1];
+ com[2] += positions[i][2];
+ com[3] += positions[i][3];
+ }
+ glPopMatrix();
+ com[0] /= NODE_COUNT;
+ com[1] /= NODE_COUNT;
+ com[2] /= NODE_COUNT;
+ com[3] /= NODE_COUNT;
+
+ com[0] /= com[3];
+ com[1] /= com[3];
+ com[2] /= com[3];
+
+ /*printf("com: %f, %f, %f, %f\n", com[0], com[1], com[2], com[3]);*/
+
+#if MAGICAL_RED_STRING
+ glPushMatrix();
+ glTranslatef(-com[0], -com[1], -com[2]);
+
+ glDisable(GL_LIGHTING);
+ glColor4f(1.0, 0.0, 0.0, 1.0);
+ glBegin(GL_LINE_STRIP);
+ for (i = 0; i < NODE_COUNT - 1; i++) {
+ glVertex3fv(positions[i]);
+ }
+ glEnd();
+ glEnable(GL_LIGHTING);
+ /*glTranslatef(com[0], com[1], com[2]);*/
+ glPopMatrix();
+#endif
+
+ glPushMatrix();
+ glTranslatef(-com[0], -com[1], -com[2]);
+
+#ifdef HAVE_GLUT
+ /* apply the mouse drag rotation */
+ ui_mousedrag();
+#endif
+
+ /* apply the continuous rotation */
+ glRotatef(yspin, 0.0, 1.0, 0.0);
+ glRotatef(zspin, 0.0, 0.0, 1.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ /* now draw each node along the snake -- this is quite ugly :p */
+ mi->polygon_count = 0;
+ for (i = 0; i < NODE_COUNT; i++) {
+ /* choose a colour for this node */
+ if ((i == bp->selected || i == bp->selected+1) && interactive)
+ /* yellow */
+ glColor4f(1.0, 1.0, 0.0, 1.0);
+ else {
+ /*glColor4fv(bp->colour[(i+1)%2]);*/
+ glMaterialfv(GL_FRONT, GL_AMBIENT, bp->colour[(i+1)%2]);
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, bp->colour[(i+1)%2]);
+ /*glMaterialfv(GL_FRONT, GL_SPECULAR, bp->colour[(i+1)%2]);*/
+ }
+
+ /* draw the node */
+ if (wireframe)
+ glCallList(bp->node_wire);
+ else
+ glCallList(bp->node_solid);
+ mi->polygon_count += bp->node_polys;
+
+ /* now work out where to draw the next one */
+
+ /* Interpolate between models */
+ ang = bp->node[i];
+
+ glTranslatef(0.5, 0.5, 0.5); /* move to center */
+ glRotatef(90.0, 0.0, 0.0, -1.0); /* reorient */
+ glTranslatef(1.0 + explode, 0.0, 0.0); /* move to new pos. */
+ glRotatef(180.0 + ang, 1.0, 0.0, 0.0); /* pivot to new angle */
+ glTranslatef(-0.5, -0.5, -0.5); /* return from center */
+ }
+
+ glPopMatrix();
+
+ if (titles)
+#ifdef HAVE_GLUT
+ draw_title();
+#else
+ draw_title(mi);
+#endif
+
+#ifndef HAVE_GLUT
+ glsnake_idle(bp);
+ if (mi->fps_p) do_fps(mi);
+#endif
+
+ glFlush();
+#ifdef HAVE_GLUT
+ glutSwapBuffers();
+#else
+ glXSwapBuffers(dpy, window);
+#endif
+}
+
+#ifdef HAVE_GLUT
+/* anything that needs to be cleaned up goes here */
+static void unmain()
+{
+ glutDestroyWindow(bp->window);
+ free(bp);
+}
+
+static void ui_init(int *, char **);
+
+int main(int argc, char ** argv)
+{
+ bp = malloc(sizeof(struct glsnake_cfg));
+ memset(bp, 0, sizeof(struct glsnake_cfg));
+
+ bp->width = 640;
+ bp->height = 480;
+
+ ui_init(&argc, argv);
+
+ gettime(&bp->last_iteration);
+ memcpy(&bp->last_morph, &bp->last_iteration, sizeof(snaketime));
+ srand((unsigned int)GETSECS(bp->last_iteration));
+
+ bp->prev_colour = bp->next_colour = COLOUR_ACYCLIC;
+ bp->next_model = RAND(models);
+ bp->prev_model = 0;
+ start_morph(bp->prev_model, 1);
+
+ glsnake_init();
+
+ atexit(unmain);
+ glutSwapBuffers();
+ glutMainLoop();
+
+ return 0;
+}
+#endif
+
+/*
+ * GLUT FUNCTIONS
+ */
+
+#ifdef HAVE_GLUT
+
+/* trackball quaternions */
+static float cumquat[4] = {0.0,0.0,0.0,0.0}, oldquat[4] = {0.0,0.0,0.0,0.1};
+
+/* rotation matrix */
+static float rotation[16];
+
+/* mouse drag vectors: start and end */
+static float mouse_start[3], mouse_end[3];
+
+/* dragging boolean */
+static int dragging = 0;
+
+/* this function calculates the rotation matrix based on the quaternions
+ * generated from the mouse drag vectors */
+static void calc_rotation()
+{
+ double Nq, s;
+ double xs, ys, zs, wx, wy, wz, xx, xy, xz, yy, yz, zz;
+
+ /* this bit ripped from Shoemake's quaternion notes from SIGGRAPH */
+ Nq = cumquat[0] * cumquat[0] + cumquat[1] * cumquat[1] +
+ cumquat[2] * cumquat[2] + cumquat[3] * cumquat[3];
+ s = (Nq > 0.0) ? (2.0 / Nq) : 0.0;
+ xs = cumquat[0] * s; ys = cumquat[1] * s; zs = cumquat[2] * s;
+ wx = cumquat[3] * xs; wy = cumquat[3] * ys; wz = cumquat[3] * zs;
+ xx = cumquat[0] * xs; xy = cumquat[0] * ys; xz = cumquat[0] * zs;
+ yy = cumquat[1] * ys; yz = cumquat[1] * zs; zz = cumquat[2] * zs;
+
+ rotation[0] = 1.0 - (yy + zz);
+ rotation[1] = xy + wz;
+ rotation[2] = xz - wy;
+ rotation[4] = xy - wz;
+ rotation[5] = 1.0 - (xx + zz);
+ rotation[6] = yz + wx;
+ rotation[8] = xz + wy;
+ rotation[9] = yz - wx;
+ rotation[10] = 1.0 - (xx + yy);
+ rotation[3] = rotation[7] = rotation[11] = 0.0;
+ rotation[12] = rotation[13] = rotation[14] = 0.0;
+ rotation[15] = 1.0;
+}
+
+static inline void ui_mousedrag()
+{
+ glMultMatrixf(rotation);
+}
+
+static void ui_keyboard(unsigned char c, int x__attribute__((__unused__)), int y __attribute__((__unused__)))
+{
+ int i;
+
+ switch (c) {
+ case 27: /* ESC */
+ case 'q':
+ exit(0);
+ break;
+ case 'e':
+ explode += DEF_EXPLODE;
+ glutPostRedisplay();
+ break;
+ case 'E':
+ explode -= DEF_EXPLODE;
+ if (explode < 0.0) explode = 0.0;
+ glutPostRedisplay();
+ break;
+ case '.':
+ /* next model */
+ bp->next_model++;
+ bp->next_model %= models;
+ start_morph(bp->next_model, 0);
+
+ /* Reset last_morph time */
+ gettime(&bp->last_morph);
+ break;
+ case ',':
+ /* previous model */
+ bp->next_model = (bp->next_model + (int)models - 1) % (int)models;
+ start_morph(bp->next_model, 0);
+
+ /* Reset bp->last_morph time */
+ gettime(&bp->last_morph);
+ break;
+ case '+':
+ angvel += DEF_ANGVEL;
+ break;
+ case '-':
+ if (angvel > DEF_ANGVEL)
+ angvel -= DEF_ANGVEL;
+ break;
+ case 'i':
+ if (interactive) {
+ /* Reset last_iteration and last_morph time */
+ gettime(&bp->last_iteration);
+ gettime(&bp->last_morph);
+ }
+ interactive = 1 - interactive;
+ glutPostRedisplay();
+ break;
+ case 'w':
+ wireframe = 1 - wireframe;
+ if (wireframe)
+ glDisable(GL_LIGHTING);
+ else
+ glEnable(GL_LIGHTING);
+ glutPostRedisplay();
+ break;
+ case 'a':
+ transparent = 1 - transparent;
+ if (transparent) {
+ glEnable(GL_BLEND);
+ } else {
+ glDisable(GL_BLEND);
+ }
+ break;
+ case 'p':
+ if (bp->paused) {
+ /* unpausing, reset last_iteration and last_morph time */
+ gettime(&bp->last_iteration);
+ gettime(&bp->last_morph);
+ }
+ bp->paused = 1 - bp->paused;
+ break;
+ case 'd':
+ /* dump the current model so we can add it! */
+ printf("# %s\nnoname:\t", model[bp->next_model].name);
+ {
+ int i;
+
+ for (i = 0; i < NODE_COUNT; i++) {
+ if (bp->node[i] == ZERO)
+ printf("Z");
+ else if (bp->node[i] == LEFT)
+ printf("L");
+ else if (bp->node[i] == PIN)
+ printf("P");
+ else if (bp->node[i] == RIGHT)
+ printf("R");
+ /*
+ else
+ printf("%f", node[i].curAngle);
+ */
+ if (i < NODE_COUNT - 1)
+ printf(" ");
+ }
+ }
+ printf("\n");
+ break;
+ case 'f':
+ bp->fullscreen = 1 - bp->fullscreen;
+ if (bp->fullscreen) {
+ bp->old_width = bp->width;
+ bp->old_height = bp->height;
+ glutFullScreen();
+ } else {
+ glutReshapeWindow(bp->old_width, bp->old_height);
+ glutPositionWindow(50,50);
+ }
+ break;
+ case 't':
+ titles = 1 - titles;
+ if (interactive || bp->paused)
+ glutPostRedisplay();
+ break;
+ case 'c':
+ altcolour = 1 - altcolour;
+ break;
+ case 'z':
+ zoom += 1.0;
+ glsnake_reshape(bp->width, bp->height);
+ break;
+ case 'Z':
+ zoom -= 1.0;
+ glsnake_reshape(bp->width, bp->height);
+ break;
+ default:
+ break;
+ }
+}
+
+static void ui_special(int key, int x__attribute__((__unused__)), int y __attribute__((__unused__)))
+{
+ float *destAngle = &(model[bp->next_model].node[bp->selected]);
+ int unknown_key = 0;
+
+ if (interactive) {
+ switch (key) {
+ case GLUT_KEY_UP:
+ bp->selected = (bp->selected + (NODE_COUNT - 2)) % (NODE_COUNT - 1);
+ break;
+ case GLUT_KEY_DOWN:
+ bp->selected = (bp->selected + 1) % (NODE_COUNT - 1);
+ break;
+ case GLUT_KEY_LEFT:
+ *destAngle = fmod(*destAngle+(LEFT), 360);
+ bp->morphing = bp->new_morph = 1;
+ break;
+ case GLUT_KEY_RIGHT:
+ *destAngle = fmod(*destAngle+(RIGHT), 360);
+ bp->morphing = bp->new_morph = 1;
+ break;
+ case GLUT_KEY_HOME:
+ start_morph(STRAIGHT_MODEL, 0);
+ break;
+ default:
+ unknown_key = 1;
+ break;
+ }
+ }
+ calc_snake_metrics();
+
+ if (!unknown_key)
+ glutPostRedisplay();
+}
+
+static void ui_mouse(int button, int state, int x, int y)
+{
+ if (button==0) {
+ switch (state) {
+ case GLUT_DOWN:
+ dragging = 1;
+ mouse_start[0] = M_SQRT1_2 *
+ (x - (bp->width / 2.0)) / (bp->width / 2.0);
+ mouse_start[1] = M_SQRT1_2 *
+ ((bp->height / 2.0) - y) / (bp->height / 2.0);
+ mouse_start[2] = sqrt((double)(1-(mouse_start[0]*mouse_start[0]+mouse_start[1]*mouse_start[1])));
+ break;
+ case GLUT_UP:
+ dragging = 0;
+ oldquat[0] = cumquat[0];
+ oldquat[1] = cumquat[1];
+ oldquat[2] = cumquat[2];
+ oldquat[3] = cumquat[3];
+ break;
+ default:
+ break;
+ }
+ }
+ glutPostRedisplay();
+}
+
+static void ui_motion(int x, int y)
+{
+ double norm;
+ float q[4];
+
+ if (dragging) {
+ /* construct the motion end vector from the x,y position on the
+ * window */
+ mouse_end[0] = M_SQRT1_2 * (x - (bp->width/ 2.0)) / (bp->width / 2.0);
+ mouse_end[1] = M_SQRT1_2 * ((bp->height / 2.0) - y) / (bp->height / 2.0);
+ /* calculate the normal of the vector... */
+ norm = mouse_end[0] * mouse_end[0] + mouse_end[1] * mouse_end[1];
+ /* check if norm is outside the sphere and wraparound if necessary */
+ if (norm > 1.0) {
+ mouse_end[0] = -mouse_end[0];
+ mouse_end[1] = -mouse_end[1];
+ mouse_end[2] = sqrt(norm - 1);
+ } else {
+ /* the z value comes from projecting onto an elliptical spheroid */
+ mouse_end[2] = sqrt(1 - norm);
+ }
+
+ /* now here, build a quaternion from mouse_start and mouse_end */
+ q[0] = mouse_start[1] * mouse_end[2] - mouse_start[2] * mouse_end[1];
+ q[1] = mouse_start[2] * mouse_end[0] - mouse_start[0] * mouse_end[2];
+ q[2] = mouse_start[0] * mouse_end[1] - mouse_start[1] * mouse_end[0];
+ q[3] = mouse_start[0] * mouse_end[0] + mouse_start[1] * mouse_end[1] + mouse_start[2] * mouse_end[2];
+
+ /* new rotation is the product of the new one and the old one */
+ cumquat[0] = q[3] * oldquat[0] + q[0] * oldquat[3] +
+ q[1] * oldquat[2] - q[2] * oldquat[1];
+ cumquat[1] = q[3] * oldquat[1] + q[1] * oldquat[3] +
+ q[2] * oldquat[0] - q[0] * oldquat[2];
+ cumquat[2] = q[3] * oldquat[2] + q[2] * oldquat[3] +
+ q[0] * oldquat[1] - q[1] * oldquat[0];
+ cumquat[3] = q[3] * oldquat[3] - q[0] * oldquat[0] -
+ q[1] * oldquat[1] - q[2] * oldquat[2];
+
+ calc_rotation();
+ }
+ glutPostRedisplay();
+}
+
+static void ui_init(int * argc, char ** argv)
+{
+ glutInit(argc, argv);
+ glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
+ glutInitWindowSize(bp->width, bp->height);
+ bp->window = glutCreateWindow("glsnake");
+
+ glutDisplayFunc(glsnake_display);
+ glutReshapeFunc(glsnake_reshape);
+ glutIdleFunc(glsnake_idle);
+ glutKeyboardFunc(ui_keyboard);
+ glutSpecialFunc(ui_special);
+ glutMouseFunc(ui_mouse);
+ glutMotionFunc(ui_motion);
+
+ yangvel = DEF_YANGVEL;
+ zangvel = DEF_ZANGVEL;
+ explode = DEF_EXPLODE;
+ angvel = DEF_ANGVEL;
+ statictime = DEF_STATICTIME;
+ altcolour = DEF_ALTCOLOUR;
+ titles = DEF_TITLES;
+ interactive = DEF_INTERACTIVE;
+ zoom = DEF_ZOOM;
+ wireframe = DEF_WIREFRAME;
+ transparent = DEF_TRANSPARENT;
+}
+#endif /* HAVE_GLUT */
+
+XSCREENSAVER_MODULE ("GLSnake", glsnake)
diff --git a/hacks/glx/glsnake.man b/hacks/glx/glsnake.man
new file mode 100644
index 0000000..217be2f
--- /dev/null
+++ b/hacks/glx/glsnake.man
@@ -0,0 +1,98 @@
+.\" Hey, EMACS: -*- nroff -*-
+.TH XScreenSaver 1 "January 15, 2001" "X Version 11"
+.SH NAME
+glsnake \- OpenGL enhanced Rubik's Snake cyclewaster.
+.SH SYNOPSIS
+.B glsnake
+[\-display \fIhost:display.screen\fP] [\-window] [\-root]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP] [\-fps]
+[\-wireframe] [\-altcolour]
+[\-angvel \fIangular\fP]
+[\-explode \fIdistance\fP]
+[\-statictime \fImilliseconds\fP]
+[\-yangvel \fIangle\fP]
+[\-zangvel \fIangle\fP]
+.SH DESCRIPTION
+.PP
+.B glsnake
+is an imitation of Rubiks\' Snake, using OpenGL.
+.SH OPTIONS
+.I glsnake
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-wireframe
+Display the snake in wireframe mode, rather than the default solid mode.
+.TP 8
+.B \-altcolour
+Use the alternate colour scheme for the snake. Shape identification using
+colour will be disabled.
+.TP 8
+.B -angvel \fIangular\fP
+Change the speed at which the snake morphs to a new shape.
+.TP 8
+.B -explode \fIdistance\fP
+Change the distance between the nodes of a snake.
+.TP 8
+.B \-statictime \fImilliseconds\fP
+Change the time between morphs.
+.TP 8
+.B \-yangvel \fIangle\fP
+Change the angle of rotation around the Y axis per frame.
+.TP 8
+.B \-zangvel \fIangle\fP
+Change the angle of rotation around the Z axis per frame.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH FILES
+.TP
+\fB/usr/share/glsnake/*.glsnake\fP
+This XScreenSaver will attempt to read model files installed with the interactive \fBglsnake\fP.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR glsnake (MANSUFFIX)
+.PP
+.EX
+http://spacepants.org/src/glsnake/
+.EE
+.SH BUGS
+The snake will happily intersect itself while morphing (this is not a bug).
+.PP
+The rotation/camera position sucks.
+.SH COPYRIGHT
+Copyright \(co 2001,2002 by Jamie Wilkinson, Andrew Bennetts, and Peter Aylett.
+.PP
+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.
+.PP
+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.
+.SH AUTHOR
+Jamie Wilkinson <jaq@spacepants.org>, Andrew Bennetts <andrew@puzzling.org>,
+and Peter Aylett <peter@ylett.com>. Ported to XScreenSaver by Jamie Wilkinson.
diff --git a/hacks/glx/gltext.c b/hacks/glx/gltext.c
new file mode 100644
index 0000000..276c448
--- /dev/null
+++ b/hacks/glx/gltext.c
@@ -0,0 +1,660 @@
+/* gltext, Copyright (c) 2001-2017 Jamie Zawinski <jwz@jwz.orgq2
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*usePty: False \n" \
+
+# define release_text 0
+#define SMOOTH_TUBE /* whether to have smooth or faceted tubes */
+
+#ifdef SMOOTH_TUBE
+# define TUBE_FACES 12 /* how densely to render tubes */
+#else
+# define TUBE_FACES 8
+#endif
+
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "tube.h"
+#include "sphere.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include "textclient.h"
+#include "utf8wc.h"
+
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_TEXT "(default)"
+#define DEF_PROGRAM "(default)"
+#define DEF_SCALE_FACTOR "0.01"
+#define DEF_WANDER_SPEED "0.02"
+#define DEF_MAX_LINES "8"
+#define DEF_SPIN "XYZ"
+#define DEF_WANDER "True"
+#define DEF_FACE_FRONT "True"
+#define DEF_USE_MONOSPACE "False"
+
+#ifdef HAVE_UNAME
+# include <sys/utsname.h>
+#endif /* HAVE_UNAME */
+
+#include "glutstroke.h"
+#include "glut_roman.h"
+#include "glut_mroman.h"
+#define GLUT_VARI_FONT (&glutStrokeRoman)
+#define GLUT_MONO_FONT (&glutStrokeMonoRoman)
+#define GLUT_FONT ((use_monospace) ? GLUT_MONO_FONT : GLUT_VARI_FONT)
+
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot, *rot2;
+ trackball_state *trackball;
+ Bool button_down_p;
+ Bool spinx, spiny, spinz;
+
+ GLuint text_list;
+
+ int ncolors;
+ XColor *colors;
+ int ccolor;
+
+ char *text;
+ int reload;
+
+ time_t last_update;
+ text_data *tc;
+
+} text_configuration;
+
+static text_configuration *tps = NULL;
+
+static char *text_fmt;
+static char *program_str;
+static float scale_factor;
+static int max_no_lines;
+static float wander_speed;
+static char *do_spin;
+static Bool do_wander;
+static Bool face_front_p;
+static Bool use_monospace;
+
+static XrmOptionDescRec opts[] = {
+ { "-text", ".text", XrmoptionSepArg, 0 },
+ { "-program", ".program", XrmoptionSepArg, 0 },
+ { "-scale", ".scaleFactor", XrmoptionSepArg, 0 },
+ { "-maxlines", ".maxLines", XrmoptionSepArg, 0 },
+ { "-wander-speed", ".wanderSpeed", XrmoptionSepArg, 0 },
+ { "-spin", ".spin", XrmoptionSepArg, 0 },
+ { "+spin", ".spin", XrmoptionNoArg, "" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-front", ".faceFront", XrmoptionNoArg, "True" },
+ { "+front", ".faceFront", XrmoptionNoArg, "False" },
+ { "-mono", ".useMonoSpace", XrmoptionNoArg, "True" },
+ { "+mono", ".useMonoSpace", XrmoptionNoArg, "False" }
+};
+
+static argtype vars[] = {
+ {&text_fmt, "text", "Text", DEF_TEXT, t_String},
+ {&program_str, "program", "Program", DEF_PROGRAM, t_String},
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_String},
+ {&scale_factor, "scaleFactor", "ScaleFactor", DEF_SCALE_FACTOR, t_Float},
+ {&max_no_lines, "maxLines", "MaxLines", DEF_MAX_LINES, t_Int},
+ {&wander_speed, "wanderSpeed", "WanderSpeed", DEF_WANDER_SPEED, t_Float},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&face_front_p, "faceFront", "FaceFront", DEF_FACE_FRONT, t_Bool},
+ {&use_monospace, "useMonoSpace", "UseMonoSpace", DEF_USE_MONOSPACE, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt text_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_text (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+static void
+gl_init (ModeInfo *mi)
+{
+ text_configuration *tp = &tps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+
+ static const GLfloat pos[4] = {5.0, 5.0, 10.0, 1.0};
+
+ if (!wire)
+ {
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ }
+
+ tp->text_list = glGenLists (1);
+ glNewList (tp->text_list, GL_COMPILE);
+ glEndList ();
+}
+
+
+static void
+parse_text (ModeInfo *mi)
+{
+ text_configuration *tp = &tps[MI_SCREEN(mi)];
+ char *old = tp->text;
+
+ if (program_str && *program_str && !!strcmp(program_str, "(default)"))
+ {
+ int max_lines = max_no_lines;
+ char buf[4096];
+ char *p = buf;
+ int lines = 0;
+
+ if (! tp->tc)
+ tp->tc = textclient_open (mi->dpy);
+
+ while (p < buf + sizeof(buf) - 1 &&
+ lines < max_lines)
+ {
+ int c = textclient_getc (tp->tc);
+ if (c == '\n')
+ lines++;
+ if (c > 0)
+ *p++ = (char) c;
+ else
+ break;
+ }
+ *p = 0;
+ if (lines == 0 && buf[0])
+ lines++;
+
+ tp->text = strdup (buf);
+
+ tp->reload = 7; /* Let this one linger for a few seconds */
+ if (!*tp->text)
+ tp->reload = 1;
+
+ }
+ else if (!text_fmt || !*text_fmt || !strcmp(text_fmt, "(default)"))
+ {
+# ifdef HAVE_UNAME
+ struct utsname uts;
+
+ if (uname (&uts) < 0)
+ {
+ tp->text = strdup("uname() failed");
+ }
+ else
+ {
+ char *s;
+ if ((s = strchr(uts.nodename, '.')))
+ *s = 0;
+ tp->text = (char *) malloc(strlen(uts.nodename) +
+ strlen(uts.sysname) +
+ strlen(uts.version) +
+ strlen(uts.release) + 10);
+# if defined(_AIX)
+ sprintf(tp->text, "%s\n%s %s.%s",
+ uts.nodename, uts.sysname, uts.version, uts.release);
+# elif defined(USE_IPHONE)
+ /* "My iPhone\n iPhone4,1\n Darwin 11.0.0" */
+ sprintf(tp->text, "%s\n%s\n%s %s",
+ uts.nodename, uts.machine, uts.sysname, uts.release);
+# elif defined(__APPLE__) /* MacOS X + XDarwin */
+ {
+ const char *file =
+ "/System/Library/CoreServices/SystemVersion.plist";
+ FILE *f = fopen (file, "r");
+ char *pbv = 0, *pn = 0, *puvv = 0;
+ if (f) {
+ char *s, buf[255];
+
+ while (fgets (buf, sizeof(buf)-1, f)) {
+# define GRAB(S,V) \
+ if (strstr(buf, S)) { \
+ fgets (buf, sizeof(buf)-1, f); \
+ if ((s = strchr (buf, '>'))) V = strdup(s+1); \
+ if ((s = strchr (V, '<'))) *s = 0; \
+ }
+ GRAB ("ProductName", pn)
+ GRAB ("ProductBuildVersion", pbv)
+ GRAB ("ProductUserVisibleVersion", puvv)
+# undef GRAB
+ }
+ }
+ if (pbv)
+ sprintf (tp->text, "%s\n%s\n%s\n%s",
+ uts.nodename, pn, puvv, uts.machine);
+ else
+ sprintf(tp->text, "%s\n%s %s\n%s",
+ uts.nodename, uts.sysname, uts.release, uts.machine);
+ }
+# else
+ sprintf(tp->text, "%s\n%s %s",
+ uts.nodename, uts.sysname, uts.release);
+# endif /* special system types */
+ }
+# else /* !HAVE_UNAME */
+# ifdef VMS
+ tp->text = strdup(getenv("SYS$NODE"));
+# else
+ tp->text = strdup("* *\n* * *\nxscreensaver\n* * *\n* *");
+# endif
+# endif /* !HAVE_UNAME */
+ }
+ else if (!strchr (text_fmt, '%'))
+ {
+ tp->text = strdup (text_fmt);
+ }
+ else
+ {
+ time_t now = time ((time_t *) 0);
+ struct tm *tm = localtime (&now);
+ int L = strlen(text_fmt) + 100;
+ tp->text = (char *) malloc (L);
+ *tp->text = 0;
+ strftime (tp->text, L-1, text_fmt, tm);
+ if (!*tp->text)
+ sprintf (tp->text, "strftime error:\n%s", text_fmt);
+ tp->reload = 1;
+ }
+
+ {
+ /* The GLUT font only has ASCII characters. */
+ char *s1 = utf8_to_latin1 (tp->text, True);
+ free (tp->text);
+ tp->text = s1;
+ }
+
+ /* If we had text before but got no text this time, hold on to the
+ old one, to avoid flickering.
+ */
+ if (old && *old && !*tp->text)
+ {
+ free (tp->text);
+ tp->text = old;
+ }
+ else if (old)
+ free (old);
+}
+
+
+ENTRYPOINT Bool
+text_handle_event (ModeInfo *mi, XEvent *event)
+{
+ text_configuration *tp = &tps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, tp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &tp->button_down_p))
+ return True;
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_text (ModeInfo *mi)
+{
+ text_configuration *tp;
+ int i;
+
+ MI_INIT (mi, tps);
+
+ tp = &tps[MI_SCREEN(mi)];
+
+ if ((tp->glx_context = init_GL(mi)) != NULL) {
+ gl_init(mi);
+ reshape_text (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+
+ {
+ double spin_speed = 0.5;
+ double wander_speed = 0.02;
+ double tilt_speed = 0.03;
+ double spin_accel = 0.5;
+
+ char *s = do_spin;
+ while (*s)
+ {
+ if (*s == 'x' || *s == 'X') tp->spinx = True;
+ else if (*s == 'y' || *s == 'Y') tp->spiny = True;
+ else if (*s == 'z' || *s == 'Z') tp->spinz = True;
+ else if (*s == '0') ;
+ else
+ {
+ fprintf (stderr,
+ "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
+ progname, do_spin);
+ exit (1);
+ }
+ s++;
+ }
+
+ tp->rot = make_rotator (tp->spinx ? spin_speed : 0,
+ tp->spiny ? spin_speed : 0,
+ tp->spinz ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ False);
+ tp->rot2 = (face_front_p
+ ? make_rotator (0, 0, 0, 0, tilt_speed, True)
+ : 0);
+ tp->trackball = gltrackball_init (False);
+ }
+
+ tp->ncolors = 255;
+ tp->colors = (XColor *) calloc(tp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ tp->colors, &tp->ncolors,
+ False, 0, False);
+
+ /* brighter colors, please... */
+ for (i = 0; i < tp->ncolors; i++)
+ {
+ tp->colors[i].red = (tp->colors[i].red / 2) + 32767;
+ tp->colors[i].green = (tp->colors[i].green / 2) + 32767;
+ tp->colors[i].blue = (tp->colors[i].blue / 2) + 32767;
+ }
+
+ parse_text (mi);
+
+}
+
+
+static int
+fill_character (GLUTstrokeFont font, int c, Bool wire, int *polysP)
+{
+ GLfloat tube_width = 10;
+
+ const StrokeCharRec *ch;
+ const StrokeRec *stroke;
+ const CoordRec *coord;
+ StrokeFontPtr fontinfo;
+ int i, j;
+
+ fontinfo = (StrokeFontPtr) font;
+
+ if (c < 0 || c >= fontinfo->num_chars)
+ return 0;
+ ch = &(fontinfo->ch[c]);
+ if (ch)
+ {
+ GLfloat lx=0, ly=0;
+ for (i = ch->num_strokes, stroke = ch->stroke;
+ i > 0; i--, stroke++) {
+ for (j = stroke->num_coords, coord = stroke->coord;
+ j > 0; j--, coord++)
+ {
+# ifdef SMOOTH_TUBE
+ int smooth = True;
+# else
+ int smooth = False;
+# endif
+
+ if (j != stroke->num_coords)
+ *polysP += tube (lx, ly, 0,
+ coord->x, coord->y, 0,
+ tube_width,
+ tube_width * 0.15,
+ TUBE_FACES, smooth, False, wire);
+ lx = coord->x;
+ ly = coord->y;
+
+ /* Put a sphere at the endpoint of every line segment. Wasteful
+ on curves like "0" but necessary on corners like "4". */
+ if (! wire)
+ {
+ glPushMatrix();
+ glTranslatef (lx, ly, 0);
+ glScalef (tube_width, tube_width, tube_width);
+ *polysP += unit_sphere (TUBE_FACES, TUBE_FACES, wire);
+ glPopMatrix();
+ }
+ }
+ }
+ return (int) (ch->right + tube_width);
+ }
+ return 0;
+}
+
+
+static int
+text_extents (const char *string, int *wP, int *hP)
+{
+ const char *s, *start;
+ int line_height = GLUT_FONT->top - GLUT_FONT->bottom;
+ int lines = 0;
+ *wP = 0;
+ *hP = 0;
+ start = string;
+ s = start;
+ while (1)
+ if (*s == '\n' || *s == 0)
+ {
+ int w = 0;
+ while (start < s)
+ {
+ w += glutStrokeWidth(GLUT_FONT, *start);
+ start++;
+ }
+ start = s+1;
+
+ if (w > *wP) *wP = w;
+ *hP += line_height;
+ lines++;
+ if (*s == 0) break;
+ s++;
+ }
+ else
+ s++;
+
+ return lines;
+}
+
+
+static unsigned long
+fill_string (const char *string, Bool wire)
+{
+ int polys = 0;
+ const char *s, *start;
+ int line_height = GLUT_FONT->top - GLUT_FONT->bottom;
+ int off;
+ GLfloat x = 0, y = 0;
+
+ int ow, oh;
+ text_extents (string, &ow, &oh);
+
+ y = oh / 2 - line_height;
+
+ start = string;
+ s = start;
+ while (1)
+ if (*s == '\n' || *s == 0)
+ {
+ int line_w = 0;
+ const char *s2;
+ const char *lstart = start;
+ const char *lend = s;
+
+ /* strip off whitespace at beginning and end of line
+ (since we're centering.) */
+ while (lend > lstart && isspace(lend[-1]))
+ lend--;
+ while (lstart < lend && isspace(*lstart))
+ lstart++;
+
+ for (s2 = lstart; s2 < lend; s2++)
+ line_w += glutStrokeWidth (GLUT_FONT, *s2);
+
+ x = (-ow/2) + ((ow-line_w)/2);
+ for (s2 = lstart; s2 < lend; s2++)
+ {
+ glPushMatrix();
+ glTranslatef(x, y, 0);
+ off = fill_character (GLUT_FONT, *s2, wire, &polys);
+ x += off;
+ glPopMatrix();
+ }
+
+ start = s+1;
+
+ y -= line_height;
+ if (*s == 0) break;
+ s++;
+ }
+ else
+ s++;
+ return polys;
+}
+
+
+ENTRYPOINT void
+draw_text (ModeInfo *mi)
+{
+ text_configuration *tp = &tps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int wire = MI_IS_WIREFRAME(mi);
+
+ GLfloat white[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat color[4] = {0.0, 0.0, 0.0, 1.0};
+
+ if (!tp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(tp->glx_context));
+
+ if (tp->reload)
+ {
+ if (time ((time_t *) 0) >= tp->last_update + tp->reload)
+ {
+ parse_text (mi);
+ tp->last_update = time ((time_t *) 0);
+ }
+ }
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+ glScalef(1.1, 1.1, 1.1);
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ {
+ double x, y, z;
+ get_position (tp->rot, &x, &y, &z, !tp->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 8,
+ (z - 0.5) * 8);
+
+ gltrackball_rotate (tp->trackball);
+
+ if (face_front_p)
+ {
+ double max = 90;
+ get_position (tp->rot2, &x, &y, &z, !tp->button_down_p);
+ if (tp->spinx) glRotatef (max/2 - x*max, 1, 0, 0);
+ if (tp->spiny) glRotatef (max/2 - y*max, 0, 1, 0);
+ if (tp->spinz) glRotatef (max/2 - z*max, 0, 0, 1);
+ }
+ else
+ {
+ get_rotation (tp->rot, &x, &y, &z, !tp->button_down_p);
+ glRotatef (x * 360, 1, 0, 0);
+ glRotatef (y * 360, 0, 1, 0);
+ glRotatef (z * 360, 0, 0, 1);
+ }
+ }
+
+
+ glColor4fv (white);
+
+ color[0] = tp->colors[tp->ccolor].red / 65536.0;
+ color[1] = tp->colors[tp->ccolor].green / 65536.0;
+ color[2] = tp->colors[tp->ccolor].blue / 65536.0;
+ tp->ccolor++;
+ if (tp->ccolor >= tp->ncolors) tp->ccolor = 0;
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+
+ glScalef(scale_factor, scale_factor, scale_factor);
+
+ mi->polygon_count = fill_string(tp->text, wire);
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+ENTRYPOINT void
+free_text(ModeInfo * mi)
+{
+ text_configuration *tp = &tps[MI_SCREEN(mi)];
+ if (tp->tc)
+ textclient_close (tp->tc);
+}
+
+
+XSCREENSAVER_MODULE_2 ("GLText", gltext, text)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/gltext.man b/hacks/glx/gltext.man
new file mode 100644
index 0000000..0d30c5f
--- /dev/null
+++ b/hacks/glx/gltext.man
@@ -0,0 +1,152 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "25-Jul-98" "X Version 11"
+.SH NAME
+gltext - draws text spinning around in 3D
+.SH SYNOPSIS
+.B gltext
+[\-display \fIhost:display.screen\fP] [\-window] [\-root]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP]
+[\-text \fIstring\fP]
+[\-program \fIcommand\fP]
+[\-wander] [\-no-wander]
+[\-spin \fIaxes\fP]
+[\-no-spin]
+[\-front] [\-no\-front]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+The \fIgltext\fP program draws some text spinning around in 3D, using
+a font that appears to be made of solid tubes.
+.SH OPTIONS
+.I gltext
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-text \fIstring\fP
+The text to display. This may contain newlines, but it shouldn't be
+very long. The default is to display the machine name and OS version.
+
+This may also be a format string acceptable to
+.BR date (1)
+and
+.BR strftime (3) ,
+in which case, it will be updated once a second. So to make this
+program display a spinning digital clock, you could do this:
+.EX
+gltext -text "%A%n%d %b %Y%n%l:%M:%S %p"
+.EE
+To include a literal `%', you must double it: `%%'.
+
+See the man page for
+.BR strftime (3)
+for more details.
+.TP 8
+.B \-program \fIcommand\fP
+The given program is run, and its output is displayed.
+If specified, this overrides \fI\-text\fP.
+The output of this program will be repeatedely displayed, with new
+pages of text shifting in every few seconds. Lines should be relatively
+short. You might try:
+.EX
+-program 'xscreensaver-text --cols 20'
+.EE
+.TP 8
+.B \-maxlines
+Set the number of lines of text to display. By default,
+.I gltext
+will print 8 lines of text at a time. Use this option to increase or
+decrease that number. Be aware that
+.I gltext
+is designed to work with a fairly small amount of text, so setting this
+value too high might result in slow performance or strange behaviour
+stemming from buffer overflows. Increase at your own risk.
+.TP 8
+.B \-mono
+Display the text in a monospace font. Default is a variable-width font.
+.TP 8
+.B \-no\-mono
+Display the text in a variable-width font. This is the default.
+.TP 8
+.B \-wander
+Move the text around the screen. This is the default.
+.TP 8
+.B \-no\-wander
+Keep the text centered on the screen.
+.TP 8
+.B \-wander\-speed
+Sets the speed at which the text wanders around. Default is 0.02.
+.TP 8
+.B \-spin
+Which axes around which the text should spin. The default is "XYZ",
+meaning rotate it freely in space. "\fB\-spin Z\fP" would rotate the
+text in the plane of the screen while not rotating it into or out
+of the screen; etc.
+.TP 8
+.B \-no\-spin
+Don't spin the text at all: the same as \fB\-spin ""\fP.
+.TP 8
+.B \-front
+When spinning, never spin all the way around or upside down:
+always face mostly forward so that the text is easily readable.
+.TP 8
+.B \-no\-front
+Allow spins to go all the way around or upside down. This is the default.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B \-scale
+Sets the scale at which the text is rendered. Bigger values will result
+in bigger text; smaller values will result in smaller text. The default
+value is 0.01.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver-text (1)
+.SH COPYRIGHT
+Copyright \(co 2001-2014 by Jamie Zawinski.
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>
diff --git a/hacks/glx/gltrackball.c b/hacks/glx/gltrackball.c
new file mode 100644
index 0000000..57b4b99
--- /dev/null
+++ b/hacks/glx/gltrackball.c
@@ -0,0 +1,337 @@
+/* gltrackball, Copyright (c) 2002-2017 Jamie Zawinski <jwz@jwz.org>
+ * GL-flavored wrapper for trackball.c
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifdef HAVE_COCOA
+# include "jwxyz.h"
+#elif defined(HAVE_ANDROID)
+# include "jwxyz.h"
+# include <GLES/gl.h>
+#else /* real X11 */
+# include <X11/X.h>
+# include <X11/Xlib.h>
+# include <GL/gl.h>
+#endif /* !HAVE_COCOA */
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+# define Button4 4 /* WTF */
+# define Button5 5
+# define Button6 6
+# define Button7 7
+
+#include "trackball.h"
+#include "gltrackball.h"
+
+#if defined(USE_IPHONE) || defined(HAVE_ANDROID)
+ /* Surely this should be defined somewhere more centrally... */
+# define HAVE_MOBILE
+#endif
+
+/* Bah, copied from ../fps.h */
+#ifdef HAVE_MOBILE
+ extern double current_device_rotation (void);
+#else
+# define current_device_rotation() (0)
+#endif
+
+
+struct trackball_state {
+ int ow, oh;
+ double x, y;
+ double dx, dy, ddx, ddy;
+ GLfloat q[4];
+ int button_down_p;
+ int ignore_device_rotation_p;
+};
+
+/* Returns a trackball_state object, which encapsulates the stuff necessary
+ to make dragging the mouse on the window of a GL program do the right thing.
+ */
+trackball_state *
+gltrackball_init (int ignore_device_rotation_p)
+{
+ trackball_state *ts = (trackball_state *) calloc (1, sizeof (*ts));
+ if (!ts) return 0;
+ ts->ignore_device_rotation_p = ignore_device_rotation_p;
+ trackball (ts->q, 0, 0, 0, 0);
+ return ts;
+}
+
+/* Device rotation interacts very strangely with mouse positions.
+ I'm not entirely sure this is the right fix.
+ */
+static void
+adjust_for_device_rotation (trackball_state *ts,
+ double *x, double *y, double *w, double *h)
+{
+ int rot = (int) current_device_rotation();
+ int swap;
+
+ if (ts->ignore_device_rotation_p) return;
+
+ while (rot <= -180) rot += 360;
+ while (rot > 180) rot -= 360;
+
+ if (rot > 135 || rot < -135) /* 180 */
+ {
+ *x = *w - *x;
+ *y = *h - *y;
+ }
+ else if (rot > 45) /* 90 */
+ {
+ swap = *x; *x = *y; *y = swap;
+ swap = *w; *w = *h; *h = swap;
+ *x = *w - *x;
+ }
+ else if (rot < -45) /* 270 */
+ {
+ swap = *x; *x = *y; *y = swap;
+ swap = *w; *w = *h; *h = swap;
+ *y = *h - *y;
+ }
+}
+
+
+/* Begin tracking the mouse: Call this when the mouse button goes down.
+ x and y are the mouse position relative to the window.
+ w and h are the size of the window.
+ */
+void
+gltrackball_start (trackball_state *ts, int x, int y, int w, int h)
+{
+ ts->x = x;
+ ts->y = y;
+ ts->button_down_p = 1;
+ ts->dx = ts->ddx = 0;
+ ts->dy = ts->ddy = 0;
+}
+
+/* Stop tracking the mouse: Call this when the mouse button goes up.
+ */
+void
+gltrackball_stop (trackball_state *ts)
+{
+ ts->button_down_p = 0;
+}
+
+static void
+gltrackball_track_1 (trackball_state *ts,
+ double x, double y,
+ int w, int h,
+ int ignore_device_rotation_p)
+{
+ double X = x;
+ double Y = y;
+ double W = w, W2 = w;
+ double H = h, H2 = h;
+ float q2[4];
+ double ox = ts->x;
+ double oy = ts->y;
+
+ ts->x = x;
+ ts->y = y;
+
+ if (! ignore_device_rotation_p)
+ {
+ adjust_for_device_rotation (ts, &ox, &oy, &W, &H);
+ adjust_for_device_rotation (ts, &X, &Y, &W2, &H2);
+ }
+ trackball (q2,
+ (2 * ox - W) / W,
+ (H - 2 * oy) / H,
+ (2 * X - W) / W,
+ (H - 2 * Y) / H);
+
+ add_quats (q2, ts->q, ts->q);
+}
+
+
+/* Track the mouse: Call this each time the mouse moves with the button down.
+ x and y are the new mouse position relative to the window.
+ w and h are the size of the window.
+ */
+void
+gltrackball_track (trackball_state *ts, int x, int y, int w, int h)
+{
+ double dampen = 0.01; /* This keeps it going for about 3 sec */
+ ts->dx = x - ts->x;
+ ts->dy = y - ts->y;
+ ts->ddx = ts->dx * dampen;
+ ts->ddy = ts->dy * dampen;
+ ts->ow = w;
+ ts->oh = h;
+ gltrackball_track_1 (ts, x, y, w, h, False);
+}
+
+
+static void
+gltrackball_dampen (double *n, double *dn)
+{
+ int pos = (*n > 0);
+ *n -= *dn;
+ if (pos != (*n > 0))
+ *n = *dn = 0;
+}
+
+
+/* Reset the trackball to the default unrotated state,
+ plus an optional initial rotation.
+ */
+void
+gltrackball_reset (trackball_state *ts, float x, float y)
+{
+ int bd = ts->button_down_p;
+ int ig = ts->ignore_device_rotation_p;
+ memset (ts, 0, sizeof(*ts));
+ ts->button_down_p = bd;
+ ts->ignore_device_rotation_p = ig;
+ trackball (ts->q, 0, 0, x, y);
+}
+
+
+/* Execute the rotations current encapsulated in the trackball_state:
+ this does something analagous to glRotatef().
+ */
+void
+gltrackball_rotate (trackball_state *ts)
+{
+ GLfloat m[4][4];
+ if (!ts->button_down_p &&
+ (ts->ddx != 0 ||
+ ts->ddy != 0))
+ {
+ /* Apply inertia: keep moving in the same direction as the last move. */
+ gltrackball_track_1 (ts,
+ ts->x + ts->dx,
+ ts->y + ts->dy,
+ ts->ow, ts->oh,
+ False);
+
+ /* Dampen inertia: gradually stop spinning. */
+ gltrackball_dampen (&ts->dx, &ts->ddx);
+ gltrackball_dampen (&ts->dy, &ts->ddy);
+ }
+
+ build_rotmatrix (m, ts->q);
+ glMultMatrixf (&m[0][0]);
+}
+
+
+/* Call this when a mouse-wheel click is detected.
+ Clicks act like horizontal or vertical drags.
+ Percent is the length of the drag as a percentage of the screen size.
+ Button is 'Button4' or 'Button5' (for the vertical wheel)
+ or 'Button5' or 'Button6' (for the horizontal wheel).
+ If `flip_p' is true, swap the horizontal and vertical axes.
+ */
+void
+gltrackball_mousewheel (trackball_state *ts,
+ int button, int percent, int flip_p)
+{
+ int up_p;
+ int horizontal_p;
+ int mx, my, move, scale;
+
+#ifdef HAVE_JWXYZ
+ flip_p = 0; /* MacOS has already handled this. */
+#endif
+
+ switch (button) {
+ case Button4: up_p = 1; horizontal_p = 0; break;
+ case Button5: up_p = 0; horizontal_p = 0; break;
+ case Button6: up_p = 1; horizontal_p = 1; break;
+ case Button7: up_p = 0; horizontal_p = 1; break;
+ default: abort(); break;
+ }
+
+ if (flip_p)
+ {
+ horizontal_p = !horizontal_p;
+ up_p = !up_p;
+ }
+
+ scale = mx = my = 1000;
+ move = (up_p
+ ? floor (scale * (1.0 - (percent / 100.0)))
+ : ceil (scale * (1.0 + (percent / 100.0))));
+ if (horizontal_p) mx = move;
+ else my = move;
+ gltrackball_start (ts, scale, scale, scale*2, scale*2);
+ gltrackball_track (ts, mx, my, scale*2, scale*2);
+}
+
+void
+gltrackball_get_quaternion (trackball_state *ts, float q[4])
+{
+ int i;
+ for (i=0; i<4; i++)
+ q[i] = ts->q[i];
+}
+
+
+/* A utility function for event-handler functions:
+ Handles the various motion and click events related to trackballs.
+ Returns True if the event was handled.
+ */
+Bool
+gltrackball_event_handler (XEvent *event,
+ trackball_state *ts,
+ int window_width, int window_height,
+ Bool *button_down_p)
+{
+ if (event->xany.type == ButtonPress &&
+ event->xbutton.button == Button1)
+ {
+ *button_down_p = True;
+ gltrackball_start (ts,
+ event->xbutton.x, event->xbutton.y,
+ window_width, window_height);
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease &&
+ event->xbutton.button == Button1)
+ {
+ *button_down_p = False;
+ gltrackball_stop (ts);
+ return True;
+ }
+ else if (event->xany.type == ButtonPress &&
+ (event->xbutton.button == Button4 ||
+ event->xbutton.button == Button5 ||
+ event->xbutton.button == Button6 ||
+ event->xbutton.button == Button7))
+ {
+ gltrackball_mousewheel (ts, event->xbutton.button, 10,
+ !!event->xbutton.state);
+ return True;
+ }
+ else if (event->xany.type == MotionNotify &&
+ *button_down_p)
+ {
+ gltrackball_track (ts,
+ event->xmotion.x, event->xmotion.y,
+ window_width, window_height);
+ return True;
+ }
+
+ return False;
+}
diff --git a/hacks/glx/gltrackball.h b/hacks/glx/gltrackball.h
new file mode 100644
index 0000000..ba9e574
--- /dev/null
+++ b/hacks/glx/gltrackball.h
@@ -0,0 +1,72 @@
+/* gltrackball, Copyright (c) 2002-2017 Jamie Zawinski <jwz@jwz.org>
+ * GL-flavored wrapper for trackball.c
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __GLTRACKBALL_H__
+#define __GLTRACKBALL_H__
+
+typedef struct trackball_state trackball_state;
+
+/* Returns a trackball_state object, which encapsulates the stuff necessary
+ to make dragging the mouse on the window of a GL program do the right thing.
+ */
+extern trackball_state *gltrackball_init (int ignore_device_rotation_p);
+
+/* Begin tracking the mouse: Call this when the mouse button goes down.
+ x and y are the mouse position relative to the window.
+ w and h are the size of the window.
+ */
+extern void gltrackball_start (trackball_state *, int x, int y, int w, int h);
+
+/* Track the mouse: Call this each time the mouse moves with the button down.
+ x and y are the new mouse position relative to the window.
+ w and h are the size of the window.
+ */
+extern void gltrackball_track (trackball_state *, int x, int y, int w, int h);
+
+/* Stop tracking the mouse: Call this when the mouse button goes up.
+ */
+extern void gltrackball_stop (trackball_state *);
+
+/* Execute the rotations current encapsulated in the trackball_state:
+ this does something analagous to glRotatef().
+ */
+extern void gltrackball_rotate (trackball_state *);
+
+/* Call this when a mouse-wheel click is detected.
+ Clicks act like horizontal or vertical drags.
+ Percent is the length of the drag as a percentage of the screen size.
+ Button is 'Button4' or 'Button5' (for the vertical wheel)
+ or 'Button5' or 'Button6' (for the horizontal wheel).
+ If `flip_p' is true, swap the horizontal and vertical axes.
+ */
+void gltrackball_mousewheel (trackball_state *ts,
+ int button, int percent, int flip_p);
+
+/* Return the quaternion encapsulated by the trackball state.
+ */
+extern void gltrackball_get_quaternion (trackball_state *ts, float q[4]);
+
+/* Reset the trackball to the default unrotated state,
+ plus an optional initial rotation.
+ */
+extern void gltrackball_reset (trackball_state *ts, float x, float y);
+
+/* A utility function for event-handler functions:
+ Handles the various motion and click events related to trackballs.
+ Returns True if the event was handled.
+ */
+extern Bool gltrackball_event_handler (XEvent *,
+ trackball_state *,
+ int window_width, int window_height,
+ Bool *button_down_p);
+
+#endif /* __GLTRACKBALL_H__ */
diff --git a/hacks/glx/glut_mroman.h b/hacks/glx/glut_mroman.h
new file mode 100644
index 0000000..39eb171
--- /dev/null
+++ b/hacks/glx/glut_mroman.h
@@ -0,0 +1,2456 @@
+/* Roman monospaced simplex stroke font copyright (c) 1989, 1990, 1991
+ * by Sun Microsystems, Inc. and the X Consortium.
+ * Originally part of the GLUT library by Mark J. Kilgard.
+ * I have changed names so that this can be a .h rather than a .c file without
+ * causing name clashes with glut_roman.h
+ */
+
+#include "glutstroke.h"
+
+/* char: 33 '!' */
+
+static const CoordRec monoChar33_stroke0[] = {
+ { 52.381, 100 },
+ { 52.381, 33.3333 },
+};
+
+static const CoordRec monoChar33_stroke1[] = {
+ { 52.381, 9.5238 },
+ { 47.6191, 4.7619 },
+ { 52.381, 0 },
+ { 57.1429, 4.7619 },
+ { 52.381, 9.5238 },
+};
+
+static const StrokeRec monoChar33[] = {
+ { 2, monoChar33_stroke0 },
+ { 5, monoChar33_stroke1 },
+};
+
+/* char: 34 '"' */
+
+static const CoordRec monoChar34_stroke0[] = {
+ { 33.3334, 100 },
+ { 33.3334, 66.6667 },
+};
+
+static const CoordRec monoChar34_stroke1[] = {
+ { 71.4286, 100 },
+ { 71.4286, 66.6667 },
+};
+
+static const StrokeRec monoChar34[] = {
+ { 2, monoChar34_stroke0 },
+ { 2, monoChar34_stroke1 },
+};
+
+/* char: 35 '#' */
+
+static const CoordRec monoChar35_stroke0[] = {
+ { 54.7619, 119.048 },
+ { 21.4286, -33.3333 },
+};
+
+static const CoordRec monoChar35_stroke1[] = {
+ { 83.3334, 119.048 },
+ { 50, -33.3333 },
+};
+
+static const CoordRec monoChar35_stroke2[] = {
+ { 21.4286, 57.1429 },
+ { 88.0952, 57.1429 },
+};
+
+static const CoordRec monoChar35_stroke3[] = {
+ { 16.6667, 28.5714 },
+ { 83.3334, 28.5714 },
+};
+
+static const StrokeRec monoChar35[] = {
+ { 2, monoChar35_stroke0 },
+ { 2, monoChar35_stroke1 },
+ { 2, monoChar35_stroke2 },
+ { 2, monoChar35_stroke3 },
+};
+
+/* char: 36 '$' */
+
+static const CoordRec monoChar36_stroke0[] = {
+ { 42.8571, 119.048 },
+ { 42.8571, -19.0476 },
+};
+
+static const CoordRec monoChar36_stroke1[] = {
+ { 61.9047, 119.048 },
+ { 61.9047, -19.0476 },
+};
+
+static const CoordRec monoChar36_stroke2[] = {
+ { 85.7143, 85.7143 },
+ { 76.1905, 95.2381 },
+ { 61.9047, 100 },
+ { 42.8571, 100 },
+ { 28.5714, 95.2381 },
+ { 19.0476, 85.7143 },
+ { 19.0476, 76.1905 },
+ { 23.8095, 66.6667 },
+ { 28.5714, 61.9048 },
+ { 38.0952, 57.1429 },
+ { 66.6666, 47.619 },
+ { 76.1905, 42.8571 },
+ { 80.9524, 38.0952 },
+ { 85.7143, 28.5714 },
+ { 85.7143, 14.2857 },
+ { 76.1905, 4.7619 },
+ { 61.9047, 0 },
+ { 42.8571, 0 },
+ { 28.5714, 4.7619 },
+ { 19.0476, 14.2857 },
+};
+
+static const StrokeRec monoChar36[] = {
+ { 2, monoChar36_stroke0 },
+ { 2, monoChar36_stroke1 },
+ { 20, monoChar36_stroke2 },
+};
+
+/* char: 37 '%' */
+
+static const CoordRec monoChar37_stroke0[] = {
+ { 95.2381, 100 },
+ { 9.5238, 0 },
+};
+
+static const CoordRec monoChar37_stroke1[] = {
+ { 33.3333, 100 },
+ { 42.8571, 90.4762 },
+ { 42.8571, 80.9524 },
+ { 38.0952, 71.4286 },
+ { 28.5714, 66.6667 },
+ { 19.0476, 66.6667 },
+ { 9.5238, 76.1905 },
+ { 9.5238, 85.7143 },
+ { 14.2857, 95.2381 },
+ { 23.8095, 100 },
+ { 33.3333, 100 },
+ { 42.8571, 95.2381 },
+ { 57.1428, 90.4762 },
+ { 71.4286, 90.4762 },
+ { 85.7143, 95.2381 },
+ { 95.2381, 100 },
+};
+
+static const CoordRec monoChar37_stroke2[] = {
+ { 76.1905, 33.3333 },
+ { 66.6667, 28.5714 },
+ { 61.9048, 19.0476 },
+ { 61.9048, 9.5238 },
+ { 71.4286, 0 },
+ { 80.9524, 0 },
+ { 90.4762, 4.7619 },
+ { 95.2381, 14.2857 },
+ { 95.2381, 23.8095 },
+ { 85.7143, 33.3333 },
+ { 76.1905, 33.3333 },
+};
+
+static const StrokeRec monoChar37[] = {
+ { 2, monoChar37_stroke0 },
+ { 16, monoChar37_stroke1 },
+ { 11, monoChar37_stroke2 },
+};
+
+/* char: 38 '&' */
+
+static const CoordRec monoChar38_stroke0[] = {
+ { 100, 57.1429 },
+ { 100, 61.9048 },
+ { 95.2381, 66.6667 },
+ { 90.4762, 66.6667 },
+ { 85.7143, 61.9048 },
+ { 80.9524, 52.381 },
+ { 71.4286, 28.5714 },
+ { 61.9048, 14.2857 },
+ { 52.3809, 4.7619 },
+ { 42.8571, 0 },
+ { 23.8095, 0 },
+ { 14.2857, 4.7619 },
+ { 9.5238, 9.5238 },
+ { 4.7619, 19.0476 },
+ { 4.7619, 28.5714 },
+ { 9.5238, 38.0952 },
+ { 14.2857, 42.8571 },
+ { 47.619, 61.9048 },
+ { 52.3809, 66.6667 },
+ { 57.1429, 76.1905 },
+ { 57.1429, 85.7143 },
+ { 52.3809, 95.2381 },
+ { 42.8571, 100 },
+ { 33.3333, 95.2381 },
+ { 28.5714, 85.7143 },
+ { 28.5714, 76.1905 },
+ { 33.3333, 61.9048 },
+ { 42.8571, 47.619 },
+ { 66.6667, 14.2857 },
+ { 76.1905, 4.7619 },
+ { 85.7143, 0 },
+ { 95.2381, 0 },
+ { 100, 4.7619 },
+ { 100, 9.5238 },
+};
+
+static const StrokeRec monoChar38[] = {
+ { 34, monoChar38_stroke0 },
+};
+
+/* char: 39 ''' */
+
+static const CoordRec monoChar39_stroke0[] = {
+ { 52.381, 100 },
+ { 52.381, 66.6667 },
+};
+
+static const StrokeRec monoChar39[] = {
+ { 2, monoChar39_stroke0 },
+};
+
+/* char: 40 '(' */
+
+static const CoordRec monoChar40_stroke0[] = {
+ { 69.0476, 119.048 },
+ { 59.5238, 109.524 },
+ { 50, 95.2381 },
+ { 40.4762, 76.1905 },
+ { 35.7143, 52.381 },
+ { 35.7143, 33.3333 },
+ { 40.4762, 9.5238 },
+ { 50, -9.5238 },
+ { 59.5238, -23.8095 },
+ { 69.0476, -33.3333 },
+};
+
+static const StrokeRec monoChar40[] = {
+ { 10, monoChar40_stroke0 },
+};
+
+/* char: 41 ')' */
+
+static const CoordRec monoChar41_stroke0[] = {
+ { 35.7143, 119.048 },
+ { 45.2381, 109.524 },
+ { 54.7619, 95.2381 },
+ { 64.2857, 76.1905 },
+ { 69.0476, 52.381 },
+ { 69.0476, 33.3333 },
+ { 64.2857, 9.5238 },
+ { 54.7619, -9.5238 },
+ { 45.2381, -23.8095 },
+ { 35.7143, -33.3333 },
+};
+
+static const StrokeRec monoChar41[] = {
+ { 10, monoChar41_stroke0 },
+};
+
+/* char: 42 '*' */
+
+static const CoordRec monoChar42_stroke0[] = {
+ { 52.381, 71.4286 },
+ { 52.381, 14.2857 },
+};
+
+static const CoordRec monoChar42_stroke1[] = {
+ { 28.5715, 57.1429 },
+ { 76.1905, 28.5714 },
+};
+
+static const CoordRec monoChar42_stroke2[] = {
+ { 76.1905, 57.1429 },
+ { 28.5715, 28.5714 },
+};
+
+static const StrokeRec monoChar42[] = {
+ { 2, monoChar42_stroke0 },
+ { 2, monoChar42_stroke1 },
+ { 2, monoChar42_stroke2 },
+};
+
+/* char: 43 '+' */
+
+static const CoordRec monoChar43_stroke0[] = {
+ { 52.3809, 85.7143 },
+ { 52.3809, 0 },
+};
+
+static const CoordRec monoChar43_stroke1[] = {
+ { 9.5238, 42.8571 },
+ { 95.2381, 42.8571 },
+};
+
+static const StrokeRec monoChar43[] = {
+ { 2, monoChar43_stroke0 },
+ { 2, monoChar43_stroke1 },
+};
+
+/* char: 44 ',' */
+
+static const CoordRec monoChar44_stroke0[] = {
+ { 57.1429, 4.7619 },
+ { 52.381, 0 },
+ { 47.6191, 4.7619 },
+ { 52.381, 9.5238 },
+ { 57.1429, 4.7619 },
+ { 57.1429, -4.7619 },
+ { 52.381, -14.2857 },
+ { 47.6191, -19.0476 },
+};
+
+static const StrokeRec monoChar44[] = {
+ { 8, monoChar44_stroke0 },
+};
+
+/* char: 45 '-' */
+
+static const CoordRec monoChar45_stroke0[] = {
+ { 9.5238, 42.8571 },
+ { 95.2381, 42.8571 },
+};
+
+static const StrokeRec monoChar45[] = {
+ { 2, monoChar45_stroke0 },
+};
+
+/* char: 46 '.' */
+
+static const CoordRec monoChar46_stroke0[] = {
+ { 52.381, 9.5238 },
+ { 47.6191, 4.7619 },
+ { 52.381, 0 },
+ { 57.1429, 4.7619 },
+ { 52.381, 9.5238 },
+};
+
+static const StrokeRec monoChar46[] = {
+ { 5, monoChar46_stroke0 },
+};
+
+/* char: 47 '/' */
+
+static const CoordRec monoChar47_stroke0[] = {
+ { 19.0476, -14.2857 },
+ { 85.7143, 100 },
+};
+
+static const StrokeRec monoChar47[] = {
+ { 2, monoChar47_stroke0 },
+};
+
+/* char: 48 '0' */
+
+static const CoordRec monoChar48_stroke0[] = {
+ { 47.619, 100 },
+ { 33.3333, 95.2381 },
+ { 23.8095, 80.9524 },
+ { 19.0476, 57.1429 },
+ { 19.0476, 42.8571 },
+ { 23.8095, 19.0476 },
+ { 33.3333, 4.7619 },
+ { 47.619, 0 },
+ { 57.1428, 0 },
+ { 71.4286, 4.7619 },
+ { 80.9524, 19.0476 },
+ { 85.7143, 42.8571 },
+ { 85.7143, 57.1429 },
+ { 80.9524, 80.9524 },
+ { 71.4286, 95.2381 },
+ { 57.1428, 100 },
+ { 47.619, 100 },
+};
+
+static const StrokeRec monoChar48[] = {
+ { 17, monoChar48_stroke0 },
+};
+
+/* char: 49 '1' */
+
+static const CoordRec monoChar49_stroke0[] = {
+ { 40.4762, 80.9524 },
+ { 50, 85.7143 },
+ { 64.2857, 100 },
+ { 64.2857, 0 },
+};
+
+static const StrokeRec monoChar49[] = {
+ { 4, monoChar49_stroke0 },
+};
+
+/* char: 50 '2' */
+
+static const CoordRec monoChar50_stroke0[] = {
+ { 23.8095, 76.1905 },
+ { 23.8095, 80.9524 },
+ { 28.5714, 90.4762 },
+ { 33.3333, 95.2381 },
+ { 42.8571, 100 },
+ { 61.9047, 100 },
+ { 71.4286, 95.2381 },
+ { 76.1905, 90.4762 },
+ { 80.9524, 80.9524 },
+ { 80.9524, 71.4286 },
+ { 76.1905, 61.9048 },
+ { 66.6666, 47.619 },
+ { 19.0476, 0 },
+ { 85.7143, 0 },
+};
+
+static const StrokeRec monoChar50[] = {
+ { 14, monoChar50_stroke0 },
+};
+
+/* char: 51 '3' */
+
+static const CoordRec monoChar51_stroke0[] = {
+ { 28.5714, 100 },
+ { 80.9524, 100 },
+ { 52.3809, 61.9048 },
+ { 66.6666, 61.9048 },
+ { 76.1905, 57.1429 },
+ { 80.9524, 52.381 },
+ { 85.7143, 38.0952 },
+ { 85.7143, 28.5714 },
+ { 80.9524, 14.2857 },
+ { 71.4286, 4.7619 },
+ { 57.1428, 0 },
+ { 42.8571, 0 },
+ { 28.5714, 4.7619 },
+ { 23.8095, 9.5238 },
+ { 19.0476, 19.0476 },
+};
+
+static const StrokeRec monoChar51[] = {
+ { 15, monoChar51_stroke0 },
+};
+
+/* char: 52 '4' */
+
+static const CoordRec monoChar52_stroke0[] = {
+ { 64.2857, 100 },
+ { 16.6667, 33.3333 },
+ { 88.0952, 33.3333 },
+};
+
+static const CoordRec monoChar52_stroke1[] = {
+ { 64.2857, 100 },
+ { 64.2857, 0 },
+};
+
+static const StrokeRec monoChar52[] = {
+ { 3, monoChar52_stroke0 },
+ { 2, monoChar52_stroke1 },
+};
+
+/* char: 53 '5' */
+
+static const CoordRec monoChar53_stroke0[] = {
+ { 76.1905, 100 },
+ { 28.5714, 100 },
+ { 23.8095, 57.1429 },
+ { 28.5714, 61.9048 },
+ { 42.8571, 66.6667 },
+ { 57.1428, 66.6667 },
+ { 71.4286, 61.9048 },
+ { 80.9524, 52.381 },
+ { 85.7143, 38.0952 },
+ { 85.7143, 28.5714 },
+ { 80.9524, 14.2857 },
+ { 71.4286, 4.7619 },
+ { 57.1428, 0 },
+ { 42.8571, 0 },
+ { 28.5714, 4.7619 },
+ { 23.8095, 9.5238 },
+ { 19.0476, 19.0476 },
+};
+
+static const StrokeRec monoChar53[] = {
+ { 17, monoChar53_stroke0 },
+};
+
+/* char: 54 '6' */
+
+static const CoordRec monoChar54_stroke0[] = {
+ { 78.5714, 85.7143 },
+ { 73.8096, 95.2381 },
+ { 59.5238, 100 },
+ { 50, 100 },
+ { 35.7143, 95.2381 },
+ { 26.1905, 80.9524 },
+ { 21.4286, 57.1429 },
+ { 21.4286, 33.3333 },
+ { 26.1905, 14.2857 },
+ { 35.7143, 4.7619 },
+ { 50, 0 },
+ { 54.7619, 0 },
+ { 69.0476, 4.7619 },
+ { 78.5714, 14.2857 },
+ { 83.3334, 28.5714 },
+ { 83.3334, 33.3333 },
+ { 78.5714, 47.619 },
+ { 69.0476, 57.1429 },
+ { 54.7619, 61.9048 },
+ { 50, 61.9048 },
+ { 35.7143, 57.1429 },
+ { 26.1905, 47.619 },
+ { 21.4286, 33.3333 },
+};
+
+static const StrokeRec monoChar54[] = {
+ { 23, monoChar54_stroke0 },
+};
+
+/* char: 55 '7' */
+
+static const CoordRec monoChar55_stroke0[] = {
+ { 85.7143, 100 },
+ { 38.0952, 0 },
+};
+
+static const CoordRec monoChar55_stroke1[] = {
+ { 19.0476, 100 },
+ { 85.7143, 100 },
+};
+
+static const StrokeRec monoChar55[] = {
+ { 2, monoChar55_stroke0 },
+ { 2, monoChar55_stroke1 },
+};
+
+/* char: 56 '8' */
+
+static const CoordRec monoChar56_stroke0[] = {
+ { 42.8571, 100 },
+ { 28.5714, 95.2381 },
+ { 23.8095, 85.7143 },
+ { 23.8095, 76.1905 },
+ { 28.5714, 66.6667 },
+ { 38.0952, 61.9048 },
+ { 57.1428, 57.1429 },
+ { 71.4286, 52.381 },
+ { 80.9524, 42.8571 },
+ { 85.7143, 33.3333 },
+ { 85.7143, 19.0476 },
+ { 80.9524, 9.5238 },
+ { 76.1905, 4.7619 },
+ { 61.9047, 0 },
+ { 42.8571, 0 },
+ { 28.5714, 4.7619 },
+ { 23.8095, 9.5238 },
+ { 19.0476, 19.0476 },
+ { 19.0476, 33.3333 },
+ { 23.8095, 42.8571 },
+ { 33.3333, 52.381 },
+ { 47.619, 57.1429 },
+ { 66.6666, 61.9048 },
+ { 76.1905, 66.6667 },
+ { 80.9524, 76.1905 },
+ { 80.9524, 85.7143 },
+ { 76.1905, 95.2381 },
+ { 61.9047, 100 },
+ { 42.8571, 100 },
+};
+
+static const StrokeRec monoChar56[] = {
+ { 29, monoChar56_stroke0 },
+};
+
+/* char: 57 '9' */
+
+static const CoordRec monoChar57_stroke0[] = {
+ { 83.3334, 66.6667 },
+ { 78.5714, 52.381 },
+ { 69.0476, 42.8571 },
+ { 54.7619, 38.0952 },
+ { 50, 38.0952 },
+ { 35.7143, 42.8571 },
+ { 26.1905, 52.381 },
+ { 21.4286, 66.6667 },
+ { 21.4286, 71.4286 },
+ { 26.1905, 85.7143 },
+ { 35.7143, 95.2381 },
+ { 50, 100 },
+ { 54.7619, 100 },
+ { 69.0476, 95.2381 },
+ { 78.5714, 85.7143 },
+ { 83.3334, 66.6667 },
+ { 83.3334, 42.8571 },
+ { 78.5714, 19.0476 },
+ { 69.0476, 4.7619 },
+ { 54.7619, 0 },
+ { 45.2381, 0 },
+ { 30.9524, 4.7619 },
+ { 26.1905, 14.2857 },
+};
+
+static const StrokeRec monoChar57[] = {
+ { 23, monoChar57_stroke0 },
+};
+
+/* char: 58 ':' */
+
+static const CoordRec monoChar58_stroke0[] = {
+ { 52.381, 66.6667 },
+ { 47.6191, 61.9048 },
+ { 52.381, 57.1429 },
+ { 57.1429, 61.9048 },
+ { 52.381, 66.6667 },
+};
+
+static const CoordRec monoChar58_stroke1[] = {
+ { 52.381, 9.5238 },
+ { 47.6191, 4.7619 },
+ { 52.381, 0 },
+ { 57.1429, 4.7619 },
+ { 52.381, 9.5238 },
+};
+
+static const StrokeRec monoChar58[] = {
+ { 5, monoChar58_stroke0 },
+ { 5, monoChar58_stroke1 },
+};
+
+/* char: 59 ';' */
+
+static const CoordRec monoChar59_stroke0[] = {
+ { 52.381, 66.6667 },
+ { 47.6191, 61.9048 },
+ { 52.381, 57.1429 },
+ { 57.1429, 61.9048 },
+ { 52.381, 66.6667 },
+};
+
+static const CoordRec monoChar59_stroke1[] = {
+ { 57.1429, 4.7619 },
+ { 52.381, 0 },
+ { 47.6191, 4.7619 },
+ { 52.381, 9.5238 },
+ { 57.1429, 4.7619 },
+ { 57.1429, -4.7619 },
+ { 52.381, -14.2857 },
+ { 47.6191, -19.0476 },
+};
+
+static const StrokeRec monoChar59[] = {
+ { 5, monoChar59_stroke0 },
+ { 8, monoChar59_stroke1 },
+};
+
+/* char: 60 '<' */
+
+static const CoordRec monoChar60_stroke0[] = {
+ { 90.4762, 85.7143 },
+ { 14.2857, 42.8571 },
+ { 90.4762, 0 },
+};
+
+static const StrokeRec monoChar60[] = {
+ { 3, monoChar60_stroke0 },
+};
+
+/* char: 61 '=' */
+
+static const CoordRec monoChar61_stroke0[] = {
+ { 9.5238, 57.1429 },
+ { 95.2381, 57.1429 },
+};
+
+static const CoordRec monoChar61_stroke1[] = {
+ { 9.5238, 28.5714 },
+ { 95.2381, 28.5714 },
+};
+
+static const StrokeRec monoChar61[] = {
+ { 2, monoChar61_stroke0 },
+ { 2, monoChar61_stroke1 },
+};
+
+/* char: 62 '>' */
+
+static const CoordRec monoChar62_stroke0[] = {
+ { 14.2857, 85.7143 },
+ { 90.4762, 42.8571 },
+ { 14.2857, 0 },
+};
+
+static const StrokeRec monoChar62[] = {
+ { 3, monoChar62_stroke0 },
+};
+
+/* char: 63 '?' */
+
+static const CoordRec monoChar63_stroke0[] = {
+ { 23.8095, 76.1905 },
+ { 23.8095, 80.9524 },
+ { 28.5714, 90.4762 },
+ { 33.3333, 95.2381 },
+ { 42.8571, 100 },
+ { 61.9047, 100 },
+ { 71.4285, 95.2381 },
+ { 76.1905, 90.4762 },
+ { 80.9524, 80.9524 },
+ { 80.9524, 71.4286 },
+ { 76.1905, 61.9048 },
+ { 71.4285, 57.1429 },
+ { 52.3809, 47.619 },
+ { 52.3809, 33.3333 },
+};
+
+static const CoordRec monoChar63_stroke1[] = {
+ { 52.3809, 9.5238 },
+ { 47.619, 4.7619 },
+ { 52.3809, 0 },
+ { 57.1428, 4.7619 },
+ { 52.3809, 9.5238 },
+};
+
+static const StrokeRec monoChar63[] = {
+ { 14, monoChar63_stroke0 },
+ { 5, monoChar63_stroke1 },
+};
+
+/* char: 64 '@' */
+
+static const CoordRec monoChar64_stroke0[] = {
+ { 64.2857, 52.381 },
+ { 54.7619, 57.1429 },
+ { 45.2381, 57.1429 },
+ { 40.4762, 47.619 },
+ { 40.4762, 42.8571 },
+ { 45.2381, 33.3333 },
+ { 54.7619, 33.3333 },
+ { 64.2857, 38.0952 },
+};
+
+static const CoordRec monoChar64_stroke1[] = {
+ { 64.2857, 57.1429 },
+ { 64.2857, 38.0952 },
+ { 69.0476, 33.3333 },
+ { 78.5714, 33.3333 },
+ { 83.3334, 42.8571 },
+ { 83.3334, 47.619 },
+ { 78.5714, 61.9048 },
+ { 69.0476, 71.4286 },
+ { 54.7619, 76.1905 },
+ { 50, 76.1905 },
+ { 35.7143, 71.4286 },
+ { 26.1905, 61.9048 },
+ { 21.4286, 47.619 },
+ { 21.4286, 42.8571 },
+ { 26.1905, 28.5714 },
+ { 35.7143, 19.0476 },
+ { 50, 14.2857 },
+ { 54.7619, 14.2857 },
+ { 69.0476, 19.0476 },
+};
+
+static const StrokeRec monoChar64[] = {
+ { 8, monoChar64_stroke0 },
+ { 19, monoChar64_stroke1 },
+};
+
+/* char: 65 'A' */
+
+static const CoordRec monoChar65_stroke0[] = {
+ { 52.3809, 100 },
+ { 14.2857, 0 },
+};
+
+static const CoordRec monoChar65_stroke1[] = {
+ { 52.3809, 100 },
+ { 90.4762, 0 },
+};
+
+static const CoordRec monoChar65_stroke2[] = {
+ { 28.5714, 33.3333 },
+ { 76.1905, 33.3333 },
+};
+
+static const StrokeRec monoChar65[] = {
+ { 2, monoChar65_stroke0 },
+ { 2, monoChar65_stroke1 },
+ { 2, monoChar65_stroke2 },
+};
+
+/* char: 66 'B' */
+
+static const CoordRec monoChar66_stroke0[] = {
+ { 19.0476, 100 },
+ { 19.0476, 0 },
+};
+
+static const CoordRec monoChar66_stroke1[] = {
+ { 19.0476, 100 },
+ { 61.9047, 100 },
+ { 76.1905, 95.2381 },
+ { 80.9524, 90.4762 },
+ { 85.7143, 80.9524 },
+ { 85.7143, 71.4286 },
+ { 80.9524, 61.9048 },
+ { 76.1905, 57.1429 },
+ { 61.9047, 52.381 },
+};
+
+static const CoordRec monoChar66_stroke2[] = {
+ { 19.0476, 52.381 },
+ { 61.9047, 52.381 },
+ { 76.1905, 47.619 },
+ { 80.9524, 42.8571 },
+ { 85.7143, 33.3333 },
+ { 85.7143, 19.0476 },
+ { 80.9524, 9.5238 },
+ { 76.1905, 4.7619 },
+ { 61.9047, 0 },
+ { 19.0476, 0 },
+};
+
+static const StrokeRec monoChar66[] = {
+ { 2, monoChar66_stroke0 },
+ { 9, monoChar66_stroke1 },
+ { 10, monoChar66_stroke2 },
+};
+
+/* char: 67 'C' */
+
+static const CoordRec monoChar67_stroke0[] = {
+ { 88.0952, 76.1905 },
+ { 83.3334, 85.7143 },
+ { 73.8096, 95.2381 },
+ { 64.2857, 100 },
+ { 45.2381, 100 },
+ { 35.7143, 95.2381 },
+ { 26.1905, 85.7143 },
+ { 21.4286, 76.1905 },
+ { 16.6667, 61.9048 },
+ { 16.6667, 38.0952 },
+ { 21.4286, 23.8095 },
+ { 26.1905, 14.2857 },
+ { 35.7143, 4.7619 },
+ { 45.2381, 0 },
+ { 64.2857, 0 },
+ { 73.8096, 4.7619 },
+ { 83.3334, 14.2857 },
+ { 88.0952, 23.8095 },
+};
+
+static const StrokeRec monoChar67[] = {
+ { 18, monoChar67_stroke0 },
+};
+
+/* char: 68 'D' */
+
+static const CoordRec monoChar68_stroke0[] = {
+ { 19.0476, 100 },
+ { 19.0476, 0 },
+};
+
+static const CoordRec monoChar68_stroke1[] = {
+ { 19.0476, 100 },
+ { 52.3809, 100 },
+ { 66.6666, 95.2381 },
+ { 76.1905, 85.7143 },
+ { 80.9524, 76.1905 },
+ { 85.7143, 61.9048 },
+ { 85.7143, 38.0952 },
+ { 80.9524, 23.8095 },
+ { 76.1905, 14.2857 },
+ { 66.6666, 4.7619 },
+ { 52.3809, 0 },
+ { 19.0476, 0 },
+};
+
+static const StrokeRec monoChar68[] = {
+ { 2, monoChar68_stroke0 },
+ { 12, monoChar68_stroke1 },
+};
+
+/* char: 69 'E' */
+
+static const CoordRec monoChar69_stroke0[] = {
+ { 21.4286, 100 },
+ { 21.4286, 0 },
+};
+
+static const CoordRec monoChar69_stroke1[] = {
+ { 21.4286, 100 },
+ { 83.3334, 100 },
+};
+
+static const CoordRec monoChar69_stroke2[] = {
+ { 21.4286, 52.381 },
+ { 59.5238, 52.381 },
+};
+
+static const CoordRec monoChar69_stroke3[] = {
+ { 21.4286, 0 },
+ { 83.3334, 0 },
+};
+
+static const StrokeRec monoChar69[] = {
+ { 2, monoChar69_stroke0 },
+ { 2, monoChar69_stroke1 },
+ { 2, monoChar69_stroke2 },
+ { 2, monoChar69_stroke3 },
+};
+
+/* char: 70 'F' */
+
+static const CoordRec monoChar70_stroke0[] = {
+ { 21.4286, 100 },
+ { 21.4286, 0 },
+};
+
+static const CoordRec monoChar70_stroke1[] = {
+ { 21.4286, 100 },
+ { 83.3334, 100 },
+};
+
+static const CoordRec monoChar70_stroke2[] = {
+ { 21.4286, 52.381 },
+ { 59.5238, 52.381 },
+};
+
+static const StrokeRec monoChar70[] = {
+ { 2, monoChar70_stroke0 },
+ { 2, monoChar70_stroke1 },
+ { 2, monoChar70_stroke2 },
+};
+
+/* char: 71 'G' */
+
+static const CoordRec monoChar71_stroke0[] = {
+ { 88.0952, 76.1905 },
+ { 83.3334, 85.7143 },
+ { 73.8096, 95.2381 },
+ { 64.2857, 100 },
+ { 45.2381, 100 },
+ { 35.7143, 95.2381 },
+ { 26.1905, 85.7143 },
+ { 21.4286, 76.1905 },
+ { 16.6667, 61.9048 },
+ { 16.6667, 38.0952 },
+ { 21.4286, 23.8095 },
+ { 26.1905, 14.2857 },
+ { 35.7143, 4.7619 },
+ { 45.2381, 0 },
+ { 64.2857, 0 },
+ { 73.8096, 4.7619 },
+ { 83.3334, 14.2857 },
+ { 88.0952, 23.8095 },
+ { 88.0952, 38.0952 },
+};
+
+static const CoordRec monoChar71_stroke1[] = {
+ { 64.2857, 38.0952 },
+ { 88.0952, 38.0952 },
+};
+
+static const StrokeRec monoChar71[] = {
+ { 19, monoChar71_stroke0 },
+ { 2, monoChar71_stroke1 },
+};
+
+/* char: 72 'H' */
+
+static const CoordRec monoChar72_stroke0[] = {
+ { 19.0476, 100 },
+ { 19.0476, 0 },
+};
+
+static const CoordRec monoChar72_stroke1[] = {
+ { 85.7143, 100 },
+ { 85.7143, 0 },
+};
+
+static const CoordRec monoChar72_stroke2[] = {
+ { 19.0476, 52.381 },
+ { 85.7143, 52.381 },
+};
+
+static const StrokeRec monoChar72[] = {
+ { 2, monoChar72_stroke0 },
+ { 2, monoChar72_stroke1 },
+ { 2, monoChar72_stroke2 },
+};
+
+/* char: 73 'I' */
+
+static const CoordRec monoChar73_stroke0[] = {
+ { 52.381, 100 },
+ { 52.381, 0 },
+};
+
+static const StrokeRec monoChar73[] = {
+ { 2, monoChar73_stroke0 },
+};
+
+/* char: 74 'J' */
+
+static const CoordRec monoChar74_stroke0[] = {
+ { 76.1905, 100 },
+ { 76.1905, 23.8095 },
+ { 71.4286, 9.5238 },
+ { 66.6667, 4.7619 },
+ { 57.1429, 0 },
+ { 47.6191, 0 },
+ { 38.0953, 4.7619 },
+ { 33.3334, 9.5238 },
+ { 28.5715, 23.8095 },
+ { 28.5715, 33.3333 },
+};
+
+static const StrokeRec monoChar74[] = {
+ { 10, monoChar74_stroke0 },
+};
+
+/* char: 75 'K' */
+
+static const CoordRec monoChar75_stroke0[] = {
+ { 19.0476, 100 },
+ { 19.0476, 0 },
+};
+
+static const CoordRec monoChar75_stroke1[] = {
+ { 85.7143, 100 },
+ { 19.0476, 33.3333 },
+};
+
+static const CoordRec monoChar75_stroke2[] = {
+ { 42.8571, 57.1429 },
+ { 85.7143, 0 },
+};
+
+static const StrokeRec monoChar75[] = {
+ { 2, monoChar75_stroke0 },
+ { 2, monoChar75_stroke1 },
+ { 2, monoChar75_stroke2 },
+};
+
+/* char: 76 'L' */
+
+static const CoordRec monoChar76_stroke0[] = {
+ { 23.8095, 100 },
+ { 23.8095, 0 },
+};
+
+static const CoordRec monoChar76_stroke1[] = {
+ { 23.8095, 0 },
+ { 80.9524, 0 },
+};
+
+static const StrokeRec monoChar76[] = {
+ { 2, monoChar76_stroke0 },
+ { 2, monoChar76_stroke1 },
+};
+
+/* char: 77 'M' */
+
+static const CoordRec monoChar77_stroke0[] = {
+ { 14.2857, 100 },
+ { 14.2857, 0 },
+};
+
+static const CoordRec monoChar77_stroke1[] = {
+ { 14.2857, 100 },
+ { 52.3809, 0 },
+};
+
+static const CoordRec monoChar77_stroke2[] = {
+ { 90.4762, 100 },
+ { 52.3809, 0 },
+};
+
+static const CoordRec monoChar77_stroke3[] = {
+ { 90.4762, 100 },
+ { 90.4762, 0 },
+};
+
+static const StrokeRec monoChar77[] = {
+ { 2, monoChar77_stroke0 },
+ { 2, monoChar77_stroke1 },
+ { 2, monoChar77_stroke2 },
+ { 2, monoChar77_stroke3 },
+};
+
+/* char: 78 'N' */
+
+static const CoordRec monoChar78_stroke0[] = {
+ { 19.0476, 100 },
+ { 19.0476, 0 },
+};
+
+static const CoordRec monoChar78_stroke1[] = {
+ { 19.0476, 100 },
+ { 85.7143, 0 },
+};
+
+static const CoordRec monoChar78_stroke2[] = {
+ { 85.7143, 100 },
+ { 85.7143, 0 },
+};
+
+static const StrokeRec monoChar78[] = {
+ { 2, monoChar78_stroke0 },
+ { 2, monoChar78_stroke1 },
+ { 2, monoChar78_stroke2 },
+};
+
+/* char: 79 'O' */
+
+static const CoordRec monoChar79_stroke0[] = {
+ { 42.8571, 100 },
+ { 33.3333, 95.2381 },
+ { 23.8095, 85.7143 },
+ { 19.0476, 76.1905 },
+ { 14.2857, 61.9048 },
+ { 14.2857, 38.0952 },
+ { 19.0476, 23.8095 },
+ { 23.8095, 14.2857 },
+ { 33.3333, 4.7619 },
+ { 42.8571, 0 },
+ { 61.9047, 0 },
+ { 71.4286, 4.7619 },
+ { 80.9524, 14.2857 },
+ { 85.7143, 23.8095 },
+ { 90.4762, 38.0952 },
+ { 90.4762, 61.9048 },
+ { 85.7143, 76.1905 },
+ { 80.9524, 85.7143 },
+ { 71.4286, 95.2381 },
+ { 61.9047, 100 },
+ { 42.8571, 100 },
+};
+
+static const StrokeRec monoChar79[] = {
+ { 21, monoChar79_stroke0 },
+};
+
+/* char: 80 'P' */
+
+static const CoordRec monoChar80_stroke0[] = {
+ { 19.0476, 100 },
+ { 19.0476, 0 },
+};
+
+static const CoordRec monoChar80_stroke1[] = {
+ { 19.0476, 100 },
+ { 61.9047, 100 },
+ { 76.1905, 95.2381 },
+ { 80.9524, 90.4762 },
+ { 85.7143, 80.9524 },
+ { 85.7143, 66.6667 },
+ { 80.9524, 57.1429 },
+ { 76.1905, 52.381 },
+ { 61.9047, 47.619 },
+ { 19.0476, 47.619 },
+};
+
+static const StrokeRec monoChar80[] = {
+ { 2, monoChar80_stroke0 },
+ { 10, monoChar80_stroke1 },
+};
+
+/* char: 81 'Q' */
+
+static const CoordRec monoChar81_stroke0[] = {
+ { 42.8571, 100 },
+ { 33.3333, 95.2381 },
+ { 23.8095, 85.7143 },
+ { 19.0476, 76.1905 },
+ { 14.2857, 61.9048 },
+ { 14.2857, 38.0952 },
+ { 19.0476, 23.8095 },
+ { 23.8095, 14.2857 },
+ { 33.3333, 4.7619 },
+ { 42.8571, 0 },
+ { 61.9047, 0 },
+ { 71.4286, 4.7619 },
+ { 80.9524, 14.2857 },
+ { 85.7143, 23.8095 },
+ { 90.4762, 38.0952 },
+ { 90.4762, 61.9048 },
+ { 85.7143, 76.1905 },
+ { 80.9524, 85.7143 },
+ { 71.4286, 95.2381 },
+ { 61.9047, 100 },
+ { 42.8571, 100 },
+};
+
+static const CoordRec monoChar81_stroke1[] = {
+ { 57.1428, 19.0476 },
+ { 85.7143, -9.5238 },
+};
+
+static const StrokeRec monoChar81[] = {
+ { 21, monoChar81_stroke0 },
+ { 2, monoChar81_stroke1 },
+};
+
+/* char: 82 'R' */
+
+static const CoordRec monoChar82_stroke0[] = {
+ { 19.0476, 100 },
+ { 19.0476, 0 },
+};
+
+static const CoordRec monoChar82_stroke1[] = {
+ { 19.0476, 100 },
+ { 61.9047, 100 },
+ { 76.1905, 95.2381 },
+ { 80.9524, 90.4762 },
+ { 85.7143, 80.9524 },
+ { 85.7143, 71.4286 },
+ { 80.9524, 61.9048 },
+ { 76.1905, 57.1429 },
+ { 61.9047, 52.381 },
+ { 19.0476, 52.381 },
+};
+
+static const CoordRec monoChar82_stroke2[] = {
+ { 52.3809, 52.381 },
+ { 85.7143, 0 },
+};
+
+static const StrokeRec monoChar82[] = {
+ { 2, monoChar82_stroke0 },
+ { 10, monoChar82_stroke1 },
+ { 2, monoChar82_stroke2 },
+};
+
+/* char: 83 'S' */
+
+static const CoordRec monoChar83_stroke0[] = {
+ { 85.7143, 85.7143 },
+ { 76.1905, 95.2381 },
+ { 61.9047, 100 },
+ { 42.8571, 100 },
+ { 28.5714, 95.2381 },
+ { 19.0476, 85.7143 },
+ { 19.0476, 76.1905 },
+ { 23.8095, 66.6667 },
+ { 28.5714, 61.9048 },
+ { 38.0952, 57.1429 },
+ { 66.6666, 47.619 },
+ { 76.1905, 42.8571 },
+ { 80.9524, 38.0952 },
+ { 85.7143, 28.5714 },
+ { 85.7143, 14.2857 },
+ { 76.1905, 4.7619 },
+ { 61.9047, 0 },
+ { 42.8571, 0 },
+ { 28.5714, 4.7619 },
+ { 19.0476, 14.2857 },
+};
+
+static const StrokeRec monoChar83[] = {
+ { 20, monoChar83_stroke0 },
+};
+
+/* char: 84 'T' */
+
+static const CoordRec monoChar84_stroke0[] = {
+ { 52.3809, 100 },
+ { 52.3809, 0 },
+};
+
+static const CoordRec monoChar84_stroke1[] = {
+ { 19.0476, 100 },
+ { 85.7143, 100 },
+};
+
+static const StrokeRec monoChar84[] = {
+ { 2, monoChar84_stroke0 },
+ { 2, monoChar84_stroke1 },
+};
+
+/* char: 85 'U' */
+
+static const CoordRec monoChar85_stroke0[] = {
+ { 19.0476, 100 },
+ { 19.0476, 28.5714 },
+ { 23.8095, 14.2857 },
+ { 33.3333, 4.7619 },
+ { 47.619, 0 },
+ { 57.1428, 0 },
+ { 71.4286, 4.7619 },
+ { 80.9524, 14.2857 },
+ { 85.7143, 28.5714 },
+ { 85.7143, 100 },
+};
+
+static const StrokeRec monoChar85[] = {
+ { 10, monoChar85_stroke0 },
+};
+
+/* char: 86 'V' */
+
+static const CoordRec monoChar86_stroke0[] = {
+ { 14.2857, 100 },
+ { 52.3809, 0 },
+};
+
+static const CoordRec monoChar86_stroke1[] = {
+ { 90.4762, 100 },
+ { 52.3809, 0 },
+};
+
+static const StrokeRec monoChar86[] = {
+ { 2, monoChar86_stroke0 },
+ { 2, monoChar86_stroke1 },
+};
+
+/* char: 87 'W' */
+
+static const CoordRec monoChar87_stroke0[] = {
+ { 4.7619, 100 },
+ { 28.5714, 0 },
+};
+
+static const CoordRec monoChar87_stroke1[] = {
+ { 52.3809, 100 },
+ { 28.5714, 0 },
+};
+
+static const CoordRec monoChar87_stroke2[] = {
+ { 52.3809, 100 },
+ { 76.1905, 0 },
+};
+
+static const CoordRec monoChar87_stroke3[] = {
+ { 100, 100 },
+ { 76.1905, 0 },
+};
+
+static const StrokeRec monoChar87[] = {
+ { 2, monoChar87_stroke0 },
+ { 2, monoChar87_stroke1 },
+ { 2, monoChar87_stroke2 },
+ { 2, monoChar87_stroke3 },
+};
+
+/* char: 88 'X' */
+
+static const CoordRec monoChar88_stroke0[] = {
+ { 19.0476, 100 },
+ { 85.7143, 0 },
+};
+
+static const CoordRec monoChar88_stroke1[] = {
+ { 85.7143, 100 },
+ { 19.0476, 0 },
+};
+
+static const StrokeRec monoChar88[] = {
+ { 2, monoChar88_stroke0 },
+ { 2, monoChar88_stroke1 },
+};
+
+/* char: 89 'Y' */
+
+static const CoordRec monoChar89_stroke0[] = {
+ { 14.2857, 100 },
+ { 52.3809, 52.381 },
+ { 52.3809, 0 },
+};
+
+static const CoordRec monoChar89_stroke1[] = {
+ { 90.4762, 100 },
+ { 52.3809, 52.381 },
+};
+
+static const StrokeRec monoChar89[] = {
+ { 3, monoChar89_stroke0 },
+ { 2, monoChar89_stroke1 },
+};
+
+/* char: 90 'Z' */
+
+static const CoordRec monoChar90_stroke0[] = {
+ { 85.7143, 100 },
+ { 19.0476, 0 },
+};
+
+static const CoordRec monoChar90_stroke1[] = {
+ { 19.0476, 100 },
+ { 85.7143, 100 },
+};
+
+static const CoordRec monoChar90_stroke2[] = {
+ { 19.0476, 0 },
+ { 85.7143, 0 },
+};
+
+static const StrokeRec monoChar90[] = {
+ { 2, monoChar90_stroke0 },
+ { 2, monoChar90_stroke1 },
+ { 2, monoChar90_stroke2 },
+};
+
+/* char: 91 '[' */
+
+static const CoordRec monoChar91_stroke0[] = {
+ { 35.7143, 119.048 },
+ { 35.7143, -33.3333 },
+};
+
+static const CoordRec monoChar91_stroke1[] = {
+ { 40.4762, 119.048 },
+ { 40.4762, -33.3333 },
+};
+
+static const CoordRec monoChar91_stroke2[] = {
+ { 35.7143, 119.048 },
+ { 69.0476, 119.048 },
+};
+
+static const CoordRec monoChar91_stroke3[] = {
+ { 35.7143, -33.3333 },
+ { 69.0476, -33.3333 },
+};
+
+static const StrokeRec monoChar91[] = {
+ { 2, monoChar91_stroke0 },
+ { 2, monoChar91_stroke1 },
+ { 2, monoChar91_stroke2 },
+ { 2, monoChar91_stroke3 },
+};
+
+/* char: 92 '\' */
+
+static const CoordRec monoChar92_stroke0[] = {
+ { 19.0476, 100 },
+ { 85.7143, -14.2857 },
+};
+
+static const StrokeRec monoChar92[] = {
+ { 2, monoChar92_stroke0 },
+};
+
+/* char: 93 ']' */
+
+static const CoordRec monoChar93_stroke0[] = {
+ { 64.2857, 119.048 },
+ { 64.2857, -33.3333 },
+};
+
+static const CoordRec monoChar93_stroke1[] = {
+ { 69.0476, 119.048 },
+ { 69.0476, -33.3333 },
+};
+
+static const CoordRec monoChar93_stroke2[] = {
+ { 35.7143, 119.048 },
+ { 69.0476, 119.048 },
+};
+
+static const CoordRec monoChar93_stroke3[] = {
+ { 35.7143, -33.3333 },
+ { 69.0476, -33.3333 },
+};
+
+static const StrokeRec monoChar93[] = {
+ { 2, monoChar93_stroke0 },
+ { 2, monoChar93_stroke1 },
+ { 2, monoChar93_stroke2 },
+ { 2, monoChar93_stroke3 },
+};
+
+/* char: 94 '^' */
+
+static const CoordRec monoChar94_stroke0[] = {
+ { 52.3809, 109.524 },
+ { 14.2857, 42.8571 },
+};
+
+static const CoordRec monoChar94_stroke1[] = {
+ { 52.3809, 109.524 },
+ { 90.4762, 42.8571 },
+};
+
+static const StrokeRec monoChar94[] = {
+ { 2, monoChar94_stroke0 },
+ { 2, monoChar94_stroke1 },
+};
+
+/* char: 95 '_' */
+
+static const CoordRec monoChar95_stroke0[] = {
+ { 0, -33.3333 },
+ { 104.762, -33.3333 },
+ { 104.762, -28.5714 },
+ { 0, -28.5714 },
+ { 0, -33.3333 },
+};
+
+static const StrokeRec monoChar95[] = {
+ { 5, monoChar95_stroke0 },
+};
+
+/* char: 96 '`' */
+
+static const CoordRec monoChar96_stroke0[] = {
+ { 42.8572, 100 },
+ { 66.6667, 71.4286 },
+};
+
+static const CoordRec monoChar96_stroke1[] = {
+ { 42.8572, 100 },
+ { 38.0953, 95.2381 },
+ { 66.6667, 71.4286 },
+};
+
+static const StrokeRec monoChar96[] = {
+ { 2, monoChar96_stroke0 },
+ { 3, monoChar96_stroke1 },
+};
+
+/* char: 97 'a' */
+
+static const CoordRec monoChar97_stroke0[] = {
+ { 80.9524, 66.6667 },
+ { 80.9524, 0 },
+};
+
+static const CoordRec monoChar97_stroke1[] = {
+ { 80.9524, 52.381 },
+ { 71.4285, 61.9048 },
+ { 61.9047, 66.6667 },
+ { 47.619, 66.6667 },
+ { 38.0952, 61.9048 },
+ { 28.5714, 52.381 },
+ { 23.8095, 38.0952 },
+ { 23.8095, 28.5714 },
+ { 28.5714, 14.2857 },
+ { 38.0952, 4.7619 },
+ { 47.619, 0 },
+ { 61.9047, 0 },
+ { 71.4285, 4.7619 },
+ { 80.9524, 14.2857 },
+};
+
+static const StrokeRec monoChar97[] = {
+ { 2, monoChar97_stroke0 },
+ { 14, monoChar97_stroke1 },
+};
+
+/* char: 98 'b' */
+
+static const CoordRec monoChar98_stroke0[] = {
+ { 23.8095, 100 },
+ { 23.8095, 0 },
+};
+
+static const CoordRec monoChar98_stroke1[] = {
+ { 23.8095, 52.381 },
+ { 33.3333, 61.9048 },
+ { 42.8571, 66.6667 },
+ { 57.1428, 66.6667 },
+ { 66.6666, 61.9048 },
+ { 76.1905, 52.381 },
+ { 80.9524, 38.0952 },
+ { 80.9524, 28.5714 },
+ { 76.1905, 14.2857 },
+ { 66.6666, 4.7619 },
+ { 57.1428, 0 },
+ { 42.8571, 0 },
+ { 33.3333, 4.7619 },
+ { 23.8095, 14.2857 },
+};
+
+static const StrokeRec monoChar98[] = {
+ { 2, monoChar98_stroke0 },
+ { 14, monoChar98_stroke1 },
+};
+
+/* char: 99 'c' */
+
+static const CoordRec monoChar99_stroke0[] = {
+ { 80.9524, 52.381 },
+ { 71.4285, 61.9048 },
+ { 61.9047, 66.6667 },
+ { 47.619, 66.6667 },
+ { 38.0952, 61.9048 },
+ { 28.5714, 52.381 },
+ { 23.8095, 38.0952 },
+ { 23.8095, 28.5714 },
+ { 28.5714, 14.2857 },
+ { 38.0952, 4.7619 },
+ { 47.619, 0 },
+ { 61.9047, 0 },
+ { 71.4285, 4.7619 },
+ { 80.9524, 14.2857 },
+};
+
+static const StrokeRec monoChar99[] = {
+ { 14, monoChar99_stroke0 },
+};
+
+/* char: 100 'd' */
+
+static const CoordRec monoChar100_stroke0[] = {
+ { 80.9524, 100 },
+ { 80.9524, 0 },
+};
+
+static const CoordRec monoChar100_stroke1[] = {
+ { 80.9524, 52.381 },
+ { 71.4285, 61.9048 },
+ { 61.9047, 66.6667 },
+ { 47.619, 66.6667 },
+ { 38.0952, 61.9048 },
+ { 28.5714, 52.381 },
+ { 23.8095, 38.0952 },
+ { 23.8095, 28.5714 },
+ { 28.5714, 14.2857 },
+ { 38.0952, 4.7619 },
+ { 47.619, 0 },
+ { 61.9047, 0 },
+ { 71.4285, 4.7619 },
+ { 80.9524, 14.2857 },
+};
+
+static const StrokeRec monoChar100[] = {
+ { 2, monoChar100_stroke0 },
+ { 14, monoChar100_stroke1 },
+};
+
+/* char: 101 'e' */
+
+static const CoordRec monoChar101_stroke0[] = {
+ { 23.8095, 38.0952 },
+ { 80.9524, 38.0952 },
+ { 80.9524, 47.619 },
+ { 76.1905, 57.1429 },
+ { 71.4285, 61.9048 },
+ { 61.9047, 66.6667 },
+ { 47.619, 66.6667 },
+ { 38.0952, 61.9048 },
+ { 28.5714, 52.381 },
+ { 23.8095, 38.0952 },
+ { 23.8095, 28.5714 },
+ { 28.5714, 14.2857 },
+ { 38.0952, 4.7619 },
+ { 47.619, 0 },
+ { 61.9047, 0 },
+ { 71.4285, 4.7619 },
+ { 80.9524, 14.2857 },
+};
+
+static const StrokeRec monoChar101[] = {
+ { 17, monoChar101_stroke0 },
+};
+
+/* char: 102 'f' */
+
+static const CoordRec monoChar102_stroke0[] = {
+ { 71.4286, 100 },
+ { 61.9048, 100 },
+ { 52.381, 95.2381 },
+ { 47.6191, 80.9524 },
+ { 47.6191, 0 },
+};
+
+static const CoordRec monoChar102_stroke1[] = {
+ { 33.3334, 66.6667 },
+ { 66.6667, 66.6667 },
+};
+
+static const StrokeRec monoChar102[] = {
+ { 5, monoChar102_stroke0 },
+ { 2, monoChar102_stroke1 },
+};
+
+/* char: 103 'g' */
+
+static const CoordRec monoChar103_stroke0[] = {
+ { 80.9524, 66.6667 },
+ { 80.9524, -9.5238 },
+ { 76.1905, -23.8095 },
+ { 71.4285, -28.5714 },
+ { 61.9047, -33.3333 },
+ { 47.619, -33.3333 },
+ { 38.0952, -28.5714 },
+};
+
+static const CoordRec monoChar103_stroke1[] = {
+ { 80.9524, 52.381 },
+ { 71.4285, 61.9048 },
+ { 61.9047, 66.6667 },
+ { 47.619, 66.6667 },
+ { 38.0952, 61.9048 },
+ { 28.5714, 52.381 },
+ { 23.8095, 38.0952 },
+ { 23.8095, 28.5714 },
+ { 28.5714, 14.2857 },
+ { 38.0952, 4.7619 },
+ { 47.619, 0 },
+ { 61.9047, 0 },
+ { 71.4285, 4.7619 },
+ { 80.9524, 14.2857 },
+};
+
+static const StrokeRec monoChar103[] = {
+ { 7, monoChar103_stroke0 },
+ { 14, monoChar103_stroke1 },
+};
+
+/* char: 104 'h' */
+
+static const CoordRec monoChar104_stroke0[] = {
+ { 26.1905, 100 },
+ { 26.1905, 0 },
+};
+
+static const CoordRec monoChar104_stroke1[] = {
+ { 26.1905, 47.619 },
+ { 40.4762, 61.9048 },
+ { 50, 66.6667 },
+ { 64.2857, 66.6667 },
+ { 73.8095, 61.9048 },
+ { 78.5715, 47.619 },
+ { 78.5715, 0 },
+};
+
+static const StrokeRec monoChar104[] = {
+ { 2, monoChar104_stroke0 },
+ { 7, monoChar104_stroke1 },
+};
+
+/* char: 105 'i' */
+
+static const CoordRec monoChar105_stroke0[] = {
+ { 47.6191, 100 },
+ { 52.381, 95.2381 },
+ { 57.1429, 100 },
+ { 52.381, 104.762 },
+ { 47.6191, 100 },
+};
+
+static const CoordRec monoChar105_stroke1[] = {
+ { 52.381, 66.6667 },
+ { 52.381, 0 },
+};
+
+static const StrokeRec monoChar105[] = {
+ { 5, monoChar105_stroke0 },
+ { 2, monoChar105_stroke1 },
+};
+
+/* char: 106 'j' */
+
+static const CoordRec monoChar106_stroke0[] = {
+ { 57.1429, 100 },
+ { 61.9048, 95.2381 },
+ { 66.6667, 100 },
+ { 61.9048, 104.762 },
+ { 57.1429, 100 },
+};
+
+static const CoordRec monoChar106_stroke1[] = {
+ { 61.9048, 66.6667 },
+ { 61.9048, -14.2857 },
+ { 57.1429, -28.5714 },
+ { 47.6191, -33.3333 },
+ { 38.0953, -33.3333 },
+};
+
+static const StrokeRec monoChar106[] = {
+ { 5, monoChar106_stroke0 },
+ { 5, monoChar106_stroke1 },
+};
+
+/* char: 107 'k' */
+
+static const CoordRec monoChar107_stroke0[] = {
+ { 26.1905, 100 },
+ { 26.1905, 0 },
+};
+
+static const CoordRec monoChar107_stroke1[] = {
+ { 73.8095, 66.6667 },
+ { 26.1905, 19.0476 },
+};
+
+static const CoordRec monoChar107_stroke2[] = {
+ { 45.2381, 38.0952 },
+ { 78.5715, 0 },
+};
+
+static const StrokeRec monoChar107[] = {
+ { 2, monoChar107_stroke0 },
+ { 2, monoChar107_stroke1 },
+ { 2, monoChar107_stroke2 },
+};
+
+/* char: 108 'l' */
+
+static const CoordRec monoChar108_stroke0[] = {
+ { 52.381, 100 },
+ { 52.381, 0 },
+};
+
+static const StrokeRec monoChar108[] = {
+ { 2, monoChar108_stroke0 },
+};
+
+/* char: 109 'm' */
+
+static const CoordRec monoChar109_stroke0[] = {
+ { 0, 66.6667 },
+ { 0, 0 },
+};
+
+static const CoordRec monoChar109_stroke1[] = {
+ { 0, 47.619 },
+ { 14.2857, 61.9048 },
+ { 23.8095, 66.6667 },
+ { 38.0952, 66.6667 },
+ { 47.619, 61.9048 },
+ { 52.381, 47.619 },
+ { 52.381, 0 },
+};
+
+static const CoordRec monoChar109_stroke2[] = {
+ { 52.381, 47.619 },
+ { 66.6667, 61.9048 },
+ { 76.1905, 66.6667 },
+ { 90.4762, 66.6667 },
+ { 100, 61.9048 },
+ { 104.762, 47.619 },
+ { 104.762, 0 },
+};
+
+static const StrokeRec monoChar109[] = {
+ { 2, monoChar109_stroke0 },
+ { 7, monoChar109_stroke1 },
+ { 7, monoChar109_stroke2 },
+};
+
+/* char: 110 'n' */
+
+static const CoordRec monoChar110_stroke0[] = {
+ { 26.1905, 66.6667 },
+ { 26.1905, 0 },
+};
+
+static const CoordRec monoChar110_stroke1[] = {
+ { 26.1905, 47.619 },
+ { 40.4762, 61.9048 },
+ { 50, 66.6667 },
+ { 64.2857, 66.6667 },
+ { 73.8095, 61.9048 },
+ { 78.5715, 47.619 },
+ { 78.5715, 0 },
+};
+
+static const StrokeRec monoChar110[] = {
+ { 2, monoChar110_stroke0 },
+ { 7, monoChar110_stroke1 },
+};
+
+/* char: 111 'o' */
+
+static const CoordRec monoChar111_stroke0[] = {
+ { 45.2381, 66.6667 },
+ { 35.7143, 61.9048 },
+ { 26.1905, 52.381 },
+ { 21.4286, 38.0952 },
+ { 21.4286, 28.5714 },
+ { 26.1905, 14.2857 },
+ { 35.7143, 4.7619 },
+ { 45.2381, 0 },
+ { 59.5238, 0 },
+ { 69.0476, 4.7619 },
+ { 78.5714, 14.2857 },
+ { 83.3334, 28.5714 },
+ { 83.3334, 38.0952 },
+ { 78.5714, 52.381 },
+ { 69.0476, 61.9048 },
+ { 59.5238, 66.6667 },
+ { 45.2381, 66.6667 },
+};
+
+static const StrokeRec monoChar111[] = {
+ { 17, monoChar111_stroke0 },
+};
+
+/* char: 112 'p' */
+
+static const CoordRec monoChar112_stroke0[] = {
+ { 23.8095, 66.6667 },
+ { 23.8095, -33.3333 },
+};
+
+static const CoordRec monoChar112_stroke1[] = {
+ { 23.8095, 52.381 },
+ { 33.3333, 61.9048 },
+ { 42.8571, 66.6667 },
+ { 57.1428, 66.6667 },
+ { 66.6666, 61.9048 },
+ { 76.1905, 52.381 },
+ { 80.9524, 38.0952 },
+ { 80.9524, 28.5714 },
+ { 76.1905, 14.2857 },
+ { 66.6666, 4.7619 },
+ { 57.1428, 0 },
+ { 42.8571, 0 },
+ { 33.3333, 4.7619 },
+ { 23.8095, 14.2857 },
+};
+
+static const StrokeRec monoChar112[] = {
+ { 2, monoChar112_stroke0 },
+ { 14, monoChar112_stroke1 },
+};
+
+/* char: 113 'q' */
+
+static const CoordRec monoChar113_stroke0[] = {
+ { 80.9524, 66.6667 },
+ { 80.9524, -33.3333 },
+};
+
+static const CoordRec monoChar113_stroke1[] = {
+ { 80.9524, 52.381 },
+ { 71.4285, 61.9048 },
+ { 61.9047, 66.6667 },
+ { 47.619, 66.6667 },
+ { 38.0952, 61.9048 },
+ { 28.5714, 52.381 },
+ { 23.8095, 38.0952 },
+ { 23.8095, 28.5714 },
+ { 28.5714, 14.2857 },
+ { 38.0952, 4.7619 },
+ { 47.619, 0 },
+ { 61.9047, 0 },
+ { 71.4285, 4.7619 },
+ { 80.9524, 14.2857 },
+};
+
+static const StrokeRec monoChar113[] = {
+ { 2, monoChar113_stroke0 },
+ { 14, monoChar113_stroke1 },
+};
+
+/* char: 114 'r' */
+
+static const CoordRec monoChar114_stroke0[] = {
+ { 33.3334, 66.6667 },
+ { 33.3334, 0 },
+};
+
+static const CoordRec monoChar114_stroke1[] = {
+ { 33.3334, 38.0952 },
+ { 38.0953, 52.381 },
+ { 47.6191, 61.9048 },
+ { 57.1429, 66.6667 },
+ { 71.4286, 66.6667 },
+};
+
+static const StrokeRec monoChar114[] = {
+ { 2, monoChar114_stroke0 },
+ { 5, monoChar114_stroke1 },
+};
+
+/* char: 115 's' */
+
+static const CoordRec monoChar115_stroke0[] = {
+ { 78.5715, 52.381 },
+ { 73.8095, 61.9048 },
+ { 59.5238, 66.6667 },
+ { 45.2381, 66.6667 },
+ { 30.9524, 61.9048 },
+ { 26.1905, 52.381 },
+ { 30.9524, 42.8571 },
+ { 40.4762, 38.0952 },
+ { 64.2857, 33.3333 },
+ { 73.8095, 28.5714 },
+ { 78.5715, 19.0476 },
+ { 78.5715, 14.2857 },
+ { 73.8095, 4.7619 },
+ { 59.5238, 0 },
+ { 45.2381, 0 },
+ { 30.9524, 4.7619 },
+ { 26.1905, 14.2857 },
+};
+
+static const StrokeRec monoChar115[] = {
+ { 17, monoChar115_stroke0 },
+};
+
+/* char: 116 't' */
+
+static const CoordRec monoChar116_stroke0[] = {
+ { 47.6191, 100 },
+ { 47.6191, 19.0476 },
+ { 52.381, 4.7619 },
+ { 61.9048, 0 },
+ { 71.4286, 0 },
+};
+
+static const CoordRec monoChar116_stroke1[] = {
+ { 33.3334, 66.6667 },
+ { 66.6667, 66.6667 },
+};
+
+static const StrokeRec monoChar116[] = {
+ { 5, monoChar116_stroke0 },
+ { 2, monoChar116_stroke1 },
+};
+
+/* char: 117 'u' */
+
+static const CoordRec monoChar117_stroke0[] = {
+ { 26.1905, 66.6667 },
+ { 26.1905, 19.0476 },
+ { 30.9524, 4.7619 },
+ { 40.4762, 0 },
+ { 54.7619, 0 },
+ { 64.2857, 4.7619 },
+ { 78.5715, 19.0476 },
+};
+
+static const CoordRec monoChar117_stroke1[] = {
+ { 78.5715, 66.6667 },
+ { 78.5715, 0 },
+};
+
+static const StrokeRec monoChar117[] = {
+ { 7, monoChar117_stroke0 },
+ { 2, monoChar117_stroke1 },
+};
+
+/* char: 118 'v' */
+
+static const CoordRec monoChar118_stroke0[] = {
+ { 23.8095, 66.6667 },
+ { 52.3809, 0 },
+};
+
+static const CoordRec monoChar118_stroke1[] = {
+ { 80.9524, 66.6667 },
+ { 52.3809, 0 },
+};
+
+static const StrokeRec monoChar118[] = {
+ { 2, monoChar118_stroke0 },
+ { 2, monoChar118_stroke1 },
+};
+
+/* char: 119 'w' */
+
+static const CoordRec monoChar119_stroke0[] = {
+ { 14.2857, 66.6667 },
+ { 33.3333, 0 },
+};
+
+static const CoordRec monoChar119_stroke1[] = {
+ { 52.3809, 66.6667 },
+ { 33.3333, 0 },
+};
+
+static const CoordRec monoChar119_stroke2[] = {
+ { 52.3809, 66.6667 },
+ { 71.4286, 0 },
+};
+
+static const CoordRec monoChar119_stroke3[] = {
+ { 90.4762, 66.6667 },
+ { 71.4286, 0 },
+};
+
+static const StrokeRec monoChar119[] = {
+ { 2, monoChar119_stroke0 },
+ { 2, monoChar119_stroke1 },
+ { 2, monoChar119_stroke2 },
+ { 2, monoChar119_stroke3 },
+};
+
+/* char: 120 'x' */
+
+static const CoordRec monoChar120_stroke0[] = {
+ { 26.1905, 66.6667 },
+ { 78.5715, 0 },
+};
+
+static const CoordRec monoChar120_stroke1[] = {
+ { 78.5715, 66.6667 },
+ { 26.1905, 0 },
+};
+
+static const StrokeRec monoChar120[] = {
+ { 2, monoChar120_stroke0 },
+ { 2, monoChar120_stroke1 },
+};
+
+/* char: 121 'y' */
+
+static const CoordRec monoChar121_stroke0[] = {
+ { 26.1905, 66.6667 },
+ { 54.7619, 0 },
+};
+
+static const CoordRec monoChar121_stroke1[] = {
+ { 83.3334, 66.6667 },
+ { 54.7619, 0 },
+ { 45.2381, -19.0476 },
+ { 35.7143, -28.5714 },
+ { 26.1905, -33.3333 },
+ { 21.4286, -33.3333 },
+};
+
+static const StrokeRec monoChar121[] = {
+ { 2, monoChar121_stroke0 },
+ { 6, monoChar121_stroke1 },
+};
+
+/* char: 122 'z' */
+
+static const CoordRec monoChar122_stroke0[] = {
+ { 78.5715, 66.6667 },
+ { 26.1905, 0 },
+};
+
+static const CoordRec monoChar122_stroke1[] = {
+ { 26.1905, 66.6667 },
+ { 78.5715, 66.6667 },
+};
+
+static const CoordRec monoChar122_stroke2[] = {
+ { 26.1905, 0 },
+ { 78.5715, 0 },
+};
+
+static const StrokeRec monoChar122[] = {
+ { 2, monoChar122_stroke0 },
+ { 2, monoChar122_stroke1 },
+ { 2, monoChar122_stroke2 },
+};
+
+/* char: 123 '{' */
+
+static const CoordRec monoChar123_stroke0[] = {
+ { 64.2857, 119.048 },
+ { 54.7619, 114.286 },
+ { 50, 109.524 },
+ { 45.2381, 100 },
+ { 45.2381, 90.4762 },
+ { 50, 80.9524 },
+ { 54.7619, 76.1905 },
+ { 59.5238, 66.6667 },
+ { 59.5238, 57.1429 },
+ { 50, 47.619 },
+};
+
+static const CoordRec monoChar123_stroke1[] = {
+ { 54.7619, 114.286 },
+ { 50, 104.762 },
+ { 50, 95.2381 },
+ { 54.7619, 85.7143 },
+ { 59.5238, 80.9524 },
+ { 64.2857, 71.4286 },
+ { 64.2857, 61.9048 },
+ { 59.5238, 52.381 },
+ { 40.4762, 42.8571 },
+ { 59.5238, 33.3333 },
+ { 64.2857, 23.8095 },
+ { 64.2857, 14.2857 },
+ { 59.5238, 4.7619 },
+ { 54.7619, 0 },
+ { 50, -9.5238 },
+ { 50, -19.0476 },
+ { 54.7619, -28.5714 },
+};
+
+static const CoordRec monoChar123_stroke2[] = {
+ { 50, 38.0952 },
+ { 59.5238, 28.5714 },
+ { 59.5238, 19.0476 },
+ { 54.7619, 9.5238 },
+ { 50, 4.7619 },
+ { 45.2381, -4.7619 },
+ { 45.2381, -14.2857 },
+ { 50, -23.8095 },
+ { 54.7619, -28.5714 },
+ { 64.2857, -33.3333 },
+};
+
+static const StrokeRec monoChar123[] = {
+ { 10, monoChar123_stroke0 },
+ { 17, monoChar123_stroke1 },
+ { 10, monoChar123_stroke2 },
+};
+
+/* char: 124 '|' */
+
+static const CoordRec monoChar124_stroke0[] = {
+ { 52.381, 119.048 },
+ { 52.381, -33.3333 },
+};
+
+static const StrokeRec monoChar124[] = {
+ { 2, monoChar124_stroke0 },
+};
+
+/* char: 125 '}' */
+
+static const CoordRec monoChar125_stroke0[] = {
+ { 40.4762, 119.048 },
+ { 50, 114.286 },
+ { 54.7619, 109.524 },
+ { 59.5238, 100 },
+ { 59.5238, 90.4762 },
+ { 54.7619, 80.9524 },
+ { 50, 76.1905 },
+ { 45.2381, 66.6667 },
+ { 45.2381, 57.1429 },
+ { 54.7619, 47.619 },
+};
+
+static const CoordRec monoChar125_stroke1[] = {
+ { 50, 114.286 },
+ { 54.7619, 104.762 },
+ { 54.7619, 95.2381 },
+ { 50, 85.7143 },
+ { 45.2381, 80.9524 },
+ { 40.4762, 71.4286 },
+ { 40.4762, 61.9048 },
+ { 45.2381, 52.381 },
+ { 64.2857, 42.8571 },
+ { 45.2381, 33.3333 },
+ { 40.4762, 23.8095 },
+ { 40.4762, 14.2857 },
+ { 45.2381, 4.7619 },
+ { 50, 0 },
+ { 54.7619, -9.5238 },
+ { 54.7619, -19.0476 },
+ { 50, -28.5714 },
+};
+
+static const CoordRec monoChar125_stroke2[] = {
+ { 54.7619, 38.0952 },
+ { 45.2381, 28.5714 },
+ { 45.2381, 19.0476 },
+ { 50, 9.5238 },
+ { 54.7619, 4.7619 },
+ { 59.5238, -4.7619 },
+ { 59.5238, -14.2857 },
+ { 54.7619, -23.8095 },
+ { 50, -28.5714 },
+ { 40.4762, -33.3333 },
+};
+
+static const StrokeRec monoChar125[] = {
+ { 10, monoChar125_stroke0 },
+ { 17, monoChar125_stroke1 },
+ { 10, monoChar125_stroke2 },
+};
+
+/* char: 126 '~' */
+
+static const CoordRec monoChar126_stroke0[] = {
+ { 9.5238, 28.5714 },
+ { 9.5238, 38.0952 },
+ { 14.2857, 52.381 },
+ { 23.8095, 57.1429 },
+ { 33.3333, 57.1429 },
+ { 42.8571, 52.381 },
+ { 61.9048, 38.0952 },
+ { 71.4286, 33.3333 },
+ { 80.9524, 33.3333 },
+ { 90.4762, 38.0952 },
+ { 95.2381, 47.619 },
+};
+
+static const CoordRec monoChar126_stroke1[] = {
+ { 9.5238, 38.0952 },
+ { 14.2857, 47.619 },
+ { 23.8095, 52.381 },
+ { 33.3333, 52.381 },
+ { 42.8571, 47.619 },
+ { 61.9048, 33.3333 },
+ { 71.4286, 28.5714 },
+ { 80.9524, 28.5714 },
+ { 90.4762, 33.3333 },
+ { 95.2381, 47.619 },
+ { 95.2381, 57.1429 },
+};
+
+static const StrokeRec monoChar126[] = {
+ { 11, monoChar126_stroke0 },
+ { 11, monoChar126_stroke1 },
+};
+
+/* char: 127 */
+
+static const CoordRec monoChar127_stroke0[] = {
+ { 71.4286, 100 },
+ { 33.3333, -33.3333 },
+};
+
+static const CoordRec monoChar127_stroke1[] = {
+ { 47.619, 66.6667 },
+ { 33.3333, 61.9048 },
+ { 23.8095, 52.381 },
+ { 19.0476, 38.0952 },
+ { 19.0476, 23.8095 },
+ { 23.8095, 14.2857 },
+ { 33.3333, 4.7619 },
+ { 47.619, 0 },
+ { 57.1428, 0 },
+ { 71.4286, 4.7619 },
+ { 80.9524, 14.2857 },
+ { 85.7143, 28.5714 },
+ { 85.7143, 42.8571 },
+ { 80.9524, 52.381 },
+ { 71.4286, 61.9048 },
+ { 57.1428, 66.6667 },
+ { 47.619, 66.6667 },
+};
+
+static const StrokeRec monoChar127[] = {
+ { 2, monoChar127_stroke0 },
+ { 17, monoChar127_stroke1 },
+};
+
+static const StrokeCharRec monoChars[] = {
+ { 0, /* monoChar0 */ 0, 0, 0 },
+ { 0, /* monoChar1 */ 0, 0, 0 },
+ { 0, /* monoChar2 */ 0, 0, 0 },
+ { 0, /* monoChar3 */ 0, 0, 0 },
+ { 0, /* monoChar4 */ 0, 0, 0 },
+ { 0, /* monoChar5 */ 0, 0, 0 },
+ { 0, /* monoChar6 */ 0, 0, 0 },
+ { 0, /* monoChar7 */ 0, 0, 0 },
+ { 0, /* monoChar8 */ 0, 0, 0 },
+ { 0, /* monoChar9 */ 0, 0, 0 },
+ { 0, /* monoChar10 */ 0, 0, 0 },
+ { 0, /* monoChar11 */ 0, 0, 0 },
+ { 0, /* monoChar12 */ 0, 0, 0 },
+ { 0, /* monoChar13 */ 0, 0, 0 },
+ { 0, /* monoChar14 */ 0, 0, 0 },
+ { 0, /* monoChar15 */ 0, 0, 0 },
+ { 0, /* monoChar16 */ 0, 0, 0 },
+ { 0, /* monoChar17 */ 0, 0, 0 },
+ { 0, /* monoChar18 */ 0, 0, 0 },
+ { 0, /* monoChar19 */ 0, 0, 0 },
+ { 0, /* monoChar20 */ 0, 0, 0 },
+ { 0, /* monoChar21 */ 0, 0, 0 },
+ { 0, /* monoChar22 */ 0, 0, 0 },
+ { 0, /* monoChar23 */ 0, 0, 0 },
+ { 0, /* monoChar24 */ 0, 0, 0 },
+ { 0, /* monoChar25 */ 0, 0, 0 },
+ { 0, /* monoChar26 */ 0, 0, 0 },
+ { 0, /* monoChar27 */ 0, 0, 0 },
+ { 0, /* monoChar28 */ 0, 0, 0 },
+ { 0, /* monoChar29 */ 0, 0, 0 },
+ { 0, /* monoChar30 */ 0, 0, 0 },
+ { 0, /* monoChar31 */ 0, 0, 0 },
+ { 0, /* monoChar32 */ 0, 52.381, 104.762 },
+ { 2, monoChar33, 52.381, 104.762 },
+ { 2, monoChar34, 52.381, 104.762 },
+ { 4, monoChar35, 52.381, 104.762 },
+ { 3, monoChar36, 52.381, 104.762 },
+ { 3, monoChar37, 52.381, 104.762 },
+ { 1, monoChar38, 52.381, 104.762 },
+ { 1, monoChar39, 52.381, 104.762 },
+ { 1, monoChar40, 52.381, 104.762 },
+ { 1, monoChar41, 52.381, 104.762 },
+ { 3, monoChar42, 52.381, 104.762 },
+ { 2, monoChar43, 52.381, 104.762 },
+ { 1, monoChar44, 52.381, 104.762 },
+ { 1, monoChar45, 52.381, 104.762 },
+ { 1, monoChar46, 52.381, 104.762 },
+ { 1, monoChar47, 52.381, 104.762 },
+ { 1, monoChar48, 52.381, 104.762 },
+ { 1, monoChar49, 52.381, 104.762 },
+ { 1, monoChar50, 52.381, 104.762 },
+ { 1, monoChar51, 52.381, 104.762 },
+ { 2, monoChar52, 52.381, 104.762 },
+ { 1, monoChar53, 52.381, 104.762 },
+ { 1, monoChar54, 52.381, 104.762 },
+ { 2, monoChar55, 52.381, 104.762 },
+ { 1, monoChar56, 52.381, 104.762 },
+ { 1, monoChar57, 52.381, 104.762 },
+ { 2, monoChar58, 52.381, 104.762 },
+ { 2, monoChar59, 52.381, 104.762 },
+ { 1, monoChar60, 52.381, 104.762 },
+ { 2, monoChar61, 52.381, 104.762 },
+ { 1, monoChar62, 52.381, 104.762 },
+ { 2, monoChar63, 52.381, 104.762 },
+ { 2, monoChar64, 52.381, 104.762 },
+ { 3, monoChar65, 52.381, 104.762 },
+ { 3, monoChar66, 52.381, 104.762 },
+ { 1, monoChar67, 52.381, 104.762 },
+ { 2, monoChar68, 52.381, 104.762 },
+ { 4, monoChar69, 52.381, 104.762 },
+ { 3, monoChar70, 52.381, 104.762 },
+ { 2, monoChar71, 52.381, 104.762 },
+ { 3, monoChar72, 52.381, 104.762 },
+ { 1, monoChar73, 52.381, 104.762 },
+ { 1, monoChar74, 52.381, 104.762 },
+ { 3, monoChar75, 52.381, 104.762 },
+ { 2, monoChar76, 52.381, 104.762 },
+ { 4, monoChar77, 52.381, 104.762 },
+ { 3, monoChar78, 52.381, 104.762 },
+ { 1, monoChar79, 52.381, 104.762 },
+ { 2, monoChar80, 52.381, 104.762 },
+ { 2, monoChar81, 52.381, 104.762 },
+ { 3, monoChar82, 52.381, 104.762 },
+ { 1, monoChar83, 52.381, 104.762 },
+ { 2, monoChar84, 52.381, 104.762 },
+ { 1, monoChar85, 52.381, 104.762 },
+ { 2, monoChar86, 52.381, 104.762 },
+ { 4, monoChar87, 52.381, 104.762 },
+ { 2, monoChar88, 52.381, 104.762 },
+ { 2, monoChar89, 52.381, 104.762 },
+ { 3, monoChar90, 52.381, 104.762 },
+ { 4, monoChar91, 52.381, 104.762 },
+ { 1, monoChar92, 52.381, 104.762 },
+ { 4, monoChar93, 52.381, 104.762 },
+ { 2, monoChar94, 52.381, 104.762 },
+ { 1, monoChar95, 52.381, 104.762 },
+ { 2, monoChar96, 52.381, 104.762 },
+ { 2, monoChar97, 52.381, 104.762 },
+ { 2, monoChar98, 52.381, 104.762 },
+ { 1, monoChar99, 52.381, 104.762 },
+ { 2, monoChar100, 52.381, 104.762 },
+ { 1, monoChar101, 52.381, 104.762 },
+ { 2, monoChar102, 52.381, 104.762 },
+ { 2, monoChar103, 52.381, 104.762 },
+ { 2, monoChar104, 52.381, 104.762 },
+ { 2, monoChar105, 52.381, 104.762 },
+ { 2, monoChar106, 52.381, 104.762 },
+ { 3, monoChar107, 52.381, 104.762 },
+ { 1, monoChar108, 52.381, 104.762 },
+ { 3, monoChar109, 52.381, 104.762 },
+ { 2, monoChar110, 52.381, 104.762 },
+ { 1, monoChar111, 52.381, 104.762 },
+ { 2, monoChar112, 52.381, 104.762 },
+ { 2, monoChar113, 52.381, 104.762 },
+ { 2, monoChar114, 52.381, 104.762 },
+ { 1, monoChar115, 52.381, 104.762 },
+ { 2, monoChar116, 52.381, 104.762 },
+ { 2, monoChar117, 52.381, 104.762 },
+ { 2, monoChar118, 52.381, 104.762 },
+ { 4, monoChar119, 52.381, 104.762 },
+ { 2, monoChar120, 52.381, 104.762 },
+ { 2, monoChar121, 52.381, 104.762 },
+ { 3, monoChar122, 52.381, 104.762 },
+ { 3, monoChar123, 52.381, 104.762 },
+ { 1, monoChar124, 52.381, 104.762 },
+ { 3, monoChar125, 52.381, 104.762 },
+ { 2, monoChar126, 52.381, 104.762 },
+ { 2, monoChar127, 52.381, 104.762 },
+};
+
+static
+StrokeFontRec glutStrokeMonoRoman = { "Roman", 128, monoChars, 119.048, -33.3333 };
+
diff --git a/hacks/glx/glut_roman.h b/hacks/glx/glut_roman.h
new file mode 100644
index 0000000..93f9532
--- /dev/null
+++ b/hacks/glx/glut_roman.h
@@ -0,0 +1,2455 @@
+/* Roman simplex stroke font copyright (c) 1989, 1990, 1991
+ * by Sun Microsystems, Inc. and the X Consortium.
+ * Originally part of the GLUT library by Mark J. Kilgard.
+ */
+
+#include "glutstroke.h"
+
+/* char: 33 '!' */
+
+static const CoordRec char33_stroke0[] = {
+ { 13.3819, 100 },
+ { 13.3819, 33.3333 },
+};
+
+static const CoordRec char33_stroke1[] = {
+ { 13.3819, 9.5238 },
+ { 8.62, 4.7619 },
+ { 13.3819, 0 },
+ { 18.1438, 4.7619 },
+ { 13.3819, 9.5238 },
+};
+
+static const StrokeRec char33[] = {
+ { 2, char33_stroke0 },
+ { 5, char33_stroke1 },
+};
+
+/* char: 34 '"' */
+
+static const CoordRec char34_stroke0[] = {
+ { 4.02, 100 },
+ { 4.02, 66.6667 },
+};
+
+static const CoordRec char34_stroke1[] = {
+ { 42.1152, 100 },
+ { 42.1152, 66.6667 },
+};
+
+static const StrokeRec char34[] = {
+ { 2, char34_stroke0 },
+ { 2, char34_stroke1 },
+};
+
+/* char: 35 '#' */
+
+static const CoordRec char35_stroke0[] = {
+ { 41.2952, 119.048 },
+ { 7.9619, -33.3333 },
+};
+
+static const CoordRec char35_stroke1[] = {
+ { 69.8667, 119.048 },
+ { 36.5333, -33.3333 },
+};
+
+static const CoordRec char35_stroke2[] = {
+ { 7.9619, 57.1429 },
+ { 74.6286, 57.1429 },
+};
+
+static const CoordRec char35_stroke3[] = {
+ { 3.2, 28.5714 },
+ { 69.8667, 28.5714 },
+};
+
+static const StrokeRec char35[] = {
+ { 2, char35_stroke0 },
+ { 2, char35_stroke1 },
+ { 2, char35_stroke2 },
+ { 2, char35_stroke3 },
+};
+
+/* char: 36 '$' */
+
+static const CoordRec char36_stroke0[] = {
+ { 28.6295, 119.048 },
+ { 28.6295, -19.0476 },
+};
+
+static const CoordRec char36_stroke1[] = {
+ { 47.6771, 119.048 },
+ { 47.6771, -19.0476 },
+};
+
+static const CoordRec char36_stroke2[] = {
+ { 71.4867, 85.7143 },
+ { 61.9629, 95.2381 },
+ { 47.6771, 100 },
+ { 28.6295, 100 },
+ { 14.3438, 95.2381 },
+ { 4.82, 85.7143 },
+ { 4.82, 76.1905 },
+ { 9.5819, 66.6667 },
+ { 14.3438, 61.9048 },
+ { 23.8676, 57.1429 },
+ { 52.439, 47.619 },
+ { 61.9629, 42.8571 },
+ { 66.7248, 38.0952 },
+ { 71.4867, 28.5714 },
+ { 71.4867, 14.2857 },
+ { 61.9629, 4.7619 },
+ { 47.6771, 0 },
+ { 28.6295, 0 },
+ { 14.3438, 4.7619 },
+ { 4.82, 14.2857 },
+};
+
+static const StrokeRec char36[] = {
+ { 2, char36_stroke0 },
+ { 2, char36_stroke1 },
+ { 20, char36_stroke2 },
+};
+
+/* char: 37 '%' */
+
+static const CoordRec char37_stroke0[] = {
+ { 92.0743, 100 },
+ { 6.36, 0 },
+};
+
+static const CoordRec char37_stroke1[] = {
+ { 30.1695, 100 },
+ { 39.6933, 90.4762 },
+ { 39.6933, 80.9524 },
+ { 34.9314, 71.4286 },
+ { 25.4076, 66.6667 },
+ { 15.8838, 66.6667 },
+ { 6.36, 76.1905 },
+ { 6.36, 85.7143 },
+ { 11.1219, 95.2381 },
+ { 20.6457, 100 },
+ { 30.1695, 100 },
+ { 39.6933, 95.2381 },
+ { 53.979, 90.4762 },
+ { 68.2648, 90.4762 },
+ { 82.5505, 95.2381 },
+ { 92.0743, 100 },
+};
+
+static const CoordRec char37_stroke2[] = {
+ { 73.0267, 33.3333 },
+ { 63.5029, 28.5714 },
+ { 58.741, 19.0476 },
+ { 58.741, 9.5238 },
+ { 68.2648, 0 },
+ { 77.7886, 0 },
+ { 87.3124, 4.7619 },
+ { 92.0743, 14.2857 },
+ { 92.0743, 23.8095 },
+ { 82.5505, 33.3333 },
+ { 73.0267, 33.3333 },
+};
+
+static const StrokeRec char37[] = {
+ { 2, char37_stroke0 },
+ { 16, char37_stroke1 },
+ { 11, char37_stroke2 },
+};
+
+/* char: 38 '&' */
+
+static const CoordRec char38_stroke0[] = {
+ { 101.218, 57.1429 },
+ { 101.218, 61.9048 },
+ { 96.4562, 66.6667 },
+ { 91.6943, 66.6667 },
+ { 86.9324, 61.9048 },
+ { 82.1705, 52.381 },
+ { 72.6467, 28.5714 },
+ { 63.1229, 14.2857 },
+ { 53.599, 4.7619 },
+ { 44.0752, 0 },
+ { 25.0276, 0 },
+ { 15.5038, 4.7619 },
+ { 10.7419, 9.5238 },
+ { 5.98, 19.0476 },
+ { 5.98, 28.5714 },
+ { 10.7419, 38.0952 },
+ { 15.5038, 42.8571 },
+ { 48.8371, 61.9048 },
+ { 53.599, 66.6667 },
+ { 58.361, 76.1905 },
+ { 58.361, 85.7143 },
+ { 53.599, 95.2381 },
+ { 44.0752, 100 },
+ { 34.5514, 95.2381 },
+ { 29.7895, 85.7143 },
+ { 29.7895, 76.1905 },
+ { 34.5514, 61.9048 },
+ { 44.0752, 47.619 },
+ { 67.8848, 14.2857 },
+ { 77.4086, 4.7619 },
+ { 86.9324, 0 },
+ { 96.4562, 0 },
+ { 101.218, 4.7619 },
+ { 101.218, 9.5238 },
+};
+
+static const StrokeRec char38[] = {
+ { 34, char38_stroke0 },
+};
+
+/* char: 39 ''' */
+
+static const CoordRec char39_stroke0[] = {
+ { 4.44, 100 },
+ { 4.44, 66.6667 },
+};
+
+static const StrokeRec char39[] = {
+ { 2, char39_stroke0 },
+};
+
+/* char: 40 '(' */
+
+static const CoordRec char40_stroke0[] = {
+ { 40.9133, 119.048 },
+ { 31.3895, 109.524 },
+ { 21.8657, 95.2381 },
+ { 12.3419, 76.1905 },
+ { 7.58, 52.381 },
+ { 7.58, 33.3333 },
+ { 12.3419, 9.5238 },
+ { 21.8657, -9.5238 },
+ { 31.3895, -23.8095 },
+ { 40.9133, -33.3333 },
+};
+
+static const StrokeRec char40[] = {
+ { 10, char40_stroke0 },
+};
+
+/* char: 41 ')' */
+
+static const CoordRec char41_stroke0[] = {
+ { 5.28, 119.048 },
+ { 14.8038, 109.524 },
+ { 24.3276, 95.2381 },
+ { 33.8514, 76.1905 },
+ { 38.6133, 52.381 },
+ { 38.6133, 33.3333 },
+ { 33.8514, 9.5238 },
+ { 24.3276, -9.5238 },
+ { 14.8038, -23.8095 },
+ { 5.28, -33.3333 },
+};
+
+static const StrokeRec char41[] = {
+ { 10, char41_stroke0 },
+};
+
+/* char: 42 '*' */
+
+static const CoordRec char42_stroke0[] = {
+ { 30.7695, 71.4286 },
+ { 30.7695, 14.2857 },
+};
+
+static const CoordRec char42_stroke1[] = {
+ { 6.96, 57.1429 },
+ { 54.579, 28.5714 },
+};
+
+static const CoordRec char42_stroke2[] = {
+ { 54.579, 57.1429 },
+ { 6.96, 28.5714 },
+};
+
+static const StrokeRec char42[] = {
+ { 2, char42_stroke0 },
+ { 2, char42_stroke1 },
+ { 2, char42_stroke2 },
+};
+
+/* char: 43 '+' */
+
+static const CoordRec char43_stroke0[] = {
+ { 48.8371, 85.7143 },
+ { 48.8371, 0 },
+};
+
+static const CoordRec char43_stroke1[] = {
+ { 5.98, 42.8571 },
+ { 91.6943, 42.8571 },
+};
+
+static const StrokeRec char43[] = {
+ { 2, char43_stroke0 },
+ { 2, char43_stroke1 },
+};
+
+/* char: 44 ',' */
+
+static const CoordRec char44_stroke0[] = {
+ { 18.2838, 4.7619 },
+ { 13.5219, 0 },
+ { 8.76, 4.7619 },
+ { 13.5219, 9.5238 },
+ { 18.2838, 4.7619 },
+ { 18.2838, -4.7619 },
+ { 13.5219, -14.2857 },
+ { 8.76, -19.0476 },
+};
+
+static const StrokeRec char44[] = {
+ { 8, char44_stroke0 },
+};
+
+/* char: 45 '-' */
+
+static const CoordRec char45_stroke0[] = {
+ { 7.38, 42.8571 },
+ { 93.0943, 42.8571 },
+};
+
+static const StrokeRec char45[] = {
+ { 2, char45_stroke0 },
+};
+
+/* char: 46 '.' */
+
+static const CoordRec char46_stroke0[] = {
+ { 13.1019, 9.5238 },
+ { 8.34, 4.7619 },
+ { 13.1019, 0 },
+ { 17.8638, 4.7619 },
+ { 13.1019, 9.5238 },
+};
+
+static const StrokeRec char46[] = {
+ { 5, char46_stroke0 },
+};
+
+/* char: 47 '/' */
+
+static const CoordRec char47_stroke0[] = {
+ { 7.24, -14.2857 },
+ { 73.9067, 100 },
+};
+
+static const StrokeRec char47[] = {
+ { 2, char47_stroke0 },
+};
+
+/* char: 48 '0' */
+
+static const CoordRec char48_stroke0[] = {
+ { 33.5514, 100 },
+ { 19.2657, 95.2381 },
+ { 9.7419, 80.9524 },
+ { 4.98, 57.1429 },
+ { 4.98, 42.8571 },
+ { 9.7419, 19.0476 },
+ { 19.2657, 4.7619 },
+ { 33.5514, 0 },
+ { 43.0752, 0 },
+ { 57.361, 4.7619 },
+ { 66.8848, 19.0476 },
+ { 71.6467, 42.8571 },
+ { 71.6467, 57.1429 },
+ { 66.8848, 80.9524 },
+ { 57.361, 95.2381 },
+ { 43.0752, 100 },
+ { 33.5514, 100 },
+};
+
+static const StrokeRec char48[] = {
+ { 17, char48_stroke0 },
+};
+
+/* char: 49 '1' */
+
+static const CoordRec char49_stroke0[] = {
+ { 11.82, 80.9524 },
+ { 21.3438, 85.7143 },
+ { 35.6295, 100 },
+ { 35.6295, 0 },
+};
+
+static const StrokeRec char49[] = {
+ { 4, char49_stroke0 },
+};
+
+/* char: 50 '2' */
+
+static const CoordRec char50_stroke0[] = {
+ { 10.1819, 76.1905 },
+ { 10.1819, 80.9524 },
+ { 14.9438, 90.4762 },
+ { 19.7057, 95.2381 },
+ { 29.2295, 100 },
+ { 48.2771, 100 },
+ { 57.801, 95.2381 },
+ { 62.5629, 90.4762 },
+ { 67.3248, 80.9524 },
+ { 67.3248, 71.4286 },
+ { 62.5629, 61.9048 },
+ { 53.039, 47.619 },
+ { 5.42, 0 },
+ { 72.0867, 0 },
+};
+
+static const StrokeRec char50[] = {
+ { 14, char50_stroke0 },
+};
+
+/* char: 51 '3' */
+
+static const CoordRec char51_stroke0[] = {
+ { 14.5238, 100 },
+ { 66.9048, 100 },
+ { 38.3333, 61.9048 },
+ { 52.619, 61.9048 },
+ { 62.1429, 57.1429 },
+ { 66.9048, 52.381 },
+ { 71.6667, 38.0952 },
+ { 71.6667, 28.5714 },
+ { 66.9048, 14.2857 },
+ { 57.381, 4.7619 },
+ { 43.0952, 0 },
+ { 28.8095, 0 },
+ { 14.5238, 4.7619 },
+ { 9.7619, 9.5238 },
+ { 5, 19.0476 },
+};
+
+static const StrokeRec char51[] = {
+ { 15, char51_stroke0 },
+};
+
+/* char: 52 '4' */
+
+static const CoordRec char52_stroke0[] = {
+ { 51.499, 100 },
+ { 3.88, 33.3333 },
+ { 75.3086, 33.3333 },
+};
+
+static const CoordRec char52_stroke1[] = {
+ { 51.499, 100 },
+ { 51.499, 0 },
+};
+
+static const StrokeRec char52[] = {
+ { 3, char52_stroke0 },
+ { 2, char52_stroke1 },
+};
+
+/* char: 53 '5' */
+
+static const CoordRec char53_stroke0[] = {
+ { 62.0029, 100 },
+ { 14.3838, 100 },
+ { 9.6219, 57.1429 },
+ { 14.3838, 61.9048 },
+ { 28.6695, 66.6667 },
+ { 42.9552, 66.6667 },
+ { 57.241, 61.9048 },
+ { 66.7648, 52.381 },
+ { 71.5267, 38.0952 },
+ { 71.5267, 28.5714 },
+ { 66.7648, 14.2857 },
+ { 57.241, 4.7619 },
+ { 42.9552, 0 },
+ { 28.6695, 0 },
+ { 14.3838, 4.7619 },
+ { 9.6219, 9.5238 },
+ { 4.86, 19.0476 },
+};
+
+static const StrokeRec char53[] = {
+ { 17, char53_stroke0 },
+};
+
+/* char: 54 '6' */
+
+static const CoordRec char54_stroke0[] = {
+ { 62.7229, 85.7143 },
+ { 57.961, 95.2381 },
+ { 43.6752, 100 },
+ { 34.1514, 100 },
+ { 19.8657, 95.2381 },
+ { 10.3419, 80.9524 },
+ { 5.58, 57.1429 },
+ { 5.58, 33.3333 },
+ { 10.3419, 14.2857 },
+ { 19.8657, 4.7619 },
+ { 34.1514, 0 },
+ { 38.9133, 0 },
+ { 53.199, 4.7619 },
+ { 62.7229, 14.2857 },
+ { 67.4848, 28.5714 },
+ { 67.4848, 33.3333 },
+ { 62.7229, 47.619 },
+ { 53.199, 57.1429 },
+ { 38.9133, 61.9048 },
+ { 34.1514, 61.9048 },
+ { 19.8657, 57.1429 },
+ { 10.3419, 47.619 },
+ { 5.58, 33.3333 },
+};
+
+static const StrokeRec char54[] = {
+ { 23, char54_stroke0 },
+};
+
+/* char: 55 '7' */
+
+static const CoordRec char55_stroke0[] = {
+ { 72.2267, 100 },
+ { 24.6076, 0 },
+};
+
+static const CoordRec char55_stroke1[] = {
+ { 5.56, 100 },
+ { 72.2267, 100 },
+};
+
+static const StrokeRec char55[] = {
+ { 2, char55_stroke0 },
+ { 2, char55_stroke1 },
+};
+
+/* char: 56 '8' */
+
+static const CoordRec char56_stroke0[] = {
+ { 29.4095, 100 },
+ { 15.1238, 95.2381 },
+ { 10.3619, 85.7143 },
+ { 10.3619, 76.1905 },
+ { 15.1238, 66.6667 },
+ { 24.6476, 61.9048 },
+ { 43.6952, 57.1429 },
+ { 57.981, 52.381 },
+ { 67.5048, 42.8571 },
+ { 72.2667, 33.3333 },
+ { 72.2667, 19.0476 },
+ { 67.5048, 9.5238 },
+ { 62.7429, 4.7619 },
+ { 48.4571, 0 },
+ { 29.4095, 0 },
+ { 15.1238, 4.7619 },
+ { 10.3619, 9.5238 },
+ { 5.6, 19.0476 },
+ { 5.6, 33.3333 },
+ { 10.3619, 42.8571 },
+ { 19.8857, 52.381 },
+ { 34.1714, 57.1429 },
+ { 53.219, 61.9048 },
+ { 62.7429, 66.6667 },
+ { 67.5048, 76.1905 },
+ { 67.5048, 85.7143 },
+ { 62.7429, 95.2381 },
+ { 48.4571, 100 },
+ { 29.4095, 100 },
+};
+
+static const StrokeRec char56[] = {
+ { 29, char56_stroke0 },
+};
+
+/* char: 57 '9' */
+
+static const CoordRec char57_stroke0[] = {
+ { 68.5048, 66.6667 },
+ { 63.7429, 52.381 },
+ { 54.219, 42.8571 },
+ { 39.9333, 38.0952 },
+ { 35.1714, 38.0952 },
+ { 20.8857, 42.8571 },
+ { 11.3619, 52.381 },
+ { 6.6, 66.6667 },
+ { 6.6, 71.4286 },
+ { 11.3619, 85.7143 },
+ { 20.8857, 95.2381 },
+ { 35.1714, 100 },
+ { 39.9333, 100 },
+ { 54.219, 95.2381 },
+ { 63.7429, 85.7143 },
+ { 68.5048, 66.6667 },
+ { 68.5048, 42.8571 },
+ { 63.7429, 19.0476 },
+ { 54.219, 4.7619 },
+ { 39.9333, 0 },
+ { 30.4095, 0 },
+ { 16.1238, 4.7619 },
+ { 11.3619, 14.2857 },
+};
+
+static const StrokeRec char57[] = {
+ { 23, char57_stroke0 },
+};
+
+/* char: 58 ':' */
+
+static const CoordRec char58_stroke0[] = {
+ { 14.0819, 66.6667 },
+ { 9.32, 61.9048 },
+ { 14.0819, 57.1429 },
+ { 18.8438, 61.9048 },
+ { 14.0819, 66.6667 },
+};
+
+static const CoordRec char58_stroke1[] = {
+ { 14.0819, 9.5238 },
+ { 9.32, 4.7619 },
+ { 14.0819, 0 },
+ { 18.8438, 4.7619 },
+ { 14.0819, 9.5238 },
+};
+
+static const StrokeRec char58[] = {
+ { 5, char58_stroke0 },
+ { 5, char58_stroke1 },
+};
+
+/* char: 59 ';' */
+
+static const CoordRec char59_stroke0[] = {
+ { 12.9619, 66.6667 },
+ { 8.2, 61.9048 },
+ { 12.9619, 57.1429 },
+ { 17.7238, 61.9048 },
+ { 12.9619, 66.6667 },
+};
+
+static const CoordRec char59_stroke1[] = {
+ { 17.7238, 4.7619 },
+ { 12.9619, 0 },
+ { 8.2, 4.7619 },
+ { 12.9619, 9.5238 },
+ { 17.7238, 4.7619 },
+ { 17.7238, -4.7619 },
+ { 12.9619, -14.2857 },
+ { 8.2, -19.0476 },
+};
+
+static const StrokeRec char59[] = {
+ { 5, char59_stroke0 },
+ { 8, char59_stroke1 },
+};
+
+/* char: 60 '<' */
+
+static const CoordRec char60_stroke0[] = {
+ { 79.2505, 85.7143 },
+ { 3.06, 42.8571 },
+ { 79.2505, 0 },
+};
+
+static const StrokeRec char60[] = {
+ { 3, char60_stroke0 },
+};
+
+/* char: 61 '=' */
+
+static const CoordRec char61_stroke0[] = {
+ { 5.7, 57.1429 },
+ { 91.4143, 57.1429 },
+};
+
+static const CoordRec char61_stroke1[] = {
+ { 5.7, 28.5714 },
+ { 91.4143, 28.5714 },
+};
+
+static const StrokeRec char61[] = {
+ { 2, char61_stroke0 },
+ { 2, char61_stroke1 },
+};
+
+/* char: 62 '>' */
+
+static const CoordRec char62_stroke0[] = {
+ { 2.78, 85.7143 },
+ { 78.9705, 42.8571 },
+ { 2.78, 0 },
+};
+
+static const StrokeRec char62[] = {
+ { 3, char62_stroke0 },
+};
+
+/* char: 63 '?' */
+
+static const CoordRec char63_stroke0[] = {
+ { 8.42, 76.1905 },
+ { 8.42, 80.9524 },
+ { 13.1819, 90.4762 },
+ { 17.9438, 95.2381 },
+ { 27.4676, 100 },
+ { 46.5152, 100 },
+ { 56.039, 95.2381 },
+ { 60.801, 90.4762 },
+ { 65.5629, 80.9524 },
+ { 65.5629, 71.4286 },
+ { 60.801, 61.9048 },
+ { 56.039, 57.1429 },
+ { 36.9914, 47.619 },
+ { 36.9914, 33.3333 },
+};
+
+static const CoordRec char63_stroke1[] = {
+ { 36.9914, 9.5238 },
+ { 32.2295, 4.7619 },
+ { 36.9914, 0 },
+ { 41.7533, 4.7619 },
+ { 36.9914, 9.5238 },
+};
+
+static const StrokeRec char63[] = {
+ { 14, char63_stroke0 },
+ { 5, char63_stroke1 },
+};
+
+/* char: 64 '@' */
+
+static const CoordRec char64_stroke0[] = {
+ { 49.2171, 52.381 },
+ { 39.6933, 57.1429 },
+ { 30.1695, 57.1429 },
+ { 25.4076, 47.619 },
+ { 25.4076, 42.8571 },
+ { 30.1695, 33.3333 },
+ { 39.6933, 33.3333 },
+ { 49.2171, 38.0952 },
+};
+
+static const CoordRec char64_stroke1[] = {
+ { 49.2171, 57.1429 },
+ { 49.2171, 38.0952 },
+ { 53.979, 33.3333 },
+ { 63.5029, 33.3333 },
+ { 68.2648, 42.8571 },
+ { 68.2648, 47.619 },
+ { 63.5029, 61.9048 },
+ { 53.979, 71.4286 },
+ { 39.6933, 76.1905 },
+ { 34.9314, 76.1905 },
+ { 20.6457, 71.4286 },
+ { 11.1219, 61.9048 },
+ { 6.36, 47.619 },
+ { 6.36, 42.8571 },
+ { 11.1219, 28.5714 },
+ { 20.6457, 19.0476 },
+ { 34.9314, 14.2857 },
+ { 39.6933, 14.2857 },
+ { 53.979, 19.0476 },
+};
+
+static const StrokeRec char64[] = {
+ { 8, char64_stroke0 },
+ { 19, char64_stroke1 },
+};
+
+/* char: 65 'A' */
+
+static const CoordRec char65_stroke0[] = {
+ { 40.5952, 100 },
+ { 2.5, 0 },
+};
+
+static const CoordRec char65_stroke1[] = {
+ { 40.5952, 100 },
+ { 78.6905, 0 },
+};
+
+static const CoordRec char65_stroke2[] = {
+ { 16.7857, 33.3333 },
+ { 64.4048, 33.3333 },
+};
+
+static const StrokeRec char65[] = {
+ { 2, char65_stroke0 },
+ { 2, char65_stroke1 },
+ { 2, char65_stroke2 },
+};
+
+/* char: 66 'B' */
+
+static const CoordRec char66_stroke0[] = {
+ { 11.42, 100 },
+ { 11.42, 0 },
+};
+
+static const CoordRec char66_stroke1[] = {
+ { 11.42, 100 },
+ { 54.2771, 100 },
+ { 68.5629, 95.2381 },
+ { 73.3248, 90.4762 },
+ { 78.0867, 80.9524 },
+ { 78.0867, 71.4286 },
+ { 73.3248, 61.9048 },
+ { 68.5629, 57.1429 },
+ { 54.2771, 52.381 },
+};
+
+static const CoordRec char66_stroke2[] = {
+ { 11.42, 52.381 },
+ { 54.2771, 52.381 },
+ { 68.5629, 47.619 },
+ { 73.3248, 42.8571 },
+ { 78.0867, 33.3333 },
+ { 78.0867, 19.0476 },
+ { 73.3248, 9.5238 },
+ { 68.5629, 4.7619 },
+ { 54.2771, 0 },
+ { 11.42, 0 },
+};
+
+static const StrokeRec char66[] = {
+ { 2, char66_stroke0 },
+ { 9, char66_stroke1 },
+ { 10, char66_stroke2 },
+};
+
+/* char: 67 'C' */
+
+static const CoordRec char67_stroke0[] = {
+ { 78.0886, 76.1905 },
+ { 73.3267, 85.7143 },
+ { 63.8029, 95.2381 },
+ { 54.279, 100 },
+ { 35.2314, 100 },
+ { 25.7076, 95.2381 },
+ { 16.1838, 85.7143 },
+ { 11.4219, 76.1905 },
+ { 6.66, 61.9048 },
+ { 6.66, 38.0952 },
+ { 11.4219, 23.8095 },
+ { 16.1838, 14.2857 },
+ { 25.7076, 4.7619 },
+ { 35.2314, 0 },
+ { 54.279, 0 },
+ { 63.8029, 4.7619 },
+ { 73.3267, 14.2857 },
+ { 78.0886, 23.8095 },
+};
+
+static const StrokeRec char67[] = {
+ { 18, char67_stroke0 },
+};
+
+/* char: 68 'D' */
+
+static const CoordRec char68_stroke0[] = {
+ { 11.96, 100 },
+ { 11.96, 0 },
+};
+
+static const CoordRec char68_stroke1[] = {
+ { 11.96, 100 },
+ { 45.2933, 100 },
+ { 59.579, 95.2381 },
+ { 69.1029, 85.7143 },
+ { 73.8648, 76.1905 },
+ { 78.6267, 61.9048 },
+ { 78.6267, 38.0952 },
+ { 73.8648, 23.8095 },
+ { 69.1029, 14.2857 },
+ { 59.579, 4.7619 },
+ { 45.2933, 0 },
+ { 11.96, 0 },
+};
+
+static const StrokeRec char68[] = {
+ { 2, char68_stroke0 },
+ { 12, char68_stroke1 },
+};
+
+/* char: 69 'E' */
+
+static const CoordRec char69_stroke0[] = {
+ { 11.42, 100 },
+ { 11.42, 0 },
+};
+
+static const CoordRec char69_stroke1[] = {
+ { 11.42, 100 },
+ { 73.3248, 100 },
+};
+
+static const CoordRec char69_stroke2[] = {
+ { 11.42, 52.381 },
+ { 49.5152, 52.381 },
+};
+
+static const CoordRec char69_stroke3[] = {
+ { 11.42, 0 },
+ { 73.3248, 0 },
+};
+
+static const StrokeRec char69[] = {
+ { 2, char69_stroke0 },
+ { 2, char69_stroke1 },
+ { 2, char69_stroke2 },
+ { 2, char69_stroke3 },
+};
+
+/* char: 70 'F' */
+
+static const CoordRec char70_stroke0[] = {
+ { 11.42, 100 },
+ { 11.42, 0 },
+};
+
+static const CoordRec char70_stroke1[] = {
+ { 11.42, 100 },
+ { 73.3248, 100 },
+};
+
+static const CoordRec char70_stroke2[] = {
+ { 11.42, 52.381 },
+ { 49.5152, 52.381 },
+};
+
+static const StrokeRec char70[] = {
+ { 2, char70_stroke0 },
+ { 2, char70_stroke1 },
+ { 2, char70_stroke2 },
+};
+
+/* char: 71 'G' */
+
+static const CoordRec char71_stroke0[] = {
+ { 78.4886, 76.1905 },
+ { 73.7267, 85.7143 },
+ { 64.2029, 95.2381 },
+ { 54.679, 100 },
+ { 35.6314, 100 },
+ { 26.1076, 95.2381 },
+ { 16.5838, 85.7143 },
+ { 11.8219, 76.1905 },
+ { 7.06, 61.9048 },
+ { 7.06, 38.0952 },
+ { 11.8219, 23.8095 },
+ { 16.5838, 14.2857 },
+ { 26.1076, 4.7619 },
+ { 35.6314, 0 },
+ { 54.679, 0 },
+ { 64.2029, 4.7619 },
+ { 73.7267, 14.2857 },
+ { 78.4886, 23.8095 },
+ { 78.4886, 38.0952 },
+};
+
+static const CoordRec char71_stroke1[] = {
+ { 54.679, 38.0952 },
+ { 78.4886, 38.0952 },
+};
+
+static const StrokeRec char71[] = {
+ { 19, char71_stroke0 },
+ { 2, char71_stroke1 },
+};
+
+/* char: 72 'H' */
+
+static const CoordRec char72_stroke0[] = {
+ { 11.42, 100 },
+ { 11.42, 0 },
+};
+
+static const CoordRec char72_stroke1[] = {
+ { 78.0867, 100 },
+ { 78.0867, 0 },
+};
+
+static const CoordRec char72_stroke2[] = {
+ { 11.42, 52.381 },
+ { 78.0867, 52.381 },
+};
+
+static const StrokeRec char72[] = {
+ { 2, char72_stroke0 },
+ { 2, char72_stroke1 },
+ { 2, char72_stroke2 },
+};
+
+/* char: 73 'I' */
+
+static const CoordRec char73_stroke0[] = {
+ { 10.86, 100 },
+ { 10.86, 0 },
+};
+
+static const StrokeRec char73[] = {
+ { 2, char73_stroke0 },
+};
+
+/* char: 74 'J' */
+
+static const CoordRec char74_stroke0[] = {
+ { 50.119, 100 },
+ { 50.119, 23.8095 },
+ { 45.3571, 9.5238 },
+ { 40.5952, 4.7619 },
+ { 31.0714, 0 },
+ { 21.5476, 0 },
+ { 12.0238, 4.7619 },
+ { 7.2619, 9.5238 },
+ { 2.5, 23.8095 },
+ { 2.5, 33.3333 },
+};
+
+static const StrokeRec char74[] = {
+ { 10, char74_stroke0 },
+};
+
+/* char: 75 'K' */
+
+static const CoordRec char75_stroke0[] = {
+ { 11.28, 100 },
+ { 11.28, 0 },
+};
+
+static const CoordRec char75_stroke1[] = {
+ { 77.9467, 100 },
+ { 11.28, 33.3333 },
+};
+
+static const CoordRec char75_stroke2[] = {
+ { 35.0895, 57.1429 },
+ { 77.9467, 0 },
+};
+
+static const StrokeRec char75[] = {
+ { 2, char75_stroke0 },
+ { 2, char75_stroke1 },
+ { 2, char75_stroke2 },
+};
+
+/* char: 76 'L' */
+
+static const CoordRec char76_stroke0[] = {
+ { 11.68, 100 },
+ { 11.68, 0 },
+};
+
+static const CoordRec char76_stroke1[] = {
+ { 11.68, 0 },
+ { 68.8229, 0 },
+};
+
+static const StrokeRec char76[] = {
+ { 2, char76_stroke0 },
+ { 2, char76_stroke1 },
+};
+
+/* char: 77 'M' */
+
+static const CoordRec char77_stroke0[] = {
+ { 10.86, 100 },
+ { 10.86, 0 },
+};
+
+static const CoordRec char77_stroke1[] = {
+ { 10.86, 100 },
+ { 48.9552, 0 },
+};
+
+static const CoordRec char77_stroke2[] = {
+ { 87.0505, 100 },
+ { 48.9552, 0 },
+};
+
+static const CoordRec char77_stroke3[] = {
+ { 87.0505, 100 },
+ { 87.0505, 0 },
+};
+
+static const StrokeRec char77[] = {
+ { 2, char77_stroke0 },
+ { 2, char77_stroke1 },
+ { 2, char77_stroke2 },
+ { 2, char77_stroke3 },
+};
+
+/* char: 78 'N' */
+
+static const CoordRec char78_stroke0[] = {
+ { 11.14, 100 },
+ { 11.14, 0 },
+};
+
+static const CoordRec char78_stroke1[] = {
+ { 11.14, 100 },
+ { 77.8067, 0 },
+};
+
+static const CoordRec char78_stroke2[] = {
+ { 77.8067, 100 },
+ { 77.8067, 0 },
+};
+
+static const StrokeRec char78[] = {
+ { 2, char78_stroke0 },
+ { 2, char78_stroke1 },
+ { 2, char78_stroke2 },
+};
+
+/* char: 79 'O' */
+
+static const CoordRec char79_stroke0[] = {
+ { 34.8114, 100 },
+ { 25.2876, 95.2381 },
+ { 15.7638, 85.7143 },
+ { 11.0019, 76.1905 },
+ { 6.24, 61.9048 },
+ { 6.24, 38.0952 },
+ { 11.0019, 23.8095 },
+ { 15.7638, 14.2857 },
+ { 25.2876, 4.7619 },
+ { 34.8114, 0 },
+ { 53.859, 0 },
+ { 63.3829, 4.7619 },
+ { 72.9067, 14.2857 },
+ { 77.6686, 23.8095 },
+ { 82.4305, 38.0952 },
+ { 82.4305, 61.9048 },
+ { 77.6686, 76.1905 },
+ { 72.9067, 85.7143 },
+ { 63.3829, 95.2381 },
+ { 53.859, 100 },
+ { 34.8114, 100 },
+};
+
+static const StrokeRec char79[] = {
+ { 21, char79_stroke0 },
+};
+
+/* char: 80 'P' */
+
+static const CoordRec char80_stroke0[] = {
+ { 12.1, 100 },
+ { 12.1, 0 },
+};
+
+static const CoordRec char80_stroke1[] = {
+ { 12.1, 100 },
+ { 54.9571, 100 },
+ { 69.2429, 95.2381 },
+ { 74.0048, 90.4762 },
+ { 78.7667, 80.9524 },
+ { 78.7667, 66.6667 },
+ { 74.0048, 57.1429 },
+ { 69.2429, 52.381 },
+ { 54.9571, 47.619 },
+ { 12.1, 47.619 },
+};
+
+static const StrokeRec char80[] = {
+ { 2, char80_stroke0 },
+ { 10, char80_stroke1 },
+};
+
+/* char: 81 'Q' */
+
+static const CoordRec char81_stroke0[] = {
+ { 33.8714, 100 },
+ { 24.3476, 95.2381 },
+ { 14.8238, 85.7143 },
+ { 10.0619, 76.1905 },
+ { 5.3, 61.9048 },
+ { 5.3, 38.0952 },
+ { 10.0619, 23.8095 },
+ { 14.8238, 14.2857 },
+ { 24.3476, 4.7619 },
+ { 33.8714, 0 },
+ { 52.919, 0 },
+ { 62.4429, 4.7619 },
+ { 71.9667, 14.2857 },
+ { 76.7286, 23.8095 },
+ { 81.4905, 38.0952 },
+ { 81.4905, 61.9048 },
+ { 76.7286, 76.1905 },
+ { 71.9667, 85.7143 },
+ { 62.4429, 95.2381 },
+ { 52.919, 100 },
+ { 33.8714, 100 },
+};
+
+static const CoordRec char81_stroke1[] = {
+ { 48.1571, 19.0476 },
+ { 76.7286, -9.5238 },
+};
+
+static const StrokeRec char81[] = {
+ { 21, char81_stroke0 },
+ { 2, char81_stroke1 },
+};
+
+/* char: 82 'R' */
+
+static const CoordRec char82_stroke0[] = {
+ { 11.68, 100 },
+ { 11.68, 0 },
+};
+
+static const CoordRec char82_stroke1[] = {
+ { 11.68, 100 },
+ { 54.5371, 100 },
+ { 68.8229, 95.2381 },
+ { 73.5848, 90.4762 },
+ { 78.3467, 80.9524 },
+ { 78.3467, 71.4286 },
+ { 73.5848, 61.9048 },
+ { 68.8229, 57.1429 },
+ { 54.5371, 52.381 },
+ { 11.68, 52.381 },
+};
+
+static const CoordRec char82_stroke2[] = {
+ { 45.0133, 52.381 },
+ { 78.3467, 0 },
+};
+
+static const StrokeRec char82[] = {
+ { 2, char82_stroke0 },
+ { 10, char82_stroke1 },
+ { 2, char82_stroke2 },
+};
+
+/* char: 83 'S' */
+
+static const CoordRec char83_stroke0[] = {
+ { 74.6667, 85.7143 },
+ { 65.1429, 95.2381 },
+ { 50.8571, 100 },
+ { 31.8095, 100 },
+ { 17.5238, 95.2381 },
+ { 8, 85.7143 },
+ { 8, 76.1905 },
+ { 12.7619, 66.6667 },
+ { 17.5238, 61.9048 },
+ { 27.0476, 57.1429 },
+ { 55.619, 47.619 },
+ { 65.1429, 42.8571 },
+ { 69.9048, 38.0952 },
+ { 74.6667, 28.5714 },
+ { 74.6667, 14.2857 },
+ { 65.1429, 4.7619 },
+ { 50.8571, 0 },
+ { 31.8095, 0 },
+ { 17.5238, 4.7619 },
+ { 8, 14.2857 },
+};
+
+static const StrokeRec char83[] = {
+ { 20, char83_stroke0 },
+};
+
+/* char: 84 'T' */
+
+static const CoordRec char84_stroke0[] = {
+ { 35.6933, 100 },
+ { 35.6933, 0 },
+};
+
+static const CoordRec char84_stroke1[] = {
+ { 2.36, 100 },
+ { 69.0267, 100 },
+};
+
+static const StrokeRec char84[] = {
+ { 2, char84_stroke0 },
+ { 2, char84_stroke1 },
+};
+
+/* char: 85 'U' */
+
+static const CoordRec char85_stroke0[] = {
+ { 11.54, 100 },
+ { 11.54, 28.5714 },
+ { 16.3019, 14.2857 },
+ { 25.8257, 4.7619 },
+ { 40.1114, 0 },
+ { 49.6352, 0 },
+ { 63.921, 4.7619 },
+ { 73.4448, 14.2857 },
+ { 78.2067, 28.5714 },
+ { 78.2067, 100 },
+};
+
+static const StrokeRec char85[] = {
+ { 10, char85_stroke0 },
+};
+
+/* char: 86 'V' */
+
+static const CoordRec char86_stroke0[] = {
+ { 2.36, 100 },
+ { 40.4552, 0 },
+};
+
+static const CoordRec char86_stroke1[] = {
+ { 78.5505, 100 },
+ { 40.4552, 0 },
+};
+
+static const StrokeRec char86[] = {
+ { 2, char86_stroke0 },
+ { 2, char86_stroke1 },
+};
+
+/* char: 87 'W' */
+
+static const CoordRec char87_stroke0[] = {
+ { 2.22, 100 },
+ { 26.0295, 0 },
+};
+
+static const CoordRec char87_stroke1[] = {
+ { 49.839, 100 },
+ { 26.0295, 0 },
+};
+
+static const CoordRec char87_stroke2[] = {
+ { 49.839, 100 },
+ { 73.6486, 0 },
+};
+
+static const CoordRec char87_stroke3[] = {
+ { 97.4581, 100 },
+ { 73.6486, 0 },
+};
+
+static const StrokeRec char87[] = {
+ { 2, char87_stroke0 },
+ { 2, char87_stroke1 },
+ { 2, char87_stroke2 },
+ { 2, char87_stroke3 },
+};
+
+/* char: 88 'X' */
+
+static const CoordRec char88_stroke0[] = {
+ { 2.5, 100 },
+ { 69.1667, 0 },
+};
+
+static const CoordRec char88_stroke1[] = {
+ { 69.1667, 100 },
+ { 2.5, 0 },
+};
+
+static const StrokeRec char88[] = {
+ { 2, char88_stroke0 },
+ { 2, char88_stroke1 },
+};
+
+/* char: 89 'Y' */
+
+static const CoordRec char89_stroke0[] = {
+ { 1.52, 100 },
+ { 39.6152, 52.381 },
+ { 39.6152, 0 },
+};
+
+static const CoordRec char89_stroke1[] = {
+ { 77.7105, 100 },
+ { 39.6152, 52.381 },
+};
+
+static const StrokeRec char89[] = {
+ { 3, char89_stroke0 },
+ { 2, char89_stroke1 },
+};
+
+/* char: 90 'Z' */
+
+static const CoordRec char90_stroke0[] = {
+ { 69.1667, 100 },
+ { 2.5, 0 },
+};
+
+static const CoordRec char90_stroke1[] = {
+ { 2.5, 100 },
+ { 69.1667, 100 },
+};
+
+static const CoordRec char90_stroke2[] = {
+ { 2.5, 0 },
+ { 69.1667, 0 },
+};
+
+static const StrokeRec char90[] = {
+ { 2, char90_stroke0 },
+ { 2, char90_stroke1 },
+ { 2, char90_stroke2 },
+};
+
+/* char: 91 '[' */
+
+static const CoordRec char91_stroke0[] = {
+ { 7.78, 119.048 },
+ { 7.78, -33.3333 },
+};
+
+static const CoordRec char91_stroke1[] = {
+ { 12.5419, 119.048 },
+ { 12.5419, -33.3333 },
+};
+
+static const CoordRec char91_stroke2[] = {
+ { 7.78, 119.048 },
+ { 41.1133, 119.048 },
+};
+
+static const CoordRec char91_stroke3[] = {
+ { 7.78, -33.3333 },
+ { 41.1133, -33.3333 },
+};
+
+static const StrokeRec char91[] = {
+ { 2, char91_stroke0 },
+ { 2, char91_stroke1 },
+ { 2, char91_stroke2 },
+ { 2, char91_stroke3 },
+};
+
+/* char: 92 '\' */
+
+static const CoordRec char92_stroke0[] = {
+ { 5.84, 100 },
+ { 72.5067, -14.2857 },
+};
+
+static const StrokeRec char92[] = {
+ { 2, char92_stroke0 },
+};
+
+/* char: 93 ']' */
+
+static const CoordRec char93_stroke0[] = {
+ { 33.0114, 119.048 },
+ { 33.0114, -33.3333 },
+};
+
+static const CoordRec char93_stroke1[] = {
+ { 37.7733, 119.048 },
+ { 37.7733, -33.3333 },
+};
+
+static const CoordRec char93_stroke2[] = {
+ { 4.44, 119.048 },
+ { 37.7733, 119.048 },
+};
+
+static const CoordRec char93_stroke3[] = {
+ { 4.44, -33.3333 },
+ { 37.7733, -33.3333 },
+};
+
+static const StrokeRec char93[] = {
+ { 2, char93_stroke0 },
+ { 2, char93_stroke1 },
+ { 2, char93_stroke2 },
+ { 2, char93_stroke3 },
+};
+
+/* char: 94 '^' */
+
+static const CoordRec char94_stroke0[] = {
+ { 44.0752, 109.524 },
+ { 5.98, 42.8571 },
+};
+
+static const CoordRec char94_stroke1[] = {
+ { 44.0752, 109.524 },
+ { 82.1705, 42.8571 },
+};
+
+static const StrokeRec char94[] = {
+ { 2, char94_stroke0 },
+ { 2, char94_stroke1 },
+};
+
+/* char: 95 '_' */
+
+static const CoordRec char95_stroke0[] = {
+ { -1.1, -33.3333 },
+ { 103.662, -33.3333 },
+ { 103.662, -28.5714 },
+ { -1.1, -28.5714 },
+ { -1.1, -33.3333 },
+};
+
+static const StrokeRec char95[] = {
+ { 5, char95_stroke0 },
+};
+
+/* char: 96 '`' */
+
+static const CoordRec char96_stroke0[] = {
+ { 33.0219, 100 },
+ { 56.8314, 71.4286 },
+};
+
+static const CoordRec char96_stroke1[] = {
+ { 33.0219, 100 },
+ { 28.26, 95.2381 },
+ { 56.8314, 71.4286 },
+};
+
+static const StrokeRec char96[] = {
+ { 2, char96_stroke0 },
+ { 3, char96_stroke1 },
+};
+
+/* char: 97 'a' */
+
+static const CoordRec char97_stroke0[] = {
+ { 63.8229, 66.6667 },
+ { 63.8229, 0 },
+};
+
+static const CoordRec char97_stroke1[] = {
+ { 63.8229, 52.381 },
+ { 54.299, 61.9048 },
+ { 44.7752, 66.6667 },
+ { 30.4895, 66.6667 },
+ { 20.9657, 61.9048 },
+ { 11.4419, 52.381 },
+ { 6.68, 38.0952 },
+ { 6.68, 28.5714 },
+ { 11.4419, 14.2857 },
+ { 20.9657, 4.7619 },
+ { 30.4895, 0 },
+ { 44.7752, 0 },
+ { 54.299, 4.7619 },
+ { 63.8229, 14.2857 },
+};
+
+static const StrokeRec char97[] = {
+ { 2, char97_stroke0 },
+ { 14, char97_stroke1 },
+};
+
+/* char: 98 'b' */
+
+static const CoordRec char98_stroke0[] = {
+ { 8.76, 100 },
+ { 8.76, 0 },
+};
+
+static const CoordRec char98_stroke1[] = {
+ { 8.76, 52.381 },
+ { 18.2838, 61.9048 },
+ { 27.8076, 66.6667 },
+ { 42.0933, 66.6667 },
+ { 51.6171, 61.9048 },
+ { 61.141, 52.381 },
+ { 65.9029, 38.0952 },
+ { 65.9029, 28.5714 },
+ { 61.141, 14.2857 },
+ { 51.6171, 4.7619 },
+ { 42.0933, 0 },
+ { 27.8076, 0 },
+ { 18.2838, 4.7619 },
+ { 8.76, 14.2857 },
+};
+
+static const StrokeRec char98[] = {
+ { 2, char98_stroke0 },
+ { 14, char98_stroke1 },
+};
+
+/* char: 99 'c' */
+
+static const CoordRec char99_stroke0[] = {
+ { 62.6629, 52.381 },
+ { 53.139, 61.9048 },
+ { 43.6152, 66.6667 },
+ { 29.3295, 66.6667 },
+ { 19.8057, 61.9048 },
+ { 10.2819, 52.381 },
+ { 5.52, 38.0952 },
+ { 5.52, 28.5714 },
+ { 10.2819, 14.2857 },
+ { 19.8057, 4.7619 },
+ { 29.3295, 0 },
+ { 43.6152, 0 },
+ { 53.139, 4.7619 },
+ { 62.6629, 14.2857 },
+};
+
+static const StrokeRec char99[] = {
+ { 14, char99_stroke0 },
+};
+
+/* char: 100 'd' */
+
+static const CoordRec char100_stroke0[] = {
+ { 61.7829, 100 },
+ { 61.7829, 0 },
+};
+
+static const CoordRec char100_stroke1[] = {
+ { 61.7829, 52.381 },
+ { 52.259, 61.9048 },
+ { 42.7352, 66.6667 },
+ { 28.4495, 66.6667 },
+ { 18.9257, 61.9048 },
+ { 9.4019, 52.381 },
+ { 4.64, 38.0952 },
+ { 4.64, 28.5714 },
+ { 9.4019, 14.2857 },
+ { 18.9257, 4.7619 },
+ { 28.4495, 0 },
+ { 42.7352, 0 },
+ { 52.259, 4.7619 },
+ { 61.7829, 14.2857 },
+};
+
+static const StrokeRec char100[] = {
+ { 2, char100_stroke0 },
+ { 14, char100_stroke1 },
+};
+
+/* char: 101 'e' */
+
+static const CoordRec char101_stroke0[] = {
+ { 5.72, 38.0952 },
+ { 62.8629, 38.0952 },
+ { 62.8629, 47.619 },
+ { 58.101, 57.1429 },
+ { 53.339, 61.9048 },
+ { 43.8152, 66.6667 },
+ { 29.5295, 66.6667 },
+ { 20.0057, 61.9048 },
+ { 10.4819, 52.381 },
+ { 5.72, 38.0952 },
+ { 5.72, 28.5714 },
+ { 10.4819, 14.2857 },
+ { 20.0057, 4.7619 },
+ { 29.5295, 0 },
+ { 43.8152, 0 },
+ { 53.339, 4.7619 },
+ { 62.8629, 14.2857 },
+};
+
+static const StrokeRec char101[] = {
+ { 17, char101_stroke0 },
+};
+
+/* char: 102 'f' */
+
+static const CoordRec char102_stroke0[] = {
+ { 38.7752, 100 },
+ { 29.2514, 100 },
+ { 19.7276, 95.2381 },
+ { 14.9657, 80.9524 },
+ { 14.9657, 0 },
+};
+
+static const CoordRec char102_stroke1[] = {
+ { 0.68, 66.6667 },
+ { 34.0133, 66.6667 },
+};
+
+static const StrokeRec char102[] = {
+ { 5, char102_stroke0 },
+ { 2, char102_stroke1 },
+};
+
+/* char: 103 'g' */
+
+static const CoordRec char103_stroke0[] = {
+ { 62.5029, 66.6667 },
+ { 62.5029, -9.5238 },
+ { 57.741, -23.8095 },
+ { 52.979, -28.5714 },
+ { 43.4552, -33.3333 },
+ { 29.1695, -33.3333 },
+ { 19.6457, -28.5714 },
+};
+
+static const CoordRec char103_stroke1[] = {
+ { 62.5029, 52.381 },
+ { 52.979, 61.9048 },
+ { 43.4552, 66.6667 },
+ { 29.1695, 66.6667 },
+ { 19.6457, 61.9048 },
+ { 10.1219, 52.381 },
+ { 5.36, 38.0952 },
+ { 5.36, 28.5714 },
+ { 10.1219, 14.2857 },
+ { 19.6457, 4.7619 },
+ { 29.1695, 0 },
+ { 43.4552, 0 },
+ { 52.979, 4.7619 },
+ { 62.5029, 14.2857 },
+};
+
+static const StrokeRec char103[] = {
+ { 7, char103_stroke0 },
+ { 14, char103_stroke1 },
+};
+
+/* char: 104 'h' */
+
+static const CoordRec char104_stroke0[] = {
+ { 9.6, 100 },
+ { 9.6, 0 },
+};
+
+static const CoordRec char104_stroke1[] = {
+ { 9.6, 47.619 },
+ { 23.8857, 61.9048 },
+ { 33.4095, 66.6667 },
+ { 47.6952, 66.6667 },
+ { 57.219, 61.9048 },
+ { 61.981, 47.619 },
+ { 61.981, 0 },
+};
+
+static const StrokeRec char104[] = {
+ { 2, char104_stroke0 },
+ { 7, char104_stroke1 },
+};
+
+/* char: 105 'i' */
+
+static const CoordRec char105_stroke0[] = {
+ { 10.02, 100 },
+ { 14.7819, 95.2381 },
+ { 19.5438, 100 },
+ { 14.7819, 104.762 },
+ { 10.02, 100 },
+};
+
+static const CoordRec char105_stroke1[] = {
+ { 14.7819, 66.6667 },
+ { 14.7819, 0 },
+};
+
+static const StrokeRec char105[] = {
+ { 5, char105_stroke0 },
+ { 2, char105_stroke1 },
+};
+
+/* char: 106 'j' */
+
+static const CoordRec char106_stroke0[] = {
+ { 17.3876, 100 },
+ { 22.1495, 95.2381 },
+ { 26.9114, 100 },
+ { 22.1495, 104.762 },
+ { 17.3876, 100 },
+};
+
+static const CoordRec char106_stroke1[] = {
+ { 22.1495, 66.6667 },
+ { 22.1495, -14.2857 },
+ { 17.3876, -28.5714 },
+ { 7.8638, -33.3333 },
+ { -1.66, -33.3333 },
+};
+
+static const StrokeRec char106[] = {
+ { 5, char106_stroke0 },
+ { 5, char106_stroke1 },
+};
+
+/* char: 107 'k' */
+
+static const CoordRec char107_stroke0[] = {
+ { 9.6, 100 },
+ { 9.6, 0 },
+};
+
+static const CoordRec char107_stroke1[] = {
+ { 57.219, 66.6667 },
+ { 9.6, 19.0476 },
+};
+
+static const CoordRec char107_stroke2[] = {
+ { 28.6476, 38.0952 },
+ { 61.981, 0 },
+};
+
+static const StrokeRec char107[] = {
+ { 2, char107_stroke0 },
+ { 2, char107_stroke1 },
+ { 2, char107_stroke2 },
+};
+
+/* char: 108 'l' */
+
+static const CoordRec char108_stroke0[] = {
+ { 10.02, 100 },
+ { 10.02, 0 },
+};
+
+static const StrokeRec char108[] = {
+ { 2, char108_stroke0 },
+};
+
+/* char: 109 'm' */
+
+static const CoordRec char109_stroke0[] = {
+ { 9.6, 66.6667 },
+ { 9.6, 0 },
+};
+
+static const CoordRec char109_stroke1[] = {
+ { 9.6, 47.619 },
+ { 23.8857, 61.9048 },
+ { 33.4095, 66.6667 },
+ { 47.6952, 66.6667 },
+ { 57.219, 61.9048 },
+ { 61.981, 47.619 },
+ { 61.981, 0 },
+};
+
+static const CoordRec char109_stroke2[] = {
+ { 61.981, 47.619 },
+ { 76.2667, 61.9048 },
+ { 85.7905, 66.6667 },
+ { 100.076, 66.6667 },
+ { 109.6, 61.9048 },
+ { 114.362, 47.619 },
+ { 114.362, 0 },
+};
+
+static const StrokeRec char109[] = {
+ { 2, char109_stroke0 },
+ { 7, char109_stroke1 },
+ { 7, char109_stroke2 },
+};
+
+/* char: 110 'n' */
+
+static const CoordRec char110_stroke0[] = {
+ { 9.18, 66.6667 },
+ { 9.18, 0 },
+};
+
+static const CoordRec char110_stroke1[] = {
+ { 9.18, 47.619 },
+ { 23.4657, 61.9048 },
+ { 32.9895, 66.6667 },
+ { 47.2752, 66.6667 },
+ { 56.799, 61.9048 },
+ { 61.561, 47.619 },
+ { 61.561, 0 },
+};
+
+static const StrokeRec char110[] = {
+ { 2, char110_stroke0 },
+ { 7, char110_stroke1 },
+};
+
+/* char: 111 'o' */
+
+static const CoordRec char111_stroke0[] = {
+ { 28.7895, 66.6667 },
+ { 19.2657, 61.9048 },
+ { 9.7419, 52.381 },
+ { 4.98, 38.0952 },
+ { 4.98, 28.5714 },
+ { 9.7419, 14.2857 },
+ { 19.2657, 4.7619 },
+ { 28.7895, 0 },
+ { 43.0752, 0 },
+ { 52.599, 4.7619 },
+ { 62.1229, 14.2857 },
+ { 66.8848, 28.5714 },
+ { 66.8848, 38.0952 },
+ { 62.1229, 52.381 },
+ { 52.599, 61.9048 },
+ { 43.0752, 66.6667 },
+ { 28.7895, 66.6667 },
+};
+
+static const StrokeRec char111[] = {
+ { 17, char111_stroke0 },
+};
+
+/* char: 112 'p' */
+
+static const CoordRec char112_stroke0[] = {
+ { 9.46, 66.6667 },
+ { 9.46, -33.3333 },
+};
+
+static const CoordRec char112_stroke1[] = {
+ { 9.46, 52.381 },
+ { 18.9838, 61.9048 },
+ { 28.5076, 66.6667 },
+ { 42.7933, 66.6667 },
+ { 52.3171, 61.9048 },
+ { 61.841, 52.381 },
+ { 66.6029, 38.0952 },
+ { 66.6029, 28.5714 },
+ { 61.841, 14.2857 },
+ { 52.3171, 4.7619 },
+ { 42.7933, 0 },
+ { 28.5076, 0 },
+ { 18.9838, 4.7619 },
+ { 9.46, 14.2857 },
+};
+
+static const StrokeRec char112[] = {
+ { 2, char112_stroke0 },
+ { 14, char112_stroke1 },
+};
+
+/* char: 113 'q' */
+
+static const CoordRec char113_stroke0[] = {
+ { 61.9829, 66.6667 },
+ { 61.9829, -33.3333 },
+};
+
+static const CoordRec char113_stroke1[] = {
+ { 61.9829, 52.381 },
+ { 52.459, 61.9048 },
+ { 42.9352, 66.6667 },
+ { 28.6495, 66.6667 },
+ { 19.1257, 61.9048 },
+ { 9.6019, 52.381 },
+ { 4.84, 38.0952 },
+ { 4.84, 28.5714 },
+ { 9.6019, 14.2857 },
+ { 19.1257, 4.7619 },
+ { 28.6495, 0 },
+ { 42.9352, 0 },
+ { 52.459, 4.7619 },
+ { 61.9829, 14.2857 },
+};
+
+static const StrokeRec char113[] = {
+ { 2, char113_stroke0 },
+ { 14, char113_stroke1 },
+};
+
+/* char: 114 'r' */
+
+static const CoordRec char114_stroke0[] = {
+ { 9.46, 66.6667 },
+ { 9.46, 0 },
+};
+
+static const CoordRec char114_stroke1[] = {
+ { 9.46, 38.0952 },
+ { 14.2219, 52.381 },
+ { 23.7457, 61.9048 },
+ { 33.2695, 66.6667 },
+ { 47.5552, 66.6667 },
+};
+
+static const StrokeRec char114[] = {
+ { 2, char114_stroke0 },
+ { 5, char114_stroke1 },
+};
+
+/* char: 115 's' */
+
+static const CoordRec char115_stroke0[] = {
+ { 57.081, 52.381 },
+ { 52.319, 61.9048 },
+ { 38.0333, 66.6667 },
+ { 23.7476, 66.6667 },
+ { 9.4619, 61.9048 },
+ { 4.7, 52.381 },
+ { 9.4619, 42.8571 },
+ { 18.9857, 38.0952 },
+ { 42.7952, 33.3333 },
+ { 52.319, 28.5714 },
+ { 57.081, 19.0476 },
+ { 57.081, 14.2857 },
+ { 52.319, 4.7619 },
+ { 38.0333, 0 },
+ { 23.7476, 0 },
+ { 9.4619, 4.7619 },
+ { 4.7, 14.2857 },
+};
+
+static const StrokeRec char115[] = {
+ { 17, char115_stroke0 },
+};
+
+/* char: 116 't' */
+
+static const CoordRec char116_stroke0[] = {
+ { 14.8257, 100 },
+ { 14.8257, 19.0476 },
+ { 19.5876, 4.7619 },
+ { 29.1114, 0 },
+ { 38.6352, 0 },
+};
+
+static const CoordRec char116_stroke1[] = {
+ { 0.54, 66.6667 },
+ { 33.8733, 66.6667 },
+};
+
+static const StrokeRec char116[] = {
+ { 5, char116_stroke0 },
+ { 2, char116_stroke1 },
+};
+
+/* char: 117 'u' */
+
+static const CoordRec char117_stroke0[] = {
+ { 9.46, 66.6667 },
+ { 9.46, 19.0476 },
+ { 14.2219, 4.7619 },
+ { 23.7457, 0 },
+ { 38.0314, 0 },
+ { 47.5552, 4.7619 },
+ { 61.841, 19.0476 },
+};
+
+static const CoordRec char117_stroke1[] = {
+ { 61.841, 66.6667 },
+ { 61.841, 0 },
+};
+
+static const StrokeRec char117[] = {
+ { 7, char117_stroke0 },
+ { 2, char117_stroke1 },
+};
+
+/* char: 118 'v' */
+
+static const CoordRec char118_stroke0[] = {
+ { 1.8, 66.6667 },
+ { 30.3714, 0 },
+};
+
+static const CoordRec char118_stroke1[] = {
+ { 58.9429, 66.6667 },
+ { 30.3714, 0 },
+};
+
+static const StrokeRec char118[] = {
+ { 2, char118_stroke0 },
+ { 2, char118_stroke1 },
+};
+
+/* char: 119 'w' */
+
+static const CoordRec char119_stroke0[] = {
+ { 2.5, 66.6667 },
+ { 21.5476, 0 },
+};
+
+static const CoordRec char119_stroke1[] = {
+ { 40.5952, 66.6667 },
+ { 21.5476, 0 },
+};
+
+static const CoordRec char119_stroke2[] = {
+ { 40.5952, 66.6667 },
+ { 59.6429, 0 },
+};
+
+static const CoordRec char119_stroke3[] = {
+ { 78.6905, 66.6667 },
+ { 59.6429, 0 },
+};
+
+static const StrokeRec char119[] = {
+ { 2, char119_stroke0 },
+ { 2, char119_stroke1 },
+ { 2, char119_stroke2 },
+ { 2, char119_stroke3 },
+};
+
+/* char: 120 'x' */
+
+static const CoordRec char120_stroke0[] = {
+ { 1.66, 66.6667 },
+ { 54.041, 0 },
+};
+
+static const CoordRec char120_stroke1[] = {
+ { 54.041, 66.6667 },
+ { 1.66, 0 },
+};
+
+static const StrokeRec char120[] = {
+ { 2, char120_stroke0 },
+ { 2, char120_stroke1 },
+};
+
+/* char: 121 'y' */
+
+static const CoordRec char121_stroke0[] = {
+ { 6.5619, 66.6667 },
+ { 35.1333, 0 },
+};
+
+static const CoordRec char121_stroke1[] = {
+ { 63.7048, 66.6667 },
+ { 35.1333, 0 },
+ { 25.6095, -19.0476 },
+ { 16.0857, -28.5714 },
+ { 6.5619, -33.3333 },
+ { 1.8, -33.3333 },
+};
+
+static const StrokeRec char121[] = {
+ { 2, char121_stroke0 },
+ { 6, char121_stroke1 },
+};
+
+/* char: 122 'z' */
+
+static const CoordRec char122_stroke0[] = {
+ { 56.821, 66.6667 },
+ { 4.44, 0 },
+};
+
+static const CoordRec char122_stroke1[] = {
+ { 4.44, 66.6667 },
+ { 56.821, 66.6667 },
+};
+
+static const CoordRec char122_stroke2[] = {
+ { 4.44, 0 },
+ { 56.821, 0 },
+};
+
+static const StrokeRec char122[] = {
+ { 2, char122_stroke0 },
+ { 2, char122_stroke1 },
+ { 2, char122_stroke2 },
+};
+
+/* char: 123 '{' */
+
+static const CoordRec char123_stroke0[] = {
+ { 31.1895, 119.048 },
+ { 21.6657, 114.286 },
+ { 16.9038, 109.524 },
+ { 12.1419, 100 },
+ { 12.1419, 90.4762 },
+ { 16.9038, 80.9524 },
+ { 21.6657, 76.1905 },
+ { 26.4276, 66.6667 },
+ { 26.4276, 57.1429 },
+ { 16.9038, 47.619 },
+};
+
+static const CoordRec char123_stroke1[] = {
+ { 21.6657, 114.286 },
+ { 16.9038, 104.762 },
+ { 16.9038, 95.2381 },
+ { 21.6657, 85.7143 },
+ { 26.4276, 80.9524 },
+ { 31.1895, 71.4286 },
+ { 31.1895, 61.9048 },
+ { 26.4276, 52.381 },
+ { 7.38, 42.8571 },
+ { 26.4276, 33.3333 },
+ { 31.1895, 23.8095 },
+ { 31.1895, 14.2857 },
+ { 26.4276, 4.7619 },
+ { 21.6657, 0 },
+ { 16.9038, -9.5238 },
+ { 16.9038, -19.0476 },
+ { 21.6657, -28.5714 },
+};
+
+static const CoordRec char123_stroke2[] = {
+ { 16.9038, 38.0952 },
+ { 26.4276, 28.5714 },
+ { 26.4276, 19.0476 },
+ { 21.6657, 9.5238 },
+ { 16.9038, 4.7619 },
+ { 12.1419, -4.7619 },
+ { 12.1419, -14.2857 },
+ { 16.9038, -23.8095 },
+ { 21.6657, -28.5714 },
+ { 31.1895, -33.3333 },
+};
+
+static const StrokeRec char123[] = {
+ { 10, char123_stroke0 },
+ { 17, char123_stroke1 },
+ { 10, char123_stroke2 },
+};
+
+/* char: 124 '|' */
+
+static const CoordRec char124_stroke0[] = {
+ { 11.54, 119.048 },
+ { 11.54, -33.3333 },
+};
+
+static const StrokeRec char124[] = {
+ { 2, char124_stroke0 },
+};
+
+/* char: 125 '}' */
+
+static const CoordRec char125_stroke0[] = {
+ { 9.18, 119.048 },
+ { 18.7038, 114.286 },
+ { 23.4657, 109.524 },
+ { 28.2276, 100 },
+ { 28.2276, 90.4762 },
+ { 23.4657, 80.9524 },
+ { 18.7038, 76.1905 },
+ { 13.9419, 66.6667 },
+ { 13.9419, 57.1429 },
+ { 23.4657, 47.619 },
+};
+
+static const CoordRec char125_stroke1[] = {
+ { 18.7038, 114.286 },
+ { 23.4657, 104.762 },
+ { 23.4657, 95.2381 },
+ { 18.7038, 85.7143 },
+ { 13.9419, 80.9524 },
+ { 9.18, 71.4286 },
+ { 9.18, 61.9048 },
+ { 13.9419, 52.381 },
+ { 32.9895, 42.8571 },
+ { 13.9419, 33.3333 },
+ { 9.18, 23.8095 },
+ { 9.18, 14.2857 },
+ { 13.9419, 4.7619 },
+ { 18.7038, 0 },
+ { 23.4657, -9.5238 },
+ { 23.4657, -19.0476 },
+ { 18.7038, -28.5714 },
+};
+
+static const CoordRec char125_stroke2[] = {
+ { 23.4657, 38.0952 },
+ { 13.9419, 28.5714 },
+ { 13.9419, 19.0476 },
+ { 18.7038, 9.5238 },
+ { 23.4657, 4.7619 },
+ { 28.2276, -4.7619 },
+ { 28.2276, -14.2857 },
+ { 23.4657, -23.8095 },
+ { 18.7038, -28.5714 },
+ { 9.18, -33.3333 },
+};
+
+static const StrokeRec char125[] = {
+ { 10, char125_stroke0 },
+ { 17, char125_stroke1 },
+ { 10, char125_stroke2 },
+};
+
+/* char: 126 '~' */
+
+static const CoordRec char126_stroke0[] = {
+ { 2.92, 28.5714 },
+ { 2.92, 38.0952 },
+ { 7.6819, 52.381 },
+ { 17.2057, 57.1429 },
+ { 26.7295, 57.1429 },
+ { 36.2533, 52.381 },
+ { 55.301, 38.0952 },
+ { 64.8248, 33.3333 },
+ { 74.3486, 33.3333 },
+ { 83.8724, 38.0952 },
+ { 88.6343, 47.619 },
+};
+
+static const CoordRec char126_stroke1[] = {
+ { 2.92, 38.0952 },
+ { 7.6819, 47.619 },
+ { 17.2057, 52.381 },
+ { 26.7295, 52.381 },
+ { 36.2533, 47.619 },
+ { 55.301, 33.3333 },
+ { 64.8248, 28.5714 },
+ { 74.3486, 28.5714 },
+ { 83.8724, 33.3333 },
+ { 88.6343, 47.619 },
+ { 88.6343, 57.1429 },
+};
+
+static const StrokeRec char126[] = {
+ { 11, char126_stroke0 },
+ { 11, char126_stroke1 },
+};
+
+/* char: 127 */
+
+static const CoordRec char127_stroke0[] = {
+ { 52.381, 100 },
+ { 14.2857, -33.3333 },
+};
+
+static const CoordRec char127_stroke1[] = {
+ { 28.5714, 66.6667 },
+ { 14.2857, 61.9048 },
+ { 4.7619, 52.381 },
+ { 0, 38.0952 },
+ { 0, 23.8095 },
+ { 4.7619, 14.2857 },
+ { 14.2857, 4.7619 },
+ { 28.5714, 0 },
+ { 38.0952, 0 },
+ { 52.381, 4.7619 },
+ { 61.9048, 14.2857 },
+ { 66.6667, 28.5714 },
+ { 66.6667, 42.8571 },
+ { 61.9048, 52.381 },
+ { 52.381, 61.9048 },
+ { 38.0952, 66.6667 },
+ { 28.5714, 66.6667 },
+};
+
+static const StrokeRec char127[] = {
+ { 2, char127_stroke0 },
+ { 17, char127_stroke1 },
+};
+
+static const StrokeCharRec chars[] = {
+ { 0, /* char0 */ 0, 0, 0 },
+ { 0, /* char1 */ 0, 0, 0 },
+ { 0, /* char2 */ 0, 0, 0 },
+ { 0, /* char3 */ 0, 0, 0 },
+ { 0, /* char4 */ 0, 0, 0 },
+ { 0, /* char5 */ 0, 0, 0 },
+ { 0, /* char6 */ 0, 0, 0 },
+ { 0, /* char7 */ 0, 0, 0 },
+ { 0, /* char8 */ 0, 0, 0 },
+ { 0, /* char9 */ 0, 0, 0 },
+ { 0, /* char10 */ 0, 0, 0 },
+ { 0, /* char11 */ 0, 0, 0 },
+ { 0, /* char12 */ 0, 0, 0 },
+ { 0, /* char13 */ 0, 0, 0 },
+ { 0, /* char14 */ 0, 0, 0 },
+ { 0, /* char15 */ 0, 0, 0 },
+ { 0, /* char16 */ 0, 0, 0 },
+ { 0, /* char17 */ 0, 0, 0 },
+ { 0, /* char18 */ 0, 0, 0 },
+ { 0, /* char19 */ 0, 0, 0 },
+ { 0, /* char20 */ 0, 0, 0 },
+ { 0, /* char21 */ 0, 0, 0 },
+ { 0, /* char22 */ 0, 0, 0 },
+ { 0, /* char23 */ 0, 0, 0 },
+ { 0, /* char24 */ 0, 0, 0 },
+ { 0, /* char25 */ 0, 0, 0 },
+ { 0, /* char26 */ 0, 0, 0 },
+ { 0, /* char27 */ 0, 0, 0 },
+ { 0, /* char28 */ 0, 0, 0 },
+ { 0, /* char29 */ 0, 0, 0 },
+ { 0, /* char30 */ 0, 0, 0 },
+ { 0, /* char31 */ 0, 0, 0 },
+ { 0, /* char32 */ 0, 35, 70 }, /* jwz: changed this to be 'n' width.
+ (it was 52.381, 104.762) */
+ { 2, char33, 13.3819, 26.6238 },
+ { 2, char34, 23.0676, 51.4352 },
+ { 4, char35, 36.5333, 79.4886 },
+ { 3, char36, 38.1533, 76.2067 },
+ { 3, char37, 49.2171, 96.5743 },
+ { 1, char38, 53.599, 101.758 },
+ { 1, char39, 4.44, 13.62 },
+ { 1, char40, 21.8657, 47.1733 },
+ { 1, char41, 24.3276, 47.5333 },
+ { 3, char42, 30.7695, 59.439 },
+ { 2, char43, 48.8371, 97.2543 },
+ { 1, char44, 13.5219, 26.0638 },
+ { 1, char45, 50.2371, 100.754 },
+ { 1, char46, 13.1019, 26.4838 },
+ { 1, char47, 40.5733, 82.1067 },
+ { 1, char48, 38.3133, 77.0667 },
+ { 1, char49, 30.8676, 66.5295 },
+ { 1, char50, 38.7533, 77.6467 },
+ { 1, char51, 38.3333, 77.0467 },
+ { 2, char52, 37.2133, 80.1686 },
+ { 1, char53, 38.1933, 77.6867 },
+ { 1, char54, 34.1514, 73.8048 },
+ { 2, char55, 38.8933, 77.2267 },
+ { 1, char56, 38.9333, 77.6667 },
+ { 1, char57, 39.9333, 74.0648 },
+ { 2, char58, 14.0819, 26.2238 },
+ { 2, char59, 12.9619, 26.3038 },
+ { 1, char60, 41.1552, 81.6105 },
+ { 2, char61, 48.5571, 97.2543 },
+ { 1, char62, 40.8752, 81.6105 },
+ { 2, char63, 36.9914, 73.9029 },
+ { 2, char64, 34.9314, 74.3648 },
+ { 3, char65, 40.5952, 80.4905 },
+ { 3, char66, 44.7533, 83.6267 },
+ { 1, char67, 39.9933, 84.4886 },
+ { 2, char68, 45.2933, 85.2867 },
+ { 4, char69, 39.9914, 78.1848 },
+ { 3, char70, 39.9914, 78.7448 },
+ { 2, char71, 40.3933, 89.7686 },
+ { 3, char72, 44.7533, 89.0867 },
+ { 1, char73, 10.86, 21.3 },
+ { 1, char74, 31.0714, 59.999 },
+ { 3, char75, 44.6133, 79.3267 },
+ { 2, char76, 40.2514, 71.3229 },
+ { 4, char77, 48.9552, 97.2105 },
+ { 3, char78, 44.4733, 88.8067 },
+ { 1, char79, 44.3352, 88.8305 },
+ { 2, char80, 45.4333, 85.6667 },
+ { 2, char81, 43.3952, 88.0905 },
+ { 3, char82, 45.0133, 82.3667 },
+ { 1, char83, 41.3333, 80.8267 },
+ { 2, char84, 35.6933, 71.9467 },
+ { 1, char85, 44.8733, 89.4867 },
+ { 2, char86, 40.4552, 81.6105 },
+ { 4, char87, 49.839, 100.518 },
+ { 2, char88, 35.8333, 72.3667 },
+ { 2, char89, 39.6152, 79.6505 },
+ { 3, char90, 35.8333, 73.7467 },
+ { 4, char91, 22.0657, 46.1133 },
+ { 1, char92, 39.1733, 78.2067 },
+ { 4, char93, 23.4876, 46.3933 },
+ { 2, char94, 44.0752, 90.2305 },
+ { 1, char95, 51.281, 104.062 },
+ { 2, char96, 42.5457, 83.5714 },
+ { 2, char97, 35.2514, 66.6029 },
+ { 2, char98, 37.3314, 70.4629 },
+ { 1, char99, 34.0914, 68.9229 },
+ { 2, char100, 33.2114, 70.2629 },
+ { 1, char101, 34.2914, 68.5229 },
+ { 2, char102, 14.9657, 38.6552 },
+ { 2, char103, 33.9314, 70.9829 },
+ { 2, char104, 33.4095, 71.021 },
+ { 2, char105, 14.7819, 28.8638 },
+ { 2, char106, 17.3876, 36.2314 },
+ { 3, char107, 33.4095, 62.521 },
+ { 1, char108, 10.02, 19.34 },
+ { 3, char109, 61.981, 123.962 },
+ { 2, char110, 32.9895, 70.881 },
+ { 1, char111, 33.5514, 71.7448 },
+ { 2, char112, 38.0314, 70.8029 },
+ { 2, char113, 33.4114, 70.7429 },
+ { 2, char114, 23.7457, 49.4952 },
+ { 1, char115, 28.5095, 62.321 },
+ { 2, char116, 14.8257, 39.3152 },
+ { 2, char117, 33.2695, 71.161 },
+ { 2, char118, 30.3714, 60.6029 },
+ { 4, char119, 40.5952, 80.4905 },
+ { 2, char120, 25.4695, 56.401 },
+ { 2, char121, 35.1333, 66.0648 },
+ { 3, char122, 28.2495, 61.821 },
+ { 3, char123, 21.6657, 41.6295 },
+ { 1, char124, 11.54, 23.78 },
+ { 3, char125, 18.7038, 41.4695 },
+ { 2, char126, 45.7771, 91.2743 },
+ { 2, char127, 33.3333, 66.6667 },
+};
+
+static
+StrokeFontRec glutStrokeRoman = { "Roman", 128, chars, 119.048, -33.3333 };
+
diff --git a/hacks/glx/glut_stroke.c b/hacks/glx/glut_stroke.c
new file mode 100644
index 0000000..59850ea
--- /dev/null
+++ b/hacks/glx/glut_stroke.c
@@ -0,0 +1,66 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#if 0 /* for Mesa */
+# include "glutint.h"
+#else /* for xscreensaver */
+
+# ifdef HAVE_CONFIG_H
+# include "config.h"
+# endif
+
+# ifdef HAVE_COCOA
+# include "jwxyz.h"
+# elif defined(HAVE_ANDROID)
+# include "jwxyz.h"
+# include <GLES/gl.h>
+# else /* real X11 */
+# include <GL/gl.h>
+# endif
+
+# ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+# endif /* HAVE_JWZGLES */
+
+# undef APIENTRY
+# define APIENTRY /**/
+#endif
+
+#include "glutstroke.h"
+
+void APIENTRY
+glutStrokeCharacter(GLUTstrokeFont font, int c)
+{
+ const StrokeCharRec *ch;
+ const StrokeRec *stroke;
+ const CoordRec *coord;
+ StrokeFontPtr fontinfo;
+ int i, j;
+
+
+#if defined(_WIN32)
+ fontinfo = (StrokeFontPtr) __glutFont(font);
+#else
+ fontinfo = (StrokeFontPtr) font;
+#endif
+
+ if (c < 0 || c >= fontinfo->num_chars)
+ return;
+ ch = &(fontinfo->ch[c]);
+ if (ch) {
+ for (i = ch->num_strokes, stroke = ch->stroke;
+ i > 0; i--, stroke++) {
+ glBegin(GL_LINE_STRIP);
+ for (j = stroke->num_coords, coord = stroke->coord;
+ j > 0; j--, coord++) {
+ glVertex2f(coord->x, coord->y);
+ }
+ glEnd();
+ }
+ glTranslatef(ch->right, 0.0, 0.0);
+ }
+}
diff --git a/hacks/glx/glut_swidth.c b/hacks/glx/glut_swidth.c
new file mode 100644
index 0000000..b165a0a
--- /dev/null
+++ b/hacks/glx/glut_swidth.c
@@ -0,0 +1,77 @@
+
+/* Copyright (c) Mark J. Kilgard, 1995. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#if 0 /* for Mesa */
+# include "glutint.h"
+#else /* for xscreensaver */
+# ifdef HAVE_CONFIG_H
+# include "config.h"
+# endif
+# ifndef HAVE_JWXYZ
+# include <GL/gl.h>
+# endif
+#ifdef HAVE_ANDROID
+#include <GLES/gl.h>
+#define Bool int
+#endif
+# ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+# endif /* HAVE_JWZGLES */
+# undef APIENTRY
+# define APIENTRY /**/
+#endif
+
+#include "glutstroke.h"
+
+/* CENTRY */
+int APIENTRY
+glutStrokeWidth(GLUTstrokeFont font, int c)
+{
+ StrokeFontPtr fontinfo;
+ const StrokeCharRec *ch;
+
+#if defined(_WIN32)
+ fontinfo = (StrokeFontPtr) __glutFont(font);
+#else
+ fontinfo = (StrokeFontPtr) font;
+#endif
+
+ if (c < 0 || c >= fontinfo->num_chars)
+ return 0;
+ ch = &(fontinfo->ch[c]);
+ if (ch)
+ return ch->right;
+ else
+ return 0;
+}
+
+int APIENTRY
+glutStrokeLength(GLUTstrokeFont font, const unsigned char *string)
+{
+ int c, length;
+ StrokeFontPtr fontinfo;
+ const StrokeCharRec *ch;
+
+#if defined(_WIN32)
+ fontinfo = (StrokeFontPtr) __glutFont(font);
+#else
+ fontinfo = (StrokeFontPtr) font;
+#endif
+
+ length = 0;
+ for (; *string != '\0'; string++) {
+ c = *string;
+ if (c >= 0 && c < fontinfo->num_chars) {
+ ch = &(fontinfo->ch[c]);
+ if (ch)
+ length += ch->right;
+ }
+ }
+ return length;
+}
+
+/* ENDCENTRY */
diff --git a/hacks/glx/glutstroke.h b/hacks/glx/glutstroke.h
new file mode 100644
index 0000000..43a645b
--- /dev/null
+++ b/hacks/glx/glutstroke.h
@@ -0,0 +1,47 @@
+#ifndef __glutstroke_h__
+#define __glutstroke_h__
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#if defined(_WIN32)
+#pragma warning (disable:4244) /* disable bogus conversion warnings */
+#pragma warning (disable:4305) /* VC++ 5.0 version of above warning. */
+#endif
+
+typedef struct {
+ float x;
+ float y;
+} CoordRec, *CoordPtr;
+
+typedef struct {
+ int num_coords;
+ const CoordRec *coord;
+} StrokeRec, *StrokePtr;
+
+typedef struct {
+ int num_strokes;
+ const StrokeRec *stroke;
+ float center;
+ float right;
+} StrokeCharRec, *StrokeCharPtr;
+
+typedef struct {
+ const char *name;
+ int num_chars;
+ const StrokeCharRec *ch;
+ float top;
+ float bottom;
+} StrokeFontRec, *StrokeFontPtr;
+
+typedef void *GLUTstrokeFont;
+
+/* for xscreensaver */
+extern void glutStrokeCharacter (GLUTstrokeFont font, int c);
+extern int glutStrokeWidth (GLUTstrokeFont font, int c);
+extern int glutStrokeLength (GLUTstrokeFont font, const unsigned char *string);
+
+#endif /* __glutstroke_h__ */
diff --git a/hacks/glx/grab-ximage.c b/hacks/glx/grab-ximage.c
new file mode 100644
index 0000000..0f71847
--- /dev/null
+++ b/hacks/glx/grab-ximage.c
@@ -0,0 +1,813 @@
+/* grab-ximage.c --- grab the screen to an XImage for use with OpenGL.
+ * xscreensaver, Copyright (c) 2001-2008 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#ifdef HAVE_ANDROID
+#include <GLES/gl.h>
+#endif
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+# ifndef HAVE_JWZGLES
+# include <OpenGL/glu.h>
+# endif
+#else
+# include <X11/Xlib.h>
+# include <X11/Xutil.h>
+# include <GL/gl.h> /* only for GLfloat */
+# include <GL/glu.h> /* for gluBuild2DMipmaps */
+# include <GL/glx.h> /* for glXMakeCurrent() */
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#include "grab-ximage.h"
+#include "grabscreen.h"
+#include "pow2.h"
+#include "visual.h"
+
+/* If REFORMAT_IMAGE_DATA is defined, then we convert Pixmaps to textures
+ like this:
+
+ - get Pixmap as an XImage in whatever form the server hands us;
+ - convert that XImage to 32-bit RGBA in client-local endianness;
+ - make the texture using RGBA, UNSIGNED_BYTE.
+
+ If undefined, we do this:
+
+ - get Pixmap as an XImage in whatever form the server hands us;
+ - figure out what OpenGL texture packing parameters correspond to
+ the image data that the server sent us and use that, e.g.,
+ BGRA, INT_8_8_8_8_REV.
+
+ You might expect the second method to be faster, since we're not making
+ a second copy of the data and iterating each pixel before we hand it
+ to GL. But, you'd be wrong. The first method is almost 6x faster.
+ I guess GL is reformatting it *again*, and doing it very inefficiently!
+*/
+#define REFORMAT_IMAGE_DATA
+
+
+#include "xshm.h"
+
+extern char *progname;
+
+#include <sys/time.h>
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+#else
+# include <X11/Xutil.h>
+#endif
+
+#undef MAX
+#define MAX(a,b) ((a)>(b)?(a):(b))
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+
+static int debug_p = 0;
+
+static Bool
+bigendian (void)
+{
+ union { int i; char c[sizeof(int)]; } u;
+ u.i = 1;
+ return !u.c[0];
+}
+
+
+#ifdef REFORMAT_IMAGE_DATA
+
+/* Given a bitmask, returns the position and width of the field.
+ */
+static void
+decode_mask (unsigned long mask, unsigned long *pos_ret,
+ unsigned long *size_ret)
+{
+ int i;
+ for (i = 0; i < 32; i++)
+ if (mask & (1L << i))
+ {
+ int j = 0;
+ *pos_ret = i;
+ for (; i < 32; i++, j++)
+ if (! (mask & (1L << i)))
+ break;
+ *size_ret = j;
+ return;
+ }
+}
+
+
+/* Given a value and a field-width, expands the field to fill out 8 bits.
+ */
+static unsigned char
+spread_bits (unsigned char value, unsigned char width)
+{
+ switch (width)
+ {
+ case 8: return value;
+ case 7: return (value << 1) | (value >> 6);
+ case 6: return (value << 2) | (value >> 4);
+ case 5: return (value << 3) | (value >> 2);
+ case 4: return (value << 4) | (value);
+ case 3: return (value << 5) | (value << 2) | (value >> 2);
+ case 2: return (value << 6) | (value << 4) | (value);
+ default: abort(); break;
+ }
+}
+
+
+static XImage *
+convert_ximage_to_rgba32 (Screen *screen, XImage *image)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ Visual *visual = DefaultVisualOfScreen (screen);
+
+ int x, y;
+ unsigned long crpos=0, cgpos=0, cbpos=0, capos=0; /* bitfield positions */
+ unsigned long srpos=0, sgpos=0, sbpos=0;
+ unsigned long srmsk=0, sgmsk=0, sbmsk=0;
+ unsigned long srsiz=0, sgsiz=0, sbsiz=0;
+ XColor *colors = 0;
+ unsigned char spread_map[3][256];
+
+ /* Note: height+2 in "to" to work around an array bounds overrun
+ in gluBuild2DMipmaps / gluScaleImage.
+ */
+ XImage *from = image;
+ XImage *to = XCreateImage (dpy, visual, 32, /* depth */
+ ZPixmap, 0, 0, from->width, from->height,
+ 32, /* bitmap pad */
+ 0);
+ to->data = (char *) calloc (to->height + 2, to->bytes_per_line);
+
+ /* Set the bit order in the XImage structure to whatever the
+ local host's native bit order is.
+ */
+ to->bitmap_bit_order =
+ to->byte_order =
+ (bigendian() ? MSBFirst : LSBFirst);
+
+ if (visual_class (screen, visual) == PseudoColor ||
+ visual_class (screen, visual) == GrayScale)
+ {
+ Colormap cmap = DefaultColormapOfScreen (screen);
+ int ncolors = visual_cells (screen, visual);
+ int i;
+ colors = (XColor *) calloc (sizeof (*colors), ncolors+1);
+ for (i = 0; i < ncolors; i++)
+ colors[i].pixel = i;
+ XQueryColors (dpy, cmap, colors, ncolors);
+ }
+
+ if (colors == 0) /* truecolor */
+ {
+ srmsk = to->red_mask;
+ sgmsk = to->green_mask;
+ sbmsk = to->blue_mask;
+
+ decode_mask (srmsk, &srpos, &srsiz);
+ decode_mask (sgmsk, &sgpos, &sgsiz);
+ decode_mask (sbmsk, &sbpos, &sbsiz);
+ }
+
+ /* Pack things in "RGBA" order in client endianness. */
+ if (bigendian())
+ crpos = 24, cgpos = 16, cbpos = 8, capos = 0;
+ else
+ crpos = 0, cgpos = 8, cbpos = 16, capos = 24;
+
+ if (colors == 0) /* truecolor */
+ {
+ int i;
+ for (i = 0; i < 256; i++)
+ {
+ spread_map[0][i] = spread_bits (i, srsiz);
+ spread_map[1][i] = spread_bits (i, sgsiz);
+ spread_map[2][i] = spread_bits (i, sbsiz);
+ }
+ }
+
+ /* trying to track down an intermittent crash in ximage_putpixel_32 */
+ if (to->width < from->width) abort();
+ if (to->height < from->height) abort();
+
+ for (y = 0; y < from->height; y++)
+ for (x = 0; x < from->width; x++)
+ {
+ unsigned long sp = XGetPixel (from, x, y);
+ unsigned char sr, sg, sb;
+ unsigned long cp;
+
+ if (colors)
+ {
+ sr = colors[sp].red & 0xFF;
+ sg = colors[sp].green & 0xFF;
+ sb = colors[sp].blue & 0xFF;
+ }
+ else
+ {
+ sr = (sp & srmsk) >> srpos;
+ sg = (sp & sgmsk) >> sgpos;
+ sb = (sp & sbmsk) >> sbpos;
+
+ sr = spread_map[0][sr];
+ sg = spread_map[1][sg];
+ sb = spread_map[2][sb];
+ }
+
+ cp = ((sr << crpos) |
+ (sg << cgpos) |
+ (sb << cbpos) |
+ (0xFF << capos));
+
+ XPutPixel (to, x, y, cp);
+ }
+
+ if (colors) free (colors);
+
+ return to;
+}
+
+#endif /* REFORMAT_IMAGE_DATA */
+
+/* Shrinks the XImage by a factor of two.
+ We use this when mipmapping fails on large textures.
+ */
+static void
+halve_image (XImage *ximage, XRectangle *geom)
+{
+ int w2 = ximage->width/2;
+ int h2 = ximage->height/2;
+ int x, y;
+ XImage *ximage2;
+
+ if (w2 <= 32 || h2 <= 32) /* let's not go crazy here, man. */
+ return;
+
+ if (debug_p)
+ fprintf (stderr, "%s: shrinking image %dx%d -> %dx%d\n",
+ progname, ximage->width, ximage->height, w2, h2);
+
+ ximage2 = (XImage *) calloc (1, sizeof (*ximage2));
+ *ximage2 = *ximage;
+ ximage2->width = w2;
+ ximage2->height = h2;
+ ximage2->bytes_per_line = 0;
+ ximage2->data = 0;
+ XInitImage (ximage2);
+
+ ximage2->data = (char *) calloc (h2, ximage2->bytes_per_line);
+ if (!ximage2->data)
+ {
+ fprintf (stderr, "%s: out of memory (scaling %dx%d image to %dx%d)\n",
+ progname, ximage->width, ximage->height, w2, h2);
+ exit (1);
+ }
+
+ for (y = 0; y < h2; y++)
+ for (x = 0; x < w2; x++)
+ XPutPixel (ximage2, x, y, XGetPixel (ximage, x*2, y*2));
+
+ free (ximage->data);
+ *ximage = *ximage2;
+ ximage2->data = 0;
+ XFree (ximage2);
+
+ if (geom)
+ {
+ geom->x /= 2;
+ geom->y /= 2;
+ geom->width /= 2;
+ geom->height /= 2;
+ }
+}
+
+
+#ifdef REFORMAT_IMAGE_DATA
+
+/* Pulls the Pixmap bits from the server and returns an XImage
+ in some format acceptable to OpenGL.
+ */
+static XImage *
+pixmap_to_gl_ximage (Screen *screen, Window window, Pixmap pixmap)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ Visual *visual = DefaultVisualOfScreen (screen);
+ unsigned int width, height, depth;
+
+ XShmSegmentInfo shm_info;
+
+ XImage *server_ximage = 0;
+ XImage *client_ximage = 0;
+
+ {
+ Window root;
+ int x, y;
+ unsigned int bw;
+ XGetGeometry (dpy, pixmap, &root, &x, &y, &width, &height, &bw, &depth);
+ }
+
+ if (width < 5 || height < 5) /* something's gone wrong somewhere... */
+ return 0;
+
+ /* Convert the server-side Pixmap to a client-side GL-ordered XImage.
+ */
+ server_ximage = create_xshm_image (dpy, visual, depth, ZPixmap, &shm_info,
+ width, height);
+ get_xshm_image (dpy, pixmap, server_ximage, 0, 0, ~0L, &shm_info);
+
+ client_ximage = convert_ximage_to_rgba32 (screen, server_ximage);
+
+ destroy_xshm_image (dpy, server_ximage, &shm_info);
+
+ return client_ximage;
+}
+
+
+# else /* ! REFORMAT_IMAGE_DATA */
+
+typedef struct {
+ unsigned int depth, red_mask, green_mask, blue_mask; /* when this... */
+ GLint type, format; /* ...use this. */
+} conversion_table;
+
+/* Abbreviate these so that the table entries all fit on one line...
+ */
+#define BYTE GL_UNSIGNED_BYTE
+#define BYTE_2_3_3_REV GL_UNSIGNED_BYTE_2_3_3_REV
+#define BYTE_3_3_2 GL_UNSIGNED_BYTE_3_3_2
+#define INT_10_10_10_2 GL_UNSIGNED_INT_10_10_10_2
+#define INT_2_10_10_10_REV GL_UNSIGNED_INT_2_10_10_10_REV
+#define INT_8_8_8_8 GL_UNSIGNED_INT_8_8_8_8
+#define INT_8_8_8_8_REV GL_UNSIGNED_INT_8_8_8_8_REV
+#define SHORT_1_5_5_5_REV GL_UNSIGNED_SHORT_1_5_5_5_REV
+#define SHORT_4_4_4_4 GL_UNSIGNED_SHORT_4_4_4_4
+#define SHORT_4_4_4_4_REV GL_UNSIGNED_SHORT_4_4_4_4_REV
+#define SHORT_5_5_5_1 GL_UNSIGNED_SHORT_5_5_5_1
+#define SHORT_5_6_5 GL_UNSIGNED_SHORT_5_6_5
+#define SHORT_5_6_5_REV GL_UNSIGNED_SHORT_5_6_5_REV
+
+static const conversion_table ctable[] = {
+ { 8, 0x000000E0, 0x0000001C, 0x00000003, BYTE_3_3_2, GL_RGB },
+ { 8, 0x00000007, 0x00000038, 0x000000C0, BYTE_2_3_3_REV, GL_RGB },
+ { 16, 0x0000F800, 0x000007E0, 0x0000001F, SHORT_5_6_5, GL_RGB },
+ { 16, 0x0000001F, 0x000007E0, 0x0000F800, SHORT_5_6_5_REV, GL_RGB },
+ { 16, 0x0000F000, 0x00000F00, 0x000000F0, SHORT_4_4_4_4, GL_RGBA },
+ { 16, 0x000000F0, 0x00000F00, 0x0000F000, SHORT_4_4_4_4, GL_BGRA },
+ { 16, 0x0000000F, 0x000000F0, 0x00000F00, SHORT_4_4_4_4, GL_ABGR_EXT },
+ { 16, 0x0000000F, 0x000000F0, 0x00000F00, SHORT_4_4_4_4_REV, GL_RGBA },
+ { 16, 0x00000F00, 0x000000F0, 0x0000000F, SHORT_4_4_4_4_REV, GL_BGRA },
+ { 16, 0x0000F800, 0x000007C0, 0x0000003E, SHORT_5_5_5_1, GL_RGBA },
+ { 16, 0x0000003E, 0x000007C0, 0x0000F800, SHORT_5_5_5_1, GL_BGRA },
+ { 16, 0x00000001, 0x0000003E, 0x000007C0, SHORT_5_5_5_1, GL_ABGR_EXT },
+ { 16, 0x0000001F, 0x000003E0, 0x00007C00, SHORT_1_5_5_5_REV, GL_RGBA },
+ { 16, 0x00007C00, 0x000003E0, 0x0000001F, SHORT_1_5_5_5_REV, GL_BGRA },
+ { 32, 0xFF000000, 0x00FF0000, 0x0000FF00, INT_8_8_8_8, GL_RGBA },
+ { 32, 0x0000FF00, 0x00FF0000, 0xFF000000, INT_8_8_8_8, GL_BGRA },
+ { 32, 0x000000FF, 0x0000FF00, 0x00FF0000, INT_8_8_8_8, GL_ABGR_EXT },
+ { 32, 0x000000FF, 0x0000FF00, 0x00FF0000, INT_8_8_8_8_REV, GL_RGBA },
+ { 32, 0x00FF0000, 0x0000FF00, 0x000000FF, INT_8_8_8_8_REV, GL_BGRA },
+ { 32, 0xFFC00000, 0x003FF000, 0x00000FFC, INT_10_10_10_2, GL_RGBA },
+ { 32, 0x00000FFC, 0x003FF000, 0xFFC00000, INT_10_10_10_2, GL_BGRA },
+ { 32, 0x00000003, 0x00000FFC, 0x003FF000, INT_10_10_10_2, GL_ABGR_EXT },
+ { 32, 0x000003FF, 0x000FFC00, 0x3FF00000, INT_2_10_10_10_REV, GL_RGBA },
+ { 32, 0x3FF00000, 0x000FFC00, 0x000003FF, INT_2_10_10_10_REV, GL_BGRA },
+ { 24, 0x000000FF, 0x0000FF00, 0x00FF0000, BYTE, GL_RGB },
+ { 24, 0x00FF0000, 0x0000FF00, 0x000000FF, BYTE, GL_BGR },
+};
+
+
+/* Given an XImage, returns the GL settings to use its data as a texture.
+ */
+static void
+gl_settings_for_ximage (XImage *image,
+ GLint *type_ret, GLint *format_ret, GLint *swap_ret)
+{
+ int i;
+ for (i = 0; i < countof(ctable); ++i)
+ {
+ if (image->bits_per_pixel == ctable[i].depth &&
+ image->red_mask == ctable[i].red_mask &&
+ image->green_mask == ctable[i].green_mask &&
+ image->blue_mask == ctable[i].blue_mask)
+ {
+ *type_ret = ctable[i].type;
+ *format_ret = ctable[i].format;
+
+ if (image->bits_per_pixel == 24)
+ {
+ /* don't know how to test this... */
+ *type_ret = (ctable[i].type == GL_RGB) ? GL_BGR : GL_RGB;
+ *swap_ret = 0;
+ }
+ else
+ {
+ *swap_ret = !!(image->byte_order == MSBFirst) ^ !!bigendian();
+ }
+
+ if (debug_p)
+ {
+ fprintf (stderr, "%s: using %s %s %d for %d %08lX %08lX %08lX\n",
+ progname,
+ (*format_ret == GL_RGB ? "RGB" :
+ *format_ret == GL_BGR ? "BGR" :
+ *format_ret == GL_RGBA ? "RGBA" :
+ *format_ret == GL_BGRA ? "BGRA" :
+ *format_ret == GL_ABGR_EXT ? "ABGR_EXT" :
+ "???"),
+ (*type_ret == BYTE ? "BYTE" :
+ *type_ret == BYTE_3_3_2 ? "BYTE_3_3_2" :
+ *type_ret == BYTE_2_3_3_REV ? "BYTE_2_3_3_REV" :
+ *type_ret == INT_8_8_8_8 ? "INT_8_8_8_8" :
+ *type_ret == INT_8_8_8_8_REV ? "INT_8_8_8_8_REV" :
+ *type_ret == INT_10_10_10_2 ? "INT_10_10_10_2" :
+ *type_ret == INT_2_10_10_10_REV ? "INT_2_10_10_10_REV":
+ *type_ret == SHORT_4_4_4_4 ? "SHORT_4_4_4_4" :
+ *type_ret == SHORT_4_4_4_4_REV ? "SHORT_4_4_4_4_REV" :
+ *type_ret == SHORT_5_5_5_1 ? "SHORT_5_5_5_1" :
+ *type_ret == SHORT_1_5_5_5_REV ? "SHORT_1_5_5_5_REV" :
+ *type_ret == SHORT_5_6_5 ? "SHORT_5_6_5" :
+ *type_ret == SHORT_5_6_5_REV ? "SHORT_5_6_5_REV" :
+ "???"),
+ *swap_ret,
+ image->bits_per_pixel,
+ image->red_mask, image->green_mask, image->blue_mask);
+ }
+
+ return;
+ }
+ }
+
+ /* Unknown RGB fields? */
+ abort();
+}
+
+#endif /* ! REFORMAT_IMAGE_DATA */
+
+typedef struct {
+ GLXContext glx_context;
+ Pixmap pixmap;
+ int pix_width, pix_height, pix_depth;
+ int texid;
+ Bool mipmap_p;
+ double load_time;
+
+ /* Used in async mode
+ */
+ void (*callback) (const char *filename, XRectangle *geometry,
+ int iw, int ih, int tw, int th,
+ void *closure);
+ void *closure;
+
+ /* Used in sync mode
+ */
+ char **filename_return;
+ XRectangle *geometry_return;
+ int *image_width_return;
+ int *image_height_return;
+ int *texture_width_return;
+ int *texture_height_return;
+
+} img_closure;
+
+
+/* Returns the current time in seconds as a double.
+ */
+static double
+double_time (void)
+{
+ struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+ struct timezone tzp;
+ gettimeofday(&now, &tzp);
+# else
+ gettimeofday(&now);
+# endif
+
+ return (now.tv_sec + ((double) now.tv_usec * 0.000001));
+}
+
+
+/* Loads the given XImage into GL's texture memory.
+ The image may be of any size.
+ If mipmap_p is true, then make mipmaps instead of just a single texture.
+ Writes to stderr and returns False on error.
+ */
+static Bool
+ximage_to_texture (XImage *ximage,
+ GLint type, GLint format,
+ int *width_return,
+ int *height_return,
+ XRectangle *geometry,
+ Bool mipmap_p)
+{
+ int max_reduction = 7;
+ int err_count = 0;
+ GLenum err = 0;
+ int orig_width = ximage->width;
+ int orig_height = ximage->height;
+ GLsizei tex_width = 0;
+ GLsizei tex_height = 0;
+
+ AGAIN:
+
+ if (mipmap_p)
+ {
+ /* gluBuild2DMipmaps doesn't require textures to be a power of 2. */
+ tex_width = ximage->width;
+ tex_height = ximage->height;
+
+ if (debug_p)
+ fprintf (stderr, "%s: mipmap %d x %d\n",
+ progname, ximage->width, ximage->height);
+
+ gluBuild2DMipmaps (GL_TEXTURE_2D, 3, ximage->width, ximage->height,
+ format, type, ximage->data);
+ err = glGetError();
+ }
+ else
+ {
+ /* glTexImage2D() requires the texture sizes to be powers of 2.
+ So first, create a texture of that size (but don't write any
+ data into it.)
+ */
+ tex_width = (GLsizei) to_pow2 (ximage->width);
+ tex_height = (GLsizei) to_pow2 (ximage->height);
+
+ if (debug_p)
+ fprintf (stderr, "%s: texture %d x %d (%d x %d)\n",
+ progname, ximage->width, ximage->height,
+ tex_width, tex_height);
+
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, tex_width, tex_height, 0,
+ format, type, 0);
+ err = glGetError();
+
+ /* Now load our non-power-of-2 image data into the existing texture. */
+ if (!err)
+ {
+ glTexSubImage2D (GL_TEXTURE_2D, 0, 0, 0,
+ ximage->width, ximage->height,
+ GL_RGBA, GL_UNSIGNED_BYTE, ximage->data);
+ err = glGetError();
+ }
+ }
+
+ if (err)
+ {
+ char buf[100];
+ const char *s = (char *) gluErrorString (err);
+
+ if (!s || !*s)
+ {
+ sprintf (buf, "unknown error %d", (int) err);
+ s = buf;
+ }
+
+ while (glGetError() != GL_NO_ERROR)
+ ; /* clear any lingering errors */
+
+ if (++err_count > max_reduction)
+ {
+ fprintf (stderr,
+ "\n"
+ "%s: %dx%d texture failed, even after reducing to %dx%d:\n"
+ "%s: The error was: \"%s\".\n"
+ "%s: probably this means "
+ "\"your video card is worthless and weak\"?\n\n",
+ progname, orig_width, orig_height,
+ ximage->width, ximage->height,
+ progname, s,
+ progname);
+ return False;
+ }
+ else
+ {
+ if (debug_p)
+ fprintf (stderr, "%s: mipmap error (%dx%d): %s\n",
+ progname, ximage->width, ximage->height, s);
+ halve_image (ximage, geometry);
+ goto AGAIN;
+ }
+ }
+
+ if (width_return) *width_return = tex_width;
+ if (height_return) *height_return = tex_height;
+ return True;
+}
+
+
+static void load_texture_async_cb (Screen *screen,
+ Window window, Drawable drawable,
+ const char *name, XRectangle *geometry,
+ void *closure);
+
+
+/* Grabs an image of the desktop (or another random image file) and
+ loads the image into GL's texture memory.
+ When the callback is called, the image data will have been loaded
+ into texture number `texid' (via glBindTexture.)
+
+ If an error occurred, width/height will be 0.
+ */
+void
+load_texture_async (Screen *screen, Window window,
+ GLXContext glx_context,
+ int desired_width, int desired_height,
+ Bool mipmap_p,
+ GLuint texid,
+ void (*callback) (const char *filename,
+ XRectangle *geometry,
+ int image_width,
+ int image_height,
+ int texture_width,
+ int texture_height,
+ void *closure),
+ void *closure)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ XWindowAttributes xgwa;
+ img_closure *data = (img_closure *) calloc (1, sizeof(*data));
+
+ if (debug_p)
+ data->load_time = double_time();
+
+ data->texid = texid;
+ data->mipmap_p = mipmap_p;
+ data->glx_context = glx_context;
+ data->callback = callback;
+ data->closure = closure;
+
+ XGetWindowAttributes (dpy, window, &xgwa);
+ data->pix_width = xgwa.width;
+ data->pix_height = xgwa.height;
+ data->pix_depth = xgwa.depth;
+
+ /* Allow the pixmap to be larger than the window. Esper wants this. */
+ if (desired_width /* && desired_width < xgwa.width */)
+ data->pix_width = desired_width;
+ if (desired_height /* && desired_height < xgwa.height */)
+ data->pix_height = desired_height;
+
+ data->pixmap = XCreatePixmap (dpy, window, data->pix_width, data->pix_height,
+ data->pix_depth);
+ load_image_async (screen, window, data->pixmap,
+ load_texture_async_cb, data);
+}
+
+
+/* Once we have an XImage, this loads it into GL.
+ This is used in both synchronous and asynchronous mode.
+ */
+static void
+load_texture_async_cb (Screen *screen, Window window, Drawable drawable,
+ const char *name, XRectangle *geometry, void *closure)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ Bool ok;
+ XImage *ximage;
+ GLint type, format;
+ int iw=0, ih=0, tw=0, th=0;
+ double cvt_time=0, tex_time=0, done_time=0;
+ img_closure *data = (img_closure *) closure;
+ /* copy closure data to stack and free the original before running cb */
+ img_closure dd = *data;
+ memset (data, 0, sizeof (*data));
+ free (data);
+ data = 0;
+
+ if (dd.glx_context)
+ glXMakeCurrent (dpy, window, dd.glx_context);
+
+ if (geometry->width <= 0 || geometry->height <= 0)
+ {
+ /* This can happen if an old version of xscreensaver-getimage
+ is installed. Or if we have no image (checkerboard). */
+ geometry->x = 0;
+ geometry->y = 0;
+ geometry->width = dd.pix_width;
+ geometry->height = dd.pix_height;
+ }
+
+ if (geometry->width <= 0 || geometry->height <= 0)
+ abort();
+
+ if (debug_p)
+ cvt_time = double_time();
+
+# ifdef REFORMAT_IMAGE_DATA
+ ximage = pixmap_to_gl_ximage (screen, window, dd.pixmap);
+ format = GL_RGBA;
+ type = GL_UNSIGNED_BYTE;
+
+#else /* ! REFORMAT_IMAGE_DATA */
+ {
+ Visual *visual = DefaultVisualOfScreen (screen);
+ GLint swap;
+
+ ximage = XCreateImage (dpy, visual, dd.pix_depth, ZPixmap, 0, 0,
+ dd.pix_width, dd.pix_height, 32, 0);
+
+ /* Note: height+2 in "to" to be to work around an array bounds overrun
+ in gluBuild2DMipmaps / gluScaleImage. */
+ ximage->data = (char *) calloc (ximage->height+2, ximage->bytes_per_line);
+
+ if (!ximage->data ||
+ !XGetSubImage (dpy, dd.pixmap, 0, 0, ximage->width, ximage->height,
+ ~0L, ximage->format, ximage, 0, 0))
+ {
+ XDestroyImage (ximage);
+ ximage = 0;
+ }
+
+ gl_settings_for_ximage (ximage, &type, &format, &swap);
+ glPixelStorei (GL_UNPACK_SWAP_BYTES, !swap);
+ }
+#endif /* REFORMAT_IMAGE_DATA */
+
+ XFreePixmap (dpy, dd.pixmap);
+ dd.pixmap = 0;
+
+ if (debug_p)
+ tex_time = double_time();
+
+ if (! ximage)
+ ok = False;
+ else
+ {
+ iw = ximage->width;
+ ih = ximage->height;
+ if (dd.texid != -1)
+ glBindTexture (GL_TEXTURE_2D, dd.texid);
+
+ glPixelStorei (GL_UNPACK_ALIGNMENT, ximage->bitmap_pad / 8);
+ ok = ximage_to_texture (ximage, type, format, &tw, &th, geometry,
+ dd.mipmap_p);
+ if (ok)
+ {
+ iw = ximage->width; /* in case the image was shrunk */
+ ih = ximage->height;
+ }
+ }
+
+ if (ximage) XDestroyImage (ximage);
+
+ if (! ok)
+ iw = ih = tw = th = 0;
+
+ if (debug_p)
+ done_time = double_time();
+
+ if (debug_p)
+ fprintf (stderr,
+ /* prints: A + B + C = D
+ A = file I/O time (happens in background)
+ B = time to pull bits from server (this process)
+ C = time to convert bits to GL textures (this process)
+ D = total elapsed time from "want image" to "see image"
+
+ B+C is responsible for any frame-rate glitches.
+ */
+ "%s: loading elapsed: %.2f + %.2f + %.2f = %.2f sec\n",
+ progname,
+ cvt_time - dd.load_time,
+ tex_time - cvt_time,
+ done_time - tex_time,
+ done_time - dd.load_time);
+
+ if (dd.callback)
+ /* asynchronous mode */
+ dd.callback (name, geometry, iw, ih, tw, th, dd.closure);
+ else
+ {
+ /* synchronous mode */
+ if (dd.filename_return) *dd.filename_return = (char *) name;
+ if (dd.geometry_return) *dd.geometry_return = *geometry;
+ if (dd.image_width_return) *dd.image_width_return = iw;
+ if (dd.image_height_return) *dd.image_height_return = ih;
+ if (dd.texture_width_return) *dd.texture_width_return = tw;
+ if (dd.texture_height_return) *dd.texture_height_return = th;
+ }
+}
diff --git a/hacks/glx/grab-ximage.h b/hacks/glx/grab-ximage.h
new file mode 100644
index 0000000..2fd589f
--- /dev/null
+++ b/hacks/glx/grab-ximage.h
@@ -0,0 +1,76 @@
+/* grab-ximage.c --- grab the screen to an XImage for use with OpenGL.
+ * xscreensaver, Copyright (c) 2001-2006 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __GRAB_XIMAGE_H__
+#define __GRAB_XIMAGE_H__
+
+/* Grabs an image of the desktop (or another random image file) and
+ loads the image into GL's texture memory. Most of the work is done
+ in the background; when the image has been loaded, a callback is run.
+
+ As a side-effect, that image *may* be painted onto the given Window.
+
+ If mipmap_p is true, then make mipmaps instead of just a single texture.
+
+ If desired_width/height are non-zero, then (if possible) the image
+ will be scaled to fit in that rectangle. If they are 0, then the size
+ of the window is used. These parameters are so that you can hint to
+ the image loader that smaller images are acceptable (if you will never
+ be displaying the texture at 100% magnification, you can get away with
+ smaller textures.)
+
+ Returns the sizes of various things:
+
+ texture_width/height: The size of the texture itself, in pixels.
+ This will often be larger than the grabbed
+ image, since OpenGL sometimes requires texture
+ dimensions to be a power of 2.
+
+ image_width/height: The size of the image: this will usually be the
+ same as the desired_width/height you passed in
+ (but may be the size of the Window instead.)
+
+ geometry: The position in the texture of the image bits.
+ When image files are loaded, they are scaled up
+ to the size of the window, but if the image does
+ not have the same aspect ratio as the window,
+ there will be black bars on the top/bottom or
+ left/right. This geometry specification tells
+ you where the "real" image bits are.
+
+ So, don't use texture coordinates from 0.0 to 1.0. Instead use:
+
+ [0.0 - iw/tw] If you want to display a quad that is the same
+ [0.0 - ih/th] size as the window; or
+
+ [gx/tw - (gx+gw)/tw] If you want to display a quad that is the same
+ [gy/th - (gy+gh)/th] size as the loaded image file.
+
+ When the callback is called, the image data will have been loaded
+ into texture number `texid' (via glBindTexture.)
+
+ If an error occurred, width/height will be 0.
+ */
+void load_texture_async (Screen *, Window, GLXContext,
+ int desired_width, int desired_height,
+ Bool mipmap_p,
+ GLuint texid,
+ void (*callback) (const char *filename,
+ XRectangle *geometry,
+ int image_width,
+ int image_height,
+ int texture_width,
+ int texture_height,
+ void *closure),
+ void *closure);
+
+#endif /* __GRAB_XIMAGE_H__ */
diff --git a/hacks/glx/hexstrut.c b/hacks/glx/hexstrut.c
new file mode 100644
index 0000000..a547a76
--- /dev/null
+++ b/hacks/glx/hexstrut.c
@@ -0,0 +1,509 @@
+/* hexstrut, Copyright (c) 2016-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*count: 20 \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define release_hexstrut 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "normals.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "True"
+#define DEF_SPEED "1.0"
+#define DEF_THICKNESS "0.2"
+
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+typedef struct { double a, o; } LL; /* latitude + longitude */
+
+typedef struct triangle triangle;
+struct triangle {
+ XYZ p[3];
+ triangle *next;
+ triangle *neighbors[6];
+ GLfloat orot, rot;
+ int delay, odelay;
+ int ccolor;
+};
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ int count;
+ triangle *triangles;
+
+ int ncolors;
+ XColor *colors;
+
+} hexstrut_configuration;
+
+static hexstrut_configuration *bps = NULL;
+
+static Bool do_spin;
+static GLfloat speed;
+static Bool do_wander;
+static GLfloat thickness;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-thickness", ".thickness", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&thickness, "thickness", "Thickness", DEF_THICKNESS, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt hexstrut_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+
+/* Add t1 to the neighbor list of t0. */
+static void
+link_neighbor (triangle *t0, triangle *t1)
+{
+ int k;
+ if (t0 == t1)
+ return;
+ for (k = 0; k < countof(t0->neighbors); k++)
+ {
+ if (t0->neighbors[k] == t1 ||
+ t0->neighbors[k] == 0)
+ {
+ t0->neighbors[k] = t1;
+ return;
+ }
+ }
+ fprintf (stderr, "too many neighbors\n");
+ abort();
+}
+
+
+static void
+make_plane (ModeInfo *mi)
+{
+ hexstrut_configuration *bp = &bps[MI_SCREEN(mi)];
+ int n = MI_COUNT(mi) * 2;
+ GLfloat size = 2.0 / n;
+ int x, y;
+ GLfloat w = size;
+ GLfloat h = size * sqrt(3) / 2;
+ triangle **grid = (triangle **) calloc (n * n, sizeof(*grid));
+
+ for (y = 0; y < n; y++)
+ for (x = 0; x < n; x++)
+ {
+ triangle *t;
+
+ t = (triangle *) calloc (1, sizeof(*t));
+ t->p[0].x = (x - n/2) * w;
+ t->p[0].y = (y - n/2) * h;
+
+ if (y & 1)
+ t->p[0].x += w / 2;
+
+ t->p[1].x = t->p[0].x - w/2;
+ t->p[2].x = t->p[0].x + w/2;
+ t->p[1].y = t->p[0].y + h;
+ t->p[2].y = t->p[0].y + h;
+
+ if (x > 0)
+ {
+ triangle *t2 = grid[y * n + (x-1)];
+ link_neighbor (t, t2);
+ link_neighbor (t2, t);
+ }
+ if (y > 0)
+ {
+ triangle *t2 = grid[(y-1) * n + x];
+ link_neighbor (t, t2);
+ link_neighbor (t2, t);
+
+ if (x < n-1)
+ {
+ t2 = grid[(y-1) * n + (x+1)];
+ link_neighbor (t, t2);
+ link_neighbor (t2, t);
+ }
+ }
+
+ t->next = bp->triangles;
+ bp->triangles = t;
+ grid[y * n + x] = t;
+ bp->count++;
+ }
+
+ free (grid);
+}
+
+
+static void
+tick_triangles (ModeInfo *mi)
+{
+ hexstrut_configuration *bp = &bps[MI_SCREEN(mi)];
+ triangle *t;
+ GLfloat step = 0.01 + (0.04 * speed);
+
+ if (! (random() % 80))
+ {
+ int n = random() % bp->count;
+ int i;
+ for (i = 0, t = bp->triangles; t && i < n; t = t->next, i++)
+ ;
+ if (! t->rot)
+ {
+ t->rot += step * ((random() & 1) ? 1 : -1);
+ t->odelay = t->delay = 4;
+ }
+ }
+
+ for (t = bp->triangles; t; t = t->next)
+ {
+ /* If this triangle is rotating, continue until done. */
+ if (t->rot)
+ {
+ t->rot += step * (t->rot > 0 ? 1 : -1);
+
+ t->ccolor++;
+ if (t->ccolor >= bp->ncolors)
+ t->ccolor = 0;
+
+ if (t->rot > 1 || t->rot < -1)
+ {
+ t->orot += (t->rot > 1 ? 1 : -1);
+ t->rot = 0;
+ }
+ }
+
+ /* If this triangle's propagation delay hasn't hit zero, decrement it.
+ When it does, start its neighbors rotating.
+ */
+ if (t->delay)
+ {
+ int i;
+ t->delay--;
+ if (t->delay == 0)
+ for (i = 0; i < countof(t->neighbors); i++)
+ {
+ if (t->neighbors[i] &&
+ t->neighbors[i]->rot == 0)
+ {
+ t->neighbors[i]->rot += step * (t->rot > 0 ? 1 : -1);
+ t->neighbors[i]->delay =
+ t->neighbors[i]->odelay = t->odelay;
+ }
+ }
+ }
+ }
+}
+
+
+static void
+draw_triangles (ModeInfo *mi)
+{
+ hexstrut_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ triangle *t;
+ GLfloat length = sqrt(3) / 3;
+ GLfloat t2 = length * thickness / 2;
+ GLfloat scale;
+
+ {
+ triangle *t = bp->triangles;
+ GLfloat X = t->p[0].x - t->p[1].x;
+ GLfloat Y = t->p[0].y - t->p[1].y;
+ GLfloat Z = t->p[0].z - t->p[1].z;
+ scale = sqrt(X*X + Y*Y + Z*Z);
+ }
+
+ glFrontFace (GL_CCW);
+
+ glBegin (wire ? GL_LINES : GL_QUADS);
+
+ glNormal3f (0, 0, 1);
+ for (t = bp->triangles; t; t = t->next)
+ {
+ int i;
+ XYZ c;
+ GLfloat color[4];
+
+ GLfloat angle = (M_PI * 2 / 3) * t->rot;
+ GLfloat cr = cos(angle), sr = sin(angle);
+
+ c.x = (t->p[0].x + t->p[1].x + t->p[2].x) / 3;
+ c.y = (t->p[0].y + t->p[1].y + t->p[2].y) / 3;
+ c.z = (t->p[0].z + t->p[1].z + t->p[2].z) / 3;
+
+ /* Actually we don't need normals at all, since no lighting.
+ do_normal (t->p[0].x, t->p[0].y, t->p[0].z,
+ t->p[1].x, t->p[1].y, t->p[1].z,
+ t->p[2].x, t->p[2].y, t->p[2].z);
+ */
+
+ color[0] = bp->colors[t->ccolor].red / 65535.0;
+ color[1] = bp->colors[t->ccolor].green / 65535.0;
+ color[2] = bp->colors[t->ccolor].blue / 65535.0;
+ color[3] = 1;
+
+ /* Brighter */
+ color[0] = color[0] * 0.75 + 0.25;
+ color[1] = color[1] * 0.75 + 0.25;
+ color[2] = color[2] * 0.75 + 0.25;
+
+ glColor4fv (color);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+
+ for (i = 0; i < 3; i++)
+ {
+ /* Orient to direction of corner. */
+ GLfloat x = t->p[i].x - c.x;
+ GLfloat y = t->p[i].y - c.y;
+ GLfloat z = t->p[i].z - c.z;
+
+ GLfloat smc = sr * y - cr * x;
+ GLfloat spc = cr * y + sr * x;
+
+ GLfloat st2 = t2 * scale / sqrt(x*x + y*y);
+ GLfloat slength = length * scale / sqrt(x*x + y*y + z*z);
+
+ GLfloat xt2 = spc * st2;
+ GLfloat yt2 = smc * st2;
+ GLfloat xlength = c.x - slength * smc;
+ GLfloat ylength = c.y + slength * spc;
+ GLfloat zlength = c.z + slength * z;
+
+ if (! wire)
+ glVertex3f (c.x - xt2, c.y - yt2, c.z);
+
+ glVertex3f (c.x + xt2, c.y + yt2, c.z);
+ if (wire)
+ glVertex3f (xlength + xt2, ylength + yt2, zlength);
+
+ if (! wire)
+ glVertex3f (xlength + xt2, ylength + yt2, zlength);
+
+ glVertex3f (xlength - xt2, ylength - yt2, zlength);
+
+ if (wire)
+ glVertex3f (c.x - xt2, c.y - yt2, c.z);
+
+ mi->polygon_count++;
+ }
+ }
+
+ glEnd();
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_hexstrut (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 3) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+hexstrut_handle_event (ModeInfo *mi, XEvent *event)
+{
+ hexstrut_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == ' ' || c == '\t')
+ {
+ bp->ncolors = 64;
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_hexstrut (ModeInfo *mi)
+{
+ hexstrut_configuration *bp;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_hexstrut (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ {
+ double spin_speed = 0.002;
+ double wander_speed = 0.003;
+ double spin_accel = 1.0;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ False);
+ bp->trackball = gltrackball_init (True);
+ }
+
+
+ /* Let's tilt the scene a little. */
+ gltrackball_reset (bp->trackball,
+ -0.4 + frand(0.8),
+ -0.4 + frand(0.8));
+
+ if (thickness < 0.05) thickness = 0.05;
+ if (thickness < 0.05) MI_IS_WIREFRAME(mi) = True;
+ if (thickness > 1.7) thickness = 1.7;
+ if (speed > 2) speed = 2;
+
+ bp->ncolors = 64;
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+
+ make_plane (mi);
+}
+
+
+ENTRYPOINT void
+draw_hexstrut (ModeInfo *mi)
+{
+ hexstrut_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glShadeModel(GL_SMOOTH);
+
+ glDisable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glDisable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 6,
+ (y - 0.5) * 6,
+ (z - 0.5) * 12);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ mi->polygon_count = 0;
+
+ glScalef (30, 30, 30);
+
+ if (! bp->button_down_p)
+ tick_triangles (mi);
+ draw_triangles (mi);
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+
+ENTRYPOINT void
+free_hexstrut (ModeInfo *mi)
+{
+ hexstrut_configuration *bp = &bps[MI_SCREEN(mi)];
+ while (bp->triangles)
+ {
+ triangle *t = bp->triangles->next;
+ free (bp->triangles);
+ bp->triangles = t;
+ }
+}
+
+XSCREENSAVER_MODULE ("Hexstrut", hexstrut)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/hexstrut.man b/hacks/glx/hexstrut.man
new file mode 100644
index 0000000..19e49e0
--- /dev/null
+++ b/hacks/glx/hexstrut.man
@@ -0,0 +1,77 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+hexstrut - a grid of hexagons composed of rotating Y-shaped struts.
+.SH SYNOPSIS
+.B hexstrut
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-count \fInumber\fP]
+[\-thickness \fInumber\fP]
+[\-no-wander]
+[\-no-spin]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+A grid of hexagons composed of rotating Y-shaped struts.
+Waves of rotation and color changes randomly propagate across the plane.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-count \fInumber\fP
+Approximate number of hexagons on the screen, horizontally. Default: 20.
+.TP 8
+.B \-thickness \fInumber\fP
+Relative thickness of the struts. 0.01 - 1.7. Default: 0.2.
+.TP 8
+.B \-wander | \-no-wander
+Whether the grid should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the grid should spin.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2016 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/hilbert.c b/hacks/glx/hilbert.c
new file mode 100644
index 0000000..dbb2ce6
--- /dev/null
+++ b/hacks/glx/hilbert.c
@@ -0,0 +1,1144 @@
+/* hilbert, Copyright (c) 2011-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * 2D and 3D Hilbert space-filling curves.
+ *
+ * Inspired by "Visualizing Hilbert Curves" by Nelson Max, 1998:
+ * https://e-reports-ext.llnl.gov/pdf/234149.pdf
+ */
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 30 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*geometry: 800x800\n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_hilbert 0
+# define release_hilbert 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "sphere.h"
+#include "tube.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SPIN "True"
+#define DEF_WANDER "False"
+#define DEF_SPEED "1.0"
+#define DEF_MODE "random"
+#define DEF_ENDS "random"
+#define DEF_MAX_DEPTH "5"
+#define DEF_THICKNESS "0.25"
+
+#define PAUSE_TICKS 180
+
+typedef struct {
+ double x,y,z;
+} XYZ;
+
+typedef struct {
+ unsigned short x,y,z;
+} XYZb;
+
+typedef struct {
+ int size;
+ XYZb *values; /* assume max depth of 20 (2^16 on each side) */
+} hilbert_cache;
+
+
+static int dlist_faces[] = { 20, 10, 8, 4, 3 };
+
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot, *rot2;
+ trackball_state *trackball;
+ Bool button_down_p;
+ Bool twodee_p;
+ Bool closed_p;
+ int ncolors;
+ XColor *colors;
+
+ int depth;
+ int depth_tick;
+
+ GLfloat path_start, path_end;
+ int path_tick;
+ int pause;
+ GLfloat diam;
+
+ hilbert_cache **caches; /* filled lazily */
+
+ GLuint dlists [40][2]; /* we don't actually alloc all of these */
+ int dlist_polys [40][2];
+
+} hilbert_configuration;
+
+static hilbert_configuration *bps = NULL;
+
+static Bool do_spin;
+static GLfloat speed;
+static Bool do_wander;
+static char *mode_str;
+static char *ends_str;
+static int max_depth;
+static GLfloat thickness;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionNoArg, "True" },
+ { "+spin", ".spin", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-mode", ".mode", XrmoptionSepArg, 0 },
+ { "-2d", ".mode", XrmoptionNoArg, "2D" },
+ { "-3d", ".mode", XrmoptionNoArg, "3D" },
+ { "-ends", ".ends", XrmoptionSepArg, 0 },
+ { "-closed", ".ends", XrmoptionNoArg, "closed" },
+ { "-open", ".ends", XrmoptionNoArg, "open" },
+ { "-max-depth", ".maxDepth", XrmoptionSepArg, 0 },
+ { "-thickness", ".thickness",XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&mode_str, "mode", "Mode", DEF_MODE, t_String},
+ {&ends_str, "ends", "Ends", DEF_ENDS, t_String},
+ {&max_depth, "maxDepth", "MaxDepth", DEF_MAX_DEPTH, t_Int},
+ {&thickness, "thickness","Thickness",DEF_THICKNESS, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt hilbert_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* 2D Hilbert, and closed-loop variant.
+ */
+
+/* These arrays specify which bits of the T index contribute to the
+ X, Y and Z values. Higher order bits are defined recursively.
+ */
+static const int xbit2d[4] = { 0, 0, 1, 1 };
+static const int ybit2d[4] = { 0, 1, 1, 0 };
+
+static const int xbit3d[8] = { 0,0,0,0,1,1,1,1 };
+static const int ybit3d[8] = { 0,1,1,0,0,1,1,0 };
+static const int zbit3d[8] = { 0,0,1,1,1,1,0,0 };
+
+/* These matrixes encapsulate the necessary reflection and translation
+ of each 4 sub-squares or 8 sub-cubes. The r2d and r3d arrays are
+ the normal Hilbert descent, and the s2d and s3d arrays are the
+ modified curve used for only level 0 of a closed-form path.
+ */
+
+static int r2d[4][2][2] = {
+ /* _ _
+ | |..| |
+ :_ _:
+ _| |_
+
+ */
+ {{ 0, 1},
+ { 1, 0}},
+ {{ 1, 0},
+ { 0, 1}},
+ {{ 1, 0},
+ { 0, 1}},
+ {{ 0,-1},
+ {-1, 0}},
+};
+
+static int s2d[4][2][2] = {
+ /* __ __
+ | |..| | Used for outermost iteration only, in "closed" mode
+ : .. :
+ |__| |__|
+
+ */
+ {{-1, 0},
+ { 0,-1}},
+ {{ 1, 0},
+ { 0, 1}},
+ {{ 1, 0},
+ { 0, 1}},
+ {{-1, 0},
+ { 0,-1}},
+};
+
+
+static int r3d[8][3][3] = {
+ /*
+ /| /|
+ / | / |
+ /__|____/ |
+ | |
+ / /
+ / /
+ */
+ {{ 0, 1, 0},
+ { 1, 0, 0},
+ { 0, 0, 1}},
+ {{ 0, 0, 1},
+ { 0, 1, 0},
+ { 1, 0, 0}},
+ {{ 1, 0, 0},
+ { 0, 1, 0},
+ { 0, 0, 1}},
+ {{ 0, 0,-1},
+ {-1, 0, 0},
+ { 0, 1, 0}},
+ {{ 0, 0, 1},
+ { 1, 0, 0},
+ { 0, 1, 0}},
+ {{ 1, 0, 0},
+ { 0, 1, 0},
+ { 0, 0, 1}},
+ {{ 0, 0,-1},
+ { 0, 1, 0},
+ {-1, 0, 0}},
+ {{ 0,-1, 0},
+ {-1, 0, 0},
+ { 0, 0, 1}},
+};
+
+
+static int s3d[8][3][3] = {
+ /*
+ /| /| Used for outermost iteration only, in "closed" mode
+ / | / |
+ /__|____/ |
+ | |
+ / /
+ /_______/
+ */
+ {{-1, 0, 0},
+ { 0, 0,-1},
+ { 0, 1, 0}},
+ {{ 0, 0, 1},
+ { 0, 1, 0},
+ { 1, 0, 0}},
+ {{ 1, 0, 0},
+ { 0, 1, 0},
+ { 0, 0, 1}},
+ {{ 0, 0,-1},
+ {-1, 0, 0},
+ { 0, 1, 0}},
+ {{ 0, 0, 1},
+ { 1, 0, 0},
+ { 0, 1, 0}},
+ {{ 1, 0, 0},
+ { 0, 1, 0},
+ { 0, 0, 1}},
+ {{ 0, 0,-1},
+ { 0, 1, 0},
+ {-1, 0, 0}},
+
+ {{-1, 0, 0},
+ { 0, 0,-1},
+ { 0, 1, 0}},
+};
+
+
+
+/* Matrix utilities
+ */
+
+static void
+matrix_times_vector2d (int m[2][2], int v[2], int dest[2])
+{
+ dest[0] = m[0][0]*v[0] + m[0][1]*v[1];
+ dest[1] = m[1][0]*v[0] + m[1][1]*v[1];
+}
+
+static void
+matrix_times_vector3d (int m[3][3], int v[3], int dest[3])
+{
+ dest[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2];
+ dest[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2];
+ dest[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2];
+}
+
+
+static void
+matrix_multiply2d (int m1[2][2], int m2[2][2], int dest[2][2])
+{
+ dest[0][0] = m1[0][0] * m2[0][0] + m1[0][1] * m2[1][0];
+ dest[0][1] = m1[0][0] * m2[0][1] + m1[0][1] * m2[1][1];
+ dest[1][0] = m1[1][0] * m2[0][0] + m1[1][1] * m2[1][0];
+ dest[1][1] = m1[1][0] * m2[0][1] + m1[1][1] * m2[1][1];
+}
+
+static void
+matrix_multiply3d (int m1[3][3], int m2[3][3], int dest[3][3])
+{
+ int i, j, k;
+ for (i = 0; i < 3; i++)
+ for (j = 0; j < 3; j++)
+ {
+ dest[i][j] = 0;
+ for (k = 0; k < 3; k++)
+ dest[i][j] += m1[i][k] * m2[k][j];
+ }
+}
+
+static void
+identity_matrix2d (int m[2][2])
+{
+ m[0][0] = m[1][1] = 1;
+ m[0][1] = m[1][0] = 0;
+}
+
+static void
+identity_matrix3d (int m[3][3])
+{
+ m[0][0] = m[1][1] = m[2][2] = 1;
+ m[0][1] = m[0][2] = m[1][0] = m[1][2] = m[2][0] = m[2][1] = 0;
+}
+
+
+static void
+matrix_copy2d (int src[2][2], int dest[2][2])
+{
+ int i, j;
+ for (i = 0; i < 2; i++)
+ for (j = 0; j < 2; j++)
+ dest[i][j] = src[i][j];
+}
+
+
+static void
+matrix_copy3d (int src[3][3], int dest[3][3])
+{
+ int i, j;
+ for (i = 0; i < 3; i++)
+ for (j = 0; j < 3; j++)
+ dest[i][j] = src[i][j];
+}
+
+
+/* 2D and 3D Hilbert:
+ Given an index T along the curve, return the XY or XYZ coordinates.
+ N is depth of the curve.
+ */
+
+static void
+t_to_xy (int n, int t, int *x, int *y, Bool closed_p)
+{
+ int k, rt[2][2], rq[2][2], va[2], vb[2];
+ identity_matrix2d(rt);
+ *x = *y = 0;
+
+ for (k = n-1; k >= 0; k--)
+ {
+ int j = 3 & (t >> (2*k));
+ va[0] = 2 * xbit2d[j] - 1;
+ va[1] = 2 * ybit2d[j] - 1;
+ matrix_times_vector2d (rt, va, vb);
+ *x += ((vb[0] + 1) / 2) << k;
+ *y += ((vb[1] + 1) / 2) << k;
+ if (k > 0)
+ {
+ matrix_copy2d (rt, rq);
+ if (k == n-1 && closed_p)
+ matrix_multiply2d (rq, s2d[j], rt);
+ else
+ matrix_multiply2d (rq, r2d[j], rt);
+ }
+ }
+}
+
+
+static void
+t_to_xyz (int n, int t, int *x, int *y, int *z, Bool closed_p)
+{
+ int k, rt[3][3], rq[3][3], va[3], vb[3];
+ identity_matrix3d(rt);
+ *x = *y = *z = 0;
+
+ for (k = n-1; k >= 0; k--)
+ {
+ int j = 7 & (t >> (3*k));
+ va[0] = 2 * xbit3d[j] - 1;
+ va[1] = 2 * ybit3d[j] - 1;
+ va[2] = 2 * zbit3d[j] - 1;
+ matrix_times_vector3d (rt, va, vb);
+ *x += ((vb[0] + 1) / 2) << k;
+ *y += ((vb[1] + 1) / 2) << k;
+ *z += ((vb[2] + 1) / 2) << k;
+ if (k > 0)
+ {
+ matrix_copy3d (rt, rq);
+ if (k == n-1 && closed_p)
+ matrix_multiply3d (rq, s3d[j], rt);
+ else
+ matrix_multiply3d (rq, r3d[j], rt);
+ }
+ }
+}
+
+
+/* Rendering the curve
+ */
+
+
+/* Draw a sphere at the intersection of two tubes, to round off
+ the connection between them. Use one of our cache display lists
+ of unit spheres in various sizes.
+ */
+static int
+draw_joint (ModeInfo *mi, XYZ p, GLfloat diam, int faces, int wire)
+{
+ hilbert_configuration *bp = &bps[MI_SCREEN(mi)];
+ int i;
+ diam *= 0.99; /* try to clean up the edges a bit */
+
+ if (faces <= 4) return 0; /* too small to see */
+
+ glPushMatrix();
+ glTranslatef (p.x, p.y, p.z);
+ glScalef (diam, diam, diam);
+
+ /* i = unit_sphere (faces, faces, wire);*/
+
+ /* if (!bp->dlists[faces][0]) abort(); */
+ /* if (!bp->dlist_polys[faces][0]) abort(); */
+
+ glCallList (bp->dlists[faces][0]);
+ i = bp->dlist_polys[faces][0];
+ glPopMatrix();
+ return i;
+}
+
+
+/* Draw a tube, and associated end caps. Use one of our cache display lists
+ of unit tubes in various sizes. Pick the resolution of the tube based
+ on how large it's being drawn. It's ok to get chunkier if the thing is
+ only a few pixels wide on the screen.
+ */
+static Bool
+draw_segment (ModeInfo *mi,
+ XYZ p0, XYZ p1, /* from, to */
+ int t, int end_t, /* value and range */
+ GLfloat path_start, GLfloat path_end, /* clipping */
+ Bool head_cap_p,
+ int *last_colorP)
+{
+ hilbert_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ double t0 = (double) (t-1) / end_t; /* ratio of p[01] along curve */
+ double t1 = (double) t / end_t;
+
+ int wire = MI_IS_WIREFRAME(mi);
+ int owire = wire;
+ GLfloat dd = bp->diam;
+ int faces;
+
+ if (path_start >= t1) /* whole segment is before clipping region */
+ return False;
+ if (path_end < t0) /* whole segment is after clipping region */
+ return False;
+
+
+ if (bp->twodee_p) dd *= 2; /* more polys in 2D mode */
+
+ faces = (dd > 0.040 ? dlist_faces[0] :
+ dd > 0.020 ? dlist_faces[1] :
+ dd > 0.010 ? dlist_faces[2] :
+ dd > 0.005 ? dlist_faces[3] :
+ dd > 0.002 ? dlist_faces[4] :
+ 1);
+
+ /* In 2d mode, we can drop into wireframe mode and it still looks ok... */
+ if (faces == 1)
+ {
+ if (bp->twodee_p)
+ wire = True;
+ else
+ faces = 3;
+ }
+
+ if (wire && !owire)
+ {
+ glDisable (GL_DEPTH_TEST);
+ glDisable (GL_CULL_FACE);
+ glDisable (GL_LIGHTING);
+ }
+
+ if (t0 < path_start)
+ {
+ XYZ p;
+ GLfloat seg_range = t1 - t0;
+ GLfloat clip_range = path_start - t0;
+ GLfloat ratio = clip_range / seg_range;
+ p.x = p0.x + ((p1.x - p0.x) * ratio);
+ p.y = p0.y + ((p1.y - p0.y) * ratio);
+ p.z = p0.z + ((p1.z - p0.z) * ratio);
+ p0 = p;
+ }
+
+ if (t1 > path_end)
+ {
+ XYZ p;
+ GLfloat seg_range = t1 - t0;
+ GLfloat clip_range = path_end - t0;
+ GLfloat ratio = clip_range / seg_range;
+ p.x = p0.x + ((p1.x - p0.x) * ratio);
+ p.y = p0.y + ((p1.y - p0.y) * ratio);
+ p.z = p0.z + ((p1.z - p0.z) * ratio);
+ p1 = p;
+ }
+
+ if (p0.x == p1.x &&
+ p0.y == p1.y &&
+ p0.z == p1.z)
+ return False;
+
+ {
+ int segs = bp->ncolors * (t1 - t0);
+ int i;
+ XYZ p0b, p1b;
+
+ if (segs < 1) segs = 1;
+
+ for (i = 0; i < segs; i++)
+ {
+ int j = i + 1;
+ GLfloat color[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat t0b;
+ int c;
+
+ p0b.x = p0.x + i * ((p1.x - p0.x) / segs);
+ p0b.y = p0.y + i * ((p1.y - p0.y) / segs);
+ p0b.z = p0.z + i * ((p1.z - p0.z) / segs);
+
+ p1b.x = p0.x + j * ((p1.x - p0.x) / segs);
+ p1b.y = p0.y + j * ((p1.y - p0.y) / segs);
+ p1b.z = p0.z + j * ((p1.z - p0.z) / segs);
+
+
+
+ /* #### this isn't quite right */
+ t0b = t0 + i * (t1 - t0) / segs;
+
+ c = bp->ncolors * t0b;
+ if (c >= bp->ncolors) c = bp->ncolors-1;
+
+ /* Above depth 6, was spending 5% of the time in glMateralfv,
+ so only set the color if it's different. */
+
+ if (c != *last_colorP)
+ {
+ color[0] = bp->colors[c].red / 65536.0;
+ color[1] = bp->colors[c].green / 65536.0;
+ color[2] = bp->colors[c].blue / 65536.0;
+ if (wire)
+ glColor3fv (color);
+ else
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+ *last_colorP = c;
+ }
+
+
+ if (wire)
+ {
+ glBegin (GL_LINES);
+ glVertex3f (p0b.x, p0b.y, p0b.z);
+ glVertex3f (p1b.x, p1b.y, p1b.z);
+ glEnd ();
+ mi->polygon_count++;
+ }
+ else
+ {
+ /* mi->polygon_count += tube (p0b.x, p0b.y, p0b.z,
+ p1b.x, p1b.y, p1b.z,
+ bp->diam, 0, faces, True,
+ 0, wire);
+ */
+
+ /* Render a rotated and scaled prefab unit tube.
+
+ There's probably a slightly more concise way to do this,
+ but since they're all at right angles at least we don't
+ have to use atan().
+ */
+ GLfloat s;
+ glPushMatrix();
+ glTranslatef (p0b.x, p0b.y, p0b.z);
+
+ if (p1b.x > p0b.x)
+ {
+ s = p1b.x - p0b.x;
+ }
+ else if (p1b.x < p0b.x)
+ {
+ glRotatef (180, 0, 0, 1);
+ s = p0b.x - p1b.x;
+ }
+ else if (p1b.y > p0b.y) {
+ glRotatef (90, 0, 0, 1);
+ s = p1b.y - p0b.y;
+ }
+ else if (p1b.y < p0b.y)
+ {
+ glRotatef (-90, 0, 0, 1);
+ s = p0b.y - p1b.y;
+ }
+ else if (p1b.z > p0b.z)
+ {
+ glRotatef (-90, 0, 1, 0);
+ s = p1b.z - p0b.z;
+ }
+ else /* (p1b.z < p0b.z) */
+ {
+ glRotatef (90, 0, 1, 0);
+ s = p0b.z - p1b.z;
+ }
+
+ glScalef (s, bp->diam, bp->diam);
+ glCallList (bp->dlists[faces][1]);
+ mi->polygon_count += bp->dlist_polys[faces][1];
+ glPopMatrix();
+
+
+ /* If this is the bleeding edge, cap it too. */
+ if (head_cap_p) {
+ mi->polygon_count += draw_joint (mi, p0b, bp->diam, faces, wire);
+ head_cap_p = False;
+ }
+ }
+ }
+
+ /* If the path is closed, close it. This segment doesn't animate
+ like the others, but, oh well.
+ */
+ if (! wire)
+ mi->polygon_count += draw_joint (mi, p1b, bp->diam, faces, wire);
+ }
+
+ return True;
+}
+
+
+static void
+mem(void)
+{
+ fprintf (stderr, "%s: out of memory\n", progname);
+ exit (1);
+}
+
+
+/* Render the whole thing, but omit segments that lie outside of
+ the path_start and path_end ratios.
+ */
+static void
+hilbert (ModeInfo *mi, int size, GLfloat path_start, GLfloat path_end)
+{
+ hilbert_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+
+ GLfloat w = pow(2, size);
+ int end_t = (bp->twodee_p ? w * w : w * w * w);
+
+ XYZ prev = { 0, };
+ XYZ first = { 0, };
+ Bool first_p = False;
+ Bool any_p = False;
+ int t;
+ Bool fill_cache_p = False;
+ hilbert_cache *cc;
+ int last_color = -1;
+
+ /* Do this here since at higher resolutions, we turn wireframe on
+ and off. */
+
+ if (! wire)
+ {
+ glEnable (GL_NORMALIZE);
+ glEnable (GL_DEPTH_TEST);
+ glEnable (GL_CULL_FACE);
+ glEnable (GL_LIGHTING);
+ glEnable (GL_POLYGON_OFFSET_FILL);
+ }
+
+
+ if (!bp->caches)
+ {
+ bp->caches = (hilbert_cache **)
+ calloc (max_depth + 2, sizeof (*bp->caches));
+ if (!bp->caches) mem();
+ fill_cache_p = True;
+ }
+
+ cc = bp->caches[size];
+ if (! cc)
+ {
+ cc = (hilbert_cache *) calloc (1, sizeof (*cc));
+ cc->values = (XYZb *) calloc (end_t + 1, sizeof (*cc->values));
+ if (!cc->values) mem();
+ cc->size = end_t;
+ bp->caches[size] = cc;
+ fill_cache_p = True;
+ }
+
+ for (t = 0; t < end_t; t++)
+ {
+ int x, y, z;
+ XYZ c;
+ XYZb *cb;
+
+ if (!fill_cache_p)
+ {
+ cb = &cc->values[t];
+ x = cb->x;
+ y = cb->y;
+ z = cb->z;
+ }
+ else
+ {
+ if (!bp->twodee_p)
+ t_to_xyz (size, t, &x, &y, &z, bp->closed_p);
+ else
+ {
+ t_to_xy (size, t, &x, &y, bp->closed_p);
+ z = w/2;
+ }
+ cb = &cc->values[t];
+ cb->x = x;
+ cb->y = y;
+ cb->z = z;
+ }
+
+ c.x = (GLfloat) x / w - 0.5;
+ c.y = (GLfloat) y / w - 0.5;
+ c.z = (GLfloat) z / w - 0.5;
+
+ /* #### We could save some polygons by not drawing the spheres
+ between colinear segments. */
+
+ if (t > 0) {
+ if (draw_segment (mi, prev, c, t, end_t, path_start, path_end, !any_p,
+ &last_color))
+ any_p = True;
+ }
+ prev = c;
+ if (! first_p) {
+ first = c;
+ first_p = True;
+ }
+ }
+
+ if (bp->closed_p && path_end >= 1.0) {
+ draw_segment (mi, prev, first, t, end_t, path_start, path_end, !any_p,
+ &last_color);
+ }
+}
+
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_hilbert (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+hilbert_handle_event (ModeInfo *mi, XEvent *event)
+{
+ hilbert_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == '+' || c == '=' ||
+ keysym == XK_Up || keysym == XK_Right || keysym == XK_Next)
+ {
+ bp->depth++;
+ if (bp->depth > max_depth) bp->depth = max_depth;
+ return True;
+ }
+ else if (c == '-' || c == '_' ||
+ keysym == XK_Down || keysym == XK_Left || keysym == XK_Prior)
+ {
+ bp->depth--;
+ if (bp->depth < 1) bp->depth = 1;
+ return True;
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ bp->depth += bp->depth_tick;
+ if (bp->depth > max_depth-1)
+ {
+ bp->depth = max_depth;
+ bp->depth_tick = -1;
+ }
+ else if (bp->depth <= 1)
+ {
+ bp->depth = 1;
+ bp->depth_tick = 1;
+ }
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_hilbert (ModeInfo *mi)
+{
+ hilbert_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->depth = 2;
+ bp->depth_tick = 1;
+ bp->path_start = 0.0;
+ bp->path_end = 0.0;
+ bp->path_tick = 1;
+
+ if (thickness < 0.01) thickness = 0.01;
+ if (thickness > 1.0) thickness = 1.0;
+
+ if (speed <= 0) speed = 0.0001;
+ if (max_depth < 2) max_depth = 2;
+ if (max_depth > 20) max_depth = 20; /* hard limit due to hilbert_cache */
+
+ if (bp->depth > max_depth-1) bp->depth = max_depth-1;
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_hilbert (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glEnable (GL_LIGHTING);
+ glEnable (GL_LIGHT0);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ {
+ double spin_speed = 0.04;
+ double tilt_speed = spin_speed / 10;
+ double wander_speed = 0.008;
+ double spin_accel = 0.01;
+
+ bp->rot = make_rotator (do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ do_spin ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ do_spin);
+ bp->rot2 = make_rotator (0, 0, 0, 0, tilt_speed, True);
+ bp->trackball = gltrackball_init (True);
+ }
+
+ if (mode_str && !strcasecmp(mode_str, "2d"))
+ bp->twodee_p = True;
+ else if (mode_str && (!strcasecmp(mode_str, "3d")))
+ bp->twodee_p = False;
+ else
+ {
+ if (! (mode_str && !strcasecmp(mode_str, "random")))
+ fprintf (stderr, "%s: 'mode' must be '2d', '3d', or 'random'\n",
+ progname);
+ bp->twodee_p = ((random() % 3) == 0);
+ }
+
+
+ if (ends_str && (!strcasecmp(ends_str, "closed")))
+ bp->closed_p = True;
+ else if (ends_str && (!strcasecmp(ends_str, "open")))
+ bp->closed_p = False;
+ else
+ {
+ if (! (ends_str && !strcasecmp(ends_str, "random")))
+ fprintf (stderr, "%s: 'ends' must be 'open', 'closed', or 'random'\n",
+ progname);
+ bp->closed_p = ((random() % 3) != 0);
+ }
+
+
+ /* More colors results in more polygons (more tube segments) so keeping
+ this small is worthwhile. */
+ bp->ncolors = (bp->twodee_p ? 1024 : 128);
+
+ if (bp->closed_p)
+ {
+ /* Since the path is closed, colors must also be a closed loop */
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+ }
+ else
+ {
+ /* Since the path is open, first and last colors should differ. */
+ bp->ncolors *= 2;
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_uniform_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+ bp->ncolors /= 2;
+ }
+
+ /* Generate display lists for several different resolutions of
+ a unit tube and a unit sphere.
+ */
+ for (i = 0; i < countof(dlist_faces); i++)
+ {
+ int faces = dlist_faces[i];
+ bp->dlists[faces][0] = glGenLists (1);
+
+ glNewList (bp->dlists[faces][0], GL_COMPILE);
+ bp->dlist_polys[faces][0] = unit_sphere (faces, faces, wire);
+ glEndList ();
+
+ bp->dlists[faces][1] = glGenLists (1);
+
+ glNewList (bp->dlists[faces][1], GL_COMPILE);
+ bp->dlist_polys[faces][1] =
+ tube (0, 0, 0, 1, 0, 0,
+ 1, 0, faces, True, 0, wire);
+ glEndList ();
+ }
+}
+
+
+ENTRYPOINT void
+draw_hilbert (ModeInfo *mi)
+{
+ hilbert_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int wire = MI_IS_WIREFRAME(mi);
+
+ static const GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
+ static const GLfloat bshiny = 128.0;
+ GLfloat bcolor[4] = {1.0, 1.0, 1.0, 1.0};
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glShadeModel(GL_SMOOTH);
+
+ if (! wire)
+ {
+ glEnable (GL_NORMALIZE);
+ glEnable (GL_DEPTH_TEST);
+ glEnable (GL_CULL_FACE);
+ glEnable (GL_LIGHTING);
+ glEnable (GL_LIGHT0);
+ glEnable (GL_POLYGON_OFFSET_FILL);
+ }
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ glScalef(1.1, 1.1, 1.1);
+
+ {
+ double x, y, z, z2;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 8,
+ (z - 0.5) * 15);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+
+ if (bp->twodee_p && do_spin) /* face front */
+ {
+ double max = 70;
+ get_position (bp->rot2, &x, &y, &z2, !bp->button_down_p);
+ glRotatef (max/2 - x*max, 1, 0, 0);
+ glRotatef (max/2 - y*max, 0, 1, 0);
+ glRotatef (z * 360, 0, 0, 1); /* but upside down is ok */
+ }
+ else
+ {
+ glRotatef (x * 360, 1, 0, 0);
+ glRotatef (y * 360, 0, 1, 0);
+ glRotatef (z * 360, 0, 0, 1);
+ }
+ }
+
+ mi->polygon_count = 0;
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, bspec);
+ glMateriali (GL_FRONT, GL_SHININESS, bshiny);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bcolor);
+
+ glScalef (8,8,8);
+ glTranslatef (0.1, 0.1, 0);
+
+ if (!do_spin && !bp->twodee_p)
+ {
+ /* tilt the cube a little, and make the start and end visible */
+ glTranslatef (-0.1, 0, 0);
+ glRotatef (140, 0, 1, 0);
+ glRotatef (30, 1, 0, 0);
+ }
+
+ if (wire)
+ glLineWidth (bp->depth > 4 ? 1.0 :
+ bp->depth > 3 ? 2.0 :
+ 3.0);
+
+ if (bp->path_tick > 0) /* advancing the end point, [0 - N) */
+ { /* drawing 1 partial path, 1st time only. */
+
+ if (!bp->button_down_p)
+ bp->path_end += 0.01 * speed;
+
+ if (bp->path_end >= 1.0)
+ {
+ bp->path_start = 0.0;
+ bp->path_end = 1.0;
+ bp->path_tick = -1;
+ bp->pause = PAUSE_TICKS;
+ }
+
+ bp->diam = thickness / pow (2, bp->depth);
+ hilbert (mi, bp->depth, bp->path_start, bp->path_end);
+ mi->recursion_depth = bp->depth + bp->path_start;
+ }
+
+ else /* advancing the start point, (N - 1] */
+ { /* drawing 2 paths at different rez. */
+ if (bp->pause)
+ {
+ bp->pause--;
+ }
+ else
+ {
+ if (!bp->button_down_p)
+ bp->path_start += 0.01 * speed;
+
+ if (bp->path_start > 1.0)
+ {
+ bp->path_start = 0.0;
+ bp->depth += bp->depth_tick;
+ bp->pause = PAUSE_TICKS;
+ if (bp->depth > max_depth-1)
+ {
+ bp->depth = max_depth;
+ bp->depth_tick = -1;
+ }
+ else if (bp->depth <= 1)
+ {
+ bp->depth = 1;
+ bp->depth_tick = 1;
+ }
+ }
+ }
+
+ {
+ GLfloat d1 = thickness / pow (2, bp->depth);
+ GLfloat d2 = thickness / pow (2, bp->depth + bp->depth_tick);
+ bp->diam = (d1 * (1 - bp->path_start) +
+ d2 * bp->path_start);
+ }
+
+ /* First time around, start is 0, and end animates forward.
+ Then, to display the next higher resolution, we render
+ depth=N while increasing start and leaving end=1.0;
+ and simultaneously animationg depth=N+1 with start=0 and
+ end increasing by the same amount.
+
+ The two paths aren't actually connected together at the
+ resolution-change interface, and sometimes they overlap,
+ but things go fast enough that it's hard to spot those
+ glitches, so it looks ok.
+ */
+ glPolygonOffset (0, 0);
+ hilbert (mi, bp->depth, bp->path_start, bp->path_end);
+
+ glPolygonOffset (1.0, 1.0);
+ hilbert (mi, bp->depth + bp->depth_tick, 0.0, bp->path_start);
+
+ mi->recursion_depth = bp->depth + (bp->depth_tick * bp->path_start);
+ }
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE ("Hilbert", hilbert)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/hilbert.man b/hacks/glx/hilbert.man
new file mode 100644
index 0000000..8693dce
--- /dev/null
+++ b/hacks/glx/hilbert.man
@@ -0,0 +1,103 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+hilbert - 3D Hilbert fractal.
+.SH SYNOPSIS
+.B hilbert
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fIratio\fP]
+[\-depth \fInumber\fP]
+[\-spin]
+[\-wander]
+[\-2d]
+[\-3d]
+[\-closed]
+[\-open]
+[\-max\-depth \fInumber\fP]
+[\-thickness \fIratio\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+This draws the recursive Hilbert space-filling curve, in both 2D and
+3D variants. It incrementally animates the growth and recursion to
+the maximum depth, then unwinds it back.
+
+The Hilbert path is a single contiguous line that can fill a volume
+without crossing itself. As a data structure, Hilbert paths are
+useful because ordering along the curve preserves locality: points
+that close together along the curve are also close together in space.
+The converse is often, but not always, true. The coloration
+reflects this.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+How fast the animation should run.
+Less than 1 for slower, greater than 1 for faster.
+.TP 8
+.B \-max\-depth \fInumber\fP
+Max depth to descend. Default: 5, which peaks at around half a
+million polygons.
+.TP 8
+.B \-spin
+.B \-no\-spin
+Whether to rotate the object. Default: true.
+.TP 8
+.B \-wander
+.B \-no\-wander
+Whether to wander the object around on the screen. Default: false;
+.TP 8
+.B \-2d
+.B \-3d
+Whether to draw the 2D or 3D variant. Default: random.
+.TP 8
+.B \-closed
+.B \-open
+Whether to draw the open or closed-path variant. Default: random.
+.TP 8
+.B \-thickness \fIratio\fP
+How thick the lines should be. Default: 0.25.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2011 by Jamie Zawinski. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/hydrostat.c b/hacks/glx/hydrostat.c
new file mode 100644
index 0000000..faf15a0
--- /dev/null
+++ b/hacks/glx/hydrostat.c
@@ -0,0 +1,809 @@
+/* hydrostat, Copyright (C) 2012 by Justin Windle
+ * Copyright (c) 2016 Jamie Zawinski <jwz@jwz.org>
+ *
+ * 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.
+ *
+ * Tentacle simulation using inverse kinematics.
+ *
+ * http://soulwire.co.uk/experiments/muscular-hydrostats/
+ * https://github.com/soulwire/Muscular-Hydrostats/
+ *
+ * Ported to C from Javascript by jwz, May 2016
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*count: 3 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define release_hydrostat 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "sphere.h"
+#include "normals.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+/* It looks bad when you rotate it with the trackball, because it reveals
+ that the tentacles are moving in a 2d plane. But it's useful for
+ debugging. */
+#undef USE_TRACKBALL
+
+#define DEF_SPEED "1.0"
+#define DEF_PULSE "True"
+#define DEF_HEAD_RADIUS "60"
+#define DEF_TENTACLES "35"
+#define DEF_THICKNESS "18"
+#define DEF_LENGTH "55"
+#define DEF_GRAVITY "0.5"
+#define DEF_CURRENT "0.25"
+#define DEF_FRICTION "0.02"
+#define DEF_OPACITY "0.8"
+
+
+#define TENTACLE_FACES 5
+
+typedef struct {
+ XYZ pos, opos, v;
+} node;
+
+typedef struct {
+ int length;
+ GLfloat radius;
+ GLfloat spacing;
+ GLfloat friction;
+ GLfloat th;
+ node *nodes;
+ GLfloat color[4];
+} tentacle;
+
+typedef struct {
+ XYZ pos, from, to;
+ GLfloat ratio, pulse, rate;
+ GLfloat head_radius;
+ GLfloat thickness;
+ int ntentacles;
+ tentacle *tentacles;
+ GLfloat color[4];
+} squid;
+
+typedef struct {
+ GLXContext *glx_context;
+ Bool button_down_p;
+ int dragging;
+ squid **squids;
+ GLfloat cos_sin_table[2 * (TENTACLE_FACES + 1)];
+ GLuint head;
+ int head_polys;
+# ifdef USE_TRACKBALL
+ trackball_state *trackball;
+# endif
+} hydrostat_configuration;
+
+static hydrostat_configuration *bps = NULL;
+
+static Bool do_pulse;
+static GLfloat speed_arg;
+static GLfloat head_radius_arg;
+static GLfloat ntentacles_arg;
+static GLfloat thickness_arg;
+static GLfloat length_arg;
+static GLfloat gravity_arg;
+static GLfloat current_arg;
+static GLfloat friction_arg;
+static GLfloat opacity_arg;
+
+static XrmOptionDescRec opts[] = {
+ { "-pulse", ".pulse", XrmoptionNoArg, "True" },
+ { "+pulse", ".pulse", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-head-radius", ".headRadius", XrmoptionSepArg, 0 },
+ { "-tentacles", ".tentacles", XrmoptionSepArg, 0 },
+ { "-thickness", ".thickness", XrmoptionSepArg, 0 },
+ { "-length", ".length", XrmoptionSepArg, 0 },
+ { "-gravity", ".gravity", XrmoptionSepArg, 0 },
+ { "-current", ".current", XrmoptionSepArg, 0 },
+ { "-friction", ".friction", XrmoptionSepArg, 0 },
+ { "-opacity", ".opacity", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ { &do_pulse, "pulse", "Pulse", DEF_PULSE, t_Bool },
+ { &speed_arg, "speed", "Speed", DEF_SPEED, t_Float },
+ { &head_radius_arg, "headRadius", "HeadRadius", DEF_HEAD_RADIUS, t_Float },
+ { &ntentacles_arg, "tentacles", "Tentacles", DEF_TENTACLES, t_Float },
+ { &thickness_arg, "thickness", "Thickness", DEF_THICKNESS, t_Float },
+ { &length_arg, "length", "Length", DEF_LENGTH, t_Float },
+ { &gravity_arg, "gravity", "Gravity", DEF_GRAVITY, t_Float },
+ { &current_arg, "current", "Current", DEF_CURRENT, t_Float },
+ { &friction_arg, "friction", "Friction", DEF_FRICTION, t_Float },
+ { &opacity_arg, "opacity", "Opacity", DEF_OPACITY, t_Float },
+};
+
+ENTRYPOINT ModeSpecOpt hydrostat_opts = {countof(opts), opts,
+ countof(vars), vars, NULL};
+
+
+static void
+move_tentacle (squid *sq, tentacle *t)
+{
+ int i, j;
+ node *prev = &t->nodes[0];
+ int rot = (int) current_device_rotation();
+
+ for (i = 1, j = 0; i < t->length; i++, j++)
+ {
+ XYZ d, p;
+ GLfloat da;
+ node *n = &t->nodes[i];
+
+ /* Sadly, this is still computing motion in a 2d plane, so the
+ tentacles look dumb if the scene is rotated. */
+
+ n->pos.x += n->v.x;
+ n->pos.y += n->v.y;
+ n->pos.z += n->v.z;
+
+ d.x = prev->pos.x - n->pos.x;
+ d.y = prev->pos.y - n->pos.y;
+ d.z = prev->pos.z - n->pos.z;
+ da = atan2 (d.z, d.x);
+
+ p.x = n->pos.x + cos (da) * t->spacing * t->length;
+ p.y = n->pos.y + cos (da) * t->spacing * t->length;
+ p.z = n->pos.z + sin (da) * t->spacing * t->length;
+
+ n->pos.x = prev->pos.x - (p.x - n->pos.x);
+ n->pos.y = prev->pos.y - (p.y - n->pos.y);
+ n->pos.z = prev->pos.z - (p.z - n->pos.z);
+
+ n->v.x = n->pos.x - n->opos.x;
+ n->v.y = n->pos.y - n->opos.y;
+ n->v.z = n->pos.z - n->opos.z;
+
+ n->v.x *= t->friction * (1 - friction_arg);
+ n->v.y *= t->friction * (1 - friction_arg);
+ n->v.z *= t->friction * (1 - friction_arg);
+
+ switch (rot) {
+ case 90: case -270:
+ n->v.x += gravity_arg;
+ n->v.y -= current_arg;
+ n->v.z -= current_arg;
+ break;
+ case -90: case 270:
+ n->v.x -= gravity_arg;
+ n->v.y += current_arg;
+ n->v.z += current_arg;
+ break;
+ case 180: case -180:
+ n->v.x -= current_arg;
+ n->v.y -= current_arg;
+ n->v.z -= gravity_arg;
+ break;
+ default:
+ n->v.x += current_arg;
+ n->v.y += current_arg;
+ n->v.z += gravity_arg;
+ break;
+ }
+
+ n->opos.x = n->pos.x;
+ n->opos.y = n->pos.y;
+ n->opos.z = n->pos.z;
+
+ prev = n;
+ }
+}
+
+
+static GLfloat
+ease_fn (GLfloat r)
+{
+ return cos ((r/2 + 1) * M_PI) + 1; /* Smooth curve up, end at slope 1. */
+}
+
+
+/* Squirty motion: fast acceleration, then fade. */
+static GLfloat
+ease_ratio (GLfloat r)
+{
+ GLfloat ease = 0.05;
+ GLfloat ease2 = 1-ease;
+ if (r <= 0) r = 0;
+ else if (r >= 1) r = 1;
+ else if (r <= ease) r = ease * ease_fn (r / ease);
+ else r = 1 - ease2 * ease_fn ((1 - r) / ease2);
+ return r;
+}
+
+
+static void
+move_squid (ModeInfo *mi, squid *sq)
+{
+ hydrostat_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat step = M_PI * 2 / sq->ntentacles;
+ int i;
+ GLfloat radius = head_radius_arg;
+ GLfloat r;
+
+ /* Move to a new position */
+
+ if (! bp->button_down_p)
+ {
+ sq->ratio += speed_arg * 0.01;
+ if (sq->ratio >= 1)
+ {
+ sq->ratio = -(frand(2.0) + frand(2.0) + frand(2.0));
+ sq->from.x = sq->to.x;
+ sq->from.y = sq->to.y;
+ sq->from.z = sq->to.z;
+ sq->to.x = 250 - frand(500);
+ sq->to.y = 250 - frand(500);
+ sq->to.z = 250 - frand(500);
+ }
+
+ r = sq->ratio > 0 ? ease_ratio (sq->ratio) : 0;
+ sq->pos.x = sq->from.x + r * (sq->to.x - sq->from.x);
+ sq->pos.y = sq->from.y + r * (sq->to.y - sq->from.y);
+ sq->pos.z = sq->from.z + r * (sq->to.z - sq->from.z);
+ }
+
+ if (do_pulse)
+ {
+ GLfloat p = pow (sin (sq->pulse * M_PI), 18);
+ sq->head_radius = (head_radius_arg * 0.7 +
+ head_radius_arg * 0.3 * p);
+ radius = sq->head_radius * 0.25;
+ sq->pulse += sq->rate * speed_arg * 0.02;
+ if (sq->pulse > 1) sq->pulse = 0;
+ }
+
+ for (i = 0; i < sq->ntentacles; i++)
+ {
+ tentacle *tt = &sq->tentacles[i];
+ GLfloat th = i * step;
+ GLfloat px = cos (th) * radius;
+ GLfloat py = sin (th) * radius;
+ tt->th = th;
+ tt->nodes[0].pos.x = sq->pos.x + px;
+ tt->nodes[0].pos.y = sq->pos.y + py;
+ tt->nodes[0].pos.z = sq->pos.z;
+ move_tentacle (sq, tt);
+ }
+}
+
+
+/* Find the angle at which the head should be tilted in the XY plane.
+ */
+static GLfloat
+head_angle (ModeInfo *mi, squid *sq)
+{
+ int i;
+ XYZ sum = { 0, };
+
+ for (i = 0; i < sq->ntentacles; i++)
+ {
+ tentacle *t = &sq->tentacles[i];
+ int j = t->length / 3; /* Pick a node toward the top */
+ node *n = &t->nodes[j];
+ sum.x += n->pos.x;
+ sum.y += n->pos.y;
+ sum.z += n->pos.z;
+ }
+
+ sum.x /= sq->ntentacles;
+ sum.y /= sq->ntentacles;
+ sum.z /= sq->ntentacles;
+
+ sum.x -= sq->pos.x;
+ sum.y -= sq->pos.y;
+ sum.z -= sq->pos.z;
+
+ return (-atan2 (sum.x, sum.z) * (180 / M_PI));
+}
+
+
+static void
+draw_head (ModeInfo *mi, squid *sq, GLfloat scale)
+{
+ hydrostat_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat c2[4];
+ GLfloat angle = head_angle (mi, sq);
+
+ scale *= 1.1;
+
+ glPushMatrix();
+ glTranslatef (sq->pos.x, sq->pos.y, sq->pos.z);
+ glScalef (sq->head_radius, sq->head_radius, sq->head_radius);
+ glScalef (scale, scale, scale);
+ glRotatef (90, 1, 0, 0);
+
+ memcpy (c2, sq->color, sizeof(c2));
+ if (opacity_arg < 1.0 && scale >= 1.0)
+ c2[3] *= 0.6;
+ glColor4fv (c2);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, c2);
+
+ glTranslatef (0, 0.3, 0);
+ glRotatef (angle, 0, 0, 1);
+
+ glCallList (bp->head);
+ mi->polygon_count += bp->head_polys;
+
+ glPopMatrix();
+}
+
+
+static void
+draw_squid (ModeInfo *mi, squid *sq)
+{
+ hydrostat_configuration *bp = &bps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+ glPushMatrix();
+ glRotatef (90, 1, 0, 0);
+
+ if (opacity_arg < 1.0)
+ draw_head (mi, sq, 0.75);
+
+ if (!wire) {
+ glFrontFace (GL_CCW);
+ glBegin (GL_TRIANGLE_STRIP);
+ }
+
+ for (i = 0; i < sq->ntentacles; i++)
+ {
+ tentacle *t = &sq->tentacles[i];
+ int j;
+
+ glColor4fv (t->color);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, t->color);
+
+ if (wire)
+ {
+ glBegin (GL_LINE_STRIP);
+ for (j = 0; j < t->length; j++)
+ glVertex3f (t->nodes[j].pos.x,
+ t->nodes[j].pos.y,
+ t->nodes[j].pos.z);
+ glEnd();
+ mi->polygon_count += t->length;
+ }
+ else
+ {
+ GLfloat radius = t->radius * thickness_arg;
+ GLfloat rstep = radius / t->length;
+ for (j = 0; j < t->length-1; j++)
+ {
+ int k;
+ node *n1 = &t->nodes[j];
+ node *n2 = &t->nodes[j+1];
+ GLfloat X = (n1->pos.x - n2->pos.x);
+ GLfloat Y = (n1->pos.y - n2->pos.y);
+ GLfloat Z = (n1->pos.z - n2->pos.z);
+ GLfloat L = sqrt (X*X + Y*Y + Z*Z);
+ GLfloat r2 = radius - rstep;
+ GLfloat L2 = sqrt (X*X + Y*Y);
+
+ for (k = 0; k <= TENTACLE_FACES; k++)
+ {
+ GLfloat c = bp->cos_sin_table[2 * k];
+ GLfloat s = bp->cos_sin_table[2 * k + 1];
+ GLfloat x1 = radius * c;
+ GLfloat y1 = radius * s;
+ GLfloat z1 = 0;
+ GLfloat x2 = r2 * c;
+ GLfloat y2 = r2 * s;
+ GLfloat z2 = L;
+
+ GLfloat x1t = (L2*X*z1-X*Z*y1+L*Y*x1)/(L*L2);
+ GLfloat z1t = (L2*Y*z1-Y*Z*y1-L*X*x1)/(L*L2);
+ GLfloat y1t = (Z*z1+L2*y1)/L;
+
+ GLfloat x2t = (L2*X*z2-X*Z*y2+L*Y*x2)/(L*L2) + n1->pos.x;
+ GLfloat z2t = (L2*Y*z2-Y*Z*y2-L*X*x2)/(L*L2) + n1->pos.y;
+ GLfloat y2t = (Z*z2+L2*y2)/L + n1->pos.z;
+
+ glNormal3f (x1t, z1t, y1t);
+
+ x1t += n1->pos.x;
+ z1t += n1->pos.y;
+ y1t += n1->pos.z;
+
+ if (k == 0)
+ glVertex3f (x1t, z1t, y1t);
+ glVertex3f (x1t, z1t, y1t);
+
+ glVertex3f (x2t, z2t, y2t);
+ if (k == TENTACLE_FACES)
+ glVertex3f (x2t, z2t, y2t);
+
+ mi->polygon_count++;
+ }
+ radius = r2;
+ }
+ }
+ }
+
+ if (!wire)
+ glEnd ();
+
+ draw_head (mi, sq, 1.0);
+
+ glPopMatrix();
+}
+
+
+static squid *
+make_squid (ModeInfo *mi, int which)
+{
+ squid *sq = calloc (1, sizeof(*sq));
+ int i;
+
+ sq->head_radius = head_radius_arg;
+ sq->thickness = thickness_arg;
+ sq->ntentacles = ntentacles_arg;
+
+ sq->color[0] = 0.1 + frand(0.7);
+ sq->color[1] = 0.5 + frand(0.5);
+ sq->color[2] = 0.1 + frand(0.7);
+ sq->color[3] = opacity_arg;
+
+ sq->from.x = sq->to.x = sq->pos.x = 200 - frand(400);
+ sq->from.y = sq->to.y = sq->pos.y = 200 - frand(400);
+ sq->from.z = sq->to.z = sq->pos.z = -frand(200);
+
+ sq->ratio = -frand(3);
+
+ if (which > 0) /* Start others off screen, and moving in */
+ {
+ sq->from.x = sq->to.x = sq->pos.x = 800 + frand(500)
+ * (random()&1 ? 1 : -1);
+ sq->from.y = sq->to.y = sq->pos.y = 800 + frand(500)
+ * (random()&1 ? 1 : -1);
+ sq->ratio = 0;
+ }
+
+ if (do_pulse)
+ sq->pulse = frand(1.0);
+ sq->rate = 0.8 + frand(0.2);
+
+ sq->tentacles = (tentacle *)
+ calloc (sq->ntentacles, sizeof(*sq->tentacles));
+ for (i = 0; i < sq->ntentacles; i++)
+ {
+ int j;
+ tentacle *t = &sq->tentacles[i];
+ GLfloat shade = 0.75 + frand(0.25);
+
+ t->length = 2 + length_arg * (0.8 + frand (0.4));
+ t->radius = 0.05 + frand (0.95);
+ t->spacing = 0.02 + frand (0.08);
+ t->friction = 0.7 + frand (0.18);
+ t->nodes = (node *) calloc (t->length + 1, sizeof (*t->nodes));
+
+ t->color[0] = shade * sq->color[0];
+ t->color[1] = shade * sq->color[1];
+ t->color[2] = shade * sq->color[2];
+ t->color[3] = sq->color[3];
+
+ for (j = 0; j < t->length; j++)
+ {
+ node *n = &t->nodes[j];
+ n->pos.x = sq->pos.x;
+ n->pos.y = sq->pos.y;
+ n->pos.z = sq->pos.z + j;
+ }
+ }
+
+ return sq;
+}
+
+/* qsort comparator for sorting squid by depth */
+static int
+cmp_squid (const void *aa, const void *bb)
+{
+ squid * const *a = aa;
+ squid * const *b = bb;
+ return ((int) ((*b)->pos.y * 10000) -
+ (int) ((*a)->pos.y * 10000));
+}
+
+
+static void
+free_squid (squid *sq)
+{
+ int i;
+ for (i = 0; i < sq->ntentacles; i++)
+ free (sq->tentacles[i].nodes);
+ free (sq->tentacles);
+ free (sq);
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_hydrostat (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+
+ glViewport (0, 0, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+
+ENTRYPOINT Bool
+hydrostat_handle_event (ModeInfo *mi, XEvent *event)
+{
+ hydrostat_configuration *bp = &bps[MI_SCREEN(mi)];
+ int w = MI_WIDTH(mi);
+ int h = MI_HEIGHT(mi);
+ int x, y;
+
+# ifdef USE_TRACKBALL
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+# endif
+
+ switch (event->xany.type) {
+ case ButtonPress: case ButtonRelease:
+ x = event->xbutton.x;
+ y = event->xbutton.y;
+ break;
+ case MotionNotify:
+ x = event->xmotion.x;
+ y = event->xmotion.y;
+ break;
+ default:
+ x = y = 0;
+ }
+
+ x -= w/2;
+ y -= h/2;
+ x *= 0.7;
+ y *= 0.7;
+
+ if (event->xany.type == ButtonPress)
+ {
+ int i;
+ GLfloat D0 = 999999;
+
+ /* This is pretty halfassed hit detection, but it works ok... */
+ for (i = 0; i < MI_COUNT(mi); i++)
+ {
+ squid *s = bp->squids[i];
+ GLfloat X = s->pos.x - x;
+ GLfloat Y = s->pos.z - y;
+ GLfloat D = sqrt(X*X + Y*Y);
+ if (D < D0)
+ {
+ bp->dragging = i;
+ D0 = D;
+ }
+ }
+
+ if (D0 > 300) /* Too far away, missed hit */
+ {
+ bp->dragging = -1;
+ return False;
+ }
+
+ bp->squids[bp->dragging]->ratio = -3;
+ bp->button_down_p = True;
+
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease && bp->dragging >= 0)
+ {
+ bp->button_down_p = False;
+ bp->dragging = -1;
+ return True;
+ }
+ else if (event->xany.type == MotionNotify && bp->dragging >= 0)
+ {
+ squid *s = bp->squids[bp->dragging];
+ s->from.x = s->to.x = s->pos.x = x;
+ s->from.z = s->to.z = s->pos.z = y;
+ s->from.y = s->to.y = s->pos.y;
+ return True;
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_hydrostat (ModeInfo *mi)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ hydrostat_configuration *bp;
+ int i;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_hydrostat (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+ int k;
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ for (k = 0; k <= TENTACLE_FACES; k++)
+ {
+ GLfloat th = k * M_PI * 2 / TENTACLE_FACES;
+ bp->cos_sin_table[2 * k] = cos(th);
+ bp->cos_sin_table[2 * k + 1] = sin(th);
+ }
+ }
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+
+ if (MI_COUNT(mi) <= 0)
+ MI_COUNT(mi) = 1;
+
+ if (random() & 1)
+ current_arg = -current_arg;
+
+ if (MI_COUNT(mi) == 1 || wire)
+ opacity_arg = 1.0;
+ if (opacity_arg < 0.1) opacity_arg = 0.1;
+ if (opacity_arg > 1.0) opacity_arg = 1.0;
+
+ bp->squids = (squid **) calloc (MI_COUNT(mi), sizeof(*bp->squids));
+ for (i = 0; i < MI_COUNT(mi); i++)
+ bp->squids[i] = make_squid (mi, i);
+
+ bp->dragging = -1;
+
+ if (opacity_arg < 1.0)
+ {
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE);
+ }
+
+ i = wire ? 4 : 24;
+ bp->head = glGenLists (1);
+ glNewList (bp->head, GL_COMPILE);
+ glScalef (1, 1.1, 1);
+ bp->head_polys = unit_dome (wire ? 8 : 16, i, wire);
+ glRotatef (180, 0, 0, 1);
+ glScalef (1, 0.5, 1);
+ bp->head_polys += unit_dome (wire ? 8 : 8, i, wire);
+ glEndList ();
+
+# ifdef USE_TRACKBALL
+ bp->trackball = gltrackball_init (True);
+# endif
+}
+
+
+ENTRYPOINT void
+draw_hydrostat (ModeInfo *mi)
+{
+ hydrostat_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ glScalef (0.03, 0.03, 0.03);
+
+# ifdef USE_TRACKBALL
+ gltrackball_rotate (bp->trackball);
+# endif
+
+ mi->polygon_count = 0;
+
+ if (opacity_arg < 1.0)
+ qsort (bp->squids, MI_COUNT(mi), sizeof(*bp->squids), cmp_squid);
+
+ for (i = 0; i < MI_COUNT(mi); i++)
+ {
+ squid *sq = bp->squids[i];
+ move_squid (mi, sq);
+ draw_squid (mi, sq);
+ if (opacity_arg < 1.0)
+ glClear (GL_DEPTH_BUFFER_BIT);
+ }
+
+ if (! (random() % 700)) /* Reverse the flow every now and then */
+ current_arg = -current_arg;
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+
+ENTRYPOINT void
+free_hydrostat (ModeInfo *mi)
+{
+ hydrostat_configuration *bp = &bps[MI_SCREEN(mi)];
+ int i;
+ if (!bp->squids)
+ return;
+ for (i = 0; i < MI_COUNT(mi); i++)
+ free_squid (bp->squids[i]);
+ free (bp->squids);
+}
+
+XSCREENSAVER_MODULE ("Hydrostat", hydrostat)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/hydrostat.man b/hacks/glx/hydrostat.man
new file mode 100644
index 0000000..de75525
--- /dev/null
+++ b/hacks/glx/hydrostat.man
@@ -0,0 +1,103 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+hydrostat - Wiggly squid or jellyfish with many tentacles.
+.SH SYNOPSIS
+.B hydrostat
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-count \fInumber\fP]
+[\-head-radius \fInumber\fP]
+[\-tentacles \fInumber\fP]
+[\-thickness \fInumber\fP]
+[\-length \fInumber\fP]
+[\-gravity \fInumber\fP]
+[\-current \fInumber\fP]
+[\-friction \fInumber\fP]
+[\-no-pulse]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Wiggly squid or jellyfish with many tentacles. A muscular hydrostat
+is a biological structure used to move its host about, consisting of
+muscles with no skeletal support. It performs its hydraulic movement
+without fluid in a separate compartment, as in a hydrostatic
+skeleton.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds).
+.TP 8
+.B \-speed \fInumber\fP
+Animation speed. 2.0 means twice as fast, 0.5 means half as fast.
+.TP 8
+.B \-count \fInumber\fP
+Number of squid. 1 - 100. Default: 10.
+.TP 8
+.B \-head-radius \fInumber\fP
+Head size. 10 - 100. Default: 60.
+.TP 8
+.B \-tentacles \fInumber\fP
+Number of tentacles. 3 - 100. Default: 40.
+.TP 8
+.B \-thickness \fInumber\fP
+Thickness of tentacles. 3 - 40. Default: 18.
+.TP 8
+.B \-length \fInumber\fP
+Length of tentacles. 10 - 150. Default: 70.
+.TP 8
+.B \-gravity \fInumber\fP
+Strength of gravity. 0 - 10.0. Default: 0.5.
+.TP 8
+.B \-current \fInumber\fP
+Strength of current. 0.0 - 10.0. Default: 0.25.
+.TP 8
+.B \-friction \fInumber\fP
+Coefficient of friction. 0.0 - 0.1. Default: 0.02.
+.TP 8
+.B \-pulse | \-no-pulse
+Whether the squid should pulse. Default true.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+
+.BR http://soulwire.co.uk/experiments/muscular-hydrostats/
+.SH COPYRIGHT
+Copyright \(co 2016 by Justin Windle and Jamie Zawinski. Permission
+to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided
+that the above copyright notice appear in all copies and that both
+that copyright notice and this permission notice appear in supporting
+documentation. No representations are made about the suitability of
+this software for any purpose. It is provided "as is" without express
+or implied warranty.
+.SH AUTHOR
+Justin Windle and Jamie Zawinski.
diff --git a/hacks/glx/hypertorus.c b/hacks/glx/hypertorus.c
new file mode 100644
index 0000000..3ae6aad
--- /dev/null
+++ b/hacks/glx/hypertorus.c
@@ -0,0 +1,1016 @@
+/* hypertorus --- Shows a hypertorus that rotates in 4d */
+
+#if 0
+static const char sccsid[] = "@(#)hypertorus.c 1.2 05/09/28 xlockmore";
+#endif
+
+/* Copyright (c) 2003-2009 Carsten Steger <carsten@mirsanmir.org>. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * REVISION HISTORY:
+ * C. Steger - 03/05/18: Initial version
+ * C. Steger - 05/09/28: Added the spirals appearance mode
+ * and trackball support
+ * C. Steger - 07/01/23: Improved 4d trackball support
+ * C. Steger - 09/08/22: Removed check-config.pl warnings
+ */
+
+/*
+ * This program shows the Clifford torus as it rotates in 4d. The Clifford
+ * torus is a torus lies on the "surface" of the hypersphere in 4d. The
+ * program projects the 4d torus to 3d using either a perspective or an
+ * orthographic projection. Of the two alternatives, the perspecitve
+ * projection looks much more appealing. In orthographic projections the
+ * torus degenerates into a doubly covered cylinder for some angles. The
+ * projected 3d torus can then be projected to the screen either perspectively
+ * or orthographically. There are three display modes for the torus: mesh
+ * (wireframe), solid, or transparent. Furthermore, the appearance of the
+ * torus can be as a solid object or as a set of see-through bands or
+ * see-through spirals. Finally, the colors with with the torus is drawn can
+ * be set to either two-sided or to colorwheel. In the first case, the torus
+ * is drawn with red on the outside and green on the inside. This mode
+ * enables you to see that the torus turns inside-out as it rotates in 4d.
+ * The second mode draws the torus in a fully saturated color wheel. This
+ * gives a very nice effect when combined with the see-through bands or
+ * see-through spirals mode. The rotation speed for each of the six planes
+ * around which the torus rotates can be chosen. This program is very much
+ * inspired by Thomas Banchoff's book "Beyond the Third Dimension: Geometry,
+ * Computer Graphics, and Higher Dimensions", Scientific American Library,
+ * 1990.
+ */
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+#define DISP_WIREFRAME 0
+#define DISP_SURFACE 1
+#define DISP_TRANSPARENT 2
+
+#define APPEARANCE_SOLID 0
+#define APPEARANCE_BANDS 1
+#define APPEARANCE_SPIRALS 2
+
+#define COLORS_TWOSIDED 0
+#define COLORS_COLORWHEEL 1
+
+#define DISP_3D_PERSPECTIVE 0
+#define DISP_3D_ORTHOGRAPHIC 1
+
+#define DISP_4D_PERSPECTIVE 0
+#define DISP_4D_ORTHOGRAPHIC 1
+
+#define DEF_DISPLAY_MODE "surface"
+#define DEF_APPEARANCE "bands"
+#define DEF_COLORS "colorwheel"
+#define DEF_PROJECTION_3D "perspective"
+#define DEF_PROJECTION_4D "perspective"
+#define DEF_SPEEDWX "1.1"
+#define DEF_SPEEDWY "1.3"
+#define DEF_SPEEDWZ "1.5"
+#define DEF_SPEEDXY "1.7"
+#define DEF_SPEEDXZ "1.9"
+#define DEF_SPEEDYZ "2.1"
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 25000 \n" \
+ "*showFPS: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_hypertorus 0
+# define release_hypertorus 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#include "gltrackball.h"
+
+
+#ifdef USE_MODULES
+ModStruct hypertorus_description =
+{"hypertorus", "init_hypertorus", "draw_hypertorus", NULL,
+ "draw_hypertorus", "change_hypertorus", NULL, &hypertorus_opts,
+ 25000, 1, 1, 1, 1.0, 4, "",
+ "Shows a hypertorus rotating in 4d", 0, NULL};
+
+#endif
+
+
+static char *mode;
+static int display_mode;
+static char *appear;
+static int appearance;
+static int num_spirals;
+static char *color_mode;
+static int colors;
+static char *proj_3d;
+static int projection_3d;
+static char *proj_4d;
+static int projection_4d;
+static float speed_wx;
+static float speed_wy;
+static float speed_wz;
+static float speed_xy;
+static float speed_xz;
+static float speed_yz;
+
+static const float offset4d[4] = { 0.0, 0.0, 0.0, 2.0 };
+static const float offset3d[4] = { 0.0, 0.0, -2.0, 0.0 };
+
+
+static XrmOptionDescRec opts[] =
+{
+ {"-mode", ".displayMode", XrmoptionSepArg, 0 },
+ {"-wireframe", ".displayMode", XrmoptionNoArg, "wireframe" },
+ {"-surface", ".displayMode", XrmoptionNoArg, "surface" },
+ {"-transparent", ".displayMode", XrmoptionNoArg, "transparent" },
+ {"-appearance", ".appearance", XrmoptionSepArg, 0 },
+ {"-solid", ".appearance", XrmoptionNoArg, "solid" },
+ {"-bands", ".appearance", XrmoptionNoArg, "bands" },
+ {"-spirals-1", ".appearance", XrmoptionNoArg, "spirals-1" },
+ {"-spirals-2", ".appearance", XrmoptionNoArg, "spirals-2" },
+ {"-spirals-4", ".appearance", XrmoptionNoArg, "spirals-4" },
+ {"-spirals-8", ".appearance", XrmoptionNoArg, "spirals-8" },
+ {"-spirals-16", ".appearance", XrmoptionNoArg, "spirals-16" },
+ {"-twosided", ".colors", XrmoptionNoArg, "twosided" },
+ {"-colorwheel", ".colors", XrmoptionNoArg, "colorwheel" },
+ {"-perspective-3d", ".projection3d", XrmoptionNoArg, "perspective" },
+ {"-orthographic-3d", ".projection3d", XrmoptionNoArg, "orthographic" },
+ {"-perspective-4d", ".projection4d", XrmoptionNoArg, "perspective" },
+ {"-orthographic-4d", ".projection4d", XrmoptionNoArg, "orthographic" },
+ {"-speed-wx", ".speedwx", XrmoptionSepArg, 0 },
+ {"-speed-wy", ".speedwy", XrmoptionSepArg, 0 },
+ {"-speed-wz", ".speedwz", XrmoptionSepArg, 0 },
+ {"-speed-xy", ".speedxy", XrmoptionSepArg, 0 },
+ {"-speed-xz", ".speedxz", XrmoptionSepArg, 0 },
+ {"-speed-yz", ".speedyz", XrmoptionSepArg, 0 }
+};
+
+static argtype vars[] =
+{
+ { &mode, "displayMode", "DisplayMode", DEF_DISPLAY_MODE, t_String },
+ { &appear, "appearance", "Appearance", DEF_APPEARANCE, t_String },
+ { &color_mode, "colors", "Colors", DEF_COLORS, t_String },
+ { &proj_3d, "projection3d", "Projection3d", DEF_PROJECTION_3D, t_String },
+ { &proj_4d, "projection4d", "Projection4d", DEF_PROJECTION_4D, t_String },
+ { &speed_wx, "speedwx", "Speedwx", DEF_SPEEDWX, t_Float},
+ { &speed_wy, "speedwy", "Speedwy", DEF_SPEEDWY, t_Float},
+ { &speed_wz, "speedwz", "Speedwz", DEF_SPEEDWZ, t_Float},
+ { &speed_xy, "speedxy", "Speedxy", DEF_SPEEDXY, t_Float},
+ { &speed_xz, "speedxz", "Speedxz", DEF_SPEEDXZ, t_Float},
+ { &speed_yz, "speedyz", "Speedyz", DEF_SPEEDYZ, t_Float}
+};
+
+static OptionStruct desc[] =
+{
+ { "-wireframe", "display the torus as a wireframe mesh" },
+ { "-surface", "display the torus as a solid surface" },
+ { "-transparent", "display the torus as a transparent surface" },
+ { "-solid", "display the torus as a solid object" },
+ { "-bands", "display the torus as see-through bands" },
+ { "-spirals-{1,2,4,8,16}", "display the torus as see-through spirals" },
+ { "-twosided", "display the torus with two colors" },
+ { "-colorwheel", "display the torus with a smooth color wheel" },
+ { "-perspective-3d", "project the torus perspectively from 3d to 2d" },
+ { "-orthographic-3d", "project the torus orthographically from 3d to 2d" },
+ { "-perspective-4d", "project the torus perspectively from 4d to 3d" },
+ { "-orthographic-4d", "project the torus orthographically from 4d to 3d" },
+ { "-speed-wx <arg>", "rotation speed around the wx plane" },
+ { "-speed-wy <arg>", "rotation speed around the wy plane" },
+ { "-speed-wz <arg>", "rotation speed around the wz plane" },
+ { "-speed-xy <arg>", "rotation speed around the xy plane" },
+ { "-speed-xz <arg>", "rotation speed around the xz plane" },
+ { "-speed-yz <arg>", "rotation speed around the yz plane" }
+};
+
+ENTRYPOINT ModeSpecOpt hypertorus_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+
+typedef struct {
+ GLint WindH, WindW;
+ GLXContext *glx_context;
+ /* 4D rotation angles */
+ float alpha, beta, delta, zeta, eta, theta;
+ /* Aspect ratio of the current window */
+ float aspect;
+ /* Trackball states */
+ trackball_state *trackballs[2];
+ int current_trackball;
+ Bool button_pressed;
+
+ float speed_scale;
+
+} hypertorusstruct;
+
+static hypertorusstruct *hyper = (hypertorusstruct *) NULL;
+
+
+/* Add a rotation around the wx-plane to the matrix m. */
+static void rotatewx(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][1];
+ v = m[i][2];
+ m[i][1] = c*u+s*v;
+ m[i][2] = -s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the wy-plane to the matrix m. */
+static void rotatewy(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][0];
+ v = m[i][2];
+ m[i][0] = c*u-s*v;
+ m[i][2] = s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the wz-plane to the matrix m. */
+static void rotatewz(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][0];
+ v = m[i][1];
+ m[i][0] = c*u+s*v;
+ m[i][1] = -s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the xy-plane to the matrix m. */
+static void rotatexy(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][2];
+ v = m[i][3];
+ m[i][2] = c*u+s*v;
+ m[i][3] = -s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the xz-plane to the matrix m. */
+static void rotatexz(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][1];
+ v = m[i][3];
+ m[i][1] = c*u-s*v;
+ m[i][3] = s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the yz-plane to the matrix m. */
+static void rotateyz(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][0];
+ v = m[i][3];
+ m[i][0] = c*u-s*v;
+ m[i][3] = s*u+c*v;
+ }
+}
+
+
+/* Compute the rotation matrix m from the rotation angles. */
+static void rotateall(float al, float be, float de, float ze, float et,
+ float th, float m[4][4])
+{
+ int i, j;
+
+ for (i=0; i<4; i++)
+ for (j=0; j<4; j++)
+ m[i][j] = (i==j);
+ rotatewx(m,al);
+ rotatewy(m,be);
+ rotatewz(m,de);
+ rotatexz(m,et);
+ rotatexy(m,ze);
+ rotateyz(m,th);
+}
+
+
+/* Multiply two rotation matrices: o=m*n. */
+static void mult_rotmat(float m[4][4], float n[4][4], float o[4][4])
+{
+ int i, j, k;
+
+ for (i=0; i<4; i++)
+ {
+ for (j=0; j<4; j++)
+ {
+ o[i][j] = 0.0;
+ for (k=0; k<4; k++)
+ o[i][j] += m[i][k]*n[k][j];
+ }
+ }
+}
+
+
+/* Compute a 4D rotation matrix from two unit quaternions. */
+static void quats_to_rotmat(float p[4], float q[4], float m[4][4])
+{
+ double al, be, de, ze, et, th;
+ double r00, r01, r02, r12, r22;
+
+ r00 = 1.0-2.0*(p[1]*p[1]+p[2]*p[2]);
+ r01 = 2.0*(p[0]*p[1]+p[2]*p[3]);
+ r02 = 2.0*(p[2]*p[0]-p[1]*p[3]);
+ r12 = 2.0*(p[1]*p[2]+p[0]*p[3]);
+ r22 = 1.0-2.0*(p[1]*p[1]+p[0]*p[0]);
+
+ al = atan2(-r12,r22)*180.0/M_PI;
+ be = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
+ de = atan2(-r01,r00)*180.0/M_PI;
+
+ r00 = 1.0-2.0*(q[1]*q[1]+q[2]*q[2]);
+ r01 = 2.0*(q[0]*q[1]+q[2]*q[3]);
+ r02 = 2.0*(q[2]*q[0]-q[1]*q[3]);
+ r12 = 2.0*(q[1]*q[2]+q[0]*q[3]);
+ r22 = 1.0-2.0*(q[1]*q[1]+q[0]*q[0]);
+
+ et = atan2(-r12,r22)*180.0/M_PI;
+ th = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
+ ze = atan2(-r01,r00)*180.0/M_PI;
+
+ rotateall(al,be,de,ze,et,-th,m);
+}
+
+
+/* Compute a fully saturated and bright color based on an angle. */
+static void color(double angle)
+{
+ int s;
+ double t;
+ float color[4];
+
+ if (colors != COLORS_COLORWHEEL)
+ return;
+
+ if (angle >= 0.0)
+ angle = fmod(angle,2*M_PI);
+ else
+ angle = fmod(angle,-2*M_PI);
+ s = floor(angle/(M_PI/3));
+ t = angle/(M_PI/3)-s;
+ if (s >= 6)
+ s = 0;
+ switch (s)
+ {
+ case 0:
+ color[0] = 1.0;
+ color[1] = t;
+ color[2] = 0.0;
+ break;
+ case 1:
+ color[0] = 1.0-t;
+ color[1] = 1.0;
+ color[2] = 0.0;
+ break;
+ case 2:
+ color[0] = 0.0;
+ color[1] = 1.0;
+ color[2] = t;
+ break;
+ case 3:
+ color[0] = 0.0;
+ color[1] = 1.0-t;
+ color[2] = 1.0;
+ break;
+ case 4:
+ color[0] = t;
+ color[1] = 0.0;
+ color[2] = 1.0;
+ break;
+ case 5:
+ color[0] = 1.0;
+ color[1] = 0.0;
+ color[2] = 1.0-t;
+ break;
+ }
+ if (display_mode == DISP_TRANSPARENT)
+ color[3] = 0.7;
+ else
+ color[3] = 1.0;
+ glColor3fv(color);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,color);
+}
+
+
+/* Draw a hypertorus projected into 3D. Note that the spirals appearance
+ will only work correctly if numu and numv are set to 64 or any higher
+ power of 2. Similarly, the banded appearance will only work correctly
+ if numu and numv are divisible by 4. */
+static int hypertorus(ModeInfo *mi, double umin, double umax, double vmin,
+ double vmax, int numu, int numv)
+{
+ int polys = 0;
+ static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.7 };
+ static const GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
+ float p[3], pu[3], pv[3], n[3], mat[4][4];
+ int i, j, k, l, m, b, skew;
+ double u, v, ur, vr;
+ double cu, su, cv, sv;
+ double xx[4], xxu[4], xxv[4], x[4], xu[4], xv[4];
+ double r, s, t;
+ float q1[4], q2[4], r1[4][4], r2[4][4];
+ hypertorusstruct *hp = &hyper[MI_SCREEN(mi)];
+
+ rotateall(hp->alpha,hp->beta,hp->delta,hp->zeta,hp->eta,hp->theta,r1);
+
+ gltrackball_get_quaternion(hp->trackballs[0],q1);
+ gltrackball_get_quaternion(hp->trackballs[1],q2);
+ quats_to_rotmat(q1,q2,r2);
+
+ mult_rotmat(r2,r1,mat);
+
+ if (colors != COLORS_COLORWHEEL)
+ {
+ glColor3fv(mat_diff_red);
+ if (display_mode == DISP_TRANSPARENT)
+ {
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_red);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_green);
+ }
+ else
+ {
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_red);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_green);
+ }
+ }
+
+#if 0 /* #### not working */
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+#endif
+
+ skew = num_spirals;
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (i=0; i<numu; i++)
+ {
+ if ((appearance == APPEARANCE_BANDS ||
+ appearance == APPEARANCE_SPIRALS) && ((i & 3) >= 2))
+ continue;
+ if (display_mode == DISP_WIREFRAME)
+ glBegin(GL_QUAD_STRIP);
+ else
+ glBegin(GL_TRIANGLE_STRIP);
+ for (j=0; j<=numv; j++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = (i+k);
+ m = j;
+ u = ur*l/numu+umin;
+ v = vr*m/numv+vmin;
+ if (appearance == APPEARANCE_SPIRALS)
+ {
+ u += 4.0*skew/numv*v;
+ b = ((i/4)&(skew-1))*(numu/(4*skew));
+ color(ur*4*b/numu+umin);
+ }
+ else
+ {
+ color(u);
+ }
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ xx[0] = cu;
+ xx[1] = su;
+ xx[2] = cv;
+ xx[3] = sv;
+ xxu[0] = -su;
+ xxu[1] = cu;
+ xxu[2] = 0.0;
+ xxu[3] = 0.0;
+ xxv[0] = 0.0;
+ xxv[1] = 0.0;
+ xxv[2] = -sv;
+ xxv[3] = cv;
+ for (l=0; l<4; l++)
+ {
+ r = 0.0;
+ s = 0.0;
+ t = 0.0;
+ for (m=0; m<4; m++)
+ {
+ r += mat[l][m]*xx[m];
+ s += mat[l][m]*xxu[m];
+ t += mat[l][m]*xxv[m];
+ }
+ x[l] = r;
+ xu[l] = s;
+ xv[l] = t;
+ }
+ if (projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ {
+ p[l] = (x[l]+offset4d[l])/1.5+offset3d[l];
+ pu[l] = xu[l];
+ pv[l] = xv[l];
+ }
+ }
+ else
+ {
+ s = x[3]+offset4d[3];
+ t = s*s;
+ for (l=0; l<3; l++)
+ {
+ r = x[l]+offset4d[l];
+ p[l] = r/s+offset3d[l];
+ pu[l] = (xu[l]*s-r*xu[3])/t;
+ pv[l] = (xv[l]*s-r*xv[3])/t;
+ }
+ }
+ n[0] = pu[1]*pv[2]-pu[2]*pv[1];
+ n[1] = pu[2]*pv[0]-pu[0]*pv[2];
+ n[2] = pu[0]*pv[1]-pu[1]*pv[0];
+ t = sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
+ n[0] /= t;
+ n[1] /= t;
+ n[2] /= t;
+ glNormal3fv(n);
+ glVertex3fv(p);
+ polys++;
+ }
+ }
+ glEnd();
+ }
+ polys /= 2;
+ return polys;
+}
+
+
+static void init(ModeInfo *mi)
+{
+ static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+ static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
+ static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ hypertorusstruct *hp = &hyper[MI_SCREEN(mi)];
+
+ hp->alpha = 0.0;
+ hp->beta = 0.0;
+ hp->delta = 0.0;
+ hp->zeta = 0.0;
+ hp->eta = 0.0;
+ hp->theta = 0.0;
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ if (projection_3d == DISP_3D_PERSPECTIVE)
+ gluPerspective(60.0,1.0,0.1,100.0);
+ else
+ glOrtho(-1.0,1.0,-1.0,1.0,0.1,100.0);;
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ if (display_mode == DISP_WIREFRAME)
+ display_mode = DISP_SURFACE;
+# endif
+
+ if (display_mode == DISP_SURFACE)
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ }
+ else if (display_mode == DISP_TRANSPARENT)
+ {
+ glDisable(GL_DEPTH_TEST);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glDepthMask(GL_FALSE);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ }
+ else /* display_mode == DISP_WIREFRAME */
+ {
+ glDisable(GL_DEPTH_TEST);
+ glShadeModel(GL_FLAT);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_LIGHT0);
+ glDisable(GL_BLEND);
+ }
+}
+
+
+/* Redisplay the hypertorus. */
+static void display_hypertorus(ModeInfo *mi)
+{
+ hypertorusstruct *hp = &hyper[MI_SCREEN(mi)];
+
+ if (!hp->button_pressed)
+ {
+ hp->alpha += speed_wx * hp->speed_scale;
+ if (hp->alpha >= 360.0)
+ hp->alpha -= 360.0;
+ hp->beta += speed_wy * hp->speed_scale;
+ if (hp->beta >= 360.0)
+ hp->beta -= 360.0;
+ hp->delta += speed_wz * hp->speed_scale;
+ if (hp->delta >= 360.0)
+ hp->delta -= 360.0;
+ hp->zeta += speed_xy * hp->speed_scale;
+ if (hp->zeta >= 360.0)
+ hp->zeta -= 360.0;
+ hp->eta += speed_xz * hp->speed_scale;
+ if (hp->eta >= 360.0)
+ hp->eta -= 360.0;
+ hp->theta += speed_yz * hp->speed_scale;
+ if (hp->theta >= 360.0)
+ hp->theta -= 360.0;
+ }
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ if (projection_3d == DISP_3D_ORTHOGRAPHIC)
+ {
+ if (hp->aspect >= 1.0)
+ glOrtho(-hp->aspect,hp->aspect,-1.0,1.0,0.1,100.0);
+ else
+ glOrtho(-1.0,1.0,-1.0/hp->aspect,1.0/hp->aspect,0.1,100.0);
+ }
+ else
+ {
+ gluPerspective(60.0,hp->aspect,0.1,100.0);
+ }
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ mi->polygon_count = hypertorus(mi,0.0,2.0*M_PI,0.0,2.0*M_PI,64,64);
+}
+
+
+ENTRYPOINT void reshape_hypertorus(ModeInfo *mi, int width, int height)
+{
+ hypertorusstruct *hp = &hyper[MI_SCREEN(mi)];
+ double h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ hp->WindW = (GLint)width;
+ hp->WindH = (GLint)height;
+ glViewport(0,y,width,height);
+ hp->aspect = h;
+}
+
+
+ENTRYPOINT Bool hypertorus_handle_event(ModeInfo *mi, XEvent *event)
+{
+ hypertorusstruct *hp = &hyper[MI_SCREEN(mi)];
+ KeySym sym = 0;
+ char c = 0;
+
+ if (event->xany.type == KeyPress || event->xany.type == KeyRelease)
+ XLookupString (&event->xkey, &c, 1, &sym, 0);
+
+ if (event->xany.type == ButtonPress &&
+ event->xbutton.button == Button1)
+ {
+ hp->button_pressed = True;
+ gltrackball_start(hp->trackballs[hp->current_trackball],
+ event->xbutton.x, event->xbutton.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease &&
+ event->xbutton.button == Button1)
+ {
+ hp->button_pressed = False;
+ return True;
+ }
+ else if (event->xany.type == KeyPress)
+ {
+ if (sym == XK_Shift_L || sym == XK_Shift_R)
+ {
+ hp->current_trackball = 1;
+ if (hp->button_pressed)
+ gltrackball_start(hp->trackballs[hp->current_trackball],
+ event->xbutton.x, event->xbutton.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+ }
+ else if (event->xany.type == KeyRelease)
+ {
+ if (sym == XK_Shift_L || sym == XK_Shift_R)
+ {
+ hp->current_trackball = 0;
+ if (hp->button_pressed)
+ gltrackball_start(hp->trackballs[hp->current_trackball],
+ event->xbutton.x, event->xbutton.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+ }
+ else if (event->xany.type == MotionNotify && hp->button_pressed)
+ {
+ gltrackball_track(hp->trackballs[hp->current_trackball],
+ event->xmotion.x, event->xmotion.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+
+ return False;
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ * Xlock hooks.
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+ *-----------------------------------------------------------------------------
+ * Initialize hypertorus. Called each time the window changes.
+ *-----------------------------------------------------------------------------
+ */
+
+ENTRYPOINT void init_hypertorus(ModeInfo *mi)
+{
+ hypertorusstruct *hp;
+
+ MI_INIT(mi, hyper);
+ hp = &hyper[MI_SCREEN(mi)];
+
+
+ hp->trackballs[0] = gltrackball_init(True);
+ hp->trackballs[1] = gltrackball_init(True);
+ hp->current_trackball = 0;
+ hp->button_pressed = False;
+
+ /* Set the display mode. */
+ if (!strcasecmp(mode,"wireframe") || !strcasecmp(mode,"0"))
+ {
+ display_mode = DISP_WIREFRAME;
+ }
+ else if (!strcasecmp(mode,"surface") || !strcasecmp(mode,"1"))
+ {
+ display_mode = DISP_SURFACE;
+ }
+ else if (!strcasecmp(mode,"transparent") || !strcasecmp(mode,"2"))
+ {
+ display_mode = DISP_TRANSPARENT;
+ }
+ else
+ {
+ display_mode = DISP_SURFACE;
+ }
+
+ /* Set the appearance. */
+ if (!strcasecmp(appear,"solid") || !strcasecmp(appear,"0"))
+ {
+ appearance = APPEARANCE_SOLID;
+ }
+ else if (!strcasecmp(appear,"bands") || !strcasecmp(appear,"1"))
+ {
+ appearance = APPEARANCE_BANDS;
+ num_spirals = 0;
+ }
+ else if (!strcasecmp(appear,"spirals-1") || !strcasecmp(appear,"3"))
+ {
+ appearance = APPEARANCE_SPIRALS;
+ num_spirals = 1;
+ }
+ else if (!strcasecmp(appear,"spirals-2") || !strcasecmp(appear,"4"))
+ {
+ appearance = APPEARANCE_SPIRALS;
+ num_spirals = 2;
+ }
+ else if (!strcasecmp(appear,"spirals-4") || !strcasecmp(appear,"5"))
+ {
+ appearance = APPEARANCE_SPIRALS;
+ num_spirals = 4;
+ }
+ else if (!strcasecmp(appear,"spirals-8") || !strcasecmp(appear,"6"))
+ {
+ appearance = APPEARANCE_SPIRALS;
+ num_spirals = 8;
+ }
+ else if (!strcasecmp(appear,"spirals-16") || !strcasecmp(appear,"7"))
+ {
+ appearance = APPEARANCE_SPIRALS;
+ num_spirals = 16;
+ }
+ else
+ {
+ appearance = APPEARANCE_BANDS;
+ num_spirals = 0;
+ }
+
+ /* Set the color mode. */
+ if (!strcasecmp(color_mode,"twosided"))
+ {
+ colors = COLORS_TWOSIDED;
+ }
+ else if (!strcasecmp(color_mode,"colorwheel"))
+ {
+ colors = COLORS_COLORWHEEL;
+ }
+ else
+ {
+ colors = COLORS_COLORWHEEL;
+ }
+
+ /* Set the 3d projection mode. */
+ if (!strcasecmp(proj_3d,"perspective") || !strcasecmp(proj_3d,"0"))
+ {
+ projection_3d = DISP_3D_PERSPECTIVE;
+ }
+ else if (!strcasecmp(proj_3d,"orthographic") || !strcasecmp(proj_3d,"1"))
+ {
+ projection_3d = DISP_3D_ORTHOGRAPHIC;
+ }
+ else
+ {
+ projection_3d = DISP_3D_PERSPECTIVE;
+ }
+
+ /* Set the 4d projection mode. */
+ if (!strcasecmp(proj_4d,"perspective") || !strcasecmp(proj_4d,"0"))
+ {
+ projection_4d = DISP_4D_PERSPECTIVE;
+ }
+ else if (!strcasecmp(proj_4d,"orthographic") || !strcasecmp(proj_4d,"1"))
+ {
+ projection_4d = DISP_4D_ORTHOGRAPHIC;
+ }
+ else
+ {
+ projection_4d = DISP_4D_PERSPECTIVE;
+ }
+
+ /* make multiple screens rotate at slightly different rates. */
+ hp->speed_scale = 0.9 + frand(0.3);
+
+ if ((hp->glx_context = init_GL(mi)) != NULL)
+ {
+ reshape_hypertorus(mi,MI_WIDTH(mi),MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ init(mi);
+ }
+ else
+ {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * Called by the mainline code periodically to update the display.
+ *-----------------------------------------------------------------------------
+ */
+ENTRYPOINT void draw_hypertorus(ModeInfo *mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ hypertorusstruct *hp;
+
+ if (hyper == NULL)
+ return;
+ hp = &hyper[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+ if (!hp->glx_context)
+ return;
+
+ glXMakeCurrent(display,window,*(hp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity();
+
+ display_hypertorus(mi);
+
+ if (MI_IS_FPS(mi))
+ do_fps (mi);
+
+ glFlush();
+
+ glXSwapBuffers(display,window);
+}
+
+
+#ifndef STANDALONE
+ENTRYPOINT void change_hypertorus(ModeInfo *mi)
+{
+ hypertorusstruct *hp = &hyper[MI_SCREEN(mi)];
+
+ if (!hp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi),MI_WINDOW(mi),*(hp->glx_context));
+ init(mi);
+}
+#endif /* !STANDALONE */
+
+XSCREENSAVER_MODULE ("Hypertorus", hypertorus)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/hypertorus.man b/hacks/glx/hypertorus.man
new file mode 100644
index 0000000..8c7075f
--- /dev/null
+++ b/hacks/glx/hypertorus.man
@@ -0,0 +1,188 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+hypertorus - Draws a hypertorus that rotates in 4d
+.SH SYNOPSIS
+.B hypertorus
+[\-display \fIhost:display.screen\fP]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fIusecs\fP]
+[\-fps]
+[\-wireframe]
+[\-surface]
+[\-transparent]
+[\-solid]
+[\-bands]
+[\-spirals-{1,2,4,8,16}]
+[\-twosided]
+[\-colorwheel]
+[\-perspective-3d]
+[\-orthographic-3d]
+[\-perspective-4d]
+[\-orthographic-4d]
+[\-speed-wx \fIfloat\fP]
+[\-speed-wy \fIfloat\fP]
+[\-speed-wz \fIfloat\fP]
+[\-speed-xy \fIfloat\fP]
+[\-speed-xz \fIfloat\fP]
+[\-speed-yz \fIfloat\fP]
+.SH DESCRIPTION
+The \fIhypertorus\fP program shows the Clifford torus as it rotates in
+4d. The Clifford torus is a torus lies on the "surface" of the
+hypersphere in 4d. The program projects the 4d torus to 3d using
+either a perspective or an orthographic projection. Of the two
+alternatives, the perspective projection looks much more appealing.
+In orthographic projections the torus degenerates into a doubly
+covered cylinder for some angles. The projected 3d torus can then be
+projected to the screen either perspectively or orthographically.
+There are three display modes for the torus: mesh (wireframe), solid,
+or transparent. Furthermore, the appearance of the torus can be as a
+solid object or as a set of see-through bands or see-through spirals.
+Finally, the colors with with the torus is drawn can be set to either
+two-sided or to a color wheel. In the first case, the torus is drawn
+with red on the outside and green on the inside. This mode enables
+you to see that the torus turns inside-out as it rotates in 4d. The
+second mode draws the torus with a fully saturated color wheel. This
+gives a very nice effect when combined with the see-through bands or
+see-through spirals mode. The rotation speed for each of the six
+planes around which the torus rotates can be chosen. This program is
+very much inspired by Thomas Banchoff's book "Beyond the Third
+Dimension: Geometry, Computer Graphics, and Higher Dimensions",
+Scientific American Library, 1990.
+.SH OPTIONS
+.I hypertorus
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual
+class, or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the
+animation. Default 25000, or 1/40th second.
+.PP
+The following three options are mutually exclusive. They determine
+how the torus is displayed.
+.TP 8
+.B \-wireframe
+Display the torus as a wireframe mesh.
+.TP 8
+.B \-surface
+Display the torus as a solid surface (default).
+.TP 8
+.B \-transparent
+Display the torus as a transparent surface.
+.PP
+The following seven options are mutually exclusive. They determine the
+appearance of the torus.
+.TP 8
+.B \-solid
+Display the torus as a solid object.
+.TP 8
+.B \-bands
+Display the torus as see-through bands (default).
+.TP 8
+.B \-spirals-1, \-spirals-2, \-spirals-4, \-spirals-8, \-spirals-16
+Display the torus as see-through spirals with the indicated number of
+spirals.
+.PP
+The following two options are mutually exclusive. They determine how
+to color the torus.
+.TP 8
+.B \-twosided
+Display the torus with two colors: red on the outside and green on
+the inside.
+.TP 8
+.B \-colorwheel
+Display the torus with a fully saturated color wheel (default). If
+the torus is displayed as see-through bands each band will be
+displayed with a different color. Likewise, if the torus is displayed
+as see-through spirals each spiral will receive a different color.
+.PP
+The following two options are mutually exclusive. They determine how
+the torus is projected from 3d to 2d (i.e., to the screen).
+.TP 8
+.B \-perspective-3d
+Project the torus from 3d to 2d using a perspective projection
+(default).
+.TP 8
+.B \-orthographic-3d
+Project the torus from 3d to 2d using an orthographic projection.
+.PP
+The following two options are mutually exclusive. They determine how
+the torus is projected from 4d to 3d.
+.TP 8
+.B \-perspective-4d
+Project the torus from 4d to 3d using a perspective projection
+(default).
+.TP 8
+.B \-orthographic-4d
+Project the torus from 4d to 3d using an orthographic projection.
+.PP
+The following six options determine the rotation speed of the torus
+around the six possible hyperplanes. The rotation speed is measured
+in degrees per frame. The speeds should be set to relatively small
+values, e.g., less than 4 in magnitude.
+.TP 8
+.B \-speed-wx \fIfloat\fP
+Rotation speed around the wx plane (default: 1.1).
+.TP 8
+.B \-speed-wy \fIfloat\fP
+Rotation speed around the wy plane (default: 1.3).
+.TP 8
+.B \-speed-wz \fIfloat\fP
+Rotation speed around the wz plane (default: 1.5).
+.TP 8
+.B \-speed-xy \fIfloat\fP
+Rotation speed around the xy plane (default: 1.7).
+.TP 8
+.B \-speed-xz \fIfloat\fP
+Rotation speed around the xz plane (default: 1.9).
+.TP 8
+.B \-speed-yz \fIfloat\fP
+Rotation speed around the yz plane (default: 2.1).
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH INTERACTION
+If you run this program in standalone mode you can rotate the
+hypertorus by dragging the mouse while pressing the left mouse button.
+This rotates the hypertorus in 3D, i.e., around the wx, wy, and wz
+planes. If you press the shift key while dragging the mouse with the
+left button pressed the hypertorus is rotated in 4D, i.e., around the
+xy, xz, and yz planes. To examine the hypertorus at your leisure, it
+is best to set all speeds to 0. Otherwise, the hypertorus will rotate
+while the left mouse button is not pressed.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003-2005 by Carsten Steger. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Carsten Steger <carsten@mirsanmir.org>, 28-sep-2005.
diff --git a/hacks/glx/hypnowheel.c b/hacks/glx/hypnowheel.c
new file mode 100644
index 0000000..0602e6e
--- /dev/null
+++ b/hacks/glx/hypnowheel.c
@@ -0,0 +1,322 @@
+/* hypnowheel, Copyright (c) 2008 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Draws overlapping spirals, where the tightness of the spirals changes.
+ * Nice settings:
+ *
+ * -layers 7 -wander
+ * -count 3 -layers 50
+ * -twistiness 0.2 -layers 20
+ * -count 3 -layers 2 -speed 20 -twist 10 -wander
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*count: 13 \n" \
+ "*showFPS: False \n" \
+ "*fpsSolid: True \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_hypnowheel 0
+# define release_hypnowheel 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "rotator.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_WANDER "False"
+#define DEF_SYMMETRIC "False"
+#define DEF_SPEED "1.0"
+#define DEF_TWISTINESS "4.0"
+#define DEF_LAYERS "4"
+
+typedef struct {
+ int color;
+ GLfloat twist;
+ GLfloat alpha;
+ rotator *rot;
+} disc;
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ disc *discs;
+ int ncolors;
+ XColor *colors;
+
+} hypnowheel_configuration;
+
+static hypnowheel_configuration *bps = NULL;
+
+static GLfloat speed;
+static GLfloat twistiness;
+static GLint nlayers;
+static Bool do_wander;
+static Bool do_symmetric;
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-twistiness", ".twistiness", XrmoptionSepArg, 0 },
+ { "-layers", ".layers", XrmoptionSepArg, 0 },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-symmetric", ".symmetric", XrmoptionNoArg, "True" },
+ { "+symmetric", ".symmetric", XrmoptionNoArg, "False" },
+};
+
+static argtype vars[] = {
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&do_symmetric, "symmetric", "Symmetric", DEF_SYMMETRIC, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&twistiness, "twistiness", "Twistiness", DEF_TWISTINESS, t_Float},
+ {&nlayers, "layers", "Layers", DEF_LAYERS, t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt hypnowheel_opts = {
+ countof(opts), opts, countof(vars), vars, NULL};
+
+
+static void
+draw_spiral (ModeInfo *mi, disc *d)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+ hypnowheel_configuration *bp = &bps[MI_SCREEN(mi)];
+ GLfloat rr = 0.5;
+ int n = MI_COUNT(mi);
+ int steps = n * (wire ? 3 : (n < 5 ? 60 : n < 10 ? 20 : 10));
+ GLfloat dth = M_PI*2 / n;
+ GLfloat dr = rr / steps;
+ GLfloat th;
+ GLfloat twist = d->twist;
+ GLfloat dtwist = M_PI * 2 * twist / steps;
+ double cscale = 65536.0;
+
+ if (nlayers > 3 && !wire)
+ cscale *= (nlayers-2); /* don't wash out to white */
+
+ glColor4f (bp->colors[d->color].red / cscale,
+ bp->colors[d->color].green / cscale,
+ bp->colors[d->color].blue / cscale,
+ d->alpha);
+ for (th = 0; th < M_PI*2; th += dth)
+ {
+ GLfloat th1 = th;
+ GLfloat r;
+ glBegin (wire ? GL_LINE_STRIP : GL_QUAD_STRIP);
+ for (r = 0; r <= rr; r += dr)
+ {
+ GLfloat th2 = th1 + dth/2 + dtwist;
+ th1 += dtwist;
+ glVertex3f (r * cos(th1), r * sin(th1), 0);
+ if (! wire)
+ glVertex3f (r * cos(th2), r * sin(th2), 0);
+ mi->polygon_count++;
+ }
+ glEnd();
+ }
+}
+
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_hypnowheel (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 3) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT void
+init_hypnowheel (ModeInfo *mi)
+{
+ hypnowheel_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_hypnowheel (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (! bp->rot)
+ bp->rot = make_rotator (0, 0, 0, 0, speed * 0.0025, False);
+
+ bp->ncolors = 1024;
+ if (!bp->colors)
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_smooth_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+
+ if (MI_COUNT(mi) < 2) MI_COUNT(mi) = 2;
+ if (nlayers < 1) nlayers = 1;
+ if (!bp->discs)
+ bp->discs = (disc *) calloc (nlayers, sizeof (disc));
+
+ for (i = 0; i < nlayers; i++)
+ {
+ double spin_speed = speed * 0.2;
+ double wander_speed = speed * 0.0012;
+ double spin_accel = 0.2;
+
+ bp->discs[i].twist = 0;
+ bp->discs[i].alpha = 1;
+ bp->discs[i].color = i * bp->ncolors / nlayers;
+
+ spin_speed += frand (spin_speed / 5);
+ wander_speed += frand (wander_speed * 3);
+
+ if (!bp->discs[i].rot)
+ bp->discs[i].rot = make_rotator (spin_speed, spin_speed, spin_speed,
+ spin_accel,
+ (do_wander ? wander_speed : 0),
+ True);
+ }
+
+ glDisable (GL_LIGHTING);
+ glDisable (GL_DEPTH_TEST);
+ glDepthMask (GL_FALSE);
+ glDisable (GL_CULL_FACE);
+
+ if (! wire)
+ {
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_ONE, GL_ONE);
+ }
+}
+
+
+ENTRYPOINT void
+draw_hypnowheel (ModeInfo *mi)
+{
+ hypnowheel_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int i;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, True);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 8,
+ 0);
+
+ get_rotation (bp->rot, &x, &y, &z, True);
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ mi->polygon_count = 0;
+
+ glScalef (45, 45, 45);
+
+ for (i = 0; i < nlayers; i++)
+ {
+ disc *d = &bp->discs[i];
+ double x, y, z;
+ rotator *rot = (do_symmetric ? bp->discs[(i & ~0x1)].rot : d->rot);
+ Bool tick = (!do_symmetric || i == 0);
+
+ glPushMatrix();
+
+ d->color++;
+ if (d->color >= bp->ncolors)
+ d->color = 0;
+
+ get_position (rot, &x, &y, &z, tick);
+ x -= 0.5;
+ y -= 0.5;
+ x *= 0.1;
+ y *= 0.1;
+
+ glTranslatef (x, y, 0);
+ d->twist = (z * twistiness *
+ ((i & 1) ? 1 : -1));
+
+ get_rotation (rot, &x, &y, &z, tick);
+
+ glRotatef (360 * z, 0, 0, 1); /* rotation of this disc */
+
+ draw_spiral (mi, &bp->discs[i]);
+ glPopMatrix();
+ }
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+ENTRYPOINT Bool
+hypnowheel_handle_event (ModeInfo *mi, XEvent *event)
+{
+ if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ init_hypnowheel (mi);
+ return True;
+ }
+ return False;
+}
+
+
+XSCREENSAVER_MODULE ("Hypnowheel", hypnowheel)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/hypnowheel.man b/hacks/glx/hypnowheel.man
new file mode 100644
index 0000000..233c945
--- /dev/null
+++ b/hacks/glx/hypnowheel.man
@@ -0,0 +1,80 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+hypnowheel - draws overlapping, translucent spiral patterns
+.SH SYNOPSIS
+.B hypnowheel
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fIint\fP]
+[\-layers \fIint\fP]
+[\-count \fIint\fP]
+[\-twistiness \fIfloat\fP]
+[\-speed \fIfloat\fP]
+[\-wander\fP]
+[\-symmetric\fP]
+[\-fps]
+.SH DESCRIPTION
+Draws a series of overlapping, translucent spiral patterns.
+The tightness of their spirals fluctuates in and out.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fIint\fP
+Delay between frames, in microseconds. Default 20000.
+.TP 8
+.B \-layers \fIint\fP
+How many different spirals to draw at once. Default 4.
+.TP 8
+.B \-count \fIint\fP
+How many arms each spiral should have. Default 11.
+.TP 8
+.B \-twistiness \fIfloat\fP
+How tightly wound the spirals can become, measured in rotations.
+Default 4.0 (four times around).
+.TP 8
+.B \-speed \fIratio\fP
+Less than 1 for slower, greater than 1 for faster. Default 1.
+.TP 8
+.B \-wander
+If specified, then the centers of the spirals will wander around,
+rather than them all having the same origin.
+.TP 8
+.B \-symmetric
+If specified, then each pair of left-wrapping and right-wrapping
+spirals will be mirror images of each other.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2008 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
diff --git a/hacks/glx/involute.c b/hacks/glx/involute.c
new file mode 100644
index 0000000..5b49bf0
--- /dev/null
+++ b/hacks/glx/involute.c
@@ -0,0 +1,998 @@
+/* involute, Copyright (c) 2004-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Utilities for rendering OpenGL gears with involute teeth.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include "screenhackI.h"
+
+#ifndef HAVE_JWXYZ
+# include <GL/glx.h>
+# include <GL/glu.h>
+#endif
+
+#ifdef HAVE_ANDROID
+# include <GLES/gl.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#include "involute.h"
+#include "normals.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+
+/* For debugging: if true then in wireframe, do not abbreviate. */
+static Bool wire_all_p = False;
+static Bool show_normals_p = False;
+
+
+/* Draws an uncapped tube of the given radius extending from top to bottom,
+ with faces pointing either in or out.
+ */
+static int
+draw_ring (int segments,
+ GLfloat r, GLfloat top, GLfloat bottom, GLfloat slope,
+ Bool in_p, Bool wire_p)
+{
+ int i;
+ int polys = 0;
+ GLfloat width = M_PI * 2 / segments;
+
+ GLfloat s1 = 1 + ((bottom-top) * slope / 2);
+ GLfloat s2 = 1 - ((bottom-top) * slope / 2);
+
+ if (top != bottom)
+ {
+ glFrontFace (in_p ? GL_CCW : GL_CW);
+ glBegin (wire_p ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < segments + (wire_p ? 0 : 1); i++)
+ {
+ GLfloat th = i * width;
+ GLfloat cth = cos(th);
+ GLfloat sth = sin(th);
+ if (in_p)
+ glNormal3f (-cth, -sth, 0);
+ else
+ glNormal3f (cth, sth, 0);
+ glVertex3f (s1 * cth * r, s1 * sth * r, top);
+ glVertex3f (s2 * cth * r, s2 * sth * r, bottom);
+ }
+ polys += segments;
+ glEnd();
+ }
+
+ if (wire_p)
+ {
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < segments; i++)
+ {
+ GLfloat th = i * width;
+ glVertex3f (cos(th) * r, sin(th) * r, top);
+ }
+ glEnd();
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < segments; i++)
+ {
+ GLfloat th = i * width;
+ glVertex3f (cos(th) * r, sin(th) * r, bottom);
+ }
+ glEnd();
+ }
+
+ return polys;
+}
+
+
+/* Draws a donut-shaped disc between the given radii,
+ with faces pointing either up or down.
+ The first radius may be 0, in which case, a filled disc is drawn.
+ */
+static int
+draw_disc (int segments,
+ GLfloat ra, GLfloat rb, GLfloat z,
+ Bool up_p, Bool wire_p)
+{
+ int i;
+ int polys = 0;
+ GLfloat width = M_PI * 2 / segments;
+
+ if (ra < 0) abort();
+ if (rb <= 0) abort();
+
+ if (ra == 0)
+ glFrontFace (up_p ? GL_CW : GL_CCW);
+ else
+ glFrontFace (up_p ? GL_CCW : GL_CW);
+
+ if (ra == 0)
+ glBegin (wire_p ? GL_LINES : GL_TRIANGLE_FAN);
+ else
+ glBegin (wire_p ? GL_LINES : GL_QUAD_STRIP);
+
+ glNormal3f (0, 0, (up_p ? -1 : 1));
+
+ if (ra == 0 && !wire_p)
+ glVertex3f (0, 0, z);
+
+ for (i = 0; i < segments + (wire_p ? 0 : 1); i++)
+ {
+ GLfloat th = i * width;
+ GLfloat cth = cos(th);
+ GLfloat sth = sin(th);
+ if (wire_p || ra != 0)
+ glVertex3f (cth * ra, sth * ra, z);
+ glVertex3f (cth * rb, sth * rb, z);
+ }
+ polys += segments;
+ glEnd();
+ return polys;
+}
+
+
+/* Draws N thick radial lines between the given radii,
+ with faces pointing either up or down.
+ */
+static int
+draw_spokes (int n, GLfloat thickness, int segments,
+ GLfloat ra, GLfloat rb, GLfloat z1, GLfloat z2, GLfloat slope,
+ Bool wire_p)
+{
+ int i;
+ int polys = 0;
+ GLfloat width;
+ int segments2 = 0;
+ int insegs, outsegs;
+ int tick;
+ int state;
+
+ GLfloat s1 = 1 + ((z2-z1) * slope / 2);
+ GLfloat s2 = 1 - ((z2-z1) * slope / 2);
+
+ if (ra <= 0 || rb <= 0) abort();
+
+ segments *= 3;
+
+ while (segments2 < segments) /* need a multiple of N >= segments */
+ segments2 += n; /* (yes, this is a moronic way to find that) */
+
+ insegs = ((float) (segments2 / n) + 0.5) / thickness;
+ outsegs = (segments2 / n) - insegs;
+ if (insegs <= 0) insegs = 1;
+ if (outsegs <= 0) outsegs = 1;
+
+ segments2 = (insegs + outsegs) * n;
+ width = M_PI * 2 / segments2;
+
+ tick = 0;
+ state = 0;
+ for (i = 0; i < segments2; i++, tick++)
+ {
+ GLfloat th1 = i * width;
+ GLfloat th2 = th1 + width;
+ GLfloat cth1 = cos(th1);
+ GLfloat sth1 = sin(th1);
+ GLfloat cth2 = cos(th2);
+ GLfloat sth2 = sin(th2);
+ GLfloat orb = rb;
+
+ int changed = (i == 0);
+
+ if (state == 0 && tick == insegs)
+ tick = 0, state = 1, changed = 1;
+ else if (state == 1 && tick == outsegs)
+ tick = 0, state = 0, changed = 1;
+
+ if ((state == 1 || /* in */
+ (state == 0 && changed)) &&
+ (!wire_p || wire_all_p))
+ {
+ /* top */
+ glFrontFace (GL_CCW);
+ glBegin (wire_p ? GL_LINES : GL_QUADS);
+ glNormal3f (0, 0, -1);
+ glVertex3f (s1 * cth1 * ra, s1 * sth1 * ra, z1);
+ glVertex3f (s1 * cth1 * rb, s1 * sth1 * rb, z1);
+ glVertex3f (s1 * cth2 * rb, s1 * sth2 * rb, z1);
+ glVertex3f (s1 * cth2 * ra, s1 * sth2 * ra, z1);
+ polys++;
+ glEnd();
+
+ /* bottom */
+ glFrontFace (GL_CW);
+ glBegin (wire_p ? GL_LINES : GL_QUADS);
+ glNormal3f (0, 0, 1);
+ glVertex3f (s2 * cth1 * ra, s2 * sth1 * ra, z2);
+ glVertex3f (s2 * cth1 * rb, s2 * sth1 * rb, z2);
+ glVertex3f (s2 * cth2 * rb, s2 * sth2 * rb, z2);
+ glVertex3f (s2 * cth2 * ra, s2 * sth2 * ra, z2);
+ polys++;
+ glEnd();
+ }
+
+ if (state == 1 && changed) /* entering "in" state */
+ {
+ /* left */
+ glFrontFace (GL_CW);
+ glBegin (wire_p ? GL_LINES : GL_QUADS);
+ do_normal (s1 * cth1 * rb, s1 * sth1 * rb, z1,
+ s1 * cth1 * ra, s1 * sth1 * ra, z1,
+ s2 * cth1 * rb, s2 * sth1 * rb, z2);
+ glVertex3f (s1 * cth1 * ra, s1 * sth1 * ra, z1);
+ glVertex3f (s1 * cth1 * rb, s1 * sth1 * rb, z1);
+ glVertex3f (s2 * cth1 * rb, s2 * sth1 * rb, z2);
+ glVertex3f (s2 * cth1 * ra, s2 * sth1 * ra, z2);
+ polys++;
+ glEnd();
+ }
+
+ if (state == 0 && changed) /* entering "out" state */
+ {
+ /* right */
+ glFrontFace (GL_CCW);
+ glBegin (wire_p ? GL_LINES : GL_QUADS);
+ do_normal (s1 * cth2 * ra, s1 * sth2 * ra, z1,
+ s1 * cth2 * rb, s1 * sth2 * rb, z1,
+ s2 * cth2 * rb, s2 * sth2 * rb, z2);
+ glVertex3f (s1 * cth2 * ra, s1 * sth2 * ra, z1);
+ glVertex3f (s1 * cth2 * rb, s1 * sth2 * rb, z1);
+ glVertex3f (s2 * cth2 * rb, s2 * sth2 * rb, z2);
+ glVertex3f (s2 * cth2 * ra, s2 * sth2 * ra, z2);
+ polys++;
+ glEnd();
+ }
+
+ rb = orb;
+ }
+ return polys;
+}
+
+
+/* Draws some bumps (embedded cylinders) on the gear.
+ */
+static int
+draw_gear_nubs (gear *g, Bool wire_p)
+{
+ int polys = 0;
+ int i;
+ int steps = (g->size < INVOLUTE_LARGE ? 5 : 20);
+ double r, size, height;
+ GLfloat *cc;
+ int which;
+ GLfloat width, off;
+
+ if (! g->nubs) return 0;
+
+ which = involute_biggest_ring (g, &r, &size, &height);
+ size /= 5;
+ height *= 0.7;
+
+ cc = (which == 1 ? g->color : g->color2);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cc);
+
+ if (g->inverted_p)
+ r = g->r + size + g->tooth_h;
+
+ width = M_PI * 2 / g->nubs;
+ off = M_PI / (g->nteeth * 2); /* align first nub with a tooth */
+
+ for (i = 0; i < g->nubs; i++)
+ {
+ GLfloat th = (i * width) + off;
+ glPushMatrix();
+
+ glRotatef (th * 180 / M_PI, 0, 0, 1);
+ glTranslatef (r, 0, 0);
+
+ if (g->inverted_p) /* nubs go on the outside rim */
+ {
+ size = g->thickness / 3;
+ height = (g->r - g->inner_r)/2;
+ glTranslatef (height, 0, 0);
+ glRotatef (90, 0, 1, 0);
+ }
+
+ if (wire_p && !wire_all_p)
+ polys += draw_ring ((g->size >= INVOLUTE_LARGE ? steps/2 : steps),
+ size, 0, 0, 0, False, wire_p);
+ else
+ {
+ polys += draw_disc (steps, 0, size, -height, True, wire_p);
+ polys += draw_disc (steps, 0, size, height, False, wire_p);
+ polys += draw_ring (steps, size, -height, height, 0, False, wire_p);
+ }
+ glPopMatrix();
+ }
+ return polys;
+}
+
+
+
+/* Draws a much simpler representation of a gear.
+ Returns the number of polygons.
+ */
+int
+draw_involute_schematic (gear *g, Bool wire_p)
+{
+ int polys = 0;
+ int i;
+ GLfloat width = M_PI * 2 / g->nteeth;
+
+ if (!wire_p) glDisable(GL_LIGHTING);
+ glColor3f (g->color[0] * 0.6, g->color[1] * 0.6, g->color[2] * 0.6);
+
+ glBegin (GL_LINES);
+ for (i = 0; i < g->nteeth; i++)
+ {
+ GLfloat th = (i * width) + (width/4);
+ glVertex3f (0, 0, -g->thickness/2);
+ glVertex3f (cos(th) * g->r, sin(th) * g->r, -g->thickness/2);
+ }
+ polys += g->nteeth;
+ glEnd();
+
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < g->nteeth; i++)
+ {
+ GLfloat th = (i * width) + (width/4);
+ glVertex3f (cos(th) * g->r, sin(th) * g->r, -g->thickness/2);
+ }
+ polys += g->nteeth;
+ glEnd();
+
+ if (!wire_p) glEnable(GL_LIGHTING);
+ return polys;
+}
+
+
+/* Renders all the interior (non-toothy) parts of a gear:
+ the discs, axles, etc.
+ */
+static int
+draw_gear_interior (gear *g, Bool wire_p)
+{
+ int polys = 0;
+
+ int steps = g->nteeth * 2;
+ if (steps < 10) steps = 10;
+ if ((wire_p && !wire_all_p) || g->size < INVOLUTE_LARGE) steps /= 2;
+ if (g->size < INVOLUTE_LARGE && steps > 16) steps = 16;
+
+ /* ring 1 (facing in) is done in draw_gear_teeth */
+
+ /* ring 2 (facing in) and disc 2
+ */
+ if (g->inner_r2)
+ {
+ GLfloat ra = g->inner_r * 1.04; /* slightly larger than inner_r */
+ GLfloat rb = g->inner_r2; /* since the points don't line up */
+ GLfloat za = -g->thickness2/2;
+ GLfloat zb = g->thickness2/2;
+ GLfloat s1 = 1 + (g->thickness2 * g->tooth_slope / 2);
+ GLfloat s2 = 1 - (g->thickness2 * g->tooth_slope / 2);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, g->color2);
+
+ if ((g->coax_p != 1 && !g->inner_r3) ||
+ (wire_p && wire_all_p))
+ polys += /* ring facing in */
+ draw_ring (steps, rb, za, zb, g->tooth_slope, True, wire_p);
+
+ if (wire_p && wire_all_p)
+ polys += /* ring facing in */
+ draw_ring (steps, ra, za, zb, g->tooth_slope, True, wire_p);
+
+ if (g->spokes)
+ polys += draw_spokes (g->spokes, g->spoke_thickness,
+ steps, ra, rb, za, zb, g->tooth_slope, wire_p);
+ else if (!wire_p || wire_all_p)
+ {
+ polys += /* top plate */
+ draw_disc (steps, s1*ra, s1*rb, za, True, wire_p);
+ polys += /* bottom plate */
+ draw_disc (steps, s2*ra, s2*rb, zb, False, wire_p);
+ }
+ }
+
+ /* ring 3 (facing in and out) and disc 3
+ */
+ if (g->inner_r3)
+ {
+ GLfloat ra = g->inner_r2;
+ GLfloat rb = g->inner_r3;
+ GLfloat za = -g->thickness3/2;
+ GLfloat zb = g->thickness3/2;
+ GLfloat s1 = 1 + (g->thickness3 * g->tooth_slope / 2);
+ GLfloat s2 = 1 - (g->thickness3 * g->tooth_slope / 2);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, g->color);
+
+ polys += /* ring facing out */
+ draw_ring (steps, ra, za, zb, g->tooth_slope, False, wire_p);
+
+ if (g->coax_p != 1 || (wire_p && wire_all_p))
+ polys += /* ring facing in */
+ draw_ring (steps, rb, za, zb, g->tooth_slope, True, wire_p);
+
+ if (!wire_p || wire_all_p)
+ {
+ polys += /* top plate */
+ draw_disc (steps, s1*ra, s1*rb, za, True, wire_p);
+ polys += /* bottom plate */
+ draw_disc (steps, s2*ra, s2*rb, zb, False, wire_p);
+ }
+ }
+
+ /* axle tube
+ */
+ if (g->coax_p == 1)
+ {
+ GLfloat cap_height = g->coax_thickness/3;
+
+ GLfloat ra = (g->inner_r3 ? g->inner_r3 :
+ g->inner_r2 ? g->inner_r2 :
+ g->inner_r);
+ GLfloat za = -(g->thickness/2 + cap_height);
+ GLfloat zb = g->coax_thickness/2 + g->coax_displacement + cap_height;
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, g->color);
+
+ if (wire_p && !wire_all_p) steps /= 2;
+
+ polys +=
+ draw_ring (steps, ra, za, zb, g->tooth_slope, False, wire_p);
+
+ if (!wire_p || wire_all_p)
+ {
+ polys +=
+ draw_disc (steps, 0, ra, za, True, wire_p); /* top plate */
+ polys +=
+ draw_disc (steps, 0, ra, zb, False, wire_p); /* bottom plate */
+ }
+ }
+ return polys;
+}
+
+
+/* gear_teeth_geometry computes the vertices and normals of the teeth
+ of a gear. This is the heavy lifting: there are a ton of polygons
+ around the perimiter of a gear, and the normals are difficult (not
+ radial or right angles.)
+
+ It would be nice if we could cache this, but the numbers are
+ different for essentially every gear:
+
+ - Every gear has a different inner_r, so the vertices of the
+ inner ring (and thus, the triangle fans on the top and bottom
+ faces) are different in a non-scalable way.
+
+ - If the ratio between tooth_w and tooth_h changes, the normals
+ on the outside edges of the teeth are invalid (this can happen
+ every time we start a new train.)
+
+ So instead, we rely on OpenGL display lists to do the cacheing for
+ us -- we only compute all these normals once per gear, instead of
+ once per gear per frame.
+ */
+
+typedef struct {
+ int npoints;
+ XYZ *points;
+ XYZ *fnormals; /* face normals */
+ XYZ *pnormals; /* point normals */
+} tooth_face;
+
+
+static void
+tooth_normals (tooth_face *f, GLfloat tooth_slope)
+{
+ int i;
+
+ /* Compute the face normals for each facet. */
+ for (i = 0; i < f->npoints; i++)
+ {
+ XYZ p1, p2, p3;
+ int a = i;
+ int b = (i == f->npoints-1 ? 0 : i+1);
+ p1 = f->points[a];
+ p2 = f->points[b];
+ p3 = p1;
+ p3.x -= (p3.x * tooth_slope);
+ p3.y -= (p3.y * tooth_slope);
+ p3.z++;
+ f->fnormals[i] = calc_normal (p1, p2, p3);
+ }
+
+ /* From the face normals, compute the vertex normals
+ (by averaging the normals of adjascent faces.)
+ */
+ for (i = 0; i < f->npoints; i++)
+ {
+ int a = (i == 0 ? f->npoints-1 : i-1);
+ int b = i;
+ XYZ n1 = f->fnormals[a]; /* normal of [i-1 - i] face */
+ XYZ n2 = f->fnormals[b]; /* normal of [i - i+1] face */
+ f->pnormals[i].x = (n1.x + n2.x) / 2;
+ f->pnormals[i].y = (n1.y + n2.y) / 2;
+ f->pnormals[i].z = (n1.z + n2.z) / 2;
+ }
+}
+
+
+static void
+gear_teeth_geometry (gear *g,
+ tooth_face *orim, /* outer rim (the teeth) */
+ tooth_face *irim) /* inner rim (the hole) */
+{
+ int i;
+ int ppt = 20; /* max points per tooth */
+ GLfloat width = M_PI * 2 / g->nteeth;
+ GLfloat rh = g->tooth_h;
+ GLfloat tw = width;
+
+ /* Approximate shape of an "involute" gear tooth.
+
+ (TH)
+ th0 th2 th4 th6 th8 t10 t12 t14 th16 th18 th20
+ : : : : : : : : : : :
+ : : : : : : : : : : :
+ r0 ........:..:..:...___________...:..:..:......:......:..
+ : : : /: : :\ : : : : :
+ : : : / : : : \ : : : : :
+ : : :/ : : : \: : : : :
+ r2 ........:.....@...:....:....:...@..:..:......:......:..
+ : : @: : : : :@ : : : :
+ (R) ...........:...@.:...:....:....:...:.@..........:......:......
+ : :@ : : : : : @: : : :
+ r4 ........:..@..:...:....:....:...:..@:........:......:..
+ : /: : : : : : :\ : : :
+ :/ : : : : : : : \: : : /
+ r6 ......__/..:..:...:....:....:...:..:..\______________/
+ : : : : : : : : : : :
+ | : : : : : : : | : :
+ : : : : : : : : : : :
+ | : : : : : : : | : :
+ r8 ......__:_____________________________:________________
+ */
+
+ GLfloat r[30];
+ GLfloat th[30];
+ GLfloat R = g->r;
+
+ r[0] = R + (rh * 0.50);
+ r[1] = R + (rh * 0.40);
+ r[2] = R + (rh * 0.25);
+ r[3] = R + (rh * 0.05);
+ r[4] = R - (r[2]-R);
+ r[5] = R - (r[1]-R);
+ r[6] = R - (r[0]-R);
+ r[7] = r[6]; /* unused */
+ r[8] = g->inner_r;
+
+ th[0] = -tw * (g->size == INVOLUTE_SMALL ? 0.5 :
+ g->size == INVOLUTE_MEDIUM ? 0.41 : 0.45);
+ th[1] = -tw * 0.375;
+ th[2] = -tw * 0.300;
+ th[3] = -tw * 0.230;
+ th[4] = -tw * (g->nteeth >= 5 ? 0.16 : 0.12);
+ th[5] = -tw * 0.100;
+ th[6] = -tw * (g->size == INVOLUTE_MEDIUM ? 0.1 : 0.04);
+ th[7] = -tw * 0.020;
+ th[8] = 0;
+ th[9] = -th[7];
+ th[10] = -th[6];
+ th[11] = -th[5];
+ th[12] = -th[4];
+ th[13] = -th[3];
+ th[14] = -th[2];
+ th[15] = -th[1];
+ th[16] = -th[0];
+ th[17] = width * 0.47;
+ th[18] = width * 0.50;
+ th[19] = width * 0.53;
+ th[20] = th[0] + width; /* unused */
+
+ if (g->inverted_p) /* put the teeth on the inside */
+ {
+ for (i = 0; i < countof(th); i++)
+ th[i] = -th[i];
+ for (i = 0; i < countof(r); i++)
+ r[i] = R - (r[i] - R);
+ }
+
+ orim->npoints = 0;
+ orim->points = (XYZ *) calloc(ppt * g->nteeth+1, sizeof(*orim->points));
+ orim->fnormals = (XYZ *) calloc(ppt * g->nteeth+1, sizeof(*orim->fnormals));
+ orim->pnormals = (XYZ *) calloc(ppt * g->nteeth+1, sizeof(*orim->pnormals));
+
+ irim->npoints = 0;
+ irim->points = (XYZ *) calloc(ppt * g->nteeth+1, sizeof(*irim->points));
+ irim->fnormals = (XYZ *) calloc(ppt * g->nteeth+1, sizeof(*irim->fnormals));
+ irim->pnormals = (XYZ *) calloc(ppt * g->nteeth+1, sizeof(*irim->pnormals));
+
+ if (!orim->points || !orim->pnormals || !orim->fnormals ||
+ !irim->points || !irim->pnormals || !irim->fnormals)
+ {
+ fprintf (stderr, "%s: out of memory\n", progname);
+ exit (1);
+ }
+
+ /* First, compute the coordinates of every point used for every tooth.
+ */
+ for (i = 0; i < g->nteeth; i++)
+ {
+ GLfloat TH = (i * width) + (width/4);
+ int oon = orim->npoints;
+ int oin = irim->npoints;
+
+# undef PUSH
+# define PUSH(OPR,IPR,PTH) \
+ orim->points[orim->npoints].x = cos(TH+th[(PTH)]) * r[(OPR)]; \
+ orim->points[orim->npoints].y = sin(TH+th[(PTH)]) * r[(OPR)]; \
+ orim->npoints++; \
+ irim->points[irim->npoints].x = cos(TH+th[(PTH)]) * r[(IPR)]; \
+ irim->points[irim->npoints].y = sin(TH+th[(PTH)]) * r[(IPR)]; \
+ irim->npoints++
+
+ switch (g->size) {
+ case INVOLUTE_SMALL:
+ PUSH(6, 8, 0); /* tooth left 1 */
+ PUSH(0, 8, 8); /* tooth top middle */
+ break;
+ case INVOLUTE_MEDIUM:
+ PUSH(6, 8, 0); /* tooth left 1 */
+ PUSH(0, 8, 6); /* tooth top left */
+ PUSH(0, 8, 10); /* tooth top right */
+ PUSH(6, 8, 16); /* tooth right 6 */
+ break;
+ case INVOLUTE_LARGE:
+ PUSH(6, 8, 0); /* tooth left 1 */
+ PUSH(4, 8, 2); /* tooth left 3 */
+ PUSH(2, 8, 4); /* tooth left 5 */
+ PUSH(0, 8, 6); /* tooth top left */
+ PUSH(0, 8, 10); /* tooth top right */
+ PUSH(2, 8, 12); /* tooth right 1 */
+ PUSH(4, 8, 14); /* tooth right 3 */
+ PUSH(6, 8, 16); /* tooth right 5 */
+ PUSH(6, 8, 18); /* gap top */
+ break;
+ case INVOLUTE_HUGE:
+ PUSH(6, 8, 0); /* tooth left 1 */
+ PUSH(5, 8, 1); /* tooth left 2 */
+ PUSH(4, 8, 2); /* tooth left 3 */
+ PUSH(3, 8, 3); /* tooth left 4 */
+ PUSH(2, 8, 4); /* tooth left 5 */
+ PUSH(1, 8, 5); /* tooth left 6 */
+ PUSH(0, 8, 6); /* tooth top left */
+ PUSH(0, 8, 8); /* tooth top left */
+ PUSH(0, 8, 10); /* tooth top right */
+ PUSH(1, 8, 11); /* tooth top right */
+ PUSH(2, 8, 12); /* tooth right 1 */
+ PUSH(3, 8, 13); /* tooth right 2 */
+ PUSH(4, 8, 14); /* tooth right 3 */
+ PUSH(5, 8, 15); /* tooth right 4 */
+ PUSH(6, 8, 16); /* tooth right 5 */
+ PUSH(6, 8, 17); /* tooth right 6 */
+ PUSH(6, 8, 18); /* gap top */
+ PUSH(6, 8, 19); /* gap top */
+ break;
+ default:
+ abort();
+ }
+# undef PUSH
+
+ if (i == 0 && orim->npoints > ppt) abort(); /* go update "ppt"! */
+
+ if (g->inverted_p)
+ {
+ int start, end, j;
+ start = oon;
+ end = orim->npoints;
+ for (j = 0; j < (end-start)/2; j++)
+ {
+ XYZ swap = orim->points[end-j-1];
+ orim->points[end-j-1] = orim->points[start+j];
+ orim->points[start+j] = swap;
+ }
+
+ start = oin;
+ end = irim->npoints;
+ for (j = 0; j < (end-start)/2; j++)
+ {
+ XYZ swap = irim->points[end-j-1];
+ irim->points[end-j-1] = irim->points[start+j];
+ irim->points[start+j] = swap;
+ }
+ }
+ }
+
+ tooth_normals (orim, g->tooth_slope);
+ tooth_normals (irim, 0);
+
+ if (g->inverted_p) /* flip the normals */
+ {
+ for (i = 0; i < orim->npoints; i++)
+ {
+ orim->fnormals[i].x = -orim->fnormals[i].x;
+ orim->fnormals[i].y = -orim->fnormals[i].y;
+ orim->fnormals[i].z = -orim->fnormals[i].z;
+
+ orim->pnormals[i].x = -orim->pnormals[i].x;
+ orim->pnormals[i].y = -orim->pnormals[i].y;
+ orim->pnormals[i].z = -orim->pnormals[i].z;
+ }
+
+ for (i = 0; i < irim->npoints; i++)
+ {
+ irim->fnormals[i].x = -irim->fnormals[i].x;
+ irim->fnormals[i].y = -irim->fnormals[i].y;
+ irim->fnormals[i].z = -irim->fnormals[i].z;
+
+ irim->pnormals[i].x = -irim->pnormals[i].x;
+ irim->pnormals[i].y = -irim->pnormals[i].y;
+ irim->pnormals[i].z = -irim->pnormals[i].z;
+ }
+ }
+}
+
+
+/* Which of the gear's inside rings is the biggest?
+ */
+int
+involute_biggest_ring (gear *g, double *posP, double *sizeP, double *heightP)
+{
+ double r0 = (g->r - g->tooth_h/2);
+ double r1 = g->inner_r;
+ double r2 = g->inner_r2;
+ double r3 = g->inner_r3;
+ double w1 = (r1 ? r0 - r1 : r0);
+ double w2 = (r2 ? r1 - r2 : 0);
+ double w3 = (r3 ? r2 - r3 : 0);
+ double h1 = g->thickness;
+ double h2 = g->thickness2;
+ double h3 = g->thickness3;
+
+ if (g->spokes) w2 = 0;
+
+ if (w1 > w2 && w1 > w3)
+ {
+ if (posP) *posP = (r0+r1)/2;
+ if (sizeP) *sizeP = w1;
+ if (heightP) *heightP = h1;
+ return 0;
+ }
+ else if (w2 > w1 && w2 > w3)
+ {
+ if (posP) *posP = (r1+r2)/2;
+ if (sizeP) *sizeP = w2;
+ if (heightP) *heightP = h2;
+ return 1;
+ }
+ else
+ {
+ if (posP) *posP = (r2+r3)/2;
+ if (sizeP) *sizeP = w3;
+ if (heightP) *heightP = h3;
+ return 1;
+ }
+}
+
+
+/* Renders all teeth of a gear.
+ */
+static int
+draw_gear_teeth (gear *g, Bool wire_p)
+{
+ int polys = 0;
+ int i;
+
+ GLfloat z1 = -g->thickness/2;
+ GLfloat z2 = g->thickness/2;
+ GLfloat s1 = 1 + (g->thickness * g->tooth_slope / 2);
+ GLfloat s2 = 1 - (g->thickness * g->tooth_slope / 2);
+
+ tooth_face orim, irim;
+ gear_teeth_geometry (g, &orim, &irim);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, g->color);
+
+ /* Draw the outer rim (the teeth)
+ (In wire mode, this draws just the upright lines.)
+ */
+ glFrontFace (g->inverted_p ? GL_CCW : GL_CW);
+ glBegin (wire_p ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < orim.npoints; i++)
+ {
+ glNormal3f (orim.pnormals[i].x, orim.pnormals[i].y, orim.pnormals[i].z);
+ glVertex3f (s1*orim.points[i].x, s1*orim.points[i].y, z1);
+ glVertex3f (s2*orim.points[i].x, s2*orim.points[i].y, z2);
+
+ /* Show the face normal vectors */
+ if (0&&wire_p && show_normals_p)
+ {
+ XYZ n = orim.fnormals[i];
+ int a = i;
+ int b = (i == orim.npoints-1 ? 0 : i+1);
+ GLfloat x = (orim.points[a].x + orim.points[b].x) / 2;
+ GLfloat y = (orim.points[a].y + orim.points[b].y) / 2;
+ GLfloat z = (z1 + z2) / 2;
+ glVertex3f (x, y, z);
+ glVertex3f (x + n.x, y + n.y, z + n.z);
+ }
+
+ /* Show the vertex normal vectors */
+ if (wire_p && show_normals_p)
+ {
+ XYZ n = orim.pnormals[i];
+ GLfloat x = orim.points[i].x;
+ GLfloat y = orim.points[i].y;
+ GLfloat z = (z1 + z2) / 2;
+ glVertex3f (x, y, z);
+ glVertex3f (x + n.x, y + n.y, z + n.z);
+ }
+ }
+
+ if (!wire_p) /* close the quad loop */
+ {
+ glNormal3f (orim.pnormals[0].x, orim.pnormals[0].y, orim.pnormals[0].z);
+ glVertex3f (s1*orim.points[0].x, s1*orim.points[0].y, z1);
+ glVertex3f (s2*orim.points[0].x, s2*orim.points[0].y, z2);
+ }
+ polys += orim.npoints;
+ glEnd();
+
+ /* Draw the outer rim circles, in wire mode */
+ if (wire_p)
+ {
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < orim.npoints; i++)
+ glVertex3f (s1*orim.points[i].x, s1*orim.points[i].y, z1);
+ glEnd();
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < orim.npoints; i++)
+ glVertex3f (s2*orim.points[i].x, s2*orim.points[i].y, z2);
+ glEnd();
+ }
+
+ /* Draw the inner rim (the hole)
+ (In wire mode, this draws just the upright lines.)
+ */
+ glFrontFace (g->inverted_p ? GL_CW : GL_CCW);
+ glBegin (wire_p ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < irim.npoints; i++)
+ {
+ glNormal3f(-irim.pnormals[i].x, -irim.pnormals[i].y,-irim.pnormals[i].z);
+ glVertex3f (s1*irim.points[i].x, s1*irim.points[i].y, z1);
+ glVertex3f (s2*irim.points[i].x, s2*irim.points[i].y, z2);
+
+ /* Show the face normal vectors */
+ if (wire_p && show_normals_p)
+ {
+ XYZ n = irim.fnormals[i];
+ int a = i;
+ int b = (i == irim.npoints-1 ? 0 : i+1);
+ GLfloat x = (irim.points[a].x + irim.points[b].x) / 2;
+ GLfloat y = (irim.points[a].y + irim.points[b].y) / 2;
+ GLfloat z = (z1 + z2) / 2;
+ glVertex3f (x, y, z);
+ glVertex3f (x - n.x, y - n.y, z);
+ }
+
+ /* Show the vertex normal vectors */
+ if (wire_p && show_normals_p)
+ {
+ XYZ n = irim.pnormals[i];
+ GLfloat x = irim.points[i].x;
+ GLfloat y = irim.points[i].y;
+ GLfloat z = (z1 + z2) / 2;
+ glVertex3f (x, y, z);
+ glVertex3f (x - n.x, y - n.y, z);
+ }
+ }
+
+ if (!wire_p) /* close the quad loop */
+ {
+ glNormal3f (-irim.pnormals[0].x,-irim.pnormals[0].y,-irim.pnormals[0].z);
+ glVertex3f (s1*irim.points[0].x, s1*irim.points[0].y, z1);
+ glVertex3f (s2*irim.points[0].x, s2*irim.points[0].y, z2);
+ }
+ polys += irim.npoints;
+ glEnd();
+
+ /* Draw the inner rim circles, in wire mode
+ */
+ if (wire_p)
+ {
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < irim.npoints; i++)
+ glVertex3f (irim.points[i].x, irim.points[i].y, z1);
+ glEnd();
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < irim.npoints; i++)
+ glVertex3f (irim.points[i].x, irim.points[i].y, z2);
+ glEnd();
+ }
+
+ /* Draw the side (the flat bit)
+ */
+ if (!wire_p || wire_all_p)
+ {
+ GLfloat z;
+ if (irim.npoints != orim.npoints) abort();
+ for (z = z1; z <= z2; z += z2-z1)
+ {
+ GLfloat s = (z == z1 ? s1 : s2);
+ glFrontFace (((z == z1) ^ g->inverted_p) ? GL_CCW : GL_CW);
+ glNormal3f (0, 0, z);
+ glBegin (wire_p ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < orim.npoints; i++)
+ {
+ glVertex3f (s*orim.points[i].x, s*orim.points[i].y, z);
+ glVertex3f (s*irim.points[i].x, s*irim.points[i].y, z);
+ }
+ if (!wire_p) /* close the quad loop */
+ {
+ glVertex3f (s*orim.points[0].x, s*orim.points[0].y, z);
+ glVertex3f (s*irim.points[0].x, s*irim.points[0].y, z);
+ }
+ polys += orim.npoints;
+ glEnd();
+ }
+ }
+
+ free (irim.points);
+ free (irim.fnormals);
+ free (irim.pnormals);
+
+ free (orim.points);
+ free (orim.fnormals);
+ free (orim.pnormals);
+
+ return polys;
+}
+
+
+/* Render one gear, unrotated at 0,0.
+ Returns the number of polygons.
+ */
+int
+draw_involute_gear (gear *g, Bool wire_p)
+{
+ int polys = 0;
+
+ static const GLfloat spec[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat shiny = 128.0;
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, spec);
+ glMateriali (GL_FRONT, GL_SHININESS, shiny);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, g->color);
+ glColor3f (g->color[0], g->color[1], g->color[2]);
+
+ if (wire_p > 1)
+ polys += draw_involute_schematic (g, wire_p);
+ else
+ {
+ glPushMatrix();
+ glRotatef (g->wobble, 1, 0, 0);
+ polys += draw_gear_teeth (g, wire_p);
+ polys += draw_gear_interior (g, wire_p);
+ polys += draw_gear_nubs (g, wire_p);
+ glPopMatrix();
+ }
+ return polys;
+}
diff --git a/hacks/glx/involute.h b/hacks/glx/involute.h
new file mode 100644
index 0000000..c6a3066
--- /dev/null
+++ b/hacks/glx/involute.h
@@ -0,0 +1,78 @@
+/* involute, Copyright (c) 2004-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Utilities for rendering OpenGL gears with involute teeth.
+ */
+
+#ifndef __GEAR_INVOLUTE_H__
+#define __GEAR_INVOLUTE_H__
+
+typedef struct {
+ unsigned long id; /* unique name */
+ double x, y, z; /* position */
+ double r; /* radius of the gear, at middle of teeth */
+ double th; /* rotation (degrees) */
+
+ GLint nteeth; /* how many teeth */
+ double tooth_w, tooth_h; /* size of teeth */
+
+ double tooth_slope; /* 0 for normal right-angle gear; 1 = 45 deg. */
+ double inner_r; /* radius of the (larger) inside hole */
+ double inner_r2; /* radius of the (smaller) inside hole, if any */
+ double inner_r3; /* yet another */
+
+ double thickness; /* height of the edge */
+ double thickness2; /* height of the (smaller) inside disc if any */
+ double thickness3; /* yet another */
+ int spokes; /* how many spokes inside, if any */
+ int nubs; /* how many little nubbly bits, if any */
+ double spoke_thickness; /* spoke versus hole */
+ double wobble; /* factory defect! */
+ int motion_blur_p; /* whether it's spinning too fast to draw */
+ int polygons; /* how many polys in this gear */
+
+ double ratio; /* gearing ratio with previous gears */
+ double rpm; /* approximate revolutions per minute */
+
+ Bool inverted_p; /* whether this gear has teeth on the inside */
+ Bool base_p; /* whether this gear begins a new train */
+ int coax_p; /* whether this is one of a pair of bound gears.
+ 1 for first, 2 for second. */
+ double coax_displacement; /* distance between gear planes */
+
+ double coax_thickness; /* thickness of the other gear in the pair */
+
+ enum { INVOLUTE_SMALL,
+ INVOLUTE_MEDIUM,
+ INVOLUTE_LARGE,
+ INVOLUTE_HUGE } size; /* Controls complexity of mesh. */
+ GLfloat color[4];
+ GLfloat color2[4];
+
+ GLuint dlist;
+} gear;
+
+/* Render one gear, unrotated at 0,0.
+ Returns the number of polygons.
+ */
+extern int draw_involute_gear (gear *g, Bool wire_p);
+
+/* Draws a much simpler representation of a gear.
+ Returns the number of polygons.
+ */
+extern int draw_involute_schematic (gear *g, Bool wire_p);
+
+/* Which of the gear's inside rings is the biggest?
+ */
+extern int involute_biggest_ring (gear *g,
+ double *posP, double *sizeP,
+ double *heightP);
+
+#endif /* __GEAR_INVOLUTE_H__ */
diff --git a/hacks/glx/jigglypuff.c b/hacks/glx/jigglypuff.c
new file mode 100644
index 0000000..fea13fd
--- /dev/null
+++ b/hacks/glx/jigglypuff.c
@@ -0,0 +1,1076 @@
+/* jigglypuff - a most, most, unfortunate screensaver.
+ *
+ * Copyright (c) 2003 Keith Macleod (kmacleod@primus.ca)
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Draws all varieties of obscene, spastic, puffy balls
+ * orbiting lazily about the screen. More of an accident
+ * than anything else.
+ *
+ * Apologies to anyone who thought they were getting a Pokemon
+ * out of this.
+ *
+ * Of course, if you modify it to do something interesting and/or
+ * funny, I'd appreciate receiving a copy.
+ *
+ * 04/06/2003 - Oops, figured out what was wrong with the sphere
+ * mapping. I had assumed it was done in model space,
+ * but of course I was totally wrong... Eye space you
+ * say? Yup. km
+ *
+ * 03/31/2003 - Added chrome to the color options. The mapping
+ * is anything but 'correct', but it's a pretty good
+ * effect anyways, as long as the surface is jiggling
+ * enough that you can't tell. Sure, it seems kind of odd
+ * that it's reflecting a sky that's obviously not there,
+ * but who has time to worry about silly details like
+ * that? Not me, ah rekkin'. km
+ *
+ */
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 20000\n" \
+ "*showFPS: False\n" \
+ "*wireframe: False\n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_jigglypuff 0
+# define release_jigglypuff 0
+# include "xlockmore.h"
+#else
+# include "xlock.h"
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "ximage-loader.h"
+#include "gltrackball.h"
+#include "images/gen/jigglymap_png.h"
+
+#ifdef USE_GL
+
+
+#define DEF_COLOR "cycle"
+#define DEF_SHININESS "100"
+#define DEF_COMPLEXITY "2"
+#define DEF_SPEED "500"
+#define DEF_DISTANCE "100"
+#define DEF_HOLD "800"
+#define DEF_SPHERISM "75"
+#define DEF_DAMPING "500"
+#define DEF_RANDOM "True"
+#define DEF_TETRA "False"
+#define DEF_SPOOKY "0"
+
+#ifndef max
+#define max(a,b) (((a)>(b))?(a):(b))
+#define min(a,b) (((a)<(b))?(a):(b))
+#endif
+
+/* Why isn't RAND_MAX correct in the first place? */
+#define REAL_RAND_MAX (2.0*(float)RAND_MAX)
+
+static int spherism;
+static int hold;
+static int distance;
+static int damping;
+
+static int complexity;
+static int speed;
+
+static int do_tetrahedron;
+static int spooky;
+static char *color;
+static int shininess;
+
+static int random_parms;
+
+typedef struct solid solid;
+
+typedef struct {
+ float stable_distance;
+ float hold_strength;
+ float spherify_strength;
+ float damping_velocity;
+ float damping_factor;
+
+ int do_wireframe;
+ int spooky;
+ int color_style;
+ GLint shininess;
+ GLfloat jiggly_color[4];
+ GLfloat color_dir[3];
+
+ solid *shape;
+
+ trackball_state *trackball;
+ int button_down;
+
+ float angle;
+ float axis;
+ float speed;
+
+ GLXContext *glx_context;
+} jigglystruct;
+
+static jigglystruct *jss = NULL;
+
+static XrmOptionDescRec opts[] = {
+ {"-random", ".Jigglypuff.random", XrmoptionNoArg, "true"},
+ {"+random", ".Jigglypuff.random", XrmoptionNoArg, "false"},
+ {"-tetra", ".Jigglypuff.tetra", XrmoptionNoArg, "true"},
+ {"+tetra", ".Jigglypuff.tetra", XrmoptionNoArg, "false"},
+ {"-spooky", ".Jigglypuff.spooky", XrmoptionSepArg, "0"},
+ {"-color", ".Jigglypuff.color", XrmoptionSepArg, DEF_COLOR},
+ {"-shininess", ".Jigglypuff.shininess", XrmoptionSepArg, DEF_SHININESS},
+ {"-complexity", ".Jigglypuff.complexity", XrmoptionSepArg, DEF_COMPLEXITY},
+ {"-speed", ".Jigglypuff.speed", XrmoptionSepArg, DEF_SPEED},
+ {"-spherism", ".Jigglypuff.spherism", XrmoptionSepArg, DEF_SPHERISM},
+ {"-hold", ".Jigglypuff.hold", XrmoptionSepArg, DEF_HOLD},
+ {"-distance", "Jigglypuff.distance", XrmoptionSepArg, DEF_DISTANCE},
+ {"-damping", "Jigglypuff.damping", XrmoptionSepArg, DEF_DAMPING}
+};
+
+static argtype vars[] = {
+ {&random_parms, "random", "Random", DEF_RANDOM, t_Bool},
+ {&do_tetrahedron, "tetra", "Tetra", DEF_TETRA, t_Bool},
+ {&spooky, "spooky", "Spooky", DEF_SPOOKY, t_Int},
+ {&color, "color", "Color", DEF_COLOR, t_String},
+ {&shininess, "shininess", "Shininess", DEF_SHININESS, t_Int},
+ {&complexity, "complexity", "Complexity", DEF_COMPLEXITY, t_Int},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Int},
+ {&spherism, "spherism", "Spherism", DEF_SPHERISM, t_Int},
+ {&hold, "hold", "Hold", DEF_HOLD, t_Int},
+ {&distance, "distance", "Distance", DEF_DISTANCE, t_Int},
+ {&damping, "damping", "Damping", DEF_DAMPING, t_Int}
+};
+
+#undef countof
+#define countof(x) ((int)(sizeof(x)/sizeof(*(x))))
+
+ENTRYPOINT ModeSpecOpt jigglypuff_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#define COLOR_STYLE_NORMAL 0
+#define COLOR_STYLE_CYCLE 1
+#define COLOR_STYLE_CLOWNBARF 2
+#define COLOR_STYLE_FLOWERBOX 3
+#define COLOR_STYLE_CHROME 4
+
+#define CLOWNBARF_NCOLORS 5
+
+static const GLfloat clownbarf_colors[CLOWNBARF_NCOLORS][4] = {
+ {0.7, 0.7, 0.0, 1.0},
+ {0.8, 0.1, 0.1, 1.0},
+ {0.1, 0.1, 0.8, 1.0},
+ {0.9, 0.9, 0.9, 1.0},
+ {0.0, 0.0, 0.0, 1.0}
+};
+
+static const GLfloat flowerbox_colors[4][4] = {
+ {0.7, 0.7, 0.0, 1.0},
+ {0.9, 0.0, 0.0, 1.0},
+ {0.0, 0.9, 0.0, 1.0},
+ {0.0, 0.0, 0.9, 1.0},
+};
+
+# if 0 /* I am not even going to *try* and make this bullshit compile
+ without warning under gcc -std=c89 -pedantic. -jwz. */
+#ifdef DEBUG
+# ifdef __GNUC__ /* GCC style */
+#define _DEBUG(msg, args...) do { \
+ fprintf(stderr, "%s : %d : " msg ,__FILE__,__LINE__ ,##args); \
+} while(0)
+# else /* C99 standard style */
+#define _DEBUG(msg, ...) do { \
+ fprintf(stderr, "%s : %d : " msg ,__FILE__,__LINE__,__VA_ARGS__); \
+} while(0)
+# endif
+#else
+# ifdef __GNUC__ /* GCC style */
+#define _DEBUG(msg, args...)
+# else /* C99 standard style */
+#define _DEBUG(msg, ...)
+# endif
+#endif
+#endif /* 0 */
+
+/* This is all the half-edge b-rep code (as well as basic geometry) */
+typedef struct face face;
+typedef struct edge edge;
+typedef struct hedge hedge;
+typedef struct vertex vertex;
+typedef GLfloat coord;
+typedef coord vector[3];
+
+struct solid {
+ face *faces;
+ edge *edges;
+ vertex *vertices;
+};
+
+struct face {
+ solid *s;
+ hedge *start;
+ const GLfloat *color;
+ face *next;
+};
+
+struct edge {
+ solid *s;
+ hedge *left;
+ hedge *right;
+ edge *next;
+};
+
+struct hedge {
+ face *f;
+ edge *e;
+ vertex *vtx;
+ hedge *next;
+ hedge *prev;
+};
+
+struct vertex {
+ solid *s;
+ hedge *h;
+ vector v;
+ vector n;
+ vector f;
+ vector vel;
+ vertex *next;
+};
+
+static inline void vector_init(vector v, coord x, coord y, coord z)
+{
+ v[0] = x;
+ v[1] = y;
+ v[2] = z;
+}
+
+static inline void vector_copy(vector d, vector s)
+{
+ d[0] = s[0];
+ d[1] = s[1];
+ d[2] = s[2];
+}
+
+static inline void vector_add(vector v1, vector v2, vector v)
+{
+ vector_init(v, v1[0]+v2[0], v1[1]+v2[1], v1[2]+v2[2]);
+}
+
+static inline void vector_add_to(vector v1, vector v2)
+{
+ v1[0] += v2[0];
+ v1[1] += v2[1];
+ v1[2] += v2[2];
+}
+
+static inline void vector_sub(vector v1, vector v2, vector v)
+{
+ vector_init(v, v1[0]-v2[0], v1[1]-v2[1], v1[2]-v2[2]);
+}
+
+static inline void vector_scale(vector v, coord s)
+{
+ v[0] *= s;
+ v[1] *= s;
+ v[2] *= s;
+}
+
+/*
+static inline coord dot(vector v1, vector v2)
+{
+ return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
+}
+*/
+
+static inline void cross(vector v1, vector v2, vector v)
+{
+ vector_init(v,
+ v1[1]*v2[2] - v2[1]*v1[2],
+ v1[2]*v2[0] - v2[2]*v1[0],
+ v1[0]*v2[1] - v2[0]*v1[1]);
+}
+
+static inline coord magnitude2(vector v)
+{
+ return v[0]*v[0] + v[1]*v[1] + v[2]*v[2];
+}
+
+static inline coord magnitude(vector v)
+{
+ return sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
+}
+
+static inline void normalize(vector v)
+{
+ coord mag = 1.0/sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
+
+ v[0] *= mag;
+ v[1] *= mag;
+ v[2] *= mag;
+}
+
+static inline void normalize_to(vector v, coord m)
+{
+ coord mag = 1.0/sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2])/m;
+
+ v[0] *= mag;
+ v[1] *= mag;
+ v[2] *= mag;
+}
+
+static inline void midpoint(vector v1, vector v2, vector v)
+{
+ vector_init(v,
+ v1[0] + 0.5 * (v2[0] - v1[0]),
+ v1[1] + 0.5 * (v2[1] - v1[1]),
+ v1[2] + 0.5 * (v2[2] - v1[2]));
+}
+
+static inline hedge *partner(hedge *h) {
+ if(!h->e)
+ return NULL;
+ if(h == h->e->left) {
+ return h->e->right;
+ }
+ else if(h == h->e->right) {
+ return h->e->left;
+ }
+ else {
+/* _DEBUG("Inconsistent edge detected. Presumably, this is a bug. Exiting.\n", NULL); */
+ exit(-1);
+ }
+}
+
+static vertex *vertex_new(solid *s, vector v)
+{
+ vertex *vtx = (vertex*)malloc(sizeof(vertex));
+
+ if(!vtx)
+ return NULL;
+ vtx->s = s;
+ vtx->next = s->vertices;
+ s->vertices = vtx;
+ vector_copy(vtx->v, v);
+ vector_init(vtx->f, 0, 0, 0);
+ vector_init(vtx->vel, 0, 0, 0);
+ return vtx;
+}
+
+/* insert a new halfedge after hafter. this is low-level,
+ * i.e. it is a helper for the split_* functions, which
+ * maintain the consistency of the solid.
+ */
+static hedge *hedge_new(hedge *hafter, vertex *vtx)
+{
+ hedge *h = (hedge*)malloc(sizeof(hedge));
+
+ if(!h) {
+/* _DEBUG("Out of memory in hedge_new()\n",NULL); */
+ return NULL;
+ }
+ h->f = hafter->f;
+ h->vtx = vtx;
+ h->e = NULL;
+ h->prev = hafter;
+ h->next = hafter->next;
+ hafter->next = h;
+ h->next->prev = h;
+ return h;
+}
+
+static edge *edge_new(solid *s)
+{
+ edge *e = (edge*)malloc(sizeof(edge));
+ if(!e) {
+/* _DEBUG("Out of memory in edge_new()\n",NULL);*/
+ exit(-1);
+ }
+ e->next = s->edges;
+ s->edges = e;
+ e-> s = s;
+ e->left = e->right = NULL;
+ return e;
+}
+
+static face *face_new(solid *s, hedge *h)
+{
+ face *f = (face*)malloc(sizeof(face));
+ if(!f) {
+/* _DEBUG("Out of memory in face_new()",NULL);*/
+ exit(-1);
+ }
+ f->s = s;
+ f->start = h;
+ f->next = s->faces;
+ s->faces = f;
+ return f;
+}
+
+/* split vertex vtx, creating a new edge after v on f
+ * that goes to a new vertex at v, adjoining whatever
+ * face is on the other side of the halfedge attached to
+ * v on f.
+ * Assumptions:
+ * there are at least 2 faces.
+ * partner(h)->next->vtx == vtx
+ * Post-assumptions:
+ * the new halfedge will be inserted AFTER the indicated
+ * halfedge. This means that f->start is guaranteed not to
+ * change.
+ * the vertex returned will have h==<the new halfedge>.
+ */
+
+static vertex *vertex_split(hedge *h, vector v)
+{
+ hedge *h2, *hn1, *hn2;
+ vertex *vtxn;
+ edge *en;
+ face *f1;
+
+ f1 = h->f;
+ h2 = partner(h);
+
+ vtxn = vertex_new(f1->s, v);
+ hn1 = hedge_new(h, vtxn);
+ vtxn->h = hn1;
+ hn2 = hedge_new(h2, vtxn);
+ hn2->e = h->e;
+
+ if(h2->e->left == h2)
+ h2->e->left = hn2;
+ else
+ h2->e->right = hn2;
+
+ en = edge_new(f1->s);
+ en->left = hn1;
+ en->right = h2;
+ hn1->e = en;
+ h2->e = en;
+ return vtxn;
+}
+
+static face *face_split(face *f, hedge *h1, hedge *h2)
+{
+ hedge *hn1, *hn2, *tmp;
+ edge *en;
+ face *fn;
+
+ if(h1->f != f || h2->f != f) {
+/* _DEBUG("Whoah, cap'n, yer usin' a bad halfedge!\n",NULL);*/
+ exit(-1);
+ }
+ if(h1 == h2) {
+/* _DEBUG("Trying to split a face at a single vertex\n",NULL);*/
+ exit(-1);
+ }
+ /* close the loops */
+ h1->prev->next = h2;
+ h2->prev->next = h1;
+ tmp = h1->prev;
+ h1->prev = h2->prev;
+ h2->prev = tmp;
+ /* insert halfedges & create edge */
+ hn1 = hedge_new(h2->prev, h1->vtx);
+ hn2 = hedge_new(h1->prev, h2->vtx);
+ en = edge_new(f->s);
+ en->left = hn1;
+ en->right = hn2;
+ hn1->e = en;
+ hn2->e = en;
+
+ /* make the new face, first find out which hedge is contained
+ * in the original face, then start the new face at the other */
+ tmp = f->start;
+ while(tmp != h1 && tmp != h2)
+ tmp = tmp->next;
+ tmp = (tmp == h1) ? h2 : h1 ;
+ fn = face_new(f->s, tmp);
+ do {
+ tmp->f = fn;
+ tmp = tmp->next;
+ } while(tmp != fn->start);
+ fn->color = f->color;
+ return fn;
+}
+
+static solid *solid_new(vector where)
+{
+ solid *s = (solid*)malloc(sizeof(solid));
+ face *f1, *f2;
+ edge *e;
+ vertex *vtx;
+ hedge *h1,*h2;
+
+ s->faces = NULL;
+ s->edges = NULL;
+ s->vertices = NULL;
+
+ h1 = (hedge*)malloc(sizeof(hedge));
+ h2 = (hedge*)malloc(sizeof(hedge));
+ h1->next = h1->prev = h1;
+ h2->next = h2->prev = h2;
+
+ vtx = vertex_new(s, where);
+ vtx->h = h1;
+ h1->vtx = vtx;
+ h2->vtx = vtx;
+
+ e = edge_new(s);
+ e->left = h1;
+ e->right = h2;
+ h1->e = e;
+ h2->e = e;
+
+ f1 = face_new(s, h1);
+ f2 = face_new(s, h2);
+ h1->f = f1;
+ h2->f = f2;
+
+ return s;
+}
+
+/* This is all the code directly related to constructing the jigglypuff */
+static void face_tessel2(face *f)
+{
+ hedge *h1=f->start->prev, *h2=f->start->next;
+
+ if(h1->next == h1)
+ return;
+ while(h2 != h1 && h2->next != h1) {
+ f = face_split(f, h1, h2);
+ h1 = f->start;
+ h2 = f->start->next->next;
+ }
+}
+
+/* This will only work with solids composed entirely of
+ * triangular faces. It first add a vertex to the middle
+ * of each edge, then walks the faces, connecting the
+ * dots.
+ * I'm abusing the fact that new faces and edges are always
+ * added at the head of the list. If that ever changes,
+ * this is borked.
+ */
+static void solid_tesselate(solid *s)
+{
+ edge *e = s->edges;
+ face *f = s->faces;
+
+ while(e) {
+ vector v;
+ midpoint(e->left->vtx->v, e->right->vtx->v, v);
+ vertex_split(e->left, v);
+ e = e->next;
+ }
+ while(f) {
+ face_tessel2(f);
+ f=f->next;
+ }
+}
+
+static void solid_spherify(solid * s, coord size)
+{
+ vertex *vtx = s->vertices;
+
+ while(vtx) {
+ normalize_to(vtx->v, size);
+ vtx = vtx->next;
+ }
+}
+
+static solid *tetrahedron(jigglystruct *js)
+{
+ solid *s;
+ vertex *vtx;
+ vector v;
+ hedge *h;
+ face *f;
+ int i;
+
+ vector_init(v, 1, 1, 1);
+ s = solid_new(v);
+ vector_init(v, -1, -1, 1);
+ h = s->faces->start;
+ vtx = vertex_split(h, v);
+ vector_init(v, -1, 1, -1);
+ vtx = vertex_split(vtx->h, v);
+ h = vtx->h;
+ f = face_split(s->faces, h, h->prev);
+ vector_init(v, 1, -1, -1);
+ vertex_split(f->start, v);
+ f = s->faces->next->next;
+ h = f->start;
+ face_split(f, h, h->next->next);
+
+ if(js->color_style == COLOR_STYLE_FLOWERBOX) {
+ f = s->faces;
+ for(i=0; i<4; i++) {
+ f->color = flowerbox_colors[i];
+ f = f->next;
+ }
+ }
+
+ return s;
+}
+
+static solid *tesselated_tetrahedron(coord size, int iter, jigglystruct *js) {
+ solid *s = tetrahedron(js);
+ int i;
+
+ for(i=0; i<iter; i++) {
+ solid_tesselate(s);
+ }
+ return s;
+}
+
+static void clownbarf_colorize(solid *s) {
+ face *f = s->faces;
+ while(f) {
+ f->color = clownbarf_colors[random() % CLOWNBARF_NCOLORS];
+ f = f->next;
+ }
+}
+
+/* Here be the rendering code */
+
+static inline void vertex_calcnormal(vertex *vtx, jigglystruct *js)
+{
+ hedge *start = vtx->h, *h=start;
+
+ vector_init(vtx->n, 0, 0, 0);
+ do {
+ vector u, v, norm;
+ vector_sub(h->prev->vtx->v, vtx->v, u);
+ vector_sub(h->next->vtx->v, vtx->v, v);
+ cross(u, v, norm);
+ vector_add_to(vtx->n, norm);
+ h = partner(h)->next;
+ } while(h != start);
+ if(!js->spooky)
+ normalize(vtx->n);
+ else
+ vector_scale(vtx->n, js->spooky);
+}
+
+static inline void vertex_render(vertex *vtx, jigglystruct *js)
+{
+ glNormal3fv(vtx->n);
+ glVertex3fv(vtx->v);
+}
+
+/* This can be optimized somewhat due to the fact that all
+ * the faces are triangles. I haven't actually tested to
+ * see what the cost is of calling glBegin/glEnd for each
+ * triangle.
+ */
+static inline int face_render(face *f, jigglystruct *js)
+{
+ hedge *h1, *h2, *hend;
+ int polys = 0;
+
+ h1 = f->start;
+ hend = h1->prev;
+ h2 = h1->next;
+
+ if(js->color_style == COLOR_STYLE_FLOWERBOX ||
+ js->color_style == COLOR_STYLE_CLOWNBARF)
+ glColor4fv(f->color);
+ glBegin(GL_TRIANGLES);
+ while(h1 != hend && h2 !=hend) {
+ vertex_render(h1->vtx, js);
+ vertex_render(h2->vtx, js);
+ vertex_render(hend->vtx, js);
+ h1 = h2;
+ h2 = h1->next;
+ polys++;
+ }
+ glEnd();
+ return polys;
+}
+
+static int jigglypuff_render(jigglystruct *js)
+{
+ int polys = 0;
+ face *f = js->shape->faces;
+ vertex *vtx = js->shape->vertices;
+
+ while(vtx) {
+ vertex_calcnormal(vtx, js);
+ vtx = vtx->next;
+ }
+ while(f) {
+ polys += face_render(f, js);
+ f=f->next;
+ }
+ return polys;
+}
+
+/* This is the jiggling code */
+
+/* stable distance when subdivs == 4 */
+#define STABLE_DISTANCE 0.088388347648
+
+static void update_shape(jigglystruct *js)
+{
+ vertex *vtx = js->shape->vertices;
+ edge *e = js->shape->edges;
+ vector zero;
+
+ vector_init(zero, 0, 0, 0);
+
+ /* sum all the vertex-vertex forces */
+ while(e) {
+ vector f;
+ coord mag;
+ vector_sub(e->left->vtx->v, e->right->vtx->v, f);
+ mag = js->stable_distance - magnitude(f);
+ vector_scale(f, mag);
+ vector_add_to(e->left->vtx->f, f);
+ vector_sub(zero, f, f);
+ vector_add_to(e->right->vtx->f, f);
+ e = e->next;
+ }
+
+ /* scale back the v-v force and add the spherical force
+ * then add the result to the vertex velocity, damping
+ * if necessary. Finally, move the vertex */
+ while(vtx) {
+ coord mag;
+ vector to_sphere;
+ vector_scale(vtx->f, js->hold_strength);
+ vector_copy(to_sphere, vtx->v);
+ mag = 1 - magnitude(to_sphere);
+ vector_scale(to_sphere, mag * js->spherify_strength);
+ vector_add_to(vtx->f, to_sphere);
+ vector_add_to(vtx->vel, vtx->f);
+ vector_init(vtx->f, 0, 0, 0);
+ mag = magnitude2(vtx->vel);
+ if(mag > js->damping_velocity)
+ vector_scale(vtx->vel, js->damping_factor);
+ vector_add_to(vtx->v, vtx->vel);
+ vtx = vtx->next;
+ }
+}
+
+/* These are the various initialization routines */
+
+static void init_texture(ModeInfo *mi)
+{
+ XImage *img = image_data_to_ximage(mi->dpy, mi->xgwa.visual,
+ jigglymap_png, sizeof(jigglymap_png));
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
+ img->width, img->height, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, img->data);
+
+ XDestroyImage(img);
+}
+
+static void setup_opengl(ModeInfo *mi, jigglystruct *js)
+{
+ const GLfloat lpos0[4] = {-12, 8, 12, 0};
+ const GLfloat lpos1[4] = {7, -5, 0, 0};
+ const GLfloat lcol0[4] = {0.7f, 0.7f, 0.65f, 1};
+ const GLfloat lcol1[4] = {0.3f, 0.2f, 0.1f, 1};
+ const GLfloat scolor[4]= {0.9f, 0.9f, 0.9f, 0.5f};
+
+ glDrawBuffer(GL_BACK);
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+
+ if(js->do_wireframe) {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ }
+ else {
+ glCullFace(GL_BACK);
+ glFrontFace(GL_CW);
+ glEnable(GL_CULL_FACE);
+ }
+
+ if(js->color_style != COLOR_STYLE_CHROME) {
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, lpos0);
+ glLightfv(GL_LIGHT1, GL_POSITION, lpos1);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, lcol0);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, lcol1);
+
+ glEnable(GL_COLOR_MATERIAL);
+ glColor4fv(js->jiggly_color);
+
+ glMaterialfv(GL_FRONT, GL_SPECULAR, scolor);
+ glMateriali(GL_FRONT, GL_SHININESS, js->shininess);
+ }
+ else { /* chrome */
+ init_texture(mi);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+ glEnable(GL_TEXTURE_2D);
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ }
+}
+
+static int parse_color(jigglystruct *js)
+{
+ unsigned int r, g, b;
+ if(!strcmp(color, "clownbarf")) {
+ js->color_style = COLOR_STYLE_CLOWNBARF;
+ return 1;
+ }
+ else if(!strcmp(color, "flowerbox")) {
+ js->color_style = COLOR_STYLE_FLOWERBOX;
+ return 1;
+ }
+# ifndef HAVE_JWZGLES /* SPHERE_MAP unimplemented */
+ else if(!strcmp(color, "chrome")) {
+ js->color_style = COLOR_STYLE_CHROME;
+ return 1;
+ }
+# endif
+ else if(!strcmp(color, "cycle")) {
+ js->color_style = COLOR_STYLE_CYCLE;
+ js->jiggly_color[0] = ((float)random()) / REAL_RAND_MAX * 0.7 + 0.3;
+ js->jiggly_color[1] = ((float)random()) / REAL_RAND_MAX * 0.7 + 0.3;
+ js->jiggly_color[2] = ((float)random()) / REAL_RAND_MAX * 0.7 + 0.3;
+ js->jiggly_color[3] = 1.0f;
+ js->color_dir[0] = ((float)random()) / REAL_RAND_MAX / 100.0;
+ js->color_dir[1] = ((float)random()) / REAL_RAND_MAX / 100.0;
+ js->color_dir[2] = ((float)random()) / REAL_RAND_MAX / 100.0;
+ return 1;
+ }
+ else
+ js->color_style = 0;
+ if(strlen(color) != 7)
+ return 0;
+ if(sscanf(color,"#%02x%02x%02x", &r, &g, &b) != 3) {
+ return 0;
+ }
+ js->jiggly_color[0] = ((float)r)/255;
+ js->jiggly_color[1] = ((float)g)/255;
+ js->jiggly_color[2] = ((float)b)/255;
+ js->jiggly_color[3] = 1.0f;
+
+ return 1;
+}
+
+static void randomize_parameters(jigglystruct *js) {
+ do_tetrahedron = random() & 1;
+# ifndef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ js->do_wireframe = !(random() & 3);
+# endif
+ js->color_style = random() % 5;
+# ifdef HAVE_JWZGLES /* #### SPHERE_MAP unimplemented */
+ while (js->color_style == COLOR_STYLE_CHROME)
+ js->color_style = random() % 5;;
+# endif
+ if(js->color_style == COLOR_STYLE_NORMAL
+ || js->color_style == COLOR_STYLE_CYCLE) {
+ js->jiggly_color[0] = ((float)random()) / REAL_RAND_MAX * 0.5 + 0.5;
+ js->jiggly_color[1] = ((float)random()) / REAL_RAND_MAX * 0.5 + 0.5;
+ js->jiggly_color[2] = ((float)random()) / REAL_RAND_MAX * 0.5 + 0.5;
+ js->jiggly_color[3] = 1.0f;
+ if(js->color_style == COLOR_STYLE_CYCLE) {
+ js->color_dir[0] = ((float)random()) / REAL_RAND_MAX / 100.0;
+ js->color_dir[1] = ((float)random()) / REAL_RAND_MAX / 100.0;
+ js->color_dir[2] = ((float)random()) / REAL_RAND_MAX / 100.0;
+ }
+ }
+ if((js->color_style != COLOR_STYLE_CHROME) && (random() & 1))
+ js->spooky = (random() % 6) + 4;
+ else
+ js->spooky = 0;
+ js->shininess = random() % 200;
+ speed = (random() % 700) + 50;
+ /* It' kind of dull if this is too high when it starts as a sphere */
+ spherism = do_tetrahedron ? (random() % 500) + 20 : (random() % 100) + 10;
+ hold = (random() % 800) + 100;
+ distance = (random() % 500) + 100;
+ damping = (random() % 800) + 50;
+}
+
+static void calculate_parameters(jigglystruct *js, int subdivs) {
+ /* try to compensate for the inherent instability at
+ * low complexity. */
+ float dist_factor = (subdivs == 6) ? 2 : (subdivs == 5) ? 1 : 0.5;
+
+ js->stable_distance = ((float)distance / 500.0)
+ * (STABLE_DISTANCE / dist_factor);
+ js->hold_strength = (float)hold / 10000.0;
+ js->spherify_strength = (float)spherism / 10000.0;
+ js->damping_velocity = (float)damping / 100000.0;
+ js->damping_factor =
+ 0.001/max(js->hold_strength, js->spherify_strength);
+
+ js->speed = (float)speed / 1000.0;
+}
+
+/* The screenhack related functions begin here */
+
+ENTRYPOINT Bool jigglypuff_handle_event(ModeInfo *mi, XEvent *event)
+{
+ jigglystruct *js = &jss[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, js->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &js->button_down))
+ return True;
+
+ return False;
+}
+
+ENTRYPOINT void reshape_jigglypuff(ModeInfo *mi, int width, int height)
+{
+ double h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0, y, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-0.5*(1/h), 0.5*(1/h), -0.5, 0.5, 1, 20);
+}
+
+ENTRYPOINT void draw_jigglypuff(ModeInfo *mi)
+{
+ jigglystruct *js = &jss[MI_SCREEN(mi)];
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(js->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0,0,-10);
+
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glRotatef(js->angle, sin(js->axis), cos(js->axis), -sin(js->axis));
+ glTranslatef(0, 0, 5);
+ if(!(js->button_down)) {
+ if((js->angle += js->speed) >= 360.0f ) {
+ js->angle -= 360.0f;
+ }
+ if((js->axis+=0.01f) >= 2*M_PI ) {
+ js->axis -= 2*M_PI;
+ }
+ }
+
+ gltrackball_rotate(js->trackball);
+
+ if(js->color_style == COLOR_STYLE_CYCLE) {
+ int i;
+ vector_add(js->jiggly_color, js->color_dir, js->jiggly_color);
+
+ for(i=0; i<3; i++) {
+ if(js->jiggly_color[i] > 1.0 || js->jiggly_color[i] < 0.3) {
+ js->color_dir[i] = (-js->color_dir[i]);
+ js->jiggly_color[i] += js->color_dir[i];
+ }
+ }
+ glColor4fv(js->jiggly_color);
+ }
+
+ mi->polygon_count = jigglypuff_render(js);
+ if(MI_IS_FPS(mi))
+ do_fps(mi);
+ glFinish();
+ update_shape(js);
+ glXSwapBuffers(MI_DISPLAY(mi), MI_WINDOW(mi));
+}
+
+ENTRYPOINT void init_jigglypuff(ModeInfo *mi)
+{
+ jigglystruct *js;
+ int subdivs;
+
+ MI_INIT(mi, jss);
+
+ js = &jss[MI_SCREEN(mi)];
+
+ js->do_wireframe = MI_IS_WIREFRAME(mi);
+# ifdef HAVE_JWZGLES
+ js->do_wireframe = 0; /* GL_LINE unimplemented */
+# endif
+
+ js->shininess = shininess;
+
+ subdivs = (complexity==1) ? 4 : (complexity==2) ? 5
+ : (complexity==3) ? 6 : 5;
+
+ js->spooky = spooky << (subdivs-3);
+
+ if(!parse_color(js)) {
+ fprintf(stderr, "%s: Bad color specification: '%s'.\n", progname, color);
+ exit(-1);
+ }
+
+ if(random_parms)
+ randomize_parameters(js);
+
+ js->angle = frand(180);
+ js->axis = frand(M_PI);
+
+ js->shape = tesselated_tetrahedron(1, subdivs, js);
+
+ if(!do_tetrahedron)
+ solid_spherify(js->shape, 1);
+
+ if(js->color_style == COLOR_STYLE_CLOWNBARF)
+ clownbarf_colorize(js->shape);
+
+ calculate_parameters(js, subdivs);
+
+ if((js->glx_context = init_GL(mi)) != NULL) {
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(js->glx_context));
+ setup_opengl(mi, js);
+ reshape_jigglypuff(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ }
+ else {
+ MI_CLEARWINDOW(mi);
+ }
+ js->trackball = gltrackball_init(True);
+/* _DEBUG("distance : %f\nhold : %f\nspherify : %f\ndamping : %f\ndfact : %f\n",
+ js->stable_distance, js->hold_strength, js->spherify_strength,
+ js->damping_velocity, js->damping_factor);
+ _DEBUG("wire : %d\nspooky : %d\nstyle : %d\nshininess : %d\n",
+ js->do_wireframe, js->spooky, js->color_style, js->shininess);*/
+}
+
+XSCREENSAVER_MODULE ("JigglyPuff", jigglypuff)
+
+#endif /* USE_GL */
+
+/* This is the end of the file */
diff --git a/hacks/glx/jigglypuff.man b/hacks/glx/jigglypuff.man
new file mode 100644
index 0000000..4a5f8bf
--- /dev/null
+++ b/hacks/glx/jigglypuff.man
@@ -0,0 +1,121 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+jigglypuff - save your screen by tormenting your eyes.
+.SH SYNOPSIS
+.B jigglypuff
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[-delay \fInumber\fP]
+[-cycles \fInumber\fP]
+[-wireframe]
+[-fps]
+[-color \fIcolorspec\fP]
+[-spooky]
+[-complexity \fIn\fP]
+[-speed \fIn\fP]
+[-spherism \fIn\fP]
+[-hold \fIn\fP]
+[-distance \fIn\fP]
+[-damping \fIn\fP]
+.SH DESCRIPTION
+This draws all manners of obscene, spastic, puffy, vaguely ball-shaped
+objects orbiting lazily about the screen, with a dizzying array of
+mostly pointless options.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid. Default: render solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.TP 8
+.B -tetra | -no-tetra
+Whether to start the shape in the form of a tetrahedron. The default
+is to start as a sphere.
+.TP 8
+.B -color \fIcolorspec\fP
+Available options for colorspec are: cycle, flowerbox, clownpuke, chrome
+and #xxxxxx (i.e an (old-style) X color specification.) Default: cycle
+.TP 8
+.B -spooky \fIn\fP
+This option controls a kind of interesting effect obtained by
+using unnormalized normal vectors (how's that for an oxymoron?) in OpenGL.
+A value of zero disables the effect. Other values vary the lengths of
+the normals proportionally.
+Okay, so it's not very spooky. Sue me.
+Default: 0
+.TP 8
+.B -complexity \fIn\fP
+Valid options are 1, 2, and 3. Everything else is treated as though it
+were 2, which is the default. This controls the number of polygons in
+the 'thing'. A value of 1 yields 1024, and the values go up in powers
+of 4. (i.e. 4096, 16384.)
+ note: There is an inherent lack of stability
+at lower complexity, which can cause the shape to devolve into a 'flying
+snotrag'.
+.TP 8
+.B -speed \fIn\fP
+Controls how fast the blob moves around the screen. Default: 500.
+.TP 8
+.B -spherism, -hold, -distance, -damping
+These options control the 'jigglyness'. The best way to explain these is
+to explain how jigglypuff works. Basically, the shape is a tetrahedron
+whose faces are subdivided into a number of triangles, forming a mesh.
+Each of the vertices of the mesh has two different forces applied to it:
+one proportional to its distance from the surface of a sphere, and one
+proportional to the difference of the distance to each of its neighbors
+in the mesh to a given ideal distance. In short, one tries to move the
+points into the configuration of a sphere, and the other tries to push
+them back into a tetrahedron. The catch is that the points have inertia,
+so they always overshoot their target, and hence they oscillate. The
+magnitudes of the two forces is controlled by the options 'spherism' and
+\'hold'; 'distance' specifies the distance the vertices seek to keep from
+their neighbors, with 500 corresponding to the size of the start tetrahedron.
+e.g. if you were to give the options '-tetra -spherism 0 -distance 500', you
+would end up with a stable tetrahedron. The 'damping' option can help to
+keep the blob from collapsing or flying apart. The option specifies the
+speed at which damping starts, hence lower values mean more damping.
+Defaults: spherism: 75; hold: 800; distance: 100; damping: 500.
+.TP 8
+.B -random
+Probably the only parameter you'l ever need. Overrides almost all of the
+parameters with random values. The values affected are: speed, spherism,
+hold, distance, damping, spooky, color, wireframe and tetra.
+Default: off
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Keith Macleod. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+By Keith Macleod
diff --git a/hacks/glx/jigsaw.c b/hacks/glx/jigsaw.c
new file mode 100644
index 0000000..934dbcc
--- /dev/null
+++ b/hacks/glx/jigsaw.c
@@ -0,0 +1,1509 @@
+/* xscreensaver, Copyright (c) 1997-2017 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Written as an Xlib program some time in 1997.
+ * Rewritten as an OpenGL program 24-Aug-2008.
+ */
+
+/*
+ Currently, we do this:
+
+ - start pieces off screen and move them in.
+ - when they land, they fill the puzzle grid with a shuffled
+ puzzle (pieces are rotated, too).
+ - swap random pairs of pieces until the puzzle is solved.
+ - scatter the pieces off screen (resulting in black).
+ - load new image and repeat.
+
+ Another idea would be to show the puzzle being solved the way
+ a person would do it:
+
+ - start off with black screen.
+ - assume knowledge of size of grid (position of corners).
+ - find a corner piece, and place it.
+ - while puzzle unsolved:
+ - pick a random piece;
+ - if it is the correct piece for any open edge, place it;
+ - if it fits physically in any rotation at any open edge,
+ place it, then toss it back (show the fake-out).
+ - if it doesn't fit at all, don't animate it at all.
+
+ This would take a long time to solve, I think...
+
+ An even harder idea would involve building up completed "clumps"
+ and sliding them around (a coral growth / accretion approach)
+ */
+
+#define DEF_SPEED "1.0"
+#define DEF_COMPLEXITY "1.0"
+#define DEF_RESOLUTION "100"
+#define DEF_THICKNESS "0.06"
+#define DEF_WOBBLE "True"
+#define DEF_DEBUG "False"
+
+#define DEF_FONT "-*-helvetica-bold-r-normal-*-*-240-*-*-*-*-*-*"
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*font: " DEF_FONT"\n" \
+ "*wireframe: False \n" \
+ "*desktopGrabber: xscreensaver-getimage -no-desktop %s\n" \
+ "*grabDesktopImages: False \n" \
+ "*chooseRandomImages: True \n" \
+ "*suppressRotationAnimation: True\n" \
+
+
+# define free_jigsaw 0
+# define release_jigsaw 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#ifdef HAVE_JWXYZ
+# include "jwxyz.h"
+#else
+# include <X11/Xlib.h>
+# include <GL/gl.h>
+# include <GL/glu.h>
+#endif
+
+#include "xlockmore.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include "spline.h"
+#include "normals.h"
+#include "grab-ximage.h"
+#include "texfont.h"
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#else /* !HAVE_JWZGLES */
+# define HAVE_TESS
+#endif /* !HAVE_JWZGLES */
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+#ifdef USE_GL /* whole file */
+
+#define TOP 0
+#define RIGHT 1
+#define BOTTOM 2
+#define LEFT 3
+
+#define IN -1
+#define FLAT 0
+#define OUT 1
+
+typedef struct jigsaw_configuration jigsaw_configuration;
+
+typedef struct {
+ double x,y,z,r; /* position and Z rotation (in degrees) */
+} XYZR;
+
+
+typedef struct {
+ jigsaw_configuration *jc;
+ int edge[4];
+ GLuint dlist;
+ int polys;
+
+ XYZR home; /* correct position in puzzle */
+ XYZR current; /* where it is right now */
+ XYZR from, to; /* in transit from A to B */
+ double tick; /* 0-1.0, how far from A to B */
+ double arc_height; /* height of apex of curved path from A to B */
+ double tilt, max_tilt;
+
+} puzzle_piece;
+
+
+struct jigsaw_configuration {
+ GLXContext *glx_context;
+ trackball_state *trackball;
+ rotator *rot;
+ Bool button_down_p;
+ texture_font_data *texfont;
+ GLuint loading_dlist;
+
+ int puzzle_width;
+ int puzzle_height;
+ puzzle_piece *puzzle;
+
+ enum { PUZZLE_LOADING_MSG,
+ PUZZLE_LOADING,
+ PUZZLE_UNSCATTER,
+ PUZZLE_SOLVE,
+ PUZZLE_SCATTER } state;
+ double pausing;
+ double tick_speed;
+
+ GLuint texid;
+ GLfloat tex_x, tex_y, tex_width, tex_height, aspect;
+
+ GLuint line_thickness;
+};
+
+static jigsaw_configuration *sps = NULL;
+
+static GLfloat speed;
+static GLfloat complexity_arg;
+static int resolution_arg;
+static GLfloat thickness_arg;
+static Bool wobble_p;
+static Bool debug_p;
+
+static XrmOptionDescRec opts[] = {
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+ { "-complexity", ".complexity", XrmoptionSepArg, 0 },
+ { "-resolution", ".resolution", XrmoptionSepArg, 0 },
+ { "-thickness", ".thickness", XrmoptionSepArg, 0 },
+ { "-wobble", ".wobble", XrmoptionNoArg, "True" },
+ { "+wobble", ".wobble", XrmoptionNoArg, "False" },
+ { "-debug", ".debug", XrmoptionNoArg, "True" },
+};
+
+static argtype vars[] = {
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+ {&complexity_arg, "complexity", "Complexity", DEF_COMPLEXITY, t_Float},
+ {&resolution_arg, "resolution", "Resolution", DEF_RESOLUTION, t_Int},
+ {&thickness_arg, "thickness", "Thickness", DEF_THICKNESS, t_Float},
+ {&wobble_p, "wobble", "Wobble", DEF_WOBBLE, t_Bool},
+ {&debug_p, "debug", "Debug", DEF_DEBUG, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt jigsaw_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Returns a spline describing one edge of a puzzle piece of the given length.
+ */
+static spline *
+make_puzzle_curve (int pixels)
+{
+ double x0 = 0.0000, y0 = 0.0000;
+ double x1 = 0.3333, y1 = 0.1000;
+ double x2 = 0.4333, y2 = 0.0333;
+ double x3 = 0.4666, y3 = -0.0666;
+ double x4 = 0.3333, y4 = -0.1666;
+ double x5 = 0.3666, y5 = -0.2900;
+ double x6 = 0.5000, y6 = -0.3333;
+
+ spline *s = make_spline(20);
+ s->n_controls = 0;
+
+# define PT(x,y) \
+ s->control_x[s->n_controls] = pixels * (x); \
+ s->control_y[s->n_controls] = pixels * (y); \
+ s->n_controls++
+ PT ( x0, y0);
+ PT ( x1, y1);
+ PT ( x2, y2);
+ PT ( x3, y3);
+ PT ( x4, y4);
+ PT ( x5, y5);
+ PT ( x6, y6);
+ PT (1-x5, y5);
+ PT (1-x4, y4);
+ PT (1-x3, y3);
+ PT (1-x2, y2);
+ PT (1-x1, y1);
+ PT (1-x0, y0);
+# undef PT
+
+ compute_spline (s);
+ return s;
+}
+
+
+#ifdef HAVE_TESS
+
+static void
+tess_error_cb (GLenum errorCode)
+{
+ fprintf (stderr, "%s: tesselation error: %s\n",
+ progname, gluErrorString(errorCode));
+ exit (0);
+}
+
+
+static void
+tess_combine_cb (GLdouble coords[3], GLdouble *d[4], GLfloat w[4],
+ GLdouble **dataOut)
+{
+ GLdouble *new = (GLdouble *) malloc (3 * sizeof(*new));
+ new[0] = coords[0];
+ new[1] = coords[1];
+ new[2] = coords[2];
+ *dataOut = new;
+}
+
+
+static void
+tess_vertex_cb (void *vertex_data, void *closure)
+{
+ puzzle_piece *p = (puzzle_piece *) closure;
+ GLdouble *v = (GLdouble *) vertex_data;
+ GLdouble x = v[0];
+ GLdouble y = v[1];
+ GLdouble z = v[2];
+
+ if (p)
+ {
+ GLfloat pw = p->jc->puzzle_width;
+ GLfloat ph = p->jc->puzzle_height;
+
+ GLfloat xx = x / (GLfloat) resolution_arg; /* 0-1 from piece origin */
+ GLfloat yy = y / (GLfloat) resolution_arg;
+ GLdouble tx = (p->home.x + xx) / pw; /* 0-1 from puzzle origin */
+ GLdouble ty = (ph - p->home.y - yy) / ph;
+
+ tx = p->jc->tex_x + (tx * p->jc->tex_width);
+ ty = p->jc->tex_y + (ty * p->jc->tex_height);
+
+ glTexCoord2d (tx, ty);
+ }
+
+ glVertex3d (x, y, z);
+}
+
+#else /* HAVE_TESS */
+
+/* Writes triangles into the array of floats.
+ Returns the number of floats written (triangles * 9).
+ */
+static int
+make_piece_eighth (jigsaw_configuration *jc, const spline *s,
+ int resolution, int type, GLfloat *out,
+ Bool flip_x, Bool flip_y, Bool rotate_p)
+{
+ GLfloat *oout = out;
+ int cx = resolution/2;
+ int cy = resolution/2;
+ int np = (s->n_points / 2) + 1;
+ int last_x = -999999, last_y = -999999;
+ Bool inflected = False;
+ int i;
+
+ if (type == FLAT)
+ {
+ *out++ = cx;
+ *out++ = 0;
+ *out++ = 0;
+
+ *out++ = cx;
+ *out++ = cy;
+ *out++ = 0;
+
+ *out++ = 0;
+ *out++ = 0;
+ *out++ = 0;
+
+ goto END;
+ }
+
+ for (i = (type == IN ? np-1 : 0);
+ (type == IN ? i >= 0 : i < np);
+ i += (type == IN ? -1 : 1))
+ {
+ int x = s->points[i].x;
+ int y = s->points[i].y;
+
+ if (type == IN)
+ y = -y;
+
+ if (last_x != -999999)
+ {
+ if (!inflected &&
+ (type == IN
+ ? x >= last_x
+ : x < last_x))
+ {
+ inflected = True;
+
+ *out++ = cx;
+ *out++ = cy;
+ *out++ = 0;
+
+ *out++ = last_x;
+ *out++ = last_y;
+ *out++ = 0;
+
+ if (type == IN)
+ {
+ cx = 0;
+ cy = 0;
+ }
+ else
+ {
+ cy = y;
+ }
+
+ *out++ = cx;
+ *out++ = cy;
+ *out++ = 0;
+ }
+
+ *out++ = cx;
+ *out++ = cy;
+ *out++ = 0;
+
+ *out++ = last_x;
+ *out++ = last_y;
+ *out++ = 0;
+
+ *out++ = x;
+ *out++ = y;
+ *out++ = 0;
+ }
+
+ last_x = x;
+ last_y = y;
+ }
+ END:
+
+ {
+ int count = out - oout;
+ Bool cw_p;
+
+ if (flip_x)
+ for (i = 0; i < count; i += 3)
+ oout[i] = resolution - oout[i];
+
+ if (flip_y)
+ for (i = 0; i < count; i += 3)
+ oout[i+1] = resolution - oout[i+1];
+
+ cw_p = (type == IN);
+ if (flip_x) cw_p = !cw_p;
+ if (flip_y) cw_p = !cw_p;
+
+ if (cw_p)
+ for (i = 0; i < count; i += 9)
+ {
+ GLfloat x1 = oout[i+0];
+ GLfloat y1 = oout[i+1];
+ GLfloat x2 = oout[i+3];
+ GLfloat y2 = oout[i+4];
+ GLfloat x3 = oout[i+6];
+ GLfloat y3 = oout[i+7];
+ oout[i+0] = x2;
+ oout[i+1] = y2;
+ oout[i+3] = x1;
+ oout[i+4] = y1;
+ oout[i+6] = x3;
+ oout[i+7] = y3;
+ }
+
+ if (rotate_p)
+ for (i = 0; i < count; i += 3)
+ {
+ GLfloat x = oout[i];
+ GLfloat y = oout[i+1];
+ oout[i] = resolution - y;
+ oout[i+1] = x;
+ }
+
+ return count;
+ }
+}
+
+#endif /* !HAVE_TESS */
+
+
+
+/* Draws a puzzle piece. The top/right/bottom/left_type args
+ indicate the direction the tabs point: 1 for out, -1 for in, 0 for flat.
+ */
+static int
+draw_piece (jigsaw_configuration *jc, puzzle_piece *p,
+ int resolution, GLfloat thickness,
+ int top_type, int right_type,
+ int bottom_type, int left_type,
+ Bool wire)
+{
+ spline *s = make_puzzle_curve (resolution);
+ GLdouble *pts = (GLdouble *) malloc (s->n_points * 4 * 3 * sizeof(*pts));
+ int polys = 0;
+ int i, o;
+ GLdouble z = resolution * thickness;
+
+ o = 0;
+ if (top_type == 0) {
+ pts[o++] = 0;
+ pts[o++] = 0;
+ pts[o++] = z;
+
+ pts[o++] = resolution;
+ pts[o++] = 0;
+ pts[o++] = z;
+ } else {
+ for (i = 0; i < s->n_points; i++) {
+ pts[o++] = s->points[i].x;
+ pts[o++] = s->points[i].y * top_type;
+ pts[o++] = z;
+ }
+ }
+
+ if (right_type == 0) {
+ pts[o++] = resolution;
+ pts[o++] = resolution;
+ pts[o++] = z;
+ } else {
+ for (i = 1; i < s->n_points; i++) {
+ pts[o++] = resolution + s->points[i].y * (-right_type);
+ pts[o++] = s->points[i].x;
+ pts[o++] = z;
+ }
+ }
+
+ if (bottom_type == 0) {
+ pts[o++] = 0;
+ pts[o++] = resolution;
+ pts[o++] = z;
+ } else {
+ for (i = 1; i < s->n_points; i++) {
+ pts[o++] = s->points[s->n_points-i-1].x;
+ pts[o++] = resolution + s->points[s->n_points-i-1].y * (-bottom_type);
+ pts[o++] = z;
+ }
+ }
+
+ if (left_type == 0) {
+ pts[o++] = 0;
+ pts[o++] = 0;
+ pts[o++] = z;
+ } else {
+ for (i = 1; i < s->n_points; i++) {
+ pts[o++] = s->points[s->n_points-i-1].y * left_type;
+ pts[o++] = s->points[s->n_points-i-1].x;
+ pts[o++] = z;
+ }
+ }
+
+ { GLfloat ss = 1.0 / resolution; glScalef (ss, ss, ss); }
+
+# ifndef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ glPolygonMode (GL_FRONT_AND_BACK, wire ? GL_LINE : GL_FILL);
+# endif
+
+ if (wire)
+ {
+ glDisable (GL_TEXTURE_2D);
+ glDisable (GL_BLEND);
+ glDisable (GL_LIGHTING);
+ }
+ else
+ {
+# ifdef HAVE_TESS
+
+# ifndef _GLUfuncptr
+# define _GLUfuncptr void(*)(void)
+# endif
+ GLUtesselator *tess = gluNewTess();
+ gluTessCallback(tess, GLU_TESS_BEGIN, (_GLUfuncptr)glBegin);
+ gluTessCallback(tess, GLU_TESS_VERTEX_DATA,(_GLUfuncptr)tess_vertex_cb);
+ gluTessCallback(tess, GLU_TESS_END, (_GLUfuncptr)glEnd);
+ gluTessCallback(tess, GLU_TESS_COMBINE, (_GLUfuncptr)tess_combine_cb);
+ gluTessCallback(tess, GLU_TESS_ERROR, (_GLUfuncptr)tess_error_cb);
+
+ /* front face */
+ glEnable (GL_TEXTURE_2D);
+ glEnable (GL_BLEND);
+ glEnable (GL_LIGHTING);
+ glBindTexture(GL_TEXTURE_2D, jc->texid);
+ glFrontFace (GL_CCW);
+ glNormal3f (0, 0, 1);
+ gluTessBeginPolygon (tess, p);
+ gluTessBeginContour (tess);
+ for (i = 0; i < o; i += 3)
+ {
+ GLdouble *p = pts + i;
+ gluTessVertex (tess, p, p);
+ polys++; /* not quite right but close */
+ }
+ gluTessEndContour(tess);
+ gluTessEndPolygon(tess);
+
+ /* back face */
+ glDisable (GL_TEXTURE_2D);
+ glFrontFace (GL_CW);
+ glNormal3f (0, 0, -1);
+ gluTessBeginPolygon (tess, 0);
+ gluTessBeginContour (tess);
+ for (i = 0; i < o; i += 3)
+ {
+ GLdouble *p = pts + i;
+ p[2] = -p[2];
+ gluTessVertex (tess, p, p);
+ polys++; /* not quite right but close */
+ }
+ gluTessEndContour(tess);
+ gluTessEndPolygon(tess);
+ gluDeleteTess(tess);
+
+ /* Put it back */
+ for (i = 0; i < o; i += 3)
+ {
+ GLdouble *p = pts + i;
+ p[2] = -p[2];
+ }
+
+# else /* !HAVE_TESS */
+
+ GLfloat *tri = (GLfloat *)
+ (GLfloat *) malloc (s->n_points * 4 * 3 * 3 * sizeof(*pts));
+ GLfloat *otri = tri;
+ int count;
+ GLdouble zz;
+
+ tri += make_piece_eighth (jc, s, resolution, top_type, tri, 0, 0, 0);
+ tri += make_piece_eighth (jc, s, resolution, top_type, tri, 1, 0, 0);
+ tri += make_piece_eighth (jc, s, resolution, left_type, tri, 0, 1, 1);
+ tri += make_piece_eighth (jc, s, resolution, left_type, tri, 1, 1, 1);
+ tri += make_piece_eighth (jc, s, resolution, bottom_type, tri, 0, 1, 0);
+ tri += make_piece_eighth (jc, s, resolution, bottom_type, tri, 1, 1, 0);
+ tri += make_piece_eighth (jc, s, resolution, right_type, tri, 0, 0, 1);
+ tri += make_piece_eighth (jc, s, resolution, right_type, tri, 1, 0, 1);
+ count = (tri - otri) / 9;
+
+ if (! wire)
+ {
+ glEnable (GL_TEXTURE_2D);
+ glEnable (GL_BLEND);
+ glEnable (GL_LIGHTING);
+ glBindTexture(GL_TEXTURE_2D, jc->texid);
+ }
+
+ for (zz = z; zz >= -z; zz -= 2*z)
+ {
+ int i;
+ glFrontFace (zz > 0 ? GL_CCW : GL_CW);
+ glNormal3f (0, 0, (zz > 0 ? 1 : -1));
+
+ if (zz < 0)
+ glDisable (GL_TEXTURE_2D); /* back face */
+
+ glPushMatrix();
+ glTranslatef (0, 0, zz);
+
+ tri = otri;
+ if (wire)
+ {
+ for (i = 0; i < count; i++)
+ {
+ glBegin (GL_LINE_LOOP);
+ glVertex3f (tri[0], tri[1], tri[2]); tri += 3;
+ glVertex3f (tri[0], tri[1], tri[2]); tri += 3;
+ glVertex3f (tri[0], tri[1], tri[2]); tri += 3;
+ glEnd();
+ }
+ }
+ else
+ {
+ GLfloat pw = p->jc->puzzle_width;
+ GLfloat ph = p->jc->puzzle_height;
+ GLfloat r = resolution;
+
+ glBegin (GL_TRIANGLES);
+ for (i = 0; i < count * 3; i++)
+ {
+ GLfloat x = *tri++;
+ GLfloat y = *tri++;
+ GLfloat z = *tri++;
+
+ /* 0-1 from piece origin */
+ GLfloat xx = x / r;
+ GLfloat yy = y / r;
+
+ /* 0-1 from puzzle origin */
+ GLfloat tx = (p->home.x + xx) / pw;
+ GLfloat ty = (ph - p->home.y - yy) / ph;
+
+ tx = p->jc->tex_x + (tx * p->jc->tex_width);
+ ty = p->jc->tex_y + (ty * p->jc->tex_height);
+
+ glTexCoord2f (tx, ty);
+ glVertex3f (x, y, z);
+ }
+ glEnd();
+ }
+
+ polys += count;
+ glPopMatrix();
+ }
+
+ free (otri);
+# endif /* !HAVE_TESS */
+ }
+
+ /* side faces */
+
+ glFrontFace (GL_CCW);
+ glBegin (wire ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < o; i += 3)
+ {
+ int j = (i+o-3) % o;
+ int k = (i+3) % o;
+ GLdouble *p = pts + i;
+ GLdouble *pj = pts + j;
+ GLdouble *pk = pts + k;
+
+ do_normal (pj[0], pj[1], pj[2],
+ pj[0], pj[1], -pj[2],
+ pk[0], pk[1], pk[2]);
+
+ glVertex3f (p[0], p[1], p[2]);
+ glVertex3f (p[0], p[1], -p[2]);
+ polys++;
+ }
+ glEnd();
+
+ if (! wire)
+ glColor3f (0.3, 0.3, 0.3);
+
+ /* outline the edges in gray */
+
+ glDisable (GL_TEXTURE_2D);
+ glDisable (GL_LIGHTING);
+ glLineWidth (jc->line_thickness);
+
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < o; i += 3)
+ glVertex3f (pts[i], pts[i+1], pts[i+2]);
+ glEnd();
+ polys += o/3;
+
+ glBegin (GL_LINE_LOOP);
+ for (i = 0; i < o; i += 3)
+ glVertex3f (pts[i], pts[i+1], -pts[i+2]);
+ glEnd();
+ polys += o/3;
+
+ free_spline (s);
+ free (pts);
+
+ return polys;
+}
+
+
+static void
+free_puzzle_grid (jigsaw_configuration *jc)
+{
+ int i;
+ for (i = 0; i < jc->puzzle_width * jc->puzzle_height; i++)
+ glDeleteLists (jc->puzzle[i].dlist, 1);
+ free (jc->puzzle);
+ jc->puzzle = 0;
+ jc->puzzle_width = 0;
+ jc->puzzle_height = 0;
+}
+
+
+static void
+make_puzzle_grid (ModeInfo *mi)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ int x, y;
+ GLfloat size = (8 + (random() % 8)) * complexity_arg;
+
+ if (jc->puzzle)
+ free_puzzle_grid (jc);
+
+ if (wire)
+ jc->aspect = MI_WIDTH(mi) / (float) MI_HEIGHT(mi);
+
+ if (jc->aspect >= 1.0)
+ {
+ jc->puzzle_width = size;
+ jc->puzzle_height = (size + 0.5) / jc->aspect;
+ }
+ else
+ {
+ jc->puzzle_width = (size + 0.5) * jc->aspect;
+ jc->puzzle_height = size;
+ }
+
+ if (jc->puzzle_width < 1) jc->puzzle_width = 1;
+ if (jc->puzzle_height < 1) jc->puzzle_height = 1;
+
+ if (debug_p)
+ fprintf (stderr, "%s: grid %4d x %-4d (%.2f)\n", progname,
+ jc->puzzle_width, jc->puzzle_height,
+ ((float) jc->puzzle_width / jc->puzzle_height));
+
+ jc->puzzle = (puzzle_piece *)
+ calloc (jc->puzzle_width * (jc->puzzle_height+1), sizeof(*jc->puzzle));
+
+ /* Randomize the right and bottom edge of each piece.
+ Match the left edge of the piece to the right to our right edge.
+ Match the top edge of the piece to the bottom to our bottom edge.
+ */
+ for (y = 0; y < jc->puzzle_height; y++)
+ for (x = 0; x < jc->puzzle_width; x++)
+ {
+ puzzle_piece *p = &jc->puzzle [y * jc->puzzle_width + x];
+ puzzle_piece *r = &jc->puzzle [y * jc->puzzle_width + x+1];
+ puzzle_piece *b = &jc->puzzle [(y+1) * jc->puzzle_width + x];
+ p->edge[RIGHT] = (random() & 1) ? IN : OUT;
+ p->edge[BOTTOM] = (random() & 1) ? IN : OUT;
+ r->edge[LEFT] = p->edge[RIGHT] == IN ? OUT : IN;
+ b->edge[TOP] = p->edge[BOTTOM] == IN ? OUT : IN;
+ }
+
+ /* tell each piece where it belongs. */
+ for (y = 0; y < jc->puzzle_height; y++)
+ for (x = 0; x < jc->puzzle_width; x++)
+ {
+ puzzle_piece *p = &jc->puzzle [y * jc->puzzle_width + x];
+ p->jc = jc;
+ p->home.x = x;
+ p->home.y = y;
+ p->current = p->home;
+
+ /* make sure the outer border is flat */
+ if (p->home.x == 0) p->edge[LEFT] = FLAT;
+ if (p->home.y == 0) p->edge[TOP] = FLAT;
+ if (p->home.x == jc->puzzle_width-1) p->edge[RIGHT] = FLAT;
+ if (p->home.y == jc->puzzle_height-1) p->edge[BOTTOM] = FLAT;
+
+ /* generate the polygons */
+ p->dlist = glGenLists (1);
+ check_gl_error ("generating lists");
+ if (p->dlist <= 0) abort();
+
+ glNewList (p->dlist, GL_COMPILE);
+ p->polys += draw_piece (jc, p,
+ resolution_arg, thickness_arg,
+ p->edge[TOP], p->edge[RIGHT],
+ p->edge[BOTTOM], p->edge[LEFT],
+ wire);
+ glEndList();
+ }
+}
+
+
+static void shuffle_grid (ModeInfo *mi);
+
+
+static void
+image_loaded_cb (const char *filename, XRectangle *geometry,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure)
+{
+ ModeInfo *mi = (ModeInfo *) closure;
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+
+ jc->tex_x = geometry->x / (float) texture_width;
+ jc->tex_y = geometry->y / (float) texture_height;
+ jc->tex_width = geometry->width / (float) texture_width;
+ jc->tex_height = geometry->height / (float) texture_height;
+ jc->aspect = geometry->width / (float) geometry->height;
+
+ if (debug_p)
+ {
+ fprintf (stderr, "%s: image %s\n", progname,
+ (filename ? filename : "(null)"));
+ fprintf (stderr, "%s: image %4d x %-4d + %4d + %-4d (%.2f)\n", progname,
+ geometry->width, geometry->height, geometry->x, geometry->y,
+ (float) geometry->width / geometry->height);
+ fprintf (stderr, "%s: tex %4d x %-4d\n", progname,
+ texture_width, texture_height);
+ fprintf (stderr, "%s: tex %4.2f x %4.2f + %4.2f + %4.2f (%.2f)\n",
+ progname,
+ jc->tex_width, jc->tex_height, jc->tex_x, jc->tex_y,
+ (jc->tex_width / jc->tex_height) *
+ (texture_width / texture_height));
+ }
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+ make_puzzle_grid (mi);
+}
+
+
+static void
+load_image (ModeInfo *mi)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ load_texture_async (mi->xgwa.screen, mi->window,
+ *jc->glx_context, 0, 0,
+ False, jc->texid,
+ image_loaded_cb, mi);
+}
+
+
+/* Whether the two pieces are the same shape, when the second piece
+ is rotated by the given degrees.
+ */
+static Bool
+same_shape (puzzle_piece *p0, puzzle_piece *p1, int rotated_by)
+{
+ switch (rotated_by)
+ {
+ case 0:
+ return (p0->edge[0] == p1->edge[0] &&
+ p0->edge[1] == p1->edge[1] &&
+ p0->edge[2] == p1->edge[2] &&
+ p0->edge[3] == p1->edge[3]);
+ case 90:
+ return (p0->edge[0] == p1->edge[1] &&
+ p0->edge[1] == p1->edge[2] &&
+ p0->edge[2] == p1->edge[3] &&
+ p0->edge[3] == p1->edge[0]);
+ case 180:
+ return (p0->edge[0] == p1->edge[2] &&
+ p0->edge[1] == p1->edge[3] &&
+ p0->edge[2] == p1->edge[0] &&
+ p0->edge[3] == p1->edge[1]);
+ case 270:
+ return (p0->edge[0] == p1->edge[3] &&
+ p0->edge[1] == p1->edge[0] &&
+ p0->edge[2] == p1->edge[1] &&
+ p0->edge[3] == p1->edge[2]);
+ default:
+ abort();
+ }
+}
+
+
+/* Returns the proper rotation for the piece at the given position.
+ */
+static int
+proper_rotation (jigsaw_configuration *jc, puzzle_piece *p,
+ double x, double y)
+{
+ puzzle_piece *p1;
+ int cx = x;
+ int cy = y;
+ if (cx != x) abort(); /* must be in integral position! */
+ if (cy != y) abort();
+ p1 = &jc->puzzle [cy * jc->puzzle_width + cx];
+ if (same_shape (p, p1, 0)) return 0;
+ if (same_shape (p, p1, 90)) return 90;
+ if (same_shape (p, p1, 180)) return 180;
+ if (same_shape (p, p1, 270)) return 270;
+ abort(); /* these two pieces don't match in any rotation! */
+}
+
+
+/* Returns the piece currently at the given position.
+ */
+static puzzle_piece *
+piece_at (jigsaw_configuration *jc, double x, double y)
+{
+ int npieces = jc->puzzle_width * jc->puzzle_height;
+ int i;
+ int cx = x;
+ int cy = y;
+ if (cx != x) abort(); /* must be in integral position! */
+ if (cy != y) abort();
+
+ for (i = 0; i < npieces; i++)
+ {
+ puzzle_piece *p = &jc->puzzle [i];
+ if (p->current.x == cx &&
+ p->current.y == cy)
+ return p;
+ }
+ abort(); /* no piece at that position? */
+}
+
+
+static void
+shuffle_grid (ModeInfo *mi)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ int max_tries = jc->puzzle_width * jc->puzzle_height;
+ int npieces = jc->puzzle_width * jc->puzzle_height;
+ int i;
+
+ for (i = 0; i < npieces; i++)
+ {
+ puzzle_piece *p0 = &jc->puzzle [i];
+ puzzle_piece *p1 = 0;
+ int k;
+
+ for (k = 0; k < max_tries; k++)
+ {
+ p1 = &jc->puzzle [random() % npieces];
+ if (same_shape (p0, p1, 0)) break;
+ if (same_shape (p0, p1, 90)) break;
+ if (same_shape (p0, p1, 180)) break;
+ if (same_shape (p0, p1, 270)) break;
+ p1 = 0; /* mismatch */
+ }
+ if (p1 && p0 != p1)
+ {
+ XYZR s;
+ s = p0->current; p0->current = p1->current; p1->current = s;
+ p0->current.r =
+ proper_rotation (jc, p0, p0->current.x, p0->current.y);
+ p1->current.r =
+ proper_rotation (jc, p1, p1->current.x, p1->current.y);
+ }
+ }
+}
+
+
+/* We tend to accumulate floating point errors, e.g., z being 0.000001
+ after a move. This makes sure float values that should be integral are.
+ */
+static void
+smooth_grid (ModeInfo *mi)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ int npieces = jc->puzzle_width * jc->puzzle_height;
+ int i;
+
+ for (i = 0; i < npieces; i++)
+ {
+ puzzle_piece *p = &jc->puzzle [i];
+# define SMOOTH(P) \
+ P.x = (int) (P.x + 0.5); \
+ P.y = (int) (P.y + 0.5); \
+ P.z = (int) (P.z + 0.5); \
+ P.r = (int) (P.r + 0.5)
+ SMOOTH(p->home);
+ SMOOTH(p->current);
+ SMOOTH(p->from);
+ SMOOTH(p->to);
+ if (p->tick <= 0.0001) p->tick = 0.0;
+ if (p->tick >= 0.9999) p->tick = 1.0;
+ }
+}
+
+
+static void
+begin_scatter (ModeInfo *mi, Bool unscatter_p)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ int npieces = jc->puzzle_width * jc->puzzle_height;
+ int i;
+ XYZR ctr = { 0, };
+ ctr.x = jc->puzzle_width / 2;
+ ctr.y = jc->puzzle_height / 2;
+
+ for (i = 0; i < npieces; i++)
+ {
+ puzzle_piece *p = &jc->puzzle [i];
+ XYZ a;
+ double d, r, th;
+ p->tick = -frand(1.0);
+ p->from = p->current;
+
+ a.x = p->from.x - ctr.x; /* position relative to center */
+ a.y = p->from.y - ctr.y;
+
+ r = sqrt (a.x*a.x + a.y*a.y);
+ th = atan2 (a.x, a.y);
+
+ d = MAX (jc->puzzle_width, jc->puzzle_height) * 2;
+ r = r*r + d;
+
+ p->to.x = ctr.x + (r * sin (th));
+ p->to.y = ctr.y + (r * cos (th));
+ p->to.z = p->from.z;
+ p->to.r = ((int) p->from.r + (random() % 180)) % 360;
+ p->arc_height = frand(10.0);
+
+ if (unscatter_p)
+ {
+ XYZR s = p->to; p->to = p->from; p->from = s;
+ p->current = p->from;
+ }
+ }
+}
+
+
+static Bool
+solved_p (ModeInfo *mi)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ int npieces = jc->puzzle_width * jc->puzzle_height;
+ int i;
+
+ for (i = 0; i < npieces; i++)
+ {
+ puzzle_piece *p = &jc->puzzle [i];
+ if (p->current.x != p->home.x ||
+ p->current.y != p->home.y ||
+ p->current.z != p->home.z)
+ return False;
+ }
+ return True;
+}
+
+
+static void
+move_one_piece (ModeInfo *mi)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ int npieces = jc->puzzle_width * jc->puzzle_height;
+ int i;
+
+ for (i = 0; i < npieces * 100; i++) /* shouldn't take that long */
+ {
+ int i = random() % npieces;
+ puzzle_piece *p0 = &jc->puzzle [i];
+ puzzle_piece *p1;
+
+ if (p0->current.x == p0->home.x &&
+ p0->current.y == p0->home.y &&
+ p0->current.z == p0->home.z)
+ continue; /* piece already solved - try again */
+
+ /* swap with the piece occupying p0's home cell. */
+ p1 = piece_at (jc, p0->home.x, p0->home.y);
+
+ if (p0 == p1) abort(); /* should have caught this above */
+
+ p0->tick = 0;
+ p0->from = p0->current;
+ p0->to = p1->current;
+ p0->to.r = proper_rotation (jc, p0, p0->to.x, p0->to.y);
+
+ p1->tick = 0;
+ p1->from = p1->current;
+ p1->to = p0->current;
+ p1->to.r = proper_rotation (jc, p1, p1->to.x, p1->to.y);
+
+ /* Try to avoid having them intersect each other in the air. */
+ p0->arc_height = 0;
+ p1->arc_height = 0;
+ while (fabs (p0->arc_height - p1->arc_height) < 1.5)
+ {
+ p0->arc_height = 0.5 + frand(3.0);
+ p1->arc_height = 1.0 + frand(3.0);
+ }
+
+# define RTILT(V) \
+ V = 90 - BELLRAND(180); \
+ if (! (random() % 5)) V *= 2; \
+ if (! (random() % 5)) V *= 2; \
+ if (! (random() % 5)) V *= 2
+ RTILT (p0->max_tilt);
+ RTILT (p1->max_tilt);
+# undef RTILT
+
+ if (debug_p)
+ fprintf (stderr, "%s: swapping %2d,%-2d with %2d,%d\n", progname,
+ (int) p0->from.x, (int) p0->from.y,
+ (int) p1->from.x, (int) p1->from.y);
+ return;
+ }
+
+ abort(); /* infinite loop! */
+}
+
+
+static Bool
+anim_tick (ModeInfo *mi)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ int npieces = jc->puzzle_width * jc->puzzle_height;
+ int i;
+ Bool finished_p = True;
+
+ if (jc->pausing > 0)
+ {
+ jc->pausing -= jc->tick_speed * speed;
+ if (debug_p && jc->pausing <= 0)
+ fprintf (stderr, "%s: (done pausing)\n", progname);
+ return False;
+ }
+
+ for (i = 0; i < npieces; i++)
+ {
+ puzzle_piece *p = &jc->puzzle [i];
+ double tt;
+
+ if (p->tick >= 1.0) continue; /* this piece is done */
+ finished_p = False; /* not done */
+
+ p->tick += jc->tick_speed * speed;
+ if (p->tick > 1.0) p->tick = 1.0;
+
+ if (p->tick < 0.0) continue; /* not yet started */
+
+ tt = 1 - sin (M_PI/2 - p->tick * M_PI/2);
+
+ p->current.x = p->from.x + ((p->to.x - p->from.x) * tt);
+ p->current.y = p->from.y + ((p->to.y - p->from.y) * tt);
+ p->current.z = p->from.z + ((p->to.z - p->from.z) * tt);
+ p->current.r = p->from.r + ((p->to.r - p->from.r) * tt);
+
+ p->current.z += p->arc_height * sin (p->tick * M_PI);
+
+ p->tilt = p->max_tilt * sin (p->tick * M_PI);
+
+ }
+
+ return finished_p;
+}
+
+
+static void
+loading_msg (ModeInfo *mi)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ int wire = MI_IS_WIREFRAME(mi);
+ const char *text = "Loading...";
+ XCharStruct e;
+ int w, h;
+ texture_string_metrics (jc->texfont, text, &e, 0, 0);
+ w = e.width;
+ h = e.ascent + e.descent;
+
+ if (wire) return;
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if (! jc->loading_dlist)
+ {
+ GLfloat othick = jc->line_thickness;
+ puzzle_piece P = { 0, };
+ P.jc = jc;
+ jc->loading_dlist = glGenLists (1);
+ glNewList (jc->loading_dlist, GL_COMPILE);
+ jc->line_thickness = 1;
+ draw_piece (jc, &P,
+ resolution_arg, thickness_arg,
+ OUT, OUT, IN, OUT, True);
+ jc->line_thickness = othick;
+ glEndList();
+ }
+
+ glColor3f (0.2, 0.2, 0.4);
+
+ glPushMatrix();
+ {
+ double x, y, z;
+ get_position (jc->rot, &x, &y, &z, True);
+ glRotatef (x * 360, 1, 0, 0);
+ glRotatef (y * 360, 0, 1, 0);
+ glRotatef (z * 360, 0, 0, 1);
+ glScalef (5, 5, 5);
+ glTranslatef (-0.5, -0.5, 0);
+ glCallList (jc->loading_dlist);
+ }
+ glPopMatrix();
+
+ glColor3f (0.7, 0.7, 1);
+
+
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glLoadIdentity();
+
+ {
+ double rot = current_device_rotation();
+ glRotatef(rot, 0, 0, 1);
+ if ((rot > 45 && rot < 135) ||
+ (rot < -45 && rot > -135))
+ {
+ GLfloat s = MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi);
+ glScalef (s, 1/s, 1);
+ }
+ }
+
+ glOrtho(0, MI_WIDTH(mi), 0, MI_HEIGHT(mi), -1, 1);
+ glTranslatef ((MI_WIDTH(mi) - w) / 2,
+ (MI_HEIGHT(mi) - h) / 2,
+ 0);
+ glEnable (GL_TEXTURE_2D);
+ glPolygonMode (GL_FRONT, GL_FILL);
+ glDisable (GL_LIGHTING);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ print_texture_string (jc->texfont, text);
+ glEnable (GL_DEPTH_TEST);
+ glPopMatrix();
+
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+
+ glMatrixMode(GL_MODELVIEW);
+}
+
+
+static void
+animate (ModeInfo *mi)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ double slow = 0.01;
+ double fast = 0.04;
+
+ if (jc->button_down_p && jc->state != PUZZLE_LOADING_MSG)
+ return;
+
+ switch (jc->state)
+ {
+ case PUZZLE_LOADING_MSG:
+ if (! jc->puzzle)
+ loading_msg (mi);
+ /* fall through */
+
+ case PUZZLE_LOADING:
+ if (!jc->puzzle) break; /* still loading */
+ jc->tick_speed = slow;
+ shuffle_grid (mi);
+ smooth_grid (mi);
+ begin_scatter (mi, True);
+ jc->pausing = 0;
+ jc->state = PUZZLE_UNSCATTER;
+ if (debug_p) fprintf (stderr, "%s: unscattering\n", progname);
+ break;
+
+ case PUZZLE_UNSCATTER:
+ jc->tick_speed = slow;
+ if (anim_tick (mi))
+ {
+ smooth_grid (mi);
+ jc->pausing = 1.0;
+ jc->state = PUZZLE_SOLVE;
+ if (debug_p) fprintf (stderr, "%s: solving\n", progname);
+ }
+ break;
+
+ case PUZZLE_SOLVE:
+ jc->tick_speed = fast;
+ if (anim_tick (mi))
+ {
+ smooth_grid (mi);
+ if (solved_p (mi))
+ {
+ if (debug_p) fprintf (stderr, "%s: solved!\n", progname);
+ begin_scatter (mi, False);
+ jc->state = PUZZLE_SCATTER;
+ jc->pausing = 3.0;
+ if (debug_p) fprintf (stderr, "%s: scattering\n", progname);
+ }
+ else
+ {
+ move_one_piece (mi);
+ jc->pausing = 0.3;
+ }
+ }
+ break;
+
+ case PUZZLE_SCATTER:
+ jc->tick_speed = slow;
+ if (anim_tick (mi))
+ {
+ free_puzzle_grid (jc);
+ load_image (mi);
+ jc->state = PUZZLE_LOADING;
+ jc->pausing = 1.0;
+ if (debug_p) fprintf (stderr, "%s: loading\n", progname);
+ }
+ break;
+
+ default:
+ abort();
+ }
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_jigsaw (ModeInfo *mi, int width, int height)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ jc->line_thickness = (MI_IS_WIREFRAME (mi) ? 1 : MAX (1, height / 300.0));
+}
+
+
+ENTRYPOINT Bool
+jigsaw_handle_event (ModeInfo *mi, XEvent *event)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, jc->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &jc->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ begin_scatter (mi, False);
+ jc->state = PUZZLE_SCATTER;
+ return True;
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+init_jigsaw (ModeInfo *mi)
+{
+ jigsaw_configuration *jc;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, sps);
+ jc = &sps[MI_SCREEN(mi)];
+ jc->glx_context = init_GL(mi);
+
+ reshape_jigsaw (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {0.05, 0.07, 1.00, 0.0};
+ GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ jc->trackball = gltrackball_init (False);
+ jc->rot = make_rotator (0, 0, 0, 0, speed * 0.002, True);
+ jc->texfont = load_texture_font (MI_DISPLAY(mi), "font");
+
+ jc->state = PUZZLE_LOADING_MSG;
+
+ resolution_arg /= complexity_arg;
+
+# ifndef HAVE_TESS
+ /* If it's not even, we get crosses. */
+ if (resolution_arg & 1)
+ resolution_arg++;
+# endif /* !HAVE_TESS */
+
+ if (wire)
+ make_puzzle_grid (mi);
+ else
+ load_image (mi);
+}
+
+
+ENTRYPOINT void
+draw_jigsaw (ModeInfo *mi)
+{
+ jigsaw_configuration *jc = &sps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ int wire = MI_IS_WIREFRAME(mi);
+
+ if (!jc->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(jc->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ mi->polygon_count = 0;
+
+ glPushMatrix ();
+/* glRotatef(current_device_rotation(), 0, 0, 1); */
+ gltrackball_rotate (jc->trackball);
+
+ animate (mi);
+
+ if (wobble_p && jc->puzzle)
+ {
+ double x, y, z;
+ double max = 60;
+ get_position (jc->rot, &x, &y, &z, !jc->button_down_p);
+ x = 1; /* always lean back */
+ glRotatef (max/2 - x*max, 1, 0, 0);
+ glRotatef (max/2 - z*max, 0, 1, 0);
+ }
+
+ if (jc->puzzle)
+ {
+ GLfloat s = 14.0 / jc->puzzle_height;
+ int x, y;
+
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_LINE_SMOOTH);
+
+ glScalef (s, s, s);
+ glTranslatef (-jc->puzzle_width / 2.0, -jc->puzzle_height / 2.0, 0);
+
+ if (! wire)
+ {
+ glEnable (GL_TEXTURE_2D);
+ glEnable (GL_BLEND);
+ glEnable (GL_LIGHTING);
+ glEnable (GL_LIGHT0);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ for (y = 0; y < jc->puzzle_height; y++)
+ for (x = 0; x < jc->puzzle_width; x++)
+ {
+ puzzle_piece *p = &jc->puzzle [y * jc->puzzle_width + x];
+ glPushMatrix();
+ glTranslatef (p->current.x, p->current.y, p->current.z);
+ glTranslatef (0.5, 0.5, 0);
+ glRotatef (p->current.r, 0, 0, 1);
+ glRotatef (p->tilt, 0, 1, 0);
+ glTranslatef (-0.5, -0.5, 0);
+ glCallList(p->dlist);
+ mi->polygon_count += p->polys;
+ glPopMatrix();
+ }
+ }
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE ("Jigsaw", jigsaw)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/jigsaw.man b/hacks/glx/jigsaw.man
new file mode 100644
index 0000000..c7d3493
--- /dev/null
+++ b/hacks/glx/jigsaw.man
@@ -0,0 +1,90 @@
+.TH XScreenSaver 1 "25-Aug-2008" "X Version 11"
+.SH NAME
+jigsaw - permute an image like a jigsaw puzzle
+.SH SYNOPSIS
+.B jigsaw
+[\-display \fIhost:display.screen\fP]
+[\-delay \fIusecs\fP]
+[\-speed \fIratio\fP]
+[\-complexity \fIratio\fP]
+[\-resolution \fIint\fP]
+[\-thickness \fIfloat\fP]
+[\-no\-wobble]
+[\-fps]
+.SH DESCRIPTION
+The \fIjigsaw\fP program loads an image, carves it up into
+a jigsaw puzzle, shuffles it, and then solves it.
+
+The image that it manipulates will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
+.SH OPTIONS
+.I jigsaw
+accepts the following options:
+.TP 8
+.B \-delay \fImicroseconds\fP
+How long to wait between animation frames; default 20000.
+.TP 8
+.B \-speed \fIratio\fP
+Less than 1 for slower, greater than 1 for faster. Default 1.
+.TP 8
+.B \-complexity \fIratio\fP
+Less than 1 for simpler puzzles (fewer pieces), greater than 1 for
+more complex puzzles (more pieces). Default 1.
+.TP 8
+.B \-resolution \fIratio\fP
+Smoothness of the edges of the pieces. Less than 1 for rougher pieces
+(fewer polygons), greater than 1 for more smoother pieces (more polygons).
+Default 1.
+.TP 8
+.B \-thickness \fIfloat\fP
+Thickness of the puzzle pieces (relative to their width).
+Default 0.06.
+.TP 8
+.B \-no\-wobble
+Keep the display stationary instead of very slowly wobbling back and forth.
+.TP 8
+.B \-fps
+Display the current frame rate, polygon count, and CPU load.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Jamie Zawinski. Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 25-Nov-97.
diff --git a/hacks/glx/juggler3d.c b/hacks/glx/juggler3d.c
new file mode 100644
index 0000000..0315029
--- /dev/null
+++ b/hacks/glx/juggler3d.c
@@ -0,0 +1,3022 @@
+/* juggle, Copyright (c) 1996-2009 Tim Auckland <tda10.geo@yahoo.com>
+ * and Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * NOTE: this program was originally called "juggle" and was 2D Xlib.
+ * There was another program called "juggler3d" that was OpenGL.
+ * In 2009, jwz converted "juggle" to OpenGL and renamed
+ * "juggle" to "juggler3d". The old "juggler3d" hack is gone.
+ *
+ * Revision History
+ * 09-Aug-2009: jwz: converted from Xlib to OpenGL.
+ * 13-Dec-2004: [TDA] Use -cycles and -count in a rational manner.
+ * Add -rings, -bballs. Add -describe. Finally made
+ * live pattern updates possible. Add refill_juggle(),
+ * change_juggle() and reshape_juggle(). Make
+ * init_juggle() non-destructive. Reorder erase/draw
+ * operations. Update xscreensaver xml and manpage.
+ * 15-Nov-2004: [TDA] Fix all memory leaks.
+ * 12-Nov-2004: [TDA] Add -torches and another new trail
+ * implementation, so that different objects can have
+ * different length trails.
+ * 11-Nov-2004: [TDA] Clap when all the balls are in the air.
+ * 10-Nov-2004: [TDA] Display pattern name converted to hight
+ * notation.
+ * 31-Oct-2004: [TDA] Add -clubs and new trail implementation.
+ * 02-Sep-2003: Non-real time to see what is happening without a
+ * strobe effect for slow machines.
+ * 01-Nov-2000: Allocation checks
+ * 1996: Written
+ */
+
+/*-
+ * TODO
+ * Implement the anonymously promised -uni option.
+ */
+
+
+/*
+ * Notes on Adam Chalcraft Juggling Notation (used by permission)
+ * a-> Adam's notation s-> Site swap (Cambridge) notation
+ *
+ * To define a map from a-notation to s-notation ("site-swap"), both
+ * of which look like doubly infinite sequences of natural numbers. In
+ * s-notation, there is a restriction on what is allowed, namely for
+ * the sequence s_n, the associated function f(n)=n+s_n must be a
+ * bijection. In a-notation, there is no restriction.
+ *
+ * To go from a-notation to s-notation, you start by mapping each a_n
+ * to a permutation of N, the natural numbers.
+ *
+ * 0 -> the identity
+ * 1 -> (10) [i.e. f(1)=0, f(0)=1]
+ * 2 -> (210) [i.e. f(2)=1, f(1)=0, f(0)=2]
+ * 3 -> (3210) [i.e. f(3)=2, f(2)=1, f(1)=0, f(0)=3]
+ * etc.
+ *
+ * Then for each n, you look at how long 0 takes to get back to 0
+ * again and you call this t_n. If a_n=0, for example, then since the
+ * identity leaves 0 alone, it gets back to 0 in 1 step, so t_n=1. If
+ * a_n=1, then f(0)=1. Now any further a_n=0 leave 1 alone, but the
+ * next a_n>0 sends 1 back to 0. Hence t_n is 2 + the number of 0's
+ * following the 1. Finally, set s_n = t_n - 1.
+ *
+ * To give some examples, it helps to have a notation for cyclic
+ * sequences. By (123), for example, I mean ...123123123123... . Now
+ * under the a-notation -> s-notation mapping we have some familiar
+ * examples:
+ *
+ * (0)->(0), (1)->(1), (2)->(2) etc.
+ * (21)->(31), (31)->(51), (41)->(71) etc.
+ * (10)->(20), (20)->(40), (30)->(60) etc.
+ * (331)->(441), (312)->(612), (303)->(504), (321)->(531)
+ * (43)->(53), (434)->(534), (433)->(633)
+ * (552)->(672)
+ *
+ * In general, the number of balls is the *average* of the s-notation,
+ * and the *maximum* of the a-notation. Another theorem is that the
+ * minimum values in the a-notation and the s-notation and equal, and
+ * preserved in the same positions.
+ *
+ * The usefulness of a-notation is the fact that there are no
+ * restrictions on what is allowed. This makes random juggle
+ * generation much easier. It also makes enumeration very
+ * easy. Another handy feature is computing changes. Suppose you can
+ * do (5) and want a neat change up to (771) in s-notation [Mike Day
+ * actually needed this example!]. Write them both in a-notation,
+ * which gives (5) and (551). Now concatenate them (in general, there
+ * may be more than one way to do this, but not in this example), to
+ * get
+ *
+ * ...55555555551551551551551...
+ *
+ * Now convert back to s-notation, to get
+ *
+ * ...55555566771771771771771...
+ *
+ * So the answer is to do two 6 throws and then go straight into
+ * (771). Coming back down of course,
+ *
+ * ...5515515515515515555555555...
+ *
+ * converts to
+ *
+ * ...7717717717716615555555555...
+ *
+ * so the answer is to do a single 661 and then drop straight down to
+ * (5).
+ *
+ * [The number of balls in the generated pattern occasionally changes.
+ * In order to decrease the number of balls I had to introduce a new
+ * symbol into the Adam notation, [*] which means 'lose the current
+ * ball'.]
+ */
+
+/* This code uses so many linked lists it's worth having a built-in
+ * leak-checker */
+#undef MEMTEST
+
+# define DEFAULTS "*delay: 10000 \n" \
+ "*count: 200 \n" \
+ "*cycles: 1000 \n" \
+ "*ncolors: 32 \n" \
+ "*titleFont: -*-helvetica-bold-r-normal-*-*-180-*-*-*-*-*-*\n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+
+# define release_juggle 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "sphere.h"
+#include "tube.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include "texfont.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_PATTERN "random" /* All patterns */
+#define DEF_TAIL "1" /* No trace */
+#ifdef UNI
+/* Maybe a ROLA BOLA would be at a better angle for viewing */
+#define DEF_UNI "False" /* No unicycle */ /* Not implemented yet */
+#endif
+#define DEF_REAL "True"
+#define DEF_DESCRIBE "True"
+
+#define DEF_BALLS "True" /* Use Balls */
+#define DEF_CLUBS "True" /* Use Clubs */
+#define DEF_TORCHES "True" /* Use Torches */
+#define DEF_KNIVES "True" /* Use Knives */
+#define DEF_RINGS "True" /* Use Rings */
+#define DEF_BBALLS "True" /* Use Bowling Balls */
+
+static char *pattern;
+static int tail;
+#ifdef UNI
+static Bool uni;
+#endif
+static Bool real;
+static Bool describe;
+static Bool balls;
+static Bool clubs;
+static Bool torches;
+static Bool knives;
+static Bool rings;
+static Bool bballs;
+static char *only;
+
+static XrmOptionDescRec opts[] = {
+ {"-pattern", ".juggle.pattern", XrmoptionSepArg, NULL },
+ {"-tail", ".juggle.tail", XrmoptionSepArg, NULL },
+#ifdef UNI
+ {"-uni", ".juggle.uni", XrmoptionNoArg, "on" },
+ {"+uni", ".juggle.uni", XrmoptionNoArg, "off" },
+#endif
+ {"-real", ".juggle.real", XrmoptionNoArg, "on" },
+ {"+real", ".juggle.real", XrmoptionNoArg, "off" },
+ {"-describe", ".juggle.describe", XrmoptionNoArg, "on" },
+ {"+describe", ".juggle.describe", XrmoptionNoArg, "off" },
+ {"-balls", ".juggle.balls", XrmoptionNoArg, "on" },
+ {"+balls", ".juggle.balls", XrmoptionNoArg, "off" },
+ {"-clubs", ".juggle.clubs", XrmoptionNoArg, "on" },
+ {"+clubs", ".juggle.clubs", XrmoptionNoArg, "off" },
+ {"-torches", ".juggle.torches", XrmoptionNoArg, "on" },
+ {"+torches", ".juggle.torches", XrmoptionNoArg, "off" },
+ {"-knives", ".juggle.knives", XrmoptionNoArg, "on" },
+ {"+knives", ".juggle.knives", XrmoptionNoArg, "off" },
+ {"-rings", ".juggle.rings", XrmoptionNoArg, "on" },
+ {"+rings", ".juggle.rings", XrmoptionNoArg, "off" },
+ {"-bballs", ".juggle.bballs", XrmoptionNoArg, "on" },
+ {"+bballs", ".juggle.bballs", XrmoptionNoArg, "off" },
+ {"-only", ".juggle.only", XrmoptionSepArg, NULL },
+};
+
+static argtype vars[] = {
+ { &pattern, "pattern", "Pattern", DEF_PATTERN, t_String },
+ { &tail, "tail", "Tail", DEF_TAIL, t_Int },
+#ifdef UNI
+ { &uni, "uni", "Uni", DEF_UNI, t_Bool },
+#endif
+ { &real, "real", "Real", DEF_REAL, t_Bool },
+ { &describe, "describe", "Describe", DEF_DESCRIBE, t_Bool },
+ { &balls, "balls", "Clubs", DEF_BALLS, t_Bool },
+ { &clubs, "clubs", "Clubs", DEF_CLUBS, t_Bool },
+ { &torches, "torches", "Torches", DEF_TORCHES, t_Bool },
+ { &knives, "knives", "Knives", DEF_KNIVES, t_Bool },
+ { &rings, "rings", "Rings", DEF_RINGS, t_Bool },
+ { &bballs, "bballs", "BBalls", DEF_BBALLS, t_Bool },
+ { &only, "only", "BBalls", " ", t_String },
+};
+
+static OptionStruct desc[] =
+{
+ { "-pattern string", "Cambridge Juggling Pattern" },
+ { "-tail num", "Trace Juggling Patterns" },
+#ifdef UNI
+ { "-/+uni", "Unicycle" },
+#endif
+ { "-/+real", "Real-time" },
+ { "-/+describe", "turn on/off pattern descriptions." },
+ { "-/+balls", "turn on/off Balls." },
+ { "-/+clubs", "turn on/off Clubs." },
+ { "-/+torches", "turn on/off Flaming Torches." },
+ { "-/+knives", "turn on/off Knives." },
+ { "-/+rings", "turn on/off Rings." },
+ { "-/+bballs", "turn on/off Bowling Balls." },
+ { "-only", "Turn off all objects but the named one." },
+};
+
+ENTRYPOINT ModeSpecOpt juggle_opts =
+ {countof(opts), opts, countof(vars), vars, desc};
+
+
+/* Note: All "lengths" are scaled by sp->scale = MI_HEIGHT/480. All
+ "thicknesses" are scaled by sqrt(sp->scale) so that they are
+ proportionally thicker for smaller windows. Objects spinning out
+ of the plane (such as clubs) fake perspective by compressing their
+ horizontal coordinates by PERSPEC */
+
+/* Figure */
+#define ARMLENGTH 50
+#define ARMWIDTH ((int) (8.0 * sqrt(sp->scale)))
+#define POSE 10
+#define BALLRADIUS ARMWIDTH
+
+/* build all the models assuming a 480px high scene */
+#define SCENE_HEIGHT 480
+#define SCENE_WIDTH ((int)(SCENE_HEIGHT*(MI_WIDTH(mi)/(float)MI_HEIGHT(mi))))
+
+/*#define PERSPEC 0.4*/
+
+/* macros */
+#define GRAVITY(h, t) 4*(double)(h)/((t)*(t))
+
+/* Timing based on count. Units are milliseconds. Juggles per second
+ is: 2000 / THROW_CATCH_INTERVAL + CATCH_THROW_INTERVAL */
+
+#define THROW_CATCH_INTERVAL (sp->count)
+#define THROW_NULL_INTERVAL (sp->count * 0.5)
+#define CATCH_THROW_INTERVAL (sp->count * 0.2)
+
+/********************************************************************
+ * Trace Definitions *
+ * *
+ * These record rendering data so that a drawn object can be erased *
+ * later. Each object has its own Trace list. *
+ * *
+ ********************************************************************/
+
+typedef struct {double x, y; } DXPoint;
+typedef struct trace *TracePtr;
+typedef struct trace {
+ TracePtr next, prev;
+ double x, y;
+ double angle;
+ int divisions;
+ DXPoint dlast;
+#ifdef MEMTEST
+ char pad[1024];
+#endif
+} Trace;
+
+/*******************************************************************
+ * Object Definitions *
+ * *
+ * These describe the various types of Object that can be juggled *
+ * *
+ *******************************************************************/
+typedef int (DrawProc)(ModeInfo*, unsigned long, Trace *);
+
+static DrawProc show_ball, show_europeanclub, show_torch, show_knife;
+static DrawProc show_ring, show_bball;
+
+typedef enum {BALL, CLUB, TORCH, KNIFE, RING, BBALLS,
+ NUM_OBJECT_TYPES} ObjType;
+
+#define OBJMIXPROB 20 /* inverse of the chances of using an odd
+ object in the pattern */
+
+static const GLfloat body_color_1[4] = { 0.9, 0.7, 0.5, 1 };
+static const GLfloat body_color_2[4] = { 0.6, 0.4, 0.2, 1 };
+
+static const struct {
+ DrawProc *draw; /* Object Rendering function */
+ int handle; /* Length of object's handle */
+ int mintrail; /* Minimum trail length */
+ double cor; /* Coefficient of Restitution. perfect bounce = 1 */
+ double weight; /* Heavier objects don't get thrown as high */
+} ObjectDefs[] = {
+ { /* Ball */
+ show_ball,
+ 0,
+ 1,
+ 0.9,
+ 1.0,
+ },
+ { /* Club */
+ show_europeanclub,
+ 15,
+ 1,
+ 0.55, /* Clubs don't bounce too well */
+ 1.0,
+ },
+ { /* Torch */
+ show_torch,
+ 15,
+ 20, /* Torches need flames */
+ 0, /* Torches don't bounce -- fire risk! */
+ 1.0,
+ },
+ { /* Knife */
+ show_knife,
+ 15,
+ 1,
+ 0, /* Knives don't bounce */
+ 1.0,
+ },
+ { /* Ring */
+ show_ring,
+ 15,
+ 1,
+ 0.8,
+ 1.0,
+ },
+ { /* Bowling Ball */
+ show_bball,
+ 0,
+ 1,
+ 0.2,
+ 5.0,
+ },
+};
+
+/**************************
+ * Trajectory definitions *
+ **************************/
+
+typedef enum {HEIGHT, ADAM} Notation;
+typedef enum {Empty, Full, Ball} Throwable;
+typedef enum {LEFT, RIGHT} Hand;
+typedef enum {THROW, CATCH} Action;
+typedef enum {HAND, ELBOW, SHOULDER} Joint;
+typedef enum {ATCH, THRATCH, ACTION, LINKEDACTION,
+ PTHRATCH, BPREDICTOR, PREDICTOR} TrajectoryStatus;
+typedef struct {double a, b, c, d; } Spline;
+typedef DXPoint Arm[3];
+
+
+/* Object is an arbitrary object being juggled. Each Trajectory
+ * references an Object ("count" tracks this), and each Object is also
+ * linked into a global Objects list. Objects may include a Trace
+ * list for tracking erasures. */
+typedef struct object *ObjectPtr;
+typedef struct object {
+ ObjectPtr next, prev;
+
+ ObjType type;
+ int color;
+ int count; /* reference count */
+ Bool active; /* Object is in use */
+
+ Trace *trace;
+ int tracelen;
+ int tail;
+#ifdef MEMTEST
+ char pad[1024];
+#endif
+} Object;
+
+/* Trajectory is a segment of juggling action. A list of Trajectories
+ * defines the juggling performance. The Trajectory list goes through
+ * multiple processing steps to convert it from basic juggling
+ * notation into rendering data. */
+
+typedef struct trajectory *TrajectoryPtr;
+typedef struct trajectory {
+ TrajectoryPtr prev, next; /* for building list */
+ TrajectoryStatus status;
+
+ /* Throw */
+ char posn;
+ int height;
+ int adam;
+ char *pattern;
+ char *name;
+
+ /* Action */
+ Hand hand;
+ Action action;
+
+ /* LinkedAction */
+ int color;
+ Object *object;
+ int divisions;
+ double angle, spin;
+ TrajectoryPtr balllink;
+ TrajectoryPtr handlink;
+
+ /* PThratch */
+ double cx; /* Moving juggler */
+ double x, y; /* current position */
+ double dx, dy; /* initial velocity */
+
+ /* Predictor */
+ Throwable type;
+ unsigned long start, finish;
+ Spline xp, yp;
+
+#ifdef MEMTEST
+ char pad[1024];
+#endif
+} Trajectory;
+
+
+/*******************
+ * Pattern Library *
+ *******************/
+
+typedef struct {
+ const char * pattern;
+ const char * name;
+} patternstruct;
+
+/* List of popular patterns, in any order */
+/* Patterns should be given in Adam notation so the generator can
+ concatenate them safely. Null descriptions are ok. Height
+ notation will be displayed automatically. */
+/* Can't const this because it is qsorted. This *should* be reentrant,
+ I think... */
+static /*const*/ patternstruct portfolio[] = {
+ {"[+2 1]", /* +3 1 */ "Typical 2 ball juggler"},
+ {"[2 0]", /* 4 0 */ "2 in 1 hand"},
+ {"[2 0 1]", /* 5 0 1 */},
+ {"[+2 0 +2 0 0]" /* +5 0 +5 0 0 */},
+ {"[+2 0 1 2 2]", /* +4 0 1 2 3 */},
+ {"[2 0 1 1]", /* 6 0 1 1 */},
+
+ {"[3]", /* 3 */ "3 cascade"},
+ {"[+3]", /* +3 */ "reverse 3 cascade"},
+ {"[=3]", /* =3 */ "cascade 3 under arm"},
+ {"[&3]", /* &3 */ "cascade 3 catching under arm"},
+ {"[_3]", /* _3 */ "bouncing 3 cascade"},
+ {"[+3 x3 =3]", /* +3 x3 =3 */ "Mill's mess"},
+ {"[3 2 1]", /* 5 3 1" */},
+ {"[3 3 1]", /* 4 4 1" */},
+ {"[3 1 2]", /* 6 1 2 */ "See-saw"},
+ {"[=3 3 1 2]", /* =4 5 1 2 */},
+ {"[=3 2 2 3 1 2]", /* =6 2 2 5 1 2 */ "=4 5 1 2 stretched"},
+ {"[+3 3 1 3]", /* +4 4 1 3 */ "anemic shower box"},
+ {"[3 3 1]", /* 4 4 1 */},
+ {"[+3 2 3]", /* +4 2 3 */},
+ {"[+3 1]", /* +5 1 */ "3 shower"},
+ {"[_3 1]", /* _5 1 */ "bouncing 3 shower"},
+ {"[3 0 3 0 3]", /* 5 0 5 0 5 */ "shake 3 out of 5"},
+ {"[3 3 3 0 0]", /* 5 5 5 0 0 */ "flash 3 out of 5"},
+ {"[3 3 0]", /* 4 5 0 */ "complete waste of a 5 ball juggler"},
+ {"[3 3 3 0 0 0 0]", /* 7 7 7 0 0 0 0 */ "3 flash"},
+ {"[+3 0 +3 0 +3 0 0]", /* +7 0 +7 0 +7 0 0 */},
+ {"[3 2 2 0 3 2 0 2 3 0 2 2 0]", /* 7 3 3 0 7 3 0 3 7 0 3 3 0 */},
+ {"[3 0 2 0]", /* 8 0 4 0 */},
+ {"[_3 2 1]", /* _5 3 1 */},
+ {"[_3 0 1]", /* _8 0 1 */},
+ {"[1 _3 1 _3 0 1 _3 0]", /* 1 _7 1 _7 0 1 _7 0 */},
+ {"[_3 2 1 _3 1 2 1]", /* _6 3 1 _6 1 3 1 */},
+
+ {"[4]", /* 4 */ "4 cascade"},
+ {"[+4 3]", /* +5 3 */ "4 ball half shower"},
+ {"[4 4 2]", /* 5 5 2 */},
+ {"[+4 4 4 +4]", /* +4 4 4 +4 */ "4 columns"},
+ {"[+4 3 +4]", /* +5 3 +4 */},
+ {"[4 3 4 4]", /* 5 3 4 4 */},
+ {"[4 3 3 4]", /* 6 3 3 4 */},
+ {"[4 3 2 4", /* 6 4 2 4 */},
+ {"[+4 1]", /* +7 1 */ "4 shower"},
+ {"[4 4 4 4 0]", /* 5 5 5 5 0 */ "learning 5"},
+ {"[+4 x4 =4]", /* +4 x4 =4 */ "Mill's mess for 4"},
+ {"[+4 2 1 3]", /* +9 3 1 3 */},
+ {"[4 4 1 4 1 4]", /* 6 6 1 5 1 5, by Allen Knutson */},
+ {"[_4 _4 _4 1 _4 1]", /* _5 _6 _6 1 _5 1 */},
+ {"[_4 3 3]", /* _6 3 3 */},
+ {"[_4 3 1]", /* _7 4 1 */},
+ {"[_4 2 1]", /* _8 3 1 */},
+ {"[_4 3 3 3 0]", /* _8 4 4 4 0 */},
+ {"[_4 1 3 1]", /* _9 1 5 1 */},
+ {"[_4 1 3 1 2]", /* _10 1 6 1 2 */},
+
+ {"[5]", /* 5 */ "5 cascade"},
+ {"[_5 _5 _5 _5 _5 5 5 5 5 5]", /* _5 _5 _5 _5 _5 5 5 5 5 5 */},
+ {"[+5 x5 =5]", /* +5 x5 =5 */ "Mill's mess for 5"},
+ {"[5 4 4]", /* 7 4 4 */},
+ {"[_5 4 4]", /* _7 4 4 */},
+ {"[1 2 3 4 5 5 5 5 5]", /* 1 2 3 4 5 6 7 8 9 */ "5 ramp"},
+ {"[5 4 5 3 1]", /* 8 5 7 4 1, by Allen Knutson */},
+ {"[_5 4 1 +4]", /* _9 5 1 5 */},
+ {"[_5 4 +4 +4]", /* _8 4 +4 +4 */},
+ {"[_5 4 4 4 1]", /* _9 5 5 5 1 */},
+ {"[_5 4 4 5 1]",},
+ {"[_5 4 4 +4 4 0]", /*_10 5 5 +5 5 0 */},
+
+ {"[6]", /* 6 */ "6 cascade"},
+ {"[+6 5]", /* +7 5 */},
+ {"[6 4]", /* 8 4 */},
+ {"[+6 3]", /* +9 3 */},
+ {"[6 5 4 4]", /* 9 7 4 4 */},
+ {"[+6 5 5 5]", /* +9 5 5 5 */},
+ {"[6 0 6]", /* 9 0 9 */},
+ {"[_6 0 _6]", /* _9 0 _9 */},
+
+ {"[_7]", /* _7 */ "bouncing 7 cascade"},
+ {"[7]", /* 7 */ "7 cascade"},
+ {"[7 6 6 6 6]", /* 11 6 6 6 6 */ "Gatto's High Throw"},
+
+};
+
+
+
+typedef struct { int start; int number; } PatternIndex;
+
+struct patternindex {
+ int minballs;
+ int maxballs;
+ PatternIndex index[countof(portfolio)];
+};
+
+
+/* Jugglestruct: per-screen global data. The master Object
+ * and Trajectory lists are anchored here. */
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ double scale;
+ double cx;
+ double Gr;
+ Trajectory *head;
+ Arm arm[2][2];
+ char *pattern;
+ int count;
+ int num_balls;
+ time_t begintime; /* should make 'time' usable for at least 48 days
+ on a 32-bit machine */
+ unsigned long time; /* millisecond timer*/
+ ObjType objtypes;
+ Object *objects;
+ struct patternindex patternindex;
+ texture_font_data *font_data;
+} jugglestruct;
+
+static jugglestruct *juggles = (jugglestruct *) NULL;
+
+/*******************
+ * list management *
+ *******************/
+
+#define DUP_OBJECT(n, t) { \
+ (n)->object = (t)->object; \
+ if((n)->object != NULL) (n)->object->count++; \
+}
+
+/* t must point to an existing element. t must not be an
+ expression ending ->next or ->prev */
+#define REMOVE(t) { \
+ (t)->next->prev = (t)->prev; \
+ (t)->prev->next = (t)->next; \
+ free(t); \
+}
+
+/* t receives element to be created and added to the list. ot must
+ point to an existing element or be identical to t to start a new
+ list. Applicable to Trajectories, Objects and Traces. */
+#define ADD_ELEMENT(type, t, ot) \
+ if (((t) = (type*)calloc(1,sizeof(type))) != NULL) { \
+ (t)->next = (ot)->next; \
+ (t)->prev = (ot); \
+ (ot)->next = (t); \
+ (t)->next->prev = (t); \
+ }
+
+static void
+object_destroy(Object* o)
+{
+ if(o->trace != NULL) {
+ while(o->trace->next != o->trace) {
+ Trace *s = o->trace->next;
+ REMOVE(s); /* Don't eliminate 's' */
+ }
+ free(o->trace);
+ }
+ REMOVE(o);
+}
+
+static void
+trajectory_destroy(Trajectory *t) {
+ if(t->name != NULL) free(t->name);
+ if(t->pattern != NULL) free(t->pattern);
+ /* Reduce object link count and call destructor if necessary */
+ if(t->object != NULL && --t->object->count < 1 && t->object->tracelen == 0) {
+ object_destroy(t->object);
+ }
+ REMOVE(t); /* Unlink and free */
+}
+
+ENTRYPOINT void
+free_juggle(ModeInfo *mi) {
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+
+ if (sp->head != NULL) {
+ while (sp->head->next != sp->head) {
+ trajectory_destroy(sp->head->next);
+ }
+ free(sp->head);
+ sp->head = (Trajectory *) NULL;
+ }
+ if(sp->objects != NULL) {
+ while (sp->objects->next != sp->objects) {
+ object_destroy(sp->objects->next);
+ }
+ free(sp->objects);
+ sp->objects = (Object*)NULL;
+ }
+ if(sp->pattern != NULL) {
+ free(sp->pattern);
+ sp->pattern = NULL;
+ }
+}
+
+static Bool
+add_throw(ModeInfo *mi, char type, int h, Notation n, const char* name)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ Trajectory *t;
+
+ ADD_ELEMENT(Trajectory, t, sp->head->prev);
+ if(t == NULL){ /* Out of Memory */
+ free_juggle(mi);
+ return False;
+ }
+ t->object = NULL;
+ if(name != NULL)
+ t->name = strdup(name);
+ t->posn = type;
+ if (n == ADAM) {
+ t->adam = h;
+ t->height = 0;
+ t->status = ATCH;
+ } else {
+ t->height = h;
+ t->status = THRATCH;
+ }
+ return True;
+}
+
+/* add a Thratch to the performance */
+static Bool
+program(ModeInfo *mi, const char *patn, const char *name, int cycles)
+{
+ const char *p;
+ int w, h, i, seen;
+ Notation notation;
+ char type;
+
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr, "juggle[%d]: Programmed: %s x %d\n",
+ MI_SCREEN(mi), (name == NULL) ? patn : name, cycles);
+ }
+
+ for(w=i=0; i < cycles; i++, w++) { /* repeat until at least "cycles" throws
+ have been programmed */
+ /* title is the pattern name to be supplied to the first throw of
+ a sequence. If no name if given, use an empty title so that
+ the sequences are still delimited. */
+ const char *title = (name != NULL)? name : "";
+ type=' ';
+ h = 0;
+ seen = 0;
+ notation = HEIGHT;
+ for(p=patn; *p; p++) {
+ if (*p >= '0' && *p <='9') {
+ seen = 1;
+ h = 10*h + (*p - '0');
+ } else {
+ Notation nn = notation;
+ switch (*p) {
+ case '[': /* begin Adam notation */
+ notation = ADAM;
+ break;
+ case '-': /* Inside throw */
+ type = ' ';
+ break;
+ case '+': /* Outside throw */
+ case '=': /* Cross throw */
+ case '&': /* Cross catch */
+ case 'x': /* Cross throw and catch */
+ case '_': /* Bounce */
+ case 'k': /* Kickup */
+ type = *p;
+ break;
+ case '*': /* Lose ball */
+ seen = 1;
+ h = -1;
+ /* fall through */
+ case ']': /* end Adam notation */
+ nn = HEIGHT;
+ /* fall through */
+ case ' ':
+ if (seen) {
+ i++;
+ if (!add_throw(mi, type, h, notation, title))
+ return False;
+ title = NULL;
+ type=' ';
+ h = 0;
+ seen = 0;
+ }
+ notation = nn;
+ break;
+ default:
+ if(w == 0) { /* Only warn on first pass */
+ (void) fprintf(stderr,
+ "juggle[%d]: Unexpected pattern instruction: '%c'\n",
+ MI_SCREEN(mi), *p);
+ }
+ break;
+ }
+ }
+ }
+ if (seen) { /* end of sequence */
+ if (!add_throw(mi, type, h, notation, title))
+ return False;
+ title = NULL;
+ }
+ }
+ return True;
+}
+
+/*
+ ~~~~\~~~~~\~~~
+ \\~\\~\~\\\~~~
+ \\~\\\\~\\\~\~
+ \\\\\\\\\\\~\\
+
+[ 3 3 1 3 4 2 3 1 3 3 4 0 2 1 ]
+
+4 4 1 3 12 2 4 1 4 4 13 0 3 1
+
+*/
+#define BOUNCEOVER 10
+#define KICKMIN 7
+#define THROWMAX 20
+
+/* Convert Adam notation into heights */
+static void
+adam(jugglestruct *sp)
+{
+ Trajectory *t, *p;
+ for(t = sp->head->next; t != sp->head; t = t->next) {
+ if (t->status == ATCH) {
+ int a = t->adam;
+ t->height = 0;
+ for(p = t->next; a > 0; p = p->next) {
+ if(p == sp->head) {
+ t->height = -9; /* Indicate end of processing for name() */
+ return;
+ }
+ if (p->status != ATCH || p->adam < 0 || p->adam>= a) {
+ a--;
+ }
+ t->height++;
+ }
+ if(t->height > BOUNCEOVER && t->posn == ' '){
+ t->posn = '_'; /* high defaults can be bounced */
+ } else if(t->height < 3 && t->posn == '_') {
+ t->posn = ' '; /* Can't bounce short throws. */
+ }
+ if(t->height < KICKMIN && t->posn == 'k'){
+ t->posn = ' '; /* Can't kick short throws */
+ }
+ if(t->height > THROWMAX){
+ t->posn = 'k'; /* Use kicks for ridiculously high throws */
+ }
+ t->status = THRATCH;
+ }
+ }
+}
+
+/* Discover converted heights and update the sequence title */
+static void
+name(jugglestruct *sp)
+{
+ Trajectory *t, *p;
+ char buffer[BUFSIZ];
+ char *b;
+ for(t = sp->head->next; t != sp->head; t = t->next) {
+ if (t->status == THRATCH && t->name != NULL) {
+ b = buffer;
+ for(p = t; p == t || p->name == NULL; p = p->next) {
+ if(p == sp->head || p->height < 0) { /* end of reliable data */
+ return;
+ }
+ if(p->posn == ' ') {
+ b += sprintf(b, " %d", p->height);
+ } else {
+ b += sprintf(b, " %c%d", p->posn, p->height);
+ }
+ if(b - buffer > 500) break; /* otherwise this could eventually
+ overflow. It'll be too big to
+ display anyway. */
+ }
+ if(*t->name != 0) {
+ (void) sprintf(b, ", %s", t->name);
+ }
+ free(t->name); /* Don't need name any more, it's been converted
+ to pattern */
+ t->name = NULL;
+ if(t->pattern != NULL) free(t->pattern);
+ t->pattern = strdup(buffer);
+ }
+ }
+}
+
+/* Split Thratch notation into explicit throws and catches.
+ Usually Catch follows Throw in same hand, but take care of special
+ cases. */
+
+/* ..n1.. -> .. LTn RT1 LC RC .. */
+/* ..nm.. -> .. LTn LC RTm RC .. */
+
+static Bool
+part(ModeInfo *mi)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ Trajectory *t, *nt, *p;
+ Hand hand = (LRAND() & 1) ? RIGHT : LEFT;
+
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ if (t->status > THRATCH) {
+ hand = t->hand;
+ } else if (t->status == THRATCH) {
+ char posn = '=';
+
+ /* plausibility check */
+ if (t->height <= 2 && t->posn == '_') {
+ t->posn = ' '; /* no short bounces */
+ }
+ if (t->height <= 1 && (t->posn == '=' || t->posn == '&')) {
+ t->posn = ' '; /* 1's need close catches */
+ }
+
+ switch (t->posn) {
+ /* throw catch */
+ case ' ': posn = '-'; t->posn = '+'; break;
+ case '+': posn = '+'; t->posn = '-'; break;
+ case '=': posn = '='; t->posn = '+'; break;
+ case '&': posn = '+'; t->posn = '='; break;
+ case 'x': posn = '='; t->posn = '='; break;
+ case '_': posn = '_'; t->posn = '-'; break;
+ case 'k': posn = 'k'; t->posn = 'k'; break;
+ default:
+ (void) fprintf(stderr, "juggle: unexpected posn %c\n", t->posn);
+ break;
+ }
+ hand = (Hand) ((hand + 1) % 2);
+ t->status = ACTION;
+ t->hand = hand;
+ p = t->prev;
+
+ if (t->height == 1 && p != sp->head) {
+ p = p->prev; /* '1's are thrown earlier than usual */
+ }
+
+
+
+ t->action = CATCH;
+ ADD_ELEMENT(Trajectory, nt, p);
+ if(nt == NULL){
+ free_juggle(mi);
+ return False;
+ }
+ nt->object = NULL;
+ nt->status = ACTION;
+ nt->action = THROW;
+ nt->height = t->height;
+ nt->hand = hand;
+ nt->posn = posn;
+
+ }
+ }
+ return True;
+}
+
+static ObjType
+choose_object(void) {
+ ObjType o;
+ for (;;) {
+ o = (ObjType)NRAND((ObjType)NUM_OBJECT_TYPES);
+ if(balls && o == BALL) break;
+ if(clubs && o == CLUB) break;
+ if(torches && o == TORCH) break;
+ if(knives && o == KNIFE) break;
+ if(rings && o == RING) break;
+ if(bballs && o == BBALLS) break;
+ }
+ return o;
+}
+
+/* Connnect up throws and catches to figure out which ball goes where.
+ Do the same with the juggler's hands. */
+
+static void
+lob(ModeInfo *mi)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ Trajectory *t, *p;
+ int h;
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ if (t->status == ACTION) {
+ if (t->action == THROW) {
+ if (t->type == Empty) {
+ /* Create new Object */
+ ADD_ELEMENT(Object, t->object, sp->objects);
+ t->object->count = 1;
+ t->object->tracelen = 0;
+ t->object->active = False;
+ /* Initialise object's circular trace list */
+ ADD_ELEMENT(Trace, t->object->trace, t->object->trace);
+
+ if (MI_NPIXELS(mi) > 2) {
+ t->object->color = 1 + NRAND(MI_NPIXELS(mi) - 2);
+ } else {
+#ifdef STANDALONE
+ t->object->color = 1;
+#else
+ t->object->color = 0;
+#endif
+ }
+
+ /* Small chance of picking a random object instead of the
+ current theme. */
+ if(NRAND(OBJMIXPROB) == 0) {
+ t->object->type = choose_object();
+ } else {
+ t->object->type = sp->objtypes;
+ }
+
+ /* Check to see if we need trails for this object */
+ if(tail < ObjectDefs[t->object->type].mintrail) {
+ t->object->tail = ObjectDefs[t->object->type].mintrail;
+ } else {
+ t->object->tail = tail;
+ }
+ }
+
+ /* Balls can change divisions at each throw */
+ /* no, that looks stupid. -jwz */
+ if (t->divisions < 1)
+ t->divisions = 2 * (NRAND(2) + 1);
+
+ /* search forward for next catch in this hand */
+ for (p = t->next; t->handlink == NULL; p = p->next) {
+ if(p->status < ACTION || p == sp->head) return;
+ if (p->action == CATCH) {
+ if (t->handlink == NULL && p->hand == t->hand) {
+ t->handlink = p;
+ }
+ }
+ }
+
+ if (t->height > 0) {
+ h = t->height - 1;
+
+ /* search forward for next ball catch */
+ for (p = t->next; t->balllink == NULL; p = p->next) {
+ if(p->status < ACTION || p == sp->head) {
+ t->handlink = NULL;
+ return;
+ }
+ if (p->action == CATCH) {
+ if (t->balllink == NULL && --h < 1) { /* caught */
+ t->balllink = p; /* complete trajectory */
+# if 0
+ if (p->type == Full) {
+ (void) fprintf(stderr, "juggle[%d]: Dropped %d\n",
+ MI_SCREEN(mi), t->object->color);
+ }
+#endif
+ p->type = Full;
+ DUP_OBJECT(p, t); /* accept catch */
+ p->angle = t->angle;
+ p->divisions = t->divisions;
+ }
+ }
+ }
+ }
+ t->type = Empty; /* thrown */
+ } else if (t->action == CATCH) {
+ /* search forward for next throw from this hand */
+ for (p = t->next; t->handlink == NULL; p = p->next) {
+ if(p->status < ACTION || p == sp->head) return;
+ if (p->action == THROW && p->hand == t->hand) {
+ p->type = t->type; /* pass ball */
+ DUP_OBJECT(p, t); /* pass object */
+ p->divisions = t->divisions;
+ t->handlink = p;
+ }
+ }
+ }
+ t->status = LINKEDACTION;
+ }
+ }
+}
+
+/* Clap when both hands are empty */
+static void
+clap(jugglestruct *sp)
+{
+ Trajectory *t, *p;
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ if (t->status == LINKEDACTION &&
+ t->action == CATCH &&
+ t->type == Empty &&
+ t->handlink != NULL &&
+ t->handlink->height == 0) { /* Completely idle hand */
+
+ for (p = t->next; p != sp->head; p = p->next) {
+ if (p->status == LINKEDACTION &&
+ p->action == CATCH &&
+ p->hand != t->hand) { /* Next catch other hand */
+ if(p->type == Empty &&
+ p->handlink != NULL &&
+ p->handlink->height == 0) { /* Also completely idle */
+
+ t->handlink->posn = '^'; /* Move first hand's empty throw */
+ p->posn = '^'; /* to meet second hand's empty
+ catch */
+
+ }
+ break; /* Only need first catch */
+ }
+ }
+ }
+ }
+}
+
+#define CUBIC(s, t) ((((s).a * (t) + (s).b) * (t) + (s).c) * (t) + (s).d)
+
+/* Compute single spline from x0 with velocity dx0 at time t0 to x1
+ with velocity dx1 at time t1 */
+static Spline
+makeSpline(double x0, double dx0, int t0, double x1, double dx1, int t1)
+{
+ Spline s;
+ double a, b, c, d;
+ double x10;
+ double t10;
+
+ x10 = x1 - x0;
+ t10 = t1 - t0;
+ a = ((dx0 + dx1)*t10 - 2*x10) / (t10*t10*t10);
+ b = (3*x10 - (2*dx0 + dx1)*t10) / (t10*t10);
+ c = dx0;
+ d = x0;
+ s.a = a;
+ s.b = -3*a*t0 + b;
+ s.c = (3*a*t0 - 2*b)*t0 + c;
+ s.d = ((-a*t0 + b)*t0 - c)*t0 +d;
+ return s;
+}
+
+/* Compute a pair of splines. s1 goes from x0 vith velocity dx0 at
+ time t0 to x1 at time t1. s2 goes from x1 at time t1 to x2 with
+ velocity dx2 at time t2. The arrival and departure velocities at
+ x1, t1 must be the same. */
+static double
+makeSplinePair(Spline *s1, Spline *s2,
+ double x0, double dx0, int t0,
+ double x1, int t1,
+ double x2, double dx2, int t2)
+{
+ double x10, x21, t21, t10, t20, dx1;
+ x10 = x1 - x0;
+ x21 = x2 - x1;
+ t21 = t2 - t1;
+ t10 = t1 - t0;
+ t20 = t2 - t0;
+ dx1 = (3*x10*t21*t21 + 3*x21*t10*t10 + 3*dx0*t10*t21*t21
+ - dx2*t10*t10*t21 - 4*dx0*t10*t21*t21) /
+ (2*t10*t21*t20);
+ *s1 = makeSpline(x0, dx0, t0, x1, dx1, t1);
+ *s2 = makeSpline(x1, dx1, t1, x2, dx2, t2);
+ return dx1;
+}
+
+/* Compute a Ballistic path in a pair of degenerate splines. sx goes
+ from x at time t at constant velocity dx. sy goes from y at time t
+ with velocity dy and constant acceleration g. */
+static void
+makeParabola(Trajectory *n,
+ double x, double dx, double y, double dy, double g)
+{
+ double t = (double)n->start;
+ n->xp.a = 0;
+ n->xp.b = 0;
+ n->xp.c = dx;
+ n->xp.d = -dx*t + x;
+ n->yp.a = 0;
+ n->yp.b = g/2;
+ n->yp.c = -g*t + dy;
+ n->yp.d = g/2*t*t - dy*t + y;
+}
+
+
+
+
+#define SX 25 /* Shoulder Width */
+
+/* Convert hand position symbols into actual time/space coordinates */
+static void
+positions(jugglestruct *sp)
+{
+ Trajectory *t;
+ unsigned long now = sp->time; /* Make sure we're not lost in the past */
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ if (t->status >= PTHRATCH) {
+ now = t->start;
+ } else if (t->status == ACTION || t->status == LINKEDACTION) {
+ /* Allow ACTIONs to be annotated, but we won't mark them ready
+ for the next stage */
+
+ double xo = 0, yo;
+ double sx = SX;
+ double pose = SX/2;
+
+ /* time */
+ if (t->action == CATCH) { /* Throw-to-catch */
+ if (t->type == Empty) {
+ now += (int) THROW_NULL_INTERVAL; /* failed catch is short */
+ } else { /* successful catch */
+ now += (int)(THROW_CATCH_INTERVAL);
+ }
+ } else { /* Catch-to-throw */
+ if(t->object != NULL) {
+ now += (int) (CATCH_THROW_INTERVAL *
+ ObjectDefs[t->object->type].weight);
+ } else {
+ now += (int) (CATCH_THROW_INTERVAL);
+ }
+ }
+
+ if(t->start == 0)
+ t->start = now;
+ else /* Concatenated performances may need clock resync */
+ now = t->start;
+
+ t->cx = 0;
+
+ /* space */
+ yo = 90;
+
+ /* Add room for the handle */
+ if(t->action == CATCH && t->object != NULL)
+ yo -= ObjectDefs[t->object->type].handle;
+
+ switch (t->posn) {
+ case '-': xo = sx - pose; break;
+ case '_':
+ case 'k':
+ case '+': xo = sx + pose; break;
+ case '~':
+ case '=': xo = - sx - pose; yo += pose; break;
+ case '^': xo = 0; yo += pose*2; break; /* clap */
+ default:
+ (void) fprintf(stderr, "juggle: unexpected posn %c\n", t->posn);
+ break;
+ }
+
+#ifdef _2DSpinsDontWorkIn3D
+ t->angle = (((t->hand == LEFT) ^
+ (t->posn == '+' || t->posn == '_' || t->posn == 'k' ))?
+ -1 : 1) * M_PI/2;
+#else
+ t->angle = -M_PI/2;
+#endif
+
+ t->x = t->cx + ((t->hand == LEFT) ? xo : -xo);
+ t->y = yo;
+
+ /* Only mark complete if it was already linked */
+ if(t->status == LINKEDACTION) {
+ t->status = PTHRATCH;
+ }
+ }
+ }
+}
+
+
+/* Private physics functions */
+
+/* Compute the spin-rate for a trajectory. Different types of throw
+ (eg, regular thows, bounces, kicks, etc) have different spin
+ requirements.
+
+ type = type of object
+ h = trajectory of throwing hand (throws), or next throwing hand (catches)
+ old = earlier spin to consider
+ dt = time span of this trajectory
+ height = height of ball throw or 0 if based on old spin
+ turns = full club turns required during this operation
+ togo = partial club turns required to match hands
+*/
+static double
+spinrate(ObjType type, Trajectory *h, double old, double dt,
+ int height, int turns, double togo)
+{
+#ifdef _2DSpinsDontWorkIn3D
+ const int dir = (h->hand == LEFT) ^ (h->posn == '+')? -1 : 1;
+#else
+ const int dir = 1;
+#endif
+
+ if(ObjectDefs[type].handle != 0) { /* Clubs */
+ return (dir * turns * 2 * M_PI + togo) / dt;
+ } else if(height == 0) { /* Balls already spinning */
+ return old/2;
+ } else { /* Balls */
+ return dir * NRAND(height*10)/20/ObjectDefs[type].weight * 2 * M_PI / dt;
+ }
+}
+
+
+/* compute the angle at the end of a spinning trajectory */
+static double
+end_spin(Trajectory *t)
+{
+ return t->angle + t->spin * (t->finish - t->start);
+}
+
+/* Sets the initial angle of the catch following hand movement t to
+ the final angle of the throw n. Also sets the angle of the
+ subsequent throw to the same angle plus half a turn. */
+static void
+match_spins_on_catch(Trajectory *t, Trajectory *n)
+{
+ if(ObjectDefs[t->balllink->object->type].handle == 0) {
+ t->balllink->angle = end_spin(n);
+ if(t->balllink->handlink != NULL) {
+#ifdef _2DSpinsDontWorkIn3D
+ t->balllink->handlink->angle = t->balllink->angle + M_PI;
+#else
+ t->balllink->handlink->angle = t->balllink->angle;
+#endif
+ }
+ }
+}
+
+static double
+find_bounce(jugglestruct *sp,
+ double yo, double yf, double yc, double tc, double cor)
+{
+ double tb, i, dy = 0;
+ const double e = 1; /* permissible error in yc */
+
+ /*
+ tb = time to bounce
+ yt = height at catch time after one bounce
+ one or three roots according to timing
+ find one by interval bisection
+ */
+ tb = tc;
+ for(i = tc / 2; i > 0.0001; i/=2){
+ double dt, yt;
+ if(tb == 0){
+ (void) fprintf(stderr, "juggle: bounce div by zero!\n");
+ break;
+ }
+ dy = (yf - yo)/tb + sp->Gr/2*tb;
+ dt = tc - tb;
+ yt = -cor*dy*dt + sp->Gr/2*dt*dt + yf;
+ if(yt < yc + e){
+ tb-=i;
+ }else if(yt > yc - e){
+ tb+=i;
+ }else{
+ break;
+ }
+ }
+ if(dy*THROW_CATCH_INTERVAL < -200) { /* bounce too hard */
+ tb = -1;
+ }
+ return tb;
+}
+
+static Trajectory*
+new_predictor(const Trajectory *t, int start, int finish, double angle)
+{
+ Trajectory *n;
+ ADD_ELEMENT(Trajectory, n, t->prev);
+ if(n == NULL){
+ return NULL;
+ }
+ DUP_OBJECT(n, t);
+ n->divisions = t->divisions;
+ n->type = Ball;
+ n->status = PREDICTOR;
+
+ n->start = start;
+ n->finish = finish;
+ n->angle = angle;
+ return n;
+}
+
+/* Turn abstract timings into physically appropriate object trajectories. */
+static Bool
+projectile(jugglestruct *sp)
+{
+ Trajectory *t;
+ const int yf = 0; /* Floor height */
+
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ if (t->status != PTHRATCH || t->action != THROW) {
+ continue;
+ } else if (t->balllink == NULL) { /* Zero Throw */
+ t->status = BPREDICTOR;
+ } else if (t->balllink->handlink == NULL) { /* Incomplete */
+ return True;
+ } else if(t->balllink == t->handlink) {
+ /* '2' height - hold on to ball. Don't need to consider
+ flourishes, 'hands' will do that automatically anyway */
+
+ t->type = Full;
+ /* Zero spin to avoid wrist injuries */
+ t->spin = 0;
+ match_spins_on_catch(t, t);
+ t->dx = t->dy = 0;
+ t->status = BPREDICTOR;
+ continue;
+ } else {
+ if (t->posn == '_') { /* Bounce once */
+
+ const int tb = t->start +
+ find_bounce(sp, t->y, (double) yf, t->balllink->y,
+ (double) (t->balllink->start - t->start),
+ ObjectDefs[t->object->type].cor);
+
+ if(tb < t->start) { /* bounce too hard */
+ t->posn = '+'; /* Use regular throw */
+ } else {
+ Trajectory *n; /* First (throw) trajectory. */
+ double dt; /* Time span of a trajectory */
+ double dy; /* Distance span of a follow-on trajectory.
+ First trajectory uses t->dy */
+ /* dx is constant across both trajectories */
+ t->dx = (t->balllink->x - t->x) / (t->balllink->start - t->start);
+
+ { /* ball follows parabola down */
+ n = new_predictor(t, t->start, tb, t->angle);
+ if(n == NULL) return False;
+ dt = n->finish - n->start;
+ /* Ball rate 4, no flight or matching club turns */
+ n->spin = spinrate(t->object->type, t, 0.0, dt, 4, 0, 0.0);
+ t->dy = (yf - t->y)/dt - sp->Gr/2*dt;
+ makeParabola(n, t->x, t->dx, t->y, t->dy, sp->Gr);
+ }
+
+ { /* ball follows parabola up */
+ Trajectory *m = new_predictor(t, n->finish, t->balllink->start,
+ end_spin(n));
+ if(m == NULL) return False;
+ dt = m->finish - m->start;
+ /* Use previous ball rate, no flight club turns */
+ m->spin = spinrate(t->object->type, t, n->spin, dt, 0, 0,
+ t->balllink->angle - m->angle);
+ match_spins_on_catch(t, m);
+ dy = (t->balllink->y - yf)/dt - sp->Gr/2 * dt;
+ makeParabola(m, t->balllink->x - t->dx * dt,
+ t->dx, (double) yf, dy, sp->Gr);
+ }
+
+ t->status = BPREDICTOR;
+ continue;
+ }
+ } else if (t->posn == 'k') { /* Drop & Kick */
+ Trajectory *n; /* First (drop) trajectory. */
+ Trajectory *o; /* Second (rest) trajectory */
+ Trajectory *m; /* Third (kick) trajectory */
+ const int td = t->start + 2*THROW_CATCH_INTERVAL; /* Drop time */
+ const int tk = t->balllink->start - 5*THROW_CATCH_INTERVAL; /* Kick */
+ double dt, dy;
+
+ { /* Fall to ground */
+ n = new_predictor(t, t->start, td, t->angle);
+ if(n == NULL) return False;
+ dt = n->finish - n->start;
+ /* Ball spin rate 4, no flight club turns */
+ n->spin = spinrate(t->object->type, t, 0.0, dt, 4, 0,
+ t->balllink->angle - n->angle);
+ t->dx = (t->balllink->x - t->x) / dt;
+ t->dy = (yf - t->y)/dt - sp->Gr/2*dt;
+ makeParabola(n, t->x, t->dx, t->y, t->dy, sp->Gr);
+ }
+
+ { /* Rest on ground */
+ o = new_predictor(t, n->finish, tk, end_spin(n));
+ if(o == NULL) return False;
+ o->spin = 0;
+ makeParabola(o, t->balllink->x, 0.0, (double) yf, 0.0, 0.0);
+ }
+
+ /* Kick up */
+ {
+ m = new_predictor(t, o->finish, t->balllink->start, end_spin(o));
+ if(m == NULL) return False;
+ dt = m->finish - m->start;
+ /* Match receiving hand, ball rate 4, one flight club turn */
+ m->spin = spinrate(t->object->type, t->balllink->handlink, 0.0, dt,
+ 4, 1, t->balllink->angle - m->angle);
+ match_spins_on_catch(t, m);
+ dy = (t->balllink->y - yf)/dt - sp->Gr/2 * dt;
+ makeParabola(m, t->balllink->x, 0.0, (double) yf, dy, sp->Gr);
+ }
+
+ t->status = BPREDICTOR;
+ continue;
+ }
+
+ /* Regular flight, no bounce */
+ { /* ball follows parabola */
+ double dt;
+ Trajectory *n = new_predictor(t, t->start,
+ t->balllink->start, t->angle);
+ if(n == NULL) return False;
+ dt = t->balllink->start - t->start;
+ /* Regular spin */
+ n->spin = spinrate(t->object->type, t, 0.0, dt, t->height, t->height/2,
+ t->balllink->angle - n->angle);
+ match_spins_on_catch(t, n);
+ t->dx = (t->balllink->x - t->x) / dt;
+ t->dy = (t->balllink->y - t->y) / dt - sp->Gr/2 * dt;
+ makeParabola(n, t->x, t->dx, t->y, t->dy, sp->Gr);
+ }
+
+ t->status = BPREDICTOR;
+ }
+ }
+ return True;
+}
+
+/* Turn abstract hand motions into cubic splines. */
+static void
+hands(jugglestruct *sp)
+{
+ Trajectory *t, *u, *v;
+
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ /* no throw => no velocity */
+ if (t->status != BPREDICTOR) {
+ continue;
+ }
+
+ u = t->handlink;
+ if (u == NULL) { /* no next catch */
+ continue;
+ }
+ v = u->handlink;
+ if (v == NULL) { /* no next throw */
+ continue;
+ }
+
+ /* double spline takes hand from throw, thru catch, to
+ next throw */
+
+ t->finish = u->start;
+ t->status = PREDICTOR;
+
+ u->finish = v->start;
+ u->status = PREDICTOR;
+
+
+ /* FIXME: These adjustments leave a small glitch when alternating
+ balls and clubs. Just hope no-one notices. :-) */
+
+ /* make sure empty hand spin matches the thrown object in case it
+ had a handle */
+
+ t->spin = ((t->hand == LEFT)? -1 : 1 ) *
+ fabs((u->angle - t->angle)/(u->start - t->start));
+
+ u->spin = ((v->hand == LEFT) ^ (v->posn == '+')? -1 : 1 ) *
+ fabs((v->angle - u->angle)/(v->start - u->start));
+
+ (void) makeSplinePair(&t->xp, &u->xp,
+ t->x, t->dx, t->start,
+ u->x, u->start,
+ v->x, v->dx, v->start);
+ (void) makeSplinePair(&t->yp, &u->yp,
+ t->y, t->dy, t->start,
+ u->y, u->start,
+ v->y, v->dy, v->start);
+
+ t->status = PREDICTOR;
+ }
+}
+
+/* Given target x, y find_elbow puts hand at target if possible,
+ * otherwise makes hand point to the target */
+static void
+find_elbow(int armlength, DXPoint *h, DXPoint *e, DXPoint *p, DXPoint *s,
+ int z)
+{
+ double r, h2, t;
+ double x = p->x - s->x;
+ double y = p->y - s->y;
+ h2 = x*x + y*y + z*z;
+ if (h2 > 4 * armlength * armlength) {
+ t = armlength/sqrt(h2);
+ e->x = t*x + s->x;
+ e->y = t*y + s->y;
+ h->x = 2 * t * x + s->x;
+ h->y = 2 * t * y + s->y;
+ } else {
+ r = sqrt((double)(x*x + z*z));
+ t = sqrt(4 * armlength * armlength / h2 - 1);
+ e->x = x*(1 + y*t/r)/2 + s->x;
+ e->y = (y - r*t)/2 + s->y;
+ h->x = x + s->x;
+ h->y = y + s->y;
+ }
+}
+
+
+/* NOTE: returned x, y adjusted for arm reach */
+static void
+reach_arm(ModeInfo * mi, Hand side, DXPoint *p)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ DXPoint h, e;
+ find_elbow(40, &h, &e, p, &sp->arm[1][side][SHOULDER], 25);
+ *p = sp->arm[1][side][HAND] = h;
+ sp->arm[1][side][ELBOW] = e;
+}
+
+#if DEBUG
+/* dumps a human-readable rendition of the current state of the juggle
+ pipeline to stderr for debugging */
+static void
+dump(jugglestruct *sp)
+{
+ Trajectory *t;
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ switch (t->status) {
+ case ATCH:
+ (void) fprintf(stderr, "%p a %c%d\n", (void*)t, t->posn, t->adam);
+ break;
+ case THRATCH:
+ (void) fprintf(stderr, "%p T %c%d %s\n", (void*)t, t->posn, t->height,
+ t->pattern == NULL?"":t->pattern);
+ break;
+ case ACTION:
+ if (t->action == CATCH)
+ (void) fprintf(stderr, "%p A %c%cC\n",
+ (void*)t, t->posn,
+ t->hand ? 'R' : 'L');
+ else
+ (void) fprintf(stderr, "%p A %c%c%c%d\n",
+ (void*)t, t->posn,
+ t->hand ? 'R' : 'L',
+ (t->action == THROW)?'T':'N',
+ t->height);
+ break;
+ case LINKEDACTION:
+ (void) fprintf(stderr, "%p L %c%c%c%d %d %p %p\n",
+ (void*)t, t->posn,
+ t->hand?'R':'L',
+ (t->action == THROW)?'T':(t->action == CATCH?'C':'N'),
+ t->height, t->object == NULL?0:t->object->color,
+ (void*)t->handlink, (void*)t->balllink);
+ break;
+ case PTHRATCH:
+ (void) fprintf(stderr, "%p O %c%c%c%d %d %2d %6lu %6lu\n",
+ (void*)t, t->posn,
+ t->hand?'R':'L',
+ (t->action == THROW)?'T':(t->action == CATCH?'C':'N'),
+ t->height, t->type, t->object == NULL?0:t->object->color,
+ t->start, t->finish);
+ break;
+ case BPREDICTOR:
+ (void) fprintf(stderr, "%p B %c %2d %6lu %6lu %g\n",
+ (void*)t, t->type == Ball?'b':t->type == Empty?'e':'f',
+ t->object == NULL?0:t->object->color,
+ t->start, t->finish, t->yp.c);
+ break;
+ case PREDICTOR:
+ (void) fprintf(stderr, "%p P %c %2d %6lu %6lu %g\n",
+ (void*)t, t->type == Ball?'b':t->type == Empty?'e':'f',
+ t->object == NULL?0:t->object->color,
+ t->start, t->finish, t->yp.c);
+ break;
+ default:
+ (void) fprintf(stderr, "%p: status %d not implemented\n",
+ (void*)t, t->status);
+ break;
+ }
+ }
+ (void) fprintf(stderr, "---\n");
+}
+#endif
+
+static int get_num_balls(const char *j)
+{
+ int balls = 0;
+ const char *p;
+ int h = 0;
+ if (!j) abort();
+ for (p = j; *p; p++) {
+ if (*p >= '0' && *p <='9') { /* digit */
+ h = 10*h + (*p - '0');
+ } else {
+ if (h > balls) {
+ balls = h;
+ }
+ h = 0;
+ }
+ }
+ return balls;
+}
+
+static int
+compare_num_balls(const void *p1, const void *p2)
+{
+ int i, j;
+ i = get_num_balls(((patternstruct*)p1)->pattern);
+ j = get_num_balls(((patternstruct*)p2)->pattern);
+ if (i > j) {
+ return (1);
+ } else if (i < j) {
+ return (-1);
+ } else {
+ return (0);
+ }
+}
+
+
+/**************************************************************************
+ * Rendering Functions *
+ * *
+ **************************************************************************/
+
+static int
+show_arms(ModeInfo * mi)
+{
+ int polys = 0;
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ unsigned int i, j;
+ Hand side;
+ XPoint a[countof(sp->arm[0][0])];
+ int slices = 12;
+ int thickness = 7;
+ int soffx = 10;
+ int soffy = 11;
+
+ glFrontFace(GL_CCW);
+
+ j = 1;
+ for(side = LEFT; side <= RIGHT; side = (Hand)((int)side + 1)) {
+ /* Translate into device coords */
+ for(i = 0; i < countof(a); i++) {
+ a[i].x = (short)(SCENE_WIDTH/2 + sp->arm[j][side][i].x*sp->scale);
+ a[i].y = (short)(SCENE_HEIGHT - sp->arm[j][side][i].y*sp->scale);
+ if(j == 1)
+ sp->arm[0][side][i] = sp->arm[1][side][i];
+ }
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_1);
+
+ /* Upper arm */
+ polys += tube (a[2].x - (side == LEFT ? soffx : -soffx), a[2].y + soffy, 0,
+ a[1].x, a[1].y, ARMLENGTH/2,
+ thickness, 0, slices,
+ True, True, MI_IS_WIREFRAME(mi));
+
+ /* Lower arm */
+ polys += tube (a[1].x, a[1].y, ARMLENGTH/2,
+ a[0].x, a[0].y, ARMLENGTH,
+ thickness * 0.8, 0, slices,
+ True, True, MI_IS_WIREFRAME(mi));
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_2);
+
+ /* Shoulder */
+ glPushMatrix();
+ glTranslatef (a[2].x - (side == LEFT ? soffx : -soffx),
+ a[2].y + soffy,
+ 0);
+ glScalef(9, 9, 9);
+ polys += unit_sphere(slices, slices, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ /* Elbow */
+ glPushMatrix();
+ glTranslatef (a[1].x, a[1].y, ARMLENGTH/2);
+ glScalef(4, 4, 4);
+ polys += unit_sphere(slices, slices, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ /* Hand */
+ glPushMatrix();
+ glTranslatef (a[0].x, a[0].y, ARMLENGTH);
+ glScalef(8, 8, 8);
+ polys += unit_sphere(slices, slices, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ }
+ return polys;
+}
+
+static int
+show_figure(ModeInfo * mi, Bool init)
+{
+ int polys = 0;
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ /*XPoint p[7];*/
+ int i;
+
+ /* +-----+ 9
+ | 6 |
+ 10 +--+--+
+ 2 +---+---+ 3
+ \ 5 /
+ \ /
+ \ /
+ 1 +
+ / \
+ / \
+ 0 +-----+ 4
+ | |
+ | |
+ | |
+ 7 + + 8
+ */
+
+ /* #### most of this is unused now */
+ static const XPoint figure[] = {
+ { 15, 70}, /* 0 Left Hip */
+ { 0, 90}, /* 1 Waist */
+ { SX, 130}, /* 2 Left Shoulder */
+ {-SX, 130}, /* 3 Right Shoulder */
+ {-15, 70}, /* 4 Right Hip */
+ { 0, 130}, /* 5 Neck */
+ { 0, 140}, /* 6 Chin */
+ { SX, 0}, /* 7 Left Foot */
+ {-SX, 0}, /* 8 Right Foot */
+ {-17, 174}, /* 9 Head1 */
+ { 17, 140}, /* 10 Head2 */
+ };
+ XPoint a[countof(figure)];
+ GLfloat gcolor[4] = { 1, 1, 1, 1 };
+
+ /* Translate into device coords */
+ for(i = 0; i < countof(figure); i++) {
+ a[i].x = (short)(SCENE_WIDTH/2 + (sp->cx + figure[i].x)*sp->scale);
+ a[i].y = (short)(SCENE_HEIGHT - figure[i].y*sp->scale);
+ }
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gcolor);
+
+ glFrontFace(GL_CCW);
+
+ {
+ GLfloat scale = ((GLfloat) a[10].x - a[9].x) / 2;
+ int slices = 12;
+
+ glPushMatrix();
+ {
+ glTranslatef(a[6].x, a[6].y - scale, 0);
+ glScalef(scale, scale, scale);
+
+ /* Head */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_1);
+ glPushMatrix();
+ scale = 0.75;
+ glScalef(scale, scale, scale);
+ glTranslatef(0, 0.3, 0);
+ glPushMatrix();
+ glTranslatef(0, 0, 0.35);
+ polys += tube (0, 0, 0,
+ 0, 1.1, 0,
+ 0.64, 0,
+ slices, True, True, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+ glScalef(0.9, 0.9, 1);
+ polys += unit_sphere(2*slices, 2*slices, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ /* Neck */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_2);
+ glTranslatef(0, 1.1, 0);
+ glPushMatrix();
+ scale = 0.35;
+ glScalef(scale, scale, scale);
+ polys += unit_sphere(slices, slices, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ /* Torso */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_1);
+ glTranslatef(0, 1.1, 0);
+ glPushMatrix();
+ glScalef(0.9, 1.0, 0.9);
+ polys += unit_sphere(slices, slices, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ /* Belly */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_2);
+ glTranslatef(0, 1.0, 0);
+ glPushMatrix();
+ scale = 0.6;
+ glScalef(scale, scale, scale);
+ polys += unit_sphere(slices, slices, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ /* Hips */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_1);
+ glTranslatef(0, 0.8, 0);
+ glPushMatrix();
+ scale = 0.85;
+ glScalef(scale, scale, scale);
+ polys += unit_sphere(slices, slices, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+
+ /* Legs */
+ glTranslatef(0, 0.7, 0);
+
+ for (i = -1; i <= 1; i += 2) {
+ glPushMatrix();
+
+ glRotatef (i*10, 0, 0, 1);
+ glTranslatef(-i*0.65, 0, 0);
+
+ /* Hip socket */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_2);
+ scale = 0.45;
+ glScalef(scale, scale, scale);
+ polys += unit_sphere(slices, slices, MI_IS_WIREFRAME(mi));
+
+ /* Thigh */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_1);
+ glPushMatrix();
+ glTranslatef(0, 0.6, 0);
+ polys += tube (0, 0, 0,
+ 0, 3.5, 0,
+ 1, 0,
+ slices, True, True, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ /* Knee */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_2);
+ glPushMatrix();
+ glTranslatef(0, 4.4, 0);
+ scale = 0.7;
+ glScalef(scale, scale, scale);
+ polys += unit_sphere(slices, slices, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ /* Calf */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_1);
+ glPushMatrix();
+ glTranslatef(0, 4.7, 0);
+ polys += tube (0, 0, 0,
+ 0, 4.7, 0,
+ 0.8, 0,
+ slices, True, True, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ /* Ankle */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_2);
+ glPushMatrix();
+ glTranslatef(0, 9.7, 0);
+ scale = 0.5;
+ glScalef(scale, scale, scale);
+ polys += unit_sphere(slices, slices, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ /* Foot */
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, body_color_1);
+ glPushMatrix();
+ glRotatef (-i*10, 0, 0, 1);
+ glTranslatef(-i*1.75, 9.7, 0.9);
+
+ glScalef (0.4, 1, 1);
+ polys += tube (0, 0, 0,
+ 0, 0.6, 0,
+ 1.9, 0,
+ slices*4, True, True, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+
+ glPopMatrix();
+ }
+ }
+ glPopMatrix();
+ }
+
+ sp->arm[1][LEFT][SHOULDER].x = sp->cx + figure[2].x;
+ sp->arm[1][RIGHT][SHOULDER].x = sp->cx + figure[3].x;
+ if(init) {
+ /* Initialise arms */
+ unsigned int i;
+ for(i = 0; i < 2; i++){
+ sp->arm[i][LEFT][SHOULDER].y = figure[2].y;
+ sp->arm[i][LEFT][ELBOW].x = figure[2].x;
+ sp->arm[i][LEFT][ELBOW].y = figure[1].y;
+ sp->arm[i][LEFT][HAND].x = figure[0].x;
+ sp->arm[i][LEFT][HAND].y = figure[1].y;
+ sp->arm[i][RIGHT][SHOULDER].y = figure[3].y;
+ sp->arm[i][RIGHT][ELBOW].x = figure[3].x;
+ sp->arm[i][RIGHT][ELBOW].y = figure[1].y;
+ sp->arm[i][RIGHT][HAND].x = figure[4].x;
+ sp->arm[i][RIGHT][HAND].y = figure[1].y;
+ }
+ }
+ return polys;
+}
+
+typedef struct { GLfloat x, y, z; } XYZ;
+
+/* lifted from sphere.c */
+static int
+striped_unit_sphere (int stacks, int slices,
+ int stripes,
+ GLfloat *color1, GLfloat *color2,
+ int wire_p)
+{
+ int polys = 0;
+ int i,j;
+ double theta1, theta2, theta3;
+ XYZ e, p;
+ XYZ la = { 0, 0, 0 }, lb = { 0, 0, 0 };
+ XYZ c = {0, 0, 0}; /* center */
+ double r = 1.0; /* radius */
+ int stacks2 = stacks * 2;
+
+ if (r < 0)
+ r = -r;
+ if (slices < 0)
+ slices = -slices;
+
+ if (slices < 4 || stacks < 2 || r <= 0)
+ {
+ glBegin (GL_POINTS);
+ glVertex3f (c.x, c.y, c.z);
+ glEnd();
+ return 1;
+ }
+
+ glFrontFace(GL_CW);
+
+ for (j = 0; j < stacks; j++)
+ {
+ theta1 = j * (M_PI+M_PI) / stacks2 - M_PI_2;
+ theta2 = (j + 1) * (M_PI+M_PI) / stacks2 - M_PI_2;
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE,
+ ((j == 0 || j == stacks-1 ||
+ j % (stacks / (stripes+1)))
+ ? color1 : color2));
+
+ glBegin (wire_p ? GL_LINE_LOOP : GL_TRIANGLE_STRIP);
+ for (i = 0; i <= slices; i++)
+ {
+ theta3 = i * (M_PI+M_PI) / slices;
+
+ if (wire_p && i != 0)
+ {
+ glVertex3f (lb.x, lb.y, lb.z);
+ glVertex3f (la.x, la.y, la.z);
+ }
+
+ e.x = cos (theta2) * cos(theta3);
+ e.y = sin (theta2);
+ e.z = cos (theta2) * sin(theta3);
+ p.x = c.x + r * e.x;
+ p.y = c.y + r * e.y;
+ p.z = c.z + r * e.z;
+
+ glNormal3f (e.x, e.y, e.z);
+ glTexCoord2f (i / (double)slices,
+ 2*(j+1) / (double)stacks2);
+ glVertex3f (p.x, p.y, p.z);
+ if (wire_p) la = p;
+
+ e.x = cos(theta1) * cos(theta3);
+ e.y = sin(theta1);
+ e.z = cos(theta1) * sin(theta3);
+ p.x = c.x + r * e.x;
+ p.y = c.y + r * e.y;
+ p.z = c.z + r * e.z;
+
+ glNormal3f (e.x, e.y, e.z);
+ glTexCoord2f (i / (double)slices,
+ 2*j / (double)stacks2);
+ glVertex3f (p.x, p.y, p.z);
+ if (wire_p) lb = p;
+ polys++;
+ }
+ glEnd();
+ }
+ return polys;
+}
+
+
+
+static int
+show_ball(ModeInfo *mi, unsigned long color, Trace *s)
+{
+ int polys = 0;
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ /*int offset = (int)(s->angle*64*180/M_PI);*/
+ short x = (short)(SCENE_WIDTH/2 + s->x * sp->scale);
+ short y = (short)(SCENE_HEIGHT - s->y * sp->scale);
+ GLfloat gcolor1[4] = { 0, 0, 0, 1 };
+ GLfloat gcolor2[4] = { 0, 0, 0, 1 };
+ int slices = 24;
+
+ /* Avoid wrapping */
+ if(s->y*sp->scale > SCENE_HEIGHT * 2) return 0;
+
+ gcolor1[0] = mi->colors[color].red / 65536.0;
+ gcolor1[1] = mi->colors[color].green / 65536.0;
+ gcolor1[2] = mi->colors[color].blue / 65536.0;
+
+ gcolor2[0] = gcolor1[0] / 3;
+ gcolor2[1] = gcolor1[1] / 3;
+ gcolor2[2] = gcolor1[2] / 3;
+
+ glFrontFace(GL_CCW);
+
+ {
+ GLfloat scale = BALLRADIUS;
+ glPushMatrix();
+ glTranslatef(x, y, 0);
+ glScalef(scale, scale, scale);
+
+ glRotatef (s->angle / M_PI*180, 1, 1, 0);
+
+ polys += striped_unit_sphere (slices, slices, s->divisions,
+ gcolor1, gcolor2, MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+ }
+ return polys;
+}
+
+static int
+show_europeanclub(ModeInfo *mi, unsigned long color, Trace *s)
+{
+ int polys = 0;
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ /*int offset = (int)(s->angle*64*180/M_PI);*/
+ short x = (short)(SCENE_WIDTH/2 + s->x * sp->scale);
+ short y = (short)(SCENE_HEIGHT - s->y * sp->scale);
+ double radius = 12 * sp->scale;
+ GLfloat gcolor1[4] = { 0, 0, 0, 1 };
+ GLfloat gcolor2[4] = { 1, 1, 1, 1 };
+ int slices = 16;
+ int divs = 4;
+
+ /* 6 6
+ +-+
+ / \
+ 4 +-----+ 7
+ ////////\
+ 3 +---------+ 8
+ 2 +---------+ 9
+ |///////|
+ 1 +-------+ 10
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ +-+
+ 0 11 */
+
+ /* Avoid wrapping */
+ if(s->y*sp->scale > SCENE_HEIGHT * 2) return 0;
+
+ gcolor1[0] = mi->colors[color].red / 65536.0;
+ gcolor1[1] = mi->colors[color].green / 65536.0;
+ gcolor1[2] = mi->colors[color].blue / 65536.0;
+
+ glFrontFace(GL_CCW);
+
+ {
+ GLfloat scale = radius;
+ glPushMatrix();
+ glTranslatef(x, y, 0);
+ glScalef(scale, scale, scale);
+
+ glTranslatef (0, 0, 2); /* put end of handle in hand */
+
+ glRotatef (s->angle / M_PI*180, 1, 0, 0);
+
+ glPushMatrix();
+ glScalef (0.5, 1, 0.5);
+ polys += striped_unit_sphere (slices, slices, divs, gcolor2, gcolor1,
+ MI_IS_WIREFRAME(mi));
+ glPopMatrix();
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gcolor2);
+ polys += tube (0, 0, 0,
+ 0, 2, 0,
+ 0.2, 0,
+ slices, True, True, MI_IS_WIREFRAME(mi));
+
+ glTranslatef (0, 2, 0);
+ glScalef (0.25, 0.25, 0.25);
+ polys += unit_sphere(slices, slices, MI_IS_WIREFRAME(mi));
+
+ glPopMatrix();
+ }
+ return polys;
+}
+
+
+static int
+show_torch(ModeInfo *mi, unsigned long color, Trace *s)
+{
+ int polys = 0;
+#if 0
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ XPoint head, tail, last;
+ DXPoint dhead, dlast;
+ const double sa = sin(s->angle);
+ const double ca = cos(s->angle);
+
+ const double TailLen = -24;
+ const double HeadLen = 16;
+ const short Width = (short)(5 * sqrt(sp->scale));
+
+ /*
+ +///+ head
+ last |
+ |
+ |
+ |
+ |
+ + tail
+ */
+
+ dhead.x = s->x + HeadLen * PERSPEC * sa;
+ dhead.y = s->y - HeadLen * ca;
+
+ if(color == MI_BLACK_PIXEL(mi)) { /* Use 'last' when erasing */
+ dlast = s->dlast;
+ } else { /* Store 'last' so we can use it later when s->prev has
+ gone */
+ if(s->prev != s->next) {
+ dlast.x = s->prev->x + HeadLen * PERSPEC * sin(s->prev->angle);
+ dlast.y = s->prev->y - HeadLen * cos(s->prev->angle);
+ } else {
+ dlast = dhead;
+ }
+ s->dlast = dlast;
+ }
+
+ /* Avoid wrapping (after last is stored) */
+ if(s->y*sp->scale > SCENE_HEIGHT * 2) return 0;
+
+ head.x = (short)(SCENE_WIDTH/2 + dhead.x*sp->scale);
+ head.y = (short)(SCENE_HEIGHT - dhead.y*sp->scale);
+
+ last.x = (short)(SCENE_WIDTH/2 + dlast.x*sp->scale);
+ last.y = (short)(SCENE_HEIGHT - dlast.y*sp->scale);
+
+ tail.x = (short)(SCENE_WIDTH/2 +
+ (s->x + TailLen * PERSPEC * sa)*sp->scale );
+ tail.y = (short)(SCENE_HEIGHT - (s->y - TailLen * ca)*sp->scale );
+
+ if(color != MI_BLACK_PIXEL(mi)) {
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi),
+ Width, LineSolid, CapRound, JoinRound);
+ draw_line(mi, head.x, head.y, tail.x, tail.y);
+ }
+ XSetForeground(MI_DISPLAY(mi), MI_GC(mi), color);
+ XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi),
+ Width * 2, LineSolid, CapRound, JoinRound);
+
+ draw_line(mi, head.x, head.y, last.x, last.y);
+
+#endif /* 0 */
+ return polys;
+}
+
+
+static int
+show_knife(ModeInfo *mi, unsigned long color, Trace *s)
+{
+ int polys = 0;
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ /*int offset = (int)(s->angle*64*180/M_PI);*/
+ short x = (short)(SCENE_WIDTH/2 + s->x * sp->scale);
+ short y = (short)(SCENE_HEIGHT - s->y * sp->scale);
+ GLfloat gcolor1[4] = { 0, 0, 0, 1 };
+ GLfloat gcolor2[4] = { 1, 1, 1, 1 };
+ int slices = 8;
+
+ /* Avoid wrapping */
+ if(s->y*sp->scale > SCENE_HEIGHT * 2) return 0;
+
+ gcolor1[0] = mi->colors[color].red / 65536.0;
+ gcolor1[1] = mi->colors[color].green / 65536.0;
+ gcolor1[2] = mi->colors[color].blue / 65536.0;
+
+ glFrontFace(GL_CCW);
+
+ glPushMatrix();
+ glTranslatef(x, y, 0);
+ glScalef (2, 2, 2);
+
+ glTranslatef (0, 0, 2); /* put end of handle in hand */
+ glRotatef (s->angle / M_PI*180, 1, 0, 0);
+
+ glScalef (0.3, 1, 1); /* flatten blade */
+
+ glTranslatef(0, 6, 0);
+ glRotatef (180, 1, 0, 0);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gcolor1);
+ polys += tube (0, 0, 0,
+ 0, 10, 0,
+ 1, 0,
+ slices, True, True, MI_IS_WIREFRAME(mi));
+
+ glTranslatef (0, 12, 0);
+ glScalef (0.7, 10, 0.7);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gcolor2);
+ polys += unit_sphere (slices, slices, MI_IS_WIREFRAME(mi));
+
+ glPopMatrix();
+ return polys;
+}
+
+
+static int
+show_ring(ModeInfo *mi, unsigned long color, Trace *s)
+{
+ int polys = 0;
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ /*int offset = (int)(s->angle*64*180/M_PI);*/
+ short x = (short)(SCENE_WIDTH/2 + s->x * sp->scale);
+ short y = (short)(SCENE_HEIGHT - s->y * sp->scale);
+ double radius = 12 * sp->scale;
+ GLfloat gcolor1[4] = { 0, 0, 0, 1 };
+ GLfloat gcolor2[4] = { 0, 0, 0, 1 };
+ int slices = 24;
+ int i, j;
+ int wire_p = MI_IS_WIREFRAME(mi);
+ GLfloat width = M_PI * 2 / slices;
+ GLfloat ra = 1.0;
+ GLfloat rb = 0.7;
+ GLfloat thickness = 0.15;
+
+ /* Avoid wrapping */
+ if(s->y*sp->scale > SCENE_HEIGHT * 2) return 0;
+
+ gcolor1[0] = mi->colors[color].red / 65536.0;
+ gcolor1[1] = mi->colors[color].green / 65536.0;
+ gcolor1[2] = mi->colors[color].blue / 65536.0;
+
+ gcolor2[0] = gcolor1[0] / 3;
+ gcolor2[1] = gcolor1[1] / 3;
+ gcolor2[2] = gcolor1[2] / 3;
+
+ glFrontFace(GL_CCW);
+
+ glPushMatrix();
+ glTranslatef(0, 0, 12); /* back of ring in hand */
+
+ glTranslatef(x, y, 0);
+ glScalef(radius, radius, radius);
+
+ glRotatef (90, 0, 1, 0);
+ glRotatef (s->angle / M_PI*180, 0, 0, 1);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gcolor1);
+
+ /* discs */
+ for (j = -1; j <= 1; j += 2)
+ {
+ GLfloat z = j * thickness/2;
+ glFrontFace (j < 0 ? GL_CCW : GL_CW);
+ glNormal3f (0, 0, j*1);
+ glBegin (wire_p ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < slices + (wire_p ? 0 : 1); i++) {
+ GLfloat th, cth, sth;
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE,
+ (i % (slices/3) ? gcolor1 : gcolor2));
+ th = i * width;
+ cth = cos(th);
+ sth = sin(th);
+ glVertex3f (cth * ra, sth * ra, z);
+ glVertex3f (cth * rb, sth * rb, z);
+ polys++;
+ }
+ glEnd();
+ }
+
+ /* outer ring */
+ glFrontFace (GL_CCW);
+ glBegin (wire_p ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < slices + (wire_p ? 0 : 1); i++)
+ {
+ GLfloat th = i * width;
+ GLfloat cth = cos(th);
+ GLfloat sth = sin(th);
+ glNormal3f (cth, sth, 0);
+ glVertex3f (cth * ra, sth * ra, thickness/2);
+ glVertex3f (cth * ra, sth * ra, -thickness/2);
+ polys++;
+ }
+ glEnd();
+
+ /* inner ring */
+ glFrontFace (GL_CW);
+ glBegin (wire_p ? GL_LINES : GL_QUAD_STRIP);
+ for (i = 0; i < slices + (wire_p ? 0 : 1); i++)
+ {
+ GLfloat th = i * width;
+ GLfloat cth = cos(th);
+ GLfloat sth = sin(th);
+ glNormal3f (-cth, -sth, 0);
+ glVertex3f (cth * rb, sth * ra, thickness/2);
+ glVertex3f (cth * rb, sth * ra, -thickness/2);
+ polys++;
+ }
+ glEnd();
+
+ glFrontFace (GL_CCW);
+ glPopMatrix();
+ return polys;
+}
+
+
+static int
+show_bball(ModeInfo *mi, unsigned long color, Trace *s)
+{
+ int polys = 0;
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ /*int offset = (int)(s->angle*64*180/M_PI);*/
+ short x = (short)(SCENE_WIDTH/2 + s->x * sp->scale);
+ short y = (short)(SCENE_HEIGHT - s->y * sp->scale);
+ double radius = 12 * sp->scale;
+ GLfloat gcolor1[4] = { 0, 0, 0, 1 };
+ GLfloat gcolor2[4] = { 0, 0, 0, 1 };
+ int slices = 16;
+ int i, j;
+
+ /* Avoid wrapping */
+ if(s->y*sp->scale > SCENE_HEIGHT * 2) return 0;
+
+ gcolor1[0] = mi->colors[color].red / 65536.0;
+ gcolor1[1] = mi->colors[color].green / 65536.0;
+ gcolor1[2] = mi->colors[color].blue / 65536.0;
+
+ glFrontFace(GL_CCW);
+
+ {
+ GLfloat scale = radius;
+ glPushMatrix();
+
+ glTranslatef(0, -6, 5); /* position on top of hand */
+
+ glTranslatef(x, y, 0);
+ glScalef(scale, scale, scale);
+ glRotatef (s->angle / M_PI*180, 1, 0, 1);
+
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gcolor1);
+ polys += unit_sphere (slices, slices, MI_IS_WIREFRAME(mi));
+
+ glRotatef (90, 0, 0, 1);
+ glTranslatef (0, 0, 0.81);
+ glScalef(0.15, 0.15, 0.15);
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gcolor2);
+ for (i = 0; i < 3; i++) {
+ glPushMatrix();
+ glTranslatef (0, 0, 1);
+ glRotatef (360 * i / 3, 0, 0, 1);
+ glTranslatef (2, 0, 0);
+ glRotatef (18, 0, 1, 0);
+ glBegin (MI_IS_WIREFRAME(mi) ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
+ glVertex3f (0, 0, 0);
+ for (j = slices; j >= 0; j--) {
+ GLfloat th = j * M_PI*2 / slices;
+ glVertex3f (cos(th), sin(th), 0);
+ polys++;
+ }
+ glEnd();
+ glPopMatrix();
+ }
+
+ glPopMatrix();
+ }
+ return polys;
+}
+
+
+/**************************************************************************
+ * Public Functions *
+ * *
+ **************************************************************************/
+
+
+/* FIXME: refill_juggle currently just appends new throws to the
+ * programme. This is fine if the programme is empty, but if there
+ * are still some trajectories left then it really should take these
+ * into account */
+
+static void
+refill_juggle(ModeInfo * mi)
+{
+ jugglestruct *sp = NULL;
+ int i;
+
+ if (juggles == NULL)
+ return;
+ sp = &juggles[MI_SCREEN(mi)];
+
+ /* generate pattern */
+
+ if (pattern == NULL) {
+
+#define MAXPAT 10
+#define MAXREPEAT 300
+#define CHANGE_BIAS 8 /* larger makes num_ball changes less likely */
+#define POSITION_BIAS 20 /* larger makes hand movements less likely */
+
+ int count = 0;
+ while (count < MI_CYCLES(mi)) {
+ char buf[MAXPAT * 3 + 3], *b = buf;
+ int maxseen = 0;
+ int l = NRAND(MAXPAT) + 1;
+ int t = NRAND(MIN(MAXREPEAT, (MI_CYCLES(mi) - count))) + 1;
+
+ { /* vary number of balls */
+ int new_balls = sp->num_balls;
+ int change;
+
+ if (new_balls == 2) /* Do not juggle 2 that often */
+ change = NRAND(2 + CHANGE_BIAS / 4);
+ else
+ change = NRAND(2 + CHANGE_BIAS);
+ switch (change) {
+ case 0:
+ new_balls++;
+ break;
+ case 1:
+ new_balls--;
+ break;
+ default:
+ break; /* NO-OP */
+ }
+ if (new_balls < sp->patternindex.minballs) {
+ new_balls += 2;
+ }
+ if (new_balls > sp->patternindex.maxballs) {
+ new_balls -= 2;
+ }
+ if (new_balls < sp->num_balls) {
+ if (!program(mi, "[*]", NULL, 1)) /* lose ball */
+ return;
+ }
+ sp->num_balls = new_balls;
+ }
+
+ count += t;
+ if (NRAND(2) && sp->patternindex.index[sp->num_balls].number) {
+ /* Pick from PortFolio */
+ int p = sp->patternindex.index[sp->num_balls].start +
+ NRAND(sp->patternindex.index[sp->num_balls].number);
+ if (!program(mi, portfolio[p].pattern, portfolio[p].name, t))
+ return;
+ } else {
+ /* Invent a new pattern */
+ *b++='[';
+ for(i = 0; i < l; i++){
+ int n, m;
+ do { /* Triangular Distribution => high values more likely */
+ m = NRAND(sp->num_balls + 1);
+ n = NRAND(sp->num_balls + 1);
+ } while(m >= n);
+ if (n == sp->num_balls) {
+ maxseen = 1;
+ }
+ switch(NRAND(5 + POSITION_BIAS)){
+ case 0: /* Outside throw */
+ *b++ = '+'; break;
+ case 1: /* Cross throw */
+ *b++ = '='; break;
+ case 2: /* Cross catch */
+ *b++ = '&'; break;
+ case 3: /* Cross throw and catch */
+ *b++ = 'x'; break;
+ case 4: /* Bounce */
+ *b++ = '_'; break;
+ default:
+ break; /* Inside throw (default) */
+ }
+
+ *b++ = n + '0';
+ *b++ = ' ';
+ }
+ *b++ = ']';
+ *b = '\0';
+ if (maxseen) {
+ if (!program(mi, buf, NULL, t))
+ return;
+ }
+ }
+ }
+ } else { /* pattern supplied in height or 'a' notation */
+ if (!program(mi, pattern, NULL, MI_CYCLES(mi)))
+ return;
+ }
+
+ adam(sp);
+
+ name(sp);
+
+ if (!part(mi))
+ return;
+
+ lob(mi);
+
+ clap(sp);
+
+ positions(sp);
+
+ if (!projectile(sp)) {
+ free_juggle(mi);
+ return;
+ }
+
+ hands(sp);
+#ifdef DEBUG
+ if(MI_IS_DEBUG(mi)) dump(sp);
+#endif
+}
+
+static void
+change_juggle(ModeInfo * mi)
+{
+ jugglestruct *sp = NULL;
+ Trajectory *t;
+
+ if (juggles == NULL)
+ return;
+ sp = &juggles[MI_SCREEN(mi)];
+
+ /* Strip pending trajectories */
+ for (t = sp->head->next; t != sp->head; t = t->next) {
+ if(t->start > sp->time || t->finish < sp->time) {
+ Trajectory *n = t;
+ t=t->prev;
+ trajectory_destroy(n);
+ }
+ }
+
+ /* Pick the current object theme */
+ sp->objtypes = choose_object();
+
+ refill_juggle(mi);
+
+ mi->polygon_count += show_figure(mi, True);
+}
+
+
+ENTRYPOINT void
+reshape_juggle (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+
+ glViewport (0, 0, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT void
+init_juggle (ModeInfo * mi)
+{
+ jugglestruct *sp = 0;
+ int wire = MI_IS_WIREFRAME(mi);
+
+ MI_INIT (mi, juggles);
+
+ sp = &juggles[MI_SCREEN(mi)];
+
+ if (!sp->glx_context) /* re-initting breaks print_texture_label */
+ sp->glx_context = init_GL(mi);
+
+ sp->font_data = load_texture_font (mi->dpy, "titleFont");
+
+ reshape_juggle (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+ }
+
+ make_random_colormap (0, 0, 0,
+ mi->colors, &MI_NPIXELS(mi),
+ True, False, 0, False);
+
+ {
+ double spin_speed = 0.05;
+ double wander_speed = 0.001;
+ double spin_accel = 0.05;
+ sp->rot = make_rotator (0, spin_speed, 0,
+ spin_accel, wander_speed, False);
+ sp->trackball = gltrackball_init (False);
+ }
+
+ if (only && *only && strcmp(only, " ")) {
+ balls = clubs = torches = knives = rings = bballs = False;
+ if (!strcasecmp (only, "balls")) balls = True;
+ else if (!strcasecmp (only, "clubs")) clubs = True;
+ else if (!strcasecmp (only, "torches")) torches = True;
+ else if (!strcasecmp (only, "knives")) knives = True;
+ else if (!strcasecmp (only, "rings")) rings = True;
+ else if (!strcasecmp (only, "bballs")) bballs = True;
+ else {
+ (void) fprintf (stderr,
+ "Juggle: -only must be one of: balls, clubs, torches, knives,\n"
+ "\t rings, or bballs (not \"%s\")\n", only);
+#ifdef STANDALONE /* xlock mustn't exit merely because of a bad argument */
+ exit (1);
+#endif
+ }
+ }
+
+ /* #### hard to make this look good in OpenGL... */
+ torches = False;
+
+
+ if (sp->head == 0) { /* first time initializing this juggler */
+
+ sp->count = ABS(MI_COUNT(mi));
+ if (sp->count == 0)
+ sp->count = 200;
+
+ /* record start time */
+ sp->begintime = time(NULL);
+ if(sp->patternindex.maxballs > 0) {
+ sp->num_balls = sp->patternindex.minballs +
+ NRAND(sp->patternindex.maxballs - sp->patternindex.minballs);
+ }
+
+ mi->polygon_count +=
+ show_figure(mi, True); /* Draw figure. Also discovers
+ information about the juggler's
+ proportions */
+
+ /* "7" should be about three times the height of the juggler's
+ shoulders */
+ sp->Gr = -GRAVITY(3 * sp->arm[0][RIGHT][SHOULDER].y,
+ 7 * THROW_CATCH_INTERVAL);
+
+ if(!balls && !clubs && !torches && !knives && !rings && !bballs)
+ balls = True; /* Have to juggle something! */
+
+ /* create circular trajectory list */
+ ADD_ELEMENT(Trajectory, sp->head, sp->head);
+ if(sp->head == NULL){
+ free_juggle(mi);
+ return;
+ }
+
+ /* create circular object list */
+ ADD_ELEMENT(Object, sp->objects, sp->objects);
+ if(sp->objects == NULL){
+ free_juggle(mi);
+ return;
+ }
+
+ sp->pattern = strdup(""); /* Initialise saved pattern with
+ free-able memory */
+ }
+
+ sp = &juggles[MI_SCREEN(mi)];
+
+ if (pattern &&
+ (!*pattern ||
+ !strcasecmp (pattern, ".") ||
+ !strcasecmp (pattern, "random")))
+ pattern = NULL;
+
+ if (pattern == NULL && sp->patternindex.maxballs == 0) {
+ /* pattern list needs indexing */
+ int nelements = countof(portfolio);
+ int numpat = 0;
+ int i;
+
+ /* sort according to number of balls */
+ qsort((void*)portfolio, nelements,
+ sizeof(portfolio[1]), compare_num_balls);
+
+ /* last pattern has most balls */
+ sp->patternindex.maxballs = get_num_balls(portfolio[nelements - 1].pattern);
+ /* run through sorted list, indexing start of each group
+ and number in group */
+ sp->patternindex.maxballs = 1;
+ for (i = 0; i < nelements; i++) {
+ int b = get_num_balls(portfolio[i].pattern);
+ if (b > sp->patternindex.maxballs) {
+ sp->patternindex.index[sp->patternindex.maxballs].number = numpat;
+ if(numpat == 0) sp->patternindex.minballs = b;
+ sp->patternindex.maxballs = b;
+ numpat = 1;
+ sp->patternindex.index[sp->patternindex.maxballs].start = i;
+ } else {
+ numpat++;
+ }
+ }
+ sp->patternindex.index[sp->patternindex.maxballs].number = numpat;
+ }
+
+ /* Set up programme */
+ change_juggle(mi);
+
+ /* Only put things here that won't interrupt the programme during
+ a window resize */
+
+ /* Use MIN so that users can resize in interesting ways, eg
+ narrow windows for tall patterns, etc */
+ sp->scale = MIN(SCENE_HEIGHT/480.0, SCENE_WIDTH/160.0);
+
+}
+
+ENTRYPOINT Bool
+juggle_handle_event (ModeInfo *mi, XEvent *event)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, sp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &sp->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ change_juggle (mi);
+ return True;
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+draw_juggle (ModeInfo *mi)
+{
+ jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ Trajectory *traj = NULL;
+ Object *o = NULL;
+ unsigned long future = 0;
+ char *pattern = NULL;
+
+ if (!sp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(sp->glx_context));
+
+ glShadeModel(GL_SMOOTH);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+ glRotatef(current_device_rotation(), 0, 0, 1);
+
+ glTranslatef(0,-3,0);
+
+ {
+ double x, y, z;
+ get_position (sp->rot, &x, &y, &z, !sp->button_down_p);
+ glTranslatef((x - 0.5) * 8,
+ (y - 0.5) * 3,
+ (z - 0.5) * 15);
+
+ gltrackball_rotate (sp->trackball);
+
+ get_rotation (sp->rot, &x, &y, &z, !sp->button_down_p);
+
+ if (y < 0.8) y = 0.8 - (y - 0.8); /* always face forward */
+ if (y > 1.2) y = 1.2 - (y - 1.2);
+
+ glRotatef (x * 360, 1.0, 0.0, 0.0);
+ glRotatef (y * 360, 0.0, 1.0, 0.0);
+ glRotatef (z * 360, 0.0, 0.0, 1.0);
+ }
+
+ {
+ GLfloat scale = 20.0 / SCENE_HEIGHT;
+ glScalef(scale, scale, scale);
+ }
+
+ glRotatef (180, 0, 0, 1);
+ glTranslatef(-SCENE_WIDTH/2, -SCENE_HEIGHT/2, 0);
+ glTranslatef(0, -150, 0);
+
+ mi->polygon_count = 0;
+
+ /* Update timer */
+ if (real) {
+ struct timeval tv;
+ (void)gettimeofday(&tv, NULL);
+ sp->time = (int) ((tv.tv_sec - sp->begintime)*1000 + tv.tv_usec/1000);
+ } else {
+ sp->time += MI_DELAY(mi) / 1000;
+ }
+
+ /* First pass: Move arms and strip out expired elements */
+ for (traj = sp->head->next; traj != sp->head; traj = traj->next) {
+ if (traj->status != PREDICTOR) {
+ /* Skip any elements that need further processing */
+ /* We could remove them, but there shoudn't be many and they
+ would be needed if we ever got the pattern refiller
+ working */
+ continue;
+ }
+ if (traj->start > future) { /* Lookahead to the end of the show */
+ future = traj->start;
+ }
+ if (sp->time < traj->start) { /* early */
+ continue;
+ } else if (sp->time < traj->finish) { /* working */
+
+ /* Look for pattern name */
+ if(traj->pattern != NULL) {
+ pattern=traj->pattern;
+ }
+
+ if (traj->type == Empty || traj->type == Full) {
+ /* Only interested in hands on this pass */
+/* double angle = traj->angle + traj->spin * (sp->time - traj->start);*/
+ double xd = 0, yd = 0;
+ DXPoint p;
+
+ /* Find the catching offset */
+ if(traj->object != NULL) {
+#if 0
+ /* #### not sure what this is doing, but I'm guessing
+ that the use of PERSPEC means this isn't needed
+ in the OpenGL version? -jwz
+ */
+ if(ObjectDefs[traj->object->type].handle > 0) {
+ /* Handles Need to be oriented */
+ xd = ObjectDefs[traj->object->type].handle *
+ PERSPEC * sin(angle);
+ yd = ObjectDefs[traj->object->type].handle *
+ cos(angle);
+ } else
+#endif
+ {
+ /* Balls are always caught at the bottom */
+ xd = 0;
+ yd = -4;
+ }
+ }
+ p.x = (CUBIC(traj->xp, sp->time) - xd);
+ p.y = (CUBIC(traj->yp, sp->time) + yd);
+ reach_arm(mi, traj->hand, &p);
+
+ /* Store updated hand position */
+ traj->x = p.x + xd;
+ traj->y = p.y - yd;
+ }
+ if (traj->type == Ball || traj->type == Full) {
+ /* Only interested in objects on this pass */
+ double x, y;
+ Trace *s;
+
+ if(traj->type == Full) {
+ /* Adjusted these in the first pass */
+ x = traj->x;
+ y = traj->y;
+ } else {
+ x = CUBIC(traj->xp, sp->time);
+ y = CUBIC(traj->yp, sp->time);
+ }
+
+ ADD_ELEMENT(Trace, s, traj->object->trace->prev);
+ s->x = x;
+ s->y = y;
+ s->angle = traj->angle + traj->spin * (sp->time - traj->start);
+ s->divisions = traj->divisions;
+ traj->object->tracelen++;
+ traj->object->active = True;
+ }
+ } else { /* expired */
+ Trajectory *n = traj;
+ traj=traj->prev;
+ trajectory_destroy(n);
+ }
+ }
+
+
+ mi->polygon_count += show_figure(mi, False);
+ mi->polygon_count += show_arms(mi);
+
+ /* Draw Objects */
+ glTranslatef(0, 0, ARMLENGTH);
+ for (o = sp->objects->next; o != sp->objects; o = o->next) {
+ if(o->active) {
+ mi->polygon_count += ObjectDefs[o->type].draw(mi, o->color,
+ o->trace->prev);
+ o->active = False;
+ }
+ }
+
+
+ /* Save pattern name so we can erase it when it changes */
+ if(pattern != NULL && strcmp(sp->pattern, pattern) != 0 ) {
+ free(sp->pattern);
+ sp->pattern = strdup(pattern);
+
+ if (MI_IS_VERBOSE(mi)) {
+ (void) fprintf(stderr, "Juggle[%d]: Running: %s\n",
+ MI_SCREEN(mi), sp->pattern);
+ }
+ }
+
+ glColor3f (1, 1, 0);
+ print_texture_label (mi->dpy, sp->font_data,
+ mi->xgwa.width, mi->xgwa.height,
+ 1, sp->pattern);
+
+#ifdef MEMTEST
+ if((int)(sp->time/10) % 1000 == 0)
+ (void) fprintf(stderr, "sbrk: %d\n", (int)sbrk(0));
+#endif
+
+ if (future < sp->time + 100 * THROW_CATCH_INTERVAL) {
+ refill_juggle(mi);
+ } else if (sp->time > 1<<30) { /* Hard Reset before the clock wraps */
+ init_juggle(mi);
+ }
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE_2 ("Juggler3D", juggler3d, juggle)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/juggler3d.man b/hacks/glx/juggler3d.man
new file mode 100644
index 0000000..48d4716
--- /dev/null
+++ b/hacks/glx/juggler3d.man
@@ -0,0 +1,183 @@
+'\" t
+.\" ** The above line should force tbl to be used as a preprocessor **
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+juggler3d - juggling man screen saver.
+.SH SYNOPSIS
+.B juggler3d
+[\-display host:display.screen ]
+[\-root ]
+[\-window ]
+[\-mono ]
+[\-install | \-noinstall ]
+[\-visual visual ]
+[\-window\-id id ]
+[\-pattern pattern ]
+[\-tail number ]
+[\-real | \-no\-real ]
+[\-describe | \-no\-describe ]
+[\-balls | \-no\-balls ]
+[\-clubs | \-no\-clubs ]
+[\-torches | \-no\-torches ]
+[\-knives | \-no\-knives ]
+[\-rings | \-no\-rings ]
+[\-bballs | \-no\-bballs ]
+[\-count count ]
+[\-cycles cycles ]
+[\-delay delay ]
+[\-ncolors ncolors ]
+[\-fps]
+.SH DESCRIPTION
+Draws a stick-man juggling various collections of objects.
+.SH OPTIONS
+.I juggler3d
+accepts the following options:
+.TP 8
+.B \-display host:display.screen
+X11 display to use. Overrides
+.B DISPLAY
+environment variable.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-window
+Draw on a newly-created X window. This is the default.
+.TP 8
+.B \-mono
+Draw in monochrome.
+.TP 8
+.B \-install | \-noinstall
+Turn on/off installing colormap.
+.TP 8
+.B \-visual visual
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window\-id id
+Draw on an already existing X window.
+.TP 8
+.B \-pattern\ \(dq pattern \(dq
+Specify juggling pattern in annotated
+.B site-swap
+notation. In
+.B site-swap
+notation, the "height" of each throw is given. E.g., "3" is the height
+needed to juggle a 3\-Cascade. Note that these sequences need to be
+chosen carefully, to avoid collisions.
+
+Annotations indicate relative hand movements or tricks:
+.TS
+cb l.
+\&\- Inside throw (default)
++ Outside throw
+\&= Cross Throw
+& Cross Catch
+x Cross Throw and Catch
+\&_ Bounce
+.TE
+.TP 8
+.B \-pattern\ \(dq[ pattern ]\(dq
+Specify juggling pattern in annotated
+.B Adam
+notation. Adam notation is a little harder to visualize. Each
+integer
+.B n
+represents a cyclic permutation of (0...n). The equivalent
+.B site-swap
+value is determined by calculating how many of the permutations it
+takes to get back to the identity. The largest number used is the
+same as the number of objects in the pattern. The advantage of Adam
+notation is that these sequences do not need to be chosen carefully,
+since all possible sequences are juggle-able. Annotations are the same
+as in
+.B site-swap
+notation.
+
+For example, both of these describe a 3\-Shower:
+.IP
+.B \-pattern\ "+5 1"
+.IP
+.B \-pattern\ "[+3 1]"
+
+For further examples, see the
+.B portfolio
+list in the source code.
+.TP 8
+.B \-tail number
+Minimum Trail Length. 0 \- 100. Default: 1. Objects may override
+this, for example flaming torches always leave a trail.
+.TP 8
+.BR \-real | \-no\-real
+Turn on/off real-time juggling.
+.B Deprecated.
+There should be no need to turn off real-time juggling, even on slow
+systems. Adjust speed using
+.B \-count
+above.
+.TP 8
+.BR \-describe | \-no\-describe
+Turn on/off pattern descriptions.
+.TP 8
+.BR \-balls | \-no\-balls
+Turn on/off Balls.
+.TP 8
+.BR \-clubs | \-no\-clubs
+Turn on/off Clubs.
+.TP 8
+.BR \-torches | \-no\-torches
+Turn on/off Flaming Torches.
+.TP 8
+.BR \-knives | \-no\-knives
+Turn on/off Knives.
+.TP 8
+.BR \-rings | \-no\-rings
+Turn on/off Rings.
+.TP 8
+.BR \-bballs | \-no\-bballs
+Turn on/off Bowling Balls.
+.TP 8
+.B \-count number
+Speed. 50 \- 1000. Default: 200. This determines the expected time
+interval between a throw and the next catch, in milliseconds.
+.TP 8
+.B \-cycles number
+Performance Length. 50 \- 1000. Default: 1000. Setting this smaller
+will force the juggler to switch patterns (and objects) more often.
+.TP 8
+.B \-delay delay
+Additional delay between frames, in microseconds. Default: 10000.
+.B Deprecated.
+Adjust speed using
+.BR \-count .
+.TP 8
+.B \-ncolors ncolors
+Maximum number of colors to use. Default: 32.
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1996,2000,2002,2004 by Tim Auckland. Permission to
+use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided
+that the above copyright notice appear in all copies and that both
+that copyright notice and this permission notice appear in supporting
+documentation. No representations are made about the suitability of
+this software for any purpose. It is provided "as is" without express
+or implied warranty.
+.SH AUTHOR
+Tim Auckland.
+
+Converted to OpenGL by Jamie Zawinski, 2009.
diff --git a/hacks/glx/kaleidocycle.c b/hacks/glx/kaleidocycle.c
new file mode 100644
index 0000000..884400f
--- /dev/null
+++ b/hacks/glx/kaleidocycle.c
@@ -0,0 +1,574 @@
+/* kaleidocycle, Copyright (c) 2013-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * A loop of rotating tetrahedra. Created by jwz, July 2013.
+ * Inspired by, and some math borrowed from:
+ * http://www.kaleidocycles.de/pdf/kaleidocycles_theory.pdf
+ * http://intothecontinuum.tumblr.com/post/50873970770/an-even-number-of-at-least-8-regular-tetrahedra
+ */
+
+
+#define DEFAULTS "*delay: 30000 \n" \
+ "*count: 16 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_kaleidocycle 0
+# define release_kaleidocycle 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "normals.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+#include <math.h>
+
+#ifdef USE_GL /* whole file */
+
+#define DEF_SPIN "Z"
+#define DEF_WANDER "False"
+#define DEF_SPEED "1.0"
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot, *rot2;
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ int min_count, max_count;
+ Bool startup_p;
+
+ int ncolors;
+ XColor *colors;
+ int ccolor;
+
+ GLfloat count;
+ GLfloat th, dth;
+
+ enum { STATIC, IN, OUT } mode, prev_mode;
+
+} kaleidocycle_configuration;
+
+static kaleidocycle_configuration *bps = NULL;
+
+static char *do_spin;
+static GLfloat speed;
+static Bool do_wander;
+
+static XrmOptionDescRec opts[] = {
+ { "-spin", ".spin", XrmoptionSepArg, 0 },
+ { "+spin", ".spin", XrmoptionNoArg, "" },
+ { "-wander", ".wander", XrmoptionNoArg, "True" },
+ { "+wander", ".wander", XrmoptionNoArg, "False" },
+ { "-speed", ".speed", XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+ {&do_spin, "spin", "Spin", DEF_SPIN, t_String},
+ {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+ {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+};
+
+ENTRYPOINT ModeSpecOpt kaleidocycle_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_kaleidocycle (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width * 9/16;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport (0, y, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt( 0.0, 0.0, 30.0,
+ 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0);
+
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT Bool
+kaleidocycle_handle_event (ModeInfo *mi, XEvent *event)
+{
+ kaleidocycle_configuration *bp = &bps[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, bp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &bp->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == '+' || c == '.' || c == '>' || c == '=' || c == '+' ||
+ keysym == XK_Right || keysym == XK_Up || keysym == XK_Next)
+ {
+ bp->mode = IN;
+ return True;
+ }
+ else if ((c == '-' || c == ',' || c == '<' || c == '-' || c == '_' ||
+ keysym == XK_Left || keysym == XK_Down || keysym == XK_Prior) &&
+ bp->count > bp->min_count)
+ {
+ bp->mode = OUT;
+ return True;
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ goto DEF;
+ }
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ DEF:
+ if (bp->count <= bp->min_count)
+ bp->mode = IN;
+ else
+ bp->mode = (random() & 1) ? IN : OUT;
+ return True;
+ }
+
+ return False;
+}
+
+
+
+ENTRYPOINT void
+init_kaleidocycle (ModeInfo *mi)
+{
+ kaleidocycle_configuration *bp;
+ int wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ MI_INIT (mi, bps);
+
+ bp = &bps[MI_SCREEN(mi)];
+
+ bp->glx_context = init_GL(mi);
+
+ reshape_kaleidocycle (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+ glLineWidth (4);
+
+ if (!wire)
+ {
+ GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+ GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ {
+ Bool spinx = False, spiny = False, spinz = False;
+ double spin_speed = 0.25;
+ double wander_speed = 0.005;
+ double spin_accel = 0.2;
+ double twist_speed = 0.25;
+ double twist_accel = 1.0;
+
+ char *s = do_spin;
+ while (*s)
+ {
+ if (*s == 'x' || *s == 'X') spinx = True;
+ else if (*s == 'y' || *s == 'Y') spiny = True;
+ else if (*s == 'z' || *s == 'Z') spinz = True;
+ else if (*s == '0') ;
+ else
+ {
+ fprintf (stderr,
+ "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
+ progname, do_spin);
+ exit (1);
+ }
+ s++;
+ }
+
+ bp->rot = make_rotator (spinx ? spin_speed : 0,
+ spiny ? spin_speed : 0,
+ spinz ? spin_speed : 0,
+ spin_accel,
+ do_wander ? wander_speed : 0,
+ False);
+ bp->rot2 = make_rotator (twist_speed, 0, 0, twist_accel, 0, True);
+
+ bp->trackball = gltrackball_init (True);
+ }
+
+ if (MI_COUNT(mi) < 8) MI_COUNT(mi) = 8;
+ if (MI_COUNT(mi) & 1) MI_COUNT(mi)++;
+
+ bp->min_count = 8;
+ bp->max_count = 12 + MI_COUNT(mi) * 1.3;
+ if (bp->max_count & 1) bp->max_count++;
+ bp->startup_p = True;
+
+ bp->count = 0;
+ bp->mode = IN;
+ bp->prev_mode = IN;
+
+/*
+ bp->count = MI_COUNT(mi);
+ bp->mode = STATIC;
+*/
+
+ bp->ncolors = 512;
+ if (! bp->colors)
+ bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+ make_uniform_colormap (0, 0, 0,
+ bp->colors, &bp->ncolors,
+ False, 0, False);
+
+ for (i = 0; i < bp->ncolors; i++)
+ {
+ /* make colors twice as bright */
+ bp->colors[i].red = (bp->colors[i].red >> 2) + 0x7FFF;
+ bp->colors[i].green = (bp->colors[i].green >> 2) + 0x7FFF;
+ bp->colors[i].blue = (bp->colors[i].blue >> 2) + 0x7FFF;
+ }
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+
+/* t = toroidal rotation, a = radial position
+ colors = 4 colors, 4 channels each.
+ */
+static void
+draw_tetra (ModeInfo *mi, double t, double a, Bool reflect_p,
+ GLfloat *colors)
+{
+ int wire = MI_IS_WIREFRAME(mi);
+
+ XYZ v1, v2, v3, P, Q;
+ XYZ verts[4];
+ int i;
+
+ double scale;
+ double sint = sin(t);
+ double cost = cos(t);
+ double tana = tan(a);
+ double sint2 = sint * sint;
+ double tana2 = tana * tana;
+
+ v1.x = cost;
+ v1.y = 0;
+ v1.z = sint;
+
+ scale = 1 / sqrt (1 + sint2 * tana2);
+ v2.x = scale * -sint;
+ v2.y = scale * -sint * tana;
+ v2.z = scale * cost;
+
+ v3.x = scale * -sint2 * tana;
+ v3.y = scale;
+ v3.z = scale * cost * sint * tana;
+
+ P.x = v3.y / tana - v3.x;
+ P.y = 0;
+ P.z = -v3.z / 2;
+
+ Q.x = v3.y / tana;
+ Q.y = v3.y;
+ Q.z = v3.z / 2;
+
+ verts[0] = P;
+ verts[1] = P;
+ verts[2] = Q;
+ verts[3] = Q;
+
+ scale = sqrt(2) / 2;
+ verts[0].x = P.x - scale * v1.x;
+ verts[0].y = P.y - scale * v1.y;
+ verts[0].z = P.z - scale * v1.z;
+
+ verts[1].x = P.x + scale * v1.x;
+ verts[1].y = P.y + scale * v1.y;
+ verts[1].z = P.z + scale * v1.z;
+
+ verts[2].x = Q.x - scale * v2.x;
+ verts[2].y = Q.y - scale * v2.y;
+ verts[2].z = Q.z - scale * v2.z;
+
+ verts[3].x = Q.x + scale * v2.x;
+ verts[3].y = Q.y + scale * v2.y;
+ verts[3].z = Q.z + scale * v2.z;
+
+ for (i = 0; i < 4; i++)
+ {
+ Bool reflect2_p = ((i + (reflect_p != 0)) & 1);
+ XYZ a = verts[(i+1) % 4];
+ XYZ b = verts[(i+2) % 4];
+ XYZ c = verts[(i+3) % 4];
+ XYZ n = ((i & 1)
+ ? calc_normal (b, a, c)
+ : calc_normal (a, b, c));
+ if (wire)
+ glColor4fv (colors + (i * 4));
+ else
+ glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, colors + (i * 4));
+
+ glFrontFace (reflect2_p ? GL_CW : GL_CCW);
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ glNormal3f (n.x, n.y, n.z);
+ glVertex3f (a.x, a.y, a.z);
+ glVertex3f (b.x, b.y, b.z);
+ glVertex3f (c.x, c.y, c.z);
+ glEnd();
+ }
+}
+
+
+/* Reflect through the plane normal to the given vector.
+ */
+static void
+reflect (double x, double y, double z)
+{
+ GLfloat m[4][4];
+
+ m[0][0] = 1 - (2 * x * x);
+ m[1][0] = -2 * x * y;
+ m[2][0] = -2 * x * z;
+ m[3][0] = 0;
+
+ m[0][1] = -2 * x * y;
+ m[1][1] = 1 - (2 * y * y);
+ m[2][1] = -2 * y * z;
+ m[3][1] = 0;
+
+ m[0][2] = -2 * x * z;
+ m[1][2] = -2 * y * z;
+ m[2][2] = 1 - (2 * z * z);
+ m[3][2] = 0;
+
+ m[0][3] = 0;
+ m[1][3] = 0;
+ m[2][3] = 0;
+ m[3][3] = 1;
+
+ glMultMatrixf (&m[0][0]);
+}
+
+
+ENTRYPOINT void
+draw_kaleidocycle (ModeInfo *mi)
+{
+ kaleidocycle_configuration *bp = &bps[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ GLfloat colors[4*4];
+ GLfloat count;
+ double t, a;
+ int i;
+
+ GLfloat bspec[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat bshiny = 128.0;
+
+ if (!bp->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ mi->polygon_count = 0;
+
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glPushMatrix ();
+
+ {
+ double x, y, z;
+ get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glTranslatef((x - 0.5) * 5,
+ (y - 0.5) * 5,
+ (z - 0.5) * 10);
+
+ gltrackball_rotate (bp->trackball);
+
+ get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+ glRotatef (x * 360, 1, 0, 0);
+ glRotatef (y * 360, 0, 1, 0);
+ glRotatef (z * 360, 0, 0, 1);
+
+ get_rotation (bp->rot2, &x, &y, &z, !bp->button_down_p);
+ bp->th = x * 360 * 10 * speed;
+
+ /* Make sure the twist is always in motion. Without this, the rotator
+ sometimes stops, and for too long, and it's boring looking.
+ */
+ bp->th += speed * bp->dth++;
+ while (bp->dth > 360) bp->dth -= 360;
+ while (bp->th > 360) bp->th -= 360;
+ }
+
+ glMaterialfv (GL_FRONT, GL_SPECULAR, bspec);
+ glMateriali (GL_FRONT, GL_SHININESS, bshiny);
+
+
+ /* Evenly spread the colors of the faces, and cycle them together.
+ */
+ for (i = 0; i < 4; i++)
+ {
+ int o = bp->ncolors / 4;
+ int c = (bp->ccolor + (o*i)) % bp->ncolors;
+ colors[i*4+0] = bp->colors[c].red / 65536.0;
+ colors[i*4+1] = bp->colors[c].green / 65536.0;
+ colors[i*4+2] = bp->colors[c].blue / 65536.0;
+ colors[i*4+3] = 1;
+ }
+ bp->ccolor++;
+ if (bp->ccolor >= bp->ncolors) bp->ccolor = 0;
+
+
+ count = (int) floor (bp->count);
+ while (count < 8) count++;
+ if (((int) floor (count)) & 1) count++;
+
+ a = 2 * M_PI / (bp->count < 8 ? 8 : bp->count);
+ t = bp->th / (180 / M_PI);
+
+ glScalef (3, 3, 3);
+ glScalef (a, a, a);
+ glRotatef (90, 0, 0, 1);
+/* glRotatef (45, 0, 1, 0); */
+
+ for (i = 0; i <= (int) floor (bp->count); i++)
+ {
+ Bool flip_p = (i & 1);
+ glPushMatrix();
+ glRotatef ((i/2) * 4 * 180 / bp->count, 0, 0, 1);
+ if (flip_p) reflect (-sin(a), cos(a), 0);
+
+ if (bp->mode != STATIC && i >= (int) floor (bp->count))
+ {
+ /* Fractional bp->count means the last piece is in transition */
+ GLfloat scale = bp->count - (int) floor (bp->count);
+ GLfloat tick = 0.07 * speed;
+ GLfloat ocount = bp->count;
+ GLfloat alpha;
+
+ /* Fill in faster if we're starting up */
+ if (bp->count < MI_COUNT(mi))
+ tick *= 2;
+
+ glScalef (scale, scale, scale);
+
+ switch (bp->mode) {
+ case IN: break;
+ case OUT: tick = -tick; break;
+ case STATIC: tick = 0; break;
+ }
+
+ bp->count += tick;
+
+ if (bp->mode == IN
+ ? floor (ocount) != floor (bp->count)
+ : ceil (ocount) != ceil (bp->count))
+ {
+ if (bp->mode == IN)
+ bp->count = floor (ocount) + 1;
+ else
+ bp->count = ceil (ocount) - 1;
+
+ if (((int) floor (bp->count)) & 1 ||
+ (bp->mode == IN &&
+ (bp->count < MI_COUNT(mi) &&
+ bp->startup_p)))
+ {
+ /* keep going if it's odd, or less than 8. */
+ bp->count = round(bp->count);
+ }
+ else
+ {
+ bp->mode = STATIC;
+ bp->startup_p = False;
+ }
+ }
+
+ alpha = (scale * scale * scale * scale);
+ if (alpha < 0.4) alpha = 0.4;
+ colors[3] = colors[7] = colors[11] = colors[15] = alpha;
+ }
+
+ draw_tetra (mi, t, a, flip_p, colors);
+ mi->polygon_count += 4;
+
+ glPopMatrix();
+ }
+
+ if (bp->mode == STATIC && !(random() % 200)) {
+ if (bp->count <= bp->min_count)
+ bp->mode = IN;
+ else if (bp->count >= bp->max_count)
+ bp->mode = OUT;
+ else
+ bp->mode = bp->prev_mode;
+
+ bp->prev_mode = bp->mode;
+ }
+
+
+ mi->recursion_depth = ceil (bp->count);
+
+ glPopMatrix ();
+
+ if (mi->fps_p) do_fps (mi);
+ glFinish();
+
+ glXSwapBuffers(dpy, window);
+}
+
+XSCREENSAVER_MODULE ("Kaleidocycle", kaleidocycle)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/kaleidocycle.man b/hacks/glx/kaleidocycle.man
new file mode 100644
index 0000000..874d82d
--- /dev/null
+++ b/hacks/glx/kaleidocycle.man
@@ -0,0 +1,96 @@
+.de EX \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "25-Jul-98" "X Version 11"
+.SH NAME
+kaleidocycle - draws twistable rings of tetrahedra
+.SH SYNOPSIS
+.B kaleidocycle
+[\-display \fIhost:display.screen\fP] [\-window] [\-root]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP]
+[\-count \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-wander] [\-no-wander]
+[\-spin \fIaxes\fP]
+[\-no-spin]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+The \fIkaleidocycle\fP program draws a ring composed of tetrahedra
+connected at the edges that twists and rotates toroidally. Segments
+are occasionally inserted or removed.
+.SH OPTIONS
+.I kaleidocycle
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-count \fInumber\fP
+The initial number of segments. Default 16. Must be 8 or greater, and
+an even number.
+.TP 8
+.B \-speed \fInumber\fP
+Adjust the animation speed. 0.5 for half as fast, 2.0 for twice as fast.
+.TP 8
+.B \-wander
+Move the text around the screen. This is the default.
+.TP 8
+.B \-no\-wander
+Keep the text centered on the screen.
+.TP 8
+.B \-spin
+Which axes around which the text should spin. The default is "Z",
+meaning rotate the object the plane of the screen only.
+.TP 8
+.B \-no\-spin
+Don't spin the text at all: the same as \fB\-spin ""\fP.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2001-2013 by Jamie Zawinski.
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation. No representations are made about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>
diff --git a/hacks/glx/klein.c b/hacks/glx/klein.c
new file mode 100644
index 0000000..1c042da
--- /dev/null
+++ b/hacks/glx/klein.c
@@ -0,0 +1,2099 @@
+/* klein --- Shows a Klein bottle that rotates in 4d or on which you
+ can walk */
+
+#if 0
+static const char sccsid[] = "@(#)klein.c 1.1 08/10/04 xlockmore";
+#endif
+
+/* Copyright (c) 2005-2014 Carsten Steger <carsten@mirsanmir.org>. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * REVISION HISTORY:
+ * C. Steger - 08/10/04: Initial version
+ * C. Steger - 09/08/03: Changes to the parameter handling
+ * C. Steger - 13/12/25: Added the squeezed torus Klein bottle
+ * C. Steger - 14/10/03: Moved the curlicue texture to curlicue.h
+ */
+
+/*
+ * This program shows three different Klein bottles in 4d: the figure-8 Klein
+ * bottle, the squeezed torus Klein bottle, or the Lawson Klein bottle. You
+ * can walk on the Klein bottle, see it turn in 4d, or walk on it while it
+ * turns in 4d. The figure-8 Klein bottle is well known in its 3d form. The
+ * 4d form used in this program is an extension of the 3d form to 4d that
+ * does not intersect itself in 4d (which can be seen in the depth colors
+ * mode). The squeezed torus Klein bottle also does not intersect itself in
+ * 4d (which can be seen in the depth colors mode). The Lawson Klein bottle,
+ * on the other hand, does intersect itself in 4d. Its primary use is that
+ * it has a nice appearance for walking and for turning in 3d. The Klein
+ * bottle is a non-orientable surface. To make this apparent, the two-sided
+ * color mode can be used. Alternatively, orientation markers (curling
+ * arrows) can be drawn as a texture map on the surface of the Klein bottle.
+ * While walking on the Klein bottle, you will notice that the orientation
+ * of the curling arrows changes (which it must because the Klein bottle is
+ * non-orientable). The program projects the 4d Klein bottle to 3d using
+ * either a perspective or an orthographic projection. Which of the two
+ * alternatives looks more appealing depends on the viewing mode and the
+ * Klein bottle. For example, the Lawson Klein bottle looks nicest when
+ * projected perspectively. The figure-8 Klein bottle, on the other
+ * hand, looks nicer while walking when projected orthographically from 4d.
+ * For the squeezed torus Klein bottle, both projection modes give equally
+ * acceptable projections. The projected Klein bottle can then be projected
+ * to the screen either perspectively or orthographically. When using the
+ * walking modes, perspective projection to the screen should be used. There
+ * are three display modes for the Klein bottle: mesh (wireframe), solid, or
+ * transparent. Furthermore, the appearance of the Klein bottle can be as
+ * a solid object or as a set of see-through bands. Finally, the colors
+ * with with the Klein bottle is drawn can be set to two-sided, rainbow, or
+ * depth. In the first case, the Klein bottle is drawn with red on one
+ * "side" and green on the "other side". Of course, the Klein bottle only
+ * has one side, so the color jumps from red to green along a curve on the
+ * surface of the Klein bottle. This mode enables you to see that the Klein
+ * bottle is non-orientable. The second mode draws the Klein bottle with
+ * fully saturated rainbow colors. This gives a very nice effect when
+ * combined with the see-through bands mode or with the orientation markers
+ * drawn. The third mode draws the Klein bottle with colors that are chosen
+ * according to the 4d "depth" of the points. This mode enables you to see
+ * that the figure-8 and squeezed torus Klein bottles do not intersect
+ * themselves in 4d, while the Lawson Klein bottle does intersect itself.
+ * The rotation speed for each of the six planes around which the Klein
+ * bottle rotates can be chosen. For the walk-and-turn more, only the
+ * rotation speeds around the true 4d planes are used (the xy, xz, and yz
+ * planes). Furthermore, in the walking modes the walking direction in the
+ * 2d base square of the Klein bottle and the walking speed can be chosen.
+ * This program is somewhat inspired by Thomas Banchoff's book "Beyond the
+ * Third Dimension: Geometry, Computer Graphics, and Higher Dimensions",
+ * Scientific American Library, 1990.
+ */
+
+#include "curlicue.h"
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+#define KLEIN_BOTTLE_FIGURE_8 0
+#define KLEIN_BOTTLE_SQUEEZED_TORUS 1
+#define KLEIN_BOTTLE_LAWSON 2
+#define NUM_KLEIN_BOTTLES 3
+
+#define DISP_WIREFRAME 0
+#define DISP_SURFACE 1
+#define DISP_TRANSPARENT 2
+#define NUM_DISPLAY_MODES 3
+
+#define APPEARANCE_SOLID 0
+#define APPEARANCE_BANDS 1
+#define NUM_APPEARANCES 2
+
+#define COLORS_TWOSIDED 0
+#define COLORS_RAINBOW 1
+#define COLORS_DEPTH 2
+#define NUM_COLORS 3
+
+#define VIEW_WALK 0
+#define VIEW_TURN 1
+#define VIEW_WALKTURN 2
+#define NUM_VIEW_MODES 3
+
+#define DISP_3D_PERSPECTIVE 0
+#define DISP_3D_ORTHOGRAPHIC 1
+#define NUM_DISP_3D_MODES 2
+
+#define DISP_4D_PERSPECTIVE 0
+#define DISP_4D_ORTHOGRAPHIC 1
+#define NUM_DISP_4D_MODES 2
+
+#define DEF_KLEIN_BOTTLE "random"
+#define DEF_DISPLAY_MODE "random"
+#define DEF_APPEARANCE "random"
+#define DEF_COLORS "random"
+#define DEF_VIEW_MODE "random"
+#define DEF_MARKS "False"
+#define DEF_PROJECTION_3D "random"
+#define DEF_PROJECTION_4D "random"
+#define DEF_SPEEDWX "1.1"
+#define DEF_SPEEDWY "1.3"
+#define DEF_SPEEDWZ "1.5"
+#define DEF_SPEEDXY "1.7"
+#define DEF_SPEEDXZ "1.9"
+#define DEF_SPEEDYZ "2.1"
+#define DEF_WALK_DIRECTION "7.0"
+#define DEF_WALK_SPEED "20.0"
+
+#ifdef STANDALONE
+# define DEFAULTS "*delay: 10000 \n" \
+ "*showFPS: False \n" \
+
+# define free_klein 0
+# define release_klein 0
+# include "xlockmore.h" /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h" /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#ifndef HAVE_JWXYZ
+# include <X11/keysym.h>
+#endif
+
+#include "gltrackball.h"
+
+
+#ifdef USE_MODULES
+ModStruct klein_description =
+{"klein", "init_klein", "draw_klein", NULL,
+ "draw_klein", "change_klein", NULL, &klein_opts,
+ 25000, 1, 1, 1, 1.0, 4, "",
+ "Rotate a Klein bottle in 4d or walk on it", 0, NULL};
+
+#endif
+
+
+static char *klein_bottle;
+static char *mode;
+static char *appear;
+static char *color_mode;
+static char *view_mode;
+static Bool marks;
+static char *proj_3d;
+static char *proj_4d;
+static float speed_wx;
+static float speed_wy;
+static float speed_wz;
+static float speed_xy;
+static float speed_xz;
+static float speed_yz;
+static float walk_direction;
+static float walk_speed;
+
+
+static XrmOptionDescRec opts[] =
+{
+ {"-klein-bottle", ".kleinBottle", XrmoptionSepArg, 0 },
+ {"-figure-8", ".kleinBottle", XrmoptionNoArg, "figure-8" },
+ {"-squeezed-torus", ".kleinBottle", XrmoptionNoArg, "squeezed-torus" },
+ {"-lawson", ".kleinBottle", XrmoptionNoArg, "lawson" },
+ {"-mode", ".displayMode", XrmoptionSepArg, 0 },
+ {"-wireframe", ".displayMode", XrmoptionNoArg, "wireframe" },
+ {"-surface", ".displayMode", XrmoptionNoArg, "surface" },
+ {"-transparent", ".displayMode", XrmoptionNoArg, "transparent" },
+ {"-appearance", ".appearance", XrmoptionSepArg, 0 },
+ {"-solid", ".appearance", XrmoptionNoArg, "solid" },
+ {"-bands", ".appearance", XrmoptionNoArg, "bands" },
+ {"-colors", ".colors", XrmoptionSepArg, 0 },
+ {"-twosided", ".colors", XrmoptionNoArg, "two-sided" },
+ {"-rainbow", ".colors", XrmoptionNoArg, "rainbow" },
+ {"-depth", ".colors", XrmoptionNoArg, "depth" },
+ {"-view-mode", ".viewMode", XrmoptionSepArg, 0 },
+ {"-walk", ".viewMode", XrmoptionNoArg, "walk" },
+ {"-turn", ".viewMode", XrmoptionNoArg, "turn" },
+ {"-walk-turn", ".viewMode", XrmoptionNoArg, "walk-turn" },
+ {"-orientation-marks", ".marks", XrmoptionNoArg, "on"},
+ {"+orientation-marks", ".marks", XrmoptionNoArg, "off"},
+ {"-projection-3d", ".projection3d", XrmoptionSepArg, 0 },
+ {"-perspective-3d", ".projection3d", XrmoptionNoArg, "perspective" },
+ {"-orthographic-3d", ".projection3d", XrmoptionNoArg, "orthographic" },
+ {"-projection-4d", ".projection4d", XrmoptionSepArg, 0 },
+ {"-perspective-4d", ".projection4d", XrmoptionNoArg, "perspective" },
+ {"-orthographic-4d", ".projection4d", XrmoptionNoArg, "orthographic" },
+ {"-speed-wx", ".speedwx", XrmoptionSepArg, 0 },
+ {"-speed-wy", ".speedwy", XrmoptionSepArg, 0 },
+ {"-speed-wz", ".speedwz", XrmoptionSepArg, 0 },
+ {"-speed-xy", ".speedxy", XrmoptionSepArg, 0 },
+ {"-speed-xz", ".speedxz", XrmoptionSepArg, 0 },
+ {"-speed-yz", ".speedyz", XrmoptionSepArg, 0 },
+ {"-walk-direction", ".walkDirection", XrmoptionSepArg, 0 },
+ {"-walk-speed", ".walkSpeed", XrmoptionSepArg, 0 }
+};
+
+static argtype vars[] =
+{
+ { &klein_bottle, "kleinBottle", "KleinBottle", DEF_KLEIN_BOTTLE, t_String },
+ { &mode, "displayMode", "DisplayMode", DEF_DISPLAY_MODE, t_String },
+ { &appear, "appearance", "Appearance", DEF_APPEARANCE, t_String },
+ { &color_mode, "colors", "Colors", DEF_COLORS, t_String },
+ { &view_mode, "viewMode", "ViewMode", DEF_VIEW_MODE, t_String },
+ { &marks, "marks", "Marks", DEF_MARKS, t_Bool },
+ { &proj_3d, "projection3d", "Projection3d", DEF_PROJECTION_3D, t_String },
+ { &proj_4d, "projection4d", "Projection4d", DEF_PROJECTION_4D, t_String },
+ { &speed_wx, "speedwx", "Speedwx", DEF_SPEEDWX, t_Float},
+ { &speed_wy, "speedwy", "Speedwy", DEF_SPEEDWY, t_Float},
+ { &speed_wz, "speedwz", "Speedwz", DEF_SPEEDWZ, t_Float},
+ { &speed_xy, "speedxy", "Speedxy", DEF_SPEEDXY, t_Float},
+ { &speed_xz, "speedxz", "Speedxz", DEF_SPEEDXZ, t_Float},
+ { &speed_yz, "speedyz", "Speedyz", DEF_SPEEDYZ, t_Float},
+ { &walk_direction, "walkDirection", "WalkDirection", DEF_WALK_DIRECTION, t_Float},
+ { &walk_speed, "walkSpeed", "WalkSpeed", DEF_WALK_SPEED, t_Float}
+};
+
+ENTRYPOINT ModeSpecOpt klein_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, NULL};
+
+
+/* Radius of the figure-8 Klein bottle */
+#define FIGURE_8_RADIUS 2.0
+
+/* Radius of the squeezed torus Klein bottle */
+#define SQUEEZED_TORUS_RADIUS 2.0
+
+/* Offset by which we walk above the Klein bottle */
+#define DELTAY 0.02
+
+/* Number of subdivisions of the Klein bottle */
+#define NUMU 128
+#define NUMV 128
+
+/* Number of subdivisions per band */
+#define NUMB 8
+
+
+typedef struct {
+ GLint WindH, WindW;
+ GLXContext *glx_context;
+ /* Options */
+ int bottle_type;
+ int display_mode;
+ int appearance;
+ int colors;
+ int view;
+ int projection_3d;
+ int projection_4d;
+ /* 4D rotation angles */
+ float alpha, beta, delta, zeta, eta, theta;
+ /* Movement parameters */
+ float umove, vmove, dumove, dvmove;
+ int side;
+ /* The viewing offset in 4d */
+ float offset4d[4];
+ /* The viewing offset in 3d */
+ float offset3d[4];
+ /* The 4d coordinates of the Klein bottle and their derivatives */
+ float x[(NUMU+1)*(NUMV+1)][4];
+ float xu[(NUMU+1)*(NUMV+1)][4];
+ float xv[(NUMU+1)*(NUMV+1)][4];
+ float pp[(NUMU+1)*(NUMV+1)][3];
+ float pn[(NUMU+1)*(NUMV+1)][3];
+ /* The precomputed colors of the Klein bottle */
+ float col[(NUMU+1)*(NUMV+1)][4];
+ /* The precomputed texture coordinates of the Klein bottle */
+ float tex[(NUMU+1)*(NUMV+1)][2];
+ /* The "curlicue" texture */
+ GLuint tex_name;
+ /* Aspect ratio of the current window */
+ float aspect;
+ /* Trackball states */
+ trackball_state *trackballs[2];
+ int current_trackball;
+ Bool button_pressed;
+ /* A random factor to modify the rotation speeds */
+ float speed_scale;
+} kleinstruct;
+
+static kleinstruct *klein = (kleinstruct *) NULL;
+
+
+/* Add a rotation around the wx-plane to the matrix m. */
+static void rotatewx(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][1];
+ v = m[i][2];
+ m[i][1] = c*u+s*v;
+ m[i][2] = -s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the wy-plane to the matrix m. */
+static void rotatewy(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][0];
+ v = m[i][2];
+ m[i][0] = c*u-s*v;
+ m[i][2] = s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the wz-plane to the matrix m. */
+static void rotatewz(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][0];
+ v = m[i][1];
+ m[i][0] = c*u+s*v;
+ m[i][1] = -s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the xy-plane to the matrix m. */
+static void rotatexy(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][2];
+ v = m[i][3];
+ m[i][2] = c*u+s*v;
+ m[i][3] = -s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the xz-plane to the matrix m. */
+static void rotatexz(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][1];
+ v = m[i][3];
+ m[i][1] = c*u-s*v;
+ m[i][3] = s*u+c*v;
+ }
+}
+
+
+/* Add a rotation around the yz-plane to the matrix m. */
+static void rotateyz(float m[4][4], float phi)
+{
+ float c, s, u, v;
+ int i;
+
+ phi *= M_PI/180.0;
+ c = cos(phi);
+ s = sin(phi);
+ for (i=0; i<4; i++)
+ {
+ u = m[i][0];
+ v = m[i][3];
+ m[i][0] = c*u-s*v;
+ m[i][3] = s*u+c*v;
+ }
+}
+
+
+/* Compute the rotation matrix m from the rotation angles. */
+static void rotateall(float al, float be, float de, float ze, float et,
+ float th, float m[4][4])
+{
+ int i, j;
+
+ for (i=0; i<4; i++)
+ for (j=0; j<4; j++)
+ m[i][j] = (i==j);
+ rotatewx(m,al);
+ rotatewy(m,be);
+ rotatewz(m,de);
+ rotatexy(m,ze);
+ rotatexz(m,et);
+ rotateyz(m,th);
+}
+
+
+/* Compute the rotation matrix m from the 4d rotation angles. */
+static void rotateall4d(float ze, float et, float th, float m[4][4])
+{
+ int i, j;
+
+ for (i=0; i<4; i++)
+ for (j=0; j<4; j++)
+ m[i][j] = (i==j);
+ rotatexy(m,ze);
+ rotatexz(m,et);
+ rotateyz(m,th);
+}
+
+
+/* Multiply two rotation matrices: o=m*n. */
+static void mult_rotmat(float m[4][4], float n[4][4], float o[4][4])
+{
+ int i, j, k;
+
+ for (i=0; i<4; i++)
+ {
+ for (j=0; j<4; j++)
+ {
+ o[i][j] = 0.0;
+ for (k=0; k<4; k++)
+ o[i][j] += m[i][k]*n[k][j];
+ }
+ }
+}
+
+
+/* Compute a 4D rotation matrix from two unit quaternions. */
+static void quats_to_rotmat(float p[4], float q[4], float m[4][4])
+{
+ double al, be, de, ze, et, th;
+ double r00, r01, r02, r12, r22;
+
+ r00 = 1.0-2.0*(p[1]*p[1]+p[2]*p[2]);
+ r01 = 2.0*(p[0]*p[1]+p[2]*p[3]);
+ r02 = 2.0*(p[2]*p[0]-p[1]*p[3]);
+ r12 = 2.0*(p[1]*p[2]+p[0]*p[3]);
+ r22 = 1.0-2.0*(p[1]*p[1]+p[0]*p[0]);
+
+ al = atan2(-r12,r22)*180.0/M_PI;
+ be = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
+ de = atan2(-r01,r00)*180.0/M_PI;
+
+ r00 = 1.0-2.0*(q[1]*q[1]+q[2]*q[2]);
+ r01 = 2.0*(q[0]*q[1]+q[2]*q[3]);
+ r02 = 2.0*(q[2]*q[0]-q[1]*q[3]);
+ r12 = 2.0*(q[1]*q[2]+q[0]*q[3]);
+ r22 = 1.0-2.0*(q[1]*q[1]+q[0]*q[0]);
+
+ et = atan2(-r12,r22)*180.0/M_PI;
+ th = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
+ ze = atan2(-r01,r00)*180.0/M_PI;
+
+ rotateall(al,be,de,ze,et,-th,m);
+}
+
+
+/* Compute a fully saturated and bright color based on an angle. */
+static void color(kleinstruct *kb, double angle, float col[4])
+{
+ int s;
+ double t;
+
+ if (kb->colors == COLORS_TWOSIDED)
+ return;
+
+ if (angle >= 0.0)
+ angle = fmod(angle,2.0*M_PI);
+ else
+ angle = fmod(angle,-2.0*M_PI);
+ s = floor(angle/(M_PI/3));
+ t = angle/(M_PI/3)-s;
+ if (s >= 6)
+ s = 0;
+ switch (s)
+ {
+ case 0:
+ col[0] = 1.0;
+ col[1] = t;
+ col[2] = 0.0;
+ break;
+ case 1:
+ col[0] = 1.0-t;
+ col[1] = 1.0;
+ col[2] = 0.0;
+ break;
+ case 2:
+ col[0] = 0.0;
+ col[1] = 1.0;
+ col[2] = t;
+ break;
+ case 3:
+ col[0] = 0.0;
+ col[1] = 1.0-t;
+ col[2] = 1.0;
+ break;
+ case 4:
+ col[0] = t;
+ col[1] = 0.0;
+ col[2] = 1.0;
+ break;
+ case 5:
+ col[0] = 1.0;
+ col[1] = 0.0;
+ col[2] = 1.0-t;
+ break;
+ }
+ if (kb->display_mode == DISP_TRANSPARENT)
+ col[3] = 0.7;
+ else
+ col[3] = 1.0;
+}
+
+
+/* Set up the figure-8 Klein bottle coordinates, colors, and texture. */
+static void setup_figure8(ModeInfo *mi, double umin, double umax, double vmin,
+ double vmax)
+{
+ int i, j, k, l;
+ double u, v, ur, vr;
+ double cu, su, cv, sv, cv2, sv2, c2u, s2u;
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (i=0; i<=NUMU; i++)
+ {
+ for (j=0; j<=NUMV; j++)
+ {
+ k = i*(NUMV+1)+j;
+ u = -ur*j/NUMU+umin;
+ v = vr*i/NUMV+vmin;
+ if (kb->colors == COLORS_DEPTH)
+ color(kb,(cos(u)+1.0)*M_PI*2.0/3.0,kb->col[k]);
+ else
+ color(kb,v,kb->col[k]);
+ kb->tex[k][0] = -32*u/(2.0*M_PI);
+ kb->tex[k][1] = 32*v/(2.0*M_PI);
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ c2u = cos(2.0*u);
+ s2u = sin(2.0*u);
+ kb->x[k][0] = (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*cv;
+ kb->x[k][1] = (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*sv;
+ kb->x[k][2] = su*sv2+s2u*cv2;
+ kb->x[k][3] = cu;
+ kb->xu[k][0] = (cu*cv2-2.0*c2u*sv2)*cv;
+ kb->xu[k][1] = (cu*cv2-2.0*c2u*sv2)*sv;
+ kb->xu[k][2] = cu*sv2+2.0*c2u*cv2;
+ kb->xu[k][3] = -su;
+ kb->xv[k][0] = ((-0.5*su*sv2-0.5*s2u*cv2)*cv-
+ (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*sv);
+ kb->xv[k][1] = ((-0.5*su*sv2-0.5*s2u*cv2)*sv+
+ (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*cv);
+ kb->xv[k][2] = 0.5*su*cv2-0.5*s2u*sv2;
+ kb->xv[k][3] = 0.0;
+ for (l=0; l<4; l++)
+ {
+ kb->x[k][l] /= FIGURE_8_RADIUS+1.25;
+ kb->xu[k][l] /= FIGURE_8_RADIUS+1.25;
+ kb->xv[k][l] /= FIGURE_8_RADIUS+1.25;
+ }
+ }
+ }
+}
+
+
+/* Set up the squeezed torus Klein bottle coordinates, colors, and texture. */
+static void setup_squeezed_torus(ModeInfo *mi, double umin, double umax,
+ double vmin, double vmax)
+{
+ int i, j, k, l;
+ double u, v, ur, vr;
+ double cu, su, cv, sv, cv2, sv2;
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (i=0; i<=NUMU; i++)
+ {
+ for (j=0; j<=NUMV; j++)
+ {
+ k = i*(NUMV+1)+j;
+ u = -ur*j/NUMU+umin;
+ v = vr*i/NUMV+vmin;
+ if (kb->colors == COLORS_DEPTH)
+ color(kb,(sin(u)*sin(0.5*v)+1.0)*M_PI*2.0/3.0,kb->col[k]);
+ else
+ color(kb,v,kb->col[k]);
+ kb->tex[k][0] = -32*u/(2.0*M_PI);
+ kb->tex[k][1] = 32*v/(2.0*M_PI);
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ kb->x[k][0] = (SQUEEZED_TORUS_RADIUS+cu)*cv;
+ kb->x[k][1] = (SQUEEZED_TORUS_RADIUS+cu)*sv;
+ kb->x[k][2] = su*cv2;
+ kb->x[k][3] = su*sv2;
+ kb->xu[k][0] = -su*cv;
+ kb->xu[k][1] = -su*sv;
+ kb->xu[k][2] = cu*cv2;
+ kb->xu[k][3] = cu*sv2;
+ kb->xv[k][0] = -(SQUEEZED_TORUS_RADIUS+cu)*sv;
+ kb->xv[k][1] = (SQUEEZED_TORUS_RADIUS+cu)*cv;
+ kb->xv[k][2] = -0.5*su*sv2;
+ kb->xv[k][3] = 0.5*su*cv2;
+ for (l=0; l<4; l++)
+ {
+ kb->x[k][l] /= SQUEEZED_TORUS_RADIUS+1.25;
+ kb->xu[k][l] /= SQUEEZED_TORUS_RADIUS+1.25;
+ kb->xv[k][l] /= SQUEEZED_TORUS_RADIUS+1.25;
+ }
+ }
+ }
+}
+
+
+/* Set up the Lawson Klein bottle coordinates, colors, and texture. */
+static void setup_lawson(ModeInfo *mi, double umin, double umax, double vmin,
+ double vmax)
+{
+ int i, j, k;
+ double u, v, ur, vr;
+ double cu, su, cv, sv, cv2, sv2;
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ ur = umax-umin;
+ vr = vmax-vmin;
+ for (i=0; i<=NUMV; i++)
+ {
+ for (j=0; j<=NUMU; j++)
+ {
+ k = i*(NUMU+1)+j;
+ u = -ur*j/NUMU+umin;
+ v = vr*i/NUMV+vmin;
+ if (kb->colors == COLORS_DEPTH)
+ color(kb,(sin(u)*cos(0.5*v)+1.0)*M_PI*2.0/3.0,kb->col[k]);
+ else
+ color(kb,v,kb->col[k]);
+ kb->tex[k][0] = -32*u/(2.0*M_PI);
+ kb->tex[k][1] = 32*v/(2.0*M_PI);
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ kb->x[k][0] = cu*cv;
+ kb->x[k][1] = cu*sv;
+ kb->x[k][2] = su*sv2;
+ kb->x[k][3] = su*cv2;
+ kb->xu[k][0] = -su*cv;
+ kb->xu[k][1] = -su*sv;
+ kb->xu[k][2] = cu*sv2;
+ kb->xu[k][3] = cu*cv2;
+ kb->xv[k][0] = -cu*sv;
+ kb->xv[k][1] = cu*cv;
+ kb->xv[k][2] = su*cv2*0.5;
+ kb->xv[k][3] = -su*sv2*0.5;
+ }
+ }
+}
+
+
+/* Draw a figure-8 Klein bottle projected into 3D. */
+static int figure8(ModeInfo *mi, double umin, double umax, double vmin,
+ double vmax)
+{
+ int polys = 0;
+ static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.7 };
+ static const GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
+ float p[3], pu[3], pv[3], pm[3], n[3], b[3], mat[4][4];
+ int i, j, k, l, m, o;
+ double u, v;
+ double xx[4], xxu[4], xxv[4], y[4], yu[4], yv[4];
+ double q, r, s, t;
+ double cu, su, cv, sv, cv2, sv2, c2u, s2u;
+ float q1[4], q2[4], r1[4][4], r2[4][4];
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ {
+ /* Compute the rotation that rotates the Klein bottle in 4D without the
+ trackball rotations. */
+ rotateall4d(kb->zeta,kb->eta,kb->theta,mat);
+
+ u = kb->umove;
+ v = kb->vmove;
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ c2u = cos(2.0*u);
+ s2u = sin(2.0*u);
+ xx[0] = (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*cv;
+ xx[1] = (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*sv;
+ xx[2] = su*sv2+s2u*cv2;
+ xx[3] = cu;
+ xxu[0] = (cu*cv2-2.0*c2u*sv2)*cv;
+ xxu[1] = (cu*cv2-2.0*c2u*sv2)*sv;
+ xxu[2] = cu*sv2+2.0*c2u*cv2;
+ xxu[3] = -su;
+ xxv[0] = ((-0.5*su*sv2-0.5*s2u*cv2)*cv-
+ (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*sv);
+ xxv[1] = ((-0.5*su*sv2-0.5*s2u*cv2)*sv+
+ (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*cv);
+ xxv[2] = 0.5*su*cv2-0.5*s2u*sv2;
+ xxv[3] = 0.0;
+ for (l=0; l<4; l++)
+ {
+ xx[l] /= FIGURE_8_RADIUS+1.25;
+ xxu[l] /= FIGURE_8_RADIUS+1.25;
+ xxv[l] /= FIGURE_8_RADIUS+1.25;
+ }
+ for (l=0; l<4; l++)
+ {
+ y[l] = (mat[l][0]*xx[0]+mat[l][1]*xx[1]+
+ mat[l][2]*xx[2]+mat[l][3]*xx[3]);
+ yu[l] = (mat[l][0]*xxu[0]+mat[l][1]*xxu[1]+
+ mat[l][2]*xxu[2]+mat[l][3]*xxu[3]);
+ yv[l] = (mat[l][0]*xxv[0]+mat[l][1]*xxv[1]+
+ mat[l][2]*xxv[2]+mat[l][3]*xxv[3]);
+ }
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ {
+ p[l] = y[l]+kb->offset4d[l];
+ pu[l] = yu[l];
+ pv[l] = yv[l];
+ }
+ }
+ else
+ {
+ s = y[3]+kb->offset4d[3];
+ q = 1.0/s;
+ t = q*q;
+ for (l=0; l<3; l++)
+ {
+ r = y[l]+kb->offset4d[l];
+ p[l] = r*q;
+ pu[l] = (yu[l]*s-r*yu[3])*t;
+ pv[l] = (yv[l]*s-r*yv[3])*t;
+ }
+ }
+ n[0] = pu[1]*pv[2]-pu[2]*pv[1];
+ n[1] = pu[2]*pv[0]-pu[0]*pv[2];
+ n[2] = pu[0]*pv[1]-pu[1]*pv[0];
+ t = 1.0/(kb->side*4.0*sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]));
+ n[0] *= t;
+ n[1] *= t;
+ n[2] *= t;
+ pm[0] = pu[0]*kb->dumove+pv[0]*kb->dvmove;
+ pm[1] = pu[1]*kb->dumove+pv[1]*kb->dvmove;
+ pm[2] = pu[2]*kb->dumove+pv[2]*kb->dvmove;
+ t = 1.0/(4.0*sqrt(pm[0]*pm[0]+pm[1]*pm[1]+pm[2]*pm[2]));
+ pm[0] *= t;
+ pm[1] *= t;
+ pm[2] *= t;
+ b[0] = n[1]*pm[2]-n[2]*pm[1];
+ b[1] = n[2]*pm[0]-n[0]*pm[2];
+ b[2] = n[0]*pm[1]-n[1]*pm[0];
+ t = 1.0/(4.0*sqrt(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]));
+ b[0] *= t;
+ b[1] *= t;
+ b[2] *= t;
+
+ /* Compute alpha, beta, delta from the three basis vectors.
+ | -b[0] -b[1] -b[2] |
+ m = | n[0] n[1] n[2] |
+ | -pm[0] -pm[1] -pm[2] |
+ */
+ kb->alpha = atan2(-n[2],-pm[2])*180/M_PI;
+ kb->beta = atan2(-b[2],sqrt(b[0]*b[0]+b[1]*b[1]))*180/M_PI;
+ kb->delta = atan2(b[1],-b[0])*180/M_PI;
+
+ /* Compute the rotation that rotates the Klein bottle in 4D. */
+ rotateall(kb->alpha,kb->beta,kb->delta,kb->zeta,kb->eta,kb->theta,mat);
+
+ u = kb->umove;
+ v = kb->vmove;
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ /*c2u = cos(2.0*u);*/
+ s2u = sin(2.0*u);
+ xx[0] = (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*cv;
+ xx[1] = (su*cv2-s2u*sv2+FIGURE_8_RADIUS)*sv;
+ xx[2] = su*sv2+s2u*cv2;
+ xx[3] = cu;
+ for (l=0; l<4; l++)
+ xx[l] /= FIGURE_8_RADIUS+1.25;
+ for (l=0; l<4; l++)
+ {
+ r = 0.0;
+ for (m=0; m<4; m++)
+ r += mat[l][m]*xx[m];
+ y[l] = r;
+ }
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ p[l] = y[l]+kb->offset4d[l];
+ }
+ else
+ {
+ s = y[3]+kb->offset4d[3];
+ for (l=0; l<3; l++)
+ p[l] = (y[l]+kb->offset4d[l])/s;
+ }
+
+ kb->offset3d[0] = -p[0];
+ kb->offset3d[1] = -p[1]-DELTAY;
+ kb->offset3d[2] = -p[2];
+ }
+ else
+ {
+ /* Compute the rotation that rotates the Klein bottle in 4D, including
+ the trackball rotations. */
+ rotateall(kb->alpha,kb->beta,kb->delta,kb->zeta,kb->eta,kb->theta,r1);
+
+ gltrackball_get_quaternion(kb->trackballs[0],q1);
+ gltrackball_get_quaternion(kb->trackballs[1],q2);
+ quats_to_rotmat(q1,q2,r2);
+
+ mult_rotmat(r2,r1,mat);
+ }
+
+ /* Project the points from 4D to 3D. */
+ for (i=0; i<=NUMU; i++)
+ {
+ for (j=0; j<=NUMV; j++)
+ {
+ o = i*(NUMV+1)+j;
+ for (l=0; l<4; l++)
+ {
+ y[l] = (mat[l][0]*kb->x[o][0]+mat[l][1]*kb->x[o][1]+
+ mat[l][2]*kb->x[o][2]+mat[l][3]*kb->x[o][3]);
+ yu[l] = (mat[l][0]*kb->xu[o][0]+mat[l][1]*kb->xu[o][1]+
+ mat[l][2]*kb->xu[o][2]+mat[l][3]*kb->xu[o][3]);
+ yv[l] = (mat[l][0]*kb->xv[o][0]+mat[l][1]*kb->xv[o][1]+
+ mat[l][2]*kb->xv[o][2]+mat[l][3]*kb->xv[o][3]);
+ }
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ {
+ kb->pp[o][l] = (y[l]+kb->offset4d[l])+kb->offset3d[l];
+ pu[l] = yu[l];
+ pv[l] = yv[l];
+ }
+ }
+ else
+ {
+ s = y[3]+kb->offset4d[3];
+ q = 1.0/s;
+ t = q*q;
+ for (l=0; l<3; l++)
+ {
+ r = y[l]+kb->offset4d[l];
+ kb->pp[o][l] = r*q+kb->offset3d[l];
+ pu[l] = (yu[l]*s-r*yu[3])*t;
+ pv[l] = (yv[l]*s-r*yv[3])*t;
+ }
+ }
+ kb->pn[o][0] = pu[1]*pv[2]-pu[2]*pv[1];
+ kb->pn[o][1] = pu[2]*pv[0]-pu[0]*pv[2];
+ kb->pn[o][2] = pu[0]*pv[1]-pu[1]*pv[0];
+ t = 1.0/sqrt(kb->pn[o][0]*kb->pn[o][0]+kb->pn[o][1]*kb->pn[o][1]+
+ kb->pn[o][2]*kb->pn[o][2]);
+ kb->pn[o][0] *= t;
+ kb->pn[o][1] *= t;
+ kb->pn[o][2] *= t;
+ }
+ }
+
+ if (kb->colors == COLORS_TWOSIDED)
+ {
+ glColor3fv(mat_diff_red);
+ if (kb->display_mode == DISP_TRANSPARENT)
+ {
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_red);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_green);
+ }
+ else
+ {
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_red);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_green);
+ }
+ }
+ glBindTexture(GL_TEXTURE_2D,kb->tex_name);
+
+ for (i=0; i<NUMU; i++)
+ {
+ if (kb->appearance == APPEARANCE_BANDS && ((i & (NUMB-1)) >= NUMB/2))
+ continue;
+ if (kb->display_mode == DISP_WIREFRAME)
+ glBegin(GL_QUAD_STRIP);
+ else
+ glBegin(GL_TRIANGLE_STRIP);
+ for (j=0; j<=NUMV; j++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = (i+k);
+ m = j;
+ o = l*(NUMV+1)+m;
+ glNormal3fv(kb->pn[o]);
+ glTexCoord2fv(kb->tex[o]);
+ if (kb->colors != COLORS_TWOSIDED)
+ {
+ glColor3fv(kb->col[o]);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,kb->col[o]);
+ }
+ glVertex3fv(kb->pp[o]);
+ polys++;
+ }
+ }
+ glEnd();
+ }
+ polys /= 2;
+ return polys;
+}
+
+
+/* Draw a squeezed torus Klein bottle projected into 3D. */
+static int squeezed_torus(ModeInfo *mi, double umin, double umax, double vmin,
+ double vmax)
+{
+ int polys = 0;
+ static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.7 };
+ static const GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
+ float p[3], pu[3], pv[3], pm[3], n[3], b[3], mat[4][4];
+ int i, j, k, l, m, o;
+ double u, v;
+ double xx[4], xxu[4], xxv[4], y[4], yu[4], yv[4];
+ double q, r, s, t;
+ double cu, su, cv, sv, cv2, sv2;
+ float q1[4], q2[4], r1[4][4], r2[4][4];
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ {
+ /* Compute the rotation that rotates the Klein bottle in 4D without the
+ trackball rotations. */
+ rotateall4d(kb->zeta,kb->eta,kb->theta,mat);
+
+ u = kb->umove;
+ v = kb->vmove;
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ xx[0] = (SQUEEZED_TORUS_RADIUS+cu)*cv;
+ xx[1] = (SQUEEZED_TORUS_RADIUS+cu)*sv;
+ xx[2] = su*cv2;
+ xx[3] = su*sv2;
+ xxu[0] = -su*cv;
+ xxu[1] = -su*sv;
+ xxu[2] = cu*cv2;
+ xxu[3] = cu*sv2;
+ xxv[0] = -(SQUEEZED_TORUS_RADIUS+cu)*sv;
+ xxv[1] = (SQUEEZED_TORUS_RADIUS+cu)*cv;
+ xxv[2] = -0.5*su*sv2;
+ xxv[3] = 0.5*su*cv2;
+ for (l=0; l<4; l++)
+ {
+ xx[l] /= SQUEEZED_TORUS_RADIUS+1.25;
+ xxu[l] /= SQUEEZED_TORUS_RADIUS+1.25;
+ xxv[l] /= SQUEEZED_TORUS_RADIUS+1.25;
+ }
+ for (l=0; l<4; l++)
+ {
+ y[l] = (mat[l][0]*xx[0]+mat[l][1]*xx[1]+
+ mat[l][2]*xx[2]+mat[l][3]*xx[3]);
+ yu[l] = (mat[l][0]*xxu[0]+mat[l][1]*xxu[1]+
+ mat[l][2]*xxu[2]+mat[l][3]*xxu[3]);
+ yv[l] = (mat[l][0]*xxv[0]+mat[l][1]*xxv[1]+
+ mat[l][2]*xxv[2]+mat[l][3]*xxv[3]);
+ }
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ {
+ p[l] = y[l]+kb->offset4d[l];
+ pu[l] = yu[l];
+ pv[l] = yv[l];
+ }
+ }
+ else
+ {
+ s = y[3]+kb->offset4d[3];
+ q = 1.0/s;
+ t = q*q;
+ for (l=0; l<3; l++)
+ {
+ r = y[l]+kb->offset4d[l];
+ p[l] = r*q;
+ pu[l] = (yu[l]*s-r*yu[3])*t;
+ pv[l] = (yv[l]*s-r*yv[3])*t;
+ }
+ }
+ n[0] = pu[1]*pv[2]-pu[2]*pv[1];
+ n[1] = pu[2]*pv[0]-pu[0]*pv[2];
+ n[2] = pu[0]*pv[1]-pu[1]*pv[0];
+ t = 1.0/(kb->side*4.0*sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]));
+ n[0] *= t;
+ n[1] *= t;
+ n[2] *= t;
+ pm[0] = pu[0]*kb->dumove+pv[0]*kb->dvmove;
+ pm[1] = pu[1]*kb->dumove+pv[1]*kb->dvmove;
+ pm[2] = pu[2]*kb->dumove+pv[2]*kb->dvmove;
+ t = 1.0/(4.0*sqrt(pm[0]*pm[0]+pm[1]*pm[1]+pm[2]*pm[2]));
+ pm[0] *= t;
+ pm[1] *= t;
+ pm[2] *= t;
+ b[0] = n[1]*pm[2]-n[2]*pm[1];
+ b[1] = n[2]*pm[0]-n[0]*pm[2];
+ b[2] = n[0]*pm[1]-n[1]*pm[0];
+ t = 1.0/(4.0*sqrt(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]));
+ b[0] *= t;
+ b[1] *= t;
+ b[2] *= t;
+
+ /* Compute alpha, beta, delta from the three basis vectors.
+ | -b[0] -b[1] -b[2] |
+ m = | n[0] n[1] n[2] |
+ | -pm[0] -pm[1] -pm[2] |
+ */
+ kb->alpha = atan2(-n[2],-pm[2])*180/M_PI;
+ kb->beta = atan2(-b[2],sqrt(b[0]*b[0]+b[1]*b[1]))*180/M_PI;
+ kb->delta = atan2(b[1],-b[0])*180/M_PI;
+
+ /* Compute the rotation that rotates the Klein bottle in 4D. */
+ rotateall(kb->alpha,kb->beta,kb->delta,kb->zeta,kb->eta,kb->theta,mat);
+
+ u = kb->umove;
+ v = kb->vmove;
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ xx[0] = (SQUEEZED_TORUS_RADIUS+cu)*cv;
+ xx[1] = (SQUEEZED_TORUS_RADIUS+cu)*sv;
+ xx[2] = su*cv2;
+ xx[3] = su*sv2;
+ for (l=0; l<4; l++)
+ xx[l] /= SQUEEZED_TORUS_RADIUS+1.25;
+ for (l=0; l<4; l++)
+ {
+ r = 0.0;
+ for (m=0; m<4; m++)
+ r += mat[l][m]*xx[m];
+ y[l] = r;
+ }
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ p[l] = y[l]+kb->offset4d[l];
+ }
+ else
+ {
+ s = y[3]+kb->offset4d[3];
+ for (l=0; l<3; l++)
+ p[l] = (y[l]+kb->offset4d[l])/s;
+ }
+
+ kb->offset3d[0] = -p[0];
+ kb->offset3d[1] = -p[1]-DELTAY;
+ kb->offset3d[2] = -p[2];
+ }
+ else
+ {
+ /* Compute the rotation that rotates the Klein bottle in 4D, including
+ the trackball rotations. */
+ rotateall(kb->alpha,kb->beta,kb->delta,kb->zeta,kb->eta,kb->theta,r1);
+
+ gltrackball_get_quaternion(kb->trackballs[0],q1);
+ gltrackball_get_quaternion(kb->trackballs[1],q2);
+ quats_to_rotmat(q1,q2,r2);
+
+ mult_rotmat(r2,r1,mat);
+ }
+
+ /* Project the points from 4D to 3D. */
+ for (i=0; i<=NUMU; i++)
+ {
+ for (j=0; j<=NUMV; j++)
+ {
+ o = i*(NUMV+1)+j;
+ for (l=0; l<4; l++)
+ {
+ y[l] = (mat[l][0]*kb->x[o][0]+mat[l][1]*kb->x[o][1]+
+ mat[l][2]*kb->x[o][2]+mat[l][3]*kb->x[o][3]);
+ yu[l] = (mat[l][0]*kb->xu[o][0]+mat[l][1]*kb->xu[o][1]+
+ mat[l][2]*kb->xu[o][2]+mat[l][3]*kb->xu[o][3]);
+ yv[l] = (mat[l][0]*kb->xv[o][0]+mat[l][1]*kb->xv[o][1]+
+ mat[l][2]*kb->xv[o][2]+mat[l][3]*kb->xv[o][3]);
+ }
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ {
+ kb->pp[o][l] = (y[l]+kb->offset4d[l])+kb->offset3d[l];
+ pu[l] = yu[l];
+ pv[l] = yv[l];
+ }
+ }
+ else
+ {
+ s = y[3]+kb->offset4d[3];
+ q = 1.0/s;
+ t = q*q;
+ for (l=0; l<3; l++)
+ {
+ r = y[l]+kb->offset4d[l];
+ kb->pp[o][l] = r*q+kb->offset3d[l];
+ pu[l] = (yu[l]*s-r*yu[3])*t;
+ pv[l] = (yv[l]*s-r*yv[3])*t;
+ }
+ }
+ kb->pn[o][0] = pu[1]*pv[2]-pu[2]*pv[1];
+ kb->pn[o][1] = pu[2]*pv[0]-pu[0]*pv[2];
+ kb->pn[o][2] = pu[0]*pv[1]-pu[1]*pv[0];
+ t = 1.0/sqrt(kb->pn[o][0]*kb->pn[o][0]+kb->pn[o][1]*kb->pn[o][1]+
+ kb->pn[o][2]*kb->pn[o][2]);
+ kb->pn[o][0] *= t;
+ kb->pn[o][1] *= t;
+ kb->pn[o][2] *= t;
+ }
+ }
+
+ if (kb->colors == COLORS_TWOSIDED)
+ {
+ glColor3fv(mat_diff_red);
+ if (kb->display_mode == DISP_TRANSPARENT)
+ {
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_red);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_green);
+ }
+ else
+ {
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_red);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_green);
+ }
+ }
+ glBindTexture(GL_TEXTURE_2D,kb->tex_name);
+
+ for (i=0; i<NUMU; i++)
+ {
+ if (kb->appearance == APPEARANCE_BANDS && ((i & (NUMB-1)) >= NUMB/2))
+ continue;
+ if (kb->display_mode == DISP_WIREFRAME)
+ glBegin(GL_QUAD_STRIP);
+ else
+ glBegin(GL_TRIANGLE_STRIP);
+ for (j=0; j<=NUMV; j++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = (i+k);
+ m = j;
+ o = l*(NUMV+1)+m;
+ glNormal3fv(kb->pn[o]);
+ glTexCoord2fv(kb->tex[o]);
+ if (kb->colors != COLORS_TWOSIDED)
+ {
+ glColor3fv(kb->col[o]);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,kb->col[o]);
+ }
+ glVertex3fv(kb->pp[o]);
+ polys++;
+ }
+ }
+ glEnd();
+ }
+ polys /= 2;
+ return polys;
+}
+
+
+/* Draw a Lawson Klein bottle projected into 3D. */
+static int lawson(ModeInfo *mi, double umin, double umax, double vmin,
+ double vmax)
+{
+ int polys = 0;
+ static const GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
+ static const GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.7 };
+ static const GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
+ float p[3], pu[3], pv[3], pm[3], n[3], b[3], mat[4][4];
+ int i, j, k, l, m, o;
+ double u, v;
+ double cu, su, cv, sv, cv2, sv2;
+ double xx[4], xxu[4], xxv[4], y[4], yu[4], yv[4];
+ double q, r, s, t;
+ float q1[4], q2[4], r1[4][4], r2[4][4];
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ {
+ /* Compute the rotation that rotates the Klein bottle in 4D without the
+ trackball rotations. */
+ rotateall4d(kb->zeta,kb->eta,kb->theta,mat);
+
+ u = kb->umove;
+ v = kb->vmove;
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ xx[0] = cu*cv;
+ xx[1] = cu*sv;
+ xx[2] = su*sv2;
+ xx[3] = su*cv2;
+ xxu[0] = -su*cv;
+ xxu[1] = -su*sv;
+ xxu[2] = cu*sv2;
+ xxu[3] = cu*cv2;
+ xxv[0] = -cu*sv;
+ xxv[1] = cu*cv;
+ xxv[2] = su*cv2*0.5;
+ xxv[3] = -su*sv2*0.5;
+ for (l=0; l<4; l++)
+ {
+ y[l] = (mat[l][0]*xx[0]+mat[l][1]*xx[1]+
+ mat[l][2]*xx[2]+mat[l][3]*xx[3]);
+ yu[l] = (mat[l][0]*xxu[0]+mat[l][1]*xxu[1]+
+ mat[l][2]*xxu[2]+mat[l][3]*xxu[3]);
+ yv[l] = (mat[l][0]*xxv[0]+mat[l][1]*xxv[1]+
+ mat[l][2]*xxv[2]+mat[l][3]*xxv[3]);
+ }
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ {
+ p[l] = y[l]+kb->offset4d[l];
+ pu[l] = yu[l];
+ pv[l] = yv[l];
+ }
+ }
+ else
+ {
+ s = y[3]+kb->offset4d[3];
+ q = 1.0/s;
+ t = q*q;
+ for (l=0; l<3; l++)
+ {
+ r = y[l]+kb->offset4d[l];
+ p[l] = r*q;
+ pu[l] = (yu[l]*s-r*yu[3])*t;
+ pv[l] = (yv[l]*s-r*yv[3])*t;
+ }
+ }
+ n[0] = pu[1]*pv[2]-pu[2]*pv[1];
+ n[1] = pu[2]*pv[0]-pu[0]*pv[2];
+ n[2] = pu[0]*pv[1]-pu[1]*pv[0];
+ t = 1.0/(kb->side*4.0*sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]));
+ n[0] *= t;
+ n[1] *= t;
+ n[2] *= t;
+ pm[0] = pu[0]*kb->dumove+pv[0]*kb->dvmove;
+ pm[1] = pu[1]*kb->dumove+pv[1]*kb->dvmove;
+ pm[2] = pu[2]*kb->dumove+pv[2]*kb->dvmove;
+ t = 1.0/(4.0*sqrt(pm[0]*pm[0]+pm[1]*pm[1]+pm[2]*pm[2]));
+ pm[0] *= t;
+ pm[1] *= t;
+ pm[2] *= t;
+ b[0] = n[1]*pm[2]-n[2]*pm[1];
+ b[1] = n[2]*pm[0]-n[0]*pm[2];
+ b[2] = n[0]*pm[1]-n[1]*pm[0];
+ t = 1.0/(4.0*sqrt(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]));
+ b[0] *= t;
+ b[1] *= t;
+ b[2] *= t;
+
+ /* Compute alpha, beta, delta from the three basis vectors.
+ | -b[0] -b[1] -b[2] |
+ m = | n[0] n[1] n[2] |
+ | -pm[0] -pm[1] -pm[2] |
+ */
+ kb->alpha = atan2(-n[2],-pm[2])*180/M_PI;
+ kb->beta = atan2(-b[2],sqrt(b[0]*b[0]+b[1]*b[1]))*180/M_PI;
+ kb->delta = atan2(b[1],-b[0])*180/M_PI;
+
+ /* Compute the rotation that rotates the Klein bottle in 4D. */
+ rotateall(kb->alpha,kb->beta,kb->delta,kb->zeta,kb->eta,kb->theta,mat);
+
+ u = kb->umove;
+ v = kb->vmove;
+ cu = cos(u);
+ su = sin(u);
+ cv = cos(v);
+ sv = sin(v);
+ cv2 = cos(0.5*v);
+ sv2 = sin(0.5*v);
+ xx[0] = cu*cv;
+ xx[1] = cu*sv;
+ xx[2] = su*sv2;
+ xx[3] = su*cv2;
+ for (l=0; l<4; l++)
+ {
+ r = 0.0;
+ for (m=0; m<4; m++)
+ r += mat[l][m]*xx[m];
+ y[l] = r;
+ }
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ p[l] = y[l]+kb->offset4d[l];
+ }
+ else
+ {
+ s = y[3]+kb->offset4d[3];
+ for (l=0; l<3; l++)
+ p[l] = (y[l]+kb->offset4d[l])/s;
+ }
+
+ kb->offset3d[0] = -p[0];
+ kb->offset3d[1] = -p[1]-DELTAY;
+ kb->offset3d[2] = -p[2];
+ }
+ else
+ {
+ /* Compute the rotation that rotates the Klein bottle in 4D, including
+ the trackball rotations. */
+ rotateall(kb->alpha,kb->beta,kb->delta,kb->zeta,kb->eta,kb->theta,r1);
+
+ gltrackball_get_quaternion(kb->trackballs[0],q1);
+ gltrackball_get_quaternion(kb->trackballs[1],q2);
+ quats_to_rotmat(q1,q2,r2);
+
+ mult_rotmat(r2,r1,mat);
+ }
+
+ /* Project the points from 4D to 3D. */
+ for (i=0; i<=NUMV; i++)
+ {
+ for (j=0; j<=NUMU; j++)
+ {
+ o = i*(NUMU+1)+j;
+ for (l=0; l<4; l++)
+ {
+ y[l] = (mat[l][0]*kb->x[o][0]+mat[l][1]*kb->x[o][1]+
+ mat[l][2]*kb->x[o][2]+mat[l][3]*kb->x[o][3]);
+ yu[l] = (mat[l][0]*kb->xu[o][0]+mat[l][1]*kb->xu[o][1]+
+ mat[l][2]*kb->xu[o][2]+mat[l][3]*kb->xu[o][3]);
+ yv[l] = (mat[l][0]*kb->xv[o][0]+mat[l][1]*kb->xv[o][1]+
+ mat[l][2]*kb->xv[o][2]+mat[l][3]*kb->xv[o][3]);
+ }
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ {
+ for (l=0; l<3; l++)
+ {
+ kb->pp[o][l] = (y[l]+kb->offset4d[l])+kb->offset3d[l];
+ pu[l] = yu[l];
+ pv[l] = yv[l];
+ }
+ }
+ else
+ {
+ s = y[3]+kb->offset4d[3];
+ q = 1.0/s;
+ t = q*q;
+ for (l=0; l<3; l++)
+ {
+ r = y[l]+kb->offset4d[l];
+ kb->pp[o][l] = r*q+kb->offset3d[l];
+ pu[l] = (yu[l]*s-r*yu[3])*t;
+ pv[l] = (yv[l]*s-r*yv[3])*t;
+ }
+ }
+ kb->pn[o][0] = pu[1]*pv[2]-pu[2]*pv[1];
+ kb->pn[o][1] = pu[2]*pv[0]-pu[0]*pv[2];
+ kb->pn[o][2] = pu[0]*pv[1]-pu[1]*pv[0];
+ t = 1.0/sqrt(kb->pn[o][0]*kb->pn[o][0]+kb->pn[o][1]*kb->pn[o][1]+
+ kb->pn[o][2]*kb->pn[o][2]);
+ kb->pn[o][0] *= t;
+ kb->pn[o][1] *= t;
+ kb->pn[o][2] *= t;
+ }
+ }
+
+ if (kb->colors == COLORS_TWOSIDED)
+ {
+ glColor3fv(mat_diff_red);
+ if (kb->display_mode == DISP_TRANSPARENT)
+ {
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_red);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_trans_green);
+ }
+ else
+ {
+ glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diff_red);
+ glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,mat_diff_green);
+ }
+ }
+ glBindTexture(GL_TEXTURE_2D,kb->tex_name);
+
+ for (i=0; i<NUMV; i++)
+ {
+ if (kb->appearance == APPEARANCE_BANDS && ((i & (NUMB-1)) >= NUMB/2))
+ continue;
+ if (kb->display_mode == DISP_WIREFRAME)
+ glBegin(GL_QUAD_STRIP);
+ else
+ glBegin(GL_TRIANGLE_STRIP);
+ for (j=0; j<=NUMU; j++)
+ {
+ for (k=0; k<=1; k++)
+ {
+ l = (i+k);
+ m = j;
+ o = l*(NUMU+1)+m;
+ glNormal3fv(kb->pn[o]);
+ glTexCoord2fv(kb->tex[o]);
+ if (kb->colors != COLORS_TWOSIDED)
+ {
+ glColor3fv(kb->col[o]);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,kb->col[o]);
+ }
+ glVertex3fv(kb->pp[o]);
+ polys++;
+ }
+ }
+ glEnd();
+ }
+ polys /= 2;
+ return polys;
+}
+
+
+/* Generate a texture image that shows the orientation reversal. */
+static void gen_texture(ModeInfo *mi)
+{
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ glGenTextures(1,&kb->tex_name);
+ glBindTexture(GL_TEXTURE_2D,kb->tex_name);
+ glPixelStorei(GL_UNPACK_ALIGNMENT,1);
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+ glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
+ glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,TEX_DIMENSION,TEX_DIMENSION,0,
+ GL_LUMINANCE,GL_UNSIGNED_BYTE,texture);
+}
+
+
+static void init(ModeInfo *mi)
+{
+ static const GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+ static const GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
+ static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ if (walk_speed == 0.0)
+ walk_speed = 20.0;
+
+ if (kb->view == VIEW_TURN)
+ {
+ kb->alpha = frand(360.0);
+ kb->beta = frand(360.0);
+ kb->delta = frand(360.0);
+ }
+ else
+ {
+ kb->alpha = 0.0;
+ kb->beta = 0.0;
+ kb->delta = 0.0;
+ }
+ kb->zeta = 0.0;
+ if (kb->bottle_type == KLEIN_BOTTLE_FIGURE_8 ||
+ kb->bottle_type == KLEIN_BOTTLE_SQUEEZED_TORUS)
+ kb->eta = 0.0;
+ else
+ kb->eta = 45.0;
+ kb->theta = 0.0;
+ kb->umove = frand(2.0*M_PI);
+ kb->vmove = frand(2.0*M_PI);
+ kb->dumove = 0.0;
+ kb->dvmove = 0.0;
+ kb->side = 1;
+
+ if (kb->bottle_type == KLEIN_BOTTLE_FIGURE_8)
+ {
+ kb->offset4d[0] = 0.0;
+ kb->offset4d[1] = 0.0;
+ kb->offset4d[2] = 0.0;
+ kb->offset4d[3] = 1.5;
+ kb->offset3d[0] = 0.0;
+ kb->offset3d[1] = 0.0;
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ kb->offset3d[2] = -2.1;
+ else
+ kb->offset3d[2] = -1.9;
+ kb->offset3d[3] = 0.0;
+ }
+ else if (kb->bottle_type == KLEIN_BOTTLE_SQUEEZED_TORUS)
+ {
+ kb->offset4d[0] = 0.0;
+ kb->offset4d[1] = 0.0;
+ kb->offset4d[2] = 0.0;
+ kb->offset4d[3] = 1.4;
+ kb->offset3d[0] = 0.0;
+ kb->offset3d[1] = 0.0;
+ kb->offset3d[2] = -2.0;
+ kb->offset3d[3] = 0.0;
+ }
+ else /* kb->bottle_type == KLEIN_BOTTLE_LAWSON */
+ {
+ kb->offset4d[0] = 0.0;
+ kb->offset4d[1] = 0.0;
+ kb->offset4d[2] = 0.0;
+ if (kb->projection_4d == DISP_4D_PERSPECTIVE &&
+ kb->projection_3d == DISP_3D_ORTHOGRAPHIC)
+ kb->offset4d[3] = 1.5;
+ else
+ kb->offset4d[3] = 1.1;
+ kb->offset3d[0] = 0.0;
+ kb->offset3d[1] = 0.0;
+ if (kb->projection_4d == DISP_4D_ORTHOGRAPHIC)
+ kb->offset3d[2] = -2.0;
+ else
+ kb->offset3d[2] = -5.0;
+ kb->offset3d[3] = 0.0;
+ }
+
+ gen_texture(mi);
+ if (kb->bottle_type == KLEIN_BOTTLE_FIGURE_8)
+ setup_figure8(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
+ else if (kb->bottle_type == KLEIN_BOTTLE_SQUEEZED_TORUS)
+ setup_squeezed_torus(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
+ else /* kb->bottle_type == KLEIN_BOTTLE_LAWSON */
+ setup_lawson(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
+
+ if (marks)
+ glEnable(GL_TEXTURE_2D);
+ else
+ glDisable(GL_TEXTURE_2D);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ if (kb->projection_3d == DISP_3D_PERSPECTIVE ||
+ kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ {
+ if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ gluPerspective(60.0,1.0,0.01,10.0);
+ else
+ gluPerspective(60.0,1.0,0.1,10.0);
+ }
+ else
+ {
+ glOrtho(-1.0,1.0,-1.0,1.0,0.1,10.0);
+ }
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ if (kb->display_mode == DISP_WIREFRAME)
+ kb->display_mode = DISP_SURFACE;
+# endif
+
+ if (kb->display_mode == DISP_SURFACE)
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glDepthMask(GL_TRUE);
+ glDisable(GL_BLEND);
+ }
+ else if (kb->display_mode == DISP_TRANSPARENT)
+ {
+ glDisable(GL_DEPTH_TEST);
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+ glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+ glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
+ glDepthMask(GL_FALSE);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ }
+ else /* kb->display_mode == DISP_WIREFRAME */
+ {
+ glDisable(GL_DEPTH_TEST);
+ glShadeModel(GL_FLAT);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_LIGHT0);
+ glDisable(GL_BLEND);
+ }
+}
+
+
+/* Redisplay the Klein bottle. */
+static void display_klein(ModeInfo *mi)
+{
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ if (!kb->button_pressed)
+ {
+ if (kb->view == VIEW_TURN)
+ {
+ kb->alpha += speed_wx * kb->speed_scale;
+ if (kb->alpha >= 360.0)
+ kb->alpha -= 360.0;
+ kb->beta += speed_wy * kb->speed_scale;
+ if (kb->beta >= 360.0)
+ kb->beta -= 360.0;
+ kb->delta += speed_wz * kb->speed_scale;
+ if (kb->delta >= 360.0)
+ kb->delta -= 360.0;
+ kb->zeta += speed_xy * kb->speed_scale;
+ if (kb->zeta >= 360.0)
+ kb->zeta -= 360.0;
+ kb->eta += speed_xz * kb->speed_scale;
+ if (kb->eta >= 360.0)
+ kb->eta -= 360.0;
+ kb->theta += speed_yz * kb->speed_scale;
+ if (kb->theta >= 360.0)
+ kb->theta -= 360.0;
+ }
+ if (kb->view == VIEW_WALKTURN)
+ {
+ kb->zeta += speed_xy * kb->speed_scale;
+ if (kb->zeta >= 360.0)
+ kb->zeta -= 360.0;
+ kb->eta += speed_xz * kb->speed_scale;
+ if (kb->eta >= 360.0)
+ kb->eta -= 360.0;
+ kb->theta += speed_yz * kb->speed_scale;
+ if (kb->theta >= 360.0)
+ kb->theta -= 360.0;
+ }
+ if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ {
+ kb->dvmove = cos(walk_direction*M_PI/180.0)*walk_speed*M_PI/4096.0;
+ kb->vmove += kb->dvmove;
+ if (kb->vmove >= 2.0*M_PI)
+ {
+ kb->vmove -= 2.0*M_PI;
+ kb->umove = 2.0*M_PI-kb->umove;
+ kb->side = -kb->side;
+ }
+ kb->dumove = (kb->side*sin(walk_direction*M_PI/180.0)*
+ walk_speed*M_PI/4096.0);
+ kb->umove += kb->dumove;
+ if (kb->umove >= 2.0*M_PI)
+ kb->umove -= 2.0*M_PI;
+ if (kb->umove < 0.0)
+ kb->umove += 2.0*M_PI;
+ }
+ }
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ if (kb->projection_3d == DISP_3D_PERSPECTIVE ||
+ kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ {
+ if (kb->view == VIEW_WALK || kb->view == VIEW_WALKTURN)
+ gluPerspective(60.0,kb->aspect,0.01,10.0);
+ else
+ gluPerspective(60.0,kb->aspect,0.1,10.0);
+ }
+ else
+ {
+ if (kb->aspect >= 1.0)
+ glOrtho(-kb->aspect,kb->aspect,-1.0,1.0,0.1,10.0);
+ else
+ glOrtho(-1.0,1.0,-1.0/kb->aspect,1.0/kb->aspect,0.1,10.0);
+ }
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ if (kb->bottle_type == KLEIN_BOTTLE_FIGURE_8)
+ mi->polygon_count = figure8(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
+ else if (kb->bottle_type == KLEIN_BOTTLE_SQUEEZED_TORUS)
+ mi->polygon_count = squeezed_torus(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
+ else /* kb->bottle_type == KLEIN_BOTTLE_LAWSON */
+ mi->polygon_count = lawson(mi,0.0,2.0*M_PI,0.0,2.0*M_PI);
+}
+
+
+ENTRYPOINT void reshape_klein(ModeInfo *mi, int width, int height)
+{
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ kb->WindW = (GLint)width;
+ kb->WindH = (GLint)height;
+ glViewport(0,0,width,height);
+ kb->aspect = (GLfloat)width/(GLfloat)height;
+}
+
+
+ENTRYPOINT Bool klein_handle_event(ModeInfo *mi, XEvent *event)
+{
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+ KeySym sym = 0;
+ char c = 0;
+
+ if (event->xany.type == KeyPress || event->xany.type == KeyRelease)
+ XLookupString (&event->xkey, &c, 1, &sym, 0);
+
+ if (event->xany.type == ButtonPress &&
+ event->xbutton.button == Button1)
+ {
+ kb->button_pressed = True;
+ gltrackball_start(kb->trackballs[kb->current_trackball],
+ event->xbutton.x, event->xbutton.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+ else if (event->xany.type == ButtonRelease &&
+ event->xbutton.button == Button1)
+ {
+ kb->button_pressed = False;
+ return True;
+ }
+ else if (event->xany.type == KeyPress)
+ {
+ if (sym == XK_Shift_L || sym == XK_Shift_R)
+ {
+ kb->current_trackball = 1;
+ if (kb->button_pressed)
+ gltrackball_start(kb->trackballs[kb->current_trackball],
+ event->xbutton.x, event->xbutton.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+ }
+ else if (event->xany.type == KeyRelease)
+ {
+ if (sym == XK_Shift_L || sym == XK_Shift_R)
+ {
+ kb->current_trackball = 0;
+ if (kb->button_pressed)
+ gltrackball_start(kb->trackballs[kb->current_trackball],
+ event->xbutton.x, event->xbutton.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+ }
+ else if (event->xany.type == MotionNotify && kb->button_pressed)
+ {
+ gltrackball_track(kb->trackballs[kb->current_trackball],
+ event->xmotion.x, event->xmotion.y,
+ MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+
+ return False;
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ * Xlock hooks.
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+ *-----------------------------------------------------------------------------
+ * Initialize klein. Called each time the window changes.
+ *-----------------------------------------------------------------------------
+ */
+
+ENTRYPOINT void init_klein(ModeInfo *mi)
+{
+ kleinstruct *kb;
+
+ MI_INIT(mi, klein);
+ kb = &klein[MI_SCREEN(mi)];
+
+
+ kb->trackballs[0] = gltrackball_init(True);
+ kb->trackballs[1] = gltrackball_init(True);
+ kb->current_trackball = 0;
+ kb->button_pressed = False;
+
+ /* Set the Klein bottle. */
+ if (!strcasecmp(klein_bottle,"random"))
+ {
+ kb->bottle_type = random() % NUM_KLEIN_BOTTLES;
+ }
+ else if (!strcasecmp(klein_bottle,"figure-8"))
+ {
+ kb->bottle_type = KLEIN_BOTTLE_FIGURE_8;
+ }
+ else if (!strcasecmp(klein_bottle,"squeezed-torus"))
+ {
+ kb->bottle_type = KLEIN_BOTTLE_SQUEEZED_TORUS;
+ }
+ else if (!strcasecmp(klein_bottle,"lawson"))
+ {
+ kb->bottle_type = KLEIN_BOTTLE_LAWSON;
+ }
+ else
+ {
+ kb->bottle_type = random() % NUM_KLEIN_BOTTLES;
+ }
+
+ /* Set the display mode. */
+ if (!strcasecmp(mode,"random"))
+ {
+ kb->display_mode = random() % NUM_DISPLAY_MODES;
+ }
+ else if (!strcasecmp(mode,"wireframe"))
+ {
+ kb->display_mode = DISP_WIREFRAME;
+ }
+ else if (!strcasecmp(mode,"surface"))
+ {
+ kb->display_mode = DISP_SURFACE;
+ }
+ else if (!strcasecmp(mode,"transparent"))
+ {
+ kb->display_mode = DISP_TRANSPARENT;
+ }
+ else
+ {
+ kb->display_mode = random() % NUM_DISPLAY_MODES;
+ }
+
+ /* Orientation marks don't make sense in wireframe mode. */
+ if (kb->display_mode == DISP_WIREFRAME)
+ marks = False;
+
+ /* Set the appearance. */
+ if (!strcasecmp(appear,"random"))
+ {
+ kb->appearance = random() % NUM_APPEARANCES;
+ }
+ else if (!strcasecmp(appear,"solid"))
+ {
+ kb->appearance = APPEARANCE_SOLID;
+ }
+ else if (!strcasecmp(appear,"bands"))
+ {
+ kb->appearance = APPEARANCE_BANDS;
+ }
+ else
+ {
+ kb->appearance = random() % NUM_APPEARANCES;
+ }
+
+ /* Set the color mode. */
+ if (!strcasecmp(color_mode,"random"))
+ {
+ kb->colors = random() % NUM_COLORS;
+ }
+ else if (!strcasecmp(color_mode,"two-sided"))
+ {
+ kb->colors = COLORS_TWOSIDED;
+ }
+ else if (!strcasecmp(color_mode,"rainbow"))
+ {
+ kb->colors = COLORS_RAINBOW;
+ }
+ else if (!strcasecmp(color_mode,"depth"))
+ {
+ kb->colors = COLORS_DEPTH;
+ }
+ else
+ {
+ kb->colors = random() % NUM_COLORS;
+ }
+
+ /* Set the view mode. */
+ if (!strcasecmp(view_mode,"random"))
+ {
+ kb->view = random() % NUM_VIEW_MODES;
+ }
+ else if (!strcasecmp(view_mode,"walk"))
+ {
+ kb->view = VIEW_WALK;
+ }
+ else if (!strcasecmp(view_mode,"turn"))
+ {
+ kb->view = VIEW_TURN;
+ }
+ else if (!strcasecmp(view_mode,"walk-turn"))
+ {
+ kb->view = VIEW_WALKTURN;
+ }
+ else
+ {
+ kb->view = random() % NUM_VIEW_MODES;
+ }
+
+ /* Set the 3d projection mode. */
+ if (!strcasecmp(proj_3d,"random"))
+ {
+ /* Orthographic projection only makes sense in turn mode. */
+ if (kb->view == VIEW_TURN)
+ kb->projection_3d = random() % NUM_DISP_3D_MODES;
+ else
+ kb->projection_3d = DISP_3D_PERSPECTIVE;
+ }
+ else if (!strcasecmp(proj_3d,"perspective"))
+ {
+ kb->projection_3d = DISP_3D_PERSPECTIVE;
+ }
+ else if (!strcasecmp(proj_3d,"orthographic"))
+ {
+ kb->projection_3d = DISP_3D_ORTHOGRAPHIC;
+ }
+ else
+ {
+ /* Orthographic projection only makes sense in turn mode. */
+ if (kb->view == VIEW_TURN)
+ kb->projection_3d = random() % NUM_DISP_3D_MODES;
+ else
+ kb->projection_3d = DISP_3D_PERSPECTIVE;
+ }
+
+ /* Set the 4d projection mode. */
+ if (!strcasecmp(proj_4d,"random"))
+ {
+ kb->projection_4d = random() % NUM_DISP_4D_MODES;
+ }
+ else if (!strcasecmp(proj_4d,"perspective"))
+ {
+ kb->projection_4d = DISP_4D_PERSPECTIVE;
+ }
+ else if (!strcasecmp(proj_4d,"orthographic"))
+ {
+ kb->projection_4d = DISP_4D_ORTHOGRAPHIC;
+ }
+ else
+ {
+ kb->projection_4d = random() % NUM_DISP_4D_MODES;
+ }
+
+ /* Modify the speeds to a useful range in walk-and-turn mode. */
+ if (kb->view == VIEW_WALKTURN)
+ {
+ speed_wx *= 0.2;
+ speed_wy *= 0.2;
+ speed_wz *= 0.2;
+ speed_xy *= 0.2;
+ speed_xz *= 0.2;
+ speed_yz *= 0.2;
+ }
+
+ /* make multiple screens rotate at slightly different rates. */
+ kb->speed_scale = 0.9 + frand(0.3);
+
+ if ((kb->glx_context = init_GL(mi)) != NULL)
+ {
+ reshape_klein(mi,MI_WIDTH(mi),MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
+ init(mi);
+ }
+ else
+ {
+ MI_CLEARWINDOW(mi);
+ }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * Called by the mainline code periodically to update the display.
+ *-----------------------------------------------------------------------------
+ */
+ENTRYPOINT void draw_klein(ModeInfo *mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+ kleinstruct *kb;
+
+ if (klein == NULL)
+ return;
+ kb = &klein[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+ if (!kb->glx_context)
+ return;
+
+ glXMakeCurrent(display,window,*(kb->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity();
+
+ display_klein(mi);
+
+ if (MI_IS_FPS(mi))
+ do_fps (mi);
+
+ glFlush();
+
+ glXSwapBuffers(display,window);
+}
+
+
+#ifndef STANDALONE
+ENTRYPOINT void change_klein(ModeInfo *mi)
+{
+ kleinstruct *kb = &klein[MI_SCREEN(mi)];
+
+ if (!kb->glx_context)
+ return;
+
+ glXMakeCurrent(MI_DISPLAY(mi),MI_WINDOW(mi),*(kb->glx_context));
+ init(mi);
+}
+#endif /* !STANDALONE */
+
+XSCREENSAVER_MODULE ("Klein", klein)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/klein.man b/hacks/glx/klein.man
new file mode 100644
index 0000000..1b456bc
--- /dev/null
+++ b/hacks/glx/klein.man
@@ -0,0 +1,308 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+klein - Draws a 4d Klein bottle.
+.SH SYNOPSIS
+.B klein
+[\-display \fIhost:display.screen\fP]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fIusecs\fP]
+[\-fps]
+[\-klein-bottle \fIbottle-name\fP]
+[-figure-8]
+[-squeezed-torus]
+[-lawson]
+[\-mode \fIdisplay-mode\fP]
+[\-wireframe]
+[\-surface]
+[\-transparent]
+[\-appearance \fIappearance\fP]
+[\-solid]
+[\-bands]
+[\-colors \fIcolor-scheme\fP]
+[\-twosided]
+[\-rainbow]
+[\-depth]
+[\-view-mode \fIview-mode\fP]
+[\-walk]
+[\-turn]
+[\-walk-turn]
+[\-orientation-marks]
+[\-projection-3d \fImode\fP]
+[\-perspective-3d]
+[\-orthographic-3d]
+[\-projection-4d \fImode\fP]
+[\-perspective-4d]
+[\-orthographic-4d]
+[\-speed-wx \fIfloat\fP]
+[\-speed-wy \fIfloat\fP]
+[\-speed-wz \fIfloat\fP]
+[\-speed-xy \fIfloat\fP]
+[\-speed-xz \fIfloat\fP]
+[\-speed-yz \fIfloat\fP]
+[\-walk-direction \fIfloat\fP]
+[\-walk-speed \fIfloat\fP]
+.SH DESCRIPTION
+The \fIklein\fP program shows three different Klein bottles in 4d: the
+figure-8 Klein bottle, the squeezed torus Klein bottle, or the Lawson
+Klein bottle. You can walk on the Klein bottle, see it turn in 4d, or
+walk on it while it turns in 4d. The figure-8 Klein bottle is well
+known in its 3d form. The 4d form used in this program is an
+extension of the 3d form to 4d that does not intersect itself in 4d
+(which can be seen in the depth colors mode). The squeezed torus
+Klein bottle also does not intersect itself in 4d (which can be seen
+in the depth colors mode). The Lawson Klein bottle, on the other
+hand, does intersect itself in 4d. Its primary use is that it has a
+nice appearance for walking and for turning in 3d. The Klein bottle
+is a non-orientable surface. To make this apparent, the two-sided
+color mode can be used. Alternatively, orientation markers (curling
+arrows) can be drawn as a texture map on the surface of the Klein
+bottle. While walking on the Klein bottle, you will notice that the
+orientation of the curling arrows changes (which it must because the
+Klein bottle is non-orientable). The program projects the 4d Klein
+bottle to 3d using either a perspective or an orthographic projection.
+Which of the two alternatives looks more appealing depends on the
+viewing mode and the Klein bottle. For example, the Lawson Klein
+bottle looks nicest when projected perspectively. The figure-8 Klein
+bottle, on the other hand, looks nicer while walking when projected
+orthographically from 4d. For the squeezed torus Klein bottle, both
+projection modes give equally acceptable projections. The projected
+Klein bottle can then be projected to the screen either perspectively
+or orthographically. When using the walking modes, perspective
+projection to the screen should be used. There are three display
+modes for the Klein bottle: mesh (wireframe), solid, or transparent.
+Furthermore, the appearance of the Klein bottle can be as a solid
+object or as a set of see-through bands. Finally, the colors with
+with the Klein bottle is drawn can be set to two-sided, rainbow, or
+depth. In the first case, the Klein bottle is drawn with red on one
+"side" and green on the "other side". Of course, the Klein bottle
+only has one side, so the color jumps from red to green along a curve
+on the surface of the Klein bottle. This mode enables you to see that
+the Klein bottle is non-orientable. The second mode draws the Klein
+bottle with fully saturated rainbow colors. This gives a very nice
+effect when combined with the see-through bands mode or with the
+orientation markers drawn. The third mode draws the Klein bottle with
+colors that are chosen according to the 4d "depth" of the points.
+This mode enables you to see that the figure-8 and squeezed torus
+Klein bottles do not intersect themselves in 4d, while the Lawson
+Klein bottle does intersect itself. The rotation speed for each of
+the six planes around which the Klein bottle rotates can be chosen.
+For the walk-and-turn mode, only the rotation speeds around the true
+4d planes are used (the xy, xz, and yz planes). Furthermore, in the
+walking modes the walking direction in the 2d base square of the Klein
+bottle and the walking speed can be chosen. This program is somewhat
+inspired by Thomas Banchoff's book "Beyond the Third Dimension:
+Geometry, Computer Graphics, and Higher Dimensions", Scientific
+American Library, 1990.
+.SH OPTIONS
+.I klein
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual
+class, or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the
+animation. Default 10000, or 1/100th second.
+.TP 8
+.B \-fps
+Display the current frame rate, CPU load, and polygon count.
+.PP
+The following three options are mutually exclusive. They determine
+which Klein bottle is displayed.
+.TP 8
+.B \-klein-bottle random
+Display a random Klein bottle (default).
+.TP 8
+.B \-klein-bottle figure-8 \fP(Shortcut: \fB\-figure-8\fP)
+Display the figure-8 Klein bottle.
+.TP 8
+.B \-klein-bottle squeezed-torus \fP(Shortcut: \fB\-squeezed-torus\fP)
+Display the squeezed torus Klein bottle.
+.TP 8
+.B \-klein-bottle lawson \fP(Shortcut: \fB\-lawson\fP)
+Display the Lawson Klein bottle.
+.PP
+The following four options are mutually exclusive. They determine
+how the Klein bottle is displayed.
+.TP 8
+.B \-mode random
+Display the Klein bottle in a random display mode (default).
+.TP 8
+.B \-mode wireframe \fP(Shortcut: \fB\-wireframe\fP)
+Display the Klein bottle as a wireframe mesh.
+.TP 8
+.B \-mode surface \fP(Shortcut: \fB\-surface\fP)
+Display the Klein bottle as a solid surface.
+.TP 8
+.B \-mode transparent \fP(Shortcut: \fB\-transparent\fP)
+Display the Klein bottle as a transparent surface.
+.PP
+The following three options are mutually exclusive. They determine the
+appearance of the Klein bottle.
+.TP 8
+.B \-appearance random
+Display the Klein bottle with a random appearance (default).
+.TP 8
+.B \-appearance solid \fP(Shortcut: \fB\-solid\fP)
+Display the Klein bottle as a solid object.
+.TP 8
+.B \-appearance bands \fP(Shortcut: \fB\-bands\fP)
+Display the Klein bottle as see-through bands.
+.PP
+The following four options are mutually exclusive. They determine
+how to color the Klein bottle.
+.TP 8
+.B \-colors random
+Display the Klein bottle with a random color scheme (default).
+.TP 8
+.B \-colors twosided \fP(Shortcut: \fB\-twosided\fP)
+Display the Klein bottle with two colors: red on one "side" and green
+on the "other side".
+.TP 8
+.B \-colors rainbow \fP(Shortcut: \fB\-rainbow\fP)
+Display the Klein bottle with fully saturated rainbow colors. If the
+Klein bottle is displayed as see-through bands, each band will be
+displayed with a different color.
+.TP 8
+.B \-colors depth \fP(Shortcut: \fB\-depth\fP)
+Display the Klein bottle with colors chosen depending on the 4d
+"depth" of the points.
+.PP
+The following four options are mutually exclusive. They determine
+how to view the Klein bottle.
+.TP 8
+.B \-view-mode random
+View the Klein bottle in a random view mode (default).
+.TP 8
+.B \-view-mode walk \fP(Shortcut: \fB\-walk\fP)
+View the Klein bottle as if walking on its surface.
+.TP 8
+.B \-view-mode turn \fP(Shortcut: \fB\-turn\fP)
+View the Klein bottle while it turns in 4d.
+.TP 8
+.B \-view-mode walk-turn \fP(Shortcut: \fB\-walk-turn\fP)
+View the Klein bottle as if walking on its surface. Additionally, the
+Klein bottle turns around the true 4d planes (the xy, xz, and yz
+planes).
+.PP
+The following options determine whether orientation marks are shown on
+the Klein bottle.
+.TP 8
+.B \-orientation-marks
+Display orientation marks on the Klein bottle.
+.TP 8
+.B \-no-orientation-marks
+Don't display orientation marks on the Klein bottle (default).
+.PP
+The following three options are mutually exclusive. They determine
+how the Klein bottle is projected from 3d to 2d (i.e., to the screen).
+.TP 8
+.B \-projection-3d random
+Project the Klein bottle from 3d to 2d using a random projection mode
+(default).
+.TP 8
+.B \-projection-3d perspective \fP(Shortcut: \fB\-perspective-3d\fP)
+Project the Klein bottle from 3d to 2d using a perspective projection.
+.TP 8
+.B \-projection-3d orthographic \fP(Shortcut: \fB\-orthographic-3d\fP)
+Project the Klein bottle from 3d to 2d using an orthographic
+projection.
+.PP
+The following three options are mutually exclusive. They determine
+how the Klein bottle is projected from 4d to 3d.
+.TP 8
+.B \-projection-4d random
+Project the Klein bottle from 4d to 3d using a random projection mode
+(default).
+.TP 8
+.B \-projection-4d perspective \fP(Shortcut: \fB\-perspective-4d\fP)
+Project the Klein bottle from 4d to 3d using a perspective projection.
+.TP 8
+.B \-projection-4d orthographic \fP(Shortcut: \fB\-orthographic-4d\fP)
+Project the Klein bottle from 4d to 3d using an orthographic
+projection.
+.PP
+The following six options determine the rotation speed of the Klein
+bottle around the six possible hyperplanes. The rotation speed is
+measured in degrees per frame. The speeds should be set to relatively
+small values, e.g., less than 4 in magnitude. In walk mode, all
+speeds are ignored. In walk-and-turn mode, the 3d rotation speeds are
+ignored (i.e., the wx, wy, and wz speeds). In walk-and-turn mode,
+smaller speeds must be used than in the turn mode to achieve a nice
+visualization. Therefore, in walk-and-turn mode the speeds you have
+selected are divided by 5 internally.
+.TP 8
+.B \-speed-wx \fIfloat\fP
+Rotation speed around the wx plane (default: 1.1).
+.TP 8
+.B \-speed-wy \fIfloat\fP
+Rotation speed around the wy plane (default: 1.3).
+.TP 8
+.B \-speed-wz \fIfloat\fP
+Rotation speed around the wz plane (default: 1.5).
+.TP 8
+.B \-speed-xy \fIfloat\fP
+Rotation speed around the xy plane (default: 1.7).
+.TP 8
+.B \-speed-xz \fIfloat\fP
+Rotation speed around the xz plane (default: 1.9).
+.TP 8
+.B \-speed-yz \fIfloat\fP
+Rotation speed around the yz plane (default: 2.1).
+.PP
+The following two options determine the walking speed and direction.
+.TP 8
+.B \-walk-direction \fIfloat\fP
+The walking direction is measured as an angle in degrees in the 2d
+square that forms the coordinate system of the surface of the Klein
+bottle (default: 7.0).
+.TP 8
+.B \-walk-speed \fIfloat\fP
+The walking speed is measured in percent of some sensible maximum
+speed (default: 20.0).
+.SH INTERACTION
+If you run this program in standalone mode in its turn mode, you can
+rotate the Klein bottle by dragging the mouse while pressing the left
+mouse button. This rotates the Klein bottle in 3D, i.e., around the
+wx, wy, and wz planes. If you press the shift key while dragging the
+mouse with the left button pressed the Klein bottle is rotated in 4D,
+i.e., around the xy, xz, and yz planes. To examine the Klein bottle
+at your leisure, it is best to set all speeds to 0. Otherwise, the
+Klein bottle will rotate while the left mouse button is not pressed.
+This kind of interaction is not available in the two walk modes.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2005-2014 by Carsten Steger. Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose. It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Carsten Steger <carsten@mirsanmir.org>, 03-oct-2014.
diff --git a/hacks/glx/lament.c b/hacks/glx/lament.c
new file mode 100644
index 0000000..97ce18b
--- /dev/null
+++ b/hacks/glx/lament.c
@@ -0,0 +1,1786 @@
+/* xscreensaver, Copyright (c) 1998-2018 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+/* Animates Lemarchand's Box, the Lament Configuration. By jwz, 25-Jul-98.
+
+ TODO:
+
+ * The gold leaf should appear to be raised up from the surface, but
+ I think this isn't possible with OpenGL. No bump maps.
+
+ * There should be strange lighting effects playing across the surface:
+ electric sparks, or little glittery blobs of light. Maybe like
+ http://www.opengl.org/archives/resources/features/KilgardTechniques/
+ LensFlare/
+
+ * Chains.
+
+ * Needs music. ("Hellraiser Themes" by Coil: TORSO CD161; also
+ duplicated on the "Unnatural History 2" compilation, WORLN M04699.)
+ */
+
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_lament 0
+# define release_lament 0
+#include "xlockmore.h"
+
+#ifdef USE_GL /* whole file */
+
+#include "gllist.h"
+
+/* #define DEBUG_MODE LAMENT_LEVIATHAN_COLLAPSE */
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+#undef MAX
+#define MAX(x, y) ((x) > (y) ? (x) : (y))
+#undef MIN
+#define MIN(x, y) ((x) < (y) ? (x) : (y))
+
+extern const struct gllist
+ *lament_model_box,
+ *lament_model_iso_base_a,
+ *lament_model_iso_base_b,
+ *lament_model_iso_den,
+ *lament_model_iso_dse,
+ *lament_model_iso_dwn,
+ *lament_model_iso_swd,
+ *lament_model_iso_une,
+ *lament_model_iso_unw,
+ *lament_model_iso_use,
+ *lament_model_iso_usw,
+ *lament_model_leviathan,
+ *lament_model_lid_a,
+ *lament_model_lid_b,
+ *lament_model_lid_base,
+ *lament_model_lid_c,
+ *lament_model_lid_d,
+ *lament_model_pillar_a,
+ *lament_model_pillar_b,
+ *lament_model_pillar_base,
+ *lament_model_star_d,
+ *lament_model_star_u,
+ *lament_model_taser_a,
+ *lament_model_taser_b,
+ *lament_model_taser_base,
+ *lament_model_tetra_base,
+ *lament_model_tetra_dse,
+ *lament_model_tetra_dwn,
+ *lament_model_tetra_une,
+ *lament_model_tetra_usw;
+
+static const struct gllist * const *all_objs[] = {
+ &lament_model_box,
+ &lament_model_iso_base_a,
+ &lament_model_iso_base_b,
+ &lament_model_iso_den,
+ &lament_model_iso_dse,
+ &lament_model_iso_dwn,
+ &lament_model_iso_swd,
+ &lament_model_iso_une,
+ &lament_model_iso_unw,
+ &lament_model_iso_use,
+ &lament_model_iso_usw,
+ &lament_model_leviathan,
+ &lament_model_lid_a,
+ &lament_model_lid_b,
+ &lament_model_lid_base,
+ &lament_model_lid_c,
+ &lament_model_lid_d,
+ &lament_model_pillar_a,
+ &lament_model_pillar_b,
+ &lament_model_pillar_base,
+ &lament_model_star_d,
+ &lament_model_star_u,
+ &lament_model_taser_a,
+ &lament_model_taser_b,
+ &lament_model_taser_base,
+ &lament_model_tetra_base,
+ &lament_model_tetra_dse,
+ &lament_model_tetra_dwn,
+ &lament_model_tetra_une,
+ &lament_model_tetra_usw
+};
+
+typedef enum { /* must be in the same order as in `all_objs'. */
+ OBJ_BOX = 0,
+ OBJ_ISO_BASE_A,
+ OBJ_ISO_BASE_B,
+ OBJ_ISO_DEN,
+ OBJ_ISO_DSE,
+ OBJ_ISO_DWN,
+ OBJ_ISO_SWD,
+ OBJ_ISO_UNE,
+ OBJ_ISO_UNW,
+ OBJ_ISO_USE,
+ OBJ_ISO_USW,
+ OBJ_LEVIATHAN,
+ OBJ_LID_A,
+ OBJ_LID_B,
+ OBJ_LID_BASE,
+ OBJ_LID_C,
+ OBJ_LID_D,
+ OBJ_PILLAR_A,
+ OBJ_PILLAR_B,
+ OBJ_PILLAR_BASE,
+ OBJ_STAR_D,
+ OBJ_STAR_U,
+ OBJ_TASER_A,
+ OBJ_TASER_B,
+ OBJ_TASER_BASE,
+ OBJ_TETRA_BASE,
+ OBJ_TETRA_DSE,
+ OBJ_TETRA_DWN,
+ OBJ_TETRA_UNE,
+ OBJ_TETRA_USW
+} lament_obj_index;
+
+
+#define DEF_TEXTURE "True"
+
+static int do_texture;
+
+static XrmOptionDescRec opts[] = {
+ {"-texture", ".lament.texture", XrmoptionNoArg, "true" },
+ {"+texture", ".lament.texture", XrmoptionNoArg, "false" },
+};
+
+static argtype vars[] = {
+ {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+};
+
+ENTRYPOINT ModeSpecOpt lament_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#include "ximage-loader.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include "normals.h"
+
+#include "images/gen/lament512_png.h"
+
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+typedef enum {
+ LAMENT_BOX,
+
+ LAMENT_STAR_OUT,
+ LAMENT_STAR_ROT,
+ LAMENT_STAR_ROT_IN,
+ LAMENT_STAR_ROT_OUT,
+ LAMENT_STAR_UNROT,
+ LAMENT_STAR_IN,
+
+ LAMENT_TETRA_UNE,
+ LAMENT_TETRA_USW,
+ LAMENT_TETRA_DWN,
+ LAMENT_TETRA_DSE,
+
+ LAMENT_LID_OPEN,
+ LAMENT_LID_CLOSE,
+ LAMENT_LID_ZOOM,
+
+ LAMENT_TASER_OUT,
+ LAMENT_TASER_SLIDE,
+ LAMENT_TASER_SLIDE_IN,
+ LAMENT_TASER_IN,
+
+ LAMENT_PILLAR_OUT,
+ LAMENT_PILLAR_SPIN,
+ LAMENT_PILLAR_IN,
+
+ LAMENT_SPHERE_OUT,
+ LAMENT_SPHERE_IN,
+
+ LAMENT_LEVIATHAN_SPIN,
+ LAMENT_LEVIATHAN_FADE,
+ LAMENT_LEVIATHAN_TWIST,
+ LAMENT_LEVIATHAN_COLLAPSE,
+ LAMENT_LEVIATHAN_EXPAND,
+ LAMENT_LEVIATHAN_UNTWIST,
+ LAMENT_LEVIATHAN_UNFADE,
+ LAMENT_LEVIATHAN_UNSPIN,
+
+} lament_type;
+
+static const GLfloat exterior_color[] =
+ { 0.33, 0.22, 0.03, 1.00, /* ambient */
+ 0.78, 0.57, 0.11, 1.00, /* specular */
+ 0.99, 0.91, 0.81, 1.00, /* diffuse */
+ 27.80 /* shininess */
+ };
+static const GLfloat interior_color[] =
+ { 0.20, 0.20, 0.15, 1.00, /* ambient */
+ 0.40, 0.40, 0.32, 1.00, /* specular */
+ 0.99, 0.99, 0.81, 1.00, /* diffuse */
+ 50.80 /* shininess */
+ };
+static const GLfloat leviathan_color[] =
+ { 0.30, 0.30, 0.30, 1.00, /* ambient */
+ 0.85, 0.85, 0.95, 1.00, /* specular */
+ 0.99, 0.99, 0.99, 1.00, /* diffuse */
+ 50.80 /* shininess */
+ };
+static const GLfloat black_color[] =
+ { 0.05, 0.05, 0.05, 1.00, /* ambient */
+ 0.05, 0.05, 0.05, 1.00, /* specular */
+ 0.05, 0.05, 0.05, 1.00, /* diffuse */
+ 80.00 /* shininess */
+ };
+
+
+typedef struct {
+ GLXContext *glx_context;
+ rotator *rot;
+ double rotx, roty, rotz;
+ trackball_state *trackball;
+ Bool button_down_p;
+ Bool ffwdp;
+
+ GLuint dlists[countof(all_objs)];
+ GLuint polys[countof(all_objs)];
+
+ XImage *texture; /* image bits */
+ GLuint texids[8]; /* texture map IDs */
+ lament_type type; /* which mode of the object is current */
+
+ int anim_pause; /* countdown before animating again */
+ GLfloat anim_r, anim_y, anim_z; /* relative position during anims */
+ Bool facing_p;
+
+ int state, nstates;
+ lament_type *states;
+
+} lament_configuration;
+
+static lament_configuration *lcs = NULL;
+
+
+static Bool
+facing_screen_p (ModeInfo *mi)
+{
+ Bool facing_p;
+ GLdouble m[16], p[16], x, y, z;
+ GLint v[4];
+ glGetDoublev (GL_MODELVIEW_MATRIX, m);
+ glGetDoublev (GL_PROJECTION_MATRIX, p);
+ glGetIntegerv (GL_VIEWPORT, v);
+
+ /* See if a coordinate 5 units in front of the door is near the
+ center of the screen. */
+ gluProject (0, -5, 0, m, p, v, &x, &y, &z);
+ x = (x / MI_WIDTH(mi)) - 0.5;
+ y = (y / MI_HEIGHT(mi)) - 0.5;
+
+ facing_p = (z < 0.9 &&
+ x > -0.15 && x < 0.15 &&
+ y > -0.15 && y < 0.15);
+
+# ifdef DEBUG_MODE
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable (GL_LIGHTING);
+ glColor3f (1, (facing_p ? 1 : 0), 0);
+ glBegin (GL_LINES);
+ glVertex3f (0, 0, 0);
+ glVertex3f (0, -5, 0);
+ glEnd();
+ if (!MI_IS_WIREFRAME(mi)) glEnable (GL_LIGHTING);
+# endif /* DEBUG_MODE */
+
+ return facing_p;
+}
+
+
+static void
+scale_for_window (ModeInfo *mi)
+{
+ lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+
+ GLfloat target_size = 1.4 * (lc->texture ? lc->texture->width : 512);
+ GLfloat size = MI_WIDTH(mi) < MI_HEIGHT(mi) ? MI_WIDTH(mi) : MI_HEIGHT(mi);
+ GLfloat scale;
+
+ /* Make it take up roughly the full width of the window. */
+ scale = 20;
+
+ /* But if the window is wider than tall, make it only take up the
+ height of the window instead.
+ */
+ if (MI_WIDTH(mi) > MI_HEIGHT(mi))
+ scale /= MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi);
+
+ /* If the window is super wide, make it bigger. */
+ if (scale < 8) scale = 8;
+
+ /* Constrain it to roughly life-sized on the screen, not huge.
+ */
+# ifdef HAVE_MOBILE
+ if (size > 768) /* iPad retina / iPhone 6 */
+ target_size *= 1.5;
+ else
+# endif
+ {
+ GLfloat max = 500; /* 3" on my screen... */
+
+ if (MI_WIDTH(mi) > 2560) { /* Retina displays */
+ target_size *= 2.5;
+ max *= 2.5;
+ }
+
+ if (target_size > max)
+ target_size = max;
+ }
+
+ /* But if that would make the image larger than target_size, scale it
+ back down again. The image-map bits we have are 512x512, so if the
+ image is magnified a lot, it looks pretty blocky. It's better to
+ have a 512x512 animation on a 1920x1080 screen that looks good
+ than a 1024x1024 animation that looks really pixelated.
+ */
+ if (size > target_size)
+ scale *= target_size / size;
+
+ glScalef (scale, scale, scale);
+}
+
+
+static void
+set_colors (const GLfloat *color)
+{
+ glMaterialfv(GL_FRONT, GL_AMBIENT, color + 0);
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, color + 4);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, color + 8);
+ glMaterialfv(GL_FRONT, GL_SHININESS, color + 12);
+}
+
+static void
+set_colors_alpha (const GLfloat *color, GLfloat a)
+{
+ GLfloat c[countof(leviathan_color)];
+ memcpy (c, color, sizeof(c));
+ c[3] = c[7] = c[11] = a;
+ set_colors (c);
+}
+
+
+static void
+which_face (ModeInfo *mi, const GLfloat *f, int *face, int *outerp)
+{
+ GLfloat size = 3; /* 3" square */
+ const GLfloat *n = f; /* normal */
+ const GLfloat *v = f + 3; /* vertex */
+ GLfloat slack = 0.01;
+
+ /* First look at the normal to determine which direction this triangle
+ is facing (or is most-closely facing).
+ It's an outer surface if it is within epsilon of the cube wall that
+ it is facing. Otherwise, it's an inner surface.
+ */
+ if (n[1] < -0.5) *face = 1, *outerp = v[1] < slack; /* S */
+ else if (n[2] > 0.5) *face = 2, *outerp = v[2] > size-slack; /* U */
+ else if (n[1] > 0.5) *face = 3, *outerp = v[1] > size-slack; /* N */
+ else if (n[2] < -0.5) *face = 4, *outerp = v[2] < slack; /* D */
+ else if (n[0] < -0.5) *face = 5, *outerp = v[0] < slack; /* W */
+ else /* (n[0] > 0.5)*/ *face = 6, *outerp = v[0] > size-slack; /* E */
+
+ /* Faces that don't have normals parallel to the axes aren't external. */
+ if (*outerp &&
+ (n[0] > -0.95 && n[0] < 0.95 &&
+ n[1] > -0.95 && n[1] < 0.95 &&
+ n[2] > -0.95 && n[2] < 0.95))
+ *outerp = 0;
+}
+
+
+static void
+texturize_vert (ModeInfo *mi, int which, const GLfloat *v)
+{
+ GLfloat size = 3; /* 3" square */
+ GLfloat s = 0, q = 0;
+
+ /* Texture coordinates are surface coordinates,
+ on the plane of this cube wall. */
+ switch (which) {
+ case 0: break;
+ case 1: s = v[0], q = v[2]; break;
+ case 2: s = v[0], q = v[1]; break;
+ case 3: s = v[0], q = v[2]; q = size - q; break;
+ case 4: s = v[0], q = v[1]; q = size - q; break;
+ case 5: s = v[1], q = v[2]; break;
+ case 6: s = v[1], q = v[2]; break;
+ default: abort(); break;
+ }
+
+ glTexCoord2f (s / size, q / size);
+}
+
+
+static void
+leviathan (ModeInfo *mi, GLfloat ratio, GLfloat alpha, Bool top_p)
+{
+ lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+ Bool wire = MI_IS_WIREFRAME(mi);
+ GLfloat r = 0.34;
+ GLfloat z = 2 * ratio;
+ XYZ p[3];
+ int i;
+
+ GLfloat th = acos (2 / sqrt (6)); /* Line up with cube's diagonal */
+
+ glPushMatrix();
+
+ glRotatef (-45, 0, 1, 0);
+ glRotatef (-th * 180 / M_PI, 0, 0, 1);
+
+ if (!top_p)
+ glRotatef (180, 0, 0, 1);
+
+ for (i = 0; i < countof(p); i++)
+ {
+ GLfloat th = i * M_PI * 2 / countof(p);
+ p[i].x = cos(th) * r;
+ p[i].y = sin(th) * r;
+ }
+
+ glFrontFace (GL_CCW);
+ for (i = 0; i < countof(p); i++)
+ {
+ int j = (i + 1) % countof(p);
+/* if (top_p)*/
+ do_normal (z, 0, 0,
+ 0, p[i].x, p[i].y,
+ 0, p[j].x, p[j].y);
+/*
+ else
+ do_normal (z, 0, 0,
+ 0, p[j].y, p[j].z,
+ 0, p[i].y, p[i].z);
+*/
+
+ if (do_texture) /* Leviathan is the final texture */
+ glBindTexture (GL_TEXTURE_2D, lc->texids[countof(lc->texids) - 1]);
+
+ set_colors (leviathan_color);
+
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ glTexCoord2f (0.5, 1);
+ glVertex3f (z, 0, 0);
+
+ glTexCoord2f (0, 0);
+ glVertex3f (0, p[i].x, p[i].y);
+
+ glTexCoord2f (1, 0);
+ glVertex3f (0, p[j].x, p[j].y);
+ glEnd();
+ mi->polygon_count++;
+
+ /* Shield for fading */
+ if (alpha < 0.9 && !wire)
+ {
+ GLfloat a = 0.35;
+ GLfloat b = 0.69;
+
+ set_colors_alpha (black_color, 1-alpha);
+ glBindTexture (GL_TEXTURE_2D, 0);
+ if (!wire)
+ {
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+
+ glVertex3f (z*a, p[j].x * b, p[j].y * b);
+ glVertex3f (z*a, p[i].x * b, p[i].y * b);
+ glVertex3f (0, p[i].x * 1.01, p[i].y * 1.01);
+ glVertex3f (0, p[j].x * 1.01, p[j].y * 1.01);
+ glEnd();
+ mi->polygon_count++;
+ glDisable (GL_BLEND);
+ }
+ }
+
+ glPopMatrix();
+}
+
+
+static void
+folding_walls (ModeInfo *mi, GLfloat ratio, Bool top_p)
+{
+ lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+ Bool wire = MI_IS_WIREFRAME(mi);
+ const GLfloat pa[4][2] = {{ -0.5, -0.215833 },
+ { 0, 0.5 },
+ { 0.5, 0 },
+ { -0.215833, -0.5 }};
+ const int tex[6] = { 0, 5, 1, 4, 2, 3 };
+ const GLfloat top = -pa[0][1];
+ GLfloat end_angle = 30.85;
+ GLfloat rr = sin (ratio / 2 * M_PI);
+ GLfloat offa = 0.15 * rr;
+ GLfloat offb = 0.06 * rr;
+ GLfloat p[4][3];
+ GLfloat t[4][2];
+ int i;
+
+ glPushMatrix();
+
+ if (top_p)
+ {
+ glRotatef (60, 1, -1, 1);
+ glRotatef (180, 0, 1, 0);
+ glRotatef (90, 1, 0, 0);
+ }
+ else
+ {
+ glRotatef (180, 1, 0, 0);
+ }
+
+ /* Scale down the points near the axis */
+
+ p[0][0] = pa[0][0];
+ p[0][1] = 0.5;
+ p[0][2] = pa[0][1];
+
+ p[1][0] = pa[1][0] - offb;
+ p[1][1] = 0.5;
+ p[1][2] = pa[1][1] - offa;
+
+ p[2][0] = pa[2][0] - offa;
+ p[2][1] = 0.5;
+ p[2][2] = pa[2][1] - offb;
+
+ p[3][0] = pa[3][0];
+ p[3][1] = 0.5;
+ p[3][2] = pa[3][1];
+
+ if (!wire)
+ {
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ for (i = 0; i < 3; i++)
+ {
+ glPushMatrix();
+
+ if (i == 1)
+ {
+ glRotatef (-90, 1, 0, 0);
+ glRotatef (180, 1, 1, 0);
+ }
+ else if (i == 2)
+ {
+ glRotatef (-90, 1, 0, 0);
+ glRotatef (180, 0, 1, 0);
+ glRotatef (90, 0, 1, 0);
+ }
+
+ glRotatef (-90, 0, 1, 0);
+
+ glTranslatef (-(top/2 + 0.25), 0.5, -(top/2 + 0.25));
+ glRotatef (-45, 0, 1, 0);
+ glRotatef (ratio * -end_angle, 0, 0, 1);
+ glRotatef (45, 0, 1, 0);
+ glTranslatef (top/2 + 0.25, -0.5, top/2 + 0.25);
+
+ /* Get the texture coordinates right.
+ This is hairy and incomprehensible. */
+
+ t[0][0] = pa[0][1] + 0.5; t[0][1] = pa[0][0] + 0.5;
+ t[1][0] = pa[1][1] + 0.5; t[1][1] = pa[1][0] + 0.5;
+ t[2][0] = pa[2][1] + 0.5; t[2][1] = pa[2][0] + 0.5;
+ t[3][0] = pa[3][1] + 0.5; t[3][1] = pa[3][0] + 0.5;
+
+ if (i == 0 && !top_p)
+ {
+# define SWAP(A,B) A = 1-A, B = 1-B
+ SWAP(t[0][0], t[0][1]);
+ SWAP(t[1][0], t[1][1]);
+ SWAP(t[2][0], t[2][1]);
+ SWAP(t[3][0], t[3][1]);
+# undef SWAP
+ }
+ else if (i == 0 && top_p)
+ {
+ GLfloat ot[4][3];
+ memcpy (ot, t, sizeof(t));
+# define SWAP(A,B) A = 1-A, B = 1-B
+ SWAP(t[0][0], ot[2][1]);
+ SWAP(t[1][0], ot[3][1]);
+ SWAP(t[2][0], ot[0][1]);
+ SWAP(t[3][0], ot[1][1]);
+# undef SWAP
+ }
+ else if (i == 1)
+ {
+ GLfloat f;
+# define SWAP(A,B) f = A, A = B, B = -f
+ SWAP(t[0][0], t[0][1]);
+ SWAP(t[1][0], t[1][1]);
+ SWAP(t[2][0], t[2][1]);
+ SWAP(t[3][0], t[3][1]);
+# undef SWAP
+ }
+
+ set_colors_alpha (exterior_color, 1-ratio);
+ glBindTexture (GL_TEXTURE_2D, lc->texids[tex[i + (top_p ? 3 : 0)]]);
+
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ do_normal (p[0][0], p[0][1], p[0][2],
+ p[1][0], p[1][1], p[1][2],
+ p[2][0], p[2][1], p[2][2]);
+ glTexCoord2fv(t[0]); glVertex3fv(p[0]);
+ glTexCoord2fv(t[1]); glVertex3fv(p[1]);
+ glTexCoord2fv(t[2]); glVertex3fv(p[2]);
+ glTexCoord2fv(t[3]); glVertex3fv(p[3]);
+ glEnd();
+ mi->polygon_count++;
+
+ /* The triangles between the quads */
+# if 0
+ /* #### There is a fucking gap between the two black triangles
+ that I can't figure out! So instead of drawing the triangles,
+ we build a black shield around the middle bit in leviathan()
+ and count on back-face culling to have roughly the same effect.
+ */
+ if (!wire)
+ {
+ GLfloat pp[4][3];
+ memcpy (pp, p, sizeof(pp));
+ memcpy (pp[2], pp[1], sizeof(pp[1]));
+ pp[2][0] -= 0.5 * (1-ratio);
+ pp[2][1] -= 0.5 * (1-ratio);
+
+ glBindTexture (GL_TEXTURE_2D, 0);
+ set_colors_alpha (black_color, 1-ratio);
+
+ glBegin(wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ do_normal (pp[0][0], pp[0][1], pp[0][2],
+ pp[2][0], pp[2][1], pp[2][2],
+ pp[1][0], pp[1][1], pp[1][2]);
+ glVertex3fv(pp[0]);
+ glVertex3fv(pp[2]);
+ glVertex3fv(pp[1]);
+ glEnd();
+ mi->polygon_count++;
+ }
+# endif
+
+ glPopMatrix();
+ }
+
+ if (! wire) glDisable (GL_BLEND);
+
+ glPopMatrix();
+}
+
+
+static int
+lament_sphere (ModeInfo *mi, GLfloat ratio)
+{
+ lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+ Bool wire = MI_IS_WIREFRAME(mi);
+ GLfloat size = 3; /* 3" square */
+ int polys = 0;
+ int facets = 16; /* NxN grid on each face */
+ int face;
+ static const GLfloat norms[6][3] = {{ 0, -1, 0 }, { 0, 0, 1 }, { 0, 1, 0 },
+ { 0, 0, -1 }, { -1, 0, 0 }, { 1, 0, 0 }};
+ GLfloat s = 1.0 / facets;
+
+ /* The ratio used for the normals: linger on the square normals. */
+ GLfloat ratio2 = 1 - sin ((1 - ratio) / 2 * M_PI);
+ GLfloat r1 = 1 - ratio2 / 2;
+ GLfloat r2 = ratio2 / 2;
+
+ glPushMatrix();
+ glTranslatef (-0.5, -0.5, -0.5);
+ glScalef (1/size, 1/size, 1/size);
+
+ set_colors (exterior_color);
+
+ for (face = 0; face < 6; face++)
+ {
+ GLfloat x0, y0;
+ for (y0 = 0; y0 < 1; y0 += s)
+ for (x0 = 0; x0 < 1; x0 += s)
+ {
+ int i;
+ GLfloat x1 = x0 + s;
+ GLfloat y1 = y0 + s;
+ GLfloat pa[4][3]; /* verts of the cube */
+ GLfloat pb[4][3]; /* verts of the transition to the sphere */
+ Bool frontp;
+ GLfloat norm[4][3]; /* normals of the transitional verts */
+
+ if (norms[face][0])
+ frontp = norms[face][0] < 0,
+ pa[0][1] = x0, pa[0][2] = y0, pa[0][0] = (frontp ? 0 : 1),
+ pa[1][1] = x1, pa[1][2] = y0, pa[1][0] = pa[0][0],
+ pa[2][1] = x1, pa[2][2] = y1, pa[2][0] = pa[0][0],
+ pa[3][1] = x0, pa[3][2] = y1, pa[3][0] = pa[0][0];
+ else if (norms[face][1])
+ frontp = norms[face][1] > 0,
+ pa[0][0] = x0, pa[0][2] = y0, pa[0][1] = (frontp ? 1 : 0),
+ pa[1][0] = x1, pa[1][2] = y0, pa[1][1] = pa[0][1],
+ pa[2][0] = x1, pa[2][2] = y1, pa[2][1] = pa[0][1],
+ pa[3][0] = x0, pa[3][2] = y1, pa[3][1] = pa[0][1];
+ else /* (norms[face][2]) */
+ frontp = norms[face][2] < 0,
+ pa[0][0] = x0, pa[0][1] = y0, pa[0][2] = (frontp ? 0 : 1),
+ pa[1][0] = x1, pa[1][1] = y0, pa[1][2] = pa[0][2],
+ pa[2][0] = x1, pa[2][1] = y1, pa[2][2] = pa[0][2],
+ pa[3][0] = x0, pa[3][1] = y1, pa[3][2] = pa[0][2];
+
+ for (i = 0; i < countof(pa); i++)
+ pa[i][0] *= size, pa[i][1] *= size, pa[i][2] *= size;
+
+ /* Convert square to sphere by treating as a normalized vector */
+ for (i = 0; i < countof(pa); i++)
+ {
+ GLfloat x = (pa[i][0] / size) - 0.5;
+ GLfloat y = (pa[i][1] / size) - 0.5;
+ GLfloat z = (pa[i][2] / size) - 0.5;
+ GLfloat d = sqrt (x*x + y*y + z*z) / 2;
+ x = x/d + size/2;
+ y = y/d + size/2;
+ z = z/d + size/2;
+
+ pb[i][0] = pa[i][0] + ((x - pa[i][0]) * ratio);
+ pb[i][1] = pa[i][1] + ((y - pa[i][1]) * ratio);
+ pb[i][2] = pa[i][2] + ((z - pa[i][2]) * ratio);
+ }
+
+ /* The normals of an intermediate point are the weighted average
+ of the cube's orthogonal normals, and the sphere's radial
+ normals: early in the sequence, the edges are sharp, but they
+ soften as it expands. */
+ {
+ XYZ na, pa0, pa1, pa2;
+ pa0.x = pa[0][0]; pa0.y = pa[0][1]; pa0.z = pa[0][2];
+ pa1.x = pa[1][0]; pa1.y = pa[1][1]; pa1.z = pa[1][2];
+ pa2.x = pa[2][0]; pa2.y = pa[2][1]; pa2.z = pa[2][2];
+ na = calc_normal (pa0, pa1, pa2);
+
+ for (i = 0; i < countof(pb); i++)
+ {
+ GLfloat d;
+ XYZ nb;
+
+ nb.x = pb[i][0];
+ nb.y = pb[i][1];
+ nb.z = pb[i][2];
+ d = sqrt (nb.x*nb.x + nb.y*nb.y + nb.z*nb.z); /* normalize */
+ nb.x /= d;
+ nb.y /= d;
+ nb.z /= d;
+
+ norm[i][0] = (na.x * r1) + (nb.x * r2); /* weighted */
+ norm[i][1] = (na.y * r1) + (nb.y * r2);
+ norm[i][2] = (na.z * r1) + (nb.z * r2);
+ }
+ }
+
+ if (! wire)
+ glBindTexture (GL_TEXTURE_2D, lc->texids[face]);
+
+ glFrontFace (frontp ? GL_CW : GL_CCW);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+
+ texturize_vert (mi, face+1, pa[0]);
+ glNormal3fv (norm[0]);
+ glVertex3fv (pb[0]);
+
+ texturize_vert (mi, face+1, pa[1]);
+ glNormal3fv (norm[1]);
+ glVertex3fv (pb[1]);
+
+ texturize_vert (mi, face+1, pa[2]);
+ glNormal3fv (norm[2]);
+ glVertex3fv (pb[2]);
+
+ texturize_vert (mi, face+1, pa[3]);
+ glNormal3fv (norm[3]);
+ glVertex3fv (pb[3]);
+
+ glEnd();
+ polys++;
+ }
+ }
+
+ glPopMatrix();
+
+ return polys;
+}
+
+
+static void
+draw (ModeInfo *mi)
+{
+ lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+ Bool wire = MI_IS_WIREFRAME(mi);
+
+ mi->polygon_count = 0;
+
+ if (!wire)
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ else
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glPushMatrix();
+
+ gltrackball_rotate (lc->trackball);
+
+ /* Make into the screen be +Y, right be +X, and up be +Z. */
+ glRotatef (-90.0, 1.0, 0.0, 0.0);
+
+ scale_for_window (mi);
+
+ /* Apply rotation to the object. */
+ if (lc->type != LAMENT_LID_ZOOM)
+ get_rotation (lc->rot, &lc->rotx, &lc->roty, &lc->rotz,
+ !lc->button_down_p);
+# ifdef DEBUG_MODE
+ lc->rotx = 0.18;
+ lc->roty = 0.22;
+ lc->rotx = lc->roty = 0;
+ lc->rotz = 0;
+# endif
+
+ glRotatef (lc->rotx * 360, 1, 0, 0);
+ glRotatef (lc->roty * 360, 0, 1, 0);
+ glRotatef (lc->rotz * 360, 0, 0, 1);
+
+ glScalef (0.5, 0.5, 0.5);
+
+ switch (lc->type)
+ {
+ case LAMENT_BOX:
+ glCallList (lc->dlists[OBJ_BOX]);
+ mi->polygon_count += lc->polys[OBJ_BOX];
+ break;
+
+ case LAMENT_STAR_OUT:
+ case LAMENT_STAR_ROT:
+ case LAMENT_STAR_ROT_IN:
+ case LAMENT_STAR_ROT_OUT:
+ case LAMENT_STAR_UNROT:
+ case LAMENT_STAR_IN:
+ glTranslatef (0.0, 0.0, lc->anim_z/2);
+ glRotatef (lc->anim_r/2, 0.0, 0.0, 1.0);
+ glCallList (lc->dlists[OBJ_STAR_U]);
+ mi->polygon_count += lc->polys[OBJ_STAR_U];
+
+ glTranslatef (0.0, 0.0, -lc->anim_z);
+ glRotatef (-lc->anim_r, 0.0, 0.0, 1.0);
+ glCallList (lc->dlists[OBJ_STAR_D]);
+ mi->polygon_count += lc->polys[OBJ_STAR_D];
+ break;
+
+ case LAMENT_TETRA_UNE:
+ case LAMENT_TETRA_USW:
+ case LAMENT_TETRA_DWN:
+ case LAMENT_TETRA_DSE:
+ {
+ int magic;
+ GLfloat x, y, z;
+ switch (lc->type) {
+ case LAMENT_TETRA_UNE: magic = OBJ_TETRA_UNE; x= 1; y= 1; z= 1; break;
+ case LAMENT_TETRA_USW: magic = OBJ_TETRA_USW; x= 1; y= 1; z=-1; break;
+ case LAMENT_TETRA_DWN: magic = OBJ_TETRA_DWN; x= 1; y=-1; z= 1; break;
+ case LAMENT_TETRA_DSE: magic = OBJ_TETRA_DSE; x=-1; y= 1; z= 1; break;
+ default: abort(); break;
+ }
+ glCallList(lc->dlists[OBJ_TETRA_BASE]);
+ mi->polygon_count += lc->polys[OBJ_TETRA_BASE];
+ if (magic != OBJ_TETRA_UNE) glCallList (lc->dlists[OBJ_TETRA_UNE]);
+ if (magic != OBJ_TETRA_USW) glCallList (lc->dlists[OBJ_TETRA_USW]);
+ if (magic != OBJ_TETRA_DWN) glCallList (lc->dlists[OBJ_TETRA_DWN]);
+ if (magic != OBJ_TETRA_DSE) glCallList (lc->dlists[OBJ_TETRA_DSE]);
+ glRotatef (lc->anim_r, x, y, z);
+ glCallList (lc->dlists[magic]);
+ mi->polygon_count += lc->polys[magic] * 3;
+ }
+ break;
+
+ case LAMENT_LID_OPEN:
+ case LAMENT_LID_CLOSE:
+ case LAMENT_LID_ZOOM:
+ {
+ GLfloat d = 0.21582;
+ int i;
+ const int lists[4] = { OBJ_LID_A, OBJ_LID_B, OBJ_LID_C, OBJ_LID_D };
+
+ lc->facing_p = facing_screen_p (mi);
+
+ if (lc->anim_z < 0.5)
+ glTranslatef (0, -30 * lc->anim_z, 0); /* zoom */
+ else
+ glTranslatef (8 * (0.5 - (lc->anim_z - 0.5)), 0, 0);
+
+ glCallList (lc->dlists[OBJ_LID_BASE]);
+ mi->polygon_count += lc->polys[OBJ_LID_BASE];
+ for (i = 0; i < countof(lists); i++)
+ {
+ glPushMatrix();
+ glRotatef (90 * i, 0, 1, 0);
+ glTranslatef (-d, -0.5, d);
+ glRotatef (-45, 0, 1, 0);
+ glRotatef (-lc->anim_r, 1, 0, 0);
+ glRotatef (45, 0, 1, 0);
+ glTranslatef (d, 0.5, -d);
+ glRotatef (-90 * i, 0, 1, 0);
+ glCallList (lc->dlists[lists[i]]);
+ mi->polygon_count += lc->polys[lists[i]];
+ glPopMatrix();
+ }
+
+# ifdef DEBUG_MODE
+ if (lc->facing_p)
+ {
+ glColor3f(1, 0, 0);
+ glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+ glVertex3f (-0.49, 0.49, -0.49);
+ glVertex3f ( 0.49, 0.49, -0.49);
+ glVertex3f ( 0.49, 0.49, 0.49);
+ glVertex3f (-0.49, 0.49, 0.49);
+ glEnd();
+ mi->polygon_count++;
+ }
+# endif /* DEBUG_MODE */
+ }
+ break;
+
+ case LAMENT_TASER_OUT:
+ case LAMENT_TASER_SLIDE:
+ case LAMENT_TASER_SLIDE_IN:
+ case LAMENT_TASER_IN:
+
+ glTranslatef (0, -lc->anim_z/2, 0);
+ glCallList (lc->dlists[OBJ_TASER_BASE]);
+ mi->polygon_count += lc->polys[OBJ_TASER_BASE];
+
+ glTranslatef (0, lc->anim_z, 0);
+ glCallList (lc->dlists[OBJ_TASER_A]);
+ mi->polygon_count += lc->polys[OBJ_TASER_A];
+
+ glTranslatef (lc->anim_y, 0, 0);
+ glCallList (lc->dlists[OBJ_TASER_B]);
+ mi->polygon_count += lc->polys[OBJ_TASER_B];
+ break;
+
+ case LAMENT_PILLAR_OUT:
+ case LAMENT_PILLAR_SPIN:
+ case LAMENT_PILLAR_IN:
+
+ glCallList (lc->dlists[OBJ_PILLAR_BASE]);
+ mi->polygon_count += lc->polys[OBJ_PILLAR_BASE];
+
+ glPushMatrix();
+ if (lc->anim_z == 1 || lc->anim_z == 3)
+ {
+ glRotatef (lc->anim_r, 0, 0, 1);
+ glTranslatef (0, 0, lc->anim_y);
+ }
+ glCallList (lc->dlists[OBJ_PILLAR_A]);
+ mi->polygon_count += lc->polys[OBJ_PILLAR_A];
+ glPopMatrix();
+
+ glPushMatrix();
+ if (lc->anim_z == 2 || lc->anim_z == 3)
+ {
+ glRotatef (lc->anim_r, 0, 0, 1);
+ glTranslatef (0, 0, -lc->anim_y);
+ }
+ glCallList (lc->dlists[OBJ_PILLAR_B]);
+ mi->polygon_count += lc->polys[OBJ_PILLAR_B];
+ glPopMatrix();
+ break;
+
+ case LAMENT_SPHERE_OUT:
+ case LAMENT_SPHERE_IN:
+ mi->polygon_count += lament_sphere (mi, lc->anim_y);
+ break;
+
+ case LAMENT_LEVIATHAN_SPIN:
+ case LAMENT_LEVIATHAN_UNSPIN:
+ case LAMENT_LEVIATHAN_FADE:
+ case LAMENT_LEVIATHAN_UNFADE:
+ case LAMENT_LEVIATHAN_TWIST:
+ case LAMENT_LEVIATHAN_UNTWIST:
+ {
+ /* These normals are hard to compute, so I pulled them from the
+ model. */
+ const GLfloat axes[6][4] =
+ {{ OBJ_ISO_UNE, 0.633994, 0.442836, 0.633994 },
+ { OBJ_ISO_USW, 0.442836, 0.633994, -0.633994 },
+ { OBJ_ISO_DSE, -0.633994, 0.633994, 0.442836 },
+ { OBJ_ISO_SWD, -0.633994, -0.442836, -0.633994 },
+ { OBJ_ISO_DEN, -0.442836, -0.633994, 0.633994 },
+ { OBJ_ISO_UNW, 0.633994, -0.633994, -0.442836 }};
+ int i;
+
+ GLfloat s = (1 - lc->anim_z);
+ GLfloat s2 = MAX (0, 360 - lc->anim_r) / 360.0;
+ Bool blendp = 0;
+
+ switch (lc->type) {
+ case LAMENT_LEVIATHAN_SPIN: break;
+ case LAMENT_LEVIATHAN_UNSPIN: s2 = 1 - s2; break;
+ default: s2 = 0; blendp = 1; break;
+ }
+
+ if (wire) blendp = 0;
+
+ s = (s * 0.6) + 0.4;
+
+ leviathan (mi, 1 - s2, 1, True);
+ glCallList (lc->dlists[OBJ_ISO_BASE_A]);
+ mi->polygon_count += lc->polys[OBJ_ISO_BASE_A];
+
+ glPushMatrix();
+ glScalef (s2, s2, s2);
+ glCallList (lc->dlists[OBJ_ISO_USE]);
+ mi->polygon_count += lc->polys[OBJ_ISO_USE];
+ glPopMatrix();
+
+ glPushMatrix();
+ glRotatef (lc->anim_y, 1, -1, 1);
+ glCallList (lc->dlists[OBJ_ISO_BASE_B]);
+ mi->polygon_count += lc->polys[OBJ_ISO_BASE_B];
+ leviathan (mi, 1 - s2, 1, False);
+ glPopMatrix();
+
+ if (blendp)
+ {
+# ifndef HAVE_JWZGLES /* no glBlendColor */
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_CONSTANT_ALPHA, GL_SRC_ALPHA);
+ glBlendColor (1, 1, 1, MAX(0, 1-(lc->anim_z * 3)));
+# endif
+ }
+
+ for (i = 0; i < countof(axes); i++)
+ {
+ glPushMatrix();
+ glRotatef (lc->anim_r, axes[i][1], axes[i][2], axes[i][3]);
+ glScalef (s, s, s);
+ glCallList (lc->dlists[(int) axes[i][0]]);
+ mi->polygon_count += lc->polys[(int) axes[i][0]];
+ glPopMatrix();
+ if (i == 2)
+ glRotatef (lc->anim_y, 1, -1, 1);
+ }
+
+ if (blendp) glDisable (GL_BLEND);
+
+ glPushMatrix();
+ glScalef (s2, s2, s2);
+ glCallList (lc->dlists[OBJ_ISO_DWN]);
+ mi->polygon_count += lc->polys[OBJ_ISO_DWN];
+ glPopMatrix();
+ }
+ break;
+
+ case LAMENT_LEVIATHAN_COLLAPSE:
+ case LAMENT_LEVIATHAN_EXPAND:
+ {
+ glPushMatrix();
+ leviathan (mi, 1, lc->anim_y, True);
+ glRotatef (180, 1, -1, 1);
+ leviathan (mi, 1, lc->anim_y, False);
+ glPopMatrix();
+ folding_walls (mi, lc->anim_y, True);
+ folding_walls (mi, lc->anim_y, False);
+ }
+ break;
+
+ default:
+ abort();
+ break;
+ }
+
+ glPopMatrix();
+}
+
+
+/* Rather than just picking states randomly, pick an ordering randomly, do it,
+ and then re-randomize. That way one can be assured of seeing all states in
+ a short time period, though not always in the same order (it's frustrating
+ to see it pick the same state 5x in a row.) Though, that can still happen,
+ since states are in the list multiple times as a way of giving them
+ probabilities.
+ */
+static void
+shuffle_states (lament_configuration *lc)
+{
+ int i;
+ for (i = 0; i < lc->nstates; i++)
+ {
+ int a = random() % lc->nstates;
+ lament_type swap = lc->states[a];
+ lc->states[a] = lc->states[i];
+ lc->states[i] = swap;
+ }
+}
+
+
+static void
+animate (ModeInfo *mi)
+{
+ lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+ int pause = 10;
+ int pause2 = 120;
+ GLfloat speed = (lc->ffwdp ? 20 : 1);
+
+ switch (lc->type)
+ {
+ case LAMENT_BOX:
+ {
+ lc->state++;
+ if (lc->state >= lc->nstates)
+ {
+ shuffle_states (lc);
+ lc->state = 0;
+ }
+ lc->type = lc->states[lc->state];
+
+ if (lc->type == LAMENT_BOX)
+ lc->anim_pause = pause2;
+
+ lc->anim_r = 0.0;
+ lc->anim_y = 0.0;
+ lc->anim_z = 0.0;
+ }
+ break;
+
+ /* -------------------------------------------------------------- */
+
+ case LAMENT_STAR_OUT:
+ lc->anim_z += 0.01 * speed;
+ if (lc->anim_z >= 1.0)
+ {
+ lc->anim_z = 1.0;
+ lc->type = LAMENT_STAR_ROT;
+ lc->anim_pause = pause;
+ }
+ break;
+
+ case LAMENT_STAR_ROT:
+ lc->anim_r += 1.0 * speed;
+ if (lc->anim_r >= 45.0)
+ {
+ lc->anim_r = 45.0;
+ lc->type = LAMENT_STAR_ROT_IN;
+ lc->anim_pause = pause;
+ }
+ break;
+
+ case LAMENT_STAR_ROT_IN:
+ lc->anim_z -= 0.01 * speed;
+ if (lc->anim_z <= 0.0)
+ {
+ lc->anim_z = 0.0;
+ lc->type = LAMENT_STAR_ROT_OUT;
+ lc->anim_pause = pause2 * (1 + frand(2) + frand(2));
+ }
+ break;
+
+ case LAMENT_STAR_ROT_OUT:
+ lc->anim_z += 0.01 * speed;
+ if (lc->anim_z >= 1.0)
+ {
+ lc->anim_z = 1.0;
+ lc->type = LAMENT_STAR_UNROT;
+ lc->anim_pause = pause;
+ }
+ break;
+
+ case LAMENT_STAR_UNROT:
+ lc->anim_r -= 1.0 * speed;
+ if (lc->anim_r <= 0.0)
+ {
+ lc->anim_r = 0.0;
+ lc->type = LAMENT_STAR_IN;
+ lc->anim_pause = pause;
+ }
+ break;
+
+ case LAMENT_STAR_IN:
+ lc->anim_z -= 0.01 * speed;
+ if (lc->anim_z <= 0.0)
+ {
+ lc->anim_z = 0.0;
+ lc->type = LAMENT_BOX;
+ lc->anim_pause = pause2;
+ }
+ break;
+
+ /* -------------------------------------------------------------- */
+
+ case LAMENT_TETRA_UNE:
+ case LAMENT_TETRA_USW:
+ case LAMENT_TETRA_DWN:
+ case LAMENT_TETRA_DSE:
+
+ lc->anim_r += 1.0 * speed;
+ if (lc->anim_r >= 360.0)
+ {
+ lc->anim_r = 0.0;
+ lc->type = LAMENT_BOX;
+ lc->anim_pause = pause2;
+ }
+ else if (lc->anim_r > 119.0 && lc->anim_r <= 120.0)
+ {
+ lc->anim_r = 120.0;
+ lc->anim_pause = pause;
+ }
+ else if (lc->anim_r > 239.0 && lc->anim_r <= 240.0)
+ {
+ lc->anim_r = 240.0;
+ lc->anim_pause = pause;
+ }
+ break;
+
+ /* -------------------------------------------------------------- */
+
+ case LAMENT_LID_OPEN:
+ lc->anim_r += 1.0 * speed;
+
+ if (lc->anim_r >= 112.0)
+ {
+ lc->anim_r = 112.0;
+ lc->anim_z = 0.0;
+ lc->anim_pause = pause2;
+ lc->type = (lc->facing_p ? LAMENT_LID_ZOOM : LAMENT_LID_CLOSE);
+ }
+ break;
+
+ case LAMENT_LID_CLOSE:
+ lc->anim_r -= 1.0 * speed;
+ if (lc->anim_r <= 0.0)
+ {
+ lc->anim_r = 0.0;
+ lc->type = LAMENT_BOX;
+ lc->anim_pause = pause2;
+ }
+ break;
+
+ case LAMENT_LID_ZOOM:
+ lc->anim_z += 0.01 * speed;
+ if (lc->anim_z > 1.0)
+ {
+ lc->anim_r = 0.0;
+ lc->anim_z = 0.0;
+ lc->type = LAMENT_BOX;
+ }
+ break;
+
+ /* -------------------------------------------------------------- */
+
+ case LAMENT_TASER_OUT:
+ lc->anim_z += 0.005 * speed;
+ if (lc->anim_z >= 0.5)
+ {
+ lc->anim_z = 0.5;
+ lc->type = LAMENT_TASER_SLIDE;
+ lc->anim_pause = pause * (1 + frand(5) + frand(5));
+ }
+ break;
+
+ case LAMENT_TASER_SLIDE:
+ lc->anim_y += 0.005 * speed;
+ if (lc->anim_y >= 0.255)
+ {
+ lc->anim_y = 0.255;
+ lc->type = LAMENT_TASER_SLIDE_IN;
+ lc->anim_pause = pause2 * (1 + frand(5) + frand(5));
+ }
+ break;
+
+ case LAMENT_TASER_SLIDE_IN:
+ lc->anim_y -= 0.0025 * speed;
+ if (lc->anim_y <= 0.0)
+ {
+ lc->anim_y = 0.0;
+ lc->type = LAMENT_TASER_IN;
+ lc->anim_pause = pause;
+ }
+ break;
+
+ case LAMENT_TASER_IN:
+ lc->anim_z -= 0.0025 * speed;
+ if (lc->anim_z <= 0.0)
+ {
+ lc->anim_z = 0.0;
+ lc->type = LAMENT_BOX;
+ lc->anim_pause = pause2;
+ }
+ break;
+
+ /* -------------------------------------------------------------- */
+
+ case LAMENT_PILLAR_OUT:
+
+ if (lc->anim_y == 0) /* mostly in */
+ lc->anim_y += 0.005 * ((random() % 5) ? -1 : 1) * speed;
+ else if (lc->anim_y > 0)
+ lc->anim_y += 0.005 * speed;
+ else
+ lc->anim_y -= 0.001 * speed;
+
+ if (lc->anim_z == 0)
+ {
+ int i = (random() % 7); /* A, B or both */
+ if (i == 0) lc->anim_z = 3;
+ else if (i < 5) lc->anim_z = 2;
+ else lc->anim_z = 1;
+
+ /* We can do quarter turns, because it's radially symmetrical. */
+ lc->anim_r = 90.0 * (1 + frand(6)) * RANDSIGN();
+ }
+ if (lc->anim_y > 0.4)
+ {
+ lc->anim_y = 0.4;
+ lc->type = LAMENT_PILLAR_SPIN;
+ lc->anim_pause = pause;
+ }
+ else if (lc->anim_y < -0.03)
+ {
+ lc->anim_y = -0.03;
+ lc->type = LAMENT_PILLAR_SPIN;
+ lc->anim_pause = pause;
+ }
+ break;
+
+ case LAMENT_PILLAR_SPIN:
+ {
+ Bool negp = (lc->anim_r < 0);
+ lc->anim_r += (negp ? 1 : -1) * speed;
+ if (negp ? lc->anim_r > 0 : lc->anim_r < 0)
+ {
+ lc->anim_r = 0;
+ lc->type = LAMENT_PILLAR_IN;
+ }
+ }
+ break;
+
+ case LAMENT_PILLAR_IN:
+ {
+ Bool negp = (lc->anim_y < 0);
+ lc->anim_y += (negp ? 1 : -1) * 0.005 * speed;
+ if (negp ? lc->anim_y > 0 : lc->anim_y < 0)
+ {
+ lc->anim_y = 0;
+ lc->anim_z = 0;
+ lc->type = LAMENT_BOX;
+ lc->anim_pause = pause;
+ }
+ }
+ break;
+
+ /* -------------------------------------------------------------- */
+
+ case LAMENT_SPHERE_OUT:
+ {
+ lc->anim_y += 0.01 * speed;
+ if (lc->anim_y >= 1)
+ {
+ lc->anim_y = 1;
+ lc->type = LAMENT_SPHERE_IN;
+ lc->anim_pause = pause2 * (1 + frand(1) + frand(1));
+ }
+ }
+ break;
+
+ case LAMENT_SPHERE_IN:
+ {
+ lc->anim_y -= 0.01 * speed;
+ if (lc->anim_y <= 0)
+ {
+ lc->anim_y = 0;
+ lc->type = LAMENT_BOX;
+ lc->anim_pause = pause;
+ }
+ }
+ break;
+
+ /* -------------------------------------------------------------- */
+
+ case LAMENT_LEVIATHAN_SPIN:
+ lc->anim_r += 3.5 * speed;
+ if (lc->anim_r >= 360 * 3)
+ {
+ lc->anim_r = 0;
+ lc->type = LAMENT_LEVIATHAN_FADE;
+ lc->anim_pause = 0;
+ }
+ break;
+
+ case LAMENT_LEVIATHAN_FADE:
+ lc->anim_z += 0.01 * speed;
+ if (lc->anim_z >= 1)
+ {
+ lc->anim_z = 1;
+ lc->type = LAMENT_LEVIATHAN_TWIST;
+ lc->anim_pause = 0;
+ }
+ break;
+
+ case LAMENT_LEVIATHAN_TWIST:
+ lc->anim_y += 2 * speed;
+ lc->anim_z = 1;
+ if (lc->anim_y >= 180)
+ {
+ lc->anim_y = 0;
+ lc->type = LAMENT_LEVIATHAN_COLLAPSE;
+ lc->anim_pause = 0;
+ }
+ break;
+
+ case LAMENT_LEVIATHAN_COLLAPSE:
+ lc->anim_y += 0.01 * speed;
+ if (lc->anim_y >= 1)
+ {
+ lc->anim_y = 1.0;
+ lc->type = LAMENT_LEVIATHAN_EXPAND;
+ lc->anim_pause = pause2 * 4;
+ }
+ break;
+
+ case LAMENT_LEVIATHAN_EXPAND:
+ lc->anim_y -= 0.005 * speed;
+ if (lc->anim_y <= 0)
+ {
+ lc->anim_y = 180;
+ lc->type = LAMENT_LEVIATHAN_UNTWIST;
+ }
+ break;
+
+ case LAMENT_LEVIATHAN_UNTWIST:
+ lc->anim_y -= 2 * speed;
+ lc->anim_z = 1;
+ if (lc->anim_y <= 0)
+ {
+ lc->anim_y = 0;
+ lc->type = LAMENT_LEVIATHAN_UNFADE;
+ lc->anim_pause = 0;
+ }
+ break;
+
+ case LAMENT_LEVIATHAN_UNFADE:
+ lc->anim_z -= 0.1 * speed;
+ if (lc->anim_z <= 0)
+ {
+ lc->anim_z = 0;
+ lc->type = LAMENT_LEVIATHAN_UNSPIN;
+ lc->anim_pause = 0;
+ }
+ break;
+
+ case LAMENT_LEVIATHAN_UNSPIN:
+ lc->anim_r += 3.5 * speed;
+ if (lc->anim_r >= 360 * 2)
+ {
+ lc->anim_r = 0;
+ lc->type = LAMENT_BOX;
+ lc->anim_pause = pause2;
+ }
+ break;
+
+ default:
+ abort();
+ break;
+ }
+
+# ifdef DEBUG_MODE
+
+ lc->anim_pause = 0;
+
+ if (lc->type == LAMENT_BOX)
+ lc->type = DEBUG_MODE;
+
+ if (lc->ffwdp)
+ {
+ lc->ffwdp = 0;
+ while (lc->type != DEBUG_MODE)
+ animate (mi);
+ }
+
+# else /* !DEBUG_MODE */
+
+ if (lc->ffwdp && lc->type == LAMENT_BOX)
+ {
+ lc->ffwdp = 0;
+ while (lc->type == LAMENT_BOX)
+ animate (mi);
+ lc->anim_pause = 0;
+ }
+
+# endif /* !DEBUG_MODE */
+}
+
+
+static void
+gl_init (ModeInfo *mi)
+{
+ lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+ Bool wire = MI_IS_WIREFRAME(mi);
+ int i;
+
+ if (wire)
+ do_texture = False;
+
+ if (!wire)
+ {
+ static const GLfloat pos0[] = { -4.0, 2.0, 5.0, 1.0 };
+ static const GLfloat pos1[] = { 6.0, -1.0, 3.0, 1.0 };
+
+ static const GLfloat amb0[] = { 0.7, 0.7, 0.7, 1.0 };
+/* static const GLfloat amb1[] = { 0.7, 0.0, 0.0, 1.0 }; */
+ static const GLfloat dif0[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat dif1[] = { 0.3, 0.1, 0.1, 1.0 };
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos0);
+ glLightfv(GL_LIGHT1, GL_POSITION, pos1);
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb0);
+/* glLightfv(GL_LIGHT1, GL_AMBIENT, amb1); */
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif0);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, dif1);
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+/* glEnable(GL_LIGHT1); */
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+ }
+
+ if (do_texture)
+ {
+ int i;
+ for (i = 0; i < countof(lc->texids); i++)
+ glGenTextures(1, &lc->texids[i]);
+
+ lc->texture = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
+ lament512_png, sizeof(lament512_png));
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+ /* messes up -fps */
+ /* glPixelStorei(GL_UNPACK_ROW_LENGTH, lc->texture->width); */
+
+ for (i = 0; i < countof(lc->texids); i++)
+ {
+ int height = lc->texture->width; /* assume square */
+ glBindTexture(GL_TEXTURE_2D, lc->texids[i]);
+
+ clear_gl_error();
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ lc->texture->width, height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE,
+ (lc->texture->data +
+ (lc->texture->bytes_per_line * height * i)));
+ check_gl_error("texture");
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ check_gl_error("texture");
+
+ /* This makes scaled pixmaps tolerable to look at. */
+# if !defined(GL_TEXTURE_LOD_BIAS) && defined(GL_TEXTURE_LOD_BIAS_EXT)
+# define GL_TEXTURE_LOD_BIAS GL_TEXTURE_LOD_BIAS_EXT
+# endif
+# ifdef GL_TEXTURE_LOD_BIAS
+ glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, 0.25);
+# endif
+ clear_gl_error(); /* invalid enum on iPad 3 */
+ }
+ }
+
+ for (i = 0; i < countof(all_objs); i++)
+ {
+ GLfloat s = 1/3.0; /* box is 3" square */
+ const struct gllist *L = *all_objs[i];
+ const GLfloat *f = (const GLfloat *) L->data;
+ int j;
+
+ lc->dlists[i] = glGenLists(1);
+ lc->polys[i] = L->points / 3;
+ glNewList(lc->dlists[i], GL_COMPILE);
+ if (L->primitive != GL_TRIANGLES) abort();
+ if (L->format != GL_N3F_V3F) abort();
+
+ glPushMatrix();
+ glTranslatef (-0.5, -0.5, -0.5);
+ glScalef (s, s, s);
+
+ for (j = 0; j < L->points; j += 3)
+ {
+ int face, outerp;
+ Bool blackp = (i == OBJ_ISO_BASE_A || i == OBJ_ISO_BASE_B);
+ which_face (mi, f, &face, &outerp); /* from norm of first vert */
+
+ set_colors (outerp ? exterior_color :
+ blackp ? black_color : interior_color);
+ glBindTexture (GL_TEXTURE_2D,
+ (outerp ? lc->texids[face-1] :
+ blackp ? 0 : lc->texids[6]));
+
+ glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+ if (face) texturize_vert (mi, face, f+3);
+ glNormal3fv (f); f += 3; glVertex3fv (f); f += 3;
+ if (face) texturize_vert (mi, face, f+3);
+ glNormal3fv (f); f += 3; glVertex3fv (f); f += 3;
+ if (face) texturize_vert (mi, face, f+3);
+ glNormal3fv (f); f += 3; glVertex3fv (f); f += 3;
+ glEnd();
+ }
+ glPopMatrix();
+
+ glEndList();
+ }
+}
+
+
+ENTRYPOINT Bool
+lament_handle_event (ModeInfo *mi, XEvent *event)
+{
+ lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, lc->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &lc->button_down_p))
+ return True;
+ else if (event->xany.type == KeyPress)
+ {
+ KeySym keysym;
+ char c = 0;
+ XLookupString (&event->xkey, &c, 1, &keysym, 0);
+ if (c == ' ' || c == '\t')
+ {
+ lc->ffwdp = True;
+ return True;
+ }
+ }
+
+ return False;
+}
+
+
+ENTRYPOINT void
+reshape_lament (ModeInfo *mi, int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ glViewport(0, 0, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.0, 0.0, -40.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+ENTRYPOINT void
+init_lament (ModeInfo *mi)
+{
+ lament_configuration *lc;
+ int i;
+ MI_INIT (mi, lcs);
+
+ lc = &lcs[MI_SCREEN(mi)];
+
+ {
+ double rot_speed = 0.5;
+ lc->rot = make_rotator (rot_speed, rot_speed, rot_speed, 1, 0, True);
+ lc->trackball = gltrackball_init (True);
+ }
+
+ lc->type = LAMENT_BOX;
+ lc->anim_pause = 300 + (random() % 100);
+
+ if ((lc->glx_context = init_GL(mi)) != NULL)
+ {
+ reshape_lament(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ gl_init(mi);
+ }
+
+ lc->states = (lament_type *) calloc (200, sizeof (*lc->states));
+ lc->nstates = 0;
+
+# define PUSH(N,WHICH) \
+ for (i = 0; i < N; i++) lc->states[lc->nstates++] = WHICH
+
+ PUSH (4, LAMENT_TETRA_UNE); /* most common */
+ PUSH (4, LAMENT_TETRA_USW);
+ PUSH (4, LAMENT_TETRA_DWN);
+ PUSH (4, LAMENT_TETRA_DSE);
+
+ PUSH (8, LAMENT_STAR_OUT); /* pretty common */
+ PUSH (8, LAMENT_TASER_OUT);
+ PUSH (8, LAMENT_PILLAR_OUT);
+
+ PUSH (4, LAMENT_LID_OPEN); /* rare */
+ PUSH (2, LAMENT_SPHERE_OUT); /* rare */
+ PUSH (1, LAMENT_LEVIATHAN_SPIN); /* very rare */
+
+ PUSH (35, LAMENT_BOX); /* rest state */
+# undef PUSH
+
+ shuffle_states (lc);
+
+# ifdef DEBUG_MODE
+ lc->type = DEBUG_MODE;
+ lc->anim_pause = 0;
+# endif
+
+}
+
+
+ENTRYPOINT void
+draw_lament (ModeInfo *mi)
+{
+ lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+ Display *dpy = MI_DISPLAY(mi);
+ Window window = MI_WINDOW(mi);
+
+ if (!lc->glx_context)
+ return;
+
+ glDrawBuffer(GL_BACK);
+
+ glXMakeCurrent(dpy, window, *(lc->glx_context));
+ draw(mi);
+ if (mi->fps_p) do_fps (mi);
+
+ glFinish();
+ glXSwapBuffers(dpy, window);
+
+ if (!lc->ffwdp && lc->anim_pause)
+ lc->anim_pause--;
+ else
+ animate(mi);
+}
+
+XSCREENSAVER_MODULE ("Lament", lament)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/lament.dxf b/hacks/glx/lament.dxf
new file mode 100644
index 0000000..d23108c
--- /dev/null
+++ b/hacks/glx/lament.dxf
@@ -0,0 +1,163404 @@
+ 0
+SECTION
+ 2
+ENTITIES
+ 0
+3DFACE
+ 8
+tetra_une
+10
+3.0
+20
+3.0
+30
+0.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+3.0
+32
+0.205
+13
+3.0
+23
+3.0
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+tetra_une
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+0.205
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+tetra_une
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+3.0
+20
+0.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+0.205
+20
+3.0
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+1.5
+22
+3.0
+32
+3.0
+13
+1.5
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+tetra_une
+10
+1.5
+20
+3.0
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+tetra_une
+10
+2.795
+20
+3.0
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+3.0
+32
+3.0
+13
+3.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+2.795
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+0.205
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+tetra_une
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+tetra_une
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.795
+21
+3.0
+31
+0.205
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+2.795
+20
+3.0
+30
+0.205
+11
+3.0
+21
+0.0
+31
+3.0
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+3
+ 0
+3DFACE
+ 8
+tetra_une
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+3.0
+21
+0.0
+31
+3.0
+12
+0.8525
+22
+3.0
+32
+2.1475
+13
+0.8525
+23
+3.0
+33
+2.1475
+70
+3
+ 0
+3DFACE
+ 8
+tetra_une
+10
+0.8525
+20
+3.0
+30
+2.1475
+11
+3.0
+21
+0.0
+31
+3.0
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+tetra_une
+10
+0.205
+20
+3.0
+30
+2.795
+11
+3.0
+21
+0.0
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+2.795
+20
+3.0
+30
+2.795
+11
+3.0
+21
+3.0
+31
+1.5
+12
+2.795
+22
+3.0
+32
+1.5
+13
+2.795
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+3.0
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+2.795
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+2.795
+20
+3.0
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+3.0
+20
+3.0
+30
+0.205
+11
+2.795
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+tetra_une
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+tetra_une
+10
+0.205
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+3.0
+12
+1.5
+22
+3.0
+32
+3.0
+13
+1.5
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+0.8525
+20
+3.0
+30
+2.1475
+11
+2.795
+21
+3.0
+31
+1.5
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+2.795
+20
+3.0
+30
+1.5
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+2.795
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+2.795
+12
+2.795
+22
+3.0
+32
+2.795
+13
+2.795
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+3.0
+20
+3.0
+30
+2.795
+11
+2.795
+21
+3.0
+31
+3.0
+12
+3.0
+22
+3.0
+32
+3.0
+13
+3.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.795
+21
+3.0
+31
+1.5
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+tetra_une
+10
+1.5
+20
+3.0
+30
+3.0
+11
+2.795
+21
+3.0
+31
+2.795
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_une
+10
+2.795
+20
+3.0
+30
+2.795
+11
+1.5
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+2.1475
+20
+0.0
+30
+2.1475
+11
+0.205
+21
+0.0
+31
+1.5
+12
+0.8525
+22
+0.0
+32
+0.8525
+13
+0.8525
+23
+0.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.205
+20
+0.0
+30
+1.5
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.205
+20
+0.0
+30
+3.0
+11
+0.0
+21
+3.0
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.205
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+3.0
+20
+0.0
+30
+3.0
+11
+0.205
+21
+0.0
+31
+3.0
+12
+1.5
+22
+0.0
+32
+3.0
+13
+1.5
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+3.0
+20
+0.0
+30
+3.0
+11
+1.5
+21
+0.0
+31
+3.0
+12
+2.795
+22
+0.0
+32
+3.0
+13
+2.795
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.0
+21
+0.0
+31
+2.795
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.0
+20
+0.0
+30
+2.795
+11
+0.0
+21
+3.0
+31
+3.0
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.0
+20
+0.0
+30
+1.5
+11
+0.0
+21
+3.0
+31
+3.0
+12
+0.0
+22
+0.0
+32
+0.205
+13
+0.0
+23
+0.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+3.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.205
+21
+0.0
+31
+0.205
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.205
+20
+0.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+3.0
+12
+0.8525
+22
+0.0
+32
+0.8525
+13
+0.8525
+23
+0.0
+33
+0.8525
+70
+3
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.8525
+20
+0.0
+30
+0.8525
+11
+0.0
+21
+3.0
+31
+3.0
+12
+2.1475
+22
+0.0
+32
+2.1475
+13
+2.1475
+23
+0.0
+33
+2.1475
+70
+3
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+2.1475
+20
+0.0
+30
+2.1475
+11
+0.0
+21
+3.0
+31
+3.0
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+2.795
+20
+0.0
+30
+2.795
+11
+0.0
+21
+3.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.205
+20
+0.0
+30
+1.5
+11
+0.205
+21
+0.0
+31
+0.205
+12
+0.8525
+22
+0.0
+32
+0.8525
+13
+0.8525
+23
+0.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+2.795
+20
+0.0
+30
+3.0
+11
+1.5
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.795
+21
+0.0
+31
+3.0
+12
+1.5
+22
+0.0
+32
+3.0
+13
+1.5
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.205
+20
+0.0
+30
+3.0
+11
+0.0
+21
+0.0
+31
+2.795
+12
+0.205
+22
+0.0
+32
+2.795
+13
+0.205
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.0
+20
+0.0
+30
+2.795
+11
+0.205
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.0
+21
+0.0
+31
+1.5
+12
+0.205
+22
+0.0
+32
+1.5
+13
+0.205
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.0
+20
+0.0
+30
+1.5
+11
+0.205
+21
+0.0
+31
+2.795
+12
+0.0
+22
+0.0
+32
+2.795
+13
+0.0
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+1.5
+20
+0.0
+30
+3.0
+11
+0.205
+21
+0.0
+31
+2.795
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.205
+20
+0.0
+30
+2.795
+11
+1.5
+21
+0.0
+31
+3.0
+12
+0.205
+22
+0.0
+32
+3.0
+13
+0.205
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.205
+20
+0.0
+30
+1.5
+11
+0.0
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.205
+21
+0.0
+31
+1.5
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.205
+21
+0.0
+31
+1.5
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+tetra_usw
+10
+2.795
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+2.795
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.0
+21
+3.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+3.0
+31
+3.0
+12
+0.0
+22
+3.0
+32
+2.795
+13
+0.0
+23
+3.0
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.205
+20
+3.0
+30
+0.0
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+0.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.0
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+3.0
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+3.0
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+2.795
+20
+3.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+0.0
+30
+0.0
+11
+2.795
+21
+3.0
+31
+0.205
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+3.0
+30
+3.0
+11
+2.795
+21
+3.0
+31
+0.205
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+13
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+3.0
+30
+3.0
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+0.8525
+22
+3.0
+32
+2.1475
+13
+0.8525
+23
+3.0
+33
+2.1475
+70
+13
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.205
+20
+3.0
+30
+1.5
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+0.205
+21
+3.0
+31
+1.5
+12
+0.8525
+22
+3.0
+32
+2.1475
+13
+0.8525
+23
+3.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+3.0
+30
+0.205
+11
+0.205
+21
+3.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.205
+20
+3.0
+30
+0.0
+11
+0.0
+21
+3.0
+31
+0.205
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+2.795
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+1.5
+20
+3.0
+30
+0.205
+11
+2.795
+21
+3.0
+31
+0.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+2.795
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.205
+20
+3.0
+30
+2.795
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+2.795
+13
+0.0
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.205
+20
+3.0
+30
+0.205
+11
+1.5
+21
+3.0
+31
+0.0
+12
+0.205
+22
+3.0
+32
+0.0
+13
+0.205
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+1.5
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dwn
+10
+0.205
+20
+3.0
+30
+1.5
+11
+1.5
+21
+3.0
+31
+0.205
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+2.795
+20
+0.0
+30
+1.5
+11
+0.8525
+21
+0.0
+31
+0.8525
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+0.8525
+20
+0.0
+30
+0.8525
+11
+2.795
+21
+0.0
+31
+1.5
+12
+2.1475
+22
+0.0
+32
+2.1475
+13
+2.1475
+23
+0.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+3.0
+20
+3.0
+30
+0.0
+11
+0.205
+21
+0.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+0.205
+20
+0.0
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+1.5
+22
+0.0
+32
+0.0
+13
+1.5
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+1.5
+20
+0.0
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+0.0
+32
+0.0
+13
+2.795
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+2.795
+20
+0.0
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+3.0
+20
+3.0
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+3.0
+20
+0.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+3.0
+20
+0.0
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+3.0
+20
+0.0
+30
+2.795
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+2.795
+20
+0.0
+30
+2.795
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.1475
+22
+0.0
+32
+2.1475
+13
+2.1475
+23
+0.0
+33
+2.1475
+70
+3
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+2.1475
+20
+0.0
+30
+2.1475
+11
+3.0
+21
+3.0
+31
+0.0
+12
+0.8525
+22
+0.0
+32
+0.8525
+13
+0.8525
+23
+0.0
+33
+0.8525
+70
+3
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+0.8525
+20
+0.0
+30
+0.8525
+11
+3.0
+21
+3.0
+31
+0.0
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+0.205
+20
+0.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+LINE
+ 8
+tetra_dse
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.0
+21
+0.0
+31
+2.795
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+0.205
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.205
+22
+0.0
+32
+0.0
+13
+0.205
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+2.795
+20
+0.0
+30
+2.795
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+0.8525
+20
+0.0
+30
+0.8525
+11
+0.205
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+3.0
+20
+0.0
+30
+0.205
+11
+2.795
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+2.795
+20
+0.0
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.205
+12
+2.795
+22
+0.0
+32
+0.205
+13
+2.795
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+1.5
+20
+0.0
+30
+0.205
+11
+0.205
+21
+0.0
+31
+0.0
+12
+1.5
+22
+0.0
+32
+0.0
+13
+1.5
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+0.205
+20
+0.0
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+3.0
+20
+0.0
+30
+2.795
+11
+2.795
+21
+0.0
+31
+1.5
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+2.795
+20
+0.0
+30
+1.5
+11
+3.0
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+2.795
+20
+0.0
+30
+0.205
+11
+1.5
+21
+0.0
+31
+0.0
+12
+2.795
+22
+0.0
+32
+0.0
+13
+2.795
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+1.5
+20
+0.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+3.0
+20
+0.0
+30
+1.5
+11
+2.795
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+2.795
+20
+0.0
+30
+0.205
+11
+3.0
+21
+0.0
+31
+1.5
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+tetra_dse
+10
+2.795
+20
+0.0
+30
+1.5
+11
+1.5
+21
+0.0
+31
+0.205
+12
+2.795
+22
+0.0
+32
+0.205
+13
+2.795
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+tetra_base
+10
+0.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+tetra_base
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.0
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+tetra_base
+10
+3.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+tetra_base
+10
+3.0
+20
+3.0
+30
+0.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+2.26629223953759
+21
+1.42452680194624
+31
+3.0
+12
+2.25520466591049
+22
+1.34978045204758
+32
+3.0
+13
+2.25520466591049
+23
+1.34978045204758
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.26629223953759
+20
+1.42452680194624
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+3.0
+12
+2.27
+22
+1.5
+32
+3.0
+13
+2.27
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.27
+20
+1.5
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+3.0
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.73
+20
+1.5
+30
+3.0
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.73
+21
+1.5
+31
+3.0
+12
+0.733707760462408
+22
+1.57547319805376
+32
+3.0
+13
+0.733707760462408
+23
+1.57547319805376
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.733707760462408
+21
+1.57547319805376
+31
+3.0
+12
+0.744795334089513
+22
+1.65021954795242
+32
+3.0
+13
+0.744795334089513
+23
+1.65021954795242
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.50226795687895
+20
+0.0
+30
+3.0
+11
+1.98848282880601
+21
+0.904781950910693
+31
+3.0
+12
+1.92778907942509
+22
+0.85976839852704
+32
+3.0
+13
+1.92778907942509
+23
+0.85976839852704
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.98848282880601
+20
+0.904781950910693
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.04447222151364
+22
+0.955527778486358
+32
+3.0
+13
+2.04447222151364
+23
+0.955527778486358
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+0.955527778486358
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.795
+22
+0.0
+32
+3.0
+13
+2.795
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+0.955527778486358
+30
+3.0
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.955527778486358
+21
+0.955527778486358
+31
+3.0
+12
+0.904781950910692
+22
+1.01151717119399
+32
+3.0
+13
+0.904781950910692
+23
+1.01151717119399
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.904781950910692
+21
+1.01151717119399
+31
+3.0
+12
+0.85976839852704
+22
+1.07221092057491
+32
+3.0
+13
+0.85976839852704
+23
+1.07221092057491
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.57547319805376
+20
+2.26629223953759
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.5
+22
+2.27
+32
+3.0
+13
+1.5
+23
+2.27
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.57547319805376
+21
+2.26629223953759
+31
+3.0
+12
+1.79836855106949
+22
+3.0
+32
+3.0
+13
+1.79836855106949
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.57547319805376
+21
+2.26629223953759
+31
+3.0
+12
+1.65021954795242
+22
+2.25520466591049
+32
+3.0
+13
+1.65021954795242
+23
+2.25520466591049
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.09521804908931
+20
+1.98848282880601
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.04447222151364
+22
+2.04447222151364
+32
+3.0
+13
+2.04447222151364
+23
+2.04447222151364
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.09521804908931
+21
+1.98848282880601
+31
+3.0
+12
+2.14023160147296
+22
+1.92778907942509
+32
+3.0
+13
+2.14023160147296
+23
+1.92778907942509
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.14023160147296
+21
+1.92778907942509
+31
+3.0
+12
+3.0
+22
+2.50226795687895
+32
+3.0
+13
+3.0
+23
+2.50226795687895
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+2.795
+13
+0.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.205
+20
+3.0
+30
+2.795
+11
+0.0
+21
+3.0
+31
+3.0
+12
+0.205
+22
+3.0
+32
+3.0
+13
+0.205
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+2.17367965644036
+11
+2.12132034355964
+21
+0.0
+31
+0.826320343559644
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+3.0
+21
+2.12132034355964
+31
+3.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+3.0
+13
+3.0
+23
+2.50226795687895
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+3.0
+32
+3.0
+13
+3.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.2368440585138
+20
+1.27648079851406
+30
+0.0
+11
+3.0
+21
+0.878679656440358
+31
+0.0
+12
+2.21138724003369
+22
+1.20533375707888
+32
+0.0
+13
+2.21138724003369
+23
+1.20533375707888
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.878679656440358
+30
+0.0
+11
+2.2368440585138
+21
+1.27648079851406
+31
+0.0
+12
+2.25520466591049
+22
+1.34978045204758
+32
+0.0
+13
+2.25520466591049
+23
+1.34978045204758
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.878679656440358
+30
+0.0
+11
+2.25520466591049
+21
+1.34978045204758
+31
+0.0
+12
+3.0
+22
+1.20163144893051
+32
+0.0
+13
+3.0
+23
+1.20163144893051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.0
+30
+0.0
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+0.0
+22
+0.497732043121051
+32
+0.0
+13
+0.0
+23
+0.497732043121051
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+-4.44089209850063e-16
+22
+0.878679656440356
+32
+3.0
+13
+-4.44089209850063e-16
+23
+0.878679656440356
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+-4.44089209850063e-16
+21
+0.878679656440356
+31
+3.0
+12
+0.0
+22
+0.878679656440356
+32
+0.0
+13
+0.0
+23
+0.878679656440356
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+2.04447222151364
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.955527778486358
+21
+2.04447222151364
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.497732043121052
+20
+3.0
+30
+3.0
+11
+0.955527778486358
+21
+2.04447222151364
+31
+3.0
+12
+1.01151717119399
+22
+2.09521804908931
+32
+3.0
+13
+1.01151717119399
+23
+2.09521804908931
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.497732043121052
+20
+3.0
+30
+3.0
+11
+1.01151717119399
+21
+2.09521804908931
+31
+3.0
+12
+1.07221092057491
+22
+2.14023160147296
+32
+3.0
+13
+1.07221092057491
+23
+2.14023160147296
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.0
+30
+3.0
+11
+1.34978045204758
+21
+0.744795334089513
+31
+3.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+3.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.34978045204758
+20
+0.744795334089513
+30
+3.0
+11
+1.5
+21
+0.0
+31
+3.0
+12
+1.42452680194624
+22
+0.733707760462408
+32
+3.0
+13
+1.42452680194624
+23
+0.733707760462408
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.42452680194624
+20
+0.733707760462408
+30
+3.0
+11
+1.5
+21
+0.0
+31
+3.0
+12
+1.5
+22
+0.73
+32
+3.0
+13
+1.5
+23
+0.73
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.20533375707888
+30
+0.0
+11
+0.0
+21
+0.497732043121051
+31
+0.0
+12
+0.0
+22
+0.878679656440356
+32
+0.0
+13
+0.0
+23
+0.878679656440356
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.788612759966309
+21
+1.20533375707888
+31
+0.0
+12
+0.820920626451767
+22
+1.13702451264398
+32
+0.0
+13
+0.820920626451767
+23
+1.13702451264398
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.820920626451767
+21
+1.13702451264398
+31
+0.0
+12
+0.85976839852704
+22
+1.07221092057491
+32
+0.0
+13
+0.85976839852704
+23
+1.07221092057491
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.07221092057491
+20
+0.85976839852704
+30
+3.0
+11
+1.01151717119399
+21
+0.904781950910692
+31
+1.5
+12
+1.07221092057491
+22
+0.85976839852704
+32
+1.5
+13
+1.07221092057491
+23
+0.85976839852704
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.01151717119399
+20
+0.904781950910692
+30
+1.5
+11
+1.07221092057491
+21
+0.85976839852704
+31
+3.0
+12
+1.01151717119399
+22
+0.904781950910692
+32
+3.0
+13
+1.01151717119399
+23
+0.904781950910692
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+2.17907937354823
+21
+1.86297548735602
+31
+0.0
+12
+2.14023160147296
+22
+1.92778907942509
+32
+0.0
+13
+2.14023160147296
+23
+1.92778907942509
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.17907937354823
+20
+1.86297548735602
+30
+0.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+2.21138724003369
+22
+1.79466624292112
+32
+0.0
+13
+2.21138724003369
+23
+1.79466624292112
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+0.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.5
+21
+2.27
+31
+1.5
+12
+1.5
+22
+2.27
+32
+3.0
+13
+1.5
+23
+2.27
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+2.27
+30
+1.5
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.5
+22
+2.27
+32
+0.0
+13
+1.5
+23
+2.27
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+2.27
+30
+0.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+2.795
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.27
+20
+1.5
+30
+1.5
+11
+2.26629223953759
+21
+1.42452680194624
+31
+0.0
+12
+2.26629223953759
+22
+1.42452680194624
+32
+1.5
+13
+2.26629223953759
+23
+1.42452680194624
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.26629223953759
+20
+1.42452680194624
+30
+0.0
+11
+2.27
+21
+1.5
+31
+1.5
+12
+2.27
+22
+1.5
+32
+0.0
+13
+2.27
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.2368440585138
+20
+1.27648079851406
+30
+1.5
+11
+2.21138724003369
+21
+1.20533375707888
+31
+0.0
+12
+2.21138724003369
+22
+1.20533375707888
+32
+1.5
+13
+2.21138724003369
+23
+1.20533375707888
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.20533375707888
+30
+0.0
+11
+2.2368440585138
+21
+1.27648079851406
+31
+1.5
+12
+2.2368440585138
+22
+1.27648079851406
+32
+0.0
+13
+2.2368440585138
+23
+1.27648079851406
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+0.788612759966309
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+2.795
+12
+2.12132034355964
+22
+0.0
+32
+3.0
+13
+2.12132034355964
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+2.795
+11
+1.79466624292112
+21
+0.788612759966309
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+2.17367965644036
+13
+2.12132034355964
+23
+0.0
+33
+2.17367965644036
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+2.17367965644036
+11
+1.79466624292112
+21
+0.788612759966309
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+0.826320343559644
+13
+2.12132034355964
+23
+0.0
+33
+0.826320343559644
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+0.826320343559644
+11
+1.79466624292112
+21
+0.788612759966309
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+0.205
+13
+2.12132034355964
+23
+0.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+0.205
+11
+1.79466624292112
+21
+0.788612759966309
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+0.0
+13
+2.12132034355964
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+0.0
+11
+1.79466624292112
+21
+0.788612759966309
+31
+3.0
+12
+1.79466624292112
+22
+0.788612759966309
+32
+0.0
+13
+1.79466624292112
+23
+0.788612759966309
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+0.788612759966309
+30
+0.0
+11
+1.79466624292112
+21
+0.788612759966309
+31
+3.0
+12
+1.79466624292112
+22
+0.788612759966309
+32
+1.5
+13
+1.79466624292112
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.01151717119399
+20
+0.904781950910692
+30
+3.0
+11
+0.955527778486358
+21
+0.955527778486358
+31
+1.5
+12
+1.01151717119399
+22
+0.904781950910692
+32
+1.5
+13
+1.01151717119399
+23
+0.904781950910692
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+0.955527778486358
+30
+1.5
+11
+1.01151717119399
+21
+0.904781950910692
+31
+3.0
+12
+0.955527778486358
+22
+0.955527778486358
+32
+3.0
+13
+0.955527778486358
+23
+0.955527778486358
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.17907937354823
+20
+1.13702451264398
+30
+1.5
+11
+2.14023160147296
+21
+1.07221092057491
+31
+3.0
+12
+2.14023160147296
+22
+1.07221092057491
+32
+1.5
+13
+2.14023160147296
+23
+1.07221092057491
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.14023160147296
+20
+1.07221092057491
+30
+3.0
+11
+2.17907937354823
+21
+1.13702451264398
+31
+1.5
+12
+2.17907937354823
+22
+1.13702451264398
+32
+3.0
+13
+2.17907937354823
+23
+1.13702451264398
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.79466624292112
+21
+2.21138724003369
+31
+1.5
+12
+1.79466624292112
+22
+2.21138724003369
+32
+0.0
+13
+1.79466624292112
+23
+2.21138724003369
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+2.21138724003369
+30
+1.5
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+1.79466624292112
+22
+2.21138724003369
+32
+3.0
+13
+1.79466624292112
+23
+2.21138724003369
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+2.21138724003369
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+2.12132034355964
+22
+3.0
+32
+0.205
+13
+2.12132034355964
+23
+3.0
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+0.205
+12
+2.12132034355964
+22
+3.0
+32
+0.826320343559643
+13
+2.12132034355964
+23
+3.0
+33
+0.826320343559643
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+0.826320343559643
+12
+2.12132034355964
+22
+3.0
+32
+2.17367965644036
+13
+2.12132034355964
+23
+3.0
+33
+2.17367965644036
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+2.17367965644036
+12
+2.12132034355964
+22
+3.0
+32
+2.795
+13
+2.12132034355964
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+2.09521804908931
+21
+1.98848282880601
+31
+0.0
+12
+2.09521804908931
+22
+1.98848282880601
+32
+1.5
+13
+2.09521804908931
+23
+1.98848282880601
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.09521804908931
+20
+1.98848282880601
+30
+0.0
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+2.04447222151364
+22
+2.04447222151364
+32
+0.0
+13
+2.04447222151364
+23
+2.04447222151364
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+2.21138724003369
+30
+3.0
+11
+1.27648079851406
+21
+2.2368440585138
+31
+1.5
+12
+1.20533375707888
+22
+2.21138724003369
+32
+1.5
+13
+1.20533375707888
+23
+2.21138724003369
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.27648079851406
+20
+2.2368440585138
+30
+1.5
+11
+1.20533375707888
+21
+2.21138724003369
+31
+3.0
+12
+1.27648079851406
+22
+2.2368440585138
+32
+3.0
+13
+1.27648079851406
+23
+2.2368440585138
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+2.2368440585138
+21
+1.72351920148594
+31
+3.0
+12
+2.2368440585138
+22
+1.72351920148594
+32
+1.5
+13
+2.2368440585138
+23
+1.72351920148594
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.2368440585138
+20
+1.72351920148594
+30
+3.0
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+2.21138724003369
+22
+1.79466624292112
+32
+3.0
+13
+2.21138724003369
+23
+1.79466624292112
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.57547319805376
+20
+0.733707760462408
+30
+3.0
+11
+1.5
+21
+0.73
+31
+1.5
+12
+1.57547319805376
+22
+0.733707760462408
+32
+1.5
+13
+1.57547319805376
+23
+0.733707760462408
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.73
+30
+1.5
+11
+1.57547319805376
+21
+0.733707760462408
+31
+3.0
+12
+1.5
+22
+0.73
+32
+3.0
+13
+1.5
+23
+0.73
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+3.0
+21
+0.0
+31
+0.0
+12
+2.04447222151364
+22
+0.955527778486358
+32
+0.0
+13
+2.04447222151364
+23
+0.955527778486358
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.0
+30
+0.0
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.0
+30
+0.205
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.0
+30
+1.5
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+2.04447222151364
+22
+0.955527778486358
+32
+3.0
+13
+2.04447222151364
+23
+0.955527778486358
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.0
+30
+1.5
+11
+2.04447222151364
+21
+0.955527778486358
+31
+3.0
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.0
+30
+2.795
+11
+2.04447222151364
+21
+0.955527778486358
+31
+3.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.09521804908931
+20
+1.98848282880601
+30
+1.5
+11
+2.14023160147296
+21
+1.92778907942509
+31
+0.0
+12
+2.14023160147296
+22
+1.92778907942509
+32
+1.5
+13
+2.14023160147296
+23
+1.92778907942509
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.14023160147296
+20
+1.92778907942509
+30
+0.0
+11
+2.09521804908931
+21
+1.98848282880601
+31
+1.5
+12
+2.09521804908931
+22
+1.98848282880601
+32
+0.0
+13
+2.09521804908931
+23
+1.98848282880601
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.25520466591049
+20
+1.65021954795242
+30
+1.5
+11
+2.26629223953759
+21
+1.57547319805376
+31
+3.0
+12
+2.26629223953759
+22
+1.57547319805376
+32
+1.5
+13
+2.26629223953759
+23
+1.57547319805376
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.26629223953759
+20
+1.57547319805376
+30
+3.0
+11
+2.25520466591049
+21
+1.65021954795242
+31
+1.5
+12
+2.25520466591049
+22
+1.65021954795242
+32
+3.0
+13
+2.25520466591049
+23
+1.65021954795242
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+0.788612759966309
+30
+1.5
+11
+1.27648079851406
+21
+0.763155941486199
+31
+0.0
+12
+1.20533375707888
+22
+0.788612759966309
+32
+0.0
+13
+1.20533375707888
+23
+0.788612759966309
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.27648079851406
+20
+0.763155941486199
+30
+0.0
+11
+1.20533375707888
+21
+0.788612759966309
+31
+1.5
+12
+1.27648079851406
+22
+0.763155941486199
+32
+1.5
+13
+1.27648079851406
+23
+0.763155941486199
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.65021954795242
+20
+2.25520466591049
+30
+1.5
+11
+1.57547319805376
+21
+2.26629223953759
+31
+0.0
+12
+1.65021954795242
+22
+2.25520466591049
+32
+0.0
+13
+1.65021954795242
+23
+2.25520466591049
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.57547319805376
+20
+2.26629223953759
+30
+0.0
+11
+1.65021954795242
+21
+2.25520466591049
+31
+1.5
+12
+1.57547319805376
+22
+2.26629223953759
+32
+1.5
+13
+1.57547319805376
+23
+2.26629223953759
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.72351920148594
+20
+2.2368440585138
+30
+1.5
+11
+1.65021954795242
+21
+2.25520466591049
+31
+0.0
+12
+1.72351920148594
+22
+2.2368440585138
+32
+0.0
+13
+1.72351920148594
+23
+2.2368440585138
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.65021954795242
+20
+2.25520466591049
+30
+0.0
+11
+1.72351920148594
+21
+2.2368440585138
+31
+1.5
+12
+1.65021954795242
+22
+2.25520466591049
+32
+1.5
+13
+1.65021954795242
+23
+2.25520466591049
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.57547319805376
+20
+2.26629223953759
+30
+1.5
+11
+1.5
+21
+2.27
+31
+0.0
+12
+1.57547319805376
+22
+2.26629223953759
+32
+0.0
+13
+1.57547319805376
+23
+2.26629223953759
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+2.27
+30
+0.0
+11
+1.57547319805376
+21
+2.26629223953759
+31
+1.5
+12
+1.5
+22
+2.27
+32
+1.5
+13
+1.5
+23
+2.27
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.904781950910692
+20
+1.01151717119399
+30
+0.0
+11
+0.955527778486358
+21
+0.955527778486358
+31
+1.5
+12
+0.955527778486358
+22
+0.955527778486358
+32
+0.0
+13
+0.955527778486358
+23
+0.955527778486358
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+0.955527778486358
+30
+1.5
+11
+0.904781950910692
+21
+1.01151717119399
+31
+0.0
+12
+0.904781950910692
+22
+1.01151717119399
+32
+1.5
+13
+0.904781950910692
+23
+1.01151717119399
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.820920626451767
+20
+1.86297548735602
+30
+3.0
+11
+0.788612759966309
+21
+1.79466624292112
+31
+1.5
+12
+0.788612759966309
+22
+1.79466624292112
+32
+3.0
+13
+0.788612759966309
+23
+1.79466624292112
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.79466624292112
+30
+1.5
+11
+0.820920626451767
+21
+1.86297548735602
+31
+3.0
+12
+0.820920626451767
+22
+1.86297548735602
+32
+1.5
+13
+0.820920626451767
+23
+1.86297548735602
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+1.79836855106949
+32
+0.0
+13
+0.0
+23
+1.79836855106949
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+-2.22044604925031e-16
+22
+2.12132034355964
+32
+3.0
+13
+-2.22044604925031e-16
+23
+2.12132034355964
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+-2.22044604925031e-16
+21
+2.12132034355964
+31
+3.0
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.72351920148594
+21
+2.2368440585138
+31
+0.0
+12
+1.65021954795242
+22
+2.25520466591049
+32
+0.0
+13
+1.65021954795242
+23
+2.25520466591049
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.72351920148594
+20
+2.2368440585138
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.79466624292112
+22
+2.21138724003369
+32
+0.0
+13
+1.79466624292112
+23
+2.21138724003369
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+2.21138724003369
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.86297548735602
+20
+0.820920626451767
+30
+0.0
+11
+2.12132034355964
+21
+0.0
+31
+0.0
+12
+1.79466624292112
+22
+0.788612759966309
+32
+0.0
+13
+1.79466624292112
+23
+0.788612759966309
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+0.0
+11
+1.86297548735602
+21
+0.820920626451767
+31
+0.0
+12
+1.92778907942509
+22
+0.85976839852704
+32
+0.0
+13
+1.92778907942509
+23
+0.85976839852704
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+0.0
+11
+1.92778907942509
+21
+0.85976839852704
+31
+0.0
+12
+2.50226795687895
+22
+0.0
+32
+0.0
+13
+2.50226795687895
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+-4.44089209850063e-16
+20
+0.878679656440356
+30
+3.0
+11
+0.788612759966309
+21
+1.20533375707888
+31
+0.0
+12
+0.0
+22
+0.878679656440356
+32
+0.0
+13
+0.0
+23
+0.878679656440356
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.20533375707888
+30
+0.0
+11
+-4.44089209850063e-16
+21
+0.878679656440356
+31
+3.0
+12
+0.788612759966309
+22
+1.20533375707888
+32
+1.5
+13
+0.788612759966309
+23
+1.20533375707888
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.20533375707888
+30
+1.5
+11
+-4.44089209850063e-16
+21
+0.878679656440356
+31
+3.0
+12
+0.788612759966309
+22
+1.20533375707888
+32
+3.0
+13
+0.788612759966309
+23
+1.20533375707888
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.73
+20
+1.5
+30
+1.5
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.73
+22
+1.5
+32
+0.0
+13
+0.73
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.73
+21
+1.5
+31
+1.5
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.73
+21
+1.5
+31
+1.5
+12
+0.73
+22
+1.5
+32
+3.0
+13
+0.73
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.04447222151364
+22
+2.04447222151364
+32
+0.0
+13
+2.04447222151364
+23
+2.04447222151364
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+3.0
+22
+3.0
+32
+3.0
+13
+3.0
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+2.04447222151364
+22
+2.04447222151364
+32
+3.0
+13
+2.04447222151364
+23
+2.04447222151364
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.878679656440358
+30
+3.0
+11
+2.21138724003369
+21
+1.20533375707888
+31
+0.0
+12
+3.0
+22
+0.878679656440358
+32
+0.0
+13
+3.0
+23
+0.878679656440358
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.20533375707888
+30
+0.0
+11
+3.0
+21
+0.878679656440358
+31
+3.0
+12
+2.21138724003369
+22
+1.20533375707888
+32
+1.5
+13
+2.21138724003369
+23
+1.20533375707888
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+3.0
+21
+0.878679656440358
+31
+3.0
+12
+2.21138724003369
+22
+1.20533375707888
+32
+3.0
+13
+2.21138724003369
+23
+1.20533375707888
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+0.788612759966309
+30
+3.0
+11
+1.13702451264398
+21
+0.820920626451767
+31
+1.5
+12
+1.20533375707888
+22
+0.788612759966309
+32
+1.5
+13
+1.20533375707888
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.13702451264398
+20
+0.820920626451767
+30
+1.5
+11
+1.20533375707888
+21
+0.788612759966309
+31
+3.0
+12
+1.13702451264398
+22
+0.820920626451767
+32
+3.0
+13
+1.13702451264398
+23
+0.820920626451767
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+0.0
+11
+1.20533375707888
+21
+2.21138724003369
+31
+1.5
+12
+1.20533375707888
+22
+2.21138724003369
+32
+0.0
+13
+1.20533375707888
+23
+2.21138724003369
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+2.21138724003369
+30
+1.5
+11
+0.878679656440356
+21
+3.0
+31
+0.0
+12
+1.20533375707888
+22
+2.21138724003369
+32
+3.0
+13
+1.20533375707888
+23
+2.21138724003369
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+2.21138724003369
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+0.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+0.0
+12
+0.878679656440356
+22
+3.0
+32
+0.205
+13
+0.878679656440356
+23
+3.0
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+0.205
+12
+0.878679656440356
+22
+3.0
+32
+0.826320343559644
+13
+0.878679656440356
+23
+3.0
+33
+0.826320343559644
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+0.826320343559644
+12
+0.878679656440356
+22
+3.0
+32
+2.17367965644036
+13
+0.878679656440356
+23
+3.0
+33
+2.17367965644036
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+2.17367965644036
+12
+0.878679656440356
+22
+3.0
+32
+2.795
+13
+0.878679656440356
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+2.04447222151364
+30
+3.0
+11
+0.904781950910692
+21
+1.98848282880601
+31
+1.5
+12
+0.904781950910692
+22
+1.98848282880601
+32
+3.0
+13
+0.904781950910692
+23
+1.98848282880601
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.904781950910692
+20
+1.98848282880601
+30
+1.5
+11
+0.955527778486358
+21
+2.04447222151364
+31
+3.0
+12
+0.955527778486358
+22
+2.04447222151364
+32
+1.5
+13
+0.955527778486358
+23
+2.04447222151364
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.733707760462408
+20
+1.42452680194624
+30
+3.0
+11
+0.744795334089513
+21
+1.34978045204758
+31
+1.5
+12
+0.744795334089513
+22
+1.34978045204758
+32
+3.0
+13
+0.744795334089513
+23
+1.34978045204758
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.744795334089513
+20
+1.34978045204758
+30
+1.5
+11
+0.733707760462408
+21
+1.42452680194624
+31
+3.0
+12
+0.733707760462408
+22
+1.42452680194624
+32
+1.5
+13
+0.733707760462408
+23
+1.42452680194624
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.955527778486358
+21
+2.04447222151364
+31
+1.5
+12
+0.955527778486358
+22
+2.04447222151364
+32
+3.0
+13
+0.955527778486358
+23
+2.04447222151364
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+2.04447222151364
+30
+1.5
+11
+0.0
+21
+3.0
+31
+3.0
+12
+0.955527778486358
+22
+2.04447222151364
+32
+0.0
+13
+0.955527778486358
+23
+2.04447222151364
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+2.04447222151364
+30
+0.0
+11
+0.0
+21
+3.0
+31
+3.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+3.0
+31
+3.0
+12
+0.0
+22
+3.0
+32
+2.795
+13
+0.0
+23
+3.0
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+2.09521804908931
+22
+1.98848282880601
+32
+1.5
+13
+2.09521804908931
+23
+1.98848282880601
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+2.09521804908931
+21
+1.98848282880601
+31
+1.5
+12
+2.14023160147296
+22
+1.92778907942509
+32
+1.5
+13
+2.14023160147296
+23
+1.92778907942509
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+2.14023160147296
+21
+1.92778907942509
+31
+1.5
+12
+2.17907937354823
+22
+1.86297548735602
+32
+1.5
+13
+2.17907937354823
+23
+1.86297548735602
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.72351920148594
+20
+0.763155941486199
+30
+3.0
+11
+1.65021954795242
+21
+0.744795334089513
+31
+1.5
+12
+1.72351920148594
+22
+0.763155941486199
+32
+1.5
+13
+1.72351920148594
+23
+0.763155941486199
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.65021954795242
+20
+0.744795334089513
+30
+1.5
+11
+1.72351920148594
+21
+0.763155941486199
+31
+3.0
+12
+1.65021954795242
+22
+0.744795334089513
+32
+3.0
+13
+1.65021954795242
+23
+0.744795334089513
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.820920626451767
+20
+1.13702451264398
+30
+0.0
+11
+0.85976839852704
+21
+1.07221092057491
+31
+1.5
+12
+0.85976839852704
+22
+1.07221092057491
+32
+0.0
+13
+0.85976839852704
+23
+1.07221092057491
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.85976839852704
+20
+1.07221092057491
+30
+1.5
+11
+0.820920626451767
+21
+1.13702451264398
+31
+0.0
+12
+0.820920626451767
+22
+1.13702451264398
+32
+1.5
+13
+0.820920626451767
+23
+1.13702451264398
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.14023160147296
+20
+1.07221092057491
+30
+1.5
+11
+2.09521804908931
+21
+1.01151717119399
+31
+3.0
+12
+2.09521804908931
+22
+1.01151717119399
+32
+1.5
+13
+2.09521804908931
+23
+1.01151717119399
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.09521804908931
+20
+1.01151717119399
+30
+3.0
+11
+2.14023160147296
+21
+1.07221092057491
+31
+1.5
+12
+2.14023160147296
+22
+1.07221092057491
+32
+3.0
+13
+2.14023160147296
+23
+1.07221092057491
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+0.0
+11
+1.07221092057491
+21
+2.14023160147296
+31
+0.0
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.07221092057491
+20
+2.14023160147296
+30
+0.0
+11
+0.878679656440356
+21
+3.0
+31
+0.0
+12
+1.13702451264398
+22
+2.17907937354823
+32
+0.0
+13
+1.13702451264398
+23
+2.17907937354823
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.13702451264398
+20
+2.17907937354823
+30
+0.0
+11
+0.878679656440356
+21
+3.0
+31
+0.0
+12
+1.20533375707888
+22
+2.21138724003369
+32
+0.0
+13
+1.20533375707888
+23
+2.21138724003369
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.0
+30
+2.795
+11
+0.878679656440357
+21
+1.53956708492942e-17
+31
+0.826320343559643
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440357
+20
+1.53956708492942e-17
+30
+0.826320343559643
+11
+1.5
+21
+0.0
+31
+2.795
+12
+0.878679656440357
+22
+4.01154803819637e-17
+32
+2.17367965644036
+13
+0.878679656440357
+23
+4.01154803819637e-17
+33
+2.17367965644036
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.73
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.0
+13
+1.5
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.0
+30
+0.205
+11
+1.5
+21
+0.73
+31
+0.0
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.0
+30
+2.795
+11
+1.5
+21
+0.73
+31
+0.0
+12
+1.5
+22
+0.0
+32
+3.0
+13
+1.5
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.0
+30
+3.0
+11
+1.5
+21
+0.73
+31
+0.0
+12
+1.5
+22
+0.73
+32
+3.0
+13
+1.5
+23
+0.73
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.73
+30
+3.0
+11
+1.5
+21
+0.73
+31
+0.0
+12
+1.5
+22
+0.73
+32
+1.5
+13
+1.5
+23
+0.73
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.26629223953759
+20
+1.42452680194624
+30
+1.5
+11
+2.25520466591049
+21
+1.34978045204758
+31
+0.0
+12
+2.25520466591049
+22
+1.34978045204758
+32
+1.5
+13
+2.25520466591049
+23
+1.34978045204758
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.25520466591049
+20
+1.34978045204758
+30
+0.0
+11
+2.26629223953759
+21
+1.42452680194624
+31
+1.5
+12
+2.26629223953759
+22
+1.42452680194624
+32
+0.0
+13
+2.26629223953759
+23
+1.42452680194624
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.2368440585138
+20
+1.72351920148594
+30
+1.5
+11
+2.25520466591049
+21
+1.65021954795242
+31
+3.0
+12
+2.25520466591049
+22
+1.65021954795242
+32
+1.5
+13
+2.25520466591049
+23
+1.65021954795242
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.25520466591049
+20
+1.65021954795242
+30
+3.0
+11
+2.2368440585138
+21
+1.72351920148594
+31
+1.5
+12
+2.2368440585138
+22
+1.72351920148594
+32
+3.0
+13
+2.2368440585138
+23
+1.72351920148594
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.27648079851406
+20
+2.2368440585138
+30
+3.0
+11
+1.34978045204758
+21
+2.25520466591049
+31
+1.5
+12
+1.27648079851406
+22
+2.2368440585138
+32
+1.5
+13
+1.27648079851406
+23
+2.2368440585138
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.34978045204758
+20
+2.25520466591049
+30
+1.5
+11
+1.27648079851406
+21
+2.2368440585138
+31
+3.0
+12
+1.34978045204758
+22
+2.25520466591049
+32
+3.0
+13
+1.34978045204758
+23
+2.25520466591049
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+2.17907937354823
+21
+1.13702451264398
+31
+3.0
+12
+2.17907937354823
+22
+1.13702451264398
+32
+1.5
+13
+2.17907937354823
+23
+1.13702451264398
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.17907937354823
+20
+1.13702451264398
+30
+3.0
+11
+2.21138724003369
+21
+1.20533375707888
+31
+1.5
+12
+2.21138724003369
+22
+1.20533375707888
+32
+3.0
+13
+2.21138724003369
+23
+1.20533375707888
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.98848282880601
+20
+2.09521804908931
+30
+3.0
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+1.98848282880601
+22
+2.09521804908931
+32
+1.5
+13
+1.98848282880601
+23
+2.09521804908931
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+1.98848282880601
+21
+2.09521804908931
+31
+3.0
+12
+2.04447222151364
+22
+2.04447222151364
+32
+3.0
+13
+2.04447222151364
+23
+2.04447222151364
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.42452680194624
+20
+2.26629223953759
+30
+3.0
+11
+1.5
+21
+2.27
+31
+1.5
+12
+1.42452680194624
+22
+2.26629223953759
+32
+1.5
+13
+1.42452680194624
+23
+2.26629223953759
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+2.27
+30
+1.5
+11
+1.42452680194624
+21
+2.26629223953759
+31
+3.0
+12
+1.5
+22
+2.27
+32
+3.0
+13
+1.5
+23
+2.27
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+2.21138724003369
+30
+3.0
+11
+1.86297548735602
+21
+2.17907937354823
+31
+1.5
+12
+1.79466624292112
+22
+2.21138724003369
+32
+1.5
+13
+1.79466624292112
+23
+2.21138724003369
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.86297548735602
+20
+2.17907937354823
+30
+1.5
+11
+1.79466624292112
+21
+2.21138724003369
+31
+3.0
+12
+1.86297548735602
+22
+2.17907937354823
+32
+3.0
+13
+1.86297548735602
+23
+2.17907937354823
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.27
+20
+1.5
+30
+1.5
+11
+3.0
+21
+1.5
+31
+0.0
+12
+2.27
+22
+1.5
+32
+0.0
+13
+2.27
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+1.5
+30
+0.0
+11
+2.27
+21
+1.5
+31
+1.5
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+1.5
+30
+3.0
+11
+2.27
+21
+1.5
+31
+1.5
+12
+2.27
+22
+1.5
+32
+3.0
+13
+2.27
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.733707760462408
+20
+1.57547319805376
+30
+0.0
+11
+0.73
+21
+1.5
+31
+1.5
+12
+0.73
+22
+1.5
+32
+0.0
+13
+0.73
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.73
+20
+1.5
+30
+1.5
+11
+0.733707760462408
+21
+1.57547319805376
+31
+0.0
+12
+0.733707760462408
+22
+1.57547319805376
+32
+1.5
+13
+0.733707760462408
+23
+1.57547319805376
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.85976839852704
+20
+1.92778907942509
+30
+3.0
+11
+0.820920626451767
+21
+1.86297548735602
+31
+1.5
+12
+0.820920626451767
+22
+1.86297548735602
+32
+3.0
+13
+0.820920626451767
+23
+1.86297548735602
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.820920626451767
+20
+1.86297548735602
+30
+1.5
+11
+0.85976839852704
+21
+1.92778907942509
+31
+3.0
+12
+0.85976839852704
+22
+1.92778907942509
+32
+1.5
+13
+0.85976839852704
+23
+1.92778907942509
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.73
+20
+1.5
+30
+3.0
+11
+0.733707760462408
+21
+1.42452680194624
+31
+1.5
+12
+0.733707760462408
+22
+1.42452680194624
+32
+3.0
+13
+0.733707760462408
+23
+1.42452680194624
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.733707760462408
+20
+1.42452680194624
+30
+1.5
+11
+0.73
+21
+1.5
+31
+3.0
+12
+0.73
+22
+1.5
+32
+1.5
+13
+0.73
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.744795334089513
+20
+1.34978045204758
+30
+3.0
+11
+0.763155941486199
+21
+1.27648079851406
+31
+1.5
+12
+0.763155941486199
+22
+1.27648079851406
+32
+3.0
+13
+0.763155941486199
+23
+1.27648079851406
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.763155941486199
+20
+1.27648079851406
+30
+1.5
+11
+0.744795334089513
+21
+1.34978045204758
+31
+3.0
+12
+0.744795334089513
+22
+1.34978045204758
+32
+1.5
+13
+0.744795334089513
+23
+1.34978045204758
+33
+1.5
+70
+1
+ 0
+LINE
+ 8
+star_u
+10
+3.0
+20
+0.878679656440358
+30
+3.0
+11
+3.00250198874351
+21
+0.87764329876989
+31
+3.0
+ 0
+3DFACE
+ 8
+star_u
+10
+0.763155941486199
+20
+1.72351920148594
+30
+0.0
+11
+0.744795334089513
+21
+1.65021954795242
+31
+1.5
+12
+0.744795334089513
+22
+1.65021954795242
+32
+0.0
+13
+0.744795334089513
+23
+1.65021954795242
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.744795334089513
+20
+1.65021954795242
+30
+1.5
+11
+0.763155941486199
+21
+1.72351920148594
+31
+0.0
+12
+0.763155941486199
+22
+1.72351920148594
+32
+1.5
+13
+0.763155941486199
+23
+1.72351920148594
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+0.788612759966309
+30
+3.0
+11
+1.72351920148594
+21
+0.763155941486199
+31
+1.5
+12
+1.79466624292112
+22
+0.788612759966309
+32
+1.5
+13
+1.79466624292112
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.72351920148594
+20
+0.763155941486199
+30
+1.5
+11
+1.79466624292112
+21
+0.788612759966309
+31
+3.0
+12
+1.72351920148594
+22
+0.763155941486199
+32
+3.0
+13
+1.72351920148594
+23
+0.763155941486199
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+0.955527778486358
+30
+0.0
+11
+0.0
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.0
+30
+3.0
+11
+0.955527778486358
+21
+0.955527778486358
+31
+0.0
+12
+0.955527778486358
+22
+0.955527778486358
+32
+3.0
+13
+0.955527778486358
+23
+0.955527778486358
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+0.955527778486358
+30
+3.0
+11
+0.955527778486358
+21
+0.955527778486358
+31
+0.0
+12
+0.955527778486358
+22
+0.955527778486358
+32
+1.5
+13
+0.955527778486358
+23
+0.955527778486358
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.01151717119399
+20
+2.09521804908931
+30
+1.5
+11
+0.955527778486358
+21
+2.04447222151364
+31
+0.0
+12
+1.01151717119399
+22
+2.09521804908931
+32
+0.0
+13
+1.01151717119399
+23
+2.09521804908931
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+2.04447222151364
+30
+0.0
+11
+1.01151717119399
+21
+2.09521804908931
+31
+1.5
+12
+0.955527778486358
+22
+2.04447222151364
+32
+1.5
+13
+0.955527778486358
+23
+2.04447222151364
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.86297548735602
+20
+0.820920626451767
+30
+1.5
+11
+1.92778907942509
+21
+0.85976839852704
+31
+0.0
+12
+1.86297548735602
+22
+0.820920626451767
+32
+0.0
+13
+1.86297548735602
+23
+0.820920626451767
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.92778907942509
+20
+0.85976839852704
+30
+0.0
+11
+1.86297548735602
+21
+0.820920626451767
+31
+1.5
+12
+1.92778907942509
+22
+0.85976839852704
+32
+1.5
+13
+1.92778907942509
+23
+0.85976839852704
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.25520466591049
+20
+1.34978045204758
+30
+1.5
+11
+2.2368440585138
+21
+1.27648079851406
+31
+0.0
+12
+2.2368440585138
+22
+1.27648079851406
+32
+1.5
+13
+2.2368440585138
+23
+1.27648079851406
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.2368440585138
+20
+1.27648079851406
+30
+0.0
+11
+2.25520466591049
+21
+1.34978045204758
+31
+1.5
+12
+2.25520466591049
+22
+1.34978045204758
+32
+0.0
+13
+2.25520466591049
+23
+1.34978045204758
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+0.788612759966309
+30
+1.5
+11
+1.86297548735602
+21
+0.820920626451767
+31
+0.0
+12
+1.79466624292112
+22
+0.788612759966309
+32
+0.0
+13
+1.79466624292112
+23
+0.788612759966309
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.86297548735602
+20
+0.820920626451767
+30
+0.0
+11
+1.79466624292112
+21
+0.788612759966309
+31
+1.5
+12
+1.86297548735602
+22
+0.820920626451767
+32
+1.5
+13
+1.86297548735602
+23
+0.820920626451767
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.42452680194624
+20
+0.733707760462408
+30
+1.5
+11
+1.5
+21
+0.73
+31
+0.0
+12
+1.42452680194624
+22
+0.733707760462408
+32
+0.0
+13
+1.42452680194624
+23
+0.733707760462408
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.73
+30
+0.0
+11
+1.42452680194624
+21
+0.733707760462408
+31
+1.5
+12
+1.5
+22
+0.73
+32
+1.5
+13
+1.5
+23
+0.73
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.13702451264398
+20
+0.820920626451767
+30
+3.0
+11
+1.07221092057491
+21
+0.85976839852704
+31
+1.5
+12
+1.13702451264398
+22
+0.820920626451767
+32
+1.5
+13
+1.13702451264398
+23
+0.820920626451767
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.07221092057491
+20
+0.85976839852704
+30
+1.5
+11
+1.13702451264398
+21
+0.820920626451767
+31
+3.0
+12
+1.07221092057491
+22
+0.85976839852704
+32
+3.0
+13
+1.07221092057491
+23
+0.85976839852704
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.13702451264398
+20
+2.17907937354823
+30
+1.5
+11
+1.07221092057491
+21
+2.14023160147296
+31
+0.0
+12
+1.13702451264398
+22
+2.17907937354823
+32
+0.0
+13
+1.13702451264398
+23
+2.17907937354823
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.07221092057491
+20
+2.14023160147296
+30
+0.0
+11
+1.13702451264398
+21
+2.17907937354823
+31
+1.5
+12
+1.07221092057491
+22
+2.14023160147296
+32
+1.5
+13
+1.07221092057491
+23
+2.14023160147296
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440357
+20
+3.68628738645072e-18
+30
+0.205
+11
+1.20533375707888
+21
+0.788612759966309
+31
+0.0
+12
+0.878679656440357
+22
+0.0
+32
+0.0
+13
+0.878679656440357
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+0.788612759966309
+30
+0.0
+11
+0.878679656440357
+21
+3.68628738645072e-18
+31
+0.205
+12
+0.878679656440357
+22
+1.53956708492942e-17
+32
+0.826320343559643
+13
+0.878679656440357
+23
+1.53956708492942e-17
+33
+0.826320343559643
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+0.788612759966309
+30
+0.0
+11
+0.878679656440357
+21
+1.53956708492942e-17
+31
+0.826320343559643
+12
+0.878679656440357
+22
+4.01154803819637e-17
+32
+2.17367965644036
+13
+0.878679656440357
+23
+4.01154803819637e-17
+33
+2.17367965644036
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+0.788612759966309
+30
+0.0
+11
+0.878679656440357
+21
+4.01154803819637e-17
+31
+2.17367965644036
+12
+0.878679656440357
+22
+5.18248638448071e-17
+32
+2.795
+13
+0.878679656440357
+23
+5.18248638448071e-17
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+0.788612759966309
+30
+0.0
+11
+0.878679656440357
+21
+5.18248638448071e-17
+31
+2.795
+12
+0.878679656440357
+22
+1.11022302462516e-16
+32
+3.0
+13
+0.878679656440357
+23
+1.11022302462516e-16
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+0.788612759966309
+30
+0.0
+11
+0.878679656440357
+21
+1.11022302462516e-16
+31
+3.0
+12
+1.20533375707888
+22
+0.788612759966309
+32
+3.0
+13
+1.20533375707888
+23
+0.788612759966309
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+0.788612759966309
+30
+0.0
+11
+1.20533375707888
+21
+0.788612759966309
+31
+3.0
+12
+1.20533375707888
+22
+0.788612759966309
+32
+1.5
+13
+1.20533375707888
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.09521804908931
+20
+1.01151717119399
+30
+1.5
+11
+2.04447222151364
+21
+0.955527778486358
+31
+3.0
+12
+2.04447222151364
+22
+0.955527778486358
+32
+1.5
+13
+2.04447222151364
+23
+0.955527778486358
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+0.955527778486358
+30
+3.0
+11
+2.09521804908931
+21
+1.01151717119399
+31
+1.5
+12
+2.09521804908931
+22
+1.01151717119399
+32
+3.0
+13
+2.09521804908931
+23
+1.01151717119399
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.86297548735602
+20
+2.17907937354823
+30
+3.0
+11
+1.92778907942509
+21
+2.14023160147296
+31
+1.5
+12
+1.86297548735602
+22
+2.17907937354823
+32
+1.5
+13
+1.86297548735602
+23
+2.17907937354823
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.92778907942509
+20
+2.14023160147296
+30
+1.5
+11
+1.86297548735602
+21
+2.17907937354823
+31
+3.0
+12
+1.92778907942509
+22
+2.14023160147296
+32
+3.0
+13
+1.92778907942509
+23
+2.14023160147296
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.21138724003369
+21
+1.79466624292112
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+0.0
+11
+3.0
+21
+2.12132034355964
+31
+3.0
+12
+2.21138724003369
+22
+1.79466624292112
+32
+1.5
+13
+2.21138724003369
+23
+1.79466624292112
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+3.0
+21
+2.12132034355964
+31
+3.0
+12
+2.21138724003369
+22
+1.79466624292112
+32
+3.0
+13
+2.21138724003369
+23
+1.79466624292112
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.65021954795242
+20
+0.744795334089513
+30
+3.0
+11
+1.57547319805376
+21
+0.733707760462408
+31
+1.5
+12
+1.65021954795242
+22
+0.744795334089513
+32
+1.5
+13
+1.65021954795242
+23
+0.744795334089513
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.57547319805376
+20
+0.733707760462408
+30
+1.5
+11
+1.65021954795242
+21
+0.744795334089513
+31
+3.0
+12
+1.57547319805376
+22
+0.733707760462408
+32
+3.0
+13
+1.57547319805376
+23
+0.733707760462408
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.763155941486199
+20
+1.27648079851406
+30
+3.0
+11
+0.788612759966309
+21
+1.20533375707888
+31
+1.5
+12
+0.788612759966309
+22
+1.20533375707888
+32
+3.0
+13
+0.788612759966309
+23
+1.20533375707888
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.20533375707888
+30
+1.5
+11
+0.763155941486199
+21
+1.27648079851406
+31
+3.0
+12
+0.763155941486199
+22
+1.27648079851406
+32
+1.5
+13
+0.763155941486199
+23
+1.27648079851406
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.27648079851406
+20
+0.763155941486199
+30
+1.5
+11
+1.34978045204758
+21
+0.744795334089513
+31
+0.0
+12
+1.27648079851406
+22
+0.763155941486199
+32
+0.0
+13
+1.27648079851406
+23
+0.763155941486199
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.34978045204758
+20
+0.744795334089513
+30
+0.0
+11
+1.27648079851406
+21
+0.763155941486199
+31
+1.5
+12
+1.34978045204758
+22
+0.744795334089513
+32
+1.5
+13
+1.34978045204758
+23
+0.744795334089513
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.26629223953759
+20
+1.57547319805376
+30
+1.5
+11
+2.27
+21
+1.5
+31
+3.0
+12
+2.27
+22
+1.5
+32
+1.5
+13
+2.27
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.27
+20
+1.5
+30
+3.0
+11
+2.26629223953759
+21
+1.57547319805376
+31
+1.5
+12
+2.26629223953759
+22
+1.57547319805376
+32
+3.0
+13
+2.26629223953759
+23
+1.57547319805376
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.744795334089513
+20
+1.65021954795242
+30
+0.0
+11
+0.733707760462408
+21
+1.57547319805376
+31
+1.5
+12
+0.733707760462408
+22
+1.57547319805376
+32
+0.0
+13
+0.733707760462408
+23
+1.57547319805376
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.733707760462408
+20
+1.57547319805376
+30
+1.5
+11
+0.744795334089513
+21
+1.65021954795242
+31
+0.0
+12
+0.744795334089513
+22
+1.65021954795242
+32
+1.5
+13
+0.744795334089513
+23
+1.65021954795242
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.20533375707888
+30
+0.0
+11
+0.820920626451767
+21
+1.13702451264398
+31
+1.5
+12
+0.820920626451767
+22
+1.13702451264398
+32
+0.0
+13
+0.820920626451767
+23
+1.13702451264398
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.820920626451767
+20
+1.13702451264398
+30
+1.5
+11
+0.788612759966309
+21
+1.20533375707888
+31
+0.0
+12
+0.788612759966309
+22
+1.20533375707888
+32
+1.5
+13
+0.788612759966309
+23
+1.20533375707888
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+2.21138724003369
+30
+1.5
+11
+1.13702451264398
+21
+2.17907937354823
+31
+0.0
+12
+1.20533375707888
+22
+2.21138724003369
+32
+0.0
+13
+1.20533375707888
+23
+2.21138724003369
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.13702451264398
+20
+2.17907937354823
+30
+0.0
+11
+1.20533375707888
+21
+2.21138724003369
+31
+1.5
+12
+1.13702451264398
+22
+2.17907937354823
+32
+1.5
+13
+1.13702451264398
+23
+2.17907937354823
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+2.21138724003369
+30
+1.5
+11
+1.72351920148594
+21
+2.2368440585138
+31
+0.0
+12
+1.79466624292112
+22
+2.21138724003369
+32
+0.0
+13
+1.79466624292112
+23
+2.21138724003369
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.72351920148594
+20
+2.2368440585138
+30
+0.0
+11
+1.79466624292112
+21
+2.21138724003369
+31
+1.5
+12
+1.72351920148594
+22
+2.2368440585138
+32
+1.5
+13
+1.72351920148594
+23
+2.2368440585138
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.17907937354823
+20
+1.86297548735602
+30
+1.5
+11
+2.21138724003369
+21
+1.79466624292112
+31
+0.0
+12
+2.21138724003369
+22
+1.79466624292112
+32
+1.5
+13
+2.21138724003369
+23
+1.79466624292112
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+0.0
+11
+2.17907937354823
+21
+1.86297548735602
+31
+1.5
+12
+2.17907937354823
+22
+1.86297548735602
+32
+0.0
+13
+2.17907937354823
+23
+1.86297548735602
+33
+0.0
+70
+1
+ 0
+LINE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+3.0
+11
+2.12187288805765
+21
+-0.0013339604208924
+31
+3.0
+ 0
+3DFACE
+ 8
+star_u
+10
+1.92778907942509
+20
+0.85976839852704
+30
+1.5
+11
+1.98848282880601
+21
+0.904781950910693
+31
+0.0
+12
+1.92778907942509
+22
+0.85976839852704
+32
+0.0
+13
+1.92778907942509
+23
+0.85976839852704
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.98848282880601
+20
+0.904781950910693
+30
+0.0
+11
+1.92778907942509
+21
+0.85976839852704
+31
+1.5
+12
+1.98848282880601
+22
+0.904781950910693
+32
+1.5
+13
+1.98848282880601
+23
+0.904781950910693
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.07221092057491
+20
+2.14023160147296
+30
+1.5
+11
+1.01151717119399
+21
+2.09521804908931
+31
+0.0
+12
+1.07221092057491
+22
+2.14023160147296
+32
+0.0
+13
+1.07221092057491
+23
+2.14023160147296
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.01151717119399
+20
+2.09521804908931
+30
+0.0
+11
+1.07221092057491
+21
+2.14023160147296
+31
+1.5
+12
+1.01151717119399
+22
+2.09521804908931
+32
+1.5
+13
+1.01151717119399
+23
+2.09521804908931
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.34978045204758
+20
+0.744795334089513
+30
+1.5
+11
+1.42452680194624
+21
+0.733707760462408
+31
+0.0
+12
+1.34978045204758
+22
+0.744795334089513
+32
+0.0
+13
+1.34978045204758
+23
+0.744795334089513
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.42452680194624
+20
+0.733707760462408
+30
+0.0
+11
+1.34978045204758
+21
+0.744795334089513
+31
+1.5
+12
+1.42452680194624
+22
+0.733707760462408
+32
+1.5
+13
+1.42452680194624
+23
+0.733707760462408
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.92778907942509
+20
+2.14023160147296
+30
+3.0
+11
+1.98848282880601
+21
+2.09521804908931
+31
+1.5
+12
+1.92778907942509
+22
+2.14023160147296
+32
+1.5
+13
+1.92778907942509
+23
+2.14023160147296
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.98848282880601
+20
+2.09521804908931
+30
+1.5
+11
+1.92778907942509
+21
+2.14023160147296
+31
+3.0
+12
+1.98848282880601
+22
+2.09521804908931
+32
+3.0
+13
+1.98848282880601
+23
+2.09521804908931
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+1.20163144893051
+30
+0.0
+11
+3.0
+21
+0.878679656440358
+31
+3.0
+12
+3.0
+22
+0.878679656440358
+32
+0.0
+13
+3.0
+23
+0.878679656440358
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.878679656440358
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+0.0
+12
+3.0
+22
+1.20163144893051
+32
+3.0
+13
+3.0
+23
+1.20163144893051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+3.0
+21
+1.5
+31
+0.0
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.85976839852704
+20
+1.07221092057491
+30
+0.0
+11
+0.904781950910692
+21
+1.01151717119399
+31
+1.5
+12
+0.904781950910692
+22
+1.01151717119399
+32
+0.0
+13
+0.904781950910692
+23
+1.01151717119399
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.904781950910692
+20
+1.01151717119399
+30
+1.5
+11
+0.85976839852704
+21
+1.07221092057491
+31
+0.0
+12
+0.85976839852704
+22
+1.07221092057491
+32
+1.5
+13
+0.85976839852704
+23
+1.07221092057491
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.79466624292112
+30
+0.0
+11
+0.763155941486199
+21
+1.72351920148594
+31
+1.5
+12
+0.763155941486199
+22
+1.72351920148594
+32
+0.0
+13
+0.763155941486199
+23
+1.72351920148594
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.763155941486199
+20
+1.72351920148594
+30
+1.5
+11
+0.788612759966309
+21
+1.79466624292112
+31
+0.0
+12
+0.788612759966309
+22
+1.79466624292112
+32
+1.5
+13
+0.788612759966309
+23
+1.79466624292112
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.79466624292112
+30
+0.0
+11
+0.0
+21
+1.79836855106949
+31
+0.0
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.788612759966309
+21
+1.79466624292112
+31
+0.0
+12
+0.763155941486199
+22
+1.72351920148594
+32
+0.0
+13
+0.763155941486199
+23
+1.72351920148594
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.763155941486199
+21
+1.72351920148594
+31
+0.0
+12
+0.744795334089513
+22
+1.65021954795242
+32
+0.0
+13
+0.744795334089513
+23
+1.65021954795242
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+0.788612759966309
+30
+0.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+0.0
+12
+0.878679656440357
+22
+0.0
+32
+0.0
+13
+0.878679656440357
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.20533375707888
+21
+0.788612759966309
+31
+0.0
+12
+1.27648079851406
+22
+0.763155941486199
+32
+0.0
+13
+1.27648079851406
+23
+0.763155941486199
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.27648079851406
+21
+0.763155941486199
+31
+0.0
+12
+1.34978045204758
+22
+0.744795334089513
+32
+0.0
+13
+1.34978045204758
+23
+0.744795334089513
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+3.0
+30
+0.826320343559643
+11
+2.12132034355964
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+star_u
+10
+0.904781950910692
+20
+1.98848282880601
+30
+3.0
+11
+0.85976839852704
+21
+1.92778907942509
+31
+1.5
+12
+0.85976839852704
+22
+1.92778907942509
+32
+3.0
+13
+0.85976839852704
+23
+1.92778907942509
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.85976839852704
+20
+1.92778907942509
+30
+1.5
+11
+0.904781950910692
+21
+1.98848282880601
+31
+3.0
+12
+0.904781950910692
+22
+1.98848282880601
+32
+1.5
+13
+0.904781950910692
+23
+1.98848282880601
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.34978045204758
+20
+2.25520466591049
+30
+3.0
+11
+1.42452680194624
+21
+2.26629223953759
+31
+1.5
+12
+1.34978045204758
+22
+2.25520466591049
+32
+1.5
+13
+1.34978045204758
+23
+2.25520466591049
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.42452680194624
+20
+2.26629223953759
+30
+1.5
+11
+1.34978045204758
+21
+2.25520466591049
+31
+3.0
+12
+1.42452680194624
+22
+2.26629223953759
+32
+3.0
+13
+1.42452680194624
+23
+2.26629223953759
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+-2.22044604925031e-16
+20
+2.12132034355964
+30
+3.0
+11
+0.788612759966309
+21
+1.79466624292112
+31
+0.0
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.79466624292112
+30
+0.0
+11
+-2.22044604925031e-16
+21
+2.12132034355964
+31
+3.0
+12
+0.788612759966309
+22
+1.79466624292112
+32
+1.5
+13
+0.788612759966309
+23
+1.79466624292112
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.79466624292112
+30
+1.5
+11
+-2.22044604925031e-16
+21
+2.12132034355964
+31
+3.0
+12
+0.788612759966309
+22
+1.79466624292112
+32
+3.0
+13
+0.788612759966309
+23
+1.79466624292112
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.14023160147296
+20
+1.92778907942509
+30
+1.5
+11
+2.17907937354823
+21
+1.86297548735602
+31
+0.0
+12
+2.17907937354823
+22
+1.86297548735602
+32
+1.5
+13
+2.17907937354823
+23
+1.86297548735602
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.17907937354823
+20
+1.86297548735602
+30
+0.0
+11
+2.14023160147296
+21
+1.92778907942509
+31
+1.5
+12
+2.14023160147296
+22
+1.92778907942509
+32
+0.0
+13
+2.14023160147296
+23
+1.92778907942509
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.98848282880601
+20
+0.904781950910693
+30
+1.5
+11
+2.04447222151364
+21
+0.955527778486358
+31
+0.0
+12
+1.98848282880601
+22
+0.904781950910693
+32
+0.0
+13
+1.98848282880601
+23
+0.904781950910693
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+0.955527778486358
+30
+0.0
+11
+1.98848282880601
+21
+0.904781950910693
+31
+1.5
+12
+2.04447222151364
+22
+0.955527778486358
+32
+1.5
+13
+2.04447222151364
+23
+0.955527778486358
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.733707760462408
+21
+1.57547319805376
+31
+3.0
+12
+0.73
+22
+1.5
+32
+3.0
+13
+0.73
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.733707760462408
+20
+1.57547319805376
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.744795334089513
+22
+1.65021954795242
+32
+3.0
+13
+0.744795334089513
+23
+1.65021954795242
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.763155941486199
+21
+1.72351920148594
+31
+3.0
+12
+0.744795334089513
+22
+1.65021954795242
+32
+3.0
+13
+0.744795334089513
+23
+1.65021954795242
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.763155941486199
+20
+1.72351920148594
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.788612759966309
+22
+1.79466624292112
+32
+3.0
+13
+0.788612759966309
+23
+1.79466624292112
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.42452680194624
+20
+0.733707760462408
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.34978045204758
+22
+0.744795334089513
+32
+3.0
+13
+1.34978045204758
+23
+0.744795334089513
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.42452680194624
+21
+0.733707760462408
+31
+3.0
+12
+1.5
+22
+0.73
+32
+3.0
+13
+1.5
+23
+0.73
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.27648079851406
+20
+0.763155941486199
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.20533375707888
+22
+0.788612759966309
+32
+3.0
+13
+1.20533375707888
+23
+0.788612759966309
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.27648079851406
+21
+0.763155941486199
+31
+3.0
+12
+1.34978045204758
+22
+0.744795334089513
+32
+3.0
+13
+1.34978045204758
+23
+0.744795334089513
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.14023160147296
+20
+1.07221092057491
+30
+3.0
+11
+2.21138724003369
+21
+1.20533375707888
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.20533375707888
+30
+3.0
+11
+2.14023160147296
+21
+1.07221092057491
+31
+3.0
+12
+2.17907937354823
+22
+1.13702451264398
+32
+3.0
+13
+2.17907937354823
+23
+1.13702451264398
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.13702451264398
+20
+0.820920626451767
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.07221092057491
+22
+0.85976839852704
+32
+3.0
+13
+1.07221092057491
+23
+0.85976839852704
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.13702451264398
+21
+0.820920626451767
+31
+3.0
+12
+1.20533375707888
+22
+0.788612759966309
+32
+3.0
+13
+1.20533375707888
+23
+0.788612759966309
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.57547319805376
+20
+0.733707760462408
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.5
+22
+0.73
+32
+3.0
+13
+1.5
+23
+0.73
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.57547319805376
+21
+0.733707760462408
+31
+3.0
+12
+1.65021954795242
+22
+0.744795334089513
+32
+3.0
+13
+1.65021954795242
+23
+0.744795334089513
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.65021954795242
+20
+0.744795334089513
+30
+3.0
+11
+1.79466624292112
+21
+0.788612759966309
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+0.788612759966309
+30
+3.0
+11
+1.65021954795242
+21
+0.744795334089513
+31
+3.0
+12
+1.72351920148594
+22
+0.763155941486199
+32
+3.0
+13
+1.72351920148594
+23
+0.763155941486199
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.788612759966309
+21
+1.20533375707888
+31
+3.0
+12
+-4.44089209850063e-16
+22
+0.878679656440356
+32
+3.0
+13
+-4.44089209850063e-16
+23
+0.878679656440356
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.20533375707888
+30
+3.0
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+0.820920626451767
+22
+1.13702451264398
+32
+3.0
+13
+0.820920626451767
+23
+1.13702451264398
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.820920626451767
+20
+1.13702451264398
+30
+3.0
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+0.85976839852704
+22
+1.07221092057491
+32
+3.0
+13
+0.85976839852704
+23
+1.07221092057491
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.904781950910692
+20
+1.01151717119399
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.85976839852704
+22
+1.07221092057491
+32
+3.0
+13
+0.85976839852704
+23
+1.07221092057491
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.904781950910692
+21
+1.01151717119399
+31
+3.0
+12
+0.955527778486358
+22
+0.955527778486358
+32
+3.0
+13
+0.955527778486358
+23
+0.955527778486358
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.820920626451767
+21
+1.86297548735602
+31
+3.0
+12
+0.788612759966309
+22
+1.79466624292112
+32
+3.0
+13
+0.788612759966309
+23
+1.79466624292112
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.820920626451767
+20
+1.86297548735602
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.85976839852704
+22
+1.92778907942509
+32
+3.0
+13
+0.85976839852704
+23
+1.92778907942509
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.20533375707888
+30
+3.0
+11
+2.25520466591049
+21
+1.34978045204758
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.25520466591049
+20
+1.34978045204758
+30
+3.0
+11
+2.21138724003369
+21
+1.20533375707888
+31
+3.0
+12
+2.2368440585138
+22
+1.27648079851406
+32
+3.0
+13
+2.2368440585138
+23
+1.27648079851406
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.92778907942509
+20
+0.85976839852704
+30
+3.0
+11
+2.04447222151364
+21
+0.955527778486358
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+0.955527778486358
+30
+3.0
+11
+1.92778907942509
+21
+0.85976839852704
+31
+3.0
+12
+1.98848282880601
+22
+0.904781950910693
+32
+3.0
+13
+1.98848282880601
+23
+0.904781950910693
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.878679656440358
+30
+3.0
+11
+2.2368440585138
+21
+1.27648079851406
+31
+3.0
+12
+2.21138724003369
+22
+1.20533375707888
+32
+3.0
+13
+2.21138724003369
+23
+1.20533375707888
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.2368440585138
+20
+1.27648079851406
+30
+3.0
+11
+3.0
+21
+0.878679656440358
+31
+3.0
+12
+2.25520466591049
+22
+1.34978045204758
+32
+3.0
+13
+2.25520466591049
+23
+1.34978045204758
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.25520466591049
+20
+1.34978045204758
+30
+3.0
+11
+3.0
+21
+0.878679656440358
+31
+3.0
+12
+3.0
+22
+1.20163144893051
+32
+3.0
+13
+3.0
+23
+1.20163144893051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+3.0
+11
+1.20533375707888
+21
+0.788612759966309
+31
+3.0
+12
+0.878679656440357
+22
+1.11022302462516e-16
+32
+3.0
+13
+0.878679656440357
+23
+1.11022302462516e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+0.788612759966309
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+1.27648079851406
+22
+0.763155941486199
+32
+3.0
+13
+1.27648079851406
+23
+0.763155941486199
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.27648079851406
+20
+0.763155941486199
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+1.34978045204758
+22
+0.744795334089513
+32
+3.0
+13
+1.34978045204758
+23
+0.744795334089513
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.25520466591049
+20
+1.65021954795242
+30
+3.0
+11
+2.21138724003369
+21
+1.79466624292112
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+3.0
+11
+2.25520466591049
+21
+1.65021954795242
+31
+3.0
+12
+2.2368440585138
+22
+1.72351920148594
+32
+3.0
+13
+2.2368440585138
+23
+1.72351920148594
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+3.0
+11
+2.14023160147296
+21
+1.92778907942509
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.14023160147296
+20
+1.92778907942509
+30
+3.0
+11
+2.21138724003369
+21
+1.79466624292112
+31
+3.0
+12
+2.17907937354823
+22
+1.86297548735602
+32
+3.0
+13
+2.17907937354823
+23
+1.86297548735602
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.27
+20
+1.5
+30
+3.0
+11
+2.25520466591049
+21
+1.65021954795242
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.25520466591049
+20
+1.65021954795242
+30
+3.0
+11
+2.27
+21
+1.5
+31
+3.0
+12
+2.26629223953759
+22
+1.57547319805376
+32
+3.0
+13
+2.26629223953759
+23
+1.57547319805376
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+3.0
+11
+1.86297548735602
+21
+0.820920626451767
+31
+3.0
+12
+1.79466624292112
+22
+0.788612759966309
+32
+3.0
+13
+1.79466624292112
+23
+0.788612759966309
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.86297548735602
+20
+0.820920626451767
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+3.0
+12
+1.92778907942509
+22
+0.85976839852704
+32
+3.0
+13
+1.92778907942509
+23
+0.85976839852704
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.92778907942509
+20
+0.85976839852704
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+3.0
+12
+2.50226795687895
+22
+0.0
+32
+3.0
+13
+2.50226795687895
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.72351920148594
+20
+2.2368440585138
+30
+3.0
+11
+1.79836855106949
+21
+3.0
+31
+3.0
+12
+1.65021954795242
+22
+2.25520466591049
+32
+3.0
+13
+1.65021954795242
+23
+2.25520466591049
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.72351920148594
+21
+2.2368440585138
+31
+3.0
+12
+1.79466624292112
+22
+2.21138724003369
+32
+3.0
+13
+1.79466624292112
+23
+2.21138724003369
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.79466624292112
+21
+2.21138724003369
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.42452680194624
+21
+2.26629223953759
+31
+3.0
+12
+1.34978045204758
+22
+2.25520466591049
+32
+3.0
+13
+1.34978045204758
+23
+2.25520466591049
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.42452680194624
+20
+2.26629223953759
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.5
+22
+2.27
+32
+3.0
+13
+1.5
+23
+2.27
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.27648079851406
+21
+2.2368440585138
+31
+3.0
+12
+1.20533375707888
+22
+2.21138724003369
+32
+3.0
+13
+1.20533375707888
+23
+2.21138724003369
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.27648079851406
+20
+2.2368440585138
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.34978045204758
+22
+2.25520466591049
+32
+3.0
+13
+1.34978045204758
+23
+2.25520466591049
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.57547319805376
+21
+2.26629223953759
+31
+3.0
+12
+1.5
+22
+2.27
+32
+3.0
+13
+1.5
+23
+2.27
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.57547319805376
+20
+2.26629223953759
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.65021954795242
+22
+2.25520466591049
+32
+3.0
+13
+1.65021954795242
+23
+2.25520466591049
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+2.21138724003369
+30
+3.0
+11
+1.65021954795242
+21
+2.25520466591049
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.65021954795242
+20
+2.25520466591049
+30
+3.0
+11
+1.79466624292112
+21
+2.21138724003369
+31
+3.0
+12
+1.72351920148594
+22
+2.2368440585138
+32
+3.0
+13
+1.72351920148594
+23
+2.2368440585138
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.92778907942509
+20
+2.14023160147296
+30
+3.0
+11
+1.79466624292112
+21
+2.21138724003369
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+2.21138724003369
+30
+3.0
+11
+1.92778907942509
+21
+2.14023160147296
+31
+3.0
+12
+1.86297548735602
+22
+2.17907937354823
+32
+3.0
+13
+1.86297548735602
+23
+2.17907937354823
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.13702451264398
+21
+2.17907937354823
+31
+3.0
+12
+1.07221092057491
+22
+2.14023160147296
+32
+3.0
+13
+1.07221092057491
+23
+2.14023160147296
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.13702451264398
+20
+2.17907937354823
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.20533375707888
+22
+2.21138724003369
+32
+3.0
+13
+1.20533375707888
+23
+2.21138724003369
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.01151717119399
+21
+2.09521804908931
+31
+3.0
+12
+0.955527778486358
+22
+2.04447222151364
+32
+3.0
+13
+0.955527778486358
+23
+2.04447222151364
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.01151717119399
+20
+2.09521804908931
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.07221092057491
+22
+2.14023160147296
+32
+3.0
+13
+1.07221092057491
+23
+2.14023160147296
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.07221092057491
+20
+2.14023160147296
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+1.07221092057491
+21
+2.14023160147296
+31
+3.0
+12
+1.13702451264398
+22
+2.17907937354823
+32
+3.0
+13
+1.13702451264398
+23
+2.17907937354823
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+1.13702451264398
+21
+2.17907937354823
+31
+3.0
+12
+1.20533375707888
+22
+2.21138724003369
+32
+3.0
+13
+1.20533375707888
+23
+2.21138724003369
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.733707760462408
+20
+1.42452680194624
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.73
+22
+1.5
+32
+3.0
+13
+0.73
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.733707760462408
+21
+1.42452680194624
+31
+3.0
+12
+0.744795334089513
+22
+1.34978045204758
+32
+3.0
+13
+0.744795334089513
+23
+1.34978045204758
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.788612759966309
+21
+1.79466624292112
+31
+3.0
+12
+-2.22044604925031e-16
+22
+2.12132034355964
+32
+3.0
+13
+-2.22044604925031e-16
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.79466624292112
+30
+3.0
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.763155941486199
+22
+1.72351920148594
+32
+3.0
+13
+0.763155941486199
+23
+1.72351920148594
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.763155941486199
+20
+1.72351920148594
+30
+3.0
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.744795334089513
+22
+1.65021954795242
+32
+3.0
+13
+0.744795334089513
+23
+1.65021954795242
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+2.04447222151364
+30
+3.0
+11
+1.92778907942509
+21
+2.14023160147296
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.92778907942509
+20
+2.14023160147296
+30
+3.0
+11
+2.04447222151364
+21
+2.04447222151364
+31
+3.0
+12
+1.98848282880601
+22
+2.09521804908931
+32
+3.0
+13
+1.98848282880601
+23
+2.09521804908931
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.25520466591049
+20
+1.34978045204758
+30
+3.0
+11
+2.27
+21
+1.5
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.27
+20
+1.5
+30
+3.0
+11
+2.25520466591049
+21
+1.34978045204758
+31
+3.0
+12
+2.26629223953759
+22
+1.42452680194624
+32
+3.0
+13
+2.26629223953759
+23
+1.42452680194624
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+0.788612759966309
+30
+3.0
+11
+1.92778907942509
+21
+0.85976839852704
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.92778907942509
+20
+0.85976839852704
+30
+3.0
+11
+1.79466624292112
+21
+0.788612759966309
+31
+3.0
+12
+1.86297548735602
+22
+0.820920626451767
+32
+3.0
+13
+1.86297548735602
+23
+0.820920626451767
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.17907937354823
+20
+1.86297548735602
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+3.0
+12
+2.14023160147296
+22
+1.92778907942509
+32
+3.0
+13
+2.14023160147296
+23
+1.92778907942509
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+2.17907937354823
+21
+1.86297548735602
+31
+3.0
+12
+2.21138724003369
+22
+1.79466624292112
+32
+3.0
+13
+2.21138724003369
+23
+1.79466624292112
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+2.21138724003369
+21
+1.79466624292112
+31
+3.0
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+0.955527778486358
+30
+3.0
+11
+2.14023160147296
+21
+1.07221092057491
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.14023160147296
+20
+1.07221092057491
+30
+3.0
+11
+2.04447222151364
+21
+0.955527778486358
+31
+3.0
+12
+2.09521804908931
+22
+1.01151717119399
+32
+3.0
+13
+2.09521804908931
+23
+1.01151717119399
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.820920626451767
+20
+1.13702451264398
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.788612759966309
+22
+1.20533375707888
+32
+3.0
+13
+0.788612759966309
+23
+1.20533375707888
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.820920626451767
+21
+1.13702451264398
+31
+3.0
+12
+0.85976839852704
+22
+1.07221092057491
+32
+3.0
+13
+0.85976839852704
+23
+1.07221092057491
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.01151717119399
+20
+0.904781950910692
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.955527778486358
+22
+0.955527778486358
+32
+3.0
+13
+0.955527778486358
+23
+0.955527778486358
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.01151717119399
+21
+0.904781950910692
+31
+3.0
+12
+1.07221092057491
+22
+0.85976839852704
+32
+3.0
+13
+1.07221092057491
+23
+0.85976839852704
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.763155941486199
+20
+1.27648079851406
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.744795334089513
+22
+1.34978045204758
+32
+3.0
+13
+0.744795334089513
+23
+1.34978045204758
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.763155941486199
+21
+1.27648079851406
+31
+3.0
+12
+0.788612759966309
+22
+1.20533375707888
+32
+3.0
+13
+0.788612759966309
+23
+1.20533375707888
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.14023160147296
+20
+1.92778907942509
+30
+3.0
+11
+2.04447222151364
+21
+2.04447222151364
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+2.04447222151364
+30
+3.0
+11
+2.14023160147296
+21
+1.92778907942509
+31
+3.0
+12
+2.09521804908931
+22
+1.98848282880601
+32
+3.0
+13
+2.09521804908931
+23
+1.98848282880601
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.904781950910692
+21
+1.98848282880601
+31
+3.0
+12
+0.85976839852704
+22
+1.92778907942509
+32
+3.0
+13
+0.85976839852704
+23
+1.92778907942509
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.904781950910692
+20
+1.98848282880601
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.955527778486358
+22
+2.04447222151364
+32
+3.0
+13
+0.955527778486358
+23
+2.04447222151364
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.09521804908931
+21
+1.98848282880601
+31
+0.0
+12
+2.04447222151364
+22
+2.04447222151364
+32
+0.0
+13
+2.04447222151364
+23
+2.04447222151364
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.09521804908931
+20
+1.98848282880601
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.14023160147296
+22
+1.92778907942509
+32
+0.0
+13
+2.14023160147296
+23
+1.92778907942509
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.14023160147296
+20
+1.92778907942509
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+0.0
+13
+3.0
+23
+2.50226795687895
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+3.0
+30
+0.0
+11
+1.57547319805376
+21
+2.26629223953759
+31
+0.0
+12
+1.5
+22
+2.27
+32
+0.0
+13
+1.5
+23
+2.27
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.57547319805376
+20
+2.26629223953759
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.79836855106949
+22
+3.0
+32
+0.0
+13
+1.79836855106949
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.57547319805376
+20
+2.26629223953759
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.65021954795242
+22
+2.25520466591049
+32
+0.0
+13
+1.65021954795242
+23
+2.25520466591049
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.26629223953759
+20
+1.42452680194624
+30
+0.0
+11
+3.0
+21
+1.20163144893051
+31
+0.0
+12
+2.25520466591049
+22
+1.34978045204758
+32
+0.0
+13
+2.25520466591049
+23
+1.34978045204758
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+1.20163144893051
+30
+0.0
+11
+2.26629223953759
+21
+1.42452680194624
+31
+0.0
+12
+2.27
+22
+1.5
+32
+0.0
+13
+2.27
+23
+1.5
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+1.20163144893051
+30
+0.0
+11
+2.27
+21
+1.5
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.34978045204758
+20
+0.744795334089513
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+0.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.0
+30
+0.0
+11
+1.34978045204758
+21
+0.744795334089513
+31
+0.0
+12
+1.42452680194624
+22
+0.733707760462408
+32
+0.0
+13
+1.42452680194624
+23
+0.733707760462408
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.0
+30
+0.0
+11
+1.42452680194624
+21
+0.733707760462408
+31
+0.0
+12
+1.5
+22
+0.73
+32
+0.0
+13
+1.5
+23
+0.73
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.98848282880601
+20
+0.904781950910693
+30
+0.0
+11
+2.50226795687895
+21
+0.0
+31
+0.0
+12
+1.92778907942509
+22
+0.85976839852704
+32
+0.0
+13
+1.92778907942509
+23
+0.85976839852704
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+1.98848282880601
+21
+0.904781950910693
+31
+0.0
+12
+2.04447222151364
+22
+0.955527778486358
+32
+0.0
+13
+2.04447222151364
+23
+0.955527778486358
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+2.04447222151364
+21
+0.955527778486358
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.0
+12
+2.795
+22
+0.0
+32
+0.0
+13
+2.795
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.744795334089513
+20
+1.65021954795242
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+1.79836855106949
+32
+0.0
+13
+0.0
+23
+1.79836855106949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.744795334089513
+21
+1.65021954795242
+31
+0.0
+12
+0.733707760462408
+22
+1.57547319805376
+32
+0.0
+13
+0.733707760462408
+23
+1.57547319805376
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.733707760462408
+21
+1.57547319805376
+31
+0.0
+12
+0.73
+22
+1.5
+32
+0.0
+13
+0.73
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.205
+20
+3.0
+30
+0.0
+11
+0.955527778486358
+21
+2.04447222151364
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+2.04447222151364
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.0
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+2.04447222151364
+30
+0.0
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+1.01151717119399
+22
+2.09521804908931
+32
+0.0
+13
+1.01151717119399
+23
+2.09521804908931
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.01151717119399
+20
+2.09521804908931
+30
+0.0
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+1.07221092057491
+22
+2.14023160147296
+32
+0.0
+13
+1.07221092057491
+23
+2.14023160147296
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.85976839852704
+20
+1.07221092057491
+30
+0.0
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.0
+22
+0.497732043121051
+32
+0.0
+13
+0.0
+23
+0.497732043121051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.0
+30
+0.0
+11
+0.85976839852704
+21
+1.07221092057491
+31
+0.0
+12
+0.904781950910692
+22
+1.01151717119399
+32
+0.0
+13
+0.904781950910692
+23
+1.01151717119399
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+0.0
+30
+0.0
+11
+0.904781950910692
+21
+1.01151717119399
+31
+0.0
+12
+0.955527778486358
+22
+0.955527778486358
+32
+0.0
+13
+0.955527778486358
+23
+0.955527778486358
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.795
+20
+0.0
+30
+2.795
+11
+2.12132034355964
+21
+0.0
+31
+2.17367965644036
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+2.17367965644036
+11
+2.795
+21
+0.0
+31
+2.795
+12
+2.12132034355964
+22
+0.0
+32
+2.795
+13
+2.12132034355964
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.795
+20
+0.0
+30
+0.205
+11
+2.50226795687895
+21
+0.0
+31
+0.0
+12
+2.795
+22
+0.0
+32
+0.0
+13
+2.795
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+2.12132034355964
+22
+0.0
+32
+0.0
+13
+2.12132034355964
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+2.12132034355964
+22
+0.0
+32
+0.205
+13
+2.12132034355964
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.795
+20
+0.0
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+2.795
+11
+2.795
+21
+0.0
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+3.0
+13
+2.12132034355964
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+3.0
+12
+2.50226795687895
+22
+0.0
+32
+3.0
+13
+2.50226795687895
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.795
+20
+0.0
+30
+1.5
+11
+2.12132034355964
+21
+0.0
+31
+0.205
+12
+2.795
+22
+0.0
+32
+0.205
+13
+2.795
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+0.0
+30
+0.205
+11
+2.795
+21
+0.0
+31
+1.5
+12
+2.12132034355964
+22
+0.0
+32
+0.826320343559644
+13
+2.12132034355964
+23
+0.0
+33
+0.826320343559644
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.0
+30
+0.205
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+0.0
+12
+1.5
+22
+0.0
+32
+0.0
+13
+1.5
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.878679656440357
+22
+0.0
+32
+0.0
+13
+0.878679656440357
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440357
+20
+0.0
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.878679656440357
+22
+3.68628738645072e-18
+32
+0.205
+13
+0.878679656440357
+23
+3.68628738645072e-18
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440357
+20
+5.18248638448071e-17
+30
+2.795
+11
+0.878679656440357
+21
+4.01154803819637e-17
+31
+2.17367965644036
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440357
+20
+1.53956708492942e-17
+30
+0.826320343559643
+11
+0.878679656440357
+21
+3.68628738645072e-18
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.795
+20
+0.0
+30
+2.795
+11
+3.0
+21
+0.0
+31
+3.0
+12
+2.795
+22
+0.0
+32
+3.0
+13
+2.795
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.0
+30
+0.205
+11
+2.795
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.795
+20
+0.0
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.205
+12
+2.795
+22
+0.0
+32
+0.205
+13
+2.795
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.0
+30
+2.795
+11
+2.795
+21
+0.0
+31
+1.5
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.795
+20
+0.0
+30
+1.5
+11
+3.0
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.0
+30
+3.0
+11
+0.878679656440357
+21
+5.18248638448071e-17
+31
+2.795
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440357
+20
+5.18248638448071e-17
+30
+2.795
+11
+1.5
+21
+0.0
+31
+3.0
+12
+0.878679656440357
+22
+1.11022302462516e-16
+32
+3.0
+13
+0.878679656440357
+23
+1.11022302462516e-16
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440357
+20
+1.11022302462516e-16
+30
+3.0
+11
+1.5
+21
+0.0
+31
+3.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+3.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+3.0
+20
+0.0
+30
+1.5
+11
+2.795
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.795
+20
+0.0
+30
+0.205
+11
+3.0
+21
+0.0
+31
+1.5
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+3.0
+30
+0.205
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.12132034355964
+22
+3.0
+32
+0.205
+13
+2.12132034355964
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+3.0
+30
+2.795
+11
+2.12132034355964
+21
+3.0
+31
+2.17367965644036
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+3.0
+30
+2.795
+11
+2.12132034355964
+21
+3.0
+31
+0.826320343559643
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+3.0
+30
+0.826320343559643
+11
+1.5
+21
+3.0
+31
+2.795
+12
+2.12132034355964
+22
+3.0
+32
+2.17367965644036
+13
+2.12132034355964
+23
+3.0
+33
+2.17367965644036
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+3.0
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+2.795
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+3.0
+30
+2.795
+11
+1.5
+21
+3.0
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.79836855106949
+22
+3.0
+32
+3.0
+13
+1.79836855106949
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+2.17367965644036
+11
+0.878679656440356
+21
+3.0
+31
+0.826320343559644
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+star_u
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.878679656440356
+21
+3.0
+31
+0.205
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+0.205
+11
+0.205
+21
+3.0
+31
+1.5
+12
+0.878679656440356
+22
+3.0
+32
+0.826320343559644
+13
+0.878679656440356
+23
+3.0
+33
+0.826320343559644
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.205
+20
+3.0
+30
+2.795
+11
+0.878679656440356
+21
+3.0
+31
+2.17367965644036
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+2.17367965644036
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.878679656440356
+22
+3.0
+32
+2.795
+13
+0.878679656440356
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.0
+20
+3.0
+30
+0.205
+11
+0.205
+21
+3.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.205
+20
+3.0
+30
+0.0
+11
+0.0
+21
+3.0
+31
+0.205
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+0.205
+22
+3.0
+32
+0.0
+13
+0.205
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.497732043121052
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.878679656440356
+22
+3.0
+32
+0.0
+13
+0.878679656440356
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.878679656440356
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.878679656440356
+22
+3.0
+32
+0.205
+13
+0.878679656440356
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+2.21138724003369
+21
+1.20533375707888
+31
+1.5
+12
+2.09521804908931
+22
+1.01151717119399
+32
+1.5
+13
+2.09521804908931
+23
+1.01151717119399
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.09521804908931
+20
+1.01151717119399
+30
+1.5
+11
+2.21138724003369
+21
+1.20533375707888
+31
+1.5
+12
+2.14023160147296
+22
+1.07221092057491
+32
+1.5
+13
+2.14023160147296
+23
+1.07221092057491
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.14023160147296
+20
+1.07221092057491
+30
+1.5
+11
+2.21138724003369
+21
+1.20533375707888
+31
+1.5
+12
+2.17907937354823
+22
+1.13702451264398
+32
+1.5
+13
+2.17907937354823
+23
+1.13702451264398
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.79466624292112
+30
+3.0
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.788612759966309
+22
+1.79466624292112
+32
+1.5
+13
+0.788612759966309
+23
+1.79466624292112
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.788612759966309
+21
+1.79466624292112
+31
+3.0
+12
+2.21138724003369
+22
+1.20533375707888
+32
+1.5
+13
+2.21138724003369
+23
+1.20533375707888
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+0.788612759966309
+21
+1.79466624292112
+31
+3.0
+12
+2.21138724003369
+22
+1.20533375707888
+32
+3.0
+13
+2.21138724003369
+23
+1.20533375707888
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.20533375707888
+30
+3.0
+11
+0.788612759966309
+21
+1.79466624292112
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.27648079851406
+20
+2.2368440585138
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.20533375707888
+22
+2.21138724003369
+32
+1.5
+13
+1.20533375707888
+23
+2.21138724003369
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.27648079851406
+21
+2.2368440585138
+31
+1.5
+12
+1.34978045204758
+22
+2.25520466591049
+32
+1.5
+13
+1.34978045204758
+23
+2.25520466591049
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.34978045204758
+21
+2.25520466591049
+31
+1.5
+12
+1.42452680194624
+22
+2.26629223953759
+32
+1.5
+13
+1.42452680194624
+23
+2.26629223953759
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.42452680194624
+21
+2.26629223953759
+31
+1.5
+12
+1.5
+22
+2.27
+32
+1.5
+13
+1.5
+23
+2.27
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.733707760462408
+21
+1.42452680194624
+31
+1.5
+12
+0.73
+22
+1.5
+32
+1.5
+13
+0.73
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.733707760462408
+20
+1.42452680194624
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.744795334089513
+22
+1.34978045204758
+32
+1.5
+13
+0.744795334089513
+23
+1.34978045204758
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.744795334089513
+20
+1.34978045204758
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.763155941486199
+22
+1.27648079851406
+32
+1.5
+13
+0.763155941486199
+23
+1.27648079851406
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.763155941486199
+20
+1.27648079851406
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.788612759966309
+22
+1.20533375707888
+32
+1.5
+13
+0.788612759966309
+23
+1.20533375707888
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.20533375707888
+21
+0.788612759966309
+31
+3.0
+12
+1.20533375707888
+22
+0.788612759966309
+32
+1.5
+13
+1.20533375707888
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.20533375707888
+20
+0.788612759966309
+30
+3.0
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.79466624292112
+22
+2.21138724003369
+32
+1.5
+13
+1.79466624292112
+23
+2.21138724003369
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.79466624292112
+21
+2.21138724003369
+31
+1.5
+12
+1.79466624292112
+22
+2.21138724003369
+32
+3.0
+13
+1.79466624292112
+23
+2.21138724003369
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.01151717119399
+20
+2.09521804908931
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.955527778486358
+22
+2.04447222151364
+32
+1.5
+13
+0.955527778486358
+23
+2.04447222151364
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.01151717119399
+21
+2.09521804908931
+31
+1.5
+12
+1.07221092057491
+22
+2.14023160147296
+32
+1.5
+13
+1.07221092057491
+23
+2.14023160147296
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.07221092057491
+21
+2.14023160147296
+31
+1.5
+12
+1.13702451264398
+22
+2.17907937354823
+32
+1.5
+13
+1.13702451264398
+23
+2.17907937354823
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.13702451264398
+21
+2.17907937354823
+31
+1.5
+12
+1.20533375707888
+22
+2.21138724003369
+32
+1.5
+13
+1.20533375707888
+23
+2.21138724003369
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.27648079851406
+21
+0.763155941486199
+31
+1.5
+12
+1.20533375707888
+22
+0.788612759966309
+32
+1.5
+13
+1.20533375707888
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.27648079851406
+20
+0.763155941486199
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.34978045204758
+22
+0.744795334089513
+32
+1.5
+13
+1.34978045204758
+23
+0.744795334089513
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.34978045204758
+20
+0.744795334089513
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.42452680194624
+22
+0.733707760462408
+32
+1.5
+13
+1.42452680194624
+23
+0.733707760462408
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.42452680194624
+20
+0.733707760462408
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+0.73
+32
+1.5
+13
+1.5
+23
+0.73
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.79466624292112
+21
+0.788612759966309
+31
+3.0
+12
+1.79466624292112
+22
+0.788612759966309
+32
+1.5
+13
+1.79466624292112
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+0.788612759966309
+30
+3.0
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.20533375707888
+22
+2.21138724003369
+32
+1.5
+13
+1.20533375707888
+23
+2.21138724003369
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.20533375707888
+21
+2.21138724003369
+31
+1.5
+12
+1.20533375707888
+22
+2.21138724003369
+32
+3.0
+13
+1.20533375707888
+23
+2.21138724003369
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.01151717119399
+21
+0.904781950910692
+31
+1.5
+12
+0.955527778486358
+22
+0.955527778486358
+32
+1.5
+13
+0.955527778486358
+23
+0.955527778486358
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.01151717119399
+20
+0.904781950910692
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.07221092057491
+22
+0.85976839852704
+32
+1.5
+13
+1.07221092057491
+23
+0.85976839852704
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.07221092057491
+20
+0.85976839852704
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.13702451264398
+22
+0.820920626451767
+32
+1.5
+13
+1.13702451264398
+23
+0.820920626451767
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.13702451264398
+20
+0.820920626451767
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.20533375707888
+22
+0.788612759966309
+32
+1.5
+13
+1.20533375707888
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.27
+20
+1.5
+30
+1.5
+11
+2.21138724003369
+21
+1.20533375707888
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+2.27
+21
+1.5
+31
+1.5
+12
+2.2368440585138
+22
+1.27648079851406
+32
+1.5
+13
+2.2368440585138
+23
+1.27648079851406
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.2368440585138
+20
+1.27648079851406
+30
+1.5
+11
+2.27
+21
+1.5
+31
+1.5
+12
+2.25520466591049
+22
+1.34978045204758
+32
+1.5
+13
+2.25520466591049
+23
+1.34978045204758
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.25520466591049
+20
+1.34978045204758
+30
+1.5
+11
+2.27
+21
+1.5
+31
+1.5
+12
+2.26629223953759
+22
+1.42452680194624
+32
+1.5
+13
+2.26629223953759
+23
+1.42452680194624
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.788612759966309
+20
+1.20533375707888
+30
+3.0
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.788612759966309
+22
+1.20533375707888
+32
+1.5
+13
+0.788612759966309
+23
+1.20533375707888
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.788612759966309
+21
+1.20533375707888
+31
+3.0
+12
+2.21138724003369
+22
+1.79466624292112
+32
+1.5
+13
+2.21138724003369
+23
+1.79466624292112
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+0.788612759966309
+21
+1.20533375707888
+31
+3.0
+12
+2.21138724003369
+22
+1.79466624292112
+32
+3.0
+13
+2.21138724003369
+23
+1.79466624292112
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+3.0
+11
+0.788612759966309
+21
+1.20533375707888
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+2.27
+21
+1.5
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.27
+20
+1.5
+30
+1.5
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+2.2368440585138
+22
+1.72351920148594
+32
+1.5
+13
+2.2368440585138
+23
+1.72351920148594
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.27
+20
+1.5
+30
+1.5
+11
+2.2368440585138
+21
+1.72351920148594
+31
+1.5
+12
+2.25520466591049
+22
+1.65021954795242
+32
+1.5
+13
+2.25520466591049
+23
+1.65021954795242
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.27
+20
+1.5
+30
+1.5
+11
+2.25520466591049
+21
+1.65021954795242
+31
+1.5
+12
+2.26629223953759
+22
+1.57547319805376
+32
+1.5
+13
+2.26629223953759
+23
+1.57547319805376
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.733707760462408
+20
+1.57547319805376
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.73
+22
+1.5
+32
+1.5
+13
+0.73
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.733707760462408
+21
+1.57547319805376
+31
+1.5
+12
+0.744795334089513
+22
+1.65021954795242
+32
+1.5
+13
+0.744795334089513
+23
+1.65021954795242
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.744795334089513
+21
+1.65021954795242
+31
+1.5
+12
+0.763155941486199
+22
+1.72351920148594
+32
+1.5
+13
+0.763155941486199
+23
+1.72351920148594
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.763155941486199
+21
+1.72351920148594
+31
+1.5
+12
+0.788612759966309
+22
+1.79466624292112
+32
+1.5
+13
+0.788612759966309
+23
+1.79466624292112
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.27
+20
+1.5
+30
+3.0
+11
+1.5
+21
+1.5
+31
+1.5
+12
+2.27
+22
+1.5
+32
+1.5
+13
+2.27
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+2.27
+21
+1.5
+31
+3.0
+12
+0.73
+22
+1.5
+32
+1.5
+13
+0.73
+23
+1.5
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.73
+20
+1.5
+30
+1.5
+11
+2.27
+21
+1.5
+31
+3.0
+12
+0.73
+22
+1.5
+32
+3.0
+13
+0.73
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.73
+20
+1.5
+30
+3.0
+11
+2.27
+21
+1.5
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.820920626451767
+20
+1.86297548735602
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.788612759966309
+22
+1.79466624292112
+32
+1.5
+13
+0.788612759966309
+23
+1.79466624292112
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.820920626451767
+21
+1.86297548735602
+31
+1.5
+12
+0.85976839852704
+22
+1.92778907942509
+32
+1.5
+13
+0.85976839852704
+23
+1.92778907942509
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.85976839852704
+21
+1.92778907942509
+31
+1.5
+12
+0.904781950910692
+22
+1.98848282880601
+32
+1.5
+13
+0.904781950910692
+23
+1.98848282880601
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.904781950910692
+21
+1.98848282880601
+31
+1.5
+12
+0.955527778486358
+22
+2.04447222151364
+32
+1.5
+13
+0.955527778486358
+23
+2.04447222151364
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+1.79466624292112
+21
+0.788612759966309
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+0.788612759966309
+30
+1.5
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+1.86297548735602
+22
+0.820920626451767
+32
+1.5
+13
+1.86297548735602
+23
+0.820920626451767
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.86297548735602
+20
+0.820920626451767
+30
+1.5
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+1.92778907942509
+22
+0.85976839852704
+32
+1.5
+13
+1.92778907942509
+23
+0.85976839852704
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.92778907942509
+20
+0.85976839852704
+30
+1.5
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+1.98848282880601
+22
+0.904781950910693
+32
+1.5
+13
+1.98848282880601
+23
+0.904781950910693
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+2.04447222151364
+22
+0.955527778486358
+32
+3.0
+13
+2.04447222151364
+23
+0.955527778486358
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.955527778486358
+22
+2.04447222151364
+32
+1.5
+13
+0.955527778486358
+23
+2.04447222151364
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+2.04447222151364
+30
+1.5
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.955527778486358
+22
+2.04447222151364
+32
+3.0
+13
+0.955527778486358
+23
+2.04447222151364
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+0.788612759966309
+30
+1.5
+11
+1.5
+21
+0.73
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.73
+30
+1.5
+11
+1.79466624292112
+21
+0.788612759966309
+31
+1.5
+12
+1.57547319805376
+22
+0.733707760462408
+32
+1.5
+13
+1.57547319805376
+23
+0.733707760462408
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.57547319805376
+20
+0.733707760462408
+30
+1.5
+11
+1.79466624292112
+21
+0.788612759966309
+31
+1.5
+12
+1.65021954795242
+22
+0.744795334089513
+32
+1.5
+13
+1.65021954795242
+23
+0.744795334089513
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.65021954795242
+20
+0.744795334089513
+30
+1.5
+11
+1.79466624292112
+21
+0.788612759966309
+31
+1.5
+12
+1.72351920148594
+22
+0.763155941486199
+32
+1.5
+13
+1.72351920148594
+23
+0.763155941486199
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.57547319805376
+20
+2.26629223953759
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+2.27
+32
+1.5
+13
+1.5
+23
+2.27
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.57547319805376
+21
+2.26629223953759
+31
+1.5
+12
+1.79466624292112
+22
+2.21138724003369
+32
+1.5
+13
+1.79466624292112
+23
+2.21138724003369
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+2.21138724003369
+30
+1.5
+11
+1.57547319805376
+21
+2.26629223953759
+31
+1.5
+12
+1.65021954795242
+22
+2.25520466591049
+32
+1.5
+13
+1.65021954795242
+23
+2.25520466591049
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+2.21138724003369
+30
+1.5
+11
+1.65021954795242
+21
+2.25520466591049
+31
+1.5
+12
+1.72351920148594
+22
+2.2368440585138
+32
+1.5
+13
+1.72351920148594
+23
+2.2368440585138
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.5
+21
+0.73
+31
+3.0
+12
+1.5
+22
+0.73
+32
+1.5
+13
+1.5
+23
+0.73
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+0.73
+30
+3.0
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+2.27
+32
+1.5
+13
+1.5
+23
+2.27
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.5
+21
+2.27
+31
+1.5
+12
+1.5
+22
+2.27
+32
+3.0
+13
+1.5
+23
+2.27
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.820920626451767
+21
+1.13702451264398
+31
+1.5
+12
+0.788612759966309
+22
+1.20533375707888
+32
+1.5
+13
+0.788612759966309
+23
+1.20533375707888
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.820920626451767
+20
+1.13702451264398
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.85976839852704
+22
+1.07221092057491
+32
+1.5
+13
+0.85976839852704
+23
+1.07221092057491
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.85976839852704
+20
+1.07221092057491
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.904781950910692
+22
+1.01151717119399
+32
+1.5
+13
+0.904781950910692
+23
+1.01151717119399
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+0.904781950910692
+20
+1.01151717119399
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.955527778486358
+22
+0.955527778486358
+32
+1.5
+13
+0.955527778486358
+23
+0.955527778486358
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.79466624292112
+20
+2.21138724003369
+30
+1.5
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+1.79466624292112
+21
+2.21138724003369
+31
+1.5
+12
+1.86297548735602
+22
+2.17907937354823
+32
+1.5
+13
+1.86297548735602
+23
+2.17907937354823
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+1.86297548735602
+21
+2.17907937354823
+31
+1.5
+12
+1.92778907942509
+22
+2.14023160147296
+32
+1.5
+13
+1.92778907942509
+23
+2.14023160147296
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+1.92778907942509
+21
+2.14023160147296
+31
+1.5
+12
+1.98848282880601
+22
+2.09521804908931
+32
+1.5
+13
+1.98848282880601
+23
+2.09521804908931
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.955527778486358
+21
+0.955527778486358
+31
+3.0
+12
+0.955527778486358
+22
+0.955527778486358
+32
+1.5
+13
+0.955527778486358
+23
+0.955527778486358
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_u
+10
+0.955527778486358
+20
+0.955527778486358
+30
+3.0
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.5
+21
+1.5
+31
+1.5
+12
+2.04447222151364
+22
+2.04447222151364
+32
+1.5
+13
+2.04447222151364
+23
+2.04447222151364
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_u
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+2.04447222151364
+22
+2.04447222151364
+32
+3.0
+13
+2.04447222151364
+23
+2.04447222151364
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486359
+20
+0.955527778486358
+30
+1.20736753927986e-15
+11
+0.205000000000001
+21
+0.0
+31
+-1.16573417585641e-15
+12
+1.19348975147204e-15
+22
+0.0
+32
+-1.16573417585641e-15
+13
+1.19348975147204e-15
+23
+0.0
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.205000000000001
+20
+0.0
+30
+-1.16573417585641e-15
+11
+0.955527778486359
+21
+0.955527778486358
+31
+1.20736753927986e-15
+12
+0.497732043121054
+22
+0.0
+32
+1.19348975147204e-15
+13
+0.497732043121054
+23
+0.0
+33
+1.19348975147204e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.497732043121054
+20
+0.0
+30
+1.19348975147204e-15
+11
+0.955527778486359
+21
+0.955527778486358
+31
+1.20736753927986e-15
+12
+1.01151717119399
+22
+0.904781950910693
+32
+6.38378239159465e-16
+13
+1.01151717119399
+23
+0.904781950910693
+33
+6.38378239159465e-16
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+0.497732043121054
+20
+0.0
+30
+1.19348975147204e-15
+11
+1.01151717119399
+21
+0.904781950910693
+31
+6.38378239159465e-16
+12
+1.07221092057491
+22
+0.85976839852704
+32
+-1.38777878078145e-17
+13
+1.07221092057491
+23
+0.85976839852704
+33
+-1.38777878078145e-17
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.50226795687895
+20
+3.0
+30
+1.19348975147204e-15
+11
+1.98848282880601
+21
+2.09521804908931
+31
+-8.46545056276682e-16
+12
+1.92778907942509
+22
+2.14023160147296
+32
+-1.02695629777827e-15
+13
+1.92778907942509
+23
+2.14023160147296
+33
+-1.02695629777827e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.98848282880601
+20
+2.09521804908931
+30
+-8.46545056276682e-16
+11
+2.50226795687895
+21
+3.0
+31
+1.19348975147204e-15
+12
+2.04447222151364
+22
+2.04447222151364
+32
+-1.11022302462516e-16
+13
+2.04447222151364
+23
+2.04447222151364
+33
+-1.11022302462516e-16
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+-1.11022302462516e-16
+11
+2.50226795687895
+21
+3.0
+31
+1.19348975147204e-15
+12
+3.0
+22
+3.0
+32
+1.19348975147204e-15
+13
+3.0
+23
+3.0
+33
+1.19348975147204e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+3.0
+30
+1.19348975147204e-15
+11
+2.50226795687895
+21
+3.0
+31
+1.19348975147204e-15
+12
+2.795
+22
+3.0
+32
+-1.16573417585641e-15
+13
+2.795
+23
+3.0
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+1.79836855106949
+30
+1.19348975147204e-15
+11
+2.26629223953759
+21
+1.57547319805376
+31
+-1.11022302462516e-16
+12
+2.25520466591049
+22
+1.65021954795242
+32
+-1.2490009027033e-15
+13
+2.25520466591049
+23
+1.65021954795242
+33
+-1.2490009027033e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.26629223953759
+20
+1.57547319805376
+30
+-1.11022302462516e-16
+11
+3.0
+21
+1.79836855106949
+31
+1.19348975147204e-15
+12
+2.27
+22
+1.5
+32
+-2.35922392732846e-16
+13
+2.27
+23
+1.5
+33
+-2.35922392732846e-16
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+-2.35922392732846e-16
+11
+3.0
+21
+1.79836855106949
+31
+1.19348975147204e-15
+12
+3.0
+22
+1.5
+32
+1.19348975147204e-15
+13
+3.0
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+3.0
+30
+6.93889390390723e-16
+11
+1.34978045204758
+21
+2.25520466591049
+31
+-4.02455846426619e-16
+12
+1.20163144893051
+22
+3.0
+32
+1.19348975147204e-15
+13
+1.20163144893051
+23
+3.0
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.34978045204758
+20
+2.25520466591049
+30
+-4.02455846426619e-16
+11
+1.5
+21
+3.0
+31
+6.93889390390723e-16
+12
+1.42452680194624
+22
+2.26629223953759
+32
+-6.93889390390723e-16
+13
+1.42452680194624
+23
+2.26629223953759
+33
+-6.93889390390723e-16
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.42452680194624
+20
+2.26629223953759
+30
+-6.93889390390723e-16
+11
+1.5
+21
+3.0
+31
+6.93889390390723e-16
+12
+1.5
+22
+2.27
+32
+6.93889390390723e-16
+13
+1.5
+23
+2.27
+33
+6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486359
+20
+2.04447222151364
+30
+1.20736753927986e-15
+11
+1.33226762955019e-15
+21
+2.50226795687895
+31
+1.19348975147204e-15
+12
+1.19348975147204e-15
+22
+3.0
+32
+-1.16573417585641e-15
+13
+1.19348975147204e-15
+23
+3.0
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.33226762955019e-15
+20
+2.50226795687895
+30
+1.19348975147204e-15
+11
+0.955527778486359
+21
+2.04447222151364
+31
+1.20736753927986e-15
+12
+0.904781950910692
+22
+1.98848282880601
+32
+1.31838984174237e-15
+13
+0.904781950910692
+23
+1.98848282880601
+33
+1.31838984174237e-15
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.33226762955019e-15
+20
+2.50226795687895
+30
+1.19348975147204e-15
+11
+0.904781950910692
+21
+1.98848282880601
+31
+1.31838984174237e-15
+12
+0.859768398527041
+22
+1.92778907942509
+32
+8.74300631892311e-16
+13
+0.859768398527041
+23
+1.92778907942509
+33
+8.74300631892311e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.09521804908931
+20
+1.01151717119399
+30
+7.63278329429795e-16
+11
+3.0
+21
+0.0
+31
+1.19348975147204e-15
+12
+2.04447222151364
+22
+0.955527778486358
+32
+-1.11022302462516e-16
+13
+2.04447222151364
+23
+0.955527778486358
+33
+-1.11022302462516e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.0
+30
+1.19348975147204e-15
+11
+2.09521804908931
+21
+1.01151717119399
+31
+7.63278329429795e-16
+12
+2.14023160147296
+22
+1.07221092057491
+32
+-9.71445146547012e-16
+13
+2.14023160147296
+23
+1.07221092057491
+33
+-9.71445146547012e-16
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.0
+30
+1.19348975147204e-15
+11
+2.14023160147296
+21
+1.07221092057491
+31
+-9.71445146547012e-16
+12
+3.0
+22
+0.497732043121051
+32
+1.19348975147204e-15
+13
+3.0
+23
+0.497732043121051
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+5.55111512312578e-17
+30
+0.826320343559641
+11
+1.5
+21
+0.0
+31
+2.795
+12
+1.5
+22
+0.0
+32
+0.204999999999999
+13
+1.5
+23
+0.0
+33
+0.204999999999999
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.12132034355964
+21
+5.55111512312578e-17
+31
+0.826320343559641
+12
+2.12132034355964
+22
+5.55111512312578e-17
+32
+2.17367965644036
+13
+2.12132034355964
+23
+5.55111512312578e-17
+33
+2.17367965644036
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+3.0
+11
+1.72351920148594
+21
+0.763155941486199
+31
+3.0
+12
+1.65021954795242
+22
+0.744795334089513
+32
+3.0
+13
+1.65021954795242
+23
+0.744795334089513
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.72351920148594
+20
+0.763155941486199
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.79466624292112
+22
+0.788612759966309
+32
+3.0
+13
+1.79466624292112
+23
+0.788612759966309
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+0.788612759966309
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+2.12132034355964
+22
+1.11022302462516e-16
+32
+3.0
+13
+2.12132034355964
+23
+1.11022302462516e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440357
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+2.795
+12
+0.878679656440357
+22
+3.0
+32
+2.795
+13
+0.878679656440357
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.878679656440357
+21
+3.0
+31
+3.0
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+2.795
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+2
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+3.0
+11
+1.07221092057491
+21
+0.85976839852704
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.07221092057491
+20
+0.85976839852704
+30
+3.0
+11
+0.878679656440356
+21
+0.0
+31
+3.0
+12
+1.13702451264398
+22
+0.820920626451767
+32
+3.0
+13
+1.13702451264398
+23
+0.820920626451767
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.13702451264398
+20
+0.820920626451767
+30
+3.0
+11
+0.878679656440356
+21
+0.0
+31
+3.0
+12
+1.20533375707888
+22
+0.788612759966309
+32
+3.0
+13
+1.20533375707888
+23
+0.788612759966309
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+1.79836855106949
+30
+1.19348975147204e-15
+11
+3.0
+21
+1.5
+31
+3.0
+12
+3.0
+22
+1.5
+32
+1.19348975147204e-15
+13
+3.0
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+1.5
+30
+3.0
+11
+3.0
+21
+1.79836855106949
+31
+1.19348975147204e-15
+12
+3.0
+22
+1.79836855106949
+32
+3.0
+13
+3.0
+23
+1.79836855106949
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+3.0
+21
+1.79836855106949
+31
+1.19348975147204e-15
+12
+3.0
+22
+2.12132034355964
+32
+1.19348975147204e-15
+13
+3.0
+23
+2.12132034355964
+33
+1.19348975147204e-15
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+3.0
+21
+2.12132034355964
+31
+1.19348975147204e-15
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+1.20163144893051
+30
+3.0
+11
+1.19348975147204e-15
+21
+0.878679656440358
+31
+-1.16573417585641e-15
+12
+2.77555756156289e-16
+22
+0.878679656440358
+32
+3.0
+13
+2.77555756156289e-16
+23
+0.878679656440358
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+0.878679656440358
+30
+-1.16573417585641e-15
+11
+2.77555756156289e-16
+21
+1.20163144893051
+31
+3.0
+12
+1.33226762955019e-15
+22
+1.20163144893051
+32
+1.19348975147204e-15
+13
+1.33226762955019e-15
+23
+1.20163144893051
+33
+1.19348975147204e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.33226762955019e-15
+20
+1.20163144893051
+30
+1.19348975147204e-15
+11
+2.77555756156289e-16
+21
+1.20163144893051
+31
+3.0
+12
+2.77555756156289e-16
+22
+1.5
+32
+3.0
+13
+2.77555756156289e-16
+23
+1.5
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.33226762955019e-15
+20
+1.20163144893051
+30
+1.19348975147204e-15
+11
+2.77555756156289e-16
+21
+1.5
+31
+3.0
+12
+1.19348975147204e-15
+22
+1.5
+32
+-1.16573417585641e-15
+13
+1.19348975147204e-15
+23
+1.5
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.2368440585138
+20
+1.72351920148594
+30
+3.0
+11
+3.0
+21
+2.12132034355964
+31
+3.0
+12
+2.21138724003369
+22
+1.79466624292112
+32
+3.0
+13
+2.21138724003369
+23
+1.79466624292112
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.2368440585138
+21
+1.72351920148594
+31
+3.0
+12
+2.25520466591049
+22
+1.65021954795242
+32
+3.0
+13
+2.25520466591049
+23
+1.65021954795242
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.25520466591049
+21
+1.65021954795242
+31
+3.0
+12
+3.0
+22
+1.79836855106949
+32
+3.0
+13
+3.0
+23
+1.79836855106949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.57547319805376
+20
+0.733707760462408
+30
+1.38777878078145e-16
+11
+1.5
+21
+0.0
+31
+6.93889390390723e-16
+12
+1.5
+22
+0.73
+32
+6.93889390390723e-16
+13
+1.5
+23
+0.73
+33
+6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.0
+30
+6.93889390390723e-16
+11
+1.57547319805376
+21
+0.733707760462408
+31
+1.38777878078145e-16
+12
+1.79836855106949
+22
+5.55111512312578e-17
+32
+1.19348975147204e-15
+13
+1.79836855106949
+23
+5.55111512312578e-17
+33
+1.19348975147204e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+1.19348975147204e-15
+11
+1.57547319805376
+21
+0.733707760462408
+31
+1.38777878078145e-16
+12
+1.65021954795242
+22
+0.744795334089513
+32
+-3.60822483003176e-16
+13
+1.65021954795242
+23
+0.744795334089513
+33
+-3.60822483003176e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+2.17907937354823
+21
+1.13702451264398
+31
+3.0
+12
+2.14023160147296
+22
+1.07221092057491
+32
+3.0
+13
+2.14023160147296
+23
+1.07221092057491
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.17907937354823
+20
+1.13702451264398
+30
+3.0
+11
+3.0
+21
+0.497732043121051
+31
+3.0
+12
+2.21138724003369
+22
+1.20533375707888
+32
+3.0
+13
+2.21138724003369
+23
+1.20533375707888
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.20533375707888
+30
+3.0
+11
+3.0
+21
+0.497732043121051
+31
+3.0
+12
+3.0
+22
+0.878679656440356
+32
+3.0
+13
+3.0
+23
+0.878679656440356
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.788612759966309
+20
+1.20533375707888
+30
+3.0
+11
+2.77555756156289e-16
+21
+1.20163144893051
+31
+3.0
+12
+2.77555756156289e-16
+22
+0.878679656440358
+32
+3.0
+13
+2.77555756156289e-16
+23
+0.878679656440358
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+1.20163144893051
+30
+3.0
+11
+0.788612759966309
+21
+1.20533375707888
+31
+3.0
+12
+0.763155941486199
+22
+1.27648079851406
+32
+3.0
+13
+0.763155941486199
+23
+1.27648079851406
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+1.20163144893051
+30
+3.0
+11
+0.763155941486199
+21
+1.27648079851406
+31
+3.0
+12
+0.744795334089513
+22
+1.34978045204758
+32
+3.0
+13
+0.744795334089513
+23
+1.34978045204758
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.73
+20
+1.5
+30
+7.07767178198537e-16
+11
+1.33226762955019e-15
+21
+1.20163144893051
+31
+1.19348975147204e-15
+12
+1.19348975147204e-15
+22
+1.5
+32
+-1.16573417585641e-15
+13
+1.19348975147204e-15
+23
+1.5
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.33226762955019e-15
+20
+1.20163144893051
+30
+1.19348975147204e-15
+11
+0.73
+21
+1.5
+31
+7.07767178198537e-16
+12
+0.733707760462409
+22
+1.42452680194624
+32
+4.16333634234434e-16
+13
+0.733707760462409
+23
+1.42452680194624
+33
+4.16333634234434e-16
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.33226762955019e-15
+20
+1.20163144893051
+30
+1.19348975147204e-15
+11
+0.733707760462409
+21
+1.42452680194624
+31
+4.16333634234434e-16
+12
+0.744795334089513
+22
+1.34978045204758
+32
+4.71844785465692e-16
+13
+0.744795334089513
+23
+1.34978045204758
+33
+4.71844785465692e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.205000000000001
+20
+0.0
+30
+2.795
+11
+1.19348975147204e-15
+21
+0.0
+31
+1.5
+12
+0.205000000000001
+22
+0.0
+32
+1.5
+13
+0.205000000000001
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+0.0
+30
+1.5
+11
+0.205000000000001
+21
+0.0
+31
+2.795
+12
+1.19348975147204e-15
+22
+0.0
+32
+2.795
+13
+1.19348975147204e-15
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+2.50226795687895
+30
+3.0
+11
+1.19348975147204e-15
+21
+2.12132034355964
+31
+-1.16573417585641e-15
+12
+2.77555756156289e-16
+22
+2.12132034355964
+32
+3.0
+13
+2.77555756156289e-16
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+2.12132034355964
+30
+-1.16573417585641e-15
+11
+2.77555756156289e-16
+21
+2.50226795687895
+31
+3.0
+12
+1.33226762955019e-15
+22
+2.50226795687895
+32
+1.19348975147204e-15
+13
+1.33226762955019e-15
+23
+2.50226795687895
+33
+1.19348975147204e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.33226762955019e-15
+20
+2.50226795687895
+30
+1.19348975147204e-15
+11
+2.77555756156289e-16
+21
+2.50226795687895
+31
+3.0
+12
+2.77555756156289e-16
+22
+3.0
+32
+3.0
+13
+2.77555756156289e-16
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.33226762955019e-15
+20
+2.50226795687895
+30
+1.19348975147204e-15
+11
+2.77555756156289e-16
+21
+3.0
+31
+3.0
+12
+1.19348975147204e-15
+22
+3.0
+32
+-1.16573417585641e-15
+13
+1.19348975147204e-15
+23
+3.0
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.92778907942509
+20
+2.14023160147296
+30
+-1.02695629777827e-15
+11
+2.04447222151364
+21
+2.04447222151364
+31
+-1.11022302462516e-16
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+-1.11022302462516e-16
+11
+1.92778907942509
+21
+2.14023160147296
+31
+-1.02695629777827e-15
+12
+1.98848282880601
+22
+2.09521804908931
+32
+-8.46545056276682e-16
+13
+1.98848282880601
+23
+2.09521804908931
+33
+-8.46545056276682e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20533375707888
+20
+2.21138724003369
+30
+3.0
+11
+1.20163144893051
+21
+3.0
+31
+3.0
+12
+0.878679656440357
+22
+3.0
+32
+3.0
+13
+0.878679656440357
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20163144893051
+20
+3.0
+30
+3.0
+11
+1.20533375707888
+21
+2.21138724003369
+31
+3.0
+12
+1.27648079851406
+22
+2.2368440585138
+32
+3.0
+13
+1.27648079851406
+23
+2.2368440585138
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20163144893051
+20
+3.0
+30
+3.0
+11
+1.27648079851406
+21
+2.2368440585138
+31
+3.0
+12
+1.34978045204758
+22
+2.25520466591049
+32
+3.0
+13
+1.34978045204758
+23
+2.25520466591049
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.497732043121051
+30
+1.19348975147204e-15
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+1.19348975147204e-15
+13
+3.0
+23
+0.0
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.0
+30
+3.0
+11
+3.0
+21
+0.497732043121051
+31
+1.19348975147204e-15
+12
+3.0
+22
+0.497732043121051
+32
+3.0
+13
+3.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+3.0
+21
+0.497732043121051
+31
+1.19348975147204e-15
+12
+3.0
+22
+0.878679656440356
+32
+1.19348975147204e-15
+13
+3.0
+23
+0.878679656440356
+33
+1.19348975147204e-15
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+3.0
+21
+0.878679656440356
+31
+1.19348975147204e-15
+12
+3.0
+22
+0.878679656440356
+32
+3.0
+13
+3.0
+23
+0.878679656440356
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+0.826320343559642
+11
+2.795
+21
+3.0
+31
+0.204999999999999
+12
+2.12132034355964
+22
+3.0
+32
+0.204999999999999
+13
+2.12132034355964
+23
+3.0
+33
+0.204999999999999
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.795
+20
+3.0
+30
+0.204999999999999
+11
+2.12132034355964
+21
+3.0
+31
+0.826320343559642
+12
+2.795
+22
+3.0
+32
+1.5
+13
+2.795
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.92778907942509
+20
+2.14023160147296
+30
+3.0
+11
+1.86297548735602
+21
+2.17907937354823
+31
+1.5
+12
+1.92778907942509
+22
+2.14023160147296
+32
+1.5
+13
+1.92778907942509
+23
+2.14023160147296
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.86297548735602
+20
+2.17907937354823
+30
+1.5
+11
+1.92778907942509
+21
+2.14023160147296
+31
+3.0
+12
+1.86297548735602
+22
+2.17907937354823
+32
+3.0
+13
+1.86297548735602
+23
+2.17907937354823
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.79466624292112
+30
+3.0
+11
+2.2368440585138
+21
+1.72351920148594
+31
+1.5
+12
+2.2368440585138
+22
+1.72351920148594
+32
+3.0
+13
+2.2368440585138
+23
+1.72351920148594
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.2368440585138
+20
+1.72351920148594
+30
+1.5
+11
+2.21138724003369
+21
+1.79466624292112
+31
+3.0
+12
+2.21138724003369
+22
+1.79466624292112
+32
+1.5
+13
+2.21138724003369
+23
+1.79466624292112
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486359
+20
+2.04447222151364
+30
+1.5
+11
+0.904781950910692
+21
+1.98848282880601
+31
+3.0
+12
+0.904781950910694
+22
+1.98848282880601
+32
+1.5
+13
+0.904781950910694
+23
+1.98848282880601
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.904781950910692
+20
+1.98848282880601
+30
+3.0
+11
+0.955527778486359
+21
+2.04447222151364
+31
+1.5
+12
+0.955527778486358
+22
+2.04447222151364
+32
+3.0
+13
+0.955527778486358
+23
+2.04447222151364
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.26629223953759
+20
+1.57547319805376
+30
+3.0
+11
+2.27
+21
+1.5
+31
+1.5
+12
+2.27
+22
+1.5
+32
+3.0
+13
+2.27
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+1.5
+11
+2.26629223953759
+21
+1.57547319805376
+31
+3.0
+12
+2.26629223953759
+22
+1.57547319805376
+32
+1.5
+13
+2.26629223953759
+23
+1.57547319805376
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.14023160147296
+20
+1.07221092057491
+30
+3.0
+11
+2.09521804908931
+21
+1.01151717119399
+31
+1.5
+12
+2.09521804908931
+22
+1.01151717119399
+32
+3.0
+13
+2.09521804908931
+23
+1.01151717119399
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.09521804908931
+20
+1.01151717119399
+30
+1.5
+11
+2.14023160147296
+21
+1.07221092057491
+31
+3.0
+12
+2.14023160147296
+22
+1.07221092057491
+32
+1.5
+13
+2.14023160147296
+23
+1.07221092057491
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.859768398527041
+20
+1.92778907942509
+30
+1.5
+11
+0.820920626451767
+21
+1.86297548735602
+31
+3.0
+12
+0.820920626451766
+22
+1.86297548735602
+32
+1.5
+13
+0.820920626451766
+23
+1.86297548735602
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.820920626451767
+20
+1.86297548735602
+30
+3.0
+11
+0.859768398527041
+21
+1.92778907942509
+31
+1.5
+12
+0.859768398527041
+22
+1.92778907942509
+32
+3.0
+13
+0.859768398527041
+23
+1.92778907942509
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.86297548735602
+20
+2.17907937354823
+30
+1.5
+11
+1.79466624292112
+21
+2.21138724003369
+31
+3.0
+12
+1.79466624292112
+22
+2.21138724003369
+32
+1.5
+13
+1.79466624292112
+23
+2.21138724003369
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+2.21138724003369
+30
+3.0
+11
+1.86297548735602
+21
+2.17907937354823
+31
+1.5
+12
+1.86297548735602
+22
+2.17907937354823
+32
+3.0
+13
+1.86297548735602
+23
+2.17907937354823
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.78861275996631
+20
+1.79466624292112
+30
+2.77555756156289e-17
+11
+2.77555756156289e-16
+21
+2.12132034355964
+31
+3.0
+12
+1.19348975147204e-15
+22
+2.12132034355964
+32
+-1.16573417585641e-15
+13
+1.19348975147204e-15
+23
+2.12132034355964
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+2.12132034355964
+30
+3.0
+11
+0.78861275996631
+21
+1.79466624292112
+31
+2.77555756156289e-17
+12
+0.78861275996631
+22
+1.79466624292112
+32
+1.5
+13
+0.78861275996631
+23
+1.79466624292112
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+2.12132034355964
+30
+3.0
+11
+0.78861275996631
+21
+1.79466624292112
+31
+1.5
+12
+0.788612759966309
+22
+1.79466624292112
+32
+3.0
+13
+0.788612759966309
+23
+1.79466624292112
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.27648079851406
+20
+0.763155941486199
+30
+1.1518563880486e-15
+11
+1.20533375707888
+21
+0.788612759966309
+31
+1.5
+12
+1.20533375707888
+22
+0.788612759966309
+32
+2.63677968348475e-16
+13
+1.20533375707888
+23
+0.788612759966309
+33
+2.63677968348475e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20533375707888
+20
+0.788612759966309
+30
+1.5
+11
+1.27648079851406
+21
+0.763155941486199
+31
+1.1518563880486e-15
+12
+1.27648079851406
+22
+0.763155941486199
+32
+1.5
+13
+1.27648079851406
+23
+0.763155941486199
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.73
+30
+3.0
+11
+1.5
+21
+0.0
+31
+2.795
+12
+1.5
+22
+0.0
+32
+3.0
+13
+1.5
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.0
+30
+2.795
+11
+1.5
+21
+0.73
+31
+3.0
+12
+1.5
+22
+0.0
+32
+0.204999999999999
+13
+1.5
+23
+0.0
+33
+0.204999999999999
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.0
+30
+0.204999999999999
+11
+1.5
+21
+0.73
+31
+3.0
+12
+1.5
+22
+0.0
+32
+6.93889390390723e-16
+13
+1.5
+23
+0.0
+33
+6.93889390390723e-16
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.0
+30
+6.93889390390723e-16
+11
+1.5
+21
+0.73
+31
+3.0
+12
+1.5
+22
+0.73
+32
+6.93889390390723e-16
+13
+1.5
+23
+0.73
+33
+6.93889390390723e-16
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.73
+30
+6.93889390390723e-16
+11
+1.5
+21
+0.73
+31
+3.0
+12
+1.5
+22
+0.73
+32
+1.5
+13
+1.5
+23
+0.73
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.09521804908931
+20
+1.98848282880601
+30
+7.63278329429795e-16
+11
+2.14023160147296
+21
+1.92778907942509
+31
+1.5
+12
+2.14023160147296
+22
+1.92778907942509
+32
+-9.71445146547012e-16
+13
+2.14023160147296
+23
+1.92778907942509
+33
+-9.71445146547012e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.14023160147296
+20
+1.92778907942509
+30
+1.5
+11
+2.09521804908931
+21
+1.98848282880601
+31
+7.63278329429795e-16
+12
+2.09521804908931
+22
+1.98848282880601
+32
+1.5
+13
+2.09521804908931
+23
+1.98848282880601
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.57547319805376
+20
+2.26629223953759
+30
+1.38777878078145e-16
+11
+1.65021954795242
+21
+2.25520466591049
+31
+1.5
+12
+1.65021954795242
+22
+2.25520466591049
+32
+-3.60822483003176e-16
+13
+1.65021954795242
+23
+2.25520466591049
+33
+-3.60822483003176e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.65021954795242
+20
+2.25520466591049
+30
+1.5
+11
+1.57547319805376
+21
+2.26629223953759
+31
+1.38777878078145e-16
+12
+1.57547319805376
+22
+2.26629223953759
+32
+1.5
+13
+1.57547319805376
+23
+2.26629223953759
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+3.0
+21
+2.12132034355964
+31
+1.19348975147204e-15
+12
+2.21138724003369
+22
+1.79466624292112
+32
+-6.66133814775094e-16
+13
+2.21138724003369
+23
+1.79466624292112
+33
+-6.66133814775094e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+2.12132034355964
+30
+1.19348975147204e-15
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+2.21138724003369
+22
+1.79466624292112
+32
+3.0
+13
+2.21138724003369
+23
+1.79466624292112
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.07221092057491
+20
+2.14023160147296
+30
+1.5
+11
+1.13702451264398
+21
+2.17907937354823
+31
+8.18789480661053e-16
+12
+1.07221092057491
+22
+2.14023160147296
+32
+3.19189119579733e-16
+13
+1.07221092057491
+23
+2.14023160147296
+33
+3.19189119579733e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.13702451264398
+20
+2.17907937354823
+30
+8.18789480661053e-16
+11
+1.07221092057491
+21
+2.14023160147296
+31
+1.5
+12
+1.13702451264398
+22
+2.17907937354823
+32
+1.5
+13
+1.13702451264398
+23
+2.17907937354823
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.86297548735602
+20
+0.820920626451767
+30
+1.58206781009085e-15
+11
+1.79466624292112
+21
+0.788612759966309
+31
+1.5
+12
+1.79466624292112
+22
+0.788612759966309
+32
+-1.38777878078145e-16
+13
+1.79466624292112
+23
+0.788612759966309
+33
+-1.38777878078145e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+0.788612759966309
+30
+1.5
+11
+1.86297548735602
+21
+0.820920626451767
+31
+1.58206781009085e-15
+12
+1.86297548735602
+22
+0.820920626451767
+32
+1.5
+13
+1.86297548735602
+23
+0.820920626451767
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.788612759966309
+20
+1.20533375707888
+30
+1.5
+11
+0.820920626451768
+21
+1.13702451264398
+31
+1.65145674912992e-15
+12
+0.820920626451766
+22
+1.13702451264398
+32
+1.5
+13
+0.820920626451766
+23
+1.13702451264398
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.820920626451768
+20
+1.13702451264398
+30
+1.65145674912992e-15
+11
+0.788612759966309
+21
+1.20533375707888
+31
+1.5
+12
+0.78861275996631
+22
+1.20533375707888
+32
+2.77555756156289e-17
+13
+0.78861275996631
+23
+1.20533375707888
+33
+2.77555756156289e-17
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486359
+20
+2.04447222151364
+30
+1.20736753927986e-15
+11
+1.01151717119399
+21
+2.09521804908931
+31
+1.5
+12
+1.01151717119399
+22
+2.09521804908931
+32
+6.38378239159465e-16
+13
+1.01151717119399
+23
+2.09521804908931
+33
+6.38378239159465e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.01151717119399
+20
+2.09521804908931
+30
+1.5
+11
+0.955527778486359
+21
+2.04447222151364
+31
+1.20736753927986e-15
+12
+0.955527778486359
+22
+2.04447222151364
+32
+1.5
+13
+0.955527778486359
+23
+2.04447222151364
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+2.27
+30
+6.93889390390723e-16
+11
+1.57547319805376
+21
+2.26629223953759
+31
+1.5
+12
+1.57547319805376
+22
+2.26629223953759
+32
+1.38777878078145e-16
+13
+1.57547319805376
+23
+2.26629223953759
+33
+1.38777878078145e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.57547319805376
+20
+2.26629223953759
+30
+1.5
+11
+1.5
+21
+2.27
+31
+6.93889390390723e-16
+12
+1.5
+22
+2.27
+32
+1.5
+13
+1.5
+23
+2.27
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.13702451264398
+20
+2.17907937354823
+30
+8.18789480661053e-16
+11
+1.20533375707888
+21
+2.21138724003369
+31
+1.5
+12
+1.20533375707888
+22
+2.21138724003369
+32
+-5.68989300120393e-16
+13
+1.20533375707888
+23
+2.21138724003369
+33
+-5.68989300120393e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20533375707888
+20
+2.21138724003369
+30
+1.5
+11
+1.13702451264398
+21
+2.17907937354823
+31
+8.18789480661053e-16
+12
+1.13702451264398
+22
+2.17907937354823
+32
+1.5
+13
+1.13702451264398
+23
+2.17907937354823
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.92778907942509
+20
+0.85976839852704
+30
+1.5
+11
+1.86297548735602
+21
+0.820920626451767
+31
+1.58206781009085e-15
+12
+1.92778907942509
+22
+0.85976839852704
+32
+-1.02695629777827e-15
+13
+1.92778907942509
+23
+0.85976839852704
+33
+-1.02695629777827e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.86297548735602
+20
+0.820920626451767
+30
+1.58206781009085e-15
+11
+1.92778907942509
+21
+0.85976839852704
+31
+1.5
+12
+1.86297548735602
+22
+0.820920626451767
+32
+1.5
+13
+1.86297548735602
+23
+0.820920626451767
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.01151717119399
+20
+2.09521804908931
+30
+6.38378239159465e-16
+11
+1.07221092057491
+21
+2.14023160147296
+31
+1.5
+12
+1.07221092057491
+22
+2.14023160147296
+32
+3.19189119579733e-16
+13
+1.07221092057491
+23
+2.14023160147296
+33
+3.19189119579733e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.07221092057491
+20
+2.14023160147296
+30
+1.5
+11
+1.01151717119399
+21
+2.09521804908931
+31
+6.38378239159465e-16
+12
+1.01151717119399
+22
+2.09521804908931
+32
+1.5
+13
+1.01151717119399
+23
+2.09521804908931
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.17907937354823
+20
+1.13702451264398
+30
+3.0
+11
+2.14023160147296
+21
+1.07221092057491
+31
+1.5
+12
+2.14023160147296
+22
+1.07221092057491
+32
+3.0
+13
+2.14023160147296
+23
+1.07221092057491
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.14023160147296
+20
+1.07221092057491
+30
+1.5
+11
+2.17907937354823
+21
+1.13702451264398
+31
+3.0
+12
+2.17907937354823
+22
+1.13702451264398
+32
+1.5
+13
+2.17907937354823
+23
+1.13702451264398
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.859768398527041
+20
+1.07221092057491
+30
+1.5
+11
+0.904781950910692
+21
+1.01151717119399
+31
+1.31838984174237e-15
+12
+0.904781950910694
+22
+1.01151717119399
+32
+1.5
+13
+0.904781950910694
+23
+1.01151717119399
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.904781950910692
+20
+1.01151717119399
+30
+1.31838984174237e-15
+11
+0.859768398527041
+21
+1.07221092057491
+31
+1.5
+12
+0.859768398527041
+22
+1.07221092057491
+32
+8.74300631892311e-16
+13
+0.859768398527041
+23
+1.07221092057491
+33
+8.74300631892311e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.42452680194624
+20
+2.26629223953759
+30
+3.0
+11
+1.34978045204758
+21
+2.25520466591049
+31
+1.5
+12
+1.42452680194624
+22
+2.26629223953759
+32
+1.5
+13
+1.42452680194624
+23
+2.26629223953759
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.34978045204758
+20
+2.25520466591049
+30
+1.5
+11
+1.42452680194624
+21
+2.26629223953759
+31
+3.0
+12
+1.34978045204758
+22
+2.25520466591049
+32
+3.0
+13
+1.34978045204758
+23
+2.25520466591049
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.09521804908931
+20
+1.01151717119399
+30
+3.0
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+2.04447222151364
+22
+0.955527778486358
+32
+3.0
+13
+2.04447222151364
+23
+0.955527778486358
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+2.09521804908931
+21
+1.01151717119399
+31
+3.0
+12
+2.09521804908931
+22
+1.01151717119399
+32
+1.5
+13
+2.09521804908931
+23
+1.01151717119399
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.2368440585138
+20
+1.72351920148594
+30
+3.0
+11
+2.25520466591049
+21
+1.65021954795242
+31
+1.5
+12
+2.25520466591049
+22
+1.65021954795242
+32
+3.0
+13
+2.25520466591049
+23
+1.65021954795242
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.25520466591049
+20
+1.65021954795242
+30
+1.5
+11
+2.2368440585138
+21
+1.72351920148594
+31
+3.0
+12
+2.2368440585138
+22
+1.72351920148594
+32
+1.5
+13
+2.2368440585138
+23
+1.72351920148594
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.13702451264398
+20
+0.820920626451767
+30
+1.5
+11
+1.20533375707888
+21
+0.788612759966309
+31
+3.0
+12
+1.20533375707888
+22
+0.788612759966309
+32
+1.5
+13
+1.20533375707888
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20533375707888
+20
+0.788612759966309
+30
+3.0
+11
+1.13702451264398
+21
+0.820920626451767
+31
+1.5
+12
+1.13702451264398
+22
+0.820920626451767
+32
+3.0
+13
+1.13702451264398
+23
+0.820920626451767
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.72351920148594
+20
+2.2368440585138
+30
+-5.27355936696949e-16
+11
+1.79466624292112
+21
+2.21138724003369
+31
+1.5
+12
+1.79466624292112
+22
+2.21138724003369
+32
+-1.4432899320127e-15
+13
+1.79466624292112
+23
+2.21138724003369
+33
+-1.4432899320127e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+2.21138724003369
+30
+1.5
+11
+1.72351920148594
+21
+2.2368440585138
+31
+-5.27355936696949e-16
+12
+1.72351920148594
+22
+2.2368440585138
+32
+1.5
+13
+1.72351920148594
+23
+2.2368440585138
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486359
+20
+0.955527778486358
+30
+1.5
+11
+1.01151717119399
+21
+0.904781950910693
+31
+3.0
+12
+1.01151717119399
+22
+0.904781950910693
+32
+1.5
+13
+1.01151717119399
+23
+0.904781950910693
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.01151717119399
+20
+0.904781950910693
+30
+3.0
+11
+0.955527778486359
+21
+0.955527778486358
+31
+1.5
+12
+0.955527778486358
+22
+0.955527778486358
+32
+3.0
+13
+0.955527778486358
+23
+0.955527778486358
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+3.0
+30
+6.93889390390723e-16
+11
+1.5
+21
+2.27
+31
+1.5
+12
+1.5
+22
+2.27
+32
+6.93889390390723e-16
+13
+1.5
+23
+2.27
+33
+6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+2.27
+30
+1.5
+11
+1.5
+21
+3.0
+31
+6.93889390390723e-16
+12
+1.5
+22
+2.27
+32
+3.0
+13
+1.5
+23
+2.27
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+2.27
+30
+3.0
+11
+1.5
+21
+3.0
+31
+6.93889390390723e-16
+12
+1.5
+22
+3.0
+32
+3.0
+13
+1.5
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+6.93889390390723e-16
+12
+1.5
+22
+3.0
+32
+0.204999999999999
+13
+1.5
+23
+3.0
+33
+0.204999999999999
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+0.204999999999999
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.763155941486199
+20
+1.72351920148594
+30
+1.5
+11
+0.744795334089513
+21
+1.65021954795242
+31
+4.71844785465692e-16
+12
+0.744795334089513
+22
+1.65021954795242
+32
+1.5
+13
+0.744795334089513
+23
+1.65021954795242
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.744795334089513
+20
+1.65021954795242
+30
+4.71844785465692e-16
+11
+0.763155941486199
+21
+1.72351920148594
+31
+1.5
+12
+0.7631559414862
+22
+1.72351920148594
+32
+-2.77555756156289e-17
+13
+0.7631559414862
+23
+1.72351920148594
+33
+-2.77555756156289e-17
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.820920626451766
+20
+1.86297548735602
+30
+1.5
+11
+0.788612759966309
+21
+1.79466624292112
+31
+3.0
+12
+0.78861275996631
+22
+1.79466624292112
+32
+1.5
+13
+0.78861275996631
+23
+1.79466624292112
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.788612759966309
+20
+1.79466624292112
+30
+3.0
+11
+0.820920626451766
+21
+1.86297548735602
+31
+1.5
+12
+0.820920626451767
+22
+1.86297548735602
+32
+3.0
+13
+0.820920626451767
+23
+1.86297548735602
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.98848282880601
+20
+2.09521804908931
+30
+1.5
+11
+1.92778907942509
+21
+2.14023160147296
+31
+3.0
+12
+1.92778907942509
+22
+2.14023160147296
+32
+1.5
+13
+1.92778907942509
+23
+2.14023160147296
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.92778907942509
+20
+2.14023160147296
+30
+3.0
+11
+1.98848282880601
+21
+2.09521804908931
+31
+1.5
+12
+1.98848282880601
+22
+2.09521804908931
+32
+3.0
+13
+1.98848282880601
+23
+2.09521804908931
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486358
+20
+0.955527778486358
+30
+3.0
+11
+1.19348975147204e-15
+21
+0.0
+31
+2.795
+12
+2.77555756156289e-16
+22
+0.0
+32
+3.0
+13
+2.77555756156289e-16
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+0.0
+30
+2.795
+11
+0.955527778486358
+21
+0.955527778486358
+31
+3.0
+12
+1.19348975147204e-15
+22
+0.0
+32
+1.5
+13
+1.19348975147204e-15
+23
+0.0
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+0.0
+30
+1.5
+11
+0.955527778486358
+21
+0.955527778486358
+31
+3.0
+12
+1.19348975147204e-15
+22
+0.0
+32
+0.204999999999999
+13
+1.19348975147204e-15
+23
+0.0
+33
+0.204999999999999
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+0.0
+30
+0.204999999999999
+11
+0.955527778486358
+21
+0.955527778486358
+31
+3.0
+12
+1.19348975147204e-15
+22
+0.0
+32
+-1.16573417585641e-15
+13
+1.19348975147204e-15
+23
+0.0
+33
+-1.16573417585641e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+0.0
+30
+-1.16573417585641e-15
+11
+0.955527778486358
+21
+0.955527778486358
+31
+3.0
+12
+0.955527778486359
+22
+0.955527778486358
+32
+1.20736753927986e-15
+13
+0.955527778486359
+23
+0.955527778486358
+33
+1.20736753927986e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486359
+20
+0.955527778486358
+30
+1.20736753927986e-15
+11
+0.955527778486358
+21
+0.955527778486358
+31
+3.0
+12
+0.955527778486359
+22
+0.955527778486358
+32
+1.5
+13
+0.955527778486359
+23
+0.955527778486358
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.0
+30
+1.19348975147204e-15
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+2.04447222151364
+22
+0.955527778486358
+32
+-1.11022302462516e-16
+13
+2.04447222151364
+23
+0.955527778486358
+33
+-1.11022302462516e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+3.0
+21
+0.0
+31
+1.19348975147204e-15
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+3.0
+21
+0.0
+31
+3.0
+12
+2.04447222151364
+22
+0.955527778486358
+32
+3.0
+13
+2.04447222151364
+23
+0.955527778486358
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+1.11022302462516e-16
+30
+-6.80011602582908e-16
+11
+2.12132034355964
+21
+5.55111512312578e-17
+31
+0.826320343559641
+12
+2.12132034355964
+22
+5.55111512312578e-17
+32
+0.204999999999999
+13
+2.12132034355964
+23
+5.55111512312578e-17
+33
+0.204999999999999
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+5.55111512312578e-17
+30
+0.826320343559641
+11
+2.12132034355964
+21
+1.11022302462516e-16
+31
+-6.80011602582908e-16
+12
+2.12132034355964
+22
+5.55111512312578e-17
+32
+2.17367965644036
+13
+2.12132034355964
+23
+5.55111512312578e-17
+33
+2.17367965644036
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+5.55111512312578e-17
+30
+2.17367965644036
+11
+2.12132034355964
+21
+1.11022302462516e-16
+31
+-6.80011602582908e-16
+12
+2.12132034355964
+22
+5.55111512312578e-17
+32
+2.795
+13
+2.12132034355964
+23
+5.55111512312578e-17
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+5.55111512312578e-17
+30
+2.795
+11
+2.12132034355964
+21
+1.11022302462516e-16
+31
+-6.80011602582908e-16
+12
+2.12132034355964
+22
+1.11022302462516e-16
+32
+3.0
+13
+2.12132034355964
+23
+1.11022302462516e-16
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+1.11022302462516e-16
+30
+3.0
+11
+2.12132034355964
+21
+1.11022302462516e-16
+31
+-6.80011602582908e-16
+12
+1.79466624292112
+22
+0.788612759966309
+32
+-1.38777878078145e-16
+13
+1.79466624292112
+23
+0.788612759966309
+33
+-1.38777878078145e-16
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+1.11022302462516e-16
+30
+3.0
+11
+1.79466624292112
+21
+0.788612759966309
+31
+-1.38777878078145e-16
+12
+1.79466624292112
+22
+0.788612759966309
+32
+3.0
+13
+1.79466624292112
+23
+0.788612759966309
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+0.788612759966309
+30
+3.0
+11
+1.79466624292112
+21
+0.788612759966309
+31
+-1.38777878078145e-16
+12
+1.79466624292112
+22
+0.788612759966309
+32
+1.5
+13
+1.79466624292112
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.26629223953759
+20
+1.42452680194624
+30
+-1.11022302462516e-16
+11
+2.25520466591049
+21
+1.34978045204758
+31
+1.5
+12
+2.25520466591049
+22
+1.34978045204758
+32
+-1.2490009027033e-15
+13
+2.25520466591049
+23
+1.34978045204758
+33
+-1.2490009027033e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.25520466591049
+20
+1.34978045204758
+30
+1.5
+11
+2.26629223953759
+21
+1.42452680194624
+31
+-1.11022302462516e-16
+12
+2.26629223953759
+22
+1.42452680194624
+32
+1.5
+13
+2.26629223953759
+23
+1.42452680194624
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+-2.35922392732846e-16
+11
+2.26629223953759
+21
+1.42452680194624
+31
+1.5
+12
+2.26629223953759
+22
+1.42452680194624
+32
+-1.11022302462516e-16
+13
+2.26629223953759
+23
+1.42452680194624
+33
+-1.11022302462516e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.26629223953759
+20
+1.42452680194624
+30
+1.5
+11
+2.27
+21
+1.5
+31
+-2.35922392732846e-16
+12
+2.27
+22
+1.5
+32
+1.5
+13
+2.27
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.25520466591049
+20
+1.34978045204758
+30
+-1.2490009027033e-15
+11
+2.2368440585138
+21
+1.27648079851406
+31
+1.5
+12
+2.2368440585138
+22
+1.27648079851406
+32
+-1.06858966120171e-15
+13
+2.2368440585138
+23
+1.27648079851406
+33
+-1.06858966120171e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.2368440585138
+20
+1.27648079851406
+30
+1.5
+11
+2.25520466591049
+21
+1.34978045204758
+31
+-1.2490009027033e-15
+12
+2.25520466591049
+22
+1.34978045204758
+32
+1.5
+13
+2.25520466591049
+23
+1.34978045204758
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+2.21138724003369
+21
+1.20533375707888
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+2.09521804908931
+22
+1.01151717119399
+32
+1.5
+13
+2.09521804908931
+23
+1.01151717119399
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+2.09521804908931
+21
+1.01151717119399
+31
+1.5
+12
+2.14023160147296
+22
+1.07221092057491
+32
+1.5
+13
+2.14023160147296
+23
+1.07221092057491
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+2.14023160147296
+21
+1.07221092057491
+31
+1.5
+12
+2.17907937354823
+22
+1.13702451264398
+32
+1.5
+13
+2.17907937354823
+23
+1.13702451264398
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.73370776046241
+20
+1.42452680194624
+30
+1.5
+11
+0.744795334089513
+21
+1.34978045204758
+31
+3.0
+12
+0.744795334089513
+22
+1.34978045204758
+32
+1.5
+13
+0.744795334089513
+23
+1.34978045204758
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.744795334089513
+20
+1.34978045204758
+30
+3.0
+11
+0.73370776046241
+21
+1.42452680194624
+31
+1.5
+12
+0.733707760462408
+22
+1.42452680194624
+32
+3.0
+13
+0.733707760462408
+23
+1.42452680194624
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.820920626451766
+20
+1.13702451264398
+30
+1.5
+11
+0.859768398527041
+21
+1.07221092057491
+31
+8.74300631892311e-16
+12
+0.859768398527041
+22
+1.07221092057491
+32
+1.5
+13
+0.859768398527041
+23
+1.07221092057491
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.859768398527041
+20
+1.07221092057491
+30
+8.74300631892311e-16
+11
+0.820920626451766
+21
+1.13702451264398
+31
+1.5
+12
+0.820920626451768
+22
+1.13702451264398
+32
+1.65145674912992e-15
+13
+0.820920626451768
+23
+1.13702451264398
+33
+1.65145674912992e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440357
+20
+3.0
+30
+3.0
+11
+1.20533375707888
+21
+2.21138724003369
+31
+1.5
+12
+1.20533375707888
+22
+2.21138724003369
+32
+3.0
+13
+1.20533375707888
+23
+2.21138724003369
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20533375707888
+20
+2.21138724003369
+30
+1.5
+11
+0.878679656440357
+21
+3.0
+31
+3.0
+12
+1.20533375707888
+22
+2.21138724003369
+32
+-5.68989300120393e-16
+13
+1.20533375707888
+23
+2.21138724003369
+33
+-5.68989300120393e-16
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20533375707888
+20
+2.21138724003369
+30
+-5.68989300120393e-16
+11
+0.878679656440357
+21
+3.0
+31
+3.0
+12
+0.878679656440358
+22
+3.0
+32
+9.29811783123569e-16
+13
+0.878679656440358
+23
+3.0
+33
+9.29811783123569e-16
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440358
+20
+3.0
+30
+9.29811783123569e-16
+11
+0.878679656440357
+21
+3.0
+31
+3.0
+12
+0.878679656440357
+22
+3.0
+32
+2.795
+13
+0.878679656440357
+23
+3.0
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440358
+20
+3.0
+30
+9.29811783123569e-16
+11
+0.878679656440357
+21
+3.0
+31
+2.795
+12
+0.878679656440357
+22
+3.0
+32
+2.17367965644036
+13
+0.878679656440357
+23
+3.0
+33
+2.17367965644036
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440358
+20
+3.0
+30
+9.29811783123569e-16
+11
+0.878679656440357
+21
+3.0
+31
+2.17367965644036
+12
+0.878679656440358
+22
+3.0
+32
+0.826320343559643
+13
+0.878679656440358
+23
+3.0
+33
+0.826320343559643
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440358
+20
+3.0
+30
+9.29811783123569e-16
+11
+0.878679656440358
+21
+3.0
+31
+0.826320343559643
+12
+0.878679656440358
+22
+3.0
+32
+0.204999999999999
+13
+0.878679656440358
+23
+3.0
+33
+0.204999999999999
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+3.0
+21
+0.878679656440356
+31
+1.19348975147204e-15
+12
+2.21138724003369
+22
+1.20533375707888
+32
+-6.66133814775094e-16
+13
+2.21138724003369
+23
+1.20533375707888
+33
+-6.66133814775094e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.878679656440356
+30
+1.19348975147204e-15
+11
+2.21138724003369
+21
+1.20533375707888
+31
+1.5
+12
+3.0
+22
+0.878679656440356
+32
+3.0
+13
+3.0
+23
+0.878679656440356
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.878679656440356
+30
+3.0
+11
+2.21138724003369
+21
+1.20533375707888
+31
+1.5
+12
+2.21138724003369
+22
+1.20533375707888
+32
+3.0
+13
+2.21138724003369
+23
+1.20533375707888
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+1.5
+30
+1.19348975147204e-15
+11
+2.27
+21
+1.5
+31
+1.5
+12
+2.27
+22
+1.5
+32
+-2.35922392732846e-16
+13
+2.27
+23
+1.5
+33
+-2.35922392732846e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+1.5
+11
+3.0
+21
+1.5
+31
+1.19348975147204e-15
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+1.5
+11
+3.0
+21
+1.5
+31
+3.0
+12
+2.27
+22
+1.5
+32
+3.0
+13
+2.27
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.78861275996631
+20
+1.20533375707888
+30
+2.77555756156289e-17
+11
+2.77555756156289e-16
+21
+0.878679656440358
+31
+3.0
+12
+1.19348975147204e-15
+22
+0.878679656440358
+32
+-1.16573417585641e-15
+13
+1.19348975147204e-15
+23
+0.878679656440358
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+0.878679656440358
+30
+3.0
+11
+0.78861275996631
+21
+1.20533375707888
+31
+2.77555756156289e-17
+12
+0.788612759966309
+22
+1.20533375707888
+32
+1.5
+13
+0.788612759966309
+23
+1.20533375707888
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+0.878679656440358
+30
+3.0
+11
+0.788612759966309
+21
+1.20533375707888
+31
+1.5
+12
+0.788612759966309
+22
+1.20533375707888
+32
+3.0
+13
+0.788612759966309
+23
+1.20533375707888
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.01151717119399
+20
+0.904781950910693
+30
+3.0
+11
+1.07221092057491
+21
+0.85976839852704
+31
+1.5
+12
+1.01151717119399
+22
+0.904781950910693
+32
+1.5
+13
+1.01151717119399
+23
+0.904781950910693
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.07221092057491
+20
+0.85976839852704
+30
+1.5
+11
+1.01151717119399
+21
+0.904781950910693
+31
+3.0
+12
+1.07221092057491
+22
+0.85976839852704
+32
+3.0
+13
+1.07221092057491
+23
+0.85976839852704
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.17907937354823
+20
+1.86297548735602
+30
+-1.2490009027033e-16
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+2.21138724003369
+22
+1.79466624292112
+32
+-6.66133814775094e-16
+13
+2.21138724003369
+23
+1.79466624292112
+33
+-6.66133814775094e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+2.17907937354823
+21
+1.86297548735602
+31
+-1.2490009027033e-16
+12
+2.17907937354823
+22
+1.86297548735602
+32
+1.5
+13
+2.17907937354823
+23
+1.86297548735602
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.98848282880601
+20
+0.904781950910692
+30
+-1.66533453693773e-16
+11
+1.92778907942509
+21
+0.85976839852704
+31
+1.5
+12
+1.92778907942509
+22
+0.85976839852704
+32
+-1.02695629777827e-15
+13
+1.92778907942509
+23
+0.85976839852704
+33
+-1.02695629777827e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.92778907942509
+20
+0.85976839852704
+30
+1.5
+11
+1.98848282880601
+21
+0.904781950910692
+31
+-1.66533453693773e-16
+12
+1.98848282880601
+22
+0.904781950910692
+32
+1.5
+13
+1.98848282880601
+23
+0.904781950910692
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.27648079851406
+20
+2.2368440585138
+30
+3.0
+11
+1.20533375707888
+21
+2.21138724003369
+31
+1.5
+12
+1.27648079851406
+22
+2.2368440585138
+32
+1.5
+13
+1.27648079851406
+23
+2.2368440585138
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20533375707888
+20
+2.21138724003369
+30
+1.5
+11
+1.27648079851406
+21
+2.2368440585138
+31
+3.0
+12
+1.20533375707888
+22
+2.21138724003369
+32
+3.0
+13
+1.20533375707888
+23
+2.21138724003369
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.744795334089513
+20
+1.34978045204758
+30
+1.5
+11
+0.763155941486199
+21
+1.27648079851406
+31
+3.0
+12
+0.763155941486199
+22
+1.27648079851406
+32
+1.5
+13
+0.763155941486199
+23
+1.27648079851406
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.763155941486199
+20
+1.27648079851406
+30
+3.0
+11
+0.744795334089513
+21
+1.34978045204758
+31
+1.5
+12
+0.744795334089513
+22
+1.34978045204758
+32
+3.0
+13
+0.744795334089513
+23
+1.34978045204758
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.72351920148594
+20
+0.763155941486199
+30
+3.0
+11
+1.79466624292112
+21
+0.788612759966309
+31
+1.5
+12
+1.72351920148594
+22
+0.763155941486199
+32
+1.5
+13
+1.72351920148594
+23
+0.763155941486199
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+0.788612759966309
+30
+1.5
+11
+1.72351920148594
+21
+0.763155941486199
+31
+3.0
+12
+1.79466624292112
+22
+0.788612759966309
+32
+3.0
+13
+1.79466624292112
+23
+0.788612759966309
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+3.0
+11
+1.98848282880601
+21
+2.09521804908931
+31
+1.5
+12
+2.04447222151364
+22
+2.04447222151364
+32
+1.5
+13
+2.04447222151364
+23
+2.04447222151364
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.98848282880601
+20
+2.09521804908931
+30
+1.5
+11
+2.04447222151364
+21
+2.04447222151364
+31
+3.0
+12
+1.98848282880601
+22
+2.09521804908931
+32
+3.0
+13
+1.98848282880601
+23
+2.09521804908931
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.65021954795242
+20
+0.744795334089513
+30
+3.0
+11
+1.72351920148594
+21
+0.763155941486199
+31
+1.5
+12
+1.65021954795242
+22
+0.744795334089513
+32
+1.5
+13
+1.65021954795242
+23
+0.744795334089513
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.72351920148594
+20
+0.763155941486199
+30
+1.5
+11
+1.65021954795242
+21
+0.744795334089513
+31
+3.0
+12
+1.72351920148594
+22
+0.763155941486199
+32
+3.0
+13
+1.72351920148594
+23
+0.763155941486199
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.57547319805376
+20
+0.733707760462408
+30
+1.5
+11
+1.65021954795242
+21
+0.744795334089513
+31
+3.0
+12
+1.65021954795242
+22
+0.744795334089513
+32
+1.5
+13
+1.65021954795242
+23
+0.744795334089513
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.65021954795242
+20
+0.744795334089513
+30
+3.0
+11
+1.57547319805376
+21
+0.733707760462408
+31
+1.5
+12
+1.57547319805376
+22
+0.733707760462408
+32
+3.0
+13
+1.57547319805376
+23
+0.733707760462408
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+2.27
+30
+1.5
+11
+1.42452680194624
+21
+2.26629223953759
+31
+3.0
+12
+1.42452680194624
+22
+2.26629223953759
+32
+1.5
+13
+1.42452680194624
+23
+2.26629223953759
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.42452680194624
+20
+2.26629223953759
+30
+3.0
+11
+1.5
+21
+2.27
+31
+1.5
+12
+1.5
+22
+2.27
+32
+3.0
+13
+1.5
+23
+2.27
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.34978045204758
+20
+2.25520466591049
+30
+3.0
+11
+1.27648079851406
+21
+2.2368440585138
+31
+1.5
+12
+1.34978045204758
+22
+2.25520466591049
+32
+1.5
+13
+1.34978045204758
+23
+2.25520466591049
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.27648079851406
+20
+2.2368440585138
+30
+1.5
+11
+1.34978045204758
+21
+2.25520466591049
+31
+3.0
+12
+1.27648079851406
+22
+2.2368440585138
+32
+3.0
+13
+1.27648079851406
+23
+2.2368440585138
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.729999999999999
+20
+1.5
+30
+1.5
+11
+0.733707760462408
+21
+1.42452680194624
+31
+3.0
+12
+0.73370776046241
+22
+1.42452680194624
+32
+1.5
+13
+0.73370776046241
+23
+1.42452680194624
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.733707760462408
+20
+1.42452680194624
+30
+3.0
+11
+0.729999999999999
+21
+1.5
+31
+1.5
+12
+0.73
+22
+1.5
+32
+3.0
+13
+0.73
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.25520466591049
+20
+1.65021954795242
+30
+3.0
+11
+2.26629223953759
+21
+1.57547319805376
+31
+1.5
+12
+2.26629223953759
+22
+1.57547319805376
+32
+3.0
+13
+2.26629223953759
+23
+1.57547319805376
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.26629223953759
+20
+1.57547319805376
+30
+1.5
+11
+2.25520466591049
+21
+1.65021954795242
+31
+3.0
+12
+2.25520466591049
+22
+1.65021954795242
+32
+1.5
+13
+2.25520466591049
+23
+1.65021954795242
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.42452680194624
+20
+0.733707760462408
+30
+1.5
+11
+1.34978045204758
+21
+0.744795334089513
+31
+-4.02455846426619e-16
+12
+1.42452680194624
+22
+0.733707760462408
+32
+-6.93889390390723e-16
+13
+1.42452680194624
+23
+0.733707760462408
+33
+-6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.34978045204758
+20
+0.744795334089513
+30
+-4.02455846426619e-16
+11
+1.42452680194624
+21
+0.733707760462408
+31
+1.5
+12
+1.34978045204758
+22
+0.744795334089513
+32
+1.5
+13
+1.34978045204758
+23
+0.744795334089513
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.20533375707888
+30
+3.0
+11
+2.17907937354823
+21
+1.13702451264398
+31
+1.5
+12
+2.17907937354823
+22
+1.13702451264398
+32
+3.0
+13
+2.17907937354823
+23
+1.13702451264398
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.17907937354823
+20
+1.13702451264398
+30
+1.5
+11
+2.21138724003369
+21
+1.20533375707888
+31
+3.0
+12
+2.21138724003369
+22
+1.20533375707888
+32
+1.5
+13
+2.21138724003369
+23
+1.20533375707888
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.73
+30
+3.0
+11
+1.57547319805376
+21
+0.733707760462408
+31
+1.5
+12
+1.5
+22
+0.73
+32
+1.5
+13
+1.5
+23
+0.73
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.57547319805376
+20
+0.733707760462408
+30
+1.5
+11
+1.5
+21
+0.73
+31
+3.0
+12
+1.57547319805376
+22
+0.733707760462408
+32
+3.0
+13
+1.57547319805376
+23
+0.733707760462408
+33
+3.0
+70
+1
+ 0
+LINE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+0.878679656440358
+30
+-1.16573417585641e-15
+11
+-0.00250198874351172
+21
+0.87764329876989
+31
+-1.47104550762833e-15
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+0.955527778486358
+30
+-1.11022302462516e-16
+11
+1.98848282880601
+21
+0.904781950910692
+31
+1.5
+12
+1.98848282880601
+22
+0.904781950910692
+32
+-1.66533453693773e-16
+13
+1.98848282880601
+23
+0.904781950910692
+33
+-1.66533453693773e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.98848282880601
+20
+0.904781950910692
+30
+1.5
+11
+2.04447222151364
+21
+0.955527778486358
+31
+-1.11022302462516e-16
+12
+2.04447222151364
+22
+0.955527778486358
+32
+1.5
+13
+2.04447222151364
+23
+0.955527778486358
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.73
+30
+6.93889390390723e-16
+11
+1.42452680194624
+21
+0.733707760462408
+31
+1.5
+12
+1.42452680194624
+22
+0.733707760462408
+32
+-6.93889390390723e-16
+13
+1.42452680194624
+23
+0.733707760462408
+33
+-6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.42452680194624
+20
+0.733707760462408
+30
+1.5
+11
+1.5
+21
+0.73
+31
+6.93889390390723e-16
+12
+1.5
+22
+0.73
+32
+1.5
+13
+1.5
+23
+0.73
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.744795334089513
+20
+1.65021954795242
+30
+1.5
+11
+0.733707760462409
+21
+1.57547319805376
+31
+4.16333634234434e-16
+12
+0.73370776046241
+22
+1.57547319805376
+32
+1.5
+13
+0.73370776046241
+23
+1.57547319805376
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.733707760462409
+20
+1.57547319805376
+30
+4.16333634234434e-16
+11
+0.744795334089513
+21
+1.65021954795242
+31
+1.5
+12
+0.744795334089513
+22
+1.65021954795242
+32
+4.71844785465692e-16
+13
+0.744795334089513
+23
+1.65021954795242
+33
+4.71844785465692e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.78861275996631
+20
+1.79466624292112
+30
+1.5
+11
+0.7631559414862
+21
+1.72351920148594
+31
+-2.77555756156289e-17
+12
+0.763155941486199
+22
+1.72351920148594
+32
+1.5
+13
+0.763155941486199
+23
+1.72351920148594
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.7631559414862
+20
+1.72351920148594
+30
+-2.77555756156289e-17
+11
+0.78861275996631
+21
+1.79466624292112
+31
+1.5
+12
+0.78861275996631
+22
+1.79466624292112
+32
+2.77555756156289e-17
+13
+0.78861275996631
+23
+1.79466624292112
+33
+2.77555756156289e-17
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.34978045204758
+20
+0.744795334089513
+30
+1.5
+11
+1.27648079851406
+21
+0.763155941486199
+31
+1.1518563880486e-15
+12
+1.34978045204758
+22
+0.744795334089513
+32
+-4.02455846426619e-16
+13
+1.34978045204758
+23
+0.744795334089513
+33
+-4.02455846426619e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.27648079851406
+20
+0.763155941486199
+30
+1.1518563880486e-15
+11
+1.34978045204758
+21
+0.744795334089513
+31
+1.5
+12
+1.27648079851406
+22
+0.763155941486199
+32
+1.5
+13
+1.27648079851406
+23
+0.763155941486199
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+-1.11022302462516e-16
+11
+2.09521804908931
+21
+1.98848282880601
+31
+1.5
+12
+2.09521804908931
+22
+1.98848282880601
+32
+7.63278329429795e-16
+13
+2.09521804908931
+23
+1.98848282880601
+33
+7.63278329429795e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.09521804908931
+20
+1.98848282880601
+30
+1.5
+11
+2.04447222151364
+21
+2.04447222151364
+31
+-1.11022302462516e-16
+12
+2.04447222151364
+22
+2.04447222151364
+32
+1.5
+13
+2.04447222151364
+23
+2.04447222151364
+33
+1.5
+70
+1
+ 0
+LINE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+-7.35522753814166e-16
+11
+0.878127111942354
+21
+-0.0013339604208924
+31
+1.42941214420489e-15
+ 0
+3DFACE
+ 8
+star_d
+10
+0.904781950910694
+20
+1.01151717119399
+30
+1.5
+11
+0.955527778486359
+21
+0.955527778486358
+31
+1.20736753927986e-15
+12
+0.955527778486359
+22
+0.955527778486358
+32
+1.5
+13
+0.955527778486359
+23
+0.955527778486358
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486359
+20
+0.955527778486358
+30
+1.20736753927986e-15
+11
+0.904781950910694
+21
+1.01151717119399
+31
+1.5
+12
+0.904781950910692
+22
+1.01151717119399
+32
+1.31838984174237e-15
+13
+0.904781950910692
+23
+1.01151717119399
+33
+1.31838984174237e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.65021954795242
+20
+2.25520466591049
+30
+-3.60822483003176e-16
+11
+1.72351920148594
+21
+2.2368440585138
+31
+1.5
+12
+1.72351920148594
+22
+2.2368440585138
+32
+-5.27355936696949e-16
+13
+1.72351920148594
+23
+2.2368440585138
+33
+-5.27355936696949e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.72351920148594
+20
+2.2368440585138
+30
+1.5
+11
+1.65021954795242
+21
+2.25520466591049
+31
+-3.60822483003176e-16
+12
+1.65021954795242
+22
+2.25520466591049
+32
+1.5
+13
+1.65021954795242
+23
+2.25520466591049
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.73370776046241
+20
+1.57547319805376
+30
+1.5
+11
+0.73
+21
+1.5
+31
+7.07767178198537e-16
+12
+0.729999999999999
+22
+1.5
+32
+1.5
+13
+0.729999999999999
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.73
+20
+1.5
+30
+7.07767178198537e-16
+11
+0.73370776046241
+21
+1.57547319805376
+31
+1.5
+12
+0.733707760462409
+22
+1.57547319805376
+32
+4.16333634234434e-16
+13
+0.733707760462409
+23
+1.57547319805376
+33
+4.16333634234434e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+3.0
+30
+1.19348975147204e-15
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+2.04447222151364
+22
+2.04447222151364
+32
+-1.11022302462516e-16
+13
+2.04447222151364
+23
+2.04447222151364
+33
+-1.11022302462516e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+3.0
+21
+3.0
+31
+1.19348975147204e-15
+12
+3.0
+22
+3.0
+32
+0.204999999999999
+13
+3.0
+23
+3.0
+33
+0.204999999999999
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.204999999999999
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+3.0
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+3.0
+21
+3.0
+31
+2.795
+12
+2.04447222151364
+22
+2.04447222151364
+32
+3.0
+13
+2.04447222151364
+23
+2.04447222151364
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+3.0
+11
+3.0
+21
+3.0
+31
+2.795
+12
+3.0
+22
+3.0
+32
+3.0
+13
+3.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.14023160147296
+20
+1.92778907942509
+30
+-9.71445146547012e-16
+11
+2.17907937354823
+21
+1.86297548735602
+31
+1.5
+12
+2.17907937354823
+22
+1.86297548735602
+32
+-1.2490009027033e-16
+13
+2.17907937354823
+23
+1.86297548735602
+33
+-1.2490009027033e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.17907937354823
+20
+1.86297548735602
+30
+1.5
+11
+2.14023160147296
+21
+1.92778907942509
+31
+-9.71445146547012e-16
+12
+2.14023160147296
+22
+1.92778907942509
+32
+1.5
+13
+2.14023160147296
+23
+1.92778907942509
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.2368440585138
+20
+1.27648079851406
+30
+-1.06858966120171e-15
+11
+2.21138724003369
+21
+1.20533375707888
+31
+1.5
+12
+2.21138724003369
+22
+1.20533375707888
+32
+-6.66133814775094e-16
+13
+2.21138724003369
+23
+1.20533375707888
+33
+-6.66133814775094e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+2.2368440585138
+21
+1.27648079851406
+31
+-1.06858966120171e-15
+12
+2.2368440585138
+22
+1.27648079851406
+32
+1.5
+13
+2.2368440585138
+23
+1.27648079851406
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+1.5
+30
+3.0
+11
+0.73
+21
+1.5
+31
+7.07767178198537e-16
+12
+1.19348975147204e-15
+22
+1.5
+32
+-1.16573417585641e-15
+13
+1.19348975147204e-15
+23
+1.5
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.73
+20
+1.5
+30
+7.07767178198537e-16
+11
+2.77555756156289e-16
+21
+1.5
+31
+3.0
+12
+0.729999999999999
+22
+1.5
+32
+1.5
+13
+0.729999999999999
+23
+1.5
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.729999999999999
+20
+1.5
+30
+1.5
+11
+2.77555756156289e-16
+21
+1.5
+31
+3.0
+12
+0.73
+22
+1.5
+32
+3.0
+13
+0.73
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.07221092057491
+20
+0.85976839852704
+30
+3.0
+11
+1.13702451264398
+21
+0.820920626451767
+31
+1.5
+12
+1.07221092057491
+22
+0.85976839852704
+32
+1.5
+13
+1.07221092057491
+23
+0.85976839852704
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.13702451264398
+20
+0.820920626451767
+30
+1.5
+11
+1.07221092057491
+21
+0.85976839852704
+31
+3.0
+12
+1.13702451264398
+22
+0.820920626451767
+32
+3.0
+13
+1.13702451264398
+23
+0.820920626451767
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.763155941486199
+20
+1.27648079851406
+30
+1.5
+11
+0.788612759966309
+21
+1.20533375707888
+31
+3.0
+12
+0.788612759966309
+22
+1.20533375707888
+32
+1.5
+13
+0.788612759966309
+23
+1.20533375707888
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.788612759966309
+20
+1.20533375707888
+30
+3.0
+11
+0.763155941486199
+21
+1.27648079851406
+31
+1.5
+12
+0.763155941486199
+22
+1.27648079851406
+32
+3.0
+13
+0.763155941486199
+23
+1.27648079851406
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.904781950910694
+20
+1.98848282880601
+30
+1.5
+11
+0.859768398527041
+21
+1.92778907942509
+31
+3.0
+12
+0.859768398527041
+22
+1.92778907942509
+32
+1.5
+13
+0.859768398527041
+23
+1.92778907942509
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.859768398527041
+20
+1.92778907942509
+30
+3.0
+11
+0.904781950910694
+21
+1.98848282880601
+31
+1.5
+12
+0.904781950910692
+22
+1.98848282880601
+32
+3.0
+13
+0.904781950910692
+23
+1.98848282880601
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20533375707888
+20
+0.788612759966309
+30
+2.63677968348475e-16
+11
+0.878679656440356
+21
+0.0
+31
+0.204999999999999
+12
+0.878679656440356
+22
+0.0
+32
+-7.35522753814166e-16
+13
+0.878679656440356
+23
+0.0
+33
+-7.35522753814166e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+0.204999999999999
+11
+1.20533375707888
+21
+0.788612759966309
+31
+2.63677968348475e-16
+12
+0.878679656440356
+22
+0.0
+32
+0.826320343559644
+13
+0.878679656440356
+23
+0.0
+33
+0.826320343559644
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+0.826320343559644
+11
+1.20533375707888
+21
+0.788612759966309
+31
+2.63677968348475e-16
+12
+0.878679656440356
+22
+0.0
+32
+2.17367965644035
+13
+0.878679656440356
+23
+0.0
+33
+2.17367965644035
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+2.17367965644035
+11
+1.20533375707888
+21
+0.788612759966309
+31
+2.63677968348475e-16
+12
+0.878679656440356
+22
+0.0
+32
+2.795
+13
+0.878679656440356
+23
+0.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+2.795
+11
+1.20533375707888
+21
+0.788612759966309
+31
+2.63677968348475e-16
+12
+0.878679656440356
+22
+0.0
+32
+3.0
+13
+0.878679656440356
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+3.0
+11
+1.20533375707888
+21
+0.788612759966309
+31
+2.63677968348475e-16
+12
+1.20533375707888
+22
+0.788612759966309
+32
+3.0
+13
+1.20533375707888
+23
+0.788612759966309
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20533375707888
+20
+0.788612759966309
+30
+3.0
+11
+1.20533375707888
+21
+0.788612759966309
+31
+2.63677968348475e-16
+12
+1.20533375707888
+22
+0.788612759966309
+32
+1.5
+13
+1.20533375707888
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.33226762955019e-15
+20
+1.20163144893051
+30
+1.19348975147204e-15
+11
+0.78861275996631
+21
+1.20533375707888
+31
+2.77555756156289e-17
+12
+1.19348975147204e-15
+22
+0.878679656440358
+32
+-1.16573417585641e-15
+13
+1.19348975147204e-15
+23
+0.878679656440358
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.78861275996631
+20
+1.20533375707888
+30
+2.77555756156289e-17
+11
+1.33226762955019e-15
+21
+1.20163144893051
+31
+1.19348975147204e-15
+12
+0.7631559414862
+22
+1.27648079851406
+32
+-2.77555756156289e-17
+13
+0.7631559414862
+23
+1.27648079851406
+33
+-2.77555756156289e-17
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.7631559414862
+20
+1.27648079851406
+30
+-2.77555756156289e-17
+11
+1.33226762955019e-15
+21
+1.20163144893051
+31
+1.19348975147204e-15
+12
+0.744795334089513
+22
+1.34978045204758
+32
+4.71844785465692e-16
+13
+0.744795334089513
+23
+1.34978045204758
+33
+4.71844785465692e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+-1.11022302462516e-16
+11
+2.14023160147296
+21
+1.92778907942509
+31
+-9.71445146547012e-16
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.14023160147296
+20
+1.92778907942509
+30
+-9.71445146547012e-16
+11
+2.04447222151364
+21
+2.04447222151364
+31
+-1.11022302462516e-16
+12
+2.09521804908931
+22
+1.98848282880601
+32
+7.63278329429795e-16
+13
+2.09521804908931
+23
+1.98848282880601
+33
+7.63278329429795e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.14023160147296
+20
+1.92778907942509
+30
+-9.71445146547012e-16
+11
+2.21138724003369
+21
+1.79466624292112
+31
+-6.66133814775094e-16
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.79466624292112
+30
+-6.66133814775094e-16
+11
+2.14023160147296
+21
+1.92778907942509
+31
+-9.71445146547012e-16
+12
+2.17907937354823
+22
+1.86297548735602
+32
+-1.2490009027033e-16
+13
+2.17907937354823
+23
+1.86297548735602
+33
+-1.2490009027033e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.07221092057491
+20
+0.85976839852704
+30
+-1.38777878078145e-17
+11
+0.878679656440356
+21
+0.0
+31
+-7.35522753814166e-16
+12
+0.497732043121054
+22
+0.0
+32
+1.19348975147204e-15
+13
+0.497732043121054
+23
+0.0
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+-7.35522753814166e-16
+11
+1.07221092057491
+21
+0.85976839852704
+31
+-1.38777878078145e-17
+12
+1.13702451264398
+22
+0.820920626451767
+32
+8.18789480661053e-16
+13
+1.13702451264398
+23
+0.820920626451767
+33
+8.18789480661053e-16
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+-7.35522753814166e-16
+11
+1.13702451264398
+21
+0.820920626451767
+31
+8.18789480661053e-16
+12
+1.20533375707888
+22
+0.788612759966309
+32
+2.63677968348475e-16
+13
+1.20533375707888
+23
+0.788612759966309
+33
+2.63677968348475e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.17907937354823
+20
+1.13702451264398
+30
+-1.2490009027033e-16
+11
+3.0
+21
+0.497732043121051
+31
+1.19348975147204e-15
+12
+2.14023160147296
+22
+1.07221092057491
+32
+-9.71445146547012e-16
+13
+2.14023160147296
+23
+1.07221092057491
+33
+-9.71445146547012e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.497732043121051
+30
+1.19348975147204e-15
+11
+2.17907937354823
+21
+1.13702451264398
+31
+-1.2490009027033e-16
+12
+2.21138724003369
+22
+1.20533375707888
+32
+-6.66133814775094e-16
+13
+2.21138724003369
+23
+1.20533375707888
+33
+-6.66133814775094e-16
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.497732043121051
+30
+1.19348975147204e-15
+11
+2.21138724003369
+21
+1.20533375707888
+31
+-6.66133814775094e-16
+12
+3.0
+22
+0.878679656440356
+32
+1.19348975147204e-15
+13
+3.0
+23
+0.878679656440356
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.92778907942509
+20
+0.85976839852704
+30
+-1.02695629777827e-15
+11
+1.79466624292112
+21
+0.788612759966309
+31
+-1.38777878078145e-16
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+0.788612759966309
+30
+-1.38777878078145e-16
+11
+1.92778907942509
+21
+0.85976839852704
+31
+-1.02695629777827e-15
+12
+1.86297548735602
+22
+0.820920626451767
+32
+1.58206781009085e-15
+13
+1.86297548735602
+23
+0.820920626451767
+33
+1.58206781009085e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+0.788612759966309
+30
+-1.38777878078145e-16
+11
+1.65021954795242
+21
+0.744795334089513
+31
+-3.60822483003176e-16
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.65021954795242
+20
+0.744795334089513
+30
+-3.60822483003176e-16
+11
+1.79466624292112
+21
+0.788612759966309
+31
+-1.38777878078145e-16
+12
+1.72351920148594
+22
+0.763155941486199
+32
+-5.27355936696949e-16
+13
+1.72351920148594
+23
+0.763155941486199
+33
+-5.27355936696949e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.25520466591049
+20
+1.34978045204758
+30
+-1.2490009027033e-15
+11
+2.21138724003369
+21
+1.20533375707888
+31
+-6.66133814775094e-16
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.20533375707888
+30
+-6.66133814775094e-16
+11
+2.25520466591049
+21
+1.34978045204758
+31
+-1.2490009027033e-15
+12
+2.2368440585138
+22
+1.27648079851406
+32
+-1.06858966120171e-15
+13
+2.2368440585138
+23
+1.27648079851406
+33
+-1.06858966120171e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.820920626451768
+20
+1.86297548735602
+30
+1.65145674912992e-15
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+0.78861275996631
+22
+1.79466624292112
+32
+2.77555756156289e-17
+13
+0.78861275996631
+23
+1.79466624292112
+33
+2.77555756156289e-17
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+0.820920626451768
+21
+1.86297548735602
+31
+1.65145674912992e-15
+12
+0.859768398527041
+22
+1.92778907942509
+32
+8.74300631892311e-16
+13
+0.859768398527041
+23
+1.92778907942509
+33
+8.74300631892311e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.904781950910692
+20
+1.98848282880601
+30
+1.31838984174237e-15
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+0.859768398527041
+22
+1.92778907942509
+32
+8.74300631892311e-16
+13
+0.859768398527041
+23
+1.92778907942509
+33
+8.74300631892311e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+0.904781950910692
+21
+1.98848282880601
+31
+1.31838984174237e-15
+12
+0.955527778486359
+22
+2.04447222151364
+32
+1.20736753927986e-15
+13
+0.955527778486359
+23
+2.04447222151364
+33
+1.20736753927986e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.7631559414862
+20
+1.72351920148594
+30
+-2.77555756156289e-17
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+0.744795334089513
+22
+1.65021954795242
+32
+4.71844785465692e-16
+13
+0.744795334089513
+23
+1.65021954795242
+33
+4.71844785465692e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+0.7631559414862
+21
+1.72351920148594
+31
+-2.77555756156289e-17
+12
+0.78861275996631
+22
+1.79466624292112
+32
+2.77555756156289e-17
+13
+0.78861275996631
+23
+1.79466624292112
+33
+2.77555756156289e-17
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+2.21138724003369
+30
+-1.4432899320127e-15
+11
+1.92778907942509
+21
+2.14023160147296
+31
+-1.02695629777827e-15
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.92778907942509
+20
+2.14023160147296
+30
+-1.02695629777827e-15
+11
+1.79466624292112
+21
+2.21138724003369
+31
+-1.4432899320127e-15
+12
+1.86297548735602
+22
+2.17907937354823
+32
+1.58206781009085e-15
+13
+1.86297548735602
+23
+2.17907937354823
+33
+1.58206781009085e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.65021954795242
+20
+2.25520466591049
+30
+-3.60822483003176e-16
+11
+1.79466624292112
+21
+2.21138724003369
+31
+-1.4432899320127e-15
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+2.21138724003369
+30
+-1.4432899320127e-15
+11
+1.65021954795242
+21
+2.25520466591049
+31
+-3.60822483003176e-16
+12
+1.72351920148594
+22
+2.2368440585138
+32
+-5.27355936696949e-16
+13
+1.72351920148594
+23
+2.2368440585138
+33
+-5.27355936696949e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.72351920148594
+20
+0.763155941486199
+30
+-5.27355936696949e-16
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+1.19348975147204e-15
+12
+1.65021954795242
+22
+0.744795334089513
+32
+-3.60822483003176e-16
+13
+1.65021954795242
+23
+0.744795334089513
+33
+-3.60822483003176e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+1.19348975147204e-15
+11
+1.72351920148594
+21
+0.763155941486199
+31
+-5.27355936696949e-16
+12
+1.79466624292112
+22
+0.788612759966309
+32
+-1.38777878078145e-16
+13
+1.79466624292112
+23
+0.788612759966309
+33
+-1.38777878078145e-16
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+1.19348975147204e-15
+11
+1.79466624292112
+21
+0.788612759966309
+31
+-1.38777878078145e-16
+12
+2.12132034355964
+22
+1.11022302462516e-16
+32
+-6.80011602582908e-16
+13
+2.12132034355964
+23
+1.11022302462516e-16
+33
+-6.80011602582908e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.79466624292112
+30
+-6.66133814775094e-16
+11
+2.25520466591049
+21
+1.65021954795242
+31
+-1.2490009027033e-15
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.25520466591049
+20
+1.65021954795242
+30
+-1.2490009027033e-15
+11
+2.21138724003369
+21
+1.79466624292112
+31
+-6.66133814775094e-16
+12
+2.2368440585138
+22
+1.72351920148594
+32
+-1.06858966120171e-15
+13
+2.2368440585138
+23
+1.72351920148594
+33
+-1.06858966120171e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.25520466591049
+20
+1.65021954795242
+30
+-1.2490009027033e-15
+11
+2.27
+21
+1.5
+31
+-2.35922392732846e-16
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+-2.35922392732846e-16
+11
+2.25520466591049
+21
+1.65021954795242
+31
+-1.2490009027033e-15
+12
+2.26629223953759
+22
+1.57547319805376
+32
+-1.11022302462516e-16
+13
+2.26629223953759
+23
+1.57547319805376
+33
+-1.11022302462516e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.01151717119399
+21
+0.904781950910693
+31
+6.38378239159465e-16
+12
+0.955527778486359
+22
+0.955527778486358
+32
+1.20736753927986e-15
+13
+0.955527778486359
+23
+0.955527778486358
+33
+1.20736753927986e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.01151717119399
+20
+0.904781950910693
+30
+6.38378239159465e-16
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.07221092057491
+22
+0.85976839852704
+32
+-1.38777878078145e-17
+13
+1.07221092057491
+23
+0.85976839852704
+33
+-1.38777878078145e-17
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.13702451264398
+21
+0.820920626451767
+31
+8.18789480661053e-16
+12
+1.07221092057491
+22
+0.85976839852704
+32
+-1.38777878078145e-17
+13
+1.07221092057491
+23
+0.85976839852704
+33
+-1.38777878078145e-17
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.13702451264398
+20
+0.820920626451767
+30
+8.18789480661053e-16
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.20533375707888
+22
+0.788612759966309
+32
+2.63677968348475e-16
+13
+1.20533375707888
+23
+0.788612759966309
+33
+2.63677968348475e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+0.733707760462409
+21
+1.42452680194624
+31
+4.16333634234434e-16
+12
+0.73
+22
+1.5
+32
+7.07767178198537e-16
+13
+0.73
+23
+1.5
+33
+7.07767178198537e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.733707760462409
+20
+1.42452680194624
+30
+4.16333634234434e-16
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+0.744795334089513
+22
+1.34978045204758
+32
+4.71844785465692e-16
+13
+0.744795334089513
+23
+1.34978045204758
+33
+4.71844785465692e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.27648079851406
+21
+0.763155941486199
+31
+1.1518563880486e-15
+12
+1.20533375707888
+22
+0.788612759966309
+32
+2.63677968348475e-16
+13
+1.20533375707888
+23
+0.788612759966309
+33
+2.63677968348475e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.27648079851406
+20
+0.763155941486199
+30
+1.1518563880486e-15
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.34978045204758
+22
+0.744795334089513
+32
+-4.02455846426619e-16
+13
+1.34978045204758
+23
+0.744795334089513
+33
+-4.02455846426619e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+0.7631559414862
+21
+1.27648079851406
+31
+-2.77555756156289e-17
+12
+0.744795334089513
+22
+1.34978045204758
+32
+4.71844785465692e-16
+13
+0.744795334089513
+23
+1.34978045204758
+33
+4.71844785465692e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.7631559414862
+20
+1.27648079851406
+30
+-2.77555756156289e-17
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+0.78861275996631
+22
+1.20533375707888
+32
+2.77555756156289e-17
+13
+0.78861275996631
+23
+1.20533375707888
+33
+2.77555756156289e-17
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.733707760462409
+20
+1.57547319805376
+30
+4.16333634234434e-16
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+0.73
+22
+1.5
+32
+7.07767178198537e-16
+13
+0.73
+23
+1.5
+33
+7.07767178198537e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+0.733707760462409
+21
+1.57547319805376
+31
+4.16333634234434e-16
+12
+0.744795334089513
+22
+1.65021954795242
+32
+4.71844785465692e-16
+13
+0.744795334089513
+23
+1.65021954795242
+33
+4.71844785465692e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+0.820920626451768
+21
+1.13702451264398
+31
+1.65145674912992e-15
+12
+0.78861275996631
+22
+1.20533375707888
+32
+2.77555756156289e-17
+13
+0.78861275996631
+23
+1.20533375707888
+33
+2.77555756156289e-17
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.820920626451768
+20
+1.13702451264398
+30
+1.65145674912992e-15
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+0.859768398527041
+22
+1.07221092057491
+32
+8.74300631892311e-16
+13
+0.859768398527041
+23
+1.07221092057491
+33
+8.74300631892311e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+-2.35922392732846e-16
+11
+2.25520466591049
+21
+1.34978045204758
+31
+-1.2490009027033e-15
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.25520466591049
+20
+1.34978045204758
+30
+-1.2490009027033e-15
+11
+2.27
+21
+1.5
+31
+-2.35922392732846e-16
+12
+2.26629223953759
+22
+1.42452680194624
+32
+-1.11022302462516e-16
+13
+2.26629223953759
+23
+1.42452680194624
+33
+-1.11022302462516e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.14023160147296
+20
+1.07221092057491
+30
+-9.71445146547012e-16
+11
+2.04447222151364
+21
+0.955527778486358
+31
+-1.11022302462516e-16
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+0.955527778486358
+30
+-1.11022302462516e-16
+11
+2.14023160147296
+21
+1.07221092057491
+31
+-9.71445146547012e-16
+12
+2.09521804908931
+22
+1.01151717119399
+32
+7.63278329429795e-16
+13
+2.09521804908931
+23
+1.01151717119399
+33
+7.63278329429795e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.57547319805376
+20
+2.26629223953759
+30
+1.38777878078145e-16
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.5
+22
+2.27
+32
+6.93889390390723e-16
+13
+1.5
+23
+2.27
+33
+6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.57547319805376
+21
+2.26629223953759
+31
+1.38777878078145e-16
+12
+1.65021954795242
+22
+2.25520466591049
+32
+-3.60822483003176e-16
+13
+1.65021954795242
+23
+2.25520466591049
+33
+-3.60822483003176e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.01151717119399
+20
+2.09521804908931
+30
+6.38378239159465e-16
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+0.955527778486359
+22
+2.04447222151364
+32
+1.20736753927986e-15
+13
+0.955527778486359
+23
+2.04447222151364
+33
+1.20736753927986e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.01151717119399
+21
+2.09521804908931
+31
+6.38378239159465e-16
+12
+1.07221092057491
+22
+2.14023160147296
+32
+3.19189119579733e-16
+13
+1.07221092057491
+23
+2.14023160147296
+33
+3.19189119579733e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.13702451264398
+20
+2.17907937354823
+30
+8.18789480661053e-16
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.07221092057491
+22
+2.14023160147296
+32
+3.19189119579733e-16
+13
+1.07221092057491
+23
+2.14023160147296
+33
+3.19189119579733e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.13702451264398
+21
+2.17907937354823
+31
+8.18789480661053e-16
+12
+1.20533375707888
+22
+2.21138724003369
+32
+-5.68989300120393e-16
+13
+1.20533375707888
+23
+2.21138724003369
+33
+-5.68989300120393e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+0.955527778486358
+30
+-1.11022302462516e-16
+11
+1.92778907942509
+21
+0.85976839852704
+31
+-1.02695629777827e-15
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.92778907942509
+20
+0.85976839852704
+30
+-1.02695629777827e-15
+11
+2.04447222151364
+21
+0.955527778486358
+31
+-1.11022302462516e-16
+12
+1.98848282880601
+22
+0.904781950910692
+32
+-1.66533453693773e-16
+13
+1.98848282880601
+23
+0.904781950910692
+33
+-1.66533453693773e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.27648079851407
+20
+2.2368440585138
+30
+-1.80411241501588e-16
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.20533375707888
+22
+2.21138724003369
+32
+-5.68989300120393e-16
+13
+1.20533375707888
+23
+2.21138724003369
+33
+-5.68989300120393e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.27648079851407
+21
+2.2368440585138
+31
+-1.80411241501588e-16
+12
+1.34978045204758
+22
+2.25520466591049
+32
+-4.02455846426619e-16
+13
+1.34978045204758
+23
+2.25520466591049
+33
+-4.02455846426619e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.42452680194624
+20
+2.26629223953759
+30
+-6.93889390390723e-16
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.34978045204758
+22
+2.25520466591049
+32
+-4.02455846426619e-16
+13
+1.34978045204758
+23
+2.25520466591049
+33
+-4.02455846426619e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.42452680194624
+21
+2.26629223953759
+31
+-6.93889390390723e-16
+12
+1.5
+22
+2.27
+32
+6.93889390390723e-16
+13
+1.5
+23
+2.27
+33
+6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.20533375707888
+30
+-6.66133814775094e-16
+11
+2.14023160147296
+21
+1.07221092057491
+31
+-9.71445146547012e-16
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.14023160147296
+20
+1.07221092057491
+30
+-9.71445146547012e-16
+11
+2.21138724003369
+21
+1.20533375707888
+31
+-6.66133814775094e-16
+12
+2.17907937354823
+22
+1.13702451264398
+32
+-1.2490009027033e-16
+13
+2.17907937354823
+23
+1.13702451264398
+33
+-1.2490009027033e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+0.904781950910692
+21
+1.01151717119399
+31
+1.31838984174237e-15
+12
+0.859768398527041
+22
+1.07221092057491
+32
+8.74300631892311e-16
+13
+0.859768398527041
+23
+1.07221092057491
+33
+8.74300631892311e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.904781950910692
+20
+1.01151717119399
+30
+1.31838984174237e-15
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+0.955527778486359
+22
+0.955527778486358
+32
+1.20736753927986e-15
+13
+0.955527778486359
+23
+0.955527778486358
+33
+1.20736753927986e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.57547319805376
+21
+0.733707760462408
+31
+1.38777878078145e-16
+12
+1.5
+22
+0.73
+32
+6.93889390390723e-16
+13
+1.5
+23
+0.73
+33
+6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.57547319805376
+20
+0.733707760462408
+30
+1.38777878078145e-16
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.65021954795242
+22
+0.744795334089513
+32
+-3.60822483003176e-16
+13
+1.65021954795242
+23
+0.744795334089513
+33
+-3.60822483003176e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20163144893051
+20
+3.0
+30
+1.19348975147204e-15
+11
+1.20533375707888
+21
+2.21138724003369
+31
+-5.68989300120393e-16
+12
+0.878679656440358
+22
+3.0
+32
+9.29811783123569e-16
+13
+0.878679656440358
+23
+3.0
+33
+9.29811783123569e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20533375707888
+20
+2.21138724003369
+30
+-5.68989300120393e-16
+11
+1.20163144893051
+21
+3.0
+31
+1.19348975147204e-15
+12
+1.27648079851407
+22
+2.2368440585138
+32
+-1.80411241501588e-16
+13
+1.27648079851407
+23
+2.2368440585138
+33
+-1.80411241501588e-16
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.27648079851407
+20
+2.2368440585138
+30
+-1.80411241501588e-16
+11
+1.20163144893051
+21
+3.0
+31
+1.19348975147204e-15
+12
+1.34978045204758
+22
+2.25520466591049
+32
+-4.02455846426619e-16
+13
+1.34978045204758
+23
+2.25520466591049
+33
+-4.02455846426619e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.33226762955019e-15
+20
+2.50226795687895
+30
+1.19348975147204e-15
+11
+0.78861275996631
+21
+1.79466624292112
+31
+2.77555756156289e-17
+12
+1.19348975147204e-15
+22
+2.12132034355964
+32
+-1.16573417585641e-15
+13
+1.19348975147204e-15
+23
+2.12132034355964
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.78861275996631
+20
+1.79466624292112
+30
+2.77555756156289e-17
+11
+1.33226762955019e-15
+21
+2.50226795687895
+31
+1.19348975147204e-15
+12
+0.820920626451768
+22
+1.86297548735602
+32
+1.65145674912992e-15
+13
+0.820920626451768
+23
+1.86297548735602
+33
+1.65145674912992e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.820920626451768
+20
+1.86297548735602
+30
+1.65145674912992e-15
+11
+1.33226762955019e-15
+21
+2.50226795687895
+31
+1.19348975147204e-15
+12
+0.859768398527041
+22
+1.92778907942509
+32
+8.74300631892311e-16
+13
+0.859768398527041
+23
+1.92778907942509
+33
+8.74300631892311e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+-1.56819002228303e-15
+11
+1.86297548735602
+21
+2.17907937354823
+31
+1.58206781009085e-15
+12
+1.79466624292112
+22
+2.21138724003369
+32
+-1.4432899320127e-15
+13
+1.79466624292112
+23
+2.21138724003369
+33
+-1.4432899320127e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.86297548735602
+20
+2.17907937354823
+30
+1.58206781009085e-15
+11
+2.12132034355964
+21
+3.0
+31
+-1.56819002228303e-15
+12
+1.92778907942509
+22
+2.14023160147296
+32
+-1.02695629777827e-15
+13
+1.92778907942509
+23
+2.14023160147296
+33
+-1.02695629777827e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.92778907942509
+20
+2.14023160147296
+30
+-1.02695629777827e-15
+11
+2.12132034355964
+21
+3.0
+31
+-1.56819002228303e-15
+12
+2.50226795687895
+22
+3.0
+32
+1.19348975147204e-15
+13
+2.50226795687895
+23
+3.0
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.42452680194624
+21
+0.733707760462408
+31
+-6.93889390390723e-16
+12
+1.34978045204758
+22
+0.744795334089513
+32
+-4.02455846426619e-16
+13
+1.34978045204758
+23
+0.744795334089513
+33
+-4.02455846426619e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.42452680194624
+20
+0.733707760462408
+30
+-6.93889390390723e-16
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.5
+22
+0.73
+32
+6.93889390390723e-16
+13
+1.5
+23
+0.73
+33
+6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+2.12132034355964
+30
+1.19348975147204e-15
+11
+2.2368440585138
+21
+1.72351920148594
+31
+-1.06858966120171e-15
+12
+2.21138724003369
+22
+1.79466624292112
+32
+-6.66133814775094e-16
+13
+2.21138724003369
+23
+1.79466624292112
+33
+-6.66133814775094e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.2368440585138
+20
+1.72351920148594
+30
+-1.06858966120171e-15
+11
+3.0
+21
+2.12132034355964
+31
+1.19348975147204e-15
+12
+2.25520466591049
+22
+1.65021954795242
+32
+-1.2490009027033e-15
+13
+2.25520466591049
+23
+1.65021954795242
+33
+-1.2490009027033e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.25520466591049
+20
+1.65021954795242
+30
+-1.2490009027033e-15
+11
+3.0
+21
+2.12132034355964
+31
+1.19348975147204e-15
+12
+3.0
+22
+1.79836855106949
+32
+1.19348975147204e-15
+13
+3.0
+23
+1.79836855106949
+33
+1.19348975147204e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.79466624292112
+21
+2.21138724003369
+31
+1.5
+12
+1.79466624292112
+22
+2.21138724003369
+32
+3.0
+13
+1.79466624292112
+23
+2.21138724003369
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+2.21138724003369
+30
+1.5
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+1.79466624292112
+22
+2.21138724003369
+32
+-1.4432899320127e-15
+13
+1.79466624292112
+23
+2.21138724003369
+33
+-1.4432899320127e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+2.21138724003369
+30
+-1.4432899320127e-15
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+-1.56819002228303e-15
+13
+2.12132034355964
+23
+3.0
+33
+-1.56819002228303e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+-1.56819002228303e-15
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+2.795
+13
+2.12132034355964
+23
+3.0
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+-1.56819002228303e-15
+11
+2.12132034355964
+21
+3.0
+31
+2.795
+12
+2.12132034355964
+22
+3.0
+32
+2.17367965644036
+13
+2.12132034355964
+23
+3.0
+33
+2.17367965644036
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+-1.56819002228303e-15
+11
+2.12132034355964
+21
+3.0
+31
+2.17367965644036
+12
+2.12132034355964
+22
+3.0
+32
+0.826320343559642
+13
+2.12132034355964
+23
+3.0
+33
+0.826320343559642
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+-1.56819002228303e-15
+11
+2.12132034355964
+21
+3.0
+31
+0.826320343559642
+12
+2.12132034355964
+22
+3.0
+32
+0.204999999999999
+13
+2.12132034355964
+23
+3.0
+33
+0.204999999999999
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.86297548735602
+20
+2.17907937354823
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+1.79466624292112
+22
+2.21138724003369
+32
+3.0
+13
+1.79466624292112
+23
+2.21138724003369
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.86297548735602
+21
+2.17907937354823
+31
+3.0
+12
+1.92778907942509
+22
+2.14023160147296
+32
+3.0
+13
+1.92778907942509
+23
+2.14023160147296
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.92778907942509
+21
+2.14023160147296
+31
+3.0
+12
+2.50226795687895
+22
+3.0
+32
+3.0
+13
+2.50226795687895
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.788612759966309
+20
+1.79466624292112
+30
+3.0
+11
+2.77555756156289e-16
+21
+2.50226795687895
+31
+3.0
+12
+2.77555756156289e-16
+22
+2.12132034355964
+32
+3.0
+13
+2.77555756156289e-16
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+2.50226795687895
+30
+3.0
+11
+0.788612759966309
+21
+1.79466624292112
+31
+3.0
+12
+0.820920626451767
+22
+1.86297548735602
+32
+3.0
+13
+0.820920626451767
+23
+1.86297548735602
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+2.50226795687895
+30
+3.0
+11
+0.820920626451767
+21
+1.86297548735602
+31
+3.0
+12
+0.859768398527041
+22
+1.92778907942509
+32
+3.0
+13
+0.859768398527041
+23
+1.92778907942509
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+3.0
+30
+-1.16573417585641e-15
+11
+0.955527778486359
+21
+2.04447222151364
+31
+1.5
+12
+0.955527778486359
+22
+2.04447222151364
+32
+1.20736753927986e-15
+13
+0.955527778486359
+23
+2.04447222151364
+33
+1.20736753927986e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486359
+20
+2.04447222151364
+30
+1.5
+11
+1.19348975147204e-15
+21
+3.0
+31
+-1.16573417585641e-15
+12
+0.955527778486358
+22
+2.04447222151364
+32
+3.0
+13
+0.955527778486358
+23
+2.04447222151364
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486358
+20
+2.04447222151364
+30
+3.0
+11
+1.19348975147204e-15
+21
+3.0
+31
+-1.16573417585641e-15
+12
+2.77555756156289e-16
+22
+3.0
+32
+3.0
+13
+2.77555756156289e-16
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.859768398527041
+20
+1.92778907942509
+30
+3.0
+11
+2.77555756156289e-16
+21
+3.0
+31
+3.0
+12
+2.77555756156289e-16
+22
+2.50226795687895
+32
+3.0
+13
+2.77555756156289e-16
+23
+2.50226795687895
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+3.0
+30
+3.0
+11
+0.859768398527041
+21
+1.92778907942509
+31
+3.0
+12
+0.904781950910692
+22
+1.98848282880601
+32
+3.0
+13
+0.904781950910692
+23
+1.98848282880601
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+3.0
+30
+3.0
+11
+0.904781950910692
+21
+1.98848282880601
+31
+3.0
+12
+0.955527778486358
+22
+2.04447222151364
+32
+3.0
+13
+0.955527778486358
+23
+2.04447222151364
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.34978045204758
+20
+2.25520466591049
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.34978045204758
+21
+2.25520466591049
+31
+3.0
+12
+1.42452680194624
+22
+2.26629223953759
+32
+3.0
+13
+1.42452680194624
+23
+2.26629223953759
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.42452680194624
+21
+2.26629223953759
+31
+3.0
+12
+1.5
+22
+2.27
+32
+3.0
+13
+1.5
+23
+2.27
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.26629223953759
+20
+1.57547319805376
+30
+3.0
+11
+3.0
+21
+1.79836855106949
+31
+3.0
+12
+2.25520466591049
+22
+1.65021954795242
+32
+3.0
+13
+2.25520466591049
+23
+1.65021954795242
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+2.26629223953759
+21
+1.57547319805376
+31
+3.0
+12
+2.27
+22
+1.5
+32
+3.0
+13
+2.27
+23
+1.5
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+2.27
+21
+1.5
+31
+3.0
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.205000000000001
+20
+0.0
+30
+3.0
+11
+0.955527778486358
+21
+0.955527778486358
+31
+3.0
+12
+2.77555756156289e-16
+22
+0.0
+32
+3.0
+13
+2.77555756156289e-16
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486358
+20
+0.955527778486358
+30
+3.0
+11
+0.205000000000001
+21
+0.0
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486358
+20
+0.955527778486358
+30
+3.0
+11
+0.497732043121053
+21
+0.0
+31
+3.0
+12
+1.01151717119399
+22
+0.904781950910693
+32
+3.0
+13
+1.01151717119399
+23
+0.904781950910693
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.01151717119399
+20
+0.904781950910693
+30
+3.0
+11
+0.497732043121053
+21
+0.0
+31
+3.0
+12
+1.07221092057491
+22
+0.85976839852704
+32
+3.0
+13
+1.07221092057491
+23
+0.85976839852704
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.744795334089513
+20
+1.34978045204758
+30
+3.0
+11
+2.77555756156289e-16
+21
+1.5
+31
+3.0
+12
+2.77555756156289e-16
+22
+1.20163144893051
+32
+3.0
+13
+2.77555756156289e-16
+23
+1.20163144893051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+1.5
+30
+3.0
+11
+0.744795334089513
+21
+1.34978045204758
+31
+3.0
+12
+0.733707760462408
+22
+1.42452680194624
+32
+3.0
+13
+0.733707760462408
+23
+1.42452680194624
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.77555756156289e-16
+20
+1.5
+30
+3.0
+11
+0.733707760462408
+21
+1.42452680194624
+31
+3.0
+12
+0.73
+22
+1.5
+32
+3.0
+13
+0.73
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.98848282880601
+20
+2.09521804908931
+30
+3.0
+11
+2.50226795687895
+21
+3.0
+31
+3.0
+12
+1.92778907942509
+22
+2.14023160147296
+32
+3.0
+13
+1.92778907942509
+23
+2.14023160147296
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+1.98848282880601
+21
+2.09521804908931
+31
+3.0
+12
+2.04447222151364
+22
+2.04447222151364
+32
+3.0
+13
+2.04447222151364
+23
+2.04447222151364
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+2.04447222151364
+21
+2.04447222151364
+31
+3.0
+12
+3.0
+22
+3.0
+32
+3.0
+13
+3.0
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+3.0
+11
+1.5
+21
+0.73
+31
+3.0
+12
+1.5
+22
+0.0
+32
+3.0
+13
+1.5
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.73
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.57547319805376
+22
+0.733707760462408
+32
+3.0
+13
+1.57547319805376
+23
+0.733707760462408
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.57547319805376
+20
+0.733707760462408
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.65021954795242
+22
+0.744795334089513
+32
+3.0
+13
+1.65021954795242
+23
+0.744795334089513
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.09521804908931
+21
+1.01151717119399
+31
+3.0
+12
+2.04447222151364
+22
+0.955527778486358
+32
+3.0
+13
+2.04447222151364
+23
+0.955527778486358
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.09521804908931
+20
+1.01151717119399
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+2.14023160147296
+22
+1.07221092057491
+32
+3.0
+13
+2.14023160147296
+23
+1.07221092057491
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.14023160147296
+20
+1.07221092057491
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.497732043121051
+32
+3.0
+13
+3.0
+23
+0.497732043121051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+2.17367965644036
+11
+2.795
+21
+3.0
+31
+1.5
+12
+2.12132034355964
+22
+3.0
+32
+0.826320343559642
+13
+2.12132034355964
+23
+3.0
+33
+0.826320343559642
+70
+0
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+2.17367965644036
+11
+2.795
+21
+3.0
+31
+2.795
+12
+2.795
+22
+3.0
+32
+1.5
+13
+2.795
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.12132034355964
+21
+3.0
+31
+2.17367965644036
+12
+2.12132034355964
+22
+3.0
+32
+2.795
+13
+2.12132034355964
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.795
+20
+3.0
+30
+0.204999999999999
+11
+3.0
+21
+3.0
+31
+1.19348975147204e-15
+12
+2.795
+22
+3.0
+32
+-1.16573417585641e-15
+13
+2.795
+23
+3.0
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+3.0
+30
+1.19348975147204e-15
+11
+2.795
+21
+3.0
+31
+0.204999999999999
+12
+3.0
+22
+3.0
+32
+0.204999999999999
+13
+3.0
+23
+3.0
+33
+0.204999999999999
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+0.204999999999999
+11
+2.50226795687895
+21
+3.0
+31
+1.19348975147204e-15
+12
+2.12132034355964
+22
+3.0
+32
+-1.56819002228303e-15
+13
+2.12132034355964
+23
+3.0
+33
+-1.56819002228303e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.50226795687895
+20
+3.0
+30
+1.19348975147204e-15
+11
+2.795
+21
+3.0
+31
+0.204999999999999
+12
+2.795
+22
+3.0
+32
+-1.16573417585641e-15
+13
+2.795
+23
+3.0
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.795
+20
+3.0
+30
+0.204999999999999
+11
+2.50226795687895
+21
+3.0
+31
+1.19348975147204e-15
+12
+2.12132034355964
+22
+3.0
+32
+0.204999999999999
+13
+2.12132034355964
+23
+3.0
+33
+0.204999999999999
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.795
+20
+3.0
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.204999999999999
+12
+2.795
+22
+3.0
+32
+0.204999999999999
+13
+2.795
+23
+3.0
+33
+0.204999999999999
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+3.0
+30
+0.204999999999999
+11
+2.795
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440358
+20
+3.0
+30
+0.826320343559643
+11
+1.5
+21
+3.0
+31
+0.204999999999999
+12
+0.878679656440358
+22
+3.0
+32
+0.204999999999999
+13
+0.878679656440358
+23
+3.0
+33
+0.204999999999999
+70
+0
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.878679656440357
+21
+3.0
+31
+2.17367965644036
+12
+0.878679656440357
+22
+3.0
+32
+2.795
+13
+0.878679656440357
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440358
+20
+3.0
+30
+0.826320343559643
+11
+1.5
+21
+3.0
+31
+2.795
+12
+1.5
+22
+3.0
+32
+0.204999999999999
+13
+1.5
+23
+3.0
+33
+0.204999999999999
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.878679656440358
+21
+3.0
+31
+0.826320343559643
+12
+0.878679656440357
+22
+3.0
+32
+2.17367965644036
+13
+0.878679656440357
+23
+3.0
+33
+2.17367965644036
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.795
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+2.795
+12
+2.795
+22
+3.0
+32
+2.795
+13
+2.795
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+3.0
+30
+2.795
+11
+2.795
+21
+3.0
+31
+3.0
+12
+3.0
+22
+3.0
+32
+3.0
+13
+3.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.795
+20
+3.0
+30
+2.795
+11
+3.0
+21
+3.0
+31
+1.5
+12
+2.795
+22
+3.0
+32
+1.5
+13
+2.795
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+3.0
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+2.795
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440358
+20
+3.0
+30
+0.204999999999999
+11
+1.20163144893051
+21
+3.0
+31
+1.19348975147204e-15
+12
+0.878679656440358
+22
+3.0
+32
+9.29811783123569e-16
+13
+0.878679656440358
+23
+3.0
+33
+9.29811783123569e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20163144893051
+20
+3.0
+30
+1.19348975147204e-15
+11
+1.5
+21
+3.0
+31
+0.204999999999999
+12
+1.5
+22
+3.0
+32
+6.93889390390723e-16
+13
+1.5
+23
+3.0
+33
+6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+3.0
+30
+0.204999999999999
+11
+1.20163144893051
+21
+3.0
+31
+1.19348975147204e-15
+12
+0.878679656440358
+22
+3.0
+32
+0.204999999999999
+13
+0.878679656440358
+23
+3.0
+33
+0.204999999999999
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+2.795
+21
+3.0
+31
+2.795
+12
+2.12132034355964
+22
+3.0
+32
+2.795
+13
+2.12132034355964
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.795
+20
+3.0
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+2.50226795687895
+22
+3.0
+32
+3.0
+13
+2.50226795687895
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+5.55111512312578e-17
+30
+0.204999999999999
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+1.19348975147204e-15
+12
+2.12132034355964
+22
+1.11022302462516e-16
+32
+-6.80011602582908e-16
+13
+2.12132034355964
+23
+1.11022302462516e-16
+33
+-6.80011602582908e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+1.19348975147204e-15
+11
+1.5
+21
+0.0
+31
+0.204999999999999
+12
+1.5
+22
+0.0
+32
+6.93889390390723e-16
+13
+1.5
+23
+0.0
+33
+6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.0
+30
+0.204999999999999
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+1.19348975147204e-15
+12
+2.12132034355964
+22
+5.55111512312578e-17
+32
+0.204999999999999
+13
+2.12132034355964
+23
+5.55111512312578e-17
+33
+0.204999999999999
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+1.11022302462516e-16
+30
+3.0
+11
+1.5
+21
+0.0
+31
+2.795
+12
+2.12132034355964
+22
+5.55111512312578e-17
+32
+2.795
+13
+2.12132034355964
+23
+5.55111512312578e-17
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.12132034355964
+21
+1.11022302462516e-16
+31
+3.0
+12
+1.79836855106949
+22
+5.55111512312578e-17
+32
+3.0
+13
+1.79836855106949
+23
+5.55111512312578e-17
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.0
+30
+2.795
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.5
+22
+0.0
+32
+3.0
+13
+1.5
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.12132034355964
+20
+5.55111512312578e-17
+30
+0.826320343559641
+11
+1.5
+21
+0.0
+31
+0.204999999999999
+12
+2.12132034355964
+22
+5.55111512312578e-17
+32
+0.204999999999999
+13
+2.12132034355964
+23
+5.55111512312578e-17
+33
+0.204999999999999
+70
+0
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+2.17367965644035
+11
+0.205000000000001
+21
+0.0
+31
+1.5
+12
+0.878679656440356
+22
+0.0
+32
+0.826320343559644
+13
+0.878679656440356
+23
+0.0
+33
+0.826320343559644
+70
+0
+ 0
+3DFACE
+ 8
+star_d
+10
+0.205000000000001
+20
+0.0
+30
+3.0
+11
+1.19348975147204e-15
+21
+0.0
+31
+2.795
+12
+0.205000000000001
+22
+0.0
+32
+2.795
+13
+0.205000000000001
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+0.0
+30
+2.795
+11
+0.205000000000001
+21
+0.0
+31
+3.0
+12
+2.77555756156289e-16
+22
+0.0
+32
+3.0
+13
+2.77555756156289e-16
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.205000000000001
+20
+0.0
+30
+1.5
+11
+1.19348975147204e-15
+21
+0.0
+31
+0.204999999999999
+12
+0.205000000000001
+22
+0.0
+32
+0.204999999999999
+13
+0.205000000000001
+23
+0.0
+33
+0.204999999999999
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+0.0
+30
+0.204999999999999
+11
+0.205000000000001
+21
+0.0
+31
+1.5
+12
+1.19348975147204e-15
+22
+0.0
+32
+1.5
+13
+1.19348975147204e-15
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.205000000000001
+20
+0.0
+30
+0.204999999999999
+11
+1.19348975147204e-15
+21
+0.0
+31
+-1.16573417585641e-15
+12
+0.205000000000001
+22
+0.0
+32
+-1.16573417585641e-15
+13
+0.205000000000001
+23
+0.0
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.19348975147204e-15
+20
+0.0
+30
+-1.16573417585641e-15
+11
+0.205000000000001
+21
+0.0
+31
+0.204999999999999
+12
+1.19348975147204e-15
+22
+0.0
+32
+0.204999999999999
+13
+1.19348975147204e-15
+23
+0.0
+33
+0.204999999999999
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+3.0
+11
+0.205000000000001
+21
+0.0
+31
+2.795
+12
+0.878679656440356
+22
+0.0
+32
+2.795
+13
+0.878679656440356
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.205000000000001
+20
+0.0
+30
+2.795
+11
+0.878679656440356
+21
+0.0
+31
+3.0
+12
+0.205000000000001
+22
+0.0
+32
+3.0
+13
+0.205000000000001
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.205000000000001
+20
+0.0
+30
+3.0
+11
+0.878679656440356
+21
+0.0
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+0.204999999999999
+11
+0.497732043121054
+21
+0.0
+31
+1.19348975147204e-15
+12
+0.878679656440356
+22
+0.0
+32
+-7.35522753814166e-16
+13
+0.878679656440356
+23
+0.0
+33
+-7.35522753814166e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.497732043121054
+20
+0.0
+30
+1.19348975147204e-15
+11
+0.205000000000001
+21
+0.0
+31
+0.204999999999999
+12
+0.205000000000001
+22
+0.0
+32
+-1.16573417585641e-15
+13
+0.205000000000001
+23
+0.0
+33
+-1.16573417585641e-15
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.205000000000001
+20
+0.0
+30
+0.204999999999999
+11
+0.497732043121054
+21
+0.0
+31
+1.19348975147204e-15
+12
+0.878679656440356
+22
+0.0
+32
+0.204999999999999
+13
+0.878679656440356
+23
+0.0
+33
+0.204999999999999
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+2.17367965644035
+11
+0.205000000000001
+21
+0.0
+31
+2.795
+12
+0.205000000000001
+22
+0.0
+32
+1.5
+13
+0.205000000000001
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.205000000000001
+20
+0.0
+30
+2.795
+11
+0.878679656440356
+21
+0.0
+31
+2.17367965644035
+12
+0.878679656440356
+22
+0.0
+32
+2.795
+13
+0.878679656440356
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.878679656440356
+20
+0.0
+30
+0.826320343559644
+11
+0.205000000000001
+21
+0.0
+31
+0.204999999999999
+12
+0.878679656440356
+22
+0.0
+32
+0.204999999999999
+13
+0.878679656440356
+23
+0.0
+33
+0.204999999999999
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.205000000000001
+20
+0.0
+30
+0.204999999999999
+11
+0.878679656440356
+21
+0.0
+31
+0.826320343559644
+12
+0.205000000000001
+22
+0.0
+32
+1.5
+13
+0.205000000000001
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.12132034355964
+21
+5.55111512312578e-17
+31
+2.17367965644036
+12
+2.12132034355964
+22
+5.55111512312578e-17
+32
+2.795
+13
+2.12132034355964
+23
+5.55111512312578e-17
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+0.788612759966309
+30
+1.5
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+1.79466624292112
+21
+0.788612759966309
+31
+1.5
+12
+1.86297548735602
+22
+0.820920626451767
+32
+1.5
+13
+1.86297548735602
+23
+0.820920626451767
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+1.86297548735602
+21
+0.820920626451767
+31
+1.5
+12
+1.92778907942509
+22
+0.85976839852704
+32
+1.5
+13
+1.92778907942509
+23
+0.85976839852704
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+1.92778907942509
+21
+0.85976839852704
+31
+1.5
+12
+1.98848282880601
+22
+0.904781950910692
+32
+1.5
+13
+1.98848282880601
+23
+0.904781950910692
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+2.04447222151364
+21
+0.955527778486358
+31
+1.5
+12
+2.04447222151364
+22
+0.955527778486358
+32
+-1.11022302462516e-16
+13
+2.04447222151364
+23
+0.955527778486358
+33
+-1.11022302462516e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+0.955527778486358
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+0.955527778486359
+22
+2.04447222151364
+32
+1.20736753927986e-15
+13
+0.955527778486359
+23
+2.04447222151364
+33
+1.20736753927986e-15
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.955527778486359
+21
+2.04447222151364
+31
+1.20736753927986e-15
+12
+0.955527778486359
+22
+2.04447222151364
+32
+1.5
+13
+0.955527778486359
+23
+2.04447222151364
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.27648079851406
+21
+2.2368440585138
+31
+1.5
+12
+1.20533375707888
+22
+2.21138724003369
+32
+1.5
+13
+1.20533375707888
+23
+2.21138724003369
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.27648079851406
+20
+2.2368440585138
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.34978045204758
+22
+2.25520466591049
+32
+1.5
+13
+1.34978045204758
+23
+2.25520466591049
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.34978045204758
+20
+2.25520466591049
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.42452680194624
+22
+2.26629223953759
+32
+1.5
+13
+1.42452680194624
+23
+2.26629223953759
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.42452680194624
+20
+2.26629223953759
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+2.27
+32
+1.5
+13
+1.5
+23
+2.27
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.820920626451766
+21
+1.86297548735602
+31
+1.5
+12
+0.78861275996631
+22
+1.79466624292112
+32
+1.5
+13
+0.78861275996631
+23
+1.79466624292112
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.820920626451766
+20
+1.86297548735602
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.859768398527041
+22
+1.92778907942509
+32
+1.5
+13
+0.859768398527041
+23
+1.92778907942509
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.859768398527041
+20
+1.92778907942509
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.904781950910694
+22
+1.98848282880601
+32
+1.5
+13
+0.904781950910694
+23
+1.98848282880601
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.904781950910694
+20
+1.98848282880601
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.955527778486359
+22
+2.04447222151364
+32
+1.5
+13
+0.955527778486359
+23
+2.04447222151364
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+2.21138724003369
+22
+1.20533375707888
+32
+-6.66133814775094e-16
+13
+2.21138724003369
+23
+1.20533375707888
+33
+-6.66133814775094e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+0.78861275996631
+21
+1.79466624292112
+31
+1.5
+12
+0.78861275996631
+22
+1.79466624292112
+32
+2.77555756156289e-17
+13
+0.78861275996631
+23
+1.79466624292112
+33
+2.77555756156289e-17
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.78861275996631
+20
+1.79466624292112
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+2.21138724003369
+22
+1.20533375707888
+32
+1.5
+13
+2.21138724003369
+23
+1.20533375707888
+33
+1.5
+70
+15
+ 0
+3DFACE
+ 8
+star_d
+10
+0.78861275996631
+20
+1.79466624292112
+30
+1.5
+11
+2.21138724003369
+21
+1.20533375707888
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.01151717119399
+21
+2.09521804908931
+31
+1.5
+12
+0.955527778486359
+22
+2.04447222151364
+32
+1.5
+13
+0.955527778486359
+23
+2.04447222151364
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.01151717119399
+20
+2.09521804908931
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.07221092057491
+22
+2.14023160147296
+32
+1.5
+13
+1.07221092057491
+23
+2.14023160147296
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.07221092057491
+20
+2.14023160147296
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.13702451264398
+22
+2.17907937354823
+32
+1.5
+13
+1.13702451264398
+23
+2.17907937354823
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.13702451264398
+20
+2.17907937354823
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.20533375707888
+22
+2.21138724003369
+32
+1.5
+13
+1.20533375707888
+23
+2.21138724003369
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.27648079851406
+20
+0.763155941486199
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.20533375707888
+22
+0.788612759966309
+32
+1.5
+13
+1.20533375707888
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.27648079851406
+21
+0.763155941486199
+31
+1.5
+12
+1.34978045204758
+22
+0.744795334089513
+32
+1.5
+13
+1.34978045204758
+23
+0.744795334089513
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.34978045204758
+21
+0.744795334089513
+31
+1.5
+12
+1.42452680194624
+22
+0.733707760462408
+32
+1.5
+13
+1.42452680194624
+23
+0.733707760462408
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.42452680194624
+21
+0.733707760462408
+31
+1.5
+12
+1.5
+22
+0.73
+32
+1.5
+13
+1.5
+23
+0.73
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.79466624292112
+21
+0.788612759966309
+31
+1.5
+12
+1.79466624292112
+22
+0.788612759966309
+32
+-1.38777878078145e-16
+13
+1.79466624292112
+23
+0.788612759966309
+33
+-1.38777878078145e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+0.788612759966309
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.20533375707888
+22
+2.21138724003369
+32
+-5.68989300120393e-16
+13
+1.20533375707888
+23
+2.21138724003369
+33
+-5.68989300120393e-16
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.20533375707888
+21
+2.21138724003369
+31
+-5.68989300120393e-16
+12
+1.20533375707888
+22
+2.21138724003369
+32
+1.5
+13
+1.20533375707888
+23
+2.21138724003369
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.57547319805376
+20
+0.733707760462408
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+0.73
+32
+1.5
+13
+1.5
+23
+0.73
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.57547319805376
+21
+0.733707760462408
+31
+1.5
+12
+1.79466624292112
+22
+0.788612759966309
+32
+1.5
+13
+1.79466624292112
+23
+0.788612759966309
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+0.788612759966309
+30
+1.5
+11
+1.57547319805376
+21
+0.733707760462408
+31
+1.5
+12
+1.65021954795242
+22
+0.744795334089513
+32
+1.5
+13
+1.65021954795242
+23
+0.744795334089513
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+0.788612759966309
+30
+1.5
+11
+1.65021954795242
+21
+0.744795334089513
+31
+1.5
+12
+1.72351920148594
+22
+0.763155941486199
+32
+1.5
+13
+1.72351920148594
+23
+0.763155941486199
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+1.79466624292112
+21
+2.21138724003369
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.79466624292112
+20
+2.21138724003369
+30
+1.5
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+1.86297548735602
+22
+2.17907937354823
+32
+1.5
+13
+1.86297548735602
+23
+2.17907937354823
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.86297548735602
+20
+2.17907937354823
+30
+1.5
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+1.92778907942509
+22
+2.14023160147296
+32
+1.5
+13
+1.92778907942509
+23
+2.14023160147296
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.92778907942509
+20
+2.14023160147296
+30
+1.5
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+1.98848282880601
+22
+2.09521804908931
+32
+1.5
+13
+1.98848282880601
+23
+2.09521804908931
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.5
+21
+0.73
+31
+1.5
+12
+1.5
+22
+0.73
+32
+6.93889390390723e-16
+13
+1.5
+23
+0.73
+33
+6.93889390390723e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+0.73
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.5
+22
+2.27
+32
+6.93889390390723e-16
+13
+1.5
+23
+2.27
+33
+6.93889390390723e-16
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.5
+21
+2.27
+31
+6.93889390390723e-16
+12
+1.5
+22
+2.27
+32
+1.5
+13
+1.5
+23
+2.27
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.820920626451766
+20
+1.13702451264398
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.788612759966309
+22
+1.20533375707888
+32
+1.5
+13
+0.788612759966309
+23
+1.20533375707888
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.820920626451766
+21
+1.13702451264398
+31
+1.5
+12
+0.859768398527041
+22
+1.07221092057491
+32
+1.5
+13
+0.859768398527041
+23
+1.07221092057491
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.859768398527041
+21
+1.07221092057491
+31
+1.5
+12
+0.904781950910694
+22
+1.01151717119399
+32
+1.5
+13
+0.904781950910694
+23
+1.01151717119399
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.904781950910694
+21
+1.01151717119399
+31
+1.5
+12
+0.955527778486359
+22
+0.955527778486358
+32
+1.5
+13
+0.955527778486359
+23
+0.955527778486358
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.57547319805376
+21
+2.26629223953759
+31
+1.5
+12
+1.5
+22
+2.27
+32
+1.5
+13
+1.5
+23
+2.27
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.57547319805376
+20
+2.26629223953759
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.79466624292112
+22
+2.21138724003369
+32
+1.5
+13
+1.79466624292112
+23
+2.21138724003369
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.57547319805376
+20
+2.26629223953759
+30
+1.5
+11
+1.79466624292112
+21
+2.21138724003369
+31
+1.5
+12
+1.65021954795242
+22
+2.25520466591049
+32
+1.5
+13
+1.65021954795242
+23
+2.25520466591049
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.65021954795242
+20
+2.25520466591049
+30
+1.5
+11
+1.79466624292112
+21
+2.21138724003369
+31
+1.5
+12
+1.72351920148594
+22
+2.2368440585138
+32
+1.5
+13
+1.72351920148594
+23
+2.2368440585138
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+1.20533375707888
+21
+0.788612759966309
+31
+1.5
+12
+1.20533375707888
+22
+0.788612759966309
+32
+2.63677968348475e-16
+13
+1.20533375707888
+23
+0.788612759966309
+33
+2.63677968348475e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.20533375707888
+20
+0.788612759966309
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.79466624292112
+22
+2.21138724003369
+32
+-1.4432899320127e-15
+13
+1.79466624292112
+23
+2.21138724003369
+33
+-1.4432899320127e-15
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.79466624292112
+21
+2.21138724003369
+31
+-1.4432899320127e-15
+12
+1.79466624292112
+22
+2.21138724003369
+32
+1.5
+13
+1.79466624292112
+23
+2.21138724003369
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+1.5
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+2.27
+21
+1.5
+31
+1.5
+12
+2.2368440585138
+22
+1.72351920148594
+32
+1.5
+13
+2.2368440585138
+23
+1.72351920148594
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.2368440585138
+20
+1.72351920148594
+30
+1.5
+11
+2.27
+21
+1.5
+31
+1.5
+12
+2.25520466591049
+22
+1.65021954795242
+32
+1.5
+13
+2.25520466591049
+23
+1.65021954795242
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.25520466591049
+20
+1.65021954795242
+30
+1.5
+11
+2.27
+21
+1.5
+31
+1.5
+12
+2.26629223953759
+22
+1.57547319805376
+32
+1.5
+13
+2.26629223953759
+23
+1.57547319805376
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.01151717119399
+20
+0.904781950910693
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.955527778486359
+22
+0.955527778486358
+32
+1.5
+13
+0.955527778486359
+23
+0.955527778486358
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.01151717119399
+21
+0.904781950910693
+31
+1.5
+12
+1.07221092057491
+22
+0.85976839852704
+32
+1.5
+13
+1.07221092057491
+23
+0.85976839852704
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.07221092057491
+21
+0.85976839852704
+31
+1.5
+12
+1.13702451264398
+22
+0.820920626451767
+32
+1.5
+13
+1.13702451264398
+23
+0.820920626451767
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.13702451264398
+21
+0.820920626451767
+31
+1.5
+12
+1.20533375707888
+22
+0.788612759966309
+32
+1.5
+13
+1.20533375707888
+23
+0.788612759966309
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+2.04447222151364
+22
+2.04447222151364
+32
+-1.11022302462516e-16
+13
+2.04447222151364
+23
+2.04447222151364
+33
+-1.11022302462516e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+0.955527778486359
+22
+0.955527778486358
+32
+1.20736753927986e-15
+13
+0.955527778486359
+23
+0.955527778486358
+33
+1.20736753927986e-15
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486359
+20
+0.955527778486358
+30
+1.20736753927986e-15
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+0.955527778486359
+22
+0.955527778486358
+32
+1.5
+13
+0.955527778486359
+23
+0.955527778486358
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.955527778486359
+20
+0.955527778486358
+30
+1.5
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.73370776046241
+21
+1.57547319805376
+31
+1.5
+12
+0.729999999999999
+22
+1.5
+32
+1.5
+13
+0.729999999999999
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.73370776046241
+20
+1.57547319805376
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.744795334089513
+22
+1.65021954795242
+32
+1.5
+13
+0.744795334089513
+23
+1.65021954795242
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.744795334089513
+20
+1.65021954795242
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.763155941486199
+22
+1.72351920148594
+32
+1.5
+13
+0.763155941486199
+23
+1.72351920148594
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+0.763155941486199
+20
+1.72351920148594
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.78861275996631
+22
+1.79466624292112
+32
+1.5
+13
+0.78861275996631
+23
+1.79466624292112
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+2.04447222151364
+21
+2.04447222151364
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.04447222151364
+20
+2.04447222151364
+30
+1.5
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+2.09521804908931
+22
+1.98848282880601
+32
+1.5
+13
+2.09521804908931
+23
+1.98848282880601
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.09521804908931
+20
+1.98848282880601
+30
+1.5
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+2.14023160147296
+22
+1.92778907942509
+32
+1.5
+13
+2.14023160147296
+23
+1.92778907942509
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+star_d
+10
+2.14023160147296
+20
+1.92778907942509
+30
+1.5
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+2.17907937354823
+22
+1.86297548735602
+32
+1.5
+13
+2.17907937354823
+23
+1.86297548735602
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.79466624292112
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+2.21138724003369
+22
+1.79466624292112
+32
+-6.66133814775094e-16
+13
+2.21138724003369
+23
+1.79466624292112
+33
+-6.66133814775094e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+0.788612759966309
+22
+1.20533375707888
+32
+1.5
+13
+0.788612759966309
+23
+1.20533375707888
+33
+1.5
+70
+15
+ 0
+3DFACE
+ 8
+star_d
+10
+0.788612759966309
+20
+1.20533375707888
+30
+1.5
+11
+2.21138724003369
+21
+1.79466624292112
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.788612759966309
+20
+1.20533375707888
+30
+1.5
+11
+0.78861275996631
+21
+1.20533375707888
+31
+2.77555756156289e-17
+12
+1.5
+22
+1.5
+32
+1.19348975147204e-15
+13
+1.5
+23
+1.5
+33
+1.19348975147204e-15
+70
+12
+ 0
+3DFACE
+ 8
+star_d
+10
+0.73370776046241
+20
+1.42452680194624
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.729999999999999
+22
+1.5
+32
+1.5
+13
+0.729999999999999
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.73370776046241
+21
+1.42452680194624
+31
+1.5
+12
+0.744795334089513
+22
+1.34978045204758
+32
+1.5
+13
+0.744795334089513
+23
+1.34978045204758
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.744795334089513
+21
+1.34978045204758
+31
+1.5
+12
+0.763155941486199
+22
+1.27648079851406
+32
+1.5
+13
+0.763155941486199
+23
+1.27648079851406
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.763155941486199
+21
+1.27648079851406
+31
+1.5
+12
+0.788612759966309
+22
+1.20533375707888
+32
+1.5
+13
+0.788612759966309
+23
+1.20533375707888
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.21138724003369
+20
+1.20533375707888
+30
+1.5
+11
+2.27
+21
+1.5
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+1.5
+11
+2.21138724003369
+21
+1.20533375707888
+31
+1.5
+12
+2.2368440585138
+22
+1.27648079851406
+32
+1.5
+13
+2.2368440585138
+23
+1.27648079851406
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+1.5
+11
+2.2368440585138
+21
+1.27648079851406
+31
+1.5
+12
+2.25520466591049
+22
+1.34978045204758
+32
+1.5
+13
+2.25520466591049
+23
+1.34978045204758
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+1.5
+11
+2.25520466591049
+21
+1.34978045204758
+31
+1.5
+12
+2.26629223953759
+22
+1.42452680194624
+32
+1.5
+13
+2.26629223953759
+23
+1.42452680194624
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+0.729999999999999
+20
+1.5
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+0.73
+22
+1.5
+32
+7.07767178198537e-16
+13
+0.73
+23
+1.5
+33
+7.07767178198537e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+0.729999999999999
+21
+1.5
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+star_d
+10
+1.5
+20
+1.5
+30
+1.19348975147204e-15
+11
+2.27
+21
+1.5
+31
+1.5
+12
+2.27
+22
+1.5
+32
+-2.35922392732846e-16
+13
+2.27
+23
+1.5
+33
+-2.35922392732846e-16
+70
+1
+ 0
+3DFACE
+ 8
+star_d
+10
+2.27
+20
+1.5
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.19348975147204e-15
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.0
+30
+1.5
+11
+2.795
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+0.0
+30
+0.205
+11
+3.0
+21
+0.0
+31
+1.5
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.205
+21
+3.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+0.205
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+0.0
+12
+1.5
+22
+0.0
+32
+0.0
+13
+1.5
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+0.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.497732043121053
+22
+0.0
+32
+0.0
+13
+0.497732043121053
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.497732043121053
+20
+0.0
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.0
+13
+0.205
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+2.50226795687895
+21
+3.0
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+3.0
+22
+3.0
+32
+3.0
+13
+3.0
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+2.795
+31
+1.5
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.795
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.205
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+0.0
+30
+3.0
+11
+1.5
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.795
+21
+0.0
+31
+3.0
+12
+1.5
+22
+0.0
+32
+3.0
+13
+1.5
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+3.0
+12
+2.50226795687895
+22
+0.0
+32
+3.0
+13
+2.50226795687895
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+3.0
+13
+2.12132034355964
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+3.0
+12
+1.79836855106949
+22
+5.55111512312578e-17
+32
+3.0
+13
+1.79836855106949
+23
+5.55111512312578e-17
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.0
+21
+0.0
+31
+1.5
+12
+0.205
+22
+0.0
+32
+1.5
+13
+0.205
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.0
+30
+1.5
+11
+0.205
+21
+0.0
+31
+2.795
+12
+0.0
+22
+0.0
+32
+2.795
+13
+0.0
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+2.795
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+0.0
+11
+0.205
+21
+0.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+0.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+0.0
+12
+0.497732043121053
+22
+0.0
+32
+0.0
+13
+0.497732043121053
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.497732043121053
+20
+0.0
+30
+0.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+0.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+0.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.497732043121053
+20
+0.0
+30
+0.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+0.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+0.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.1475
+20
+0.0
+30
+2.1475
+11
+2.545
+21
+0.25
+31
+1.5
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.545
+20
+0.25
+30
+1.5
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+2.0225
+22
+0.25
+32
+2.0225
+13
+2.0225
+23
+0.25
+33
+2.0225
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.1475
+20
+0.0
+30
+0.8525
+11
+1.5
+21
+0.25
+31
+0.455
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.25
+30
+0.455
+11
+2.1475
+21
+0.0
+31
+0.8525
+12
+2.0225
+22
+0.25
+32
+0.9775
+13
+2.0225
+23
+0.25
+33
+0.9775
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.9775
+20
+0.25
+30
+2.0225
+11
+1.5
+21
+0.0
+31
+2.795
+12
+0.8525
+22
+0.0
+32
+2.1475
+13
+0.8525
+23
+0.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+2.795
+11
+0.9775
+21
+0.25
+31
+2.0225
+12
+1.5
+22
+0.25
+32
+2.545
+13
+1.5
+23
+0.25
+33
+2.545
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.9775
+20
+0.25
+30
+0.9775
+11
+0.205
+21
+0.0
+31
+1.5
+12
+0.8525
+22
+0.0
+32
+0.8525
+13
+0.8525
+23
+0.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+1.5
+11
+0.9775
+21
+0.25
+31
+0.9775
+12
+0.454999999999999
+22
+0.25
+32
+1.5
+13
+0.454999999999999
+23
+0.25
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.8525
+21
+0.0
+31
+2.1475
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.205
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+0.0
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+1.5
+11
+0.205
+21
+0.0
+31
+0.205
+12
+0.8525
+22
+0.0
+32
+0.8525
+13
+0.8525
+23
+0.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+1.5
+12
+0.0
+22
+0.0
+32
+0.205
+13
+0.0
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.0
+30
+1.5
+11
+0.205
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+1.5
+13
+0.205
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+0.0
+30
+0.205
+11
+2.50226795687895
+21
+0.0
+31
+0.0
+12
+2.795
+22
+0.0
+32
+0.0
+13
+2.795
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+2.12132034355964
+22
+0.0
+32
+0.0
+13
+2.12132034355964
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.12132034355964
+20
+0.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+1.79836855106949
+22
+5.55111512312578e-17
+32
+0.0
+13
+1.79836855106949
+23
+5.55111512312578e-17
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.0
+13
+1.5
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+0.0
+30
+1.5
+11
+2.1475
+21
+0.0
+31
+0.8525
+12
+2.795
+22
+0.0
+32
+0.205
+13
+2.795
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.0
+30
+2.795
+11
+2.795
+21
+0.0
+31
+1.5
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+0.0
+30
+1.5
+11
+3.0
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+3.0
+11
+0.205
+21
+0.0
+31
+2.795
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+2.795
+11
+1.5
+21
+0.0
+31
+3.0
+12
+0.205
+22
+0.0
+32
+3.0
+13
+0.205
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+3.0
+11
+1.5
+21
+0.0
+31
+3.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+3.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+3.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+3.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.0
+30
+3.0
+11
+0.205
+21
+0.0
+31
+2.795
+12
+0.205
+22
+0.0
+32
+3.0
+13
+0.205
+23
+0.0
+33
+3.0
+70
+0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+0.74
+20
+1.5
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.64826864473226
+21
+2.24539681310645
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+2.03740115370178
+20
+0.962598846298224
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.26
+21
+1.5
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.5
+21
+2.26
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+0.74
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+0.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+0.0
+12
+1.20163144893051
+22
+3.0
+32
+0.0
+13
+1.20163144893051
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.35173135526774
+20
+2.24539681310645
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+0.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.42550697334953
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.5
+21
+2.26
+31
+0.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+2.26
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+0.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.98213889596437
+20
+0.91251205544432
+30
+0.0
+11
+2.50226795687895
+21
+0.0
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+1.98213889596437
+21
+0.91251205544432
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.0
+12
+2.795
+22
+0.0
+32
+0.0
+13
+2.795
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.85826151998776
+20
+0.82973983909525
+30
+0.0
+11
+2.12132034355964
+21
+0.0
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.12132034355964
+20
+0.0
+30
+0.0
+11
+1.85826151998776
+21
+0.82973983909525
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.12132034355964
+20
+0.0
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+12
+2.50226795687895
+22
+0.0
+32
+0.0
+13
+2.50226795687895
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.35173135526774
+20
+0.754603186893545
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+0.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+0.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+0.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+0.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+0.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20916059140253
+20
+0.797851555291422
+30
+0.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+0.0
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+0.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+0.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+0.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.868083094650066
+20
+1.0777666229051
+30
+0.0
+11
+0.0
+21
+0.205
+31
+0.0
+12
+0.0
+22
+0.497732043121051
+32
+0.0
+13
+0.0
+23
+0.497732043121051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+0.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.0
+30
+0.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+0.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+0.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.0
+30
+0.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+0.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.0777666229051
+20
+0.868083094650066
+30
+0.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+0.0
+12
+0.497732043121053
+22
+0.0
+32
+0.0
+13
+0.497732043121053
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+0.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+0.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+0.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+0.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+0.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+0.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.74
+20
+1.5
+30
+0.0
+11
+0.0
+21
+1.20163144893051
+31
+0.0
+12
+0.0
+22
+1.5
+32
+0.0
+13
+0.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.20163144893051
+30
+0.0
+11
+0.74
+21
+1.5
+31
+0.0
+12
+0.743659607729131
+22
+1.42550697334953
+32
+0.0
+13
+0.743659607729131
+23
+1.42550697334953
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.20163144893051
+30
+0.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.754603186893545
+20
+1.64826864473226
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+1.79836855106949
+32
+0.0
+13
+0.0
+23
+1.79836855106949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+0.0
+12
+0.743659607729131
+22
+1.57449302665047
+32
+0.0
+13
+0.743659607729131
+23
+1.57449302665047
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+0.0
+12
+0.74
+22
+1.5
+32
+0.0
+13
+0.74
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+0.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+0.0
+12
+1.79836855106949
+22
+5.55111512312578e-17
+32
+0.0
+13
+1.79836855106949
+23
+5.55111512312578e-17
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+3.0
+30
+0.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.03740115370178
+20
+2.03740115370178
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.13191690534993
+20
+1.9222333770949
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+0.0
+13
+3.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.72061635471339
+20
+0.772725344843521
+30
+0.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.72061635471339
+21
+0.772725344843521
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+0.0
+12
+2.12132034355964
+22
+0.0
+32
+0.0
+13
+2.12132034355964
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+0.0
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.9222333770949
+20
+2.13191690534993
+30
+0.0
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+2.50226795687895
+22
+3.0
+32
+0.0
+13
+2.50226795687895
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.795
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.50226795687895
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+0.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.50226795687895
+30
+0.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+3.0
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.0
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+0.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.01786110403563
+20
+2.08748794455568
+30
+0.0
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.797851555291422
+20
+1.20916059140253
+30
+0.0
+11
+0.0
+21
+0.497732043121051
+31
+0.0
+12
+0.0
+22
+0.878679656440357
+32
+0.0
+13
+0.0
+23
+0.878679656440357
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+0.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+0.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+0.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+0.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79083940859747
+20
+2.20214844470858
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.868083094650066
+20
+1.9222333770949
+30
+0.0
+11
+0.0
+21
+2.12132034355964
+31
+0.0
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+0.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+0.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.12132034355964
+30
+0.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+0.0
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.24539681310645
+20
+1.64826864473226
+30
+0.0
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+3.0
+22
+1.79836855106949
+32
+0.0
+13
+3.0
+23
+1.79836855106949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.79836855106949
+30
+0.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+0.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+0.0
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.26
+20
+1.5
+30
+0.0
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+0.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.20214844470858
+20
+1.79083940859747
+30
+0.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.754603186893545
+20
+1.35173135526774
+30
+0.0
+11
+0.0
+21
+0.878679656440357
+31
+0.0
+12
+0.0
+22
+1.20163144893051
+32
+0.0
+13
+0.0
+23
+1.20163144893051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.878679656440357
+30
+0.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+0.0
+12
+0.772725344843521
+22
+1.27938364528661
+32
+0.0
+13
+0.772725344843521
+23
+1.27938364528661
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.878679656440357
+30
+0.0
+11
+0.772725344843521
+21
+1.27938364528661
+31
+0.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+0.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.0
+30
+0.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.0
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+12
+3.0
+22
+0.497732043121051
+32
+0.0
+13
+3.0
+23
+0.497732043121051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.0
+30
+0.0
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.797851555291422
+20
+1.79083940859747
+30
+0.0
+11
+0.0
+21
+1.79836855106949
+31
+0.0
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+0.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+0.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+0.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.743659607729131
+20
+1.57449302665047
+30
+0.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+0.0
+12
+0.74
+22
+1.5
+32
+0.0
+13
+0.74
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.743659607729131
+20
+1.42550697334953
+30
+0.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+0.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.743659607729131
+20
+1.42550697334953
+30
+0.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.754603186893545
+20
+1.35173135526774
+30
+0.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+0.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+0.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.754603186893545
+20
+1.35173135526774
+30
+0.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+0.0
+12
+0.772725344843521
+22
+1.27938364528661
+32
+0.0
+13
+0.772725344843521
+23
+1.27938364528661
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.772725344843521
+20
+1.27938364528661
+30
+0.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.772725344843521
+20
+1.27938364528661
+30
+0.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+0.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+0.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.797851555291422
+20
+1.20916059140253
+30
+0.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+0.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+0.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.797851555291422
+20
+1.20916059140253
+30
+0.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+0.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+0.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.82973983909525
+20
+1.14173848001224
+30
+0.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.82973983909525
+20
+1.14173848001224
+30
+0.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+0.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+0.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.868083094650066
+20
+1.0777666229051
+30
+0.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+0.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+0.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.868083094650066
+20
+1.0777666229051
+30
+0.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+0.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+0.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.91251205544432
+20
+1.01786110403563
+30
+0.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+0.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+0.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.91251205544432
+20
+1.01786110403563
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+0.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+0.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+0.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+0.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.01786110403563
+20
+0.91251205544432
+30
+0.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.01786110403563
+20
+0.91251205544432
+30
+0.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+0.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+0.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.0777666229051
+20
+0.868083094650066
+30
+0.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+0.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+0.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.0777666229051
+20
+0.868083094650066
+30
+0.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+0.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+0.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.14173848001224
+20
+0.82973983909525
+30
+0.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.14173848001224
+20
+0.82973983909525
+30
+0.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+0.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+0.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20916059140253
+20
+0.797851555291422
+30
+0.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+0.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+0.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20916059140253
+20
+0.797851555291422
+30
+0.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+0.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+0.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.27938364528661
+20
+0.772725344843521
+30
+0.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.27938364528661
+20
+0.772725344843521
+30
+0.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.35173135526774
+20
+0.754603186893545
+30
+0.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+0.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+0.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.35173135526774
+20
+0.754603186893545
+30
+0.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+0.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+0.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.42550697334953
+20
+0.743659607729131
+30
+0.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.42550697334953
+20
+0.743659607729131
+30
+0.0
+11
+1.5
+21
+2.26
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.74
+30
+0.0
+11
+1.5
+21
+2.26
+31
+0.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+0.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.74
+30
+0.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+0.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+0.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+0.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+0.0
+11
+1.64826864473226
+21
+2.24539681310645
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.64826864473226
+20
+0.754603186893545
+30
+0.0
+11
+1.64826864473226
+21
+2.24539681310645
+31
+0.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+0.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.64826864473226
+20
+0.754603186893545
+30
+0.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+0.0
+12
+1.72061635471339
+22
+0.772725344843521
+32
+0.0
+13
+1.72061635471339
+23
+0.772725344843521
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.72061635471339
+20
+0.772725344843521
+30
+0.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.72061635471339
+20
+0.772725344843521
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79083940859747
+20
+0.797851555291422
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+0.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79083940859747
+20
+0.797851555291422
+30
+0.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+0.0
+12
+1.85826151998776
+22
+0.82973983909525
+32
+0.0
+13
+1.85826151998776
+23
+0.82973983909525
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.85826151998776
+20
+0.82973983909525
+30
+0.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.85826151998776
+20
+0.82973983909525
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.9222333770949
+20
+0.868083094650066
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+0.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.9222333770949
+20
+0.868083094650066
+30
+0.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+0.0
+12
+1.98213889596437
+22
+0.91251205544432
+32
+0.0
+13
+1.98213889596437
+23
+0.91251205544432
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.98213889596437
+20
+0.91251205544432
+30
+0.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.98213889596437
+20
+0.91251205544432
+30
+0.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.03740115370178
+20
+0.962598846298224
+30
+0.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+0.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+0.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.03740115370178
+20
+0.962598846298224
+30
+0.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+0.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+0.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+0.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.13191690534993
+20
+1.0777666229051
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+0.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.13191690534993
+20
+1.0777666229051
+30
+0.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+0.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+0.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+0.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+0.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+0.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+0.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+0.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+0.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+0.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.24539681310646
+20
+1.35173135526774
+30
+0.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+0.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+0.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.24539681310646
+20
+1.35173135526774
+30
+0.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+0.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+0.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.25634039227087
+20
+1.42550697334953
+30
+0.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+0.0
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+0.0
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.497732043121051
+30
+0.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.497732043121051
+30
+0.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+0.0
+12
+3.0
+22
+0.878679656440357
+32
+0.0
+13
+3.0
+23
+0.878679656440357
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+0.0
+11
+3.0
+21
+0.878679656440357
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.878679656440357
+30
+0.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.878679656440357
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+12
+3.0
+22
+1.20163144893051
+32
+0.0
+13
+3.0
+23
+1.20163144893051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.25634039227087
+20
+1.42550697334953
+30
+0.0
+11
+3.0
+21
+1.20163144893051
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.20163144893051
+30
+0.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+0.0
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.20163144893051
+30
+0.0
+11
+2.26
+21
+1.5
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.878679656440356
+20
+3.0
+30
+0.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+0.0
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.0777666229051
+20
+2.13191690534993
+30
+0.0
+11
+0.878679656440356
+21
+3.0
+31
+0.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+0.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.14173848001224
+20
+2.17026016090475
+30
+0.0
+11
+0.878679656440356
+21
+3.0
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20163144893051
+20
+3.0
+30
+0.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+0.0
+12
+0.878679656440356
+22
+3.0
+32
+0.0
+13
+0.878679656440356
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20916059140253
+20
+2.20214844470858
+30
+0.0
+11
+1.20163144893051
+21
+3.0
+31
+0.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+0.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.27938364528661
+20
+2.22727465515648
+30
+0.0
+11
+1.20163144893051
+21
+3.0
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+0.74
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.64826864473226
+21
+2.24539681310645
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.26
+21
+1.5
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+0.74
+20
+1.5
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+2.03740115370178
+20
+0.962598846298224
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.5
+21
+2.26
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+3.0
+ 0
+LINE
+ 8
+lid_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+3.0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+12
+3.0
+22
+2.50226795687895
+32
+3.0
+13
+3.0
+23
+2.50226795687895
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+3.0
+12
+3.0
+22
+2.795
+32
+3.0
+13
+3.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+3.0
+11
+3.0
+21
+1.79836855106949
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+3.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+2.26
+21
+1.5
+31
+3.0
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.25634039227087
+20
+1.42550697334953
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+3.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.26
+20
+1.5
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+3.0
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+3.0
+12
+1.79836855106949
+22
+3.0
+32
+3.0
+13
+1.79836855106949
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+3.0
+11
+1.79836855106949
+21
+3.0
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.868083094650066
+20
+1.9222333770949
+30
+3.0
+11
+0.0
+21
+2.795
+31
+3.0
+12
+0.0
+22
+2.50226795687895
+32
+3.0
+13
+0.0
+23
+2.50226795687895
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.795
+30
+3.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+3.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+3.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.35173135526774
+20
+2.24539681310645
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+3.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+3.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.13191690534993
+20
+1.0777666229051
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.497732043121051
+32
+3.0
+13
+3.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.205
+32
+3.0
+13
+3.0
+23
+0.205
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+3.0
+11
+3.0
+21
+0.497732043121051
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+3.0
+21
+0.497732043121051
+31
+3.0
+12
+3.0
+22
+0.878679656440357
+32
+3.0
+13
+3.0
+23
+0.878679656440357
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+3.0
+11
+3.0
+21
+2.12132034355964
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+12
+3.0
+22
+1.79836855106949
+32
+3.0
+13
+3.0
+23
+1.79836855106949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+3.0
+11
+1.5
+21
+0.74
+31
+3.0
+12
+1.5
+22
+0.0
+32
+3.0
+13
+1.5
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.74
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+3.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+3.0
+11
+1.72061635471339
+21
+0.772725344843521
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.72061635471339
+20
+0.772725344843521
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79083940859747
+20
+0.797851555291422
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+3.0
+13
+2.12132034355964
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.497732043121052
+20
+3.0
+30
+3.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+3.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+3.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.497732043121052
+20
+3.0
+30
+3.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.868083094650066
+20
+1.0777666229051
+30
+3.0
+11
+0.0
+21
+0.878679656440357
+31
+3.0
+12
+0.0
+22
+0.497732043121051
+32
+3.0
+13
+0.0
+23
+0.497732043121051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.878679656440357
+30
+3.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+3.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+3.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.878679656440357
+30
+3.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+3.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+3.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.12132034355964
+20
+0.0
+30
+3.0
+11
+1.85826151998776
+21
+0.82973983909525
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.85826151998776
+20
+0.82973983909525
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.9222333770949
+20
+0.868083094650066
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+3.0
+12
+2.50226795687895
+22
+0.0
+32
+3.0
+13
+2.50226795687895
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.797851555291422
+20
+1.20916059140253
+30
+3.0
+11
+0.0
+21
+1.20163144893051
+31
+3.0
+12
+0.0
+22
+0.878679656440357
+32
+3.0
+13
+0.0
+23
+0.878679656440357
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.20163144893051
+30
+3.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+3.0
+12
+0.772725344843521
+22
+1.27938364528661
+32
+3.0
+13
+0.772725344843521
+23
+1.27938364528661
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.20163144893051
+30
+3.0
+11
+0.772725344843521
+21
+1.27938364528661
+31
+3.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+3.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.0777666229051
+20
+2.13191690534993
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+3.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+3.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20916059140253
+20
+2.20214844470858
+30
+3.0
+11
+1.20163144893051
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20163144893051
+20
+3.0
+30
+3.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+3.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+3.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20163144893051
+20
+3.0
+30
+3.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.0
+30
+3.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+3.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+3.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.35173135526774
+20
+0.754603186893545
+30
+3.0
+11
+1.5
+21
+0.0
+31
+3.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+3.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.42550697334953
+20
+0.743659607729131
+30
+3.0
+11
+1.5
+21
+0.0
+31
+3.0
+12
+1.5
+22
+0.74
+32
+3.0
+13
+1.5
+23
+0.74
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+0.205
+21
+0.0
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+0.497732043121053
+21
+0.0
+31
+3.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+3.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.01786110403563
+20
+0.91251205544432
+30
+3.0
+11
+0.497732043121053
+21
+0.0
+31
+3.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+3.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+3.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.0777666229051
+20
+0.868083094650066
+30
+3.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+3.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+3.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.14173848001224
+20
+0.82973983909525
+30
+3.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+3.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+3.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+3.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+3.0
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+3.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20916059140253
+20
+0.797851555291422
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+3.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.27938364528661
+20
+0.772725344843521
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+12
+2.50226795687895
+22
+3.0
+32
+3.0
+13
+2.50226795687895
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.878679656440357
+30
+3.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+3.0
+11
+3.0
+21
+0.878679656440357
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.24539681310646
+20
+1.35173135526774
+30
+3.0
+11
+3.0
+21
+0.878679656440357
+31
+3.0
+12
+3.0
+22
+1.20163144893051
+32
+3.0
+13
+3.0
+23
+1.20163144893051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+0.0
+30
+3.0
+11
+1.98213889596437
+21
+0.91251205544432
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.98213889596437
+20
+0.91251205544432
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.03740115370178
+20
+0.962598846298224
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.795
+22
+0.0
+32
+3.0
+13
+2.795
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.74
+20
+1.5
+30
+3.0
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.74
+21
+1.5
+31
+3.0
+12
+0.743659607729131
+22
+1.57449302665047
+32
+3.0
+13
+0.743659607729131
+23
+1.57449302665047
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+3.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+3.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.754603186893545
+20
+1.64826864473226
+30
+3.0
+11
+0.0
+21
+2.12132034355964
+31
+3.0
+12
+0.0
+22
+1.79836855106949
+32
+3.0
+13
+0.0
+23
+1.79836855106949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.12132034355964
+30
+3.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+3.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+3.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.12132034355964
+30
+3.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+0.0
+21
+0.205
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.0
+22
+0.497732043121051
+32
+3.0
+13
+0.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+3.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+3.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+3.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.754603186893545
+20
+1.35173135526774
+30
+3.0
+11
+0.0
+21
+1.5
+31
+3.0
+12
+0.0
+22
+1.20163144893051
+32
+3.0
+13
+0.0
+23
+1.20163144893051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+3.0
+12
+0.743659607729131
+22
+1.42550697334953
+32
+3.0
+13
+0.743659607729131
+23
+1.42550697334953
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+3.0
+12
+0.74
+22
+1.5
+32
+3.0
+13
+0.74
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.743659607729131
+20
+1.42550697334953
+30
+3.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+3.0
+12
+0.74
+22
+1.5
+32
+3.0
+13
+0.74
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.743659607729131
+20
+1.57449302665047
+30
+3.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+3.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+3.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.743659607729131
+20
+1.57449302665047
+30
+3.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+3.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+3.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.754603186893545
+20
+1.64826864473226
+30
+3.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+3.0
+12
+0.772725344843521
+22
+1.27938364528661
+32
+3.0
+13
+0.772725344843521
+23
+1.27938364528661
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.754603186893545
+20
+1.64826864473226
+30
+3.0
+11
+0.772725344843521
+21
+1.27938364528661
+31
+3.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+3.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.772725344843521
+20
+1.72061635471339
+30
+3.0
+11
+0.772725344843521
+21
+1.27938364528661
+31
+3.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+3.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.772725344843521
+20
+1.72061635471339
+30
+3.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.797851555291422
+20
+1.79083940859747
+30
+3.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+3.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+3.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.797851555291422
+20
+1.79083940859747
+30
+3.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+3.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+3.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.82973983909525
+20
+1.85826151998776
+30
+3.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+3.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+3.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.82973983909525
+20
+1.85826151998776
+30
+3.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.868083094650066
+20
+1.9222333770949
+30
+3.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+3.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+3.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.868083094650066
+20
+1.9222333770949
+30
+3.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+3.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+3.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.91251205544432
+20
+1.98213889596437
+30
+3.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+3.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+3.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.91251205544432
+20
+1.98213889596437
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+3.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+3.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+3.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+3.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.01786110403563
+20
+2.08748794455568
+30
+3.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.0777666229051
+20
+2.13191690534993
+30
+3.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+3.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+3.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.0777666229051
+20
+2.13191690534993
+30
+3.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+3.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+3.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.0777666229051
+20
+2.13191690534993
+30
+3.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+3.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+3.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.14173848001224
+20
+2.17026016090475
+30
+3.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20916059140253
+20
+2.20214844470858
+30
+3.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+3.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+3.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20916059140253
+20
+2.20214844470858
+30
+3.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+3.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+3.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20916059140253
+20
+2.20214844470858
+30
+3.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+3.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+3.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.27938364528661
+20
+2.22727465515648
+30
+3.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.27938364528661
+20
+2.22727465515648
+30
+3.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.35173135526774
+20
+2.24539681310645
+30
+3.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+3.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+3.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.35173135526774
+20
+2.24539681310645
+30
+3.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+3.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+3.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.42550697334953
+20
+2.25634039227087
+30
+3.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+3.0
+12
+1.5
+22
+0.74
+32
+3.0
+13
+1.5
+23
+0.74
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.42550697334953
+20
+2.25634039227087
+30
+3.0
+11
+1.5
+21
+0.74
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+2.26
+30
+3.0
+11
+1.5
+21
+0.74
+31
+3.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+3.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+2.26
+30
+3.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+3.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+3.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+3.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+3.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.64826864473226
+20
+2.24539681310645
+30
+3.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+3.0
+12
+1.72061635471339
+22
+0.772725344843521
+32
+3.0
+13
+1.72061635471339
+23
+0.772725344843521
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.64826864473226
+20
+2.24539681310645
+30
+3.0
+11
+1.72061635471339
+21
+0.772725344843521
+31
+3.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+3.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+3.0
+11
+1.72061635471339
+21
+0.772725344843521
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79083940859747
+20
+2.20214844470858
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+3.0
+12
+1.85826151998776
+22
+0.82973983909525
+32
+3.0
+13
+1.85826151998776
+23
+0.82973983909525
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79083940859747
+20
+2.20214844470858
+30
+3.0
+11
+1.85826151998776
+21
+0.82973983909525
+31
+3.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+3.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+3.0
+11
+1.85826151998776
+21
+0.82973983909525
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.9222333770949
+20
+2.13191690534993
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+3.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.98213889596437
+22
+0.91251205544432
+32
+3.0
+13
+1.98213889596437
+23
+0.91251205544432
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+1.98213889596437
+21
+0.91251205544432
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+3.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+3.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+3.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+3.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+3.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.13191690534993
+20
+1.9222333770949
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+3.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.13191690534993
+20
+1.9222333770949
+30
+3.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+3.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+3.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+3.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+3.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.20214844470858
+20
+1.79083940859747
+30
+3.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+3.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+3.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.20214844470858
+20
+1.79083940859747
+30
+3.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+3.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+3.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+3.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.24539681310645
+20
+1.64826864473226
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+3.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+3.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+3.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+3.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.797851555291422
+20
+1.79083940859747
+30
+3.0
+11
+0.0
+21
+2.50226795687895
+31
+3.0
+12
+0.0
+22
+2.12132034355964
+32
+3.0
+13
+0.0
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.50226795687895
+30
+3.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+3.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+3.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.50226795687895
+30
+3.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+3.0
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+2.795
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+3.0
+21
+3.0
+31
+1.5
+12
+2.795
+22
+3.0
+32
+1.5
+13
+2.795
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+2.795
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+2.795
+12
+2.795
+22
+3.0
+32
+2.795
+13
+2.795
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+0.205
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.50226795687895
+22
+3.0
+32
+0.0
+13
+2.50226795687895
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+0.205
+22
+3.0
+32
+0.0
+13
+0.205
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.497732043121052
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.878679656440356
+22
+3.0
+32
+0.0
+13
+0.878679656440356
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.878679656440356
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+1.20163144893051
+22
+3.0
+32
+0.0
+13
+1.20163144893051
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.20163144893051
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+2.795
+13
+0.0
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+0.205
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.497732043121052
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.497732043121052
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+3.0
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+2.795
+21
+3.0
+31
+2.795
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+1.5
+21
+3.0
+31
+3.0
+12
+2.50226795687895
+22
+3.0
+32
+3.0
+13
+2.50226795687895
+23
+3.0
+33
+3.0
+70
+15
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.50226795687895
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.79836855106949
+22
+3.0
+32
+3.0
+13
+1.79836855106949
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+1.79836855106949
+21
+3.0
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+2.795
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+3.0
+30
+2.795
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+3.0
+30
+1.5
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.8525
+20
+3.0
+30
+0.8525
+11
+1.5
+21
+3.0
+31
+0.205
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.795
+21
+3.0
+31
+1.5
+12
+2.1475
+22
+3.0
+32
+2.1475
+13
+2.1475
+23
+3.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+1.5
+11
+1.5
+21
+3.0
+31
+0.205
+12
+0.8525
+22
+3.0
+32
+0.8525
+13
+0.8525
+23
+3.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.8525
+21
+3.0
+31
+0.8525
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+1.5
+11
+0.8525
+21
+3.0
+31
+0.8525
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+2.795
+11
+1.5
+21
+3.0
+31
+1.5
+12
+0.8525
+22
+3.0
+32
+2.1475
+13
+0.8525
+23
+3.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+2.795
+13
+2.795
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+2.795
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+3.0
+30
+1.5
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+2.795
+21
+3.0
+31
+1.5
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.8525
+20
+3.0
+30
+2.1475
+11
+1.5
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.205
+21
+0.0
+31
+1.5
+12
+0.8525
+22
+0.0
+32
+2.1475
+13
+0.8525
+23
+0.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.1475
+20
+0.0
+30
+0.8525
+11
+1.5
+21
+0.0
+31
+0.205
+12
+2.795
+22
+0.0
+32
+0.205
+13
+2.795
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.0
+30
+3.0
+11
+0.0
+21
+0.0
+31
+2.795
+12
+0.205
+22
+0.0
+32
+2.795
+13
+0.205
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+0.0
+30
+0.205
+11
+2.795
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.205
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.205
+22
+0.0
+32
+0.0
+13
+0.205
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+0.0
+30
+2.795
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.8525
+20
+0.0
+30
+0.8525
+11
+0.205
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.25
+30
+0.455
+11
+0.8525
+21
+0.0
+31
+0.8525
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.8525
+20
+0.0
+30
+0.8525
+11
+1.5
+21
+0.25
+31
+0.455
+12
+0.9775
+22
+0.25
+32
+0.9775
+13
+0.9775
+23
+0.25
+33
+0.9775
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+1.5
+20
+0.25
+30
+2.545
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.1475
+20
+0.0
+30
+2.1475
+11
+1.5
+21
+0.25
+31
+2.545
+12
+2.0225
+22
+0.25
+32
+2.0225
+13
+2.0225
+23
+0.25
+33
+2.0225
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.795
+20
+0.0
+30
+1.5
+11
+2.0225
+21
+0.25
+31
+0.9775
+12
+2.1475
+22
+0.0
+32
+0.8525
+13
+2.1475
+23
+0.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+2.0225
+20
+0.25
+30
+0.9775
+11
+2.795
+21
+0.0
+31
+1.5
+12
+2.545
+22
+0.25
+32
+1.5
+13
+2.545
+23
+0.25
+33
+1.5
+70
+1
+ 0
+LINE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+0.205
+31
+1.5
+ 0
+LINE
+ 8
+lid_base
+10
+3.0
+20
+0.205
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+lid_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+lid_base
+10
+3.0
+20
+2.795
+30
+1.5
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+2.795
+31
+0.205
+ 0
+LINE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+0.205
+31
+0.205
+ 0
+LINE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+1.5
+31
+0.205
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+1.5
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.795
+32
+1.5
+13
+3.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+0.205
+31
+3.0
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.205
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.497732043121051
+32
+3.0
+13
+3.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.878679656440357
+32
+3.0
+13
+3.0
+23
+0.878679656440357
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.878679656440357
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+1.20163144893051
+32
+3.0
+13
+3.0
+23
+1.20163144893051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.205
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+1.5
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.0
+30
+1.5
+11
+3.0
+21
+0.205
+31
+0.205
+12
+3.0
+22
+0.205
+32
+1.5
+13
+3.0
+23
+0.205
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.205
+30
+1.5
+11
+3.0
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.0
+30
+2.795
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+1.5
+31
+3.0
+12
+3.0
+22
+1.5
+32
+2.795
+13
+3.0
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+1.79836855106949
+32
+3.0
+13
+3.0
+23
+1.79836855106949
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.50226795687895
+32
+3.0
+13
+3.0
+23
+2.50226795687895
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.795
+32
+3.0
+13
+3.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.497732043121051
+30
+0.0
+11
+3.0
+21
+0.205
+31
+0.205
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.205
+13
+3.0
+23
+1.5
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+3.0
+22
+0.878679656440357
+32
+0.0
+13
+3.0
+23
+0.878679656440357
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.878679656440357
+31
+0.0
+12
+3.0
+22
+1.20163144893051
+32
+0.0
+13
+3.0
+23
+1.20163144893051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+1.20163144893051
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+0.0
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.79836855106949
+30
+0.0
+11
+3.0
+21
+1.5
+31
+0.205
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+0.0
+13
+3.0
+23
+2.50226795687895
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+0.205
+32
+0.205
+13
+3.0
+23
+0.205
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.795
+31
+3.0
+12
+3.0
+22
+2.795
+32
+2.795
+13
+3.0
+23
+2.795
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.205
+30
+1.5
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+1.5
+32
+0.205
+13
+3.0
+23
+1.5
+33
+0.205
+70
+15
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+1.5
+31
+0.205
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+2.795
+13
+3.0
+23
+2.795
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+1.5
+13
+3.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+3.0
+20
+0.205
+30
+2.795
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+0
+ 0
+LINE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+0.205
+31
+1.5
+ 0
+LINE
+ 8
+lid_base
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+1.5
+31
+0.205
+ 0
+LINE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+lid_base
+10
+0.0
+20
+2.795
+30
+1.5
+11
+0.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+0.205
+31
+0.205
+ 0
+LINE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+2.795
+31
+0.205
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.0
+21
+0.205
+31
+2.795
+12
+0.0
+22
+0.205
+32
+3.0
+13
+0.0
+23
+0.205
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+0.0
+22
+0.878679656440357
+32
+3.0
+13
+0.0
+23
+0.878679656440357
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+0.878679656440357
+31
+3.0
+12
+0.0
+22
+1.20163144893051
+32
+3.0
+13
+0.0
+23
+1.20163144893051
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+1.20163144893051
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.205
+32
+3.0
+13
+0.0
+23
+0.205
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.497732043121051
+31
+0.0
+12
+0.0
+22
+0.205
+32
+0.0
+13
+0.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.0
+21
+0.205
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+0.878679656440357
+32
+0.0
+13
+0.0
+23
+0.878679656440357
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.878679656440357
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.20163144893051
+32
+0.0
+13
+0.0
+23
+1.20163144893051
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.20163144893051
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.0
+13
+0.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.205
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+2.795
+32
+3.0
+13
+0.0
+23
+2.795
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.0
+21
+2.795
+31
+1.5
+12
+0.0
+22
+2.795
+32
+2.795
+13
+0.0
+23
+2.795
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.795
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.0
+21
+1.5
+31
+2.795
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+2.795
+32
+2.795
+13
+0.0
+23
+2.795
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+2.12132034355964
+32
+3.0
+13
+0.0
+23
+2.12132034355964
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.12132034355964
+31
+3.0
+12
+0.0
+22
+2.50226795687895
+32
+3.0
+13
+0.0
+23
+2.50226795687895
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.50226795687895
+31
+3.0
+12
+0.0
+22
+2.795
+32
+3.0
+13
+0.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+1.5
+12
+0.0
+22
+0.0
+32
+2.795
+13
+0.0
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.0
+30
+1.5
+11
+0.0
+21
+0.205
+31
+2.795
+12
+0.0
+22
+0.205
+32
+1.5
+13
+0.0
+23
+0.205
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.795
+32
+1.5
+13
+0.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+1.5
+11
+0.0
+21
+0.0
+31
+0.205
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.205
+31
+1.5
+12
+0.0
+22
+0.205
+32
+0.205
+13
+0.0
+23
+0.205
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+1.79836855106949
+32
+0.0
+13
+0.0
+23
+1.79836855106949
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.50226795687895
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.795
+32
+0.0
+13
+0.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.0
+12
+0.0
+22
+2.795
+32
+0.205
+13
+0.0
+23
+2.795
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+0.205
+31
+1.5
+12
+0.0
+22
+0.205
+32
+2.795
+13
+0.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+1.5
+11
+0.0
+21
+1.5
+31
+2.795
+12
+0.0
+22
+0.205
+32
+0.205
+13
+0.0
+23
+0.205
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+1.5
+31
+2.795
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+0.205
+11
+0.0
+21
+1.5
+31
+2.795
+12
+0.0
+22
+2.795
+32
+2.795
+13
+0.0
+23
+2.795
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+1.5
+30
+0.205
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+2.795
+32
+0.205
+13
+0.0
+23
+2.795
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+2.795
+32
+1.5
+13
+0.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.205
+13
+0.0
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.454999999999999
+20
+0.25
+30
+1.5
+11
+0.8525
+21
+0.0
+31
+2.1475
+12
+0.205
+22
+0.0
+32
+1.5
+13
+0.205
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_base
+10
+0.8525
+20
+0.0
+30
+2.1475
+11
+0.454999999999999
+21
+0.25
+31
+1.5
+12
+0.9775
+22
+0.25
+32
+2.0225
+13
+0.9775
+23
+0.25
+33
+2.0225
+70
+1
+ 0
+3DFACE
+ 8
+lid_b
+10
+1.5
+20
+0.0
+30
+2.795
+11
+1.5
+21
+0.0
+31
+1.5
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_b
+10
+2.795
+20
+0.0
+30
+1.5
+11
+1.5
+21
+0.0
+31
+1.5
+12
+2.7325
+22
+0.0625
+32
+1.5
+13
+2.7325
+23
+0.0625
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_b
+10
+1.5
+20
+0.0625
+30
+2.7325
+11
+1.5
+21
+0.0
+31
+1.5
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+lid_b
+10
+1.5
+20
+0.0625
+30
+2.7325
+11
+2.7325
+21
+0.0625
+31
+1.5
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_b
+10
+2.7325
+20
+0.0625
+30
+1.5
+11
+1.5
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_b
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.7325
+21
+0.0625
+31
+1.5
+12
+1.5
+22
+0.0625
+32
+2.7325
+13
+1.5
+23
+0.0625
+33
+2.7325
+70
+1
+ 0
+3DFACE
+ 8
+lid_c
+10
+1.5
+20
+0.0
+30
+1.5
+11
+1.5
+21
+0.0
+31
+0.205
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_c
+10
+1.5
+20
+0.0625
+30
+0.2675
+11
+1.5
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_c
+10
+2.795
+20
+0.0
+30
+1.5
+11
+2.7325
+21
+0.0625000000000004
+31
+1.5
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_c
+10
+2.7325
+20
+0.0625000000000004
+30
+1.5
+11
+1.5
+21
+0.0625
+31
+0.2675
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_c
+10
+1.5
+20
+0.0625
+30
+0.2675
+11
+2.795
+21
+0.0
+31
+1.5
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_c
+10
+2.795
+20
+0.0
+30
+1.5
+11
+1.5
+21
+0.0625
+31
+0.2675
+12
+2.7325
+22
+0.0625000000000004
+32
+1.5
+13
+2.7325
+23
+0.0625000000000004
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_d
+10
+0.205
+20
+0.0
+30
+1.5
+11
+1.5
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_d
+10
+1.5
+20
+0.0
+30
+1.5
+11
+0.2675
+21
+0.0625
+31
+1.5
+12
+0.205
+22
+0.0
+32
+1.5
+13
+0.205
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_d
+10
+1.5
+20
+0.0625
+30
+0.2675
+11
+1.5
+21
+0.0
+31
+1.5
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+lid_d
+10
+1.5
+20
+0.0
+30
+1.5
+11
+1.5
+21
+0.0625
+31
+0.2675
+12
+0.2675
+22
+0.0625
+32
+1.5
+13
+0.2675
+23
+0.0625
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_d
+10
+0.205
+20
+0.0
+30
+1.5
+11
+1.5
+21
+0.0625
+31
+0.2675
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+lid_d
+10
+1.5
+20
+0.0625
+30
+0.2675
+11
+0.205
+21
+0.0
+31
+1.5
+12
+0.2675
+22
+0.0625
+32
+1.5
+13
+0.2675
+23
+0.0625
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_a
+10
+1.5
+20
+0.0
+30
+2.795
+11
+0.205
+21
+0.0
+31
+1.5
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_a
+10
+1.5
+20
+0.0625
+30
+2.7325
+11
+1.5
+21
+0.0
+31
+2.795
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_a
+10
+1.5
+20
+0.0
+30
+1.5
+11
+0.205
+21
+0.0
+31
+1.5
+12
+0.2675
+22
+0.0625
+32
+1.5
+13
+0.2675
+23
+0.0625
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+lid_a
+10
+1.5
+20
+0.0
+30
+2.795
+11
+0.2675
+21
+0.0625
+31
+1.5
+12
+0.205
+22
+0.0
+32
+1.5
+13
+0.205
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+lid_a
+10
+0.2675
+20
+0.0625
+30
+1.5
+11
+1.5
+21
+0.0
+31
+2.795
+12
+1.5
+22
+0.0625
+32
+2.7325
+13
+1.5
+23
+0.0625
+33
+2.7325
+70
+1
+ 0
+3DFACE
+ 8
+lid_a
+10
+1.5
+20
+0.0625
+30
+2.7325
+11
+1.5
+21
+0.0
+31
+1.5
+12
+0.2675
+22
+0.0625
+32
+1.5
+13
+0.2675
+23
+0.0625
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.61135857342883
+20
+3.0
+30
+1.20801452412167
+11
+1.58220277009702
+21
+1.5
+31
+1.1985054650771
+12
+1.58220277009702
+22
+3.0
+32
+1.1985054650771
+13
+1.58220277009702
+23
+3.0
+33
+1.1985054650771
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.58220277009702
+20
+1.5
+30
+1.1985054650771
+11
+1.61135857342883
+21
+3.0
+31
+1.20801452412167
+12
+1.61135857342883
+22
+1.5
+32
+1.20801452412167
+13
+1.61135857342883
+23
+1.5
+33
+1.20801452412167
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.5
+30
+-6.93889390390723e-17
+11
+1.5
+21
+1.5
+31
+1.18780925188093
+12
+1.71583333333333
+22
+1.5
+32
+0.8525
+13
+1.71583333333333
+23
+1.5
+33
+0.8525
+70
+15
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+1.18780925188093
+11
+1.295
+21
+1.5
+31
+-6.93889390390723e-17
+12
+1.295
+22
+1.5
+32
+3.0
+13
+1.295
+23
+1.5
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+1.18780925188093
+11
+1.295
+21
+1.5
+31
+3.0
+12
+1.5
+22
+1.5
+32
+1.81219074811907
+13
+1.5
+23
+1.5
+33
+1.81219074811907
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+1.81219074811907
+11
+1.295
+21
+1.5
+31
+3.0
+12
+1.50885609734932
+22
+1.5
+32
+1.81237448605758
+13
+1.50885609734932
+23
+1.5
+33
+1.81237448605758
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.50885609734932
+20
+1.5
+30
+1.81237448605758
+11
+1.295
+21
+1.5
+31
+3.0
+12
+1.71583333333333
+22
+1.5
+32
+2.1475
+13
+1.71583333333333
+23
+1.5
+33
+2.1475
+70
+15
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.295
+21
+1.5
+31
+3.0
+12
+2.1475
+22
+1.5
+32
+2.1475
+13
+2.1475
+23
+1.5
+33
+2.1475
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+1.5
+30
+2.1475
+11
+2.1475
+21
+1.5
+31
+1.71583333333333
+12
+1.71583333333333
+22
+1.5
+32
+2.1475
+13
+1.71583333333333
+23
+1.5
+33
+2.1475
+70
+12
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.70501413192602
+20
+1.5
+30
+1.73585049440402
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.71583333333333
+22
+1.5
+32
+1.72547110140021
+13
+1.71583333333333
+23
+1.5
+33
+1.72547110140021
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.70501413192602
+21
+1.5
+31
+1.73585049440402
+12
+1.68090954183794
+22
+1.5
+32
+1.7548097087475
+13
+1.68090954183794
+23
+1.5
+33
+1.7548097087475
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.68090954183794
+21
+1.5
+31
+1.7548097087475
+12
+1.65506269396675
+22
+1.5
+32
+1.77131496630259
+13
+1.65506269396675
+23
+1.5
+33
+1.77131496630259
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.65506269396675
+21
+1.5
+31
+1.77131496630259
+12
+1.62772250758676
+22
+1.5
+32
+1.78520731241634
+13
+1.62772250758676
+23
+1.5
+33
+1.78520731241634
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.62772250758676
+21
+1.5
+31
+1.78520731241634
+12
+1.59915228363849
+22
+1.5
+32
+1.79635295620134
+13
+1.59915228363849
+23
+1.5
+33
+1.79635295620134
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.59915228363849
+21
+1.5
+31
+1.79635295620134
+12
+1.56962716899663
+22
+1.5
+32
+1.80464455901512
+13
+1.56962716899663
+23
+1.5
+33
+1.80464455901512
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.56962716899663
+21
+1.5
+31
+1.80464455901512
+12
+1.53943150665524
+22
+1.5
+32
+1.81000226818992
+13
+1.53943150665524
+23
+1.5
+33
+1.81000226818992
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.53943150665524
+21
+1.5
+31
+1.81000226818992
+12
+1.50885609734932
+22
+1.5
+32
+1.81237448605758
+13
+1.50885609734932
+23
+1.5
+33
+1.81237448605758
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+0.8525
+11
+1.71461991087043
+21
+1.5
+31
+1.27285567614847
+12
+1.71583333333333
+22
+1.5
+32
+1.27412051524007
+13
+1.71583333333333
+23
+1.5
+33
+1.27412051524007
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71461991087043
+20
+1.5
+30
+1.27285567614847
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.69132242027198
+22
+1.5
+32
+1.25291300823137
+13
+1.69132242027198
+23
+1.5
+33
+1.25291300823137
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.69132242027198
+20
+1.5
+30
+1.25291300823137
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.66618239017884
+22
+1.5
+32
+1.23534992311649
+13
+1.66618239017884
+23
+1.5
+33
+1.23534992311649
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.66618239017884
+20
+1.5
+30
+1.23534992311649
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.63944193282374
+22
+1.5
+32
+1.22033556291445
+13
+1.63944193282374
+23
+1.5
+33
+1.22033556291445
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.63944193282374
+20
+1.5
+30
+1.22033556291445
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.61135857342883
+22
+1.5
+32
+1.20801452412167
+13
+1.61135857342883
+23
+1.5
+33
+1.20801452412167
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.61135857342883
+20
+1.5
+30
+1.20801452412167
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.58220277009702
+22
+1.5
+32
+1.1985054650771
+13
+1.58220277009702
+23
+1.5
+33
+1.1985054650771
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.58220277009702
+20
+1.5
+30
+1.1985054650771
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.55225530915257
+22
+1.5
+32
+1.19189996321751
+13
+1.55225530915257
+23
+1.5
+33
+1.19189996321751
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.55225530915257
+20
+1.5
+30
+1.19189996321751
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.52180460101532
+22
+1.5
+32
+1.18826163313676
+13
+1.52180460101532
+23
+1.5
+33
+1.18826163313676
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.52180460101532
+20
+1.5
+30
+1.18826163313676
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.5
+22
+1.5
+32
+1.18780925188093
+13
+1.5
+23
+1.5
+33
+1.18780925188093
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+0.8525
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+1.295
+22
+1.5
+32
+-6.93889390390723e-17
+13
+1.295
+23
+1.5
+33
+-6.93889390390723e-17
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+1.5
+30
+0.8525
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+2.1475
+22
+1.5
+32
+1.28416666666667
+13
+2.1475
+23
+1.5
+33
+1.28416666666667
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.19319581865357
+31
+-2.75981973074096e-17
+12
+1.295
+22
+1.295
+32
+-2.99528920185329e-17
+13
+1.295
+23
+1.295
+33
+-2.99528920185329e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.56962716899663
+20
+1.5
+30
+1.80464455901512
+11
+1.53943150665524
+21
+3.0
+31
+1.81000226818992
+12
+1.53943150665524
+22
+1.5
+32
+1.81000226818992
+13
+1.53943150665524
+23
+1.5
+33
+1.81000226818992
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.53943150665524
+20
+3.0
+30
+1.81000226818992
+11
+1.56962716899663
+21
+1.5
+31
+1.80464455901512
+12
+1.56962716899663
+22
+3.0
+32
+1.80464455901512
+13
+1.56962716899663
+23
+3.0
+33
+1.80464455901512
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.68090954183794
+20
+1.5
+30
+1.7548097087475
+11
+1.65506269396675
+21
+3.0
+31
+1.77131496630259
+12
+1.65506269396675
+22
+1.5
+32
+1.77131496630259
+13
+1.65506269396675
+23
+1.5
+33
+1.77131496630259
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.65506269396675
+20
+3.0
+30
+1.77131496630259
+11
+1.68090954183794
+21
+1.5
+31
+1.7548097087475
+12
+1.68090954183794
+22
+3.0
+32
+1.7548097087475
+13
+1.68090954183794
+23
+3.0
+33
+1.7548097087475
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.52180460101532
+20
+3.0
+30
+1.18826163313676
+11
+1.5
+21
+1.5
+31
+1.18780925188093
+12
+1.5
+22
+3.0
+32
+1.18780925188093
+13
+1.5
+23
+3.0
+33
+1.18780925188093
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+1.18780925188093
+11
+1.52180460101532
+21
+3.0
+31
+1.18826163313676
+12
+1.52180460101532
+22
+1.5
+32
+1.18826163313676
+13
+1.52180460101532
+23
+1.5
+33
+1.18826163313676
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+1.81219074811907
+11
+1.5
+21
+1.5
+31
+1.18780925188093
+12
+1.5
+22
+1.5
+32
+1.81219074811907
+13
+1.5
+23
+1.5
+33
+1.81219074811907
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+1.18780925188093
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.5
+22
+3.0
+32
+1.18780925188093
+13
+1.5
+23
+3.0
+33
+1.18780925188093
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+1.18780925188093
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+3.0
+30
+2.1475
+11
+1.71583333333333
+21
+1.5
+31
+1.72547110140021
+12
+1.71583333333333
+22
+1.5
+32
+2.1475
+13
+1.71583333333333
+23
+1.5
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+1.72547110140021
+11
+1.71583333333333
+21
+3.0
+31
+2.1475
+12
+1.71583333333333
+22
+3.0
+32
+1.72547110140021
+13
+1.71583333333333
+23
+3.0
+33
+1.72547110140021
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.58220277009702
+20
+3.0
+30
+1.1985054650771
+11
+1.55225530915257
+21
+1.5
+31
+1.19189996321751
+12
+1.55225530915257
+22
+3.0
+32
+1.19189996321751
+13
+1.55225530915257
+23
+3.0
+33
+1.19189996321751
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.55225530915257
+20
+1.5
+30
+1.19189996321751
+11
+1.58220277009702
+21
+3.0
+31
+1.1985054650771
+12
+1.58220277009702
+22
+1.5
+32
+1.1985054650771
+13
+1.58220277009702
+23
+1.5
+33
+1.1985054650771
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.795
+21
+3.0
+31
+1.5
+12
+2.1475
+22
+3.0
+32
+2.1475
+13
+2.1475
+23
+3.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+1.5
+30
+1.71583333333333
+11
+1.71583333333333
+21
+3.0
+31
+2.1475
+12
+1.71583333333333
+22
+1.5
+32
+2.1475
+13
+1.71583333333333
+23
+1.5
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+3.0
+30
+2.1475
+11
+2.1475
+21
+1.5
+31
+1.71583333333333
+12
+2.1475
+22
+3.0
+32
+1.71583333333333
+13
+2.1475
+23
+3.0
+33
+1.71583333333333
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.66618239017884
+20
+3.0
+30
+1.23534992311649
+11
+1.63944193282374
+21
+1.5
+31
+1.22033556291445
+12
+1.63944193282374
+22
+3.0
+32
+1.22033556291445
+13
+1.63944193282374
+23
+3.0
+33
+1.22033556291445
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.63944193282374
+20
+1.5
+30
+1.22033556291445
+11
+1.66618239017884
+21
+3.0
+31
+1.23534992311649
+12
+1.66618239017884
+22
+1.5
+32
+1.23534992311649
+13
+1.66618239017884
+23
+1.5
+33
+1.23534992311649
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.69132242027198
+20
+3.0
+30
+1.25291300823137
+11
+1.66618239017884
+21
+1.5
+31
+1.23534992311649
+12
+1.66618239017884
+22
+3.0
+32
+1.23534992311649
+13
+1.66618239017884
+23
+3.0
+33
+1.23534992311649
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.66618239017884
+20
+1.5
+30
+1.23534992311649
+11
+1.69132242027198
+21
+3.0
+31
+1.25291300823137
+12
+1.69132242027198
+22
+1.5
+32
+1.25291300823137
+13
+1.69132242027198
+23
+1.5
+33
+1.25291300823137
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71461991087043
+20
+3.0
+30
+1.27285567614847
+11
+1.69132242027198
+21
+1.5
+31
+1.25291300823137
+12
+1.69132242027198
+22
+3.0
+32
+1.25291300823137
+13
+1.69132242027198
+23
+3.0
+33
+1.25291300823137
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.69132242027198
+20
+1.5
+30
+1.25291300823137
+11
+1.71461991087043
+21
+3.0
+31
+1.27285567614847
+12
+1.71461991087043
+22
+1.5
+32
+1.27285567614847
+13
+1.71461991087043
+23
+1.5
+33
+1.27285567614847
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+3.0
+30
+0.8525
+11
+2.1475
+21
+1.5
+31
+1.28416666666667
+12
+1.71583333333333
+22
+1.5
+32
+0.8525
+13
+1.71583333333333
+23
+1.5
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+1.5
+30
+1.28416666666667
+11
+1.71583333333333
+21
+3.0
+31
+0.8525
+12
+2.1475
+22
+3.0
+32
+1.28416666666667
+13
+2.1475
+23
+3.0
+33
+1.28416666666667
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+2.1475
+21
+1.5
+31
+1.71583333333333
+12
+2.1475
+22
+1.5
+32
+2.1475
+13
+2.1475
+23
+1.5
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+1.5
+30
+1.71583333333333
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+2.1475
+22
+3.0
+32
+1.71583333333333
+13
+2.1475
+23
+3.0
+33
+1.71583333333333
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.53943150665524
+20
+1.5
+30
+1.81000226818992
+11
+1.50885609734932
+21
+3.0
+31
+1.81237448605758
+12
+1.50885609734932
+22
+1.5
+32
+1.81237448605758
+13
+1.50885609734932
+23
+1.5
+33
+1.81237448605758
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.50885609734932
+20
+3.0
+30
+1.81237448605758
+11
+1.53943150665524
+21
+1.5
+31
+1.81000226818992
+12
+1.53943150665524
+22
+3.0
+32
+1.81000226818992
+13
+1.53943150665524
+23
+3.0
+33
+1.81000226818992
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.50885609734932
+20
+1.5
+30
+1.81237448605758
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.5
+22
+1.5
+32
+1.81219074811907
+13
+1.5
+23
+1.5
+33
+1.81219074811907
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+1.81219074811907
+11
+1.50885609734932
+21
+1.5
+31
+1.81237448605758
+12
+1.50885609734932
+22
+3.0
+32
+1.81237448605758
+13
+1.50885609734932
+23
+3.0
+33
+1.81237448605758
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.62772250758676
+20
+1.5
+30
+1.78520731241634
+11
+1.59915228363849
+21
+3.0
+31
+1.79635295620134
+12
+1.59915228363849
+22
+1.5
+32
+1.79635295620134
+13
+1.59915228363849
+23
+1.5
+33
+1.79635295620134
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.59915228363849
+20
+3.0
+30
+1.79635295620134
+11
+1.62772250758676
+21
+1.5
+31
+1.78520731241634
+12
+1.62772250758676
+22
+3.0
+32
+1.78520731241634
+13
+1.62772250758676
+23
+3.0
+33
+1.78520731241634
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.59915228363849
+20
+1.5
+30
+1.79635295620134
+11
+1.56962716899663
+21
+3.0
+31
+1.80464455901512
+12
+1.56962716899663
+22
+1.5
+32
+1.80464455901512
+13
+1.56962716899663
+23
+1.5
+33
+1.80464455901512
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.56962716899663
+20
+3.0
+30
+1.80464455901512
+11
+1.59915228363849
+21
+1.5
+31
+1.79635295620134
+12
+1.59915228363849
+22
+3.0
+32
+1.79635295620134
+13
+1.59915228363849
+23
+3.0
+33
+1.79635295620134
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+3.0
+30
+1.27412051524007
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.71583333333333
+22
+1.5
+32
+1.27412051524007
+13
+1.71583333333333
+23
+1.5
+33
+1.27412051524007
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+0.8525
+11
+1.71583333333333
+21
+3.0
+31
+1.27412051524007
+12
+1.71583333333333
+22
+3.0
+32
+0.8525
+13
+1.71583333333333
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.65506269396675
+20
+1.5
+30
+1.77131496630259
+11
+1.62772250758676
+21
+3.0
+31
+1.78520731241634
+12
+1.62772250758676
+22
+1.5
+32
+1.78520731241634
+13
+1.62772250758676
+23
+1.5
+33
+1.78520731241634
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.62772250758676
+20
+3.0
+30
+1.78520731241634
+11
+1.65506269396675
+21
+1.5
+31
+1.77131496630259
+12
+1.65506269396675
+22
+3.0
+32
+1.77131496630259
+13
+1.65506269396675
+23
+3.0
+33
+1.77131496630259
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.55225530915257
+20
+3.0
+30
+1.19189996321751
+11
+1.52180460101532
+21
+1.5
+31
+1.18826163313676
+12
+1.52180460101532
+22
+3.0
+32
+1.18826163313676
+13
+1.52180460101532
+23
+3.0
+33
+1.18826163313676
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.52180460101532
+20
+1.5
+30
+1.18826163313676
+11
+1.55225530915257
+21
+3.0
+31
+1.19189996321751
+12
+1.55225530915257
+22
+1.5
+32
+1.19189996321751
+13
+1.55225530915257
+23
+1.5
+33
+1.19189996321751
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.54077703531283
+30
+3.0
+11
+2.1475
+21
+1.5
+31
+2.1475
+12
+1.295
+22
+1.5
+32
+3.0
+13
+1.295
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+1.5
+30
+2.1475
+11
+1.295
+21
+1.54077703531283
+31
+3.0
+12
+2.1475
+22
+3.0
+32
+2.1475
+13
+2.1475
+23
+3.0
+33
+2.1475
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+1.295
+21
+1.54077703531283
+31
+3.0
+12
+1.295
+22
+1.58491378028648
+32
+3.0
+13
+1.295
+23
+1.58491378028648
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+1.295
+21
+1.58491378028648
+31
+3.0
+12
+1.295
+22
+1.63697662077346
+32
+3.0
+13
+1.295
+23
+1.63697662077346
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+1.295
+21
+1.63697662077346
+31
+3.0
+12
+1.295
+22
+1.705
+32
+3.0
+13
+1.295
+23
+1.705
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+1.295
+21
+1.705
+31
+3.0
+12
+1.295
+22
+1.80680418134643
+32
+3.0
+13
+1.295
+23
+1.80680418134643
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+1.295
+21
+1.80680418134643
+31
+3.0
+12
+1.295
+22
+1.99491378028649
+32
+3.0
+13
+1.295
+23
+1.99491378028649
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+1.295
+21
+1.99491378028649
+31
+3.0
+12
+1.295
+22
+2.2311863483779
+32
+3.0
+13
+1.295
+23
+2.2311863483779
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+1.295
+21
+2.2311863483779
+31
+3.0
+12
+1.295
+22
+2.5306045958858
+32
+3.0
+13
+1.295
+23
+2.5306045958858
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+1.295
+21
+2.5306045958858
+31
+3.0
+12
+1.295
+22
+3.0
+32
+3.0
+13
+1.295
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+1.295
+21
+3.0
+31
+3.0
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.54077703531283
+31
+3.0
+12
+1.295
+22
+1.5
+32
+3.0
+13
+1.295
+23
+1.5
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+1.28416666666667
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+2.1475
+22
+1.5
+32
+1.28416666666667
+13
+2.1475
+23
+1.5
+33
+1.28416666666667
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+1.5
+30
+0.8525
+11
+2.1475
+21
+3.0
+31
+1.28416666666667
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.70501413192602
+20
+1.5
+30
+1.73585049440402
+11
+1.68090954183794
+21
+3.0
+31
+1.7548097087475
+12
+1.68090954183794
+22
+1.5
+32
+1.7548097087475
+13
+1.68090954183794
+23
+1.5
+33
+1.7548097087475
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.68090954183794
+20
+3.0
+30
+1.7548097087475
+11
+1.70501413192602
+21
+1.5
+31
+1.73585049440402
+12
+1.70501413192602
+22
+3.0
+32
+1.73585049440402
+13
+1.70501413192602
+23
+3.0
+33
+1.73585049440402
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.63944193282374
+20
+3.0
+30
+1.22033556291445
+11
+1.61135857342883
+21
+1.5
+31
+1.20801452412167
+12
+1.61135857342883
+22
+3.0
+32
+1.20801452412167
+13
+1.61135857342883
+23
+3.0
+33
+1.20801452412167
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.61135857342883
+20
+1.5
+30
+1.20801452412167
+11
+1.63944193282374
+21
+3.0
+31
+1.22033556291445
+12
+1.63944193282374
+22
+1.5
+32
+1.22033556291445
+13
+1.63944193282374
+23
+1.5
+33
+1.22033556291445
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71461991087043
+20
+3.0
+30
+1.27285567614847
+11
+1.71583333333333
+21
+1.5
+31
+1.27412051524007
+12
+1.71461991087043
+22
+1.5
+32
+1.27285567614847
+13
+1.71461991087043
+23
+1.5
+33
+1.27285567614847
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+1.27412051524007
+11
+1.71461991087043
+21
+3.0
+31
+1.27285567614847
+12
+1.71583333333333
+22
+3.0
+32
+1.27412051524007
+13
+1.71583333333333
+23
+3.0
+33
+1.27412051524007
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+1.5
+30
+1.72547110140021
+11
+1.70501413192602
+21
+3.0
+31
+1.73585049440402
+12
+1.70501413192602
+22
+1.5
+32
+1.73585049440402
+13
+1.70501413192602
+23
+1.5
+33
+1.73585049440402
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.70501413192602
+20
+3.0
+30
+1.73585049440402
+11
+1.71583333333333
+21
+1.5
+31
+1.72547110140021
+12
+1.71461991087043
+22
+3.0
+32
+1.72547110140021
+13
+1.71461991087043
+23
+3.0
+33
+1.72547110140021
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71461991087043
+20
+3.0
+30
+1.72547110140021
+11
+1.71583333333333
+21
+1.5
+31
+1.72547110140021
+12
+1.71583333333333
+22
+3.0
+32
+1.72547110140021
+13
+1.71583333333333
+23
+3.0
+33
+1.72547110140021
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+1.5
+30
+0.8525
+11
+1.295
+21
+1.54077703531283
+31
+-3.67694180123813e-17
+12
+1.295
+22
+1.5
+32
+-6.93889390390723e-17
+13
+1.295
+23
+1.5
+33
+-6.93889390390723e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.54077703531283
+30
+-3.67694180123813e-17
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+1.295
+22
+1.58491378028649
+32
+-3.90153260770453e-17
+13
+1.295
+23
+1.58491378028649
+33
+-3.90153260770453e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.58491378028649
+30
+-3.90153260770453e-17
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+1.295
+22
+1.63697662077346
+32
+-4.16645552711963e-17
+13
+1.295
+23
+1.63697662077346
+33
+-4.16645552711963e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.63697662077346
+30
+-4.16645552711963e-17
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+1.295
+22
+1.705
+32
+-4.51259400217434e-17
+13
+1.295
+23
+1.705
+33
+-4.51259400217434e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.705
+30
+-4.51259400217434e-17
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+1.295
+22
+1.80680418134643
+32
+-5.03062683862146e-17
+13
+1.295
+23
+1.80680418134643
+33
+-5.03062683862146e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.80680418134643
+30
+-5.03062683862146e-17
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+1.295
+22
+1.99491378028649
+32
+-5.98782670814598e-17
+13
+1.295
+23
+1.99491378028649
+33
+-5.98782670814598e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.99491378028649
+30
+-5.98782670814598e-17
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+1.295
+22
+2.2311863483779
+32
+-7.19010491523201e-17
+13
+1.295
+23
+2.2311863483779
+33
+-7.19010491523201e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+2.2311863483779
+30
+-7.19010491523201e-17
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+1.295
+22
+2.5306045958858
+32
+-8.71370131362283e-17
+13
+1.295
+23
+2.5306045958858
+33
+-8.71370131362283e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+2.5306045958858
+30
+-8.71370131362283e-17
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+1.295
+22
+3.0
+32
+-2.22044604925031e-16
+13
+1.295
+23
+3.0
+33
+-2.22044604925031e-16
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+3.0
+30
+-2.22044604925031e-16
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+0.205
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+0.740000000000001
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291423
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.5
+21
+2.26
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.26
+21
+1.5
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+2.03740115370178
+20
+0.962598846298225
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.64826864473226
+21
+0.754603186893546
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+0.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+0.0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.295
+31
+-2.99528920185329e-17
+12
+1.295
+22
+1.36302337922654
+32
+-3.1526248723327e-17
+13
+1.295
+23
+1.36302337922654
+33
+-3.1526248723327e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.45922296468717
+31
+-3.37513111136975e-17
+12
+1.295
+22
+1.5
+32
+-6.93889390390723e-17
+13
+1.295
+23
+1.5
+33
+-6.93889390390723e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.80680418134643
+31
+-5.03062683862146e-17
+12
+1.295
+22
+1.99491378028649
+32
+-5.98782670814598e-17
+13
+1.295
+23
+1.99491378028649
+33
+-5.98782670814598e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.41508621971352
+31
+-3.27304438115775e-17
+12
+1.295
+22
+1.45922296468717
+32
+-3.37513111136975e-17
+13
+1.295
+23
+1.45922296468717
+33
+-3.37513111136975e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.5
+31
+-6.93889390390723e-17
+12
+1.295
+22
+1.54077703531283
+32
+-3.67694180123813e-17
+13
+1.295
+23
+1.54077703531283
+33
+-3.67694180123813e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.35173135526774
+20
+2.24539681310646
+30
+0.0
+11
+1.295
+21
+2.2311863483779
+31
+-7.19010491523201e-17
+12
+1.295
+22
+2.5306045958858
+32
+-8.71370131362283e-17
+13
+1.295
+23
+2.5306045958858
+33
+-8.71370131362283e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.35173135526774
+20
+2.24539681310646
+30
+0.0
+11
+1.295
+21
+1.99491378028649
+31
+-5.98782670814598e-17
+12
+1.295
+22
+2.2311863483779
+32
+-7.19010491523201e-17
+13
+1.295
+23
+2.2311863483779
+33
+-7.19010491523201e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.99491378028649
+30
+-5.98782670814598e-17
+11
+1.35173135526774
+21
+2.24539681310646
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.58491378028649
+31
+-3.90153260770453e-17
+12
+1.295
+22
+1.63697662077346
+32
+-4.16645552711963e-17
+13
+1.295
+23
+1.63697662077346
+33
+-4.16645552711963e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.63697662077346
+31
+-4.16645552711963e-17
+12
+1.295
+22
+1.705
+32
+-4.51259400217434e-17
+13
+1.295
+23
+1.705
+33
+-4.51259400217434e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298225
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298225
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.0
+30
+0.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.0
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+12
+3.0
+22
+0.497732043121052
+32
+0.0
+13
+3.0
+23
+0.497732043121052
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.0
+30
+0.0
+11
+3.0
+21
+0.497732043121052
+31
+0.0
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+0.0
+11
+3.0
+21
+0.497732043121052
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.497732043121052
+30
+0.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.497732043121052
+30
+0.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+0.0
+12
+3.0
+22
+0.878679656440358
+32
+0.0
+13
+3.0
+23
+0.878679656440358
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+0.0
+11
+3.0
+21
+0.878679656440358
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.878679656440358
+30
+0.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.878679656440358
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+12
+3.0
+22
+1.20163144893051
+32
+0.0
+13
+3.0
+23
+1.20163144893051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.25634039227087
+20
+1.42550697334953
+30
+0.0
+11
+3.0
+21
+1.20163144893051
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.20163144893051
+30
+0.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+0.0
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.20163144893051
+30
+0.0
+11
+2.26
+21
+1.5
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+0.0
+11
+1.295
+21
+2.5306045958858
+31
+-8.71370131362283e-17
+12
+1.295
+22
+3.0
+32
+-2.22044604925031e-16
+13
+1.295
+23
+3.0
+33
+-2.22044604925031e-16
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+2.5306045958858
+30
+-8.71370131362283e-17
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310646
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310646
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.35173135526774
+20
+2.24539681310646
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+0.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.42550697334953
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.5
+21
+2.26
+31
+0.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+2.26
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+0.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.35173135526774
+20
+0.754603186893546
+30
+0.0
+11
+1.295
+21
+0.0
+31
+0.0
+12
+1.295
+22
+0.469395404114199
+32
+-1.0856949693767e-17
+13
+1.295
+23
+0.469395404114199
+33
+-1.0856949693767e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.0
+30
+0.0
+11
+1.35173135526774
+21
+0.754603186893546
+31
+0.0
+12
+1.5
+22
+4.9960036108132e-16
+32
+0.0
+13
+1.5
+23
+4.9960036108132e-16
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+4.9960036108132e-16
+30
+0.0
+11
+1.35173135526774
+21
+0.754603186893546
+31
+0.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+0.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+4.9960036108132e-16
+30
+0.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+0.0
+12
+1.5
+22
+0.740000000000001
+32
+0.0
+13
+1.5
+23
+0.740000000000001
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+0.0
+11
+1.5
+21
+4.9960036108132e-16
+31
+0.0
+12
+1.5
+22
+0.740000000000001
+32
+0.0
+13
+1.5
+23
+0.740000000000001
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+4.9960036108132e-16
+30
+0.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+0.0
+12
+1.79836855106949
+22
+4.9960036108132e-16
+32
+0.0
+13
+1.79836855106949
+23
+4.9960036108132e-16
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+4.9960036108132e-16
+30
+0.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893546
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893546
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.705
+31
+-4.51259400217434e-17
+12
+1.295
+22
+1.80680418134643
+32
+-5.03062683862146e-17
+13
+1.295
+23
+1.80680418134643
+33
+-5.03062683862146e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79083940859747
+20
+2.20214844470858
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.36302337922654
+31
+-3.1526248723327e-17
+12
+1.295
+22
+1.41508621971352
+32
+-3.27304438115775e-17
+13
+1.295
+23
+1.41508621971352
+33
+-3.27304438115775e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.85826151998776
+20
+0.829739839095251
+30
+0.0
+11
+2.12132034355964
+21
+4.44089209850063e-16
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291423
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291423
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.12132034355964
+20
+4.44089209850063e-16
+30
+0.0
+11
+1.85826151998776
+21
+0.829739839095251
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.12132034355964
+20
+4.44089209850063e-16
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+12
+2.50226795687895
+22
+4.44089209850063e-16
+32
+0.0
+13
+2.50226795687895
+23
+4.44089209850063e-16
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.72061635471339
+20
+0.772725344843522
+30
+0.0
+11
+1.79836855106949
+21
+4.9960036108132e-16
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893546
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893546
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+4.9960036108132e-16
+30
+0.0
+11
+1.72061635471339
+21
+0.772725344843522
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291423
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291423
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+4.9960036108132e-16
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291423
+31
+0.0
+12
+2.12132034355964
+22
+4.44089209850063e-16
+32
+0.0
+13
+2.12132034355964
+23
+4.44089209850063e-16
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+0.0
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.9222333770949
+20
+2.13191690534993
+30
+0.0
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+2.50226795687895
+22
+3.0
+32
+0.0
+13
+2.50226795687895
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.79836855106949
+30
+0.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+0.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+0.0
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.26
+20
+1.5
+30
+0.0
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.50226795687895
+20
+3.0
+30
+0.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.03740115370178
+20
+2.03740115370178
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.03740115370178
+20
+2.03740115370178
+30
+0.0
+11
+2.795
+21
+3.0
+31
+0.0
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.13191690534993
+20
+1.9222333770949
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+0.0
+13
+3.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.35173135526774
+20
+0.754603186893546
+30
+0.0
+11
+1.295
+21
+0.469395404114199
+31
+-1.0856949693767e-17
+12
+1.295
+22
+0.768813651622095
+32
+-1.77823878682707e-17
+13
+1.295
+23
+0.768813651622095
+33
+-1.77823878682707e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+0.768813651622095
+31
+-1.77823878682707e-17
+12
+1.295
+22
+1.00508621971351
+32
+-2.32472888095709e-17
+13
+1.295
+23
+1.00508621971351
+33
+-2.32472888095709e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.768813651622095
+30
+-1.77823878682707e-17
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893546
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893546
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+0.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.20214844470858
+20
+1.79083940859747
+30
+0.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.12132034355964
+30
+0.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+0.0
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.24539681310645
+20
+1.64826864473226
+30
+0.0
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+3.0
+22
+1.79836855106949
+32
+0.0
+13
+3.0
+23
+1.79836855106949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.98213889596437
+20
+0.912512055444321
+30
+0.0
+11
+2.50226795687895
+21
+4.44089209850063e-16
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.50226795687895
+20
+4.44089209850063e-16
+30
+0.0
+11
+1.98213889596437
+21
+0.912512055444321
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298225
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298225
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.50226795687895
+20
+4.44089209850063e-16
+30
+0.0
+11
+2.03740115370178
+21
+0.962598846298225
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.42550697334953
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310646
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310646
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.5
+21
+2.26
+31
+0.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+0.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+0.0
+12
+1.5
+22
+0.740000000000001
+32
+0.0
+13
+1.5
+23
+0.740000000000001
+33
+0.0
+70
+15
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+0.740000000000001
+30
+0.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+0.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+0.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+0.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+0.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893546
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893546
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.64826864473226
+20
+0.754603186893546
+30
+0.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+0.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+0.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.64826864473226
+20
+0.754603186893546
+30
+0.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+0.0
+12
+1.72061635471339
+22
+0.772725344843522
+32
+0.0
+13
+1.72061635471339
+23
+0.772725344843522
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.72061635471339
+20
+0.772725344843522
+30
+0.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.72061635471339
+20
+0.772725344843522
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291423
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291423
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79083940859747
+20
+0.797851555291423
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+0.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79083940859747
+20
+0.797851555291423
+30
+0.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+0.0
+12
+1.85826151998776
+22
+0.829739839095251
+32
+0.0
+13
+1.85826151998776
+23
+0.829739839095251
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.85826151998776
+20
+0.829739839095251
+30
+0.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.85826151998776
+20
+0.829739839095251
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.9222333770949
+20
+0.868083094650066
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+0.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.9222333770949
+20
+0.868083094650066
+30
+0.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+0.0
+12
+1.98213889596437
+22
+0.912512055444321
+32
+0.0
+13
+1.98213889596437
+23
+0.912512055444321
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.98213889596437
+20
+0.912512055444321
+30
+0.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.98213889596437
+20
+0.912512055444321
+30
+0.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298225
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298225
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.03740115370178
+20
+0.962598846298225
+30
+0.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+0.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+0.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.03740115370178
+20
+0.962598846298225
+30
+0.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+0.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+0.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+0.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.13191690534993
+20
+1.0777666229051
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+0.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.13191690534993
+20
+1.0777666229051
+30
+0.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+0.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+0.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+0.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+0.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+0.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+0.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+0.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+0.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+0.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.24539681310646
+20
+1.35173135526774
+30
+0.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+0.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+0.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.24539681310646
+20
+1.35173135526774
+30
+0.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+0.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+0.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.25634039227087
+20
+1.42550697334953
+30
+0.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+0.0
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893546
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893546
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.42550697334953
+20
+0.743659607729131
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.5
+22
+0.740000000000001
+32
+0.0
+13
+1.5
+23
+0.740000000000001
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.00508621971351
+31
+-2.32472888095709e-17
+12
+1.295
+22
+1.19319581865357
+32
+-2.75981973074096e-17
+13
+1.295
+23
+1.19319581865357
+33
+-2.75981973074096e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.295
+21
+1.54077703531283
+31
+-3.67694180123813e-17
+12
+1.295
+22
+1.58491378028649
+32
+-3.90153260770453e-17
+13
+1.295
+23
+1.58491378028649
+33
+-3.90153260770453e-17
+70
+0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+0.740000000000001
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.64826864473226
+21
+0.754603186893546
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+2.03740115370178
+20
+0.962598846298225
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.26
+21
+1.5
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291423
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.5
+21
+2.26
+31
+3.0
+ 0
+LINE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.5
+31
+3.0
+12
+1.295
+22
+1.45922296468717
+32
+3.0
+13
+1.295
+23
+1.45922296468717
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.35173135526774
+20
+2.24539681310646
+30
+3.0
+11
+1.295
+21
+2.5306045958858
+31
+3.0
+12
+1.295
+22
+2.2311863483779
+32
+3.0
+13
+1.295
+23
+2.2311863483779
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+2.2311863483779
+31
+3.0
+12
+1.295
+22
+1.99491378028649
+32
+3.0
+13
+1.295
+23
+1.99491378028649
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+2.2311863483779
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310646
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310646
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.36302337922654
+31
+3.0
+12
+1.295
+22
+1.295
+32
+3.0
+13
+1.295
+23
+1.295
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+4.9960036108132e-16
+30
+3.0
+11
+1.295
+21
+0.469395404114199
+31
+3.0
+12
+1.295
+22
+0.0
+32
+3.0
+13
+1.295
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.469395404114199
+30
+3.0
+11
+1.5
+21
+4.9960036108132e-16
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893546
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893546
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.35173135526774
+20
+0.754603186893546
+30
+3.0
+11
+1.5
+21
+4.9960036108132e-16
+31
+3.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+3.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.42550697334953
+20
+0.743659607729131
+30
+3.0
+11
+1.5
+21
+4.9960036108132e-16
+31
+3.0
+12
+1.5
+22
+0.740000000000001
+32
+3.0
+13
+1.5
+23
+0.740000000000001
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.41508621971352
+31
+3.0
+12
+1.295
+22
+1.36302337922654
+32
+3.0
+13
+1.295
+23
+1.36302337922654
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.295
+31
+3.0
+12
+1.295
+22
+1.19319581865357
+32
+3.0
+13
+1.295
+23
+1.19319581865357
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298225
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298225
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.13191690534993
+20
+1.0777666229051
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.497732043121052
+32
+3.0
+13
+3.0
+23
+0.497732043121052
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.497732043121052
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.205
+32
+3.0
+13
+3.0
+23
+0.205
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.497732043121052
+30
+3.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+3.0
+11
+3.0
+21
+0.497732043121052
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+3.0
+21
+0.497732043121052
+31
+3.0
+12
+3.0
+22
+0.878679656440358
+32
+3.0
+13
+3.0
+23
+0.878679656440358
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.58491378028648
+31
+3.0
+12
+1.295
+22
+1.54077703531283
+32
+3.0
+13
+1.295
+23
+1.54077703531283
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.45922296468717
+31
+3.0
+12
+1.295
+22
+1.41508621971352
+32
+3.0
+13
+1.295
+23
+1.41508621971352
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.19319581865357
+31
+3.0
+12
+1.295
+22
+1.00508621971351
+32
+3.0
+13
+1.295
+23
+1.00508621971351
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.35173135526774
+20
+0.754603186893546
+30
+3.0
+11
+1.295
+21
+0.768813651622095
+31
+3.0
+12
+1.295
+22
+0.469395404114199
+32
+3.0
+13
+1.295
+23
+0.469395404114199
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+3.0
+12
+1.79836855106949
+22
+3.0
+32
+3.0
+13
+1.79836855106949
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+3.0
+11
+1.79836855106949
+21
+3.0
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.878679656440358
+30
+3.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+3.0
+11
+3.0
+21
+0.878679656440358
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.24539681310646
+20
+1.35173135526774
+30
+3.0
+11
+3.0
+21
+0.878679656440358
+31
+3.0
+12
+3.0
+22
+1.20163144893051
+32
+3.0
+13
+3.0
+23
+1.20163144893051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.80680418134643
+31
+3.0
+12
+1.295
+22
+1.705
+32
+3.0
+13
+1.295
+23
+1.705
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.99491378028649
+31
+3.0
+12
+1.295
+22
+1.80680418134643
+32
+3.0
+13
+1.295
+23
+1.80680418134643
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.705
+31
+3.0
+12
+1.295
+22
+1.63697662077346
+32
+3.0
+13
+1.295
+23
+1.63697662077346
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.295
+21
+1.63697662077346
+31
+3.0
+12
+1.295
+22
+1.58491378028648
+32
+3.0
+13
+1.295
+23
+1.58491378028648
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.35173135526774
+20
+2.24539681310646
+30
+3.0
+11
+1.295
+21
+3.0
+31
+3.0
+12
+1.295
+22
+2.5306045958858
+32
+3.0
+13
+1.295
+23
+2.5306045958858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+3.0
+30
+3.0
+11
+1.35173135526774
+21
+2.24539681310646
+31
+3.0
+12
+1.5
+22
+3.0
+32
+3.0
+13
+1.5
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.35173135526774
+21
+2.24539681310646
+31
+3.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+3.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.12132034355964
+20
+4.44089209850063e-16
+30
+3.0
+11
+1.85826151998776
+21
+0.829739839095251
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291423
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291423
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.85826151998776
+20
+0.829739839095251
+30
+3.0
+11
+2.12132034355964
+21
+4.44089209850063e-16
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.9222333770949
+20
+0.868083094650066
+30
+3.0
+11
+2.12132034355964
+21
+4.44089209850063e-16
+31
+3.0
+12
+2.50226795687895
+22
+4.44089209850063e-16
+32
+3.0
+13
+2.50226795687895
+23
+4.44089209850063e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.50226795687895
+20
+4.44089209850063e-16
+30
+3.0
+11
+1.98213889596437
+21
+0.912512055444321
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.98213889596437
+20
+0.912512055444321
+30
+3.0
+11
+2.50226795687895
+21
+4.44089209850063e-16
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298225
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298225
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.03740115370178
+20
+0.962598846298225
+30
+3.0
+11
+2.50226795687895
+21
+4.44089209850063e-16
+31
+3.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.35173135526774
+20
+0.754603186893546
+30
+3.0
+11
+1.295
+21
+1.00508621971351
+31
+3.0
+12
+1.295
+22
+0.768813651622095
+32
+3.0
+13
+1.295
+23
+0.768813651622095
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.00508621971351
+30
+3.0
+11
+1.35173135526774
+21
+0.754603186893546
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+3.0
+11
+3.0
+21
+2.12132034355964
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+12
+3.0
+22
+1.79836855106949
+32
+3.0
+13
+3.0
+23
+1.79836855106949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+4.9960036108132e-16
+30
+3.0
+11
+1.72061635471339
+21
+0.772725344843522
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893546
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893546
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.72061635471339
+20
+0.772725344843522
+30
+3.0
+11
+1.79836855106949
+21
+4.9960036108132e-16
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291423
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291423
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79083940859747
+20
+0.797851555291423
+30
+3.0
+11
+1.79836855106949
+21
+4.9960036108132e-16
+31
+3.0
+12
+2.12132034355964
+22
+4.44089209850063e-16
+32
+3.0
+13
+2.12132034355964
+23
+4.44089209850063e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.25634039227087
+20
+1.42550697334953
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+3.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.26
+20
+1.5
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+3.0
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+3.0
+11
+3.0
+21
+1.79836855106949
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+3.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+2.26
+21
+1.5
+31
+3.0
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+4.9960036108132e-16
+30
+3.0
+11
+1.5
+21
+0.740000000000001
+31
+3.0
+12
+1.5
+22
+4.9960036108132e-16
+32
+3.0
+13
+1.5
+23
+4.9960036108132e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+0.740000000000001
+30
+3.0
+11
+1.79836855106949
+21
+4.9960036108132e-16
+31
+3.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+3.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+3.0
+11
+1.79836855106949
+21
+4.9960036108132e-16
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893546
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893546
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+12
+3.0
+22
+2.50226795687895
+32
+3.0
+13
+3.0
+23
+2.50226795687895
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+3.0
+12
+3.0
+22
+2.795
+32
+3.0
+13
+3.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+2.50226795687895
+21
+3.0
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+3.0
+22
+3.0
+32
+3.0
+13
+3.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+12
+2.50226795687895
+22
+3.0
+32
+3.0
+13
+2.50226795687895
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.42550697334953
+20
+0.743659607729131
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893546
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893546
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+3.0
+12
+1.5
+22
+0.740000000000001
+32
+3.0
+13
+1.5
+23
+0.740000000000001
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.5
+21
+0.740000000000001
+31
+3.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+3.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+15
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+2.26
+30
+3.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+3.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+3.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+3.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893546
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893546
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+3.0
+11
+1.64826864473226
+21
+0.754603186893546
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.64826864473226
+20
+2.24539681310646
+30
+3.0
+11
+1.64826864473226
+21
+0.754603186893546
+31
+3.0
+12
+1.72061635471339
+22
+0.772725344843522
+32
+3.0
+13
+1.72061635471339
+23
+0.772725344843522
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.64826864473226
+20
+2.24539681310646
+30
+3.0
+11
+1.72061635471339
+21
+0.772725344843522
+31
+3.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+3.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+3.0
+11
+1.72061635471339
+21
+0.772725344843522
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291423
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291423
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291423
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79083940859747
+20
+2.20214844470858
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291423
+31
+3.0
+12
+1.85826151998776
+22
+0.829739839095251
+32
+3.0
+13
+1.85826151998776
+23
+0.829739839095251
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79083940859747
+20
+2.20214844470858
+30
+3.0
+11
+1.85826151998776
+21
+0.829739839095251
+31
+3.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+3.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+3.0
+11
+1.85826151998776
+21
+0.829739839095251
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.9222333770949
+20
+2.13191690534993
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+3.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.98213889596437
+22
+0.912512055444321
+32
+3.0
+13
+1.98213889596437
+23
+0.912512055444321
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+1.98213889596437
+21
+0.912512055444321
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298225
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298225
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298225
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298225
+31
+3.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+3.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+3.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+3.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+3.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.13191690534993
+20
+1.9222333770949
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+3.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.13191690534993
+20
+1.9222333770949
+30
+3.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+3.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+3.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+3.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+3.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.20214844470858
+20
+1.79083940859747
+30
+3.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+3.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+3.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.20214844470858
+20
+1.79083940859747
+30
+3.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+3.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+3.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+3.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.24539681310645
+20
+1.64826864473226
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+3.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+3.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+3.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+3.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310646
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310646
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.42550697334953
+20
+2.25634039227087
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.0
+30
+0.205
+11
+2.50226795687895
+21
+4.44089209850063e-16
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.50226795687895
+20
+4.44089209850063e-16
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.205
+12
+2.12132034355964
+22
+4.44089209850063e-16
+32
+0.0
+13
+2.12132034355964
+23
+4.44089209850063e-16
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.12132034355964
+20
+4.44089209850063e-16
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.205
+12
+1.79836855106949
+22
+4.9960036108132e-16
+32
+0.0
+13
+1.79836855106949
+23
+4.9960036108132e-16
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+4.9960036108132e-16
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.205
+12
+1.5
+22
+4.9960036108132e-16
+32
+0.0
+13
+1.5
+23
+4.9960036108132e-16
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+4.9960036108132e-16
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.205
+12
+1.295
+22
+0.0
+32
+0.0
+13
+1.295
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.0
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.205
+12
+1.295
+22
+0.0
+32
+3.0
+13
+1.295
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.0
+30
+3.0
+11
+3.0
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.0
+30
+3.0
+11
+3.0
+21
+0.0
+31
+1.5
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.0
+30
+3.0
+11
+3.0
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.0
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+2.50226795687895
+22
+4.44089209850063e-16
+32
+3.0
+13
+2.50226795687895
+23
+4.44089209850063e-16
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.0
+30
+3.0
+11
+2.50226795687895
+21
+4.44089209850063e-16
+31
+3.0
+12
+2.12132034355964
+22
+4.44089209850063e-16
+32
+3.0
+13
+2.12132034355964
+23
+4.44089209850063e-16
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.0
+30
+3.0
+11
+2.12132034355964
+21
+4.44089209850063e-16
+31
+3.0
+12
+1.79836855106949
+22
+4.9960036108132e-16
+32
+3.0
+13
+1.79836855106949
+23
+4.9960036108132e-16
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.0
+30
+3.0
+11
+1.79836855106949
+21
+4.9960036108132e-16
+31
+3.0
+12
+1.5
+22
+4.9960036108132e-16
+32
+3.0
+13
+1.5
+23
+4.9960036108132e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.469395404114199
+30
+3.0
+11
+1.295
+21
+0.0
+31
+0.0
+12
+1.295
+22
+0.0
+32
+3.0
+13
+1.295
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.0
+30
+0.0
+11
+1.295
+21
+0.469395404114199
+31
+3.0
+12
+1.295
+22
+0.469395404114199
+32
+-1.0856949693767e-17
+13
+1.295
+23
+0.469395404114199
+33
+-1.0856949693767e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.469395404114199
+30
+-1.0856949693767e-17
+11
+1.295
+21
+0.469395404114199
+31
+3.0
+12
+1.295
+22
+0.768813651622095
+32
+-1.77823878682707e-17
+13
+1.295
+23
+0.768813651622095
+33
+-1.77823878682707e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.768813651622095
+30
+-1.77823878682707e-17
+11
+1.295
+21
+0.469395404114199
+31
+3.0
+12
+1.295
+22
+0.768813651622095
+32
+3.0
+13
+1.295
+23
+0.768813651622095
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.768813651622095
+30
+-1.77823878682707e-17
+11
+1.295
+21
+0.768813651622095
+31
+3.0
+12
+1.295
+22
+1.00508621971351
+32
+3.0
+13
+1.295
+23
+1.00508621971351
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+0.768813651622095
+30
+-1.77823878682707e-17
+11
+1.295
+21
+1.00508621971351
+31
+3.0
+12
+1.295
+22
+1.00508621971351
+32
+-2.32472888095709e-17
+13
+1.295
+23
+1.00508621971351
+33
+-2.32472888095709e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.00508621971351
+30
+-2.32472888095709e-17
+11
+1.295
+21
+1.00508621971351
+31
+3.0
+12
+1.295
+22
+1.19319581865357
+32
+-2.75981973074096e-17
+13
+1.295
+23
+1.19319581865357
+33
+-2.75981973074096e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.19319581865357
+30
+-2.75981973074096e-17
+11
+1.295
+21
+1.00508621971351
+31
+3.0
+12
+1.295
+22
+1.19319581865357
+32
+3.0
+13
+1.295
+23
+1.19319581865357
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.19319581865357
+30
+-2.75981973074096e-17
+11
+1.295
+21
+1.19319581865357
+31
+3.0
+12
+1.295
+22
+1.295
+32
+-2.99528920185329e-17
+13
+1.295
+23
+1.295
+33
+-2.99528920185329e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.295
+30
+-2.99528920185329e-17
+11
+1.295
+21
+1.19319581865357
+31
+3.0
+12
+1.295
+22
+1.295
+32
+3.0
+13
+1.295
+23
+1.295
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.295
+30
+-2.99528920185329e-17
+11
+1.295
+21
+1.295
+31
+3.0
+12
+1.295
+22
+1.36302337922654
+32
+-3.1526248723327e-17
+13
+1.295
+23
+1.36302337922654
+33
+-3.1526248723327e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.36302337922654
+30
+-3.1526248723327e-17
+11
+1.295
+21
+1.295
+31
+3.0
+12
+1.295
+22
+1.36302337922654
+32
+3.0
+13
+1.295
+23
+1.36302337922654
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.36302337922654
+30
+-3.1526248723327e-17
+11
+1.295
+21
+1.36302337922654
+31
+3.0
+12
+1.295
+22
+1.41508621971352
+32
+3.0
+13
+1.295
+23
+1.41508621971352
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.36302337922654
+30
+-3.1526248723327e-17
+11
+1.295
+21
+1.41508621971352
+31
+3.0
+12
+1.295
+22
+1.41508621971352
+32
+-3.27304438115775e-17
+13
+1.295
+23
+1.41508621971352
+33
+-3.27304438115775e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.41508621971352
+30
+-3.27304438115775e-17
+11
+1.295
+21
+1.41508621971352
+31
+3.0
+12
+1.295
+22
+1.45922296468717
+32
+3.0
+13
+1.295
+23
+1.45922296468717
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.41508621971352
+30
+-3.27304438115775e-17
+11
+1.295
+21
+1.45922296468717
+31
+3.0
+12
+1.295
+22
+1.45922296468717
+32
+-3.37513111136975e-17
+13
+1.295
+23
+1.45922296468717
+33
+-3.37513111136975e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.45922296468717
+30
+-3.37513111136975e-17
+11
+1.295
+21
+1.45922296468717
+31
+3.0
+12
+1.295
+22
+1.5
+32
+3.0
+13
+1.295
+23
+1.5
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.295
+20
+1.45922296468717
+30
+-3.37513111136975e-17
+11
+1.295
+21
+1.5
+31
+3.0
+12
+1.295
+22
+1.5
+32
+-6.93889390390723e-17
+13
+1.295
+23
+1.5
+33
+-6.93889390390723e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+2.795
+12
+1.295
+22
+3.0
+32
+3.0
+13
+1.295
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+0.205
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.295
+22
+3.0
+32
+-2.22044604925031e-16
+13
+1.295
+23
+3.0
+33
+-2.22044604925031e-16
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+0.205
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.50226795687895
+22
+3.0
+32
+0.0
+13
+2.50226795687895
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.50226795687895
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+2.795
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+2.795
+12
+2.795
+22
+3.0
+32
+2.795
+13
+2.795
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+2.795
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+1.71583333333333
+11
+2.795
+21
+3.0
+31
+1.5
+12
+2.1475
+22
+3.0
+32
+1.5
+13
+2.1475
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+1.5
+11
+2.1475
+21
+3.0
+31
+1.71583333333333
+12
+2.1475
+22
+3.0
+32
+2.1475
+13
+2.1475
+23
+3.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+3.0
+21
+3.0
+31
+1.5
+12
+2.795
+22
+3.0
+32
+1.5
+13
+2.795
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+2.795
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+2.795
+21
+3.0
+31
+2.795
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+1.5
+21
+3.0
+31
+3.0
+12
+2.50226795687895
+22
+3.0
+32
+3.0
+13
+2.50226795687895
+23
+3.0
+33
+3.0
+70
+15
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.50226795687895
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.79836855106949
+22
+3.0
+32
+3.0
+13
+1.79836855106949
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+1.79836855106949
+21
+3.0
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+1.28416666666667
+11
+2.795
+21
+3.0
+31
+1.5
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+1.5
+11
+2.1475
+21
+3.0
+31
+1.28416666666667
+12
+2.1475
+22
+3.0
+32
+1.5
+13
+2.1475
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71461991087043
+20
+3.0
+30
+1.5
+11
+1.71583333333333
+21
+3.0
+31
+1.27412051524007
+12
+1.71461991087043
+22
+3.0
+32
+1.27285567614847
+13
+1.71461991087043
+23
+3.0
+33
+1.27285567614847
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71583333333333
+20
+3.0
+30
+1.27412051524007
+11
+1.71461991087043
+21
+3.0
+31
+1.5
+12
+2.1475
+22
+3.0
+32
+1.28416666666667
+13
+2.1475
+23
+3.0
+33
+1.28416666666667
+70
+15
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+1.28416666666667
+11
+1.71461991087043
+21
+3.0
+31
+1.5
+12
+2.1475
+22
+3.0
+32
+1.5
+13
+2.1475
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+1.28416666666667
+11
+1.71583333333333
+21
+3.0
+31
+0.8525
+12
+1.71583333333333
+22
+3.0
+32
+1.27412051524007
+13
+1.71583333333333
+23
+3.0
+33
+1.27412051524007
+70
+12
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71461991087043
+20
+3.0
+30
+1.72547110140021
+11
+2.1475
+21
+3.0
+31
+1.5
+12
+1.71461991087043
+22
+3.0
+32
+1.5
+13
+1.71461991087043
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+1.5
+11
+1.71461991087043
+21
+3.0
+31
+1.72547110140021
+12
+2.1475
+22
+3.0
+32
+1.71583333333333
+13
+2.1475
+23
+3.0
+33
+1.71583333333333
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+1.71583333333333
+11
+1.71461991087043
+21
+3.0
+31
+1.72547110140021
+12
+1.71583333333333
+22
+3.0
+32
+1.72547110140021
+13
+1.71583333333333
+23
+3.0
+33
+1.72547110140021
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.1475
+20
+3.0
+30
+1.71583333333333
+11
+1.71583333333333
+21
+3.0
+31
+1.72547110140021
+12
+1.71583333333333
+22
+3.0
+32
+2.1475
+13
+1.71583333333333
+23
+3.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+1.5
+11
+1.52180460101532
+21
+3.0
+31
+1.18826163313676
+12
+1.5
+22
+3.0
+32
+1.18780925188093
+13
+1.5
+23
+3.0
+33
+1.18780925188093
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.52180460101532
+20
+3.0
+30
+1.18826163313676
+11
+1.5
+21
+3.0
+31
+1.5
+12
+1.55225530915257
+22
+3.0
+32
+1.19189996321751
+13
+1.55225530915257
+23
+3.0
+33
+1.19189996321751
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.55225530915257
+20
+3.0
+30
+1.19189996321751
+11
+1.5
+21
+3.0
+31
+1.5
+12
+1.58220277009702
+22
+3.0
+32
+1.1985054650771
+13
+1.58220277009702
+23
+3.0
+33
+1.1985054650771
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.58220277009702
+20
+3.0
+30
+1.1985054650771
+11
+1.5
+21
+3.0
+31
+1.5
+12
+1.61135857342883
+22
+3.0
+32
+1.20801452412167
+13
+1.61135857342883
+23
+3.0
+33
+1.20801452412167
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.61135857342883
+20
+3.0
+30
+1.20801452412167
+11
+1.5
+21
+3.0
+31
+1.5
+12
+1.63944193282374
+22
+3.0
+32
+1.22033556291445
+13
+1.63944193282374
+23
+3.0
+33
+1.22033556291445
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.63944193282374
+20
+3.0
+30
+1.22033556291445
+11
+1.5
+21
+3.0
+31
+1.5
+12
+1.66618239017884
+22
+3.0
+32
+1.23534992311649
+13
+1.66618239017884
+23
+3.0
+33
+1.23534992311649
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.66618239017884
+20
+3.0
+30
+1.23534992311649
+11
+1.5
+21
+3.0
+31
+1.5
+12
+1.69132242027198
+22
+3.0
+32
+1.25291300823137
+13
+1.69132242027198
+23
+3.0
+33
+1.25291300823137
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.69132242027198
+20
+3.0
+30
+1.25291300823137
+11
+1.5
+21
+3.0
+31
+1.5
+12
+1.71461991087043
+22
+3.0
+32
+1.27285567614847
+13
+1.71461991087043
+23
+3.0
+33
+1.27285567614847
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.5
+20
+3.0
+30
+1.81219074811907
+11
+1.71461991087043
+21
+3.0
+31
+1.72547110140021
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71461991087043
+20
+3.0
+30
+1.72547110140021
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.70501413192602
+22
+3.0
+32
+1.73585049440402
+13
+1.70501413192602
+23
+3.0
+33
+1.73585049440402
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.70501413192602
+20
+3.0
+30
+1.73585049440402
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.68090954183794
+22
+3.0
+32
+1.7548097087475
+13
+1.68090954183794
+23
+3.0
+33
+1.7548097087475
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.68090954183794
+20
+3.0
+30
+1.7548097087475
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.65506269396675
+22
+3.0
+32
+1.77131496630259
+13
+1.65506269396675
+23
+3.0
+33
+1.77131496630259
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.65506269396675
+20
+3.0
+30
+1.77131496630259
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.62772250758676
+22
+3.0
+32
+1.78520731241634
+13
+1.62772250758676
+23
+3.0
+33
+1.78520731241634
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.62772250758676
+20
+3.0
+30
+1.78520731241634
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.59915228363849
+22
+3.0
+32
+1.79635295620134
+13
+1.59915228363849
+23
+3.0
+33
+1.79635295620134
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.59915228363849
+20
+3.0
+30
+1.79635295620134
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.56962716899663
+22
+3.0
+32
+1.80464455901512
+13
+1.56962716899663
+23
+3.0
+33
+1.80464455901512
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.56962716899663
+20
+3.0
+30
+1.80464455901512
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.53943150665524
+22
+3.0
+32
+1.81000226818992
+13
+1.53943150665524
+23
+3.0
+33
+1.81000226818992
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.53943150665524
+20
+3.0
+30
+1.81000226818992
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.50885609734932
+22
+3.0
+32
+1.81237448605758
+13
+1.50885609734932
+23
+3.0
+33
+1.81237448605758
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71461991087043
+20
+3.0
+30
+1.72547110140021
+11
+1.71461991087043
+21
+3.0
+31
+1.5
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+1.71461991087043
+20
+3.0
+30
+1.5
+11
+1.71461991087043
+21
+3.0
+31
+1.27285567614847
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+2.795
+13
+2.795
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+2.795
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+0.205
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+0
+ 0
+LINE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+1.5
+31
+0.205
+ 0
+LINE
+ 8
+taser_base
+10
+3.0
+20
+0.205
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+taser_base
+10
+3.0
+20
+2.795
+30
+1.5
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+0.205
+31
+0.205
+ 0
+LINE
+ 8
+taser_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+2.795
+31
+0.205
+ 0
+LINE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+0.205
+31
+1.5
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+2.795
+31
+1.5
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.795
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.205
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+1.5
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.795
+32
+1.5
+13
+3.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+0.205
+31
+3.0
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.205
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.497732043121052
+32
+3.0
+13
+3.0
+23
+0.497732043121052
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.497732043121052
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.878679656440358
+32
+3.0
+13
+3.0
+23
+0.878679656440358
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.878679656440358
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+1.20163144893051
+32
+3.0
+13
+3.0
+23
+1.20163144893051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.205
+30
+1.5
+11
+3.0
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.0
+30
+2.795
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+1.5
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.0
+30
+1.5
+11
+3.0
+21
+0.205
+31
+0.205
+12
+3.0
+22
+0.205
+32
+1.5
+13
+3.0
+23
+0.205
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.205
+30
+2.795
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.205
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+0.205
+32
+0.205
+13
+3.0
+23
+0.205
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.205
+30
+1.5
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+1.5
+32
+0.205
+13
+3.0
+23
+1.5
+33
+0.205
+70
+15
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+1.5
+31
+0.205
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+2.795
+13
+3.0
+23
+2.795
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+1.5
+13
+3.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+0.0
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.497732043121052
+30
+0.0
+11
+3.0
+21
+0.205
+31
+0.205
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.497732043121052
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.205
+13
+3.0
+23
+1.5
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.497732043121052
+31
+0.0
+12
+3.0
+22
+0.878679656440358
+32
+0.0
+13
+3.0
+23
+0.878679656440358
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.878679656440358
+31
+0.0
+12
+3.0
+22
+1.20163144893051
+32
+0.0
+13
+3.0
+23
+1.20163144893051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+1.20163144893051
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+1.5
+31
+3.0
+12
+3.0
+22
+1.5
+32
+2.795
+13
+3.0
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+1.79836855106949
+32
+3.0
+13
+3.0
+23
+1.79836855106949
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.50226795687895
+32
+3.0
+13
+3.0
+23
+2.50226795687895
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.795
+32
+3.0
+13
+3.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+1.5
+30
+0.0
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+1.5
+32
+0.205
+13
+3.0
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+1.5
+31
+0.0
+12
+3.0
+22
+1.79836855106949
+32
+0.0
+13
+3.0
+23
+1.79836855106949
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+0.0
+13
+3.0
+23
+2.50226795687895
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.795
+31
+3.0
+12
+3.0
+22
+2.795
+32
+2.795
+13
+3.0
+23
+2.795
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+1.5
+31
+3.0
+12
+0.0
+22
+1.79836855106949
+32
+3.0
+13
+0.0
+23
+1.79836855106949
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+2.12132034355964
+32
+3.0
+13
+0.0
+23
+2.12132034355964
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.12132034355964
+31
+3.0
+12
+0.0
+22
+2.50226795687895
+32
+3.0
+13
+0.0
+23
+2.50226795687895
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.50226795687895
+31
+3.0
+12
+0.0
+22
+2.795
+32
+3.0
+13
+0.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+1.5
+31
+1.5
+12
+0.0
+22
+0.205
+32
+2.795
+13
+0.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+1.5
+31
+2.795
+12
+0.0
+22
+1.5
+32
+2.277
+13
+0.0
+23
+1.5
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.53125
+21
+3.0
+31
+0.723
+12
+0.205
+22
+3.0
+32
+0.723
+13
+0.205
+23
+3.0
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+0.723
+11
+0.205
+21
+3.0
+31
+1.5
+12
+0.53125
+22
+3.0
+32
+0.982
+13
+0.53125
+23
+3.0
+33
+0.982
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+0.982
+11
+0.205
+21
+3.0
+31
+1.5
+12
+0.53125
+22
+3.0
+32
+1.17375
+13
+0.53125
+23
+3.0
+33
+1.17375
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+3.0
+30
+2.795
+11
+0.777
+21
+1.5
+31
+3.0
+12
+0.777
+22
+1.5
+32
+2.795
+13
+0.777
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.5
+30
+3.0
+11
+0.777
+21
+3.0
+31
+2.795
+12
+0.777
+22
+1.64381364161549
+32
+3.0
+13
+0.777
+23
+1.64381364161549
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.64381364161549
+30
+3.0
+11
+0.777
+21
+3.0
+31
+2.795
+12
+0.777
+22
+1.79947640559575
+32
+3.0
+13
+0.777
+23
+1.79947640559575
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.79947640559575
+30
+3.0
+11
+0.777
+21
+3.0
+31
+2.795
+12
+0.777
+22
+1.98309315521565
+32
+3.0
+13
+0.777
+23
+1.98309315521565
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.98309315521565
+30
+3.0
+11
+0.777
+21
+3.0
+31
+2.795
+12
+0.777
+22
+2.223
+32
+3.0
+13
+0.777
+23
+2.223
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+2.223
+30
+3.0
+11
+0.777
+21
+3.0
+31
+2.795
+12
+0.777
+22
+2.58204596640715
+32
+3.0
+13
+0.777
+23
+2.58204596640715
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+2.58204596640715
+30
+3.0
+11
+0.777
+21
+3.0
+31
+2.795
+12
+0.777
+22
+3.0
+32
+3.0
+13
+0.777
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+0.0
+30
+3.0
+11
+0.0
+21
+0.0
+31
+2.22044604925031e-16
+12
+1.295
+22
+0.0
+32
+2.22044604925031e-16
+13
+1.295
+23
+0.0
+33
+2.22044604925031e-16
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.0
+30
+2.22044604925031e-16
+11
+1.295
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.0
+32
+0.205
+13
+0.0
+23
+0.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.0
+30
+0.205
+11
+1.295
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.0
+30
+1.5
+11
+1.295
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.0
+32
+2.795
+13
+0.0
+23
+0.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.0
+30
+2.795
+11
+1.295
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.98309315521565
+30
+3.0
+11
+0.0
+21
+2.795
+31
+3.0
+12
+0.0
+22
+2.50226795687895
+32
+3.0
+13
+0.0
+23
+2.50226795687895
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+3.0
+11
+0.777
+21
+1.98309315521565
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.777
+21
+1.98309315521565
+31
+3.0
+12
+0.777
+22
+2.223
+32
+3.0
+13
+0.777
+23
+2.223
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.0
+21
+2.795
+31
+0.723
+12
+0.0
+22
+2.795
+32
+1.5
+13
+0.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+0.723
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+0.723
+13
+0.0
+23
+3.0
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+2.018
+11
+0.53125
+21
+1.5
+31
+2.277
+12
+0.53125
+22
+1.5
+32
+2.018
+13
+0.53125
+23
+1.5
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+1.5
+30
+2.277
+11
+0.53125
+21
+3.0
+31
+2.018
+12
+0.53125
+22
+3.0
+32
+2.277
+13
+0.53125
+23
+3.0
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.205
+32
+3.0
+13
+0.0
+23
+0.205
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+2.795
+13
+0.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+2.795
+11
+0.0
+21
+3.0
+31
+3.0
+12
+0.205
+22
+3.0
+32
+3.0
+13
+0.205
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+1.82625
+11
+0.796875
+21
+3.0
+31
+1.5
+12
+0.53125
+22
+3.0
+32
+1.5
+13
+0.53125
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+3.0
+30
+1.5
+11
+0.53125
+21
+3.0
+31
+1.82625
+12
+0.796875
+22
+3.0
+32
+1.759
+13
+0.796875
+23
+3.0
+33
+1.759
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+3.0
+30
+1.759
+11
+0.53125
+21
+3.0
+31
+1.82625
+12
+0.796875
+22
+3.0
+32
+2.018
+13
+0.796875
+23
+3.0
+33
+2.018
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+3.0
+30
+2.018
+11
+0.53125
+21
+3.0
+31
+1.82625
+12
+0.723000000000001
+22
+3.0
+32
+2.018
+13
+0.723000000000001
+23
+3.0
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.723
+20
+3.0
+30
+0.982
+11
+0.53125
+21
+1.5
+31
+0.982
+12
+0.53125
+22
+3.0
+32
+0.982
+13
+0.53125
+23
+3.0
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+1.5
+30
+0.982
+11
+0.723
+21
+3.0
+31
+0.982
+12
+0.796875
+22
+1.5
+32
+0.982
+13
+0.796875
+23
+1.5
+33
+0.982
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+1.5
+30
+0.982
+11
+0.723
+21
+3.0
+31
+0.982
+12
+0.796875
+22
+3.0
+32
+0.982
+13
+0.796875
+23
+3.0
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+2.795
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+3.0
+32
+2.795
+13
+0.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.777
+22
+1.5
+32
+2.795
+13
+0.777
+23
+1.5
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.5
+30
+2.795
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.777
+22
+3.0
+32
+2.795
+13
+0.777
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+1.5
+30
+1.52655665885959e-16
+11
+1.295
+21
+0.0
+31
+3.0
+12
+1.295
+22
+0.0
+32
+2.22044604925031e-16
+13
+1.295
+23
+0.0
+33
+2.22044604925031e-16
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+0.0
+30
+3.0
+11
+1.295
+21
+1.5
+31
+1.52655665885959e-16
+12
+1.295
+22
+1.5
+32
+3.0
+13
+1.295
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+1.98309315521565
+30
+4.44089209850063e-17
+11
+0.0
+21
+2.12132034355964
+31
+0.0
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.776999999999999
+21
+1.98309315521565
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+1.79947640559575
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+1.79947640559575
+33
+4.44089209850063e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+0.205
+32
+2.22044604925031e-16
+13
+0.0
+23
+0.205
+33
+2.22044604925031e-16
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.0
+21
+0.205
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.205
+30
+1.5
+11
+0.0
+21
+0.0
+31
+0.205
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.205
+31
+1.5
+12
+0.0
+22
+0.205
+32
+0.205
+13
+0.0
+23
+0.205
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+0.723
+11
+0.53125
+21
+1.5
+31
+0.982
+12
+0.53125
+22
+1.5
+32
+0.723
+13
+0.53125
+23
+1.5
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+1.5
+30
+0.982
+11
+0.53125
+21
+3.0
+31
+0.723
+12
+0.53125
+22
+3.0
+32
+0.982
+13
+0.53125
+23
+3.0
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+1.5
+30
+2.277
+11
+0.0
+21
+2.277
+31
+2.277
+12
+0.0
+22
+1.5
+32
+2.277
+13
+0.0
+23
+1.5
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.277
+30
+2.277
+11
+0.53125
+21
+1.5
+31
+2.277
+12
+0.0
+22
+2.795
+32
+2.277
+13
+0.0
+23
+2.795
+33
+2.277
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+2.277
+11
+0.53125
+21
+1.5
+31
+2.277
+12
+0.0
+22
+3.0
+32
+2.277
+13
+0.0
+23
+3.0
+33
+2.277
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+2.277
+11
+0.53125
+21
+1.5
+31
+2.277
+12
+0.205
+22
+3.0
+32
+2.277
+13
+0.205
+23
+3.0
+33
+2.277
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+2.277
+11
+0.53125
+21
+1.5
+31
+2.277
+12
+0.53125
+22
+3.0
+32
+2.277
+13
+0.53125
+23
+3.0
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+3.0
+30
+1.759
+11
+0.796875
+21
+1.5
+31
+2.018
+12
+0.796875
+22
+1.5
+32
+1.759
+13
+0.796875
+23
+1.5
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+1.5
+30
+2.018
+11
+0.796875
+21
+3.0
+31
+1.759
+12
+0.796875
+22
+3.0
+32
+2.018
+13
+0.796875
+23
+3.0
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+3.0
+30
+1.5
+11
+1.0625
+21
+3.0
+31
+1.241
+12
+0.796875
+22
+3.0
+32
+1.241
+13
+0.796875
+23
+3.0
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.0625
+20
+3.0
+30
+1.241
+11
+0.796875
+21
+3.0
+31
+1.5
+12
+1.0625
+22
+3.0
+32
+1.5
+13
+1.0625
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.79947640559575
+30
+3.0
+11
+0.0
+21
+2.50226795687895
+31
+3.0
+12
+0.0
+22
+2.12132034355964
+32
+3.0
+13
+0.0
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.50226795687895
+30
+3.0
+11
+0.777
+21
+1.79947640559575
+31
+3.0
+12
+0.777
+22
+1.98309315521565
+32
+3.0
+13
+0.777
+23
+1.98309315521565
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.205
+21
+3.0
+31
+0.723
+12
+0.0
+22
+3.0
+32
+0.723
+13
+0.0
+23
+3.0
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+0.723
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+3.0
+30
+0.982
+11
+0.796875
+21
+1.5
+31
+1.241
+12
+0.796875
+22
+1.5
+32
+0.982
+13
+0.796875
+23
+1.5
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+1.5
+30
+1.241
+11
+0.796875
+21
+3.0
+31
+0.982
+12
+0.796875
+22
+3.0
+32
+1.241
+13
+0.796875
+23
+3.0
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+1.5
+12
+0.0
+22
+0.0
+32
+2.795
+13
+0.0
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.0
+30
+1.5
+11
+0.0
+21
+0.205
+31
+2.795
+12
+0.0
+22
+0.205
+32
+1.5
+13
+0.0
+23
+0.205
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.0625
+20
+1.5
+30
+1.759
+11
+0.796875
+21
+3.0
+31
+1.759
+12
+0.796875
+22
+1.5
+32
+1.759
+13
+0.796875
+23
+1.5
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+3.0
+30
+1.759
+11
+1.0625
+21
+1.5
+31
+1.759
+12
+1.0625
+22
+3.0
+32
+1.759
+13
+1.0625
+23
+3.0
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+2.22044604925031e-16
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+2.277
+11
+0.0
+21
+2.795
+31
+1.5
+12
+0.0
+22
+2.795
+32
+2.277
+13
+0.0
+23
+2.795
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.277
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.777
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.777
+22
+3.0
+32
+3.0
+13
+0.777
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.259
+22
+3.0
+32
+3.0
+13
+0.259
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+3.0
+30
+3.0
+11
+0.259
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+3.0
+30
+3.0
+11
+0.497732043121052
+21
+3.0
+31
+3.0
+12
+0.518
+22
+3.0
+32
+3.0
+13
+0.518
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+1.17375
+11
+0.723
+21
+3.0
+31
+0.982
+12
+0.53125
+22
+3.0
+32
+0.982
+13
+0.53125
+23
+3.0
+33
+0.982
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+0.205
+32
+0.205
+13
+0.0
+23
+0.205
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+0.205
+11
+0.0
+21
+1.5
+31
+1.5
+12
+0.0
+22
+1.5
+32
+0.723
+13
+0.0
+23
+1.5
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+1.5
+30
+0.205
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.776999999999999
+21
+1.5
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+0.205
+11
+0.776999999999999
+21
+1.5
+31
+0.205
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.776999999999999
+21
+1.5
+31
+0.205
+12
+0.776999999999999
+22
+3.0
+32
+0.205
+13
+0.776999999999999
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+1.5
+30
+2.018
+11
+0.53125
+21
+3.0
+31
+2.018
+12
+0.53125
+22
+1.5
+32
+2.018
+13
+0.53125
+23
+1.5
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+2.018
+11
+0.796875
+21
+1.5
+31
+2.018
+12
+0.723000000000001
+22
+3.0
+32
+2.018
+13
+0.723000000000001
+23
+3.0
+33
+2.018
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.723000000000001
+20
+3.0
+30
+2.018
+11
+0.796875
+21
+1.5
+31
+2.018
+12
+0.796875
+22
+3.0
+32
+2.018
+13
+0.796875
+23
+3.0
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.50226795687895
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.795
+32
+2.22044604925031e-16
+13
+0.0
+23
+2.795
+33
+2.22044604925031e-16
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.64381364161549
+30
+3.0
+11
+0.0
+21
+2.12132034355964
+31
+3.0
+12
+0.0
+22
+1.79836855106949
+32
+3.0
+13
+0.0
+23
+1.79836855106949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.12132034355964
+30
+3.0
+11
+0.777
+21
+1.64381364161549
+31
+3.0
+12
+0.777
+22
+1.79947640559575
+32
+3.0
+13
+0.777
+23
+1.79947640559575
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+1.79947640559575
+30
+4.44089209850063e-17
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.776999999999999
+21
+1.79947640559575
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+1.5
+32
+8.88178419700126e-17
+13
+0.776999999999999
+23
+1.5
+33
+8.88178419700126e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.0
+31
+2.22044604925031e-16
+12
+0.0
+22
+0.0
+32
+0.205
+13
+0.0
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+2.22044604925031e-16
+11
+0.776999999999999
+21
+3.0
+31
+8.88178419700126e-17
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+3.0
+30
+8.88178419700126e-17
+11
+0.205
+21
+3.0
+31
+2.22044604925031e-16
+12
+0.776999999999999
+22
+3.0
+32
+0.205
+13
+0.776999999999999
+23
+3.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+3.0
+30
+0.205
+11
+0.205
+21
+3.0
+31
+2.22044604925031e-16
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+2.22044604925031e-16
+11
+0.0
+21
+2.795
+31
+2.22044604925031e-16
+12
+0.0
+22
+2.795
+32
+0.205
+13
+0.0
+23
+2.795
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+2.22044604925031e-16
+11
+0.776999999999999
+21
+2.223
+31
+4.44089209850063e-17
+12
+0.0
+22
+3.0
+32
+2.22044604925031e-16
+13
+0.0
+23
+3.0
+33
+2.22044604925031e-16
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+2.223
+30
+4.44089209850063e-17
+11
+0.205
+21
+3.0
+31
+2.22044604925031e-16
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+2.223
+30
+4.44089209850063e-17
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+0.776999999999999
+22
+2.58204596640715
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+2.58204596640715
+33
+4.44089209850063e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+1.82625
+11
+0.53125
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.5
+30
+3.0
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.777
+21
+1.5
+31
+3.0
+12
+0.777
+22
+1.64381364161549
+32
+3.0
+13
+0.777
+23
+1.64381364161549
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.723000000000001
+20
+3.0
+30
+2.018
+11
+0.53125
+21
+3.0
+31
+1.82625
+12
+0.53125
+22
+3.0
+32
+2.018
+13
+0.53125
+23
+3.0
+33
+2.018
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+1.17375
+11
+0.796875
+21
+3.0
+31
+0.982
+12
+0.723
+22
+3.0
+32
+0.982
+13
+0.723
+23
+3.0
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+3.0
+30
+0.982
+11
+0.53125
+21
+3.0
+31
+1.17375
+12
+0.796875
+22
+3.0
+32
+1.241
+13
+0.796875
+23
+3.0
+33
+1.241
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+3.0
+30
+1.241
+11
+0.53125
+21
+3.0
+31
+1.17375
+12
+0.53125
+22
+3.0
+32
+1.5
+13
+0.53125
+23
+3.0
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+3.0
+30
+1.241
+11
+0.53125
+21
+3.0
+31
+1.5
+12
+0.796875
+22
+3.0
+32
+1.5
+13
+0.796875
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+3.0
+30
+8.88178419700126e-17
+11
+0.776999999999999
+21
+2.58204596640715
+31
+4.44089209850063e-17
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.0
+21
+0.205
+31
+2.795
+12
+0.0
+22
+0.205
+32
+3.0
+13
+0.0
+23
+0.205
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+1.5
+31
+3.0
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+0.723
+11
+0.0
+21
+2.795
+31
+0.723
+12
+0.0
+22
+3.0
+32
+0.723
+13
+0.0
+23
+3.0
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+0.723
+11
+0.205
+21
+3.0
+31
+0.723
+12
+0.0
+22
+2.277
+32
+0.723
+13
+0.0
+23
+2.277
+33
+0.723
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.277
+30
+0.723
+11
+0.205
+21
+3.0
+31
+0.723
+12
+0.0
+22
+1.5
+32
+0.723
+13
+0.0
+23
+1.5
+33
+0.723
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+0.723
+11
+0.205
+21
+3.0
+31
+0.723
+12
+0.53125
+22
+1.5
+32
+0.723
+13
+0.53125
+23
+1.5
+33
+0.723
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+1.5
+30
+0.723
+11
+0.205
+21
+3.0
+31
+0.723
+12
+0.53125
+22
+3.0
+32
+0.723
+13
+0.53125
+23
+3.0
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.277
+30
+0.723
+11
+0.0
+21
+1.5
+31
+0.723
+12
+0.0
+22
+1.5
+32
+1.5
+13
+0.0
+23
+1.5
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+2.795
+32
+3.0
+13
+0.0
+23
+2.795
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+2.277
+11
+0.53125
+21
+3.0
+31
+1.82625
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+1.82625
+11
+0.205
+21
+3.0
+31
+2.277
+12
+0.53125
+22
+3.0
+32
+2.018
+13
+0.53125
+23
+3.0
+33
+2.018
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+2.018
+11
+0.205
+21
+3.0
+31
+2.277
+12
+0.53125
+22
+3.0
+32
+2.277
+13
+0.53125
+23
+3.0
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.0625
+20
+3.0
+30
+1.241
+11
+1.0625
+21
+1.5
+31
+1.759
+12
+1.0625
+22
+1.5
+32
+1.241
+13
+1.0625
+23
+1.5
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.0625
+20
+1.5
+30
+1.759
+11
+1.0625
+21
+3.0
+31
+1.241
+12
+1.0625
+22
+3.0
+32
+1.759
+13
+1.0625
+23
+3.0
+33
+1.759
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.0625
+20
+3.0
+30
+1.759
+11
+1.0625
+21
+3.0
+31
+1.241
+12
+1.0625
+22
+3.0
+32
+1.5
+13
+1.0625
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+2.277
+11
+0.205
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.277
+12
+0.205
+22
+3.0
+32
+2.277
+13
+0.205
+23
+3.0
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+1.79947640559575
+30
+4.44089209850063e-17
+11
+0.776999999999999
+21
+1.5
+31
+0.205
+12
+0.776999999999999
+22
+1.5
+32
+8.88178419700126e-17
+13
+0.776999999999999
+23
+1.5
+33
+8.88178419700126e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+1.5
+30
+0.205
+11
+0.776999999999999
+21
+1.79947640559575
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+3.0
+32
+0.205
+13
+0.776999999999999
+23
+3.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+3.0
+30
+0.205
+11
+0.776999999999999
+21
+1.79947640559575
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+1.98309315521565
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+1.98309315521565
+33
+4.44089209850063e-17
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+3.0
+30
+0.205
+11
+0.776999999999999
+21
+1.98309315521565
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+2.223
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+2.223
+33
+4.44089209850063e-17
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+3.0
+30
+0.205
+11
+0.776999999999999
+21
+2.223
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+2.58204596640715
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+2.58204596640715
+33
+4.44089209850063e-17
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+3.0
+30
+0.205
+11
+0.776999999999999
+21
+2.58204596640715
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+3.0
+32
+8.88178419700126e-17
+13
+0.776999999999999
+23
+3.0
+33
+8.88178419700126e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+2.223
+30
+4.44089209850063e-17
+11
+0.0
+21
+2.795
+31
+2.22044604925031e-16
+12
+0.0
+22
+3.0
+32
+2.22044604925031e-16
+13
+0.0
+23
+3.0
+33
+2.22044604925031e-16
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+2.22044604925031e-16
+11
+0.776999999999999
+21
+2.223
+31
+4.44089209850063e-17
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.50226795687895
+30
+0.0
+11
+0.776999999999999
+21
+2.223
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+1.98309315521565
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+1.98309315521565
+33
+4.44089209850063e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+0.205
+11
+0.205
+21
+3.0
+31
+2.22044604925031e-16
+12
+0.0
+22
+3.0
+32
+2.22044604925031e-16
+13
+0.0
+23
+3.0
+33
+2.22044604925031e-16
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+2.22044604925031e-16
+11
+0.0
+21
+3.0
+31
+0.205
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+2.223
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.777
+21
+2.223
+31
+3.0
+12
+0.259
+22
+3.0
+32
+3.0
+13
+0.259
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.259
+20
+3.0
+30
+3.0
+11
+0.777
+21
+2.223
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.497732043121052
+20
+3.0
+30
+3.0
+11
+0.777
+21
+2.223
+31
+3.0
+12
+0.777
+22
+2.58204596640715
+32
+3.0
+13
+0.777
+23
+2.58204596640715
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+0.205
+31
+1.5
+12
+0.0
+22
+0.205
+32
+2.795
+13
+0.0
+23
+0.205
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+3.0
+30
+1.5
+11
+0.53125
+21
+3.0
+31
+1.17375
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.277
+30
+2.277
+11
+0.0
+21
+2.795
+31
+1.5
+12
+0.0
+22
+1.5
+32
+1.5
+13
+0.0
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+1.5
+11
+0.0
+21
+2.277
+31
+2.277
+12
+0.0
+22
+2.795
+32
+2.277
+13
+0.0
+23
+2.795
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.205
+31
+2.22044604925031e-16
+12
+0.0
+22
+0.0
+32
+2.22044604925031e-16
+13
+0.0
+23
+0.0
+33
+2.22044604925031e-16
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.0625
+20
+3.0
+30
+1.241
+11
+0.796875
+21
+1.5
+31
+1.241
+12
+0.796875
+22
+3.0
+32
+1.241
+13
+0.796875
+23
+3.0
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+1.5
+30
+1.241
+11
+1.0625
+21
+3.0
+31
+1.241
+12
+1.0625
+22
+1.5
+32
+1.241
+13
+1.0625
+23
+1.5
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+2.58204596640715
+30
+3.0
+11
+0.518
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.518
+20
+3.0
+30
+3.0
+11
+0.777
+21
+2.58204596640715
+31
+3.0
+12
+0.777
+22
+3.0
+32
+3.0
+13
+0.777
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+2.795
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+3.0
+30
+1.759
+11
+1.0625
+21
+3.0
+31
+1.5
+12
+0.796875
+22
+3.0
+32
+1.5
+13
+0.796875
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.0625
+20
+3.0
+30
+1.5
+11
+0.796875
+21
+3.0
+31
+1.759
+12
+1.0625
+22
+3.0
+32
+1.759
+13
+1.0625
+23
+3.0
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+1.5
+30
+2.018
+11
+1.0625
+21
+1.5
+31
+1.759
+12
+0.796875
+22
+1.5
+32
+1.759
+13
+0.796875
+23
+1.5
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+1.5
+30
+2.277
+11
+0.796875
+21
+1.5
+31
+2.018
+12
+0.53125
+22
+1.5
+32
+2.018
+13
+0.53125
+23
+1.5
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.53125
+21
+1.5
+31
+2.277
+12
+0.0
+22
+1.5
+32
+2.277
+13
+0.0
+23
+1.5
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+1.5
+30
+0.205
+11
+1.295
+21
+1.5
+31
+1.52655665885959e-16
+12
+0.776999999999999
+22
+1.5
+32
+8.88178419700126e-17
+13
+0.776999999999999
+23
+1.5
+33
+8.88178419700126e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+1.5
+30
+1.52655665885959e-16
+11
+0.776999999999999
+21
+1.5
+31
+0.205
+12
+1.0625
+22
+1.5
+32
+1.241
+13
+1.0625
+23
+1.5
+33
+1.241
+70
+15
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+1.5
+30
+1.52655665885959e-16
+11
+1.0625
+21
+1.5
+31
+1.241
+12
+1.295
+22
+1.5
+32
+3.0
+13
+1.295
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.0625
+20
+1.5
+30
+1.241
+11
+0.776999999999999
+21
+1.5
+31
+0.205
+12
+0.796875
+22
+1.5
+32
+0.982
+13
+0.796875
+23
+1.5
+33
+0.982
+70
+15
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+1.5
+30
+0.982
+11
+0.776999999999999
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+1.5
+30
+0.982
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.53125
+22
+1.5
+32
+0.723
+13
+0.53125
+23
+1.5
+33
+0.723
+70
+15
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.53125
+20
+1.5
+30
+0.723
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.723
+13
+0.0
+23
+1.5
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.796875
+20
+1.5
+30
+0.982
+11
+0.53125
+21
+1.5
+31
+0.723
+12
+0.53125
+22
+1.5
+32
+0.982
+13
+0.53125
+23
+1.5
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.0625
+20
+1.5
+30
+1.241
+11
+0.796875
+21
+1.5
+31
+0.982
+12
+0.796875
+22
+1.5
+32
+1.241
+13
+0.796875
+23
+1.5
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+1.5
+30
+3.0
+11
+1.0625
+21
+1.5
+31
+1.241
+12
+1.0625
+22
+1.5
+32
+1.759
+13
+1.0625
+23
+1.5
+33
+1.759
+70
+13
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+1.5
+30
+3.0
+11
+1.0625
+21
+1.5
+31
+1.759
+12
+0.796875
+22
+1.5
+32
+2.018
+13
+0.796875
+23
+1.5
+33
+2.018
+70
+15
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+1.5
+30
+3.0
+11
+0.796875
+21
+1.5
+31
+2.018
+12
+0.53125
+22
+1.5
+32
+2.277
+13
+0.53125
+23
+1.5
+33
+2.277
+70
+15
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+1.5
+30
+3.0
+11
+0.53125
+21
+1.5
+31
+2.277
+12
+0.777
+22
+1.5
+32
+2.795
+13
+0.777
+23
+1.5
+33
+2.795
+70
+15
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.5
+30
+2.795
+11
+0.53125
+21
+1.5
+31
+2.277
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+1.5
+30
+3.0
+11
+0.777
+21
+1.5
+31
+2.795
+12
+0.777
+22
+1.5
+32
+3.0
+13
+0.777
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.795
+30
+1.5
+11
+0.0
+21
+2.277
+31
+0.723
+12
+0.0
+22
+1.5
+32
+1.5
+13
+0.0
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.277
+30
+0.723
+11
+0.0
+21
+2.795
+31
+1.5
+12
+0.0
+22
+2.795
+32
+0.723
+13
+0.0
+23
+2.795
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+2.277
+30
+2.277
+11
+0.0
+21
+1.5
+31
+1.5
+12
+0.0
+22
+1.5
+32
+2.277
+13
+0.0
+23
+1.5
+33
+2.277
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+0.205
+31
+0.205
+12
+0.0
+22
+0.205
+32
+1.5
+13
+0.0
+23
+0.205
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+0.0
+30
+3.0
+11
+0.0
+21
+0.205
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.205
+30
+3.0
+11
+1.295
+21
+0.0
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+3.0
+11
+1.295
+21
+0.0
+31
+3.0
+12
+0.777
+22
+1.5
+32
+3.0
+13
+0.777
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.5
+30
+3.0
+11
+1.295
+21
+0.0
+31
+3.0
+12
+1.295
+22
+1.5
+32
+3.0
+13
+1.295
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.777
+21
+1.5
+31
+2.795
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.777
+20
+1.5
+30
+2.795
+11
+0.0
+21
+1.5
+31
+3.0
+12
+0.777
+22
+1.5
+32
+3.0
+13
+0.777
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+1.5
+30
+8.88178419700126e-17
+11
+0.0
+21
+0.205
+31
+2.22044604925031e-16
+12
+0.0
+22
+1.5
+32
+0.0
+13
+0.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.205
+30
+2.22044604925031e-16
+11
+0.776999999999999
+21
+1.5
+31
+8.88178419700126e-17
+12
+0.0
+22
+0.0
+32
+2.22044604925031e-16
+13
+0.0
+23
+0.0
+33
+2.22044604925031e-16
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+0.0
+30
+2.22044604925031e-16
+11
+0.776999999999999
+21
+1.5
+31
+8.88178419700126e-17
+12
+1.295
+22
+0.0
+32
+2.22044604925031e-16
+13
+1.295
+23
+0.0
+33
+2.22044604925031e-16
+70
+3
+ 0
+3DFACE
+ 8
+taser_a
+10
+1.295
+20
+0.0
+30
+2.22044604925031e-16
+11
+0.776999999999999
+21
+1.5
+31
+8.88178419700126e-17
+12
+1.295
+22
+1.5
+32
+1.52655665885959e-16
+13
+1.295
+23
+1.5
+33
+1.52655665885959e-16
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.0
+20
+1.5
+30
+0.205
+11
+0.776999999999999
+21
+1.5
+31
+8.88178419700126e-17
+12
+0.0
+22
+1.5
+32
+0.0
+13
+0.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_a
+10
+0.776999999999999
+20
+1.5
+30
+8.88178419700126e-17
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.776999999999999
+22
+1.5
+32
+0.205
+13
+0.776999999999999
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.868083094650066
+20
+1.9222333770949
+30
+3.0
+11
+0.777
+21
+2.223
+31
+3.0
+12
+0.777
+22
+1.98309315521565
+32
+3.0
+13
+0.777
+23
+1.98309315521565
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+2.223
+30
+3.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+3.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+3.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+2.223
+30
+3.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.01786110403563
+20
+2.08748794455568
+30
+0.0
+11
+1.295
+21
+1.705
+31
+6.58963624407723e-17
+12
+0.962598846298224
+22
+2.03740115370178
+32
+0.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.705
+30
+6.58963624407723e-17
+11
+1.01786110403563
+21
+2.08748794455568
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.705
+30
+6.58963624407723e-17
+11
+1.0777666229051
+21
+2.13191690534993
+31
+0.0
+12
+1.295
+22
+1.80680418134643
+32
+6.07160340763011e-17
+13
+1.295
+23
+1.80680418134643
+33
+6.07160340763011e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+3.0
+30
+0.205
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.464
+13
+0.0
+23
+3.0
+33
+0.464
+70
+2
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+3.0
+30
+0.723
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.723
+13
+0.0
+23
+1.5
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+1.5
+30
+0.205
+11
+0.0
+21
+3.0
+31
+0.723
+12
+0.0
+22
+3.0
+32
+0.464
+13
+0.0
+23
+3.0
+33
+0.464
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+3.0
+30
+0.982
+11
+0.53125
+21
+1.5
+31
+0.723
+12
+0.53125
+22
+1.5
+32
+0.982
+13
+0.53125
+23
+1.5
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+1.5
+30
+0.723
+11
+0.53125
+21
+3.0
+31
+0.982
+12
+0.53125
+22
+3.0
+32
+0.723
+13
+0.53125
+23
+3.0
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0625
+20
+1.5
+30
+1.241
+11
+0.796875
+21
+3.0
+31
+1.241
+12
+0.796875
+22
+1.5
+32
+1.241
+13
+0.796875
+23
+1.5
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+3.0
+30
+1.241
+11
+1.0625
+21
+1.5
+31
+1.241
+12
+1.0625
+22
+3.0
+32
+1.241
+13
+1.0625
+23
+3.0
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0625
+20
+3.0
+30
+1.759
+11
+0.796875
+21
+1.5
+31
+1.759
+12
+0.796875
+22
+3.0
+32
+1.759
+13
+0.796875
+23
+3.0
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+1.5
+30
+1.759
+11
+1.0625
+21
+3.0
+31
+1.759
+12
+1.0625
+22
+1.5
+32
+1.759
+13
+1.0625
+23
+1.5
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+1.64381364161549
+30
+3.0
+11
+0.777
+21
+1.5
+31
+2.795
+12
+0.777
+22
+1.5
+32
+3.0
+13
+0.777
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+1.5
+30
+2.795
+11
+0.777
+21
+1.64381364161549
+31
+3.0
+12
+0.777
+22
+3.0
+32
+2.795
+13
+0.777
+23
+3.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+3.0
+30
+2.795
+11
+0.777
+21
+1.64381364161549
+31
+3.0
+12
+0.777
+22
+1.73256321554271
+32
+3.0
+13
+0.777
+23
+1.73256321554271
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+3.0
+30
+2.795
+11
+0.777
+21
+1.73256321554271
+31
+3.0
+12
+0.777
+22
+1.79947640559575
+32
+3.0
+13
+0.777
+23
+1.79947640559575
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+3.0
+30
+2.795
+11
+0.777
+21
+1.79947640559575
+31
+3.0
+12
+0.777
+22
+1.98309315521565
+32
+3.0
+13
+0.777
+23
+1.98309315521565
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+3.0
+30
+2.795
+11
+0.777
+21
+1.98309315521565
+31
+3.0
+12
+0.777
+22
+2.223
+32
+3.0
+13
+0.777
+23
+2.223
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+3.0
+30
+2.795
+11
+0.777
+21
+2.223
+31
+3.0
+12
+0.777
+22
+2.58204596640715
+32
+3.0
+13
+0.777
+23
+2.58204596640715
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+3.0
+30
+2.795
+11
+0.777
+21
+2.58204596640715
+31
+3.0
+12
+0.777
+22
+3.0
+32
+3.0
+13
+0.777
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+3.0
+30
+2.277
+11
+0.53125
+21
+1.5
+31
+2.018
+12
+0.53125
+22
+1.5
+32
+2.277
+13
+0.53125
+23
+1.5
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+1.5
+30
+2.018
+11
+0.53125
+21
+3.0
+31
+2.277
+12
+0.53125
+22
+3.0
+32
+2.018
+13
+0.53125
+23
+3.0
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+3.0
+30
+1.241
+11
+0.796875
+21
+1.5
+31
+0.982
+12
+0.796875
+22
+1.5
+32
+1.241
+13
+0.796875
+23
+1.5
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+1.5
+30
+0.982
+11
+0.796875
+21
+3.0
+31
+1.241
+12
+0.796875
+22
+3.0
+32
+0.982
+13
+0.796875
+23
+3.0
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0625
+20
+3.0
+30
+1.759
+11
+1.0625
+21
+1.5
+31
+1.5
+12
+1.0625
+22
+1.5
+32
+1.759
+13
+1.0625
+23
+1.5
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0625
+20
+1.5
+30
+1.5
+11
+1.0625
+21
+3.0
+31
+1.759
+12
+1.0625
+22
+1.5
+32
+1.241
+13
+1.0625
+23
+1.5
+33
+1.241
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0625
+20
+1.5
+30
+1.241
+11
+1.0625
+21
+3.0
+31
+1.759
+12
+1.0625
+22
+3.0
+32
+1.241
+13
+1.0625
+23
+3.0
+33
+1.241
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0625
+20
+3.0
+30
+1.241
+11
+1.0625
+21
+3.0
+31
+1.759
+12
+1.0625
+22
+3.0
+32
+1.5
+13
+1.0625
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+3.0
+30
+2.018
+11
+0.796875
+21
+1.5
+31
+1.759
+12
+0.796875
+22
+1.5
+32
+2.018
+13
+0.796875
+23
+1.5
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+1.5
+30
+1.759
+11
+0.796875
+21
+3.0
+31
+2.018
+12
+0.796875
+22
+3.0
+32
+1.759
+13
+0.796875
+23
+3.0
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.723000000000001
+20
+3.0
+30
+2.018
+11
+0.53125
+21
+1.5
+31
+2.018
+12
+0.53125
+22
+3.0
+32
+2.018
+13
+0.53125
+23
+3.0
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+1.5
+30
+2.018
+11
+0.723000000000001
+21
+3.0
+31
+2.018
+12
+0.796875
+22
+1.5
+32
+2.018
+13
+0.796875
+23
+1.5
+33
+2.018
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+1.5
+30
+2.018
+11
+0.723000000000001
+21
+3.0
+31
+2.018
+12
+0.796875
+22
+3.0
+32
+2.018
+13
+0.796875
+23
+3.0
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.0
+21
+1.5
+31
+2.277
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+1.5
+30
+2.277
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+2.277
+13
+0.0
+23
+3.0
+33
+2.277
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+3.0
+30
+2.277
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+2.536
+13
+0.0
+23
+3.0
+33
+2.536
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+1.5
+30
+0.982
+11
+0.53125
+21
+3.0
+31
+0.982
+12
+0.53125
+22
+1.5
+32
+0.982
+13
+0.53125
+23
+1.5
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+3.0
+30
+0.982
+11
+0.796875
+21
+1.5
+31
+0.982
+12
+0.723000000000001
+22
+3.0
+32
+0.982
+13
+0.723000000000001
+23
+3.0
+33
+0.982
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.723000000000001
+20
+3.0
+30
+0.982
+11
+0.796875
+21
+1.5
+31
+0.982
+12
+0.796875
+22
+3.0
+32
+0.982
+13
+0.796875
+23
+3.0
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.91251205544432
+20
+1.98213889596437
+30
+0.0
+11
+1.295
+21
+1.63697662077346
+31
+6.93577471913193e-17
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.63697662077346
+30
+6.93577471913193e-17
+11
+0.91251205544432
+21
+1.98213889596437
+31
+0.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+0.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.63697662077346
+30
+6.93577471913193e-17
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+1.295
+22
+1.705
+32
+6.58963624407723e-17
+13
+1.295
+23
+1.705
+33
+6.58963624407723e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.27938364528661
+20
+2.22727465515648
+30
+0.0
+11
+1.295
+21
+1.99491378028649
+31
+5.11440353810559e-17
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.99491378028649
+30
+5.11440353810559e-17
+11
+1.27938364528661
+21
+2.22727465515648
+31
+0.0
+12
+1.295
+22
+2.2311863483779
+32
+3.91212533101955e-17
+13
+1.295
+23
+2.2311863483779
+33
+3.91212533101955e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.14173848001224
+20
+2.17026016090475
+30
+0.0
+11
+1.295
+21
+1.80680418134643
+31
+6.07160340763011e-17
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.80680418134643
+30
+6.07160340763011e-17
+11
+1.14173848001224
+21
+2.17026016090475
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.80680418134643
+30
+6.07160340763011e-17
+11
+1.20916059140253
+21
+2.20214844470858
+31
+0.0
+12
+1.295
+22
+1.99491378028649
+32
+5.11440353810559e-17
+13
+1.295
+23
+1.99491378028649
+33
+5.11440353810559e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.82973983909525
+20
+1.85826151998776
+30
+0.0
+11
+1.295
+21
+1.58491378028649
+31
+7.20069763854704e-17
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.58491378028649
+30
+7.20069763854704e-17
+11
+0.82973983909525
+21
+1.85826151998776
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.58491378028649
+30
+7.20069763854704e-17
+11
+0.868083094650066
+21
+1.9222333770949
+31
+0.0
+12
+1.295
+22
+1.63697662077346
+32
+6.93577471913193e-17
+13
+1.295
+23
+1.63697662077346
+33
+6.93577471913193e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.54077703531283
+30
+7.42528844501344e-17
+11
+0.776999999999999
+21
+1.5
+31
+8.88178419700126e-17
+12
+0.776999999999999
+22
+1.64381364161549
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+1.64381364161549
+33
+4.44089209850063e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.5
+30
+8.88178419700126e-17
+11
+1.295
+21
+1.54077703531283
+31
+7.42528844501344e-17
+12
+1.295
+22
+1.5
+32
+1.52655665885959e-16
+13
+1.295
+23
+1.5
+33
+1.52655665885959e-16
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.797851555291422
+20
+1.79083940859747
+30
+0.0
+11
+0.776999999999999
+21
+1.64381364161549
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+1.73256321554271
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+1.73256321554271
+33
+4.44089209850063e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.64381364161549
+30
+4.44089209850063e-17
+11
+0.797851555291422
+21
+1.79083940859747
+31
+0.0
+12
+1.295
+22
+1.54077703531283
+32
+7.42528844501344e-17
+13
+1.295
+23
+1.54077703531283
+33
+7.42528844501344e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.54077703531283
+30
+7.42528844501344e-17
+11
+0.797851555291422
+21
+1.79083940859747
+31
+0.0
+12
+1.295
+22
+1.58491378028649
+32
+7.20069763854704e-17
+13
+1.295
+23
+1.58491378028649
+33
+7.20069763854704e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+2.5306045958858
+30
+2.38852893262874e-17
+11
+1.20163144893051
+21
+3.0
+31
+0.0
+12
+1.295
+22
+3.0
+32
+0.0
+13
+1.295
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.20163144893051
+20
+3.0
+30
+0.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+0.0
+12
+0.878679656440356
+22
+3.0
+32
+0.0
+13
+0.878679656440356
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.20916059140253
+20
+2.20214844470858
+30
+0.0
+11
+1.20163144893051
+21
+3.0
+31
+0.0
+12
+1.295
+22
+2.5306045958858
+32
+2.38852893262874e-17
+13
+1.295
+23
+2.5306045958858
+33
+2.38852893262874e-17
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.20916059140253
+20
+2.20214844470858
+30
+0.0
+11
+1.295
+21
+2.5306045958858
+31
+2.38852893262874e-17
+12
+1.27938364528661
+22
+2.22727465515648
+32
+0.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.27938364528661
+20
+2.22727465515648
+30
+0.0
+11
+1.295
+21
+2.5306045958858
+31
+2.38852893262874e-17
+12
+1.295
+22
+2.2311863483779
+32
+3.91212533101955e-17
+13
+1.295
+23
+2.2311863483779
+33
+3.91212533101955e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+3.0
+30
+8.88178419700126e-17
+11
+1.0777666229051
+21
+2.13191690534993
+31
+0.0
+12
+0.776999999999999
+22
+2.58204596640715
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+2.58204596640715
+33
+4.44089209850063e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0777666229051
+20
+2.13191690534993
+30
+0.0
+11
+0.776999999999999
+21
+3.0
+31
+8.88178419700126e-17
+12
+0.878679656440356
+22
+3.0
+32
+0.0
+13
+0.878679656440356
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0777666229051
+20
+2.13191690534993
+30
+0.0
+11
+0.878679656440356
+21
+3.0
+31
+0.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+0.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.14173848001224
+20
+2.17026016090475
+30
+0.0
+11
+0.878679656440356
+21
+3.0
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.868083094650066
+20
+1.9222333770949
+30
+0.0
+11
+0.776999999999999
+21
+1.79947640559575
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+1.98309315521565
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+1.98309315521565
+33
+4.44089209850063e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.79947640559575
+30
+4.44089209850063e-17
+11
+0.868083094650066
+21
+1.9222333770949
+31
+0.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+0.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.79947640559575
+30
+4.44089209850063e-17
+11
+0.82973983909525
+21
+1.85826151998776
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+0.776999999999999
+21
+1.98309315521565
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+2.223
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+2.223
+33
+4.44089209850063e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.98309315521565
+30
+4.44089209850063e-17
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+0.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.98309315521565
+30
+4.44089209850063e-17
+11
+0.91251205544432
+21
+1.98213889596437
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0777666229051
+20
+2.13191690534993
+30
+0.0
+11
+0.776999999999999
+21
+2.223
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+2.58204596640715
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+2.58204596640715
+33
+4.44089209850063e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+2.223
+30
+4.44089209850063e-17
+11
+1.0777666229051
+21
+2.13191690534993
+31
+0.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+0.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+2.223
+30
+4.44089209850063e-17
+11
+1.01786110403563
+21
+2.08748794455568
+31
+0.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+0.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.797851555291422
+20
+1.79083940859747
+30
+0.0
+11
+0.776999999999999
+21
+1.73256321554271
+31
+4.44089209850063e-17
+12
+0.776999999999999
+22
+1.79947640559575
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+1.79947640559575
+33
+4.44089209850063e-17
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.962598846298224
+20
+2.03740115370178
+30
+3.0
+11
+0.777
+21
+2.58204596640715
+31
+3.0
+12
+0.777
+22
+2.223
+32
+3.0
+13
+0.777
+23
+2.223
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+2.58204596640715
+30
+3.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+3.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+3.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+2.58204596640715
+30
+3.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.797851555291422
+20
+1.79083940859747
+30
+3.0
+11
+0.777
+21
+1.98309315521565
+31
+3.0
+12
+0.777
+22
+1.79947640559575
+32
+3.0
+13
+0.777
+23
+1.79947640559575
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+1.98309315521565
+30
+3.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+3.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+3.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+1.98309315521565
+30
+3.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.5
+30
+3.0
+11
+0.777
+21
+1.64381364161549
+31
+3.0
+12
+0.777
+22
+1.5
+32
+3.0
+13
+0.777
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+1.64381364161549
+30
+3.0
+11
+1.295
+21
+1.5
+31
+3.0
+12
+1.295
+22
+1.54077703531283
+32
+3.0
+13
+1.295
+23
+1.54077703531283
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0777666229051
+20
+2.13191690534993
+30
+3.0
+11
+0.777
+21
+3.0
+31
+3.0
+12
+0.777
+22
+2.58204596640715
+32
+3.0
+13
+0.777
+23
+2.58204596640715
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+3.0
+30
+3.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+3.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+3.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+3.0
+30
+3.0
+11
+1.20163144893051
+21
+3.0
+31
+3.0
+12
+1.295
+22
+2.5306045958858
+32
+3.0
+13
+1.295
+23
+2.5306045958858
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.705
+30
+3.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.01786110403563
+20
+2.08748794455568
+30
+3.0
+11
+1.295
+21
+1.705
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0777666229051
+20
+2.13191690534993
+30
+3.0
+11
+1.295
+21
+1.705
+31
+3.0
+12
+1.295
+22
+1.80680418134643
+32
+3.0
+13
+1.295
+23
+1.80680418134643
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.63697662077346
+30
+3.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.91251205544432
+20
+1.98213889596437
+30
+3.0
+11
+1.295
+21
+1.63697662077346
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.962598846298224
+20
+2.03740115370178
+30
+3.0
+11
+1.295
+21
+1.63697662077346
+31
+3.0
+12
+1.295
+22
+1.705
+32
+3.0
+13
+1.295
+23
+1.705
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.80680418134643
+30
+3.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.14173848001224
+20
+2.17026016090475
+30
+3.0
+11
+1.295
+21
+1.80680418134643
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.20916059140253
+20
+2.20214844470858
+30
+3.0
+11
+1.295
+21
+1.80680418134643
+31
+3.0
+12
+1.295
+22
+1.99491378028649
+32
+3.0
+13
+1.295
+23
+1.99491378028649
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.58491378028648
+30
+3.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.82973983909525
+20
+1.85826151998776
+30
+3.0
+11
+1.295
+21
+1.58491378028648
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.868083094650066
+20
+1.9222333770949
+30
+3.0
+11
+1.295
+21
+1.58491378028648
+31
+3.0
+12
+1.295
+22
+1.63697662077346
+32
+3.0
+13
+1.295
+23
+1.63697662077346
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.20916059140253
+20
+2.20214844470858
+30
+3.0
+11
+1.036
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.036
+20
+3.0
+30
+3.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+3.0
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.20163144893051
+20
+3.0
+30
+3.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+3.0
+12
+1.295
+22
+2.5306045958858
+32
+3.0
+13
+1.295
+23
+2.5306045958858
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+2.5306045958858
+30
+3.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+3.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+3.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+2.5306045958858
+30
+3.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+3.0
+12
+1.295
+22
+2.2311863483779
+32
+3.0
+13
+1.295
+23
+2.2311863483779
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.99491378028649
+30
+3.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.27938364528661
+20
+2.22727465515648
+30
+3.0
+11
+1.295
+21
+1.99491378028649
+31
+3.0
+12
+1.295
+22
+2.2311863483779
+32
+3.0
+13
+1.295
+23
+2.2311863483779
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.54077703531283
+30
+3.0
+11
+0.777
+21
+1.73256321554271
+31
+3.0
+12
+0.777
+22
+1.64381364161549
+32
+3.0
+13
+0.777
+23
+1.64381364161549
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+1.73256321554271
+30
+3.0
+11
+1.295
+21
+1.54077703531283
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.797851555291422
+20
+1.79083940859747
+30
+3.0
+11
+1.295
+21
+1.54077703531283
+31
+3.0
+12
+1.295
+22
+1.58491378028648
+32
+3.0
+13
+1.295
+23
+1.58491378028648
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.797851555291422
+20
+1.79083940859747
+30
+3.0
+11
+0.777
+21
+1.79947640559575
+31
+3.0
+12
+0.777
+22
+1.73256321554271
+32
+3.0
+13
+0.777
+23
+1.73256321554271
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+1.5
+30
+2.795
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.777
+21
+1.5
+31
+2.795
+12
+0.205000000000001
+22
+3.0
+32
+2.795
+13
+0.205000000000001
+23
+3.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.205000000000001
+20
+3.0
+30
+2.795
+11
+0.777
+21
+1.5
+31
+2.795
+12
+0.777
+22
+3.0
+32
+2.795
+13
+0.777
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.205000000000001
+20
+3.0
+30
+2.277
+11
+0.0
+21
+1.5
+31
+2.277
+12
+0.0
+22
+3.0
+32
+2.277
+13
+0.0
+23
+3.0
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+1.5
+30
+2.277
+11
+0.205000000000001
+21
+3.0
+31
+2.277
+12
+0.53125
+22
+1.5
+32
+2.277
+13
+0.53125
+23
+1.5
+33
+2.277
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+1.5
+30
+2.277
+11
+0.205000000000001
+21
+3.0
+31
+2.277
+12
+0.53125
+22
+3.0
+32
+2.277
+13
+0.53125
+23
+3.0
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+1.5
+30
+0.723
+11
+0.0
+21
+3.0
+31
+0.723
+12
+0.0
+22
+1.5
+32
+0.723
+13
+0.0
+23
+1.5
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+3.0
+30
+0.723
+11
+0.53125
+21
+1.5
+31
+0.723
+12
+0.205
+22
+3.0
+32
+0.723
+13
+0.205
+23
+3.0
+33
+0.723
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.205
+20
+3.0
+30
+0.723
+11
+0.53125
+21
+1.5
+31
+0.723
+12
+0.53125
+22
+3.0
+32
+0.723
+13
+0.53125
+23
+3.0
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+3.0
+30
+0.205
+11
+0.776999999999999
+21
+1.5
+31
+8.88178419700126e-17
+12
+0.776999999999999
+22
+1.5
+32
+0.205
+13
+0.776999999999999
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.5
+30
+8.88178419700126e-17
+11
+0.776999999999999
+21
+3.0
+31
+0.205
+12
+0.776999999999999
+22
+1.64381364161549
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+1.64381364161549
+33
+4.44089209850063e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.64381364161549
+30
+4.44089209850063e-17
+11
+0.776999999999999
+21
+3.0
+31
+0.205
+12
+0.776999999999999
+22
+1.73256321554271
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+1.73256321554271
+33
+4.44089209850063e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.73256321554271
+30
+4.44089209850063e-17
+11
+0.776999999999999
+21
+3.0
+31
+0.205
+12
+0.776999999999999
+22
+1.79947640559575
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+1.79947640559575
+33
+4.44089209850063e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.79947640559575
+30
+4.44089209850063e-17
+11
+0.776999999999999
+21
+3.0
+31
+0.205
+12
+0.776999999999999
+22
+1.98309315521565
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+1.98309315521565
+33
+4.44089209850063e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.98309315521565
+30
+4.44089209850063e-17
+11
+0.776999999999999
+21
+3.0
+31
+0.205
+12
+0.776999999999999
+22
+2.223
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+2.223
+33
+4.44089209850063e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+2.223
+30
+4.44089209850063e-17
+11
+0.776999999999999
+21
+3.0
+31
+0.205
+12
+0.776999999999999
+22
+2.58204596640715
+32
+4.44089209850063e-17
+13
+0.776999999999999
+23
+2.58204596640715
+33
+4.44089209850063e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+2.58204596640715
+30
+4.44089209850063e-17
+11
+0.776999999999999
+21
+3.0
+31
+0.205
+12
+0.776999999999999
+22
+3.0
+32
+8.88178419700126e-17
+13
+0.776999999999999
+23
+3.0
+33
+8.88178419700126e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.205000000000001
+20
+3.0
+30
+0.205000000000001
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+1.5
+30
+0.205
+11
+0.205000000000001
+21
+3.0
+31
+0.205000000000001
+12
+0.776999999999999
+22
+1.5
+32
+0.205
+13
+0.776999999999999
+23
+1.5
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.5
+30
+0.205
+11
+0.205000000000001
+21
+3.0
+31
+0.205000000000001
+12
+0.776999999999999
+22
+3.0
+32
+0.205
+13
+0.776999999999999
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+0.205000000000001
+11
+1.295
+21
+2.5306045958858
+31
+2.38852893262874e-17
+12
+1.295
+22
+3.0
+32
+0.0
+13
+1.295
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+2.5306045958858
+30
+2.38852893262874e-17
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+1.295
+22
+2.2311863483779
+32
+3.91212533101955e-17
+13
+1.295
+23
+2.2311863483779
+33
+3.91212533101955e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+2.2311863483779
+30
+3.91212533101955e-17
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+1.295
+22
+1.99491378028649
+32
+5.11440353810559e-17
+13
+1.295
+23
+1.99491378028649
+33
+5.11440353810559e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.99491378028649
+30
+5.11440353810559e-17
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+1.295
+22
+1.80680418134643
+32
+6.07160340763011e-17
+13
+1.295
+23
+1.80680418134643
+33
+6.07160340763011e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.80680418134643
+30
+6.07160340763011e-17
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+1.295
+22
+1.705
+32
+6.58963624407723e-17
+13
+1.295
+23
+1.705
+33
+6.58963624407723e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.705
+30
+6.58963624407723e-17
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+1.295
+22
+1.63697662077346
+32
+6.93577471913193e-17
+13
+1.295
+23
+1.63697662077346
+33
+6.93577471913193e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.63697662077346
+30
+6.93577471913193e-17
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+1.295
+22
+1.58491378028649
+32
+7.20069763854704e-17
+13
+1.295
+23
+1.58491378028649
+33
+7.20069763854704e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.58491378028649
+30
+7.20069763854704e-17
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+1.295
+22
+1.54077703531283
+32
+7.42528844501344e-17
+13
+1.295
+23
+1.54077703531283
+33
+7.42528844501344e-17
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.54077703531283
+30
+7.42528844501344e-17
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+1.295
+22
+1.5
+32
+1.52655665885959e-16
+13
+1.295
+23
+1.5
+33
+1.52655665885959e-16
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.5
+30
+1.52655665885959e-16
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+2.1475
+22
+1.5
+32
+0.8525
+13
+2.1475
+23
+1.5
+33
+0.8525
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+1.5
+30
+0.8525
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+2.1475
+21
+1.5
+31
+1.28416666666667
+12
+2.1475
+22
+1.5
+32
+0.8525
+13
+2.1475
+23
+1.5
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+1.5
+30
+1.28416666666667
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+2.1475
+22
+3.0
+32
+1.28416666666667
+13
+2.1475
+23
+3.0
+33
+1.28416666666667
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+3.0
+30
+1.71583333333333
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.71583333333333
+22
+3.0
+32
+2.1475
+13
+1.71583333333333
+23
+3.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+2.1475
+21
+3.0
+31
+1.71583333333333
+12
+2.1475
+22
+1.5
+32
+1.71583333333333
+13
+2.1475
+23
+1.5
+33
+1.71583333333333
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+3.0
+30
+1.71583333333333
+11
+2.1475
+21
+1.5
+31
+2.1475
+12
+2.1475
+22
+1.5
+32
+1.71583333333333
+13
+2.1475
+23
+1.5
+33
+1.71583333333333
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+1.5
+30
+2.1475
+11
+2.1475
+21
+3.0
+31
+1.71583333333333
+12
+2.1475
+22
+3.0
+32
+2.1475
+13
+2.1475
+23
+3.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+1.295
+21
+1.5
+31
+3.0
+12
+2.1475
+22
+1.5
+32
+2.1475
+13
+2.1475
+23
+1.5
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.5
+30
+3.0
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.295
+22
+1.54077703531283
+32
+3.0
+13
+1.295
+23
+1.54077703531283
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.54077703531283
+30
+3.0
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.295
+22
+1.58491378028648
+32
+3.0
+13
+1.295
+23
+1.58491378028648
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.58491378028648
+30
+3.0
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.295
+22
+1.63697662077346
+32
+3.0
+13
+1.295
+23
+1.63697662077346
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.63697662077346
+30
+3.0
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.295
+22
+1.705
+32
+3.0
+13
+1.295
+23
+1.705
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.705
+30
+3.0
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.295
+22
+1.80680418134643
+32
+3.0
+13
+1.295
+23
+1.80680418134643
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.80680418134643
+30
+3.0
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.295
+22
+1.99491378028649
+32
+3.0
+13
+1.295
+23
+1.99491378028649
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.99491378028649
+30
+3.0
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.295
+22
+2.2311863483779
+32
+3.0
+13
+1.295
+23
+2.2311863483779
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+2.2311863483779
+30
+3.0
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.295
+22
+2.5306045958858
+32
+3.0
+13
+1.295
+23
+2.5306045958858
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+2.5306045958858
+30
+3.0
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.295
+22
+3.0
+32
+3.0
+13
+1.295
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+3.0
+30
+3.0
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.81219074811907
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+1.5
+30
+1.81219074811907
+11
+1.5
+21
+3.0
+31
+1.5
+12
+1.5
+22
+3.0
+32
+1.81219074811907
+13
+1.5
+23
+3.0
+33
+1.81219074811907
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.60791666666667
+20
+3.0
+30
+1.97984537405954
+11
+1.50885609734932
+21
+3.0
+31
+1.81237448605758
+12
+1.5
+22
+3.0
+32
+1.81219074811907
+13
+1.5
+23
+3.0
+33
+1.81219074811907
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.70501413192602
+20
+3.0
+30
+1.73585049440402
+11
+1.60791666666667
+21
+3.0
+31
+1.97984537405954
+12
+1.71583333333333
+22
+3.0
+32
+1.72547110140021
+13
+1.71583333333333
+23
+3.0
+33
+1.72547110140021
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.60791666666667
+20
+3.0
+30
+1.97984537405954
+11
+1.70501413192602
+21
+3.0
+31
+1.73585049440402
+12
+1.68090954183794
+22
+3.0
+32
+1.7548097087475
+13
+1.68090954183794
+23
+3.0
+33
+1.7548097087475
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.60791666666667
+20
+3.0
+30
+1.97984537405954
+11
+1.68090954183794
+21
+3.0
+31
+1.7548097087475
+12
+1.65506269396675
+22
+3.0
+32
+1.77131496630259
+13
+1.65506269396675
+23
+3.0
+33
+1.77131496630259
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.60791666666667
+20
+3.0
+30
+1.97984537405954
+11
+1.65506269396675
+21
+3.0
+31
+1.77131496630259
+12
+1.62772250758676
+22
+3.0
+32
+1.78520731241634
+13
+1.62772250758676
+23
+3.0
+33
+1.78520731241634
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.60791666666667
+20
+3.0
+30
+1.97984537405954
+11
+1.62772250758676
+21
+3.0
+31
+1.78520731241634
+12
+1.59915228363849
+22
+3.0
+32
+1.79635295620134
+13
+1.59915228363849
+23
+3.0
+33
+1.79635295620134
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.60791666666667
+20
+3.0
+30
+1.97984537405954
+11
+1.59915228363849
+21
+3.0
+31
+1.79635295620134
+12
+1.56962716899663
+22
+3.0
+32
+1.80464455901512
+13
+1.56962716899663
+23
+3.0
+33
+1.80464455901512
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.60791666666667
+20
+3.0
+30
+1.97984537405954
+11
+1.56962716899663
+21
+3.0
+31
+1.80464455901512
+12
+1.53943150665524
+22
+3.0
+32
+1.81000226818992
+13
+1.53943150665524
+23
+3.0
+33
+1.81000226818992
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.60791666666667
+20
+3.0
+30
+1.97984537405954
+11
+1.53943150665524
+21
+3.0
+31
+1.81000226818992
+12
+1.50885609734932
+22
+3.0
+32
+1.81237448605758
+13
+1.50885609734932
+23
+3.0
+33
+1.81237448605758
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+1.5
+30
+1.81219074811907
+11
+1.0625
+21
+1.5
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0625
+20
+1.5
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.81219074811907
+12
+1.0625
+22
+1.5
+32
+1.759
+13
+1.0625
+23
+1.5
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+1.5
+31
+2.277
+12
+0.53125
+22
+1.5
+32
+2.277
+13
+0.53125
+23
+1.5
+33
+2.277
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.53125
+21
+1.5
+31
+2.277
+12
+0.777
+22
+1.5
+32
+2.795
+13
+0.777
+23
+1.5
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+1.5
+30
+2.795
+11
+0.53125
+21
+1.5
+31
+2.018
+12
+0.796875
+22
+1.5
+32
+2.018
+13
+0.796875
+23
+1.5
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+1.5
+30
+2.018
+11
+0.777
+21
+1.5
+31
+2.795
+12
+0.53125
+22
+1.5
+32
+2.277
+13
+0.53125
+23
+1.5
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+2.1475
+21
+1.5
+31
+1.71583333333333
+12
+2.1475
+22
+1.5
+32
+2.1475
+13
+2.1475
+23
+1.5
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.5
+30
+3.0
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+2.1475
+22
+1.5
+32
+2.1475
+13
+2.1475
+23
+1.5
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+1.5
+30
+3.0
+11
+0.777
+21
+1.5
+31
+2.795
+12
+1.71583333333333
+22
+1.5
+32
+2.1475
+13
+1.71583333333333
+23
+1.5
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+1.5
+30
+2.795
+11
+1.295
+21
+1.5
+31
+3.0
+12
+0.777
+22
+1.5
+32
+3.0
+13
+0.777
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+0.796875
+21
+1.5
+31
+2.018
+12
+0.796875
+22
+1.5
+32
+1.759
+13
+0.796875
+23
+1.5
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+1.5
+30
+2.018
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+0.777
+22
+1.5
+32
+2.795
+13
+0.777
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+1.5
+30
+1.81219074811907
+11
+0.796875
+21
+1.5
+31
+1.759
+12
+1.0625
+22
+1.5
+32
+1.759
+13
+1.0625
+23
+1.5
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+1.5
+30
+1.759
+11
+1.5
+21
+1.5
+31
+1.81219074811907
+12
+1.71583333333333
+22
+1.5
+32
+2.1475
+13
+1.71583333333333
+23
+1.5
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+1.5
+30
+0.723
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.53125
+22
+1.5
+32
+0.723
+13
+0.53125
+23
+1.5
+33
+0.723
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+1.5
+30
+0.723
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.776999999999999
+22
+1.5
+32
+0.205
+13
+0.776999999999999
+23
+1.5
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+1.5
+30
+0.982
+11
+0.53125
+21
+1.5
+31
+0.723
+12
+0.776999999999999
+22
+1.5
+32
+0.205
+13
+0.776999999999999
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+1.5
+30
+0.723
+11
+0.796875
+21
+1.5
+31
+0.982
+12
+0.53125
+22
+1.5
+32
+0.982
+13
+0.53125
+23
+1.5
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+1.5
+30
+1.28416666666667
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+2.1475
+22
+1.5
+32
+0.8525
+13
+2.1475
+23
+1.5
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+0.8525
+11
+1.295
+21
+1.5
+31
+1.52655665885959e-16
+12
+2.1475
+22
+1.5
+32
+0.8525
+13
+2.1475
+23
+1.5
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+0.8525
+11
+0.776999999999999
+21
+1.5
+31
+8.88178419700126e-17
+12
+1.295
+22
+1.5
+32
+1.52655665885959e-16
+13
+1.295
+23
+1.5
+33
+1.52655665885959e-16
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+0.8525
+11
+0.776999999999999
+21
+1.5
+31
+0.205
+12
+0.776999999999999
+22
+1.5
+32
+8.88178419700126e-17
+13
+0.776999999999999
+23
+1.5
+33
+8.88178419700126e-17
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.5
+30
+0.205
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+0.796875
+22
+1.5
+32
+0.982
+13
+0.796875
+23
+1.5
+33
+0.982
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+1.5
+30
+0.982
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+0.796875
+22
+1.5
+32
+1.241
+13
+0.796875
+23
+1.5
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+1.5
+30
+1.18780925188093
+11
+0.796875
+21
+1.5
+31
+1.241
+12
+1.71583333333333
+22
+1.5
+32
+0.8525
+13
+1.71583333333333
+23
+1.5
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+1.5
+30
+1.241
+11
+1.5
+21
+1.5
+31
+1.18780925188093
+12
+1.0625
+22
+1.5
+32
+1.241
+13
+1.0625
+23
+1.5
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+3.0
+30
+1.72547110140021
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.71583333333333
+22
+1.5
+32
+1.72547110140021
+13
+1.71583333333333
+23
+1.5
+33
+1.72547110140021
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.71583333333333
+21
+3.0
+31
+1.72547110140021
+12
+1.71583333333333
+22
+3.0
+32
+2.1475
+13
+1.71583333333333
+23
+3.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.50885609734932
+20
+3.0
+30
+1.81237448605758
+11
+1.5
+21
+1.5
+31
+1.81219074811907
+12
+1.5
+22
+3.0
+32
+1.81219074811907
+13
+1.5
+23
+3.0
+33
+1.81219074811907
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+1.5
+30
+1.81219074811907
+11
+1.50885609734932
+21
+3.0
+31
+1.81237448605758
+12
+1.50885609734932
+22
+1.5
+32
+1.81237448605758
+13
+1.50885609734932
+23
+1.5
+33
+1.81237448605758
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+3.0
+30
+1.72547110140021
+11
+1.70501413192602
+21
+1.5
+31
+1.73585049440402
+12
+1.70501413192602
+22
+3.0
+32
+1.73585049440402
+13
+1.70501413192602
+23
+3.0
+33
+1.73585049440402
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.70501413192602
+20
+1.5
+30
+1.73585049440402
+11
+1.71583333333333
+21
+3.0
+31
+1.72547110140021
+12
+1.71583333333333
+22
+1.5
+32
+1.72547110140021
+13
+1.71583333333333
+23
+1.5
+33
+1.72547110140021
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.70501413192602
+20
+3.0
+30
+1.73585049440402
+11
+1.68090954183794
+21
+1.5
+31
+1.7548097087475
+12
+1.68090954183794
+22
+3.0
+32
+1.7548097087475
+13
+1.68090954183794
+23
+3.0
+33
+1.7548097087475
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.68090954183794
+20
+1.5
+30
+1.7548097087475
+11
+1.70501413192602
+21
+3.0
+31
+1.73585049440402
+12
+1.70501413192602
+22
+1.5
+32
+1.73585049440402
+13
+1.70501413192602
+23
+1.5
+33
+1.73585049440402
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.68090954183794
+20
+3.0
+30
+1.7548097087475
+11
+1.65506269396675
+21
+1.5
+31
+1.77131496630259
+12
+1.65506269396675
+22
+3.0
+32
+1.77131496630259
+13
+1.65506269396675
+23
+3.0
+33
+1.77131496630259
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.65506269396675
+20
+1.5
+30
+1.77131496630259
+11
+1.68090954183794
+21
+3.0
+31
+1.7548097087475
+12
+1.68090954183794
+22
+1.5
+32
+1.7548097087475
+13
+1.68090954183794
+23
+1.5
+33
+1.7548097087475
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.65506269396675
+20
+3.0
+30
+1.77131496630259
+11
+1.62772250758676
+21
+1.5
+31
+1.78520731241634
+12
+1.62772250758676
+22
+3.0
+32
+1.78520731241634
+13
+1.62772250758676
+23
+3.0
+33
+1.78520731241634
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.62772250758676
+20
+1.5
+30
+1.78520731241634
+11
+1.65506269396675
+21
+3.0
+31
+1.77131496630259
+12
+1.65506269396675
+22
+1.5
+32
+1.77131496630259
+13
+1.65506269396675
+23
+1.5
+33
+1.77131496630259
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.62772250758676
+20
+3.0
+30
+1.78520731241634
+11
+1.59915228363849
+21
+1.5
+31
+1.79635295620134
+12
+1.59915228363849
+22
+3.0
+32
+1.79635295620134
+13
+1.59915228363849
+23
+3.0
+33
+1.79635295620134
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.59915228363849
+20
+1.5
+30
+1.79635295620134
+11
+1.62772250758676
+21
+3.0
+31
+1.78520731241634
+12
+1.62772250758676
+22
+1.5
+32
+1.78520731241634
+13
+1.62772250758676
+23
+1.5
+33
+1.78520731241634
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.59915228363849
+20
+3.0
+30
+1.79635295620134
+11
+1.56962716899663
+21
+1.5
+31
+1.80464455901512
+12
+1.56962716899663
+22
+3.0
+32
+1.80464455901512
+13
+1.56962716899663
+23
+3.0
+33
+1.80464455901512
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.56962716899663
+20
+1.5
+30
+1.80464455901512
+11
+1.59915228363849
+21
+3.0
+31
+1.79635295620134
+12
+1.59915228363849
+22
+1.5
+32
+1.79635295620134
+13
+1.59915228363849
+23
+1.5
+33
+1.79635295620134
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.56962716899663
+20
+3.0
+30
+1.80464455901512
+11
+1.53943150665524
+21
+1.5
+31
+1.81000226818992
+12
+1.53943150665524
+22
+3.0
+32
+1.81000226818992
+13
+1.53943150665524
+23
+3.0
+33
+1.81000226818992
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.53943150665524
+20
+1.5
+30
+1.81000226818992
+11
+1.56962716899663
+21
+3.0
+31
+1.80464455901512
+12
+1.56962716899663
+22
+1.5
+32
+1.80464455901512
+13
+1.56962716899663
+23
+1.5
+33
+1.80464455901512
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.53943150665524
+20
+3.0
+30
+1.81000226818992
+11
+1.50885609734932
+21
+1.5
+31
+1.81237448605758
+12
+1.50885609734932
+22
+3.0
+32
+1.81237448605758
+13
+1.50885609734932
+23
+3.0
+33
+1.81237448605758
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.50885609734932
+20
+1.5
+30
+1.81237448605758
+11
+1.53943150665524
+21
+3.0
+31
+1.81000226818992
+12
+1.53943150665524
+22
+1.5
+32
+1.81000226818992
+13
+1.53943150665524
+23
+1.5
+33
+1.81000226818992
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.036
+20
+3.0
+30
+3.0
+11
+1.20163144893051
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+2
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.777
+20
+3.0
+30
+2.795
+11
+1.295
+21
+3.0
+31
+3.0
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+3.0
+30
+3.0
+11
+0.777
+21
+3.0
+31
+2.795
+12
+0.777
+22
+3.0
+32
+3.0
+13
+0.777
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+3.0
+30
+3.0
+11
+0.777
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+3.0
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+3.0
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+1.81219074811907
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.5
+22
+1.5
+32
+1.81219074811907
+13
+1.5
+23
+1.5
+33
+1.81219074811907
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.71583333333333
+22
+3.0
+32
+2.1475
+13
+1.71583333333333
+23
+3.0
+33
+2.1475
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+3.0
+30
+2.1475
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.60791666666667
+22
+3.0
+32
+1.97984537405954
+13
+1.60791666666667
+23
+3.0
+33
+1.97984537405954
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.60791666666667
+20
+3.0
+30
+1.02015462594046
+11
+1.69132242027198
+21
+3.0
+31
+1.25291300823137
+12
+1.71461991087043
+22
+3.0
+32
+1.27285567614847
+13
+1.71461991087043
+23
+3.0
+33
+1.27285567614847
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.69132242027198
+20
+3.0
+30
+1.25291300823137
+11
+1.60791666666667
+21
+3.0
+31
+1.02015462594046
+12
+1.66618239017884
+22
+3.0
+32
+1.23534992311649
+13
+1.66618239017884
+23
+3.0
+33
+1.23534992311649
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.66618239017884
+20
+3.0
+30
+1.23534992311649
+11
+1.60791666666667
+21
+3.0
+31
+1.02015462594046
+12
+1.63944193282374
+22
+3.0
+32
+1.22033556291445
+13
+1.63944193282374
+23
+3.0
+33
+1.22033556291445
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.63944193282374
+20
+3.0
+30
+1.22033556291445
+11
+1.60791666666667
+21
+3.0
+31
+1.02015462594046
+12
+1.61135857342883
+22
+3.0
+32
+1.20801452412167
+13
+1.61135857342883
+23
+3.0
+33
+1.20801452412167
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.61135857342883
+20
+3.0
+30
+1.20801452412167
+11
+1.60791666666667
+21
+3.0
+31
+1.02015462594046
+12
+1.58220277009702
+22
+3.0
+32
+1.1985054650771
+13
+1.58220277009702
+23
+3.0
+33
+1.1985054650771
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.58220277009702
+20
+3.0
+30
+1.1985054650771
+11
+1.60791666666667
+21
+3.0
+31
+1.02015462594046
+12
+1.55225530915257
+22
+3.0
+32
+1.19189996321751
+13
+1.55225530915257
+23
+3.0
+33
+1.19189996321751
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.55225530915257
+20
+3.0
+30
+1.19189996321751
+11
+1.60791666666667
+21
+3.0
+31
+1.02015462594046
+12
+1.52180460101532
+22
+3.0
+32
+1.18826163313676
+13
+1.52180460101532
+23
+3.0
+33
+1.18826163313676
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.52180460101532
+20
+3.0
+30
+1.18826163313676
+11
+1.60791666666667
+21
+3.0
+31
+1.02015462594046
+12
+1.5
+22
+3.0
+32
+1.18780925188093
+13
+1.5
+23
+3.0
+33
+1.18780925188093
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+3.0
+30
+0.8525
+11
+1.5
+21
+1.5
+31
+1.18780925188093
+12
+1.71583333333333
+22
+1.5
+32
+0.8525
+13
+1.71583333333333
+23
+1.5
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+1.5
+30
+1.18780925188093
+11
+1.71583333333333
+21
+3.0
+31
+0.8525
+12
+1.5
+22
+3.0
+32
+1.18780925188093
+13
+1.5
+23
+3.0
+33
+1.18780925188093
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+1.18780925188093
+11
+1.71583333333333
+21
+3.0
+31
+0.8525
+12
+1.60791666666667
+22
+3.0
+32
+1.02015462594046
+13
+1.60791666666667
+23
+3.0
+33
+1.02015462594046
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+3.0
+30
+0.8525
+11
+1.71583333333333
+21
+1.5
+31
+1.27412051524007
+12
+1.71583333333333
+22
+1.5
+32
+0.8525
+13
+1.71583333333333
+23
+1.5
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+1.27412051524007
+11
+1.71583333333333
+21
+3.0
+31
+0.8525
+12
+1.71583333333333
+22
+3.0
+32
+1.27412051524007
+13
+1.71583333333333
+23
+3.0
+33
+1.27412051524007
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.52180460101532
+20
+1.5
+30
+1.18826163313676
+11
+1.5
+21
+3.0
+31
+1.18780925188093
+12
+1.5
+22
+1.5
+32
+1.18780925188093
+13
+1.5
+23
+1.5
+33
+1.18780925188093
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+1.18780925188093
+11
+1.52180460101532
+21
+1.5
+31
+1.18826163313676
+12
+1.52180460101532
+22
+3.0
+32
+1.18826163313676
+13
+1.52180460101532
+23
+3.0
+33
+1.18826163313676
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.55225530915257
+20
+1.5
+30
+1.19189996321751
+11
+1.52180460101532
+21
+3.0
+31
+1.18826163313676
+12
+1.52180460101532
+22
+1.5
+32
+1.18826163313676
+13
+1.52180460101532
+23
+1.5
+33
+1.18826163313676
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.52180460101532
+20
+3.0
+30
+1.18826163313676
+11
+1.55225530915257
+21
+1.5
+31
+1.19189996321751
+12
+1.55225530915257
+22
+3.0
+32
+1.19189996321751
+13
+1.55225530915257
+23
+3.0
+33
+1.19189996321751
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.58220277009702
+20
+1.5
+30
+1.1985054650771
+11
+1.55225530915257
+21
+3.0
+31
+1.19189996321751
+12
+1.55225530915257
+22
+1.5
+32
+1.19189996321751
+13
+1.55225530915257
+23
+1.5
+33
+1.19189996321751
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.55225530915257
+20
+3.0
+30
+1.19189996321751
+11
+1.58220277009702
+21
+1.5
+31
+1.1985054650771
+12
+1.58220277009702
+22
+3.0
+32
+1.1985054650771
+13
+1.58220277009702
+23
+3.0
+33
+1.1985054650771
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.61135857342883
+20
+1.5
+30
+1.20801452412167
+11
+1.58220277009702
+21
+3.0
+31
+1.1985054650771
+12
+1.58220277009702
+22
+1.5
+32
+1.1985054650771
+13
+1.58220277009702
+23
+1.5
+33
+1.1985054650771
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.58220277009702
+20
+3.0
+30
+1.1985054650771
+11
+1.61135857342883
+21
+1.5
+31
+1.20801452412167
+12
+1.61135857342883
+22
+3.0
+32
+1.20801452412167
+13
+1.61135857342883
+23
+3.0
+33
+1.20801452412167
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.63944193282374
+20
+1.5
+30
+1.22033556291445
+11
+1.61135857342883
+21
+3.0
+31
+1.20801452412167
+12
+1.61135857342883
+22
+1.5
+32
+1.20801452412167
+13
+1.61135857342883
+23
+1.5
+33
+1.20801452412167
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.61135857342883
+20
+3.0
+30
+1.20801452412167
+11
+1.63944193282374
+21
+1.5
+31
+1.22033556291445
+12
+1.63944193282374
+22
+3.0
+32
+1.22033556291445
+13
+1.63944193282374
+23
+3.0
+33
+1.22033556291445
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.66618239017884
+20
+1.5
+30
+1.23534992311649
+11
+1.63944193282374
+21
+3.0
+31
+1.22033556291445
+12
+1.63944193282374
+22
+1.5
+32
+1.22033556291445
+13
+1.63944193282374
+23
+1.5
+33
+1.22033556291445
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.63944193282374
+20
+3.0
+30
+1.22033556291445
+11
+1.66618239017884
+21
+1.5
+31
+1.23534992311649
+12
+1.66618239017884
+22
+3.0
+32
+1.23534992311649
+13
+1.66618239017884
+23
+3.0
+33
+1.23534992311649
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.69132242027198
+20
+1.5
+30
+1.25291300823137
+11
+1.66618239017884
+21
+3.0
+31
+1.23534992311649
+12
+1.66618239017884
+22
+1.5
+32
+1.23534992311649
+13
+1.66618239017884
+23
+1.5
+33
+1.23534992311649
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.66618239017884
+20
+3.0
+30
+1.23534992311649
+11
+1.69132242027198
+21
+1.5
+31
+1.25291300823137
+12
+1.69132242027198
+22
+3.0
+32
+1.25291300823137
+13
+1.69132242027198
+23
+3.0
+33
+1.25291300823137
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71461991087043
+20
+1.5
+30
+1.27285567614847
+11
+1.69132242027198
+21
+3.0
+31
+1.25291300823137
+12
+1.69132242027198
+22
+1.5
+32
+1.25291300823137
+13
+1.69132242027198
+23
+1.5
+33
+1.25291300823137
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.69132242027198
+20
+3.0
+30
+1.25291300823137
+11
+1.71461991087043
+21
+1.5
+31
+1.27285567614847
+12
+1.71461991087043
+22
+3.0
+32
+1.27285567614847
+13
+1.71461991087043
+23
+3.0
+33
+1.27285567614847
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+3.0
+30
+1.27412051524007
+11
+1.71461991087043
+21
+1.5
+31
+1.27285567614847
+12
+1.71583333333333
+22
+1.5
+32
+1.27412051524007
+13
+1.71583333333333
+23
+1.5
+33
+1.27412051524007
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71461991087043
+20
+1.5
+30
+1.27285567614847
+11
+1.71583333333333
+21
+3.0
+31
+1.27412051524007
+12
+1.71461991087043
+22
+3.0
+32
+1.27285567614847
+13
+1.71461991087043
+23
+3.0
+33
+1.27285567614847
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.70501413192602
+21
+1.5
+31
+1.73585049440402
+12
+1.71583333333333
+22
+1.5
+32
+1.72547110140021
+13
+1.71583333333333
+23
+1.5
+33
+1.72547110140021
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.70501413192602
+20
+1.5
+30
+1.73585049440402
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.68090954183794
+22
+1.5
+32
+1.7548097087475
+13
+1.68090954183794
+23
+1.5
+33
+1.7548097087475
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.68090954183794
+20
+1.5
+30
+1.7548097087475
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.65506269396675
+22
+1.5
+32
+1.77131496630259
+13
+1.65506269396675
+23
+1.5
+33
+1.77131496630259
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.65506269396675
+20
+1.5
+30
+1.77131496630259
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.62772250758676
+22
+1.5
+32
+1.78520731241634
+13
+1.62772250758676
+23
+1.5
+33
+1.78520731241634
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.62772250758676
+20
+1.5
+30
+1.78520731241634
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.59915228363849
+22
+1.5
+32
+1.79635295620134
+13
+1.59915228363849
+23
+1.5
+33
+1.79635295620134
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.59915228363849
+20
+1.5
+30
+1.79635295620134
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.56962716899663
+22
+1.5
+32
+1.80464455901512
+13
+1.56962716899663
+23
+1.5
+33
+1.80464455901512
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.56962716899663
+20
+1.5
+30
+1.80464455901512
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.53943150665524
+22
+1.5
+32
+1.81000226818992
+13
+1.53943150665524
+23
+1.5
+33
+1.81000226818992
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.53943150665524
+20
+1.5
+30
+1.81000226818992
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.50885609734932
+22
+1.5
+32
+1.81237448605758
+13
+1.50885609734932
+23
+1.5
+33
+1.81237448605758
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+1.5
+21
+1.5
+31
+1.81219074811907
+12
+1.50885609734932
+22
+1.5
+32
+1.81237448605758
+13
+1.50885609734932
+23
+1.5
+33
+1.81237448605758
+70
+12
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+0.8525
+11
+1.52180460101532
+21
+1.5
+31
+1.18826163313676
+12
+1.5
+22
+1.5
+32
+1.18780925188093
+13
+1.5
+23
+1.5
+33
+1.18780925188093
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.52180460101532
+20
+1.5
+30
+1.18826163313676
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.55225530915257
+22
+1.5
+32
+1.19189996321751
+13
+1.55225530915257
+23
+1.5
+33
+1.19189996321751
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.55225530915257
+20
+1.5
+30
+1.19189996321751
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.58220277009702
+22
+1.5
+32
+1.1985054650771
+13
+1.58220277009702
+23
+1.5
+33
+1.1985054650771
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.58220277009702
+20
+1.5
+30
+1.1985054650771
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.61135857342883
+22
+1.5
+32
+1.20801452412167
+13
+1.61135857342883
+23
+1.5
+33
+1.20801452412167
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.61135857342883
+20
+1.5
+30
+1.20801452412167
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.63944193282374
+22
+1.5
+32
+1.22033556291445
+13
+1.63944193282374
+23
+1.5
+33
+1.22033556291445
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.63944193282374
+20
+1.5
+30
+1.22033556291445
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.66618239017884
+22
+1.5
+32
+1.23534992311649
+13
+1.66618239017884
+23
+1.5
+33
+1.23534992311649
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.66618239017884
+20
+1.5
+30
+1.23534992311649
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.69132242027198
+22
+1.5
+32
+1.25291300823137
+13
+1.69132242027198
+23
+1.5
+33
+1.25291300823137
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.69132242027198
+20
+1.5
+30
+1.25291300823137
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.71461991087043
+22
+1.5
+32
+1.27285567614847
+13
+1.71461991087043
+23
+1.5
+33
+1.27285567614847
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71461991087043
+20
+1.5
+30
+1.27285567614847
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+1.71583333333333
+22
+1.5
+32
+1.27412051524007
+13
+1.71583333333333
+23
+1.5
+33
+1.27412051524007
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+3.0
+30
+2.536
+11
+0.205000000000001
+21
+3.0
+31
+2.277
+12
+0.0
+22
+3.0
+32
+2.277
+13
+0.0
+23
+3.0
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.205000000000001
+20
+3.0
+30
+2.277
+11
+0.0
+21
+3.0
+31
+2.536
+12
+0.205000000000001
+22
+3.0
+32
+2.795
+13
+0.205000000000001
+23
+3.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.205000000000001
+20
+3.0
+30
+2.795
+11
+0.0
+21
+3.0
+31
+2.536
+12
+0.0
+22
+3.0
+32
+2.795
+13
+0.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.0
+20
+3.0
+30
+0.464
+11
+0.205000000000001
+21
+3.0
+31
+0.205000000000001
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.205000000000001
+20
+3.0
+30
+0.205000000000001
+11
+0.0
+21
+3.0
+31
+0.464
+12
+0.205
+22
+3.0
+32
+0.723
+13
+0.205
+23
+3.0
+33
+0.723
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.205
+20
+3.0
+30
+0.723
+11
+0.0
+21
+3.0
+31
+0.464
+12
+0.0
+22
+3.0
+32
+0.723
+13
+0.0
+23
+3.0
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+3.0
+30
+8.88178419700126e-17
+11
+1.20163144893051
+21
+3.0
+31
+0.0
+12
+0.878679656440356
+22
+3.0
+32
+0.0
+13
+0.878679656440356
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.20163144893051
+20
+3.0
+30
+0.0
+11
+0.776999999999999
+21
+3.0
+31
+8.88178419700126e-17
+12
+1.295
+22
+3.0
+32
+0.0
+13
+1.295
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.295
+20
+3.0
+30
+0.0
+11
+0.776999999999999
+21
+3.0
+31
+8.88178419700126e-17
+12
+1.5
+22
+3.0
+32
+0.205000000000001
+13
+1.5
+23
+3.0
+33
+0.205000000000001
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+0.205000000000001
+11
+0.776999999999999
+21
+3.0
+31
+8.88178419700126e-17
+12
+0.776999999999999
+22
+3.0
+32
+0.205
+13
+0.776999999999999
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+2.1475
+21
+3.0
+31
+1.71583333333333
+12
+1.71583333333333
+22
+3.0
+32
+2.1475
+13
+1.71583333333333
+23
+3.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.205000000000001
+20
+3.0
+30
+2.795
+11
+0.53125
+21
+3.0
+31
+2.277
+12
+0.205000000000001
+22
+3.0
+32
+2.277
+13
+0.205000000000001
+23
+3.0
+33
+2.277
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+3.0
+30
+2.277
+11
+0.205000000000001
+21
+3.0
+31
+2.795
+12
+0.777
+22
+3.0
+32
+2.795
+13
+0.777
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+3.0
+30
+0.723
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+0.776999999999999
+22
+3.0
+32
+0.205
+13
+0.776999999999999
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+0.205000000000001
+11
+0.53125
+21
+3.0
+31
+0.723
+12
+0.723000000000001
+22
+3.0
+32
+0.982
+13
+0.723000000000001
+23
+3.0
+33
+0.982
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.723000000000001
+20
+3.0
+30
+0.982
+11
+0.53125
+21
+3.0
+31
+0.723
+12
+0.53125
+22
+3.0
+32
+0.982
+13
+0.53125
+23
+3.0
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0625
+20
+3.0
+30
+1.241
+11
+1.5
+21
+3.0
+31
+1.5
+12
+1.5
+22
+3.0
+32
+1.18780925188093
+13
+1.5
+23
+3.0
+33
+1.18780925188093
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+1.5
+11
+1.0625
+21
+3.0
+31
+1.241
+12
+1.0625
+22
+3.0
+32
+1.5
+13
+1.0625
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+1.18780925188093
+11
+1.71583333333333
+21
+3.0
+31
+0.8525
+12
+1.5
+22
+3.0
+32
+0.205000000000001
+13
+1.5
+23
+3.0
+33
+0.205000000000001
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+3.0
+30
+0.8525
+11
+1.5
+21
+3.0
+31
+1.18780925188093
+12
+1.60791666666667
+22
+3.0
+32
+1.02015462594046
+13
+1.60791666666667
+23
+3.0
+33
+1.02015462594046
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0625
+20
+3.0
+30
+1.5
+11
+1.5
+21
+3.0
+31
+1.81219074811907
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+1.81219074811907
+11
+1.0625
+21
+3.0
+31
+1.5
+12
+1.0625
+22
+3.0
+32
+1.759
+13
+1.0625
+23
+3.0
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+0.205000000000001
+11
+0.796875
+21
+3.0
+31
+0.982
+12
+0.796875
+22
+3.0
+32
+1.241
+13
+0.796875
+23
+3.0
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+3.0
+30
+0.982
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+0.723000000000001
+22
+3.0
+32
+0.982
+13
+0.723000000000001
+23
+3.0
+33
+0.982
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+2.795
+11
+1.0625
+21
+3.0
+31
+1.759
+12
+0.796875
+22
+3.0
+32
+1.759
+13
+0.796875
+23
+3.0
+33
+1.759
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0625
+20
+3.0
+30
+1.759
+11
+1.5
+21
+3.0
+31
+2.795
+12
+1.5
+22
+3.0
+32
+1.81219074811907
+13
+1.5
+23
+3.0
+33
+1.81219074811907
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+2.795
+11
+1.60791666666667
+21
+3.0
+31
+1.97984537405954
+12
+1.5
+22
+3.0
+32
+1.81219074811907
+13
+1.5
+23
+3.0
+33
+1.81219074811907
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.60791666666667
+20
+3.0
+30
+1.97984537405954
+11
+1.5
+21
+3.0
+31
+2.795
+12
+1.71583333333333
+22
+3.0
+32
+2.1475
+13
+1.71583333333333
+23
+3.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+1.5
+21
+3.0
+31
+0.205000000000001
+12
+1.71583333333333
+22
+3.0
+32
+0.8525
+13
+1.71583333333333
+23
+3.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+3.0
+30
+1.28416666666667
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+1.71583333333333
+22
+3.0
+32
+0.8525
+13
+1.71583333333333
+23
+3.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+1.5
+30
+0.8525
+11
+1.71583333333333
+21
+3.0
+31
+0.8525
+12
+1.71583333333333
+22
+1.5
+32
+0.8525
+13
+1.71583333333333
+23
+1.5
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+3.0
+30
+0.8525
+11
+2.1475
+21
+1.5
+31
+0.8525
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+2.795
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.71583333333333
+22
+3.0
+32
+2.1475
+13
+1.71583333333333
+23
+3.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+1.71583333333333
+21
+1.5
+31
+2.1475
+12
+1.71583333333333
+22
+3.0
+32
+2.1475
+13
+1.71583333333333
+23
+3.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+2.1475
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+2.1475
+22
+1.5
+32
+2.1475
+13
+2.1475
+23
+1.5
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.796875
+20
+3.0
+30
+1.241
+11
+1.5
+21
+3.0
+31
+1.18780925188093
+12
+1.5
+22
+3.0
+32
+0.205000000000001
+13
+1.5
+23
+3.0
+33
+0.205000000000001
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+1.18780925188093
+11
+0.796875
+21
+3.0
+31
+1.241
+12
+1.0625
+22
+3.0
+32
+1.241
+13
+1.0625
+23
+3.0
+33
+1.241
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.796875
+21
+3.0
+31
+2.018
+12
+0.723000000000001
+22
+3.0
+32
+2.018
+13
+0.723000000000001
+23
+3.0
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.796875
+21
+3.0
+31
+1.759
+12
+0.796875
+22
+3.0
+32
+2.018
+13
+0.796875
+23
+3.0
+33
+2.018
+70
+12
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.205000000000001
+20
+3.0
+30
+0.205000000000001
+11
+0.53125
+21
+3.0
+31
+0.723
+12
+0.776999999999999
+22
+3.0
+32
+0.205
+13
+0.776999999999999
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+3.0
+30
+0.723
+11
+0.205000000000001
+21
+3.0
+31
+0.205000000000001
+12
+0.205
+22
+3.0
+32
+0.723
+13
+0.205
+23
+3.0
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+3.0
+30
+0.723
+11
+0.776999999999999
+21
+1.5
+31
+0.205
+12
+0.53125
+22
+1.5
+32
+0.723
+13
+0.53125
+23
+1.5
+33
+0.723
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.776999999999999
+20
+1.5
+30
+0.205
+11
+0.53125
+21
+3.0
+31
+0.723
+12
+0.776999999999999
+22
+3.0
+32
+0.205
+13
+0.776999999999999
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.53125
+20
+3.0
+30
+2.277
+11
+0.723000000000001
+21
+3.0
+31
+2.018
+12
+0.53125
+22
+3.0
+32
+2.018
+13
+0.53125
+23
+3.0
+33
+2.018
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+0.723000000000001
+20
+3.0
+30
+2.018
+11
+0.53125
+21
+3.0
+31
+2.277
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.53125
+21
+3.0
+31
+2.277
+12
+0.777
+22
+3.0
+32
+2.795
+13
+0.777
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.0625
+21
+1.5
+31
+1.241
+12
+1.5
+22
+1.5
+32
+1.18780925188093
+13
+1.5
+23
+1.5
+33
+1.18780925188093
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.0625
+20
+1.5
+30
+1.241
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.0625
+22
+1.5
+32
+1.5
+13
+1.0625
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+3.0
+30
+1.18780925188093
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.18780925188093
+13
+1.5
+23
+1.5
+33
+1.18780925188093
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.5
+21
+3.0
+31
+1.18780925188093
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+3.0
+30
+2.1475
+11
+1.71583333333333
+21
+3.0
+31
+1.72547110140021
+12
+1.60791666666667
+22
+3.0
+32
+1.97984537405954
+13
+1.60791666666667
+23
+3.0
+33
+1.97984537405954
+70
+0
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.60791666666667
+20
+3.0
+30
+1.02015462594046
+11
+1.71583333333333
+21
+3.0
+31
+1.27412051524007
+12
+1.71583333333333
+22
+3.0
+32
+0.8525
+13
+1.71583333333333
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+3.0
+30
+1.27412051524007
+11
+1.60791666666667
+21
+3.0
+31
+1.02015462594046
+12
+1.71461991087043
+22
+3.0
+32
+1.27285567614847
+13
+1.71461991087043
+23
+3.0
+33
+1.27285567614847
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+2.1475
+20
+3.0
+30
+1.28416666666667
+11
+1.71583333333333
+21
+1.5
+31
+0.8525
+12
+2.1475
+22
+1.5
+32
+1.28416666666667
+13
+2.1475
+23
+1.5
+33
+1.28416666666667
+70
+1
+ 0
+3DFACE
+ 8
+taser_b
+10
+1.71583333333333
+20
+1.5
+30
+0.8525
+11
+2.1475
+21
+3.0
+31
+1.28416666666667
+12
+1.71583333333333
+22
+3.0
+32
+0.8525
+13
+1.71583333333333
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.74
+20
+1.5
+30
+3.0
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.74
+21
+1.5
+31
+3.0
+12
+0.743659607729131
+22
+1.57449302665047
+32
+3.0
+13
+0.743659607729131
+23
+1.57449302665047
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+3.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+3.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+2.795
+32
+3.0
+13
+0.0
+23
+2.795
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+0.0
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+0.205
+22
+3.0
+32
+0.0
+13
+0.205
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.497732043121052
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.878679656440357
+22
+3.0
+32
+0.0
+13
+0.878679656440357
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.878679656440357
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+1.20163144893051
+22
+3.0
+32
+0.0
+13
+1.20163144893051
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20163144893051
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.01786110403563
+20
+0.91251205544432
+30
+3.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+0.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+0.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.0777666229051
+20
+0.868083094650066
+30
+0.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+3.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+3.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+0.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79083940859747
+20
+2.20214844470858
+30
+0.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.743659607729131
+20
+1.42550697334953
+30
+0.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+3.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.754603186893545
+20
+1.35173135526774
+30
+3.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+0.0
+12
+0.743659607729131
+22
+1.42550697334953
+32
+3.0
+13
+0.743659607729131
+23
+1.42550697334953
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.754603186893545
+20
+1.35173135526774
+30
+0.0
+11
+0.772725344843522
+21
+1.27938364528661
+31
+3.0
+12
+0.772725344843522
+22
+1.27938364528661
+32
+0.0
+13
+0.772725344843522
+23
+1.27938364528661
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.772725344843522
+20
+1.27938364528661
+30
+3.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+3.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.772725344843522
+20
+1.27938364528661
+30
+0.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+3.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+0.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.797851555291422
+20
+1.20916059140253
+30
+3.0
+11
+0.772725344843522
+21
+1.27938364528661
+31
+0.0
+12
+0.772725344843522
+22
+1.27938364528661
+32
+3.0
+13
+0.772725344843522
+23
+1.27938364528661
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.797851555291422
+20
+1.20916059140253
+30
+0.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+3.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+0.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.82973983909525
+20
+1.14173848001224
+30
+3.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+0.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+3.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.13191690534993
+20
+1.0777666229051
+30
+0.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+3.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+0.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+0.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+3.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+0.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.82973983909525
+20
+1.14173848001224
+30
+0.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+3.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+0.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.868083094650066
+20
+1.0777666229051
+30
+3.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+0.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+3.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.74
+20
+1.5
+30
+0.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+3.0
+12
+0.743659607729131
+22
+1.42550697334953
+32
+0.0
+13
+0.743659607729131
+23
+1.42550697334953
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.743659607729131
+20
+1.42550697334953
+30
+3.0
+11
+0.74
+21
+1.5
+31
+0.0
+12
+0.74
+22
+1.5
+32
+3.0
+13
+0.74
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.14173848001224
+20
+0.82973983909525
+30
+3.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+0.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+0.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20916059140253
+20
+0.797851555291422
+30
+0.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+3.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+3.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.743659607729131
+20
+1.57449302665047
+30
+0.0
+11
+0.74
+21
+1.5
+31
+3.0
+12
+0.74
+22
+1.5
+32
+0.0
+13
+0.74
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.74
+20
+1.5
+30
+3.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+0.0
+12
+0.743659607729131
+22
+1.57449302665047
+32
+3.0
+13
+0.743659607729131
+23
+1.57449302665047
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.754603186893545
+20
+1.64826864473226
+30
+0.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+3.0
+12
+0.743659607729131
+22
+1.57449302665047
+32
+0.0
+13
+0.743659607729131
+23
+1.57449302665047
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.743659607729131
+20
+1.57449302665047
+30
+3.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+0.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+3.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.772725344843521
+20
+1.72061635471339
+30
+0.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+3.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.754603186893545
+20
+1.64826864473226
+30
+3.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+0.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+3.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.797851555291422
+20
+1.79083940859747
+30
+0.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+3.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+0.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.772725344843521
+20
+1.72061635471339
+30
+3.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.82973983909525
+20
+1.85826151998776
+30
+0.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.797851555291422
+20
+1.79083940859747
+30
+3.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+0.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+3.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.868083094650066
+20
+1.9222333770949
+30
+0.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+3.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+0.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.82973983909525
+20
+1.85826151998776
+30
+3.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.91251205544432
+20
+1.98213889596437
+30
+0.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.868083094650066
+20
+1.9222333770949
+30
+3.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+0.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+3.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+3.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+0.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.91251205544432
+20
+1.98213889596437
+30
+3.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+2.26
+30
+3.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.42550697334953
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+2.26
+31
+3.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+3.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.42550697334953
+20
+2.25634039227087
+30
+3.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+0.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+0.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.35173135526774
+20
+2.24539681310645
+30
+0.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.35173135526774
+20
+2.24539681310645
+30
+3.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.27938364528661
+20
+2.22727465515648
+30
+0.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+3.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+3.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.27938364528661
+20
+2.22727465515648
+30
+3.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+0.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+0.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20916059140253
+20
+2.20214844470858
+30
+0.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.91251205544432
+20
+1.01786110403563
+30
+0.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+0.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+3.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20916059140253
+20
+2.20214844470858
+30
+3.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.14173848001224
+20
+2.17026016090475
+30
+0.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+3.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+3.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.14173848001224
+20
+2.17026016090475
+30
+3.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+0.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+0.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.0777666229051
+20
+2.13191690534993
+30
+0.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.0777666229051
+20
+2.13191690534993
+30
+3.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.01786110403563
+20
+2.08748794455568
+30
+0.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+3.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+3.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.01786110403563
+20
+2.08748794455568
+30
+3.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+0.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79083940859747
+20
+2.20214844470858
+30
+3.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+3.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+3.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+0.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+0.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.64826864473226
+20
+2.24539681310646
+30
+0.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.64826864473226
+20
+2.24539681310646
+30
+3.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+0.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+3.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+3.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+3.0
+11
+1.5
+21
+2.26
+31
+0.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+0.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+2.26
+30
+0.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+0.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.9222333770949
+20
+2.13191690534993
+30
+0.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.9222333770949
+20
+2.13191690534993
+30
+3.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+3.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+0.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+3.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+0.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+3.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+0.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.20214844470858
+20
+1.79083940859747
+30
+3.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+0.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+3.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.20214844470858
+20
+1.79083940859747
+30
+0.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+3.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+0.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.13191690534993
+20
+1.9222333770949
+30
+3.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+0.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+3.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.13191690534993
+20
+1.9222333770949
+30
+0.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+3.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+0.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+0.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.24539681310645
+20
+1.64826864473226
+30
+0.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+3.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+0.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.64826864473226
+20
+0.754603186893545
+30
+3.0
+11
+1.72061635471339
+21
+0.772725344843521
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.72061635471339
+20
+0.772725344843521
+30
+0.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+3.0
+12
+1.72061635471339
+22
+0.772725344843521
+32
+3.0
+13
+1.72061635471339
+23
+0.772725344843521
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+3.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+0.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+0.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.64826864473226
+20
+0.754603186893545
+30
+0.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.25634039227087
+20
+1.42550697334953
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.24539681310646
+20
+1.35173135526774
+30
+0.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+3.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+0.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.26
+20
+1.5
+30
+3.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+0.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+3.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.25634039227087
+20
+1.42550697334953
+30
+0.0
+11
+2.26
+21
+1.5
+31
+3.0
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+3.0
+11
+2.26
+21
+1.5
+31
+0.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.26
+20
+1.5
+30
+0.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+3.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+0.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.24539681310645
+20
+1.64826864473226
+30
+3.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+0.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+3.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+0.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.868083094650066
+20
+1.0777666229051
+30
+0.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+3.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+0.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.91251205544432
+20
+1.01786110403563
+30
+3.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+0.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+3.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+0.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.01786110403563
+20
+0.91251205544432
+30
+0.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+3.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.24539681310646
+20
+1.35173135526774
+30
+3.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+0.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+3.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.0777666229051
+20
+0.868083094650066
+30
+3.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+0.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+0.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.14173848001224
+20
+0.82973983909525
+30
+0.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+3.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+3.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.9222333770949
+20
+0.868083094650066
+30
+3.0
+11
+1.98213889596437
+21
+0.91251205544432
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.98213889596437
+20
+0.91251205544432
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.98213889596437
+22
+0.91251205544432
+32
+3.0
+13
+1.98213889596437
+23
+0.91251205544432
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.98213889596437
+20
+0.91251205544432
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+0.0
+12
+1.98213889596437
+22
+0.91251205544432
+32
+0.0
+13
+1.98213889596437
+23
+0.91251205544432
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.03740115370178
+20
+0.962598846298224
+30
+0.0
+11
+1.98213889596437
+21
+0.91251205544432
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+3.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+3.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+0.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.85826151998776
+20
+0.82973983909525
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+12
+1.85826151998776
+22
+0.82973983909525
+32
+0.0
+13
+1.85826151998776
+23
+0.82973983909525
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.9222333770949
+20
+0.868083094650066
+30
+0.0
+11
+1.85826151998776
+21
+0.82973983909525
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79083940859747
+20
+0.797851555291422
+30
+3.0
+11
+1.85826151998776
+21
+0.82973983909525
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.85826151998776
+20
+0.82973983909525
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+3.0
+12
+1.85826151998776
+22
+0.82973983909525
+32
+3.0
+13
+1.85826151998776
+23
+0.82973983909525
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.35173135526774
+20
+0.754603186893545
+30
+3.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.42550697334953
+20
+0.743659607729131
+30
+0.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+3.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+3.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.42550697334953
+20
+0.743659607729131
+30
+3.0
+11
+1.5
+21
+0.74
+31
+0.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+0.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.74
+30
+0.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+3.0
+12
+1.5
+22
+0.74
+32
+3.0
+13
+1.5
+23
+0.74
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.13191690534993
+20
+1.0777666229051
+30
+3.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+0.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+3.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20916059140253
+20
+0.797851555291422
+30
+3.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+0.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+0.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.27938364528661
+20
+0.772725344843521
+30
+0.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+3.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+3.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.27938364528661
+20
+0.772725344843521
+30
+3.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+0.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+0.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.35173135526774
+20
+0.754603186893545
+30
+0.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.72061635471339
+20
+0.772725344843521
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+0.0
+12
+1.72061635471339
+22
+0.772725344843521
+32
+0.0
+13
+1.72061635471339
+23
+0.772725344843521
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79083940859747
+20
+0.797851555291422
+30
+0.0
+11
+1.72061635471339
+21
+0.772725344843521
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.03740115370178
+20
+0.962598846298224
+30
+0.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+3.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+0.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.74
+30
+3.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+0.0
+11
+1.5
+21
+0.74
+31
+3.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+3.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.0
+30
+0.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.0
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+12
+3.0
+22
+0.497732043121051
+32
+0.0
+13
+3.0
+23
+0.497732043121051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.0
+30
+0.0
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.50226795687895
+20
+3.0
+30
+0.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.03740115370178
+20
+2.03740115370178
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+0.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+0.0
+12
+1.79836855106949
+22
+0.0
+32
+0.0
+13
+1.79836855106949
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79836855106949
+20
+0.0
+30
+0.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.74
+20
+1.5
+30
+0.0
+11
+2.77555756156289e-17
+21
+1.20163144893051
+31
+0.0
+12
+0.0
+22
+1.5
+32
+0.0
+13
+0.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.77555756156289e-17
+20
+1.20163144893051
+30
+0.0
+11
+0.74
+21
+1.5
+31
+0.0
+12
+0.743659607729131
+22
+1.42550697334953
+32
+0.0
+13
+0.743659607729131
+23
+1.42550697334953
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.77555756156289e-17
+20
+1.20163144893051
+30
+0.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+0.0
+11
+0.205
+21
+0.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+0.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+0.0
+12
+0.497732043121053
+22
+-5.55111512312578e-17
+32
+0.0
+13
+0.497732043121053
+23
+-5.55111512312578e-17
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.497732043121053
+20
+-5.55111512312578e-17
+30
+0.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+0.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+0.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.497732043121053
+20
+-5.55111512312578e-17
+30
+0.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+0.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+0.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+0.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+0.0
+12
+1.20163144893051
+22
+3.0
+32
+0.0
+13
+1.20163144893051
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.35173135526774
+20
+2.24539681310645
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+0.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.42550697334953
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.79836855106949
+30
+0.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+0.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+0.0
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.26
+20
+1.5
+30
+0.0
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+0.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+0.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.868083094650066
+20
+1.9222333770949
+30
+0.0
+11
+-1.11022302462516e-16
+21
+2.50226795687895
+31
+0.0
+12
+0.0
+22
+2.795
+32
+0.0
+13
+0.0
+23
+2.795
+33
+0.0
+70
+12
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+0.0
+11
+3.0
+21
+0.878679656440357
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.878679656440357
+30
+0.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.878679656440357
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+12
+3.0
+22
+1.20163144893051
+32
+0.0
+13
+3.0
+23
+1.20163144893051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.797851555291422
+20
+1.79083940859747
+30
+0.0
+11
+0.0
+21
+1.79836855106949
+31
+0.0
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+0.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+0.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+0.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.797851555291422
+20
+1.20916059140253
+30
+0.0
+11
+0.0
+21
+0.497732043121051
+31
+0.0
+12
+-1.11022302462516e-16
+22
+0.878679656440357
+32
+0.0
+13
+-1.11022302462516e-16
+23
+0.878679656440357
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+0.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+0.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+0.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+0.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20916059140253
+20
+0.797851555291422
+30
+0.0
+11
+1.20163144893051
+21
+5.55111512312578e-17
+31
+0.0
+12
+0.878679656440358
+22
+1.11022302462516e-16
+32
+0.0
+13
+0.878679656440358
+23
+1.11022302462516e-16
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20163144893051
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+0.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+0.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20163144893051
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.85826151998776
+20
+0.82973983909525
+30
+0.0
+11
+2.12132034355964
+21
+-5.55111512312578e-17
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.12132034355964
+20
+-5.55111512312578e-17
+30
+0.0
+11
+1.85826151998776
+21
+0.82973983909525
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.12132034355964
+20
+-5.55111512312578e-17
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+12
+2.50226795687895
+22
+-4.16333634234434e-17
+32
+0.0
+13
+2.50226795687895
+23
+-4.16333634234434e-17
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+0.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.20214844470858
+20
+1.79083940859747
+30
+0.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79083940859747
+20
+2.20214844470858
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.878679656440357
+20
+3.0
+30
+0.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+0.0
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.0777666229051
+20
+2.13191690534993
+30
+0.0
+11
+0.878679656440357
+21
+3.0
+31
+0.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+0.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.14173848001224
+20
+2.17026016090475
+30
+0.0
+11
+0.878679656440357
+21
+3.0
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+3.0
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.0
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+0.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.01786110403563
+20
+2.08748794455568
+30
+0.0
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20163144893051
+20
+3.0
+30
+0.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+0.0
+12
+0.878679656440357
+22
+3.0
+32
+0.0
+13
+0.878679656440357
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20916059140253
+20
+2.20214844470858
+30
+0.0
+11
+1.20163144893051
+21
+3.0
+31
+0.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+0.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.27938364528661
+20
+2.22727465515648
+30
+0.0
+11
+1.20163144893051
+21
+3.0
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+0.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.79836855106949
+22
+3.0
+32
+0.0
+13
+1.79836855106949
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+0.0
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.9222333770949
+20
+2.13191690534993
+30
+0.0
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+2.50226795687895
+22
+3.0
+32
+0.0
+13
+2.50226795687895
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.13191690534993
+20
+1.9222333770949
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+0.0
+13
+3.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.12132034355964
+30
+0.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+0.0
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.24539681310645
+20
+1.64826864473226
+30
+0.0
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+3.0
+22
+1.79836855106949
+32
+0.0
+13
+3.0
+23
+1.79836855106949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.25634039227087
+20
+1.42550697334953
+30
+0.0
+11
+3.0
+21
+1.20163144893051
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.20163144893051
+30
+0.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+0.0
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.20163144893051
+30
+0.0
+11
+2.26
+21
+1.5
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+0.0
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.497732043121051
+30
+0.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.497732043121051
+30
+0.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+0.0
+12
+3.0
+22
+0.878679656440357
+32
+0.0
+13
+3.0
+23
+0.878679656440357
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.98213889596437
+20
+0.91251205544432
+30
+0.0
+11
+2.50226795687895
+21
+-4.16333634234434e-17
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.50226795687895
+20
+-4.16333634234434e-17
+30
+0.0
+11
+1.98213889596437
+21
+0.91251205544432
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.50226795687895
+20
+-4.16333634234434e-17
+30
+0.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+0.0
+12
+2.795
+22
+0.0
+32
+0.0
+13
+2.795
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+0.0
+30
+0.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.72061635471339
+20
+0.772725344843521
+30
+0.0
+11
+1.79836855106949
+21
+0.0
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79836855106949
+20
+0.0
+30
+0.0
+11
+1.72061635471339
+21
+0.772725344843521
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79836855106949
+20
+0.0
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+0.0
+12
+2.12132034355964
+22
+-5.55111512312578e-17
+32
+0.0
+13
+2.12132034355964
+23
+-5.55111512312578e-17
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.35173135526774
+20
+0.754603186893545
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.0
+12
+1.20163144893051
+22
+5.55111512312578e-17
+32
+0.0
+13
+1.20163144893051
+23
+5.55111512312578e-17
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+0.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+0.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+0.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+0.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.0777666229051
+20
+0.868083094650066
+30
+0.0
+11
+0.878679656440358
+21
+1.11022302462516e-16
+31
+0.0
+12
+0.497732043121053
+22
+-5.55111512312578e-17
+32
+0.0
+13
+0.497732043121053
+23
+-5.55111512312578e-17
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.878679656440358
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+0.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+0.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.878679656440358
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+0.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+0.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.868083094650066
+20
+1.0777666229051
+30
+0.0
+11
+0.0
+21
+0.205
+31
+0.0
+12
+0.0
+22
+0.497732043121051
+32
+0.0
+13
+0.0
+23
+0.497732043121051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+0.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.0
+30
+0.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+0.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+0.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.0
+30
+0.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+0.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.77555756156289e-17
+20
+1.20163144893051
+30
+0.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+0.0
+12
+-1.11022302462516e-16
+22
+0.878679656440357
+32
+0.0
+13
+-1.11022302462516e-16
+23
+0.878679656440357
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.797851555291422
+20
+1.20916059140253
+30
+0.0
+11
+2.77555756156289e-17
+21
+1.20163144893051
+31
+0.0
+12
+0.772725344843522
+22
+1.27938364528661
+32
+0.0
+13
+0.772725344843522
+23
+1.27938364528661
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.772725344843522
+20
+1.27938364528661
+30
+0.0
+11
+2.77555756156289e-17
+21
+1.20163144893051
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.754603186893545
+20
+1.64826864473226
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+1.79836855106949
+32
+0.0
+13
+0.0
+23
+1.79836855106949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+0.0
+12
+0.743659607729131
+22
+1.57449302665047
+32
+0.0
+13
+0.743659607729131
+23
+1.57449302665047
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+0.0
+12
+0.74
+22
+1.5
+32
+0.0
+13
+0.74
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.868083094650066
+20
+1.9222333770949
+30
+0.0
+11
+0.0
+21
+2.12132034355964
+31
+0.0
+12
+-1.11022302462516e-16
+22
+2.50226795687895
+32
+0.0
+13
+-1.11022302462516e-16
+23
+2.50226795687895
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+0.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+0.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.868083094650066
+20
+1.9222333770949
+30
+3.0
+11
+0.0
+21
+2.795
+31
+3.0
+12
+0.0
+22
+2.50226795687895
+32
+3.0
+13
+0.0
+23
+2.50226795687895
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+3.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+3.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+3.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.17026016090475
+20
+1.85826151998776
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.754603186893545
+20
+1.35173135526774
+30
+3.0
+11
+0.0
+21
+1.5
+31
+3.0
+12
+0.0
+22
+1.20163144893051
+32
+3.0
+13
+0.0
+23
+1.20163144893051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+3.0
+12
+0.743659607729131
+22
+1.42550697334953
+32
+3.0
+13
+0.743659607729131
+23
+1.42550697334953
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+3.0
+12
+0.74
+22
+1.5
+32
+3.0
+13
+0.74
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.25634039227087
+20
+1.42550697334953
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+3.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.26
+20
+1.5
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+3.0
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+3.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+3.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.35173135526774
+20
+0.754603186893545
+30
+3.0
+11
+1.5
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+3.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.42550697334953
+20
+0.743659607729131
+30
+3.0
+11
+1.5
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.5
+22
+0.74
+32
+3.0
+13
+1.5
+23
+0.74
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+2.03740115370178
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.497732043121052
+20
+3.0
+30
+3.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+3.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+3.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.497732043121052
+20
+3.0
+30
+3.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.0777666229051
+20
+2.13191690534993
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+3.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+3.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.35173135526774
+20
+2.24539681310645
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+3.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+3.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.17026016090475
+20
+1.14173848001224
+30
+3.0
+11
+3.0
+21
+0.497732043121051
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+3.0
+21
+0.497732043121051
+31
+3.0
+12
+3.0
+22
+0.878679656440357
+32
+3.0
+13
+3.0
+23
+0.878679656440357
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.797851555291422
+20
+1.79083940859747
+30
+3.0
+11
+0.0
+21
+2.50226795687895
+31
+3.0
+12
+0.0
+22
+2.12132034355964
+32
+3.0
+13
+0.0
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.50226795687895
+30
+3.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+3.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+3.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.50226795687895
+30
+3.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.868083094650066
+20
+1.0777666229051
+30
+3.0
+11
+0.0
+21
+0.878679656440357
+31
+3.0
+12
+0.0
+22
+0.497732043121051
+32
+3.0
+13
+0.0
+23
+0.497732043121051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.878679656440357
+30
+3.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+3.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+3.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.878679656440357
+30
+3.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+3.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+3.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+2.50226795687895
+21
+3.0
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+3.0
+22
+3.0
+32
+3.0
+13
+3.0
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.25634039227087
+20
+1.57449302665047
+30
+3.0
+11
+3.0
+21
+1.79836855106949
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+3.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+2.26
+21
+1.5
+31
+3.0
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.50226795687895
+20
+0.0
+30
+3.0
+11
+1.98213889596437
+21
+0.91251205544432
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.98213889596437
+20
+0.91251205544432
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.03740115370178
+20
+0.962598846298224
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.795
+22
+0.0
+32
+3.0
+13
+2.795
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+3.0
+11
+1.72061635471339
+21
+0.772725344843521
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.72061635471339
+20
+0.772725344843521
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79083940859747
+20
+0.797851555291422
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+3.0
+13
+2.12132034355964
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20916059140253
+20
+2.20214844470858
+30
+3.0
+11
+1.20163144893051
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20163144893051
+20
+3.0
+30
+3.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+3.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+3.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20163144893051
+20
+3.0
+30
+3.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.57449302665047
+20
+2.25634039227087
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+3.0
+12
+1.79836855106949
+22
+3.0
+32
+3.0
+13
+1.79836855106949
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.12132034355964
+20
+0.0
+30
+3.0
+11
+1.85826151998776
+21
+0.82973983909525
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.85826151998776
+20
+0.82973983909525
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.9222333770949
+20
+0.868083094650066
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+3.0
+12
+2.50226795687895
+22
+0.0
+32
+3.0
+13
+2.50226795687895
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.72061635471339
+20
+2.22727465515648
+30
+3.0
+11
+1.79836855106949
+21
+3.0
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.878679656440357
+30
+3.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.22727465515648
+20
+1.27938364528661
+30
+3.0
+11
+3.0
+21
+0.878679656440357
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.24539681310646
+20
+1.35173135526774
+30
+3.0
+11
+3.0
+21
+0.878679656440357
+31
+3.0
+12
+3.0
+22
+1.20163144893051
+32
+3.0
+13
+3.0
+23
+1.20163144893051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.08748794455568
+20
+1.01786110403563
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.13191690534993
+20
+1.0777666229051
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.497732043121051
+32
+3.0
+13
+3.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.205
+32
+3.0
+13
+3.0
+23
+0.205
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.754603186893545
+20
+1.64826864473226
+30
+3.0
+11
+0.0
+21
+2.12132034355964
+31
+3.0
+12
+0.0
+22
+1.79836855106949
+32
+3.0
+13
+0.0
+23
+1.79836855106949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.12132034355964
+30
+3.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+3.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+3.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.12132034355964
+30
+3.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.08748794455568
+20
+1.98213889596437
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+12
+3.0
+22
+2.50226795687895
+32
+3.0
+13
+3.0
+23
+2.50226795687895
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+3.0
+12
+3.0
+22
+2.795
+32
+3.0
+13
+3.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+3.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+3.0
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+3.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20916059140253
+20
+0.797851555291422
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+3.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.27938364528661
+20
+0.772725344843521
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+3.0
+11
+1.5
+21
+0.74
+31
+3.0
+12
+1.5
+22
+5.55111512312578e-17
+32
+3.0
+13
+1.5
+23
+5.55111512312578e-17
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.74
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+3.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.57449302665047
+20
+0.743659607729131
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+0.0
+21
+0.205
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.0
+22
+0.497732043121051
+32
+3.0
+13
+0.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+3.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+3.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+3.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+3.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.0777666229051
+20
+0.868083094650066
+30
+3.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+3.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+3.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.14173848001224
+20
+0.82973983909525
+30
+3.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+3.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+3.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+0.205
+21
+0.0
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+0.497732043121053
+21
+0.0
+31
+3.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+3.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.01786110403563
+20
+0.91251205544432
+30
+3.0
+11
+0.497732043121053
+21
+0.0
+31
+3.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+3.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.22727465515648
+20
+1.72061635471339
+30
+3.0
+11
+3.0
+21
+2.12132034355964
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+12
+3.0
+22
+1.79836855106949
+32
+3.0
+13
+3.0
+23
+1.79836855106949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.85826151998776
+20
+2.17026016090475
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+12
+2.50226795687895
+22
+3.0
+32
+3.0
+13
+2.50226795687895
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.797851555291422
+20
+1.20916059140253
+30
+3.0
+11
+0.0
+21
+1.20163144893051
+31
+3.0
+12
+0.0
+22
+0.878679656440357
+32
+3.0
+13
+0.0
+23
+0.878679656440357
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.20163144893051
+30
+3.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+3.0
+12
+0.772725344843522
+22
+1.27938364528661
+32
+3.0
+13
+0.772725344843522
+23
+1.27938364528661
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.20163144893051
+30
+3.0
+11
+0.772725344843522
+21
+1.27938364528661
+31
+3.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+3.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+1.5
+11
+0.0
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.205
+21
+0.0
+31
+1.5
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.0
+21
+0.0
+31
+1.5
+12
+0.205
+22
+0.0
+32
+1.5
+13
+0.205
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.0
+30
+1.5
+11
+0.205
+21
+0.0
+31
+2.795
+12
+0.0
+22
+0.0
+32
+2.795
+13
+0.0
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.0
+30
+1.5
+11
+2.795
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+0.0
+30
+0.205
+11
+3.0
+21
+0.0
+31
+1.5
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+0.0
+30
+3.0
+11
+1.5
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.795
+21
+0.0
+31
+3.0
+12
+1.5
+22
+5.55111512312578e-17
+32
+3.0
+13
+1.5
+23
+5.55111512312578e-17
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+2.795
+21
+0.0
+31
+3.0
+12
+2.50226795687895
+22
+0.0
+32
+3.0
+13
+2.50226795687895
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+3.0
+13
+2.12132034355964
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+3.0
+12
+1.79836855106949
+22
+5.55111512312578e-17
+32
+3.0
+13
+1.79836855106949
+23
+5.55111512312578e-17
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+0.205
+11
+1.20163144893051
+21
+5.55111512312578e-17
+31
+0.0
+12
+1.5
+22
+0.0
+32
+0.0
+13
+1.5
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.20163144893051
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.878679656440358
+22
+1.11022302462516e-16
+32
+0.0
+13
+0.878679656440358
+23
+1.11022302462516e-16
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.878679656440358
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.497732043121053
+22
+-5.55111512312578e-17
+32
+0.0
+13
+0.497732043121053
+23
+-5.55111512312578e-17
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.497732043121053
+20
+-5.55111512312578e-17
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.0
+13
+0.205
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.0
+30
+3.0
+11
+0.205
+21
+0.0
+31
+2.795
+12
+0.205
+22
+0.0
+32
+3.0
+13
+0.205
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.0
+30
+2.795
+11
+2.795
+21
+0.0
+31
+1.5
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+0.0
+30
+1.5
+11
+3.0
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+0.0
+30
+0.205
+11
+2.50226795687895
+21
+-4.16333634234434e-17
+31
+0.0
+12
+2.795
+22
+0.0
+32
+0.0
+13
+2.795
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.50226795687895
+20
+-4.16333634234434e-17
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+2.12132034355964
+22
+-5.55111512312578e-17
+32
+0.0
+13
+2.12132034355964
+23
+-5.55111512312578e-17
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.12132034355964
+20
+-5.55111512312578e-17
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+1.79836855106949
+22
+0.0
+32
+0.0
+13
+1.79836855106949
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79836855106949
+20
+0.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.0
+13
+1.5
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+0.205
+21
+0.0
+31
+2.795
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+2.795
+11
+1.5
+21
+5.55111512312578e-17
+31
+3.0
+12
+0.205
+22
+0.0
+32
+3.0
+13
+0.205
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+3.0
+11
+1.5
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+3.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+3.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+3.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+2.795
+11
+0.8525
+21
+0.0
+31
+2.1475
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+3.0
+21
+3.0
+31
+1.5
+12
+2.795
+22
+3.0
+32
+1.5
+13
+2.795
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+2.795
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+2.795
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+2.795
+12
+2.795
+22
+3.0
+32
+2.795
+13
+2.795
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+0.205
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.50226795687895
+22
+3.0
+32
+0.0
+13
+2.50226795687895
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.50226795687895
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+2.795
+13
+0.0
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.205
+21
+3.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+1.5
+11
+1.5
+21
+3.0
+31
+0.205
+12
+0.8525
+22
+3.0
+32
+0.8525
+13
+0.8525
+23
+3.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+3.0
+12
+1.5
+22
+3.0
+32
+3.0
+13
+1.5
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.497732043121052
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+3.0
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+3.0
+11
+2.795
+21
+3.0
+31
+2.795
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+1.5
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.79836855106949
+22
+3.0
+32
+3.0
+13
+1.79836855106949
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+3.0
+11
+1.79836855106949
+21
+3.0
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+2.50226795687895
+22
+3.0
+32
+3.0
+13
+2.50226795687895
+23
+3.0
+33
+3.0
+70
+1
+ 0
+LINE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+1.5
+11
+0.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+1.5
+31
+0.205
+ 0
+LINE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+0.205
+31
+0.205
+ 0
+LINE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+2.795
+31
+0.205
+ 0
+LINE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+0.205
+31
+1.5
+ 0
+LINE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+1.5
+31
+1.5
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.795
+32
+1.5
+13
+0.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.497732043121051
+31
+0.0
+12
+0.0
+22
+0.205
+32
+0.0
+13
+0.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.0
+21
+0.205
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+-1.11022302462516e-16
+22
+0.878679656440357
+32
+0.0
+13
+-1.11022302462516e-16
+23
+0.878679656440357
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+-1.11022302462516e-16
+20
+0.878679656440357
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+2.77555756156289e-17
+22
+1.20163144893051
+32
+0.0
+13
+2.77555756156289e-17
+23
+1.20163144893051
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.77555756156289e-17
+20
+1.20163144893051
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.0
+13
+0.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.205
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.0
+21
+2.795
+31
+1.5
+12
+0.0
+22
+2.795
+32
+2.795
+13
+0.0
+23
+2.795
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+2.795
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.205
+32
+3.0
+13
+0.0
+23
+0.205
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.0
+12
+0.0
+22
+2.795
+32
+0.205
+13
+0.0
+23
+2.795
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+1.5
+12
+0.0
+22
+0.0
+32
+2.795
+13
+0.0
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.0
+30
+1.5
+11
+0.0
+21
+0.205
+31
+2.795
+12
+0.0
+22
+0.205
+32
+1.5
+13
+0.0
+23
+0.205
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.0
+21
+1.5
+31
+2.795
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+2.795
+32
+2.795
+13
+0.0
+23
+2.795
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+2.12132034355964
+32
+3.0
+13
+0.0
+23
+2.12132034355964
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.12132034355964
+31
+3.0
+12
+0.0
+22
+2.50226795687895
+32
+3.0
+13
+0.0
+23
+2.50226795687895
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.50226795687895
+31
+3.0
+12
+0.0
+22
+2.795
+32
+3.0
+13
+0.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.0
+21
+0.205
+31
+2.795
+12
+0.0
+22
+0.205
+32
+3.0
+13
+0.0
+23
+0.205
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+0.0
+22
+0.878679656440357
+32
+3.0
+13
+0.0
+23
+0.878679656440357
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+0.878679656440357
+31
+3.0
+12
+0.0
+22
+1.20163144893051
+32
+3.0
+13
+0.0
+23
+1.20163144893051
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+1.20163144893051
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+1.79836855106949
+32
+0.0
+13
+0.0
+23
+1.79836855106949
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+-1.11022302462516e-16
+22
+2.50226795687895
+32
+0.0
+13
+-1.11022302462516e-16
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+-1.11022302462516e-16
+20
+2.50226795687895
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.795
+32
+0.0
+13
+0.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.205
+13
+0.0
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+1.5
+11
+0.0
+21
+0.0
+31
+0.205
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.205
+31
+1.5
+12
+0.0
+22
+0.205
+32
+0.205
+13
+0.0
+23
+0.205
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+0.205
+31
+1.5
+12
+0.0
+22
+0.205
+32
+2.795
+13
+0.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+1.5
+11
+0.0
+21
+1.5
+31
+2.795
+12
+0.0
+22
+0.205
+32
+0.205
+13
+0.0
+23
+0.205
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+1.5
+31
+2.795
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+0.205
+11
+0.0
+21
+1.5
+31
+2.795
+12
+0.0
+22
+2.795
+32
+2.795
+13
+0.0
+23
+2.795
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+1.5
+30
+0.205
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+2.795
+32
+0.205
+13
+0.0
+23
+2.795
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+2.795
+32
+1.5
+13
+0.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+LINE
+ 8
+pillar_base
+10
+3.0
+20
+0.205
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+pillar_base
+10
+3.0
+20
+2.795
+30
+1.5
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+1.5
+31
+0.205
+ 0
+LINE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+2.795
+31
+0.205
+ 0
+LINE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+0.205
+31
+1.5
+ 0
+LINE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+0.205
+31
+0.205
+ 0
+LINE
+ 8
+pillar_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+1.5
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.0
+30
+1.5
+11
+3.0
+21
+0.205
+31
+0.205
+12
+3.0
+22
+0.205
+32
+1.5
+13
+3.0
+23
+0.205
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+1.5
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.795
+32
+1.5
+13
+3.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.205
+30
+1.5
+11
+3.0
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.0
+30
+2.795
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+2.795
+31
+1.5
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.795
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.205
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.205
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.205
+30
+2.795
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.79836855106949
+30
+0.0
+11
+3.0
+21
+1.5
+31
+0.205
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+0.0
+13
+3.0
+23
+2.50226795687895
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+0.0
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.497732043121051
+30
+0.0
+11
+3.0
+21
+0.205
+31
+0.205
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.205
+13
+3.0
+23
+1.5
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+3.0
+22
+0.878679656440357
+32
+0.0
+13
+3.0
+23
+0.878679656440357
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.878679656440357
+31
+0.0
+12
+3.0
+22
+1.20163144893051
+32
+0.0
+13
+3.0
+23
+1.20163144893051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+1.20163144893051
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.795
+31
+3.0
+12
+3.0
+22
+2.795
+32
+2.795
+13
+3.0
+23
+2.795
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+0.205
+31
+3.0
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.205
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.497732043121051
+32
+3.0
+13
+3.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.878679656440357
+32
+3.0
+13
+3.0
+23
+0.878679656440357
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.878679656440357
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+1.20163144893051
+32
+3.0
+13
+3.0
+23
+1.20163144893051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+1.5
+31
+3.0
+12
+3.0
+22
+1.5
+32
+2.795
+13
+3.0
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+1.79836855106949
+32
+3.0
+13
+3.0
+23
+1.79836855106949
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.50226795687895
+32
+3.0
+13
+3.0
+23
+2.50226795687895
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.795
+32
+3.0
+13
+3.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+0.205
+32
+0.205
+13
+3.0
+23
+0.205
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.205
+30
+1.5
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+1.5
+32
+0.205
+13
+3.0
+23
+1.5
+33
+0.205
+70
+15
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+1.5
+31
+0.205
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+2.795
+13
+3.0
+23
+2.795
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+1.5
+13
+3.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.8525
+20
+3.0
+30
+2.1475
+11
+1.5
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.8525
+20
+3.0
+30
+0.8525
+11
+1.5
+21
+3.0
+31
+0.205
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+2.795
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+3.0
+30
+2.795
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+2.795
+21
+3.0
+31
+1.5
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+1.5
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+2.795
+11
+1.5
+21
+0.0
+31
+1.5
+12
+2.1475
+22
+0.0
+32
+2.1475
+13
+2.1475
+23
+0.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.8525
+21
+0.0
+31
+2.1475
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+1.5
+11
+0.8525
+21
+0.0
+31
+0.8525
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+1.5
+11
+2.1475
+21
+0.0
+31
+0.8525
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.8525
+20
+0.0
+30
+0.8525
+11
+0.205
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.205
+22
+0.0
+32
+0.0
+13
+0.205
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+1.5
+11
+0.8525
+21
+0.0
+31
+0.8525
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+0.0
+30
+2.795
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+0.0
+30
+1.5
+11
+2.1475
+21
+0.0
+31
+0.8525
+12
+2.795
+22
+0.0
+32
+0.205
+13
+2.795
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.1475
+20
+0.0
+30
+2.1475
+11
+1.5
+21
+0.0
+31
+1.5
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.1475
+20
+0.0
+30
+0.8525
+11
+1.5
+21
+0.0
+31
+0.205
+12
+2.795
+22
+0.0
+32
+0.205
+13
+2.795
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+0.0
+30
+1.5
+11
+1.5
+21
+0.0
+31
+0.205
+12
+2.1475
+22
+0.0
+32
+0.8525
+13
+2.1475
+23
+0.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+0.0
+30
+0.205
+11
+2.795
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.0
+30
+3.0
+11
+0.0
+21
+0.0
+31
+2.795
+12
+0.205
+22
+0.0
+32
+2.795
+13
+0.205
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.205
+21
+0.0
+31
+1.5
+12
+0.8525
+22
+0.0
+32
+2.1475
+13
+0.8525
+23
+0.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+0.0
+30
+1.5
+11
+0.205
+21
+0.0
+31
+0.205
+12
+0.8525
+22
+0.0
+32
+0.8525
+13
+0.8525
+23
+0.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.8525
+20
+0.0
+30
+2.1475
+11
+0.205
+21
+0.0
+31
+1.5
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+2.795
+11
+1.5
+21
+3.0
+31
+1.5
+12
+0.8525
+22
+3.0
+32
+2.1475
+13
+0.8525
+23
+3.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.795
+21
+3.0
+31
+1.5
+12
+2.1475
+22
+3.0
+32
+2.1475
+13
+2.1475
+23
+3.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+1.5
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+0.205
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.795
+21
+3.0
+31
+2.795
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+2.795
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.8525
+21
+3.0
+31
+0.8525
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+pillar_base
+10
+1.5
+20
+3.0
+30
+1.5
+11
+0.8525
+21
+3.0
+31
+0.8525
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.42550697334953
+20
+0.743659607729131
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+3.0
+12
+1.5
+22
+0.74
+32
+3.0
+13
+1.5
+23
+0.74
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.868083094650066
+20
+1.9222333770949
+30
+3.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+1.5
+12
+0.82973983909525
+22
+1.85826151998776
+32
+3.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.82973983909525
+20
+1.85826151998776
+30
+1.5
+11
+0.868083094650066
+21
+1.9222333770949
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+1.5
+13
+0.868083094650066
+23
+1.9222333770949
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.82973983909525
+20
+1.85826151998776
+30
+3.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+1.5
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.797851555291422
+20
+1.79083940859747
+30
+1.5
+11
+0.82973983909525
+21
+1.85826151998776
+31
+3.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+1.5
+13
+0.82973983909525
+23
+1.85826151998776
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.754603186893545
+20
+1.64826864473226
+30
+3.0
+11
+0.74365960772913
+21
+1.57449302665047
+31
+1.5
+12
+0.743659607729131
+22
+1.57449302665047
+32
+3.0
+13
+0.743659607729131
+23
+1.57449302665047
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.74365960772913
+20
+1.57449302665047
+30
+1.5
+11
+0.754603186893545
+21
+1.64826864473226
+31
+3.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+1.5
+13
+0.754603186893545
+23
+1.64826864473226
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.64826864473226
+20
+2.24539681310646
+30
+3.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+1.5
+12
+1.64826864473226
+22
+2.24539681310646
+32
+1.5
+13
+1.64826864473226
+23
+2.24539681310646
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.72061635471339
+20
+2.22727465515648
+30
+1.5
+11
+1.64826864473226
+21
+2.24539681310646
+31
+3.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+3.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.57449302665047
+20
+2.25634039227087
+30
+3.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+1.5
+12
+1.57449302665047
+22
+2.25634039227087
+32
+1.5
+13
+1.57449302665047
+23
+2.25634039227087
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.64826864473226
+20
+2.24539681310646
+30
+1.5
+11
+1.57449302665047
+21
+2.25634039227087
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.962598846298224
+20
+2.03740115370178
+30
+3.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+1.5
+12
+0.962598846298224
+22
+2.03740115370178
+32
+1.5
+13
+0.962598846298224
+23
+2.03740115370178
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.01786110403563
+20
+2.08748794455568
+30
+1.5
+11
+0.962598846298224
+21
+2.03740115370178
+31
+3.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+3.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.962598846298224
+20
+2.03740115370178
+30
+3.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+1.5
+12
+0.91251205544432
+22
+1.98213889596437
+32
+3.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.91251205544432
+20
+1.98213889596437
+30
+1.5
+11
+0.962598846298224
+21
+2.03740115370178
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+1.5
+13
+0.962598846298224
+23
+2.03740115370178
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.22727465515648
+20
+1.72061635471339
+30
+1.5
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+3.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.79083940859747
+30
+3.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+1.5
+12
+2.20214844470858
+22
+1.79083940859747
+32
+1.5
+13
+2.20214844470858
+23
+1.79083940859747
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.35173135526774
+20
+0.754603186893545
+30
+3.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+1.5
+12
+1.35173135526774
+22
+0.754603186893545
+32
+1.5
+13
+1.35173135526774
+23
+0.754603186893545
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.27938364528661
+20
+0.772725344843521
+30
+1.5
+11
+1.35173135526774
+21
+0.754603186893545
+31
+3.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+3.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+0.74
+30
+3.0
+11
+1.42550697334953
+21
+0.74365960772913
+31
+1.5
+12
+1.5
+22
+0.74
+32
+1.5
+13
+1.5
+23
+0.74
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.42550697334953
+20
+0.74365960772913
+30
+1.5
+11
+1.5
+21
+0.74
+31
+3.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+3.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.57449302665047
+20
+0.743659607729131
+30
+3.0
+11
+1.5
+21
+0.74
+31
+1.5
+12
+1.57449302665047
+22
+0.743659607729131
+32
+1.5
+13
+1.57449302665047
+23
+0.743659607729131
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+0.74
+30
+1.5
+11
+1.57449302665047
+21
+0.743659607729131
+31
+3.0
+12
+1.5
+22
+0.74
+32
+3.0
+13
+1.5
+23
+0.74
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.08748794455568
+20
+1.01786110403563
+30
+1.5
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+3.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.0777666229051
+30
+3.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+1.5
+12
+2.13191690534993
+22
+1.0777666229051
+32
+1.5
+13
+2.13191690534993
+23
+1.0777666229051
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.27938364528661
+20
+0.772725344843521
+30
+3.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+1.5
+12
+1.27938364528661
+22
+0.772725344843521
+32
+1.5
+13
+1.27938364528661
+23
+0.772725344843521
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.20916059140253
+20
+0.797851555291422
+30
+1.5
+11
+1.27938364528661
+21
+0.772725344843521
+31
+3.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+3.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.25634039227087
+20
+1.57449302665047
+30
+1.5
+11
+2.26
+21
+1.5
+31
+3.0
+12
+2.26
+22
+1.5
+32
+1.5
+13
+2.26
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.26
+20
+1.5
+30
+3.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+1.5
+12
+2.25634039227087
+22
+1.57449302665047
+32
+3.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.42550697334953
+20
+0.743659607729131
+30
+3.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+1.5
+12
+1.42550697334953
+22
+0.74365960772913
+32
+1.5
+13
+1.42550697334953
+23
+0.74365960772913
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.35173135526774
+20
+0.754603186893545
+30
+1.5
+11
+1.42550697334953
+21
+0.743659607729131
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.85826151998776
+20
+0.82973983909525
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+1.5
+12
+1.85826151998776
+22
+0.829739839095251
+32
+1.5
+13
+1.85826151998776
+23
+0.829739839095251
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+0.797851555291422
+30
+1.5
+11
+1.85826151998776
+21
+0.82973983909525
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.0777666229051
+20
+2.13191690534993
+30
+3.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+1.5
+12
+1.0777666229051
+22
+2.13191690534993
+32
+1.5
+13
+1.0777666229051
+23
+2.13191690534993
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.14173848001224
+20
+2.17026016090475
+30
+1.5
+11
+1.0777666229051
+21
+2.13191690534993
+31
+3.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+3.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.01786110403563
+20
+2.08748794455568
+30
+3.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+1.5
+12
+1.01786110403563
+22
+2.08748794455568
+32
+1.5
+13
+1.01786110403563
+23
+2.08748794455568
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.0777666229051
+20
+2.13191690534993
+30
+1.5
+11
+1.01786110403563
+21
+2.08748794455568
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.85826151998776
+20
+2.17026016090475
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534994
+31
+1.5
+12
+1.85826151998776
+22
+2.17026016090475
+32
+1.5
+13
+1.85826151998776
+23
+2.17026016090475
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+2.13191690534994
+30
+1.5
+11
+1.85826151998776
+21
+2.17026016090475
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+0.962598846298225
+30
+1.5
+11
+2.08748794455568
+21
+1.01786110403563
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.08748794455568
+20
+1.01786110403563
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298225
+31
+1.5
+12
+2.08748794455568
+22
+1.01786110403563
+32
+1.5
+13
+2.08748794455568
+23
+1.01786110403563
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310646
+20
+1.64826864473226
+30
+1.5
+11
+2.22727465515648
+21
+1.72061635471339
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.22727465515648
+20
+1.72061635471339
+30
+3.0
+11
+2.24539681310646
+21
+1.64826864473226
+31
+1.5
+12
+2.22727465515648
+22
+1.72061635471339
+32
+1.5
+13
+2.22727465515648
+23
+1.72061635471339
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.25634039227087
+20
+1.42550697334953
+30
+1.5
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+1.5
+13
+2.24539681310646
+23
+1.35173135526774
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310646
+20
+1.35173135526774
+30
+3.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+1.5
+12
+2.25634039227087
+22
+1.42550697334953
+32
+3.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.20916059140253
+20
+0.797851555291422
+30
+3.0
+11
+1.14173848001224
+21
+0.829739839095251
+31
+1.5
+12
+1.20916059140253
+22
+0.797851555291422
+32
+1.5
+13
+1.20916059140253
+23
+0.797851555291422
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.14173848001224
+20
+0.829739839095251
+30
+1.5
+11
+1.20916059140253
+21
+0.797851555291422
+31
+3.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+3.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.797851555291422
+20
+1.79083940859747
+30
+3.0
+11
+0.772725344843522
+21
+1.72061635471339
+31
+1.5
+12
+0.772725344843521
+22
+1.72061635471339
+32
+3.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.772725344843522
+20
+1.72061635471339
+30
+1.5
+11
+0.797851555291422
+21
+1.79083940859747
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+1.5
+13
+0.797851555291422
+23
+1.79083940859747
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+2.26
+30
+3.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+1.5
+12
+1.5
+22
+2.26
+32
+1.5
+13
+1.5
+23
+2.26
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.57449302665047
+20
+2.25634039227087
+30
+1.5
+11
+1.5
+21
+2.26
+31
+3.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+3.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.42550697334953
+20
+2.25634039227087
+30
+3.0
+11
+1.5
+21
+2.26
+31
+1.5
+12
+1.42550697334953
+22
+2.25634039227087
+32
+1.5
+13
+1.42550697334953
+23
+2.25634039227087
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+2.26
+30
+1.5
+11
+1.42550697334953
+21
+2.25634039227087
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.35173135526774
+20
+2.24539681310645
+30
+3.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+1.5
+12
+1.35173135526774
+22
+2.24539681310646
+32
+1.5
+13
+1.35173135526774
+23
+2.24539681310646
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.42550697334953
+20
+2.25634039227087
+30
+1.5
+11
+1.35173135526774
+21
+2.24539681310645
+31
+3.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+3.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.27938364528661
+20
+2.22727465515648
+30
+3.0
+11
+1.35173135526774
+21
+2.24539681310646
+31
+1.5
+12
+1.27938364528661
+22
+2.22727465515648
+32
+1.5
+13
+1.27938364528661
+23
+2.22727465515648
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.35173135526774
+20
+2.24539681310646
+30
+1.5
+11
+1.27938364528661
+21
+2.22727465515648
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.20916059140253
+20
+2.20214844470858
+30
+3.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+1.5
+12
+1.20916059140253
+22
+2.20214844470858
+32
+1.5
+13
+1.20916059140253
+23
+2.20214844470858
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.27938364528661
+20
+2.22727465515648
+30
+1.5
+11
+1.20916059140253
+21
+2.20214844470858
+31
+3.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+3.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.17026016090475
+20
+1.85826151998776
+30
+1.5
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+3.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.9222333770949
+30
+3.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+1.5
+12
+2.13191690534993
+22
+1.9222333770949
+32
+1.5
+13
+2.13191690534993
+23
+1.9222333770949
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.91251205544432
+20
+1.98213889596437
+30
+3.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+1.5
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.868083094650066
+20
+1.9222333770949
+30
+1.5
+11
+0.91251205544432
+21
+1.98213889596437
+31
+3.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+1.5
+13
+0.91251205544432
+23
+1.98213889596437
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+0.868083094650066
+30
+3.0
+11
+1.85826151998776
+21
+0.829739839095251
+31
+1.5
+12
+1.9222333770949
+22
+0.868083094650066
+32
+1.5
+13
+1.9222333770949
+23
+0.868083094650066
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.85826151998776
+20
+0.829739839095251
+30
+1.5
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.85826151998776
+22
+0.82973983909525
+32
+3.0
+13
+1.85826151998776
+23
+0.82973983909525
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.98213889596437
+20
+0.91251205544432
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+1.5
+12
+1.98213889596437
+22
+0.91251205544432
+32
+1.5
+13
+1.98213889596437
+23
+0.91251205544432
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+0.868083094650066
+30
+1.5
+11
+1.98213889596437
+21
+0.91251205544432
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+0.962598846298224
+30
+3.0
+11
+1.98213889596437
+21
+0.91251205544432
+31
+1.5
+12
+2.03740115370178
+22
+0.962598846298225
+32
+1.5
+13
+2.03740115370178
+23
+0.962598846298225
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.98213889596437
+20
+0.91251205544432
+30
+1.5
+11
+2.03740115370178
+21
+0.962598846298224
+31
+3.0
+12
+1.98213889596437
+22
+0.91251205544432
+32
+3.0
+13
+1.98213889596437
+23
+0.91251205544432
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.01786110403563
+20
+0.91251205544432
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+1.5
+12
+1.01786110403563
+22
+0.91251205544432
+32
+1.5
+13
+1.01786110403563
+23
+0.91251205544432
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.962598846298224
+20
+0.962598846298224
+30
+1.5
+11
+1.01786110403563
+21
+0.91251205544432
+31
+3.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+3.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+2.20214844470858
+30
+3.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+1.5
+12
+1.79083940859747
+22
+2.20214844470858
+32
+1.5
+13
+1.79083940859747
+23
+2.20214844470858
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.85826151998776
+20
+2.17026016090475
+30
+1.5
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+3.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.9222333770949
+30
+1.5
+11
+2.08748794455568
+21
+1.98213889596437
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.08748794455568
+20
+1.98213889596437
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+1.5
+12
+2.08748794455568
+22
+1.98213889596437
+32
+1.5
+13
+2.08748794455568
+23
+1.98213889596437
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.25634039227087
+20
+1.57449302665047
+30
+1.5
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+3.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310645
+20
+1.64826864473226
+30
+3.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+1.5
+12
+2.24539681310646
+22
+1.64826864473226
+32
+1.5
+13
+2.24539681310646
+23
+1.64826864473226
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+2.13191690534993
+30
+3.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+1.5
+12
+1.9222333770949
+22
+2.13191690534994
+32
+1.5
+13
+1.9222333770949
+23
+2.13191690534994
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.98213889596437
+20
+2.08748794455568
+30
+1.5
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+3.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+1.5
+12
+1.98213889596437
+22
+2.08748794455568
+32
+1.5
+13
+1.98213889596437
+23
+2.08748794455568
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+2.03740115370178
+30
+1.5
+11
+1.98213889596437
+21
+2.08748794455568
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.72061635471339
+20
+2.22727465515648
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+1.5
+12
+1.72061635471339
+22
+2.22727465515648
+32
+1.5
+13
+1.72061635471339
+23
+2.22727465515648
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+2.20214844470858
+30
+1.5
+11
+1.72061635471339
+21
+2.22727465515648
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.79083940859747
+30
+1.5
+11
+2.17026016090475
+21
+1.85826151998776
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.17026016090475
+20
+1.85826151998776
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+1.5
+12
+2.17026016090475
+22
+1.85826151998776
+32
+1.5
+13
+2.17026016090475
+23
+1.85826151998776
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.14173848001224
+20
+0.82973983909525
+30
+3.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+1.5
+12
+1.14173848001224
+22
+0.829739839095251
+32
+1.5
+13
+1.14173848001224
+23
+0.829739839095251
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.0777666229051
+20
+0.868083094650066
+30
+1.5
+11
+1.14173848001224
+21
+0.82973983909525
+31
+3.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+3.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+0.797851555291422
+30
+3.0
+11
+1.72061635471339
+21
+0.772725344843522
+31
+1.5
+12
+1.79083940859747
+22
+0.797851555291422
+32
+1.5
+13
+1.79083940859747
+23
+0.797851555291422
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.72061635471339
+20
+0.772725344843522
+30
+1.5
+11
+1.79083940859747
+21
+0.797851555291422
+31
+3.0
+12
+1.72061635471339
+22
+0.772725344843521
+32
+3.0
+13
+1.72061635471339
+23
+0.772725344843521
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.743659607729131
+20
+1.57449302665047
+30
+3.0
+11
+0.74
+21
+1.5
+31
+1.5
+12
+0.74
+22
+1.5
+32
+3.0
+13
+0.74
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.74
+20
+1.5
+30
+1.5
+11
+0.743659607729131
+21
+1.57449302665047
+31
+3.0
+12
+0.74365960772913
+22
+1.57449302665047
+32
+1.5
+13
+0.74365960772913
+23
+1.57449302665047
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.772725344843521
+20
+1.72061635471339
+30
+3.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+1.5
+12
+0.754603186893545
+22
+1.64826864473226
+32
+3.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.754603186893545
+20
+1.64826864473226
+30
+1.5
+11
+0.772725344843521
+21
+1.72061635471339
+31
+3.0
+12
+0.772725344843522
+22
+1.72061635471339
+32
+1.5
+13
+0.772725344843522
+23
+1.72061635471339
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.08748794455568
+20
+1.98213889596437
+30
+1.5
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+3.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+1.5
+12
+2.03740115370178
+22
+2.03740115370178
+32
+1.5
+13
+2.03740115370178
+23
+2.03740115370178
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.72061635471339
+20
+0.772725344843521
+30
+3.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+1.5
+12
+1.72061635471339
+22
+0.772725344843522
+32
+1.5
+13
+1.72061635471339
+23
+0.772725344843522
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.64826864473226
+20
+0.754603186893545
+30
+1.5
+11
+1.72061635471339
+21
+0.772725344843521
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+1.5
+12
+0.962598846298224
+22
+0.962598846298224
+32
+1.5
+13
+0.962598846298224
+23
+0.962598846298224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.91251205544432
+20
+1.01786110403563
+30
+1.5
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+3.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.797851555291422
+20
+1.20916059140253
+30
+3.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+1.5
+12
+0.82973983909525
+22
+1.14173848001224
+32
+3.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.82973983909525
+20
+1.14173848001224
+30
+1.5
+11
+0.797851555291422
+21
+1.20916059140253
+31
+3.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+1.5
+13
+0.797851555291422
+23
+1.20916059140253
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.0777666229051
+30
+1.5
+11
+2.17026016090475
+21
+1.14173848001224
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.17026016090475
+20
+1.14173848001224
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+1.5
+12
+2.17026016090475
+22
+1.14173848001224
+32
+1.5
+13
+2.17026016090475
+23
+1.14173848001224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.20916059140253
+30
+1.5
+11
+2.17026016090475
+21
+1.14173848001224
+31
+3.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+1.5
+13
+2.17026016090475
+23
+1.14173848001224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.17026016090475
+20
+1.14173848001224
+30
+3.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+1.5
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.868083094650066
+20
+1.0777666229051
+30
+3.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+1.5
+12
+0.868083094650066
+22
+1.0777666229051
+32
+1.5
+13
+0.868083094650066
+23
+1.0777666229051
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.82973983909525
+20
+1.14173848001224
+30
+1.5
+11
+0.868083094650066
+21
+1.0777666229051
+31
+3.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+3.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310646
+20
+1.35173135526774
+30
+1.5
+11
+2.22727465515648
+21
+1.27938364528661
+31
+3.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+1.5
+13
+2.22727465515648
+23
+1.27938364528661
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.22727465515648
+20
+1.27938364528661
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+1.5
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.22727465515648
+20
+1.27938364528661
+30
+1.5
+11
+2.20214844470858
+21
+1.20916059140253
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+1.5
+13
+2.20214844470858
+23
+1.20916059140253
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+1.5
+12
+2.22727465515648
+22
+1.27938364528661
+32
+3.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.26
+20
+1.5
+30
+1.5
+11
+2.25634039227087
+21
+1.42550697334953
+31
+3.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+1.5
+13
+2.25634039227087
+23
+1.42550697334953
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.25634039227087
+20
+1.42550697334953
+30
+3.0
+11
+2.26
+21
+1.5
+31
+1.5
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.64826864473226
+20
+0.754603186893545
+30
+3.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+1.5
+12
+1.64826864473226
+22
+0.754603186893545
+32
+1.5
+13
+1.64826864473226
+23
+0.754603186893545
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.57449302665047
+20
+0.743659607729131
+30
+1.5
+11
+1.64826864473226
+21
+0.754603186893545
+31
+3.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+3.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.91251205544432
+20
+1.01786110403563
+30
+3.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+1.5
+12
+0.91251205544432
+22
+1.01786110403563
+32
+1.5
+13
+0.91251205544432
+23
+1.01786110403563
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.868083094650066
+20
+1.0777666229051
+30
+1.5
+11
+0.91251205544432
+21
+1.01786110403563
+31
+3.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+3.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.0777666229051
+20
+0.868083094650066
+30
+3.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+1.5
+12
+1.0777666229051
+22
+0.868083094650066
+32
+1.5
+13
+1.0777666229051
+23
+0.868083094650066
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.01786110403563
+20
+0.91251205544432
+30
+1.5
+11
+1.0777666229051
+21
+0.868083094650066
+31
+3.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+3.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.74
+20
+1.5
+30
+3.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+1.5
+12
+0.743659607729131
+22
+1.42550697334953
+32
+3.0
+13
+0.743659607729131
+23
+1.42550697334953
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.743659607729131
+20
+1.42550697334953
+30
+1.5
+11
+0.74
+21
+1.5
+31
+3.0
+12
+0.74
+22
+1.5
+32
+1.5
+13
+0.74
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.743659607729131
+20
+1.42550697334953
+30
+3.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+1.5
+12
+0.754603186893545
+22
+1.35173135526774
+32
+3.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.754603186893545
+20
+1.35173135526774
+30
+1.5
+11
+0.743659607729131
+21
+1.42550697334953
+31
+3.0
+12
+0.743659607729131
+22
+1.42550697334953
+32
+1.5
+13
+0.743659607729131
+23
+1.42550697334953
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.754603186893545
+20
+1.35173135526774
+30
+3.0
+11
+0.772725344843521
+21
+1.27938364528661
+31
+1.5
+12
+0.772725344843522
+22
+1.27938364528661
+32
+3.0
+13
+0.772725344843522
+23
+1.27938364528661
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.772725344843521
+20
+1.27938364528661
+30
+1.5
+11
+0.754603186893545
+21
+1.35173135526774
+31
+3.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+1.5
+13
+0.754603186893545
+23
+1.35173135526774
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.772725344843522
+20
+1.27938364528661
+30
+3.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+1.5
+12
+0.797851555291422
+22
+1.20916059140253
+32
+3.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.797851555291422
+20
+1.20916059140253
+30
+1.5
+11
+0.772725344843522
+21
+1.27938364528661
+31
+3.0
+12
+0.772725344843521
+22
+1.27938364528661
+32
+1.5
+13
+0.772725344843521
+23
+1.27938364528661
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.14173848001224
+20
+2.17026016090475
+30
+3.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+1.5
+12
+1.14173848001224
+22
+2.17026016090475
+32
+1.5
+13
+1.14173848001224
+23
+2.17026016090475
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.20916059140253
+20
+2.20214844470858
+30
+1.5
+11
+1.14173848001224
+21
+2.17026016090475
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310646
+20
+1.35173135526774
+30
+3.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+3.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+3.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310646
+20
+1.35173135526774
+30
+3.0
+11
+2.26
+21
+1.5
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.26
+20
+1.5
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+3.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.772725344843522
+20
+1.27938364528661
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+3.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.772725344843522
+21
+1.27938364528661
+31
+3.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+3.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.82973983909525
+20
+1.14173848001224
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+3.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+3.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+3.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+3.0
+12
+0.74
+22
+1.5
+32
+3.0
+13
+0.74
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.743659607729131
+20
+1.57449302665047
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+3.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.91251205544432
+20
+1.01786110403563
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+3.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+3.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+3.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.01786110403563
+20
+0.91251205544432
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+3.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+3.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+3.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.14173848001224
+20
+0.82973983909525
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+3.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+3.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+3.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+0.868083094650066
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+0.962598846298224
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.98213889596437
+22
+0.91251205544432
+32
+3.0
+13
+1.98213889596437
+23
+0.91251205544432
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.27938364528661
+20
+0.772725344843521
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+3.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+0.74
+30
+3.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.64826864473226
+20
+0.754603186893545
+30
+3.0
+11
+1.5
+21
+0.74
+31
+3.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+3.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.64826864473226
+20
+2.24539681310646
+30
+3.0
+11
+1.5
+21
+2.26
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+2.26
+30
+3.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+3.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+3.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+2.20214844470858
+30
+3.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.64826864473226
+20
+2.24539681310646
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+3.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.42550697334953
+20
+2.25634039227087
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.27938364528661
+20
+2.22727465515648
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.14173848001224
+20
+2.17026016090475
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+2.13191690534993
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+2.20214844470858
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+3.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+2.13191690534993
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+3.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.64826864473226
+20
+0.754603186893545
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+0.797851555291422
+30
+3.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+3.0
+12
+1.72061635471339
+22
+0.772725344843521
+32
+3.0
+13
+1.72061635471339
+23
+0.772725344843521
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.01786110403563
+20
+2.08748794455568
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.91251205544432
+20
+1.98213889596437
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.82973983909525
+20
+1.85826151998776
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.9222333770949
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+3.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.79083940859747
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.9222333770949
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+3.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.0777666229051
+30
+3.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+3.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+0.797851555291422
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+0.868083094650066
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+3.0
+12
+1.85826151998776
+22
+0.82973983909525
+32
+3.0
+13
+1.85826151998776
+23
+0.82973983909525
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+0.962598846298224
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.0777666229051
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+3.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+3.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.26
+20
+1.5
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310645
+20
+1.64826864473226
+30
+3.0
+11
+2.26
+21
+1.5
+31
+3.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+3.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310645
+20
+1.64826864473226
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.79083940859747
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+3.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+3.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+3.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.772725344843521
+20
+1.72061635471339
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.743659607729131
+20
+1.42550697334953
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.74
+22
+1.5
+32
+3.0
+13
+0.74
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+3.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+3.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310646
+20
+1.35173135526774
+30
+1.5
+11
+2.20214844470858
+21
+1.20916059140253
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.20916059140253
+30
+1.5
+11
+2.24539681310646
+21
+1.35173135526774
+31
+1.5
+12
+2.22727465515648
+22
+1.27938364528661
+32
+1.5
+13
+2.22727465515648
+23
+1.27938364528661
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.26
+20
+1.5
+30
+1.5
+11
+2.24539681310646
+21
+1.35173135526774
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310646
+20
+1.35173135526774
+30
+1.5
+11
+2.26
+21
+1.5
+31
+1.5
+12
+2.25634039227087
+22
+1.42550697334953
+32
+1.5
+13
+2.25634039227087
+23
+1.42550697334953
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.0777666229051
+30
+1.5
+11
+2.03740115370178
+21
+0.962598846298225
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+0.962598846298225
+30
+1.5
+11
+2.13191690534993
+21
+1.0777666229051
+31
+1.5
+12
+2.08748794455568
+22
+1.01786110403563
+32
+1.5
+13
+2.08748794455568
+23
+1.01786110403563
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.20916059140253
+30
+1.5
+11
+2.13191690534993
+21
+1.0777666229051
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.0777666229051
+30
+1.5
+11
+2.20214844470858
+21
+1.20916059140253
+31
+1.5
+12
+2.17026016090475
+22
+1.14173848001224
+32
+1.5
+13
+2.17026016090475
+23
+1.14173848001224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.42550697334953
+20
+2.25634039227087
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.35173135526774
+22
+2.24539681310646
+32
+1.5
+13
+1.35173135526774
+23
+2.24539681310646
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.42550697334953
+21
+2.25634039227087
+31
+1.5
+12
+1.5
+22
+2.26
+32
+1.5
+13
+1.5
+23
+2.26
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.27938364528661
+20
+2.22727465515648
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.20916059140253
+22
+2.20214844470858
+32
+1.5
+13
+1.20916059140253
+23
+2.20214844470858
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.27938364528661
+21
+2.22727465515648
+31
+1.5
+12
+1.35173135526774
+22
+2.24539681310646
+32
+1.5
+13
+1.35173135526774
+23
+2.24539681310646
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.79083940859747
+30
+1.5
+11
+2.24539681310646
+21
+1.64826864473226
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310646
+20
+1.64826864473226
+30
+1.5
+11
+2.20214844470858
+21
+1.79083940859747
+31
+1.5
+12
+2.22727465515648
+22
+1.72061635471339
+32
+1.5
+13
+2.22727465515648
+23
+1.72061635471339
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.24539681310646
+20
+1.64826864473226
+30
+1.5
+11
+2.26
+21
+1.5
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.26
+20
+1.5
+30
+1.5
+11
+2.24539681310646
+21
+1.64826864473226
+31
+1.5
+12
+2.25634039227087
+22
+1.57449302665047
+32
+1.5
+13
+2.25634039227087
+23
+1.57449302665047
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+0.797851555291422
+30
+1.5
+11
+1.64826864473226
+21
+0.754603186893545
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.64826864473226
+20
+0.754603186893545
+30
+1.5
+11
+1.79083940859747
+21
+0.797851555291422
+31
+1.5
+12
+1.72061635471339
+22
+0.772725344843522
+32
+1.5
+13
+1.72061635471339
+23
+0.772725344843522
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+0.868083094650066
+30
+1.5
+11
+1.79083940859747
+21
+0.797851555291422
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+0.797851555291422
+30
+1.5
+11
+1.9222333770949
+21
+0.868083094650066
+31
+1.5
+12
+1.85826151998776
+22
+0.829739839095251
+32
+1.5
+13
+1.85826151998776
+23
+0.829739839095251
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+2.13191690534994
+30
+1.5
+11
+2.03740115370178
+21
+2.03740115370178
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+2.03740115370178
+30
+1.5
+11
+1.9222333770949
+21
+2.13191690534994
+31
+1.5
+12
+1.98213889596437
+22
+2.08748794455568
+32
+1.5
+13
+1.98213889596437
+23
+2.08748794455568
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+2.03740115370178
+30
+1.5
+11
+2.13191690534993
+21
+1.9222333770949
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.9222333770949
+30
+1.5
+11
+2.03740115370178
+21
+2.03740115370178
+31
+1.5
+12
+2.08748794455568
+22
+1.98213889596437
+32
+1.5
+13
+2.08748794455568
+23
+1.98213889596437
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.91251205544432
+21
+1.01786110403563
+31
+1.5
+12
+0.868083094650066
+22
+1.0777666229051
+32
+1.5
+13
+0.868083094650066
+23
+1.0777666229051
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.91251205544432
+20
+1.01786110403563
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.962598846298224
+22
+0.962598846298224
+32
+1.5
+13
+0.962598846298224
+23
+0.962598846298224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.82973983909525
+21
+1.14173848001224
+31
+1.5
+12
+0.797851555291422
+22
+1.20916059140253
+32
+1.5
+13
+0.797851555291422
+23
+1.20916059140253
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.82973983909525
+20
+1.14173848001224
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.868083094650066
+22
+1.0777666229051
+32
+1.5
+13
+0.868083094650066
+23
+1.0777666229051
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.01786110403563
+21
+0.91251205544432
+31
+1.5
+12
+0.962598846298224
+22
+0.962598846298224
+32
+1.5
+13
+0.962598846298224
+23
+0.962598846298224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.01786110403563
+20
+0.91251205544432
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.0777666229051
+22
+0.868083094650066
+32
+1.5
+13
+1.0777666229051
+23
+0.868083094650066
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.14173848001224
+21
+0.829739839095251
+31
+1.5
+12
+1.0777666229051
+22
+0.868083094650066
+32
+1.5
+13
+1.0777666229051
+23
+0.868083094650066
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.14173848001224
+20
+0.829739839095251
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.20916059140253
+22
+0.797851555291422
+32
+1.5
+13
+1.20916059140253
+23
+0.797851555291422
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.42550697334953
+21
+0.74365960772913
+31
+1.5
+12
+1.35173135526774
+22
+0.754603186893545
+32
+1.5
+13
+1.35173135526774
+23
+0.754603186893545
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.42550697334953
+20
+0.74365960772913
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+0.74
+32
+1.5
+13
+1.5
+23
+0.74
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.57449302665047
+21
+0.743659607729131
+31
+1.5
+12
+1.5
+22
+0.74
+32
+1.5
+13
+1.5
+23
+0.74
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.57449302665047
+20
+0.743659607729131
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.64826864473226
+22
+0.754603186893545
+32
+1.5
+13
+1.64826864473226
+23
+0.754603186893545
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.57449302665047
+20
+2.25634039227087
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+2.26
+32
+1.5
+13
+1.5
+23
+2.26
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.57449302665047
+21
+2.25634039227087
+31
+1.5
+12
+1.64826864473226
+22
+2.24539681310646
+32
+1.5
+13
+1.64826864473226
+23
+2.24539681310646
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.64826864473226
+20
+2.24539681310646
+30
+1.5
+11
+1.79083940859747
+21
+2.20214844470858
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+2.20214844470858
+30
+1.5
+11
+1.64826864473226
+21
+2.24539681310646
+31
+1.5
+12
+1.72061635471339
+22
+2.22727465515648
+32
+1.5
+13
+1.72061635471339
+23
+2.22727465515648
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.743659607729131
+21
+1.42550697334953
+31
+1.5
+12
+0.74
+22
+1.5
+32
+1.5
+13
+0.74
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.743659607729131
+20
+1.42550697334953
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.754603186893545
+22
+1.35173135526774
+32
+1.5
+13
+0.754603186893545
+23
+1.35173135526774
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.74365960772913
+20
+1.57449302665047
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.74
+22
+1.5
+32
+1.5
+13
+0.74
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.74365960772913
+21
+1.57449302665047
+31
+1.5
+12
+0.754603186893545
+22
+1.64826864473226
+32
+1.5
+13
+0.754603186893545
+23
+1.64826864473226
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.82973983909525
+20
+1.85826151998776
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.797851555291422
+22
+1.79083940859747
+32
+1.5
+13
+0.797851555291422
+23
+1.79083940859747
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.82973983909525
+21
+1.85826151998776
+31
+1.5
+12
+0.868083094650066
+22
+1.9222333770949
+32
+1.5
+13
+0.868083094650066
+23
+1.9222333770949
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.772725344843522
+20
+1.72061635471339
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.754603186893545
+22
+1.64826864473226
+32
+1.5
+13
+0.754603186893545
+23
+1.64826864473226
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.772725344843522
+21
+1.72061635471339
+31
+1.5
+12
+0.797851555291422
+22
+1.79083940859747
+32
+1.5
+13
+0.797851555291422
+23
+1.79083940859747
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.01786110403563
+20
+2.08748794455568
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.962598846298224
+22
+2.03740115370178
+32
+1.5
+13
+0.962598846298224
+23
+2.03740115370178
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.01786110403563
+21
+2.08748794455568
+31
+1.5
+12
+1.0777666229051
+22
+2.13191690534993
+32
+1.5
+13
+1.0777666229051
+23
+2.13191690534993
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.91251205544432
+20
+1.98213889596437
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.868083094650066
+22
+1.9222333770949
+32
+1.5
+13
+0.868083094650066
+23
+1.9222333770949
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.91251205544432
+21
+1.98213889596437
+31
+1.5
+12
+0.962598846298224
+22
+2.03740115370178
+32
+1.5
+13
+0.962598846298224
+23
+2.03740115370178
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.79083940859747
+20
+2.20214844470858
+30
+1.5
+11
+1.9222333770949
+21
+2.13191690534994
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+2.13191690534994
+30
+1.5
+11
+1.79083940859747
+21
+2.20214844470858
+31
+1.5
+12
+1.85826151998776
+22
+2.17026016090475
+32
+1.5
+13
+1.85826151998776
+23
+2.17026016090475
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.27938364528661
+21
+0.772725344843521
+31
+1.5
+12
+1.20916059140253
+22
+0.797851555291422
+32
+1.5
+13
+1.20916059140253
+23
+0.797851555291422
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.27938364528661
+20
+0.772725344843521
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.35173135526774
+22
+0.754603186893545
+32
+1.5
+13
+1.35173135526774
+23
+0.754603186893545
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.13191690534993
+20
+1.9222333770949
+30
+1.5
+11
+2.20214844470858
+21
+1.79083940859747
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.20214844470858
+20
+1.79083940859747
+30
+1.5
+11
+2.13191690534993
+21
+1.9222333770949
+31
+1.5
+12
+2.17026016090475
+22
+1.85826151998776
+32
+1.5
+13
+2.17026016090475
+23
+1.85826151998776
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+2.03740115370178
+20
+0.962598846298225
+30
+1.5
+11
+1.9222333770949
+21
+0.868083094650066
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.9222333770949
+20
+0.868083094650066
+30
+1.5
+11
+2.03740115370178
+21
+0.962598846298225
+31
+1.5
+12
+1.98213889596437
+22
+0.91251205544432
+32
+1.5
+13
+1.98213889596437
+23
+0.91251205544432
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.14173848001224
+20
+2.17026016090475
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.0777666229051
+22
+2.13191690534993
+32
+1.5
+13
+1.0777666229051
+23
+2.13191690534993
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.14173848001224
+21
+2.17026016090475
+31
+1.5
+12
+1.20916059140253
+22
+2.20214844470858
+32
+1.5
+13
+1.20916059140253
+23
+2.20214844470858
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.772725344843521
+21
+1.27938364528661
+31
+1.5
+12
+0.754603186893545
+22
+1.35173135526774
+32
+1.5
+13
+0.754603186893545
+23
+1.35173135526774
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_a
+10
+0.772725344843521
+20
+1.27938364528661
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.797851555291422
+22
+1.20916059140253
+32
+1.5
+13
+0.797851555291422
+23
+1.20916059140253
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310646
+20
+1.64826864473226
+30
+0.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+1.5
+12
+2.24539681310645
+22
+1.64826864473226
+32
+1.5
+13
+2.24539681310645
+23
+1.64826864473226
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.22727465515648
+20
+1.72061635471339
+30
+1.5
+11
+2.24539681310646
+21
+1.64826864473226
+31
+0.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+0.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.01786110403563
+20
+2.08748794455568
+30
+1.5
+11
+1.0777666229051
+21
+2.13191690534993
+31
+0.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+0.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.0777666229051
+20
+2.13191690534993
+30
+0.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+1.5
+12
+1.0777666229051
+22
+2.13191690534993
+32
+1.5
+13
+1.0777666229051
+23
+2.13191690534993
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.85826151998776
+20
+2.17026016090475
+30
+1.5
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+0.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+2.13191690534993
+30
+0.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+1.5
+12
+1.9222333770949
+22
+2.13191690534993
+32
+1.5
+13
+1.9222333770949
+23
+2.13191690534993
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.85826151998776
+20
+0.82973983909525
+30
+1.5
+11
+1.79083940859747
+21
+0.797851555291422
+31
+0.0
+12
+1.85826151998776
+22
+0.829739839095251
+32
+0.0
+13
+1.85826151998776
+23
+0.829739839095251
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+0.797851555291422
+30
+0.0
+11
+1.85826151998776
+21
+0.82973983909525
+31
+1.5
+12
+1.79083940859747
+22
+0.797851555291422
+32
+1.5
+13
+1.79083940859747
+23
+0.797851555291422
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.0777666229051
+20
+2.13191690534993
+30
+1.5
+11
+1.14173848001224
+21
+2.17026016090475
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.14173848001224
+20
+2.17026016090475
+30
+0.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+1.5
+12
+1.14173848001224
+22
+2.17026016090475
+32
+1.5
+13
+1.14173848001224
+23
+2.17026016090475
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.35173135526774
+20
+0.754603186893545
+30
+1.5
+11
+1.27938364528661
+21
+0.772725344843521
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.27938364528661
+20
+0.772725344843521
+30
+0.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+1.5
+12
+1.27938364528661
+22
+0.772725344843521
+32
+1.5
+13
+1.27938364528661
+23
+0.772725344843521
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.42550697334953
+20
+0.743659607729131
+30
+1.5
+11
+1.35173135526774
+21
+0.754603186893545
+31
+0.0
+12
+1.42550697334953
+22
+0.74365960772913
+32
+0.0
+13
+1.42550697334953
+23
+0.74365960772913
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.35173135526774
+20
+0.754603186893545
+30
+0.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+1.5
+12
+1.35173135526774
+22
+0.754603186893545
+32
+1.5
+13
+1.35173135526774
+23
+0.754603186893545
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+0.74
+30
+1.5
+11
+1.42550697334953
+21
+0.74365960772913
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.42550697334953
+20
+0.74365960772913
+30
+0.0
+11
+1.5
+21
+0.74
+31
+1.5
+12
+1.42550697334953
+22
+0.743659607729131
+32
+1.5
+13
+1.42550697334953
+23
+0.743659607729131
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.57449302665047
+20
+0.743659607729131
+30
+1.5
+11
+1.5
+21
+0.74
+31
+0.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+0.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+0.74
+30
+0.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+1.5
+12
+1.5
+22
+0.74
+32
+1.5
+13
+1.5
+23
+0.74
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.08748794455568
+20
+1.01786110403563
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+1.5
+12
+2.08748794455568
+22
+1.01786110403563
+32
+1.5
+13
+2.08748794455568
+23
+1.01786110403563
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.0777666229051
+30
+1.5
+11
+2.08748794455568
+21
+1.01786110403563
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.27938364528661
+20
+0.772725344843521
+30
+1.5
+11
+1.20916059140253
+21
+0.797851555291422
+31
+0.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+0.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.20916059140253
+20
+0.797851555291422
+30
+0.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+1.5
+12
+1.20916059140253
+22
+0.797851555291422
+32
+1.5
+13
+1.20916059140253
+23
+0.797851555291422
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.26
+20
+1.5
+30
+0.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+1.5
+12
+2.26
+22
+1.5
+32
+1.5
+13
+2.26
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.25634039227087
+20
+1.57449302665047
+30
+1.5
+11
+2.26
+21
+1.5
+31
+0.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+0.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.754603186893545
+20
+1.64826864473226
+30
+1.5
+11
+0.74365960772913
+21
+1.57449302665047
+31
+0.0
+12
+0.743659607729131
+22
+1.57449302665047
+32
+1.5
+13
+0.743659607729131
+23
+1.57449302665047
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.74365960772913
+20
+1.57449302665047
+30
+0.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+1.5
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+2.24539681310646
+30
+1.5
+11
+1.72061635471339
+21
+2.22727465515648
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310646
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310646
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.72061635471339
+20
+2.22727465515648
+30
+0.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+1.5
+12
+1.72061635471339
+22
+2.22727465515648
+32
+1.5
+13
+1.72061635471339
+23
+2.22727465515648
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.57449302665047
+20
+2.25634039227087
+30
+1.5
+11
+1.64826864473226
+21
+2.24539681310646
+31
+0.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+0.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+2.24539681310646
+30
+0.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+1.5
+12
+1.64826864473226
+22
+2.24539681310646
+32
+1.5
+13
+1.64826864473226
+23
+2.24539681310646
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.962598846298224
+20
+2.03740115370178
+30
+1.5
+11
+1.01786110403563
+21
+2.08748794455568
+31
+0.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+0.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.01786110403563
+20
+2.08748794455568
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+1.5
+12
+1.01786110403563
+22
+2.08748794455568
+32
+1.5
+13
+1.01786110403563
+23
+2.08748794455568
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.962598846298224
+20
+2.03740115370178
+30
+1.5
+11
+0.91251205544432
+21
+1.98213889596437
+31
+0.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+1.5
+13
+0.91251205544432
+23
+1.98213889596437
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.91251205544432
+20
+1.98213889596437
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+1.5
+12
+0.962598846298224
+22
+2.03740115370178
+32
+0.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.82973983909525
+20
+1.85826151998776
+30
+1.5
+11
+0.868083094650066
+21
+1.9222333770949
+31
+0.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+0.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.868083094650066
+20
+1.9222333770949
+30
+0.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+1.5
+12
+0.868083094650066
+22
+1.9222333770949
+32
+1.5
+13
+0.868083094650066
+23
+1.9222333770949
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.82973983909525
+20
+1.85826151998776
+30
+1.5
+11
+0.797851555291422
+21
+1.79083940859747
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+1.5
+13
+0.797851555291422
+23
+1.79083940859747
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.797851555291422
+20
+1.79083940859747
+30
+0.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+1.5
+12
+0.82973983909525
+22
+1.85826151998776
+32
+0.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.797851555291422
+20
+1.79083940859747
+30
+1.5
+11
+0.772725344843522
+21
+1.72061635471339
+31
+0.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+1.5
+13
+0.772725344843521
+23
+1.72061635471339
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.772725344843522
+20
+1.72061635471339
+30
+0.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+1.5
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+2.26
+30
+1.5
+11
+1.57449302665047
+21
+2.25634039227087
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.57449302665047
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+2.26
+31
+1.5
+12
+1.57449302665047
+22
+2.25634039227087
+32
+1.5
+13
+1.57449302665047
+23
+2.25634039227087
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.42550697334953
+20
+2.25634039227087
+30
+1.5
+11
+1.5
+21
+2.26
+31
+0.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+0.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+2.26
+30
+0.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+1.5
+12
+1.5
+22
+2.26
+32
+1.5
+13
+1.5
+23
+2.26
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.35173135526774
+20
+2.24539681310645
+30
+1.5
+11
+1.42550697334953
+21
+2.25634039227087
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.42550697334953
+20
+2.25634039227087
+30
+0.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+1.5
+12
+1.42550697334953
+22
+2.25634039227087
+32
+1.5
+13
+1.42550697334953
+23
+2.25634039227087
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.27938364528661
+20
+2.22727465515648
+30
+1.5
+11
+1.35173135526774
+21
+2.24539681310645
+31
+0.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+0.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.35173135526774
+20
+2.24539681310645
+30
+0.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+1.5
+12
+1.35173135526774
+22
+2.24539681310645
+32
+1.5
+13
+1.35173135526774
+23
+2.24539681310645
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.20916059140253
+20
+2.20214844470858
+30
+1.5
+11
+1.27938364528661
+21
+2.22727465515648
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.27938364528661
+20
+2.22727465515648
+30
+0.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+1.5
+12
+1.27938364528661
+22
+2.22727465515648
+32
+1.5
+13
+1.27938364528661
+23
+2.22727465515648
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.17026016090475
+20
+1.85826151998776
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+1.5
+12
+2.17026016090475
+22
+1.85826151998776
+32
+1.5
+13
+2.17026016090475
+23
+1.85826151998776
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.9222333770949
+30
+1.5
+11
+2.17026016090475
+21
+1.85826151998776
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.91251205544432
+20
+1.98213889596437
+30
+1.5
+11
+0.868083094650066
+21
+1.9222333770949
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+1.5
+13
+0.868083094650066
+23
+1.9222333770949
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.868083094650066
+20
+1.9222333770949
+30
+0.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+1.5
+12
+0.91251205544432
+22
+1.98213889596437
+32
+0.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+0.868083094650066
+30
+1.5
+11
+1.85826151998776
+21
+0.829739839095251
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.85826151998776
+20
+0.829739839095251
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+1.5
+12
+1.85826151998776
+22
+0.82973983909525
+32
+1.5
+13
+1.85826151998776
+23
+0.82973983909525
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.98213889596437
+20
+0.91251205544432
+30
+1.5
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+12
+1.98213889596437
+22
+0.91251205544432
+32
+0.0
+13
+1.98213889596437
+23
+0.91251205544432
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+0.868083094650066
+30
+0.0
+11
+1.98213889596437
+21
+0.91251205544432
+31
+1.5
+12
+1.9222333770949
+22
+0.868083094650066
+32
+1.5
+13
+1.9222333770949
+23
+0.868083094650066
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370178
+20
+0.962598846298224
+30
+1.5
+11
+1.98213889596437
+21
+0.91251205544432
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298225
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298225
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.98213889596437
+20
+0.91251205544432
+30
+0.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+1.5
+12
+1.98213889596437
+22
+0.91251205544432
+32
+1.5
+13
+1.98213889596437
+23
+0.91251205544432
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.01786110403563
+20
+0.91251205544432
+30
+1.5
+11
+0.962598846298224
+21
+0.962598846298224
+31
+0.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+0.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.962598846298224
+20
+0.962598846298224
+30
+0.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+1.5
+12
+0.962598846298224
+22
+0.962598846298224
+32
+1.5
+13
+0.962598846298224
+23
+0.962598846298224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+2.20214844470858
+30
+1.5
+11
+1.85826151998776
+21
+2.17026016090475
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.85826151998776
+20
+2.17026016090475
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+1.5
+12
+1.85826151998776
+22
+2.17026016090475
+32
+1.5
+13
+1.85826151998776
+23
+2.17026016090475
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.08748794455568
+20
+1.98213889596437
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+1.5
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.9222333770949
+30
+1.5
+11
+2.08748794455568
+21
+1.98213889596437
+31
+0.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+1.5
+13
+2.08748794455568
+23
+1.98213889596437
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.25634039227087
+20
+1.57449302665047
+30
+0.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+1.5
+12
+2.25634039227087
+22
+1.57449302665047
+32
+1.5
+13
+2.25634039227087
+23
+1.57449302665047
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310645
+20
+1.64826864473226
+30
+1.5
+11
+2.25634039227087
+21
+1.57449302665047
+31
+0.0
+12
+2.24539681310646
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310646
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+2.13191690534993
+30
+1.5
+11
+1.98213889596437
+21
+2.08748794455568
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.98213889596437
+20
+2.08748794455568
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+1.5
+12
+1.98213889596437
+22
+2.08748794455568
+32
+1.5
+13
+1.98213889596437
+23
+2.08748794455568
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.98213889596437
+20
+2.08748794455568
+30
+1.5
+11
+2.03740115370177
+21
+2.03740115370178
+31
+0.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+0.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370177
+20
+2.03740115370178
+30
+0.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+1.5
+12
+2.03740115370178
+22
+2.03740115370178
+32
+1.5
+13
+2.03740115370178
+23
+2.03740115370178
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.72061635471339
+20
+2.22727465515648
+30
+1.5
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+0.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+2.20214844470858
+30
+0.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+1.5
+12
+1.79083940859747
+22
+2.20214844470858
+32
+1.5
+13
+1.79083940859747
+23
+2.20214844470858
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.79083940859747
+30
+0.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+1.5
+12
+2.20214844470858
+22
+1.79083940859747
+32
+1.5
+13
+2.20214844470858
+23
+1.79083940859747
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.17026016090475
+20
+1.85826151998776
+30
+1.5
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+0.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.14173848001224
+20
+0.82973983909525
+30
+1.5
+11
+1.0777666229051
+21
+0.868083094650066
+31
+0.0
+12
+1.14173848001224
+22
+0.829739839095251
+32
+0.0
+13
+1.14173848001224
+23
+0.829739839095251
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.0777666229051
+20
+0.868083094650066
+30
+0.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+1.5
+12
+1.0777666229051
+22
+0.868083094650066
+32
+1.5
+13
+1.0777666229051
+23
+0.868083094650066
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+0.797851555291422
+30
+1.5
+11
+1.72061635471339
+21
+0.772725344843522
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.72061635471339
+20
+0.772725344843522
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+1.5
+12
+1.72061635471339
+22
+0.772725344843521
+32
+1.5
+13
+1.72061635471339
+23
+0.772725344843521
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.743659607729131
+20
+1.57449302665047
+30
+1.5
+11
+0.74
+21
+1.5
+31
+0.0
+12
+0.74
+22
+1.5
+32
+1.5
+13
+0.74
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.74
+20
+1.5
+30
+0.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+1.5
+12
+0.74365960772913
+22
+1.57449302665047
+32
+0.0
+13
+0.74365960772913
+23
+1.57449302665047
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.754603186893545
+20
+1.64826864473226
+30
+1.5
+11
+0.772725344843522
+21
+1.72061635471339
+31
+0.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.772725344843522
+20
+1.72061635471339
+30
+0.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+1.5
+12
+0.772725344843521
+22
+1.72061635471339
+32
+1.5
+13
+0.772725344843521
+23
+1.72061635471339
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370177
+20
+2.03740115370178
+30
+0.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+1.5
+12
+2.08748794455568
+22
+1.98213889596437
+32
+0.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.08748794455568
+20
+1.98213889596437
+30
+1.5
+11
+2.03740115370177
+21
+2.03740115370178
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+1.5
+13
+2.03740115370178
+23
+2.03740115370178
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.72061635471339
+20
+0.772725344843521
+30
+1.5
+11
+1.64826864473226
+21
+0.754603186893545
+31
+0.0
+12
+1.72061635471339
+22
+0.772725344843522
+32
+0.0
+13
+1.72061635471339
+23
+0.772725344843522
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+0.754603186893545
+30
+0.0
+11
+1.72061635471339
+21
+0.772725344843521
+31
+1.5
+12
+1.64826864473226
+22
+0.754603186893545
+32
+1.5
+13
+1.64826864473226
+23
+0.754603186893545
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.962598846298224
+20
+0.962598846298224
+30
+1.5
+11
+0.91251205544432
+21
+1.01786110403563
+31
+0.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.91251205544432
+20
+1.01786110403563
+30
+0.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+1.5
+12
+0.91251205544432
+22
+1.01786110403563
+32
+1.5
+13
+0.91251205544432
+23
+1.01786110403563
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.797851555291422
+20
+1.20916059140253
+30
+1.5
+11
+0.82973983909525
+21
+1.14173848001224
+31
+0.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+1.5
+13
+0.82973983909525
+23
+1.14173848001224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.82973983909525
+20
+1.14173848001224
+30
+0.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+1.5
+12
+0.797851555291422
+22
+1.20916059140253
+32
+0.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.0777666229051
+30
+0.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+1.5
+12
+2.13191690534993
+22
+1.0777666229051
+32
+1.5
+13
+2.13191690534993
+23
+1.0777666229051
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.17026016090475
+20
+1.14173848001224
+30
+1.5
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+0.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+1.5
+12
+2.17026016090475
+22
+1.14173848001224
+32
+0.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.17026016090475
+20
+1.14173848001224
+30
+1.5
+11
+2.20214844470858
+21
+1.20916059140253
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+1.5
+13
+2.20214844470858
+23
+1.20916059140253
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.82973983909525
+20
+1.14173848001224
+30
+1.5
+11
+0.868083094650066
+21
+1.0777666229051
+31
+0.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+1.5
+13
+0.868083094650066
+23
+1.0777666229051
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.868083094650066
+20
+1.0777666229051
+30
+0.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+1.5
+12
+0.82973983909525
+22
+1.14173848001224
+32
+0.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.22727465515648
+20
+1.27938364528661
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+1.5
+12
+2.22727465515648
+22
+1.27938364528661
+32
+1.5
+13
+2.22727465515648
+23
+1.27938364528661
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310646
+20
+1.35173135526774
+30
+1.5
+11
+2.22727465515648
+21
+1.27938364528661
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.22727465515648
+20
+1.27938364528661
+30
+0.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+1.5
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.20916059140253
+30
+1.5
+11
+2.22727465515648
+21
+1.27938364528661
+31
+0.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+1.5
+13
+2.22727465515648
+23
+1.27938364528661
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.26
+20
+1.5
+30
+0.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+1.5
+12
+2.25634039227087
+22
+1.42550697334953
+32
+0.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.25634039227087
+20
+1.42550697334953
+30
+1.5
+11
+2.26
+21
+1.5
+31
+0.0
+12
+2.26
+22
+1.5
+32
+1.5
+13
+2.26
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+0.754603186893545
+30
+1.5
+11
+1.57449302665047
+21
+0.743659607729131
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.57449302665047
+20
+0.743659607729131
+30
+0.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+1.5
+12
+1.57449302665047
+22
+0.743659607729131
+32
+1.5
+13
+1.57449302665047
+23
+0.743659607729131
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.868083094650066
+20
+1.0777666229051
+30
+1.5
+11
+0.91251205544432
+21
+1.01786110403563
+31
+0.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+1.5
+13
+0.91251205544432
+23
+1.01786110403563
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.91251205544432
+20
+1.01786110403563
+30
+0.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+1.5
+12
+0.868083094650066
+22
+1.0777666229051
+32
+0.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.0777666229051
+20
+0.868083094650066
+30
+1.5
+11
+1.01786110403563
+21
+0.91251205544432
+31
+0.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+0.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.01786110403563
+20
+0.91251205544432
+30
+0.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+1.5
+12
+1.01786110403563
+22
+0.91251205544432
+32
+1.5
+13
+1.01786110403563
+23
+0.91251205544432
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.74
+20
+1.5
+30
+1.5
+11
+0.743659607729131
+21
+1.42550697334953
+31
+0.0
+12
+0.743659607729131
+22
+1.42550697334953
+32
+1.5
+13
+0.743659607729131
+23
+1.42550697334953
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.743659607729131
+20
+1.42550697334953
+30
+0.0
+11
+0.74
+21
+1.5
+31
+1.5
+12
+0.74
+22
+1.5
+32
+0.0
+13
+0.74
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.743659607729131
+20
+1.42550697334953
+30
+1.5
+11
+0.754603186893545
+21
+1.35173135526774
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+1.5
+13
+0.754603186893545
+23
+1.35173135526774
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.754603186893545
+20
+1.35173135526774
+30
+0.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+1.5
+12
+0.743659607729131
+22
+1.42550697334953
+32
+0.0
+13
+0.743659607729131
+23
+1.42550697334953
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.754603186893545
+20
+1.35173135526774
+30
+1.5
+11
+0.772725344843521
+21
+1.27938364528661
+31
+0.0
+12
+0.772725344843522
+22
+1.27938364528661
+32
+1.5
+13
+0.772725344843522
+23
+1.27938364528661
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.772725344843521
+20
+1.27938364528661
+30
+0.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+1.5
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.772725344843522
+20
+1.27938364528661
+30
+1.5
+11
+0.797851555291422
+21
+1.20916059140253
+31
+0.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+1.5
+13
+0.797851555291422
+23
+1.20916059140253
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.797851555291422
+20
+1.20916059140253
+30
+0.0
+11
+0.772725344843522
+21
+1.27938364528661
+31
+1.5
+12
+0.772725344843521
+22
+1.27938364528661
+32
+0.0
+13
+0.772725344843521
+23
+1.27938364528661
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.14173848001224
+20
+2.17026016090475
+30
+1.5
+11
+1.20916059140253
+21
+2.20214844470858
+31
+0.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+0.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.20916059140253
+20
+2.20214844470858
+30
+0.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+1.5
+12
+1.20916059140253
+22
+2.20214844470858
+32
+1.5
+13
+1.20916059140253
+23
+2.20214844470858
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.42550697334953
+21
+0.74365960772913
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.42550697334953
+20
+0.74365960772913
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.25634039227087
+20
+1.42550697334953
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+1.5
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310646
+20
+1.35173135526774
+30
+1.5
+11
+2.25634039227087
+21
+1.42550697334953
+31
+0.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+1.5
+13
+2.25634039227087
+23
+1.42550697334953
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370178
+20
+0.962598846298225
+30
+0.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+1.5
+12
+2.03740115370178
+22
+0.962598846298224
+32
+1.5
+13
+2.03740115370178
+23
+0.962598846298224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.08748794455568
+20
+1.01786110403563
+30
+1.5
+11
+2.03740115370178
+21
+0.962598846298225
+31
+0.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+0.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.22727465515648
+20
+1.72061635471339
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+1.5
+12
+2.22727465515648
+22
+1.72061635471339
+32
+1.5
+13
+2.22727465515648
+23
+1.72061635471339
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.79083940859747
+30
+1.5
+11
+2.22727465515648
+21
+1.72061635471339
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.20916059140253
+20
+0.797851555291422
+30
+1.5
+11
+1.14173848001224
+21
+0.829739839095251
+31
+0.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+0.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.14173848001224
+20
+0.829739839095251
+30
+0.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+1.5
+12
+1.14173848001224
+22
+0.82973983909525
+32
+1.5
+13
+1.14173848001224
+23
+0.82973983909525
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310645
+20
+1.64826864473226
+30
+1.5
+11
+2.20214844470858
+21
+1.79083940859747
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.79083940859747
+30
+1.5
+11
+2.24539681310645
+21
+1.64826864473226
+31
+1.5
+12
+2.22727465515648
+22
+1.72061635471339
+32
+1.5
+13
+2.22727465515648
+23
+1.72061635471339
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.74365960772913
+20
+1.57449302665047
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.74
+22
+1.5
+32
+0.0
+13
+0.74
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.74365960772913
+21
+1.57449302665047
+31
+0.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+2.24539681310646
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+2.20214844470858
+30
+0.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+0.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+0.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310646
+20
+1.35173135526774
+30
+0.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+0.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.14173848001224
+21
+0.829739839095251
+31
+0.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+0.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.14173848001224
+20
+0.829739839095251
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+0.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+2.26
+30
+0.0
+11
+1.64826864473226
+21
+2.24539681310646
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+2.24539681310646
+30
+0.0
+11
+1.5
+21
+2.26
+31
+0.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+0.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+2.13191690534993
+30
+0.0
+11
+2.03740115370177
+21
+2.03740115370178
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370177
+20
+2.03740115370178
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+0.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+0.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+0.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.27938364528661
+20
+0.772725344843521
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+0.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+0.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.91251205544432
+20
+1.01786110403563
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+2.20214844470858
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+2.13191690534993
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+0.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.9222333770949
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.79083940859747
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+0.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+0.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.01786110403563
+20
+0.91251205544432
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+0.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.772725344843521
+21
+1.27938364528661
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.772725344843521
+20
+1.27938364528661
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+0.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370177
+20
+2.03740115370178
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.9222333770949
+30
+0.0
+11
+2.03740115370177
+21
+2.03740115370178
+31
+0.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+0.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+0.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+0.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.82973983909525
+20
+1.14173848001224
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+0.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310646
+20
+1.64826864473226
+30
+0.0
+11
+2.26
+21
+1.5
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.26
+20
+1.5
+30
+0.0
+11
+2.24539681310646
+21
+1.64826864473226
+31
+0.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+0.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+0.0
+12
+0.74
+22
+1.5
+32
+0.0
+13
+0.74
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.743659607729131
+20
+1.42550697334953
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.79083940859747
+30
+0.0
+11
+2.24539681310646
+21
+1.64826864473226
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310646
+20
+1.64826864473226
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+0.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.82973983909525
+20
+1.85826151998776
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.26
+20
+1.5
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310646
+20
+1.35173135526774
+30
+0.0
+11
+2.26
+21
+1.5
+31
+0.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+0.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.772725344843522
+20
+1.72061635471339
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.772725344843522
+21
+1.72061635471339
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.0777666229051
+30
+0.0
+11
+2.03740115370178
+21
+0.962598846298225
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370178
+20
+0.962598846298225
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+0.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.0777666229051
+30
+0.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+0.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+0.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.01786110403563
+20
+2.08748794455568
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+0.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+0.868083094650066
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+0.797851555291422
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+12
+1.85826151998776
+22
+0.829739839095251
+32
+0.0
+13
+1.85826151998776
+23
+0.829739839095251
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.91251205544432
+20
+1.98213889596437
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+0.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+0.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370178
+20
+0.962598846298225
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+0.868083094650066
+30
+0.0
+11
+2.03740115370178
+21
+0.962598846298225
+31
+0.0
+12
+1.98213889596437
+22
+0.91251205544432
+32
+0.0
+13
+1.98213889596437
+23
+0.91251205544432
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.27938364528661
+20
+2.22727465515648
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.14173848001224
+20
+2.17026016090475
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+0.754603186893545
+30
+0.0
+11
+1.5
+21
+0.74
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+0.74
+30
+0.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+0.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+0.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+0.797851555291422
+30
+0.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+0.754603186893545
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+0.0
+12
+1.72061635471339
+22
+0.772725344843522
+32
+0.0
+13
+1.72061635471339
+23
+0.772725344843522
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.42550697334953
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.79083940859747
+30
+1.5
+11
+2.13191690534993
+21
+1.9222333770949
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.9222333770949
+30
+1.5
+11
+2.20214844470858
+21
+1.79083940859747
+31
+1.5
+12
+2.17026016090475
+22
+1.85826151998776
+32
+1.5
+13
+2.17026016090475
+23
+1.85826151998776
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+2.13191690534993
+30
+1.5
+11
+1.79083940859747
+21
+2.20214844470858
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+2.20214844470858
+30
+1.5
+11
+1.9222333770949
+21
+2.13191690534993
+31
+1.5
+12
+1.85826151998776
+22
+2.17026016090475
+32
+1.5
+13
+1.85826151998776
+23
+2.17026016090475
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.91251205544432
+21
+1.98213889596437
+31
+1.5
+12
+0.868083094650066
+22
+1.9222333770949
+32
+1.5
+13
+0.868083094650066
+23
+1.9222333770949
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.91251205544432
+20
+1.98213889596437
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.962598846298224
+22
+2.03740115370178
+32
+1.5
+13
+0.962598846298224
+23
+2.03740115370178
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+2.20214844470858
+30
+1.5
+11
+1.64826864473226
+21
+2.24539681310646
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+2.24539681310646
+30
+1.5
+11
+1.79083940859747
+21
+2.20214844470858
+31
+1.5
+12
+1.72061635471339
+22
+2.22727465515648
+32
+1.5
+13
+1.72061635471339
+23
+2.22727465515648
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.9222333770949
+30
+1.5
+11
+2.03740115370178
+21
+2.03740115370178
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370178
+20
+2.03740115370178
+30
+1.5
+11
+2.13191690534993
+21
+1.9222333770949
+31
+1.5
+12
+2.08748794455568
+22
+1.98213889596437
+32
+1.5
+13
+2.08748794455568
+23
+1.98213889596437
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+2.24539681310646
+30
+1.5
+11
+1.5
+21
+2.26
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+2.26
+30
+1.5
+11
+1.64826864473226
+21
+2.24539681310646
+31
+1.5
+12
+1.57449302665047
+22
+2.25634039227087
+32
+1.5
+13
+1.57449302665047
+23
+2.25634039227087
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.01786110403563
+21
+2.08748794455568
+31
+1.5
+12
+0.962598846298224
+22
+2.03740115370178
+32
+1.5
+13
+0.962598846298224
+23
+2.03740115370178
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.01786110403563
+20
+2.08748794455568
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.0777666229051
+22
+2.13191690534993
+32
+1.5
+13
+1.0777666229051
+23
+2.13191690534993
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.01786110403563
+20
+0.91251205544432
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.962598846298224
+22
+0.962598846298224
+32
+1.5
+13
+0.962598846298224
+23
+0.962598846298224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.01786110403563
+21
+0.91251205544432
+31
+1.5
+12
+1.0777666229051
+22
+0.868083094650066
+32
+1.5
+13
+1.0777666229051
+23
+0.868083094650066
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.82973983909525
+20
+1.14173848001224
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.797851555291422
+22
+1.20916059140253
+32
+1.5
+13
+0.797851555291422
+23
+1.20916059140253
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.82973983909525
+21
+1.14173848001224
+31
+1.5
+12
+0.868083094650066
+22
+1.0777666229051
+32
+1.5
+13
+0.868083094650066
+23
+1.0777666229051
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+0.868083094650066
+30
+1.5
+11
+2.03740115370178
+21
+0.962598846298224
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370178
+20
+0.962598846298224
+30
+1.5
+11
+1.9222333770949
+21
+0.868083094650066
+31
+1.5
+12
+1.98213889596437
+22
+0.91251205544432
+32
+1.5
+13
+1.98213889596437
+23
+0.91251205544432
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.91251205544432
+20
+1.01786110403563
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.868083094650066
+22
+1.0777666229051
+32
+1.5
+13
+0.868083094650066
+23
+1.0777666229051
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.91251205544432
+21
+1.01786110403563
+31
+1.5
+12
+0.962598846298224
+22
+0.962598846298224
+32
+1.5
+13
+0.962598846298224
+23
+0.962598846298224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.27938364528661
+20
+0.772725344843521
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.20916059140253
+22
+0.797851555291422
+32
+1.5
+13
+1.20916059140253
+23
+0.797851555291422
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.27938364528661
+21
+0.772725344843521
+31
+1.5
+12
+1.35173135526774
+22
+0.754603186893545
+32
+1.5
+13
+1.35173135526774
+23
+0.754603186893545
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+0.797851555291422
+30
+1.5
+11
+1.9222333770949
+21
+0.868083094650066
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+0.868083094650066
+30
+1.5
+11
+1.79083940859747
+21
+0.797851555291422
+31
+1.5
+12
+1.85826151998776
+22
+0.82973983909525
+32
+1.5
+13
+1.85826151998776
+23
+0.82973983909525
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.0777666229051
+30
+1.5
+11
+2.20214844470858
+21
+1.20916059140253
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.20916059140253
+30
+1.5
+11
+2.13191690534993
+21
+1.0777666229051
+31
+1.5
+12
+2.17026016090475
+22
+1.14173848001224
+32
+1.5
+13
+2.17026016090475
+23
+1.14173848001224
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.14173848001224
+20
+0.82973983909525
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.0777666229051
+22
+0.868083094650066
+32
+1.5
+13
+1.0777666229051
+23
+0.868083094650066
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.14173848001224
+21
+0.82973983909525
+31
+1.5
+12
+1.20916059140253
+22
+0.797851555291422
+32
+1.5
+13
+1.20916059140253
+23
+0.797851555291422
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+0.754603186893545
+30
+1.5
+11
+1.79083940859747
+21
+0.797851555291422
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.79083940859747
+20
+0.797851555291422
+30
+1.5
+11
+1.64826864473226
+21
+0.754603186893545
+31
+1.5
+12
+1.72061635471339
+22
+0.772725344843521
+32
+1.5
+13
+1.72061635471339
+23
+0.772725344843521
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.772725344843521
+21
+1.72061635471339
+31
+1.5
+12
+0.754603186893545
+22
+1.64826864473226
+32
+1.5
+13
+0.754603186893545
+23
+1.64826864473226
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.772725344843521
+20
+1.72061635471339
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.797851555291422
+22
+1.79083940859747
+32
+1.5
+13
+0.797851555291422
+23
+1.79083940859747
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.14173848001224
+21
+2.17026016090475
+31
+1.5
+12
+1.0777666229051
+22
+2.13191690534993
+32
+1.5
+13
+1.0777666229051
+23
+2.13191690534993
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.14173848001224
+20
+2.17026016090475
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.20916059140253
+22
+2.20214844470858
+32
+1.5
+13
+1.20916059140253
+23
+2.20214844470858
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.743659607729131
+21
+1.57449302665047
+31
+1.5
+12
+0.74
+22
+1.5
+32
+1.5
+13
+0.74
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.743659607729131
+20
+1.57449302665047
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.754603186893545
+22
+1.64826864473226
+32
+1.5
+13
+0.754603186893545
+23
+1.64826864473226
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.82973983909525
+21
+1.85826151998776
+31
+1.5
+12
+0.797851555291422
+22
+1.79083940859747
+32
+1.5
+13
+0.797851555291422
+23
+1.79083940859747
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.82973983909525
+20
+1.85826151998776
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.868083094650066
+22
+1.9222333770949
+32
+1.5
+13
+0.868083094650066
+23
+1.9222333770949
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.743659607729131
+20
+1.42550697334953
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.74
+22
+1.5
+32
+1.5
+13
+0.74
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.743659607729131
+21
+1.42550697334953
+31
+1.5
+12
+0.754603186893545
+22
+1.35173135526774
+32
+1.5
+13
+0.754603186893545
+23
+1.35173135526774
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+0.772725344843522
+20
+1.27938364528661
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+0.754603186893545
+22
+1.35173135526774
+32
+1.5
+13
+0.754603186893545
+23
+1.35173135526774
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+0.772725344843522
+21
+1.27938364528661
+31
+1.5
+12
+0.797851555291422
+22
+1.20916059140253
+32
+1.5
+13
+0.797851555291422
+23
+1.20916059140253
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.42550697334953
+21
+2.25634039227087
+31
+1.5
+12
+1.35173135526774
+22
+2.24539681310645
+32
+1.5
+13
+1.35173135526774
+23
+2.24539681310645
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.42550697334953
+20
+2.25634039227087
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.5
+22
+2.26
+32
+1.5
+13
+1.5
+23
+2.26
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370178
+20
+2.03740115370178
+30
+1.5
+11
+1.9222333770949
+21
+2.13191690534993
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.9222333770949
+20
+2.13191690534993
+30
+1.5
+11
+2.03740115370178
+21
+2.03740115370178
+31
+1.5
+12
+1.98213889596437
+22
+2.08748794455568
+32
+1.5
+13
+1.98213889596437
+23
+2.08748794455568
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.03740115370178
+20
+0.962598846298224
+30
+1.5
+11
+2.13191690534993
+21
+1.0777666229051
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.13191690534993
+20
+1.0777666229051
+30
+1.5
+11
+2.03740115370178
+21
+0.962598846298224
+31
+1.5
+12
+2.08748794455568
+22
+1.01786110403563
+32
+1.5
+13
+2.08748794455568
+23
+1.01786110403563
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.26
+20
+1.5
+30
+1.5
+11
+2.24539681310645
+21
+1.64826864473226
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310645
+20
+1.64826864473226
+30
+1.5
+11
+2.26
+21
+1.5
+31
+1.5
+12
+2.25634039227087
+22
+1.57449302665047
+32
+1.5
+13
+2.25634039227087
+23
+1.57449302665047
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.42550697334953
+20
+0.743659607729131
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.35173135526774
+22
+0.754603186893545
+32
+1.5
+13
+1.35173135526774
+23
+0.754603186893545
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.42550697334953
+21
+0.743659607729131
+31
+1.5
+12
+1.5
+22
+0.74
+32
+1.5
+13
+1.5
+23
+0.74
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+0.74
+30
+1.5
+11
+1.64826864473226
+21
+0.754603186893545
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.64826864473226
+20
+0.754603186893545
+30
+1.5
+11
+1.5
+21
+0.74
+31
+1.5
+12
+1.57449302665047
+22
+0.743659607729131
+32
+1.5
+13
+1.57449302665047
+23
+0.743659607729131
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.20214844470858
+20
+1.20916059140253
+30
+1.5
+11
+2.24539681310646
+21
+1.35173135526774
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310646
+20
+1.35173135526774
+30
+1.5
+11
+2.20214844470858
+21
+1.20916059140253
+31
+1.5
+12
+2.22727465515648
+22
+1.27938364528661
+32
+1.5
+13
+2.22727465515648
+23
+1.27938364528661
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.5
+20
+1.5
+30
+1.5
+11
+1.27938364528661
+21
+2.22727465515648
+31
+1.5
+12
+1.20916059140253
+22
+2.20214844470858
+32
+1.5
+13
+1.20916059140253
+23
+2.20214844470858
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+1.27938364528661
+20
+2.22727465515648
+30
+1.5
+11
+1.5
+21
+1.5
+31
+1.5
+12
+1.35173135526774
+22
+2.24539681310645
+32
+1.5
+13
+1.35173135526774
+23
+2.24539681310645
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.24539681310646
+20
+1.35173135526774
+30
+1.5
+11
+2.26
+21
+1.5
+31
+1.5
+12
+1.5
+22
+1.5
+32
+1.5
+13
+1.5
+23
+1.5
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+pillar_b
+10
+2.26
+20
+1.5
+30
+1.5
+11
+2.24539681310646
+21
+1.35173135526774
+31
+1.5
+12
+2.25634039227087
+22
+1.42550697334953
+32
+1.5
+13
+2.25634039227087
+23
+1.42550697334953
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+leviathan
+10
+2.25005874840729
+20
+3.0007189449114
+30
+2.25038878031282
+11
+6.83599400219787
+21
+-3.83207178618818
+31
+6.83197759827438
+12
+2.25309854396822
+22
+0.752182882434337
+32
+-0.00106460677458386
+13
+2.25309854396822
+23
+0.752182882434337
+33
+-0.00106460677458386
+70
+0
+ 0
+3DFACE
+ 8
+leviathan
+10
+2.25005874840729
+20
+3.0007189449114
+30
+2.25038878031282
+11
+2.25309854396822
+21
+0.752182882434337
+31
+-0.00106460677458386
+12
+-3.83269312832729
+22
+6.83333584417703
+32
+-3.83401461964133
+13
+-3.83269312832729
+23
+6.83333584417703
+33
+-3.83401461964133
+70
+0
+ 0
+3DFACE
+ 8
+leviathan
+10
+6.83599400219787
+20
+-3.83207178618818
+30
+6.83197759827438
+11
+0.00179401843026383
+21
+0.748994259637591
+31
+2.24762029441129
+12
+2.25309854396822
+22
+0.752182882434337
+32
+-0.00106460677458386
+13
+2.25309854396822
+23
+0.752182882434337
+33
+-0.00106460677458386
+70
+0
+ 0
+3DFACE
+ 8
+leviathan
+10
+6.83599400219787
+20
+-3.83207178618818
+30
+6.83197759827438
+11
+2.25005874840729
+21
+3.0007189449114
+31
+2.25038878031282
+12
+0.00179401843026383
+22
+0.748994259637591
+32
+2.24762029441129
+13
+0.00179401843026383
+23
+0.748994259637591
+33
+2.24762029441129
+70
+0
+ 0
+3DFACE
+ 8
+leviathan
+10
+0.00179401843026383
+20
+0.748994259637591
+30
+2.24762029441129
+11
+2.25005874840729
+21
+3.0007189449114
+31
+2.25038878031282
+12
+-3.83269312832729
+22
+6.83333584417703
+32
+-3.83401461964133
+13
+-3.83269312832729
+23
+6.83333584417703
+33
+-3.83401461964133
+70
+0
+ 0
+3DFACE
+ 8
+leviathan
+10
+0.00179401843026383
+20
+0.748994259637591
+30
+2.24762029441129
+11
+-3.83269312832729
+21
+6.83333584417703
+31
+-3.83401461964133
+12
+2.25309854396822
+22
+0.752182882434337
+32
+-0.00106460677458386
+13
+2.25309854396822
+23
+0.752182882434337
+33
+-0.00106460677458386
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+2.795
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.962598846298224
+20
+2.03740115370178
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.497732043121052
+20
+3.0
+30
+3.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+3.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+3.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.497732043121052
+20
+3.0
+30
+3.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+0.205
+31
+3.0
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.205
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.497732043121051
+32
+3.0
+13
+3.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.878679656440357
+32
+3.0
+13
+3.0
+23
+0.878679656440357
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.878679656440357
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+1.20163144893051
+32
+3.0
+13
+3.0
+23
+1.20163144893051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+0.0
+30
+0.205
+11
+2.795
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.50226795687895
+20
+3.0
+30
+0.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.98213889596437
+20
+2.08748794455568
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.03740115370178
+20
+2.03740115370178
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.85826151998776
+20
+2.17026016090475
+30
+0.0
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+0.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.9222333770949
+20
+2.13191690534993
+30
+0.0
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+2.50226795687895
+22
+3.0
+32
+0.0
+13
+2.50226795687895
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.57449302665047
+20
+0.743659607729131
+30
+0.0
+11
+1.5
+21
+5.55111512312578e-17
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+0.0
+12
+1.79836855106949
+22
+5.55111512312578e-17
+32
+0.0
+13
+1.79836855106949
+23
+5.55111512312578e-17
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.98213889596437
+20
+0.91251205544432
+30
+0.0
+11
+2.50226795687895
+21
+0.0
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+1.98213889596437
+21
+0.91251205544432
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.0
+12
+2.795
+22
+0.0
+32
+0.0
+13
+2.795
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.08748794455568
+20
+1.01786110403563
+30
+0.0
+11
+3.0
+21
+0.0
+31
+0.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+0.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.0
+30
+0.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.0
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+12
+3.0
+22
+0.497732043121051
+32
+0.0
+13
+3.0
+23
+0.497732043121051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.0
+30
+0.0
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.17026016090475
+20
+1.85826151998776
+30
+0.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.20214844470858
+20
+1.79083940859747
+30
+0.0
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.12132034355964
+30
+0.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+0.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+0.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.22727465515648
+20
+1.72061635471339
+30
+0.0
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.24539681310645
+20
+1.64826864473226
+30
+0.0
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+3.0
+22
+1.79836855106949
+32
+0.0
+13
+3.0
+23
+1.79836855106949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.868083094650066
+20
+1.0777666229051
+30
+0.0
+11
+0.0
+21
+0.205
+31
+0.0
+12
+0.0
+22
+0.497732043121051
+32
+0.0
+13
+0.0
+23
+0.497732043121051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.205
+30
+0.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.0
+30
+0.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+0.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+0.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.0
+30
+0.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+0.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.797851555291422
+20
+1.20916059140253
+30
+0.0
+11
+0.0
+21
+0.497732043121051
+31
+0.0
+12
+0.0
+22
+0.878679656440357
+32
+0.0
+13
+0.0
+23
+0.878679656440357
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+0.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+0.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+0.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+0.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.79836855106949
+30
+0.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+0.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+0.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.25634039227087
+20
+1.57449302665047
+30
+0.0
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.26
+20
+1.5
+30
+0.0
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.35173135526774
+20
+0.754603186893545
+30
+0.0
+11
+1.5
+21
+5.55111512312578e-17
+31
+0.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+0.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+0.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+0.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+0.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+0.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.08748794455568
+20
+1.98213889596437
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+0.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.13191690534993
+20
+1.9222333770949
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+0.0
+13
+3.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.50226795687895
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+0.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.50226795687895
+30
+0.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.868083094650066
+20
+1.9222333770949
+30
+0.0
+11
+0.0
+21
+2.12132034355964
+31
+0.0
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+0.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+0.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.72061635471339
+20
+0.772725344843521
+30
+0.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+0.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+0.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.72061635471339
+21
+0.772725344843521
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+0.0
+12
+2.12132034355964
+22
+0.0
+32
+0.0
+13
+2.12132034355964
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.85826151998776
+20
+0.82973983909525
+30
+0.0
+11
+2.12132034355964
+21
+0.0
+31
+0.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+0.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.12132034355964
+20
+0.0
+30
+0.0
+11
+1.85826151998776
+21
+0.82973983909525
+31
+0.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+0.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+2.12132034355964
+20
+0.0
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+12
+2.50226795687895
+22
+0.0
+32
+0.0
+13
+2.50226795687895
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+0.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+0.0
+12
+1.20163144893051
+22
+3.0
+32
+0.0
+13
+1.20163144893051
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.35173135526774
+20
+2.24539681310645
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+0.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.42550697334953
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.20163144893051
+20
+3.0
+30
+0.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+0.0
+12
+0.878679656440356
+22
+3.0
+32
+0.0
+13
+0.878679656440356
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.20916059140253
+20
+2.20214844470858
+30
+0.0
+11
+1.20163144893051
+21
+3.0
+31
+0.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+0.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.27938364528661
+20
+2.22727465515648
+30
+0.0
+11
+1.20163144893051
+21
+3.0
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.74
+20
+1.5
+30
+0.0
+11
+0.0
+21
+1.20163144893051
+31
+0.0
+12
+0.0
+22
+1.5
+32
+0.0
+13
+0.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.20163144893051
+30
+0.0
+11
+0.74
+21
+1.5
+31
+0.0
+12
+0.743659607729131
+22
+1.42550697334953
+32
+0.0
+13
+0.743659607729131
+23
+1.42550697334953
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.20163144893051
+30
+0.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.25634039227087
+20
+1.42550697334953
+30
+0.0
+11
+3.0
+21
+1.20163144893051
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.20163144893051
+30
+0.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+0.0
+12
+2.26
+22
+1.5
+32
+0.0
+13
+2.26
+23
+1.5
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.20163144893051
+30
+0.0
+11
+2.26
+21
+1.5
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.22727465515648
+20
+1.27938364528661
+30
+0.0
+11
+3.0
+21
+0.878679656440357
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.878679656440357
+30
+0.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+0.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+0.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.878679656440357
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+12
+3.0
+22
+1.20163144893051
+32
+0.0
+13
+3.0
+23
+1.20163144893051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.754603186893545
+20
+1.64826864473226
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+1.79836855106949
+32
+0.0
+13
+0.0
+23
+1.79836855106949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+0.0
+12
+0.743659607729131
+22
+1.57449302665047
+32
+0.0
+13
+0.743659607729131
+23
+1.57449302665047
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+0.0
+12
+0.74
+22
+1.5
+32
+0.0
+13
+0.74
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.0777666229051
+20
+0.868083094650066
+30
+0.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+0.0
+12
+0.497732043121053
+22
+0.0
+32
+0.0
+13
+0.497732043121053
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+0.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+0.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+0.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+0.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+0.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+0.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.20916059140253
+20
+0.797851555291422
+30
+0.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+0.0
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+0.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+0.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+0.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.754603186893545
+20
+1.35173135526774
+30
+0.0
+11
+0.0
+21
+0.878679656440357
+31
+0.0
+12
+0.0
+22
+1.20163144893051
+32
+0.0
+13
+0.0
+23
+1.20163144893051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.878679656440357
+30
+0.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+0.0
+12
+0.772725344843521
+22
+1.27938364528661
+32
+0.0
+13
+0.772725344843521
+23
+1.27938364528661
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.878679656440357
+30
+0.0
+11
+0.772725344843521
+21
+1.27938364528661
+31
+0.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+0.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.962598846298224
+20
+0.962598846298224
+30
+0.0
+11
+0.205
+21
+0.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+0.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+0.0
+12
+0.497732043121053
+22
+0.0
+32
+0.0
+13
+0.497732043121053
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.497732043121053
+20
+0.0
+30
+0.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+0.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+0.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.497732043121053
+20
+0.0
+30
+0.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+0.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+0.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.17026016090475
+20
+1.14173848001224
+30
+0.0
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+0.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.497732043121051
+30
+0.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+0.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+0.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.497732043121051
+30
+0.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+0.0
+12
+3.0
+22
+0.878679656440357
+32
+0.0
+13
+3.0
+23
+0.878679656440357
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.878679656440356
+20
+3.0
+30
+0.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+0.0
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.0777666229051
+20
+2.13191690534993
+30
+0.0
+11
+0.878679656440356
+21
+3.0
+31
+0.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+0.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.14173848001224
+20
+2.17026016090475
+30
+0.0
+11
+0.878679656440356
+21
+3.0
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+3.0
+30
+0.0
+11
+0.962598846298224
+21
+2.03740115370178
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.0
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.962598846298224
+20
+2.03740115370178
+30
+0.0
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+1.01786110403563
+22
+2.08748794455568
+32
+0.0
+13
+1.01786110403563
+23
+2.08748794455568
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.01786110403563
+20
+2.08748794455568
+30
+0.0
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.5
+21
+2.26
+31
+0.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+2.26
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+0.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.57449302665047
+20
+2.25634039227087
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.72061635471339
+20
+2.22727465515648
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+0.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.79083940859747
+20
+2.20214844470858
+30
+0.0
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.797851555291422
+20
+1.79083940859747
+30
+0.0
+11
+0.0
+21
+1.79836855106949
+31
+0.0
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+0.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+0.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+0.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.13191690534993
+20
+1.0777666229051
+30
+0.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+0.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+0.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+3.0
+11
+1.5
+21
+0.74
+31
+3.0
+12
+1.5
+22
+5.55111512312578e-17
+32
+3.0
+13
+1.5
+23
+5.55111512312578e-17
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+0.74
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+3.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.57449302665047
+20
+0.743659607729131
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+3.0
+11
+1.72061635471339
+21
+0.772725344843521
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.72061635471339
+20
+0.772725344843521
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.79083940859747
+20
+0.797851555291422
+30
+3.0
+11
+1.79836855106949
+21
+5.55111512312578e-17
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+3.0
+13
+2.12132034355964
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.0777666229051
+20
+2.13191690534993
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+1.0777666229051
+21
+2.13191690534993
+31
+3.0
+12
+1.14173848001224
+22
+2.17026016090475
+32
+3.0
+13
+1.14173848001224
+23
+2.17026016090475
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.20916059140253
+20
+2.20214844470858
+30
+3.0
+11
+1.20163144893051
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.20163144893051
+20
+3.0
+30
+3.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+3.0
+12
+1.34882660079146
+22
+2.26
+32
+3.0
+13
+1.34882660079146
+23
+2.26
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.34882660079146
+20
+2.26
+30
+3.0
+11
+1.20916059140253
+21
+2.20214844470858
+31
+3.0
+12
+1.27938364528661
+22
+2.22727465515648
+32
+3.0
+13
+1.27938364528661
+23
+2.22727465515648
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+1.34882660079146
+20
+2.26
+30
+3.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.50226795687895
+20
+0.0
+30
+3.0
+11
+1.98213889596437
+21
+0.91251205544432
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.98213889596437
+20
+0.91251205544432
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.03740115370178
+20
+0.962598846298224
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.795
+22
+0.0
+32
+3.0
+13
+2.795
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.57449302665047
+20
+2.25634039227087
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+3.0
+12
+1.79836855106949
+22
+3.0
+32
+3.0
+13
+1.79836855106949
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.34882660079146
+20
+2.26
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.34882660079146
+21
+2.26
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.35173135526774
+21
+2.24539681310645
+31
+3.0
+12
+1.42550697334953
+22
+2.25634039227087
+32
+3.0
+13
+1.42550697334953
+23
+2.25634039227087
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.12132034355964
+20
+0.0
+30
+3.0
+11
+1.85826151998776
+21
+0.82973983909525
+31
+3.0
+12
+1.79083940859747
+22
+0.797851555291422
+32
+3.0
+13
+1.79083940859747
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.85826151998776
+20
+0.82973983909525
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+3.0
+12
+1.9222333770949
+22
+0.868083094650066
+32
+3.0
+13
+1.9222333770949
+23
+0.868083094650066
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.9222333770949
+20
+0.868083094650066
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+3.0
+12
+2.50226795687895
+22
+0.0
+32
+3.0
+13
+2.50226795687895
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.98213889596437
+20
+2.08748794455568
+30
+3.0
+11
+2.50226795687895
+21
+3.0
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+1.98213889596437
+21
+2.08748794455568
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+3.0
+22
+3.0
+32
+3.0
+13
+3.0
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+2.50226795687895
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+0.205
+21
+0.0
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+0.497732043121053
+21
+0.0
+31
+3.0
+12
+1.01786110403563
+22
+0.91251205544432
+32
+3.0
+13
+1.01786110403563
+23
+0.91251205544432
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.01786110403563
+20
+0.91251205544432
+30
+3.0
+11
+0.497732043121053
+21
+0.0
+31
+3.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+3.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+3.0
+11
+1.0777666229051
+21
+0.868083094650066
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.0777666229051
+20
+0.868083094650066
+30
+3.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+3.0
+12
+1.14173848001224
+22
+0.82973983909525
+32
+3.0
+13
+1.14173848001224
+23
+0.82973983909525
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.14173848001224
+20
+0.82973983909525
+30
+3.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+3.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+3.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.08748794455568
+20
+1.98213889596437
+30
+3.0
+11
+3.0
+21
+3.0
+31
+3.0
+12
+2.03740115370178
+22
+2.03740115370178
+32
+3.0
+13
+2.03740115370178
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.08748794455568
+21
+1.98213889596437
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+12
+3.0
+22
+2.50226795687895
+32
+3.0
+13
+3.0
+23
+2.50226795687895
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+3.0
+12
+3.0
+22
+2.795
+32
+3.0
+13
+3.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.962598846298224
+20
+0.962598846298224
+30
+3.0
+11
+0.0
+21
+0.205
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.205
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.0
+22
+0.497732043121051
+32
+3.0
+13
+0.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.962598846298224
+21
+0.962598846298224
+31
+3.0
+12
+0.91251205544432
+22
+1.01786110403563
+32
+3.0
+13
+0.91251205544432
+23
+1.01786110403563
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+3.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+3.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+3.0
+11
+1.20916059140253
+21
+0.797851555291422
+31
+3.0
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+3.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.20916059140253
+20
+0.797851555291422
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+1.27938364528661
+22
+0.772725344843521
+32
+3.0
+13
+1.27938364528661
+23
+0.772725344843521
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.27938364528661
+20
+0.772725344843521
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+1.35173135526774
+21
+0.754603186893545
+31
+3.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+3.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.35173135526774
+20
+0.754603186893545
+30
+3.0
+11
+1.5
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.42550697334953
+22
+0.743659607729131
+32
+3.0
+13
+1.42550697334953
+23
+0.743659607729131
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.42550697334953
+20
+0.743659607729131
+30
+3.0
+11
+1.5
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.5
+22
+0.74
+32
+3.0
+13
+1.5
+23
+0.74
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.17026016090475
+20
+1.85826151998776
+30
+3.0
+11
+3.0
+21
+2.50226795687895
+31
+3.0
+12
+2.13191690534993
+22
+1.9222333770949
+32
+3.0
+13
+2.13191690534993
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+2.17026016090475
+21
+1.85826151998776
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.22727465515648
+20
+1.72061635471339
+30
+3.0
+11
+3.0
+21
+2.12132034355964
+31
+3.0
+12
+2.20214844470858
+22
+1.79083940859747
+32
+3.0
+13
+2.20214844470858
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.22727465515648
+21
+1.72061635471339
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+12
+3.0
+22
+1.79836855106949
+32
+3.0
+13
+3.0
+23
+1.79836855106949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.754603186893545
+20
+1.64826864473226
+30
+3.0
+11
+0.0
+21
+2.12132034355964
+31
+3.0
+12
+0.0
+22
+1.79836855106949
+32
+3.0
+13
+0.0
+23
+1.79836855106949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.12132034355964
+30
+3.0
+11
+0.754603186893545
+21
+1.64826864473226
+31
+3.0
+12
+0.772725344843521
+22
+1.72061635471339
+32
+3.0
+13
+0.772725344843521
+23
+1.72061635471339
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.12132034355964
+30
+3.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.797851555291422
+20
+1.20916059140253
+30
+3.0
+11
+0.0
+21
+1.20163144893051
+31
+3.0
+12
+0.0
+22
+0.878679656440357
+32
+3.0
+13
+0.0
+23
+0.878679656440357
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.20163144893051
+30
+3.0
+11
+0.797851555291422
+21
+1.20916059140253
+31
+3.0
+12
+0.772725344843521
+22
+1.27938364528661
+32
+3.0
+13
+0.772725344843521
+23
+1.27938364528661
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.20163144893051
+30
+3.0
+11
+0.772725344843521
+21
+1.27938364528661
+31
+3.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+3.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.868083094650066
+20
+1.0777666229051
+30
+3.0
+11
+0.0
+21
+0.878679656440357
+31
+3.0
+12
+0.0
+22
+0.497732043121051
+32
+3.0
+13
+0.0
+23
+0.497732043121051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.878679656440357
+30
+3.0
+11
+0.868083094650066
+21
+1.0777666229051
+31
+3.0
+12
+0.82973983909525
+22
+1.14173848001224
+32
+3.0
+13
+0.82973983909525
+23
+1.14173848001224
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.878679656440357
+30
+3.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+3.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+3.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.878679656440357
+30
+3.0
+11
+2.22727465515648
+21
+1.27938364528661
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.22727465515648
+20
+1.27938364528661
+30
+3.0
+11
+3.0
+21
+0.878679656440357
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.24539681310646
+20
+1.35173135526774
+30
+3.0
+11
+3.0
+21
+0.878679656440357
+31
+3.0
+12
+3.0
+22
+1.20163144893051
+32
+3.0
+13
+3.0
+23
+1.20163144893051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.20163144893051
+30
+3.0
+11
+2.25634039227087
+21
+1.42550697334953
+31
+3.0
+12
+2.24539681310646
+22
+1.35173135526774
+32
+3.0
+13
+2.24539681310646
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.25634039227087
+20
+1.42550697334953
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+3.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.26
+20
+1.5
+30
+3.0
+11
+3.0
+21
+1.20163144893051
+31
+3.0
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.797851555291422
+20
+1.79083940859747
+30
+3.0
+11
+0.0
+21
+2.50226795687895
+31
+3.0
+12
+0.0
+22
+2.12132034355964
+32
+3.0
+13
+0.0
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.50226795687895
+30
+3.0
+11
+0.797851555291422
+21
+1.79083940859747
+31
+3.0
+12
+0.82973983909525
+22
+1.85826151998776
+32
+3.0
+13
+0.82973983909525
+23
+1.85826151998776
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.50226795687895
+30
+3.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.72061635471339
+20
+2.22727465515648
+30
+3.0
+11
+1.79836855106949
+21
+3.0
+31
+3.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+3.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.72061635471339
+21
+2.22727465515648
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+3.0
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.85826151998776
+20
+2.17026016090475
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+1.79083940859747
+22
+2.20214844470858
+32
+3.0
+13
+1.79083940859747
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.85826151998776
+21
+2.17026016090475
+31
+3.0
+12
+1.9222333770949
+22
+2.13191690534993
+32
+3.0
+13
+1.9222333770949
+23
+2.13191690534993
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+2.12132034355964
+20
+3.0
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+12
+2.50226795687895
+22
+3.0
+32
+3.0
+13
+2.50226795687895
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.25634039227087
+20
+1.57449302665047
+30
+3.0
+11
+3.0
+21
+1.79836855106949
+31
+3.0
+12
+2.24539681310645
+22
+1.64826864473226
+32
+3.0
+13
+2.24539681310645
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+2.25634039227087
+21
+1.57449302665047
+31
+3.0
+12
+2.26
+22
+1.5
+32
+3.0
+13
+2.26
+23
+1.5
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+2.26
+21
+1.5
+31
+3.0
+12
+3.0
+22
+1.5
+32
+3.0
+13
+3.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.57449302665047
+20
+0.743659607729131
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.5
+22
+0.74
+32
+3.0
+13
+1.5
+23
+0.74
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.57449302665047
+21
+0.743659607729131
+31
+3.0
+12
+1.64826864473226
+22
+0.754603186893545
+32
+3.0
+13
+1.64826864473226
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.868083094650066
+20
+1.9222333770949
+30
+3.0
+11
+0.0
+21
+2.795
+31
+3.0
+12
+0.0
+22
+2.50226795687895
+32
+3.0
+13
+0.0
+23
+2.50226795687895
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+3.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.868083094650066
+21
+1.9222333770949
+31
+3.0
+12
+0.91251205544432
+22
+1.98213889596437
+32
+3.0
+13
+0.91251205544432
+23
+1.98213889596437
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.754603186893545
+20
+1.35173135526774
+30
+3.0
+11
+0.0
+21
+1.5
+31
+3.0
+12
+0.0
+22
+1.20163144893051
+32
+3.0
+13
+0.0
+23
+1.20163144893051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.754603186893545
+21
+1.35173135526774
+31
+3.0
+12
+0.743659607729131
+22
+1.42550697334953
+32
+3.0
+13
+0.743659607729131
+23
+1.42550697334953
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+3.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+3.0
+12
+0.74
+22
+1.5
+32
+3.0
+13
+0.74
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.74
+20
+1.5
+30
+3.0
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.74
+21
+1.5
+31
+3.0
+12
+0.743659607729131
+22
+1.57449302665047
+32
+3.0
+13
+0.743659607729131
+23
+1.57449302665047
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+3.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+3.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.08748794455568
+21
+1.01786110403563
+31
+3.0
+12
+2.03740115370178
+22
+0.962598846298224
+32
+3.0
+13
+2.03740115370178
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.08748794455568
+20
+1.01786110403563
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.13191690534993
+20
+1.0777666229051
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.497732043121051
+32
+3.0
+13
+3.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.205
+32
+3.0
+13
+3.0
+23
+0.205
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+2.17026016090475
+21
+1.14173848001224
+31
+3.0
+12
+2.13191690534993
+22
+1.0777666229051
+32
+3.0
+13
+2.13191690534993
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.17026016090475
+20
+1.14173848001224
+30
+3.0
+11
+3.0
+21
+0.497732043121051
+31
+3.0
+12
+2.20214844470858
+22
+1.20916059140253
+32
+3.0
+13
+2.20214844470858
+23
+1.20916059140253
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+3.0
+21
+0.497732043121051
+31
+3.0
+12
+3.0
+22
+0.878679656440357
+32
+3.0
+13
+3.0
+23
+0.878679656440357
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.0
+30
+1.5
+11
+2.795
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+0.0
+30
+0.205
+11
+3.0
+21
+0.0
+31
+1.5
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+0.0
+30
+3.0
+11
+1.5
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.795
+21
+0.0
+31
+3.0
+12
+1.5
+22
+5.55111512312578e-17
+32
+3.0
+13
+1.5
+23
+5.55111512312578e-17
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+2.795
+21
+0.0
+31
+3.0
+12
+2.50226795687895
+22
+0.0
+32
+3.0
+13
+2.50226795687895
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.12132034355964
+22
+0.0
+32
+3.0
+13
+2.12132034355964
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+2.12132034355964
+21
+0.0
+31
+3.0
+12
+1.79836855106949
+22
+5.55111512312578e-17
+32
+3.0
+13
+1.79836855106949
+23
+5.55111512312578e-17
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+1.5
+11
+0.0
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.205
+21
+0.0
+31
+1.5
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.0
+21
+0.0
+31
+1.5
+12
+0.205
+22
+0.0
+32
+1.5
+13
+0.205
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.0
+30
+1.5
+11
+0.205
+21
+0.0
+31
+2.795
+12
+0.0
+22
+0.0
+32
+2.795
+13
+0.0
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+0.0
+30
+0.205
+11
+2.50226795687895
+21
+0.0
+31
+0.0
+12
+2.795
+22
+0.0
+32
+0.0
+13
+2.795
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.50226795687895
+20
+0.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+2.12132034355964
+22
+0.0
+32
+0.0
+13
+2.12132034355964
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.12132034355964
+20
+0.0
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+1.79836855106949
+22
+5.55111512312578e-17
+32
+0.0
+13
+1.79836855106949
+23
+5.55111512312578e-17
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+5.55111512312578e-17
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+1.5
+22
+5.55111512312578e-17
+32
+0.0
+13
+1.5
+23
+5.55111512312578e-17
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+5.55111512312578e-17
+30
+0.0
+11
+2.795
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+0.0
+30
+0.205
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+0.0
+12
+1.5
+22
+5.55111512312578e-17
+32
+0.0
+13
+1.5
+23
+5.55111512312578e-17
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+0.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.497732043121053
+22
+0.0
+32
+0.0
+13
+0.497732043121053
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.497732043121053
+20
+0.0
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.0
+13
+0.205
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+0.0
+11
+1.5
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+1.5
+11
+0.8525
+21
+0.0
+31
+0.8525
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+0.205
+21
+0.0
+31
+2.795
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+2.795
+11
+1.5
+21
+5.55111512312578e-17
+31
+3.0
+12
+0.205
+22
+0.0
+32
+3.0
+13
+0.205
+23
+0.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+3.0
+11
+1.5
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+3.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+3.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+3.0
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+3.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+3.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.0
+30
+2.795
+11
+2.795
+21
+0.0
+31
+1.5
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+0.0
+30
+1.5
+11
+3.0
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+3.0
+31
+2.795
+12
+2.795
+22
+3.0
+32
+2.795
+13
+2.795
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+3.0
+11
+2.795
+21
+3.0
+31
+2.795
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+2.795
+11
+1.5
+21
+3.0
+31
+3.0
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+3.0
+12
+1.79836855106949
+22
+3.0
+32
+3.0
+13
+1.79836855106949
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+3.0
+11
+1.79836855106949
+21
+3.0
+31
+3.0
+12
+2.12132034355964
+22
+3.0
+32
+3.0
+13
+2.12132034355964
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+3.0
+11
+2.12132034355964
+21
+3.0
+31
+3.0
+12
+2.50226795687895
+22
+3.0
+32
+3.0
+13
+2.50226795687895
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+3.0
+30
+3.0
+11
+1.5
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+3.0
+12
+1.5
+22
+3.0
+32
+3.0
+13
+1.5
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.497732043121052
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+3.0
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.205
+21
+3.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+2.795
+11
+3.0
+21
+3.0
+31
+1.5
+12
+2.795
+22
+3.0
+32
+1.5
+13
+2.795
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+2.795
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+0.205
+11
+2.795
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+0.205
+22
+3.0
+32
+0.0
+13
+0.205
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.497732043121052
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.878679656440356
+22
+3.0
+32
+0.0
+13
+0.878679656440356
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.878679656440356
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+1.20163144893051
+22
+3.0
+32
+0.0
+13
+1.20163144893051
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.20163144893051
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+0.205
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.50226795687895
+22
+3.0
+32
+0.0
+13
+2.50226795687895
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.50226795687895
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.205
+32
+3.0
+13
+0.0
+23
+0.205
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.205
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+2.795
+32
+3.0
+13
+0.0
+23
+2.795
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+0.205
+11
+0.0
+21
+0.205
+31
+0.205
+12
+0.0
+22
+1.5
+32
+1.5
+13
+0.0
+23
+1.5
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+0.205
+31
+1.5
+12
+0.0
+22
+0.205
+32
+2.795
+13
+0.0
+23
+0.205
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.205
+13
+0.0
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.0
+12
+0.0
+22
+2.795
+32
+0.205
+13
+0.0
+23
+2.795
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+1.5
+11
+0.0
+21
+1.5
+31
+1.5
+12
+0.0
+22
+2.795
+32
+2.795
+13
+0.0
+23
+2.795
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.0
+21
+0.205
+31
+2.795
+12
+0.0
+22
+0.205
+32
+3.0
+13
+0.0
+23
+0.205
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+0.0
+22
+0.878679656440357
+32
+3.0
+13
+0.0
+23
+0.878679656440357
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+0.878679656440357
+31
+3.0
+12
+0.0
+22
+1.20163144893051
+32
+3.0
+13
+0.0
+23
+1.20163144893051
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+1.20163144893051
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.497732043121051
+31
+0.0
+12
+0.0
+22
+0.205
+32
+0.0
+13
+0.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.0
+21
+0.205
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+0.878679656440357
+32
+0.0
+13
+0.0
+23
+0.878679656440357
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.878679656440357
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.20163144893051
+32
+0.0
+13
+0.0
+23
+1.20163144893051
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.20163144893051
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.0
+13
+0.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+1.5
+12
+0.0
+22
+0.0
+32
+2.795
+13
+0.0
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.0
+30
+1.5
+11
+0.0
+21
+0.205
+31
+2.795
+12
+0.0
+22
+0.205
+32
+1.5
+13
+0.0
+23
+0.205
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+0.205
+31
+2.795
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.0
+21
+2.795
+31
+1.5
+12
+0.0
+22
+2.795
+32
+2.795
+13
+0.0
+23
+2.795
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+1.79836855106949
+32
+0.0
+13
+0.0
+23
+1.79836855106949
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.50226795687895
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.795
+32
+0.0
+13
+0.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.5
+32
+1.5
+13
+0.0
+23
+1.5
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+1.5
+31
+1.5
+12
+0.0
+22
+1.5
+32
+2.795
+13
+0.0
+23
+1.5
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.0
+21
+1.5
+31
+2.795
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+2.795
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+2.795
+32
+2.795
+13
+0.0
+23
+2.795
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+2.12132034355964
+32
+3.0
+13
+0.0
+23
+2.12132034355964
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.12132034355964
+31
+3.0
+12
+0.0
+22
+2.50226795687895
+32
+3.0
+13
+0.0
+23
+2.50226795687895
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.50226795687895
+31
+3.0
+12
+0.0
+22
+2.795
+32
+3.0
+13
+0.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.795
+32
+1.5
+13
+0.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+1.5
+30
+1.5
+11
+0.0
+21
+0.205
+31
+0.205
+12
+0.0
+22
+0.205
+32
+1.5
+13
+0.0
+23
+0.205
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+1.5
+31
+1.5
+12
+0.0
+22
+2.795
+32
+1.5
+13
+0.0
+23
+2.795
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.205
+30
+1.5
+11
+0.0
+21
+0.0
+31
+0.205
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.205
+31
+1.5
+12
+0.0
+22
+0.205
+32
+0.205
+13
+0.0
+23
+0.205
+33
+0.205
+70
+1
+ 0
+LINE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+1.5
+31
+0.205
+ 0
+LINE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+0.205
+31
+1.5
+ 0
+LINE
+ 8
+box
+10
+3.0
+20
+0.205
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+box
+10
+3.0
+20
+2.795
+30
+1.5
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+box
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+LINE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+2.795
+31
+0.205
+ 0
+LINE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+1.5
+11
+3.0
+21
+0.205
+31
+0.205
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.205
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+2.795
+31
+1.5
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.795
+30
+1.5
+11
+3.0
+21
+3.0
+31
+0.205
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.205
+12
+3.0
+22
+0.0
+32
+0.0
+13
+3.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+1.5
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.795
+32
+1.5
+13
+3.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+3.0
+31
+1.5
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+3.0
+32
+2.795
+13
+3.0
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+3.0
+11
+3.0
+21
+2.795
+31
+3.0
+12
+3.0
+22
+2.795
+32
+2.795
+13
+3.0
+23
+2.795
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.205
+30
+2.795
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.205
+30
+1.5
+11
+3.0
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+1.5
+13
+3.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.0
+30
+2.795
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+0.205
+32
+0.205
+13
+3.0
+23
+0.205
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.205
+30
+1.5
+11
+3.0
+21
+1.5
+31
+2.795
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+0.205
+31
+1.5
+12
+3.0
+22
+1.5
+32
+0.205
+13
+3.0
+23
+1.5
+33
+0.205
+70
+15
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+1.5
+31
+0.205
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+2.795
+13
+3.0
+23
+2.795
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+1.5
+13
+3.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+0.0
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.497732043121051
+30
+0.0
+11
+3.0
+21
+0.205
+31
+0.205
+12
+3.0
+22
+0.205
+32
+0.0
+13
+3.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.205
+13
+3.0
+23
+1.5
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.497732043121051
+31
+0.0
+12
+3.0
+22
+0.878679656440357
+32
+0.0
+13
+3.0
+23
+0.878679656440357
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+0.878679656440357
+31
+0.0
+12
+3.0
+22
+1.20163144893051
+32
+0.0
+13
+3.0
+23
+1.20163144893051
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+1.20163144893051
+31
+0.0
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.79836855106949
+30
+0.0
+11
+3.0
+21
+1.5
+31
+0.205
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+0.205
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+0.0
+13
+3.0
+23
+2.50226795687895
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.205
+30
+0.205
+11
+3.0
+21
+0.0
+31
+1.5
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.0
+30
+1.5
+11
+3.0
+21
+0.205
+31
+0.205
+12
+3.0
+22
+0.205
+32
+1.5
+13
+3.0
+23
+0.205
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.795
+30
+2.795
+11
+3.0
+21
+1.5
+31
+3.0
+12
+3.0
+22
+1.5
+32
+2.795
+13
+3.0
+23
+1.5
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+1.79836855106949
+32
+3.0
+13
+3.0
+23
+1.79836855106949
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+1.79836855106949
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.12132034355964
+32
+3.0
+13
+3.0
+23
+2.12132034355964
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.12132034355964
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.50226795687895
+32
+3.0
+13
+3.0
+23
+2.50226795687895
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+2.50226795687895
+30
+3.0
+11
+3.0
+21
+2.795
+31
+2.795
+12
+3.0
+22
+2.795
+32
+3.0
+13
+3.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+0.0
+30
+1.5
+11
+1.5
+21
+0.0
+31
+0.205
+12
+2.1475
+22
+0.0
+32
+0.8525
+13
+2.1475
+23
+0.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.1475
+20
+0.0
+30
+0.8525
+11
+1.5
+21
+0.0
+31
+0.205
+12
+2.795
+22
+0.0
+32
+0.205
+13
+2.795
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.8525
+20
+0.0
+30
+2.1475
+11
+0.205
+21
+0.0
+31
+1.5
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+0.0
+30
+2.795
+11
+1.5
+21
+0.0
+31
+1.5
+12
+2.1475
+22
+0.0
+32
+2.1475
+13
+2.1475
+23
+0.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+0.0
+30
+2.795
+11
+0.8525
+21
+0.0
+31
+2.1475
+12
+1.5
+22
+0.0
+32
+1.5
+13
+1.5
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.8525
+21
+0.0
+31
+2.1475
+12
+1.5
+22
+0.0
+32
+2.795
+13
+1.5
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+0.0
+30
+1.5
+11
+2.1475
+21
+0.0
+31
+0.8525
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.0
+30
+3.0
+11
+0.205
+21
+0.0
+31
+2.795
+12
+0.205
+22
+0.0
+32
+3.0
+13
+0.205
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+0.0
+30
+2.795
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+0.0
+30
+0.205
+11
+3.0
+21
+0.0
+31
+0.0
+12
+3.0
+22
+0.0
+32
+0.205
+13
+3.0
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.1475
+20
+0.0
+30
+2.1475
+11
+1.5
+21
+0.0
+31
+1.5
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+0.0
+30
+1.5
+11
+0.8525
+21
+0.0
+31
+0.8525
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+0.0
+30
+2.795
+11
+2.1475
+21
+0.0
+31
+2.1475
+12
+2.795
+22
+0.0
+32
+1.5
+13
+2.795
+23
+0.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+0.0
+30
+1.5
+11
+2.1475
+21
+0.0
+31
+0.8525
+12
+2.795
+22
+0.0
+32
+0.205
+13
+2.795
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+0.0
+30
+3.0
+11
+0.0
+21
+0.0
+31
+2.795
+12
+0.205
+22
+0.0
+32
+2.795
+13
+0.205
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.205
+21
+0.0
+31
+1.5
+12
+0.8525
+22
+0.0
+32
+2.1475
+13
+0.8525
+23
+0.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+1.5
+11
+0.205
+21
+0.0
+31
+0.205
+12
+0.8525
+22
+0.0
+32
+0.8525
+13
+0.8525
+23
+0.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.8525
+20
+0.0
+30
+0.8525
+11
+0.205
+21
+0.0
+31
+0.205
+12
+1.5
+22
+0.0
+32
+0.205
+13
+1.5
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.205
+22
+0.0
+32
+0.0
+13
+0.205
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.8525
+20
+3.0
+30
+0.8525
+11
+1.5
+21
+3.0
+31
+0.205
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.1475
+20
+3.0
+30
+2.1475
+11
+2.795
+21
+3.0
+31
+1.5
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.795
+21
+3.0
+31
+1.5
+12
+2.1475
+22
+3.0
+32
+2.1475
+13
+2.1475
+23
+3.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+1.5
+11
+2.795
+21
+3.0
+31
+0.205
+12
+2.1475
+22
+3.0
+32
+0.8525
+13
+2.1475
+23
+3.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+1.5
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+1.5
+11
+1.5
+21
+3.0
+31
+0.205
+12
+0.8525
+22
+3.0
+32
+0.8525
+13
+0.8525
+23
+3.0
+33
+0.8525
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+2.795
+11
+1.5
+21
+3.0
+31
+1.5
+12
+0.8525
+22
+3.0
+32
+2.1475
+13
+0.8525
+23
+3.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.8525
+21
+3.0
+31
+0.8525
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+1.5
+11
+0.8525
+21
+3.0
+31
+0.8525
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+2.795
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.5
+22
+3.0
+32
+1.5
+13
+1.5
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+2.795
+11
+2.1475
+21
+3.0
+31
+2.1475
+12
+1.5
+22
+3.0
+32
+2.795
+13
+1.5
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+3.0
+20
+3.0
+30
+3.0
+11
+2.795
+21
+3.0
+31
+2.795
+12
+2.795
+22
+3.0
+32
+3.0
+13
+2.795
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+2.795
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.8525
+20
+3.0
+30
+2.1475
+11
+1.5
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+3.0
+30
+1.5
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.795
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+2.795
+13
+0.0
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+0.205
+20
+3.0
+30
+2.795
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+box
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+2.795
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+0
+ 0
+LINE
+ 8
+box
+10
+3.0
+20
+1.5
+30
+2.795
+11
+3.0
+21
+1.5
+31
+1.5
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+0.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+0.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.14173848001224
+20
+0.82973983909525
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+0.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.27938364528661
+20
+2.22727465515648
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.24539681310645
+20
+1.64826864473226
+30
+0.0
+11
+2.26
+21
+1.5
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.26
+20
+1.5
+30
+0.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+0.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+0.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.772725344843521
+20
+1.72061635471339
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.64826864473226
+20
+0.754603186893545
+30
+0.0
+11
+1.5
+21
+0.74
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+0.74
+30
+0.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+0.0
+12
+1.57449302665047
+22
+0.743659607729131
+32
+0.0
+13
+1.57449302665047
+23
+0.743659607729131
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.772725344843521
+21
+1.27938364528661
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.772725344843521
+20
+1.27938364528661
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+0.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.64826864473226
+20
+2.24539681310645
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79083940859747
+20
+2.20214844470858
+30
+0.0
+11
+1.64826864473226
+21
+2.24539681310645
+31
+0.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+0.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.9222333770949
+20
+2.13191690534993
+30
+0.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.03740115370178
+20
+2.03740115370178
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+0.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.42550697334953
+20
+0.743659607729131
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.5
+22
+0.74
+32
+0.0
+13
+1.5
+23
+0.74
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+0.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.01786110403563
+20
+0.91251205544432
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+0.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79083940859747
+20
+2.20214844470858
+30
+0.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.9222333770949
+20
+2.13191690534993
+30
+0.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+0.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+0.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.57449302665047
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.57449302665047
+21
+2.25634039227087
+31
+0.0
+12
+1.64826864473226
+22
+2.24539681310645
+32
+0.0
+13
+1.64826864473226
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+0.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+0.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.27938364528661
+20
+0.772725344843521
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+0.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.9222333770949
+20
+0.868083094650066
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79083940859747
+20
+0.797851555291422
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+12
+1.85826151998776
+22
+0.82973983909525
+32
+0.0
+13
+1.85826151998776
+23
+0.82973983909525
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.42550697334953
+20
+2.25634039227087
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+0.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+0.0
+12
+1.5
+22
+2.26
+32
+0.0
+13
+1.5
+23
+2.26
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.01786110403563
+20
+2.08748794455568
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+0.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79083940859747
+20
+0.797851555291422
+30
+0.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.64826864473226
+20
+0.754603186893545
+30
+0.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+0.0
+12
+1.72061635471339
+22
+0.772725344843521
+32
+0.0
+13
+1.72061635471339
+23
+0.772725344843521
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.14173848001224
+20
+2.17026016090475
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+0.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+0.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+0.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.13191690534993
+20
+1.0777666229051
+30
+0.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.03740115370178
+20
+0.962598846298224
+30
+0.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+0.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+0.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.91251205544432
+20
+1.98213889596437
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+0.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+0.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.03740115370178
+20
+0.962598846298224
+30
+0.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.9222333770949
+20
+0.868083094650066
+30
+0.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+0.0
+12
+1.98213889596437
+22
+0.91251205544432
+32
+0.0
+13
+1.98213889596437
+23
+0.91251205544432
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.26
+20
+1.5
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.24539681310646
+20
+1.35173135526774
+30
+0.0
+11
+2.26
+21
+1.5
+31
+0.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+0.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.82973983909525
+20
+1.85826151998776
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+0.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+0.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+0.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.24539681310646
+20
+1.35173135526774
+30
+0.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.20214844470858
+20
+1.20916059140253
+30
+0.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+0.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+0.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.743659607729131
+20
+1.57449302665047
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.74
+22
+1.5
+32
+0.0
+13
+0.74
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+0.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+0.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.13191690534993
+20
+1.9222333770949
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.20214844470858
+20
+1.79083940859747
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+0.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+0.0
+12
+0.74
+22
+1.5
+32
+0.0
+13
+0.74
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.743659607729131
+20
+1.42550697334953
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+0.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+0.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+0.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.91251205544432
+20
+1.01786110403563
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+0.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.20214844470858
+20
+1.79083940859747
+30
+0.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.24539681310645
+20
+1.64826864473226
+30
+0.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+0.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+0.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+0.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+0.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+0.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.82973983909525
+20
+1.14173848001224
+30
+0.0
+11
+1.5
+21
+1.5
+31
+0.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+0.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.03740115370178
+20
+2.03740115370178
+30
+0.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+0.0
+12
+1.5
+22
+1.5
+32
+0.0
+13
+1.5
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.13191690534993
+20
+1.9222333770949
+30
+0.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+0.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+0.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.14173848001224
+21
+2.17026016090475
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.14173848001224
+20
+2.17026016090475
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.42550697334953
+21
+2.25634039227087
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.42550697334953
+20
+2.25634039227087
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.5
+22
+2.26
+32
+3.0
+13
+1.5
+23
+2.26
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.64826864473226
+20
+0.754603186893545
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79083940859747
+20
+0.797851555291422
+30
+3.0
+11
+1.64826864473226
+21
+0.754603186893545
+31
+3.0
+12
+1.72061635471339
+22
+0.772725344843521
+32
+3.0
+13
+1.72061635471339
+23
+0.772725344843521
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.9222333770949
+20
+0.868083094650066
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.03740115370178
+20
+0.962598846298224
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.98213889596437
+22
+0.91251205544432
+32
+3.0
+13
+1.98213889596437
+23
+0.91251205544432
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.27938364528661
+21
+2.22727465515648
+31
+3.0
+12
+1.20916059140253
+22
+2.20214844470858
+32
+3.0
+13
+1.20916059140253
+23
+2.20214844470858
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.27938364528661
+20
+2.22727465515648
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.35173135526774
+22
+2.24539681310645
+32
+3.0
+13
+1.35173135526774
+23
+2.24539681310645
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.91251205544432
+21
+1.98213889596437
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.91251205544432
+20
+1.98213889596437
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79083940859747
+20
+0.797851555291422
+30
+3.0
+11
+1.9222333770949
+21
+0.868083094650066
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.9222333770949
+20
+0.868083094650066
+30
+3.0
+11
+1.79083940859747
+21
+0.797851555291422
+31
+3.0
+12
+1.85826151998776
+22
+0.82973983909525
+32
+3.0
+13
+1.85826151998776
+23
+0.82973983909525
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.13191690534993
+20
+1.0777666229051
+30
+3.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+12
+2.17026016090475
+22
+1.14173848001224
+32
+3.0
+13
+2.17026016090475
+23
+1.14173848001224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.01786110403563
+21
+2.08748794455568
+31
+3.0
+12
+0.962598846298224
+22
+2.03740115370178
+32
+3.0
+13
+0.962598846298224
+23
+2.03740115370178
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.01786110403563
+20
+2.08748794455568
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.0777666229051
+22
+2.13191690534993
+32
+3.0
+13
+1.0777666229051
+23
+2.13191690534993
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.03740115370178
+20
+0.962598846298224
+30
+3.0
+11
+2.13191690534993
+21
+1.0777666229051
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.13191690534993
+20
+1.0777666229051
+30
+3.0
+11
+2.03740115370178
+21
+0.962598846298224
+31
+3.0
+12
+2.08748794455568
+22
+1.01786110403563
+32
+3.0
+13
+2.08748794455568
+23
+1.01786110403563
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.772725344843521
+21
+1.72061635471339
+31
+3.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+3.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.772725344843521
+20
+1.72061635471339
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.82973983909525
+21
+1.85826151998776
+31
+3.0
+12
+0.797851555291422
+22
+1.79083940859747
+32
+3.0
+13
+0.797851555291422
+23
+1.79083940859747
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.82973983909525
+20
+1.85826151998776
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.868083094650066
+22
+1.9222333770949
+32
+3.0
+13
+0.868083094650066
+23
+1.9222333770949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.24539681310646
+20
+1.35173135526774
+30
+3.0
+11
+2.26
+21
+1.5
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.26
+20
+1.5
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+2.25634039227087
+22
+1.42550697334953
+32
+3.0
+13
+2.25634039227087
+23
+1.42550697334953
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.743659607729131
+20
+1.42550697334953
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.74
+22
+1.5
+32
+3.0
+13
+0.74
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.743659607729131
+21
+1.42550697334953
+31
+3.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+3.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.20214844470858
+20
+1.20916059140253
+30
+3.0
+11
+2.24539681310646
+21
+1.35173135526774
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.24539681310646
+20
+1.35173135526774
+30
+3.0
+11
+2.20214844470858
+21
+1.20916059140253
+31
+3.0
+12
+2.22727465515648
+22
+1.27938364528661
+32
+3.0
+13
+2.22727465515648
+23
+1.27938364528661
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.24539681310645
+20
+1.64826864473226
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.20214844470858
+20
+1.79083940859747
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+12
+2.22727465515648
+22
+1.72061635471339
+32
+3.0
+13
+2.22727465515648
+23
+1.72061635471339
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.743659607729131
+21
+1.57449302665047
+31
+3.0
+12
+0.74
+22
+1.5
+32
+3.0
+13
+0.74
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.743659607729131
+20
+1.57449302665047
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.754603186893545
+22
+1.64826864473226
+32
+3.0
+13
+0.754603186893545
+23
+1.64826864473226
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.26
+20
+1.5
+30
+3.0
+11
+2.24539681310645
+21
+1.64826864473226
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.24539681310645
+20
+1.64826864473226
+30
+3.0
+11
+2.26
+21
+1.5
+31
+3.0
+12
+2.25634039227087
+22
+1.57449302665047
+32
+3.0
+13
+2.25634039227087
+23
+1.57449302665047
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.82973983909525
+20
+1.14173848001224
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+3.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.82973983909525
+21
+1.14173848001224
+31
+3.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+3.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.13191690534993
+20
+1.9222333770949
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+12
+2.08748794455568
+22
+1.98213889596437
+32
+3.0
+13
+2.08748794455568
+23
+1.98213889596437
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.772725344843521
+20
+1.27938364528661
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.754603186893545
+22
+1.35173135526774
+32
+3.0
+13
+0.754603186893545
+23
+1.35173135526774
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.772725344843521
+21
+1.27938364528661
+31
+3.0
+12
+0.797851555291422
+22
+1.20916059140253
+32
+3.0
+13
+0.797851555291422
+23
+1.20916059140253
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.01786110403563
+20
+0.91251205544432
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+3.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.01786110403563
+21
+0.91251205544432
+31
+3.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+3.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.20214844470858
+20
+1.79083940859747
+30
+3.0
+11
+2.13191690534993
+21
+1.9222333770949
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.13191690534993
+20
+1.9222333770949
+30
+3.0
+11
+2.20214844470858
+21
+1.79083940859747
+31
+3.0
+12
+2.17026016090475
+22
+1.85826151998776
+32
+3.0
+13
+2.17026016090475
+23
+1.85826151998776
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+0.91251205544432
+20
+1.01786110403563
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+0.868083094650066
+22
+1.0777666229051
+32
+3.0
+13
+0.868083094650066
+23
+1.0777666229051
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+0.91251205544432
+21
+1.01786110403563
+31
+3.0
+12
+0.962598846298224
+22
+0.962598846298224
+32
+3.0
+13
+0.962598846298224
+23
+0.962598846298224
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.9222333770949
+20
+2.13191690534993
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79083940859747
+20
+2.20214844470858
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+12
+1.85826151998776
+22
+2.17026016090475
+32
+3.0
+13
+1.85826151998776
+23
+2.17026016090475
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.27938364528661
+20
+0.772725344843521
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+3.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.27938364528661
+21
+0.772725344843521
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+2.03740115370178
+20
+2.03740115370178
+30
+3.0
+11
+1.9222333770949
+21
+2.13191690534993
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.9222333770949
+20
+2.13191690534993
+30
+3.0
+11
+2.03740115370178
+21
+2.03740115370178
+31
+3.0
+12
+1.98213889596437
+22
+2.08748794455568
+32
+3.0
+13
+1.98213889596437
+23
+2.08748794455568
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.64826864473226
+20
+2.24539681310645
+30
+3.0
+11
+1.5
+21
+2.26
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+2.26
+30
+3.0
+11
+1.64826864473226
+21
+2.24539681310645
+31
+3.0
+12
+1.57449302665047
+22
+2.25634039227087
+32
+3.0
+13
+1.57449302665047
+23
+2.25634039227087
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.14173848001224
+20
+0.82973983909525
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.0777666229051
+22
+0.868083094650066
+32
+3.0
+13
+1.0777666229051
+23
+0.868083094650066
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.14173848001224
+21
+0.82973983909525
+31
+3.0
+12
+1.20916059140253
+22
+0.797851555291422
+32
+3.0
+13
+1.20916059140253
+23
+0.797851555291422
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.42550697334953
+20
+0.743659607729131
+30
+3.0
+11
+1.5
+21
+1.5
+31
+3.0
+12
+1.35173135526774
+22
+0.754603186893545
+32
+3.0
+13
+1.35173135526774
+23
+0.754603186893545
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.5
+20
+1.5
+30
+3.0
+11
+1.42550697334953
+21
+0.743659607729131
+31
+3.0
+12
+1.5
+22
+0.74
+32
+3.0
+13
+1.5
+23
+0.74
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.79083940859747
+20
+2.20214844470858
+30
+3.0
+11
+1.64826864473226
+21
+2.24539681310645
+31
+3.0
+12
+1.5
+22
+1.5
+32
+3.0
+13
+1.5
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+box
+10
+1.64826864473226
+20
+2.24539681310645
+30
+3.0
+11
+1.79083940859747
+21
+2.20214844470858
+31
+3.0
+12
+1.72061635471339
+22
+2.22727465515648
+32
+3.0
+13
+1.72061635471339
+23
+2.22727465515648
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+3.0
+30
+0.7275
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+0.7275
+12
+0.205
+22
+3.0
+32
+0.6475
+13
+0.205
+23
+3.0
+33
+0.6475
+70
+3
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.205
+20
+3.0
+30
+0.6475
+11
+0.0
+21
+3.0
+31
+0.7275
+12
+0.0
+22
+3.0
+32
+0.8525
+13
+0.0
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+0.205
+22
+3.0
+32
+0.0
+13
+0.205
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.497732043121052
+20
+3.0
+30
+0.0
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.8525
+22
+3.0
+32
+3.33066907387547e-16
+13
+0.8525
+23
+3.0
+33
+3.33066907387547e-16
+70
+3
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.8525
+20
+3.0
+30
+3.33066907387547e-16
+11
+0.205
+21
+3.0
+31
+0.205
+12
+0.6475
+22
+3.0
+32
+0.205
+13
+0.6475
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.42625
+20
+3.0
+30
+0.42625
+11
+0.6475
+21
+3.0
+31
+0.205
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.8525
+20
+3.0
+30
+3.33066907387547e-16
+11
+0.639832154473908
+21
+2.78733215447391
+31
+2.22163676695763e-16
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.212667845526092
+20
+2.36016784552609
+30
+1.10903230691784e-16
+11
+0.0
+21
+2.2725
+31
+0.0
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.2725
+30
+0.0
+11
+0.212667845526092
+21
+2.36016784552609
+31
+1.10903230691784e-16
+12
+0.0
+22
+2.1475
+32
+0.0
+13
+0.0
+23
+2.1475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.0
+12
+0.0
+22
+2.795
+32
+0.205
+13
+0.0
+23
+2.795
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+3.0
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+2.57375
+31
+0.42625
+12
+0.0
+22
+2.795
+32
+0.6475
+13
+0.0
+23
+2.795
+33
+0.6475
+70
+0
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.205
+20
+3.0
+30
+0.0
+11
+0.42625
+21
+2.57375
+31
+1.66533453693774e-16
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.42625
+20
+2.57375
+30
+1.66533453693774e-16
+11
+0.205
+21
+3.0
+31
+0.0
+12
+0.497732043121052
+22
+3.0
+32
+0.0
+13
+0.497732043121052
+23
+3.0
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.42625
+20
+2.57375
+30
+1.66533453693774e-16
+11
+0.497732043121052
+21
+3.0
+31
+0.0
+12
+0.639832154473908
+22
+2.78733215447391
+32
+2.22163676695763e-16
+13
+0.639832154473908
+23
+2.78733215447391
+33
+2.22163676695763e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.42625
+20
+2.57375
+30
+1.66533453693774e-16
+11
+0.0
+21
+2.795
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.795
+30
+0.0
+11
+0.42625
+21
+2.57375
+31
+1.66533453693774e-16
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.50226795687895
+30
+0.0
+11
+0.42625
+21
+2.57375
+31
+1.66533453693774e-16
+12
+0.212667845526092
+22
+2.36016784552609
+32
+1.10903230691784e-16
+13
+0.212667845526092
+23
+2.36016784552609
+33
+1.10903230691784e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.3525
+30
+0.205
+11
+0.0
+21
+2.2725
+31
+0.0
+12
+0.0
+22
+2.1475
+32
+0.0
+13
+0.0
+23
+2.1475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.2725
+30
+0.0
+11
+0.0
+21
+2.3525
+31
+0.205
+12
+0.0
+22
+2.50226795687895
+32
+0.0
+13
+0.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.50226795687895
+30
+0.0
+11
+0.0
+21
+2.3525
+31
+0.205
+12
+0.0
+22
+2.795
+32
+0.205
+13
+0.0
+23
+2.795
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.50226795687895
+30
+0.0
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.795
+32
+0.0
+13
+0.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.205
+20
+3.0
+30
+0.205
+11
+0.205
+21
+3.0
+31
+0.0
+12
+0.0
+22
+3.0
+32
+0.0
+13
+0.0
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+2.3525
+31
+0.205
+12
+0.0
+22
+2.57375
+32
+0.42625
+13
+0.0
+23
+2.57375
+33
+0.42625
+70
+0
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.205
+20
+3.0
+30
+0.6475
+11
+0.42625
+21
+3.0
+31
+0.42625
+12
+0.205
+22
+3.0
+32
+0.205
+13
+0.205
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+3.0
+30
+0.8525
+11
+0.0
+21
+2.795
+31
+0.205
+12
+0.0
+22
+2.795
+32
+0.6475
+13
+0.0
+23
+2.795
+33
+0.6475
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.795
+30
+0.205
+11
+0.0
+21
+3.0
+31
+0.8525
+12
+0.0
+22
+3.0
+32
+0.205
+13
+0.0
+23
+3.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+3.0
+30
+0.205
+11
+0.0
+21
+3.0
+31
+0.8525
+12
+0.0
+22
+3.0
+32
+0.7275
+13
+0.0
+23
+3.0
+33
+0.7275
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.212667845526092
+20
+2.36016784552609
+30
+1.10903230691784e-16
+11
+0.0
+21
+2.3525
+31
+0.205
+12
+0.0
+22
+2.1475
+32
+0.0
+13
+0.0
+23
+2.1475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.3525
+30
+0.205
+11
+0.212667845526092
+21
+2.36016784552609
+31
+1.10903230691784e-16
+12
+0.42625
+22
+2.57375
+32
+1.66533453693774e-16
+13
+0.42625
+23
+2.57375
+33
+1.66533453693774e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.3525
+30
+0.205
+11
+0.42625
+21
+2.57375
+31
+1.66533453693774e-16
+12
+0.639832154473908
+22
+2.78733215447391
+32
+2.22163676695763e-16
+13
+0.639832154473908
+23
+2.78733215447391
+33
+2.22163676695763e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.3525
+30
+0.205
+11
+0.639832154473908
+21
+2.78733215447391
+31
+2.22163676695763e-16
+12
+0.8525
+22
+3.0
+32
+3.33066907387547e-16
+13
+0.8525
+23
+3.0
+33
+3.33066907387547e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.3525
+30
+0.205
+11
+0.8525
+21
+3.0
+31
+3.33066907387547e-16
+12
+0.6475
+22
+3.0
+32
+0.205
+13
+0.6475
+23
+3.0
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.3525
+30
+0.205
+11
+0.6475
+21
+3.0
+31
+0.205
+12
+0.42625
+22
+3.0
+32
+0.42625
+13
+0.42625
+23
+3.0
+33
+0.42625
+70
+13
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.3525
+30
+0.205
+11
+0.42625
+21
+3.0
+31
+0.42625
+12
+0.0
+22
+2.57375
+32
+0.42625
+13
+0.0
+23
+2.57375
+33
+0.42625
+70
+3
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.57375
+30
+0.42625
+11
+0.42625
+21
+3.0
+31
+0.42625
+12
+0.205
+22
+3.0
+32
+0.6475
+13
+0.205
+23
+3.0
+33
+0.6475
+70
+13
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.57375
+30
+0.42625
+11
+0.205
+21
+3.0
+31
+0.6475
+12
+0.0
+22
+2.795
+32
+0.6475
+13
+0.0
+23
+2.795
+33
+0.6475
+70
+3
+ 0
+3DFACE
+ 8
+iso_dwn
+10
+0.0
+20
+2.795
+30
+0.6475
+11
+0.205
+21
+3.0
+31
+0.6475
+12
+0.0
+22
+3.0
+32
+0.8525
+13
+0.0
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+1.5
+20
+5.55111512312578e-17
+30
+0.0
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+0.0
+12
+1.26776612947519
+22
+0.332481491301359
+32
+-1.32155935006511e-16
+13
+1.26776612947519
+23
+0.332481491301359
+33
+-1.32155935006511e-16
+70
+0
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.205
+13
+0.0
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.205
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.205
+30
+0.205
+11
+0.0
+21
+0.497732043121051
+31
+0.0
+12
+0.0
+22
+0.205
+32
+0.0
+13
+0.0
+23
+0.205
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.0
+21
+0.205
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+0.878679656440357
+32
+0.0
+13
+0.0
+23
+0.878679656440357
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.878679656440357
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.20163144893051
+32
+0.0
+13
+0.0
+23
+1.20163144893051
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.20163144893051
+30
+0.0
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.0
+13
+0.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.283212517800539
+20
+1.74203407868223
+30
+1.35872768146951e-17
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+1.79836855106949
+32
+0.0
+13
+0.0
+23
+1.79836855106949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.283212517800539
+21
+1.74203407868223
+31
+1.35872768146951e-17
+12
+0.452270081490105
+22
+1.5
+32
+-1.14382698113301e-17
+13
+0.452270081490105
+23
+1.5
+33
+-1.14382698113301e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.452270081490105
+20
+1.5
+30
+-1.14382698113301e-17
+11
+0.0
+21
+1.20163144893051
+31
+0.0
+12
+0.0
+22
+1.5
+32
+0.0
+13
+0.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.20163144893051
+30
+0.0
+11
+0.452270081490105
+21
+1.5
+31
+-1.14382698113301e-17
+12
+0.580081389077038
+22
+1.31701681130471
+32
+-3.03581440100583e-17
+13
+0.580081389077038
+23
+1.31701681130471
+33
+-3.03581440100583e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.580081389077038
+20
+1.31701681130471
+30
+-3.03581440100583e-17
+11
+0.0
+21
+0.878679656440357
+31
+0.0
+12
+0.0
+22
+1.20163144893051
+32
+0.0
+13
+0.0
+23
+1.20163144893051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.878679656440357
+30
+0.0
+11
+0.580081389077038
+21
+1.31701681130471
+31
+-3.03581440100583e-17
+12
+0.687379562118009
+22
+1.16340159356772
+32
+-4.6241464304765e-17
+13
+0.687379562118009
+23
+1.16340159356772
+33
+-4.6241464304765e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0257305779793495
+20
+2.1106623891929
+30
+5.17022605499795e-17
+11
+0.0
+21
+1.79836855106949
+31
+0.0
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.0257305779793495
+21
+2.1106623891929
+31
+5.17022605499795e-17
+12
+0.283212517800539
+22
+1.74203407868223
+32
+1.35872768146951e-17
+13
+0.283212517800539
+23
+1.74203407868223
+33
+1.35872768146951e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.785661664350193
+20
+1.02269438387197
+30
+-6.07901380123296e-17
+11
+0.0
+21
+0.205
+31
+0.0
+12
+0.0
+22
+0.497732043121051
+32
+0.0
+13
+0.0
+23
+0.497732043121051
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.205
+30
+0.0
+11
+0.785661664350193
+21
+1.02269438387197
+31
+-6.07901380123296e-17
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.0
+30
+0.0
+11
+0.785661664350193
+21
+1.02269438387197
+31
+-6.07901380123296e-17
+12
+0.883139136394791
+22
+0.883139136394791
+32
+-7.52197025251519e-17
+13
+0.883139136394791
+23
+0.883139136394791
+33
+-7.52197025251519e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.987752578969539
+20
+0.733367557775276
+30
+-9.07056028760568e-17
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+0.0
+12
+0.497732043121053
+22
+0.0
+32
+0.0
+13
+0.497732043121053
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+0.0
+11
+0.987752578969539
+21
+0.733367557775276
+31
+-9.07056028760568e-17
+12
+1.10997225325072
+22
+0.558389724096058
+32
+-1.08797749069277e-16
+13
+1.10997225325072
+23
+0.558389724096058
+33
+-1.08797749069277e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+1.10997225325072
+20
+0.558389724096058
+30
+-1.08797749069277e-16
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+0.0
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+0.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.10997225325072
+21
+0.558389724096058
+31
+-1.08797749069277e-16
+12
+1.26776612947519
+22
+0.332481491301359
+32
+-1.32155935006511e-16
+13
+1.26776612947519
+23
+0.332481491301359
+33
+-1.32155935006511e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.883139136394791
+30
+0.883139136394791
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+0.205
+32
+0.205
+13
+0.0
+23
+0.205
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.5
+30
+0.205
+11
+0.0
+21
+0.883139136394791
+31
+0.883139136394791
+12
+0.0
+22
+1.5
+32
+0.452270081490105
+13
+0.0
+23
+1.5
+33
+0.452270081490105
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.883139136394791
+30
+0.883139136394791
+11
+0.0
+21
+0.205
+31
+0.205
+12
+0.0
+22
+0.205
+32
+1.35681024447031
+13
+0.0
+23
+0.205
+33
+1.35681024447031
+70
+0
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.85400833333333
+30
+0.205
+11
+0.0
+21
+1.5
+31
+0.0
+12
+0.0
+22
+1.5
+32
+0.205
+13
+0.0
+23
+1.5
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.5
+30
+0.0
+11
+0.0
+21
+1.85400833333333
+31
+0.205
+12
+0.0
+22
+1.79836855106949
+32
+0.0
+13
+0.0
+23
+1.79836855106949
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.79836855106949
+30
+0.0
+11
+0.0
+21
+1.85400833333333
+31
+0.205
+12
+0.0
+22
+2.12132034355964
+32
+0.0
+13
+0.0
+23
+2.12132034355964
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+2.12132034355964
+30
+0.0
+11
+0.0
+21
+1.85400833333333
+31
+0.205
+12
+0.0
+22
+2.1475
+32
+0.0
+13
+0.0
+23
+2.1475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.85400833333333
+30
+0.205
+11
+0.0
+21
+1.5
+31
+0.205
+12
+0.0
+22
+1.5
+32
+0.452270081490105
+13
+0.0
+23
+1.5
+33
+0.452270081490105
+70
+0
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.205
+30
+1.35681024447031
+11
+0.0
+21
+0.0
+31
+0.205
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.205
+31
+1.35681024447031
+12
+0.0
+22
+0.205
+32
+0.205
+13
+0.0
+23
+0.205
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.687379562118009
+20
+1.16340159356772
+30
+-4.6241464304765e-17
+11
+0.0
+21
+0.497732043121051
+31
+0.0
+12
+0.0
+22
+0.878679656440357
+32
+0.0
+13
+0.0
+23
+0.878679656440357
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.497732043121051
+30
+0.0
+11
+0.687379562118009
+21
+1.16340159356772
+31
+-4.6241464304765e-17
+12
+0.785661664350193
+22
+1.02269438387197
+32
+-6.07901380123296e-17
+13
+0.785661664350193
+23
+1.02269438387197
+33
+-6.07901380123296e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.883139136394791
+20
+0.883139136394791
+30
+-7.52197025251519e-17
+11
+0.205
+21
+0.0
+31
+0.0
+12
+0.0
+22
+0.0
+32
+0.0
+13
+0.0
+23
+0.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.205
+20
+0.0
+30
+0.0
+11
+0.883139136394791
+21
+0.883139136394791
+31
+-7.52197025251519e-17
+12
+0.497732043121053
+22
+0.0
+32
+0.0
+13
+0.497732043121053
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.497732043121053
+20
+0.0
+30
+0.0
+11
+0.883139136394791
+21
+0.883139136394791
+31
+-7.52197025251519e-17
+12
+0.987752578969539
+22
+0.733367557775276
+32
+-9.07056028760568e-17
+13
+0.987752578969539
+23
+0.733367557775276
+33
+-9.07056028760568e-17
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.75
+20
+1.38777878078145e-17
+30
+0.75
+11
+0.205
+21
+0.0
+31
+0.205
+12
+1.295
+22
+2.39623136148263e-17
+32
+0.205
+13
+1.295
+23
+2.39623136148263e-17
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.205
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.205
+22
+0.0
+32
+0.0
+13
+0.205
+23
+0.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.205
+20
+3.79326200080262e-18
+30
+1.295
+11
+0.0
+21
+0.0
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.205
+21
+3.79326200080262e-18
+31
+1.295
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+1.295
+20
+2.39623136148263e-17
+30
+0.205
+11
+1.20163144893051
+21
+1.11022302462516e-16
+31
+0.0
+12
+1.5
+22
+5.55111512312578e-17
+32
+0.0
+13
+1.5
+23
+5.55111512312578e-17
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+1.20163144893051
+20
+1.11022302462516e-16
+30
+0.0
+11
+1.295
+21
+2.39623136148263e-17
+31
+0.205
+12
+0.878679656440358
+22
+1.66533453693773e-16
+32
+0.0
+13
+0.878679656440358
+23
+1.66533453693773e-16
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+0.0
+11
+1.295
+21
+2.39623136148263e-17
+31
+0.205
+12
+0.497732043121053
+22
+0.0
+32
+0.0
+13
+0.497732043121053
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.497732043121053
+20
+0.0
+30
+0.0
+11
+1.295
+21
+2.39623136148263e-17
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.0
+13
+0.205
+23
+0.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.205
+20
+0.0
+30
+0.0
+11
+1.295
+21
+2.39623136148263e-17
+31
+0.205
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.205
+20
+3.79326200080262e-18
+30
+1.295
+11
+0.205
+21
+0.0
+31
+0.205
+12
+0.75
+22
+1.38777878078145e-17
+32
+0.75
+13
+0.75
+23
+1.38777878078145e-17
+33
+0.75
+70
+0
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.0
+30
+0.205
+11
+0.0
+21
+0.0
+31
+0.0
+12
+0.205
+22
+0.0
+32
+0.205
+13
+0.205
+23
+0.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0257305779793495
+20
+2.1106623891929
+30
+5.17022605499795e-17
+11
+0.0
+21
+2.12132034355964
+31
+0.0
+12
+0.0
+22
+2.1475
+32
+0.0
+13
+0.0
+23
+2.1475
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.205
+20
+3.79326200080262e-18
+30
+1.295
+11
+0.0
+21
+0.205
+31
+1.35681024447031
+12
+0.0
+22
+0.0
+32
+1.5
+13
+0.0
+23
+0.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.205
+30
+1.35681024447031
+11
+0.205
+21
+3.79326200080262e-18
+31
+1.295
+12
+0.75
+22
+1.38777878078145e-17
+32
+0.75
+13
+0.75
+23
+1.38777878078145e-17
+33
+0.75
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.205
+30
+1.35681024447031
+11
+0.75
+21
+1.38777878078145e-17
+31
+0.75
+12
+1.295
+22
+2.39623136148263e-17
+32
+0.205
+13
+1.295
+23
+2.39623136148263e-17
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.205
+30
+1.35681024447031
+11
+1.295
+21
+2.39623136148263e-17
+31
+0.205
+12
+1.5
+22
+5.55111512312578e-17
+32
+0.0
+13
+1.5
+23
+5.55111512312578e-17
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.205
+30
+1.35681024447031
+11
+1.5
+21
+5.55111512312578e-17
+31
+0.0
+12
+1.26776612947519
+22
+0.332481491301359
+32
+-1.32155935006511e-16
+13
+1.26776612947519
+23
+0.332481491301359
+33
+-1.32155935006511e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.205
+30
+1.35681024447031
+11
+1.26776612947519
+21
+0.332481491301359
+31
+-1.32155935006511e-16
+12
+0.0
+22
+0.883139136394791
+32
+0.883139136394791
+13
+0.0
+23
+0.883139136394791
+33
+0.883139136394791
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.883139136394791
+30
+0.883139136394791
+11
+1.26776612947519
+21
+0.332481491301359
+31
+-1.32155935006511e-16
+12
+1.10997225325072
+22
+0.558389724096058
+32
+-1.08797749069277e-16
+13
+1.10997225325072
+23
+0.558389724096058
+33
+-1.08797749069277e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.883139136394791
+30
+0.883139136394791
+11
+1.10997225325072
+21
+0.558389724096058
+31
+-1.08797749069277e-16
+12
+0.987752578969539
+22
+0.733367557775276
+32
+-9.07056028760568e-17
+13
+0.987752578969539
+23
+0.733367557775276
+33
+-9.07056028760568e-17
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.883139136394791
+30
+0.883139136394791
+11
+0.987752578969539
+21
+0.733367557775276
+31
+-9.07056028760568e-17
+12
+0.883139136394791
+22
+0.883139136394791
+32
+-7.52197025251519e-17
+13
+0.883139136394791
+23
+0.883139136394791
+33
+-7.52197025251519e-17
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.883139136394791
+30
+0.883139136394791
+11
+0.883139136394791
+21
+0.883139136394791
+31
+-7.52197025251519e-17
+12
+0.785661664350193
+22
+1.02269438387197
+32
+-6.07901380123296e-17
+13
+0.785661664350193
+23
+1.02269438387197
+33
+-6.07901380123296e-17
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+0.883139136394791
+30
+0.883139136394791
+11
+0.785661664350193
+21
+1.02269438387197
+31
+-6.07901380123296e-17
+12
+0.0
+22
+1.5
+32
+0.452270081490105
+13
+0.0
+23
+1.5
+33
+0.452270081490105
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.5
+30
+0.452270081490105
+11
+0.785661664350193
+21
+1.02269438387197
+31
+-6.07901380123296e-17
+12
+0.687379562118009
+22
+1.16340159356772
+32
+-4.6241464304765e-17
+13
+0.687379562118009
+23
+1.16340159356772
+33
+-4.6241464304765e-17
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.5
+30
+0.452270081490105
+11
+0.687379562118009
+21
+1.16340159356772
+31
+-4.6241464304765e-17
+12
+0.580081389077038
+22
+1.31701681130471
+32
+-3.03581440100583e-17
+13
+0.580081389077038
+23
+1.31701681130471
+33
+-3.03581440100583e-17
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.5
+30
+0.452270081490105
+11
+0.580081389077038
+21
+1.31701681130471
+31
+-3.03581440100583e-17
+12
+0.452270081490105
+22
+1.5
+32
+-1.14382698113301e-17
+13
+0.452270081490105
+23
+1.5
+33
+-1.14382698113301e-17
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.5
+30
+0.452270081490105
+11
+0.452270081490105
+21
+1.5
+31
+-1.14382698113301e-17
+12
+0.283212517800539
+22
+1.74203407868223
+32
+1.35872768146951e-17
+13
+0.283212517800539
+23
+1.74203407868223
+33
+1.35872768146951e-17
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.5
+30
+0.452270081490105
+11
+0.283212517800539
+21
+1.74203407868223
+31
+1.35872768146951e-17
+12
+0.0
+22
+1.85400833333333
+32
+0.205
+13
+0.0
+23
+1.85400833333333
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.85400833333333
+30
+0.205
+11
+0.283212517800539
+21
+1.74203407868223
+31
+1.35872768146951e-17
+12
+0.0257305779793495
+22
+2.1106623891929
+32
+5.17022605499795e-17
+13
+0.0257305779793495
+23
+2.1106623891929
+33
+5.17022605499795e-17
+70
+13
+ 0
+3DFACE
+ 8
+iso_swd
+10
+0.0
+20
+1.85400833333333
+30
+0.205
+11
+0.0257305779793495
+21
+2.1106623891929
+31
+5.17022605499795e-17
+12
+0.0
+22
+2.1475
+32
+0.0
+13
+0.0
+23
+2.1475
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.5
+20
+3.0
+30
+0.452270081490105
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+1.5
+21
+3.0
+31
+0.452270081490105
+12
+2.11686086360521
+22
+3.0
+32
+0.883139136394791
+13
+2.11686086360521
+23
+3.0
+33
+0.883139136394791
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.83659840643228
+21
+2.31262043788199
+31
+1.75803140620266e-16
+12
+1.68298318869529
+22
+2.41991861092296
+32
+1.91686460914973e-16
+13
+1.68298318869529
+23
+2.41991861092296
+33
+1.91686460914973e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.83659840643228
+20
+2.31262043788199
+30
+1.75803140620266e-16
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.97730561612803
+21
+2.2143383356498
+31
+1.61254466912702e-16
+12
+1.83659840643228
+22
+2.31262043788199
+32
+1.75803140620266e-16
+13
+1.83659840643228
+23
+2.31262043788199
+33
+1.75803140620266e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.97730561612803
+20
+2.2143383356498
+30
+1.61254466912702e-16
+11
+2.12132034355964
+21
+3.0
+31
+0.0
+12
+2.50226795687895
+22
+3.0
+32
+0.0
+13
+2.50226795687895
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.50226795687895
+20
+3.0
+30
+0.0
+11
+2.11686086360521
+21
+2.11686086360521
+31
+1.46824902399879e-16
+12
+1.97730561612803
+22
+2.2143383356498
+32
+1.61254466912702e-16
+13
+1.97730561612803
+23
+2.2143383356498
+33
+1.61254466912702e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.11686086360521
+20
+2.11686086360521
+30
+1.46824902399879e-16
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.50226795687895
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.5
+20
+3.0
+30
+0.452270081490105
+11
+1.5
+21
+3.0
+31
+0.205
+12
+1.35441740918437
+22
+3.0
+32
+0.350582590815627
+13
+1.35441740918437
+23
+3.0
+33
+0.350582590815627
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+2.795
+21
+3.0
+31
+1.35681024447031
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.795
+20
+3.0
+30
+1.35681024447031
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+2.32009652509653
+22
+3.0
+32
+1.02509652509653
+13
+2.32009652509653
+23
+3.0
+33
+1.02509652509653
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.1475
+20
+3.0
+30
+0.8525
+11
+2.795
+21
+3.0
+31
+0.205
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.35441740918437
+20
+3.0
+30
+0.350582590815627
+11
+1.5
+21
+3.0
+31
+0.205
+12
+1.14599166666667
+22
+3.0
+32
+0.205
+13
+1.14599166666667
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+2.44161027590394
+21
+1.89002774674928
+31
+1.13246855855755e-16
+12
+2.26663244222472
+22
+2.01224742103046
+32
+1.31339002048974e-16
+13
+2.26663244222472
+23
+2.01224742103046
+33
+1.31339002048974e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.44161027590394
+20
+1.89002774674928
+30
+1.13246855855755e-16
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.795
+20
+3.0
+30
+1.35681024447031
+11
+3.0
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+3.0
+30
+0.205
+11
+2.795
+21
+3.0
+31
+1.35681024447031
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.5
+21
+2.54772991850989
+31
+2.10606335113701e-16
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.5
+20
+2.54772991850989
+30
+2.10606335113701e-16
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.68298318869529
+22
+2.41991861092296
+32
+1.91686460914973e-16
+13
+1.68298318869529
+23
+2.41991861092296
+33
+1.91686460914973e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+1.5
+30
+0.0
+11
+2.66751850869864
+21
+1.73223387052481
+31
+8.98886699185201e-17
+12
+3.0
+22
+1.79836855106949
+32
+0.0
+13
+3.0
+23
+1.79836855106949
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+3.0
+30
+0.0
+11
+2.26663244222472
+21
+2.01224742103046
+31
+1.31339002048974e-16
+12
+2.11686086360521
+22
+2.11686086360521
+32
+1.46824902399879e-16
+13
+2.11686086360521
+23
+2.11686086360521
+33
+1.46824902399879e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.26663244222472
+20
+2.01224742103046
+30
+1.31339002048974e-16
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+0.0
+13
+3.0
+23
+2.50226795687895
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+2.50226795687895
+30
+0.0
+11
+3.0
+21
+3.0
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.20163144893051
+20
+3.0
+30
+0.0
+11
+0.889337610807103
+21
+2.97426942202065
+31
+2.73746865475011e-16
+12
+0.878679656440356
+22
+3.0
+32
+0.0
+13
+0.878679656440356
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+0.889337610807103
+20
+2.97426942202065
+30
+2.73746865475011e-16
+11
+1.20163144893051
+21
+3.0
+31
+0.0
+12
+1.25796592131777
+22
+2.71678748219946
+32
+2.35631881739726e-16
+13
+1.25796592131777
+23
+2.71678748219946
+33
+2.35631881739726e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.795
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+1.79836855106949
+30
+0.0
+11
+3.0
+21
+1.705
+31
+0.205
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+1.705
+30
+0.205
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+1.79836855106949
+31
+0.0
+12
+3.0
+22
+2.12132034355964
+32
+0.0
+13
+3.0
+23
+2.12132034355964
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+3.0
+22
+2.50226795687895
+32
+0.0
+13
+3.0
+23
+2.50226795687895
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+2.50226795687895
+31
+0.0
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+0.8525
+20
+3.0
+30
+3.33066907387547e-16
+11
+1.20163144893051
+21
+3.0
+31
+0.0
+12
+0.878679656440356
+22
+3.0
+32
+0.0
+13
+0.878679656440356
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.20163144893051
+20
+3.0
+30
+0.0
+11
+0.8525
+21
+3.0
+31
+3.33066907387547e-16
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.5
+20
+3.0
+30
+0.0
+11
+0.8525
+21
+3.0
+31
+3.33066907387547e-16
+12
+1.5
+22
+3.0
+32
+0.205
+13
+1.5
+23
+3.0
+33
+0.205
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.5
+20
+3.0
+30
+0.205
+11
+0.8525
+21
+3.0
+31
+3.33066907387547e-16
+12
+1.14599166666667
+22
+3.0
+32
+0.205
+13
+1.14599166666667
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.5
+20
+3.0
+30
+0.0
+11
+1.25796592131777
+21
+2.71678748219946
+31
+2.35631881739726e-16
+12
+1.20163144893051
+22
+3.0
+32
+0.0
+13
+1.20163144893051
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.25796592131777
+20
+2.71678748219946
+30
+2.35631881739726e-16
+11
+1.5
+21
+3.0
+31
+0.0
+12
+1.5
+22
+2.54772991850989
+32
+2.10606335113701e-16
+13
+1.5
+23
+2.54772991850989
+33
+2.10606335113701e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+2.12132034355964
+30
+0.0
+11
+2.66751850869864
+21
+1.73223387052481
+31
+8.98886699185201e-17
+12
+2.44161027590394
+22
+1.89002774674928
+32
+1.13246855855755e-16
+13
+2.44161027590394
+23
+1.89002774674928
+33
+1.13246855855755e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.66751850869864
+20
+1.73223387052481
+30
+8.98886699185201e-17
+11
+3.0
+21
+2.12132034355964
+31
+0.0
+12
+3.0
+22
+1.79836855106949
+32
+0.0
+13
+3.0
+23
+1.79836855106949
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+2.795
+30
+0.205
+11
+3.0
+21
+2.25
+31
+0.75
+12
+3.0
+22
+1.705
+32
+0.205
+13
+3.0
+23
+1.705
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+3.0
+32
+0.0
+13
+3.0
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+3.0
+31
+0.0
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+3.0
+30
+0.0
+11
+3.0
+21
+2.795
+31
+0.205
+12
+3.0
+22
+2.795
+32
+0.0
+13
+3.0
+23
+2.795
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+2.795
+30
+1.295
+11
+3.0
+21
+2.25
+31
+0.75
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.5
+20
+3.0
+30
+0.205
+11
+1.79836855106949
+21
+3.0
+31
+0.0
+12
+1.5
+22
+3.0
+32
+0.0
+13
+1.5
+23
+3.0
+33
+0.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.79836855106949
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.12132034355964
+22
+3.0
+32
+0.0
+13
+2.12132034355964
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.12132034355964
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.50226795687895
+22
+3.0
+32
+0.0
+13
+2.50226795687895
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.50226795687895
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.0
+13
+2.795
+23
+3.0
+33
+0.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.795
+20
+3.0
+30
+0.0
+11
+1.5
+21
+3.0
+31
+0.205
+12
+2.795
+22
+3.0
+32
+0.205
+13
+2.795
+23
+3.0
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+3.0
+30
+0.205
+11
+3.0
+21
+2.795
+31
+1.295
+12
+3.0
+22
+2.795
+32
+0.205
+13
+3.0
+23
+2.795
+33
+0.205
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+2.795
+30
+1.295
+11
+3.0
+21
+3.0
+31
+0.205
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.32009652509653
+20
+3.0
+30
+1.02509652509653
+11
+2.1475
+21
+3.0
+31
+0.8525
+12
+2.11686086360521
+22
+3.0
+32
+0.883139136394791
+13
+2.11686086360521
+23
+3.0
+33
+0.883139136394791
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+0.889337610807103
+20
+2.97426942202065
+30
+2.73746865475011e-16
+11
+0.8525
+21
+3.0
+31
+3.33066907387547e-16
+12
+0.878679656440356
+22
+3.0
+32
+0.0
+13
+0.878679656440356
+23
+3.0
+33
+0.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_den
+10
+0.889337610807103
+20
+2.97426942202065
+30
+2.73746865475011e-16
+11
+1.14599166666667
+21
+3.0
+31
+0.205
+12
+0.8525
+22
+3.0
+32
+3.33066907387547e-16
+13
+0.8525
+23
+3.0
+33
+3.33066907387547e-16
+70
+1
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.14599166666667
+20
+3.0
+30
+0.205
+11
+0.889337610807103
+21
+2.97426942202065
+31
+2.73746865475011e-16
+12
+1.25796592131777
+22
+2.71678748219946
+32
+2.35631881739726e-16
+13
+1.25796592131777
+23
+2.71678748219946
+33
+2.35631881739726e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.14599166666667
+20
+3.0
+30
+0.205
+11
+1.25796592131777
+21
+2.71678748219946
+31
+2.35631881739726e-16
+12
+1.35441740918437
+22
+3.0
+32
+0.350582590815627
+13
+1.35441740918437
+23
+3.0
+33
+0.350582590815627
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.35441740918437
+20
+3.0
+30
+0.350582590815627
+11
+1.25796592131777
+21
+2.71678748219946
+31
+2.35631881739726e-16
+12
+1.5
+22
+2.54772991850989
+32
+2.10606335113701e-16
+13
+1.5
+23
+2.54772991850989
+33
+2.10606335113701e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.35441740918437
+20
+3.0
+30
+0.350582590815627
+11
+1.5
+21
+2.54772991850989
+31
+2.10606335113701e-16
+12
+1.5
+22
+3.0
+32
+0.452270081490105
+13
+1.5
+23
+3.0
+33
+0.452270081490105
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.5
+20
+3.0
+30
+0.452270081490105
+11
+1.5
+21
+2.54772991850989
+31
+2.10606335113701e-16
+12
+1.68298318869529
+22
+2.41991861092296
+32
+1.91686460914973e-16
+13
+1.68298318869529
+23
+2.41991861092296
+33
+1.91686460914973e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+1.5
+20
+3.0
+30
+0.452270081490105
+11
+1.68298318869529
+21
+2.41991861092296
+31
+1.91686460914973e-16
+12
+2.11686086360521
+22
+3.0
+32
+0.883139136394791
+13
+2.11686086360521
+23
+3.0
+33
+0.883139136394791
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.11686086360521
+20
+3.0
+30
+0.883139136394791
+11
+1.68298318869529
+21
+2.41991861092296
+31
+1.91686460914973e-16
+12
+1.83659840643228
+22
+2.31262043788199
+32
+1.75803140620266e-16
+13
+1.83659840643228
+23
+2.31262043788199
+33
+1.75803140620266e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.11686086360521
+20
+3.0
+30
+0.883139136394791
+11
+1.83659840643228
+21
+2.31262043788199
+31
+1.75803140620266e-16
+12
+1.97730561612803
+22
+2.2143383356498
+32
+1.61254466912702e-16
+13
+1.97730561612803
+23
+2.2143383356498
+33
+1.61254466912702e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.11686086360521
+20
+3.0
+30
+0.883139136394791
+11
+1.97730561612803
+21
+2.2143383356498
+31
+1.61254466912702e-16
+12
+2.11686086360521
+22
+2.11686086360521
+32
+1.46824902399879e-16
+13
+2.11686086360521
+23
+2.11686086360521
+33
+1.46824902399879e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.11686086360521
+20
+3.0
+30
+0.883139136394791
+11
+2.11686086360521
+21
+2.11686086360521
+31
+1.46824902399879e-16
+12
+2.26663244222472
+22
+2.01224742103046
+32
+1.31339002048974e-16
+13
+2.26663244222472
+23
+2.01224742103046
+33
+1.31339002048974e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.11686086360521
+20
+3.0
+30
+0.883139136394791
+11
+2.26663244222472
+21
+2.01224742103046
+31
+1.31339002048974e-16
+12
+2.32009652509653
+22
+3.0
+32
+1.02509652509653
+13
+2.32009652509653
+23
+3.0
+33
+1.02509652509653
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.32009652509653
+20
+3.0
+30
+1.02509652509653
+11
+2.26663244222472
+21
+2.01224742103046
+31
+1.31339002048974e-16
+12
+2.44161027590394
+22
+1.89002774674928
+32
+1.13246855855755e-16
+13
+2.44161027590394
+23
+1.89002774674928
+33
+1.13246855855755e-16
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.32009652509653
+20
+3.0
+30
+1.02509652509653
+11
+2.44161027590394
+21
+1.89002774674928
+31
+1.13246855855755e-16
+12
+2.795
+22
+3.0
+32
+1.35681024447031
+13
+2.795
+23
+3.0
+33
+1.35681024447031
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.795
+20
+3.0
+30
+1.35681024447031
+11
+2.44161027590394
+21
+1.89002774674928
+31
+1.13246855855755e-16
+12
+2.66751850869864
+22
+1.73223387052481
+32
+8.98886699185201e-17
+13
+2.66751850869864
+23
+1.73223387052481
+33
+8.98886699185201e-17
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.795
+20
+3.0
+30
+1.35681024447031
+11
+2.66751850869864
+21
+1.73223387052481
+31
+8.98886699185201e-17
+12
+3.0
+22
+1.5
+32
+0.0
+13
+3.0
+23
+1.5
+33
+0.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+2.795
+20
+3.0
+30
+1.35681024447031
+11
+3.0
+21
+1.5
+31
+0.0
+12
+3.0
+22
+3.0
+32
+1.5
+13
+3.0
+23
+3.0
+33
+1.5
+70
+3
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+3.0
+30
+1.5
+11
+3.0
+21
+1.5
+31
+0.0
+12
+3.0
+22
+1.705
+32
+0.205
+13
+3.0
+23
+1.705
+33
+0.205
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+3.0
+30
+1.5
+11
+3.0
+21
+1.705
+31
+0.205
+12
+3.0
+22
+2.25
+32
+0.75
+13
+3.0
+23
+2.25
+33
+0.75
+70
+13
+ 0
+3DFACE
+ 8
+iso_den
+10
+3.0
+20
+3.0
+30
+1.5
+11
+3.0
+21
+2.25
+31
+0.75
+12
+3.0
+22
+2.795
+32
+1.295
+13
+3.0
+23
+2.795
+33
+1.295
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.350582590815627
+21
+3.0
+31
+1.35441740918437
+12
+0.205
+22
+3.0
+32
+1.14599166666667
+13
+0.205
+23
+3.0
+33
+1.14599166666667
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.8525
+20
+3.0
+30
+2.1475
+11
+0.452270081490105
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.452270081490105
+20
+3.0
+30
+1.5
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+0.883139136394791
+22
+3.0
+32
+2.11686086360521
+13
+0.883139136394791
+23
+3.0
+33
+2.11686086360521
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.205
+21
+3.0
+31
+1.14599166666667
+12
+0.0
+22
+3.0
+32
+0.8525
+13
+0.0
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.205
+20
+3.0
+30
+1.14599166666667
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.75
+20
+2.25
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.75
+21
+2.25
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.497732043121052
+20
+3.0
+30
+3.0
+11
+0.75
+21
+2.25
+31
+3.0
+12
+0.899184275534744
+22
+2.39918427553474
+32
+3.0
+13
+0.899184275534744
+23
+2.39918427553474
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.600815724465256
+20
+2.10081572446526
+30
+3.0
+11
+0.0
+21
+2.795
+31
+3.0
+12
+0.0
+22
+2.50226795687895
+32
+3.0
+13
+0.0
+23
+2.50226795687895
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.795
+30
+3.0
+11
+0.600815724465256
+21
+2.10081572446526
+31
+3.0
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.600815724465256
+21
+2.10081572446526
+31
+3.0
+12
+0.75
+22
+2.25
+32
+3.0
+13
+0.75
+23
+2.25
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.899184275534744
+20
+2.39918427553474
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.878679656440356
+20
+3.0
+30
+3.0
+11
+0.899184275534744
+21
+2.39918427553474
+31
+3.0
+12
+1.06066017177982
+22
+2.56066017177982
+32
+3.0
+13
+1.06066017177982
+23
+2.56066017177982
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.248866021560526
+20
+1.74886602156053
+30
+3.0
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.439339828220179
+20
+1.93933982822018
+30
+3.0
+11
+0.0
+21
+2.50226795687895
+31
+3.0
+12
+0.0
+22
+2.12132034355964
+32
+3.0
+13
+0.0
+23
+2.12132034355964
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.50226795687895
+30
+3.0
+11
+0.439339828220179
+21
+1.93933982822018
+31
+3.0
+12
+0.600815724465256
+22
+2.10081572446526
+32
+3.0
+13
+0.600815724465256
+23
+2.10081572446526
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+2.795
+13
+0.0
+23
+3.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.205
+20
+3.0
+30
+2.795
+11
+0.8525
+21
+3.0
+31
+2.1475
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.5477299185099
+31
+1.5
+12
+0.0
+22
+2.11686086360521
+32
+2.11686086360521
+13
+0.0
+23
+2.11686086360521
+33
+2.11686086360521
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.5477299185099
+30
+1.5
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+2.795
+32
+1.5
+13
+0.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+3.0
+30
+3.0
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+2.795
+32
+3.0
+13
+0.0
+23
+2.795
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.0
+21
+2.795
+31
+1.5
+12
+0.0
+22
+2.795
+32
+2.795
+13
+0.0
+23
+2.795
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.795
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.11686086360521
+31
+2.11686086360521
+12
+0.0
+22
+1.64318975552969
+32
+2.795
+13
+0.0
+23
+1.64318975552969
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+3.0
+30
+1.5
+11
+0.0
+21
+2.795
+31
+1.14599166666667
+12
+0.0
+22
+2.795
+32
+1.5
+13
+0.0
+23
+2.795
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.795
+30
+1.14599166666667
+11
+0.0
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+0.8525
+13
+0.0
+23
+3.0
+33
+0.8525
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.205
+20
+3.0
+30
+2.795
+11
+1.02509652509652
+21
+3.0
+31
+2.32009652509652
+12
+0.8525
+22
+3.0
+32
+2.1475
+13
+0.8525
+23
+3.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.02509652509652
+20
+3.0
+30
+2.32009652509652
+11
+0.205
+21
+3.0
+31
+2.795
+12
+1.35681024447031
+22
+3.0
+32
+2.795
+13
+1.35681024447031
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.06066017177982
+20
+2.56066017177982
+30
+3.0
+11
+1.20163144893051
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.20163144893051
+20
+3.0
+30
+3.0
+11
+1.06066017177982
+21
+2.56066017177982
+31
+3.0
+12
+1.25113397843947
+22
+2.75113397843947
+32
+3.0
+13
+1.25113397843947
+23
+2.75113397843947
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.452270081490105
+20
+3.0
+30
+1.5
+11
+0.350582590815627
+21
+3.0
+31
+1.35441740918437
+12
+0.205
+22
+3.0
+32
+1.5
+13
+0.205
+23
+3.0
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.205
+20
+3.0
+30
+3.0
+11
+1.35681024447031
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.35681024447031
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+3.0
+12
+1.5
+22
+3.0
+32
+3.0
+13
+1.5
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+3.0
+12
+0.497732043121052
+22
+3.0
+32
+3.0
+13
+0.497732043121052
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.497732043121052
+21
+3.0
+31
+3.0
+12
+0.878679656440356
+22
+3.0
+32
+3.0
+13
+0.878679656440356
+23
+3.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.878679656440356
+21
+3.0
+31
+3.0
+12
+1.20163144893051
+22
+3.0
+32
+3.0
+13
+1.20163144893051
+23
+3.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.248866021560526
+20
+1.74886602156053
+30
+3.0
+11
+0.0
+21
+2.12132034355964
+31
+3.0
+12
+0.0
+22
+1.79836855106949
+32
+3.0
+13
+0.0
+23
+1.79836855106949
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.12132034355964
+30
+3.0
+11
+0.248866021560526
+21
+1.74886602156053
+31
+3.0
+12
+0.439339828220179
+22
+1.93933982822018
+32
+3.0
+13
+0.439339828220179
+23
+1.93933982822018
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.795
+30
+1.14599166666667
+11
+0.0
+21
+2.5477299185099
+31
+1.5
+12
+0.0
+22
+2.795
+32
+1.5
+13
+0.0
+23
+2.795
+33
+1.5
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.0
+21
+2.795
+31
+2.795
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+1.79836855106949
+30
+3.0
+11
+0.0
+21
+1.64318975552969
+31
+2.795
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+1.64318975552969
+30
+2.795
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+2.795
+32
+2.795
+13
+0.0
+23
+2.795
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+1.79836855106949
+31
+3.0
+12
+0.0
+22
+2.12132034355964
+32
+3.0
+13
+0.0
+23
+2.12132034355964
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.12132034355964
+31
+3.0
+12
+0.0
+22
+2.50226795687895
+32
+3.0
+13
+0.0
+23
+2.50226795687895
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+2.795
+30
+2.795
+11
+0.0
+21
+2.50226795687895
+31
+3.0
+12
+0.0
+22
+2.795
+32
+3.0
+13
+0.0
+23
+2.795
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.205
+20
+3.0
+30
+3.0
+11
+0.205
+21
+3.0
+31
+2.795
+12
+0.0
+22
+3.0
+32
+3.0
+13
+0.0
+23
+3.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.5
+20
+3.0
+30
+3.0
+11
+1.20163144893051
+21
+3.0
+31
+3.0
+12
+1.25113397843947
+22
+2.75113397843947
+32
+3.0
+13
+1.25113397843947
+23
+2.75113397843947
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+3.0
+30
+2.795
+11
+0.205
+21
+3.0
+31
+1.5
+12
+0.0
+22
+3.0
+32
+1.5
+13
+0.0
+23
+3.0
+33
+1.5
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.205
+20
+3.0
+30
+1.5
+11
+0.0
+21
+3.0
+31
+2.795
+12
+0.205
+22
+3.0
+32
+2.795
+13
+0.205
+23
+3.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.02509652509652
+20
+3.0
+30
+2.32009652509652
+11
+0.883139136394791
+21
+3.0
+31
+2.11686086360521
+12
+0.8525
+22
+3.0
+32
+2.1475
+13
+0.8525
+23
+3.0
+33
+2.1475
+70
+0
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+3.0
+30
+0.8525
+11
+1.35681024447031
+21
+3.0
+31
+2.795
+12
+0.0
+22
+2.795
+32
+1.14599166666667
+13
+0.0
+23
+2.795
+33
+1.14599166666667
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.35681024447031
+20
+3.0
+30
+2.795
+11
+0.0
+21
+3.0
+31
+0.8525
+12
+1.02509652509652
+22
+3.0
+32
+2.32009652509652
+13
+1.02509652509652
+23
+3.0
+33
+2.32009652509652
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.02509652509652
+20
+3.0
+30
+2.32009652509652
+11
+0.0
+21
+3.0
+31
+0.8525
+12
+0.205
+22
+3.0
+32
+1.14599166666667
+13
+0.205
+23
+3.0
+33
+1.14599166666667
+70
+13
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.02509652509652
+20
+3.0
+30
+2.32009652509652
+11
+0.205
+21
+3.0
+31
+1.14599166666667
+12
+0.350582590815627
+22
+3.0
+32
+1.35441740918437
+13
+0.350582590815627
+23
+3.0
+33
+1.35441740918437
+70
+13
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.02509652509652
+20
+3.0
+30
+2.32009652509652
+11
+0.350582590815627
+21
+3.0
+31
+1.35441740918437
+12
+0.452270081490105
+22
+3.0
+32
+1.5
+13
+0.452270081490105
+23
+3.0
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.02509652509652
+20
+3.0
+30
+2.32009652509652
+11
+0.452270081490105
+21
+3.0
+31
+1.5
+12
+0.883139136394791
+22
+3.0
+32
+2.11686086360521
+13
+0.883139136394791
+23
+3.0
+33
+2.11686086360521
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.0
+20
+1.64318975552969
+30
+2.795
+11
+0.248866021560526
+21
+1.74886602156053
+31
+3.0
+12
+0.0
+22
+1.5
+32
+3.0
+13
+0.0
+23
+1.5
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.248866021560526
+20
+1.74886602156053
+30
+3.0
+11
+0.0
+21
+1.64318975552969
+31
+2.795
+12
+0.0
+22
+2.11686086360521
+32
+2.11686086360521
+13
+0.0
+23
+2.11686086360521
+33
+2.11686086360521
+70
+13
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.248866021560526
+20
+1.74886602156053
+30
+3.0
+11
+0.0
+21
+2.11686086360521
+31
+2.11686086360521
+12
+0.439339828220179
+22
+1.93933982822018
+32
+3.0
+13
+0.439339828220179
+23
+1.93933982822018
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.439339828220179
+20
+1.93933982822018
+30
+3.0
+11
+0.0
+21
+2.11686086360521
+31
+2.11686086360521
+12
+0.600815724465256
+22
+2.10081572446526
+32
+3.0
+13
+0.600815724465256
+23
+2.10081572446526
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.600815724465256
+20
+2.10081572446526
+30
+3.0
+11
+0.0
+21
+2.11686086360521
+31
+2.11686086360521
+12
+0.75
+22
+2.25
+32
+3.0
+13
+0.75
+23
+2.25
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.75
+20
+2.25
+30
+3.0
+11
+0.0
+21
+2.11686086360521
+31
+2.11686086360521
+12
+0.0
+22
+2.5477299185099
+32
+1.5
+13
+0.0
+23
+2.5477299185099
+33
+1.5
+70
+13
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.75
+20
+2.25
+30
+3.0
+11
+0.0
+21
+2.5477299185099
+31
+1.5
+12
+0.899184275534744
+22
+2.39918427553474
+32
+3.0
+13
+0.899184275534744
+23
+2.39918427553474
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+0.899184275534744
+20
+2.39918427553474
+30
+3.0
+11
+0.0
+21
+2.5477299185099
+31
+1.5
+12
+1.06066017177982
+22
+2.56066017177982
+32
+3.0
+13
+1.06066017177982
+23
+2.56066017177982
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.06066017177982
+20
+2.56066017177982
+30
+3.0
+11
+0.0
+21
+2.5477299185099
+31
+1.5
+12
+0.0
+22
+2.795
+32
+1.14599166666667
+13
+0.0
+23
+2.795
+33
+1.14599166666667
+70
+13
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.06066017177982
+20
+2.56066017177982
+30
+3.0
+11
+0.0
+21
+2.795
+31
+1.14599166666667
+12
+1.25113397843947
+22
+2.75113397843947
+32
+3.0
+13
+1.25113397843947
+23
+2.75113397843947
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.25113397843947
+20
+2.75113397843947
+30
+3.0
+11
+0.0
+21
+2.795
+31
+1.14599166666667
+12
+1.5
+22
+3.0
+32
+3.0
+13
+1.5
+23
+3.0
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_unw
+10
+1.5
+20
+3.0
+30
+3.0
+11
+0.0
+21
+2.795
+31
+1.14599166666667
+12
+1.35681024447031
+22
+3.0
+32
+2.795
+13
+1.35681024447031
+23
+3.0
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.50226795687895
+20
+0.0
+30
+3.0
+11
+2.57375
+21
+0.426250000000001
+31
+3.0
+12
+2.36016784552609
+22
+0.212667845526093
+32
+3.0
+13
+2.36016784552609
+23
+0.212667845526093
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.57375
+20
+0.426250000000001
+30
+3.0
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.795
+22
+0.0
+32
+3.0
+13
+2.795
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.57375
+20
+0.426250000000001
+30
+3.0
+11
+2.795
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+2.99999999999999
+21
+0.852499999999996
+31
+3.0
+12
+2.7873321544739
+22
+0.639832154473909
+32
+3.0
+13
+2.7873321544739
+23
+0.639832154473909
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.0
+30
+2.795
+11
+2.795
+21
+1.79190321753102e-16
+31
+2.35249999999999
+12
+2.99999999999999
+22
+4.71844785465692e-16
+32
+2.1475
+13
+2.99999999999999
+23
+4.71844785465692e-16
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.795
+20
+1.79190321753102e-16
+30
+2.35249999999999
+11
+3.0
+21
+0.0
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.795
+20
+0.0
+30
+3.0
+11
+2.3525
+21
+5.67320709797468e-17
+31
+2.795
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.3525
+20
+5.67320709797468e-17
+30
+2.795
+11
+2.795
+21
+0.0
+31
+3.0
+12
+2.50226795687895
+22
+0.0
+32
+3.0
+13
+2.50226795687895
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.3525
+20
+5.67320709797468e-17
+30
+2.795
+11
+2.50226795687895
+21
+0.0
+31
+3.0
+12
+2.14749999999999
+22
+0.0
+32
+3.0
+13
+2.14749999999999
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.795
+20
+0.0
+30
+2.795
+11
+2.57375
+21
+1.17961196366424e-16
+31
+2.57375
+12
+2.795
+22
+1.79190321753102e-16
+32
+2.35249999999999
+13
+2.795
+23
+1.79190321753102e-16
+33
+2.35249999999999
+70
+0
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.795
+20
+0.0
+30
+3.0
+11
+2.795
+21
+0.0
+31
+2.795
+12
+3.0
+22
+0.0
+32
+3.0
+13
+3.0
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.205
+30
+2.795
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.99999999999999
+20
+4.71844785465692e-16
+30
+2.1475
+11
+3.0
+21
+0.205
+31
+2.795
+12
+3.0
+22
+0.0
+32
+2.795
+13
+3.0
+23
+0.0
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.205
+30
+2.795
+11
+2.99999999999999
+21
+4.71844785465692e-16
+31
+2.1475
+12
+3.0
+22
+0.205
+32
+2.3525
+13
+3.0
+23
+0.205
+33
+2.3525
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.205
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.99999999999999
+20
+0.647499999999997
+30
+2.795
+11
+3.0
+21
+0.205
+31
+3.0
+12
+3.0
+22
+0.205
+32
+2.795
+13
+3.0
+23
+0.205
+33
+2.795
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.205
+30
+3.0
+11
+2.99999999999999
+21
+0.647499999999997
+31
+2.795
+12
+3.0
+22
+0.497732043121051
+32
+3.0
+13
+3.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+2.99999999999999
+21
+0.647499999999997
+31
+2.795
+12
+2.99999999999999
+22
+0.852499999999996
+32
+3.0
+13
+2.99999999999999
+23
+0.852499999999996
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.99999999999999
+20
+0.647499999999997
+30
+2.795
+11
+3.0
+21
+0.205
+31
+2.795
+12
+3.0
+22
+0.426249999999999
+32
+2.57375
+13
+3.0
+23
+0.426249999999999
+33
+2.57375
+70
+0
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.50226795687895
+20
+0.0
+30
+3.0
+11
+2.36016784552609
+21
+0.212667845526093
+31
+3.0
+12
+2.14749999999999
+22
+0.0
+32
+3.0
+13
+2.14749999999999
+23
+0.0
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.426249999999999
+30
+2.57375
+11
+3.0
+21
+0.205
+31
+2.795
+12
+3.0
+22
+0.205
+32
+2.3525
+13
+3.0
+23
+0.205
+33
+2.3525
+70
+0
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.0
+30
+3.0
+11
+2.7873321544739
+21
+0.639832154473909
+31
+3.0
+12
+2.57375
+22
+0.426250000000001
+32
+3.0
+13
+2.57375
+23
+0.426250000000001
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.7873321544739
+20
+0.639832154473909
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.497732043121051
+32
+3.0
+13
+3.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.497732043121051
+30
+3.0
+11
+3.0
+21
+0.0
+31
+3.0
+12
+3.0
+22
+0.205
+32
+3.0
+13
+3.0
+23
+0.205
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.3525
+20
+5.67320709797468e-17
+30
+2.795
+11
+2.57375
+21
+1.17961196366424e-16
+31
+2.57375
+12
+2.795
+22
+0.0
+32
+2.795
+13
+2.795
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.795
+20
+1.79190321753102e-16
+30
+2.35249999999999
+11
+3.0
+21
+0.205
+31
+2.3525
+12
+2.99999999999999
+22
+4.71844785465692e-16
+32
+2.1475
+13
+2.99999999999999
+23
+4.71844785465692e-16
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.205
+30
+2.3525
+11
+2.795
+21
+1.79190321753102e-16
+31
+2.35249999999999
+12
+2.57375
+22
+1.17961196366424e-16
+32
+2.57375
+13
+2.57375
+23
+1.17961196366424e-16
+33
+2.57375
+70
+13
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.205
+30
+2.3525
+11
+2.57375
+21
+1.17961196366424e-16
+31
+2.57375
+12
+3.0
+22
+0.426249999999999
+32
+2.57375
+13
+3.0
+23
+0.426249999999999
+33
+2.57375
+70
+3
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.426249999999999
+30
+2.57375
+11
+2.57375
+21
+1.17961196366424e-16
+31
+2.57375
+12
+2.3525
+22
+5.67320709797468e-17
+32
+2.795
+13
+2.3525
+23
+5.67320709797468e-17
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+iso_use
+10
+3.0
+20
+0.426249999999999
+30
+2.57375
+11
+2.3525
+21
+5.67320709797468e-17
+31
+2.795
+12
+2.99999999999999
+22
+0.647499999999997
+32
+2.795
+13
+2.99999999999999
+23
+0.647499999999997
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.99999999999999
+20
+0.647499999999997
+30
+2.795
+11
+2.3525
+21
+5.67320709797468e-17
+31
+2.795
+12
+2.14749999999999
+22
+0.0
+32
+3.0
+13
+2.14749999999999
+23
+0.0
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.99999999999999
+20
+0.647499999999997
+30
+2.795
+11
+2.14749999999999
+21
+0.0
+31
+3.0
+12
+2.36016784552609
+22
+0.212667845526093
+32
+3.0
+13
+2.36016784552609
+23
+0.212667845526093
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.36016784552609
+20
+0.212667845526093
+30
+3.0
+11
+2.99999999999999
+21
+0.852499999999996
+31
+3.0
+12
+2.99999999999999
+22
+0.647499999999997
+32
+2.795
+13
+2.99999999999999
+23
+0.647499999999997
+33
+2.795
+70
+13
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.99999999999999
+20
+0.852499999999996
+30
+3.0
+11
+2.36016784552609
+21
+0.212667845526093
+31
+3.0
+12
+2.57375
+22
+0.426250000000001
+32
+3.0
+13
+2.57375
+23
+0.426250000000001
+33
+3.0
+70
+13
+ 0
+3DFACE
+ 8
+iso_use
+10
+2.99999999999999
+20
+0.852499999999996
+30
+3.0
+11
+2.57375
+21
+0.426250000000001
+31
+3.0
+12
+2.7873321544739
+22
+0.639832154473909
+32
+3.0
+13
+2.7873321544739
+23
+0.639832154473909
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.332481491301358
+20
+1.26776612947518
+30
+3.0
+11
+0.0
+21
+1.5
+31
+3.0
+12
+0.0
+22
+1.20163144893051
+32
+3.0
+13
+0.0
+23
+1.20163144893051
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.883139136394789
+20
+0.883139136394789
+30
+3.0
+11
+0.0
+21
+0.205
+31
+3.0
+12
+0.0
+22
+0.0
+32
+3.0
+13
+0.0
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+0.205
+30
+3.0
+11
+0.883139136394789
+21
+0.883139136394789
+31
+3.0
+12
+0.0
+22
+0.497732043121051
+32
+3.0
+13
+0.0
+23
+0.497732043121051
+33
+3.0
+70
+3
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.883139136394789
+21
+0.883139136394789
+31
+3.0
+12
+0.733367557775275
+22
+0.987752578969537
+32
+3.0
+13
+0.733367557775275
+23
+0.987752578969537
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.5
+20
+5.55111512312578e-17
+30
+3.0
+11
+1.31701681130471
+21
+0.580081389077034
+31
+3.0
+12
+1.20163144893051
+22
+1.11022302462516e-16
+32
+3.0
+13
+1.20163144893051
+23
+1.11022302462516e-16
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.31701681130471
+20
+0.580081389077034
+30
+3.0
+11
+1.5
+21
+5.55111512312578e-17
+31
+3.0
+12
+1.5
+22
+0.452270081490099
+32
+3.0
+13
+1.5
+23
+0.452270081490099
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.878679656440358
+20
+1.66533453693773e-16
+30
+3.0
+11
+1.02269438387197
+21
+0.78566166435019
+31
+3.0
+12
+0.497732043121053
+22
+0.0
+32
+3.0
+13
+0.497732043121053
+23
+0.0
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.02269438387197
+20
+0.78566166435019
+30
+3.0
+11
+0.878679656440358
+21
+1.66533453693773e-16
+31
+3.0
+12
+1.16340159356772
+22
+0.687379562118006
+32
+3.0
+13
+1.16340159356772
+23
+0.687379562118006
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+1.5
+20
+0.0
+30
+2.795
+11
+1.64558259081562
+21
+1.06434958002245e-16
+31
+2.64941740918438
+12
+1.85400833333332
+22
+6.2236879303386e-17
+32
+2.795
+13
+1.85400833333332
+23
+6.2236879303386e-17
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.0
+31
+3.0
+12
+0.0
+22
+0.205
+32
+3.0
+13
+0.0
+23
+0.205
+33
+3.0
+70
+0
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+0.0
+30
+3.0
+11
+0.0
+21
+0.0
+31
+2.795
+12
+0.205
+22
+0.0
+32
+2.795
+13
+0.205
+23
+0.0
+33
+2.795
+70
+0
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.679903474903479
+20
+3.11213701008545e-16
+30
+1.97490347490348
+11
+0.205
+21
+0.0
+31
+2.795
+12
+0.205
+22
+4.11920172793637e-16
+32
+1.64318975552968
+13
+0.205
+23
+4.11920172793637e-16
+33
+1.64318975552968
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.205
+20
+0.0
+30
+2.795
+11
+0.679903474903479
+21
+3.11213701008545e-16
+31
+1.97490347490348
+12
+0.8525
+22
+0.0
+32
+2.1475
+13
+0.8525
+23
+0.0
+33
+2.1475
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+0.497732043121051
+30
+3.0
+11
+0.0
+21
+0.205
+31
+2.795
+12
+0.0
+22
+0.205
+32
+3.0
+13
+0.0
+23
+0.205
+33
+3.0
+70
+1
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+0.205
+30
+2.795
+11
+0.0
+21
+0.497732043121051
+31
+3.0
+12
+0.0
+22
+1.295
+32
+2.795
+13
+0.0
+23
+1.295
+33
+2.795
+70
+3
+ 0
+3DFACE
+ 8
+iso_usw
+10
+0.0
+20
+1.295
+30
+2.795